From 2b75beaf4f17190cf842583f498290c8fcd25768 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Wed, 12 Mar 2014 12:25:32 -0400 Subject: [PATCH 001/308] got tasty-rerun working on android --- .../unbounded-delays_crossbuild.patch | 25 +++++++++++++++++++ standalone/android/install-haskell-packages | 1 + 2 files changed, 26 insertions(+) create mode 100644 standalone/android/haskell-patches/unbounded-delays_crossbuild.patch 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 0000000000..dd0a7fca90 --- /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/install-haskell-packages b/standalone/android/install-haskell-packages index 19e6b5c1cc..8f2702ab4c 100755 --- a/standalone/android/install-haskell-packages +++ b/standalone/android/install-haskell-packages @@ -108,6 +108,7 @@ install_pkgs () { patched gnutls patched libxml-sax patched network-protocol-xmpp + patched unbounded-delays cd .. From 4ae2c99da88efc94b481dbd34f079d56d2eb10e5 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Thu, 20 Mar 2014 16:04:37 -0400 Subject: [PATCH 002/308] add news item for git-annex 5.20140320 --- doc/news/version_5.20140210.mdwn | 42 -------------------------------- doc/news/version_5.20140320.mdwn | 37 ++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+), 42 deletions(-) delete mode 100644 doc/news/version_5.20140210.mdwn create mode 100644 doc/news/version_5.20140320.mdwn diff --git a/doc/news/version_5.20140210.mdwn b/doc/news/version_5.20140210.mdwn deleted file mode 100644 index 3049e9d47f..0000000000 --- a/doc/news/version_5.20140210.mdwn +++ /dev/null @@ -1,42 +0,0 @@ -git-annex 5.20140210 released with [[!toggle text="these changes"]] -[[!toggleable text=""" - * --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](http://bugs.debian.org/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](http://bugs.debian.org/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."""]] \ No newline at end of file diff --git a/doc/news/version_5.20140320.mdwn b/doc/news/version_5.20140320.mdwn new file mode 100644 index 0000000000..ee2e95d489 --- /dev/null +++ b/doc/news/version_5.20140320.mdwn @@ -0,0 +1,37 @@ +git-annex 5.20140320 released with [[!toggle text="these changes"]] +[[!toggleable text=""" + * 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."""]] \ No newline at end of file From 51c6c9b0e2a211b6b2dbe0e58f32a1739000d17c Mon Sep 17 00:00:00 2001 From: "http://ypid.wordpress.com/" Date: Thu, 20 Mar 2014 20:48:17 +0000 Subject: [PATCH 003/308] --- doc/forum/view_including_files_with_no_tags.mdwn | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 doc/forum/view_including_files_with_no_tags.mdwn 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 0000000000..7ed64fc7df --- /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. From 02d71770576e6985687a414182ee78379e55df9a Mon Sep 17 00:00:00 2001 From: "http://ypid.wordpress.com/" Date: Thu, 20 Mar 2014 21:34:19 +0000 Subject: [PATCH 004/308] --- doc/forum/faking_location_information.mdwn | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 doc/forum/faking_location_information.mdwn diff --git a/doc/forum/faking_location_information.mdwn b/doc/forum/faking_location_information.mdwn new file mode 100644 index 0000000000..7c84e12e39 --- /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? From bd6e4f54fdf524063783634a053ba824e2ff5514 Mon Sep 17 00:00:00 2001 From: rasmus Date: Thu, 20 Mar 2014 21:55:26 +0000 Subject: [PATCH 005/308] Added a comment: But how to clean this folder? --- ..._a7bbf304b26650a786e358bdc01e3069._comment | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 doc/forum/manual_update_of_.git__47__annex__47__objects/comment_2_a7bbf304b26650a786e358bdc01e3069._comment 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 0000000000..5468ed3d06 --- /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`? +"""]] From a7382d75156c3df41ff1383d2b1116dd7f379f6f Mon Sep 17 00:00:00 2001 From: "http://schnouki.net/" Date: Thu, 20 Mar 2014 23:54:51 +0000 Subject: [PATCH 006/308] Added a comment --- ...ment_13_37aa5274874242861dc128efa1d29486._comment | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 doc/bugs/Assistant_lost_dbus_connection_spamming_log/comment_13_37aa5274874242861dc128efa1d29486._comment diff --git a/doc/bugs/Assistant_lost_dbus_connection_spamming_log/comment_13_37aa5274874242861dc128efa1d29486._comment b/doc/bugs/Assistant_lost_dbus_connection_spamming_log/comment_13_37aa5274874242861dc128efa1d29486._comment new file mode 100644 index 0000000000..5a99e0f55e --- /dev/null +++ b/doc/bugs/Assistant_lost_dbus_connection_spamming_log/comment_13_37aa5274874242861dc128efa1d29486._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://schnouki.net/" + nickname="Schnouki" + subject="comment 13" + date="2014-03-20T23:54:51Z" + content=""" +Sorry for the delay (my laptop hard drive died so I was offline for a few days). + +Just tested git-annex 5.20140320 on my NAS and it works just fine! The webapp is running, I can connect to it, and there's no more spam in the daemon.log (except for the dbus message every minute, but that's not really a problem). + +Thanks a lot Joey! +"""]] From ad395075dc2dd67a41f12e61653c97dcd3d39d3d Mon Sep 17 00:00:00 2001 From: "https://me.yahoo.com/a/FHnTlSBo1eCGJRwueeKeB6.RCaPbGMPr5jxx8A--#ce0d8" Date: Fri, 21 Mar 2014 11:28:18 +0000 Subject: [PATCH 007/308] --- doc/forum/Generating_a_Temp_View_of_Available_Files.mdwn | 1 + 1 file changed, 1 insertion(+) create mode 100644 doc/forum/Generating_a_Temp_View_of_Available_Files.mdwn 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 0000000000..bdb8ece692 --- /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? From 8efde81a09c778ab79e838e6694cc6746459bdbd Mon Sep 17 00:00:00 2001 From: "https://www.google.com/accounts/o8/id?id=AItOawn3p4i4lk_zMilvjnJ9sS6g2nerpgz0Fjc" Date: Fri, 21 Mar 2014 11:59:00 +0000 Subject: [PATCH 008/308] Added a comment: intelligent sync --- .../comment_11_cffc72aaa2768faee5c7c5c3eed1a65a._comment | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 doc/preferred_content/comment_11_cffc72aaa2768faee5c7c5c3eed1a65a._comment diff --git a/doc/preferred_content/comment_11_cffc72aaa2768faee5c7c5c3eed1a65a._comment b/doc/preferred_content/comment_11_cffc72aaa2768faee5c7c5c3eed1a65a._comment new file mode 100644 index 0000000000..4ed073442b --- /dev/null +++ b/doc/preferred_content/comment_11_cffc72aaa2768faee5c7c5c3eed1a65a._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawn3p4i4lk_zMilvjnJ9sS6g2nerpgz0Fjc" + nickname="Matthias" + subject="intelligent sync" + date="2014-03-21T11:58:58Z" + content=""" +Is it intended that \"git annex sync --content\" gets something when the wanted content expression is set to \"present\"? This happens for me (version 5.20140320). My wish is to get nothing automatically, but send to all remotes what they want. +"""]] From c6b714c8dff886d978ef81467296aeb24a630cb5 Mon Sep 17 00:00:00 2001 From: "131.130.79.56" <131.130.79.56@web> Date: Fri, 21 Mar 2014 12:07:22 +0000 Subject: [PATCH 009/308] poll vote (Google Drive) --- doc/design/assistant/polls/prioritizing_special_remotes.mdwn | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/design/assistant/polls/prioritizing_special_remotes.mdwn b/doc/design/assistant/polls/prioritizing_special_remotes.mdwn index f7462af0d6..627b3e143f 100644 --- a/doc/design/assistant/polls/prioritizing_special_remotes.mdwn +++ b/doc/design/assistant/polls/prioritizing_special_remotes.mdwn @@ -6,7 +6,7 @@ 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)" 9 "Box.com (done)" 71 "My phone (or MP3 player)" 25 "Tahoe-LAFS" 10 "OpenStack SWIFT" 31 "Google Drive"]] +[[!poll open=yes 16 "Amazon S3 (done)" 12 "Amazon Glacier (done)" 9 "Box.com (done)" 71 "My phone (or MP3 player)" 25 "Tahoe-LAFS" 10 "OpenStack SWIFT" 32 "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 From c7d79809a80a61189c4dd19efdc41f54c5d4ad80 Mon Sep 17 00:00:00 2001 From: "https://www.google.com/accounts/o8/id?id=AItOawn3p4i4lk_zMilvjnJ9sS6g2nerpgz0Fjc" Date: Fri, 21 Mar 2014 12:14:39 +0000 Subject: [PATCH 010/308] removed --- .../comment_11_cffc72aaa2768faee5c7c5c3eed1a65a._comment | 8 -------- 1 file changed, 8 deletions(-) delete mode 100644 doc/preferred_content/comment_11_cffc72aaa2768faee5c7c5c3eed1a65a._comment diff --git a/doc/preferred_content/comment_11_cffc72aaa2768faee5c7c5c3eed1a65a._comment b/doc/preferred_content/comment_11_cffc72aaa2768faee5c7c5c3eed1a65a._comment deleted file mode 100644 index 4ed073442b..0000000000 --- a/doc/preferred_content/comment_11_cffc72aaa2768faee5c7c5c3eed1a65a._comment +++ /dev/null @@ -1,8 +0,0 @@ -[[!comment format=mdwn - username="https://www.google.com/accounts/o8/id?id=AItOawn3p4i4lk_zMilvjnJ9sS6g2nerpgz0Fjc" - nickname="Matthias" - subject="intelligent sync" - date="2014-03-21T11:58:58Z" - content=""" -Is it intended that \"git annex sync --content\" gets something when the wanted content expression is set to \"present\"? This happens for me (version 5.20140320). My wish is to get nothing automatically, but send to all remotes what they want. -"""]] From 4fa45a6773f3ee3758b3faf271d138ddfa142461 Mon Sep 17 00:00:00 2001 From: stp Date: Fri, 21 Mar 2014 16:32:44 +0000 Subject: [PATCH 011/308] Added a comment: Any update on cleaning up commands? --- .../comment_8_3f7045a00905b4287d950b08d5a77a82._comment | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 doc/devblog/day_-4__forgetting/comment_8_3f7045a00905b4287d950b08d5a77a82._comment 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 0000000000..f0ba50990c --- /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 +"""]] From 7dc680415480fbbadc5dfd37f1ce72084fb1887d Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Fri, 21 Mar 2014 14:39:50 -0400 Subject: [PATCH 012/308] unannex, uninit: Avoid committing after every file is unannexed, for massive speedup. pre-commit hook lock added, so unannex can prevent the hook from running in a confusing state. This commit was sponsored by Fredrik Hammar --- Command/PreCommit.hs | 29 ++++++++++++++++++++++- Command/Unannex.hs | 55 +++++++++++++++++++++++++++----------------- Locations.hs | 5 ++++ debian/changelog | 7 ++++++ 4 files changed, 74 insertions(+), 22 deletions(-) diff --git a/Command/PreCommit.hs b/Command/PreCommit.hs index fa34ad245d..412b9ae08e 100644 --- a/Command/PreCommit.hs +++ b/Command/PreCommit.hs @@ -5,6 +5,8 @@ - Licensed under the GNU GPL version 3 or higher. -} +{-# LANGUAGE CPP #-} + module Command.PreCommit where import Common.Annex @@ -16,11 +18,17 @@ 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] @@ -28,7 +36,7 @@ def = [command "pre-commit" paramPaths seek SectionPlumbing "run by git pre-commit hook"] seek :: CommandSeek -seek ps = ifM isDirect +seek ps = lockPreCommitHook $ ifM isDirect ( do -- update direct mode mappings for committed files withWords startDirect ps @@ -82,3 +90,22 @@ showMetaDataChange = showLongNote . unlines . concatMap showmeta . fromMetaData 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/Unannex.hs b/Command/Unannex.hs index 1f29784308..3da7c2a411 100644 --- a/Command/Unannex.hs +++ b/Command/Unannex.hs @@ -16,15 +16,47 @@ import qualified Annex import Annex.Content import Annex.Content.Direct import qualified Git.Command -import qualified Git.LsFiles as LsFiles +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 = withFilesInGit $ whenAnnexed start +seek = wrapUnannex . (withFilesInGit $ whenAnnexed start) + +wrapUnannex :: Annex a -> Annex a +wrapUnannex a = ifM isDirect + ( a + {- Run with the pre-commit hook disabled, to avoid confusing + - behavior if an unannexed file is added back to git as + - a normal, non-annexed file and then committed. + - Otherwise, the pre-commit hook would think that the file + - has been unlocked and needs to be re-annexed. + - + - At the end, make a commit removing the unannexed files. + -} + , ifM cleanindex + ( lockPreCommitHook $ commit `after` a + , error "Cannot proceed with uncommitted changes staged in the index. Recommend you: git commit" + ) + ) + where + commit = inRepo $ Git.Command.run + [ Param "commit" + , Param "-q" + , Param "--allow-empty" + , Param "--no-verify" + , Param "-m", Param "content removed from git annex" + ] + cleanindex = do + (diff, cleanup) <- inRepo $ DiffTree.diffIndex Git.Ref.headRef + if null diff + then void (liftIO cleanup) >> return True + else void (liftIO cleanup) >> return False start :: FilePath -> (Key, Backend) -> CommandStart start file (key, _) = stopUnless (inAnnex key) $ do @@ -36,26 +68,7 @@ start file (key, _) = stopUnless (inAnnex key) $ do performIndirect :: FilePath -> Key -> CommandPerform performIndirect file key = do liftIO $ removeFile file - - -- git rm deletes empty directory without --cached inRepo $ Git.Command.run [Params "rm --cached --force --quiet --", File file] - - -- If the file was already committed, it is now staged for removal. - -- Commit that removal now, to avoid later confusing the - -- pre-commit hook, if this file is later added back to - -- git as a normal non-annexed file, to thinking that the - -- file has been unlocked and needs to be re-annexed. - (s, reap) <- inRepo $ LsFiles.staged [file] - unless (null s) $ - inRepo $ Git.Command.run - [ Param "commit" - , Param "-q" - , Param "--no-verify" - , Param "-m", Param "content removed from git annex" - , Param "--", File file - ] - void $ liftIO reap - next $ cleanupIndirect file key cleanupIndirect :: FilePath -> Key -> CommandCleanup diff --git a/Locations.hs b/Locations.hs index 74cace156a..5bff63eaf6 100644 --- a/Locations.hs +++ b/Locations.hs @@ -41,6 +41,7 @@ module Locations ( gitAnnexMergeDir, gitAnnexJournalDir, gitAnnexJournalLock, + gitAnnexPreCommitLock, gitAnnexIndex, gitAnnexIndexStatus, gitAnnexViewIndex, @@ -257,6 +258,10 @@ gitAnnexJournalDir r = addTrailingPathSeparator $ gitAnnexDir r "journal" gitAnnexJournalLock :: Git.Repo -> FilePath gitAnnexJournalLock r = gitAnnexDir r "journal.lck" +{- Lock file for the pre-commit hook. -} +gitAnnexPreCommitLock :: Git.Repo -> FilePath +gitAnnexPreCommitLock r = gitAnnexDir r "precommit.lck" + {- .git/annex/index is used to stage changes to the git-annex branch -} gitAnnexIndex :: Git.Repo -> FilePath gitAnnexIndex r = gitAnnexDir r "index" diff --git a/debian/changelog b/debian/changelog index 6a58235f14..cb70aeaa77 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,10 @@ +git-annex (5.20140321) UNRELEASED; urgency=medium + + * unannex, uninit: Avoid committing after every file is unannexed, + for massive speedup. + + -- Joey Hess Fri, 21 Mar 2014 14:08:41 -0400 + git-annex (5.20140320) unstable; urgency=medium * Fix zombie leak and general inneficiency when copying files to a From 7414e5d04c10c581dab4282e1486e518fca8b12b Mon Sep 17 00:00:00 2001 From: onno Date: Fri, 21 Mar 2014 19:24:14 +0000 Subject: [PATCH 013/308] --- ..._current_linux_build_as_of_Mar_6th___39__14__41__.mdwn | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 doc/bugs/ssh_keys_have_wrong_permissions___40__Ubuntu_12.04_LTS__44___current_linux_build_as_of_Mar_6th___39__14__41__.mdwn diff --git a/doc/bugs/ssh_keys_have_wrong_permissions___40__Ubuntu_12.04_LTS__44___current_linux_build_as_of_Mar_6th___39__14__41__.mdwn b/doc/bugs/ssh_keys_have_wrong_permissions___40__Ubuntu_12.04_LTS__44___current_linux_build_as_of_Mar_6th___39__14__41__.mdwn new file mode 100644 index 0000000000..f315a5bffd --- /dev/null +++ b/doc/bugs/ssh_keys_have_wrong_permissions___40__Ubuntu_12.04_LTS__44___current_linux_build_as_of_Mar_6th___39__14__41__.mdwn @@ -0,0 +1,8 @@ +### Please describe the problem. +git annex webapp created SSH keys for remote directory. SSH keys have wrong permission (chmod 600 fixed it) and thus the key-based login to the remote fails. + +### What steps will reproduce the problem? +Creating a SSH remote using the git annex webapp. + +### What version of git-annex are you using? On what operating system? +'current linux build for amd64', downloaded Mar 6th 2014, on Ubuntu 12.04.4 LTS. From 4e90050b3418ecd68d775cce50d73b9b50c75ac6 Mon Sep 17 00:00:00 2001 From: "216.115.165.4" <216.115.165.4@web> Date: Fri, 21 Mar 2014 20:46:26 +0000 Subject: [PATCH 014/308] poll vote (Google Drive) --- doc/design/assistant/polls/prioritizing_special_remotes.mdwn | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/design/assistant/polls/prioritizing_special_remotes.mdwn b/doc/design/assistant/polls/prioritizing_special_remotes.mdwn index 627b3e143f..c6dbb376cb 100644 --- a/doc/design/assistant/polls/prioritizing_special_remotes.mdwn +++ b/doc/design/assistant/polls/prioritizing_special_remotes.mdwn @@ -6,7 +6,7 @@ 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)" 9 "Box.com (done)" 71 "My phone (or MP3 player)" 25 "Tahoe-LAFS" 10 "OpenStack SWIFT" 32 "Google Drive"]] +[[!poll open=yes 16 "Amazon S3 (done)" 12 "Amazon Glacier (done)" 9 "Box.com (done)" 71 "My phone (or MP3 player)" 25 "Tahoe-LAFS" 10 "OpenStack SWIFT" 33 "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 From 7e4ab294c4c2fa7ed2be3bfd7c8348e232932842 Mon Sep 17 00:00:00 2001 From: "https://www.google.com/accounts/o8/id?id=AItOawkvN0eFnwvgw2JyTSSHw0QouytcxtPLln8" Date: Fri, 21 Mar 2014 20:46:39 +0000 Subject: [PATCH 015/308] --- ...using_an_encrypted_server_for_syncing_-_possible__63__.mdwn | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 doc/forum/2_clients_using_an_encrypted_server_for_syncing_-_possible__63__.mdwn 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 0000000000..84f92ae7ea --- /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.) From e426fac2733df043a311f992549de19cd47943d8 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sat, 22 Mar 2014 10:42:38 -0400 Subject: [PATCH 016/308] add desktop notifications Motivation: Hook scripts for nautilus or other file managers need to provide the user with feedback that a file is being downloaded. This commit was sponsored by THM Schoemaker. --- Annex.hs | 3 + Annex/Transfer.hs | 178 +++++++++++++++++++++++++++++++++++++ Assistant/Alert/Utility.hs | 1 - BuildFlags.hs | 3 + CmdLine/Option.hs | 6 ++ Command/AddUrl.hs | 11 +-- Command/Get.hs | 20 ++--- Command/List.hs | 4 +- Command/Move.hs | 14 +-- Command/SendKey.hs | 2 +- Command/TransferKey.hs | 10 +-- Command/TransferKeys.hs | 9 +- Common.hs | 1 + Logs/Transfer.hs | 102 --------------------- Remote/Git.hs | 6 +- Types/DesktopNotify.hs | 27 ++++++ Utility/WebApp.hs | 1 - debian/changelog | 5 ++ debian/control | 1 + doc/git-annex.mdwn | 13 +++ git-annex.cabal | 10 ++- 21 files changed, 285 insertions(+), 142 deletions(-) create mode 100644 Annex/Transfer.hs create mode 100644 Types/DesktopNotify.hs diff --git a/Annex.hs b/Annex.hs index 820c1d5698..78329b5df5 100644 --- a/Annex.hs +++ b/Annex.hs @@ -60,6 +60,7 @@ import Types.FileMatcher import Types.NumCopies import Types.LockPool import Types.MetaData +import Types.DesktopNotify import Types.CleanupActions import qualified Utility.Matcher import qualified Data.Map as M @@ -122,6 +123,7 @@ data AnnexState = AnnexState , unusedkeys :: Maybe (S.Set Key) , quviversion :: Maybe QuviVersion , existinghooks :: M.Map Git.Hook.Hook Bool + , desktopnotify :: DesktopNotify } newState :: GitConfig -> Git.Repo -> AnnexState @@ -163,6 +165,7 @@ newState c r = AnnexState , unusedkeys = Nothing , quviversion = Nothing , existinghooks = M.empty + , desktopnotify = mempty } {- Makes an Annex state object for the specified git repo. diff --git a/Annex/Transfer.hs b/Annex/Transfer.hs new file mode 100644 index 0000000000..dac32e7529 --- /dev/null +++ b/Annex/Transfer.hs @@ -0,0 +1,178 @@ +{- 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, + notifyTransfer, + NotifyWitness, + noRetry, + forwardRetry, +) where + +import qualified Annex +import Logs.Transfer as X +import Annex.Perms +import Annex.Exception +import Utility.Metered +#ifdef WITH_DBUS_NOTIFICATIONS +import Common.Annex +import Types.DesktopNotify +import qualified DBus.Notify as Notify +import qualified DBus.Client +#endif +#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 + +-- Witness that notification has happened. +data NotifyWitness = NotifyWitness + +{- Wrap around an action that performs a transfer, which may run multiple + - attempts, and displays notification when supported. -} +notifyTransfer :: Direction -> Maybe FilePath -> (NotifyWitness -> Annex Bool) -> Annex Bool +notifyTransfer _ Nothing a = a NotifyWitness +notifyTransfer direction (Just f) a = do +#ifdef WITH_DBUS_NOTIFICATIONS + wanted <- Annex.getState Annex.desktopnotify + let action = if direction == Upload then "uploading" else "downloading" + let basedesc = action ++ " " ++ f + let startdesc = "started " ++ basedesc + let enddesc = "finished " ++ basedesc + if (notifyStart wanted || notifyFinish wanted) + then do + client <- liftIO DBus.Client.connectSession + let mknote desc = Notify.blankNote + { Notify.appName = "git-annex" + , Notify.body = Just $ Notify.Text desc + , Notify.hints = + [ Notify.Category Notify.Transfer + , Notify.Urgency Notify.Low + , Notify.SuppressSound True + ] + } + startnotification <- liftIO $ if notifyStart wanted + then Just <$> Notify.notify client (mknote startdesc) + else pure Nothing + r <- a NotifyWitness + when (notifyFinish wanted) $ liftIO $ void $ maybe + (Notify.notify client $ mknote enddesc) + (\n -> Notify.replace client n $ mknote enddesc) + startnotification + return r + else a NotifyWitness +#else + a NotifyWitness +#endif diff --git a/Assistant/Alert/Utility.hs b/Assistant/Alert/Utility.hs index 73843be4cf..be631e9991 100644 --- a/Assistant/Alert/Utility.hs +++ b/Assistant/Alert/Utility.hs @@ -14,7 +14,6 @@ import Utility.Tense import qualified Data.Text as T import Data.Text (Text) import qualified Data.Map as M -import Data.Monoid {- 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 diff --git a/BuildFlags.hs b/BuildFlags.hs index e36cf6a14c..59a060cb5e 100644 --- a/BuildFlags.hs +++ b/BuildFlags.hs @@ -57,6 +57,9 @@ buildFlags = filter (not . null) #ifdef WITH_DBUS , "DBus" #endif +#ifdef WITH_DESKTOP_NOTIFY + , "DesktopNotify" +#endif #ifdef WITH_XMPP , "XMPP" #else diff --git a/CmdLine/Option.hs b/CmdLine/Option.hs index 915b06849e..ce44d2acee 100644 --- a/CmdLine/Option.hs +++ b/CmdLine/Option.hs @@ -20,6 +20,7 @@ import System.Console.GetOpt import Common.Annex import qualified Annex import Types.Messages +import Types.DesktopNotify import Limit import CmdLine.Usage @@ -41,6 +42,10 @@ commonOptions = "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 } @@ -49,6 +54,7 @@ commonOptions = 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 = diff --git a/Command/AddUrl.hs b/Command/AddUrl.hs index a0978a88d6..1c73cd24ff 100644 --- a/Command/AddUrl.hs +++ b/Command/AddUrl.hs @@ -26,7 +26,7 @@ import Types.KeySource import Config import Annex.Content.Direct import Logs.Location -import qualified Logs.Transfer as Transfer +import qualified Annex.Transfer as Transfer #ifdef WITH_QUVI import Annex.Quvi import qualified Utility.Quvi as Quvi @@ -116,9 +116,10 @@ addUrlFileQuvi relaxed quviurl videourl file = do prepGetViaTmpChecked sizedkey $ do tmp <- fromRepo $ gitAnnexTmpObjectLocation key showOutput - ok <- Transfer.download webUUID key (Just file) Transfer.forwardRetry $ const $ do - liftIO $ createDirectoryIfMissing True (parentDir tmp) - downloadUrl [videourl] tmp + ok <- Transfer.notifyTransfer Transfer.Download (Just file) $ + Transfer.download webUUID key (Just file) Transfer.forwardRetry $ const $ do + liftIO $ createDirectoryIfMissing True (parentDir tmp) + downloadUrl [videourl] tmp if ok then cleanup quviurl file key (Just tmp) else return False @@ -179,7 +180,7 @@ download url file = do , return False ) where - runtransfer dummykey tmp = + 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 diff --git a/Command/Get.hs b/Command/Get.hs index f436b15b56..bef4667240 100644 --- a/Command/Get.hs +++ b/Command/Get.hs @@ -11,7 +11,7 @@ import Common.Annex import Command import qualified Remote import Annex.Content -import Logs.Transfer +import Annex.Transfer import Config.NumCopies import Annex.Wanted import qualified Command.Move @@ -69,15 +69,15 @@ getKeyFile' key afile dest = dispatch showNote "not available" showlocs return False - dispatch remotes = trycopy remotes remotes - trycopy full [] = do + dispatch remotes = notifyTransfer Download afile $ trycopy remotes remotes + trycopy full [] _ = do Remote.showTriedRemotes full showlocs return False - trycopy full (r:rs) = + trycopy full (r:rs) witness = ifM (probablyPresent r) - ( docopy r (trycopy full rs) - , trycopy full rs + ( docopy r witness <||> trycopy full rs witness + , trycopy full rs witness ) showlocs = Remote.showLocations key [] "No other repository is known to contain the file." @@ -87,8 +87,6 @@ getKeyFile' key afile dest = dispatch | Remote.hasKeyCheap r = either (const False) id <$> Remote.hasKey r key | otherwise = return True - docopy r continue = do - ok <- download (Remote.uuid r) key afile noRetry $ \p -> do - showAction $ "from " ++ Remote.name r - Remote.retrieveKeyFile r key afile dest p - if ok then return ok else continue + 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/List.hs b/Command/List.hs index ba62513338..1fa2064050 100644 --- a/Command/List.hs +++ b/Command/List.hs @@ -38,7 +38,7 @@ seek ps = do getList :: Annex [(UUID, RemoteName, TrustLevel)] getList = ifM (Annex.getFlag $ optionName allrepos) - ( nubBy ((==) `on` fst3) <$> ((++) <$> getRemotes <*> getAll) + ( nubBy ((==) `on` fst3) <$> ((++) <$> getRemotes <*> getAllUUIDs) , getRemotes ) where @@ -48,7 +48,7 @@ getList = ifM (Annex.getFlag $ optionName allrepos) hereu <- getUUID heretrust <- lookupTrust hereu return $ (hereu, "here", heretrust) : zip3 (map uuid rs) (map name rs) ts - getAll = do + getAllUUIDs = do rs <- M.toList <$> uuidMap rs3 <- forM rs $ \(u, n) -> (,,) <$> pure u diff --git a/Command/Move.hs b/Command/Move.hs index 3a39e1de0d..206a875b7c 100644 --- a/Command/Move.hs +++ b/Command/Move.hs @@ -14,8 +14,8 @@ import qualified Annex import Annex.Content import qualified Remote import Annex.UUID +import Annex.Transfer import Logs.Presence -import Logs.Transfer def :: [Command] def = [withOptions moveOptions $ command "move" paramPaths seek @@ -98,8 +98,9 @@ toPerform dest move key afile fastcheck isthere = moveLock move key $ stop Right False -> do showAction $ "to " ++ Remote.name dest - ok <- upload (Remote.uuid dest) key afile noRetry $ - Remote.storeKey dest key afile + 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 @@ -155,9 +156,10 @@ fromPerform src move key afile = moveLock move key $ , handle move =<< go ) where - go = download (Remote.uuid src) key afile noRetry $ \p -> do - showAction $ "from " ++ Remote.name src - getViaTmp key $ \t -> Remote.retrieveKeyFile src key afile t p + 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 diff --git a/Command/SendKey.hs b/Command/SendKey.hs index 2215b16b2c..a201d1b89a 100644 --- a/Command/SendKey.hs +++ b/Command/SendKey.hs @@ -12,7 +12,7 @@ import Command import Annex.Content import Annex import Utility.Rsync -import Logs.Transfer +import Annex.Transfer import qualified CmdLine.GitAnnexShell.Fields as Fields import Utility.Metered diff --git a/Command/TransferKey.hs b/Command/TransferKey.hs index b6b2374678..13bfd825e1 100644 --- a/Command/TransferKey.hs +++ b/Command/TransferKey.hs @@ -11,7 +11,7 @@ import Common.Annex import Command import Annex.Content import Logs.Location -import Logs.Transfer +import Annex.Transfer import qualified Remote import Types.Remote @@ -41,7 +41,7 @@ start to from file key = _ -> error "specify either --from or --to" toPerform :: Remote -> Key -> AssociatedFile -> CommandPerform -toPerform remote key file = go $ +toPerform remote key file = go Upload file $ upload (uuid remote) key file forwardRetry $ \p -> do ok <- Remote.storeKey remote key file p when ok $ @@ -49,9 +49,9 @@ toPerform remote key file = go $ return ok fromPerform :: Remote -> Key -> AssociatedFile -> CommandPerform -fromPerform remote key file = go $ +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 :: Annex Bool -> CommandPerform -go a = a >>= liftIO . exitBool +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 index b426286092..8f4498eb14 100644 --- a/Command/TransferKeys.hs +++ b/Command/TransferKeys.hs @@ -13,7 +13,7 @@ import Common.Annex import Command import Annex.Content import Logs.Location -import Logs.Transfer +import Annex.Transfer import qualified Remote import Types.Key @@ -34,14 +34,15 @@ start = withHandles $ \(readh, writeh) -> do stop where runner (TransferRequest direction remote key file) - | direction == Upload = + | 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 = download (Remote.uuid remote) key file forwardRetry $ \p -> - getViaTmp key $ \t -> Remote.retrieveKeyFile remote key file t p + | otherwise = notifyTransfer direction file $ + download (Remote.uuid remote) key file forwardRetry $ \p -> + getViaTmp key $ \t -> Remote.retrieveKeyFile remote key file t p {- stdin and stdout are connected with the caller, to be used for - communication with it. But doing a transfer might involve something diff --git a/Common.hs b/Common.hs index 6612c9c544..4d6165ac55 100644 --- a/Common.hs +++ b/Common.hs @@ -11,6 +11,7 @@ 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 diff --git a/Logs/Transfer.hs b/Logs/Transfer.hs index 742bdc7b9a..c96d9cd1e7 100644 --- a/Logs/Transfer.hs +++ b/Logs/Transfer.hs @@ -88,108 +88,6 @@ percentComplete :: Transfer -> TransferInfo -> Maybe Percentage percentComplete (Transfer { transferKey = key }) info = percentage <$> keySize key <*> Just (fromMaybe 0 $ bytesComplete info) -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 - -upload :: UUID -> Key -> AssociatedFile -> RetryDecider -> (MeterUpdate -> Annex Bool) -> Annex Bool -upload u key = runTransfer (Transfer Upload u key) - -download :: UUID -> Key -> AssociatedFile -> RetryDecider -> (MeterUpdate -> Annex Bool) -> Annex Bool -download u key = runTransfer (Transfer Download u key) - -{- 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 - {- 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. -} diff --git a/Remote/Git.hs b/Remote/Git.hs index 995d667795..209312d674 100644 --- a/Remote/Git.hs +++ b/Remote/Git.hs @@ -24,7 +24,7 @@ import qualified Git.Command import qualified Git.GCrypt import qualified Annex import Logs.Presence -import Logs.Transfer +import Annex.Transfer import Annex.UUID import Annex.Exception import qualified Annex.Content @@ -321,7 +321,7 @@ copyFromRemote' r key file dest case v of Nothing -> return False Just (object, checksuccess) -> - upload u key file noRetry + runTransfer (Transfer Download u key) file noRetry (rsyncOrCopyFile params object dest) <&&> checksuccess | Git.repoIsSsh (repo r) = feedprogressback $ \feeder -> do @@ -418,7 +418,7 @@ copyToRemote r key file p ( return True , do ensureInitialized - download u key file noRetry $ const $ + 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) diff --git a/Types/DesktopNotify.hs b/Types/DesktopNotify.hs new file mode 100644 index 0000000000..f8494487de --- /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/Utility/WebApp.hs b/Utility/WebApp.hs index 8e08ab9e0a..1a76988700 100644 --- a/Utility/WebApp.hs +++ b/Utility/WebApp.hs @@ -33,7 +33,6 @@ 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 Data.Monoid import Control.Arrow ((***)) import Control.Concurrent #ifdef WITH_WEBAPP_SECURE diff --git a/debian/changelog b/debian/changelog index cb70aeaa77..51629cd936 100644 --- a/debian/changelog +++ b/debian/changelog @@ -2,6 +2,11 @@ git-annex (5.20140321) UNRELEASED; 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 compltes + (using the dbus Desktop Notifications Specification) + * --notify-start switch will show desktop notifications when each + file upload/download starts. -- Joey Hess Fri, 21 Mar 2014 14:08:41 -0400 diff --git a/debian/control b/debian/control index 9b6e812b87..dd7eaa8489 100644 --- a/debian/control +++ b/debian/control @@ -30,6 +30,7 @@ Build-Depends: 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], diff --git a/doc/git-annex.mdwn b/doc/git-annex.mdwn index 32c8ec2662..894ac43297 100644 --- a/doc/git-annex.mdwn +++ b/doc/git-annex.mdwn @@ -1053,6 +1053,19 @@ subdirectories). 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. + * `-c name=value` Overrides git configuration settings. May be specified multiple times. diff --git a/git-annex.cabal b/git-annex.cabal index 2ac1c4f132..0f8987915b 100644 --- a/git-annex.cabal +++ b/git-annex.cabal @@ -85,6 +85,9 @@ Flag Tahoe 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 @@ -167,10 +170,15 @@ Executable git-annex CPP-Options: -DWITH_KQUEUE C-Sources: Utility/libkqueue.c - if os(linux) && flag(Dbus) + 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__ From ff0202d87aa7d7457f2b615f61b9014b43f082b1 Mon Sep 17 00:00:00 2001 From: "http://born.myopenid.com/" Date: Sat, 22 Mar 2014 18:15:47 +0000 Subject: [PATCH 017/308] --- .../git_annex_test_under_windows_8.1.mdwn | 64 +++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 doc/bugs/git_annex_test_under_windows_8.1.mdwn diff --git a/doc/bugs/git_annex_test_under_windows_8.1.mdwn b/doc/bugs/git_annex_test_under_windows_8.1.mdwn new file mode 100644 index 0000000000..efdd8f2cfd --- /dev/null +++ b/doc/bugs/git_annex_test_under_windows_8.1.mdwn @@ -0,0 +1,64 @@ +### Please describe the problem. +I installed git and git annex under Windows (8.1) and ran git annex test. All except one tests passed with "ok" + +### What steps will reproduce the problem? +git annex test +under Windows 8.1 + +### What version of git-annex are you using? On what operating system? +$ git --version +git version 1.9.0.msysgit.0 + +$ git annex version +git-annex version: 5.20140320-g63535e3 +build flags: Assistant Webapp Webapp-secure Pairing Testsuite S3 WebDAV DNS Feeds Quvi TDFA CryptoHash key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E SHA256 SHA1 SHA512 SHA224 SHA384 SKEIN256 SKEIN512 WORM URL +remote types: git gcrypt S3 bup directory rsync web webdav tahoe glacier hook external local repository version: 5 supported repository version: 5 upgrade supported from repository versions: 2 3 4 + +Windows 8.1 + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + + prop_view_roundtrips: FAIL + *** Failed! Falsifiable (after 814 tests and 5 shrinks): + "a" + IMneitta DTaetsat s( +fr o miLniistt: [(MetaField "1\194",fromList [MetaValue (CurrentlySet True) "\r ++\231Gb\157\227\ETB\bG",MetaValue (CurrentlySet True) "\DEL\239~\243_p\DC2."]),( +MetaField "EG",fromList [MetaValue (CurrentlySet True) "",MetaValue (CurrentlySe +t True) "\v\205] .T(",MetaValue (CurrentlySet False) "\NAK\128lo\169w",MetaValue + (CurrentlySet True) "\SYN\STX\ENQ\n#u\ETXv\CANP\128\US~p",MetaValue (CurrentlySet False) "\250C\b\DC1\17 +6\154KT\191\SOf?\SI"]),(MetaField "\225a",fromList [MetaValue (CurrentlySet True +) "",MetaValue (CurrentlySet True) "\b\ETB\b",MetaValue (CurrentlySet True) "\f\ +161\FS\176h-\ta\169\t",MetaValue (CurrentlySet False) "4",MetaValue (CurrentlySe +t True) "A\FS\244V:\249kl5\ETX\SOH\SI)",MetaValue (CurrentlySet False) "Z",MetaV +alue (CurrentlySet True) "\\Lt~\235v\"\211\DLE\NAK\210",MetaValue (CurrentlySet +False) "a\SYNN",MetaValue (CurrentlySet True) "g:init test repo U5j\167G\ap-\ETX +",MetaValue (CurrentlySet False) "l\NULoW\238rD",MetaValue (CurrentlySet True) " +}\202\141\183Nxr",MetaValue (CurrentlySet False) "\170=\216S\ETB\187\SUB+!\DC3", +MetaValue (CurrentlySet True) "\240H\GS\NAK\ETB\SYNRq\153\&4\204\EOT"])]) + True + Use --quickcheck-replay '13 347062936 40785707' to reproduce. + prop_viewedFile_rountrips: OK + +++ OK, passed 1000 t +e s tDse.t + +# End of transcript or log. +"""]] From a5dcd0e4bd802dda17cf2d43fbd12bb27ec21061 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sat, 22 Mar 2014 14:17:57 -0400 Subject: [PATCH 018/308] fix failure notification --- Annex/Transfer.hs | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/Annex/Transfer.hs b/Annex/Transfer.hs index dac32e7529..0d5744d4ee 100644 --- a/Annex/Transfer.hs +++ b/Annex/Transfer.hs @@ -150,7 +150,9 @@ notifyTransfer direction (Just f) a = do let action = if direction == Upload then "uploading" else "downloading" let basedesc = action ++ " " ++ f let startdesc = "started " ++ basedesc - let enddesc = "finished " ++ basedesc + let enddesc ok = if ok + then "finished " ++ basedesc + else basedesc ++ " failed" if (notifyStart wanted || notifyFinish wanted) then do client <- liftIO DBus.Client.connectSession @@ -166,12 +168,12 @@ notifyTransfer direction (Just f) a = do startnotification <- liftIO $ if notifyStart wanted then Just <$> Notify.notify client (mknote startdesc) else pure Nothing - r <- a NotifyWitness + ok <- a NotifyWitness when (notifyFinish wanted) $ liftIO $ void $ maybe - (Notify.notify client $ mknote enddesc) - (\n -> Notify.replace client n $ mknote enddesc) + (Notify.notify client $ mknote $ enddesc ok) + (\n -> Notify.replace client n $ mknote $ enddesc ok) startnotification - return r + return ok else a NotifyWitness #else a NotifyWitness From fb8a32cc7f45f865754c4b47c26b1db0defbbc55 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sat, 22 Mar 2014 15:01:48 -0400 Subject: [PATCH 019/308] notifications on drop --- Annex/Notification.hs | 81 +++++++++++++++++++++++++++++++++++++++++++ Annex/Transfer.hs | 53 ++-------------------------- Command/Drop.hs | 19 ++++++---- Command/DropUnused.hs | 2 +- debian/changelog | 2 +- doc/git-annex.mdwn | 2 +- 6 files changed, 99 insertions(+), 60 deletions(-) create mode 100644 Annex/Notification.hs diff --git a/Annex/Notification.hs b/Annex/Notification.hs new file mode 100644 index 0000000000..5bc39d9cbf --- /dev/null +++ b/Annex/Notification.hs @@ -0,0 +1,81 @@ +{- git-annex desktop notifications + - + - Copyright 2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Annex.Notification where + +import qualified Annex +import Logs.Transfer +#ifdef WITH_DBUS_NOTIFICATIONS +import Common.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 +notifyTransfer direction (Just f) a = do +#ifdef WITH_DBUS_NOTIFICATIONS + wanted <- Annex.getState Annex.desktopnotify + let action = if direction == Upload then "uploading" else "downloading" + let basedesc = action ++ " " ++ f + let startdesc = "started " ++ basedesc + let enddesc ok = if ok + then "finished " ++ basedesc + else basedesc ++ " failed" + if (notifyStart wanted || notifyFinish wanted) + then do + client <- liftIO DBus.Client.connectSession + startnotification <- liftIO $ if notifyStart wanted + then Just <$> Notify.notify client (mkNote startdesc) + else pure Nothing + ok <- a NotifyWitness + when (notifyFinish wanted) $ liftIO $ void $ maybe + (Notify.notify client $ mkNote $ enddesc ok) + (\n -> Notify.replace client n $ mkNote $ enddesc ok) + startnotification + return ok + else a NotifyWitness +#else + a NotifyWitness +#endif + +notifyDrop :: Maybe FilePath -> Bool -> Annex () +notifyDrop Nothing _ = noop +notifyDrop (Just f) ok = do +#ifdef WITH_DBUS_NOTIFICATIONS + wanted <- Annex.getState Annex.desktopnotify + when (notifyFinish wanted) $ liftIO $ do + client <- DBus.Client.connectSession + let msg = if ok + then "dropped " ++ f + else "failed to drop" ++ f + void $ Notify.notify client (mkNote msg) +#else + noop +#endif + +#ifdef WITH_DBUS_NOTIFICATIONS +mkNote :: String -> Notify.Note +mkNote desc = Notify.blankNote + { Notify.appName = "git-annex" + , Notify.body = Just $ Notify.Text desc + , Notify.hints = + [ Notify.Category Notify.Transfer + , Notify.Urgency Notify.Low + , Notify.SuppressSound True + ] + } +#endif diff --git a/Annex/Transfer.hs b/Annex/Transfer.hs index 0d5744d4ee..df5aba09cf 100644 --- a/Annex/Transfer.hs +++ b/Annex/Transfer.hs @@ -12,23 +12,16 @@ module Annex.Transfer ( upload, download, runTransfer, - notifyTransfer, - NotifyWitness, noRetry, forwardRetry, ) where -import qualified Annex +import Common.Annex import Logs.Transfer as X +import Annex.Notification as X import Annex.Perms import Annex.Exception import Utility.Metered -#ifdef WITH_DBUS_NOTIFICATIONS -import Common.Annex -import Types.DesktopNotify -import qualified DBus.Notify as Notify -import qualified DBus.Client -#endif #ifdef mingw32_HOST_OS import Utility.WinLock #endif @@ -136,45 +129,3 @@ noRetry _ _ = False - to send some data. -} forwardRetry :: RetryDecider forwardRetry old new = bytesComplete old < bytesComplete new - --- Witness that notification has happened. -data NotifyWitness = NotifyWitness - -{- Wrap around an action that performs a transfer, which may run multiple - - attempts, and displays notification when supported. -} -notifyTransfer :: Direction -> Maybe FilePath -> (NotifyWitness -> Annex Bool) -> Annex Bool -notifyTransfer _ Nothing a = a NotifyWitness -notifyTransfer direction (Just f) a = do -#ifdef WITH_DBUS_NOTIFICATIONS - wanted <- Annex.getState Annex.desktopnotify - let action = if direction == Upload then "uploading" else "downloading" - let basedesc = action ++ " " ++ f - let startdesc = "started " ++ basedesc - let enddesc ok = if ok - then "finished " ++ basedesc - else basedesc ++ " failed" - if (notifyStart wanted || notifyFinish wanted) - then do - client <- liftIO DBus.Client.connectSession - let mknote desc = Notify.blankNote - { Notify.appName = "git-annex" - , Notify.body = Just $ Notify.Text desc - , Notify.hints = - [ Notify.Category Notify.Transfer - , Notify.Urgency Notify.Low - , Notify.SuppressSound True - ] - } - startnotification <- liftIO $ if notifyStart wanted - then Just <$> Notify.notify client (mknote startdesc) - else pure Nothing - ok <- a NotifyWitness - when (notifyFinish wanted) $ liftIO $ void $ maybe - (Notify.notify client $ mknote $ enddesc ok) - (\n -> Notify.replace client n $ mknote $ enddesc ok) - startnotification - return ok - else a NotifyWitness -#else - a NotifyWitness -#endif diff --git a/Command/Drop.hs b/Command/Drop.hs index d29195b050..f6c1880e9b 100644 --- a/Command/Drop.hs +++ b/Command/Drop.hs @@ -17,6 +17,7 @@ import Logs.Trust import Config.NumCopies import Annex.Content import Annex.Wanted +import Annex.Notification def :: [Command] def = [withOptions [dropFromOption] $ command "drop" paramPaths seek @@ -44,24 +45,30 @@ start from file (key, _) = checkDropAuto from file key $ \numcopies -> startLocal :: AssociatedFile -> NumCopies -> Key -> Maybe Remote -> CommandStart startLocal afile numcopies key knownpresentremote = stopUnless (inAnnex key) $ do showStart' "drop" key afile - next $ performLocal key numcopies knownpresentremote + 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 numcopies remote -performLocal :: Key -> NumCopies -> Maybe Remote -> CommandPerform -performLocal key numcopies knownpresentremote = lockContent key $ do +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) - stopUnless (canDropKey key numcopies trusteduuids' tocheck []) $ do - removeAnnex key - next $ cleanupLocal key + ifM (canDropKey key numcopies trusteduuids' tocheck []) + ( do + removeAnnex key + notifyDrop afile True + next $ cleanupLocal key + , do + notifyDrop afile False + stop + ) performRemote :: Key -> NumCopies -> Remote -> CommandPerform performRemote key numcopies remote = lockContent key $ do diff --git a/Command/DropUnused.hs b/Command/DropUnused.hs index 345d030328..5d1923d343 100644 --- a/Command/DropUnused.hs +++ b/Command/DropUnused.hs @@ -35,7 +35,7 @@ perform numcopies key = maybe droplocal dropremote =<< Remote.byNameWithUUID =<< dropremote r = do showAction $ "from " ++ Remote.name r Command.Drop.performRemote key numcopies r - droplocal = Command.Drop.performLocal key numcopies Nothing + droplocal = Command.Drop.performLocal key Nothing numcopies Nothing from = Annex.getField $ optionName Command.Drop.dropFromOption performOther :: (Key -> Git.Repo -> FilePath) -> Key -> CommandPerform diff --git a/debian/changelog b/debian/changelog index 51629cd936..7addf4ae78 100644 --- a/debian/changelog +++ b/debian/changelog @@ -3,7 +3,7 @@ git-annex (5.20140321) UNRELEASED; 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 compltes + file upload/download/drop completes (using the dbus Desktop Notifications Specification) * --notify-start switch will show desktop notifications when each file upload/download starts. diff --git a/doc/git-annex.mdwn b/doc/git-annex.mdwn index 894ac43297..a1005cbc81 100644 --- a/doc/git-annex.mdwn +++ b/doc/git-annex.mdwn @@ -1064,7 +1064,7 @@ subdirectories). * `--notify-start` Caused a desktop notification to be displayed when a file upload - or download has started. + or download has started, or when a file is dropped. * `-c name=value` From f6eb967f1e2667289e78eb4d23ea47a23c7f094c Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sat, 22 Mar 2014 15:51:30 -0400 Subject: [PATCH 020/308] webapp: Automatically install Nautilus integration scripts to get and drop files. This commit was sponsored by Gian-Maria Daffre. --- Assistant/Install.hs | 31 ++++++++++++++++++++++++- debian/changelog | 2 ++ doc/assistant/downloadnotification.png | Bin 0 -> 4550 bytes doc/assistant/nautilusmenu.png | Bin 0 -> 59867 bytes doc/related_software.mdwn | 1 - doc/tips/file_manager_integration.mdwn | 31 +++++++++++++++++++++++++ 6 files changed, 63 insertions(+), 2 deletions(-) create mode 100644 doc/assistant/downloadnotification.png create mode 100644 doc/assistant/nautilusmenu.png create mode 100644 doc/tips/file_manager_integration.mdwn diff --git a/Assistant/Install.hs b/Assistant/Install.hs index d29cefb8cd..ff30022219 100644 --- a/Assistant/Install.hs +++ b/Assistant/Install.hs @@ -35,11 +35,14 @@ standaloneAppBase = getEnv "GIT_ANNEX_APP_BASE" - - 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 = noop + go Nothing = installNautilus "git-annex" go (Just base) = do let program = base "git-annex" programfile <- programFile @@ -78,6 +81,32 @@ ensureInstalled = go =<< standaloneAppBase viaTmp writeFile shim content modifyFileMode shim $ addModes [ownerExecuteMode] + installNautilus program + +installNautilus :: FilePath -> IO () +#ifdef linux_HOST_OS +installNautilus program = do + scriptdir <- (\d -> d "nautilus" "scripts") <$> userDataDir + genscript scriptdir "get" + genscript scriptdir "drop" + where + genscript scriptdir action = + installscript (scriptdir scriptname action) $ unlines + [ "#!/bin/sh" + , autoaddedcomment + , 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. diff --git a/debian/changelog b/debian/changelog index 7addf4ae78..20b559324f 100644 --- a/debian/changelog +++ b/debian/changelog @@ -7,6 +7,8 @@ git-annex (5.20140321) UNRELEASED; urgency=medium (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. -- Joey Hess Fri, 21 Mar 2014 14:08:41 -0400 diff --git a/doc/assistant/downloadnotification.png b/doc/assistant/downloadnotification.png new file mode 100644 index 0000000000000000000000000000000000000000..5cb3961d991660b579e9da9d89b23d50a6365db1 GIT binary patch literal 4550 zcmV;%5jpOOP)w+gig#cHt#Y7y6p)bMN;)_nSL2$qWDjfk5<1u+BvUK_Fca z2t?1ZISi9quGZQ3N=iynQ&S5I3tzr`DH4g0b_fLGV}wej4j3?i$z&E67n_-xbvD7) z_cb*&`uh5OK0hohEGH)i35P%+dJ-%a%irIh!C<^@f>_(Sue`k6&(Dv~=Od*M2t?0= zPN#3*zTMc^xXl4EnfLMe{KbnG3j_kB5dwke!44P`6QiZ2C3{Pf{Sy`zhP)4fK=f?* ze12$XXxr6Y5`^(SIM~Wa2 zh+aZ|e!lGZmjnP+RaHn41Om}ZsI07PU;PP%LZk=+f#@Z)IUWgVfj}U7C&>N~2n4b} z1OkCT_J=?q5Xk=i--w8au(!8=`+D^B^pca4wY9b1VV&=<MjU6Pd#babEkt`UB-{G(xM2ZM0%|-IqVqk z*`@ble*lo0k`fyeO(kI?=@hr`hWkbZtqRvEzZL(nh;@Kd_fG0D`0Sf~feT+G1Re>> zFA%m2)F98c?lZ}K(#EhiM`mg{NLK8t%Nt|3544VN(x=xjowB6L7my9fL7_X=tJG(Ixpufl2(Hi^uV( z<`x4AdGUf76T`fg&wFq7Cj}4_AjXMnjpA!D>&OIw!X0w13h3jx5zeaWJ^PVP&7;#HLxGgGBWMP%YKth zrZGy3)JE<3EsmRgu460ZRSp2m1#7-{m|#tl)ZolF|7`4CbO0H|vZpB)VYC-*yftWdp$v9YncckkwKH~^rpuYcso5jQutrHdRo#3E4)KKBWkKdO%|89)EB z<=n>Y&0IDBSk4VzGRxYW(o}`h;_f`Uv17{{$DPR>n)=6nj6}5@Vwhi0(pH}MPaOb^ z(UCa+cl)IazP*!tdS_<2>}~#wx4Mg(qS2Sz!MQWWThCY$xcZ0IMfw2d$*6GO#coA4 z-MMjZmo!veSVcWjWiGU#C{dNC-+zWx!Sqqo3`ON~RWhejB4T#=AG}?d`3C^ZS+o6X zgJ(+v_P6}^Uhxm|#{5`CKf8D)y35S!r+K8d4Zz8CDZo^^;DsydYY_6x5*syFKKjMi0 z6~bc@dxz7}*)|iu6cydetKd6zp@mWvV=dblJhJIZut!3T1YbXU z?62YL0+)I8Gd15nm$}tz-W_f;gN)hgYA9*H)d;H%n>GMOrmJae*}IQKqR_~sgC~#I z*VnIFx=PVr7+HPHaFc_ap+3jsM`}^BUP(@d$2UAl=x&xN9DTVRynH3=d#_~%7Ne>Q z9{|9#>C=lJUhkgwbxFg1gPAG|tFT918FB25i7Ge!UPsaNQPK>#<#JUj=1Zct1_y3D zup;mAAS-LP&oz7(N43a%j>ddv;{(2)KQxNBES(j&%}@PCbcn~^fi%jdgS+Y`Ov}FB zdU|dCWQ{f6zR_Z-12ca2)|e%W{}FSa0l?TPQ|JA-svm_c{-+|q$G>YIZ*OCNRSiM_ z=)<5Im|BiA(+xYE%xxiRB+~H1=fC)*zs>;DT0zUp!dx307MZFy+)O9_)Hxd)8vwAe zVR6{(wt5mS-mVZ!0pQZZ5)&PDU48xk+Kv3m0pRFAwYh>80C>m~pE-YPJZlI57?@a& zGt&t>dPyK9D#Up735AQ{&T$P)Ek~Qsw;sPNloC~9>7kQpo%iaeO$C4|ZtIL1J#q4` z_(a*Cin^tzXH5Tc97d+wJ2<4LrzzP|xiU)7Gd7>WG7dhFR4&HF1caQuYsF|bWqzWA zS4l{;qQNUk6ayYkWYj71h1~31_c`wS_8)(6c{% zrH*~?te(GQ_P07`HvcbdK2_hMo97u6jJ~1{){CY0ul+gQemVdEMwvcsN=C*TPESwy zdglH!No{|FEiAjCq3Xga$!FC^T$Mz9BXXyY@@8}{SELdET;kN^Bt-geT^I19b9C6| zXH6~gS5ZlsH@VFsDRJV)li}Lr&9RrcEkrg?eD6U%%iO4av$R{4VkrQm=W|~bJ)SgS zbnCI#^~}8szWZa*T$1M9nHzV0xYZv`w?6=gc=d*T4J8sud81fXUQ)#e0K-1C#!6sw z*esR}?-j2k=h5wd*jpC+k<@iZ3?FjlAg8S!uCP^?W}E;38im~OS`+ikyZVVm4S`iqeqHg(>f~JBy6X&iRGgy7^jYn3aMyuY!2Gv3g(q|Ba zbnX6#wvrYyzaIm;|FkiElh>XVQ#1^Ar8cM~?MmflA5&h{r=NbBoqZDktgT06CcgPv zgha?E2+Ge?d! zB-dnSJysrqospXId;5W*cgSzu(6F#fRbiFnv+5&ms6wK4bonV$e0*9jK)JcOH8nNK zoj%GFuXA}n1uDsIDYfVPvlFu^kJ-=DvTGHtqIk`+7ea}&xmnUEZe8sPBvP7syFpbn zwEs4@f-5rWqbYmM!wDXa7m4sEI}-LBaY-0xUj3r@L)hQQNi&0EG1w0Kj2$Jb(F~$K$g(?3WGAP**g?#SLpL&o5K;1g(%;A-8gx{-CHp zr!#&(_!KnY1lZ4TvHx-c00_7h6uK5hVGt4?08sS|Rqv6ITS?W@Bvbq1qB;Q3>Sxk< zo08HhQEkCzlbuqJ9BhYr!HpsSxr*n^6^8Ww(OYaaiN7@FE>zZd@KOyX!L2aV>&PL z($mmkGS@B!_|^B<^0IP;8j7XdmxZqgMq3GwpwqB!{;pin=;IVMMIC%lP))piG-}cp z<7{pJ{`0cvO;0XtXd&_h?F$o;w3`~LD6FC$by1c#Cu)b3$jr>l%*lGv?dZ@i52=d0VMVQV`h9O+rF^0TJY?ytPoCC{`33O=C8v@G?IG%ujVb4d;RC+|F$ohHFmh$P6~Y_M$#lx&9sbMtAIjif81x#)DSAP0Bk|%d>b}#7_jlQA|{`={Y{`G9v$zz6Q zq+jm#eCv{istc=Rvb@_wRg!)HplJHME0q9Xyz82&1~2?0P9F-}60pKi(|C+*mjP4U z2RW_oYM^P()2MyN17Jg@t{P^d@!-Zaj6@pb_?tR?G)C4_*O@fyr(k~Bz2ef!_jT~= zhR`{--yEY$ zikdG(1N^3XtZjke>q1>U&%_eKoXjITVPph>OFC?J?tZ0c<-&Eo6B)C-Na_P{aT)Jf z$}w*_=N+z}J?ORWr#Y@?^YV+fu5UjtDCyJf!h{*GW8F7^W)m2!vNdl z#@Y~cFl42T+wZGHlz~)n$*ZFCO9F9AM%jjSb{Hc{g3%~~+le77xdL2CEL%Iq`(a&B(S#$RqryL4HNAP8q?XF$kf@UYRlwyc@s>VcytzkgUl!*@P? zboCCSOj7>1$W{C0$HYDdws0RXaw zspG;`*;#4G`#vNXMx_sO9Ksy({OQAPS7I@4&LGXYE7v(FQ4#O#;I}tmXI8fCw-sE< z23>;Nz>ZnJ_h!%TZ{L1>L-&MsD9rjh>-Ph{zwapdPx6_cFgp|)X&K?o<;52_X5KI8 zUaW(s;tfbOCwBz5T~_)qeS9CnDygKmCF*t1yTfoK=cwUEiEw&YqdWoCnux`0)gly%$zy1b@hi~n5n6$wY4=8 z1%W{Hcvvi!scGwjr7!>>2tptbczJm>H8ml15C}w1g~4D%MMW_ftq-Ch0RVS65QrYeh!G=VVq%Pqjb#@- z+7Eu)AP52gomd*bL~rN+0O{10`vzMX6#xJL07*qoM6N<$g7F=!c>n+a literal 0 HcmV?d00001 diff --git a/doc/assistant/nautilusmenu.png b/doc/assistant/nautilusmenu.png new file mode 100644 index 0000000000000000000000000000000000000000..d7926e34f2bf0c72b4efe304a3986cb590f7ca16 GIT binary patch literal 59867 zcmZsC1yo$i*5<(-LeSs=f(LhZ0wK6-2*HB8ySux)ySuwI?oMzE?l7JE=G}j0&8*dZ zy1Q1NQ&rpdu5Sm+$w;6e;voV6fFk)tQ~>}WZ2#h}!q} z4G~X^iVq%yvy=QL2Dc7{jX^=We&XT}9{OM>re-H%X>M*{VF!rV80gs<{3LNSu`?!- zko+d6>Wzv603?8v7(SpADXLMaAP zawwSgzJ&z`2UFnblLs?Z-+ezP#Nr_hAra#yAXp_Fj9+tqTh!;H-uM0v>_2f?TUt0e z7 zFZ2$`;=wANFb{zQPT3`6+=wDU92C?s(~wHqf;Yt3f(P5%d%q9-^l)1&qq5-1sorBE zEW>_2o*83Bvi)kwupv&6s++_>Pkn23_xtK0;6zqFPMY2|Dos>AFSM4HM*oW(H29Vf zXmj5LHV%e`Qr}3a^1LrC;i4S&UegW9R3SMBw~99dSLaLWAJU(p)aeqGXxuv-`J%{! z^^)YMu5WI?wmB2VYm!qzf}bMh)9`JyWXhNknM^V!A>o7n-!P?afU&6$&93WP}hwA5x*{Ec2Nf1)XI>#Kn$t3kI%EPzwnfoKEiuo_7@w5&C}WG*jOQVbZm06tYi%G*}TZz7Oy)7 z$-fkIcq$`@0oWVnmlH7fuDj~;lY~NX2I*>SnGd^BfGo-k10y3y!RsL=0GQ zJlWXPxZ0t0Glt2hkjOQQ`H)6seUT$K)~qih?}t}cQp=N5VylDj*TZGWOdU6b0x~T{ zJ=vI<_iUO0ubrl|Cb-~%lz-<}`An4F%YerZ1~iuu3tQooU=UJMV z%W$Mt;S`qY309)#v@;}q+s4Z-P0MYMjrC=j$$$h}`uoaI!bd*8#{`QSSYB5;3}8-8 zM*++@%tZDgh)`Z+*;DKx%$+{n9G{4iS)Neb1Qv)eO)t>`O~9`46Q9KIhX&lR1@{#Um!66 z#Z*up^Hc1|=mAt8Wp#aA@i)Wu39X-`HMO+{)mF&8b_e}&*5E}-0k??i+$ z)ijlEg@q4*;QNTuYp0=TM;kJoY^vhA{Nbi2;g&dZ(5QAviymiCKKQ??bAUf-lwWUh zFsh7vx||#$EjHJqD)D85XUi%PJIta?_%SpuKmE^63EOaW`6jb;)TKBZf z)8(?LMiz&L<|o$Y2e9?^K*W%8O6ti?O?hha`HYN2|C&ynRFQvG=&%+W8!M>)6F=e0 zy<3NOqrWu$R~IW{FPkdI@37>3`9G4C_VzI*vz&;?DdjN_w@*Sw@c(6Kkiq!y@a@fE z-;e4%1?nBg4*rA0Xn*1C%*eMJe1r&88EM(}qN=WqN?Vbgi~q-N5{_zojK6$v3l_~e zM%eO?_QUCnA*YW1LO?(;GD^#wVaR+j^!sw4UlD97{Zana-ocvprY8>`IDYx_FRC78LT$VSpM4HFG5*b}yWy zc@h1$<(^-wa|aiK;IP>LOWz~!xe+`$Xb1o=Ts(K`-P|P6dt3p8>x?iQ7#E!nLQ#ag zJWehSf3A-<4|mncGR%1zAiG|DT`>`12+_)!fRm-hT5;Z@s*nGbhw>ZsL+Ql0uQfHy z8M{AKRa8QxMbo+M9jYA5rmB9hfAMjOdCZ$|0=}QQUU{yxp#u>_k;MFF&;S9Cb<*fA zWLH_TZQrLKYff@{|MCt0s5XWi*yPk9rEhlMrwGvFB|;mtcFyPBT8@{9R9rM;kJ#ai zIOnOtuMDubcXD=ivA;fAtk#z}kC5hNokl$5VcFQV;nJet@9}4$lqJk>+(>??s1w#8 zBT`!Y*Wx8SmO+0;1K6y4euj(pZdqBZ$w-5JAE1z#SGCks8Tpps&eNoY3byXBwD3Mo z&z$uRywdnm^ogB(_Im;=Z=~MaR?Tkwp3>Kx&C)UqTE+NiG-m($U!H_`i_T5Xv#oU@ z(&))vq*o6J&WMc`TMQs0uaI9-cGs%;+M*>AqK(@{PlMxTF?W!f?dJevSx#GzsBw;x z%G8~Zm@`aZuio=oV?}?-e{>hDB6OwR%%=GKc;Nv=v{^G;4hG3Vp=G9Y@9j{V4$G`3| zOpSIubh5i!Y%Tzi5ND^$K@=}#e{rc!p9lp+i%7_0+TSk<0ZmR1W}WL$&06#{jsM*$ zTa*fyZ*V@;OBR?^#N2I>9XogWa=GNs4%Z5 zu2n;F04hYrG8JB_d>doYIPu(UeJH?1@*o>sUMfH41E9ApWPtmx9uCyJZ{eEw%_H<~ zEUadk)^`%$ts^?aNr?vQbMx8LL`#Lcy!wAFn=yV}+1}osLUG*S&eXB&^f-aGdDi^M z1OaN`t>*RNW&Sl@BCvUMvfku0Ha;%@ubdYVRn4=#9o?R;z`($?yWB7{F){slSFGgn z`uwoH{Ucj$2zulvGc9dthx-#dRR-9LEG;fV!@y+EGyQ9%d<^obXvoOOK7alO4xV;x zpdz=g9(ajB0|NuY!PdPKcsl~T!=Jh;1TB4Tj{@|baKM1RugAcU<8r-p_Gyzqh!4DX3vhoTI+i7hKp zQgoWS|H^?mnY#)=BB_u&blxbKk|Mb4`^{mV{L-E5DO`T zulb4X8ZMm(wu@F3Z96;@8YDk=_#w|;r%r=Q3cpMiVAV<5ELzEoM|}99NB(`Mf%n!1 zt#|Q*wN#Huu{v{ zIuB;q=K~Hm$-(?WRr-_lalcfBVjXvW-HZL(Sh$4wiN|K!eVKIb_~-|RhMYi?^-cuY zgQ$2UiVB{aGUnq1X$seVts?6R3L!0pAUq3r(d`>r-$1d(uJ=+bWb7p?RbUgyNyD2r zvu)Xkd{}@ZCJ3t{r_)qHDNhnog^s`q%#S ztb&;B{?^3}(mqj%w7|ya~3d2|ulm0;1hghSs_1lF7vkuw``;+;(65QO|EtiEe&@Ni-hv}Kz{$;Ru~hSkmzMyrv9U=@ zOB)#(*>nG+8E%U{GUiE%qUOL_Dc7q$>)m=Vi>klk4Mg25_dTD}ugW*r>VH)YJ0Pz8 ztkY=_9~Ug&AL7)z)M)f1G1~FV`%~ONXZy_t6qt0=jnCrw!`$+rWE{Cb;?!Q{LTT(C!Qfcqiz-ro5SwrKF<`c%pqqC z%8AzpG}(`E%FW|s2ei9Zp;cu|pO^uw+Bwu2;oZ#k}iRAhAFkxA5ew)qOZ>u@RifyMZeN#|M2Ium{Aq^Q4oT)y_-3f{IX?JEu0pY z01a#-egf2z{v^MAmUh}kJgsrl+gT48O>~b}7K)R2? z5TFN%&%Bp9ShC%Jyg5b#aOl$tIgFi1kpMZVOo4HEseZR;n0E6CLl^`u+Y@NYhRMQUGHuov)P8{3@Wo=(XfUdCcWCX4s z9%~C;diI(x>a~X7@B}u?{dGhCz%oz_?;%iy=WrV#9q}dxyGyV~abynIN~f6;yy`dg zMivvRz9VjL+*b+wvpK!pti|%gE&JPe+lgTZyMzxt2wPJaBCClRWOsg3ABuxR6;h!~ z+zR;Ca!k0mxGt-wBrQJiw%9H)RKWpXYR<9am0cW;zcp{l$jub`bpwO+k<+HJ_+%k$LAp=g0j#Ifa6OiHhdoyeeRD?kV& zWOm?PJuHBCPV<+OsRK0wFCFpyOrdy886@!7gJJzlwA9ola>${94Z3%XmSa=u6f&V! z8R?S_%d6!(DttxysHaVl3k>S1MuYp2XBf9W&va(rTos9T2Cf?t-!6AXdX44-$haQf?5p%z+Z!x|0 zXh0U$Lu&A{n*3kX^`Saf=MutECv`c&#R>yR;Wvp=Tl zc9?v1RyA6_A&;Fjo~0R&jpLCHDo&2i*G!yQ=^#fy0hhAG?u@M27dr2fBGz;+u~W$H zk27FWUq=#X;D04?dCu=c5yH8LpP4}CSbwVflnJBUT>e##6>n8*mI!72_4H>Wy}a|% zAs|OeRwETx&qCbGC`-wL|B+(28UJZ3(`6gf@n>Oj=@?Sr)wTaV!qDs_uy331T>8bN zK(_D6RBn$<1J#%n*ZZ+7$k2~uSV|qHJzY6x_4Y1edGySbHKmcFKgHg-P(|f1JWT8U zApl|qry}*}tLGa{-@r@YT#aXG5{Qfg>Q~u zf;8mhy!4V@AI89uSWsxFDfXz8+-{6Qy?E}tF;&Qq+NHt?qS6b!+9gaeYRve&^=iMg zS&6&L--@KVYKJD5fF}y*WcJgk@m0$GNbyB$h0Z;>*-my*v4AR8A!HX0i;=rX#N&<2 zcKj2Eg+zrLr31R$GER#pXBk23+hjehX^Y##N*s&;M3(bt5XDY@e~In>#M|=~$dq<3 zXs_Z-$N$kHAi=r5e7I&BHH;CN#jtij4MD*(b2g{KyxRvRoHL4?x>>qF#dP*pIg4+F z_nN8OfmOYRNYo>psfYR}fKwgO4$2z&q%7>J&*t%Xb`hSE2niT~Q%iY(?I&(kOG~cd z`^a(@T5RE#2J-n<`$!?>RD4%QJ2aNT*yTS6>4m_@!;h{SkBOP(0ym}97Ba{r>dux& zgk$*@OdsAs1C>5fpVL~j8vzSS7kFzWo|l5RS>FgIH1gv;=Izh^>QqXP3=NZ|0u{hy zo|5WVq4*o=SOx6>zq^M@ICuW7ptL%f5Kv0^?d89FB^OdeNBvICc!A2gn$^$)e3_t$ z$={9F$K|*Da$@_yR?z%D#v^`ND$8AUEGQhpORKnA6bm;e`2N#s_R@9%m2kvX569=P zup>%%M#ZM0)`>65!@F3o35ISn zRHY8ig_*MH|Sq1UbF&G5ESL8p+n2B6ML%m!*YmZ|_q-Jo36smc7yhOILQ>g@3xafUKa)jmDEyF57{x$BlRo1*M_6xjTn5g@>nUX#~i< z)3hrPT!)RFLAuwvY*KoZy5=!PojhE99X8}#QhA8&Hq zwqvi{Y5l}$m}Ix}{x;-Rx_MXbI>vI&Eg@2L&B3!*es5vFx)i8ch@t!;ub}K;87CCS z1Bb~dzS6g$v}L~%Dx@bC_<7mA>o{HVh)g&?+&jSUWVTvUoHBw5kSM`yKV>TV;mth- zEexl1Z(Zf-ztThv#~I8JCl)-S<@6?2v>g&;$`>i5y0wH-ce;!m)_CSAp7YYvJabSO z+PU|)q2zA#r+Po!PS>&y#cS?Vl*qt2*smkEunt{lrSlwDopYDGRQgjlYEUv^M0ls4oqu3GauD9&AU(7kg)rW)O&auzm93rSAoc}Bxcck^6 zlu>5v;nk7O%II10+@+mjvae)6&C;y$?nv53(hY{HCCxMeiA` z|B(EmjZMtU<1A4myKqSO66nV;z+KK?iSLUXpflNL%BcaGhAEwJy7-e zthT)k#O?q2{Ai`Wb8x%pT$s(+gL9iLCe_CF%D*ts^Q|m23JUNYcXBTaKge8vavJ$5 z@e#*2bAza>>En!|3{EFUfQ}7A>+6s8hN+$H@hCTzpYAWP%{H#_r6oe?98e;@1faP_ zTX&UQ$vl(h`d{~9jso`%-xTs)min*^XafX0k-HXwKPLw{;kF(E8sa1B^9uE=<+1qx zA&oOufg$OF!}6br)AHo>o4y(8xY5~~nwk(qCb=XBm-jHZfE=b+G}z_EU`obdQqvDn zC$_iIa*dDLEmt1`Gsi@pwZAL5n{mHaTVxR?+Pm1xdZipw54^QzF6~`7nG_EX!IGr- z4mM-)lIc)Banl&z9er>va7&}_WOo@Y*1UN&xxu+=2(Jij+|Y;B;&teYdK^FPPmX+? zYO!&>%N!}Iur*f-ZJek-ezLdKivP#~1-0W8fsjoILOGTnoSSc~)#X#^Eik`RFXt>1 z{Ag5DfAQc>>)F}Q{RFxLNZb>qKVDM4X3VDUPE*EQS9ZL~y-DGa@l(nA zT#JkBn7q$Z{;B5yJMd!%T!k6kxeRj}fF$!q&?WhekI=-+pE%mPM1Va(&oEvo_pS(A zypB(russejpYF|DNNk|WMnjj$6C;VubUu&auD^{>WT9Vk=cw_Kx8nu(OfKcoTHe5V z>!_Bnr&Bq8m+e7$ZojL7A9v99F64ZQIGNRXvFg=cr#vG)HByD~{efOja>MT{Py)lj z-Tbp%GBv_)i8Ih*5(?O6-7i#j7x{L;CT4~fd(L`it`om(v1hTi&VSD7#mAHVMipNH z#~1e5GH(OS;jJ}l~rEFU}Fen z;+K;!lP5H>rtii5ohw3eBQ-VVN2MhWG#qnXN-Pok{P+3{61ZQeGK0@wKs3g_tUE5J zrKfwn#kNLazRqUSoRlAR*Z)~o{`+z-H2 z=9FO0a_*JbeAG#3;Jgy*00u~JKgGwCMVWu8vtEN+zrw_urWFG{&n2on)X3`!j8Ya@4$BU6PIGUP^+ASC%FJOJ< zQN-K4tK_i%IsBdSdrkzW`%6#LrcLZ?x$iTygd1@ny-O0=6a3htsw+R*8?!bw3+8si zLuXBW@54vHLlOUbV~(==JcS+V+@*8w`%u9)`8rY@!%8mg&jLm|o%-Dayhibcr!Svv zCYF_g)kOS~{ush7NAjh<>KdpoRA}!{r1RJx%_g`xpvmegF@0R8(l}(+*)>VM>$q8p z9L|@;!eh{%cv?3kdsF*)c85MmKeimIQA_|^P-;DAQaX{04L(T_JGY1pK41&PFm%GR zmWfj~5A$Td?QC`mA^lyHAVl)+oA6#R@k;>1Vbk?>%FbGAvXvsuTq$V({Mqbj7z!vK z@n15PR;_KyF@<7vV!dBtxmf$rKi|9t1x-MP9aguQnN*@J(QCCYr+J%sxMv{o)?)Yo ziQL=w;SSim2%piyc%pgV#mMl*trnu?EKnw+V}b)ESAbWZ1GyKs@JqdX{KoyKv5EDe z#o?iYJBWy1&hIfgy*>P|c?5*-upx!?NAw1l5oxDU`Cj#1rVBvk|HT3XQE&K!TBc5- zQb(qFuS7lgqzjf0LxMjf{3QVMEktmT*>5hdOMM--6Lx8H(#w;w)nS6>|g3!xU16q z4j(V`B8$P<)@eRCI$E9A_}xX^zE{l{N>TRx*e+5!)X_6K0vZSVo(BHbwJJJVqB0IG->0>%m__n_b>l;5pr!};(RAowvB_;|j4;q*ROwB* z;HB|!+Vhs1R_`TnR{S`}q9Rjp_6EvG{`JAYrJ_*iZrJlo?N9uA3sZmf=??FTYco-2 z;s(jSoW`ij-pSz%Wp6K>LlqNjApKjJx{$gntSgV8NE^wVm4K3qrx7SgxpbQ$@(=5r z>cr`4yt0&7b;F!iiZdD@>Oh1t?j67_AWZVEg*8}Ukb-&w!oxy%&|=W>8H`ZS*Y_5V zfP3rI%0Ig){MsmN+P8E=a2fI+5g)BD!-8>M5I~K>>5~_QDISqsc~ZIEVO`in53{AJ ze?|qUMk8oL=nsMmbRl~j_&ax%R94OiW~%>0Xbzi zbHU7FeNXOsl2vt2nwE!V4Y;u9hhF)-mMA%X%{!qm%|&v7JJ?23J5Yom3Et{wmZm%o zN9zFy6|?1sZpSwrovCl?4l$%7bC<5WCiWoY5w5navk<-O22zI4dJ&PNvYL(?+Dvr& ze*!3m(-t!6*AUCmjTUU-PjgU#Urj}^dF5GOn&Af%G@eTVA?nc*$uo?BY7zilc)KvW6-$mCcGO@rzPtxXtpuX5!MTXlKpi1jjAq!Z6`U&^~L$fJF(-H zK6S2M*0Xwut#1Pc=;?(sq-7nGW8ASct}fM=TiBSB&s@L({a@vo;|9~=-4adWYZR8< znatFE(EJ)J6sMiXeq^z&Uyfj`!$(ia1S0MWS27Ftwc6ajH7KfpL_2p8iEm12IB4db zXL{>NxwX=1*jv0j*{5~QnuFyoa)WsJ)*PXO=d&GsnK~L+kET*C#SRf;_vwe=;Z$;4 z9nTg!+B)$xZP3S2&j;(>Zd5Y!GMCo=)r*CRJ84W;p1b%YcwV}Po-+)V>!u>p19xE_ zY`1-e$i@@%z=lXEM72WCHwqlga{N`Tw(4WpNFsb5dPBRhMW%Yskg$*prk7K6GSbu| zt#3qnvHM;btHvc-=380zzUY=D2TXdj;xR4uSCds49_cMkPYh_s3AQ%sSLvp`^S;qg z8LqMGZ+8@EvKy|dbqqz(MAZQWc}3{tCW1B}&lqn^fCJII!~v05|ks zGa$*y?HMt7QG;^EANyx71%!|1tM#qLGFKtZQ@<~=wpW=$ZIOo48qz}+lEwbIbK||K z?>2TDL=n9kx_8~=6bGOgNz?VnZ@jgGL+d=?B1=K1`QFsF{>X&(tVH4)>srY%D>$!e zHsVif*mJW+=+4+1Nxt286j#Xx-hIF#(j&SlruUmsx)Vnn~qaRcX)4%?y3(7#a=+ty^$n8BI9eeCK#z&!u<1!LRdF_4ZAwcPj40d^l+)xj^ z?rbz%dQ7LRP_{W)3i%|G{^(JU-y3dfly1TM%Vhd2*_MNRR84Rk&5YyMOr;r_ER>kr z3pfgbKB^_vfa5BTJlh>E6uq5CN#pI(?PcMyKSX`8|K_$kd#|m^;P$@ZLT+|8vou5z zVlyOu|z0!nj= z6(KMkYvEn5I@aaIbBJ{WM&C8L+-MjZN8&wscG|Q=HeRWYQVM)|HUN`r%6r3Hx?#ia z^0D{H$8lknKlIh^15tLyPmi}sx9jX&j`!@y?o(xuT@&f8t|%YoN0on1)xSlgGuUY! zk4f`w+1I!|UcU{Kb$o3~j&u9GCn{WEL>h^8|)zJEnAa zxYc$w@ZHTTKiN|5xjM8znR*3-d8Z@kXkhSxZjrUrGRH5`<($6#?F0cz%ZUz1nylTy zuvV575(b(aJiUmK(DcR;yuqAJS;bX3k8gP z&I{pb8;tX z@z7!3?K&l}zQuqN6D4_93Bf+%GavMC1uS32DBzz8*y7BF7F~FLfMx~#hi%DTVV_Pq70kS~uV0$x1ssTgYxuK_s3@;m z#uy`_)n?z1s%Jk6v@`qt220$rMW%12;jgYKW{O?j@J=?`amLnQ10R5{pe^?WHw(9| z4XBr#jS7ap``k0h4jbKfsAI2K`qJ{}v;lOdOGQbmzGoBOGc_vj32TTm+RR&#%9Z(g zv}242sQ23-8TpEWcQ#Z*dQ^~G=o?*r{?NNp;AC$Id7il@U()64a+}+ku*(aH+iix_ zdWWUfx+O@&`-G(VeIY2;WieT;`BA6C?s0isBD3rm7WnwFyA;RrXSJGlcek4gq3I`m zFE;ZQ{uQGBo)mC9I*AXJEwTssun%XCv+p>21uFHMOaN zfXZmu?^wDs!N1C#UNl0&W+1lEq1N`NHHfR!jj*mghtHEx4l@IqBo>XnGgf8J=%7l5 zi2b%(e<$JFoKgY!B!=eQ##;2r$h>Z4B?KGG6j(>L6dCM-dCjM4q z*B~AZ36xxpDsT6lNPR^3O}7t8041Dk>o91^Fy11Qfr?ECXZGSiRE&;M;`4cf&IUQ; z(vE#0w#CPmN5Nyh;){-QocsROP)Uy2qv;697IETK5C-utJ^=z?tnD1#_BEnBhrc=G zZqI#-`qQsgI43a=iu~?y!0T!aPF>fYMFuNN)arJ<8nK9hhJN>k#5?uEs$FgO*84j( zf*b9kf{#1c*&ja^8;nE|bziHZ!fN}p7A8<1yAE-i?NM%+QzKp=xt*6crjTpHiZ4$7 zJX>t$p>mVXYaJR)`sPUi$HN1IvRbVlnK3qtp+l+ps%D+k*w;B2CAch;G!!x-2D>Q-J z#@bIK)jS!7U+YSfK?2WacfJZrDer;`VA}0xw4NJH8SBUTgEgpc3@Ao^iU?Y+k;rBK z1KId%r~W~3)ZtF9ZZ=3hcRtBeusRy%NQ0BxBG5lLkH1#_U66{*V{9N5#ygarc3-rb zvNsf(cxFDb&z&TRB=Epw`fsg$b}Z_7{8&s$6NnP}tj9<>5<6>aTN}F` zM&z|S@LW@FVE9;`vTAerVh#VebS-1!_3fp3U-g6k!*m7u zY(XO?kGW=0zV7tO$3vSN>q!#YA0w3yx~qVTA!kCyK=kie_Xy^wY!puh8|oY^c{R1g zlG0TbGj%pRlmI<)$?18_&1SLkS55O@$@1S3839B=9rfY;t55HP9flfP^dH^c-S=0L zOG=Tyhl2~OVMb^<{QDqv`O>-amJ##*g!r5<1FuX4^81}faHXI(l|YDhU}#{HRQ?at zI4Rn*)z;Yfc<^BuP^Cs^WV9gTkq!;{QD2t{IXCkVoPt5;JdnWW{D(p@VDK}!7$gkL zgFm8w4#ePl@-@02!WJ9t>B$dDls3#PSJaX*-D@rf6M;FW^pM_8Vn5?Ad$x0E@}&x$ zrK{EGysNu<#>PZRMAfeYH0M>ccN<>$X(b`N!prL$YNaA?nb%Ye({OcgDJCX{p@DF5 zDB!xU_T)qw2qNMN=-qKWp{u-Z#C$v0zu;?7h#qb(aq2iM zz^{9Zy)rcP7fuL7?92tEK>{`3!eDimI)|59OJf~zl)TU@jnyHttOu0o6O-#%5{C_- zv*+L8`AizK;)Ue=o*wCj3e;}0W3MFHSf58VxJ*Sz9k-ZMwlF0^sqmOU{0F$*KKB>6 zO`h-%aJy7eQw6yf3=h=THA#B67A*g{5F$UC!ie~ZLqs8;qS!%ewST&g{#Ug3V2VTJ zZm`qiU2~gbZmBNXV1##36j@4dQ^_12P{dveE%Xi=e4trSls7p#+A3S=0f%~ug^MID zmLsmaa!_5p^Fw?vjBw`2roO3(oV-kS`)1V8(9m+v-G9gFYpKmf5`XE0m!-T=v_kQ( zFPZV*>1YG=5I8EVnzVo*0hg$yK-6aIV~sC&jC(?IU!BuriZO0ab5~&<@#n<4214Ug zPR49{Q|>V3ehEmRle~K?w$3-=Vl=!t^et-_AP!DpiTae~aK19UkNfaw=W@-tq&s_G z@AQmaQExNNUrG3Zki}%%Z)%DxTBm%xCWrsn^sF{!&Rr#|%)HFYxn6wmRs~LB?#-l; zm``S^z6^{zrw>%zS0^{fuN(M05?wA_P$XC6`oI&y$q6i8E;SH-t_!9ZK?FS~r)bMd zT9rBbS>CH<zba($dg~lo^C5u&o?cDqaqo1@A)w z|82mxtn{LhUyH|b$H=;U5YE-ve)1i8X#WUk^zQgz<^ap71KwO;_7`=C-1nvnd;@h& z>hg9_i8gFbQIXnQ6hH07kIeY9jH87nvEeZe^lGs)uEIB)^PLG3oUUzWNaNB>xWG3$ z!zcS>=B_wj99lN!n4Ca&;(VIkAJ|T{>OhqBd5wixWM+{|xaS~_kpa$ayPfg3&S0YS zr`wo#-tXeRSlel(9JVde8ix8~^07+Z!r^8J+gRbH8s!DLT%a!#9X1DhuCzwc&`jos zc{iCBM9l4xrIE3Lsr%JC5??~Pn6x~Vls|E>%jo=ZWS>&@8rQ|<+U`BQ=A>c4d+w&} z6p$W%z4p`;(6yibPu4IOw6&gMaO{}Tq%vG>M4NzYfAlnGvFruTCI(UM$3s19RJRXH zJL-=1@5+1&4-hE-zZnhMsB-R8_}a?@@P>W`Y%WAnKF1zApPgf+;b+q(bfGDM=^vjytu54-U6akJ{8VT1%GjaU=urN1(q}GQ zt?E|_)zX@3m!hPckeaSKZ)&64!eH9(T4Cubp!>1aVnN)Zqho**2}m>dOHP<@J}j1b zZD`>sQZuBJGN9oXz3Aa`;-Q4V`S8AvR#?DjTpG*=#*4LhmQtG1k&sW3mWAWmT(+ly z_!48`f2@v+R7y8@`y)~~?5jD=y7TX=4e)*)r773n-Fxg_*TrGDi2KUgr3#qN#(j7~)S7$xCJ7zg; zx_3Ry-@j_i#7btBUm&GU34RdiigklCi#7=G>+Evs0S#BuDO3JuB<2YX07 z&HNvE654i2j1S~j%_r{O;*!f#gk;LfZ}vMoK$VG#?%R0Vtg9m*kE1JXAN@so{CQ_R zV}98E$z3j?7+dOPvn)}X6g5wyeH%hV^5(q}(f}xAZSOGJbGbnr^{eXrYW-z@O19ni2r(8(C0J7Y9T zpznAu>yzi$6`9p$3f(N$%K6LF^EGu%*UQO$)=0U4V6OASN&Lx==HTGy@M?#?#hKUL z+ACDT5Z&jk_byMj%8GnF2oc{{SND*LlEgM)gMq&KfUL=ymmU)bCloV&Tmi z%{gac^)jM4R-PDrs1K)&*qM;A7)#~)OnI6jRebWQ5-Y=JMJ5oUplnE>`b8?-j60

Ui{c|E6jbKH2GyGTU=3jd!o_SPS-$Y=miz z@|C1YM%1+wfhZiKg;+Jpcm-wUlzt9J2te|T>{0D;p(afNAWJgWyXz>wE11?c1Jvgi zR*l?WG3Tb2)6Vqu7$)8gc{a+T7ZckkTN0ToZ+Uii6r5iN(0$MrjAfL@aL%Vo1oIxnFZQTyFcwT|o zpsemfb82*QI_n#@AR$P-me!vLt;Q6FXS zQpsI@t;zAf+s{BW|7|}D%rh3SZYjkT{@iIpfGR-~uc4+^=a*-@RQ4*;4zwK^&uy1^ z__{;rSZS`%?(wZvg8Kr=0icR;&o1R1#Jg<#gYECz%;wBjY(FmLyt0R)NK*RBd~VC} zyR6v(Cm8#rHnZo3^E;X6?{x0~+}|LW}6<7g+ki zA5P=yFujHzmp4zD7R$J}n47hFE9`5TZENMNpmjVZt3#6Plah-sE8gcl@nqp&XB(P8 z6z(oJ;52xkq%giM!muM2WT}^^weiwDVA@H*|7+N=->$y-^{m91Md0z}9vyo{fdfmx z^1)*wZ=CY&M0?_fDWwe)Ri=ccI`#Fz<2I~a044(Vdopat(_kiO1u@--;f#$MVN_Sg zU{!xA0cu_4dEV8uzK*7`d)#OKDb8snqLU&lQ%gk$QTlydy9$tX&`m7GasLpj;*|7U zmD84^TDeX^5x`FuCzYSbpxaPikAloin1S;5Sw!3grgrpDIgKp{x%cC z`crfqoQ1#XXglfKRkD79%AOn_)tm63a%=f%>n~sGcfo!N&0&+t#6o;`TaW*5x8V6s z1NJXuOtN>Cfs;{00%h8Y^71lM29Y^-8~|1Hm)S-~OA(@mbf;O5em{nC`W z#>z0krIqEwjZV+f3Y!(dOf0CZ5X4ZF)*jj@&FP-#&I zhXy+A2t74l*aC1fh#`-u6Cy9%;bPuKE1 z-VA-KpPnEHVt_Fnm2S;C-!7%IUbANwNpsngmnd`G(6(92r341tQ$muGI{D4w!BcEA+f%!juh`u^=IaE>_c^LJ(wiT+SX|Api zjOBRIVq&R6?5rKc?)bp#VkP#4Loo*@qO`STTwF^X{OM|cJGSR0NXm#^Uf{Cj4)%9E zU&MWKeKBSf8EEMK+#Rn@I=QvKytmY`^cw>on-mq1tW!-Z#G3lmJv+9dfA$6oE<{#U z)gR>&t)J@n;{Hk_|I{QZu99(JEp?xzV)8^ut*xx67%GRHQil7;Vn^|DWYv@NB!7MQ zOR3pFjdG888XWcc0HG-80KKuFp9Y|hUdzEX4``t#*E%B#`84a%5v?Cdm+L24Pa8X00u={mxReD?V@{&}8&;)_A!| zMOm3JWCIOwy*&;4fKiH%)^hkDv6A{fn;bB1cy=sJ|4y7Z5}zkJnUqAW=-C ztN>RwD0;`>Eb^5tN>6I1RTLHIhet-75@NO0)v1}$!T5@$?)7SM-Gn6)gl);ASneGN zujcddH}flTfYXK7x$-@t;&1AihzNJz9rLcVY(+~aECfx>YtWJEP)Lf zkB-+mqSjlp$PXB!YN9?Q?QOi-%gN#{;&_B;=IZ%a(~gE6Py4#55S!qRN2&Oj(OsZx zMbS`2Noms5hvgzGmB`!Jrv#2{Y&m)KH?xnNDLjf0xb%S{CU0Y6@H>i%>=le*kBcD_ z`*36Ev*Yx4McSG1SuBKJDV%yW;<;N^oQ)Qg6zgrMK(VaCqS@-gpeLw

Vj$;znsy zgx4cYgNLYKg(h)yBZK=Y^VBn1(7H*BKU09hB~6Q>5T{}`d|$cZZF;WswxQwdbme$y z|00$WtU-Jt!t#g0b$YYEzyVLHGB_9aAx98aR8lzD-6dRS(4xb}ku2$Bw$GKdHh7~j zIRs#1w8uub2 zx!Pa%)aBm&(_;CzI)b%}MInrlUlYRK4*m+phdBqWkcTQOQ^!O58yFb0HgPUAi)grT zr}io5wzF{o9ng;r#w4cWN0y z5|+B_ty6QAf%=18?6KbF3}W^g^D2m?_3A3-x{A3|n{!16VwZhtR5v-xr`Zh4! zA6(>0L@Fo{<>%!wUN9QNkAoXFB}0B&{V&emGOCVl+ZJ6wkf6bWTX1)GcY?dSyL*DW zTX1)G_ux)&cXti;>f3vtbI-f&wD;q!R=-wbQB|{M%`s*lz4y^7go=uo;&t#UiI6+9 zUi`TZrymLtQ@K>}aBqL%ot2mxwV(6t1)*S?YcRAa`hS2K2S+o*ZId!CYUljB-`=#j1R zl7SAYDJXbpyDm{Ki%6N8ol+$ZiO!=qxvC8S*gV4?Omc4B!J&l6i#U;#|$eRUs`Vd$|H3wfUTUwpOKEy^Ty+o-UrH(RXGG z#?%P3W!V~=;Ia5x#NgvkU$RN~zmz)=C$FsbueDuT_q2fQ0eHv^NqR7$FM|pP`I&?; zk6?;V<~xU|1b{DHb7+;3Tt5`GXc@!Xp6TY!Yd@PAnbX@TP1%Da_+PY&=8HB%k!kuB z70fc|Wsw2+dTa&2c_hI>5rch}4o6pfD=d7Mgmvm|U*miyNB14q*VZftoH)0^L;4~8 zdjo<)eq~ro!$cZiX>|Ob!!| z7e(bX^sBxGD=0QC!)ITAr=8kNRYf%kT^fH=F1_9HU2>e%coYWu5oCh0I9AzY zRrd4v$_;!}Gau!#%;(g_ml(HNAcHUA5~UR zq_5qP8{FcQI$P;hT1%OtjfItlrncv~%uY*?0w`zZ3w>q&9xQsu*tSzc<|owL8R_qt z>7JJtX`OcuITqRW?%tvgwP$e6;fZKJKC=|84EIGYrwz?$3T6a>`3Dnv+y|KuieaQR7) zA;DcTejcyG#P#4d>TVz(fXZoBMHCXN*zb$t7e+=to7I2M9YeA<^P^ z_q2_8aj}Ss`sVF@W^JvzVIV8pnnM1;QWmo<{AIH`BP-bvJPL|fGumVjwDz{1w~5oX zJ=gO2cIX-MrKYt)=k)P64emD97UGJ^tgfPXZPYjm6=`8r563r<{21(Md3hQw^b`m< z4$8$;z2A>mV~&u#G~pQi%|_Jf2mnD_xcv`ODCMazR7N?QRmq}^r}V?wW)||ovl+?y z=m2<`pbd`NCZCWTzSGnGwKZ+3q#JjhwqEH+8kY&8c}vMT=-^S#mvau)Uc9~G_mi-c-Jm2us?-u#?83FMtCJqjYux}bT2$wbz?1y<} zvI>NM?Q)Bn|4Tv4(Cgd8q~I>JUMN4ti(rG98B!!rkDDv`1ERmqS)1&OG`e^``z?1k zO^K$Fmg!z_@hjS{EZGcv{#vW&t$jRr`v4@I-eWLL+C!<%(4;N-_zodhQe{JQW!&#%`e75 z`&@Xar(PCQ^;WP*XX`429I;^YZ{PUuuCdUxHvX`28JeF(dP`lK$yzFXpZD7D12SHs zq?Ka~`m6OM{B9Nn*%T@aRvl@DUqovYJ;L1Vc+a_P!D50qm%|2h#5VcrinY$bBS~3E zfTeY0Ha(BcUx3g&p6ZeR)V?|ISq)9p#Mro?urO@UuvOc3OTn8jduSK158&Wr%$nL> zt~Uz`3X&?UD=QoAagU6OqNSx>UkC6cJG)_qpq2u8MY071N?s2xx4{pt=O@k7bckTy zv2htG9~!+bnTfuM_eU2A>k1DG%2;E-PhdR+={(uTn9*6nCoTc>!^a3iluJhA)u&QV z-3JO@>-jl^*Xt3||Lkt>UD(ievx5vJEixRR-NBFs;6HcBJ^X7Q{i$UCd2O}8`JUZs zFR2cLOcqqcnvZtn{`w5J=~vcJgw1rOp>Xx&`1(%7oYHiXJKGc&{#($CkKb+EQn*}u z-pt0D8q`liL(`&NrCCWP8Sk3~d*2e}MHFY+@>~se*ES4 zI>cKPxq-ZDJ|+SykU|wjE|gSJIQzLIP#CU5nU&S4HV^1!y!hXK?DL?DDkw~WQ!IHw zB8n;(NK}If5stjStHU4*!N5rAcV&mR*Vi-GGrw%4r>$oWA$@q&FG;ASC%l7$G*kzs z#QhU)Z*P@VPBYwSsi@FElF8A2qPn5fTd(8v-}~md9uvg_=DDi!N-_)oyDfQJZEg3r@lk_)N^G%->2!fY$JzV z@}!g$xFDgnDn!7h<;tB0D7Ska?7fW4wZr3SqG3_;HXgsZU@hjG(*JE{xMCOd;EFOS zJ#DbePGAL%>vXSeT1`cay}@EFtaOcm$WV$SZ?xWC)>uP6>gt*pIPFi+6fZ)vB`hg@ z-VS8@VDY0N5IMG5o}fT-d9(G;Qgt203327fUdOOH_HDRJ4T!{l;hB<#U@h>}W|Y4u zMQ)Zl`WRT%g>9MH^bSCu)T+%><8*YC zl9Dp>Y)1v_a{D?Kl8;+{@~q$XGTTf8kYU2U)c5MN{TjYkiIo?AXGj$1@Oix(kx-km zSYlXrJxAFXEdO4GD{Co}mHOo)n=66S_)1@R;(>tQ$CBL}vy2hgG{=fll)(C8YATVD z78k9zJE{y*o4K4USv<pSA&niqhppx414u*UF!ps^G=*MFwr<1XLwDu|`6Ff`a0jD$%}TV_=Z)Hx@Wf z!5FBzb3%q0mYFK5edGJ#9(cruup~SXgj>$}TOvPRR^Tx8|QKM?d5u!txV-KSaDrOhiV3 zgS6${_uNae_3qcIkF-HG4GlbZ?T1p#sI)fKaVJv8Gu&bJyu6*mWz`yrN=l6I)D#pY znJNA$&NKB9jOnGL@+-zwy1$SGGj6OCl=MuX5^_!YOoL>c#oUnoh0ffR*Wxgk4nD7y zKkhzo^JL9u;pz4`shC;AXsmDeib6nD)K+H~p+dz;ySezT0f+rI_U$i@-QFQcd}JSK4tW-AIl!X=X~cFI+1}Skjz-knV<1( zMYcV;vkoG2=ixBv$QM73pf27>_i_1&g@w{CvPlS^pgWe*2DzkN!A*9eov2rU&{E&r zIGhTMC~hE-qn5WfW`2o(uI}I<#UAph>N z1f`kuU938jw{yXbtM=_@e*!5azu)Gys@3AzFw(1D&d2yV$fZiQ#qmL17zztyicqhe zFgPJ2Yg0`=_csCSb2Z|+lzU3!Kqx>HsX?DSs~le@W98{gr!0G`u9|zE7(NdadV(9~{Rkdq%@T102?@v?bnu=v#%fj1WF>^gPEIjVPDtX4Ir&bb~H@f%n!N zaZksHU4Oi6n8XTaxy;BT?+YtUbqNujJMB39k|(d-r^`&E4QP-uMJjCiud!HdDEI{H z`?t3@@)!axhwV$LJ-~WFGPmBIFJICAOGPQlKJ7m;47<^+w{CG5Rnb`+LZPu~I>S-ai4~_IFseY?a`*#xcwI z^TSSD=Hu(*pSNG#h9RQHZERXrzcWyE{RR#eqK_NBKf>4b8nNJ;e>`leYoj#f*Vly! z87;KHaI{$67FHRpTER11d7E_QS9Ro75pewG$tl?_mouwn>8waWD(@+oa*Vo%MyIHQ z|ATd=o4`kp5HY7%#76PBH$U$cL$L1gMEJM&t>onqpg1|5$~hZ5E4$C1UzL=^Wb+dX z0?LTcuX(lI&<)@GoD{r7-;Z7%y^E$QsNcIF+Qkr^gzkgQO+r=o#0ibXH`MmTPoX|I zMyaVlguKkM$ z5N$1FUC6Ij3bo0)eydi&kp$z`RCEBy!*RJbKYPN4`{PkR2QQ?Px`Cy(b!wjaw zPEq9HFWR-rncOTDxZiD_a#<|B6D}2z7IKf*-ENmZ%$xoEUW~-wLoULzho>4Ul9Q9A zlWEdeEEJ`ya>$(J#3MCENN!3L@`p*7!bJKQP@;E*azUUcboBSGdeOK?yd}~-(TuIHuM*;#^_yeIx#U#A*KQ{nF#wkpi&7Qv{%(D#lh675wXD`E(BnZsU#GM zrkBQ{Sp~Y?uDdIZr-06{+&k`be<-7ss+<^bn7VR-B>ZwIS&7~!7UPfUAV^usyYz1| zP(2g+bot;su3tf`9{YDEmp!i9l$oykXZ_se=O3_6X-(BM+`V&uwk6{UX`60#YiVKAz=8RpHl`R8QX8HUTyW{ddF)y~%1p0;E!7TxoNpQkRCaY8)q@LD`< z^t#@Rh#^9V+&%^WK? zzi1=NDu4|VD&CeGh?%P1f};xjIm&oisin|tE2==LTyhyybmvV6Ix3}le1s6e6$=9e1s3F=k`32+ zvVR=iz$&CGA?yBlU^SwA2)6S>DfrjzF%|No?w>!opZpPg-?ajF5qUixw$A5LCezJ4 z>A^b`Kc97s-nM*sc+jCl1E2MP##|RITa&;bw7+N>W?gJAst4dLD z2o&}1MpKz@wsDF8us%Sux6qv~h}OSh29Hi-M+X+{DF(QrMLsDoVl&M;lLxF3$uD(V5+IF7>2NJ@C28lMINdFi#W;kYniV`cH!-R)I1=;)0 z!Qy%3Y?h-_= zF$mh?-MIBuPptX&;d0ll_q1Y!XA|2cHVk+CTnL&L%)F2K)+eAPylrJGse?CqR`4_z z6aSM8nV1Gpi}me~SGLK8!9!ll z3~igeE0XSCcI!cew?=Er#ic*GKMacm!2H2R8+0v`43C%{Qi&4a2h3bI72BvI?V5Z z($%<>i?f0A_9#>l3NW8LMS~-Do;3T8wW#@*~eAzhCdD%iMg$Tc`jKV#I~)ZVtvqPYLJG zpD+Qq7J#vfgoGyD{SLFunq9ac z;O8F~TU$BVV$rV$2hu6@fZO4Km6ZFvA4gcA3mZdZXegRruB6lt*~mL}F5bNAjEuIW zy5MJ13ulVMq?COhgA&(I{y!VsKs^g3+6v74_jo;+Gi>dPfF#hoDgx`S&5M#U^eU5HfUZKL$H z_0-WG7=NzCzll|LkILR=ROoKkyZki0glwFveZ0$RGp4LvPm_GUyhaV3gCOQfP-C02>4j> zyByYo1mDKUX!>@uFQ9Z^ummWI%(~iJ1tP@2{bTXqys&MT9~f2ZBd|bEv>6v={owxn z8@%6|SD{0+aX7UJXGmky)(JuCujSmeRR##_*=R2^Qgruu{UkBJICv?JhQ(Hq{codj zd0EXq?y((CZd8m-*-JK@K3i8-0EbAsnb1_VF0#C$rp&iElCEhIpE85q-{)GdL#Z=E z>ECrk6pmDN?^wvL^s8oAiffJL+mLv#4|z5x#2pL-Qu~k&-79h>T(ri955;npmcZ>G85QYPrzgo}X{=&@H!Z zZnbeG(#S$E!O*YsNf=o8eZL4dwq6{TvwJw+@JZpFHxcmA@UVD*hK#DJD<-V1kMJqq zR(-VT=2|OOXE0ii`UsZ8`MA0MR90si<;+q-V&!^&;xp^D^vN2*2S0?EhMr_55iEy< zyY*&`tSsZQcXLy3k3>2A0-YUJ&oJu^Cnfu4T0Ab2GJeF1eH<6Lt9xT^--vCg*UeSl z^SZ4-sPeu0pqc=TC*j=M)TQ-P*%_5D z_aU*6CtV$b)4{kAIX&E%6aI%6S6nr}h4u$FasgV!h7+mcC7kT+_v{Tl_ASr(vsELn zyO+xJ7Ow;d_!Vv&@xS)$9CQmj68om;(dtE z0Va7%un3<$Gc_EgqjEH&|kKv*3e1?PImtEpCIS={8YJPI}hc z;IhB)&{2FnnB&Fhunbw}j}@BPT4~(xJz}<1IT!9vEgxJ(q-ht8#eq#gN(+_py&D&OZ6?{TCMi z8v&8OHVt$CW4aG|hPBY}FdDr>J)w>iHR1+rR~MXK_ICvuqV-`Gv~-2ooPD`7F~K;nF$S-n$YK z?GcIE#s(r&a;Y<0IK6&)9qtZ&@C2%rSPGPo<&WB7q21FW-{K@lBB!c*z=nc2^W0LtIEHSXL(07Vn%@Vm@Z61z&Ly^g~Ug0;I<0{cJx^M>Nf=TsSTbrJrUId3$nvv_x&TH{KS}ir+Qz+jdUPerHsEV1QFJbS} z4W?%CQJqX50+x0P#>Y*w;^Slo*#k?NLhqmx+UB{m19?;`<@bJx>(8m8WZ+PzHi;zM zc2OB^YCApYJU_#F;mh3@gw7eVIAJyY&!P@SsK2ZnaPGGTvx4%~$Mh_;=Uz$`MDmC4 zw0bjxD%_~kF#WwpydV*)@Qf&(cthQs8I17c?~mMfWE^Mj!o`*kx8H+wyYQ#?S+UVuC$QK-s@ffdI<2jXNzbWmLJ5r@~N#MH6 zwX{@p?Q(GW6d@~iNk;_isY7VQz#uqqkazgpZxvOc<9GbSxZi)+bE5>&waZ!v#bUJD zL4~vF%oo|hr?K~5zf4u0iz5Co4|sK^cbufF>f)Oligd93ku(=S_TcpFOYdk$@NTus z5v7$O`;4^<*69=TrJ`DE2STa591$t6u$|0J$j-n{zwdh%Cu5mv(sM6Z(Q|b z_9YjxeRA1;)}^|432~lH$$)Un`RKQxO^3Hqza(rvV$GMehCP;G@RLSh7d{X}d>3_{ z@m}BPvCG7G{t(@M@u~HLMmX3sARUecCsIHFE)_v+n0S*P=hcZQmkdyG0{W^XEmdyr zcEF%G82@iCDWFFOz8j&ja`K9(-#{zl9f(+}+NP3wl}}*se!7B$`#N7!bh=ob!r1=X zqfQw3>p-*)77c6IB9$w0_rFs{K+6r%XK>MisNwfnjD9(rSZpDg9Ny{$Tvt0v;k(^h^zRHjEQ zOMkrA%NTyl9gj5MGiBejf6i1XZ-Z!7j2R|SnuoL+|k(al2Ply z0{UW1hF&$VIl$6l&i5tQ>G~k!6a3Hn%Bd-&=q1oA+ zMM~a;cZ{|VqZtX--`g+6vzNMAO;^g`&4$%pi($ovVEJEWyfg3l0t>QtAI{bAJ08~@ zE8nHT^nYZ1i;E`Gsi~M-7ySjHCAdzOQRQ4VlO#E!$7DKnx#|W1>PZ$hTd;+}E*b^- zZ`r_EBe1<=eN=QhOtqb~<|YZJf^4vl0TOUSP-5sJrI=aqn=1!NTWZyJ%H@MUCdOOL zk>g~)gbOy{TGPC3-`It9Fi6GO`yctt&~Lv&JBe}9qRYXJ9TX&e<;}1kFU*GC+D86RF$mI;IK4;_{$oO~lD{uXNULL`i(@?6a|lJ;=oqk3TS{X4tD4uEZIXkg-RH0Q89 zmJP6}<7pq<@{kd~RlIHEMC)3CK7m?_cb{N}HWQ>_9}4y&KZ-5ND4);g_;9l6{8EN! z$6EB{wHsK~6|e0tdyO7&#=SJuUvqLWj{y@Lfi^VuP?h!#Ez#nlBo&fY$jFOR-e;9d zxaGn_W+`vG_CX>>8U+ur_%+U6>eOZS!U~?J{mX0;x6g&RrSBjj@(Cm&CdS2~TwN}o;>B@X zk-@tVD+uMU(ND8m*OFFRD#+ij_!$LOQBPZiv^z9xWzN9QN8<&W?s|Bg`>jfL0sJAS z2=YZ>Jq#+p%YtkV?Ydv(?sa$b_D)UB3rs4{Y30I;@d4TE@bK_Uvz-PaE|YDG(LiPU z&${svuj&C>E1iq&g8V}D*1LT0q)(uXy6`sK&yu|}kBd2XhBMXmDpM;C)={jlcHYN~ zLy?8X?IL=Vyq+rO9IQOcKqw*`5~!SI%=ngBks~l?tmG{~^qCA%1gNm!#!GrNKtQ+weT_1CnTMGFK5dktQ9iI&VAE#E(@PfB7G`O4>0fJEI(m zxbD3NdHgVP{_Q)jUESuFZbP}X5(Qx@+SAI_xVUXZ#AuyWYX7Q<5xi3e+5C;)ZTF@m z7gTazMWO>kb>fJLEDqAdPRd14-%d1>d{Y8!b^C5AX3xeeo7=fwHL^a?Pp*tZ<_W;B zc@pLyPtc2HadW#yC>0I%02gw|0xprB5{jBz~voK8TJi zPF!`mc_%fuY}&M!qhxtf{m;q)M9&tOYW6J_`OlwtczB?mnHeH|r)hcUwB)5qM|5)P zZ{k8N{=^h7G>#;9nP~r8nSml}I3csL-*k{gN8`x$6K^wC1hL%s#x>-X}Kvag4#YHVL0;3h**WyrKL+Y!;R zc-}hrHiS>nf#tO!n2&pivGr5voA)a{HKNUHl$yJ^dR(hpt6RzsB`<8NKPpq3dYl9i zNkN3#3#36mf8?Cq{t@o>o0^bc6djqFnEvE5;%}mqec0HI-#`lFRYv0w;apuO&R?bH z#yp>EU?X8cqiFHxJw&ZinSWE=K7pX2hm7eq1=+?<{%7@r={_24QY^3no?s>Vk6>rN zxAzV|NPq+7FMifO_9+sTyfIc8^HL|7k1qDt;zF591s-@pn!n>!fg0AN)Pt_WGnC*n zAWB3o$Dbl94p_{(gkNGys7T7BoMjr#cxo zteZe8oc!F0LQ$C2-R(#d zhq^_72F3=dQihe(PEW|=?1@&jnqMq$9rL|A=y@cEYka`9$_3)Cb-X?Wz}sqSJE^OJ zC{UC)sKyTHjj1Uit=B*xO#g3K6Q2oBE{@-?mi0gF6bEz+k1!hHRuGUWIidiqqUg2) zwL`B^w0g^aqB>c=_H-Svy^U8+$zt^#l7V_QlopFy;E@Nn3x2ztZV=N|egd|*|2I0W zPRvcpB=$;yDPKFPBW7WJt_`G(K-0KD?LHEN$qQREp-Hfw0IL)<87K`GR{Mlqn%y9{wIzT}~f5P)oFf_iHW-@jEi|@lH^LSZ7GuNgYT(Ap7I%c8l=$EME7Q zyTaRpw2cT*bxAc$ywg9~sj&v~&8Rzl^DTz$?$11Cv#FTJn=e7dWCOuNhxnST8Ua$X zxp5Dbsh-y+mbN$0yljQdb4RziDIkylrssBDdO9`8n0zqXHxaGD;1^iHIAO2Bhu{?K z(Pz68jl_Z~ZTa^9oFrTnT2%CwNDZkX!gI&YoAHk+DailfUUE~_yju8RsJ&xpxvdzPjom{P@iV^5%lwOP|CXBU&BGWS$?4I-qN z8un>N#F)R$P?4g;QUEqMrpPm+b@6(YPIO~ZWUjl96QiN9VhAAugg~>v2KiJHYZYiw z;RE&vCj(H(cU%5smadSb^q`4AINa|3A-3@7w)Uvb*C*=2gnI!eUWKjFoW{drE3YN! zrC%$ltF*4m3n_Y=iNT55LWZ{odX?HdoUQ(c$gh;GIkS(0ujQ0PwH_tgK#kD~(r0Q# zJLeAqGK|1x{kQ4V|F>%g;lDev{FjLb;fZK;w;3({q0ehZYE~TC7Z{Mhs|ronDhDDc zX;mmUR;m(5#Np2;mz;QLup`)dMgN+VqC zI+evQ=olfu0)t--FKJE6r^gFRaeEu2*(zlmoxlO znYdB=sDy?10t1N|46vahL&ftC%MlVRuLquapov zf&e1a<&lF$U@EQBDaFPbr z24cllo8CIuaFcDOgiAV#?C^2+awjUHCuavwe$i!cw zYW}$gFp2%9D8}-oGhtP+uQ6&Hv51KR^W&JoyqG2(mt7ua5QZiqH4=wJ_tU|5y=}>&a8?JBljMrKBV$OLQYQ3 z!QJf0!l@m^=$(eZXs6g4_W3&9iLfg5)020(>nf%Q6v+~9h_5oyJJeWF)`nX; z%{SmS`Z&HS?)A%PK~dpElnbkM$#C9&AXdVIR4|p=D-$RFC$g-=%8gS>wi146yti3R zm|oyAwW$XtT$D!ni#YbL6A?nP6H>5;^T$yRhgkE9)YRsk37PTBF$HEI8gxHv*8Mio zkFrMrf&M8di}Xtxd^{;{0bT%E#dC+Y+)fFhHM>&BNmgcyvyx^TULOCthxY$>Rrw2hxr=04qV|_iY&U7GglSdaLfZc|G(kyvln_~&Nvk!8%72#jPEH%G;eb2OI$vYS z2z7mK$5#H{;Y|qw!S{zIn=)a!@RE}!jEFEdmmnplQE7tYf2G4(p0Fa4nx#x1u|WJ8 zHK~@pO9b1Jb`AT*2NDp!w=`N)(Akz&Wdym$JZiIA?7cQV+g*zLZCk~-G?X@jW`Wq- z^=H^dPDtx96`j?bnxH;>g`S*Rt-&@~29KgPrX1*8a5hWJx$ktIOqMY67Y|;fI;=Uv zik)%R==d(Q%hB<~a15KBUpilyv$})k5>B|07=%{P2?1&nD;ymA?gPyr)-Z9w3Il@r zb!rIJd7+B{7Zd92;ARwm(ye$5+&-(h70Qa{P=$@^ep4x<)qP@DTM^ZaO<$Lf4g!Q> zRBTz6)1RWPT7i!JJ7+HE=|33v#UTG9#;}E8TZ;)9aP=C8m#-g;rgzr|N*D@gZAlos zQJ;BItym^3&M+Gs4r#7CKt+5$vZv-4T*N@i z{7+4}Xh3BZ(yySTWJRRL-`P#K3sgTuKfXe}lTmyxuBCCwR6Td9`&aSfJ>v4YQ`Htk zVp6^=9utNBU$u{#JAWp~cF`evY%68CL(fQ@w#UaP9c#P_E~=6E_J76PDqY#n*>Ip( z?VekhcW0Y#Qxd2k{r5kKGqLP;46_P06E#hupKYSfmx@$u1A6uzDX&Yny2&H6ST}Ry~)$O8;1;EQiYGW!*3W2ijc9Q`EV& z?7=|etg>`XzT)}SjvPs%=V=I_tiTHV>z!u=@lZ3TPuT$-M}>0b3BO2Wd>&$uk=8=( zXV^)#ENPYS{<2aNwhCvc6-sK+M0F|d9h_Vt6#J>HeAB@yc{zf^a zg<&dHU_T86I%0zj3_B_FFoGfwMl53{uk4zrK4y;L0bWM_%&;*@EsRJ$a1H(5*i!{SIlnR1g5~0JT@;bT-bqqk}68lNg@F!9uZZxTsnNsf(YL_D`DKqYY zwX&e0>V7WIB;%*DZF)^bY3WE28LtEh zN=QHQb7nQ%j*&52x{ayf``$4z?>b^$oTsX3aBG^0@Ejv6o7cnZ=XkA8d4gzYXoR1W zlwwD1P?H-&`wbW{zX_t>+m@N3bgiSq1_6x-+uGWKf<&|VNyBC-=_oCN~ zLiHZr#s!X20*~PH7}Xb8fF{h#iP0GHw7H^>31o?Fn66(tJCn1L7LJ@_Ylyxe{8XPt zlq})-_tgshkS8grYmmPW6WSgc_^vq1iSFI!QURSQhf&zS@7Q0ZePxfMM~p{e4I@JQ zPmZ&XT;PZUEjh_04-Q6D;?1Wg54lYwxJUjYl=3D|phFEfV>`ABE7OVPd}X-;dp`DY z1}q;K&{r#S*RfTEO9Tg^r*)c{bylzsNa19-i9aW8GE)C1RmpgblPKuR>uYALu3m3( zq`MoRxU#}ZJKm$BKnn+0<}i>ykvfelKX)o7siF+!%_$=D0HqE%_4`{k_>%Y`x9xbfeSDZTBM28HPhN zBh9zof`uwdtkdaG)qQ}~(5q6#dk+mr^R2;jw(Kqj+&`>afLKR9LvWX)jy zfk@YAu*>rUuiEAeQDTMi6nP_n?cvqCkI=cZh!Y|yDd}ACb0*JQ^A~%nsNebwYdW1$ z;nJZ&)Pr*toQ=6FgAX#p&qNn|0~gD&w`IXiYYi;~+K~u8tHh9ju|It_egCdIh;oq%Ygt5{i{N$a$NVz*B13Zn9!$NPH~){zyFEy+y<8$4uYv}J&n06 zYpAeutyu9pIM`JzLkwy+G!79=7hI=g zHb|gw=E#{VW~dzKI1yki>9K>Da4fL-sq&X&{LjPZu9>A*~=2U?0FZypJQ( zNRY0ktelFOt`JuGw=Da~m=~lh`}be-GRpZAc<=g4bJ*?LZ_jA#3nA;xPCqTeFY^+` zqKq43=dVGlEjdTy%eT9oJOfCyIMZFl-_SvSDd)^&fwG}O$C13`-^vkTGW1rwj=I{} zK9m0)RM2J5ljxSgT#1td8ZEuG`3=*KjSQDiD~aIb(n^xI};H^_d|S|sVe zxBwqBcp<%Vv`r8uGlB{;-ot+&PV+Wyn<8txJRhr$x^FuU z0}w;Ka9QY;-qJrrVR~?kkvw*RZugnJYI4+Huvt4Kuq#GY^%WUF6x-K-PKVKETxqP* zljK_o{+SyOm6#`WVr7CNDvrtS zbXRhA_UW0=IqLXxVZ@r|9MIkuIc;eWU<40=^;;J9?_P^>wO&1Ye`5s^CI{jl@Ad6oi%hMG z9yd@_ivie)FQeaH>HEa0K}3a-(f8l3i`D4l-IqqExE z+0WrW6_ENLxH@@%s>^37TwTzs%&}s&E;y-nfMeK;cwwfI8gW{gh0m+v zil5#Yt8n1j-1W7(lI+ebllVUa@o;ONR0|F(n06maa>)p~Y(R>uQ4xN>f>Y zVU)lw-LFnx&h5PxN6hx8+&*>Mq2;TsO}k)ZOzn-c?R)N*lxcY&cx23E4)gl1V&^x7?3M@JIHbJSE+md^PD zS~|E?Nu#^hfYRfZbRV_$Hz~+@_L9l>^+~J%6&ab)c8x>h7p@1NI3bAeZteIvVzEi! zvuFcTQpE3ysA8pJxyOt3)6MSgyu7@~VtbAZpaUOM+FJj(6q>rWHZC3>ulaNiRH4)5 zMrSl0_csG!LhMhqCtUIJ9-m6r7WhpE9bN$;WLQ{OYild8XftIE>N6ZU1HN46+|DJw zR%F0;%*+WxyGcn&BdO6pfBtN1^Gu=B`KPDr?+PHzFj7^Sko!Mrq>&dGW>HZQ5c~i- zd7uyxV=I!&6T{zwZ6HZqBpYE1v$FsZ&&A}EA<`0CGf5iX(=Q%G0}DoAzILPA}$5r^d z|FEqON96yfW(q)`8mDY1SZ@GLzz*SO8`YD!a-nR&Oa^$bw>HMA^4KmL!Q^|#MLm>B zQg;GgYNM7jlJ&JhE1pC8V!(Hpqm-xjokecx7y0g@Dpw}|Q4V*RQ)V`i6($l4JUrSt z6cm(YD*TsoDgJ+G57;ER6XDLCo<<)#+{)wyc3J@@ItK+_RcbH2qt00UCSphX7z~cr zO^4n0Zi>0(iVR+)nyJ!5R}s{r%w5GXZ9CZZ0A+lB7xL|58oC zp}2qgnPVbV^8cltN=`XR%2Sh8yqtQay*bje((LTAv8bf{ZpT16*ya06vBSP^*wZKr zM$^>9z}X!o9zW5IJ(4AAQs;T9Q-H$|JF;LNEx`;r%m0aM&8vwgxGO-R)T#Q z&RWb+kdqFYi{%p~)T|2(HgTGjioloSIGCM+xVqVE{{CX^-S(=3-%PXXE9fw@p#NNL zy4@j};JfTLAG)48rL!l!+0?L*NIv%KKUyf}`^CwuCWV6khp@i@iev5CM&Tv|Nbm%A z3+^5uxCM82cXx*n2oAyB-JReN+#Q0uyE~lD-p}*>?_ckC>QGZfF*Q9icXQA5wbr@> zg%?ZV?DCe|{psWA*k2t~dwY9qBDF~*t6>y`?kvO5FB)rO^Wrcy!%r=oj@0X`?eT=i z!F(^&VUPr!QI(nFu|rCa;cJ&bx5tw@~$GYI%(a$fn*W{W;#;!Hd;C!oa<${-xQA>h7Yfe8RCaEb>}nGnDU+823>@ zqUvJP6zYG8osyf`{zZw{*h$G)DI@z#5M z;A=QN_fBF}tYyL;b)INN^dTp`nAcu2=h117PwfY<#YuIAbefWYBnXX)-SD;6?s8bD z8hr%>tY{tPUWS2$ozqiZH-o}mM;%go|GDhkakbCw7lPRM6`d0X1vCqx}UajaF{hLOgZkHy7d5{Wn&|~@#E!zS#}9; zzfben8o{`$A;9^bg(A20g!`-F#b&oAfE-&8Fy;dCs_PjKopfut*&m5M%+L2+Uu6j| zigGN@)8FjRP#+Gg3f-mPl{~pGB&IBIsHqB-;fBMB3!jhSYczBfMdsN>LU~z*wlBRn zdY3iV#gzrS{mGv2RpEJ8M9uY9fRk5C;Qv#h)i0_fK3US$O19L$37v-llZSEY`uG8O zLrmaa{@7Y~uoyp^Jfg4WACXEZr=-~%23|)$6~hJ>N5{mFkZL-kM;^88wpX0YJ)v>Y z5Kq<3t26JUo;{E#f2(1u*nU(wdMO^!{e@8bx`Rll$HhsVLcy}*zu@cN%%*d|S>M_V zK#r;Ga2*U%|2q-otp>e|=1EEcD+LeW&)ROg@aL297!#xw9>i`H?a!adPR$LNA|BS|a!#~bMswmf|k~XSu=B`FhpzJ4?@qd}6(hwXj ziBFdtD9Y=QVxQL-DL{056F&Y*{_hS_NPnss#27iwaB7Nt^@${~kP{OYSXW6sz;HDV z)|vw;{5)MtT?FlWrGo&#gSf*D69{F+UVXHGw83fo^l9~dIp~`qZ){<7d1w8-DL%qA z`G-up$A|mV*9Zdg-co7n6^DFxpyRoqB3~x`=5B)RUy6hgQ}K7{8z4o5Zu=a9 z&)xa2hda%o3?VItRi*HVXmsnb2d~>%u1ID{!(qI?hOB>ZjyO>gg{&kh#q8rQ*L5oo z@e$_GaMFK)Wp%D>^o!ZvutJSMHeFK5PsVo~UQb6oDb*Ohd1m98N67Cu1hSo@Erh4z zuaA+eM=~tcoUWZvE>NQ2eaP|DP?28eL5nL64~yu3r)r+Bf28CX&|^(dTOK8591%p~ zpTdY5V`<-JwR=NjDWIIm+rYdcVd5E$HT=+fY^oj#f*p-)wfJ&N59Sn!NARANoL9hL zCO-hk?Kbft^FUeW3OEm=O`0u8Tc~b(?wpHg>96~^^AH|Rso3m5x2HJ1aCue7eFSMK zWi@<^-fVd|RMGruxFlRNM^B!LtMbC*+K)L0_mowGlWe0kAJDxs(w;1D)(+>2-If|kM$~__GYb#w8_zE$6 z{n&weu&B|^(A4Ywh7(z*b}X}lriCJ9+2=2tLdU=JqsVJbyf~RJMYZX7hwkyXSvVOA zVNoY#(RLb%!X0fdP@YFvLyf$i?t-;WSGq+iv|EMNX{VY~g>swuq9LwmQQi=tIP8q= z!k)=!^6ZZ-EwFX(%{u!i8|COm4QCygX9k=H3)EB(4EodgZ|Bxbr@`ia;=rywh z%^v0|^}=O!wR|UjCmwE>YzIcF(XY1@0A$j?oLHIsfD6fJmpq!85i7`ZWs>J=h1^n>pp^h1wxbQZB;3jc_fpeASu!6$ojA8mrc%$6pl zaz1XDw+c)0+YL&FUCpdewuodpk@(a=MnwvzEWabaB(c);b(8@eOU~{b{(Y-jyn|0` zV-u|4yl~F)T>q+uJsPWG&hOiY$P#Oef9Z3W;UCXA^U6b@d?&*ehr*^6ld$ozOT#=C z%?p&Z@2)ai>k$>QAYBVU)Nh&@jBMk zd1)D$BKkN;nW>$MEGrol7cnmMkZvQfvMVT!@0>x26esTl?u@uEdKEN~1b=n$`!r$m z!OnC>Y_wM8w1$bEBs>_LKYq6;f!ZGL6#30yF>Cw74fnR4IV9BWp6B%P(uPL zbL|%#H7x>mBWgcytHvQx;=QOScD7HYDU)qQU%O`kIZop9t1HJ8hT%>7)jBa!C@uy2 zFA=eI9kBO^;SX9bo91UH7xFw60y!SMlxWRYkr>Vs0~|}1Gp&&{c*^$7E3=88&hWn& zw|BNA1oR-mhOkph-#8UJ9A)KI6qv5rdVW*bi8(iNQwh%7c$bTsSx?ZUzMyT7l{~Pj zsh~a!;SaNA@8FMUgT2l{n~;K2={`#@0cqdZ$QaBx;{NK@4laIr`%MvDyKwhJPkR%) zH6{JqY^#q?bKW?@?if(TMT;kBKj~qTXFY#V(7w2>rOBv7me%PhKVNuWVE_nTX?!5m$_-l}qXon59O(lq-Z*BiH!we1ceBN4U@Xs&-RWsTPb)afy zvLHs#ndZy+n!{|LYVf^0qbt74bA-dMtP<#wXG0BAf!8-IZpknppDup9`0RbV8qu1Iw?^ccX~n^x6rEg)^^nPuC>C?p)9rPg&4t z?(O)`%!?+);1ni*c%_v-`EpwI8M%3Ru_}vZy5@M8E!0b)bK#AoySlGx!bJ+r;=4xi zX{;KS&n${L-tB*v*qGi&OC8)^y(Hq^lYFQmv!CRmDE6fODSf)n5iyOQeX{TfNe#R3 z4WGWdoR%66BV`4fhQs8|cHA}=RIe&cgsbC=&m^2|1wm8O;JD<=PV!{+0p-Cy<-zl5 zMyLh`{fxn(X1F)U+=!rz96eE+Tl<*RM;pl>rji8_ew6|Sm zda#0ND~+)WnF^I!7>LCY<<>_RBh z8qh{e&I?0@4h_=mE4f2|s-4U{DF6GxQ~;x=2%t-x4`Y;4-O27`O0rJ&dy0xu6-hRW zoeVW9T{wcjI{GOltPNzR(9={0(Y`5A?)pp0WqB0RlkG7K)Z9Y>El)U0 zrCd&=7gefi?|vI;$x~p0x)>eqPxmvQG-@IScjz!~!Gfye-sG0X+z)N?bNIva%OuV8qH^M)ymkmhmEdj(R|a_YOX$HMSF{L&tP_03%{dA?3jI2;Trm|meixuvNQ zZ21=8E0=Uoj^Fn&Ka%Y&pr)=IQlFq2Xwulbxg;3S7zm%LkpHE;=xKzA-hKp1-T%EG zuqBK*LB@Xw4LX{Fn>e<1{8Z4}w;^YCml)R1G)WSlTaE51woX57{LOP;-Jb>P=x(Iv6=Uo7`~91BuY^Mny7@&3WT8?-DV3%eOPp|n zJWBW-LpCEdOhywd`?3DdPE?=cO2lWkp(r;n#y*%!q6d@;7rezR-fHFkL^^e9=lUr$ zB?}rYU;E~S%hX!W!qiax(PXM-?7aPz|4k&w0JfTEHH>NgUXsOjczsLWL#?^~qw9y| zqKnCdDr&VqEVH?Yi+ z84m?l-duOA!JVe$wk9vt?SaMs?+Zks9OVxNbBD+E$~2gEe#ZmdCti)y*`=N(9wS=y6CxRMHRrKJZqc69+l@b9+T91Y57rFDY^*D6|n#n?p6p zyTKx#QnY<@$DI(5D!DP~!NejO#7Lp^+`*9a{yjzM_}`@q*DF+c;Cl}0Sg>wCNY((QIFdU;K)0sg#%Fx*9n7J@`Em)ai3w;oibpxt zIm0<^4Z+!W39k1axl6@vd(;+Jb+okCdHP!1qleWP>=d=w#G0tb+@VXEn$hE!haS$N zUfYI*agdJR`YsXU1BH}KLZUOM`;EfapM`2~lQCnpTlOV>W{$h9QfTb|#MwIgx+Ml1 zb8l}*Iov`Tvs8!r$MA?<=JAo^Y2kzU@N=8zi|W;FPmL&R#H>axNZAY&$!{1V_zhD3ln(w zgY?!{sRWXk*apJ4dH1a#$rR`|KBQPoR}WG@L!HM0Q&m`NtvDWH|D_mtBX;5TH8p=& z95YxAYTEjhiHeoZCV+6Oeckj-9ChL=*()S;#Uv|V?eu=-^W|#8l9;tW*rU}0IW96U z4d?iS$-!hTHw)O+&>zu^1-VOSwohfURX)cru&?lv$|r#TR5P-nO_#-Xsz4`h+5T!wMZ06vPiyu5iSYXeDo=-O#m|d*yV1K0(5=}+Mk|B3KAwY|wOr#C-_DE_RB1g9(I^|Sl@JE z&(o@TZMENRv9_l%9C9pr^v*U_BZ~$<`P_^$mj~yCc9~2G3Y;qO37JhEg@k;g5SK%x z4v{}vwm4O3y;! zW@fG=UXhmxhD?L#$gT$uyhS!ADf$FwJo13RWsgQZZ$1qV>QF?w*;%>E2QjbXk~9ea zBTHJE<|fre&?JOVN})e=etn{6wDdZ$-Z=>gi6nC7FE41GJ*HTv({5>XbLP#k;lMCTNZZuK_(dRP)>3=c}L$|P+%;5$VIGDg(8VDHHC^Qk?5CvD5o&@6{w z3Yh#fD+!lrj`m4_#=CVni-jJQeu!d#vr5m=#^}`|IRw*W{A^GTID1YPS6IL= z40ry~mS!vFA|@op5tGRetsgKlxOtwh1`x{^TP9*4bbWtZ`rr0o*<=rV-5pC~w^|(% zNPq-}-n>!Se0JgW^gNx(F|nrZLrjC{W^Y})rhXnCfmf!%$9i<#4Th{K8OmlWZCBiK zV!V>OLR3-Nt*lpoBq8YT=2mrloVXHQ*!8c6;9F=;d@pdhg@hXuR8` zWyk69o1o3RC#h0zy0#4MfG9gyjvS);^g#u;?}wXX5@rmWSEnH;%S8_r8+-7pkW~q& zjveCCrip7Ip%Ie^!ne_mCi~##RaI*Vn^3(gF5@XJV1^(-v(ej^?(&NTJbCVC9|k&IFh%Dj^VuQmqv#U!%Q5?oC_pj5r3BEAujlQ7f^A&#Uw@#9jE}? z44asB9^>zzo*P->v!W*sVuq#Gk-i<~`h7zCl5AFJGH2|Q^ca1hkCu%ZSD@gC8EfSrn&uN99rL6eDPeIsd1}dU zUyh2z<1#R00RV=iZ5;S%n6<-mLBd9Ix-z=AefPt639M4$Dha|?bc;5w^eAj-0E6$m z7VF~R6hvkyvBT4z_FVQVz=tT6;D@2nra^_CPbJ4_BgL`rBKp?#YA!m*pt8H9>oIlm zC=7nfJDDLDn9sjE*M!n=%ZvDNxvK@gs1pf6?M8?mn)K^V$BP36Ix0O5zLsgmJ`u-A z@8EG6T~K^Hrj!VbfBm9hZC0>s!?Ptm8v)O8PqZhdEcok|z>CCugV8Ag)&qDVMX7O;WikaJ)yQPFYn)LDoad?r$uIe92V4DR!gH*>Y?VKe(T|86^qESQL-7Duj(^cIi!Qm^o*w5cKKGS*ov{c6 ziv+j5>Td0I#EWmEK#ILNpB;h2ZEi>ynRf7P7z@(VhWrAN8AwB=bDTRcwS|WIqS1&8 zEG@y@J%-<$*^_Bt)n3Y(^LI8ByjuX$5FJi$C2Y*qZ z!UlZP!>m^C>TAmzNH0{ea@@k+*`A0B@Wy#~a6ero|3pU0&dyfNz#i%Isx2z&YUF4B zUoJq(m+PBlE;t7V;H#Jz_!2TI4aN-*$CXawrTYd;UIlhWD}uJu*8y+z%&b33dyI(>DK-@F8CyiLgI?$)*RIy$NNA2KbU`8ZrE2$& z!KRF;R;7HNzU{+ZmcnjVzXBYm8Qr_v&CouY#+#;s(;Qs@mV@cHaACOOB07jW|fp>YsiA-5xRh^Aekyf`7VV^&)PtY00;{Y1J*YC zB7yPz@a3U|irj*9ZjXula6G_MT=K0iI_*K_S3SPd`W)iyK4~0UoIeYSDs@U@Bo_H= z*|=2+?tlS5hCmJs!V!J2O?J_gx9qs5j@&s8fDFfMuT4wT zji!QA9arbJFVmhPd@M${v*8PaZ79o#3@1-4b41#8A1nhGKG|WwAL@y|vbx|_m3n5tSQA&>)1UIg^vWjY7^hNq zW-GwMd454H<@B?2X&{Yxu$n`-^Jc`a&tr!@+p7te)As4WZ8^|U;<*Qb1QvPu`t)t9$+ME8_gHdV+;W~pq%kz~x?V!bW4y$v zcd*!ii;ZY;Nl6xy5DUc1k%#g;fAJo5bxkL@i*L~OJ(R)H@lK<+R0?o%VioPP{_x=^ zs}0;zMFq8e322{*#i@&VPamk4yO}FrRJ~pemynxjFZe|GHRHOW+VNa~xki~)h=H9w zh4+*|Q5HPlx+2#kuKaDhKwxGT)thjz$)m2GOoZVt$3ckP?(>JL`J-wRbm9dXi>@%? zKhdpDHx;=sq&~VNctgY)A$;k7#UlqCmSsri-&TS zY}6Se5jTl24LYRnk$XE;q}aK^1!kWeddz_S!1{N^qYWHZ_>B})YvZ2~gy%e|lOHng_pyrF%Lc4kpsl*oue%Cvi>b_wX-5vvm#^se zIp)>KMx@kel&v;U-geS&^!4^2zg-#bK%QZIn|<^7cF*736lKjo|66fLvf9u?%i_Z# z{6Y}7g}J)<5c?r;XfcFI` zsOXHVRPXQat8uCo$N9>2_n)3TwX~L7T09jyk%Ksi%zWh#thO@AZY$18-}*^}6V=5G zzqXBDB)mSd!t;fN{*zHVNq^xQFs8#JBmVFS&6x#C9yA#dTP46BbkCXgM$g|aBWuW z{f~y+E{MRMh7)#8HueIl``5yOXOO<~83IUF$Bs@%;kYI|mJlPSZA+{9DlPVjoPF&u zkY->Y7+~mdAWRztL!f1CU-WIo#qEDM;~BAIqlNx+YCw-?1S?Jh<>@UpyRi@yc|l|E z0UAomG7A`SWzG`V`U3w5xSv$mO0|{8W?PGIBl!R$;r;v zhoqb=Ej@}zYv%TLRZ&yJsv`-?*i*wXKoDlBBExW-T~JopKN2(+$>$?1m4FeaVPy`~ zn}|G_z=8)rmn_0?!N4!>519tdqmv0YyoXNi{QRA19=E$s%s#g(X~##FhwGZ5@?A0! zTHXv*3_4+p_LyD6Gmp6MANK=jkl)di9#Q>JD4KS$(ax%emMbY~fln#WFQ9VX@kVa&HLQ)B9Dj92grS1m_lD zv<%Q9VCfn4=0o__e4KLQV;(4buVC}UY}_?cYRPC7M&vcz>125=4Xo|(=oXgfsrNtD z+~=bkxx6g0$>ls#0LWY1i<`{%ve|_QFe#j?t@hfm(-o(}{}gIQEr|vYG0xrRlzftP zN(b#G?BP}+$@oI7N_C7gvO*{p_CHO)JyqP|lUtr80^@%h|e@xVX5PnN$hnv=a-5JD$JE z+X#($xs~zoqCG;ix0>k4t}0otFFzm_;19aJ*a;BR?6w~8I`)9d^J>Dor5-iO!O=>L zocw#O@EeFsNdj)}9_OX9P!fCLUlp$x>dIASJTV_7MKqr>bg&@0@~zxh+%KA9^a}U+ z6>mFO;;}g!c z7St)#)zwEwmH-VcHz_qW7dyQQA;tE&tH?-lQeCmxyRThq0(!I20)F(}?0qG{3)zF?7X?E(v$A8OBJLYaFZD=E&1 z$P0duDjg6`zy84~`xe6dpjg$76?%Tt2C@C+@+b)tV1Or~9Wkyc_K=azlNV!ty+ew( zS#I9twmo~iJ^xHJIy539C9!#aDIqS-03Q>xSy)(D%fJ}!ZEKTRU}7cDtS={MoY)2L zknZ}jQJL$_{6*R#jZ$g6kKrJeM{o#%MqYBHPmI27^yd}IJPSM!@-}-~vaRKfs0{x{ z>+%Zul+u`*5KPIypCN`ORu0_4psNv;JS$%~QuZKvquum>x0DHtxOw~0Fz$YvTHOKP zz|$|-E{2#L+8AD+VoNisIP*-KPg-Oz{uq)4QzSMkpz0`xAqgHmrswBoVNtO{ks{&` zxYd_GB{%&FRZ``F^bPwf-YMIEDyY%U;C^zM;T|t|CX`qcuASTJK?G#I1BBHE>h94+ zwR9+u<9Eoa6q6zNybm;(D5tLoi*w}u&%4rrDfSfCkrE6zV$)ltQ|a;P18+j>wv-k)K%6;d z^(fJl%??JQ3jkIuaVjk5m4@sn%(Gs8vo%)zpQX*=qTC}v%&Rpz9q`#TYJyQ>hD-xq zG-4CP^R#uD(fuFNq<7C7sDnfGoMfT<*!$=pm9 zBpw2=raDfX5pdh!tW87yq&jSwXUTZ6L!|Ch0>$8K^K*#h@#v}g; zs^~P|b3jBLxNEv^kAm3C$!?Lpv92_9i$)S)vl$v{^V5B`;hzk61H6HRZ*$H!^iVeJ zKm0Wp02P3UsI|SlZIJ{j-z!G9P2j@9 zLbm=Z8ZMXJT_j6m_(W#7yNh73{Rh5f@B_ww<|gdscE3B8QSsaWf|KOr95gb2Uz{an zIvkR`M0Tt;fQSmsr<<9T=O=apbTSZPNBhcGtT@w zGv(#NLDU8He~v#I(;8!ux{9oz1-3>ttRk}_VV~@O0IH$E zY}jyE>Jd$iay$)sNqi(!dk_K2BdqWE%tV~@*R8FcGdE8OheOUh6dVjeWLIWLLB&<% zpoPspb>zia;j#2dSYSrrPT_#nLOScVLv(70^-fWKsI@K`DnSA#Vc+LqR2k|s$4Xsg=WeO zvAY|Rh)wVjph5@=Dj*BeHQ7>mD>tp!9>wY__&doi&Lo`O#p7#P(3 z)V0=DIVCwNSq7xs9X%Vj=cgr-FaViUYLm+<9q_IdeX^ng2GB%k9@b?52pM!erJW-z zIeBj*($kXm8A(1LAD8VGkYQjL7Gc&;Sk5cVHPHvk$(D(*AdJ4vuxw#P4OdH1jS2l? zp@c^PI@VIfB`3w*Q|$yK7h}f^puT%6+#@`JbfTtSTVGpAd~A0xYn78vG^gNzc z3Zjdl1Mo-6_z13(`4ZO60Fn&%OA8WUz1&2E42ucR354OJ$*QV;&678py8n6T<6&_4 z!{dkDIeUBMEYo3DsfFJ9=lsu)T?q~Bysd4~wl+4m!9<11B+1ZweH7Qd@BQ0wpt{m@J0^y70U};^co$(=oUY#9#(<-9o`q$=PovW32OZ2KxYc7FNsHNP}Jw?P^kM|&(NY`z}arJ(b(+b@t zw@OOR!PiulCHubst&XK8cM}Ym>BoY!CvC_RwxEi8*x0Utb&##zal5_I+IGw}Mvs4Q zvjh(VaQgF0yDa^}I+^YY;5T`aXJ)TC!SnJ=&d*{^$;s4T(CBK($Yf|`(~)d+$dy^^ zMMpuT;W9Mq&Elp&E&qeDixK~4^%AUqz9A>*DsoJp5Sk0-lxO+0npm0t#fnPOQft*a zKX1GS2M32oXf{{6XLWZfVqO5>p6-@tDNzd4l{OqP>8s|(8}fG>7c+2x?W1+Bfr<&V z|2fJ?*lsICAlZ21Rv(=|x>r*@3+02Fx3#ezzh7WrNM0*R%**n&#ND*;BHpvHb(*E9 z_et6C0rz6MCy88dCsf7o*+~6boho z(GhJYjw;34LKo&p1Pq9r=!q5&Q_?_VEwn#>5(4N}4hmL`!Nk9AHD1y!D~2({0phV0 z=^geLteSOW<@!Xn-YA}(HO_i>a=^8Yd2Kb5ydvPjeLA~H`dEwosFV)*Jb^Dy9!KuK z6`i_crY$azYf){~=*p2;8w2)SE5ge)3rE+n5g+ue&ND9hGJp_~Gd-Cx)0_jn+fP1RW)~ZS-xH#G$NM!_nYDfga``A(CW)ex8WZ0EOAg3!$~Zo0<$_) zoDP(Zh$-R#4c5$Uxxni)5@apbbnv4!4=(3s|23D{xed&5(7YY>G{J=yOX34rie zOLCj9TW4GCKd0q3a=hPrfxiu!+~>1!mTaL;qw_Ot+GydKXz$O1Pqn6clfP>Nvh;Q)GDx6Nd*K-zD{J7ChzOB7G`RgF zQ)^S70G&3;|8qX4dFC0kn-KE+(X_`*2{3f4OU?hL+d8mfTKdl@p&DfsH&Pm2eaE6Z zyPBesyz+6=)A(r!gM&p2THEs8x=1y#Sg5CkbsNYW{GTTQBV5g5!Y}$>E*5oCI*ueE zHa6<#K;&C~0Qs%1Y91(n^D7B${`!en0TQs6Fjc{D0h?lJz|Z_k60(AcBuBD>op-BJ z-^)s&fF2IY%wpwrMSJBB{sRp1Ki`Qb9#X#H1EcMWApqaD=ufFbnU$)JO6c2%qUKe6 zpQLh=l2ecDw53Pn}8v=haNBYLd3)pBqAG_xpLHf(du z5PmaNnym66XrZ+IN3YU<>Zm$4WAvf;U$skM%A%vN+IAX$KO}mnmLMl+gTm5ybeh(# z*8N!1Tj~fMPO0MX{gh1Ky0~w`%!_$zuP})Xttk=L$t#ObH94hQ-V7SJF9OHaCDyV9 zp~DhxaBD=|JN1X!L~lg9f?)3g`qNk#hn%Z}iZ!lfoaNEL90CY{qTfFzd0`AE)cuI8@t7ftd%tV7o zyg7ZC@xzZFCQ{BZ9^X=jg(K)WT1+xHINaFJS}5NA$*SEm&f*H{Y0oJ$+m~ zhReh27)7fwMS1dja`%0ngyy4i(D;IoLcw!p=6&1Ct5yC$Qg8s)y^TweDh(GqAEPNnD(gp)P_!3nu09sKJ@&sNdxn(<(MfFZvs(w*@pZr( zPbgS^l@%rgjyz-IlB1msQKxOgOy5K`m-{pX*4Nj@L0{ZIJiSBmx1ZY$;r8d!L#3B1;Nb3^!5$EnVA{w6c`f> zmRe+FWWBw;bxHaC1254T2?|6EhQTw5jgJz{>2r>q>h&|M0P!!zW0z+M+>QTz_@<=}h7Z1HN)UJmF8kNJP z3&4b@r=V~~STqbcHT8N{skGn#%zzMc*6e|`wY70o^Z&NoVBOr@*ivYz5mdMNjcO)L zS=25Wk|d3cwy`%<*cw^V2pYX(qi z?aB+wZM*7{oxc-j;{PG2J$#M1&ty!;ZxG^K#ZQP2%72p`9OL@pwI_s z-aoH`2{A!|B0muEK#iXFtILP>!5T6sfF{H4d2?71rF`cxhu& zI69Ht_mnDhP_76L2QwpCyI%{miC(k=2xOuQ)S>AV>RdiWdi8}he{`36C^KW;aok(l zJlT$!jB1gg=W;w*-`i5ZZ+6NP&<5p|H??L{JL6e`?VJf72DH!?w!c`4IeyrU4ykHB zoG)Jf(s2=l@6v8@o%khQL8!O-a-$xv8HgLFPd)Z!T$-BQnbvL4TDa0VvQr7&9#kqa z!ozV?Dq}}uxxjTX&?RWxH;0dAa*VN$GAqj)$);58H>WMK;f=X#jB&g5yr%Bbmm{a+ zIkft$t#|usadrJx)@n@V_OjAakoIw%wfYn9aGW5`;X}G*++7-))!^kqw?r-%n6#{1 zRwG@914D&X-)39nspx(_iALHrI~mF9^H(=#E^;}m{zcqp6lK^wWA|~%ap%m2jkvMi zYlpT;BB!~iyHcvjIL5g#b^a_Vff(6FW?M`1&bFVJ(apIa##(37yunD8{jkYqm1n=t z>+z;2#U;+W^u8HkK6C%})nr<4KV>^I`$Bxo5WT<(&W1C6rl56!%E8D3u~pzMpPL*H z`o7d@f?023c-z!(%Vvf@y_~N{-NE#*$<+GU2GdQQGpG5eJ?8v< zQ3*S=%OSJR)0NiNJP)FBq=H!^ferxpVQ9g&9`9?nnPnVVR*n_=I*7&}<1#MHc-=eB zdC!lHMXg(>uS62?#yOrd)o?nVbZ%Z!?*=3oEorjg))~F~PUG(G{^7%iEjw{>*g!q7 zt|NJ#_FG<6FHbquF70V>6OAqnRn0O!o+H7* z-8HR&F_?G7r7BARj?F3z(PV%o(gA5Iw;)9RBti?{PIvBiuX6U?nr}}z^BlL@$y)ZX zVwPSS8YaeaNi=KS$cz z++&lP5+0Q$$pQ}};o#X;*sXBNXxjVzZfX|Soy+avLV3`qo2~t{K;XNo?XA&9DO*Lt zm4jD5y@R6R+b1r8yz6mJcvW7qmQk9dlckqt#)M&d-hIUC@ z6a~2HO5zu)j~knYJi!pfD^FWr$B*XdrDc*?2Il4x;FG53wwt1DOlQA%k&ReL^^ef` z6R((%^|kEXo#w1{Ya&@SYJRXgk(h|o)OcupO{(1|y_QiB3BznS4x>z1=?639=<&UF zZ18s;mJ{RPz>zb>pGrn=kK1F7+Me@=B0*e@h6u7jjbbsq&fv)(GWstDaw^cPF8D{N zk4ENQEEGgkjh^h*%~Sp#l9$drI|0_&>M1xDt}&~@^g3S^s*d3B&UrYbjEs_DRp*zP zH8Ezov^o=u#95|*ux}rMak;oX@}+h=gE1eA{>`orb=Vgku2))n9=2D8D?Jh_U%1KM zyekRiFz3VIhK2&5YnkWM$oofz=J?GHj+uFK%T>E1ahsjxzYa&xr95XH+bwkvOCP|(qU-rH)mM72p>gya|%MPjmiOBwDvCWlC9kFD}WCqmB;s!Su3nvQ;r$aXES;wE^@`x+FlH6zN@`qyaxB+Z6@TikE zqZO-hUzXU0%}#2Vt0vOw{s6ME_NzXfJzX#_7GZgVN>ebvOM=W+Uxc=x|KvRcIUUa? zoJEp=hkLd#RJW30;s%ox z4Jmi`D~%>sKfQ~*9+QQRZh`LqJV6^ z-k_#CVyLo|hw3#U6$8V#$=9*;mCq&mjRD;Rsv*}Fy`|rS zkT3lxpa6kk@@`M2KSmvA{mdp%_Y-_U+S;n;q#1h4c^YZuthzTFWqqfuOT2Aix8FNL zh4KjQicE^bhUKT%e2N66Vt2h9uBW9BnVK=KpZpn!pla z&4{MEpB_^)tJTz8TSiEqii{D9)=KmBkE)U3ygsI*%&G$tGG^o1?}80ZCbx&Y)@v88o98pzbq<@;L&HV?oIAA^hp9n0 z+Apj#&Dd_d4GV+_1Yb-ZmqyGMXyR2GMge3er#}80L^nJiR{`oGcffJ~7BM|s^SAFE%EK;_PO3L{SV(-Grw=d3d>N)(xb!~8T(|(QY_=*GXG6*g~M6) zazns&e;8IX)cFSqU*CGnG67LeC7KYh0TRI*s zrv7Bv#@q6|vYBclxMgEbFv*ddwl)5+&P(LJyEVM|{J>~n%S)Ph)VSU2>DcWXGREsS z{X*h-qcj%0YmPz)f$8+1pm(KI8yg3e^ox-}X{_e3E2s0zA~k3~I_@#ftIpA^QMa0zs7}m)>4t-Py6FtrKO- z0v1F6=2wBMWp(~?UG-f1~3X*IZPVnypd=Gno#6W zZcFX#Y-nhP-?eN>c@{USU0y)URz$}?&N`j1LPz5K8LNtHHaL|~Xc5-gwiPpK=#*|v zYrf^$+f+-wL5acbnnY`dMFlRI5=g9wdadF$4*OPi>u?l6RQ*gI0n<$M7?} z9}HpUtXB3eyqMX(qdo?vHu+fa?`mNzdo{!v_ds@3`*zH@zAhsXta@DUB`pqC37P!l%3b!*aImZgWAx z1OwnJdg=98G-#JJxP#jp$7nn`JJs83yju-Xqro;ee)Sm-myBzQg6`R|v$>HpVZewA zX>u)h^_QyF?C)=)TwE51mD^YIN6*~XxjC%|Ta(zBcTpWZUMA&UwY3sRr1`Mn8+pCn zjk9{+$2yXStX6w{p~@6d_iMA%mwtZ_Jw?28QZy`LD(nladn52EyxvQ$y@>YM37*Wu zqR41TjeMl;Gl_kDQ8BEBR}`lxwsx9;rdHOQN{Ws={VB;f_nXSFut$NwxgADb%G=UR zjXC6_$Eh!emnIeN9PU>KCpV1#>;oo}75I>$JsbS3k4U#SB}MH-=u2Kne*!Pv#dzmd zmeb~3uSUH7pSI3AsI72Y`=Kq+Qmld(DHPWt!AYSM3Pp+pcXx_=C{P@V6)Oaa1PSgE zylAkZf#Me2-EYo0_nhy3ckZ67zq0q9+4E-4QMndzA|veiS+raPL4%M0COa>H!!-M#zQJuyC0Q?7M3a~|D; zG*wEXTHA3;kl#M3<%NJ)N?NKrCd+eQS~rmop_0=;kMT=OR^h(=KC71Z`X{L`0punn zd3MHR&Zq7g%V{ek;gbEn(OT-H*k_O2{nLk|{4cYmDh2F#boBB5cl$D~S1dby<#-k~ zs~T4CrUm7)jtfMTrrf^Gud7S8qhIk6Ra_zv zOK)F)dUP|t)~$OAFHI!h+NhYbLRLMvYxcd9_oDSDBid}hW|qIr=rqgC+-h3?dAt}5 zSPs$9$TZ0SDWDap=IfAoO?l2UCqriz@;27m*{Ed*G~`Om(Vwg6!cHd6pIl(;B;e?| zkOBYcT2A$=8JdCN~l{_}6>E9STgZ%+u6=iP3Q61iPL=1(UK2qEk3c#v zUn5K~^Ki_3i$zgqEKccW2?`vC1!z{+I?nfjM*A{}3%D%5a~71CrZLz`W4?CqYijb3 z6Hg`tG$*Fc@xvi{FHC7O{SVhV@~n06Bd`*@y?>uDoJ*KP!Wf5ujn}sG9j7oCiSFLqr90-$Dh8 zuDm(vr+)H_{P%qaUpI4bH@>g{d_ro`TJ91~B0to_5S6w`tZChOZCwox9?nx0MEj_f zJf)q#4&1|bgXUi*yf+kgfj$Z`SK>GXJuRTi^J3*piMqON9Kdj9>xQ`Rk;h8Ed_Pv3 z4fi%ps6bA(A;LRllHvSEx`{}T!>>2fkyGlr8Tc5OO7dgQ%H%TYLALNaf8{!Gf-H^# zyXP&-Rn^BT56z;VRaWb0VNc&n%A)%`g*ewY?BPA)AL|WamR$gh-WdUB3Hp`C2mOQz8rG2sj$H*7050Bm4FWX0&4Lbh_@~CxgzvBGa}bld3c%FnqEC4 z>Jv3rv$ed9Wg)+C5%Y%v(Y;SJ_&bt?vZ<0jXHsTVO~wXXoamFR(`&}3yY1^wRz0HW!M0*u?7VruYR#LREN~MJ(WEz@=OoWAc53{IIG>VJ^r1G?0d^U6~7xt zlA_)c#g-l(H4GeCX3CX=JhC$X#X(SKlb0T=!2%9T2uZ+mN^)yuWxjt>HEGv|MRWWu zQk>adev{91|I}OTpUYxDu!UaTMX&n3-r2ja-FJ7PbUnYkCU~0EDD1_|JUPyK;bh(5 zm?;e9HBO~7j5jsz#s$QxO(e1*s0j$@@3ZL%-S^C%0;mV8dHm9FpBX1hN$FoTRJJm6 z=F8`6Ia!T@tZ$Io>U=Jc*>fg|JAAQr2ZvVsc&Kv*z^ za9I-ZGFxeAN%7z(f1MBCCvw}AeRWc*gW5jTtJ^iH<^rZJUy`h9-Z@`{qZ-dLL_GaA z>@-cMzs#=-a?aLP4t0W97n_Ig%S~=U3v=^&DrK-=(rwByw+?wne+RK)f$~Be>Q#d{RQ!fYzt!+~dvNNGBBsZ8e;3C1{`Vct?GTMPDP+F};dARBr!5@GmJ?@?AP>Vxdd|1kA@_H4 zFPOg@)Vsdr-IB>Cgr1%f5K;?kX<+_j-@ME*`iG7Rlp>T{Q<7YBTkg{IRUG#|F{6e; zaIBpoDe-8 z!EK=@yx2i!T9b!;0_o4+`e_SZYczK2-)dYnB$0^Y0wm{a;sM z(_|Hk$4T1rGEhH`G{K*nFYwwbo0;#m{V(T_&H@8j^nU2ZQ~O%ho=)FWm&i7N(QW9U z4~3Rk2bTB8F%bRH9v^ZFh}Bq2_Q^58bD+=Z+~m@)DHNPftXVem{GoyTB4c1+fu$^2 zMHB+--LB*Mf3Mwi<6M&)!bcDnQ15lDMAQ?3cbd!qFcDiYhEXzA6RSmw%WaX^g7GDkEHUWGNvDE#{>Axs*eBLwc4$zITSPg zmo)s|j8Lg1y5)mjSmxYm8} z@S_w~s)E5^(#5+E{=m>?p&p-U?>u8pOb=3D2;~3ilet`jHUM1WWF=#FL|qx!N*h1BnsU3dKPJt&Vt*<9#qacrJ7Bw~HO)wCD#PG6m)$ry8?!tKTVsY$ zLszrx#N1${ptASbbe(!T>DTO0r_G6SmFS|4JOnwiS&5qG#B=`VA-yE8T8kQA8K-4a zqgLO@mWl(370ACNV1)s>{?)`GCJ|+*WBVx&yo)a7+aOiE6q5mpZEbze2tXxoUbtX8 zUUJw9AU0_kHli9AMv^#Z>g=Y!V~k1D3SG{3abY6>Bhx&!{uv5PLn11`RHMwy&Bl?| zciZ57xue?WxHKL}dZJ(Q;T^+P8sM!>tn9*9#`)$Q|79?^kly3uBD^mlzp$V{j z^4G0T4S$WdFd`j6T-=t(=V&gIb<;sz`5%MTdquJ3Q;G8KsH-w8XBD@_>z>A_!03tfMhRClWFrO zImOM=K*D?|rCw{M%zdDPQ0E~@lCSP@Zfn?TenTPv6whO>)zDVbniDTAf~c6lLzr0! z{!~^#@lYm*UzvkXi?m@CO?vrG+1|Kb4K9o_lCIKn>!(sTUQ*7ucAlQ zQvLE|T>u+9OCXnA+u)S>?;7u!I1?yO6g@AK8twm9Yq#DJZTRy)7#2a4=vY!$2Z%lh zh&_1GwE}t9TKuE~qls&T&^&DN?Y@xXzk4(qJq1bjq%|0=+3o!eO)?x}9eTE$@Zu;? z#^B-CwhB`sC_dR?0_@rG`~p!637L>P$7NiWk%(#ct3oMM=JI+m0oO`vGr#RpyT^x@ zbT=h0^-!gG6;W7img?{BGrTF5!jqpy>qO9SY6;5^x_@>Hf9!1d>Sxoc9ehgX`*WTN z>+z$fs~XQS+)#X0e{SxI>w4eJS88i3y4|*J4(JGLwN?8NeS$)uc3M4;wV&uG=!i7r zE9EyJc<>M*{RLdFxclpyebJ>G>3YxXQzYy+&>uL!*PaHcnW(8|K151G6xLS;b|&Z` z58*s8=x!GhCXw?1=gc}0a(K1~4K--?4WX2L6u5ebmt45*AWp_YG2;12+}o4(X(8|5 zEEhrd0jk3beG!12mYDryt8OKz<+DH~d#q72Q)@c z*V^mMqdh@zK$bA3yBu>~7{x<};N*YNLgb2c46AF4eE@tc8L(I6PmjZdEL6 zW17)0sJg5{qx`xS)>llPrjX-U?n(u&OYsh}bPt56ZZuKJmeb*<#KBiM8tLw4DsOdK zK1>ch;;gl&sQnUKA8A3-f;6yVs}X@jKZ&AjslU&NJg{&H4-O>x3k_t)U>FxP`m94F|Z% zRR2A4kc!MfW*#MFR_0U?DRlcJE@CcEWMN3-S5aMPaeiID2rS`B`u2zEAx#}AkfuxfQI zerv*>cFMu%8Dbh3M5*L*3O9w*<+zu_4+vjO3Kdk%DE&=fB9=w}C|4g~P~IziElWn0 zT&R{G-{V*|(8F^zIK^RIxuru*xm2ff z0H7C%q=wBd7CW#D}DB?P`EB&|_7*m#k8S$sNU({HTnSg!B9LqU8nqHuR zF%L@`ul7u9f)elPE%_0^R#=#WJq`7R)g>pB(l$P|NAeV6aPS8KXmAU)Kbm-sj!e z-VfxGMp|(UcJ^egk_iqHm3vUA=J5Fp*PJyBhK# zm{VPAo6sPM(zQJhyC`O^Lft$ZdvkTA0;5k|a177nq0)o8Q+c_Mf93MV#{=M7SsuMr zj!jDiyV29m&s}#KQg5)ywqp$EsduN-R8}UqZn|6qfWPcKzM-zs-a1^->T~Amgk?(3 zgcu?@Qcf*w+1_bhg~A!uYDRw3Jq=s%DR3bIGo=M$pOyP+)6MgYfTO=pv-7+X`6>RL z8^ugM+gijG^Z<~7W|QYE>0qFZUn=nt;e7mr+G7uIXy4OfvOZ*tItdA6oG2Jm|5O2I zd)<|b>F{$l0f(bKCkLfUX6s#KqQ_Twd8UAk%&hn7P(5|k*_EfjC zee}h76crIMczq{d63 z|FAN4IPZeRDH_zo!S3?4(m-%PM2*=PPC;cY2etd%TJlNmHyl+*Sf%2`Ccj+vgi+l$23(l%pC$4@{YgJF6%+eRBj){t z%mP&JEGB8jlim8BK=@~+^|0pOL)E&qB=pa{$chXv@v9vJK>4_dhcj)3$36yoU}D^p z%QD%Zs_jK33-wOzKkpMQTC6%VYD9Kx8yT~+^;Om1aP={Pj^H-v#qFW%H_iI#u(8}D zJqIU?(YEPza`rn9mK)@Bx#B-<;Z1b+a39Ce zRVA=8c#P86Ku0m-RK`qNx;`Pn<*B0ZpBhl3F>99b-+6^PI56O7EV6*c169p#;WmDn zx;ZvU%;(nRzI<@^>-Kl|g%gWbiF1}o&nTR83;=k7B_}PZj+;hV$KQ0utG}G}@F5X3 z(cpJ+40#0xXKb}GOPo2*PVNAT{V|fHm|O*%d=X8K(@^Q04Z0SNHds>TehY^uk&p&2WCvbNLN|i z#jU&Ugk*XV&TAkLJ5p5mIQ158T(aAL5sznOvU0I}MFRk2@7yHyRW@j7(6jscGlPsV zPlqArUhri3uL+-2%J#CU5q}{_Q|c!oOFKJ{07FAck(xNC#TIRBMRaFX5e20l=j%Jy z2zCqXt*e1pC8wUhi9Ot)1EPY$dOW^SnxP6V0p7)JG$pQxnION93Hu=s15lxcJ*^=s+%XvSI2WOzU=Ssp*S?HN}2U;3zaw* z2o}{)TeTa{(!i1?)t=v%$6O)1_nQqI8RA=VrRa%Y6K>7;_=^Ll38qA8_^1(Q0r!{+ zF4`y={W+)D=Jy6YhS7aXR`|7PV@3Em58GVHewUP~;p!bFq9~M2Hw&w$NMaE%7^*xo zr3;>BttJ%@se;vFwxcT3>Xe~H0!;NrcL8C?bPPiRW1ojh2k&^#8AmUSjeV3VfKCD- zYAVn`tV-zRo@7@91Wdpdjo$17tv6*e4u+?)jrXY1iI0uOs|D&9hSc6# z#a~3>kxL99>LOjBEfXyX40OZ=rB)O$K=Dz z2Vd(?R;K5ub`T8$;JOHm`%bIRHOq)QGu9?8u z?3s6dq6ox;6^Y*T2VV>-Kk#0qRH{f}b4rjNOrk+#AGl4O_;9V9FL0>F*(&_Pgv~w( zu)3fl5&j4Nrn@`&S3+m>v(2RbXclu!L@6C59;(OdT*chQN}ZF*z9QUtuV}77AyzU? zEH_H0H=t%TcA#FDJjAIX-aa0Z4ba2BZCPO8L}}5`V6Ns@1m+(^O}n}fiWjQ$``wj} zCLAxjeEM8L7X-Ko;kg{r}MZAuX*$T{nndzLcg( z_6^rD%YqN6x@u}d++BG?jHjokbDy|#QSl(mT?iCo#@dZz(AQ^bi7UK`gThhlrUQ@P z(gJd?{G8#pjSU0Ev6bbEBSS-fMeKzAfIj}p&6U~Yg-#x2M;VsZrLf!kvpvq-LZPoK z7ye`}Zs`j-K(^*=Hat95ip>p#lk4tOG&f+KDwL)QE1d7@bd9q+?a zMq>H{*m!m*7v;CW&ZfkW86~3kpX;iIG>Am^uD#RV0>y#C6=*N$w{vdDT1crtSxBBl?opCeaO5 zHlF^&yrFKz!eTFcZ_hz4{^o)2d|^%4J-pTLvF4ZSaU_PZn;d=N&-3@c- z%PKWB^6}ZFB`8VUC-YdP!mXOt>VdZsD1P8dDpwPG)nI6xU}Sk*=8NgaaKktDh)e#^`JXR~`UygB}Z5Gi(N$*^UKgtSjeja@_ zhfZ-xgUx@xnhdBIiE(UziT$yPO|Yo3pxw8tZY9@Y;qH6tIk+CKT?Cfbj!>|4&>s1$ zJsJ>iycnTERfk~Ps>c<@gvB`6`G;G#7=6TO_g-mzX+Ggn8c>$7 zE*1J2t5VKqOLZQBOUa0gbg>0BY*BKv=*L3MBNyTpAcb0I1Ky-9wFae6ZXUq@{PUil zP2J^#+YdT?pE-MKX;@|WPxKe@t%@jVt8!B+>aN(ML`-$B=7k7mS!t}sV^12<{6+hY zFs#jQo_`m>3&~{MFeca}(mduHvA5|Cyg!g1H}T3Zt9$1MUeHqTCH?Bb!F}-`AlyLg z^9>>kCGJBAP0dW>-x3mQs(JwESf+Hk%h)25s`n>YC@GWBa-IBGpMZ%>`8IgzfS7Qf zsBO2K)*4U#v;2ksi}D>AgbE)3*vAajF8}ZPiaGb+1>j%@{C{PnjRp930s8R(|0zrs lHsF6&Tjc}5zYE~+4^UaAJVbunqy}IPxerRxrBX(L{{_72$bSF; literal 0 HcmV?d00001 diff --git a/doc/related_software.mdwn b/doc/related_software.mdwn index 1b55796287..66abad8df9 100644 --- a/doc/related_software.mdwn +++ b/doc/related_software.mdwn @@ -11,4 +11,3 @@ designed to interoperate with it. 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) -* [Nautilus file manager ingegration](https://gist.github.com/ion1/9660286) diff --git a/doc/tips/file_manager_integration.mdwn b/doc/tips/file_manager_integration.mdwn new file mode 100644 index 0000000000..18210b8ee9 --- /dev/null +++ b/doc/tips/file_manager_integration.mdwn @@ -0,0 +1,31 @@ +Integrating git-annex and your file manager provides an easy way to select +annexed files to get or drop. + +## 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" + +## your file manager here + +Edit this page and add instructions! + +## general + +If your file manager can run a command on a file, it should be easy to +integrate git-annex with it. A simple script will suffice: + + #!/bun/sh + git-annex get --notify-start --notify-finish "$@" + +The --notify-start and --notify-stop options make git-annex display a +desktop notification. This is useful to give the user an indication that +their action took effect. Desktop notifications are currently only +implenented for Linux. From 56e28291079af7aa95f1833926423f85dc6d7669 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sat, 22 Mar 2014 15:53:06 -0400 Subject: [PATCH 021/308] imprve image --- doc/assistant/downloadnotification.png | Bin 4550 -> 4513 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/doc/assistant/downloadnotification.png b/doc/assistant/downloadnotification.png index 5cb3961d991660b579e9da9d89b23d50a6365db1..32b04f122d02a8a0ed5a792c14e2df81de28f9da 100644 GIT binary patch delta 4488 zcmV;35qIv!BcUUZLw__g%&01)000p{Nklr7F|}bw z+hwEsZrE0=wpJ^u6ga=#4Cm>Dx> zKEFR$EHfIq{2p zNos0pQBhGvMTI~hKpG(sh>sC6nLK>>a5|lCXJ=<F){l5_r5n*Fv^Y-;< zXlNuSC#$NezQa1-U&}vC3lRetltS{OApfC(fq|cW_893S}yLPRshQa%e z-~ThQt$##K-|XapP=P?;l$W7kt?Mvn70eQ&Et5r`!TPfM-@c=st{U|?W*d3khn^!rYUo`E7FBC@ly z-fo`Cx19EuDlof1Ax?&l-QVPG65S;B{_dL z&L=8xZJ1j5o%oMMtV68&cT$h`XWtwMSoSI*;8f>$ zjje5m{n^^uG?nEkX^nojEqu3(8B2fm;2Hpo88ha>@y_&`T$!dDmU=^XoWpv*|E##j z&VN1}>il@0xBuNLMGPhlrJ#kzN0;Ou1^V&(E}s-fwX|xJh#pJlP7ifoz4*P^p9DaN zgHVj$XcFFtVQ$8c`>k^M=}rQGL_wKu6X?IlNJR_~m(RH#94Ho)erd_DTk7rYxeNdt zT~;h#Wbd-#Cr)*V9-VO@*n82UWkMVxBYz{)ZdGW_)Sp8uEmoMY@3%O1&V}x+lvX(a z(3h_N-gcT9MN}&$$KI^WKH!Z@1OT9@I&MLTzk@C@j}LJ%*So&4XJlk#WMlxyjH{?_ z{$0q%dBcf$d^|2DbC0*3tE=nl*RQ)Y2lMlC$-WR9b}Fy!^;2GJ@ckONpU^GJ&wp#b z9c`$)W|f2I@~MSIuQqKx1^}7&p3JqLqHbW`SekO}Fyiq;ET!duu(05Dk;v|_%Q5vjRa zOo_Yq_|~rNZya|zeN5^f2QdQKWPh|yL19TpdE!6y05C~S)9ndNOS z3tqj|x2VY)eW@K>Gwh1v5q}vOdHJtG zZCfk5;mX+@;lT~NG)zBV?=e$XNg?`nMdmIqz{PEcW!$gVou)BODgTMWj3Z&^*?EZo zkX+aPAAFS}!ue`b_olvmcY(s&D_~ftpQ~xm zuX{JFV6pPn>C%)n^?7wKEq@pcUR9ojg~iSE5(|dKlgBLKze2dqApPRK_JmO4WHolX zU$EDbWB^H5yOCNs09fVzaX#U|HeTy^n&O6C{ztxbxt?$o0DQJ>7?yv={ijQ63WT7o zt7WxcT3md?c0V=d$>m4WRTZ!x{}ob}eg;N#O>)eQhi}wp&;G=bhJVw#?LJy0_>DiW z+S=Hjjn1){{-vP!L4GCIz7H*w$Qf(ZmZ0&?*MeLVYDMBr3nu>>wlQFptCoRL_#*la z_r>?vEi@u#sjk#Z`%TSFH*ehx7?G-=w0-{p0)a#!5)Pj}+0f9icI8@GXJJIeN#pbn zv&MLzj32K;%6ct29e)P2ki7!ycHenx_<7D*e6v`u6trHuhKD$OnKSG_tmV$rMBN(4)!h zR=idu2|If6i%*8B4L7LcwN@16Sy(WLWQ}o#YVl_-SXfv9fQ1Ev#bkEWlW_TNrBDI@ zS00ti^H-DwI7|=ga6IY7}l;Tlq2qbNe z7|*Eh%@^`=@>~|W95{F~`_?s=g)V2}FJDPK=d>s?AM^^xLt~|3`=D&}}c8Tcxj}k}_|z zTLcpP)UBuEREgVSud-Y59FFiob^*gkxAU;HJ5@pn0HhbNUl%`_F>PY|-s@)O{-xjj zv3wCh`To2uyFc9OkD@*d00f){ouN7+k*K^$*nd`DQq2VbogtK_Dqymh42A{gHK!!^ z@!fxz+dX^Zpg!Z`Y+oi~|6LL~QI5MMr}ot8&eW?q7RaPoNUWcq4^K zu6|Js06IgId0bx2zgm}6HOXp!&$!we6kfBSULbBOe_7ky^DM#ZIshQ64}&H)0Oa5K zdw>6fTVu=_o&kY!>Q+$2Yc9MuebJgpqZIewdTcsjqWmpvlrO|cO&X3%HXMxTC}|~f zwP@JGXHDr_-S>IUQqta&+NhAUCzYLZqW7vk{q)nEoZA3kW@et5_~v^NB0d+#C6`ie z-DbA{z>d`1vre^E6UJOmFX~5*$r^n{l7Eua4weF>rKNd=M4djON*_O2hgh4L^`!R@ z%#75O-#a&kUctZhL&Ksnd4=sIpXDEM9XS%UyUWj-m1IpRixw*Mn>h$S7@p_hP z$xx~7E2Z{bd~s?4=?U{?T27tJRTQVC?H9gC($XSo61J~)c_Il#vD2U`8#_OnTYt$G z=niTB%2JLP=ZM9{0`b#b3Hy#YCX6tudG-85*x&dW^IF&?FUx9-2|yx|6xDQvO%(t@ z9cBms{Dw*ZU@=*4zkJW(aG5M-MPm!p7teBZ#+u3t%H+L3%V$?gt(>AcGAh9SobM0b zg^gkyZ00)Jd^rsOcR8B`#wDnC9&poO$siPtxZHjfzDAjM%=nQlO|yjm2+x zB?0W`72C!9+HR-EuWDHn$nPFD}TDfa(4|S zH9CER2f(jBzm}Jk%hXUPVOJEr#ycOXz`>~$te>ANmo@rgl7g%bW*64r6^|#(_+pBs z<==l^6};(Du8pmDKCg3OB9Qb`Lpg<&)uTSj^5#VCmJ*qnnVFfHoog2v)2Gh^BwHoG zh(B!F+VJ4)xKF2yo%2KfpMS^S#%)x!jR4xO+I9OegPULV)4xiqngHN&Uhy!h@C%z6 z%ttH$U^1C5PBttiOa73uD%YVj697xB)D+`DP#iXC?ssj+7nRoVUVq%Tv|rga0MqT= z`x2{~`|{zOB^xmUg`ha>tHmp&-v2rMzwqVrCy#U9O`?v+2+BmVp^C1f)CvW!>y$N3 zdzN3notwPM`TVJ*e&j)ANsf`lS8ctsv|lAPR$*CvZEpJfbsOdBv73{duWtnB)w3l|Zs8HfpR;Z+b8>TYa_jUyOaUXR zU>F$yFro@ZRB0=|aXH?~-a%1qGGGehzVg*n6Ft3uyMIY9YxHGx@ZWcr^sg5<&73qQ zBmHW>=UbmNlwa6hCd<1`)LzmL0Ax*{ccl^lOm$j6Tld zM){>R0KjB1t$)99PGm9V4=Stj=VcAK@tY1t{hY;9wh&ya%Q^$&XSN+5wk3RX$U@6+ zPEbX~EtjGJev?1e&VaCuAx>`RVsUlEfRM(hu@m=fU%$}FRg5Ds zJ}4n!yPrM2d*W2T|D_b$bL8~(Q(-ALm?%*P0FjZANl8gvH}7vra&j`D&;0g;YG6fD zu>b&~l7Zc_wK-X7$ooDd7)GX!v>Qzy{qotPepg~VW#LHW`fE2?C{YpbZ1X!9ure%L z^?#cuo3vRSXE!oqHtoMXu=_hyYiP*6kZy%pe`o!E==b*>rQm4+{S$h(LR}SIaZCC0 z%Ud!Z7WOaJ;WP2tgxb@)f;w(1eV9JJ4`F+$WUwXbdwH)#n_mP1G1x$xUjza%s6qCJ zKp>F)ArJ@zvOfd@fk5_$Kp+sv{tyTR0)N>b0)apv`$HfQh>zC(C=~Q41_S~zSmJI>vm4B5Z zA|g6U5eNig;CbK9ojbd_T)X|%*VpUm=|x3FF&GRa69R!4V3?bm$Hc_w>FISXY~TEL z<>kwlDJdz1g@u)sm3%%Q35P%+K1Rr7vYwuvv9YnEqhmMYlWBhl1OhP_Kp%QTAP|F; a{{!}3R) delta 4525 zcmV;e5mN4w+gig#cHt#Y7y6p)bMN;)_nSL2$qWDjfk5<1uz$`)1VJEO5C}xiu{jKr zTdvmG_)1DjQd3h43kzSqd?^x%kah?J;$wtLr4AS{fXQSQ7Z;nEnRPb7*7r3vHTwGc zd_F%cEG#D{2MLEjAbJuk7R%q?pTS_fZh~0by05&v+|SRC&*vkh5C}xigHES!-@e`0 z*tpFBF`4)A`G5Syix&$70;CZFf#|^w7!wntrKKf%OOpK)78ZuQ4}n1RZ1{YBXlQ8L z)m;)n5G5rg=zJdnf#?lnXJ?m|mbS0{Qd3irC!r1hPK_0)asG zhd>|@$o~G{h=_==x3_=$di3=4l9Q9QwYA@2o$s&ZAEt$f9t=t$)lpM@)1aWB&p!JM z0QfjjB$T8T^B(RyC8$jQhMjU6Pd#babEkt$UNai*yvF}OEAC-a4~Drt+T#;&yHXv4F@0%hq4Cir`A30C{GN-)@u=n& z0}6TZf*BLTyq3>VYC-*yftWdp$v9YncckkwKH~^rpuYcso5jQutrHdRo#3E4)KKBWkKdO%|89)EB z<=n>Y&0IDBSk4VzGRxYW(o}`h;(zWuy0K%+8^@i=9Gd#aevCx59AcPXP|{YO_)i@G zjM0%e|9AVP3%?QzBw^`5(Mpn1A^P0L)pl z{cD3~O9S?|{P$k+k&%%X|0*zWuyY)s`G6F}3!@~SMtbc-k-Mw}Rhm*V7h@q)(BB*_C!(s_4b8T#FuBVsSuxuVb z;)wqh!ebKU7oSzf#8OwgVO#t|yyqtaNME-bxs?NeUCtk86ZUNuw2Wk^uiX)F=v()z z35Nl|ck|l*d8fR7x}c**3f{C_QTye^CDv~7*I^%DbU0mG4GRufB7bM;XKK#Wr^Z~n z|3-aw?M)nHHlf4ON3)c;_UB~>dxz7}*)|iu6cydetKd6zp@mWvV=dblJhJIZut!3T z1YbXU?62YL0+)I8Gd15nm$}tz-W_f;gN)hgYA9*H)d;H%n>GMOrmJae*}IQKqR_~s zgC~#I*VnIFx=PVr7=KxP%y5%~oS{C)<40;yvR+9}hQ~KNN$75tDI9&d9lU%c>wB+d z1{R~L3m*W$wCU4}A71aC_jO6beuJ4R3#+h4T^VugjfpBZ{a#1W^ik3bx#eLyIfzTSFzZT@79HQv6_VyOc&e)raxC5!(NbDsgg*eO%z{kWM9=|M<5>;a9p_6Hy_v)uj1%N7U z>x>#baq_PCMA@H;x}~RQO#gBmMyA_4IHaeiDcMrFGJi_YGd7>WG7dhFR4&HF1caQu zYsF|bWqzWAS4l{;qQNUk6ayYkWYj71h1~31_c`wS_8)(6c{%rH*~?te(GQ_P07`HvcbdK2_hMo97u6jJ~1{){CY0ul+gQemVdEMwvcs zN=C*TPJd5N`FiI5Gf8cKgDot(p`q%+D#>TnM_iReeIs(GkMd@8E?1-y09@kKfwwnK!x3A}Mj=#*^XNhf(Oi<|-I*JAet)>tA5FJE0El??hJ6hs5=nWZSXN$A z#RmYxKD5S4U~||kmJRO}uO#Qu?SI%?7W;za^@hXtsbthRhMR*000_=-0)fy zLp_?J%JoNkeZ6A(C_0HsG|Y=dK(xSbgt}M^>Xo ztKPx})j|x?XAp#R?f!_ik`^+*9|ODpv@v~?*PazqGz@m7HmD`-O66uBQ(o1lpMIL1 zeG>qztw&@gzWG{&M93!y>4lUVH@VFKuzxi*=d^2$-Ke2g(+j(iV~R#!ouVPPgQWmz zX=&b}Q6~>+Ge?d!B-dnSJysrqospXId;5W*cgSzu(6F#fRbiFnv+5&ms6wK4bonV$ ze0*9jK)JcOH8nNKoj%GFuXA}n1uDsIDYfVPvlFu^kJ-=DvTGHtqIk`+7ea}&xqn&G zC~jTt3M5jRdb>eYG_?OVw}LA&>Z2)p&BF;Eju(mWCp!}M9C1k)XkPuI_(Ry=$VoGs zxh2obsx3%Bp-|LyjKqyE0f64$3;=}n6#&3tb3A|fp2y>}Iqa7W%}`e~#l;P4EYB}f z^#rYuTOqe{n*N}uK&LZ)Kll_h;C}?z&v3E-asmJdxD^z-7DizZ5*`3h^$b<-k&s(S z)zTzW`{JTH0MP1Z(s`Sb(kfAH!Do}5Qjg^U03Rp#IL;8`3aTU&ECADd{6aF%9~Vfw z{9HX;BErb6$5v`IUAeJ@^)IA={k&ugF0ARWdkm*8X8Bo7QsVOQL!!3qn1APSp@m;B zH&ASRECA?e^l7qVIxq6l)6iiu*DeP5)%Vx(vT}tQily9_g|7%kTM3V#)39#-u3XXR z;}kVT9ehwwO}ulGv?dZ@iGLOPH~}Q}{$pl* zC)>WTv|8}&uC3Ej*#Jy*^6E;gD*p5P)8?dlJJmZ2MlQ3X=s4DWLd5HX|*SI3^No_>B2ycbXByLxVq zI9klPxzN?q)77)x`!F?(tc77z0Kmvv7`gQx;@2+5+c`O_>x>0VZTMGy`Z|&)cW-tt z=@pH>q7MH1>5~5SY}d(ShGwK+?)H4^l7^}at7Njg+eB58et!Ul>lJ8>zb(s zFZ?4;9}3$Nu)lDyn>u|o zM%Gi;nKbLCV1C)X;?m0Zb@1!t1R+XI3e=ADiN zkn*0!1#N0Q+kYy+iNc&mri0D%N~-~Y&0$af#x0ShR`{--yEY$ikdG(1N^3XtZjke>q1>U&%_eKoXjITVPph>OFC?J z?tZ0c<-&Eo6B)C-Na_P{aT)Jf$}w*_=N+z}J?ORWr++!FXY=xlwytkKFDoL5BbD9! ze&4ABF@f6_d@}V9dh_Gjq{9H)B9E4cz(Ni17C+pMfx0AOotd-LYC4*zRE{R?kzZ`tefNpS!myZCrC=?+uwUFf03J&SMgRComJP6HAq!q zmGr1flR}k5Rg`{8rq8=lNq59oKfAKFu3FxJ6B)U6*73XjH~9vySV7?2??&`7Fz6SU z(zPi0XJQYBS`zx+8lp$X16P-D#Uu>E>@(>L7k`p8jPT}iZf?xRUv5jgbXkoc2xn(! zK*(e8u+h7=teNBLfukqCe^^4pcRqb|``C$Yf29=Lb?D^P6X7Y>*eFqZ0FjZANl8hs zAH2UM$;rtWhN0j5c7$$fN71qY0J4UuBDYUVli&c zAb-ueE7v(FQ4#O#;I}tmXI8fCw-sE<23>;Nz>ZnJ_h!%TZ{L1>L-&MsD9rjh>-Ph{ zzwapdPx6_cFgp|)X&K?o<;52_X5KI8UaW(s;tfbOCwBz5T~_)qeS9CnDygKmCF*Tvvu`{VVJ3@skOB=5(R-k^mte-mZ@p$gQYM4AP7Pr5O{fcHGefV zA$1T4L{EjmU_?blF&M26q9FkQhGCkTnh_BZbUGaggg_vAs`qW%w(WJ7YyI9|U0t2A zv2j#X6pO_|G9eI%9>$0fBVuA=jE#+D7d_e!e%l}j0sx*rf1Z+(QczG(QBffj3XyOK z1ma_aN~Ibb8(UadxVX4C~3{23r{w00000 LNkvXXu0mjf?6I}% From 274a9433d1600d275c90ffde735c66941c9752fd Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sat, 22 Mar 2014 16:21:35 -0400 Subject: [PATCH 022/308] devblog --- doc/devblog/day_139-140__traveling.mdwn | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 doc/devblog/day_139-140__traveling.mdwn diff --git a/doc/devblog/day_139-140__traveling.mdwn b/doc/devblog/day_139-140__traveling.mdwn new file mode 100644 index 0000000000..3025e45b5c --- /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. From cc6a7108f52ef98ed73b7101c455a8edb10277a5 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sat, 22 Mar 2014 17:28:05 -0400 Subject: [PATCH 023/308] link to magit-annex --- doc/related_software.mdwn | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/related_software.mdwn b/doc/related_software.mdwn index 66abad8df9..0cd7d7fc8f 100644 --- a/doc/related_software.mdwn +++ b/doc/related_software.mdwn @@ -11,3 +11,5 @@ designed to interoperate with it. 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) From 284e6b5e8de17f44b25005c25020be4b7f5cf628 Mon Sep 17 00:00:00 2001 From: Johan Kiviniemi Date: Sun, 23 Mar 2014 07:28:28 +0200 Subject: [PATCH 024/308] =?UTF-8?q?installNautilus:=20=E2=80=9Cexec?= =?UTF-8?q?=E2=80=9D=20git-annex=20and=20protect=20params=20with=20?= =?UTF-8?q?=E2=80=9C--=E2=80=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Assistant/Install.hs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Assistant/Install.hs b/Assistant/Install.hs index ff30022219..f7190ecdc9 100644 --- a/Assistant/Install.hs +++ b/Assistant/Install.hs @@ -94,7 +94,7 @@ installNautilus program = do installscript (scriptdir scriptname action) $ unlines [ "#!/bin/sh" , autoaddedcomment - , program ++ " " ++ action ++ " --notify-start --notify-finish \"$@\"" + , "exec " ++ program ++ " " ++ action ++ " --notify-start --notify-finish -- \"$@\"" ] scriptname action = "git-annex " ++ action installscript f c = whenM (safetoinstallscript f) $ do From 1731cb0840eb153aa4a6f801c7b12b1720ba72a0 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sun, 23 Mar 2014 08:17:03 -0400 Subject: [PATCH 025/308] use shebang lib --- Assistant/Install.hs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Assistant/Install.hs b/Assistant/Install.hs index f7190ecdc9..4d02c0ece5 100644 --- a/Assistant/Install.hs +++ b/Assistant/Install.hs @@ -92,7 +92,7 @@ installNautilus program = do where genscript scriptdir action = installscript (scriptdir scriptname action) $ unlines - [ "#!/bin/sh" + [ shebang_local , autoaddedcomment , "exec " ++ program ++ " " ++ action ++ " --notify-start --notify-finish -- \"$@\"" ] From 9d3b9cc5d1ccb8acbd61753c2a5bf506fb24fad6 Mon Sep 17 00:00:00 2001 From: "https://www.google.com/accounts/o8/id?id=AItOawnvVfFLW4CTKs7UjdiLIsOn_cxj1Jnh64I" Date: Sun, 23 Mar 2014 19:26:09 +0000 Subject: [PATCH 026/308] Added a comment: Could it be gmail.com XMPP throttling? --- ...omment_3_95d16045dc238dba19a98808de2eeedf._comment | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 doc/bugs/Could_not_read_from_remote_repository/comment_3_95d16045dc238dba19a98808de2eeedf._comment 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 0000000000..a8d2705a62 --- /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 + +"""]] From 67cd818ee5b8f9690d93d6a4d67c82fd846009e2 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sun, 23 Mar 2014 16:45:19 -0400 Subject: [PATCH 027/308] devblog --- doc/devblog/day_141__f-droid_sprint.mdwn | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 doc/devblog/day_141__f-droid_sprint.mdwn 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 0000000000..2a9e30b553 --- /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. From 77eeb6191f48bff7e1cca0d89ec6776f3fb8bed0 Mon Sep 17 00:00:00 2001 From: "https://www.google.com/accounts/o8/id?id=AItOawnvVfFLW4CTKs7UjdiLIsOn_cxj1Jnh64I" Date: Sun, 23 Mar 2014 21:00:02 +0000 Subject: [PATCH 028/308] Added a comment: Change the encrypted server repository group to "full backup" --- ...comment_1_924521ad5972046bac44d2e04ec296c7._comment | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 doc/forum/2_clients_using_an_encrypted_server_for_syncing_-_possible__63__/comment_1_924521ad5972046bac44d2e04ec296c7._comment 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 0000000000..90b47a3a9a --- /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.) +"""]] From 53a6d7ff1e86f87db6f511d0dd1d33750ff67558 Mon Sep 17 00:00:00 2001 From: "https://www.google.com/accounts/o8/id?id=AItOawnvVfFLW4CTKs7UjdiLIsOn_cxj1Jnh64I" Date: Sun, 23 Mar 2014 21:22:15 +0000 Subject: [PATCH 029/308] Added a comment: use case: changing workstations mid-way through development session --- ...omment_4_c889050d3079edefc4633451bd5baff8._comment | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 doc/forum/Tracking_a_directory_with_some_hg_and_git_repositories/comment_4_c889050d3079edefc4633451bd5baff8._comment 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 0000000000..55f9f2534e --- /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? + +"""]] From 16025a4f12b3ba35623c670d23fb8c8f753b385a Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sun, 23 Mar 2014 18:17:35 -0400 Subject: [PATCH 030/308] fix build w/o DesktopNotification --- Annex/Notification.hs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Annex/Notification.hs b/Annex/Notification.hs index 5bc39d9cbf..9a2b3956f5 100644 --- a/Annex/Notification.hs +++ b/Annex/Notification.hs @@ -9,10 +9,10 @@ module Annex.Notification where +import Common.Annex import qualified Annex import Logs.Transfer #ifdef WITH_DBUS_NOTIFICATIONS -import Common.Annex import Types.DesktopNotify import qualified DBus.Notify as Notify import qualified DBus.Client From 82c3603704d60afa7ef8953f0e741618779b9325 Mon Sep 17 00:00:00 2001 From: "https://www.google.com/accounts/o8/id?id=AItOawn3p4i4lk_zMilvjnJ9sS6g2nerpgz0Fjc" Date: Sun, 23 Mar 2014 22:59:52 +0000 Subject: [PATCH 031/308] Added a comment: merge only for metadata branch? --- ...t_4_5a208ecefd02916cc86e40272923ca3e._comment | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 doc/automatic_conflict_resolution/comment_4_5a208ecefd02916cc86e40272923ca3e._comment diff --git a/doc/automatic_conflict_resolution/comment_4_5a208ecefd02916cc86e40272923ca3e._comment b/doc/automatic_conflict_resolution/comment_4_5a208ecefd02916cc86e40272923ca3e._comment new file mode 100644 index 0000000000..00ad51a98c --- /dev/null +++ b/doc/automatic_conflict_resolution/comment_4_5a208ecefd02916cc86e40272923ca3e._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawn3p4i4lk_zMilvjnJ9sS6g2nerpgz0Fjc" + nickname="Matthias" + subject="merge only for metadata branch?" + date="2014-03-23T22:59:52Z" + 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 SERVER +4. Meanwhile, B commits \"test.txt\" with content \"b\" +5. When B tries to sync with SERVER, 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. +"""]] From 1124a7d8bdbfebdaf5b1a50e2cf6ae620d7268d1 Mon Sep 17 00:00:00 2001 From: "https://www.google.com/accounts/o8/id?id=AItOawn3p4i4lk_zMilvjnJ9sS6g2nerpgz0Fjc" Date: Sun, 23 Mar 2014 23:00:44 +0000 Subject: [PATCH 032/308] removed --- ...t_4_5a208ecefd02916cc86e40272923ca3e._comment | 16 ---------------- 1 file changed, 16 deletions(-) delete mode 100644 doc/automatic_conflict_resolution/comment_4_5a208ecefd02916cc86e40272923ca3e._comment diff --git a/doc/automatic_conflict_resolution/comment_4_5a208ecefd02916cc86e40272923ca3e._comment b/doc/automatic_conflict_resolution/comment_4_5a208ecefd02916cc86e40272923ca3e._comment deleted file mode 100644 index 00ad51a98c..0000000000 --- a/doc/automatic_conflict_resolution/comment_4_5a208ecefd02916cc86e40272923ca3e._comment +++ /dev/null @@ -1,16 +0,0 @@ -[[!comment format=mdwn - username="https://www.google.com/accounts/o8/id?id=AItOawn3p4i4lk_zMilvjnJ9sS6g2nerpgz0Fjc" - nickname="Matthias" - subject="merge only for metadata branch?" - date="2014-03-23T22:59:52Z" - 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 SERVER -4. Meanwhile, B commits \"test.txt\" with content \"b\" -5. When B tries to sync with SERVER, 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. -"""]] From 8e813ee106b79f4772c101d2df1e5872bc596e69 Mon Sep 17 00:00:00 2001 From: "https://www.google.com/accounts/o8/id?id=AItOawn3p4i4lk_zMilvjnJ9sS6g2nerpgz0Fjc" Date: Sun, 23 Mar 2014 23:02:23 +0000 Subject: [PATCH 033/308] Added a comment: merge for master branch? --- ..._4_80539e11e36a0b64cee83b6b373bd843._comment | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 doc/automatic_conflict_resolution/comment_4_80539e11e36a0b64cee83b6b373bd843._comment 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 0000000000..d67514452f --- /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. +"""]] From f5b3ab5ef0894f074be2561e831c71ac47e885a7 Mon Sep 17 00:00:00 2001 From: "https://www.google.com/accounts/o8/id?id=AItOawndST_f5oYifnfwYRwYr1iHynVd5H5MjJM" Date: Mon, 24 Mar 2014 00:21:52 +0000 Subject: [PATCH 034/308] --- ...nex_fails_to_initialize_under_Windows.mdwn | 212 ++++++++++++++++++ 1 file changed, 212 insertions(+) create mode 100644 doc/bugs/git-annex_fails_to_initialize_under_Windows.mdwn diff --git a/doc/bugs/git-annex_fails_to_initialize_under_Windows.mdwn b/doc/bugs/git-annex_fails_to_initialize_under_Windows.mdwn new file mode 100644 index 0000000000..589ec562d8 --- /dev/null +++ b/doc/bugs/git-annex_fails_to_initialize_under_Windows.mdwn @@ -0,0 +1,212 @@ +### Please describe the problem. +Git-annex fails to initialize and fails tests. + +### What steps will reproduce the problem? +Attempted initialization: + + C:\Users\Andrew\Documents\GitHub\git-annex-test [master]> git annex init + init + Detected a filesystem without fifo support. + + Disabling ssh connection caching. + + Detected a crippled filesystem. + + Enabling direct mode. + fatal: index file open failed: Invalid argument + git-annex: git [Param "checkout",Param "-q",Param "-B",Param "annex/direct/master"] failed + +Tests: + + C:\Users\Andrew\Documents\GitHub\git-annex-test [master]> git annex test + Tests + QuickCheck + prop_idempotent_deencode_git: OK + +++ OK, passed 1000 tests. + prop_idempotent_deencode: OK + +++ OK, passed 1000 tests. + prop_idempotent_fileKey: OK + +++ OK, passed 1000 tests. + prop_idempotent_key_encode: OK + +++ OK, passed 1000 tests. + prop_idempotent_key_decode: OK + +++ OK, passed 1000 tests. + prop_idempotent_shellEscape: OK + +++ OK, passed 1000 tests. + prop_idempotent_shellEscape_multiword: OK + +++ OK, passed 1000 tests. + prop_logs_sane: OK + +++ OK, passed 1000 tests. + prop_idempotent_configEscape: OK + +++ OK, passed 1000 tests. + prop_parse_show_Config: OK + +++ OK, passed 1000 tests. + prop_parentDir_basics: OK + +++ OK, passed 1000 tests. + prop_relPathDirToFile_basics: OK + +++ OK, passed 1000 tests. + prop_relPathDirToFile_regressionTest: OK + +++ OK, passed 1000 tests. + prop_cost_sane: OK + +++ OK, passed 1000 tests. + prop_matcher_sane: OK + +++ OK, passed 1000 tests. + prop_HmacSha1WithCipher_sane: OK + +++ OK, passed 1000 tests. + prop_TimeStamp_sane: OK + +++ OK, passed 1000 tests. + prop_addLog_sane: OK + +++ OK, passed 1000 tests. + prop_verifiable_sane: OK + +++ OK, passed 1000 tests. + prop_segment_regressionTest: OK + +++ OK, passed 1000 tests. + prop_read_write_transferinfo: OK + +++ OK, passed 1000 tests. + prop_read_show_inodecache: OK + +++ OK, passed 1000 tests. + prop_parse_show_log: OK + +++ OK, passed 1000 tests. + prop_read_show_TrustLevel: OK + +++ OK, passed 1000 tests. + prop_parse_show_TrustLog: OK + +++ OK, passed 1000 tests. + prop_hashes_stable: OK + +++ OK, passed 1000 tests. + prop_schedule_roundtrips: OK + +++ OK, passed 1000 tests. + prop_duration_roundtrips: OK + +++ OK, passed 1000 tests. + prop_metadata_sane: OK + +++ OK, passed 1000 tests. + prop_metadata_serialize: OK + +++ OK, passed 1000 tests. + prop_branchView_legal: OK + +++ OK, passed 1000 tests. + prop_view_roundtrips: OK + +++ OK, passed 1000 tests. + prop_viewedFile_rountrips: I n i t TOeKs + ts + i n+i+t+: OK, passed 1000 tests. + Unit Tests + add sha1dup: git-annex: System.PosixCompat.User.getEffectiveUserID: not support + ed: illegal operation + FAIL + init failed + add: git-annex: System.PosixCompat.User.getEffectiveUserID: not supported: illegal operation + FAIL + add failed + + 2 out of 2 tests failed + FAIL + Exception: init tests failed! cannot continue + add extras: FAIL + Exception: init tests failed! cannot continue + reinject: FAIL + Exception: init tests failed! cannot continue + unannex (no copy): FAIL + Exception: init tests failed! cannot continue + unannex (with copy): FAIL + Exception: init tests failed! cannot continue + drop (no remote): FAIL + Exception: init tests failed! cannot continue + drop (with remote): FAIL + Exception: init tests failed! cannot continue + drop (untrusted remote): FAIL + Exception: init tests failed! cannot continue + get: FAIL + Exception: init tests failed! cannot continue + move: FAIL + Exception: init tests failed! cannot continue + copy: FAIL + Exception: init tests failed! cannot continue + lock: FAIL + Exception: init tests failed! cannot continue + edit (no pre-commit): FAIL + Exception: init tests failed! cannot continue + edit (pre-commit): FAIL + Exception: init tests failed! cannot continue + fix: FAIL + Exception: init tests failed! cannot continue + trust: FAIL + Exception: init tests failed! cannot continue + fsck (basics): FAIL + Exception: init tests failed! cannot continue + fsck (bare): FAIL + Exception: init tests failed! cannot continue + fsck (local untrusted): FAIL + Exception: init tests failed! cannot continue + fsck (remote untrusted): FAIL + Exception: init tests failed! cannot continue + migrate: FAIL + Exception: init tests failed! cannot continue + migrate (via gitattributes): FAIL + Exception: init tests failed! cannot continue + unused: FAIL + Exception: init tests failed! cannot continue + describe: FAIL + Exception: init tests failed! cannot continue + find: FAIL + Exception: init tests failed! cannot continue + merge: FAIL + Exception: init tests failed! cannot continue + info: FAIL + Exception: init tests failed! cannot continue + version: FAIL + Exception: init tests failed! cannot continue + sync: FAIL + Exception: init tests failed! cannot continue + union merge regression: FAIL + Exception: init tests failed! cannot continue + conflict resolution: FAIL + Exception: init tests failed! cannot continue + conflict_resolution (mixed directory and file): FAIL + Exception: init tests failed! cannot continue + conflict_resolution (mixed directory and file) 2: FAIL + Exception: init tests failed! cannot continue + map: FAIL + Exception: init tests failed! cannot continue + uninit: FAIL + Exception: init tests failed! cannot continue + uninit (in git-annex branch): FAIL + Exception: init tests failed! cannot continue + upgrade: FAIL + Exception: init tests failed! cannot continue + whereis: FAIL + Exception: init tests failed! cannot continue + hook remote: FAIL + Exception: init tests failed! cannot continue + directory remote: FAIL + Exception: init tests failed! cannot continue + rsync remote: FAIL + Exception: init tests failed! cannot continue + bup remote: FAIL + Exception: init tests failed! cannot continue + crypto: FAIL + Exception: init tests failed! cannot continue + preferred content: FAIL + Exception: init tests failed! cannot continue + add subdirs: FAIL + Exception: init tests failed! cannot continue + + 45 out of 78 tests failed + (This could be due to a bug in git-annex, or an incompatability + with utilities, such as git, installed on this system.) + +### What version of git-annex are you using? On what operating system? + C:\Users\Andrew\Documents\GitHub\git-annex-test [master]> git --version + git version 1.8.4.msysgit.0 + C:\Users\Andrew\Documents\GitHub\git-annex-test [master]> git annex version + git-annex version: 5.20140227-gd872677 + build flags: Assistant Webapp Pairing Testsuite S3 WebDAV DNS Feeds Quvi TDFA CryptoHash + key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E SHA256 SHA1 SHA512 SHA224 SHA384 SKEIN256 + SKEIN512 WORM URL + remote types: git gcrypt S3 bup directory rsync web webdav tahoe glacier hook external + local repository version: 5 + supported repository version: 5 + upgrade supported from repository versions: 2 3 4 + C:\Users\Andrew\Documents\GitHub\git-annex-test [master]> (Get-WmiObject -class Win32_OperatingSystem).Caption + Microsoft Windows 8.1 + +### Please provide any additional information below. +^^^ See above From eaea14da1741721ea8fa296361a521acb4fc0f52 Mon Sep 17 00:00:00 2001 From: "https://www.google.com/accounts/o8/id?id=AItOawmUJBh1lYmvfCCiGr3yrdx-QhuLCSRnU5c" Date: Mon, 24 Mar 2014 07:00:41 +0000 Subject: [PATCH 035/308] --- ...st:_Flag_to_make_git_annex_add_not_ignore_dotfiles.mdwn | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 doc/bugs/Feature_request:_Flag_to_make_git_annex_add_not_ignore_dotfiles.mdwn diff --git a/doc/bugs/Feature_request:_Flag_to_make_git_annex_add_not_ignore_dotfiles.mdwn b/doc/bugs/Feature_request:_Flag_to_make_git_annex_add_not_ignore_dotfiles.mdwn new file mode 100644 index 0000000000..f82d8835f8 --- /dev/null +++ b/doc/bugs/Feature_request:_Flag_to_make_git_annex_add_not_ignore_dotfiles.mdwn @@ -0,0 +1,7 @@ +When using git annex as part of an automated backup system, it's sometimes important that we archive all files, including dotfiles. + +AFAICT there's no way to tell git annex add to add all dotfiles in a given directory; the only way to do it is to list every dotfile individually. (git annex add --force doesn't seem to do it.) + +This can be worked around with find and xargs, but this is more work than it should be, I think. + +It might also be nice if git annex add displayed a warning when adding a directory with dotfiles; something like "Warning, N files ignored; pass --whatever to add them." From 831e9f81d0f748319a09cc8db0388a67514c3b6b Mon Sep 17 00:00:00 2001 From: "https://www.google.com/accounts/o8/id?id=AItOawmUJBh1lYmvfCCiGr3yrdx-QhuLCSRnU5c" Date: Mon, 24 Mar 2014 07:03:42 +0000 Subject: [PATCH 036/308] Added a comment --- .../comment_1_c258016dd545b0426e75a7c0132154d8._comment | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 doc/bugs/Feature_request:_Flag_to_make_git_annex_add_not_ignore_dotfiles/comment_1_c258016dd545b0426e75a7c0132154d8._comment diff --git a/doc/bugs/Feature_request:_Flag_to_make_git_annex_add_not_ignore_dotfiles/comment_1_c258016dd545b0426e75a7c0132154d8._comment b/doc/bugs/Feature_request:_Flag_to_make_git_annex_add_not_ignore_dotfiles/comment_1_c258016dd545b0426e75a7c0132154d8._comment new file mode 100644 index 0000000000..c591e7643b --- /dev/null +++ b/doc/bugs/Feature_request:_Flag_to_make_git_annex_add_not_ignore_dotfiles/comment_1_c258016dd545b0426e75a7c0132154d8._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmUJBh1lYmvfCCiGr3yrdx-QhuLCSRnU5c" + nickname="Justin" + subject="comment 1" + date="2014-03-24T07:03:42Z" + content=""" +Maybe the right solution is to make --force not ignore dotfiles, although perhaps that would break people who rely on its current behavior. +"""]] From 5e7d3113f74031439cf458a56ff5010d12844732 Mon Sep 17 00:00:00 2001 From: "https://launchpad.net/~maestro-alubia" Date: Mon, 24 Mar 2014 15:47:48 +0000 Subject: [PATCH 037/308] --- doc/tips/file_manager_integration.mdwn | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/doc/tips/file_manager_integration.mdwn b/doc/tips/file_manager_integration.mdwn index 18210b8ee9..73705d7fb1 100644 --- a/doc/tips/file_manager_integration.mdwn +++ b/doc/tips/file_manager_integration.mdwn @@ -13,6 +13,30 @@ action from the menu. 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 + ## your file manager here Edit this page and add instructions! From 83fd0560a29ba5011bf1ccdac67230790e6f5117 Mon Sep 17 00:00:00 2001 From: "https://www.google.com/accounts/o8/id?id=AItOawlFZFMFm-AapYAgV_V5X9HRJxWvhdiX9fY" Date: Mon, 24 Mar 2014 21:11:32 +0000 Subject: [PATCH 038/308] Added a comment --- ...mment_1_1d6793701fd8a1a66bae04662cf853ce._comment | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 doc/tips/metadata_driven_views/comment_1_1d6793701fd8a1a66bae04662cf853ce._comment 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 0000000000..808a332afc --- /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. +"""]] From 050c14a47d2ed1a539f0ce81009ae3a9b6fc721d Mon Sep 17 00:00:00 2001 From: Alexcei Date: Tue, 25 Mar 2014 05:43:37 +0000 Subject: [PATCH 039/308] Added a comment --- .../comment_3_ac52304a096ebc66967352efaffb060a._comment | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 doc/forum/Using_git-annex_as_a_library/comment_3_ac52304a096ebc66967352efaffb060a._comment 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 0000000000..cda6e0799a --- /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? +"""]] From 61d89325a63f391988bbbebf66029d43fbff5055 Mon Sep 17 00:00:00 2001 From: "https://www.google.com/accounts/o8/id?id=AItOawnftLWVOF0DUdXr2HSW4IKzuqtW8V7X3YU" Date: Tue, 25 Mar 2014 06:58:58 +0000 Subject: [PATCH 040/308] Added a comment: How can the git annex init command be called on the server? --- ...mment_19_33c19097b6f2b48dfe09ec4c8d952d06._comment | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 doc/tips/using_gitolite_with_git-annex/comment_19_33c19097b6f2b48dfe09ec4c8d952d06._comment 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 0000000000..636794abae --- /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? + +"""]] From ea2cb817943b9e8378b095d4c1610562dee17bb5 Mon Sep 17 00:00:00 2001 From: cehteh Date: Tue, 25 Mar 2014 07:19:59 +0000 Subject: [PATCH 041/308] --- doc/forum/view_from_numeric_values.mdwn | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 doc/forum/view_from_numeric_values.mdwn diff --git a/doc/forum/view_from_numeric_values.mdwn b/doc/forum/view_from_numeric_values.mdwn new file mode 100644 index 0000000000..e1fc48a0f2 --- /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? From 55f1d9e280ec79a891a98d10cd044ea04d8224b3 Mon Sep 17 00:00:00 2001 From: Xyem Date: Tue, 25 Mar 2014 08:54:24 +0000 Subject: [PATCH 042/308] Added a comment --- ..._b0aafc023fbec33af268576c4c199af3._comment | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 doc/forum/view_including_files_with_no_tags/comment_1_b0aafc023fbec33af268576c4c199af3._comment 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 0000000000..ec58308b75 --- /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. +"""]] From 10a7d19c5d0bf3df7b12978d1ea9894ad4a0e5c9 Mon Sep 17 00:00:00 2001 From: "https://www.google.com/accounts/o8/id?id=AItOawnrP-0DGtHDJbWSXeiyk0swNkK1aejoN3c" Date: Tue, 25 Mar 2014 10:20:46 +0000 Subject: [PATCH 043/308] Added a comment: new dev site for syno dsm 5.0 --- .../comment_1_ef7e19f1fd2005eb7cc74509ffb92766._comment | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 doc/tips/Synology_NAS_and_git_annex/comment_1_ef7e19f1fd2005eb7cc74509ffb92766._comment 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 0000000000..e7a1db9373 --- /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 ? :) +"""]] From 74ca0aee148ea571d2058af25cefb75e0d6b510e Mon Sep 17 00:00:00 2001 From: cehteh Date: Tue, 25 Mar 2014 15:25:44 +0000 Subject: [PATCH 044/308] Added a comment: consistent syntax --- ...omment_1_f3c440f3f0104002a0020ba96ddcf87b._comment | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 doc/forum/view_from_numeric_values/comment_1_f3c440f3f0104002a0020ba96ddcf87b._comment 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 0000000000..4df3034a2d --- /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 + +"""]] From e5d3d4654ddfe9bf069e0c9d6f7c3e70c2b2e832 Mon Sep 17 00:00:00 2001 From: "http://ypid.wordpress.com/" Date: Tue, 25 Mar 2014 20:09:16 +0000 Subject: [PATCH 045/308] Added a comment: Perfect --- .../comment_2_39ba640523da2a3a2d22f8c41e52422d._comment | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 doc/forum/view_including_files_with_no_tags/comment_2_39ba640523da2a3a2d22f8c41e52422d._comment diff --git a/doc/forum/view_including_files_with_no_tags/comment_2_39ba640523da2a3a2d22f8c41e52422d._comment b/doc/forum/view_including_files_with_no_tags/comment_2_39ba640523da2a3a2d22f8c41e52422d._comment new file mode 100644 index 0000000000..461cee1a23 --- /dev/null +++ b/doc/forum/view_including_files_with_no_tags/comment_2_39ba640523da2a3a2d22f8c41e52422d._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://ypid.wordpress.com/" + ip="213.153.84.215" + subject="Perfect" + date="2014-03-25T20:09:15Z" + content=""" +This works great. Nice workaround, very much thanks. +"""]] From dd1e7761fbe4dce7e301db838a3f0951389bba31 Mon Sep 17 00:00:00 2001 From: "http://ypid.wordpress.com/" Date: Tue, 25 Mar 2014 20:10:36 +0000 Subject: [PATCH 046/308] removed --- .../comment_2_39ba640523da2a3a2d22f8c41e52422d._comment | 8 -------- 1 file changed, 8 deletions(-) delete mode 100644 doc/forum/view_including_files_with_no_tags/comment_2_39ba640523da2a3a2d22f8c41e52422d._comment diff --git a/doc/forum/view_including_files_with_no_tags/comment_2_39ba640523da2a3a2d22f8c41e52422d._comment b/doc/forum/view_including_files_with_no_tags/comment_2_39ba640523da2a3a2d22f8c41e52422d._comment deleted file mode 100644 index 461cee1a23..0000000000 --- a/doc/forum/view_including_files_with_no_tags/comment_2_39ba640523da2a3a2d22f8c41e52422d._comment +++ /dev/null @@ -1,8 +0,0 @@ -[[!comment format=mdwn - username="http://ypid.wordpress.com/" - ip="213.153.84.215" - subject="Perfect" - date="2014-03-25T20:09:15Z" - content=""" -This works great. Nice workaround, very much thanks. -"""]] From 38975a9c41c2d44c9ff534f9a75d7d0c763f9090 Mon Sep 17 00:00:00 2001 From: "http://ypid.wordpress.com/" Date: Tue, 25 Mar 2014 20:11:27 +0000 Subject: [PATCH 047/308] Added a comment: Perfect --- .../comment_2_5ae9d5308371bdb1f94342c9f9b01aff._comment | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 doc/forum/view_including_files_with_no_tags/comment_2_5ae9d5308371bdb1f94342c9f9b01aff._comment 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 0000000000..3f16a163f8 --- /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. +"""]] From 80a783ab4c056ae8785cd6e17876bace33828d18 Mon Sep 17 00:00:00 2001 From: "https://www.google.com/accounts/o8/id?id=AItOawk3HGoDpnOPob5jOjvIootmkve1-nCpRiI" Date: Tue, 25 Mar 2014 21:27:33 +0000 Subject: [PATCH 048/308] --- ...ve_disrupted_the_file_structure__63__.mdwn | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 doc/forum/Folders_for___34__actions__34___-_now_that_views_have_disrupted_the_file_structure__63__.mdwn 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 0000000000..61a8c7905d --- /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? From 0f7c2dd39b38598c3eae8b3c0fbf1dd8fd4bafea Mon Sep 17 00:00:00 2001 From: Alberto Berti Date: Wed, 26 Mar 2014 00:31:02 +0100 Subject: [PATCH 049/308] Fix thaoe remote to work with latest tahoe (v. 1.10.0) --- Remote/Tahoe.hs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Remote/Tahoe.hs b/Remote/Tahoe.hs index 56a17eb624..d265d7ac12 100644 --- a/Remote/Tahoe.hs +++ b/Remote/Tahoe.hs @@ -216,7 +216,7 @@ readTahoe hdl command params = withTahoeConfigDir hdl $ \configdir -> tahoeParams :: TahoeConfigDir -> String -> [CommandParam] -> [CommandParam] tahoeParams configdir command params = - Param command : Param "-d" : File configdir : params + Param "-d" : File configdir : Param command : params storeCapability :: UUID -> Key -> Capability -> Annex () storeCapability u k cap = setRemoteState u k cap From 78272de2df9147f238da3516abce415aa33ba787 Mon Sep 17 00:00:00 2001 From: "https://www.google.com/accounts/o8/id?id=AItOawmcAgG_9p0pFOM4TOWwm3nGCDIiCZi4oMw" Date: Wed, 26 Mar 2014 00:35:38 +0000 Subject: [PATCH 050/308] added patch --- ...test_tahoe-lafs___40__v._1.10.0__41__.mdwn | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 doc/bugs/Fix_to_thaoe_remote_to_work_with_latest_tahoe-lafs___40__v._1.10.0__41__.mdwn diff --git a/doc/bugs/Fix_to_thaoe_remote_to_work_with_latest_tahoe-lafs___40__v._1.10.0__41__.mdwn b/doc/bugs/Fix_to_thaoe_remote_to_work_with_latest_tahoe-lafs___40__v._1.10.0__41__.mdwn new file mode 100644 index 0000000000..974324c30a --- /dev/null +++ b/doc/bugs/Fix_to_thaoe_remote_to_work_with_latest_tahoe-lafs___40__v._1.10.0__41__.mdwn @@ -0,0 +1,45 @@ +### Please describe the problem. +Just a small patch to Tahoe.hs which fixes "initremote repo +type=thaoe" when using the latest tahoe-lafs release available for +download. + +I'm trying to add an attachment here but the UI says "prohibited by +allowed_attachments (user is not an admin)" so please have a look also +here: + +### What steps will reproduce the problem? + +1. Install latest tahoe-lafs +2. run "TAHOE_FURL=... git annex initremote repo type=tahoe" + +### What version of git-annex are you using? On what operating system? + +OS: Debian Sid updated to latest packages +git-annex: version 5.20140306 + +### Please provide any additional information below. + +I would like to add few things if i'm able (it's my first time for +haskell, and I'm a bit lost as now): + +1. add an optional parameter or envvar for a root dir cap and switch +from storing anonymous files to saving a tree of dirs and files +(much like the webdav back-end) so that i can later renew the +leases on the files to prevent tahoe's garbage collection process +expiration (for details see +) + +The poor man way to that without touching git-annex is to in some +way collect the caps of the files from annex metadatas and to link +them to a directory, which where i can then run "tahoe deep-check +--add-lease" on; + +2. add convergence as an optional parameter. As of now many of the +files that i'm willing to manage with git-annex are already on my +grid, mostly because i've used tahoe's backup command to upload +them in the past. By using the same convergence value that i've +already setup on my other tahoe client installation i would be able +to save much time and space by avoiding duplicates. + +Do you have any good pointers to pieces code of git-annex that i can +read and hack to try to implement this or any other suggestion? From ba8179cc29d6bd49e45dd2f1376dd386eba22e0b Mon Sep 17 00:00:00 2001 From: "https://www.google.com/accounts/o8/id?id=AItOawk9nck8WX8-ADF3Fdh5vFo4Qrw1I_bJcR8" Date: Wed, 26 Mar 2014 11:37:52 +0000 Subject: [PATCH 051/308] --- ...is_git-annex_uploading_a_file_to_a_transfer_repository.mdwn | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 doc/forum/How_to_know_why_is_git-annex_uploading_a_file_to_a_transfer_repository.mdwn 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 0000000000..48ad2d1d83 --- /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? From dad57b67c42e1e60227a0737e32b1a3f5ec39134 Mon Sep 17 00:00:00 2001 From: "https://www.google.com/accounts/o8/id?id=AItOawk9nck8WX8-ADF3Fdh5vFo4Qrw1I_bJcR8" Date: Wed, 26 Mar 2014 11:55:15 +0000 Subject: [PATCH 052/308] --- ..._when_disabling_syncing_in_the_webapp.mdwn | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 doc/bugs/Crash_when_disabling_syncing_in_the_webapp.mdwn 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 0000000000..e69a145a6b --- /dev/null +++ b/doc/bugs/Crash_when_disabling_syncing_in_the_webapp.mdwn @@ -0,0 +1,23 @@ +### Please describe the problem. +The watcher crashes. + +I only need to restart the thread in the pop-up to get everything to work again, but I'm reporting just in case that this issue has any other implications. + + +### What steps will reproduce the problem? +I open the webapp and in the minutes before it starts syncing (syncing is enabled) I disable it (clicking in the 'syncing enabled' text). + +This produces a crash every time. + + +### What version of git-annex are you using? On what operating system? +5.20140320 in Debian sid and testing + + +### Please provide any additional information below. +This is all I can see in the logs + +[[!format sh """ +Watcher crashed: PauseWatcher +[2014-03-26 08:54:57 CET] Watcher: warning Watcher crashed: PauseWatcher +"""]] From db91f38f8fb7d69d5a905514c27a90c4c4a7395f Mon Sep 17 00:00:00 2001 From: "https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" Date: Wed, 26 Mar 2014 12:30:44 +0000 Subject: [PATCH 053/308] --- ...96_____95__revives__95___repositories.mdwn | 86 +++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100644 doc/bugs/__96__git_annex_forget_--drop-dead_--force__96_____95__revives__95___repositories.mdwn 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 0000000000..8cd8766ecb --- /dev/null +++ b/doc/bugs/__96__git_annex_forget_--drop-dead_--force__96_____95__revives__95___repositories.mdwn @@ -0,0 +1,86 @@ +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 % +"""]] From e1fa3397aac5dcf7476ebfb30254d027acf4be32 Mon Sep 17 00:00:00 2001 From: "https://www.google.com/accounts/o8/id?id=AItOawmJuOOkYYguRbWhXzxihIPBavxITJIMyww" Date: Wed, 26 Mar 2014 14:14:36 +0000 Subject: [PATCH 054/308] Added a comment: Excellent News --- .../comment_1_1cc76207020ac478747117c76d7b5f9c._comment | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 doc/devblog/day_141__f-droid_sprint/comment_1_1cc76207020ac478747117c76d7b5f9c._comment 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 0000000000..9971f33da5 --- /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! +"""]] From 01753fba7e18f184e5253480f4aacab282775e65 Mon Sep 17 00:00:00 2001 From: "https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" Date: Wed, 26 Mar 2014 16:52:38 +0000 Subject: [PATCH 055/308] --- doc/todo/clear_file_names_in_special_remotes.mdwn | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 doc/todo/clear_file_names_in_special_remotes.mdwn 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 0000000000..1492650381 --- /dev/null +++ b/doc/todo/clear_file_names_in_special_remotes.mdwn @@ -0,0 +1,9 @@ +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 From 27d27b4da26eb4c472f0c9121d266b19e5193dfd Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Wed, 26 Mar 2014 12:59:54 -0400 Subject: [PATCH 056/308] tahoe: Pass -d parameter before subcommand; putting it after the subcommand no longer works with tahoe-lafs version 1.10. (Thanks, Alberto Berti) --- debian/changelog | 3 +++ ...to_work_with_latest_tahoe-lafs___40__v._1.10.0__41__.mdwn | 5 +++++ 2 files changed, 8 insertions(+) diff --git a/debian/changelog b/debian/changelog index 20b559324f..ee8dda0422 100644 --- a/debian/changelog +++ b/debian/changelog @@ -9,6 +9,9 @@ git-annex (5.20140321) UNRELEASED; urgency=medium 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) -- Joey Hess Fri, 21 Mar 2014 14:08:41 -0400 diff --git a/doc/bugs/Fix_to_thaoe_remote_to_work_with_latest_tahoe-lafs___40__v._1.10.0__41__.mdwn b/doc/bugs/Fix_to_thaoe_remote_to_work_with_latest_tahoe-lafs___40__v._1.10.0__41__.mdwn index 974324c30a..017e792422 100644 --- a/doc/bugs/Fix_to_thaoe_remote_to_work_with_latest_tahoe-lafs___40__v._1.10.0__41__.mdwn +++ b/doc/bugs/Fix_to_thaoe_remote_to_work_with_latest_tahoe-lafs___40__v._1.10.0__41__.mdwn @@ -17,6 +17,8 @@ here: OS: Debian Sid updated to latest packages git-annex: version 5.20140306 +> Thanks, I've fixed this. [[done]] --[[Joey]] + ### Please provide any additional information below. I would like to add few things if i'm able (it's my first time for @@ -43,3 +45,6 @@ to save much time and space by avoiding duplicates. Do you have any good pointers to pieces code of git-annex that i can read and hack to try to implement this or any other suggestion? + +> You sent me a email with these same questions and I'd rather not try to +> respond in 2 places. --[[Joey]] From 2940fa1ba20125ab74df6dd95a3bfaded31b40da Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Wed, 26 Mar 2014 13:11:49 -0400 Subject: [PATCH 057/308] respond; improve docs --- ..._latest_tahoe-lafs___40__v._1.10.0__41__.mdwn | 16 ++++++++++++++-- doc/special_remotes/tahoe.mdwn | 6 +++++- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/doc/bugs/Fix_to_thaoe_remote_to_work_with_latest_tahoe-lafs___40__v._1.10.0__41__.mdwn b/doc/bugs/Fix_to_thaoe_remote_to_work_with_latest_tahoe-lafs___40__v._1.10.0__41__.mdwn index 017e792422..d4392ff6a2 100644 --- a/doc/bugs/Fix_to_thaoe_remote_to_work_with_latest_tahoe-lafs___40__v._1.10.0__41__.mdwn +++ b/doc/bugs/Fix_to_thaoe_remote_to_work_with_latest_tahoe-lafs___40__v._1.10.0__41__.mdwn @@ -36,6 +36,17 @@ way collect the caps of the files from annex metadatas and to link them to a directory, which where i can then run "tahoe deep-check --add-lease" on; +> When I talked this over with Zooko before, he +> thought it was better for git-annex to not use tahoe's directories, +> which is why it doesn't. See [[todo/tahoe_lfs_for_reals]]. +> +> This is the first I have heard about tahoe garbage collection. +> It sounds like it's an optional process. +> +> It would certainly be possible to pull the caps for files out of +> git-annex's remote state log. +> --[[Joey]] + 2. add convergence as an optional parameter. As of now many of the files that i'm willing to manage with git-annex are already on my grid, mostly because i've used tahoe's backup command to upload @@ -46,5 +57,6 @@ to save much time and space by avoiding duplicates. Do you have any good pointers to pieces code of git-annex that i can read and hack to try to implement this or any other suggestion? -> You sent me a email with these same questions and I'd rather not try to -> respond in 2 places. --[[Joey]] +> It was not documented, but you can already pass +> `shared-convergence-secret=xxx` to `initremote`. +> I have documented it. --[[Joey]] diff --git a/doc/special_remotes/tahoe.mdwn b/doc/special_remotes/tahoe.mdwn index afe8c11da9..df1ca620fb 100644 --- a/doc/special_remotes/tahoe.mdwn +++ b/doc/special_remotes/tahoe.mdwn @@ -22,8 +22,12 @@ daemon as needed. 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) + (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. From 363a638b805e063a16499ee92f600a162ffaf6fc Mon Sep 17 00:00:00 2001 From: "http://joeyh.name/" Date: Wed, 26 Mar 2014 17:19:58 +0000 Subject: [PATCH 058/308] Added a comment --- ...mment_1_930b40e0f68da95d335eea5bd4216126._comment | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 doc/bugs/__96__git_annex_forget_--drop-dead_--force__96_____95__revives__95___repositories/comment_1_930b40e0f68da95d335eea5bd4216126._comment 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 0000000000..05aa545ef6 --- /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.) +"""]] From c1197e607c04f8831eead010cfc9d6a533a1c7dd Mon Sep 17 00:00:00 2001 From: "http://joeyh.name/" Date: Wed, 26 Mar 2014 17:26:37 +0000 Subject: [PATCH 059/308] Added a comment --- .../comment_1_630f17c9a7ce9a77d5d5867a6e0c799b._comment | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 doc/todo/clear_file_names_in_special_remotes/comment_1_630f17c9a7ce9a77d5d5867a6e0c799b._comment 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 0000000000..7ca8e19167 --- /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. +"""]] From 0df4848a9eef9ce2579dd64fa159b10459558ab0 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Wed, 26 Mar 2014 13:28:26 -0400 Subject: [PATCH 060/308] 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. --- Annex/Branch/Transitions.hs | 8 ++++++-- debian/changelog | 3 +++ ...ad_--force__96_____95__revives__95___repositories.mdwn | 2 ++ 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/Annex/Branch/Transitions.hs b/Annex/Branch/Transitions.hs index 42c61d96a6..5c2c145484 100644 --- a/Annex/Branch/Transitions.hs +++ b/Annex/Branch/Transitions.hs @@ -32,8 +32,12 @@ getTransitionCalculator ForgetDeadRemotes = Just dropDead dropDead :: FilePath -> String -> TrustMap -> FileTransition dropDead f content trustmap = case getLogVariety f of - Just UUIDBasedLog -> ChangeFile $ - UUIDBased.showLog id $ dropDeadFromUUIDBasedLog trustmap $ UUIDBased.parseLog Just content + 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 _) -> diff --git a/debian/changelog b/debian/changelog index ee8dda0422..9cd685c934 100644 --- a/debian/changelog +++ b/debian/changelog @@ -12,6 +12,9 @@ git-annex (5.20140321) UNRELEASED; urgency=medium * 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. -- Joey Hess Fri, 21 Mar 2014 14:08:41 -0400 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 index 8cd8766ecb..ef0f856621 100644 --- 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 @@ -84,3 +84,5 @@ Debian GNU/Linux 7 \n \l richih@apu (git)-[master] /srv/video/video.debian.net % """]] + +> [[fixed|done]] via not removing from trust.log --[[Joey]] From 236bc9e4fc93ba1d5ca614f187441edb3634aa31 Mon Sep 17 00:00:00 2001 From: "http://joeyh.name/" Date: Wed, 26 Mar 2014 17:36:00 +0000 Subject: [PATCH 061/308] Added a comment --- ...comment_1_e25dd80370820782f9c6a877101d8703._comment | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 doc/bugs/Crash_when_disabling_syncing_in_the_webapp/comment_1_e25dd80370820782f9c6a877101d8703._comment 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 0000000000..ce4af5caa5 --- /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. +"""]] From 908902bbe5ee266a791cb56dfaaed38747bcfb48 Mon Sep 17 00:00:00 2001 From: "http://joeyh.name/" Date: Wed, 26 Mar 2014 17:46:30 +0000 Subject: [PATCH 062/308] Added a comment --- ..._1_17db96492e6bc0e243fc7cb62565c4c4._comment | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 doc/forum/How_to_know_why_is_git-annex_uploading_a_file_to_a_transfer_repository/comment_1_17db96492e6bc0e243fc7cb62565c4c4._comment 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 0000000000..6cf5541e8f --- /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]]. +"""]] From d8281f9288cfd758205b9ea745ad29f63572898d Mon Sep 17 00:00:00 2001 From: "http://joeyh.name/" Date: Wed, 26 Mar 2014 17:53:28 +0000 Subject: [PATCH 063/308] Added a comment --- ...mment_2_2414e1a8cfd154c339d8fc0e4a630ae9._comment | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 doc/forum/view_from_numeric_values/comment_2_2414e1a8cfd154c339d8fc0e4a630ae9._comment 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 0000000000..ff4fcc551f --- /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. +"""]] From 72978a8de01a841746a4bc07ddfcb32e5087f62c Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Wed, 26 Mar 2014 14:22:21 -0400 Subject: [PATCH 064/308] 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. --- Command/ConfigList.hs | 20 ++++++++++++++++++-- debian/changelog | 4 ++++ doc/git-annex-shell.mdwn | 7 ++++++- 3 files changed, 28 insertions(+), 3 deletions(-) diff --git a/Command/ConfigList.hs b/Command/ConfigList.hs index 58b7388645..219685c21c 100644 --- a/Command/ConfigList.hs +++ b/Command/ConfigList.hs @@ -1,6 +1,6 @@ {- git-annex command - - - Copyright 2010 Joey Hess + - Copyright 2010-2014 Joey Hess - - Licensed under the GNU GPL version 3 or higher. -} @@ -10,6 +10,8 @@ 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) @@ -22,9 +24,23 @@ seek = withNothing start start :: CommandStart start = do - u <- getUUID + 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/debian/changelog b/debian/changelog index 9cd685c934..eee5509bac 100644 --- a/debian/changelog +++ b/debian/changelog @@ -15,6 +15,10 @@ git-annex (5.20140321) UNRELEASED; urgency=medium * 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. -- Joey Hess Fri, 21 Mar 2014 14:08:41 -0400 diff --git a/doc/git-annex-shell.mdwn b/doc/git-annex-shell.mdwn index c866154acb..c015a7bda8 100644 --- a/doc/git-annex-shell.mdwn +++ b/doc/git-annex-shell.mdwn @@ -26,7 +26,12 @@ 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` + `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 ...] From 32a580bfe49e1d6ed0b297966f0d9ba5db75ffe2 Mon Sep 17 00:00:00 2001 From: "http://joeyh.name/" Date: Wed, 26 Mar 2014 18:24:31 +0000 Subject: [PATCH 065/308] Added a comment --- ...ent_20_c82af00db3dd74ee9bfe12668e76e57b._comment | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 doc/tips/using_gitolite_with_git-annex/comment_20_c82af00db3dd74ee9bfe12668e76e57b._comment 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 0000000000..45ff960f43 --- /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..) +"""]] From d901503e016a632e1b6867d3aef7991be1199f46 Mon Sep 17 00:00:00 2001 From: "http://joeyh.name/" Date: Wed, 26 Mar 2014 18:31:31 +0000 Subject: [PATCH 066/308] Added a comment --- .../comment_4_d502fea60bf3a82f8a50f72a90a80c25._comment | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 doc/forum/Using_git-annex_as_a_library/comment_4_d502fea60bf3a82f8a50f72a90a80c25._comment 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 0000000000..642fda2fef --- /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. +"""]] From 2f538dd65c2791c108215e424142448e593cc840 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Wed, 26 Mar 2014 14:52:07 -0400 Subject: [PATCH 067/308] add --include-dotfiles: New option, perhaps useful for backups. --- CmdLine/Seek.hs | 19 +++++++++++-------- Command/Add.hs | 11 ++++++++--- Command/Uninit.hs | 2 +- debian/changelog | 1 + ...ake_git_annex_add_not_ignore_dotfiles.mdwn | 7 +++++++ doc/git-annex.mdwn | 12 ++++++++---- 6 files changed, 36 insertions(+), 16 deletions(-) diff --git a/CmdLine/Seek.hs b/CmdLine/Seek.hs index e95b9f0059..abbe52af85 100644 --- a/CmdLine/Seek.hs +++ b/CmdLine/Seek.hs @@ -30,14 +30,15 @@ withFilesInGit :: (FilePath -> CommandStart) -> CommandSeek withFilesInGit a params = seekActions $ prepFiltered a $ seekHelper LsFiles.inRepo params -withFilesNotInGit :: (FilePath -> CommandStart) -> CommandSeek -withFilesNotInGit a params = 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 - seekActions $ prepFiltered a $ - return $ concat $ segmentPaths params (files++dotfiles) +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 [] @@ -45,6 +46,8 @@ withFilesNotInGit a params = do force <- Annex.getState Annex.force g <- gitRepo liftIO $ Git.Command.leaveZombie <$> LsFiles.notInRepo force l g + go l = seekActions $ prepFiltered a $ + return $ concat $ segmentPaths params l withPathContents :: ((FilePath, FilePath) -> CommandStart) -> CommandSeek withPathContents a params = seekActions $ diff --git a/Command/Add.hs b/Command/Add.hs index 0c8e2a48d4..f9e2b33421 100644 --- a/Command/Add.hs +++ b/Command/Add.hs @@ -34,8 +34,12 @@ import Annex.ReplaceFile import Utility.Tmp def :: [Command] -def = [notBareRepo $ command "add" paramPaths seek SectionCommon - "add files to annex"] +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. - @@ -47,7 +51,8 @@ seek ps = do ( start file , stop ) - go withFilesNotInGit + skipdotfiles <- not <$> Annex.getFlag (optionName includeDotFilesOption) + go $ withFilesNotInGit skipdotfiles ifM isDirect ( go withFilesMaybeModified , go withFilesUnlocked diff --git a/Command/Uninit.hs b/Command/Uninit.hs index 2a9e3e687e..5b2adf0bd1 100644 --- a/Command/Uninit.hs +++ b/Command/Uninit.hs @@ -36,7 +36,7 @@ check = do seek :: CommandSeek seek ps = do - withFilesNotInGit (whenAnnexed startCheckIncomplete) ps + withFilesNotInGit False (whenAnnexed startCheckIncomplete) ps withFilesInGit (whenAnnexed Command.Unannex.start) ps finish diff --git a/debian/changelog b/debian/changelog index eee5509bac..f237f019d4 100644 --- a/debian/changelog +++ b/debian/changelog @@ -19,6 +19,7 @@ git-annex (5.20140321) UNRELEASED; urgency=medium 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. -- Joey Hess Fri, 21 Mar 2014 14:08:41 -0400 diff --git a/doc/bugs/Feature_request:_Flag_to_make_git_annex_add_not_ignore_dotfiles.mdwn b/doc/bugs/Feature_request:_Flag_to_make_git_annex_add_not_ignore_dotfiles.mdwn index f82d8835f8..686bf18871 100644 --- a/doc/bugs/Feature_request:_Flag_to_make_git_annex_add_not_ignore_dotfiles.mdwn +++ b/doc/bugs/Feature_request:_Flag_to_make_git_annex_add_not_ignore_dotfiles.mdwn @@ -5,3 +5,10 @@ AFAICT there's no way to tell git annex add to add all dotfiles in a given direc This can be worked around with find and xargs, but this is more work than it should be, I think. It might also be nice if git annex add displayed a warning when adding a directory with dotfiles; something like "Warning, N files ignored; pass --whatever to add them." + +> [[!commit 34abd7bca80a8cc012f92d64116014449b1b2392]] explains +> the rationalle for dotfiles to be skipped. Such as it was. +> +> I don't think it makes sense for --force to be the flag to override +> this, because you may want to add dotfiles, but not .gitignored +> files. So, made a new --include-dotfiles option. [[done]] --[[Joey]] diff --git a/doc/git-annex.mdwn b/doc/git-annex.mdwn index a1005cbc81..6e9f39826c 100644 --- a/doc/git-annex.mdwn +++ b/doc/git-annex.mdwn @@ -62,10 +62,14 @@ subdirectories). * `add [path ...]` - Adds files in the path to the annex. 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. + 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 ...]` From 60d13e97d20163232ed7dd0e2d0ee4e899babb85 Mon Sep 17 00:00:00 2001 From: cehteh Date: Wed, 26 Mar 2014 18:55:41 +0000 Subject: [PATCH 068/308] Added a comment --- ...ment_3_7879a11cc9767cdaac14f9993182dc25._comment | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 doc/forum/view_from_numeric_values/comment_3_7879a11cc9767cdaac14f9993182dc25._comment 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 0000000000..da6dded172 --- /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. + +"""]] From f737ede24bedae34e8458200a6bb696d5c31f910 Mon Sep 17 00:00:00 2001 From: "http://joeyh.name/" Date: Wed, 26 Mar 2014 18:56:30 +0000 Subject: [PATCH 069/308] Added a comment --- ...comment_5_00ac9e4a47ce9a886dbf573480f151bd._comment | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 doc/automatic_conflict_resolution/comment_5_00ac9e4a47ce9a886dbf573480f151bd._comment 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 0000000000..4d1e7c4bcd --- /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`. +"""]] From 87137a6e718d29f89f4d7726acb732356e8a0b5f Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Wed, 26 Mar 2014 15:01:29 -0400 Subject: [PATCH 070/308] close --- .../Assistant_lost_dbus_connection_spamming_log.mdwn | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/doc/bugs/Assistant_lost_dbus_connection_spamming_log.mdwn b/doc/bugs/Assistant_lost_dbus_connection_spamming_log.mdwn index 3b50742fdb..a4a0b0221e 100644 --- a/doc/bugs/Assistant_lost_dbus_connection_spamming_log.mdwn +++ b/doc/bugs/Assistant_lost_dbus_connection_spamming_log.mdwn @@ -76,3 +76,13 @@ accept: unsupported operation (Function not implemented) lost dbus connection; falling back to polling (SocketError {socketErrorMessage = "connect: does not exist (No such file or directory)", socketErrorFatal = True, socketErrorAddress = Just (Address "unix:path=/var/run/dbus/system_bus_socket")}) """]] + +> [[done]]; This turned out to not be dbus related, but the http server failing, +> and I fixed that bug. +> +> AFAICS the user running git-annex did not have their own dbus daemon +> running, and that's why the low-volume dbus messages come up. +> Probably because this is an embedded device, and so no desktop +> environment. git-annex only uses dbus for detecting network connection +> changes and removable media mounts. None of which probably matter in an +> embedded environment. --[[Joey]] From fba62a500ba2e44db876282d1f854eedb09c2206 Mon Sep 17 00:00:00 2001 From: "http://joeyh.name/" Date: Wed, 26 Mar 2014 19:09:07 +0000 Subject: [PATCH 071/308] Added a comment --- ...mment_3_a855096b683c4c4f84e72c797e065d59._comment | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 doc/forum/manual_update_of_.git__47__annex__47__objects/comment_3_a855096b683c4c4f84e72c797e065d59._comment 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 0000000000..2271e04ffe --- /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]]. +"""]] From eb3b6b7e09a01b7ee8a1d53aa2ccab7a43c1b3af Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Wed, 26 Mar 2014 15:21:19 -0400 Subject: [PATCH 072/308] byteable only needed for webapp-secure --- git-annex.cabal | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/git-annex.cabal b/git-annex.cabal index 0f8987915b..a1fcdd24c9 100644 --- a/git-annex.cabal +++ b/git-annex.cabal @@ -190,11 +190,10 @@ Executable git-annex yesod, yesod-default, yesod-static, yesod-form, yesod-core, http-types, transformers, wai, wai-logger, warp, warp-tls, blaze-builder, crypto-api, hamlet, clientsession, - template-haskell, data-default, aeson, network-conduit, - byteable + template-haskell, data-default, aeson, network-conduit CPP-Options: -DWITH_WEBAPP if flag(Webapp) && flag (Webapp-secure) - Build-Depends: warp-tls (>= 1.4), securemem + Build-Depends: warp-tls (>= 1.4), securemem, byteable CPP-Options: -DWITH_WEBAPP_SECURE if flag(Pairing) From 0eb7d2293b96f2623624027330c3c910758f0b00 Mon Sep 17 00:00:00 2001 From: "https://www.google.com/accounts/o8/id?id=AItOawkvN0eFnwvgw2JyTSSHw0QouytcxtPLln8" Date: Wed, 26 Mar 2014 19:43:24 +0000 Subject: [PATCH 073/308] Added a comment: No success --- .../comment_2_e2a7f34a3ccc1b6467e6da611c067d66._comment | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 doc/forum/2_clients_using_an_encrypted_server_for_syncing_-_possible__63__/comment_2_e2a7f34a3ccc1b6467e6da611c067d66._comment 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 0000000000..b50ba4b469 --- /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.) +"""]] From 936cbcfeb796cf4f8079c831c37ed74a6f61c2f0 Mon Sep 17 00:00:00 2001 From: cehteh Date: Wed, 26 Mar 2014 19:45:41 +0000 Subject: [PATCH 074/308] --- doc/bugs/set_metadata_on_wrong_files.mdwn | 88 +++++++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100644 doc/bugs/set_metadata_on_wrong_files.mdwn 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 0000000000..add68bae50 --- /dev/null +++ b/doc/bugs/set_metadata_on_wrong_files.mdwn @@ -0,0 +1,88 @@ +### 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 +"""]] From 48b471e1df2b0f6ad0b2d350228257c96cbdc9e3 Mon Sep 17 00:00:00 2001 From: cehteh Date: Wed, 26 Mar 2014 20:03:51 +0000 Subject: [PATCH 075/308] Added a comment --- ..._517c7659654a6fc608eb3332053df8a4._comment | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 doc/forum/view_from_numeric_values/comment_4_517c7659654a6fc608eb3332053df8a4._comment 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 0000000000..90cb1c22a9 --- /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. + +"""]] From 5c79fa03515be3d33629923fcc14b10e0ddbd6fe Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Wed, 26 Mar 2014 16:40:52 -0400 Subject: [PATCH 076/308] avoid generating arbitrary MetaData with illegal fields --- Types/MetaData.hs | 4 +++- doc/bugs/git_annex_test_under_windows_8.1.mdwn | 3 +++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/Types/MetaData.hs b/Types/MetaData.hs index 706d037bcc..8df56734dd 100644 --- a/Types/MetaData.hs +++ b/Types/MetaData.hs @@ -264,7 +264,9 @@ parseMetaData p = (,) instance Arbitrary MetaData where arbitrary = do size <- arbitrarySizedBoundedIntegral `suchThat` (< 500) - MetaData . M.fromList <$> vector size + MetaData . M.filterWithKey legal . M.fromList <$> vector size + where + legal k _v = legalField $ fromMetaField k instance Arbitrary MetaValue where arbitrary = MetaValue <$> arbitrary <*> arbitrary diff --git a/doc/bugs/git_annex_test_under_windows_8.1.mdwn b/doc/bugs/git_annex_test_under_windows_8.1.mdwn index efdd8f2cfd..2ca64eb61a 100644 --- a/doc/bugs/git_annex_test_under_windows_8.1.mdwn +++ b/doc/bugs/git_annex_test_under_windows_8.1.mdwn @@ -62,3 +62,6 @@ e s tDse.t # End of transcript or log. """]] + +> A sort of windows-specific bug in the test suite. I've fixed it. [[done]] +> --[[Joey]] From b0a72ae4ccd719d2d6da03aa66fde1738be4180d Mon Sep 17 00:00:00 2001 From: "http://joeyh.name/" Date: Wed, 26 Mar 2014 20:50:57 +0000 Subject: [PATCH 077/308] Added a comment --- ...comment_1_082277b9b906a2cc0fcace6790f5cfad._comment | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 doc/bugs/git-annex_fails_to_initialize_under_Windows/comment_1_082277b9b906a2cc0fcace6790f5cfad._comment diff --git a/doc/bugs/git-annex_fails_to_initialize_under_Windows/comment_1_082277b9b906a2cc0fcace6790f5cfad._comment b/doc/bugs/git-annex_fails_to_initialize_under_Windows/comment_1_082277b9b906a2cc0fcace6790f5cfad._comment new file mode 100644 index 0000000000..781528bcb4 --- /dev/null +++ b/doc/bugs/git-annex_fails_to_initialize_under_Windows/comment_1_082277b9b906a2cc0fcace6790f5cfad._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.41" + subject="comment 1" + date="2014-03-26T20:50:55Z" + content=""" +That's a fairly old version of git-annex, so you could try upgrading. + +This might happen if your shell environment you're using to run git-annex does not have either USERPROFILE or HOME envorironment variable set, or does not have one of USERNAME, USER, and LOGNAME set. +"""]] From 11eb39779a682fdc6c8403dc2a2ba9bf746d0e89 Mon Sep 17 00:00:00 2001 From: "http://joeyh.name/" Date: Wed, 26 Mar 2014 20:55:24 +0000 Subject: [PATCH 078/308] Added a comment --- .../comment_1_074f124e5d313e90b3e9217325799587._comment | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 doc/bugs/set_metadata_on_wrong_files/comment_1_074f124e5d313e90b3e9217325799587._comment 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 0000000000..f7a47d2fea --- /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. +"""]] From dcf41363402d26b13da53ff0d1c75374a3dd8272 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Wed, 26 Mar 2014 16:55:29 -0400 Subject: [PATCH 079/308] improve metadata documentation --- doc/bugs/set_metadata_on_wrong_files.mdwn | 2 ++ doc/git-annex.mdwn | 5 +++-- doc/metadata.mdwn | 8 ++++---- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/doc/bugs/set_metadata_on_wrong_files.mdwn b/doc/bugs/set_metadata_on_wrong_files.mdwn index add68bae50..e317147840 100644 --- a/doc/bugs/set_metadata_on_wrong_files.mdwn +++ b/doc/bugs/set_metadata_on_wrong_files.mdwn @@ -86,3 +86,5 @@ metadata c.txt num=3 ok """]] + +> [[fixed|done]]; documentation improved --[[Joey]] diff --git a/doc/git-annex.mdwn b/doc/git-annex.mdwn index 6e9f39826c..51f618d0a6 100644 --- a/doc/git-annex.mdwn +++ b/doc/git-annex.mdwn @@ -711,8 +711,9 @@ subdirectories). * `metadata [path ...] [-s field=value -s field+=value -s field-=value ...] [-g field]` - Each file can have any number of metadata fields attached to it, - which each in turn have any number of values. + 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. diff --git a/doc/metadata.mdwn b/doc/metadata.mdwn index 9f3c314fa2..684820cb95 100644 --- a/doc/metadata.mdwn +++ b/doc/metadata.mdwn @@ -1,7 +1,7 @@ -git-annex allows you to store arbitrary metadata about 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. +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: From 1b3da6a08960f85a1393442a38f5b56b3818ebce Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Wed, 26 Mar 2014 17:04:36 -0400 Subject: [PATCH 080/308] devblog --- doc/devblog/day_142__digging_out.mdwn | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 doc/devblog/day_142__digging_out.mdwn diff --git a/doc/devblog/day_142__digging_out.mdwn b/doc/devblog/day_142__digging_out.mdwn new file mode 100644 index 0000000000..fc2ceea365 --- /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. From 2e833905697611856cd3d01a7e362838a908ea96 Mon Sep 17 00:00:00 2001 From: "http://joeyh.name/" Date: Wed, 26 Mar 2014 21:10:40 +0000 Subject: [PATCH 081/308] Added a comment --- ...comment_3_f9a369a6ac69f091e6128990274d3228._comment | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 doc/forum/2_clients_using_an_encrypted_server_for_syncing_-_possible__63__/comment_3_f9a369a6ac69f091e6128990274d3228._comment 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 0000000000..1e42061447 --- /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. +"""]] From d2e11a699178ad94218d2c0407d133963c2e2a92 Mon Sep 17 00:00:00 2001 From: "https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" Date: Wed, 26 Mar 2014 22:27:02 +0000 Subject: [PATCH 082/308] --- ...rop-dead_--force__96_____95__revives__95___repositories.mdwn | 2 -- 1 file changed, 2 deletions(-) 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 index ef0f856621..8cd8766ecb 100644 --- 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 @@ -84,5 +84,3 @@ Debian GNU/Linux 7 \n \l richih@apu (git)-[master] /srv/video/video.debian.net % """]] - -> [[fixed|done]] via not removing from trust.log --[[Joey]] From c94002c4108645ad3c47a9cb60f3e4ff85f6032f Mon Sep 17 00:00:00 2001 From: "https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" Date: Wed, 26 Mar 2014 22:32:19 +0000 Subject: [PATCH 083/308] Added a comment --- ...comment_2_823c279683ac3f39c921be3fcbf6bfe2._comment | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 doc/todo/clear_file_names_in_special_remotes/comment_2_823c279683ac3f39c921be3fcbf6bfe2._comment 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 0000000000..b7f5a409ea --- /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... +"""]] From a124291a405b4ccc818f42436738d6b5ac6df447 Mon Sep 17 00:00:00 2001 From: "https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" Date: Wed, 26 Mar 2014 22:39:34 +0000 Subject: [PATCH 084/308] Added a comment --- ..._5397d488bc337cb3d7cb46ed774d0437._comment | 90 +++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 doc/bugs/__96__git_annex_forget_--drop-dead_--force__96_____95__revives__95___repositories/comment_2_5397d488bc337cb3d7cb46ed774d0437._comment 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 0000000000..8bdde8972f --- /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 % +\"\"\"]] +"""]] From 314a4c9eb78b8f0218c2f0aa71e3fe397d4a6d88 Mon Sep 17 00:00:00 2001 From: "https://www.google.com/accounts/o8/id?id=AItOawkNE-H4vEcbcGndxq5daT8qUb7yIf7r1OE" Date: Thu, 27 Mar 2014 01:07:41 +0000 Subject: [PATCH 085/308] Just some questions for clarification. --- doc/forum/telehash_syncing.mdwn | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 doc/forum/telehash_syncing.mdwn diff --git a/doc/forum/telehash_syncing.mdwn b/doc/forum/telehash_syncing.mdwn new file mode 100644 index 0000000000..3a5266506e --- /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. From cbe5456401ae6ceb4a88e3f1c57f9f0e3acf72fc Mon Sep 17 00:00:00 2001 From: "http://johan.kiviniemi.name/" Date: Thu, 27 Mar 2014 01:21:37 +0000 Subject: [PATCH 086/308] --- ...tween_watch__47__assistant_and_addurl.mdwn | 195 ++++++++++++++++++ 1 file changed, 195 insertions(+) create mode 100644 doc/bugs/Race_condition_between_watch__47__assistant_and_addurl.mdwn 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 0000000000..1fee439281 --- /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 +"""]] From 6153d80c22cdb46ca155e18e29a7cc5a78c51038 Mon Sep 17 00:00:00 2001 From: "https://www.google.com/accounts/o8/id?id=AItOawmRFKwny4rArBaz-36xTcsJYqKIgdDaw5Q" Date: Thu, 27 Mar 2014 14:33:10 +0000 Subject: [PATCH 087/308] --- doc/bugs/problems_with_glacier.mdwn | 41 +++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 doc/bugs/problems_with_glacier.mdwn diff --git a/doc/bugs/problems_with_glacier.mdwn b/doc/bugs/problems_with_glacier.mdwn new file mode 100644 index 0000000000..967f5b7ff2 --- /dev/null +++ b/doc/bugs/problems_with_glacier.mdwn @@ -0,0 +1,41 @@ +### 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. +"""]] From f62c68b9e99bdaf703b0af681768da762669295c Mon Sep 17 00:00:00 2001 From: "https://www.google.com/accounts/o8/id?id=AItOawmRFKwny4rArBaz-36xTcsJYqKIgdDaw5Q" Date: Thu, 27 Mar 2014 14:46:19 +0000 Subject: [PATCH 088/308] Added a comment --- ...mment_1_8d233428a16ae4276d9c69b329e8216b._comment | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 doc/bugs/problems_with_glacier/comment_1_8d233428a16ae4276d9c69b329e8216b._comment 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 0000000000..e4556dc827 --- /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 +\"\"\"]] +"""]] From 4a84cd70b67de7ebbcd6cf956e81526821f379b6 Mon Sep 17 00:00:00 2001 From: "https://www.google.com/accounts/o8/id?id=AItOawmdbVIGiDH8KarAGAy8y2FHJD_F990JzXI" Date: Thu, 27 Mar 2014 15:06:45 +0000 Subject: [PATCH 089/308] --- .../problem_to_addurl_--file_with_ftp.mdwn | 66 +++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 doc/bugs/problem_to_addurl_--file_with_ftp.mdwn diff --git a/doc/bugs/problem_to_addurl_--file_with_ftp.mdwn b/doc/bugs/problem_to_addurl_--file_with_ftp.mdwn new file mode 100644 index 0000000000..88616f5df6 --- /dev/null +++ b/doc/bugs/problem_to_addurl_--file_with_ftp.mdwn @@ -0,0 +1,66 @@ +### Please describe the problem. +I want to addurl using ftp protocol. +`git annex addurl ftp://...` works fine, but `git annex addurl --file` fails with an error "failed to verify url exists". + +### What steps will reproduce the problem? + +* setting up a new repo + + % alias ga + ga=/home/applis/git-annex.linux/git-annex + % ga init + init ok + (Recording state in git...) + +* addurl --file works with http + + % wget http://downloads.kitenet.net/git-annex/linux/current/git-annex-standalone-amd64.tar.gz + [...] + 2014-03-27 15:25:06 (10,1 MB/s) - ‘git-annex-standalone-amd64.tar.gz’ saved [30689438/30689438] + % ga add git-annex-standalone-amd64.tar.gz + add git-annex-standalone-amd64.tar.gz ok + (Recording state in git...) + % ga addurl http://downloads.kitenet.net/git-annex/linux/current/git-annex-standalone-amd64.tar.gz --file git-annex-standalone-amd64.tar.gz + addurl git-annex-standalone-amd64.tar.gz ok + (Recording state in git...) + +* addurl works with ftp: + + % ga addurl ftp://ftp.belnet.be/debian-cd/7.4.0-live/i386/iso-hybrid/debian-live-7.4-i386-lxde-desktop.iso.log + addurl ftp.belnet.be_debian_cd_7.4.0_live_i386_iso_hybrid_debian_live_7.4_i386_lxde_desktop.iso.log (downloading ftp://ftp.belnet.be/debian-cd/7.4.0-live/i386/iso-hybrid/debian-live-7.4-i386-lxde-desktop.iso.log ...) + [...] + 2014-03-27 15:27:47 (11,1 MB/s) - ‘/data/annex/.git/annex/tmp/URL--ftp&c%%ftp.belnet.be%debian-cd%7.4.0-live%i386%iso-hybrid%debian-live-7.4-i386-lxde-desktop.iso.log’ saved [1235181] + ok + (Recording state in git...) + +* addurl --file doesn't work with ftp + + % wget ftp://ftp.belnet.be/debian-cd/7.4.0-live/i386/iso-hybrid/debian-live-7.4-i386-standard.iso.zsync + [...] + 2014-03-27 15:29:32 (19,4 MB/s) - ‘debian-live-7.4-i386-standard.iso.zsync’ saved [1932014] + % ga add debian-live-7.4-i386-standard.iso.zsync + add debian-live-7.4-i386-standard.iso.zsync ok + (Recording state in git...) + % ga addurl ftp://ftp.belnet.be/debian-cd/7.4.0-live/i386/iso-hybrid/debian-live-7.4-i386-standard.iso.zsync --file debian-live-7.4-i386-standard.iso.zsync + addurl debian-live-7.4-i386-standard.iso.zsync + failed to verify url exists: ftp://ftp.belnet.be/debian-cd/7.4.0-live/i386/iso-hybrid/debian-live-7.4-i386-standard.iso.zsync + failed + git-annex: addurl: 1 failed + +### What version of git-annex are you using? On what operating system? + +I am using current git-annex binary linux version on Fedora 19. + + % which git ; git --version + /usr/bin/git + git version 1.8.3.1 + % which ga ; ga version + ga=/home/applis/git-annex.linux/git-annex + 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 + local repository version: 5 + supported repository version: 5 + upgrade supported from repository versions: 0 1 2 4 + From 32d643554b1087660b97756ebc5132514ca9d2f0 Mon Sep 17 00:00:00 2001 From: "https://www.google.com/accounts/o8/id?id=AItOawmdbVIGiDH8KarAGAy8y2FHJD_F990JzXI" Date: Thu, 27 Mar 2014 15:11:06 +0000 Subject: [PATCH 090/308] --- .../problem_to_addurl_--file_with_ftp.mdwn | 94 +++++++++---------- 1 file changed, 47 insertions(+), 47 deletions(-) diff --git a/doc/bugs/problem_to_addurl_--file_with_ftp.mdwn b/doc/bugs/problem_to_addurl_--file_with_ftp.mdwn index 88616f5df6..55a38c0948 100644 --- a/doc/bugs/problem_to_addurl_--file_with_ftp.mdwn +++ b/doc/bugs/problem_to_addurl_--file_with_ftp.mdwn @@ -4,63 +4,63 @@ I want to addurl using ftp protocol. ### What steps will reproduce the problem? -* setting up a new repo +setting up a new repo - % alias ga - ga=/home/applis/git-annex.linux/git-annex - % ga init - init ok - (Recording state in git...) + % alias ga + ga=/home/applis/git-annex.linux/git-annex + % ga init + init ok + (Recording state in git...) -* addurl --file works with http +addurl --file works with http - % wget http://downloads.kitenet.net/git-annex/linux/current/git-annex-standalone-amd64.tar.gz - [...] - 2014-03-27 15:25:06 (10,1 MB/s) - ‘git-annex-standalone-amd64.tar.gz’ saved [30689438/30689438] - % ga add git-annex-standalone-amd64.tar.gz - add git-annex-standalone-amd64.tar.gz ok - (Recording state in git...) - % ga addurl http://downloads.kitenet.net/git-annex/linux/current/git-annex-standalone-amd64.tar.gz --file git-annex-standalone-amd64.tar.gz - addurl git-annex-standalone-amd64.tar.gz ok - (Recording state in git...) + % wget http://downloads.kitenet.net/git-annex/linux/current/git-annex-standalone-amd64.tar.gz + [...] + 2014-03-27 15:25:06 (10,1 MB/s) - ‘git-annex-standalone-amd64.tar.gz’ saved [30689438/30689438] + % ga add git-annex-standalone-amd64.tar.gz + add git-annex-standalone-amd64.tar.gz ok + (Recording state in git...) + % ga addurl http://downloads.kitenet.net/git-annex/linux/current/git-annex-standalone-amd64.tar.gz --file git-annex-standalone-amd64.tar.gz + addurl git-annex-standalone-amd64.tar.gz ok + (Recording state in git...) -* addurl works with ftp: +addurl works with ftp: - % ga addurl ftp://ftp.belnet.be/debian-cd/7.4.0-live/i386/iso-hybrid/debian-live-7.4-i386-lxde-desktop.iso.log - addurl ftp.belnet.be_debian_cd_7.4.0_live_i386_iso_hybrid_debian_live_7.4_i386_lxde_desktop.iso.log (downloading ftp://ftp.belnet.be/debian-cd/7.4.0-live/i386/iso-hybrid/debian-live-7.4-i386-lxde-desktop.iso.log ...) - [...] - 2014-03-27 15:27:47 (11,1 MB/s) - ‘/data/annex/.git/annex/tmp/URL--ftp&c%%ftp.belnet.be%debian-cd%7.4.0-live%i386%iso-hybrid%debian-live-7.4-i386-lxde-desktop.iso.log’ saved [1235181] - ok - (Recording state in git...) + % ga addurl ftp://ftp.belnet.be/debian-cd/7.4.0-live/i386/iso-hybrid/debian-live-7.4-i386-lxde-desktop.iso.log + addurl ftp.belnet.be_debian_cd_7.4.0_live_i386_iso_hybrid_debian_live_7.4_i386_lxde_desktop.iso.log (downloading ftp://ftp.belnet.be/debian-cd/7.4.0-live/i386/iso-hybrid/debian-live-7.4-i386-lxde-desktop.iso.log ...) + [...] + 2014-03-27 15:27:47 (11,1 MB/s) - ‘/data/annex/.git/annex/tmp/URL--ftp&c%%ftp.belnet.be%debian-cd%7.4.0-live%i386%iso-hybrid%debian-live-7.4-i386-lxde-desktop.iso.log’ saved [1235181] + ok + (Recording state in git...) -* addurl --file doesn't work with ftp +addurl --file doesn't work with ftp - % wget ftp://ftp.belnet.be/debian-cd/7.4.0-live/i386/iso-hybrid/debian-live-7.4-i386-standard.iso.zsync - [...] - 2014-03-27 15:29:32 (19,4 MB/s) - ‘debian-live-7.4-i386-standard.iso.zsync’ saved [1932014] - % ga add debian-live-7.4-i386-standard.iso.zsync - add debian-live-7.4-i386-standard.iso.zsync ok - (Recording state in git...) - % ga addurl ftp://ftp.belnet.be/debian-cd/7.4.0-live/i386/iso-hybrid/debian-live-7.4-i386-standard.iso.zsync --file debian-live-7.4-i386-standard.iso.zsync - addurl debian-live-7.4-i386-standard.iso.zsync - failed to verify url exists: ftp://ftp.belnet.be/debian-cd/7.4.0-live/i386/iso-hybrid/debian-live-7.4-i386-standard.iso.zsync - failed - git-annex: addurl: 1 failed + % wget ftp://ftp.belnet.be/debian-cd/7.4.0-live/i386/iso-hybrid/debian-live-7.4-i386-standard.iso.zsync + [...] + 2014-03-27 15:29:32 (19,4 MB/s) - ‘debian-live-7.4-i386-standard.iso.zsync’ saved [1932014] + % ga add debian-live-7.4-i386-standard.iso.zsync + add debian-live-7.4-i386-standard.iso.zsync ok + (Recording state in git...) + % ga addurl ftp://ftp.belnet.be/debian-cd/7.4.0-live/i386/iso-hybrid/debian-live-7.4-i386-standard.iso.zsync --file debian-live-7.4-i386-standard.iso.zsync + addurl debian-live-7.4-i386-standard.iso.zsync + failed to verify url exists: ftp://ftp.belnet.be/debian-cd/7.4.0-live/i386/iso-hybrid/debian-live-7.4-i386-standard.iso.zsync + failed + git-annex: addurl: 1 failed ### What version of git-annex are you using? On what operating system? I am using current git-annex binary linux version on Fedora 19. - % which git ; git --version - /usr/bin/git - git version 1.8.3.1 - % which ga ; ga version - ga=/home/applis/git-annex.linux/git-annex - 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 - local repository version: 5 - supported repository version: 5 - upgrade supported from repository versions: 0 1 2 4 + % which git ; git --version + /usr/bin/git + git version 1.8.3.1 + % which ga ; ga version + ga=/home/applis/git-annex.linux/git-annex + 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 + local repository version: 5 + supported repository version: 5 + upgrade supported from repository versions: 0 1 2 4 From 16387edd00ce6df9591bb61b9f13f86855edd746 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Thu, 27 Mar 2014 13:01:57 -0400 Subject: [PATCH 091/308] avoid exception when curl exits nonzero (due to eg, bad domain name) --- Utility/Url.hs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Utility/Url.hs b/Utility/Url.hs index 3ab14ebe49..eddcd0a5d0 100644 --- a/Utility/Url.hs +++ b/Utility/Url.hs @@ -77,7 +77,8 @@ exists url uo = case parseURIRelaxed url of Nothing -> dne | otherwise -> if Build.SysConfig.curl then do - output <- readProcess "curl" $ toCommand curlparams + output <- catchDefaultIO "" $ + readProcess "curl" $ toCommand curlparams case lastMaybe (lines output) of Just ('2':_:_) -> return (True, extractsize output) _ -> dne From ac0723036419a297622c9ee7445b0edf60cf9c8d Mon Sep 17 00:00:00 2001 From: "http://joeyh.name/" Date: Thu, 27 Mar 2014 17:27:59 +0000 Subject: [PATCH 092/308] Added a comment --- .../comment_1_2bf44f1653069fb2ed0b124cf8581a48._comment | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 doc/bugs/problem_to_addurl_--file_with_ftp/comment_1_2bf44f1653069fb2ed0b124cf8581a48._comment diff --git a/doc/bugs/problem_to_addurl_--file_with_ftp/comment_1_2bf44f1653069fb2ed0b124cf8581a48._comment b/doc/bugs/problem_to_addurl_--file_with_ftp/comment_1_2bf44f1653069fb2ed0b124cf8581a48._comment new file mode 100644 index 0000000000..f4e98a6210 --- /dev/null +++ b/doc/bugs/problem_to_addurl_--file_with_ftp/comment_1_2bf44f1653069fb2ed0b124cf8581a48._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.41" + subject="comment 1" + date="2014-03-27T17:27:58Z" + content=""" +--file does not change git-annex addurl's network communication in any way. I think this ftp server is sometimes working, and other times failing. It seems to be returning a 350 result code. The FTP spec is not clear what that means, but it does not seem to indicate success. +"""]] From 84a686f4a33a7eaa4b7a6328eee6b6cfc7326e98 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Thu, 27 Mar 2014 13:38:20 -0400 Subject: [PATCH 093/308] re-close. the bug was fixed. --- ...rop-dead_--force__96_____95__revives__95___repositories.mdwn | 2 ++ 1 file changed, 2 insertions(+) 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 index 8cd8766ecb..ef0f856621 100644 --- 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 @@ -84,3 +84,5 @@ Debian GNU/Linux 7 \n \l richih@apu (git)-[master] /srv/video/video.debian.net % """]] + +> [[fixed|done]] via not removing from trust.log --[[Joey]] From 2afbc2bfd8c4f30101134f6836082d1098a3cbd8 Mon Sep 17 00:00:00 2001 From: "http://joeyh.name/" Date: Thu, 27 Mar 2014 17:40:51 +0000 Subject: [PATCH 094/308] Added a comment --- ...comment_3_1b30e7611ec824dc6e79ef35e43ac740._comment | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 doc/bugs/__96__git_annex_forget_--drop-dead_--force__96_____95__revives__95___repositories/comment_3_1b30e7611ec824dc6e79ef35e43ac740._comment 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 0000000000..5b57840123 --- /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. +"""]] From 32d51fc0dd94fcad65ac80a9a09996f359d6f9d2 Mon Sep 17 00:00:00 2001 From: "http://joeyh.name/" Date: Thu, 27 Mar 2014 17:44:46 +0000 Subject: [PATCH 095/308] Added a comment --- .../comment_3_4704e465025b543e47c18d565abd2747._comment | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 doc/todo/clear_file_names_in_special_remotes/comment_3_4704e465025b543e47c18d565abd2747._comment 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 0000000000..a925cb2de4 --- /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\". +"""]] From e1fcb9e307dad1c3fc786eec0fc04b7827ddfabf Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Thu, 27 Mar 2014 13:49:51 -0400 Subject: [PATCH 096/308] close the my little pony bugs --- .../New_special_remote_suggeston_-_clean_directory.mdwn | 8 ++++++++ doc/todo/clear_file_names_in_special_remotes.mdwn | 4 ++++ 2 files changed, 12 insertions(+) diff --git a/doc/todo/New_special_remote_suggeston_-_clean_directory.mdwn b/doc/todo/New_special_remote_suggeston_-_clean_directory.mdwn index 9fd3c5a202..98dd58d5e4 100644 --- a/doc/todo/New_special_remote_suggeston_-_clean_directory.mdwn +++ b/doc/todo/New_special_remote_suggeston_-_clean_directory.mdwn @@ -13,3 +13,11 @@ This special remote could be thought of as the 'least common denominator of spec 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/clear_file_names_in_special_remotes.mdwn b/doc/todo/clear_file_names_in_special_remotes.mdwn index 1492650381..1b6a9f9355 100644 --- a/doc/todo/clear_file_names_in_special_remotes.mdwn +++ b/doc/todo/clear_file_names_in_special_remotes.mdwn @@ -7,3 +7,7 @@ I talked to TobiasTheViking in the past and he hinted at a reasonably clean way 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]] From 9561279f0b61f6627ad794ed218934f67fd68abc Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Thu, 27 Mar 2014 13:50:32 -0400 Subject: [PATCH 097/308] close --- doc/todo/Views_Demo.mdwn | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/todo/Views_Demo.mdwn b/doc/todo/Views_Demo.mdwn index 2587642e34..54704afa69 100644 --- a/doc/todo/Views_Demo.mdwn +++ b/doc/todo/Views_Demo.mdwn @@ -11,3 +11,5 @@ So, are you considering a metadata syntax that can support complex metadata? One FWIW, Bob + +> [[closing|done]]; requested feature was already present --[[Joey]] From 3b8d5f03bb4b12748491fbf624dc3deb5a8b3198 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Thu, 27 Mar 2014 14:30:36 -0400 Subject: [PATCH 098/308] Fix glacier repo creation bug 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/ --- Remote/Glacier.hs | 8 +++++--- debian/changelog | 7 +++++++ doc/bugs/problems_with_glacier.mdwn | 24 ++++++++++++++++++++++++ 3 files changed, 36 insertions(+), 3 deletions(-) diff --git a/Remote/Glacier.hs b/Remote/Glacier.hs index fe6f53a771..eb274714b4 100644 --- a/Remote/Glacier.hs +++ b/Remote/Glacier.hs @@ -82,7 +82,7 @@ glacierSetup' enabling u c = do unless enabling $ genVault fullconfig u gitConfigSpecialRemote u fullconfig "glacier" "true" - return (c', u) + return (fullconfig, u) where remotename = fromJust (M.lookup "name" c) defvault = remotename ++ "-" ++ fromUUID u @@ -225,7 +225,8 @@ glacierParams :: RemoteConfig -> [CommandParam] -> [CommandParam] glacierParams c params = datacenter:params where datacenter = Param $ "--region=" ++ - fromJust (M.lookup "datacenter" c) + fromMaybe (error "Missing datacenter configuration") + (M.lookup "datacenter" c) glacierEnv :: RemoteConfig -> UUID -> Annex (Maybe [(String, String)]) glacierEnv c u = go =<< getRemoteCredPairFor "glacier" c creds @@ -239,7 +240,8 @@ glacierEnv c u = go =<< getRemoteCredPairFor "glacier" c creds (uk, pk) = credPairEnvironment creds getVault :: RemoteConfig -> Vault -getVault = fromJust . M.lookup "vault" +getVault = fromMaybe (error "Missing vault configuration") + . M.lookup "vault" archive :: Remote -> Key -> Archive archive r k = fileprefix ++ key2file k diff --git a/debian/changelog b/debian/changelog index f237f019d4..53d653adcc 100644 --- a/debian/changelog +++ b/debian/changelog @@ -20,6 +20,13 @@ git-annex (5.20140321) UNRELEASED; urgency=medium 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/ -- Joey Hess Fri, 21 Mar 2014 14:08:41 -0400 diff --git a/doc/bugs/problems_with_glacier.mdwn b/doc/bugs/problems_with_glacier.mdwn index 967f5b7ff2..60e2f7e698 100644 --- a/doc/bugs/problems_with_glacier.mdwn +++ b/doc/bugs/problems_with_glacier.mdwn @@ -39,3 +39,27 @@ user: "Andrew Mark Kraut " # 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]] From 4674185a74f30f3b386478dcae5563184c232891 Mon Sep 17 00:00:00 2001 From: "https://www.google.com/accounts/o8/id?id=AItOawmdbVIGiDH8KarAGAy8y2FHJD_F990JzXI" Date: Thu, 27 Mar 2014 20:03:47 +0000 Subject: [PATCH 099/308] Added a comment --- .../comment_2_4c277d3d78f33ca19228d765d13fcf32._comment | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 doc/bugs/problem_to_addurl_--file_with_ftp/comment_2_4c277d3d78f33ca19228d765d13fcf32._comment diff --git a/doc/bugs/problem_to_addurl_--file_with_ftp/comment_2_4c277d3d78f33ca19228d765d13fcf32._comment b/doc/bugs/problem_to_addurl_--file_with_ftp/comment_2_4c277d3d78f33ca19228d765d13fcf32._comment new file mode 100644 index 0000000000..610599b85c --- /dev/null +++ b/doc/bugs/problem_to_addurl_--file_with_ftp/comment_2_4c277d3d78f33ca19228d765d13fcf32._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmdbVIGiDH8KarAGAy8y2FHJD_F990JzXI" + nickname="François" + subject="comment 2" + date="2014-03-27T20:03:46Z" + content=""" +So do you have an idea where the problem could be? I have tried 2 other ftp servers on a different system and a different network with consistent results, `git annex addurl ftp://...` always works and `git annex addurl ftp://... --file` always returns the same error. +"""]] From e720e4babb342fe7831e673e728645b68cf1d5f5 Mon Sep 17 00:00:00 2001 From: "https://www.google.com/accounts/o8/id?id=AItOawmqWbWVRH2k9spSMqKfIXBP1G3ekkj9Igg" Date: Fri, 28 Mar 2014 22:38:06 +0000 Subject: [PATCH 100/308] Added a comment: problem installing using cabal: language-javascript missing --- ..._1d597d6a95f9c2df7dae6e98813e4865._comment | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 doc/install/ArchLinux/comment_6_1d597d6a95f9c2df7dae6e98813e4865._comment diff --git a/doc/install/ArchLinux/comment_6_1d597d6a95f9c2df7dae6e98813e4865._comment b/doc/install/ArchLinux/comment_6_1d597d6a95f9c2df7dae6e98813e4865._comment new file mode 100644 index 0000000000..9f158347bc --- /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? +"""]] From f96dcf61cb045c48b84627a8856010a0d40fb2a9 Mon Sep 17 00:00:00 2001 From: "https://www.google.com/accounts/o8/id?id=AItOawkvN0eFnwvgw2JyTSSHw0QouytcxtPLln8" Date: Fri, 28 Mar 2014 22:49:14 +0000 Subject: [PATCH 101/308] Added a comment: Need some clarification --- ..._91b422f8d55b68077245c606c4f7f87c._comment | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 doc/forum/2_clients_using_an_encrypted_server_for_syncing_-_possible__63__/comment_4_91b422f8d55b68077245c606c4f7f87c._comment 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 0000000000..4d8915b8df --- /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?) +"""]] From 61dff22a41403e37a6d42e6ae3c20808e0f30a51 Mon Sep 17 00:00:00 2001 From: "http://alerque.com/" Date: Fri, 28 Mar 2014 22:50:38 +0000 Subject: [PATCH 102/308] Added a comment: dep problems --- ...comment_7_2d708977e2fad6b68803494576382df5._comment | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 doc/install/ArchLinux/comment_7_2d708977e2fad6b68803494576382df5._comment diff --git a/doc/install/ArchLinux/comment_7_2d708977e2fad6b68803494576382df5._comment b/doc/install/ArchLinux/comment_7_2d708977e2fad6b68803494576382df5._comment new file mode 100644 index 0000000000..3d7826bc10 --- /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). +"""]] From f1a41e2b9ad073889c241124f1c522dc96cb22cd Mon Sep 17 00:00:00 2001 From: "https://www.google.com/accounts/o8/id?id=AItOawmqWbWVRH2k9spSMqKfIXBP1G3ekkj9Igg" Date: Sat, 29 Mar 2014 07:45:21 +0000 Subject: [PATCH 103/308] Added a comment: I solved it installing dependencies....but dont know hot to start it... --- ...nt_8_5b5f5e0b64e5bfb1ea12e8b251c6fb5f._comment | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 doc/install/ArchLinux/comment_8_5b5f5e0b64e5bfb1ea12e8b251c6fb5f._comment diff --git a/doc/install/ArchLinux/comment_8_5b5f5e0b64e5bfb1ea12e8b251c6fb5f._comment b/doc/install/ArchLinux/comment_8_5b5f5e0b64e5bfb1ea12e8b251c6fb5f._comment new file mode 100644 index 0000000000..3e6d6b3a82 --- /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? +"""]] From d00d06135c986b07acdf1478d202e0fb7a9926ca Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sat, 29 Mar 2014 14:39:10 -0400 Subject: [PATCH 104/308] update for required content --- doc/copies.mdwn | 3 +++ doc/internals.mdwn | 7 +++++++ doc/preferred_content.mdwn | 2 +- 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/doc/copies.mdwn b/doc/copies.mdwn index 205d2d5b12..3e0ebc6c69 100644 --- a/doc/copies.mdwn +++ b/doc/copies.mdwn @@ -30,3 +30,6 @@ 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/internals.mdwn b/doc/internals.mdwn index 0c5124d0b9..bf0fa668c9 100644 --- a/doc/internals.mdwn +++ b/doc/internals.mdwn @@ -150,6 +150,13 @@ 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 diff --git a/doc/preferred_content.mdwn b/doc/preferred_content.mdwn index af76a0e7b4..9829fc687d 100644 --- a/doc/preferred_content.mdwn +++ b/doc/preferred_content.mdwn @@ -1,7 +1,7 @@ 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 sometimes, it can be good to have more fine-grained +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`, From fe19e15040630587afcd23abf13713a642ee2bd5 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sat, 29 Mar 2014 14:43:34 -0400 Subject: [PATCH 105/308] reorg matcher types; no non-type code changes --- Annex.hs | 13 ++++------ Annex/FileMatcher.hs | 17 ++++++------- Assistant/Threads/Watcher.hs | 7 +++--- Limit.hs | 46 +++++++++++++++++------------------- Logs.hs | 4 ++++ Logs/PreferredContent.hs | 18 +++++++------- Types/FileMatcher.hs | 21 ++++++++++++++++ Types/Limit.hs | 20 ---------------- 8 files changed, 72 insertions(+), 74 deletions(-) delete mode 100644 Types/Limit.hs diff --git a/Annex.hs b/Annex.hs index 78329b5df5..f00276e2fc 100644 --- a/Annex.hs +++ b/Annex.hs @@ -10,7 +10,6 @@ module Annex ( Annex, AnnexState(..), - PreferredContentMap, new, run, eval, @@ -62,7 +61,6 @@ import Types.LockPool import Types.MetaData import Types.DesktopNotify import Types.CleanupActions -import qualified Utility.Matcher import qualified Data.Map as M import qualified Data.Set as S import Utility.Quvi (QuviVersion) @@ -81,9 +79,6 @@ newtype Annex a = Annex { runAnnex :: ReaderT (MVar AnnexState) IO a } Applicative ) -type Matcher a = Either [Utility.Matcher.Token a] (Utility.Matcher.Matcher a) -type PreferredContentMap = M.Map UUID (Utility.Matcher.Matcher (S.Set UUID -> MatchInfo -> Annex Bool)) - -- internal state storage data AnnexState = AnnexState { repo :: Git.Repo @@ -104,9 +99,10 @@ data AnnexState = AnnexState , forcebackend :: Maybe String , globalnumcopies :: Maybe NumCopies , forcenumcopies :: Maybe NumCopies - , limit :: Matcher (MatchInfo -> Annex Bool) + , limit :: ExpandableMatcher Annex , uuidmap :: Maybe UUIDMap - , preferredcontentmap :: Maybe PreferredContentMap + , preferredcontentmap :: Maybe (FileMatcherMap Annex) + , requiredcontentmap :: Maybe (FileMatcherMap Annex) , shared :: Maybe SharedRepository , forcetrust :: TrustMap , trustmap :: Maybe TrustMap @@ -146,9 +142,10 @@ newState c r = AnnexState , forcebackend = Nothing , globalnumcopies = Nothing , forcenumcopies = Nothing - , limit = Left [] + , limit = BuildingMatcher [] , uuidmap = Nothing , preferredcontentmap = Nothing + , requiredcontentmap = Nothing , shared = Nothing , forcetrust = M.empty , trustmap = Nothing diff --git a/Annex/FileMatcher.hs b/Annex/FileMatcher.hs index ae1bbb77bf..da6a5e0e93 100644 --- a/Annex/FileMatcher.hs +++ b/Annex/FileMatcher.hs @@ -13,7 +13,6 @@ import Common.Annex import Limit import Utility.Matcher import Types.Group -import Types.Limit import Logs.Group import Logs.Remote import Annex.UUID @@ -25,12 +24,10 @@ import Types.Remote (RemoteConfig) import Data.Either import qualified Data.Set as S -type FileMatcher = Matcher MatchFiles - -checkFileMatcher :: FileMatcher -> FilePath -> Annex Bool +checkFileMatcher :: (FileMatcher Annex) -> FilePath -> Annex Bool checkFileMatcher matcher file = checkMatcher matcher Nothing (Just file) S.empty True -checkMatcher :: FileMatcher -> Maybe Key -> AssociatedFile -> AssumeNotPresent -> Bool -> Annex Bool +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 @@ -48,15 +45,15 @@ fileMatchInfo file = do , relFile = file } -matchAll :: FileMatcher +matchAll :: FileMatcher Annex matchAll = generate [] -parsedToMatcher :: [Either String (Token MatchFiles)] -> Either String FileMatcher +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 -> FileMatcher -> GroupMap -> M.Map UUID RemoteConfig -> Maybe UUID -> String -> [Either String (Token MatchFiles)] +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 @@ -69,7 +66,7 @@ exprParser matchstandard matchgroupwanted groupmap configmap mu expr = preferreddir = fromMaybe "public" $ M.lookup "preferreddir" =<< (`M.lookup` configmap) =<< mu -parseToken :: FileMatcher -> FileMatcher -> MkLimit -> MkLimit -> GroupMap -> String -> Either String (Token MatchFiles) +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 @@ -106,7 +103,7 @@ tokenizeMatcher = filter (not . null ) . concatMap splitparens . words {- 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 +largeFilesMatcher :: Annex (FileMatcher Annex) largeFilesMatcher = go =<< annexLargeFiles <$> Annex.getGitConfig where go Nothing = return matchAll diff --git a/Assistant/Threads/Watcher.hs b/Assistant/Threads/Watcher.hs index 8a8e8faf04..97ccf083e8 100644 --- a/Assistant/Threads/Watcher.hs +++ b/Assistant/Threads/Watcher.hs @@ -35,6 +35,7 @@ import Annex.CatFile import Annex.CheckIgnore import Annex.Link import Annex.FileMatcher +import Types.FileMatcher import Annex.ReplaceFile import Git.Types import Config @@ -196,7 +197,7 @@ runHandler handler file filestatus = void $ do | otherwise = f {- Small files are added to git as-is, while large ones go into the annex. -} -add :: FileMatcher -> FilePath -> Assistant (Maybe Change) +add :: FileMatcher Annex -> FilePath -> Assistant (Maybe Change) add bigfilematcher file = ifM (liftAnnex $ checkFileMatcher bigfilematcher file) ( pendingAddChange file , do @@ -205,7 +206,7 @@ add bigfilematcher file = ifM (liftAnnex $ checkFileMatcher bigfilematcher file) madeChange file AddFileChange ) -onAdd :: FileMatcher -> Handler +onAdd :: FileMatcher Annex -> Handler onAdd matcher file filestatus | maybe False isRegularFile filestatus = unlessIgnored file $ @@ -218,7 +219,7 @@ shouldRestage ds = scanComplete ds || forceRestage ds {- In direct mode, add events are received for both new files, and - modified existing files. -} -onAddDirect :: Bool -> FileMatcher -> Handler +onAddDirect :: Bool -> FileMatcher Annex -> Handler onAddDirect symlinkssupported matcher file fs = do v <- liftAnnex $ catKeyFile file case (v, fs) of diff --git a/Limit.hs b/Limit.hs index 7654842e16..b46ff1a06f 100644 --- a/Limit.hs +++ b/Limit.hs @@ -20,7 +20,6 @@ import Types.TrustLevel import Types.Key import Types.Group import Types.FileMatcher -import Types.Limit import Types.MetaData import Logs.MetaData import Logs.Group @@ -45,21 +44,20 @@ getMatcher :: Annex (MatchInfo -> Annex Bool) getMatcher = Utility.Matcher.matchM <$> getMatcher' getMatcher' :: Annex (Utility.Matcher.Matcher (MatchInfo -> Annex Bool)) -getMatcher' = do - m <- Annex.getState Annex.limit - case m of - Right r -> return r - Left l -> do - let matcher = Utility.Matcher.generate (reverse l) - Annex.changeState $ \s -> - s { Annex.limit = Right matcher } - return matcher +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 (Left ls) = Left $ l:ls + prepend (BuildingMatcher ls) = BuildingMatcher $ l:ls prepend _ = error "internal" {- Adds a new token. -} @@ -67,21 +65,21 @@ addToken :: String -> Annex () addToken = add . Utility.Matcher.token {- Adds a new limit. -} -addLimit :: Either String MatchFiles -> Annex () +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 +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 +limitExclude :: MkLimit Annex limitExclude glob = Right $ const $ return . not . matchGlobFile glob matchGlobFile :: String -> (MatchInfo -> Bool) @@ -119,10 +117,10 @@ addIn s = addLimit =<< mk else inAnnex key {- Limit to content that is currently present on a uuid. -} -limitPresent :: Maybe UUID -> MkLimit +limitPresent :: Maybe UUID -> MkLimit Annex limitPresent u _ = Right $ matchPresent u -matchPresent :: Maybe UUID -> MatchFiles +matchPresent :: Maybe UUID -> MatchFiles Annex matchPresent u _ = checkKey $ \key -> do hereu <- getUUID if u == Just hereu || isNothing u @@ -132,7 +130,7 @@ matchPresent u _ = checkKey $ \key -> do return $ maybe False (`elem` us) u {- Limit to content that is in a directory, anywhere in the repository tree -} -limitInDir :: FilePath -> MkLimit +limitInDir :: FilePath -> MkLimit Annex limitInDir dir = const $ Right $ const go where go (MatchingFile fi) = return $ elem dir $ splitPath $ takeDirectory $ matchFile fi @@ -143,7 +141,7 @@ limitInDir dir = const $ Right $ const go addCopies :: String -> Annex () addCopies = addLimit . limitCopies -limitCopies :: MkLimit +limitCopies :: MkLimit Annex limitCopies want = case split ":" want of [v, n] -> case parsetrustspec v of Just checker -> go n $ checktrust checker @@ -169,7 +167,7 @@ limitCopies want = case split ":" want of addLackingCopies :: Bool -> String -> Annex () addLackingCopies approx = addLimit . limitLackingCopies approx -limitLackingCopies :: Bool -> MkLimit +limitLackingCopies :: Bool -> MkLimit Annex limitLackingCopies approx want = case readish want of Just needed -> Right $ \notpresent mi -> flip checkKey mi $ handle mi needed notpresent @@ -191,7 +189,7 @@ limitLackingCopies approx want = case readish want of - This has a nice optimisation: When a file exists, - its key is obviously not unused. -} -limitUnused :: MatchFiles +limitUnused :: MatchFiles Annex limitUnused _ (MatchingFile _) = return False limitUnused _ (MatchingKey k) = S.member k <$> unusedKeys @@ -202,7 +200,7 @@ addInAllGroup groupname = do m <- groupMap addLimit $ limitInAllGroup m groupname -limitInAllGroup :: GroupMap -> MkLimit +limitInAllGroup :: GroupMap -> MkLimit Annex limitInAllGroup m groupname | S.null want = Right $ const $ const $ return True | otherwise = Right $ \notpresent -> checkKey $ check notpresent @@ -219,7 +217,7 @@ limitInAllGroup m groupname addInBackend :: String -> Annex () addInBackend = addLimit . limitInBackend -limitInBackend :: MkLimit +limitInBackend :: MkLimit Annex limitInBackend name = Right $ const $ checkKey check where check key = pure $ keyBackendName key == name @@ -231,7 +229,7 @@ addLargerThan = addLimit . limitSize (>) addSmallerThan :: String -> Annex () addSmallerThan = addLimit . limitSize (<) -limitSize :: (Maybe Integer -> Maybe Integer -> Bool) -> MkLimit +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 @@ -249,7 +247,7 @@ limitSize vs s = case readSize dataUnits s of addMetaData :: String -> Annex () addMetaData = addLimit . limitMetaData -limitMetaData :: MkLimit +limitMetaData :: MkLimit Annex limitMetaData s = case parseMetaData s of Left e -> Left e Right (f, v) -> diff --git a/Logs.hs b/Logs.hs index 2a2fc430e0..c9d58157a5 100644 --- a/Logs.hs +++ b/Logs.hs @@ -35,6 +35,7 @@ topLevelUUIDBasedLogs = , trustLog , groupLog , preferredContentLog + , requiredContentLog , scheduleLog ] @@ -70,6 +71,9 @@ groupLog = "group.log" preferredContentLog :: FilePath preferredContentLog = "preferred-content.log" +requiredContentLog :: FilePath +requiredContentLog = "required-content.log" + groupPreferredContentLog :: FilePath groupPreferredContentLog = "group-preferred-content.log" diff --git a/Logs/PreferredContent.hs b/Logs/PreferredContent.hs index 5580c062db..480ac2e6dd 100644 --- a/Logs/PreferredContent.hs +++ b/Logs/PreferredContent.hs @@ -28,14 +28,14 @@ import qualified Annex.Branch import qualified Annex import Logs import Logs.UUIDBased -import qualified Utility.Matcher +import Utility.Matcher hiding (tokens) import Annex.FileMatcher import Annex.UUID -import Types.Limit import Types.Group import Types.Remote (RemoteConfig) import Logs.Group import Logs.Remote +import Types.FileMatcher import Types.StandardGroups import Limit @@ -50,12 +50,12 @@ isPreferredContent mu notpresent mkey afile def = do Just matcher -> checkMatcher matcher mkey afile notpresent def {- The map is cached for speed. -} -preferredContentMap :: Annex Annex.PreferredContentMap +preferredContentMap :: Annex (FileMatcherMap Annex) preferredContentMap = maybe preferredContentMapLoad return =<< Annex.getState Annex.preferredcontentmap {- Loads the map, updating the cache. -} -preferredContentMapLoad :: Annex Annex.PreferredContentMap +preferredContentMapLoad :: Annex (FileMatcherMap Annex) preferredContentMapLoad = do groupmap <- groupMap configmap <- readRemoteLog @@ -75,11 +75,11 @@ makeMatcher -> M.Map Group PreferredContentExpression -> UUID -> PreferredContentExpression - -> FileMatcher + -> FileMatcher Annex makeMatcher groupmap configmap groupwantedmap u = go True True where go expandstandard expandgroupwanted expr - | null (lefts tokens) = Utility.Matcher.generate $ rights tokens + | null (lefts tokens) = generate $ rights tokens | otherwise = unknownMatcher u where tokens = exprParser matchstandard matchgroupwanted groupmap configmap (Just u) expr @@ -102,10 +102,10 @@ makeMatcher groupmap configmap groupwantedmap u = go True True - - This avoid unwanted/expensive changes to the content, until the problem - is resolved. -} -unknownMatcher :: UUID -> FileMatcher -unknownMatcher u = Utility.Matcher.generate [present] +unknownMatcher :: UUID -> FileMatcher Annex +unknownMatcher u = generate [present] where - present = Utility.Matcher.Operation $ matchPresent (Just u) + present = Operation $ matchPresent (Just u) {- Checks if an expression can be parsed, if not returns Just error -} checkPreferredContentExpression :: PreferredContentExpression -> Maybe String diff --git a/Types/FileMatcher.hs b/Types/FileMatcher.hs index e2d4eadc1b..03a86a38c6 100644 --- a/Types/FileMatcher.hs +++ b/Types/FileMatcher.hs @@ -7,7 +7,12 @@ 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 @@ -17,3 +22,19 @@ 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/Limit.hs b/Types/Limit.hs deleted file mode 100644 index 2b009a7585..0000000000 --- a/Types/Limit.hs +++ /dev/null @@ -1,20 +0,0 @@ -{- types for limits - - - - Copyright 2013 Joey Hess - - - - Licensed under the GNU GPL version 3 or higher. - -} - -{-# LANGUAGE CPP #-} - -module Types.Limit where - -import Common.Annex -import Types.FileMatcher - -import qualified Data.Set as S - -type MkLimit = String -> Either String MatchFiles - -type AssumeNotPresent = S.Set UUID -type MatchFiles = AssumeNotPresent -> MatchInfo -> Annex Bool From f2ddf9a299d8ee8a18f21f8278ba6cf634581397 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sat, 29 Mar 2014 14:46:27 -0400 Subject: [PATCH 106/308] reload preferred content when group preferred content log changes --- Assistant/Threads/ConfigMonitor.hs | 1 + 1 file changed, 1 insertion(+) diff --git a/Assistant/Threads/ConfigMonitor.hs b/Assistant/Threads/ConfigMonitor.hs index a92c7d7859..d143c09460 100644 --- a/Assistant/Threads/ConfigMonitor.hs +++ b/Assistant/Threads/ConfigMonitor.hs @@ -65,6 +65,7 @@ configFilesActions = -- Preferred content settings depend on most of the other configs, -- so will be reloaded whenever any configs change. , (preferredContentLog, noop) + , (groupPreferredContentLog, noop) ] reloadConfigs :: Configs -> Assistant () From 065248f3d2e8da18935b875a34aacc1110805475 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sat, 29 Mar 2014 15:20:55 -0400 Subject: [PATCH 107/308] Added required content configuration. This includes checking when dropping files that any required content configuration is satisfied. However, it does not yet include an active check on the required content; the location log is trusted when checking the required content expression. --- Assistant/Threads/ConfigMonitor.hs | 7 +++-- Command/Drop.hs | 47 ++++++++++++++++++++++-------- Command/DropUnused.hs | 2 +- Command/Vicfg.hs | 17 ++++++++++- Logs/PreferredContent.hs | 47 ++++++++++++++++++++---------- Logs/PreferredContent/Raw.hs | 21 ++++++++++--- Utility/Matcher.hs | 2 +- debian/changelog | 1 + doc/required_content.mdwn | 17 +++++++++++ doc/todo/required_content.mdwn | 16 ++++++++++ 10 files changed, 140 insertions(+), 37 deletions(-) create mode 100644 doc/required_content.mdwn diff --git a/Assistant/Threads/ConfigMonitor.hs b/Assistant/Threads/ConfigMonitor.hs index d143c09460..d02e53db55 100644 --- a/Assistant/Threads/ConfigMonitor.hs +++ b/Assistant/Threads/ConfigMonitor.hs @@ -62,16 +62,17 @@ configFilesActions = , (groupLog, void $ liftAnnex groupMapLoad) , (numcopiesLog, void $ liftAnnex globalNumCopiesLoad) , (scheduleLog, void updateScheduleLog) - -- Preferred content settings depend on most of the other configs, - -- so will be reloaded whenever any configs change. + -- 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 preferredContentMapLoad + 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. -} diff --git a/Command/Drop.hs b/Command/Drop.hs index f6c1880e9b..269c4c26be 100644 --- a/Command/Drop.hs +++ b/Command/Drop.hs @@ -14,11 +14,14 @@ 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"] @@ -50,7 +53,7 @@ startLocal afile numcopies key knownpresentremote = stopUnless (inAnnex key) $ d startRemote :: AssociatedFile -> NumCopies -> Key -> Remote -> CommandStart startRemote afile numcopies key remote = do showStart' ("drop " ++ Remote.name remote) key afile - next $ performRemote key numcopies remote + next $ performRemote key afile numcopies remote performLocal :: Key -> AssociatedFile -> NumCopies -> Maybe Remote -> CommandPerform performLocal key afile numcopies knownpresentremote = lockContent key $ do @@ -60,7 +63,8 @@ performLocal key afile numcopies knownpresentremote = lockContent key $ do Just r -> nub (Remote.uuid r:trusteduuids) untrusteduuids <- trustGet UnTrusted let tocheck = Remote.remotesWithoutUUID remotes (trusteduuids'++untrusteduuids) - ifM (canDropKey key numcopies trusteduuids' tocheck []) + u <- getUUID + ifM (canDrop u key afile numcopies trusteduuids' tocheck []) ( do removeAnnex key notifyDrop afile True @@ -70,8 +74,8 @@ performLocal key afile numcopies knownpresentremote = lockContent key $ do stop ) -performRemote :: Key -> NumCopies -> Remote -> CommandPerform -performRemote key numcopies remote = lockContent key $ do +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. @@ -83,7 +87,7 @@ performRemote key numcopies remote = lockContent key $ do untrusteduuids <- trustGet UnTrusted let tocheck = filter (/= remote) $ Remote.remotesWithoutUUID remotes (have++untrusteduuids) - stopUnless (canDropKey key numcopies have tocheck [uuid]) $ do + stopUnless (canDrop uuid key afile numcopies have tocheck [uuid]) $ do ok <- Remote.removeKey remote key next $ cleanupRemote key remote ok where @@ -102,13 +106,19 @@ cleanupRemote key remote ok = do {- 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. -} -canDropKey :: Key -> NumCopies -> [UUID] -> [Remote] -> [UUID] -> Annex Bool -canDropKey key numcopies have check skip = do - force <- Annex.getState Annex.force - if force || numcopies == NumCopies 0 - then return True - else findCopies key numcopies skip have check + - 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 [] [] @@ -144,6 +154,19 @@ notEnoughCopies key need have skip bad = do 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 diff --git a/Command/DropUnused.hs b/Command/DropUnused.hs index 5d1923d343..ce49795c92 100644 --- a/Command/DropUnused.hs +++ b/Command/DropUnused.hs @@ -34,7 +34,7 @@ perform numcopies key = maybe droplocal dropremote =<< Remote.byNameWithUUID =<< where dropremote r = do showAction $ "from " ++ Remote.name r - Command.Drop.performRemote key numcopies r + Command.Drop.performRemote key Nothing numcopies r droplocal = Command.Drop.performLocal key Nothing numcopies Nothing from = Annex.getField $ optionName Command.Drop.dropFromOption diff --git a/Command/Vicfg.hs b/Command/Vicfg.hs index c62769c955..d7d5229da2 100644 --- a/Command/Vicfg.hs +++ b/Command/Vicfg.hs @@ -61,6 +61,7 @@ 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] } @@ -70,6 +71,7 @@ getCfg = Cfg <$> trustMapRaw -- without local trust overrides <*> (groupsByUUID <$> groupMap) <*> preferredContentMapRaw + <*> requiredContentMapRaw <*> groupPreferredContentMapRaw <*> scheduleMap @@ -79,6 +81,7 @@ setCfg curcfg newcfg = do 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 @@ -87,6 +90,7 @@ diffCfg curcfg newcfg = Cfg { cfgTrustMap = diff cfgTrustMap , cfgGroupMap = diff cfgGroupMap , cfgPreferredContentMap = diff cfgPreferredContentMap + , cfgRequiredContentMap = diff cfgRequiredContentMap , cfgGroupPreferredContentMap = diff cfgGroupPreferredContentMap , cfgScheduleMap = diff cfgScheduleMap } @@ -102,6 +106,7 @@ genCfg cfg descs = unlines $ intercalate [""] , preferredcontent , grouppreferredcontent , standardgroups + , requiredcontent , schedule ] where @@ -137,6 +142,11 @@ genCfg cfg descs = unlines $ intercalate [""] [ com "Repository preferred contents" ] (\(s, u) -> line "wanted" u s) (\u -> line "wanted" u "standard") + + requiredcontent = settings cfg descs cfgRequiredContentMap + [ com "Repository required contents" ] + (\(s, u) -> line "required" u s) + (\u -> line "required" u "") grouppreferredcontent = settings' cfg allgroups cfgGroupPreferredContentMap [ com "Group preferred contents" @@ -228,6 +238,12 @@ parseCfg curcfg = go [] curcfg . lines 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 @@ -255,7 +271,6 @@ parseCfg curcfg = go [] curcfg . lines [ 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: " diff --git a/Logs/PreferredContent.hs b/Logs/PreferredContent.hs index 480ac2e6dd..ead303f1f4 100644 --- a/Logs/PreferredContent.hs +++ b/Logs/PreferredContent.hs @@ -6,16 +6,19 @@ -} module Logs.PreferredContent ( - preferredContentLog, preferredContentSet, + requiredContentSet, groupPreferredContentSet, isPreferredContent, + isRequiredContent, preferredContentMap, - preferredContentMapLoad, preferredContentMapRaw, + requiredContentMap, + requiredContentMapRaw, groupPreferredContentMapRaw, checkPreferredContentExpression, setStandardGroup, + preferredRequiredMapsLoad, ) where import qualified Data.Map as M @@ -42,29 +45,43 @@ 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 mu notpresent mkey afile def = do +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 <- preferredContentMap + m <- getmap case M.lookup u m of Nothing -> return def Just matcher -> checkMatcher matcher mkey afile notpresent def -{- The map is cached for speed. -} preferredContentMap :: Annex (FileMatcherMap Annex) -preferredContentMap = maybe preferredContentMapLoad return +preferredContentMap = maybe (fst <$> preferredRequiredMapsLoad) return =<< Annex.getState Annex.preferredcontentmap -{- Loads the map, updating the cache. -} -preferredContentMapLoad :: Annex (FileMatcherMap Annex) -preferredContentMapLoad = do +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 - groupwantedmap <- groupPreferredContentMapRaw - m <- simpleMap - . parseLogWithUUID ((Just .) . makeMatcher groupmap configmap groupwantedmap) - <$> Annex.Branch.get preferredContentLog - Annex.changeState $ \s -> s { Annex.preferredcontentmap = Just m } - return m + 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 diff --git a/Logs/PreferredContent/Raw.hs b/Logs/PreferredContent/Raw.hs index ce91c2dcdd..bbf5a1edc1 100644 --- a/Logs/PreferredContent/Raw.hs +++ b/Logs/PreferredContent/Raw.hs @@ -21,14 +21,23 @@ import Types.Group {- Changes the preferred content configuration of a remote. -} preferredContentSet :: UUID -> PreferredContentExpression -> Annex () -preferredContentSet uuid@(UUID _) val = do +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 preferredContentLog $ + Annex.Branch.change logfile $ showLog id . changeLog ts uuid val . parseLog Just - Annex.changeState $ \s -> s { Annex.preferredcontentmap = Nothing } -preferredContentSet NoUUID _ = error "unknown UUID; cannot modify" + 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 () @@ -44,6 +53,10 @@ 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/Utility/Matcher.hs b/Utility/Matcher.hs index e0a51ff6ab..eabc585f4c 100644 --- a/Utility/Matcher.hs +++ b/Utility/Matcher.hs @@ -19,7 +19,7 @@ module Utility.Matcher ( Token(..), - Matcher, + Matcher(..), token, tokens, generate, diff --git a/debian/changelog b/debian/changelog index 53d653adcc..70d90dd6d7 100644 --- a/debian/changelog +++ b/debian/changelog @@ -27,6 +27,7 @@ git-annex (5.20140321) UNRELEASED; urgency=medium 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. -- Joey Hess Fri, 21 Mar 2014 14:08:41 -0400 diff --git a/doc/required_content.mdwn b/doc/required_content.mdwn new file mode 100644 index 0000000000..91c5614a80 --- /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/todo/required_content.mdwn b/doc/todo/required_content.mdwn index 851e652aeb..6afeee5c9a 100644 --- a/doc/todo/required_content.mdwn +++ b/doc/todo/required_content.mdwn @@ -5,3 +5,19 @@ 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]] From be76a0e22cf69991e7c8be3f4ca21b17a084034f Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sun, 30 Mar 2014 18:43:05 -0400 Subject: [PATCH 108/308] avoid importing Common it caused a loop when reusing this in propellor --- Utility/FileMode.hs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Utility/FileMode.hs b/Utility/FileMode.hs index d8fb866aeb..26692b3bad 100644 --- a/Utility/FileMode.hs +++ b/Utility/FileMode.hs @@ -9,8 +9,8 @@ module Utility.FileMode where -import Common - +import System.IO +import Control.Monad import Control.Exception (bracket) import System.PosixCompat.Types #ifndef mingw32_HOST_OS @@ -18,6 +18,8 @@ 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 From 683390bf7c8a7af6555a063a4aae151c7b83b97a Mon Sep 17 00:00:00 2001 From: "https://www.google.com/accounts/o8/id?id=AItOawmNu4V5fvpLlBhaCUfXXOB0MI5NXwh8SkU" Date: Mon, 31 Mar 2014 03:18:43 +0000 Subject: [PATCH 109/308] Added a comment: Confused --- ...mment_5_f6128fe75ff3453747f69f12e0fd0a5b._comment | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 doc/forum/2_clients_using_an_encrypted_server_for_syncing_-_possible__63__/comment_5_f6128fe75ff3453747f69f12e0fd0a5b._comment 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 0000000000..8dcddbeef5 --- /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. +"""]] From 17cf82d8de0e9d930649f10d49f2c3d92c12182c Mon Sep 17 00:00:00 2001 From: "http://johan.kiviniemi.name/" Date: Mon, 31 Mar 2014 03:42:42 +0000 Subject: [PATCH 110/308] Added a comment: Another race condition --- ..._8f56b8661a600729d7a9d569e8a0ba70._comment | 55 +++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 doc/bugs/Race_condition_between_watch__47__assistant_and_addurl/comment_1_8f56b8661a600729d7a9d569e8a0ba70._comment 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 0000000000..cf010cd253 --- /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. +\"\"\"]] + +"""]] From 6a380913129fa901a8c7b2100b58f18d88ad5635 Mon Sep 17 00:00:00 2001 From: "https://id.koumbit.net/anarcat" Date: Mon, 31 Mar 2014 15:11:56 +0000 Subject: [PATCH 111/308] add xfce --- doc/tips/file_manager_integration.mdwn | 45 ++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/doc/tips/file_manager_integration.mdwn b/doc/tips/file_manager_integration.mdwn index 73705d7fb1..1b958da0ad 100644 --- a/doc/tips/file_manager_integration.mdwn +++ b/doc/tips/file_manager_integration.mdwn @@ -1,6 +1,8 @@ Integrating git-annex and your file manager provides an easy way to select annexed files to get or drop. +[[!toc]] + ## nautilus Recent git-annex comes with built-in nautilus integration. Just pick the @@ -37,6 +39,49 @@ Create a file `~/.kde4/share/kde4/services/ServiceMenus/git-annex.desktop` with Icon=git-annex Exec=git-annex drop --notify-start --notify-finish %U +## thunar / XFCE + +XFCE uses the Thunar file manager, which can also be easily configured to allow for custom actions. Just go to the "Configure custom actions..." item in the "Edit" menu, and create a custom action for get and drop with the following commands: + + git-annex drop --notify-start --notify-finish %F + +for drop, and for get: + + git-annex drop --notify-start --notify-finish %F + +This gives me the resulting config on disk, in `.config/Thunar/uca.xml`: + + + git-annex + git-annex get + 1396278104182858-3 + git-annex get --notify-start --notify-finish %F + get the files from a remote git annex repository + * + + + + + + + + + git-annex + git-annex drop + 1396278093174843-2 + git-annex drop --notify-start --notify-finish %F + drop the files from the local repository + * + + + + + + + + +The complete instructions on how to setup actions is [in the XFCE documentation](http://docs.xfce.org/xfce/thunar/custom-actions). + ## your file manager here Edit this page and add instructions! From 607b6f432061d9e62c5569ad4e3a00c1712f80f2 Mon Sep 17 00:00:00 2001 From: "https://id.koumbit.net/anarcat" Date: Mon, 31 Mar 2014 15:14:07 +0000 Subject: [PATCH 112/308] make titles uniform --- doc/tips/file_manager_integration.mdwn | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/tips/file_manager_integration.mdwn b/doc/tips/file_manager_integration.mdwn index 1b958da0ad..8dd7fd0621 100644 --- a/doc/tips/file_manager_integration.mdwn +++ b/doc/tips/file_manager_integration.mdwn @@ -3,7 +3,7 @@ annexed files to get or drop. [[!toc]] -## nautilus +## GNOME (nautilus) Recent git-annex comes with built-in nautilus integration. Just pick the action from the menu. @@ -39,7 +39,7 @@ Create a file `~/.kde4/share/kde4/services/ServiceMenus/git-annex.desktop` with Icon=git-annex Exec=git-annex drop --notify-start --notify-finish %U -## thunar / XFCE +## 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: From ee80d1451edbcef78f4a1b9cb41b90766a8055ef Mon Sep 17 00:00:00 2001 From: "https://id.koumbit.net/anarcat" Date: Mon, 31 Mar 2014 15:16:35 +0000 Subject: [PATCH 113/308] link to roadmap --- doc/todo.mdwn | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/todo.mdwn b/doc/todo.mdwn index 79552298b6..62224c3bef 100644 --- a/doc/todo.mdwn +++ b/doc/todo.mdwn @@ -1,4 +1,4 @@ -This is git-annex's todo list. Link items to [[todo/done]] when done. +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]] From 138c39563663ee0d9ba4f5daa63858f55f488e6d Mon Sep 17 00:00:00 2001 From: bvaa Date: Mon, 31 Mar 2014 16:34:10 +0000 Subject: [PATCH 114/308] --- doc/forum/ignore_changes_made_by_a_remote.mdwn | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 doc/forum/ignore_changes_made_by_a_remote.mdwn diff --git a/doc/forum/ignore_changes_made_by_a_remote.mdwn b/doc/forum/ignore_changes_made_by_a_remote.mdwn new file mode 100644 index 0000000000..3659774b4c --- /dev/null +++ b/doc/forum/ignore_changes_made_by_a_remote.mdwn @@ -0,0 +1,8 @@ +Hi, + +I have two repo one in direct (on windows) and one in indirect mode. From time to time the files in the direct repo are replaced by empty files however running git annex fsck always solves it. +The problem is that today I did run git annex sync before running git annex fsck and git annex has then created two -variants for each of my files one empty and one with the content. +I guess the easier for me is to just scrap that repo and make a new one however how do I prevent the changes to propagate now? I guess that if I now run git annex sync on my other repo all those small files are going to have linked created for them there as well. + +I hope this is clear, +Thanks in advance. From 2f12c376a0bb396dff912fe5eec8806e28e7d6c2 Mon Sep 17 00:00:00 2001 From: "http://ypid.wordpress.com/" Date: Mon, 31 Mar 2014 17:49:13 +0000 Subject: [PATCH 115/308] =?UTF-8?q?=E2=80=9E.=E2=80=9C=20does=20not=20seem?= =?UTF-8?q?=20to=20be=20a=20valid=20alias=20for=20here=20in=20current=20ve?= =?UTF-8?q?rsion=20(5.20140306~bpo70+1).?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/preferred_content.mdwn | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/preferred_content.mdwn b/doc/preferred_content.mdwn index 9829fc687d..4cab5721d2 100644 --- a/doc/preferred_content.mdwn +++ b/doc/preferred_content.mdwn @@ -33,7 +33,7 @@ If it doesn't, the repository wants to drop its content 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 +For example, "git annex find --want-get --not --in here" 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. From 90e9b8188bbfcabbf6ae8d113f748428c535ea35 Mon Sep 17 00:00:00 2001 From: "http://ypid.wordpress.com/" Date: Mon, 31 Mar 2014 17:51:21 +0000 Subject: [PATCH 116/308] Typeset command in markdown code mode. --- doc/preferred_content.mdwn | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/preferred_content.mdwn b/doc/preferred_content.mdwn index 4cab5721d2..b90d2408b9 100644 --- a/doc/preferred_content.mdwn +++ b/doc/preferred_content.mdwn @@ -33,9 +33,9 @@ If it doesn't, the repository wants to drop its content 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 here" 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" +For example, `git annex find --want-get --not --in here` will find all the +files that `git annex get --auto` will want to get, and `git annex find +--want-drop --in here` will find all the files that `git annex drop --auto` will want to drop. The expressions are very similar to the matching options documented From 18970377df6861a2a6e292289afaca81e2cc9e84 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Mon, 31 Mar 2014 20:15:01 -0400 Subject: [PATCH 117/308] typo --- doc/git-annex.mdwn | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/git-annex.mdwn b/doc/git-annex.mdwn index 51f618d0a6..987a9ffef2 100644 --- a/doc/git-annex.mdwn +++ b/doc/git-annex.mdwn @@ -1715,7 +1715,7 @@ 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 repsitory will be run whenever +`.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. From bbd2efede3ce91011e0688ed09194d767ecfe853 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Mon, 31 Mar 2014 20:15:16 -0400 Subject: [PATCH 118/308] refactor --- Utility/FileMode.hs | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/Utility/FileMode.hs b/Utility/FileMode.hs index 26692b3bad..4302f8bd14 100644 --- a/Utility/FileMode.hs +++ b/Utility/FileMode.hs @@ -58,6 +58,12 @@ 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 @@ -147,9 +153,5 @@ setSticky f = modifyFileMode f $ addModes [stickyMode] writeFileProtected :: FilePath -> String -> IO () writeFileProtected file content = withUmask 0o0077 $ withFile file WriteMode $ \h -> do - void $ tryIO $ modifyFileMode file $ - removeModes - [ groupReadMode, otherReadMode - , groupWriteMode, otherWriteMode - ] + void $ tryIO $ modifyFileMode file $ removeModes otherGroupModes hPutStr h content From ec3ebcf2ae3a42b5f0e7e8b4530412806a2e996c Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Mon, 31 Mar 2014 20:53:16 -0400 Subject: [PATCH 119/308] update --- doc/todo/tahoe_lfs_for_reals.mdwn | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/doc/todo/tahoe_lfs_for_reals.mdwn b/doc/todo/tahoe_lfs_for_reals.mdwn index e5b4a841d3..2caeef11d3 100644 --- a/doc/todo/tahoe_lfs_for_reals.mdwn +++ b/doc/todo/tahoe_lfs_for_reals.mdwn @@ -12,10 +12,12 @@ 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 2 known +> 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]] From b2f244125780eb994090fab0d55e4cde4693d710 Mon Sep 17 00:00:00 2001 From: "http://johan.kiviniemi.name/" Date: Tue, 1 Apr 2014 03:25:52 +0000 Subject: [PATCH 120/308] --- ...er_and_over_and_using_a_lot_of_memory.mdwn | 520 ++++++++++++++++++ 1 file changed, 520 insertions(+) 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 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 0000000000..954d26ec23 --- /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 +"""]] From 48f2e9efbb76cac3e48c66c981d6cca0367d5f80 Mon Sep 17 00:00:00 2001 From: "https://id.koumbit.net/anarcat" Date: Tue, 1 Apr 2014 04:02:33 +0000 Subject: [PATCH 121/308] some crazy idea --- doc/forum/unrelated_repositories_sync.mdwn | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 doc/forum/unrelated_repositories_sync.mdwn diff --git a/doc/forum/unrelated_repositories_sync.mdwn b/doc/forum/unrelated_repositories_sync.mdwn new file mode 100644 index 0000000000..d9bcbd12d1 --- /dev/null +++ b/doc/forum/unrelated_repositories_sync.mdwn @@ -0,0 +1,13 @@ +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]] From 9fd87b27a167a166454a5580b9ce7bdbea71ca7d Mon Sep 17 00:00:00 2001 From: "https://id.koumbit.net/anarcat" Date: Tue, 1 Apr 2014 04:18:11 +0000 Subject: [PATCH 122/308] Added a comment --- ...mment_2_bd64a53914107bc000c887b4d4bdf6af._comment | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 doc/tips/automatically_adding_metadata/comment_2_bd64a53914107bc000c887b4d4bdf6af._comment 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 0000000000..13b3865e10 --- /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 +"""]] From f3dda31c83cfc6756b2aa6b4e3c701490375c10f Mon Sep 17 00:00:00 2001 From: "https://id.koumbit.net/anarcat" Date: Tue, 1 Apr 2014 04:20:29 +0000 Subject: [PATCH 123/308] that underscore is a typo, or there's something i don't get because it fails here --- doc/tips/automatically_adding_metadata.mdwn | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/tips/automatically_adding_metadata.mdwn b/doc/tips/automatically_adding_metadata.mdwn index c3f50bb39f..f2a3bc02d9 100644 --- a/doc/tips/automatically_adding_metadata.mdwn +++ b/doc/tips/automatically_adding_metadata.mdwn @@ -17,7 +17,7 @@ like photos, mp3s, etc. 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 ' ' _` +To get a list of all possible fields, run: `extract -L | sed ' '` 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. From b9e1aa2b345a3fc21af98cc449818d55c8cfc1a9 Mon Sep 17 00:00:00 2001 From: "https://id.koumbit.net/anarcat" Date: Tue, 1 Apr 2014 04:21:58 +0000 Subject: [PATCH 124/308] i think i understand what that sed meant --- doc/tips/automatically_adding_metadata.mdwn | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/tips/automatically_adding_metadata.mdwn b/doc/tips/automatically_adding_metadata.mdwn index f2a3bc02d9..e6d02defa7 100644 --- a/doc/tips/automatically_adding_metadata.mdwn +++ b/doc/tips/automatically_adding_metadata.mdwn @@ -17,7 +17,7 @@ like photos, mp3s, etc. 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 ' '` +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. From 29b3ca1241fb32033802f23169e484501884be24 Mon Sep 17 00:00:00 2001 From: "https://id.koumbit.net/anarcat" Date: Tue, 1 Apr 2014 04:25:40 +0000 Subject: [PATCH 125/308] --- doc/forum/unrelated_repositories_sync.mdwn | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/forum/unrelated_repositories_sync.mdwn b/doc/forum/unrelated_repositories_sync.mdwn index d9bcbd12d1..030fb380d7 100644 --- a/doc/forum/unrelated_repositories_sync.mdwn +++ b/doc/forum/unrelated_repositories_sync.mdwn @@ -11,3 +11,5 @@ In fact, I'm not even sure what the right thing would be here, I guess that's th 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... From 96f291d6b1cebea4765e25ac207ab0ac1fe35708 Mon Sep 17 00:00:00 2001 From: "https://id.koumbit.net/anarcat" Date: Tue, 1 Apr 2014 04:27:37 +0000 Subject: [PATCH 126/308] --- doc/todo/Bittorrent-like_features.mdwn | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/todo/Bittorrent-like_features.mdwn b/doc/todo/Bittorrent-like_features.mdwn index 41988a422f..1dfe2c627a 100644 --- a/doc/todo/Bittorrent-like_features.mdwn +++ b/doc/todo/Bittorrent-like_features.mdwn @@ -29,6 +29,8 @@ Another thing, this would be completely trackerless. You just use remote groups 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) ================================================= From 6be93e3f259393b14ccf1d545f6cafd7a803ba56 Mon Sep 17 00:00:00 2001 From: "https://id.koumbit.net/anarcat" Date: Tue, 1 Apr 2014 04:43:20 +0000 Subject: [PATCH 127/308] Added a comment --- ..._194dd0e8404ea72af9fb6ff34b994998._comment | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 doc/todo/Bittorrent-like_features/comment_5_194dd0e8404ea72af9fb6ff34b994998._comment 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 0000000000..620c82e973 --- /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. +"""]] From 33eafda27607dbb2c19dcc06dac511be1a0e2096 Mon Sep 17 00:00:00 2001 From: "https://www.google.com/accounts/o8/id?id=AItOawn_3tllXjSmtgm__aGr9Z4gVNFgJgGyJ30" Date: Tue, 1 Apr 2014 06:39:18 +0000 Subject: [PATCH 128/308] --- ...n_failures_for___42____42____42____42____42__.mdwn | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 doc/forum/rsync.net:_Too_many_authentication_failures_for___42____42____42____42____42__.mdwn 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 0000000000..12212e13b5 --- /dev/null +++ b/doc/forum/rsync.net:_Too_many_authentication_failures_for___42____42____42____42____42__.mdwn @@ -0,0 +1,11 @@ +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 From d6bc97e1d049d81a61569ccb830cc4401cd1aa66 Mon Sep 17 00:00:00 2001 From: "https://www.google.com/accounts/o8/id?id=AItOawn_3tllXjSmtgm__aGr9Z4gVNFgJgGyJ30" Date: Tue, 1 Apr 2014 06:41:12 +0000 Subject: [PATCH 129/308] --- ...hentication_failures_for___42____42____42____42____42__.mdwn | 2 ++ 1 file changed, 2 insertions(+) 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 index 12212e13b5..2a22d6ee78 100644 --- 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 @@ -9,3 +9,5 @@ Any ideas? Is the problem sitting in front of the computer? Is it a bug? Thanks. David + +This is happening on Mavericks (10.9) From c6548ea56a4ea691a1c036c29c92640909ecd00c Mon Sep 17 00:00:00 2001 From: "https://www.google.com/accounts/o8/id?id=AItOawk9nck8WX8-ADF3Fdh5vFo4Qrw1I_bJcR8" Date: Tue, 1 Apr 2014 08:01:02 +0000 Subject: [PATCH 130/308] Added a comment --- ...t_2_e772ea0383ac690cbcbcf125258986cf._comment | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 doc/forum/How_to_know_why_is_git-annex_uploading_a_file_to_a_transfer_repository/comment_2_e772ea0383ac690cbcbcf125258986cf._comment 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 0000000000..27f158ea1e --- /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. +"""]] From ed06db1b94749d6db0ed67401b48e69e70845e9d Mon Sep 17 00:00:00 2001 From: "https://www.google.com/accounts/o8/id?id=AItOawk9nck8WX8-ADF3Fdh5vFo4Qrw1I_bJcR8" Date: Tue, 1 Apr 2014 08:04:51 +0000 Subject: [PATCH 131/308] Added a comment --- ...comment_2_4031c16362137747717e9595cb5c8a15._comment | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 doc/bugs/Crash_when_disabling_syncing_in_the_webapp/comment_2_4031c16362137747717e9595cb5c8a15._comment 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 0000000000..07efa451d7 --- /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. +"""]] From 574afcc363789db75a4e9fe7e302e054d2ff6c32 Mon Sep 17 00:00:00 2001 From: "https://www.google.com/accounts/o8/id?id=AItOawmdbVIGiDH8KarAGAy8y2FHJD_F990JzXI" Date: Tue, 1 Apr 2014 08:52:05 +0000 Subject: [PATCH 132/308] removed --- .../comment_2_4c277d3d78f33ca19228d765d13fcf32._comment | 8 -------- 1 file changed, 8 deletions(-) delete mode 100644 doc/bugs/problem_to_addurl_--file_with_ftp/comment_2_4c277d3d78f33ca19228d765d13fcf32._comment diff --git a/doc/bugs/problem_to_addurl_--file_with_ftp/comment_2_4c277d3d78f33ca19228d765d13fcf32._comment b/doc/bugs/problem_to_addurl_--file_with_ftp/comment_2_4c277d3d78f33ca19228d765d13fcf32._comment deleted file mode 100644 index 610599b85c..0000000000 --- a/doc/bugs/problem_to_addurl_--file_with_ftp/comment_2_4c277d3d78f33ca19228d765d13fcf32._comment +++ /dev/null @@ -1,8 +0,0 @@ -[[!comment format=mdwn - username="https://www.google.com/accounts/o8/id?id=AItOawmdbVIGiDH8KarAGAy8y2FHJD_F990JzXI" - nickname="François" - subject="comment 2" - date="2014-03-27T20:03:46Z" - content=""" -So do you have an idea where the problem could be? I have tried 2 other ftp servers on a different system and a different network with consistent results, `git annex addurl ftp://...` always works and `git annex addurl ftp://... --file` always returns the same error. -"""]] From 0c1ef268aee2216f0d38c64367e7c444dbb07639 Mon Sep 17 00:00:00 2001 From: "https://www.google.com/accounts/o8/id?id=AItOawmdbVIGiDH8KarAGAy8y2FHJD_F990JzXI" Date: Tue, 1 Apr 2014 08:55:30 +0000 Subject: [PATCH 133/308] Added a comment --- .../comment_2_c85266a9359a9f45e632f31c016a45dc._comment | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 doc/bugs/problem_to_addurl_--file_with_ftp/comment_2_c85266a9359a9f45e632f31c016a45dc._comment diff --git a/doc/bugs/problem_to_addurl_--file_with_ftp/comment_2_c85266a9359a9f45e632f31c016a45dc._comment b/doc/bugs/problem_to_addurl_--file_with_ftp/comment_2_c85266a9359a9f45e632f31c016a45dc._comment new file mode 100644 index 0000000000..bab883611f --- /dev/null +++ b/doc/bugs/problem_to_addurl_--file_with_ftp/comment_2_c85266a9359a9f45e632f31c016a45dc._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmdbVIGiDH8KarAGAy8y2FHJD_F990JzXI" + nickname="François" + subject="comment 2" + date="2014-04-01T08:55:29Z" + content=""" +Ok, it works when adding option --relaxed. For some reason there seems to be a problem when checking file size. +"""]] From a42da2ed393b86c31e91e3e685538902449e25ed Mon Sep 17 00:00:00 2001 From: "https://www.google.com/accounts/o8/id?id=AItOawmdbVIGiDH8KarAGAy8y2FHJD_F990JzXI" Date: Tue, 1 Apr 2014 09:27:18 +0000 Subject: [PATCH 134/308] --- ...cal_remote_instead_of_broken_link_when_possible__63__.mdwn | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 doc/forum/Link_to_local_remote_instead_of_broken_link_when_possible__63__.mdwn 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 0000000000..dfe8afe2c9 --- /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? From 49a3cd32f19703f015732a174801cfa26e1b531c Mon Sep 17 00:00:00 2001 From: "http://johan.kiviniemi.name/" Date: Tue, 1 Apr 2014 10:04:59 +0000 Subject: [PATCH 135/308] Protect file parameters with -- --- doc/tips/file_manager_integration.mdwn | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/doc/tips/file_manager_integration.mdwn b/doc/tips/file_manager_integration.mdwn index 8dd7fd0621..1a1a557fcb 100644 --- a/doc/tips/file_manager_integration.mdwn +++ b/doc/tips/file_manager_integration.mdwn @@ -32,22 +32,22 @@ Create a file `~/.kde4/share/kde4/services/ServiceMenus/git-annex.desktop` with [Desktop Action GitAnnexGet] Name=Get Icon=git-annex - Exec=git-annex get --notify-start --notify-finish %U + 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 + 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 + git-annex drop --notify-start --notify-finish -- %F for drop, and for get: - git-annex drop --notify-start --notify-finish %F + git-annex drop --notify-start --notify-finish -- %F This gives me the resulting config on disk, in `.config/Thunar/uca.xml`: @@ -55,7 +55,7 @@ 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 + git-annex get --notify-start --notify-finish -- %F get the files from a remote git annex repository * @@ -69,7 +69,7 @@ This gives me the resulting config on disk, in `.config/Thunar/uca.xml`: git-annex git-annex drop 1396278093174843-2 - git-annex drop --notify-start --notify-finish %F + git-annex drop --notify-start --notify-finish -- %F drop the files from the local repository * @@ -92,7 +92,7 @@ If your file manager can run a command on a file, it should be easy to integrate git-annex with it. A simple script will suffice: #!/bun/sh - git-annex get --notify-start --notify-finish "$@" + 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 From bc3d40b7a574cec235ee885b12efe0c7e6c354d9 Mon Sep 17 00:00:00 2001 From: "http://ypid.wordpress.com/" Date: Tue, 1 Apr 2014 16:27:29 +0000 Subject: [PATCH 136/308] =?UTF-8?q?=E2=80=9E.=E2=80=9C=20does=20work=20wit?= =?UTF-8?q?h=20the=20most=20current=20version=20(5.20140320~bpo70+1).?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/preferred_content.mdwn | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/preferred_content.mdwn b/doc/preferred_content.mdwn index b90d2408b9..4f6a3409f4 100644 --- a/doc/preferred_content.mdwn +++ b/doc/preferred_content.mdwn @@ -33,9 +33,9 @@ If it doesn't, the repository wants to drop its content 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 here` will find all the +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 here` will find all the files that `git annex drop --auto` +--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 From f439f17a8d5b9bdb3c72e3bd0e7e651fd5cfb9bb Mon Sep 17 00:00:00 2001 From: "http://ypid.wordpress.com/" Date: Tue, 1 Apr 2014 19:14:19 +0000 Subject: [PATCH 137/308] --- ...nt_does_not_allow_spaces_in_filenames.mdwn | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 doc/bugs/preferred_content:_include_statement_does_not_allow_spaces_in_filenames.mdwn 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 0000000000..7715a6f28f --- /dev/null +++ b/doc/bugs/preferred_content:_include_statement_does_not_allow_spaces_in_filenames.mdwn @@ -0,0 +1,29 @@ +### 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\*'*. From 523a98a952cd66f5f4ca3df30d77c60be2372f6c Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Tue, 1 Apr 2014 17:53:55 -0400 Subject: [PATCH 138/308] merge from propellor --- Utility/ThreadScheduler.hs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Utility/ThreadScheduler.hs b/Utility/ThreadScheduler.hs index dbb6cb317d..9d4cfd0a79 100644 --- a/Utility/ThreadScheduler.hs +++ b/Utility/ThreadScheduler.hs @@ -10,8 +10,9 @@ module Utility.ThreadScheduler where -import Common - +import Control.Monad +import Control.Monad.IfElse +import System.Posix.IO import Control.Concurrent #ifndef mingw32_HOST_OS import System.Posix.Signals From 634af5de73c821c8476a49ace9e2219a5534c267 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Tue, 1 Apr 2014 21:15:12 -0400 Subject: [PATCH 139/308] devblog --- doc/devblog/day_143__foolish_hiatus.mdwn | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 doc/devblog/day_143__foolish_hiatus.mdwn diff --git a/doc/devblog/day_143__foolish_hiatus.mdwn b/doc/devblog/day_143__foolish_hiatus.mdwn new file mode 100644 index 0000000000..11305e02c2 --- /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 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! From e02f38138b04376d1071feda06046bf4bfbe0a58 Mon Sep 17 00:00:00 2001 From: "https://www.google.com/accounts/o8/id?id=AItOawk_QeJTzgCJj2ZC8EAJEODsLvxJ7dCOCVM" Date: Wed, 2 Apr 2014 05:36:55 +0000 Subject: [PATCH 140/308] Added a comment: Non-ASCII Hostname fails --- .../comment_8_35c949aca52de83af4881a9da6340185._comment | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 doc/bugs/Use_a_git_repository_on_the_server_don__39__t_work/comment_8_35c949aca52de83af4881a9da6340185._comment diff --git a/doc/bugs/Use_a_git_repository_on_the_server_don__39__t_work/comment_8_35c949aca52de83af4881a9da6340185._comment b/doc/bugs/Use_a_git_repository_on_the_server_don__39__t_work/comment_8_35c949aca52de83af4881a9da6340185._comment new file mode 100644 index 0000000000..7a59e296b7 --- /dev/null +++ b/doc/bugs/Use_a_git_repository_on_the_server_don__39__t_work/comment_8_35c949aca52de83af4881a9da6340185._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawk_QeJTzgCJj2ZC8EAJEODsLvxJ7dCOCVM" + nickname="Sindre" + subject="Non-ASCII Hostname fails" + date="2014-04-02T05:36:54Z" + content=""" +This bug still persists when specifying non-ascii hostnames. +"""]] From d5b8154a82d203289823be30f34e404164b97f09 Mon Sep 17 00:00:00 2001 From: "https://www.google.com/accounts/o8/id?id=AItOawk_QeJTzgCJj2ZC8EAJEODsLvxJ7dCOCVM" Date: Wed, 2 Apr 2014 08:25:28 +0000 Subject: [PATCH 141/308] Git annex doesn't check if bash-compatible terminal is used when using local pairing --- ...sues_with_non-posix_compatible_shells.mdwn | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 doc/bugs/issues_with_non-posix_compatible_shells.mdwn 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 0000000000..4797fb5693 --- /dev/null +++ b/doc/bugs/issues_with_non-posix_compatible_shells.mdwn @@ -0,0 +1,34 @@ +### 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. +"""]] From 6f83c7233e8f33bacabf154949a0979b108f87e8 Mon Sep 17 00:00:00 2001 From: "http://johan.kiviniemi.name/" Date: Wed, 2 Apr 2014 08:40:43 +0000 Subject: [PATCH 142/308] Added a comment --- .../comment_1_076948499a9d581a50da52b7690e5d4e._comment | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 doc/bugs/issues_with_non-posix_compatible_shells/comment_1_076948499a9d581a50da52b7690e5d4e._comment 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 0000000000..72b3e48e92 --- /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. +"""]] From 6959b961fe9620ab23f5a6c83186194aa3b2d37a Mon Sep 17 00:00:00 2001 From: "yasin.zaehringer" Date: Wed, 2 Apr 2014 11:43:53 +0000 Subject: [PATCH 143/308] Added a comment --- .../comment_3_9ffafbeb572e110b3e072029d1ce177c._comment | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 doc/bugs/_impossible_to_switch_repositories_on_android__in_webapp/comment_3_9ffafbeb572e110b3e072029d1ce177c._comment 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 0000000000..b181a4fa13 --- /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. +"""]] From 8408fef0b52fd1b7d26294f85157140716ec1ccc Mon Sep 17 00:00:00 2001 From: Richard Hartmann Date: Wed, 2 Apr 2014 17:57:29 +0200 Subject: [PATCH 144/308] Typo --- doc/devblog/day_143__foolish_hiatus.mdwn | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/devblog/day_143__foolish_hiatus.mdwn b/doc/devblog/day_143__foolish_hiatus.mdwn index 11305e02c2..f6763dff30 100644 --- a/doc/devblog/day_143__foolish_hiatus.mdwn +++ b/doc/devblog/day_143__foolish_hiatus.mdwn @@ -9,7 +9,7 @@ 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 this shortly, and expect to also publish docker +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. From 5bb475411fcb9707cffd425b9858c234eaa9818c Mon Sep 17 00:00:00 2001 From: "http://mildred.fr/" Date: Wed, 2 Apr 2014 15:58:23 +0000 Subject: [PATCH 145/308] --- ...ata_for_preferred___40__wanted__41___content.mdwn | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 doc/todo/using_file_metadata_for_preferred___40__wanted__41___content.mdwn 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 0000000000..d9226d21f8 --- /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. From a5f923223aa92fd68673b3f30aebc30598e186a7 Mon Sep 17 00:00:00 2001 From: "https://www.google.com/accounts/o8/id?id=AItOawn_3tllXjSmtgm__aGr9Z4gVNFgJgGyJ30" Date: Wed, 2 Apr 2014 15:58:57 +0000 Subject: [PATCH 146/308] Added a comment --- ...omment_1_7754e2cfb72b034effe8642c1b3e593e._comment | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 doc/forum/rsync.net:_Too_many_authentication_failures_for___42____42____42____42____42__/comment_1_7754e2cfb72b034effe8642c1b3e593e._comment 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 0000000000..d29f6482c3 --- /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 +"""]] From f02cf1ab5a2d4007ab6a560ae0407818cea41f16 Mon Sep 17 00:00:00 2001 From: "http://joeyh.name/" Date: Wed, 2 Apr 2014 18:25:17 +0000 Subject: [PATCH 147/308] Added a comment --- .../comment_1_ce0464d5fca6ada9f1477831fd47ce09._comment | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 doc/forum/Link_to_local_remote_instead_of_broken_link_when_possible__63__/comment_1_ce0464d5fca6ada9f1477831fd47ce09._comment 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 0000000000..ee6ec690e9 --- /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]] +"""]] From ea19708e40d079e82931e565e60bdf37dc0abc98 Mon Sep 17 00:00:00 2001 From: "http://joeyh.name/" Date: Wed, 2 Apr 2014 18:45:37 +0000 Subject: [PATCH 148/308] Added a comment --- ...mment_1_ca10638d4b4b178cfd0de8736542c4dc._comment | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 doc/bugs/preferred_content:_include_statement_does_not_allow_spaces_in_filenames/comment_1_ca10638d4b4b178cfd0de8736542c4dc._comment 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 0000000000..a7438c559e --- /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.. +"""]] From e00aa8ed2948583a2e7a79ee46199bd9f2db2258 Mon Sep 17 00:00:00 2001 From: "http://joeyh.name/" Date: Wed, 2 Apr 2014 18:48:51 +0000 Subject: [PATCH 149/308] Added a comment --- ...comment_1_ac8c39e362e6c806b9d68befc0199ccd._comment | 10 ++++++++++ 1 file changed, 10 insertions(+) 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 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 0000000000..e9c5d3fff8 --- /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. +"""]] From 9ce3cc912b004fbffb7d550d60dd464a7dd5def8 Mon Sep 17 00:00:00 2001 From: "http://joeyh.name/" Date: Wed, 2 Apr 2014 19:18:19 +0000 Subject: [PATCH 150/308] Added a comment --- ..._5bba62e1dd4118bcf7e1c990c7009239._comment | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 doc/bugs/problem_to_addurl_--file_with_ftp/comment_3_5bba62e1dd4118bcf7e1c990c7009239._comment diff --git a/doc/bugs/problem_to_addurl_--file_with_ftp/comment_3_5bba62e1dd4118bcf7e1c990c7009239._comment b/doc/bugs/problem_to_addurl_--file_with_ftp/comment_3_5bba62e1dd4118bcf7e1c990c7009239._comment new file mode 100644 index 0000000000..11265f6db2 --- /dev/null +++ b/doc/bugs/problem_to_addurl_--file_with_ftp/comment_3_5bba62e1dd4118bcf7e1c990c7009239._comment @@ -0,0 +1,22 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.244" + subject="comment 3" + date="2014-04-02T19:18:19Z" + content=""" +Yes, --relaxed bypasses the code that uses curl to check the file size. + +Ok, I have figured out what's going on. + +git annex addurl --file foo ftp://host # this succeeds + +run the command a second time, and it fails. Why? Because the file is already present in the annex, and you are running addurl in a different mode. In this mode, it is adding a *new* url to the file in the annex. (In this particular case, the new and old url are the same, but it's possible to see this bug in cases where they are not, too.) + +As a sanity check, when adding a new url to an existing file, git-annex wants to check that the new url has the same size as the file. Otherwise it surely has different content. However, as I noted this ftp server is returning a weird 350 response when curl is used to try to get the size of the url. So that fails, and git-annex cannot add the new url to the file. Which would be pointless in this case anyway, since it's the same as the old url. + +So, I can fix two things. I can make it detect when the url it's adding to an existing file in the annex is already a known url of that file, and skip doing anything in this case since it would be a no-op anyway. Done that. + +And, I can improve the error message so the user is not confused about what they're asking git-annex to do, and why it's unable to. Fixed that. + +This leaves the question of why curl sees a 350 code from this ftp server. But since it doesn't cause problems when using addurl, with or without --file to download the file from it, I think it's best to punt on that one. +"""]] From 1c965f5918294031ef381987264229b797613c26 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Wed, 2 Apr 2014 15:22:39 -0400 Subject: [PATCH 151/308] improve addurl --file behavior in a confusing corner case involving a ftp url --- Command/AddUrl.hs | 25 +++++++++++-------- .../problem_to_addurl_--file_with_ftp.mdwn | 1 + 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/Command/AddUrl.hs b/Command/AddUrl.hs index 1c73cd24ff..b108be5078 100644 --- a/Command/AddUrl.hs +++ b/Command/AddUrl.hs @@ -134,17 +134,20 @@ perform relaxed url file = ifAnnexed file addurl geturl | relaxed = do setUrlPresent key url next $ return True - | otherwise = do - (exists, samesize) <- Url.withUrlOptions $ Url.check url (keySize key) - if exists && samesize - then do - setUrlPresent key url - next $ return True - else do - warning $ 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 + | otherwise = ifM (elem url <$> getUrls key) + ( stop + , do + (exists, samesize) <- Url.withUrlOptions $ Url.check url (keySize key) + if exists && samesize + then do + setUrlPresent key url + next $ return True + else do + warning $ "while adding a new url to an already annexed file, " ++ if exists + then "url does not have expected file size (use --relaxed to bypass this check) " ++ url + else "failed to verify url exists: " ++ url + stop + ) addUrlFile :: Bool -> URLString -> FilePath -> Annex Bool addUrlFile relaxed url file = do diff --git a/doc/bugs/problem_to_addurl_--file_with_ftp.mdwn b/doc/bugs/problem_to_addurl_--file_with_ftp.mdwn index 55a38c0948..99381b9610 100644 --- a/doc/bugs/problem_to_addurl_--file_with_ftp.mdwn +++ b/doc/bugs/problem_to_addurl_--file_with_ftp.mdwn @@ -64,3 +64,4 @@ I am using current git-annex binary linux version on Fedora 19. supported repository version: 5 upgrade supported from repository versions: 0 1 2 4 +> [[done]] --[[Joey]] From 39996f8222a4f3c796af5a752e98147d0e051555 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Wed, 2 Apr 2014 15:30:10 -0400 Subject: [PATCH 152/308] assistant: Adjust 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 fix shell, as well as POSIX shells. --- Assistant/Ssh.hs | 2 +- debian/changelog | 4 ++++ doc/bugs/issues_with_non-posix_compatible_shells.mdwn | 7 +++++++ 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/Assistant/Ssh.hs b/Assistant/Ssh.hs index acb2fc11c6..4dd32f7d92 100644 --- a/Assistant/Ssh.hs +++ b/Assistant/Ssh.hs @@ -197,7 +197,7 @@ authorizedKeysLine gitannexshellonly dir pubkey - long perl script. -} | otherwise = pubkey where - limitcommand = "command=\"GIT_ANNEX_SHELL_DIRECTORY="++shellEscape dir++" ~/.ssh/git-annex-shell\",no-agent-forwarding,no-port-forwarding,no-X11-forwarding,no-pty " + 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 diff --git a/debian/changelog b/debian/changelog index 70d90dd6d7..7148dbe590 100644 --- a/debian/changelog +++ b/debian/changelog @@ -28,6 +28,10 @@ git-annex (5.20140321) UNRELEASED; urgency=medium to add the missing settings. For details, see http://git-annex.branchable.com/bugs/problems_with_glacier/ * Added required content configuration. + * assistant: Adjust 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 fix shell, as well + as POSIX shells. -- Joey Hess Fri, 21 Mar 2014 14:08:41 -0400 diff --git a/doc/bugs/issues_with_non-posix_compatible_shells.mdwn b/doc/bugs/issues_with_non-posix_compatible_shells.mdwn index 4797fb5693..34fb72a1ce 100644 --- a/doc/bugs/issues_with_non-posix_compatible_shells.mdwn +++ b/doc/bugs/issues_with_non-posix_compatible_shells.mdwn @@ -32,3 +32,10 @@ remote types: git gcrypt S3 bup directory rsync web webdav tahoe glacier hook ex # 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]] From c09fd6443e63e04a4f16508a6819d068b430a81c Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Wed, 2 Apr 2014 15:37:43 -0400 Subject: [PATCH 153/308] fix fish --- debian/changelog | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/debian/changelog b/debian/changelog index 7148dbe590..09dc820436 100644 --- a/debian/changelog +++ b/debian/changelog @@ -30,7 +30,7 @@ git-annex (5.20140321) UNRELEASED; urgency=medium * Added required content configuration. * assistant: Adjust 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 fix shell, as well + alternative way that works with the non-POSIX fish shell, as well as POSIX shells. -- Joey Hess Fri, 21 Mar 2014 14:08:41 -0400 From 33605bdcfc6139ec823a23cf7f4445a12db25284 Mon Sep 17 00:00:00 2001 From: "http://joeyh.name/" Date: Wed, 2 Apr 2014 19:41:30 +0000 Subject: [PATCH 154/308] Added a comment --- ...mment_2_04e1da4352ef9f9be90253ea726e5f24._comment | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 doc/forum/rsync.net:_Too_many_authentication_failures_for___42____42____42____42____42__/comment_2_04e1da4352ef9f9be90253ea726e5f24._comment 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 0000000000..3181c4fe01 --- /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. +"""]] From 366101d3c18098b6c66638c6020e5a09c7e150e4 Mon Sep 17 00:00:00 2001 From: "http://joeyh.name/" Date: Wed, 2 Apr 2014 19:46:36 +0000 Subject: [PATCH 155/308] Added a comment --- .../comment_9_9100031689eaa460791191d9bfb746d8._comment | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 doc/bugs/Use_a_git_repository_on_the_server_don__39__t_work/comment_9_9100031689eaa460791191d9bfb746d8._comment diff --git a/doc/bugs/Use_a_git_repository_on_the_server_don__39__t_work/comment_9_9100031689eaa460791191d9bfb746d8._comment b/doc/bugs/Use_a_git_repository_on_the_server_don__39__t_work/comment_9_9100031689eaa460791191d9bfb746d8._comment new file mode 100644 index 0000000000..6fa440f235 --- /dev/null +++ b/doc/bugs/Use_a_git_repository_on_the_server_don__39__t_work/comment_9_9100031689eaa460791191d9bfb746d8._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.244" + subject="comment 9" + date="2014-04-02T19:46:36Z" + content=""" +Sorry, but this bug report is closed. If you think you have a bug in git-annex, file a *new* bug report with full details for how I can reproduce it. +"""]] From 1734218583ab8aca2ee3923868ff2dffbbc0b49d Mon Sep 17 00:00:00 2001 From: "http://joeyh.name/" Date: Wed, 2 Apr 2014 19:51:07 +0000 Subject: [PATCH 156/308] Added a comment --- ...comment_1_c899b7b05a96d14e25c2efadff3b4e52._comment | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 doc/forum/unrelated_repositories_sync/comment_1_c899b7b05a96d14e25c2efadff3b4e52._comment 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 0000000000..7df8a0eb93 --- /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. +"""]] From 50ccff232813590886428d5237d41d91b9ec4c70 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Wed, 2 Apr 2014 15:53:02 -0400 Subject: [PATCH 157/308] close dup of old already fixed bug --- ...__44___current_linux_build_as_of_Mar_6th___39__14__41__.mdwn | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/bugs/ssh_keys_have_wrong_permissions___40__Ubuntu_12.04_LTS__44___current_linux_build_as_of_Mar_6th___39__14__41__.mdwn b/doc/bugs/ssh_keys_have_wrong_permissions___40__Ubuntu_12.04_LTS__44___current_linux_build_as_of_Mar_6th___39__14__41__.mdwn index f315a5bffd..d03943da63 100644 --- a/doc/bugs/ssh_keys_have_wrong_permissions___40__Ubuntu_12.04_LTS__44___current_linux_build_as_of_Mar_6th___39__14__41__.mdwn +++ b/doc/bugs/ssh_keys_have_wrong_permissions___40__Ubuntu_12.04_LTS__44___current_linux_build_as_of_Mar_6th___39__14__41__.mdwn @@ -6,3 +6,5 @@ Creating a SSH remote using the git annex webapp. ### What version of git-annex are you using? On what operating system? 'current linux build for amd64', downloaded Mar 6th 2014, on Ubuntu 12.04.4 LTS. + +> [[done]] From 56aa0181ea15bfe68de94d40a81e07b26570109f Mon Sep 17 00:00:00 2001 From: "http://joeyh.name/" Date: Wed, 2 Apr 2014 19:53:04 +0000 Subject: [PATCH 158/308] Added a comment --- .../comment_1_462c377dca2484e5598a0b71d91ab64a._comment | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 doc/bugs/ssh_keys_have_wrong_permissions___40__Ubuntu_12.04_LTS__44___current_linux_build_as_of_Mar_6th___39__14__41__/comment_1_462c377dca2484e5598a0b71d91ab64a._comment diff --git a/doc/bugs/ssh_keys_have_wrong_permissions___40__Ubuntu_12.04_LTS__44___current_linux_build_as_of_Mar_6th___39__14__41__/comment_1_462c377dca2484e5598a0b71d91ab64a._comment b/doc/bugs/ssh_keys_have_wrong_permissions___40__Ubuntu_12.04_LTS__44___current_linux_build_as_of_Mar_6th___39__14__41__/comment_1_462c377dca2484e5598a0b71d91ab64a._comment new file mode 100644 index 0000000000..92dbf283cd --- /dev/null +++ b/doc/bugs/ssh_keys_have_wrong_permissions___40__Ubuntu_12.04_LTS__44___current_linux_build_as_of_Mar_6th___39__14__41__/comment_1_462c377dca2484e5598a0b71d91ab64a._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.244" + subject="comment 1" + date="2014-04-02T19:53:04Z" + content=""" +This is a duplicate of [[bugs/ssh:_unprotected_private_key_file]], which was fixed on March 14th. +"""]] From 90e0dc63181b4da6eab10fd34526bc871206ea15 Mon Sep 17 00:00:00 2001 From: "http://joeyh.name/" Date: Wed, 2 Apr 2014 20:02:20 +0000 Subject: [PATCH 159/308] Added a comment --- ...comment_1_825676069d2e1554499b76fd8c306c30._comment | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 doc/forum/ignore_changes_made_by_a_remote/comment_1_825676069d2e1554499b76fd8c306c30._comment diff --git a/doc/forum/ignore_changes_made_by_a_remote/comment_1_825676069d2e1554499b76fd8c306c30._comment b/doc/forum/ignore_changes_made_by_a_remote/comment_1_825676069d2e1554499b76fd8c306c30._comment new file mode 100644 index 0000000000..8abc059f60 --- /dev/null +++ b/doc/forum/ignore_changes_made_by_a_remote/comment_1_825676069d2e1554499b76fd8c306c30._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.244" + subject="comment 1" + date="2014-04-02T20:02:19Z" + content=""" +I don't see any need to scrap the repository. Since you have an indirect mode repsitory, you can use `git log` in there to find commits you don't like, and run `git revert` to revert them. So if a bad commit comes down from windows, you can just undo it. That's why we use git, yes? + +I'm much more curious about the circumstances that cause empty files to end up in the direct mode repository. +"""]] From 701d76f0211c1e5a6b859f6399183c60e2bb1426 Mon Sep 17 00:00:00 2001 From: "http://joeyh.name/" Date: Wed, 2 Apr 2014 20:11:35 +0000 Subject: [PATCH 160/308] Added a comment --- ..._6_9b90b4031a5ed26c375903b33ed65a10._comment | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 doc/forum/2_clients_using_an_encrypted_server_for_syncing_-_possible__63__/comment_6_9b90b4031a5ed26c375903b33ed65a10._comment 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 0000000000..5fc4286b27 --- /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. +"""]] From 22bf1d0a9e2fd7dd6d0529d842edb3331927eec6 Mon Sep 17 00:00:00 2001 From: "http://joeyh.name/" Date: Wed, 2 Apr 2014 20:17:19 +0000 Subject: [PATCH 161/308] Added a comment --- ...ent_2_46dc67bdcd174cd50ccc421ec56735ad._comment | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 doc/bugs/Race_condition_between_watch__47__assistant_and_addurl/comment_2_46dc67bdcd174cd50ccc421ec56735ad._comment 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 0000000000..ec3c974d98 --- /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. +"""]] From 0a9d70a99158e79181df5a83202c3a5126c3cd7f Mon Sep 17 00:00:00 2001 From: "http://joeyh.name/" Date: Wed, 2 Apr 2014 20:38:17 +0000 Subject: [PATCH 162/308] Added a comment --- ...mment_3_0667f39f60bdaba6670f5b8304a8a77c._comment | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 doc/bugs/Crash_when_disabling_syncing_in_the_webapp/comment_3_0667f39f60bdaba6670f5b8304a8a77c._comment 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 0000000000..60f82a5b30 --- /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\" +"""]] From b6d46c212e98b1ad074ca0cd5565066565667e15 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Wed, 2 Apr 2014 21:42:53 +0100 Subject: [PATCH 163/308] git-annex (5.20140402) unstable; urgency=medium * unannex, uninit: Avoid committing after every file is unannexed, for massive speedup. * --notify-finish switch will cause desktop notifications after each file upload/download/drop completes (using the dbus Desktop Notifications Specification) * --notify-start switch will show desktop notifications when each file upload/download starts. * webapp: Automatically install Nautilus integration scripts to get and drop files. * tahoe: Pass -d parameter before subcommand; putting it after the subcommand no longer works with tahoe-lafs version 1.10. (Thanks, Alberto Berti) * forget --drop-dead: Avoid removing the dead remote from the trust.log, so that if git remotes for it still exist anywhere, git annex info will still know it's dead and not show it. * git-annex-shell: Make configlist automatically initialize a remote git repository, as long as a git-annex branch has been pushed to it, to simplify setup of remote git repositories, including via gitolite. * add --include-dotfiles: New option, perhaps useful for backups. * Version 5.20140227 broke creation of glacier repositories, not including the datacenter and vault in their configuration. This bug is fixed, but glacier repositories set up with the broken version of git-annex need to have the datacenter and vault set in order to be usable. This can be done using git annex enableremote to add the missing settings. For details, see http://git-annex.branchable.com/bugs/problems_with_glacier/ * Added required content configuration. * assistant: Improve ssh authorized keys line generated in local pairing or for a remote ssh server to set environment variables in an alternative way that works with the non-POSIX fish shell, as well as POSIX shells. # imported from the archive --- .ghci | 1 + .gitattributes | 1 + .gitignore | 31 + .mailmap | 6 + Annex.hs | 272 + Annex/AutoMerge.hs | 179 + Annex/Branch.hs | 516 + Annex/Branch/Transitions.hs | 60 + Annex/BranchState.hs | 43 + Annex/CatFile.hs | 144 + Annex/CheckAttr.hs | 35 + Annex/CheckIgnore.hs | 32 + Annex/Content.hs | 624 ++ Annex/Content/Direct.hs | 256 + Annex/Direct.hs | 373 + Annex/Direct/Fixup.hs | 31 + Annex/Drop.hs | 124 + Annex/Environment.hs | 65 + Annex/Exception.hs | 50 + Annex/FileMatcher.hs | 116 + Annex/Hook.hs | 71 + Annex/Index.hs | 46 + Annex/Init.hs | 239 + Annex/Journal.hs | 127 + Annex/Link.hs | 105 + Annex/LockPool.hs | 60 + Annex/MetaData.hs | 56 + Annex/MetaData/StandardFields.hs | 47 + Annex/Notification.hs | 81 + Annex/Path.hs | 34 + Annex/Perms.hs | 125 + Annex/Queue.hs | 62 + Annex/Quvi.hs | 33 + Annex/ReplaceFile.hs | 39 + Annex/Ssh.hs | 201 + Annex/TaggedPush.hs | 61 + Annex/Transfer.hs | 131 + Annex/UUID.hs | 96 + Annex/Url.hs | 42 + Annex/VariantFile.hs | 45 + Annex/Version.hs | 41 + Annex/View.hs | 448 + Annex/View/ViewedFile.hs | 75 + Annex/Wanted.hs | 29 + Assistant.hs | 178 + Assistant/Alert.hs | 452 + Assistant/Alert/Utility.hs | 130 + Assistant/BranchChange.hs | 19 + Assistant/Changes.hs | 47 + Assistant/Commits.hs | 23 + Assistant/Common.hs | 14 + Assistant/DaemonStatus.hs | 261 + Assistant/DeleteRemote.hs | 89 + Assistant/Drop.hs | 25 + Assistant/Fsck.hs | 50 + Assistant/Gpg.hs | 36 + Assistant/Install.hs | 131 + Assistant/Install/AutoStart.hs | 39 + Assistant/Install/Menu.hs | 47 + Assistant/MakeRemote.hs | 166 + Assistant/Monad.hs | 144 + Assistant/NamedThread.hs | 102 + Assistant/NetMessager.hs | 180 + Assistant/Pairing.hs | 92 + Assistant/Pairing/MakeRemote.hs | 96 + Assistant/Pairing/Network.hs | 130 + Assistant/Pushes.hs | 40 + Assistant/Repair.hs | 160 + Assistant/RepoProblem.hs | 34 + Assistant/Restart.hs | 115 + Assistant/ScanRemotes.hs | 41 + Assistant/Ssh.hs | 352 + Assistant/Sync.hs | 277 + Assistant/Threads/Committer.hs | 473 + Assistant/Threads/ConfigMonitor.hs | 91 + Assistant/Threads/Cronner.hs | 225 + Assistant/Threads/DaemonStatus.hs | 29 + Assistant/Threads/Glacier.hs | 43 + Assistant/Threads/Merger.hs | 118 + Assistant/Threads/MountWatcher.hs | 195 + Assistant/Threads/NetWatcher.hs | 140 + Assistant/Threads/PairListener.hs | 160 + Assistant/Threads/ProblemFixer.hs | 70 + Assistant/Threads/Pusher.hs | 49 + Assistant/Threads/SanityChecker.hs | 260 + Assistant/Threads/TransferPoller.hs | 56 + Assistant/Threads/TransferScanner.hs | 184 + Assistant/Threads/TransferWatcher.hs | 104 + Assistant/Threads/Transferrer.hs | 27 + Assistant/Threads/UpgradeWatcher.hs | 110 + Assistant/Threads/Upgrader.hs | 101 + Assistant/Threads/Watcher.hs | 368 + Assistant/Threads/WebApp.hs | 137 + Assistant/Threads/XMPPClient.hs | 368 + Assistant/Threads/XMPPPusher.hs | 81 + Assistant/TransferQueue.hs | 233 + Assistant/TransferSlots.hs | 293 + Assistant/TransferrerPool.hs | 97 + Assistant/Types/Alert.hs | 79 + Assistant/Types/BranchChange.hs | 19 + Assistant/Types/Buddies.hs | 80 + Assistant/Types/Changes.hs | 77 + Assistant/Types/Commits.hs | 19 + Assistant/Types/DaemonStatus.hs | 119 + Assistant/Types/NamedThread.hs | 21 + Assistant/Types/NetMessager.hs | 155 + Assistant/Types/Pushes.hs | 24 + Assistant/Types/RepoProblem.hs | 28 + Assistant/Types/ScanRemotes.hs | 25 + Assistant/Types/ThreadName.hs | 14 + Assistant/Types/ThreadedMonad.hs | 38 + Assistant/Types/TransferQueue.hs | 29 + Assistant/Types/TransferSlots.hs | 34 + Assistant/Types/TransferrerPool.hs | 67 + Assistant/Types/UrlRenderer.hs | 26 + Assistant/Unused.hs | 86 + Assistant/Upgrade.hs | 315 + Assistant/WebApp.hs | 74 + Assistant/WebApp/Common.hs | 18 + Assistant/WebApp/Configurators.hs | 44 + Assistant/WebApp/Configurators/AWS.hs | 230 + Assistant/WebApp/Configurators/Delete.hs | 131 + Assistant/WebApp/Configurators/Edit.hs | 277 + Assistant/WebApp/Configurators/Fsck.hs | 195 + Assistant/WebApp/Configurators/IA.hs | 209 + Assistant/WebApp/Configurators/Local.hs | 492 + Assistant/WebApp/Configurators/Pairing.hs | 328 + Assistant/WebApp/Configurators/Preferences.hs | 122 + Assistant/WebApp/Configurators/Ssh.hs | 532 + Assistant/WebApp/Configurators/Unused.hs | 80 + Assistant/WebApp/Configurators/Upgrade.hs | 48 + Assistant/WebApp/Configurators/WebDAV.hs | 141 + Assistant/WebApp/Configurators/XMPP.hs | 223 + Assistant/WebApp/Control.hs | 88 + Assistant/WebApp/DashBoard.hs | 172 + Assistant/WebApp/Documentation.hs | 42 + Assistant/WebApp/Form.hs | 89 + Assistant/WebApp/Gpg.hs | 106 + Assistant/WebApp/MakeRemote.hs | 37 + Assistant/WebApp/Notifications.hs | 107 + Assistant/WebApp/OtherRepos.hs | 38 + Assistant/WebApp/Page.hs | 84 + Assistant/WebApp/Repair.hs | 35 + Assistant/WebApp/RepoId.hs | 40 + Assistant/WebApp/RepoList.hs | 253 + Assistant/WebApp/SideBar.hs | 110 + Assistant/WebApp/Types.hs | 233 + Assistant/WebApp/routes | 125 + Assistant/XMPP.hs | 274 + Assistant/XMPP/Buddies.hs | 87 + Assistant/XMPP/Client.hs | 84 + Assistant/XMPP/Git.hs | 382 + Backend.hs | 120 + Backend/Hash.hs | 167 + Backend/URL.hs | 37 + Backend/Utilities.hs | 25 + Backend/WORM.hs | 43 + Build/BundledPrograms.hs | 68 + Build/Configure.hs | 133 + Build/DesktopFile.hs | 80 + Build/DistributionUpdate.hs | 83 + Build/EvilLinker.hs | 165 + Build/EvilSplicer.hs | 620 ++ Build/InstallDesktopFile.hs | 19 + Build/LinuxMkLibs.hs | 144 + Build/NullSoftInstaller.hs | 170 + Build/OSXMkLibs.hs | 172 + Build/Standalone.hs | 47 + Build/TestConfig.hs | 141 + Build/Version.hs | 69 + Build/make-sdist.sh | 21 + Build/mdwn2man | 44 + BuildFlags.hs | 92 + CHANGELOG | 1 + COPYRIGHT | 1 + Checks.hs | 49 + CmdLine.hs | 108 + CmdLine/Action.hs | 70 + CmdLine/GitAnnex.hs | 194 + CmdLine/GitAnnex/Options.hs | 101 + CmdLine/GitAnnexShell.hs | 199 + CmdLine/GitAnnexShell/Fields.hs | 36 + CmdLine/Option.hs | 83 + CmdLine/Seek.hs | 183 + CmdLine/Usage.hs | 113 + Command.hs | 85 + Command/Add.hs | 274 + Command/AddUnused.hs | 41 + Command/AddUrl.hs | 241 + Command/Assistant.hs | 88 + Command/Commit.hs | 29 + Command/ConfigList.hs | 46 + Command/Copy.hs | 40 + Command/Dead.hs | 19 + Command/Describe.hs | 32 + Command/Direct.hs | 71 + Command/Drop.hs | 185 + Command/DropKey.hs | 38 + Command/DropUnused.hs | 45 + Command/EnableRemote.hs | 56 + Command/ExamineKey.hs | 29 + Command/Find.hs | 72 + Command/Fix.hs | 59 + Command/Forget.hs | 52 + Command/FromKey.hs | 44 + Command/Fsck.hs | 513 + Command/FuzzTest.hs | 281 + Command/GCryptSetup.hs | 39 + Command/Get.hs | 92 + Command/Group.hs | 35 + Command/Help.hs | 65 + Command/Import.hs | 115 + Command/ImportFeed.hs | 257 + Command/InAnnex.hs | 27 + Command/Indirect.hs | 110 + Command/Info.hs | 385 + Command/Init.hs | 31 + Command/InitRemote.hs | 98 + Command/List.hs | 85 + Command/Lock.hs | 34 + Command/Log.hs | 171 + Command/LookupKey.hs | 26 + Command/Map.hs | 252 + Command/Merge.hs | 37 + Command/MetaData.hs | 98 + Command/Migrate.hs | 77 + Command/Mirror.hs | 65 + Command/Move.hs | 173 + Command/NumCopies.hs | 56 + Command/PreCommit.hs | 111 + Command/ReKey.hs | 71 + Command/RecvKey.hs | 87 + Command/Reinject.hs | 58 + Command/Repair.hs | 84 + Command/RmUrl.hs | 30 + Command/Schedule.hs | 53 + Command/Semitrust.hs | 19 + Command/SendKey.hs | 49 + Command/Status.hs | 90 + Command/Sync.hs | 380 + Command/Test.hs | 37 + Command/TransferInfo.hs | 64 + Command/TransferKey.hs | 57 + Command/TransferKeys.hs | 140 + Command/Trust.hs | 41 + Command/Unannex.hs | 111 + Command/Ungroup.hs | 35 + Command/Uninit.hs | 99 + Command/Unlock.hs | 50 + Command/Untrust.hs | 19 + Command/Unused.hs | 371 + Command/Upgrade.hs | 26 + Command/VAdd.hs | 36 + Command/VCycle.hs | 41 + Command/VFilter.hs | 30 + Command/VPop.hs | 50 + Command/Version.hs | 49 + Command/Vicfg.hs | 278 + Command/View.hs | 82 + Command/Wanted.hs | 51 + Command/Watch.hs | 36 + Command/WebApp.hs | 237 + Command/Whereis.hs | 65 + Command/XMPPGit.hs | 46 + Common.hs | 36 + Common/Annex.hs | 8 + Config.hs | 81 + Config/Cost.hs | 82 + Config/Files.hs | 69 + Config/NumCopies.hs | 80 + Creds.hs | 140 + Crypto.hs | 217 + Git.hs | 141 + Git/AutoCorrect.hs | 71 + Git/Branch.hs | 153 + Git/BuildVersion.hs | 21 + Git/CatFile.hs | 113 + Git/CheckAttr.hs | 93 + Git/CheckIgnore.hs | 71 + Git/Command.hs | 137 + Git/Config.hs | 198 + Git/Construct.hs | 237 + Git/CurrentRepo.hs | 67 + Git/DiffTree.hs | 102 + Git/FileMode.hs | 23 + Git/FilePath.hs | 78 + Git/Filename.hs | 28 + Git/Fsck.hs | 118 + Git/GCrypt.hs | 103 + Git/HashObject.hs | 58 + Git/Hook.hs | 58 + Git/Index.hs | 32 + Git/LsFiles.hs | 215 + Git/LsTree.hs | 65 + Git/Merge.hs | 21 + Git/Objects.hs | 35 + Git/Queue.hs | 168 + Git/Ref.hs | 144 + Git/RefLog.hs | 22 + Git/Remote.hs | 115 + Git/Repair.hs | 584 + Git/Sha.hs | 43 + Git/SharedRepository.hs | 27 + Git/Types.hs | 99 + Git/UnionMerge.hs | 110 + Git/UpdateIndex.hs | 113 + Git/Url.hs | 71 + Git/Version.hs | 43 + INSTALL | 1 + Limit.hs | 283 + Limit/Wanted.hs | 23 + Locations.hs | 448 + Logs.hs | 165 + Logs/FsckResults.hs | 54 + Logs/Group.hs | 83 + Logs/Location.hs | 71 + Logs/MapLog.hs | 81 + Logs/MetaData.hs | 184 + Logs/NumCopies.hs | 38 + Logs/PreferredContent.hs | 142 + Logs/PreferredContent/Raw.hs | 62 + Logs/Presence.hs | 56 + Logs/Presence/Pure.hs | 84 + Logs/Remote.hs | 97 + Logs/RemoteState.hs | 33 + Logs/Schedule.hs | 72 + Logs/SingleValue.hs | 65 + Logs/Transfer.hs | 323 + Logs/Transitions.hs | 86 + Logs/Trust.hs | 97 + Logs/Trust/Pure.hs | 36 + Logs/UUID.hs | 96 + Logs/UUIDBased.hs | 93 + Logs/Unused.hs | 118 + Logs/View.hs | 91 + Logs/Web.hs | 95 + Makefile | 259 + Messages.hs | 250 + Messages/JSON.hs | 37 + NEWS | 1 + README | 6 + Remote.hs | 303 + Remote/Bup.hs | 288 + Remote/Directory.hs | 255 + Remote/External.hs | 445 + Remote/External/Types.hs | 301 + Remote/GCrypt.hs | 403 + Remote/Git.hs | 529 + Remote/Glacier.hs | 304 + Remote/Helper/AWS.hs | 63 + Remote/Helper/Chunked.hs | 144 + Remote/Helper/Encryptable.hs | 164 + Remote/Helper/Git.hs | 32 + Remote/Helper/Hooks.hs | 102 + Remote/Helper/Messages.hs | 17 + Remote/Helper/ReadOnly.hs | 29 + Remote/Helper/Special.hs | 40 + Remote/Helper/Ssh.hs | 150 + Remote/Hook.hs | 159 + Remote/List.hs | 116 + Remote/Rsync.hs | 295 + Remote/Rsync/RsyncUrl.hs | 46 + Remote/S3.hs | 345 + Remote/Tahoe.hs | 256 + Remote/Web.hs | 127 + Remote/WebDAV.hs | 399 + Remote/WebDAV/DavUrl.hs | 44 + Setup.hs | 62 + Test.hs | 1640 +++ Types.hs | 31 + Types/Availability.hs | 11 + Types/Backend.hs | 26 + Types/BranchState.hs | 16 + Types/CleanupActions.hs | 17 + Types/Command.hs | 81 + Types/Creds.hs | 12 + Types/Crypto.hs | 73 + Types/DesktopNotify.hs | 27 + Types/Distribution.hs | 38 + Types/FileMatcher.hs | 40 + Types/GitConfig.hs | 184 + Types/Group.hs | 27 + Types/Key.hs | 108 + Types/KeySource.hs | 29 + Types/LockPool.hs | 24 + Types/Messages.hs | 24 + Types/MetaData.hs | 293 + Types/NumCopies.hs | 14 + Types/Option.hs | 17 + Types/Remote.hs | 107 + Types/ScheduledActivity.hs | 69 + Types/StandardGroups.hs | 105 + Types/TrustLevel.hs | 43 + Types/UUID.hs | 24 + Types/View.hs | 60 + Upgrade.hs | 56 + Upgrade/V0.hs | 49 + Upgrade/V1.hs | 241 + Upgrade/V2.hs | 140 + Upgrade/V3.hs | 12 + Upgrade/V4.hs | 23 + Utility/Applicative.hs | 16 + Utility/Base64.hs | 24 + Utility/Batch.hs | 97 + Utility/CoProcess.hs | 94 + Utility/CopyFile.hs | 48 + Utility/DBus.hs | 84 + Utility/Daemon.hs | 161 + Utility/Data.hs | 17 + Utility/DataUnits.hs | 160 + Utility/DirWatcher.hs | 157 + Utility/DirWatcher/FSEvents.hs | 96 + Utility/DirWatcher/INotify.hs | 187 + Utility/DirWatcher/Kqueue.hs | 267 + Utility/DirWatcher/Types.hs | 24 + Utility/DirWatcher/Win32Notify.hs | 66 + Utility/Directory.hs | 135 + Utility/DiskFree.hs | 70 + Utility/Dot.hs | 63 + Utility/Env.hs | 81 + Utility/Exception.hs | 59 + Utility/ExternalSHA.hs | 68 + Utility/FileMode.hs | 158 + Utility/FileSystemEncoding.hs | 132 + Utility/Format.hs | 178 + Utility/FreeDesktop.hs | 144 + Utility/Glob.hs | 58 + Utility/Gpg.hs | 381 + Utility/Hash.hs | 69 + Utility/HumanNumber.hs | 21 + Utility/HumanTime.hs | 101 + Utility/InodeCache.hs | 94 + Utility/JSONStream.hs | 44 + Utility/LogFile.hs | 62 + Utility/Lsof.hs | 120 + Utility/Matcher.hs | 169 + Utility/Metered.hs | 116 + Utility/Misc.hs | 148 + Utility/Monad.hs | 69 + Utility/Mounts.hsc | 93 + Utility/Network.hs | 21 + Utility/NotificationBroadcaster.hs | 96 + Utility/OSX.hs | 44 + Utility/PID.hs | 31 + Utility/Parallel.hs | 35 + Utility/PartialPrelude.hs | 68 + Utility/Path.hs | 293 + Utility/Percentage.hs | 33 + Utility/PosixFiles.hs | 33 + Utility/Process.hs | 360 + Utility/QuickCheck.hs | 52 + Utility/Quvi.hs | 148 + Utility/Rsync.hs | 153 + Utility/SRV.hs | 112 + Utility/SafeCommand.hs | 120 + Utility/Scheduled.hs | 350 + Utility/Shell.hs | 26 + Utility/SshConfig.hs | 142 + Utility/TList.hs | 69 + Utility/Tense.hs | 57 + Utility/ThreadLock.hs | 19 + Utility/ThreadScheduler.hs | 75 + Utility/Tmp.hs | 100 + Utility/Touch.hsc | 120 + Utility/Url.hs | 212 + Utility/UserInfo.hs | 55 + Utility/Verifiable.hs | 37 + Utility/WebApp.hs | 306 + Utility/WinLock.hs | 69 + Utility/WinProcess.hs | 15 + Utility/Yesod.hs | 71 + Utility/libdiskfree.c | 92 + Utility/libdiskfree.h | 1 + Utility/libkqueue.c | 74 + Utility/libkqueue.h | 3 + Utility/libmounts.c | 103 + Utility/libmounts.h | 38 + Utility/winprocess.c | 10 + build.bat | 1 + configure.hs | 6 + debian/NEWS | 44 + debian/changelog | 2967 ++++++ debian/compat | 1 + debian/control | 114 + debian/copyright | 780 ++ debian/doc-base | 9 + debian/menu | 2 + debian/rules | 14 + debian/tests/basics | 4 + debian/tests/control | 4 + doc/Android.mdwn | 53 + ..._77bafc01b47d4cf8f96bde2b6704ed71._comment | 8 + ..._dc7b428f525a082834cb87221fc627ff._comment | 8 + ..._81940ea56ace3dcd5fa84dfccd88ad96._comment | 10 + ..._37aa87a451d4390ed367402eec740855._comment | 12 + ..._ba11b81c671d9bcd6f496fbd6f562b0f._comment | 16 + ..._97704e0d89bb87155e019e09e54fc9bf._comment | 13 + doc/Android/oldcomments.mdwn | 2 + ..._20e3d513b8b97496d76aca4619026cd6._comment | 16 + ..._c96b8f1cc1583a74eb2483f48357f023._comment | 15 + ..._6551f5fa081494b079c10a33c9b0d8ad._comment | 10 + ..._7c633d245651ec08f63194fe1fc194ae._comment | 8 + ..._60c2403140085f9caf48a33b59a36ab4._comment | 8 + ..._9af73451be09f03cfff81fdf9481ffc4._comment | 27 + ..._f76561a654b534df3a807b1c045710b2._comment | 8 + ..._1b46cdf154ddadfe17e4b6e4054dc619._comment | 17 + ..._cc9caa5dd22dd67e5c1d22d697096dd2._comment | 15 + ..._5903f6a4a81a6534fa8cfafb3b6c37bb._comment | 8 + ..._36afd354f9669a154d7b6b2c4d43ded9._comment | 8 + ..._de98154792e8611a134429f06d82bcb1._comment | 8 + ..._7ab509c25243009bfbffd796ec64e77b._comment | 10 + ..._026d1a01d5753d71ac3dfc002f2a5eec._comment | 10 + ..._f0a044fb649d43e32c96b08edbc336c3._comment | 12 + ..._6b9ae35b1ceeba14cd7a74e142870705._comment | 34 + ..._c91db1215f529aa68bfb0576c3c5eddc._comment | 10 + ..._c2422b7dd9d526b3616e49f48cf178c2._comment | 10 + ..._0e4980c27b13dbc28477c02a82898248._comment | 14 + ..._86f7b5444e2eaea7f8f7b9160f671a1d._comment | 10 + ..._9d78009435736a178d5a3f5a9bc0ed6a._comment | 8 + ..._7b9523ddb20dc4a929e556c3ed0c7406._comment | 18 + ..._a56628a622da752806c42c5b8b54ceef._comment | 8 + ..._19656ec99b8f6aa64c1d01a3c9ae9bd0._comment | 8 + ..._55e703ae105d0c0ee9ac50df8cc59dfb._comment | 10 + doc/android/DCIM.png | Bin 0 -> 95786 bytes doc/android/appinstalled.png | Bin 0 -> 16805 bytes doc/android/apps.png | Bin 0 -> 53971 bytes doc/android/install.png | Bin 0 -> 55106 bytes doc/android/newwindow.png | Bin 0 -> 1009 bytes doc/android/terminal.png | Bin 0 -> 20565 bytes doc/android/webapp.png | Bin 0 -> 64097 bytes doc/assistant.mdwn | 41 + doc/assistant/addsshserver.png | Bin 0 -> 31740 bytes doc/assistant/archival_walkthrough.mdwn | 32 + doc/assistant/brokenrepositoryalert.png | Bin 0 -> 5806 bytes doc/assistant/buddylist.png | Bin 0 -> 4347 bytes doc/assistant/cloudnudge.png | Bin 0 -> 7332 bytes doc/assistant/combinerepos.png | Bin 0 -> 10677 bytes ..._f2c4857b7b000e005f0c19279db14eaf._comment | 8 + ..._befa1f48e5a43a7965060491430a6bc4._comment | 9 + doc/assistant/controlmenu.png | Bin 0 -> 8863 bytes doc/assistant/crashrecovery.png | Bin 0 -> 6594 bytes doc/assistant/dashboard.png | Bin 0 -> 41061 bytes doc/assistant/deleterepository.png | Bin 0 -> 22780 bytes doc/assistant/downloadnotification.png | Bin 0 -> 4513 bytes doc/assistant/downloadupgrade.png | Bin 0 -> 9071 bytes doc/assistant/encryptdrive.png | Bin 0 -> 42725 bytes doc/assistant/example.png | Bin 0 -> 110994 bytes doc/assistant/fsckconfig.png | Bin 0 -> 59050 bytes doc/assistant/genkey.png | Bin 0 -> 27854 bytes doc/assistant/iaitem.png | Bin 0 -> 34868 bytes doc/assistant/inotify_max_limit_alert.png | Bin 0 -> 12583 bytes doc/assistant/local_pairing_walkthrough.mdwn | 90 + .../addrepository.png | Bin 0 -> 2259 bytes ..._b33deed054d3aa8cfa6c9e3958643f16._comment | 8 + ..._39f1162b4d43b61e957e7497df4b9e2b._comment | 8 + ..._588869692b290483f58f3a7aa2bfb55f._comment | 17 + ..._f6bf82c263fefe38701709d9dbd974cc._comment | 10 + ..._bada601ea4b7104f162a3e00def4be2b._comment | 19 + ..._01ba0f9bfa0ed066c4b73d2d6028eecc._comment | 8 + ..._17d44229e4fa46c50815672b96a9735a._comment | 10 + ..._b9d4c29cf2cca0427808df6af08fb789._comment | 8 + .../local_pairing_walkthrough/pairing.png | Bin 0 -> 6771 bytes .../local_pairing_walkthrough/pairrequest.png | Bin 0 -> 5383 bytes .../local_pairing_walkthrough/secret.png | Bin 0 -> 5132 bytes .../local_pairing_walkthrough/secretempty.png | Bin 0 -> 9575 bytes doc/assistant/logs.png | Bin 0 -> 33631 bytes doc/assistant/makerepo.png | Bin 0 -> 32061 bytes doc/assistant/menu.png | Bin 0 -> 22921 bytes doc/assistant/nautilusmenu.png | Bin 0 -> 59867 bytes doc/assistant/osx-app.png | Bin 0 -> 2604 bytes doc/assistant/preferences.png | Bin 0 -> 22815 bytes doc/assistant/quickstart.mdwn | 30 + doc/assistant/release_notes.mdwn | 398 + ..._bd8f376c9d0c1d5ed07fb013907a60ee._comment | 14 + ..._75e0774ad042717fbd059a8a9ec2db1e._comment | 12 + ..._b3bfd8e547e20c51f7c32c6c9424e936._comment | 10 + ..._c6caa2b521b456bb4ce594d64919cffe._comment | 8 + doc/assistant/remote_sharing_walkthrough.mdwn | 12 + ..._e0187b0a926904b363065ab0f850f0b2._comment | 10 + ..._dabcbc9aaf0bdb82716f5a5d55807a21._comment | 8 + ..._978fab3cd165b4ca245e32fc48cf0970._comment | 8 + ..._d7e879f7b098964040df2e27a18eda72._comment | 18 + ..._00852736d47c05772b15c5ff54ae7da7._comment | 8 + ..._770c4f1802fc40d76bbaf7783bb3b4ac._comment | 14 + ..._61c1f5b00381b2fa891a8578267881ab._comment | 8 + ..._35e00cd10e89ae4bcc66af7dadf6bb5c._comment | 8 + ..._c900e4ef49388826c87cadef4235c073._comment | 8 + doc/assistant/repairrepository.png | Bin 0 -> 31791 bytes doc/assistant/repogroups.png | Bin 0 -> 15636 bytes doc/assistant/repoinfo.png | Bin 0 -> 7603 bytes doc/assistant/repositories.png | Bin 0 -> 63405 bytes doc/assistant/rsync.net.encryption.png | Bin 0 -> 40504 bytes doc/assistant/rsync.net.png | Bin 0 -> 61465 bytes doc/assistant/running.png | Bin 0 -> 24664 bytes .../share_with_a_friend_walkthrough.mdwn | 58 + .../buddylist.png | Bin 0 -> 5114 bytes .../pairing.png | Bin 0 -> 6892 bytes .../repolist.png | Bin 0 -> 8525 bytes .../xmppalert.png | Bin 0 -> 4070 bytes doc/assistant/thanks.mdwn | 1 + doc/assistant/thumbnail.png | Bin 0 -> 3491 bytes doc/assistant/unused.png | Bin 0 -> 49957 bytes doc/assistant/upgradecomplete.png | Bin 0 -> 4817 bytes doc/assistant/xmpp.png | Bin 0 -> 27753 bytes doc/assistant/xmppnudge.png | Bin 0 -> 6156 bytes doc/assistant/xmpppairingend.png | Bin 0 -> 34379 bytes doc/automatic_conflict_resolution.mdwn | 23 + ..._307898855f91a2a189d4fa5eae62cce1._comment | 10 + ..._0a8ea42764dde1a33d2112197b961c51._comment | 8 + ..._5c587c6633cae1c8547ca970d55ee97e._comment | 8 + ..._80539e11e36a0b64cee83b6b373bd843._comment | 17 + ..._00ac9e4a47ce9a886dbf573480f151bd._comment | 10 + doc/backends.mdwn | 42 + ..._375bb1fb5973e8fa67b763f2dd6e404b._comment | 13 + ..._1f2626eca9004b31a0b7fc1a0df8027b._comment | 24 + ..._fdcbf8727fdefb9942a54689234b9698._comment | 12 + ..._46591a3ba888fb686b1b319b80ca2c22._comment | 9 + ..._2210c7ff2d5812fb3b778ac172291656._comment | 8 + ..._82f239b58680a2681bd8074c7ef9584d._comment | 8 + doc/bare_repositories.mdwn | 48 + ..._148e1da70d37d311634a0309a4ff8dcd._comment | 22 + doc/bugs.mdwn | 18 + ...references_on_remote_assistant_access.mdwn | 20 + .../3.20121112:_build_error_in_assistant.mdwn | 432 + ..._b42f40ffd83321ab5cc0ef24ced15e98._comment | 8 + ..._b1d2aa10ea84c5c370b3e76507fc8761._comment | 476 + ..._b38e40d36bba95b16afbce68e7f25a80._comment | 8 + ....20121112_build_fails_on_Ubuntu_12.04.mdwn | 97 + ..._ce2efd2196e7682f4cdbabdb0616d449._comment | 8 + ..._2a6faf662ebb85a8f1c89adcdfb9adb6._comment | 10 + ..._37f34baa34068def1adf794d0942e462._comment | 8 + ..._2f8a859fef9edc8eb93bf1cc74296702._comment | 8 + ..._39__not_in_scope_getAddBoxComR__39__.mdwn | 33 + ...4___because_testpack_won__39__t_build.mdwn | 57 + ..._b7140e2bf1ea9c73ecc9e214095968e7._comment | 8 + ..._6be87b2fb2ed828e7b4bf785729e910e._comment | 9 + doc/bugs/4.20130601_xmpp_sync_error.mdwn | 125 + ..._5b50d97e44cbd5b31ff24537ec3f8603._comment | 14 + doc/bugs/400_mode_leakage.mdwn | 25 + ...ository_on_USB_drive_causes_sync_loop.mdwn | 22 + ..._81839a6de7450734ee75b51e47a0898e._comment | 10 + ..._907ce31a31df94984c2bd7aaafe5b10b._comment | 8 + ..._d8a86ae0ae5fa1f91e0b40b8b2ba0406._comment | 10 + ..._1f08fd5dd4f5d8723c2b5391cc3b60f9._comment | 22 + ...e_repository_next_to_the_existing_one.mdwn | 21 + ..._cb781d34889d583663e855c4074f8e0e._comment | 16 + ..._c0c87957d7c7a09664e60571a2ca0e8c._comment | 12 + ...ox.com_remote_on_Android_fails_for_me.mdwn | 20 + ..._0303ce880415d7e043533551c2b24694._comment | 10 + doc/bugs/Adding_git_ssh_remote_fails.mdwn | 32 + ..._05c0bd9ac7c6f0045217fd72fc1f0a1b._comment | 10 + ..._df05456cafdd89e8ceea830199f42d45._comment | 10 + ...cond_remote_repository_over_ssh_fails.mdwn | 41 + ..._308d5f517bf00c8edc53db438de52355._comment | 14 + ..._webapp_gives_internal_server_error__.mdwn | 69 + ...downloads_but_does_not_checkout_files.mdwn | 74 + doc/bugs/Addurl_with_quvi_not_working.mdwn | 74 + ..._a_specific_directory_on_a_USB_remote.mdwn | 30 + ..._13ecedfbb34c3564af3a790b8bf0f591._comment | 25 + ...__etc__47__resolv.conf_does_not_exist.mdwn | 26 + ..._d4f22335d5b6cb178c77579a1b450f9c._comment | 13 + ..._19dd9ebfebbece9d3654825492ebd5b9._comment | 20 + ..._4a85c4c45768f96bdc6619c193de55ab._comment | 10 + ...ith___34__Internal_Server_Error__34__.mdwn | 22 + ..._91787407727f7ed833d5970d3226d0cb._comment | 8 + ..._f4c52fe33e9c4c107c2469fabb0c6826._comment | 10 + ..._20c1f9399321dd85cb584b8845140b1d._comment | 8 + ..._d92c30061e087878a2462b5a2e495346._comment | 12 + ...ith___34__Internal_Server_Error__34__.mdwn | 20 + ..._414adc1bee73711e3133c7fe8811aae2._comment | 10 + ..._977a529f488ce0c167035675f76ebabf._comment | 8 + ..._in_the_Dashboard_seems_to_do_nothing.mdwn | 24 + ..._a9b03d4f4760fea2754a4dc93547f0a3._comment | 10 + ..._015e859a16b1ce4c0c7601df0594d555._comment | 10 + ...___34__Full_backup__34___server__41__.mdwn | 84 + ..._3f0e3fed240252207020d31ab96d0666._comment | 10 + ..._87746f4fd0b404db7070c0b2346e8e2b._comment | 66 + ..._72c9e9f6bb5ca23ddfd513fcc8bff48c._comment | 27 + ..._b54c169a96e263e12495690fe14d8b4a._comment | 14 + ..._56ef816d3d4f3d85d31ccaf806133073._comment | 8 + ..._submitting_jabber_user_and_password..mdwn | 20 + ...IM__47__Camera_not_being_configurable.mdwn | 16 + ..._1fe5f8c68a430b2436649cf4ba8f4987._comment | 10 + ...x_does_not_support_XMPP_pairing__34__.mdwn | 26 + ..._c034bb84e58b2dda1038ba205ec78c56._comment | 273 + ..._99a754f41d59fdd401ba6d169945e7c9._comment | 8 + ...roid_app_permission_denial_on_startup.mdwn | 18 + ..._dc06737997c8883ef0a12dbecd9ac30f._comment | 8 + ..._b444cd6717658116533745c51481dd3d._comment | 8 + ..._66181f34ed7496d1f6601b39e5ae3c65._comment | 13 + ..._ddf5761bf14de30ac97030ad338601ae._comment | 14 + ..._8b9fafa73ebf5f803c7da9531cfb5b34._comment | 10 + ..._58501bb043b4c5836d7472ffd6baa72c._comment | 23 + ..._d3a04dc7bbc1816cccc8d85c73ffb689._comment | 8 + ..._eeabbc0cc434ed84c36a3f4e03fcef36._comment | 10 + ..._4203b496bee1bdd424466ed63b5d31cf._comment | 10 + ..._74373eb2cc46b76659e3c463d6682d15._comment | 10 + ..._0923d2a09df01d152ec4784c92689c96._comment | 8 + ..._b60928e54a5b620899cf29820b9b8e70._comment | 10 + .../Android_daily_build_missing_webapp.mdwn | 23 + ...thinks_file_exists_afer_being_dropped.mdwn | 27 + ..._1d100441fd1ef529eb854b350fece9ee._comment | 29 + ..._166c459c2b27859cf457e17da685fe75._comment | 14 + ..._9d985b6e7973bfaaf8b4f5349d8c13ee._comment | 8 + ..._3e084cff454b95c7170c0225a53f0c30._comment | 11 + ...rsion_broken_on_Synology_DSM_4.3-3810.mdwn | 28 + ..._c398f92de91729e60b59127733759a38._comment | 14 + ..._646087d44ee32f78784ae9e8d65d87e6._comment | 8 + ..._205e41cb0abaed3e16d45206bb2e77a4._comment | 10 + ...les_into_git_until_daily_sanity_check.mdwn | 106 + ...ctually_sync_file_contents_by_default.mdwn | 16 + ..._8577fdaa4d49e6241c4372b159694c9c._comment | 12 + ..._027521e48283c68b39315bb8213f6e45._comment | 10 + ..._fd8f6938596aace60b04fb35c4069e37._comment | 10 + ..._ca908021ab5a2a50fd0d4a7e8d12498f._comment | 9 + ..._73532556cfc354ad5f37a3f3a048fb32._comment | 12 + ..._ced397b9e6119a0798a282ee07e885df._comment | 61 + ..._8acb66850e5db8337cf3f2b2dd236ccc._comment | 10 + ..._7eb530851ae6fa1a69813725c4e8fcec._comment | 59 + ..._c7d51a26e1febc3894d02546940d64e5._comment | 19 + ..._has_just_transferred_elsewhere_again.mdwn | 26 + .../Assistant_dropping_from_backup_repo.mdwn | 28 + ..._c13d86fb2541676ee4ca1446b99e0e68._comment | 8 + ...nd_eats_up_all_of_RAM_after_X_restart.mdwn | 24 + ...e_5.20131230_64bit_crashes_on_startup.mdwn | 31 + ..._56befc288c40e062e086d93d26064342._comment | 14 + ..._107ab23eac98a168d2920bb88b4ec86f._comment | 24 + ..._7707c47aacde425ca6149dd828dd27fb._comment | 10 + ..._created_155_semitrusted_repositories.mdwn | 191 + ..._c5508b476fc48e7a0002b6ecb8d5eac0._comment | 18 + ..._cb49edcc8a13928c171a2acdde32dce9._comment | 12 + ..._a86c8347526e7b0a6f7633f3aea528bb._comment | 8 + ..._a26c2b49ee7746be06f4772aa838d5aa._comment | 21 + ..._b958da97a69091d283918e0d5a658da5._comment | 26 + ..._169b24b34cce3f5c8446c2150beb6827._comment | 8 + ..._6acd6f38297772a07d8d5fb999bd2eaa._comment | 183 + ..._6a4118e5c5fbe5e84d27094ac72b741b._comment | 22 + ..._04daa20d5d7c74bb34ec48e752ed9fe8._comment | 8 + ..._11af8ab2587e6eeb671051ba8191995b._comment | 11 + ..._26236cdc2bce532017854791bcd727d1._comment | 8 + ..._3c532dd5b8a01ecdeda1300b49aba675._comment | 12 + ..._119142c5ebc499f0ee0926dbca265308._comment | 10 + ..._0651071ee1654eeaa9aa9369873fdf6a._comment | 8 + ...er_and_over_and_using_a_lot_of_memory.mdwn | 520 + ..._ac8c39e362e6c806b9d68befc0199ccd._comment | 10 + ...ant_lost_dbus_connection_spamming_log.mdwn | 88 + ..._b47d543e06a1a243211a2fa0cb5d09a3._comment | 13 + ..._399c1e4455dce105df95414fe3ff939d._comment | 8 + ..._1cfdd76e751ee3726bd80359cfc85c47._comment | 8 + ..._37aa5274874242861dc128efa1d29486._comment | 12 + ..._27fc71cadcbe6d5f146ffdb72b64689a._comment | 12 + ..._0fb01ff463e7da6df2864186dc28f8e4._comment | 12 + ..._10fa5082909f5e568623cf6d901d5161._comment | 11 + ..._f4e0fa25b7f466228622a6da02b157e7._comment | 24 + ..._6b9b87bfb8b94171b3dba51919fd1ceb._comment | 10 + ..._51f35f069c95a5ea7bd4dbab47b5702b._comment | 10 + ..._691661d902acbf9c11d713541d5d39e4._comment | 8 + ..._ef559feb7b350f2014055680d087c2bc._comment | 10 + ..._278b41aaa73a214b2b38881242a29b17._comment | 12 + ...me_cases__44___although_used_remotely.mdwn | 29 + ...dding__47__creating_repo_on_ArchLinux.mdwn | 75 + ..._ec4a7388ea7106a953f599b664b37f1d._comment | 8 + ..._6a60c23850a5e2a7bba355e1317abc69._comment | 13 + ..._90b6ed232b2917b9fe041532284e1212._comment | 10 + ..._5a89d79395d96c43d7d8a6fd9dc275f1._comment | 248 + ..._cdd26c71875428dbe3c100944a443d3f._comment | 9 + ..._76242f5d6c815acd5bd58213bd8bb0fe._comment | 10 + ..._10852171c0207ca61ea6df1082107353._comment | 8 + ..._73e8a5696709f8154e63693ba5e569c3._comment | 10 + ..._392fc344e5833b0eb665fcd38f956b7a._comment | 8 + ..._9f0fc19a7fcaf7a5827e59e1495cf8c9._comment | 8 + ...tant_uses_obsolete_GDU_volume_monitor.mdwn | 28 + ..._0e1db417a5815ea903c1f7ccd07308c4._comment | 8 + ..._28b0cfcba8902c9c16dbe6c4b07984c4._comment | 10 + ..._952b3f78da756ff5f89235db94bec67f._comment | 53 + ..._d86aba42d014c4b4f708dcb5fe86e055._comment | 10 + ..._9aaf296ef53da317d6dc6728705d5c56._comment | 16 + ..._0d5f8a05a1505660f7ff1bc4ac6ff271._comment | 8 + ..._3dfdfd49597c85575cb689adb70d2de6._comment | 8 + ..._943a446c60ed9d7d4f240ba7f00fe925._comment | 8 + ..._9563859850fb40b1cc2c20c516c12960._comment | 16 + ..._cf6221c585ee3dbf039bdaea71842d9b._comment | 9 + ...repair_greatly_slows_down_the_machine.mdwn | 19 + ..._a52e4ef04209d0a2449165e2b4cb9ccc._comment | 10 + ..._9f5340ab1012f335af0c246b82c1a777._comment | 16 + ..._67bfccf0934075559d439b1deafc001e._comment | 9 + ..._5fa785aa759d1a1917f2a292324fe5ec._comment | 8 + ..._9fe529034ad0115792b58d7da99c167e._comment | 8 + ..._93ed991ef2a74c18575073ca72e06185._comment | 8 + ...update_not_updating_to_newest_version.mdwn | 70 + ..._6f75569dc960ea5bc4d334b2b321ebf8._comment | 12 + ..._4f26cce07a9f37c79b166111db499ce1._comment | 11 + ..._585bfcaa655b0e838f9b66a241d5ffc2._comment | 2163 ++++ ..._2705fbfd74652ab097ac48ec687517c7._comment | 8 + ..._ab1ee005dbd54e560ea6e3c716cc8f1b._comment | 70 + ...es_should_be_cryptographically_signed.mdwn | 5 + ..._37ed871c82879a31c2d8cfc7d9736548._comment | 10 + ...repository_doesn__39__t_get_all_files.mdwn | 40 + ..._a486dc0f741e08d5bcf2fd1a6ecbdf05._comment | 12 + doc/bugs/Box.com_ReposnseTimeout.mdwn | 12 + ..._4ac0bf61fb4b2ac335a8a1f29e9d882d._comment | 20 + ..._29d8a9fa8d385a08fa70337baaba462c._comment | 10 + ..._b73450b3a9728ac6f34f0e63255f6fa9._comment | 8 + ..._0bd9eb5947a21d0657e79cf276923bb5._comment | 9 + ..._Android___39__git_annex_webapp__39__.mdwn | 35 + ..._173393b0b3d2d8c622c0d8a2eaace421._comment | 8 + doc/bugs/Bug_Report_doesn__39__t_work.mdwn | 20 + ...ds___39__hxt__39___added_-_3.20121127.mdwn | 36 + ...us_occurrence___96__callCommand__39__.mdwn | 74 + ..._3127b3c448888fdf70096f24c7cbfd3c._comment | 50 + doc/bugs/Build_error_on_Linux.mdwn | 29 + doc/bugs/Build_error_on_Mac_OSX_10.6.mdwn | 11 + doc/bugs/Build_failure_at_commit_1efe4f3.mdwn | 45 + ...ot_find_module___96__Text.Blaze__39__.mdwn | 105 + ..._Not_in_scope:___96__myHomeDir__39___.mdwn | 56 + ...ind_module___96__Data.XML.Types__39__.mdwn | 82 + ...constructor_or_class___96__Html__39__.mdwn | 189 + ...26____47__bin_breaks_the_desktop_link.mdwn | 15 + ..._c0f0a2878070ed86900815c6b6a5fa5e._comment | 8 + ..._53f2de3d3993821d8502fd08a0fcce12._comment | 8 + doc/bugs/Building_on_OpenBSD.mdwn | 40 + ..._bec4a7253e851567cd47b96ceead5d91._comment | 10 + ..._4a37935080b86643ecda717fe17f8f87._comment | 18 + ..._2df229eb965189e2f7ea6dcd66cf68ca._comment | 24 + ..._d141c0bac92bdfbc8b95d532d032174c._comment | 8 + ..._8aba96ef58eb6954f1d15029e0dda9ed._comment | 10 + ..._82e6744e246fe5caa72081d4e921b168._comment | 11 + doc/bugs/Cabal_cannot_solve_dependencies.mdwn | 36 + ..._1d41ac79867226dcb71f1c7b38da062d._comment | 21 + ..._50e72633a4462f6f6eb33d57b137fdcc._comment | 48 + ..._886f2d1f7c47a3973b8dc7d7c412289a._comment | 10 + .../Cabal_dependency_monadIO_missing.mdwn | 17 + ..._14be660aa57fadec0d81b32a8b52c66f._comment | 75 + ..._4f4d8e1e00a2a4f7e8a8ab082e16adac._comment | 8 + ...39__t_always_use__annex-rsync-options.mdwn | 35 + ...__git-annex_get__34___with_3.20111203.mdwn | 27 + ...rive__39___repo_even_if_set_as_client.mdwn | 22 + ..._25eb2d7d0a9cdd1c55df0cec68472723._comment | 10 + ..._9e9b96e5113a50533251e946c2560d81._comment | 17 + ..._6b091198ddd6ed709b076df1296aeb77._comment | 11 + ..._118b588685b535cca4c02eb6ef297c67._comment | 21 + ..._5cead277493e1c020e16be6f9245fe33._comment | 12 + ..._0f135f97c2808dce094628dc6608e617._comment | 8 + ..._1d6f47f9e6cf935f19d68af6d5aa92fa._comment | 10 + ..._c5758fdb32348b9cd804ff17d27864e1._comment | 16 + ...epo__47__.git__47__X__34___for_many_X.mdwn | 34 + ..._7f54e24c8e721d69bdb1e5a4181641b8._comment | 10 + ..._6e91bc254f79ccf80d385ba7d35ffa9c._comment | 14 + ..._4cf34da6050dd96f94ffc3652aa39715._comment | 12 + ..._cafcc24e98a89f10adaed5e09f75b659._comment | 19 + ..._118d61dea9ef0faa2960da6f2f62ec8b._comment | 12 + ..._3978557c6e85608243e5b4eb698ac5a5._comment | 27 + ..._e6dfc41d2042402b40efb6f6139d5662._comment | 18 + ..._33a84937c87dd2406bc090a0d2969683._comment | 30 + ..._28bb02572d453db3b30824ec7604d91a._comment | 17 + ...e_some_filenames_have_a_colon_in_them.mdwn | 20 + ..._5fc1347f4bcc13c9f8dbc5ecd4847fc7._comment | 12 + ..._38696178e658d1d32deec37dbea66a3d._comment | 8 + ..._f34d996827f5e7662bec409cbcce961b._comment | 12 + ..._t_rename___34__here__34___repository.mdwn | 32 + ...Can__39__t_set_repositories_directory.mdwn | 15 + ..._beb5d5b66a8d0fab12be44a7d877e9b0._comment | 8 + ..._366aa798a5e55350d32b63b31c19112b._comment | 19 + ..._812554d58ad9274a50b2a33d5f4d2ec3._comment | 10 + ..._bec5f147441ad18c97845b44c90c728b._comment | 28 + ..._t_set_up_rsync.net_repo_on_OS_X_10.9.mdwn | 24 + ..._91a961cfa5dd4d6f0e4abfbbcfb81e92._comment | 35 + ..._0b5266e31fe7014bd11ea164f8e4744e._comment | 12 + .../Can__39__t_start_it_on_Debian_Wheezy.mdwn | 26 + ...__t_start_on_Cyanogenmod_10.2_nightly.mdwn | 158 + ...nc_remote_with_encryption__61__shared.mdwn | 54 + ..._ca7ec2041bbec330476fb040b1e66a92._comment | 8 + ..._c476847665a5320214721497d8fad15b._comment | 8 + ...Can_not_Drop_Unused_Files_With_Spaces.mdwn | 22 + ..._b909ed9f474601587b2adad7ad4f674d._comment | 8 + ..._b2735a6e03db3f77a87a0f7d87347685._comment | 16 + ..._dd82a0cd698b0688ff08f0462af0275f._comment | 8 + ..._bbebb1d0dc5fbc1f6a0bb75b47bd4986._comment | 8 + ..._106c271d5174342055910bf57c0a34c5._comment | 8 + ..._3a2d3cc3e018beaf2eb44b86ce7e1a7f._comment | 8 + ...annot_build_the_latest_with_GHC_7.6.1.mdwn | 18 + ..._b25859c159d62f2e92b92f505535131b._comment | 14 + ..._4c9eab9120718457fdc1ae9051e44bca._comment | 16 + ..._61aec9801e1f76db4a286536ffacc3ed._comment | 12 + ..._6381ff0ea419831d9bbed27511cad1e9._comment | 16 + doc/bugs/Cannot_clone_an_annex.mdwn | 69 + ..._b40a2652361a79c6c6eab0fc21be8e46._comment | 8 + .../Cannot_copy_to_a_git-annex_remote.mdwn | 14 + ..._258a376cff4c62bc4be919322bb1bd88._comment | 10 + ..._d9b830a1fdea8760cb7da1d36b3cd34d._comment | 12 + ..._09d76e5f9480b9a35644a8f08790cd97._comment | 10 + ..._7b586c705a937d09a1b44bd6af2d4686._comment | 8 + ..._07dbd8f64982f1921077e23f468122cf._comment | 25 + ..._926fd494f0b27103a99083cd5d0702d5._comment | 8 + ..._80444a509cc340f5eb3cd08b193fd389._comment | 10 + ..._4c6b99cd67b4aa742da5101fb1b379f7._comment | 8 + ..._f45cdd2b6acc5f458b67539fced0e529._comment | 12 + ..._5a455dd14fb9d3ff408bb3f81e366c38._comment | 10 + ...not_delete_remote_when_ssh_sync_fails.mdwn | 8 + ..._3c8e8fae688a9db8e18e869a187fb4eb._comment | 8 + ..._e189617c4ac23df50f02af8c517fa399._comment | 14 + ..._foo_not___126____47__bar__47____34__.mdwn | 29 + ..._6f7b5c164ff64f00b8814b2ee334709f._comment | 13 + ..._807ef1250237bf4426e3a24c1f9ba357._comment | 10 + doc/bugs/Check_for_minimum_Git_version.mdwn | 41 + doc/bugs/Committer_crashed.mdwn | 32 + ...mpile_needs_more_than_1.5gb_of_memory.mdwn | 16 + ..._0806b5132c55d7a5a17fbdad7e3f2291._comment | 16 + ...ilure_trying_to_unannex_a_large_annex.mdwn | 56 + ..._1c202695ab7fe62cdc8770e1fb428d0c._comment | 10 + .../Conflicting_archive_descriptions.mdwn | 16 + ...lPath_too_long_for_Unix_domain_socket.mdwn | 53 + ..._60f58e205604eebe668b1e05dcfbf9a7._comment | 24 + ..._9c0c65389a3b4e7e81b8de96d430a3f1._comment | 8 + ...eleted_and_deletes_them_elsewhere_too.mdwn | 36 + ..._80ca50f5305eda71fe32f2b0bc922c34._comment | 21 + ..._e6bc6d1c0eb8c469e9e00b37bbcc9b86._comment | 9 + ..._0d0f6b6b46d0153433fead2bbd1bbe64._comment | 12 + ..._6058a22b733cb02126286af950074ed4._comment | 10 + ..._593a49669e2fadfb91773f8c84fbb031._comment | 8 + ..._5a348c5f327f16e1192ef6bd7f2880bb._comment | 15 + .../Could_not_find_module_Data.Default.mdwn | 33 + ...Could_not_read_from_remote_repository.mdwn | 26 + ..._da842a9d146bcd5c7773b58364c25597._comment | 8 + ..._82746a0cf989d884cd0fd796db092b3c._comment | 36 + ..._95d16045dc238dba19a98808de2eeedf._comment | 11 + doc/bugs/Could_not_resolve_dependencies.mdwn | 40 + ...h_trying_to_sync_with_a_repo_over_ssh.mdwn | 43 + ..._9705f295ad8101f3f0ede18e590b56ef._comment | 8 + ..._0d751d81ac618f8d7e3f1dd20c830542._comment | 8 + .../Crash_when_adding_jabber_account_.mdwn | 32 + ..._2dc61ebcfa8919fb839656999c155c52._comment | 10 + ..._e49af3b8a937d82eda1509b6f67b21d4._comment | 8 + ..._e59f8813bf1a7c4e3c8c120fe82348b9._comment | 10 + ..._716ac138cb69eecd0fb586699b4aeb2a._comment | 8 + ..._9bfd8df548d5866599dfc69fb3aaf94a._comment | 8 + ..._when_disabling_syncing_in_the_webapp.mdwn | 23 + ..._e25dd80370820782f9c6a877101d8703._comment | 10 + ..._4031c16362137747717e9595cb5c8a15._comment | 10 + ..._0667f39f60bdaba6670f5b8304a8a77c._comment | 12 + .../Creating_a_WebDAV_repo_under_OpenBSD.mdwn | 53 + .../Creating_a_box.com_repository_fails.mdwn | 41 + ..._c0b4855b65cb7052daf6538c2ad73e99._comment | 11 + ..._b05a1e7b37989c698353cc6b3fd02d7c._comment | 12 + ..._6c3610fb95676592f17f36e4e1b09bd8._comment | 8 + ..._c9895712e72854e4b5ff7a58e82ae374._comment | 17 + ..._93981afe8162f64ebb9d8c2c6a7ef91e._comment | 8 + ..._752b5725b4596721438098d38af8fb66._comment | 8 + ..._73f71386f8eafbb65f4cc9769021710f._comment | 13 + ..._109e37051beb729834e05997c023b849._comment | 8 + ...h_an_invalid_name_throws_an_exception.mdwn | 18 + ...S3_does_not_check_for_presence_of_GPG.mdwn | 18 + ...using_git-annex_webapp_--listen__41__.mdwn | 35 + doc/bugs/DS__95__Store_not_gitignored.mdwn | 26 + ..._b93ac0ea3be82c361ceb4352e742ba39._comment | 8 + ..._4136e1f4aba7aa7562dafcf6a213e10c._comment | 58 + ...p_ssh_keys_after_removing_remote_repo.mdwn | 18 + ..._88fbf70eae48484988dbb433a437c717._comment | 14 + .../Detection_assumes_that_shell_is_bash.mdwn | 24 + ...t_to_troubleshoot_XMPP_login_failures.mdwn | 11 + ..._4205bccf515169031e4a9ed8e905262c._comment | 10 + ...keeps_re-checksuming_duplicated_files.mdwn | 25 + ..._cb10385a4f046bfe676720ded3409379._comment | 14 + ..._4bcf1a897181e40c9c8969d597a844f0._comment | 8 + ..._6a6d22d218f036c9977072973ed99aa8._comment | 11 + ..._eaa7ffb3a1d9ffd6d89de301bd2cd5b2._comment | 11 + ...sitories_end_up_with_unstaged_changes.mdwn | 46 + ..._300a2b246182be3079db20a7e3322261._comment | 8 + ...sitories_still_use_symlinks_sometimes.mdwn | 32 + .../Disconcerting_warning_from_git-annex.mdwn | 8 + ..._58cebd377bfdf247b6c4fee27a3ba461._comment | 8 + ..._dc7407044d4c739d05248300c58d8ef2._comment | 8 + ..._13999207f4ddac2f9c345415f25f7ada._comment | 28 + ...een_git_annex_add_and_git_annex_watch.mdwn | 33 + doc/bugs/Displayed_copy_speed_is_wrong.mdwn | 8 + ..._74de3091e8bfd7acd6795e61f39f07c6._comment | 8 + ..._8b240de1d5ae9229fa2d77d1cc15a552._comment | 8 + ...der_suddenly_appear_in_sub-sub-folder.mdwn | 3747 +++++++ ..._ae4a13ff121d27f78904eee9bf5e716b._comment | 20 + ..._32e360cd7b100ddb9a526e7833fc55e1._comment | 15 + ..._650dc9ede4e16ef668d96840f63dad47._comment | 12 + ..._721cf184fb5a5244ec5c15de3302ebf7._comment | 33 + .../Empty_folders_don__39__t_get_remove.mdwn | 4 + ..._9f41638299c214b2ee13f23ab41349da._comment | 10 + ..._ssh_server_with_multiple_directories.mdwn | 19 + ..._e8affeca873c2ef73255f8f77e0ac16f._comment | 10 + doc/bugs/Endless_SSH_password_prompts.mdwn | 34 + ..._b3a32d7a53c30478f409a47f856282ab._comment | 10 + ..._0a1fc4b4580d8be4c37064e0a16de99b._comment | 8 + ..._46210f7745b8c7c237fc8b08309390fe._comment | 11 + ..._bf311301063db06bcfa8ce8d7db54028._comment | 8 + ..._7490ca530d4e7d49eaa264eb5880dd17._comment | 8 + ..._57952f91c8d55558cce18b229398f70c._comment | 11 + ..._6d6a131fda398840cfe00c52ad560ed2._comment | 10 + ...___versions_3.20120315_and_3.20120430.mdwn | 79 + ...ry:___34__internal_server_error__34__.mdwn | 28 + ..._9be1b577fa4d5fe9754845073fdf5d32._comment | 10 + ..._0da0d68b646f2b38be6ecf7c0fe13743._comment | 8 + ..._09c56f5574931f2ebe903069f0731160._comment | 16 + ..._0c127396e682ca6ced43aec7deeb0335._comment | 12 + ..._6bc3eadefde4750eec67a55de6651b2d._comment | 13 + ..._263ab9c1483438b1717c8061ac81a2fa._comment | 9 + ..._eccc10990dff37584f8e60cd481a7140._comment | 26 + ..._f897d20cbe5e0f3f58ce1a0bacad3d71._comment | 8 + ...ng_remote_repository_using_ssh_on_OSX.mdwn | 36 + ..._559555934d79ae6be383063abcaae22e._comment | 10 + ..._a9f4f9db042ab6f6c15d6954651971b2._comment | 12 + ..._55a496d0a0be80ba723b17bf9faa3bc0._comment | 8 + ...ing___34__hGetLine:_end_of_file__34__.mdwn | 31 + ..._8742f7ac27b5f4ad6261d04a174a691c._comment | 10 + ..._b8e720340000537de6713c49b7733b2f._comment | 21 + ..._489fa3a717519cd5d8b4c1a9d143d8c6._comment | 8 + ..._b0796d3b1913e1b6f7b34d75a591be42._comment | 16 + ..._d8ca17ccaa5ee48d590736af8e77d88a._comment | 8 + ..._aa7a690aaf75d21f52051a31d7fce70e._comment | 8 + ..._dc235dc2d024b7f340721bb578630e00._comment | 10 + ..._5d1e6ea5b5725c773acc6e288add812c._comment | 8 + ..._6389b4f03ebc916358bc6674398d70c4._comment | 14 + ..._bcacc9fb3751042968118ebe33802e27._comment | 10 + ..._6d4c9f0e133ebd94fc11346df446402e._comment | 16 + ...nnexed_file_to_a_.gitignored_location.mdwn | 21 + ..._b524e70156e8bc1219d5c6741974ad99._comment | 18 + ..._ff7349c396d1249204d621e71f6a7a52._comment | 10 + ..._4bc7d4c51faea3fdafc977cb66b7f73a._comment | 26 + ...ateSymbolicLink:_already_exists__34__.mdwn | 46 + ...w_file_gets_symlinked_to_a_git_object.mdwn | 78 + ..._d4e7ed56b16494a95e6c904c746cc91f._comment | 8 + ..._656b2a2cc44e9102c86bdd57045549d5._comment | 10 + ...__40__calling_nonexistant_shell__41__.mdwn | 28 + ..._fb8a379ed7f4b88bd55245ce5b18042c._comment | 8 + ...te_remote_repo_if_no_global_email_set.mdwn | 55 + ...ake_git_annex_add_not_ignore_dotfiles.mdwn | 14 + ..._c258016dd545b0426e75a7c0132154d8._comment | 8 + ...eature_request:___34__quvi__34___flag.mdwn | 14 + ..._908c38024fd252328566034608c2dec3._comment | 12 + ..._4b6822fe91aa865f2ac1297a3daa3fca._comment | 8 + ..._c72ef77e76b1c99b5e0c78d0742080e7._comment | 8 + ..._6092695d6afb1608447afe6f86e6fb83._comment | 8 + ...can_be_sequentially_copy_then_dropped.mdwn | 17 + ...om_locally_paired_annexes_when_edited.mdwn | 36 + ..._bdc97db9dc9954331e4c400baf9e5541._comment | 10 + doc/bugs/Finding_an_Unused_file.mdwn | 152 + ...dg-open_on_linux__47__bsd__63____41__.mdwn | 26 + ...test_tahoe-lafs___40__v._1.10.0__41__.mdwn | 62 + ..._change___34__deleted:_uuid.log__34__.mdwn | 44 + ..._6441dd04adc158df22589c81746108a9._comment | 10 + ..._d1c5d7642284a375f9c455dbf76efa5c._comment | 12 + ..._4b863da1c8ba73ad54da20f7d2ec6e5c._comment | 14 + ..._8e0f489305ce30ad578b9f8526e86416._comment | 10 + ..._c699034c8e02b2354516414d0ab73aab._comment | 53 + ..._786cb7e643811dfd2496ceeff8f34f44._comment | 10 + doc/bugs/GIT_DIR_support_incomplete.mdwn | 17 + .../GPG_can__39__t_handle_some_files.mdwn | 23 + ..._4388c971e991dbc0326e69c49994df1e._comment | 8 + ...s_with_pubkey___40__Again__63____41__.mdwn | 44 + ..._ac3631024abf372e6f578a472b86d792._comment | 8 + ..._980c149d7f9040f5e71e662d95a5fbf1._comment | 9 + ..._c279f5cc3f96910287e72bf59120d02b._comment | 8 + ..._ec6abe7074f767f866e9618d65a4a900._comment | 12 + ..._44f80d89360a5620f919f8bc7c1c2879._comment | 8 + doc/bugs/GPG_passphrase_repeated_prompt.mdwn | 24 + ..._6ef1c9725befc84ad57bce196ef630ef._comment | 16 + doc/bugs/GPG_problem_on_Mac.mdwn | 34 + ..._9ccfa12e7a9569a7ae9a3b819917c275._comment | 9 + ..._a5e07131e2bc1a646c8439fc2506128b._comment | 29 + ..._388238360f2423f84881e904443efb86._comment | 12 + ...nnex_add_._dies_when_you_add_too_much.mdwn | 56 + ..._a99b96c38bba3af54e0152cc3730c16c._comment | 10 + ...it_annex_add_fails_on_read-only_files.mdwn | 49 + ..._d31018e8bf31d729ee9fee43a0a07934._comment | 10 + ..._e38e7048749f890169cd0be602be6ee7._comment | 10 + ..._add_on_vfat__47__sdcard__47__android.mdwn | 280 + ..._2fc435d1c741f9fc422401f682e7c8b7._comment | 17 + ..._b73fb99a75aef912f8286626c5bde66d._comment | 14 + ..._b7115f2c658439ff59a029f500697fc1._comment | 57 + ..._67de7a56ddb06fc0e31cc011d281c633._comment | 8 + ..._58fdb2a00f1737746cdbc804f831a0e7._comment | 8 + ...hen_submodule_is_not_in_the_same_path.mdwn | 63 + ..._b3197993dbdfaf2db5e4651ac54a896e._comment | 12 + ..._1fbbd02e61ef524597dafd69460b00b4._comment | 10 + ...on_parameter_to_glacier-cli_on_hasKey.mdwn | 38 + .../Glacier_remote_uploads_duplicates.mdwn | 36 + ..._8aef582a0f0d0c7f764b425fc45de3b4._comment | 25 + ..._150ce8b7c4424a83c4b1760da5a89d27._comment | 8 + ..._718af5048c5f894eee134547a2e0a644._comment | 8 + ..._184ad0f8c2847309632f8c18b918cd42._comment | 10 + ..._6980a912d3582c2f2511e4827e9e76b3._comment | 21 + ..._feea067d6856af2840604782b29af86a._comment | 12 + ..._e96187bad3dae2f5f95118f6df87a1ec._comment | 10 + ..._34216b514a6fca788cfacb8579ce5311._comment | 12 + ...de_archive_directory_at_the_same_time.mdwn | 16 + ..._e8bb3d6a2318402b985caed08282d473._comment | 12 + ..._ead9fa75a12ef36be9a92637b144e74f._comment | 14 + .../Hanging_on_install_on_Mountain_lion.mdwn | 26 + ..._f57ff027b19ca16e2ecf1fc6aee9ef4a._comment | 10 + ..._2ff78d2090d0fd3418ab50b27c6028ce._comment | 8 + ..._523d3c0c71f80536850a001b90fd0e9e._comment | 8 + ..._6c360c64093b016c2150206dc3ad1709._comment | 10 + ..._7b77fd9b7dc236c345f2f6149c8138ee._comment | 18 + ..._08289596445d7588e43d35490fbfe5f4._comment | 8 + ..._2a336fe7b8aed07cbdaa868bd34078f9._comment | 8 + ..._ea7a40c3b6748738421aed00a6f7ca10._comment | 10 + ..._00962da9288976f8a48d0cbc08e1d9e2._comment | 15 + ..._5d53d23e529f33f6e7deb10643831613._comment | 11 + ..._f00c8761e3184975b6645c0c3e241365._comment | 10 + ...eating_repository_when_using_--listen.mdwn | 49 + ..._8cbe786de8cf8b407418149b9c811aab._comment | 14 + ..._dc128eeddeaaf3f84e71aca0fb7d341f._comment | 8 + .../Hard_links_not_synced_in_direct_mode.mdwn | 125 + ..._aaa781664ae0c62c4f6530cb075ed367._comment | 17 + ..._213aa10909d1fd0f20ed078a7ed93e79._comment | 8 + ..._e6b783d9aaae20c0d35e9888d878716a._comment | 10 + ..._b008ae7b1cf8685d92c9a87a7609de1e._comment | 18 + ..._949c891209713a2c0a5e66af11ed4c79._comment | 14 + ...ush_without_using_the_assistant__63__.mdwn | 295 + ..._0ddcbe0ccecdec1012964dfa436a3eee._comment | 19 + ..._5765b849bcf045ead9f007bd50b2cfbd._comment | 20 + ...on_switch_to_indirect_mode_and_status.mdwn | 69 + ..._94c678e1348280a96f11d7456c240d3a._comment | 8 + ..._09450d58df2373174a1f0d90b08e9eb3._comment | 14 + ..._a07105226ef3488b97731db004651976._comment | 10 + ...an_existing_gcrypt_repo_in_the_webapp.mdwn | 23 + ..._17814787e333d15da3ab4e57c7d31d4b._comment | 12 + ...case_of_adding_an_existing_repository.mdwn | 28 + ...erge__44___direct_repos___40__2__41__.mdwn | 44 + ..._15c354c4841d364e78882d2b46a0a764._comment | 66 + ..._8bc496226a977dbeeb1ce3f06122f1c2._comment | 12 + ...rect_merge___40__a_special_case__41__.mdwn | 48 + ..._c80418d76b501c688e3a9fb4831520fd._comment | 41 + ..._8b2a188696f46819f6e3f0e9660362d2._comment | 45 + ..._8cdbb1fda506b9e53a0e9ab88b2569c1._comment | 15 + ..._9d74e2854a5d77f0f793f56fa0cff9e2._comment | 14 + ...ink_path_in_simple_submodule_use_case.mdwn | 72 + ..._73b4dc5f90c8ba5634caee35cd31af1a._comment | 14 + ..._e84b93062c82453f18308a82ee270585._comment | 16 + ...__40__1.0.52__41___as_seen_by_Android.mdwn | 24 + ...orrect_version_on_64_Standalone_Build.mdwn | 11 + ..._1964e4cad33a9f98b2eedbf095e899ff._comment | 12 + ...Install_of_git-annex-3.20121112_fails.mdwn | 20 + ..._80fc80151d4390bd8a4332f30723962e._comment | 8 + ..._2613320a41a74dc757a3277c8c328bd0._comment | 62 + ..._c364764d0c56e8dc3cac276905d99841._comment | 10 + ..._f1057340dfa978071d3bbc9e2af1e612._comment | 19 + ..._9007b1a3abd647945604968db19cb841._comment | 8 + ..._0bb3ac5375f29ce9d3d0be93879267e3._comment | 11 + ..._ae4443b8cd069080d1f77fca16aa8b04._comment | 10 + .../Internal_Server_Error:_Unknown_UUID.mdwn | 37 + ..._f42f703a5d267557abf5e932f0890d4a._comment | 37 + ..._eb1999f99c5babf3fcb1ff5d72ea6db6._comment | 18 + ..._bda72b0d615843d18d6ef21f833432a8._comment | 9 + ..._651440cda405ad40a04479f5d87d581e._comment | 10 + ..._21fa189b631c246ac5df16a49c3c0178._comment | 8 + ..._1f712693d2ded5abceb869fdb7f47ef3._comment | 12 + ..._7a5ead0ce5c9429d4723ccce4f6a6d6c._comment | 14 + ..._a4683fd73ae452a9cd7f61d9930f6266._comment | 10 + ..._ced3516c3e7161e4d7e599232f62a511._comment | 8 + ...rror_unknown_UUID__59___cannot_modify.mdwn | 26 + ..._repo_after_deleted_an_encrypted_one..mdwn | 28 + ...server_error_adding_USB_drive_on_OS_X.mdwn | 25 + ..._b2ef077d87a9da624f20649c21401b5b._comment | 17 + ..._ef849e25b0264808bff800d9d3836119._comment | 10 + ..._ae3cbd0eb69cbeb9b349e0060d056d43._comment | 18 + ..._0ff2897805928b14829b7b369a3aed91._comment | 16 + ..._414a45573aeb5201f4d80433955669d5._comment | 12 + ..._cause_all_following_switches_to_fail.mdwn | 50 + ..._limit_uploads_to_an_S3_backend__63__.mdwn | 19 + ..._ef97e735ce308f7bcc03f5d9fda588bf._comment | 10 + ..._539b89de8743e435386b86119d1e982f._comment | 8 + .../Issue_on_OSX_with_some_system_limits.mdwn | 26 + ..._5fc1eedb5231edc37c87a2d9b91313b9._comment | 12 + ..._b14e697c211843163285aaa8de5bf4c6._comment | 12 + ..._18ddf8b5934dd6fb1676cd6adc7d103b._comment | 19 + ..._c25a8eb369e546f65e1a72d89f43066f._comment | 12 + ..._6407a3e7aa0316cba2994bfef0e3c633._comment | 37 + ..._f01887695e8b8386e125464c6d401565._comment | 8 + ..._c7776d5b2d073e0d2ae36515185c25aa._comment | 17 + ..._easy_to_turn_git-annex_into_a_zombie.mdwn | 25 + ..._d5fba6c061fb21795021ea83070dbfa2._comment | 8 + ..._12cba707239018989e8d5b6f456fa754._comment | 10 + ...roken_with___34__git_annex_sync__34__.mdwn | 21 + ..._380a49b3c132f9f529729a1cb5a69621._comment | 8 + ..._282f5f89fb4a46e1fad0980e0b2994a0._comment | 8 + ..._7ff98958146b7f6396226bdd878ec86e._comment | 10 + ..._f9e460a09e7e5f53c16c20ded2649201._comment | 8 + ...t_supported_on_Debian_Wheezy_backport.mdwn | 12 + ...daemon_leaves_ssh_mux_sessions_behind.mdwn | 38 + ..._17879b98a5e79ace03b543064751e46e._comment | 8 + ..._2dc877e281750004b16619ea7b931160._comment | 8 + ...esult_in_stale_symlinks_and_data_loss.mdwn | 57 + ..._52364dc5b1b43b51748453d1896e35c6._comment | 8 + ..._99b4db1841f8630a9c5efd08910e87a3._comment | 104 + ..._fbb410a54bb0bd82d0953ef58a88600e._comment | 24 + ..._8007c9ba42a951a4426255ec3c37d961._comment | 13 + ..._73ecd4cb8ee58a8dfe7cab0e893dbe5b._comment | 8 + ..._e8a10886a564f35414c30a04335d9d32._comment | 8 + ..._6a318edfe45c80343d017dc7b4837acb._comment | 8 + ..._f7a1d9f9d40aff531d873a95d2196edd._comment | 8 + ..._1724ffdf986301bf37ef7a6d16b6ea8a._comment | 10 + ..._5470e2f50e6506139ecb1b342371c509._comment | 10 + ..._e53148a9efa061a825f668a9492182f7._comment | 10 + ...rsions_didn__39__t_show_up_on_hackage.mdwn | 11 + ..._74b56dea2100450e322e726bb55bb310._comment | 8 + ..._64_bit_standalone_Linux_build_broken.mdwn | 18 + ..._428eba88016d50a6631fffa906815767._comment | 8 + ..._87f70b3eececca8a5b7946cff53e0a2f._comment | 10 + .../comment_3_manually_added._comment | 18 + ..._43947607472193e2199b98ee2192af30._comment | 8 + ..._support_for_glibc_2.13_debian_stable.mdwn | 43 + ..._dc7f726a0b60f64392cbbd1b4317bab5._comment | 10 + ..._4a0198d714bd3b52ba9baa68dc45f535._comment | 12 + doc/bugs/Local_files_not_found.mdwn | 50 + ..._5e1fcc0597594fa493ffa28aa32e1df8._comment | 12 + ...40__ssh__41___fails_to_pair__47__sync.mdwn | 175 + ..._bab9cd5bdcffec3c48b9e8657cd9bbf7._comment | 14 + ..._104898dce3c67c082a9f2b36e2f45ff8._comment | 10 + ...l_pairing_fails:_PairListener_crashed.mdwn | 18 + ..._d9c5d2147cf6d8d8477eb13b72081d46._comment | 12 + ..._60a21105145ac228f486bc4beb2ea54d._comment | 32 + ..._pairing_fails:_received_PairMsg_loop.mdwn | 39 + ..._b8c485bafd98be8c21595597af361255._comment | 8 + ..._bc63489334f44a423645021415ffe196._comment | 10 + ..._6345b174d04b6613c2c55a6ec9e50c21._comment | 16 + ..._f39ec6c3d5a016b3c5260162c0b42177._comment | 12 + ..._ca0c5ef6e6a6d2c4b64430ac68370b6a._comment | 8 + doc/bugs/Log_rotation_loses_large_logs.mdwn | 69 + doc/bugs/Lost_S3_Remote.mdwn | 59 + ..._6e80e6db6671581d471fc9a54181c04c._comment | 10 + ..._c99c65882a3924f4890e500f9492b442._comment | 8 + ..._1e434d5a20a692cd9dc7f6f8f20f30dd._comment | 8 + ..._creating_USB_repo___40__solved__41__.mdwn | 23 + ..._0b4dcedc58e5071733e1239490aed2ea._comment | 10 + ..._1cb1ef0292a3357874b461a77c13373e._comment | 8 + ..._e5ec1e3ab304d738e3b0847287a47af4._comment | 10 + ...ror_adding_S3_repo___40__solved__41__.mdwn | 28 + ..._d95accb43bd18cc9acbbf1d4069f86b3._comment | 8 + ..._452a3c524974832f0742efb00df4d576._comment | 13 + ..._f8f6d1e0065e5ba56cd405b1c021ca09._comment | 10 + ..._b524649cee751532d20a4894d71c5cf3._comment | 8 + ..._8312ba868ef616ec00563446c9c3464f._comment | 12 + ..._1af75c691d27c97397f1901f7c2483b0._comment | 8 + ..._e519df252875de87c4ef5b727f033bdf._comment | 8 + ..._4bb959e2659991cd392853e8beacf708._comment | 8 + ...S_X_Build_doesn__39__t_include_webapp.mdwn | 12 + ..._b918a741f2397b6588e7a9f1feca7e66._comment | 8 + ...on_still_too_old_for_.gitignore__63__.mdwn | 28 + ..._1768ece63499c643c75085773b6d4c18._comment | 8 + ..._888fb193072cf05a34943db072eb7a3b._comment | 8 + ..._f199ac6ae2448949ef0779177cf0ef58._comment | 8 + ..._version_too_old_to_honour_.gitignore.mdwn | 38 + .../Makefile_is_missing_dependancies.mdwn | 47 + ..._5a3da5f79c8563c7a450aa29728abe7c._comment | 47 + ..._416f12dbd0c2b841fac8164645b81df5._comment | 8 + ..._c38b6f4abc9b9ad413c3b83ca04386c3._comment | 25 + ..._cc13873175edf191047282700315beee._comment | 30 + ..._0a1c52e2c96d19b9c3eb7e99b8c2434f._comment | 59 + ..._24119fc5d5963ce9dd669f7dcf006859._comment | 10 + ..._96fd4725df4b54e670077a18d3ac4943._comment | 12 + ..._a3555e3286cdc2bfeb9cde0ff727ba74._comment | 8 + ...Manual_content_mode_isn__39__t_manual.mdwn | 89 + doc/bugs/Manual_mode_weirdness.mdwn | 37 + ..._f8ab3bac9e9a6768e5fd5a052f0d920f._comment | 8 + ..._e810daa488fad32ca8bdaae620051da8._comment | 8 + .../Matching_oddity_in_SafeCommand.hs.mdwn | 28 + ..._1a51630c0791547a7e0b68eea5d81e4c._comment | 8 + ...cc26206c4a539999b04664136c6f785211a41.mdwn | 35 + ..._after_local_pairing_with_older_annex.mdwn | 31 + ..._8229df64a872bee7590f75eb78f78c4a._comment | 10 + ..._f37be896396915b1c85cff8811dceb4a._comment | 12 + ..._df7fc1078059538a76f384a40541e91f._comment | 10 + ..._70c444c61f41df2f59294c10f94f0c09._comment | 8 + .../More_build_oddities_under_OpenBSD.mdwn | 37 + ..._09297f99f3c1c081738ca4ab32808fde._comment | 8 + ..._1407efc78b92a3c6156154f54e4a14e2._comment | 97 + ..._fdec033e37652c51fbcd74438586d285._comment | 12 + ..._ed3716baf787ca17d227ce2e327a1959._comment | 8 + ..._cf5f92e5cdfc738e7f6178c1d7a73ceb._comment | 11 + ..._ad4b7191c9b8f67def33b26a1d762a5d._comment | 26 + ..._2e765b5286d816bea00880a17a20cbfb._comment | 10 + ..._ded9011dcdbe4de05189a0e8d040f045._comment | 10 + ..._f7a85b46bf7afaaf431d6771219c66b0._comment | 16 + ..._217be2000e423e844241d405ba9f64c8._comment | 10 + ..._4ffea64907656ff2ec65ff4450aadda7._comment | 11 + ..._df72e5698ba2bf2eb4fa39c5b2c5be83._comment | 10 + ..._4fb96984757b3d37a1a5ebce664aa8fe._comment | 8 + ..._c5fdf29499a02be83850d1238fc8ce23._comment | 8 + ..._d42106128c3dac2dd7761a82cc03912f._comment | 9 + ..._71166beb796f22dcee065a167cd5e0ed._comment | 12 + ..._65913a2de8bbe981beaa66c58d2429b5._comment | 8 + ..._8dd46cec230125d1410d8e6824aeddf2._comment | 12 + ..._275d3e62cb5667a2d6ddd90db7a40bff._comment | 18 + ..._ec6a1eb6c7b264c23ec4bbd45465d7d8._comment | 12 + ...ness_with_the_assistant_branch_on_OSX.mdwn | 15 + ..._377525e70640751e1ead445aeed15efa._comment | 8 + ...t-annex_will_not_build_on_OpenIndiana.mdwn | 36 + ..._f3c336ecfee51e074ea3a9fc95301de5._comment | 8 + ..._102c0e998934e84deca92fd1c90145fa._comment | 8 + ..._1449dd796ce9f2209f085d4b017a5f33._comment | 19 + ..._c4aa8a4379b2c056ca9b7afcff412bbc._comment | 10 + ..._6ca4dd2ad51182edf7198f38b336b9b6._comment | 8 + ...heme_does_not_follow_git__39__s_rules.mdwn | 31 + ...nstall_c2hs_-_3.20121127_and_previous.mdwn | 37 + ...way_to_re-inject_a_file_into_an_annex.mdwn | 12 + ..._c871605e187f539f3bfe7478433e7fb5._comment | 8 + ..._e6f1e9eee8b8dfb60ca10c8cfd807ac9._comment | 10 + ..._be62be5fe819acc0cb8b878802decd46._comment | 14 + ..._480a4f72445a636eab1b1c0f816d365c._comment | 8 + ...manual_page_on_prebuilt_linux_version.mdwn | 18 + doc/bugs/No_progress_bars_with_S3.mdwn | 26 + ..._33a601201a9fdd2357f1c03e32fa6b9c._comment | 8 + ..._52361805ced99c22d663b3b1e8a5b221._comment | 8 + ..._5903c1c40c4562f4fbaccd1640fedb18._comment | 8 + ..._80799c33e513384894b390fe34ab312a._comment | 8 + doc/bugs/No_version_information_from_cli.mdwn | 18 + ...s_not_checked_when_running_with_--all.mdwn | 40 + ..._63af5a11c3ae370433c4bf84de097414._comment | 9 + ...y_large_and_not_inherently_compressed.mdwn | 68 + ...lias_permissions_and_versions_problem.mdwn | 37 + ..._4fabe32e7e626e6ca23aa0b6f449c4c6._comment | 14 + ..._064d60fcc8366a70958540bc145e611a._comment | 11 + ..._6c72d4f40ea0a9566a1185901beff5ba._comment | 14 + ..._8a11f404bb72a1aeb2290744cce2d00d._comment | 12 + ..._30888607199d6a48b76d0c48f5aa4f64._comment | 8 + doc/bugs/OSX_app_issues.mdwn | 5 + ..._54d8f3e429df9a9958370635c890abf0._comment | 11 + ..._6d23232fbb15d0ee3ab532a4884f81ed._comment | 10 + ..._5db2baa771fd01a284eac8a16c1c8c67._comment | 8 + ..._bb2ceb95a844449795addee6986d0763._comment | 26 + ..._62170597c7f441d84d48986857998858._comment | 10 + ..._f3bc5a4e4895ac9351786f0bdd8005ba._comment | 11 + ..._cb12d419459e5cac766022ee0697fedc._comment | 18 + ..._c966fa549bc73c52034ac9abc49de52a._comment | 8 + ..._10f1df95266f1a8c9ef933183190f6e2._comment | 8 + ..._064e151da121f9c2ef13c19ecb4e7458._comment | 16 + ..._0e6ac5e0a54ce78bdc56c62e6fb92846._comment | 8 + ..._fd560811c57df5cbc3976639642b8b19._comment | 8 + ..._93e0bb53ac2d7daef53426fbdc5f92d9._comment | 15 + ..._141eac2f3fb25fe18b4268786f00ad6a._comment | 8 + ..._f4d5b2645d7f29b80925159efb94a998._comment | 8 + ..._2e6dfca0fd8df04066769653724eae28._comment | 17 + ..._e1bbe83a1b9a7385ed6d443d0cc22bc7._comment | 18 + doc/bugs/OSX_app_issues/old.mdwn | 1 + ..._bb823dc3cd6dc914ed14c176afa0b2f3._comment | 8 + ..._a30e69fed14b0809184ffe05358ab871._comment | 10 + ..._23d47b3696e537d60df1d383f33f19e4._comment | 15 + ..._be5738b42b13ec8cd828c5fa66f030e8._comment | 10 + ..._5783a4716cd104e1f1c276aa0b9cb153._comment | 41 + ..._e126d87a263f3aa6261f72ee7ff086fc._comment | 8 + ..._56c7fcafc7dca8be28ebf9e37a8f6b71._comment | 23 + ..._e58bd3d66f0f43c159d2b37172f152de._comment | 8 + ..._01f2c968bad66b0ff0c09eb468325deb._comment | 8 + ..._0b7cd3d5952c5abf36a89a68a4afc1e7._comment | 8 + ..._82d9963e1fbf17644ce697e5a43943f5._comment | 16 + ..._c2de94a48e7958b9efffd89dda9144ff._comment | 59 + ..._29af9df9ea295d114574e76e15b8e737._comment | 8 + ..._88ddc846eb4e4a2d54028a3412ba28d6._comment | 12 + ..._6d6341b05123cd317c4eac96353c8662._comment | 10 + ..._aff4ab761c4d196732baa046af45fe24._comment | 11 + ..._43bd5985d8a3a5e7f826a34e5dd9216e._comment | 10 + ..._08613b2e2318680508483d204a43da76._comment | 76 + ..._4cda124b57ddc87645d5822f14ed5c59._comment | 8 + ..._0d1df34f83a8dac9c438d93806236818._comment | 8 + ..._12bd83e7e2327c992448e87bdb85d17e._comment | 15 + ..._bc44d5aea5f77e331a32913ada293730._comment | 27 + ..._cea97dbbfb566a9fe463365ca4511119._comment | 16 + ..._911f187d46890093a54859032ada2442._comment | 10 + ..._acd73cc5c4caa88099e2d2f19947aadf._comment | 8 + ..._08b091a58106ca6050ac669579ed9ff4._comment | 11 + ..._8464c839cb169a4c6e72bebdc2065e9a._comment | 8 + doc/bugs/OSX_build_broken.mdwn | 13 + ..._0b570aa6c58effeace2a989184c9c601._comment | 10 + ...rror:__LSOpenURLsWithRole__40____41__.mdwn | 26 + ..._0dfa839f1ba689b23f811787515b8cff._comment | 8 + ..._612b947eb5474f6d792a833e33105665._comment | 8 + ..._549b8bcae6f1f8b21932b734e32fbdd1._comment | 8 + ..._23078dfea127fa3ef20696eb10ce964c._comment | 10 + ..._7da5ef8325b8787bbf1c6e2c17b1142e._comment | 8 + .../OS_X_10.8:_Can__39__t_reopen_webapp.mdwn | 31 + ..._2653fe701a1bb20254f3d6b90f10a43b._comment | 18 + ..._d9ce701d077e40f39b142ce2cc570a3b._comment | 8 + ..._14964ab68253dc1a8903d14a821b8b40._comment | 10 + ..._4a579e9a13305ab4157f4b3eba46b92d._comment | 16 + ..._2a710960dc3a177ce62ef92f8546c496._comment | 12 + ..._a4ad73530cd0f6621bcc6394d5f39af7._comment | 41 + ...ut_the_first_copy_are_lost_on_unannex.mdwn | 54 + ..._f7149b684a97070cff051b780c73be48._comment | 15 + doc/bugs/Old_repository_stuck.mdwn | 9 + ...Error_when_push.default___61___simple.mdwn | 67 + ..._971224d2c0c0ce8d4530b1991508f849._comment | 12 + ..._6866f96277dbe83a8aadcdeb426b6750._comment | 8 + ..._eaed9b5532e30e401f50193a72b98310._comment | 13 + ..._1fab407f3823ce8cec87f5df55e49f8c._comment | 8 + ...__44___but_believes_it_has_succeeded..mdwn | 180 + ...P_sends_URLs_with_incorrect_separator.mdwn | 186 + ...use_a_USB_disk_annex_created_on_Linux.mdwn | 18 + ..._f224f4155d857a59595658357f97dac1._comment | 12 + ..._a_unix-style_local_remote_configured.mdwn | 22 + ..._95655915ff6ba9fb5d873358ff047496._comment | 10 + ...t_is_not_used__44___even_if_available.mdwn | 67 + ...he_Comitted_Symlinks_are_not_Relative.mdwn | 102 + ...___including_original_one__44___gone..mdwn | 240 + ..._3a3891c9d7ee808f6a71780cb628f23d._comment | 12 + ..._2bc6efb1d9e872cc5d4fbfbaaf5cc10e._comment | 27 + ..._fff1e778a6334258c173a96e6bf7ef6a._comment | 10 + ..._2a86da97a89e28f0a0f5e160d4932ae6._comment | 19 + ..._41b8e8e58025cc8c8f12efb9a51acd29._comment | 50 + ..._38afcd8e7fb278ca0ee2e9e0c9f6883e._comment | 10 + ..._06de36dcde4c52ab74c8134f3242ac02._comment | 9 + ...__41___even_if_repo_exists_on_Android.mdwn | 40 + ..._9f10bf273b15e93f1eea029f091f26cb._comment | 12 + ..._in_fsck_whereis_find_and_status_cmds.mdwn | 84 + ..._3aef6ca929fad198f2dda0868f2d49cb._comment | 18 + ..._f2c1aa84a0d04e840cb34ae15eb1cb03._comment | 8 + ..._480c39648e3ca6fc58c30377bdb25a8c._comment | 16 + ..._b31496b37046a9886f632ba4f11c56e3._comment | 8 + ..._d25ff424dda1f6021c1ba20f79d71ffc._comment | 12 + ..._9e3300b223dd54a3f07c650f5cf70ae0._comment | 8 + ..._b91f4a87b6d29ae6b4262922fd65a79d._comment | 8 + ...mment_in_ssh_public_key_ssh-rsa__34__.mdwn | 23 + .../Partial_direct__47__indirect_repo.mdwn | 24 + ..._42344fce051d759f95215c985e9d1135._comment | 12 + ..._8ba64f2750d0ef4adf595674c723bc65._comment | 8 + ..._bd4985864b7dcd70a609ca7bc2617e4a._comment | 8 + ..._39__typechange__39___and_direct_mode.mdwn | 32 + ..._84cb8c651584ec2887f6e1b7dc107190._comment | 8 + ...d_now_asks_for_a_commit_message__34__.mdwn | 18 + doc/bugs/Prevent_accidental_merges.mdwn | 14 + ..._4c46a193915eab8f308a04175cb2e40a._comment | 8 + .../Problem_when_dropping_unused_files.mdwn | 21 + ..._d4f6bfe8e04560fc661a47b09ed8a5f4._comment | 8 + ..._e1a99bd3eb8b3186653b52a52b1836de._comment | 10 + ..._dec3e5ffe5cfdc439f418ee00d7d9810._comment | 8 + ..._d106a87101db52f957da84d90dafcdbb._comment | 12 + ..._f28ed0635612693e437e64d872af5c37._comment | 8 + ..._f0237075653768c84deb702442645f28._comment | 8 + ..._b509006e1590480a104627369bc910f2._comment | 8 + ..._fe261c074211ccb94bbcb32cfd8ee654._comment | 14 + ..._bc8e4dc7e0d6577ba5fcc98f56627b1f._comment | 8 + ..._e9a22aa2ebcde5f6595b49dba9375761._comment | 14 + .../Problem_with_bup:_cannot_lock_refs.mdwn | 52 + doc/bugs/Problems_building_on_Mac_OS_X.mdwn | 62 + ..._1c199b826fdd84b5184b1466ad03a9a4._comment | 8 + doc/bugs/Problems_running_make_on_osx.mdwn | 49 + ..._94e4ac430140042a2d0fb5a16d86b4e5._comment | 8 + ..._56f1143fa191361d63b441741699e17f._comment | 8 + ..._ec5131624d0d2285d3b6880e47033f97._comment | 8 + ..._88ed095a448096bf8a69015a04e64df1._comment | 16 + ..._89a960b6706ed703b390a81a8bc4e311._comment | 8 + ..._6b8867b8e48bf807c955779c9f8f0909._comment | 71 + ..._5c2dd6002aadaab30841b77a5f5aed34._comment | 8 + ..._62fccb04b0e4b695312f7a3f32fb96ee._comment | 43 + ..._64fab50d95de619eb2e8f08f90237de1._comment | 24 + ..._4253988ed178054c8b6400beeed68a29._comment | 11 + ..._34120e82331ace01a6a4960862d38f2d._comment | 17 + ..._7db27d1a22666c831848bc6c06d66a84._comment | 10 + ..._cc53d1681d576186dbc868dd9801d551._comment | 8 + ..._68f0f8ae953589ae26d57310b40c878d._comment | 57 + ..._c52be386f79f14c8570a8f1397c68581._comment | 12 + ..._7f1330a1e541b0f3e2192e596d7f7bee._comment | 107 + ..._0c46f5165ceb5a7b9ea9689c33b3a4f8._comment | 9 + ..._237a137cce58a28abcc736cbf2c420b0._comment | 22 + ..._efafa203addf8fa79e33e21a87fb5a2b._comment | 8 + ..._cc283b485b3c95ba7eebc8f0c96969b3._comment | 66 + doc/bugs/Problems_with_syncing_gnucash.mdwn | 568 + ..._ca195af3ba4a286eb5ab687634192fa4._comment | 8 + ..._754fb430381ad88e6248ecb902b32118._comment | 20 + ..._25881998c6f149c70b1358f37b7c66ba._comment | 20 + doc/bugs/Provide_64-bit_standalone_build.mdwn | 6 + ..._1850bb3eb464f1d3c122cfeb4ccaf265._comment | 15 + doc/bugs/Proxy_support.mdwn | 18 + ...tween_watch__47__assistant_and_addurl.mdwn | 195 + ..._8f56b8661a600729d7a9d569e8a0ba70._comment | 55 + ..._46dc67bdcd174cd50ccc421ec56735ad._comment | 14 + ...mote_repo_and_set_operation_with_find.mdwn | 6 + ...positories_have_to_be_setup_encrypted.mdwn | 27 + ..._95f73315657bc35a8d3ff9b4ba207af0._comment | 8 + ..._sides_have_written_to_the_repository.mdwn | 70 + ..._92211091daf9827a4ec7e5b5a6769d59._comment | 8 + ..._f0fa97a9eba1c624f6f8720ba8a160b7._comment | 8 + ..._e3d677ea4170c07cd31efe6dc85fa5f3._comment | 8 + ...e_cannot_be_reactivated_by_the_webapp.mdwn | 30 + doc/bugs/Repository_deletion_error.mdwn | 46 + ..._31673d0300986b6098d1af2cc4b180c6._comment | 10 + ...ry_in_manual_mode_does_not_hold_files.mdwn | 305 + ..._86e8a4e546610e8e265806eb245d8aba._comment | 8 + ..._17d5775a38b67ba4f0e73f6b89cff2d0._comment | 8 + ...local_adresses_using_avahi_or_bonjour.mdwn | 16 + ..._71cfedf4328eab224c7fb797c420ad0a._comment | 8 + doc/bugs/Resource_exhausted.mdwn | 45 + ..._bccf9528ffe963154c92ce49762e7ea6._comment | 10 + ..._24ad3a76a25a787ac59e2c5270709e72._comment | 12 + ..._1943ff77f3bccf885229ecc10c82399d._comment | 12 + ..._c3cac0717232e04e89df62efa1db0870._comment | 8 + ..._a5ef7a62d4ed9365f9448520bb17e3b5._comment | 9 + ..._cdba2015e603f3c21f3e1697dd6fafcd._comment | 18 + ..._747d16d050fdcf69dd3d2bc5ca469a2e._comment | 39 + ..._1e9b74e60da57c3d5f08c1eb3801c1d2._comment | 10 + ..._f55d933bce77fd2185ebd0cc46fe57ec._comment | 64 + ..._26c98fca45b029a527f9684873db4be5._comment | 18 + ..._8bab413b472f900e04977db2bc3951b6._comment | 8 + ..._e9bec0b80179b1229b6af0979a21c727._comment | 9 + ..._419e24e0b91f569294ece28c42daa246._comment | 15 + ...somewhere_in_the___39__get__39___code.mdwn | 24 + ..._66b21720cd1b2a4f66ef24252d3e6305._comment | 8 + ..._18c9f55c5af1f4f690a7727df71ab561._comment | 8 + ...ks_for_ssh_key_password_for_each_file.mdwn | 30 + ..._fd95e0bb61e80a72b4ac1304ef6c2e77._comment | 16 + ...mote_created_via_webapp_remains_empty.mdwn | 138 + ..._cccf9d58c0ebb8d31cacdd029ea8e23a._comment | 12 + ...e_same_key_for_encryption_and_hashing.mdwn | 10 + ..._dc5ae7af499203cfd903e866595b8fea._comment | 18 + ..._c62daf5b3bfcd2f684262c96ef6628c1._comment | 12 + ..._e1f39c4af5bdb0daabf000da80858cd9._comment | 10 + ..._bb6b814ab961818d514f6553455d2bf3._comment | 8 + ..._5bb128f6d2ca4b5e4d881fae297fa1f8._comment | 8 + ..._63fb74da342751fc35e1850409c506f6._comment | 8 + ...capital_letters_breaks_authentication.mdwn | 32 + doc/bugs/S3_memory_leaks.mdwn | 14 + ..._a7268213b090bce6b1f1858a8e23d90e._comment | 14 + ..._320a8e3bb7b207d1aff8926b9247f5ba._comment | 8 + doc/bugs/S3_upload_not_using_multipart.mdwn | 53 + ...SH_too_old_on_OS_X_10.6.8__63____41__.mdwn | 27 + ..._0c57a2196d35eb1ecfb0c51273bba05c._comment | 10 + ...lts_on_Fedora_18_with_SELinux_enabled.mdwn | 65 + ..._f708d87aa65cd38c20087859d3ab2dc7._comment | 12 + ..._fb7188db031147992f3c906783ebbee0._comment | 59 + ...tificates_with_jabber_fail_miserably..mdwn | 22 + ..._13d27ba41d9ef78c8db534b6bc26314e._comment | 12 + ..._018eed99e71680be9e7c0844020419bb._comment | 8 + ..._1e7578dd1321f399b12197056495b0b6._comment | 8 + doc/bugs/Share_with_friends_crash_in_osx.mdwn | 370 + ..._8d90e23514d9f14283857c57017a5fcf._comment | 8 + ..._1a0e174969e99e7b562854d2c3b3e606._comment | 19 + ..._dfde39222a91923c570e5405d9e527f4._comment | 8 + ..._65de2b5dd3af89c2f0f6508ffddda3b5._comment | 12 + ..._804c394e97223b1f9cc9f1f3adaa2e74._comment | 14 + ..._f1fe0c05724236988e77f4b7f393e7d5._comment | 12 + ..._3d9ec79231e1b340b5e8b7b63a902546._comment | 9 + ..._f63bb1d29fc7130bfa0c15feeba4e5fd._comment | 19 + ..._a024902e300cf50e8f6a63c7feef63a1._comment | 10 + ..._baf0333f307dff0f79cd7c73b4c56c18._comment | 356 + ..._849759a5c92de57733b14adce2f49c14._comment | 10 + ..._01530dd4ddbf620435a4d8f1edeaee8e._comment | 17 + ..._6ef922e1ebb72db8ebbff4a76017e535._comment | 19 + ...s_for_Remotes_be_case_sensitive__63__.mdwn | 46 + ..._00b52dba3bc30516e06c44cbfd3a05a2._comment | 17 + ..._8f5fa659c2ab91b1757bac31cd3b15eb._comment | 10 + ..._ccf9623d60c58d036d8bf24757e50de3._comment | 10 + ...d_ignore_.thumbnails__47___on_android.mdwn | 28 + ...en_network_fails___40__esp._DNS__41__.mdwn | 50 + ..._dd792bd98a48554a65150c06401ed3e5._comment | 12 + .../Small_archive_behaving_like_archive.mdwn | 33 + ..._718dc246cbbbeae04436fa033011ab12._comment | 13 + ..._34___instead_applies_it_to_all_files.mdwn | 75 + ..._2fe6d735bc075275a6b8890fac48ee58._comment | 18 + doc/bugs/Stale_lock_files_on_Android.mdwn | 44 + doc/bugs/Stress_test.mdwn | 45 + ..._1694e990eab6592159309c231c6dcc16._comment | 12 + ..._ab4cb6eefd279e6c1f229e089f703581._comment | 25 + ..._c4c764488ac082f5c48d3a6b4b5fba42._comment | 17 + ..._42125bba09a0ea9821cda7183e458100._comment | 47 + ..._8240e61106b494d3600ad91f16eb5b1c._comment | 20 + ..._c38d84e0dcc834931804c44bce7f7b7a._comment | 11 + ..._60ce20ee255451c4ea809ba475561adb._comment | 15 + ..._1371562e201393986cd41597f6f288cb._comment | 14 + ..._a14be7699da224a8f6c9b34f1b911219._comment | 8 + ..._a01995bdca7ade7dde9842b53fbc4e0c._comment | 57 + ..._9f7efe81b7e40aaa04a865394c53e20f._comment | 52 + ...omps_on___39__regular__39___git_files.mdwn | 27 + ..._0d2cb3b8509cd0eba50aafa14afefc02._comment | 63 + ...mode_to_direct_mode_breaks_duplicates.mdwn | 30 + ...er_is_not_honoring_--listen_parameter.mdwn | 24 + ..._4dd773372979dd95538bfba6516a11eb._comment | 9 + ..._outside_git_repository_not_supported.mdwn | 27 + ..._06ac38f32039ad43b0c2623c8fdb1df6._comment | 8 + ..._91a8daa3d49799d0784c9fe3ee10558a._comment | 10 + ..._166ae413b7c41f00f13292855ac66974._comment | 8 + ..._broken_links_instead_of_proper_files.mdwn | 51 + ..._a2bedb2e77451b02fc66fc9ef5c4405c._comment | 11 + ...n_in_recent_versions_of_the_assistant.mdwn | 132 + ..._8100505a7ac74646e0767d03fe643a45._comment | 8 + ..._9833e8f77c6148db9572316066a67eee._comment | 8 + ..._1504f8767f1f4415222d8c315c734e81._comment | 9 + .../Test_failure_on_debian_dropunused.mdwn | 31 + ...4__conflictor_directory_missing__34__.mdwn | 1175 ++ ..._dfb520258fdd633285b44cb16fd35612._comment | 12 + ..._7908bf367652d2485ec703ae8958891b._comment | 8 + ..._30684a993b667b2594890f734638e91b._comment | 142 + ..._30e847ff438eda036c57cc740b638d8a._comment | 12 + ..._04232cf2097676057cddf841ad47f44c._comment | 86 + ..._9cb32f198eee25b7175cc9ad1795acb3._comment | 8 + ..._f8a70156d56c4be6cfbadb50e8a08285._comment | 174 + ..._02699dbf30270db090b00192850831db._comment | 10 + doc/bugs/The_assistant_hangs_forever.mdwn | 46 + ..._b0291e32860e0da0b66837d14ed5aab6._comment | 8 + ..._a2950cf91b8a4e4f2951f5522ef0e9c4._comment | 18 + ..._db95f78519d5ffbad793906028730dab._comment | 12 + ..._28b13fd3165b38a2fbc9e1a461c38921._comment | 22 + ..._81a79c8840ff26307a9c6edad5b850f9._comment | 9 + ..._b739719b14705f4d7e1d412b3cab090c._comment | 17 + ..._2b300d960697c5b967c1f109dfd6dfbf._comment | 16 + ..._8623220d08b1a72ed8b669a2d9cc0f75._comment | 15 + ...d_login___40__nearly__41___impossible.mdwn | 29 + ..._8305becdc6e70abdaf17e42f263173fc._comment | 12 + ..._d75896a6e204d1abdda04923aa668d04._comment | 8 + ..._a36a4a64a04c01c2db467b09300e6ebd._comment | 8 + ..._c9d6631c304acb289e485fb901e1f274._comment | 35 + ..._10282c4352075c8d148b8674973b7b16._comment | 22 + ..._ceb68da01d9e2fe9a70fab6244116da0._comment | 15 + ..._cca4abde86a8be5e2919c4738f5bdd0c._comment | 18 + ..._2fa5d7d9110c91b0a3a833cb3d9f53fd._comment | 10 + ..._bf21d28142e4c304aa0bc740955ddea0._comment | 10 + ..._45537758fa937f16fc82120bf8b234e8._comment | 8 + ..._a38497772834a4b12137390b461ce70b._comment | 12 + ..._b685050ee6fbb1a685e33f9656a10e84._comment | 8 + ..._17bc0220c20553c848875475c5fd4ae6._comment | 12 + ..._76472bc58bb790f773c46ec2c39fcf88._comment | 11 + ..._dcd9286e314779c25764484beff40561._comment | 10 + ..._2146eec77b87b615100d0d003e8dce75._comment | 15 + ..._2bd6f4e04903ee251d43d0a97bd40b6e._comment | 8 + ..._7db8ed002eb6313b07f09bd1a34019e3._comment | 10 + ..._1bcb2a238006044bc78849e56cb21a01._comment | 9 + ..._26c6937cf78e7141e0e3b20f25ed8f7a._comment | 8 + ...dfb2e706da2cb1451193c658dc676b0530968.mdwn | 23 + ...sn__39__t_allow_deleting_repositories.mdwn | 33 + ..._1b80f9cfedd25e34997fa07e08d15012._comment | 8 + ..._53499da1185c56d8fd25f86ba41d96ce._comment | 11 + ..._3e07b8386d2c7afce2a78d24b9c260b9._comment | 14 + doc/bugs/Too_many_open_files.mdwn | 59 + ..._d5d509b9b431d2ea6000ebc0aed62857._comment | 8 + doc/bugs/Too_much_system_load_on_startup.mdwn | 24 + ..._4470cddc0965062588acff1bc77285e9._comment | 8 + .../TransferScanner_crash_on_Android.mdwn | 28 + ..._6c3584ade1ee6cccddddeaa8e1697945._comment | 20 + ..._06574e05149a677d666a722061586658._comment | 10 + ..._54ae097d30bb7a49fe151f38c9bac033._comment | 8 + ...ansfers_continue_after_daemon_stopped.mdwn | 5 + ..._39eb527d64367e6762281246f1d49b1f._comment | 12 + ...oad_to_remote_although_remote_is_dead.mdwn | 51 + ..._108b3984891f82429430b503cddfb3c1._comment | 10 + ..._fa5b1bc26ed3e5bfe48441490c94fe3a._comment | 8 + ..._0a785b5dfbf4eef30854d6bedb12b7d1._comment | 10 + ...Trouble_initializing_git_annex_on_NFS.mdwn | 16 + ..._e26952373150d63b8a5d3643a2762de1._comment | 10 + ..._f80b10ed395738e50e345fc22c708ae5._comment | 10 + ..._f99e0f05950fc2fc80fdecd35e17012c._comment | 8 + ..._e42146d2dcc4052266dd61d204aeb551._comment | 8 + doc/bugs/True_backup_support.mdwn | 7 + ..._50aa0bc1e2502622585682cb703e0b85._comment | 10 + ..._d6030c6c49b227e022f05d590746d4ca._comment | 8 + .../Truncated_file_transferred_via_S3.mdwn | 614 ++ ..._5962358e6067448f633cc0eaf42f9ca7._comment | 10 + ..._75a2c272c36fc4fe8f9a79a3fd3ac4e5._comment | 19 + ..._3dae1914c8c90fdad0c21e1fc795f2ca._comment | 8 + ..._3c5fe109f2196cfc196c30da3b62bafd._comment | 10 + ..._f86f83c89300f255e730ddd23f876f61._comment | 16 + doc/bugs/USB_drive_not_syncing.mdwn | 519 + ..._de76bd6b9f8eb2489d4854a4c8ddd308._comment | 15 + ..._on_Android_due_to_weird_rename_error.mdwn | 37 + ..._928289956111d1b22f9d55f15b54f72f._comment | 10 + ..._6a0cb836b93ba4cb1e07b11d5d2a7094._comment | 8 + doc/bugs/Unable_to_copy_from_Android.mdwn | 148 + ..._3bb70c44b6b8d451687591fcab5c1506._comment | 8 + doc/bugs/Unable_to_import_feed.mdwn | 27 + ..._16230fbbb996e165b84787ed4d5f72ea._comment | 45 + .../Unable_to_switch_back_to_direct_mode.mdwn | 55 + ..._4585b251f011a153c62f377c324cf963._comment | 24 + ..._5848ebbab38d1244347f7e7351b3a30d._comment | 10 + ..._1c5c7b0c7bc336e00f43e257b87a6208._comment | 8 + ..._b0bfd68998bc3e11d8e089646b8292a6._comment | 12 + ..._to_sync_a_second_machine_through_Box.mdwn | 46 + ..._cb43a2bc976e3eb1cfc3ee9d4d34e78e._comment | 22 + ..._3375e9bfab3fed271413bd9bb5fa0121._comment | 30 + ..._c4420e1a3db321b4135b1626d3582adb._comment | 12 + ..._f4b2c88bb5938dacdd04dfe9a68560de._comment | 18 + ..._6dcc95ffb3fc7bbbedd6be5df0111c85._comment | 8 + ...to_use_remotes_with_space_in_the_path.mdwn | 35 + .../Unfortunate_interaction_with_Calibre.mdwn | 24 + ..._7cb5561f11dfc7726a537ddde2477489._comment | 8 + ..._b8ae4bc589c787dacc08ab2ee5491d6e._comment | 8 + ..._977c5f6b82f9e18cdd81d57005bb8b89._comment | 8 + ..._ff7d2e9a39dfe12b975d04650ac57cc4._comment | 8 + ..._fc4d5301797589e92cc9a24697b2155d._comment | 15 + ...Unicode_file_names_ignored_on_Windows.mdwn | 41 + ..._3dfa4559dceec50c08ba180f41b4c220._comment | 14 + ..._4dafea4367d455c2e63b0f7b1cc39559._comment | 10 + ..._bdde68a990a330ee0cf626be44b1c132._comment | 8 + ..._9140fb8034b1449ee2f4762093bc1f89._comment | 10 + ..._661ca15b68bc0e3fbe85f11400570446._comment | 15 + ..._0e8820169c0300d296c697154fd05dc4._comment | 8 + ..._b23a2bf106053f105798b270536057e5._comment | 38 + ..._7f23911705eaa58a9230f19ab890e87f._comment | 12 + .../Unknown_command___39__list__39__.mdwn | 15 + ..._c625d03d1ed2019141ac9202f933466d._comment | 8 + ..._800e1b6417768bdadda311ebfb5df637._comment | 8 + ..._35dfc75ce9efffff139f8929dc311e29._comment | 10 + doc/bugs/Unknown_remote_type_webdav.mdwn | 8 + doc/bugs/Unnecessary_remote_transfers.mdwn | 27 + ..._b778fbb1386f0f51bf057ffacd590ebb._comment | 12 + ..._55430eac842d0a192dc7f41d7730e4d5._comment | 10 + ..._00c18e07678dc513a02d974fe059df73._comment | 12 + ..._2e9992dbfceabd6df535a2770626de16._comment | 35 + ..._a98f3091a6a658919f0562cf396439c2._comment | 8 + ..._417c1e8e27ee1a1f9ebf9160560605c5._comment | 96 + ..._eb5a2717a1f0c7bb761d2a7866b23def._comment | 8 + ..._89f756db1f3f2e60a3bd1f35f55fee43._comment | 40 + ..._5aaf8766a7ba05c4f92715e5d5175a8f._comment | 13 + ..._e856b350632cc865d16d1995a6cdf065._comment | 14 + ..._64f831545b34b78452952cf49b5f5b05._comment | 25 + ..._tracking_branches_into_account__63__.mdwn | 18 + ..._8fe44da0581d9b8c6ab5fe6aea8d83d1._comment | 8 + ...ncy_on_certificate___62____61___1.3.3.mdwn | 64 + ...ository_on_the_server_don__39__t_work.mdwn | 49 + ..._2143f0540fdcd7efeb25b5a3b54fe0fd._comment | 12 + ..._bca95245b457631d08b47591da6163ad._comment | 9 + ..._f54bb003096752dae0442660267a1e37._comment | 11 + ..._38bb916ed5b90b92ffa91a452ff052a9._comment | 10 + ..._5b6ef464ab1ad061f27122db40191e26._comment | 8 + ..._3727bda5082cb1f2b1f746f9f80ced7d._comment | 8 + ..._a7139f19f0b73c024cd9218eb01e6104._comment | 8 + ..._35c949aca52de83af4881a9da6340185._comment | 8 + ..._9100031689eaa460791191d9bfb746d8._comment | 8 + ..._Github_as_remote_throws_proxy_errors.mdwn | 27 + ..._10616b17c3fb8286fdc64c841023f8a1._comment | 9 + ..._8a72887d33e492a041f8246d93d0c778._comment | 8 + doc/bugs/Using_a_revoked_GPG_key.mdwn | 34 + ..._7bb01d081282e5b02b7720b2953fe5be._comment | 8 + ..._9c0c40360f0058a4bd346c1362e302b6._comment | 8 + ..._8f69f58107246595f5603f35c4aa7395._comment | 8 + ..._78b3c52ba85edfa6ee6e273bec3bea5c._comment | 13 + ..._a85ccf2f09ebe87147f8761b81a02326._comment | 8 + ..._8b89eb5e6386acd0a922310c04f863ac._comment | 12 + ..._20dc5a7ce7cb6ca97ccdfb923c3b24bb._comment | 10 + ..._9dc921dc6077f828454a4444088b9a43._comment | 15 + ..._f50c802d78041fd1522f0e7599ce6a45._comment | 42 + doc/bugs/WEBDAV_443.mdwn | 307 + ..._9ee2c5ed44295455af890caee7b06f1a._comment | 18 + ..._863a7d315212c9a8ab8f6fafa5d1b7f5._comment | 8 + ..._c17a4e23011e0a917dbe0ecf7e9f0cb5._comment | 8 + ..._3414416ff455d2fd1a7c7e7c4554b54d._comment | 11 + ..._e1da141eefb0445c217e5f5c119356da._comment | 8 + ..._41c3134bcc222b97bf183559723713d9._comment | 27 + ..._89621b526065b5bef753ce75db1af7b5._comment | 14 + ..._131a1b65c8008cf9f02c93d4fb75720b._comment | 10 + ..._b4f894a0b9ebb84ab73f6ffcf0778090._comment | 29 + ..._c6572ca1eaaf89b01c0ed99a4058412f._comment | 10 + ..._a357969cde382a91e13920ee1e9f711c._comment | 8 + ..._213815d6b827d467c60f3e8af925813b._comment | 14 + ..._b775be4b722fc7124d9fbe2d5d01cc9f._comment | 22 + ..._c4ea745da437e56b2426d1c2c00dfcec._comment | 17 + ..._ef05c0ae88fee9c626922c6064ffdf1e._comment | 8 + ..._eecabe8d5ed564cb540450770ca7d0b6._comment | 8 + ..._7f77ba8ebd90186d3b3949ae529ba393._comment | 12 + ..._87ebdc92b48d672964fb3f248c53600f._comment | 9 + ...WORM:_Handle_long_filenames_correctly.mdwn | 4 + ..._77aa9cafbe20367a41377f3edccc9ddb._comment | 10 + ..._fe735d728878d889ccd34ec12b3a7dea._comment | 8 + ..._2bf0f02d27190578e8f4a32ddb195a0a._comment | 10 + ..._8f7ba9372463863dda5aae13205861bf._comment | 8 + ...539999b04664136c6f785211a41_segfaults.mdwn | 31 + ..._6c872dff4fcc63c16bf69d1e96891c89._comment | 8 + ..._5cad24007f819e4be193123dab0d511a._comment | 10 + ..._d449bf656a59d424833f9ab5a7fb4e82._comment | 8 + ..._ffb1ce41477ad60840abd7a89a133067._comment | 8 + ..._cebbc138c6861c086bb7937b54f5adbc._comment | 8 + ..._5e27737a5bb0e9e46c98708700318e67._comment | 8 + ..._1f92da712232d050e085a4f39063d7a6._comment | 21 + ..._4153dc8029c545f8e86584a38bd536fb._comment | 15 + ..._f85b6eb5bfd28ffc6973fb4ab0fe4337._comment | 8 + ..._c747c488461c98cd285b51d3afc2c3eb._comment | 10 + ...her_crashed:_addWatch:_does_not_exist.mdwn | 25 + ..._24f511a8103727894c6e96798a559870._comment | 10 + ..._e14eddbc09cadbf1e4dbbb0c07e0e5b0._comment | 10 + ..._513fae4d379008f954a307be8df34976._comment | 13 + ..._172eaeb3bb8b502379695aba35f96120._comment | 12 + ..._8adb9de82cc8581422734acc66dd094c._comment | 11 + ..._02f0beef1188bfa336bf4220eb5c6286._comment | 13 + ..._47__storage__47__sdcard1_-_bug__63__.mdwn | 45 + ..._71b052be40fbdaca09ca3ede8c59ac7a._comment | 8 + ..._0f7cc02e0193c969c9b6ceb27e71af8a._comment | 20 + ..._1a7542249b9c37507126e97441057c12._comment | 12 + doc/bugs/WebDAV_HandshakeFailed_.mdwn | 7 + ..._40499110ea43bc99ad9dd9f642da434c._comment | 15 + ..._506712e8cc5b47b9bd69edf67ae54da7._comment | 10 + ..._5641481d9e9ed2b711b1516f1abc5c30._comment | 8 + ..._1d609de93fa66ce9dc802e67b5922243._comment | 8 + ..._62761882d30c1b02930c938cb8e30ed4._comment | 10 + ..._acda8fae848ec486ce2a0b3dff3bd0a5._comment | 8 + ..._6c51b6c7dd477d8911dd9a7a5c41ea2e._comment | 8 + ..._e834f791d3000669fab25732a7c72ab3._comment | 13 + ...Webapp_fails_to_resolve_ipv6_hostname.mdwn | 15 + ...aviour_of_direct_and_indirect_annexes.mdwn | 57 + ..._56474a69c2f174d83be9137d3c045a47._comment | 33 + doc/bugs/Weird_directories_appearing.mdwn | 82 + ..._989541faf18e476c06e3be94c979e588._comment | 10 + ..._7aedaa3286a827303d90bd660429f0e7._comment | 43 + ..._5d3afa17d1e038c66a2cb6400b74aa41._comment | 8 + ..._8db476bc89d3b9b1fdd82624829b4975._comment | 8 + ..._4f3a8e3b0201829059c6e7e0cff0ff75._comment | 10 + ..._1c3218c8858397acc0e9fd718d7fd973._comment | 8 + ..._9d055063f58042ff048c5b71e9e67f6e._comment | 8 + ..._b39be0251e96099142b659f3c8340293._comment | 8 + ..._431c62c81573468ccf99eeed6ecc2bfd._comment | 8 + ...4___git_annex_uses_9x_times_diskspace.mdwn | 49 + .../comment_0._comment | 34 + ..._037a6dd6e15ef5f789a1f364f7507b53._comment | 45 + ..._614e4110188fc6474e7da50fc4281e13._comment | 10 + ..._dcb74fb91e1c2f0db4efd68c8bcbc96c._comment | 20 + ..._38671ba8d302f4d32460d1478abd2111._comment | 45 + ..._483244b1ed5744308022465f45c091fd._comment | 14 + ..._d2c63723fa4bf828873770a42ffaab20._comment | 8 + ..._52f0db73dc38c3e3a73f6c7a420bf016._comment | 8 + ..._93596b4d5a48ffcf4bc11ba9c83cf7ca._comment | 9 + ..._de94e80dde6d12485140bb079d74d775._comment | 14 + ..._5f34c3d449247b4bce4665b3ea4d054c._comment | 25 + ..._b43ae8aec23ba3acaf70edc0de058710._comment | 17 + ..._13b8e0a62f6b6d02960687e206a8b016._comment | 15 + ..._818b94a74b01a210d1106dd35bc932d8._comment | 10 + ...and_Linux_in_direct_mode_confuses_git.mdwn | 384 + ..._155e0c4d3aa41eebfe27533ab70a91d3._comment | 68 + doc/bugs/Windows_build_test_failures.mdwn | 1232 +++ ..._ea7523fdbafdc8be2971df52d9038826._comment | 10 + ..._and_wget__44___but_not_required_DLLs.mdwn | 17 + ..._a7bf0f027f2209e5632e292afd7214d0._comment | 10 + ...e_letters_cause_git_annex_get_to_fail.mdwn | 131 + ..._c87bae87b7902db60a3fef41e1fca85d._comment | 9 + ..._9e3c1f1ba05d8996b5a95829ce32c07e._comment | 10 + ..._3a0787912f4a3a8797b7786f5ce38590._comment | 8 + ..._c4249f32d65594d79ea01145b93ec948._comment | 9 + ...S3__44___GPG_ask_for_a_new_passphrase.mdwn | 21 + ..._a4fc30bf7d39cae337286e9e815e6cba._comment | 13 + ..._e5d42b623017acedf6a3890ce15680a3._comment | 12 + ..._e5150b65b514896e14b9ad3d951963f7._comment | 10 + ..._47c2fc167b0c396edc40468fb7c7bfee._comment | 8 + ...emote_annexes_have_at_least_numcopies.mdwn | 39 + ...ong_port_while_configuring_ssh_remote.mdwn | 35 + ...esses_and__47__or_stuck_git_processes.mdwn | 44 + ..._0f8b248025722309e9577d7dad74b76b._comment | 10 + ..._f5f7db688a2a93ee7453674fb742043b._comment | 52 + ..._ffcae976aa3dc2426188797c1aaffb82._comment | 10 + ..._8a7ff6841ad7c27ead06bf12f46b20a0._comment | 49 + ..._406fdee0728680774a69d28446163f10._comment | 26 + ...dding_4923_files__34___is_really_slow.mdwn | 100 + ..._5f3b9f00bc31ce71d695c008971ed7fd._comment | 16 + ..._708b02dd06a1eed6b5ded9eb7aa9e7a8._comment | 16 + ..._6a735b7875d2a0c92df6786dd649985d._comment | 28 + ..._7e768908ba6983ea13af27635c4a947f._comment | 12 + ..._34__Network_unreachable__34___error..mdwn | 42 + ..._6d821af99ab3c83a5b0f52d3713ab8e2._comment | 10 + ..._206b6c8cce8350fc088f01c42fc4715b._comment | 8 + ..._ed36f503f88611382b50687608b9b7e7._comment | 10 + ...rating_in_a_symlink__39__ed_directory.mdwn | 18 + ...etes_all_files_with_identical_content.mdwn | 49 + ..._2eb20b65582fa7f271b1d0bb5560d08c._comment | 10 + ..._b14e1d31dd6a8fb930fcc0bec798e194._comment | 19 + ..._1892bcfbe3c462aa74552a241d65cad9._comment | 8 + ..._dfa0e31996eaa14e2945c1d11670c4d9._comment | 15 + ..._e2a9336cf1080c158765d4adfe72f26b._comment | 9 + .../__34__fatal:_bad_config_file__34__.mdwn | 14 + ...4__git_annex_watch__34___adds_map.dot.mdwn | 23 + .../__34__make_test__34___fails_silently.mdwn | 4 + ..._f868e34f41d828d4571968d1ab07820a._comment | 16 + ..._fb9e8e2716b0dea15b0d4807ae7cd114._comment | 8 + ...e_a_repository_there__39___on_Windows.mdwn | 32 + ...epo_on_other_drive_than_C:_on_Windows.mdwn | 36 + ..._ea3b2c0e3bdfb50ac0dce10ba1b6339f._comment | 24 + ...it_add__39___for_parent_relative_path.mdwn | 15 + ...ulling_in___39__archive__39___content.mdwn | 24 + ..._56f9cd5cc2e089b32cb076dc2e2a8ca5._comment | 22 + ..._21c0f7f328cb51080fbd97e086c47a30._comment | 37 + ..._3287b2f25f3b5ae4c27f4748694563ee._comment | 8 + ..._e515eca68a70d40c522805d7e0d7c0e6._comment | 24 + ..._b27f4c103dda050b6e9cf03ea3157abc._comment | 10 + ..._2cc7083dab944705bf91fc00319b75e6._comment | 9 + ..._1175f9be789d4c1907f0be98e435bd2f._comment | 10 + ..._78e6164ef67a9560a3a9ead1f7a72473._comment | 15 + ..._1d578fd13022dcd6382b415a7f6e097a._comment | 8 + ...ot_installed_automatically_on_xubuntu.mdwn | 22 + ..._f4656f8a0f36535def0772db06098c5f._comment | 13 + ...kcheck_that_satisfies___62____61__2.1.mdwn | 40 + ...ause_syncing_with_specific_repository.mdwn | 8 + ..._it_easily_with_the_terminal_app_menu.mdwn | 23 + ..._9bb53c45d685b368c7ba1758885f2874._comment | 12 + ..._251311a04f1a610e54ebe8e9b92de72e._comment | 13 + ..._83ac87a01639776a6e519af226bd84d5._comment | 8 + ...nux_accessed_from_a_windows_git-annex.mdwn | 27 + ..._symlinks_are_fixed_in_the_background.mdwn | 51 + ...6___run_on_non-annexed_files_is_no-op.mdwn | 15 + ..._9b671e583eec5adf870dccd1e97b5dbc._comment | 8 + ..._d11744202213d6f897f4234bc4c70c18._comment | 9 + ..._a729deb465ff44f5a9b87c963cd6235a._comment | 15 + ..._3f735503df9a08472d42fabd219c2ec5._comment | 31 + ..._2c61eabbba7fd2a52ba02d59a0a76a42._comment | 8 + ...96_____95__revives__95___repositories.mdwn | 88 + ..._930b40e0f68da95d335eea5bd4216126._comment | 12 + ..._5397d488bc337cb3d7cb46ed774d0437._comment | 90 + ..._1b30e7611ec824dc6e79ef35e43ac740._comment | 10 + ...git_annex_import__96___clobbers_mtime.mdwn | 62 + ..._d173f2903faf4bff115a0be02c146ce9._comment | 8 + ..._3563d9eeb9806f8ca1b9b340925837f5._comment | 18 + ..._d5c7488db16b71c4f337662c897278ca._comment | 95 + ..._7235130786e764ec3ad5facfecde62da._comment | 8 + ..._work_on_other_git_annex_repositories.mdwn | 113 + ..._94ccd548c084286163eeb2af1ddc18e3._comment | 8 + ..._befde3ef3d2b171ebb691915ff3af172._comment | 8 + ..._git_annex_sync__96___ignores_remotes.mdwn | 106 + ..._39421e6935233cd8f45949ebdef369fe._comment | 9 + ..._53fb15d6fbf96d43564ff7c866239d18._comment | 8 + ...__fails_due_to_missing_stm_dependency.mdwn | 95 + ..._86e26ee9ec90aa00f25392052737f0f0._comment | 36 + ...ch_repositories_on_android__in_webapp.mdwn | 21 + ..._d488d71a72eb54d7711d2a867db6172f._comment | 8 + ..._85b31db6d0fb2d20018db3d8c8258bf4._comment | 8 + ..._9ffafbeb572e110b3e072029d1ce177c._comment | 8 + .../acl_not_honoured_in_rsync_remote.mdwn | 57 + ..._aa6fe1d7b029eae7ee71c97e0f0937a6._comment | 8 + ..._ffb9424e966ee10a4fe2d446b3042cb2._comment | 10 + ..._to___34__git_annex_dropunused__34___.mdwn | 21 + .../add_script-friendly_output_options.mdwn | 19 + ...kes___39__git_annex_unused__39___slow.mdwn | 87 + ..._d350c39c67031c500e3224e92c0029ea._comment | 19 + ..._b2d2b1caa51ffec3d87c36b373cb8d4a._comment | 20 + ..._12b20cbbc2b4cd1ab8af7e3eec9589b4._comment | 30 + ..._a50b43c15d2650df90f0fa1ced47f532._comment | 10 + ..._7328bc51bd001f2b732a92a2ae175839._comment | 114 + ..._880ef2ee797221332dbb629b2d55522f._comment | 10 + ..._826fd82cdf9b1c79c9b555ca26c2c176._comment | 8 + ...g_an_rsync.net_repo_give_an_gpg_error.mdwn | 22 + ..._f55cfc133be72ac10cae93c877c487df._comment | 21 + ..._24dd024ac4b21a82a781343b8fe3891e._comment | 11 + ...__and_reports_fail__44___but_succeeds.mdwn | 197 + ..._1f5e0bc93631baf0f8c1bec2e68493c5._comment | 20 + ...th_--file_doesn__39__t_actually_relax.mdwn | 26 + .../addurl_fails_on_the_internet_archive.mdwn | 65 + ..._e227aa25eea0b41f1176037a601c5844._comment | 10 + ..._6d4fd58f0caa1f75ee2dd3f0a909cd91._comment | 8 + ...k_with_spaces_in_filenames_and_--fast.mdwn | 29 + ..._eea9477ea1157cb88c8a07d8da5f0dba._comment | 10 + ...s_repository_with_the_same_name_twice.mdwn | 24 + ..._ba7801403e7138684704a3471c8bc4a6._comment | 12 + ..._8c19a4ddedbe7ddb8bdcf84acac68cc8._comment | 14 + doc/bugs/amd64_i386_standalone:_no_SKEIN.mdwn | 41 + ..._fcf7e1089b25993378df7574ccee8062._comment | 8 + ...lone:_ld-linux-x86-64.so.2:_not_found.mdwn | 21 + ..._5e40f32caf9c1177a5f7b9883cdcc6dd._comment | 8 + ...h_CPU_usage__44___unclear_how_to_quit.mdwn | 28 + ..._1d841ff0b0ffd814efed2449dc1f35f3._comment | 10 + ..._cd101e0af45d8f463011fb0d04b3b822._comment | 9 + ..._8595041cfe703d9bea49e792732dc15f._comment | 8 + ..._8e7bc6965ea967a8d43240791a30c5bc._comment | 9 + ..._891c1073f908b204651899d41599f944._comment | 8 + ..._de02b8f1b5928fa1a7078c4aa2124bea._comment | 11 + ..._506acc4275a81ed9e9b08e8a40fcf96a._comment | 9 + ..._d38d6f40db4c9437764c7b2ddf36b5a9._comment | 10 + ..._9bb23e9cbc77ecca4b1209b0f66bc2b0._comment | 8 + ..._d1ce7fc251db076da61eed5bb9d71b9a._comment | 9 + ..._feb71c1022ff65d82e66a3958a41dfb2._comment | 8 + ...axy_nexus_java.lang.SecurityException.mdwn | 41 + .../android_cannot_get_from_5.20131221.mdwn | 41 + ..._f8eeb67e58bf2a4658dcc32a9f275f19._comment | 8 + ..._eba841b1978c70a4c20a8d96c9f71172._comment | 36 + ..._4ba8208822c7f66e23037564b3501391._comment | 8 + ...-rsync-options_shell-split_carelessly.mdwn | 16 + ..._2636e0d224317f2e6db94658d8a094c4._comment | 23 + ...s_not_overriden_by_--numcopies_option.mdwn | 16 + doc/bugs/annex_add_in_annex.mdwn | 6 + ...__34__No_such_file_or_directory__34__.mdwn | 68 + doc/bugs/annex_get_over_SSH_is_very_slow.mdwn | 33 + ...nex_seems_to_ignore_core.bare_setting.mdwn | 45 + ..._beb674205f06310f6a9060bea35fa3fe._comment | 11 + ..._bc5a4be517409f8da2f36299dc4cbbde._comment | 8 + ...nnex__47__uninit_should_handle_copies.mdwn | 20 + ..._c896ff6589f62178b60e606771e4f2bf._comment | 10 + ..._9249609f83f8e9c7521cd2f007c1a39e._comment | 8 + .../another_build_error_in_assistant.mdwn | 79 + doc/bugs/archiving_git_repositories.mdwn | 1 + ..._51f546a571303118446a9e0b3e6482c9._comment | 10 + ...ing_shared_libraries:_libselinux.so.1.mdwn | 31 + ..._ccc2c90d05862edda9ce1ac92efab516._comment | 44 + ..._1cdf6de88c7f121c604177593915e626._comment | 8 + ...ad-pack_and_-receive-pack_not_shimmed.mdwn | 23 + ..._403f1058c3eab5c95fefab5a96aa3f51._comment | 12 + doc/bugs/assistant_-_GTalk_collision.mdwn | 17 + ..._ab2c1f36113d40f27e1893d32f214296._comment | 12 + ..._91dff34c629a3b3a97a2313ff077e4ae._comment | 14 + ..._fefb73f6e570f96b4d82779d6622f690._comment | 8 + ...__34__too_many_open_files__34___error.mdwn | 32 + ..._9904c30a4c24a699d71e90ce5e9b89cf._comment | 8 + ...ssistant_always_assumes_port_22__63__.mdwn | 39 + ...adding_encrypted_usbdrive_repo_on_mac.mdwn | 53 + ..._4ea192e57f86a33087997746722e6acf._comment | 10 + ..._622ad5b34780fc8468c5c515ad9f27fa._comment | 8 + ..._1650539846521ae11837e4ac73348af6._comment | 9 + ..._b91415e4ee74eb12bc6e6faddd00af6e._comment | 12 + ...ating_.git_directory_inside_bare_repo.mdwn | 90 + ..._675210444f7801eb8c2c455a5accf8e9._comment | 12 + ..._d7f1378bc75e7a8be9da2585acc6fd63._comment | 8 + ...oes_not_allow_adding_an_existing_repo.mdwn | 8 + ..._87e84d56d56abefe8cac8a52b76c9003._comment | 8 + ...epo_cost_info_when_queueing_downloads.mdwn | 16 + ...es_not_list_remote___39__origin__39__.mdwn | 26 + ..._ffa008240c61b50396aa92f467731db6._comment | 12 + ..._a53f80090bc2a0f32b8d8307cb24b563._comment | 8 + ...es_not_warn_on_files_it_failed_to_add.mdwn | 46 + ..._13b2f93b7d09c8fd6c22829a0dc6428b._comment | 10 + ..._94e46bc0044b8a91a9fd51058825aa8f._comment | 60 + ..._10a38bdbf31dd4071e4bc4ac746d9c56._comment | 11 + ..._b8fdf502c7e80aece5a9544a2078c85c._comment | 36 + ..._a2ff7668f2a0d549b362d7de97fac8a1._comment | 10 + ..._60d72f34a6cfd1c081f74aa610f4305a._comment | 33 + ..._53a73e662c9356b759fbfa1e5a3bd927._comment | 14 + ..._10b65168b6a54d960427966d7e3d05f5._comment | 19 + ..._b640e8fa6aafb041d66bbf8857a8fa3d._comment | 44 + ...t_doesn__39__t_sync_empty_directories.mdwn | 30 + ..._78a3bde607f43c0f518bd2d3d7196022._comment | 8 + ..._83777384b72732b1d0a19b32686d3d1f._comment | 8 + ..._f9b2a700c060707fae1bcb2ec0e4e4dc._comment | 9 + ..._014d213a959dd7993bdd247722a8817e._comment | 8 + ..._440f349781d7d9ca2d1ed81386f7dd26._comment | 8 + ...nt_doesn__39__t_sync_file_permissions.mdwn | 45 + ..._fc8d3ea209a2ab39c1aeff52452d4c58._comment | 10 + ..._1a364c422e0dd7418f74e1cc3d543a3c._comment | 8 + ..._4d5ae51b4c7e6177d934d7c9f21b912c._comment | 8 + ..._ec7b491ad3c9a1f253d886682bff8b82._comment | 11 + ..._e04ddcd7a3d260c1dac54e41911bb4bc._comment | 10 + doc/bugs/assistant_eats_all_CPU.mdwn | 522 + ..._4a9f149048e387e0a8b4ebb0838decfd._comment | 8 + ..._98be30621a8a435ed54662f7ea9654b4._comment | 10 + ..._a7d7141b81e73a989eb5c1233bcd1478._comment | 15 + ..._60f95e6e5d52f03727bd41f8419c9384._comment | 10 + ..._a6d039ba95f92d9d0c3a343165ba7991._comment | 36 + ..._b7f9a8e214eefc3a6976065782157e81._comment | 28 + ..._16382708d1683a7a9eaaf953f3cdb735._comment | 8 + ..._bfa64822ad9b48fbd4d06c3e3a185b59._comment | 8 + ..._970899faca972af6795ae0d3be1ce444._comment | 42 + ..._2b8241800ae265260506ac9c73cca209._comment | 56 + ..._847ff393fe3a0227d61440f6be899907._comment | 10 + ..._1d9020679d66e6b4742df067cb9da4f1._comment | 9 + ..._8ce65a701604b9d13941844c62f62f23._comment | 14 + ..._0d8de9a8e4b8e2ef3b9c7d839fbcad0c._comment | 12 + ..._0d577d5ca22df14dadf21d4a1a5f9474._comment | 12 + ..._498eee32426dfbaf9bda59a7c0f6fcc9._comment | 8 + ..._ce85b4715a2f7315b68bed62e26d4f0e._comment | 8 + ..._8cf846b9b7bd1c70a006163a9cc2d9de._comment | 26 + ..._a7c9f3262b6eca6258ba53324d321a7a._comment | 17 + ..._340414e9c19903b16ab617d075fbb94e._comment | 10 + ..._e87dbb572eaf234bbaf48ed6790ab1fe._comment | 19 + ..._1c129c924ef3a4a594de6580cf4224c7._comment | 11 + ...sync_in_preferred_content_mode_manual.mdwn | 24 + ..._37acb3afafb1b4c4da7c778130cf3035._comment | 8 + ..._9d58887ee0184663852bde83b8d497c7._comment | 10 + ..._b70881c8026e30fd3ddc051bd01a888b._comment | 8 + ..._43f756e2e6ff985c8e050da0e369d486._comment | 25 + ..._eda947eb7f8c46b9a61d6430b5f9ebfd._comment | 25 + doc/bugs/assistant_hangs_during_commit.mdwn | 27 + ..._aacc15c589d2795254387e427b3afe0c._comment | 8 + ..._b9f1bf9fa919603dca28182c80d39a11._comment | 10 + ..._fb5be10fcf5e7c89da5c34f48539612f._comment | 12 + ..._9ba7efe9112578729d02ac4e6557b3cc._comment | 10 + ..._73b24c901c73d41e0e0abe91267d4920._comment | 16 + ..._1a30b8c82e58222f1366aa368c23e6d3._comment | 10 + ..._56868b2a504ad0a60e8a8c1928330175._comment | 8 + doc/bugs/assistant_ignore_.gitignore.mdwn | 31 + ..._3458b1342cb2e3ccc01eeedc7f0e48fc._comment | 8 + ..._22f75af80c779dcb4d6033b90373f74e._comment | 10 + ..._8b2a400e1d44a1c9b183e2b7861efbe3._comment | 8 + ...__group__44___tries_to_transfer_files.mdwn | 56 + ..._e3f545d9adc27a4e7340bf16177c4fe0._comment | 12 + ..._1403076dbc47733607f0c8b2856e2381._comment | 37 + ..._af83717bfb260bea6d52ff71c6b34743._comment | 8 + ..._b4f811611d14e7392009c539fa6b8574._comment | 8 + ...t_::1_which_breaks_IPv6_enabled_hosts.mdwn | 30 + ..._91a62a2ce14a1027d2ac8b8e88df5f0c._comment | 12 + ..._4982cd373eaaeee180be03c6e9fda7b1._comment | 10 + ..._85d264e311acaa91dac0597ee8deda82._comment | 8 + doc/bugs/assistant_locked_my_files.mdwn | 28 + ..._74ee7ea12df7bfbb44c9d0485f787b73._comment | 8 + ...g_file_renames__44___not_fixing_files.mdwn | 68 + ..._e0dafc410ffd617d445bb9403c7bfafe._comment | 9 + ..._2af247c8a1fcbde10795a990ef3303e9._comment | 9 + ..._adding_remote_containing_linux_paths.mdwn | 23 + ..._remotes_using_the_standalone_tarball.mdwn | 15 + ...emotes_even_when_all_remotes_disabled.mdwn | 33 + ...nt_unable_to_auth___40__windows__41__.mdwn | 85 + ..._3128b025d15d3af6e9c8725d4659cdfa._comment | 12 + ..._e0b64ab2d19f0b0afbd466aad22c4df9._comment | 8 + ...g_the_incorrect_path_on_windows__63__.mdwn | 45 + ..._68be9ee77cc89fb72a4abc944f1da41d._comment | 8 + ..._6530d67e7d94ccbea9ce11ba1445035e._comment | 9 + ..._682556a8182abd5bd6abb57b519d4c76._comment | 10 + ..._331cdacb099a8c7b170c37715bbca895._comment | 8 + ...othing_to_drop_or_copy_to_that_remote.mdwn | 5 + ..._10a9570a5d762ba2da271b38dc63edb6._comment | 12 + ..._57d50955b038c2e2405068536c7e83f3._comment | 8 + ..._a66f34daaba421c87eb404ef933e5191._comment | 10 + ..._094a3272eca1c6d2b4d264911ffe96e5._comment | 19 + ..._0161410d042a3421addd4a1fc7c1cd01._comment | 10 + .../authentication_to_rsync.net_fails.mdwn | 30 + ..._9db65f89415c8d825f268afb75244998._comment | 10 + ..._version_upgrade_leaves_repo_unusable.mdwn | 72 + ..._with_file_names_with_newline_in_them.mdwn | 5 + ..._92dfe6e9089c79eb64e2177fb135ef55._comment | 10 + ...bad_comment_in_ssh_public_key_ssh-rsa.mdwn | 22 + ..._15cce6e6f455e83f4362a38c561bc973._comment | 17 + ..._e9e1f38880a32610b3fbce475bffc3e4._comment | 12 + ..._51da7f5881f65422328d341e5ab0d250._comment | 33 + ..._ba384314c1e47ec4b72e1843e0500df9._comment | 10 + doc/bugs/bare_git_repos.mdwn | 29 + doc/bugs/box.com_never_stops_syncing..mdwn | 74 + ..._124a5edcd89cc6b61e1a41f5b4d640d7._comment | 10 + ..._42574181aa721319ba54eadf0a15ddff._comment | 11 + ..._2ad727849070cfd52d6c719478e9cce3._comment | 8 + ..._83ce23e45f5a5845d4f04519ee14ec65._comment | 9 + ..._ef1c9d87b04db5047ab72167d3269687._comment | 8 + ..._c9cb39eba941678035f9b2888da1085c._comment | 10 + ..._4b0632a4e37c96959a8e6434e9fd86fb._comment | 17 + ..._d9d318b8c958de6031ae323da20af625._comment | 55 + ..._689ac6a4a305197cf5566f98dab47b4b._comment | 8 + .../broken_git_annex_map_on_direct_mode.mdwn | 58 + ...nd_constraints_issues_with_3.20121112.mdwn | 45 + ..._in_Assistant__47__WebApp__47__Gpg.hs.mdwn | 57 + ...e75fb23fca94ad86c3f0ee816bb0ad2ecb27c.mdwn | 25 + .../build_is_broken_at_commit_cc0e5b7.mdwn | 13 + ...ff14054e65ecbe801eb66786a55fa5245cb30.mdwn | 43 + ..._latest_release_0.20110522-1-gde817ba.mdwn | 14 + doc/bugs/build_problem_on_OSX.mdwn | 18 + doc/bugs/building_on_lenny.mdwn | 80 + ...mote_failed_with_localhost_+_username.mdwn | 49 + ..._0e669c3039b089fa8a815d3ec11465d2._comment | 20 + ...dule___96__Data.AssocList__39____34__.mdwn | 23 + ..._0da9fd67c3cc01b316f95a1df4eb62ae._comment | 8 + ...bal_configure_is_broken_on_OSX_builds.mdwn | 14 + ...abal_install_fails_to_install_manpage.mdwn | 43 + ...fails_with_complaint_about_regex-base.mdwn | 34 + ...___40__non-git-annex__41___repository.mdwn | 208 + ..._dd202a7764d9df998868d595a86ffb21._comment | 30 + ..._ca065c82ac8e3215b581660f3e44f459._comment | 51 + ..._927a01f9961c71bedb42c519a31b5fe5._comment | 14 + ...t_annex_get_from_annex_in_direct_mode.mdwn | 23 + ..._20c31a844d8351a99cf69e05d2836e0e._comment | 19 + ..._f26e0f763f9027d9dfc08cd840ced153._comment | 10 + ...op_unused_files_that_never_were_added.mdwn | 86 + doc/bugs/can__39__t_get.mdwn | 81 + ..._ef32287828481c161bd913c9db9052a5._comment | 27 + ..._31fe400f4bac516a5c1101612cb06a54._comment | 32 + ..._87d123c04815d38abb92f967829c3a23._comment | 16 + ..._b99cff87dbe38f08f888200dfe7e2436._comment | 14 + ...t_from_the_command_line_anymore__63__.mdwn | 31 + ...ant_with___34__host:port__34___syntax.mdwn | 30 + ..._397eb359c3f8ef30460a9556b6f55848._comment | 14 + ...file__44___get___34__user_error__34__.mdwn | 32 + ..._14aa717c1befcbbf526f25ca2f0af825._comment | 14 + ..._7f7ac59e7f3dce9d7a7d0c3379c2edcf._comment | 18 + ..._5ebf03120b12edb3fbb8954546e7603e._comment | 8 + ..._1ba6d2614778949520b47896fd98b598._comment | 8 + ..._4a6e55861a63b350a02edb888b4da99b._comment | 21 + doc/bugs/cannot_connect_to_xmpp_server.mdwn | 32 + ..._5072de8fcca9fe70bc235ea8c8ee2877._comment | 8 + ..._dabd74bba1f38b326a2d0c86d3027cd9._comment | 17 + ..._0245b426cc0ab64f8c167b8806b03f5d._comment | 10 + ..._307df11b5bcf289d7999e1e7f7c461c9._comment | 10 + ..._f24378cf30a7d32594da90749fabec3c._comment | 12 + ..._4b07093be844ac62b611cee1dfde5aa7._comment | 8 + ..._fe1ed152a485c4aebfa9b9f300101835._comment | 8 + ..._2d311f520aee04287df6bddfd8535734._comment | 28 + ..._d9f916f012184738446c5996ee9d2270._comment | 13 + ..._0b5f9350e2367301241c7668a15815ef._comment | 8 + ..._f00b6ae154004e405f0bd23b7359962e._comment | 8 + ..._41b86468013da15f46be29da520afa10._comment | 8 + .../cannot_determine_uuid_for_origin.mdwn | 135 + .../cannot_link_executable_on_android.mdwn | 28 + doc/bugs/case-insensitive.mdwn | 20 + doc/bugs/case_sensitivity_on_FAT.mdwn | 49 + doc/bugs/check_for_curl_in_configure.hs.mdwn | 92 + ...cking_back_in_the_web_browser_crashes.mdwn | 23 + ..._c962218657a28494ff837a471d71b43f._comment | 8 + ..._643b2c99ecfe851c576a023ce4385dbb._comment | 10 + ..._6e85c50439da81212f4239c74947b75e._comment | 12 + ....git-annex.assistant.plist_is_invalid.mdwn | 15 + ...rgument___40__invalid_character__41__.mdwn | 228 + ...on_OSX_as_mntent.h_doesn__39__t_exist.mdwn | 8 + ..._processes_can_lead_to_locking_issues.mdwn | 53 + .../configurable_path_to_git-annex-shell.mdwn | 7 + ..._fb6771f902b57f2b690e7cc46fdac47e._comment | 10 + ..._2b856f4f0b65c2331be7d565f0e4e8a8._comment | 8 + ..._aea42acc039a82efc6bb3a8f173a632e._comment | 12 + ..._builds_a_broken_git-annex_executable.mdwn | 57 + ...d_detect_uuidgen_instead_of_just_uuid.mdwn | 6 + doc/bugs/conflicting_haskell_packages.mdwn | 17 + ..._e552a6cc6d7d1882e14130edfc2d6b3b._comment | 24 + doc/bugs/conq:_invalid_command_syntax.mdwn | 30 + ..._f33b83025ce974e496f83f248275a66a._comment | 10 + ..._195106ca8dedad5f4d755f625e38e8af._comment | 9 + ..._55af43e2f43a4c373f7a0a33678d0b1c._comment | 15 + doc/bugs/copy_doesn__39__t_scale.mdwn | 38 + ..._7c12499c9ac28a9883c029f8c659eb57._comment | 10 + ..._f85d8023cdbc203bb439644cf7245d4e._comment | 15 + ..._4592765c3d77bb5664b8d16867e9d79c._comment | 11 + ...ls_for_some_fails_without_explanation.mdwn | 7 + ..._0c1a5837305b721fc4a529cae3f4c3fb._comment | 10 + ..._dabfec2d74fb847f3b40093a2866045b._comment | 8 + ..._e456604b26ed9c72b0a88cfb57f1a475._comment | 12 + ..._4823d66bfb569605868af5cefe0d94dc._comment | 12 + ..._46305aa2d43da000c1a7cb003c822572._comment | 18 + ..._1dbdeded7f587e8fc2d1ac5170ecb928._comment | 8 + ..._1e0c06a07345d85b3712339e6f0d9a9f._comment | 8 + ..._41798e92068eb227c5e75cae2edef68a._comment | 10 + ..._1f33d694a08d8dcbf04595e3442b8cd5._comment | 8 + ..._884f31ce917c8e5ce9a32a55da9b42d6._comment | 10 + ..._ab770dafee3bd9212f553db222adbfe6._comment | 10 + ...ast_confusing_with_broken_locationlog.mdwn | 6 + ..._435f87d54052f264096a8f23e99eae06._comment | 8 + ..._9be0aef403a002c1706d17deee45763c._comment | 24 + ..._26d60661196f63fd01ee4fbb6e2340e7._comment | 11 + ..._ead55b915d3b92a62549b2957ad211c8._comment | 35 + ..._191de89d3988083d9cf001799818ff4a._comment | 10 + ..._b3e3b338ccfa0a32510c78ba1b1bb617._comment | 8 + ..._04a9f4468c3246c8eff3dbe21dd90101._comment | 8 + ..._6a41bf7e2db83db3a01722b516fb6886._comment | 18 + ..._9f5f1dbffb2dd24f4fcf8c2027bf0384._comment | 8 + ..._b596b5cfd3377e58dbbb5d509d026b90._comment | 14 + ..._d7112c315fb016a8a399e24e9b6461d8._comment | 12 + ..._4ea29a6f8152eddf806c536de33ef162._comment | 14 + ..._0d85f114a103bd6532a3b3b24466012e._comment | 8 + ..._d38d5bee6d360b0ea852f39e3a7b1bc6._comment | 12 + ..._29c3de4bf5fbd990b230c443c0303cbe._comment | 10 + ..._2cee4f6bd6db7518fd61453c595162c6._comment | 8 + ...ould_not_mention_every_file_it_checks.mdwn | 28 + ..._5f51452d939d61496e97805310746ea3._comment | 14 + ..._2cd3e9561c4442259c765743b423a7df._comment | 8 + ...to_webdav_sometimes_doesn__39__t_work.mdwn | 74 + ..._77629f620b28ac62364de44b41fa539d._comment | 8 + .../copy_unused_and_unused_not_agreeing.mdwn | 50 + ..._a11a45868867361fcff61471ffe0ce39._comment | 10 + ..._15559ba19393f5c061f77bc56379f8e1._comment | 12 + ..._9b1340e0f6a107695849c04374aaeae2._comment | 10 + ..._b88530080fd90686cfa7e336f8328dcb._comment | 8 + ..._792ab128a91c66e4ddeaa69d09430a78._comment | 20 + ..._e44a16ef3358a6fbcc6ed6b3a31f3273._comment | 8 + ..._635acd64b524c682c58f26ae96ae0d7d._comment | 10 + ..._1aaeb808e20c67f89eaac5e45d9309f0._comment | 15 + ..._6abca5f4927e09089cdc5f0bd27b798f._comment | 26 + ...y_where_a_mountpoint_should_have_been.mdwn | 27 + ..._41cfd5e48426a6ef52bef70a06a6f46a._comment | 11 + ..._bd584ccbe128427fca99e61d66d301c9._comment | 18 + ..._5bb0347215b321444643646f25a35759._comment | 10 + ..._73848a9c783ecf3d9fccdd41b20fbe36._comment | 56 + .../creating_a_remote_server_repository.mdwn | 24 + ..._de1a370347428245bcfca60eaca96779._comment | 10 + ..._482ac9b0f881099910f9bd9f7cda184d._comment | 8 + ..._b7c7f684d0eef14fcc00cb2ac0566703._comment | 10 + ...s_directory_not_automatically_created.mdwn | 3 + doc/bugs/cross_platform_permissions_woes.mdwn | 36 + ..._7f01104de38a6a319a8f36aa1dc8b4b3._comment | 14 + ..._0a34e11b466fad287325425e76487fa1._comment | 73 + ..._278f91b4bc4c32717ab1c39c2abf9305._comment | 8 + ..._eb6a271cb63c71341469c9ff89dc0eb9._comment | 9 + doc/bugs/cyclic_drop.mdwn | 104 + ...icting_directory-file_of_direct_repos.mdwn | 199 + ..._294c33af08649256908a97894f93c05d._comment | 10 + ..._02a2b69adbb04b557146e713b70b34d2._comment | 14 + ..._d296ef26fc90f4e3166bba6d2de0a1ee._comment | 8 + ..._33ba2c890c962a71ae9fadc417359f8e._comment | 8 + ..._39eb0bb96fd271bd0de4a3a40814ae1b._comment | 11 + ..._d80c4b631bdf58901a06f29a2c5682e2._comment | 8 + ..._add__34___on_android_in_direct_mode_.mdwn | 19 + ..._eb6db7f6a156a065e2724c2de5fc4366._comment | 10 + ..._59a96cade9e4881767562a139fc7fb4b._comment | 40 + ..._bf9d2562d66f0f6a9478ac178606cf4e._comment | 12 + ..._ad0dbdc448fff2e126ffec9aac6d7463._comment | 23 + ..._e828585e56b10710598143483ce362b6._comment | 12 + ...sitory_with___60__SCREECH__62___files.mdwn | 73 + ..._523b80ad81ad49bddfb8855d12d5561d._comment | 10 + ...ct_mode_assistant_in_subdir_confusion.mdwn | 37 + ..._351143deec29e712f8718a373ad650d7._comment | 8 + ...erwrite_local__44___non-annexed_files.mdwn | 14 + doc/bugs/direct_mode_renames.mdwn | 15 + ..._f18c335e0d6f4259d2470935ef391cb8._comment | 8 + ...ect_mode_sync_should_avoid_git_commit.mdwn | 5 + ..._d286800081f019651cd40355b7d5518a._comment | 27 + ..._4e23201d1d1d549f72eec75987601a73._comment | 13 + ...T32_fails_to_addurl_containing___63__.mdwn | 44 + ..._+_chunk_size___61___lost_files__63__.mdwn | 51 + ..._69dfbf566c75396cdaaf5ad70f1a94a8._comment | 19 + ..._8d09cc0e06548c4ebde7956edd1b5d85._comment | 8 + ..._bcac9fd7b3f4a2ac28bee59bae674fa0._comment | 79 + ..._c9088060fb9133b66951f1a3075981e8._comment | 18 + ..._5bf34466187cfc9b34bd3ca8c89a07c6._comment | 20 + ..._d6201f2d86d5b44051a7fd7a8c9de583._comment | 8 + ..._61c5f0889f30a68ac3b57c4ea564ee0e._comment | 8 + doc/bugs/done.mdwn | 4 + doc/bugs/dotdot_problem.mdwn | 4 + ...fails_to_see_copies_that_whereis_sees.mdwn | 69 + ..._f5a9d99d90daf5eba4773d361fa1807a._comment | 14 + ..._040aa454cd8acd2857ef36884465576f._comment | 16 + ..._f5d8faab325ee26800ecad5aba49b54b._comment | 10 + ...ng_from_web_remotes_doesn__39__t_work.mdwn | 139 + ...opping_files_with_a_URL_backend_fails.mdwn | 13 + ...9__t_handle_double_spaces_in_filename.mdwn | 87 + ...ed_doesn__39__t_work_in_my_case__63__.mdwn | 70 + ...eremote_broken_with_direct_mode__63__.mdwn | 41 + ..._a2e61f5de7a28498de0c2d5e3d51eab4._comment | 8 + doc/bugs/encfs_accused_of_being_crippled.mdwn | 41 + ..._5c5be012e1171ef108f38825d72791b6._comment | 23 + doc/bugs/encrpyted_ssh_remote_on_macosx.mdwn | 42 + ..._46c37aacb7ae41864488fb7c7d87d437._comment | 10 + doc/bugs/encrypted_S3_stalls.mdwn | 9 + ...keyid_still_uses_symmetric_encryption.mdwn | 46 + ..._2f4ec4b7b92a0f0a0c4c0758da4a05a5._comment | 13 + ..._7c0aeae6b1b2b0338735b0231c5db7d4._comment | 16 + doc/bugs/encryption_key_is_surprising.mdwn | 24 + ..._5b172830ac31d51a1687bc8b1db489f9._comment | 10 + ..._5b7e6bb36c3333dfd71808e8b4544746._comment | 8 + ..._8ec86b8c35bce15337a143e275961cd5._comment | 8 + ..._c5e49b3a0eceabe6d14f5226d7ba4c7a._comment | 8 + ..._cd7cbf0c0ee9cafec344dfbf1acd9590._comment | 8 + ..._01381524114d885961704acc3f172536._comment | 8 + ..._c1eb59e1c5f583dcef7cea17623a2435._comment | 8 + doc/bugs/endless_loop_when_PWD_gone.mdwn | 16 + ..._0943cffa39d48e4dddde3b7aedc4e3b1._comment | 8 + doc/bugs/enormous_fsck_output_OOM.mdwn | 30 + ..._490b8bfe95b01a23408ecb5d63dcd40b._comment | 10 + ..._2666c135dd3378cf6301aa4957049fbd._comment | 10 + ..._dfb169c441215b671f8c971184de3e16._comment | 10 + ..._19ef90803aa7ce158bce02378e18ea0f._comment | 30 + ..._2b5406768fff2834f7aefa76ef949de2._comment | 12 + ..._0997f1a94c2fda9fe69824e074011518._comment | 18 + ..._2cdc79f1e0f72693814e91dc88a758e1._comment | 10 + ..._b9aab0aba4dab30260371b4762e0e51d._comment | 8 + ..._8de694dff75e27856c8282d1f2d120b6._comment | 14 + ...ding_git-annex_3.20120624_using_cabal.mdwn | 159 + ...rror_on_only_repository_copy_deletion.mdwn | 16 + ..._af394ac0956ab33a77256bcb02ef2a0f._comment | 14 + doc/bugs/error_propigation.mdwn | 3 + ...epositories_with_non-ASCII_characters.mdwn | 62 + ..._38cc2d2ed907649df085de8ad83cb9dd._comment | 14 + ...or_with_file_names_starting_with_dash.mdwn | 15 + ...eous_shell_escaping_for_rsync_remotes.mdwn | 15 + doc/bugs/fails_to_handle_lot_of_files.mdwn | 445 + ..._09d8e4e66d8273fab611bd29e82dc7fc._comment | 8 + ..._fd2ec05f4b5a7a6ae6bd9f5dbc3156de._comment | 8 + ...ing_ssh_key_setup___40__windows__41__.mdwn | 12 + ...hould__34___exist_in_remote_is_silent.mdwn | 37 + ..._c686df2824d3f588c0bfb339c99168b7._comment | 29 + ..._22edfac4ce25cd9f4e4c85e0a8a52bc1._comment | 14 + ..._74fc0e41a6bd5c4d8c4b2f15e5ed8d2f._comment | 17 + ..._7d642fc65040a7b583cdece33db01826._comment | 8 + ..._49be366b6af6db595fa538373a61e650._comment | 10 + ...ure_to_return_to_indirect_mode_on_usb.mdwn | 19 + ..._d7822b90c68bf845572b0a04a378d0bb._comment | 10 + doc/bugs/fat_support.mdwn | 13 + ..._04bcc4795d431e8cb32293aab29bbfe2._comment | 12 + ..._bb4a97ebadb5c53809fc78431eabd7c8._comment | 14 + ..._df3b943bc1081a8f3f7434ae0c8e061e._comment | 11 + ..._90a8a15bedd94480945a374f9d706b86._comment | 10 + ..._64bbf89de0836673224b83fdefa0407b._comment | 8 + ..._a3b6000330c9c376611c228d746a1d55._comment | 8 + ..._a0ac7f2c44efc8116940c7b94b35e9d0._comment | 7 + ..._acc947643a635eb10a1bff92083a3506._comment | 10 + doc/bugs/fatal:_empty_ident_name.mdwn | 51 + ..._ceae87308fb75a1f79c7c8d63ec47226._comment | 8 + ..._68832ee3e0e7244ce62bccabe2e52630._comment | 25 + ..._ed31ad316747343d7730e4c2d7dacd24._comment | 10 + ..._b812d6f30e8a866bce7260a9ee3218e3._comment | 13 + ..._git-write-tree:_error_building_trees.mdwn | 103 + ..._77295c0b749e984a6fb200d3b73b5765._comment | 8 + ...e_filenames_containing___39__..__39__.mdwn | 52 + ..._8a4045634bffc29c8147056096b7089d._comment | 13 + ..._a1539aaec74074b4667ac27cfcfcccd6._comment | 16 + ..._d252f39ddb9c9c14784c85a8b850a4ec._comment | 10 + ..._eb07c84dc0b15b68c99d0ef4144f82f5._comment | 10 + ..._Invalid_argument___40__Windows__41__.mdwn | 63 + ..._e6f39b2ef55b0daa491f4b6329a906bc._comment | 8 + ..._b47d6d188f38a8e4ca5ef5f70afadf6a._comment | 48 + ..._b533b1de535a057b7ebf99afc92691ed._comment | 13 + doc/bugs/feature_request:_addhash.mdwn | 29 + ..._064e963adb6834813380fd836bb58566._comment | 8 + ..._7b712786c580dd1ca24479664c31eed6._comment | 8 + ..._47__locking_issues_with_the_assitant.mdwn | 54 + ..._fadf06f5ab34e36ab130536ec55afc8e._comment | 12 + ..._4a337f7b1140c45e5dd660b40202f696._comment | 10 + ..._05e1398e78218ced9c2da6a2510949e8._comment | 21 + ..._9226f0adf091154c0d8a08b340b71869._comment | 8 + ..._44d3e2096b7d45a1062222bee83a346d._comment | 8 + ..._f2e1d188b7b2d2daf0d832c59a68583e._comment | 8 + ..._998fe58994ecf855310e4b8e6cce9e18._comment | 8 + ..._4ce243cb0ea8ff810a4949a5320e4afc._comment | 13 + ..._c713f6316d889c8fc52326f21375c1c4._comment | 8 + ..._6dd23bab7983b8b1f938dd4f21a16f5a._comment | 8 + ..._961c8f968eff0b39a85b607ee3f7630d._comment | 16 + doc/bugs/file_modification_times.mdwn | 13 + ..._.ssh__47__config___40__windows__41__.mdwn | 20 + ..._a04b71f4f81c477d18f14d8dfe8b378f._comment | 8 + ..._0dbc908984b4b5bcc1283db807e058cb._comment | 10 + ..._ff6cd2bb007d41284a09e470e060c32d._comment | 8 + ...relates_to_the_new_inotify_flag__41__.mdwn | 36 + .../follows_symlinks_to_outside_annex.mdwn | 3 + ..._f7a01bb627a6780d6940886401cde454._comment | 10 + ..._fcbeffab5a0146062a9c945dfff48507._comment | 8 + doc/bugs/free_space_checking.mdwn | 21 + ..._a868e805be43c5a7c19c41f1af8e41e6._comment | 10 + ..._8a65f6d3dcf5baa3f7f2dbe1346e2615._comment | 8 + ..._0fc6ff79a357b1619d13018ccacc7c10._comment | 8 + ...ix_the_permissions_of_.git__47__annex.mdwn | 8 + ...n_less_copies_than_required_are_found.mdwn | 57 + ...sck_giving_false_checking_information.mdwn | 29 + ..._1000603ea6b8a19eb09e6754789ad528._comment | 10 + ..._3ce7c8f7098f0bf86ed409a3a095c152._comment | 14 + ..._be4d0fec56c29cf978ef7d1715eaa516._comment | 14 + doc/bugs/fsck_output.mdwn | 46 + ...uble-check_when_a_content-check_fails.mdwn | 3 + ..._03af24b70adbcd9f4b94d009f6b71d0a._comment | 13 + ..._41214a7d18c66b694645248d6ebeadbf._comment | 25 + ..._e7ddd77ea35994f2051f840e9b4c7e0c._comment | 11 + ..._36a70d5a378983a76fcdbb7fba044044._comment | 32 + ..._899c4afbc988d81984c5c3397285bb01._comment | 12 + ..._dbff51d00c5645eb1832aa4644889c5e._comment | 10 + ...ile_content_is_bad_when_it_isn__39__t.mdwn | 35 + ..._cafb58eca97a0a66110ac39b169d8de3._comment | 8 + ...emote_pushes_git-annex_but_not_master.mdwn | 19 + ..._failed__44___but_remote_has_the_file.mdwn | 40 + ..._55c8b73ce05dfca11a393bb296b99b9a._comment | 10 + ..._474c67a421dca4c245e7bfe495d3f6d3._comment | 18 + ..._845e8a23d63fb0b071c63ee736697d26._comment | 20 + ..._7dec21cb67e7f4dbdb49da97f2443e8f._comment | 35 + ...47___web_remotes_if_the_file_is_empty.mdwn | 26 + ...t_from_bup-remote_with_pubkey_failing.mdwn | 93 + ...-shell:_gcryptsetup_permission_denied.mdwn | 48 + ..._f4584158b35b80ece1060308883e2dc4._comment | 8 + ..._a4d7aae848340771a9b8e2c87abeea42._comment | 26 + ..._06bda101ad584b4b882de8b2e202d679._comment | 8 + ..._4fc6b25401b645cabc04b510bdfa6863._comment | 10 + ..._4e193306801680bba433e75eb4dcba05._comment | 12 + ..._76ccdf0542e76e4dbd61f3b3228d40ba._comment | 10 + ..._cd964d0a375c5cba299bf2bbbbb86acb._comment | 12 + ..._9bac87c85deb5bb15795df28533d0cde._comment | 10 + ...tic__41__:_strange_closure_type_30799.mdwn | 75 + ..._1c19e716069911f17bbebd196d9e4b61._comment | 10 + ..._a4d66f29d257044e548313e014ca3dc3._comment | 66 + ..._f5f1081eb18143383b2fb1f57d8640f5._comment | 38 + ..._b1f818b85c3540591c48e7ba8560d070._comment | 10 + ..._67406dd8d9bd4944202353508468c907._comment | 13 + ...nrecognized_option___96__--uuid__39__.mdwn | 53 + ..._13510e954e36484e196e7395a3a9bf1f._comment | 10 + ..._7edc478a76983a3b3c68d01f24dce613._comment | 9 + ..._t_honour_Rsync__39__s_bwlimit_option.mdwn | 37 + ..._8cda861c11ef2fff3442e5a0df741939._comment | 12 + ..._15e06f6db9a14a8217dea25e24ddc23a._comment | 12 + ..._d36045e2b466882108c5bf09580755fa._comment | 8 + .../git-annex:_Argument_list_too_long.mdwn | 40 + ..._3f83ea525436b2379ab29a0f860c4669._comment | 8 + ..._b417c94169378ef7d0d278ebae517fa1._comment | 8 + ..._fa925cca216cb810ad80482b19fc6053._comment | 8 + ..._8bd2996107b2d272c32810658e07e715._comment | 8 + ..._378de7d7503a64611eab62f2f5cffef3._comment | 15 + ..._a94e17151348d02999442dd1219babfb._comment | 10 + ...not_decode_byte___39____92__xfc__39__.mdwn | 34 + ..._f1a7352b04f395e06e0094c1f51b6fff._comment | 12 + ..._c1890067079cd99667f31cbb4d2e4545._comment | 8 + ..._213c96085c60c8e52cd803df07240158._comment | 13 + .../git-annex:_Not_in_a_git_repository._.mdwn | 22 + ..._e10363a912953a646b87c824d1c6e5d4._comment | 10 + ..._9e96063a664b2be8a36d7940e7632d3f._comment | 8 + ..._8c9bd76b0e1200723ec13fbef943a2cc._comment | 10 + ..._8c49979b8a815f0d6f9de39ee9a88730._comment | 8 + ...ite_file:_TlsNotSupported:_user_error.mdwn | 35 + ..._2c54c57f456e4570666fd7a5731dcd27._comment | 11 + ..._c9a9f070b2eaff9f68f603ca1defec81._comment | 8 + ..._62ff37a8429cfb3577d4250c701811d0._comment | 8 + ...urce_vanished___40__Broken_pipe__41__.mdwn | 16 + ..._e962317a939bf76097ae1a3b53b146e6._comment | 14 + ..._b32472b4c9b61e7a33dca802ecafb05b._comment | 11 + ..._fcfea3216831df9afbd855fbd842c27e._comment | 20 + ..._30d0b40efa59eeecb8a4be6d1baa1520._comment | 10 + ..._4af107f3184bc2abd2c9693167018628._comment | 8 + ..._f96027f1e3c405809fae42ce8533c6d1._comment | 8 + ..._b6fe89deb468a7e4f63f7faab147e3fb._comment | 12 + ..._ebec5d9266604f03959dc16d933ff4a4._comment | 13 + ...t-annex:_fd:14:_hGetLine:_end_of_file.mdwn | 51 + ..._36756f5d9d591cc52113c5cc0c1eae91._comment | 8 + ...ntryForID:_failed___40__Success__41__.mdwn | 13 + ..._11a1615962325327466895d03e3d2379._comment | 8 + ..._eac51c3299e9fc04025675360969d537._comment | 8 + ..._c23dc02c7487d63b0905f1b7f3ca59f5._comment | 9 + ..._0e8b28de5c173bc60ecc0126fb2209ca._comment | 10 + doc/bugs/git-annex:_status:_1_failed.mdwn | 25 + ..._7cd9de88e55633fc75460f4fe0400f09._comment | 8 + ..._504a944aab34155046f2fd82c2878f3e._comment | 18 + ..._c235cc83c75474e6393e08d2d94b119d._comment | 10 + ..._932f6aaa712298a47868002872e16310._comment | 10 + ..._4bf55320439de152a65e2f21d4a0604b._comment | 14 + ..._cb2cfb798c6171f77eb7c4c4061c0f0c._comment | 8 + ..._05c84dde377298adfd3fc20749b3108f._comment | 10 + ..._bb5141e29c665bc0bb82611ea27d4be8._comment | 11 + ..._5fd39168c9e1bf43909ee0ab3c75c40c._comment | 35 + ..._e493f6bddb0bfcd9478d5f4d9fc170e0._comment | 8 + ..._573377d444aee0895b231082bc6839a4._comment | 8 + ...t-annex_3.20130216.1_tests_are_broken.mdwn | 43 + ...les_with___39__:__39___in_their_names.mdwn | 38 + ...x_add_hangs_indefinitely_on_all_files.mdwn | 32 + ..._f787155da9a4d92c41546c35f3bd6a08._comment | 12 + ..._66ad95d98c12b4b26e06e3fe28f0ed01._comment | 10 + ...it-annex_add_should_repack_as_it_goes.mdwn | 32 + ..._dbcaa0be4cd764128fb7263a95f73a32._comment | 22 + ..._6a27551c4fb7f62ed9f627134c755d01._comment | 14 + ..._ff8b589fbcf25c98abd1c58830074650._comment | 8 + doc/bugs/git-annex_branch_corruption.mdwn | 95 + doc/bugs/git-annex_branch_push_race.mdwn | 45 + doc/bugs/git-annex_broken_on_Android_4.3.mdwn | 7 + ..._e47c073f1614f7b57f86acedeeb1cadc._comment | 8 + ..._ce34578c45060b7c8b759efd1c1d8df8._comment | 13 + ..._75965395dc33046ce34ac5ba972b7d64._comment | 8 + ..._f07bc76dd3c5580fc0855a33ae835c8d._comment | 12 + ..._637c59becc68a1e4f60069d8873489ff._comment | 8 + ..._d80b87055f72873f5678a01d2630bea4._comment | 10 + ..._57ac84868b223b30f005704eefa01b8d._comment | 8 + ..._a41f4d8a72c07ad770e6479e9b8c7f1d._comment | 8 + ..._7d36637f11cda51de395303d5c1c6a3f._comment | 8 + ..._c8609c3f7f62ae5427fd8c60bc9546ed._comment | 8 + ..._0ffb3833ce2c2e0320468dc9a09866d7._comment | 10 + ..._0886bca6d0c6a9415a7794d256be2e9d._comment | 14 + ..._2b39729f95c9c4bba620ecdd3d1558ed._comment | 8 + ..._8d90d92951919aa70638b31e9248bec5._comment | 16 + ..._6398271f5cd9e94996202ef3bce6f6ed._comment | 20 + ..._c9e399833cc6235077161f490dfa866f._comment | 8 + ..._cf093737eefb2b99f6f0eac9bf3e74b3._comment | 9 + ..._c122ce53175fc9e0e114a8acd2385c0d._comment | 29 + ..._237e41e61781bb058f5fd39362a904e4._comment | 10 + ..._97f423a41ee9d2d74291594fae20dd4e._comment | 10 + ..._7b3fbe7e38f637fcea511441ac243d93._comment | 10 + ..._53e2d095b2501844cadec910de286814._comment | 14 + ..._26c04584c3c6dacf59e1b6c82042c97c._comment | 8 + ..._ddc9cbae1a721400a9acf2153e18f4f0._comment | 8 + ..._593235735e32238094121b1f79355bbd._comment | 8 + ..._f806fd5930e90920db24456297465bae._comment | 9 + ..._5741b6a5997328fdcd5cc99f841b18d3._comment | 8 + ..._3e0d9949dd810069af0b8076807e5924._comment | 8 + ..._f58897eff6b4693f0c73474ccfe6e733._comment | 8 + ..._ddba87b2f20d8a63f7b8ebdb9bd13515._comment | 18 + ...ositories_with_a_partial_set_of_files.mdwn | 29 + ...nex_directory_hashing_problems_on_osx.mdwn | 100 + ..._f3594de3ba2ab17771a4b116031511bb._comment | 8 + ..._97de7252bf5d2a4f1381f4b2b4e24ef8._comment | 13 + ..._f1c53c3058a587185e7a78d84987539d._comment | 8 + ..._4f56aea35effe5c10ef37d7ad7adb48c._comment | 8 + ..._cc2a53c31332fe4b828ef1e72c2a4d49._comment | 10 + ..._37f1d669c1fa53ee371f781c7bb820ae._comment | 17 + ..._8a4ab1af59098f4950726cf53636c2b3._comment | 22 + ..._515d5c5fbf5bd0c188a4f1e936d913e2._comment | 9 + ..._db64c91dd1322a0ab168190686db494f._comment | 14 + ..._ff555c271637af065203ca99c9eeaf89._comment | 8 + ..._9a7b09de132097100c1a68ea7b846727._comment | 8 + ..._7e328b970169fffb8bce373d1522743b._comment | 19 + ..._98f632652b0db9131b0173d3572f4d62._comment | 10 + ..._52d41afd7fd0b71a4c8e84ab1b4df5bd._comment | 8 + ..._c2cd8a69c37539c0511bae02016180ca._comment | 8 + ..._174952fc3e3be12912e5fcfe78f2dd13._comment | 185 + ..._a18ada7ac74c63be5753fdb2fe68dae5._comment | 18 + ..._039e945617a6c1852c96974a402db29c._comment | 8 + ..._eacd0b18475c05ab9feed8cf7290b79a._comment | 37 + ..._e55117cb628dc532e468519252571474._comment | 14 + ..._0f4f471102e394ebb01da40e4d0fd9f6._comment | 68 + ..._68e2d6ccdb9622b879e4bc7005804623._comment | 12 + ..._45b11ddd200261115b653c7a14d28aa9._comment | 8 + ...stall_on_windows_without_admin_rights.mdwn | 22 + ..._2533800ab5a95c5d71c3b47a630e751a._comment | 10 + ..._5b71785acf16a8d9ea457726599daef3._comment | 8 + ..._63e4ff79bc683a70dd9a85c66e26e56a._comment | 8 + ...iles_containing_ISO8859-15_characters.mdwn | 48 + ..._b84e831298c03b12471fb75da597e365._comment | 8 + .../git-annex_dropunused_has_no_effect.mdwn | 12 + ..._66b581eb7111a9e98c6406ec75b899cf._comment | 12 + ..._11c46cd2087511c3d22b7ce7c149b3e9._comment | 16 + ..._b1c3d8c6ec4b20727aaa9c4b746531b0._comment | 10 + ..._f05a9a3760858c5ee5c98dd8ab059c28._comment | 8 + ...nex_fails_to_initialize_under_Windows.mdwn | 212 + ..._082277b9b906a2cc0fcace6790f5cfad._comment | 10 + ...t-annex_fix_not_noticing_file_renames.mdwn | 36 + ..._4edd95200d59ec5a5426167b8da8e3f9._comment | 24 + ..._a9a44debefb3bdd4b8ed2d1cf53f2338._comment | 8 + ..._0efb11f35b872b75a3fbc4ebb71ac827._comment | 10 + ...nex_get:_requested_key_is_not_present.mdwn | 41 + ..._d4baa6607a61d0e6a7cea1325a5ddf95._comment | 26 + ..._b49725488c3db5e00ede7b65ed9d62fa._comment | 110 + ..._c17a7138579b93c6f14e3444c11664ac._comment | 8 + ..._of_my_files___36____35____38____33__.mdwn | 58 + ..._5dd4d1cec069c13184f5dd9efca6721b._comment | 8 + ..._d9b65fe4cb4bfd58f37e7da5350c6401._comment | 14 + ..._1027187b203addd65af8cf1faf28727d._comment | 10 + ..._ac65028203ff0cbdb978200235fb4e9c._comment | 10 + ..._git_when_staging__47__commiting_logs.mdwn | 34 + ...nex_immediately_re-gets_dropped_files.mdwn | 27 + ..._09e616a4866e726a48be4febe6375cc8._comment | 8 + ...ncorrectly_parses_bare_IPv6_addresses.mdwn | 59 + ...rsync_remotes_with_encryption_enabled.mdwn | 103 + doc/bugs/git-annex_merge_stalls.mdwn | 16 + ..._31578a754945bdcb902c62ff58704bcb._comment | 17 + ..._f3b6bf180466b5931bfd20b2f0229422._comment | 10 + ..._ced9b0d724fb55c756106b64c3721003._comment | 18 + ...esystem_can_still_failed_due_to_case_.mdwn | 32 + ..._850695231926dfe94f11342d3af7f63c._comment | 54 + ..._c2a2f801a3e18ad597ff0acf2f104557._comment | 22 + doc/bugs/git-annex_opens_too_many_files.mdwn | 42 + ..._37f6f5838c41c533df4be1f927b9b03d._comment | 26 + ..._347ef233b9845b84d7c4d49ed166e797._comment | 10 + ..._d5f644d97cd2db471deb5dcd728cae60._comment | 8 + ..._c03bde64be8fdd962826bc7afa07d2a9._comment | 137 + ..._33a2e783e5355e981497b9861997570b._comment | 18 + ..._b3a5a4e4ca29c5cd2840bfeb4c63ea68._comment | 15 + ..._d73454c9ab3729989e4bc3f2223ccde9._comment | 8 + ..._quit_unexpectedly___40__macosx__41__.mdwn | 358 + ..._97abb8442329d19c9687002f43afac74._comment | 23 + ..._3405f3cd699860ee239cf23ade19e92c._comment | 10 + ...ng_up_all_available_RAM_after_startup.mdwn | 47 + ..._b550f292359b44977481bf69abad4012._comment | 14 + ..._76e6c1d4db27bcc1767ba34e13e8211c._comment | 8 + ..._14007c8e927b75c5706e80cc4242fae4._comment | 8 + ..._f3266b74517b421e5310e67818fe3969._comment | 12 + ..._1a07f15eb0353768c1e67a1e47e2e494._comment | 9 + ..._7d0d49fd165af5e30606982e05335d34._comment | 10 + ...nnex_sync_broken_on_squeeze_backports.mdwn | 20 + ..._the_directory_I__39__m_in_disepeared.mdwn | 15 + ...iles_are_in_repositories_they_are_not.mdwn | 29 + ..._6722fd627ec4add9f2b16546bd8ef341._comment | 8 + ..._508e475f764e1cb453b756eb50bc3a15._comment | 34 + ..._1656ba18c519a262c57ef626a3449e77._comment | 12 + ..._347dc3b6e5bc6c4195ec09d54bc1398e._comment | 24 + ..._a9c93bfc3278ef8b1117eac2af859bc3._comment | 12 + ..._804dd62beef64f7d4e203bdb28cbe660._comment | 11 + ..._4ef107d70647780eb5347cae6f467fed._comment | 12 + .../git-annex_webapp_command_not_found.mdwn | 25 + ..._6fa63ae1a7affb2351eda57ab3b4eda1._comment | 10 + ..._d25232bb5eaff725281869d7681e81ad._comment | 8 + ..._f593752a0c5c60daaacca46ced5ac5d8._comment | 12 + ..._e4ef964274e74cb4a39dc8ecac8ceade._comment | 12 + ...git-repair_real_world_failure_example.mdwn | 11 + doc/bugs/git_annex_add_..._adds_too_much.mdwn | 25 + ..._eats_files_when_filename_is_too_long.mdwn | 14 + ..._9650284913bec2a00cf551b90ab5d8ff._comment | 21 + ..._c6c8d2a1f444d85c582bc5396b08e148._comment | 8 + ..._5776864d78d56849001dd12e3adb9cbe._comment | 8 + ..._371ec7b4ae73280ede31edfe90b42a95._comment | 9 + ..._4fb04f646de591640f8504c0caf61acd._comment | 12 + ..._b4055409fe48da95bb3101c0242ef0bc._comment | 8 + ...nex_add_error_with_Andrew_File_System.mdwn | 28 + ..._bc783e551fc0e8da87bc95bff5b8f73a._comment | 8 + ..._faefcf69bd61c47566131cb31b78cc19._comment | 10 + ..._d5014c8b78437b9fddbb1e83d3679081._comment | 10 + doc/bugs/git_annex_add_memory_leak.mdwn | 39 + ...ex_add_removes_file_with_no_data_left.mdwn | 103 + ..._9cc749a6efd4359a99316036f5bc867f._comment | 12 + ..._1fed5be9db29866e4dc3d3bb12907bf3._comment | 8 + ..._06d517ac4ef8def4629a40d7c3549bac._comment | 8 + ..._8f081aeba7065d143a453dc128543f59._comment | 18 + ..._54a4b10723fd8a80dd486377ff15ce0d._comment | 10 + ..._f1964e4e07991a251c2795da0361a4e2._comment | 28 + ..._73c38d843c30f00f6fd8883db8e55f62._comment | 10 + ..._7ede5ee312f3abdf78979c0d52a7871a._comment | 12 + ..._e37cf18708f09619442c3a9532d12ed9._comment | 13 + ..._a744ef7dd3a224a911ebb24858bc2fd6._comment | 8 + ..._f97141b255073b90120895148220c2d7._comment | 10 + ..._dd2be11dfd190129d491f5f891e7cd1a._comment | 10 + ...he___124_____40__pipe__41___character.mdwn | 27 + ...it_annex_assistant_--autostart_failed.mdwn | 39 + ..._746545273b53849c42ff6272324e5155._comment | 10 + ..._5bdf6f94da12e551ae12e7f550a84d62._comment | 8 + ..._bfd646f69946a5fe926b270cf94f87cb._comment | 8 + ...nnex_content_fails_with_a_parse_error.mdwn | 32 + ..._2b60b6ae0115de13ecf837b34dadcd1d._comment | 8 + ...annex_copy_--fast_does_not_copy_files.mdwn | 22 + ...EMOTE_._doesn__39__t_work_as_expected.mdwn | 18 + ...ying_to_connect_to_remotes_uninvolved.mdwn | 27 + ..._f1330935a07460c9c8bc82ee8d4709c5._comment | 12 + ...40__notably_including_dead_ones__41__.mdwn | 44 + ..._7ee08a60e4b2516c010d3c2163049681._comment | 15 + ..._c29525bfda08717f68aaac83014e6b08._comment | 8 + ...git_annex_describe_can_break_uuid.log.mdwn | 46 + ..._9ead36f13cbde6c822b231441de636ae._comment | 8 + doc/bugs/git_annex_does_nothing_useful.mdwn | 67 + ..._457354dc0018333002dc5049935c0feb._comment | 8 + ..._8a6d244165dd238ddf9dd629795de2f6._comment | 10 + ..._30d06bc0f1c37d988a1a31962b57533c._comment | 18 + ..._fc4f51ddcbc69631e2835b86c3489c8e._comment | 7 + ..._9bb1647e6c59f1ed7b13b81ecc33f920._comment | 13 + ..._d434f5c614a27b75d73530b5b918b851._comment | 14 + ..._998e33219d29ea41b0b2a5d2955a9862._comment | 46 + ..._c72e2571e5b8c06bbfa2276a7ad1e8a6._comment | 16 + ..._bc8b42432ba25de8f972c192bc3cdff6._comment | 44 + ..._e7469a4c5e45078ade775f5cbdd17cfc._comment | 67 + ..._bc9e6fd284440a59ffe4e4ed1f73f7d7._comment | 30 + ..._38a2dbeee3750d79ca9a943a02fceb29._comment | 17 + ...ex_doesn__39__t_work_in_Max_OS_X_10.9.mdwn | 220 + ..._141819a6b67de2602673698f6f148106._comment | 13 + ..._8be96359fd2bd33ed2961e499dc2685e._comment | 12 + ..._26950a37e86d4dd83dd59fb2564d0a2e._comment | 11 + ..._cbf8150dbe0da64bde7f6af8e041eda8._comment | 8 + ..._0c203f90d911cf6869894dae89575a49._comment | 13 + ..._68cbb7268bdad73357da2d11e05d73c4._comment | 8 + ..._816d552f871a1b06306f04d575adb2e5._comment | 8 + ..._7905b097a9c582452fb04cdc88ed4285._comment | 14 + ..._bd5ac9bb2eaab66af6aa13b39172b49d._comment | 9 + ..._9881db7bb6fef4e47c54cdc23e995f17._comment | 13 + ..._4fb9d3de245dddab65fb1a53a67a095c._comment | 8 + ..._41e2ea458669f59f96b5860825745910._comment | 8 + ..._515039e321e0595f95430d8082bd54a5._comment | 20 + ..._9412236296871c570c66f5b4c7f9681e._comment | 10 + ..._e4e7d13be6c0bc63f426e535de6172f8._comment | 8 + ..._c73e1277c5f284b1019362fb2bef94a8._comment | 8 + ..._f513259a2641e00b049203014ab940c8._comment | 12 + ..._54ee7b90467fee8b0457e9c447747500._comment | 10 + ..._7e6223c2dae3346e17276c7bbb01d53e._comment | 12 + ..._13b6e595d595da7f036e81258a65541e._comment | 8 + ..._94144c0cbdbccc72c13e12daf7657a29._comment | 8 + ..._9eb064ffdc3fdb70e85572185e151a3f._comment | 8 + ..._cde756e8a9b18fe2ca9cda25967bc7fb._comment | 10 + ..._1fd6a4374a334bc03914c3e0df95ef95._comment | 10 + .../git_annex_fork_bombs_on_gpg_file.mdwn | 25 + ..._6e29b60cd77f3288e33ad270f95f410e._comment | 8 + ..._ad13e3221ae06086e86800316912d951._comment | 12 + ..._41746b731eae7f280bb668c776022bcb._comment | 8 + ..._56ca8590110abffeed6d826c54ca1136._comment | 10 + ..._73ae438a37e4c5f56fe291448e1c64dd._comment | 13 + ..._aa237adebe7674b8cdb9a967bb5f96a8._comment | 8 + ..._ab403d7abbbbabd498b954b0b9742755._comment | 12 + ..._a35d04440b1220faf9088107c3f17762._comment | 10 + ..._8345331b9b313769ba401da2ffd89332._comment | 10 + ..._7eb535ca38b3e84d44d0f8cbf5e61b8b._comment | 18 + ..._a3aa4231a82917c56cbdf52b65db7133._comment | 21 + ..._178fd4e4d6abbca192fcd6d592615fca._comment | 12 + ..._7d80f131f43312bb061df2be7fa956ef._comment | 10 + ...n_direct_mode_does_not_checksum_files.mdwn | 18 + ..._a6cde4aa495512344fa7f50e10749c68._comment | 8 + ..._4ac3b87ec0bc0514c4eff9f5a75b9f5d._comment | 26 + ..._d18b1fdc866edf2786d2c6b7ec55119f._comment | 11 + ..._31e4fcbf63c11cc374a849daf3ce1dbc._comment | 8 + ...t_annex_fsck_is_a_no-op_in_bare_repos.mdwn | 21 + ..._fc59fbd1cdf8ca97b0a4471d9914aaa1._comment | 8 + ..._273a45e6977d40d39e0d9ab924a83240._comment | 9 + ...when_remote_is_an_ssh_url_with_a_port.mdwn | 13 + ...bout_remotes_with_dots_in_their_names.mdwn | 34 + ...estroys_a_fellow_git_annex_repository.mdwn | 130 + doc/bugs/git_annex_importfeed_fails.mdwn | 64 + ...ex_indirect_can_fail_catastrophically.mdwn | 78 + ..._0b085e7e8c8e364f479574bc00c7c394._comment | 21 + ...needs_some___34__error_checking__34__.mdwn | 65 + ...git_annex_initremote_walks_.git-annex.mdwn | 19 + doc/bugs/git_annex_lock_dangerous.mdwn | 19 + ...problems_with_urls_containing___126__.mdwn | 46 + ...te_leaves_old_backend_versions_around.mdwn | 19 + ..._f3e418144e5a5a9b3eda459546fc2bb0._comment | 8 + ...use___39__git_add_-f__39___internally.mdwn | 11 + ..._7683bf02cf9e97830fb4690314501568._comment | 8 + ...__39__t_use_.gitignore_in_direct_mode.mdwn | 18 + ...ync_--content_not_syncing_all_objects.mdwn | 31 + ..._36deea0f1277d6888c8bb79156c56efa._comment | 16 + ..._70804d50b07630fadfc029a22173c5a0._comment | 14 + ..._d7349af488008e3ca6557e0c1fbfc5b6._comment | 9 + ...nch_of_files___40__not_expected__41__.mdwn | 42 + ..._e25451863622eefed664f6a210cbe67d._comment | 72 + ..._f49e6f4016b3a6f918961a2412902e03._comment | 12 + ..._a234e4f58d2cc3b0110e4e65aceeb2c3._comment | 20 + ..._a01a867500fd94e6b317e74a0b0b1401._comment | 8 + ...ect_mode_does_not_honor_skip-worktree.mdwn | 35 + ..._69baeb997086c885f34fd1dc385cf5d6._comment | 12 + ..._fb8c0bebb9aaa75ee7eaf6999b1db49e._comment | 10 + ..._6bfd4e9a7853af93e72b717249de9439._comment | 8 + ..._a7eab4171af7e46bcc637aacf630e9db._comment | 8 + .../git_annex_test_under_windows_8.1.mdwn | 67 + ...uninit_loses_content_when_interrupted.mdwn | 33 + ..._fd9d2abbc90fb4f470b2212bc1f4a2dd._comment | 8 + ..._0e99f6ef4f8b342ef0ebc64dbf8e2ce6._comment | 12 + ...s_files_not_previously_added_to_annex.mdwn | 32 + ..._ce4e3b1bf0d53119d049cf7dd621c5c4._comment | 10 + ..._3aa125635609fce41ab0c98cefb81f98._comment | 9 + doc/bugs/git_annex_unlock_is_not_atomic.mdwn | 7 + ...rts_due_to_filename_encoding_problems.mdwn | 15 + ..._8ba4fdb9f2d3bd44db5e910526cb9124._comment | 8 + ..._2a4a2b3e287a0444a1c8e8d98768a206._comment | 8 + ..._dacfdb8322045fc4ceefc9128bf7c505._comment | 17 + ..._7889a3ff5ce80c6322448aa674df8525._comment | 10 + ..._6d28c2537ce24eeb3496ca349823defd._comment | 19 + ..._4bf14ecef622988e80976c0fb55c24b9._comment | 10 + ..._d2e5382fe0f38fb9dd9ee69901c68151._comment | 8 + ..._b282757537cda863d3dc6d0bbfd6b656._comment | 8 + ..._branches_which_makes_it_inconsistent.mdwn | 106 + ..._a636ffe55b11c46a0afcc0b9a3a88cd4._comment | 10 + ..._5e1ad57420efd16ae09c9e5cad55b5f2._comment | 13 + ...nex_unused_failes_on_empty_repository.mdwn | 15 + ...nused_seems_to_check_for_current_path.mdwn | 39 + ...acter___40__and_probably_others__41__.mdwn | 33 + ..._861506e40e0d04d2be98bbfe9188be89._comment | 12 + ...ade_output_is_inconsistent_and_spammy.mdwn | 15 + ..._3a01c81efba321b0e46d1bc0426ad8d1._comment | 10 + ...rsion_should_without_being_in_a_repo_.mdwn | 7 + ..._e7b26eeb1a765fd83280ef907c0deef2._comment | 8 + ...app_--listen_on_a_remote_linux_server.mdwn | 50 + ..._db99c00830d3f15ebe790c4dc8b60bd7._comment | 8 + doc/bugs/git_annex_webapp_runs_on_wine.mdwn | 47 + ..._c71dfa42780c0fc78f88ce054e5f3ee3._comment | 16 + ..._f28441b18b0be90c1e58348455ce09d9._comment | 23 + ...won__39__t_copy_files_to_my_usb_drive.mdwn | 60 + ..._7707017fbf3d92ee21d600fe0aefce4f._comment | 10 + ..._f3392ec3ca7392823cbad2cc9b77f54e._comment | 9 + ..._b3d016a487b12748fe2c4d14300eb158._comment | 20 + ..._61f600511a3172f0707e5809fc444d0c._comment | 9 + ..._8cf029ac7bf3c19dcb0b613eed3b52ac._comment | 10 + ..._e40d88eba7d8aec1530ce1d32d1c85f2._comment | 11 + ..._b101fab9e690d1b335a1a29abab68d6c._comment | 10 + ..._b30d32086314a7e357f3dd6608828ee5._comment | 9 + ...nix_breaks_git_commit_after_uninstall.mdwn | 42 + ..._c8b1bab40d3bb2468a5bba7b116e854e._comment | 8 + ..._4173770375fca51dcaf9b974296d041a._comment | 8 + ...nd_has_tons_of_redundant_-a_paramters.mdwn | 15 + ...0__child_of_git-annex_assistant__41__.mdwn | 34 + ..._5e3f4b63db5cd32b63fb3e6a78f9b093._comment | 10 + .../git_rename_detection_on_file_move.mdwn | 13 + ..._5ec2f965c80cc5dd31ee3c4edb695664._comment | 8 + ..._0531dcfa833b0321a7009526efe3df33._comment | 26 + ..._7101d07400ad5935f880dc00d89bf90e._comment | 27 + ..._57010bcaca42089b451ad8659a1e018e._comment | 8 + ..._79d96599f757757f34d7b784e6c0e81c._comment | 34 + ..._d61f5693d947b9736b29fca1dbc7ad76._comment | 12 + ..._f63de6fe2f7189c8c2908cc41c4bc963._comment | 19 + ..._7f20d0b2f6ed1c34021a135438037306._comment | 10 + ..._6a00500b24ba53248c78e1ffc8d1a591._comment | 21 + ..._75e0973f6d573df615e01005ebcea87d._comment | 9 + doc/bugs/git_repo_fails_to_checkout.mdwn | 39 + ..._d92e7e3b41382501a08f6a66c673b1fd._comment | 8 + ...in_prebuilt_linux_tarball_is_outdated.mdwn | 11 + ..._2a5a07498df9d38531d4570f7b463b9a._comment | 8 + ...for_DCIM_on_Android_misses_some_files.mdwn | 17 + ..._f683ecf93e5a17c5c9c06225dbcce2a9._comment | 12 + doc/bugs/gix-annex_help_is_homicidal.mdwn | 23 + doc/bugs/glacier_from_multiple_repos.mdwn | 14 + doc/bugs/googlemail.mdwn | 16 + .../gpg_bundled_with_OSX_build_fails.mdwn | 25 + ..._ec911f920db6c354ba998ffbb5886606._comment | 10 + ..._bf2a3ab1bbe258bd501ec4b776882adf._comment | 12 + ..._c0142427400323c00bd8294415ae32c5._comment | 15 + ..._b56db4b5afc276f88a2b980e22fda8a0._comment | 10 + ..._a4eda81e5f927c463593bc48fbe84077._comment | 12 + ..._2f0b9331d16a208883bac586258a7b50._comment | 8 + ..._c05c484a6134f93796cff08de0f63e80._comment | 16 + ..._f2cb5467ebe80cf67e1155b771b73978._comment | 8 + ..._27bbda7e31f55b29e1473555ee17e613._comment | 8 + doc/bugs/gpg_error_on_android.mdwn | 39 + ..._870583fd1b7a33b688b9a228077d1333._comment | 629 ++ ..._9ce5511a109bde50d8cf87bad0268b4a._comment | 26 + ..._b345e80f38d38f82cfcfce3102138fb8._comment | 46 + ..._032f42235b7f26854e725041ca33384b._comment | 10 + ...a_new_remote_repository_via_assistant.mdwn | 55 + ..._7b409701c650b55b3472accd70555f16._comment | 8 + ..._40b00f7258512677516ec5036b89090f._comment | 14 + ...es_to_100__37___cpu_on_bad_input_data.mdwn | 18 + ..._889218fb7c0115b03d9bad0c07296097._comment | 36 + .../gpg_hangs_on_glacier_remote_creation.mdwn | 78 + ..._41ca74a4e4aaf4f6b012a92677037651._comment | 14 + ..._dd11fd25c8bb1f2d7e1292c07abf553e._comment | 591 ++ ..._543d8a13756c1355a5752867bdcbefd3._comment | 20 + ..._6441cf25e6bd62c96d7e766da9bdd7fb._comment | 25 + ..._72e152294e36bc5f2d78e8e2ebed6a23._comment | 8 + ..._890e85df05903795e01efbd7879f9c87._comment | 8 + ..._042047f9fcc45abbfa47c3973d79f08e._comment | 10 + doc/bugs/gpg_needs_--use-agent.mdwn | 53 + doc/bugs/gsha256sum_crashes.mdwn | 92 + ..._8597d8ee29232494b1795526b6a0d8d1._comment | 81 + ..._e410fc1998fbc7db8c13081f76acf7fc._comment | 12 + ..._f796dd49097425148b785bb7b6213df6._comment | 10 + ..._1c46b4ad0c981c6105ffb8531223f0b1._comment | 10 + ..._3fa106ed7fb30226ee7c48b66edb963c._comment | 16 + ..._276b181b2aeb1512e0468b88598e0a84._comment | 12 + ..._c2898422ceb9e103d8acdde866b7a211._comment | 34 + doc/bugs/hGetContents:_user_error.mdwn | 38 + ..._30178f151f8c60d2ff856ca543dc506c._comment | 10 + ..._f74eeed4a007058a22183fd678ecd6c6._comment | 8 + ..._515e562228a89a13d6d857a874f4a468._comment | 8 + ..._8c6ed5e459c5c66b77db446c6317114c._comment | 8 + ..._f80bce48c3f96b0cd6892af43ee88a96._comment | 8 + ..._69dc09e4ae726856dafbeec34170671c._comment | 8 + ..._3f66b03f773341fad94ec16b4f55edaa._comment | 32 + ..._a697e2d36abfc999e65c9f587c0de56e._comment | 10 + ..._da7c5905a64bb6779970f9394155e629._comment | 10 + ...__40__or_this_a_general_problem__41__.mdwn | 113 + ..._rysnc_installed__44___not_recognized.mdwn | 19 + ..._3ff000eb3efde41426c7b086ae627dcf._comment | 12 + ..._34e592ab057df2df54e13d3f5cae64f0._comment | 14 + ..._05ffbae13d8f9b08315f40bb9b206f46._comment | 21 + ..._99d1f151263ca3433dd4afa8a928b1fe._comment | 30 + ..._6ef1a377b0b4d3efeffdf9693d0b496b._comment | 12 + ..._d9e36828ad55f3181a1c650010f23d6b._comment | 14 + doc/bugs/id__95__rsa_on_android.mdwn | 32 + ..._58f4fd1c4ae29bc3d2f3ea0aa6f6c12b._comment | 8 + ..._7039ed326c92211aa92e9276aba8c6b6._comment | 12 + ..._cbe24ed08a7ef91c8c0c20ab9b7d25b7._comment | 10 + ...uction_on_OSX_for_5.20131230-g9a495e6.mdwn | 25 + ..._515682c2338c861580105e869df648a1._comment | 8 + doc/bugs/immediately_drops_files.mdwn | 222 + ..._9ef6e694ef8a8eee7a42f88554475db7._comment | 10 + ..._76e4f8b73ab60b2540dd2a3e5379791d._comment | 8 + ..._788db083f5ba2e5589c3b952203ec954._comment | 21 + ..._425b79865eb77d69d0b7a71a14639f81._comment | 10 + ..._7c9f660b6bcec31827a44a650e9d4622._comment | 10 + .../import_memleak_from_the_assistant.mdwn | 1608 +++ ..._81c80ca3ea288c651ccf45c83477e058._comment | 10 + ..._56089b7ad5d02c39ae0aacb442d789e9._comment | 16 + ..._b193a4a0901c681b59a97b93b456765b._comment | 15 + ..._d9464c7dc41773650ef7291391e1b414._comment | 10 + .../leakafter.png | Bin 0 -> 43348 bytes .../leakbefore.png | Bin 0 -> 24006 bytes ...portfeed_fails__44___bad_feed_content.mdwn | 36 + ...he_option_--lazy_for_specific_podcast.mdwn | 77 + ..._4ccfabbaf75e139b32f6fa6f7bc6a7fe._comment | 8 + ..._should_allow_pubdate_in_the_template.mdwn | 5 + ...es___34____95__foo__34___as_extension.mdwn | 17 + doc/bugs/inconsistent_use_of_SI_prefixes.mdwn | 55 + ...mental_fsck_should_not_use_sticky_bit.mdwn | 15 + ..._204f45a43cd10bcb45c4920a13d66e8d._comment | 28 + ..._a8bb264cb2ceece72e0dd9191b2b566e._comment | 8 + ..._c6c8d3c84afa497bfdfe25b492dac5b9._comment | 12 + ..._5ac5a10bdddf23153e8ea0a8eb60323e._comment | 10 + ..._ec29ed50c4321cf9e21c56c13c65156b._comment | 8 + ..._c7f1170b84f9ea4befe96cdfe3bdaa1f._comment | 8 + .../index_file_smaller_than_expected.mdwn | 53 + ..._d87ae8c4d384d2ce6d1286b51bfdeba1._comment | 17 + .../info_file_contains_wrong_version.mdwn | 20 + ...nce_with_Dropbox_results_in_data_loss.mdwn | 48 + ..._837c7ab2d31531ac8a61509225926814._comment | 20 + ..._fe852adc1d7d3062ace269ceb134f3ad._comment | 8 + ...ent___40__invalid_byte_sequence__41__.mdwn | 29 + ..._server_error:_unknown_UUID_on_webapp.mdwn | 147 + ...ver_error_creating_repo_on_ssh_server.mdwn | 26 + ..._4a2c9338d5c779496049d78e29cf5cbd._comment | 8 + ..._choosing_encrypted_rsync_repo_option.mdwn | 28 + ..._14a2f775f43a86129ce3649a06f8ba0b._comment | 8 + ..._7b277320fcffd8d03e0d3d31398eb571._comment | 16 + ..._ba9dd8f2cc46640383d4339a3661571f._comment | 16 + ..._274ae39d55545bde0be931d7a6c42c94._comment | 12 + ..._242291d46acc61bdfc112e3316de528b._comment | 10 + ..._76b936263e82ca6c415a16ed57e770b4._comment | 8 + ..._9ccd3749fd9f32b0906c0b9428cc514f._comment | 10 + ..._4e8982668b5044b2286d55c90adb9da3._comment | 8 + ..._aaf0ee250972d737a2ca57de5b5f1c0a._comment | 12 + ...nterrupting_migration_causes_problems.mdwn | 52 + ...sues_with_non-posix_compatible_shells.mdwn | 41 + ..._076948499a9d581a50da52b7690e5d4e._comment | 8 + .../javascript_functions_qouting_issue.mdwn | 44 + ...journal_commit_error_when_using_annex.mdwn | 21 + ..._38f60ca3503ea1530c4bd2cde5c9182f._comment | 10 + ..._6de455a67f37d9ee0a307a78123781bf._comment | 10 + doc/bugs/json_is_broken_for_status.mdwn | 34 + .../links_in_firefox_do_not_always_work.mdwn | 26 + ..._5e506674f157e8ed612eca1f9adfa068._comment | 18 + ..._dfde57b433301e971c2d5b9e4d3c824a._comment | 12 + ..._2d090d6e67ba53ff7e5c0275274f9b3d._comment | 15 + ...ant_causes_resource_starvation_on_OSX.mdwn | 30 + ..._91c911c29fd126ddc365c561591f627e._comment | 10 + ..._c316aead931a6a2377a4515bbb34ac5b._comment | 8 + ..._committer_thread_loops_occassionally.mdwn | 53 + ..._f8d1720aa26c719609720acf0772606e._comment | 11 + ..._0527569ea2924721d19dadcf4fe0ec5a._comment | 8 + ..._5b67ff08a897ea3d2266ccc910ab4278._comment | 8 + doc/bugs/make_SHA512E_the_default.mdwn | 29 + ..._install_can__39__t_be_used_with_sudo.mdwn | 20 + ...l_doesn__39__t_create_git-annex-shell.mdwn | 62 + ..._8c20edd8c6483500f807528d616c6dfd._comment | 14 + ..._8b2cf0fe7219e0bc83fd326adbf26c8a._comment | 31 + ..._25fe06eb127e59a4a07aeb52a5cfeabe._comment | 8 + ..._ec78032ba62d6918baa2c0b07ead5b50._comment | 8 + ...making_annex-merge_try_a_fast-forward.mdwn | 35 + .../manpage_has_slight_indentation_error.mdwn | 38 + ..._81001ecda65d882ea946611d1e18d59f._comment | 10 + ..._24f3b6699f646ec0c20f3d4ca010e345._comment | 28 + ..._950e735c6d618e60cffffd1aebf06fd3._comment | 8 + ..._39327211f3fd1f9ed196a1f09cf68bdc._comment | 8 + ..._471a2f5792dfc7cde4f1eb793984abf1._comment | 8 + ...ot_respecting_annex_ssh_options__63__.mdwn | 38 + ..._c63a1ed5909d53f116f06e60aba74dc6._comment | 10 + ...e_causes_out_of_memory_on_large_repos.mdwn | 26 + ..._6d47485728ea65a9b555f8be7159dea5._comment | 10 + ..._06723d13ecdaf87de5ff2b209e3c5198._comment | 10 + ..._9f83ef190547b291a715cda55b7977d4._comment | 10 + ..._0e32ae0300472c56079cfbcd78a3e386._comment | 9 + ..._e8998716107e7ae8d0e8d332812517ad._comment | 14 + ..._seem_to_die_when_using_the_ARM_build.mdwn | 38 + ..._0527581ea60d28bb28504fa2a355ed87._comment | 10 + ..._926a87b60e20d286d49639c8dad13a1a._comment | 8 + ..._c509fba1a9adacfd26a2bd12b4aea988._comment | 8 + ...d_files_not_showing_up_in_unused_list.mdwn | 62 + ..._2cfbf6693b051c758fe5efa5ee885829._comment | 16 + ..._acb1abeb32c3aba8ba65151afbea753c._comment | 10 + ...or_bug:_errors_are_not_verbose_enough.mdwn | 26 + ...ng_dependency_in_git-annex-3.20130216.mdwn | 29 + .../missing_kde__47__gnome_menu_item..mdwn | 29 + doc/bugs/moreinfo.mdwn | 6 + ...is_not_in_Haskell_Platform_2012.4.0.0.mdwn | 12 + ..._2c4b3757bb8de563edca65aeabcbbc5a._comment | 29 + ...d_repo_results_in_errors_on_drop_move.mdwn | 59 + ...file_changed_to_annexed_on_typechange.mdwn | 40 + ..._6ac691645edb483797bee05043fd83b3._comment | 8 + ..._5d67e3a60b7cc30c2b1857f50895d363._comment | 8 + ..._78f1e081b92f418c20893d86a8715501._comment | 8 + ..._1e2a59e0eec89ef1a57d1488ff40dcf0._comment | 12 + ..._5e74431048b07631e0dbeca90fdb365b._comment | 47 + ..._3724e1c1a5fc6d3589452478249792ec._comment | 8 + ..._7f841ea7bf7d44f3d810ca097ac9eb47._comment | 8 + ..._c53ce2274388711ffbde1595b64f932b._comment | 10 + ...rd_output__41___from_git_annex_status.mdwn | 89 + ..._fcd230cbb2ac363c469b98021042c011._comment | 10 + ..._23207ecabd4b41d9551d0491fa71e96b._comment | 12 + ..._6ea92adfe955b6a5cd2a39fea78b3bf6._comment | 119 + ..._d0e55585f1612148163039d157253258._comment | 11 + ..._5506dc1b08516677886da4aa97263864._comment | 12 + ..._073449cc2cb73efd2b2d3d778a5573de._comment | 14 + ..._3516e71ba3b07427a10cbb4965712aa6._comment | 24 + ..._ea2e4704adb2f304f9c11c61eb62e919._comment | 8 + ..._4d17fedead7977541371a3f2c192e030._comment | 46 + ...o_have_annex_on_a_separate_filesystem.mdwn | 32 + ...ecated__44___but_still_in_walkthrough.mdwn | 21 + ...ata_isn__39__t_unused_after_migration.mdwn | 66 + .../on--git-dir_and_--work-tree_options.mdwn | 31 + ...se__95__hiddenXXXXX_files_left_behind.mdwn | 52 + ..._b96ea3ece44d42e79e4d903ca66065ee._comment | 12 + doc/bugs/one_test_fail_on_osx.mdwn | 30 + ..._13a7653d96ddf91f4492a9f3555a69aa._comment | 16 + ..._31f154011ec26a463de7b1e307e49cb6._comment | 8 + ..._33433bcfb1946b52f1f41b9158ab452d._comment | 8 + doc/bugs/ordering.mdwn | 12 + doc/bugs/pages_of_packfile_errors.mdwn | 32 + ..._eb2989112b38bb27ce8f691dd5d318e5._comment | 10 + ..._69fba53035ebea213ae1c11be5326690._comment | 8 + ..._73b9f574e8ce36d5e0d0f6c6a89006b7._comment | 39 + doc/bugs/pasting_into_annex_on_OSX.mdwn | 28 + ..._4eab52bb6eda92e39bdaa8eee8f31a7f._comment | 8 + ..._f1b58adfec179b75c1fc2bf578a3b5c4._comment | 8 + ..._270aa7680c3b899a92ce6543eaba666a._comment | 17 + ..._ec11a80d5b0f78c7a927f8aa71a6c57a._comment | 8 + ..._1928bd25e5e6874a3b83c2f2adc776f5._comment | 7 + ..._0fe288f54b781a0c51395cb32f0e2f9d._comment | 8 + ...nt_does_not_allow_spaces_in_filenames.mdwn | 29 + ..._ca10638d4b4b178cfd0de8736542c4dc._comment | 12 + ..._986a393a512229d35e529ba242b77b1e._comment | 10 + doc/bugs/problem_commit_normal_links.mdwn | 59 + .../problem_to_addurl_--file_with_ftp.mdwn | 67 + ..._2bf44f1653069fb2ed0b124cf8581a48._comment | 8 + ..._c85266a9359a9f45e632f31c016a45dc._comment | 8 + ..._5bba62e1dd4118bcf7e1c990c7009239._comment | 22 + .../problem_with_upgrade_v2_-__62___v3.mdwn | 3 + ..._5f60006c9bb095167d817f234a14d20b._comment | 8 + ..._cd0123392b16d89db41b45464165c247._comment | 23 + ..._86d9e7244ae492bcbe62720b8c4fc4a9._comment | 16 + ..._91439d4dbbf1461e281b276eb0003691._comment | 8 + ..._ca33a9ca0df33f7c1b58353d7ffb943d._comment | 8 + ..._f360f0006bc9115bc5a3e2eb9fe58abd._comment | 10 + doc/bugs/problems_with_android_and_gpg.mdwn | 73 + ..._526d8805cb1ae896e8b1920ac2aecc17._comment | 8 + ..._2e1ae66bac4f55b74074b09e22ab270d._comment | 16 + ..._47510400e8e45a71a1581aed99a157a1._comment | 12 + ..._d28d773450d09e03160548d99f12256d._comment | 12 + ..._74f1177d6dd42bab5ddfc040cbfb035e._comment | 10 + doc/bugs/problems_with_android_and_xmpp.mdwn | 82 + ..._dd56eb74660a606c7db54861ec745cc6._comment | 11 + ..._ae4554fadfc3ea1913a36aa535815cfb._comment | 12 + ..._128702a7974bd00337c3304e49a74f0b._comment | 23 + doc/bugs/problems_with_glacier.mdwn | 65 + ..._8d233428a16ae4276d9c69b329e8216b._comment | 12 + doc/bugs/problems_with_utf8_names.mdwn | 81 + ..._c53c309771caa41accab5523cc6998dd._comment | 10 + ..._3c7e3f021c2c94277eecf9c8af6cec5f._comment | 17 + ..._bad4c4c5f54358d1bc0ab2adc713782a._comment | 10 + ..._4f936a5d3f9c7df64c8a87e62b7fbfdc._comment | 8 + ..._93bee35f5fa7744834994bc7a253a6f9._comment | 10 + ..._519cda534c7aea7f5ad5acd3f76e21fa._comment | 11 + ..._52e0bfff2b177b6f92e226b25d2f3ff1._comment | 8 + ..._0cc588f787d6eecfa19a8f6cee4b07b5._comment | 8 + ..._ff5c6da9eadfee20c18c86b648a62c47._comment | 10 + ..._f358e617799e5a4e3afc6536d419eb08._comment | 10 + ...vi_0.9.5_does_not_work_with_git-annex.mdwn | 87 + ..._d0d2bcd97ef5c9bce8a57c4184a176e0._comment | 10 + ..._ff9661198257b8c5e2e8ca3d85a7471c._comment | 8 + ...ce_then_stopped_running_opensuse_13.1.mdwn | 13 + ..._a9daf9e8f968b32f25e236f53ea4b845._comment | 14 + ...nishing_when_assistant_gets_restarted.mdwn | 34 + ..._53b4f388c47c1b3f6ffa4fc2155b30fc._comment | 21 + ..._e66532b23b089c9ea61122d6664cddb9._comment | 10 + ..._c9d692c867acc076f64f1213ea03ca11._comment | 8 + ...d___96__git_annex_sync__96___behavior.mdwn | 113 + ..._1a0b964f93c753838d6ccbdc8f79b39e._comment | 8 + ..._d22dcd7f95c5dc1c381c3c746781efce._comment | 8 + ..._a25140eb90f6b24c1a3ca39c901694e2._comment | 10 + ..._825e15183008ff7d97a81cacc3f55fb4._comment | 8 + ..._e858fc7c729cd39740354fb12627d556._comment | 10 + ..._9881b0f2dfb0907a60c0da296bc3da3f._comment | 10 + ..._ca017b9d3bafea4cb31448c802f3834e._comment | 8 + ...ve_file_in_place_on_checksum_mismatch.mdwn | 15 + ...heir_symlink_targets_don__39__t_exist.mdwn | 67 + ..._8a1d16b2aaba224e94be3d9dcc036d91._comment | 12 + ..._434ed328a22a6657dba3b2929a56e499._comment | 18 + ..._1837b70ace42882db3ab82e001680934._comment | 29 + ..._ca9c87a10f29e41572540edeb99652f2._comment | 11 + ..._69eafc4201e3014ef1b5d74fe319e462._comment | 10 + ..._b7a64db9abe006af8c30169ad849efe9._comment | 76 + ..._197ac6070f256131c6e18a07aa3834fa._comment | 14 + ..._fe07832333b536c71b7dcb46a4a44bd0._comment | 19 + ..._540bca4e6fdfc10eeab875ecc0f2b3f3._comment | 10 + ..._3f236b35e9820cd88bb77fcd57d6975e._comment | 43 + ..._3cc5dae0351201522711a7caeecd60d5._comment | 10 + ..._3c3883cb66d02a15d5de84d22aa113da._comment | 38 + ..._c8cece9559bd2dc6154cd28772369e48._comment | 10 + doc/bugs/remote_not_showing_up_in_webapp.mdwn | 88 + ..._2a269732fd528f505777542d3556437a._comment | 17 + ..._device_configurator_chokes_on_spaces.mdwn | 18 + ...denied__44___after_direct_mode_switch.mdwn | 81 + ..._14cec6448831c67794b62926a03b2fc5._comment | 13 + ..._93af8f48a01b6e2d011bd6f60499ccd2._comment | 23 + ..._f8fba1955e62360061613e5898b3d74e._comment | 16 + ..._abffe1fb3b3e684b126e4768089dc5f4._comment | 8 + ..._bccc53d2d6f659f21965042a057358f5._comment | 8 + ..._ac8b3b042b882680f0eb0d53ade1ce15._comment | 14 + ...t_the_file__39__s_content_from_remote.mdwn | 27 + ..._d6aad1831674586fe4cdf61dd2a4bbb9._comment | 15 + ..._8591e174c1a8cddfae9371407a58ff1c._comment | 10 + ...fails_when_home_on_seperate_partition.mdwn | 60 + doc/bugs/restart_daemon_required.mdwn | 22 + ..._f79ac16cc9f1e3b08cd121bf5efb29c3._comment | 8 + ..._50c1b268a3cc4514681059eabca674e3._comment | 8 + ..._1716e0f3c7c44dc77ebf7f00fdd8f9e3._comment | 310 + ..._3ce776786eca83fcb8ff94c8f6ff3eb9._comment | 15 + doc/bugs/rsync_remote_shows_no_progress.mdwn | 15 + ..._a7f5d646a924c462b987561cf6fc4318._comment | 8 + ...es_which_have_names_containing_spaces.mdwn | 50 + ...ync_transport:_username_not_respected.mdwn | 43 + doc/bugs/scp_interrupt_to_background.mdwn | 2 + doc/bugs/set_metadata_on_wrong_files.mdwn | 90 + ..._074f124e5d313e90b3e9217325799587._comment | 8 + ...on_without_having_to_be_in_a_git_repo.mdwn | 11 + doc/bugs/signal_weirdness.mdwn | 48 + ..._--_please_seek_possibility_to_shrink.mdwn | 41 + ..._d2faaff98386433110dcf7aae87916b7._comment | 9 + ..._1359ddf1b5db4303f8bd219d3f07df3a._comment | 10 + doc/bugs/smarter_flood_filling.mdwn | 31 + doc/bugs/softlink_mtime.mdwn | 54 + ...failed_when_adding_remote_server_repo.mdwn | 44 + ..._52180983b59c247389a55a9523ec435b._comment | 14 + .../ssh:_unprotected_private_key_file.mdwn | 62 + ...ssh_connection_caching_broken_on_NTFS.mdwn | 66 + ..._54e7e12514f4c109fd57a4eb744b731a._comment | 14 + ...ux_build_as_of_Mar_6th___39__14__41__.mdwn | 10 + ..._462c377dca2484e5598a0b71d91ab64a._comment | 8 + doc/bugs/submodule_path_problem.mdwn | 56 + ..._69aec9207d2e9da4bc042d3f4963d80e._comment | 48 + ..._53d9eb28cb70b51637470175a80ddf35._comment | 8 + ..._aa5e0f99000a5b4988bccbb2ca28353b._comment | 20 + ..._ab1508a5a04e2106aad5e7985775a6fa._comment | 8 + ..._8c7539d1c11b81f5d46aa8e1c61745ae._comment | 14 + ..._cacc91afcb1739dfca3a60590bb70356._comment | 67 + ...ave_the_32bit_version_installed__41__.mdwn | 50 + ..._6208e70a21a048d5423926d16e32d421._comment | 9 + ..._8765b6190e79251637bb59ba28f245c1._comment | 21 + ...h_the_annex_directory_exposed_to_http.mdwn | 20 + ...o_copy_content_to_metadata_only_repos.mdwn | 34 + ...new_remote_despite_not_being_asked_to.mdwn | 46 + ..._dcd52b57192e83fe365f21dc12461008._comment | 10 + ...est_failures_on_window_for_5.20131118.mdwn | 22 + ..._5a7a284625c12d54390fe4a4ec1d4211._comment | 188 + .../test_suite_failure_on_samba_mount.mdwn | 278 + ..._e074b20801b921ee2661025a050a8af2._comment | 12 + ...st_suite_shouldn__39__t_fail_silently.mdwn | 3 + ..._is_no_global_.gitconfig_for_the_user.mdwn | 50 + ...-_after_an_update_of_haskell_platform.mdwn | 23 + ..._20a6fe046111e9ae56fd4d9c9f41f536._comment | 8 + ..._6fdc5f8b07908c6eda8a97690408f44e._comment | 45 + ..._014474a133c7ff0131029d8721afc710._comment | 46 + ..._9c537e251dc99667fe87870804d802c2._comment | 10 + ...a41_disables_the_watch_command_on_OSX.mdwn | 22 + .../three_character_directories_created.mdwn | 56 + ..._dd91de24dab4f2eaded1f7d659869d4d._comment | 8 + ..._f6375964a6c8bb1e6c5b7238effca66d._comment | 62 + ..._776e0a9b938d8b260a5111594b442536._comment | 8 + ..._e288bacdb336c4886adb6eeb4dca1e92._comment | 8 + ..._359b80948ac92a0f1eb695599456486c._comment | 10 + .../three_way_sync_via_S3_and_Jabber.mdwn | 119 + ..._fc5ec5505f141bb9135e772d1094bc4d._comment | 12 + ..._0df2210c30dec6d88d7858d93eec19a3._comment | 10 + ..._41682b2e72e657e0f23af244f8345e85._comment | 10 + ..._c7b4ea9aea6839763eb8b89e8d6a5ad5._comment | 14 + ..._063f5e5e554ad6710f16394906d87616._comment | 33 + ..._197ad39b4a46936afeeb04eb26cf1ef3._comment | 138 + ..._0b0d829ccd255be0177ae9d8f6b10e63._comment | 61 + ..._37a8e19440c764317589bc4248cbccdf._comment | 10 + ..._12eb333327d31ca2bfee3f3c5e26d641._comment | 24 + ..._e6b1084b2f18d8e536c8692e165754a3._comment | 12 + ..._2120a1c3e5f490a55f68bb1bef5efd0d._comment | 183 + doc/bugs/tmp_file_handling.mdwn | 13 + ..._0300c11ee3f94a9e7c832671e16f5511._comment | 13 + ..._cc14c7a79a544e47654e4cd8abc85edd._comment | 8 + ...s_problems_on_non-linux_based_systems.mdwn | 19 + ..._1d38283c9ea87174f3bbef9a58f5cb88._comment | 10 + ..._bf112edd075fbebe4fc959a387946eb9._comment | 8 + ..._a46080fbe82adf0986c5dc045e382501._comment | 8 + ..._760437bf3ba972a775bb190fb4b38202._comment | 8 + ..._060ba5ea88dcab2f4a0c199f13ef4f67._comment | 10 + ..._548303d6ffb21a9370b6904f41ff49c1._comment | 42 + ..._7ca00527ab5db058aadec4fe813e51fd._comment | 8 + ..._881aecb9ae671689453f6d5d780d844b._comment | 8 + doc/bugs/transferkey_fails_due_to_gpg.mdwn | 51 + ..._f6434400d528a0fa59c056995ff2e6f3._comment | 12 + ..._c540b05b62a3186a87efcb180ea2a52d._comment | 12 + ..._9ad2ef73169dbd2866da2f4259ab0f00._comment | 8 + ..._7631b8842efba6a4aad87386ce9443a7._comment | 8 + ...onfig_contradiction_causing_confusion.mdwn | 35 + ...eaks_to_directory_special_remote_doco.mdwn | 80 + ...dy_to_add_remote_server__34___message.mdwn | 16 + .../typo_on_the_Mac_OS_10.7.5_Lion_build.mdwn | 11 + ..._e8df4b36a89b37edd94f3a318ae93a32._comment | 8 + ..._3b2c3c84bd1910280c549a2ee1c622b9._comment | 8 + ..._repository_group_of___34__here__34__.mdwn | 13 + ...f_missing_git-upload_and_receive_pack.mdwn | 208 + ..._8b0302bba2b99df0842dfead649080e7._comment | 8 + ..._do_not_work_when_git_index_is_broken.mdwn | 17 + ..._1931e733f0698af5603a8b92267203d4._comment | 8 + ..._40920b88537b7715395808d8aa94bf03._comment | 8 + ...nannex_command_doesn__39__t_all_files.mdwn | 30 + ..._object_even_if_referred_to_by_others.mdwn | 20 + ..._0ce72d0f67082f202cfa58b7c00f2fd3._comment | 39 + ..._647f49ffcaa348660659f9954a59b3ae._comment | 16 + ..._3f7f4b55b7ec2641a70109788e0b5672._comment | 10 + ..._313d393c416495aa0f8573113e41c2f7._comment | 431 + ..._c0e7742672db2629bd906cebefe74f72._comment | 10 + ..._c56171665db3ed14109a09097d49ac5d._comment | 8 + .../unannex_vs_unlock_hook_confusion.mdwn | 15 + doc/bugs/undefined.mdwn | 5 + doc/bugs/unfinished_repos_in_webapp.mdwn | 31 + ..._9628b100e39489be9f28ef75276a7341._comment | 11 + ..._ba0fbff536b1d067c4098db401dc49f2._comment | 10 + ..._fd554aa7d93117177784a29270ccf790._comment | 12 + ...ository_when_using_annex-ignore_true_.mdwn | 25 + doc/bugs/unhappy_without_UTF8_locale.mdwn | 41 + ...d_indirect_don__39__t_work_on_android.mdwn | 23 + ..._fec69c4c41987b9469eaa8f745c0a124._comment | 8 + ..._54c3fa77a069b36d03c41aad08fee9af._comment | 8 + ...t_abort_when_hard_link_creation_fails.mdwn | 47 + .../uninit_does_not_work_in_old_repos.mdwn | 20 + ..._bc0619c6e17139df74639448aa6a0f72._comment | 8 + ...if_git-annex_add_didn__39__t_complete.mdwn | 15 + ..._when_branch_git-annex_is_checked_out.mdwn | 15 + ...ails_silently_with_directory_symlinks.mdwn | 53 + ..._os_x_10.6_-_cp:_illegal_option_--_-_.mdwn | 22 + ..._a634a9f1c023bf836183de64abab1224._comment | 10 + ..._d9ae61a7c3f1eb243ca650945b40f21d._comment | 19 + ..._fe229c03c14e8eb2b57389e0e193ed99._comment | 8 + ..._fa12afe295de63c4aa7eb043b715325a._comment | 15 + ...hen_lock_of_uncommitted_file_loses_it.mdwn | 7 + ...Buffer_containing_an_invalid_argument.mdwn | 87 + ..._004cb3015895ad67386276f3e1f0de0d._comment | 10 + ..._3fe298ebb3ff04d12f2528aa982d7084._comment | 24 + ..._9302536d1577c12337d714fa3a9ea7a1._comment | 10 + ..._c1c8de66192957b7026d99b9ff90589c._comment | 16 + ..._8c2dad766e4115073d49b698919b5ed5._comment | 8 + ..._8da2a73381309ecef4b2796d8f2bb0bb._comment | 10 + ...ed_.git-annex__47____42___directories.mdwn | 16 + ..._9ca2da52f3c8add0276b72d6099516a6._comment | 10 + ..._e14e84b770305893f2fc6e4938359f47._comment | 18 + ..._ec04e306c96fd20ab912aea54a8340aa._comment | 8 + ...rab_archive_content_onto_client_again.mdwn | 434 + ..._51097a6b84edcc607abc0e6e21ca21f2._comment | 8 + ..._c34a4009213c410bba3c147ae0552029._comment | 15 + ..._634542867fd28962c47b7bc3ea022175._comment | 8 + ..._301f3ff2d203ac4c58a037e553b2c14d._comment | 18 + ..._82ecdc88ccc1f87386b128adc4ff9af4._comment | 14 + ..._158b2ba3da815910505899606177d415._comment | 16 + ..._b068924802f3917e3e005350cb0cc2a2._comment | 8 + ..._f4772858c927d4a62edc3caf59b5da10._comment | 8 + ..._d0923d2950357f4444c5ef94ff196ba3._comment | 8 + ..._7fb30cb80aecc60e48c64846aa185206._comment | 9 + ...ploads_queued_to_annex-ignore_remotes.mdwn | 34 + ..._fa1c98f38253db8c2be3604c72eb3726._comment | 17 + ...te_format_generates_irritating_output.mdwn | 28 + ..._fceba878f1097e27f056580e8d6d5b31._comment | 26 + ..._416992874813f120721a56d88b2bef65._comment | 9 + ..._a20f470c5226ac5693eb15146a02b3f5._comment | 8 + ..._a81f06191bc03a7aad5929af99f0634e._comment | 28 + ..._7438caecf78b4fb5d21f9f31dff95cf2._comment | 14 + doc/bugs/utf8.mdwn | 192 + ..._f298b8b480d3ab2dd9c279589afcd0ea._comment | 10 + ..._a8864a46f8154680beeea27449ac6f09._comment | 142 + ..._2202c3479d19d306f31aac5a47b55e7d._comment | 10 + ..._7044d2c5bb1c91ee37eb9868963a1ff2._comment | 41 + ..._656b3caa16ae93b092fb5804fa575a3b._comment | 8 + ..._25b3d4c47c45b72129b17b171a45c5f9._comment | 8 + ..._2aaab9253bbc75012292c7b5a7d55696._comment | 173 + ..._416ad6fb5f7379732129dc5283a7e550._comment | 23 + ..._cd55f6bbeb145fd554f331dcff64f5e1._comment | 10 + ..._bb583a419d6fa4e33e5364c4468b35c6._comment | 8 + ..._cd8a22cfb70d9d21f0a5339ccc52ee93._comment | 14 + ..._14eefd4bee283802e9c462fa20b7835c._comment | 19 + ..._58d8b5bdb9f11e8c344e86a675a075dd._comment | 11 + ..._00fa9672ce55b6bfa885b8a13287ac25._comment | 10 + ..._a01e26fa0fafbc291020f53dbfdf6443._comment | 10 + ..._b7c084be01ce985be51e48503fcba468._comment | 8 + ...st.log_and_remote.log_merge_wackiness.mdwn | 36 + ..._though_the_content_has_the_same_hash.mdwn | 13 + ..._ffc5f79368b8927817e0e35a7a8f057b._comment | 12 + ..._1382b486d198d707db760ae119f33ad1._comment | 8 + ..._3c4074a1d4d7f63f6c07a05ca9717ce8._comment | 8 + ..._deb848e50f6767d8a5f4348137744ec2._comment | 8 + ..._b426c4569b7a788fbf963f787590e051._comment | 10 + ...__34___but_podcasting_feature_working.mdwn | 28 + ..._ce06ba4f65f322362b23797f6190c7c3._comment | 17 + ...rnal_Server_Error__internal_liftAnnex.mdwn | 20 + ..._57547f9a480df2c3f7b3997b0fb7039a._comment | 12 + ..._99f12da3ef01141dc7a9105fcf966793._comment | 10 + ...40__handle_is_closed__41___on_Android.mdwn | 24 + ..._e8866dc15f8fc049229e7451addad1d5._comment | 12 + ..._ee616b0251ffaace9844cfd7af896c35._comment | 10 + ..._6b8bd314b647ea3a485f5faf4856f9a9._comment | 35 + ..._7009b6727ba40bc9bd1b1f939e75d093._comment | 8 + ..._00ddf7ade6cca758afa838be0b9588cb._comment | 20 + ..._6137ef0ad01d5600dab6fccbeed9a88b._comment | 14 + ..._4b79d7ea338d9f70eb80b8cc2c5a21e4._comment | 8 + ...and_on_OSX_--_hangs_with_a_small_repo.mdwn | 41 + ..._63f04694610839db0c2381005b15da35._comment | 14 + ..._8afe4720e301cf7ccf11ff0a23261936._comment | 8 + doc/bugs/watch_command_on_OSX_10.7.mdwn | 37 + doc/bugs/watcher_commits_unlocked_files.mdwn | 37 + ..._f70e1912fde0eee59e208307df06b503._comment | 8 + ...web_app_loops_over_a_non-addable_file.mdwn | 56 + ...ifficult_to_abort_adding_a_repository.mdwn | 24 + doc/bugs/webapp_hang.mdwn | 144 + ..._08aa908a64d0fe2d50438d01545c3f01._comment | 8 + ..._2a21ac5657128a454f9deb77c4d18057._comment | 21 + ..._error_upon_creating_the_initial_repo.mdwn | 26 + ..._1bcf0f565eacac851bd21cd428c8e0a5._comment | 33 + ..._7dd2483b5b07df8f3b37a34651c05962._comment | 8 + ...uires_reload_for_notification_bubbles.mdwn | 41 + ..._b15480e5dec1ffbebb8cde1ca8d7c9d5._comment | 11 + ..._8dad57a852e1db804aa38f90f3bb398b._comment | 8 + ...___34__Added_x_files__34___a_bit_ugly.mdwn | 15 + .../webapp_takes_100__37___of_the_cpu.mdwn | 41 + ..._6312860de9f30cbb05762cd67edc705a._comment | 8 + ...ls_mysteriously_on_newer_repo_layouts.mdwn | 34 + ...ability:_put_the_notices_on_the_right.mdwn | 18 + ..._ec7a444e09a028b5225bd41fb83442e8._comment | 9 + ..._fails_on_android___40__box.com__41__.mdwn | 32 + ..._f57757b4bcc4ace73bf660419d944c33._comment | 8 + doc/bugs/weird_local_clone_confuses.mdwn | 20 + doc/bugs/wget_and_android_4.4.mdwn | 27 + ...nnex_delete_non_annexed_new_git_files.mdwn | 55 + ..._6c9f5fe14e46ac96254426e1e9cff23f._comment | 8 + ..._04dfbf4b1f6b545075d50f43b1d73ef6._comment | 9 + ..._f449f259f076ea1b11bd289bdbcc9339._comment | 13 + ..._78ccd70a17d776f14ea9193ab55c6732._comment | 10 + ..._95fcc19327b57222844302bb81236ee9._comment | 8 + ...lable_both_here_and_in_another_remote.mdwn | 30 + ..._d823b7ee32183fbadd4a49f65e1a3a8b._comment | 8 + ..._f430538101f0ef6114b5e953248fa599._comment | 8 + ...uts_no_informaiton_for_unlocked_files.mdwn | 44 + ..._47bd0fc8d1c65f8a868d9722e66c71db._comment | 10 + ..._fails_test___34__recoverEncode__34__.mdwn | 39 + ..._424b3536e21e02f192f7f2b8e833ed18._comment | 67 + ..._78db183aa401e2023d7faec5f7a4a573._comment | 10 + ..._ed2da19eaf0bd0864f6b28816a79bc23._comment | 8 + doc/bugs/windows_install_failure.mdwn | 30 + ..._f339574c7cfa35c1f0dfd515fde457f5._comment | 8 + ..._1d3364d8f5c4963f3a7e473298ec6ed1._comment | 8 + ...rt_-_can__39__t_directly_access_files.mdwn | 250 + ..._03ef9d33839173044dcc4f2b37f575d2._comment | 8 + ..._c65e5491c82908af46fe2c97e048d210._comment | 20 + ...when_adding_17_files_at_once_or_more_.mdwn | 197 + ...po_can__39__t_pull_newly_added_files_.mdwn | 559 + ..._b4f5e2d6a0d690f6b0089fa80a3c920b._comment | 8 + ..._c2092add1430667108a3fdc5e1c9b5f5._comment | 8 + ..._f0ea453951daf84dbddc653ac64822b6._comment | 8 + ..._35a8be5ecc9d1b72c38f8ddb47678160._comment | 8 + ..._29e72997b88f91f84639587b4cede34c._comment | 76 + ..._2de7f6532de4cbc21737ce53a89d6525._comment | 10 + ..._80d130b5af829763be77c61a9c5ca306._comment | 29 + ..._ec199db851952b40e8b18922da574ea4._comment | 8 + ..._d269fcadea9d5a668e3c6d6cf019f56a._comment | 353 + ..._908d1b981d56107f29d8972bf11aefc8._comment | 12 + ...__.config__47__git-annex__47__program.mdwn | 20 + ..._44c11918d00ead38d40556aade98c0af._comment | 12 + doc/bugs/xdg-user-dir_error.mdwn | 8 + ...s_one_account_per_distinct_repository.mdwn | 107 + ..._820732c4dcb15186b4f635c50fdb0805._comment | 19 + ...sod-default_is_needed_as_a_dependancy.mdwn | 10 + doc/bugs/yesod-form_missing.mdwn | 23 + ...tube_support_suddenly_stopped_working.mdwn | 62 + doc/builds.mdwn | 20 + doc/coding_style.mdwn | 92 + doc/comments.mdwn | 9 + doc/contact.mdwn | 11 + ..._12d60f767d90bea94974e1ff6b206d31._comment | 8 + ..._95b6d868b913418de50ba121d71d2390._comment | 10 + ..._2cf43bd406673294e6cdbd785c4a0d0c._comment | 16 + ..._586a506e27379d74fbc0f4b654e89c7d._comment | 10 + doc/copies.mdwn | 35 + ..._af9bee33777fb8a187b714fc8c5fb11d._comment | 8 + doc/design.mdwn | 6 + doc/design/assistant.mdwn | 45 + doc/design/assistant/OSX.mdwn | 13 + ..._9290f6e6f265e906b08631224392b7bf._comment | 14 + doc/design/assistant/android.mdwn | 42 + ..._316bde8d22628e5e9d4f8dabce1d2ad4._comment | 14 + ..._8be9a74e5fc4641c2bf2e1bb7673dd59._comment | 8 + ..._3dd386ac1b757c73d14f14377b9eedd4._comment | 8 + ..._5dca47a4599d6e88d19193701c5a571b._comment | 46 + ..._054f06311e2b51d73be569f181eb004f._comment | 10 + ..._bb3d36e9d29f2fa77bee6d47ef9917fe._comment | 21 + ..._fee32a831eeb5736fe1dce52e30320c8._comment | 16 + ..._d8e9b0a5287fc96b19dc2cb9da3586ce._comment | 17 + ..._79a7b5bb5f4aaeea4a4e8ced0561701a._comment | 11 + ..._55ea70a6929523d26248ff6409b04a6e._comment | 10 + doc/design/assistant/blog.mdwn | 11 + .../blog/day_100__cursed_clouds.mdwn | 19 + .../day_102__very_high_level_programming.mdwn | 37 + ..._c028b403261dd66bcf83e6ffd134b80b._comment | 8 + .../assistant/blog/day_103__bugfix_day.mdwn | 25 + doc/design/assistant/blog/day_104__misc.mdwn | 18 + ..._13d7fad2d3f8eab10314784c035e2a16._comment | 8 + .../assistant/blog/day_105__lazy_Sunday.mdwn | 43 + .../assistant/blog/day_106__lazy_Monday.mdwn | 10 + .../assistant/blog/day_107__memory_leak.mdwn | 11 + .../day_108__another_zombie_outbreak.mdwn | 33 + ..._194c48d65993462f809a2cfaa774a3e2._comment | 11 + ..._ef5ee5933fcadcb81cc81b816db14bda._comment | 8 + .../assistant/blog/day_109__dropping.mdwn | 16 + doc/design/assistant/blog/day_10__lsof.mdwn | 54 + ..._9b8c28c85c979f32e5c295b6a03c048e._comment | 9 + .../blog/day_110__more_dropping.mdwn | 55 + .../blog/day_111__config_monitor.mdwn | 18 + ...ow_for_something_completely_different.mdwn | 50 + ..._5e4fe1538d9ae1c450b0a6602fc6d29b._comment | 10 + ..._c5a734f611ecc95729904e645583ee43._comment | 8 + ..._46b16dcd0fce07036cd8ed6ed9d2b055._comment | 8 + ..._1fe036e4c65fb4211aa2c394f535344a._comment | 8 + ..._e4ba3568c4efd98f212dd47427a1cf47._comment | 10 + .../blog/day_113__notifier_work.mdwn | 22 + doc/design/assistant/blog/day_114__xmpp.mdwn | 56 + ..._c2b0617a2fc3dc4f19a6be6947913842._comment | 8 + ..._d14375dfb5791615802dab3c5438f8e2._comment | 8 + ..._6d72ea32c111e605be30ad2153fc71c9._comment | 10 + ..._e51d6f854db5f9e74a1aa58bd8923795._comment | 12 + .../assistant/blog/day_115__my_new_form.mdwn | 17 + .../assistant/blog/day_116__the_segfault.mdwn | 25 + .../blog/day_117__new_topologies.mdwn | 41 + .../blog/day_118__monadic_discontinuity.mdwn | 15 + .../blog/day_119__time_for_testing.mdwn | 12 + .../assistant/blog/day_11__freebsd.mdwn | 50 + .../assistant/blog/day_120__test_day.mdwn | 2 + .../assistant/blog/day_121__buddy_list.mdwn | 10 + .../assistant/blog/day_122__xmpp_pairing.mdwn | 29 + ..._e95efb23eb2e67e3f11a5c7de56424a7._comment | 10 + ..._30e251e73146512bde8b2f69eddeef2e._comment | 8 + .../blog/day_123__xmpp_insanity.mdwn | 49 + ...ay_124__git_push_over_xmpp_groundwork.mdwn | 28 + .../blog/day_125__xmpp_push_continues.mdwn | 15 + .../blog/day_126__mr_watson_come_here.mdwn | 52 + ..._ee1361e6b235f4e1c00596ba516b519a._comment | 10 + ..._8eb366ae7efb347bd3bbd9a98e0821b3._comment | 8 + .../assistant/blog/day_127__xmpp_syncs.mdwn | 35 + .../blog/day_128__last_xmpp_day.mdwn | 49 + ..._fd8c1d6358cb50f4dad8ba11d33d861f._comment | 10 + ..._43664b73c71c41d71bc95e665f128106._comment | 8 + ..._d369b04f686009a9dbb57b999107a55e._comment | 11 + ..._095855d301e7ccd3689ffe507cfb63ee._comment | 8 + ..._da7b0586b0b28e1e0fe4126f6543a7bc._comment | 9 + ..._2f9ba367e19d77bf52f372b6f0f5938a._comment | 8 + .../assistant/blog/day_129__release.mdwn | 4 + .../assistant/blog/day_12__freebsd_redux.mdwn | 23 + ..._5da32cf53f1de27bfe6cec2d294db3e1._comment | 8 + ..._696d6e22034acf5bb60d80124b72ef2f._comment | 8 + .../assistant/blog/day_130__what_now.mdwn | 36 + ..._402f00cc034351d8253a797dd4de55bf._comment | 8 + .../blog/day_131__webdav_groundwork.mdwn | 28 + .../blog/day_132__webdav_continued.mdwn | 22 + .../blog/day_133__webdav_working.mdwn | 31 + .../blog/day_134__box.com_configurator.mdwn | 8 + .../blog/day_135__progress_revisited.mdwn | 37 + doc/design/assistant/blog/day_136__misc.mdwn | 14 + .../assistant/blog/day_137__Glacier.mdwn | 30 + doc/design/assistant/blog/day_138__back.mdwn | 25 + ..._65a8499b284bed38d2bde1886a54a311._comment | 8 + .../assistant/blog/day_139__catch_up.mdwn | 11 + .../blog/day_13__kqueue_continued.mdwn | 34 + .../blog/day_140__release_monday.mdwn | 25 + .../blog/day_141__release_tuesday.mdwn | 6 + ..._a5adea7a726df12f9121c744a036f08d._comment | 10 + .../assistant/blog/day_142__filling_in.mdwn | 9 + .../assistant/blog/day_143__what_next.mdwn | 22 + ..._40cf25a2ebdd43d8974a28e180e100e5._comment | 13 + ..._af9ccbbc5131e6333c029415141bdb51._comment | 10 + .../assistant/blog/day_144__webapp_work.mdwn | 8 + .../blog/day_145__more_webapp_work.mdwn | 12 + .../assistant/blog/day_146__meanwhile.mdwn | 22 + .../assistant/blog/day_147__direct_mode.mdwn | 36 + ..._0bd69532afce9dc04e3d88bfd0aed4b2._comment | 16 + ..._3b26f0d081c3bf1037bb872d529ce825._comment | 8 + .../assistant/blog/day_148__direct_mode.mdwn | 42 + .../assistant/blog/day_149__rainy_day.mdwn | 15 + .../blog/day_14__kqueue_kqueue_kqueue.mdwn | 23 + .../blog/day_14__thinking_about_syncing.mdwn | 44 + doc/design/assistant/blog/day_150__12:12.mdwn | 53 + .../blog/day_151__direct_mode_toggle.mdwn | 59 + .../assistant/blog/day_152__bugfixes.mdwn | 18 + ..._46863a875f9daa6f2c9248b66ff91929._comment | 9 + ..._a586e617bc024c8a9ff60f1b8345d74d._comment | 8 + .../assistant/blog/day_153__hibernation.mdwn | 26 + .../blog/day_154__direct_mode_merging.mdwn | 21 + .../assistant/blog/day_155__bugfixes.mdwn | 15 + ...ay_156_and_157__direct_mode_assistant.mdwn | 45 + .../assistant/blog/day_158__fsevents.mdwn | 20 + ..._b278372ac6399f64d5fa9da178278a6d._comment | 8 + ..._2d5ce9b2807068c3517e185945662bd2._comment | 8 + .../blog/day_159__fsevents_and_assistant.mdwn | 16 + ..._b85f446c3fa8d703a2a8882825c6f33f._comment | 8 + ..._a150b404e0c39e0bb2f7dd00cda63cdc._comment | 8 + ..._37abc41bae23a1d7de0d19d952aec492._comment | 8 + .../assistant/blog/day_15__its_aliiive.mdwn | 33 + .../day_160__finishing_up_direct_mode.mdwn | 10 + .../assistant/blog/day_161__release_day.mdwn | 8 + ..._e82c67f3ce216618149537bba1e0b850._comment | 19 + ..._b1fe96fd818935c0497b78bb8ad32ffa._comment | 14 + ..._40bac0e1756aa77bb966c4654857141c._comment | 44 + ..._af65656b0d1179636937595868bb97b0._comment | 30 + ..._0c05caaaf9588e124585041bf5f45d75._comment | 20 + ..._5dfb5f428633d6062925f61af2b8829b._comment | 23 + ..._ac4effb381b08d94d4a2d2482e92c89a._comment | 13 + ..._32600e89e3098e52a1280895e03b3f86._comment | 13 + ..._07e5d0c3cad0ce2bd4943e53b61f1767._comment | 8 + doc/design/assistant/blog/day_162__UI.mdwn | 17 + .../blog/day_163__free_features.mdwn | 32 + .../assistant/blog/day_164__bugfixes.mdwn | 17 + .../assistant/blog/day_165__release_day.mdwn | 16 + .../blog/day_166__a_short_long_day.mdwn | 25 + .../day_167__safe_direct_mode_transfers.mdwn | 12 + ..._f1aa64fe803d8c14b250a4e98b88142a._comment | 8 + ..._5ce1db84c9ead713f1272c4975645b93._comment | 8 + .../blog/day_168__back_to_theme.mdwn | 18 + ..._f248780bfcbd0384d9d72c2633a4ea46._comment | 12 + ..._5beba073373b8e75a32d1fcfdc1a0782._comment | 13 + .../blog/day_169__direct_mode_is_safe.mdwn | 24 + ..._65f87656c4e6bc7cdb614f53961341c9._comment | 8 + ..._a116a402a126c62be54c06afd82439ab._comment | 19 + .../blog/day_16__more_robust_syncing.mdwn | 44 + ..._23e7a90429e4431f90787cd016ebe188._comment | 8 + ..._8e7e7cd27791bb47625e60a284e9c802._comment | 10 + .../blog/day_170__bugfixes_and_release.mdwn | 8 + doc/design/assistant/blog/day_171__logs.mdwn | 23 + .../assistant/blog/day_172__short_day.mdwn | 22 + ..._b75e26b77a23a45da1c4c3bca1399246._comment | 12 + .../assistant/blog/day_173__snow_day.mdwn | 22 + .../blog/day_174__last_weekend_before_AU.mdwn | 25 + ..._05a8fd47f54373331741cc869a53b0c3._comment | 10 + ..._fc8e65eef954c4caa8321c2fe8b711b7._comment | 8 + ..._399534f540d85cac067fbb7be9d373b4._comment | 8 + .../blog/day_175__pacific_features.mdwn | 15 + ..._c3ee4386f872b7c76aaecfa638b368cb._comment | 9 + .../blog/day_176__thread_management.mdwn | 13 + .../assistant/blog/day_178__bus_hacking.mdwn | 10 + .../blog/day_179__brief_updates.mdwn | 19 + ..._920a84457d40358507a3eb817a4568d9._comment | 8 + .../blog/day_17__push_queue_prune.mdwn | 19 + doc/design/assistant/blog/day_180__back.mdwn | 7 + .../assistant/blog/day_181__triage.mdwn | 23 + .../assistant/blog/day_182__it_begins.mdwn | 50 + .../assistant/blog/day_183__plan_b.mdwn | 19 + .../day_184__just_wanna_run_something.mdwn | 46 + ..._689adac7e26cb0b0a4e7ecc787cfd716._comment | 16 + .../blog/day_185__android_liftoff.mdwn | 20 + ..._b7d28010a72619a7e9a5ad4f2a0d6c07._comment | 9 + ..._ddeb24e86fafb7dae93142cc02767aad._comment | 10 + .../blog/day_186__Android_success.mdwn | 33 + ..._1629da240ca7db5f8a32059f561fd435._comment | 8 + .../blog/day_187__porting_utilities.mdwn | 22 + ..._0e6a3f4fe8e09f247fa04156bc60f8c7._comment | 8 + .../day_188__crippled_filesystem_support.mdwn | 37 + ..._32a296fce23ae4b1e18bd5a9964bf619._comment | 14 + .../blog/day_189__more_crippling.mdwn | 44 + .../assistant/blog/day_18__merging.mdwn | 82 + ..._7a553ad559519f3b3e3cd20115b4c44e._comment | 15 + .../assistant/blog/day_190-191__weekend.mdwn | 28 + ..._dbd692d12c14d08acd7d73a655b34e8b._comment | 10 + ..._c813830e53471a9732e010a748d574fc._comment | 28 + .../blog/day_192_193__more_porting.mdwn | 44 + .../assistant/blog/day_194__nice_moment.mdwn | 37 + .../blog/day_195__real_android_app.mdwn | 32 + ..._0112007552b30cd9bfeac614a1e399c4._comment | 10 + ..._230d3c169c713f613b9d607d84ce5092._comment | 12 + ..._8d74ad2a61c02272758d157282ad56ec._comment | 10 + ..._4f6bc0680f2debd638933968a26975e0._comment | 10 + ..._71539c62608866464e8faa76bc522a55._comment | 9 + ..._e1b205289721ae79ac7fbed2f44018b2._comment | 10 + ..._4bc0aeae4fa1116944644c64feaf9697._comment | 8 + ..._17bb6e7565d4c757f6c1e3514c22f47d._comment | 10 + ..._cd8a6bec0f7c6843dd11d3266f25f864._comment | 44 + ..._2d2eee4bcbbd1d069a80bff5edc90c3c._comment | 13 + ..._3d96568c469a8c53a982f304eae5e7d4._comment | 10 + ..._e8667c47d07fc842cf0fe2ebbfbc1c58._comment | 8 + ..._cf8da7720ddc20b05955ee671ca4acd5._comment | 8 + ..._f4709bdbc739182819b648fd6aa00531._comment | 36 + ..._e66af12c7eca0d457b8406e9fb4b69be._comment | 8 + .../blog/day_196__android_bugfixes.mdwn | 26 + .../blog/day_197__template_haskell.mdwn | 36 + ..._82d9f9508929d84abf7b718c59436ae8._comment | 18 + .../assistant/blog/day_198__bugfixes.mdwn | 11 + ..._5a15b5bad0f9ba2423d2aebe440ac0ea._comment | 19 + ..._36d94b838e5e65c85e7afaabe8a578f1._comment | 12 + ..._ae9b74341a3bc6e1e84d2c0ca4c5f612._comment | 10 + ..._5a4827227c03bcff3b1e4c44b531f816._comment | 12 + ..._9c5f4c85217e898be4c57c615e53c36f._comment | 8 + ..._bccf1abfb7f56d97673158f3ccfce511._comment | 9 + ..._6f1b51b002cc5d2b505d80e3e04bf6f3._comment | 8 + ..._8a3542437663028b17442818eba3f7c5._comment | 9 + .../day_199__wrapping_up_Android_for_now.mdwn | 26 + ..._ec57358afc7e78d2860aa4237793832d._comment | 11 + .../blog/day_19__random_improvements.mdwn | 50 + doc/design/assistant/blog/day_1__inotify.mdwn | 57 + .../assistant/blog/day_200__release_day.mdwn | 19 + ..._40cfe9bfd9e611fd734dbb5aad348aa3._comment | 10 + ..._b26890fdae575d42170988073fb2e45d._comment | 8 + ..._710a30c5d31bf549833ecfe9a0997c94._comment | 8 + ..._b6f62ab7e810ba6d3a43f0ead370c79a._comment | 8 + ..._a68e1ed7829b49086c567d97ddc09912._comment | 8 + ..._39d3ad0a029fe56e96f97d28d17fbbd2._comment | 8 + ..._5b752d6a8d74e61190f09384b6108206._comment | 31 + ..._881274ae0d6230bb4cafa4151ad72b49._comment | 12 + ..._e220059be77cf0ef396f37a4f9ccf9b5._comment | 8 + ..._ec2152151188dd252cdb61c68cfc12e4._comment | 10 + ..._42572411617c287368482bb9dcf94324._comment | 18 + ..._6b69aa81a9ba4e07e547ed1869946d51._comment | 15 + ..._b070a2e4151d9fbf43d7906efa78515f._comment | 12 + .../blog/day_201__real_Android_wrapup.mdwn | 38 + ..._88b9950c51324f0bb89c5646b3170952._comment | 19 + .../blog/day_201__real_Android_wrapup/fib.png | Bin 0 -> 69535 bytes .../blog/day_201__working_web_server.mdwn | 31 + .../blog/day_203__procrastination.mdwn | 25 + .../blog/day_204__deprocrastination.mdwn | 62 + .../day_205_206__rainy_day__snow_day.mdwn | 12 + doc/design/assistant/blog/day_207__XMPP.mdwn | 7 + .../assistant/blog/day_208__bugfixes.mdwn | 17 + .../assistant/blog/day_209__The_Bug.mdwn | 23 + .../blog/day_20__data_transfer_design.mdwn | 22 + .../assistant/blog/day_210__spring.mdwn | 29 + .../blog/day_211__zooming_along.mdwn | 24 + .../blog/day_212__accidental_all_nighter.mdwn | 24 + ..._6ee1f8056eedb6eb18013faf8f5ec212._comment | 8 + ..._07c83d75bb105bb77ada07359ed0ea7a._comment | 8 + ..._2c904d33f4f14807fbe718a01e98800a._comment | 8 + ..._59ec5c1cab75df87293800a7a03fe9c6._comment | 8 + ..._13893f106e835dcc52e03c7c6740c35b._comment | 8 + doc/design/assistant/blog/day_213__costs.mdwn | 34 + .../assistant/blog/day_214__release_day.mdwn | 5 + .../blog/day_215__dashboard_UI_refresh.mdwn | 25 + .../blog/day_216__more_bugfixes.mdwn | 42 + ..._299462bcdd0e4f6cd7895b5f40ca00ad._comment | 10 + ..._1913d65dfe4ba08379d82a4a2ca91c40._comment | 8 + ..._92c774599a78540ad398afcd1d05f7ce._comment | 20 + .../assistant/blog/day_217__nothing.mdwn | 2 + .../assistant/blog/day_219__bug_triage.mdwn | 14 + ..._c6b977a969cacdce62987a439b7686f5._comment | 16 + .../blog/day_21__transfer_tracking.mdwn | 28 + .../assistant/blog/day_220__performance.mdwn | 40 + .../blog/day_221__this_and_that.mdwn | 28 + doc/design/assistant/blog/day_222__back.mdwn | 16 + ..._f05b48231a1ee0cffba7d66e112e5551._comment | 8 + ..._4d5f003ccd81580017ebf0dc31bc9cda._comment | 8 + .../blog/day_223__progress_revisited.mdwn | 24 + .../blog/day_224__annex.largefiles.mdwn | 23 + ..._408e4021b18f7ff5548d2d19ab558922._comment | 8 + ..._b24d1da2bc4307ded0216daffb8f9336._comment | 8 + .../blog/day_225__back_from_the_dead.mdwn | 47 + ..._9ac37c3b5c4c72ec8a39dce00bcbe420._comment | 8 + ..._26125dd9ef2bd10b597d14b2c6180952._comment | 8 + .../assistant/blog/day_226__poll_results.mdwn | 28 + ..._1ed980472214be6d0a8cf55f37797fda._comment | 8 + ..._6823b0a9a8037f1a5214db4db98fb16e._comment | 8 + .../day_227__bigfixing_all_day_today.mdwn | 21 + ...228__more_work_on_repository_removals.mdwn | 27 + .../blog/day_229__rainy_day_bugfixes.mdwn | 17 + .../day_22__horrible_option_parsing_hack.mdwn | 34 + doc/design/assistant/blog/day_230__Mom.mdwn | 35 + ..._696bba2246c8a9e6ce4aed3071bcc96c._comment | 8 + ..._2fa295ab6db0828cb725cfcfb6777822._comment | 8 + ..._fafd7abec629290418334ddb015bf62c._comment | 10 + ..._450cac0f2e82c94fd34b527ae05ef1b8._comment | 8 + .../assistant/blog/day_231__insert_title.mdwn | 26 + .../blog/day_232__headless_webapp.mdwn | 22 + ..._0fdd77d143ecba6fdb9f75cb6fc37bfb._comment | 16 + ..._0784a2a73c3e2945f3d3f2577b3b9c9c._comment | 8 + ..._ccb9fa22422fb913b6a496ebe65c49fb._comment | 8 + ..._ceba4468760a2525960327698431cee2._comment | 8 + doc/design/assistant/blog/day_233__taxes.mdwn | 11 + ..._9473ffdc42595af9c293fbcd5a1cdb54._comment | 14 + ..._5feed8d7053ba03812ccda8c61fd9775._comment | 8 + .../blog/day_234__clean_shutdown.mdwn | 29 + .../assistant/blog/day_235__birthday.mdwn | 31 + ..._db558b071067c1e63cde05cca0551094._comment | 8 + ..._d1a2c1124781118267599457ae9e0512._comment | 8 + ..._b853508d1d15234958b9f4a39277e45c._comment | 8 + ..._73aad3398a43bc4d28bca9bf635fa757._comment | 8 + .../assistant/blog/day_236__evil_splicer.mdwn | 29 + .../day_237__gnome-keyring_craziness.mdwn | 29 + ..._0cb088b732881d1fa92493aa1fd93d43._comment | 8 + ..._b855fd710954beebaafe6d2bd03eb368._comment | 8 + .../blog/day_238__back_to_Android.mdwn | 11 + .../day_239__bugfixes_and_frustration.mdwn | 28 + .../blog/day_23__transfer_watching.mdwn | 25 + .../assistant/blog/day_240__it_builds.mdwn | 37 + ..._151840ae0020ea63b2f041488c905386._comment | 25 + .../assistant/blog/day_241__cleanup.mdwn | 14 + ..._0e283cdf66a25b3cc9423fe651084cb9._comment | 8 + .../assistant/blog/day_242__more_porting.mdwn | 4 + .../assistant/blog/day_243__in_the_field.mdwn | 21 + .../blog/day_244__android_porting.mdwn | 6 + doc/design/assistant/blog/day_245__misc.mdwn | 15 + ..._3a2976617bb0cdc206fb1397a2ef1177._comment | 8 + ..._e0f9704e91fedca8ff26356f354cc1c3._comment | 10 + ..._93003a0d0983efbdc046d7459be194b0._comment | 8 + .../blog/day_246__bug_treadmill.mdwn | 18 + ..._f76f653364fe2b97e85e8356c93b0fce._comment | 8 + .../blog/day_247__performance_tuning.mdwn | 16 + .../blog/day_248__Internet_Archive.mdwn | 28 + .../assistant/blog/day_249__quiet_day.mdwn | 7 + .../blog/day_24__airport_digressions.mdwn | 99 + .../assistant/blog/day_250__stymied.mdwn | 23 + ..._330a10d447ccc3db03fcbfe571dbb404._comment | 8 + .../blog/day_251__xmpp_improvements.mdwn | 34 + .../assistant/blog/day_252__release_day.mdwn | 6 + doc/design/assistant/blog/day_253__OMG.mdwn | 22 + ..._bbdc61092771163e65a90a4755a807d8._comment | 8 + .../blog/day_254__Android_app_polishing.mdwn | 35 + ..._37f4ff5227566ce4b3fa69fc32568841._comment | 14 + ..._58bbb105bdbb72bba85c3622195f43b9._comment | 12 + .../blog/day_255__Debian_release_day.mdwn | 26 + doc/design/assistant/blog/day_256__8bit.mdwn | 27 + ..._f9b50263e3997d4c5b9836a2e0a346d7._comment | 8 + .../assistant/blog/day_257__rainy_day.mdwn | 6 + .../blog/day_258__beginning_of_the_end.mdwn | 24 + .../day_259__Android_dominos_toppling.mdwn | 15 + ..._0b4a6e4893b0157e4768b46468dbbb87._comment | 10 + ..._1ebc5aff5d217e1392cb7c8bb6c5156b._comment | 14 + ..._eed7792f6142f3fc74d3c384bb16559b._comment | 8 + .../blog/day_25__transfer_queueing.mdwn | 41 + ..._59fd4f1ffe96c412f613dc86276e7dbd._comment | 10 + ..._93bf768a67117e873af5732ecf08dc78._comment | 7 + .../day_260__Windows_dev_environment.mdwn | 46 + ...day_261__Windows_first_stage_complete.mdwn | 29 + .../blog/day_262__DOS_path_separators.mdwn | 14 + ..._45ecae90b22e31202c21083980d6b567._comment | 10 + .../assistant/blog/day_263_catching_up.mdwn | 11 + ..._9023da0573dfc81644d68128adb331a7._comment | 8 + ...ay_264__Windows_second_stage_complete.mdwn | 21 + ..._42a7502d6ece75520eb59a76fdb1e2f0._comment | 9 + ..._f2b11322ac87e2a36cddc035b2c3c1ea._comment | 8 + ..._ea6ee05acb946fc7e8d95e62647cfa2a._comment | 8 + ..._9ce106baf28b7f75f7f6febd7bfcea70._comment | 8 + .../assistant/blog/day_265__correctness.mdwn | 23 + ..._e8959a6df87eb92310947e66c7471e97._comment | 12 + ..._0cb953fcc085eedb34e65c227309ede7._comment | 8 + ..._df57628a8969af2995732e7ea2a0fae3._comment | 10 + .../assistant/blog/day_266__release_day.mdwn | 6 + ..._92c8d1d9216b46b07dfe69bbc77a923e._comment | 8 + .../blog/day_267__windows_autobuilder.mdwn | 9 + ..._978b584d86395f2f621b0e1f7c5e70d7._comment | 21 + ..._8f978d2811c8fbf11e3d12f245bdb52b._comment | 10 + .../blog/day_268__core_monad_change.mdwn | 9 + .../assistant/blog/day_269__bugfixes.mdwn | 14 + .../assistant/blog/day_26__dying_drives.mdwn | 28 + .../blog/day_270__release_and_xmpp.mdwn | 39 + .../assistant/blog/day_271__more_xmpp.mdwn | 31 + .../assistant/blog/day_272__fuzz_tester.mdwn | 37 + .../assistant/blog/day_273-274__fun.mdwn | 19 + .../blog/day_275__working_hard_or.mdwn | 12 + .../blog/day_276__fuzzing_continues.mdwn | 12 + ..._f5dd0658511a1063c2eb025b0fe98426._comment | 14 + ..._a56c4c26a9e7bb8cfe3f598dbeed0813._comment | 10 + ...ay_277__private_static_protected_void.mdwn | 19 + .../assistant/blog/day_278__winding_down.mdwn | 11 + .../blog/day_279__final_release_prep.mdwn | 14 + .../blog/day_27__robust_transfers.mdwn | 31 + .../day_28-35__threaded_runtime_tarpit.mdwn | 17 + doc/design/assistant/blog/day_280__yesod.mdwn | 7 + ..._a42213a8cef71f2b54db18606028136d._comment | 8 + doc/design/assistant/blog/day_281__back.mdwn | 37 + ..._128809c5a2a9f5cc345a10fdbf55be01._comment | 8 + ..._6d0bbdf6ebaff9da399804570f0e606d._comment | 10 + .../blog/day_282-283__caught_up.mdwn | 18 + .../assistant/blog/day_284__porting.mdwn | 13 + ...285__fixed_the_archive_directory_loop.mdwn | 23 + ..._1065e756dc6d66aefd214eb8ac5ebe1d._comment | 25 + .../blog/day_286__Windows_test_suite.mdwn | 19 + .../assistant/blog/day_287__niceness.mdwn | 13 + .../blog/day_288__success_stories.mdwn | 32 + ..._9ddf57b8ae0241268bb33bec1b169e4c._comment | 20 + ..._50b8a597bd8677608f2ef176443f23f3._comment | 10 + ..._f2df427cf3608377e9a52d8bdeadb26f._comment | 21 + ..._8762efed97f21eeba8f0a7be45bd924a._comment | 35 + ..._55e1bb15c3a93d582d110f8173ceefc2._comment | 9 + ..._5749aef8b585b293385b20b75c40f9d8._comment | 31 + ..._911c6d2764906cad7d6324835441ed34._comment | 12 + ..._eb6aa8af5aa70877255a11d132d51aba._comment | 10 + ..._9a57de4cea407a73b2d023d85afdccc6._comment | 12 + ..._1767c86067bee35941004282b96b8e95._comment | 10 + ..._22b28ca3d4d3283ad8c21ae052fb9752._comment | 11 + ..._1d47f3e1b9f0081649cedae4288bac83._comment | 8 + ..._31d3f58cad83cb1ecc4821a15ca258d8._comment | 14 + ..._b512bd2bf29dfaab6b36bf204518fdb6._comment | 8 + ..._343333356de20e170edb8020faa7400d._comment | 10 + ..._4e4034bec789543b562ac263df3e21dd._comment | 15 + ..._0c52794c77a9b7afc5112f5edf9cb793._comment | 8 + ..._7ca419aa3a187857b19268572d5df297._comment | 18 + ..._3edd56b3b04f19faba8d75cca285a662._comment | 10 + ..._146331ae2de25a6dc3595dffab9514de._comment | 12 + ..._72be9307e75eb120451f3d6ab7c8165e._comment | 8 + ..._c27eb0a4181e85a3eed41130402350bf._comment | 12 + .../blog/day_289__back_in_the_swing.mdwn | 16 + .../blog/day_290__https_release.mdwn | 17 + doc/design/assistant/blog/day_291__--all.mdwn | 32 + ..._eaa9fef19a035bef9c439e87d47c834b._comment | 17 + ..._90bbc26bf92048de7cbaf5fb719c9593._comment | 11 + ..._75006e9909425dcbf86415a9f7c90372._comment | 10 + ..._5440449bbc5a353f7430f72e19c35e92._comment | 8 + .../assistant/blog/day_292__bugfixes.mdwn | 24 + ..._bbac3878d80f7540d229183c56664784._comment | 8 + ..._8c9e5291ceb257f3a938af0ad967c5d7._comment | 10 + ..._02f875e8edd30f47939249f16d92712b._comment | 8 + .../assistant/blog/day_293__gpg_builds.mdwn | 32 + ..._4f152de8ea5aca4ec381d439e2a821f7._comment | 12 + ..._42f625638638bc875379f6c604d6f673._comment | 8 + .../assistant/blog/day_294__release_day.mdwn | 7 + .../blog/day_295__balls_in_the_air.mdwn | 13 + .../day_296__new_crowdfunding_campaign.mdwn | 41 + ..._cccad1a5103c504d21d0f8e69bb39e1b._comment | 8 + ..._4fef7bd9c8e15cd57df365fadb95717f._comment | 8 + ..._0b9258a1f5079e53c60138f06d0c63b1._comment | 8 + ..._46183b97ca904bc06e46569c30db2edc._comment | 8 + .../assistant/blog/day_297__back_to_work.mdwn | 16 + ..._e300feb821bfe7b76b2cec4376d16ffa._comment | 8 + .../assistant/blog/day_298__exceptional.mdwn | 21 + .../assistant/blog/day_299__bugfixing.mdwn | 8 + doc/design/assistant/blog/day_2__races.mdwn | 45 + .../assistant/blog/day_300__new_logo.mdwn | 36 + ..._9fc64e33863b9fce00f6a03417a91e36._comment | 9 + ..._e8aac0298f90004e81492d2c7f85eda0._comment | 8 + ..._6308c767f6e4bf090102191c91520d04._comment | 8 + .../blog/day_301__direct_unannex.mdwn | 21 + .../assistant/blog/day_302_release_day.mdwn | 6 + ..._fe6e572ba706e95188463d9f3e004d03._comment | 17 + doc/design/assistant/blog/day_303__oops.mdwn | 8 + .../blog/day_304__dropunused_safety.mdwn | 28 + ..._1bbcf6c74b6437c44ff8604401fb1432._comment | 10 + .../blog/day_305__interesting_bugs.mdwn | 21 + .../assistant/blog/day_306__offtopic.mdwn | 2 + .../assistant/blog/day_307__buuuugs.mdwn | 31 + .../assistant/blog/day_308__ssh-agent.mdwn | 16 + ..._5f0fc810cf1e1cd9b3ddba3cd19bb19d._comment | 12 + .../assistant/blog/day_309__filenames.mdwn | 17 + .../assistant/blog/day_310__release_day.mdwn | 18 + ..._1e008583cebd8e373e83729529914db7._comment | 8 + .../blog/day_311__Windows_porting.mdwn | 10 + ..._8e738f54a72557bee1e19970472b925c._comment | 8 + .../blog/day_312__DebConf_midpoint.mdwn | 30 + doc/design/assistant/blog/day_313__back.mdwn | 34 + ..._fbf3fdf9688c18156753d446facd942d._comment | 10 + doc/design/assistant/blog/day_314__quvi.mdwn | 27 + ..._3fdfb0742cb5422530ddd97b904f2a42._comment | 8 + .../assistant/blog/day_315__backlog.mdwn | 12 + .../assistant/blog/day_316__day_off.mdwn | 6 + doc/design/assistant/blog/day_317__misc.mdwn | 17 + .../blog/day_36__minimal_test_case.mdwn | 9 + doc/design/assistant/blog/day_37__back.mdwn | 64 + .../blog/day_39__twice_is_enemy_action.mdwn | 66 + .../assistant/blog/day_3__more_races.mdwn | 26 + ..._d6015338f602b574a3805de5481fc45e._comment | 8 + ..._4d6b23fc6442e0ee0303523cb69d0fba._comment | 8 + ..._03f5b2344c2a47dea60086f217d60f9b._comment | 14 + ..._860e90e989ec022100001c65e353a91e._comment | 8 + doc/design/assistant/blog/day_40__dbus.mdwn | 100 + ..._43ed2a79629868b018ec9f54a32bcacc._comment | 12 + ..._6799f2baf6a6ce14b1fa76a8402840c0._comment | 10 + ..._fa1d7444bdafcb990cacf2ace7ee6ef1._comment | 10 + ..._3399ddad951c1a950281bb6941fc3f6f._comment | 8 + ..._40b6b9d741d3081203f0cc94eb8dc3ea._comment | 12 + doc/design/assistant/blog/day_41__foo.mdwn | 46 + ..._ace21fa257a4c2fd412b6ff2944a23e8._comment | 10 + .../assistant/blog/day_42__the_answer.mdwn | 27 + .../blog/day_43__simple_scanner.mdwn | 37 + .../assistant/blog/day_44__webapp_basics.mdwn | 83 + ..._d5fb67f373038e9f583cb2e1992bef67._comment | 18 + .../assistant/blog/day_45__long_polling.mdwn | 66 + ..._994bec0978324e268666073e8ff4f6ae._comment | 8 + ..._dfa164c86290899139491acccddd8b2b._comment | 10 + ..._5526c9dd4fd87da56cb8456083169f55._comment | 8 + ..._91630f5bf162dfd4fbb3920f1318535b._comment | 8 + ..._b3e41ba77f21e93a4e086483793bf5ce._comment | 10 + .../blog/day_45__long_polling/full.png | Bin 0 -> 55185 bytes .../blog/day_45__long_polling/phone.png | Bin 0 -> 41602 bytes .../blog/day_46__notification_pools.mdwn | 68 + .../blog/day_47__alert_messages.mdwn | 14 + doc/design/assistant/blog/day_48__intro.mdwn | 8 + .../blog/day_49__first_run_experience.mdwn | 39 + ..._e146cf06c8dd6303dd6a991f152a73fe._comment | 8 + ..._5d6adcf6782c02283bef6189582ee467._comment | 12 + ..._7ac2e34c2a7bc9b57488ca0c91307d32._comment | 14 + ..._549b07bb02c07a5b1b95445b01758db2._comment | 14 + doc/design/assistant/blog/day_4__speed.mdwn | 47 + ..._bf3c9c33cc0dea5eaeb6f2af110b924b._comment | 8 + ..._33aba4c9abaa3e6a05a2c87ab7df9d0e._comment | 8 + .../blog/day_50__directory_name.mdwn | 20 + ..._782cec95a8558a05b2b38a2d2302214d._comment | 8 + ..._2b8ceb0a26f25e8ed2711bcbe7225a58._comment | 8 + .../assistant/blog/day_51__desktop.mdwn | 34 + .../assistant/blog/day_52__file_browser.mdwn | 21 + ..._cd000c2d56b60cc1f17b221322a32aa7._comment | 8 + ..._21d1da67cf9105a545583ba2302c10fb._comment | 7 + .../blog/day_54__adding_removable_drives.mdwn | 99 + ..._5de4f220a3534f55b1f2208d1d812d63._comment | 10 + ..._8dae1ed0a70acf9628b88692dc32ac5f._comment | 10 + doc/design/assistant/blog/day_55__alerts.mdwn | 10 + ..._6319045500a8a5e049304fdec5ff4cf4._comment | 8 + .../blog/day_56__transfer_control.mdwn | 8 + doc/design/assistant/blog/day_57__afk.mdwn | 40 + ..._70e1c9f925f040c1700d3e26bab373d5._comment | 9 + ..._c70d3faccfcebf47deb25e270498cb56._comment | 18 + ..._89020ebc6d31485339bdea41a872df3c._comment | 11 + ..._8b1f65f141ffd9813e7f5a3380f7f520._comment | 27 + .../blog/day_58__more_transfer_control.mdwn | 26 + doc/design/assistant/blog/day_59__dinner.mdwn | 10 + ..._0c1e2d69496473e7e4a2956a2814f5dd._comment | 9 + .../assistant/blog/day_5__committing.mdwn | 57 + .../assistant/blog/day_60__taking_stock.mdwn | 40 + ..._6722f81ee084f1ea9e8fe47f34576397._comment | 8 + .../day_61__network_connection_detection.mdwn | 36 + ..._09b58f41a8d48f218619711ee19511ac._comment | 8 + .../blog/day_62__smarter_syncing.mdwn | 21 + .../blog/day_63__transfer_retries.mdwn | 26 + ..._990d4eb6066c4e2b9ddb3cabef32e4b9._comment | 10 + .../blog/day_64__syncing_robustly.mdwn | 33 + .../blog/day_65__transfer_polish.mdwn | 33 + .../assistant/blog/day_66__the_merge.mdwn | 19 + ..._eeccf4e73cc321542a1fe4780805a81e._comment | 12 + ..._a34e89316d1662826848f31061c4e46b._comment | 8 + ..._09e244d23d05052fa2b11a7181888366._comment | 8 + ..._3961a03e167903959b96b054835613f6._comment | 8 + ..._12a57af9f580918818b4a9f68396d5c4._comment | 23 + ..._8ce638960012367c888e018a5f05db19._comment | 8 + ..._f461b856b940e6914bcd2b681cf9505f._comment | 13 + ..._6e73aca1fc1747d0e742e054b88b5d78._comment | 12 + ..._d85f1ce23ae16d5a8eb88d2c3999acb7._comment | 19 + ..._c06dab4d78122c85beeaf300ffc3e376._comment | 8 + .../assistant/blog/day_67__progress_bars.mdwn | 10 + .../assistant/blog/day_68__transfers.mdwn | 15 + ..._5282960c0b553fbc0f411345b9745324._comment | 14 + .../assistant/blog/day_69__build_fixes.mdwn | 7 + doc/design/assistant/blog/day_6__polish.mdwn | 50 + .../blog/day_70__adding_ssh_remotes.mdwn | 66 + ..._2fac85357ac8feccff82beabd3791439._comment | 13 + ..._e9e496005fd1bf5a10c9e286b83e51fa._comment | 8 + ..._913e6ae7c8f7db90b9767ec35fc84205._comment | 23 + ..._634ca3c236e2062289e7df5f0d77a3c5._comment | 8 + ..._e365bbcbb7f66ce2b35fcd5b969ab315._comment | 16 + ..._b15499722a655489f9ea60ff9d4c47c6._comment | 12 + ..._8ea48276f060e75d9f40617d2a1ccd08._comment | 12 + ..._9b8bf7e9fa715977fbeb98087deefd1a._comment | 10 + ..._42e09eacdc10c7cf579bfc6470b5117c._comment | 8 + ..._6c02f31063b3d399d1b4f823bd6543ce._comment | 16 + ..._dd0447cb3b39d3a8c1a7cc00f17d8bc2._comment | 10 + .../assistant/blog/day_71__ssh_probing.mdwn | 26 + ..._56a0c29f7454cfca5cc30b2849e6e942._comment | 8 + ..._f3bd3e366c92c833c7e217da125481b8._comment | 8 + ...mote_ssh_server_configurator_finished.mdwn | 34 + .../blog/day_73__rsync.net_configurator.mdwn | 17 + .../blog/day_74__bits_and_peices.mdwn | 7 + .../blog/day_75__zeromq_and_pairing.mdwn | 50 + .../assistant/blog/day_76__pairing.mdwn | 16 + ..._09665f269343422cd18051fad1a8c19e._comment | 24 + ..._8e1b2233579bc26bfd758bbf6b3bdc07._comment | 10 + ..._a8b6a8432da20c468c633da8e7cbc2f3._comment | 8 + ..._36a428a2e1803f4391b821d1892f0cd7._comment | 10 + ..._11f332fe2050d8c1416e71f9e85ba280._comment | 8 + ..._973aeb656b78eca97474ea1a3f5b57b7._comment | 12 + ..._03d2b3343f34377a4d6171e06b7609f6._comment | 8 + .../assistant/blog/day_77_alert_buttons.mdwn | 21 + .../blog/day_78__pairing_continued.mdwn | 8 + .../blog/day_79__pairing_finished.mdwn | 33 + .../assistant/blog/day_7__bugfixes.mdwn | 45 + .../blog/day_7__bugfixes/profile.png | Bin 0 -> 47098 bytes .../blog/day_7__bugfixes/profile2.png | Bin 0 -> 230937 bytes .../blog/day_80__default_backend.mdwn | 14 + ...enabling_pre-existing_special_remotes.mdwn | 34 + .../blog/day_82__git-annex_branch_work.mdwn | 26 + doc/design/assistant/blog/day_83__3-way.mdwn | 73 + .../blog/day_84__deferred_downloads.mdwn | 33 + .../blog/day_85__more_foundation_work.mdwn | 17 + .../blog/day_86__towards_the_beta.mdwn | 33 + .../blog/day_87__more_progress_progress.mdwn | 28 + ...ay_88__progressbars_still_progressing.mdwn | 18 + .../assistant/blog/day_89__final_polish.mdwn | 24 + doc/design/assistant/blog/day_8__speed.mdwn | 67 + ..._a3dba537b276d5737abc8cb93f1965f4._comment | 10 + doc/design/assistant/blog/day_90__beta.mdwn | 16 + ..._5f2a3b18ad7558abe04f51534a29ff13._comment | 9 + ..._961c4eba97f4eac75174244d6b2b00c0._comment | 8 + ..._c76675a4633cbbe347ed42c222918d38._comment | 24 + ..._f0b8f77cb691e747fe35bcf2f51b5baa._comment | 8 + ..._99fbc9feac62e66a12b0d357cf86ccc1._comment | 8 + doc/design/assistant/blog/day_91__break.mdwn | 7 + doc/design/assistant/blog/day_92__S3.mdwn | 23 + ..._eda656247d11cea7fbed2e33137a39e5._comment | 10 + ..._8249d2d9521e44c674da3fda74be077a._comment | 10 + .../blog/day_93__OSX_standalone_app.mdwn | 23 + .../assistant/blog/day_93__easy_install.mdwn | 34 + ..._d4f7de723c98577ef28d89ee6b87fd13._comment | 10 + ..._6337b341c1cfb2132b59704394e57b36._comment | 8 + .../blog/day_95__repository_groups.mdwn | 21 + .../blog/day_96__revisiting_file_adds.mdwn | 24 + ..._da3ca47041168b6c82aeb2c18acc5017._comment | 8 + .../assistant/blog/day_97__stuffing.mdwn | 14 + .../blog/day_98__preferred_content.mdwn | 44 + ..._2136618e3515d0ac6369a41f1934ec2a._comment | 17 + ..._5f6db00e69628bf2f72b0e6f2981a49b._comment | 14 + doc/design/assistant/blog/day_99_shotgun.mdwn | 70 + ..._12bb8f54bb13ea20ac4187a2301d77ca._comment | 10 + .../assistant/blog/day_9__correctness.mdwn | 30 + ..._564a39cb976767e2c0a9c74fabe10be4._comment | 8 + ..._77924e9d50b40f05e792e427a25849a6._comment | 9 + ..._92bd86cd06d579e23800af2e5c66a291._comment | 8 + ..._0d12b51ccdfc2a94d3e59a5628521e0a._comment | 10 + ..._208f9dd3e1d92555b05c29159538a901._comment | 14 + ..._90cc6b60718896fb175919417600fdf9._comment | 8 + doc/design/assistant/chunks.mdwn | 7 + doc/design/assistant/cloud.mdwn | 45 + ..._4997778abc171999499487b71b31c9ba._comment | 16 + ..._08da8bc74a4845e354dca99184cffd70._comment | 8 + ..._faafd1266301997b1822d215ec8e8d8c._comment | 8 + ..._3eb557d5439831f6e0032944d12c02cf._comment | 12 + ..._f2233fad55c20686cf299bf6788f1f23._comment | 10 + ..._a38f0f21c2346e65b786d791b6829f9b._comment | 12 + ..._5e991177d6577384f39a36ae02f5f574._comment | 13 + ..._f8625c6f43b58847840df338a73b7972._comment | 7 + ..._c37ef5931b0f5c1f808083e0d636a208._comment | 11 + ..._68c98a27083567f20c2e6bc2a760991b._comment | 9 + ..._8e6788c817c60371d2a2f158e1a65f87._comment | 8 + ..._97bdfacac5ac492281c9454ee4c0228e._comment | 8 + ..._53137b2df4913496c0afb2d895aa4ee2._comment | 8 + ..._ff1b0ba57e22ed757ec3fc5400b5e43e._comment | 8 + ..._a48fcfbf97f0a373ea375cd8f07f0fc8._comment | 8 + ..._099da245e3276fa84f5e14312d186621._comment | 8 + ..._6d3552414fdcc2ed3244567e6c67989d._comment | 7 + ..._05223be50c889b2ed6bc4abf74116450._comment | 9 + ..._fbbd93b55803ae21e6ba4b6568c2fafd._comment | 9 + ..._f4e9af3fed6c27e8ff39badb9794064d._comment | 12 + ..._c7ad07cade1f44f9a8b61f92225bb9c5._comment | 10 + ..._609d38e993267195a80fecd84c93d1e2._comment | 8 + ..._22b818e1a2a825efb78139271a14f944._comment | 10 + ..._d052e2142da8b4838fb1edf791ea23ae._comment | 10 + doc/design/assistant/configurators.mdwn | 20 + doc/design/assistant/deltas.mdwn | 9 + ..._bdb477af913c9782c0e8509e6b294b6e._comment | 8 + ..._71889d15ba20ebb0fe13080c68162a5b._comment | 11 + doc/design/assistant/desymlink.mdwn | 145 + ..._f1bfe250b7f872359f7075998b6e42e3._comment | 11 + ..._5e876edfe9853645f761b5ed9b5021aa._comment | 9 + ..._538561d74371e53c2f8df7f5ebdf58a8._comment | 8 + ..._586ecaa800e6c162377c937da5e65440._comment | 12 + ..._8fc703de67814cf2aec2a908852298a4._comment | 10 + ..._1b473ad89494afb82250af4b6df5f5c9._comment | 22 + doc/design/assistant/disaster_recovery.mdwn | 185 + ..._955dc807196863da23aa8dbd15e04364._comment | 10 + .../assistant/encrypted_git_remotes.mdwn | 22 + doc/design/assistant/gpgkeys.mdwn | 40 + ..._a14427f88c9fd8e25ad8708146bb4bff._comment | 15 + doc/design/assistant/inotify.mdwn | 234 + ..._3d3ff74447452d65c10ccc3dbfc323cd._comment | 7 + ..._a3c0fa6d97397c508b4b8aafdcee8f6f._comment | 7 + ..._b346e870c1cd80e4b0a313c3a9fed6b3._comment | 8 + ..._32be58b4c3b17a4ea539690d2fb45159._comment | 12 + ..._0cdd3046d90ad2012025d846ece0731e._comment | 8 + ..._e197d5d0d853572ec1f2e5985762e60d._comment | 9 + doc/design/assistant/leftovers.mdwn | 17 + ..._b20c88bb3c583a32023c1f6b6dc9486d._comment | 8 + .../assistant/more_cloud_providers.mdwn | 24 + doc/design/assistant/pairing.mdwn | 83 + doc/design/assistant/partial_content.mdwn | 36 + ..._58c4faa321a5bb71adf9fdee079849f4._comment | 18 + doc/design/assistant/polls.mdwn | 1 + .../assistant/polls/2013_user_survey.mdwn | 1 + doc/design/assistant/polls/Android.mdwn | 18 + ..._fa6c409833f28c67da105d25f4a440e0._comment | 8 + .../polls/Android_default_directory.mdwn | 7 + ..._d39655091ac3ed51a9d4325d86b23ad7._comment | 10 + ..._2f1eaae95075db26488517720afd1c63._comment | 8 + ..._b484012f60789be73d7d5b338cff6203._comment | 10 + .../assistant/polls/goals_for_April.mdwn | 17 + ..._9f81fa96db5970a4be0828c74a6d2d55._comment | 22 + ..._d8956d220ccacff3d2f6cbeb15718459._comment | 28 + ..._aadad6dfd56d068d2e377606910c006f._comment | 8 + .../polls/prioritizing_special_remotes.mdwn | 16 + ..._dd9280df27848a7ff132f5809dab0a79._comment | 8 + ..._370e0b9c43486ee96c825f9155eebde4._comment | 8 + ..._883a003b9c552b89f191135c582f99aa._comment | 14 + ..._746006c3fffc7f917c4526fd688051f7._comment | 8 + ...ing_me_from_using_git-annex_assistant.mdwn | 16 + ..._10a4839a05be39ced54ffbe880a588bb._comment | 25 + ..._ac91d866f11c66dd8c86e2cd1a368c85._comment | 10 + ..._e244c1bf334b1cc9ad0cc760bf8fe5de._comment | 29 + ..._1a0faf4bdc78741937e8a2f5cb5bbec6._comment | 12 + ..._8d8a11dbfae7a7bc574bdf37f87e0684._comment | 16 + ..._c437adeaccf0b3d134e0f81c64e25b9f._comment | 14 + ..._6e3fce3a32ab346dc3d0fd4b69967536._comment | 8 + ..._1b7233d88593d0d99b26ea3e7af20d9c._comment | 8 + ..._a23d5a0e2718b8e486f036fe8a413b36._comment | 10 + ..._f4c84a9d701d52cf2f2e45f3d764a90c._comment | 18 + ..._00a0de8190d946caaeeca3b44646146f._comment | 16 + ..._199c9807499470771af6cbca6d034cfa._comment | 8 + ..._9185b0e05b1b1997533694da1de83073._comment | 22 + ..._35f6f121e54260cb960211a6e2e51e8e._comment | 14 + ..._acbe4f63b5d552ac5ae5a12c6f42dc18._comment | 25 + ..._0d988280865caae498a3b693b6342e37._comment | 16 + ..._ac8fe3768c30dd7999c183500f8567bb._comment | 19 + ..._36832de705a2bebf8dc6e65dcd661731._comment | 15 + ..._3618067e473577a112e36970ca71e0ab._comment | 12 + ..._07a13b6f000ddc0ac4472b863d8b50bd._comment | 14 + ..._e15eb407d988fda363296c8b566cc8fb._comment | 12 + doc/design/assistant/progressbars.mdwn | 43 + ..._3ea263b1f334e8e38e14f00a96202988._comment | 8 + doc/design/assistant/rate_limiting.mdwn | 57 + doc/design/assistant/screenshot/firstrun.png | Bin 0 -> 54347 bytes doc/design/assistant/screenshot/intro.png | Bin 0 -> 50730 bytes doc/design/assistant/sshpassword.mdwn | 12 + doc/design/assistant/syncing.mdwn | 220 + ..._c70156174ff19b503978d623bd2df36f._comment | 19 + ..._eb992b5b2c7a5ce23443e2a6007e5ff9._comment | 8 + ..._e1b5e8a24556de16d1cacd27ee0c1bd1._comment | 80 + doc/design/assistant/syncing/efficiency.mdwn | 73 + doc/design/assistant/telehash.mdwn | 95 + ..._8b08b5c30e5aea3fc4599f856fd25df5._comment | 8 + doc/design/assistant/todo.mdwn | 4 + doc/design/assistant/transfer_control.mdwn | 123 + ..._d5adaef4712913dc0263d4ebafb79320._comment | 15 + ..._3b51474fefa6c0d19055046e06af196d._comment | 14 + ..._44a1a6d2db9097de9ae68ea1ff1b08a2._comment | 8 + doc/design/assistant/upgrading.mdwn | 52 + doc/design/assistant/webapp.mdwn | 65 + ..._bab6f6fa720273c0f9700a3765150189._comment | 8 + ..._3cf0cf460c7869d0cc22940fcc84aec4._comment | 10 + ..._428e153135f7a64215730719207d82c4._comment | 8 + ..._f4068a7abbb77ba6a3297cbcf1e503e9._comment | 10 + doc/design/assistant/windows.mdwn | 33 + ..._f4b829318b182e1cec29f13babb6498e._comment | 10 + doc/design/assistant/xmpp.mdwn | 136 + ..._f20650f93d7f0ca39b9ba3ce0380193f._comment | 10 + ..._8c22839a8f5912b4a817415c4a359697._comment | 8 + ..._773102522f21844cffc841e6cde9229e._comment | 8 + doc/design/assistant/xmpp_security.mdwn | 29 + ..._c714e86553c02600249795efb224be8a._comment | 10 + doc/design/caching_database.mdwn | 124 + doc/design/encryption.mdwn | 126 + ..._4715ffafb3c4a9915bc33f2b26aaa9c1._comment | 12 + ..._a610b3d056a059899178859a3a821ea5._comment | 10 + ..._cca186a9536cd3f6e86994631b14231c._comment | 12 + ..._8f3ba3e504b058791fc6e6f9c38154cf._comment | 10 + ..._520e60aa53217b5ba428d4c05d897dee._comment | 16 + ..._d677fead0fe0c543f48f07d85f83f592._comment | 14 + ..._c1c38a09b1276e29adc3ba564dc0fe4e._comment | 14 + .../external_special_remote_protocol.mdwn | 293 + ..._8d3c35eb0a2a9c57b10566fcaf56d248._comment | 8 + ..._241e57092d9e5631ac0ec4dd962477a6._comment | 12 + ..._e3029c65d34f78272bc11961ebfd8237._comment | 10 + ..._472748f03ba8dad773da7f35b70cb6e4._comment | 15 + ..._71c3e21a72222250bab933e1c9167fbc._comment | 14 + ..._c77386deddc64b2028d9c3a7393d4df7._comment | 10 + ..._5baff75d278394a8818c348fb4f13b8a._comment | 10 + ..._70429b7c4f1e4083a9d5a6e2e238056d._comment | 8 + ..._c763e44d06d9f50f0d357889b180b819._comment | 15 + ..._20ff41d82b5f1872698a5b24adcd0c41._comment | 12 + ..._3ee158e548002badae5bf44dc0442626._comment | 13 + ..._ee2828ce25b83bbabc9d5dde35d1e57b._comment | 12 + ..._edb649d0019a061ef7bf6534a444429d._comment | 16 + ..._1f4c205a5ce6f33ccf2f4d80754e5699._comment | 8 + ..._15c4cfe064be37cc104dcb6aa049a449._comment | 14 + doc/design/gcrypt.mdwn | 8 + doc/design/metadata.mdwn | 196 + ..._22ed80bd8eabaa836e9dfc2432531f04._comment | 22 + ..._03ae28acedbe1fa45c366b30b58fcf48._comment | 14 + ..._ee850df7d3fa4c56194f13a6e3890a30._comment | 12 + ..._c32ade1524487e5fdc6f83b2db39f04c._comment | 8 + ..._0ac3132cd7a84f0e170fbe3a6f235fe7._comment | 8 + doc/design/preferred_content.mdwn | 21 + doc/design/roadmap.mdwn | 18 + doc/devblog.mdwn | 10 + doc/devblog/day_-1__drop_dead.mdwn | 5 + doc/devblog/day_-3__.mdwn | 29 + doc/devblog/day_-4__forgetting.mdwn | 80 + ..._f3cc7a25af4c59fda3924c737a789419._comment | 8 + ..._e47476c80af02a2e9cf76c53fdbb8534._comment | 9 + ..._b57956a8ce372d620f21ea9a497e8013._comment | 8 + ..._812b630df01ac35254e3c4e677554e2b._comment | 8 + ..._a9670eca2aff9ad5f04412a8d8b6df6a._comment | 8 + ..._4f87e2ab119f3cd81266159f02952188._comment | 9 + ..._a865216046aa91a47d0d2b2f0668ea89._comment | 12 + ..._3f7045a00905b4287d950b08d5a77a82._comment | 9 + .../day_100__git-annex_sync_--content.mdwn | 4 + doc/devblog/day_101__old_mistakes.mdwn | 23 + ..._2c6e991efde3296450189b2821f2ccc3._comment | 17 + ..._524690d69056737dd296e4f7626737d2._comment | 12 + doc/devblog/day_102__cleanups.mdwn | 10 + doc/devblog/day_103__unused.mdwn | 34 + doc/devblog/day_104__unused_II.mdwn | 7 + ..._a693a56123497a39c30cbd35b8e35bce._comment | 10 + ..._9833fb9daa50bc838cc46ca2f6c16580._comment | 10 + ..._873a882ec1ddc3be473473cb224a9040._comment | 12 + ..._5ef1bb4d69cf7206f7ca0e542abad6bd._comment | 13 + ..._1964bfce4887c9c0828fd7f54f5b4f6b._comment | 12 + ..._0ed4023c9c249024fe0454fc5bab3b14._comment | 10 + doc/devblog/day_105__locking.mdwn | 30 + doc/devblog/day_106__catching_up.mdwn | 5 + doc/devblog/day_107__TDD.mdwn | 10 + ...ay_108__new_use_for_location_tracking.mdwn | 20 + .../day_109__elimintating_absNormPath.mdwn | 18 + doc/devblog/day_10__lazy_Sunday.mdwn | 23 + doc/devblog/day_110__release_prep.mdwn | 25 + .../day_111__windows_beta_release.mdwn | 6 + doc/devblog/day_112__metadata_design.mdwn | 18 + doc/devblog/day_113__metadata_groundwork.mdwn | 9 + doc/devblog/day_114__windows_porting.mdwn | 8 + doc/devblog/day_115__windows_porting.mdwn | 17 + doc/devblog/day_116__views.mdwn | 54 + doc/devblog/day_117__views_implemented.mdwn | 76 + doc/devblog/day_118__views_refined.mdwn | 7 + doc/devblog/day_119__catching_up.mdwn | 15 + ..._8aa413e75cab411b0aec254f0f33ebb9._comment | 8 + ..._db31d08690730836ce6277e797fcae1d._comment | 8 + ..._d44da76b18f53a5f51b46e3e15090a48._comment | 8 + .../day_11__webapp_encrypted_drives.mdwn | 12 + doc/devblog/day_120__more_metadata.mdwn | 17 + .../day_121__special_remote_maintenance.mdwn | 23 + doc/devblog/day_122_more_windows_porting.mdwn | 4 + doc/devblog/day_123__stuck.mdwn | 13 + doc/devblog/day_124__day_off.mdwn | 13 + doc/devblog/day_125__metadata_and_views.mdwn | 11 + doc/devblog/day_128__release_prep.mdwn | 27 + doc/devblog/day_12__gpg_key_generation.mdwn | 35 + ..._48cdfe3bd71fb348ae05fd90e8cf1dab._comment | 8 + doc/devblog/day_130__post_release.mdwn | 17 + doc/devblog/day_131__more_bug_squashing.mdwn | 11 + doc/devblog/day_132__database_musings.mdwn | 17 + doc/devblog/day_133__db_and_bugfixes.mdwn | 20 + ...y_134-135__avoiding_the_turing_tarpit.mdwn | 18 + doc/devblog/day_136__frustrating_day.mdwn | 10 + ...-138__bug_triage_and_too_much_windows.mdwn | 15 + doc/devblog/day_139-140__traveling.mdwn | 17 + .../day_13__encrypted_sneakernet_working.mdwn | 13 + doc/devblog/day_141__f-droid_sprint.mdwn | 3 + ..._1cc76207020ac478747117c76d7b5f9c._comment | 8 + doc/devblog/day_142__digging_out.mdwn | 13 + doc/devblog/day_143__foolish_hiatus.mdwn | 20 + doc/devblog/day_144__catching_up.mdwn | 12 + ..._311a7245dd12f1a7e432168d16041348._comment | 8 + ..._14__gcrypt_refinements_and_OOM_fixes.mdwn | 26 + doc/devblog/day_15-17__Android_rebuild.mdwn | 67 + doc/devblog/day_19__moving_on.mdwn | 37 + ..._870106f671f9a055b81e6fc83e0850b5._comment | 8 + ..._fad055c8860385ac6c012f897c96408f._comment | 10 + ..._69e47d612159587f080ab761566d1830._comment | 18 + .../day_1__inauspicious_beginning.mdwn | 11 + ..._cc4dea43caf3126c6f814b589b701d70._comment | 10 + .../day_20__gcrypt_and_git-annex-shell.mdwn | 14 + doc/devblog/day_21__bugfix_day.mdwn | 5 + doc/devblog/day_22__gcrypt_on_rsync.net.mdwn | 20 + doc/devblog/day_23__GNU_day.mdwn | 23 + .../day_24__nearly_done_with_gcrypt.mdwn | 23 + doc/devblog/day_25__finishing_up_gcrypt.mdwn | 25 + .../day_26__gcrypt_really_done_this_time.mdwn | 17 + doc/devblog/day_27__locking_fun.mdwn | 49 + ..._0eb247235fbf8f563934f3548e1d2e10._comment | 8 + ..._e8b1dfe1b0641e031d05733448b7bc8b._comment | 8 + ..._b67f8ef4ed42b49c8c2e6c4e53163b16._comment | 18 + ..._0759644baf26b75f4e48dbb387d725a5._comment | 10 + doc/devblog/day_28__lazy_saturday.mdwn | 17 + doc/devblog/day_29__scheduling.mdwn | 10 + doc/devblog/day_2__new_laptop.mdwn | 8 + ..._93447dbd4eb09b4db96770644ea663cb._comment | 10 + ..._e1d022b25f2c16dbe72db07ad4b10a2d._comment | 8 + doc/devblog/day_30__cronner.mdwn | 17 + ..._53dfd9310e92f5225db52a13e20a46d4._comment | 10 + ..._f98357c6f7a6da23873ac27c2e1e9638._comment | 10 + doc/devblog/day_31__blah.mdwn | 17 + doc/devblog/day_32__fsck_config_UI.mdwn | 20 + doc/devblog/day_33__fsck_on_connect.mdwn | 9 + doc/devblog/day_34__wrapping_up_fsck.mdwn | 7 + .../day_35__anacron_and_bugfixing.mdwn | 15 + doc/devblog/day_36__bugfixing.mdwn | 1 + doc/devblog/day_37__long_day.mdwn | 6 + .../day_38__starting_git_repo_repair.mdwn | 11 + ..._321468d9686db5dde072500bdaeb7d29._comment | 10 + .../day_39__git-recover-repository.mdwn | 54 + doc/devblog/day_3__gcrypt_uuids.mdwn | 63 + doc/devblog/day_40__another_fine_mess.mdwn | 15 + doc/devblog/day_41__onward.mdwn | 17 + ..._a716c7b5a9ea3c949ff047cfb4e9a0a4._comment | 8 + ..._33149e424cd5f03fac376288bcc4dfdc._comment | 8 + ..._3b07503bd79089ad3ce3ddd7535ed116._comment | 14 + doc/devblog/day_42__repair_milestone.mdwn | 35 + doc/devblog/day_43__bugfix_day.mdwn | 26 + ..._44__automatic_removable_drive_repair.mdwn | 16 + doc/devblog/day_45__command_line.mdwn | 9 + .../day_46__wrapping_up_the_month.mdwn | 18 + .../day_47__fell_off_the_blogging_wagon.mdwn | 3 + .../day_48__direct_mode_guard_design.mdwn | 29 + ..._ec0147ccc55bad3a38652383f4098a65._comment | 8 + ..._49__direct_mode_guard_implementation.mdwn | 14 + ..._3ebe5c3f708070f164ecaf36b79f7bfc._comment | 8 + .../day_4__unexpected_windows_day.mdwn | 10 + doc/devblog/day_50__grab_bag.mdwn | 34 + ..._01846f6494fe843889391fd09fd127a0._comment | 8 + ..._12736014aa2c1af81e4b83072505e7d5._comment | 8 + .../day_51__direct_mode_guard_finished.mdwn | 6 + doc/devblog/day_52__slowly_but_surely.mdwn | 5 + .../day_54__android_bisection_minions.mdwn | 9 + ..._bea8fbe2b87d4a4865b92fa796298fa0._comment | 8 + doc/devblog/day_55__fireside_porting.mdwn | 22 + ..._d690a52db82f9594d99ae65fe51e1f1a._comment | 8 + .../day_56__git-annex_user_survey.mdwn | 20 + doc/devblog/day_57__mavericks.mdwn | 14 + doc/devblog/day_58__urgle.mdwn | 16 + ..._bd279f58f614b103a53215dfb0211007._comment | 12 + doc/devblog/day_59__release_day.mdwn | 11 + .../day_5__gcrypt_special_remote_part_1.mdwn | 7 + .../day_60__damage_driven_development.mdwn | 36 + ...day_61__damage_driven_development__II.mdwn | 15 + doc/devblog/day_62__upgrade_alerts.mdwn | 22 + ..._cdb44aaa1d2a784a72613cbf16038f89._comment | 8 + ..._b08bb946e4760d7f03b45c852c745b2e._comment | 8 + doc/devblog/day_63__leverage.mdwn | 24 + doc/devblog/day_64__overkill.mdwn | 31 + ..._e1db7678aae37af281d31ae211677786._comment | 10 + ..._f7a96f0b6d942d0b59d9d0ec1b21c4bf._comment | 8 + doc/devblog/day_65__wrapping_up_upgrades.mdwn | 5 + doc/devblog/day_66__upgrade_testing.mdwn | 17 + doc/devblog/day_67_thanksgiving_rush.mdwn | 19 + doc/devblog/day_68__bits_and_pieces.mdwn | 14 + doc/devblog/day_69__catching_up.mdwn | 14 + doc/devblog/day_6__gcrypt_fully_working.mdwn | 8 + ..._136bb7537a9ba93d400ce6f6ea1932ac._comment | 8 + ..._1f8faa65bbd56a12588b43a5bc822d96._comment | 10 + ..._70__preliminary_user_survey_analysis.mdwn | 104 + doc/devblog/day_71__that_was_unexpected.mdwn | 30 + doc/devblog/day_72__windows_webapp_not.mdwn | 22 + doc/devblog/day_73__EvilLinker.mdwn | 28 + doc/devblog/day_74__so_close.mdwn | 20 + ..._b1aa185734c3d74830b81def4fe63bff._comment | 10 + doc/devblog/day_75__hallelujah.mdwn | 8 + ..._df04c456e99d47743494a18c1badba8c._comment | 8 + doc/devblog/day_76__results.mdwn | 15 + doc/devblog/day_77__it_builds.mdwn | 8 + doc/devblog/day_78__desidetracked.mdwn | 34 + doc/devblog/day_79__catch_up.mdwn | 3 + doc/devblog/day_7__release_day.mdwn | 10 + ..._12bb94d903868ecddb3e348c9c4afeaf._comment | 8 + ..._d3e38d6f6bba179dab40d4d75ff061de._comment | 8 + doc/devblog/day_80__plumbing.mdwn | 9 + doc/devblog/day_81__more_standalone.mdwn | 15 + ..._25ceb116406b55a8ff28f7b392806bc9._comment | 10 + doc/devblog/day_82__rpi_and_synology.mdwn | 21 + ..._d154ddcf22027fd06acf9da73e12c006._comment | 8 + doc/devblog/day_83__armel_webapp.mdwn | 19 + doc/devblog/day_84__ho_uh_oh.mdwn | 11 + ...xternal_special_remote_protocol_types.mdwn | 25 + ...xternal_special_remote_implementation.mdwn | 11 + ..._5116bcf4b60030cb46683df94a75d7ee._comment | 8 + ..._7b6e734f785fbd9db7883b63150023dc._comment | 8 + ...day_87__external_special_remotes_done.mdwn | 16 + doc/devblog/day_88__lazy_sunday.mdwn | 15 + doc/devblog/day_89__reflections.mdwn | 18 + doc/devblog/day_8__ill.mdwn | 20 + doc/devblog/day_90__slow_start.mdwn | 23 + doc/devblog/day_91__wintry_mix.mdwn | 11 + doc/devblog/day_92-93__reconnection.mdwn | 34 + doc/devblog/day_94__leaks.mdwn | 12 + .../day_95__reconnection_revisited.mdwn | 13 + ..._c1106e573fcf9f3d4524c0e4f4254790._comment | 8 + ..._40478739f95e0b56ce0103db6e405ef4._comment | 10 + doc/devblog/day_96__catching_up.mdwn | 7 + ...ay_97__exciting_telehash_possiblities.mdwn | 20 + ..._7c775d93cbeed0d553e224751d30fbaa._comment | 10 + doc/devblog/day_98__old_bug.mdwn | 17 + doc/devblog/day_99__catching_up_again.mdwn | 19 + ..._b871bf0606dc29be9b8c2e5dc150f708._comment | 10 + ..._c8363d47223e7bb899420e800bde3e27._comment | 8 + doc/devblog/day_9__Friday_the_13th.mdwn | 21 + ..._07195b4ec399ba1be6c8bdb3ae0fa50b._comment | 12 + doc/devblog/day__126-127__merge_fixes.mdwn | 61 + doc/devblog/moving_blogs.mdwn | 5 + ..._6caa7e67461a6ea5de8155ae9cf75fab._comment | 8 + ..._e3e2048fc2397b87a2f29c9fe49394cb._comment | 10 + doc/devblog/whither_XMPP.mdwn | 30 + doc/direct_mode.mdwn | 93 + ..._1c79c93f4b17cfc354ab920e3775cc60._comment | 26 + ..._1b5218fdb6ee362d6df68ff1229590d4._comment | 10 + ..._55108ac736ea450df89332ba5de4a208._comment | 12 + ..._ff4ffc2aabc5fd174d7386ef13860f78._comment | 10 + ..._1cd32456630b25d5aaa6d2763e6eb384._comment | 8 + ..._8020d74bddf0e38b0a297e5dae7c217b._comment | 12 + ..._97c26bd82f623a3b2d56bab4afff0126._comment | 12 + ..._42363bf0367f935b3eee8ad3d2eaf5cf._comment | 10 + ..._5f03b1686c1fb3f7606a5bc724ac3812._comment | 8 + ..._5355ac418bfb26e990762b80f4c36b77._comment | 12 + ..._6cd15e2c5fd0bef48f60c6993322c2fc._comment | 9 + doc/distributed_version_control.mdwn | 21 + doc/download.mdwn | 40 + ..._ec2578241a966cfcdd43f2a26a5c8709._comment | 13 + ..._ee0d158ac59903737dbc4ef632f11fe3._comment | 7 + doc/ekg.mdwn | 31 + doc/ekg/ekg.png | Bin 0 -> 57392 bytes doc/encryption.mdwn | 101 + ..._1afca8d7182075d46db41f6ad3dd5911._comment | 10 + doc/favicon.ico | Bin 0 -> 2550 bytes doc/feeds.mdwn | 4 + doc/footer/column_a.mdwn | 7 + doc/footer/column_b.mdwn | 7 + doc/forum.mdwn | 8 + ...d_server_for_syncing_-_possible__63__.mdwn | 3 + ..._924521ad5972046bac44d2e04ec296c7._comment | 10 + ..._e2a7f34a3ccc1b6467e6da611c067d66._comment | 8 + ..._f9a369a6ac69f091e6128990274d3228._comment | 10 + ..._91b422f8d55b68077245c606c4f7f87c._comment | 28 + ..._f6128fe75ff3453747f69f12e0fd0a5b._comment | 12 + ..._9b90b4031a5ed26c375903b33ed65a10._comment | 17 + ...s_to_delete__44___files_to_keep__63__.mdwn | 12 + ..._fe291cd6cd8e2d5b8e23f8e3689d824b._comment | 15 + ..._f0dbc3c723999bf0f22502e3a89d1d4a._comment | 8 + doc/forum/A_really_stupid_question.mdwn | 3 + ..._40e02556de0b00b94f245a0196b5a89f._comment | 31 + ...ssing_files_directly_on__a_USB_device.mdwn | 11 + .../Accessing_files_in_bare_repository.mdwn | 5 + ..._7eb66e3806f9524e043fae2da9d57d64._comment | 10 + ..._f0165d66865ad14f7eb5d50e900c1df4._comment | 10 + ..._0e7ea5161b6da6e9bb9425bdb953de33._comment | 8 + ..._f804b9bf71f7d04bd23ce32d813dc340._comment | 8 + ..._6de649d38febd2240eb5b703da77c2d6._comment | 15 + ..._7e8dd09915ddc3267377e900891cb02c._comment | 24 + ..._80eae4a73f38d1a7e35f97c33b6401f8._comment | 8 + ..._5ec13e98d3ecb69426e974d34f712f9b._comment | 8 + ..._dccbf5793998c6381e23eb8ff6497ebf._comment | 17 + ..._42d923916232c81f3b8bdbefa34a89d3._comment | 18 + ..._43a0a7d222faee582aeb3150a59cef87._comment | 8 + ..._ec1024235c1c74c113483a833df84654._comment | 12 + ..._c156b8c1ae0f2905566bbdb13b84e577._comment | 37 + ...__and_crippled__41___annex_repository.mdwn | 28 + ...ect_mode_sync_should_avoid_git_commit.mdwn | 1 + ..._06dae5709750ea1da4f7fdbee4e84efc._comment | 16 + ..._2069c5c41882ae0a1973fb7da583b60e._comment | 10 + ..._b35e3a87c30974eedd71ebe52ecbed96._comment | 8 + ..._84e026f9bda87bfd12a3769dcef77f8b._comment | 8 + ..._b2ac2ea300a5026832b40a1a6b27a7cd._comment | 8 + ..._ed3534196164c6736a8dbf21c65c119d._comment | 10 + ..._1e29bcf568f02765c48f0eac6c640673._comment | 45 + ..._9ea6803a94b1de15079a3fa20d59c9af._comment | 10 + ..._3fae5a7fa5d99d0eb4473adb43e7f6f5._comment | 8 + ..._57a5b73cff480266355e75c7bdc762c2._comment | 8 + ..._bbcf5e863c8f152e1079536e9011a404._comment | 16 + ..._fdcd144c22601bdf98ff844254b0120d._comment | 8 + ..._b77243e765b2af7ba71e963fcb5cbbb1._comment | 71 + ..._cb0815e96ee211d4778f2e7a4274e855._comment | 8 + doc/forum/Add_a___34__local__34___remote.mdwn | 13 + ..._c68ad724b465c4be5243be687168c0b3._comment | 12 + ...dding_existing_S3_bucket_to_sync_with.mdwn | 16 + ..._30b9a70d367dd5b8781e9a86e42d4c3e._comment | 10 + ..._a8525c1a7e5f89c30c9503fe8bfed02e._comment | 8 + ..._c3878989f74e740c0ed42f440750f3a4._comment | 8 + ..._c06cc86496f9d4c0c42a8c89aa5a7b35._comment | 8 + ..._0a1c2dd0929511ff824be8de2c8d85eb._comment | 9 + ..._1444c2f89885f028f20a4d3ce225a403._comment | 23 + ..._1c30944010d541096baff18198a5560d._comment | 23 + ...eded:_git-annex_slows_down_my_macbook.mdwn | 21 + ..._af8ab0a47cd379fcb1445e50782ad086._comment | 12 + ..._a7202bcbdda36a3801833d2432db1965._comment | 25 + ...t_high_cpu_usage_to_be_expected__63__.mdwn | 3 + ..._7880fc38792a1fcbf3e5c47e8bcaabce._comment | 8 + ..._840fbce18b4fdec21ee557fdf52c366e._comment | 10 + doc/forum/Android_-_ext3__47__4__47__....mdwn | 1 + ...Annex_contents_just_disappeared__63__.mdwn | 12 + ..._4ab5ca00f912c0c95fabc10f2d9600d3._comment | 12 + ..._657f737c5d64d440aa133ddb41408fbc._comment | 8 + ..._9b4c35feb14b37d43d053d7430da9abf._comment | 12 + ..._c3625409652bff5f2165260803269a8a._comment | 10 + doc/forum/Annex_dropping_files.mdwn | 12 + ..._62fbea95248fda2ff075b5a8952a728f._comment | 8 + ...d___34__.git__34___to_git-annex__63__.mdwn | 9 + ..._51f4392e718d857e2f155d6217727a53._comment | 10 + ..._9698c4a8f0d8785ee89a6228e0e85ca9._comment | 8 + doc/forum/Assistant:_configure_auto-sync.mdwn | 11 + ..._c8cabd38114582bbdbad49f2d81959d7._comment | 13 + doc/forum/Assistant_Droping_Files.mdwn | 8 + .../Assistant_loosing_advantages__63__.mdwn | 10 + ..._cdbc827d9e00aeeaefafe45de64b8d2c._comment | 10 + doc/forum/Assistant_not_syncing_to_Rsync.mdwn | 15 + ..._2178a7fc0d66643e84597b0938ef65f2._comment | 10 + ..._650651398443e128c2adc6a2a2d320d0._comment | 12 + ..._e6d0c9620b148acc72342862a8b4cfef._comment | 10 + ..._b91f9febdb8b69d8b487ba4ea08c119a._comment | 11 + ..._c5ad7c1546a17d8459c995c9c8c26414._comment | 31 + ..._4c12587f972eced91c5128d4885800b5._comment | 30 + ..._6ecaaee9316bcf0c65688676d60fc055._comment | 8 + ..._daa9a9a6188afa0394833e1b682f7cd4._comment | 10 + doc/forum/Auto_archiving.mdwn | 17 + doc/forum/Auto_sync_with_music_player.mdwn | 1 + ..._81ad1c15cfd753531c01dae8945d1caf._comment | 8 + ..._a15e3f298c3d3faa5b3295355f9bb794._comment | 11 + ..._99f65a0efaf5d5f9b8ff530acc122860._comment | 8 + ...es_due_to_external_modification__63__.mdwn | 46 + ..._dab1099ee56541c194de319c593f1268._comment | 9 + ..._b5faccf132fb47e3cda778a6600fd9ef._comment | 8 + ...ic_commit_messages_for_git_annex_sync.mdwn | 1 + ..._ea2ec57bc695da4df8a30a35d433959d._comment | 15 + ..._af71f53dbbca35d5a5c66ff131887ada._comment | 8 + ...lly_syncronise_centralised_repository.mdwn | 14 + ..._6a2047daa9faf4309d2ed27d5cc48b76._comment | 10 + ..._3be7b45bc2284019f17a81375637a576._comment | 10 + doc/forum/Behaviour_of_fsck.mdwn | 13 + ..._0e40f158b3f4ccdcaab1408d858b68b8._comment | 8 + ..._ead36a23c3e6efa1c41e4555f93e014e._comment | 19 + ..._97848f9a3db89c0427cfb671ba13300e._comment | 19 + ..._e4911dc6793f98fb81151daacbe49968._comment | 8 + ...manage_files_on_removable_media__63__.mdwn | 18 + ..._direct_and_crippled_annex_repository.mdwn | 17 + ..._552e74f9573a34ec178f396b83252c3e._comment | 12 + ..._33c57922714f204fc63c260b838f3712._comment | 8 + ...sn__39__t_been_working_for_a_few_days.mdwn | 72 + ..._6ca872c241399b9129cf9a18f42ebd43._comment | 8 + ...uilding_a_Debian_package_of_git-annex.mdwn | 27 + ..._0848513c46f3efa21bc34784554ae88a._comment | 10 + .../Building_git-annex-3.20121112-19309.mdwn | 78 + ..._b115e28c77fe748ee6643c41f766beb4._comment | 12 + ..._8c6ae1fd74f14da12ccfa77dbd27fc65._comment | 16 + ..._2f30b301c14f3a7fa0f52715d6140353._comment | 13 + ..._1e3c3903a71a2ff7109372aa4dd5742a._comment | 8 + ...esolve_dependencies___40__yesod__41__.mdwn | 19 + ..._2eb4f410b54a25fcc895893a3c631c43._comment | 8 + ..._44cd6f6dd674df105d6f0b3f320f3236._comment | 19 + ..._992af6855901df79a2018a07941cb8b6._comment | 8 + .../Calculating_Annex_Cost_by_Ping_Times.mdwn | 1 + ..._9b4a6bc8d52ecbbdd537e8cf76757a80._comment | 15 + ..._7e04f85c6ba74c18c8dde148aef9bf80._comment | 8 + ...in_the_git-annex_git_repository__63__.mdwn | 6 + ..._c8f9923d8dc76b8bed25dce5ae09b520._comment | 8 + doc/forum/Can_Not_Sync_to_Git_Repo.mdwn | 1 + ..._e0f82074eb1a4b8258729d9a23a7f421._comment | 33 + ..._842aaf685aa843c21bf3eef0b61f8630._comment | 8 + ..._b4f8be428a08db01dbd004e1f06dcffd._comment | 10 + ..._80344c54804ddee81d89c0b40731fb9c._comment | 8 + ..._1797c2fef5c20e885b56b8a2c6330ff0._comment | 8 + ..._fb23d640f9634cab2da91848f1848627._comment | 58 + ..._a947736911e68856f2c3494963063df8._comment | 8 + ..._ce0e77143cfd2d578b1e5a71e35060da._comment | 18 + ..._10e114da6a2bb54b860b44767ba1ca94._comment | 17 + ..._415bab6a7ab564e671f42cfad83e0e58._comment | 10 + ..._36abd829ea71a44c7cded1123a7c913d._comment | 8 + ..._2fb745aaffe544f97bbdc670261fd4fd._comment | 14 + ...git-annex_merge_to_work_from_git_hook.mdwn | 41 + ..._8b71cb6772b219c27c17392d5099907a._comment | 12 + ..._af2a2634d8d128868022d033d6adb549._comment | 13 + ..._31ec762a0684d2ce87d229ed2924db93._comment | 16 + doc/forum/Can__39__t_get_jabber_working.mdwn | 7 + ..._def20bf0b3c1a188e4dad5ec67b455d8._comment | 8 + ..._7cb49c0ebfec6e0fe6784e189ed65d40._comment | 8 + ..._852dc402a286e38b77b99f174c33f8d1._comment | 8 + ..._259741e146906ff70540390bdfe07002._comment | 8 + doc/forum/Can__39__t_get_pairing_to_work.mdwn | 5 + ..._b981977b4fb942fd109c37fcf40f35d7._comment | 22 + ..._341e2ff6c88ace1b1422e16781edf580._comment | 8 + ..._0c8cce48f179f2564ff0844bb7ef6bd1._comment | 8 + ..._169d77b30cea05125068ee1eeb2ef328._comment | 25 + ..._70e6c4f4f01277be1767b38ca8374793._comment | 11 + ..._2cd014a76fac6e08269dfd8146957418._comment | 10 + ..._b9b715084d5a5562998b1724699d49e5._comment | 8 + doc/forum/Can__39__t_init_git_annex.mdwn | 15 + ..._c4d2ab1ecf69718a2211c3ea7b27092b._comment | 10 + ..._fca9ed3707e097bee2cd642424681005._comment | 8 + ..._a294b5e7e52aa9f66a708866be16f137._comment | 10 + ..._fcf678d5188821d63b4c9ea5b59474a8._comment | 13 + ..._c83f7dea7d5304e226e52eb3c43ef14a._comment | 9 + ..._06a01dd51ffbfd006c0afb8eab40b530._comment | 8 + ..._53c33484bded57abc60f0449331c7b05._comment | 11 + ..._9e0ff44f6e62581bfc83f9f1da3e0100._comment | 14 + ..._7f96b5ef05e2faf4a3dbe8bfc39b810e._comment | 10 + ..._65ab8463716f4ddd7721a5bcfcd18fa0._comment | 8 + ..._31a45f6a72266190b3ed7a7b02e03d5b._comment | 8 + .../Can__39__t_install:_Mac_OS_10.8.2.mdwn | 36 + ..._c44023d81e9e4f7c9341af0e4271a1e4._comment | 10 + ..._dfbcd39eedff28dc9ed866a8f1411ef3._comment | 30 + ..._b37b2a9906ffb956cca91adb4bb4e521._comment | 8 + ..._afddf16f8faedc78d458835480f10dc3._comment | 15 + doc/forum/Can_not_delete_Repository.mdwn | 3 + ..._b1a9420974e2e50c9c86a379ad62502c._comment | 12 + doc/forum/Can_not_drop_unused_file.mdwn | 14 + ..._cea83dfdf4cdb4f6efb3f2b33a39a51f._comment | 16 + ..._ed1543cff5e6e81ca18c43b716ca8199._comment | 42 + ..._0c9c9c0ed557af4845a67434c21bb4bc._comment | 10 + ...motes_that_aren__39__t_tracked__63___.mdwn | 13 + ..._35e5a963b9e58ed7773dfcb884f8ecbd._comment | 10 + ..._7cde9785886c8450e1475f0b54481ae3._comment | 10 + .../Cannot_find_git-annex_in_server.mdwn | 10 + ..._bf7e98e6130698ad0dc92e3a6a63ade3._comment | 15 + ..._168dda4aed09f90a510bc453e8a7cda7._comment | 10 + ...unch_webapp_on_ubuntu_12.04_using_ppa.mdwn | 6 + ..._9345551f5772c3a6f1490b00e1edbf69._comment | 8 + ..._0b688a442b6a911a0353e73097a24cb6._comment | 12 + ..._7e246caa00005560bb489c927c663046._comment | 12 + ..._1d8025aabe8bc72711a77f691f67da5f._comment | 8 + ..._7c2f95da65190016192424e7c622122f._comment | 8 + ..._9b8465cefe609e7a696e7573b8892e38._comment | 8 + ..._af6472762a598a454ba52ac0caa059aa._comment | 10 + .../Centralized_repository_with_webapp.mdwn | 13 + ..._dcb9b07fd154f4d4fdef4809cc37ce77._comment | 18 + ..._08c84f2703f89dc12982eba9dd2a06d1._comment | 11 + doc/forum/Change_remote_server_address.mdwn | 6 + ..._401c3d2530ac7ba41dd3857ab4737ed5._comment | 10 + .../Check_if_remote_is_using_GPG__63__.mdwn | 1 + ..._db8ce8ef50fc33a28860ee475988450f._comment | 14 + ..._11c7033904c9c7a1df766e915632c386._comment | 8 + ..._a7ab70ad87a334c36761ddb3d830d99b._comment | 8 + .../Check_when_your_last_fsck_was__63__.mdwn | 4 + ..._ee98a1fcd796fe4fd7af6f77d0c1837d._comment | 10 + ..._up_after_aborted_sync_in_direct_mode.mdwn | 19 + ..._3440b2e1662d3b113c18283afcbf4520._comment | 8 + ..._9a61ba8ac4a375f1d69cd09b5a6f8091._comment | 14 + ..._6b9d8c48547f3d0a911310622ba91df7._comment | 13 + doc/forum/Coming_from_git_world.mdwn | 9 + ..._098bef38c2688607e869425a557cc482._comment | 8 + ..._98d75a1415e0c3689ab4231855e61233._comment | 12 + ..._5e7079e9bf3e4d97191333c66ac00e52._comment | 10 + ..._357443dc601ae38784c01cf18552f4d5._comment | 14 + ..._ed1847dd3f47a9d013b8dd0455fb80ff._comment | 8 + ..._09c6bb83a73d34dff2b8bc185a14a1db._comment | 18 + ..._6c731bb9a8d21dd9ab8c09612b23f908._comment | 16 + ..._e719d99af5afd90da3d3db692eff28dc._comment | 11 + ..._85a42106944dba9995fb3f4bfee3443a._comment | 10 + ..._90623294b910ceca3dc8ebd41b50fc9b._comment | 38 + ..._28dbee30eb54877418f72eb8935302d8._comment | 8 + ..._6edb36ea9535030fa3766937398e5bc7._comment | 8 + ...tes___40__specifically_S3__41____63__.mdwn | 1 + ..._9c6c4ca0c9dc6976ba7cf27e84683bf0._comment | 8 + doc/forum/Consistency_Check_for_S3.mdwn | 1 + ..._40385806ef1cc082232cd2723a24be1a._comment | 8 + ..._ebfe40d9f777c9c0a83c44afd0f5802d._comment | 8 + ..._ec9de6882a0eef4d2786e55b583ad020._comment | 10 + .../Controlling_content_on_mobile_device.mdwn | 46 + ..._708649b7f30d8619d7b34dcb0ef46515._comment | 12 + ..._dba1a1b0917332a1dee387b1183bd2cb._comment | 8 + ...egular_git-annex_repo_to_a_rsync_repo.mdwn | 1 + ..._e6065f9c44c85030c7628e2cfa0fd0fa._comment | 12 + ..._76bfb11396dc20a5105376b22e7e773b._comment | 10 + ..._b34d6ae0718ab0ff6bc1d7b8f2470b9b._comment | 16 + ..._8f5e323b29745591f9f2f0f867353f69._comment | 8 + ..._9824c953694770afa0611ff7276737bf._comment | 12 + ..._5899741cb7f83e1b22c5ee3509c5ff21._comment | 8 + doc/forum/DBus_on_Ubuntu_12.04__63__.mdwn | 3 + ..._dc14a40b64b7eda94d1a3fd766cd39cc._comment | 28 + ..._608a30e274e6a691a39f69503720e320._comment | 10 + ..._791b9978b410c1aff7fd8ef05c38f5f9._comment | 40 + ..._8665c95299916138c4af375626d9ec7d._comment | 8 + ..._NOT_use_ntfs-3g_on_mac_osx_for_annex.mdwn | 41 + .../DS__95__Store_files_are_not_added.mdwn | 3 + ..._30687306da9bd35ec02a806193c5e240._comment | 7 + doc/forum/Debugging_Git_Annex.mdwn | 4 + ..._ce63b2ee641a2338f1ad5ded9e6f09a8._comment | 7 + ..._1d70ff052d00f33c34fd45730ea13040._comment | 12 + doc/forum/Default_text__47__html_handler.mdwn | 2 + ..._4730061916c7e12b7a41906152f847ee._comment | 12 + .../Delete_unused_files__47__metadata.mdwn | 7 + ..._3efc19895c8dec89b71ae3778b583fea._comment | 11 + ..._23597d9468347b3d94257f3c02afe1b8._comment | 8 + doc/forum/Detached_git_work_tree__63__.mdwn | 11 + ..._656c737772bf92be2c7a2f33bd2bb0f0._comment | 10 + ..._28ac35a325fba250721d9f1b7c994960._comment | 8 + ..._7128c26bbc8efea04a5a317edf0ca9f2._comment | 13 + ..._a3c22f905748ff2c803e8621c74a87a0._comment | 8 + ..._8063921241760458349e7cb0cadf3d4e._comment | 8 + ..._4510a787255cb03e7d0c3e7b830b7d52._comment | 16 + ..._ffd9c67ecc5b46ae98996018573f5591._comment | 10 + ..._36ca007643c983604fc4aed6ec8cb3d2._comment | 8 + ..._b7a2da4fbace7156e11c48a496a19dc9._comment | 8 + ..._f9fa237a693d28178f0451799209f7e2._comment | 8 + ...between_copy__44___move_and_get__63__.mdwn | 24 + ..._26ee8192af3a62178c1ccf17c6da5ca5._comment | 10 + ...pointing_to_same_special_remote__63__.mdwn | 6 + ..._359f46805e6508d03aadd90429937546._comment | 10 + doc/forum/Direct_special_remotes.mdwn | 26 + ..._50357130a1c57ad2fab70f71925faf02._comment | 8 + ..._e94a722ca056a068bcc16eb822008602._comment | 18 + ..._187036bbfee0508e2914afb51ead3c71._comment | 16 + ..._6bfbf60f2061d49b7d34c844e7e1dea2._comment | 66 + ..._69c34c655e4b153dfc0d1b8580091124._comment | 8 + ..._b054cfc3d3f81873f3faae7eb4f5337c._comment | 8 + ..._5f9d8a0ef2f13f242594848825d29ee7._comment | 8 + ..._work_when_the_buddy_is_offline__63__.mdwn | 1 + ..._f290dd8547176793934f8077374e1c0a._comment | 17 + ..._c358eb51047f333e582bd824be5e0e65._comment | 8 + ..._a2332c0e7b29110b9aed2ab69ce9d8c4._comment | 12 + ...oes_git-annex_version_big_files__63__.mdwn | 5 + ..._0b44003c1dc53adb807298ae452f8004._comment | 8 + ..._ca40b67abd7bd36155d16d0396d7472c._comment | 14 + ..._32de3501feedce51b43ed9dcc399c7a9._comment | 15 + ..._8c65a7f8bda3c876971c2801fb6a76a1._comment | 8 + ...s_migrate_ensure_data_integrity__63__.mdwn | 7 + ..._cef50b32c46f4406c6f918c5866ddc15._comment | 11 + ..._f389b924c8531b35fdf5dedd10fc8000._comment | 8 + ...tand_how_to_delete__47__recover_files.mdwn | 25 + ..._b307bfb0b70d649897f411eb753bd50a._comment | 14 + ..._58a6a1476274b8c4feb3d43ecd998759._comment | 41 + ..._4b857f481db7b2437ac9f8137a8510e2._comment | 11 + ..._828db3bf2863d98c0b0fb4074aa7f066._comment | 33 + ..._cb2063d6a4e08a5c12bf3723d0fa74e0._comment | 8 + ..._1759bcd5708f591f91b9c410f6dc5c54._comment | 14 + ..._2a389f01eb5131042ea1e71a73c9787a._comment | 21 + ...39__t_understand_local_vs._known_keys.mdwn | 19 + ..._10749c0d76e824217dd1ff8c8a6e42a5._comment | 10 + ..._db9f1b6d9638c2b0a7e241c2727e8cfb._comment | 13 + doc/forum/Drop_with_assistant.mdwn | 5 + ..._048f5a31c549afb19b76a65bddd0cd24._comment | 13 + ..._527d7b6a8efa85b904111f179912d926._comment | 8 + ..._c50857506869bb1cd306b66acf37fba8._comment | 14 + ..._1ea37445d5eb96c3efa182e88e07b867._comment | 8 + ..._c08908ea5232cbe067c73ecd12d0e218._comment | 10 + ..._015134228cb865f97326fbb7193636ea._comment | 8 + ..._950759930667588f21659cd6d7065fbb._comment | 17 + ..._773e540e46adc43487323e8d38ceb2d9._comment | 23 + ..._d85d120d7219ea6c179c2619a17bdae9._comment | 15 + .../Effectively_replicating_backup_files.mdwn | 25 + ..._b1ab0da82db076c5244b0dcc95282ddd._comment | 14 + ..._472ab9c973b475f7f3ce7e3934f94281._comment | 19 + ..._826493bd59b81786c1f6a56f1c438004._comment | 10 + ...ypted_ssh_remote__44___synced_folders.mdwn | 87 + ..._7b9b4ef614c90e0b222d24678d1b9026._comment | 10 + .../Error_adding_ssh_remote_in_assistant.mdwn | 15 + ..._eecc0660db4083cc91c5330587f74610._comment | 8 + ..._3e6aad22e8020b12ff7ef914b75281d1._comment | 8 + ..._3ea529e16502071fc0980c6d5c60a036._comment | 8 + ...it-annex_branch_but_not_master_branch.mdwn | 1 + ..._9a909e3d89061adacbd8ed370520250c._comment | 9 + ..._0dd489b264374b7b1065b89e1ff7561b._comment | 8 + ...Request:_add_filename_to_hash_objects.mdwn | 6 + ..._73dc0a9cad486cf2d34faf064c6193b1._comment | 10 + ..._f818b3ecfeb1d1dd83df4668c061718a._comment | 8 + ...equest:_Multiple_concurrent_transfers.mdwn | 19 + ...nnex_copy_--auto_does_the_right_thing.mdwn | 5 + ..._bbac7d0810a79eb1f42a01e1b31d5c4c._comment | 12 + ...pp_support_for_centralized_bare_repos.mdwn | 1 + ...that_lack_a_certain_field_in_metadata.mdwn | 5 + ..._476e52563ccd3ad1b43e3a2da4dfaa82._comment | 10 + ...t_at_an_OSX_launcher___40__.app__41__.mdwn | 3 + ..._97c261b9080c5ecc5424683066bbe05b._comment | 14 + ..._ae45f9703b635c235409682cf252d36c._comment | 8 + ..._066ca31a2e5dfe55a58092ba85231c7c._comment | 10 + ..._a0a9f7f44cadb8036fcddfc21bb0781f._comment | 10 + ..._92240b3f8629f1f2bbe1829700082a79._comment | 10 + doc/forum/Fixing_up_corrupt_annexes.mdwn | 10 + ..._cea21f96bcfb56aaab7ea03c1c804d2d._comment | 7 + ..._5cdd2fcfa61b3f6255e5ad63a3ab00ce._comment | 8 + ...ve_disrupted_the_file_structure__63__.mdwn | 20 + ...e_repo_to_contain_a_copy_of_all_files.mdwn | 1 + ..._702b1b94c735f1b9cde16daa77a80c12._comment | 8 + ..._3df7fcbcd482bb9377ead238b314995b._comment | 8 + doc/forum/GPG_passphrase_handling.mdwn | 76 + ..._11ba130e8bea6698858d0a1a5b01830f._comment | 15 + ..._ef9d58d15b7bbe0b3c7140bb01d73a31._comment | 15 + ..._84eb129c8483b87b3ae6ecaf8b4a8309._comment | 12 + ..._8724297f6d7ac140ab395a940bab0d7d._comment | 8 + ...rating_a_Temp_View_of_Available_Files.mdwn | 1 + doc/forum/Getting_started_with_Amazon_S3.mdwn | 28 + ..._f50883133d5d4903cc95c0dcaa52d052._comment | 10 + ..._e90aa3259d9a12cd67daa27d42d69ab5._comment | 8 + ..._c3adce7c0f29e71ed9dd07103ede2c1a._comment | 8 + ...le__40__s__41___location__40__s__41__.mdwn | 6 + ..._5baffd4d6994bbcb23614b17777a0ffe._comment | 10 + ..._Assistant:_How_to_add_a_remote__63__.mdwn | 11 + ..._d0a3d0090928790d5a05e9f8e5f05320._comment | 12 + doc/forum/Git_Annex_Sync_Delinks_Files.mdwn | 11 + ..._8b03707777a9d8e38715cb77d2a0addc._comment | 12 + ..._a625e7d88e321532ace103548b31b67b._comment | 18 + ..._5278164dab570755ed58afe466dfad42._comment | 12 + ..._e43ede0bdc20de9aa10ab6ce387d8582._comment | 92 + ..._dc71987f0e19f04a920561201f9552b4._comment | 15 + ..._257a89f81858659c4dac4d116e7cf0a3._comment | 32 + doc/forum/Git_Annex_Transfer_Protocols.mdwn | 9 + ..._a870ec991078c95a6bb683d6962ab56e._comment | 8 + ..._71419376ef50a679ea8f0f9e16991c17._comment | 8 + ..._fea43664a500111ca99f4043e0dadb14._comment | 8 + ..._56fb2dab1d4030c9820be32b495afdf0._comment | 8 + ..._a6ec9c5a4a3c0bac1df87f1df9be140b._comment | 8 + ..._1678452fb7114aeabcf0cc3d5f6c69b0._comment | 8 + ...t_annex___39__corrupting__39___itself.mdwn | 34 + ..._bcf50a215e2f8771e098aadfff4c300c._comment | 43 + ..._75f957e7be6c1ad8936c0a2a5374db3e._comment | 20 + ..._ab062b1df3b55fd49852a6220c98249e._comment | 10 + ..._45974f60a81ed2d00b87ffb1a7963c6f._comment | 8 + .../Git_annex_assistant_in_command_line.mdwn | 2 + ..._ce05226307ade8db90ada2dbf290bd58._comment | 10 + doc/forum/Git_annex_assistant_on_EC2.mdwn | 5 + ..._bbdb4611373117a2176c225378110a05._comment | 8 + ..._614ed11f7134137d6376d36a61c293f5._comment | 8 + doc/forum/Git_annex_on_Windows.mdwn | 11 + ..._da24ba0219a164f9ab93fe75dd85127e._comment | 11 + ..._c0880ce3ee13d388ab5b46a740170845._comment | 50 + ..._70c22716fde60d14fd0c7e74acf4a224._comment | 11 + ..._b9232deab6bc5036d7339aa202013218._comment | 12 + ..._27af3c431b50b540d2bd1d3af3f21080._comment | 8 + ..._79fb5ec1b47593ab3355543c5499284a._comment | 8 + ..._75d4450b4608ad0b453bc69159e708de._comment | 10 + ..._e4e5ad0cda34bb597fe1bb804acc15e9._comment | 10 + ...ex_syncing_speed__44___possible__63__.mdwn | 21 + ..._8aa224b3016dc38e4cea8ee1865a3ab6._comment | 12 + doc/forum/Git_repos_in_git_annex__63__.mdwn | 7 + ..._8aaa0d83e8fcd5997f6b0097f3b21622._comment | 14 + .../Git_repositories_in_the_annex__63__.mdwn | 5 + doc/forum/Gitolite_problems.mdwn | 11 + ..._3a41f9b6bddc060b1fa9e35b9ce8b55f._comment | 10 + ..._ef156bf7a1e17496c5fc1f592d45f2ad._comment | 9 + ...ial_remote_when_content_changes__63__.mdwn | 19 + ..._05ee6a1b1943ef3c90634e52233bde1c._comment | 12 + ..._48d82e391812d8ec0d4e6562d0607fe7._comment | 10 + doc/forum/Help_Windows_walkthrough.mdwn | 177 + ..._5fc22393a1b28235eabb2871ad83d0a7._comment | 12 + doc/forum/Help_on_my_usecase.mdwn | 22 + ..._a35b35c7927640f21d47c3df4f91dabb._comment | 12 + .../Help_with_syncing_file_contents.mdwn | 68 + ..._7ec34de3140983739080115c82966bf5._comment | 18 + ..._7dba58d3c62d6f64a270298e4e4329a4._comment | 10 + ..._b26cfa20dc81517d93e760f4809bdc24._comment | 12 + ...in_directory_that_have_content__63___.mdwn | 6 + ..._e897d8fc10474cf865279dc22f22ecb7._comment | 10 + ..._3af326205db6ee04f2a8644baa1dd566._comment | 8 + ..._Android_git-annex_installation__63__.mdwn | 1 + ..._e14757c2c106770c2d7069ace4987b3b._comment | 8 + ...ow_do_I_do_with_.gitrefs__47_____63__.mdwn | 1 + ..._5e235af2ea13fd4f6a226c842f69965e._comment | 8 + ..._50d0c643537175b514d5eae604fb5bea._comment | 51 + ..._3d342c32b14c7edbece596ba970a8415._comment | 10 + ...dropunused_with_an_rsync_remote__63__.mdwn | 3 + ..._8db3cb5348b845eb99c2c829957db9ea._comment | 8 + ..._6cc909d9d74bc1ccb8a7b0d7d234c7cd._comment | 10 + ..._f24d678e4192a70322aa164ed9b71fc8._comment | 8 + ..._9233decd0aaf9211447f36e0d9346445._comment | 15 + ..._e1deb110f752e5495d5c77ec444abac5._comment | 8 + ..._get_rid_of_a_wrong_remote_uuid__63__.mdwn | 16 + ..._b3c215cedba51fb47992ef10c60d6acc._comment | 8 + ..._85415e1fceb737919cc1cd9f37242458._comment | 10 + ..._fb3a591dc60182f7922fc2b5c24f50f1._comment | 11 + ..._aed0be32e579c7a39c63aa7e3ec5f67b._comment | 29 + ..._0c9a6c8a92d6c6e04ae3a8349b799c60._comment | 22 + ...now_when_something_fails_a_fsck__63__.mdwn | 4 + ..._1c14981916dd55376d5e9f95023556cb._comment | 32 + ...ex_assistant__39__s_web_browser__63__.mdwn | 7 + ..._f4402eabda2327da3a0bbc64ed3baf9a._comment | 12 + ..._cdb41f2c7b6bc5bf40d88582dcbf45aa._comment | 10 + ..._ca75e928c245eb23a02b5f40ec69cbb1._comment | 8 + ..._1635f136909711295b9b70d1255e0378._comment | 11 + ..._ee0cbe9498c518de98480a2ad229f685._comment | 10 + ..._799b9d9d3ffbc2c14eca8d442e2aff8c._comment | 11 + ..._71ff45948487e9ac8de809a5ccc3d874._comment | 29 + ...ge_the_number_of_simultaneous_uploads.mdwn | 3 + ..._d5559994ee45a5c185a55c9a4d824aa4._comment | 12 + doc/forum/How_to_cancel_an_add__63__.mdwn | 5 + ..._f768ce5dc7c76f96ee6eb352f167be44._comment | 8 + ...7__ssh_backend_to_other_backend__63__.mdwn | 14 + ..._7973928b1aa9e0fcfeb6bf80885441f5._comment | 10 + ...th_renamed_files_in_direct_mode__63__.mdwn | 3 + ..._fe38fedbbc9e4a9e13bf19950e63c7ac._comment | 10 + ...url_for_a_git_remote_repository__63__.mdwn | 7 + ..._52918b5ec25e55837215439fe1bb1a14._comment | 8 + ..._3a1567c9f484b5e12e5560cdcc2cfddd._comment | 8 + ..._48c3a80c14a85f27d742482b2ccbe628._comment | 8 + doc/forum/How_to_delete_a_remote__63__.mdwn | 1 + ..._8cba186bb67079ff41bf6d0b04613f4a._comment | 10 + ..._33c429ffa7e9e2ed9c5fac760ee8e82c._comment | 12 + ..._e9c5508092ca2983f458b16bf1e07082._comment | 14 + ...tes_with_git_annex_assistant_and_ext4.mdwn | 28 + ..._42ca6cfbbb79fe63514805b8119ac16b._comment | 8 + ..._c94ce6a9767c624e2445a7d9eea40396._comment | 29 + ..._bcda51053b62bbb20ce71a59469e1b26._comment | 10 + ..._48e5b9eae920e5f13812de8d6f6bc640._comment | 8 + ..._787c0bfdc1d309db1486c3a37723a957._comment | 13 + ..._8894beb06443f234e9200b03b5f3badf._comment | 8 + ..._457f62ee3e58f68a55f66c5bde6002fd._comment | 10 + ..._bd2b412116a66107bc0ff0efd7e39a58._comment | 10 + ..._of_files_that_have_been_edited__63__.mdwn | 7 + ..._dccf4dc4483d08e5e2936b2cadeafeaf._comment | 8 + ..._5710294c1c8652c12b6df2233255a45e._comment | 8 + ..._to_handle_the_git-annex_branch__63__.mdwn | 5 + ..._800bd55b322e72f229882d7fd3888b14._comment | 8 + ...ading_a_file_to_a_transfer_repository.mdwn | 3 + ..._17db96492e6bc0e243fc7cb62565c4c4._comment | 17 + ..._e772ea0383ac690cbcbcf125258986cf._comment | 16 + ...n_releases_work_with_git_annex___63__.mdwn | 5 + ..._9298aa55771b68873de02e6a7964bbdc._comment | 8 + ...stant_from_downloading_all_data__63__.mdwn | 9 + ..._fd8b287758ad77b3527ae71017cffabf._comment | 8 + ..._e8e75b4451aaf55461edf2f3d68797ed._comment | 8 + doc/forum/How_to_rename_a_remote__63__.mdwn | 1 + ..._a9bfbd82f7bb47661f0d9e0e0d904332._comment | 28 + ...nterrupted_merge_in_direct_mode__63__.mdwn | 65 + ..._8e2a14842b44844f90c80b862a1b3a6d._comment | 10 + ..._031ab6b5a2765ed9e2b185b24a8cbd78._comment | 8 + ..._93f20519483837c59a75821621e22dee._comment | 10 + doc/forum/How_to_restore_symlinks.mdwn | 1 + ..._c67e752cf7d5431096fab4b3304790a7._comment | 11 + ..._f9ec6096595e2c149c48924e3b54542f._comment | 14 + ..._4ff80729787a2a4e2baf05dd1db37da3._comment | 12 + ...ly_annex_a_file_already_in_a_git_repo.mdwn | 5 + ..._one_shared_transfer_repository__63__.mdwn | 15 + ..._bedaf308cfc70b9e751914a400ebcbc2._comment | 10 + ..._d665b1514253c8aa487ebf8b2728e3b1._comment | 10 + ..._aef42387a3673ab6710fb23e878d7e17._comment | 10 + ..._bfbcc041db472f4808979e6b3d7c4be2._comment | 10 + ...tories_handled_by_the_assistant__63__.mdwn | 40 + ..._1c913395f076ee203caaab057da8afbe._comment | 13 + ..._081793c52bf15c74a7f48a67c49ff818._comment | 12 + ..._f8e0376beb486cf8ce52384ff511ecf2._comment | 11 + .../Howto_remove_a_repository__63__.mdwn | 4 + ..._b55fa4e92bb457ecaa5ca8f5cee7be1d._comment | 8 + doc/forum/Howto_remove_unused_files.mdwn | 31 + ..._f2a7948268ce3cb3967a9fdd8ccc570a._comment | 16 + ..._9b4d198c2d8a52adef3d166a8196fc0d._comment | 8 + ..._441d10901d5c055ac3ed2a6cb61c075c._comment | 8 + doc/forum/Import_options.mdwn | 14 + ..._118a5f978090a3909299876a01c0adec._comment | 21 + ..._21da91f08cb6b28ae3e79ade033db516._comment | 17 + ...de_of_the_object_directory_safe__63__.mdwn | 9 + ..._c25900b9d2d62cc0b8c77150bcfebadf._comment | 13 + ...state_before_the_initial_commit__63__.mdwn | 18 + ..._f9decde3955f10148febc4646fba5a68._comment | 12 + ..._ed32a48edce4f150bedf24cfe91de254._comment | 8 + ..._ef9618850e5e688bac3c646983f00ed8._comment | 10 + ..._4bf460c5826c36b205e418c4f3f7d770._comment | 15 + ...e_git-sync_not_nullify_symlinks__63__.mdwn | 23 + ..._d6f2d2cdc5f4ffde9eee9f3a8c215a06._comment | 10 + ...ebapp_on_Trisquel__47__Ubuntu_Precise.mdwn | 7 + ..._6bd27bd31833336c1df783253378ccae._comment | 10 + .../Let_watch_selectively_annex_files.mdwn | 27 + ..._8379de87d16502d9aadf252da01e4d9a._comment | 10 + ..._2219ff6b4dc927eb2a299cd1af90aed8._comment | 8 + ...ad_of_broken_link_when_possible__63__.mdwn | 4 + ..._ce0464d5fca6ada9f1477831fd47ce09._comment | 8 + ..._or_actual_files__63___Confused__33__.mdwn | 21 + ..._779cee2448d7070b1dd636d01296c01e._comment | 8 + ..._bccda88697ab7beec0b9fe9ee0230688._comment | 18 + ..._c2a9da3f03b55ff294dc0d2010380119._comment | 8 + .../Local_and_remote_in_direct_mode.mdwn | 7 + ..._45f89ebcb6092d1b2582feebc8a5e9d7._comment | 15 + ..._file_results_in_file_changed_warning.mdwn | 20 + ..._25a04c7345f5b626aa71524603c833ed._comment | 8 + ..._7146a3c69749b9b1001fffc6e7a8bcda._comment | 12 + ..._fd39e6ceffd9bf0709658c34945d8699._comment | 16 + doc/forum/Looking_at_the_webapp_on_OSX.mdwn | 18 + ..._68820f2f469356633c1abb18a47e0c59._comment | 12 + ..._4ce86546d8a135df9cfab46b4612fa0b._comment | 23 + ..._6d398a2cceff14a1b774b85ee1725073._comment | 12 + ..._5e503787a4b1d3534c5e20da5480b763._comment | 8 + ..._c735841bc230efc61594ea013fc2902b._comment | 8 + ..._0e489fbfc89d282e9eb47f1b814ff70c._comment | 8 + doc/forum/Lyve_Home.mdwn | 6 + .../Make_whereis_output_more_compact.mdwn | 13 + ...git-annex_a_self-funded_project__63__.mdwn | 10 + ..._4a1ba95b7231ba973ddb672d2419e28c._comment | 8 + ..._7c476ae92e63c991f229708678874ca2._comment | 8 + .../Making_git-annex_less_necessary.mdwn | 5 + ..._03faaa3866778d24cd03887b85dc9954._comment | 12 + ..._2db02a94dffd525885c9d7fc6c5fa464._comment | 12 + ..._429ec656e0ac02f98843f8d7f3c02d6a._comment | 11 + ..._384813dd022dfd9c1ef14e0f1479a123._comment | 18 + ...ead-only_medium___40__E.G._DVDs__41__.mdwn | 118 + ..._a061d300b718ad943c940e122cc57220._comment | 23 + ..._76529080054407570611b4357ce4f3ed._comment | 8 + ..._9acf5ce41a023f3848a51891cceeb51b._comment | 21 + ..._25e65ee3949e7d918376298cf11585f2._comment | 10 + ..._8a71ca048f9de29a198a6afb17d5315e._comment | 11 + ..._e3d1d3a3d3d831432ec940a8ab6f31e9._comment | 14 + ..._26a33eae98b4faaf6baf6635e3d28a8f._comment | 27 + ..._49ac298d39c824b0e52a239961463e09._comment | 14 + ..._55a4a3616ea59654da1c2f9902561e3b._comment | 13 + ..._92a2af3e0e328bb48bcc67a69187ee57._comment | 13 + ..._f6e39e71882d55cdc061166aea3e2bd3._comment | 26 + ..._6c45a6264d69e22800c329a0f8a2d470._comment | 8 + ...multiple_annexes_with_assistant__63__.mdwn | 13 + ..._ba8c70e4a46441b48ad910625636eee5._comment | 8 + ..._4b4f0a7d84a51ae92536e2c190256069._comment | 10 + ..._86daadc565f96db5db13b6dbcbc66db3._comment | 8 + ..._e43d71ddfdfdb7bcb13bfb894de6a5ec._comment | 8 + ..._e94d33be83b45918d1a39d6e16fba4b4._comment | 8 + ...tiple_repositories_concurrently__63__.mdwn | 5 + ..._ebec1ddad71e961cdc9b21cbddfbcdaf._comment | 10 + doc/forum/Manual_Setup_of_a_Central_Repo.mdwn | 1 + ..._3a163fd5629dc40423f1290a78ae1c07._comment | 12 + ...l_mode_option_in_assistant_auto-syncs.mdwn | 11 + ..._4a0468b6ca2ffff8ef8f19800597567d._comment | 10 + doc/forum/Manual_webapp_behaviour_on_ARM.mdwn | 15 + ...Missing_git-annex.linux__47__runshell.mdwn | 44 + ..._f29a5105649579ef15e79d983c4e1f8e._comment | 8 + ...ithin_the_repo_without_copying___63__.mdwn | 19 + ..._9e3290138133d5a23a80f72342f47ec4._comment | 8 + ..._232b77894dda51d02cbc34bd25d3213b._comment | 13 + ..._d35ac1bdb3fa6e303ad92348ba174158._comment | 11 + ..._4b443ec6b47eaabe214d0c2222083e4a._comment | 8 + ...s_file_content_without_doing_checkout.mdwn | 4 + ..._f114b75b29123453758b493fae7f5167._comment | 8 + ..._e377b7614c2961b460a10e285f3db274._comment | 10 + ..._d251958795ab0867c65cf182e54a6ffe._comment | 8 + ...r_some_weeks_with_git-annex_assistant.mdwn | 57 + ..._9d4019a54fb508e286a5d6d2660361d9._comment | 26 + ..._109534a45881ce94a4586c8a83945f9f._comment | 85 + ..._build_instructions_for_Debian_stable.mdwn | 5 + ..._8c1eea6dfec8b7e1c7a371b6e9c26118._comment | 8 + ..._f6ff8306c946219dbe39bb8938a349ab._comment | 21 + ..._bcda70cbfc7c1a14fa82da70f9f876e2._comment | 8 + .../Need_some_help_to_fix_my_repository.mdwn | 31 + ..._f0d279c530b796b2c93d793f85d147e8._comment | 13 + ..._a3fcfa1f8eadec5fa8a9efacca174048._comment | 10 + ..._7878f9b76ddfa3392c9ec6a1810cb745._comment | 10 + ...nnex_integration_mode_for_Emacs_users.mdwn | 3 + doc/forum/New_user_misunderstandings.mdwn | 24 + ..._c1785924109b5d5cde9aa3d3460cf955._comment | 10 + ...to_connect_to_the_Jabber_server__34__.mdwn | 5 + ..._59158afcedac18a7285d57491b2a468a._comment | 8 + ..._2a70ac08bb95774415b09dab7d7f8605._comment | 8 + ..._92a52b523ed4c68b70ddcabc2a050b76._comment | 12 + ..._c52a75761ea107f6d69c09bac64f0f0a._comment | 12 + ..._2685e3a87464ccd37d593516d94ba5cf._comment | 10 + doc/forum/No_SSL_traffic_for_S3__63__.mdwn | 8 + ..._f509bf273896180e6df8c771438dd093._comment | 11 + ..._358635d19c82202c63014ca84de7fc3b._comment | 8 + ...git-annex_status_v5.20131224-g692aa01.mdwn | 16 + ..._b014f1edcb7ce39da9b582683d3b80c0._comment | 10 + ..._24602de6cfe1f3d988c5105e7266a518._comment | 8 + ...Not_sure_how_to_get_my_s3_remote_back.mdwn | 31 + ..._ed35a6ec605e8f79ec107856af6d1a46._comment | 18 + ..._e48b6efa42159dc83e1be11bfb54abcd._comment | 14 + ..._b58232d0e3fa4649565c0c7d4ce2e82e._comment | 31 + ..._85368b60091dc3ce2efb58013ffe9f83._comment | 10 + ..._e65281bef23e0076936c508728a87897._comment | 25 + ..._fffb59ad5a197d2980dd0ec35cf4aafa._comment | 10 + ..._0cfcc2075bff556b9fde5acc3dc1d599._comment | 8 + ..._6fe2ff1282fb14a4ce26ef8dc775d07e._comment | 8 + ..._64338d2d77dcbabd16b55eb145f40dc6._comment | 12 + ..._dd66c9ea0c83388f6826751944330d10._comment | 16 + ..._dc0c5e395e4c443b7227afdb157194e5._comment | 10 + ..._3c0ea4c76cdd889707f7308576e3efa0._comment | 65 + ..._36519ee4499a19f0864e4fcd264e9933._comment | 20 + ..._85b23f375e53469fb09b24b945b3aba9._comment | 17 + doc/forum/OSX_Mavericks_anyone__63__.mdwn | 3 + ..._3075b02aeb57adcbf4addf9fb4c123ba._comment | 11 + ..._c2b6110fc4a3d3481ed8a4b48efb9635._comment | 17 + ..._7df9ba63cb1f385681242b4b58d6a87c._comment | 8 + ..._740fee31c4ca9d84428f97f63ffc075a._comment | 8 + ..._sshd_behaviour_has_limited_paths_set.mdwn | 12 + ...kell-platform_statically_links_things.mdwn | 17 + doc/forum/OpenOffice___47___Libre_Office.mdwn | 5 + ..._98ed542fedd820d47bf8deb7d3232725._comment | 8 + ..._f313fdaa23863c2ae99cfbfe9ec2e1e0._comment | 8 + ...___whereis__44___find_and_status_cmds.mdwn | 5 + .../Overwriting_data_without_getting_it.mdwn | 3 + ..._f1c0199ee9bffcc84287370b89361294._comment | 26 + ..._6a1d08dbca206129ef6cf8aa97daeee1._comment | 8 + ..._52958e76e506fdbb6b533681ab619b3b._comment | 8 + ...ickey__41___On_second_Step_...___63__.mdwn | 36 + ..._6c74f0b43c457fe97b2d8630ca4fde29._comment | 10 + ..._b7a384e853e1756a684774348fad29e6._comment | 22 + ..._3a8a7f51cb04a92c576549d379b57248._comment | 12 + ..._582ad3ba0c62a77b08a10b37a780c670._comment | 15 + ...Please_fix_compatibility_with_ghc_7.0.mdwn | 1 + ..._d1d10217ebd0151e947b3a6cd37399ce._comment | 8 + ...new_releases_not_shorter_than_11_days.mdwn | 6 + ..._da3d39de5be47ebe8b25a42ed1f36510._comment | 8 + doc/forum/Podcast_syncing_use-case.mdwn | 34 + ..._ace6f9d3a950348a3ac0ff592b62e786._comment | 10 + ..._930a6620b4d516e69ed952f9da5371bb._comment | 8 + doc/forum/Poor_man__39__s_IMAP.mdwn | 6 + ..._258ff23c462dc88b88ced405c4f5040f._comment | 11 + ..._c88d1abdda4cb526a6ee45a710c75bc4._comment | 10 + ..._3847e371db1c2788c075e7dca1fbd33e._comment | 8 + ..._cf6cc21f2cf2aa5c949844e24a7b4075._comment | 8 + ..._d861fa69475ce526841b3195be8ee356._comment | 10 + ..._1e81bd4bb62652bc674cdcd7ed57ac5c._comment | 12 + ..._b3929281dff6078d77f1b9ae42e25bb6._comment | 16 + ..._69506e8c519196f44b9ed15b32f00106._comment | 22 + ...able_version_of_git-annex_for_windows.mdwn | 22 + ..._e5e60fa8d104a09152a8164d5a906aec._comment | 10 + ..._d8d1aa0920351e880ba6678bb97585de._comment | 10 + doc/forum/Post-Kickstarter.mdwn | 5 + ...in_directory_tree_below_objects__47__.mdwn | 77 + ..._5dd978f9b5a0771f44ab9e086bf5a07f._comment | 14 + ..._9f51947b35ee04e473655e20d56c740a._comment | 16 + ...revious_versions_in_direct_mode__63__.mdwn | 3 + ..._352d460acd5500587e679d934180eee4._comment | 10 + .../Problem_compiling_current_master.mdwn | 12 + ..._135df61ec850c06e3b48ccfef7b5b031._comment | 8 + ..._fb3e27b6014e84bd919a7a4a95e39ef9._comment | 20 + ..._b737b3945103c5e2aa798b4e65fbce06._comment | 8 + ..._28c1b335ae388d4e1f22b711ac1c001f._comment | 8 + doc/forum/Problems_syncing_with_box.com.mdwn | 26 + ..._8db642849da4d42cd9a43142e2b7cb70._comment | 12 + ..._cd18f33647aebc04af5469e4ce1fbcd2._comment | 11 + ...using_submodules_with_git-annex__63__.mdwn | 1 + ..._c7a927736d419d3c31c912001ff16ee4._comment | 7 + .../Problems_with_large_numbers_of_files.mdwn | 8 + ..._08791cb78b982087c2a07316fe3ed46c._comment | 22 + ..._0392a11219463e40c53bae73c8188b69._comment | 25 + ..._537e9884c1488a7a4bcf131ea63b71f7._comment | 8 + ..._7cb65d013e72bd2b7e90452079d42ac9._comment | 29 + ..._86a42ee3173a5d38f803e64b79496ab3._comment | 14 + ..._4551274288383c9cc27cbf85b122d307._comment | 11 + ..._d18cf944352f8303799c86f2c0354e8e._comment | 8 + .../Pruning_out_unwanted_Git_objects.mdwn | 3 + ..._0cf7a12bfa2957260f4b2f79b0cadf2f._comment | 8 + ..._7472943c02cfe2808b0d566e06caa1a5._comment | 8 + ..._6a1e7a83d94394454fc085f6d2728cd7._comment | 8 + doc/forum/Purge_a_remote.mdwn | 2 + ..._78b3b77f457c65d31fd8a5abf714905d._comment | 8 + ..._dc65719157dee63b3979563ed57ee0ce._comment | 10 + ..._63e0280273b816fa4b837724e102f813._comment | 8 + ..._7fad1c4798ca03a4095ac3241c279f6d._comment | 11 + .../Push__47__Pull_with_the_Assistant.mdwn | 1 + ..._f7b63d379c2d21794adf8658f546f8a7._comment | 10 + ..._aec8cc20576e7ffd5a8be4348d1a0073._comment | 21 + ..._git_repo_to_AWS_S3_from_behind_proxy.mdwn | 9 + ...Reappearing_repos_in_webapp_and_vicfg.mdwn | 43 + ..._bd977e864ae89816fa7f4ff69879b15f._comment | 8 + ..._05749f9e75689d0111339b7126c12300._comment | 15 + ..._b1531994eea0fbbf4cb097e604378a53._comment | 12 + ..._f1eba3e8aa4116e3c20747ec1d6e24e5._comment | 12 + .../Recommended_number_of_repositories.mdwn | 4 + ..._3ef256230756be8a9679b107cdbfd018._comment | 15 + doc/forum/Relocating_annex_directory.mdwn | 1 + ..._13ff5438baa1db110beb6aab3a783def._comment | 11 + ..._6d88ff03fcf00ae872442e8a86c968ed._comment | 10 + ...te_server_only_for_the_git_repository.mdwn | 3 + ..._d4d8d8cfebf9a98ca8878c5684d5bb50._comment | 10 + ..._a62dec8ab98ac7bd65059a9e425a01e2._comment | 9 + ...g_files_not_found_by_git_annex_unused.mdwn | 29 + ..._420c6230e68de0a0ac7d7da91ac60801._comment | 8 + ...__dumb__34___client_without_git-annex.mdwn | 11 + ..._077c492fd37d335f74a5c886ff0d524f._comment | 32 + ..._00e6576e3e60d2650461eeb0f918e6e5._comment | 8 + ..._c36a9562c53ac683b62fc4471405aa2a._comment | 15 + ...-annex-shell_to_a_specific_repository.mdwn | 25 + ..._66544520bff71181e4a03ca583b0b458._comment | 12 + ..._2a210255e8535712c71fa183e56ab600._comment | 13 + ..._52cd4bd9694b2100b0e0dd2eafa9e828._comment | 8 + ...rieve_previous_version_in_direct_mode.mdwn | 5 + ..._ca3a999ed64c42b8df810115de205d2f._comment | 12 + ..._1292b34ff6d9976b2bd08748e1ba4e7a._comment | 8 + ..._699e816c0397f6db924feeab906f1151._comment | 8 + ..._d900388753de5870b7b9c0e8b8c06ed7._comment | 8 + ...Revert_file_linkage_to_original_files.mdwn | 9 + ..._898ca2c9976e92d22470c7404aa9813f._comment | 10 + ...n_a_server___40__no_X_available__41__.mdwn | 2 + ..._dd75d78ef63f2689199a302ed1846017._comment | 8 + ..._df654df60c5fa6a84d786d248928a352._comment | 11 + .../Running_assistant_steps_manually.mdwn | 20 + ..._e14e0a1d55d01cb4f67a94bbe349b872._comment | 20 + ..._3192f614c929b8060d4fbde56a7adec1._comment | 14 + doc/forum/Running_out_of__inodes.mdwn | 17 + ..._abc73d9ad662ef642337b683bf0a0253._comment | 12 + doc/forum/S3_Host_Question.mdwn | 11 + ..._8c8ecea703405753e47e0da5e8325929._comment | 11 + ..._3d6fa3147d59a5e0d10b005388b23c7a._comment | 8 + ..._797edf3ad41561ab8960f3b28d20611e._comment | 8 + ..._Jabber_account_for_different_annexes.mdwn | 1 + ..._90c3954fe11980eef42b5f5d34f83488._comment | 8 + ..._802600b3568e5f94d0550092b22975db._comment | 8 + doc/forum/Securing_a_shared_ssh_server.mdwn | 3 + ..._ea971b57d94db5b8d487f728faa5e9a8._comment | 10 + ..._421a19f6e1fb40db6ee205daf8e3f867._comment | 15 + ..._acdbf92f646dbbf691621f08b3d94c26._comment | 12 + ..._67533d08e1b8706b844262e9c483d982._comment | 15 + ..._bf193e02b388b4358632a169d2425b5c._comment | 10 + ..._50d391992cd444080ebc70db30b215c5._comment | 9 + ...ial_remote_with_non-standard_ssh_port.mdwn | 13 + ..._1eb6990e93ec92cb6fd7dbee59f31072._comment | 13 + ..._c85d5167e7ccce1ecf1de396e72ce7bc._comment | 8 + ...files_of_a_repo___40__Assistant__41__.mdwn | 6 + ..._ec0d56cb31b918023a9184cee168b406._comment | 8 + ...are_with_friend_copies_only_sym_links.mdwn | 38 + ..._a8d22dfefb219f0c9130cc294364b198._comment | 17 + .../Sharing_annex_with_local_clones.mdwn | 1 + ..._2b60e13e5f7b8cee56cf2ddc6c47f64d._comment | 12 + ..._24ff2c1eb643077daa37c01644cebcd2._comment | 8 + ..._5359b8eada24d27be83214ac0ae62f23._comment | 8 + ...Simple_check_out_with_assistant__63__.mdwn | 2 + ..._ade8a0743ef1ec933c8a40ed64eeac2d._comment | 8 + ...y_finer_control_over_file_whereabouts.mdwn | 18 + ..._bcb883d46a637dd1a8ef9a92733d202a._comment | 10 + ..._b7a8b9eaf114f883866fbf2be51b622f._comment | 8 + ..._6236bcfa9beba705ead3ec2141c5d835._comment | 8 + ..._ea935b37ca93e73c85d04df7c9bf6057._comment | 12 + ..._f89a8e38283ac4c8c4a3b74c413d67a1._comment | 8 + ..._07a0a754a089c46ff69dc97ea7ba9384._comment | 22 + ..._e884c001a556a0c693d1cc9a97c068ac._comment | 8 + ..._3e8674b5857e4994dfbc26be4f4b2855._comment | 25 + ..._7aeabc2e52a39423e83fbd04560e8f91._comment | 8 + ..._53b95449cfad2fe0f72d2ad642822c03._comment | 15 + ..._a17c102a45e4fc3f101a79acb8eb4081._comment | 18 + .../Some_mounted_devices_not_detected.mdwn | 3 + ..._0ba07b95f12f57ea63bb450b88430c45._comment | 8 + ..._4f8c7bcd0f20dafa5635a3580ec8d1f6._comment | 13 + ..._06c0db7d670d9b82823102d22db15a36._comment | 10 + ..._80820a29361c5be4a94672dacfdefa6f._comment | 8 + doc/forum/Special_remote_without_chmod.mdwn | 12 + ..._4f5f9506cae72a1f321296fc5a5f339a._comment | 8 + ...toring_uncontrolled_files_in_an_annex.mdwn | 3 + ..._175645a90be0c79221c129308adf643e._comment | 27 + ..._d29f214eadfe3bfd098bbc3bcf07129a._comment | 8 + ..._286b502e7906cca50e9e747db735bc88._comment | 10 + .../Stupid_mistake:_recoverable__63__.mdwn | 31 + ..._00ceb3a5e37825c4bbc806f532893706._comment | 23 + ..._cbedc29678d9b6af3b3c0bb1915d2391._comment | 12 + ..._86aa4d92a1330811862da1ba568b3037._comment | 42 + ..._6d15bf8a3c3c27cc92957070161675a9._comment | 12 + ..._f836b9b1d03d94c49e3798961790b2ba._comment | 21 + ..._ssh_server_back_into_android_version.mdwn | 9 + ..._5c2f376a82458c6387560355940419d3._comment | 12 + ..._6321dec0b2f22f841f3cb986e063113f._comment | 8 + doc/forum/Sync_with_one_offline_peer.mdwn | 11 + ..._3859d842d4f7e2ef44877b05ebe881fb._comment | 20 + ..._c9ba3983b37b0c1868269616fd81e518._comment | 14 + ..._28b9c003b4560c3ce90c9ebf808b091b._comment | 10 + doc/forum/Sync_without_jabber_account.mdwn | 9 + ..._3e95ac2e67451f953cf0538094109f8b._comment | 10 + ...ize_large_files___40__VM_images__41__.mdwn | 10 + ..._619f6ed2d7da5832ab253d61b6dd8044._comment | 10 + ...yncing_machines_on_different_networks.mdwn | 9 + ..._1c3523c722c178a96b096a68b9be4165._comment | 8 + ..._d7b14ffee65072329cfe9ab08a0dba50._comment | 8 + ..._65d1dae9b76fccb5f2b8fd8c69b60075._comment | 15 + ..._2ec67428af69d6c0ea051c6a67d58905._comment | 10 + ..._5ce093f82a2aad3fd8d7ccd5fdcab94f._comment | 8 + ..._a55982c28d7b90e0b70ec2bb5e594e08._comment | 8 + ..._c519d546e1a2a4e834609f3de3a605b0._comment | 8 + ..._84a822238ddbaf211cce5f527c3559d3._comment | 8 + ...emote_from_a_different_computer__63__.mdwn | 4 + ..._cd55d06a4065b9d3f14d50674c3fcaf7._comment | 8 + ..._25cbdf478091af9923090e049c432a7d._comment | 22 + ..._7e71d355457d6b1a0391d4cdae6895e6._comment | 16 + ..._a73f67f2fcf0762fbd7c8366b3844af6._comment | 11 + ...nisation_between_3_repositories__63__.mdwn | 11 + ..._ca5192a26950627a1c2efcb55d6d2fa3._comment | 10 + ..._while_committing_it_repeatedly__63__.mdwn | 3 + ..._3cbe520b184d323219cb402ff046c3b4._comment | 29 + ..._6afe7f593e955db2eefe87d9fa01882b._comment | 8 + ..._209399487fc4f76b29f03ad82dbc2d6f._comment | 8 + ..._f33fd6f72cb9ad7dd20a04c82199413b._comment | 26 + ...ory_with_some_hg_and_git_repositories.mdwn | 1 + ..._9fc3f6c2f7379755e0084a850fa9acd4._comment | 10 + ..._f024d6a105143af1e06aafe49661ee06._comment | 8 + ..._aff0093c38bda8b093f05e8cbe8775e9._comment | 8 + ..._c889050d3079edefc4633451bd5baff8._comment | 11 + doc/forum/Transfer_remotes.mdwn | 3 + ..._c08cf3bda00d7f20a3ca3d0fdba19c9c._comment | 8 + ..._98930629d398329f1161135464a966a5._comment | 12 + ...stalling_from_cabal_on_debian-testing.mdwn | 15 + ..._0d3e9d7cffafc34bc212557e8bbb987d._comment | 12 + .../Truly_purging_dead_repositories.mdwn | 1 + ..._a4c75d49714b3543a9f1617a15d4a2d1._comment | 8 + ..._3da60a02e7323a204c5c5dd02ba04d6c._comment | 8 + ..._2576e45436008ff5a7ae5a38cade658e._comment | 8 + ..._477e3c213c5a5d4a33afd42a5b94c718._comment | 10 + ..._backup__34___repository_groups__63__.mdwn | 18 + ..._b8702892280447193e6e80be22a580a0._comment | 11 + ..._50cafde7e30b928480d1f142ddd763d2._comment | 10 + doc/forum/USB_backup_with_files_visible.mdwn | 7 + ..._2832f8ae24dfb0f101e06f7c18283028._comment | 10 + ..._6163e01aa441f8435091f026cc6da337._comment | 8 + ..._ee92ff320eb5d9a031bdd1896aee0d86._comment | 11 + ..._437c8342c0b65e3a89129800313eb73c._comment | 10 + ..._5e10cffe8465ea4ecaa71c03a4c29ea4._comment | 8 + ..._add048a16837f7940a859f21426cdbe9._comment | 8 + ..._de227ca9911fe57d7a6d3e037f574fe9._comment | 14 + ..._0c0ed0e038f7f0e2d2d4ed69b7b29fbc._comment | 10 + ...nsfer_group_keeps_growing_-_assistant.mdwn | 22 + ..._0a6f6054d70009979f4a036e24b7c500._comment | 10 + doc/forum/Ubuntu_PPA.mdwn | 3 + ..._b55535258b1b4bcfc802235f0cba075d._comment | 8 + ..._adc4d644fed058d1811acf0b35db9c18._comment | 8 + ..._fc9cd51558c47718f243437202a11803._comment | 8 + ..._3a8bbd0a7450a7f5323cd13144824aea._comment | 12 + ..._2e1beaeebda0201c635db8b276cedf20._comment | 12 + ..._bd99fb70399fc58d98781a89c6d38428._comment | 8 + ..._c3f7ec8573934c59d70a48e36e321c13._comment | 12 + doc/forum/Un-git-annex__63__.mdwn | 6 + ..._6059265afb66190d325083e0f28bcf33._comment | 10 + ..._fac4bfb81dbbf0dc82059aace261eb51._comment | 10 + ...ndo_Git_Annex_Changes_To_Linked_Files.mdwn | 7 + ..._568dde820c2608d86d05b07444146a26._comment | 13 + ..._a8cf71cdf1217d9c8596cd9006eb83f5._comment | 8 + doc/forum/Unknown_remote_type_S3.mdwn | 5 + ..._2aea2cd51286c809427d16519606cd37._comment | 8 + ..._06f775062cd30767979fe56bcb3cf7bf._comment | 8 + ...files_when_assistant_is_running__63__.mdwn | 13 + ..._3f4aadf0c856c81e15c6f5ae7f1992b4._comment | 10 + ..._a76797ee9e05e43af7947508cadd7bed._comment | 9 + ..._syncing_only_a_subset_possible__63__.mdwn | 13 + ..._a0a272a0931b27e5c94b93e42656b62c._comment | 10 + ...tead_of_re-downloading_from_S3_remote.mdwn | 3 + ..._cfb6021a36eee087705967a69967f327._comment | 10 + ..._7268b194ba72331858bc3274996b780e._comment | 11 + ...s_on_BTRFS_instead_of_symlinks___63__.mdwn | 1 + ..._85806316ed28d7a891f04fab4027141b._comment | 8 + ..._ecb411a2c4d67917b734a90bd460d44b._comment | 10 + ...__while_also_cloning_and_syncing_too..mdwn | 11 + ..._30205c1ba18e5dca2314f593e1a0e236._comment | 8 + ..._f8df728de28218a6b060ae9f08adac79._comment | 8 + ..._ba438b3a371261ee841665f1ae57eba2._comment | 8 + ..._9f72e6c7c14a77330297526aef260762._comment | 11 + ..._a06e8c9b4e30c1cd6cbed40d2db50abc._comment | 10 + ...__41___to_manage_photos_with_Shotwell.mdwn | 13 + ..._5e8d54daf6b7ff357619ac65fe39a2d7._comment | 12 + doc/forum/Using_Linux_static_builds.mdwn | 25 + ..._22fd266cbe68af3e754a10f1f1295e9b._comment | 13 + ..._36f69f30117ff8696425a754ab19a08b._comment | 8 + ..._64506833dad0202626239e00d1eb6490._comment | 23 + ...sync__34___to_sink_all_branches__63__.mdwn | 9 + ..._ef3d5c5e2600ffa36dd933c8a42cdf96._comment | 16 + ..._424b0c6fdfe87ca08f5d408b7684ab08._comment | 10 + ..._adaf9114c69f1268330adcebd8018fa0._comment | 10 + ...ltiple_independent_client_repos__63__.mdwn | 36 + ..._c61c28600f1079fb03ddabc950307f27._comment | 11 + doc/forum/Using_for_Music_repo.mdwn | 13 + ..._3488ed85ad98f14cb17f229225ece26e._comment | 10 + ..._c794648878cfc77558f8db862271f997._comment | 25 + ..._8c5e820f5ff7d717d64b1fd66927941b._comment | 8 + doc/forum/Using_git-annex_as_a_library.mdwn | 1 + ..._1f8e74c5856f21c53d5a91892cbef0c6._comment | 8 + ..._11a243fa7d8ac947aa9a798228dbd191._comment | 12 + ..._ac52304a096ebc66967352efaffb060a._comment | 8 + ..._d502fea60bf3a82f8a50f72a90a80c25._comment | 8 + ...ng_git-annex_via_command_line_in_OS_X.mdwn | 3 + ..._1c9e121f60fb6868c07f1a53b03c4ed0._comment | 8 + ..._52d8ffba82e29ac2722a8e43e469cc47._comment | 9 + ..._which_only_has_exFAT_and_no_symlinks.mdwn | 8 + ..._b9f202a30ba7e3bc264064d24454c099._comment | 12 + ..._1334a8d9f4bb60f3bf3ebabc656d98d9._comment | 18 + ..._076f22d05fad140068a540e4d835106f._comment | 8 + ..._c8446ee1b817f1824fa0df07e742015c._comment | 12 + ..._f746c1b85ee8e4b57b6819ccceabd28b._comment | 8 + ...7__FTP_TV_NAS_with_preconfigured_dirs.mdwn | 5 + ..._bd73c8d10028e1b45da9ea8f657e5064._comment | 10 + ..._16c3c994ee8fcb466e52ca0e812e5915._comment | 8 + ..._ac60f6edb76bdd541711e472eec9591a._comment | 10 + ..._2194f0600d9a90f0d9c947ea9cc213a3._comment | 8 + ..._eb7d13f6b6fa674a2536bde51bfc3fd1._comment | 48 + ..._ae323b16ddb9342e91be955408eca3b1._comment | 8 + ...ker:git-annex_has_text_relocations....mdwn | 7 + ..._fee360353f0b46aab6ee7a902c0837bb._comment | 11 + ..._me__44___what_am_i_doing_wrong__63__.mdwn | 16 + ..._cdac15fec6fc41d5487b7f653fa718a4._comment | 14 + ..._82050b7dc367ca5968ab0306db9bd7e3._comment | 10 + ...__assistant__47__webapp_documentation.mdwn | 12 + ..._adb377589dbae7fc91001df235c6b48e._comment | 14 + doc/forum/Webapp_not_watching_repos.mdwn | 1 + ..._02735050122afdb6498d91b462d32767._comment | 12 + ..._8ab2d4c18ddc99774e44c4f4401bfa57._comment | 12 + ..._b448aa5a95a57a5228b361390e5fc838._comment | 8 + doc/forum/Webapp_on_ARM.mdwn | 6 + ..._82ac40cef5b59070136527b8d81a5ce2._comment | 10 + ...vior_with_OS_X_Finder_and_Preview.app.mdwn | 12 + ..._8c8d86790a9d31518f9bb96a2d2dafee._comment | 18 + ..._b538dc2c6f122b9ce5f7569de1b03f3e._comment | 8 + ..._16e6724fa184392d4decbe0c4eb6efe6._comment | 14 + ..._e514fe2d4d0ad6a10e281939e6ab4266._comment | 15 + ..._e0eec765f72f7bf6f5a2a92c9b5dacad._comment | 10 + .../What_can_be_done_in_case_of_conflict.mdwn | 7 + ..._5ca86b099dfa08a50f656ea03bf1dcd9._comment | 12 + ..._69ee17959a92bb8359c0fd7b2a9d8dfb._comment | 10 + ..._017f4bac57a040c496e0c9d068dcfd9e._comment | 41 + ...hat_happened_to_the_walkthrough__63__.mdwn | 1 + ..._70db0e3cfb1318e95671c23726e5541d._comment | 8 + ..._f9305dd19b9b5f35e66d915b8c30374b._comment | 7 + ..._34___on_an_existing_repository__63__.mdwn | 1 + ..._d844cfe5f9907a766e871b64d68966c2._comment | 8 + ...o___34__git_annex_mv__34___file__63__.mdwn | 1 + ..._02d305f307b4d2ff7acd98cb36508a2f._comment | 10 + ...r__34___and___34__remote_server__34__.mdwn | 3 + ..._68734a118b7dc0c88ba67eca20953a55._comment | 10 + ...an_encrypted_ssh_remote_is_left__63__.mdwn | 1 + ..._67ee446ca6d66e2c259ea771c2c9a2b2._comment | 12 + ..._6d3cce3c8048e4aea8f0ed76473f6af1._comment | 8 + ..._bd506e1ca7307660b3b9769eb97beddb._comment | 8 + ..._cloud_providers_are_supported__63___.mdwn | 3 + ..._1f9398840144e0452a2fed9336046547._comment | 10 + ...be_enabled_for_removable_drives__63__.mdwn | 7 + ..._4341898d5ae4f09a5b06d24f5fe6192d._comment | 8 + ...up_remote_use___126____47__.bup__63__.mdwn | 5 + ..._da9c7c0e93aefc2da7409de5b138d86f._comment | 8 + ...Will_git-annex_solve_my_problem__63__.mdwn | 7 + ..._35acbdd1a7727df204d776c2e8f02b53._comment | 8 + ..._230256c19ac139dea207d89c06f70782._comment | 8 + ...x_work_on_a_FAT32_formatted_key__63__.mdwn | 3 + ..._426482e6eb3a27687a48f24f6ef2332f._comment | 8 + ..._af4f8b52526d8bea2904c95406fd2796._comment | 8 + doc/forum/Windows_S3_host_issue.mdwn | 11 + ..._8c0a1e84713a04a25fdc1f74919d34aa._comment | 10 + ..._06ecc76797c430b27a2e24776761d043._comment | 8 + ..._1715557daa15b9e9e17b4850141e62af._comment | 10 + doc/forum/Windows_support.mdwn | 6 + ..._23fa9aa3b00940a1c1b3876c35eef019._comment | 9 + doc/forum/Windows_usage_instructions.mdwn | 25 + ..._d43dbd9406da3b9747b147715eca94ac._comment | 8 + .../Wishlist:_Bittorrent-like_transfers.mdwn | 5 + ..._13544d54fb0418af4ca9200cdb045d91._comment | 15 + ..._9a7dad35bf80c684ad97892420d7370c._comment | 16 + ..._e5de748bc5da12a4a01e08cde2407dd1._comment | 14 + ..._e51530178f1e034c0fdd5c9aa9945567._comment | 8 + ..._81ea9c129d8c02097f09ef8c68f1bb11._comment | 27 + ..._3b5798414f89686526da3dfa72c0c4f2._comment | 10 + ...hlist:_Don__39__t_make_files_readonly.mdwn | 3 + ..._7148527961e2d27793810966588c8d35._comment | 10 + ...s_without_copying_the_file_data__63__.mdwn | 6 + ..._1cf4ab29dfa2cff59b86305fc0018251._comment | 10 + ..._f5ebb7f43dcef861ecc13373fb1e263f._comment | 15 + ...cting_files_based_on_meta-information.mdwn | 15 + ..._818f38aa988177d3a9415055e084f0fb._comment | 15 + ..._97e2ed48bd552d02918c4f98f963e6e1._comment | 9 + doc/forum/Wishlist:_automatic_reinject.mdwn | 14 + ...g_the_disk_used_by_a_subtree_of_files.mdwn | 10 + ..._7abb1155081a23ce4829ee69b2064541._comment | 9 + ..._b4c6ebada7526263e04c70eac312fda9._comment | 18 + ..._ded71b270b94617a8ebb3a713d46a274._comment | 19 + ..._daemon___40__for_the_assistant__41__.mdwn | 1 + ..._42aa2b61b880f4048d874210212aa63b._comment | 8 + ..._3e201039fa0e611554171ee30e69a414._comment | 8 + ..._d1074724c44f3296cb438b2d526d8728._comment | 8 + doc/forum/Wishlist:_mark_remotes_offline.mdwn | 12 + ..._9e3901f0123abb66034cce95cc5a941a._comment | 14 + ..._d10e3d90cf421ae425e64ab266ea811b._comment | 12 + ...ptions_for_syncing_meta-data_and_data.mdwn | 13 + ...ecial_characters_if_filesystem_is_FAT.mdwn | 5 + ..._5d33bcbd862537f53edd91dcff2b8977._comment | 13 + .../XBMC__44___NFS___38___git-annex_.mdwn | 27 + ..._86480f31d410e903766f82e6ecf83e1c._comment | 12 + ..._d8ed4dd51d3050db691a8abdec24cd42._comment | 10 + ..._42b80ee51ce25775bf4532f53a8ecfe3._comment | 11 + ..._01767f3f864954cf8080274e206da9d4._comment | 8 + doc/forum/XMPP_authentication_failure.mdwn | 15 + ..._19c7c3aa79d209d613d2e061e3129690._comment | 8 + ..._870059fed451e8377e5d382464ecc34b._comment | 8 + ..._1a7ff955e9173f13d10b75f203792384._comment | 10 + ..._d59031ebc0dd3abc1f4c96878328362c._comment | 8 + ..._c37ef477bef7efdb79dd05dce90dfde6._comment | 10 + ..._48cabea4c2caf5b3bd854df3aaa17d3d._comment | 8 + ..._14cd9b67806db93c3af055d88c9a910a._comment | 10 + ..._151d3fd7d3cceb30fd20a8f3bd54036c._comment | 24 + ..._fbb9eba65fbb72201f08511945fbcf8c._comment | 9 + ...provide_some_kind_of_debug_data__63__.mdwn | 9 + ..._1ba0735141fc6a21ac15913f4cacefae._comment | 8 + ..._16994dc86b87592fc62799e2d206d172._comment | 10 + ..._6afd424edc4095b8f71b136de2a9e64d._comment | 10 + ..._1381b6a927410642c6a93aa8354be791._comment | 17 + ..._c5b33c7a8aa8e6d0f9349510dac2366d._comment | 12 + ..._9913d2983ba2744ed24911f74988e4c7._comment | 11 + ..._ad6f385a2b95803eb9d81dfe76359551._comment | 10 + ...tch_queries_to_the_location_log__63__.mdwn | 45 + ..._01cbfc513c790faef3a3ede5315d3589._comment | 10 + ..._fe28dfb360caa12d5d5bc186def3eb45._comment | 35 + ..._9bb30ab62febe4ef63bed49f831a473a._comment | 8 + ..._7832f0347a41b8204538c01b72487803._comment | 19 + ...Pairing__34___more_than_two_computers.mdwn | 11 + ..._80f7a4bb3c66b11e566043407b611bbf._comment | 10 + ...du__34___equivalent_on_an_annex__63__.mdwn | 5 + ..._a41bd02361aa961e5285aeaf1ea062be._comment | 10 + ..._28ba62a546f5cc8f416491423d743d8a._comment | 10 + ..._8d97f40c1d14b7230f3656a00a99cf80._comment | 8 + ..._baa8fbbdd5c449a0dc2bb622cb4a47ce._comment | 18 + ..._2ee6cbbfe54a2e7b6e8eb539c18e663d._comment | 10 + ..._48f6a2761a34b7f991325f1d24e2c5ff._comment | 8 + ..._d632baff41b8582f1a79bc5018c68545._comment | 8 + ...__39__t_send_it_to_working_directory..mdwn | 11 + ..._0c0a5999a92bf5880f2113177dc67cc2._comment | 11 + ..._c18083d9054f66f0bd51d63452af07eb._comment | 8 + ...nex_lock__34___very_slow_for_big_repo.mdwn | 7 + ..._044f1c5e5f7a939315c28087495a8ba8._comment | 16 + ..._e854b93415d5ab80eda8e3be3b145ec2._comment | 13 + ..._95c110500bc54013bc1969c1a9c8f842._comment | 8 + ...I_would_like_to_have_file_x_y_z__34__.mdwn | 5 + ..._bfeb1446dee4d2f52ef25fabfb8cc8f6._comment | 11 + ..._e60f2bbc1c058993472fd920edbc75fc._comment | 8 + ...n_denied__34___in_fsck_on_shared_repo.mdwn | 17 + ..._3a5202ef2116ebb5559b6f4d920755fc._comment | 10 + ..._86663eeb75b0477f53c45f26c8e4b051._comment | 8 + ..._c336b2b07cd006d378e5be9639ff17ec._comment | 10 + ..._1339cd27ca2955f30b01ecf4da7d6fe8._comment | 10 + ..._refs__47__heads__47__git-annex__34__.mdwn | 34 + ..._e50188896df347f1d92e20a52053aa14._comment | 10 + ..._d67793f7c969f64943d1fd54a1208c2b._comment | 15 + ..._3523884833b5fd458a35f898797bf897._comment | 10 + ..._02c32c2521ba1a1eaa19eaca7281f2a6._comment | 10 + ....3.2_requires_syb___61____61__0.1.0.2.mdwn | 16 + ..._fae6e88115d175239fc55cef4c33fb2c._comment | 13 + ..._4c7a75638e8717132ccde949018d6008._comment | 10 + ...nual_ssh_remote_setup_with_shared_key.mdwn | 19 + ..._811cab17410ba6e07ae7af3249cd98df._comment | 14 + .../_preferred_content:_lastpresent.mdwn | 1 + ..._7610cd866b256d36646b642eb5f8cae5._comment | 14 + ..._d25666a173b78213d583f029fd166d06._comment | 10 + .../advantages_of_SHA__42___over_WORM.mdwn | 5 + ..._96c354cac4b5ce5cf6664943bc84db1d._comment | 8 + .../alternativeto.net___34__Like__34__.mdwn | 3 + doc/forum/android_binary-only_download.mdwn | 9 + ..._aab206e0bf0bb5ff47c7cc9795f12f92._comment | 8 + ...y_for_web_remote_with_SHA256E_backend.mdwn | 12 + ..._d1605a6e3b4d6863f4089218994ce564._comment | 29 + ..._d249ff27fa3d9ac3ca32485cdef49930._comment | 8 + doc/forum/archaeology_of_deleted_files.mdwn | 36 + ..._48f27df03ec18d2c27cf6b70dcf71dc5._comment | 10 + ..._c698cd10c8038bac45bd1049506a27c3._comment | 8 + doc/forum/archival_and_multiple_users.mdwn | 8 + ..._fc4ee256f03a7c189d687caf4a34e21e._comment | 9 + ..._a96d57d4bb567ac9b0b9167d5b1be011._comment | 12 + ..._bd44634b04732ffb91154c61ef9cf828._comment | 14 + ..._b89a56a5f1cd641f87925c7a5f74bcec._comment | 13 + ..._81293bf5dc8ad4552712c2083fd589c9._comment | 19 + ...ne_-_how_do_these_play_together__63__.mdwn | 10 + ..._d90d1d599ce557af03c6f0f2ea188212._comment | 10 + ..._58b1af497cab132acb28cb5f9283ec2a._comment | 8 + ..._37d4fd8f69e8066b5aa19454b714e443._comment | 11 + ..._a974e2105774d4f82ad286ff0792ba84._comment | 10 + ...d__backup_remote:_Howto_restore__63__.mdwn | 38 + ..._70200f871b9df49261f32752a6bb0e67._comment | 14 + ..._173da510b45f0320ae8aa2df9f14ae7b._comment | 11 + ...zealously_moving_stuff_to_other_repos.mdwn | 5 + ..._6bd240edf1868615024ff11c24c3d52c._comment | 13 + ..._37c5e9a7669b5b94fbadb8792a765316._comment | 8 + ..._87aa4c5942929be81ddc1e2795d56f0e._comment | 9 + doc/forum/assistant_without_watch__63__.mdwn | 13 + ..._be1f7c038426e53209a85ae1119269d5._comment | 15 + ...e_server___40__needs_ssh_tunnel__41__.mdwn | 10 + ..._817a3ed424e4fb76fcd33295f2953250._comment | 8 + ...ders_for_git-annex_to_aid_development.mdwn | 34 + ..._7e88f815e8d9652ef18ea6d54b118962._comment | 8 + ..._fef17a10226af5671495c2929653c337._comment | 8 + ...ing_existing_backups_into_new_remotes.mdwn | 3 + ...nstorming:_git_annex_push___38___pull.mdwn | 28 + ..._3a0bf74b51586354b7a91f8b43472376._comment | 11 + ..._b02ca09914e788393c01196686f95831._comment | 14 + doc/forum/bash_completion.mdwn | 1 + ..._5c42c0c8e7fc3224bf5406880f9fd0c4._comment | 8 + ..._6cbe3c825db99bf9188a0de8bb937d5b._comment | 8 + ..._948c40f1e46ca220d61365aebcd4f6d7._comment | 136 + ..._dbae348b230b780cda91ed8576b8f9fa._comment | 8 + ...batch_check_on_remote_when_using_copy.mdwn | 34 + .../benefit_of_splitting_a_repository.mdwn | 10 + ..._93a86cb03b66e7ab5dd7146e7b86c9e8._comment | 15 + ..._4e2fed247298d620fee7be883a1e86a6._comment | 15 + doc/forum/btsync_equivalent__63__.mdwn | 8 + ..._6bfdc6f595a8aa8979a7c2a10925812f._comment | 8 + doc/forum/cabal_install_fails_on_uuid.mdwn | 23 + ..._2a3963e21bc7ff526124b902cb0b6ad2._comment | 8 + ..._1609525998e2b36c04d67f4d988139c0._comment | 10 + .../can_I_only_add_my_own_files__63__.mdwn | 27 + ..._767d647af9d0345f337338d6319071fa._comment | 10 + ..._0c3306ffb38b97b54e1e0436d12c1876._comment | 8 + .../can_git-annex_replace_ddm__63__.mdwn | 13 + ..._aa05008dfe800474ff76678a400099e1._comment | 12 + ..._008554306dd082d7f543baf283510e92._comment | 19 + ..._4c69097fe2ee81359655e59a03a9bb8d._comment | 12 + ...ncrypted__41___rsync_remote_on_MacOSX.mdwn | 18 + ..._21f0101447623f5a0cf9e72c3ff463bb._comment | 8 + ..._6234ca64bd03a0e15efbe8f5c204338a._comment | 8 + ..._5ac2b520a907e232984eb513ce088054._comment | 8 + ..._183dd1c29f66539193e7c0b73f329430._comment | 9 + ..._c920d04ffe332caed9d223fa0ac42746._comment | 7 + ..._7a3cf0853a8ec7b996e19b5e80145d21._comment | 8 + doc/forum/central_non-bare_and_git_push.mdwn | 9 + ..._76d0c73c8985e860eb86333c63be6340._comment | 8 + doc/forum/clear_box.com_repository.mdwn | 1 + ..._2e839d8f974269c80a9fca183712350f._comment | 8 + ..._8f9c7248a148a24ae2aba39c4a79a6d1._comment | 8 + ..._f64ad21e5abfbf4e1f925b3d651bdba3._comment | 10 + ..._f8c06ac9b23b51cf18d362c260fc47a9._comment | 13 + ..._61d401b29322802cb25896503f3e6514._comment | 8 + doc/forum/cloud_services_to_support.mdwn | 16 + doc/forum/cloudcmd.mdwn | 6 + ..._current_workdir_state_in_direct_mode.mdwn | 5 + ..._748481ff00374f570284bd4571584874._comment | 10 + doc/forum/confused_about_external_drives.mdwn | 30 + ..._8340e5ff17a4846b41789e4966fed70c._comment | 12 + ..._ad10bd0ec14c16bcad089b3ebe64580e._comment | 10 + .../confusion_with_remotes__44___map.mdwn | 113 + ..._a38ded23b7f288292a843abcb1a56f38._comment | 10 + ..._cd1c98b1276444e859a22c3dbd6f2a79._comment | 8 + ..._18531754089c991b6caefc57a5c17fe9._comment | 24 + ..._3b89b6d1518267fcbc050c9de038b9ca._comment | 11 + ..._27801584325d259fa490f67273f2ff71._comment | 16 + ..._496b0d9b86869bbac3a1356d53a3dda4._comment | 8 + ..._9a456f61f956a3d5e81e723d5a90794c._comment | 27 + ...t_way_to_add_two_preexisting_datasets.mdwn | 25 + ..._c5c3ff25c9f5e34db222b5f4ae58b093._comment | 10 + ..._ee3ecc86990ac5a8d0c4fdfb482a7594._comment | 16 + ..._e29bf8b848da04c761dc601ac979ac14._comment | 11 + ...could_not_read_from_remote_repository.mdwn | 36 + ..._27d4d1556a80c06505ed3d8a9422d082._comment | 8 + ...not_use_git-annex_inside_your_Dropbox.mdwn | 5 + ..._5a1dc9da6e6861829e321446ec7991ee._comment | 8 + doc/forum/dot_git_slash_annex_slash_tmp.mdwn | 5 + ..._14b74438bb1e3e02cff7926d774ba09a._comment | 8 + ..._b1f717342c1c8ea42a451caa2d936622._comment | 8 + ..._e2c6ad99333018c8c46e736da416b8ef._comment | 8 + ..._35ae9d6bcb8d9762a92e3564b686ed72._comment | 8 + ..._1a35ef8cb89e0cd392f6e9fcee1fb92c._comment | 8 + ..._f4cc36c493d7c20fbaf949edd38e1252._comment | 15 + ..._69268f8aa29e807a56248f1fac86aa41._comment | 10 + ..._0ffb0c803c232a1587f956f16113aeb7._comment | 27 + ..._c303e28825241733d69fca74f2015fc6._comment | 13 + ..._3f0b376e37bd092b8d46c46bb1940e35._comment | 14 + ..._615641b3dd176d4b3a5bbfb521098e38._comment | 9 + ..._4600fa9234a787004ea0e0dbb36184b9._comment | 8 + ..._4f5cd0d0d4db0479c1ad86ffdc5ae434._comment | 8 + doc/forum/drop_old_versions_of_a_file.mdwn | 3 + ..._799a413248fb8f98efbf226b1bc4300d._comment | 8 + doc/forum/endless_password_prompt_loop.mdwn | 8 + ..._cceba12ed25cd671c7cee5a28631163e._comment | 10 + ..._f0cb86b45eb289f35197c43f83660a8f._comment | 8 + ...error_in_installation_of_base-4.5.0.0.mdwn | 14 + ..._0b2f79c014e0dd9badd52b8b6aa47e0c._comment | 19 + ..._3badd64e48fbb174cd7de1ac9589bedf._comment | 31 + ..._d8190061ac1c683a7b699cf42e9db694._comment | 8 + ..._49a4fcd2dc4f97d4055b5051feea5e3b._comment | 8 + ...e_of_massively_disconnected_operation.mdwn | 33 + doc/forum/exclude_files_from_annex.mdwn | 10 + ..._82e7de5e631bae3b347815586274a936._comment | 25 + ..._03d4599fdceb3dff184eed82824674bc._comment | 12 + ...xpire_files__44___move_to_other_hosts.mdwn | 19 + ..._ddcc2a00be1ae96a352d75a443458bcf._comment | 14 + ..._7a4c3858c5eae409d04de3f9da43b57e._comment | 17 + doc/forum/exporting_annexed_files.mdwn | 4 + ..._e08e4c79588e17fb2f1cdf53d9fab7ea._comment | 16 + ..._15dc3024417b5b2ff3544a08beacab34._comment | 8 + ..._86f0e0f767a84a0f583e121d36cb7d48._comment | 8 + ...oes_not_exist__40__v_3.20111231__41__.mdwn | 26 + ..._990197bf01351dc1ccbe1940d5084adb._comment | 7 + ..._3bb1d21b7f0d0bd6d59190ae9d246d46._comment | 12 + ..._692f268218690437138ae0540c879425._comment | 16 + doc/forum/faking_location_information.mdwn | 19 + doc/forum/first-time_setup_git-annex.mdwn | 7 + ..._a58d83ee3a7c2251d9a775847223f8ca._comment | 13 + .../flickrannex_--_not_sure_I_get_it.mdwn | 7 + ..._57ea9f26760f970a70f09934d31a79b5._comment | 8 + ..._ba93563b4ce1f6497a9f1d5e6eb0d1bb._comment | 8 + ..._74f143965f48c89a3583acf1b6a7635a._comment | 9 + ..._493bb86dedfa91ccc0c9be4045953ee4._comment | 8 + ..._2c410aa478b21c0e6eb0e4d54bc8c362._comment | 8 + doc/forum/fsck_gives_false_positives.mdwn | 6 + ..._b91070218b9d5fb687eeee1f244237ad._comment | 15 + ..._f51c53f3f6e6ee1ad463992657db5828._comment | 10 + ..._692d6d4cd2f75a497e7d314041a768d2._comment | 10 + ..._7ceb395bf8a2e6a041ccd8de63b1b6eb._comment | 10 + ..._86484a504c3bbcecd5876982b9c95688._comment | 13 + ..._1d4fbbd212fa92967abda346323031f4._comment | 8 + doc/forum/gadu_-_git-annex_disk_usage.mdwn | 7 + ..._f632a62c4dbbf01b29f146893d7725f9._comment | 15 + ..._73461da2d55d040cb43e0db286975821._comment | 21 + ..._6c4fb123091bde435c18ac3dfd5a9b77._comment | 8 + ..._067d0ffe8900751bd2d2743254ac4d77._comment | 11 + ..._ec8b57426e4d82c3392eb7dd683f2ddc._comment | 17 + ..._38296fef5a2dc5794c2dc09df676b8c1._comment | 18 + ..._1bcc94f9982c6cfd0888f3dba0f9221e._comment | 8 + ..._4365cd3031456fac1b563ee72984638e._comment | 18 + ..._2b03d7b857497cb811e992f85700cdcc._comment | 12 + ..._03a4dfaf3bd73d41c6f3c3fab0a6a922._comment | 8 + ..._fc6ddb4dc075ee42368863c1b026dbf7._comment | 13 + ..._f03254e518cbdda73e4b88e72476275d._comment | 8 + .../get_and_copy_with_bare_repositories.mdwn | 7 + ..._a6e4628c0770e3f5e81348a6f29dd845._comment | 10 + ..._652fa1bae5c2bb63dcffcbda97a567c4._comment | 8 + ..._annex_to_do_a_force_copy_to_a_remote.mdwn | 11 + ..._3deb2c31cad37a49896f00d600253ee3._comment | 14 + ..._627f54d158d3ca4b72e45b4da70ff5cd._comment | 12 + ..._3f49dab11aae5df0c4eb5e4b8d741379._comment | 8 + .../git-annex___38___ikiwiki_experiment.mdwn | 28 + ..._9f74449ec91577dbf6095f4beafac293._comment | 10 + ..._e034585c8b51cc30b35c1f7ae68205bf._comment | 14 + ..._fbbd47c3dbe8de24b0df664e4afd5cb8._comment | 14 + ..._55da5c3c41c13b08590ce1ff8117cef6._comment | 23 + ..._f67823351164ddfe7d595685c3679652._comment | 10 + ..._d5cc91164772849d027fed5f962d9000._comment | 10 + ..._cb4ec7ed3c39d0649133191a85ea6ab3._comment | 17 + ..._86565e5e1508ff1862f88975446650a2._comment | 12 + .../git-annex_across_two_filesystems.mdwn | 30 + ..._53167648b8b70b41d19ca662a5f3687e._comment | 26 + ..._39adeebc1af9c437f1fc2e00c07509bf._comment | 11 + ..._f4e3f28db005301adeef7ccd2c9998fb._comment | 18 + ..._53fa7ac6f80e3281768a7bfd3d438b34._comment | 10 + ..._2e1be54c01970ef3456e8af4aaf00cbf._comment | 10 + doc/forum/git-annex_and_tagfs.mdwn | 14 + ..._887c74cb61d30198322ef74ebc80f950._comment | 8 + ...ex_assistant_with_2_dedicated_servers.mdwn | 11 + ..._533ade2215c879cd46782fd66a97b167._comment | 16 + ..._c9ae51d7b772cf7a91d90925f74d2b60._comment | 10 + ..._41fbee0ec9bc890e309bcd48a58c3851._comment | 18 + ..._571cffc0beb8ba5fc936db6971cd3d62._comment | 8 + ..._0fb62af673a4bc8183e8fef048ceedd4._comment | 10 + ..._53a79af2d8e3abe50b983bf91972b8f2._comment | 14 + ..._c0ba3e8b7fbf8a5ed718001cec8df676._comment | 35 + ..._60c39bc8ef74e80e72381d514b6dd223._comment | 8 + ..._6241120b4325c905661ef72881f4d7af._comment | 20 + ..._cab00b8fa195340f4d3fdaf5af975b57._comment | 8 + ..._e24df9a1c68724a912b8ac6533d9bd25._comment | 16 + ..._ace3dc7c60c710a04b0a587206b341c4._comment | 8 + ..._9a96bc970a17ed62b0ceb7aa3f0a6f8b._comment | 14 + ..._ea88e0696f6e25e6904248a323f6cc36._comment | 8 + ...Meego_Harmattan__41___and_Sailfish_OS.mdwn | 7 + ..._301a51c48c3d54f9d37feace26a772f8._comment | 8 + .../git-annex_communication_channels.mdwn | 10 + ..._198325d2e9337c90f026396de89eec0e._comment | 17 + ..._c7aeefa6ef9a2e75d8667b479ade1b7f._comment | 8 + ..._1ff08a3e0e63fa0e560cbc9602245caa._comment | 8 + ..._1ba6ddf54843c17c7d19a9996f2ab712._comment | 8 + ..._404b723a681eb93fee015cea8024b6bc._comment | 8 + ..._0d87d0e26461494b1d7f8a701a924729._comment | 8 + ..._2c87c7a0648fe87c2bf6b4391f1cc468._comment | 10 + doc/forum/git-annex_on_OSX.mdwn | 1 + doc/forum/git-annex_on_Samba_share.mdwn | 9 + ..._3e9cfdf2c088e48c967ad08f79966742._comment | 12 + ..._9d3df393b7b727653598453d94dd33db._comment | 12 + ...on_Ubuntu_13.04_and_13.10_not_working.mdwn | 12 + ..._209956f3812450a43986d4ca5e647da6._comment | 10 + ..._12a58b8efe545e09b64760c87849839b._comment | 12 + ..._e0f7328603256f25c3be3706ecc9c76c._comment | 12 + ..._6bb8e4522241556fb82784d9b834cbfe._comment | 10 + ..._89a5296b461d400b51006074a13a4560._comment | 8 + ..._62daef4b4392c951b914a01b3effac11._comment | 8 + ...git-annex_on_archlinuxarm__44___armv6.mdwn | 20 + ..._88fa644df8614c2db0d092b3eb1d3156._comment | 10 + ..._b25ca7520ff7e339ec887a379d5100ee._comment | 10 + ..._eda0e90c1285396b1ab20ecc04ea6e29._comment | 8 + ...loses__47__doesn__39__t_run_on_launch.mdwn | 7 + ..._a47174f8438bfaa42fb8067bca77bf4c._comment | 8 + ..._567bb460cec7cd2135386acf4e7dceb4._comment | 8 + ...nex_pre-commit_eats_all_my_4GB_of_ram.mdwn | 24 + ..._ff16c7932b60b85c744bafc48bb040e4._comment | 13 + ..._5599cddf579d18f70cab6e48d04ae99d._comment | 12 + ..._412941e9385f63153b23695641e71deb._comment | 15 + ..._112ad140d9006c530db2121bec24de30._comment | 10 + ..._9178023b95683a649355f291165a1467._comment | 8 + ..._9251203421c1c3c3aed7828c4b97ecb8._comment | 17 + doc/forum/git-annex_teams___47___groups.mdwn | 5 + ..._0450673ab74f184a47ac7bab568d26dc._comment | 8 + ...nex_unused_not_dropping_deleted_files.mdwn | 34 + ..._2152cfb09675e46e7492e198dd3ea094._comment | 8 + ..._97e666dbac9de2a5e688921cba8a42e9._comment | 20 + ..._d7b0e9515bface28f3650b8aa20ec2f4._comment | 8 + ..._5816f6cab42e27e724e735368f693b09._comment | 8 + ..._8e97f39225515f0bf8b168dfd6a0efab._comment | 10 + ..._bef37f8ec9c337387b79ffd6d56fe425._comment | 10 + doc/forum/git-assistant_clarification.mdwn | 11 + ..._8f553e59da12f798b854a457b96b5778._comment | 14 + ..._06cf62b599edea6ad8396776f0081494._comment | 10 + ..._36f0bd6e7a824e6ef40a309850bb087b._comment | 15 + doc/forum/git-remote-gcrypt.mdwn | 1 + ..._175c8c35d9bbb470fcc17697eb8cc6b8._comment | 12 + ..._fdcaf507e14c995636dd93a41e488df3._comment | 8 + ..._f4e830f961dbe1c60ddd277b9d888133._comment | 8 + .../git-status_typechange_in_direct_mode.mdwn | 48 + ..._12c8b67aadbfa2b073e12997a55d49a7._comment | 12 + ..._005d1b17f3c2ae192aa30c6e5163989e._comment | 8 + doc/forum/git-subtree_support__63__.mdwn | 9 + ..._4f333cb71ed1ff259bbfd86704806aa6._comment | 10 + ..._73d2a015b1ac79ec99e071a8b1e29034._comment | 8 + ..._c533400e22c306c033fcd56e64761b0b._comment | 8 + ..._75b0e072e668aa46ff0a8d62a6620306._comment | 8 + ..._f5ec9649d9f1dc122e715de5533bc674._comment | 8 + ..._85df530f7b6d76b74ac8017c6034f95e._comment | 8 + ...nex_add_crash_and_subsequent_recovery.mdwn | 25 + ..._062d0153a379c1ba1df8585b90220d3d._comment | 18 + ..._6fc6be43c488c468a4811cd0a1360225._comment | 19 + ..._45efaaf27d9b580c4c75cbcdc4f65b64._comment | 10 + ..._c560eae40867512b0af2cbef161fc8ac._comment | 8 + doc/forum/git_annex_alternative.mdwn | 10 + ...istant__44___share_with_other_devices.mdwn | 3 + ...-to_blah_much_slower_than_--from_blah.mdwn | 15 + ..._5b6e0b749b01a97a6b52a2c1cca6e35a._comment | 12 + ..._8f2567f4c4f6db2078211a87689757d3._comment | 17 + ..._ab98121076b88f351fc8cd9197e6bf64._comment | 8 + ..._cb13328add1b7a812efd817ad3dd1a4f._comment | 8 + ...e_about_why_some_files_are_not_copied.mdwn | 59 + ..._75445fc0e01ee99bae1c1f5a60e314bc._comment | 12 + ...glish_filenames.__Rsync_problem__63__.mdwn | 22 + ..._292ee7c8b37cbd13f03eb67d0359b99e._comment | 10 + ..._f6341119fcfde5d8160c8f603b1a6fea._comment | 10 + ..._8ad3a1d1fe5995d61e5e137280bc76c3._comment | 8 + ..._86b61b0484f3f4ecff657e46333b3d4f._comment | 8 + ..._5ffac00d08d26acaba8c3513b24c4d65._comment | 10 + ...nnex_get_--want-get_another__95__repo.mdwn | 68 + ..._0be0b3981ddd0743ff26cf6d396e521d._comment | 16 + ..._b1ead1085a87818625579bf1ef151b5d._comment | 8 + ..._cf2018852c84b0bf1ac061def6f0ac5d._comment | 27 + ..._22562e8f1f2f91b9f9a5939ec9006cb5._comment | 38 + .../git_annex_get_creates_a_new_uuid.mdwn | 6 + ..._004c87183968c326058bd3159a5baa0b._comment | 14 + ...___47___metadata_in_git_annex_whereis.mdwn | 1 + ..._7fba10b85f4d9289c7782eccef46949e._comment | 8 + ..._7dcec124ea7d0291ed40d80e2ffd5c7e._comment | 8 + ...sx_only_creating_symlinks__63____63__.mdwn | 18 + ..._6889c4452e636474b4e70798b404fed2._comment | 10 + ..._978fc11c463a457382fddd668cd1d0dd._comment | 20 + ..._4420bd3afaecd7536b02fc08cee82dbe._comment | 8 + ..._99286f17a87049c303f2aa34c0a90286._comment | 13 + ..._39bad7441dcea4da4b389700301233de._comment | 8 + ...annex_sync_dies___40__sometimes__41__.mdwn | 22 + ..._48bbac0545bf13bbf04da723e418d037._comment | 14 + doc/forum/git_annex_test_on_windows.mdwn | 5 + ..._258ac5cfa2f5d24e737d94dc48f06899._comment | 10 + ...annex_with_local_apache_webdav_server.mdwn | 23 + ..._a3b89f90f9ac70e0a9b0711ede1cb810._comment | 12 + ..._d8e9237cf6e7f7558f836ba1352f5517._comment | 13 + doc/forum/git_pull_remote_git-annex.mdwn | 11 + ..._9c245db3518d8b889ecdf5115ad9e053._comment | 36 + ..._0f7f4a311b0ec1d89613e80847e69b42._comment | 14 + ..._1aa89725b5196e40a16edeeb5ccfa371._comment | 14 + ..._646f2077edcabc000a7d9cb75a93cf55._comment | 37 + ..._4f2a05ef6551806dd0ec65372f183ca4._comment | 10 + ..._3925d1aa56bce9380f712e238d63080f._comment | 8 + ..._24c45ee981b18bc78325c768242e635d._comment | 8 + ..._7e76ee9b6520cbffaf484c9299a63ad3._comment | 12 + doc/forum/git_tag_missing_for_3.20111011.mdwn | 1 + ..._7a53bf273f3078ab3351369ef2b5f2a6._comment | 8 + doc/forum/git_unannex_speed.mdwn | 1 + ..._10cf326248f4e89e1f75bf97d7574763._comment | 7 + ...ls_and_daily_free_retrieval_allowance.mdwn | 6 + doc/forum/handling_MP3_metadata_changes.mdwn | 12 + ..._aa4955fd64ea5aa836f1a591e185c4a2._comment | 8 + doc/forum/hashing_objects_directories.mdwn | 27 + ..._c55c56076be4f54251b0b7f79f28a607._comment | 12 + ..._504c96959c779176f991f4125ea22009._comment | 14 + ..._9134bde0a13aac0b6a4e5ebabd7f22e8._comment | 12 + ..._0de9170e429cbfea66f5afa8980d45ac._comment | 12 + ..._ef6cfd49d24c180c2d0a062e5bd3a0be._comment | 12 + ...ing_git-annex_on_top_of_existing_repo.mdwn | 12 + ..._4cb38d71c943657c5ba0896cd70d2e64._comment | 8 + ..._b5e94c10ebbed9125c7e2332f75709ca._comment | 13 + ..._2b3b93bbc60fbc24d436231954d6822a._comment | 10 + ..._2dfda33ffa39b92b16c8bd9005e1cefe._comment | 21 + ..._96b1eb1e8e9f315c646f4686870f9b52._comment | 10 + ..._e85c3fa1d17f1d6ec625b9c4f9b698c3._comment | 47 + ...manually_sync_my_external_drive__63__.mdwn | 9 + ..._4fd8722cafd55b0503c802289206645a._comment | 10 + ...e_from_encrypted_special_remote__63__.mdwn | 14 + ..._d4dc451892e7a6e230bf32adb7f3f9fa._comment | 8 + ..._79340bf3c0691073a9808c5ac2da0a3d._comment | 14 + ..._6302fb6e5bb7cbddf2cfe74d98d32897._comment | 12 + ..._e3d95bc09c9fb21e8e9bbacc642aa60f._comment | 8 + ..._f2f0a1c2fb0c6323707b11e2b06aa2db._comment | 8 + ..._66fe80e634a8f13cce18fe68974ec67a._comment | 8 + ...nks_but_keep_historical_file_contents.mdwn | 7 + ..._cba76311e146dabb8ffc789bf4c8b714._comment | 14 + ..._8d99c50fc1347367ccc0714e8d1af385._comment | 40 + ..._a7a9c55c2ad448179dff5d5b69976c7d._comment | 10 + ...k_to_existing_direct_mode_git-annexes.mdwn | 5 + ..._7bd0edaf2352293678f0942aaa885d13._comment | 8 + doc/forum/howto_update_feed.mdwn | 14 + ..._bec356619f370a618f19a187d09d2e35._comment | 8 + ..._84dfb80ba3db8d41164eb97022becae3._comment | 8 + ..._20166db298c10074e062aecad59ffd71._comment | 20 + ..._f040e31b763fc9a7aa092442b4d6b8e8._comment | 20 + .../ignore_changes_made_by_a_remote.mdwn | 8 + ..._825676069d2e1554499b76fd8c306c30._comment | 10 + doc/forum/incompatible_versions__63__.mdwn | 1 + ..._629f28258746d413e452cbd42a1a43f4._comment | 8 + ...mmit_some_files_in_direct-mode___63__.mdwn | 5 + ..._804e43111ee97dff15e49e50b6c29d91._comment | 14 + ..._299ad6cd0225daa166d36af3726a9ef2._comment | 14 + doc/forum/known_and_local_annex_keys.mdwn | 14 + ..._3cb4828dc7116e4cf49e119f055ae9a3._comment | 20 + ..._68f20c881eafe986694bde10571cf1c0._comment | 10 + ..._e195a7091a06ce0427bb28aca9a17d04._comment | 8 + ..._d81f0bf7465832cb676fd89f5d53ec18._comment | 8 + doc/forum/linux_standalone_tarballs.mdwn | 1 + ..._5c3ceb845a45e50784f7098bfbf94df1._comment | 13 + doc/forum/local_pairing_with_2_mac.mdwn | 27 + ..._508585e72c81d197a9a1e193c25a702a._comment | 15 + ..._6ca4fed183340a2902d1d4d91284b772._comment | 8 + ..._7c2b3d0a8a69c7056508f8ec73ebefcd._comment | 13 + ..._07fa468aac1288e770487973052bccea._comment | 12 + ..._dc0494213d2b57b5b9a489b096a5b8d0._comment | 31 + ..._bcac18e137c00d4279774dec51963289._comment | 10 + ..._76b62eafda1ecbf88abe288cbe778e17._comment | 17 + ..._13fe788f2e9a823ad2e4844f114675a7._comment | 10 + ..._f81b454e9cfc14dcb33148798be55de3._comment | 16 + ..._f7a1ce9627ebfc854dfde2f6c924db80._comment | 8 + doc/forum/location_tracking_cleanup.mdwn | 24 + ..._7d6319e8c94dfe998af9cfcbf170efb2._comment | 10 + ..._e7395cb6e01f42da72adf71ea3ebcde4._comment | 15 + ..._c15428cec90e969284a5e690fb4b2fde._comment | 10 + doc/forum/lost_in_walkthrough....mdwn | 78 + ..._51b703b961ca762f0359e1c169f1ee75._comment | 8 + ..._a9de0401a103bdd4401ba2d5983dc54a._comment | 11 + doc/forum/luks_encrypted_disk_support.mdwn | 3 + ..._0ea476c778888f34196d9031f72b1844._comment | 10 + ..._0af149bfe1868dde0a132c5d835c50df._comment | 8 + ...use_of_my_shiny_new_rsync.net_account.mdwn | 20 + ..._0ebe509b768d46081db2100f5b712ef7._comment | 10 + ..._ef63d893531d93d2eb09f48f8baff4dd._comment | 13 + ...n_pages_in_the_prebuilt_linux_tarball.mdwn | 1 + ..._a7bc2e84e6d7c0e2de5900685207af78._comment | 9 + doc/forum/managing_multiple_repositories.mdwn | 3 + ...pdate_of_.git__47__annex__47__objects.mdwn | 8 + ..._ea6ec91150c8962e2711631f2422bf3a._comment | 10 + ..._a7bbf304b26650a786e358bdc01e3069._comment | 33 + ..._a855096b683c4c4f84e72c797e065d59._comment | 12 + doc/forum/many_remotes.mdwn | 24 + ..._existing_git_repository_to_git-annex.mdwn | 66 + ..._4181bf34c71e2e8845e6e5fb55d53381._comment | 10 + ..._5f08da5e21c0b3b5a8d1e4408c0d6405._comment | 60 + ..._f483038c006cf7dcccf1014fa771744f._comment | 12 + ..._057f0079fbee3451ccda08026bab21d4._comment | 20 + .../migration_to_git-annex_and_rsync.mdwn | 33 + ...__files__42___into_an_annex.__bummer..mdwn | 3 + ..._752db25abb647804a1cc12c5b247378a._comment | 10 + ..._db6f4959c35732f72e7a90bd9f4c665c._comment | 8 + .../multiple_repositories_single_backup.mdwn | 6 + ..._4a479fa78e0b366fcff1a27bc37081de._comment | 12 + ..._bbe19eec0969385a0d4682bf9e9de21a._comment | 11 + ..._1b18ea058e3eb34852055cffe51de176._comment | 8 + .../multiple_routes_to_same_repository.mdwn | 2 + ..._26c1734d41d5374f18fc688d862d6b8e._comment | 8 + ..._d119ab485fb2d5512c15372efdb2327d._comment | 8 + ...___40__for_tagging_photos__41____63__.mdwn | 11 + ..._96beb9ea895c80285748adb940b4f57d._comment | 9 + ..._985065c1feed9300631dac7a2701f669._comment | 8 + .../multiple_urls_for_the_same_UUID.mdwn | 26 + ..._de7410d8824a864c4d106c9f1afaec3f._comment | 8 + ..._309a86cf7e08448be64357a30d8b56ae._comment | 13 + ..._fa97a45fc1392935fd5e0714db999bc2._comment | 14 + ..._139178b1ba45b62eec0c89a660c0c81e._comment | 8 + doc/forum/new_linux_arm_tarball_build.mdwn | 12 + ..._7211ddc626bae97d4140c723c3cf028f._comment | 8 + ..._fcbe3f7fa9d012b21c7a771553fa9142._comment | 8 + ..._2702cdbae4179a7a103d2a7098a8ed5e._comment | 34 + ..._e1d802fbcc9d699ece5267e80990255a._comment | 10 + ..._257b91ecbf5a6040a8e4c9a360c775ba._comment | 9 + ..._bd8cca86a63be7e330111618c1959a74._comment | 8 + ..._6814bdeca94328fe6c3f407795ff923a._comment | 10 + ..._6db99d998ca990494c8f2826ff1ca273._comment | 11 + ..._2802b24ccb24f1615c9d61904f916d05._comment | 12 + doc/forum/new_microfeatures.mdwn | 59 + ..._058bd517c6fffaf3446b1f5d5be63623._comment | 8 + ..._41ad904c68e89c85e1fc49c9e9106969._comment | 8 + ..._a1a9347b5bc517f2a89a8b292c3f8517._comment | 15 + ..._5a6786dc52382fff5cc42fdb05770196._comment | 18 + ..._3c627d275586ff499d928a8f8136babf._comment | 8 + ..._31ea08c008500560c0b96c6601bc6362._comment | 8 + ..._94045b9078b1fff877933b012d1b49e2._comment | 10 + .../nntp__47__usenet_special_remote.mdwn | 18 + ..._171a0b95b1f95cfd82073e88bdefaab9._comment | 10 + ..._48736ed17c98ffcfb13ec00b901b2dd6._comment | 13 + doc/forum/non-bare_repo_on_cloud_remote.mdwn | 6 + ..._da0c023af7c78f1ef1cfe1143a900a9f._comment | 10 + ..._71baea93f6caaf7b81a9ac00bee91e5e._comment | 67 + ...not_finding_git-annex-shell_on_remote.mdwn | 21 + ..._84881cad02c251a2515cec50fc22bf16._comment | 16 + ..._f32412f8d3b84cd5cb3c4d5d6bb60f32._comment | 36 + ..._dfbf7f41dd4d17f2ce8b67daa9dcd11d._comment | 8 + ..._71ae60efcacdba5e11548923b2c85b95._comment | 10 + doc/forum/not_getting_file_contents.mdwn | 1 + ..._4a0f7f4de9c9bc4d13db033cb75d20af._comment | 10 + ..._dc7403e1b551552f9fd00da6a1453570._comment | 8 + .../one_annex_versus_many_annexes__63__.mdwn | 10 + doc/forum/one_or_many_annexes__63__.mdwn | 7 + ..._656d96011801d67a45b0b3bb3d70fa63._comment | 8 + ...artial_synchronisation._android_phone.mdwn | 7 + ..._2a48569277945a9c334bdfc51f8fd01f._comment | 8 + ..._550ae91c8a1fe060368c4682d37514b6._comment | 8 + ...nce_and_multiple_replication_problems.mdwn | 17 + ..._a2cdf1a4840f099f6bc941fd8de966c7._comment | 16 + ..._e65b360706c66ede6e0e841b2ebbbfbc._comment | 8 + ..._ad7cb4c510e2ab26959ea7cb40a43fef._comment | 14 + ..._23a6dc7ea569944ca55bd21851dd770d._comment | 14 + ...it_on_ssd__44___annex_on_spindle_disk.mdwn | 12 + ..._b3f22f9be02bc4f2d5a121db3d753ff5._comment | 8 + ..._f94abce32ef818176b42a3cc860691ae._comment | 20 + ..._0c8e77fe248e00bd990d568623e5a5c9._comment | 10 + ..._4b7e8f9521d61900d9ad418e74808ffb._comment | 8 + ..._7abbbe7db3988a2d239d11b0a4c597e7._comment | 10 + ..._46bd45fdc25d9c583f4ebe3a9730ab9f._comment | 8 + doc/forum/post-copy__47__sync_hook.mdwn | 14 + ..._c8322d4b9bbf5eac80b48c312a42fbcf._comment | 11 + doc/forum/preferred_content.mdwn | 11 + ..._9c9e5f2ee5ae4d8459358ad16f879ef1._comment | 10 + ...ontent_settings_for_multiple_symlinks.mdwn | 7 + ..._70da012d96ab576151fe3e081ef905d1._comment | 10 + ..._ccea74d8b5a4de1f3cd1f6da6694ae0e._comment | 8 + ..._fab70c642d5aaf26de05270860281030._comment | 10 + ..._3cbd06de53b6a13e2741124a8e7b5b5b._comment | 10 + ..._963558ab261d8a6315402d371e8348f9._comment | 10 + doc/forum/public-web-frontend.mdwn | 16 + ..._c73bd2dfe020c25eaad1c0707dd2db01._comment | 9 + ..._0026d7be6b17e50d86b3b54985882f80._comment | 14 + doc/forum/pulling_from_encrypted_remote.mdwn | 12 + ..._e9d6a9a6e01d01edb41a11b0da11d74d._comment | 10 + ..._8d0db2ff65ce935c6e68044a3e0721a8._comment | 16 + doc/forum/pure_git-annex_only_workflow.mdwn | 46 + ..._683768c9826b0bf0f267e8734b9eb872._comment | 8 + ..._6b541ed834ef45606f3b98779a25a148._comment | 30 + ..._ca8ca35d6cd4a9f94568536736c12adc._comment | 10 + ..._00c82d320c7b4bb51078beba17e14dc8._comment | 8 + ..._b63568b327215ef8f646a39d760fdfc0._comment | 32 + ..._cb7c856d8141b2de3cc95874753f1ee5._comment | 12 + ..._a32f7efd18d174845099a4ed59e6feae._comment | 32 + ..._66dc9b65523a9912411db03c039ba848._comment | 15 + ..._9b7d89da52f7ebb7801f9ec8545c3aba._comment | 12 + ..._dc8a3f75533906ad3756fcc47f7e96bb._comment | 20 + ..._afe5035a6b35ed2c7e193fb69cc182e2._comment | 24 + ..._3660d45c5656f68924acbd23790024ee._comment | 12 + ..._33db51096f568c65b22b4be0b5538c0d._comment | 15 + ..._6e5b42fdb7801daadc0b3046cbc3d51e._comment | 12 + ..._ace319652f9c7546883b5152ddc82591._comment | 14 + doc/forum/purge_files_with_no_copies.mdwn | 3 + ..._12b578689eb8d5d38c06261ec65e2109._comment | 12 + ...out_assistant_and___47__archive__47__.mdwn | 22 + ..._97890e26072af9277144651e3fdcada0._comment | 10 + ..._542bf265e35a976ac76767762d67d617._comment | 104 + ..._bafe99159df2adcd5fecc0d67bbf05a5._comment | 8 + ..._e77fa2992d9302a49a05f514c81612ca._comment | 10 + ...ld_location_log_from_encrypted_remote.mdwn | 35 + ..._f84f955fed7b96ae6208b6ff2ec650cd._comment | 12 + ..._c0b2ce3bc7cd55a0c77ddc31493068c2._comment | 10 + ..._06a73ca3dc73399ff000b642cca72de7._comment | 10 + ...ndirect_renames_on_direct_repo___63__.mdwn | 254 + ..._f4b0a14373c75cb752597c832e296bcc._comment | 17 + ..._8c86dfc99f0b9040402c9d746decda53._comment | 41 + ..._0246fff6c7c75f6be45bd257ec3872a5._comment | 75 + doc/forum/recover_deleted_files___63__.mdwn | 66 + ..._d7abb7c45c6ec2723a04f153ed215453._comment | 8 + ..._8ea2acaa30d3ee7e9f75310f4ec859b2._comment | 8 + ..._376de81c70799bf409be189a48234815._comment | 12 + ..._2e73ac530d65a01768a57058b7220a29._comment | 8 + .../recovering_from_repo_corruption.mdwn | 11 + ..._01fc85037e24fc70e5c5329898cf6781._comment | 15 + ..._3bd1c0bf25a0e892e711a60f53cd5298._comment | 8 + ..._679dde8ca0081fc6854d6d2e8a42abdb._comment | 8 + ...annex__44___does_not_recognize_remote.mdwn | 8 + ..._c1962d757dd22f49e774afa13a9862ca._comment | 10 + ..._1f0f4a1dc89643cee81ff7199b55e747._comment | 8 + ...ity__47__completeness_of_XMPP_updates.mdwn | 7 + ..._e0f7aa48d54fc0564f41c3a569c723b7._comment | 12 + ..._4e74039a673c16c0163f2cfb406dc4c3._comment | 8 + ..._41ade4fe72804b2f06cd4dbf405c1746._comment | 8 + doc/forum/relying_on_git_for_numcopies.mdwn | 47 + ..._8ad3cccd7f66f6423341d71241ba89fc._comment | 36 + ..._be6acbc26008a9cb54e7b8f498f2c2a2._comment | 18 + ..._43d8e1513eb9947f8a503f094c03f307._comment | 8 + ...ent_repositories_are_bare__33____63__.mdwn | 17 + ..._234241460f6c75a8376b303b8dd4e882._comment | 11 + ..._42dfc382d07af2a4f29c76016084f87c._comment | 12 + ..._space_with_directory_special_remotes.mdwn | 2 + ..._cd17b624704d93b51931023f69573323._comment | 8 + ..._877ca1be23d1484a8a30cdaeb6630053._comment | 15 + ..._65910eeaf3c6fcfd03f22c2957293232._comment | 8 + doc/forum/retrieving_previous_versions.mdwn | 7 + ..._a4e83f688d4ec9177e7bf520f12ed26d._comment | 11 + ...es_for___42____42____42____42____42__.mdwn | 13 + ..._7754e2cfb72b034effe8642c1b3e593e._comment | 11 + ..._04e1da4352ef9f9be90253ea726e5f24._comment | 12 + doc/forum/rsync_over_ssh__63__.mdwn | 2 + ..._ee21f32e90303e20339e0a568321bbbe._comment | 8 + ..._aa690da6ecfb2b30fc5080ad76dc77b1._comment | 8 + ..._2e340c5a6473f165dc06cc35db38e5c0._comment | 8 + ...rsyncing_.git__47__annex__47__objects.mdwn | 24 + ..._25eb9f7be5730337b9efd96dce9efd2e._comment | 10 + ..._d7ceae666c8a1951021d3c6e6ac39a11._comment | 8 + doc/forum/s3_vs_ssh_Performance_Problems.mdwn | 8 + ..._65f064f09d7850abecab97007b0d30f0._comment | 12 + ..._baaf2384d9196077268e9ca9bbe3b871._comment | 8 + ..._dc44be42070c073d150c476406e9b425._comment | 10 + ..._f9c3ef3b1b44bfb29125acb6ec621f38._comment | 10 + .../safely_dropping_git-annex_history.mdwn | 20 + ..._a4b93a3fbc98d9b86e942f95e0039862._comment | 8 + ..._383882fafd32f25ed22b5eb2fb3691b9._comment | 18 + ..._47794a2abf29bf4ea2763ff89d872ab4._comment | 8 + ..._4fd76d10a93fe01588fce7a621f9254d._comment | 12 + ..._10ecf3220ffcbbe94ba09da225458f18._comment | 12 + ..._e3beb8acb075faaeef6c052aecbf0a41._comment | 50 + ..._61a5fe2e7e47c60a8b237ea69404a37f._comment | 8 + ..._426d02e2f2a2ae4ec7eae02dfe4519b3._comment | 9 + ..._410a7296c2cee16d3d5bb618a5a41c1d._comment | 10 + ..._42cf492fc98a9eba8176387749ef12e0._comment | 8 + ..._c0327ada073d8b69535f71b4dc6aa57e._comment | 21 + ..._f83d6090aea2b7d5d54c876df940cbad._comment | 40 + ...o_build_fine_on_haskell_platform_2011.mdwn | 1 + doc/forum/shared_cipher_tries_to_use_gpg.mdwn | 10 + ..._760961eaaa7d5c254dd71c5792437c9e._comment | 12 + ..._f3260aea3a5bb9b95a9bdf1d0dfce090._comment | 8 + ..._really_good_happened_with_3.20130124.mdwn | 5 + ..._1712bddd2f483a353f6313aa626445f1._comment | 8 + .../sparse_git_checkouts_with_annex.mdwn | 31 + ..._c7dc199c5740a0e7ba606dfb5e3e579a._comment | 12 + ..._e357db3ccc4079f07a291843975535eb._comment | 8 + ..._fcfafca994194d57dccf5319c7c9e646._comment | 8 + ..._04dc14880f31eee2b6d767d4d4258c5a._comment | 20 + doc/forum/special_remote_for_IMAP.mdwn | 44 + ..._7c7d4b57a1b6508fff1a6b0508c861f8._comment | 10 + ..._9c46fe8a857aa7a5ce797288144386bd._comment | 8 + ..._27e3b644df6942ce4c103236d0d5cb1b._comment | 23 + doc/forum/special_remote_for_iPods.mdwn | 5 + ..._37cc3dc740341cc663074fd3bfb85947._comment | 8 + ...sistant_startup_on_large_repositories.mdwn | 1 + ..._5ba637a0f6d01ba24fe25e6265134e0a._comment | 10 + ..._d65746697977f8971a4b59f5b413f926._comment | 13 + ..._be6c4fe5a0c745688438b716973791cc._comment | 12 + ..._a07472338a08c068a9b88b2176fc2bee._comment | 9 + ...ation:_read:_Connection_reset_by_peer.mdwn | 28 + ..._87b9540e37abb16c0ec7605f5ab204a5._comment | 8 + ..._bd3383c142bf93d9cd496cb668d7782c._comment | 12 + ..._9b1911ae6468d09dae74ab1a60d2757b._comment | 12 + doc/forum/ssh_password.mdwn | 3 + ..._a3e5a41e1d4da683d577976b134b11ee._comment | 10 + ..._fa261676a99d49d4b237b0d43048d76d._comment | 10 + ...itory__34___option_during_setup__63__.mdwn | 3 + ..._7244794579a191a677190c60758f32e7._comment | 8 + ..._277cf12907bd7c5930eb4f137b115e29._comment | 8 + .../start_assistant_from_command_line.mdwn | 11 + ..._f8dfce1fca9f1212ccaf84e431db71a9._comment | 12 + ..._e769c5d09afbff85961363ddc5eb4019._comment | 10 + doc/forum/switching_backends.mdwn | 12 + ..._ecf4109c1148dafde3519243ae3c5a03._comment | 10 + ..._21f465a18f40b95dafd307fce0de659a._comment | 8 + ..._4c13d22c1695195e6b101bd20ef6bb42._comment | 35 + ..._e1d4a48baac23fd3f67b20eba4eee8af._comment | 8 + ...irect_mode_while_assistant_is_running.mdwn | 2 + ..._7832243a36613c48d0077b438dbf8b4a._comment | 10 + ...sync_between_indirect_and_direct_mode.mdwn | 6 + ..._7efc0d79196675582571c05fdd133b53._comment | 8 + ..._8ac84dbaf7a4d503497487cbdb1749d8._comment | 8 + ..._9acb237711669ec6046a8d07f9ed3b2c._comment | 8 + doc/forum/syncing_home_directories.mdwn | 7 + ..._220a6e0ffe0ea610921a63c0a6e3beab._comment | 16 + .../syncing_non-git_trees_with_git-annex.mdwn | 46 + ..._7f9593bdfd95e4a8814e6cc5c44619e6._comment | 24 + ..._49f15478781a0ad5e46e75319070335c._comment | 16 + ..._6d8f399f0549eddd1d1f5c9c9a10c654._comment | 13 + doc/forum/taskwarrior.mdwn | 11 + ..._1c3a29e7d292cb602d9d349f8009b51e._comment | 10 + doc/forum/telehash_syncing.mdwn | 10 + ...ll_us_how_you__39__re_using_git-annex.mdwn | 6 + ..._4884803ddee7f642a3ac995a19967a6a._comment | 17 + ..._61f5054918e7b36c191454365bc7f3b7._comment | 10 + ..._db07e8703be606c998c831e91d300d69._comment | 10 + ..._a58595969cdd42ed20210e9615b42e42._comment | 22 + ...95__remotes__47__hook_with_tahoe-lafs.mdwn | 22 + ..._76bb33ce45ce6a91b86454147463193b._comment | 10 + ..._4d9b9d47d01d606a475678f630797bf9._comment | 10 + ..._8a812b11fcc2dc3b6fcf01cdbbb8459d._comment | 12 + ..._fc98c819bc5eb4d7c9e74d87fb4f6f3b._comment | 39 + ..._c459fb479fe7b13eaea2377cfc1923a6._comment | 8 + ..._2e9da5a919bbbc27b32de3b243867d4f._comment | 23 + ..._d636c868524b2055ee85832527437f90._comment | 20 + ..._39dc449cc60a787c3bfbfaaac6f9be0c._comment | 10 + ...d_repositories:_fatal:_not_a_git_repo.mdwn | 32 + ..._0a755a4a281c3bd130722093c8ddd080._comment | 10 + doc/forum/ui.mdwn | 11 + ..._f3e3446b05d6b573e29e6cad300fb635._comment | 10 + ..._b493ee97eb2378e72c12f3d137109580._comment | 15 + doc/forum/unannex_alternatives.mdwn | 9 + ..._dcd4cd41280b41512bbdffafaf307993._comment | 46 + ..._58a72a9fe0f58c7af0b4d7927a2dd21d._comment | 36 + ..._b1687fc8f9e7744327bbeb6f0635d1cd._comment | 16 + .../unknown_response_from_git_cat-file.mdwn | 8 + ..._f26ba569e715fe69b6de3093930362ee._comment | 8 + .../unlock__47__lock_always_gets_me.mdwn | 11 + ..._dee73a7ea3e1a5154601adb59782831f._comment | 12 + ..._f89b4349dde840c355a3bc28908decdf._comment | 8 + ..._acbab7b75726d34dccb5c9dab7b3e728._comment | 8 + doc/forum/unrelated_repositories_sync.mdwn | 15 + ..._c899b7b05a96d14e25c2efadff3b4e52._comment | 10 + doc/forum/unsynced_folder.mdwn | 3 + ..._7d7a262f067c7b02d76e82637223934c._comment | 22 + ...ting_the___34__number_of_copies__34__.mdwn | 14 + ..._327bdb0d9c190c60c7147b3acf07af09._comment | 10 + ..._7e11c839637e0894332e413cde02cee9._comment | 8 + ..._8b7a70fb3bb41e4eda412302834730bb._comment | 8 + doc/forum/use_existing_ssh_keys__63__.mdwn | 5 + ..._c420c53f022bbd1b28494bc44d076feb._comment | 8 + ..._e4cae848e5701852073ced307832872b._comment | 12 + ..._a97c20b6df74c49e5f57c7caf962f1e2._comment | 10 + ...2_directories___40__like_unison__41__.mdwn | 7 + ..._5c3ee8a8aaa6d0918c0cc9683ce177ae._comment | 10 + ..._648946353c6d90c57351cce4010f1301._comment | 10 + doc/forum/version_3_upgrade.mdwn | 9 + ..._05fc9c9cad26c520bebb98c852c71e35._comment | 13 + doc/forum/view_from_numeric_values.mdwn | 9 + ..._f3c440f3f0104002a0020ba96ddcf87b._comment | 11 + ..._2414e1a8cfd154c339d8fc0e4a630ae9._comment | 12 + ..._7879a11cc9767cdaac14f9993182dc25._comment | 13 + ..._517c7659654a6fc608eb3332053df8a4._comment | 28 + .../view_including_files_with_no_tags.mdwn | 5 + ..._b0aafc023fbec33af268576c4c199af3._comment | 24 + ..._5ae9d5308371bdb1f94342c9f9b01aff._comment | 8 + doc/forum/vlc_and_git-annex.mdwn | 11 + ..._9c9ab8ce463cf74418aa2f385955f165._comment | 10 + ..._037f94c1deeac873dbdb36cd4c927e45._comment | 8 + ...webapp___47___assistant_without_watch.mdwn | 9 + ..._1bcd99aa81f937ded683e19a69d33dd9._comment | 10 + ..._9f5b3f5bf7fedcd5baec519d97d3aa8c._comment | 16 + doc/forum/webapp_and_manual_mode.mdwn | 7 + ..._5b5df5ffeb6ee15779972f13fdc11729._comment | 10 + ..._a1f06b50d1317c78a301b47eb05d2617._comment | 19 + .../webapp_listen_port_with_autostart.mdwn | 3 + ..._65dbcf3d8f6c16568f5a326242eab9c5._comment | 20 + ..._39664f833dedc1a4fe083eec9bc4a7cd._comment | 75 + .../what_happens_to_deleted_files__63__.mdwn | 24 + ..._a476174646ad3adfbbe0cafdd7d42d08._comment | 10 + doc/forum/windows_port__63__.mdwn | 2 + ..._23fa9aa3b00940a1c1b3876c35eef019._comment | 9 + ...et__47__drop_via_webapp_file_explorer.mdwn | 1 + ..._c818a6d44dc13a56460b1865f70eb97c._comment | 8 + ...ake_copy_stop_on_exhausted_disk_space.mdwn | 4 + ..._467e5e3db3e836030bc4b4f15846951f._comment | 12 + ..._e3ca3db9bea11d3e085ee9c3c56b33fe._comment | 8 + ..._0ef8c37350fc192d9b784fbab1d9f318._comment | 8 + .../working_without_git-annex_commits.mdwn | 20 + ...peared__44___broken_symlink_showed_up.mdwn | 27 + ..._00b084f9786de6516f46065c0cb00e79._comment | 11 + ..._138499b36d28c5e267b4aad8792dc87e._comment | 48 + ..._6c59c494b563e56d061417eb2216bb19._comment | 8 + ..._ccbba61cdd6fce3e5de82417bcc0cbfb._comment | 12 + ..._50526283b35997cece2f087507cdd4ee._comment | 12 + ...de_to_track_my___47__home__63____63__.mdwn | 7 + ..._b011442de2f67f3ad340031a0767e990._comment | 8 + ..._c69865c08c3eb49d64310fc76e80c65d._comment | 8 + ..._7651fb48fc71b2c7b4e7b6830a0f9865._comment | 10 + ..._7d88f1aa163185c801b7697846086c7f._comment | 12 + doc/future_proofing.mdwn | 38 + doc/git-annex-shell.mdwn | 125 + doc/git-annex.mdwn | 1736 +++ doc/git-union-merge.mdwn | 38 + doc/how_it_works.mdwn | 42 + ..._b3bdd6a06d5764db521ae54878131f5f._comment | 14 + ..._2a8ce5859040d815e6234fc18f5f1961._comment | 10 + doc/index.mdwn | 45 + doc/install.mdwn | 32 + doc/install/Android.mdwn | 37 + ..._225f2c6fe255be93702cfbd4dc172f3b._comment | 8 + ..._4e970633d9073fcf4bc33f3fff2525b2._comment | 10 + ..._87da4f379a0276b662583e7e22061218._comment | 8 + ..._f9ced494a530e6ae3e76cfbaddb89f5d._comment | 8 + ..._74cccae04ea23a8600069c7e658143aa._comment | 8 + ..._82c7cb31d19d4e18ca5548da5ca19a79._comment | 8 + ..._cebaa8ee5bbed27d9b2d032ca7bdec6e._comment | 8 + ..._34f7c42050fa48769a6bfae60d72e477._comment | 8 + ..._f3d289b78d6bdb3cc65689495a8439a5._comment | 11 + doc/install/ArchLinux.mdwn | 20 + ..._da5919c986d2ae187bc2f73de9633978._comment | 8 + ..._e5f923e6d81cfb3fba7a72f60baaf4ab._comment | 16 + ..._8e607cd883ec174571e9dfe3b25bfd05._comment | 8 + ..._a378391dd218859f381c479259dd8fe3._comment | 10 + ..._cbc960cd78bf5b90e3bb6cb605d6d970._comment | 10 + ..._1d597d6a95f9c2df7dae6e98813e4865._comment | 36 + ..._2d708977e2fad6b68803494576382df5._comment | 10 + ..._5b5f5e0b64e5bfb1ea12e8b251c6fb5f._comment | 15 + doc/install/Debian.mdwn | 20 + ..._d5da996e106d2e4d8a822aa9bcc78596._comment | 12 + ..._84283676da247c401bc9b4bb12c2b453._comment | 8 + ..._0aca83b055d0a9dd8589c50250a8bbea._comment | 13 + ..._167a091764e5e99ec0f35a65e95a22de._comment | 8 + ..._a34e23d9aa3027012ab1236aa4f7d5cb._comment | 8 + ..._20d8271ba3f6cfe3c8849c3d41607630._comment | 8 + ..._029486088d098c2d4f1099f2f0e701a9._comment | 9 + ..._648e3467e260cdf233acdb0b53313ce0._comment | 8 + ..._4d922e11249627634ecc35bba4044d9e._comment | 8 + ..._2a93ab18b05ccb90e7acc5885866fca2._comment | 9 + ..._38e6399083e10a6a274f35bddc15d4ac._comment | 18 + ..._2e7bbdbaabbfb9d89de22e913066e822._comment | 8 + ..._1bccc7bf7a4ef61a9b30024b9b22ba7d._comment | 12 + ..._5b5a3b0e8abe8831a6a15a4e258d14fd._comment | 10 + ..._97eaed998ffd1ed79585075ed5cff06e._comment | 8 + doc/install/Docker.mdwn | 27 + doc/install/Fedora.mdwn | 38 + ..._c4db84e672ad4b45b522db735706b00f._comment | 16 + ..._f98c488c09bef86e2b0414589ce9e141._comment | 25 + ..._d872acf8865fe7c99a9b712db5b38ea4._comment | 8 + ..._93b3402e4c51e1a5c96f907bb528164b._comment | 16 + ..._0427e0503764b29e57abf9e97155136b._comment | 15 + ..._1b1b38a79251fe2e8c1e4debbe3bc3c5._comment | 12 + doc/install/FreeBSD.mdwn | 2 + doc/install/Gentoo.mdwn | 3 + doc/install/Linux_standalone.mdwn | 34 + ..._1adc00aecc51f1e74701bd67cd74155d._comment | 8 + ..._7983285b56fd10359a7cc3615fd1e2fe._comment | 12 + doc/install/NixOS.mdwn | 6 + doc/install/OSX.mdwn | 65 + ..._cd2120552ef894a37933b328136fa4cc._comment | 8 + ..._740fa80e2e54e6fb570f820ff1f56440._comment | 8 + ..._a84028080578a8b60115b6c4ef823627._comment | 8 + ..._d6f1db401858ffea23c123db49f5b296._comment | 8 + ..._035f856923276b0edad879e196e94097._comment | 9 + ..._336e0acb00e84943715e69917643a69e._comment | 35 + ..._1befafa862b7d07b1f6e57c0182497cf._comment | 36 + ..._19c08b2c6c2c5cd88bf96d2bcbbd9055._comment | 10 + ..._537fad5d8854e765499d47602d1ab398._comment | 8 + ..._18d4377f4ded5604d395d73783ba82c9._comment | 8 + ..._3e6a3c00444badf2cf7a9ee3d54af11e._comment | 8 + ..._987f1302f56107c926b6daf83e124654._comment | 11 + ..._6b5f44a98f9d37a1c6ecfe19a60fe6c5._comment | 12 + ..._3d82a270dd4b0159f4aab5675166e1e3._comment | 30 + ..._b9d3563a2cc3d769f27876e028dc344d._comment | 12 + ..._db90984062a07576a4777b2d743161f1._comment | 24 + ..._2a60108a440231ba83f5a54b6bcc5488._comment | 14 + ..._d453510b9bb62072a4c663206c12c8a4._comment | 8 + ..._0970bfd63137ea48701dff6aea1b4bcb._comment | 18 + ..._8622ed56c6a8034c20fb311418d94003._comment | 8 + ..._25552ff2942048fafe97d653757f1ad6._comment | 8 + ..._ce58633ef5b2f8f4caa7e626358f33be._comment | 8 + ..._09084a7b3cf06bfa3add0f4991476ffe._comment | 10 + ..._a46d8e3e7795b9afb1e1c2be943d12af._comment | 10 + ..._203a36322b3c453c05c8906c64e62e06._comment | 8 + ..._874ff01f27911baf6ef0f559d5d5f5a0._comment | 27 + ..._47a77a03040fe628109bd54f82f9ad7a._comment | 17 + ..._25cac8bcd84a5210fc0a5243260b8cc7._comment | 18 + ..._bbe99673033e4c48c8bb3db24ee419f9._comment | 8 + ..._39b4b748b4586bf32b37edfefef84bba._comment | 8 + ..._1a9c91ef43edc4148947f202ff604114._comment | 8 + ..._892f7e65f95f43697164267c4b71c0d5._comment | 8 + ..._38d9c2eea1090674de2361274eab5b0e._comment | 29 + ..._35bf3812db6f3ef25da9b3bc84f147c5._comment | 8 + doc/install/OSX/old_comments.mdwn | 1 + ..._4d15bfc4fc26e7249953bebfbb09e0aa._comment | 11 + ..._798000aab19af2944b6e44dbc550c6fe._comment | 10 + ..._707a1a27a15b2de8dfc8d1a30420ab4c._comment | 10 + ..._60d13f2c8e008af1041bea565a392c83._comment | 8 + ..._a6f48c87c2d6eabe379d6e10a6cac453._comment | 8 + ..._6ef2ddb7b11ce6ad54578ae118ed346e._comment | 9 + ..._6fd1fad5b6d9f36620e5a0e99edd2f89._comment | 9 + ..._af6fe3540032cdf4400478de87771058._comment | 30 + ..._8d3a0596db67108041728b20f2790f31._comment | 7 + ..._0a1760bf0db1f1ba89bdb4c62032f631._comment | 13 + ..._0327c64b15249596add635d26f4ce67f._comment | 19 + ..._7683740a98182de06cb329792e0c0a25._comment | 25 + ..._c9362141d15a2f68a75df9f8bfe29da0._comment | 17 + ..._8106196c3fef70652cb2106e2d5857db._comment | 8 + ..._47c682a779812dda77601c24a619923c._comment | 8 + ..._733147cebe501c60f2141b711f1d7f24._comment | 16 + ..._b090f40fe5a32e00b472a5ab2b850b4a._comment | 8 + ..._fc092412e99cf4c5f095b0ef710bc4de._comment | 8 + ..._d513e21512a9b207983d38abf348d00f._comment | 16 + ..._d68c36432c7be3f4a76f4f0d7300bac9._comment | 20 + ..._e6109a964064a2a799768a370e57801d._comment | 30 + ..._50777853f808d57b957f8ce9a0f84b3d._comment | 10 + ..._626a4b4bf302d4ae750174f860402f70._comment | 8 + ..._18a8df794aa0ddd294dbf17d3d4c7fe2._comment | 7 + ..._2ce7acab15403d3f993cec94ec7f3bc6._comment | 14 + ..._a93ad4b67c5df4243268bcf32562f6be._comment | 39 + ..._ae3ed5345bc84f57e44251d2e6c39342._comment | 14 + ..._c6b1b31d16f2144ad08abd8c767b6ab9._comment | 23 + doc/install/ScientificLinux5.mdwn | 62 + doc/install/Ubuntu.mdwn | 44 + ..._490e065314693423ab6969d8ae6978fe._comment | 8 + ..._4ebac3fb43de854ed1a3b1d2ea94011a._comment | 10 + ..._38f69dffe2db0d15e4c4e5cb47f40ef8._comment | 8 + ..._d1c511153fe94bf33e19a1281f1c92f2._comment | 8 + ..._ad13886c1c1f76d1cd995ea7b7d8471c._comment | 8 + ..._a08817322739b03cf0fec97283b16f1a._comment | 8 + ..._fe0997e56136bd30749f0995cbf19b56._comment | 12 + ..._fbb5306a162db1a1ee9efa3523aac952._comment | 11 + ..._a97e7f0e62ac685c3ded423bddeaa67f._comment | 14 + ..._921a223fd7e679b9ced3d8ba5ce688e0._comment | 8 + ..._1f943cb084fa8e21bc6ee5fc3118f02f._comment | 8 + ..._c2f8b35ada873acb1ce593b04e2899fe._comment | 11 + doc/install/Windows.mdwn | 38 + doc/install/cabal.mdwn | 58 + ..._7ebe353b05d4df29897dc9a4f45c8a91._comment | 8 + ..._0d06702e6e0ae3cd331cf748a9f6f273._comment | 44 + ..._b93ca271dffca3f948645d3e1326c1d9._comment | 12 + ..._3dac019cda71bf99878c0a1d9382323b._comment | 8 + ..._14b46470593f84f8c3768a91cb77bdab._comment | 9 + ..._c3a5b0aad28a90e0bb8da31a430578eb._comment | 8 + ..._4faf214f97f9516898d7c17d743ef825._comment | 10 + ..._2a9d6807a3a13815c824985521757167._comment | 10 + ..._1efa0c7a963ec452fc6336fbe4964f6e._comment | 10 + ..._6f42f9234f9ff6a2ca6bbb4d2643843e._comment | 44 + ..._f04df6bcd50d1d01eb34868bb00ac35c._comment | 18 + ..._0f553be2a4c666e3bed58b2bce549406._comment | 8 + ..._f91a6ec21e96eced73ea9579fd8cbd15._comment | 8 + ..._2f27b78215f97ade1986ca806c634cb3._comment | 16 + ..._c34d2b1d95830a3e58671a5b566a1758._comment | 8 + ..._40cbde8ec067b3a860e6df1a9bea5f76._comment | 8 + ..._8a7664e6f9271718dc607a0782366c5b._comment | 8 + ..._bd455c732639728bce2bfc39e32871d2._comment | 8 + ..._c080e9239b6eec88d329c28da7bb4141._comment | 17 + ..._15951dd070a675300420eea137a28ef9._comment | 10 + ..._ac082dca67f4a29b06070c0283130f52._comment | 39 + ..._a69d17c55e56a707ec6606d5cdddee25._comment | 17 + ..._ad639c07cb79e89406e95c1dafce3a01._comment | 35 + ..._4763b24a29627d55f465b9ea260ea7ec._comment | 22 + ..._1d34c294486c85b1149675fa5861ae35._comment | 10 + ..._8d4dfc33cada6091c30d3a43ce404b8b._comment | 21 + ..._38451e751add6daf479b559c4b6a7c61._comment | 8 + ..._4d44e4531e6686bd340f26836ad40026._comment | 8 + ..._55bed050bdb768543dbe1b86edec057d._comment | 10 + ..._2ff7f8a3b03bea7e860248829d595bd1._comment | 14 + ..._8789fc27466714faa5a3a7a6b8ec6e5d._comment | 24 + ..._5afb2d081e8b603bc338cd460ad9317d._comment | 21 + ..._129c4f2e404c874e5adfa52902a81104._comment | 22 + ..._738c108f131e3aab0d720bc4fd6a81fd._comment | 8 + ..._5ddbba419d96a7411f7edddaa4d7b739._comment | 12 + doc/install/fromscratch.mdwn | 27 + doc/install/openSUSE.mdwn | 3 + doc/internals.mdwn | 247 + ..._4b8ed353dca4f484b3b6eb463fa02fd8._comment | 8 + ..._c19232d5cc4976c2e5b014aef6e8d9ec._comment | 8 + doc/internals/hashing.mdwn | 38 + ..._9153e4f4f9335e524cf1b96a51bef41f._comment | 10 + doc/internals/key_format.mdwn | 23 + doc/internals/lockdown.mdwn | 44 + doc/license.mdwn | 14 + doc/license/AGPL | 661 ++ doc/license/GPL | 674 ++ doc/license/LGPL | 502 + doc/links/key_concepts.mdwn | 7 + doc/links/other_stuff.mdwn | 9 + doc/links/the_details.mdwn | 8 + doc/location_tracking.mdwn | 30 + doc/logo-old-bw.svg | 60 + doc/logo-old.png | Bin 0 -> 9092 bytes doc/logo-old.svg | 77 + doc/logo-old_small.png | Bin 0 -> 4713 bytes doc/logo.mdwn | 13 + doc/logo.svg | 92 + doc/logo_16x16.png | Bin 0 -> 233 bytes doc/logo_32x32.png | Bin 0 -> 473 bytes doc/logo_small.png | Bin 0 -> 4749 bytes doc/meta.mdwn | 5 + doc/metadata.mdwn | 47 + ..._d367fdaf0425b59d694bf16059d47192._comment | 9 + ..._e15d2b5a405db4ccdb91d6aad4a22983._comment | 10 + doc/news.mdwn | 11 + doc/news/2013_git-annex_user_survey.mdwn | 5 + doc/news/LWN_article.mdwn | 2 + doc/news/Presentation_at_FOSDEM.mdwn | 4 + doc/news/git_annex_fall_of_code.mdwn | 27 + ...rebox_a_FUSE_filesystem_for_git-annex.mdwn | 19 + ..._e238d1734238e37bb55ff952b32e06b8._comment | 9 + ..._937cbaccf235d6d9118aacd49058bb4f._comment | 11 + ..._faa5cf0645728b4ade850a691fa472db._comment | 25 + ..._ad156d6199b525884114ff823d265bf7._comment | 39 + ..._877061eb24d9d9543cc9cd229906bd64._comment | 8 + ..._8991648dda991768e3a58477a4c3c923._comment | 10 + ..._a5e85a3258ae8a241674dda4172b3e94._comment | 8 + ..._016ef01507edd6baa26c6c9a90f35ed7._comment | 10 + ..._e4b6899c3b12fc260806ba8d36df6158._comment | 8 + ..._776574c242235d9256da287048e38dc0._comment | 8 + ..._aea5d528f3e0fdc81d0ea83d65f48812._comment | 8 + ..._97065912d6a204c7387d7de5e48de420._comment | 8 + ..._e589892996ca7cca3febdbf0f2cc379b._comment | 8 + doc/news/version_5.20140221.mdwn | 28 + ..._d50bff4ee026db3397333e8ded7c5940._comment | 8 + doc/news/version_5.20140227.mdwn | 32 + doc/news/version_5.20140306.mdwn | 34 + doc/news/version_5.20140320.mdwn | 37 + doc/not.mdwn | 55 + ..._d8fb9add7e98dadea2a39f8827f75447._comment | 10 + ..._6c23aba5a9c341f2d5e2007e4b43f2ea._comment | 8 + ..._a0ef1a045257659f0f8722e4987e0ccc._comment | 8 + ..._c5c20576388f18daba3af913b44fb001._comment | 8 + ..._ab41bec1ccc884e71780cb9458439170._comment | 8 + ..._0e19ff7deb5ed65f2bc685d4c516d816._comment | 8 + ..._bab9584c41a25dda934ad230e3eb732d._comment | 8 + ..._b2a0d5a45ab8ddd66c29dde9412d7a12._comment | 51 + ..._f2829ecbe80a61aa9a8411d2403de69e._comment | 14 + ..._547fc59b19ad66d7280c53a7f923ea08._comment | 13 + ..._581e23cca0219711f8a4500a8d5d20fc._comment | 16 + ..._5c61457f117de38ef487e5cc2780d554._comment | 24 + ..._69aa47398a3c13ce64f146de985b727d._comment | 10 + doc/polls.mdwn | 2 + doc/polls/2013.mdwn | 5 + doc/preferred_content.mdwn | 169 + ..._f0bce3c67f293eaba97b92f0942876b6._comment | 8 + ..._7d45e21dfb016e9ffa4715346dd0c1a6._comment | 19 + ..._1ccd90b009245667ad59f4d29d2a3a37._comment | 8 + ..._384025b5fa23a3f175985a081438149f._comment | 8 + ..._6a9bc657bc7415f0e118357d8c6664c6._comment | 18 + ..._f0a957e67297c4bb5a8778c11b3c9fd4._comment | 9 + ..._b434c0e2aaa132020fd4a01551285376._comment | 12 + ..._c4acaa237bf1a8512c5e8ea4cdbd11b9._comment | 8 + ..._ff2a2dc9c566ebd9f570bdfcd7bfc030._comment | 27 + ..._f82538be42428691d7cab60a7add2e74._comment | 13 + doc/preferred_content/standard_groups.mdwn | 117 + ..._026e47e425d06c4b2580238b3187a379._comment | 13 + ..._460bae34ba7c05357318a202b2932d25._comment | 8 + doc/privacy.mdwn | 47 + doc/publicrepos.mdwn | 17 + doc/related_software.mdwn | 15 + doc/repomap.png | Bin 0 -> 67316 bytes doc/required_content.mdwn | 17 + doc/scalability.mdwn | 44 + doc/shortcuts.mdwn | 12 + doc/sidebar.mdwn | 12 + doc/sitemap.mdwn | 4 + doc/special_remotes.mdwn | 81 + doc/special_remotes/S3.mdwn | 53 + ..._c366f020c9b97a365e21878a33360079._comment | 10 + ..._c1da387e082d91feec13dde91ccb111a._comment | 12 + ..._59c3ecab7dbc8be53258460473cac21c._comment | 8 + ..._0789a21d980825188bb09f7fc8bba8be._comment | 33 + ..._29574a51d5831c51e2e765eb2c06e567._comment | 12 + ..._ceb9048c743135f6beca57a23505f0a3._comment | 8 + ..._7b79f8b5ef88a2775d61b5ac5774d3e0._comment | 8 + ..._4a1f7a230dad6caa84831685b236fd73._comment | 8 + ..._5b22d67de946f4d34a4a3c7449d32988._comment | 8 + ..._bcab2bd0f168954243aa9bcc9671bd94._comment | 8 + ..._38c0b062997fde1ad28facc05d973e83._comment | 12 + ..._409bc2b56382417cf26bb222fb783ba7._comment | 8 + ..._78da9e233882ec0908962882ea8c4056._comment | 10 + ..._6af9781004d982d8e6b20a83ad29eead._comment | 8 + ..._0fa68d584ee7f6b5c9058fba7e911a11._comment | 12 + ..._7ad757b3865b04967c79af0a263bb3b0._comment | 10 + doc/special_remotes/bup.mdwn | 39 + ..._f78c1ed97d2e4c6ebffaa7482cfe0c9b._comment | 23 + ..._b53bceb0058acf4d1ab12ea4853ee443._comment | 24 + ..._65d923226cf6120349d807c5c60f640c._comment | 8 + ..._96179a003da4444f6fc08867872cda0a._comment | 43 + ..._612b038c15206f9f3c2e23c7104ca627._comment | 12 + ..._1186def82741ddab1ade256fb2e59e6f._comment | 17 + ..._7d22a805dd2914971e7ca628ceea69be._comment | 10 + ..._5942333cde09fd98e26c4f1d389cb76f._comment | 10 + ..._cb1a0d3076e9d06e7a24204478f6fa98._comment | 10 + ..._4cbc67e5911748d13cee3c483d7ece8a._comment | 12 + ..._ca7096a759961af375e6bd49663b45b3._comment | 10 + ..._e9881290486a1770bd260f8650ada9c6._comment | 8 + ..._e01b5cc5a0d81b071e93e27e7b91fe2a._comment | 8 + ..._13237170ef5b6646e0e25d3421af3fe5._comment | 10 + ..._1a36a0483a9db04d36e0234a192ebad8._comment | 12 + ..._a8419963dc024b1d9eb73807596012dc._comment | 8 + ..._95ccfdd22a2391daa99e0beb04adedd6._comment | 11 + ..._b9d238fb15ad7628e33c90b071e07bb0._comment | 12 + ..._cc21b81a8f809f6efa5f5b6332513fc3._comment | 12 + ..._3fe750118ff1edbe91a110b86fb5b662._comment | 10 + ..._6794eb52bd87c28ef1df3172aa7d5780._comment | 9 + ..._961276c18e9353ca8e25cad53e7ec51f._comment | 8 + ..._6b7242721f2f2c77b634568cb737e3e3._comment | 13 + ..._5c11e69c28b9ed4cbe238a36c0839a47._comment | 15 + ..._97543acfa7434e332ebea5672e446317._comment | 8 + ..._9229776623c234204c8b164edff95da0._comment | 8 + ..._3bbda479d13f6bf393dcd59ed94ddeaa._comment | 10 + ..._f7000975d38077828ab11a99095b39eb._comment | 8 + ..._5d2bd7c1e1493d3c3784708a9b0bc001._comment | 8 + ..._af01ee5ce31b1490af565cb087d65277._comment | 10 + ..._3d4ffec566d68d601eafe8758a616756._comment | 13 + ..._26af468952f0403171370b56e127830a._comment | 8 + doc/special_remotes/directory.mdwn | 39 + ..._86f8c1b09cbd82bcd76378dfa1b3ca07._comment | 49 + .../directory/comment_12._comment | 16 + ..._311cd013fd8db47856d84161119e059d._comment | 12 + ..._e8a53592adb13f7d7f212a2eb5a18a31._comment | 12 + ..._d949edad6a330079f9e15f703f9091e3._comment | 10 + ..._49009f4e9e335c9a9d0422aa59c9a432._comment | 8 + ..._f5e9b0b477c4e521f8633fd274757fa3._comment | 8 + ..._e790718423c41f5ea8047ea5225bfacd._comment | 11 + ..._325aac80b86588912c4fd61339ccbd0b._comment | 10 + ..._4206db69d68d9917623ce02500387021._comment | 12 + ..._acd9023511fe43817718bc89430f96c3._comment | 8 + ..._d330eb808a990bb71034613c297a265e._comment | 8 + doc/special_remotes/external.mdwn | 27 + doc/special_remotes/external/example.sh | 195 + doc/special_remotes/gcrypt.mdwn | 45 + doc/special_remotes/glacier.mdwn | 47 + ..._fcd856b99dc6b3f9141b65fe639ef76b._comment | 10 + ..._38fcca87074f6ea31a12569a822aa8c9._comment | 12 + ..._cea5bcb162e4288847ba5f25464a0406._comment | 28 + ..._0c92cc82c7ac513130f862391a02d329._comment | 8 + ..._8d1dcb4bf48386314bfb248ea6eeeb68._comment | 8 + ..._adb1db354dc4941e4b004e4ba34660d7._comment | 8 + ..._747e403aac5acaba00e220931e926951._comment | 10 + doc/special_remotes/hook.mdwn | 109 + ..._6a74a25891974a28a8cb42b87cb53c26._comment | 32 + ..._ee7c43b93c5b787216334f019643f6a0._comment | 17 + ..._2593291795e732994862d08bf2ed467b._comment | 17 + ..._35d79b5ffa5a19056efcdc805070bc4b._comment | 18 + ..._6fbf1e963fa3ea4b2eb8ca5a3819762d._comment | 10 + ..._e0ab48d5333e5de85f016b097e6fdac1._comment | 12 + ..._cc2b1243c2c36e63241513bcaddfea67._comment | 10 + ..._bbae315233bda48eb04662dfd48cf1ae._comment | 30 + ..._037523d1994c702239ca96791156fe65._comment | 10 + doc/special_remotes/rsync.mdwn | 56 + ..._43e8fa3517c1f5935f02ad06fbed63dc._comment | 8 + ..._8cafc1a8b37e6fb056185ec058c0c3e8._comment | 8 + ..._9e180c397486989beab21699b8e8f103._comment | 16 + ..._25545dc0b53f09ae73b29899c8884b02._comment | 8 + ..._960a89b1ae7e3888ffba06baa963dc21._comment | 20 + ..._db84816c31239953dd21f23a8c557b43._comment | 15 + ..._ccaffa4aded9dab88c76a856b96ea5b9._comment | 9 + ..._e687b9482b177e1351c8c65ea617d3fa._comment | 8 + ..._e122979ea811d9ef835ba05bb936190f._comment | 10 + ..._d566113318d0aa7500d76ffe1bd46069._comment | 10 + ..._5dcf10a502b2d4feac46b620d43e9d00._comment | 8 + doc/special_remotes/tahoe.mdwn | 47 + doc/special_remotes/web.mdwn | 11 + ..._0bd570025f6cd551349ea88a4729ac8e._comment | 8 + ..._333141cc9ec6c26ffd19aa95303a91e3._comment | 8 + doc/special_remotes/webdav.mdwn | 42 + ..._6b523eea78eae1d19fe2a9950ee33e3a._comment | 26 + ..._83fc4e7d9ba7a05c8500da659f561b8f._comment | 10 + ..._239367ad639c61ecdf87a89f7ac53efe._comment | 10 + ..._ffa52f7776cdc8caa28667b5eadae123._comment | 8 + ..._5b8cbdb5e9a1b90d748a5074997e1cd5._comment | 12 + ..._d3be3e588c3a2abb2025ceb82c18b0ef._comment | 10 + ..._6fa7e11331db5a943015bd5367eb3d73._comment | 12 + ..._2627b41f80c7511b27464e2040b128a8._comment | 8 + doc/special_remotes/xmpp.mdwn | 39 + ..._c7c2e2e81cb5b2b9a5272430c835dd39._comment | 10 + ..._05d9a67b9331656b4035399641cedb1b._comment | 22 + ..._568247938929a2934e8198fca80b7184._comment | 11 + ..._9fc3f512020b7eb2591d6b7b2e8de2d7._comment | 10 + ..._48ddbba1402d89acaea07cff747c48e0._comment | 28 + ..._59857879abaae22bde444a215e00bf18._comment | 14 + ..._583ee374bd34fcc9ae26c2fd690e8c47._comment | 73 + ..._8f0b5bba1271d031a67e7f0c175d67d5._comment | 8 + ..._ac7acbded03325b015959d82ae77faf1._comment | 10 + ..._81a9636a1e8a36a58185468a26f8633d._comment | 8 + ..._eda76b826491c96b1ce072aacf9d3adf._comment | 23 + doc/summary.mdwn | 11 + doc/sync.mdwn | 44 + ..._2cd8ab86f498d6f676f859b552f831eb._comment | 8 + ..._59681be5568f568f5c54eb0445163dd2._comment | 8 + ..._9301ff5e81d37475f594e74fbe32f24e._comment | 11 + ..._49560003da47490e4fabd4ab0089f2d7._comment | 8 + ..._cf29326408e62575085d1f980087c923._comment | 8 + ..._18c396c59907147bb2bf713e55392b6b._comment | 8 + ..._012e9d4468d0b88ee3c5dad3911c3606._comment | 10 + ..._6276e100d1341f1a0be368f54de0ae7b._comment | 8 + ..._b89161c82c05634d35f6b65bf8360a96._comment | 14 + ..._849883b7cc05bfcb01914d8737098010._comment | 18 + doc/templates/bare.tmpl | 1 + doc/templates/bugtemplate.mdwn | 18 + doc/templates/walkthrough.tmpl | 2 + doc/testimonials.mdwn | 34 + ..._2bf439f7a3bc3d6fab91849017946182._comment | 8 + doc/thanks.mdwn | 370 + doc/tips.mdwn | 4 + ..._37____38____34____35___Haskell__33__.mdwn | 111 + ..._835a3608df3e9d044cabe822d0f3e7e4._comment | 27 + ..._080b30cba72a718e73ea715e259e1cfb._comment | 8 + doc/tips/Crude_Windows_Sync.mdwn | 35 + ...tralized_repository_behind_a_Firewall.mdwn | 59 + ..._78b9035234a690ca5a7c9f3cc78fa092._comment | 8 + .../Delay_Assistant_Startup_on_Login.mdwn | 13 + ..._c63917150527efab4b1106183b3aa7ef._comment | 8 + doc/tips/Git_annex_and_Calibre.mdwn | 120 + ...ly_annex_a_file_already_in_a_git_repo.mdwn | 19 + ..._7eaf73fb3355bd706ab18a43790b3c10._comment | 8 + ..._dac1a171204f30d7c906e878eb6bd461._comment | 45 + ..._b62ec0b848d2487d68d7032682622193._comment | 36 + ..._2423904e41a86cd1c6bc155d7b733642._comment | 9 + doc/tips/Internet_Archive_via_S3.mdwn | 85 + ..._d53a3848c20dce61867283fc03c2adaa._comment | 34 + ..._91c1472da27b00e5d682d22bc1ef04e0._comment | 10 + ..._e23cf781c532f80d47d52265f2b2c87e._comment | 8 + .../Shamir_secret_sharing_and_git-annex.mdwn | 21 + doc/tips/Synology_NAS_and_git_annex.mdwn | 59 + ..._ef7e19f1fd2005eb7cc74509ffb92766._comment | 9 + ...content_settings_for_my_android_phone.mdwn | 36 + ..._393d1636bb313530be383a075bd3440a._comment | 14 + ..._51a013213118660bdc06ff4d6c8110ba._comment | 12 + ...Git-annex_as_a_web_browsing_assistant.mdwn | 46 + ..._74167f9fff400f148916003468c77de4._comment | 8 + doc/tips/assume-unstaged.mdwn | 31 + ..._44abd811ef79a85e557418e17a3927be._comment | 10 + ..._5b589f37cfc03bf7be33a51826cc4dba._comment | 13 + doc/tips/automatically_adding_metadata.mdwn | 24 + ..._ffc308cc6aedabbc55820db4f401e0fb._comment | 8 + ..._bd64a53914107bc000c887b4d4bdf6af._comment | 12 + .../pre-commit-annex | 57 + ...tomatically_getting_files_on_checkout.mdwn | 15 + ...n_doing_fsck_on_large_special_remotes.mdwn | 2 + ..._e7c5c46112a2406b873d08bbf53c40d8._comment | 8 + ..._daf45ce29fed986fa9aa8b173760d0b7._comment | 14 + ..._72d222020af4a9c6c753eb1ee7e1f1cf._comment | 8 + ...sed_repository:_starting_from_nothing.mdwn | 75 + ..._b0d22822017646775869ce1292e676f4._comment | 8 + .../centralized_git_repository_tutorial.mdwn | 140 + ..._9072ebc0c61446d7b151fcfab616fea9._comment | 33 + ..._528e92b21f0551fde4adb956654953ae._comment | 8 + doc/tips/downloading_podcasts.mdwn | 69 + ..._4d4f6c22070b58918ee8d34c5e7290ad._comment | 8 + ..._d8d77048c7e2524968c188e1ad517873._comment | 24 + ..._0859317471b43c88744dd3df95c879f7._comment | 10 + ..._e8c3c97282d17e2a1d47fb9d5e2b2f7b._comment | 18 + ..._05a3694052de36848fbbad6eeeada895._comment | 8 + ..._21028bed8858c2dae1ac9c2d014fd2a1._comment | 8 + ..._4869fb5c9f896acc477c44de06c36ca7._comment | 8 + ..._2e278ff200c1c15efd27c46a3e0aed40._comment | 9 + ..._382f2b970738d9b1af577955c3083e90._comment | 15 + ..._f76fc6835e5787b0156380bf09fd81ca._comment | 8 + ..._f04bc32a34baeeffcd691e9f7cce0230._comment | 13 + ..._65ebf3a3bbf0a2aebd2b69640b757e16._comment | 10 + ..._a9a98cad7358d16792853a2ee413fe6c._comment | 8 + ..._5a8068a5cb0fd864581157a3aa5d1113._comment | 10 + ..._e7072a9da30b4c4b4c526013144238d4._comment | 10 + ..._79b3f8d678ac9f67df4c0cd649657283._comment | 8 + ..._35106fee5458bdd5c21868fbc49d3616._comment | 10 + ..._ceb16498b7aadbf04a27acd5d6561d46._comment | 8 + ..._147397603f0b3fdb42ca387d1da7c5ef._comment | 8 + ..._6a26a6cc7683d38fae0f23c5a52d1e23._comment | 24 + doc/tips/dropboxannex.mdwn | 29 + doc/tips/emacs_integration.mdwn | 25 + doc/tips/file_manager_integration.mdwn | 100 + doc/tips/finding_duplicate_files.mdwn | 21 + ..._2ed5aa8c632048b13e01d358883fa383._comment | 12 + ..._5efc6b6ee1dfec88512183e9679ca616._comment | 24 + ..._ddb477ca242ffeb21e0df394d8fdf5d2._comment | 8 + ..._900eafe0a781018ff44b35ac232e3ad3._comment | 8 + .../comment_3._comment | 39 + ..._1494143a74cc1e9fbe4720c14b73d42b._comment | 8 + ..._1a35ca360468bcb84a67ad8d62a2ef7d._comment | 8 + ..._a6e88c93b31f67c933523725ff61b287._comment | 16 + ..._347b0186755a809594bd42feda6363e2._comment | 10 + ..._3af51722da0980b724facb184f0f66e9._comment | 10 + ..._7b4b78a5cd253abfe4f6001049bf64f3._comment | 10 + doc/tips/flickrannex.mdwn | 50 + ..._50707f259abe5829ce075dfbecd5a4ba._comment | 13 + ..._ab5bcb025381b3da4d7c6dfd0c7310dd._comment | 46 + ..._90a331275d888221bc695003c8acbe46._comment | 58 + ..._1596e70dca71c853fd1d6fc9bde02b18._comment | 12 + ..._d74c4fc7edf8e47f7482564ce0ef4d12._comment | 10 + ..._f53d0d5520e2835e9705bea4e75556f0._comment | 30 + ..._9ebba4d61140f6c2071e988c9328cf7e._comment | 14 + ..._4470dae270613dd8712623474bc80ab0._comment | 24 + ..._d395cdcf815cb430e374ff05c1a63ff4._comment | 17 + ..._8cf730097001ffe106f2c743edce9d0a._comment | 12 + ..._a80c8087c4e1562a4c98a24edc182e5a._comment | 12 + ..._94f84254c32cf0f7dd1441b7da5d2bc6._comment | 8 + ..._5299b4cab4a4cb8e8fd4d2b39f0ea59c._comment | 9 + ...ncrypted_git_repositories_with_gcrypt.mdwn | 127 + ..._4440a80d64c60c7312d5c405d54e607a._comment | 15 + ..._28eb9d4ebf28ca310f9b357b1dad244a._comment | 30 + ..._b697b2ab10705b090a78e7717ec59b18._comment | 10 + ..._4e37146a870576f09f56d2e5ee784ed7._comment | 23 + ..._2044e821d841fcd37a51ae768fa88df2._comment | 12 + ..._5c54690586f2a781905ea4b25aa1147f._comment | 18 + ..._07feedb4348f8c31176cc744c19368a1._comment | 21 + ..._c2f873dffa015f1d72ad0c3921909316._comment | 8 + ..._f8a6e4415f4fe6da14f6a3b7334bc952._comment | 18 + ..._11b8e82d2a234f65b58b823e71c6d6a2._comment | 10 + ..._3e41948e1beffcf279bb05ef8e61cc07._comment | 16 + ..._4ce0b26b25b336f07b2e27246cdfba3e._comment | 16 + ..._49aa34d75d24a2066baa8a585bc9c2e9._comment | 14 + ..._3784e0c828cd60b6a9075c2d32d070cc._comment | 14 + doc/tips/googledriveannex.mdwn | 32 + ..._ce7f2b04e83cc02d9dabb712f266e5cc._comment | 9 + doc/tips/imapannex.mdwn | 25 + doc/tips/megaannex.mdwn | 29 + doc/tips/metadata_driven_views.mdwn | 152 + ..._1d6793701fd8a1a66bae04662cf853ce._comment | 12 + doc/tips/migrating_data_to_a_new_backend.mdwn | 16 + ...disconnected_directories_to_git_annex.mdwn | 77 + doc/tips/offline_archive_drives.mdwn | 69 + ..._3d4fdf42191a9d81434d00f51c3609ff._comment | 12 + ..._864c752aa8d064791a4b14dbbe2e6882._comment | 15 + ..._7be2ccaf70c9ecfc9a34384e0e31f490._comment | 10 + doc/tips/owncloudannex.mdwn | 28 + ..._129652308c3c499462828dcaf8e747a4._comment | 40 + ..._38604990368666f654d41891ba99ac61._comment | 15 + ..._1bfd290d00d6536da7d31818db46f8ec._comment | 87 + ..._492b6922a7c5bb5464fedb46b0c5303b._comment | 17 + ..._1d48ac08714fadcb06d874570d745bd8._comment | 16 + ..._65959f49a2f56bffd6fe48670c0c8d5a._comment | 8 + ..._7482002991672ef67836bae43b8d0be8._comment | 8 + doc/tips/powerful_file_matching.mdwn | 36 + doc/tips/recover_data_from_lost+found.mdwn | 19 + ..._f0901527a4f0faf0b1fd916d5b809314._comment | 9 + ..._ac405575058beeac992d07c55f7c53a8._comment | 8 + ...overing_from_a_corrupt_git_repository.mdwn | 17 + ..._f5827be97f78dbae113a5ba0c9ced896._comment | 8 + ..._e98df7275bb032308bb87e3607bdde32._comment | 8 + ..._11bece6dfac090edbcd783b266c482a3._comment | 8 + ..._86e99017f7585ac2f76753051214637e._comment | 8 + ..._c8953732ce353cdf0c4fb81ddc98c04a._comment | 8 + ..._d0da84df0241dc6ccf0aa0c7598917df._comment | 8 + ..._addf49556e4c33d55a41c393f519d0a4._comment | 10 + ..._505a2fc2b841fe8eb419801f923ef35f._comment | 8 + doc/tips/remote_webapp_setup.mdwn | 49 + ...e_or_dvcs-autosync_with_the_assistant.mdwn | 51 + ..._d1bd5d6b33951f6d11185bb4a8228269._comment | 8 + ..._54692ebf854ecbcc5314bb29c33ecc66._comment | 8 + ..._907e4032ca4a39adb846cf16dbf447dc._comment | 8 + ..._902d001ba86657ef0f8cca5b175f99ca._comment | 8 + ..._a1cf93f9b29658f0f26e9e0ae6057ee3._comment | 60 + ..._e10671908b58c554375787d0f76e2366._comment | 13 + ..._4114380f66b6376c851e93f6876d590b._comment | 8 + ..._6a5d6af107b297afd008b021f73d787b._comment | 8 + ..._74d57cf503a86d8f7ace2d769dbb58be._comment | 10 + ..._85765c0cfeb5b326c06cf60c98147cbf._comment | 21 + ..._082b5d90ffc836e7c86e40b63a75780d._comment | 8 + ...tup_a_public_repository_on_a_web_site.mdwn | 55 + ..._1d0fa6da33e401df1d7ff31979247fec._comment | 10 + ..._b98b761dee9d923153e3c288c1d987ee._comment | 11 + ..._a6698218f15c598c9b32e0af850133bf._comment | 12 + ...nnex_directory_between_multiple_users.mdwn | 39 + doc/tips/skydriveannex.mdwn | 32 + doc/tips/untrusted_repositories.mdwn | 28 + doc/tips/using_Amazon_Glacier.mdwn | 75 + ..._ccee7f4f5a483a3650270b6e09ab7293._comment | 36 + ..._d34e05f9244d3a4fcec87b3c360adb4e._comment | 10 + ..._4c504fd22775afe36296cf54d3e04a8e._comment | 8 + ..._e6ac76b0c20285f4f96b3d0975e8ac66._comment | 21 + ..._7788890f58f714b0cdf1462c718ea536._comment | 8 + ..._0fbe528a57552622e8128196ad80c863._comment | 8 + doc/tips/using_Amazon_S3.mdwn | 37 + ..._666a26f95024760c99c627eed37b1966._comment | 8 + ..._f5a0883be7dbb421b584c6dc0165f1ef._comment | 8 + doc/tips/using_Google_Cloud_Storage.mdwn | 9 + ..._c576182f39563ae68767391c4227a177._comment | 18 + .../using_box.com_as_a_special_remote.mdwn | 71 + ..._be39f063e8a6155cc2eb71829e884a63._comment | 8 + ..._no_fixed_hostname_and_optimising_ssh.mdwn | 59 + ..._c0b7682a2b6f3078457b85683c825baf._comment | 10 + doc/tips/using_gitolite_with_git-annex.mdwn | 89 + ..._8767bc8014b459a3cd76f275fd4fa8d6._comment | 8 + ..._00715e0b47f09130e0e536e29f7b9258._comment | 31 + ..._7027ce60265b8f24c8ab54553e544068._comment | 8 + ..._75218b7409c0e281cb01c9b2791e8cdf._comment | 20 + ..._7d4d4515218d1259d32be3baeb5ee56e._comment | 13 + ..._dc6f21b5a3d5931c8d949a9753411b9e._comment | 29 + ..._8e5039e6655fc80dc863b6cdf44ef02a._comment | 15 + ..._9c40e1da8bb44f7207e802377f5cf923._comment | 11 + ..._f1a180d5cf65b7a870a13ddb4f76d00d._comment | 21 + ..._33c19097b6f2b48dfe09ec4c8d952d06._comment | 11 + ..._9a2a2a8eac9af97e0c984ad105763a73._comment | 15 + ..._c82af00db3dd74ee9bfe12668e76e57b._comment | 13 + ..._d8efea4ab9576555fadbb47666ecefa9._comment | 8 + ..._807035f38509ccb9f93f1929ecd37417._comment | 8 + ..._eb81f824aadc97f098379c5f7e4fba4c._comment | 33 + ..._f688309532d2993630e9e72e87fb9c46._comment | 20 + ..._3e203e010a4df5bf03899f867718adc5._comment | 25 + ..._f8fd08b6ab47378ad88c87348057220d._comment | 10 + ..._8249772c142117f88e37975d058aa936._comment | 29 + ..._28418635a6ed7231b89e02211cd3c236._comment | 8 + doc/tips/using_the_SHA1_backend.mdwn | 11 + .../using_the_web_as_a_special_remote.mdwn | 109 + ..._321a41d611c6fe45e047af9c96c5176c._comment | 26 + ..._dfe9c8c49aadff80d2020288584e0390._comment | 10 + ..._ed8dd3bbd9b9ae7f2309b72b94f61eb1._comment | 18 + ..._c1133a524989a940f1b5db588707157a._comment | 10 + .../visualizing_repositories_with_gource.mdwn | 22 + ..._01c5cd21375990c612b8f291904ddb3e._comment | 10 + .../screenshot.jpg | Bin 0 -> 78509 bytes ..._to_do_when_a_repository_is_corrupted.mdwn | 22 + ...what_to_do_when_you_lose_a_repository.mdwn | 19 + ..._cf19b8dc304dc37c26717174c4a98aa4._comment | 11 + ..._fa9ca81668f5faebf2f61b10f82c97d2._comment | 8 + ..._fdcfca8707e310ca7bb94d359adf8607._comment | 8 + ..._679eb9be0bfb9d48a2b96383c4816f62._comment | 10 + ..._4fb04b70d88ec93ff9ed4f884747d5d4._comment | 12 + ..._05db504cbff2ec2a6346bf43e57a3c25._comment | 8 + ..._4e6baa41bfee6edf2b17d4ade2909c7b._comment | 16 + ...nother_simple_disk_usage_like_utility.mdwn | 9 + ..._41b212bde8bc88d2a5dea93bd0dc75f1._comment | 9 + ..._73698913837bfd5a58cf15721211e43e._comment | 8 + doc/todo.mdwn | 4 + ...y_to_pair_devices_like_bittorent_sync.mdwn | 9 + ..._d828bc374e50a49101c0b863f9b33080._comment | 8 + ..._a4badfc248be428e6426a936212cc896._comment | 8 + ..._0b04089d3d33fdb48eeb46bf168e9a3c._comment | 8 + ..._2bcab1b7998b4df08fca41b8d810f115._comment | 10 + ..._677e958c3f2effec7528b484aeb6478d._comment | 13 + ..._56e53803fdede895cba717e6b6e9a1bb._comment | 23 + ...4___shortcut___34__Add_to_Annex__34__.mdwn | 1 + doc/todo/Bittorrent-like_features.mdwn | 47 + ..._f4c110ef35ebf4fd89f06edf2c4f0c48._comment | 13 + ..._83148bd5c5c5e6c2eff3ad6e1d4fb82c._comment | 8 + ..._84f149b30de1562593623aa23dc0396c._comment | 10 + ..._7c54c83e582c0d4848aaf3d70e312707._comment | 10 + ..._194dd0e8404ea72af9fb6ff34b994998._comment | 20 + doc/todo/Build_for_Synology_DSM.mdwn | 4 + ..._e351084d9a83db3fd6d9d983227a6410._comment | 8 + ..._cc67a584f5c460a6fb63cf099c20e573._comment | 9 + ..._94023593d294b9cf69090fcfd6ca0e5a._comment | 9 + ..._314255fd503d125b5aeae2f62acfd592._comment | 8 + ..._9525cd0d75ff4c15182d10a855774b69._comment | 30 + ..._c12f525ef4cbe42cdf20fec0d53c8d86._comment | 10 + ..._4059016fa8da6af7a3eba8966821e8eb._comment | 10 + ..._8900c2985ab68b3b566c9f5d326471d6._comment | 8 + ..._f2b77368473d42b7f21e9d51d6415b58._comment | 10 + ..._a55fea734044c270ceb10adf9c8d9a76._comment | 8 + ..._59865ada057c640ac29855c65cf45dd9._comment | 23 + ..._6d860b1ad8816077b5fa596a71b12d5c._comment | 8 + ..._19ef2d293ba3bc7ece443d7278371c3f._comment | 8 + ..._609b7ad87dfbba49ec1f8c6fc2739ccd._comment | 12 + ..._d94a73b9a07c5cadf191005f817fd59a._comment | 29 + ...an_upgrade_is_available_in_the_webapp.mdwn | 5 + ..._c904182f6bff8b1a42070bbc038eb34e._comment | 17 + ..._ebe7a75ca291e7f749bfe9f46d10909d._comment | 8 + doc/todo/Deleting_Unused_Files_by_Age.mdwn | 13 + .../Enhancement:_git_annex_whereis_KEY.mdwn | 19 + ...re_Request:_Sync_Now_Button_in_Webapp.mdwn | 3 + ..._0d5c90eb0e8fe61b82a19c5fea343613._comment | 8 + ..._196552002d70390e8b52b4af61dca903._comment | 8 + ...prove_direct_mode_using_copy_on_write.mdwn | 42 + doc/todo/Limit_file_revision_history.mdwn | 117 + ...___47__ssh__47__git-annex__47__config.mdwn | 7 + ..._284c806e83a32af81b02aea7c7bc285a._comment | 10 + ..._1f55ad6b39906458779b2d604b003ffe._comment | 10 + ..._b00dce2374aac6968317d05d23bcfaf7._comment | 8 + ..._743d0b077110c5cac1e2f47187b75333._comment | 10 + ...al_remote_suggeston_-_clean_directory.mdwn | 23 + ..._4829c2a2302b4b9611deddfedfbaa944._comment | 10 + ..._4d81941fe53881eebff97109a07ba2f4._comment | 8 + ..._660a5b764ad42468154b2bb94f8ec004._comment | 8 + ..._eed178ce4bc4d2b3f08a1e3d3d62c086._comment | 12 + ..._1dae745cff1c0a38232d033dcc542ac4._comment | 16 + ..._8d6c791e5e2daec7b25828f6884a67c6._comment | 16 + ..._92ef2d4a7ed47000fda02732b4794dc0._comment | 10 + ..._78fb5cdd61220ffcf0ae1eaf266985ec._comment | 28 + ..._21712dfee4f37232c34eddbce2427691._comment | 11 + ..._0ba57952532d5ef1f2bbfb163faa3b2f._comment | 35 + doc/todo/Not_working_on_Android-x86.mdwn | 19 + ..._5eec4d7530c9df68f1bd1b1ca7021ef5._comment | 14 + ..._e5c4c99cb0675ad69bf8d7796be23c8e._comment | 12 + ...ion_for_browser_to_launch_webapp_with.mdwn | 7 + ..._build_if___34__make_test__34___fails.mdwn | 7 + ...e_add_support_for_monad-control_0.3.x.mdwn | 9 + ...fy__95__num__95__copies__34___command.mdwn | 16 + doc/todo/S3.mdwn | 24 + doc/todo/Show_repo_type_in_repo_list.mdwn | 1 + ..._ac6eb1072ef902a094b79dd8e0917c4d._comment | 10 + ..._6979c487f707a724a048d20e2e5744e6._comment | 14 + ..._529254a6cc20de7259d60a3cbc5ccaf7._comment | 8 + ...ow_transfer_for_a_lot_of_small_files..mdwn | 20 + doc/todo/Sync_repo_names__63__.mdwn | 10 + ...Use_MediaScannerConnection_on_Android.mdwn | 7 + ...g_site_for_files_with_obfuscated_URLs.mdwn | 7 + ..._1a1f34f4f389267d67e79409c0ca8b1d._comment | 9 + ...itcoin-mining_ASICs_for_hashing__63__.mdwn | 18 + ..._a93805a8088402c6dc32d2b9785fcc7d._comment | 10 + doc/todo/Views_Demo.mdwn | 15 + ..._d7c83a0e9a83e4a05aa74a34a7e1cf19._comment | 8 + .../Wishlist:_Import_youtube_playlists.mdwn | 30 + ..._4235cbbb0c6f9d83524c970c4588cb2e._comment | 9 + ...ional_environment_variables_for_hooks.mdwn | 14 + ..._d82cbbb478a81a651fbe6cb8b71c1192._comment | 8 + ..._fix_wrong_UUID__47__duplicate_remote.mdwn | 7 + ...irectory_and_also_in_the_target_annex.mdwn | 29 + ..._0cc16eb17151309113cec6d1cccf203d._comment | 20 + ...rsion__96___should_print_the_local_OS.mdwn | 6 + ...__tracking_info__44___and_actual_data.mdwn | 6 + ...dd_--exclude_option_to_git_annex_find.mdwn | 4 + doc/todo/add_-all_option.mdwn | 22 + ...anch_to_applicable_git-annex_commands.mdwn | 2 + ..._3e0a1d1c41f317514dfc496f2274ad1c._comment | 10 + doc/todo/add_a_git_backend.mdwn | 18 + .../add_an_icon_for_the_.desktop_file.mdwn | 3 + doc/todo/add_metadata_to_annexed_files.mdwn | 14 + ..._38af9b352020194e9ace34d7dde188cf._comment | 10 + ...epo_via_an_ssh_alias_or_an_ip_address.mdwn | 48 + doc/todo/assistant_git_sync_laddering.mdwn | 10 + .../assistant_parallel_file_transfers.mdwn | 15 + ...nt_smarter_archive_directory_handling.mdwn | 31 + doc/todo/assistant_threaded_runtime.mdwn | 40 + doc/todo/auto_remotes.mdwn | 29 + doc/todo/auto_remotes/discussion.mdwn | 7 + .../automatic_bookkeeping_watch_command.mdwn | 15 + ...nches_upon___34__git_annex_sync__34__.mdwn | 16 + doc/todo/avoid_unnecessary_union_merges.mdwn | 20 + doc/todo/backendSHA1.mdwn | 7 + doc/todo/branching.mdwn | 159 + doc/todo/cache_key_info.mdwn | 37 + ..._578df1b3b2cbfdc4aa1805378f35dc48._comment | 11 + doc/todo/checkout.mdwn | 23 + .../checksum_verification_on_transfer.mdwn | 7 + ..._30f77e631608b9751f9032f97d58cc30._comment | 17 + .../clear_file_names_in_special_remotes.mdwn | 13 + ..._630f17c9a7ce9a77d5d5867a6e0c799b._comment | 8 + ..._823c279683ac3f39c921be3fcbf6bfe2._comment | 10 + ..._4704e465025b543e47c18d565abd2747._comment | 8 + doc/todo/commit_in_direct_mode.mdwn | 9 + doc/todo/ctrl_c_handling.mdwn | 5 + ..._3addbe33817db5de836c014287b14c07._comment | 8 + ..._cc2776dc4805421180edcdf96a89fcaa._comment | 8 + ..._8d7d357368987f5d5d59b4d8d99a0e06._comment | 8 + doc/todo/custom_f-droid_repo.mdwn | 3 + ..._d2bdc001584d4b5f925390910ec1ef73._comment | 10 + ..._20eebe13b76d5279a3d09b346b65ff6e._comment | 9 + ..._5a79abb8b1dd12426e111e733fa6493b._comment | 8 + doc/todo/direct_mode_guard.mdwn | 105 + ..._431b6e1577bbd30b07dce9002a8fe1a2._comment | 10 + ..._85bdb9dc601b87bd7c77150d7b0a5cde._comment | 8 + doc/todo/done.mdwn | 4 + ...erent_port_has_been_specified_already.mdwn | 2 + ...emote___40__e.g._for_NAS_mounts__41__.mdwn | 7 + ..._5ed9a2336b432b842c1805add6d96509._comment | 10 + ..._e6ba58c5c31ba23a4575f1189689946f._comment | 8 + ..._e53cbc5765819de2d3c742e6cd4d77cd._comment | 11 + doc/todo/exclude_files_on_a_given_remote.mdwn | 18 + doc/todo/faster_gnupg_cipher.mdwn | 9 + ..._8f61f7c724a8224e61c015be68f43db7._comment | 14 + ..._36e1f227a320527653500b445f7c001c._comment | 12 + ..._bd0c975494333dfe558de048d888ace8._comment | 17 + doc/todo/faster_rsync_remotes.mdwn | 4 + ..._0bc3ee0ae563357675eeccf42461e59a._comment | 8 + ..._ccf6f75450c89ca498c8130054f8d32d._comment | 24 + ..._2f6a9d23cb8351fbf0f60ed93752e76e._comment | 14 + ..._3a2f45defebae3dde336ee5f40c26d7e._comment | 8 + doc/todo/file_copy_progress_bar.mdwn | 5 + ...ce_checking_for_local_special_remotes.mdwn | 4 + ..._47c254cec58cbbb3ea84c93ef8282f01._comment | 8 + doc/todo/fsck.mdwn | 11 + doc/todo/fsck_special_remotes.mdwn | 13 + doc/todo/git-annex-shell.mdwn | 15 + doc/todo/git-annex_unused_eats_memory.mdwn | 32 + ...0__file__62___should_verify_file_hash.mdwn | 34 + ..._650e01a04104120ef1db4ff16fedc4f1._comment | 16 + ...on_and__47__or_UUID_in_commit_message.mdwn | 13 + doc/todo/gitolite_and_gitosis_support.mdwn | 39 + doc/todo/gitrm.mdwn | 5 + doc/todo/hidden_files.mdwn | 30 + doc/todo/http_git_annex_404_retry.mdwn | 18 + doc/todo/http_headers.mdwn | 8 + doc/todo/immutable_annexed_files.mdwn | 8 + ..._123__itemdate__125___with_--template.mdwn | 5 + ..._62752c760fc12eca0c34d67d58753d00._comment | 10 + ..._21672360060f48bc2eacfa535ff4c94d._comment | 11 + doc/todo/incremental_fsck.mdwn | 24 + ..._609b21141dd5686b2c0eaef2b8d63229._comment | 14 + doc/todo/keep_annexed_files_for_a_while.mdwn | 8 + .../link_file_to_remote_repo_feature.mdwn | 52 + doc/todo/makefile:_respect___36__PREFIX.mdwn | 25 + doc/todo/mdwn2man:_make_backticks_bold.mdwn | 22 + doc/todo/network_remotes.mdwn | 5 + doc/todo/nicer_whereis_output.mdwn | 100 + doc/todo/object_dir_reorg_v2.mdwn | 25 + ..._ba03333dc76ff49eccaba375e68cb525._comment | 8 + ..._81276ac309959dc741bc90101c213ab7._comment | 8 + ..._79bdf9c51dec9f52372ce95b53233bb2._comment | 12 + ..._93aada9b1680fed56cc6f0f7c3aca5e5._comment | 12 + ..._821c382987f105da72a50e0a5ce61fdc._comment | 12 + ..._8834c3a3f1258c4349d23aff8549bf35._comment | 10 + ..._42501404c82ca07147e2cce0cff59474._comment | 12 + doc/todo/openwrt_package.mdwn | 6 + ..._100d76109e04bc43979775d71b4152ac._comment | 12 + ..._2cb7dd4c0cc4413a4588b13cf7700de2._comment | 9 + ..._5ba8a325a683ff543d81a366c873070d._comment | 8 + doc/todo/optimise_git-annex_merge.mdwn | 23 + ...optinally_transfer_file_unencryptedly.mdwn | 6 + ..._4be47e7ac85d0f4e7029a96b615545a7._comment | 8 + doc/todo/parallel_possibilities.mdwn | 13 + ..._d8e34fc2bc4e5cf761574608f970d496._comment | 8 + ..._adb76f06a7997abe4559d3169a3181c3._comment | 12 + ..._145fb974f45da99b7d4b117a3699cccf._comment | 12 + .../preferred_content_numcopies_check.mdwn | 86 + doc/todo/pushpull.mdwn | 4 + doc/todo/quvi_0.9_support.mdwn | 8 + doc/todo/redundancy_stats_in_status.mdwn | 23 + ..._9f1c10f8cea4fa60a99cbcc8306dd5de._comment | 10 + ..._686ced0684d10511caf07953c64cd5b6._comment | 10 + doc/todo/required_content.mdwn | 23 + ..._42620a3c958666be2a0d5f5b8eadf7b4._comment | 23 + ..._132ec6378db63af6281569cf5748b9d3._comment | 14 + doc/todo/resuming_encrypted_uploads.mdwn | 22 + ..._1832a6fb78e8ad7c838582f46731ac3b._comment | 8 + ..._2ecc8e782f49e90ed1549e9179eb1a1e._comment | 8 + doc/todo/rsync.mdwn | 4 + ...limit_options_for_upload_and_download.mdwn | 4 + doc/todo/smudge.mdwn | 162 + ..._4ea616bcdbc9e9a6fae9f2e2795c31c9._comment | 8 + ..._e04b32caa0d2b4c577cdaf382a3ff7f6._comment | 12 + ..._4e7c25fe24a1e71f58a8354fa64f41c2._comment | 10 + .../special_remote_for_amazon_glacier.mdwn | 30 + ..._68f129441eefcbfebf7a9db680f52759._comment | 8 + ..._c5eeaf8ceee414fa0379831ca52e290c._comment | 7 + doc/todo/speed_up_fsck.mdwn | 40 + doc/todo/stream_feature__63__.mdwn | 23 + doc/todo/support-non-utf8-locales.mdwn | 26 + doc/todo/support_S3_multipart_uploads.mdwn | 14 + doc/todo/support_for_lossy_remotes.mdwn | 11 + ..._f5cd9f9deab13ab2d2290ad763906dd3._comment | 8 + ..._for_writing_external_special_remotes.mdwn | 27 + doc/todo/support_fsck_in_bare_repos.mdwn | 17 + doc/todo/symlink_farming_commit_hook.mdwn | 14 + ..._.local__47__bin_for_prebuilt_package.mdwn | 22 + ...my_local_git-annex_from_a_dump_remote.mdwn | 6 + ..._81d63854f89f00855cda5ace0fc8262a._comment | 14 + ..._66822b72b1450e79e8edd0c6c21d5aa6._comment | 14 + ..._b9f73375e2c732e798495f8ee6970c7c._comment | 14 + doc/todo/tahoe_lfs_for_reals.mdwn | 23 + ..._0a4793ce6a867638f6e510e71dd4bb44._comment | 10 + ..._80b9e848edfdc7be21baab7d0cef0e3a._comment | 13 + doc/todo/union_mounting.mdwn | 10 + ..._cb08435812dd7766de26199c73f38e8b._comment | 8 + ..._240b1736f6bd4fbf87c372d3a46e661b._comment | 9 + ..._cf0a0d4fbd929f24f7056115b2acb7de._comment | 8 + doc/todo/untracked_remotes.mdwn | 27 + ..._ccc743554cf9270e1db5275273b28265._comment | 43 + ..._48cc5d0e2282fa53625e0037a035fee3._comment | 18 + ..._0d07c5bc8d42f35351c11411eaca88df._comment | 29 + ..._75ae13c2135a2951b2af548139cb25cd._comment | 46 + doc/todo/use_cp_reflink.mdwn | 7 + ..._preferred___40__wanted__41___content.mdwn | 12 + doc/todo/using_url_backend.mdwn | 11 + .../whishlist:_git_annex_drop_--dry-run.mdwn | 5 + ..._20ecfa8ffa52c238d21b904076ac69a2._comment | 10 + ..._d19bc268c9467d24baa8d8f77a6e5e09._comment | 8 + ..._setting_annex-ignore_from_the_webapp.mdwn | 2 + doc/todo/windows_support.mdwn | 131 + ..._394127e34e07ab3dc0e7b94ee6898866._comment | 8 + ..._3cc26ad8101a22e95a8c60cf0c4dedcc._comment | 10 + ..._8acae818ce468967499050bbe3c532ea._comment | 12 + ..._bd0a12f4c9b884ab8a06082842381a01._comment | 8 + ..._ad06b98b2ddac866ffee334e41fee6a8._comment | 8 + ..._444fc7251f57db241b6e80abae41851c._comment | 10 + ..._34f1f60b570c389bb1e741b990064a7e._comment | 8 + ..._a5ca56c487257434650420acfa60e39f._comment | 8 + ..._61214de7d967740d42905f3823ce2f65._comment | 12 + ..._259a0b1a6f4d8d1944173380adc5e7c8._comment | 8 + ...Add_to_Android_version_to_Google_Play.mdwn | 9 + ...Advanced_settings_for_xmpp_and_webdav.mdwn | 7 + ..._11c7444ab4988c60732af505b52bde3c._comment | 20 + ...hlist:_An_--all_option_for_dropunused.mdwn | 4 + ..._d8726d108b3b40116b4ec3c9935f2dff._comment | 8 + ..._578248f7686ba2d80d7dc8b17c0cdf52._comment | 16 + .../wishlist:_An_option_like_--git-dir.mdwn | 5 + ..._5d877d90b8bdf21d4b8649744d229efd._comment | 8 + ..._462264821cbc48a433330cbf7ec6044d._comment | 8 + ..._0c3709b07a0a1091ceeee73b69e0f7ac._comment | 8 + ...wishlist:_Freeing_X_space_on_remote_Y.mdwn | 1 + doc/todo/wishlist:_GnuPG_options.mdwn | 16 + ..._6662e8a71ce20acc62147ef41ecffa50._comment | 12 + ..._a_preview_of_download_or_upload_size.mdwn | 10 + ..._019a2457e07377510feaa089a93bd76c._comment | 8 + ..._29a154699339bf040af0ee8aa24034f1._comment | 15 + ..._8f7e1c4a5c714cbd719ee170354d79fa._comment | 12 + ..._c7335f757e5546aa841cab38fffe7605._comment | 19 + ..._d2a845354f23d07880612740cf99ddd4._comment | 8 + ...:_Option_to_specify_max_transfer_rate.mdwn | 3 + ..._4fd870e14b5b70c8a6ade41406294387._comment | 10 + ..._dd854f297ad6a94b54be9f3edfd0f766._comment | 8 + ..._a8b7e90a473d5937807cc7eb456efe33._comment | 10 + ...ated_password_prompts_for_one_command.mdwn | 45 + ..._3f9c0d08932c2ede61c802a91261a1f7._comment | 14 + ...4___command_that_will_skip_duplicates.mdwn | 28 + ..._d78d79fb2f3713aa69f45d2691cf8dfe._comment | 68 + ..._4316d9d74312112dc4c823077af7febe._comment | 8 + ..._ed6d07f16a11c6eee7e3d5005e8e6fa3._comment | 8 + ..._fd213310ee548d8726791d2b02237fde._comment | 29 + ..._4394bde1c6fd44acae649baffe802775._comment | 18 + ..._076cb22057583957d5179d8ba9004605._comment | 18 + ..._f120d1e83c1a447f2ecce302fc69cf74._comment | 35 + ..._5c30294b3c59fdebb1eef0ae5da4cd4f._comment | 10 + ..._f24541ada1c86d755acba7e9fa7cff24._comment | 16 + ..._c39f1bb7c61a89b238c61bee1c049767._comment | 54 + ..._221ed2e53420278072a6d879c6f251d1._comment | 8 + ..._aecfa896c97b9448f235bce18a40621d._comment | 14 + ...st:_Restore_s3_files_moved_to_Glacier.mdwn | 7 + ...not__41___to_annex_via_.gitattributes.mdwn | 9 + ...it_annex_add__34___multiple_processes.mdwn | 10 + ..._85b14478411a33e6186a64bd41f0910d._comment | 10 + ..._82e857f463cfdf73c70f6c0a9f9a31d6._comment | 8 + ..._8af85eba7472d9025c6fae4f03e3ad75._comment | 8 + ...___annex_get_for_centralized_use_case.mdwn | 14 + ..._5c8812973cf91b046e7fc44d7e86c78e._comment | 14 + ..._f36b6a5b128423211aac91a252ecf85f._comment | 18 + ..._ad1569b2405acacd2e37f42b82f24c88._comment | 10 + ..._8aba90150fe178ce9712ad951628f3d6._comment | 8 + ..._6f42d240e0021f4dfa37146bea3f5d7e._comment | 16 + ..._5fda455febf728b079f26fe42bf7bcab._comment | 16 + ..._f1052ab997f1a2cccbabfd1533fc0a59._comment | 8 + ..._07804647b6023436878756bd97a23f32._comment | 8 + ..._fdc883d3963de8072794f3189742e4e3._comment | 10 + ...:___39__get__39___queue_and_schedule..mdwn | 30 + ...__whereis__39___support_in_the_webapp.mdwn | 4 + ...___96__git_annex_drop_--relaxed__96__.mdwn | 5 + ..._c83a6cddd0ce222205a149cfa41ca395._comment | 10 + ..._353fbc2bcc40cb8c9af42907a34c6e5a._comment | 11 + ...ecksums_but_disregard_annex.numcopies.mdwn | 12 + ..._6bcf067e4860bdfeb1d7b9fd1702a43a._comment | 8 + ...An_easy_way_to_get_data_into_an_annex.mdwn | 13 + ..._b9fd1bfaf9a3d238fdb7bc9c2d75fe5f._comment | 22 + ..._56f6972413c6f0d9f414245b6f4d27b9._comment | 62 + ..._2c094bef802a2182de4fcd0def1ad29b._comment | 12 + ..._14915c43001f7f72c9fe5119a104ef5c._comment | 10 + ...shlist:___96__git_annex_sync_-m__96__.mdwn | 10 + ...ed___40__e.g.__44___with_WebDAV__41__.mdwn | 29 + ..._f46b0c9b49607e9f4f7a27f5a331ce83._comment | 8 + ..._1b34e1dd72011c65e881dec2543a0373._comment | 12 + ...file_samples_for_assistant_and_webapp.mdwn | 6 + ..._b89e90f9a70748c95aaf81740a40b76e._comment | 8 + ..._d64361380cb18b98ddb43ada1c9f540a._comment | 8 + doc/todo/wishlist:_addurl_https:.mdwn | 11 + ..._4e8f5e1fc52c3000eb2a1dad0624906e._comment | 14 + ...onfiguration_of_downloader_for_addurl.mdwn | 3 + ...shlist:_allow_custom_S3_url_in_webapp.mdwn | 3 + ..._3d1ea5579a6ad0c0efde58dca11c10aa._comment | 10 + ..._f96bb81fde4185368dc6ea5a5aed87da._comment | 10 + ...o_be_accissable_via_different_methods.mdwn | 5 + ..._abb6263f3807160222bba1122475c89c._comment | 8 + ...en_running___96__git_annex_init__96__.mdwn | 5 + ...tracking_the_sources_of_the_downloads.mdwn | 28 + ..._36ae3c75053d5ec278b5e6eb2084d57a._comment | 8 + ..._be8eb800523db8cf7a2c68a28fbf5ea5._comment | 8 + ..._d9f725de41a8572c85e4c6d9b4bcc927._comment | 8 + ..._f52492e4cc6f965515800bd1c0e05c90._comment | 10 + ..._5b36656fc5fa124e763f06711d9da32b._comment | 10 + ..._285215a4466806baf85b8606f680494a._comment | 12 + ..._15bf62e46db4b84ed3156f550f03de42._comment | 12 + ...iles_configuration_in_webapp_and_sync.mdwn | 1 + ..._db632de391ce9fce42af51a770ed3aeb._comment | 10 + ..._4a0931d9884054d764fde315d4fe4851._comment | 14 + ...nnex.largefiles_support_for_mimetypes.mdwn | 1 + ..._304431bb62b5b8a64edc37a11bbaff59._comment | 8 + ...from_remote_with_the_least_free_space.mdwn | 1 + ..._6813fdc7ecc98765a5d35d34163a1712._comment | 8 + ..._21a249cedca1ceb80d10784004735524._comment | 8 + ...tostart_port_and_secret_configuration.mdwn | 4 + ..._be53b8456eed7eadad5d4b8465c8a42b._comment | 10 + .../wishlist:_command_options_changes.mdwn | 17 + ..._bfba72a696789bf21b2435dea15f967a._comment | 17 + ..._f6a637c78c989382e3c22d41b7fb4cc2._comment | 19 + ..._bf1114533d2895804e531e76eb6b8095._comment | 8 + ...fine_remotes_that_must_have_all_files.mdwn | 22 + ..._cceccc1a1730ac688d712b81a44e31c3._comment | 10 + ..._eec848fcf3979c03cbff2b7407c75a7a._comment | 16 + .../wishlist:_derived_content_support.mdwn | 8 + ...ishlist:_detection_of_merge_conflicts.mdwn | 13 + .../wishlist:_disable_automatic_commits.mdwn | 36 + ...n_addWatcher_gets_a_permission_denied.mdwn | 6 + ..._d2665e7347689b520d37561cfddf0aa8._comment | 8 + ..._db153571a32fb072453ed583e3e9ccf4._comment | 8 + ...splay_status_of_remotes_in_the_webapp.mdwn | 1 + ...t:_do_round_robin_downloading_of_data.mdwn | 5 + ..._460335b0e59ad03871c524f1fe812357._comment | 8 + .../wishlist:_dropping_git-annex_history.mdwn | 28 + ..._a4bee2e26b22a9bdaadc05b7227769ef._comment | 10 + ..._f6d750bfe0c9d8a2aa6bc218ca5c49cc._comment | 14 + ...it_remote_on_hosting_site_from_webapp.mdwn | 1 + .../wishlist:_generic_annex.cost-command.mdwn | 17 + doc/todo/wishlist:_git-annex_replicate.mdwn | 22 + ..._9926132ec6052760cdf28518a24e2358._comment | 10 + ..._c43932f4194aba8fb2470b18e0817599._comment | 12 + ..._c13f4f9c3d5884fc6255fd04feadc2b1._comment | 10 + ..._63f24abf086d644dced8b01e1a9948c9._comment | 8 + doc/todo/wishlist:_git_annex_diff.mdwn | 9 + ..._16ccf2e1036d9e1a913db81988731b5a._comment | 8 + doc/todo/wishlist:_git_annex_info_UUID.mdwn | 8 + ..._d0d40bfdafed47e9e8ef2f4cd5c8576f._comment | 10 + .../comment_2._comment | 8 + ...--_same_as_get__44___but_for_defaults.mdwn | 20 + ..._d5413c8acce308505e4e2bec82fb1261._comment | 10 + ..._0aa227c85d34dfff4e94febca44abea8._comment | 12 + ..._2082f4d708a584a1403cc1d4d005fb56._comment | 10 + doc/todo/wishlist:_git_annex_status.mdwn | 21 + ..._994bfd12c5d82e08040d6116915c5090._comment | 8 + ..._c2b0ce025805b774dc77ce264a222824._comment | 13 + ..._d1fd70c67243971c96d59e1ffb7ef6e7._comment | 23 + ..._9aeeb83d202dc8fb33ff364b0705ad94._comment | 8 + .../wishlist:_git_backend_for_git-annex.mdwn | 9 + ..._04319051fedc583e6c326bb21fcce5a5._comment | 10 + ..._7f529f19a47e10b571f65ab382e97fd5._comment | 14 + ..._a077bbad3e4b07cce019eb55a45330e7._comment | 10 + ..._ecca429e12d734b509c671166a676c9d._comment | 8 + ..._3459f0b41d818c23c8fb33edb89df634._comment | 8 + doc/todo/wishlist:_history_of_operations.mdwn | 8 + ..._f9a77ce83c6f39b6272d5c577ffbb9f9._comment | 8 + ...ce_the_size_of_repo_to_complete__41__.mdwn | 10 + ..._067b29fc47d26b9da0766f9810684ae8._comment | 10 + ...it_annex_reinject_work_in_direct_mode.mdwn | 21 + ...rtial_files_available_during_transfer.mdwn | 18 + ..._8b1cfae6f2b61929a9c6f48ae63c921d._comment | 12 + ..._1304a721da6f5133fdfa1dac507f1ecb._comment | 10 + .../wishlist:_metadata_metadata_view.mdwn | 23 + ..._79dbf48cf2e0d649f32bd077f0c9bc5a._comment | 8 + ..._5763d0e403c476ac692c1cd50630f824._comment | 12 + ..._797e6578c60d8e2ed1f61a8d6403575f._comment | 8 + ..._d271fe711b3fe5ffeb52f1caf44622b3._comment | 10 + ...e_commit_messages_in_git-annex_branch.mdwn | 55 + ...re_info_in_commit_messages_in_general.mdwn | 8 + ...rd_commit_message_of___96__sync__96__.mdwn | 3 + ..._b9c241cf94a35aa6a45f4d44334694b0._comment | 8 + ...o_the_end_of_the_queue_when_one_fails.mdwn | 7 + ..._82ee9de610a0ac55cd1c27c211079e5b._comment | 10 + ..._bea55156bd32cf9e6dd9b946ba1bb8c1._comment | 10 + ...n_to_disable_url_checking_with_addurl.mdwn | 9 + ..._868a380faa1e55faa3c2d314e3258e86._comment | 10 + ...int_more_info_with___39__unused__39__.mdwn | 37 + ...ishlist:_pack_metadata_in_direct_mode.mdwn | 3 + ..._1a550d6977a255b789337c3d1602db04._comment | 10 + ..._3cc9c69d33c658058daea9cb5e4ab669._comment | 10 + doc/todo/wishlist:_perform_fsck_remotely.mdwn | 39 + ..._db92311dcdb1ef0ab0413f83e191c70c._comment | 15 + ..._2f0dbaf143d94290bfbebb6869eb7241._comment | 12 + ..._5ec2e0e248dfd4ca46aef89cc5658d18._comment | 8 + ...t_locations_for_files_in_rsync_remote.mdwn | 6 + ...9__s_repo__44___not_your_personal_one.mdwn | 3 + ..._3480b0ec629ef29a151408d869186bf8._comment | 8 + ...gs_like_description__44___trust_level.mdwn | 4 + ..._14311384788312b96e550749ab7de9ea._comment | 10 + ..._342d1ac07573c7ef4e27f003a692e261._comment | 32 + ...ve_directory_remote_setup__47__addurl.mdwn | 7 + ..._b79976afc2242791523e63831f30af71._comment | 12 + ..._1741d2392006a9af9cfd1f3b847600b9._comment | 9 + doc/todo/wishlist:_simple_url_for_webapp.mdwn | 36 + ..._552aad504fbb68d1f85abfde8c535e69._comment | 10 + doc/todo/wishlist:_simpler_gpg_usage.mdwn | 12 + ..._6923fa6ebc0bbe7d93edb1d01d7c46c5._comment | 19 + ..._6fc874b6c391df242bd2592c4a65eae8._comment | 10 + ..._012f340c8c572fe598fc860c1046dabd._comment | 8 + ..._e0c2a13217b795964f3b630c001661ef._comment | 10 + ..._9668b58eb71901e1db8da7db38e068ca._comment | 8 + ...ores___40__gnunet__44___freenet__41__.mdwn | 26 + ..._e2c2047e7401cb95a82ffb686a732859._comment | 8 + ..._472b576afdb169b233edd01adcb2123d._comment | 8 + ..._b4ff519ece76c6c3fb29b981320e2e1c._comment | 10 + ...of_Youtube_URLs_in_Web_special_remote.mdwn | 22 + ..._1a383c30df4fb1767f13d8c670b0c0b5._comment | 10 + ..._81f7f893ac36c145b31f02db6a682a17._comment | 20 + ..._a7e3cd68c5e5f05139151a58f358df95._comment | 13 + ..._a57947ed257b28bbe995a68bfeb5eeaa._comment | 8 + ..._a0612ae05dbda7f7935be648b42b30fc._comment | 8 + .../wishlist:_special_remote_Ubuntu_One.mdwn | 1 + ..._ab0c761030bc55e8fb75d1b344bb98b9._comment | 8 + ...ist:_special_remote_for_sftp_or_rsync.mdwn | 28 + ..._6f07d9cc92cf8b4927b3a7d1820c9140._comment | 10 + ..._84e4414c88ae91c048564a2cdc2d3250._comment | 8 + ..._79de7ac44e3c0f0f5691a56d3fb88897._comment | 8 + .../wishlist:_special_remote_mega.co.nz.mdwn | 3 + ..._6ca08ef808d4336fc42d0f279d6627b5._comment | 44 + ...upport_copy_--from__61__x_--to__61__y.mdwn | 29 + ..._cf8e0f16b723516374c95a93e4da42fc._comment | 12 + ..._d35359c9dd4dd4365d9a7caf695ff833._comment | 16 + ...rt_drop__44___find_on_special_remotes.mdwn | 18 + ..._f11ed642a83d965076778a162f701e84._comment | 8 + .../wishlist:_support_for_more_ssh_urls_.mdwn | 22 + doc/todo/wishlist:_swift_backend.mdwn | 5 + ..._e6efbb35f61ee521b473a92674036788._comment | 8 + ..._5d8c83b0485112e98367b7abaab3f4e3._comment | 8 + ..._bf8625b909c3a7321cae40e6f145e874._comment | 8 + ..._4d97d12ddd99834788e94648c8eebef9._comment | 10 + ..._1568f726f91d4589aef7ca9fcc3c957d._comment | 8 + ...ist:_traffic_accounting_for_git-annex.mdwn | 3 + ..._unify_directory_scheme_for_the_store.mdwn | 20 + ..._44da58beaaab359ecaba7fb905ca4ae1._comment | 10 + ..._bc698c501ecdb56df57171f4f3bb831a._comment | 16 + ..._e555d0dbbaa05528806905c6a940724b._comment | 8 + ...hlist:_use_hardlinks_for_local_clones.mdwn | 9 + ..._85064fafe472a5bd395d60ce8f7acb56._comment | 12 + ...list:_vicfg_possible_repo_group_names.mdwn | 16 + doc/todo/wishlist:alias_system.mdwn | 1 + ..._5afad4b92f9a449d4a82a94ad31feec2._comment | 8 + ..._stamps_to_annex_log_popups_in_webapp.mdwn | 1 + ..._ec90432a7d46383071401b05243d621f._comment | 8 + ..._option_to_install__SSH_key_on_remote.mdwn | 9 + ..._13737dc99aa877b309f7ebe44ecbafee._comment | 16 + doc/todo/wishlist_degraded_files.mdwn | 5 + doc/transferring_data.mdwn | 19 + doc/trust.mdwn | 59 + doc/upgrades.mdwn | 106 + doc/upgrades/SHA_size.mdwn | 20 + ..._20f9b7b75786075de666b2146dc13a60._comment | 12 + doc/upgrades/gcrypt.mdwn | 25 + ..._606c1527735996ae671f78948e4ad84b._comment | 8 + doc/use_case/Alice.mdwn | 24 + doc/use_case/Bob.mdwn | 25 + doc/users.mdwn | 9 + doc/users/anarcat.mdwn | 48 + doc/users/chrysn.mdwn | 11 + doc/users/clacke.mdwn | 3 + doc/users/claes.wallin.mdwn | 1 + doc/users/fmarier.mdwn | 6 + doc/users/gebi.mdwn | 1 + doc/users/greg.mdwn | 3 + doc/users/joey.mdwn | 2 + doc/users/sameerds.mdwn | 3 + doc/users/tobiastheviking.mdwn | 20 + doc/videos.mdwn | 8 + doc/videos/FOSDEM2012.mdwn | 7 + doc/videos/LCA2013.mdwn | 8 + doc/videos/git-annex_assistant_archiving.mdwn | 5 + .../git-annex_assistant_introduction.mdwn | 5 + ..._f42ad4183c2c28319d3705a82fceb82f._comment | 15 + ..._b62f4eeeac1138570f7cb8c98d41c2cb._comment | 12 + .../git-annex_assistant_remote_sharing.mdwn | 6 + doc/videos/git-annex_assistant_sync_demo.mdwn | 8 + doc/videos/git-annex_views_demo.mdwn | 11 + doc/videos/git-annex_watch_demo.mdwn | 7 + doc/videos/git-annex_weppapp_demo.mdwn | 8 + doc/walkthrough.mdwn | 27 + doc/walkthrough/adding_a_remote.mdwn | 19 + ..._0a59355bd33a796aec97173607e6adc9._comment | 8 + ..._f8cd79ef1593a8181a7f1086a87713e8._comment | 9 + ..._60691af4400521b5a8c8d75efe3b44cb._comment | 9 + ..._6f7cf5c330272c96b3abeb6612075c9d._comment | 10 + doc/walkthrough/adding_files.mdwn | 12 + .../automatically_managing_content.mdwn | 45 + doc/walkthrough/backups.mdwn | 27 + doc/walkthrough/creating_a_repository.mdwn | 6 + .../fsck:_verifying_your_data.mdwn | 16 + .../fsck:_when_things_go_wrong.mdwn | 13 + doc/walkthrough/getting_file_content.mdwn | 12 + doc/walkthrough/modifying_annexed_files.mdwn | 44 + ..._624b4a0b521b553d68ab6049f7dbaf8c._comment | 14 + ..._b000622304535d32b69db17d51156b21._comment | 10 + doc/walkthrough/more.mdwn | 3 + ...ing_file_content_between_repositories.mdwn | 13 + ..._4c30ade91fc7113a95960aa3bd1d5427._comment | 19 + ..._7d90e1e150e7524ba31687108fcc38d6._comment | 10 + ..._558d80384434207b9cfc033763863de3._comment | 12 + ..._a2f343eceed9e9fba1670f21e0fc6af4._comment | 8 + ...e:_When_git-annex_seems_to_skip_files.mdwn | 27 + doc/walkthrough/removing_files.mdwn | 17 + ..._cb65e7c510b75be1c51f655b058667c6._comment | 8 + ..._64709ea4558915edd5c8ca4486965b07._comment | 8 + .../removing_files:_When_things_go_wrong.mdwn | 24 + doc/walkthrough/renaming_files.mdwn | 13 + doc/walkthrough/setup_git.mdwn | 2 + doc/walkthrough/syncing.mdwn | 27 + ...nsferring_files:_When_things_go_wrong.mdwn | 17 + doc/walkthrough/unused_data.mdwn | 35 + ..._684b7b652d3a8ec04f32129c5528f1ab._comment | 22 + doc/walkthrough/using_bup.mdwn | 37 + doc/walkthrough/using_ssh_remotes.mdwn | 33 + ..._98e97c4d7fbbcd449eddf683967a71d6._comment | 8 + ..._f2775a151ed50caba27057bd9c38bae2._comment | 13 + ..._a8bc6110128431ca2a8624ddc75ea364._comment | 10 + ..._365db5820d96d5daa62c19fd76fcdf1e._comment | 13 + ..._451fd0c6a25ee61ef137e8e5be0c286b._comment | 16 + ..._b2f15a46620385da26d5fe8f11ebfc1a._comment | 15 + ..._433ccc87fbb0a13e32d59d77f0b4e56c._comment | 8 + ..._a9805c7965da0b88a1c9f7f207c450a1._comment | 18 + ..._9d5c12c056892b706cf100ea01866685._comment | 12 + ..._725e7dbb2d0a74a035127cb01ee0442c._comment | 16 + ..._8448e55026d2c2b50d8da41707686bea._comment | 16 + ..._61833299a9878f23ac57598fa6da8839._comment | 23 + doc/walkthrough/using_tags_and_branches.mdwn | 14 + ghci | 4 + git-annex.cabal | 231 + git-annex.hs | 76 + git-union-merge.hs | 48 + standalone/android/.gitignore | 2 + standalone/android/Makefile | 168 + standalone/android/abiversion | 1 + standalone/android/buildchroot | 27 + standalone/android/buildchroot-inchroot | 26 + .../android/buildchroot-inchroot-asuser | 38 + standalone/android/busybox_config | 997 ++ standalone/android/clean-haskell-packages | 6 + standalone/android/dropbear.patch | 55 + ..._0001-fix-build-not-Android-specific.patch | 34 + ...loomfilter_fix-build-with-newer-base.patch | 26 + ....3.7-0001-support-Android-cert-store.patch | 37 + .../haskell-patches/comonad_cross-build.patch | 25 + .../crypto-numbers_build-fix.patch | 227 + ...utive_0.3-0001-fixes-for-cross-build.patch | 25 + ....dns1-command-instead-of-resolv.conf.patch | 59 + .../haskell-patches/entropy_cross-build.patch | 25 + ...1.4-0001-statically-link-with-gnutls.patch | 37 + .../gsasl_0.3.5-0001-link-with-libgsasl.patch | 25 + ...1.2.11_0001-build-without-IPv6-stuff.patch | 47 + ...ge-javascript_fix-build-with-new-ghc.patch | 25 + .../haskell-patches/libxml-sax_text-dep.patch | 25 + .../lifted-base_crossbuild.patch | 25 + ...etwork-protocol-xmpp_text-dapendency.patch | 25 + ...work_2.4.1.0_0001-android-port-fixes.patch | 1924 ++++ ....BSD-symbols-not-available-in-bionic.patch | 157 + ....0_0003-configure-misdetects-accept4.patch | 34 + ...-getprotobyname-hack-for-tcp-and-udp.patch | 28 + ...k_2.4.1.0_0005-no-NODELAY-on-android.patch | 25 + ...opt-stuff-to-allow-cross-compilation.patch | 24 + .../skein_hardcode_little-endian.patch | 24 + .../socks_0.4.2_0001-remove-IPv6-stuff.patch | 135 + .../stm-chans_cross-build.patch | 25 + .../system-filepath_cross-build.patch | 25 + .../unbounded-delays_crossbuild.patch | 25 + .../unix-time_hack-for-Bionic.patch | 56 + ...out-v1-uuid-which-needs-network-info.patch | 79 + .../vector_hack-to-build-with-new-ghc.patch | 24 + ...09-system_support-Android-cert-store.patch | 36 + ....5.4.0_0001-hack-to-build-on-Android.patch | 35 + .../icons/drawable-hdpi/ic_launcher.png | Bin 0 -> 2612 bytes .../ic_stat_service_notification_icon.png | Bin 0 -> 1310 bytes .../icons/drawable-ldpi/ic_launcher.png | Bin 0 -> 1279 bytes .../ic_stat_service_notification_icon.png | Bin 0 -> 682 bytes .../icons/drawable-mdpi/ic_launcher.png | Bin 0 -> 1768 bytes .../ic_stat_service_notification_icon.png | Bin 0 -> 946 bytes .../icons/drawable-xhdpi/ic_launcher.png | Bin 0 -> 3396 bytes .../ic_stat_service_notification_icon.png | Bin 0 -> 1837 bytes .../android/icons/drawable/ic_launcher.png | 1 + .../ic_stat_service_notification_icon.png | 1 + standalone/android/install-haskell-packages | 131 + standalone/android/openssh.config.h | 249 + standalone/android/openssh.patch | 217 + standalone/android/rsync.patch | 40 + standalone/android/runshell | 132 + standalone/android/start.c | 64 + standalone/android/term.patch | 598 ++ standalone/licences.gz | Bin 0 -> 60519 bytes .../network_disable_accept4.patch | 26 + standalone/linux/install-haskell-packages | 97 + standalone/linux/skel/README | 20 + standalone/linux/skel/git | 31 + standalone/linux/skel/git-annex | 31 + standalone/linux/skel/git-annex-shell | 31 + standalone/linux/skel/git-annex-webapp | 31 + standalone/linux/skel/git-receive-pack | 31 + standalone/linux/skel/git-shell | 31 + standalone/linux/skel/git-upload-pack | 31 + standalone/linux/skel/runshell | 90 + standalone/no-th/evilsplicer-headers.hs | 34 + .../DAV_build-without-TH.patch | 415 + .../file-embed_remove-TH.patch | 131 + .../generic-deriving_remove-TH.patch | 394 + .../haskell-patches/hamlet_remove-TH.patch | 205 + .../no-th/haskell-patches/lens_no-TH.patch | 245 + .../monad-logger_remove-TH.patch | 27 + .../persistent-template_stub-out.patch | 25 + .../persistent_1.1.5.1_0001-disable-TH.patch | 41 + .../process-conduit_avoid-TH.patch | 24 + ...profunctors_3.3-0001-fix-cross-build.patch | 26 + .../reflection_remove-TH.patch | 59 + ...1.0.2_0002-expose-modules-used-by-TH.patch | 26 + ...speare-css_1.0.2_0003-remove-more-TH.patch | 351 + .../shakespeare-i18n_0001-remove-TH.patch | 215 + .../shakespeare-js_0001-remove-TH.patch | 316 + .../shakespeare-text_remove-TH.patch | 153 + .../shakespeare_remove-th.patch | 189 + .../wai-app-static_deal-with-TH.patch | 82 + .../xml-hamlet_remove_TH.patch | 108 + .../yesod-auth_don-t-really-build.patch | 34 + .../yesod-core_expand_TH.patch | 771 ++ .../yesod-form_spliced-TH.patch | 1805 ++++ ...yesod-persistent_do-not-really-build.patch | 26 + .../yesod-routes_remove-TH.patch | 170 + .../haskell-patches/yesod-static_hack.patch | 194 + .../no-th/haskell-patches/yesod_hack-TH.patch | 193 + .../osx/git-annex.app/Contents/Info.plist | 41 + .../osx/git-annex.app/Contents/MacOS/README | 9 + .../osx/git-annex.app/Contents/MacOS/git | 31 + .../git-annex.app/Contents/MacOS/git-annex | 31 + .../Contents/MacOS/git-annex-shell | 31 + .../Contents/MacOS/git-annex-webapp | 32 + .../Contents/MacOS/git-receive-pack | 31 + .../git-annex.app/Contents/MacOS/git-shell | 31 + .../Contents/MacOS/git-upload-pack | 31 + .../osx/git-annex.app/Contents/MacOS/runshell | 71 + .../Contents/Resources/git-annex.icns | Bin 0 -> 77548 bytes standalone/windows/build-simple.sh | 43 + standalone/windows/build.sh | 70 + static/activityicon.gif | Bin 0 -> 529 bytes static/bootstrap-collapse.js | 138 + static/bootstrap-dropdown.js | 92 + static/bootstrap-modal.js | 210 + static/bootstrap-responsive.css | 815 ++ static/bootstrap.css | 4983 +++++++++ static/favicon.ico | Bin 0 -> 2550 bytes static/glyphicons-halflings-white.png | Bin 0 -> 4352 bytes static/glyphicons-halflings.png | Bin 0 -> 4352 bytes static/jquery.full.js | 9404 +++++++++++++++++ static/jquery.ui.core.js | 324 + static/jquery.ui.mouse.js | 169 + static/jquery.ui.sortable.js | 1250 +++ static/jquery.ui.widget.js | 521 + static/longpolling.js | 46 + static/syncicon.gif | Bin 0 -> 847 bytes templates/README | 7 + templates/actionbutton.hamlet | 2 + templates/bootstrap.hamlet | 14 + templates/configurators/addbox.com.hamlet | 24 + templates/configurators/adddrive.hamlet | 31 + .../configurators/adddrive/combine.hamlet | 19 + .../configurators/adddrive/encrypt.hamlet | 25 + .../configurators/adddrive/setupmodal.hamlet | 7 + templates/configurators/addglacier.hamlet | 32 + templates/configurators/addia.hamlet | 32 + templates/configurators/addrepository.hamlet | 19 + .../addrepository/archive.hamlet | 11 + .../configurators/addrepository/cloud.hamlet | 26 + .../configurators/addrepository/misc.hamlet | 33 + templates/configurators/adds3.hamlet | 28 + .../delete/currentrepository.hamlet | 34 + .../configurators/delete/finished.hamlet | 14 + templates/configurators/delete/start.hamlet | 11 + .../configurators/edit/nonannexremote.hamlet | 18 + .../configurators/edit/repository.hamlet | 37 + templates/configurators/enableaws.hamlet | 30 + .../configurators/enabledirectory.hamlet | 10 + templates/configurators/enableia.hamlet | 22 + templates/configurators/enablewebdav.hamlet | 22 + templates/configurators/fsck.cassius | 4 + templates/configurators/fsck.hamlet | 31 + templates/configurators/fsck/form.hamlet | 2 + .../configurators/fsck/formcontent.hamlet | 15 + .../configurators/fsck/preferencesform.hamlet | 6 + templates/configurators/fsck/status.hamlet | 5 + templates/configurators/genkeymodal.hamlet | 12 + templates/configurators/main.hamlet | 42 + templates/configurators/needgcrypt.hamlet | 10 + templates/configurators/needglaciercli.hamlet | 10 + templates/configurators/newrepository.hamlet | 12 + .../newrepository/combine.hamlet | 17 + .../configurators/newrepository/first.hamlet | 19 + .../configurators/newrepository/form.hamlet | 11 + .../configurators/pairing/disabled.hamlet | 5 + .../pairing/local/inprogress.hamlet | 18 + .../configurators/pairing/local/prompt.hamlet | 50 + .../configurators/pairing/xmpp/end.hamlet | 32 + .../pairing/xmpp/friend/confirm.hamlet | 11 + .../pairing/xmpp/friend/prompt.hamlet | 12 + .../pairing/xmpp/self/prompt.hamlet | 20 + .../pairing/xmpp/self/retry.hamlet | 11 + templates/configurators/preferences.hamlet | 13 + templates/configurators/rsync.net/add.hamlet | 40 + .../configurators/rsync.net/encrypt.hamlet | 43 + templates/configurators/ssh/add.hamlet | 23 + templates/configurators/ssh/combine.hamlet | 19 + templates/configurators/ssh/confirm.hamlet | 69 + templates/configurators/ssh/enable.hamlet | 29 + templates/configurators/ssh/error.hamlet | 11 + templates/configurators/ssh/setupmodal.hamlet | 12 + templates/configurators/ssh/testmodal.hamlet | 9 + templates/configurators/unused.hamlet | 38 + templates/configurators/unused/form.hamlet | 6 + .../configurators/upgrade/android.hamlet | 9 + templates/configurators/xmpp.hamlet | 34 + templates/configurators/xmpp/buddylist.hamlet | 40 + templates/configurators/xmpp/disabled.hamlet | 5 + .../configurators/xmpp/needcloudrepo.hamlet | 17 + templates/control/log.hamlet | 6 + templates/control/notrunning.hamlet | 10 + templates/control/notrunning.julius | 3 + templates/control/repairrepository.hamlet | 26 + .../control/repairrepository/done.hamlet | 13 + templates/control/repositoryswitcher.hamlet | 14 + templates/control/shutdown.hamlet | 8 + templates/controlmenu.hamlet | 16 + templates/dashboard/main.hamlet | 12 + templates/dashboard/metarefresh.hamlet | 2 + templates/dashboard/transfers.cassius | 2 + templates/dashboard/transfers.hamlet | 45 + templates/documentation/about.hamlet | 33 + templates/documentation/license.hamlet | 2 + templates/documentation/repogroup.hamlet | 60 + templates/error.cassius | 3 + templates/error.hamlet | 26 + templates/notifications/longpolling.julius | 11 + templates/page.cassius | 5 + templates/page.hamlet | 24 + templates/page.julius | 22 + templates/repolist.hamlet | 66 + templates/repolist.julius | 28 + templates/sidebar/alert.hamlet | 26 + templates/sidebar/main.hamlet | 3 + 7646 files changed, 245066 insertions(+) create mode 100644 .ghci create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 .mailmap create mode 100644 Annex.hs create mode 100644 Annex/AutoMerge.hs create mode 100644 Annex/Branch.hs create mode 100644 Annex/Branch/Transitions.hs create mode 100644 Annex/BranchState.hs create mode 100644 Annex/CatFile.hs create mode 100644 Annex/CheckAttr.hs create mode 100644 Annex/CheckIgnore.hs create mode 100644 Annex/Content.hs create mode 100644 Annex/Content/Direct.hs create mode 100644 Annex/Direct.hs create mode 100644 Annex/Direct/Fixup.hs create mode 100644 Annex/Drop.hs create mode 100644 Annex/Environment.hs create mode 100644 Annex/Exception.hs create mode 100644 Annex/FileMatcher.hs create mode 100644 Annex/Hook.hs create mode 100644 Annex/Index.hs create mode 100644 Annex/Init.hs create mode 100644 Annex/Journal.hs create mode 100644 Annex/Link.hs create mode 100644 Annex/LockPool.hs create mode 100644 Annex/MetaData.hs create mode 100644 Annex/MetaData/StandardFields.hs create mode 100644 Annex/Notification.hs create mode 100644 Annex/Path.hs create mode 100644 Annex/Perms.hs create mode 100644 Annex/Queue.hs create mode 100644 Annex/Quvi.hs create mode 100644 Annex/ReplaceFile.hs create mode 100644 Annex/Ssh.hs create mode 100644 Annex/TaggedPush.hs create mode 100644 Annex/Transfer.hs create mode 100644 Annex/UUID.hs create mode 100644 Annex/Url.hs create mode 100644 Annex/VariantFile.hs create mode 100644 Annex/Version.hs create mode 100644 Annex/View.hs create mode 100644 Annex/View/ViewedFile.hs create mode 100644 Annex/Wanted.hs create mode 100644 Assistant.hs create mode 100644 Assistant/Alert.hs create mode 100644 Assistant/Alert/Utility.hs create mode 100644 Assistant/BranchChange.hs create mode 100644 Assistant/Changes.hs create mode 100644 Assistant/Commits.hs create mode 100644 Assistant/Common.hs create mode 100644 Assistant/DaemonStatus.hs create mode 100644 Assistant/DeleteRemote.hs create mode 100644 Assistant/Drop.hs create mode 100644 Assistant/Fsck.hs create mode 100644 Assistant/Gpg.hs create mode 100644 Assistant/Install.hs create mode 100644 Assistant/Install/AutoStart.hs create mode 100644 Assistant/Install/Menu.hs create mode 100644 Assistant/MakeRemote.hs create mode 100644 Assistant/Monad.hs create mode 100644 Assistant/NamedThread.hs create mode 100644 Assistant/NetMessager.hs create mode 100644 Assistant/Pairing.hs create mode 100644 Assistant/Pairing/MakeRemote.hs create mode 100644 Assistant/Pairing/Network.hs create mode 100644 Assistant/Pushes.hs create mode 100644 Assistant/Repair.hs create mode 100644 Assistant/RepoProblem.hs create mode 100644 Assistant/Restart.hs create mode 100644 Assistant/ScanRemotes.hs create mode 100644 Assistant/Ssh.hs create mode 100644 Assistant/Sync.hs create mode 100644 Assistant/Threads/Committer.hs create mode 100644 Assistant/Threads/ConfigMonitor.hs create mode 100644 Assistant/Threads/Cronner.hs create mode 100644 Assistant/Threads/DaemonStatus.hs create mode 100644 Assistant/Threads/Glacier.hs create mode 100644 Assistant/Threads/Merger.hs create mode 100644 Assistant/Threads/MountWatcher.hs create mode 100644 Assistant/Threads/NetWatcher.hs create mode 100644 Assistant/Threads/PairListener.hs create mode 100644 Assistant/Threads/ProblemFixer.hs create mode 100644 Assistant/Threads/Pusher.hs create mode 100644 Assistant/Threads/SanityChecker.hs create mode 100644 Assistant/Threads/TransferPoller.hs create mode 100644 Assistant/Threads/TransferScanner.hs create mode 100644 Assistant/Threads/TransferWatcher.hs create mode 100644 Assistant/Threads/Transferrer.hs create mode 100644 Assistant/Threads/UpgradeWatcher.hs create mode 100644 Assistant/Threads/Upgrader.hs create mode 100644 Assistant/Threads/Watcher.hs create mode 100644 Assistant/Threads/WebApp.hs create mode 100644 Assistant/Threads/XMPPClient.hs create mode 100644 Assistant/Threads/XMPPPusher.hs create mode 100644 Assistant/TransferQueue.hs create mode 100644 Assistant/TransferSlots.hs create mode 100644 Assistant/TransferrerPool.hs create mode 100644 Assistant/Types/Alert.hs create mode 100644 Assistant/Types/BranchChange.hs create mode 100644 Assistant/Types/Buddies.hs create mode 100644 Assistant/Types/Changes.hs create mode 100644 Assistant/Types/Commits.hs create mode 100644 Assistant/Types/DaemonStatus.hs create mode 100644 Assistant/Types/NamedThread.hs create mode 100644 Assistant/Types/NetMessager.hs create mode 100644 Assistant/Types/Pushes.hs create mode 100644 Assistant/Types/RepoProblem.hs create mode 100644 Assistant/Types/ScanRemotes.hs create mode 100644 Assistant/Types/ThreadName.hs create mode 100644 Assistant/Types/ThreadedMonad.hs create mode 100644 Assistant/Types/TransferQueue.hs create mode 100644 Assistant/Types/TransferSlots.hs create mode 100644 Assistant/Types/TransferrerPool.hs create mode 100644 Assistant/Types/UrlRenderer.hs create mode 100644 Assistant/Unused.hs create mode 100644 Assistant/Upgrade.hs create mode 100644 Assistant/WebApp.hs create mode 100644 Assistant/WebApp/Common.hs create mode 100644 Assistant/WebApp/Configurators.hs create mode 100644 Assistant/WebApp/Configurators/AWS.hs create mode 100644 Assistant/WebApp/Configurators/Delete.hs create mode 100644 Assistant/WebApp/Configurators/Edit.hs create mode 100644 Assistant/WebApp/Configurators/Fsck.hs create mode 100644 Assistant/WebApp/Configurators/IA.hs create mode 100644 Assistant/WebApp/Configurators/Local.hs create mode 100644 Assistant/WebApp/Configurators/Pairing.hs create mode 100644 Assistant/WebApp/Configurators/Preferences.hs create mode 100644 Assistant/WebApp/Configurators/Ssh.hs create mode 100644 Assistant/WebApp/Configurators/Unused.hs create mode 100644 Assistant/WebApp/Configurators/Upgrade.hs create mode 100644 Assistant/WebApp/Configurators/WebDAV.hs create mode 100644 Assistant/WebApp/Configurators/XMPP.hs create mode 100644 Assistant/WebApp/Control.hs create mode 100644 Assistant/WebApp/DashBoard.hs create mode 100644 Assistant/WebApp/Documentation.hs create mode 100644 Assistant/WebApp/Form.hs create mode 100644 Assistant/WebApp/Gpg.hs create mode 100644 Assistant/WebApp/MakeRemote.hs create mode 100644 Assistant/WebApp/Notifications.hs create mode 100644 Assistant/WebApp/OtherRepos.hs create mode 100644 Assistant/WebApp/Page.hs create mode 100644 Assistant/WebApp/Repair.hs create mode 100644 Assistant/WebApp/RepoId.hs create mode 100644 Assistant/WebApp/RepoList.hs create mode 100644 Assistant/WebApp/SideBar.hs create mode 100644 Assistant/WebApp/Types.hs create mode 100644 Assistant/WebApp/routes create mode 100644 Assistant/XMPP.hs create mode 100644 Assistant/XMPP/Buddies.hs create mode 100644 Assistant/XMPP/Client.hs create mode 100644 Assistant/XMPP/Git.hs create mode 100644 Backend.hs create mode 100644 Backend/Hash.hs create mode 100644 Backend/URL.hs create mode 100644 Backend/Utilities.hs create mode 100644 Backend/WORM.hs create mode 100644 Build/BundledPrograms.hs create mode 100644 Build/Configure.hs create mode 100644 Build/DesktopFile.hs create mode 100644 Build/DistributionUpdate.hs create mode 100644 Build/EvilLinker.hs create mode 100644 Build/EvilSplicer.hs create mode 100644 Build/InstallDesktopFile.hs create mode 100644 Build/LinuxMkLibs.hs create mode 100644 Build/NullSoftInstaller.hs create mode 100644 Build/OSXMkLibs.hs create mode 100644 Build/Standalone.hs create mode 100644 Build/TestConfig.hs create mode 100644 Build/Version.hs create mode 100755 Build/make-sdist.sh create mode 100755 Build/mdwn2man create mode 100644 BuildFlags.hs create mode 120000 CHANGELOG create mode 120000 COPYRIGHT create mode 100644 Checks.hs create mode 100644 CmdLine.hs create mode 100644 CmdLine/Action.hs create mode 100644 CmdLine/GitAnnex.hs create mode 100644 CmdLine/GitAnnex/Options.hs create mode 100644 CmdLine/GitAnnexShell.hs create mode 100644 CmdLine/GitAnnexShell/Fields.hs create mode 100644 CmdLine/Option.hs create mode 100644 CmdLine/Seek.hs create mode 100644 CmdLine/Usage.hs create mode 100644 Command.hs create mode 100644 Command/Add.hs create mode 100644 Command/AddUnused.hs create mode 100644 Command/AddUrl.hs create mode 100644 Command/Assistant.hs create mode 100644 Command/Commit.hs create mode 100644 Command/ConfigList.hs create mode 100644 Command/Copy.hs create mode 100644 Command/Dead.hs create mode 100644 Command/Describe.hs create mode 100644 Command/Direct.hs create mode 100644 Command/Drop.hs create mode 100644 Command/DropKey.hs create mode 100644 Command/DropUnused.hs create mode 100644 Command/EnableRemote.hs create mode 100644 Command/ExamineKey.hs create mode 100644 Command/Find.hs create mode 100644 Command/Fix.hs create mode 100644 Command/Forget.hs create mode 100644 Command/FromKey.hs create mode 100644 Command/Fsck.hs create mode 100644 Command/FuzzTest.hs create mode 100644 Command/GCryptSetup.hs create mode 100644 Command/Get.hs create mode 100644 Command/Group.hs create mode 100644 Command/Help.hs create mode 100644 Command/Import.hs create mode 100644 Command/ImportFeed.hs create mode 100644 Command/InAnnex.hs create mode 100644 Command/Indirect.hs create mode 100644 Command/Info.hs create mode 100644 Command/Init.hs create mode 100644 Command/InitRemote.hs create mode 100644 Command/List.hs create mode 100644 Command/Lock.hs create mode 100644 Command/Log.hs create mode 100644 Command/LookupKey.hs create mode 100644 Command/Map.hs create mode 100644 Command/Merge.hs create mode 100644 Command/MetaData.hs create mode 100644 Command/Migrate.hs create mode 100644 Command/Mirror.hs create mode 100644 Command/Move.hs create mode 100644 Command/NumCopies.hs create mode 100644 Command/PreCommit.hs create mode 100644 Command/ReKey.hs create mode 100644 Command/RecvKey.hs create mode 100644 Command/Reinject.hs create mode 100644 Command/Repair.hs create mode 100644 Command/RmUrl.hs create mode 100644 Command/Schedule.hs create mode 100644 Command/Semitrust.hs create mode 100644 Command/SendKey.hs create mode 100644 Command/Status.hs create mode 100644 Command/Sync.hs create mode 100644 Command/Test.hs create mode 100644 Command/TransferInfo.hs create mode 100644 Command/TransferKey.hs create mode 100644 Command/TransferKeys.hs create mode 100644 Command/Trust.hs create mode 100644 Command/Unannex.hs create mode 100644 Command/Ungroup.hs create mode 100644 Command/Uninit.hs create mode 100644 Command/Unlock.hs create mode 100644 Command/Untrust.hs create mode 100644 Command/Unused.hs create mode 100644 Command/Upgrade.hs create mode 100644 Command/VAdd.hs create mode 100644 Command/VCycle.hs create mode 100644 Command/VFilter.hs create mode 100644 Command/VPop.hs create mode 100644 Command/Version.hs create mode 100644 Command/Vicfg.hs create mode 100644 Command/View.hs create mode 100644 Command/Wanted.hs create mode 100644 Command/Watch.hs create mode 100644 Command/WebApp.hs create mode 100644 Command/Whereis.hs create mode 100644 Command/XMPPGit.hs create mode 100644 Common.hs create mode 100644 Common/Annex.hs create mode 100644 Config.hs create mode 100644 Config/Cost.hs create mode 100644 Config/Files.hs create mode 100644 Config/NumCopies.hs create mode 100644 Creds.hs create mode 100644 Crypto.hs create mode 100644 Git.hs create mode 100644 Git/AutoCorrect.hs create mode 100644 Git/Branch.hs create mode 100644 Git/BuildVersion.hs create mode 100644 Git/CatFile.hs create mode 100644 Git/CheckAttr.hs create mode 100644 Git/CheckIgnore.hs create mode 100644 Git/Command.hs create mode 100644 Git/Config.hs create mode 100644 Git/Construct.hs create mode 100644 Git/CurrentRepo.hs create mode 100644 Git/DiffTree.hs create mode 100644 Git/FileMode.hs create mode 100644 Git/FilePath.hs create mode 100644 Git/Filename.hs create mode 100644 Git/Fsck.hs create mode 100644 Git/GCrypt.hs create mode 100644 Git/HashObject.hs create mode 100644 Git/Hook.hs create mode 100644 Git/Index.hs create mode 100644 Git/LsFiles.hs create mode 100644 Git/LsTree.hs create mode 100644 Git/Merge.hs create mode 100644 Git/Objects.hs create mode 100644 Git/Queue.hs create mode 100644 Git/Ref.hs create mode 100644 Git/RefLog.hs create mode 100644 Git/Remote.hs create mode 100644 Git/Repair.hs create mode 100644 Git/Sha.hs create mode 100644 Git/SharedRepository.hs create mode 100644 Git/Types.hs create mode 100644 Git/UnionMerge.hs create mode 100644 Git/UpdateIndex.hs create mode 100644 Git/Url.hs create mode 100644 Git/Version.hs create mode 120000 INSTALL create mode 100644 Limit.hs create mode 100644 Limit/Wanted.hs create mode 100644 Locations.hs create mode 100644 Logs.hs create mode 100644 Logs/FsckResults.hs create mode 100644 Logs/Group.hs create mode 100644 Logs/Location.hs create mode 100644 Logs/MapLog.hs create mode 100644 Logs/MetaData.hs create mode 100644 Logs/NumCopies.hs create mode 100644 Logs/PreferredContent.hs create mode 100644 Logs/PreferredContent/Raw.hs create mode 100644 Logs/Presence.hs create mode 100644 Logs/Presence/Pure.hs create mode 100644 Logs/Remote.hs create mode 100644 Logs/RemoteState.hs create mode 100644 Logs/Schedule.hs create mode 100644 Logs/SingleValue.hs create mode 100644 Logs/Transfer.hs create mode 100644 Logs/Transitions.hs create mode 100644 Logs/Trust.hs create mode 100644 Logs/Trust/Pure.hs create mode 100644 Logs/UUID.hs create mode 100644 Logs/UUIDBased.hs create mode 100644 Logs/Unused.hs create mode 100644 Logs/View.hs create mode 100644 Logs/Web.hs create mode 100644 Makefile create mode 100644 Messages.hs create mode 100644 Messages/JSON.hs create mode 120000 NEWS create mode 100644 README create mode 100644 Remote.hs create mode 100644 Remote/Bup.hs create mode 100644 Remote/Directory.hs create mode 100644 Remote/External.hs create mode 100644 Remote/External/Types.hs create mode 100644 Remote/GCrypt.hs create mode 100644 Remote/Git.hs create mode 100644 Remote/Glacier.hs create mode 100644 Remote/Helper/AWS.hs create mode 100644 Remote/Helper/Chunked.hs create mode 100644 Remote/Helper/Encryptable.hs create mode 100644 Remote/Helper/Git.hs create mode 100644 Remote/Helper/Hooks.hs create mode 100644 Remote/Helper/Messages.hs create mode 100644 Remote/Helper/ReadOnly.hs create mode 100644 Remote/Helper/Special.hs create mode 100644 Remote/Helper/Ssh.hs create mode 100644 Remote/Hook.hs create mode 100644 Remote/List.hs create mode 100644 Remote/Rsync.hs create mode 100644 Remote/Rsync/RsyncUrl.hs create mode 100644 Remote/S3.hs create mode 100644 Remote/Tahoe.hs create mode 100644 Remote/Web.hs create mode 100644 Remote/WebDAV.hs create mode 100644 Remote/WebDAV/DavUrl.hs create mode 100644 Setup.hs create mode 100644 Test.hs create mode 100644 Types.hs create mode 100644 Types/Availability.hs create mode 100644 Types/Backend.hs create mode 100644 Types/BranchState.hs create mode 100644 Types/CleanupActions.hs create mode 100644 Types/Command.hs create mode 100644 Types/Creds.hs create mode 100644 Types/Crypto.hs create mode 100644 Types/DesktopNotify.hs create mode 100644 Types/Distribution.hs create mode 100644 Types/FileMatcher.hs create mode 100644 Types/GitConfig.hs create mode 100644 Types/Group.hs create mode 100644 Types/Key.hs create mode 100644 Types/KeySource.hs create mode 100644 Types/LockPool.hs create mode 100644 Types/Messages.hs create mode 100644 Types/MetaData.hs create mode 100644 Types/NumCopies.hs create mode 100644 Types/Option.hs create mode 100644 Types/Remote.hs create mode 100644 Types/ScheduledActivity.hs create mode 100644 Types/StandardGroups.hs create mode 100644 Types/TrustLevel.hs create mode 100644 Types/UUID.hs create mode 100644 Types/View.hs create mode 100644 Upgrade.hs create mode 100644 Upgrade/V0.hs create mode 100644 Upgrade/V1.hs create mode 100644 Upgrade/V2.hs create mode 100644 Upgrade/V3.hs create mode 100644 Upgrade/V4.hs create mode 100644 Utility/Applicative.hs create mode 100644 Utility/Base64.hs create mode 100644 Utility/Batch.hs create mode 100644 Utility/CoProcess.hs create mode 100644 Utility/CopyFile.hs create mode 100644 Utility/DBus.hs create mode 100644 Utility/Daemon.hs create mode 100644 Utility/Data.hs create mode 100644 Utility/DataUnits.hs create mode 100644 Utility/DirWatcher.hs create mode 100644 Utility/DirWatcher/FSEvents.hs create mode 100644 Utility/DirWatcher/INotify.hs create mode 100644 Utility/DirWatcher/Kqueue.hs create mode 100644 Utility/DirWatcher/Types.hs create mode 100644 Utility/DirWatcher/Win32Notify.hs create mode 100644 Utility/Directory.hs create mode 100644 Utility/DiskFree.hs create mode 100644 Utility/Dot.hs create mode 100644 Utility/Env.hs create mode 100644 Utility/Exception.hs create mode 100644 Utility/ExternalSHA.hs create mode 100644 Utility/FileMode.hs create mode 100644 Utility/FileSystemEncoding.hs create mode 100644 Utility/Format.hs create mode 100644 Utility/FreeDesktop.hs create mode 100644 Utility/Glob.hs create mode 100644 Utility/Gpg.hs create mode 100644 Utility/Hash.hs create mode 100644 Utility/HumanNumber.hs create mode 100644 Utility/HumanTime.hs create mode 100644 Utility/InodeCache.hs create mode 100644 Utility/JSONStream.hs create mode 100644 Utility/LogFile.hs create mode 100644 Utility/Lsof.hs create mode 100644 Utility/Matcher.hs create mode 100644 Utility/Metered.hs create mode 100644 Utility/Misc.hs create mode 100644 Utility/Monad.hs create mode 100644 Utility/Mounts.hsc create mode 100644 Utility/Network.hs create mode 100644 Utility/NotificationBroadcaster.hs create mode 100644 Utility/OSX.hs create mode 100644 Utility/PID.hs create mode 100644 Utility/Parallel.hs create mode 100644 Utility/PartialPrelude.hs create mode 100644 Utility/Path.hs create mode 100644 Utility/Percentage.hs create mode 100644 Utility/PosixFiles.hs create mode 100644 Utility/Process.hs create mode 100644 Utility/QuickCheck.hs create mode 100644 Utility/Quvi.hs create mode 100644 Utility/Rsync.hs create mode 100644 Utility/SRV.hs create mode 100644 Utility/SafeCommand.hs create mode 100644 Utility/Scheduled.hs create mode 100644 Utility/Shell.hs create mode 100644 Utility/SshConfig.hs create mode 100644 Utility/TList.hs create mode 100644 Utility/Tense.hs create mode 100644 Utility/ThreadLock.hs create mode 100644 Utility/ThreadScheduler.hs create mode 100644 Utility/Tmp.hs create mode 100644 Utility/Touch.hsc create mode 100644 Utility/Url.hs create mode 100644 Utility/UserInfo.hs create mode 100644 Utility/Verifiable.hs create mode 100644 Utility/WebApp.hs create mode 100644 Utility/WinLock.hs create mode 100644 Utility/WinProcess.hs create mode 100644 Utility/Yesod.hs create mode 100644 Utility/libdiskfree.c create mode 100644 Utility/libdiskfree.h create mode 100644 Utility/libkqueue.c create mode 100644 Utility/libkqueue.h create mode 100644 Utility/libmounts.c create mode 100644 Utility/libmounts.h create mode 100644 Utility/winprocess.c create mode 100644 build.bat create mode 100644 configure.hs create mode 100644 debian/NEWS create mode 100644 debian/changelog create mode 100644 debian/compat create mode 100644 debian/control create mode 100644 debian/copyright create mode 100644 debian/doc-base create mode 100644 debian/menu create mode 100755 debian/rules create mode 100644 debian/tests/basics create mode 100644 debian/tests/control create mode 100644 doc/Android.mdwn create mode 100644 doc/Android/comment_15_77bafc01b47d4cf8f96bde2b6704ed71._comment create mode 100644 doc/Android/comment_19_dc7b428f525a082834cb87221fc627ff._comment create mode 100644 doc/Android/comment_20_81940ea56ace3dcd5fa84dfccd88ad96._comment create mode 100644 doc/Android/comment_29_37aa87a451d4390ed367402eec740855._comment create mode 100644 doc/Android/comment_5_ba11b81c671d9bcd6f496fbd6f562b0f._comment create mode 100644 doc/Android/comment_6_97704e0d89bb87155e019e09e54fc9bf._comment create mode 100644 doc/Android/oldcomments.mdwn create mode 100644 doc/Android/oldcomments/comment_10_20e3d513b8b97496d76aca4619026cd6._comment create mode 100644 doc/Android/oldcomments/comment_11_c96b8f1cc1583a74eb2483f48357f023._comment create mode 100644 doc/Android/oldcomments/comment_12_6551f5fa081494b079c10a33c9b0d8ad._comment create mode 100644 doc/Android/oldcomments/comment_13_7c633d245651ec08f63194fe1fc194ae._comment create mode 100644 doc/Android/oldcomments/comment_14_60c2403140085f9caf48a33b59a36ab4._comment create mode 100644 doc/Android/oldcomments/comment_16_9af73451be09f03cfff81fdf9481ffc4._comment create mode 100644 doc/Android/oldcomments/comment_17_f76561a654b534df3a807b1c045710b2._comment create mode 100644 doc/Android/oldcomments/comment_18_1b46cdf154ddadfe17e4b6e4054dc619._comment create mode 100644 doc/Android/oldcomments/comment_1_cc9caa5dd22dd67e5c1d22d697096dd2._comment create mode 100644 doc/Android/oldcomments/comment_21_5903f6a4a81a6534fa8cfafb3b6c37bb._comment create mode 100644 doc/Android/oldcomments/comment_22_36afd354f9669a154d7b6b2c4d43ded9._comment create mode 100644 doc/Android/oldcomments/comment_23_de98154792e8611a134429f06d82bcb1._comment create mode 100644 doc/Android/oldcomments/comment_24_7ab509c25243009bfbffd796ec64e77b._comment create mode 100644 doc/Android/oldcomments/comment_25_026d1a01d5753d71ac3dfc002f2a5eec._comment create mode 100644 doc/Android/oldcomments/comment_26_f0a044fb649d43e32c96b08edbc336c3._comment create mode 100644 doc/Android/oldcomments/comment_27_6b9ae35b1ceeba14cd7a74e142870705._comment create mode 100644 doc/Android/oldcomments/comment_28_c91db1215f529aa68bfb0576c3c5eddc._comment create mode 100644 doc/Android/oldcomments/comment_2_c2422b7dd9d526b3616e49f48cf178c2._comment create mode 100644 doc/Android/oldcomments/comment_3_0e4980c27b13dbc28477c02a82898248._comment create mode 100644 doc/Android/oldcomments/comment_4_86f7b5444e2eaea7f8f7b9160f671a1d._comment create mode 100644 doc/Android/oldcomments/comment_5_9d78009435736a178d5a3f5a9bc0ed6a._comment create mode 100644 doc/Android/oldcomments/comment_6_7b9523ddb20dc4a929e556c3ed0c7406._comment create mode 100644 doc/Android/oldcomments/comment_7_a56628a622da752806c42c5b8b54ceef._comment create mode 100644 doc/Android/oldcomments/comment_8_19656ec99b8f6aa64c1d01a3c9ae9bd0._comment create mode 100644 doc/Android/oldcomments/comment_9_55e703ae105d0c0ee9ac50df8cc59dfb._comment create mode 100644 doc/android/DCIM.png create mode 100644 doc/android/appinstalled.png create mode 100644 doc/android/apps.png create mode 100644 doc/android/install.png create mode 100644 doc/android/newwindow.png create mode 100644 doc/android/terminal.png create mode 100644 doc/android/webapp.png create mode 100644 doc/assistant.mdwn create mode 100644 doc/assistant/addsshserver.png create mode 100644 doc/assistant/archival_walkthrough.mdwn create mode 100644 doc/assistant/brokenrepositoryalert.png create mode 100644 doc/assistant/buddylist.png create mode 100644 doc/assistant/cloudnudge.png create mode 100644 doc/assistant/combinerepos.png create mode 100644 doc/assistant/comment_1_f2c4857b7b000e005f0c19279db14eaf._comment create mode 100644 doc/assistant/comment_2_befa1f48e5a43a7965060491430a6bc4._comment create mode 100644 doc/assistant/controlmenu.png create mode 100644 doc/assistant/crashrecovery.png create mode 100644 doc/assistant/dashboard.png create mode 100644 doc/assistant/deleterepository.png create mode 100644 doc/assistant/downloadnotification.png create mode 100644 doc/assistant/downloadupgrade.png create mode 100644 doc/assistant/encryptdrive.png create mode 100644 doc/assistant/example.png create mode 100644 doc/assistant/fsckconfig.png create mode 100644 doc/assistant/genkey.png create mode 100644 doc/assistant/iaitem.png create mode 100644 doc/assistant/inotify_max_limit_alert.png create mode 100644 doc/assistant/local_pairing_walkthrough.mdwn create mode 100644 doc/assistant/local_pairing_walkthrough/addrepository.png create mode 100644 doc/assistant/local_pairing_walkthrough/comment_1_b33deed054d3aa8cfa6c9e3958643f16._comment create mode 100644 doc/assistant/local_pairing_walkthrough/comment_2_39f1162b4d43b61e957e7497df4b9e2b._comment create mode 100644 doc/assistant/local_pairing_walkthrough/comment_3_588869692b290483f58f3a7aa2bfb55f._comment create mode 100644 doc/assistant/local_pairing_walkthrough/comment_4_f6bf82c263fefe38701709d9dbd974cc._comment create mode 100644 doc/assistant/local_pairing_walkthrough/comment_5_bada601ea4b7104f162a3e00def4be2b._comment create mode 100644 doc/assistant/local_pairing_walkthrough/comment_6_01ba0f9bfa0ed066c4b73d2d6028eecc._comment create mode 100644 doc/assistant/local_pairing_walkthrough/comment_7_17d44229e4fa46c50815672b96a9735a._comment create mode 100644 doc/assistant/local_pairing_walkthrough/comment_8_b9d4c29cf2cca0427808df6af08fb789._comment create mode 100644 doc/assistant/local_pairing_walkthrough/pairing.png create mode 100644 doc/assistant/local_pairing_walkthrough/pairrequest.png create mode 100644 doc/assistant/local_pairing_walkthrough/secret.png create mode 100644 doc/assistant/local_pairing_walkthrough/secretempty.png create mode 100644 doc/assistant/logs.png create mode 100644 doc/assistant/makerepo.png create mode 100644 doc/assistant/menu.png create mode 100644 doc/assistant/nautilusmenu.png create mode 100644 doc/assistant/osx-app.png create mode 100644 doc/assistant/preferences.png create mode 100644 doc/assistant/quickstart.mdwn create mode 100644 doc/assistant/release_notes.mdwn create mode 100644 doc/assistant/release_notes/comment_1_bd8f376c9d0c1d5ed07fb013907a60ee._comment create mode 100644 doc/assistant/release_notes/comment_2_75e0774ad042717fbd059a8a9ec2db1e._comment create mode 100644 doc/assistant/release_notes/comment_3_b3bfd8e547e20c51f7c32c6c9424e936._comment create mode 100644 doc/assistant/release_notes/comment_4_c6caa2b521b456bb4ce594d64919cffe._comment create mode 100644 doc/assistant/remote_sharing_walkthrough.mdwn create mode 100644 doc/assistant/remote_sharing_walkthrough/comment_1_e0187b0a926904b363065ab0f850f0b2._comment create mode 100644 doc/assistant/remote_sharing_walkthrough/comment_2_dabcbc9aaf0bdb82716f5a5d55807a21._comment create mode 100644 doc/assistant/remote_sharing_walkthrough/comment_4_978fab3cd165b4ca245e32fc48cf0970._comment create mode 100644 doc/assistant/remote_sharing_walkthrough/comment_4_d7e879f7b098964040df2e27a18eda72._comment create mode 100644 doc/assistant/remote_sharing_walkthrough/comment_5_00852736d47c05772b15c5ff54ae7da7._comment create mode 100644 doc/assistant/remote_sharing_walkthrough/comment_6_770c4f1802fc40d76bbaf7783bb3b4ac._comment create mode 100644 doc/assistant/remote_sharing_walkthrough/comment_7_61c1f5b00381b2fa891a8578267881ab._comment create mode 100644 doc/assistant/remote_sharing_walkthrough/comment_8_35e00cd10e89ae4bcc66af7dadf6bb5c._comment create mode 100644 doc/assistant/remote_sharing_walkthrough/comment_9_c900e4ef49388826c87cadef4235c073._comment create mode 100644 doc/assistant/repairrepository.png create mode 100644 doc/assistant/repogroups.png create mode 100644 doc/assistant/repoinfo.png create mode 100644 doc/assistant/repositories.png create mode 100644 doc/assistant/rsync.net.encryption.png create mode 100644 doc/assistant/rsync.net.png create mode 100644 doc/assistant/running.png create mode 100644 doc/assistant/share_with_a_friend_walkthrough.mdwn create mode 100644 doc/assistant/share_with_a_friend_walkthrough/buddylist.png create mode 100644 doc/assistant/share_with_a_friend_walkthrough/pairing.png create mode 100644 doc/assistant/share_with_a_friend_walkthrough/repolist.png create mode 100644 doc/assistant/share_with_a_friend_walkthrough/xmppalert.png create mode 100644 doc/assistant/thanks.mdwn create mode 100644 doc/assistant/thumbnail.png create mode 100644 doc/assistant/unused.png create mode 100644 doc/assistant/upgradecomplete.png create mode 100644 doc/assistant/xmpp.png create mode 100644 doc/assistant/xmppnudge.png create mode 100644 doc/assistant/xmpppairingend.png create mode 100644 doc/automatic_conflict_resolution.mdwn create mode 100644 doc/automatic_conflict_resolution/comment_1_307898855f91a2a189d4fa5eae62cce1._comment create mode 100644 doc/automatic_conflict_resolution/comment_2_0a8ea42764dde1a33d2112197b961c51._comment create mode 100644 doc/automatic_conflict_resolution/comment_3_5c587c6633cae1c8547ca970d55ee97e._comment create mode 100644 doc/automatic_conflict_resolution/comment_4_80539e11e36a0b64cee83b6b373bd843._comment create mode 100644 doc/automatic_conflict_resolution/comment_5_00ac9e4a47ce9a886dbf573480f151bd._comment create mode 100644 doc/backends.mdwn create mode 100644 doc/backends/comment_1_375bb1fb5973e8fa67b763f2dd6e404b._comment create mode 100644 doc/backends/comment_2_1f2626eca9004b31a0b7fc1a0df8027b._comment create mode 100644 doc/backends/comment_3_fdcbf8727fdefb9942a54689234b9698._comment create mode 100644 doc/backends/comment_4_46591a3ba888fb686b1b319b80ca2c22._comment create mode 100644 doc/backends/comment_5_2210c7ff2d5812fb3b778ac172291656._comment create mode 100644 doc/backends/comment_6_82f239b58680a2681bd8074c7ef9584d._comment create mode 100644 doc/bare_repositories.mdwn create mode 100644 doc/bare_repositories/comment_1_148e1da70d37d311634a0309a4ff8dcd._comment create mode 100644 doc/bugs.mdwn create mode 100644 doc/bugs/127.0.0.1_references_on_remote_assistant_access.mdwn create mode 100644 doc/bugs/3.20121112:_build_error_in_assistant.mdwn create mode 100644 doc/bugs/3.20121112:_build_error_in_assistant/comment_1_b42f40ffd83321ab5cc0ef24ced15e98._comment create mode 100644 doc/bugs/3.20121112:_build_error_in_assistant/comment_2_b1d2aa10ea84c5c370b3e76507fc8761._comment create mode 100644 doc/bugs/3.20121112:_build_error_in_assistant/comment_3_b38e40d36bba95b16afbce68e7f25a80._comment create mode 100644 doc/bugs/3.20121112_build_fails_on_Ubuntu_12.04.mdwn create mode 100644 doc/bugs/3.20121112_build_fails_on_Ubuntu_12.04/comment_1_ce2efd2196e7682f4cdbabdb0616d449._comment create mode 100644 doc/bugs/3.20121112_build_fails_on_Ubuntu_12.04/comment_2_2a6faf662ebb85a8f1c89adcdfb9adb6._comment create mode 100644 doc/bugs/3.20121112_build_fails_on_Ubuntu_12.04/comment_3_37f34baa34068def1adf794d0942e462._comment create mode 100644 doc/bugs/3.20121112_build_fails_on_Ubuntu_12.04/comment_4_2f8a859fef9edc8eb93bf1cc74296702._comment create mode 100644 doc/bugs/3.20121113_build_error___39__not_in_scope_getAddBoxComR__39__.mdwn create mode 100644 doc/bugs/4.20130227_won__39__t_build_on_OS_X_Lion__44___because_testpack_won__39__t_build.mdwn create mode 100644 doc/bugs/4.20130227_won__39__t_build_on_OS_X_Lion__44___because_testpack_won__39__t_build/comment_1_b7140e2bf1ea9c73ecc9e214095968e7._comment create mode 100644 doc/bugs/4.20130227_won__39__t_build_on_OS_X_Lion__44___because_testpack_won__39__t_build/comment_2_6be87b2fb2ed828e7b4bf785729e910e._comment create mode 100644 doc/bugs/4.20130601_xmpp_sync_error.mdwn create mode 100644 doc/bugs/4.20130601_xmpp_sync_error/comment_1_5b50d97e44cbd5b31ff24537ec3f8603._comment create mode 100644 doc/bugs/400_mode_leakage.mdwn create mode 100644 doc/bugs/Add_another_repository_on_USB_drive_causes_sync_loop.mdwn create mode 100644 doc/bugs/Add_another_repository_on_USB_drive_causes_sync_loop/comment_1_81839a6de7450734ee75b51e47a0898e._comment create mode 100644 doc/bugs/Add_another_repository_on_USB_drive_causes_sync_loop/comment_2_907ce31a31df94984c2bd7aaafe5b10b._comment create mode 100644 doc/bugs/Add_another_repository_on_USB_drive_causes_sync_loop/comment_3_d8a86ae0ae5fa1f91e0b40b8b2ba0406._comment create mode 100644 doc/bugs/Add_another_repository_on_USB_drive_causes_sync_loop/comment_4_1f08fd5dd4f5d8723c2b5391cc3b60f9._comment create mode 100644 doc/bugs/Adding_a_repository_as_a___34__remote_server__34___creates_a_bare_repository_next_to_the_existing_one.mdwn create mode 100644 doc/bugs/Adding_a_repository_as_a___34__remote_server__34___creates_a_bare_repository_next_to_the_existing_one/comment_1_cb781d34889d583663e855c4074f8e0e._comment create mode 100644 doc/bugs/Adding_a_repository_as_a___34__remote_server__34___creates_a_bare_repository_next_to_the_existing_one/comment_2_c0c87957d7c7a09664e60571a2ca0e8c._comment create mode 100644 doc/bugs/Adding_box.com_remote_on_Android_fails_for_me.mdwn create mode 100644 doc/bugs/Adding_box.com_remote_on_Android_fails_for_me/comment_1_0303ce880415d7e043533551c2b24694._comment create mode 100644 doc/bugs/Adding_git_ssh_remote_fails.mdwn create mode 100644 doc/bugs/Adding_git_ssh_remote_fails/comment_1_05c0bd9ac7c6f0045217fd72fc1f0a1b._comment create mode 100644 doc/bugs/Adding_git_ssh_remote_fails/comment_2_df05456cafdd89e8ceea830199f42d45._comment create mode 100644 doc/bugs/Adding_second_remote_repository_over_ssh_fails.mdwn create mode 100644 doc/bugs/Adding_second_remote_repository_over_ssh_fails/comment_1_308d5f517bf00c8edc53db438de52355._comment create mode 100644 doc/bugs/Adding_unencrypted_repo_on_drive_in_webapp_gives_internal_server_error__.mdwn create mode 100644 doc/bugs/Addurl_downloads_but_does_not_checkout_files.mdwn create mode 100644 doc/bugs/Addurl_with_quvi_not_working.mdwn create mode 100644 doc/bugs/Allow_syncing_to_a_specific_directory_on_a_USB_remote.mdwn create mode 100644 doc/bugs/Allow_syncing_to_a_specific_directory_on_a_USB_remote/comment_1_13ecedfbb34c3564af3a790b8bf0f591._comment create mode 100644 doc/bugs/Android:_500___47__etc__47__resolv.conf_does_not_exist.mdwn create mode 100644 doc/bugs/Android:_500___47__etc__47__resolv.conf_does_not_exist/comment_1_d4f22335d5b6cb178c77579a1b450f9c._comment create mode 100644 doc/bugs/Android:_500___47__etc__47__resolv.conf_does_not_exist/comment_2_19dd9ebfebbece9d3654825492ebd5b9._comment create mode 100644 doc/bugs/Android:_500___47__etc__47__resolv.conf_does_not_exist/comment_3_4a85c4c45768f96bdc6619c193de55ab._comment create mode 100644 doc/bugs/Android:_Adding_Repository_on_Box.net_fails_with___34__Internal_Server_Error__34__.mdwn create mode 100644 doc/bugs/Android:_Adding_Repository_on_Box.net_fails_with___34__Internal_Server_Error__34__/comment_1_91787407727f7ed833d5970d3226d0cb._comment create mode 100644 doc/bugs/Android:_Adding_Repository_on_Box.net_fails_with___34__Internal_Server_Error__34__/comment_2_f4c52fe33e9c4c107c2469fabb0c6826._comment create mode 100644 doc/bugs/Android:_Adding_Repository_on_Box.net_fails_with___34__Internal_Server_Error__34__/comment_3_20c1f9399321dd85cb584b8845140b1d._comment create mode 100644 doc/bugs/Android:_Adding_Repository_on_Box.net_fails_with___34__Internal_Server_Error__34__/comment_4_d92c30061e087878a2462b5a2e495346._comment create mode 100644 doc/bugs/Android:_Adding_Repository_on_Remote_Server_fails_with___34__Internal_Server_Error__34__.mdwn create mode 100644 doc/bugs/Android:_Adding_Repository_on_Remote_Server_fails_with___34__Internal_Server_Error__34__/comment_1_414adc1bee73711e3133c7fe8811aae2._comment create mode 100644 doc/bugs/Android:_Adding_Repository_on_Remote_Server_fails_with___34__Internal_Server_Error__34__/comment_2_977a529f488ce0c167035675f76ebabf._comment create mode 100644 doc/bugs/Android:_Clocking_on___34__Files__34___in_the_Dashboard_seems_to_do_nothing.mdwn create mode 100644 doc/bugs/Android:_Clocking_on___34__Files__34___in_the_Dashboard_seems_to_do_nothing/comment_1_a9b03d4f4760fea2754a4dc93547f0a3._comment create mode 100644 doc/bugs/Android:_Clocking_on___34__Files__34___in_the_Dashboard_seems_to_do_nothing/comment_2_015e859a16b1ce4c0c7601df0594d555._comment create mode 100644 doc/bugs/Android:_does_not_upload_added_files___40__neither_to___34__Transfer__34___or___34__Full_backup__34___server__41__.mdwn create mode 100644 doc/bugs/Android:_does_not_upload_added_files___40__neither_to___34__Transfer__34___or___34__Full_backup__34___server__41__/comment_1_3f0e3fed240252207020d31ab96d0666._comment create mode 100644 doc/bugs/Android:_does_not_upload_added_files___40__neither_to___34__Transfer__34___or___34__Full_backup__34___server__41__/comment_2_87746f4fd0b404db7070c0b2346e8e2b._comment create mode 100644 doc/bugs/Android:_does_not_upload_added_files___40__neither_to___34__Transfer__34___or___34__Full_backup__34___server__41__/comment_3_72c9e9f6bb5ca23ddfd513fcc8bff48c._comment create mode 100644 doc/bugs/Android:_does_not_upload_added_files___40__neither_to___34__Transfer__34___or___34__Full_backup__34___server__41__/comment_4_b54c169a96e263e12495690fe14d8b4a._comment create mode 100644 doc/bugs/Android:_does_not_upload_added_files___40__neither_to___34__Transfer__34___or___34__Full_backup__34___server__41__/comment_5_56ef816d3d4f3d85d31ccaf806133073._comment create mode 100644 doc/bugs/Android:_no___34____47__etc__47__resolv.conf__34___when_submitting_jabber_user_and_password..mdwn create mode 100644 doc/bugs/Android_:_handling_DCIM__47__Camera_not_being_configurable.mdwn create mode 100644 doc/bugs/Android_:_handling_DCIM__47__Camera_not_being_configurable/comment_1_1fe5f8c68a430b2436649cf4ba8f4987._comment create mode 100644 doc/bugs/Android___34__This_build_of_git-annex_does_not_support_XMPP_pairing__34__.mdwn create mode 100644 doc/bugs/Android___34__This_build_of_git-annex_does_not_support_XMPP_pairing__34__/comment_1_c034bb84e58b2dda1038ba205ec78c56._comment create mode 100644 doc/bugs/Android___34__This_build_of_git-annex_does_not_support_XMPP_pairing__34__/comment_2_99a754f41d59fdd401ba6d169945e7c9._comment create mode 100644 doc/bugs/Android_app_permission_denial_on_startup.mdwn create mode 100644 doc/bugs/Android_app_permission_denial_on_startup/comment_10_dc06737997c8883ef0a12dbecd9ac30f._comment create mode 100644 doc/bugs/Android_app_permission_denial_on_startup/comment_11_b444cd6717658116533745c51481dd3d._comment create mode 100644 doc/bugs/Android_app_permission_denial_on_startup/comment_12_66181f34ed7496d1f6601b39e5ae3c65._comment create mode 100644 doc/bugs/Android_app_permission_denial_on_startup/comment_1_ddf5761bf14de30ac97030ad338601ae._comment create mode 100644 doc/bugs/Android_app_permission_denial_on_startup/comment_2_8b9fafa73ebf5f803c7da9531cfb5b34._comment create mode 100644 doc/bugs/Android_app_permission_denial_on_startup/comment_3_58501bb043b4c5836d7472ffd6baa72c._comment create mode 100644 doc/bugs/Android_app_permission_denial_on_startup/comment_4_d3a04dc7bbc1816cccc8d85c73ffb689._comment create mode 100644 doc/bugs/Android_app_permission_denial_on_startup/comment_5_eeabbc0cc434ed84c36a3f4e03fcef36._comment create mode 100644 doc/bugs/Android_app_permission_denial_on_startup/comment_6_4203b496bee1bdd424466ed63b5d31cf._comment create mode 100644 doc/bugs/Android_app_permission_denial_on_startup/comment_7_74373eb2cc46b76659e3c463d6682d15._comment create mode 100644 doc/bugs/Android_app_permission_denial_on_startup/comment_8_0923d2a09df01d152ec4784c92689c96._comment create mode 100644 doc/bugs/Android_app_permission_denial_on_startup/comment_9_b60928e54a5b620899cf29820b9b8e70._comment create mode 100644 doc/bugs/Android_daily_build_missing_webapp.mdwn create mode 100644 doc/bugs/Annex_thinks_file_exists_afer_being_dropped.mdwn create mode 100644 doc/bugs/Annex_thinks_file_exists_afer_being_dropped/comment_1_1d100441fd1ef529eb854b350fece9ee._comment create mode 100644 doc/bugs/Annex_thinks_file_exists_afer_being_dropped/comment_2_166c459c2b27859cf457e17da685fe75._comment create mode 100644 doc/bugs/Annex_thinks_file_exists_afer_being_dropped/comment_3_9d985b6e7973bfaaf8b4f5349d8c13ee._comment create mode 100644 doc/bugs/Annex_thinks_file_exists_afer_being_dropped/comment_4_3e084cff454b95c7170c0225a53f0c30._comment create mode 100644 doc/bugs/Armel_version_broken_on_Synology_DSM_4.3-3810.mdwn create mode 100644 doc/bugs/Armel_version_broken_on_Synology_DSM_4.3-3810/comment_1_c398f92de91729e60b59127733759a38._comment create mode 100644 doc/bugs/Armel_version_broken_on_Synology_DSM_4.3-3810/comment_2_646087d44ee32f78784ae9e8d65d87e6._comment create mode 100644 doc/bugs/Armel_version_broken_on_Synology_DSM_4.3-3810/comment_3_205e41cb0abaed3e16d45206bb2e77a4._comment create mode 100644 doc/bugs/Assistant_does_not_actually_check_newly_annex-added_files_into_git_until_daily_sanity_check.mdwn create mode 100644 doc/bugs/Assistant_doesn__39__t_actually_sync_file_contents_by_default.mdwn create mode 100644 doc/bugs/Assistant_doesn__39__t_actually_sync_file_contents_by_default/comment_1_8577fdaa4d49e6241c4372b159694c9c._comment create mode 100644 doc/bugs/Assistant_doesn__39__t_actually_sync_file_contents_by_default/comment_2_027521e48283c68b39315bb8213f6e45._comment create mode 100644 doc/bugs/Assistant_doesn__39__t_actually_sync_file_contents_by_default/comment_3_fd8f6938596aace60b04fb35c4069e37._comment create mode 100644 doc/bugs/Assistant_doesn__39__t_actually_sync_file_contents_by_default/comment_4_ca908021ab5a2a50fd0d4a7e8d12498f._comment create mode 100644 doc/bugs/Assistant_doesn__39__t_actually_sync_file_contents_by_default/comment_5_73532556cfc354ad5f37a3f3a048fb32._comment create mode 100644 doc/bugs/Assistant_doesn__39__t_actually_sync_file_contents_by_default/comment_6_ced397b9e6119a0798a282ee07e885df._comment create mode 100644 doc/bugs/Assistant_doesn__39__t_actually_sync_file_contents_by_default/comment_7_8acb66850e5db8337cf3f2b2dd236ccc._comment create mode 100644 doc/bugs/Assistant_doesn__39__t_actually_sync_file_contents_by_default/comment_8_7eb530851ae6fa1a69813725c4e8fcec._comment create mode 100644 doc/bugs/Assistant_doesn__39__t_actually_sync_file_contents_by_default/comment_9_c7d51a26e1febc3894d02546940d64e5._comment create mode 100644 doc/bugs/Assistant_dropping_files_it_has_just_transferred_elsewhere_again.mdwn create mode 100644 doc/bugs/Assistant_dropping_from_backup_repo.mdwn create mode 100644 doc/bugs/Assistant_dropping_from_backup_repo/comment_1_c13d86fb2541676ee4ca1446b99e0e68._comment create mode 100644 doc/bugs/Assistant_enters_eternal_loop_and_eats_up_all_of_RAM_after_X_restart.mdwn create mode 100644 doc/bugs/Assistant_from_standalone_5.20131230_64bit_crashes_on_startup.mdwn create mode 100644 doc/bugs/Assistant_from_standalone_5.20131230_64bit_crashes_on_startup/comment_1_56befc288c40e062e086d93d26064342._comment create mode 100644 doc/bugs/Assistant_from_standalone_5.20131230_64bit_crashes_on_startup/comment_2_107ab23eac98a168d2920bb88b4ec86f._comment create mode 100644 doc/bugs/Assistant_from_standalone_5.20131230_64bit_crashes_on_startup/comment_3_7707c47aacde425ca6149dd828dd27fb._comment create mode 100644 doc/bugs/Assistant_has_created_155_semitrusted_repositories.mdwn create mode 100644 doc/bugs/Assistant_has_created_155_semitrusted_repositories/comment_10_c5508b476fc48e7a0002b6ecb8d5eac0._comment create mode 100644 doc/bugs/Assistant_has_created_155_semitrusted_repositories/comment_11_cb49edcc8a13928c171a2acdde32dce9._comment create mode 100644 doc/bugs/Assistant_has_created_155_semitrusted_repositories/comment_12_a86c8347526e7b0a6f7633f3aea528bb._comment create mode 100644 doc/bugs/Assistant_has_created_155_semitrusted_repositories/comment_13_a26c2b49ee7746be06f4772aa838d5aa._comment create mode 100644 doc/bugs/Assistant_has_created_155_semitrusted_repositories/comment_14_b958da97a69091d283918e0d5a658da5._comment create mode 100644 doc/bugs/Assistant_has_created_155_semitrusted_repositories/comment_1_169b24b34cce3f5c8446c2150beb6827._comment create mode 100644 doc/bugs/Assistant_has_created_155_semitrusted_repositories/comment_2_6acd6f38297772a07d8d5fb999bd2eaa._comment create mode 100644 doc/bugs/Assistant_has_created_155_semitrusted_repositories/comment_3_6a4118e5c5fbe5e84d27094ac72b741b._comment create mode 100644 doc/bugs/Assistant_has_created_155_semitrusted_repositories/comment_4_04daa20d5d7c74bb34ec48e752ed9fe8._comment create mode 100644 doc/bugs/Assistant_has_created_155_semitrusted_repositories/comment_5_11af8ab2587e6eeb671051ba8191995b._comment create mode 100644 doc/bugs/Assistant_has_created_155_semitrusted_repositories/comment_6_26236cdc2bce532017854791bcd727d1._comment create mode 100644 doc/bugs/Assistant_has_created_155_semitrusted_repositories/comment_7_3c532dd5b8a01ecdeda1300b49aba675._comment create mode 100644 doc/bugs/Assistant_has_created_155_semitrusted_repositories/comment_8_119142c5ebc499f0ee0926dbca265308._comment create mode 100644 doc/bugs/Assistant_has_created_155_semitrusted_repositories/comment_9_0651071ee1654eeaa9aa9369873fdf6a._comment create mode 100644 doc/bugs/Assistant_having_a_child_git_cat-file_--batch_do_the_same_thing_over_and_over_and_using_a_lot_of_memory.mdwn create mode 100644 doc/bugs/Assistant_having_a_child_git_cat-file_--batch_do_the_same_thing_over_and_over_and_using_a_lot_of_memory/comment_1_ac8c39e362e6c806b9d68befc0199ccd._comment create mode 100644 doc/bugs/Assistant_lost_dbus_connection_spamming_log.mdwn create mode 100644 doc/bugs/Assistant_lost_dbus_connection_spamming_log/comment_10_b47d543e06a1a243211a2fa0cb5d09a3._comment create mode 100644 doc/bugs/Assistant_lost_dbus_connection_spamming_log/comment_11_399c1e4455dce105df95414fe3ff939d._comment create mode 100644 doc/bugs/Assistant_lost_dbus_connection_spamming_log/comment_12_1cfdd76e751ee3726bd80359cfc85c47._comment create mode 100644 doc/bugs/Assistant_lost_dbus_connection_spamming_log/comment_13_37aa5274874242861dc128efa1d29486._comment create mode 100644 doc/bugs/Assistant_lost_dbus_connection_spamming_log/comment_1_27fc71cadcbe6d5f146ffdb72b64689a._comment create mode 100644 doc/bugs/Assistant_lost_dbus_connection_spamming_log/comment_2_0fb01ff463e7da6df2864186dc28f8e4._comment create mode 100644 doc/bugs/Assistant_lost_dbus_connection_spamming_log/comment_3_10fa5082909f5e568623cf6d901d5161._comment create mode 100644 doc/bugs/Assistant_lost_dbus_connection_spamming_log/comment_4_f4e0fa25b7f466228622a6da02b157e7._comment create mode 100644 doc/bugs/Assistant_lost_dbus_connection_spamming_log/comment_5_6b9b87bfb8b94171b3dba51919fd1ceb._comment create mode 100644 doc/bugs/Assistant_lost_dbus_connection_spamming_log/comment_6_51f35f069c95a5ea7bd4dbab47b5702b._comment create mode 100644 doc/bugs/Assistant_lost_dbus_connection_spamming_log/comment_7_691661d902acbf9c11d713541d5d39e4._comment create mode 100644 doc/bugs/Assistant_lost_dbus_connection_spamming_log/comment_8_ef559feb7b350f2014055680d087c2bc._comment create mode 100644 doc/bugs/Assistant_lost_dbus_connection_spamming_log/comment_9_278b41aaa73a214b2b38881242a29b17._comment create mode 100644 doc/bugs/Assistant_redirects_to_127.0.0.1_in_some_cases__44___although_used_remotely.mdwn create mode 100644 doc/bugs/Assistant_stalls_when_adding__47__creating_repo_on_ArchLinux.mdwn create mode 100644 doc/bugs/Assistant_stalls_when_adding__47__creating_repo_on_ArchLinux/comment_10_ec4a7388ea7106a953f599b664b37f1d._comment create mode 100644 doc/bugs/Assistant_stalls_when_adding__47__creating_repo_on_ArchLinux/comment_1_6a60c23850a5e2a7bba355e1317abc69._comment create mode 100644 doc/bugs/Assistant_stalls_when_adding__47__creating_repo_on_ArchLinux/comment_2_90b6ed232b2917b9fe041532284e1212._comment create mode 100644 doc/bugs/Assistant_stalls_when_adding__47__creating_repo_on_ArchLinux/comment_3_5a89d79395d96c43d7d8a6fd9dc275f1._comment create mode 100644 doc/bugs/Assistant_stalls_when_adding__47__creating_repo_on_ArchLinux/comment_4_cdd26c71875428dbe3c100944a443d3f._comment create mode 100644 doc/bugs/Assistant_stalls_when_adding__47__creating_repo_on_ArchLinux/comment_5_76242f5d6c815acd5bd58213bd8bb0fe._comment create mode 100644 doc/bugs/Assistant_stalls_when_adding__47__creating_repo_on_ArchLinux/comment_6_10852171c0207ca61ea6df1082107353._comment create mode 100644 doc/bugs/Assistant_stalls_when_adding__47__creating_repo_on_ArchLinux/comment_7_73e8a5696709f8154e63693ba5e569c3._comment create mode 100644 doc/bugs/Assistant_stalls_when_adding__47__creating_repo_on_ArchLinux/comment_8_392fc344e5833b0eb665fcd38f956b7a._comment create mode 100644 doc/bugs/Assistant_stalls_when_adding__47__creating_repo_on_ArchLinux/comment_9_9f0fc19a7fcaf7a5827e59e1495cf8c9._comment create mode 100644 doc/bugs/Assistant_uses_obsolete_GDU_volume_monitor.mdwn create mode 100644 doc/bugs/Assistant_uses_obsolete_GDU_volume_monitor/comment_10_0e1db417a5815ea903c1f7ccd07308c4._comment create mode 100644 doc/bugs/Assistant_uses_obsolete_GDU_volume_monitor/comment_1_28b0cfcba8902c9c16dbe6c4b07984c4._comment create mode 100644 doc/bugs/Assistant_uses_obsolete_GDU_volume_monitor/comment_2_952b3f78da756ff5f89235db94bec67f._comment create mode 100644 doc/bugs/Assistant_uses_obsolete_GDU_volume_monitor/comment_3_d86aba42d014c4b4f708dcb5fe86e055._comment create mode 100644 doc/bugs/Assistant_uses_obsolete_GDU_volume_monitor/comment_4_9aaf296ef53da317d6dc6728705d5c56._comment create mode 100644 doc/bugs/Assistant_uses_obsolete_GDU_volume_monitor/comment_5_0d5f8a05a1505660f7ff1bc4ac6ff271._comment create mode 100644 doc/bugs/Assistant_uses_obsolete_GDU_volume_monitor/comment_6_3dfdfd49597c85575cb689adb70d2de6._comment create mode 100644 doc/bugs/Assistant_uses_obsolete_GDU_volume_monitor/comment_7_943a446c60ed9d7d4f240ba7f00fe925._comment create mode 100644 doc/bugs/Assistant_uses_obsolete_GDU_volume_monitor/comment_8_9563859850fb40b1cc2c20c516c12960._comment create mode 100644 doc/bugs/Assistant_uses_obsolete_GDU_volume_monitor/comment_9_cf6221c585ee3dbf039bdaea71842d9b._comment create mode 100644 doc/bugs/Auto-repair_greatly_slows_down_the_machine.mdwn create mode 100644 doc/bugs/Auto-repair_greatly_slows_down_the_machine/comment_1_a52e4ef04209d0a2449165e2b4cb9ccc._comment create mode 100644 doc/bugs/Auto-repair_greatly_slows_down_the_machine/comment_2_9f5340ab1012f335af0c246b82c1a777._comment create mode 100644 doc/bugs/Auto-repair_greatly_slows_down_the_machine/comment_3_67bfccf0934075559d439b1deafc001e._comment create mode 100644 doc/bugs/Auto-repair_greatly_slows_down_the_machine/comment_4_5fa785aa759d1a1917f2a292324fe5ec._comment create mode 100644 doc/bugs/Auto-repair_greatly_slows_down_the_machine/comment_5_9fe529034ad0115792b58d7da99c167e._comment create mode 100644 doc/bugs/Auto-repair_greatly_slows_down_the_machine/comment_6_93ed991ef2a74c18575073ca72e06185._comment create mode 100644 doc/bugs/Auto_update_not_updating_to_newest_version.mdwn create mode 100644 doc/bugs/Auto_update_not_updating_to_newest_version/comment_1_6f75569dc960ea5bc4d334b2b321ebf8._comment create mode 100644 doc/bugs/Auto_update_not_updating_to_newest_version/comment_2_4f26cce07a9f37c79b166111db499ce1._comment create mode 100644 doc/bugs/Auto_update_not_updating_to_newest_version/comment_3_585bfcaa655b0e838f9b66a241d5ffc2._comment create mode 100644 doc/bugs/Auto_update_not_updating_to_newest_version/comment_4_2705fbfd74652ab097ac48ec687517c7._comment create mode 100644 doc/bugs/Auto_update_not_updating_to_newest_version/comment_5_ab1ee005dbd54e560ea6e3c716cc8f1b._comment create mode 100644 doc/bugs/Automatic_upgrades_should_be_cryptographically_signed.mdwn create mode 100644 doc/bugs/Automatic_upgrades_should_be_cryptographically_signed/comment_1_37ed871c82879a31c2d8cfc7d9736548._comment create mode 100644 doc/bugs/Backup_repository_doesn__39__t_get_all_files.mdwn create mode 100644 doc/bugs/Backup_repository_doesn__39__t_get_all_files/comment_1_a486dc0f741e08d5bcf2fd1a6ecbdf05._comment create mode 100644 doc/bugs/Box.com_ReposnseTimeout.mdwn create mode 100644 doc/bugs/Box.com_ReposnseTimeout/comment_1_4ac0bf61fb4b2ac335a8a1f29e9d882d._comment create mode 100644 doc/bugs/Box.com_ReposnseTimeout/comment_2_29d8a9fa8d385a08fa70337baaba462c._comment create mode 100644 doc/bugs/Box.com_ReposnseTimeout/comment_3_b73450b3a9728ac6f34f0e63255f6fa9._comment create mode 100644 doc/bugs/Box.com_ReposnseTimeout/comment_4_0bd9eb5947a21d0657e79cf276923bb5._comment create mode 100644 doc/bugs/Browser_fails_to_launch_on_Android___39__git_annex_webapp__39__.mdwn create mode 100644 doc/bugs/Browser_fails_to_launch_on_Android___39__git_annex_webapp__39__/comment_1_173393b0b3d2d8c622c0d8a2eaace421._comment create mode 100644 doc/bugs/Bug_Report_doesn__39__t_work.mdwn create mode 100644 doc/bugs/Build-depends_needs___39__hxt__39___added_-_3.20121127.mdwn create mode 100644 doc/bugs/Build_error:_Ambiguous_occurrence___96__callCommand__39__.mdwn create mode 100644 doc/bugs/Build_error:_Ambiguous_occurrence___96__callCommand__39__/comment_1_3127b3c448888fdf70096f24c7cbfd3c._comment create mode 100644 doc/bugs/Build_error_on_Linux.mdwn create mode 100644 doc/bugs/Build_error_on_Mac_OSX_10.6.mdwn create mode 100644 doc/bugs/Build_failure_at_commit_1efe4f3.mdwn create mode 100644 doc/bugs/Building_fails:_Could_not_find_module___96__Text.Blaze__39__.mdwn create mode 100644 doc/bugs/Building_fails:_Not_in_scope:___96__myHomeDir__39___.mdwn create mode 100644 doc/bugs/Building_fails:__Could_not_find_module___96__Data.XML.Types__39__.mdwn create mode 100644 doc/bugs/Building_fails:___Not_in_scope:_type_constructor_or_class___96__Html__39__.mdwn create mode 100644 doc/bugs/Building_in_cabal_using_--bindir___126____47__bin_breaks_the_desktop_link.mdwn create mode 100644 doc/bugs/Building_in_cabal_using_--bindir___126____47__bin_breaks_the_desktop_link/comment_1_c0f0a2878070ed86900815c6b6a5fa5e._comment create mode 100644 doc/bugs/Building_in_cabal_using_--bindir___126____47__bin_breaks_the_desktop_link/comment_2_53f2de3d3993821d8502fd08a0fcce12._comment create mode 100644 doc/bugs/Building_on_OpenBSD.mdwn create mode 100644 doc/bugs/Building_on_OpenBSD/comment_1_bec4a7253e851567cd47b96ceead5d91._comment create mode 100644 doc/bugs/Building_on_OpenBSD/comment_2_4a37935080b86643ecda717fe17f8f87._comment create mode 100644 doc/bugs/Building_on_OpenBSD/comment_3_2df229eb965189e2f7ea6dcd66cf68ca._comment create mode 100644 doc/bugs/Building_on_OpenBSD/comment_4_d141c0bac92bdfbc8b95d532d032174c._comment create mode 100644 doc/bugs/Building_on_OpenBSD/comment_5_8aba96ef58eb6954f1d15029e0dda9ed._comment create mode 100644 doc/bugs/Building_on_OpenBSD/comment_6_82e6744e246fe5caa72081d4e921b168._comment create mode 100644 doc/bugs/Cabal_cannot_solve_dependencies.mdwn create mode 100644 doc/bugs/Cabal_cannot_solve_dependencies/comment_1_1d41ac79867226dcb71f1c7b38da062d._comment create mode 100644 doc/bugs/Cabal_cannot_solve_dependencies/comment_2_50e72633a4462f6f6eb33d57b137fdcc._comment create mode 100644 doc/bugs/Cabal_cannot_solve_dependencies/comment_3_886f2d1f7c47a3973b8dc7d7c412289a._comment create mode 100644 doc/bugs/Cabal_dependency_monadIO_missing.mdwn create mode 100644 doc/bugs/Cabal_dependency_monadIO_missing/comment_1_14be660aa57fadec0d81b32a8b52c66f._comment create mode 100644 doc/bugs/Cabal_dependency_monadIO_missing/comment_2_4f4d8e1e00a2a4f7e8a8ab082e16adac._comment create mode 100644 doc/bugs/Calls_to_rsync_don__39__t_always_use__annex-rsync-options.mdwn create mode 100644 doc/bugs/Can__39__t___34__git-annex_get__34___with_3.20111203.mdwn create mode 100644 doc/bugs/Can__39__t_access_files_from___39__Removable_drive__39___repo_even_if_set_as_client.mdwn create mode 100644 doc/bugs/Can__39__t_access_files_from___39__Removable_drive__39___repo_even_if_set_as_client/comment_1_25eb2d7d0a9cdd1c55df0cec68472723._comment create mode 100644 doc/bugs/Can__39__t_access_files_from___39__Removable_drive__39___repo_even_if_set_as_client/comment_2_9e9b96e5113a50533251e946c2560d81._comment create mode 100644 doc/bugs/Can__39__t_access_files_from___39__Removable_drive__39___repo_even_if_set_as_client/comment_3_6b091198ddd6ed709b076df1296aeb77._comment create mode 100644 doc/bugs/Can__39__t_access_files_from___39__Removable_drive__39___repo_even_if_set_as_client/comment_4_118b588685b535cca4c02eb6ef297c67._comment create mode 100644 doc/bugs/Can__39__t_access_files_from___39__Removable_drive__39___repo_even_if_set_as_client/comment_5_5cead277493e1c020e16be6f9245fe33._comment create mode 100644 doc/bugs/Can__39__t_access_files_from___39__Removable_drive__39___repo_even_if_set_as_client/comment_6_0f135f97c2808dce094628dc6608e617._comment create mode 100644 doc/bugs/Can__39__t_access_files_from___39__Removable_drive__39___repo_even_if_set_as_client/comment_7_1d6f47f9e6cf935f19d68af6d5aa92fa._comment create mode 100644 doc/bugs/Can__39__t_access_files_from___39__Removable_drive__39___repo_even_if_set_as_client/comment_8_c5758fdb32348b9cd804ff17d27864e1._comment create mode 100644 doc/bugs/Can__39__t_add_a_git_repo_to_git_annex:___34__Invalid_path_repo__47__.git__47__X__34___for_many_X.mdwn create mode 100644 doc/bugs/Can__39__t_add_a_git_repo_to_git_annex:___34__Invalid_path_repo__47__.git__47__X__34___for_many_X/comment_1_7f54e24c8e721d69bdb1e5a4181641b8._comment create mode 100644 doc/bugs/Can__39__t_add_a_git_repo_to_git_annex:___34__Invalid_path_repo__47__.git__47__X__34___for_many_X/comment_2_6e91bc254f79ccf80d385ba7d35ffa9c._comment create mode 100644 doc/bugs/Can__39__t_add_a_git_repo_to_git_annex:___34__Invalid_path_repo__47__.git__47__X__34___for_many_X/comment_3_4cf34da6050dd96f94ffc3652aa39715._comment create mode 100644 doc/bugs/Can__39__t_add_a_git_repo_to_git_annex:___34__Invalid_path_repo__47__.git__47__X__34___for_many_X/comment_4_cafcc24e98a89f10adaed5e09f75b659._comment create mode 100644 doc/bugs/Can__39__t_add_a_git_repo_to_git_annex:___34__Invalid_path_repo__47__.git__47__X__34___for_many_X/comment_5_118d61dea9ef0faa2960da6f2f62ec8b._comment create mode 100644 doc/bugs/Can__39__t_add_a_git_repo_to_git_annex:___34__Invalid_path_repo__47__.git__47__X__34___for_many_X/comment_6_3978557c6e85608243e5b4eb698ac5a5._comment create mode 100644 doc/bugs/Can__39__t_add_a_git_repo_to_git_annex:___34__Invalid_path_repo__47__.git__47__X__34___for_many_X/comment_7_e6dfc41d2042402b40efb6f6139d5662._comment create mode 100644 doc/bugs/Can__39__t_add_a_git_repo_to_git_annex:___34__Invalid_path_repo__47__.git__47__X__34___for_many_X/comment_8_33a84937c87dd2406bc090a0d2969683._comment create mode 100644 doc/bugs/Can__39__t_add_a_git_repo_to_git_annex:___34__Invalid_path_repo__47__.git__47__X__34___for_many_X/comment_9_28bb02572d453db3b30824ec7604d91a._comment create mode 100644 doc/bugs/Can__39__t_clone_on_Windows_because_some_filenames_have_a_colon_in_them.mdwn create mode 100644 doc/bugs/Can__39__t_clone_on_Windows_because_some_filenames_have_a_colon_in_them/comment_1_5fc1347f4bcc13c9f8dbc5ecd4847fc7._comment create mode 100644 doc/bugs/Can__39__t_clone_on_Windows_because_some_filenames_have_a_colon_in_them/comment_2_38696178e658d1d32deec37dbea66a3d._comment create mode 100644 doc/bugs/Can__39__t_clone_on_Windows_because_some_filenames_have_a_colon_in_them/comment_3_f34d996827f5e7662bec409cbcce961b._comment create mode 100644 doc/bugs/Can__39__t_rename___34__here__34___repository.mdwn create mode 100644 doc/bugs/Can__39__t_set_repositories_directory.mdwn create mode 100644 doc/bugs/Can__39__t_set_repositories_directory/comment_1_beb5d5b66a8d0fab12be44a7d877e9b0._comment create mode 100644 doc/bugs/Can__39__t_set_repositories_directory/comment_2_366aa798a5e55350d32b63b31c19112b._comment create mode 100644 doc/bugs/Can__39__t_set_repositories_directory/comment_3_812554d58ad9274a50b2a33d5f4d2ec3._comment create mode 100644 doc/bugs/Can__39__t_set_repositories_directory/comment_4_bec5f147441ad18c97845b44c90c728b._comment create mode 100644 doc/bugs/Can__39__t_set_up_rsync.net_repo_on_OS_X_10.9.mdwn create mode 100644 doc/bugs/Can__39__t_set_up_rsync.net_repo_on_OS_X_10.9/comment_1_91a961cfa5dd4d6f0e4abfbbcfb81e92._comment create mode 100644 doc/bugs/Can__39__t_set_up_rsync.net_repo_on_OS_X_10.9/comment_2_0b5266e31fe7014bd11ea164f8e4744e._comment create mode 100644 doc/bugs/Can__39__t_start_it_on_Debian_Wheezy.mdwn create mode 100644 doc/bugs/Can__39__t_start_on_Cyanogenmod_10.2_nightly.mdwn create mode 100644 doc/bugs/Can__39__t_transfer_files_to_rsync_remote_with_encryption__61__shared.mdwn create mode 100644 doc/bugs/Can__39__t_transfer_files_to_rsync_remote_with_encryption__61__shared/comment_1_ca7ec2041bbec330476fb040b1e66a92._comment create mode 100644 doc/bugs/Can__39__t_transfer_files_to_rsync_remote_with_encryption__61__shared/comment_2_c476847665a5320214721497d8fad15b._comment create mode 100644 doc/bugs/Can_not_Drop_Unused_Files_With_Spaces.mdwn create mode 100644 doc/bugs/Can_not_Drop_Unused_Files_With_Spaces/comment_1_b909ed9f474601587b2adad7ad4f674d._comment create mode 100644 doc/bugs/Can_not_Drop_Unused_Files_With_Spaces/comment_2_b2735a6e03db3f77a87a0f7d87347685._comment create mode 100644 doc/bugs/Can_not_Drop_Unused_Files_With_Spaces/comment_3_dd82a0cd698b0688ff08f0462af0275f._comment create mode 100644 doc/bugs/Can_not_Drop_Unused_Files_With_Spaces/comment_4_bbebb1d0dc5fbc1f6a0bb75b47bd4986._comment create mode 100644 doc/bugs/Can_not_Drop_Unused_Files_With_Spaces/comment_5_106c271d5174342055910bf57c0a34c5._comment create mode 100644 doc/bugs/Can_not_Drop_Unused_Files_With_Spaces/comment_6_3a2d3cc3e018beaf2eb44b86ce7e1a7f._comment create mode 100644 doc/bugs/Cannot_build_the_latest_with_GHC_7.6.1.mdwn create mode 100644 doc/bugs/Cannot_build_the_latest_with_GHC_7.6.1/comment_1_b25859c159d62f2e92b92f505535131b._comment create mode 100644 doc/bugs/Cannot_build_the_latest_with_GHC_7.6.1/comment_2_4c9eab9120718457fdc1ae9051e44bca._comment create mode 100644 doc/bugs/Cannot_build_the_latest_with_GHC_7.6.1/comment_3_61aec9801e1f76db4a286536ffacc3ed._comment create mode 100644 doc/bugs/Cannot_build_the_latest_with_GHC_7.6.1/comment_4_6381ff0ea419831d9bbed27511cad1e9._comment create mode 100644 doc/bugs/Cannot_clone_an_annex.mdwn create mode 100644 doc/bugs/Cannot_clone_an_annex/comment_1_b40a2652361a79c6c6eab0fc21be8e46._comment create mode 100644 doc/bugs/Cannot_copy_to_a_git-annex_remote.mdwn create mode 100644 doc/bugs/Cannot_copy_to_a_git-annex_remote/comment_10_258a376cff4c62bc4be919322bb1bd88._comment create mode 100644 doc/bugs/Cannot_copy_to_a_git-annex_remote/comment_10_d9b830a1fdea8760cb7da1d36b3cd34d._comment create mode 100644 doc/bugs/Cannot_copy_to_a_git-annex_remote/comment_1_09d76e5f9480b9a35644a8f08790cd97._comment create mode 100644 doc/bugs/Cannot_copy_to_a_git-annex_remote/comment_2_7b586c705a937d09a1b44bd6af2d4686._comment create mode 100644 doc/bugs/Cannot_copy_to_a_git-annex_remote/comment_3_07dbd8f64982f1921077e23f468122cf._comment create mode 100644 doc/bugs/Cannot_copy_to_a_git-annex_remote/comment_4_926fd494f0b27103a99083cd5d0702d5._comment create mode 100644 doc/bugs/Cannot_copy_to_a_git-annex_remote/comment_5_80444a509cc340f5eb3cd08b193fd389._comment create mode 100644 doc/bugs/Cannot_copy_to_a_git-annex_remote/comment_6_4c6b99cd67b4aa742da5101fb1b379f7._comment create mode 100644 doc/bugs/Cannot_copy_to_a_git-annex_remote/comment_8_f45cdd2b6acc5f458b67539fced0e529._comment create mode 100644 doc/bugs/Cannot_copy_to_a_git-annex_remote/comment_9_5a455dd14fb9d3ff408bb3f81e366c38._comment create mode 100644 doc/bugs/Cannot_delete_remote_when_ssh_sync_fails.mdwn create mode 100644 doc/bugs/Cannot_delete_remote_when_ssh_sync_fails/comment_1_3c8e8fae688a9db8e18e869a187fb4eb._comment create mode 100644 doc/bugs/Cannot_delete_remote_when_ssh_sync_fails/comment_2_e189617c4ac23df50f02af8c517fa399._comment create mode 100644 doc/bugs/Cannot_sync_repos_setup_using_webapp:___34__git-annex-shell:_Only_allowed_to_access___126____47__foo_not___126____47__bar__47____34__.mdwn create mode 100644 doc/bugs/Cannot_sync_repos_setup_using_webapp:___34__git-annex-shell:_Only_allowed_to_access___126____47__foo_not___126____47__bar__47____34__/comment_1_6f7b5c164ff64f00b8814b2ee334709f._comment create mode 100644 doc/bugs/Cannot_sync_repos_setup_using_webapp:___34__git-annex-shell:_Only_allowed_to_access___126____47__foo_not___126____47__bar__47____34__/comment_2_807ef1250237bf4426e3a24c1f9ba357._comment create mode 100644 doc/bugs/Check_for_minimum_Git_version.mdwn create mode 100644 doc/bugs/Committer_crashed.mdwn create mode 100644 doc/bugs/Compile_needs_more_than_1.5gb_of_memory.mdwn create mode 100644 doc/bugs/Compile_needs_more_than_1.5gb_of_memory/comment_1_0806b5132c55d7a5a17fbdad7e3f2291._comment create mode 100644 doc/bugs/Complete_failure_trying_to_unannex_a_large_annex.mdwn create mode 100644 doc/bugs/Complete_failure_trying_to_unannex_a_large_annex/comment_1_1c202695ab7fe62cdc8770e1fb428d0c._comment create mode 100644 doc/bugs/Conflicting_archive_descriptions.mdwn create mode 100644 doc/bugs/ControlPath_too_long_for_Unix_domain_socket.mdwn create mode 100644 doc/bugs/ControlPath_too_long_for_Unix_domain_socket/comment_1_60f58e205604eebe668b1e05dcfbf9a7._comment create mode 100644 doc/bugs/ControlPath_too_long_for_Unix_domain_socket/comment_2_9c0c65389a3b4e7e81b8de96d430a3f1._comment create mode 100644 doc/bugs/Corrupted_drive:_Assistant_seems_consider_files_deleted_and_deletes_them_elsewhere_too.mdwn create mode 100644 doc/bugs/Corrupted_drive:_Assistant_seems_consider_files_deleted_and_deletes_them_elsewhere_too/comment_1_80ca50f5305eda71fe32f2b0bc922c34._comment create mode 100644 doc/bugs/Corrupted_drive:_Assistant_seems_consider_files_deleted_and_deletes_them_elsewhere_too/comment_2_e6bc6d1c0eb8c469e9e00b37bbcc9b86._comment create mode 100644 doc/bugs/Corrupted_drive:_Assistant_seems_consider_files_deleted_and_deletes_them_elsewhere_too/comment_5_0d0f6b6b46d0153433fead2bbd1bbe64._comment create mode 100644 doc/bugs/Corrupted_drive:_Assistant_seems_consider_files_deleted_and_deletes_them_elsewhere_too/comment_5_6058a22b733cb02126286af950074ed4._comment create mode 100644 doc/bugs/Corrupted_drive:_Assistant_seems_consider_files_deleted_and_deletes_them_elsewhere_too/comment_6_593a49669e2fadfb91773f8c84fbb031._comment create mode 100644 doc/bugs/Corrupted_drive:_Assistant_seems_consider_files_deleted_and_deletes_them_elsewhere_too/comment_6_5a348c5f327f16e1192ef6bd7f2880bb._comment create mode 100644 doc/bugs/Could_not_find_module_Data.Default.mdwn create mode 100644 doc/bugs/Could_not_read_from_remote_repository.mdwn create mode 100644 doc/bugs/Could_not_read_from_remote_repository/comment_1_da842a9d146bcd5c7773b58364c25597._comment create mode 100644 doc/bugs/Could_not_read_from_remote_repository/comment_2_82746a0cf989d884cd0fd796db092b3c._comment create mode 100644 doc/bugs/Could_not_read_from_remote_repository/comment_3_95d16045dc238dba19a98808de2eeedf._comment create mode 100644 doc/bugs/Could_not_resolve_dependencies.mdwn create mode 100644 doc/bugs/Crash_trying_to_sync_with_a_repo_over_ssh.mdwn create mode 100644 doc/bugs/Crash_trying_to_sync_with_a_repo_over_ssh/comment_1_9705f295ad8101f3f0ede18e590b56ef._comment create mode 100644 doc/bugs/Crash_trying_to_sync_with_a_repo_over_ssh/comment_2_0d751d81ac618f8d7e3f1dd20c830542._comment create mode 100644 doc/bugs/Crash_when_adding_jabber_account_.mdwn create mode 100644 doc/bugs/Crash_when_adding_jabber_account_/comment_1_2dc61ebcfa8919fb839656999c155c52._comment create mode 100644 doc/bugs/Crash_when_adding_jabber_account_/comment_2_e49af3b8a937d82eda1509b6f67b21d4._comment create mode 100644 doc/bugs/Crash_when_adding_jabber_account_/comment_3_e59f8813bf1a7c4e3c8c120fe82348b9._comment create mode 100644 doc/bugs/Crash_when_adding_jabber_account_/comment_4_716ac138cb69eecd0fb586699b4aeb2a._comment create mode 100644 doc/bugs/Crash_when_adding_jabber_account_/comment_5_9bfd8df548d5866599dfc69fb3aaf94a._comment create mode 100644 doc/bugs/Crash_when_disabling_syncing_in_the_webapp.mdwn create mode 100644 doc/bugs/Crash_when_disabling_syncing_in_the_webapp/comment_1_e25dd80370820782f9c6a877101d8703._comment create mode 100644 doc/bugs/Crash_when_disabling_syncing_in_the_webapp/comment_2_4031c16362137747717e9595cb5c8a15._comment create mode 100644 doc/bugs/Crash_when_disabling_syncing_in_the_webapp/comment_3_0667f39f60bdaba6670f5b8304a8a77c._comment create mode 100644 doc/bugs/Creating_a_WebDAV_repo_under_OpenBSD.mdwn create mode 100644 doc/bugs/Creating_a_box.com_repository_fails.mdwn create mode 100644 doc/bugs/Creating_a_box.com_repository_fails/comment_1_c0b4855b65cb7052daf6538c2ad73e99._comment create mode 100644 doc/bugs/Creating_a_box.com_repository_fails/comment_2_b05a1e7b37989c698353cc6b3fd02d7c._comment create mode 100644 doc/bugs/Creating_a_box.com_repository_fails/comment_3_6c3610fb95676592f17f36e4e1b09bd8._comment create mode 100644 doc/bugs/Creating_a_box.com_repository_fails/comment_4_c9895712e72854e4b5ff7a58e82ae374._comment create mode 100644 doc/bugs/Creating_a_box.com_repository_fails/comment_5_93981afe8162f64ebb9d8c2c6a7ef91e._comment create mode 100644 doc/bugs/Creating_a_box.com_repository_fails/comment_6_752b5725b4596721438098d38af8fb66._comment create mode 100644 doc/bugs/Creating_a_box.com_repository_fails/comment_7_73f71386f8eafbb65f4cc9769021710f._comment create mode 100644 doc/bugs/Creating_a_box.com_repository_fails/comment_8_109e37051beb729834e05997c023b849._comment create mode 100644 doc/bugs/Creating_an_S3_repository_with_an_invalid_name_throws_an_exception.mdwn create mode 100644 doc/bugs/Creating_an_encrypted_S3_does_not_check_for_presence_of_GPG.mdwn create mode 100644 doc/bugs/Creating_second_repository_leads_to_wrong_ip___40__using_git-annex_webapp_--listen__41__.mdwn create mode 100644 doc/bugs/DS__95__Store_not_gitignored.mdwn create mode 100644 doc/bugs/DS__95__Store_not_gitignored/comment_1_b93ac0ea3be82c361ceb4352e742ba39._comment create mode 100644 doc/bugs/DS__95__Store_not_gitignored/comment_2_4136e1f4aba7aa7562dafcf6a213e10c._comment create mode 100644 doc/bugs/Deasn__39__t_clean_up_ssh_keys_after_removing_remote_repo.mdwn create mode 100644 doc/bugs/Deasn__39__t_clean_up_ssh_keys_after_removing_remote_repo/comment_1_88fbf70eae48484988dbb433a437c717._comment create mode 100644 doc/bugs/Detection_assumes_that_shell_is_bash.mdwn create mode 100644 doc/bugs/Difficult_to_troubleshoot_XMPP_login_failures.mdwn create mode 100644 doc/bugs/Difficult_to_troubleshoot_XMPP_login_failures/comment_1_4205bccf515169031e4a9ed8e905262c._comment create mode 100644 doc/bugs/Direct_mode_keeps_re-checksuming_duplicated_files.mdwn create mode 100644 doc/bugs/Direct_mode_keeps_re-checksuming_duplicated_files/comment_1_cb10385a4f046bfe676720ded3409379._comment create mode 100644 doc/bugs/Direct_mode_keeps_re-checksuming_duplicated_files/comment_2_4bcf1a897181e40c9c8969d597a844f0._comment create mode 100644 doc/bugs/Direct_mode_keeps_re-checksuming_duplicated_files/comment_3_6a6d22d218f036c9977072973ed99aa8._comment create mode 100644 doc/bugs/Direct_mode_keeps_re-checksuming_duplicated_files/comment_4_eaa7ffb3a1d9ffd6d89de301bd2cd5b2._comment create mode 100644 doc/bugs/Direct_mode_repositories_end_up_with_unstaged_changes.mdwn create mode 100644 doc/bugs/Direct_mode_repositories_end_up_with_unstaged_changes/comment_1_300a2b246182be3079db20a7e3322261._comment create mode 100644 doc/bugs/Direct_mode_repositories_still_use_symlinks_sometimes.mdwn create mode 100644 doc/bugs/Disconcerting_warning_from_git-annex.mdwn create mode 100644 doc/bugs/Disconcerting_warning_from_git-annex/comment_1_58cebd377bfdf247b6c4fee27a3ba461._comment create mode 100644 doc/bugs/Disconcerting_warning_from_git-annex/comment_2_dc7407044d4c739d05248300c58d8ef2._comment create mode 100644 doc/bugs/Disconcerting_warning_from_git-annex/comment_3_13999207f4ddac2f9c345415f25f7ada._comment create mode 100644 doc/bugs/Discrepancy_between_git_annex_add_and_git_annex_watch.mdwn create mode 100644 doc/bugs/Displayed_copy_speed_is_wrong.mdwn create mode 100644 doc/bugs/Displayed_copy_speed_is_wrong/comment_1_74de3091e8bfd7acd6795e61f39f07c6._comment create mode 100644 doc/bugs/Displayed_copy_speed_is_wrong/comment_2_8b240de1d5ae9229fa2d77d1cc15a552._comment create mode 100644 doc/bugs/During_synchronisation_top-level_folder_suddenly_appear_in_sub-sub-folder.mdwn create mode 100644 doc/bugs/During_synchronisation_top-level_folder_suddenly_appear_in_sub-sub-folder/comment_1_ae4a13ff121d27f78904eee9bf5e716b._comment create mode 100644 doc/bugs/During_synchronisation_top-level_folder_suddenly_appear_in_sub-sub-folder/comment_2_32e360cd7b100ddb9a526e7833fc55e1._comment create mode 100644 doc/bugs/During_synchronisation_top-level_folder_suddenly_appear_in_sub-sub-folder/comment_3_650dc9ede4e16ef668d96840f63dad47._comment create mode 100644 doc/bugs/During_synchronisation_top-level_folder_suddenly_appear_in_sub-sub-folder/comment_4_721cf184fb5a5244ec5c15de3302ebf7._comment create mode 100644 doc/bugs/Empty_folders_don__39__t_get_remove.mdwn create mode 100644 doc/bugs/Empty_folders_don__39__t_get_remove/comment_1_9f41638299c214b2ee13f23ab41349da._comment create mode 100644 doc/bugs/Enable__47__paus_syncing_to_remote_ssh_server_with_multiple_directories.mdwn create mode 100644 doc/bugs/Enable__47__paus_syncing_to_remote_ssh_server_with_multiple_directories/comment_1_e8affeca873c2ef73255f8f77e0ac16f._comment create mode 100644 doc/bugs/Endless_SSH_password_prompts.mdwn create mode 100644 doc/bugs/Endless_SSH_password_prompts/comment_1_b3a32d7a53c30478f409a47f856282ab._comment create mode 100644 doc/bugs/Endless_SSH_password_prompts/comment_2_0a1fc4b4580d8be4c37064e0a16de99b._comment create mode 100644 doc/bugs/Endless_SSH_password_prompts/comment_3_46210f7745b8c7c237fc8b08309390fe._comment create mode 100644 doc/bugs/Endless_SSH_password_prompts/comment_4_bf311301063db06bcfa8ce8d7db54028._comment create mode 100644 doc/bugs/Endless_SSH_password_prompts/comment_5_7490ca530d4e7d49eaa264eb5880dd17._comment create mode 100644 doc/bugs/Endless_SSH_password_prompts/comment_6_57952f91c8d55558cce18b229398f70c._comment create mode 100644 doc/bugs/Endless_SSH_password_prompts/comment_7_6d6a131fda398840cfe00c52ad560ed2._comment create mode 100644 doc/bugs/Error___39__get__39__ting_files_from_rsync_remote__44___versions_3.20120315_and_3.20120430.mdwn create mode 100644 doc/bugs/Error_creating_encrypted_cloud_repository:___34__internal_server_error__34__.mdwn create mode 100644 doc/bugs/Error_creating_encrypted_cloud_repository:___34__internal_server_error__34__/comment_1_9be1b577fa4d5fe9754845073fdf5d32._comment create mode 100644 doc/bugs/Error_creating_encrypted_cloud_repository:___34__internal_server_error__34__/comment_2_0da0d68b646f2b38be6ecf7c0fe13743._comment create mode 100644 doc/bugs/Error_creating_encrypted_cloud_repository:___34__internal_server_error__34__/comment_3_09c56f5574931f2ebe903069f0731160._comment create mode 100644 doc/bugs/Error_creating_encrypted_cloud_repository:___34__internal_server_error__34__/comment_4_0c127396e682ca6ced43aec7deeb0335._comment create mode 100644 doc/bugs/Error_creating_encrypted_cloud_repository:___34__internal_server_error__34__/comment_5_6bc3eadefde4750eec67a55de6651b2d._comment create mode 100644 doc/bugs/Error_creating_encrypted_cloud_repository:___34__internal_server_error__34__/comment_6_263ab9c1483438b1717c8061ac81a2fa._comment create mode 100644 doc/bugs/Error_creating_encrypted_cloud_repository:___34__internal_server_error__34__/comment_7_eccc10990dff37584f8e60cd481a7140._comment create mode 100644 doc/bugs/Error_creating_encrypted_cloud_repository:___34__internal_server_error__34__/comment_8_f897d20cbe5e0f3f58ce1a0bacad3d71._comment create mode 100644 doc/bugs/Error_creating_remote_repository_using_ssh_on_OSX.mdwn create mode 100644 doc/bugs/Error_creating_remote_repository_using_ssh_on_OSX/comment_1_559555934d79ae6be383063abcaae22e._comment create mode 100644 doc/bugs/Error_creating_remote_repository_using_ssh_on_OSX/comment_2_a9f4f9db042ab6f6c15d6954651971b2._comment create mode 100644 doc/bugs/Error_creating_remote_repository_using_ssh_on_OSX/comment_3_55a496d0a0be80ba723b17bf9faa3bc0._comment create mode 100644 doc/bugs/Error_when_dropping___34__hGetLine:_end_of_file__34__.mdwn create mode 100644 doc/bugs/Error_when_dropping___34__hGetLine:_end_of_file__34__/comment_10_8742f7ac27b5f4ad6261d04a174a691c._comment create mode 100644 doc/bugs/Error_when_dropping___34__hGetLine:_end_of_file__34__/comment_11_b8e720340000537de6713c49b7733b2f._comment create mode 100644 doc/bugs/Error_when_dropping___34__hGetLine:_end_of_file__34__/comment_1_489fa3a717519cd5d8b4c1a9d143d8c6._comment create mode 100644 doc/bugs/Error_when_dropping___34__hGetLine:_end_of_file__34__/comment_2_b0796d3b1913e1b6f7b34d75a591be42._comment create mode 100644 doc/bugs/Error_when_dropping___34__hGetLine:_end_of_file__34__/comment_3_d8ca17ccaa5ee48d590736af8e77d88a._comment create mode 100644 doc/bugs/Error_when_dropping___34__hGetLine:_end_of_file__34__/comment_4_aa7a690aaf75d21f52051a31d7fce70e._comment create mode 100644 doc/bugs/Error_when_dropping___34__hGetLine:_end_of_file__34__/comment_5_dc235dc2d024b7f340721bb578630e00._comment create mode 100644 doc/bugs/Error_when_dropping___34__hGetLine:_end_of_file__34__/comment_6_5d1e6ea5b5725c773acc6e288add812c._comment create mode 100644 doc/bugs/Error_when_dropping___34__hGetLine:_end_of_file__34__/comment_7_6389b4f03ebc916358bc6674398d70c4._comment create mode 100644 doc/bugs/Error_when_dropping___34__hGetLine:_end_of_file__34__/comment_8_bcacc9fb3751042968118ebe33802e27._comment create mode 100644 doc/bugs/Error_when_dropping___34__hGetLine:_end_of_file__34__/comment_9_6d4c9f0e133ebd94fc11346df446402e._comment create mode 100644 doc/bugs/Error_when_moving_annexed_file_to_a_.gitignored_location.mdwn create mode 100644 doc/bugs/Error_when_moving_annexed_file_to_a_.gitignored_location/comment_1_b524e70156e8bc1219d5c6741974ad99._comment create mode 100644 doc/bugs/Error_when_moving_annexed_file_to_a_.gitignored_location/comment_2_ff7349c396d1249204d621e71f6a7a52._comment create mode 100644 doc/bugs/Error_when_moving_annexed_file_to_a_.gitignored_location/comment_4_4bc7d4c51faea3fdafc977cb66b7f73a._comment create mode 100644 doc/bugs/Error_while_adding_a_file___34__createSymbolicLink:_already_exists__34__.mdwn create mode 100644 doc/bugs/Every_new_file_gets_symlinked_to_a_git_object.mdwn create mode 100644 doc/bugs/Every_new_file_gets_symlinked_to_a_git_object/comment_1_d4e7ed56b16494a95e6c904c746cc91f._comment create mode 100644 doc/bugs/Every_new_file_gets_symlinked_to_a_git_object/comment_2_656b2a2cc44e9102c86bdd57045549d5._comment create mode 100644 doc/bugs/Failed_to_make_repository___40__calling_nonexistant_shell__41__.mdwn create mode 100644 doc/bugs/Failed_to_make_repository___40__calling_nonexistant_shell__41__/comment_1_fb8a379ed7f4b88bd55245ce5b18042c._comment create mode 100644 doc/bugs/Fails_to_create_remote_repo_if_no_global_email_set.mdwn create mode 100644 doc/bugs/Feature_request:_Flag_to_make_git_annex_add_not_ignore_dotfiles.mdwn create mode 100644 doc/bugs/Feature_request:_Flag_to_make_git_annex_add_not_ignore_dotfiles/comment_1_c258016dd545b0426e75a7c0132154d8._comment create mode 100644 doc/bugs/Feature_request:___34__quvi__34___flag.mdwn create mode 100644 doc/bugs/Feature_request:___34__quvi__34___flag/comment_1_908c38024fd252328566034608c2dec3._comment create mode 100644 doc/bugs/Feature_request:___34__quvi__34___flag/comment_2_4b6822fe91aa865f2ac1297a3daa3fca._comment create mode 100644 doc/bugs/Feature_request:___34__quvi__34___flag/comment_3_c72ef77e76b1c99b5e0c78d0742080e7._comment create mode 100644 doc/bugs/Feature_request:___34__quvi__34___flag/comment_4_6092695d6afb1608447afe6f86e6fb83._comment create mode 100644 doc/bugs/File_that_are_in_two_place_can_be_sequentially_copy_then_dropped.mdwn create mode 100644 doc/bugs/Files_disappear_from_locally_paired_annexes_when_edited.mdwn create mode 100644 doc/bugs/Files_disappear_from_locally_paired_annexes_when_edited/comment_1_bdc97db9dc9954331e4c400baf9e5541._comment create mode 100644 doc/bugs/Finding_an_Unused_file.mdwn create mode 100644 doc/bugs/Fix_for_opening_a_browser_on_a_mac___40__or_xdg-open_on_linux__47__bsd__63____41__.mdwn create mode 100644 doc/bugs/Fix_to_thaoe_remote_to_work_with_latest_tahoe-lafs___40__v._1.10.0__41__.mdwn create mode 100644 doc/bugs/Freshly_initialized_repo_has_staged_change___34__deleted:_uuid.log__34__.mdwn create mode 100644 doc/bugs/Freshly_initialized_repo_has_staged_change___34__deleted:_uuid.log__34__/comment_1_6441dd04adc158df22589c81746108a9._comment create mode 100644 doc/bugs/Freshly_initialized_repo_has_staged_change___34__deleted:_uuid.log__34__/comment_2_d1c5d7642284a375f9c455dbf76efa5c._comment create mode 100644 doc/bugs/Freshly_initialized_repo_has_staged_change___34__deleted:_uuid.log__34__/comment_3_4b863da1c8ba73ad54da20f7d2ec6e5c._comment create mode 100644 doc/bugs/Freshly_initialized_repo_has_staged_change___34__deleted:_uuid.log__34__/comment_4_8e0f489305ce30ad578b9f8526e86416._comment create mode 100644 doc/bugs/Freshly_initialized_repo_has_staged_change___34__deleted:_uuid.log__34__/comment_5_c699034c8e02b2354516414d0ab73aab._comment create mode 100644 doc/bugs/Freshly_initialized_repo_has_staged_change___34__deleted:_uuid.log__34__/comment_6_786cb7e643811dfd2496ceeff8f34f44._comment create mode 100644 doc/bugs/GIT_DIR_support_incomplete.mdwn create mode 100644 doc/bugs/GPG_can__39__t_handle_some_files.mdwn create mode 100644 doc/bugs/GPG_can__39__t_handle_some_files/comment_1_4388c971e991dbc0326e69c49994df1e._comment create mode 100644 doc/bugs/GPG_issues_with_pubkey___40__Again__63____41__.mdwn create mode 100644 doc/bugs/GPG_issues_with_pubkey___40__Again__63____41__/comment_1_ac3631024abf372e6f578a472b86d792._comment create mode 100644 doc/bugs/GPG_issues_with_pubkey___40__Again__63____41__/comment_3_980c149d7f9040f5e71e662d95a5fbf1._comment create mode 100644 doc/bugs/GPG_issues_with_pubkey___40__Again__63____41__/comment_3_c279f5cc3f96910287e72bf59120d02b._comment create mode 100644 doc/bugs/GPG_issues_with_pubkey___40__Again__63____41__/comment_4_ec6abe7074f767f866e9618d65a4a900._comment create mode 100644 doc/bugs/GPG_issues_with_pubkey___40__Again__63____41__/comment_5_44f80d89360a5620f919f8bc7c1c2879._comment create mode 100644 doc/bugs/GPG_passphrase_repeated_prompt.mdwn create mode 100644 doc/bugs/GPG_passphrase_repeated_prompt/comment_1_6ef1c9725befc84ad57bce196ef630ef._comment create mode 100644 doc/bugs/GPG_problem_on_Mac.mdwn create mode 100644 doc/bugs/GPG_problem_on_Mac/comment_1_9ccfa12e7a9569a7ae9a3b819917c275._comment create mode 100644 doc/bugs/GPG_problem_on_Mac/comment_2_a5e07131e2bc1a646c8439fc2506128b._comment create mode 100644 doc/bugs/GPG_problem_on_Mac/comment_3_388238360f2423f84881e904443efb86._comment create mode 100644 doc/bugs/Git_annex_add_._dies_when_you_add_too_much.mdwn create mode 100644 doc/bugs/Git_annex_add_._dies_when_you_add_too_much/comment_1_a99b96c38bba3af54e0152cc3730c16c._comment create mode 100644 doc/bugs/Git_annex_add_fails_on_read-only_files.mdwn create mode 100644 doc/bugs/Git_annex_add_fails_on_read-only_files/comment_1_d31018e8bf31d729ee9fee43a0a07934._comment create mode 100644 doc/bugs/Git_annex_add_fails_on_read-only_files/comment_2_e38e7048749f890169cd0be602be6ee7._comment create mode 100644 doc/bugs/Git_annex_hangs_after_git_annex_add_on_vfat__47__sdcard__47__android.mdwn create mode 100644 doc/bugs/Git_annex_hangs_after_git_annex_add_on_vfat__47__sdcard__47__android/comment_1_2fc435d1c741f9fc422401f682e7c8b7._comment create mode 100644 doc/bugs/Git_annex_hangs_after_git_annex_add_on_vfat__47__sdcard__47__android/comment_2_b73fb99a75aef912f8286626c5bde66d._comment create mode 100644 doc/bugs/Git_annex_hangs_after_git_annex_add_on_vfat__47__sdcard__47__android/comment_3_b7115f2c658439ff59a029f500697fc1._comment create mode 100644 doc/bugs/Git_annex_hangs_after_git_annex_add_on_vfat__47__sdcard__47__android/comment_4_67de7a56ddb06fc0e31cc011d281c633._comment create mode 100644 doc/bugs/Git_annex_hangs_after_git_annex_add_on_vfat__47__sdcard__47__android/comment_5_58fdb2a00f1737746cdbc804f831a0e7._comment create mode 100644 doc/bugs/Git_annexed_files_symlink_are_wrong_when_submodule_is_not_in_the_same_path.mdwn create mode 100644 doc/bugs/Git_annexed_files_symlink_are_wrong_when_submodule_is_not_in_the_same_path/comment_1_b3197993dbdfaf2db5e4651ac54a896e._comment create mode 100644 doc/bugs/Git_annexed_files_symlink_are_wrong_when_submodule_is_not_in_the_same_path/comment_2_1fbbd02e61ef524597dafd69460b00b4._comment create mode 100644 doc/bugs/Glacier_remote_doesn__39__t_pass_the_--region_parameter_to_glacier-cli_on_hasKey.mdwn create mode 100644 doc/bugs/Glacier_remote_uploads_duplicates.mdwn create mode 100644 doc/bugs/Glacier_remote_uploads_duplicates/comment_1_8aef582a0f0d0c7f764b425fc45de3b4._comment create mode 100644 doc/bugs/Glacier_remote_uploads_duplicates/comment_2_150ce8b7c4424a83c4b1760da5a89d27._comment create mode 100644 doc/bugs/Glacier_remote_uploads_duplicates/comment_3_718af5048c5f894eee134547a2e0a644._comment create mode 100644 doc/bugs/Glacier_remote_uploads_duplicates/comment_4_184ad0f8c2847309632f8c18b918cd42._comment create mode 100644 doc/bugs/Glacier_remote_uploads_duplicates/comment_5_6980a912d3582c2f2511e4827e9e76b3._comment create mode 100644 doc/bugs/Glacier_remote_uploads_duplicates/comment_6_feea067d6856af2840604782b29af86a._comment create mode 100644 doc/bugs/Glacier_remote_uploads_duplicates/comment_7_e96187bad3dae2f5f95118f6df87a1ec._comment create mode 100644 doc/bugs/Glacier_remote_uploads_duplicates/comment_8_34216b514a6fca788cfacb8579ce5311._comment create mode 100644 doc/bugs/Handling_of_files_inside_and_outside_archive_directory_at_the_same_time.mdwn create mode 100644 doc/bugs/Handling_of_files_inside_and_outside_archive_directory_at_the_same_time/comment_1_e8bb3d6a2318402b985caed08282d473._comment create mode 100644 doc/bugs/Handling_of_files_inside_and_outside_archive_directory_at_the_same_time/comment_2_ead9fa75a12ef36be9a92637b144e74f._comment create mode 100644 doc/bugs/Hanging_on_install_on_Mountain_lion.mdwn create mode 100644 doc/bugs/Hanging_on_install_on_Mountain_lion/comment_10_f57ff027b19ca16e2ecf1fc6aee9ef4a._comment create mode 100644 doc/bugs/Hanging_on_install_on_Mountain_lion/comment_11_2ff78d2090d0fd3418ab50b27c6028ce._comment create mode 100644 doc/bugs/Hanging_on_install_on_Mountain_lion/comment_1_523d3c0c71f80536850a001b90fd0e9e._comment create mode 100644 doc/bugs/Hanging_on_install_on_Mountain_lion/comment_2_6c360c64093b016c2150206dc3ad1709._comment create mode 100644 doc/bugs/Hanging_on_install_on_Mountain_lion/comment_3_7b77fd9b7dc236c345f2f6149c8138ee._comment create mode 100644 doc/bugs/Hanging_on_install_on_Mountain_lion/comment_5_08289596445d7588e43d35490fbfe5f4._comment create mode 100644 doc/bugs/Hanging_on_install_on_Mountain_lion/comment_5_2a336fe7b8aed07cbdaa868bd34078f9._comment create mode 100644 doc/bugs/Hanging_on_install_on_Mountain_lion/comment_6_ea7a40c3b6748738421aed00a6f7ca10._comment create mode 100644 doc/bugs/Hanging_on_install_on_Mountain_lion/comment_7_00962da9288976f8a48d0cbc08e1d9e2._comment create mode 100644 doc/bugs/Hanging_on_install_on_Mountain_lion/comment_8_5d53d23e529f33f6e7deb10643831613._comment create mode 100644 doc/bugs/Hanging_on_install_on_Mountain_lion/comment_9_f00c8761e3184975b6645c0c3e241365._comment create mode 100644 doc/bugs/Hangs_on_creating_repository_when_using_--listen.mdwn create mode 100644 doc/bugs/Hangs_on_creating_repository_when_using_--listen/comment_1_8cbe786de8cf8b407418149b9c811aab._comment create mode 100644 doc/bugs/Hangs_on_creating_repository_when_using_--listen/comment_2_dc128eeddeaaf3f84e71aca0fb7d341f._comment create mode 100644 doc/bugs/Hard_links_not_synced_in_direct_mode.mdwn create mode 100644 doc/bugs/Hard_links_not_synced_in_direct_mode/comment_1_aaa781664ae0c62c4f6530cb075ed367._comment create mode 100644 doc/bugs/Hard_links_not_synced_in_direct_mode/comment_2_213aa10909d1fd0f20ed078a7ed93e79._comment create mode 100644 doc/bugs/Hard_links_not_synced_in_direct_mode/comment_3_e6b783d9aaae20c0d35e9888d878716a._comment create mode 100644 doc/bugs/Hard_links_not_synced_in_direct_mode/comment_4_b008ae7b1cf8685d92c9a87a7609de1e._comment create mode 100644 doc/bugs/Hard_links_not_synced_in_direct_mode/comment_5_949c891209713a2c0a5e66af11ed4c79._comment create mode 100644 doc/bugs/How_can_I_solve_a_non-fast-forward_push_without_using_the_assistant__63__.mdwn create mode 100644 doc/bugs/How_can_I_solve_a_non-fast-forward_push_without_using_the_assistant__63__/comment_1_0ddcbe0ccecdec1012964dfa436a3eee._comment create mode 100644 doc/bugs/How_can_I_solve_a_non-fast-forward_push_without_using_the_assistant__63__/comment_2_5765b849bcf045ead9f007bd50b2cfbd._comment create mode 100644 doc/bugs/Huge_annex_out_of_memory_on_switch_to_indirect_mode_and_status.mdwn create mode 100644 doc/bugs/Huge_annex_out_of_memory_on_switch_to_indirect_mode_and_status/comment_1_94c678e1348280a96f11d7456c240d3a._comment create mode 100644 doc/bugs/Huge_annex_out_of_memory_on_switch_to_indirect_mode_and_status/comment_2_09450d58df2373174a1f0d90b08e9eb3._comment create mode 100644 doc/bugs/Huge_annex_out_of_memory_on_switch_to_indirect_mode_and_status/comment_3_a07105226ef3488b97731db004651976._comment create mode 100644 doc/bugs/Impossible_to_enable_an_existing_gcrypt_repo_in_the_webapp.mdwn create mode 100644 doc/bugs/Impossible_to_enable_an_existing_gcrypt_repo_in_the_webapp/comment_1_17814787e333d15da3ab4e57c7d31d4b._comment create mode 100644 doc/bugs/In_the_assistant__44___add_some_clarifications_near___34__Add_another_local_repository__34___for_the_case_of_adding_an_existing_repository.mdwn create mode 100644 doc/bugs/Incorrect_merge__44___direct_repos___40__2__41__.mdwn create mode 100644 doc/bugs/Incorrect_merge__44___direct_repos___40__2__41__/comment_1_15c354c4841d364e78882d2b46a0a764._comment create mode 100644 doc/bugs/Incorrect_merge__44___direct_repos___40__2__41__/comment_2_8bc496226a977dbeeb1ce3f06122f1c2._comment create mode 100644 doc/bugs/Incorrect_merge___40__a_special_case__41__.mdwn create mode 100644 doc/bugs/Incorrect_merge___40__a_special_case__41__/comment_1_c80418d76b501c688e3a9fb4831520fd._comment create mode 100644 doc/bugs/Incorrect_merge___40__a_special_case__41__/comment_2_8b2a188696f46819f6e3f0e9660362d2._comment create mode 100644 doc/bugs/Incorrect_merge___40__a_special_case__41__/comment_3_8cdbb1fda506b9e53a0e9ab88b2569c1._comment create mode 100644 doc/bugs/Incorrect_merge___40__a_special_case__41__/comment_4_9d74e2854a5d77f0f793f56fa0cff9e2._comment create mode 100644 doc/bugs/Incorrect_symlink_path_in_simple_submodule_use_case.mdwn create mode 100644 doc/bugs/Incorrect_symlink_path_in_simple_submodule_use_case/comment_1_73b4dc5f90c8ba5634caee35cd31af1a._comment create mode 100644 doc/bugs/Incorrect_symlink_path_in_simple_submodule_use_case/comment_2_e84b93062c82453f18308a82ee270585._comment create mode 100644 doc/bugs/Incorrect_version_of_Git_Annex___40__1.0.52__41___as_seen_by_Android.mdwn create mode 100644 doc/bugs/Incorrect_version_on_64_Standalone_Build.mdwn create mode 100644 doc/bugs/Incorrect_version_on_64_Standalone_Build/comment_1_1964e4cad33a9f98b2eedbf095e899ff._comment create mode 100644 doc/bugs/Install_of_git-annex-3.20121112_fails.mdwn create mode 100644 doc/bugs/Install_of_git-annex-3.20121112_fails/comment_1_80fc80151d4390bd8a4332f30723962e._comment create mode 100644 doc/bugs/Install_of_git-annex-3.20121112_fails/comment_2_2613320a41a74dc757a3277c8c328bd0._comment create mode 100644 doc/bugs/Install_of_git-annex-3.20121112_fails/comment_3_c364764d0c56e8dc3cac276905d99841._comment create mode 100644 doc/bugs/Install_of_git-annex-3.20121112_fails/comment_4_f1057340dfa978071d3bbc9e2af1e612._comment create mode 100644 doc/bugs/Install_of_git-annex-3.20121112_fails/comment_5_9007b1a3abd647945604968db19cb841._comment create mode 100644 doc/bugs/Install_of_git-annex-3.20121112_fails/comment_6_0bb3ac5375f29ce9d3d0be93879267e3._comment create mode 100644 doc/bugs/Install_of_git-annex-3.20121112_fails/comment_7_ae4443b8cd069080d1f77fca16aa8b04._comment create mode 100644 doc/bugs/Internal_Server_Error:_Unknown_UUID.mdwn create mode 100644 doc/bugs/Internal_Server_Error:_Unknown_UUID/comment_1_f42f703a5d267557abf5e932f0890d4a._comment create mode 100644 doc/bugs/Internal_Server_Error:_Unknown_UUID/comment_2_eb1999f99c5babf3fcb1ff5d72ea6db6._comment create mode 100644 doc/bugs/Internal_Server_Error:_Unknown_UUID/comment_3_bda72b0d615843d18d6ef21f833432a8._comment create mode 100644 doc/bugs/Internal_Server_Error:_Unknown_UUID/comment_4_651440cda405ad40a04479f5d87d581e._comment create mode 100644 doc/bugs/Internal_Server_Error:_Unknown_UUID/comment_5_21fa189b631c246ac5df16a49c3c0178._comment create mode 100644 doc/bugs/Internal_Server_Error:_Unknown_UUID/comment_6_1f712693d2ded5abceb869fdb7f47ef3._comment create mode 100644 doc/bugs/Internal_Server_Error:_Unknown_UUID/comment_7_7a5ead0ce5c9429d4723ccce4f6a6d6c._comment create mode 100644 doc/bugs/Internal_Server_Error:_Unknown_UUID/comment_8_a4683fd73ae452a9cd7f61d9930f6266._comment create mode 100644 doc/bugs/Internal_Server_Error:_Unknown_UUID/comment_9_ced3516c3e7161e4d7e599232f62a511._comment create mode 100644 doc/bugs/Internal_Server_Error_unknown_UUID__59___cannot_modify.mdwn create mode 100644 doc/bugs/Internal_Server_Error_when_adding_an_uncrypted_box.com_repo_after_deleted_an_encrypted_one..mdwn create mode 100644 doc/bugs/Internal_server_error_adding_USB_drive_on_OS_X.mdwn create mode 100644 doc/bugs/Internal_server_error_adding_USB_drive_on_OS_X/comment_1_b2ef077d87a9da624f20649c21401b5b._comment create mode 100644 doc/bugs/Internal_server_error_adding_USB_drive_on_OS_X/comment_2_ef849e25b0264808bff800d9d3836119._comment create mode 100644 doc/bugs/Internal_server_error_adding_USB_drive_on_OS_X/comment_3_ae3cbd0eb69cbeb9b349e0060d056d43._comment create mode 100644 doc/bugs/Internal_server_error_adding_USB_drive_on_OS_X/comment_4_0ff2897805928b14829b7b369a3aed91._comment create mode 100644 doc/bugs/Internal_server_error_adding_USB_drive_on_OS_X/comment_5_414a45573aeb5201f4d80433955669d5._comment create mode 100644 doc/bugs/Interrupted_switch_to_direct_mode_can_cause_all_following_switches_to_fail.mdwn create mode 100644 doc/bugs/Is_there_any_way_to_rate_limit_uploads_to_an_S3_backend__63__.mdwn create mode 100644 doc/bugs/Is_there_any_way_to_rate_limit_uploads_to_an_S3_backend__63__/comment_1_ef97e735ce308f7bcc03f5d9fda588bf._comment create mode 100644 doc/bugs/Is_there_any_way_to_rate_limit_uploads_to_an_S3_backend__63__/comment_2_539b89de8743e435386b86119d1e982f._comment create mode 100644 doc/bugs/Issue_on_OSX_with_some_system_limits.mdwn create mode 100644 doc/bugs/Issue_on_OSX_with_some_system_limits/comment_1_5fc1eedb5231edc37c87a2d9b91313b9._comment create mode 100644 doc/bugs/Issue_on_OSX_with_some_system_limits/comment_2_b14e697c211843163285aaa8de5bf4c6._comment create mode 100644 doc/bugs/Issue_on_OSX_with_some_system_limits/comment_3_18ddf8b5934dd6fb1676cd6adc7d103b._comment create mode 100644 doc/bugs/Issue_on_OSX_with_some_system_limits/comment_4_c25a8eb369e546f65e1a72d89f43066f._comment create mode 100644 doc/bugs/Issue_on_OSX_with_some_system_limits/comment_5_6407a3e7aa0316cba2994bfef0e3c633._comment create mode 100644 doc/bugs/Issue_on_OSX_with_some_system_limits/comment_6_f01887695e8b8386e125464c6d401565._comment create mode 100644 doc/bugs/Issue_on_OSX_with_some_system_limits/comment_7_c7776d5b2d073e0d2ae36515185c25aa._comment create mode 100644 doc/bugs/It_is_very_easy_to_turn_git-annex_into_a_zombie.mdwn create mode 100644 doc/bugs/It_is_very_easy_to_turn_git-annex_into_a_zombie/comment_1_d5fba6c061fb21795021ea83070dbfa2._comment create mode 100644 doc/bugs/It_is_very_easy_to_turn_git-annex_into_a_zombie/comment_2_12cba707239018989e8d5b6f456fa754._comment create mode 100644 doc/bugs/JSON_output_broken_with___34__git_annex_sync__34__.mdwn create mode 100644 doc/bugs/JSON_output_broken_with___34__git_annex_sync__34__/comment_1_380a49b3c132f9f529729a1cb5a69621._comment create mode 100644 doc/bugs/JSON_output_broken_with___34__git_annex_sync__34__/comment_2_282f5f89fb4a46e1fad0980e0b2994a0._comment create mode 100644 doc/bugs/JSON_output_broken_with___34__git_annex_sync__34__/comment_3_7ff98958146b7f6396226bdd878ec86e._comment create mode 100644 doc/bugs/JSON_output_broken_with___34__git_annex_sync__34__/comment_4_f9e460a09e7e5f53c16c20ded2649201._comment create mode 100644 doc/bugs/Jabber__47__xmpp_not_supported_on_Debian_Wheezy_backport.mdwn create mode 100644 doc/bugs/Killing_the_assistant_daemon_leaves_ssh_mux_sessions_behind.mdwn create mode 100644 doc/bugs/Killing_the_assistant_daemon_leaves_ssh_mux_sessions_behind/comment_1_17879b98a5e79ace03b543064751e46e._comment create mode 100644 doc/bugs/Killing_the_assistant_daemon_leaves_ssh_mux_sessions_behind/comment_2_2dc877e281750004b16619ea7b931160._comment create mode 100644 doc/bugs/Large_unannex_operations_result_in_stale_symlinks_and_data_loss.mdwn create mode 100644 doc/bugs/Large_unannex_operations_result_in_stale_symlinks_and_data_loss/comment_10_52364dc5b1b43b51748453d1896e35c6._comment create mode 100644 doc/bugs/Large_unannex_operations_result_in_stale_symlinks_and_data_loss/comment_11_99b4db1841f8630a9c5efd08910e87a3._comment create mode 100644 doc/bugs/Large_unannex_operations_result_in_stale_symlinks_and_data_loss/comment_1_fbb410a54bb0bd82d0953ef58a88600e._comment create mode 100644 doc/bugs/Large_unannex_operations_result_in_stale_symlinks_and_data_loss/comment_2_8007c9ba42a951a4426255ec3c37d961._comment create mode 100644 doc/bugs/Large_unannex_operations_result_in_stale_symlinks_and_data_loss/comment_3_73ecd4cb8ee58a8dfe7cab0e893dbe5b._comment create mode 100644 doc/bugs/Large_unannex_operations_result_in_stale_symlinks_and_data_loss/comment_4_e8a10886a564f35414c30a04335d9d32._comment create mode 100644 doc/bugs/Large_unannex_operations_result_in_stale_symlinks_and_data_loss/comment_5_6a318edfe45c80343d017dc7b4837acb._comment create mode 100644 doc/bugs/Large_unannex_operations_result_in_stale_symlinks_and_data_loss/comment_6_f7a1d9f9d40aff531d873a95d2196edd._comment create mode 100644 doc/bugs/Large_unannex_operations_result_in_stale_symlinks_and_data_loss/comment_7_1724ffdf986301bf37ef7a6d16b6ea8a._comment create mode 100644 doc/bugs/Large_unannex_operations_result_in_stale_symlinks_and_data_loss/comment_8_5470e2f50e6506139ecb1b342371c509._comment create mode 100644 doc/bugs/Large_unannex_operations_result_in_stale_symlinks_and_data_loss/comment_9_e53148a9efa061a825f668a9492182f7._comment create mode 100644 doc/bugs/Last_two_versions_didn__39__t_show_up_on_hackage.mdwn create mode 100644 doc/bugs/Last_two_versions_didn__39__t_show_up_on_hackage/comment_1_74b56dea2100450e322e726bb55bb310._comment create mode 100644 doc/bugs/Latest_64_bit_standalone_Linux_build_broken.mdwn create mode 100644 doc/bugs/Latest_64_bit_standalone_Linux_build_broken/comment_1_428eba88016d50a6631fffa906815767._comment create mode 100644 doc/bugs/Latest_64_bit_standalone_Linux_build_broken/comment_2_87f70b3eececca8a5b7946cff53e0a2f._comment create mode 100644 doc/bugs/Latest_64_bit_standalone_Linux_build_broken/comment_3_manually_added._comment create mode 100644 doc/bugs/Latest_64_bit_standalone_Linux_build_broken/comment_4_43947607472193e2199b98ee2192af30._comment create mode 100644 doc/bugs/Linux_stand_alone_build_20130723_breaks_support_for_glibc_2.13_debian_stable.mdwn create mode 100644 doc/bugs/Linux_stand_alone_build_20130723_breaks_support_for_glibc_2.13_debian_stable/comment_1_dc7f726a0b60f64392cbbd1b4317bab5._comment create mode 100644 doc/bugs/Linux_stand_alone_build_20130723_breaks_support_for_glibc_2.13_debian_stable/comment_2_4a0198d714bd3b52ba9baa68dc45f535._comment create mode 100644 doc/bugs/Local_files_not_found.mdwn create mode 100644 doc/bugs/Local_files_not_found/comment_1_5e1fcc0597594fa493ffa28aa32e1df8._comment create mode 100644 doc/bugs/Local_network___40__ssh__41___fails_to_pair__47__sync.mdwn create mode 100644 doc/bugs/Local_network___40__ssh__41___fails_to_pair__47__sync/comment_1_bab9cd5bdcffec3c48b9e8657cd9bbf7._comment create mode 100644 doc/bugs/Local_network___40__ssh__41___fails_to_pair__47__sync/comment_2_104898dce3c67c082a9f2b36e2f45ff8._comment create mode 100644 doc/bugs/Local_pairing_fails:_PairListener_crashed.mdwn create mode 100644 doc/bugs/Local_pairing_fails:_PairListener_crashed/comment_1_d9c5d2147cf6d8d8477eb13b72081d46._comment create mode 100644 doc/bugs/Local_pairing_fails:_PairListener_crashed/comment_2_60a21105145ac228f486bc4beb2ea54d._comment create mode 100644 doc/bugs/Local_pairing_fails:_received_PairMsg_loop.mdwn create mode 100644 doc/bugs/Local_pairing_fails:_received_PairMsg_loop/comment_1_b8c485bafd98be8c21595597af361255._comment create mode 100644 doc/bugs/Local_pairing_fails:_received_PairMsg_loop/comment_2_bc63489334f44a423645021415ffe196._comment create mode 100644 doc/bugs/Local_pairing_fails:_received_PairMsg_loop/comment_3_6345b174d04b6613c2c55a6ec9e50c21._comment create mode 100644 doc/bugs/Local_pairing_fails:_received_PairMsg_loop/comment_4_f39ec6c3d5a016b3c5260162c0b42177._comment create mode 100644 doc/bugs/Local_pairing_fails:_received_PairMsg_loop/comment_5_ca0c5ef6e6a6d2c4b64430ac68370b6a._comment create mode 100644 doc/bugs/Log_rotation_loses_large_logs.mdwn create mode 100644 doc/bugs/Lost_S3_Remote.mdwn create mode 100644 doc/bugs/Lost_S3_Remote/comment_1_6e80e6db6671581d471fc9a54181c04c._comment create mode 100644 doc/bugs/Lost_S3_Remote/comment_2_c99c65882a3924f4890e500f9492b442._comment create mode 100644 doc/bugs/Lost_S3_Remote/comment_3_1e434d5a20a692cd9dc7f6f8f20f30dd._comment create mode 100644 doc/bugs/Mac_OS_10.9_GPG_erro_when_creating_USB_repo___40__solved__41__.mdwn create mode 100644 doc/bugs/Mac_OS_10.9_GPG_erro_when_creating_USB_repo___40__solved__41__/comment_1_0b4dcedc58e5071733e1239490aed2ea._comment create mode 100644 doc/bugs/Mac_OS_10.9_GPG_erro_when_creating_USB_repo___40__solved__41__/comment_2_1cb1ef0292a3357874b461a77c13373e._comment create mode 100644 doc/bugs/Mac_OS_10.9_GPG_erro_when_creating_USB_repo___40__solved__41__/comment_3_e5ec1e3ab304d738e3b0847287a47af4._comment create mode 100644 doc/bugs/Mac_OS_10.9_GPG_error_adding_S3_repo___40__solved__41__.mdwn create mode 100644 doc/bugs/Mac_OS_10.9_GPG_error_adding_S3_repo___40__solved__41__/comment_1_d95accb43bd18cc9acbbf1d4069f86b3._comment create mode 100644 doc/bugs/Mac_OS_10.9_GPG_error_adding_S3_repo___40__solved__41__/comment_2_452a3c524974832f0742efb00df4d576._comment create mode 100644 doc/bugs/Mac_OS_10.9_GPG_error_adding_S3_repo___40__solved__41__/comment_3_f8f6d1e0065e5ba56cd405b1c021ca09._comment create mode 100644 doc/bugs/Mac_OS_10.9_GPG_error_adding_S3_repo___40__solved__41__/comment_4_b524649cee751532d20a4894d71c5cf3._comment create mode 100644 doc/bugs/Mac_OS_10.9_GPG_error_adding_S3_repo___40__solved__41__/comment_5_8312ba868ef616ec00563446c9c3464f._comment create mode 100644 doc/bugs/Mac_OS_10.9_GPG_error_adding_S3_repo___40__solved__41__/comment_6_1af75c691d27c97397f1901f7c2483b0._comment create mode 100644 doc/bugs/Mac_OS_10.9_GPG_error_adding_S3_repo___40__solved__41__/comment_7_e519df252875de87c4ef5b727f033bdf._comment create mode 100644 doc/bugs/Mac_OS_10.9_GPG_error_adding_S3_repo___40__solved__41__/comment_8_4bb959e2659991cd392853e8beacf708._comment create mode 100644 doc/bugs/Mac_OS_X_Build_doesn__39__t_include_webapp.mdwn create mode 100644 doc/bugs/Mac_OS_X_Build_doesn__39__t_include_webapp/comment_1_b918a741f2397b6588e7a9f1feca7e66._comment create mode 100644 doc/bugs/Mac_OS_git_version_still_too_old_for_.gitignore__63__.mdwn create mode 100644 doc/bugs/Mac_OS_git_version_still_too_old_for_.gitignore__63__/comment_1_1768ece63499c643c75085773b6d4c18._comment create mode 100644 doc/bugs/Mac_OS_git_version_still_too_old_for_.gitignore__63__/comment_2_888fb193072cf05a34943db072eb7a3b._comment create mode 100644 doc/bugs/Mac_OS_git_version_still_too_old_for_.gitignore__63__/comment_3_f199ac6ae2448949ef0779177cf0ef58._comment create mode 100644 doc/bugs/Mac_OS_git_version_too_old_to_honour_.gitignore.mdwn create mode 100644 doc/bugs/Makefile_is_missing_dependancies.mdwn create mode 100644 doc/bugs/Makefile_is_missing_dependancies/comment_1_5a3da5f79c8563c7a450aa29728abe7c._comment create mode 100644 doc/bugs/Makefile_is_missing_dependancies/comment_2_416f12dbd0c2b841fac8164645b81df5._comment create mode 100644 doc/bugs/Makefile_is_missing_dependancies/comment_3_c38b6f4abc9b9ad413c3b83ca04386c3._comment create mode 100644 doc/bugs/Makefile_is_missing_dependancies/comment_4_cc13873175edf191047282700315beee._comment create mode 100644 doc/bugs/Makefile_is_missing_dependancies/comment_5_0a1c52e2c96d19b9c3eb7e99b8c2434f._comment create mode 100644 doc/bugs/Makefile_is_missing_dependancies/comment_6_24119fc5d5963ce9dd669f7dcf006859._comment create mode 100644 doc/bugs/Makefile_is_missing_dependancies/comment_7_96fd4725df4b54e670077a18d3ac4943._comment create mode 100644 doc/bugs/Makefile_is_missing_dependancies/comment_8_a3555e3286cdc2bfeb9cde0ff727ba74._comment create mode 100644 doc/bugs/Manual_content_mode_isn__39__t_manual.mdwn create mode 100644 doc/bugs/Manual_mode_weirdness.mdwn create mode 100644 doc/bugs/Manual_mode_weirdness/comment_1_f8ab3bac9e9a6768e5fd5a052f0d920f._comment create mode 100644 doc/bugs/Manual_mode_weirdness/comment_2_e810daa488fad32ca8bdaae620051da8._comment create mode 100644 doc/bugs/Matching_oddity_in_SafeCommand.hs.mdwn create mode 100644 doc/bugs/Matching_oddity_in_SafeCommand.hs/comment_1_1a51630c0791547a7e0b68eea5d81e4c._comment create mode 100644 doc/bugs/Missing_dependancy_in_commit_6cecc26206c4a539999b04664136c6f785211a41.mdwn create mode 100644 doc/bugs/Missing_repo_uuid_after_local_pairing_with_older_annex.mdwn create mode 100644 doc/bugs/Missing_repo_uuid_after_local_pairing_with_older_annex/comment_1_8229df64a872bee7590f75eb78f78c4a._comment create mode 100644 doc/bugs/Missing_repo_uuid_after_local_pairing_with_older_annex/comment_2_f37be896396915b1c85cff8811dceb4a._comment create mode 100644 doc/bugs/Missing_repo_uuid_after_local_pairing_with_older_annex/comment_3_df7fc1078059538a76f384a40541e91f._comment create mode 100644 doc/bugs/Missing_repo_uuid_after_local_pairing_with_older_annex/comment_4_70c444c61f41df2f59294c10f94f0c09._comment create mode 100644 doc/bugs/More_build_oddities_under_OpenBSD.mdwn create mode 100644 doc/bugs/More_build_oddities_under_OpenBSD/comment_10_09297f99f3c1c081738ca4ab32808fde._comment create mode 100644 doc/bugs/More_build_oddities_under_OpenBSD/comment_11_1407efc78b92a3c6156154f54e4a14e2._comment create mode 100644 doc/bugs/More_build_oddities_under_OpenBSD/comment_12_fdec033e37652c51fbcd74438586d285._comment create mode 100644 doc/bugs/More_build_oddities_under_OpenBSD/comment_13_ed3716baf787ca17d227ce2e327a1959._comment create mode 100644 doc/bugs/More_build_oddities_under_OpenBSD/comment_14_cf5f92e5cdfc738e7f6178c1d7a73ceb._comment create mode 100644 doc/bugs/More_build_oddities_under_OpenBSD/comment_15_ad4b7191c9b8f67def33b26a1d762a5d._comment create mode 100644 doc/bugs/More_build_oddities_under_OpenBSD/comment_16_2e765b5286d816bea00880a17a20cbfb._comment create mode 100644 doc/bugs/More_build_oddities_under_OpenBSD/comment_17_ded9011dcdbe4de05189a0e8d040f045._comment create mode 100644 doc/bugs/More_build_oddities_under_OpenBSD/comment_18_f7a85b46bf7afaaf431d6771219c66b0._comment create mode 100644 doc/bugs/More_build_oddities_under_OpenBSD/comment_19_217be2000e423e844241d405ba9f64c8._comment create mode 100644 doc/bugs/More_build_oddities_under_OpenBSD/comment_1_4ffea64907656ff2ec65ff4450aadda7._comment create mode 100644 doc/bugs/More_build_oddities_under_OpenBSD/comment_20_df72e5698ba2bf2eb4fa39c5b2c5be83._comment create mode 100644 doc/bugs/More_build_oddities_under_OpenBSD/comment_2_4fb96984757b3d37a1a5ebce664aa8fe._comment create mode 100644 doc/bugs/More_build_oddities_under_OpenBSD/comment_3_c5fdf29499a02be83850d1238fc8ce23._comment create mode 100644 doc/bugs/More_build_oddities_under_OpenBSD/comment_4_d42106128c3dac2dd7761a82cc03912f._comment create mode 100644 doc/bugs/More_build_oddities_under_OpenBSD/comment_5_71166beb796f22dcee065a167cd5e0ed._comment create mode 100644 doc/bugs/More_build_oddities_under_OpenBSD/comment_6_65913a2de8bbe981beaa66c58d2429b5._comment create mode 100644 doc/bugs/More_build_oddities_under_OpenBSD/comment_7_8dd46cec230125d1410d8e6824aeddf2._comment create mode 100644 doc/bugs/More_build_oddities_under_OpenBSD/comment_8_275d3e62cb5667a2d6ddd90db7a40bff._comment create mode 100644 doc/bugs/More_build_oddities_under_OpenBSD/comment_9_ec6a1eb6c7b264c23ec4bbd45465d7d8._comment create mode 100644 doc/bugs/More_sync__39__ing_weirdness_with_the_assistant_branch_on_OSX.mdwn create mode 100644 doc/bugs/More_sync__39__ing_weirdness_with_the_assistant_branch_on_OSX/comment_1_377525e70640751e1ead445aeed15efa._comment create mode 100644 doc/bugs/Most_recent_git-annex_will_not_build_on_OpenIndiana.mdwn create mode 100644 doc/bugs/Most_recent_git-annex_will_not_build_on_OpenIndiana/comment_1_f3c336ecfee51e074ea3a9fc95301de5._comment create mode 100644 doc/bugs/Most_recent_git-annex_will_not_build_on_OpenIndiana/comment_2_102c0e998934e84deca92fd1c90145fa._comment create mode 100644 doc/bugs/Most_recent_git-annex_will_not_build_on_OpenIndiana/comment_3_1449dd796ce9f2209f085d4b017a5f33._comment create mode 100644 doc/bugs/Most_recent_git-annex_will_not_build_on_OpenIndiana/comment_4_c4aa8a4379b2c056ca9b7afcff412bbc._comment create mode 100644 doc/bugs/Most_recent_git-annex_will_not_build_on_OpenIndiana/comment_5_6ca4dd2ad51182edf7198f38b336b9b6._comment create mode 100644 doc/bugs/Name_scheme_does_not_follow_git__39__s_rules.mdwn create mode 100644 doc/bugs/Need_to_manually_install_c2hs_-_3.20121127_and_previous.mdwn create mode 100644 doc/bugs/No_easy_way_to_re-inject_a_file_into_an_annex.mdwn create mode 100644 doc/bugs/No_easy_way_to_re-inject_a_file_into_an_annex/comment_1_c871605e187f539f3bfe7478433e7fb5._comment create mode 100644 doc/bugs/No_easy_way_to_re-inject_a_file_into_an_annex/comment_2_e6f1e9eee8b8dfb60ca10c8cfd807ac9._comment create mode 100644 doc/bugs/No_easy_way_to_re-inject_a_file_into_an_annex/comment_3_be62be5fe819acc0cb8b878802decd46._comment create mode 100644 doc/bugs/No_easy_way_to_re-inject_a_file_into_an_annex/comment_4_480a4f72445a636eab1b1c0f816d365c._comment create mode 100644 doc/bugs/No_manual_page_on_prebuilt_linux_version.mdwn create mode 100644 doc/bugs/No_progress_bars_with_S3.mdwn create mode 100644 doc/bugs/No_progress_bars_with_S3/comment_1_33a601201a9fdd2357f1c03e32fa6b9c._comment create mode 100644 doc/bugs/No_progress_bars_with_S3/comment_2_52361805ced99c22d663b3b1e8a5b221._comment create mode 100644 doc/bugs/No_progress_bars_with_S3/comment_3_5903c1c40c4562f4fbaccd1640fedb18._comment create mode 100644 doc/bugs/No_progress_bars_with_S3/comment_4_80799c33e513384894b390fe34ab312a._comment create mode 100644 doc/bugs/No_version_information_from_cli.mdwn create mode 100644 doc/bugs/Numcopies_not_checked_when_running_with_--all.mdwn create mode 100644 doc/bugs/Numcopies_not_checked_when_running_with_--all/comment_1_63af5a11c3ae370433c4bf84de097414._comment create mode 100644 doc/bugs/OSX_.dmg_unnecessarily_large_and_not_inherently_compressed.mdwn create mode 100644 doc/bugs/OSX_alias_permissions_and_versions_problem.mdwn create mode 100644 doc/bugs/OSX_alias_permissions_and_versions_problem/comment_1_4fabe32e7e626e6ca23aa0b6f449c4c6._comment create mode 100644 doc/bugs/OSX_alias_permissions_and_versions_problem/comment_2_064d60fcc8366a70958540bc145e611a._comment create mode 100644 doc/bugs/OSX_alias_permissions_and_versions_problem/comment_3_6c72d4f40ea0a9566a1185901beff5ba._comment create mode 100644 doc/bugs/OSX_alias_permissions_and_versions_problem/comment_4_8a11f404bb72a1aeb2290744cce2d00d._comment create mode 100644 doc/bugs/OSX_alias_permissions_and_versions_problem/comment_5_30888607199d6a48b76d0c48f5aa4f64._comment create mode 100644 doc/bugs/OSX_app_issues.mdwn create mode 100644 doc/bugs/OSX_app_issues/comment_10_54d8f3e429df9a9958370635c890abf0._comment create mode 100644 doc/bugs/OSX_app_issues/comment_10_6d23232fbb15d0ee3ab532a4884f81ed._comment create mode 100644 doc/bugs/OSX_app_issues/comment_11_5db2baa771fd01a284eac8a16c1c8c67._comment create mode 100644 doc/bugs/OSX_app_issues/comment_11_bb2ceb95a844449795addee6986d0763._comment create mode 100644 doc/bugs/OSX_app_issues/comment_12_62170597c7f441d84d48986857998858._comment create mode 100644 doc/bugs/OSX_app_issues/comment_12_f3bc5a4e4895ac9351786f0bdd8005ba._comment create mode 100644 doc/bugs/OSX_app_issues/comment_13_cb12d419459e5cac766022ee0697fedc._comment create mode 100644 doc/bugs/OSX_app_issues/comment_14_c966fa549bc73c52034ac9abc49de52a._comment create mode 100644 doc/bugs/OSX_app_issues/comment_15_10f1df95266f1a8c9ef933183190f6e2._comment create mode 100644 doc/bugs/OSX_app_issues/comment_16_064e151da121f9c2ef13c19ecb4e7458._comment create mode 100644 doc/bugs/OSX_app_issues/comment_17_0e6ac5e0a54ce78bdc56c62e6fb92846._comment create mode 100644 doc/bugs/OSX_app_issues/comment_2_fd560811c57df5cbc3976639642b8b19._comment create mode 100644 doc/bugs/OSX_app_issues/comment_7_93e0bb53ac2d7daef53426fbdc5f92d9._comment create mode 100644 doc/bugs/OSX_app_issues/comment_8_141eac2f3fb25fe18b4268786f00ad6a._comment create mode 100644 doc/bugs/OSX_app_issues/comment_8_f4d5b2645d7f29b80925159efb94a998._comment create mode 100644 doc/bugs/OSX_app_issues/comment_9_2e6dfca0fd8df04066769653724eae28._comment create mode 100644 doc/bugs/OSX_app_issues/comment_9_e1bbe83a1b9a7385ed6d443d0cc22bc7._comment create mode 100644 doc/bugs/OSX_app_issues/old.mdwn create mode 100644 doc/bugs/OSX_app_issues/old/comment_10_bb823dc3cd6dc914ed14c176afa0b2f3._comment create mode 100644 doc/bugs/OSX_app_issues/old/comment_11_a30e69fed14b0809184ffe05358ab871._comment create mode 100644 doc/bugs/OSX_app_issues/old/comment_12_23d47b3696e537d60df1d383f33f19e4._comment create mode 100644 doc/bugs/OSX_app_issues/old/comment_13_be5738b42b13ec8cd828c5fa66f030e8._comment create mode 100644 doc/bugs/OSX_app_issues/old/comment_14_5783a4716cd104e1f1c276aa0b9cb153._comment create mode 100644 doc/bugs/OSX_app_issues/old/comment_14_e126d87a263f3aa6261f72ee7ff086fc._comment create mode 100644 doc/bugs/OSX_app_issues/old/comment_15_56c7fcafc7dca8be28ebf9e37a8f6b71._comment create mode 100644 doc/bugs/OSX_app_issues/old/comment_15_e58bd3d66f0f43c159d2b37172f152de._comment create mode 100644 doc/bugs/OSX_app_issues/old/comment_16_01f2c968bad66b0ff0c09eb468325deb._comment create mode 100644 doc/bugs/OSX_app_issues/old/comment_16_0b7cd3d5952c5abf36a89a68a4afc1e7._comment create mode 100644 doc/bugs/OSX_app_issues/old/comment_17_82d9963e1fbf17644ce697e5a43943f5._comment create mode 100644 doc/bugs/OSX_app_issues/old/comment_17_c2de94a48e7958b9efffd89dda9144ff._comment create mode 100644 doc/bugs/OSX_app_issues/old/comment_18_29af9df9ea295d114574e76e15b8e737._comment create mode 100644 doc/bugs/OSX_app_issues/old/comment_18_88ddc846eb4e4a2d54028a3412ba28d6._comment create mode 100644 doc/bugs/OSX_app_issues/old/comment_19_6d6341b05123cd317c4eac96353c8662._comment create mode 100644 doc/bugs/OSX_app_issues/old/comment_19_aff4ab761c4d196732baa046af45fe24._comment create mode 100644 doc/bugs/OSX_app_issues/old/comment_20_43bd5985d8a3a5e7f826a34e5dd9216e._comment create mode 100644 doc/bugs/OSX_app_issues/old/comment_3_08613b2e2318680508483d204a43da76._comment create mode 100644 doc/bugs/OSX_app_issues/old/comment_4_4cda124b57ddc87645d5822f14ed5c59._comment create mode 100644 doc/bugs/OSX_app_issues/old/comment_5_0d1df34f83a8dac9c438d93806236818._comment create mode 100644 doc/bugs/OSX_app_issues/old/comment_6_12bd83e7e2327c992448e87bdb85d17e._comment create mode 100644 doc/bugs/OSX_app_issues/old/comment_6_bc44d5aea5f77e331a32913ada293730._comment create mode 100644 doc/bugs/OSX_app_issues/old/comment_6_cea97dbbfb566a9fe463365ca4511119._comment create mode 100644 doc/bugs/OSX_app_issues/old/comment_7_911f187d46890093a54859032ada2442._comment create mode 100644 doc/bugs/OSX_app_issues/old/comment_7_acd73cc5c4caa88099e2d2f19947aadf._comment create mode 100644 doc/bugs/OSX_app_issues/old/comment_8_08b091a58106ca6050ac669579ed9ff4._comment create mode 100644 doc/bugs/OSX_app_issues/old/comment_9_8464c839cb169a4c6e72bebdc2065e9a._comment create mode 100644 doc/bugs/OSX_build_broken.mdwn create mode 100644 doc/bugs/OSX_build_broken/comment_1_0b570aa6c58effeace2a989184c9c601._comment create mode 100644 doc/bugs/OSX_git-annex.app_error:__LSOpenURLsWithRole__40____41__.mdwn create mode 100644 doc/bugs/OSX_git-annex.app_error:__LSOpenURLsWithRole__40____41__/comment_1_0dfa839f1ba689b23f811787515b8cff._comment create mode 100644 doc/bugs/OSX_git-annex.app_error:__LSOpenURLsWithRole__40____41__/comment_2_612b947eb5474f6d792a833e33105665._comment create mode 100644 doc/bugs/OSX_git-annex.app_error:__LSOpenURLsWithRole__40____41__/comment_3_549b8bcae6f1f8b21932b734e32fbdd1._comment create mode 100644 doc/bugs/OSX_git-annex.app_error:__LSOpenURLsWithRole__40____41__/comment_4_23078dfea127fa3ef20696eb10ce964c._comment create mode 100644 doc/bugs/OSX_git-annex.app_error:__LSOpenURLsWithRole__40____41__/comment_5_7da5ef8325b8787bbf1c6e2c17b1142e._comment create mode 100644 doc/bugs/OS_X_10.8:_Can__39__t_reopen_webapp.mdwn create mode 100644 doc/bugs/OS_X_10.8:_Can__39__t_reopen_webapp/comment_1_2653fe701a1bb20254f3d6b90f10a43b._comment create mode 100644 doc/bugs/OS_X_10.8:_Can__39__t_reopen_webapp/comment_2_d9ce701d077e40f39b142ce2cc570a3b._comment create mode 100644 doc/bugs/OS_X_10.8:_Can__39__t_reopen_webapp/comment_3_14964ab68253dc1a8903d14a821b8b40._comment create mode 100644 doc/bugs/OS_X_10.8:_Can__39__t_reopen_webapp/comment_4_4a579e9a13305ab4157f4b3eba46b92d._comment create mode 100644 doc/bugs/OS_X_10.8:_Can__39__t_reopen_webapp/comment_5_2a710960dc3a177ce62ef92f8546c496._comment create mode 100644 doc/bugs/OS_X_10.8:_Can__39__t_reopen_webapp/comment_6_a4ad73530cd0f6621bcc6394d5f39af7._comment create mode 100644 doc/bugs/Of_identical_files__44___all_but_the_first_copy_are_lost_on_unannex.mdwn create mode 100644 doc/bugs/Of_identical_files__44___all_but_the_first_copy_are_lost_on_unannex/comment_2_f7149b684a97070cff051b780c73be48._comment create mode 100644 doc/bugs/Old_repository_stuck.mdwn create mode 100644 doc/bugs/Older_version_of_git_causes_Internal_Server_Error_when_push.default___61___simple.mdwn create mode 100644 doc/bugs/Older_version_of_git_causes_Internal_Server_Error_when_push.default___61___simple/comment_1_971224d2c0c0ce8d4530b1991508f849._comment create mode 100644 doc/bugs/Older_version_of_git_causes_Internal_Server_Error_when_push.default___61___simple/comment_2_6866f96277dbe83a8aadcdeb426b6750._comment create mode 100644 doc/bugs/Older_version_of_git_causes_Internal_Server_Error_when_push.default___61___simple/comment_3_eaed9b5532e30e401f50193a72b98310._comment create mode 100644 doc/bugs/Older_version_of_git_causes_Internal_Server_Error_when_push.default___61___simple/comment_4_1fab407f3823ce8cec87f5df55e49f8c._comment create mode 100644 doc/bugs/On_Windows__44___annex_get_fails_with_HTTP_Remote__44___but_believes_it_has_succeeded..mdwn create mode 100644 doc/bugs/On_Windows__44___annex_get_over_HTTP_sends_URLs_with_incorrect_separator.mdwn create mode 100644 doc/bugs/On_Windows__44___can__39__t_use_a_USB_disk_annex_created_on_Linux.mdwn create mode 100644 doc/bugs/On_Windows__44___can__39__t_use_a_USB_disk_annex_created_on_Linux/comment_1_f224f4155d857a59595658357f97dac1._comment create mode 100644 doc/bugs/On_Windows__44___can__39__t_use_repository_that_has_a_unix-style_local_remote_configured.mdwn create mode 100644 doc/bugs/On_Windows__44___can__39__t_use_repository_that_has_a_unix-style_local_remote_configured/comment_1_95655915ff6ba9fb5d873358ff047496._comment create mode 100644 doc/bugs/On_Windows__44___wget_is_not_used__44___even_if_available.mdwn create mode 100644 doc/bugs/On_Windows_the_Comitted_Symlinks_are_not_Relative.mdwn create mode 100644 doc/bugs/On_restart__44___most_repositories__44___including_original_one__44___gone..mdwn create mode 100644 doc/bugs/On_restart__44___most_repositories__44___including_original_one__44___gone./comment_1_3a3891c9d7ee808f6a71780cb628f23d._comment create mode 100644 doc/bugs/On_restart__44___most_repositories__44___including_original_one__44___gone./comment_2_2bc6efb1d9e872cc5d4fbfbaaf5cc10e._comment create mode 100644 doc/bugs/On_restart__44___most_repositories__44___including_original_one__44___gone./comment_3_fff1e778a6334258c173a96e6bf7ef6a._comment create mode 100644 doc/bugs/On_restart__44___most_repositories__44___including_original_one__44___gone./comment_4_2a86da97a89e28f0a0f5e160d4932ae6._comment create mode 100644 doc/bugs/On_restart__44___most_repositories__44___including_original_one__44___gone./comment_5_41b8e8e58025cc8c8f12efb9a51acd29._comment create mode 100644 doc/bugs/On_restart__44___most_repositories__44___including_original_one__44___gone./comment_6_38afcd8e7fb278ca0ee2e9e0c9f6883e._comment create mode 100644 doc/bugs/On_restart__44___most_repositories__44___including_original_one__44___gone./comment_7_06de36dcde4c52ab74c8134f3242ac02._comment create mode 100644 doc/bugs/Open_webapp_ask_to_create_new_repo___40__on_first_start__41___even_if_repo_exists_on_Android.mdwn create mode 100644 doc/bugs/Open_webapp_ask_to_create_new_repo___40__on_first_start__41___even_if_repo_exists_on_Android/comment_1_9f10bf273b15e93f1eea029f091f26cb._comment create mode 100644 doc/bugs/Out_of_memory_error_in_fsck_whereis_find_and_status_cmds.mdwn create mode 100644 doc/bugs/Out_of_memory_error_in_fsck_whereis_find_and_status_cmds/comment_1_3aef6ca929fad198f2dda0868f2d49cb._comment create mode 100644 doc/bugs/Out_of_memory_error_in_fsck_whereis_find_and_status_cmds/comment_2_f2c1aa84a0d04e840cb34ae15eb1cb03._comment create mode 100644 doc/bugs/Out_of_memory_error_in_fsck_whereis_find_and_status_cmds/comment_3_480c39648e3ca6fc58c30377bdb25a8c._comment create mode 100644 doc/bugs/Out_of_memory_error_in_fsck_whereis_find_and_status_cmds/comment_4_b31496b37046a9886f632ba4f11c56e3._comment create mode 100644 doc/bugs/Out_of_memory_error_in_fsck_whereis_find_and_status_cmds/comment_5_d25ff424dda1f6021c1ba20f79d71ffc._comment create mode 100644 doc/bugs/Out_of_memory_error_in_fsck_whereis_find_and_status_cmds/comment_6_9e3300b223dd54a3f07c650f5cf70ae0._comment create mode 100644 doc/bugs/Out_of_memory_error_in_fsck_whereis_find_and_status_cmds/comment_7_b91f4a87b6d29ae6b4262922fd65a79d._comment create mode 100644 doc/bugs/Pairing_locally_shows:___34__bad_comment_in_ssh_public_key_ssh-rsa__34__.mdwn create mode 100644 doc/bugs/Partial_direct__47__indirect_repo.mdwn create mode 100644 doc/bugs/Partial_direct__47__indirect_repo/comment_1_42344fce051d759f95215c985e9d1135._comment create mode 100644 doc/bugs/Partial_direct__47__indirect_repo/comment_2_8ba64f2750d0ef4adf595674c723bc65._comment create mode 100644 doc/bugs/Partial_direct__47__indirect_repo/comment_3_bd4985864b7dcd70a609ca7bc2617e4a._comment create mode 100644 doc/bugs/Possible_data_loss_-_git_status___39__typechange__39___and_direct_mode.mdwn create mode 100644 doc/bugs/Possible_data_loss_-_git_status___39__typechange__39___and_direct_mode/comment_1_84cb8c651584ec2887f6e1b7dc107190._comment create mode 100644 doc/bugs/Possible_issues_with_git_1.7.10_and_newer___40__merge_command_now_asks_for_a_commit_message__34__.mdwn create mode 100644 doc/bugs/Prevent_accidental_merges.mdwn create mode 100644 doc/bugs/Prevent_accidental_merges/comment_1_4c46a193915eab8f308a04175cb2e40a._comment create mode 100644 doc/bugs/Problem_when_dropping_unused_files.mdwn create mode 100644 doc/bugs/Problem_when_dropping_unused_files/comment_10_d4f6bfe8e04560fc661a47b09ed8a5f4._comment create mode 100644 doc/bugs/Problem_when_dropping_unused_files/comment_1_e1a99bd3eb8b3186653b52a52b1836de._comment create mode 100644 doc/bugs/Problem_when_dropping_unused_files/comment_2_dec3e5ffe5cfdc439f418ee00d7d9810._comment create mode 100644 doc/bugs/Problem_when_dropping_unused_files/comment_3_d106a87101db52f957da84d90dafcdbb._comment create mode 100644 doc/bugs/Problem_when_dropping_unused_files/comment_4_f28ed0635612693e437e64d872af5c37._comment create mode 100644 doc/bugs/Problem_when_dropping_unused_files/comment_5_f0237075653768c84deb702442645f28._comment create mode 100644 doc/bugs/Problem_when_dropping_unused_files/comment_6_b509006e1590480a104627369bc910f2._comment create mode 100644 doc/bugs/Problem_when_dropping_unused_files/comment_7_fe261c074211ccb94bbcb32cfd8ee654._comment create mode 100644 doc/bugs/Problem_when_dropping_unused_files/comment_8_bc8e4dc7e0d6577ba5fcc98f56627b1f._comment create mode 100644 doc/bugs/Problem_when_dropping_unused_files/comment_9_e9a22aa2ebcde5f6595b49dba9375761._comment create mode 100644 doc/bugs/Problem_with_bup:_cannot_lock_refs.mdwn create mode 100644 doc/bugs/Problems_building_on_Mac_OS_X.mdwn create mode 100644 doc/bugs/Problems_building_on_Mac_OS_X/comment_1_1c199b826fdd84b5184b1466ad03a9a4._comment create mode 100644 doc/bugs/Problems_running_make_on_osx.mdwn create mode 100644 doc/bugs/Problems_running_make_on_osx/comment_10_94e4ac430140042a2d0fb5a16d86b4e5._comment create mode 100644 doc/bugs/Problems_running_make_on_osx/comment_11_56f1143fa191361d63b441741699e17f._comment create mode 100644 doc/bugs/Problems_running_make_on_osx/comment_12_ec5131624d0d2285d3b6880e47033f97._comment create mode 100644 doc/bugs/Problems_running_make_on_osx/comment_13_88ed095a448096bf8a69015a04e64df1._comment create mode 100644 doc/bugs/Problems_running_make_on_osx/comment_14_89a960b6706ed703b390a81a8bc4e311._comment create mode 100644 doc/bugs/Problems_running_make_on_osx/comment_15_6b8867b8e48bf807c955779c9f8f0909._comment create mode 100644 doc/bugs/Problems_running_make_on_osx/comment_16_5c2dd6002aadaab30841b77a5f5aed34._comment create mode 100644 doc/bugs/Problems_running_make_on_osx/comment_17_62fccb04b0e4b695312f7a3f32fb96ee._comment create mode 100644 doc/bugs/Problems_running_make_on_osx/comment_18_64fab50d95de619eb2e8f08f90237de1._comment create mode 100644 doc/bugs/Problems_running_make_on_osx/comment_19_4253988ed178054c8b6400beeed68a29._comment create mode 100644 doc/bugs/Problems_running_make_on_osx/comment_1_34120e82331ace01a6a4960862d38f2d._comment create mode 100644 doc/bugs/Problems_running_make_on_osx/comment_20_7db27d1a22666c831848bc6c06d66a84._comment create mode 100644 doc/bugs/Problems_running_make_on_osx/comment_2_cc53d1681d576186dbc868dd9801d551._comment create mode 100644 doc/bugs/Problems_running_make_on_osx/comment_3_68f0f8ae953589ae26d57310b40c878d._comment create mode 100644 doc/bugs/Problems_running_make_on_osx/comment_4_c52be386f79f14c8570a8f1397c68581._comment create mode 100644 doc/bugs/Problems_running_make_on_osx/comment_5_7f1330a1e541b0f3e2192e596d7f7bee._comment create mode 100644 doc/bugs/Problems_running_make_on_osx/comment_6_0c46f5165ceb5a7b9ea9689c33b3a4f8._comment create mode 100644 doc/bugs/Problems_running_make_on_osx/comment_7_237a137cce58a28abcc736cbf2c420b0._comment create mode 100644 doc/bugs/Problems_running_make_on_osx/comment_8_efafa203addf8fa79e33e21a87fb5a2b._comment create mode 100644 doc/bugs/Problems_running_make_on_osx/comment_9_cc283b485b3c95ba7eebc8f0c96969b3._comment create mode 100644 doc/bugs/Problems_with_syncing_gnucash.mdwn create mode 100644 doc/bugs/Problems_with_syncing_gnucash/comment_1_ca195af3ba4a286eb5ab687634192fa4._comment create mode 100644 doc/bugs/Problems_with_syncing_gnucash/comment_2_754fb430381ad88e6248ecb902b32118._comment create mode 100644 doc/bugs/Problems_with_syncing_gnucash/comment_4_25881998c6f149c70b1358f37b7c66ba._comment create mode 100644 doc/bugs/Provide_64-bit_standalone_build.mdwn create mode 100644 doc/bugs/Provide_64-bit_standalone_build/comment_1_1850bb3eb464f1d3c122cfeb4ccaf265._comment create mode 100644 doc/bugs/Proxy_support.mdwn create mode 100644 doc/bugs/Race_condition_between_watch__47__assistant_and_addurl.mdwn create mode 100644 doc/bugs/Race_condition_between_watch__47__assistant_and_addurl/comment_1_8f56b8661a600729d7a9d569e8a0ba70._comment create mode 100644 doc/bugs/Race_condition_between_watch__47__assistant_and_addurl/comment_2_46dc67bdcd174cd50ccc421ec56735ad._comment create mode 100644 doc/bugs/Remote_repo_and_set_operation_with_find.mdwn create mode 100644 doc/bugs/Remote_repositories_have_to_be_setup_encrypted.mdwn create mode 100644 doc/bugs/Remote_repositories_have_to_be_setup_encrypted/comment_1_95f73315657bc35a8d3ff9b4ba207af0._comment create mode 100644 doc/bugs/Remotes_only_start_showing_changes_after_both_sides_have_written_to_the_repository.mdwn create mode 100644 doc/bugs/Remotes_only_start_showing_changes_after_both_sides_have_written_to_the_repository/comment_1_92211091daf9827a4ec7e5b5a6769d59._comment create mode 100644 doc/bugs/Remotes_only_start_showing_changes_after_both_sides_have_written_to_the_repository/comment_2_f0fa97a9eba1c624f6f8720ba8a160b7._comment create mode 100644 doc/bugs/Remotes_only_start_showing_changes_after_both_sides_have_written_to_the_repository/comment_3_e3d677ea4170c07cd31efe6dc85fa5f3._comment create mode 100644 doc/bugs/Renamed_special_remote_cannot_be_reactivated_by_the_webapp.mdwn create mode 100644 doc/bugs/Repository_deletion_error.mdwn create mode 100644 doc/bugs/Repository_deletion_error/comment_1_31673d0300986b6098d1af2cc4b180c6._comment create mode 100644 doc/bugs/Repository_in_manual_mode_does_not_hold_files.mdwn create mode 100644 doc/bugs/Repository_in_manual_mode_does_not_hold_files/comment_1_86e8a4e546610e8e265806eb245d8aba._comment create mode 100644 doc/bugs/Repository_in_manual_mode_does_not_hold_files/comment_2_17d5775a38b67ba4f0e73f6b89cff2d0._comment create mode 100644 doc/bugs/Resolve_.local_adresses_using_avahi_or_bonjour.mdwn create mode 100644 doc/bugs/Resolve_.local_adresses_using_avahi_or_bonjour/comment_1_71cfedf4328eab224c7fb797c420ad0a._comment create mode 100644 doc/bugs/Resource_exhausted.mdwn create mode 100644 doc/bugs/Resource_exhausted/comment_10_bccf9528ffe963154c92ce49762e7ea6._comment create mode 100644 doc/bugs/Resource_exhausted/comment_11_24ad3a76a25a787ac59e2c5270709e72._comment create mode 100644 doc/bugs/Resource_exhausted/comment_12_1943ff77f3bccf885229ecc10c82399d._comment create mode 100644 doc/bugs/Resource_exhausted/comment_13_c3cac0717232e04e89df62efa1db0870._comment create mode 100644 doc/bugs/Resource_exhausted/comment_1_a5ef7a62d4ed9365f9448520bb17e3b5._comment create mode 100644 doc/bugs/Resource_exhausted/comment_2_cdba2015e603f3c21f3e1697dd6fafcd._comment create mode 100644 doc/bugs/Resource_exhausted/comment_3_747d16d050fdcf69dd3d2bc5ca469a2e._comment create mode 100644 doc/bugs/Resource_exhausted/comment_4_1e9b74e60da57c3d5f08c1eb3801c1d2._comment create mode 100644 doc/bugs/Resource_exhausted/comment_5_f55d933bce77fd2185ebd0cc46fe57ec._comment create mode 100644 doc/bugs/Resource_exhausted/comment_6_26c98fca45b029a527f9684873db4be5._comment create mode 100644 doc/bugs/Resource_exhausted/comment_7_8bab413b472f900e04977db2bc3951b6._comment create mode 100644 doc/bugs/Resource_exhausted/comment_8_e9bec0b80179b1229b6af0979a21c727._comment create mode 100644 doc/bugs/Resource_exhausted/comment_9_419e24e0b91f569294ece28c42daa246._comment create mode 100644 doc/bugs/Resource_leak_somewhere_in_the___39__get__39___code.mdwn create mode 100644 doc/bugs/Resource_leak_somewhere_in_the___39__get__39___code/comment_1_66b21720cd1b2a4f66ef24252d3e6305._comment create mode 100644 doc/bugs/Resource_leak_somewhere_in_the___39__get__39___code/comment_2_18c9f55c5af1f4f690a7727df71ab561._comment create mode 100644 doc/bugs/Rsync_encrypted_remote_asks_for_ssh_key_password_for_each_file.mdwn create mode 100644 doc/bugs/Rsync_encrypted_remote_asks_for_ssh_key_password_for_each_file/comment_1_fd95e0bb61e80a72b4ac1304ef6c2e77._comment create mode 100644 doc/bugs/Rsync_remote_created_via_webapp_remains_empty.mdwn create mode 100644 doc/bugs/Rsync_remote_created_via_webapp_remains_empty/comment_1_cccf9d58c0ebb8d31cacdd029ea8e23a._comment create mode 100644 doc/bugs/S3_bucket_uses_the_same_key_for_encryption_and_hashing.mdwn create mode 100644 doc/bugs/S3_bucket_uses_the_same_key_for_encryption_and_hashing/comment_1_dc5ae7af499203cfd903e866595b8fea._comment create mode 100644 doc/bugs/S3_bucket_uses_the_same_key_for_encryption_and_hashing/comment_2_c62daf5b3bfcd2f684262c96ef6628c1._comment create mode 100644 doc/bugs/S3_bucket_uses_the_same_key_for_encryption_and_hashing/comment_3_e1f39c4af5bdb0daabf000da80858cd9._comment create mode 100644 doc/bugs/S3_bucket_uses_the_same_key_for_encryption_and_hashing/comment_4_bb6b814ab961818d514f6553455d2bf3._comment create mode 100644 doc/bugs/S3_bucket_uses_the_same_key_for_encryption_and_hashing/comment_5_5bb128f6d2ca4b5e4d881fae297fa1f8._comment create mode 100644 doc/bugs/S3_bucket_uses_the_same_key_for_encryption_and_hashing/comment_6_63fb74da342751fc35e1850409c506f6._comment create mode 100644 doc/bugs/S3_buckets_with_capital_letters_breaks_authentication.mdwn create mode 100644 doc/bugs/S3_memory_leaks.mdwn create mode 100644 doc/bugs/S3_memory_leaks/comment_1_a7268213b090bce6b1f1858a8e23d90e._comment create mode 100644 doc/bugs/S3_memory_leaks/comment_2_320a8e3bb7b207d1aff8926b9247f5ba._comment create mode 100644 doc/bugs/S3_upload_not_using_multipart.mdwn create mode 100644 doc/bugs/SSH:_command-line:_line_0:_Bad_configuration_option:_ControlPersist___40__SSH_too_old_on_OS_X_10.6.8__63____41__.mdwn create mode 100644 doc/bugs/SSH:_command-line:_line_0:_Bad_configuration_option:_ControlPersist___40__SSH_too_old_on_OS_X_10.6.8__63____41__/comment_1_0c57a2196d35eb1ecfb0c51273bba05c._comment create mode 100644 doc/bugs/Segfaults_on_Fedora_18_with_SELinux_enabled.mdwn create mode 100644 doc/bugs/Segfaults_on_Fedora_18_with_SELinux_enabled/comment_1_f708d87aa65cd38c20087859d3ab2dc7._comment create mode 100644 doc/bugs/Segfaults_on_Fedora_18_with_SELinux_enabled/comment_2_fb7188db031147992f3c906783ebbee0._comment create mode 100644 doc/bugs/Selfsigned_certificates_with_jabber_fail_miserably..mdwn create mode 100644 doc/bugs/Selfsigned_certificates_with_jabber_fail_miserably./comment_1_13d27ba41d9ef78c8db534b6bc26314e._comment create mode 100644 doc/bugs/Selfsigned_certificates_with_jabber_fail_miserably./comment_2_018eed99e71680be9e7c0844020419bb._comment create mode 100644 doc/bugs/Selfsigned_certificates_with_jabber_fail_miserably./comment_3_1e7578dd1321f399b12197056495b0b6._comment create mode 100644 doc/bugs/Share_with_friends_crash_in_osx.mdwn create mode 100644 doc/bugs/Share_with_friends_crash_in_osx/comment_10_8d90e23514d9f14283857c57017a5fcf._comment create mode 100644 doc/bugs/Share_with_friends_crash_in_osx/comment_11_1a0e174969e99e7b562854d2c3b3e606._comment create mode 100644 doc/bugs/Share_with_friends_crash_in_osx/comment_12_dfde39222a91923c570e5405d9e527f4._comment create mode 100644 doc/bugs/Share_with_friends_crash_in_osx/comment_13_65de2b5dd3af89c2f0f6508ffddda3b5._comment create mode 100644 doc/bugs/Share_with_friends_crash_in_osx/comment_1_804c394e97223b1f9cc9f1f3adaa2e74._comment create mode 100644 doc/bugs/Share_with_friends_crash_in_osx/comment_2_f1fe0c05724236988e77f4b7f393e7d5._comment create mode 100644 doc/bugs/Share_with_friends_crash_in_osx/comment_3_3d9ec79231e1b340b5e8b7b63a902546._comment create mode 100644 doc/bugs/Share_with_friends_crash_in_osx/comment_4_f63bb1d29fc7130bfa0c15feeba4e5fd._comment create mode 100644 doc/bugs/Share_with_friends_crash_in_osx/comment_5_a024902e300cf50e8f6a63c7feef63a1._comment create mode 100644 doc/bugs/Share_with_friends_crash_in_osx/comment_6_baf0333f307dff0f79cd7c73b4c56c18._comment create mode 100644 doc/bugs/Share_with_friends_crash_in_osx/comment_7_849759a5c92de57733b14adce2f49c14._comment create mode 100644 doc/bugs/Share_with_friends_crash_in_osx/comment_8_01530dd4ddbf620435a4d8f1edeaee8e._comment create mode 100644 doc/bugs/Share_with_friends_crash_in_osx/comment_9_6ef922e1ebb72db8ebbff4a76017e535._comment create mode 100644 doc/bugs/Should_UUID__39__s_for_Remotes_be_case_sensitive__63__.mdwn create mode 100644 doc/bugs/Should_UUID__39__s_for_Remotes_be_case_sensitive__63__/comment_1_00b52dba3bc30516e06c44cbfd3a05a2._comment create mode 100644 doc/bugs/Should_UUID__39__s_for_Remotes_be_case_sensitive__63__/comment_2_8f5fa659c2ab91b1757bac31cd3b15eb._comment create mode 100644 doc/bugs/Should_UUID__39__s_for_Remotes_be_case_sensitive__63__/comment_3_ccf9623d60c58d036d8bf24757e50de3._comment create mode 100644 doc/bugs/Should_ignore_.thumbnails__47___on_android.mdwn create mode 100644 doc/bugs/Should_try_again_when_network_fails___40__esp._DNS__41__.mdwn create mode 100644 doc/bugs/Should_try_again_when_network_fails___40__esp._DNS__41__/comment_1_dd792bd98a48554a65150c06401ed3e5._comment create mode 100644 doc/bugs/Small_archive_behaving_like_archive.mdwn create mode 100644 doc/bugs/Small_archive_behaving_like_archive/comment_1_718dc246cbbbeae04436fa033011ab12._comment create mode 100644 doc/bugs/Specifying_a_filename_starting_with___34__-c__34___instead_applies_it_to_all_files.mdwn create mode 100644 doc/bugs/Specifying_a_filename_starting_with___34__-c__34___instead_applies_it_to_all_files/comment_1_2fe6d735bc075275a6b8890fac48ee58._comment create mode 100644 doc/bugs/Stale_lock_files_on_Android.mdwn create mode 100644 doc/bugs/Stress_test.mdwn create mode 100644 doc/bugs/Stress_test/comment_10_1694e990eab6592159309c231c6dcc16._comment create mode 100644 doc/bugs/Stress_test/comment_11_ab4cb6eefd279e6c1f229e089f703581._comment create mode 100644 doc/bugs/Stress_test/comment_1_c4c764488ac082f5c48d3a6b4b5fba42._comment create mode 100644 doc/bugs/Stress_test/comment_2_42125bba09a0ea9821cda7183e458100._comment create mode 100644 doc/bugs/Stress_test/comment_3_8240e61106b494d3600ad91f16eb5b1c._comment create mode 100644 doc/bugs/Stress_test/comment_4_c38d84e0dcc834931804c44bce7f7b7a._comment create mode 100644 doc/bugs/Stress_test/comment_5_60ce20ee255451c4ea809ba475561adb._comment create mode 100644 doc/bugs/Stress_test/comment_6_1371562e201393986cd41597f6f288cb._comment create mode 100644 doc/bugs/Stress_test/comment_7_a14be7699da224a8f6c9b34f1b911219._comment create mode 100644 doc/bugs/Stress_test/comment_8_a01995bdca7ade7dde9842b53fbc4e0c._comment create mode 100644 doc/bugs/Stress_test/comment_9_9f7efe81b7e40aaa04a865394c53e20f._comment create mode 100644 doc/bugs/Switching_between_direct_and_indirect_stomps_on___39__regular__39___git_files.mdwn create mode 100644 doc/bugs/Switching_between_direct_and_indirect_stomps_on___39__regular__39___git_files/comment_1_0d2cb3b8509cd0eba50aafa14afefc02._comment create mode 100644 doc/bugs/Switching_from_indirect_mode_to_direct_mode_breaks_duplicates.mdwn create mode 100644 doc/bugs/Switching_repositories_in_webapp_on_a_remote_server_is_not_honoring_--listen_parameter.mdwn create mode 100644 doc/bugs/Switching_repositories_in_webapp_on_a_remote_server_is_not_honoring_--listen_parameter/comment_1_4dd773372979dd95538bfba6516a11eb._comment create mode 100644 doc/bugs/Symlinks_from_git-annex_repository_to_outside_git_repository_not_supported.mdwn create mode 100644 doc/bugs/Symlinks_from_git-annex_repository_to_outside_git_repository_not_supported/comment_1_06ac38f32039ad43b0c2623c8fdb1df6._comment create mode 100644 doc/bugs/Symlinks_from_git-annex_repository_to_outside_git_repository_not_supported/comment_2_91a8daa3d49799d0784c9fe3ee10558a._comment create mode 100644 doc/bugs/Symlinks_from_git-annex_repository_to_outside_git_repository_not_supported/comment_3_166ae413b7c41f00f13292855ac66974._comment create mode 100644 doc/bugs/Syncing_creates_broken_links_instead_of_proper_files.mdwn create mode 100644 doc/bugs/Syncing_creates_broken_links_instead_of_proper_files/comment_1_a2bedb2e77451b02fc66fc9ef5c4405c._comment create mode 100644 doc/bugs/Syncing_of_file_contents_seems_to_be_broken_in_recent_versions_of_the_assistant.mdwn create mode 100644 doc/bugs/Syncing_of_file_contents_seems_to_be_broken_in_recent_versions_of_the_assistant/comment_1_8100505a7ac74646e0767d03fe643a45._comment create mode 100644 doc/bugs/Syncing_of_file_contents_seems_to_be_broken_in_recent_versions_of_the_assistant/comment_2_9833e8f77c6148db9572316066a67eee._comment create mode 100644 doc/bugs/Syncing_of_file_contents_seems_to_be_broken_in_recent_versions_of_the_assistant/comment_3_1504f8767f1f4415222d8c315c734e81._comment create mode 100644 doc/bugs/Test_failure_on_debian_dropunused.mdwn create mode 100644 doc/bugs/Test_test__95__mixed__95__conflict__95__resolution_fails_on_Windows_with___34__conflictor_directory_missing__34__.mdwn create mode 100644 doc/bugs/Test_test__95__mixed__95__conflict__95__resolution_fails_on_Windows_with___34__conflictor_directory_missing__34__/comment_1_dfb520258fdd633285b44cb16fd35612._comment create mode 100644 doc/bugs/Test_test__95__mixed__95__conflict__95__resolution_fails_on_Windows_with___34__conflictor_directory_missing__34__/comment_2_7908bf367652d2485ec703ae8958891b._comment create mode 100644 doc/bugs/Test_test__95__mixed__95__conflict__95__resolution_fails_on_Windows_with___34__conflictor_directory_missing__34__/comment_3_30684a993b667b2594890f734638e91b._comment create mode 100644 doc/bugs/Test_test__95__mixed__95__conflict__95__resolution_fails_on_Windows_with___34__conflictor_directory_missing__34__/comment_4_30e847ff438eda036c57cc740b638d8a._comment create mode 100644 doc/bugs/Test_test__95__mixed__95__conflict__95__resolution_fails_on_Windows_with___34__conflictor_directory_missing__34__/comment_5_04232cf2097676057cddf841ad47f44c._comment create mode 100644 doc/bugs/Test_test__95__mixed__95__conflict__95__resolution_fails_on_Windows_with___34__conflictor_directory_missing__34__/comment_6_9cb32f198eee25b7175cc9ad1795acb3._comment create mode 100644 doc/bugs/Test_test__95__mixed__95__conflict__95__resolution_fails_on_Windows_with___34__conflictor_directory_missing__34__/comment_7_f8a70156d56c4be6cfbadb50e8a08285._comment create mode 100644 doc/bugs/Test_test__95__mixed__95__conflict__95__resolution_fails_on_Windows_with___34__conflictor_directory_missing__34__/comment_8_02699dbf30270db090b00192850831db._comment create mode 100644 doc/bugs/The_assistant_hangs_forever.mdwn create mode 100644 doc/bugs/The_assistant_hangs_forever/comment_1_b0291e32860e0da0b66837d14ed5aab6._comment create mode 100644 doc/bugs/The_assistant_hangs_forever/comment_2_a2950cf91b8a4e4f2951f5522ef0e9c4._comment create mode 100644 doc/bugs/The_assistant_hangs_forever/comment_3_db95f78519d5ffbad793906028730dab._comment create mode 100644 doc/bugs/The_assistant_hangs_forever/comment_4_28b13fd3165b38a2fbc9e1a461c38921._comment create mode 100644 doc/bugs/The_assistant_hangs_forever/comment_5_81a79c8840ff26307a9c6edad5b850f9._comment create mode 100644 doc/bugs/The_assistant_hangs_forever/comment_6_b739719b14705f4d7e1d412b3cab090c._comment create mode 100644 doc/bugs/The_assistant_hangs_forever/comment_7_2b300d960697c5b967c1f109dfd6dfbf._comment create mode 100644 doc/bugs/The_assistant_hangs_forever/comment_8_8623220d08b1a72ed8b669a2d9cc0f75._comment create mode 100644 doc/bugs/The_restricted_ssh_key_pair_makes_password_login___40__nearly__41___impossible.mdwn create mode 100644 doc/bugs/The_restricted_ssh_key_pair_makes_password_login___40__nearly__41___impossible/comment_10_8305becdc6e70abdaf17e42f263173fc._comment create mode 100644 doc/bugs/The_restricted_ssh_key_pair_makes_password_login___40__nearly__41___impossible/comment_11_d75896a6e204d1abdda04923aa668d04._comment create mode 100644 doc/bugs/The_restricted_ssh_key_pair_makes_password_login___40__nearly__41___impossible/comment_12_a36a4a64a04c01c2db467b09300e6ebd._comment create mode 100644 doc/bugs/The_restricted_ssh_key_pair_makes_password_login___40__nearly__41___impossible/comment_13_c9d6631c304acb289e485fb901e1f274._comment create mode 100644 doc/bugs/The_restricted_ssh_key_pair_makes_password_login___40__nearly__41___impossible/comment_14_10282c4352075c8d148b8674973b7b16._comment create mode 100644 doc/bugs/The_restricted_ssh_key_pair_makes_password_login___40__nearly__41___impossible/comment_15_ceb68da01d9e2fe9a70fab6244116da0._comment create mode 100644 doc/bugs/The_restricted_ssh_key_pair_makes_password_login___40__nearly__41___impossible/comment_16_cca4abde86a8be5e2919c4738f5bdd0c._comment create mode 100644 doc/bugs/The_restricted_ssh_key_pair_makes_password_login___40__nearly__41___impossible/comment_17_2fa5d7d9110c91b0a3a833cb3d9f53fd._comment create mode 100644 doc/bugs/The_restricted_ssh_key_pair_makes_password_login___40__nearly__41___impossible/comment_18_bf21d28142e4c304aa0bc740955ddea0._comment create mode 100644 doc/bugs/The_restricted_ssh_key_pair_makes_password_login___40__nearly__41___impossible/comment_19_45537758fa937f16fc82120bf8b234e8._comment create mode 100644 doc/bugs/The_restricted_ssh_key_pair_makes_password_login___40__nearly__41___impossible/comment_1_a38497772834a4b12137390b461ce70b._comment create mode 100644 doc/bugs/The_restricted_ssh_key_pair_makes_password_login___40__nearly__41___impossible/comment_20_b685050ee6fbb1a685e33f9656a10e84._comment create mode 100644 doc/bugs/The_restricted_ssh_key_pair_makes_password_login___40__nearly__41___impossible/comment_3_17bc0220c20553c848875475c5fd4ae6._comment create mode 100644 doc/bugs/The_restricted_ssh_key_pair_makes_password_login___40__nearly__41___impossible/comment_4_76472bc58bb790f773c46ec2c39fcf88._comment create mode 100644 doc/bugs/The_restricted_ssh_key_pair_makes_password_login___40__nearly__41___impossible/comment_4_dcd9286e314779c25764484beff40561._comment create mode 100644 doc/bugs/The_restricted_ssh_key_pair_makes_password_login___40__nearly__41___impossible/comment_5_2146eec77b87b615100d0d003e8dce75._comment create mode 100644 doc/bugs/The_restricted_ssh_key_pair_makes_password_login___40__nearly__41___impossible/comment_6_2bd6f4e04903ee251d43d0a97bd40b6e._comment create mode 100644 doc/bugs/The_restricted_ssh_key_pair_makes_password_login___40__nearly__41___impossible/comment_7_7db8ed002eb6313b07f09bd1a34019e3._comment create mode 100644 doc/bugs/The_restricted_ssh_key_pair_makes_password_login___40__nearly__41___impossible/comment_8_1bcb2a238006044bc78849e56cb21a01._comment create mode 100644 doc/bugs/The_restricted_ssh_key_pair_makes_password_login___40__nearly__41___impossible/comment_9_26c6937cf78e7141e0e3b20f25ed8f7a._comment create mode 100644 doc/bugs/The_tests_are_failing_to_build_now_on_commit_e0fdfb2e706da2cb1451193c658dc676b0530968.mdwn create mode 100644 doc/bugs/The_webapp_doesn__39__t_allow_deleting_repositories.mdwn create mode 100644 doc/bugs/The_webapp_doesn__39__t_allow_deleting_repositories/comment_1_1b80f9cfedd25e34997fa07e08d15012._comment create mode 100644 doc/bugs/The_webapp_doesn__39__t_allow_deleting_repositories/comment_2_53499da1185c56d8fd25f86ba41d96ce._comment create mode 100644 doc/bugs/The_webapp_doesn__39__t_allow_deleting_repositories/comment_3_3e07b8386d2c7afce2a78d24b9c260b9._comment create mode 100644 doc/bugs/Too_many_open_files.mdwn create mode 100644 doc/bugs/Too_many_open_files/comment_1_d5d509b9b431d2ea6000ebc0aed62857._comment create mode 100644 doc/bugs/Too_much_system_load_on_startup.mdwn create mode 100644 doc/bugs/Too_much_system_load_on_startup/comment_1_4470cddc0965062588acff1bc77285e9._comment create mode 100644 doc/bugs/TransferScanner_crash_on_Android.mdwn create mode 100644 doc/bugs/TransferScanner_crash_on_Android/comment_1_6c3584ade1ee6cccddddeaa8e1697945._comment create mode 100644 doc/bugs/TransferScanner_crash_on_Android/comment_2_06574e05149a677d666a722061586658._comment create mode 100644 doc/bugs/TransferScanner_crash_on_Android/comment_3_54ae097d30bb7a49fe151f38c9bac033._comment create mode 100644 doc/bugs/Transfers_continue_after_daemon_stopped.mdwn create mode 100644 doc/bugs/Transfers_continue_after_daemon_stopped/comment_1_39eb527d64367e6762281246f1d49b1f._comment create mode 100644 doc/bugs/Tries_to_upload_to_remote_although_remote_is_dead.mdwn create mode 100644 doc/bugs/Tries_to_upload_to_remote_although_remote_is_dead/comment_1_108b3984891f82429430b503cddfb3c1._comment create mode 100644 doc/bugs/Tries_to_upload_to_remote_although_remote_is_dead/comment_2_fa5b1bc26ed3e5bfe48441490c94fe3a._comment create mode 100644 doc/bugs/Tries_to_upload_to_remote_although_remote_is_dead/comment_3_0a785b5dfbf4eef30854d6bedb12b7d1._comment create mode 100644 doc/bugs/Trouble_initializing_git_annex_on_NFS.mdwn create mode 100644 doc/bugs/Trouble_initializing_git_annex_on_NFS/comment_1_e26952373150d63b8a5d3643a2762de1._comment create mode 100644 doc/bugs/Trouble_initializing_git_annex_on_NFS/comment_2_f80b10ed395738e50e345fc22c708ae5._comment create mode 100644 doc/bugs/Trouble_initializing_git_annex_on_NFS/comment_3_f99e0f05950fc2fc80fdecd35e17012c._comment create mode 100644 doc/bugs/Trouble_initializing_git_annex_on_NFS/comment_4_e42146d2dcc4052266dd61d204aeb551._comment create mode 100644 doc/bugs/True_backup_support.mdwn create mode 100644 doc/bugs/True_backup_support/comment_1_50aa0bc1e2502622585682cb703e0b85._comment create mode 100644 doc/bugs/True_backup_support/comment_2_d6030c6c49b227e022f05d590746d4ca._comment create mode 100644 doc/bugs/Truncated_file_transferred_via_S3.mdwn create mode 100644 doc/bugs/Truncated_file_transferred_via_S3/comment_1_5962358e6067448f633cc0eaf42f9ca7._comment create mode 100644 doc/bugs/Truncated_file_transferred_via_S3/comment_2_75a2c272c36fc4fe8f9a79a3fd3ac4e5._comment create mode 100644 doc/bugs/Truncated_file_transferred_via_S3/comment_3_3dae1914c8c90fdad0c21e1fc795f2ca._comment create mode 100644 doc/bugs/Truncated_file_transferred_via_S3/comment_4_3c5fe109f2196cfc196c30da3b62bafd._comment create mode 100644 doc/bugs/Truncated_file_transferred_via_S3/comment_5_f86f83c89300f255e730ddd23f876f61._comment create mode 100644 doc/bugs/USB_drive_not_syncing.mdwn create mode 100644 doc/bugs/USB_drive_not_syncing/comment_1_de76bd6b9f8eb2489d4854a4c8ddd308._comment create mode 100644 doc/bugs/Unable_to_add_files_on_Android_due_to_weird_rename_error.mdwn create mode 100644 doc/bugs/Unable_to_add_files_on_Android_due_to_weird_rename_error/comment_1_928289956111d1b22f9d55f15b54f72f._comment create mode 100644 doc/bugs/Unable_to_add_files_on_Android_due_to_weird_rename_error/comment_2_6a0cb836b93ba4cb1e07b11d5d2a7094._comment create mode 100644 doc/bugs/Unable_to_copy_from_Android.mdwn create mode 100644 doc/bugs/Unable_to_copy_from_Android/comment_1_3bb70c44b6b8d451687591fcab5c1506._comment create mode 100644 doc/bugs/Unable_to_import_feed.mdwn create mode 100644 doc/bugs/Unable_to_import_feed/comment_1_16230fbbb996e165b84787ed4d5f72ea._comment create mode 100644 doc/bugs/Unable_to_switch_back_to_direct_mode.mdwn create mode 100644 doc/bugs/Unable_to_switch_back_to_direct_mode/comment_1_4585b251f011a153c62f377c324cf963._comment create mode 100644 doc/bugs/Unable_to_switch_back_to_direct_mode/comment_2_5848ebbab38d1244347f7e7351b3a30d._comment create mode 100644 doc/bugs/Unable_to_switch_back_to_direct_mode/comment_3_1c5c7b0c7bc336e00f43e257b87a6208._comment create mode 100644 doc/bugs/Unable_to_switch_back_to_direct_mode/comment_4_b0bfd68998bc3e11d8e089646b8292a6._comment create mode 100644 doc/bugs/Unable_to_sync_a_second_machine_through_Box.mdwn create mode 100644 doc/bugs/Unable_to_sync_a_second_machine_through_Box/comment_1_cb43a2bc976e3eb1cfc3ee9d4d34e78e._comment create mode 100644 doc/bugs/Unable_to_sync_a_second_machine_through_Box/comment_2_3375e9bfab3fed271413bd9bb5fa0121._comment create mode 100644 doc/bugs/Unable_to_sync_a_second_machine_through_Box/comment_3_c4420e1a3db321b4135b1626d3582adb._comment create mode 100644 doc/bugs/Unable_to_sync_a_second_machine_through_Box/comment_4_f4b2c88bb5938dacdd04dfe9a68560de._comment create mode 100644 doc/bugs/Unable_to_sync_a_second_machine_through_Box/comment_5_6dcc95ffb3fc7bbbedd6be5df0111c85._comment create mode 100644 doc/bugs/Unable_to_use_remotes_with_space_in_the_path.mdwn create mode 100644 doc/bugs/Unfortunate_interaction_with_Calibre.mdwn create mode 100644 doc/bugs/Unfortunate_interaction_with_Calibre/comment_1_7cb5561f11dfc7726a537ddde2477489._comment create mode 100644 doc/bugs/Unfortunate_interaction_with_Calibre/comment_2_b8ae4bc589c787dacc08ab2ee5491d6e._comment create mode 100644 doc/bugs/Unfortunate_interaction_with_Calibre/comment_3_977c5f6b82f9e18cdd81d57005bb8b89._comment create mode 100644 doc/bugs/Unfortunate_interaction_with_Calibre/comment_4_ff7d2e9a39dfe12b975d04650ac57cc4._comment create mode 100644 doc/bugs/Unfortunate_interaction_with_Calibre/comment_5_fc4d5301797589e92cc9a24697b2155d._comment create mode 100644 doc/bugs/Unicode_file_names_ignored_on_Windows.mdwn create mode 100644 doc/bugs/Unicode_file_names_ignored_on_Windows/comment_1_3dfa4559dceec50c08ba180f41b4c220._comment create mode 100644 doc/bugs/Unicode_file_names_ignored_on_Windows/comment_2_4dafea4367d455c2e63b0f7b1cc39559._comment create mode 100644 doc/bugs/Unicode_file_names_ignored_on_Windows/comment_3_bdde68a990a330ee0cf626be44b1c132._comment create mode 100644 doc/bugs/Unicode_file_names_ignored_on_Windows/comment_4_9140fb8034b1449ee2f4762093bc1f89._comment create mode 100644 doc/bugs/Unicode_file_names_ignored_on_Windows/comment_5_661ca15b68bc0e3fbe85f11400570446._comment create mode 100644 doc/bugs/Unicode_file_names_ignored_on_Windows/comment_6_0e8820169c0300d296c697154fd05dc4._comment create mode 100644 doc/bugs/Unicode_file_names_ignored_on_Windows/comment_7_b23a2bf106053f105798b270536057e5._comment create mode 100644 doc/bugs/Unicode_file_names_ignored_on_Windows/comment_8_7f23911705eaa58a9230f19ab890e87f._comment create mode 100644 doc/bugs/Unknown_command___39__list__39__.mdwn create mode 100644 doc/bugs/Unknown_command___39__list__39__/comment_1_c625d03d1ed2019141ac9202f933466d._comment create mode 100644 doc/bugs/Unknown_command___39__list__39__/comment_2_800e1b6417768bdadda311ebfb5df637._comment create mode 100644 doc/bugs/Unknown_command___39__list__39__/comment_3_35dfc75ce9efffff139f8929dc311e29._comment create mode 100644 doc/bugs/Unknown_remote_type_webdav.mdwn create mode 100644 doc/bugs/Unnecessary_remote_transfers.mdwn create mode 100644 doc/bugs/Unnecessary_remote_transfers/comment_10_b778fbb1386f0f51bf057ffacd590ebb._comment create mode 100644 doc/bugs/Unnecessary_remote_transfers/comment_11_55430eac842d0a192dc7f41d7730e4d5._comment create mode 100644 doc/bugs/Unnecessary_remote_transfers/comment_1_00c18e07678dc513a02d974fe059df73._comment create mode 100644 doc/bugs/Unnecessary_remote_transfers/comment_2_2e9992dbfceabd6df535a2770626de16._comment create mode 100644 doc/bugs/Unnecessary_remote_transfers/comment_3_a98f3091a6a658919f0562cf396439c2._comment create mode 100644 doc/bugs/Unnecessary_remote_transfers/comment_4_417c1e8e27ee1a1f9ebf9160560605c5._comment create mode 100644 doc/bugs/Unnecessary_remote_transfers/comment_5_eb5a2717a1f0c7bb761d2a7866b23def._comment create mode 100644 doc/bugs/Unnecessary_remote_transfers/comment_6_89f756db1f3f2e60a3bd1f35f55fee43._comment create mode 100644 doc/bugs/Unnecessary_remote_transfers/comment_7_5aaf8766a7ba05c4f92715e5d5175a8f._comment create mode 100644 doc/bugs/Unnecessary_remote_transfers/comment_8_e856b350632cc865d16d1995a6cdf065._comment create mode 100644 doc/bugs/Unnecessary_remote_transfers/comment_9_64f831545b34b78452952cf49b5f5b05._comment create mode 100644 doc/bugs/Unused_files_not_being_reported:_Do_not_take_remote_tracking_branches_into_account__63__.mdwn create mode 100644 doc/bugs/Unused_files_not_being_reported:_Do_not_take_remote_tracking_branches_into_account__63__/comment_1_8fe44da0581d9b8c6ab5fe6aea8d83d1._comment create mode 100644 doc/bugs/Update_dependency_on_certificate___62____61___1.3.3.mdwn create mode 100644 doc/bugs/Use_a_git_repository_on_the_server_don__39__t_work.mdwn create mode 100644 doc/bugs/Use_a_git_repository_on_the_server_don__39__t_work/comment_1_2143f0540fdcd7efeb25b5a3b54fe0fd._comment create mode 100644 doc/bugs/Use_a_git_repository_on_the_server_don__39__t_work/comment_2_bca95245b457631d08b47591da6163ad._comment create mode 100644 doc/bugs/Use_a_git_repository_on_the_server_don__39__t_work/comment_3_f54bb003096752dae0442660267a1e37._comment create mode 100644 doc/bugs/Use_a_git_repository_on_the_server_don__39__t_work/comment_4_38bb916ed5b90b92ffa91a452ff052a9._comment create mode 100644 doc/bugs/Use_a_git_repository_on_the_server_don__39__t_work/comment_5_5b6ef464ab1ad061f27122db40191e26._comment create mode 100644 doc/bugs/Use_a_git_repository_on_the_server_don__39__t_work/comment_6_3727bda5082cb1f2b1f746f9f80ced7d._comment create mode 100644 doc/bugs/Use_a_git_repository_on_the_server_don__39__t_work/comment_7_a7139f19f0b73c024cd9218eb01e6104._comment create mode 100644 doc/bugs/Use_a_git_repository_on_the_server_don__39__t_work/comment_8_35c949aca52de83af4881a9da6340185._comment create mode 100644 doc/bugs/Use_a_git_repository_on_the_server_don__39__t_work/comment_9_9100031689eaa460791191d9bfb746d8._comment create mode 100644 doc/bugs/Using_Github_as_remote_throws_proxy_errors.mdwn create mode 100644 doc/bugs/Using_Github_as_remote_throws_proxy_errors/comment_1_10616b17c3fb8286fdc64c841023f8a1._comment create mode 100644 doc/bugs/Using_Github_as_remote_throws_proxy_errors/comment_2_8a72887d33e492a041f8246d93d0c778._comment create mode 100644 doc/bugs/Using_a_revoked_GPG_key.mdwn create mode 100644 doc/bugs/Using_a_revoked_GPG_key/comment_1_7bb01d081282e5b02b7720b2953fe5be._comment create mode 100644 doc/bugs/Using_a_revoked_GPG_key/comment_2_9c0c40360f0058a4bd346c1362e302b6._comment create mode 100644 doc/bugs/Using_a_revoked_GPG_key/comment_3_8f69f58107246595f5603f35c4aa7395._comment create mode 100644 doc/bugs/Using_a_revoked_GPG_key/comment_4_78b3c52ba85edfa6ee6e273bec3bea5c._comment create mode 100644 doc/bugs/Using_a_revoked_GPG_key/comment_5_a85ccf2f09ebe87147f8761b81a02326._comment create mode 100644 doc/bugs/Using_a_revoked_GPG_key/comment_6_8b89eb5e6386acd0a922310c04f863ac._comment create mode 100644 doc/bugs/Using_a_revoked_GPG_key/comment_7_20dc5a7ce7cb6ca97ccdfb923c3b24bb._comment create mode 100644 doc/bugs/Using_a_revoked_GPG_key/comment_8_9dc921dc6077f828454a4444088b9a43._comment create mode 100644 doc/bugs/Using_a_revoked_GPG_key/comment_9_f50c802d78041fd1522f0e7599ce6a45._comment create mode 100644 doc/bugs/WEBDAV_443.mdwn create mode 100644 doc/bugs/WEBDAV_443/comment_10_9ee2c5ed44295455af890caee7b06f1a._comment create mode 100644 doc/bugs/WEBDAV_443/comment_11_863a7d315212c9a8ab8f6fafa5d1b7f5._comment create mode 100644 doc/bugs/WEBDAV_443/comment_12_c17a4e23011e0a917dbe0ecf7e9f0cb5._comment create mode 100644 doc/bugs/WEBDAV_443/comment_13_3414416ff455d2fd1a7c7e7c4554b54d._comment create mode 100644 doc/bugs/WEBDAV_443/comment_14_e1da141eefb0445c217e5f5c119356da._comment create mode 100644 doc/bugs/WEBDAV_443/comment_15_41c3134bcc222b97bf183559723713d9._comment create mode 100644 doc/bugs/WEBDAV_443/comment_16_89621b526065b5bef753ce75db1af7b5._comment create mode 100644 doc/bugs/WEBDAV_443/comment_17_131a1b65c8008cf9f02c93d4fb75720b._comment create mode 100644 doc/bugs/WEBDAV_443/comment_18_b4f894a0b9ebb84ab73f6ffcf0778090._comment create mode 100644 doc/bugs/WEBDAV_443/comment_1_c6572ca1eaaf89b01c0ed99a4058412f._comment create mode 100644 doc/bugs/WEBDAV_443/comment_2_a357969cde382a91e13920ee1e9f711c._comment create mode 100644 doc/bugs/WEBDAV_443/comment_3_213815d6b827d467c60f3e8af925813b._comment create mode 100644 doc/bugs/WEBDAV_443/comment_4_b775be4b722fc7124d9fbe2d5d01cc9f._comment create mode 100644 doc/bugs/WEBDAV_443/comment_5_c4ea745da437e56b2426d1c2c00dfcec._comment create mode 100644 doc/bugs/WEBDAV_443/comment_6_ef05c0ae88fee9c626922c6064ffdf1e._comment create mode 100644 doc/bugs/WEBDAV_443/comment_7_eecabe8d5ed564cb540450770ca7d0b6._comment create mode 100644 doc/bugs/WEBDAV_443/comment_8_7f77ba8ebd90186d3b3949ae529ba393._comment create mode 100644 doc/bugs/WEBDAV_443/comment_9_87ebdc92b48d672964fb3f248c53600f._comment create mode 100644 doc/bugs/WORM:_Handle_long_filenames_correctly.mdwn create mode 100644 doc/bugs/WORM:_Handle_long_filenames_correctly/comment_1_77aa9cafbe20367a41377f3edccc9ddb._comment create mode 100644 doc/bugs/WORM:_Handle_long_filenames_correctly/comment_2_fe735d728878d889ccd34ec12b3a7dea._comment create mode 100644 doc/bugs/WORM:_Handle_long_filenames_correctly/comment_3_2bf0f02d27190578e8f4a32ddb195a0a._comment create mode 100644 doc/bugs/WORM:_Handle_long_filenames_correctly/comment_4_8f7ba9372463863dda5aae13205861bf._comment create mode 100644 doc/bugs/Watch_command_as_of_commit_6cecc26206c4a539999b04664136c6f785211a41_segfaults.mdwn create mode 100644 doc/bugs/Watch_command_as_of_commit_6cecc26206c4a539999b04664136c6f785211a41_segfaults/comment_10_6c872dff4fcc63c16bf69d1e96891c89._comment create mode 100644 doc/bugs/Watch_command_as_of_commit_6cecc26206c4a539999b04664136c6f785211a41_segfaults/comment_1_5cad24007f819e4be193123dab0d511a._comment create mode 100644 doc/bugs/Watch_command_as_of_commit_6cecc26206c4a539999b04664136c6f785211a41_segfaults/comment_2_d449bf656a59d424833f9ab5a7fb4e82._comment create mode 100644 doc/bugs/Watch_command_as_of_commit_6cecc26206c4a539999b04664136c6f785211a41_segfaults/comment_3_ffb1ce41477ad60840abd7a89a133067._comment create mode 100644 doc/bugs/Watch_command_as_of_commit_6cecc26206c4a539999b04664136c6f785211a41_segfaults/comment_4_cebbc138c6861c086bb7937b54f5adbc._comment create mode 100644 doc/bugs/Watch_command_as_of_commit_6cecc26206c4a539999b04664136c6f785211a41_segfaults/comment_5_5e27737a5bb0e9e46c98708700318e67._comment create mode 100644 doc/bugs/Watch_command_as_of_commit_6cecc26206c4a539999b04664136c6f785211a41_segfaults/comment_6_1f92da712232d050e085a4f39063d7a6._comment create mode 100644 doc/bugs/Watch_command_as_of_commit_6cecc26206c4a539999b04664136c6f785211a41_segfaults/comment_7_4153dc8029c545f8e86584a38bd536fb._comment create mode 100644 doc/bugs/Watch_command_as_of_commit_6cecc26206c4a539999b04664136c6f785211a41_segfaults/comment_8_f85b6eb5bfd28ffc6973fb4ab0fe4337._comment create mode 100644 doc/bugs/Watch_command_as_of_commit_6cecc26206c4a539999b04664136c6f785211a41_segfaults/comment_9_c747c488461c98cd285b51d3afc2c3eb._comment create mode 100644 doc/bugs/Watcher_crashed:_addWatch:_does_not_exist.mdwn create mode 100644 doc/bugs/Watcher_crashed:_addWatch:_does_not_exist/comment_1_24f511a8103727894c6e96798a559870._comment create mode 100644 doc/bugs/Watcher_crashed:_addWatch:_does_not_exist/comment_2_e14eddbc09cadbf1e4dbbb0c07e0e5b0._comment create mode 100644 doc/bugs/Watcher_crashed:_addWatch:_does_not_exist/comment_3_513fae4d379008f954a307be8df34976._comment create mode 100644 doc/bugs/Watcher_crashed:_addWatch:_does_not_exist/comment_4_172eaeb3bb8b502379695aba35f96120._comment create mode 100644 doc/bugs/Watcher_crashed:_addWatch:_does_not_exist/comment_5_8adb9de82cc8581422734acc66dd094c._comment create mode 100644 doc/bugs/Watcher_crashed:_addWatch:_does_not_exist/comment_6_02f0beef1188bfa336bf4220eb5c6286._comment create mode 100644 doc/bugs/Watcher_crashed_in_Android_on___47__storage__47__sdcard1_-_bug__63__.mdwn create mode 100644 doc/bugs/Watcher_crashed_in_Android_on___47__storage__47__sdcard1_-_bug__63__/comment_1_71b052be40fbdaca09ca3ede8c59ac7a._comment create mode 100644 doc/bugs/Watcher_crashed_in_Android_on___47__storage__47__sdcard1_-_bug__63__/comment_3_0f7cc02e0193c969c9b6ceb27e71af8a._comment create mode 100644 doc/bugs/Watcher_crashed_in_Android_on___47__storage__47__sdcard1_-_bug__63__/comment_3_1a7542249b9c37507126e97441057c12._comment create mode 100644 doc/bugs/WebDAV_HandshakeFailed_.mdwn create mode 100644 doc/bugs/WebDAV_HandshakeFailed_/comment_1_40499110ea43bc99ad9dd9f642da434c._comment create mode 100644 doc/bugs/WebDAV_HandshakeFailed_/comment_2_506712e8cc5b47b9bd69edf67ae54da7._comment create mode 100644 doc/bugs/WebDAV_HandshakeFailed_/comment_3_5641481d9e9ed2b711b1516f1abc5c30._comment create mode 100644 doc/bugs/WebDAV_HandshakeFailed_/comment_4_1d609de93fa66ce9dc802e67b5922243._comment create mode 100644 doc/bugs/WebDAV_HandshakeFailed_/comment_5_62761882d30c1b02930c938cb8e30ed4._comment create mode 100644 doc/bugs/WebDAV_HandshakeFailed_/comment_6_acda8fae848ec486ce2a0b3dff3bd0a5._comment create mode 100644 doc/bugs/WebDAV_HandshakeFailed_/comment_7_6c51b6c7dd477d8911dd9a7a5c41ea2e._comment create mode 100644 doc/bugs/WebDAV_HandshakeFailed_/comment_8_e834f791d3000669fab25732a7c72ab3._comment create mode 100644 doc/bugs/Webapp_fails_to_resolve_ipv6_hostname.mdwn create mode 100644 doc/bugs/Weird_behaviour_of_direct_and_indirect_annexes.mdwn create mode 100644 doc/bugs/Weird_behaviour_of_direct_and_indirect_annexes/comment_1_56474a69c2f174d83be9137d3c045a47._comment create mode 100644 doc/bugs/Weird_directories_appearing.mdwn create mode 100644 doc/bugs/Weird_directories_appearing/comment_1_989541faf18e476c06e3be94c979e588._comment create mode 100644 doc/bugs/Weird_directories_appearing/comment_2_7aedaa3286a827303d90bd660429f0e7._comment create mode 100644 doc/bugs/Weird_directories_appearing/comment_3_5d3afa17d1e038c66a2cb6400b74aa41._comment create mode 100644 doc/bugs/Weird_directories_appearing/comment_4_8db476bc89d3b9b1fdd82624829b4975._comment create mode 100644 doc/bugs/Weird_directories_appearing/comment_5_4f3a8e3b0201829059c6e7e0cff0ff75._comment create mode 100644 doc/bugs/Weird_directories_appearing/comment_6_1c3218c8858397acc0e9fd718d7fd973._comment create mode 100644 doc/bugs/Weird_directories_appearing/comment_7_9d055063f58042ff048c5b71e9e67f6e._comment create mode 100644 doc/bugs/Weird_directories_appearing/comment_8_b39be0251e96099142b659f3c8340293._comment create mode 100644 doc/bugs/Weird_directories_appearing/comment_9_431c62c81573468ccf99eeed6ecc2bfd._comment create mode 100644 doc/bugs/When_syncing_two_repositories__44___git_annex_uses_9x_times_diskspace.mdwn create mode 100644 doc/bugs/When_syncing_two_repositories__44___git_annex_uses_9x_times_diskspace/comment_0._comment create mode 100644 doc/bugs/When_syncing_two_repositories__44___git_annex_uses_9x_times_diskspace/comment_10_037a6dd6e15ef5f789a1f364f7507b53._comment create mode 100644 doc/bugs/When_syncing_two_repositories__44___git_annex_uses_9x_times_diskspace/comment_11_614e4110188fc6474e7da50fc4281e13._comment create mode 100644 doc/bugs/When_syncing_two_repositories__44___git_annex_uses_9x_times_diskspace/comment_12_dcb74fb91e1c2f0db4efd68c8bcbc96c._comment create mode 100644 doc/bugs/When_syncing_two_repositories__44___git_annex_uses_9x_times_diskspace/comment_14_38671ba8d302f4d32460d1478abd2111._comment create mode 100644 doc/bugs/When_syncing_two_repositories__44___git_annex_uses_9x_times_diskspace/comment_14_483244b1ed5744308022465f45c091fd._comment create mode 100644 doc/bugs/When_syncing_two_repositories__44___git_annex_uses_9x_times_diskspace/comment_1_d2c63723fa4bf828873770a42ffaab20._comment create mode 100644 doc/bugs/When_syncing_two_repositories__44___git_annex_uses_9x_times_diskspace/comment_3_52f0db73dc38c3e3a73f6c7a420bf016._comment create mode 100644 doc/bugs/When_syncing_two_repositories__44___git_annex_uses_9x_times_diskspace/comment_4_93596b4d5a48ffcf4bc11ba9c83cf7ca._comment create mode 100644 doc/bugs/When_syncing_two_repositories__44___git_annex_uses_9x_times_diskspace/comment_5_de94e80dde6d12485140bb079d74d775._comment create mode 100644 doc/bugs/When_syncing_two_repositories__44___git_annex_uses_9x_times_diskspace/comment_6_5f34c3d449247b4bce4665b3ea4d054c._comment create mode 100644 doc/bugs/When_syncing_two_repositories__44___git_annex_uses_9x_times_diskspace/comment_7_b43ae8aec23ba3acaf70edc0de058710._comment create mode 100644 doc/bugs/When_syncing_two_repositories__44___git_annex_uses_9x_times_diskspace/comment_8_13b8e0a62f6b6d02960687e206a8b016._comment create mode 100644 doc/bugs/When_syncing_two_repositories__44___git_annex_uses_9x_times_diskspace/comment_9_818b94a74b01a210d1106dd35bc932d8._comment create mode 100644 doc/bugs/Windows_and_Linux_in_direct_mode_confuses_git.mdwn create mode 100644 doc/bugs/Windows_and_Linux_in_direct_mode_confuses_git/comment_1_155e0c4d3aa41eebfe27533ab70a91d3._comment create mode 100644 doc/bugs/Windows_build_test_failures.mdwn create mode 100644 doc/bugs/Windows_build_test_failures/comment_1_ea7523fdbafdc8be2971df52d9038826._comment create mode 100644 doc/bugs/Windows_installer_includes_curl_and_wget__44___but_not_required_DLLs.mdwn create mode 100644 doc/bugs/Windows_installer_includes_curl_and_wget__44___but_not_required_DLLs/comment_1_a7bf0f027f2209e5632e292afd7214d0._comment create mode 100644 doc/bugs/Windows_to_Linux_clone_-_Windows_drive_letters_cause_git_annex_get_to_fail.mdwn create mode 100644 doc/bugs/Windows_to_Linux_clone_-_Windows_drive_letters_cause_git_annex_get_to_fail/comment_1_c87bae87b7902db60a3fef41e1fca85d._comment create mode 100644 doc/bugs/Windows_to_Linux_clone_-_Windows_drive_letters_cause_git_annex_get_to_fail/comment_2_9e3c1f1ba05d8996b5a95829ce32c07e._comment create mode 100644 doc/bugs/Windows_to_Linux_clone_-_Windows_drive_letters_cause_git_annex_get_to_fail/comment_3_3a0787912f4a3a8797b7786f5ce38590._comment create mode 100644 doc/bugs/Windows_to_Linux_clone_-_Windows_drive_letters_cause_git_annex_get_to_fail/comment_4_c4249f32d65594d79ea01145b93ec948._comment create mode 100644 doc/bugs/With_S3__44___GPG_ask_for_a_new_passphrase.mdwn create mode 100644 doc/bugs/With_S3__44___GPG_ask_for_a_new_passphrase/comment_1_a4fc30bf7d39cae337286e9e815e6cba._comment create mode 100644 doc/bugs/With_S3__44___GPG_ask_for_a_new_passphrase/comment_2_e5d42b623017acedf6a3890ce15680a3._comment create mode 100644 doc/bugs/With_S3__44___GPG_ask_for_a_new_passphrase/comment_3_e5150b65b514896e14b9ad3d951963f7._comment create mode 100644 doc/bugs/With_S3__44___GPG_ask_for_a_new_passphrase/comment_4_47c2fc167b0c396edc40468fb7c7bfee._comment create mode 100644 doc/bugs/Won__39__t_drop_files__44___even_though_remote_annexes_have_at_least_numcopies.mdwn create mode 100644 doc/bugs/Wrong_port_while_configuring_ssh_remote.mdwn create mode 100644 doc/bugs/Zombie_processes_and__47__or_stuck_git_processes.mdwn create mode 100644 doc/bugs/Zombie_processes_and__47__or_stuck_git_processes/comment_1_0f8b248025722309e9577d7dad74b76b._comment create mode 100644 doc/bugs/Zombie_processes_and__47__or_stuck_git_processes/comment_2_f5f7db688a2a93ee7453674fb742043b._comment create mode 100644 doc/bugs/Zombie_processes_and__47__or_stuck_git_processes/comment_3_ffcae976aa3dc2426188797c1aaffb82._comment create mode 100644 doc/bugs/Zombie_processes_and__47__or_stuck_git_processes/comment_4_8a7ff6841ad7c27ead06bf12f46b20a0._comment create mode 100644 doc/bugs/Zombie_processes_and__47__or_stuck_git_processes/comment_5_406fdee0728680774a69d28446163f10._comment create mode 100644 doc/bugs/__34__Adding_4923_files__34___is_really_slow.mdwn create mode 100644 doc/bugs/__34__Adding_4923_files__34___is_really_slow/comment_2_5f3b9f00bc31ce71d695c008971ed7fd._comment create mode 100644 doc/bugs/__34__Adding_4923_files__34___is_really_slow/comment_2_708b02dd06a1eed6b5ded9eb7aa9e7a8._comment create mode 100644 doc/bugs/__34__Adding_4923_files__34___is_really_slow/comment_3_6a735b7875d2a0c92df6786dd649985d._comment create mode 100644 doc/bugs/__34__Adding_4923_files__34___is_really_slow/comment_4_7e768908ba6983ea13af27635c4a947f._comment create mode 100644 doc/bugs/__34__Configuring_Jabber_Account__34___fails_with_a___34__Network_unreachable__34___error..mdwn create mode 100644 doc/bugs/__34__Configuring_Jabber_Account__34___fails_with_a___34__Network_unreachable__34___error./comment_1_6d821af99ab3c83a5b0f52d3713ab8e2._comment create mode 100644 doc/bugs/__34__Configuring_Jabber_Account__34___fails_with_a___34__Network_unreachable__34___error./comment_2_206b6c8cce8350fc088f01c42fc4715b._comment create mode 100644 doc/bugs/__34__Configuring_Jabber_Account__34___fails_with_a___34__Network_unreachable__34___error./comment_3_ed36f503f88611382b50687608b9b7e7._comment create mode 100644 doc/bugs/__34__annex_sync__34___gets_confused_when_operating_in_a_symlink__39__ed_directory.mdwn create mode 100644 doc/bugs/__34__drop__34___deletes_all_files_with_identical_content.mdwn create mode 100644 doc/bugs/__34__drop__34___deletes_all_files_with_identical_content/comment_1_2eb20b65582fa7f271b1d0bb5560d08c._comment create mode 100644 doc/bugs/__34__drop__34___deletes_all_files_with_identical_content/comment_2_b14e1d31dd6a8fb930fcc0bec798e194._comment create mode 100644 doc/bugs/__34__drop__34___deletes_all_files_with_identical_content/comment_3_1892bcfbe3c462aa74552a241d65cad9._comment create mode 100644 doc/bugs/__34__drop__34___deletes_all_files_with_identical_content/comment_4_dfa0e31996eaa14e2945c1d11670c4d9._comment create mode 100644 doc/bugs/__34__drop__34___deletes_all_files_with_identical_content/comment_5_e2a9336cf1080c158765d4adfe72f26b._comment create mode 100644 doc/bugs/__34__fatal:_bad_config_file__34__.mdwn create mode 100644 doc/bugs/__34__git_annex_watch__34___adds_map.dot.mdwn create mode 100644 doc/bugs/__34__make_test__34___fails_silently.mdwn create mode 100644 doc/bugs/__34__make_test__34___fails_silently/comment_1_f868e34f41d828d4571968d1ab07820a._comment create mode 100644 doc/bugs/__34__make_test__34___fails_silently/comment_2_fb9e8e2716b0dea15b0d4807ae7cd114._comment create mode 100644 doc/bugs/__39__Cannot_write_a_repository_there__39___on_Windows.mdwn create mode 100644 doc/bugs/__39__Internal_Server_Error__39___when_creating_repo_on_other_drive_than_C:_on_Windows.mdwn create mode 100644 doc/bugs/__39__Internal_Server_Error__39___when_creating_repo_on_other_drive_than_C:_on_Windows/comment_1_ea3b2c0e3bdfb50ac0dce10ba1b6339f._comment create mode 100644 doc/bugs/__39__annex_add__39___fails_to___39__git_add__39___for_parent_relative_path.mdwn create mode 100644 doc/bugs/__39__client__39___repo_starts_pulling_in___39__archive__39___content.mdwn create mode 100644 doc/bugs/__39__client__39___repo_starts_pulling_in___39__archive__39___content/comment_1_56f9cd5cc2e089b32cb076dc2e2a8ca5._comment create mode 100644 doc/bugs/__39__client__39___repo_starts_pulling_in___39__archive__39___content/comment_2_21c0f7f328cb51080fbd97e086c47a30._comment create mode 100644 doc/bugs/__39__client__39___repo_starts_pulling_in___39__archive__39___content/comment_3_3287b2f25f3b5ae4c27f4748694563ee._comment create mode 100644 doc/bugs/__39__client__39___repo_starts_pulling_in___39__archive__39___content/comment_4_e515eca68a70d40c522805d7e0d7c0e6._comment create mode 100644 doc/bugs/__39__client__39___repo_starts_pulling_in___39__archive__39___content/comment_5_b27f4c103dda050b6e9cf03ea3157abc._comment create mode 100644 doc/bugs/__39__client__39___repo_starts_pulling_in___39__archive__39___content/comment_6_2cc7083dab944705bf91fc00319b75e6._comment create mode 100644 doc/bugs/__39__client__39___repo_starts_pulling_in___39__archive__39___content/comment_7_1175f9be789d4c1907f0be98e435bd2f._comment create mode 100644 doc/bugs/__39__client__39___repo_starts_pulling_in___39__archive__39___content/comment_8_78e6164ef67a9560a3a9ead1f7a72473._comment create mode 100644 doc/bugs/__39__client__39___repo_starts_pulling_in___39__archive__39___content/comment_9_1d578fd13022dcd6382b415a7f6e097a._comment create mode 100644 doc/bugs/__40__assistant__41___dependency_on_ssh-askpass_-_not_installed_automatically_on_xubuntu.mdwn create mode 100644 doc/bugs/__40__assistant__41___dependency_on_ssh-askpass_-_not_installed_automatically_on_xubuntu/comment_1_f4656f8a0f36535def0772db06098c5f._comment create mode 100644 doc/bugs/__91__Installation__93___There_is_no_available_version_of_quickcheck_that_satisfies___62____61__2.1.mdwn create mode 100644 doc/bugs/__91__webapp__93___pause_syncing_with_specific_repository.mdwn create mode 100644 doc/bugs/__91__wishlistAndroid:_bundle_an_ssh_server___40__dropbear__63____41___and_add_an_option_to_start_it_easily_with_the_terminal_app_menu.mdwn create mode 100644 doc/bugs/__91__wishlistAndroid:_bundle_an_ssh_server___40__dropbear__63____41___and_add_an_option_to_start_it_easily_with_the_terminal_app_menu/comment_1_9bb53c45d685b368c7ba1758885f2874._comment create mode 100644 doc/bugs/__91__wishlistAndroid:_bundle_an_ssh_server___40__dropbear__63____41___and_add_an_option_to_start_it_easily_with_the_terminal_app_menu/comment_2_251311a04f1a610e54ebe8e9b92de72e._comment create mode 100644 doc/bugs/__91__wishlistAndroid:_bundle_an_ssh_server___40__dropbear__63____41___and_add_an_option_to_start_it_easily_with_the_terminal_app_menu/comment_3_83ac87a01639776a6e519af226bd84d5._comment create mode 100644 doc/bugs/__92____92___instead_of___47___on_rsync_special_remote_on_linux_accessed_from_a_windows_git-annex.mdwn create mode 100644 doc/bugs/__96__git_annex_add__96___changes_mtime_if_symlinks_are_fixed_in_the_background.mdwn create mode 100644 doc/bugs/__96__git_annex_fix__96___run_on_non-annexed_files_is_no-op.mdwn create mode 100644 doc/bugs/__96__git_annex_fix__96___run_on_non-annexed_files_is_no-op/comment_1_9b671e583eec5adf870dccd1e97b5dbc._comment create mode 100644 doc/bugs/__96__git_annex_fix__96___run_on_non-annexed_files_is_no-op/comment_2_d11744202213d6f897f4234bc4c70c18._comment create mode 100644 doc/bugs/__96__git_annex_fix__96___run_on_non-annexed_files_is_no-op/comment_3_a729deb465ff44f5a9b87c963cd6235a._comment create mode 100644 doc/bugs/__96__git_annex_fix__96___run_on_non-annexed_files_is_no-op/comment_4_3f735503df9a08472d42fabd219c2ec5._comment create mode 100644 doc/bugs/__96__git_annex_fix__96___run_on_non-annexed_files_is_no-op/comment_5_2c61eabbba7fd2a52ba02d59a0a76a42._comment create mode 100644 doc/bugs/__96__git_annex_forget_--drop-dead_--force__96_____95__revives__95___repositories.mdwn create mode 100644 doc/bugs/__96__git_annex_forget_--drop-dead_--force__96_____95__revives__95___repositories/comment_1_930b40e0f68da95d335eea5bd4216126._comment create mode 100644 doc/bugs/__96__git_annex_forget_--drop-dead_--force__96_____95__revives__95___repositories/comment_2_5397d488bc337cb3d7cb46ed774d0437._comment create mode 100644 doc/bugs/__96__git_annex_forget_--drop-dead_--force__96_____95__revives__95___repositories/comment_3_1b30e7611ec824dc6e79ef35e43ac740._comment create mode 100644 doc/bugs/__96__git_annex_import__96___clobbers_mtime.mdwn create mode 100644 doc/bugs/__96__git_annex_import__96___clobbers_mtime/comment_1_d173f2903faf4bff115a0be02c146ce9._comment create mode 100644 doc/bugs/__96__git_annex_import__96___clobbers_mtime/comment_2_3563d9eeb9806f8ca1b9b340925837f5._comment create mode 100644 doc/bugs/__96__git_annex_import__96___clobbers_mtime/comment_3_d5c7488db16b71c4f337662c897278ca._comment create mode 100644 doc/bugs/__96__git_annex_import__96___clobbers_mtime/comment_4_7235130786e764ec3ad5facfecde62da._comment create mode 100644 doc/bugs/__96__git_annex_import__96___does_not_work_on_other_git_annex_repositories.mdwn create mode 100644 doc/bugs/__96__git_annex_import__96___does_not_work_on_other_git_annex_repositories/comment_1_94ccd548c084286163eeb2af1ddc18e3._comment create mode 100644 doc/bugs/__96__git_annex_import__96___does_not_work_on_other_git_annex_repositories/comment_2_befde3ef3d2b171ebb691915ff3af172._comment create mode 100644 doc/bugs/__96__git_annex_sync__96___ignores_remotes.mdwn create mode 100644 doc/bugs/__96__git_annex_sync__96___ignores_remotes/comment_1_39421e6935233cd8f45949ebdef369fe._comment create mode 100644 doc/bugs/__96__git_annex_sync__96___ignores_remotes/comment_2_53fb15d6fbf96d43564ff7c866239d18._comment create mode 100644 doc/bugs/__96__minimal_build__39____fails_due_to_missing_stm_dependency.mdwn create mode 100644 doc/bugs/__96__minimal_build__39____fails_due_to_missing_stm_dependency/comment_1_86e26ee9ec90aa00f25392052737f0f0._comment create mode 100644 doc/bugs/_impossible_to_switch_repositories_on_android__in_webapp.mdwn create mode 100644 doc/bugs/_impossible_to_switch_repositories_on_android__in_webapp/comment_1_d488d71a72eb54d7711d2a867db6172f._comment create mode 100644 doc/bugs/_impossible_to_switch_repositories_on_android__in_webapp/comment_2_85b31db6d0fb2d20018db3d8c8258bf4._comment create mode 100644 doc/bugs/_impossible_to_switch_repositories_on_android__in_webapp/comment_3_9ffafbeb572e110b3e072029d1ce177c._comment create mode 100644 doc/bugs/acl_not_honoured_in_rsync_remote.mdwn create mode 100644 doc/bugs/acl_not_honoured_in_rsync_remote/comment_1_aa6fe1d7b029eae7ee71c97e0f0937a6._comment create mode 100644 doc/bugs/acl_not_honoured_in_rsync_remote/comment_2_ffb9424e966ee10a4fe2d446b3042cb2._comment create mode 100644 doc/bugs/add_range_argument_to___34__git_annex_dropunused__34___.mdwn create mode 100644 doc/bugs/add_script-friendly_output_options.mdwn create mode 100644 doc/bugs/added_branches_makes___39__git_annex_unused__39___slow.mdwn create mode 100644 doc/bugs/added_branches_makes___39__git_annex_unused__39___slow/comment_1_d350c39c67031c500e3224e92c0029ea._comment create mode 100644 doc/bugs/added_branches_makes___39__git_annex_unused__39___slow/comment_2_b2d2b1caa51ffec3d87c36b373cb8d4a._comment create mode 100644 doc/bugs/added_branches_makes___39__git_annex_unused__39___slow/comment_3_12b20cbbc2b4cd1ab8af7e3eec9589b4._comment create mode 100644 doc/bugs/added_branches_makes___39__git_annex_unused__39___slow/comment_4_a50b43c15d2650df90f0fa1ced47f532._comment create mode 100644 doc/bugs/added_branches_makes___39__git_annex_unused__39___slow/comment_5_7328bc51bd001f2b732a92a2ae175839._comment create mode 100644 doc/bugs/added_branches_makes___39__git_annex_unused__39___slow/comment_6_880ef2ee797221332dbb629b2d55522f._comment create mode 100644 doc/bugs/added_branches_makes___39__git_annex_unused__39___slow/comment_7_826fd82cdf9b1c79c9b555ca26c2c176._comment create mode 100644 doc/bugs/adding_an_rsync.net_repo_give_an_gpg_error.mdwn create mode 100644 doc/bugs/adding_an_rsync.net_repo_give_an_gpg_error/comment_1_f55cfc133be72ac10cae93c877c487df._comment create mode 100644 doc/bugs/adding_an_rsync.net_repo_give_an_gpg_error/comment_2_24dd024ac4b21a82a781343b8fe3891e._comment create mode 100644 doc/bugs/addurl:___34__rename:_does_not_exist__34___and_reports_fail__44___but_succeeds.mdwn create mode 100644 doc/bugs/addurl:___34__rename:_does_not_exist__34___and_reports_fail__44___but_succeeds/comment_1_1f5e0bc93631baf0f8c1bec2e68493c5._comment create mode 100644 doc/bugs/addurl_--relaxed_with_--file_doesn__39__t_actually_relax.mdwn create mode 100644 doc/bugs/addurl_fails_on_the_internet_archive.mdwn create mode 100644 doc/bugs/addurl_fails_on_the_internet_archive/comment_1_e227aa25eea0b41f1176037a601c5844._comment create mode 100644 doc/bugs/addurl_fails_on_the_internet_archive/comment_2_6d4fd58f0caa1f75ee2dd3f0a909cd91._comment create mode 100644 doc/bugs/addurl_file_doesn__39__t_work_with_spaces_in_filenames_and_--fast.mdwn create mode 100644 doc/bugs/addurl_file_doesn__39__t_work_with_spaces_in_filenames_and_--fast/comment_1_eea9477ea1157cb88c8a07d8da5f0dba._comment create mode 100644 doc/bugs/allows_repository_with_the_same_name_twice.mdwn create mode 100644 doc/bugs/allows_repository_with_the_same_name_twice/comment_1_ba7801403e7138684704a3471c8bc4a6._comment create mode 100644 doc/bugs/allows_repository_with_the_same_name_twice/comment_2_8c19a4ddedbe7ddb8bdcf84acac68cc8._comment create mode 100644 doc/bugs/amd64_i386_standalone:_no_SKEIN.mdwn create mode 100644 doc/bugs/amd64_i386_standalone:_no_SKEIN/comment_1_fcf7e1089b25993378df7574ccee8062._comment create mode 100644 doc/bugs/amd64_standalone:_ld-linux-x86-64.so.2:_not_found.mdwn create mode 100644 doc/bugs/amd64_standalone:_ld-linux-x86-64.so.2:_not_found/comment_1_5e40f32caf9c1177a5f7b9883cdcc6dd._comment create mode 100644 doc/bugs/android:_high_CPU_usage__44___unclear_how_to_quit.mdwn create mode 100644 doc/bugs/android:_high_CPU_usage__44___unclear_how_to_quit/comment_10_1d841ff0b0ffd814efed2449dc1f35f3._comment create mode 100644 doc/bugs/android:_high_CPU_usage__44___unclear_how_to_quit/comment_10_cd101e0af45d8f463011fb0d04b3b822._comment create mode 100644 doc/bugs/android:_high_CPU_usage__44___unclear_how_to_quit/comment_11_8595041cfe703d9bea49e792732dc15f._comment create mode 100644 doc/bugs/android:_high_CPU_usage__44___unclear_how_to_quit/comment_1_8e7bc6965ea967a8d43240791a30c5bc._comment create mode 100644 doc/bugs/android:_high_CPU_usage__44___unclear_how_to_quit/comment_2_891c1073f908b204651899d41599f944._comment create mode 100644 doc/bugs/android:_high_CPU_usage__44___unclear_how_to_quit/comment_3_de02b8f1b5928fa1a7078c4aa2124bea._comment create mode 100644 doc/bugs/android:_high_CPU_usage__44___unclear_how_to_quit/comment_6_506acc4275a81ed9e9b08e8a40fcf96a._comment create mode 100644 doc/bugs/android:_high_CPU_usage__44___unclear_how_to_quit/comment_7_d38d6f40db4c9437764c7b2ddf36b5a9._comment create mode 100644 doc/bugs/android:_high_CPU_usage__44___unclear_how_to_quit/comment_8_9bb23e9cbc77ecca4b1209b0f66bc2b0._comment create mode 100644 doc/bugs/android:_high_CPU_usage__44___unclear_how_to_quit/comment_9_d1ce7fc251db076da61eed5bb9d71b9a._comment create mode 100644 doc/bugs/android:_high_CPU_usage__44___unclear_how_to_quit/comment_9_feb71c1022ff65d82e66a3958a41dfb2._comment create mode 100644 doc/bugs/android_4.2.1__44___galaxy_nexus_java.lang.SecurityException.mdwn create mode 100644 doc/bugs/android_cannot_get_from_5.20131221.mdwn create mode 100644 doc/bugs/android_cannot_get_from_5.20131221/comment_1_f8eeb67e58bf2a4658dcc32a9f275f19._comment create mode 100644 doc/bugs/android_cannot_get_from_5.20131221/comment_2_eba841b1978c70a4c20a8d96c9f71172._comment create mode 100644 doc/bugs/android_cannot_get_from_5.20131221/comment_3_4ba8208822c7f66e23037564b3501391._comment create mode 100644 doc/bugs/annex-rsync-options_shell-split_carelessly.mdwn create mode 100644 doc/bugs/annex-rsync-options_shell-split_carelessly/comment_1_2636e0d224317f2e6db94658d8a094c4._comment create mode 100644 doc/bugs/annex.numcopies_not_overriden_by_--numcopies_option.mdwn create mode 100644 doc/bugs/annex_add_in_annex.mdwn create mode 100644 doc/bugs/annex_get_fails:___34__No_such_file_or_directory__34__.mdwn create mode 100644 doc/bugs/annex_get_over_SSH_is_very_slow.mdwn create mode 100644 doc/bugs/annex_seems_to_ignore_core.bare_setting.mdwn create mode 100644 doc/bugs/annex_seems_to_ignore_core.bare_setting/comment_1_beb674205f06310f6a9060bea35fa3fe._comment create mode 100644 doc/bugs/annex_seems_to_ignore_core.bare_setting/comment_2_bc5a4be517409f8da2f36299dc4cbbde._comment create mode 100644 doc/bugs/annex_unannex__47__uninit_should_handle_copies.mdwn create mode 100644 doc/bugs/annex_unannex__47__uninit_should_handle_copies/comment_1_c896ff6589f62178b60e606771e4f2bf._comment create mode 100644 doc/bugs/annex_unannex__47__uninit_should_handle_copies/comment_2_9249609f83f8e9c7521cd2f007c1a39e._comment create mode 100644 doc/bugs/another_build_error_in_assistant.mdwn create mode 100644 doc/bugs/archiving_git_repositories.mdwn create mode 100644 doc/bugs/archiving_git_repositories/comment_1_51f546a571303118446a9e0b3e6482c9._comment create mode 100644 doc/bugs/arm_build:_ssh:_error_while_loading_shared_libraries:_libselinux.so.1.mdwn create mode 100644 doc/bugs/arm_build:_ssh:_error_while_loading_shared_libraries:_libselinux.so.1/comment_1_ccc2c90d05862edda9ce1ac92efab516._comment create mode 100644 doc/bugs/arm_build:_ssh:_error_while_loading_shared_libraries:_libselinux.so.1/comment_2_1cdf6de88c7f121c604177593915e626._comment create mode 100644 doc/bugs/armel_standalone:_git-upload-pack_and_-receive-pack_not_shimmed.mdwn create mode 100644 doc/bugs/armel_standalone:_git-upload-pack_and_-receive-pack_not_shimmed/comment_1_403f1058c3eab5c95fefab5a96aa3f51._comment create mode 100644 doc/bugs/assistant_-_GTalk_collision.mdwn create mode 100644 doc/bugs/assistant_-_GTalk_collision/comment_1_ab2c1f36113d40f27e1893d32f214296._comment create mode 100644 doc/bugs/assistant_-_GTalk_collision/comment_2_91dff34c629a3b3a97a2313ff077e4ae._comment create mode 100644 doc/bugs/assistant_-_GTalk_collision/comment_3_fefb73f6e570f96b4d82779d6622f690._comment create mode 100644 doc/bugs/assistant___40__OS_X_Lion__41___-___34__too_many_open_files__34___error.mdwn create mode 100644 doc/bugs/assistant___40__OS_X_Lion__41___-___34__too_many_open_files__34___error/comment_1_9904c30a4c24a699d71e90ce5e9b89cf._comment create mode 100644 doc/bugs/assistant_always_assumes_port_22__63__.mdwn create mode 100644 doc/bugs/assistant_bails_when_adding_encrypted_usbdrive_repo_on_mac.mdwn create mode 100644 doc/bugs/assistant_bails_when_adding_encrypted_usbdrive_repo_on_mac/comment_1_4ea192e57f86a33087997746722e6acf._comment create mode 100644 doc/bugs/assistant_bails_when_adding_encrypted_usbdrive_repo_on_mac/comment_2_622ad5b34780fc8468c5c515ad9f27fa._comment create mode 100644 doc/bugs/assistant_cannot_set_up_remote_repo_via_an_ssh_alias_or_an_ip_address/comment_1_1650539846521ae11837e4ac73348af6._comment create mode 100644 doc/bugs/assistant_cannot_set_up_remote_repo_via_an_ssh_alias_or_an_ip_address/comment_2_b91415e4ee74eb12bc6e6faddd00af6e._comment create mode 100644 doc/bugs/assistant_creating_.git_directory_inside_bare_repo.mdwn create mode 100644 doc/bugs/assistant_creating_.git_directory_inside_bare_repo/comment_1_675210444f7801eb8c2c455a5accf8e9._comment create mode 100644 doc/bugs/assistant_creating_.git_directory_inside_bare_repo/comment_2_d7f1378bc75e7a8be9da2585acc6fd63._comment create mode 100644 doc/bugs/assistant_does_not_allow_adding_an_existing_repo.mdwn create mode 100644 doc/bugs/assistant_does_not_allow_adding_an_existing_repo/comment_1_87e84d56d56abefe8cac8a52b76c9003._comment create mode 100644 doc/bugs/assistant_does_not_always_use_repo_cost_info_when_queueing_downloads.mdwn create mode 100644 doc/bugs/assistant_does_not_list_remote___39__origin__39__.mdwn create mode 100644 doc/bugs/assistant_does_not_list_remote___39__origin__39__/comment_1_ffa008240c61b50396aa92f467731db6._comment create mode 100644 doc/bugs/assistant_does_not_list_remote___39__origin__39__/comment_2_a53f80090bc2a0f32b8d8307cb24b563._comment create mode 100644 doc/bugs/assistant_does_not_warn_on_files_it_failed_to_add.mdwn create mode 100644 doc/bugs/assistant_does_not_warn_on_files_it_failed_to_add/comment_1_13b2f93b7d09c8fd6c22829a0dc6428b._comment create mode 100644 doc/bugs/assistant_does_not_warn_on_files_it_failed_to_add/comment_2_94e46bc0044b8a91a9fd51058825aa8f._comment create mode 100644 doc/bugs/assistant_does_not_warn_on_files_it_failed_to_add/comment_3_10a38bdbf31dd4071e4bc4ac746d9c56._comment create mode 100644 doc/bugs/assistant_does_not_warn_on_files_it_failed_to_add/comment_4_b8fdf502c7e80aece5a9544a2078c85c._comment create mode 100644 doc/bugs/assistant_does_not_warn_on_files_it_failed_to_add/comment_5_a2ff7668f2a0d549b362d7de97fac8a1._comment create mode 100644 doc/bugs/assistant_does_not_warn_on_files_it_failed_to_add/comment_6_60d72f34a6cfd1c081f74aa610f4305a._comment create mode 100644 doc/bugs/assistant_does_not_warn_on_files_it_failed_to_add/comment_7_53a73e662c9356b759fbfa1e5a3bd927._comment create mode 100644 doc/bugs/assistant_does_not_warn_on_files_it_failed_to_add/comment_8_10b65168b6a54d960427966d7e3d05f5._comment create mode 100644 doc/bugs/assistant_does_not_warn_on_files_it_failed_to_add/comment_9_b640e8fa6aafb041d66bbf8857a8fa3d._comment create mode 100644 doc/bugs/assistant_doesn__39__t_sync_empty_directories.mdwn create mode 100644 doc/bugs/assistant_doesn__39__t_sync_empty_directories/comment_1_78a3bde607f43c0f518bd2d3d7196022._comment create mode 100644 doc/bugs/assistant_doesn__39__t_sync_empty_directories/comment_2_83777384b72732b1d0a19b32686d3d1f._comment create mode 100644 doc/bugs/assistant_doesn__39__t_sync_empty_directories/comment_3_f9b2a700c060707fae1bcb2ec0e4e4dc._comment create mode 100644 doc/bugs/assistant_doesn__39__t_sync_empty_directories/comment_4_014d213a959dd7993bdd247722a8817e._comment create mode 100644 doc/bugs/assistant_doesn__39__t_sync_empty_directories/comment_5_440f349781d7d9ca2d1ed81386f7dd26._comment create mode 100644 doc/bugs/assistant_doesn__39__t_sync_file_permissions.mdwn create mode 100644 doc/bugs/assistant_doesn__39__t_sync_file_permissions/comment_1_fc8d3ea209a2ab39c1aeff52452d4c58._comment create mode 100644 doc/bugs/assistant_doesn__39__t_sync_file_permissions/comment_2_1a364c422e0dd7418f74e1cc3d543a3c._comment create mode 100644 doc/bugs/assistant_doesn__39__t_sync_file_permissions/comment_3_4d5ae51b4c7e6177d934d7c9f21b912c._comment create mode 100644 doc/bugs/assistant_doesn__39__t_sync_file_permissions/comment_4_ec7b491ad3c9a1f253d886682bff8b82._comment create mode 100644 doc/bugs/assistant_doesn__39__t_sync_file_permissions/comment_5_e04ddcd7a3d260c1dac54e41911bb4bc._comment create mode 100644 doc/bugs/assistant_eats_all_CPU.mdwn create mode 100644 doc/bugs/assistant_eats_all_CPU/comment_10_4a9f149048e387e0a8b4ebb0838decfd._comment create mode 100644 doc/bugs/assistant_eats_all_CPU/comment_11_98be30621a8a435ed54662f7ea9654b4._comment create mode 100644 doc/bugs/assistant_eats_all_CPU/comment_12_a7d7141b81e73a989eb5c1233bcd1478._comment create mode 100644 doc/bugs/assistant_eats_all_CPU/comment_13_60f95e6e5d52f03727bd41f8419c9384._comment create mode 100644 doc/bugs/assistant_eats_all_CPU/comment_14_a6d039ba95f92d9d0c3a343165ba7991._comment create mode 100644 doc/bugs/assistant_eats_all_CPU/comment_15_b7f9a8e214eefc3a6976065782157e81._comment create mode 100644 doc/bugs/assistant_eats_all_CPU/comment_16_16382708d1683a7a9eaaf953f3cdb735._comment create mode 100644 doc/bugs/assistant_eats_all_CPU/comment_17_bfa64822ad9b48fbd4d06c3e3a185b59._comment create mode 100644 doc/bugs/assistant_eats_all_CPU/comment_18_970899faca972af6795ae0d3be1ce444._comment create mode 100644 doc/bugs/assistant_eats_all_CPU/comment_19_2b8241800ae265260506ac9c73cca209._comment create mode 100644 doc/bugs/assistant_eats_all_CPU/comment_1_847ff393fe3a0227d61440f6be899907._comment create mode 100644 doc/bugs/assistant_eats_all_CPU/comment_20_1d9020679d66e6b4742df067cb9da4f1._comment create mode 100644 doc/bugs/assistant_eats_all_CPU/comment_21_8ce65a701604b9d13941844c62f62f23._comment create mode 100644 doc/bugs/assistant_eats_all_CPU/comment_22_0d8de9a8e4b8e2ef3b9c7d839fbcad0c._comment create mode 100644 doc/bugs/assistant_eats_all_CPU/comment_2_0d577d5ca22df14dadf21d4a1a5f9474._comment create mode 100644 doc/bugs/assistant_eats_all_CPU/comment_3_498eee32426dfbaf9bda59a7c0f6fcc9._comment create mode 100644 doc/bugs/assistant_eats_all_CPU/comment_4_ce85b4715a2f7315b68bed62e26d4f0e._comment create mode 100644 doc/bugs/assistant_eats_all_CPU/comment_5_8cf846b9b7bd1c70a006163a9cc2d9de._comment create mode 100644 doc/bugs/assistant_eats_all_CPU/comment_6_a7c9f3262b6eca6258ba53324d321a7a._comment create mode 100644 doc/bugs/assistant_eats_all_CPU/comment_7_340414e9c19903b16ab617d075fbb94e._comment create mode 100644 doc/bugs/assistant_eats_all_CPU/comment_8_e87dbb572eaf234bbaf48ed6790ab1fe._comment create mode 100644 doc/bugs/assistant_eats_all_CPU/comment_9_1c129c924ef3a4a594de6580cf4224c7._comment create mode 100644 doc/bugs/assistant_fails_to_sync_in_preferred_content_mode_manual.mdwn create mode 100644 doc/bugs/assistant_fails_to_sync_in_preferred_content_mode_manual/comment_1_37acb3afafb1b4c4da7c778130cf3035._comment create mode 100644 doc/bugs/assistant_fails_to_sync_in_preferred_content_mode_manual/comment_2_9d58887ee0184663852bde83b8d497c7._comment create mode 100644 doc/bugs/assistant_fails_to_sync_in_preferred_content_mode_manual/comment_3_b70881c8026e30fd3ddc051bd01a888b._comment create mode 100644 doc/bugs/assistant_fails_to_sync_in_preferred_content_mode_manual/comment_4_43f756e2e6ff985c8e050da0e369d486._comment create mode 100644 doc/bugs/assistant_fails_to_sync_in_preferred_content_mode_manual/comment_5_eda947eb7f8c46b9a61d6430b5f9ebfd._comment create mode 100644 doc/bugs/assistant_hangs_during_commit.mdwn create mode 100644 doc/bugs/assistant_hangs_during_commit/comment_1_aacc15c589d2795254387e427b3afe0c._comment create mode 100644 doc/bugs/assistant_hangs_during_commit/comment_2_b9f1bf9fa919603dca28182c80d39a11._comment create mode 100644 doc/bugs/assistant_hangs_during_commit/comment_3_fb5be10fcf5e7c89da5c34f48539612f._comment create mode 100644 doc/bugs/assistant_hangs_during_commit/comment_4_9ba7efe9112578729d02ac4e6557b3cc._comment create mode 100644 doc/bugs/assistant_hangs_during_commit/comment_5_73b24c901c73d41e0e0abe91267d4920._comment create mode 100644 doc/bugs/assistant_hangs_during_commit/comment_6_1a30b8c82e58222f1366aa368c23e6d3._comment create mode 100644 doc/bugs/assistant_hangs_during_commit/comment_7_56868b2a504ad0a60e8a8c1928330175._comment create mode 100644 doc/bugs/assistant_ignore_.gitignore.mdwn create mode 100644 doc/bugs/assistant_ignore_.gitignore/comment_1_3458b1342cb2e3ccc01eeedc7f0e48fc._comment create mode 100644 doc/bugs/assistant_ignore_.gitignore/comment_2_22f75af80c779dcb4d6033b90373f74e._comment create mode 100644 doc/bugs/assistant_ignore_.gitignore/comment_3_8b2a400e1d44a1c9b183e2b7861efbe3._comment create mode 100644 doc/bugs/assistant_ignores___34__manual__34___group__44___tries_to_transfer_files.mdwn create mode 100644 doc/bugs/assistant_ignores___34__manual__34___group__44___tries_to_transfer_files/comment_1_e3f545d9adc27a4e7340bf16177c4fe0._comment create mode 100644 doc/bugs/assistant_ignores___34__manual__34___group__44___tries_to_transfer_files/comment_2_1403076dbc47733607f0c8b2856e2381._comment create mode 100644 doc/bugs/assistant_ignores___34__manual__34___group__44___tries_to_transfer_files/comment_3_af83717bfb260bea6d52ff71c6b34743._comment create mode 100644 doc/bugs/assistant_ignores___34__manual__34___group__44___tries_to_transfer_files/comment_4_b4f811611d14e7392009c539fa6b8574._comment create mode 100644 doc/bugs/assistant_listens_on_127.0.0.1_not_::1_which_breaks_IPv6_enabled_hosts.mdwn create mode 100644 doc/bugs/assistant_listens_on_127.0.0.1_not_::1_which_breaks_IPv6_enabled_hosts/comment_1_91a62a2ce14a1027d2ac8b8e88df5f0c._comment create mode 100644 doc/bugs/assistant_listens_on_127.0.0.1_not_::1_which_breaks_IPv6_enabled_hosts/comment_2_4982cd373eaaeee180be03c6e9fda7b1._comment create mode 100644 doc/bugs/assistant_listens_on_127.0.0.1_not_::1_which_breaks_IPv6_enabled_hosts/comment_3_85d264e311acaa91dac0597ee8deda82._comment create mode 100644 doc/bugs/assistant_locked_my_files.mdwn create mode 100644 doc/bugs/assistant_locked_my_files/comment_1_74ee7ea12df7bfbb44c9d0485f787b73._comment create mode 100644 doc/bugs/assistant_not_noticing_file_renames__44___not_fixing_files.mdwn create mode 100644 doc/bugs/assistant_not_noticing_file_renames__44___not_fixing_files/comment_1_e0dafc410ffd617d445bb9403c7bfafe._comment create mode 100644 doc/bugs/assistant_not_noticing_file_renames__44___not_fixing_files/comment_2_2af247c8a1fcbde10795a990ef3303e9._comment create mode 100644 doc/bugs/assistant_on_windows_adding_remote_containing_linux_paths.mdwn create mode 100644 doc/bugs/assistant_should_set_up_dedicated_ssh_keys_for_remotes_using_the_standalone_tarball.mdwn create mode 100644 doc/bugs/assistant_syncs_with_remotes_even_when_all_remotes_disabled.mdwn create mode 100644 doc/bugs/assistant_unable_to_auth___40__windows__41__.mdwn create mode 100644 doc/bugs/assistant_unable_to_auth___40__windows__41__/comment_1_3128b025d15d3af6e9c8725d4659cdfa._comment create mode 100644 doc/bugs/assistant_unable_to_auth___40__windows__41__/comment_2_e0b64ab2d19f0b0afbd466aad22c4df9._comment create mode 100644 doc/bugs/assistant_using_the_incorrect_path_on_windows__63__.mdwn create mode 100644 doc/bugs/assistant_using_the_incorrect_path_on_windows__63__/comment_1_68be9ee77cc89fb72a4abc944f1da41d._comment create mode 100644 doc/bugs/assistant_using_the_incorrect_path_on_windows__63__/comment_2_6530d67e7d94ccbea9ce11ba1445035e._comment create mode 100644 doc/bugs/assistant_using_the_incorrect_path_on_windows__63__/comment_3_682556a8182abd5bd6abb57b519d4c76._comment create mode 100644 doc/bugs/assistant_using_the_incorrect_path_on_windows__63__/comment_4_331cdacb099a8c7b170c37715bbca895._comment create mode 100644 doc/bugs/assistant_wants_my_gpg_passphrase_when_it_has_nothing_to_drop_or_copy_to_that_remote.mdwn create mode 100644 doc/bugs/assistant_wants_my_gpg_passphrase_when_it_has_nothing_to_drop_or_copy_to_that_remote/comment_1_10a9570a5d762ba2da271b38dc63edb6._comment create mode 100644 doc/bugs/assistant_wants_my_gpg_passphrase_when_it_has_nothing_to_drop_or_copy_to_that_remote/comment_2_57d50955b038c2e2405068536c7e83f3._comment create mode 100644 doc/bugs/assistant_wants_my_gpg_passphrase_when_it_has_nothing_to_drop_or_copy_to_that_remote/comment_3_a66f34daaba421c87eb404ef933e5191._comment create mode 100644 doc/bugs/assistant_wants_my_gpg_passphrase_when_it_has_nothing_to_drop_or_copy_to_that_remote/comment_4_094a3272eca1c6d2b4d264911ffe96e5._comment create mode 100644 doc/bugs/assistant_wants_my_gpg_passphrase_when_it_has_nothing_to_drop_or_copy_to_that_remote/comment_5_0161410d042a3421addd4a1fc7c1cd01._comment create mode 100644 doc/bugs/authentication_to_rsync.net_fails.mdwn create mode 100644 doc/bugs/authentication_to_rsync.net_fails/comment_1_9db65f89415c8d825f268afb75244998._comment create mode 100644 doc/bugs/backend_version_upgrade_leaves_repo_unusable.mdwn create mode 100644 doc/bugs/bad_behaviour_with_file_names_with_newline_in_them.mdwn create mode 100644 doc/bugs/bad_behaviour_with_file_names_with_newline_in_them/comment_1_92dfe6e9089c79eb64e2177fb135ef55._comment create mode 100644 doc/bugs/bad_comment_in_ssh_public_key_ssh-rsa.mdwn create mode 100644 doc/bugs/bad_comment_in_ssh_public_key_ssh-rsa/comment_1_15cce6e6f455e83f4362a38c561bc973._comment create mode 100644 doc/bugs/bad_comment_in_ssh_public_key_ssh-rsa/comment_2_e9e1f38880a32610b3fbce475bffc3e4._comment create mode 100644 doc/bugs/bad_comment_in_ssh_public_key_ssh-rsa/comment_3_51da7f5881f65422328d341e5ab0d250._comment create mode 100644 doc/bugs/bad_comment_in_ssh_public_key_ssh-rsa/comment_4_ba384314c1e47ec4b72e1843e0500df9._comment create mode 100644 doc/bugs/bare_git_repos.mdwn create mode 100644 doc/bugs/box.com_never_stops_syncing..mdwn create mode 100644 doc/bugs/box.com_never_stops_syncing./comment_1_124a5edcd89cc6b61e1a41f5b4d640d7._comment create mode 100644 doc/bugs/box.com_never_stops_syncing./comment_2_42574181aa721319ba54eadf0a15ddff._comment create mode 100644 doc/bugs/box.com_never_stops_syncing./comment_3_2ad727849070cfd52d6c719478e9cce3._comment create mode 100644 doc/bugs/box.com_never_stops_syncing./comment_4_83ce23e45f5a5845d4f04519ee14ec65._comment create mode 100644 doc/bugs/box.com_never_stops_syncing./comment_5_ef1c9d87b04db5047ab72167d3269687._comment create mode 100644 doc/bugs/box.com_never_stops_syncing./comment_6_c9cb39eba941678035f9b2888da1085c._comment create mode 100644 doc/bugs/box.com_never_stops_syncing./comment_7_4b0632a4e37c96959a8e6434e9fd86fb._comment create mode 100644 doc/bugs/box.com_never_stops_syncing./comment_8_d9d318b8c958de6031ae323da20af625._comment create mode 100644 doc/bugs/box.com_never_stops_syncing./comment_9_689ac6a4a305197cf5566f98dab47b4b._comment create mode 100644 doc/bugs/broken_git_annex_map_on_direct_mode.mdwn create mode 100644 doc/bugs/bug_in_download_prebuilt_linux_tarball__44___and_constraints_issues_with_3.20121112.mdwn create mode 100644 doc/bugs/build_fails_in_Assistant__47__WebApp__47__Gpg.hs.mdwn create mode 100644 doc/bugs/build_failure_with_kqueue_code__44___first_commit_that_breaks_is_3dce75fb23fca94ad86c3f0ee816bb0ad2ecb27c.mdwn create mode 100644 doc/bugs/build_is_broken_at_commit_cc0e5b7.mdwn create mode 100644 doc/bugs/build_issue_with_8baff14054e65ecbe801eb66786a55fa5245cb30.mdwn create mode 100644 doc/bugs/build_issue_with_latest_release_0.20110522-1-gde817ba.mdwn create mode 100644 doc/bugs/build_problem_on_OSX.mdwn create mode 100644 doc/bugs/building_on_lenny.mdwn create mode 100644 doc/bugs/bup_initremote_failed_with_localhost_+_username.mdwn create mode 100644 doc/bugs/bup_initremote_failed_with_localhost_+_username/comment_1_0e669c3039b089fa8a815d3ec11465d2._comment create mode 100644 doc/bugs/cabal_build:___34__Could_not_find_module___96__Data.AssocList__39____34__.mdwn create mode 100644 doc/bugs/cabal_build:___34__Could_not_find_module___96__Data.AssocList__39____34__/comment_1_0da9fd67c3cc01b316f95a1df4eb62ae._comment create mode 100644 doc/bugs/cabal_configure_is_broken_on_OSX_builds.mdwn create mode 100644 doc/bugs/cabal_install_fails_to_install_manpage.mdwn create mode 100644 doc/bugs/cabal_install_on_Ubuntu_12.04_fails_with_complaint_about_regex-base.mdwn create mode 100644 doc/bugs/call_to_git-annex-shell_when_on_centralised___40__non-git-annex__41___repository.mdwn create mode 100644 doc/bugs/call_to_git-annex-shell_when_on_centralised___40__non-git-annex__41___repository/comment_1_dd202a7764d9df998868d595a86ffb21._comment create mode 100644 doc/bugs/call_to_git-annex-shell_when_on_centralised___40__non-git-annex__41___repository/comment_2_ca065c82ac8e3215b581660f3e44f459._comment create mode 100644 doc/bugs/call_to_git-annex-shell_when_on_centralised___40__non-git-annex__41___repository/comment_3_927a01f9961c71bedb42c519a31b5fe5._comment create mode 100644 doc/bugs/can__39__t_annex_get_from_annex_in_direct_mode.mdwn create mode 100644 doc/bugs/can__39__t_annex_get_from_annex_in_direct_mode/comment_1_20c31a844d8351a99cf69e05d2836e0e._comment create mode 100644 doc/bugs/can__39__t_annex_get_from_annex_in_direct_mode/comment_2_f26e0f763f9027d9dfc08cd840ced153._comment create mode 100644 doc/bugs/can__39__t_drop_unused_files_that_never_were_added.mdwn create mode 100644 doc/bugs/can__39__t_get.mdwn create mode 100644 doc/bugs/can__39__t_get/comment_1_ef32287828481c161bd913c9db9052a5._comment create mode 100644 doc/bugs/can__39__t_get/comment_2_31fe400f4bac516a5c1101612cb06a54._comment create mode 100644 doc/bugs/can__39__t_get/comment_3_87d123c04815d38abb92f967829c3a23._comment create mode 100644 doc/bugs/can__39__t_get/comment_4_b99cff87dbe38f08f888200dfe7e2436._comment create mode 100644 doc/bugs/can__39__t_run_the_assistant_from_the_command_line_anymore__63__.mdwn create mode 100644 doc/bugs/can_not_add_ssh_remote_to_assistant_with___34__host:port__34___syntax.mdwn create mode 100644 doc/bugs/can_not_add_ssh_remote_to_assistant_with___34__host:port__34___syntax/comment_1_397eb359c3f8ef30460a9556b6f55848._comment create mode 100644 doc/bugs/cannot_add_file__44___get___34__user_error__34__.mdwn create mode 100644 doc/bugs/cannot_add_file__44___get___34__user_error__34__/comment_1_14aa717c1befcbbf526f25ca2f0af825._comment create mode 100644 doc/bugs/cannot_add_file__44___get___34__user_error__34__/comment_2_7f7ac59e7f3dce9d7a7d0c3379c2edcf._comment create mode 100644 doc/bugs/cannot_add_file__44___get___34__user_error__34__/comment_3_5ebf03120b12edb3fbb8954546e7603e._comment create mode 100644 doc/bugs/cannot_add_file__44___get___34__user_error__34__/comment_4_1ba6d2614778949520b47896fd98b598._comment create mode 100644 doc/bugs/cannot_add_file__44___get___34__user_error__34__/comment_5_4a6e55861a63b350a02edb888b4da99b._comment create mode 100644 doc/bugs/cannot_connect_to_xmpp_server.mdwn create mode 100644 doc/bugs/cannot_connect_to_xmpp_server/comment_10_5072de8fcca9fe70bc235ea8c8ee2877._comment create mode 100644 doc/bugs/cannot_connect_to_xmpp_server/comment_11_dabd74bba1f38b326a2d0c86d3027cd9._comment create mode 100644 doc/bugs/cannot_connect_to_xmpp_server/comment_12_0245b426cc0ab64f8c167b8806b03f5d._comment create mode 100644 doc/bugs/cannot_connect_to_xmpp_server/comment_1_307df11b5bcf289d7999e1e7f7c461c9._comment create mode 100644 doc/bugs/cannot_connect_to_xmpp_server/comment_2_f24378cf30a7d32594da90749fabec3c._comment create mode 100644 doc/bugs/cannot_connect_to_xmpp_server/comment_3_4b07093be844ac62b611cee1dfde5aa7._comment create mode 100644 doc/bugs/cannot_connect_to_xmpp_server/comment_4_fe1ed152a485c4aebfa9b9f300101835._comment create mode 100644 doc/bugs/cannot_connect_to_xmpp_server/comment_5_2d311f520aee04287df6bddfd8535734._comment create mode 100644 doc/bugs/cannot_connect_to_xmpp_server/comment_6_d9f916f012184738446c5996ee9d2270._comment create mode 100644 doc/bugs/cannot_connect_to_xmpp_server/comment_7_0b5f9350e2367301241c7668a15815ef._comment create mode 100644 doc/bugs/cannot_connect_to_xmpp_server/comment_8_f00b6ae154004e405f0bd23b7359962e._comment create mode 100644 doc/bugs/cannot_connect_to_xmpp_server/comment_9_41b86468013da15f46be29da520afa10._comment create mode 100644 doc/bugs/cannot_determine_uuid_for_origin.mdwn create mode 100644 doc/bugs/cannot_link_executable_on_android.mdwn create mode 100644 doc/bugs/case-insensitive.mdwn create mode 100644 doc/bugs/case_sensitivity_on_FAT.mdwn create mode 100644 doc/bugs/check_for_curl_in_configure.hs.mdwn create mode 100644 doc/bugs/clicking_back_in_the_web_browser_crashes.mdwn create mode 100644 doc/bugs/clicking_back_in_the_web_browser_crashes/comment_1_c962218657a28494ff837a471d71b43f._comment create mode 100644 doc/bugs/clicking_back_in_the_web_browser_crashes/comment_2_643b2c99ecfe851c576a023ce4385dbb._comment create mode 100644 doc/bugs/clicking_back_in_the_web_browser_crashes/comment_3_6e85c50439da81212f4239c74947b75e._comment create mode 100644 doc/bugs/com.branchable.git-annex.assistant.plist_is_invalid.mdwn create mode 100644 doc/bugs/commitBuffer:_invalid_argument___40__invalid_character__41__.mdwn create mode 100644 doc/bugs/commit_f20a40f_breaks_on_OSX_as_mntent.h_doesn__39__t_exist.mdwn create mode 100644 doc/bugs/concurrent_git-annex_processes_can_lead_to_locking_issues.mdwn create mode 100644 doc/bugs/configurable_path_to_git-annex-shell.mdwn create mode 100644 doc/bugs/configurable_path_to_git-annex-shell/comment_1_fb6771f902b57f2b690e7cc46fdac47e._comment create mode 100644 doc/bugs/configurable_path_to_git-annex-shell/comment_2_2b856f4f0b65c2331be7d565f0e4e8a8._comment create mode 100644 doc/bugs/configurable_path_to_git-annex-shell/comment_3_aea42acc039a82efc6bb3a8f173a632e._comment create mode 100644 doc/bugs/configure_mistakes_hashalot_bins_for_sha__63____63____63__sum_and_builds_a_broken_git-annex_executable.mdwn create mode 100644 doc/bugs/configure_script_should_detect_uuidgen_instead_of_just_uuid.mdwn create mode 100644 doc/bugs/conflicting_haskell_packages.mdwn create mode 100644 doc/bugs/conflicting_haskell_packages/comment_1_e552a6cc6d7d1882e14130edfc2d6b3b._comment create mode 100644 doc/bugs/conq:_invalid_command_syntax.mdwn create mode 100644 doc/bugs/conq:_invalid_command_syntax/comment_1_f33b83025ce974e496f83f248275a66a._comment create mode 100644 doc/bugs/conq:_invalid_command_syntax/comment_2_195106ca8dedad5f4d755f625e38e8af._comment create mode 100644 doc/bugs/conq:_invalid_command_syntax/comment_3_55af43e2f43a4c373f7a0a33678d0b1c._comment create mode 100644 doc/bugs/copy_doesn__39__t_scale.mdwn create mode 100644 doc/bugs/copy_doesn__39__t_scale/comment_1_7c12499c9ac28a9883c029f8c659eb57._comment create mode 100644 doc/bugs/copy_doesn__39__t_scale/comment_2_f85d8023cdbc203bb439644cf7245d4e._comment create mode 100644 doc/bugs/copy_doesn__39__t_scale/comment_3_4592765c3d77bb5664b8d16867e9d79c._comment create mode 100644 doc/bugs/copy_fails_for_some_fails_without_explanation.mdwn create mode 100644 doc/bugs/copy_fails_for_some_fails_without_explanation/comment_10_0c1a5837305b721fc4a529cae3f4c3fb._comment create mode 100644 doc/bugs/copy_fails_for_some_fails_without_explanation/comment_11_dabfec2d74fb847f3b40093a2866045b._comment create mode 100644 doc/bugs/copy_fails_for_some_fails_without_explanation/comment_1_e456604b26ed9c72b0a88cfb57f1a475._comment create mode 100644 doc/bugs/copy_fails_for_some_fails_without_explanation/comment_2_4823d66bfb569605868af5cefe0d94dc._comment create mode 100644 doc/bugs/copy_fails_for_some_fails_without_explanation/comment_3_46305aa2d43da000c1a7cb003c822572._comment create mode 100644 doc/bugs/copy_fails_for_some_fails_without_explanation/comment_4_1dbdeded7f587e8fc2d1ac5170ecb928._comment create mode 100644 doc/bugs/copy_fails_for_some_fails_without_explanation/comment_5_1e0c06a07345d85b3712339e6f0d9a9f._comment create mode 100644 doc/bugs/copy_fails_for_some_fails_without_explanation/comment_6_41798e92068eb227c5e75cae2edef68a._comment create mode 100644 doc/bugs/copy_fails_for_some_fails_without_explanation/comment_7_1f33d694a08d8dcbf04595e3442b8cd5._comment create mode 100644 doc/bugs/copy_fails_for_some_fails_without_explanation/comment_8_884f31ce917c8e5ce9a32a55da9b42d6._comment create mode 100644 doc/bugs/copy_fails_for_some_fails_without_explanation/comment_9_ab770dafee3bd9212f553db222adbfe6._comment create mode 100644 doc/bugs/copy_fast_confusing_with_broken_locationlog.mdwn create mode 100644 doc/bugs/copy_fast_confusing_with_broken_locationlog/comment_10_435f87d54052f264096a8f23e99eae06._comment create mode 100644 doc/bugs/copy_fast_confusing_with_broken_locationlog/comment_11_9be0aef403a002c1706d17deee45763c._comment create mode 100644 doc/bugs/copy_fast_confusing_with_broken_locationlog/comment_12_26d60661196f63fd01ee4fbb6e2340e7._comment create mode 100644 doc/bugs/copy_fast_confusing_with_broken_locationlog/comment_13_ead55b915d3b92a62549b2957ad211c8._comment create mode 100644 doc/bugs/copy_fast_confusing_with_broken_locationlog/comment_14_191de89d3988083d9cf001799818ff4a._comment create mode 100644 doc/bugs/copy_fast_confusing_with_broken_locationlog/comment_15_b3e3b338ccfa0a32510c78ba1b1bb617._comment create mode 100644 doc/bugs/copy_fast_confusing_with_broken_locationlog/comment_16_04a9f4468c3246c8eff3dbe21dd90101._comment create mode 100644 doc/bugs/copy_fast_confusing_with_broken_locationlog/comment_1_6a41bf7e2db83db3a01722b516fb6886._comment create mode 100644 doc/bugs/copy_fast_confusing_with_broken_locationlog/comment_2_9f5f1dbffb2dd24f4fcf8c2027bf0384._comment create mode 100644 doc/bugs/copy_fast_confusing_with_broken_locationlog/comment_3_b596b5cfd3377e58dbbb5d509d026b90._comment create mode 100644 doc/bugs/copy_fast_confusing_with_broken_locationlog/comment_4_d7112c315fb016a8a399e24e9b6461d8._comment create mode 100644 doc/bugs/copy_fast_confusing_with_broken_locationlog/comment_5_4ea29a6f8152eddf806c536de33ef162._comment create mode 100644 doc/bugs/copy_fast_confusing_with_broken_locationlog/comment_6_0d85f114a103bd6532a3b3b24466012e._comment create mode 100644 doc/bugs/copy_fast_confusing_with_broken_locationlog/comment_7_d38d5bee6d360b0ea852f39e3a7b1bc6._comment create mode 100644 doc/bugs/copy_fast_confusing_with_broken_locationlog/comment_8_29c3de4bf5fbd990b230c443c0303cbe._comment create mode 100644 doc/bugs/copy_fast_confusing_with_broken_locationlog/comment_9_2cee4f6bd6db7518fd61453c595162c6._comment create mode 100644 doc/bugs/copy_to_--fast_should_not_mention_every_file_it_checks.mdwn create mode 100644 doc/bugs/copy_to_--fast_should_not_mention_every_file_it_checks/comment_1_5f51452d939d61496e97805310746ea3._comment create mode 100644 doc/bugs/copy_to_--fast_should_not_mention_every_file_it_checks/comment_2_2cd3e9561c4442259c765743b423a7df._comment create mode 100644 doc/bugs/copy_to_webdav_sometimes_doesn__39__t_work.mdwn create mode 100644 doc/bugs/copy_to_webdav_sometimes_doesn__39__t_work/comment_1_77629f620b28ac62364de44b41fa539d._comment create mode 100644 doc/bugs/copy_unused_and_unused_not_agreeing.mdwn create mode 100644 doc/bugs/copy_unused_and_unused_not_agreeing/comment_1_a11a45868867361fcff61471ffe0ce39._comment create mode 100644 doc/bugs/copy_unused_and_unused_not_agreeing/comment_2_15559ba19393f5c061f77bc56379f8e1._comment create mode 100644 doc/bugs/copy_unused_and_unused_not_agreeing/comment_3_9b1340e0f6a107695849c04374aaeae2._comment create mode 100644 doc/bugs/copy_unused_and_unused_not_agreeing/comment_4_b88530080fd90686cfa7e336f8328dcb._comment create mode 100644 doc/bugs/copy_unused_and_unused_not_agreeing/comment_5_792ab128a91c66e4ddeaa69d09430a78._comment create mode 100644 doc/bugs/copy_unused_and_unused_not_agreeing/comment_6_e44a16ef3358a6fbcc6ed6b3a31f3273._comment create mode 100644 doc/bugs/copy_unused_and_unused_not_agreeing/comment_7_635acd64b524c682c58f26ae96ae0d7d._comment create mode 100644 doc/bugs/copy_unused_and_unused_not_agreeing/comment_8_1aaeb808e20c67f89eaac5e45d9309f0._comment create mode 100644 doc/bugs/copy_unused_and_unused_not_agreeing/comment_9_6abca5f4927e09089cdc5f0bd27b798f._comment create mode 100644 doc/bugs/creating_a_plain_directory_where_a_mountpoint_should_have_been.mdwn create mode 100644 doc/bugs/creating_a_plain_directory_where_a_mountpoint_should_have_been/comment_1_41cfd5e48426a6ef52bef70a06a6f46a._comment create mode 100644 doc/bugs/creating_a_plain_directory_where_a_mountpoint_should_have_been/comment_2_bd584ccbe128427fca99e61d66d301c9._comment create mode 100644 doc/bugs/creating_a_plain_directory_where_a_mountpoint_should_have_been/comment_3_5bb0347215b321444643646f25a35759._comment create mode 100644 doc/bugs/creating_a_plain_directory_where_a_mountpoint_should_have_been/comment_4_73848a9c783ecf3d9fccdd41b20fbe36._comment create mode 100644 doc/bugs/creating_a_remote_server_repository.mdwn create mode 100644 doc/bugs/creating_a_remote_server_repository/comment_1_de1a370347428245bcfca60eaca96779._comment create mode 100644 doc/bugs/creating_a_remote_server_repository/comment_2_482ac9b0f881099910f9bd9f7cda184d._comment create mode 100644 doc/bugs/creating_a_remote_server_repository/comment_3_b7c7f684d0eef14fcc00cb2ac0566703._comment create mode 100644 doc/bugs/creds_directory_not_automatically_created.mdwn create mode 100644 doc/bugs/cross_platform_permissions_woes.mdwn create mode 100644 doc/bugs/cross_platform_permissions_woes/comment_1_7f01104de38a6a319a8f36aa1dc8b4b3._comment create mode 100644 doc/bugs/cross_platform_permissions_woes/comment_2_0a34e11b466fad287325425e76487fa1._comment create mode 100644 doc/bugs/cross_platform_permissions_woes/comment_3_278f91b4bc4c32717ab1c39c2abf9305._comment create mode 100644 doc/bugs/cross_platform_permissions_woes/comment_4_eb6a271cb63c71341469c9ff89dc0eb9._comment create mode 100644 doc/bugs/cyclic_drop.mdwn create mode 100644 doc/bugs/data_loss:_incorrect_merge_upon_conflicting_directory-file_of_direct_repos.mdwn create mode 100644 doc/bugs/data_loss:_incorrect_merge_upon_conflicting_directory-file_of_direct_repos/comment_1_294c33af08649256908a97894f93c05d._comment create mode 100644 doc/bugs/data_loss:_incorrect_merge_upon_conflicting_directory-file_of_direct_repos/comment_2_02a2b69adbb04b557146e713b70b34d2._comment create mode 100644 doc/bugs/data_loss:_incorrect_merge_upon_conflicting_directory-file_of_direct_repos/comment_3_d296ef26fc90f4e3166bba6d2de0a1ee._comment create mode 100644 doc/bugs/data_loss:_incorrect_merge_upon_conflicting_directory-file_of_direct_repos/comment_4_33ba2c890c962a71ae9fadc417359f8e._comment create mode 100644 doc/bugs/data_loss:_incorrect_merge_upon_conflicting_directory-file_of_direct_repos/comment_5_39eb0bb96fd271bd0de4a3a40814ae1b._comment create mode 100644 doc/bugs/data_loss:_incorrect_merge_upon_conflicting_directory-file_of_direct_repos/comment_6_d80c4b631bdf58901a06f29a2c5682e2._comment create mode 100644 doc/bugs/data_loss_with___34__git_annex_add__34___on_android_in_direct_mode_.mdwn create mode 100644 doc/bugs/data_loss_with___34__git_annex_add__34___on_android_in_direct_mode_/comment_1_eb6db7f6a156a065e2724c2de5fc4366._comment create mode 100644 doc/bugs/data_loss_with___34__git_annex_add__34___on_android_in_direct_mode_/comment_2_59a96cade9e4881767562a139fc7fb4b._comment create mode 100644 doc/bugs/data_loss_with___34__git_annex_add__34___on_android_in_direct_mode_/comment_3_bf9d2562d66f0f6a9478ac178606cf4e._comment create mode 100644 doc/bugs/data_loss_with___34__git_annex_add__34___on_android_in_direct_mode_/comment_4_ad0dbdc448fff2e126ffec9aac6d7463._comment create mode 100644 doc/bugs/data_loss_with___34__git_annex_add__34___on_android_in_direct_mode_/comment_5_e828585e56b10710598143483ce362b6._comment create mode 100644 doc/bugs/detected_bad_bare_repository_with___60__SCREECH__62___files.mdwn create mode 100644 doc/bugs/detected_bad_bare_repository_with___60__SCREECH__62___files/comment_1_523b80ad81ad49bddfb8855d12d5561d._comment create mode 100644 doc/bugs/direct_mode_assistant_in_subdir_confusion.mdwn create mode 100644 doc/bugs/direct_mode_assistant_in_subdir_confusion/comment_1_351143deec29e712f8718a373ad650d7._comment create mode 100644 doc/bugs/direct_mode_merge_can_overwrite_local__44___non-annexed_files.mdwn create mode 100644 doc/bugs/direct_mode_renames.mdwn create mode 100644 doc/bugs/direct_mode_renames/comment_1_f18c335e0d6f4259d2470935ef391cb8._comment create mode 100644 doc/bugs/direct_mode_sync_should_avoid_git_commit.mdwn create mode 100644 doc/bugs/direct_mode_sync_should_avoid_git_commit/comment_1_d286800081f019651cd40355b7d5518a._comment create mode 100644 doc/bugs/direct_mode_sync_should_avoid_git_commit/comment_2_4e23201d1d1d549f72eec75987601a73._comment create mode 100644 doc/bugs/direct_repository_on_FAT32_fails_to_addurl_containing___63__.mdwn create mode 100644 doc/bugs/directory_remote_+_shared_encryption_+_chunk_size___61___lost_files__63__.mdwn create mode 100644 doc/bugs/directory_remote_+_shared_encryption_+_chunk_size___61___lost_files__63__/comment_1_69dfbf566c75396cdaaf5ad70f1a94a8._comment create mode 100644 doc/bugs/directory_remote_+_shared_encryption_+_chunk_size___61___lost_files__63__/comment_2_8d09cc0e06548c4ebde7956edd1b5d85._comment create mode 100644 doc/bugs/directory_remote_and_case_sensitivity_on_FAT/comment_1_bcac9fd7b3f4a2ac28bee59bae674fa0._comment create mode 100644 doc/bugs/directory_remote_and_case_sensitivity_on_FAT/comment_2_c9088060fb9133b66951f1a3075981e8._comment create mode 100644 doc/bugs/directory_remote_and_case_sensitivity_on_FAT/comment_3_5bf34466187cfc9b34bd3ca8c89a07c6._comment create mode 100644 doc/bugs/directory_remote_and_case_sensitivity_on_FAT/comment_4_d6201f2d86d5b44051a7fd7a8c9de583._comment create mode 100644 doc/bugs/directory_remote_and_case_sensitivity_on_FAT/comment_5_61c5f0889f30a68ac3b57c4ea564ee0e._comment create mode 100644 doc/bugs/done.mdwn create mode 100644 doc/bugs/dotdot_problem.mdwn create mode 100644 doc/bugs/drop_fails_to_see_copies_that_whereis_sees.mdwn create mode 100644 doc/bugs/drop_fails_to_see_copies_that_whereis_sees/comment_1_f5a9d99d90daf5eba4773d361fa1807a._comment create mode 100644 doc/bugs/drop_fails_to_see_copies_that_whereis_sees/comment_2_040aa454cd8acd2857ef36884465576f._comment create mode 100644 doc/bugs/drop_fails_to_see_copies_that_whereis_sees/comment_3_f5d8faab325ee26800ecad5aba49b54b._comment create mode 100644 doc/bugs/dropping_and_re-adding_from_web_remotes_doesn__39__t_work.mdwn create mode 100644 doc/bugs/dropping_files_with_a_URL_backend_fails.mdwn create mode 100644 doc/bugs/dropunused_doesn__39__t_handle_double_spaces_in_filename.mdwn create mode 100644 doc/bugs/dropunused_doesn__39__t_work_in_my_case__63__.mdwn create mode 100644 doc/bugs/enableremote_broken_with_direct_mode__63__.mdwn create mode 100644 doc/bugs/enableremote_broken_with_direct_mode__63__/comment_1_a2e61f5de7a28498de0c2d5e3d51eab4._comment create mode 100644 doc/bugs/encfs_accused_of_being_crippled.mdwn create mode 100644 doc/bugs/encfs_accused_of_being_crippled/comment_1_5c5be012e1171ef108f38825d72791b6._comment create mode 100644 doc/bugs/encrpyted_ssh_remote_on_macosx.mdwn create mode 100644 doc/bugs/encrpyted_ssh_remote_on_macosx/comment_1_46c37aacb7ae41864488fb7c7d87d437._comment create mode 100644 doc/bugs/encrypted_S3_stalls.mdwn create mode 100644 doc/bugs/encryption_given_a_gpg_keyid_still_uses_symmetric_encryption.mdwn create mode 100644 doc/bugs/encryption_given_a_gpg_keyid_still_uses_symmetric_encryption/comment_1_2f4ec4b7b92a0f0a0c4c0758da4a05a5._comment create mode 100644 doc/bugs/encryption_given_a_gpg_keyid_still_uses_symmetric_encryption/comment_2_7c0aeae6b1b2b0338735b0231c5db7d4._comment create mode 100644 doc/bugs/encryption_key_is_surprising.mdwn create mode 100644 doc/bugs/encryption_key_is_surprising/comment_1_5b172830ac31d51a1687bc8b1db489f9._comment create mode 100644 doc/bugs/encryption_key_is_surprising/comment_2_5b7e6bb36c3333dfd71808e8b4544746._comment create mode 100644 doc/bugs/encryption_key_is_surprising/comment_4_8ec86b8c35bce15337a143e275961cd5._comment create mode 100644 doc/bugs/encryption_key_is_surprising/comment_4_c5e49b3a0eceabe6d14f5226d7ba4c7a._comment create mode 100644 doc/bugs/encryption_key_is_surprising/comment_5_cd7cbf0c0ee9cafec344dfbf1acd9590._comment create mode 100644 doc/bugs/encryption_key_is_surprising/comment_6_01381524114d885961704acc3f172536._comment create mode 100644 doc/bugs/encryption_key_is_surprising/comment_7_c1eb59e1c5f583dcef7cea17623a2435._comment create mode 100644 doc/bugs/endless_loop_when_PWD_gone.mdwn create mode 100644 doc/bugs/endless_loop_when_PWD_gone/comment_1_0943cffa39d48e4dddde3b7aedc4e3b1._comment create mode 100644 doc/bugs/enormous_fsck_output_OOM.mdwn create mode 100644 doc/bugs/enormous_fsck_output_OOM/comment_1_490b8bfe95b01a23408ecb5d63dcd40b._comment create mode 100644 doc/bugs/enormous_fsck_output_OOM/comment_2_2666c135dd3378cf6301aa4957049fbd._comment create mode 100644 doc/bugs/enormous_fsck_output_OOM/comment_3_dfb169c441215b671f8c971184de3e16._comment create mode 100644 doc/bugs/enormous_fsck_output_OOM/comment_4_19ef90803aa7ce158bce02378e18ea0f._comment create mode 100644 doc/bugs/enormous_fsck_output_OOM/comment_5_2b5406768fff2834f7aefa76ef949de2._comment create mode 100644 doc/bugs/enormous_fsck_output_OOM/comment_6_0997f1a94c2fda9fe69824e074011518._comment create mode 100644 doc/bugs/enormous_fsck_output_OOM/comment_7_2cdc79f1e0f72693814e91dc88a758e1._comment create mode 100644 doc/bugs/enormous_fsck_output_OOM/comment_8_b9aab0aba4dab30260371b4762e0e51d._comment create mode 100644 doc/bugs/enormous_fsck_output_OOM/comment_9_8de694dff75e27856c8282d1f2d120b6._comment create mode 100644 doc/bugs/error_building_git-annex_3.20120624_using_cabal.mdwn create mode 100644 doc/bugs/error_on_only_repository_copy_deletion.mdwn create mode 100644 doc/bugs/error_on_only_repository_copy_deletion/comment_1_af394ac0956ab33a77256bcb02ef2a0f._comment create mode 100644 doc/bugs/error_propigation.mdwn create mode 100644 doc/bugs/error_when_using_repositories_with_non-ASCII_characters.mdwn create mode 100644 doc/bugs/error_when_using_repositories_with_non-ASCII_characters/comment_1_38cc2d2ed907649df085de8ad83cb9dd._comment create mode 100644 doc/bugs/error_with_file_names_starting_with_dash.mdwn create mode 100644 doc/bugs/extraneous_shell_escaping_for_rsync_remotes.mdwn create mode 100644 doc/bugs/fails_to_handle_lot_of_files.mdwn create mode 100644 doc/bugs/fails_to_handle_lot_of_files/comment_1_09d8e4e66d8273fab611bd29e82dc7fc._comment create mode 100644 doc/bugs/fails_to_handle_lot_of_files/comment_2_fd2ec05f4b5a7a6ae6bd9f5dbc3156de._comment create mode 100644 doc/bugs/failure_during_ssh_key_setup___40__windows__41__.mdwn create mode 100644 doc/bugs/failure_to_find_file_that___34__should__34___exist_in_remote_is_silent.mdwn create mode 100644 doc/bugs/failure_to_find_file_that___34__should__34___exist_in_remote_is_silent/comment_1_c686df2824d3f588c0bfb339c99168b7._comment create mode 100644 doc/bugs/failure_to_find_file_that___34__should__34___exist_in_remote_is_silent/comment_2_22edfac4ce25cd9f4e4c85e0a8a52bc1._comment create mode 100644 doc/bugs/failure_to_find_file_that___34__should__34___exist_in_remote_is_silent/comment_3_74fc0e41a6bd5c4d8c4b2f15e5ed8d2f._comment create mode 100644 doc/bugs/failure_to_find_file_that___34__should__34___exist_in_remote_is_silent/comment_4_7d642fc65040a7b583cdece33db01826._comment create mode 100644 doc/bugs/failure_to_find_file_that___34__should__34___exist_in_remote_is_silent/comment_5_49be366b6af6db595fa538373a61e650._comment create mode 100644 doc/bugs/failure_to_return_to_indirect_mode_on_usb.mdwn create mode 100644 doc/bugs/failure_to_return_to_indirect_mode_on_usb/comment_1_d7822b90c68bf845572b0a04a378d0bb._comment create mode 100644 doc/bugs/fat_support.mdwn create mode 100644 doc/bugs/fat_support/comment_1_04bcc4795d431e8cb32293aab29bbfe2._comment create mode 100644 doc/bugs/fat_support/comment_2_bb4a97ebadb5c53809fc78431eabd7c8._comment create mode 100644 doc/bugs/fat_support/comment_3_df3b943bc1081a8f3f7434ae0c8e061e._comment create mode 100644 doc/bugs/fat_support/comment_4_90a8a15bedd94480945a374f9d706b86._comment create mode 100644 doc/bugs/fat_support/comment_5_64bbf89de0836673224b83fdefa0407b._comment create mode 100644 doc/bugs/fat_support/comment_6_a3b6000330c9c376611c228d746a1d55._comment create mode 100644 doc/bugs/fat_support/comment_7_a0ac7f2c44efc8116940c7b94b35e9d0._comment create mode 100644 doc/bugs/fat_support/comment_8_acc947643a635eb10a1bff92083a3506._comment create mode 100644 doc/bugs/fatal:_empty_ident_name.mdwn create mode 100644 doc/bugs/fatal:_empty_ident_name/comment_1_ceae87308fb75a1f79c7c8d63ec47226._comment create mode 100644 doc/bugs/fatal:_empty_ident_name/comment_2_68832ee3e0e7244ce62bccabe2e52630._comment create mode 100644 doc/bugs/fatal:_empty_ident_name/comment_3_ed31ad316747343d7730e4c2d7dacd24._comment create mode 100644 doc/bugs/fatal:_empty_ident_name/comment_4_b812d6f30e8a866bce7260a9ee3218e3._comment create mode 100644 doc/bugs/fatal:_git-write-tree:_error_building_trees.mdwn create mode 100644 doc/bugs/fatal:_git-write-tree:_error_building_trees/comment_2_77295c0b749e984a6fb200d3b73b5765._comment create mode 100644 doc/bugs/fatal:_git_ls-files:_cannot_generate_relative_filenames_containing___39__..__39__.mdwn create mode 100644 doc/bugs/fatal:_git_ls-files:_cannot_generate_relative_filenames_containing___39__..__39__/comment_1_8a4045634bffc29c8147056096b7089d._comment create mode 100644 doc/bugs/fatal:_git_ls-files:_cannot_generate_relative_filenames_containing___39__..__39__/comment_2_a1539aaec74074b4667ac27cfcfcccd6._comment create mode 100644 doc/bugs/fatal:_git_ls-files:_cannot_generate_relative_filenames_containing___39__..__39__/comment_3_d252f39ddb9c9c14784c85a8b850a4ec._comment create mode 100644 doc/bugs/fatal:_git_ls-files:_cannot_generate_relative_filenames_containing___39__..__39__/comment_4_eb07c84dc0b15b68c99d0ef4144f82f5._comment create mode 100644 doc/bugs/fatal:_unable_to_access___39__..__47__..__47__..__47__..__47__C:__92__Users__92____91__...__93____92__annex__92__.git__47__config__39__:_Invalid_argument___40__Windows__41__.mdwn create mode 100644 doc/bugs/fatal:_unable_to_access___39__..__47__..__47__..__47__..__47__C:__92__Users__92____91__...__93____92__annex__92__.git__47__config__39__:_Invalid_argument___40__Windows__41__/comment_1_e6f39b2ef55b0daa491f4b6329a906bc._comment create mode 100644 doc/bugs/fatal:_unable_to_access___39__..__47__..__47__..__47__..__47__C:__92__Users__92____91__...__93____92__annex__92__.git__47__config__39__:_Invalid_argument___40__Windows__41__/comment_2_b47d6d188f38a8e4ca5ef5f70afadf6a._comment create mode 100644 doc/bugs/fatal:_unable_to_access___39__..__47__..__47__..__47__..__47__C:__92__Users__92____91__...__93____92__annex__92__.git__47__config__39__:_Invalid_argument___40__Windows__41__/comment_4_b533b1de535a057b7ebf99afc92691ed._comment create mode 100644 doc/bugs/feature_request:_addhash.mdwn create mode 100644 doc/bugs/feature_request:_addhash/comment_1_064e963adb6834813380fd836bb58566._comment create mode 100644 doc/bugs/feature_request:_addhash/comment_2_7b712786c580dd1ca24479664c31eed6._comment create mode 100644 doc/bugs/file_access__47__locking_issues_with_the_assitant.mdwn create mode 100644 doc/bugs/file_access__47__locking_issues_with_the_assitant/comment_10_fadf06f5ab34e36ab130536ec55afc8e._comment create mode 100644 doc/bugs/file_access__47__locking_issues_with_the_assitant/comment_11_4a337f7b1140c45e5dd660b40202f696._comment create mode 100644 doc/bugs/file_access__47__locking_issues_with_the_assitant/comment_1_05e1398e78218ced9c2da6a2510949e8._comment create mode 100644 doc/bugs/file_access__47__locking_issues_with_the_assitant/comment_2_9226f0adf091154c0d8a08b340b71869._comment create mode 100644 doc/bugs/file_access__47__locking_issues_with_the_assitant/comment_3_44d3e2096b7d45a1062222bee83a346d._comment create mode 100644 doc/bugs/file_access__47__locking_issues_with_the_assitant/comment_4_f2e1d188b7b2d2daf0d832c59a68583e._comment create mode 100644 doc/bugs/file_access__47__locking_issues_with_the_assitant/comment_5_998fe58994ecf855310e4b8e6cce9e18._comment create mode 100644 doc/bugs/file_access__47__locking_issues_with_the_assitant/comment_6_4ce243cb0ea8ff810a4949a5320e4afc._comment create mode 100644 doc/bugs/file_access__47__locking_issues_with_the_assitant/comment_7_c713f6316d889c8fc52326f21375c1c4._comment create mode 100644 doc/bugs/file_access__47__locking_issues_with_the_assitant/comment_8_6dd23bab7983b8b1f938dd4f21a16f5a._comment create mode 100644 doc/bugs/file_access__47__locking_issues_with_the_assitant/comment_9_961c8f968eff0b39a85b607ee3f7630d._comment create mode 100644 doc/bugs/file_modification_times.mdwn create mode 100644 doc/bugs/file_permissions_on___126____47__.ssh__47__config___40__windows__41__.mdwn create mode 100644 doc/bugs/file_permissions_on___126____47__.ssh__47__config___40__windows__41__/comment_1_a04b71f4f81c477d18f14d8dfe8b378f._comment create mode 100644 doc/bugs/file_permissions_on___126____47__.ssh__47__config___40__windows__41__/comment_2_0dbc908984b4b5bcc1283db807e058cb._comment create mode 100644 doc/bugs/file_permissions_on___126____47__.ssh__47__config___40__windows__41__/comment_3_ff6cd2bb007d41284a09e470e060c32d._comment create mode 100644 doc/bugs/fix_for_makefile_to_check_if_OS_is_linux_or_not___40__relates_to_the_new_inotify_flag__41__.mdwn create mode 100644 doc/bugs/follows_symlinks_to_outside_annex.mdwn create mode 100644 doc/bugs/follows_symlinks_to_outside_annex/comment_1_f7a01bb627a6780d6940886401cde454._comment create mode 100644 doc/bugs/follows_symlinks_to_outside_annex/comment_2_fcbeffab5a0146062a9c945dfff48507._comment create mode 100644 doc/bugs/free_space_checking.mdwn create mode 100644 doc/bugs/free_space_checking/comment_1_a868e805be43c5a7c19c41f1af8e41e6._comment create mode 100644 doc/bugs/free_space_checking/comment_2_8a65f6d3dcf5baa3f7f2dbe1346e2615._comment create mode 100644 doc/bugs/free_space_checking/comment_3_0fc6ff79a357b1619d13018ccacc7c10._comment create mode 100644 doc/bugs/fsck__47__fix_should_check__47__fix_the_permissions_of_.git__47__annex.mdwn create mode 100644 doc/bugs/fsck_claims_failed_checksum_when_less_copies_than_required_are_found.mdwn create mode 100644 doc/bugs/fsck_giving_false_checking_information.mdwn create mode 100644 doc/bugs/fsck_giving_false_checking_information/comment_1_1000603ea6b8a19eb09e6754789ad528._comment create mode 100644 doc/bugs/fsck_giving_false_checking_information/comment_2_3ce7c8f7098f0bf86ed409a3a095c152._comment create mode 100644 doc/bugs/fsck_giving_false_checking_information/comment_3_be4d0fec56c29cf978ef7d1715eaa516._comment create mode 100644 doc/bugs/fsck_output.mdwn create mode 100644 doc/bugs/fsck_should_double-check_when_a_content-check_fails.mdwn create mode 100644 doc/bugs/fsck_should_double-check_when_a_content-check_fails/comment_1_03af24b70adbcd9f4b94d009f6b71d0a._comment create mode 100644 doc/bugs/fsck_should_double-check_when_a_content-check_fails/comment_2_41214a7d18c66b694645248d6ebeadbf._comment create mode 100644 doc/bugs/fsck_should_double-check_when_a_content-check_fails/comment_3_e7ddd77ea35994f2051f840e9b4c7e0c._comment create mode 100644 doc/bugs/fsck_should_double-check_when_a_content-check_fails/comment_4_36a70d5a378983a76fcdbb7fba044044._comment create mode 100644 doc/bugs/fsck_should_double-check_when_a_content-check_fails/comment_5_899c4afbc988d81984c5c3397285bb01._comment create mode 100644 doc/bugs/fsck_should_double-check_when_a_content-check_fails/comment_6_dbff51d00c5645eb1832aa4644889c5e._comment create mode 100644 doc/bugs/fsck_thinks_file_content_is_bad_when_it_isn__39__t.mdwn create mode 100644 doc/bugs/fsck_thinks_file_content_is_bad_when_it_isn__39__t/comment_1_cafb58eca97a0a66110ac39b169d8de3._comment create mode 100644 doc/bugs/gcrypt_initremote_pushes_git-annex_but_not_master.mdwn create mode 100644 doc/bugs/get_failed__44___but_remote_has_the_file.mdwn create mode 100644 doc/bugs/get_failed__44___but_remote_has_the_file/comment_1_55c8b73ce05dfca11a393bb296b99b9a._comment create mode 100644 doc/bugs/get_failed__44___but_remote_has_the_file/comment_2_474c67a421dca4c245e7bfe495d3f6d3._comment create mode 100644 doc/bugs/get_failed__44___but_remote_has_the_file/comment_3_845e8a23d63fb0b071c63ee736697d26._comment create mode 100644 doc/bugs/get_failed__44___but_remote_has_the_file/comment_4_7dec21cb67e7f4dbdb49da97f2443e8f._comment create mode 100644 doc/bugs/get_fails_for_file:__47____47___web_remotes_if_the_file_is_empty.mdwn create mode 100644 doc/bugs/get_from_bup-remote_with_pubkey_failing.mdwn create mode 100644 doc/bugs/git-annex-shell:_gcryptsetup_permission_denied.mdwn create mode 100644 doc/bugs/git-annex-shell:_gcryptsetup_permission_denied/comment_1_f4584158b35b80ece1060308883e2dc4._comment create mode 100644 doc/bugs/git-annex-shell:_gcryptsetup_permission_denied/comment_2_a4d7aae848340771a9b8e2c87abeea42._comment create mode 100644 doc/bugs/git-annex-shell:_gcryptsetup_permission_denied/comment_3_06bda101ad584b4b882de8b2e202d679._comment create mode 100644 doc/bugs/git-annex-shell:_gcryptsetup_permission_denied/comment_4_4fc6b25401b645cabc04b510bdfa6863._comment create mode 100644 doc/bugs/git-annex-shell:_gcryptsetup_permission_denied/comment_5_4e193306801680bba433e75eb4dcba05._comment create mode 100644 doc/bugs/git-annex-shell:_gcryptsetup_permission_denied/comment_6_76ccdf0542e76e4dbd61f3b3228d40ba._comment create mode 100644 doc/bugs/git-annex-shell:_gcryptsetup_permission_denied/comment_7_cd964d0a375c5cba299bf2bbbbb86acb._comment create mode 100644 doc/bugs/git-annex-shell:_gcryptsetup_permission_denied/comment_8_9bac87c85deb5bb15795df28533d0cde._comment create mode 100644 doc/bugs/git-annex-shell:_internal_error:_evacuate__40__static__41__:_strange_closure_type_30799.mdwn create mode 100644 doc/bugs/git-annex-shell:_internal_error:_evacuate__40__static__41__:_strange_closure_type_30799/comment_1_1c19e716069911f17bbebd196d9e4b61._comment create mode 100644 doc/bugs/git-annex-shell:_internal_error:_evacuate__40__static__41__:_strange_closure_type_30799/comment_2_a4d66f29d257044e548313e014ca3dc3._comment create mode 100644 doc/bugs/git-annex-shell:_internal_error:_evacuate__40__static__41__:_strange_closure_type_30799/comment_3_f5f1081eb18143383b2fb1f57d8640f5._comment create mode 100644 doc/bugs/git-annex-shell:_internal_error:_evacuate__40__static__41__:_strange_closure_type_30799/comment_4_b1f818b85c3540591c48e7ba8560d070._comment create mode 100644 doc/bugs/git-annex-shell:_internal_error:_evacuate__40__static__41__:_strange_closure_type_30799/comment_5_67406dd8d9bd4944202353508468c907._comment create mode 100644 doc/bugs/git-annex-shell:_user_error___40__unrecognized_option___96__--uuid__39__.mdwn create mode 100644 doc/bugs/git-annex-shell:_user_error___40__unrecognized_option___96__--uuid__39__/comment_1_13510e954e36484e196e7395a3a9bf1f._comment create mode 100644 doc/bugs/git-annex-shell:_user_error___40__unrecognized_option___96__--uuid__39__/comment_2_7edc478a76983a3b3c68d01f24dce613._comment create mode 100644 doc/bugs/git-annex-shell_doesn__39__t_honour_Rsync__39__s_bwlimit_option.mdwn create mode 100644 doc/bugs/git-annex-shell_doesn__39__t_honour_Rsync__39__s_bwlimit_option/comment_1_8cda861c11ef2fff3442e5a0df741939._comment create mode 100644 doc/bugs/git-annex-shell_doesn__39__t_honour_Rsync__39__s_bwlimit_option/comment_2_15e06f6db9a14a8217dea25e24ddc23a._comment create mode 100644 doc/bugs/git-annex-shell_doesn__39__t_honour_Rsync__39__s_bwlimit_option/comment_3_d36045e2b466882108c5bf09580755fa._comment create mode 100644 doc/bugs/git-annex:_Argument_list_too_long.mdwn create mode 100644 doc/bugs/git-annex:_Argument_list_too_long/comment_1_3f83ea525436b2379ab29a0f860c4669._comment create mode 100644 doc/bugs/git-annex:_Argument_list_too_long/comment_2_b417c94169378ef7d0d278ebae517fa1._comment create mode 100644 doc/bugs/git-annex:_Argument_list_too_long/comment_3_fa925cca216cb810ad80482b19fc6053._comment create mode 100644 doc/bugs/git-annex:_Argument_list_too_long/comment_4_8bd2996107b2d272c32810658e07e715._comment create mode 100644 doc/bugs/git-annex:_Argument_list_too_long/comment_5_378de7d7503a64611eab62f2f5cffef3._comment create mode 100644 doc/bugs/git-annex:_Argument_list_too_long/comment_6_a94e17151348d02999442dd1219babfb._comment create mode 100644 doc/bugs/git-annex:_Cannot_decode_byte___39____92__xfc__39__.mdwn create mode 100644 doc/bugs/git-annex:_Cannot_decode_byte___39____92__xfc__39__/comment_1_f1a7352b04f395e06e0094c1f51b6fff._comment create mode 100644 doc/bugs/git-annex:_Cannot_decode_byte___39____92__xfc__39__/comment_2_c1890067079cd99667f31cbb4d2e4545._comment create mode 100644 doc/bugs/git-annex:_Cannot_decode_byte___39____92__xfc__39__/comment_3_213c96085c60c8e52cd803df07240158._comment create mode 100644 doc/bugs/git-annex:_Not_in_a_git_repository._.mdwn create mode 100644 doc/bugs/git-annex:_Not_in_a_git_repository._/comment_1_e10363a912953a646b87c824d1c6e5d4._comment create mode 100644 doc/bugs/git-annex:_Not_in_a_git_repository._/comment_2_9e96063a664b2be8a36d7940e7632d3f._comment create mode 100644 doc/bugs/git-annex:_Not_in_a_git_repository._/comment_3_8c9bd76b0e1200723ec13fbef943a2cc._comment create mode 100644 doc/bugs/git-annex:_Not_in_a_git_repository._/comment_4_8c49979b8a815f0d6f9de39ee9a88730._comment create mode 100644 doc/bugs/git-annex:_WebDAV_failed_to_write_file:_TlsNotSupported:_user_error.mdwn create mode 100644 doc/bugs/git-annex:_WebDAV_failed_to_write_file:_TlsNotSupported:_user_error/comment_1_2c54c57f456e4570666fd7a5731dcd27._comment create mode 100644 doc/bugs/git-annex:_WebDAV_failed_to_write_file:_TlsNotSupported:_user_error/comment_2_c9a9f070b2eaff9f68f603ca1defec81._comment create mode 100644 doc/bugs/git-annex:_WebDAV_failed_to_write_file:_TlsNotSupported:_user_error/comment_3_62ff37a8429cfb3577d4250c701811d0._comment create mode 100644 doc/bugs/git-annex:___60__socket:_16__62__:_hPutBuf:_resource_vanished___40__Broken_pipe__41__.mdwn create mode 100644 doc/bugs/git-annex:___60__socket:_16__62__:_hPutBuf:_resource_vanished___40__Broken_pipe__41__/comment_1_e962317a939bf76097ae1a3b53b146e6._comment create mode 100644 doc/bugs/git-annex:___60__socket:_16__62__:_hPutBuf:_resource_vanished___40__Broken_pipe__41__/comment_2_b32472b4c9b61e7a33dca802ecafb05b._comment create mode 100644 doc/bugs/git-annex:___60__socket:_16__62__:_hPutBuf:_resource_vanished___40__Broken_pipe__41__/comment_3_fcfea3216831df9afbd855fbd842c27e._comment create mode 100644 doc/bugs/git-annex:___60__socket:_16__62__:_hPutBuf:_resource_vanished___40__Broken_pipe__41__/comment_4_30d0b40efa59eeecb8a4be6d1baa1520._comment create mode 100644 doc/bugs/git-annex:___60__socket:_16__62__:_hPutBuf:_resource_vanished___40__Broken_pipe__41__/comment_5_4af107f3184bc2abd2c9693167018628._comment create mode 100644 doc/bugs/git-annex:___60__socket:_16__62__:_hPutBuf:_resource_vanished___40__Broken_pipe__41__/comment_6_f96027f1e3c405809fae42ce8533c6d1._comment create mode 100644 doc/bugs/git-annex:___60__socket:_16__62__:_hPutBuf:_resource_vanished___40__Broken_pipe__41__/comment_7_b6fe89deb468a7e4f63f7faab147e3fb._comment create mode 100644 doc/bugs/git-annex:___60__socket:_16__62__:_hPutBuf:_resource_vanished___40__Broken_pipe__41__/comment_8_ebec5d9266604f03959dc16d933ff4a4._comment create mode 100644 doc/bugs/git-annex:_fd:14:_hGetLine:_end_of_file.mdwn create mode 100644 doc/bugs/git-annex:_fd:14:_hGetLine:_end_of_file/comment_1_36756f5d9d591cc52113c5cc0c1eae91._comment create mode 100644 doc/bugs/git-annex:_getUserEntryForID:_failed___40__Success__41__.mdwn create mode 100644 doc/bugs/git-annex:_getUserEntryForID:_failed___40__Success__41__/comment_1_11a1615962325327466895d03e3d2379._comment create mode 100644 doc/bugs/git-annex:_getUserEntryForID:_failed___40__Success__41__/comment_2_eac51c3299e9fc04025675360969d537._comment create mode 100644 doc/bugs/git-annex:_getUserEntryForID:_failed___40__Success__41__/comment_3_c23dc02c7487d63b0905f1b7f3ca59f5._comment create mode 100644 doc/bugs/git-annex:_getUserEntryForID:_failed___40__Success__41__/comment_4_0e8b28de5c173bc60ecc0126fb2209ca._comment create mode 100644 doc/bugs/git-annex:_status:_1_failed.mdwn create mode 100644 doc/bugs/git-annex:_status:_1_failed/comment_10_7cd9de88e55633fc75460f4fe0400f09._comment create mode 100644 doc/bugs/git-annex:_status:_1_failed/comment_11_504a944aab34155046f2fd82c2878f3e._comment create mode 100644 doc/bugs/git-annex:_status:_1_failed/comment_1_c235cc83c75474e6393e08d2d94b119d._comment create mode 100644 doc/bugs/git-annex:_status:_1_failed/comment_2_932f6aaa712298a47868002872e16310._comment create mode 100644 doc/bugs/git-annex:_status:_1_failed/comment_3_4bf55320439de152a65e2f21d4a0604b._comment create mode 100644 doc/bugs/git-annex:_status:_1_failed/comment_4_cb2cfb798c6171f77eb7c4c4061c0f0c._comment create mode 100644 doc/bugs/git-annex:_status:_1_failed/comment_5_05c84dde377298adfd3fc20749b3108f._comment create mode 100644 doc/bugs/git-annex:_status:_1_failed/comment_6_bb5141e29c665bc0bb82611ea27d4be8._comment create mode 100644 doc/bugs/git-annex:_status:_1_failed/comment_7_5fd39168c9e1bf43909ee0ab3c75c40c._comment create mode 100644 doc/bugs/git-annex:_status:_1_failed/comment_8_e493f6bddb0bfcd9478d5f4d9fc170e0._comment create mode 100644 doc/bugs/git-annex:_status:_1_failed/comment_9_573377d444aee0895b231082bc6839a4._comment create mode 100644 doc/bugs/git-annex_3.20130216.1_tests_are_broken.mdwn create mode 100644 doc/bugs/git-annex___38___rsync_can__39__t_copy_files_with___39__:__39___in_their_names.mdwn create mode 100644 doc/bugs/git-annex_add_hangs_indefinitely_on_all_files.mdwn create mode 100644 doc/bugs/git-annex_add_hangs_indefinitely_on_all_files/comment_1_f787155da9a4d92c41546c35f3bd6a08._comment create mode 100644 doc/bugs/git-annex_add_hangs_indefinitely_on_all_files/comment_2_66ad95d98c12b4b26e06e3fe28f0ed01._comment create mode 100644 doc/bugs/git-annex_add_should_repack_as_it_goes.mdwn create mode 100644 doc/bugs/git-annex_add_should_repack_as_it_goes/comment_1_dbcaa0be4cd764128fb7263a95f73a32._comment create mode 100644 doc/bugs/git-annex_add_should_repack_as_it_goes/comment_2_6a27551c4fb7f62ed9f627134c755d01._comment create mode 100644 doc/bugs/git-annex_add_should_repack_as_it_goes/comment_3_ff8b589fbcf25c98abd1c58830074650._comment create mode 100644 doc/bugs/git-annex_branch_corruption.mdwn create mode 100644 doc/bugs/git-annex_branch_push_race.mdwn create mode 100644 doc/bugs/git-annex_broken_on_Android_4.3.mdwn create mode 100644 doc/bugs/git-annex_broken_on_Android_4.3/comment_10_e47c073f1614f7b57f86acedeeb1cadc._comment create mode 100644 doc/bugs/git-annex_broken_on_Android_4.3/comment_11_ce34578c45060b7c8b759efd1c1d8df8._comment create mode 100644 doc/bugs/git-annex_broken_on_Android_4.3/comment_12_75965395dc33046ce34ac5ba972b7d64._comment create mode 100644 doc/bugs/git-annex_broken_on_Android_4.3/comment_13_f07bc76dd3c5580fc0855a33ae835c8d._comment create mode 100644 doc/bugs/git-annex_broken_on_Android_4.3/comment_14_637c59becc68a1e4f60069d8873489ff._comment create mode 100644 doc/bugs/git-annex_broken_on_Android_4.3/comment_15_d80b87055f72873f5678a01d2630bea4._comment create mode 100644 doc/bugs/git-annex_broken_on_Android_4.3/comment_16_57ac84868b223b30f005704eefa01b8d._comment create mode 100644 doc/bugs/git-annex_broken_on_Android_4.3/comment_17_a41f4d8a72c07ad770e6479e9b8c7f1d._comment create mode 100644 doc/bugs/git-annex_broken_on_Android_4.3/comment_18_7d36637f11cda51de395303d5c1c6a3f._comment create mode 100644 doc/bugs/git-annex_broken_on_Android_4.3/comment_19_c8609c3f7f62ae5427fd8c60bc9546ed._comment create mode 100644 doc/bugs/git-annex_broken_on_Android_4.3/comment_1_0ffb3833ce2c2e0320468dc9a09866d7._comment create mode 100644 doc/bugs/git-annex_broken_on_Android_4.3/comment_20_0886bca6d0c6a9415a7794d256be2e9d._comment create mode 100644 doc/bugs/git-annex_broken_on_Android_4.3/comment_21_2b39729f95c9c4bba620ecdd3d1558ed._comment create mode 100644 doc/bugs/git-annex_broken_on_Android_4.3/comment_22_8d90d92951919aa70638b31e9248bec5._comment create mode 100644 doc/bugs/git-annex_broken_on_Android_4.3/comment_23_6398271f5cd9e94996202ef3bce6f6ed._comment create mode 100644 doc/bugs/git-annex_broken_on_Android_4.3/comment_24_c9e399833cc6235077161f490dfa866f._comment create mode 100644 doc/bugs/git-annex_broken_on_Android_4.3/comment_25_cf093737eefb2b99f6f0eac9bf3e74b3._comment create mode 100644 doc/bugs/git-annex_broken_on_Android_4.3/comment_26_c122ce53175fc9e0e114a8acd2385c0d._comment create mode 100644 doc/bugs/git-annex_broken_on_Android_4.3/comment_27_237e41e61781bb058f5fd39362a904e4._comment create mode 100644 doc/bugs/git-annex_broken_on_Android_4.3/comment_28_97f423a41ee9d2d74291594fae20dd4e._comment create mode 100644 doc/bugs/git-annex_broken_on_Android_4.3/comment_29_7b3fbe7e38f637fcea511441ac243d93._comment create mode 100644 doc/bugs/git-annex_broken_on_Android_4.3/comment_2_53e2d095b2501844cadec910de286814._comment create mode 100644 doc/bugs/git-annex_broken_on_Android_4.3/comment_30_26c04584c3c6dacf59e1b6c82042c97c._comment create mode 100644 doc/bugs/git-annex_broken_on_Android_4.3/comment_3_ddc9cbae1a721400a9acf2153e18f4f0._comment create mode 100644 doc/bugs/git-annex_broken_on_Android_4.3/comment_4_593235735e32238094121b1f79355bbd._comment create mode 100644 doc/bugs/git-annex_broken_on_Android_4.3/comment_5_f806fd5930e90920db24456297465bae._comment create mode 100644 doc/bugs/git-annex_broken_on_Android_4.3/comment_6_5741b6a5997328fdcd5cc99f841b18d3._comment create mode 100644 doc/bugs/git-annex_broken_on_Android_4.3/comment_7_3e0d9949dd810069af0b8076807e5924._comment create mode 100644 doc/bugs/git-annex_broken_on_Android_4.3/comment_8_f58897eff6b4693f0c73474ccfe6e733._comment create mode 100644 doc/bugs/git-annex_broken_on_Android_4.3/comment_9_ddba87b2f20d8a63f7b8ebdb9bd13515._comment create mode 100644 doc/bugs/git-annex_direct_fails_on_repositories_with_a_partial_set_of_files.mdwn create mode 100644 doc/bugs/git-annex_directory_hashing_problems_on_osx.mdwn create mode 100644 doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_10_f3594de3ba2ab17771a4b116031511bb._comment create mode 100644 doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_11_97de7252bf5d2a4f1381f4b2b4e24ef8._comment create mode 100644 doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_12_f1c53c3058a587185e7a78d84987539d._comment create mode 100644 doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_13_4f56aea35effe5c10ef37d7ad7adb48c._comment create mode 100644 doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_14_cc2a53c31332fe4b828ef1e72c2a4d49._comment create mode 100644 doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_15_37f1d669c1fa53ee371f781c7bb820ae._comment create mode 100644 doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_16_8a4ab1af59098f4950726cf53636c2b3._comment create mode 100644 doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_17_515d5c5fbf5bd0c188a4f1e936d913e2._comment create mode 100644 doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_18_db64c91dd1322a0ab168190686db494f._comment create mode 100644 doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_19_ff555c271637af065203ca99c9eeaf89._comment create mode 100644 doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_1_9a7b09de132097100c1a68ea7b846727._comment create mode 100644 doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_20_7e328b970169fffb8bce373d1522743b._comment create mode 100644 doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_21_98f632652b0db9131b0173d3572f4d62._comment create mode 100644 doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_22_52d41afd7fd0b71a4c8e84ab1b4df5bd._comment create mode 100644 doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_23_c2cd8a69c37539c0511bae02016180ca._comment create mode 100644 doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_2_174952fc3e3be12912e5fcfe78f2dd13._comment create mode 100644 doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_3_a18ada7ac74c63be5753fdb2fe68dae5._comment create mode 100644 doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_4_039e945617a6c1852c96974a402db29c._comment create mode 100644 doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_5_eacd0b18475c05ab9feed8cf7290b79a._comment create mode 100644 doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_6_e55117cb628dc532e468519252571474._comment create mode 100644 doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_7_0f4f471102e394ebb01da40e4d0fd9f6._comment create mode 100644 doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_8_68e2d6ccdb9622b879e4bc7005804623._comment create mode 100644 doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_9_45b11ddd200261115b653c7a14d28aa9._comment create mode 100644 doc/bugs/git-annex_does_not_install_on_windows_without_admin_rights.mdwn create mode 100644 doc/bugs/git-annex_does_not_install_on_windows_without_admin_rights/comment_1_2533800ab5a95c5d71c3b47a630e751a._comment create mode 100644 doc/bugs/git-annex_does_not_install_on_windows_without_admin_rights/comment_2_5b71785acf16a8d9ea457726599daef3._comment create mode 100644 doc/bugs/git-annex_does_not_install_on_windows_without_admin_rights/comment_3_63e4ff79bc683a70dd9a85c66e26e56a._comment create mode 100644 doc/bugs/git-annex_doesn__39__t_list_files_containing_ISO8859-15_characters.mdwn create mode 100644 doc/bugs/git-annex_doesn__39__t_list_files_containing_ISO8859-15_characters/comment_1_b84e831298c03b12471fb75da597e365._comment create mode 100644 doc/bugs/git-annex_dropunused_has_no_effect.mdwn create mode 100644 doc/bugs/git-annex_dropunused_has_no_effect/comment_1_66b581eb7111a9e98c6406ec75b899cf._comment create mode 100644 doc/bugs/git-annex_dropunused_has_no_effect/comment_2_11c46cd2087511c3d22b7ce7c149b3e9._comment create mode 100644 doc/bugs/git-annex_dropunused_has_no_effect/comment_3_b1c3d8c6ec4b20727aaa9c4b746531b0._comment create mode 100644 doc/bugs/git-annex_dropunused_has_no_effect/comment_4_f05a9a3760858c5ee5c98dd8ab059c28._comment create mode 100644 doc/bugs/git-annex_fails_to_initialize_under_Windows.mdwn create mode 100644 doc/bugs/git-annex_fails_to_initialize_under_Windows/comment_1_082277b9b906a2cc0fcace6790f5cfad._comment create mode 100644 doc/bugs/git-annex_fix_not_noticing_file_renames.mdwn create mode 100644 doc/bugs/git-annex_fix_not_noticing_file_renames/comment_1_4edd95200d59ec5a5426167b8da8e3f9._comment create mode 100644 doc/bugs/git-annex_fix_not_noticing_file_renames/comment_2_a9a44debefb3bdd4b8ed2d1cf53f2338._comment create mode 100644 doc/bugs/git-annex_fix_not_noticing_file_renames/comment_3_0efb11f35b872b75a3fbc4ebb71ac827._comment create mode 100644 doc/bugs/git-annex_get:_requested_key_is_not_present.mdwn create mode 100644 doc/bugs/git-annex_get:_requested_key_is_not_present/comment_1_d4baa6607a61d0e6a7cea1325a5ddf95._comment create mode 100644 doc/bugs/git-annex_get:_requested_key_is_not_present/comment_2_b49725488c3db5e00ede7b65ed9d62fa._comment create mode 100644 doc/bugs/git-annex_get:_requested_key_is_not_present/comment_3_c17a7138579b93c6f14e3444c11664ac._comment create mode 100644 doc/bugs/git-annex_happily_deleted_most_of_my_files___36____35____38____33__.mdwn create mode 100644 doc/bugs/git-annex_happily_deleted_most_of_my_files___36____35____38____33__/comment_1_5dd4d1cec069c13184f5dd9efca6721b._comment create mode 100644 doc/bugs/git-annex_happily_deleted_most_of_my_files___36____35____38____33__/comment_2_d9b65fe4cb4bfd58f37e7da5350c6401._comment create mode 100644 doc/bugs/git-annex_happily_deleted_most_of_my_files___36____35____38____33__/comment_3_1027187b203addd65af8cf1faf28727d._comment create mode 100644 doc/bugs/git-annex_happily_deleted_most_of_my_files___36____35____38____33__/comment_4_ac65028203ff0cbdb978200235fb4e9c._comment create mode 100644 doc/bugs/git-annex_has_issues_with_git_when_staging__47__commiting_logs.mdwn create mode 100644 doc/bugs/git-annex_immediately_re-gets_dropped_files.mdwn create mode 100644 doc/bugs/git-annex_immediately_re-gets_dropped_files/comment_1_09e616a4866e726a48be4febe6375cc8._comment create mode 100644 doc/bugs/git-annex_incorrectly_parses_bare_IPv6_addresses.mdwn create mode 100644 doc/bugs/git-annex_losing_rsync_remotes_with_encryption_enabled.mdwn create mode 100644 doc/bugs/git-annex_merge_stalls.mdwn create mode 100644 doc/bugs/git-annex_merge_stalls/comment_1_31578a754945bdcb902c62ff58704bcb._comment create mode 100644 doc/bugs/git-annex_merge_stalls/comment_2_f3b6bf180466b5931bfd20b2f0229422._comment create mode 100644 doc/bugs/git-annex_merge_stalls/comment_3_ced9b0d724fb55c756106b64c3721003._comment create mode 100644 doc/bugs/git-annex_on_crippled_filesystem_can_still_failed_due_to_case_.mdwn create mode 100644 doc/bugs/git-annex_on_crippled_filesystem_can_still_failed_due_to_case_/comment_1_850695231926dfe94f11342d3af7f63c._comment create mode 100644 doc/bugs/git-annex_on_crippled_filesystem_can_still_failed_due_to_case_/comment_2_c2a2f801a3e18ad597ff0acf2f104557._comment create mode 100644 doc/bugs/git-annex_opens_too_many_files.mdwn create mode 100644 doc/bugs/git-annex_opens_too_many_files/comment_1_37f6f5838c41c533df4be1f927b9b03d._comment create mode 100644 doc/bugs/git-annex_opens_too_many_files/comment_2_347ef233b9845b84d7c4d49ed166e797._comment create mode 100644 doc/bugs/git-annex_opens_too_many_files/comment_3_d5f644d97cd2db471deb5dcd728cae60._comment create mode 100644 doc/bugs/git-annex_opens_too_many_files/comment_4_c03bde64be8fdd962826bc7afa07d2a9._comment create mode 100644 doc/bugs/git-annex_opens_too_many_files/comment_5_33a2e783e5355e981497b9861997570b._comment create mode 100644 doc/bugs/git-annex_opens_too_many_files/comment_6_b3a5a4e4ca29c5cd2840bfeb4c63ea68._comment create mode 100644 doc/bugs/git-annex_opens_too_many_files/comment_7_d73454c9ab3729989e4bc3f2223ccde9._comment create mode 100644 doc/bugs/git-annex_quit_unexpectedly___40__macosx__41__.mdwn create mode 100644 doc/bugs/git-annex_quit_unexpectedly___40__macosx__41__/comment_1_97abb8442329d19c9687002f43afac74._comment create mode 100644 doc/bugs/git-annex_quit_unexpectedly___40__macosx__41__/comment_2_3405f3cd699860ee239cf23ade19e92c._comment create mode 100644 doc/bugs/git-annex_sucking_up_all_available_RAM_after_startup.mdwn create mode 100644 doc/bugs/git-annex_sucking_up_all_available_RAM_after_startup/comment_1_b550f292359b44977481bf69abad4012._comment create mode 100644 doc/bugs/git-annex_sucking_up_all_available_RAM_after_startup/comment_2_76e6c1d4db27bcc1767ba34e13e8211c._comment create mode 100644 doc/bugs/git-annex_sucking_up_all_available_RAM_after_startup/comment_3_14007c8e927b75c5706e80cc4242fae4._comment create mode 100644 doc/bugs/git-annex_sucking_up_all_available_RAM_after_startup/comment_4_f3266b74517b421e5310e67818fe3969._comment create mode 100644 doc/bugs/git-annex_sucking_up_all_available_RAM_after_startup/comment_5_1a07f15eb0353768c1e67a1e47e2e494._comment create mode 100644 doc/bugs/git-annex_sucking_up_all_available_RAM_after_startup/comment_6_7d0d49fd165af5e30606982e05335d34._comment create mode 100644 doc/bugs/git-annex_sync_broken_on_squeeze_backports.mdwn create mode 100644 doc/bugs/git-annex_sync_may_fail_when_the_directory_I__39__m_in_disepeared.mdwn create mode 100644 doc/bugs/git-annex_thinks_files_are_in_repositories_they_are_not.mdwn create mode 100644 doc/bugs/git-annex_thinks_files_are_in_repositories_they_are_not/comment_1_6722fd627ec4add9f2b16546bd8ef341._comment create mode 100644 doc/bugs/git-annex_thinks_files_are_in_repositories_they_are_not/comment_2_508e475f764e1cb453b756eb50bc3a15._comment create mode 100644 doc/bugs/git-annex_thinks_files_are_in_repositories_they_are_not/comment_3_1656ba18c519a262c57ef626a3449e77._comment create mode 100644 doc/bugs/git-annex_thinks_files_are_in_repositories_they_are_not/comment_4_347dc3b6e5bc6c4195ec09d54bc1398e._comment create mode 100644 doc/bugs/git-annex_thinks_files_are_in_repositories_they_are_not/comment_5_a9c93bfc3278ef8b1117eac2af859bc3._comment create mode 100644 doc/bugs/git-annex_thinks_files_are_in_repositories_they_are_not/comment_6_804dd62beef64f7d4e203bdb28cbe660._comment create mode 100644 doc/bugs/git-annex_thinks_files_are_in_repositories_they_are_not/comment_7_4ef107d70647780eb5347cae6f467fed._comment create mode 100644 doc/bugs/git-annex_webapp_command_not_found.mdwn create mode 100644 doc/bugs/git-annex_webapp_command_not_found/comment_1_6fa63ae1a7affb2351eda57ab3b4eda1._comment create mode 100644 doc/bugs/git-annex_webapp_command_not_found/comment_2_d25232bb5eaff725281869d7681e81ad._comment create mode 100644 doc/bugs/git-annex_webapp_command_not_found/comment_3_f593752a0c5c60daaacca46ced5ac5d8._comment create mode 100644 doc/bugs/git-annex_webapp_command_not_found/comment_4_e4ef964274e74cb4a39dc8ecac8ceade._comment create mode 100644 doc/bugs/git-repair_real_world_failure_example.mdwn create mode 100644 doc/bugs/git_annex_add_..._adds_too_much.mdwn create mode 100644 doc/bugs/git_annex_add_eats_files_when_filename_is_too_long.mdwn create mode 100644 doc/bugs/git_annex_add_eats_files_when_filename_is_too_long/comment_1_9650284913bec2a00cf551b90ab5d8ff._comment create mode 100644 doc/bugs/git_annex_add_eats_files_when_filename_is_too_long/comment_2_c6c8d2a1f444d85c582bc5396b08e148._comment create mode 100644 doc/bugs/git_annex_add_eats_files_when_filename_is_too_long/comment_3_5776864d78d56849001dd12e3adb9cbe._comment create mode 100644 doc/bugs/git_annex_add_eats_files_when_filename_is_too_long/comment_4_371ec7b4ae73280ede31edfe90b42a95._comment create mode 100644 doc/bugs/git_annex_add_eats_files_when_filename_is_too_long/comment_5_4fb04f646de591640f8504c0caf61acd._comment create mode 100644 doc/bugs/git_annex_add_eats_files_when_filename_is_too_long/comment_6_b4055409fe48da95bb3101c0242ef0bc._comment create mode 100644 doc/bugs/git_annex_add_error_with_Andrew_File_System.mdwn create mode 100644 doc/bugs/git_annex_add_error_with_Andrew_File_System/comment_1_bc783e551fc0e8da87bc95bff5b8f73a._comment create mode 100644 doc/bugs/git_annex_add_error_with_Andrew_File_System/comment_2_faefcf69bd61c47566131cb31b78cc19._comment create mode 100644 doc/bugs/git_annex_add_error_with_Andrew_File_System/comment_3_d5014c8b78437b9fddbb1e83d3679081._comment create mode 100644 doc/bugs/git_annex_add_memory_leak.mdwn create mode 100644 doc/bugs/git_annex_add_removes_file_with_no_data_left.mdwn create mode 100644 doc/bugs/git_annex_add_removes_file_with_no_data_left/comment_10_9cc749a6efd4359a99316036f5bc867f._comment create mode 100644 doc/bugs/git_annex_add_removes_file_with_no_data_left/comment_11_1fed5be9db29866e4dc3d3bb12907bf3._comment create mode 100644 doc/bugs/git_annex_add_removes_file_with_no_data_left/comment_12_06d517ac4ef8def4629a40d7c3549bac._comment create mode 100644 doc/bugs/git_annex_add_removes_file_with_no_data_left/comment_1_8f081aeba7065d143a453dc128543f59._comment create mode 100644 doc/bugs/git_annex_add_removes_file_with_no_data_left/comment_2_54a4b10723fd8a80dd486377ff15ce0d._comment create mode 100644 doc/bugs/git_annex_add_removes_file_with_no_data_left/comment_3_f1964e4e07991a251c2795da0361a4e2._comment create mode 100644 doc/bugs/git_annex_add_removes_file_with_no_data_left/comment_4_73c38d843c30f00f6fd8883db8e55f62._comment create mode 100644 doc/bugs/git_annex_add_removes_file_with_no_data_left/comment_5_7ede5ee312f3abdf78979c0d52a7871a._comment create mode 100644 doc/bugs/git_annex_add_removes_file_with_no_data_left/comment_6_e37cf18708f09619442c3a9532d12ed9._comment create mode 100644 doc/bugs/git_annex_add_removes_file_with_no_data_left/comment_7_a744ef7dd3a224a911ebb24858bc2fd6._comment create mode 100644 doc/bugs/git_annex_add_removes_file_with_no_data_left/comment_8_f97141b255073b90120895148220c2d7._comment create mode 100644 doc/bugs/git_annex_add_removes_file_with_no_data_left/comment_9_dd2be11dfd190129d491f5f891e7cd1a._comment create mode 100644 doc/bugs/git_annex_addurl___40__+quvi__41___should_filter_out_the___124_____40__pipe__41___character.mdwn create mode 100644 doc/bugs/git_annex_assistant_--autostart_failed.mdwn create mode 100644 doc/bugs/git_annex_assistant_--autostart_failed/comment_1_746545273b53849c42ff6272324e5155._comment create mode 100644 doc/bugs/git_annex_assistant_--autostart_failed/comment_2_5bdf6f94da12e551ae12e7f550a84d62._comment create mode 100644 doc/bugs/git_annex_assistant_--autostart_failed/comment_3_bfd646f69946a5fe926b270cf94f87cb._comment create mode 100644 doc/bugs/git_annex_content_fails_with_a_parse_error.mdwn create mode 100644 doc/bugs/git_annex_content_fails_with_a_parse_error/comment_1_2b60b6ae0115de13ecf837b34dadcd1d._comment create mode 100644 doc/bugs/git_annex_copy_--fast_does_not_copy_files.mdwn create mode 100644 doc/bugs/git_annex_copy_-f_REMOTE_._doesn__39__t_work_as_expected.mdwn create mode 100644 doc/bugs/git_annex_copy_trying_to_connect_to_remotes_uninvolved.mdwn create mode 100644 doc/bugs/git_annex_copy_trying_to_connect_to_remotes_uninvolved/comment_1_f1330935a07460c9c8bc82ee8d4709c5._comment create mode 100644 doc/bugs/git_annex_dead_does_not_work_as_expected_when_multiple_repos_exist_with_the_same_name___40__notably_including_dead_ones__41__.mdwn create mode 100644 doc/bugs/git_annex_dead_does_not_work_as_expected_when_multiple_repos_exist_with_the_same_name___40__notably_including_dead_ones__41__/comment_1_7ee08a60e4b2516c010d3c2163049681._comment create mode 100644 doc/bugs/git_annex_dead_does_not_work_as_expected_when_multiple_repos_exist_with_the_same_name___40__notably_including_dead_ones__41__/comment_2_c29525bfda08717f68aaac83014e6b08._comment create mode 100644 doc/bugs/git_annex_describe_can_break_uuid.log.mdwn create mode 100644 doc/bugs/git_annex_describe_can_break_uuid.log/comment_2_9ead36f13cbde6c822b231441de636ae._comment create mode 100644 doc/bugs/git_annex_does_nothing_useful.mdwn create mode 100644 doc/bugs/git_annex_does_nothing_useful/comment_10_457354dc0018333002dc5049935c0feb._comment create mode 100644 doc/bugs/git_annex_does_nothing_useful/comment_11_8a6d244165dd238ddf9dd629795de2f6._comment create mode 100644 doc/bugs/git_annex_does_nothing_useful/comment_12_30d06bc0f1c37d988a1a31962b57533c._comment create mode 100644 doc/bugs/git_annex_does_nothing_useful/comment_1_fc4f51ddcbc69631e2835b86c3489c8e._comment create mode 100644 doc/bugs/git_annex_does_nothing_useful/comment_2_9bb1647e6c59f1ed7b13b81ecc33f920._comment create mode 100644 doc/bugs/git_annex_does_nothing_useful/comment_3_d434f5c614a27b75d73530b5b918b851._comment create mode 100644 doc/bugs/git_annex_does_nothing_useful/comment_4_998e33219d29ea41b0b2a5d2955a9862._comment create mode 100644 doc/bugs/git_annex_does_nothing_useful/comment_5_c72e2571e5b8c06bbfa2276a7ad1e8a6._comment create mode 100644 doc/bugs/git_annex_does_nothing_useful/comment_6_bc8b42432ba25de8f972c192bc3cdff6._comment create mode 100644 doc/bugs/git_annex_does_nothing_useful/comment_7_e7469a4c5e45078ade775f5cbdd17cfc._comment create mode 100644 doc/bugs/git_annex_does_nothing_useful/comment_8_bc9e6fd284440a59ffe4e4ed1f73f7d7._comment create mode 100644 doc/bugs/git_annex_does_nothing_useful/comment_9_38a2dbeee3750d79ca9a943a02fceb29._comment create mode 100644 doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9.mdwn create mode 100644 doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_10_141819a6b67de2602673698f6f148106._comment create mode 100644 doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_11_8be96359fd2bd33ed2961e499dc2685e._comment create mode 100644 doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_12_26950a37e86d4dd83dd59fb2564d0a2e._comment create mode 100644 doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_13_cbf8150dbe0da64bde7f6af8e041eda8._comment create mode 100644 doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_14_0c203f90d911cf6869894dae89575a49._comment create mode 100644 doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_15_68cbb7268bdad73357da2d11e05d73c4._comment create mode 100644 doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_16_816d552f871a1b06306f04d575adb2e5._comment create mode 100644 doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_17_7905b097a9c582452fb04cdc88ed4285._comment create mode 100644 doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_18_bd5ac9bb2eaab66af6aa13b39172b49d._comment create mode 100644 doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_19_9881db7bb6fef4e47c54cdc23e995f17._comment create mode 100644 doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_1_4fb9d3de245dddab65fb1a53a67a095c._comment create mode 100644 doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_20_41e2ea458669f59f96b5860825745910._comment create mode 100644 doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_21_515039e321e0595f95430d8082bd54a5._comment create mode 100644 doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_22_9412236296871c570c66f5b4c7f9681e._comment create mode 100644 doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_23_e4e7d13be6c0bc63f426e535de6172f8._comment create mode 100644 doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_24_c73e1277c5f284b1019362fb2bef94a8._comment create mode 100644 doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_2_f513259a2641e00b049203014ab940c8._comment create mode 100644 doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_3_54ee7b90467fee8b0457e9c447747500._comment create mode 100644 doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_4_7e6223c2dae3346e17276c7bbb01d53e._comment create mode 100644 doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_5_13b6e595d595da7f036e81258a65541e._comment create mode 100644 doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_6_94144c0cbdbccc72c13e12daf7657a29._comment create mode 100644 doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_7_9eb064ffdc3fdb70e85572185e151a3f._comment create mode 100644 doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_8_cde756e8a9b18fe2ca9cda25967bc7fb._comment create mode 100644 doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_9_1fd6a4374a334bc03914c3e0df95ef95._comment create mode 100644 doc/bugs/git_annex_fork_bombs_on_gpg_file.mdwn create mode 100644 doc/bugs/git_annex_fork_bombs_on_gpg_file/comment_10_6e29b60cd77f3288e33ad270f95f410e._comment create mode 100644 doc/bugs/git_annex_fork_bombs_on_gpg_file/comment_11_ad13e3221ae06086e86800316912d951._comment create mode 100644 doc/bugs/git_annex_fork_bombs_on_gpg_file/comment_12_41746b731eae7f280bb668c776022bcb._comment create mode 100644 doc/bugs/git_annex_fork_bombs_on_gpg_file/comment_13_56ca8590110abffeed6d826c54ca1136._comment create mode 100644 doc/bugs/git_annex_fork_bombs_on_gpg_file/comment_1_73ae438a37e4c5f56fe291448e1c64dd._comment create mode 100644 doc/bugs/git_annex_fork_bombs_on_gpg_file/comment_2_aa237adebe7674b8cdb9a967bb5f96a8._comment create mode 100644 doc/bugs/git_annex_fork_bombs_on_gpg_file/comment_3_ab403d7abbbbabd498b954b0b9742755._comment create mode 100644 doc/bugs/git_annex_fork_bombs_on_gpg_file/comment_4_a35d04440b1220faf9088107c3f17762._comment create mode 100644 doc/bugs/git_annex_fork_bombs_on_gpg_file/comment_5_8345331b9b313769ba401da2ffd89332._comment create mode 100644 doc/bugs/git_annex_fork_bombs_on_gpg_file/comment_6_7eb535ca38b3e84d44d0f8cbf5e61b8b._comment create mode 100644 doc/bugs/git_annex_fork_bombs_on_gpg_file/comment_7_a3aa4231a82917c56cbdf52b65db7133._comment create mode 100644 doc/bugs/git_annex_fork_bombs_on_gpg_file/comment_8_178fd4e4d6abbca192fcd6d592615fca._comment create mode 100644 doc/bugs/git_annex_fork_bombs_on_gpg_file/comment_9_7d80f131f43312bb061df2be7fa956ef._comment create mode 100644 doc/bugs/git_annex_fsck_in_direct_mode_does_not_checksum_files.mdwn create mode 100644 doc/bugs/git_annex_fsck_in_direct_mode_does_not_checksum_files/comment_1_a6cde4aa495512344fa7f50e10749c68._comment create mode 100644 doc/bugs/git_annex_fsck_in_direct_mode_does_not_checksum_files/comment_2_4ac3b87ec0bc0514c4eff9f5a75b9f5d._comment create mode 100644 doc/bugs/git_annex_fsck_in_direct_mode_does_not_checksum_files/comment_3_d18b1fdc866edf2786d2c6b7ec55119f._comment create mode 100644 doc/bugs/git_annex_fsck_in_direct_mode_does_not_checksum_files/comment_4_31e4fcbf63c11cc374a849daf3ce1dbc._comment create mode 100644 doc/bugs/git_annex_fsck_is_a_no-op_in_bare_repos.mdwn create mode 100644 doc/bugs/git_annex_fsck_is_a_no-op_in_bare_repos/comment_1_fc59fbd1cdf8ca97b0a4471d9914aaa1._comment create mode 100644 doc/bugs/git_annex_fsck_is_a_no-op_in_bare_repos/comment_2_273a45e6977d40d39e0d9ab924a83240._comment create mode 100644 doc/bugs/git_annex_get_choke_when_remote_is_an_ssh_url_with_a_port.mdwn create mode 100644 doc/bugs/git_annex_gets_confused_about_remotes_with_dots_in_their_names.mdwn create mode 100644 doc/bugs/git_annex_import_destroys_a_fellow_git_annex_repository.mdwn create mode 100644 doc/bugs/git_annex_importfeed_fails.mdwn create mode 100644 doc/bugs/git_annex_indirect_can_fail_catastrophically.mdwn create mode 100644 doc/bugs/git_annex_indirect_can_fail_catastrophically/comment_1_0b085e7e8c8e364f479574bc00c7c394._comment create mode 100644 doc/bugs/git_annex_initremote_needs_some___34__error_checking__34__.mdwn create mode 100644 doc/bugs/git_annex_initremote_walks_.git-annex.mdwn create mode 100644 doc/bugs/git_annex_lock_dangerous.mdwn create mode 100644 doc/bugs/git_annex_map_has_problems_with_urls_containing___126__.mdwn create mode 100644 doc/bugs/git_annex_migrate_leaves_old_backend_versions_around.mdwn create mode 100644 doc/bugs/git_annex_migrate_leaves_old_backend_versions_around/comment_1_f3e418144e5a5a9b3eda459546fc2bb0._comment create mode 100644 doc/bugs/git_annex_should_use___39__git_add_-f__39___internally.mdwn create mode 100644 doc/bugs/git_annex_should_use___39__git_add_-f__39___internally/comment_1_7683bf02cf9e97830fb4690314501568._comment create mode 100644 doc/bugs/git_annex_status_doesn__39__t_use_.gitignore_in_direct_mode.mdwn create mode 100644 doc/bugs/git_annex_sync_--content_not_syncing_all_objects.mdwn create mode 100644 doc/bugs/git_annex_sync_--content_not_syncing_all_objects/comment_1_36deea0f1277d6888c8bb79156c56efa._comment create mode 100644 doc/bugs/git_annex_sync_--content_not_syncing_all_objects/comment_2_70804d50b07630fadfc029a22173c5a0._comment create mode 100644 doc/bugs/git_annex_sync_--content_not_syncing_all_objects/comment_3_d7349af488008e3ca6557e0c1fbfc5b6._comment create mode 100644 doc/bugs/git_annex_sync_deleted_a_bunch_of_files___40__not_expected__41__.mdwn create mode 100644 doc/bugs/git_annex_sync_deleted_a_bunch_of_files___40__not_expected__41__/comment_1_e25451863622eefed664f6a210cbe67d._comment create mode 100644 doc/bugs/git_annex_sync_deleted_a_bunch_of_files___40__not_expected__41__/comment_2_f49e6f4016b3a6f918961a2412902e03._comment create mode 100644 doc/bugs/git_annex_sync_deleted_a_bunch_of_files___40__not_expected__41__/comment_3_a234e4f58d2cc3b0110e4e65aceeb2c3._comment create mode 100644 doc/bugs/git_annex_sync_deleted_a_bunch_of_files___40__not_expected__41__/comment_4_a01a867500fd94e6b317e74a0b0b1401._comment create mode 100644 doc/bugs/git_annex_sync_in_direct_mode_does_not_honor_skip-worktree.mdwn create mode 100644 doc/bugs/git_annex_sync_in_direct_mode_does_not_honor_skip-worktree/comment_1_69baeb997086c885f34fd1dc385cf5d6._comment create mode 100644 doc/bugs/git_annex_sync_in_direct_mode_does_not_honor_skip-worktree/comment_2_fb8c0bebb9aaa75ee7eaf6999b1db49e._comment create mode 100644 doc/bugs/git_annex_sync_in_direct_mode_does_not_honor_skip-worktree/comment_3_6bfd4e9a7853af93e72b717249de9439._comment create mode 100644 doc/bugs/git_annex_sync_in_direct_mode_does_not_honor_skip-worktree/comment_4_a7eab4171af7e46bcc637aacf630e9db._comment create mode 100644 doc/bugs/git_annex_test_under_windows_8.1.mdwn create mode 100644 doc/bugs/git_annex_uninit_loses_content_when_interrupted.mdwn create mode 100644 doc/bugs/git_annex_uninit_loses_content_when_interrupted/comment_1_fd9d2abbc90fb4f470b2212bc1f4a2dd._comment create mode 100644 doc/bugs/git_annex_uninit_loses_content_when_interrupted/comment_2_0e99f6ef4f8b342ef0ebc64dbf8e2ce6._comment create mode 100644 doc/bugs/git_annex_uninit_removes_files_not_previously_added_to_annex.mdwn create mode 100644 doc/bugs/git_annex_uninit_removes_files_not_previously_added_to_annex/comment_1_ce4e3b1bf0d53119d049cf7dd621c5c4._comment create mode 100644 doc/bugs/git_annex_uninit_removes_files_not_previously_added_to_annex/comment_2_3aa125635609fce41ab0c98cefb81f98._comment create mode 100644 doc/bugs/git_annex_unlock_is_not_atomic.mdwn create mode 100644 doc/bugs/git_annex_unused_aborts_due_to_filename_encoding_problems.mdwn create mode 100644 doc/bugs/git_annex_unused_aborts_due_to_filename_encoding_problems/comment_1_8ba4fdb9f2d3bd44db5e910526cb9124._comment create mode 100644 doc/bugs/git_annex_unused_aborts_due_to_filename_encoding_problems/comment_2_2a4a2b3e287a0444a1c8e8d98768a206._comment create mode 100644 doc/bugs/git_annex_unused_aborts_due_to_filename_encoding_problems/comment_3_dacfdb8322045fc4ceefc9128bf7c505._comment create mode 100644 doc/bugs/git_annex_unused_aborts_due_to_filename_encoding_problems/comment_4_7889a3ff5ce80c6322448aa674df8525._comment create mode 100644 doc/bugs/git_annex_unused_aborts_due_to_filename_encoding_problems/comment_5_6d28c2537ce24eeb3496ca349823defd._comment create mode 100644 doc/bugs/git_annex_unused_aborts_due_to_filename_encoding_problems/comment_6_4bf14ecef622988e80976c0fb55c24b9._comment create mode 100644 doc/bugs/git_annex_unused_aborts_due_to_filename_encoding_problems/comment_7_d2e5382fe0f38fb9dd9ee69901c68151._comment create mode 100644 doc/bugs/git_annex_unused_aborts_due_to_filename_encoding_problems/comment_8_b282757537cda863d3dc6d0bbfd6b656._comment create mode 100644 doc/bugs/git_annex_unused_considers_remote_branches_which_makes_it_inconsistent.mdwn create mode 100644 doc/bugs/git_annex_unused_considers_remote_branches_which_makes_it_inconsistent/comment_1_a636ffe55b11c46a0afcc0b9a3a88cd4._comment create mode 100644 doc/bugs/git_annex_unused_considers_remote_branches_which_makes_it_inconsistent/comment_2_5e1ad57420efd16ae09c9e5cad55b5f2._comment create mode 100644 doc/bugs/git_annex_unused_failes_on_empty_repository.mdwn create mode 100644 doc/bugs/git_annex_unused_seems_to_check_for_current_path.mdwn create mode 100644 doc/bugs/git_annex_upgrade_loses_track_of_files_with___34____38____34___character___40__and_probably_others__41__.mdwn create mode 100644 doc/bugs/git_annex_upgrade_loses_track_of_files_with___34____38____34___character___40__and_probably_others__41__/comment_1_861506e40e0d04d2be98bbfe9188be89._comment create mode 100644 doc/bugs/git_annex_upgrade_output_is_inconsistent_and_spammy.mdwn create mode 100644 doc/bugs/git_annex_upgrade_output_is_inconsistent_and_spammy/comment_1_3a01c81efba321b0e46d1bc0426ad8d1._comment create mode 100644 doc/bugs/git_annex_version_should_without_being_in_a_repo_.mdwn create mode 100644 doc/bugs/git_annex_version_should_without_being_in_a_repo_/comment_1_e7b26eeb1a765fd83280ef907c0deef2._comment create mode 100644 doc/bugs/git_annex_webapp_--listen_on_a_remote_linux_server.mdwn create mode 100644 doc/bugs/git_annex_webapp_--listen_on_a_remote_linux_server/comment_1_db99c00830d3f15ebe790c4dc8b60bd7._comment create mode 100644 doc/bugs/git_annex_webapp_runs_on_wine.mdwn create mode 100644 doc/bugs/git_annex_webapp_runs_on_wine/comment_1_c71dfa42780c0fc78f88ce054e5f3ee3._comment create mode 100644 doc/bugs/git_annex_webapp_runs_on_wine/comment_2_f28441b18b0be90c1e58348455ce09d9._comment create mode 100644 doc/bugs/git_annex_won__39__t_copy_files_to_my_usb_drive.mdwn create mode 100644 doc/bugs/git_annex_won__39__t_copy_files_to_my_usb_drive/comment_1_7707017fbf3d92ee21d600fe0aefce4f._comment create mode 100644 doc/bugs/git_annex_won__39__t_copy_files_to_my_usb_drive/comment_2_f3392ec3ca7392823cbad2cc9b77f54e._comment create mode 100644 doc/bugs/git_annex_won__39__t_copy_files_to_my_usb_drive/comment_3_b3d016a487b12748fe2c4d14300eb158._comment create mode 100644 doc/bugs/git_annex_won__39__t_copy_files_to_my_usb_drive/comment_4_61f600511a3172f0707e5809fc444d0c._comment create mode 100644 doc/bugs/git_annex_won__39__t_copy_files_to_my_usb_drive/comment_5_8cf029ac7bf3c19dcb0b613eed3b52ac._comment create mode 100644 doc/bugs/git_annex_won__39__t_copy_files_to_my_usb_drive/comment_6_e40d88eba7d8aec1530ce1d32d1c85f2._comment create mode 100644 doc/bugs/git_annex_won__39__t_copy_files_to_my_usb_drive/comment_7_b101fab9e690d1b335a1a29abab68d6c._comment create mode 100644 doc/bugs/git_annex_won__39__t_copy_files_to_my_usb_drive/comment_8_b30d32086314a7e357f3dd6608828ee5._comment create mode 100644 doc/bugs/git_annix_breaks_git_commit_after_uninstall.mdwn create mode 100644 doc/bugs/git_annix_breaks_git_commit_after_uninstall/comment_1_c8b1bab40d3bb2468a5bba7b116e854e._comment create mode 100644 doc/bugs/git_annix_breaks_git_commit_after_uninstall/comment_2_4173770375fca51dcaf9b974296d041a._comment create mode 100644 doc/bugs/git_command_line_constructed_by_unannex_command_has_tons_of_redundant_-a_paramters.mdwn create mode 100644 doc/bugs/git_defunct_processes___40__child_of_git-annex_assistant__41__.mdwn create mode 100644 doc/bugs/git_defunct_processes___40__child_of_git-annex_assistant__41__/comment_1_5e3f4b63db5cd32b63fb3e6a78f9b093._comment create mode 100644 doc/bugs/git_rename_detection_on_file_move.mdwn create mode 100644 doc/bugs/git_rename_detection_on_file_move/comment_10_5ec2f965c80cc5dd31ee3c4edb695664._comment create mode 100644 doc/bugs/git_rename_detection_on_file_move/comment_1_0531dcfa833b0321a7009526efe3df33._comment create mode 100644 doc/bugs/git_rename_detection_on_file_move/comment_2_7101d07400ad5935f880dc00d89bf90e._comment create mode 100644 doc/bugs/git_rename_detection_on_file_move/comment_3_57010bcaca42089b451ad8659a1e018e._comment create mode 100644 doc/bugs/git_rename_detection_on_file_move/comment_4_79d96599f757757f34d7b784e6c0e81c._comment create mode 100644 doc/bugs/git_rename_detection_on_file_move/comment_5_d61f5693d947b9736b29fca1dbc7ad76._comment create mode 100644 doc/bugs/git_rename_detection_on_file_move/comment_6_f63de6fe2f7189c8c2908cc41c4bc963._comment create mode 100644 doc/bugs/git_rename_detection_on_file_move/comment_7_7f20d0b2f6ed1c34021a135438037306._comment create mode 100644 doc/bugs/git_rename_detection_on_file_move/comment_8_6a00500b24ba53248c78e1ffc8d1a591._comment create mode 100644 doc/bugs/git_rename_detection_on_file_move/comment_9_75e0973f6d573df615e01005ebcea87d._comment create mode 100644 doc/bugs/git_repo_fails_to_checkout.mdwn create mode 100644 doc/bugs/git_repo_fails_to_checkout/comment_1_d92e7e3b41382501a08f6a66c673b1fd._comment create mode 100644 doc/bugs/git_version_in_prebuilt_linux_tarball_is_outdated.mdwn create mode 100644 doc/bugs/git_version_in_prebuilt_linux_tarball_is_outdated/comment_1_2a5a07498df9d38531d4570f7b463b9a._comment create mode 100644 doc/bugs/gitignore_for_DCIM_on_Android_misses_some_files.mdwn create mode 100644 doc/bugs/gitignore_for_DCIM_on_Android_misses_some_files/comment_1_f683ecf93e5a17c5c9c06225dbcce2a9._comment create mode 100644 doc/bugs/gix-annex_help_is_homicidal.mdwn create mode 100644 doc/bugs/glacier_from_multiple_repos.mdwn create mode 100644 doc/bugs/googlemail.mdwn create mode 100644 doc/bugs/gpg_bundled_with_OSX_build_fails.mdwn create mode 100644 doc/bugs/gpg_bundled_with_OSX_build_fails/comment_1_ec911f920db6c354ba998ffbb5886606._comment create mode 100644 doc/bugs/gpg_bundled_with_OSX_build_fails/comment_2_bf2a3ab1bbe258bd501ec4b776882adf._comment create mode 100644 doc/bugs/gpg_bundled_with_OSX_build_fails/comment_3_c0142427400323c00bd8294415ae32c5._comment create mode 100644 doc/bugs/gpg_bundled_with_OSX_build_fails/comment_4_b56db4b5afc276f88a2b980e22fda8a0._comment create mode 100644 doc/bugs/gpg_bundled_with_OSX_build_fails/comment_5_a4eda81e5f927c463593bc48fbe84077._comment create mode 100644 doc/bugs/gpg_bundled_with_OSX_build_fails/comment_6_2f0b9331d16a208883bac586258a7b50._comment create mode 100644 doc/bugs/gpg_bundled_with_OSX_build_fails/comment_7_c05c484a6134f93796cff08de0f63e80._comment create mode 100644 doc/bugs/gpg_bundled_with_OSX_build_fails/comment_8_f2cb5467ebe80cf67e1155b771b73978._comment create mode 100644 doc/bugs/gpg_bundled_with_OSX_build_fails/comment_9_27bbda7e31f55b29e1473555ee17e613._comment create mode 100644 doc/bugs/gpg_error_on_android.mdwn create mode 100644 doc/bugs/gpg_error_on_android/comment_1_870583fd1b7a33b688b9a228077d1333._comment create mode 100644 doc/bugs/gpg_error_on_android/comment_2_9ce5511a109bde50d8cf87bad0268b4a._comment create mode 100644 doc/bugs/gpg_error_on_android/comment_3_b345e80f38d38f82cfcfce3102138fb8._comment create mode 100644 doc/bugs/gpg_error_on_android/comment_4_032f42235b7f26854e725041ca33384b._comment create mode 100644 doc/bugs/gpg_fails_on_Mac_OS_10.9_when_creating_a_new_remote_repository_via_assistant.mdwn create mode 100644 doc/bugs/gpg_fails_on_Mac_OS_10.9_when_creating_a_new_remote_repository_via_assistant/comment_1_7b409701c650b55b3472accd70555f16._comment create mode 100644 doc/bugs/gpg_fails_on_Mac_OS_10.9_when_creating_a_new_remote_repository_via_assistant/comment_2_40b00f7258512677516ec5036b89090f._comment create mode 100644 doc/bugs/gpg_goes_to_100__37___cpu_on_bad_input_data.mdwn create mode 100644 doc/bugs/gpg_goes_to_100__37___cpu_on_bad_input_data/comment_1_889218fb7c0115b03d9bad0c07296097._comment create mode 100644 doc/bugs/gpg_hangs_on_glacier_remote_creation.mdwn create mode 100644 doc/bugs/gpg_hangs_on_glacier_remote_creation/comment_1_41ca74a4e4aaf4f6b012a92677037651._comment create mode 100644 doc/bugs/gpg_hangs_on_glacier_remote_creation/comment_2_dd11fd25c8bb1f2d7e1292c07abf553e._comment create mode 100644 doc/bugs/gpg_hangs_on_glacier_remote_creation/comment_3_543d8a13756c1355a5752867bdcbefd3._comment create mode 100644 doc/bugs/gpg_hangs_on_glacier_remote_creation/comment_4_6441cf25e6bd62c96d7e766da9bdd7fb._comment create mode 100644 doc/bugs/gpg_hangs_on_glacier_remote_creation/comment_5_72e152294e36bc5f2d78e8e2ebed6a23._comment create mode 100644 doc/bugs/gpg_hangs_on_glacier_remote_creation/comment_6_890e85df05903795e01efbd7879f9c87._comment create mode 100644 doc/bugs/gpg_hangs_on_glacier_remote_creation/comment_7_042047f9fcc45abbfa47c3973d79f08e._comment create mode 100644 doc/bugs/gpg_needs_--use-agent.mdwn create mode 100644 doc/bugs/gsha256sum_crashes.mdwn create mode 100644 doc/bugs/gsha256sum_crashes/comment_1_8597d8ee29232494b1795526b6a0d8d1._comment create mode 100644 doc/bugs/gsha256sum_crashes/comment_2_e410fc1998fbc7db8c13081f76acf7fc._comment create mode 100644 doc/bugs/gsha256sum_crashes/comment_3_f796dd49097425148b785bb7b6213df6._comment create mode 100644 doc/bugs/gsha256sum_crashes/comment_4_1c46b4ad0c981c6105ffb8531223f0b1._comment create mode 100644 doc/bugs/gsha256sum_crashes/comment_5_3fa106ed7fb30226ee7c48b66edb963c._comment create mode 100644 doc/bugs/gsha256sum_crashes/comment_6_276b181b2aeb1512e0468b88598e0a84._comment create mode 100644 doc/bugs/gsha256sum_crashes/comment_7_c2898422ceb9e103d8acdde866b7a211._comment create mode 100644 doc/bugs/hGetContents:_user_error.mdwn create mode 100644 doc/bugs/hGetContents:_user_error/comment_1_30178f151f8c60d2ff856ca543dc506c._comment create mode 100644 doc/bugs/hGetContents:_user_error/comment_2_f74eeed4a007058a22183fd678ecd6c6._comment create mode 100644 doc/bugs/hGetContents:_user_error/comment_3_515e562228a89a13d6d857a874f4a468._comment create mode 100644 doc/bugs/hGetContents:_user_error/comment_4_8c6ed5e459c5c66b77db446c6317114c._comment create mode 100644 doc/bugs/hGetContents:_user_error/comment_5_f80bce48c3f96b0cd6892af43ee88a96._comment create mode 100644 doc/bugs/hGetContents:_user_error/comment_6_69dc09e4ae726856dafbeec34170671c._comment create mode 100644 doc/bugs/hGetContents:_user_error/comment_7_3f66b03f773341fad94ec16b4f55edaa._comment create mode 100644 doc/bugs/hGetContents:_user_error/comment_8_a697e2d36abfc999e65c9f587c0de56e._comment create mode 100644 doc/bugs/hGetContents:_user_error/comment_9_da7c5905a64bb6779970f9394155e629._comment create mode 100644 doc/bugs/haskell-dbus_problems_on_OSX___40__or_this_a_general_problem__41__.mdwn create mode 100644 doc/bugs/host_with_rysnc_installed__44___not_recognized.mdwn create mode 100644 doc/bugs/host_with_rysnc_installed__44___not_recognized/comment_1_3ff000eb3efde41426c7b086ae627dcf._comment create mode 100644 doc/bugs/host_with_rysnc_installed__44___not_recognized/comment_2_34e592ab057df2df54e13d3f5cae64f0._comment create mode 100644 doc/bugs/host_with_rysnc_installed__44___not_recognized/comment_3_05ffbae13d8f9b08315f40bb9b206f46._comment create mode 100644 doc/bugs/host_with_rysnc_installed__44___not_recognized/comment_4_99d1f151263ca3433dd4afa8a928b1fe._comment create mode 100644 doc/bugs/host_with_rysnc_installed__44___not_recognized/comment_5_6ef1a377b0b4d3efeffdf9693d0b496b._comment create mode 100644 doc/bugs/host_with_rysnc_installed__44___not_recognized/comment_6_d9e36828ad55f3181a1c650010f23d6b._comment create mode 100644 doc/bugs/id__95__rsa_on_android.mdwn create mode 100644 doc/bugs/id__95__rsa_on_android/comment_1_58f4fd1c4ae29bc3d2f3ea0aa6f6c12b._comment create mode 100644 doc/bugs/id__95__rsa_on_android/comment_2_7039ed326c92211aa92e9276aba8c6b6._comment create mode 100644 doc/bugs/id__95__rsa_on_android/comment_3_cbe24ed08a7ef91c8c0c20ab9b7d25b7._comment create mode 100644 doc/bugs/illegal_hardware_instruction_on_OSX_for_5.20131230-g9a495e6.mdwn create mode 100644 doc/bugs/illegal_hardware_instruction_on_OSX_for_5.20131230-g9a495e6/comment_1_515682c2338c861580105e869df648a1._comment create mode 100644 doc/bugs/immediately_drops_files.mdwn create mode 100644 doc/bugs/immediately_drops_files/comment_1_9ef6e694ef8a8eee7a42f88554475db7._comment create mode 100644 doc/bugs/immediately_drops_files/comment_2_76e4f8b73ab60b2540dd2a3e5379791d._comment create mode 100644 doc/bugs/immediately_drops_files/comment_3_788db083f5ba2e5589c3b952203ec954._comment create mode 100644 doc/bugs/immediately_drops_files/comment_4_425b79865eb77d69d0b7a71a14639f81._comment create mode 100644 doc/bugs/immediately_drops_files/comment_5_7c9f660b6bcec31827a44a650e9d4622._comment create mode 100644 doc/bugs/import_memleak_from_the_assistant.mdwn create mode 100644 doc/bugs/import_memleak_from_the_assistant/comment_1_81c80ca3ea288c651ccf45c83477e058._comment create mode 100644 doc/bugs/import_memleak_from_the_assistant/comment_2_56089b7ad5d02c39ae0aacb442d789e9._comment create mode 100644 doc/bugs/import_memleak_from_the_assistant/comment_3_b193a4a0901c681b59a97b93b456765b._comment create mode 100644 doc/bugs/import_memleak_from_the_assistant/comment_4_d9464c7dc41773650ef7291391e1b414._comment create mode 100644 doc/bugs/import_memleak_from_the_assistant/leakafter.png create mode 100644 doc/bugs/import_memleak_from_the_assistant/leakbefore.png create mode 100644 doc/bugs/importfeed_fails__44___bad_feed_content.mdwn create mode 100644 doc/bugs/importfeed_fails_when_using_the_option_--lazy_for_specific_podcast.mdwn create mode 100644 doc/bugs/importfeed_fails_when_using_the_option_--lazy_for_specific_podcast/comment_1_4ccfabbaf75e139b32f6fa6f7bc6a7fe._comment create mode 100644 doc/bugs/importfeed_should_allow_pubdate_in_the_template.mdwn create mode 100644 doc/bugs/importfeed_uses___34____95__foo__34___as_extension.mdwn create mode 100644 doc/bugs/inconsistent_use_of_SI_prefixes.mdwn create mode 100644 doc/bugs/incremental_fsck_should_not_use_sticky_bit.mdwn create mode 100644 doc/bugs/incremental_fsck_should_not_use_sticky_bit/comment_1_204f45a43cd10bcb45c4920a13d66e8d._comment create mode 100644 doc/bugs/incremental_fsck_should_not_use_sticky_bit/comment_2_a8bb264cb2ceece72e0dd9191b2b566e._comment create mode 100644 doc/bugs/incremental_fsck_should_not_use_sticky_bit/comment_3_c6c8d3c84afa497bfdfe25b492dac5b9._comment create mode 100644 doc/bugs/incremental_fsck_should_not_use_sticky_bit/comment_4_5ac5a10bdddf23153e8ea0a8eb60323e._comment create mode 100644 doc/bugs/incremental_fsck_should_not_use_sticky_bit/comment_5_ec29ed50c4321cf9e21c56c13c65156b._comment create mode 100644 doc/bugs/incremental_fsck_should_not_use_sticky_bit/comment_6_c7f1170b84f9ea4befe96cdfe3bdaa1f._comment create mode 100644 doc/bugs/index_file_smaller_than_expected.mdwn create mode 100644 doc/bugs/index_file_smaller_than_expected/comment_1_d87ae8c4d384d2ce6d1286b51bfdeba1._comment create mode 100644 doc/bugs/info_file_contains_wrong_version.mdwn create mode 100644 doc/bugs/interference_with_Dropbox_results_in_data_loss.mdwn create mode 100644 doc/bugs/interference_with_Dropbox_results_in_data_loss/comment_1_837c7ab2d31531ac8a61509225926814._comment create mode 100644 doc/bugs/interference_with_Dropbox_results_in_data_loss/comment_2_fe852adc1d7d3062ace269ceb134f3ad._comment create mode 100644 doc/bugs/internal_server_error:_hGetContents:_invalid_argument___40__invalid_byte_sequence__41__.mdwn create mode 100644 doc/bugs/internal_server_error:_unknown_UUID_on_webapp.mdwn create mode 100644 doc/bugs/internal_server_error_creating_repo_on_ssh_server.mdwn create mode 100644 doc/bugs/internal_server_error_creating_repo_on_ssh_server/comment_1_4a2c9338d5c779496049d78e29cf5cbd._comment create mode 100644 doc/bugs/internal_server_error_when_choosing_encrypted_rsync_repo_option.mdwn create mode 100644 doc/bugs/internal_server_error_when_choosing_encrypted_rsync_repo_option/comment_1_14a2f775f43a86129ce3649a06f8ba0b._comment create mode 100644 doc/bugs/internal_server_error_when_choosing_encrypted_rsync_repo_option/comment_2_7b277320fcffd8d03e0d3d31398eb571._comment create mode 100644 doc/bugs/internal_server_error_when_choosing_encrypted_rsync_repo_option/comment_3_ba9dd8f2cc46640383d4339a3661571f._comment create mode 100644 doc/bugs/internal_server_error_when_choosing_encrypted_rsync_repo_option/comment_4_274ae39d55545bde0be931d7a6c42c94._comment create mode 100644 doc/bugs/internal_server_error_when_choosing_encrypted_rsync_repo_option/comment_5_242291d46acc61bdfc112e3316de528b._comment create mode 100644 doc/bugs/internal_server_error_when_choosing_encrypted_rsync_repo_option/comment_6_76b936263e82ca6c415a16ed57e770b4._comment create mode 100644 doc/bugs/internal_server_error_when_choosing_encrypted_rsync_repo_option/comment_7_9ccd3749fd9f32b0906c0b9428cc514f._comment create mode 100644 doc/bugs/internal_server_error_when_choosing_encrypted_rsync_repo_option/comment_8_4e8982668b5044b2286d55c90adb9da3._comment create mode 100644 doc/bugs/internal_server_error_when_choosing_encrypted_rsync_repo_option/comment_9_aaf0ee250972d737a2ca57de5b5f1c0a._comment create mode 100644 doc/bugs/interrupting_migration_causes_problems.mdwn create mode 100644 doc/bugs/issues_with_non-posix_compatible_shells.mdwn create mode 100644 doc/bugs/issues_with_non-posix_compatible_shells/comment_1_076948499a9d581a50da52b7690e5d4e._comment create mode 100644 doc/bugs/javascript_functions_qouting_issue.mdwn create mode 100644 doc/bugs/journal_commit_error_when_using_annex.mdwn create mode 100644 doc/bugs/journal_commit_error_when_using_annex/comment_1_38f60ca3503ea1530c4bd2cde5c9182f._comment create mode 100644 doc/bugs/journal_commit_error_when_using_annex/comment_2_6de455a67f37d9ee0a307a78123781bf._comment create mode 100644 doc/bugs/json_is_broken_for_status.mdwn create mode 100644 doc/bugs/links_in_firefox_do_not_always_work.mdwn create mode 100644 doc/bugs/links_in_firefox_do_not_always_work/comment_1_5e506674f157e8ed612eca1f9adfa068._comment create mode 100644 doc/bugs/links_in_firefox_do_not_always_work/comment_2_dfde57b433301e971c2d5b9e4d3c824a._comment create mode 100644 doc/bugs/links_in_firefox_do_not_always_work/comment_3_2d090d6e67ba53ff7e5c0275274f9b3d._comment create mode 100644 doc/bugs/long_running_assistant_causes_resource_starvation_on_OSX.mdwn create mode 100644 doc/bugs/long_running_assistant_causes_resource_starvation_on_OSX/comment_1_91c911c29fd126ddc365c561591f627e._comment create mode 100644 doc/bugs/long_running_assistant_causes_resource_starvation_on_OSX/comment_2_c316aead931a6a2377a4515bbb34ac5b._comment create mode 100644 doc/bugs/lsof__47__committer_thread_loops_occassionally.mdwn create mode 100644 doc/bugs/lsof__47__committer_thread_loops_occassionally/comment_1_f8d1720aa26c719609720acf0772606e._comment create mode 100644 doc/bugs/lsof__47__committer_thread_loops_occassionally/comment_2_0527569ea2924721d19dadcf4fe0ec5a._comment create mode 100644 doc/bugs/lsof__47__committer_thread_loops_occassionally/comment_3_5b67ff08a897ea3d2266ccc910ab4278._comment create mode 100644 doc/bugs/make_SHA512E_the_default.mdwn create mode 100644 doc/bugs/make_install_can__39__t_be_used_with_sudo.mdwn create mode 100644 doc/bugs/make_install_doesn__39__t_create_git-annex-shell.mdwn create mode 100644 doc/bugs/make_install_doesn__39__t_create_git-annex-shell/comment_1_8c20edd8c6483500f807528d616c6dfd._comment create mode 100644 doc/bugs/make_install_doesn__39__t_create_git-annex-shell/comment_2_8b2cf0fe7219e0bc83fd326adbf26c8a._comment create mode 100644 doc/bugs/make_install_doesn__39__t_create_git-annex-shell/comment_3_25fe06eb127e59a4a07aeb52a5cfeabe._comment create mode 100644 doc/bugs/make_install_doesn__39__t_create_git-annex-shell/comment_4_ec78032ba62d6918baa2c0b07ead5b50._comment create mode 100644 doc/bugs/making_annex-merge_try_a_fast-forward.mdwn create mode 100644 doc/bugs/manpage_has_slight_indentation_error.mdwn create mode 100644 doc/bugs/map_error_after_forget/comment_1_81001ecda65d882ea946611d1e18d59f._comment create mode 100644 doc/bugs/map_error_after_forget/comment_2_24f3b6699f646ec0c20f3d4ca010e345._comment create mode 100644 doc/bugs/map_error_after_forget/comment_3_950e735c6d618e60cffffd1aebf06fd3._comment create mode 100644 doc/bugs/map_error_after_forget/comment_4_39327211f3fd1f9ed196a1f09cf68bdc._comment create mode 100644 doc/bugs/map_error_after_forget/comment_6_471a2f5792dfc7cde4f1eb793984abf1._comment create mode 100644 doc/bugs/map_not_respecting_annex_ssh_options__63__.mdwn create mode 100644 doc/bugs/map_not_respecting_annex_ssh_options__63__/comment_1_c63a1ed5909d53f116f06e60aba74dc6._comment create mode 100644 doc/bugs/merge_causes_out_of_memory_on_large_repos.mdwn create mode 100644 doc/bugs/merge_causes_out_of_memory_on_large_repos/comment_1_6d47485728ea65a9b555f8be7159dea5._comment create mode 100644 doc/bugs/merge_causes_out_of_memory_on_large_repos/comment_2_06723d13ecdaf87de5ff2b209e3c5198._comment create mode 100644 doc/bugs/merge_causes_out_of_memory_on_large_repos/comment_3_9f83ef190547b291a715cda55b7977d4._comment create mode 100644 doc/bugs/merge_causes_out_of_memory_on_large_repos/comment_4_0e32ae0300472c56079cfbcd78a3e386._comment create mode 100644 doc/bugs/merge_causes_out_of_memory_on_large_repos/comment_5_e8998716107e7ae8d0e8d332812517ad._comment create mode 100644 doc/bugs/microsd__47__thumbdrives_seem_to_die_when_using_the_ARM_build.mdwn create mode 100644 doc/bugs/microsd__47__thumbdrives_seem_to_die_when_using_the_ARM_build/comment_1_0527581ea60d28bb28504fa2a355ed87._comment create mode 100644 doc/bugs/microsd__47__thumbdrives_seem_to_die_when_using_the_ARM_build/comment_2_926a87b60e20d286d49639c8dad13a1a._comment create mode 100644 doc/bugs/microsd__47__thumbdrives_seem_to_die_when_using_the_ARM_build/comment_3_c509fba1a9adacfd26a2bd12b4aea988._comment create mode 100644 doc/bugs/migrated_files_not_showing_up_in_unused_list.mdwn create mode 100644 doc/bugs/migrated_files_not_showing_up_in_unused_list/comment_1_2cfbf6693b051c758fe5efa5ee885829._comment create mode 100644 doc/bugs/migrated_files_not_showing_up_in_unused_list/comment_2_acb1abeb32c3aba8ba65151afbea753c._comment create mode 100644 doc/bugs/minor_bug:_errors_are_not_verbose_enough.mdwn create mode 100644 doc/bugs/missing_dependency_in_git-annex-3.20130216.mdwn create mode 100644 doc/bugs/missing_kde__47__gnome_menu_item..mdwn create mode 100644 doc/bugs/moreinfo.mdwn create mode 100644 doc/bugs/network___62____61___2.4.0.1_is_not_in_Haskell_Platform_2012.4.0.0.mdwn create mode 100644 doc/bugs/network___62____61___2.4.0.1_is_not_in_Haskell_Platform_2012.4.0.0/comment_1_2c4b3757bb8de563edca65aeabcbbc5a._comment create mode 100644 doc/bugs/nfs_mounted_repo_results_in_errors_on_drop_move.mdwn create mode 100644 doc/bugs/non-annexed_file_changed_to_annexed_on_typechange.mdwn create mode 100644 doc/bugs/non-annexed_file_changed_to_annexed_on_typechange/comment_1_6ac691645edb483797bee05043fd83b3._comment create mode 100644 doc/bugs/non-annexed_file_changed_to_annexed_on_typechange/comment_2_5d67e3a60b7cc30c2b1857f50895d363._comment create mode 100644 doc/bugs/non-annexed_file_changed_to_annexed_on_typechange/comment_3_78f1e081b92f418c20893d86a8715501._comment create mode 100644 doc/bugs/non-annexed_file_changed_to_annexed_on_typechange/comment_4_1e2a59e0eec89ef1a57d1488ff40dcf0._comment create mode 100644 doc/bugs/non-annexed_file_changed_to_annexed_on_typechange/comment_5_5e74431048b07631e0dbeca90fdb365b._comment create mode 100644 doc/bugs/non-annexed_file_changed_to_annexed_on_typechange/comment_6_3724e1c1a5fc6d3589452478249792ec._comment create mode 100644 doc/bugs/non-annexed_file_changed_to_annexed_on_typechange/comment_7_7f841ea7bf7d44f3d810ca097ac9eb47._comment create mode 100644 doc/bugs/non-annexed_file_changed_to_annexed_on_typechange/comment_8_c53ce2274388711ffbde1595b64f932b._comment create mode 100644 doc/bugs/non-repos_in_repositories_list___40__+_other_weird_output__41___from_git_annex_status.mdwn create mode 100644 doc/bugs/non-repos_in_repositories_list___40__+_other_weird_output__41___from_git_annex_status/comment_1_fcd230cbb2ac363c469b98021042c011._comment create mode 100644 doc/bugs/non-repos_in_repositories_list___40__+_other_weird_output__41___from_git_annex_status/comment_2_23207ecabd4b41d9551d0491fa71e96b._comment create mode 100644 doc/bugs/non-repos_in_repositories_list___40__+_other_weird_output__41___from_git_annex_status/comment_3_6ea92adfe955b6a5cd2a39fea78b3bf6._comment create mode 100644 doc/bugs/non-repos_in_repositories_list___40__+_other_weird_output__41___from_git_annex_status/comment_4_d0e55585f1612148163039d157253258._comment create mode 100644 doc/bugs/non-repos_in_repositories_list___40__+_other_weird_output__41___from_git_annex_status/comment_6_5506dc1b08516677886da4aa97263864._comment create mode 100644 doc/bugs/non-repos_in_repositories_list___40__+_other_weird_output__41___from_git_annex_status/comment_7_073449cc2cb73efd2b2d3d778a5573de._comment create mode 100644 doc/bugs/non-repos_in_repositories_list___40__+_other_weird_output__41___from_git_annex_status/comment_7_3516e71ba3b07427a10cbb4965712aa6._comment create mode 100644 doc/bugs/non-repos_in_repositories_list___40__+_other_weird_output__41___from_git_annex_status/comment_8_ea2e4704adb2f304f9c11c61eb62e919._comment create mode 100644 doc/bugs/non-repos_in_repositories_list___40__+_other_weird_output__41___from_git_annex_status/comment_9_4d17fedead7977541371a3f2c192e030._comment create mode 100644 doc/bugs/not_possible_to_have_annex_on_a_separate_filesystem.mdwn create mode 100644 doc/bugs/numcopies_deprecated__44___but_still_in_walkthrough.mdwn create mode 100644 doc/bugs/old_data_isn__39__t_unused_after_migration.mdwn create mode 100644 doc/bugs/on--git-dir_and_--work-tree_options.mdwn create mode 100644 doc/bugs/on_encfs__44___.fuse__95__hiddenXXXXX_files_left_behind.mdwn create mode 100644 doc/bugs/on_encfs__44___.fuse__95__hiddenXXXXX_files_left_behind/comment_1_b96ea3ece44d42e79e4d903ca66065ee._comment create mode 100644 doc/bugs/one_test_fail_on_osx.mdwn create mode 100644 doc/bugs/optinally_transfer_file_unencryptedly/comment_1_13a7653d96ddf91f4492a9f3555a69aa._comment create mode 100644 doc/bugs/optinally_transfer_file_unencryptedly/comment_2_31f154011ec26a463de7b1e307e49cb6._comment create mode 100644 doc/bugs/optinally_transfer_file_unencryptedly/comment_3_33433bcfb1946b52f1f41b9158ab452d._comment create mode 100644 doc/bugs/ordering.mdwn create mode 100644 doc/bugs/pages_of_packfile_errors.mdwn create mode 100644 doc/bugs/pages_of_packfile_errors/comment_1_eb2989112b38bb27ce8f691dd5d318e5._comment create mode 100644 doc/bugs/pages_of_packfile_errors/comment_2_69fba53035ebea213ae1c11be5326690._comment create mode 100644 doc/bugs/pages_of_packfile_errors/comment_3_73b9f574e8ce36d5e0d0f6c6a89006b7._comment create mode 100644 doc/bugs/pasting_into_annex_on_OSX.mdwn create mode 100644 doc/bugs/pasting_into_annex_on_OSX/comment_1_4eab52bb6eda92e39bdaa8eee8f31a7f._comment create mode 100644 doc/bugs/pasting_into_annex_on_OSX/comment_2_f1b58adfec179b75c1fc2bf578a3b5c4._comment create mode 100644 doc/bugs/pasting_into_annex_on_OSX/comment_3_270aa7680c3b899a92ce6543eaba666a._comment create mode 100644 doc/bugs/pasting_into_annex_on_OSX/comment_4_ec11a80d5b0f78c7a927f8aa71a6c57a._comment create mode 100644 doc/bugs/pasting_into_annex_on_OSX/comment_5_1928bd25e5e6874a3b83c2f2adc776f5._comment create mode 100644 doc/bugs/pasting_into_annex_on_OSX/comment_6_0fe288f54b781a0c51395cb32f0e2f9d._comment create mode 100644 doc/bugs/preferred_content:_include_statement_does_not_allow_spaces_in_filenames.mdwn create mode 100644 doc/bugs/preferred_content:_include_statement_does_not_allow_spaces_in_filenames/comment_1_ca10638d4b4b178cfd0de8736542c4dc._comment create mode 100644 doc/bugs/preferred_content:_include_statement_does_not_allow_spaces_in_filenames/comment_2_986a393a512229d35e529ba242b77b1e._comment create mode 100644 doc/bugs/problem_commit_normal_links.mdwn create mode 100644 doc/bugs/problem_to_addurl_--file_with_ftp.mdwn create mode 100644 doc/bugs/problem_to_addurl_--file_with_ftp/comment_1_2bf44f1653069fb2ed0b124cf8581a48._comment create mode 100644 doc/bugs/problem_to_addurl_--file_with_ftp/comment_2_c85266a9359a9f45e632f31c016a45dc._comment create mode 100644 doc/bugs/problem_to_addurl_--file_with_ftp/comment_3_5bba62e1dd4118bcf7e1c990c7009239._comment create mode 100644 doc/bugs/problem_with_upgrade_v2_-__62___v3.mdwn create mode 100644 doc/bugs/problem_with_upgrade_v2_-__62___v3/comment_1_5f60006c9bb095167d817f234a14d20b._comment create mode 100644 doc/bugs/problem_with_upgrade_v2_-__62___v3/comment_2_cd0123392b16d89db41b45464165c247._comment create mode 100644 doc/bugs/problem_with_upgrade_v2_-__62___v3/comment_3_86d9e7244ae492bcbe62720b8c4fc4a9._comment create mode 100644 doc/bugs/problem_with_upgrade_v2_-__62___v3/comment_4_91439d4dbbf1461e281b276eb0003691._comment create mode 100644 doc/bugs/problem_with_upgrade_v2_-__62___v3/comment_5_ca33a9ca0df33f7c1b58353d7ffb943d._comment create mode 100644 doc/bugs/problem_with_upgrade_v2_-__62___v3/comment_6_f360f0006bc9115bc5a3e2eb9fe58abd._comment create mode 100644 doc/bugs/problems_with_android_and_gpg.mdwn create mode 100644 doc/bugs/problems_with_android_and_gpg/comment_1_526d8805cb1ae896e8b1920ac2aecc17._comment create mode 100644 doc/bugs/problems_with_android_and_gpg/comment_2_2e1ae66bac4f55b74074b09e22ab270d._comment create mode 100644 doc/bugs/problems_with_android_and_gpg/comment_3_47510400e8e45a71a1581aed99a157a1._comment create mode 100644 doc/bugs/problems_with_android_and_gpg/comment_4_d28d773450d09e03160548d99f12256d._comment create mode 100644 doc/bugs/problems_with_android_and_gpg/comment_5_74f1177d6dd42bab5ddfc040cbfb035e._comment create mode 100644 doc/bugs/problems_with_android_and_xmpp.mdwn create mode 100644 doc/bugs/problems_with_android_and_xmpp/comment_1_dd56eb74660a606c7db54861ec745cc6._comment create mode 100644 doc/bugs/problems_with_android_and_xmpp/comment_2_ae4554fadfc3ea1913a36aa535815cfb._comment create mode 100644 doc/bugs/problems_with_android_and_xmpp/comment_3_128702a7974bd00337c3304e49a74f0b._comment create mode 100644 doc/bugs/problems_with_glacier.mdwn create mode 100644 doc/bugs/problems_with_glacier/comment_1_8d233428a16ae4276d9c69b329e8216b._comment create mode 100644 doc/bugs/problems_with_utf8_names.mdwn create mode 100644 doc/bugs/problems_with_utf8_names/comment_10_c53c309771caa41accab5523cc6998dd._comment create mode 100644 doc/bugs/problems_with_utf8_names/comment_1_3c7e3f021c2c94277eecf9c8af6cec5f._comment create mode 100644 doc/bugs/problems_with_utf8_names/comment_2_bad4c4c5f54358d1bc0ab2adc713782a._comment create mode 100644 doc/bugs/problems_with_utf8_names/comment_3_4f936a5d3f9c7df64c8a87e62b7fbfdc._comment create mode 100644 doc/bugs/problems_with_utf8_names/comment_4_93bee35f5fa7744834994bc7a253a6f9._comment create mode 100644 doc/bugs/problems_with_utf8_names/comment_5_519cda534c7aea7f5ad5acd3f76e21fa._comment create mode 100644 doc/bugs/problems_with_utf8_names/comment_6_52e0bfff2b177b6f92e226b25d2f3ff1._comment create mode 100644 doc/bugs/problems_with_utf8_names/comment_7_0cc588f787d6eecfa19a8f6cee4b07b5._comment create mode 100644 doc/bugs/problems_with_utf8_names/comment_8_ff5c6da9eadfee20c18c86b648a62c47._comment create mode 100644 doc/bugs/problems_with_utf8_names/comment_9_f358e617799e5a4e3afc6536d419eb08._comment create mode 100644 doc/bugs/quvi_0.9.5_does_not_work_with_git-annex.mdwn create mode 100644 doc/bugs/quvi_0.9.5_does_not_work_with_git-annex/comment_1_d0d2bcd97ef5c9bce8a57c4184a176e0._comment create mode 100644 doc/bugs/quvi_0.9.5_does_not_work_with_git-annex/comment_2_ff9661198257b8c5e2e8ca3d85a7471c._comment create mode 100644 doc/bugs/ran_once_then_stopped_running_opensuse_13.1.mdwn create mode 100644 doc/bugs/ran_once_then_stopped_running_opensuse_13.1/comment_1_a9daf9e8f968b32f25e236f53ea4b845._comment create mode 100644 doc/bugs/random_files_vanishing_when_assistant_gets_restarted.mdwn create mode 100644 doc/bugs/random_files_vanishing_when_assistant_gets_restarted/comment_1_53b4f388c47c1b3f6ffa4fc2155b30fc._comment create mode 100644 doc/bugs/random_files_vanishing_when_assistant_gets_restarted/comment_2_e66532b23b089c9ea61122d6664cddb9._comment create mode 100644 doc/bugs/random_files_vanishing_when_assistant_gets_restarted/comment_3_c9d692c867acc076f64f1213ea03ca11._comment create mode 100644 doc/bugs/regression_in_direct_mode_on_windows_:_weird___96__git_annex_sync__96___behavior.mdwn create mode 100644 doc/bugs/regression_in_direct_mode_on_windows_:_weird___96__git_annex_sync__96___behavior/comment_1_1a0b964f93c753838d6ccbdc8f79b39e._comment create mode 100644 doc/bugs/regression_in_direct_mode_on_windows_:_weird___96__git_annex_sync__96___behavior/comment_2_d22dcd7f95c5dc1c381c3c746781efce._comment create mode 100644 doc/bugs/regression_in_direct_mode_on_windows_:_weird___96__git_annex_sync__96___behavior/comment_3_a25140eb90f6b24c1a3ca39c901694e2._comment create mode 100644 doc/bugs/regression_in_direct_mode_on_windows_:_weird___96__git_annex_sync__96___behavior/comment_4_825e15183008ff7d97a81cacc3f55fb4._comment create mode 100644 doc/bugs/regression_in_direct_mode_on_windows_:_weird___96__git_annex_sync__96___behavior/comment_5_e858fc7c729cd39740354fb12627d556._comment create mode 100644 doc/bugs/regression_in_direct_mode_on_windows_:_weird___96__git_annex_sync__96___behavior/comment_6_9881b0f2dfb0907a60c0da296bc3da3f._comment create mode 100644 doc/bugs/regression_in_direct_mode_on_windows_:_weird___96__git_annex_sync__96___behavior/comment_7_ca017b9d3bafea4cb31448c802f3834e._comment create mode 100644 doc/bugs/reinject_should_leave_file_in_place_on_checksum_mismatch.mdwn create mode 100644 doc/bugs/remote_files_appear_but_are_unreadable_because_their_symlink_targets_don__39__t_exist.mdwn create mode 100644 doc/bugs/remote_files_appear_but_are_unreadable_because_their_symlink_targets_don__39__t_exist/comment_10_8a1d16b2aaba224e94be3d9dcc036d91._comment create mode 100644 doc/bugs/remote_files_appear_but_are_unreadable_because_their_symlink_targets_don__39__t_exist/comment_11_434ed328a22a6657dba3b2929a56e499._comment create mode 100644 doc/bugs/remote_files_appear_but_are_unreadable_because_their_symlink_targets_don__39__t_exist/comment_12_1837b70ace42882db3ab82e001680934._comment create mode 100644 doc/bugs/remote_files_appear_but_are_unreadable_because_their_symlink_targets_don__39__t_exist/comment_13_ca9c87a10f29e41572540edeb99652f2._comment create mode 100644 doc/bugs/remote_files_appear_but_are_unreadable_because_their_symlink_targets_don__39__t_exist/comment_1_69eafc4201e3014ef1b5d74fe319e462._comment create mode 100644 doc/bugs/remote_files_appear_but_are_unreadable_because_their_symlink_targets_don__39__t_exist/comment_2_b7a64db9abe006af8c30169ad849efe9._comment create mode 100644 doc/bugs/remote_files_appear_but_are_unreadable_because_their_symlink_targets_don__39__t_exist/comment_3_197ac6070f256131c6e18a07aa3834fa._comment create mode 100644 doc/bugs/remote_files_appear_but_are_unreadable_because_their_symlink_targets_don__39__t_exist/comment_4_fe07832333b536c71b7dcb46a4a44bd0._comment create mode 100644 doc/bugs/remote_files_appear_but_are_unreadable_because_their_symlink_targets_don__39__t_exist/comment_5_540bca4e6fdfc10eeab875ecc0f2b3f3._comment create mode 100644 doc/bugs/remote_files_appear_but_are_unreadable_because_their_symlink_targets_don__39__t_exist/comment_6_3f236b35e9820cd88bb77fcd57d6975e._comment create mode 100644 doc/bugs/remote_files_appear_but_are_unreadable_because_their_symlink_targets_don__39__t_exist/comment_7_3cc5dae0351201522711a7caeecd60d5._comment create mode 100644 doc/bugs/remote_files_appear_but_are_unreadable_because_their_symlink_targets_don__39__t_exist/comment_8_3c3883cb66d02a15d5de84d22aa113da._comment create mode 100644 doc/bugs/remote_files_appear_but_are_unreadable_because_their_symlink_targets_don__39__t_exist/comment_9_c8cece9559bd2dc6154cd28772369e48._comment create mode 100644 doc/bugs/remote_not_showing_up_in_webapp.mdwn create mode 100644 doc/bugs/remote_not_showing_up_in_webapp/comment_1_2a269732fd528f505777542d3556437a._comment create mode 100644 doc/bugs/removable_device_configurator_chokes_on_spaces.mdwn create mode 100644 doc/bugs/rename:_permission_denied__44___after_direct_mode_switch.mdwn create mode 100644 doc/bugs/rename:_permission_denied__44___after_direct_mode_switch/comment_1_14cec6448831c67794b62926a03b2fc5._comment create mode 100644 doc/bugs/rename:_permission_denied__44___after_direct_mode_switch/comment_2_93af8f48a01b6e2d011bd6f60499ccd2._comment create mode 100644 doc/bugs/rename:_permission_denied__44___after_direct_mode_switch/comment_3_f8fba1955e62360061613e5898b3d74e._comment create mode 100644 doc/bugs/rename:_permission_denied__44___after_direct_mode_switch/comment_4_abffe1fb3b3e684b126e4768089dc5f4._comment create mode 100644 doc/bugs/rename:_permission_denied__44___after_direct_mode_switch/comment_5_bccc53d2d6f659f21965042a057358f5._comment create mode 100644 doc/bugs/rename:_permission_denied__44___after_direct_mode_switch/comment_6_ac8b3b042b882680f0eb0d53ade1ce15._comment create mode 100644 doc/bugs/renaming_a_file_makes_annex_get_the_file__39__s_content_from_remote.mdwn create mode 100644 doc/bugs/renaming_a_file_makes_annex_get_the_file__39__s_content_from_remote/comment_1_d6aad1831674586fe4cdf61dd2a4bbb9._comment create mode 100644 doc/bugs/renaming_a_file_makes_annex_get_the_file__39__s_content_from_remote/comment_2_8591e174c1a8cddfae9371407a58ff1c._comment create mode 100644 doc/bugs/repair_fails_when_home_on_seperate_partition.mdwn create mode 100644 doc/bugs/restart_daemon_required.mdwn create mode 100644 doc/bugs/restart_daemon_required/comment_1_f79ac16cc9f1e3b08cd121bf5efb29c3._comment create mode 100644 doc/bugs/restart_daemon_required/comment_2_50c1b268a3cc4514681059eabca674e3._comment create mode 100644 doc/bugs/restart_daemon_required/comment_3_1716e0f3c7c44dc77ebf7f00fdd8f9e3._comment create mode 100644 doc/bugs/restart_daemon_required/comment_4_3ce776786eca83fcb8ff94c8f6ff3eb9._comment create mode 100644 doc/bugs/rsync_remote_shows_no_progress.mdwn create mode 100644 doc/bugs/rsync_remote_shows_no_progress/comment_1_a7f5d646a924c462b987561cf6fc4318._comment create mode 100644 doc/bugs/rsync_special_remote_fails_to___96__get__96___files_which_have_names_containing_spaces.mdwn create mode 100644 doc/bugs/rsync_transport:_username_not_respected.mdwn create mode 100644 doc/bugs/scp_interrupt_to_background.mdwn create mode 100644 doc/bugs/set_metadata_on_wrong_files.mdwn create mode 100644 doc/bugs/set_metadata_on_wrong_files/comment_1_074f124e5d313e90b3e9217325799587._comment create mode 100644 doc/bugs/show_version_without_having_to_be_in_a_git_repo.mdwn create mode 100644 doc/bugs/signal_weirdness.mdwn create mode 100644 doc/bugs/size_of_the_Android_installation_is_HUGE_--_please_seek_possibility_to_shrink.mdwn create mode 100644 doc/bugs/size_of_the_Android_installation_is_HUGE_--_please_seek_possibility_to_shrink/comment_1_d2faaff98386433110dcf7aae87916b7._comment create mode 100644 doc/bugs/size_of_the_Android_installation_is_HUGE_--_please_seek_possibility_to_shrink/comment_2_1359ddf1b5db4303f8bd219d3f07df3a._comment create mode 100644 doc/bugs/smarter_flood_filling.mdwn create mode 100644 doc/bugs/softlink_mtime.mdwn create mode 100644 doc/bugs/ssh-keygen_failed_when_adding_remote_server_repo.mdwn create mode 100644 doc/bugs/ssh-keygen_failed_when_adding_remote_server_repo/comment_1_52180983b59c247389a55a9523ec435b._comment create mode 100644 doc/bugs/ssh:_unprotected_private_key_file.mdwn create mode 100644 doc/bugs/ssh_connection_caching_broken_on_NTFS.mdwn create mode 100644 doc/bugs/ssh_connection_caching_broken_on_NTFS/comment_1_54e7e12514f4c109fd57a4eb744b731a._comment create mode 100644 doc/bugs/ssh_keys_have_wrong_permissions___40__Ubuntu_12.04_LTS__44___current_linux_build_as_of_Mar_6th___39__14__41__.mdwn create mode 100644 doc/bugs/ssh_keys_have_wrong_permissions___40__Ubuntu_12.04_LTS__44___current_linux_build_as_of_Mar_6th___39__14__41__/comment_1_462c377dca2484e5598a0b71d91ab64a._comment create mode 100644 doc/bugs/submodule_path_problem.mdwn create mode 100644 doc/bugs/submodule_path_problem/comment_1_69aec9207d2e9da4bc042d3f4963d80e._comment create mode 100644 doc/bugs/submodule_path_problem/comment_2_53d9eb28cb70b51637470175a80ddf35._comment create mode 100644 doc/bugs/submodule_path_problem/comment_3_aa5e0f99000a5b4988bccbb2ca28353b._comment create mode 100644 doc/bugs/submodule_path_problem/comment_4_ab1508a5a04e2106aad5e7985775a6fa._comment create mode 100644 doc/bugs/submodule_path_problem/comment_5_8c7539d1c11b81f5d46aa8e1c61745ae._comment create mode 100644 doc/bugs/submodule_path_problem/comment_6_cacc91afcb1739dfca3a60590bb70356._comment create mode 100644 doc/bugs/subtle_build_issue_on_OSX_10.7_and_Haskell_Platform___40__if_you_have_the_32bit_version_installed__41__.mdwn create mode 100644 doc/bugs/subtle_build_issue_on_OSX_10.7_and_Haskell_Platform___40__if_you_have_the_32bit_version_installed__41__/comment_1_6208e70a21a048d5423926d16e32d421._comment create mode 100644 doc/bugs/subtle_build_issue_on_OSX_10.7_and_Haskell_Platform___40__if_you_have_the_32bit_version_installed__41__/comment_2_8765b6190e79251637bb59ba28f245c1._comment create mode 100644 doc/bugs/support_bare_git_repo__44___with_the_annex_directory_exposed_to_http.mdwn create mode 100644 doc/bugs/sync_--content_tries_to_copy_content_to_metadata_only_repos.mdwn create mode 100644 doc/bugs/sync_command_tries_to_connect_new_remote_despite_not_being_asked_to.mdwn create mode 100644 doc/bugs/sync_command_tries_to_connect_new_remote_despite_not_being_asked_to/comment_1_dcd52b57192e83fe365f21dc12461008._comment create mode 100644 doc/bugs/test_failures_on_window_for_5.20131118.mdwn create mode 100644 doc/bugs/test_failures_on_window_for_5.20131118/comment_1_5a7a284625c12d54390fe4a4ec1d4211._comment create mode 100644 doc/bugs/test_suite_failure_on_samba_mount.mdwn create mode 100644 doc/bugs/test_suite_failure_on_samba_mount/comment_1_e074b20801b921ee2661025a050a8af2._comment create mode 100644 doc/bugs/test_suite_shouldn__39__t_fail_silently.mdwn create mode 100644 doc/bugs/tests_fail_when_there_is_no_global_.gitconfig_for_the_user.mdwn create mode 100644 doc/bugs/tests_failed_to_build_-_after_an_update_of_haskell_platform.mdwn create mode 100644 doc/bugs/tests_failed_to_build_-_after_an_update_of_haskell_platform/comment_1_20a6fe046111e9ae56fd4d9c9f41f536._comment create mode 100644 doc/bugs/tests_failed_to_build_-_after_an_update_of_haskell_platform/comment_2_6fdc5f8b07908c6eda8a97690408f44e._comment create mode 100644 doc/bugs/tests_failed_to_build_-_after_an_update_of_haskell_platform/comment_3_014474a133c7ff0131029d8721afc710._comment create mode 100644 doc/bugs/tests_failed_to_build_-_after_an_update_of_haskell_platform/comment_4_9c537e251dc99667fe87870804d802c2._comment create mode 100644 doc/bugs/the_tip_at_commit_6cecc26206c4a539999b04664136c6f785211a41_disables_the_watch_command_on_OSX.mdwn create mode 100644 doc/bugs/three_character_directories_created.mdwn create mode 100644 doc/bugs/three_character_directories_created/comment_1_dd91de24dab4f2eaded1f7d659869d4d._comment create mode 100644 doc/bugs/three_character_directories_created/comment_2_f6375964a6c8bb1e6c5b7238effca66d._comment create mode 100644 doc/bugs/three_character_directories_created/comment_3_776e0a9b938d8b260a5111594b442536._comment create mode 100644 doc/bugs/three_character_directories_created/comment_4_e288bacdb336c4886adb6eeb4dca1e92._comment create mode 100644 doc/bugs/three_character_directories_created/comment_5_359b80948ac92a0f1eb695599456486c._comment create mode 100644 doc/bugs/three_way_sync_via_S3_and_Jabber.mdwn create mode 100644 doc/bugs/three_way_sync_via_S3_and_Jabber/comment_10_fc5ec5505f141bb9135e772d1094bc4d._comment create mode 100644 doc/bugs/three_way_sync_via_S3_and_Jabber/comment_11_0df2210c30dec6d88d7858d93eec19a3._comment create mode 100644 doc/bugs/three_way_sync_via_S3_and_Jabber/comment_1_41682b2e72e657e0f23af244f8345e85._comment create mode 100644 doc/bugs/three_way_sync_via_S3_and_Jabber/comment_2_c7b4ea9aea6839763eb8b89e8d6a5ad5._comment create mode 100644 doc/bugs/three_way_sync_via_S3_and_Jabber/comment_3_063f5e5e554ad6710f16394906d87616._comment create mode 100644 doc/bugs/three_way_sync_via_S3_and_Jabber/comment_4_197ad39b4a46936afeeb04eb26cf1ef3._comment create mode 100644 doc/bugs/three_way_sync_via_S3_and_Jabber/comment_5_0b0d829ccd255be0177ae9d8f6b10e63._comment create mode 100644 doc/bugs/three_way_sync_via_S3_and_Jabber/comment_6_37a8e19440c764317589bc4248cbccdf._comment create mode 100644 doc/bugs/three_way_sync_via_S3_and_Jabber/comment_7_12eb333327d31ca2bfee3f3c5e26d641._comment create mode 100644 doc/bugs/three_way_sync_via_S3_and_Jabber/comment_8_e6b1084b2f18d8e536c8692e165754a3._comment create mode 100644 doc/bugs/three_way_sync_via_S3_and_Jabber/comment_9_2120a1c3e5f490a55f68bb1bef5efd0d._comment create mode 100644 doc/bugs/tmp_file_handling.mdwn create mode 100644 doc/bugs/tmp_file_handling/comment_1_0300c11ee3f94a9e7c832671e16f5511._comment create mode 100644 doc/bugs/tmp_file_handling/comment_2_cc14c7a79a544e47654e4cd8abc85edd._comment create mode 100644 doc/bugs/touch.hsc_has_problems_on_non-linux_based_systems.mdwn create mode 100644 doc/bugs/touch.hsc_has_problems_on_non-linux_based_systems/comment_1_1d38283c9ea87174f3bbef9a58f5cb88._comment create mode 100644 doc/bugs/touch.hsc_has_problems_on_non-linux_based_systems/comment_2_bf112edd075fbebe4fc959a387946eb9._comment create mode 100644 doc/bugs/touch.hsc_has_problems_on_non-linux_based_systems/comment_3_a46080fbe82adf0986c5dc045e382501._comment create mode 100644 doc/bugs/touch.hsc_has_problems_on_non-linux_based_systems/comment_4_760437bf3ba972a775bb190fb4b38202._comment create mode 100644 doc/bugs/touch.hsc_has_problems_on_non-linux_based_systems/comment_5_060ba5ea88dcab2f4a0c199f13ef4f67._comment create mode 100644 doc/bugs/touch.hsc_has_problems_on_non-linux_based_systems/comment_6_548303d6ffb21a9370b6904f41ff49c1._comment create mode 100644 doc/bugs/touch.hsc_has_problems_on_non-linux_based_systems/comment_7_7ca00527ab5db058aadec4fe813e51fd._comment create mode 100644 doc/bugs/touch.hsc_has_problems_on_non-linux_based_systems/comment_8_881aecb9ae671689453f6d5d780d844b._comment create mode 100644 doc/bugs/transferkey_fails_due_to_gpg.mdwn create mode 100644 doc/bugs/transferkey_fails_due_to_gpg/comment_1_f6434400d528a0fa59c056995ff2e6f3._comment create mode 100644 doc/bugs/transferkey_fails_due_to_gpg/comment_2_c540b05b62a3186a87efcb180ea2a52d._comment create mode 100644 doc/bugs/transferkey_fails_due_to_gpg/comment_3_9ad2ef73169dbd2866da2f4259ab0f00._comment create mode 100644 doc/bugs/transferkey_fails_due_to_gpg/comment_4_7631b8842efba6a4aad87386ce9443a7._comment create mode 100644 doc/bugs/trust_command_and_gitconfig_contradiction_causing_confusion.mdwn create mode 100644 doc/bugs/tweaks_to_directory_special_remote_doco.mdwn create mode 100644 doc/bugs/typo_in___34__ready_to_add_remote_server__34___message.mdwn create mode 100644 doc/bugs/typo_on_the_Mac_OS_10.7.5_Lion_build.mdwn create mode 100644 doc/bugs/typo_on_the_Mac_OS_10.7.5_Lion_build/comment_1_e8df4b36a89b37edd94f3a318ae93a32._comment create mode 100644 doc/bugs/typo_on_the_Mac_OS_10.7.5_Lion_build/comment_2_3b2c3c84bd1910280c549a2ee1c622b9._comment create mode 100644 doc/bugs/unable_to_change_repository_group_of___34__here__34__.mdwn create mode 100644 doc/bugs/unable_to_sync_complains_of_missing_git-upload_and_receive_pack.mdwn create mode 100644 doc/bugs/unable_to_sync_complains_of_missing_git-upload_and_receive_pack/comment_1_8b0302bba2b99df0842dfead649080e7._comment create mode 100644 doc/bugs/unannex_and_uninit_do_not_work_when_git_index_is_broken.mdwn create mode 100644 doc/bugs/unannex_and_uninit_do_not_work_when_git_index_is_broken/comment_1_1931e733f0698af5603a8b92267203d4._comment create mode 100644 doc/bugs/unannex_and_uninit_do_not_work_when_git_index_is_broken/comment_2_40920b88537b7715395808d8aa94bf03._comment create mode 100644 doc/bugs/unannex_command_doesn__39__t_all_files.mdwn create mode 100644 doc/bugs/unannex_removes_object_even_if_referred_to_by_others.mdwn create mode 100644 doc/bugs/unannex_removes_object_even_if_referred_to_by_others/comment_1_0ce72d0f67082f202cfa58b7c00f2fd3._comment create mode 100644 doc/bugs/unannex_removes_object_even_if_referred_to_by_others/comment_2_647f49ffcaa348660659f9954a59b3ae._comment create mode 100644 doc/bugs/unannex_removes_object_even_if_referred_to_by_others/comment_3_3f7f4b55b7ec2641a70109788e0b5672._comment create mode 100644 doc/bugs/unannex_removes_object_even_if_referred_to_by_others/comment_4_313d393c416495aa0f8573113e41c2f7._comment create mode 100644 doc/bugs/unannex_removes_object_even_if_referred_to_by_others/comment_5_c0e7742672db2629bd906cebefe74f72._comment create mode 100644 doc/bugs/unannex_removes_object_even_if_referred_to_by_others/comment_6_c56171665db3ed14109a09097d49ac5d._comment create mode 100644 doc/bugs/unannex_vs_unlock_hook_confusion.mdwn create mode 100644 doc/bugs/undefined.mdwn create mode 100644 doc/bugs/unfinished_repos_in_webapp.mdwn create mode 100644 doc/bugs/unfinished_repos_in_webapp/comment_1_9628b100e39489be9f28ef75276a7341._comment create mode 100644 doc/bugs/unfinished_repos_in_webapp/comment_2_ba0fbff536b1d067c4098db401dc49f2._comment create mode 100644 doc/bugs/unfinished_repos_in_webapp/comment_3_fd554aa7d93117177784a29270ccf790._comment create mode 100644 doc/bugs/unfinished_repository_when_using_annex-ignore_true_.mdwn create mode 100644 doc/bugs/unhappy_without_UTF8_locale.mdwn create mode 100644 doc/bugs/uninit_and_indirect_don__39__t_work_on_android.mdwn create mode 100644 doc/bugs/uninit_and_indirect_don__39__t_work_on_android/comment_1_fec69c4c41987b9469eaa8f745c0a124._comment create mode 100644 doc/bugs/uninit_and_indirect_don__39__t_work_on_android/comment_2_54c3fa77a069b36d03c41aad08fee9af._comment create mode 100644 doc/bugs/uninit_does_not_abort_when_hard_link_creation_fails.mdwn create mode 100644 doc/bugs/uninit_does_not_work_in_old_repos.mdwn create mode 100644 doc/bugs/uninit_does_not_work_in_old_repos/comment_1_bc0619c6e17139df74639448aa6a0f72._comment create mode 100644 doc/bugs/uninit_loses_data_if_git-annex_add_didn__39__t_complete.mdwn create mode 100644 doc/bugs/uninit_should_not_run_when_branch_git-annex_is_checked_out.mdwn create mode 100644 doc/bugs/unlock_fails_silently_with_directory_symlinks.mdwn create mode 100644 doc/bugs/unlock_not_working_on_os_x_10.6_-_cp:_illegal_option_--_-_.mdwn create mode 100644 doc/bugs/unlock_not_working_on_os_x_10.6_-_cp:_illegal_option_--_-_/comment_1_a634a9f1c023bf836183de64abab1224._comment create mode 100644 doc/bugs/unlock_not_working_on_os_x_10.6_-_cp:_illegal_option_--_-_/comment_2_d9ae61a7c3f1eb243ca650945b40f21d._comment create mode 100644 doc/bugs/unlock_not_working_on_os_x_10.6_-_cp:_illegal_option_--_-_/comment_3_fe229c03c14e8eb2b57389e0e193ed99._comment create mode 100644 doc/bugs/unlock_not_working_on_os_x_10.6_-_cp:_illegal_option_--_-_/comment_4_fa12afe295de63c4aa7eb043b715325a._comment create mode 100644 doc/bugs/unlock_then_lock_of_uncommitted_file_loses_it.mdwn create mode 100644 doc/bugs/unused_fails_due_to_commitBuffer_containing_an_invalid_argument.mdwn create mode 100644 doc/bugs/unused_fails_due_to_commitBuffer_containing_an_invalid_argument/comment_1_004cb3015895ad67386276f3e1f0de0d._comment create mode 100644 doc/bugs/unused_fails_due_to_commitBuffer_containing_an_invalid_argument/comment_2_3fe298ebb3ff04d12f2528aa982d7084._comment create mode 100644 doc/bugs/unused_fails_due_to_commitBuffer_containing_an_invalid_argument/comment_3_9302536d1577c12337d714fa3a9ea7a1._comment create mode 100644 doc/bugs/unused_fails_due_to_commitBuffer_containing_an_invalid_argument/comment_4_c1c8de66192957b7026d99b9ff90589c._comment create mode 100644 doc/bugs/unused_fails_due_to_commitBuffer_containing_an_invalid_argument/comment_5_8c2dad766e4115073d49b698919b5ed5._comment create mode 100644 doc/bugs/unused_fails_due_to_commitBuffer_containing_an_invalid_argument/comment_6_8da2a73381309ecef4b2796d8f2bb0bb._comment create mode 100644 doc/bugs/upgrade_left_untracked_.git-annex__47____42___directories.mdwn create mode 100644 doc/bugs/upgrade_left_untracked_.git-annex__47____42___directories/comment_1_9ca2da52f3c8add0276b72d6099516a6._comment create mode 100644 doc/bugs/upgrade_left_untracked_.git-annex__47____42___directories/comment_2_e14e84b770305893f2fc6e4938359f47._comment create mode 100644 doc/bugs/upgrade_left_untracked_.git-annex__47____42___directories/comment_3_ec04e306c96fd20ab912aea54a8340aa._comment create mode 100644 doc/bugs/upgraded_annex__44___suddenly_trying_to_grab_archive_content_onto_client_again.mdwn create mode 100644 doc/bugs/upgraded_annex__44___suddenly_trying_to_grab_archive_content_onto_client_again/comment_10_51097a6b84edcc607abc0e6e21ca21f2._comment create mode 100644 doc/bugs/upgraded_annex__44___suddenly_trying_to_grab_archive_content_onto_client_again/comment_1_c34a4009213c410bba3c147ae0552029._comment create mode 100644 doc/bugs/upgraded_annex__44___suddenly_trying_to_grab_archive_content_onto_client_again/comment_2_634542867fd28962c47b7bc3ea022175._comment create mode 100644 doc/bugs/upgraded_annex__44___suddenly_trying_to_grab_archive_content_onto_client_again/comment_3_301f3ff2d203ac4c58a037e553b2c14d._comment create mode 100644 doc/bugs/upgraded_annex__44___suddenly_trying_to_grab_archive_content_onto_client_again/comment_4_82ecdc88ccc1f87386b128adc4ff9af4._comment create mode 100644 doc/bugs/upgraded_annex__44___suddenly_trying_to_grab_archive_content_onto_client_again/comment_6_158b2ba3da815910505899606177d415._comment create mode 100644 doc/bugs/upgraded_annex__44___suddenly_trying_to_grab_archive_content_onto_client_again/comment_6_b068924802f3917e3e005350cb0cc2a2._comment create mode 100644 doc/bugs/upgraded_annex__44___suddenly_trying_to_grab_archive_content_onto_client_again/comment_7_f4772858c927d4a62edc3caf59b5da10._comment create mode 100644 doc/bugs/upgraded_annex__44___suddenly_trying_to_grab_archive_content_onto_client_again/comment_8_d0923d2950357f4444c5ef94ff196ba3._comment create mode 100644 doc/bugs/upgraded_annex__44___suddenly_trying_to_grab_archive_content_onto_client_again/comment_9_7fb30cb80aecc60e48c64846aa185206._comment create mode 100644 doc/bugs/uploads_queued_to_annex-ignore_remotes.mdwn create mode 100644 doc/bugs/uploads_queued_to_annex-ignore_remotes/comment_1_fa1c98f38253db8c2be3604c72eb3726._comment create mode 100644 doc/bugs/using_old_remote_format_generates_irritating_output.mdwn create mode 100644 doc/bugs/using_old_remote_format_generates_irritating_output/comment_1_fceba878f1097e27f056580e8d6d5b31._comment create mode 100644 doc/bugs/using_old_remote_format_generates_irritating_output/comment_2_416992874813f120721a56d88b2bef65._comment create mode 100644 doc/bugs/using_old_remote_format_generates_irritating_output/comment_3_a20f470c5226ac5693eb15146a02b3f5._comment create mode 100644 doc/bugs/using_old_remote_format_generates_irritating_output/comment_4_a81f06191bc03a7aad5929af99f0634e._comment create mode 100644 doc/bugs/using_old_remote_format_generates_irritating_output/comment_5_7438caecf78b4fb5d21f9f31dff95cf2._comment create mode 100644 doc/bugs/utf8.mdwn create mode 100644 doc/bugs/utf8/comment_10_f298b8b480d3ab2dd9c279589afcd0ea._comment create mode 100644 doc/bugs/utf8/comment_11_a8864a46f8154680beeea27449ac6f09._comment create mode 100644 doc/bugs/utf8/comment_12_2202c3479d19d306f31aac5a47b55e7d._comment create mode 100644 doc/bugs/utf8/comment_13_7044d2c5bb1c91ee37eb9868963a1ff2._comment create mode 100644 doc/bugs/utf8/comment_14_656b3caa16ae93b092fb5804fa575a3b._comment create mode 100644 doc/bugs/utf8/comment_15_25b3d4c47c45b72129b17b171a45c5f9._comment create mode 100644 doc/bugs/utf8/comment_16_2aaab9253bbc75012292c7b5a7d55696._comment create mode 100644 doc/bugs/utf8/comment_1_416ad6fb5f7379732129dc5283a7e550._comment create mode 100644 doc/bugs/utf8/comment_2_cd55f6bbeb145fd554f331dcff64f5e1._comment create mode 100644 doc/bugs/utf8/comment_3_bb583a419d6fa4e33e5364c4468b35c6._comment create mode 100644 doc/bugs/utf8/comment_4_cd8a22cfb70d9d21f0a5339ccc52ee93._comment create mode 100644 doc/bugs/utf8/comment_5_14eefd4bee283802e9c462fa20b7835c._comment create mode 100644 doc/bugs/utf8/comment_6_58d8b5bdb9f11e8c344e86a675a075dd._comment create mode 100644 doc/bugs/utf8/comment_7_00fa9672ce55b6bfa885b8a13287ac25._comment create mode 100644 doc/bugs/utf8/comment_8_a01e26fa0fafbc291020f53dbfdf6443._comment create mode 100644 doc/bugs/utf8/comment_9_b7c084be01ce985be51e48503fcba468._comment create mode 100644 doc/bugs/uuid.log_trust.log_and_remote.log_merge_wackiness.mdwn create mode 100644 doc/bugs/variant-_files_are_created_even_though_the_content_has_the_same_hash.mdwn create mode 100644 doc/bugs/variant-_files_are_created_even_though_the_content_has_the_same_hash/comment_1_ffc5f79368b8927817e0e35a7a8f057b._comment create mode 100644 doc/bugs/variant-_files_are_created_even_though_the_content_has_the_same_hash/comment_2_1382b486d198d707db760ae119f33ad1._comment create mode 100644 doc/bugs/variant-_files_are_created_even_though_the_content_has_the_same_hash/comment_3_3c4074a1d4d7f63f6c07a05ca9717ce8._comment create mode 100644 doc/bugs/variant-_files_are_created_even_though_the_content_has_the_same_hash/comment_4_deb848e50f6767d8a5f4348137744ec2._comment create mode 100644 doc/bugs/variant-_files_are_created_even_though_the_content_has_the_same_hash/comment_5_b426c4569b7a788fbf963f787590e051._comment create mode 100644 doc/bugs/version_doesn__39__t_show___34__Feeds__34___but_podcasting_feature_working.mdwn create mode 100644 doc/bugs/version_doesn__39__t_show___34__Feeds__34___but_podcasting_feature_working/comment_1_ce06ba4f65f322362b23797f6190c7c3._comment create mode 100644 doc/bugs/view_logs_fails:_Internal_Server_Error__internal_liftAnnex.mdwn create mode 100644 doc/bugs/view_logs_fails:_Internal_Server_Error__internal_liftAnnex/comment_1_57547f9a480df2c3f7b3997b0fb7039a._comment create mode 100644 doc/bugs/view_logs_fails:_Internal_Server_Error__internal_liftAnnex/comment_2_99f12da3ef01141dc7a9105fcf966793._comment create mode 100644 doc/bugs/warning_-_WebApp_crashed:___60__file_descriptor_15__62__:_hPutStr:_illegal_operation___40__handle_is_closed__41___on_Android.mdwn create mode 100644 doc/bugs/warning_-_WebApp_crashed:___60__file_descriptor_15__62__:_hPutStr:_illegal_operation___40__handle_is_closed__41___on_Android/comment_1_e8866dc15f8fc049229e7451addad1d5._comment create mode 100644 doc/bugs/warning_-_WebApp_crashed:___60__file_descriptor_15__62__:_hPutStr:_illegal_operation___40__handle_is_closed__41___on_Android/comment_2_ee616b0251ffaace9844cfd7af896c35._comment create mode 100644 doc/bugs/warning_-_WebApp_crashed:___60__file_descriptor_15__62__:_hPutStr:_illegal_operation___40__handle_is_closed__41___on_Android/comment_3_6b8bd314b647ea3a485f5faf4856f9a9._comment create mode 100644 doc/bugs/warning_-_WebApp_crashed:___60__file_descriptor_15__62__:_hPutStr:_illegal_operation___40__handle_is_closed__41___on_Android/comment_4_7009b6727ba40bc9bd1b1f939e75d093._comment create mode 100644 doc/bugs/warning_-_WebApp_crashed:___60__file_descriptor_15__62__:_hPutStr:_illegal_operation___40__handle_is_closed__41___on_Android/comment_5_00ddf7ade6cca758afa838be0b9588cb._comment create mode 100644 doc/bugs/warning_-_WebApp_crashed:___60__file_descriptor_15__62__:_hPutStr:_illegal_operation___40__handle_is_closed__41___on_Android/comment_6_6137ef0ad01d5600dab6fccbeed9a88b._comment create mode 100644 doc/bugs/warning_-_WebApp_crashed:___60__file_descriptor_15__62__:_hPutStr:_illegal_operation___40__handle_is_closed__41___on_Android/comment_7_4b79d7ea338d9f70eb80b8cc2c5a21e4._comment create mode 100644 doc/bugs/watch_command_on_OSX_--_hangs_with_a_small_repo.mdwn create mode 100644 doc/bugs/watch_command_on_OSX_--_hangs_with_a_small_repo/comment_1_63f04694610839db0c2381005b15da35._comment create mode 100644 doc/bugs/watch_command_on_OSX_--_hangs_with_a_small_repo/comment_2_8afe4720e301cf7ccf11ff0a23261936._comment create mode 100644 doc/bugs/watch_command_on_OSX_10.7.mdwn create mode 100644 doc/bugs/watcher_commits_unlocked_files.mdwn create mode 100644 doc/bugs/watcher_commits_unlocked_files/comment_1_f70e1912fde0eee59e208307df06b503._comment create mode 100644 doc/bugs/web_app_loops_over_a_non-addable_file.mdwn create mode 100644 doc/bugs/webapp:_difficult_to_abort_adding_a_repository.mdwn create mode 100644 doc/bugs/webapp_hang.mdwn create mode 100644 doc/bugs/webapp_hang/comment_1_08aa908a64d0fe2d50438d01545c3f01._comment create mode 100644 doc/bugs/webapp_hang/comment_2_2a21ac5657128a454f9deb77c4d18057._comment create mode 100644 doc/bugs/webapp_raise_an_internal_server_error_upon_creating_the_initial_repo.mdwn create mode 100644 doc/bugs/webapp_raise_an_internal_server_error_upon_creating_the_initial_repo/comment_1_1bcf0f565eacac851bd21cd428c8e0a5._comment create mode 100644 doc/bugs/webapp_raise_an_internal_server_error_upon_creating_the_initial_repo/comment_2_7dd2483b5b07df8f3b37a34651c05962._comment create mode 100644 doc/bugs/webapp_requires_reload_for_notification_bubbles.mdwn create mode 100644 doc/bugs/webapp_requires_reload_for_notification_bubbles/comment_1_b15480e5dec1ffbebb8cde1ca8d7c9d5._comment create mode 100644 doc/bugs/webapp_requires_reload_for_notification_bubbles/comment_2_8dad57a852e1db804aa38f90f3bb398b._comment create mode 100644 doc/bugs/webapp_shows___34__Added_x_files__34___a_bit_ugly.mdwn create mode 100644 doc/bugs/webapp_takes_100__37___of_the_cpu.mdwn create mode 100644 doc/bugs/webapp_takes_100__37___of_the_cpu/comment_1_6312860de9f30cbb05762cd67edc705a._comment create mode 100644 doc/bugs/webapp_usability:_fails_mysteriously_on_newer_repo_layouts.mdwn create mode 100644 doc/bugs/webapp_usability:_put_the_notices_on_the_right.mdwn create mode 100644 doc/bugs/webapp_usability:_put_the_notices_on_the_right/comment_1_ec7a444e09a028b5225bd41fb83442e8._comment create mode 100644 doc/bugs/webdav_special_remote_fails_on_android___40__box.com__41__.mdwn create mode 100644 doc/bugs/webdav_special_remote_fails_on_android___40__box.com__41__/comment_1_f57757b4bcc4ace73bf660419d944c33._comment create mode 100644 doc/bugs/weird_local_clone_confuses.mdwn create mode 100644 doc/bugs/wget_and_android_4.4.mdwn create mode 100644 doc/bugs/when_syncing_a_direct_repository__44___git_annex_delete_non_annexed_new_git_files.mdwn create mode 100644 doc/bugs/when_syncing_a_direct_repository__44___git_annex_delete_non_annexed_new_git_files/comment_1_6c9f5fe14e46ac96254426e1e9cff23f._comment create mode 100644 doc/bugs/when_syncing_a_direct_repository__44___git_annex_delete_non_annexed_new_git_files/comment_2_04dfbf4b1f6b545075d50f43b1d73ef6._comment create mode 100644 doc/bugs/when_syncing_a_direct_repository__44___git_annex_delete_non_annexed_new_git_files/comment_3_f449f259f076ea1b11bd289bdbcc9339._comment create mode 100644 doc/bugs/when_syncing_a_direct_repository__44___git_annex_delete_non_annexed_new_git_files/comment_4_78ccd70a17d776f14ea9193ab55c6732._comment create mode 100644 doc/bugs/when_syncing_a_direct_repository__44___git_annex_delete_non_annexed_new_git_files/comment_5_95fcc19327b57222844302bb81236ee9._comment create mode 100644 doc/bugs/whereis_claims_file_is_not_here__44___but_it_is_available_both_here_and_in_another_remote.mdwn create mode 100644 doc/bugs/whereis_claims_file_is_not_here__44___but_it_is_available_both_here_and_in_another_remote/comment_1_d823b7ee32183fbadd4a49f65e1a3a8b._comment create mode 100644 doc/bugs/whereis_claims_file_is_not_here__44___but_it_is_available_both_here_and_in_another_remote/comment_2_f430538101f0ef6114b5e953248fa599._comment create mode 100644 doc/bugs/whereis_outputs_no_informaiton_for_unlocked_files.mdwn create mode 100644 doc/bugs/whereis_outputs_no_informaiton_for_unlocked_files/comment_1_47bd0fc8d1c65f8a868d9722e66c71db._comment create mode 100644 doc/bugs/windows_fails_test___34__recoverEncode__34__.mdwn create mode 100644 doc/bugs/windows_fails_test___34__recoverEncode__34__/comment_1_424b3536e21e02f192f7f2b8e833ed18._comment create mode 100644 doc/bugs/windows_fails_test___34__recoverEncode__34__/comment_2_78db183aa401e2023d7faec5f7a4a573._comment create mode 100644 doc/bugs/windows_fails_test___34__recoverEncode__34__/comment_3_ed2da19eaf0bd0864f6b28816a79bc23._comment create mode 100644 doc/bugs/windows_install_failure.mdwn create mode 100644 doc/bugs/windows_install_failure/comment_1_f339574c7cfa35c1f0dfd515fde457f5._comment create mode 100644 doc/bugs/windows_install_failure/comment_2_1d3364d8f5c4963f3a7e473298ec6ed1._comment create mode 100644 doc/bugs/windows_port_-_can__39__t_directly_access_files.mdwn create mode 100644 doc/bugs/windows_port_-_can__39__t_directly_access_files/comment_1_03ef9d33839173044dcc4f2b37f575d2._comment create mode 100644 doc/bugs/windows_port_-_can__39__t_directly_access_files/comment_2_c65e5491c82908af46fe2c97e048d210._comment create mode 100644 doc/bugs/windows_port_-_git_annex_add_hangs_when_adding_17_files_at_once_or_more_.mdwn create mode 100644 doc/bugs/windows_port_-_repo_can__39__t_pull_newly_added_files_.mdwn create mode 100644 doc/bugs/windows_port_-_repo_can__39__t_pull_newly_added_files_/comment_10_b4f5e2d6a0d690f6b0089fa80a3c920b._comment create mode 100644 doc/bugs/windows_port_-_repo_can__39__t_pull_newly_added_files_/comment_1_c2092add1430667108a3fdc5e1c9b5f5._comment create mode 100644 doc/bugs/windows_port_-_repo_can__39__t_pull_newly_added_files_/comment_2_f0ea453951daf84dbddc653ac64822b6._comment create mode 100644 doc/bugs/windows_port_-_repo_can__39__t_pull_newly_added_files_/comment_3_35a8be5ecc9d1b72c38f8ddb47678160._comment create mode 100644 doc/bugs/windows_port_-_repo_can__39__t_pull_newly_added_files_/comment_4_29e72997b88f91f84639587b4cede34c._comment create mode 100644 doc/bugs/windows_port_-_repo_can__39__t_pull_newly_added_files_/comment_5_2de7f6532de4cbc21737ce53a89d6525._comment create mode 100644 doc/bugs/windows_port_-_repo_can__39__t_pull_newly_added_files_/comment_6_80d130b5af829763be77c61a9c5ca306._comment create mode 100644 doc/bugs/windows_port_-_repo_can__39__t_pull_newly_added_files_/comment_7_ec199db851952b40e8b18922da574ea4._comment create mode 100644 doc/bugs/windows_port_-_repo_can__39__t_pull_newly_added_files_/comment_8_d269fcadea9d5a668e3c6d6cf019f56a._comment create mode 100644 doc/bugs/windows_port_-_repo_can__39__t_pull_newly_added_files_/comment_9_908d1b981d56107f29d8972bf11aefc8._comment create mode 100644 doc/bugs/wrong_program_path_in___126____47__.config__47__git-annex__47__program.mdwn create mode 100644 doc/bugs/wrong_program_path_in___126____47__.config__47__git-annex__47__program/comment_1_44c11918d00ead38d40556aade98c0af._comment create mode 100644 doc/bugs/xdg-user-dir_error.mdwn create mode 100644 doc/bugs/xmpp_needs_one_account_per_distinct_repository.mdwn create mode 100644 doc/bugs/xmpp_needs_one_account_per_distinct_repository/comment_1_820732c4dcb15186b4f635c50fdb0805._comment create mode 100644 doc/bugs/yesod-default_is_needed_as_a_dependancy.mdwn create mode 100644 doc/bugs/yesod-form_missing.mdwn create mode 100644 doc/bugs/youtube_support_suddenly_stopped_working.mdwn create mode 100644 doc/builds.mdwn create mode 100644 doc/coding_style.mdwn create mode 100644 doc/comments.mdwn create mode 100644 doc/contact.mdwn create mode 100644 doc/contact/comment_1_12d60f767d90bea94974e1ff6b206d31._comment create mode 100644 doc/contact/comment_2_95b6d868b913418de50ba121d71d2390._comment create mode 100644 doc/contact/comment_3_2cf43bd406673294e6cdbd785c4a0d0c._comment create mode 100644 doc/contact/comment_4_586a506e27379d74fbc0f4b654e89c7d._comment create mode 100644 doc/copies.mdwn create mode 100644 doc/copies/comment_1_af9bee33777fb8a187b714fc8c5fb11d._comment create mode 100644 doc/design.mdwn create mode 100644 doc/design/assistant.mdwn create mode 100644 doc/design/assistant/OSX.mdwn create mode 100644 doc/design/assistant/OSX/comment_1_9290f6e6f265e906b08631224392b7bf._comment create mode 100644 doc/design/assistant/android.mdwn create mode 100644 doc/design/assistant/android/comment_10_316bde8d22628e5e9d4f8dabce1d2ad4._comment create mode 100644 doc/design/assistant/android/comment_1_8be9a74e5fc4641c2bf2e1bb7673dd59._comment create mode 100644 doc/design/assistant/android/comment_2_3dd386ac1b757c73d14f14377b9eedd4._comment create mode 100644 doc/design/assistant/android/comment_3_5dca47a4599d6e88d19193701c5a571b._comment create mode 100644 doc/design/assistant/android/comment_4_054f06311e2b51d73be569f181eb004f._comment create mode 100644 doc/design/assistant/android/comment_5_bb3d36e9d29f2fa77bee6d47ef9917fe._comment create mode 100644 doc/design/assistant/android/comment_6_fee32a831eeb5736fe1dce52e30320c8._comment create mode 100644 doc/design/assistant/android/comment_7_d8e9b0a5287fc96b19dc2cb9da3586ce._comment create mode 100644 doc/design/assistant/android/comment_8_79a7b5bb5f4aaeea4a4e8ced0561701a._comment create mode 100644 doc/design/assistant/android/comment_9_55ea70a6929523d26248ff6409b04a6e._comment create mode 100644 doc/design/assistant/blog.mdwn create mode 100644 doc/design/assistant/blog/day_100__cursed_clouds.mdwn create mode 100644 doc/design/assistant/blog/day_102__very_high_level_programming.mdwn create mode 100644 doc/design/assistant/blog/day_102__very_high_level_programming/comment_1_c028b403261dd66bcf83e6ffd134b80b._comment create mode 100644 doc/design/assistant/blog/day_103__bugfix_day.mdwn create mode 100644 doc/design/assistant/blog/day_104__misc.mdwn create mode 100644 doc/design/assistant/blog/day_104__misc/comment_1_13d7fad2d3f8eab10314784c035e2a16._comment create mode 100644 doc/design/assistant/blog/day_105__lazy_Sunday.mdwn create mode 100644 doc/design/assistant/blog/day_106__lazy_Monday.mdwn create mode 100644 doc/design/assistant/blog/day_107__memory_leak.mdwn create mode 100644 doc/design/assistant/blog/day_108__another_zombie_outbreak.mdwn create mode 100644 doc/design/assistant/blog/day_108__another_zombie_outbreak/comment_1_194c48d65993462f809a2cfaa774a3e2._comment create mode 100644 doc/design/assistant/blog/day_108__another_zombie_outbreak/comment_2_ef5ee5933fcadcb81cc81b816db14bda._comment create mode 100644 doc/design/assistant/blog/day_109__dropping.mdwn create mode 100644 doc/design/assistant/blog/day_10__lsof.mdwn create mode 100644 doc/design/assistant/blog/day_10__lsof/comment_1_9b8c28c85c979f32e5c295b6a03c048e._comment create mode 100644 doc/design/assistant/blog/day_110__more_dropping.mdwn create mode 100644 doc/design/assistant/blog/day_111__config_monitor.mdwn create mode 100644 doc/design/assistant/blog/day_112__and_now_for_something_completely_different.mdwn create mode 100644 doc/design/assistant/blog/day_112__and_now_for_something_completely_different/comment_1_5e4fe1538d9ae1c450b0a6602fc6d29b._comment create mode 100644 doc/design/assistant/blog/day_112__and_now_for_something_completely_different/comment_2_c5a734f611ecc95729904e645583ee43._comment create mode 100644 doc/design/assistant/blog/day_112__and_now_for_something_completely_different/comment_3_46b16dcd0fce07036cd8ed6ed9d2b055._comment create mode 100644 doc/design/assistant/blog/day_112__and_now_for_something_completely_different/comment_4_1fe036e4c65fb4211aa2c394f535344a._comment create mode 100644 doc/design/assistant/blog/day_112__and_now_for_something_completely_different/comment_5_e4ba3568c4efd98f212dd47427a1cf47._comment create mode 100644 doc/design/assistant/blog/day_113__notifier_work.mdwn create mode 100644 doc/design/assistant/blog/day_114__xmpp.mdwn create mode 100644 doc/design/assistant/blog/day_114__xmpp/comment_1_c2b0617a2fc3dc4f19a6be6947913842._comment create mode 100644 doc/design/assistant/blog/day_114__xmpp/comment_2_d14375dfb5791615802dab3c5438f8e2._comment create mode 100644 doc/design/assistant/blog/day_114__xmpp/comment_3_6d72ea32c111e605be30ad2153fc71c9._comment create mode 100644 doc/design/assistant/blog/day_114__xmpp/comment_4_e51d6f854db5f9e74a1aa58bd8923795._comment create mode 100644 doc/design/assistant/blog/day_115__my_new_form.mdwn create mode 100644 doc/design/assistant/blog/day_116__the_segfault.mdwn create mode 100644 doc/design/assistant/blog/day_117__new_topologies.mdwn create mode 100644 doc/design/assistant/blog/day_118__monadic_discontinuity.mdwn create mode 100644 doc/design/assistant/blog/day_119__time_for_testing.mdwn create mode 100644 doc/design/assistant/blog/day_11__freebsd.mdwn create mode 100644 doc/design/assistant/blog/day_120__test_day.mdwn create mode 100644 doc/design/assistant/blog/day_121__buddy_list.mdwn create mode 100644 doc/design/assistant/blog/day_122__xmpp_pairing.mdwn create mode 100644 doc/design/assistant/blog/day_122__xmpp_pairing/comment_1_e95efb23eb2e67e3f11a5c7de56424a7._comment create mode 100644 doc/design/assistant/blog/day_122__xmpp_pairing/comment_2_30e251e73146512bde8b2f69eddeef2e._comment create mode 100644 doc/design/assistant/blog/day_123__xmpp_insanity.mdwn create mode 100644 doc/design/assistant/blog/day_124__git_push_over_xmpp_groundwork.mdwn create mode 100644 doc/design/assistant/blog/day_125__xmpp_push_continues.mdwn create mode 100644 doc/design/assistant/blog/day_126__mr_watson_come_here.mdwn create mode 100644 doc/design/assistant/blog/day_126__mr_watson_come_here/comment_1_ee1361e6b235f4e1c00596ba516b519a._comment create mode 100644 doc/design/assistant/blog/day_126__mr_watson_come_here/comment_2_8eb366ae7efb347bd3bbd9a98e0821b3._comment create mode 100644 doc/design/assistant/blog/day_127__xmpp_syncs.mdwn create mode 100644 doc/design/assistant/blog/day_128__last_xmpp_day.mdwn create mode 100644 doc/design/assistant/blog/day_128__last_xmpp_day/comment_1_fd8c1d6358cb50f4dad8ba11d33d861f._comment create mode 100644 doc/design/assistant/blog/day_128__last_xmpp_day/comment_2_43664b73c71c41d71bc95e665f128106._comment create mode 100644 doc/design/assistant/blog/day_128__last_xmpp_day/comment_3_d369b04f686009a9dbb57b999107a55e._comment create mode 100644 doc/design/assistant/blog/day_128__last_xmpp_day/comment_4_095855d301e7ccd3689ffe507cfb63ee._comment create mode 100644 doc/design/assistant/blog/day_128__last_xmpp_day/comment_5_da7b0586b0b28e1e0fe4126f6543a7bc._comment create mode 100644 doc/design/assistant/blog/day_128__last_xmpp_day/comment_6_2f9ba367e19d77bf52f372b6f0f5938a._comment create mode 100644 doc/design/assistant/blog/day_129__release.mdwn create mode 100644 doc/design/assistant/blog/day_12__freebsd_redux.mdwn create mode 100644 doc/design/assistant/blog/day_12__freebsd_redux/comment_1_5da32cf53f1de27bfe6cec2d294db3e1._comment create mode 100644 doc/design/assistant/blog/day_12__freebsd_redux/comment_2_696d6e22034acf5bb60d80124b72ef2f._comment create mode 100644 doc/design/assistant/blog/day_130__what_now.mdwn create mode 100644 doc/design/assistant/blog/day_130__what_now/comment_1_402f00cc034351d8253a797dd4de55bf._comment create mode 100644 doc/design/assistant/blog/day_131__webdav_groundwork.mdwn create mode 100644 doc/design/assistant/blog/day_132__webdav_continued.mdwn create mode 100644 doc/design/assistant/blog/day_133__webdav_working.mdwn create mode 100644 doc/design/assistant/blog/day_134__box.com_configurator.mdwn create mode 100644 doc/design/assistant/blog/day_135__progress_revisited.mdwn create mode 100644 doc/design/assistant/blog/day_136__misc.mdwn create mode 100644 doc/design/assistant/blog/day_137__Glacier.mdwn create mode 100644 doc/design/assistant/blog/day_138__back.mdwn create mode 100644 doc/design/assistant/blog/day_138__back/comment_1_65a8499b284bed38d2bde1886a54a311._comment create mode 100644 doc/design/assistant/blog/day_139__catch_up.mdwn create mode 100644 doc/design/assistant/blog/day_13__kqueue_continued.mdwn create mode 100644 doc/design/assistant/blog/day_140__release_monday.mdwn create mode 100644 doc/design/assistant/blog/day_141__release_tuesday.mdwn create mode 100644 doc/design/assistant/blog/day_141__release_tuesday/comment_1_a5adea7a726df12f9121c744a036f08d._comment create mode 100644 doc/design/assistant/blog/day_142__filling_in.mdwn create mode 100644 doc/design/assistant/blog/day_143__what_next.mdwn create mode 100644 doc/design/assistant/blog/day_143__what_next/comment_1_40cf25a2ebdd43d8974a28e180e100e5._comment create mode 100644 doc/design/assistant/blog/day_143__what_next/comment_2_af9ccbbc5131e6333c029415141bdb51._comment create mode 100644 doc/design/assistant/blog/day_144__webapp_work.mdwn create mode 100644 doc/design/assistant/blog/day_145__more_webapp_work.mdwn create mode 100644 doc/design/assistant/blog/day_146__meanwhile.mdwn create mode 100644 doc/design/assistant/blog/day_147__direct_mode.mdwn create mode 100644 doc/design/assistant/blog/day_147__direct_mode/comment_1_0bd69532afce9dc04e3d88bfd0aed4b2._comment create mode 100644 doc/design/assistant/blog/day_147__direct_mode/comment_2_3b26f0d081c3bf1037bb872d529ce825._comment create mode 100644 doc/design/assistant/blog/day_148__direct_mode.mdwn create mode 100644 doc/design/assistant/blog/day_149__rainy_day.mdwn create mode 100644 doc/design/assistant/blog/day_14__kqueue_kqueue_kqueue.mdwn create mode 100644 doc/design/assistant/blog/day_14__thinking_about_syncing.mdwn create mode 100644 doc/design/assistant/blog/day_150__12:12.mdwn create mode 100644 doc/design/assistant/blog/day_151__direct_mode_toggle.mdwn create mode 100644 doc/design/assistant/blog/day_152__bugfixes.mdwn create mode 100644 doc/design/assistant/blog/day_152__bugfixes/comment_1_46863a875f9daa6f2c9248b66ff91929._comment create mode 100644 doc/design/assistant/blog/day_152__bugfixes/comment_2_a586e617bc024c8a9ff60f1b8345d74d._comment create mode 100644 doc/design/assistant/blog/day_153__hibernation.mdwn create mode 100644 doc/design/assistant/blog/day_154__direct_mode_merging.mdwn create mode 100644 doc/design/assistant/blog/day_155__bugfixes.mdwn create mode 100644 doc/design/assistant/blog/day_156_and_157__direct_mode_assistant.mdwn create mode 100644 doc/design/assistant/blog/day_158__fsevents.mdwn create mode 100644 doc/design/assistant/blog/day_158__fsevents/comment_1_b278372ac6399f64d5fa9da178278a6d._comment create mode 100644 doc/design/assistant/blog/day_158__fsevents/comment_2_2d5ce9b2807068c3517e185945662bd2._comment create mode 100644 doc/design/assistant/blog/day_159__fsevents_and_assistant.mdwn create mode 100644 doc/design/assistant/blog/day_159__fsevents_and_assistant/comment_1_b85f446c3fa8d703a2a8882825c6f33f._comment create mode 100644 doc/design/assistant/blog/day_159__fsevents_and_assistant/comment_2_a150b404e0c39e0bb2f7dd00cda63cdc._comment create mode 100644 doc/design/assistant/blog/day_159__fsevents_and_assistant/comment_3_37abc41bae23a1d7de0d19d952aec492._comment create mode 100644 doc/design/assistant/blog/day_15__its_aliiive.mdwn create mode 100644 doc/design/assistant/blog/day_160__finishing_up_direct_mode.mdwn create mode 100644 doc/design/assistant/blog/day_161__release_day.mdwn create mode 100644 doc/design/assistant/blog/day_161__release_day/comment_1_e82c67f3ce216618149537bba1e0b850._comment create mode 100644 doc/design/assistant/blog/day_161__release_day/comment_2_b1fe96fd818935c0497b78bb8ad32ffa._comment create mode 100644 doc/design/assistant/blog/day_161__release_day/comment_3_40bac0e1756aa77bb966c4654857141c._comment create mode 100644 doc/design/assistant/blog/day_161__release_day/comment_4_af65656b0d1179636937595868bb97b0._comment create mode 100644 doc/design/assistant/blog/day_161__release_day/comment_5_0c05caaaf9588e124585041bf5f45d75._comment create mode 100644 doc/design/assistant/blog/day_161__release_day/comment_6_5dfb5f428633d6062925f61af2b8829b._comment create mode 100644 doc/design/assistant/blog/day_161__release_day/comment_7_ac4effb381b08d94d4a2d2482e92c89a._comment create mode 100644 doc/design/assistant/blog/day_161__release_day/comment_8_32600e89e3098e52a1280895e03b3f86._comment create mode 100644 doc/design/assistant/blog/day_161__release_day/comment_9_07e5d0c3cad0ce2bd4943e53b61f1767._comment create mode 100644 doc/design/assistant/blog/day_162__UI.mdwn create mode 100644 doc/design/assistant/blog/day_163__free_features.mdwn create mode 100644 doc/design/assistant/blog/day_164__bugfixes.mdwn create mode 100644 doc/design/assistant/blog/day_165__release_day.mdwn create mode 100644 doc/design/assistant/blog/day_166__a_short_long_day.mdwn create mode 100644 doc/design/assistant/blog/day_167__safe_direct_mode_transfers.mdwn create mode 100644 doc/design/assistant/blog/day_167__safe_direct_mode_transfers/comment_1_f1aa64fe803d8c14b250a4e98b88142a._comment create mode 100644 doc/design/assistant/blog/day_167__safe_direct_mode_transfers/comment_2_5ce1db84c9ead713f1272c4975645b93._comment create mode 100644 doc/design/assistant/blog/day_168__back_to_theme.mdwn create mode 100644 doc/design/assistant/blog/day_168__back_to_theme/comment_1_f248780bfcbd0384d9d72c2633a4ea46._comment create mode 100644 doc/design/assistant/blog/day_168__back_to_theme/comment_2_5beba073373b8e75a32d1fcfdc1a0782._comment create mode 100644 doc/design/assistant/blog/day_169__direct_mode_is_safe.mdwn create mode 100644 doc/design/assistant/blog/day_169__direct_mode_is_safe/comment_1_65f87656c4e6bc7cdb614f53961341c9._comment create mode 100644 doc/design/assistant/blog/day_169__direct_mode_is_safe/comment_2_a116a402a126c62be54c06afd82439ab._comment create mode 100644 doc/design/assistant/blog/day_16__more_robust_syncing.mdwn create mode 100644 doc/design/assistant/blog/day_16__more_robust_syncing/comment_1_23e7a90429e4431f90787cd016ebe188._comment create mode 100644 doc/design/assistant/blog/day_16__more_robust_syncing/comment_2_8e7e7cd27791bb47625e60a284e9c802._comment create mode 100644 doc/design/assistant/blog/day_170__bugfixes_and_release.mdwn create mode 100644 doc/design/assistant/blog/day_171__logs.mdwn create mode 100644 doc/design/assistant/blog/day_172__short_day.mdwn create mode 100644 doc/design/assistant/blog/day_172__short_day/comment_1_b75e26b77a23a45da1c4c3bca1399246._comment create mode 100644 doc/design/assistant/blog/day_173__snow_day.mdwn create mode 100644 doc/design/assistant/blog/day_174__last_weekend_before_AU.mdwn create mode 100644 doc/design/assistant/blog/day_174__last_weekend_before_AU/comment_1_05a8fd47f54373331741cc869a53b0c3._comment create mode 100644 doc/design/assistant/blog/day_174__last_weekend_before_AU/comment_2_fc8e65eef954c4caa8321c2fe8b711b7._comment create mode 100644 doc/design/assistant/blog/day_174__last_weekend_before_AU/comment_3_399534f540d85cac067fbb7be9d373b4._comment create mode 100644 doc/design/assistant/blog/day_175__pacific_features.mdwn create mode 100644 doc/design/assistant/blog/day_175__pacific_features/comment_1_c3ee4386f872b7c76aaecfa638b368cb._comment create mode 100644 doc/design/assistant/blog/day_176__thread_management.mdwn create mode 100644 doc/design/assistant/blog/day_178__bus_hacking.mdwn create mode 100644 doc/design/assistant/blog/day_179__brief_updates.mdwn create mode 100644 doc/design/assistant/blog/day_179__brief_updates/comment_1_920a84457d40358507a3eb817a4568d9._comment create mode 100644 doc/design/assistant/blog/day_17__push_queue_prune.mdwn create mode 100644 doc/design/assistant/blog/day_180__back.mdwn create mode 100644 doc/design/assistant/blog/day_181__triage.mdwn create mode 100644 doc/design/assistant/blog/day_182__it_begins.mdwn create mode 100644 doc/design/assistant/blog/day_183__plan_b.mdwn create mode 100644 doc/design/assistant/blog/day_184__just_wanna_run_something.mdwn create mode 100644 doc/design/assistant/blog/day_184__just_wanna_run_something/comment_1_689adac7e26cb0b0a4e7ecc787cfd716._comment create mode 100644 doc/design/assistant/blog/day_185__android_liftoff.mdwn create mode 100644 doc/design/assistant/blog/day_185__android_liftoff/comment_1_b7d28010a72619a7e9a5ad4f2a0d6c07._comment create mode 100644 doc/design/assistant/blog/day_185__android_liftoff/comment_2_ddeb24e86fafb7dae93142cc02767aad._comment create mode 100644 doc/design/assistant/blog/day_186__Android_success.mdwn create mode 100644 doc/design/assistant/blog/day_186__Android_success/comment_1_1629da240ca7db5f8a32059f561fd435._comment create mode 100644 doc/design/assistant/blog/day_187__porting_utilities.mdwn create mode 100644 doc/design/assistant/blog/day_187__porting_utilities/comment_1_0e6a3f4fe8e09f247fa04156bc60f8c7._comment create mode 100644 doc/design/assistant/blog/day_188__crippled_filesystem_support.mdwn create mode 100644 doc/design/assistant/blog/day_188__crippled_filesystem_support/comment_1_32a296fce23ae4b1e18bd5a9964bf619._comment create mode 100644 doc/design/assistant/blog/day_189__more_crippling.mdwn create mode 100644 doc/design/assistant/blog/day_18__merging.mdwn create mode 100644 doc/design/assistant/blog/day_18__merging/comment_1_7a553ad559519f3b3e3cd20115b4c44e._comment create mode 100644 doc/design/assistant/blog/day_190-191__weekend.mdwn create mode 100644 doc/design/assistant/blog/day_190-191__weekend/comment_1_dbd692d12c14d08acd7d73a655b34e8b._comment create mode 100644 doc/design/assistant/blog/day_190-191__weekend/comment_2_c813830e53471a9732e010a748d574fc._comment create mode 100644 doc/design/assistant/blog/day_192_193__more_porting.mdwn create mode 100644 doc/design/assistant/blog/day_194__nice_moment.mdwn create mode 100644 doc/design/assistant/blog/day_195__real_android_app.mdwn create mode 100644 doc/design/assistant/blog/day_195__real_android_app/comment_10_0112007552b30cd9bfeac614a1e399c4._comment create mode 100644 doc/design/assistant/blog/day_195__real_android_app/comment_11_230d3c169c713f613b9d607d84ce5092._comment create mode 100644 doc/design/assistant/blog/day_195__real_android_app/comment_12_8d74ad2a61c02272758d157282ad56ec._comment create mode 100644 doc/design/assistant/blog/day_195__real_android_app/comment_13_4f6bc0680f2debd638933968a26975e0._comment create mode 100644 doc/design/assistant/blog/day_195__real_android_app/comment_14_71539c62608866464e8faa76bc522a55._comment create mode 100644 doc/design/assistant/blog/day_195__real_android_app/comment_15_e1b205289721ae79ac7fbed2f44018b2._comment create mode 100644 doc/design/assistant/blog/day_195__real_android_app/comment_1_4bc0aeae4fa1116944644c64feaf9697._comment create mode 100644 doc/design/assistant/blog/day_195__real_android_app/comment_2_17bb6e7565d4c757f6c1e3514c22f47d._comment create mode 100644 doc/design/assistant/blog/day_195__real_android_app/comment_3_cd8a6bec0f7c6843dd11d3266f25f864._comment create mode 100644 doc/design/assistant/blog/day_195__real_android_app/comment_4_2d2eee4bcbbd1d069a80bff5edc90c3c._comment create mode 100644 doc/design/assistant/blog/day_195__real_android_app/comment_6_3d96568c469a8c53a982f304eae5e7d4._comment create mode 100644 doc/design/assistant/blog/day_195__real_android_app/comment_6_e8667c47d07fc842cf0fe2ebbfbc1c58._comment create mode 100644 doc/design/assistant/blog/day_195__real_android_app/comment_7_cf8da7720ddc20b05955ee671ca4acd5._comment create mode 100644 doc/design/assistant/blog/day_195__real_android_app/comment_8_f4709bdbc739182819b648fd6aa00531._comment create mode 100644 doc/design/assistant/blog/day_195__real_android_app/comment_9_e66af12c7eca0d457b8406e9fb4b69be._comment create mode 100644 doc/design/assistant/blog/day_196__android_bugfixes.mdwn create mode 100644 doc/design/assistant/blog/day_197__template_haskell.mdwn create mode 100644 doc/design/assistant/blog/day_197__template_haskell/comment_1_82d9f9508929d84abf7b718c59436ae8._comment create mode 100644 doc/design/assistant/blog/day_198__bugfixes.mdwn create mode 100644 doc/design/assistant/blog/day_198__bugfixes/comment_1_5a15b5bad0f9ba2423d2aebe440ac0ea._comment create mode 100644 doc/design/assistant/blog/day_198__bugfixes/comment_2_36d94b838e5e65c85e7afaabe8a578f1._comment create mode 100644 doc/design/assistant/blog/day_198__bugfixes/comment_3_ae9b74341a3bc6e1e84d2c0ca4c5f612._comment create mode 100644 doc/design/assistant/blog/day_198__bugfixes/comment_4_5a4827227c03bcff3b1e4c44b531f816._comment create mode 100644 doc/design/assistant/blog/day_198__bugfixes/comment_5_9c5f4c85217e898be4c57c615e53c36f._comment create mode 100644 doc/design/assistant/blog/day_198__bugfixes/comment_6_bccf1abfb7f56d97673158f3ccfce511._comment create mode 100644 doc/design/assistant/blog/day_198__bugfixes/comment_7_6f1b51b002cc5d2b505d80e3e04bf6f3._comment create mode 100644 doc/design/assistant/blog/day_198__bugfixes/comment_8_8a3542437663028b17442818eba3f7c5._comment create mode 100644 doc/design/assistant/blog/day_199__wrapping_up_Android_for_now.mdwn create mode 100644 doc/design/assistant/blog/day_199__wrapping_up_Android_for_now/comment_1_ec57358afc7e78d2860aa4237793832d._comment create mode 100644 doc/design/assistant/blog/day_19__random_improvements.mdwn create mode 100644 doc/design/assistant/blog/day_1__inotify.mdwn create mode 100644 doc/design/assistant/blog/day_200__release_day.mdwn create mode 100644 doc/design/assistant/blog/day_200__release_day/comment_10_40cfe9bfd9e611fd734dbb5aad348aa3._comment create mode 100644 doc/design/assistant/blog/day_200__release_day/comment_11_b26890fdae575d42170988073fb2e45d._comment create mode 100644 doc/design/assistant/blog/day_200__release_day/comment_13_710a30c5d31bf549833ecfe9a0997c94._comment create mode 100644 doc/design/assistant/blog/day_200__release_day/comment_13_b6f62ab7e810ba6d3a43f0ead370c79a._comment create mode 100644 doc/design/assistant/blog/day_200__release_day/comment_1_a68e1ed7829b49086c567d97ddc09912._comment create mode 100644 doc/design/assistant/blog/day_200__release_day/comment_2_39d3ad0a029fe56e96f97d28d17fbbd2._comment create mode 100644 doc/design/assistant/blog/day_200__release_day/comment_3_5b752d6a8d74e61190f09384b6108206._comment create mode 100644 doc/design/assistant/blog/day_200__release_day/comment_4_881274ae0d6230bb4cafa4151ad72b49._comment create mode 100644 doc/design/assistant/blog/day_200__release_day/comment_5_e220059be77cf0ef396f37a4f9ccf9b5._comment create mode 100644 doc/design/assistant/blog/day_200__release_day/comment_6_ec2152151188dd252cdb61c68cfc12e4._comment create mode 100644 doc/design/assistant/blog/day_200__release_day/comment_7_42572411617c287368482bb9dcf94324._comment create mode 100644 doc/design/assistant/blog/day_200__release_day/comment_8_6b69aa81a9ba4e07e547ed1869946d51._comment create mode 100644 doc/design/assistant/blog/day_200__release_day/comment_9_b070a2e4151d9fbf43d7906efa78515f._comment create mode 100644 doc/design/assistant/blog/day_201__real_Android_wrapup.mdwn create mode 100644 doc/design/assistant/blog/day_201__real_Android_wrapup/comment_1_88b9950c51324f0bb89c5646b3170952._comment create mode 100644 doc/design/assistant/blog/day_201__real_Android_wrapup/fib.png create mode 100644 doc/design/assistant/blog/day_201__working_web_server.mdwn create mode 100644 doc/design/assistant/blog/day_203__procrastination.mdwn create mode 100644 doc/design/assistant/blog/day_204__deprocrastination.mdwn create mode 100644 doc/design/assistant/blog/day_205_206__rainy_day__snow_day.mdwn create mode 100644 doc/design/assistant/blog/day_207__XMPP.mdwn create mode 100644 doc/design/assistant/blog/day_208__bugfixes.mdwn create mode 100644 doc/design/assistant/blog/day_209__The_Bug.mdwn create mode 100644 doc/design/assistant/blog/day_20__data_transfer_design.mdwn create mode 100644 doc/design/assistant/blog/day_210__spring.mdwn create mode 100644 doc/design/assistant/blog/day_211__zooming_along.mdwn create mode 100644 doc/design/assistant/blog/day_212__accidental_all_nighter.mdwn create mode 100644 doc/design/assistant/blog/day_212__accidental_all_nighter/comment_1_6ee1f8056eedb6eb18013faf8f5ec212._comment create mode 100644 doc/design/assistant/blog/day_212__accidental_all_nighter/comment_2_07c83d75bb105bb77ada07359ed0ea7a._comment create mode 100644 doc/design/assistant/blog/day_212__accidental_all_nighter/comment_3_2c904d33f4f14807fbe718a01e98800a._comment create mode 100644 doc/design/assistant/blog/day_212__accidental_all_nighter/comment_4_59ec5c1cab75df87293800a7a03fe9c6._comment create mode 100644 doc/design/assistant/blog/day_212__accidental_all_nighter/comment_5_13893f106e835dcc52e03c7c6740c35b._comment create mode 100644 doc/design/assistant/blog/day_213__costs.mdwn create mode 100644 doc/design/assistant/blog/day_214__release_day.mdwn create mode 100644 doc/design/assistant/blog/day_215__dashboard_UI_refresh.mdwn create mode 100644 doc/design/assistant/blog/day_216__more_bugfixes.mdwn create mode 100644 doc/design/assistant/blog/day_216__more_bugfixes/comment_1_299462bcdd0e4f6cd7895b5f40ca00ad._comment create mode 100644 doc/design/assistant/blog/day_216__more_bugfixes/comment_2_1913d65dfe4ba08379d82a4a2ca91c40._comment create mode 100644 doc/design/assistant/blog/day_216__more_bugfixes/comment_3_92c774599a78540ad398afcd1d05f7ce._comment create mode 100644 doc/design/assistant/blog/day_217__nothing.mdwn create mode 100644 doc/design/assistant/blog/day_219__bug_triage.mdwn create mode 100644 doc/design/assistant/blog/day_219__bug_triage/comment_1_c6b977a969cacdce62987a439b7686f5._comment create mode 100644 doc/design/assistant/blog/day_21__transfer_tracking.mdwn create mode 100644 doc/design/assistant/blog/day_220__performance.mdwn create mode 100644 doc/design/assistant/blog/day_221__this_and_that.mdwn create mode 100644 doc/design/assistant/blog/day_222__back.mdwn create mode 100644 doc/design/assistant/blog/day_222__back/comment_1_f05b48231a1ee0cffba7d66e112e5551._comment create mode 100644 doc/design/assistant/blog/day_222__back/comment_2_4d5f003ccd81580017ebf0dc31bc9cda._comment create mode 100644 doc/design/assistant/blog/day_223__progress_revisited.mdwn create mode 100644 doc/design/assistant/blog/day_224__annex.largefiles.mdwn create mode 100644 doc/design/assistant/blog/day_224__annex.largefiles/comment_1_408e4021b18f7ff5548d2d19ab558922._comment create mode 100644 doc/design/assistant/blog/day_224__annex.largefiles/comment_2_b24d1da2bc4307ded0216daffb8f9336._comment create mode 100644 doc/design/assistant/blog/day_225__back_from_the_dead.mdwn create mode 100644 doc/design/assistant/blog/day_225__back_from_the_dead/comment_1_9ac37c3b5c4c72ec8a39dce00bcbe420._comment create mode 100644 doc/design/assistant/blog/day_225__back_from_the_dead/comment_2_26125dd9ef2bd10b597d14b2c6180952._comment create mode 100644 doc/design/assistant/blog/day_226__poll_results.mdwn create mode 100644 doc/design/assistant/blog/day_226__poll_results/comment_1_1ed980472214be6d0a8cf55f37797fda._comment create mode 100644 doc/design/assistant/blog/day_226__poll_results/comment_2_6823b0a9a8037f1a5214db4db98fb16e._comment create mode 100644 doc/design/assistant/blog/day_227__bigfixing_all_day_today.mdwn create mode 100644 doc/design/assistant/blog/day_228__more_work_on_repository_removals.mdwn create mode 100644 doc/design/assistant/blog/day_229__rainy_day_bugfixes.mdwn create mode 100644 doc/design/assistant/blog/day_22__horrible_option_parsing_hack.mdwn create mode 100644 doc/design/assistant/blog/day_230__Mom.mdwn create mode 100644 doc/design/assistant/blog/day_230__Mom/comment_1_696bba2246c8a9e6ce4aed3071bcc96c._comment create mode 100644 doc/design/assistant/blog/day_230__Mom/comment_2_2fa295ab6db0828cb725cfcfb6777822._comment create mode 100644 doc/design/assistant/blog/day_230__Mom/comment_3_fafd7abec629290418334ddb015bf62c._comment create mode 100644 doc/design/assistant/blog/day_230__Mom/comment_4_450cac0f2e82c94fd34b527ae05ef1b8._comment create mode 100644 doc/design/assistant/blog/day_231__insert_title.mdwn create mode 100644 doc/design/assistant/blog/day_232__headless_webapp.mdwn create mode 100644 doc/design/assistant/blog/day_232__headless_webapp/comment_1_0fdd77d143ecba6fdb9f75cb6fc37bfb._comment create mode 100644 doc/design/assistant/blog/day_232__headless_webapp/comment_2_0784a2a73c3e2945f3d3f2577b3b9c9c._comment create mode 100644 doc/design/assistant/blog/day_232__headless_webapp/comment_3_ccb9fa22422fb913b6a496ebe65c49fb._comment create mode 100644 doc/design/assistant/blog/day_232__headless_webapp/comment_4_ceba4468760a2525960327698431cee2._comment create mode 100644 doc/design/assistant/blog/day_233__taxes.mdwn create mode 100644 doc/design/assistant/blog/day_233__taxes/comment_1_9473ffdc42595af9c293fbcd5a1cdb54._comment create mode 100644 doc/design/assistant/blog/day_233__taxes/comment_2_5feed8d7053ba03812ccda8c61fd9775._comment create mode 100644 doc/design/assistant/blog/day_234__clean_shutdown.mdwn create mode 100644 doc/design/assistant/blog/day_235__birthday.mdwn create mode 100644 doc/design/assistant/blog/day_235__birthday/comment_1_db558b071067c1e63cde05cca0551094._comment create mode 100644 doc/design/assistant/blog/day_235__birthday/comment_2_d1a2c1124781118267599457ae9e0512._comment create mode 100644 doc/design/assistant/blog/day_235__birthday/comment_3_b853508d1d15234958b9f4a39277e45c._comment create mode 100644 doc/design/assistant/blog/day_235__birthday/comment_5_73aad3398a43bc4d28bca9bf635fa757._comment create mode 100644 doc/design/assistant/blog/day_236__evil_splicer.mdwn create mode 100644 doc/design/assistant/blog/day_237__gnome-keyring_craziness.mdwn create mode 100644 doc/design/assistant/blog/day_237__gnome-keyring_craziness/comment_1_0cb088b732881d1fa92493aa1fd93d43._comment create mode 100644 doc/design/assistant/blog/day_237__gnome-keyring_craziness/comment_2_b855fd710954beebaafe6d2bd03eb368._comment create mode 100644 doc/design/assistant/blog/day_238__back_to_Android.mdwn create mode 100644 doc/design/assistant/blog/day_239__bugfixes_and_frustration.mdwn create mode 100644 doc/design/assistant/blog/day_23__transfer_watching.mdwn create mode 100644 doc/design/assistant/blog/day_240__it_builds.mdwn create mode 100644 doc/design/assistant/blog/day_240__it_builds/comment_1_151840ae0020ea63b2f041488c905386._comment create mode 100644 doc/design/assistant/blog/day_241__cleanup.mdwn create mode 100644 doc/design/assistant/blog/day_241__cleanup/comment_1_0e283cdf66a25b3cc9423fe651084cb9._comment create mode 100644 doc/design/assistant/blog/day_242__more_porting.mdwn create mode 100644 doc/design/assistant/blog/day_243__in_the_field.mdwn create mode 100644 doc/design/assistant/blog/day_244__android_porting.mdwn create mode 100644 doc/design/assistant/blog/day_245__misc.mdwn create mode 100644 doc/design/assistant/blog/day_245__misc/comment_1_3a2976617bb0cdc206fb1397a2ef1177._comment create mode 100644 doc/design/assistant/blog/day_245__misc/comment_2_e0f9704e91fedca8ff26356f354cc1c3._comment create mode 100644 doc/design/assistant/blog/day_245__misc/comment_3_93003a0d0983efbdc046d7459be194b0._comment create mode 100644 doc/design/assistant/blog/day_246__bug_treadmill.mdwn create mode 100644 doc/design/assistant/blog/day_246__bug_treadmill/comment_1_f76f653364fe2b97e85e8356c93b0fce._comment create mode 100644 doc/design/assistant/blog/day_247__performance_tuning.mdwn create mode 100644 doc/design/assistant/blog/day_248__Internet_Archive.mdwn create mode 100644 doc/design/assistant/blog/day_249__quiet_day.mdwn create mode 100644 doc/design/assistant/blog/day_24__airport_digressions.mdwn create mode 100644 doc/design/assistant/blog/day_250__stymied.mdwn create mode 100644 doc/design/assistant/blog/day_250__stymied/comment_1_330a10d447ccc3db03fcbfe571dbb404._comment create mode 100644 doc/design/assistant/blog/day_251__xmpp_improvements.mdwn create mode 100644 doc/design/assistant/blog/day_252__release_day.mdwn create mode 100644 doc/design/assistant/blog/day_253__OMG.mdwn create mode 100644 doc/design/assistant/blog/day_253__OMG/comment_1_bbdc61092771163e65a90a4755a807d8._comment create mode 100644 doc/design/assistant/blog/day_254__Android_app_polishing.mdwn create mode 100644 doc/design/assistant/blog/day_254__Android_app_polishing/comment_1_37f4ff5227566ce4b3fa69fc32568841._comment create mode 100644 doc/design/assistant/blog/day_254__Android_app_polishing/comment_2_58bbb105bdbb72bba85c3622195f43b9._comment create mode 100644 doc/design/assistant/blog/day_255__Debian_release_day.mdwn create mode 100644 doc/design/assistant/blog/day_256__8bit.mdwn create mode 100644 doc/design/assistant/blog/day_256__8bit/comment_1_f9b50263e3997d4c5b9836a2e0a346d7._comment create mode 100644 doc/design/assistant/blog/day_257__rainy_day.mdwn create mode 100644 doc/design/assistant/blog/day_258__beginning_of_the_end.mdwn create mode 100644 doc/design/assistant/blog/day_259__Android_dominos_toppling.mdwn create mode 100644 doc/design/assistant/blog/day_259__Android_dominos_toppling/comment_1_0b4a6e4893b0157e4768b46468dbbb87._comment create mode 100644 doc/design/assistant/blog/day_259__Android_dominos_toppling/comment_2_1ebc5aff5d217e1392cb7c8bb6c5156b._comment create mode 100644 doc/design/assistant/blog/day_259__Android_dominos_toppling/comment_3_eed7792f6142f3fc74d3c384bb16559b._comment create mode 100644 doc/design/assistant/blog/day_25__transfer_queueing.mdwn create mode 100644 doc/design/assistant/blog/day_25__transfer_queueing/comment_1_59fd4f1ffe96c412f613dc86276e7dbd._comment create mode 100644 doc/design/assistant/blog/day_25__transfer_queueing/comment_2_93bf768a67117e873af5732ecf08dc78._comment create mode 100644 doc/design/assistant/blog/day_260__Windows_dev_environment.mdwn create mode 100644 doc/design/assistant/blog/day_261__Windows_first_stage_complete.mdwn create mode 100644 doc/design/assistant/blog/day_262__DOS_path_separators.mdwn create mode 100644 doc/design/assistant/blog/day_262__DOS_path_separators/comment_1_45ecae90b22e31202c21083980d6b567._comment create mode 100644 doc/design/assistant/blog/day_263_catching_up.mdwn create mode 100644 doc/design/assistant/blog/day_263_catching_up/comment_1_9023da0573dfc81644d68128adb331a7._comment create mode 100644 doc/design/assistant/blog/day_264__Windows_second_stage_complete.mdwn create mode 100644 doc/design/assistant/blog/day_264__Windows_second_stage_complete/comment_1_42a7502d6ece75520eb59a76fdb1e2f0._comment create mode 100644 doc/design/assistant/blog/day_264__Windows_second_stage_complete/comment_2_f2b11322ac87e2a36cddc035b2c3c1ea._comment create mode 100644 doc/design/assistant/blog/day_264__Windows_second_stage_complete/comment_3_ea6ee05acb946fc7e8d95e62647cfa2a._comment create mode 100644 doc/design/assistant/blog/day_264__Windows_second_stage_complete/comment_4_9ce106baf28b7f75f7f6febd7bfcea70._comment create mode 100644 doc/design/assistant/blog/day_265__correctness.mdwn create mode 100644 doc/design/assistant/blog/day_265__correctness/comment_1_e8959a6df87eb92310947e66c7471e97._comment create mode 100644 doc/design/assistant/blog/day_265__correctness/comment_2_0cb953fcc085eedb34e65c227309ede7._comment create mode 100644 doc/design/assistant/blog/day_265__correctness/comment_3_df57628a8969af2995732e7ea2a0fae3._comment create mode 100644 doc/design/assistant/blog/day_266__release_day.mdwn create mode 100644 doc/design/assistant/blog/day_266__release_day/comment_1_92c8d1d9216b46b07dfe69bbc77a923e._comment create mode 100644 doc/design/assistant/blog/day_267__windows_autobuilder.mdwn create mode 100644 doc/design/assistant/blog/day_267__windows_autobuilder/comment_1_978b584d86395f2f621b0e1f7c5e70d7._comment create mode 100644 doc/design/assistant/blog/day_267__windows_autobuilder/comment_2_8f978d2811c8fbf11e3d12f245bdb52b._comment create mode 100644 doc/design/assistant/blog/day_268__core_monad_change.mdwn create mode 100644 doc/design/assistant/blog/day_269__bugfixes.mdwn create mode 100644 doc/design/assistant/blog/day_26__dying_drives.mdwn create mode 100644 doc/design/assistant/blog/day_270__release_and_xmpp.mdwn create mode 100644 doc/design/assistant/blog/day_271__more_xmpp.mdwn create mode 100644 doc/design/assistant/blog/day_272__fuzz_tester.mdwn create mode 100644 doc/design/assistant/blog/day_273-274__fun.mdwn create mode 100644 doc/design/assistant/blog/day_275__working_hard_or.mdwn create mode 100644 doc/design/assistant/blog/day_276__fuzzing_continues.mdwn create mode 100644 doc/design/assistant/blog/day_276__fuzzing_continues/comment_1_f5dd0658511a1063c2eb025b0fe98426._comment create mode 100644 doc/design/assistant/blog/day_276__fuzzing_continues/comment_2_a56c4c26a9e7bb8cfe3f598dbeed0813._comment create mode 100644 doc/design/assistant/blog/day_277__private_static_protected_void.mdwn create mode 100644 doc/design/assistant/blog/day_278__winding_down.mdwn create mode 100644 doc/design/assistant/blog/day_279__final_release_prep.mdwn create mode 100644 doc/design/assistant/blog/day_27__robust_transfers.mdwn create mode 100644 doc/design/assistant/blog/day_28-35__threaded_runtime_tarpit.mdwn create mode 100644 doc/design/assistant/blog/day_280__yesod.mdwn create mode 100644 doc/design/assistant/blog/day_280__yesod/comment_1_a42213a8cef71f2b54db18606028136d._comment create mode 100644 doc/design/assistant/blog/day_281__back.mdwn create mode 100644 doc/design/assistant/blog/day_281__back/comment_1_128809c5a2a9f5cc345a10fdbf55be01._comment create mode 100644 doc/design/assistant/blog/day_281__back/comment_2_6d0bbdf6ebaff9da399804570f0e606d._comment create mode 100644 doc/design/assistant/blog/day_282-283__caught_up.mdwn create mode 100644 doc/design/assistant/blog/day_284__porting.mdwn create mode 100644 doc/design/assistant/blog/day_285__fixed_the_archive_directory_loop.mdwn create mode 100644 doc/design/assistant/blog/day_285__fixed_the_archive_directory_loop/comment_1_1065e756dc6d66aefd214eb8ac5ebe1d._comment create mode 100644 doc/design/assistant/blog/day_286__Windows_test_suite.mdwn create mode 100644 doc/design/assistant/blog/day_287__niceness.mdwn create mode 100644 doc/design/assistant/blog/day_288__success_stories.mdwn create mode 100644 doc/design/assistant/blog/day_288__success_stories/comment_10_9ddf57b8ae0241268bb33bec1b169e4c._comment create mode 100644 doc/design/assistant/blog/day_288__success_stories/comment_11_50b8a597bd8677608f2ef176443f23f3._comment create mode 100644 doc/design/assistant/blog/day_288__success_stories/comment_12_f2df427cf3608377e9a52d8bdeadb26f._comment create mode 100644 doc/design/assistant/blog/day_288__success_stories/comment_13_8762efed97f21eeba8f0a7be45bd924a._comment create mode 100644 doc/design/assistant/blog/day_288__success_stories/comment_14_55e1bb15c3a93d582d110f8173ceefc2._comment create mode 100644 doc/design/assistant/blog/day_288__success_stories/comment_15_5749aef8b585b293385b20b75c40f9d8._comment create mode 100644 doc/design/assistant/blog/day_288__success_stories/comment_16_911c6d2764906cad7d6324835441ed34._comment create mode 100644 doc/design/assistant/blog/day_288__success_stories/comment_17_eb6aa8af5aa70877255a11d132d51aba._comment create mode 100644 doc/design/assistant/blog/day_288__success_stories/comment_18_9a57de4cea407a73b2d023d85afdccc6._comment create mode 100644 doc/design/assistant/blog/day_288__success_stories/comment_19_1767c86067bee35941004282b96b8e95._comment create mode 100644 doc/design/assistant/blog/day_288__success_stories/comment_1_22b28ca3d4d3283ad8c21ae052fb9752._comment create mode 100644 doc/design/assistant/blog/day_288__success_stories/comment_20_1d47f3e1b9f0081649cedae4288bac83._comment create mode 100644 doc/design/assistant/blog/day_288__success_stories/comment_21_31d3f58cad83cb1ecc4821a15ca258d8._comment create mode 100644 doc/design/assistant/blog/day_288__success_stories/comment_22_b512bd2bf29dfaab6b36bf204518fdb6._comment create mode 100644 doc/design/assistant/blog/day_288__success_stories/comment_2_343333356de20e170edb8020faa7400d._comment create mode 100644 doc/design/assistant/blog/day_288__success_stories/comment_3_4e4034bec789543b562ac263df3e21dd._comment create mode 100644 doc/design/assistant/blog/day_288__success_stories/comment_4_0c52794c77a9b7afc5112f5edf9cb793._comment create mode 100644 doc/design/assistant/blog/day_288__success_stories/comment_5_7ca419aa3a187857b19268572d5df297._comment create mode 100644 doc/design/assistant/blog/day_288__success_stories/comment_6_3edd56b3b04f19faba8d75cca285a662._comment create mode 100644 doc/design/assistant/blog/day_288__success_stories/comment_7_146331ae2de25a6dc3595dffab9514de._comment create mode 100644 doc/design/assistant/blog/day_288__success_stories/comment_8_72be9307e75eb120451f3d6ab7c8165e._comment create mode 100644 doc/design/assistant/blog/day_288__success_stories/comment_9_c27eb0a4181e85a3eed41130402350bf._comment create mode 100644 doc/design/assistant/blog/day_289__back_in_the_swing.mdwn create mode 100644 doc/design/assistant/blog/day_290__https_release.mdwn create mode 100644 doc/design/assistant/blog/day_291__--all.mdwn create mode 100644 doc/design/assistant/blog/day_291__--all/comment_1_eaa9fef19a035bef9c439e87d47c834b._comment create mode 100644 doc/design/assistant/blog/day_291__--all/comment_2_90bbc26bf92048de7cbaf5fb719c9593._comment create mode 100644 doc/design/assistant/blog/day_291__--all/comment_3_75006e9909425dcbf86415a9f7c90372._comment create mode 100644 doc/design/assistant/blog/day_291__--all/comment_4_5440449bbc5a353f7430f72e19c35e92._comment create mode 100644 doc/design/assistant/blog/day_292__bugfixes.mdwn create mode 100644 doc/design/assistant/blog/day_292__bugfixes/comment_1_bbac3878d80f7540d229183c56664784._comment create mode 100644 doc/design/assistant/blog/day_292__bugfixes/comment_2_8c9e5291ceb257f3a938af0ad967c5d7._comment create mode 100644 doc/design/assistant/blog/day_292__bugfixes/comment_3_02f875e8edd30f47939249f16d92712b._comment create mode 100644 doc/design/assistant/blog/day_293__gpg_builds.mdwn create mode 100644 doc/design/assistant/blog/day_293__gpg_builds/comment_1_4f152de8ea5aca4ec381d439e2a821f7._comment create mode 100644 doc/design/assistant/blog/day_293__gpg_builds/comment_2_42f625638638bc875379f6c604d6f673._comment create mode 100644 doc/design/assistant/blog/day_294__release_day.mdwn create mode 100644 doc/design/assistant/blog/day_295__balls_in_the_air.mdwn create mode 100644 doc/design/assistant/blog/day_296__new_crowdfunding_campaign.mdwn create mode 100644 doc/design/assistant/blog/day_296__new_crowdfunding_campaign/comment_1_cccad1a5103c504d21d0f8e69bb39e1b._comment create mode 100644 doc/design/assistant/blog/day_296__new_crowdfunding_campaign/comment_2_4fef7bd9c8e15cd57df365fadb95717f._comment create mode 100644 doc/design/assistant/blog/day_296__new_crowdfunding_campaign/comment_3_0b9258a1f5079e53c60138f06d0c63b1._comment create mode 100644 doc/design/assistant/blog/day_296__new_crowdfunding_campaign/comment_4_46183b97ca904bc06e46569c30db2edc._comment create mode 100644 doc/design/assistant/blog/day_297__back_to_work.mdwn create mode 100644 doc/design/assistant/blog/day_297__back_to_work/comment_1_e300feb821bfe7b76b2cec4376d16ffa._comment create mode 100644 doc/design/assistant/blog/day_298__exceptional.mdwn create mode 100644 doc/design/assistant/blog/day_299__bugfixing.mdwn create mode 100644 doc/design/assistant/blog/day_2__races.mdwn create mode 100644 doc/design/assistant/blog/day_300__new_logo.mdwn create mode 100644 doc/design/assistant/blog/day_300__new_logo/comment_1_9fc64e33863b9fce00f6a03417a91e36._comment create mode 100644 doc/design/assistant/blog/day_300__new_logo/comment_2_e8aac0298f90004e81492d2c7f85eda0._comment create mode 100644 doc/design/assistant/blog/day_300__new_logo/comment_3_6308c767f6e4bf090102191c91520d04._comment create mode 100644 doc/design/assistant/blog/day_301__direct_unannex.mdwn create mode 100644 doc/design/assistant/blog/day_302_release_day.mdwn create mode 100644 doc/design/assistant/blog/day_302_release_day/comment_1_fe6e572ba706e95188463d9f3e004d03._comment create mode 100644 doc/design/assistant/blog/day_303__oops.mdwn create mode 100644 doc/design/assistant/blog/day_304__dropunused_safety.mdwn create mode 100644 doc/design/assistant/blog/day_304__dropunused_safety/comment_1_1bbcf6c74b6437c44ff8604401fb1432._comment create mode 100644 doc/design/assistant/blog/day_305__interesting_bugs.mdwn create mode 100644 doc/design/assistant/blog/day_306__offtopic.mdwn create mode 100644 doc/design/assistant/blog/day_307__buuuugs.mdwn create mode 100644 doc/design/assistant/blog/day_308__ssh-agent.mdwn create mode 100644 doc/design/assistant/blog/day_308__ssh-agent/comment_1_5f0fc810cf1e1cd9b3ddba3cd19bb19d._comment create mode 100644 doc/design/assistant/blog/day_309__filenames.mdwn create mode 100644 doc/design/assistant/blog/day_310__release_day.mdwn create mode 100644 doc/design/assistant/blog/day_310__release_day/comment_1_1e008583cebd8e373e83729529914db7._comment create mode 100644 doc/design/assistant/blog/day_311__Windows_porting.mdwn create mode 100644 doc/design/assistant/blog/day_311__Windows_porting/comment_1_8e738f54a72557bee1e19970472b925c._comment create mode 100644 doc/design/assistant/blog/day_312__DebConf_midpoint.mdwn create mode 100644 doc/design/assistant/blog/day_313__back.mdwn create mode 100644 doc/design/assistant/blog/day_313__back/comment_1_fbf3fdf9688c18156753d446facd942d._comment create mode 100644 doc/design/assistant/blog/day_314__quvi.mdwn create mode 100644 doc/design/assistant/blog/day_314__quvi/comment_1_3fdfb0742cb5422530ddd97b904f2a42._comment create mode 100644 doc/design/assistant/blog/day_315__backlog.mdwn create mode 100644 doc/design/assistant/blog/day_316__day_off.mdwn create mode 100644 doc/design/assistant/blog/day_317__misc.mdwn create mode 100644 doc/design/assistant/blog/day_36__minimal_test_case.mdwn create mode 100644 doc/design/assistant/blog/day_37__back.mdwn create mode 100644 doc/design/assistant/blog/day_39__twice_is_enemy_action.mdwn create mode 100644 doc/design/assistant/blog/day_3__more_races.mdwn create mode 100644 doc/design/assistant/blog/day_3__more_races/comment_1_d6015338f602b574a3805de5481fc45e._comment create mode 100644 doc/design/assistant/blog/day_3__more_races/comment_2_4d6b23fc6442e0ee0303523cb69d0fba._comment create mode 100644 doc/design/assistant/blog/day_3__more_races/comment_3_03f5b2344c2a47dea60086f217d60f9b._comment create mode 100644 doc/design/assistant/blog/day_3__more_races/comment_4_860e90e989ec022100001c65e353a91e._comment create mode 100644 doc/design/assistant/blog/day_40__dbus.mdwn create mode 100644 doc/design/assistant/blog/day_40__dbus/comment_1_43ed2a79629868b018ec9f54a32bcacc._comment create mode 100644 doc/design/assistant/blog/day_40__dbus/comment_2_6799f2baf6a6ce14b1fa76a8402840c0._comment create mode 100644 doc/design/assistant/blog/day_40__dbus/comment_3_fa1d7444bdafcb990cacf2ace7ee6ef1._comment create mode 100644 doc/design/assistant/blog/day_40__dbus/comment_4_3399ddad951c1a950281bb6941fc3f6f._comment create mode 100644 doc/design/assistant/blog/day_40__dbus/comment_5_40b6b9d741d3081203f0cc94eb8dc3ea._comment create mode 100644 doc/design/assistant/blog/day_41__foo.mdwn create mode 100644 doc/design/assistant/blog/day_41__foo/comment_1_ace21fa257a4c2fd412b6ff2944a23e8._comment create mode 100644 doc/design/assistant/blog/day_42__the_answer.mdwn create mode 100644 doc/design/assistant/blog/day_43__simple_scanner.mdwn create mode 100644 doc/design/assistant/blog/day_44__webapp_basics.mdwn create mode 100644 doc/design/assistant/blog/day_44__webapp_basics/comment_1_d5fb67f373038e9f583cb2e1992bef67._comment create mode 100644 doc/design/assistant/blog/day_45__long_polling.mdwn create mode 100644 doc/design/assistant/blog/day_45__long_polling/comment_1_994bec0978324e268666073e8ff4f6ae._comment create mode 100644 doc/design/assistant/blog/day_45__long_polling/comment_2_dfa164c86290899139491acccddd8b2b._comment create mode 100644 doc/design/assistant/blog/day_45__long_polling/comment_3_5526c9dd4fd87da56cb8456083169f55._comment create mode 100644 doc/design/assistant/blog/day_45__long_polling/comment_4_91630f5bf162dfd4fbb3920f1318535b._comment create mode 100644 doc/design/assistant/blog/day_45__long_polling/comment_5_b3e41ba77f21e93a4e086483793bf5ce._comment create mode 100644 doc/design/assistant/blog/day_45__long_polling/full.png create mode 100644 doc/design/assistant/blog/day_45__long_polling/phone.png create mode 100644 doc/design/assistant/blog/day_46__notification_pools.mdwn create mode 100644 doc/design/assistant/blog/day_47__alert_messages.mdwn create mode 100644 doc/design/assistant/blog/day_48__intro.mdwn create mode 100644 doc/design/assistant/blog/day_49__first_run_experience.mdwn create mode 100644 doc/design/assistant/blog/day_49__first_run_experience/comment_1_e146cf06c8dd6303dd6a991f152a73fe._comment create mode 100644 doc/design/assistant/blog/day_49__first_run_experience/comment_2_5d6adcf6782c02283bef6189582ee467._comment create mode 100644 doc/design/assistant/blog/day_49__first_run_experience/comment_3_7ac2e34c2a7bc9b57488ca0c91307d32._comment create mode 100644 doc/design/assistant/blog/day_49__first_run_experience/comment_4_549b07bb02c07a5b1b95445b01758db2._comment create mode 100644 doc/design/assistant/blog/day_4__speed.mdwn create mode 100644 doc/design/assistant/blog/day_4__speed/comment_1_bf3c9c33cc0dea5eaeb6f2af110b924b._comment create mode 100644 doc/design/assistant/blog/day_4__speed/comment_2_33aba4c9abaa3e6a05a2c87ab7df9d0e._comment create mode 100644 doc/design/assistant/blog/day_50__directory_name.mdwn create mode 100644 doc/design/assistant/blog/day_50__directory_name/comment_1_782cec95a8558a05b2b38a2d2302214d._comment create mode 100644 doc/design/assistant/blog/day_50__directory_name/comment_2_2b8ceb0a26f25e8ed2711bcbe7225a58._comment create mode 100644 doc/design/assistant/blog/day_51__desktop.mdwn create mode 100644 doc/design/assistant/blog/day_52__file_browser.mdwn create mode 100644 doc/design/assistant/blog/day_52__file_browser/comment_1_cd000c2d56b60cc1f17b221322a32aa7._comment create mode 100644 doc/design/assistant/blog/day_52__file_browser/comment_2_21d1da67cf9105a545583ba2302c10fb._comment create mode 100644 doc/design/assistant/blog/day_54__adding_removable_drives.mdwn create mode 100644 doc/design/assistant/blog/day_54__adding_removable_drives/comment_1_5de4f220a3534f55b1f2208d1d812d63._comment create mode 100644 doc/design/assistant/blog/day_54__adding_removable_drives/comment_2_8dae1ed0a70acf9628b88692dc32ac5f._comment create mode 100644 doc/design/assistant/blog/day_55__alerts.mdwn create mode 100644 doc/design/assistant/blog/day_55__alerts/comment_1_6319045500a8a5e049304fdec5ff4cf4._comment create mode 100644 doc/design/assistant/blog/day_56__transfer_control.mdwn create mode 100644 doc/design/assistant/blog/day_57__afk.mdwn create mode 100644 doc/design/assistant/blog/day_57__afk/comment_1_70e1c9f925f040c1700d3e26bab373d5._comment create mode 100644 doc/design/assistant/blog/day_57__afk/comment_2_c70d3faccfcebf47deb25e270498cb56._comment create mode 100644 doc/design/assistant/blog/day_57__afk/comment_3_89020ebc6d31485339bdea41a872df3c._comment create mode 100644 doc/design/assistant/blog/day_57__afk/comment_4_8b1f65f141ffd9813e7f5a3380f7f520._comment create mode 100644 doc/design/assistant/blog/day_58__more_transfer_control.mdwn create mode 100644 doc/design/assistant/blog/day_59__dinner.mdwn create mode 100644 doc/design/assistant/blog/day_59__dinner/comment_1_0c1e2d69496473e7e4a2956a2814f5dd._comment create mode 100644 doc/design/assistant/blog/day_5__committing.mdwn create mode 100644 doc/design/assistant/blog/day_60__taking_stock.mdwn create mode 100644 doc/design/assistant/blog/day_60__taking_stock/comment_1_6722f81ee084f1ea9e8fe47f34576397._comment create mode 100644 doc/design/assistant/blog/day_61__network_connection_detection.mdwn create mode 100644 doc/design/assistant/blog/day_61__network_connection_detection/comment_1_09b58f41a8d48f218619711ee19511ac._comment create mode 100644 doc/design/assistant/blog/day_62__smarter_syncing.mdwn create mode 100644 doc/design/assistant/blog/day_63__transfer_retries.mdwn create mode 100644 doc/design/assistant/blog/day_63__transfer_retries/comment_1_990d4eb6066c4e2b9ddb3cabef32e4b9._comment create mode 100644 doc/design/assistant/blog/day_64__syncing_robustly.mdwn create mode 100644 doc/design/assistant/blog/day_65__transfer_polish.mdwn create mode 100644 doc/design/assistant/blog/day_66__the_merge.mdwn create mode 100644 doc/design/assistant/blog/day_66__the_merge/comment_10_eeccf4e73cc321542a1fe4780805a81e._comment create mode 100644 doc/design/assistant/blog/day_66__the_merge/comment_1_a34e89316d1662826848f31061c4e46b._comment create mode 100644 doc/design/assistant/blog/day_66__the_merge/comment_2_09e244d23d05052fa2b11a7181888366._comment create mode 100644 doc/design/assistant/blog/day_66__the_merge/comment_3_3961a03e167903959b96b054835613f6._comment create mode 100644 doc/design/assistant/blog/day_66__the_merge/comment_4_12a57af9f580918818b4a9f68396d5c4._comment create mode 100644 doc/design/assistant/blog/day_66__the_merge/comment_5_8ce638960012367c888e018a5f05db19._comment create mode 100644 doc/design/assistant/blog/day_66__the_merge/comment_6_f461b856b940e6914bcd2b681cf9505f._comment create mode 100644 doc/design/assistant/blog/day_66__the_merge/comment_7_6e73aca1fc1747d0e742e054b88b5d78._comment create mode 100644 doc/design/assistant/blog/day_66__the_merge/comment_8_d85f1ce23ae16d5a8eb88d2c3999acb7._comment create mode 100644 doc/design/assistant/blog/day_66__the_merge/comment_9_c06dab4d78122c85beeaf300ffc3e376._comment create mode 100644 doc/design/assistant/blog/day_67__progress_bars.mdwn create mode 100644 doc/design/assistant/blog/day_68__transfers.mdwn create mode 100644 doc/design/assistant/blog/day_68__transfers/comment_1_5282960c0b553fbc0f411345b9745324._comment create mode 100644 doc/design/assistant/blog/day_69__build_fixes.mdwn create mode 100644 doc/design/assistant/blog/day_6__polish.mdwn create mode 100644 doc/design/assistant/blog/day_70__adding_ssh_remotes.mdwn create mode 100644 doc/design/assistant/blog/day_70__adding_ssh_remotes/comment_10_2fac85357ac8feccff82beabd3791439._comment create mode 100644 doc/design/assistant/blog/day_70__adding_ssh_remotes/comment_11_e9e496005fd1bf5a10c9e286b83e51fa._comment create mode 100644 doc/design/assistant/blog/day_70__adding_ssh_remotes/comment_1_913e6ae7c8f7db90b9767ec35fc84205._comment create mode 100644 doc/design/assistant/blog/day_70__adding_ssh_remotes/comment_2_634ca3c236e2062289e7df5f0d77a3c5._comment create mode 100644 doc/design/assistant/blog/day_70__adding_ssh_remotes/comment_3_e365bbcbb7f66ce2b35fcd5b969ab315._comment create mode 100644 doc/design/assistant/blog/day_70__adding_ssh_remotes/comment_4_b15499722a655489f9ea60ff9d4c47c6._comment create mode 100644 doc/design/assistant/blog/day_70__adding_ssh_remotes/comment_5_8ea48276f060e75d9f40617d2a1ccd08._comment create mode 100644 doc/design/assistant/blog/day_70__adding_ssh_remotes/comment_6_9b8bf7e9fa715977fbeb98087deefd1a._comment create mode 100644 doc/design/assistant/blog/day_70__adding_ssh_remotes/comment_7_42e09eacdc10c7cf579bfc6470b5117c._comment create mode 100644 doc/design/assistant/blog/day_70__adding_ssh_remotes/comment_8_6c02f31063b3d399d1b4f823bd6543ce._comment create mode 100644 doc/design/assistant/blog/day_70__adding_ssh_remotes/comment_9_dd0447cb3b39d3a8c1a7cc00f17d8bc2._comment create mode 100644 doc/design/assistant/blog/day_71__ssh_probing.mdwn create mode 100644 doc/design/assistant/blog/day_71__ssh_probing/comment_1_56a0c29f7454cfca5cc30b2849e6e942._comment create mode 100644 doc/design/assistant/blog/day_71__ssh_probing/comment_2_f3bd3e366c92c833c7e217da125481b8._comment create mode 100644 doc/design/assistant/blog/day_72__remote_ssh_server_configurator_finished.mdwn create mode 100644 doc/design/assistant/blog/day_73__rsync.net_configurator.mdwn create mode 100644 doc/design/assistant/blog/day_74__bits_and_peices.mdwn create mode 100644 doc/design/assistant/blog/day_75__zeromq_and_pairing.mdwn create mode 100644 doc/design/assistant/blog/day_76__pairing.mdwn create mode 100644 doc/design/assistant/blog/day_76__pairing/comment_1_09665f269343422cd18051fad1a8c19e._comment create mode 100644 doc/design/assistant/blog/day_76__pairing/comment_2_8e1b2233579bc26bfd758bbf6b3bdc07._comment create mode 100644 doc/design/assistant/blog/day_76__pairing/comment_3_a8b6a8432da20c468c633da8e7cbc2f3._comment create mode 100644 doc/design/assistant/blog/day_76__pairing/comment_4_36a428a2e1803f4391b821d1892f0cd7._comment create mode 100644 doc/design/assistant/blog/day_76__pairing/comment_5_11f332fe2050d8c1416e71f9e85ba280._comment create mode 100644 doc/design/assistant/blog/day_76__pairing/comment_6_973aeb656b78eca97474ea1a3f5b57b7._comment create mode 100644 doc/design/assistant/blog/day_76__pairing/comment_7_03d2b3343f34377a4d6171e06b7609f6._comment create mode 100644 doc/design/assistant/blog/day_77_alert_buttons.mdwn create mode 100644 doc/design/assistant/blog/day_78__pairing_continued.mdwn create mode 100644 doc/design/assistant/blog/day_79__pairing_finished.mdwn create mode 100644 doc/design/assistant/blog/day_7__bugfixes.mdwn create mode 100644 doc/design/assistant/blog/day_7__bugfixes/profile.png create mode 100644 doc/design/assistant/blog/day_7__bugfixes/profile2.png create mode 100644 doc/design/assistant/blog/day_80__default_backend.mdwn create mode 100644 doc/design/assistant/blog/day_81__enabling_pre-existing_special_remotes.mdwn create mode 100644 doc/design/assistant/blog/day_82__git-annex_branch_work.mdwn create mode 100644 doc/design/assistant/blog/day_83__3-way.mdwn create mode 100644 doc/design/assistant/blog/day_84__deferred_downloads.mdwn create mode 100644 doc/design/assistant/blog/day_85__more_foundation_work.mdwn create mode 100644 doc/design/assistant/blog/day_86__towards_the_beta.mdwn create mode 100644 doc/design/assistant/blog/day_87__more_progress_progress.mdwn create mode 100644 doc/design/assistant/blog/day_88__progressbars_still_progressing.mdwn create mode 100644 doc/design/assistant/blog/day_89__final_polish.mdwn create mode 100644 doc/design/assistant/blog/day_8__speed.mdwn create mode 100644 doc/design/assistant/blog/day_8__speed/comment_1_a3dba537b276d5737abc8cb93f1965f4._comment create mode 100644 doc/design/assistant/blog/day_90__beta.mdwn create mode 100644 doc/design/assistant/blog/day_90__beta/comment_1_5f2a3b18ad7558abe04f51534a29ff13._comment create mode 100644 doc/design/assistant/blog/day_90__beta/comment_2_961c4eba97f4eac75174244d6b2b00c0._comment create mode 100644 doc/design/assistant/blog/day_90__beta/comment_3_c76675a4633cbbe347ed42c222918d38._comment create mode 100644 doc/design/assistant/blog/day_90__beta/comment_4_f0b8f77cb691e747fe35bcf2f51b5baa._comment create mode 100644 doc/design/assistant/blog/day_90__beta/comment_5_99fbc9feac62e66a12b0d357cf86ccc1._comment create mode 100644 doc/design/assistant/blog/day_91__break.mdwn create mode 100644 doc/design/assistant/blog/day_92__S3.mdwn create mode 100644 doc/design/assistant/blog/day_92__S3/comment_1_eda656247d11cea7fbed2e33137a39e5._comment create mode 100644 doc/design/assistant/blog/day_92__S3/comment_2_8249d2d9521e44c674da3fda74be077a._comment create mode 100644 doc/design/assistant/blog/day_93__OSX_standalone_app.mdwn create mode 100644 doc/design/assistant/blog/day_93__easy_install.mdwn create mode 100644 doc/design/assistant/blog/day_93__easy_install/comment_1_d4f7de723c98577ef28d89ee6b87fd13._comment create mode 100644 doc/design/assistant/blog/day_93__easy_install/comment_2_6337b341c1cfb2132b59704394e57b36._comment create mode 100644 doc/design/assistant/blog/day_95__repository_groups.mdwn create mode 100644 doc/design/assistant/blog/day_96__revisiting_file_adds.mdwn create mode 100644 doc/design/assistant/blog/day_96__revisiting_file_adds/comment_1_da3ca47041168b6c82aeb2c18acc5017._comment create mode 100644 doc/design/assistant/blog/day_97__stuffing.mdwn create mode 100644 doc/design/assistant/blog/day_98__preferred_content.mdwn create mode 100644 doc/design/assistant/blog/day_98__preferred_content/comment_1_2136618e3515d0ac6369a41f1934ec2a._comment create mode 100644 doc/design/assistant/blog/day_98__preferred_content/comment_2_5f6db00e69628bf2f72b0e6f2981a49b._comment create mode 100644 doc/design/assistant/blog/day_99_shotgun.mdwn create mode 100644 doc/design/assistant/blog/day_99_shotgun/comment_1_12bb8f54bb13ea20ac4187a2301d77ca._comment create mode 100644 doc/design/assistant/blog/day_9__correctness.mdwn create mode 100644 doc/design/assistant/blog/day_9__correctness/comment_1_564a39cb976767e2c0a9c74fabe10be4._comment create mode 100644 doc/design/assistant/blog/day_9__correctness/comment_2_77924e9d50b40f05e792e427a25849a6._comment create mode 100644 doc/design/assistant/blog/day_9__correctness/comment_3_92bd86cd06d579e23800af2e5c66a291._comment create mode 100644 doc/design/assistant/blog/day_9__correctness/comment_4_0d12b51ccdfc2a94d3e59a5628521e0a._comment create mode 100644 doc/design/assistant/blog/day_9__correctness/comment_5_208f9dd3e1d92555b05c29159538a901._comment create mode 100644 doc/design/assistant/blog/day_9__correctness/comment_6_90cc6b60718896fb175919417600fdf9._comment create mode 100644 doc/design/assistant/chunks.mdwn create mode 100644 doc/design/assistant/cloud.mdwn create mode 100644 doc/design/assistant/cloud/comment_1_4997778abc171999499487b71b31c9ba._comment create mode 100644 doc/design/assistant/cloud/comment_2_08da8bc74a4845e354dca99184cffd70._comment create mode 100644 doc/design/assistant/cloud/comment_3_faafd1266301997b1822d215ec8e8d8c._comment create mode 100644 doc/design/assistant/cloud/comment_4_3eb557d5439831f6e0032944d12c02cf._comment create mode 100644 doc/design/assistant/comment_10_f2233fad55c20686cf299bf6788f1f23._comment create mode 100644 doc/design/assistant/comment_11_a38f0f21c2346e65b786d791b6829f9b._comment create mode 100644 doc/design/assistant/comment_12_5e991177d6577384f39a36ae02f5f574._comment create mode 100644 doc/design/assistant/comment_13_f8625c6f43b58847840df338a73b7972._comment create mode 100644 doc/design/assistant/comment_14_c37ef5931b0f5c1f808083e0d636a208._comment create mode 100644 doc/design/assistant/comment_15_68c98a27083567f20c2e6bc2a760991b._comment create mode 100644 doc/design/assistant/comment_16_8e6788c817c60371d2a2f158e1a65f87._comment create mode 100644 doc/design/assistant/comment_17_97bdfacac5ac492281c9454ee4c0228e._comment create mode 100644 doc/design/assistant/comment_18_53137b2df4913496c0afb2d895aa4ee2._comment create mode 100644 doc/design/assistant/comment_19_ff1b0ba57e22ed757ec3fc5400b5e43e._comment create mode 100644 doc/design/assistant/comment_1_a48fcfbf97f0a373ea375cd8f07f0fc8._comment create mode 100644 doc/design/assistant/comment_20_099da245e3276fa84f5e14312d186621._comment create mode 100644 doc/design/assistant/comment_2_6d3552414fdcc2ed3244567e6c67989d._comment create mode 100644 doc/design/assistant/comment_3_05223be50c889b2ed6bc4abf74116450._comment create mode 100644 doc/design/assistant/comment_4_fbbd93b55803ae21e6ba4b6568c2fafd._comment create mode 100644 doc/design/assistant/comment_5_f4e9af3fed6c27e8ff39badb9794064d._comment create mode 100644 doc/design/assistant/comment_6_c7ad07cade1f44f9a8b61f92225bb9c5._comment create mode 100644 doc/design/assistant/comment_7_609d38e993267195a80fecd84c93d1e2._comment create mode 100644 doc/design/assistant/comment_8_22b818e1a2a825efb78139271a14f944._comment create mode 100644 doc/design/assistant/comment_9_d052e2142da8b4838fb1edf791ea23ae._comment create mode 100644 doc/design/assistant/configurators.mdwn create mode 100644 doc/design/assistant/deltas.mdwn create mode 100644 doc/design/assistant/deltas/comment_1_bdb477af913c9782c0e8509e6b294b6e._comment create mode 100644 doc/design/assistant/deltas/comment_2_71889d15ba20ebb0fe13080c68162a5b._comment create mode 100644 doc/design/assistant/desymlink.mdwn create mode 100644 doc/design/assistant/desymlink/comment_1_f1bfe250b7f872359f7075998b6e42e3._comment create mode 100644 doc/design/assistant/desymlink/comment_2_5e876edfe9853645f761b5ed9b5021aa._comment create mode 100644 doc/design/assistant/desymlink/comment_3_538561d74371e53c2f8df7f5ebdf58a8._comment create mode 100644 doc/design/assistant/desymlink/comment_4_586ecaa800e6c162377c937da5e65440._comment create mode 100644 doc/design/assistant/desymlink/comment_5_8fc703de67814cf2aec2a908852298a4._comment create mode 100644 doc/design/assistant/desymlink/comment_6_1b473ad89494afb82250af4b6df5f5c9._comment create mode 100644 doc/design/assistant/disaster_recovery.mdwn create mode 100644 doc/design/assistant/disaster_recovery/comment_1_955dc807196863da23aa8dbd15e04364._comment create mode 100644 doc/design/assistant/encrypted_git_remotes.mdwn create mode 100644 doc/design/assistant/gpgkeys.mdwn create mode 100644 doc/design/assistant/gpgkeys/comment_1_a14427f88c9fd8e25ad8708146bb4bff._comment create mode 100644 doc/design/assistant/inotify.mdwn create mode 100644 doc/design/assistant/inotify/comment_1_3d3ff74447452d65c10ccc3dbfc323cd._comment create mode 100644 doc/design/assistant/inotify/comment_2_a3c0fa6d97397c508b4b8aafdcee8f6f._comment create mode 100644 doc/design/assistant/inotify/comment_3_b346e870c1cd80e4b0a313c3a9fed6b3._comment create mode 100644 doc/design/assistant/inotify/comment_4_32be58b4c3b17a4ea539690d2fb45159._comment create mode 100644 doc/design/assistant/inotify/comment_5_0cdd3046d90ad2012025d846ece0731e._comment create mode 100644 doc/design/assistant/inotify/comment_6_e197d5d0d853572ec1f2e5985762e60d._comment create mode 100644 doc/design/assistant/leftovers.mdwn create mode 100644 doc/design/assistant/leftovers/comment_1_b20c88bb3c583a32023c1f6b6dc9486d._comment create mode 100644 doc/design/assistant/more_cloud_providers.mdwn create mode 100644 doc/design/assistant/pairing.mdwn create mode 100644 doc/design/assistant/partial_content.mdwn create mode 100644 doc/design/assistant/partial_content/comment_1_58c4faa321a5bb71adf9fdee079849f4._comment create mode 100644 doc/design/assistant/polls.mdwn create mode 100644 doc/design/assistant/polls/2013_user_survey.mdwn create mode 100644 doc/design/assistant/polls/Android.mdwn create mode 100644 doc/design/assistant/polls/Android/comment_1_fa6c409833f28c67da105d25f4a440e0._comment create mode 100644 doc/design/assistant/polls/Android_default_directory.mdwn create mode 100644 doc/design/assistant/polls/Android_default_directory/comment_1_d39655091ac3ed51a9d4325d86b23ad7._comment create mode 100644 doc/design/assistant/polls/Android_default_directory/comment_2_2f1eaae95075db26488517720afd1c63._comment create mode 100644 doc/design/assistant/polls/Android_default_directory/comment_3_b484012f60789be73d7d5b338cff6203._comment create mode 100644 doc/design/assistant/polls/goals_for_April.mdwn create mode 100644 doc/design/assistant/polls/goals_for_April/comment_1_9f81fa96db5970a4be0828c74a6d2d55._comment create mode 100644 doc/design/assistant/polls/goals_for_April/comment_2_d8956d220ccacff3d2f6cbeb15718459._comment create mode 100644 doc/design/assistant/polls/goals_for_April/comment_3_aadad6dfd56d068d2e377606910c006f._comment create mode 100644 doc/design/assistant/polls/prioritizing_special_remotes.mdwn create mode 100644 doc/design/assistant/polls/prioritizing_special_remotes/comment_1_dd9280df27848a7ff132f5809dab0a79._comment create mode 100644 doc/design/assistant/polls/prioritizing_special_remotes/comment_2_370e0b9c43486ee96c825f9155eebde4._comment create mode 100644 doc/design/assistant/polls/prioritizing_special_remotes/comment_3_883a003b9c552b89f191135c582f99aa._comment create mode 100644 doc/design/assistant/polls/prioritizing_special_remotes/comment_4_746006c3fffc7f917c4526fd688051f7._comment create mode 100644 doc/design/assistant/polls/what_is_preventing_me_from_using_git-annex_assistant.mdwn create mode 100644 doc/design/assistant/polls/what_is_preventing_me_from_using_git-annex_assistant/comment_10_10a4839a05be39ced54ffbe880a588bb._comment create mode 100644 doc/design/assistant/polls/what_is_preventing_me_from_using_git-annex_assistant/comment_11_ac91d866f11c66dd8c86e2cd1a368c85._comment create mode 100644 doc/design/assistant/polls/what_is_preventing_me_from_using_git-annex_assistant/comment_12_e244c1bf334b1cc9ad0cc760bf8fe5de._comment create mode 100644 doc/design/assistant/polls/what_is_preventing_me_from_using_git-annex_assistant/comment_13_1a0faf4bdc78741937e8a2f5cb5bbec6._comment create mode 100644 doc/design/assistant/polls/what_is_preventing_me_from_using_git-annex_assistant/comment_14_8d8a11dbfae7a7bc574bdf37f87e0684._comment create mode 100644 doc/design/assistant/polls/what_is_preventing_me_from_using_git-annex_assistant/comment_15_c437adeaccf0b3d134e0f81c64e25b9f._comment create mode 100644 doc/design/assistant/polls/what_is_preventing_me_from_using_git-annex_assistant/comment_16_6e3fce3a32ab346dc3d0fd4b69967536._comment create mode 100644 doc/design/assistant/polls/what_is_preventing_me_from_using_git-annex_assistant/comment_17_1b7233d88593d0d99b26ea3e7af20d9c._comment create mode 100644 doc/design/assistant/polls/what_is_preventing_me_from_using_git-annex_assistant/comment_18_a23d5a0e2718b8e486f036fe8a413b36._comment create mode 100644 doc/design/assistant/polls/what_is_preventing_me_from_using_git-annex_assistant/comment_19_f4c84a9d701d52cf2f2e45f3d764a90c._comment create mode 100644 doc/design/assistant/polls/what_is_preventing_me_from_using_git-annex_assistant/comment_1_00a0de8190d946caaeeca3b44646146f._comment create mode 100644 doc/design/assistant/polls/what_is_preventing_me_from_using_git-annex_assistant/comment_20_199c9807499470771af6cbca6d034cfa._comment create mode 100644 doc/design/assistant/polls/what_is_preventing_me_from_using_git-annex_assistant/comment_21_9185b0e05b1b1997533694da1de83073._comment create mode 100644 doc/design/assistant/polls/what_is_preventing_me_from_using_git-annex_assistant/comment_2_35f6f121e54260cb960211a6e2e51e8e._comment create mode 100644 doc/design/assistant/polls/what_is_preventing_me_from_using_git-annex_assistant/comment_3_acbe4f63b5d552ac5ae5a12c6f42dc18._comment create mode 100644 doc/design/assistant/polls/what_is_preventing_me_from_using_git-annex_assistant/comment_4_0d988280865caae498a3b693b6342e37._comment create mode 100644 doc/design/assistant/polls/what_is_preventing_me_from_using_git-annex_assistant/comment_5_ac8fe3768c30dd7999c183500f8567bb._comment create mode 100644 doc/design/assistant/polls/what_is_preventing_me_from_using_git-annex_assistant/comment_6_36832de705a2bebf8dc6e65dcd661731._comment create mode 100644 doc/design/assistant/polls/what_is_preventing_me_from_using_git-annex_assistant/comment_7_3618067e473577a112e36970ca71e0ab._comment create mode 100644 doc/design/assistant/polls/what_is_preventing_me_from_using_git-annex_assistant/comment_8_07a13b6f000ddc0ac4472b863d8b50bd._comment create mode 100644 doc/design/assistant/polls/what_is_preventing_me_from_using_git-annex_assistant/comment_9_e15eb407d988fda363296c8b566cc8fb._comment create mode 100644 doc/design/assistant/progressbars.mdwn create mode 100644 doc/design/assistant/progressbars/comment_1_3ea263b1f334e8e38e14f00a96202988._comment create mode 100644 doc/design/assistant/rate_limiting.mdwn create mode 100644 doc/design/assistant/screenshot/firstrun.png create mode 100644 doc/design/assistant/screenshot/intro.png create mode 100644 doc/design/assistant/sshpassword.mdwn create mode 100644 doc/design/assistant/syncing.mdwn create mode 100644 doc/design/assistant/syncing/comment_1_c70156174ff19b503978d623bd2df36f._comment create mode 100644 doc/design/assistant/syncing/comment_2_eb992b5b2c7a5ce23443e2a6007e5ff9._comment create mode 100644 doc/design/assistant/syncing/comment_3_e1b5e8a24556de16d1cacd27ee0c1bd1._comment create mode 100644 doc/design/assistant/syncing/efficiency.mdwn create mode 100644 doc/design/assistant/telehash.mdwn create mode 100644 doc/design/assistant/thanks/comment_1_8b08b5c30e5aea3fc4599f856fd25df5._comment create mode 100644 doc/design/assistant/todo.mdwn create mode 100644 doc/design/assistant/transfer_control.mdwn create mode 100644 doc/design/assistant/transfer_control/comment_1_d5adaef4712913dc0263d4ebafb79320._comment create mode 100644 doc/design/assistant/transfer_control/comment_2_3b51474fefa6c0d19055046e06af196d._comment create mode 100644 doc/design/assistant/transfer_control/comment_3_44a1a6d2db9097de9ae68ea1ff1b08a2._comment create mode 100644 doc/design/assistant/upgrading.mdwn create mode 100644 doc/design/assistant/webapp.mdwn create mode 100644 doc/design/assistant/webapp/comment_1_bab6f6fa720273c0f9700a3765150189._comment create mode 100644 doc/design/assistant/webapp/comment_2_3cf0cf460c7869d0cc22940fcc84aec4._comment create mode 100644 doc/design/assistant/webapp/comment_3_428e153135f7a64215730719207d82c4._comment create mode 100644 doc/design/assistant/webapp/comment_4_f4068a7abbb77ba6a3297cbcf1e503e9._comment create mode 100644 doc/design/assistant/windows.mdwn create mode 100644 doc/design/assistant/windows/comment_1_f4b829318b182e1cec29f13babb6498e._comment create mode 100644 doc/design/assistant/xmpp.mdwn create mode 100644 doc/design/assistant/xmpp/comment_1_f20650f93d7f0ca39b9ba3ce0380193f._comment create mode 100644 doc/design/assistant/xmpp/comment_2_8c22839a8f5912b4a817415c4a359697._comment create mode 100644 doc/design/assistant/xmpp/comment_4_773102522f21844cffc841e6cde9229e._comment create mode 100644 doc/design/assistant/xmpp_security.mdwn create mode 100644 doc/design/assistant/xmpp_security/comment_1_c714e86553c02600249795efb224be8a._comment create mode 100644 doc/design/caching_database.mdwn create mode 100644 doc/design/encryption.mdwn create mode 100644 doc/design/encryption/comment_1_4715ffafb3c4a9915bc33f2b26aaa9c1._comment create mode 100644 doc/design/encryption/comment_2_a610b3d056a059899178859a3a821ea5._comment create mode 100644 doc/design/encryption/comment_3_cca186a9536cd3f6e86994631b14231c._comment create mode 100644 doc/design/encryption/comment_4_8f3ba3e504b058791fc6e6f9c38154cf._comment create mode 100644 doc/design/encryption/comment_5_520e60aa53217b5ba428d4c05d897dee._comment create mode 100644 doc/design/encryption/comment_6_d677fead0fe0c543f48f07d85f83f592._comment create mode 100644 doc/design/encryption/comment_7_c1c38a09b1276e29adc3ba564dc0fe4e._comment create mode 100644 doc/design/external_special_remote_protocol.mdwn create mode 100644 doc/design/external_special_remote_protocol/comment_11_8d3c35eb0a2a9c57b10566fcaf56d248._comment create mode 100644 doc/design/external_special_remote_protocol/comment_12_241e57092d9e5631ac0ec4dd962477a6._comment create mode 100644 doc/design/external_special_remote_protocol/comment_12_e3029c65d34f78272bc11961ebfd8237._comment create mode 100644 doc/design/external_special_remote_protocol/comment_13_472748f03ba8dad773da7f35b70cb6e4._comment create mode 100644 doc/design/external_special_remote_protocol/comment_14_71c3e21a72222250bab933e1c9167fbc._comment create mode 100644 doc/design/external_special_remote_protocol/comment_15_c77386deddc64b2028d9c3a7393d4df7._comment create mode 100644 doc/design/external_special_remote_protocol/comment_1_5baff75d278394a8818c348fb4f13b8a._comment create mode 100644 doc/design/external_special_remote_protocol/comment_2_70429b7c4f1e4083a9d5a6e2e238056d._comment create mode 100644 doc/design/external_special_remote_protocol/comment_3_c763e44d06d9f50f0d357889b180b819._comment create mode 100644 doc/design/external_special_remote_protocol/comment_4_20ff41d82b5f1872698a5b24adcd0c41._comment create mode 100644 doc/design/external_special_remote_protocol/comment_5_3ee158e548002badae5bf44dc0442626._comment create mode 100644 doc/design/external_special_remote_protocol/comment_6_ee2828ce25b83bbabc9d5dde35d1e57b._comment create mode 100644 doc/design/external_special_remote_protocol/comment_7_edb649d0019a061ef7bf6534a444429d._comment create mode 100644 doc/design/external_special_remote_protocol/comment_8_1f4c205a5ce6f33ccf2f4d80754e5699._comment create mode 100644 doc/design/external_special_remote_protocol/comment_9_15c4cfe064be37cc104dcb6aa049a449._comment create mode 100644 doc/design/gcrypt.mdwn create mode 100644 doc/design/metadata.mdwn create mode 100644 doc/design/metadata/comment_1_22ed80bd8eabaa836e9dfc2432531f04._comment create mode 100644 doc/design/metadata/comment_2_03ae28acedbe1fa45c366b30b58fcf48._comment create mode 100644 doc/design/metadata/comment_3_ee850df7d3fa4c56194f13a6e3890a30._comment create mode 100644 doc/design/metadata/comment_4_c32ade1524487e5fdc6f83b2db39f04c._comment create mode 100644 doc/design/metadata/comment_5_0ac3132cd7a84f0e170fbe3a6f235fe7._comment create mode 100644 doc/design/preferred_content.mdwn create mode 100644 doc/design/roadmap.mdwn create mode 100644 doc/devblog.mdwn create mode 100644 doc/devblog/day_-1__drop_dead.mdwn create mode 100644 doc/devblog/day_-3__.mdwn create mode 100644 doc/devblog/day_-4__forgetting.mdwn create mode 100644 doc/devblog/day_-4__forgetting/comment_1_f3cc7a25af4c59fda3924c737a789419._comment create mode 100644 doc/devblog/day_-4__forgetting/comment_2_e47476c80af02a2e9cf76c53fdbb8534._comment create mode 100644 doc/devblog/day_-4__forgetting/comment_3_b57956a8ce372d620f21ea9a497e8013._comment create mode 100644 doc/devblog/day_-4__forgetting/comment_4_812b630df01ac35254e3c4e677554e2b._comment create mode 100644 doc/devblog/day_-4__forgetting/comment_5_a9670eca2aff9ad5f04412a8d8b6df6a._comment create mode 100644 doc/devblog/day_-4__forgetting/comment_6_4f87e2ab119f3cd81266159f02952188._comment create mode 100644 doc/devblog/day_-4__forgetting/comment_7_a865216046aa91a47d0d2b2f0668ea89._comment create mode 100644 doc/devblog/day_-4__forgetting/comment_8_3f7045a00905b4287d950b08d5a77a82._comment create mode 100644 doc/devblog/day_100__git-annex_sync_--content.mdwn create mode 100644 doc/devblog/day_101__old_mistakes.mdwn create mode 100644 doc/devblog/day_101__old_mistakes/comment_1_2c6e991efde3296450189b2821f2ccc3._comment create mode 100644 doc/devblog/day_101__old_mistakes/comment_2_524690d69056737dd296e4f7626737d2._comment create mode 100644 doc/devblog/day_102__cleanups.mdwn create mode 100644 doc/devblog/day_103__unused.mdwn create mode 100644 doc/devblog/day_104__unused_II.mdwn create mode 100644 doc/devblog/day_104__unused_II/comment_1_a693a56123497a39c30cbd35b8e35bce._comment create mode 100644 doc/devblog/day_104__unused_II/comment_2_9833fb9daa50bc838cc46ca2f6c16580._comment create mode 100644 doc/devblog/day_104__unused_II/comment_3_873a882ec1ddc3be473473cb224a9040._comment create mode 100644 doc/devblog/day_104__unused_II/comment_4_5ef1bb4d69cf7206f7ca0e542abad6bd._comment create mode 100644 doc/devblog/day_104__unused_II/comment_5_1964bfce4887c9c0828fd7f54f5b4f6b._comment create mode 100644 doc/devblog/day_104__unused_II/comment_6_0ed4023c9c249024fe0454fc5bab3b14._comment create mode 100644 doc/devblog/day_105__locking.mdwn create mode 100644 doc/devblog/day_106__catching_up.mdwn create mode 100644 doc/devblog/day_107__TDD.mdwn create mode 100644 doc/devblog/day_108__new_use_for_location_tracking.mdwn create mode 100644 doc/devblog/day_109__elimintating_absNormPath.mdwn create mode 100644 doc/devblog/day_10__lazy_Sunday.mdwn create mode 100644 doc/devblog/day_110__release_prep.mdwn create mode 100644 doc/devblog/day_111__windows_beta_release.mdwn create mode 100644 doc/devblog/day_112__metadata_design.mdwn create mode 100644 doc/devblog/day_113__metadata_groundwork.mdwn create mode 100644 doc/devblog/day_114__windows_porting.mdwn create mode 100644 doc/devblog/day_115__windows_porting.mdwn create mode 100644 doc/devblog/day_116__views.mdwn create mode 100644 doc/devblog/day_117__views_implemented.mdwn create mode 100644 doc/devblog/day_118__views_refined.mdwn create mode 100644 doc/devblog/day_119__catching_up.mdwn create mode 100644 doc/devblog/day_119__catching_up/comment_1_8aa413e75cab411b0aec254f0f33ebb9._comment create mode 100644 doc/devblog/day_119__catching_up/comment_2_db31d08690730836ce6277e797fcae1d._comment create mode 100644 doc/devblog/day_119__catching_up/comment_3_d44da76b18f53a5f51b46e3e15090a48._comment create mode 100644 doc/devblog/day_11__webapp_encrypted_drives.mdwn create mode 100644 doc/devblog/day_120__more_metadata.mdwn create mode 100644 doc/devblog/day_121__special_remote_maintenance.mdwn create mode 100644 doc/devblog/day_122_more_windows_porting.mdwn create mode 100644 doc/devblog/day_123__stuck.mdwn create mode 100644 doc/devblog/day_124__day_off.mdwn create mode 100644 doc/devblog/day_125__metadata_and_views.mdwn create mode 100644 doc/devblog/day_128__release_prep.mdwn create mode 100644 doc/devblog/day_12__gpg_key_generation.mdwn create mode 100644 doc/devblog/day_12__gpg_key_generation/comment_1_48cdfe3bd71fb348ae05fd90e8cf1dab._comment create mode 100644 doc/devblog/day_130__post_release.mdwn create mode 100644 doc/devblog/day_131__more_bug_squashing.mdwn create mode 100644 doc/devblog/day_132__database_musings.mdwn create mode 100644 doc/devblog/day_133__db_and_bugfixes.mdwn create mode 100644 doc/devblog/day_134-135__avoiding_the_turing_tarpit.mdwn create mode 100644 doc/devblog/day_136__frustrating_day.mdwn create mode 100644 doc/devblog/day_137-138__bug_triage_and_too_much_windows.mdwn create mode 100644 doc/devblog/day_139-140__traveling.mdwn create mode 100644 doc/devblog/day_13__encrypted_sneakernet_working.mdwn create mode 100644 doc/devblog/day_141__f-droid_sprint.mdwn create mode 100644 doc/devblog/day_141__f-droid_sprint/comment_1_1cc76207020ac478747117c76d7b5f9c._comment create mode 100644 doc/devblog/day_142__digging_out.mdwn create mode 100644 doc/devblog/day_143__foolish_hiatus.mdwn create mode 100644 doc/devblog/day_144__catching_up.mdwn create mode 100644 doc/devblog/day_144__catching_up/comment_1_311a7245dd12f1a7e432168d16041348._comment create mode 100644 doc/devblog/day_14__gcrypt_refinements_and_OOM_fixes.mdwn create mode 100644 doc/devblog/day_15-17__Android_rebuild.mdwn create mode 100644 doc/devblog/day_19__moving_on.mdwn create mode 100644 doc/devblog/day_19__moving_on/comment_1_870106f671f9a055b81e6fc83e0850b5._comment create mode 100644 doc/devblog/day_19__moving_on/comment_2_fad055c8860385ac6c012f897c96408f._comment create mode 100644 doc/devblog/day_19__moving_on/comment_3_69e47d612159587f080ab761566d1830._comment create mode 100644 doc/devblog/day_1__inauspicious_beginning.mdwn create mode 100644 doc/devblog/day_1__inauspicious_beginning/comment_1_cc4dea43caf3126c6f814b589b701d70._comment create mode 100644 doc/devblog/day_20__gcrypt_and_git-annex-shell.mdwn create mode 100644 doc/devblog/day_21__bugfix_day.mdwn create mode 100644 doc/devblog/day_22__gcrypt_on_rsync.net.mdwn create mode 100644 doc/devblog/day_23__GNU_day.mdwn create mode 100644 doc/devblog/day_24__nearly_done_with_gcrypt.mdwn create mode 100644 doc/devblog/day_25__finishing_up_gcrypt.mdwn create mode 100644 doc/devblog/day_26__gcrypt_really_done_this_time.mdwn create mode 100644 doc/devblog/day_27__locking_fun.mdwn create mode 100644 doc/devblog/day_27__locking_fun/comment_1_0eb247235fbf8f563934f3548e1d2e10._comment create mode 100644 doc/devblog/day_27__locking_fun/comment_2_e8b1dfe1b0641e031d05733448b7bc8b._comment create mode 100644 doc/devblog/day_27__locking_fun/comment_3_b67f8ef4ed42b49c8c2e6c4e53163b16._comment create mode 100644 doc/devblog/day_27__locking_fun/comment_4_0759644baf26b75f4e48dbb387d725a5._comment create mode 100644 doc/devblog/day_28__lazy_saturday.mdwn create mode 100644 doc/devblog/day_29__scheduling.mdwn create mode 100644 doc/devblog/day_2__new_laptop.mdwn create mode 100644 doc/devblog/day_2__new_laptop/comment_1_93447dbd4eb09b4db96770644ea663cb._comment create mode 100644 doc/devblog/day_2__new_laptop/comment_2_e1d022b25f2c16dbe72db07ad4b10a2d._comment create mode 100644 doc/devblog/day_30__cronner.mdwn create mode 100644 doc/devblog/day_30__cronner/comment_1_53dfd9310e92f5225db52a13e20a46d4._comment create mode 100644 doc/devblog/day_30__cronner/comment_2_f98357c6f7a6da23873ac27c2e1e9638._comment create mode 100644 doc/devblog/day_31__blah.mdwn create mode 100644 doc/devblog/day_32__fsck_config_UI.mdwn create mode 100644 doc/devblog/day_33__fsck_on_connect.mdwn create mode 100644 doc/devblog/day_34__wrapping_up_fsck.mdwn create mode 100644 doc/devblog/day_35__anacron_and_bugfixing.mdwn create mode 100644 doc/devblog/day_36__bugfixing.mdwn create mode 100644 doc/devblog/day_37__long_day.mdwn create mode 100644 doc/devblog/day_38__starting_git_repo_repair.mdwn create mode 100644 doc/devblog/day_38__starting_git_repo_repair/comment_1_321468d9686db5dde072500bdaeb7d29._comment create mode 100644 doc/devblog/day_39__git-recover-repository.mdwn create mode 100644 doc/devblog/day_3__gcrypt_uuids.mdwn create mode 100644 doc/devblog/day_40__another_fine_mess.mdwn create mode 100644 doc/devblog/day_41__onward.mdwn create mode 100644 doc/devblog/day_41__onward/comment_1_a716c7b5a9ea3c949ff047cfb4e9a0a4._comment create mode 100644 doc/devblog/day_41__onward/comment_2_33149e424cd5f03fac376288bcc4dfdc._comment create mode 100644 doc/devblog/day_41__onward/comment_3_3b07503bd79089ad3ce3ddd7535ed116._comment create mode 100644 doc/devblog/day_42__repair_milestone.mdwn create mode 100644 doc/devblog/day_43__bugfix_day.mdwn create mode 100644 doc/devblog/day_44__automatic_removable_drive_repair.mdwn create mode 100644 doc/devblog/day_45__command_line.mdwn create mode 100644 doc/devblog/day_46__wrapping_up_the_month.mdwn create mode 100644 doc/devblog/day_47__fell_off_the_blogging_wagon.mdwn create mode 100644 doc/devblog/day_48__direct_mode_guard_design.mdwn create mode 100644 doc/devblog/day_48__direct_mode_guard_design/comment_1_ec0147ccc55bad3a38652383f4098a65._comment create mode 100644 doc/devblog/day_49__direct_mode_guard_implementation.mdwn create mode 100644 doc/devblog/day_49__direct_mode_guard_implementation/comment_1_3ebe5c3f708070f164ecaf36b79f7bfc._comment create mode 100644 doc/devblog/day_4__unexpected_windows_day.mdwn create mode 100644 doc/devblog/day_50__grab_bag.mdwn create mode 100644 doc/devblog/day_50__grab_bag/comment_1_01846f6494fe843889391fd09fd127a0._comment create mode 100644 doc/devblog/day_50__grab_bag/comment_2_12736014aa2c1af81e4b83072505e7d5._comment create mode 100644 doc/devblog/day_51__direct_mode_guard_finished.mdwn create mode 100644 doc/devblog/day_52__slowly_but_surely.mdwn create mode 100644 doc/devblog/day_54__android_bisection_minions.mdwn create mode 100644 doc/devblog/day_54__android_bisection_minions/comment_1_bea8fbe2b87d4a4865b92fa796298fa0._comment create mode 100644 doc/devblog/day_55__fireside_porting.mdwn create mode 100644 doc/devblog/day_55__fireside_porting/comment_1_d690a52db82f9594d99ae65fe51e1f1a._comment create mode 100644 doc/devblog/day_56__git-annex_user_survey.mdwn create mode 100644 doc/devblog/day_57__mavericks.mdwn create mode 100644 doc/devblog/day_58__urgle.mdwn create mode 100644 doc/devblog/day_58__urgle/comment_1_bd279f58f614b103a53215dfb0211007._comment create mode 100644 doc/devblog/day_59__release_day.mdwn create mode 100644 doc/devblog/day_5__gcrypt_special_remote_part_1.mdwn create mode 100644 doc/devblog/day_60__damage_driven_development.mdwn create mode 100644 doc/devblog/day_61__damage_driven_development__II.mdwn create mode 100644 doc/devblog/day_62__upgrade_alerts.mdwn create mode 100644 doc/devblog/day_62__upgrade_alerts/comment_1_cdb44aaa1d2a784a72613cbf16038f89._comment create mode 100644 doc/devblog/day_62__upgrade_alerts/comment_2_b08bb946e4760d7f03b45c852c745b2e._comment create mode 100644 doc/devblog/day_63__leverage.mdwn create mode 100644 doc/devblog/day_64__overkill.mdwn create mode 100644 doc/devblog/day_64__overkill/comment_1_e1db7678aae37af281d31ae211677786._comment create mode 100644 doc/devblog/day_64__overkill/comment_3_f7a96f0b6d942d0b59d9d0ec1b21c4bf._comment create mode 100644 doc/devblog/day_65__wrapping_up_upgrades.mdwn create mode 100644 doc/devblog/day_66__upgrade_testing.mdwn create mode 100644 doc/devblog/day_67_thanksgiving_rush.mdwn create mode 100644 doc/devblog/day_68__bits_and_pieces.mdwn create mode 100644 doc/devblog/day_69__catching_up.mdwn create mode 100644 doc/devblog/day_6__gcrypt_fully_working.mdwn create mode 100644 doc/devblog/day_6__gcrypt_fully_working/comment_1_136bb7537a9ba93d400ce6f6ea1932ac._comment create mode 100644 doc/devblog/day_6__gcrypt_fully_working/comment_2_1f8faa65bbd56a12588b43a5bc822d96._comment create mode 100644 doc/devblog/day_70__preliminary_user_survey_analysis.mdwn create mode 100644 doc/devblog/day_71__that_was_unexpected.mdwn create mode 100644 doc/devblog/day_72__windows_webapp_not.mdwn create mode 100644 doc/devblog/day_73__EvilLinker.mdwn create mode 100644 doc/devblog/day_74__so_close.mdwn create mode 100644 doc/devblog/day_74__so_close/comment_1_b1aa185734c3d74830b81def4fe63bff._comment create mode 100644 doc/devblog/day_75__hallelujah.mdwn create mode 100644 doc/devblog/day_75__hallelujah/comment_1_df04c456e99d47743494a18c1badba8c._comment create mode 100644 doc/devblog/day_76__results.mdwn create mode 100644 doc/devblog/day_77__it_builds.mdwn create mode 100644 doc/devblog/day_78__desidetracked.mdwn create mode 100644 doc/devblog/day_79__catch_up.mdwn create mode 100644 doc/devblog/day_7__release_day.mdwn create mode 100644 doc/devblog/day_7__release_day/comment_1_12bb94d903868ecddb3e348c9c4afeaf._comment create mode 100644 doc/devblog/day_7__release_day/comment_2_d3e38d6f6bba179dab40d4d75ff061de._comment create mode 100644 doc/devblog/day_80__plumbing.mdwn create mode 100644 doc/devblog/day_81__more_standalone.mdwn create mode 100644 doc/devblog/day_81__more_standalone/comment_1_25ceb116406b55a8ff28f7b392806bc9._comment create mode 100644 doc/devblog/day_82__rpi_and_synology.mdwn create mode 100644 doc/devblog/day_82__rpi_and_synology/comment_1_d154ddcf22027fd06acf9da73e12c006._comment create mode 100644 doc/devblog/day_83__armel_webapp.mdwn create mode 100644 doc/devblog/day_84__ho_uh_oh.mdwn create mode 100644 doc/devblog/day_85__external_special_remote_protocol_types.mdwn create mode 100644 doc/devblog/day_86__external_special_remote_implementation.mdwn create mode 100644 doc/devblog/day_86__external_special_remote_implementation/comment_1_5116bcf4b60030cb46683df94a75d7ee._comment create mode 100644 doc/devblog/day_86__external_special_remote_implementation/comment_2_7b6e734f785fbd9db7883b63150023dc._comment create mode 100644 doc/devblog/day_87__external_special_remotes_done.mdwn create mode 100644 doc/devblog/day_88__lazy_sunday.mdwn create mode 100644 doc/devblog/day_89__reflections.mdwn create mode 100644 doc/devblog/day_8__ill.mdwn create mode 100644 doc/devblog/day_90__slow_start.mdwn create mode 100644 doc/devblog/day_91__wintry_mix.mdwn create mode 100644 doc/devblog/day_92-93__reconnection.mdwn create mode 100644 doc/devblog/day_94__leaks.mdwn create mode 100644 doc/devblog/day_95__reconnection_revisited.mdwn create mode 100644 doc/devblog/day_95__reconnection_revisited/comment_1_c1106e573fcf9f3d4524c0e4f4254790._comment create mode 100644 doc/devblog/day_95__reconnection_revisited/comment_2_40478739f95e0b56ce0103db6e405ef4._comment create mode 100644 doc/devblog/day_96__catching_up.mdwn create mode 100644 doc/devblog/day_97__exciting_telehash_possiblities.mdwn create mode 100644 doc/devblog/day_97__exciting_telehash_possiblities/comment_1_7c775d93cbeed0d553e224751d30fbaa._comment create mode 100644 doc/devblog/day_98__old_bug.mdwn create mode 100644 doc/devblog/day_99__catching_up_again.mdwn create mode 100644 doc/devblog/day_99__catching_up_again/comment_1_b871bf0606dc29be9b8c2e5dc150f708._comment create mode 100644 doc/devblog/day_99__catching_up_again/comment_2_c8363d47223e7bb899420e800bde3e27._comment create mode 100644 doc/devblog/day_9__Friday_the_13th.mdwn create mode 100644 doc/devblog/day_9__Friday_the_13th/comment_1_07195b4ec399ba1be6c8bdb3ae0fa50b._comment create mode 100644 doc/devblog/day__126-127__merge_fixes.mdwn create mode 100644 doc/devblog/moving_blogs.mdwn create mode 100644 doc/devblog/moving_blogs/comment_1_6caa7e67461a6ea5de8155ae9cf75fab._comment create mode 100644 doc/devblog/moving_blogs/comment_2_e3e2048fc2397b87a2f29c9fe49394cb._comment create mode 100644 doc/devblog/whither_XMPP.mdwn create mode 100644 doc/direct_mode.mdwn create mode 100644 doc/direct_mode/comment_11_1c79c93f4b17cfc354ab920e3775cc60._comment create mode 100644 doc/direct_mode/comment_12_1b5218fdb6ee362d6df68ff1229590d4._comment create mode 100644 doc/direct_mode/comment_13_55108ac736ea450df89332ba5de4a208._comment create mode 100644 doc/direct_mode/comment_14_ff4ffc2aabc5fd174d7386ef13860f78._comment create mode 100644 doc/direct_mode/comment_15_1cd32456630b25d5aaa6d2763e6eb384._comment create mode 100644 doc/direct_mode/comment_3_8020d74bddf0e38b0a297e5dae7c217b._comment create mode 100644 doc/direct_mode/comment_4_97c26bd82f623a3b2d56bab4afff0126._comment create mode 100644 doc/direct_mode/comment_5_42363bf0367f935b3eee8ad3d2eaf5cf._comment create mode 100644 doc/direct_mode/comment_6_5f03b1686c1fb3f7606a5bc724ac3812._comment create mode 100644 doc/direct_mode/comment_7_5355ac418bfb26e990762b80f4c36b77._comment create mode 100644 doc/direct_mode/comment_8_6cd15e2c5fd0bef48f60c6993322c2fc._comment create mode 100644 doc/distributed_version_control.mdwn create mode 100644 doc/download.mdwn create mode 100644 doc/download/comment_1_ec2578241a966cfcdd43f2a26a5c8709._comment create mode 100644 doc/download/comment_2_ee0d158ac59903737dbc4ef632f11fe3._comment create mode 100644 doc/ekg.mdwn create mode 100644 doc/ekg/ekg.png create mode 100644 doc/encryption.mdwn create mode 100644 doc/encryption/comment_1_1afca8d7182075d46db41f6ad3dd5911._comment create mode 100644 doc/favicon.ico create mode 100644 doc/feeds.mdwn create mode 100644 doc/footer/column_a.mdwn create mode 100644 doc/footer/column_b.mdwn create mode 100644 doc/forum.mdwn create mode 100644 doc/forum/2_clients_using_an_encrypted_server_for_syncing_-_possible__63__.mdwn create mode 100644 doc/forum/2_clients_using_an_encrypted_server_for_syncing_-_possible__63__/comment_1_924521ad5972046bac44d2e04ec296c7._comment create mode 100644 doc/forum/2_clients_using_an_encrypted_server_for_syncing_-_possible__63__/comment_2_e2a7f34a3ccc1b6467e6da611c067d66._comment create mode 100644 doc/forum/2_clients_using_an_encrypted_server_for_syncing_-_possible__63__/comment_3_f9a369a6ac69f091e6128990274d3228._comment create mode 100644 doc/forum/2_clients_using_an_encrypted_server_for_syncing_-_possible__63__/comment_4_91b422f8d55b68077245c606c4f7f87c._comment create mode 100644 doc/forum/2_clients_using_an_encrypted_server_for_syncing_-_possible__63__/comment_5_f6128fe75ff3453747f69f12e0fd0a5b._comment create mode 100644 doc/forum/2_clients_using_an_encrypted_server_for_syncing_-_possible__63__/comment_6_9b90b4031a5ed26c375903b33ed65a10._comment create mode 100644 doc/forum/A_question_an_the_nomad_use_cases:_files_to_fetch__44___files_to_delete__44___files_to_keep__63__.mdwn create mode 100644 doc/forum/A_question_an_the_nomad_use_cases:_files_to_fetch__44___files_to_delete__44___files_to_keep__63__/comment_1_fe291cd6cd8e2d5b8e23f8e3689d824b._comment create mode 100644 doc/forum/A_question_an_the_nomad_use_cases:_files_to_fetch__44___files_to_delete__44___files_to_keep__63__/comment_2_f0dbc3c723999bf0f22502e3a89d1d4a._comment create mode 100644 doc/forum/A_really_stupid_question.mdwn create mode 100644 doc/forum/A_really_stupid_question/comment_1_40e02556de0b00b94f245a0196b5a89f._comment create mode 100644 doc/forum/Accessing_files_directly_on__a_USB_device.mdwn create mode 100644 doc/forum/Accessing_files_in_bare_repository.mdwn create mode 100644 doc/forum/Accessing_files_in_bare_repository/comment_10_7eb66e3806f9524e043fae2da9d57d64._comment create mode 100644 doc/forum/Accessing_files_in_bare_repository/comment_11_f0165d66865ad14f7eb5d50e900c1df4._comment create mode 100644 doc/forum/Accessing_files_in_bare_repository/comment_12_0e7ea5161b6da6e9bb9425bdb953de33._comment create mode 100644 doc/forum/Accessing_files_in_bare_repository/comment_13_f804b9bf71f7d04bd23ce32d813dc340._comment create mode 100644 doc/forum/Accessing_files_in_bare_repository/comment_1_6de649d38febd2240eb5b703da77c2d6._comment create mode 100644 doc/forum/Accessing_files_in_bare_repository/comment_2_7e8dd09915ddc3267377e900891cb02c._comment create mode 100644 doc/forum/Accessing_files_in_bare_repository/comment_3_80eae4a73f38d1a7e35f97c33b6401f8._comment create mode 100644 doc/forum/Accessing_files_in_bare_repository/comment_4_5ec13e98d3ecb69426e974d34f712f9b._comment create mode 100644 doc/forum/Accessing_files_in_bare_repository/comment_5_dccbf5793998c6381e23eb8ff6497ebf._comment create mode 100644 doc/forum/Accessing_files_in_bare_repository/comment_6_42d923916232c81f3b8bdbefa34a89d3._comment create mode 100644 doc/forum/Accessing_files_in_bare_repository/comment_7_43a0a7d222faee582aeb3150a59cef87._comment create mode 100644 doc/forum/Accessing_files_in_bare_repository/comment_8_ec1024235c1c74c113483a833df84654._comment create mode 100644 doc/forum/Accessing_files_in_bare_repository/comment_9_c156b8c1ae0f2905566bbdb13b84e577._comment create mode 100644 doc/forum/Actions_very_slow_on_a_direct___40__and_crippled__41___annex_repository.mdwn create mode 100644 doc/forum/Actions_very_slow_on_a_direct___40__and_crippled__41___annex_repository/bugs/direct_mode_sync_should_avoid_git_commit.mdwn create mode 100644 doc/forum/Actions_very_slow_on_a_direct___40__and_crippled__41___annex_repository/comment_10_06dae5709750ea1da4f7fdbee4e84efc._comment create mode 100644 doc/forum/Actions_very_slow_on_a_direct___40__and_crippled__41___annex_repository/comment_11_2069c5c41882ae0a1973fb7da583b60e._comment create mode 100644 doc/forum/Actions_very_slow_on_a_direct___40__and_crippled__41___annex_repository/comment_12_b35e3a87c30974eedd71ebe52ecbed96._comment create mode 100644 doc/forum/Actions_very_slow_on_a_direct___40__and_crippled__41___annex_repository/comment_13_84e026f9bda87bfd12a3769dcef77f8b._comment create mode 100644 doc/forum/Actions_very_slow_on_a_direct___40__and_crippled__41___annex_repository/comment_14_b2ac2ea300a5026832b40a1a6b27a7cd._comment create mode 100644 doc/forum/Actions_very_slow_on_a_direct___40__and_crippled__41___annex_repository/comment_1_ed3534196164c6736a8dbf21c65c119d._comment create mode 100644 doc/forum/Actions_very_slow_on_a_direct___40__and_crippled__41___annex_repository/comment_2_1e29bcf568f02765c48f0eac6c640673._comment create mode 100644 doc/forum/Actions_very_slow_on_a_direct___40__and_crippled__41___annex_repository/comment_3_9ea6803a94b1de15079a3fa20d59c9af._comment create mode 100644 doc/forum/Actions_very_slow_on_a_direct___40__and_crippled__41___annex_repository/comment_4_3fae5a7fa5d99d0eb4473adb43e7f6f5._comment create mode 100644 doc/forum/Actions_very_slow_on_a_direct___40__and_crippled__41___annex_repository/comment_5_57a5b73cff480266355e75c7bdc762c2._comment create mode 100644 doc/forum/Actions_very_slow_on_a_direct___40__and_crippled__41___annex_repository/comment_6_bbcf5e863c8f152e1079536e9011a404._comment create mode 100644 doc/forum/Actions_very_slow_on_a_direct___40__and_crippled__41___annex_repository/comment_7_fdcd144c22601bdf98ff844254b0120d._comment create mode 100644 doc/forum/Actions_very_slow_on_a_direct___40__and_crippled__41___annex_repository/comment_8_b77243e765b2af7ba71e963fcb5cbbb1._comment create mode 100644 doc/forum/Actions_very_slow_on_a_direct___40__and_crippled__41___annex_repository/comment_9_cb0815e96ee211d4778f2e7a4274e855._comment create mode 100644 doc/forum/Add_a___34__local__34___remote.mdwn create mode 100644 doc/forum/Add_a___34__local__34___remote/comment_1_c68ad724b465c4be5243be687168c0b3._comment create mode 100644 doc/forum/Adding_existing_S3_bucket_to_sync_with.mdwn create mode 100644 doc/forum/Adding_existing_S3_bucket_to_sync_with/comment_1_30b9a70d367dd5b8781e9a86e42d4c3e._comment create mode 100644 doc/forum/Adding_existing_S3_bucket_to_sync_with/comment_2_a8525c1a7e5f89c30c9503fe8bfed02e._comment create mode 100644 doc/forum/Adding_existing_S3_bucket_to_sync_with/comment_3_c3878989f74e740c0ed42f440750f3a4._comment create mode 100644 doc/forum/Adding_existing_S3_bucket_to_sync_with/comment_4_c06cc86496f9d4c0c42a8c89aa5a7b35._comment create mode 100644 doc/forum/Adding_existing_S3_bucket_to_sync_with/comment_5_0a1c2dd0929511ff824be8de2c8d85eb._comment create mode 100644 doc/forum/Adding_existing_S3_bucket_to_sync_with/comment_6_1444c2f89885f028f20a4d3ce225a403._comment create mode 100644 doc/forum/Adding_existing_S3_bucket_to_sync_with/comment_7_1c30944010d541096baff18198a5560d._comment create mode 100644 doc/forum/Advice_needed:_git-annex_slows_down_my_macbook.mdwn create mode 100644 doc/forum/Advice_needed:_git-annex_slows_down_my_macbook/comment_1_af8ab0a47cd379fcb1445e50782ad086._comment create mode 100644 doc/forum/Advice_needed:_git-annex_slows_down_my_macbook/comment_2_a7202bcbdda36a3801833d2432db1965._comment create mode 100644 doc/forum/Android:_is_constant_high_cpu_usage_to_be_expected__63__.mdwn create mode 100644 doc/forum/Android:_is_constant_high_cpu_usage_to_be_expected__63__/comment_1_7880fc38792a1fcbf3e5c47e8bcaabce._comment create mode 100644 doc/forum/Android:_is_constant_high_cpu_usage_to_be_expected__63__/comment_2_840fbce18b4fdec21ee557fdf52c366e._comment create mode 100644 doc/forum/Android_-_ext3__47__4__47__....mdwn create mode 100644 doc/forum/Annex_contents_just_disappeared__63__.mdwn create mode 100644 doc/forum/Annex_contents_just_disappeared__63__/comment_1_4ab5ca00f912c0c95fabc10f2d9600d3._comment create mode 100644 doc/forum/Annex_contents_just_disappeared__63__/comment_2_657f737c5d64d440aa133ddb41408fbc._comment create mode 100644 doc/forum/Annex_contents_just_disappeared__63__/comment_3_9b4c35feb14b37d43d053d7430da9abf._comment create mode 100644 doc/forum/Annex_contents_just_disappeared__63__/comment_4_c3625409652bff5f2165260803269a8a._comment create mode 100644 doc/forum/Annex_dropping_files.mdwn create mode 100644 doc/forum/Annex_dropping_files/comment_1_62fbea95248fda2ff075b5a8952a728f._comment create mode 100644 doc/forum/Any_way_to_add_a_folder_called___34__.git__34___to_git-annex__63__.mdwn create mode 100644 doc/forum/Any_way_to_add_a_folder_called___34__.git__34___to_git-annex__63__/comment_1_51f4392e718d857e2f155d6217727a53._comment create mode 100644 doc/forum/Any_way_to_add_a_folder_called___34__.git__34___to_git-annex__63__/comment_2_9698c4a8f0d8785ee89a6228e0e85ca9._comment create mode 100644 doc/forum/Assistant:_configure_auto-sync.mdwn create mode 100644 doc/forum/Assistant:_configure_auto-sync/comment_1_c8cabd38114582bbdbad49f2d81959d7._comment create mode 100644 doc/forum/Assistant_Droping_Files.mdwn create mode 100644 doc/forum/Assistant_loosing_advantages__63__.mdwn create mode 100644 doc/forum/Assistant_loosing_advantages__63__/comment_1_cdbc827d9e00aeeaefafe45de64b8d2c._comment create mode 100644 doc/forum/Assistant_not_syncing_to_Rsync.mdwn create mode 100644 doc/forum/Assistant_not_syncing_to_Rsync/comment_1_2178a7fc0d66643e84597b0938ef65f2._comment create mode 100644 doc/forum/Assistant_not_syncing_to_Rsync/comment_2_650651398443e128c2adc6a2a2d320d0._comment create mode 100644 doc/forum/Assistant_not_syncing_to_Rsync/comment_3_e6d0c9620b148acc72342862a8b4cfef._comment create mode 100644 doc/forum/Assistant_not_syncing_to_Rsync/comment_4_b91f9febdb8b69d8b487ba4ea08c119a._comment create mode 100644 doc/forum/Assistant_not_syncing_to_Rsync/comment_5_c5ad7c1546a17d8459c995c9c8c26414._comment create mode 100644 doc/forum/Assistant_not_syncing_to_Rsync/comment_6_4c12587f972eced91c5128d4885800b5._comment create mode 100644 doc/forum/Assistant_not_syncing_to_Rsync/comment_7_6ecaaee9316bcf0c65688676d60fc055._comment create mode 100644 doc/forum/Assistant_not_syncing_to_Rsync/comment_8_daa9a9a6188afa0394833e1b682f7cd4._comment create mode 100644 doc/forum/Auto_archiving.mdwn create mode 100644 doc/forum/Auto_sync_with_music_player.mdwn create mode 100644 doc/forum/Auto_sync_with_music_player/comment_1_81ad1c15cfd753531c01dae8945d1caf._comment create mode 100644 doc/forum/Auto_sync_with_music_player/comment_2_a15e3f298c3d3faa5b3295355f9bb794._comment create mode 100644 doc/forum/Auto_sync_with_music_player/comment_3_99f65a0efaf5d5f9b8ff530acc122860._comment create mode 100644 doc/forum/Automatic___96__git_annex_get__96___after_invalidation_of_local_files_due_to_external_modification__63__.mdwn create mode 100644 doc/forum/Automatic___96__git_annex_get__96___after_invalidation_of_local_files_due_to_external_modification__63__/comment_1_dab1099ee56541c194de319c593f1268._comment create mode 100644 doc/forum/Automatic___96__git_annex_get__96___after_invalidation_of_local_files_due_to_external_modification__63__/comment_2_b5faccf132fb47e3cda778a6600fd9ef._comment create mode 100644 doc/forum/Automatic_commit_messages_for_git_annex_sync.mdwn create mode 100644 doc/forum/Automatic_commit_messages_for_git_annex_sync/comment_1_ea2ec57bc695da4df8a30a35d433959d._comment create mode 100644 doc/forum/Automatic_commit_messages_for_git_annex_sync/comment_2_af71f53dbbca35d5a5c66ff131887ada._comment create mode 100644 doc/forum/Automatically_syncronise_centralised_repository.mdwn create mode 100644 doc/forum/Automatically_syncronise_centralised_repository/comment_1_6a2047daa9faf4309d2ed27d5cc48b76._comment create mode 100644 doc/forum/Automatically_syncronise_centralised_repository/comment_2_3be7b45bc2284019f17a81375637a576._comment create mode 100644 doc/forum/Behaviour_of_fsck.mdwn create mode 100644 doc/forum/Behaviour_of_fsck/comment_1_0e40f158b3f4ccdcaab1408d858b68b8._comment create mode 100644 doc/forum/Behaviour_of_fsck/comment_2_ead36a23c3e6efa1c41e4555f93e014e._comment create mode 100644 doc/forum/Behaviour_of_fsck/comment_3_97848f9a3db89c0427cfb671ba13300e._comment create mode 100644 doc/forum/Behaviour_of_fsck/comment_4_e4911dc6793f98fb81151daacbe49968._comment create mode 100644 doc/forum/Best_way_to_manage_files_on_removable_media__63__.mdwn create mode 100644 doc/forum/Best_way_to_re-add_a_file_in_a_direct_and_crippled_annex_repository.mdwn create mode 100644 doc/forum/Best_way_to_re-add_a_file_in_a_direct_and_crippled_annex_repository/comment_1_552e74f9573a34ec178f396b83252c3e._comment create mode 100644 doc/forum/Best_way_to_re-add_a_file_in_a_direct_and_crippled_annex_repository/comment_2_33c57922714f204fc63c260b838f3712._comment create mode 100644 doc/forum/Box.com_hasn__39__t_been_working_for_a_few_days.mdwn create mode 100644 doc/forum/Box.com_hasn__39__t_been_working_for_a_few_days/comment_1_6ca872c241399b9129cf9a18f42ebd43._comment create mode 100644 doc/forum/Building_a_Debian_package_of_git-annex.mdwn create mode 100644 doc/forum/Building_a_Debian_package_of_git-annex/comment_1_0848513c46f3efa21bc34784554ae88a._comment create mode 100644 doc/forum/Building_git-annex-3.20121112-19309.mdwn create mode 100644 doc/forum/Building_git-annex-3.20121112-19309/comment_1_b115e28c77fe748ee6643c41f766beb4._comment create mode 100644 doc/forum/Building_git-annex-3.20121112-19309/comment_2_8c6ae1fd74f14da12ccfa77dbd27fc65._comment create mode 100644 doc/forum/Building_git-annex-3.20121112-19309/comment_3_2f30b301c14f3a7fa0f52715d6140353._comment create mode 100644 doc/forum/Building_git-annex-3.20121112-19309/comment_4_1e3c3903a71a2ff7109372aa4dd5742a._comment create mode 100644 doc/forum/Cabal:_Could_not_resolve_dependencies___40__yesod__41__.mdwn create mode 100644 doc/forum/Cabal:_Could_not_resolve_dependencies___40__yesod__41__/comment_1_2eb4f410b54a25fcc895893a3c631c43._comment create mode 100644 doc/forum/Cabal:_Could_not_resolve_dependencies___40__yesod__41__/comment_2_44cd6f6dd674df105d6f0b3f320f3236._comment create mode 100644 doc/forum/Cabal:_Could_not_resolve_dependencies___40__yesod__41__/comment_3_992af6855901df79a2018a07941cb8b6._comment create mode 100644 doc/forum/Calculating_Annex_Cost_by_Ping_Times.mdwn create mode 100644 doc/forum/Calculating_Annex_Cost_by_Ping_Times/comment_1_9b4a6bc8d52ecbbdd537e8cf76757a80._comment create mode 100644 doc/forum/Calculating_Annex_Cost_by_Ping_Times/comment_2_7e04f85c6ba74c18c8dde148aef9bf80._comment create mode 100644 doc/forum/Can_I_store_normal_files_in_the_git-annex_git_repository__63__.mdwn create mode 100644 doc/forum/Can_I_store_normal_files_in_the_git-annex_git_repository__63__/comment_1_c8f9923d8dc76b8bed25dce5ae09b520._comment create mode 100644 doc/forum/Can_Not_Sync_to_Git_Repo.mdwn create mode 100644 doc/forum/Can_Not_Sync_to_Git_Repo/comment_10_e0f82074eb1a4b8258729d9a23a7f421._comment create mode 100644 doc/forum/Can_Not_Sync_to_Git_Repo/comment_11_842aaf685aa843c21bf3eef0b61f8630._comment create mode 100644 doc/forum/Can_Not_Sync_to_Git_Repo/comment_12_b4f8be428a08db01dbd004e1f06dcffd._comment create mode 100644 doc/forum/Can_Not_Sync_to_Git_Repo/comment_1_80344c54804ddee81d89c0b40731fb9c._comment create mode 100644 doc/forum/Can_Not_Sync_to_Git_Repo/comment_2_1797c2fef5c20e885b56b8a2c6330ff0._comment create mode 100644 doc/forum/Can_Not_Sync_to_Git_Repo/comment_3_fb23d640f9634cab2da91848f1848627._comment create mode 100644 doc/forum/Can_Not_Sync_to_Git_Repo/comment_4_a947736911e68856f2c3494963063df8._comment create mode 100644 doc/forum/Can_Not_Sync_to_Git_Repo/comment_5_ce0e77143cfd2d578b1e5a71e35060da._comment create mode 100644 doc/forum/Can_Not_Sync_to_Git_Repo/comment_6_10e114da6a2bb54b860b44767ba1ca94._comment create mode 100644 doc/forum/Can_Not_Sync_to_Git_Repo/comment_7_415bab6a7ab564e671f42cfad83e0e58._comment create mode 100644 doc/forum/Can_Not_Sync_to_Git_Repo/comment_8_36abd829ea71a44c7cded1123a7c913d._comment create mode 100644 doc/forum/Can_Not_Sync_to_Git_Repo/comment_9_2fb745aaffe544f97bbdc670261fd4fd._comment create mode 100644 doc/forum/Can__39__t_get_git-annex_merge_to_work_from_git_hook.mdwn create mode 100644 doc/forum/Can__39__t_get_git-annex_merge_to_work_from_git_hook/comment_1_8b71cb6772b219c27c17392d5099907a._comment create mode 100644 doc/forum/Can__39__t_get_git-annex_merge_to_work_from_git_hook/comment_2_af2a2634d8d128868022d033d6adb549._comment create mode 100644 doc/forum/Can__39__t_get_git-annex_merge_to_work_from_git_hook/comment_3_31ec762a0684d2ce87d229ed2924db93._comment create mode 100644 doc/forum/Can__39__t_get_jabber_working.mdwn create mode 100644 doc/forum/Can__39__t_get_jabber_working/comment_1_def20bf0b3c1a188e4dad5ec67b455d8._comment create mode 100644 doc/forum/Can__39__t_get_jabber_working/comment_2_7cb49c0ebfec6e0fe6784e189ed65d40._comment create mode 100644 doc/forum/Can__39__t_get_jabber_working/comment_3_852dc402a286e38b77b99f174c33f8d1._comment create mode 100644 doc/forum/Can__39__t_get_jabber_working/comment_4_259741e146906ff70540390bdfe07002._comment create mode 100644 doc/forum/Can__39__t_get_pairing_to_work.mdwn create mode 100644 doc/forum/Can__39__t_get_pairing_to_work/comment_1_b981977b4fb942fd109c37fcf40f35d7._comment create mode 100644 doc/forum/Can__39__t_get_pairing_to_work/comment_2_341e2ff6c88ace1b1422e16781edf580._comment create mode 100644 doc/forum/Can__39__t_get_pairing_to_work/comment_3_0c8cce48f179f2564ff0844bb7ef6bd1._comment create mode 100644 doc/forum/Can__39__t_get_pairing_to_work/comment_4_169d77b30cea05125068ee1eeb2ef328._comment create mode 100644 doc/forum/Can__39__t_get_pairing_to_work/comment_5_70e6c4f4f01277be1767b38ca8374793._comment create mode 100644 doc/forum/Can__39__t_get_pairing_to_work/comment_6_2cd014a76fac6e08269dfd8146957418._comment create mode 100644 doc/forum/Can__39__t_get_pairing_to_work/comment_7_b9b715084d5a5562998b1724699d49e5._comment create mode 100644 doc/forum/Can__39__t_init_git_annex.mdwn create mode 100644 doc/forum/Can__39__t_init_git_annex/comment_10_c4d2ab1ecf69718a2211c3ea7b27092b._comment create mode 100644 doc/forum/Can__39__t_init_git_annex/comment_12_fca9ed3707e097bee2cd642424681005._comment create mode 100644 doc/forum/Can__39__t_init_git_annex/comment_1_a294b5e7e52aa9f66a708866be16f137._comment create mode 100644 doc/forum/Can__39__t_init_git_annex/comment_2_fcf678d5188821d63b4c9ea5b59474a8._comment create mode 100644 doc/forum/Can__39__t_init_git_annex/comment_3_c83f7dea7d5304e226e52eb3c43ef14a._comment create mode 100644 doc/forum/Can__39__t_init_git_annex/comment_4_06a01dd51ffbfd006c0afb8eab40b530._comment create mode 100644 doc/forum/Can__39__t_init_git_annex/comment_5_53c33484bded57abc60f0449331c7b05._comment create mode 100644 doc/forum/Can__39__t_init_git_annex/comment_6_9e0ff44f6e62581bfc83f9f1da3e0100._comment create mode 100644 doc/forum/Can__39__t_init_git_annex/comment_7_7f96b5ef05e2faf4a3dbe8bfc39b810e._comment create mode 100644 doc/forum/Can__39__t_init_git_annex/comment_8_65ab8463716f4ddd7721a5bcfcd18fa0._comment create mode 100644 doc/forum/Can__39__t_init_git_annex/comment_9_31a45f6a72266190b3ed7a7b02e03d5b._comment create mode 100644 doc/forum/Can__39__t_install:_Mac_OS_10.8.2.mdwn create mode 100644 doc/forum/Can__39__t_install:_Mac_OS_10.8.2/comment_1_c44023d81e9e4f7c9341af0e4271a1e4._comment create mode 100644 doc/forum/Can__39__t_install:_Mac_OS_10.8.2/comment_2_dfbcd39eedff28dc9ed866a8f1411ef3._comment create mode 100644 doc/forum/Can__39__t_install:_Mac_OS_10.8.2/comment_3_b37b2a9906ffb956cca91adb4bb4e521._comment create mode 100644 doc/forum/Can__39__t_install:_Mac_OS_10.8.2/comment_4_afddf16f8faedc78d458835480f10dc3._comment create mode 100644 doc/forum/Can_not_delete_Repository.mdwn create mode 100644 doc/forum/Can_not_delete_Repository/comment_1_b1a9420974e2e50c9c86a379ad62502c._comment create mode 100644 doc/forum/Can_not_drop_unused_file.mdwn create mode 100644 doc/forum/Can_not_drop_unused_file/comment_1_cea83dfdf4cdb4f6efb3f2b33a39a51f._comment create mode 100644 doc/forum/Can_not_drop_unused_file/comment_2_ed1543cff5e6e81ca18c43b716ca8199._comment create mode 100644 doc/forum/Can_not_drop_unused_file/comment_3_0c9c9c0ed557af4845a67434c21bb4bc._comment create mode 100644 doc/forum/Can_we_have_remotes_that_aren__39__t_tracked__63___.mdwn create mode 100644 doc/forum/Can_we_have_remotes_that_aren__39__t_tracked__63___/comment_1_35e5a963b9e58ed7773dfcb884f8ecbd._comment create mode 100644 doc/forum/Can_we_have_remotes_that_aren__39__t_tracked__63___/comment_2_7cde9785886c8450e1475f0b54481ae3._comment create mode 100644 doc/forum/Cannot_find_git-annex_in_server.mdwn create mode 100644 doc/forum/Cannot_find_git-annex_in_server/comment_1_bf7e98e6130698ad0dc92e3a6a63ade3._comment create mode 100644 doc/forum/Cannot_find_git-annex_in_server/comment_2_168dda4aed09f90a510bc453e8a7cda7._comment create mode 100644 doc/forum/Cannot_launch_webapp_on_ubuntu_12.04_using_ppa.mdwn create mode 100644 doc/forum/Cannot_launch_webapp_on_ubuntu_12.04_using_ppa/comment_1_9345551f5772c3a6f1490b00e1edbf69._comment create mode 100644 doc/forum/Cannot_launch_webapp_on_ubuntu_12.04_using_ppa/comment_2_0b688a442b6a911a0353e73097a24cb6._comment create mode 100644 doc/forum/Cannot_launch_webapp_on_ubuntu_12.04_using_ppa/comment_3_7e246caa00005560bb489c927c663046._comment create mode 100644 doc/forum/Cannot_launch_webapp_on_ubuntu_12.04_using_ppa/comment_4_1d8025aabe8bc72711a77f691f67da5f._comment create mode 100644 doc/forum/Cannot_launch_webapp_on_ubuntu_12.04_using_ppa/comment_5_7c2f95da65190016192424e7c622122f._comment create mode 100644 doc/forum/Cannot_launch_webapp_on_ubuntu_12.04_using_ppa/comment_6_9b8465cefe609e7a696e7573b8892e38._comment create mode 100644 doc/forum/Cannot_launch_webapp_on_ubuntu_12.04_using_ppa/comment_7_af6472762a598a454ba52ac0caa059aa._comment create mode 100644 doc/forum/Centralized_repository_with_webapp.mdwn create mode 100644 doc/forum/Centralized_repository_with_webapp/comment_1_dcb9b07fd154f4d4fdef4809cc37ce77._comment create mode 100644 doc/forum/Centralized_repository_with_webapp/comment_2_08c84f2703f89dc12982eba9dd2a06d1._comment create mode 100644 doc/forum/Change_remote_server_address.mdwn create mode 100644 doc/forum/Change_remote_server_address/comment_1_401c3d2530ac7ba41dd3857ab4737ed5._comment create mode 100644 doc/forum/Check_if_remote_is_using_GPG__63__.mdwn create mode 100644 doc/forum/Check_if_remote_is_using_GPG__63__/comment_1_db8ce8ef50fc33a28860ee475988450f._comment create mode 100644 doc/forum/Check_if_remote_is_using_GPG__63__/comment_2_11c7033904c9c7a1df766e915632c386._comment create mode 100644 doc/forum/Check_if_remote_is_using_GPG__63__/comment_3_a7ab70ad87a334c36761ddb3d830d99b._comment create mode 100644 doc/forum/Check_when_your_last_fsck_was__63__.mdwn create mode 100644 doc/forum/Check_when_your_last_fsck_was__63__/comment_1_ee98a1fcd796fe4fd7af6f77d0c1837d._comment create mode 100644 doc/forum/Cleaning_up_after_aborted_sync_in_direct_mode.mdwn create mode 100644 doc/forum/Cleaning_up_after_aborted_sync_in_direct_mode/comment_1_3440b2e1662d3b113c18283afcbf4520._comment create mode 100644 doc/forum/Cleaning_up_after_aborted_sync_in_direct_mode/comment_2_9a61ba8ac4a375f1d69cd09b5a6f8091._comment create mode 100644 doc/forum/Cleaning_up_after_aborted_sync_in_direct_mode/comment_3_6b9d8c48547f3d0a911310622ba91df7._comment create mode 100644 doc/forum/Coming_from_git_world.mdwn create mode 100644 doc/forum/Coming_from_git_world/comment_10_098bef38c2688607e869425a557cc482._comment create mode 100644 doc/forum/Coming_from_git_world/comment_11_98d75a1415e0c3689ab4231855e61233._comment create mode 100644 doc/forum/Coming_from_git_world/comment_12_5e7079e9bf3e4d97191333c66ac00e52._comment create mode 100644 doc/forum/Coming_from_git_world/comment_1_357443dc601ae38784c01cf18552f4d5._comment create mode 100644 doc/forum/Coming_from_git_world/comment_2_ed1847dd3f47a9d013b8dd0455fb80ff._comment create mode 100644 doc/forum/Coming_from_git_world/comment_3_09c6bb83a73d34dff2b8bc185a14a1db._comment create mode 100644 doc/forum/Coming_from_git_world/comment_4_6c731bb9a8d21dd9ab8c09612b23f908._comment create mode 100644 doc/forum/Coming_from_git_world/comment_5_e719d99af5afd90da3d3db692eff28dc._comment create mode 100644 doc/forum/Coming_from_git_world/comment_6_85a42106944dba9995fb3f4bfee3443a._comment create mode 100644 doc/forum/Coming_from_git_world/comment_7_90623294b910ceca3dc8ebd41b50fc9b._comment create mode 100644 doc/forum/Coming_from_git_world/comment_8_28dbee30eb54877418f72eb8935302d8._comment create mode 100644 doc/forum/Coming_from_git_world/comment_9_6edb36ea9535030fa3766937398e5bc7._comment create mode 100644 doc/forum/Compression_in_special_remotes___40__specifically_S3__41____63__.mdwn create mode 100644 doc/forum/Compression_in_special_remotes___40__specifically_S3__41____63__/comment_1_9c6c4ca0c9dc6976ba7cf27e84683bf0._comment create mode 100644 doc/forum/Consistency_Check_for_S3.mdwn create mode 100644 doc/forum/Consistency_Check_for_S3/comment_1_40385806ef1cc082232cd2723a24be1a._comment create mode 100644 doc/forum/Consistency_Check_for_S3/comment_2_ebfe40d9f777c9c0a83c44afd0f5802d._comment create mode 100644 doc/forum/Consistency_Check_for_S3/comment_3_ec9de6882a0eef4d2786e55b583ad020._comment create mode 100644 doc/forum/Controlling_content_on_mobile_device.mdwn create mode 100644 doc/forum/Controlling_content_on_mobile_device/comment_1_708649b7f30d8619d7b34dcb0ef46515._comment create mode 100644 doc/forum/Controlling_content_on_mobile_device/comment_2_dba1a1b0917332a1dee387b1183bd2cb._comment create mode 100644 doc/forum/Convert_regular_git-annex_repo_to_a_rsync_repo.mdwn create mode 100644 doc/forum/Convert_regular_git-annex_repo_to_a_rsync_repo/comment_1_e6065f9c44c85030c7628e2cfa0fd0fa._comment create mode 100644 doc/forum/Convert_regular_git-annex_repo_to_a_rsync_repo/comment_2_76bfb11396dc20a5105376b22e7e773b._comment create mode 100644 doc/forum/Convert_regular_git-annex_repo_to_a_rsync_repo/comment_3_b34d6ae0718ab0ff6bc1d7b8f2470b9b._comment create mode 100644 doc/forum/Convert_regular_git-annex_repo_to_a_rsync_repo/comment_4_8f5e323b29745591f9f2f0f867353f69._comment create mode 100644 doc/forum/Convert_regular_git-annex_repo_to_a_rsync_repo/comment_5_9824c953694770afa0611ff7276737bf._comment create mode 100644 doc/forum/Convert_regular_git-annex_repo_to_a_rsync_repo/comment_6_5899741cb7f83e1b22c5ee3509c5ff21._comment create mode 100644 doc/forum/DBus_on_Ubuntu_12.04__63__.mdwn create mode 100644 doc/forum/DBus_on_Ubuntu_12.04__63__/comment_1_dc14a40b64b7eda94d1a3fd766cd39cc._comment create mode 100644 doc/forum/DBus_on_Ubuntu_12.04__63__/comment_2_608a30e274e6a691a39f69503720e320._comment create mode 100644 doc/forum/DBus_on_Ubuntu_12.04__63__/comment_3_791b9978b410c1aff7fd8ef05c38f5f9._comment create mode 100644 doc/forum/DBus_on_Ubuntu_12.04__63__/comment_4_8665c95299916138c4af375626d9ec7d._comment create mode 100644 doc/forum/DO_NOT_use_ntfs-3g_on_mac_osx_for_annex.mdwn create mode 100644 doc/forum/DS__95__Store_files_are_not_added.mdwn create mode 100644 doc/forum/DS__95__Store_files_are_not_added/comment_1_30687306da9bd35ec02a806193c5e240._comment create mode 100644 doc/forum/Debugging_Git_Annex.mdwn create mode 100644 doc/forum/Debugging_Git_Annex/comment_1_ce63b2ee641a2338f1ad5ded9e6f09a8._comment create mode 100644 doc/forum/Debugging_Git_Annex/comment_2_1d70ff052d00f33c34fd45730ea13040._comment create mode 100644 doc/forum/Default_text__47__html_handler.mdwn create mode 100644 doc/forum/Default_text__47__html_handler/comment_1_4730061916c7e12b7a41906152f847ee._comment create mode 100644 doc/forum/Delete_unused_files__47__metadata.mdwn create mode 100644 doc/forum/Delete_unused_files__47__metadata/comment_1_3efc19895c8dec89b71ae3778b583fea._comment create mode 100644 doc/forum/Delete_unused_files__47__metadata/comment_2_23597d9468347b3d94257f3c02afe1b8._comment create mode 100644 doc/forum/Detached_git_work_tree__63__.mdwn create mode 100644 doc/forum/Detached_git_work_tree__63__/comment_10_656c737772bf92be2c7a2f33bd2bb0f0._comment create mode 100644 doc/forum/Detached_git_work_tree__63__/comment_1_28ac35a325fba250721d9f1b7c994960._comment create mode 100644 doc/forum/Detached_git_work_tree__63__/comment_2_7128c26bbc8efea04a5a317edf0ca9f2._comment create mode 100644 doc/forum/Detached_git_work_tree__63__/comment_3_a3c22f905748ff2c803e8621c74a87a0._comment create mode 100644 doc/forum/Detached_git_work_tree__63__/comment_4_8063921241760458349e7cb0cadf3d4e._comment create mode 100644 doc/forum/Detached_git_work_tree__63__/comment_5_4510a787255cb03e7d0c3e7b830b7d52._comment create mode 100644 doc/forum/Detached_git_work_tree__63__/comment_6_ffd9c67ecc5b46ae98996018573f5591._comment create mode 100644 doc/forum/Detached_git_work_tree__63__/comment_7_36ca007643c983604fc4aed6ec8cb3d2._comment create mode 100644 doc/forum/Detached_git_work_tree__63__/comment_8_b7a2da4fbace7156e11c48a496a19dc9._comment create mode 100644 doc/forum/Detached_git_work_tree__63__/comment_9_f9fa237a693d28178f0451799209f7e2._comment create mode 100644 doc/forum/Difference_between_copy__44___move_and_get__63__.mdwn create mode 100644 doc/forum/Difference_between_copy__44___move_and_get__63__/comment_1_26ee8192af3a62178c1ccf17c6da5ca5._comment create mode 100644 doc/forum/Different_annexes_pointing_to_same_special_remote__63__.mdwn create mode 100644 doc/forum/Different_annexes_pointing_to_same_special_remote__63__/comment_1_359f46805e6508d03aadd90429937546._comment create mode 100644 doc/forum/Direct_special_remotes.mdwn create mode 100644 doc/forum/Direct_special_remotes/comment_1_50357130a1c57ad2fab70f71925faf02._comment create mode 100644 doc/forum/Direct_special_remotes/comment_2_e94a722ca056a068bcc16eb822008602._comment create mode 100644 doc/forum/Direct_special_remotes/comment_4_187036bbfee0508e2914afb51ead3c71._comment create mode 100644 doc/forum/Direct_special_remotes/comment_4_6bfbf60f2061d49b7d34c844e7e1dea2._comment create mode 100644 doc/forum/Direct_special_remotes/comment_5_69c34c655e4b153dfc0d1b8580091124._comment create mode 100644 doc/forum/Direct_special_remotes/comment_6_b054cfc3d3f81873f3faae7eb4f5337c._comment create mode 100644 doc/forum/Direct_special_remotes/comment_7_5f9d8a0ef2f13f242594848825d29ee7._comment create mode 100644 doc/forum/Does_Jabber_syncing_work_when_the_buddy_is_offline__63__.mdwn create mode 100644 doc/forum/Does_Jabber_syncing_work_when_the_buddy_is_offline__63__/comment_1_f290dd8547176793934f8077374e1c0a._comment create mode 100644 doc/forum/Does_Jabber_syncing_work_when_the_buddy_is_offline__63__/comment_2_c358eb51047f333e582bd824be5e0e65._comment create mode 100644 doc/forum/Does_Jabber_syncing_work_when_the_buddy_is_offline__63__/comment_3_a2332c0e7b29110b9aed2ab69ce9d8c4._comment create mode 100644 doc/forum/Does_git-annex_version_big_files__63__.mdwn create mode 100644 doc/forum/Does_git-annex_version_big_files__63__/comment_1_0b44003c1dc53adb807298ae452f8004._comment create mode 100644 doc/forum/Does_git-annex_version_big_files__63__/comment_2_ca40b67abd7bd36155d16d0396d7472c._comment create mode 100644 doc/forum/Does_git-annex_version_big_files__63__/comment_3_32de3501feedce51b43ed9dcc399c7a9._comment create mode 100644 doc/forum/Does_git-annex_version_big_files__63__/comment_4_8c65a7f8bda3c876971c2801fb6a76a1._comment create mode 100644 doc/forum/Does_migrate_ensure_data_integrity__63__.mdwn create mode 100644 doc/forum/Does_migrate_ensure_data_integrity__63__/comment_1_cef50b32c46f4406c6f918c5866ddc15._comment create mode 100644 doc/forum/Does_migrate_ensure_data_integrity__63__/comment_2_f389b924c8531b35fdf5dedd10fc8000._comment create mode 100644 doc/forum/Don__39__t_understand_how_to_delete__47__recover_files.mdwn create mode 100644 doc/forum/Don__39__t_understand_how_to_delete__47__recover_files/comment_1_b307bfb0b70d649897f411eb753bd50a._comment create mode 100644 doc/forum/Don__39__t_understand_how_to_delete__47__recover_files/comment_2_58a6a1476274b8c4feb3d43ecd998759._comment create mode 100644 doc/forum/Don__39__t_understand_how_to_delete__47__recover_files/comment_3_4b857f481db7b2437ac9f8137a8510e2._comment create mode 100644 doc/forum/Don__39__t_understand_how_to_delete__47__recover_files/comment_4_828db3bf2863d98c0b0fb4074aa7f066._comment create mode 100644 doc/forum/Don__39__t_understand_how_to_delete__47__recover_files/comment_5_cb2063d6a4e08a5c12bf3723d0fa74e0._comment create mode 100644 doc/forum/Don__39__t_understand_how_to_delete__47__recover_files/comment_6_1759bcd5708f591f91b9c410f6dc5c54._comment create mode 100644 doc/forum/Don__39__t_understand_how_to_delete__47__recover_files/comment_7_2a389f01eb5131042ea1e71a73c9787a._comment create mode 100644 doc/forum/Don__39__t_understand_local_vs._known_keys.mdwn create mode 100644 doc/forum/Don__39__t_understand_local_vs._known_keys/comment_1_10749c0d76e824217dd1ff8c8a6e42a5._comment create mode 100644 doc/forum/Don__39__t_understand_local_vs._known_keys/comment_2_db9f1b6d9638c2b0a7e241c2727e8cfb._comment create mode 100644 doc/forum/Drop_with_assistant.mdwn create mode 100644 doc/forum/Drop_with_assistant/comment_1_048f5a31c549afb19b76a65bddd0cd24._comment create mode 100644 doc/forum/Drop_with_assistant/comment_2_527d7b6a8efa85b904111f179912d926._comment create mode 100644 doc/forum/Drop_with_assistant/comment_3_c50857506869bb1cd306b66acf37fba8._comment create mode 100644 doc/forum/Drop_with_assistant/comment_4_1ea37445d5eb96c3efa182e88e07b867._comment create mode 100644 doc/forum/Drop_with_assistant/comment_5_c08908ea5232cbe067c73ecd12d0e218._comment create mode 100644 doc/forum/Drop_with_assistant/comment_6_015134228cb865f97326fbb7193636ea._comment create mode 100644 doc/forum/Drop_with_assistant/comment_7_950759930667588f21659cd6d7065fbb._comment create mode 100644 doc/forum/Drop_with_assistant/comment_8_773e540e46adc43487323e8d38ceb2d9._comment create mode 100644 doc/forum/Drop_with_assistant/comment_9_d85d120d7219ea6c179c2619a17bdae9._comment create mode 100644 doc/forum/Effectively_replicating_backup_files.mdwn create mode 100644 doc/forum/Effectively_replicating_backup_files/comment_1_b1ab0da82db076c5244b0dcc95282ddd._comment create mode 100644 doc/forum/Effectively_replicating_backup_files/comment_2_472ab9c973b475f7f3ce7e3934f94281._comment create mode 100644 doc/forum/Effectively_replicating_backup_files/comment_3_826493bd59b81786c1f6a56f1c438004._comment create mode 100644 doc/forum/Encrypted_ssh_remote__44___synced_folders.mdwn create mode 100644 doc/forum/Encrypted_ssh_remote__44___synced_folders/comment_1_7b9b4ef614c90e0b222d24678d1b9026._comment create mode 100644 doc/forum/Error_adding_ssh_remote_in_assistant.mdwn create mode 100644 doc/forum/Error_adding_ssh_remote_in_assistant/comment_1_eecc0660db4083cc91c5330587f74610._comment create mode 100644 doc/forum/Error_adding_ssh_remote_in_assistant/comment_2_3e6aad22e8020b12ff7ef914b75281d1._comment create mode 100644 doc/forum/Error_adding_ssh_remote_in_assistant/comment_3_3ea529e16502071fc0980c6d5c60a036._comment create mode 100644 doc/forum/External_drive_syncs_git-annex_branch_but_not_master_branch.mdwn create mode 100644 doc/forum/External_drive_syncs_git-annex_branch_but_not_master_branch/comment_1_9a909e3d89061adacbd8ed370520250c._comment create mode 100644 doc/forum/External_drive_syncs_git-annex_branch_but_not_master_branch/comment_2_0dd489b264374b7b1065b89e1ff7561b._comment create mode 100644 doc/forum/Feature_Request:_add_filename_to_hash_objects.mdwn create mode 100644 doc/forum/Feature_Request:_add_filename_to_hash_objects/comment_1_73dc0a9cad486cf2d34faf064c6193b1._comment create mode 100644 doc/forum/Feature_Request:_add_filename_to_hash_objects/comment_2_f818b3ecfeb1d1dd83df4668c061718a._comment create mode 100644 doc/forum/Feature_request:_Multiple_concurrent_transfers.mdwn create mode 100644 doc/forum/Feature_request:_git_annex_copy_--auto_does_the_right_thing.mdwn create mode 100644 doc/forum/Feature_request:_git_annex_copy_--auto_does_the_right_thing/comment_1_bbac7d0810a79eb1f42a01e1b31d5c4c._comment create mode 100644 doc/forum/Feature_request:_webapp_support_for_centralized_bare_repos.mdwn create mode 100644 doc/forum/Find_files_that_lack_a_certain_field_in_metadata.mdwn create mode 100644 doc/forum/Find_files_that_lack_a_certain_field_in_metadata/comment_1_476e52563ccd3ad1b43e3a2da4dfaa82._comment create mode 100644 doc/forum/First_attempt_at_an_OSX_launcher___40__.app__41__.mdwn create mode 100644 doc/forum/First_attempt_at_an_OSX_launcher___40__.app__41__/comment_1_97c261b9080c5ecc5424683066bbe05b._comment create mode 100644 doc/forum/First_attempt_at_an_OSX_launcher___40__.app__41__/comment_2_ae45f9703b635c235409682cf252d36c._comment create mode 100644 doc/forum/First_attempt_at_an_OSX_launcher___40__.app__41__/comment_3_066ca31a2e5dfe55a58092ba85231c7c._comment create mode 100644 doc/forum/First_attempt_at_an_OSX_launcher___40__.app__41__/comment_4_a0a9f7f44cadb8036fcddfc21bb0781f._comment create mode 100644 doc/forum/First_attempt_at_an_OSX_launcher___40__.app__41__/comment_5_92240b3f8629f1f2bbe1829700082a79._comment create mode 100644 doc/forum/Fixing_up_corrupt_annexes.mdwn create mode 100644 doc/forum/Fixing_up_corrupt_annexes/comment_1_cea21f96bcfb56aaab7ea03c1c804d2d._comment create mode 100644 doc/forum/Fixing_up_corrupt_annexes/comment_2_5cdd2fcfa61b3f6255e5ad63a3ab00ce._comment create mode 100644 doc/forum/Folders_for___34__actions__34___-_now_that_views_have_disrupted_the_file_structure__63__.mdwn create mode 100644 doc/forum/Forcing_one_repo_to_contain_a_copy_of_all_files.mdwn create mode 100644 doc/forum/Forcing_one_repo_to_contain_a_copy_of_all_files/comment_1_702b1b94c735f1b9cde16daa77a80c12._comment create mode 100644 doc/forum/Forcing_one_repo_to_contain_a_copy_of_all_files/comment_2_3df7fcbcd482bb9377ead238b314995b._comment create mode 100644 doc/forum/GPG_passphrase_handling.mdwn create mode 100644 doc/forum/GPG_passphrase_handling/comment_1_11ba130e8bea6698858d0a1a5b01830f._comment create mode 100644 doc/forum/GPG_passphrase_handling/comment_2_ef9d58d15b7bbe0b3c7140bb01d73a31._comment create mode 100644 doc/forum/GPG_passphrase_handling/comment_3_84eb129c8483b87b3ae6ecaf8b4a8309._comment create mode 100644 doc/forum/GPG_passphrase_handling/comment_4_8724297f6d7ac140ab395a940bab0d7d._comment create mode 100644 doc/forum/Generating_a_Temp_View_of_Available_Files.mdwn create mode 100644 doc/forum/Getting_started_with_Amazon_S3.mdwn create mode 100644 doc/forum/Getting_started_with_Amazon_S3/comment_1_f50883133d5d4903cc95c0dcaa52d052._comment create mode 100644 doc/forum/Getting_started_with_Amazon_S3/comment_2_e90aa3259d9a12cd67daa27d42d69ab5._comment create mode 100644 doc/forum/Getting_started_with_Amazon_S3/comment_3_c3adce7c0f29e71ed9dd07103ede2c1a._comment create mode 100644 doc/forum/Git-annex_assistant_configuration_file__40__s__41___location__40__s__41__.mdwn create mode 100644 doc/forum/Git-annex_assistant_configuration_file__40__s__41___location__40__s__41__/comment_1_5baffd4d6994bbcb23614b17777a0ffe._comment create mode 100644 doc/forum/Git_Annex_Assistant:_How_to_add_a_remote__63__.mdwn create mode 100644 doc/forum/Git_Annex_Assistant:_How_to_add_a_remote__63__/comment_1_d0a3d0090928790d5a05e9f8e5f05320._comment create mode 100644 doc/forum/Git_Annex_Sync_Delinks_Files.mdwn create mode 100644 doc/forum/Git_Annex_Sync_Delinks_Files/comment_1_8b03707777a9d8e38715cb77d2a0addc._comment create mode 100644 doc/forum/Git_Annex_Sync_Delinks_Files/comment_2_a625e7d88e321532ace103548b31b67b._comment create mode 100644 doc/forum/Git_Annex_Sync_Delinks_Files/comment_3_5278164dab570755ed58afe466dfad42._comment create mode 100644 doc/forum/Git_Annex_Sync_Delinks_Files/comment_4_e43ede0bdc20de9aa10ab6ce387d8582._comment create mode 100644 doc/forum/Git_Annex_Sync_Delinks_Files/comment_5_dc71987f0e19f04a920561201f9552b4._comment create mode 100644 doc/forum/Git_Annex_Sync_Delinks_Files/comment_6_257a89f81858659c4dac4d116e7cf0a3._comment create mode 100644 doc/forum/Git_Annex_Transfer_Protocols.mdwn create mode 100644 doc/forum/Git_Annex_Transfer_Protocols/comment_1_a870ec991078c95a6bb683d6962ab56e._comment create mode 100644 doc/forum/Git_Annex_Transfer_Protocols/comment_2_71419376ef50a679ea8f0f9e16991c17._comment create mode 100644 doc/forum/Git_Annex_Transfer_Protocols/comment_3_fea43664a500111ca99f4043e0dadb14._comment create mode 100644 doc/forum/Git_Annex_Transfer_Protocols/comment_4_56fb2dab1d4030c9820be32b495afdf0._comment create mode 100644 doc/forum/Git_Annex_Transfer_Protocols/comment_5_a6ec9c5a4a3c0bac1df87f1df9be140b._comment create mode 100644 doc/forum/Git_Annex_Transfer_Protocols/comment_6_1678452fb7114aeabcf0cc3d5f6c69b0._comment create mode 100644 doc/forum/Git_annex___39__corrupting__39___itself.mdwn create mode 100644 doc/forum/Git_annex___39__corrupting__39___itself/comment_1_bcf50a215e2f8771e098aadfff4c300c._comment create mode 100644 doc/forum/Git_annex___39__corrupting__39___itself/comment_3_75f957e7be6c1ad8936c0a2a5374db3e._comment create mode 100644 doc/forum/Git_annex___39__corrupting__39___itself/comment_3_ab062b1df3b55fd49852a6220c98249e._comment create mode 100644 doc/forum/Git_annex___39__corrupting__39___itself/comment_4_45974f60a81ed2d00b87ffb1a7963c6f._comment create mode 100644 doc/forum/Git_annex_assistant_in_command_line.mdwn create mode 100644 doc/forum/Git_annex_assistant_in_command_line/comment_1_ce05226307ade8db90ada2dbf290bd58._comment create mode 100644 doc/forum/Git_annex_assistant_on_EC2.mdwn create mode 100644 doc/forum/Git_annex_assistant_on_EC2/comment_1_bbdb4611373117a2176c225378110a05._comment create mode 100644 doc/forum/Git_annex_assistant_on_EC2/comment_2_614ed11f7134137d6376d36a61c293f5._comment create mode 100644 doc/forum/Git_annex_on_Windows.mdwn create mode 100644 doc/forum/Git_annex_on_Windows/comment_1_da24ba0219a164f9ab93fe75dd85127e._comment create mode 100644 doc/forum/Git_annex_on_Windows/comment_2_c0880ce3ee13d388ab5b46a740170845._comment create mode 100644 doc/forum/Git_annex_on_Windows/comment_3_70c22716fde60d14fd0c7e74acf4a224._comment create mode 100644 doc/forum/Git_annex_on_Windows/comment_4_b9232deab6bc5036d7339aa202013218._comment create mode 100644 doc/forum/Git_annex_on_Windows/comment_5_27af3c431b50b540d2bd1d3af3f21080._comment create mode 100644 doc/forum/Git_annex_on_Windows/comment_6_79fb5ec1b47593ab3355543c5499284a._comment create mode 100644 doc/forum/Git_annex_on_Windows/comment_7_75d4450b4608ad0b453bc69159e708de._comment create mode 100644 doc/forum/Git_annex_on_Windows/comment_8_e4e5ad0cda34bb597fe1bb804acc15e9._comment create mode 100644 doc/forum/Git_annex_syncing_speed__44___possible__63__.mdwn create mode 100644 doc/forum/Git_annex_syncing_speed__44___possible__63__/comment_1_8aa224b3016dc38e4cea8ee1865a3ab6._comment create mode 100644 doc/forum/Git_repos_in_git_annex__63__.mdwn create mode 100644 doc/forum/Git_repos_in_git_annex__63__/comment_1_8aaa0d83e8fcd5997f6b0097f3b21622._comment create mode 100644 doc/forum/Git_repositories_in_the_annex__63__.mdwn create mode 100644 doc/forum/Gitolite_problems.mdwn create mode 100644 doc/forum/Gitolite_problems/comment_1_3a41f9b6bddc060b1fa9e35b9ce8b55f._comment create mode 100644 doc/forum/Gitolite_problems/comment_2_ef156bf7a1e17496c5fc1f592d45f2ad._comment create mode 100644 doc/forum/Handling_web_special_remote_when_content_changes__63__.mdwn create mode 100644 doc/forum/Handling_web_special_remote_when_content_changes__63__/comment_1_05ee6a1b1943ef3c90634e52233bde1c._comment create mode 100644 doc/forum/Handling_web_special_remote_when_content_changes__63__/comment_2_48d82e391812d8ec0d4e6562d0607fe7._comment create mode 100644 doc/forum/Help_Windows_walkthrough.mdwn create mode 100644 doc/forum/Help_Windows_walkthrough/comment_1_5fc22393a1b28235eabb2871ad83d0a7._comment create mode 100644 doc/forum/Help_on_my_usecase.mdwn create mode 100644 doc/forum/Help_on_my_usecase/comment_1_a35b35c7927640f21d47c3df4f91dabb._comment create mode 100644 doc/forum/Help_with_syncing_file_contents.mdwn create mode 100644 doc/forum/Help_with_syncing_file_contents/comment_1_7ec34de3140983739080115c82966bf5._comment create mode 100644 doc/forum/Help_with_syncing_file_contents/comment_2_7dba58d3c62d6f64a270298e4e4329a4._comment create mode 100644 doc/forum/Help_with_syncing_file_contents/comment_3_b26cfa20dc81517d93e760f4809bdc24._comment create mode 100644 doc/forum/How_can_I_use_git-annex_get_a_list_of_files_in_directory_that_have_content__63___.mdwn create mode 100644 doc/forum/How_can_I_use_git-annex_get_a_list_of_files_in_directory_that_have_content__63___/comment_1_e897d8fc10474cf865279dc22f22ecb7._comment create mode 100644 doc/forum/How_can_I_use_git-annex_get_a_list_of_files_in_directory_that_have_content__63___/comment_2_3af326205db6ee04f2a8644baa1dd566._comment create mode 100644 doc/forum/How_do_I_cleanly_remove_an_Android_git-annex_installation__63__.mdwn create mode 100644 doc/forum/How_do_I_cleanly_remove_an_Android_git-annex_installation__63__/comment_1_e14757c2c106770c2d7069ace4987b3b._comment create mode 100644 doc/forum/How_do_I_do_with_.gitrefs__47_____63__.mdwn create mode 100644 doc/forum/How_do_I_do_with_.gitrefs__47_____63__/comment_1_5e235af2ea13fd4f6a226c842f69965e._comment create mode 100644 doc/forum/How_do_I_do_with_.gitrefs__47_____63__/comment_2_50d0c643537175b514d5eae604fb5bea._comment create mode 100644 doc/forum/How_do_I_do_with_.gitrefs__47_____63__/comment_3_3d342c32b14c7edbece596ba970a8415._comment create mode 100644 doc/forum/How_do_I_dropunused_with_an_rsync_remote__63__.mdwn create mode 100644 doc/forum/How_do_I_dropunused_with_an_rsync_remote__63__/comment_1_8db3cb5348b845eb99c2c829957db9ea._comment create mode 100644 doc/forum/How_do_I_dropunused_with_an_rsync_remote__63__/comment_2_6cc909d9d74bc1ccb8a7b0d7d234c7cd._comment create mode 100644 doc/forum/How_do_I_dropunused_with_an_rsync_remote__63__/comment_3_f24d678e4192a70322aa164ed9b71fc8._comment create mode 100644 doc/forum/How_do_I_dropunused_with_an_rsync_remote__63__/comment_4_9233decd0aaf9211447f36e0d9346445._comment create mode 100644 doc/forum/How_do_I_dropunused_with_an_rsync_remote__63__/comment_5_e1deb110f752e5495d5c77ec444abac5._comment create mode 100644 doc/forum/How_do_I_get_rid_of_a_wrong_remote_uuid__63__.mdwn create mode 100644 doc/forum/How_do_I_get_rid_of_a_wrong_remote_uuid__63__/comment_1_b3c215cedba51fb47992ef10c60d6acc._comment create mode 100644 doc/forum/How_do_I_get_rid_of_a_wrong_remote_uuid__63__/comment_2_85415e1fceb737919cc1cd9f37242458._comment create mode 100644 doc/forum/How_do_I_get_rid_of_a_wrong_remote_uuid__63__/comment_3_fb3a591dc60182f7922fc2b5c24f50f1._comment create mode 100644 doc/forum/How_do_I_get_rid_of_a_wrong_remote_uuid__63__/comment_4_aed0be32e579c7a39c63aa7e3ec5f67b._comment create mode 100644 doc/forum/How_do_I_get_rid_of_a_wrong_remote_uuid__63__/comment_5_0c9a6c8a92d6c6e04ae3a8349b799c60._comment create mode 100644 doc/forum/How_do_you_know_when_something_fails_a_fsck__63__.mdwn create mode 100644 doc/forum/How_do_you_know_when_something_fails_a_fsck__63__/comment_1_1c14981916dd55376d5e9f95023556cb._comment create mode 100644 doc/forum/How_does_one_change_git-annex_assistant__39__s_web_browser__63__.mdwn create mode 100644 doc/forum/How_does_one_change_git-annex_assistant__39__s_web_browser__63__/comment_1_f4402eabda2327da3a0bbc64ed3baf9a._comment create mode 100644 doc/forum/How_does_one_change_git-annex_assistant__39__s_web_browser__63__/comment_2_cdb41f2c7b6bc5bf40d88582dcbf45aa._comment create mode 100644 doc/forum/How_does_one_change_git-annex_assistant__39__s_web_browser__63__/comment_3_ca75e928c245eb23a02b5f40ec69cbb1._comment create mode 100644 doc/forum/How_does_one_change_git-annex_assistant__39__s_web_browser__63__/comment_4_1635f136909711295b9b70d1255e0378._comment create mode 100644 doc/forum/How_does_one_change_git-annex_assistant__39__s_web_browser__63__/comment_5_ee0cbe9498c518de98480a2ad229f685._comment create mode 100644 doc/forum/How_does_one_change_git-annex_assistant__39__s_web_browser__63__/comment_6_799b9d9d3ffbc2c14eca8d442e2aff8c._comment create mode 100644 doc/forum/How_does_one_change_git-annex_assistant__39__s_web_browser__63__/comment_7_71ff45948487e9ac8de809a5ccc3d874._comment create mode 100644 doc/forum/How_does_one_change_the_number_of_simultaneous_uploads.mdwn create mode 100644 doc/forum/How_does_one_change_the_number_of_simultaneous_uploads/comment_1_d5559994ee45a5c185a55c9a4d824aa4._comment create mode 100644 doc/forum/How_to_cancel_an_add__63__.mdwn create mode 100644 doc/forum/How_to_cancel_an_add__63__/comment_1_f768ce5dc7c76f96ee6eb352f167be44._comment create mode 100644 doc/forum/How_to_copy__47__duplicate_all_data_from_rsync__47__ssh_backend_to_other_backend__63__.mdwn create mode 100644 doc/forum/How_to_copy__47__duplicate_all_data_from_rsync__47__ssh_backend_to_other_backend__63__/comment_1_7973928b1aa9e0fcfeb6bf80885441f5._comment create mode 100644 doc/forum/How_to_deal_with_renamed_files_in_direct_mode__63__.mdwn create mode 100644 doc/forum/How_to_deal_with_renamed_files_in_direct_mode__63__/comment_1_fe38fedbbc9e4a9e13bf19950e63c7ac._comment create mode 100644 doc/forum/How_to_define_an_alternative_remote_url_for_a_git_remote_repository__63__.mdwn create mode 100644 doc/forum/How_to_define_an_alternative_remote_url_for_a_git_remote_repository__63__/comment_1_52918b5ec25e55837215439fe1bb1a14._comment create mode 100644 doc/forum/How_to_define_an_alternative_remote_url_for_a_git_remote_repository__63__/comment_2_3a1567c9f484b5e12e5560cdcc2cfddd._comment create mode 100644 doc/forum/How_to_define_an_alternative_remote_url_for_a_git_remote_repository__63__/comment_3_48c3a80c14a85f27d742482b2ccbe628._comment create mode 100644 doc/forum/How_to_delete_a_remote__63__.mdwn create mode 100644 doc/forum/How_to_delete_a_remote__63__/comment_1_8cba186bb67079ff41bf6d0b04613f4a._comment create mode 100644 doc/forum/How_to_delete_a_remote__63__/comment_2_33c429ffa7e9e2ed9c5fac760ee8e82c._comment create mode 100644 doc/forum/How_to_delete_a_remote__63__/comment_3_e9c5508092ca2983f458b16bf1e07082._comment create mode 100644 doc/forum/How_to_destroy_a_master_annex_and_all_remotes_with_git_annex_assistant_and_ext4.mdwn create mode 100644 doc/forum/How_to_destroy_a_master_annex_and_all_remotes_with_git_annex_assistant_and_ext4/comment_1_42ca6cfbbb79fe63514805b8119ac16b._comment create mode 100644 doc/forum/How_to_destroy_a_master_annex_and_all_remotes_with_git_annex_assistant_and_ext4/comment_2_c94ce6a9767c624e2445a7d9eea40396._comment create mode 100644 doc/forum/How_to_destroy_a_master_annex_and_all_remotes_with_git_annex_assistant_and_ext4/comment_3_bcda51053b62bbb20ce71a59469e1b26._comment create mode 100644 doc/forum/How_to_destroy_a_master_annex_and_all_remotes_with_git_annex_assistant_and_ext4/comment_4_48e5b9eae920e5f13812de8d6f6bc640._comment create mode 100644 doc/forum/How_to_destroy_a_master_annex_and_all_remotes_with_git_annex_assistant_and_ext4/comment_5_787c0bfdc1d309db1486c3a37723a957._comment create mode 100644 doc/forum/How_to_destroy_a_master_annex_and_all_remotes_with_git_annex_assistant_and_ext4/comment_6_8894beb06443f234e9200b03b5f3badf._comment create mode 100644 doc/forum/How_to_destroy_a_master_annex_and_all_remotes_with_git_annex_assistant_and_ext4/comment_7_457f62ee3e58f68a55f66c5bde6002fd._comment create mode 100644 doc/forum/How_to_destroy_a_master_annex_and_all_remotes_with_git_annex_assistant_and_ext4/comment_8_bd2b412116a66107bc0ff0efd7e39a58._comment create mode 100644 doc/forum/How_to_expire_old_versions_of_files_that_have_been_edited__63__.mdwn create mode 100644 doc/forum/How_to_expire_old_versions_of_files_that_have_been_edited__63__/comment_1_dccf4dc4483d08e5e2936b2cadeafeaf._comment create mode 100644 doc/forum/How_to_expire_old_versions_of_files_that_have_been_edited__63__/comment_2_5710294c1c8652c12b6df2233255a45e._comment create mode 100644 doc/forum/How_to_handle_the_git-annex_branch__63__.mdwn create mode 100644 doc/forum/How_to_handle_the_git-annex_branch__63__/comment_1_800bd55b322e72f229882d7fd3888b14._comment create mode 100644 doc/forum/How_to_know_why_is_git-annex_uploading_a_file_to_a_transfer_repository.mdwn create mode 100644 doc/forum/How_to_know_why_is_git-annex_uploading_a_file_to_a_transfer_repository/comment_1_17db96492e6bc0e243fc7cb62565c4c4._comment create mode 100644 doc/forum/How_to_know_why_is_git-annex_uploading_a_file_to_a_transfer_repository/comment_2_e772ea0383ac690cbcbcf125258986cf._comment create mode 100644 doc/forum/How_to_make_Maven_releases_work_with_git_annex___63__.mdwn create mode 100644 doc/forum/How_to_make_Maven_releases_work_with_git_annex___63__/comment_1_9298aa55771b68873de02e6a7964bbdc._comment create mode 100644 doc/forum/How_to_prevent_the_assistant_from_downloading_all_data__63__.mdwn create mode 100644 doc/forum/How_to_prevent_the_assistant_from_downloading_all_data__63__/comment_1_fd8b287758ad77b3527ae71017cffabf._comment create mode 100644 doc/forum/How_to_prevent_the_assistant_from_downloading_all_data__63__/comment_2_e8e75b4451aaf55461edf2f3d68797ed._comment create mode 100644 doc/forum/How_to_rename_a_remote__63__.mdwn create mode 100644 doc/forum/How_to_rename_a_remote__63__/comment_1_a9bfbd82f7bb47661f0d9e0e0d904332._comment create mode 100644 doc/forum/How_to_resolve_a_interrupted_merge_in_direct_mode__63__.mdwn create mode 100644 doc/forum/How_to_resolve_a_interrupted_merge_in_direct_mode__63__/comment_1_8e2a14842b44844f90c80b862a1b3a6d._comment create mode 100644 doc/forum/How_to_resolve_a_interrupted_merge_in_direct_mode__63__/comment_2_031ab6b5a2765ed9e2b185b24a8cbd78._comment create mode 100644 doc/forum/How_to_resolve_a_interrupted_merge_in_direct_mode__63__/comment_3_93f20519483837c59a75821621e22dee._comment create mode 100644 doc/forum/How_to_restore_symlinks.mdwn create mode 100644 doc/forum/How_to_restore_symlinks/comment_1_c67e752cf7d5431096fab4b3304790a7._comment create mode 100644 doc/forum/How_to_restore_symlinks/comment_2_f9ec6096595e2c149c48924e3b54542f._comment create mode 100644 doc/forum/How_to_restore_symlinks/comment_3_4ff80729787a2a4e2baf05dd1db37da3._comment create mode 100644 doc/forum/How_to_retroactively_annex_a_file_already_in_a_git_repo.mdwn create mode 100644 doc/forum/How_to_set_up_two_assistants_with_one_shared_transfer_repository__63__.mdwn create mode 100644 doc/forum/How_to_set_up_two_assistants_with_one_shared_transfer_repository__63__/comment_1_bedaf308cfc70b9e751914a400ebcbc2._comment create mode 100644 doc/forum/How_to_set_up_two_assistants_with_one_shared_transfer_repository__63__/comment_2_d665b1514253c8aa487ebf8b2728e3b1._comment create mode 100644 doc/forum/How_to_set_up_two_assistants_with_one_shared_transfer_repository__63__/comment_3_aef42387a3673ab6710fb23e878d7e17._comment create mode 100644 doc/forum/How_to_set_up_two_assistants_with_one_shared_transfer_repository__63__/comment_4_bfbcc041db472f4808979e6b3d7c4be2._comment create mode 100644 doc/forum/How_to_solve__problem_with_diverging_repositories_handled_by_the_assistant__63__.mdwn create mode 100644 doc/forum/How_to_solve__problem_with_diverging_repositories_handled_by_the_assistant__63__/comment_1_1c913395f076ee203caaab057da8afbe._comment create mode 100644 doc/forum/How_to_solve__problem_with_diverging_repositories_handled_by_the_assistant__63__/comment_2_081793c52bf15c74a7f48a67c49ff818._comment create mode 100644 doc/forum/How_to_solve__problem_with_diverging_repositories_handled_by_the_assistant__63__/comment_3_f8e0376beb486cf8ce52384ff511ecf2._comment create mode 100644 doc/forum/Howto_remove_a_repository__63__.mdwn create mode 100644 doc/forum/Howto_remove_a_repository__63__/comment_1_b55fa4e92bb457ecaa5ca8f5cee7be1d._comment create mode 100644 doc/forum/Howto_remove_unused_files.mdwn create mode 100644 doc/forum/Howto_remove_unused_files/comment_1_f2a7948268ce3cb3967a9fdd8ccc570a._comment create mode 100644 doc/forum/Howto_remove_unused_files/comment_2_9b4d198c2d8a52adef3d166a8196fc0d._comment create mode 100644 doc/forum/Howto_remove_unused_files/comment_3_441d10901d5c055ac3ed2a6cb61c075c._comment create mode 100644 doc/forum/Import_options.mdwn create mode 100644 doc/forum/Import_options/comment_1_118a5f978090a3909299876a01c0adec._comment create mode 100644 doc/forum/Import_options/comment_2_21da91f08cb6b28ae3e79ade033db516._comment create mode 100644 doc/forum/Is_an_automagic_upgrade_of_the_object_directory_safe__63__.mdwn create mode 100644 doc/forum/Is_an_automagic_upgrade_of_the_object_directory_safe__63__/comment_1_c25900b9d2d62cc0b8c77150bcfebadf._comment create mode 100644 doc/forum/Is_git-annex_in_a_precarious_state_before_the_initial_commit__63__.mdwn create mode 100644 doc/forum/Is_git-annex_in_a_precarious_state_before_the_initial_commit__63__/comment_1_f9decde3955f10148febc4646fba5a68._comment create mode 100644 doc/forum/Is_git-annex_in_a_precarious_state_before_the_initial_commit__63__/comment_2_ed32a48edce4f150bedf24cfe91de254._comment create mode 100644 doc/forum/Is_git-annex_in_a_precarious_state_before_the_initial_commit__63__/comment_3_ef9618850e5e688bac3c646983f00ed8._comment create mode 100644 doc/forum/Is_git-annex_in_a_precarious_state_before_the_initial_commit__63__/comment_4_4bf460c5826c36b205e418c4f3f7d770._comment create mode 100644 doc/forum/Is_it_possible_to_make_git-sync_not_nullify_symlinks__63__.mdwn create mode 100644 doc/forum/Is_it_possible_to_make_git-sync_not_nullify_symlinks__63__/comment_1_d6f2d2cdc5f4ffde9eee9f3a8c215a06._comment create mode 100644 doc/forum/Lacking_webapp_on_Trisquel__47__Ubuntu_Precise.mdwn create mode 100644 doc/forum/Lacking_webapp_on_Trisquel__47__Ubuntu_Precise/comment_1_6bd27bd31833336c1df783253378ccae._comment create mode 100644 doc/forum/Let_watch_selectively_annex_files.mdwn create mode 100644 doc/forum/Let_watch_selectively_annex_files/comment_1_8379de87d16502d9aadf252da01e4d9a._comment create mode 100644 doc/forum/Let_watch_selectively_annex_files/comment_2_2219ff6b4dc927eb2a299cd1af90aed8._comment create mode 100644 doc/forum/Link_to_local_remote_instead_of_broken_link_when_possible__63__.mdwn create mode 100644 doc/forum/Link_to_local_remote_instead_of_broken_link_when_possible__63__/comment_1_ce0464d5fca6ada9f1477831fd47ce09._comment create mode 100644 doc/forum/Links_or_actual_files__63___Confused__33__.mdwn create mode 100644 doc/forum/Links_or_actual_files__63___Confused__33__/comment_1_779cee2448d7070b1dd636d01296c01e._comment create mode 100644 doc/forum/Links_or_actual_files__63___Confused__33__/comment_2_bccda88697ab7beec0b9fe9ee0230688._comment create mode 100644 doc/forum/Links_or_actual_files__63___Confused__33__/comment_3_c2a9da3f03b55ff294dc0d2010380119._comment create mode 100644 doc/forum/Local_and_remote_in_direct_mode.mdwn create mode 100644 doc/forum/Local_and_remote_in_direct_mode/comment_1_45f89ebcb6092d1b2582feebc8a5e9d7._comment create mode 100644 doc/forum/Locking_and_then_unlocking_a_file_results_in_file_changed_warning.mdwn create mode 100644 doc/forum/Locking_and_then_unlocking_a_file_results_in_file_changed_warning/comment_1_25a04c7345f5b626aa71524603c833ed._comment create mode 100644 doc/forum/Locking_and_then_unlocking_a_file_results_in_file_changed_warning/comment_2_7146a3c69749b9b1001fffc6e7a8bcda._comment create mode 100644 doc/forum/Locking_and_then_unlocking_a_file_results_in_file_changed_warning/comment_3_fd39e6ceffd9bf0709658c34945d8699._comment create mode 100644 doc/forum/Looking_at_the_webapp_on_OSX.mdwn create mode 100644 doc/forum/Looking_at_the_webapp_on_OSX/comment_1_68820f2f469356633c1abb18a47e0c59._comment create mode 100644 doc/forum/Looking_at_the_webapp_on_OSX/comment_2_4ce86546d8a135df9cfab46b4612fa0b._comment create mode 100644 doc/forum/Looking_at_the_webapp_on_OSX/comment_3_6d398a2cceff14a1b774b85ee1725073._comment create mode 100644 doc/forum/Looking_at_the_webapp_on_OSX/comment_4_5e503787a4b1d3534c5e20da5480b763._comment create mode 100644 doc/forum/Looking_at_the_webapp_on_OSX/comment_5_c735841bc230efc61594ea013fc2902b._comment create mode 100644 doc/forum/Looking_at_the_webapp_on_OSX/comment_6_0e489fbfc89d282e9eb47f1b814ff70c._comment create mode 100644 doc/forum/Lyve_Home.mdwn create mode 100644 doc/forum/Make_whereis_output_more_compact.mdwn create mode 100644 doc/forum/Making_git-annex_a_self-funded_project__63__.mdwn create mode 100644 doc/forum/Making_git-annex_a_self-funded_project__63__/comment_1_4a1ba95b7231ba973ddb672d2419e28c._comment create mode 100644 doc/forum/Making_git-annex_a_self-funded_project__63__/comment_2_7c476ae92e63c991f229708678874ca2._comment create mode 100644 doc/forum/Making_git-annex_less_necessary.mdwn create mode 100644 doc/forum/Making_git-annex_less_necessary/comment_1_03faaa3866778d24cd03887b85dc9954._comment create mode 100644 doc/forum/Making_git-annex_less_necessary/comment_2_2db02a94dffd525885c9d7fc6c5fa464._comment create mode 100644 doc/forum/Making_git-annex_less_necessary/comment_3_429ec656e0ac02f98843f8d7f3c02d6a._comment create mode 100644 doc/forum/Making_git-annex_less_necessary/comment_4_384813dd022dfd9c1ef14e0f1479a123._comment create mode 100644 doc/forum/Managing_a_large_number_of_files_archived_on_many_pieces_of_read-only_medium___40__E.G._DVDs__41__.mdwn create mode 100644 doc/forum/Managing_a_large_number_of_files_archived_on_many_pieces_of_read-only_medium___40__E.G._DVDs__41__/comment_10_a061d300b718ad943c940e122cc57220._comment create mode 100644 doc/forum/Managing_a_large_number_of_files_archived_on_many_pieces_of_read-only_medium___40__E.G._DVDs__41__/comment_11_76529080054407570611b4357ce4f3ed._comment create mode 100644 doc/forum/Managing_a_large_number_of_files_archived_on_many_pieces_of_read-only_medium___40__E.G._DVDs__41__/comment_12_9acf5ce41a023f3848a51891cceeb51b._comment create mode 100644 doc/forum/Managing_a_large_number_of_files_archived_on_many_pieces_of_read-only_medium___40__E.G._DVDs__41__/comment_1_25e65ee3949e7d918376298cf11585f2._comment create mode 100644 doc/forum/Managing_a_large_number_of_files_archived_on_many_pieces_of_read-only_medium___40__E.G._DVDs__41__/comment_2_8a71ca048f9de29a198a6afb17d5315e._comment create mode 100644 doc/forum/Managing_a_large_number_of_files_archived_on_many_pieces_of_read-only_medium___40__E.G._DVDs__41__/comment_3_e3d1d3a3d3d831432ec940a8ab6f31e9._comment create mode 100644 doc/forum/Managing_a_large_number_of_files_archived_on_many_pieces_of_read-only_medium___40__E.G._DVDs__41__/comment_4_26a33eae98b4faaf6baf6635e3d28a8f._comment create mode 100644 doc/forum/Managing_a_large_number_of_files_archived_on_many_pieces_of_read-only_medium___40__E.G._DVDs__41__/comment_5_49ac298d39c824b0e52a239961463e09._comment create mode 100644 doc/forum/Managing_a_large_number_of_files_archived_on_many_pieces_of_read-only_medium___40__E.G._DVDs__41__/comment_6_55a4a3616ea59654da1c2f9902561e3b._comment create mode 100644 doc/forum/Managing_a_large_number_of_files_archived_on_many_pieces_of_read-only_medium___40__E.G._DVDs__41__/comment_7_92a2af3e0e328bb48bcc67a69187ee57._comment create mode 100644 doc/forum/Managing_a_large_number_of_files_archived_on_many_pieces_of_read-only_medium___40__E.G._DVDs__41__/comment_8_f6e39e71882d55cdc061166aea3e2bd3._comment create mode 100644 doc/forum/Managing_a_large_number_of_files_archived_on_many_pieces_of_read-only_medium___40__E.G._DVDs__41__/comment_9_6c45a6264d69e22800c329a0f8a2d470._comment create mode 100644 doc/forum/Managing_multiple_annexes_with_assistant__63__.mdwn create mode 100644 doc/forum/Managing_multiple_annexes_with_assistant__63__/comment_1_ba8c70e4a46441b48ad910625636eee5._comment create mode 100644 doc/forum/Managing_multiple_annexes_with_assistant__63__/comment_2_4b4f0a7d84a51ae92536e2c190256069._comment create mode 100644 doc/forum/Managing_multiple_annexes_with_assistant__63__/comment_3_86daadc565f96db5db13b6dbcbc66db3._comment create mode 100644 doc/forum/Managing_multiple_annexes_with_assistant__63__/comment_4_e43d71ddfdfdb7bcb13bfb894de6a5ec._comment create mode 100644 doc/forum/Managing_multiple_annexes_with_assistant__63__/comment_5_e94d33be83b45918d1a39d6e16fba4b4._comment create mode 100644 doc/forum/Managing_multiple_repositories_concurrently__63__.mdwn create mode 100644 doc/forum/Managing_multiple_repositories_concurrently__63__/comment_1_ebec1ddad71e961cdc9b21cbddfbcdaf._comment create mode 100644 doc/forum/Manual_Setup_of_a_Central_Repo.mdwn create mode 100644 doc/forum/Manual_Setup_of_a_Central_Repo/comment_1_3a163fd5629dc40423f1290a78ae1c07._comment create mode 100644 doc/forum/Manual_mode_option_in_assistant_auto-syncs.mdwn create mode 100644 doc/forum/Manual_mode_option_in_assistant_auto-syncs/comment_1_4a0468b6ca2ffff8ef8f19800597567d._comment create mode 100644 doc/forum/Manual_webapp_behaviour_on_ARM.mdwn create mode 100644 doc/forum/Missing_git-annex.linux__47__runshell.mdwn create mode 100644 doc/forum/Missing_git-annex.linux__47__runshell/comment_1_f29a5105649579ef15e79d983c4e1f8e._comment create mode 100644 doc/forum/Moving_large_files_within_the_repo_without_copying___63__.mdwn create mode 100644 doc/forum/Moving_large_files_within_the_repo_without_copying___63__/comment_1_9e3290138133d5a23a80f72342f47ec4._comment create mode 100644 doc/forum/Moving_large_files_within_the_repo_without_copying___63__/comment_2_232b77894dda51d02cbc34bd25d3213b._comment create mode 100644 doc/forum/Moving_large_files_within_the_repo_without_copying___63__/comment_3_d35ac1bdb3fa6e303ad92348ba174158._comment create mode 100644 doc/forum/Moving_large_files_within_the_repo_without_copying___63__/comment_4_4b443ec6b47eaabe214d0c2222083e4a._comment create mode 100644 doc/forum/Moving_older_version__39__s_file_content_without_doing_checkout.mdwn create mode 100644 doc/forum/Moving_older_version__39__s_file_content_without_doing_checkout/comment_1_f114b75b29123453758b493fae7f5167._comment create mode 100644 doc/forum/Moving_older_version__39__s_file_content_without_doing_checkout/comment_2_e377b7614c2961b460a10e285f3db274._comment create mode 100644 doc/forum/Moving_older_version__39__s_file_content_without_doing_checkout/comment_3_d251958795ab0867c65cf182e54a6ffe._comment create mode 100644 doc/forum/My_first_impressions_after_some_weeks_with_git-annex_assistant.mdwn create mode 100644 doc/forum/My_first_impressions_after_some_weeks_with_git-annex_assistant/comment_1_9d4019a54fb508e286a5d6d2660361d9._comment create mode 100644 doc/forum/My_first_impressions_after_some_weeks_with_git-annex_assistant/comment_2_109534a45881ce94a4586c8a83945f9f._comment create mode 100644 doc/forum/Need_new_build_instructions_for_Debian_stable.mdwn create mode 100644 doc/forum/Need_new_build_instructions_for_Debian_stable/comment_1_8c1eea6dfec8b7e1c7a371b6e9c26118._comment create mode 100644 doc/forum/Need_new_build_instructions_for_Debian_stable/comment_2_f6ff8306c946219dbe39bb8938a349ab._comment create mode 100644 doc/forum/Need_new_build_instructions_for_Debian_stable/comment_3_bcda70cbfc7c1a14fa82da70f9f876e2._comment create mode 100644 doc/forum/Need_some_help_to_fix_my_repository.mdwn create mode 100644 doc/forum/Need_some_help_to_fix_my_repository/comment_1_f0d279c530b796b2c93d793f85d147e8._comment create mode 100644 doc/forum/Need_some_help_to_fix_my_repository/comment_2_a3fcfa1f8eadec5fa8a9efacca174048._comment create mode 100644 doc/forum/Need_some_help_to_fix_my_repository/comment_3_7878f9b76ddfa3392c9ec6a1810cb745._comment create mode 100644 doc/forum/New_git-annex_integration_mode_for_Emacs_users.mdwn create mode 100644 doc/forum/New_user_misunderstandings.mdwn create mode 100644 doc/forum/New_user_misunderstandings/comment_1_c1785924109b5d5cde9aa3d3460cf955._comment create mode 100644 doc/forum/Newbie_stuck_at___34__Unable_to_connect_to_the_Jabber_server__34__.mdwn create mode 100644 doc/forum/Newbie_stuck_at___34__Unable_to_connect_to_the_Jabber_server__34__/comment_1_59158afcedac18a7285d57491b2a468a._comment create mode 100644 doc/forum/Newbie_stuck_at___34__Unable_to_connect_to_the_Jabber_server__34__/comment_2_2a70ac08bb95774415b09dab7d7f8605._comment create mode 100644 doc/forum/Newbie_stuck_at___34__Unable_to_connect_to_the_Jabber_server__34__/comment_3_92a52b523ed4c68b70ddcabc2a050b76._comment create mode 100644 doc/forum/Newbie_stuck_at___34__Unable_to_connect_to_the_Jabber_server__34__/comment_4_c52a75761ea107f6d69c09bac64f0f0a._comment create mode 100644 doc/forum/Newbie_stuck_at___34__Unable_to_connect_to_the_Jabber_server__34__/comment_5_2685e3a87464ccd37d593516d94ba5cf._comment create mode 100644 doc/forum/No_SSL_traffic_for_S3__63__.mdwn create mode 100644 doc/forum/No_SSL_traffic_for_S3__63__/comment_1_f509bf273896180e6df8c771438dd093._comment create mode 100644 doc/forum/No_SSL_traffic_for_S3__63__/comment_2_358635d19c82202c63014ca84de7fc3b._comment create mode 100644 doc/forum/No_output_from_git-annex_status_v5.20131224-g692aa01.mdwn create mode 100644 doc/forum/No_output_from_git-annex_status_v5.20131224-g692aa01/comment_1_b014f1edcb7ce39da9b582683d3b80c0._comment create mode 100644 doc/forum/No_output_from_git-annex_status_v5.20131224-g692aa01/comment_2_24602de6cfe1f3d988c5105e7266a518._comment create mode 100644 doc/forum/Not_sure_how_to_get_my_s3_remote_back.mdwn create mode 100644 doc/forum/Not_sure_how_to_get_my_s3_remote_back/comment_10_ed35a6ec605e8f79ec107856af6d1a46._comment create mode 100644 doc/forum/Not_sure_how_to_get_my_s3_remote_back/comment_11_e48b6efa42159dc83e1be11bfb54abcd._comment create mode 100644 doc/forum/Not_sure_how_to_get_my_s3_remote_back/comment_12_b58232d0e3fa4649565c0c7d4ce2e82e._comment create mode 100644 doc/forum/Not_sure_how_to_get_my_s3_remote_back/comment_13_85368b60091dc3ce2efb58013ffe9f83._comment create mode 100644 doc/forum/Not_sure_how_to_get_my_s3_remote_back/comment_14_e65281bef23e0076936c508728a87897._comment create mode 100644 doc/forum/Not_sure_how_to_get_my_s3_remote_back/comment_1_fffb59ad5a197d2980dd0ec35cf4aafa._comment create mode 100644 doc/forum/Not_sure_how_to_get_my_s3_remote_back/comment_2_0cfcc2075bff556b9fde5acc3dc1d599._comment create mode 100644 doc/forum/Not_sure_how_to_get_my_s3_remote_back/comment_3_6fe2ff1282fb14a4ce26ef8dc775d07e._comment create mode 100644 doc/forum/Not_sure_how_to_get_my_s3_remote_back/comment_4_64338d2d77dcbabd16b55eb145f40dc6._comment create mode 100644 doc/forum/Not_sure_how_to_get_my_s3_remote_back/comment_5_dd66c9ea0c83388f6826751944330d10._comment create mode 100644 doc/forum/Not_sure_how_to_get_my_s3_remote_back/comment_6_dc0c5e395e4c443b7227afdb157194e5._comment create mode 100644 doc/forum/Not_sure_how_to_get_my_s3_remote_back/comment_7_3c0ea4c76cdd889707f7308576e3efa0._comment create mode 100644 doc/forum/Not_sure_how_to_get_my_s3_remote_back/comment_8_36519ee4499a19f0864e4fcd264e9933._comment create mode 100644 doc/forum/Not_sure_how_to_get_my_s3_remote_back/comment_9_85b23f375e53469fb09b24b945b3aba9._comment create mode 100644 doc/forum/OSX_Mavericks_anyone__63__.mdwn create mode 100644 doc/forum/OSX_Mavericks_anyone__63__/comment_1_3075b02aeb57adcbf4addf9fb4c123ba._comment create mode 100644 doc/forum/OSX_Mavericks_anyone__63__/comment_2_c2b6110fc4a3d3481ed8a4b48efb9635._comment create mode 100644 doc/forum/OSX_Mavericks_anyone__63__/comment_3_7df9ba63cb1f385681242b4b58d6a87c._comment create mode 100644 doc/forum/OSX_Mavericks_anyone__63__/comment_4_740fee31c4ca9d84428f97f63ffc075a._comment create mode 100644 doc/forum/OSX__39__s_default_sshd_behaviour_has_limited_paths_set.mdwn create mode 100644 doc/forum/OSX__39__s_haskell-platform_statically_links_things.mdwn create mode 100644 doc/forum/OpenOffice___47___Libre_Office.mdwn create mode 100644 doc/forum/OpenOffice___47___Libre_Office/comment_1_98ed542fedd820d47bf8deb7d3232725._comment create mode 100644 doc/forum/OpenOffice___47___Libre_Office/comment_2_f313fdaa23863c2ae99cfbfe9ec2e1e0._comment create mode 100644 doc/forum/Out_of_memory_error_in_fsck__44___whereis__44___find_and_status_cmds.mdwn create mode 100644 doc/forum/Overwriting_data_without_getting_it.mdwn create mode 100644 doc/forum/Overwriting_data_without_getting_it/comment_1_f1c0199ee9bffcc84287370b89361294._comment create mode 100644 doc/forum/Overwriting_data_without_getting_it/comment_2_6a1d08dbca206129ef6cf8aa97daeee1._comment create mode 100644 doc/forum/Overwriting_data_without_getting_it/comment_3_52958e76e506fdbb6b533681ab619b3b._comment create mode 100644 doc/forum/Permission_denied___40__publickey__41___On_second_Step_...___63__.mdwn create mode 100644 doc/forum/Permission_denied___40__publickey__41___On_second_Step_...___63__/comment_1_6c74f0b43c457fe97b2d8630ca4fde29._comment create mode 100644 doc/forum/Permission_denied___40__publickey__41___On_second_Step_...___63__/comment_2_b7a384e853e1756a684774348fad29e6._comment create mode 100644 doc/forum/Permission_denied___40__publickey__41___On_second_Step_...___63__/comment_3_3a8a7f51cb04a92c576549d379b57248._comment create mode 100644 doc/forum/Permission_denied___40__publickey__41___On_second_Step_...___63__/comment_4_582ad3ba0c62a77b08a10b37a780c670._comment create mode 100644 doc/forum/Please_fix_compatibility_with_ghc_7.0.mdwn create mode 100644 doc/forum/Please_fix_compatibility_with_ghc_7.0/comment_1_d1d10217ebd0151e947b3a6cd37399ce._comment create mode 100644 doc/forum/Please_publish_new_releases_not_shorter_than_11_days.mdwn create mode 100644 doc/forum/Please_publish_new_releases_not_shorter_than_11_days/comment_1_da3d39de5be47ebe8b25a42ed1f36510._comment create mode 100644 doc/forum/Podcast_syncing_use-case.mdwn create mode 100644 doc/forum/Podcast_syncing_use-case/comment_1_ace6f9d3a950348a3ac0ff592b62e786._comment create mode 100644 doc/forum/Podcast_syncing_use-case/comment_2_930a6620b4d516e69ed952f9da5371bb._comment create mode 100644 doc/forum/Poor_man__39__s_IMAP.mdwn create mode 100644 doc/forum/Poor_man__39__s_IMAP/comment_1_258ff23c462dc88b88ced405c4f5040f._comment create mode 100644 doc/forum/Poor_man__39__s_IMAP/comment_2_c88d1abdda4cb526a6ee45a710c75bc4._comment create mode 100644 doc/forum/Poor_man__39__s_IMAP/comment_3_3847e371db1c2788c075e7dca1fbd33e._comment create mode 100644 doc/forum/Poor_man__39__s_IMAP/comment_4_cf6cc21f2cf2aa5c949844e24a7b4075._comment create mode 100644 doc/forum/Poor_man__39__s_IMAP/comment_5_d861fa69475ce526841b3195be8ee356._comment create mode 100644 doc/forum/Poor_man__39__s_IMAP/comment_6_1e81bd4bb62652bc674cdcd7ed57ac5c._comment create mode 100644 doc/forum/Poor_man__39__s_IMAP/comment_7_b3929281dff6078d77f1b9ae42e25bb6._comment create mode 100644 doc/forum/Poor_man__39__s_IMAP/comment_8_69506e8c519196f44b9ed15b32f00106._comment create mode 100644 doc/forum/Portable_version_of_git-annex_for_windows.mdwn create mode 100644 doc/forum/Portable_version_of_git-annex_for_windows/comment_1_e5e60fa8d104a09152a8164d5a906aec._comment create mode 100644 doc/forum/Portable_version_of_git-annex_for_windows/comment_2_d8d1aa0920351e880ba6678bb97585de._comment create mode 100644 doc/forum/Post-Kickstarter.mdwn create mode 100644 doc/forum/Preserving_file_access_rights_in_directory_tree_below_objects__47__.mdwn create mode 100644 doc/forum/Preserving_file_access_rights_in_directory_tree_below_objects__47__/comment_1_5dd978f9b5a0771f44ab9e086bf5a07f._comment create mode 100644 doc/forum/Preserving_file_access_rights_in_directory_tree_below_objects__47__/comment_2_9f51947b35ee04e473655e20d56c740a._comment create mode 100644 doc/forum/Previous_versions_in_direct_mode__63__.mdwn create mode 100644 doc/forum/Previous_versions_in_direct_mode__63__/comment_1_352d460acd5500587e679d934180eee4._comment create mode 100644 doc/forum/Problem_compiling_current_master.mdwn create mode 100644 doc/forum/Problem_compiling_current_master/comment_1_135df61ec850c06e3b48ccfef7b5b031._comment create mode 100644 doc/forum/Problem_compiling_current_master/comment_2_fb3e27b6014e84bd919a7a4a95e39ef9._comment create mode 100644 doc/forum/Problem_compiling_current_master/comment_3_b737b3945103c5e2aa798b4e65fbce06._comment create mode 100644 doc/forum/Problem_compiling_current_master/comment_4_28c1b335ae388d4e1f22b711ac1c001f._comment create mode 100644 doc/forum/Problems_syncing_with_box.com.mdwn create mode 100644 doc/forum/Problems_syncing_with_box.com/comment_1_8db642849da4d42cd9a43142e2b7cb70._comment create mode 100644 doc/forum/Problems_syncing_with_box.com/comment_2_cd18f33647aebc04af5469e4ce1fbcd2._comment create mode 100644 doc/forum/Problems_using_submodules_with_git-annex__63__.mdwn create mode 100644 doc/forum/Problems_using_submodules_with_git-annex__63__/comment_1_c7a927736d419d3c31c912001ff16ee4._comment create mode 100644 doc/forum/Problems_with_large_numbers_of_files.mdwn create mode 100644 doc/forum/Problems_with_large_numbers_of_files/comment_1_08791cb78b982087c2a07316fe3ed46c._comment create mode 100644 doc/forum/Problems_with_large_numbers_of_files/comment_2_0392a11219463e40c53bae73c8188b69._comment create mode 100644 doc/forum/Problems_with_large_numbers_of_files/comment_3_537e9884c1488a7a4bcf131ea63b71f7._comment create mode 100644 doc/forum/Problems_with_large_numbers_of_files/comment_4_7cb65d013e72bd2b7e90452079d42ac9._comment create mode 100644 doc/forum/Problems_with_large_numbers_of_files/comment_5_86a42ee3173a5d38f803e64b79496ab3._comment create mode 100644 doc/forum/Problems_with_large_numbers_of_files/comment_6_4551274288383c9cc27cbf85b122d307._comment create mode 100644 doc/forum/Problems_with_large_numbers_of_files/comment_7_d18cf944352f8303799c86f2c0354e8e._comment create mode 100644 doc/forum/Pruning_out_unwanted_Git_objects.mdwn create mode 100644 doc/forum/Pruning_out_unwanted_Git_objects/comment_1_0cf7a12bfa2957260f4b2f79b0cadf2f._comment create mode 100644 doc/forum/Pruning_out_unwanted_Git_objects/comment_2_7472943c02cfe2808b0d566e06caa1a5._comment create mode 100644 doc/forum/Pruning_out_unwanted_Git_objects/comment_3_6a1e7a83d94394454fc085f6d2728cd7._comment create mode 100644 doc/forum/Purge_a_remote.mdwn create mode 100644 doc/forum/Purge_a_remote/comment_1_78b3b77f457c65d31fd8a5abf714905d._comment create mode 100644 doc/forum/Purge_a_remote/comment_2_dc65719157dee63b3979563ed57ee0ce._comment create mode 100644 doc/forum/Purge_a_remote/comment_3_63e0280273b816fa4b837724e102f813._comment create mode 100644 doc/forum/Purge_a_remote/comment_4_7fad1c4798ca03a4095ac3241c279f6d._comment create mode 100644 doc/forum/Push__47__Pull_with_the_Assistant.mdwn create mode 100644 doc/forum/Push__47__Pull_with_the_Assistant/comment_1_f7b63d379c2d21794adf8658f546f8a7._comment create mode 100644 doc/forum/Push__47__Pull_with_the_Assistant/comment_2_aec8cc20576e7ffd5a8be4348d1a0073._comment create mode 100644 doc/forum/Pushing_git_repo_to_AWS_S3_from_behind_proxy.mdwn create mode 100644 doc/forum/Reappearing_repos_in_webapp_and_vicfg.mdwn create mode 100644 doc/forum/Reappearing_repos_in_webapp_and_vicfg/comment_1_bd977e864ae89816fa7f4ff69879b15f._comment create mode 100644 doc/forum/Reappearing_repos_in_webapp_and_vicfg/comment_2_05749f9e75689d0111339b7126c12300._comment create mode 100644 doc/forum/Reappearing_repos_in_webapp_and_vicfg/comment_3_b1531994eea0fbbf4cb097e604378a53._comment create mode 100644 doc/forum/Reappearing_repos_in_webapp_and_vicfg/comment_4_f1eba3e8aa4116e3c20747ec1d6e24e5._comment create mode 100644 doc/forum/Recommended_number_of_repositories.mdwn create mode 100644 doc/forum/Recommended_number_of_repositories/comment_1_3ef256230756be8a9679b107cdbfd018._comment create mode 100644 doc/forum/Relocating_annex_directory.mdwn create mode 100644 doc/forum/Relocating_annex_directory/comment_1_13ff5438baa1db110beb6aab3a783def._comment create mode 100644 doc/forum/Relocating_annex_directory/comment_2_6d88ff03fcf00ae872442e8a86c968ed._comment create mode 100644 doc/forum/Remote_server_only_for_the_git_repository.mdwn create mode 100644 doc/forum/Remote_server_only_for_the_git_repository/comment_1_d4d8d8cfebf9a98ca8878c5684d5bb50._comment create mode 100644 doc/forum/Remote_server_only_for_the_git_repository/comment_2_a62dec8ab98ac7bd65059a9e425a01e2._comment create mode 100644 doc/forum/Removing_files_not_found_by_git_annex_unused.mdwn create mode 100644 doc/forum/Removing_files_not_found_by_git_annex_unused/comment_1_420c6230e68de0a0ac7d7da91ac60801._comment create mode 100644 doc/forum/Repo_accessible_from___34__dumb__34___client_without_git-annex.mdwn create mode 100644 doc/forum/Repo_accessible_from___34__dumb__34___client_without_git-annex/comment_1_077c492fd37d335f74a5c886ff0d524f._comment create mode 100644 doc/forum/Repo_accessible_from___34__dumb__34___client_without_git-annex/comment_2_00e6576e3e60d2650461eeb0f918e6e5._comment create mode 100644 doc/forum/Repo_accessible_from___34__dumb__34___client_without_git-annex/comment_3_c36a9562c53ac683b62fc4471405aa2a._comment create mode 100644 doc/forum/Restricting_git-annex-shell_to_a_specific_repository.mdwn create mode 100644 doc/forum/Restricting_git-annex-shell_to_a_specific_repository/comment_1_66544520bff71181e4a03ca583b0b458._comment create mode 100644 doc/forum/Restricting_git-annex-shell_to_a_specific_repository/comment_2_2a210255e8535712c71fa183e56ab600._comment create mode 100644 doc/forum/Restricting_git-annex-shell_to_a_specific_repository/comment_3_52cd4bd9694b2100b0e0dd2eafa9e828._comment create mode 100644 doc/forum/Retrieve_previous_version_in_direct_mode.mdwn create mode 100644 doc/forum/Retrieve_previous_version_in_direct_mode/comment_1_ca3a999ed64c42b8df810115de205d2f._comment create mode 100644 doc/forum/Retrieve_previous_version_in_direct_mode/comment_2_1292b34ff6d9976b2bd08748e1ba4e7a._comment create mode 100644 doc/forum/Retrieve_previous_version_in_direct_mode/comment_3_699e816c0397f6db924feeab906f1151._comment create mode 100644 doc/forum/Retrieve_previous_version_in_direct_mode/comment_4_d900388753de5870b7b9c0e8b8c06ed7._comment create mode 100644 doc/forum/Revert_file_linkage_to_original_files.mdwn create mode 100644 doc/forum/Revert_file_linkage_to_original_files/comment_1_898ca2c9976e92d22470c7404aa9813f._comment create mode 100644 doc/forum/Running_assistant_on_a_server___40__no_X_available__41__.mdwn create mode 100644 doc/forum/Running_assistant_on_a_server___40__no_X_available__41__/comment_1_dd75d78ef63f2689199a302ed1846017._comment create mode 100644 doc/forum/Running_assistant_on_a_server___40__no_X_available__41__/comment_2_df654df60c5fa6a84d786d248928a352._comment create mode 100644 doc/forum/Running_assistant_steps_manually.mdwn create mode 100644 doc/forum/Running_assistant_steps_manually/comment_1_e14e0a1d55d01cb4f67a94bbe349b872._comment create mode 100644 doc/forum/Running_assistant_steps_manually/comment_2_3192f614c929b8060d4fbde56a7adec1._comment create mode 100644 doc/forum/Running_out_of__inodes.mdwn create mode 100644 doc/forum/Running_out_of__inodes/comment_1_abc73d9ad662ef642337b683bf0a0253._comment create mode 100644 doc/forum/S3_Host_Question.mdwn create mode 100644 doc/forum/S3_Host_Question/comment_1_8c8ecea703405753e47e0da5e8325929._comment create mode 100644 doc/forum/S3_Host_Question/comment_2_3d6fa3147d59a5e0d10b005388b23c7a._comment create mode 100644 doc/forum/S3_Host_Question/comment_3_797edf3ad41561ab8960f3b28d20611e._comment create mode 100644 doc/forum/Same_Jabber_account_for_different_annexes.mdwn create mode 100644 doc/forum/Same_Jabber_account_for_different_annexes/comment_1_90c3954fe11980eef42b5f5d34f83488._comment create mode 100644 doc/forum/Same_Jabber_account_for_different_annexes/comment_2_802600b3568e5f94d0550092b22975db._comment create mode 100644 doc/forum/Securing_a_shared_ssh_server.mdwn create mode 100644 doc/forum/Securing_a_shared_ssh_server/comment_1_ea971b57d94db5b8d487f728faa5e9a8._comment create mode 100644 doc/forum/Securing_a_shared_ssh_server/comment_2_421a19f6e1fb40db6ee205daf8e3f867._comment create mode 100644 doc/forum/Securing_a_shared_ssh_server/comment_3_acdbf92f646dbbf691621f08b3d94c26._comment create mode 100644 doc/forum/Securing_a_shared_ssh_server/comment_4_67533d08e1b8706b844262e9c483d982._comment create mode 100644 doc/forum/Securing_a_shared_ssh_server/comment_5_bf193e02b388b4358632a169d2425b5c._comment create mode 100644 doc/forum/Securing_a_shared_ssh_server/comment_6_50d391992cd444080ebc70db30b215c5._comment create mode 100644 doc/forum/Setup_of_rsync_special_remote_with_non-standard_ssh_port.mdwn create mode 100644 doc/forum/Setup_of_rsync_special_remote_with_non-standard_ssh_port/comment_1_1eb6990e93ec92cb6fd7dbee59f31072._comment create mode 100644 doc/forum/Setup_of_rsync_special_remote_with_non-standard_ssh_port/comment_2_c85d5167e7ccce1ecf1de396e72ce7bc._comment create mode 100644 doc/forum/Share_only_certain_files_of_a_repo___40__Assistant__41__.mdwn create mode 100644 doc/forum/Share_only_certain_files_of_a_repo___40__Assistant__41__/comment_1_ec0d56cb31b918023a9184cee168b406._comment create mode 100644 doc/forum/Share_with_friend_copies_only_sym_links.mdwn create mode 100644 doc/forum/Share_with_friend_copies_only_sym_links/comment_1_a8d22dfefb219f0c9130cc294364b198._comment create mode 100644 doc/forum/Sharing_annex_with_local_clones.mdwn create mode 100644 doc/forum/Sharing_annex_with_local_clones/comment_1_2b60e13e5f7b8cee56cf2ddc6c47f64d._comment create mode 100644 doc/forum/Sharing_annex_with_local_clones/comment_2_24ff2c1eb643077daa37c01644cebcd2._comment create mode 100644 doc/forum/Sharing_annex_with_local_clones/comment_3_5359b8eada24d27be83214ac0ae62f23._comment create mode 100644 doc/forum/Simple_check_out_with_assistant__63__.mdwn create mode 100644 doc/forum/Simple_check_out_with_assistant__63__/comment_1_ade8a0743ef1ec933c8a40ed64eeac2d._comment create mode 100644 doc/forum/Slightly_finer_control_over_file_whereabouts.mdwn create mode 100644 doc/forum/Slightly_finer_control_over_file_whereabouts/comment_10_bcb883d46a637dd1a8ef9a92733d202a._comment create mode 100644 doc/forum/Slightly_finer_control_over_file_whereabouts/comment_11_b7a8b9eaf114f883866fbf2be51b622f._comment create mode 100644 doc/forum/Slightly_finer_control_over_file_whereabouts/comment_1_6236bcfa9beba705ead3ec2141c5d835._comment create mode 100644 doc/forum/Slightly_finer_control_over_file_whereabouts/comment_2_ea935b37ca93e73c85d04df7c9bf6057._comment create mode 100644 doc/forum/Slightly_finer_control_over_file_whereabouts/comment_3_f89a8e38283ac4c8c4a3b74c413d67a1._comment create mode 100644 doc/forum/Slightly_finer_control_over_file_whereabouts/comment_4_07a0a754a089c46ff69dc97ea7ba9384._comment create mode 100644 doc/forum/Slightly_finer_control_over_file_whereabouts/comment_5_e884c001a556a0c693d1cc9a97c068ac._comment create mode 100644 doc/forum/Slightly_finer_control_over_file_whereabouts/comment_6_3e8674b5857e4994dfbc26be4f4b2855._comment create mode 100644 doc/forum/Slightly_finer_control_over_file_whereabouts/comment_7_7aeabc2e52a39423e83fbd04560e8f91._comment create mode 100644 doc/forum/Slightly_finer_control_over_file_whereabouts/comment_8_53b95449cfad2fe0f72d2ad642822c03._comment create mode 100644 doc/forum/Slightly_finer_control_over_file_whereabouts/comment_9_a17c102a45e4fc3f101a79acb8eb4081._comment create mode 100644 doc/forum/Some_mounted_devices_not_detected.mdwn create mode 100644 doc/forum/Some_mounted_devices_not_detected/comment_1_0ba07b95f12f57ea63bb450b88430c45._comment create mode 100644 doc/forum/Some_mounted_devices_not_detected/comment_2_4f8c7bcd0f20dafa5635a3580ec8d1f6._comment create mode 100644 doc/forum/Some_mounted_devices_not_detected/comment_3_06c0db7d670d9b82823102d22db15a36._comment create mode 100644 doc/forum/Some_mounted_devices_not_detected/comment_4_80820a29361c5be4a94672dacfdefa6f._comment create mode 100644 doc/forum/Special_remote_without_chmod.mdwn create mode 100644 doc/forum/Special_remote_without_chmod/comment_1_4f5f9506cae72a1f321296fc5a5f339a._comment create mode 100644 doc/forum/Storing_uncontrolled_files_in_an_annex.mdwn create mode 100644 doc/forum/Storing_uncontrolled_files_in_an_annex/comment_1_175645a90be0c79221c129308adf643e._comment create mode 100644 doc/forum/Storing_uncontrolled_files_in_an_annex/comment_2_d29f214eadfe3bfd098bbc3bcf07129a._comment create mode 100644 doc/forum/Storing_uncontrolled_files_in_an_annex/comment_3_286b502e7906cca50e9e747db735bc88._comment create mode 100644 doc/forum/Stupid_mistake:_recoverable__63__.mdwn create mode 100644 doc/forum/Stupid_mistake:_recoverable__63__/comment_1_00ceb3a5e37825c4bbc806f532893706._comment create mode 100644 doc/forum/Stupid_mistake:_recoverable__63__/comment_2_cbedc29678d9b6af3b3c0bb1915d2391._comment create mode 100644 doc/forum/Stupid_mistake:_recoverable__63__/comment_3_86aa4d92a1330811862da1ba568b3037._comment create mode 100644 doc/forum/Stupid_mistake:_recoverable__63__/comment_4_6d15bf8a3c3c27cc92957070161675a9._comment create mode 100644 doc/forum/Stupid_mistake:_recoverable__63__/comment_5_f836b9b1d03d94c49e3798961790b2ba._comment create mode 100644 doc/forum/Suggestion:_Put_ssh_server_back_into_android_version.mdwn create mode 100644 doc/forum/Suggestion:_Put_ssh_server_back_into_android_version/comment_1_5c2f376a82458c6387560355940419d3._comment create mode 100644 doc/forum/Suggestion:_Put_ssh_server_back_into_android_version/comment_2_6321dec0b2f22f841f3cb986e063113f._comment create mode 100644 doc/forum/Sync_with_one_offline_peer.mdwn create mode 100644 doc/forum/Sync_with_one_offline_peer/comment_1_3859d842d4f7e2ef44877b05ebe881fb._comment create mode 100644 doc/forum/Sync_with_one_offline_peer/comment_2_c9ba3983b37b0c1868269616fd81e518._comment create mode 100644 doc/forum/Sync_with_one_offline_peer/comment_3_28b9c003b4560c3ce90c9ebf808b091b._comment create mode 100644 doc/forum/Sync_without_jabber_account.mdwn create mode 100644 doc/forum/Sync_without_jabber_account/comment_1_3e95ac2e67451f953cf0538094109f8b._comment create mode 100644 doc/forum/Synchronize_large_files___40__VM_images__41__.mdwn create mode 100644 doc/forum/Synchronize_large_files___40__VM_images__41__/comment_1_619f6ed2d7da5832ab253d61b6dd8044._comment create mode 100644 doc/forum/Syncing_machines_on_different_networks.mdwn create mode 100644 doc/forum/Syncing_machines_on_different_networks/comment_1_1c3523c722c178a96b096a68b9be4165._comment create mode 100644 doc/forum/Syncing_machines_on_different_networks/comment_2_d7b14ffee65072329cfe9ab08a0dba50._comment create mode 100644 doc/forum/Syncing_machines_on_different_networks/comment_3_65d1dae9b76fccb5f2b8fd8c69b60075._comment create mode 100644 doc/forum/Syncing_machines_on_different_networks/comment_4_2ec67428af69d6c0ea051c6a67d58905._comment create mode 100644 doc/forum/Syncing_machines_on_different_networks/comment_5_5ce093f82a2aad3fd8d7ccd5fdcab94f._comment create mode 100644 doc/forum/Syncing_machines_on_different_networks/comment_6_a55982c28d7b90e0b70ec2bb5e594e08._comment create mode 100644 doc/forum/Syncing_machines_on_different_networks/comment_7_c519d546e1a2a4e834609f3de3a605b0._comment create mode 100644 doc/forum/Syncing_machines_on_different_networks/comment_8_84a822238ddbaf211cce5f527c3559d3._comment create mode 100644 doc/forum/Syncing_with_an_encrypted_remote_from_a_different_computer__63__.mdwn create mode 100644 doc/forum/Syncing_with_an_encrypted_remote_from_a_different_computer__63__/comment_1_cd55d06a4065b9d3f14d50674c3fcaf7._comment create mode 100644 doc/forum/Syncing_with_an_encrypted_remote_from_a_different_computer__63__/comment_2_25cbdf478091af9923090e049c432a7d._comment create mode 100644 doc/forum/Syncing_with_an_encrypted_remote_from_a_different_computer__63__/comment_3_7e71d355457d6b1a0391d4cdae6895e6._comment create mode 100644 doc/forum/Syncing_with_an_encrypted_remote_from_a_different_computer__63__/comment_4_a73f67f2fcf0762fbd7c8366b3844af6._comment create mode 100644 doc/forum/Syncronisation_of_syncronisation_between_3_repositories__63__.mdwn create mode 100644 doc/forum/Syncronisation_of_syncronisation_between_3_repositories__63__/comment_1_ca5192a26950627a1c2efcb55d6d2fa3._comment create mode 100644 doc/forum/The_ability_to_leave_a_file_unlocked_for_a_bit_while_committing_it_repeatedly__63__.mdwn create mode 100644 doc/forum/The_ability_to_leave_a_file_unlocked_for_a_bit_while_committing_it_repeatedly__63__/comment_1_3cbe520b184d323219cb402ff046c3b4._comment create mode 100644 doc/forum/The_ability_to_leave_a_file_unlocked_for_a_bit_while_committing_it_repeatedly__63__/comment_2_6afe7f593e955db2eefe87d9fa01882b._comment create mode 100644 doc/forum/The_ability_to_leave_a_file_unlocked_for_a_bit_while_committing_it_repeatedly__63__/comment_3_209399487fc4f76b29f03ad82dbc2d6f._comment create mode 100644 doc/forum/The_ability_to_leave_a_file_unlocked_for_a_bit_while_committing_it_repeatedly__63__/comment_4_f33fd6f72cb9ad7dd20a04c82199413b._comment create mode 100644 doc/forum/Tracking_a_directory_with_some_hg_and_git_repositories.mdwn create mode 100644 doc/forum/Tracking_a_directory_with_some_hg_and_git_repositories/comment_1_9fc3f6c2f7379755e0084a850fa9acd4._comment create mode 100644 doc/forum/Tracking_a_directory_with_some_hg_and_git_repositories/comment_2_f024d6a105143af1e06aafe49661ee06._comment create mode 100644 doc/forum/Tracking_a_directory_with_some_hg_and_git_repositories/comment_3_aff0093c38bda8b093f05e8cbe8775e9._comment create mode 100644 doc/forum/Tracking_a_directory_with_some_hg_and_git_repositories/comment_4_c889050d3079edefc4633451bd5baff8._comment create mode 100644 doc/forum/Transfer_remotes.mdwn create mode 100644 doc/forum/Transfer_remotes/comment_1_c08cf3bda00d7f20a3ca3d0fdba19c9c._comment create mode 100644 doc/forum/Transfer_remotes/comment_2_98930629d398329f1161135464a966a5._comment create mode 100644 doc/forum/Trouble_installing_from_cabal_on_debian-testing.mdwn create mode 100644 doc/forum/Trouble_installing_from_cabal_on_debian-testing/comment_1_0d3e9d7cffafc34bc212557e8bbb987d._comment create mode 100644 doc/forum/Truly_purging_dead_repositories.mdwn create mode 100644 doc/forum/Truly_purging_dead_repositories/comment_1_a4c75d49714b3543a9f1617a15d4a2d1._comment create mode 100644 doc/forum/Truly_purging_dead_repositories/comment_2_3da60a02e7323a204c5c5dd02ba04d6c._comment create mode 100644 doc/forum/Truly_purging_dead_repositories/comment_3_2576e45436008ff5a7ae5a38cade658e._comment create mode 100644 doc/forum/Truly_purging_dead_repositories/comment_4_477e3c213c5a5d4a33afd42a5b94c718._comment create mode 100644 doc/forum/Two_computer_setup:___34__transfer__34___or___34__full_backup__34___repository_groups__63__.mdwn create mode 100644 doc/forum/Two_computer_setup:___34__transfer__34___or___34__full_backup__34___repository_groups__63__/comment_1_b8702892280447193e6e80be22a580a0._comment create mode 100644 doc/forum/Two_computer_setup:___34__transfer__34___or___34__full_backup__34___repository_groups__63__/comment_2_50cafde7e30b928480d1f142ddd763d2._comment create mode 100644 doc/forum/USB_backup_with_files_visible.mdwn create mode 100644 doc/forum/USB_backup_with_files_visible/comment_1_2832f8ae24dfb0f101e06f7c18283028._comment create mode 100644 doc/forum/USB_backup_with_files_visible/comment_2_6163e01aa441f8435091f026cc6da337._comment create mode 100644 doc/forum/USB_backup_with_files_visible/comment_3_ee92ff320eb5d9a031bdd1896aee0d86._comment create mode 100644 doc/forum/USB_backup_with_files_visible/comment_4_437c8342c0b65e3a89129800313eb73c._comment create mode 100644 doc/forum/USB_backup_with_files_visible/comment_5_5e10cffe8465ea4ecaa71c03a4c29ea4._comment create mode 100644 doc/forum/USB_backup_with_files_visible/comment_6_add048a16837f7940a859f21426cdbe9._comment create mode 100644 doc/forum/USB_backup_with_files_visible/comment_7_de227ca9911fe57d7a6d3e037f574fe9._comment create mode 100644 doc/forum/USB_backup_with_files_visible/comment_8_0c0ed0e038f7f0e2d2d4ed69b7b29fbc._comment create mode 100644 doc/forum/USB_drive_in_transfer_group_keeps_growing_-_assistant.mdwn create mode 100644 doc/forum/USB_drive_in_transfer_group_keeps_growing_-_assistant/comment_1_0a6f6054d70009979f4a036e24b7c500._comment create mode 100644 doc/forum/Ubuntu_PPA.mdwn create mode 100644 doc/forum/Ubuntu_PPA/comment_1_b55535258b1b4bcfc802235f0cba075d._comment create mode 100644 doc/forum/Ubuntu_PPA/comment_2_adc4d644fed058d1811acf0b35db9c18._comment create mode 100644 doc/forum/Ubuntu_PPA/comment_3_fc9cd51558c47718f243437202a11803._comment create mode 100644 doc/forum/Ubuntu_PPA/comment_4_3a8bbd0a7450a7f5323cd13144824aea._comment create mode 100644 doc/forum/Ubuntu_PPA/comment_5_2e1beaeebda0201c635db8b276cedf20._comment create mode 100644 doc/forum/Ubuntu_PPA/comment_6_bd99fb70399fc58d98781a89c6d38428._comment create mode 100644 doc/forum/Ubuntu_PPA/comment_7_c3f7ec8573934c59d70a48e36e321c13._comment create mode 100644 doc/forum/Un-git-annex__63__.mdwn create mode 100644 doc/forum/Un-git-annex__63__/comment_1_6059265afb66190d325083e0f28bcf33._comment create mode 100644 doc/forum/Un-git-annex__63__/comment_2_fac4bfb81dbbf0dc82059aace261eb51._comment create mode 100644 doc/forum/Undo_Git_Annex_Changes_To_Linked_Files.mdwn create mode 100644 doc/forum/Undo_Git_Annex_Changes_To_Linked_Files/comment_1_568dde820c2608d86d05b07444146a26._comment create mode 100644 doc/forum/Undo_Git_Annex_Changes_To_Linked_Files/comment_2_a8cf71cdf1217d9c8596cd9006eb83f5._comment create mode 100644 doc/forum/Unknown_remote_type_S3.mdwn create mode 100644 doc/forum/Unknown_remote_type_S3/comment_1_2aea2cd51286c809427d16519606cd37._comment create mode 100644 doc/forum/Unknown_remote_type_S3/comment_2_06f775062cd30767979fe56bcb3cf7bf._comment create mode 100644 doc/forum/Unlock_files_when_assistant_is_running__63__.mdwn create mode 100644 doc/forum/Unlock_files_when_assistant_is_running__63__/comment_1_3f4aadf0c856c81e15c6f5ae7f1992b4._comment create mode 100644 doc/forum/Unlock_files_when_assistant_is_running__63__/comment_2_a76797ee9e05e43af7947508cadd7bed._comment create mode 100644 doc/forum/Use_case_with_syncing_only_a_subset_possible__63__.mdwn create mode 100644 doc/forum/Use_case_with_syncing_only_a_subset_possible__63__/comment_1_a0a272a0931b27e5c94b93e42656b62c._comment create mode 100644 doc/forum/Use_local_files_instead_of_re-downloading_from_S3_remote.mdwn create mode 100644 doc/forum/Use_local_files_instead_of_re-downloading_from_S3_remote/comment_1_cfb6021a36eee087705967a69967f327._comment create mode 100644 doc/forum/Use_local_files_instead_of_re-downloading_from_S3_remote/comment_2_7268b194ba72331858bc3274996b780e._comment create mode 100644 doc/forum/Use_reflinks_on_BTRFS_instead_of_symlinks___63__.mdwn create mode 100644 doc/forum/Use_reflinks_on_BTRFS_instead_of_symlinks___63__/comment_1_85806316ed28d7a891f04fab4027141b._comment create mode 100644 doc/forum/Use_reflinks_on_BTRFS_instead_of_symlinks___63__/comment_2_ecb411a2c4d67917b734a90bd460d44b._comment create mode 100644 doc/forum/Usecase:_Tree_of_files_on_a_remote_SMB_server_that_i_need_to_leave_there__44____while_also_cloning_and_syncing_too..mdwn create mode 100644 doc/forum/Usecase:_Tree_of_files_on_a_remote_SMB_server_that_i_need_to_leave_there__44____while_also_cloning_and_syncing_too./comment_1_30205c1ba18e5dca2314f593e1a0e236._comment create mode 100644 doc/forum/Usecase:_Tree_of_files_on_a_remote_SMB_server_that_i_need_to_leave_there__44____while_also_cloning_and_syncing_too./comment_2_f8df728de28218a6b060ae9f08adac79._comment create mode 100644 doc/forum/Usecase:_Tree_of_files_on_a_remote_SMB_server_that_i_need_to_leave_there__44____while_also_cloning_and_syncing_too./comment_3_ba438b3a371261ee841665f1ae57eba2._comment create mode 100644 doc/forum/Usecase:_Tree_of_files_on_a_remote_SMB_server_that_i_need_to_leave_there__44____while_also_cloning_and_syncing_too./comment_4_9f72e6c7c14a77330297526aef260762._comment create mode 100644 doc/forum/Usecase:_Tree_of_files_on_a_remote_SMB_server_that_i_need_to_leave_there__44____while_also_cloning_and_syncing_too./comment_5_a06e8c9b4e30c1cd6cbed40d2db50abc._comment create mode 100644 doc/forum/Using_Git-Annex___40__Assistant__41___to_manage_photos_with_Shotwell.mdwn create mode 100644 doc/forum/Using_Git-Annex___40__Assistant__41___to_manage_photos_with_Shotwell/comment_1_5e8d54daf6b7ff357619ac65fe39a2d7._comment create mode 100644 doc/forum/Using_Linux_static_builds.mdwn create mode 100644 doc/forum/Using_Linux_static_builds/comment_1_22fd266cbe68af3e754a10f1f1295e9b._comment create mode 100644 doc/forum/Using_Linux_static_builds/comment_2_36f69f30117ff8696425a754ab19a08b._comment create mode 100644 doc/forum/Using_Linux_static_builds/comment_3_64506833dad0202626239e00d1eb6490._comment create mode 100644 doc/forum/Using___34__sync__34___to_sink_all_branches__63__.mdwn create mode 100644 doc/forum/Using___34__sync__34___to_sink_all_branches__63__/comment_1_ef3d5c5e2600ffa36dd933c8a42cdf96._comment create mode 100644 doc/forum/Using___34__sync__34___to_sink_all_branches__63__/comment_2_424b0c6fdfe87ca08f5d408b7684ab08._comment create mode 100644 doc/forum/Using___34__sync__34___to_sink_all_branches__63__/comment_3_adaf9114c69f1268330adcebd8018fa0._comment create mode 100644 doc/forum/Using_a_single_backup_repo_for_multiple_independent_client_repos__63__.mdwn create mode 100644 doc/forum/Using_a_single_backup_repo_for_multiple_independent_client_repos__63__/comment_1_c61c28600f1079fb03ddabc950307f27._comment create mode 100644 doc/forum/Using_for_Music_repo.mdwn create mode 100644 doc/forum/Using_for_Music_repo/comment_1_3488ed85ad98f14cb17f229225ece26e._comment create mode 100644 doc/forum/Using_for_Music_repo/comment_2_c794648878cfc77558f8db862271f997._comment create mode 100644 doc/forum/Using_for_Music_repo/comment_3_8c5e820f5ff7d717d64b1fd66927941b._comment create mode 100644 doc/forum/Using_git-annex_as_a_library.mdwn create mode 100644 doc/forum/Using_git-annex_as_a_library/comment_1_1f8e74c5856f21c53d5a91892cbef0c6._comment create mode 100644 doc/forum/Using_git-annex_as_a_library/comment_2_11a243fa7d8ac947aa9a798228dbd191._comment create mode 100644 doc/forum/Using_git-annex_as_a_library/comment_3_ac52304a096ebc66967352efaffb060a._comment create mode 100644 doc/forum/Using_git-annex_as_a_library/comment_4_d502fea60bf3a82f8a50f72a90a80c25._comment create mode 100644 doc/forum/Using_git-annex_via_command_line_in_OS_X.mdwn create mode 100644 doc/forum/Using_git-annex_via_command_line_in_OS_X/comment_1_1c9e121f60fb6868c07f1a53b03c4ed0._comment create mode 100644 doc/forum/Using_git-annex_via_command_line_in_OS_X/comment_2_52d8ffba82e29ac2722a8e43e469cc47._comment create mode 100644 doc/forum/Using_git_annex_with_Android_tablet_which_only_has_exFAT_and_no_symlinks.mdwn create mode 100644 doc/forum/Using_git_annex_with_Android_tablet_which_only_has_exFAT_and_no_symlinks/comment_1_b9f202a30ba7e3bc264064d24454c099._comment create mode 100644 doc/forum/Using_git_annex_with_Android_tablet_which_only_has_exFAT_and_no_symlinks/comment_2_1334a8d9f4bb60f3bf3ebabc656d98d9._comment create mode 100644 doc/forum/Using_git_annex_with_Android_tablet_which_only_has_exFAT_and_no_symlinks/comment_3_076f22d05fad140068a540e4d835106f._comment create mode 100644 doc/forum/Using_git_annex_with_Android_tablet_which_only_has_exFAT_and_no_symlinks/comment_4_c8446ee1b817f1824fa0df07e742015c._comment create mode 100644 doc/forum/Using_git_annex_with_Android_tablet_which_only_has_exFAT_and_no_symlinks/comment_5_f746c1b85ee8e4b57b6819ccceabd28b._comment create mode 100644 doc/forum/Using_git_annex_with_a_SMB__47__FTP_TV_NAS_with_preconfigured_dirs.mdwn create mode 100644 doc/forum/Using_git_annex_with_a_SMB__47__FTP_TV_NAS_with_preconfigured_dirs/comment_1_bd73c8d10028e1b45da9ea8f657e5064._comment create mode 100644 doc/forum/Using_git_annex_with_a_SMB__47__FTP_TV_NAS_with_preconfigured_dirs/comment_2_16c3c994ee8fcb466e52ca0e812e5915._comment create mode 100644 doc/forum/Using_git_annex_with_a_SMB__47__FTP_TV_NAS_with_preconfigured_dirs/comment_3_ac60f6edb76bdd541711e472eec9591a._comment create mode 100644 doc/forum/Using_git_annex_with_a_SMB__47__FTP_TV_NAS_with_preconfigured_dirs/comment_4_2194f0600d9a90f0d9c947ea9cc213a3._comment create mode 100644 doc/forum/Using_git_annex_with_a_SMB__47__FTP_TV_NAS_with_preconfigured_dirs/comment_5_eb7d13f6b6fa674a2536bde51bfc3fd1._comment create mode 100644 doc/forum/Using_git_annex_with_a_SMB__47__FTP_TV_NAS_with_preconfigured_dirs/comment_6_ae323b16ddb9342e91be955408eca3b1._comment create mode 100644 doc/forum/WARNING:_linker:git-annex_has_text_relocations....mdwn create mode 100644 doc/forum/WARNING:_linker:git-annex_has_text_relocations.../comment_1_fee360353f0b46aab6ee7a902c0837bb._comment create mode 100644 doc/forum/Walkthrough_does_not_work_for_me__44___what_am_i_doing_wrong__63__.mdwn create mode 100644 doc/forum/Walkthrough_does_not_work_for_me__44___what_am_i_doing_wrong__63__/comment_1_cdac15fec6fc41d5487b7f653fa718a4._comment create mode 100644 doc/forum/Walkthrough_does_not_work_for_me__44___what_am_i_doing_wrong__63__/comment_2_82050b7dc367ca5968ab0306db9bd7e3._comment create mode 100644 doc/forum/Watch__47__assistant__47__webapp_documentation.mdwn create mode 100644 doc/forum/Watch__47__assistant__47__webapp_documentation/comment_1_adb377589dbae7fc91001df235c6b48e._comment create mode 100644 doc/forum/Webapp_not_watching_repos.mdwn create mode 100644 doc/forum/Webapp_not_watching_repos/comment_1_02735050122afdb6498d91b462d32767._comment create mode 100644 doc/forum/Webapp_not_watching_repos/comment_2_8ab2d4c18ddc99774e44c4f4401bfa57._comment create mode 100644 doc/forum/Webapp_not_watching_repos/comment_3_b448aa5a95a57a5228b361390e5fc838._comment create mode 100644 doc/forum/Webapp_on_ARM.mdwn create mode 100644 doc/forum/Webapp_on_ARM/comment_1_82ac40cef5b59070136527b8d81a5ce2._comment create mode 100644 doc/forum/Weird_behavior_with_OS_X_Finder_and_Preview.app.mdwn create mode 100644 doc/forum/Weird_behavior_with_OS_X_Finder_and_Preview.app/comment_1_8c8d86790a9d31518f9bb96a2d2dafee._comment create mode 100644 doc/forum/Weird_behavior_with_OS_X_Finder_and_Preview.app/comment_2_b538dc2c6f122b9ce5f7569de1b03f3e._comment create mode 100644 doc/forum/Weird_behavior_with_OS_X_Finder_and_Preview.app/comment_3_16e6724fa184392d4decbe0c4eb6efe6._comment create mode 100644 doc/forum/Weird_behavior_with_OS_X_Finder_and_Preview.app/comment_4_e514fe2d4d0ad6a10e281939e6ab4266._comment create mode 100644 doc/forum/Weird_behavior_with_OS_X_Finder_and_Preview.app/comment_5_e0eec765f72f7bf6f5a2a92c9b5dacad._comment create mode 100644 doc/forum/What_can_be_done_in_case_of_conflict.mdwn create mode 100644 doc/forum/What_can_be_done_in_case_of_conflict/comment_1_5ca86b099dfa08a50f656ea03bf1dcd9._comment create mode 100644 doc/forum/What_can_be_done_in_case_of_conflict/comment_2_69ee17959a92bb8359c0fd7b2a9d8dfb._comment create mode 100644 doc/forum/What_can_be_done_in_case_of_conflict/comment_3_017f4bac57a040c496e0c9d068dcfd9e._comment create mode 100644 doc/forum/What_happened_to_the_walkthrough__63__.mdwn create mode 100644 doc/forum/What_happened_to_the_walkthrough__63__/comment_1_70db0e3cfb1318e95671c23726e5541d._comment create mode 100644 doc/forum/What_happened_to_the_walkthrough__63__/comment_2_f9305dd19b9b5f35e66d915b8c30374b._comment create mode 100644 doc/forum/What_happens_when_in_the_git-annex_assistant_you___34__Add_another_local_repository__34___on_an_existing_repository__63__.mdwn create mode 100644 doc/forum/What_happens_when_in_the_git-annex_assistant_you___34__Add_another_local_repository__34___on_an_existing_repository__63__/comment_1_d844cfe5f9907a766e871b64d68966c2._comment create mode 100644 doc/forum/What_is_the_best_way_to___34__git_annex_mv__34___file__63__.mdwn create mode 100644 doc/forum/What_is_the_best_way_to___34__git_annex_mv__34___file__63__/comment_1_02d305f307b4d2ff7acd98cb36508a2f._comment create mode 100644 doc/forum/What_is_the_difference_between___34__local_computer__34___and___34__remote_server__34__.mdwn create mode 100644 doc/forum/What_is_the_difference_between___34__local_computer__34___and___34__remote_server__34__/comment_1_68734a118b7dc0c88ba67eca20953a55._comment create mode 100644 doc/forum/What_to_do_when_computer_is_lost_and_only_an_encrypted_ssh_remote_is_left__63__.mdwn create mode 100644 doc/forum/What_to_do_when_computer_is_lost_and_only_an_encrypted_ssh_remote_is_left__63__/comment_1_67ee446ca6d66e2c259ea771c2c9a2b2._comment create mode 100644 doc/forum/What_to_do_when_computer_is_lost_and_only_an_encrypted_ssh_remote_is_left__63__/comment_2_6d3cce3c8048e4aea8f0ed76473f6af1._comment create mode 100644 doc/forum/What_to_do_when_computer_is_lost_and_only_an_encrypted_ssh_remote_is_left__63__/comment_3_bd506e1ca7307660b3b9769eb97beddb._comment create mode 100644 doc/forum/Which_cloud_providers_are_supported__63___.mdwn create mode 100644 doc/forum/Which_cloud_providers_are_supported__63___/comment_1_1f9398840144e0452a2fed9336046547._comment create mode 100644 doc/forum/Why_can__39__t_encryption_be_enabled_for_removable_drives__63__.mdwn create mode 100644 doc/forum/Why_can__39__t_encryption_be_enabled_for_removable_drives__63__/comment_1_4341898d5ae4f09a5b06d24f5fe6192d._comment create mode 100644 doc/forum/Why_does_the_bup_remote_use___126____47__.bup__63__.mdwn create mode 100644 doc/forum/Why_does_the_bup_remote_use___126____47__.bup__63__/comment_1_da9c7c0e93aefc2da7409de5b138d86f._comment create mode 100644 doc/forum/Will_git-annex_solve_my_problem__63__.mdwn create mode 100644 doc/forum/Will_git-annex_solve_my_problem__63__/comment_1_35acbdd1a7727df204d776c2e8f02b53._comment create mode 100644 doc/forum/Will_git-annex_solve_my_problem__63__/comment_2_230256c19ac139dea207d89c06f70782._comment create mode 100644 doc/forum/Will_git_annex_work_on_a_FAT32_formatted_key__63__.mdwn create mode 100644 doc/forum/Will_git_annex_work_on_a_FAT32_formatted_key__63__/comment_1_426482e6eb3a27687a48f24f6ef2332f._comment create mode 100644 doc/forum/Will_git_annex_work_on_a_FAT32_formatted_key__63__/comment_2_af4f8b52526d8bea2904c95406fd2796._comment create mode 100644 doc/forum/Windows_S3_host_issue.mdwn create mode 100644 doc/forum/Windows_S3_host_issue/comment_1_8c0a1e84713a04a25fdc1f74919d34aa._comment create mode 100644 doc/forum/Windows_S3_host_issue/comment_2_06ecc76797c430b27a2e24776761d043._comment create mode 100644 doc/forum/Windows_S3_host_issue/comment_3_1715557daa15b9e9e17b4850141e62af._comment create mode 100644 doc/forum/Windows_support.mdwn create mode 100644 doc/forum/Windows_support/comment_1_23fa9aa3b00940a1c1b3876c35eef019._comment create mode 100644 doc/forum/Windows_usage_instructions.mdwn create mode 100644 doc/forum/Windows_usage_instructions/comment_1_d43dbd9406da3b9747b147715eca94ac._comment create mode 100644 doc/forum/Wishlist:_Bittorrent-like_transfers.mdwn create mode 100644 doc/forum/Wishlist:_Bittorrent-like_transfers/comment_1_13544d54fb0418af4ca9200cdb045d91._comment create mode 100644 doc/forum/Wishlist:_Bittorrent-like_transfers/comment_2_9a7dad35bf80c684ad97892420d7370c._comment create mode 100644 doc/forum/Wishlist:_Bittorrent-like_transfers/comment_3_e5de748bc5da12a4a01e08cde2407dd1._comment create mode 100644 doc/forum/Wishlist:_Bittorrent-like_transfers/comment_4_e51530178f1e034c0fdd5c9aa9945567._comment create mode 100644 doc/forum/Wishlist:_Bittorrent-like_transfers/comment_5_81ea9c129d8c02097f09ef8c68f1bb11._comment create mode 100644 doc/forum/Wishlist:_Bittorrent-like_transfers/comment_6_3b5798414f89686526da3dfa72c0c4f2._comment create mode 100644 doc/forum/Wishlist:_Don__39__t_make_files_readonly.mdwn create mode 100644 doc/forum/Wishlist:_Don__39__t_make_files_readonly/comment_1_7148527961e2d27793810966588c8d35._comment create mode 100644 doc/forum/Wishlist:_Is_it_possible_to___34__unlock__34___files_without_copying_the_file_data__63__.mdwn create mode 100644 doc/forum/Wishlist:_Is_it_possible_to___34__unlock__34___files_without_copying_the_file_data__63__/comment_1_1cf4ab29dfa2cff59b86305fc0018251._comment create mode 100644 doc/forum/Wishlist:_Is_it_possible_to___34__unlock__34___files_without_copying_the_file_data__63__/comment_2_f5ebb7f43dcef861ecc13373fb1e263f._comment create mode 100644 doc/forum/Wishlist:_Ways_of_selecting_files_based_on_meta-information.mdwn create mode 100644 doc/forum/Wishlist:_Ways_of_selecting_files_based_on_meta-information/comment_1_818f38aa988177d3a9415055e084f0fb._comment create mode 100644 doc/forum/Wishlist:_Ways_of_selecting_files_based_on_meta-information/comment_2_97e2ed48bd552d02918c4f98f963e6e1._comment create mode 100644 doc/forum/Wishlist:_automatic_reinject.mdwn create mode 100644 doc/forum/Wishlist:_getting_the_disk_used_by_a_subtree_of_files.mdwn create mode 100644 doc/forum/Wishlist:_getting_the_disk_used_by_a_subtree_of_files/comment_1_7abb1155081a23ce4829ee69b2064541._comment create mode 100644 doc/forum/Wishlist:_getting_the_disk_used_by_a_subtree_of_files/comment_2_b4c6ebada7526263e04c70eac312fda9._comment create mode 100644 doc/forum/Wishlist:_getting_the_disk_used_by_a_subtree_of_files/comment_3_ded71b270b94617a8ebb3a713d46a274._comment create mode 100644 doc/forum/Wishlist:_logging_to_file_when_running_as_a_daemon___40__for_the_assistant__41__.mdwn create mode 100644 doc/forum/Wishlist:_logging_to_file_when_running_as_a_daemon___40__for_the_assistant__41__/comment_1_42aa2b61b880f4048d874210212aa63b._comment create mode 100644 doc/forum/Wishlist:_logging_to_file_when_running_as_a_daemon___40__for_the_assistant__41__/comment_2_3e201039fa0e611554171ee30e69a414._comment create mode 100644 doc/forum/Wishlist:_logging_to_file_when_running_as_a_daemon___40__for_the_assistant__41__/comment_3_d1074724c44f3296cb438b2d526d8728._comment create mode 100644 doc/forum/Wishlist:_mark_remotes_offline.mdwn create mode 100644 doc/forum/Wishlist:_mark_remotes_offline/comment_1_9e3901f0123abb66034cce95cc5a941a._comment create mode 100644 doc/forum/Wishlist:_mark_remotes_offline/comment_2_d10e3d90cf421ae425e64ab266ea811b._comment create mode 100644 doc/forum/Wishlist:_options_for_syncing_meta-data_and_data.mdwn create mode 100644 doc/forum/Wishlist:_rename_files__47__dirs_w__47___special_characters_if_filesystem_is_FAT.mdwn create mode 100644 doc/forum/Wishlist:_rename_files__47__dirs_w__47___special_characters_if_filesystem_is_FAT/comment_1_5d33bcbd862537f53edd91dcff2b8977._comment create mode 100644 doc/forum/XBMC__44___NFS___38___git-annex_.mdwn create mode 100644 doc/forum/XBMC__44___NFS___38___git-annex_/comment_1_86480f31d410e903766f82e6ecf83e1c._comment create mode 100644 doc/forum/XBMC__44___NFS___38___git-annex_/comment_2_d8ed4dd51d3050db691a8abdec24cd42._comment create mode 100644 doc/forum/XBMC__44___NFS___38___git-annex_/comment_3_42b80ee51ce25775bf4532f53a8ecfe3._comment create mode 100644 doc/forum/XBMC__44___NFS___38___git-annex_/comment_4_01767f3f864954cf8080274e206da9d4._comment create mode 100644 doc/forum/XMPP_authentication_failure.mdwn create mode 100644 doc/forum/XMPP_authentication_failure/comment_1_19c7c3aa79d209d613d2e061e3129690._comment create mode 100644 doc/forum/XMPP_authentication_failure/comment_2_870059fed451e8377e5d382464ecc34b._comment create mode 100644 doc/forum/XMPP_authentication_failure/comment_3_1a7ff955e9173f13d10b75f203792384._comment create mode 100644 doc/forum/XMPP_authentication_failure/comment_4_d59031ebc0dd3abc1f4c96878328362c._comment create mode 100644 doc/forum/XMPP_authentication_failure/comment_5_c37ef477bef7efdb79dd05dce90dfde6._comment create mode 100644 doc/forum/XMPP_authentication_failure/comment_6_48cabea4c2caf5b3bd854df3aaa17d3d._comment create mode 100644 doc/forum/XMPP_authentication_failure/comment_7_14cd9b67806db93c3af055d88c9a910a._comment create mode 100644 doc/forum/XMPP_authentication_failure/comment_8_151d3fd7d3cceb30fd20a8f3bd54036c._comment create mode 100644 doc/forum/XMPP_authentication_failure/comment_9_fbb9eba65fbb72201f08511945fbcf8c._comment create mode 100644 doc/forum/XMPP_email_setup_says_wrong_password_but_it__39__s_correct._Can_I_provide_some_kind_of_debug_data__63__.mdwn create mode 100644 doc/forum/XMPP_email_setup_says_wrong_password_but_it__39__s_correct._Can_I_provide_some_kind_of_debug_data__63__/comment_1_1ba0735141fc6a21ac15913f4cacefae._comment create mode 100644 doc/forum/XMPP_email_setup_says_wrong_password_but_it__39__s_correct._Can_I_provide_some_kind_of_debug_data__63__/comment_2_16994dc86b87592fc62799e2d206d172._comment create mode 100644 doc/forum/XMPP_email_setup_says_wrong_password_but_it__39__s_correct._Can_I_provide_some_kind_of_debug_data__63__/comment_3_6afd424edc4095b8f71b136de2a9e64d._comment create mode 100644 doc/forum/XMPP_email_setup_says_wrong_password_but_it__39__s_correct._Can_I_provide_some_kind_of_debug_data__63__/comment_4_1381b6a927410642c6a93aa8354be791._comment create mode 100644 doc/forum/XMPP_email_setup_says_wrong_password_but_it__39__s_correct._Can_I_provide_some_kind_of_debug_data__63__/comment_5_c5b33c7a8aa8e6d0f9349510dac2366d._comment create mode 100644 doc/forum/XMPP_email_setup_says_wrong_password_but_it__39__s_correct._Can_I_provide_some_kind_of_debug_data__63__/comment_6_9913d2983ba2744ed24911f74988e4c7._comment create mode 100644 doc/forum/XMPP_email_setup_says_wrong_password_but_it__39__s_correct._Can_I_provide_some_kind_of_debug_data__63__/comment_7_ad6f385a2b95803eb9d81dfe76359551._comment create mode 100644 doc/forum/_Does_git_annex_find___40____38___friends__41___batch_queries_to_the_location_log__63__.mdwn create mode 100644 doc/forum/_Does_git_annex_find___40____38___friends__41___batch_queries_to_the_location_log__63__/comment_1_01cbfc513c790faef3a3ede5315d3589._comment create mode 100644 doc/forum/_Does_git_annex_find___40____38___friends__41___batch_queries_to_the_location_log__63__/comment_2_fe28dfb360caa12d5d5bc186def3eb45._comment create mode 100644 doc/forum/_Does_git_annex_find___40____38___friends__41___batch_queries_to_the_location_log__63__/comment_3_9bb30ab62febe4ef63bed49f831a473a._comment create mode 100644 doc/forum/_Does_git_annex_find___40____38___friends__41___batch_queries_to_the_location_log__63__/comment_4_7832f0347a41b8204538c01b72487803._comment create mode 100644 doc/forum/__34__Pairing__34___more_than_two_computers.mdwn create mode 100644 doc/forum/__34__Pairing__34___more_than_two_computers/comment_1_80f7a4bb3c66b11e566043407b611bbf._comment create mode 100644 doc/forum/__34__du__34___equivalent_on_an_annex__63__.mdwn create mode 100644 doc/forum/__34__du__34___equivalent_on_an_annex__63__/comment_1_a41bd02361aa961e5285aeaf1ea062be._comment create mode 100644 doc/forum/__34__du__34___equivalent_on_an_annex__63__/comment_2_28ba62a546f5cc8f416491423d743d8a._comment create mode 100644 doc/forum/__34__du__34___equivalent_on_an_annex__63__/comment_3_8d97f40c1d14b7230f3656a00a99cf80._comment create mode 100644 doc/forum/__34__du__34___equivalent_on_an_annex__63__/comment_4_baa8fbbdd5c449a0dc2bb622cb4a47ce._comment create mode 100644 doc/forum/__34__du__34___equivalent_on_an_annex__63__/comment_5_2ee6cbbfe54a2e7b6e8eb539c18e663d._comment create mode 100644 doc/forum/__34__du__34___equivalent_on_an_annex__63__/comment_6_48f6a2761a34b7f991325f1d24e2c5ff._comment create mode 100644 doc/forum/__34__du__34___equivalent_on_an_annex__63__/comment_7_d632baff41b8582f1a79bc5018c68545._comment create mode 100644 doc/forum/__34__git_annex_copy_--to___60__REMOTE__62___.__34___doesn__39__t_send_it_to_working_directory..mdwn create mode 100644 doc/forum/__34__git_annex_copy_--to___60__REMOTE__62___.__34___doesn__39__t_send_it_to_working_directory./comment_1_0c0a5999a92bf5880f2113177dc67cc2._comment create mode 100644 doc/forum/__34__git_annex_copy_--to___60__REMOTE__62___.__34___doesn__39__t_send_it_to_working_directory./comment_2_c18083d9054f66f0bd51d63452af07eb._comment create mode 100644 doc/forum/__34__git_annex_lock__34___very_slow_for_big_repo.mdwn create mode 100644 doc/forum/__34__git_annex_lock__34___very_slow_for_big_repo/comment_1_044f1c5e5f7a939315c28087495a8ba8._comment create mode 100644 doc/forum/__34__git_annex_lock__34___very_slow_for_big_repo/comment_2_e854b93415d5ab80eda8e3be3b145ec2._comment create mode 100644 doc/forum/__34__git_annex_lock__34___very_slow_for_big_repo/comment_3_95c110500bc54013bc1969c1a9c8f842._comment create mode 100644 doc/forum/__34__next_time_Im_online_I_would_like_to_have_file_x_y_z__34__.mdwn create mode 100644 doc/forum/__34__next_time_Im_online_I_would_like_to_have_file_x_y_z__34__/comment_1_bfeb1446dee4d2f52ef25fabfb8cc8f6._comment create mode 100644 doc/forum/__34__next_time_Im_online_I_would_like_to_have_file_x_y_z__34__/comment_2_e60f2bbc1c058993472fd920edbc75fc._comment create mode 100644 doc/forum/__34__permission_denied__34___in_fsck_on_shared_repo.mdwn create mode 100644 doc/forum/__34__permission_denied__34___in_fsck_on_shared_repo/comment_1_3a5202ef2116ebb5559b6f4d920755fc._comment create mode 100644 doc/forum/__34__permission_denied__34___in_fsck_on_shared_repo/comment_2_86663eeb75b0477f53c45f26c8e4b051._comment create mode 100644 doc/forum/__34__permission_denied__34___in_fsck_on_shared_repo/comment_3_c336b2b07cd006d378e5be9639ff17ec._comment create mode 100644 doc/forum/__34__permission_denied__34___in_fsck_on_shared_repo/comment_4_1339cd27ca2955f30b01ecf4da7d6fe8._comment create mode 100644 doc/forum/__34__unable_to_resolve_reference_refs__47__heads__47__git-annex__34__.mdwn create mode 100644 doc/forum/__34__unable_to_resolve_reference_refs__47__heads__47__git-annex__34__/comment_1_e50188896df347f1d92e20a52053aa14._comment create mode 100644 doc/forum/__34__unable_to_resolve_reference_refs__47__heads__47__git-annex__34__/comment_2_d67793f7c969f64943d1fd54a1208c2b._comment create mode 100644 doc/forum/__34__unable_to_resolve_reference_refs__47__heads__47__git-annex__34__/comment_3_3523884833b5fd458a35f898797bf897._comment create mode 100644 doc/forum/__34__unable_to_resolve_reference_refs__47__heads__47__git-annex__34__/comment_4_02c32c2521ba1a1eaa19eaca7281f2a6._comment create mode 100644 doc/forum/__91__Installation__93___base-3.0.3.2_requires_syb___61____61__0.1.0.2.mdwn create mode 100644 doc/forum/__91__Installation__93___base-3.0.3.2_requires_syb___61____61__0.1.0.2/comment_1_fae6e88115d175239fc55cef4c33fb2c._comment create mode 100644 doc/forum/__91__Installation__93___base-3.0.3.2_requires_syb___61____61__0.1.0.2/comment_2_4c7a75638e8717132ccde949018d6008._comment create mode 100644 doc/forum/__91__NEED_HELP__93___manual_ssh_remote_setup_with_shared_key.mdwn create mode 100644 doc/forum/__91__NEED_HELP__93___manual_ssh_remote_setup_with_shared_key/comment_1_811cab17410ba6e07ae7af3249cd98df._comment create mode 100644 doc/forum/_preferred_content:_lastpresent.mdwn create mode 100644 doc/forum/_preferred_content:_lastpresent/comment_1_7610cd866b256d36646b642eb5f8cae5._comment create mode 100644 doc/forum/_preferred_content:_lastpresent/comment_2_d25666a173b78213d583f029fd166d06._comment create mode 100644 doc/forum/advantages_of_SHA__42___over_WORM.mdwn create mode 100644 doc/forum/advantages_of_SHA__42___over_WORM/comment_1_96c354cac4b5ce5cf6664943bc84db1d._comment create mode 100644 doc/forum/alternativeto.net___34__Like__34__.mdwn create mode 100644 doc/forum/android_binary-only_download.mdwn create mode 100644 doc/forum/android_binary-only_download/comment_1_aab206e0bf0bb5ff47c7cc9795f12f92._comment create mode 100644 doc/forum/annexed_file_key_for_web_remote_with_SHA256E_backend.mdwn create mode 100644 doc/forum/annexed_file_key_for_web_remote_with_SHA256E_backend/comment_1_d1605a6e3b4d6863f4089218994ce564._comment create mode 100644 doc/forum/annexed_file_key_for_web_remote_with_SHA256E_backend/comment_2_d249ff27fa3d9ac3ca32485cdef49930._comment create mode 100644 doc/forum/archaeology_of_deleted_files.mdwn create mode 100644 doc/forum/archaeology_of_deleted_files/comment_1_48f27df03ec18d2c27cf6b70dcf71dc5._comment create mode 100644 doc/forum/archaeology_of_deleted_files/comment_2_c698cd10c8038bac45bd1049506a27c3._comment create mode 100644 doc/forum/archival_and_multiple_users.mdwn create mode 100644 doc/forum/archival_and_multiple_users/comment_1_fc4ee256f03a7c189d687caf4a34e21e._comment create mode 100644 doc/forum/archival_and_multiple_users/comment_2_a96d57d4bb567ac9b0b9167d5b1be011._comment create mode 100644 doc/forum/archival_and_multiple_users/comment_3_bd44634b04732ffb91154c61ef9cf828._comment create mode 100644 doc/forum/archival_and_multiple_users/comment_4_b89a56a5f1cd641f87925c7a5f74bcec._comment create mode 100644 doc/forum/archival_and_multiple_users/comment_5_81293bf5dc8ad4552712c2083fd589c9._comment create mode 100644 doc/forum/assistant__44___direct_mode__44___large_files__44___command_line_-_how_do_these_play_together__63__.mdwn create mode 100644 doc/forum/assistant__44___direct_mode__44___large_files__44___command_line_-_how_do_these_play_together__63__/comment_1_d90d1d599ce557af03c6f0f2ea188212._comment create mode 100644 doc/forum/assistant__44___direct_mode__44___large_files__44___command_line_-_how_do_these_play_together__63__/comment_2_58b1af497cab132acb28cb5f9283ec2a._comment create mode 100644 doc/forum/assistant__44___direct_mode__44___large_files__44___command_line_-_how_do_these_play_together__63__/comment_3_37d4fd8f69e8066b5aa19454b714e443._comment create mode 100644 doc/forum/assistant__44___direct_mode__44___large_files__44___command_line_-_how_do_these_play_together__63__/comment_4_a974e2105774d4f82ad286ff0792ba84._comment create mode 100644 doc/forum/assistant_created_encrypted__backup_remote:_Howto_restore__63__.mdwn create mode 100644 doc/forum/assistant_created_encrypted__backup_remote:_Howto_restore__63__/comment_1_70200f871b9df49261f32752a6bb0e67._comment create mode 100644 doc/forum/assistant_created_encrypted__backup_remote:_Howto_restore__63__/comment_2_173da510b45f0320ae8aa2df9f14ae7b._comment create mode 100644 doc/forum/assistant_overzealously_moving_stuff_to_other_repos.mdwn create mode 100644 doc/forum/assistant_overzealously_moving_stuff_to_other_repos/comment_1_6bd240edf1868615024ff11c24c3d52c._comment create mode 100644 doc/forum/assistant_overzealously_moving_stuff_to_other_repos/comment_2_37c5e9a7669b5b94fbadb8792a765316._comment create mode 100644 doc/forum/assistant_overzealously_moving_stuff_to_other_repos/comment_3_87aa4c5942929be81ddc1e2795d56f0e._comment create mode 100644 doc/forum/assistant_without_watch__63__.mdwn create mode 100644 doc/forum/assistant_without_watch__63__/comment_1_be1f7c038426e53209a85ae1119269d5._comment create mode 100644 doc/forum/assitant:_special_remote_server___40__needs_ssh_tunnel__41__.mdwn create mode 100644 doc/forum/assitant:_special_remote_server___40__needs_ssh_tunnel__41__/comment_1_817a3ed424e4fb76fcd33295f2953250._comment create mode 100644 doc/forum/autobuilders_for_git-annex_to_aid_development.mdwn create mode 100644 doc/forum/autobuilders_for_git-annex_to_aid_development/comment_1_7e88f815e8d9652ef18ea6d54b118962._comment create mode 100644 doc/forum/autobuilders_for_git-annex_to_aid_development/comment_2_fef17a10226af5671495c2929653c337._comment create mode 100644 doc/forum/avoid_rehashing_when_converting_existing_backups_into_new_remotes.mdwn create mode 100644 doc/forum/bainstorming:_git_annex_push___38___pull.mdwn create mode 100644 doc/forum/bainstorming:_git_annex_push___38___pull/comment_1_3a0bf74b51586354b7a91f8b43472376._comment create mode 100644 doc/forum/bainstorming:_git_annex_push___38___pull/comment_2_b02ca09914e788393c01196686f95831._comment create mode 100644 doc/forum/bash_completion.mdwn create mode 100644 doc/forum/bash_completion/comment_1_5c42c0c8e7fc3224bf5406880f9fd0c4._comment create mode 100644 doc/forum/bash_completion/comment_2_6cbe3c825db99bf9188a0de8bb937d5b._comment create mode 100644 doc/forum/bash_completion/comment_3_948c40f1e46ca220d61365aebcd4f6d7._comment create mode 100644 doc/forum/bash_completion/comment_4_dbae348b230b780cda91ed8576b8f9fa._comment create mode 100644 doc/forum/batch_check_on_remote_when_using_copy.mdwn create mode 100644 doc/forum/benefit_of_splitting_a_repository.mdwn create mode 100644 doc/forum/benefit_of_splitting_a_repository/comment_1_93a86cb03b66e7ab5dd7146e7b86c9e8._comment create mode 100644 doc/forum/benefit_of_splitting_a_repository/comment_2_4e2fed247298d620fee7be883a1e86a6._comment create mode 100644 doc/forum/btsync_equivalent__63__.mdwn create mode 100644 doc/forum/btsync_equivalent__63__/comment_1_6bfdc6f595a8aa8979a7c2a10925812f._comment create mode 100644 doc/forum/cabal_install_fails_on_uuid.mdwn create mode 100644 doc/forum/cabal_install_fails_on_uuid/comment_1_2a3963e21bc7ff526124b902cb0b6ad2._comment create mode 100644 doc/forum/cabal_install_fails_on_uuid/comment_2_1609525998e2b36c04d67f4d988139c0._comment create mode 100644 doc/forum/can_I_only_add_my_own_files__63__.mdwn create mode 100644 doc/forum/can_I_only_add_my_own_files__63__/comment_1_767d647af9d0345f337338d6319071fa._comment create mode 100644 doc/forum/can_I_only_add_my_own_files__63__/comment_2_0c3306ffb38b97b54e1e0436d12c1876._comment create mode 100644 doc/forum/can_git-annex_replace_ddm__63__.mdwn create mode 100644 doc/forum/can_git-annex_replace_ddm__63__/comment_1_aa05008dfe800474ff76678a400099e1._comment create mode 100644 doc/forum/can_git-annex_replace_ddm__63__/comment_2_008554306dd082d7f543baf283510e92._comment create mode 100644 doc/forum/can_git-annex_replace_ddm__63__/comment_3_4c69097fe2ee81359655e59a03a9bb8d._comment create mode 100644 doc/forum/cannot_fetch_from___40__gpg-encrypted__41___rsync_remote_on_MacOSX.mdwn create mode 100644 doc/forum/cannot_fetch_from___40__gpg-encrypted__41___rsync_remote_on_MacOSX/comment_1_21f0101447623f5a0cf9e72c3ff463bb._comment create mode 100644 doc/forum/cannot_fetch_from___40__gpg-encrypted__41___rsync_remote_on_MacOSX/comment_2_6234ca64bd03a0e15efbe8f5c204338a._comment create mode 100644 doc/forum/cannot_fetch_from___40__gpg-encrypted__41___rsync_remote_on_MacOSX/comment_3_5ac2b520a907e232984eb513ce088054._comment create mode 100644 doc/forum/cannot_fetch_from___40__gpg-encrypted__41___rsync_remote_on_MacOSX/comment_4_183dd1c29f66539193e7c0b73f329430._comment create mode 100644 doc/forum/cannot_fetch_from___40__gpg-encrypted__41___rsync_remote_on_MacOSX/comment_5_c920d04ffe332caed9d223fa0ac42746._comment create mode 100644 doc/forum/cannot_fetch_from___40__gpg-encrypted__41___rsync_remote_on_MacOSX/comment_6_7a3cf0853a8ec7b996e19b5e80145d21._comment create mode 100644 doc/forum/central_non-bare_and_git_push.mdwn create mode 100644 doc/forum/central_non-bare_and_git_push/comment_1_76d0c73c8985e860eb86333c63be6340._comment create mode 100644 doc/forum/clear_box.com_repository.mdwn create mode 100644 doc/forum/clear_box.com_repository/comment_1_2e839d8f974269c80a9fca183712350f._comment create mode 100644 doc/forum/clear_box.com_repository/comment_2_8f9c7248a148a24ae2aba39c4a79a6d1._comment create mode 100644 doc/forum/clear_box.com_repository/comment_3_f64ad21e5abfbf4e1f925b3d651bdba3._comment create mode 100644 doc/forum/clear_box.com_repository/comment_4_f8c06ac9b23b51cf18d362c260fc47a9._comment create mode 100644 doc/forum/clear_box.com_repository/comment_5_61d401b29322802cb25896503f3e6514._comment create mode 100644 doc/forum/cloud_services_to_support.mdwn create mode 100644 doc/forum/cloudcmd.mdwn create mode 100644 doc/forum/commit_current_workdir_state_in_direct_mode.mdwn create mode 100644 doc/forum/commit_current_workdir_state_in_direct_mode/comment_1_748481ff00374f570284bd4571584874._comment create mode 100644 doc/forum/confused_about_external_drives.mdwn create mode 100644 doc/forum/confused_about_external_drives/comment_1_8340e5ff17a4846b41789e4966fed70c._comment create mode 100644 doc/forum/confused_about_external_drives/comment_2_ad10bd0ec14c16bcad089b3ebe64580e._comment create mode 100644 doc/forum/confusion_with_remotes__44___map.mdwn create mode 100644 doc/forum/confusion_with_remotes__44___map/comment_1_a38ded23b7f288292a843abcb1a56f38._comment create mode 100644 doc/forum/confusion_with_remotes__44___map/comment_2_cd1c98b1276444e859a22c3dbd6f2a79._comment create mode 100644 doc/forum/confusion_with_remotes__44___map/comment_3_18531754089c991b6caefc57a5c17fe9._comment create mode 100644 doc/forum/confusion_with_remotes__44___map/comment_4_3b89b6d1518267fcbc050c9de038b9ca._comment create mode 100644 doc/forum/confusion_with_remotes__44___map/comment_5_27801584325d259fa490f67273f2ff71._comment create mode 100644 doc/forum/confusion_with_remotes__44___map/comment_6_496b0d9b86869bbac3a1356d53a3dda4._comment create mode 100644 doc/forum/confusion_with_remotes__44___map/comment_7_9a456f61f956a3d5e81e723d5a90794c._comment create mode 100644 doc/forum/correct_way_to_add_two_preexisting_datasets.mdwn create mode 100644 doc/forum/correct_way_to_add_two_preexisting_datasets/comment_1_c5c3ff25c9f5e34db222b5f4ae58b093._comment create mode 100644 doc/forum/correct_way_to_add_two_preexisting_datasets/comment_2_ee3ecc86990ac5a8d0c4fdfb482a7594._comment create mode 100644 doc/forum/correct_way_to_add_two_preexisting_datasets/comment_3_e29bf8b848da04c761dc601ac979ac14._comment create mode 100644 doc/forum/could_not_read_from_remote_repository.mdwn create mode 100644 doc/forum/could_not_read_from_remote_repository/comment_1_27d4d1556a80c06505ed3d8a9422d082._comment create mode 100644 doc/forum/do_not_use_git-annex_inside_your_Dropbox.mdwn create mode 100644 doc/forum/do_not_use_git-annex_inside_your_Dropbox/comment_1_5a1dc9da6e6861829e321446ec7991ee._comment create mode 100644 doc/forum/dot_git_slash_annex_slash_tmp.mdwn create mode 100644 doc/forum/dot_git_slash_annex_slash_tmp/comment_10_14b74438bb1e3e02cff7926d774ba09a._comment create mode 100644 doc/forum/dot_git_slash_annex_slash_tmp/comment_11_b1f717342c1c8ea42a451caa2d936622._comment create mode 100644 doc/forum/dot_git_slash_annex_slash_tmp/comment_12_e2c6ad99333018c8c46e736da416b8ef._comment create mode 100644 doc/forum/dot_git_slash_annex_slash_tmp/comment_13_35ae9d6bcb8d9762a92e3564b686ed72._comment create mode 100644 doc/forum/dot_git_slash_annex_slash_tmp/comment_1_1a35ef8cb89e0cd392f6e9fcee1fb92c._comment create mode 100644 doc/forum/dot_git_slash_annex_slash_tmp/comment_2_f4cc36c493d7c20fbaf949edd38e1252._comment create mode 100644 doc/forum/dot_git_slash_annex_slash_tmp/comment_3_69268f8aa29e807a56248f1fac86aa41._comment create mode 100644 doc/forum/dot_git_slash_annex_slash_tmp/comment_4_0ffb0c803c232a1587f956f16113aeb7._comment create mode 100644 doc/forum/dot_git_slash_annex_slash_tmp/comment_5_c303e28825241733d69fca74f2015fc6._comment create mode 100644 doc/forum/dot_git_slash_annex_slash_tmp/comment_6_3f0b376e37bd092b8d46c46bb1940e35._comment create mode 100644 doc/forum/dot_git_slash_annex_slash_tmp/comment_7_615641b3dd176d4b3a5bbfb521098e38._comment create mode 100644 doc/forum/dot_git_slash_annex_slash_tmp/comment_8_4600fa9234a787004ea0e0dbb36184b9._comment create mode 100644 doc/forum/dot_git_slash_annex_slash_tmp/comment_9_4f5cd0d0d4db0479c1ad86ffdc5ae434._comment create mode 100644 doc/forum/drop_old_versions_of_a_file.mdwn create mode 100644 doc/forum/drop_old_versions_of_a_file/comment_1_799a413248fb8f98efbf226b1bc4300d._comment create mode 100644 doc/forum/endless_password_prompt_loop.mdwn create mode 100644 doc/forum/endless_password_prompt_loop/comment_1_cceba12ed25cd671c7cee5a28631163e._comment create mode 100644 doc/forum/endless_password_prompt_loop/comment_2_f0cb86b45eb289f35197c43f83660a8f._comment create mode 100644 doc/forum/error_in_installation_of_base-4.5.0.0.mdwn create mode 100644 doc/forum/error_in_installation_of_base-4.5.0.0/comment_1_0b2f79c014e0dd9badd52b8b6aa47e0c._comment create mode 100644 doc/forum/error_in_installation_of_base-4.5.0.0/comment_2_3badd64e48fbb174cd7de1ac9589bedf._comment create mode 100644 doc/forum/error_in_installation_of_base-4.5.0.0/comment_3_d8190061ac1c683a7b699cf42e9db694._comment create mode 100644 doc/forum/error_in_installation_of_base-4.5.0.0/comment_4_49a4fcd2dc4f97d4055b5051feea5e3b._comment create mode 100644 doc/forum/example_of_massively_disconnected_operation.mdwn create mode 100644 doc/forum/exclude_files_from_annex.mdwn create mode 100644 doc/forum/exclude_files_from_annex/comment_1_82e7de5e631bae3b347815586274a936._comment create mode 100644 doc/forum/exclude_files_from_annex/comment_2_03d4599fdceb3dff184eed82824674bc._comment create mode 100644 doc/forum/expire_files__44___move_to_other_hosts.mdwn create mode 100644 doc/forum/expire_files__44___move_to_other_hosts/comment_1_ddcc2a00be1ae96a352d75a443458bcf._comment create mode 100644 doc/forum/expire_files__44___move_to_other_hosts/comment_2_7a4c3858c5eae409d04de3f9da43b57e._comment create mode 100644 doc/forum/exporting_annexed_files.mdwn create mode 100644 doc/forum/exporting_annexed_files/comment_1_e08e4c79588e17fb2f1cdf53d9fab7ea._comment create mode 100644 doc/forum/exporting_annexed_files/comment_2_15dc3024417b5b2ff3544a08beacab34._comment create mode 100644 doc/forum/exporting_annexed_files/comment_3_86f0e0f767a84a0f583e121d36cb7d48._comment create mode 100644 doc/forum/fail_to_git_annex_add_some_files:_getFileStatus:_does_not_exist__40__v_3.20111231__41__.mdwn create mode 100644 doc/forum/fail_to_git_annex_add_some_files:_getFileStatus:_does_not_exist__40__v_3.20111231__41__/comment_1_990197bf01351dc1ccbe1940d5084adb._comment create mode 100644 doc/forum/fail_to_git_annex_add_some_files:_getFileStatus:_does_not_exist__40__v_3.20111231__41__/comment_2_3bb1d21b7f0d0bd6d59190ae9d246d46._comment create mode 100644 doc/forum/fail_to_git_annex_add_some_files:_getFileStatus:_does_not_exist__40__v_3.20111231__41__/comment_3_692f268218690437138ae0540c879425._comment create mode 100644 doc/forum/faking_location_information.mdwn create mode 100644 doc/forum/first-time_setup_git-annex.mdwn create mode 100644 doc/forum/first-time_setup_git-annex/comment_1_a58d83ee3a7c2251d9a775847223f8ca._comment create mode 100644 doc/forum/flickrannex_--_not_sure_I_get_it.mdwn create mode 100644 doc/forum/flickrannex_--_not_sure_I_get_it/comment_1_57ea9f26760f970a70f09934d31a79b5._comment create mode 100644 doc/forum/flickrannex_--_not_sure_I_get_it/comment_2_ba93563b4ce1f6497a9f1d5e6eb0d1bb._comment create mode 100644 doc/forum/flickrannex_--_not_sure_I_get_it/comment_3_74f143965f48c89a3583acf1b6a7635a._comment create mode 100644 doc/forum/flickrannex_--_not_sure_I_get_it/comment_4_493bb86dedfa91ccc0c9be4045953ee4._comment create mode 100644 doc/forum/flickrannex_--_not_sure_I_get_it/comment_5_2c410aa478b21c0e6eb0e4d54bc8c362._comment create mode 100644 doc/forum/fsck_gives_false_positives.mdwn create mode 100644 doc/forum/fsck_gives_false_positives/comment_1_b91070218b9d5fb687eeee1f244237ad._comment create mode 100644 doc/forum/fsck_gives_false_positives/comment_2_f51c53f3f6e6ee1ad463992657db5828._comment create mode 100644 doc/forum/fsck_gives_false_positives/comment_3_692d6d4cd2f75a497e7d314041a768d2._comment create mode 100644 doc/forum/fsck_gives_false_positives/comment_4_7ceb395bf8a2e6a041ccd8de63b1b6eb._comment create mode 100644 doc/forum/fsck_gives_false_positives/comment_5_86484a504c3bbcecd5876982b9c95688._comment create mode 100644 doc/forum/fsck_gives_false_positives/comment_6_1d4fbbd212fa92967abda346323031f4._comment create mode 100644 doc/forum/gadu_-_git-annex_disk_usage.mdwn create mode 100644 doc/forum/gadu_-_git-annex_disk_usage/comment_10_f632a62c4dbbf01b29f146893d7725f9._comment create mode 100644 doc/forum/gadu_-_git-annex_disk_usage/comment_11_73461da2d55d040cb43e0db286975821._comment create mode 100644 doc/forum/gadu_-_git-annex_disk_usage/comment_12_6c4fb123091bde435c18ac3dfd5a9b77._comment create mode 100644 doc/forum/gadu_-_git-annex_disk_usage/comment_1_067d0ffe8900751bd2d2743254ac4d77._comment create mode 100644 doc/forum/gadu_-_git-annex_disk_usage/comment_2_ec8b57426e4d82c3392eb7dd683f2ddc._comment create mode 100644 doc/forum/gadu_-_git-annex_disk_usage/comment_3_38296fef5a2dc5794c2dc09df676b8c1._comment create mode 100644 doc/forum/gadu_-_git-annex_disk_usage/comment_4_1bcc94f9982c6cfd0888f3dba0f9221e._comment create mode 100644 doc/forum/gadu_-_git-annex_disk_usage/comment_5_4365cd3031456fac1b563ee72984638e._comment create mode 100644 doc/forum/gadu_-_git-annex_disk_usage/comment_6_2b03d7b857497cb811e992f85700cdcc._comment create mode 100644 doc/forum/gadu_-_git-annex_disk_usage/comment_7_03a4dfaf3bd73d41c6f3c3fab0a6a922._comment create mode 100644 doc/forum/gadu_-_git-annex_disk_usage/comment_8_fc6ddb4dc075ee42368863c1b026dbf7._comment create mode 100644 doc/forum/gadu_-_git-annex_disk_usage/comment_9_f03254e518cbdda73e4b88e72476275d._comment create mode 100644 doc/forum/get_and_copy_with_bare_repositories.mdwn create mode 100644 doc/forum/get_and_copy_with_bare_repositories/comment_1_a6e4628c0770e3f5e81348a6f29dd845._comment create mode 100644 doc/forum/get_and_copy_with_bare_repositories/comment_2_652fa1bae5c2bb63dcffcbda97a567c4._comment create mode 100644 doc/forum/getting_git_annex_to_do_a_force_copy_to_a_remote.mdwn create mode 100644 doc/forum/getting_git_annex_to_do_a_force_copy_to_a_remote/comment_1_3deb2c31cad37a49896f00d600253ee3._comment create mode 100644 doc/forum/getting_git_annex_to_do_a_force_copy_to_a_remote/comment_2_627f54d158d3ca4b72e45b4da70ff5cd._comment create mode 100644 doc/forum/getting_git_annex_to_do_a_force_copy_to_a_remote/comment_3_3f49dab11aae5df0c4eb5e4b8d741379._comment create mode 100644 doc/forum/git-annex___38___ikiwiki_experiment.mdwn create mode 100644 doc/forum/git-annex___38___ikiwiki_experiment/comment_1_9f74449ec91577dbf6095f4beafac293._comment create mode 100644 doc/forum/git-annex___38___ikiwiki_experiment/comment_2_e034585c8b51cc30b35c1f7ae68205bf._comment create mode 100644 doc/forum/git-annex___38___ikiwiki_experiment/comment_3_fbbd47c3dbe8de24b0df664e4afd5cb8._comment create mode 100644 doc/forum/git-annex___38___ikiwiki_experiment/comment_4_55da5c3c41c13b08590ce1ff8117cef6._comment create mode 100644 doc/forum/git-annex___38___ikiwiki_experiment/comment_5_f67823351164ddfe7d595685c3679652._comment create mode 100644 doc/forum/git-annex___38___ikiwiki_experiment/comment_6_d5cc91164772849d027fed5f962d9000._comment create mode 100644 doc/forum/git-annex___38___ikiwiki_experiment/comment_7_cb4ec7ed3c39d0649133191a85ea6ab3._comment create mode 100644 doc/forum/git-annex___38___ikiwiki_experiment/comment_8_86565e5e1508ff1862f88975446650a2._comment create mode 100644 doc/forum/git-annex_across_two_filesystems.mdwn create mode 100644 doc/forum/git-annex_across_two_filesystems/comment_1_53167648b8b70b41d19ca662a5f3687e._comment create mode 100644 doc/forum/git-annex_across_two_filesystems/comment_2_39adeebc1af9c437f1fc2e00c07509bf._comment create mode 100644 doc/forum/git-annex_across_two_filesystems/comment_3_f4e3f28db005301adeef7ccd2c9998fb._comment create mode 100644 doc/forum/git-annex_across_two_filesystems/comment_4_53fa7ac6f80e3281768a7bfd3d438b34._comment create mode 100644 doc/forum/git-annex_across_two_filesystems/comment_5_2e1be54c01970ef3456e8af4aaf00cbf._comment create mode 100644 doc/forum/git-annex_and_tagfs.mdwn create mode 100644 doc/forum/git-annex_and_tagfs/comment_1_887c74cb61d30198322ef74ebc80f950._comment create mode 100644 doc/forum/git-annex_assistant_with_2_dedicated_servers.mdwn create mode 100644 doc/forum/git-annex_assistant_with_2_dedicated_servers/comment_10_533ade2215c879cd46782fd66a97b167._comment create mode 100644 doc/forum/git-annex_assistant_with_2_dedicated_servers/comment_11_c9ae51d7b772cf7a91d90925f74d2b60._comment create mode 100644 doc/forum/git-annex_assistant_with_2_dedicated_servers/comment_12_41fbee0ec9bc890e309bcd48a58c3851._comment create mode 100644 doc/forum/git-annex_assistant_with_2_dedicated_servers/comment_13_571cffc0beb8ba5fc936db6971cd3d62._comment create mode 100644 doc/forum/git-annex_assistant_with_2_dedicated_servers/comment_14_0fb62af673a4bc8183e8fef048ceedd4._comment create mode 100644 doc/forum/git-annex_assistant_with_2_dedicated_servers/comment_1_53a79af2d8e3abe50b983bf91972b8f2._comment create mode 100644 doc/forum/git-annex_assistant_with_2_dedicated_servers/comment_2_c0ba3e8b7fbf8a5ed718001cec8df676._comment create mode 100644 doc/forum/git-annex_assistant_with_2_dedicated_servers/comment_3_60c39bc8ef74e80e72381d514b6dd223._comment create mode 100644 doc/forum/git-annex_assistant_with_2_dedicated_servers/comment_4_6241120b4325c905661ef72881f4d7af._comment create mode 100644 doc/forum/git-annex_assistant_with_2_dedicated_servers/comment_5_cab00b8fa195340f4d3fdaf5af975b57._comment create mode 100644 doc/forum/git-annex_assistant_with_2_dedicated_servers/comment_6_e24df9a1c68724a912b8ac6533d9bd25._comment create mode 100644 doc/forum/git-annex_assistant_with_2_dedicated_servers/comment_7_ace3dc7c60c710a04b0a587206b341c4._comment create mode 100644 doc/forum/git-annex_assistant_with_2_dedicated_servers/comment_8_9a96bc970a17ed62b0ceb7aa3f0a6f8b._comment create mode 100644 doc/forum/git-annex_assistant_with_2_dedicated_servers/comment_9_ea88e0696f6e25e6904248a323f6cc36._comment create mode 100644 doc/forum/git-annex_build_for_Nokia_N9___40__Meego_Harmattan__41___and_Sailfish_OS.mdwn create mode 100644 doc/forum/git-annex_build_for_Nokia_N9___40__Meego_Harmattan__41___and_Sailfish_OS/comment_1_301a51c48c3d54f9d37feace26a772f8._comment create mode 100644 doc/forum/git-annex_communication_channels.mdwn create mode 100644 doc/forum/git-annex_communication_channels/comment_1_198325d2e9337c90f026396de89eec0e._comment create mode 100644 doc/forum/git-annex_communication_channels/comment_2_c7aeefa6ef9a2e75d8667b479ade1b7f._comment create mode 100644 doc/forum/git-annex_communication_channels/comment_3_1ff08a3e0e63fa0e560cbc9602245caa._comment create mode 100644 doc/forum/git-annex_communication_channels/comment_4_1ba6ddf54843c17c7d19a9996f2ab712._comment create mode 100644 doc/forum/git-annex_communication_channels/comment_5_404b723a681eb93fee015cea8024b6bc._comment create mode 100644 doc/forum/git-annex_communication_channels/comment_6_0d87d0e26461494b1d7f8a701a924729._comment create mode 100644 doc/forum/git-annex_communication_channels/comment_7_2c87c7a0648fe87c2bf6b4391f1cc468._comment create mode 100644 doc/forum/git-annex_on_OSX.mdwn create mode 100644 doc/forum/git-annex_on_Samba_share.mdwn create mode 100644 doc/forum/git-annex_on_Samba_share/comment_1_3e9cfdf2c088e48c967ad08f79966742._comment create mode 100644 doc/forum/git-annex_on_Samba_share/comment_2_9d3df393b7b727653598453d94dd33db._comment create mode 100644 doc/forum/git-annex_on_Ubuntu_13.04_and_13.10_not_working.mdwn create mode 100644 doc/forum/git-annex_on_Ubuntu_13.04_and_13.10_not_working/comment_1_209956f3812450a43986d4ca5e647da6._comment create mode 100644 doc/forum/git-annex_on_Ubuntu_13.04_and_13.10_not_working/comment_3_12a58b8efe545e09b64760c87849839b._comment create mode 100644 doc/forum/git-annex_on_Ubuntu_13.04_and_13.10_not_working/comment_3_e0f7328603256f25c3be3706ecc9c76c._comment create mode 100644 doc/forum/git-annex_on_Ubuntu_13.04_and_13.10_not_working/comment_4_6bb8e4522241556fb82784d9b834cbfe._comment create mode 100644 doc/forum/git-annex_on_Ubuntu_13.04_and_13.10_not_working/comment_5_89a5296b461d400b51006074a13a4560._comment create mode 100644 doc/forum/git-annex_on_Ubuntu_13.04_and_13.10_not_working/comment_6_62daef4b4392c951b914a01b3effac11._comment create mode 100644 doc/forum/git-annex_on_archlinuxarm__44___armv6.mdwn create mode 100644 doc/forum/git-annex_on_archlinuxarm__44___armv6/comment_1_88fa644df8614c2db0d092b3eb1d3156._comment create mode 100644 doc/forum/git-annex_on_archlinuxarm__44___armv6/comment_2_b25ca7520ff7e339ec887a379d5100ee._comment create mode 100644 doc/forum/git-annex_on_archlinuxarm__44___armv6/comment_3_eda0e90c1285396b1ab20ecc04ea6e29._comment create mode 100644 doc/forum/git-annex_on_osx_10.9.1_just_crashes__47__closes__47__doesn__39__t_run_on_launch.mdwn create mode 100644 doc/forum/git-annex_on_osx_10.9.1_just_crashes__47__closes__47__doesn__39__t_run_on_launch/comment_1_a47174f8438bfaa42fb8067bca77bf4c._comment create mode 100644 doc/forum/git-annex_on_osx_10.9.1_just_crashes__47__closes__47__doesn__39__t_run_on_launch/comment_2_567bb460cec7cd2135386acf4e7dceb4._comment create mode 100644 doc/forum/git-annex_pre-commit_eats_all_my_4GB_of_ram.mdwn create mode 100644 doc/forum/git-annex_pre-commit_eats_all_my_4GB_of_ram/comment_1_ff16c7932b60b85c744bafc48bb040e4._comment create mode 100644 doc/forum/git-annex_pre-commit_eats_all_my_4GB_of_ram/comment_2_5599cddf579d18f70cab6e48d04ae99d._comment create mode 100644 doc/forum/git-annex_pre-commit_eats_all_my_4GB_of_ram/comment_3_412941e9385f63153b23695641e71deb._comment create mode 100644 doc/forum/git-annex_pre-commit_eats_all_my_4GB_of_ram/comment_4_112ad140d9006c530db2121bec24de30._comment create mode 100644 doc/forum/git-annex_pre-commit_eats_all_my_4GB_of_ram/comment_5_9178023b95683a649355f291165a1467._comment create mode 100644 doc/forum/git-annex_pre-commit_eats_all_my_4GB_of_ram/comment_6_9251203421c1c3c3aed7828c4b97ecb8._comment create mode 100644 doc/forum/git-annex_teams___47___groups.mdwn create mode 100644 doc/forum/git-annex_teams___47___groups/comment_1_0450673ab74f184a47ac7bab568d26dc._comment create mode 100644 doc/forum/git-annex_unused_not_dropping_deleted_files.mdwn create mode 100644 doc/forum/git-annex_unused_not_dropping_deleted_files/comment_1_2152cfb09675e46e7492e198dd3ea094._comment create mode 100644 doc/forum/git-annex_unused_not_dropping_deleted_files/comment_2_97e666dbac9de2a5e688921cba8a42e9._comment create mode 100644 doc/forum/git-annex_unused_not_dropping_deleted_files/comment_3_d7b0e9515bface28f3650b8aa20ec2f4._comment create mode 100644 doc/forum/git-annex_unused_not_dropping_deleted_files/comment_4_5816f6cab42e27e724e735368f693b09._comment create mode 100644 doc/forum/git-annex_unused_not_dropping_deleted_files/comment_5_8e97f39225515f0bf8b168dfd6a0efab._comment create mode 100644 doc/forum/git-annex_unused_not_dropping_deleted_files/comment_6_bef37f8ec9c337387b79ffd6d56fe425._comment create mode 100644 doc/forum/git-assistant_clarification.mdwn create mode 100644 doc/forum/git-assistant_clarification/comment_1_8f553e59da12f798b854a457b96b5778._comment create mode 100644 doc/forum/git-assistant_clarification/comment_2_06cf62b599edea6ad8396776f0081494._comment create mode 100644 doc/forum/git-assistant_clarification/comment_3_36f0bd6e7a824e6ef40a309850bb087b._comment create mode 100644 doc/forum/git-remote-gcrypt.mdwn create mode 100644 doc/forum/git-remote-gcrypt/comment_1_175c8c35d9bbb470fcc17697eb8cc6b8._comment create mode 100644 doc/forum/git-remote-gcrypt/comment_2_fdcaf507e14c995636dd93a41e488df3._comment create mode 100644 doc/forum/git-remote-gcrypt/comment_3_f4e830f961dbe1c60ddd277b9d888133._comment create mode 100644 doc/forum/git-status_typechange_in_direct_mode.mdwn create mode 100644 doc/forum/git-status_typechange_in_direct_mode/comment_1_12c8b67aadbfa2b073e12997a55d49a7._comment create mode 100644 doc/forum/git-status_typechange_in_direct_mode/comment_2_005d1b17f3c2ae192aa30c6e5163989e._comment create mode 100644 doc/forum/git-subtree_support__63__.mdwn create mode 100644 doc/forum/git-subtree_support__63__/comment_1_4f333cb71ed1ff259bbfd86704806aa6._comment create mode 100644 doc/forum/git-subtree_support__63__/comment_2_73d2a015b1ac79ec99e071a8b1e29034._comment create mode 100644 doc/forum/git-subtree_support__63__/comment_3_c533400e22c306c033fcd56e64761b0b._comment create mode 100644 doc/forum/git-subtree_support__63__/comment_4_75b0e072e668aa46ff0a8d62a6620306._comment create mode 100644 doc/forum/git-subtree_support__63__/comment_5_f5ec9649d9f1dc122e715de5533bc674._comment create mode 100644 doc/forum/git-subtree_support__63__/comment_6_85df530f7b6d76b74ac8017c6034f95e._comment create mode 100644 doc/forum/git_annex_add_crash_and_subsequent_recovery.mdwn create mode 100644 doc/forum/git_annex_add_crash_and_subsequent_recovery/comment_1_062d0153a379c1ba1df8585b90220d3d._comment create mode 100644 doc/forum/git_annex_add_crash_and_subsequent_recovery/comment_2_6fc6be43c488c468a4811cd0a1360225._comment create mode 100644 doc/forum/git_annex_add_crash_and_subsequent_recovery/comment_3_45efaaf27d9b580c4c75cbcdc4f65b64._comment create mode 100644 doc/forum/git_annex_add_crash_and_subsequent_recovery/comment_4_c560eae40867512b0af2cbef161fc8ac._comment create mode 100644 doc/forum/git_annex_alternative.mdwn create mode 100644 doc/forum/git_annex_assistant__44___share_with_other_devices.mdwn create mode 100644 doc/forum/git_annex_copy_--fast_--to_blah_much_slower_than_--from_blah.mdwn create mode 100644 doc/forum/git_annex_copy_--fast_--to_blah_much_slower_than_--from_blah/comment_1_5b6e0b749b01a97a6b52a2c1cca6e35a._comment create mode 100644 doc/forum/git_annex_copy_--fast_--to_blah_much_slower_than_--from_blah/comment_2_8f2567f4c4f6db2078211a87689757d3._comment create mode 100644 doc/forum/git_annex_copy_--fast_--to_blah_much_slower_than_--from_blah/comment_3_ab98121076b88f351fc8cd9197e6bf64._comment create mode 100644 doc/forum/git_annex_copy_--fast_--to_blah_much_slower_than_--from_blah/comment_4_cb13328add1b7a812efd817ad3dd1a4f._comment create mode 100644 doc/forum/git_annex_copy_more_informative_about_why_some_files_are_not_copied.mdwn create mode 100644 doc/forum/git_annex_copy_more_informative_about_why_some_files_are_not_copied/comment_1_75445fc0e01ee99bae1c1f5a60e314bc._comment create mode 100644 doc/forum/git_annex_failing_to_get_non-English_filenames.__Rsync_problem__63__.mdwn create mode 100644 doc/forum/git_annex_failing_to_get_non-English_filenames.__Rsync_problem__63__/comment_1_292ee7c8b37cbd13f03eb67d0359b99e._comment create mode 100644 doc/forum/git_annex_failing_to_get_non-English_filenames.__Rsync_problem__63__/comment_2_f6341119fcfde5d8160c8f603b1a6fea._comment create mode 100644 doc/forum/git_annex_failing_to_get_non-English_filenames.__Rsync_problem__63__/comment_3_8ad3a1d1fe5995d61e5e137280bc76c3._comment create mode 100644 doc/forum/git_annex_failing_to_get_non-English_filenames.__Rsync_problem__63__/comment_4_86b61b0484f3f4ecff657e46333b3d4f._comment create mode 100644 doc/forum/git_annex_failing_to_get_non-English_filenames.__Rsync_problem__63__/comment_5_5ffac00d08d26acaba8c3513b24c4d65._comment create mode 100644 doc/forum/git_annex_get_--want-get_another__95__repo.mdwn create mode 100644 doc/forum/git_annex_get_--want-get_another__95__repo/comment_1_0be0b3981ddd0743ff26cf6d396e521d._comment create mode 100644 doc/forum/git_annex_get_--want-get_another__95__repo/comment_2_b1ead1085a87818625579bf1ef151b5d._comment create mode 100644 doc/forum/git_annex_get_--want-get_another__95__repo/comment_3_cf2018852c84b0bf1ac061def6f0ac5d._comment create mode 100644 doc/forum/git_annex_get_--want-get_another__95__repo/comment_4_22562e8f1f2f91b9f9a5939ec9006cb5._comment create mode 100644 doc/forum/git_annex_get_creates_a_new_uuid.mdwn create mode 100644 doc/forum/git_annex_get_creates_a_new_uuid/comment_1_004c87183968c326058bd3159a5baa0b._comment create mode 100644 doc/forum/git_annex_ls___47___metadata_in_git_annex_whereis.mdwn create mode 100644 doc/forum/git_annex_ls___47___metadata_in_git_annex_whereis/comment_1_7fba10b85f4d9289c7782eccef46949e._comment create mode 100644 doc/forum/git_annex_ls___47___metadata_in_git_annex_whereis/comment_2_7dcec124ea7d0291ed40d80e2ffd5c7e._comment create mode 100644 doc/forum/git_annex_on_osx_only_creating_symlinks__63____63__.mdwn create mode 100644 doc/forum/git_annex_on_osx_only_creating_symlinks__63____63__/comment_1_6889c4452e636474b4e70798b404fed2._comment create mode 100644 doc/forum/git_annex_on_osx_only_creating_symlinks__63____63__/comment_2_978fc11c463a457382fddd668cd1d0dd._comment create mode 100644 doc/forum/git_annex_on_osx_only_creating_symlinks__63____63__/comment_3_4420bd3afaecd7536b02fc08cee82dbe._comment create mode 100644 doc/forum/git_annex_on_osx_only_creating_symlinks__63____63__/comment_4_99286f17a87049c303f2aa34c0a90286._comment create mode 100644 doc/forum/git_annex_on_osx_only_creating_symlinks__63____63__/comment_5_39bad7441dcea4da4b389700301233de._comment create mode 100644 doc/forum/git_annex_sync_dies___40__sometimes__41__.mdwn create mode 100644 doc/forum/git_annex_sync_dies___40__sometimes__41__/comment_1_48bbac0545bf13bbf04da723e418d037._comment create mode 100644 doc/forum/git_annex_test_on_windows.mdwn create mode 100644 doc/forum/git_annex_test_on_windows/comment_1_258ac5cfa2f5d24e737d94dc48f06899._comment create mode 100644 doc/forum/git_annex_with_local_apache_webdav_server.mdwn create mode 100644 doc/forum/git_annex_with_local_apache_webdav_server/comment_1_a3b89f90f9ac70e0a9b0711ede1cb810._comment create mode 100644 doc/forum/git_annex_with_local_apache_webdav_server/comment_2_d8e9237cf6e7f7558f836ba1352f5517._comment create mode 100644 doc/forum/git_pull_remote_git-annex.mdwn create mode 100644 doc/forum/git_pull_remote_git-annex/comment_1_9c245db3518d8b889ecdf5115ad9e053._comment create mode 100644 doc/forum/git_pull_remote_git-annex/comment_2_0f7f4a311b0ec1d89613e80847e69b42._comment create mode 100644 doc/forum/git_pull_remote_git-annex/comment_3_1aa89725b5196e40a16edeeb5ccfa371._comment create mode 100644 doc/forum/git_pull_remote_git-annex/comment_4_646f2077edcabc000a7d9cb75a93cf55._comment create mode 100644 doc/forum/git_pull_remote_git-annex/comment_5_4f2a05ef6551806dd0ec65372f183ca4._comment create mode 100644 doc/forum/git_pull_remote_git-annex/comment_6_3925d1aa56bce9380f712e238d63080f._comment create mode 100644 doc/forum/git_pull_remote_git-annex/comment_7_24c45ee981b18bc78325c768242e635d._comment create mode 100644 doc/forum/git_pull_remote_git-annex/comment_8_7e76ee9b6520cbffaf484c9299a63ad3._comment create mode 100644 doc/forum/git_tag_missing_for_3.20111011.mdwn create mode 100644 doc/forum/git_tag_missing_for_3.20111011/comment_1_7a53bf273f3078ab3351369ef2b5f2a6._comment create mode 100644 doc/forum/git_unannex_speed.mdwn create mode 100644 doc/forum/git_unannex_speed/comment_1_10cf326248f4e89e1f75bf97d7574763._comment create mode 100644 doc/forum/glacier_-_range_retrievals_and_daily_free_retrieval_allowance.mdwn create mode 100644 doc/forum/handling_MP3_metadata_changes.mdwn create mode 100644 doc/forum/handling_MP3_metadata_changes/comment_1_aa4955fd64ea5aa836f1a591e185c4a2._comment create mode 100644 doc/forum/hashing_objects_directories.mdwn create mode 100644 doc/forum/hashing_objects_directories/comment_1_c55c56076be4f54251b0b7f79f28a607._comment create mode 100644 doc/forum/hashing_objects_directories/comment_2_504c96959c779176f991f4125ea22009._comment create mode 100644 doc/forum/hashing_objects_directories/comment_3_9134bde0a13aac0b6a4e5ebabd7f22e8._comment create mode 100644 doc/forum/hashing_objects_directories/comment_4_0de9170e429cbfea66f5afa8980d45ac._comment create mode 100644 doc/forum/hashing_objects_directories/comment_5_ef6cfd49d24c180c2d0a062e5bd3a0be._comment create mode 100644 doc/forum/help_running_git-annex_on_top_of_existing_repo.mdwn create mode 100644 doc/forum/help_running_git-annex_on_top_of_existing_repo/comment_1_4cb38d71c943657c5ba0896cd70d2e64._comment create mode 100644 doc/forum/help_running_git-annex_on_top_of_existing_repo/comment_2_b5e94c10ebbed9125c7e2332f75709ca._comment create mode 100644 doc/forum/help_running_git-annex_on_top_of_existing_repo/comment_3_2b3b93bbc60fbc24d436231954d6822a._comment create mode 100644 doc/forum/help_running_git-annex_on_top_of_existing_repo/comment_4_2dfda33ffa39b92b16c8bd9005e1cefe._comment create mode 100644 doc/forum/help_running_git-annex_on_top_of_existing_repo/comment_5_96b1eb1e8e9f315c646f4686870f9b52._comment create mode 100644 doc/forum/help_running_git-annex_on_top_of_existing_repo/comment_6_e85c3fa1d17f1d6ec625b9c4f9b698c3._comment create mode 100644 doc/forum/how_do_i_manually_sync_my_external_drive__63__.mdwn create mode 100644 doc/forum/how_do_i_manually_sync_my_external_drive__63__/comment_1_4fd8722cafd55b0503c802289206645a._comment create mode 100644 doc/forum/how_to_decrypt_file_from_encrypted_special_remote__63__.mdwn create mode 100644 doc/forum/how_to_decrypt_file_from_encrypted_special_remote__63__/comment_1_d4dc451892e7a6e230bf32adb7f3f9fa._comment create mode 100644 doc/forum/how_to_decrypt_file_from_encrypted_special_remote__63__/comment_2_79340bf3c0691073a9808c5ac2da0a3d._comment create mode 100644 doc/forum/how_to_decrypt_file_from_encrypted_special_remote__63__/comment_3_6302fb6e5bb7cbddf2cfe74d98d32897._comment create mode 100644 doc/forum/how_to_decrypt_file_from_encrypted_special_remote__63__/comment_4_e3d95bc09c9fb21e8e9bbacc642aa60f._comment create mode 100644 doc/forum/how_to_decrypt_file_from_encrypted_special_remote__63__/comment_5_f2f0a1c2fb0c6323707b11e2b06aa2db._comment create mode 100644 doc/forum/how_to_decrypt_file_from_encrypted_special_remote__63__/comment_6_66fe80e634a8f13cce18fe68974ec67a._comment create mode 100644 doc/forum/how_to_remove_files_and_symlinks_but_keep_historical_file_contents.mdwn create mode 100644 doc/forum/how_to_remove_files_and_symlinks_but_keep_historical_file_contents/comment_1_cba76311e146dabb8ffc789bf4c8b714._comment create mode 100644 doc/forum/how_to_remove_files_and_symlinks_but_keep_historical_file_contents/comment_2_8d99c50fc1347367ccc0714e8d1af385._comment create mode 100644 doc/forum/how_to_remove_files_and_symlinks_but_keep_historical_file_contents/comment_3_a7a9c55c2ad448179dff5d5b69976c7d._comment create mode 100644 doc/forum/howto_to_link_to_existing_direct_mode_git-annexes.mdwn create mode 100644 doc/forum/howto_to_link_to_existing_direct_mode_git-annexes/comment_1_7bd0edaf2352293678f0942aaa885d13._comment create mode 100644 doc/forum/howto_update_feed.mdwn create mode 100644 doc/forum/howto_update_feed/comment_1_bec356619f370a618f19a187d09d2e35._comment create mode 100644 doc/forum/howto_update_feed/comment_2_84dfb80ba3db8d41164eb97022becae3._comment create mode 100644 doc/forum/howto_update_feed/comment_3_20166db298c10074e062aecad59ffd71._comment create mode 100644 doc/forum/howto_update_feed/comment_4_f040e31b763fc9a7aa092442b4d6b8e8._comment create mode 100644 doc/forum/ignore_changes_made_by_a_remote.mdwn create mode 100644 doc/forum/ignore_changes_made_by_a_remote/comment_1_825676069d2e1554499b76fd8c306c30._comment create mode 100644 doc/forum/incompatible_versions__63__.mdwn create mode 100644 doc/forum/incompatible_versions__63__/comment_1_629f28258746d413e452cbd42a1a43f4._comment create mode 100644 doc/forum/is_there_a_way_to_only_commit_some_files_in_direct-mode___63__.mdwn create mode 100644 doc/forum/is_there_a_way_to_only_commit_some_files_in_direct-mode___63__/comment_1_804e43111ee97dff15e49e50b6c29d91._comment create mode 100644 doc/forum/is_there_a_way_to_only_commit_some_files_in_direct-mode___63__/comment_2_299ad6cd0225daa166d36af3726a9ef2._comment create mode 100644 doc/forum/known_and_local_annex_keys.mdwn create mode 100644 doc/forum/known_and_local_annex_keys/comment_1_3cb4828dc7116e4cf49e119f055ae9a3._comment create mode 100644 doc/forum/known_and_local_annex_keys/comment_2_68f20c881eafe986694bde10571cf1c0._comment create mode 100644 doc/forum/known_and_local_annex_keys/comment_3_e195a7091a06ce0427bb28aca9a17d04._comment create mode 100644 doc/forum/known_and_local_annex_keys/comment_4_d81f0bf7465832cb676fd89f5d53ec18._comment create mode 100644 doc/forum/linux_standalone_tarballs.mdwn create mode 100644 doc/forum/linux_standalone_tarballs/comment_1_5c3ceb845a45e50784f7098bfbf94df1._comment create mode 100644 doc/forum/local_pairing_with_2_mac.mdwn create mode 100644 doc/forum/local_pairing_with_2_mac/comment_10_508585e72c81d197a9a1e193c25a702a._comment create mode 100644 doc/forum/local_pairing_with_2_mac/comment_1_6ca4fed183340a2902d1d4d91284b772._comment create mode 100644 doc/forum/local_pairing_with_2_mac/comment_2_7c2b3d0a8a69c7056508f8ec73ebefcd._comment create mode 100644 doc/forum/local_pairing_with_2_mac/comment_3_07fa468aac1288e770487973052bccea._comment create mode 100644 doc/forum/local_pairing_with_2_mac/comment_4_dc0494213d2b57b5b9a489b096a5b8d0._comment create mode 100644 doc/forum/local_pairing_with_2_mac/comment_5_bcac18e137c00d4279774dec51963289._comment create mode 100644 doc/forum/local_pairing_with_2_mac/comment_6_76b62eafda1ecbf88abe288cbe778e17._comment create mode 100644 doc/forum/local_pairing_with_2_mac/comment_7_13fe788f2e9a823ad2e4844f114675a7._comment create mode 100644 doc/forum/local_pairing_with_2_mac/comment_8_f81b454e9cfc14dcb33148798be55de3._comment create mode 100644 doc/forum/local_pairing_with_2_mac/comment_9_f7a1ce9627ebfc854dfde2f6c924db80._comment create mode 100644 doc/forum/location_tracking_cleanup.mdwn create mode 100644 doc/forum/location_tracking_cleanup/comment_1_7d6319e8c94dfe998af9cfcbf170efb2._comment create mode 100644 doc/forum/location_tracking_cleanup/comment_2_e7395cb6e01f42da72adf71ea3ebcde4._comment create mode 100644 doc/forum/location_tracking_cleanup/comment_3_c15428cec90e969284a5e690fb4b2fde._comment create mode 100644 doc/forum/lost_in_walkthrough....mdwn create mode 100644 doc/forum/lost_in_walkthrough.../comment_1_51b703b961ca762f0359e1c169f1ee75._comment create mode 100644 doc/forum/lost_in_walkthrough.../comment_2_a9de0401a103bdd4401ba2d5983dc54a._comment create mode 100644 doc/forum/luks_encrypted_disk_support.mdwn create mode 100644 doc/forum/luks_encrypted_disk_support/comment_1_0ea476c778888f34196d9031f72b1844._comment create mode 100644 doc/forum/luks_encrypted_disk_support/comment_2_0af149bfe1868dde0a132c5d835c50df._comment create mode 100644 doc/forum/making_good_use_of_my_shiny_new_rsync.net_account.mdwn create mode 100644 doc/forum/making_good_use_of_my_shiny_new_rsync.net_account/comment_1_0ebe509b768d46081db2100f5b712ef7._comment create mode 100644 doc/forum/making_good_use_of_my_shiny_new_rsync.net_account/comment_2_ef63d893531d93d2eb09f48f8baff4dd._comment create mode 100644 doc/forum/man_pages_in_the_prebuilt_linux_tarball.mdwn create mode 100644 doc/forum/man_pages_in_the_prebuilt_linux_tarball/comment_1_a7bc2e84e6d7c0e2de5900685207af78._comment create mode 100644 doc/forum/managing_multiple_repositories.mdwn create mode 100644 doc/forum/manual_update_of_.git__47__annex__47__objects.mdwn create mode 100644 doc/forum/manual_update_of_.git__47__annex__47__objects/comment_1_ea6ec91150c8962e2711631f2422bf3a._comment create mode 100644 doc/forum/manual_update_of_.git__47__annex__47__objects/comment_2_a7bbf304b26650a786e358bdc01e3069._comment create mode 100644 doc/forum/manual_update_of_.git__47__annex__47__objects/comment_3_a855096b683c4c4f84e72c797e065d59._comment create mode 100644 doc/forum/many_remotes.mdwn create mode 100644 doc/forum/migrate_existing_git_repository_to_git-annex.mdwn create mode 100644 doc/forum/migrate_existing_git_repository_to_git-annex/comment_1_4181bf34c71e2e8845e6e5fb55d53381._comment create mode 100644 doc/forum/migrate_existing_git_repository_to_git-annex/comment_2_5f08da5e21c0b3b5a8d1e4408c0d6405._comment create mode 100644 doc/forum/migrate_existing_git_repository_to_git-annex/comment_3_f483038c006cf7dcccf1014fa771744f._comment create mode 100644 doc/forum/migrate_existing_git_repository_to_git-annex/comment_4_057f0079fbee3451ccda08026bab21d4._comment create mode 100644 doc/forum/migration_to_git-annex_and_rsync.mdwn create mode 100644 doc/forum/mistakenly_checked___42__files__42___into_an_annex.__bummer..mdwn create mode 100644 doc/forum/mistakenly_checked___42__files__42___into_an_annex.__bummer./comment_1_752db25abb647804a1cc12c5b247378a._comment create mode 100644 doc/forum/mistakenly_checked___42__files__42___into_an_annex.__bummer./comment_2_db6f4959c35732f72e7a90bd9f4c665c._comment create mode 100644 doc/forum/multiple_repositories_single_backup.mdwn create mode 100644 doc/forum/multiple_repositories_single_backup/comment_1_4a479fa78e0b366fcff1a27bc37081de._comment create mode 100644 doc/forum/multiple_repositories_single_backup/comment_2_bbe19eec0969385a0d4682bf9e9de21a._comment create mode 100644 doc/forum/multiple_repositories_single_backup/comment_3_1b18ea058e3eb34852055cffe51de176._comment create mode 100644 doc/forum/multiple_routes_to_same_repository.mdwn create mode 100644 doc/forum/multiple_routes_to_same_repository/comment_1_26c1734d41d5374f18fc688d862d6b8e._comment create mode 100644 doc/forum/multiple_routes_to_same_repository/comment_2_d119ab485fb2d5512c15372efdb2327d._comment create mode 100644 doc/forum/multiple_sym_links___40__for_tagging_photos__41____63__.mdwn create mode 100644 doc/forum/multiple_sym_links___40__for_tagging_photos__41____63__/comment_1_96beb9ea895c80285748adb940b4f57d._comment create mode 100644 doc/forum/multiple_sym_links___40__for_tagging_photos__41____63__/comment_2_985065c1feed9300631dac7a2701f669._comment create mode 100644 doc/forum/multiple_urls_for_the_same_UUID.mdwn create mode 100644 doc/forum/multiple_urls_for_the_same_UUID/comment_1_de7410d8824a864c4d106c9f1afaec3f._comment create mode 100644 doc/forum/multiple_urls_for_the_same_UUID/comment_2_309a86cf7e08448be64357a30d8b56ae._comment create mode 100644 doc/forum/multiple_urls_for_the_same_UUID/comment_3_fa97a45fc1392935fd5e0714db999bc2._comment create mode 100644 doc/forum/multiple_urls_for_the_same_UUID/comment_4_139178b1ba45b62eec0c89a660c0c81e._comment create mode 100644 doc/forum/new_linux_arm_tarball_build.mdwn create mode 100644 doc/forum/new_linux_arm_tarball_build/comment_1_7211ddc626bae97d4140c723c3cf028f._comment create mode 100644 doc/forum/new_linux_arm_tarball_build/comment_2_fcbe3f7fa9d012b21c7a771553fa9142._comment create mode 100644 doc/forum/new_linux_arm_tarball_build/comment_3_2702cdbae4179a7a103d2a7098a8ed5e._comment create mode 100644 doc/forum/new_linux_arm_tarball_build/comment_4_e1d802fbcc9d699ece5267e80990255a._comment create mode 100644 doc/forum/new_linux_arm_tarball_build/comment_5_257b91ecbf5a6040a8e4c9a360c775ba._comment create mode 100644 doc/forum/new_linux_arm_tarball_build/comment_6_bd8cca86a63be7e330111618c1959a74._comment create mode 100644 doc/forum/new_linux_arm_tarball_build/comment_7_6814bdeca94328fe6c3f407795ff923a._comment create mode 100644 doc/forum/new_linux_arm_tarball_build/comment_8_6db99d998ca990494c8f2826ff1ca273._comment create mode 100644 doc/forum/new_linux_arm_tarball_build/comment_9_2802b24ccb24f1615c9d61904f916d05._comment create mode 100644 doc/forum/new_microfeatures.mdwn create mode 100644 doc/forum/new_microfeatures/comment_1_058bd517c6fffaf3446b1f5d5be63623._comment create mode 100644 doc/forum/new_microfeatures/comment_2_41ad904c68e89c85e1fc49c9e9106969._comment create mode 100644 doc/forum/new_microfeatures/comment_3_a1a9347b5bc517f2a89a8b292c3f8517._comment create mode 100644 doc/forum/new_microfeatures/comment_4_5a6786dc52382fff5cc42fdb05770196._comment create mode 100644 doc/forum/new_microfeatures/comment_5_3c627d275586ff499d928a8f8136babf._comment create mode 100644 doc/forum/new_microfeatures/comment_6_31ea08c008500560c0b96c6601bc6362._comment create mode 100644 doc/forum/new_microfeatures/comment_7_94045b9078b1fff877933b012d1b49e2._comment create mode 100644 doc/forum/nntp__47__usenet_special_remote.mdwn create mode 100644 doc/forum/nntp__47__usenet_special_remote/comment_1_171a0b95b1f95cfd82073e88bdefaab9._comment create mode 100644 doc/forum/nntp__47__usenet_special_remote/comment_2_48736ed17c98ffcfb13ec00b901b2dd6._comment create mode 100644 doc/forum/non-bare_repo_on_cloud_remote.mdwn create mode 100644 doc/forum/non-bare_repo_on_cloud_remote/comment_1_da0c023af7c78f1ef1cfe1143a900a9f._comment create mode 100644 doc/forum/non-bare_repo_on_cloud_remote/comment_2_71baea93f6caaf7b81a9ac00bee91e5e._comment create mode 100644 doc/forum/not_finding_git-annex-shell_on_remote.mdwn create mode 100644 doc/forum/not_finding_git-annex-shell_on_remote/comment_1_84881cad02c251a2515cec50fc22bf16._comment create mode 100644 doc/forum/not_finding_git-annex-shell_on_remote/comment_2_f32412f8d3b84cd5cb3c4d5d6bb60f32._comment create mode 100644 doc/forum/not_finding_git-annex-shell_on_remote/comment_3_dfbf7f41dd4d17f2ce8b67daa9dcd11d._comment create mode 100644 doc/forum/not_finding_git-annex-shell_on_remote/comment_4_71ae60efcacdba5e11548923b2c85b95._comment create mode 100644 doc/forum/not_getting_file_contents.mdwn create mode 100644 doc/forum/not_getting_file_contents/comment_1_4a0f7f4de9c9bc4d13db033cb75d20af._comment create mode 100644 doc/forum/not_getting_file_contents/comment_2_dc7403e1b551552f9fd00da6a1453570._comment create mode 100644 doc/forum/one_annex_versus_many_annexes__63__.mdwn create mode 100644 doc/forum/one_or_many_annexes__63__.mdwn create mode 100644 doc/forum/one_or_many_annexes__63__/comment_1_656d96011801d67a45b0b3bb3d70fa63._comment create mode 100644 doc/forum/partial_synchronisation._android_phone.mdwn create mode 100644 doc/forum/partial_synchronisation._android_phone/comment_1_2a48569277945a9c334bdfc51f8fd01f._comment create mode 100644 doc/forum/partial_synchronisation._android_phone/comment_2_550ae91c8a1fe060368c4682d37514b6._comment create mode 100644 doc/forum/performance_and_multiple_replication_problems.mdwn create mode 100644 doc/forum/performance_and_multiple_replication_problems/comment_1_a2cdf1a4840f099f6bc941fd8de966c7._comment create mode 100644 doc/forum/performance_and_multiple_replication_problems/comment_2_e65b360706c66ede6e0e841b2ebbbfbc._comment create mode 100644 doc/forum/performance_and_multiple_replication_problems/comment_3_ad7cb4c510e2ab26959ea7cb40a43fef._comment create mode 100644 doc/forum/performance_and_multiple_replication_problems/comment_4_23a6dc7ea569944ca55bd21851dd770d._comment create mode 100644 doc/forum/performance_improvement:_git_on_ssd__44___annex_on_spindle_disk.mdwn create mode 100644 doc/forum/performance_improvement:_git_on_ssd__44___annex_on_spindle_disk/comment_1_b3f22f9be02bc4f2d5a121db3d753ff5._comment create mode 100644 doc/forum/performance_improvement:_git_on_ssd__44___annex_on_spindle_disk/comment_2_f94abce32ef818176b42a3cc860691ae._comment create mode 100644 doc/forum/performance_improvement:_git_on_ssd__44___annex_on_spindle_disk/comment_3_0c8e77fe248e00bd990d568623e5a5c9._comment create mode 100644 doc/forum/performance_improvement:_git_on_ssd__44___annex_on_spindle_disk/comment_4_4b7e8f9521d61900d9ad418e74808ffb._comment create mode 100644 doc/forum/performance_improvement:_git_on_ssd__44___annex_on_spindle_disk/comment_5_7abbbe7db3988a2d239d11b0a4c597e7._comment create mode 100644 doc/forum/performance_improvement:_git_on_ssd__44___annex_on_spindle_disk/comment_6_46bd45fdc25d9c583f4ebe3a9730ab9f._comment create mode 100644 doc/forum/post-copy__47__sync_hook.mdwn create mode 100644 doc/forum/post-copy__47__sync_hook/comment_1_c8322d4b9bbf5eac80b48c312a42fbcf._comment create mode 100644 doc/forum/preferred_content.mdwn create mode 100644 doc/forum/preferred_content/comment_1_9c9e5f2ee5ae4d8459358ad16f879ef1._comment create mode 100644 doc/forum/preferred_content_settings_for_multiple_symlinks.mdwn create mode 100644 doc/forum/preferred_content_settings_for_multiple_symlinks/comment_1_70da012d96ab576151fe3e081ef905d1._comment create mode 100644 doc/forum/preferred_content_settings_for_multiple_symlinks/comment_2_ccea74d8b5a4de1f3cd1f6da6694ae0e._comment create mode 100644 doc/forum/preferred_content_settings_for_multiple_symlinks/comment_3_fab70c642d5aaf26de05270860281030._comment create mode 100644 doc/forum/preferred_content_settings_for_multiple_symlinks/comment_4_3cbd06de53b6a13e2741124a8e7b5b5b._comment create mode 100644 doc/forum/preferred_content_settings_for_multiple_symlinks/comment_5_963558ab261d8a6315402d371e8348f9._comment create mode 100644 doc/forum/public-web-frontend.mdwn create mode 100644 doc/forum/public-web-frontend/comment_1_c73bd2dfe020c25eaad1c0707dd2db01._comment create mode 100644 doc/forum/public-web-frontend/comment_2_0026d7be6b17e50d86b3b54985882f80._comment create mode 100644 doc/forum/pulling_from_encrypted_remote.mdwn create mode 100644 doc/forum/pulling_from_encrypted_remote/comment_1_e9d6a9a6e01d01edb41a11b0da11d74d._comment create mode 100644 doc/forum/pulling_from_encrypted_remote/comment_2_8d0db2ff65ce935c6e68044a3e0721a8._comment create mode 100644 doc/forum/pure_git-annex_only_workflow.mdwn create mode 100644 doc/forum/pure_git-annex_only_workflow/comment_10_683768c9826b0bf0f267e8734b9eb872._comment create mode 100644 doc/forum/pure_git-annex_only_workflow/comment_11_6b541ed834ef45606f3b98779a25a148._comment create mode 100644 doc/forum/pure_git-annex_only_workflow/comment_12_ca8ca35d6cd4a9f94568536736c12adc._comment create mode 100644 doc/forum/pure_git-annex_only_workflow/comment_13_00c82d320c7b4bb51078beba17e14dc8._comment create mode 100644 doc/forum/pure_git-annex_only_workflow/comment_14_b63568b327215ef8f646a39d760fdfc0._comment create mode 100644 doc/forum/pure_git-annex_only_workflow/comment_15_cb7c856d8141b2de3cc95874753f1ee5._comment create mode 100644 doc/forum/pure_git-annex_only_workflow/comment_1_a32f7efd18d174845099a4ed59e6feae._comment create mode 100644 doc/forum/pure_git-annex_only_workflow/comment_2_66dc9b65523a9912411db03c039ba848._comment create mode 100644 doc/forum/pure_git-annex_only_workflow/comment_3_9b7d89da52f7ebb7801f9ec8545c3aba._comment create mode 100644 doc/forum/pure_git-annex_only_workflow/comment_4_dc8a3f75533906ad3756fcc47f7e96bb._comment create mode 100644 doc/forum/pure_git-annex_only_workflow/comment_5_afe5035a6b35ed2c7e193fb69cc182e2._comment create mode 100644 doc/forum/pure_git-annex_only_workflow/comment_6_3660d45c5656f68924acbd23790024ee._comment create mode 100644 doc/forum/pure_git-annex_only_workflow/comment_7_33db51096f568c65b22b4be0b5538c0d._comment create mode 100644 doc/forum/pure_git-annex_only_workflow/comment_8_6e5b42fdb7801daadc0b3046cbc3d51e._comment create mode 100644 doc/forum/pure_git-annex_only_workflow/comment_9_ace319652f9c7546883b5152ddc82591._comment create mode 100644 doc/forum/purge_files_with_no_copies.mdwn create mode 100644 doc/forum/purge_files_with_no_copies/comment_1_12b578689eb8d5d38c06261ec65e2109._comment create mode 100644 doc/forum/question_about_assistant_and___47__archive__47__.mdwn create mode 100644 doc/forum/question_about_assistant_and___47__archive__47__/comment_1_97890e26072af9277144651e3fdcada0._comment create mode 100644 doc/forum/question_about_assistant_and___47__archive__47__/comment_2_542bf265e35a976ac76767762d67d617._comment create mode 100644 doc/forum/question_about_assistant_and___47__archive__47__/comment_3_bafe99159df2adcd5fecc0d67bbf05a5._comment create mode 100644 doc/forum/question_about_assistant_and___47__archive__47__/comment_4_e77fa2992d9302a49a05f514c81612ca._comment create mode 100644 doc/forum/rebuild_location_log_from_encrypted_remote.mdwn create mode 100644 doc/forum/rebuild_location_log_from_encrypted_remote/comment_1_f84f955fed7b96ae6208b6ff2ec650cd._comment create mode 100644 doc/forum/rebuild_location_log_from_encrypted_remote/comment_2_c0b2ce3bc7cd55a0c77ddc31493068c2._comment create mode 100644 doc/forum/rebuild_location_log_from_encrypted_remote/comment_3_06a73ca3dc73399ff000b642cca72de7._comment create mode 100644 doc/forum/receiving_indirect_renames_on_direct_repo___63__.mdwn create mode 100644 doc/forum/receiving_indirect_renames_on_direct_repo___63__/comment_1_f4b0a14373c75cb752597c832e296bcc._comment create mode 100644 doc/forum/receiving_indirect_renames_on_direct_repo___63__/comment_2_8c86dfc99f0b9040402c9d746decda53._comment create mode 100644 doc/forum/receiving_indirect_renames_on_direct_repo___63__/comment_3_0246fff6c7c75f6be45bd257ec3872a5._comment create mode 100644 doc/forum/recover_deleted_files___63__.mdwn create mode 100644 doc/forum/recover_deleted_files___63__/comment_1_d7abb7c45c6ec2723a04f153ed215453._comment create mode 100644 doc/forum/recover_deleted_files___63__/comment_2_8ea2acaa30d3ee7e9f75310f4ec859b2._comment create mode 100644 doc/forum/recover_deleted_files___63__/comment_3_376de81c70799bf409be189a48234815._comment create mode 100644 doc/forum/recover_deleted_files___63__/comment_4_2e73ac530d65a01768a57058b7220a29._comment create mode 100644 doc/forum/recovering_from_repo_corruption.mdwn create mode 100644 doc/forum/recovering_from_repo_corruption/comment_1_01fc85037e24fc70e5c5329898cf6781._comment create mode 100644 doc/forum/recovering_from_repo_corruption/comment_2_3bd1c0bf25a0e892e711a60f53cd5298._comment create mode 100644 doc/forum/recovering_from_repo_corruption/comment_3_679dde8ca0081fc6854d6d2e8a42abdb._comment create mode 100644 doc/forum/reinstalled_os__44___cloned_annex__44___does_not_recognize_remote.mdwn create mode 100644 doc/forum/reinstalled_os__44___cloned_annex__44___does_not_recognize_remote/comment_1_c1962d757dd22f49e774afa13a9862ca._comment create mode 100644 doc/forum/reinstalled_os__44___cloned_annex__44___does_not_recognize_remote/comment_2_1f0f4a1dc89643cee81ff7199b55e747._comment create mode 100644 doc/forum/reliability__47__completeness_of_XMPP_updates.mdwn create mode 100644 doc/forum/reliability__47__completeness_of_XMPP_updates/comment_1_e0f7aa48d54fc0564f41c3a569c723b7._comment create mode 100644 doc/forum/reliability__47__completeness_of_XMPP_updates/comment_2_4e74039a673c16c0163f2cfb406dc4c3._comment create mode 100644 doc/forum/reliability__47__completeness_of_XMPP_updates/comment_3_41ade4fe72804b2f06cd4dbf405c1746._comment create mode 100644 doc/forum/relying_on_git_for_numcopies.mdwn create mode 100644 doc/forum/relying_on_git_for_numcopies/comment_1_8ad3cccd7f66f6423341d71241ba89fc._comment create mode 100644 doc/forum/relying_on_git_for_numcopies/comment_2_be6acbc26008a9cb54e7b8f498f2c2a2._comment create mode 100644 doc/forum/relying_on_git_for_numcopies/comment_3_43d8e1513eb9947f8a503f094c03f307._comment create mode 100644 doc/forum/remote_server_client_repositories_are_bare__33____63__.mdwn create mode 100644 doc/forum/remote_server_client_repositories_are_bare__33____63__/comment_1_234241460f6c75a8376b303b8dd4e882._comment create mode 100644 doc/forum/remote_server_client_repositories_are_bare__33____63__/comment_2_42dfc382d07af2a4f29c76016084f87c._comment create mode 100644 doc/forum/reserving_space_with_directory_special_remotes.mdwn create mode 100644 doc/forum/reserving_space_with_directory_special_remotes/comment_1_cd17b624704d93b51931023f69573323._comment create mode 100644 doc/forum/reserving_space_with_directory_special_remotes/comment_2_877ca1be23d1484a8a30cdaeb6630053._comment create mode 100644 doc/forum/reserving_space_with_directory_special_remotes/comment_3_65910eeaf3c6fcfd03f22c2957293232._comment create mode 100644 doc/forum/retrieving_previous_versions.mdwn create mode 100644 doc/forum/retrieving_previous_versions/comment_1_a4e83f688d4ec9177e7bf520f12ed26d._comment create mode 100644 doc/forum/rsync.net:_Too_many_authentication_failures_for___42____42____42____42____42__.mdwn create mode 100644 doc/forum/rsync.net:_Too_many_authentication_failures_for___42____42____42____42____42__/comment_1_7754e2cfb72b034effe8642c1b3e593e._comment create mode 100644 doc/forum/rsync.net:_Too_many_authentication_failures_for___42____42____42____42____42__/comment_2_04e1da4352ef9f9be90253ea726e5f24._comment create mode 100644 doc/forum/rsync_over_ssh__63__.mdwn create mode 100644 doc/forum/rsync_over_ssh__63__/comment_1_ee21f32e90303e20339e0a568321bbbe._comment create mode 100644 doc/forum/rsync_over_ssh__63__/comment_2_aa690da6ecfb2b30fc5080ad76dc77b1._comment create mode 100644 doc/forum/rsync_remote_is_not_available_from_a_cloned_repo/comment_1_2e340c5a6473f165dc06cc35db38e5c0._comment create mode 100644 doc/forum/rsyncing_.git__47__annex__47__objects.mdwn create mode 100644 doc/forum/rsyncing_.git__47__annex__47__objects/comment_1_25eb9f7be5730337b9efd96dce9efd2e._comment create mode 100644 doc/forum/rsyncing_.git__47__annex__47__objects/comment_2_d7ceae666c8a1951021d3c6e6ac39a11._comment create mode 100644 doc/forum/s3_vs_ssh_Performance_Problems.mdwn create mode 100644 doc/forum/s3_vs_ssh_Performance_Problems/comment_1_65f064f09d7850abecab97007b0d30f0._comment create mode 100644 doc/forum/s3_vs_ssh_Performance_Problems/comment_2_baaf2384d9196077268e9ca9bbe3b871._comment create mode 100644 doc/forum/s3_vs_ssh_Performance_Problems/comment_3_dc44be42070c073d150c476406e9b425._comment create mode 100644 doc/forum/s3_vs_ssh_Performance_Problems/comment_4_f9c3ef3b1b44bfb29125acb6ec621f38._comment create mode 100644 doc/forum/safely_dropping_git-annex_history.mdwn create mode 100644 doc/forum/safely_dropping_git-annex_history/comment_10_a4b93a3fbc98d9b86e942f95e0039862._comment create mode 100644 doc/forum/safely_dropping_git-annex_history/comment_11_383882fafd32f25ed22b5eb2fb3691b9._comment create mode 100644 doc/forum/safely_dropping_git-annex_history/comment_12_47794a2abf29bf4ea2763ff89d872ab4._comment create mode 100644 doc/forum/safely_dropping_git-annex_history/comment_1_4fd76d10a93fe01588fce7a621f9254d._comment create mode 100644 doc/forum/safely_dropping_git-annex_history/comment_2_10ecf3220ffcbbe94ba09da225458f18._comment create mode 100644 doc/forum/safely_dropping_git-annex_history/comment_3_e3beb8acb075faaeef6c052aecbf0a41._comment create mode 100644 doc/forum/safely_dropping_git-annex_history/comment_4_61a5fe2e7e47c60a8b237ea69404a37f._comment create mode 100644 doc/forum/safely_dropping_git-annex_history/comment_5_426d02e2f2a2ae4ec7eae02dfe4519b3._comment create mode 100644 doc/forum/safely_dropping_git-annex_history/comment_6_410a7296c2cee16d3d5bb618a5a41c1d._comment create mode 100644 doc/forum/safely_dropping_git-annex_history/comment_7_42cf492fc98a9eba8176387749ef12e0._comment create mode 100644 doc/forum/safely_dropping_git-annex_history/comment_8_c0327ada073d8b69535f71b4dc6aa57e._comment create mode 100644 doc/forum/safely_dropping_git-annex_history/comment_9_f83d6090aea2b7d5d54c876df940cbad._comment create mode 100644 doc/forum/seems_to_build_fine_on_haskell_platform_2011.mdwn create mode 100644 doc/forum/shared_cipher_tries_to_use_gpg.mdwn create mode 100644 doc/forum/shared_cipher_tries_to_use_gpg/comment_1_760961eaaa7d5c254dd71c5792437c9e._comment create mode 100644 doc/forum/shared_cipher_tries_to_use_gpg/comment_2_f3260aea3a5bb9b95a9bdf1d0dfce090._comment create mode 100644 doc/forum/something_really_good_happened_with_3.20130124.mdwn create mode 100644 doc/forum/something_really_good_happened_with_3.20130124/comment_1_1712bddd2f483a353f6313aa626445f1._comment create mode 100644 doc/forum/sparse_git_checkouts_with_annex.mdwn create mode 100644 doc/forum/sparse_git_checkouts_with_annex/comment_1_c7dc199c5740a0e7ba606dfb5e3e579a._comment create mode 100644 doc/forum/sparse_git_checkouts_with_annex/comment_2_e357db3ccc4079f07a291843975535eb._comment create mode 100644 doc/forum/sparse_git_checkouts_with_annex/comment_3_fcfafca994194d57dccf5319c7c9e646._comment create mode 100644 doc/forum/sparse_git_checkouts_with_annex/comment_4_04dc14880f31eee2b6d767d4d4258c5a._comment create mode 100644 doc/forum/special_remote_for_IMAP.mdwn create mode 100644 doc/forum/special_remote_for_IMAP/comment_1_7c7d4b57a1b6508fff1a6b0508c861f8._comment create mode 100644 doc/forum/special_remote_for_IMAP/comment_2_9c46fe8a857aa7a5ce797288144386bd._comment create mode 100644 doc/forum/special_remote_for_IMAP/comment_3_27e3b644df6942ce4c103236d0d5cb1b._comment create mode 100644 doc/forum/special_remote_for_iPods.mdwn create mode 100644 doc/forum/special_remote_for_iPods/comment_1_37cc3dc740341cc663074fd3bfb85947._comment create mode 100644 doc/forum/speed_up_assistant_startup_on_large_repositories.mdwn create mode 100644 doc/forum/speed_up_assistant_startup_on_large_repositories/comment_1_5ba637a0f6d01ba24fe25e6265134e0a._comment create mode 100644 doc/forum/speed_up_assistant_startup_on_large_repositories/comment_2_d65746697977f8971a4b59f5b413f926._comment create mode 100644 doc/forum/speed_up_assistant_startup_on_large_repositories/comment_3_be6c4fe5a0c745688438b716973791cc._comment create mode 100644 doc/forum/speed_up_assistant_startup_on_large_repositories/comment_4_a07472338a08c068a9b88b2176fc2bee._comment create mode 100644 doc/forum/ssh__95__exchange__95__identification:_read:_Connection_reset_by_peer.mdwn create mode 100644 doc/forum/ssh__95__exchange__95__identification:_read:_Connection_reset_by_peer/comment_1_87b9540e37abb16c0ec7605f5ab204a5._comment create mode 100644 doc/forum/ssh__95__exchange__95__identification:_read:_Connection_reset_by_peer/comment_2_bd3383c142bf93d9cd496cb668d7782c._comment create mode 100644 doc/forum/ssh__95__exchange__95__identification:_read:_Connection_reset_by_peer/comment_3_9b1911ae6468d09dae74ab1a60d2757b._comment create mode 100644 doc/forum/ssh_password.mdwn create mode 100644 doc/forum/ssh_password/comment_1_a3e5a41e1d4da683d577976b134b11ee._comment create mode 100644 doc/forum/ssh_password/comment_2_fa261676a99d49d4b237b0d43048d76d._comment create mode 100644 doc/forum/ssh_remote_-_no___34__use_a_git_repository__34___option_during_setup__63__.mdwn create mode 100644 doc/forum/ssh_remote_-_no___34__use_a_git_repository__34___option_during_setup__63__/comment_1_7244794579a191a677190c60758f32e7._comment create mode 100644 doc/forum/ssh_remote_-_no___34__use_a_git_repository__34___option_during_setup__63__/comment_2_277cf12907bd7c5930eb4f137b115e29._comment create mode 100644 doc/forum/start_assistant_from_command_line.mdwn create mode 100644 doc/forum/start_assistant_from_command_line/comment_1_f8dfce1fca9f1212ccaf84e431db71a9._comment create mode 100644 doc/forum/start_assistant_from_command_line/comment_2_e769c5d09afbff85961363ddc5eb4019._comment create mode 100644 doc/forum/switching_backends.mdwn create mode 100644 doc/forum/switching_backends/comment_1_ecf4109c1148dafde3519243ae3c5a03._comment create mode 100644 doc/forum/switching_backends/comment_2_21f465a18f40b95dafd307fce0de659a._comment create mode 100644 doc/forum/switching_backends/comment_4_4c13d22c1695195e6b101bd20ef6bb42._comment create mode 100644 doc/forum/switching_backends/comment_4_e1d4a48baac23fd3f67b20eba4eee8af._comment create mode 100644 doc/forum/switching_to__47__from_direct_mode_while_assistant_is_running.mdwn create mode 100644 doc/forum/switching_to__47__from_direct_mode_while_assistant_is_running/comment_1_7832243a36613c48d0077b438dbf8b4a._comment create mode 100644 doc/forum/sync_between_indirect_and_direct_mode.mdwn create mode 100644 doc/forum/sync_between_indirect_and_direct_mode/comment_1_7efc0d79196675582571c05fdd133b53._comment create mode 100644 doc/forum/sync_between_indirect_and_direct_mode/comment_2_8ac84dbaf7a4d503497487cbdb1749d8._comment create mode 100644 doc/forum/sync_between_indirect_and_direct_mode/comment_3_9acb237711669ec6046a8d07f9ed3b2c._comment create mode 100644 doc/forum/syncing_home_directories.mdwn create mode 100644 doc/forum/syncing_home_directories/comment_1_220a6e0ffe0ea610921a63c0a6e3beab._comment create mode 100644 doc/forum/syncing_non-git_trees_with_git-annex.mdwn create mode 100644 doc/forum/syncing_non-git_trees_with_git-annex/comment_1_7f9593bdfd95e4a8814e6cc5c44619e6._comment create mode 100644 doc/forum/syncing_non-git_trees_with_git-annex/comment_2_49f15478781a0ad5e46e75319070335c._comment create mode 100644 doc/forum/syncing_non-git_trees_with_git-annex/comment_3_6d8f399f0549eddd1d1f5c9c9a10c654._comment create mode 100644 doc/forum/taskwarrior.mdwn create mode 100644 doc/forum/taskwarrior/comment_1_1c3a29e7d292cb602d9d349f8009b51e._comment create mode 100644 doc/forum/telehash_syncing.mdwn create mode 100644 doc/forum/tell_us_how_you__39__re_using_git-annex.mdwn create mode 100644 doc/forum/tell_us_how_you__39__re_using_git-annex/comment_1_4884803ddee7f642a3ac995a19967a6a._comment create mode 100644 doc/forum/tell_us_how_you__39__re_using_git-annex/comment_2_61f5054918e7b36c191454365bc7f3b7._comment create mode 100644 doc/forum/tell_us_how_you__39__re_using_git-annex/comment_3_db07e8703be606c998c831e91d300d69._comment create mode 100644 doc/forum/tell_us_how_you__39__re_using_git-annex/comment_4_a58595969cdd42ed20210e9615b42e42._comment create mode 100644 doc/forum/tips:_special__95__remotes__47__hook_with_tahoe-lafs.mdwn create mode 100644 doc/forum/tips:_special__95__remotes__47__hook_with_tahoe-lafs/comment_1_76bb33ce45ce6a91b86454147463193b._comment create mode 100644 doc/forum/tips:_special__95__remotes__47__hook_with_tahoe-lafs/comment_2_4d9b9d47d01d606a475678f630797bf9._comment create mode 100644 doc/forum/tips:_special__95__remotes__47__hook_with_tahoe-lafs/comment_3_8a812b11fcc2dc3b6fcf01cdbbb8459d._comment create mode 100644 doc/forum/tips:_special__95__remotes__47__hook_with_tahoe-lafs/comment_4_fc98c819bc5eb4d7c9e74d87fb4f6f3b._comment create mode 100644 doc/forum/tips:_special__95__remotes__47__hook_with_tahoe-lafs/comment_5_c459fb479fe7b13eaea2377cfc1923a6._comment create mode 100644 doc/forum/tips:_special__95__remotes__47__hook_with_tahoe-lafs/comment_6_2e9da5a919bbbc27b32de3b243867d4f._comment create mode 100644 doc/forum/tips:_special__95__remotes__47__hook_with_tahoe-lafs/comment_7_d636c868524b2055ee85832527437f90._comment create mode 100644 doc/forum/tips:_special__95__remotes__47__hook_with_tahoe-lafs/comment_8_39dc449cc60a787c3bfbfaaac6f9be0c._comment create mode 100644 doc/forum/trusted_repositories:_fatal:_not_a_git_repo.mdwn create mode 100644 doc/forum/trusted_repositories:_fatal:_not_a_git_repo/comment_1_0a755a4a281c3bd130722093c8ddd080._comment create mode 100644 doc/forum/ui.mdwn create mode 100644 doc/forum/ui/comment_1_f3e3446b05d6b573e29e6cad300fb635._comment create mode 100644 doc/forum/ui/comment_2_b493ee97eb2378e72c12f3d137109580._comment create mode 100644 doc/forum/unannex_alternatives.mdwn create mode 100644 doc/forum/unannex_alternatives/comment_1_dcd4cd41280b41512bbdffafaf307993._comment create mode 100644 doc/forum/unannex_alternatives/comment_2_58a72a9fe0f58c7af0b4d7927a2dd21d._comment create mode 100644 doc/forum/unannex_alternatives/comment_3_b1687fc8f9e7744327bbeb6f0635d1cd._comment create mode 100644 doc/forum/unknown_response_from_git_cat-file.mdwn create mode 100644 doc/forum/unknown_response_from_git_cat-file/comment_1_f26ba569e715fe69b6de3093930362ee._comment create mode 100644 doc/forum/unlock__47__lock_always_gets_me.mdwn create mode 100644 doc/forum/unlock__47__lock_always_gets_me/comment_1_dee73a7ea3e1a5154601adb59782831f._comment create mode 100644 doc/forum/unlock__47__lock_always_gets_me/comment_2_f89b4349dde840c355a3bc28908decdf._comment create mode 100644 doc/forum/unlock__47__lock_always_gets_me/comment_3_acbab7b75726d34dccb5c9dab7b3e728._comment create mode 100644 doc/forum/unrelated_repositories_sync.mdwn create mode 100644 doc/forum/unrelated_repositories_sync/comment_1_c899b7b05a96d14e25c2efadff3b4e52._comment create mode 100644 doc/forum/unsynced_folder.mdwn create mode 100644 doc/forum/unsynced_folder/comment_1_7d7a262f067c7b02d76e82637223934c._comment create mode 100644 doc/forum/updating_the___34__number_of_copies__34__.mdwn create mode 100644 doc/forum/updating_the___34__number_of_copies__34__/comment_1_327bdb0d9c190c60c7147b3acf07af09._comment create mode 100644 doc/forum/updating_the___34__number_of_copies__34__/comment_2_7e11c839637e0894332e413cde02cee9._comment create mode 100644 doc/forum/updating_the___34__number_of_copies__34__/comment_3_8b7a70fb3bb41e4eda412302834730bb._comment create mode 100644 doc/forum/use_existing_ssh_keys__63__.mdwn create mode 100644 doc/forum/use_existing_ssh_keys__63__/comment_1_c420c53f022bbd1b28494bc44d076feb._comment create mode 100644 doc/forum/use_existing_ssh_keys__63__/comment_2_e4cae848e5701852073ced307832872b._comment create mode 100644 doc/forum/use_existing_ssh_keys__63__/comment_3_a97c20b6df74c49e5f57c7caf962f1e2._comment create mode 100644 doc/forum/using_git_annex_to_merge_and_synchronize_2_directories___40__like_unison__41__.mdwn create mode 100644 doc/forum/using_git_annex_to_merge_and_synchronize_2_directories___40__like_unison__41__/comment_1_5c3ee8a8aaa6d0918c0cc9683ce177ae._comment create mode 100644 doc/forum/using_git_annex_to_merge_and_synchronize_2_directories___40__like_unison__41__/comment_2_648946353c6d90c57351cce4010f1301._comment create mode 100644 doc/forum/version_3_upgrade.mdwn create mode 100644 doc/forum/version_3_upgrade/comment_1_05fc9c9cad26c520bebb98c852c71e35._comment create mode 100644 doc/forum/view_from_numeric_values.mdwn create mode 100644 doc/forum/view_from_numeric_values/comment_1_f3c440f3f0104002a0020ba96ddcf87b._comment create mode 100644 doc/forum/view_from_numeric_values/comment_2_2414e1a8cfd154c339d8fc0e4a630ae9._comment create mode 100644 doc/forum/view_from_numeric_values/comment_3_7879a11cc9767cdaac14f9993182dc25._comment create mode 100644 doc/forum/view_from_numeric_values/comment_4_517c7659654a6fc608eb3332053df8a4._comment create mode 100644 doc/forum/view_including_files_with_no_tags.mdwn create mode 100644 doc/forum/view_including_files_with_no_tags/comment_1_b0aafc023fbec33af268576c4c199af3._comment create mode 100644 doc/forum/view_including_files_with_no_tags/comment_2_5ae9d5308371bdb1f94342c9f9b01aff._comment create mode 100644 doc/forum/vlc_and_git-annex.mdwn create mode 100644 doc/forum/vlc_and_git-annex/comment_1_9c9ab8ce463cf74418aa2f385955f165._comment create mode 100644 doc/forum/vlc_and_git-annex/comment_2_037f94c1deeac873dbdb36cd4c927e45._comment create mode 100644 doc/forum/webapp___47___assistant_without_watch.mdwn create mode 100644 doc/forum/webapp___47___assistant_without_watch/comment_1_1bcd99aa81f937ded683e19a69d33dd9._comment create mode 100644 doc/forum/webapp___47___assistant_without_watch/comment_2_9f5b3f5bf7fedcd5baec519d97d3aa8c._comment create mode 100644 doc/forum/webapp_and_manual_mode.mdwn create mode 100644 doc/forum/webapp_and_manual_mode/comment_1_5b5df5ffeb6ee15779972f13fdc11729._comment create mode 100644 doc/forum/webapp_and_manual_mode/comment_2_a1f06b50d1317c78a301b47eb05d2617._comment create mode 100644 doc/forum/webapp_listen_port_with_autostart.mdwn create mode 100644 doc/forum/webapp_listen_port_with_autostart/comment_1_65dbcf3d8f6c16568f5a326242eab9c5._comment create mode 100644 doc/forum/webapp_listen_port_with_autostart/comment_2_39664f833dedc1a4fe083eec9bc4a7cd._comment create mode 100644 doc/forum/what_happens_to_deleted_files__63__.mdwn create mode 100644 doc/forum/what_happens_to_deleted_files__63__/comment_1_a476174646ad3adfbbe0cafdd7d42d08._comment create mode 100644 doc/forum/windows_port__63__.mdwn create mode 100644 doc/forum/windows_port__63__/comment_1_23fa9aa3b00940a1c1b3876c35eef019._comment create mode 100644 doc/forum/wishlist:_get__47__drop_via_webapp_file_explorer.mdwn create mode 100644 doc/forum/wishlist:_get__47__drop_via_webapp_file_explorer/comment_1_c818a6d44dc13a56460b1865f70eb97c._comment create mode 100644 doc/forum/wishlist:_make_copy_stop_on_exhausted_disk_space.mdwn create mode 100644 doc/forum/wishlist:_make_copy_stop_on_exhausted_disk_space/comment_1_467e5e3db3e836030bc4b4f15846951f._comment create mode 100644 doc/forum/wishlist:_make_copy_stop_on_exhausted_disk_space/comment_2_e3ca3db9bea11d3e085ee9c3c56b33fe._comment create mode 100644 doc/forum/wishlist:_make_copy_stop_on_exhausted_disk_space/comment_3_0ef8c37350fc192d9b784fbab1d9f318._comment create mode 100644 doc/forum/working_without_git-annex_commits.mdwn create mode 100644 doc/forum/workspace.xml_file_disappeared__44___broken_symlink_showed_up.mdwn create mode 100644 doc/forum/workspace.xml_file_disappeared__44___broken_symlink_showed_up/comment_1_00b084f9786de6516f46065c0cb00e79._comment create mode 100644 doc/forum/workspace.xml_file_disappeared__44___broken_symlink_showed_up/comment_2_138499b36d28c5e267b4aad8792dc87e._comment create mode 100644 doc/forum/workspace.xml_file_disappeared__44___broken_symlink_showed_up/comment_3_6c59c494b563e56d061417eb2216bb19._comment create mode 100644 doc/forum/workspace.xml_file_disappeared__44___broken_symlink_showed_up/comment_4_ccbba61cdd6fce3e5de82417bcc0cbfb._comment create mode 100644 doc/forum/workspace.xml_file_disappeared__44___broken_symlink_showed_up/comment_5_50526283b35997cece2f087507cdd4ee._comment create mode 100644 doc/forum/would_you_call_me_crazy_if_I_use_git_annex_in_direct_mode_to_track_my___47__home__63____63__.mdwn create mode 100644 doc/forum/would_you_call_me_crazy_if_I_use_git_annex_in_direct_mode_to_track_my___47__home__63____63__/comment_1_b011442de2f67f3ad340031a0767e990._comment create mode 100644 doc/forum/would_you_call_me_crazy_if_I_use_git_annex_in_direct_mode_to_track_my___47__home__63____63__/comment_2_c69865c08c3eb49d64310fc76e80c65d._comment create mode 100644 doc/forum/would_you_call_me_crazy_if_I_use_git_annex_in_direct_mode_to_track_my___47__home__63____63__/comment_3_7651fb48fc71b2c7b4e7b6830a0f9865._comment create mode 100644 doc/forum/would_you_call_me_crazy_if_I_use_git_annex_in_direct_mode_to_track_my___47__home__63____63__/comment_4_7d88f1aa163185c801b7697846086c7f._comment create mode 100644 doc/future_proofing.mdwn create mode 100644 doc/git-annex-shell.mdwn create mode 100644 doc/git-annex.mdwn create mode 100644 doc/git-union-merge.mdwn create mode 100644 doc/how_it_works.mdwn create mode 100644 doc/how_it_works/comment_1_b3bdd6a06d5764db521ae54878131f5f._comment create mode 100644 doc/how_it_works/comment_2_2a8ce5859040d815e6234fc18f5f1961._comment create mode 100644 doc/index.mdwn create mode 100644 doc/install.mdwn create mode 100644 doc/install/Android.mdwn create mode 100644 doc/install/Android/comment_10_225f2c6fe255be93702cfbd4dc172f3b._comment create mode 100644 doc/install/Android/comment_11_4e970633d9073fcf4bc33f3fff2525b2._comment create mode 100644 doc/install/Android/comment_12_87da4f379a0276b662583e7e22061218._comment create mode 100644 doc/install/Android/comment_1_f9ced494a530e6ae3e76cfbaddb89f5d._comment create mode 100644 doc/install/Android/comment_2_74cccae04ea23a8600069c7e658143aa._comment create mode 100644 doc/install/Android/comment_3_82c7cb31d19d4e18ca5548da5ca19a79._comment create mode 100644 doc/install/Android/comment_4_cebaa8ee5bbed27d9b2d032ca7bdec6e._comment create mode 100644 doc/install/Android/comment_8_34f7c42050fa48769a6bfae60d72e477._comment create mode 100644 doc/install/Android/comment_9_f3d289b78d6bdb3cc65689495a8439a5._comment create mode 100644 doc/install/ArchLinux.mdwn create mode 100644 doc/install/ArchLinux/comment_1_da5919c986d2ae187bc2f73de9633978._comment create mode 100644 doc/install/ArchLinux/comment_2_e5f923e6d81cfb3fba7a72f60baaf4ab._comment create mode 100644 doc/install/ArchLinux/comment_3_8e607cd883ec174571e9dfe3b25bfd05._comment create mode 100644 doc/install/ArchLinux/comment_4_a378391dd218859f381c479259dd8fe3._comment create mode 100644 doc/install/ArchLinux/comment_5_cbc960cd78bf5b90e3bb6cb605d6d970._comment create mode 100644 doc/install/ArchLinux/comment_6_1d597d6a95f9c2df7dae6e98813e4865._comment create mode 100644 doc/install/ArchLinux/comment_7_2d708977e2fad6b68803494576382df5._comment create mode 100644 doc/install/ArchLinux/comment_8_5b5f5e0b64e5bfb1ea12e8b251c6fb5f._comment create mode 100644 doc/install/Debian.mdwn create mode 100644 doc/install/Debian/comment_10_d5da996e106d2e4d8a822aa9bcc78596._comment create mode 100644 doc/install/Debian/comment_11_84283676da247c401bc9b4bb12c2b453._comment create mode 100644 doc/install/Debian/comment_12_0aca83b055d0a9dd8589c50250a8bbea._comment create mode 100644 doc/install/Debian/comment_13_167a091764e5e99ec0f35a65e95a22de._comment create mode 100644 doc/install/Debian/comment_14_a34e23d9aa3027012ab1236aa4f7d5cb._comment create mode 100644 doc/install/Debian/comment_15_20d8271ba3f6cfe3c8849c3d41607630._comment create mode 100644 doc/install/Debian/comment_1_029486088d098c2d4f1099f2f0e701a9._comment create mode 100644 doc/install/Debian/comment_2_648e3467e260cdf233acdb0b53313ce0._comment create mode 100644 doc/install/Debian/comment_3_4d922e11249627634ecc35bba4044d9e._comment create mode 100644 doc/install/Debian/comment_4_2a93ab18b05ccb90e7acc5885866fca2._comment create mode 100644 doc/install/Debian/comment_5_38e6399083e10a6a274f35bddc15d4ac._comment create mode 100644 doc/install/Debian/comment_6_2e7bbdbaabbfb9d89de22e913066e822._comment create mode 100644 doc/install/Debian/comment_7_1bccc7bf7a4ef61a9b30024b9b22ba7d._comment create mode 100644 doc/install/Debian/comment_8_5b5a3b0e8abe8831a6a15a4e258d14fd._comment create mode 100644 doc/install/Debian/comment_9_97eaed998ffd1ed79585075ed5cff06e._comment create mode 100644 doc/install/Docker.mdwn create mode 100644 doc/install/Fedora.mdwn create mode 100644 doc/install/Fedora/comment_1_c4db84e672ad4b45b522db735706b00f._comment create mode 100644 doc/install/Fedora/comment_2_f98c488c09bef86e2b0414589ce9e141._comment create mode 100644 doc/install/Fedora/comment_3_d872acf8865fe7c99a9b712db5b38ea4._comment create mode 100644 doc/install/Fedora/comment_4_93b3402e4c51e1a5c96f907bb528164b._comment create mode 100644 doc/install/Fedora/comment_5_0427e0503764b29e57abf9e97155136b._comment create mode 100644 doc/install/Fedora/comment_6_1b1b38a79251fe2e8c1e4debbe3bc3c5._comment create mode 100644 doc/install/FreeBSD.mdwn create mode 100644 doc/install/Gentoo.mdwn create mode 100644 doc/install/Linux_standalone.mdwn create mode 100644 doc/install/Linux_standalone/comment_1_1adc00aecc51f1e74701bd67cd74155d._comment create mode 100644 doc/install/Linux_standalone/comment_2_7983285b56fd10359a7cc3615fd1e2fe._comment create mode 100644 doc/install/NixOS.mdwn create mode 100644 doc/install/OSX.mdwn create mode 100644 doc/install/OSX/comment_10_cd2120552ef894a37933b328136fa4cc._comment create mode 100644 doc/install/OSX/comment_11_740fa80e2e54e6fb570f820ff1f56440._comment create mode 100644 doc/install/OSX/comment_12_a84028080578a8b60115b6c4ef823627._comment create mode 100644 doc/install/OSX/comment_13_d6f1db401858ffea23c123db49f5b296._comment create mode 100644 doc/install/OSX/comment_14_035f856923276b0edad879e196e94097._comment create mode 100644 doc/install/OSX/comment_15_336e0acb00e84943715e69917643a69e._comment create mode 100644 doc/install/OSX/comment_16_1befafa862b7d07b1f6e57c0182497cf._comment create mode 100644 doc/install/OSX/comment_17_19c08b2c6c2c5cd88bf96d2bcbbd9055._comment create mode 100644 doc/install/OSX/comment_18_537fad5d8854e765499d47602d1ab398._comment create mode 100644 doc/install/OSX/comment_19_18d4377f4ded5604d395d73783ba82c9._comment create mode 100644 doc/install/OSX/comment_20_3e6a3c00444badf2cf7a9ee3d54af11e._comment create mode 100644 doc/install/OSX/comment_21_987f1302f56107c926b6daf83e124654._comment create mode 100644 doc/install/OSX/comment_22_6b5f44a98f9d37a1c6ecfe19a60fe6c5._comment create mode 100644 doc/install/OSX/comment_23_3d82a270dd4b0159f4aab5675166e1e3._comment create mode 100644 doc/install/OSX/comment_24_b9d3563a2cc3d769f27876e028dc344d._comment create mode 100644 doc/install/OSX/comment_25_db90984062a07576a4777b2d743161f1._comment create mode 100644 doc/install/OSX/comment_27_2a60108a440231ba83f5a54b6bcc5488._comment create mode 100644 doc/install/OSX/comment_27_d453510b9bb62072a4c663206c12c8a4._comment create mode 100644 doc/install/OSX/comment_28_0970bfd63137ea48701dff6aea1b4bcb._comment create mode 100644 doc/install/OSX/comment_29_8622ed56c6a8034c20fb311418d94003._comment create mode 100644 doc/install/OSX/comment_2_25552ff2942048fafe97d653757f1ad6._comment create mode 100644 doc/install/OSX/comment_30_ce58633ef5b2f8f4caa7e626358f33be._comment create mode 100644 doc/install/OSX/comment_31_09084a7b3cf06bfa3add0f4991476ffe._comment create mode 100644 doc/install/OSX/comment_32_a46d8e3e7795b9afb1e1c2be943d12af._comment create mode 100644 doc/install/OSX/comment_33_203a36322b3c453c05c8906c64e62e06._comment create mode 100644 doc/install/OSX/comment_34_874ff01f27911baf6ef0f559d5d5f5a0._comment create mode 100644 doc/install/OSX/comment_3_47a77a03040fe628109bd54f82f9ad7a._comment create mode 100644 doc/install/OSX/comment_4_25cac8bcd84a5210fc0a5243260b8cc7._comment create mode 100644 doc/install/OSX/comment_4_bbe99673033e4c48c8bb3db24ee419f9._comment create mode 100644 doc/install/OSX/comment_5_39b4b748b4586bf32b37edfefef84bba._comment create mode 100644 doc/install/OSX/comment_6_1a9c91ef43edc4148947f202ff604114._comment create mode 100644 doc/install/OSX/comment_7_892f7e65f95f43697164267c4b71c0d5._comment create mode 100644 doc/install/OSX/comment_8_38d9c2eea1090674de2361274eab5b0e._comment create mode 100644 doc/install/OSX/comment_9_35bf3812db6f3ef25da9b3bc84f147c5._comment create mode 100644 doc/install/OSX/old_comments.mdwn create mode 100644 doc/install/OSX/old_comments/comment_10_4d15bfc4fc26e7249953bebfbb09e0aa._comment create mode 100644 doc/install/OSX/old_comments/comment_10_798000aab19af2944b6e44dbc550c6fe._comment create mode 100644 doc/install/OSX/old_comments/comment_11_707a1a27a15b2de8dfc8d1a30420ab4c._comment create mode 100644 doc/install/OSX/old_comments/comment_12_60d13f2c8e008af1041bea565a392c83._comment create mode 100644 doc/install/OSX/old_comments/comment_13_a6f48c87c2d6eabe379d6e10a6cac453._comment create mode 100644 doc/install/OSX/old_comments/comment_14_6ef2ddb7b11ce6ad54578ae118ed346e._comment create mode 100644 doc/install/OSX/old_comments/comment_15_6fd1fad5b6d9f36620e5a0e99edd2f89._comment create mode 100644 doc/install/OSX/old_comments/comment_16_af6fe3540032cdf4400478de87771058._comment create mode 100644 doc/install/OSX/old_comments/comment_17_8d3a0596db67108041728b20f2790f31._comment create mode 100644 doc/install/OSX/old_comments/comment_1_0a1760bf0db1f1ba89bdb4c62032f631._comment create mode 100644 doc/install/OSX/old_comments/comment_2_0327c64b15249596add635d26f4ce67f._comment create mode 100644 doc/install/OSX/old_comments/comment_2_7683740a98182de06cb329792e0c0a25._comment create mode 100644 doc/install/OSX/old_comments/comment_34_c9362141d15a2f68a75df9f8bfe29da0._comment create mode 100644 doc/install/OSX/old_comments/comment_35_8106196c3fef70652cb2106e2d5857db._comment create mode 100644 doc/install/OSX/old_comments/comment_3_47c682a779812dda77601c24a619923c._comment create mode 100644 doc/install/OSX/old_comments/comment_3_733147cebe501c60f2141b711f1d7f24._comment create mode 100644 doc/install/OSX/old_comments/comment_3_b090f40fe5a32e00b472a5ab2b850b4a._comment create mode 100644 doc/install/OSX/old_comments/comment_3_fc092412e99cf4c5f095b0ef710bc4de._comment create mode 100644 doc/install/OSX/old_comments/comment_4_d513e21512a9b207983d38abf348d00f._comment create mode 100644 doc/install/OSX/old_comments/comment_4_d68c36432c7be3f4a76f4f0d7300bac9._comment create mode 100644 doc/install/OSX/old_comments/comment_4_e6109a964064a2a799768a370e57801d._comment create mode 100644 doc/install/OSX/old_comments/comment_5_50777853f808d57b957f8ce9a0f84b3d._comment create mode 100644 doc/install/OSX/old_comments/comment_5_626a4b4bf302d4ae750174f860402f70._comment create mode 100644 doc/install/OSX/old_comments/comment_6_18a8df794aa0ddd294dbf17d3d4c7fe2._comment create mode 100644 doc/install/OSX/old_comments/comment_7_2ce7acab15403d3f993cec94ec7f3bc6._comment create mode 100644 doc/install/OSX/old_comments/comment_8_a93ad4b67c5df4243268bcf32562f6be._comment create mode 100644 doc/install/OSX/old_comments/comment_9_ae3ed5345bc84f57e44251d2e6c39342._comment create mode 100644 doc/install/OSX/old_comments/comment_9_c6b1b31d16f2144ad08abd8c767b6ab9._comment create mode 100644 doc/install/ScientificLinux5.mdwn create mode 100644 doc/install/Ubuntu.mdwn create mode 100644 doc/install/Ubuntu/comment_10_490e065314693423ab6969d8ae6978fe._comment create mode 100644 doc/install/Ubuntu/comment_11_4ebac3fb43de854ed1a3b1d2ea94011a._comment create mode 100644 doc/install/Ubuntu/comment_12_38f69dffe2db0d15e4c4e5cb47f40ef8._comment create mode 100644 doc/install/Ubuntu/comment_1_d1c511153fe94bf33e19a1281f1c92f2._comment create mode 100644 doc/install/Ubuntu/comment_2_ad13886c1c1f76d1cd995ea7b7d8471c._comment create mode 100644 doc/install/Ubuntu/comment_3_a08817322739b03cf0fec97283b16f1a._comment create mode 100644 doc/install/Ubuntu/comment_4_fe0997e56136bd30749f0995cbf19b56._comment create mode 100644 doc/install/Ubuntu/comment_5_fbb5306a162db1a1ee9efa3523aac952._comment create mode 100644 doc/install/Ubuntu/comment_6_a97e7f0e62ac685c3ded423bddeaa67f._comment create mode 100644 doc/install/Ubuntu/comment_7_921a223fd7e679b9ced3d8ba5ce688e0._comment create mode 100644 doc/install/Ubuntu/comment_8_1f943cb084fa8e21bc6ee5fc3118f02f._comment create mode 100644 doc/install/Ubuntu/comment_9_c2f8b35ada873acb1ce593b04e2899fe._comment create mode 100644 doc/install/Windows.mdwn create mode 100644 doc/install/cabal.mdwn create mode 100644 doc/install/cabal/comment_10_7ebe353b05d4df29897dc9a4f45c8a91._comment create mode 100644 doc/install/cabal/comment_11_0d06702e6e0ae3cd331cf748a9f6f273._comment create mode 100644 doc/install/cabal/comment_12_b93ca271dffca3f948645d3e1326c1d9._comment create mode 100644 doc/install/cabal/comment_13_3dac019cda71bf99878c0a1d9382323b._comment create mode 100644 doc/install/cabal/comment_14_14b46470593f84f8c3768a91cb77bdab._comment create mode 100644 doc/install/cabal/comment_15_c3a5b0aad28a90e0bb8da31a430578eb._comment create mode 100644 doc/install/cabal/comment_16_4faf214f97f9516898d7c17d743ef825._comment create mode 100644 doc/install/cabal/comment_17_2a9d6807a3a13815c824985521757167._comment create mode 100644 doc/install/cabal/comment_18_1efa0c7a963ec452fc6336fbe4964f6e._comment create mode 100644 doc/install/cabal/comment_19_6f42f9234f9ff6a2ca6bbb4d2643843e._comment create mode 100644 doc/install/cabal/comment_1_f04df6bcd50d1d01eb34868bb00ac35c._comment create mode 100644 doc/install/cabal/comment_20_0f553be2a4c666e3bed58b2bce549406._comment create mode 100644 doc/install/cabal/comment_21_f91a6ec21e96eced73ea9579fd8cbd15._comment create mode 100644 doc/install/cabal/comment_22_2f27b78215f97ade1986ca806c634cb3._comment create mode 100644 doc/install/cabal/comment_23_c34d2b1d95830a3e58671a5b566a1758._comment create mode 100644 doc/install/cabal/comment_24_40cbde8ec067b3a860e6df1a9bea5f76._comment create mode 100644 doc/install/cabal/comment_25_8a7664e6f9271718dc607a0782366c5b._comment create mode 100644 doc/install/cabal/comment_26_bd455c732639728bce2bfc39e32871d2._comment create mode 100644 doc/install/cabal/comment_27_c080e9239b6eec88d329c28da7bb4141._comment create mode 100644 doc/install/cabal/comment_28_15951dd070a675300420eea137a28ef9._comment create mode 100644 doc/install/cabal/comment_29_ac082dca67f4a29b06070c0283130f52._comment create mode 100644 doc/install/cabal/comment_2_a69d17c55e56a707ec6606d5cdddee25._comment create mode 100644 doc/install/cabal/comment_30_ad639c07cb79e89406e95c1dafce3a01._comment create mode 100644 doc/install/cabal/comment_31_4763b24a29627d55f465b9ea260ea7ec._comment create mode 100644 doc/install/cabal/comment_32_1d34c294486c85b1149675fa5861ae35._comment create mode 100644 doc/install/cabal/comment_33_8d4dfc33cada6091c30d3a43ce404b8b._comment create mode 100644 doc/install/cabal/comment_34_38451e751add6daf479b559c4b6a7c61._comment create mode 100644 doc/install/cabal/comment_35_4d44e4531e6686bd340f26836ad40026._comment create mode 100644 doc/install/cabal/comment_3_55bed050bdb768543dbe1b86edec057d._comment create mode 100644 doc/install/cabal/comment_4_2ff7f8a3b03bea7e860248829d595bd1._comment create mode 100644 doc/install/cabal/comment_5_8789fc27466714faa5a3a7a6b8ec6e5d._comment create mode 100644 doc/install/cabal/comment_6_5afb2d081e8b603bc338cd460ad9317d._comment create mode 100644 doc/install/cabal/comment_7_129c4f2e404c874e5adfa52902a81104._comment create mode 100644 doc/install/cabal/comment_8_738c108f131e3aab0d720bc4fd6a81fd._comment create mode 100644 doc/install/cabal/comment_9_5ddbba419d96a7411f7edddaa4d7b739._comment create mode 100644 doc/install/fromscratch.mdwn create mode 100644 doc/install/openSUSE.mdwn create mode 100644 doc/internals.mdwn create mode 100644 doc/internals/comment_1_4b8ed353dca4f484b3b6eb463fa02fd8._comment create mode 100644 doc/internals/comment_2_c19232d5cc4976c2e5b014aef6e8d9ec._comment create mode 100644 doc/internals/hashing.mdwn create mode 100644 doc/internals/hashing/comment_1_9153e4f4f9335e524cf1b96a51bef41f._comment create mode 100644 doc/internals/key_format.mdwn create mode 100644 doc/internals/lockdown.mdwn create mode 100644 doc/license.mdwn create mode 100644 doc/license/AGPL create mode 100644 doc/license/GPL create mode 100644 doc/license/LGPL create mode 100644 doc/links/key_concepts.mdwn create mode 100644 doc/links/other_stuff.mdwn create mode 100644 doc/links/the_details.mdwn create mode 100644 doc/location_tracking.mdwn create mode 100644 doc/logo-old-bw.svg create mode 100644 doc/logo-old.png create mode 100644 doc/logo-old.svg create mode 100644 doc/logo-old_small.png create mode 100644 doc/logo.mdwn create mode 100644 doc/logo.svg create mode 100644 doc/logo_16x16.png create mode 100644 doc/logo_32x32.png create mode 100644 doc/logo_small.png create mode 100644 doc/meta.mdwn create mode 100644 doc/metadata.mdwn create mode 100644 doc/metadata/comment_1_d367fdaf0425b59d694bf16059d47192._comment create mode 100644 doc/metadata/comment_2_e15d2b5a405db4ccdb91d6aad4a22983._comment create mode 100644 doc/news.mdwn create mode 100644 doc/news/2013_git-annex_user_survey.mdwn create mode 100644 doc/news/LWN_article.mdwn create mode 100644 doc/news/Presentation_at_FOSDEM.mdwn create mode 100644 doc/news/git_annex_fall_of_code.mdwn create mode 100644 doc/news/sharebox_a_FUSE_filesystem_for_git-annex.mdwn create mode 100644 doc/news/sharebox_a_FUSE_filesystem_for_git-annex/comment_1_e238d1734238e37bb55ff952b32e06b8._comment create mode 100644 doc/news/version_4.20130827/comment_1_937cbaccf235d6d9118aacd49058bb4f._comment create mode 100644 doc/news/version_4.20130827/comment_2_faa5cf0645728b4ade850a691fa472db._comment create mode 100644 doc/news/version_4.20130827/comment_3_ad156d6199b525884114ff823d265bf7._comment create mode 100644 doc/news/version_4.20130827/comment_4_877061eb24d9d9543cc9cd229906bd64._comment create mode 100644 doc/news/version_4.20130827/comment_5_8991648dda991768e3a58477a4c3c923._comment create mode 100644 doc/news/version_5.20140116/comment_1_a5e85a3258ae8a241674dda4172b3e94._comment create mode 100644 doc/news/version_5.20140116/comment_2_016ef01507edd6baa26c6c9a90f35ed7._comment create mode 100644 doc/news/version_5.20140116/comment_3_e4b6899c3b12fc260806ba8d36df6158._comment create mode 100644 doc/news/version_5.20140127/comment_1_776574c242235d9256da287048e38dc0._comment create mode 100644 doc/news/version_5.20140127/comment_2_aea5d528f3e0fdc81d0ea83d65f48812._comment create mode 100644 doc/news/version_5.20140210/comment_1_97065912d6a204c7387d7de5e48de420._comment create mode 100644 doc/news/version_5.20140210/comment_2_e589892996ca7cca3febdbf0f2cc379b._comment create mode 100644 doc/news/version_5.20140221.mdwn create mode 100644 doc/news/version_5.20140221/comment_1_d50bff4ee026db3397333e8ded7c5940._comment create mode 100644 doc/news/version_5.20140227.mdwn create mode 100644 doc/news/version_5.20140306.mdwn create mode 100644 doc/news/version_5.20140320.mdwn create mode 100644 doc/not.mdwn create mode 100644 doc/not/comment_10_d8fb9add7e98dadea2a39f8827f75447._comment create mode 100644 doc/not/comment_11_6c23aba5a9c341f2d5e2007e4b43f2ea._comment create mode 100644 doc/not/comment_12_a0ef1a045257659f0f8722e4987e0ccc._comment create mode 100644 doc/not/comment_13_c5c20576388f18daba3af913b44fb001._comment create mode 100644 doc/not/comment_1_ab41bec1ccc884e71780cb9458439170._comment create mode 100644 doc/not/comment_2_0e19ff7deb5ed65f2bc685d4c516d816._comment create mode 100644 doc/not/comment_3_bab9584c41a25dda934ad230e3eb732d._comment create mode 100644 doc/not/comment_4_b2a0d5a45ab8ddd66c29dde9412d7a12._comment create mode 100644 doc/not/comment_5_f2829ecbe80a61aa9a8411d2403de69e._comment create mode 100644 doc/not/comment_6_547fc59b19ad66d7280c53a7f923ea08._comment create mode 100644 doc/not/comment_7_581e23cca0219711f8a4500a8d5d20fc._comment create mode 100644 doc/not/comment_8_5c61457f117de38ef487e5cc2780d554._comment create mode 100644 doc/not/comment_9_69aa47398a3c13ce64f146de985b727d._comment create mode 100644 doc/polls.mdwn create mode 100644 doc/polls/2013.mdwn create mode 100644 doc/preferred_content.mdwn create mode 100644 doc/preferred_content/comment_10_f0bce3c67f293eaba97b92f0942876b6._comment create mode 100644 doc/preferred_content/comment_1_7d45e21dfb016e9ffa4715346dd0c1a6._comment create mode 100644 doc/preferred_content/comment_2_1ccd90b009245667ad59f4d29d2a3a37._comment create mode 100644 doc/preferred_content/comment_4_384025b5fa23a3f175985a081438149f._comment create mode 100644 doc/preferred_content/comment_4_6a9bc657bc7415f0e118357d8c6664c6._comment create mode 100644 doc/preferred_content/comment_5_f0a957e67297c4bb5a8778c11b3c9fd4._comment create mode 100644 doc/preferred_content/comment_6_b434c0e2aaa132020fd4a01551285376._comment create mode 100644 doc/preferred_content/comment_7_c4acaa237bf1a8512c5e8ea4cdbd11b9._comment create mode 100644 doc/preferred_content/comment_8_ff2a2dc9c566ebd9f570bdfcd7bfc030._comment create mode 100644 doc/preferred_content/comment_9_f82538be42428691d7cab60a7add2e74._comment create mode 100644 doc/preferred_content/standard_groups.mdwn create mode 100644 doc/preferred_content/standard_groups/comment_1_026e47e425d06c4b2580238b3187a379._comment create mode 100644 doc/preferred_content/standard_groups/comment_2_460bae34ba7c05357318a202b2932d25._comment create mode 100644 doc/privacy.mdwn create mode 100644 doc/publicrepos.mdwn create mode 100644 doc/related_software.mdwn create mode 100644 doc/repomap.png create mode 100644 doc/required_content.mdwn create mode 100644 doc/scalability.mdwn create mode 100644 doc/shortcuts.mdwn create mode 100644 doc/sidebar.mdwn create mode 100644 doc/sitemap.mdwn create mode 100644 doc/special_remotes.mdwn create mode 100644 doc/special_remotes/S3.mdwn create mode 100644 doc/special_remotes/S3/comment_10_c366f020c9b97a365e21878a33360079._comment create mode 100644 doc/special_remotes/S3/comment_11_c1da387e082d91feec13dde91ccb111a._comment create mode 100644 doc/special_remotes/S3/comment_12_59c3ecab7dbc8be53258460473cac21c._comment create mode 100644 doc/special_remotes/S3/comment_13_0789a21d980825188bb09f7fc8bba8be._comment create mode 100644 doc/special_remotes/S3/comment_14_29574a51d5831c51e2e765eb2c06e567._comment create mode 100644 doc/special_remotes/S3/comment_15_ceb9048c743135f6beca57a23505f0a3._comment create mode 100644 doc/special_remotes/S3/comment_16_7b79f8b5ef88a2775d61b5ac5774d3e0._comment create mode 100644 doc/special_remotes/S3/comment_1_4a1f7a230dad6caa84831685b236fd73._comment create mode 100644 doc/special_remotes/S3/comment_2_5b22d67de946f4d34a4a3c7449d32988._comment create mode 100644 doc/special_remotes/S3/comment_3_bcab2bd0f168954243aa9bcc9671bd94._comment create mode 100644 doc/special_remotes/S3/comment_4_38c0b062997fde1ad28facc05d973e83._comment create mode 100644 doc/special_remotes/S3/comment_5_409bc2b56382417cf26bb222fb783ba7._comment create mode 100644 doc/special_remotes/S3/comment_6_78da9e233882ec0908962882ea8c4056._comment create mode 100644 doc/special_remotes/S3/comment_7_6af9781004d982d8e6b20a83ad29eead._comment create mode 100644 doc/special_remotes/S3/comment_8_0fa68d584ee7f6b5c9058fba7e911a11._comment create mode 100644 doc/special_remotes/S3/comment_9_7ad757b3865b04967c79af0a263bb3b0._comment create mode 100644 doc/special_remotes/bup.mdwn create mode 100644 doc/special_remotes/bup/comment_10_f78c1ed97d2e4c6ebffaa7482cfe0c9b._comment create mode 100644 doc/special_remotes/bup/comment_11_b53bceb0058acf4d1ab12ea4853ee443._comment create mode 100644 doc/special_remotes/bup/comment_12_65d923226cf6120349d807c5c60f640c._comment create mode 100644 doc/special_remotes/bup/comment_1_96179a003da4444f6fc08867872cda0a._comment create mode 100644 doc/special_remotes/bup/comment_2_612b038c15206f9f3c2e23c7104ca627._comment create mode 100644 doc/special_remotes/bup/comment_3_1186def82741ddab1ade256fb2e59e6f._comment create mode 100644 doc/special_remotes/bup/comment_4_7d22a805dd2914971e7ca628ceea69be._comment create mode 100644 doc/special_remotes/bup/comment_6_5942333cde09fd98e26c4f1d389cb76f._comment create mode 100644 doc/special_remotes/bup/comment_7_cb1a0d3076e9d06e7a24204478f6fa98._comment create mode 100644 doc/special_remotes/bup/comment_8_4cbc67e5911748d13cee3c483d7ece8a._comment create mode 100644 doc/special_remotes/bup/comment_9_ca7096a759961af375e6bd49663b45b3._comment create mode 100644 doc/special_remotes/comment_10_e9881290486a1770bd260f8650ada9c6._comment create mode 100644 doc/special_remotes/comment_11_e01b5cc5a0d81b071e93e27e7b91fe2a._comment create mode 100644 doc/special_remotes/comment_12_13237170ef5b6646e0e25d3421af3fe5._comment create mode 100644 doc/special_remotes/comment_13_1a36a0483a9db04d36e0234a192ebad8._comment create mode 100644 doc/special_remotes/comment_14_a8419963dc024b1d9eb73807596012dc._comment create mode 100644 doc/special_remotes/comment_15_95ccfdd22a2391daa99e0beb04adedd6._comment create mode 100644 doc/special_remotes/comment_16_b9d238fb15ad7628e33c90b071e07bb0._comment create mode 100644 doc/special_remotes/comment_17_cc21b81a8f809f6efa5f5b6332513fc3._comment create mode 100644 doc/special_remotes/comment_18_3fe750118ff1edbe91a110b86fb5b662._comment create mode 100644 doc/special_remotes/comment_19_6794eb52bd87c28ef1df3172aa7d5780._comment create mode 100644 doc/special_remotes/comment_1_961276c18e9353ca8e25cad53e7ec51f._comment create mode 100644 doc/special_remotes/comment_20_6b7242721f2f2c77b634568cb737e3e3._comment create mode 100644 doc/special_remotes/comment_21_5c11e69c28b9ed4cbe238a36c0839a47._comment create mode 100644 doc/special_remotes/comment_2_97543acfa7434e332ebea5672e446317._comment create mode 100644 doc/special_remotes/comment_3_9229776623c234204c8b164edff95da0._comment create mode 100644 doc/special_remotes/comment_4_3bbda479d13f6bf393dcd59ed94ddeaa._comment create mode 100644 doc/special_remotes/comment_5_f7000975d38077828ab11a99095b39eb._comment create mode 100644 doc/special_remotes/comment_6_5d2bd7c1e1493d3c3784708a9b0bc001._comment create mode 100644 doc/special_remotes/comment_7_af01ee5ce31b1490af565cb087d65277._comment create mode 100644 doc/special_remotes/comment_8_3d4ffec566d68d601eafe8758a616756._comment create mode 100644 doc/special_remotes/comment_9_26af468952f0403171370b56e127830a._comment create mode 100644 doc/special_remotes/directory.mdwn create mode 100644 doc/special_remotes/directory/comment_11_86f8c1b09cbd82bcd76378dfa1b3ca07._comment create mode 100644 doc/special_remotes/directory/comment_12._comment create mode 100644 doc/special_remotes/directory/comment_12_311cd013fd8db47856d84161119e059d._comment create mode 100644 doc/special_remotes/directory/comment_1_e8a53592adb13f7d7f212a2eb5a18a31._comment create mode 100644 doc/special_remotes/directory/comment_2_d949edad6a330079f9e15f703f9091e3._comment create mode 100644 doc/special_remotes/directory/comment_3_49009f4e9e335c9a9d0422aa59c9a432._comment create mode 100644 doc/special_remotes/directory/comment_4_f5e9b0b477c4e521f8633fd274757fa3._comment create mode 100644 doc/special_remotes/directory/comment_5_e790718423c41f5ea8047ea5225bfacd._comment create mode 100644 doc/special_remotes/directory/comment_6_325aac80b86588912c4fd61339ccbd0b._comment create mode 100644 doc/special_remotes/directory/comment_7_4206db69d68d9917623ce02500387021._comment create mode 100644 doc/special_remotes/directory/comment_8_acd9023511fe43817718bc89430f96c3._comment create mode 100644 doc/special_remotes/directory/comment_9_d330eb808a990bb71034613c297a265e._comment create mode 100644 doc/special_remotes/external.mdwn create mode 100755 doc/special_remotes/external/example.sh create mode 100644 doc/special_remotes/gcrypt.mdwn create mode 100644 doc/special_remotes/glacier.mdwn create mode 100644 doc/special_remotes/glacier/comment_1_fcd856b99dc6b3f9141b65fe639ef76b._comment create mode 100644 doc/special_remotes/glacier/comment_2_38fcca87074f6ea31a12569a822aa8c9._comment create mode 100644 doc/special_remotes/glacier/comment_3_cea5bcb162e4288847ba5f25464a0406._comment create mode 100644 doc/special_remotes/glacier/comment_4_0c92cc82c7ac513130f862391a02d329._comment create mode 100644 doc/special_remotes/glacier/comment_5_8d1dcb4bf48386314bfb248ea6eeeb68._comment create mode 100644 doc/special_remotes/glacier/comment_6_adb1db354dc4941e4b004e4ba34660d7._comment create mode 100644 doc/special_remotes/glacier/comment_7_747e403aac5acaba00e220931e926951._comment create mode 100644 doc/special_remotes/hook.mdwn create mode 100644 doc/special_remotes/hook/comment_1_6a74a25891974a28a8cb42b87cb53c26._comment create mode 100644 doc/special_remotes/hook/comment_2_ee7c43b93c5b787216334f019643f6a0._comment create mode 100644 doc/special_remotes/hook/comment_3_2593291795e732994862d08bf2ed467b._comment create mode 100644 doc/special_remotes/hook/comment_4_35d79b5ffa5a19056efcdc805070bc4b._comment create mode 100644 doc/special_remotes/hook/comment_5_6fbf1e963fa3ea4b2eb8ca5a3819762d._comment create mode 100644 doc/special_remotes/hook/comment_6_e0ab48d5333e5de85f016b097e6fdac1._comment create mode 100644 doc/special_remotes/hook/comment_7_cc2b1243c2c36e63241513bcaddfea67._comment create mode 100644 doc/special_remotes/hook/comment_8_bbae315233bda48eb04662dfd48cf1ae._comment create mode 100644 doc/special_remotes/hook/comment_9_037523d1994c702239ca96791156fe65._comment create mode 100644 doc/special_remotes/rsync.mdwn create mode 100644 doc/special_remotes/rsync/comment_10_43e8fa3517c1f5935f02ad06fbed63dc._comment create mode 100644 doc/special_remotes/rsync/comment_11_8cafc1a8b37e6fb056185ec058c0c3e8._comment create mode 100644 doc/special_remotes/rsync/comment_1_9e180c397486989beab21699b8e8f103._comment create mode 100644 doc/special_remotes/rsync/comment_2_25545dc0b53f09ae73b29899c8884b02._comment create mode 100644 doc/special_remotes/rsync/comment_3_960a89b1ae7e3888ffba06baa963dc21._comment create mode 100644 doc/special_remotes/rsync/comment_4_db84816c31239953dd21f23a8c557b43._comment create mode 100644 doc/special_remotes/rsync/comment_5_ccaffa4aded9dab88c76a856b96ea5b9._comment create mode 100644 doc/special_remotes/rsync/comment_6_e687b9482b177e1351c8c65ea617d3fa._comment create mode 100644 doc/special_remotes/rsync/comment_7_e122979ea811d9ef835ba05bb936190f._comment create mode 100644 doc/special_remotes/rsync/comment_8_d566113318d0aa7500d76ffe1bd46069._comment create mode 100644 doc/special_remotes/rsync/comment_9_5dcf10a502b2d4feac46b620d43e9d00._comment create mode 100644 doc/special_remotes/tahoe.mdwn create mode 100644 doc/special_remotes/web.mdwn create mode 100644 doc/special_remotes/web/comment_1_0bd570025f6cd551349ea88a4729ac8e._comment create mode 100644 doc/special_remotes/web/comment_2_333141cc9ec6c26ffd19aa95303a91e3._comment create mode 100644 doc/special_remotes/webdav.mdwn create mode 100644 doc/special_remotes/webdav/comment_1_6b523eea78eae1d19fe2a9950ee33e3a._comment create mode 100644 doc/special_remotes/webdav/comment_2_83fc4e7d9ba7a05c8500da659f561b8f._comment create mode 100644 doc/special_remotes/webdav/comment_3_239367ad639c61ecdf87a89f7ac53efe._comment create mode 100644 doc/special_remotes/webdav/comment_4_ffa52f7776cdc8caa28667b5eadae123._comment create mode 100644 doc/special_remotes/webdav/comment_5_5b8cbdb5e9a1b90d748a5074997e1cd5._comment create mode 100644 doc/special_remotes/webdav/comment_6_d3be3e588c3a2abb2025ceb82c18b0ef._comment create mode 100644 doc/special_remotes/webdav/comment_7_6fa7e11331db5a943015bd5367eb3d73._comment create mode 100644 doc/special_remotes/webdav/comment_8_2627b41f80c7511b27464e2040b128a8._comment create mode 100644 doc/special_remotes/xmpp.mdwn create mode 100644 doc/special_remotes/xmpp/comment_10_c7c2e2e81cb5b2b9a5272430c835dd39._comment create mode 100644 doc/special_remotes/xmpp/comment_11_05d9a67b9331656b4035399641cedb1b._comment create mode 100644 doc/special_remotes/xmpp/comment_1_568247938929a2934e8198fca80b7184._comment create mode 100644 doc/special_remotes/xmpp/comment_2_9fc3f512020b7eb2591d6b7b2e8de2d7._comment create mode 100644 doc/special_remotes/xmpp/comment_3_48ddbba1402d89acaea07cff747c48e0._comment create mode 100644 doc/special_remotes/xmpp/comment_4_59857879abaae22bde444a215e00bf18._comment create mode 100644 doc/special_remotes/xmpp/comment_5_583ee374bd34fcc9ae26c2fd690e8c47._comment create mode 100644 doc/special_remotes/xmpp/comment_6_8f0b5bba1271d031a67e7f0c175d67d5._comment create mode 100644 doc/special_remotes/xmpp/comment_7_ac7acbded03325b015959d82ae77faf1._comment create mode 100644 doc/special_remotes/xmpp/comment_8_81a9636a1e8a36a58185468a26f8633d._comment create mode 100644 doc/special_remotes/xmpp/comment_9_eda76b826491c96b1ce072aacf9d3adf._comment create mode 100644 doc/summary.mdwn create mode 100644 doc/sync.mdwn create mode 100644 doc/sync/comment_10_2cd8ab86f498d6f676f859b552f831eb._comment create mode 100644 doc/sync/comment_1_59681be5568f568f5c54eb0445163dd2._comment create mode 100644 doc/sync/comment_2_9301ff5e81d37475f594e74fbe32f24e._comment create mode 100644 doc/sync/comment_3_49560003da47490e4fabd4ab0089f2d7._comment create mode 100644 doc/sync/comment_4_cf29326408e62575085d1f980087c923._comment create mode 100644 doc/sync/comment_5_18c396c59907147bb2bf713e55392b6b._comment create mode 100644 doc/sync/comment_6_012e9d4468d0b88ee3c5dad3911c3606._comment create mode 100644 doc/sync/comment_7_6276e100d1341f1a0be368f54de0ae7b._comment create mode 100644 doc/sync/comment_8_b89161c82c05634d35f6b65bf8360a96._comment create mode 100644 doc/sync/comment_9_849883b7cc05bfcb01914d8737098010._comment create mode 100644 doc/templates/bare.tmpl create mode 100644 doc/templates/bugtemplate.mdwn create mode 100644 doc/templates/walkthrough.tmpl create mode 100644 doc/testimonials.mdwn create mode 100644 doc/testimonials/comment_1_2bf439f7a3bc3d6fab91849017946182._comment create mode 100644 doc/thanks.mdwn create mode 100644 doc/tips.mdwn create mode 100644 doc/tips/Building_git-annex_on_Debian_OR___37____164____35____34____164____37____38____34____35___Haskell__33__.mdwn create mode 100644 doc/tips/Building_git-annex_on_Debian_OR___37____164____35____34____164____37____38____34____35___Haskell__33__/comment_1_835a3608df3e9d044cabe822d0f3e7e4._comment create mode 100644 doc/tips/Building_git-annex_on_Debian_OR___37____164____35____34____164____37____38____34____35___Haskell__33__/comment_2_080b30cba72a718e73ea715e259e1cfb._comment create mode 100644 doc/tips/Crude_Windows_Sync.mdwn create mode 100644 doc/tips/Decentralized_repository_behind_a_Firewall.mdwn create mode 100644 doc/tips/Decentralized_repository_behind_a_Firewall/comment_1_78b9035234a690ca5a7c9f3cc78fa092._comment create mode 100644 doc/tips/Delay_Assistant_Startup_on_Login.mdwn create mode 100644 doc/tips/Delay_Assistant_Startup_on_Login/comment_1_c63917150527efab4b1106183b3aa7ef._comment create mode 100644 doc/tips/Git_annex_and_Calibre.mdwn create mode 100644 doc/tips/How_to_retroactively_annex_a_file_already_in_a_git_repo.mdwn create mode 100644 doc/tips/How_to_retroactively_annex_a_file_already_in_a_git_repo/comment_1_7eaf73fb3355bd706ab18a43790b3c10._comment create mode 100644 doc/tips/How_to_retroactively_annex_a_file_already_in_a_git_repo/comment_2_dac1a171204f30d7c906e878eb6bd461._comment create mode 100644 doc/tips/How_to_retroactively_annex_a_file_already_in_a_git_repo/comment_3_b62ec0b848d2487d68d7032682622193._comment create mode 100644 doc/tips/How_to_retroactively_annex_a_file_already_in_a_git_repo/comment_4_2423904e41a86cd1c6bc155d7b733642._comment create mode 100644 doc/tips/Internet_Archive_via_S3.mdwn create mode 100644 doc/tips/Internet_Archive_via_S3/comment_1_d53a3848c20dce61867283fc03c2adaa._comment create mode 100644 doc/tips/Internet_Archive_via_S3/comment_2_91c1472da27b00e5d682d22bc1ef04e0._comment create mode 100644 doc/tips/Internet_Archive_via_S3/comment_3_e23cf781c532f80d47d52265f2b2c87e._comment create mode 100644 doc/tips/Shamir_secret_sharing_and_git-annex.mdwn create mode 100644 doc/tips/Synology_NAS_and_git_annex.mdwn create mode 100644 doc/tips/Synology_NAS_and_git_annex/comment_1_ef7e19f1fd2005eb7cc74509ffb92766._comment create mode 100644 doc/tips/The_perfect_preferred_content_settings_for_my_android_phone.mdwn create mode 100644 doc/tips/The_perfect_preferred_content_settings_for_my_android_phone/comment_1_393d1636bb313530be383a075bd3440a._comment create mode 100644 doc/tips/The_perfect_preferred_content_settings_for_my_android_phone/comment_2_51a013213118660bdc06ff4d6c8110ba._comment create mode 100644 doc/tips/Using_Git-annex_as_a_web_browsing_assistant.mdwn create mode 100644 doc/tips/Using_Git-annex_as_a_web_browsing_assistant/comment_1_74167f9fff400f148916003468c77de4._comment create mode 100644 doc/tips/assume-unstaged.mdwn create mode 100644 doc/tips/assume-unstaged/comment_1_44abd811ef79a85e557418e17a3927be._comment create mode 100644 doc/tips/assume-unstaged/comment_2_5b589f37cfc03bf7be33a51826cc4dba._comment create mode 100644 doc/tips/automatically_adding_metadata.mdwn create mode 100644 doc/tips/automatically_adding_metadata/comment_1_ffc308cc6aedabbc55820db4f401e0fb._comment create mode 100644 doc/tips/automatically_adding_metadata/comment_2_bd64a53914107bc000c887b4d4bdf6af._comment create mode 100755 doc/tips/automatically_adding_metadata/pre-commit-annex create mode 100644 doc/tips/automatically_getting_files_on_checkout.mdwn create mode 100644 doc/tips/beware_of_SSD_wear_when_doing_fsck_on_large_special_remotes.mdwn create mode 100644 doc/tips/beware_of_SSD_wear_when_doing_fsck_on_large_special_remotes/comment_1_e7c5c46112a2406b873d08bbf53c40d8._comment create mode 100644 doc/tips/beware_of_SSD_wear_when_doing_fsck_on_large_special_remotes/comment_2_daf45ce29fed986fa9aa8b173760d0b7._comment create mode 100644 doc/tips/beware_of_SSD_wear_when_doing_fsck_on_large_special_remotes/comment_3_72d222020af4a9c6c753eb1ee7e1f1cf._comment create mode 100644 doc/tips/centralised_repository:_starting_from_nothing.mdwn create mode 100644 doc/tips/centralised_repository:_starting_from_nothing/comment_1_b0d22822017646775869ce1292e676f4._comment create mode 100644 doc/tips/centralized_git_repository_tutorial.mdwn create mode 100644 doc/tips/centralized_git_repository_tutorial/comment_1_9072ebc0c61446d7b151fcfab616fea9._comment create mode 100644 doc/tips/centralized_git_repository_tutorial/comment_2_528e92b21f0551fde4adb956654953ae._comment create mode 100644 doc/tips/downloading_podcasts.mdwn create mode 100644 doc/tips/downloading_podcasts/comment_10_4d4f6c22070b58918ee8d34c5e7290ad._comment create mode 100644 doc/tips/downloading_podcasts/comment_11_d8d77048c7e2524968c188e1ad517873._comment create mode 100644 doc/tips/downloading_podcasts/comment_12_0859317471b43c88744dd3df95c879f7._comment create mode 100644 doc/tips/downloading_podcasts/comment_13_e8c3c97282d17e2a1d47fb9d5e2b2f7b._comment create mode 100644 doc/tips/downloading_podcasts/comment_14_05a3694052de36848fbbad6eeeada895._comment create mode 100644 doc/tips/downloading_podcasts/comment_15_21028bed8858c2dae1ac9c2d014fd2a1._comment create mode 100644 doc/tips/downloading_podcasts/comment_16_4869fb5c9f896acc477c44de06c36ca7._comment create mode 100644 doc/tips/downloading_podcasts/comment_17_2e278ff200c1c15efd27c46a3e0aed40._comment create mode 100644 doc/tips/downloading_podcasts/comment_18_382f2b970738d9b1af577955c3083e90._comment create mode 100644 doc/tips/downloading_podcasts/comment_19_f76fc6835e5787b0156380bf09fd81ca._comment create mode 100644 doc/tips/downloading_podcasts/comment_1_f04bc32a34baeeffcd691e9f7cce0230._comment create mode 100644 doc/tips/downloading_podcasts/comment_20_65ebf3a3bbf0a2aebd2b69640b757e16._comment create mode 100644 doc/tips/downloading_podcasts/comment_2_a9a98cad7358d16792853a2ee413fe6c._comment create mode 100644 doc/tips/downloading_podcasts/comment_3_5a8068a5cb0fd864581157a3aa5d1113._comment create mode 100644 doc/tips/downloading_podcasts/comment_4_e7072a9da30b4c4b4c526013144238d4._comment create mode 100644 doc/tips/downloading_podcasts/comment_5_79b3f8d678ac9f67df4c0cd649657283._comment create mode 100644 doc/tips/downloading_podcasts/comment_6_35106fee5458bdd5c21868fbc49d3616._comment create mode 100644 doc/tips/downloading_podcasts/comment_7_ceb16498b7aadbf04a27acd5d6561d46._comment create mode 100644 doc/tips/downloading_podcasts/comment_8_147397603f0b3fdb42ca387d1da7c5ef._comment create mode 100644 doc/tips/downloading_podcasts/comment_9_6a26a6cc7683d38fae0f23c5a52d1e23._comment create mode 100644 doc/tips/dropboxannex.mdwn create mode 100644 doc/tips/emacs_integration.mdwn create mode 100644 doc/tips/file_manager_integration.mdwn create mode 100644 doc/tips/finding_duplicate_files.mdwn create mode 100644 doc/tips/finding_duplicate_files/comment_10_2ed5aa8c632048b13e01d358883fa383._comment create mode 100644 doc/tips/finding_duplicate_files/comment_11_5efc6b6ee1dfec88512183e9679ca616._comment create mode 100644 doc/tips/finding_duplicate_files/comment_1_ddb477ca242ffeb21e0df394d8fdf5d2._comment create mode 100644 doc/tips/finding_duplicate_files/comment_2_900eafe0a781018ff44b35ac232e3ad3._comment create mode 100644 doc/tips/finding_duplicate_files/comment_3._comment create mode 100644 doc/tips/finding_duplicate_files/comment_4_1494143a74cc1e9fbe4720c14b73d42b._comment create mode 100644 doc/tips/finding_duplicate_files/comment_5_1a35ca360468bcb84a67ad8d62a2ef7d._comment create mode 100644 doc/tips/finding_duplicate_files/comment_6_a6e88c93b31f67c933523725ff61b287._comment create mode 100644 doc/tips/finding_duplicate_files/comment_7_347b0186755a809594bd42feda6363e2._comment create mode 100644 doc/tips/finding_duplicate_files/comment_8_3af51722da0980b724facb184f0f66e9._comment create mode 100644 doc/tips/finding_duplicate_files/comment_9_7b4b78a5cd253abfe4f6001049bf64f3._comment create mode 100644 doc/tips/flickrannex.mdwn create mode 100644 doc/tips/flickrannex/comment_10_50707f259abe5829ce075dfbecd5a4ba._comment create mode 100644 doc/tips/flickrannex/comment_11_ab5bcb025381b3da4d7c6dfd0c7310dd._comment create mode 100644 doc/tips/flickrannex/comment_12_90a331275d888221bc695003c8acbe46._comment create mode 100644 doc/tips/flickrannex/comment_13_1596e70dca71c853fd1d6fc9bde02b18._comment create mode 100644 doc/tips/flickrannex/comment_2_d74c4fc7edf8e47f7482564ce0ef4d12._comment create mode 100644 doc/tips/flickrannex/comment_2_f53d0d5520e2835e9705bea4e75556f0._comment create mode 100644 doc/tips/flickrannex/comment_4_9ebba4d61140f6c2071e988c9328cf7e._comment create mode 100644 doc/tips/flickrannex/comment_5_4470dae270613dd8712623474bc80ab0._comment create mode 100644 doc/tips/flickrannex/comment_5_d395cdcf815cb430e374ff05c1a63ff4._comment create mode 100644 doc/tips/flickrannex/comment_6_8cf730097001ffe106f2c743edce9d0a._comment create mode 100644 doc/tips/flickrannex/comment_7_a80c8087c4e1562a4c98a24edc182e5a._comment create mode 100644 doc/tips/flickrannex/comment_8_94f84254c32cf0f7dd1441b7da5d2bc6._comment create mode 100644 doc/tips/flickrannex/comment_9_5299b4cab4a4cb8e8fd4d2b39f0ea59c._comment create mode 100644 doc/tips/fully_encrypted_git_repositories_with_gcrypt.mdwn create mode 100644 doc/tips/fully_encrypted_git_repositories_with_gcrypt/comment_10_4440a80d64c60c7312d5c405d54e607a._comment create mode 100644 doc/tips/fully_encrypted_git_repositories_with_gcrypt/comment_11_28eb9d4ebf28ca310f9b357b1dad244a._comment create mode 100644 doc/tips/fully_encrypted_git_repositories_with_gcrypt/comment_12_b697b2ab10705b090a78e7717ec59b18._comment create mode 100644 doc/tips/fully_encrypted_git_repositories_with_gcrypt/comment_13_4e37146a870576f09f56d2e5ee784ed7._comment create mode 100644 doc/tips/fully_encrypted_git_repositories_with_gcrypt/comment_14_2044e821d841fcd37a51ae768fa88df2._comment create mode 100644 doc/tips/fully_encrypted_git_repositories_with_gcrypt/comment_1_5c54690586f2a781905ea4b25aa1147f._comment create mode 100644 doc/tips/fully_encrypted_git_repositories_with_gcrypt/comment_2_07feedb4348f8c31176cc744c19368a1._comment create mode 100644 doc/tips/fully_encrypted_git_repositories_with_gcrypt/comment_3_c2f873dffa015f1d72ad0c3921909316._comment create mode 100644 doc/tips/fully_encrypted_git_repositories_with_gcrypt/comment_4_f8a6e4415f4fe6da14f6a3b7334bc952._comment create mode 100644 doc/tips/fully_encrypted_git_repositories_with_gcrypt/comment_5_11b8e82d2a234f65b58b823e71c6d6a2._comment create mode 100644 doc/tips/fully_encrypted_git_repositories_with_gcrypt/comment_6_3e41948e1beffcf279bb05ef8e61cc07._comment create mode 100644 doc/tips/fully_encrypted_git_repositories_with_gcrypt/comment_7_4ce0b26b25b336f07b2e27246cdfba3e._comment create mode 100644 doc/tips/fully_encrypted_git_repositories_with_gcrypt/comment_8_49aa34d75d24a2066baa8a585bc9c2e9._comment create mode 100644 doc/tips/fully_encrypted_git_repositories_with_gcrypt/comment_9_3784e0c828cd60b6a9075c2d32d070cc._comment create mode 100644 doc/tips/googledriveannex.mdwn create mode 100644 doc/tips/googledriveannex/comment_1_ce7f2b04e83cc02d9dabb712f266e5cc._comment create mode 100644 doc/tips/imapannex.mdwn create mode 100644 doc/tips/megaannex.mdwn create mode 100644 doc/tips/metadata_driven_views.mdwn create mode 100644 doc/tips/metadata_driven_views/comment_1_1d6793701fd8a1a66bae04662cf853ce._comment create mode 100644 doc/tips/migrating_data_to_a_new_backend.mdwn create mode 100644 doc/tips/migrating_two_seperate_disconnected_directories_to_git_annex.mdwn create mode 100644 doc/tips/offline_archive_drives.mdwn create mode 100644 doc/tips/offline_archive_drives/comment_1_3d4fdf42191a9d81434d00f51c3609ff._comment create mode 100644 doc/tips/offline_archive_drives/comment_2_864c752aa8d064791a4b14dbbe2e6882._comment create mode 100644 doc/tips/offline_archive_drives/comment_3_7be2ccaf70c9ecfc9a34384e0e31f490._comment create mode 100644 doc/tips/owncloudannex.mdwn create mode 100644 doc/tips/owncloudannex/comment_1_129652308c3c499462828dcaf8e747a4._comment create mode 100644 doc/tips/owncloudannex/comment_2_38604990368666f654d41891ba99ac61._comment create mode 100644 doc/tips/owncloudannex/comment_3_1bfd290d00d6536da7d31818db46f8ec._comment create mode 100644 doc/tips/owncloudannex/comment_4_492b6922a7c5bb5464fedb46b0c5303b._comment create mode 100644 doc/tips/owncloudannex/comment_5_1d48ac08714fadcb06d874570d745bd8._comment create mode 100644 doc/tips/owncloudannex/comment_6_65959f49a2f56bffd6fe48670c0c8d5a._comment create mode 100644 doc/tips/owncloudannex/comment_7_7482002991672ef67836bae43b8d0be8._comment create mode 100644 doc/tips/powerful_file_matching.mdwn create mode 100644 doc/tips/recover_data_from_lost+found.mdwn create mode 100644 doc/tips/recover_data_from_lost+found/comment_1_f0901527a4f0faf0b1fd916d5b809314._comment create mode 100644 doc/tips/recover_data_from_lost+found/comment_2_ac405575058beeac992d07c55f7c53a8._comment create mode 100644 doc/tips/recovering_from_a_corrupt_git_repository.mdwn create mode 100644 doc/tips/recovering_from_a_corrupt_git_repository/comment_1_f5827be97f78dbae113a5ba0c9ced896._comment create mode 100644 doc/tips/recovering_from_a_corrupt_git_repository/comment_2_e98df7275bb032308bb87e3607bdde32._comment create mode 100644 doc/tips/recovering_from_a_corrupt_git_repository/comment_3_11bece6dfac090edbcd783b266c482a3._comment create mode 100644 doc/tips/recovering_from_a_corrupt_git_repository/comment_4_86e99017f7585ac2f76753051214637e._comment create mode 100644 doc/tips/recovering_from_a_corrupt_git_repository/comment_6_c8953732ce353cdf0c4fb81ddc98c04a._comment create mode 100644 doc/tips/recovering_from_a_corrupt_git_repository/comment_6_d0da84df0241dc6ccf0aa0c7598917df._comment create mode 100644 doc/tips/recovering_from_a_corrupt_git_repository/comment_7_addf49556e4c33d55a41c393f519d0a4._comment create mode 100644 doc/tips/recovering_from_a_corrupt_git_repository/comment_8_505a2fc2b841fe8eb419801f923ef35f._comment create mode 100644 doc/tips/remote_webapp_setup.mdwn create mode 100644 doc/tips/replacing_Sparkleshare_or_dvcs-autosync_with_the_assistant.mdwn create mode 100644 doc/tips/replacing_Sparkleshare_or_dvcs-autosync_with_the_assistant/comment_10_d1bd5d6b33951f6d11185bb4a8228269._comment create mode 100644 doc/tips/replacing_Sparkleshare_or_dvcs-autosync_with_the_assistant/comment_11_54692ebf854ecbcc5314bb29c33ecc66._comment create mode 100644 doc/tips/replacing_Sparkleshare_or_dvcs-autosync_with_the_assistant/comment_1_907e4032ca4a39adb846cf16dbf447dc._comment create mode 100644 doc/tips/replacing_Sparkleshare_or_dvcs-autosync_with_the_assistant/comment_2_902d001ba86657ef0f8cca5b175f99ca._comment create mode 100644 doc/tips/replacing_Sparkleshare_or_dvcs-autosync_with_the_assistant/comment_3_a1cf93f9b29658f0f26e9e0ae6057ee3._comment create mode 100644 doc/tips/replacing_Sparkleshare_or_dvcs-autosync_with_the_assistant/comment_4_e10671908b58c554375787d0f76e2366._comment create mode 100644 doc/tips/replacing_Sparkleshare_or_dvcs-autosync_with_the_assistant/comment_5_4114380f66b6376c851e93f6876d590b._comment create mode 100644 doc/tips/replacing_Sparkleshare_or_dvcs-autosync_with_the_assistant/comment_6_6a5d6af107b297afd008b021f73d787b._comment create mode 100644 doc/tips/replacing_Sparkleshare_or_dvcs-autosync_with_the_assistant/comment_7_74d57cf503a86d8f7ace2d769dbb58be._comment create mode 100644 doc/tips/replacing_Sparkleshare_or_dvcs-autosync_with_the_assistant/comment_8_85765c0cfeb5b326c06cf60c98147cbf._comment create mode 100644 doc/tips/replacing_Sparkleshare_or_dvcs-autosync_with_the_assistant/comment_9_082b5d90ffc836e7c86e40b63a75780d._comment create mode 100644 doc/tips/setup_a_public_repository_on_a_web_site.mdwn create mode 100644 doc/tips/setup_a_public_repository_on_a_web_site/comment_1_1d0fa6da33e401df1d7ff31979247fec._comment create mode 100644 doc/tips/setup_a_public_repository_on_a_web_site/comment_2_b98b761dee9d923153e3c288c1d987ee._comment create mode 100644 doc/tips/setup_a_public_repository_on_a_web_site/comment_3_a6698218f15c598c9b32e0af850133bf._comment create mode 100644 doc/tips/shared_git_annex_directory_between_multiple_users.mdwn create mode 100644 doc/tips/skydriveannex.mdwn create mode 100644 doc/tips/untrusted_repositories.mdwn create mode 100644 doc/tips/using_Amazon_Glacier.mdwn create mode 100644 doc/tips/using_Amazon_Glacier/comment_1_ccee7f4f5a483a3650270b6e09ab7293._comment create mode 100644 doc/tips/using_Amazon_Glacier/comment_2_d34e05f9244d3a4fcec87b3c360adb4e._comment create mode 100644 doc/tips/using_Amazon_Glacier/comment_3_4c504fd22775afe36296cf54d3e04a8e._comment create mode 100644 doc/tips/using_Amazon_Glacier/comment_4_e6ac76b0c20285f4f96b3d0975e8ac66._comment create mode 100644 doc/tips/using_Amazon_Glacier/comment_5_7788890f58f714b0cdf1462c718ea536._comment create mode 100644 doc/tips/using_Amazon_Glacier/comment_6_0fbe528a57552622e8128196ad80c863._comment create mode 100644 doc/tips/using_Amazon_S3.mdwn create mode 100644 doc/tips/using_Amazon_S3/comment_1_666a26f95024760c99c627eed37b1966._comment create mode 100644 doc/tips/using_Amazon_S3/comment_2_f5a0883be7dbb421b584c6dc0165f1ef._comment create mode 100644 doc/tips/using_Google_Cloud_Storage.mdwn create mode 100644 doc/tips/using_Google_Cloud_Storage/comment_1_c576182f39563ae68767391c4227a177._comment create mode 100644 doc/tips/using_box.com_as_a_special_remote.mdwn create mode 100644 doc/tips/using_box.com_as_a_special_remote/comment_1_be39f063e8a6155cc2eb71829e884a63._comment create mode 100644 doc/tips/using_git_annex_with_no_fixed_hostname_and_optimising_ssh.mdwn create mode 100644 doc/tips/using_git_annex_with_no_fixed_hostname_and_optimising_ssh/comment_1_c0b7682a2b6f3078457b85683c825baf._comment create mode 100644 doc/tips/using_gitolite_with_git-annex.mdwn create mode 100644 doc/tips/using_gitolite_with_git-annex/comment_10_8767bc8014b459a3cd76f275fd4fa8d6._comment create mode 100644 doc/tips/using_gitolite_with_git-annex/comment_11_00715e0b47f09130e0e536e29f7b9258._comment create mode 100644 doc/tips/using_gitolite_with_git-annex/comment_12_7027ce60265b8f24c8ab54553e544068._comment create mode 100644 doc/tips/using_gitolite_with_git-annex/comment_13_75218b7409c0e281cb01c9b2791e8cdf._comment create mode 100644 doc/tips/using_gitolite_with_git-annex/comment_14_7d4d4515218d1259d32be3baeb5ee56e._comment create mode 100644 doc/tips/using_gitolite_with_git-annex/comment_15_dc6f21b5a3d5931c8d949a9753411b9e._comment create mode 100644 doc/tips/using_gitolite_with_git-annex/comment_16_8e5039e6655fc80dc863b6cdf44ef02a._comment create mode 100644 doc/tips/using_gitolite_with_git-annex/comment_17_9c40e1da8bb44f7207e802377f5cf923._comment create mode 100644 doc/tips/using_gitolite_with_git-annex/comment_18_f1a180d5cf65b7a870a13ddb4f76d00d._comment create mode 100644 doc/tips/using_gitolite_with_git-annex/comment_19_33c19097b6f2b48dfe09ec4c8d952d06._comment create mode 100644 doc/tips/using_gitolite_with_git-annex/comment_1_9a2a2a8eac9af97e0c984ad105763a73._comment create mode 100644 doc/tips/using_gitolite_with_git-annex/comment_20_c82af00db3dd74ee9bfe12668e76e57b._comment create mode 100644 doc/tips/using_gitolite_with_git-annex/comment_2_d8efea4ab9576555fadbb47666ecefa9._comment create mode 100644 doc/tips/using_gitolite_with_git-annex/comment_3_807035f38509ccb9f93f1929ecd37417._comment create mode 100644 doc/tips/using_gitolite_with_git-annex/comment_4_eb81f824aadc97f098379c5f7e4fba4c._comment create mode 100644 doc/tips/using_gitolite_with_git-annex/comment_5_f688309532d2993630e9e72e87fb9c46._comment create mode 100644 doc/tips/using_gitolite_with_git-annex/comment_6_3e203e010a4df5bf03899f867718adc5._comment create mode 100644 doc/tips/using_gitolite_with_git-annex/comment_7_f8fd08b6ab47378ad88c87348057220d._comment create mode 100644 doc/tips/using_gitolite_with_git-annex/comment_8_8249772c142117f88e37975d058aa936._comment create mode 100644 doc/tips/using_gitolite_with_git-annex/comment_9_28418635a6ed7231b89e02211cd3c236._comment create mode 100644 doc/tips/using_the_SHA1_backend.mdwn create mode 100644 doc/tips/using_the_web_as_a_special_remote.mdwn create mode 100644 doc/tips/using_the_web_as_a_special_remote/comment_1_321a41d611c6fe45e047af9c96c5176c._comment create mode 100644 doc/tips/using_the_web_as_a_special_remote/comment_2_dfe9c8c49aadff80d2020288584e0390._comment create mode 100644 doc/tips/using_the_web_as_a_special_remote/comment_3_ed8dd3bbd9b9ae7f2309b72b94f61eb1._comment create mode 100644 doc/tips/using_the_web_as_a_special_remote/comment_4_c1133a524989a940f1b5db588707157a._comment create mode 100644 doc/tips/visualizing_repositories_with_gource.mdwn create mode 100644 doc/tips/visualizing_repositories_with_gource/comment_1_01c5cd21375990c612b8f291904ddb3e._comment create mode 100644 doc/tips/visualizing_repositories_with_gource/screenshot.jpg create mode 100644 doc/tips/what_to_do_when_a_repository_is_corrupted.mdwn create mode 100644 doc/tips/what_to_do_when_you_lose_a_repository.mdwn create mode 100644 doc/tips/what_to_do_when_you_lose_a_repository/comment_1_cf19b8dc304dc37c26717174c4a98aa4._comment create mode 100644 doc/tips/what_to_do_when_you_lose_a_repository/comment_3_fa9ca81668f5faebf2f61b10f82c97d2._comment create mode 100644 doc/tips/what_to_do_when_you_lose_a_repository/comment_3_fdcfca8707e310ca7bb94d359adf8607._comment create mode 100644 doc/tips/what_to_do_when_you_lose_a_repository/comment_4_679eb9be0bfb9d48a2b96383c4816f62._comment create mode 100644 doc/tips/what_to_do_when_you_lose_a_repository/comment_5_4fb04b70d88ec93ff9ed4f884747d5d4._comment create mode 100644 doc/tips/what_to_do_when_you_lose_a_repository/comment_6_05db504cbff2ec2a6346bf43e57a3c25._comment create mode 100644 doc/tips/what_to_do_when_you_lose_a_repository/comment_7_4e6baa41bfee6edf2b17d4ade2909c7b._comment create mode 100644 doc/tips/yet_another_simple_disk_usage_like_utility.mdwn create mode 100644 doc/tips/yet_another_simple_disk_usage_like_utility/comment_1_41b212bde8bc88d2a5dea93bd0dc75f1._comment create mode 100644 doc/tips/yet_another_simple_disk_usage_like_utility/comment_2_73698913837bfd5a58cf15721211e43e._comment create mode 100644 doc/todo.mdwn create mode 100644 doc/todo/A_really_simple_way_to_pair_devices_like_bittorent_sync.mdwn create mode 100644 doc/todo/A_really_simple_way_to_pair_devices_like_bittorent_sync/comment_1_d828bc374e50a49101c0b863f9b33080._comment create mode 100644 doc/todo/A_really_simple_way_to_pair_devices_like_bittorent_sync/comment_2_a4badfc248be428e6426a936212cc896._comment create mode 100644 doc/todo/A_really_simple_way_to_pair_devices_like_bittorent_sync/comment_3_0b04089d3d33fdb48eeb46bf168e9a3c._comment create mode 100644 doc/todo/A_really_simple_way_to_pair_devices_like_bittorent_sync/comment_4_2bcab1b7998b4df08fca41b8d810f115._comment create mode 100644 doc/todo/A_really_simple_way_to_pair_devices_like_bittorent_sync/comment_5_677e958c3f2effec7528b484aeb6478d._comment create mode 100644 doc/todo/A_really_simple_way_to_pair_devices_like_bittorent_sync/comment_6_56e53803fdede895cba717e6b6e9a1bb._comment create mode 100644 doc/todo/Android:_add_a___34__Share_via__34___shortcut___34__Add_to_Annex__34__.mdwn create mode 100644 doc/todo/Bittorrent-like_features.mdwn create mode 100644 doc/todo/Bittorrent-like_features/comment_1_f4c110ef35ebf4fd89f06edf2c4f0c48._comment create mode 100644 doc/todo/Bittorrent-like_features/comment_2_83148bd5c5c5e6c2eff3ad6e1d4fb82c._comment create mode 100644 doc/todo/Bittorrent-like_features/comment_3_84f149b30de1562593623aa23dc0396c._comment create mode 100644 doc/todo/Bittorrent-like_features/comment_4_7c54c83e582c0d4848aaf3d70e312707._comment create mode 100644 doc/todo/Bittorrent-like_features/comment_5_194dd0e8404ea72af9fb6ff34b994998._comment create mode 100644 doc/todo/Build_for_Synology_DSM.mdwn create mode 100644 doc/todo/Build_for_Synology_DSM/comment_10_e351084d9a83db3fd6d9d983227a6410._comment create mode 100644 doc/todo/Build_for_Synology_DSM/comment_11_cc67a584f5c460a6fb63cf099c20e573._comment create mode 100644 doc/todo/Build_for_Synology_DSM/comment_12_94023593d294b9cf69090fcfd6ca0e5a._comment create mode 100644 doc/todo/Build_for_Synology_DSM/comment_13_314255fd503d125b5aeae2f62acfd592._comment create mode 100644 doc/todo/Build_for_Synology_DSM/comment_15_9525cd0d75ff4c15182d10a855774b69._comment create mode 100644 doc/todo/Build_for_Synology_DSM/comment_15_c12f525ef4cbe42cdf20fec0d53c8d86._comment create mode 100644 doc/todo/Build_for_Synology_DSM/comment_1_4059016fa8da6af7a3eba8966821e8eb._comment create mode 100644 doc/todo/Build_for_Synology_DSM/comment_2_8900c2985ab68b3b566c9f5d326471d6._comment create mode 100644 doc/todo/Build_for_Synology_DSM/comment_3_f2b77368473d42b7f21e9d51d6415b58._comment create mode 100644 doc/todo/Build_for_Synology_DSM/comment_4_a55fea734044c270ceb10adf9c8d9a76._comment create mode 100644 doc/todo/Build_for_Synology_DSM/comment_5_59865ada057c640ac29855c65cf45dd9._comment create mode 100644 doc/todo/Build_for_Synology_DSM/comment_6_6d860b1ad8816077b5fa596a71b12d5c._comment create mode 100644 doc/todo/Build_for_Synology_DSM/comment_7_19ef2d293ba3bc7ece443d7278371c3f._comment create mode 100644 doc/todo/Build_for_Synology_DSM/comment_8_609b7ad87dfbba49ec1f8c6fc2739ccd._comment create mode 100644 doc/todo/Build_for_Synology_DSM/comment_9_d94a73b9a07c5cadf191005f817fd59a._comment create mode 100644 doc/todo/Check_if_an_upgrade_is_available_in_the_webapp.mdwn create mode 100644 doc/todo/Check_if_an_upgrade_is_available_in_the_webapp/comment_1_c904182f6bff8b1a42070bbc038eb34e._comment create mode 100644 doc/todo/Check_if_an_upgrade_is_available_in_the_webapp/comment_2_ebe7a75ca291e7f749bfe9f46d10909d._comment create mode 100644 doc/todo/Deleting_Unused_Files_by_Age.mdwn create mode 100644 doc/todo/Enhancement:_git_annex_whereis_KEY.mdwn create mode 100644 doc/todo/Feature_Request:_Sync_Now_Button_in_Webapp.mdwn create mode 100644 doc/todo/Feature_Request:_Sync_Now_Button_in_Webapp/comment_1_0d5c90eb0e8fe61b82a19c5fea343613._comment create mode 100644 doc/todo/Feature_Request:_Sync_Now_Button_in_Webapp/comment_2_196552002d70390e8b52b4af61dca903._comment create mode 100644 doc/todo/Improve_direct_mode_using_copy_on_write.mdwn create mode 100644 doc/todo/Limit_file_revision_history.mdwn create mode 100644 doc/todo/Move_ssh_config_to___126____47__ssh__47__git-annex__47__config.mdwn create mode 100644 doc/todo/Move_ssh_config_to___126____47__ssh__47__git-annex__47__config/comment_1_284c806e83a32af81b02aea7c7bc285a._comment create mode 100644 doc/todo/Move_ssh_config_to___126____47__ssh__47__git-annex__47__config/comment_2_1f55ad6b39906458779b2d604b003ffe._comment create mode 100644 doc/todo/Move_ssh_config_to___126____47__ssh__47__git-annex__47__config/comment_3_b00dce2374aac6968317d05d23bcfaf7._comment create mode 100644 doc/todo/Move_ssh_config_to___126____47__ssh__47__git-annex__47__config/comment_4_743d0b077110c5cac1e2f47187b75333._comment create mode 100644 doc/todo/New_special_remote_suggeston_-_clean_directory.mdwn create mode 100644 doc/todo/New_special_remote_suggeston_-_clean_directory/comment_10_4829c2a2302b4b9611deddfedfbaa944._comment create mode 100644 doc/todo/New_special_remote_suggeston_-_clean_directory/comment_1_4d81941fe53881eebff97109a07ba2f4._comment create mode 100644 doc/todo/New_special_remote_suggeston_-_clean_directory/comment_2_660a5b764ad42468154b2bb94f8ec004._comment create mode 100644 doc/todo/New_special_remote_suggeston_-_clean_directory/comment_3_eed178ce4bc4d2b3f08a1e3d3d62c086._comment create mode 100644 doc/todo/New_special_remote_suggeston_-_clean_directory/comment_4_1dae745cff1c0a38232d033dcc542ac4._comment create mode 100644 doc/todo/New_special_remote_suggeston_-_clean_directory/comment_5_8d6c791e5e2daec7b25828f6884a67c6._comment create mode 100644 doc/todo/New_special_remote_suggeston_-_clean_directory/comment_6_92ef2d4a7ed47000fda02732b4794dc0._comment create mode 100644 doc/todo/New_special_remote_suggeston_-_clean_directory/comment_7_78fb5cdd61220ffcf0ae1eaf266985ec._comment create mode 100644 doc/todo/New_special_remote_suggeston_-_clean_directory/comment_8_21712dfee4f37232c34eddbce2427691._comment create mode 100644 doc/todo/New_special_remote_suggeston_-_clean_directory/comment_9_0ba57952532d5ef1f2bbfb163faa3b2f._comment create mode 100644 doc/todo/Not_working_on_Android-x86.mdwn create mode 100644 doc/todo/Not_working_on_Android-x86/comment_1_5eec4d7530c9df68f1bd1b1ca7021ef5._comment create mode 100644 doc/todo/Not_working_on_Android-x86/comment_2_e5c4c99cb0675ad69bf8d7796be23c8e._comment create mode 100644 doc/todo/Option_for_browser_to_launch_webapp_with.mdwn create mode 100644 doc/todo/Please_abort_build_if___34__make_test__34___fails.mdwn create mode 100644 doc/todo/Please_add_support_for_monad-control_0.3.x.mdwn create mode 100644 doc/todo/Provide_a___34__git_annex_satisfy__95__num__95__copies__34___command.mdwn create mode 100644 doc/todo/S3.mdwn create mode 100644 doc/todo/Show_repo_type_in_repo_list.mdwn create mode 100644 doc/todo/Show_repo_type_in_repo_list/comment_1_ac6eb1072ef902a094b79dd8e0917c4d._comment create mode 100644 doc/todo/Show_repo_type_in_repo_list/comment_2_6979c487f707a724a048d20e2e5744e6._comment create mode 100644 doc/todo/Show_repo_type_in_repo_list/comment_3_529254a6cc20de7259d60a3cbc5ccaf7._comment create mode 100644 doc/todo/Slow_transfer_for_a_lot_of_small_files..mdwn create mode 100644 doc/todo/Sync_repo_names__63__.mdwn create mode 100644 doc/todo/Use_MediaScannerConnection_on_Android.mdwn create mode 100644 doc/todo/Use_a_remote_as_a_sharing_site_for_files_with_obfuscated_URLs.mdwn create mode 100644 doc/todo/Use_a_remote_as_a_sharing_site_for_files_with_obfuscated_URLs/comment_1_1a1f34f4f389267d67e79409c0ca8b1d._comment create mode 100644 doc/todo/Use_bitcoin-mining_ASICs_for_hashing__63__.mdwn create mode 100644 doc/todo/Use_bitcoin-mining_ASICs_for_hashing__63__/comment_1_a93805a8088402c6dc32d2b9785fcc7d._comment create mode 100644 doc/todo/Views_Demo.mdwn create mode 100644 doc/todo/Views_Demo/comment_1_d7c83a0e9a83e4a05aa74a34a7e1cf19._comment create mode 100644 doc/todo/Wishlist:_Import_youtube_playlists.mdwn create mode 100644 doc/todo/Wishlist:_Import_youtube_playlists/comment_1_4235cbbb0c6f9d83524c970c4588cb2e._comment create mode 100644 doc/todo/Wishlist:_additional_environment_variables_for_hooks.mdwn create mode 100644 doc/todo/Wishlist:_additional_environment_variables_for_hooks/comment_1_d82cbbb478a81a651fbe6cb8b71c1192._comment create mode 100644 doc/todo/Wishlist:_sanitychecker_fix_wrong_UUID__47__duplicate_remote.mdwn create mode 100644 doc/todo/__96__git_annex_import_--lazy__96___--_Delete_everything_that__39__s_in_the_source_directory_and_also_in_the_target_annex.mdwn create mode 100644 doc/todo/__96__git_annex_import_--lazy__96___--_Delete_everything_that__39__s_in_the_source_directory_and_also_in_the_target_annex/comment_1_0cc16eb17151309113cec6d1cccf203d._comment create mode 100644 doc/todo/__96__git_annex_status__47__version__96___should_print_the_local_OS.mdwn create mode 100644 doc/todo/__96__git_annex_sync_--auto__96___or___96__git_annex_auto__96___--_synchronize_symlinks__44___tracking_info__44___and_actual_data.mdwn create mode 100644 doc/todo/add_--exclude_option_to_git_annex_find.mdwn create mode 100644 doc/todo/add_-all_option.mdwn create mode 100644 doc/todo/add_a_--branch_to_applicable_git-annex_commands.mdwn create mode 100644 doc/todo/add_a_--branch_to_applicable_git-annex_commands/comment_1_3e0a1d1c41f317514dfc496f2274ad1c._comment create mode 100644 doc/todo/add_a_git_backend.mdwn create mode 100644 doc/todo/add_an_icon_for_the_.desktop_file.mdwn create mode 100644 doc/todo/add_metadata_to_annexed_files.mdwn create mode 100644 doc/todo/add_metadata_to_annexed_files/comment_1_38af9b352020194e9ace34d7dde188cf._comment create mode 100644 doc/todo/assistant_cannot_set_up_remote_repo_via_an_ssh_alias_or_an_ip_address.mdwn create mode 100644 doc/todo/assistant_git_sync_laddering.mdwn create mode 100644 doc/todo/assistant_parallel_file_transfers.mdwn create mode 100644 doc/todo/assistant_smarter_archive_directory_handling.mdwn create mode 100644 doc/todo/assistant_threaded_runtime.mdwn create mode 100644 doc/todo/auto_remotes.mdwn create mode 100644 doc/todo/auto_remotes/discussion.mdwn create mode 100644 doc/todo/automatic_bookkeeping_watch_command.mdwn create mode 100644 doc/todo/automatic_merge_of_synced_branches_upon___34__git_annex_sync__34__.mdwn create mode 100644 doc/todo/avoid_unnecessary_union_merges.mdwn create mode 100644 doc/todo/backendSHA1.mdwn create mode 100644 doc/todo/branching.mdwn create mode 100644 doc/todo/cache_key_info.mdwn create mode 100644 doc/todo/cache_key_info/comment_1_578df1b3b2cbfdc4aa1805378f35dc48._comment create mode 100644 doc/todo/checkout.mdwn create mode 100644 doc/todo/checksum_verification_on_transfer.mdwn create mode 100644 doc/todo/checksum_verification_on_transfer/comment_1_30f77e631608b9751f9032f97d58cc30._comment create mode 100644 doc/todo/clear_file_names_in_special_remotes.mdwn create mode 100644 doc/todo/clear_file_names_in_special_remotes/comment_1_630f17c9a7ce9a77d5d5867a6e0c799b._comment create mode 100644 doc/todo/clear_file_names_in_special_remotes/comment_2_823c279683ac3f39c921be3fcbf6bfe2._comment create mode 100644 doc/todo/clear_file_names_in_special_remotes/comment_3_4704e465025b543e47c18d565abd2747._comment create mode 100644 doc/todo/commit_in_direct_mode.mdwn create mode 100644 doc/todo/ctrl_c_handling.mdwn create mode 100644 doc/todo/ctrl_c_handling/comment_1_3addbe33817db5de836c014287b14c07._comment create mode 100644 doc/todo/ctrl_c_handling/comment_2_cc2776dc4805421180edcdf96a89fcaa._comment create mode 100644 doc/todo/ctrl_c_handling/comment_3_8d7d357368987f5d5d59b4d8d99a0e06._comment create mode 100644 doc/todo/custom_f-droid_repo.mdwn create mode 100644 doc/todo/custom_f-droid_repo/comment_1_d2bdc001584d4b5f925390910ec1ef73._comment create mode 100644 doc/todo/custom_f-droid_repo/comment_2_20eebe13b76d5279a3d09b346b65ff6e._comment create mode 100644 doc/todo/custom_f-droid_repo/comment_3_5a79abb8b1dd12426e111e733fa6493b._comment create mode 100644 doc/todo/direct_mode_guard.mdwn create mode 100644 doc/todo/direct_mode_guard/comment_1_431b6e1577bbd30b07dce9002a8fe1a2._comment create mode 100644 doc/todo/direct_mode_guard/comment_2_85bdb9dc601b87bd7c77150d7b0a5cde._comment create mode 100644 doc/todo/done.mdwn create mode 100644 doc/todo/dont_append_:5222_to_jabber_hosts__44___if_a_different_port_has_been_specified_already.mdwn create mode 100644 doc/todo/dumb_plaindir_remote___40__e.g._for_NAS_mounts__41__.mdwn create mode 100644 doc/todo/dumb_plaindir_remote___40__e.g._for_NAS_mounts__41__/comment_1_5ed9a2336b432b842c1805add6d96509._comment create mode 100644 doc/todo/dumb_plaindir_remote___40__e.g._for_NAS_mounts__41__/comment_2_e6ba58c5c31ba23a4575f1189689946f._comment create mode 100644 doc/todo/dumb_plaindir_remote___40__e.g._for_NAS_mounts__41__/comment_3_e53cbc5765819de2d3c742e6cd4d77cd._comment create mode 100644 doc/todo/exclude_files_on_a_given_remote.mdwn create mode 100644 doc/todo/faster_gnupg_cipher.mdwn create mode 100644 doc/todo/faster_gnupg_cipher/comment_1_8f61f7c724a8224e61c015be68f43db7._comment create mode 100644 doc/todo/faster_gnupg_cipher/comment_2_36e1f227a320527653500b445f7c001c._comment create mode 100644 doc/todo/faster_gnupg_cipher/comment_3_bd0c975494333dfe558de048d888ace8._comment create mode 100644 doc/todo/faster_rsync_remotes.mdwn create mode 100644 doc/todo/faster_rsync_remotes/comment_1_0bc3ee0ae563357675eeccf42461e59a._comment create mode 100644 doc/todo/faster_rsync_remotes/comment_2_ccf6f75450c89ca498c8130054f8d32d._comment create mode 100644 doc/todo/faster_rsync_remotes/comment_3_2f6a9d23cb8351fbf0f60ed93752e76e._comment create mode 100644 doc/todo/faster_rsync_remotes/comment_4_3a2f45defebae3dde336ee5f40c26d7e._comment create mode 100644 doc/todo/file_copy_progress_bar.mdwn create mode 100644 doc/todo/free_space_checking_for_local_special_remotes.mdwn create mode 100644 doc/todo/free_space_checking_for_local_special_remotes/comment_1_47c254cec58cbbb3ea84c93ef8282f01._comment create mode 100644 doc/todo/fsck.mdwn create mode 100644 doc/todo/fsck_special_remotes.mdwn create mode 100644 doc/todo/git-annex-shell.mdwn create mode 100644 doc/todo/git-annex_unused_eats_memory.mdwn create mode 100644 doc/todo/git_annex_get___60__file__62___should_verify_file_hash.mdwn create mode 100644 doc/todo/git_annex_get___60__file__62___should_verify_file_hash/comment_1_650e01a04104120ef1db4ff16fedc4f1._comment create mode 100644 doc/todo/git_annex_init_:_include_repo_description_and__47__or_UUID_in_commit_message.mdwn create mode 100644 doc/todo/gitolite_and_gitosis_support.mdwn create mode 100644 doc/todo/gitrm.mdwn create mode 100644 doc/todo/hidden_files.mdwn create mode 100644 doc/todo/http_git_annex_404_retry.mdwn create mode 100644 doc/todo/http_headers.mdwn create mode 100644 doc/todo/immutable_annexed_files.mdwn create mode 100644 doc/todo/importfeed:_allow___36____123__itemdate__125___with_--template.mdwn create mode 100644 doc/todo/importfeed:_allow___36____123__itemdate__125___with_--template/comment_1_62752c760fc12eca0c34d67d58753d00._comment create mode 100644 doc/todo/importfeed:_allow___36____123__itemdate__125___with_--template/comment_2_21672360060f48bc2eacfa535ff4c94d._comment create mode 100644 doc/todo/incremental_fsck.mdwn create mode 100644 doc/todo/incremental_fsck/comment_1_609b21141dd5686b2c0eaef2b8d63229._comment create mode 100644 doc/todo/keep_annexed_files_for_a_while.mdwn create mode 100644 doc/todo/link_file_to_remote_repo_feature.mdwn create mode 100644 doc/todo/makefile:_respect___36__PREFIX.mdwn create mode 100644 doc/todo/mdwn2man:_make_backticks_bold.mdwn create mode 100644 doc/todo/network_remotes.mdwn create mode 100644 doc/todo/nicer_whereis_output.mdwn create mode 100644 doc/todo/object_dir_reorg_v2.mdwn create mode 100644 doc/todo/object_dir_reorg_v2/comment_1_ba03333dc76ff49eccaba375e68cb525._comment create mode 100644 doc/todo/object_dir_reorg_v2/comment_2_81276ac309959dc741bc90101c213ab7._comment create mode 100644 doc/todo/object_dir_reorg_v2/comment_3_79bdf9c51dec9f52372ce95b53233bb2._comment create mode 100644 doc/todo/object_dir_reorg_v2/comment_4_93aada9b1680fed56cc6f0f7c3aca5e5._comment create mode 100644 doc/todo/object_dir_reorg_v2/comment_5_821c382987f105da72a50e0a5ce61fdc._comment create mode 100644 doc/todo/object_dir_reorg_v2/comment_6_8834c3a3f1258c4349d23aff8549bf35._comment create mode 100644 doc/todo/object_dir_reorg_v2/comment_7_42501404c82ca07147e2cce0cff59474._comment create mode 100644 doc/todo/openwrt_package.mdwn create mode 100644 doc/todo/openwrt_package/comment_1_100d76109e04bc43979775d71b4152ac._comment create mode 100644 doc/todo/openwrt_package/comment_2_2cb7dd4c0cc4413a4588b13cf7700de2._comment create mode 100644 doc/todo/openwrt_package/comment_3_5ba8a325a683ff543d81a366c873070d._comment create mode 100644 doc/todo/optimise_git-annex_merge.mdwn create mode 100644 doc/todo/optinally_transfer_file_unencryptedly.mdwn create mode 100644 doc/todo/optinally_transfer_file_unencryptedly/comment_1_4be47e7ac85d0f4e7029a96b615545a7._comment create mode 100644 doc/todo/parallel_possibilities.mdwn create mode 100644 doc/todo/parallel_possibilities/comment_1_d8e34fc2bc4e5cf761574608f970d496._comment create mode 100644 doc/todo/parallel_possibilities/comment_2_adb76f06a7997abe4559d3169a3181c3._comment create mode 100644 doc/todo/parallel_possibilities/comment_3_145fb974f45da99b7d4b117a3699cccf._comment create mode 100644 doc/todo/preferred_content_numcopies_check.mdwn create mode 100644 doc/todo/pushpull.mdwn create mode 100644 doc/todo/quvi_0.9_support.mdwn create mode 100644 doc/todo/redundancy_stats_in_status.mdwn create mode 100644 doc/todo/redundancy_stats_in_status/comment_1_9f1c10f8cea4fa60a99cbcc8306dd5de._comment create mode 100644 doc/todo/redundancy_stats_in_status/comment_2_686ced0684d10511caf07953c64cd5b6._comment create mode 100644 doc/todo/required_content.mdwn create mode 100644 doc/todo/required_content/comment_1_42620a3c958666be2a0d5f5b8eadf7b4._comment create mode 100644 doc/todo/required_content/comment_2_132ec6378db63af6281569cf5748b9d3._comment create mode 100644 doc/todo/resuming_encrypted_uploads.mdwn create mode 100644 doc/todo/resuming_encrypted_uploads/comment_1_1832a6fb78e8ad7c838582f46731ac3b._comment create mode 100644 doc/todo/resuming_encrypted_uploads/comment_2_2ecc8e782f49e90ed1549e9179eb1a1e._comment create mode 100644 doc/todo/rsync.mdwn create mode 100644 doc/todo/separate_rsync_bwlimit_options_for_upload_and_download.mdwn create mode 100644 doc/todo/smudge.mdwn create mode 100644 doc/todo/smudge/comment_1_4ea616bcdbc9e9a6fae9f2e2795c31c9._comment create mode 100644 doc/todo/smudge/comment_2_e04b32caa0d2b4c577cdaf382a3ff7f6._comment create mode 100644 doc/todo/smudge/comment_3_4e7c25fe24a1e71f58a8354fa64f41c2._comment create mode 100644 doc/todo/special_remote_for_amazon_glacier.mdwn create mode 100644 doc/todo/special_remote_for_amazon_glacier/comment_1_68f129441eefcbfebf7a9db680f52759._comment create mode 100644 doc/todo/special_remote_for_amazon_glacier/comment_2_c5eeaf8ceee414fa0379831ca52e290c._comment create mode 100644 doc/todo/speed_up_fsck.mdwn create mode 100644 doc/todo/stream_feature__63__.mdwn create mode 100644 doc/todo/support-non-utf8-locales.mdwn create mode 100644 doc/todo/support_S3_multipart_uploads.mdwn create mode 100644 doc/todo/support_for_lossy_remotes.mdwn create mode 100644 doc/todo/support_for_lossy_remotes/comment_1_f5cd9f9deab13ab2d2290ad763906dd3._comment create mode 100644 doc/todo/support_for_writing_external_special_remotes.mdwn create mode 100644 doc/todo/support_fsck_in_bare_repos.mdwn create mode 100644 doc/todo/symlink_farming_commit_hook.mdwn create mode 100644 doc/todo/symlink_git-annex_binaries_to___126____47__.local__47__bin_for_prebuilt_package.mdwn create mode 100644 doc/todo/sync_my_local_git-annex_from_a_dump_remote.mdwn create mode 100644 doc/todo/sync_my_local_git-annex_from_a_dump_remote/comment_1_81d63854f89f00855cda5ace0fc8262a._comment create mode 100644 doc/todo/sync_my_local_git-annex_from_a_dump_remote/comment_2_66822b72b1450e79e8edd0c6c21d5aa6._comment create mode 100644 doc/todo/sync_my_local_git-annex_from_a_dump_remote/comment_3_b9f73375e2c732e798495f8ee6970c7c._comment create mode 100644 doc/todo/tahoe_lfs_for_reals.mdwn create mode 100644 doc/todo/tahoe_lfs_for_reals/comment_1_0a4793ce6a867638f6e510e71dd4bb44._comment create mode 100644 doc/todo/tahoe_lfs_for_reals/comment_2_80b9e848edfdc7be21baab7d0cef0e3a._comment create mode 100644 doc/todo/union_mounting.mdwn create mode 100644 doc/todo/union_mounting/comment_1_cb08435812dd7766de26199c73f38e8b._comment create mode 100644 doc/todo/union_mounting/comment_2_240b1736f6bd4fbf87c372d3a46e661b._comment create mode 100644 doc/todo/union_mounting/comment_3_cf0a0d4fbd929f24f7056115b2acb7de._comment create mode 100644 doc/todo/untracked_remotes.mdwn create mode 100644 doc/todo/untracked_remotes/comment_1_ccc743554cf9270e1db5275273b28265._comment create mode 100644 doc/todo/untracked_remotes/comment_2_48cc5d0e2282fa53625e0037a035fee3._comment create mode 100644 doc/todo/untracked_remotes/comment_3_0d07c5bc8d42f35351c11411eaca88df._comment create mode 100644 doc/todo/untracked_remotes/comment_4_75ae13c2135a2951b2af548139cb25cd._comment create mode 100644 doc/todo/use_cp_reflink.mdwn create mode 100644 doc/todo/using_file_metadata_for_preferred___40__wanted__41___content.mdwn create mode 100644 doc/todo/using_url_backend.mdwn create mode 100644 doc/todo/whishlist:_git_annex_drop_--dry-run.mdwn create mode 100644 doc/todo/whishlist:_git_annex_drop_--dry-run/comment_1_20ecfa8ffa52c238d21b904076ac69a2._comment create mode 100644 doc/todo/whishlist:_git_annex_drop_--dry-run/comment_2_d19bc268c9467d24baa8d8f77a6e5e09._comment create mode 100644 doc/todo/whislist:_allow_setting_annex-ignore_from_the_webapp.mdwn create mode 100644 doc/todo/windows_support.mdwn create mode 100644 doc/todo/windows_support/comment_10_394127e34e07ab3dc0e7b94ee6898866._comment create mode 100644 doc/todo/windows_support/comment_1_3cc26ad8101a22e95a8c60cf0c4dedcc._comment create mode 100644 doc/todo/windows_support/comment_2_8acae818ce468967499050bbe3c532ea._comment create mode 100644 doc/todo/windows_support/comment_3_bd0a12f4c9b884ab8a06082842381a01._comment create mode 100644 doc/todo/windows_support/comment_4_ad06b98b2ddac866ffee334e41fee6a8._comment create mode 100644 doc/todo/windows_support/comment_5_444fc7251f57db241b6e80abae41851c._comment create mode 100644 doc/todo/windows_support/comment_6_34f1f60b570c389bb1e741b990064a7e._comment create mode 100644 doc/todo/windows_support/comment_7_a5ca56c487257434650420acfa60e39f._comment create mode 100644 doc/todo/windows_support/comment_8_61214de7d967740d42905f3823ce2f65._comment create mode 100644 doc/todo/windows_support/comment_9_259a0b1a6f4d8d1944173380adc5e7c8._comment create mode 100644 doc/todo/wishlist:_Add_to_Android_version_to_Google_Play.mdwn create mode 100644 doc/todo/wishlist:_Advanced_settings_for_xmpp_and_webdav.mdwn create mode 100644 doc/todo/wishlist:_Advanced_settings_for_xmpp_and_webdav/comment_1_11c7444ab4988c60732af505b52bde3c._comment create mode 100644 doc/todo/wishlist:_An_--all_option_for_dropunused.mdwn create mode 100644 doc/todo/wishlist:_An_--all_option_for_dropunused/comment_1_d8726d108b3b40116b4ec3c9935f2dff._comment create mode 100644 doc/todo/wishlist:_An_--all_option_for_dropunused/comment_2_578248f7686ba2d80d7dc8b17c0cdf52._comment create mode 100644 doc/todo/wishlist:_An_option_like_--git-dir.mdwn create mode 100644 doc/todo/wishlist:_An_option_like_--git-dir/comment_1_5d877d90b8bdf21d4b8649744d229efd._comment create mode 100644 doc/todo/wishlist:_An_option_like_--git-dir/comment_2_462264821cbc48a433330cbf7ec6044d._comment create mode 100644 doc/todo/wishlist:_An_option_like_--git-dir/comment_3_0c3709b07a0a1091ceeee73b69e0f7ac._comment create mode 100644 doc/todo/wishlist:_Freeing_X_space_on_remote_Y.mdwn create mode 100644 doc/todo/wishlist:_GnuPG_options.mdwn create mode 100644 doc/todo/wishlist:_GnuPG_options/comment_1_6662e8a71ce20acc62147ef41ecffa50._comment create mode 100644 doc/todo/wishlist:_Have_a_preview_of_download_or_upload_size.mdwn create mode 100644 doc/todo/wishlist:_Have_a_preview_of_download_or_upload_size/comment_1_019a2457e07377510feaa089a93bd76c._comment create mode 100644 doc/todo/wishlist:_Have_a_preview_of_download_or_upload_size/comment_3_29a154699339bf040af0ee8aa24034f1._comment create mode 100644 doc/todo/wishlist:_Have_a_preview_of_download_or_upload_size/comment_3_8f7e1c4a5c714cbd719ee170354d79fa._comment create mode 100644 doc/todo/wishlist:_Have_a_preview_of_download_or_upload_size/comment_4_c7335f757e5546aa841cab38fffe7605._comment create mode 100644 doc/todo/wishlist:_Have_a_preview_of_download_or_upload_size/comment_5_d2a845354f23d07880612740cf99ddd4._comment create mode 100644 doc/todo/wishlist:_Option_to_specify_max_transfer_rate.mdwn create mode 100644 doc/todo/wishlist:_Option_to_specify_max_transfer_rate/comment_1_4fd870e14b5b70c8a6ade41406294387._comment create mode 100644 doc/todo/wishlist:_Option_to_specify_max_transfer_rate/comment_2_dd854f297ad6a94b54be9f3edfd0f766._comment create mode 100644 doc/todo/wishlist:_Option_to_specify_max_transfer_rate/comment_3_a8b7e90a473d5937807cc7eb456efe33._comment create mode 100644 doc/todo/wishlist:_Prevent_repeated_password_prompts_for_one_command.mdwn create mode 100644 doc/todo/wishlist:_Prevent_repeated_password_prompts_for_one_command/comment_1_3f9c0d08932c2ede61c802a91261a1f7._comment create mode 100644 doc/todo/wishlist:_Provide_a___34__git_annex__34___command_that_will_skip_duplicates.mdwn create mode 100644 doc/todo/wishlist:_Provide_a___34__git_annex__34___command_that_will_skip_duplicates/comment_10_d78d79fb2f3713aa69f45d2691cf8dfe._comment create mode 100644 doc/todo/wishlist:_Provide_a___34__git_annex__34___command_that_will_skip_duplicates/comment_11_4316d9d74312112dc4c823077af7febe._comment create mode 100644 doc/todo/wishlist:_Provide_a___34__git_annex__34___command_that_will_skip_duplicates/comment_12_ed6d07f16a11c6eee7e3d5005e8e6fa3._comment create mode 100644 doc/todo/wishlist:_Provide_a___34__git_annex__34___command_that_will_skip_duplicates/comment_1_fd213310ee548d8726791d2b02237fde._comment create mode 100644 doc/todo/wishlist:_Provide_a___34__git_annex__34___command_that_will_skip_duplicates/comment_2_4394bde1c6fd44acae649baffe802775._comment create mode 100644 doc/todo/wishlist:_Provide_a___34__git_annex__34___command_that_will_skip_duplicates/comment_3_076cb22057583957d5179d8ba9004605._comment create mode 100644 doc/todo/wishlist:_Provide_a___34__git_annex__34___command_that_will_skip_duplicates/comment_4_f120d1e83c1a447f2ecce302fc69cf74._comment create mode 100644 doc/todo/wishlist:_Provide_a___34__git_annex__34___command_that_will_skip_duplicates/comment_5_5c30294b3c59fdebb1eef0ae5da4cd4f._comment create mode 100644 doc/todo/wishlist:_Provide_a___34__git_annex__34___command_that_will_skip_duplicates/comment_6_f24541ada1c86d755acba7e9fa7cff24._comment create mode 100644 doc/todo/wishlist:_Provide_a___34__git_annex__34___command_that_will_skip_duplicates/comment_7_c39f1bb7c61a89b238c61bee1c049767._comment create mode 100644 doc/todo/wishlist:_Provide_a___34__git_annex__34___command_that_will_skip_duplicates/comment_8_221ed2e53420278072a6d879c6f251d1._comment create mode 100644 doc/todo/wishlist:_Provide_a___34__git_annex__34___command_that_will_skip_duplicates/comment_9_aecfa896c97b9448f235bce18a40621d._comment create mode 100644 doc/todo/wishlist:_Restore_s3_files_moved_to_Glacier.mdwn create mode 100644 doc/todo/wishlist:_Tell_git_annex___40__assistant__41___which_files___40__not__41___to_annex_via_.gitattributes.mdwn create mode 100644 doc/todo/wishlist:___34__git_annex_add__34___multiple_processes.mdwn create mode 100644 doc/todo/wishlist:___34__git_annex_add__34___multiple_processes/comment_1_85b14478411a33e6186a64bd41f0910d._comment create mode 100644 doc/todo/wishlist:___34__git_annex_add__34___multiple_processes/comment_2_82e857f463cfdf73c70f6c0a9f9a31d6._comment create mode 100644 doc/todo/wishlist:___34__git_annex_add__34___multiple_processes/comment_3_8af85eba7472d9025c6fae4f03e3ad75._comment create mode 100644 doc/todo/wishlist:___34__quiet__34___annex_get_for_centralized_use_case.mdwn create mode 100644 doc/todo/wishlist:___34__quiet__34___annex_get_for_centralized_use_case/comment_1_5c8812973cf91b046e7fc44d7e86c78e._comment create mode 100644 doc/todo/wishlist:___34__quiet__34___annex_get_for_centralized_use_case/comment_2_f36b6a5b128423211aac91a252ecf85f._comment create mode 100644 doc/todo/wishlist:___34__quiet__34___annex_get_for_centralized_use_case/comment_3_ad1569b2405acacd2e37f42b82f24c88._comment create mode 100644 doc/todo/wishlist:___34__quiet__34___annex_get_for_centralized_use_case/comment_4_8aba90150fe178ce9712ad951628f3d6._comment create mode 100644 doc/todo/wishlist:___34__quiet__34___annex_get_for_centralized_use_case/comment_5_6f42d240e0021f4dfa37146bea3f5d7e._comment create mode 100644 doc/todo/wishlist:___34__quiet__34___annex_get_for_centralized_use_case/comment_6_5fda455febf728b079f26fe42bf7bcab._comment create mode 100644 doc/todo/wishlist:___34__quiet__34___annex_get_for_centralized_use_case/comment_7_f1052ab997f1a2cccbabfd1533fc0a59._comment create mode 100644 doc/todo/wishlist:___34__quiet__34___annex_get_for_centralized_use_case/comment_8_07804647b6023436878756bd97a23f32._comment create mode 100644 doc/todo/wishlist:___34__quiet__34___annex_get_for_centralized_use_case/comment_9_fdc883d3963de8072794f3189742e4e3._comment create mode 100644 doc/todo/wishlist:___39__get__39___queue_and_schedule..mdwn create mode 100644 doc/todo/wishlist:___39__whereis__39___support_in_the_webapp.mdwn create mode 100644 doc/todo/wishlist:___96__git_annex_drop_--relaxed__96__.mdwn create mode 100644 doc/todo/wishlist:___96__git_annex_drop_--relaxed__96__/comment_1_c83a6cddd0ce222205a149cfa41ca395._comment create mode 100644 doc/todo/wishlist:___96__git_annex_drop_--relaxed__96__/comment_2_353fbc2bcc40cb8c9af42907a34c6e5a._comment create mode 100644 doc/todo/wishlist:___96__git_annex_fsck_--checksums__96___--_verify_checksums_but_disregard_annex.numcopies.mdwn create mode 100644 doc/todo/wishlist:___96__git_annex_fsck_--checksums__96___--_verify_checksums_but_disregard_annex.numcopies/comment_1_6bcf067e4860bdfeb1d7b9fd1702a43a._comment create mode 100644 doc/todo/wishlist:___96__git_annex_import__96___--_An_easy_way_to_get_data_into_an_annex.mdwn create mode 100644 doc/todo/wishlist:___96__git_annex_import__96___--_An_easy_way_to_get_data_into_an_annex/comment_1_b9fd1bfaf9a3d238fdb7bc9c2d75fe5f._comment create mode 100644 doc/todo/wishlist:___96__git_annex_import__96___--_An_easy_way_to_get_data_into_an_annex/comment_2_56f6972413c6f0d9f414245b6f4d27b9._comment create mode 100644 doc/todo/wishlist:___96__git_annex_import__96___--_An_easy_way_to_get_data_into_an_annex/comment_3_2c094bef802a2182de4fcd0def1ad29b._comment create mode 100644 doc/todo/wishlist:___96__git_annex_import__96___--_An_easy_way_to_get_data_into_an_annex/comment_4_14915c43001f7f72c9fe5119a104ef5c._comment create mode 100644 doc/todo/wishlist:___96__git_annex_sync_-m__96__.mdwn create mode 100644 doc/todo/wishlist:_a_spec.remote_for_network_directories_that_would_mount_them_whenever_needed___40__e.g.__44___with_WebDAV__41__.mdwn create mode 100644 doc/todo/wishlist:_a_spec.remote_for_network_directories_that_would_mount_them_whenever_needed___40__e.g.__44___with_WebDAV__41__/comment_1_f46b0c9b49607e9f4f7a27f5a331ce83._comment create mode 100644 doc/todo/wishlist:_a_spec.remote_for_network_directories_that_would_mount_them_whenever_needed___40__e.g.__44___with_WebDAV__41__/comment_2_1b34e1dd72011c65e881dec2543a0373._comment create mode 100644 doc/todo/wishlist:_add_systemd_services_file_samples_for_assistant_and_webapp.mdwn create mode 100644 doc/todo/wishlist:_add_systemd_services_file_samples_for_assistant_and_webapp/comment_1_b89e90f9a70748c95aaf81740a40b76e._comment create mode 100644 doc/todo/wishlist:_add_systemd_services_file_samples_for_assistant_and_webapp/comment_2_d64361380cb18b98ddb43ada1c9f540a._comment create mode 100644 doc/todo/wishlist:_addurl_https:.mdwn create mode 100644 doc/todo/wishlist:_addurl_https:/comment_1_4e8f5e1fc52c3000eb2a1dad0624906e._comment create mode 100644 doc/todo/wishlist:_allow_configuration_of_downloader_for_addurl.mdwn create mode 100644 doc/todo/wishlist:_allow_custom_S3_url_in_webapp.mdwn create mode 100644 doc/todo/wishlist:_allow_custom_S3_url_in_webapp/comment_1_3d1ea5579a6ad0c0efde58dca11c10aa._comment create mode 100644 doc/todo/wishlist:_allow_custom_S3_url_in_webapp/comment_2_f96bb81fde4185368dc6ea5a5aed87da._comment create mode 100644 doc/todo/wishlist:_allow_the_same_remote_to_be_accissable_via_different_methods.mdwn create mode 100644 doc/todo/wishlist:_allow_the_same_remote_to_be_accissable_via_different_methods/comment_1_abb6263f3807160222bba1122475c89c._comment create mode 100644 doc/todo/wishlist:_allow_users_to_provide_UUID_when_running___96__git_annex_init__96__.mdwn create mode 100644 doc/todo/wishlist:_an___34__assistant__34___for_web-browsing_--_tracking_the_sources_of_the_downloads.mdwn create mode 100644 doc/todo/wishlist:_an___34__assistant__34___for_web-browsing_--_tracking_the_sources_of_the_downloads/comment_1_36ae3c75053d5ec278b5e6eb2084d57a._comment create mode 100644 doc/todo/wishlist:_an___34__assistant__34___for_web-browsing_--_tracking_the_sources_of_the_downloads/comment_3_be8eb800523db8cf7a2c68a28fbf5ea5._comment create mode 100644 doc/todo/wishlist:_an___34__assistant__34___for_web-browsing_--_tracking_the_sources_of_the_downloads/comment_3_d9f725de41a8572c85e4c6d9b4bcc927._comment create mode 100644 doc/todo/wishlist:_an___34__assistant__34___for_web-browsing_--_tracking_the_sources_of_the_downloads/comment_4_f52492e4cc6f965515800bd1c0e05c90._comment create mode 100644 doc/todo/wishlist:_an___34__assistant__34___for_web-browsing_--_tracking_the_sources_of_the_downloads/comment_5_5b36656fc5fa124e763f06711d9da32b._comment create mode 100644 doc/todo/wishlist:_an___34__assistant__34___for_web-browsing_--_tracking_the_sources_of_the_downloads/comment_6_285215a4466806baf85b8606f680494a._comment create mode 100644 doc/todo/wishlist:_an___34__assistant__34___for_web-browsing_--_tracking_the_sources_of_the_downloads/comment_7_15bf62e46db4b84ed3156f550f03de42._comment create mode 100644 doc/todo/wishlist:_annex.largefiles_configuration_in_webapp_and_sync.mdwn create mode 100644 doc/todo/wishlist:_annex.largefiles_configuration_in_webapp_and_sync/comment_1_db632de391ce9fce42af51a770ed3aeb._comment create mode 100644 doc/todo/wishlist:_annex.largefiles_configuration_in_webapp_and_sync/comment_2_4a0931d9884054d764fde315d4fe4851._comment create mode 100644 doc/todo/wishlist:_annex.largefiles_support_for_mimetypes.mdwn create mode 100644 doc/todo/wishlist:_annex.largefiles_support_for_mimetypes/comment_1_304431bb62b5b8a64edc37a11bbaff59._comment create mode 100644 doc/todo/wishlist:_archive_from_remote_with_the_least_free_space.mdwn create mode 100644 doc/todo/wishlist:_archive_from_remote_with_the_least_free_space/comment_1_6813fdc7ecc98765a5d35d34163a1712._comment create mode 100644 doc/todo/wishlist:_archive_from_remote_with_the_least_free_space/comment_2_21a249cedca1ceb80d10784004735524._comment create mode 100644 doc/todo/wishlist:_assistant_autostart_port_and_secret_configuration.mdwn create mode 100644 doc/todo/wishlist:_assistant_autostart_port_and_secret_configuration/comment_1_be53b8456eed7eadad5d4b8465c8a42b._comment create mode 100644 doc/todo/wishlist:_command_options_changes.mdwn create mode 100644 doc/todo/wishlist:_command_options_changes/comment_1_bfba72a696789bf21b2435dea15f967a._comment create mode 100644 doc/todo/wishlist:_command_options_changes/comment_2_f6a637c78c989382e3c22d41b7fb4cc2._comment create mode 100644 doc/todo/wishlist:_command_options_changes/comment_3_bf1114533d2895804e531e76eb6b8095._comment create mode 100644 doc/todo/wishlist:_define_remotes_that_must_have_all_files.mdwn create mode 100644 doc/todo/wishlist:_define_remotes_that_must_have_all_files/comment_1_cceccc1a1730ac688d712b81a44e31c3._comment create mode 100644 doc/todo/wishlist:_define_remotes_that_must_have_all_files/comment_2_eec848fcf3979c03cbff2b7407c75a7a._comment create mode 100644 doc/todo/wishlist:_derived_content_support.mdwn create mode 100644 doc/todo/wishlist:_detection_of_merge_conflicts.mdwn create mode 100644 doc/todo/wishlist:_disable_automatic_commits.mdwn create mode 100644 doc/todo/wishlist:_display_name_of_object_when_addWatcher_gets_a_permission_denied.mdwn create mode 100644 doc/todo/wishlist:_display_name_of_object_when_addWatcher_gets_a_permission_denied/comment_1_d2665e7347689b520d37561cfddf0aa8._comment create mode 100644 doc/todo/wishlist:_display_name_of_object_when_addWatcher_gets_a_permission_denied/comment_2_db153571a32fb072453ed583e3e9ccf4._comment create mode 100644 doc/todo/wishlist:_display_status_of_remotes_in_the_webapp.mdwn create mode 100644 doc/todo/wishlist:_do_round_robin_downloading_of_data.mdwn create mode 100644 doc/todo/wishlist:_do_round_robin_downloading_of_data/comment_1_460335b0e59ad03871c524f1fe812357._comment create mode 100644 doc/todo/wishlist:_dropping_git-annex_history.mdwn create mode 100644 doc/todo/wishlist:_dropping_git-annex_history/comment_1_a4bee2e26b22a9bdaadc05b7227769ef._comment create mode 100644 doc/todo/wishlist:_dropping_git-annex_history/comment_2_f6d750bfe0c9d8a2aa6bc218ca5c49cc._comment create mode 100644 doc/todo/wishlist:_encrypted_git_remote_on_hosting_site_from_webapp.mdwn create mode 100644 doc/todo/wishlist:_generic_annex.cost-command.mdwn create mode 100644 doc/todo/wishlist:_git-annex_replicate.mdwn create mode 100644 doc/todo/wishlist:_git-annex_replicate/comment_1_9926132ec6052760cdf28518a24e2358._comment create mode 100644 doc/todo/wishlist:_git-annex_replicate/comment_2_c43932f4194aba8fb2470b18e0817599._comment create mode 100644 doc/todo/wishlist:_git-annex_replicate/comment_3_c13f4f9c3d5884fc6255fd04feadc2b1._comment create mode 100644 doc/todo/wishlist:_git-annex_replicate/comment_4_63f24abf086d644dced8b01e1a9948c9._comment create mode 100644 doc/todo/wishlist:_git_annex_diff.mdwn create mode 100644 doc/todo/wishlist:_git_annex_diff/comment_1_16ccf2e1036d9e1a913db81988731b5a._comment create mode 100644 doc/todo/wishlist:_git_annex_info_UUID.mdwn create mode 100644 doc/todo/wishlist:_git_annex_info_UUID/comment_1_d0d40bfdafed47e9e8ef2f4cd5c8576f._comment create mode 100644 doc/todo/wishlist:_git_annex_info_UUID/comment_2._comment create mode 100644 doc/todo/wishlist:_git_annex_put_--_same_as_get__44___but_for_defaults.mdwn create mode 100644 doc/todo/wishlist:_git_annex_put_--_same_as_get__44___but_for_defaults/comment_1_d5413c8acce308505e4e2bec82fb1261._comment create mode 100644 doc/todo/wishlist:_git_annex_put_--_same_as_get__44___but_for_defaults/comment_2_0aa227c85d34dfff4e94febca44abea8._comment create mode 100644 doc/todo/wishlist:_git_annex_put_--_same_as_get__44___but_for_defaults/comment_3_2082f4d708a584a1403cc1d4d005fb56._comment create mode 100644 doc/todo/wishlist:_git_annex_status.mdwn create mode 100644 doc/todo/wishlist:_git_annex_status/comment_1_994bfd12c5d82e08040d6116915c5090._comment create mode 100644 doc/todo/wishlist:_git_annex_status/comment_2_c2b0ce025805b774dc77ce264a222824._comment create mode 100644 doc/todo/wishlist:_git_annex_status/comment_3_d1fd70c67243971c96d59e1ffb7ef6e7._comment create mode 100644 doc/todo/wishlist:_git_annex_status/comment_4_9aeeb83d202dc8fb33ff364b0705ad94._comment create mode 100644 doc/todo/wishlist:_git_backend_for_git-annex.mdwn create mode 100644 doc/todo/wishlist:_git_backend_for_git-annex/comment_1_04319051fedc583e6c326bb21fcce5a5._comment create mode 100644 doc/todo/wishlist:_git_backend_for_git-annex/comment_2_7f529f19a47e10b571f65ab382e97fd5._comment create mode 100644 doc/todo/wishlist:_git_backend_for_git-annex/comment_3_a077bbad3e4b07cce019eb55a45330e7._comment create mode 100644 doc/todo/wishlist:_git_backend_for_git-annex/comment_4_ecca429e12d734b509c671166a676c9d._comment create mode 100644 doc/todo/wishlist:_git_backend_for_git-annex/comment_5_3459f0b41d818c23c8fb33edb89df634._comment create mode 100644 doc/todo/wishlist:_history_of_operations.mdwn create mode 100644 doc/todo/wishlist:_history_of_operations/comment_1_f9a77ce83c6f39b6272d5c577ffbb9f9._comment create mode 100644 doc/todo/wishlist:_incremental_unannex___40__currently_requires_twice_the_size_of_repo_to_complete__41__.mdwn create mode 100644 doc/todo/wishlist:_incremental_unannex___40__currently_requires_twice_the_size_of_repo_to_complete__41__/comment_1_067b29fc47d26b9da0766f9810684ae8._comment create mode 100644 doc/todo/wishlist:_make_git_annex_reinject_work_in_direct_mode.mdwn create mode 100644 doc/todo/wishlist:_make_partial_files_available_during_transfer.mdwn create mode 100644 doc/todo/wishlist:_make_partial_files_available_during_transfer/comment_2_8b1cfae6f2b61929a9c6f48ae63c921d._comment create mode 100644 doc/todo/wishlist:_make_partial_files_available_during_transfer/comment_3_1304a721da6f5133fdfa1dac507f1ecb._comment create mode 100644 doc/todo/wishlist:_metadata_metadata_view.mdwn create mode 100644 doc/todo/wishlist:_metadata_metadata_view/comment_1_79dbf48cf2e0d649f32bd077f0c9bc5a._comment create mode 100644 doc/todo/wishlist:_metadata_metadata_view/comment_2_5763d0e403c476ac692c1cd50630f824._comment create mode 100644 doc/todo/wishlist:_metadata_metadata_view/comment_3_797e6578c60d8e2ed1f61a8d6403575f._comment create mode 100644 doc/todo/wishlist:_metadata_metadata_view/comment_4_d271fe711b3fe5ffeb52f1caf44622b3._comment create mode 100644 doc/todo/wishlist:_more_descriptive_commit_messages_in_git-annex_branch.mdwn create mode 100644 doc/todo/wishlist:_more_info_in_commit_messages_in_general.mdwn create mode 100644 doc/todo/wishlist:_more_info_in_the_standard_commit_message_of___96__sync__96__.mdwn create mode 100644 doc/todo/wishlist:_more_info_in_the_standard_commit_message_of___96__sync__96__/comment_1_b9c241cf94a35aa6a45f4d44334694b0._comment create mode 100644 doc/todo/wishlist:_move_pending_transfers_for_a_host_to_the_end_of_the_queue_when_one_fails.mdwn create mode 100644 doc/todo/wishlist:_move_pending_transfers_for_a_host_to_the_end_of_the_queue_when_one_fails/comment_1_82ee9de610a0ac55cd1c27c211079e5b._comment create mode 100644 doc/todo/wishlist:_move_pending_transfers_for_a_host_to_the_end_of_the_queue_when_one_fails/comment_2_bea55156bd32cf9e6dd9b946ba1bb8c1._comment create mode 100644 doc/todo/wishlist:_option_to_disable_url_checking_with_addurl.mdwn create mode 100644 doc/todo/wishlist:_option_to_disable_url_checking_with_addurl/comment_1_868a380faa1e55faa3c2d314e3258e86._comment create mode 100644 doc/todo/wishlist:_option_to_print_more_info_with___39__unused__39__.mdwn create mode 100644 doc/todo/wishlist:_pack_metadata_in_direct_mode.mdwn create mode 100644 doc/todo/wishlist:_pack_metadata_in_direct_mode/comment_1_1a550d6977a255b789337c3d1602db04._comment create mode 100644 doc/todo/wishlist:_pack_metadata_in_direct_mode/comment_2_3cc9c69d33c658058daea9cb5e4ab669._comment create mode 100644 doc/todo/wishlist:_perform_fsck_remotely.mdwn create mode 100644 doc/todo/wishlist:_perform_fsck_remotely/comment_1_db92311dcdb1ef0ab0413f83e191c70c._comment create mode 100644 doc/todo/wishlist:_perform_fsck_remotely/comment_2_2f0dbaf143d94290bfbebb6869eb7241._comment create mode 100644 doc/todo/wishlist:_perform_fsck_remotely/comment_3_5ec2e0e248dfd4ca46aef89cc5658d18._comment create mode 100644 doc/todo/wishlist:_print_locations_for_files_in_rsync_remote.mdwn create mode 100644 doc/todo/wishlist:_push_to_cia.vc_from_the_website__39__s_repo__44___not_your_personal_one.mdwn create mode 100644 doc/todo/wishlist:_push_to_cia.vc_from_the_website__39__s_repo__44___not_your_personal_one/comment_1_3480b0ec629ef29a151408d869186bf8._comment create mode 100644 doc/todo/wishlist:_query_things_like_description__44___trust_level.mdwn create mode 100644 doc/todo/wishlist:_query_things_like_description__44___trust_level/comment_1_14311384788312b96e550749ab7de9ea._comment create mode 100644 doc/todo/wishlist:_query_things_like_description__44___trust_level/comment_2_342d1ac07573c7ef4e27f003a692e261._comment create mode 100644 doc/todo/wishlist:_recursive_directory_remote_setup__47__addurl.mdwn create mode 100644 doc/todo/wishlist:_recursive_directory_remote_setup__47__addurl/comment_1_b79976afc2242791523e63831f30af71._comment create mode 100644 doc/todo/wishlist:_recursive_directory_remote_setup__47__addurl/comment_2_1741d2392006a9af9cfd1f3b847600b9._comment create mode 100644 doc/todo/wishlist:_simple_url_for_webapp.mdwn create mode 100644 doc/todo/wishlist:_simple_url_for_webapp/comment_1_552aad504fbb68d1f85abfde8c535e69._comment create mode 100644 doc/todo/wishlist:_simpler_gpg_usage.mdwn create mode 100644 doc/todo/wishlist:_simpler_gpg_usage/comment_1_6923fa6ebc0bbe7d93edb1d01d7c46c5._comment create mode 100644 doc/todo/wishlist:_simpler_gpg_usage/comment_2_6fc874b6c391df242bd2592c4a65eae8._comment create mode 100644 doc/todo/wishlist:_simpler_gpg_usage/comment_3_012f340c8c572fe598fc860c1046dabd._comment create mode 100644 doc/todo/wishlist:_simpler_gpg_usage/comment_4_e0c2a13217b795964f3b630c001661ef._comment create mode 100644 doc/todo/wishlist:_simpler_gpg_usage/comment_5_9668b58eb71901e1db8da7db38e068ca._comment create mode 100644 doc/todo/wishlist:_spec.remotes_for_other_peer_network_data_stores___40__gnunet__44___freenet__41__.mdwn create mode 100644 doc/todo/wishlist:_spec.remotes_for_other_peer_network_data_stores___40__gnunet__44___freenet__41__/comment_1_e2c2047e7401cb95a82ffb686a732859._comment create mode 100644 doc/todo/wishlist:_spec.remotes_for_other_peer_network_data_stores___40__gnunet__44___freenet__41__/comment_2_472b576afdb169b233edd01adcb2123d._comment create mode 100644 doc/todo/wishlist:_spec.remotes_for_other_peer_network_data_stores___40__gnunet__44___freenet__41__/comment_3_b4ff519ece76c6c3fb29b981320e2e1c._comment create mode 100644 doc/todo/wishlist:_special-case_handling_of_Youtube_URLs_in_Web_special_remote.mdwn create mode 100644 doc/todo/wishlist:_special-case_handling_of_Youtube_URLs_in_Web_special_remote/comment_1_1a383c30df4fb1767f13d8c670b0c0b5._comment create mode 100644 doc/todo/wishlist:_special-case_handling_of_Youtube_URLs_in_Web_special_remote/comment_2_81f7f893ac36c145b31f02db6a682a17._comment create mode 100644 doc/todo/wishlist:_special-case_handling_of_Youtube_URLs_in_Web_special_remote/comment_3_a7e3cd68c5e5f05139151a58f358df95._comment create mode 100644 doc/todo/wishlist:_special-case_handling_of_Youtube_URLs_in_Web_special_remote/comment_4_a57947ed257b28bbe995a68bfeb5eeaa._comment create mode 100644 doc/todo/wishlist:_special-case_handling_of_Youtube_URLs_in_Web_special_remote/comment_5_a0612ae05dbda7f7935be648b42b30fc._comment create mode 100644 doc/todo/wishlist:_special_remote_Ubuntu_One.mdwn create mode 100644 doc/todo/wishlist:_special_remote_Ubuntu_One/comment_1_ab0c761030bc55e8fb75d1b344bb98b9._comment create mode 100644 doc/todo/wishlist:_special_remote_for_sftp_or_rsync.mdwn create mode 100644 doc/todo/wishlist:_special_remote_for_sftp_or_rsync/comment_1_6f07d9cc92cf8b4927b3a7d1820c9140._comment create mode 100644 doc/todo/wishlist:_special_remote_for_sftp_or_rsync/comment_2_84e4414c88ae91c048564a2cdc2d3250._comment create mode 100644 doc/todo/wishlist:_special_remote_for_sftp_or_rsync/comment_3_79de7ac44e3c0f0f5691a56d3fb88897._comment create mode 100644 doc/todo/wishlist:_special_remote_mega.co.nz.mdwn create mode 100644 doc/todo/wishlist:_special_remote_mega.co.nz/comment_2_6ca08ef808d4336fc42d0f279d6627b5._comment create mode 100644 doc/todo/wishlist:_support_copy_--from__61__x_--to__61__y.mdwn create mode 100644 doc/todo/wishlist:_support_copy_--from__61__x_--to__61__y/comment_1_cf8e0f16b723516374c95a93e4da42fc._comment create mode 100644 doc/todo/wishlist:_support_copy_--from__61__x_--to__61__y/comment_2_d35359c9dd4dd4365d9a7caf695ff833._comment create mode 100644 doc/todo/wishlist:_support_drop__44___find_on_special_remotes.mdwn create mode 100644 doc/todo/wishlist:_support_drop__44___find_on_special_remotes/comment_1_f11ed642a83d965076778a162f701e84._comment create mode 100644 doc/todo/wishlist:_support_for_more_ssh_urls_.mdwn create mode 100644 doc/todo/wishlist:_swift_backend.mdwn create mode 100644 doc/todo/wishlist:_swift_backend/comment_1_e6efbb35f61ee521b473a92674036788._comment create mode 100644 doc/todo/wishlist:_swift_backend/comment_2_5d8c83b0485112e98367b7abaab3f4e3._comment create mode 100644 doc/todo/wishlist:_swift_backend/comment_3_bf8625b909c3a7321cae40e6f145e874._comment create mode 100644 doc/todo/wishlist:_swift_backend/comment_4_4d97d12ddd99834788e94648c8eebef9._comment create mode 100644 doc/todo/wishlist:_swift_backend/comment_5_1568f726f91d4589aef7ca9fcc3c957d._comment create mode 100644 doc/todo/wishlist:_traffic_accounting_for_git-annex.mdwn create mode 100644 doc/todo/wishlist:_unify_directory_scheme_for_the_store.mdwn create mode 100644 doc/todo/wishlist:_unify_directory_scheme_for_the_store/comment_1_44da58beaaab359ecaba7fb905ca4ae1._comment create mode 100644 doc/todo/wishlist:_unify_directory_scheme_for_the_store/comment_2_bc698c501ecdb56df57171f4f3bb831a._comment create mode 100644 doc/todo/wishlist:_unify_directory_scheme_for_the_store/comment_3_e555d0dbbaa05528806905c6a940724b._comment create mode 100644 doc/todo/wishlist:_use_hardlinks_for_local_clones.mdwn create mode 100644 doc/todo/wishlist:_use_hardlinks_for_local_clones/comment_1_85064fafe472a5bd395d60ce8f7acb56._comment create mode 100644 doc/todo/wishlist:_vicfg_possible_repo_group_names.mdwn create mode 100644 doc/todo/wishlist:alias_system.mdwn create mode 100644 doc/todo/wishlist:alias_system/comment_1_5afad4b92f9a449d4a82a94ad31feec2._comment create mode 100644 doc/todo/wishlist__91__minor__93__:_add_time_stamps_to_annex_log_popups_in_webapp.mdwn create mode 100644 doc/todo/wishlist__91__minor__93__:_add_time_stamps_to_annex_log_popups_in_webapp/comment_1_ec90432a7d46383071401b05243d621f._comment create mode 100644 doc/todo/wishlist__91__webapp__93__:_add_an_option_to_install__SSH_key_on_remote.mdwn create mode 100644 doc/todo/wishlist__91__webapp__93__:_add_an_option_to_install__SSH_key_on_remote/comment_1_13737dc99aa877b309f7ebe44ecbafee._comment create mode 100644 doc/todo/wishlist_degraded_files.mdwn create mode 100644 doc/transferring_data.mdwn create mode 100644 doc/trust.mdwn create mode 100644 doc/upgrades.mdwn create mode 100644 doc/upgrades/SHA_size.mdwn create mode 100644 doc/upgrades/SHA_size/comment_1_20f9b7b75786075de666b2146dc13a60._comment create mode 100644 doc/upgrades/gcrypt.mdwn create mode 100644 doc/upgrades/gcrypt/comment_1_606c1527735996ae671f78948e4ad84b._comment create mode 100644 doc/use_case/Alice.mdwn create mode 100644 doc/use_case/Bob.mdwn create mode 100644 doc/users.mdwn create mode 100644 doc/users/anarcat.mdwn create mode 100644 doc/users/chrysn.mdwn create mode 100644 doc/users/clacke.mdwn create mode 100644 doc/users/claes.wallin.mdwn create mode 100644 doc/users/fmarier.mdwn create mode 100644 doc/users/gebi.mdwn create mode 100644 doc/users/greg.mdwn create mode 100644 doc/users/joey.mdwn create mode 100644 doc/users/sameerds.mdwn create mode 100644 doc/users/tobiastheviking.mdwn create mode 100644 doc/videos.mdwn create mode 100644 doc/videos/FOSDEM2012.mdwn create mode 100644 doc/videos/LCA2013.mdwn create mode 100644 doc/videos/git-annex_assistant_archiving.mdwn create mode 100644 doc/videos/git-annex_assistant_introduction.mdwn create mode 100644 doc/videos/git-annex_assistant_introduction/comment_1_f42ad4183c2c28319d3705a82fceb82f._comment create mode 100644 doc/videos/git-annex_assistant_introduction/comment_2_b62f4eeeac1138570f7cb8c98d41c2cb._comment create mode 100644 doc/videos/git-annex_assistant_remote_sharing.mdwn create mode 100644 doc/videos/git-annex_assistant_sync_demo.mdwn create mode 100644 doc/videos/git-annex_views_demo.mdwn create mode 100644 doc/videos/git-annex_watch_demo.mdwn create mode 100644 doc/videos/git-annex_weppapp_demo.mdwn create mode 100644 doc/walkthrough.mdwn create mode 100644 doc/walkthrough/adding_a_remote.mdwn create mode 100644 doc/walkthrough/adding_a_remote/comment_1_0a59355bd33a796aec97173607e6adc9._comment create mode 100644 doc/walkthrough/adding_a_remote/comment_2_f8cd79ef1593a8181a7f1086a87713e8._comment create mode 100644 doc/walkthrough/adding_a_remote/comment_3_60691af4400521b5a8c8d75efe3b44cb._comment create mode 100644 doc/walkthrough/adding_a_remote/comment_4_6f7cf5c330272c96b3abeb6612075c9d._comment create mode 100644 doc/walkthrough/adding_files.mdwn create mode 100644 doc/walkthrough/automatically_managing_content.mdwn create mode 100644 doc/walkthrough/backups.mdwn create mode 100644 doc/walkthrough/creating_a_repository.mdwn create mode 100644 doc/walkthrough/fsck:_verifying_your_data.mdwn create mode 100644 doc/walkthrough/fsck:_when_things_go_wrong.mdwn create mode 100644 doc/walkthrough/getting_file_content.mdwn create mode 100644 doc/walkthrough/modifying_annexed_files.mdwn create mode 100644 doc/walkthrough/modifying_annexed_files/comment_1_624b4a0b521b553d68ab6049f7dbaf8c._comment create mode 100644 doc/walkthrough/modifying_annexed_files/comment_2_b000622304535d32b69db17d51156b21._comment create mode 100644 doc/walkthrough/more.mdwn create mode 100644 doc/walkthrough/moving_file_content_between_repositories.mdwn create mode 100644 doc/walkthrough/moving_file_content_between_repositories/comment_1_4c30ade91fc7113a95960aa3bd1d5427._comment create mode 100644 doc/walkthrough/moving_file_content_between_repositories/comment_2_7d90e1e150e7524ba31687108fcc38d6._comment create mode 100644 doc/walkthrough/moving_file_content_between_repositories/comment_3_558d80384434207b9cfc033763863de3._comment create mode 100644 doc/walkthrough/moving_file_content_between_repositories/comment_4_a2f343eceed9e9fba1670f21e0fc6af4._comment create mode 100644 doc/walkthrough/quiet_please:_When_git-annex_seems_to_skip_files.mdwn create mode 100644 doc/walkthrough/removing_files.mdwn create mode 100644 doc/walkthrough/removing_files/comment_1_cb65e7c510b75be1c51f655b058667c6._comment create mode 100644 doc/walkthrough/removing_files/comment_2_64709ea4558915edd5c8ca4486965b07._comment create mode 100644 doc/walkthrough/removing_files:_When_things_go_wrong.mdwn create mode 100644 doc/walkthrough/renaming_files.mdwn create mode 100644 doc/walkthrough/setup_git.mdwn create mode 100644 doc/walkthrough/syncing.mdwn create mode 100644 doc/walkthrough/transferring_files:_When_things_go_wrong.mdwn create mode 100644 doc/walkthrough/unused_data.mdwn create mode 100644 doc/walkthrough/unused_data/comment_1_684b7b652d3a8ec04f32129c5528f1ab._comment create mode 100644 doc/walkthrough/using_bup.mdwn create mode 100644 doc/walkthrough/using_ssh_remotes.mdwn create mode 100644 doc/walkthrough/using_ssh_remotes/comment_10_98e97c4d7fbbcd449eddf683967a71d6._comment create mode 100644 doc/walkthrough/using_ssh_remotes/comment_11_f2775a151ed50caba27057bd9c38bae2._comment create mode 100644 doc/walkthrough/using_ssh_remotes/comment_12_a8bc6110128431ca2a8624ddc75ea364._comment create mode 100644 doc/walkthrough/using_ssh_remotes/comment_2_365db5820d96d5daa62c19fd76fcdf1e._comment create mode 100644 doc/walkthrough/using_ssh_remotes/comment_2_451fd0c6a25ee61ef137e8e5be0c286b._comment create mode 100644 doc/walkthrough/using_ssh_remotes/comment_3_b2f15a46620385da26d5fe8f11ebfc1a._comment create mode 100644 doc/walkthrough/using_ssh_remotes/comment_4_433ccc87fbb0a13e32d59d77f0b4e56c._comment create mode 100644 doc/walkthrough/using_ssh_remotes/comment_5_a9805c7965da0b88a1c9f7f207c450a1._comment create mode 100644 doc/walkthrough/using_ssh_remotes/comment_6_9d5c12c056892b706cf100ea01866685._comment create mode 100644 doc/walkthrough/using_ssh_remotes/comment_7_725e7dbb2d0a74a035127cb01ee0442c._comment create mode 100644 doc/walkthrough/using_ssh_remotes/comment_8_8448e55026d2c2b50d8da41707686bea._comment create mode 100644 doc/walkthrough/using_ssh_remotes/comment_9_61833299a9878f23ac57598fa6da8839._comment create mode 100644 doc/walkthrough/using_tags_and_branches.mdwn create mode 100755 ghci create mode 100644 git-annex.cabal create mode 100644 git-annex.hs create mode 100644 git-union-merge.hs create mode 100644 standalone/android/.gitignore create mode 100644 standalone/android/Makefile create mode 100644 standalone/android/abiversion create mode 100755 standalone/android/buildchroot create mode 100755 standalone/android/buildchroot-inchroot create mode 100755 standalone/android/buildchroot-inchroot-asuser create mode 100644 standalone/android/busybox_config create mode 100755 standalone/android/clean-haskell-packages create mode 100644 standalone/android/dropbear.patch create mode 100644 standalone/android/haskell-patches/MissingH_1.2.0.0_0001-fix-build-not-Android-specific.patch create mode 100644 standalone/android/haskell-patches/bloomfilter_fix-build-with-newer-base.patch create mode 100644 standalone/android/haskell-patches/certificate_1.3.7-0001-support-Android-cert-store.patch create mode 100644 standalone/android/haskell-patches/comonad_cross-build.patch create mode 100644 standalone/android/haskell-patches/crypto-numbers_build-fix.patch create mode 100644 standalone/android/haskell-patches/distributive_0.3-0001-fixes-for-cross-build.patch create mode 100644 standalone/android/haskell-patches/dns_use-android-net.dns1-command-instead-of-resolv.conf.patch create mode 100644 standalone/android/haskell-patches/entropy_cross-build.patch create mode 100644 standalone/android/haskell-patches/gnutls_0.1.4-0001-statically-link-with-gnutls.patch create mode 100644 standalone/android/haskell-patches/gsasl_0.3.5-0001-link-with-libgsasl.patch create mode 100644 standalone/android/haskell-patches/iproute_1.2.11_0001-build-without-IPv6-stuff.patch create mode 100644 standalone/android/haskell-patches/language-javascript_fix-build-with-new-ghc.patch create mode 100644 standalone/android/haskell-patches/libxml-sax_text-dep.patch create mode 100644 standalone/android/haskell-patches/lifted-base_crossbuild.patch create mode 100644 standalone/android/haskell-patches/network-protocol-xmpp_text-dapendency.patch create mode 100644 standalone/android/haskell-patches/network_2.4.1.0_0001-android-port-fixes.patch create mode 100644 standalone/android/haskell-patches/network_2.4.1.0_0002-remove-Network.BSD-symbols-not-available-in-bionic.patch create mode 100644 standalone/android/haskell-patches/network_2.4.1.0_0003-configure-misdetects-accept4.patch create mode 100644 standalone/android/haskell-patches/network_2.4.1.0_0004-getprotobyname-hack-for-tcp-and-udp.patch create mode 100644 standalone/android/haskell-patches/network_2.4.1.0_0005-no-NODELAY-on-android.patch create mode 100644 standalone/android/haskell-patches/primitive_0.5.0.1_0001-disable-i386-opt-stuff-to-allow-cross-compilation.patch create mode 100644 standalone/android/haskell-patches/skein_hardcode_little-endian.patch create mode 100644 standalone/android/haskell-patches/socks_0.4.2_0001-remove-IPv6-stuff.patch create mode 100644 standalone/android/haskell-patches/stm-chans_cross-build.patch create mode 100644 standalone/android/haskell-patches/system-filepath_cross-build.patch create mode 100644 standalone/android/haskell-patches/unbounded-delays_crossbuild.patch create mode 100644 standalone/android/haskell-patches/unix-time_hack-for-Bionic.patch create mode 100644 standalone/android/haskell-patches/uuid_build-without-v1-uuid-which-needs-network-info.patch create mode 100644 standalone/android/haskell-patches/vector_hack-to-build-with-new-ghc.patch create mode 100644 standalone/android/haskell-patches/x509-system_support-Android-cert-store.patch create mode 100644 standalone/android/haskell-patches/zlib_0.5.4.0_0001-hack-to-build-on-Android.patch create mode 100644 standalone/android/icons/drawable-hdpi/ic_launcher.png create mode 100644 standalone/android/icons/drawable-hdpi/ic_stat_service_notification_icon.png create mode 100644 standalone/android/icons/drawable-ldpi/ic_launcher.png create mode 100644 standalone/android/icons/drawable-ldpi/ic_stat_service_notification_icon.png create mode 100644 standalone/android/icons/drawable-mdpi/ic_launcher.png create mode 100644 standalone/android/icons/drawable-mdpi/ic_stat_service_notification_icon.png create mode 100644 standalone/android/icons/drawable-xhdpi/ic_launcher.png create mode 100644 standalone/android/icons/drawable-xhdpi/ic_stat_service_notification_icon.png create mode 120000 standalone/android/icons/drawable/ic_launcher.png create mode 120000 standalone/android/icons/drawable/ic_stat_service_notification_icon.png create mode 100755 standalone/android/install-haskell-packages create mode 100644 standalone/android/openssh.config.h create mode 100644 standalone/android/openssh.patch create mode 100644 standalone/android/rsync.patch create mode 100755 standalone/android/runshell create mode 100644 standalone/android/start.c create mode 100644 standalone/android/term.patch create mode 100644 standalone/licences.gz create mode 100644 standalone/linux/haskell-patches/network_disable_accept4.patch create mode 100755 standalone/linux/install-haskell-packages create mode 100644 standalone/linux/skel/README create mode 100755 standalone/linux/skel/git create mode 100755 standalone/linux/skel/git-annex create mode 100755 standalone/linux/skel/git-annex-shell create mode 100755 standalone/linux/skel/git-annex-webapp create mode 100755 standalone/linux/skel/git-receive-pack create mode 100755 standalone/linux/skel/git-shell create mode 100755 standalone/linux/skel/git-upload-pack create mode 100755 standalone/linux/skel/runshell create mode 100644 standalone/no-th/evilsplicer-headers.hs create mode 100644 standalone/no-th/haskell-patches/DAV_build-without-TH.patch create mode 100644 standalone/no-th/haskell-patches/file-embed_remove-TH.patch create mode 100644 standalone/no-th/haskell-patches/generic-deriving_remove-TH.patch create mode 100644 standalone/no-th/haskell-patches/hamlet_remove-TH.patch create mode 100644 standalone/no-th/haskell-patches/lens_no-TH.patch create mode 100644 standalone/no-th/haskell-patches/monad-logger_remove-TH.patch create mode 100644 standalone/no-th/haskell-patches/persistent-template_stub-out.patch create mode 100644 standalone/no-th/haskell-patches/persistent_1.1.5.1_0001-disable-TH.patch create mode 100644 standalone/no-th/haskell-patches/process-conduit_avoid-TH.patch create mode 100644 standalone/no-th/haskell-patches/profunctors_3.3-0001-fix-cross-build.patch create mode 100644 standalone/no-th/haskell-patches/reflection_remove-TH.patch create mode 100644 standalone/no-th/haskell-patches/shakespeare-css_1.0.2_0002-expose-modules-used-by-TH.patch create mode 100644 standalone/no-th/haskell-patches/shakespeare-css_1.0.2_0003-remove-more-TH.patch create mode 100644 standalone/no-th/haskell-patches/shakespeare-i18n_0001-remove-TH.patch create mode 100644 standalone/no-th/haskell-patches/shakespeare-js_0001-remove-TH.patch create mode 100644 standalone/no-th/haskell-patches/shakespeare-text_remove-TH.patch create mode 100644 standalone/no-th/haskell-patches/shakespeare_remove-th.patch create mode 100644 standalone/no-th/haskell-patches/wai-app-static_deal-with-TH.patch create mode 100644 standalone/no-th/haskell-patches/xml-hamlet_remove_TH.patch create mode 100644 standalone/no-th/haskell-patches/yesod-auth_don-t-really-build.patch create mode 100644 standalone/no-th/haskell-patches/yesod-core_expand_TH.patch create mode 100644 standalone/no-th/haskell-patches/yesod-form_spliced-TH.patch create mode 100644 standalone/no-th/haskell-patches/yesod-persistent_do-not-really-build.patch create mode 100644 standalone/no-th/haskell-patches/yesod-routes_remove-TH.patch create mode 100644 standalone/no-th/haskell-patches/yesod-static_hack.patch create mode 100644 standalone/no-th/haskell-patches/yesod_hack-TH.patch create mode 100644 standalone/osx/git-annex.app/Contents/Info.plist create mode 100644 standalone/osx/git-annex.app/Contents/MacOS/README create mode 100755 standalone/osx/git-annex.app/Contents/MacOS/git create mode 100755 standalone/osx/git-annex.app/Contents/MacOS/git-annex create mode 100755 standalone/osx/git-annex.app/Contents/MacOS/git-annex-shell create mode 100755 standalone/osx/git-annex.app/Contents/MacOS/git-annex-webapp create mode 100755 standalone/osx/git-annex.app/Contents/MacOS/git-receive-pack create mode 100755 standalone/osx/git-annex.app/Contents/MacOS/git-shell create mode 100755 standalone/osx/git-annex.app/Contents/MacOS/git-upload-pack create mode 100755 standalone/osx/git-annex.app/Contents/MacOS/runshell create mode 100644 standalone/osx/git-annex.app/Contents/Resources/git-annex.icns create mode 100755 standalone/windows/build-simple.sh create mode 100755 standalone/windows/build.sh create mode 100644 static/activityicon.gif create mode 100644 static/bootstrap-collapse.js create mode 100644 static/bootstrap-dropdown.js create mode 100644 static/bootstrap-modal.js create mode 100644 static/bootstrap-responsive.css create mode 100644 static/bootstrap.css create mode 100644 static/favicon.ico create mode 100644 static/glyphicons-halflings-white.png create mode 100644 static/glyphicons-halflings.png create mode 100644 static/jquery.full.js create mode 100644 static/jquery.ui.core.js create mode 100644 static/jquery.ui.mouse.js create mode 100644 static/jquery.ui.sortable.js create mode 100644 static/jquery.ui.widget.js create mode 100644 static/longpolling.js create mode 100644 static/syncicon.gif create mode 100644 templates/README create mode 100644 templates/actionbutton.hamlet create mode 100644 templates/bootstrap.hamlet create mode 100644 templates/configurators/addbox.com.hamlet create mode 100644 templates/configurators/adddrive.hamlet create mode 100644 templates/configurators/adddrive/combine.hamlet create mode 100644 templates/configurators/adddrive/encrypt.hamlet create mode 100644 templates/configurators/adddrive/setupmodal.hamlet create mode 100644 templates/configurators/addglacier.hamlet create mode 100644 templates/configurators/addia.hamlet create mode 100644 templates/configurators/addrepository.hamlet create mode 100644 templates/configurators/addrepository/archive.hamlet create mode 100644 templates/configurators/addrepository/cloud.hamlet create mode 100644 templates/configurators/addrepository/misc.hamlet create mode 100644 templates/configurators/adds3.hamlet create mode 100644 templates/configurators/delete/currentrepository.hamlet create mode 100644 templates/configurators/delete/finished.hamlet create mode 100644 templates/configurators/delete/start.hamlet create mode 100644 templates/configurators/edit/nonannexremote.hamlet create mode 100644 templates/configurators/edit/repository.hamlet create mode 100644 templates/configurators/enableaws.hamlet create mode 100644 templates/configurators/enabledirectory.hamlet create mode 100644 templates/configurators/enableia.hamlet create mode 100644 templates/configurators/enablewebdav.hamlet create mode 100644 templates/configurators/fsck.cassius create mode 100644 templates/configurators/fsck.hamlet create mode 100644 templates/configurators/fsck/form.hamlet create mode 100644 templates/configurators/fsck/formcontent.hamlet create mode 100644 templates/configurators/fsck/preferencesform.hamlet create mode 100644 templates/configurators/fsck/status.hamlet create mode 100644 templates/configurators/genkeymodal.hamlet create mode 100644 templates/configurators/main.hamlet create mode 100644 templates/configurators/needgcrypt.hamlet create mode 100644 templates/configurators/needglaciercli.hamlet create mode 100644 templates/configurators/newrepository.hamlet create mode 100644 templates/configurators/newrepository/combine.hamlet create mode 100644 templates/configurators/newrepository/first.hamlet create mode 100644 templates/configurators/newrepository/form.hamlet create mode 100644 templates/configurators/pairing/disabled.hamlet create mode 100644 templates/configurators/pairing/local/inprogress.hamlet create mode 100644 templates/configurators/pairing/local/prompt.hamlet create mode 100644 templates/configurators/pairing/xmpp/end.hamlet create mode 100644 templates/configurators/pairing/xmpp/friend/confirm.hamlet create mode 100644 templates/configurators/pairing/xmpp/friend/prompt.hamlet create mode 100644 templates/configurators/pairing/xmpp/self/prompt.hamlet create mode 100644 templates/configurators/pairing/xmpp/self/retry.hamlet create mode 100644 templates/configurators/preferences.hamlet create mode 100644 templates/configurators/rsync.net/add.hamlet create mode 100644 templates/configurators/rsync.net/encrypt.hamlet create mode 100644 templates/configurators/ssh/add.hamlet create mode 100644 templates/configurators/ssh/combine.hamlet create mode 100644 templates/configurators/ssh/confirm.hamlet create mode 100644 templates/configurators/ssh/enable.hamlet create mode 100644 templates/configurators/ssh/error.hamlet create mode 100644 templates/configurators/ssh/setupmodal.hamlet create mode 100644 templates/configurators/ssh/testmodal.hamlet create mode 100644 templates/configurators/unused.hamlet create mode 100644 templates/configurators/unused/form.hamlet create mode 100644 templates/configurators/upgrade/android.hamlet create mode 100644 templates/configurators/xmpp.hamlet create mode 100644 templates/configurators/xmpp/buddylist.hamlet create mode 100644 templates/configurators/xmpp/disabled.hamlet create mode 100644 templates/configurators/xmpp/needcloudrepo.hamlet create mode 100644 templates/control/log.hamlet create mode 100644 templates/control/notrunning.hamlet create mode 100644 templates/control/notrunning.julius create mode 100644 templates/control/repairrepository.hamlet create mode 100644 templates/control/repairrepository/done.hamlet create mode 100644 templates/control/repositoryswitcher.hamlet create mode 100644 templates/control/shutdown.hamlet create mode 100644 templates/controlmenu.hamlet create mode 100644 templates/dashboard/main.hamlet create mode 100644 templates/dashboard/metarefresh.hamlet create mode 100644 templates/dashboard/transfers.cassius create mode 100644 templates/dashboard/transfers.hamlet create mode 100644 templates/documentation/about.hamlet create mode 100644 templates/documentation/license.hamlet create mode 100644 templates/documentation/repogroup.hamlet create mode 100644 templates/error.cassius create mode 100644 templates/error.hamlet create mode 100644 templates/notifications/longpolling.julius create mode 100644 templates/page.cassius create mode 100644 templates/page.hamlet create mode 100644 templates/page.julius create mode 100644 templates/repolist.hamlet create mode 100644 templates/repolist.julius create mode 100644 templates/sidebar/alert.hamlet create mode 100644 templates/sidebar/main.hamlet diff --git a/.ghci b/.ghci new file mode 100644 index 0000000000..c5550cee6e --- /dev/null +++ b/.ghci @@ -0,0 +1 @@ +:load Common diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000000..5d425843f2 --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +debian/changelog merge=dpkg-mergechangelogs diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000..b842cc93c1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,31 @@ +tags +Setup +*.hi +*.o +tmp +test +build-stamp +Build/SysConfig.hs +Build/InstallDesktopFile +Build/EvilSplicer +Build/Standalone +Build/OSXMkLibs +Build/LinuxMkLibs +git-annex +git-annex.1 +git-annex-shell.1 +git-union-merge +git-union-merge.1 +doc/.ikiwiki +html +*.tix +.hpc +dist +# Sandboxed builds +cabal-dev +# Project-local emacs configuration +.dir-locals.el +# OSX related +.DS_Store +.virthualenv +.tasty-rerun-log diff --git a/.mailmap b/.mailmap new file mode 100644 index 0000000000..46423bd59b --- /dev/null +++ b/.mailmap @@ -0,0 +1,6 @@ +Joey Hess http://joey.kitenet.net/ +Joey Hess http://joeyh.name/ +Joey Hess http://joeyh.name/ +Yaroslav Halchenko +Yaroslav Halchenko http://yarikoptic.myopenid.com/ +Yaroslav Halchenko https://www.google.com/accounts/o8/id?id=AItOawnx8kHW66N3BqmkVpgtXDlYMvr8TJ5VvfY diff --git a/Annex.hs b/Annex.hs new file mode 100644 index 0000000000..f00276e2fc --- /dev/null +++ b/Annex.hs @@ -0,0 +1,272 @@ +{- git-annex monad + - + - Copyright 2010-2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE GeneralizedNewtypeDeriving, PackageImports #-} + +module Annex ( + Annex, + AnnexState(..), + new, + run, + eval, + getState, + changeState, + setFlag, + setField, + setOutput, + getFlag, + getField, + addCleanup, + gitRepo, + inRepo, + fromRepo, + calcRepo, + getGitConfig, + changeGitConfig, + changeGitRepo, + withCurrentState, +) where + +import "mtl" Control.Monad.Reader +import "MonadCatchIO-transformers" Control.Monad.CatchIO +import Control.Concurrent + +import Common +import qualified Git +import qualified Git.Config +import Annex.Direct.Fixup +import Git.CatFile +import Git.CheckAttr +import Git.CheckIgnore +import Git.SharedRepository +import qualified Git.Hook +import qualified Git.Queue +import Types.Key +import Types.Backend +import Types.GitConfig +import qualified Types.Remote +import Types.Crypto +import Types.BranchState +import Types.TrustLevel +import Types.Group +import Types.Messages +import Types.UUID +import Types.FileMatcher +import Types.NumCopies +import Types.LockPool +import Types.MetaData +import Types.DesktopNotify +import Types.CleanupActions +import qualified Data.Map as M +import qualified Data.Set as S +import Utility.Quvi (QuviVersion) + +{- git-annex's monad is a ReaderT around an AnnexState stored in a MVar. + - This allows modifying the state in an exception-safe fashion. + - The MVar is not exposed outside this module. + -} +newtype Annex a = Annex { runAnnex :: ReaderT (MVar AnnexState) IO a } + deriving ( + Monad, + MonadIO, + MonadReader (MVar AnnexState), + MonadCatchIO, + Functor, + Applicative + ) + +-- internal state storage +data AnnexState = AnnexState + { repo :: Git.Repo + , gitconfig :: GitConfig + , backends :: [BackendA Annex] + , remotes :: [Types.Remote.RemoteA Annex] + , remoteannexstate :: M.Map UUID AnnexState + , output :: MessageState + , force :: Bool + , fast :: Bool + , auto :: Bool + , daemon :: Bool + , branchstate :: BranchState + , repoqueue :: Maybe Git.Queue.Queue + , catfilehandles :: M.Map FilePath CatFileHandle + , checkattrhandle :: Maybe CheckAttrHandle + , checkignorehandle :: Maybe (Maybe CheckIgnoreHandle) + , forcebackend :: Maybe String + , globalnumcopies :: Maybe NumCopies + , forcenumcopies :: Maybe NumCopies + , limit :: ExpandableMatcher Annex + , uuidmap :: Maybe UUIDMap + , preferredcontentmap :: Maybe (FileMatcherMap Annex) + , requiredcontentmap :: Maybe (FileMatcherMap Annex) + , shared :: Maybe SharedRepository + , forcetrust :: TrustMap + , trustmap :: Maybe TrustMap + , groupmap :: Maybe GroupMap + , ciphers :: M.Map StorableCipher Cipher + , lockpool :: LockPool + , flags :: M.Map String Bool + , fields :: M.Map String String + , modmeta :: [ModMeta] + , cleanup :: M.Map CleanupAction (Annex ()) + , inodeschanged :: Maybe Bool + , useragent :: Maybe String + , errcounter :: Integer + , unusedkeys :: Maybe (S.Set Key) + , quviversion :: Maybe QuviVersion + , existinghooks :: M.Map Git.Hook.Hook Bool + , desktopnotify :: DesktopNotify + } + +newState :: GitConfig -> Git.Repo -> AnnexState +newState c r = AnnexState + { repo = r + , gitconfig = c + , backends = [] + , remotes = [] + , remoteannexstate = M.empty + , output = defaultMessageState + , force = False + , fast = False + , auto = False + , daemon = False + , branchstate = startBranchState + , repoqueue = Nothing + , catfilehandles = M.empty + , checkattrhandle = Nothing + , checkignorehandle = Nothing + , forcebackend = Nothing + , globalnumcopies = Nothing + , forcenumcopies = Nothing + , limit = BuildingMatcher [] + , uuidmap = Nothing + , preferredcontentmap = Nothing + , requiredcontentmap = Nothing + , shared = Nothing + , forcetrust = M.empty + , trustmap = Nothing + , groupmap = Nothing + , ciphers = M.empty + , lockpool = M.empty + , flags = M.empty + , fields = M.empty + , modmeta = [] + , cleanup = M.empty + , inodeschanged = Nothing + , useragent = Nothing + , errcounter = 0 + , unusedkeys = Nothing + , quviversion = Nothing + , existinghooks = M.empty + , desktopnotify = mempty + } + +{- Makes an Annex state object for the specified git repo. + - Ensures the config is read, if it was not already. -} +new :: Git.Repo -> IO AnnexState +new r = do + r' <- Git.Config.read r + let c = extractGitConfig r' + newState c <$> if annexDirect c then fixupDirect r' else return r' + +{- Performs an action in the Annex monad from a starting state, + - returning a new state. -} +run :: AnnexState -> Annex a -> IO (a, AnnexState) +run s a = do + mvar <- newMVar s + r <- runReaderT (runAnnex a) mvar + s' <- takeMVar mvar + return (r, s') + +{- Performs an action in the Annex monad from a starting state, + - and throws away the new state. -} +eval :: AnnexState -> Annex a -> IO a +eval s a = do + mvar <- newMVar s + runReaderT (runAnnex a) mvar + +getState :: (AnnexState -> v) -> Annex v +getState selector = do + mvar <- ask + s <- liftIO $ readMVar mvar + return $ selector s + +changeState :: (AnnexState -> AnnexState) -> Annex () +changeState modifier = do + mvar <- ask + liftIO $ modifyMVar_ mvar $ return . modifier + +{- Sets a flag to True -} +setFlag :: String -> Annex () +setFlag flag = changeState $ \s -> + s { flags = M.insertWith' const flag True $ flags s } + +{- Sets a field to a value -} +setField :: String -> String -> Annex () +setField field value = changeState $ \s -> + s { fields = M.insertWith' const field value $ fields s } + +{- Adds a cleanup action to perform. -} +addCleanup :: CleanupAction -> Annex () -> Annex () +addCleanup k a = changeState $ \s -> + s { cleanup = M.insertWith' const k a $ cleanup s } + +{- Sets the type of output to emit. -} +setOutput :: OutputType -> Annex () +setOutput o = changeState $ \s -> + s { output = (output s) { outputType = o } } + +{- Checks if a flag was set. -} +getFlag :: String -> Annex Bool +getFlag flag = fromMaybe False . M.lookup flag <$> getState flags + +{- Gets the value of a field. -} +getField :: String -> Annex (Maybe String) +getField field = M.lookup field <$> getState fields + +{- Returns the annex's git repository. -} +gitRepo :: Annex Git.Repo +gitRepo = getState repo + +{- Runs an IO action in the annex's git repository. -} +inRepo :: (Git.Repo -> IO a) -> Annex a +inRepo a = liftIO . a =<< gitRepo + +{- Extracts a value from the annex's git repisitory. -} +fromRepo :: (Git.Repo -> a) -> Annex a +fromRepo a = a <$> gitRepo + +{- Calculates a value from an annex's git repository and its GitConfig. -} +calcRepo :: (Git.Repo -> GitConfig -> IO a) -> Annex a +calcRepo a = do + s <- getState id + liftIO $ a (repo s) (gitconfig s) + +{- Gets the GitConfig settings. -} +getGitConfig :: Annex GitConfig +getGitConfig = getState gitconfig + +{- Modifies a GitConfig setting. -} +changeGitConfig :: (GitConfig -> GitConfig) -> Annex () +changeGitConfig a = changeState $ \s -> s { gitconfig = a (gitconfig s) } + +{- Changing the git Repo data also involves re-extracting its GitConfig. -} +changeGitRepo :: Git.Repo -> Annex () +changeGitRepo r = changeState $ \s -> s + { repo = r + , gitconfig = extractGitConfig r + } + +{- Converts an Annex action into an IO action, that runs with a copy + - of the current Annex state. + - + - Use with caution; the action should not rely on changing the + - state, as it will be thrown away. -} +withCurrentState :: Annex a -> Annex (IO a) +withCurrentState a = do + s <- getState id + return $ eval s a diff --git a/Annex/AutoMerge.hs b/Annex/AutoMerge.hs new file mode 100644 index 0000000000..2ed26b78fa --- /dev/null +++ b/Annex/AutoMerge.hs @@ -0,0 +1,179 @@ +{- git-annex automatic merge conflict resolution + - + - Copyright 2012-2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Annex.AutoMerge (autoMergeFrom) where + +import Common.Annex +import qualified Annex.Queue +import Annex.Direct +import Annex.CatFile +import Annex.Link +import qualified Git.Command +import qualified Git.LsFiles as LsFiles +import qualified Git.UpdateIndex as UpdateIndex +import qualified Git.Merge +import qualified Git.Ref +import qualified Git.Sha +import qualified Git +import Git.Types (BlobType(..)) +import Config +import Annex.ReplaceFile +import Git.FileMode +import Annex.VariantFile + +import qualified Data.Set as S + +{- Merges from a branch into the current branch + - (which may not exist yet), + - with automatic merge conflict resolution. -} +autoMergeFrom :: Git.Ref -> (Maybe Git.Ref) -> Annex Bool +autoMergeFrom branch currbranch = do + showOutput + case currbranch of + Nothing -> go Nothing + Just b -> go =<< inRepo (Git.Ref.sha b) + where + go old = ifM isDirect + ( do + d <- fromRepo gitAnnexMergeDir + r <- inRepo (mergeDirect d branch) + <||> resolveMerge old branch + mergeDirectCleanup d (fromMaybe Git.Sha.emptyTree old) Git.Ref.headRef + return r + , inRepo (Git.Merge.mergeNonInteractive branch) + <||> resolveMerge old branch + ) + +{- Resolves a conflicted merge. It's important that any conflicts be + - resolved in a way that itself avoids later merge conflicts, since + - multiple repositories may be doing this concurrently. + - + - Only merge conflicts where at least one side is an annexed file + - is resolved. + - + - This uses the Keys pointed to by the files to construct new + - filenames. So when both sides modified annexed file foo, + - it will be deleted, and replaced with files foo.variant-A and + - foo.variant-B. + - + - On the other hand, when one side deleted foo, and the other modified it, + - it will be deleted, and the modified version stored as file + - foo.variant-A (or B). + - + - It's also possible that one side has foo as an annexed file, and + - the other as a directory or non-annexed file. The annexed file + - is renamed to resolve the merge, and the other object is preserved as-is. + - + - In indirect mode, the merge is resolved in the work tree and files + - staged, to clean up from a conflicted merge that was run in the work + - tree. In direct mode, the work tree is not touched here; files are + - staged to the index, and written to the gitAnnexMergeDir, and later + - mergeDirectCleanup handles updating the work tree. + -} +resolveMerge :: Maybe Git.Ref -> Git.Ref -> Annex Bool +resolveMerge us them = do + top <- fromRepo Git.repoPath + (fs, cleanup) <- inRepo (LsFiles.unmerged [top]) + mergedfs <- catMaybes <$> mapM (resolveMerge' us them) fs + let merged = not (null mergedfs) + void $ liftIO cleanup + + unlessM isDirect $ do + (deleted, cleanup2) <- inRepo (LsFiles.deleted [top]) + unless (null deleted) $ + Annex.Queue.addCommand "rm" [Params "--quiet -f --"] deleted + void $ liftIO cleanup2 + + when merged $ do + unlessM isDirect $ + cleanConflictCruft mergedfs top + Annex.Queue.flush + whenM isDirect $ + void preCommitDirect + void $ inRepo $ Git.Command.runBool + [ Param "commit" + , Param "--no-verify" + , Param "-m" + , Param "git-annex automatic merge conflict fix" + ] + showLongNote "Merge conflict was automatically resolved; you may want to examine the result." + return merged + +resolveMerge' :: Maybe Git.Ref -> Git.Ref -> LsFiles.Unmerged -> Annex (Maybe FilePath) +resolveMerge' Nothing _ _ = return Nothing +resolveMerge' (Just us) them u = do + kus <- getkey LsFiles.valUs LsFiles.valUs + kthem <- getkey LsFiles.valThem LsFiles.valThem + case (kus, kthem) of + -- Both sides of conflict are annexed files + (Just keyUs, Just keyThem) + | keyUs /= keyThem -> resolveby $ do + makelink keyUs + makelink keyThem + | otherwise -> resolveby $ + makelink keyUs + -- Our side is annexed file, other side is not. + (Just keyUs, Nothing) -> resolveby $ do + graftin them file + makelink keyUs + -- Our side is not annexed file, other side is. + (Nothing, Just keyThem) -> resolveby $ do + graftin us file + makelink keyThem + -- Neither side is annexed file; cannot resolve. + (Nothing, Nothing) -> return Nothing + where + file = LsFiles.unmergedFile u + + getkey select select' + | select (LsFiles.unmergedBlobType u) == Just SymlinkBlob = + case select' (LsFiles.unmergedSha u) of + Nothing -> return Nothing + Just sha -> catKey sha symLinkMode + | otherwise = return Nothing + + makelink key = do + let dest = variantFile file key + l <- inRepo $ gitAnnexLink dest key + ifM isDirect + ( do + d <- fromRepo gitAnnexMergeDir + replaceFile (d dest) $ makeAnnexLink l + , replaceFile dest $ makeAnnexLink l + ) + stageSymlink dest =<< hashSymlink l + + {- stage a graft of a directory or file from a branch -} + graftin b item = Annex.Queue.addUpdateIndex + =<< fromRepo (UpdateIndex.lsSubTree b item) + + resolveby a = do + {- Remove conflicted file from index so merge can be resolved. -} + Annex.Queue.addCommand "rm" [Params "--quiet -f --cached --"] [file] + void a + return (Just file) + +{- git-merge moves conflicting files away to files + - named something like f~HEAD or f~branch, but the + - exact name chosen can vary. Once the conflict is resolved, + - this cruft can be deleted. To avoid deleting legitimate + - files that look like this, only delete files that are + - A) not staged in git and B) look like git-annex symlinks. + -} +cleanConflictCruft :: [FilePath] -> FilePath -> Annex () +cleanConflictCruft resolvedfs top = do + (fs, cleanup) <- inRepo $ LsFiles.notInRepo False [top] + mapM_ clean fs + void $ liftIO cleanup + where + clean f + | matchesresolved f = whenM (isJust <$> isAnnexLink f) $ + liftIO $ nukeFile f + | otherwise = noop + s = S.fromList resolvedfs + matchesresolved f = S.member (base f) s + base f = reverse $ drop 1 $ dropWhile (/= '~') $ reverse f diff --git a/Annex/Branch.hs b/Annex/Branch.hs new file mode 100644 index 0000000000..94c4c029c4 --- /dev/null +++ b/Annex/Branch.hs @@ -0,0 +1,516 @@ +{- management of the git-annex branch + - + - Copyright 2011-2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Annex.Branch ( + fullname, + name, + hasOrigin, + hasSibling, + siblingBranches, + create, + update, + forceUpdate, + updateTo, + get, + getHistorical, + change, + commit, + forceCommit, + files, + withIndex, + performTransitions, +) where + +import qualified Data.ByteString.Lazy.Char8 as L +import qualified Data.Set as S +import qualified Data.Map as M + +import Common.Annex +import Annex.BranchState +import Annex.Journal +import Annex.Index +import qualified Git +import qualified Git.Command +import qualified Git.Ref +import qualified Git.Sha +import qualified Git.Branch +import qualified Git.UnionMerge +import qualified Git.UpdateIndex +import Git.HashObject +import Git.Types +import Git.FilePath +import Annex.CatFile +import Annex.Perms +import Logs +import Logs.Transitions +import Logs.Trust.Pure +import Annex.ReplaceFile +import qualified Annex.Queue +import Annex.Branch.Transitions + +{- Name of the branch that is used to store git-annex's information. -} +name :: Git.Ref +name = Git.Ref "git-annex" + +{- Fully qualified name of the branch. -} +fullname :: Git.Ref +fullname = Git.Ref $ "refs/heads/" ++ fromRef name + +{- Branch's name in origin. -} +originname :: Git.Ref +originname = Git.Ref $ "origin/" ++ fromRef name + +{- Does origin/git-annex exist? -} +hasOrigin :: Annex Bool +hasOrigin = inRepo $ Git.Ref.exists originname + +{- Does the git-annex branch or a sibling foo/git-annex branch exist? -} +hasSibling :: Annex Bool +hasSibling = not . null <$> siblingBranches + +{- List of git-annex (refs, branches), including the main one and any + - from remotes. Duplicate refs are filtered out. -} +siblingBranches :: Annex [(Git.Ref, Git.Branch)] +siblingBranches = inRepo $ Git.Ref.matchingUniq [name] + +{- Creates the branch, if it does not already exist. -} +create :: Annex () +create = void getBranch + +{- Returns the ref of the branch, creating it first if necessary. -} +getBranch :: Annex Git.Ref +getBranch = maybe (hasOrigin >>= go >>= use) return =<< branchsha + where + go True = do + inRepo $ Git.Command.run + [Param "branch", Param $ fromRef name, Param $ fromRef originname] + fromMaybe (error $ "failed to create " ++ fromRef name) + <$> branchsha + go False = withIndex' True $ + inRepo $ Git.Branch.commitAlways "branch created" fullname [] + use sha = do + setIndexSha sha + return sha + branchsha = inRepo $ Git.Ref.sha fullname + +{- Ensures that the branch and index are up-to-date; should be + - called before data is read from it. Runs only once per git-annex run. -} +update :: Annex () +update = runUpdateOnce $ void $ updateTo =<< siblingBranches + +{- Forces an update even if one has already been run. -} +forceUpdate :: Annex Bool +forceUpdate = updateTo =<< siblingBranches + +{- Merges the specified Refs into the index, if they have any changes not + - already in it. The Branch names are only used in the commit message; + - it's even possible that the provided Branches have not been updated to + - point to the Refs yet. + - + - The branch is fast-forwarded if possible, otherwise a merge commit is + - made. + - + - Before Refs are merged into the index, it's important to first stage the + - journal into the index. Otherwise, any changes in the journal would + - later get staged, and might overwrite changes made during the merge. + - This is only done if some of the Refs do need to be merged. + - + - Also handles performing any Transitions that have not yet been + - performed, in either the local branch, or the Refs. + - + - Returns True if any refs were merged in, False otherwise. + -} +updateTo :: [(Git.Ref, Git.Branch)] -> Annex Bool +updateTo pairs = do + -- ensure branch exists, and get its current ref + branchref <- getBranch + dirty <- journalDirty + ignoredrefs <- getIgnoredRefs + (refs, branches) <- unzip <$> filterM (isnewer ignoredrefs) pairs + if null refs + {- Even when no refs need to be merged, the index + - may still be updated if the branch has gotten ahead + - of the index. -} + then whenM (needUpdateIndex branchref) $ lockJournal $ \jl -> do + forceUpdateIndex jl branchref + {- When there are journalled changes + - as well as the branch being updated, + - a commit needs to be done. -} + when dirty $ + go branchref True [] [] jl + else lockJournal $ go branchref dirty refs branches + return $ not $ null refs + where + isnewer ignoredrefs (r, _) + | S.member r ignoredrefs = return False + | otherwise = inRepo $ Git.Branch.changed fullname r + go branchref dirty refs branches jl = withIndex $ do + cleanjournal <- if dirty then stageJournal jl else return noop + let merge_desc = if null branches + then "update" + else "merging " ++ + unwords (map Git.Ref.describe branches) ++ + " into " ++ fromRef name + localtransitions <- parseTransitionsStrictly "local" + <$> getLocal transitionsLog + unless (null branches) $ do + showSideAction merge_desc + mergeIndex jl refs + let commitrefs = nub $ fullname:refs + unlessM (handleTransitions jl localtransitions commitrefs) $ do + ff <- if dirty + then return False + else inRepo $ Git.Branch.fastForward fullname refs + if ff + then updateIndex jl branchref + else commitIndex jl branchref merge_desc commitrefs + liftIO cleanjournal + +{- Gets the content of a file, which may be in the journal, or in the index + - (and committed to the branch). + - + - Updates the branch if necessary, to ensure the most up-to-date available + - content is returned. + - + - Returns an empty string if the file doesn't exist yet. -} +get :: FilePath -> Annex String +get file = do + update + getLocal file + +{- Like get, but does not merge the branch, so the info returned may not + - reflect changes in remotes. + - (Changing the value this returns, and then merging is always the + - same as using get, and then changing its value.) -} +getLocal :: FilePath -> Annex String +getLocal file = go =<< getJournalFileStale file + where + go (Just journalcontent) = return journalcontent + go Nothing = getRaw file + +getRaw :: FilePath -> Annex String +getRaw = getRef fullname + +getHistorical :: RefDate -> FilePath -> Annex String +getHistorical date = getRef (Git.Ref.dateRef fullname date) + +getRef :: Ref -> FilePath -> Annex String +getRef ref file = withIndex $ L.unpack <$> catFile ref file + +{- Applies a function to modifiy the content of a file. + - + - Note that this does not cause the branch to be merged, it only + - modifes the current content of the file on the branch. + -} +change :: FilePath -> (String -> String) -> Annex () +change file a = lockJournal $ \jl -> a <$> getLocal file >>= set jl file + +{- Records new content of a file into the journal -} +set :: JournalLocked -> FilePath -> String -> Annex () +set = setJournalFile + +{- Stages the journal, and commits staged changes to the branch. -} +commit :: String -> Annex () +commit = whenM journalDirty . forceCommit + +{- Commits the current index to the branch even without any journalleda + - changes. -} +forceCommit :: String -> Annex () +forceCommit message = lockJournal $ \jl -> do + cleanjournal <- stageJournal jl + ref <- getBranch + withIndex $ commitIndex jl ref message [fullname] + liftIO cleanjournal + +{- Commits the staged changes in the index to the branch. + - + - Ensures that the branch's index file is first updated to the state + - of the branch at branchref, before running the commit action. This + - is needed because the branch may have had changes pushed to it, that + - are not yet reflected in the index. + - + - Also safely handles a race that can occur if a change is being pushed + - into the branch at the same time. When the race happens, the commit will + - be made on top of the newly pushed change, but without the index file + - being updated to include it. The result is that the newly pushed + - change is reverted. This race is detected and another commit made + - to fix it. + - + - The branchref value can have been obtained using getBranch at any + - previous point, though getting it a long time ago makes the race + - more likely to occur. + -} +commitIndex :: JournalLocked -> Git.Ref -> String -> [Git.Ref] -> Annex () +commitIndex jl branchref message parents = do + showStoringStateAction + commitIndex' jl branchref message parents +commitIndex' :: JournalLocked -> Git.Ref -> String -> [Git.Ref] -> Annex () +commitIndex' jl branchref message parents = do + updateIndex jl branchref + committedref <- inRepo $ Git.Branch.commitAlways message fullname parents + setIndexSha committedref + parentrefs <- commitparents <$> catObject committedref + when (racedetected branchref parentrefs) $ + fixrace committedref parentrefs + where + -- look for "parent ref" lines and return the refs + commitparents = map (Git.Ref . snd) . filter isparent . + map (toassoc . L.unpack) . L.lines + toassoc = separate (== ' ') + isparent (k,_) = k == "parent" + + {- The race can be detected by checking the commit's + - parent, which will be the newly pushed branch, + - instead of the expected ref that the index was updated to. -} + racedetected expectedref parentrefs + | expectedref `elem` parentrefs = False -- good parent + | otherwise = True -- race! + + {- To recover from the race, union merge the lost refs + - into the index, and recommit on top of the bad commit. -} + fixrace committedref lostrefs = do + mergeIndex jl lostrefs + commitIndex jl committedref racemessage [committedref] + + racemessage = message ++ " (recovery from race)" + +{- Lists all files on the branch. There may be duplicates in the list. -} +files :: Annex [FilePath] +files = do + update + (++) + <$> branchFiles + <*> getJournalledFilesStale + +{- Files in the branch, not including any from journalled changes, + - and without updating the branch. -} +branchFiles :: Annex [FilePath] +branchFiles = withIndex $ inRepo $ Git.Command.pipeNullSplitZombie + [ Params "ls-tree --name-only -r -z" + , Param $ fromRef fullname + ] + +{- Populates the branch's index file with the current branch contents. + - + - This is only done when the index doesn't yet exist, and the index + - is used to build up changes to be commited to the branch, and merge + - in changes from other branches. + -} +genIndex :: Git.Repo -> IO () +genIndex g = Git.UpdateIndex.streamUpdateIndex g + [Git.UpdateIndex.lsTree fullname g] + +{- Merges the specified refs into the index. + - Any changes staged in the index will be preserved. -} +mergeIndex :: JournalLocked -> [Git.Ref] -> Annex () +mergeIndex jl branches = do + prepareModifyIndex jl + h <- catFileHandle + inRepo $ \g -> Git.UnionMerge.mergeIndex h g branches + +{- Removes any stale git lock file, to avoid git falling over when + - updating the index. + - + - Since all modifications of the index are performed inside this module, + - and only when the journal is locked, the fact that the journal has to be + - locked when this is called ensures that no other process is currently + - modifying the index. So any index.lock file must be stale, caused + - by git running when the system crashed, or the repository's disk was + - removed, etc. + -} +prepareModifyIndex :: JournalLocked -> Annex () +prepareModifyIndex _jl = do + index <- fromRepo gitAnnexIndex + void $ liftIO $ tryIO $ removeFile $ index ++ ".lock" + +{- Runs an action using the branch's index file. -} +withIndex :: Annex a -> Annex a +withIndex = withIndex' False +withIndex' :: Bool -> Annex a -> Annex a +withIndex' bootstrapping a = do + f <- fromRepo gitAnnexIndex + withIndexFile f $ do + checkIndexOnce $ unlessM (liftIO $ doesFileExist f) $ do + unless bootstrapping create + createAnnexDirectory $ takeDirectory f + unless bootstrapping $ inRepo genIndex + a + +{- Updates the branch's index to reflect the current contents of the branch. + - Any changes staged in the index will be preserved. + - + - Compares the ref stored in the lock file with the current + - ref of the branch to see if an update is needed. + -} +updateIndex :: JournalLocked -> Git.Ref -> Annex () +updateIndex jl branchref = whenM (needUpdateIndex branchref) $ + forceUpdateIndex jl branchref + +forceUpdateIndex :: JournalLocked -> Git.Ref -> Annex () +forceUpdateIndex jl branchref = do + withIndex $ mergeIndex jl [fullname] + setIndexSha branchref + +{- Checks if the index needs to be updated. -} +needUpdateIndex :: Git.Ref -> Annex Bool +needUpdateIndex branchref = do + f <- fromRepo gitAnnexIndexStatus + committedref <- Git.Ref . firstLine <$> + liftIO (catchDefaultIO "" $ readFileStrict f) + return (committedref /= branchref) + +{- Record that the branch's index has been updated to correspond to a + - given ref of the branch. -} +setIndexSha :: Git.Ref -> Annex () +setIndexSha ref = do + f <- fromRepo gitAnnexIndexStatus + liftIO $ writeFile f $ fromRef ref ++ "\n" + setAnnexFilePerm f + +{- Stages the journal into the index and returns an action that will + - clean up the staged journal files, which should only be run once + - the index has been committed to the branch. + - + - Before staging, this removes any existing git index file lock. + - This is safe to do because stageJournal is the only thing that + - modifies this index file, and only one can run at a time, because + - the journal is locked. So any existing git index file lock must be + - stale, and the journal must contain any data that was in the process + - of being written to the index file when it crashed. + -} +stageJournal :: JournalLocked -> Annex (IO ()) +stageJournal jl = withIndex $ do + prepareModifyIndex jl + g <- gitRepo + let dir = gitAnnexJournalDir g + fs <- getJournalFiles jl + liftIO $ do + h <- hashObjectStart g + Git.UpdateIndex.streamUpdateIndex g + [genstream dir h fs] + hashObjectStop h + return $ liftIO $ mapM_ (removeFile . (dir )) fs + where + genstream dir h fs streamer = forM_ fs $ \file -> do + let path = dir file + sha <- hashFile h path + streamer $ Git.UpdateIndex.updateIndexLine + sha FileBlob (asTopFilePath $ fileJournal file) + +{- This is run after the refs have been merged into the index, + - but before the result is committed to the branch. + - (Which is why it's passed the contents of the local branches's + - transition log before that merge took place.) + - + - When the refs contain transitions that have not yet been done locally, + - the transitions are performed on the index, and a new branch + - is created from the result. + - + - When there are transitions recorded locally that have not been done + - to the remote refs, the transitions are performed in the index, + - and committed to the existing branch. In this case, the untransitioned + - remote refs cannot be merged into the branch (since transitions + - throw away history), so they are added to the list of refs to ignore, + - to avoid re-merging content from them again. + -} +handleTransitions :: JournalLocked -> Transitions -> [Git.Ref] -> Annex Bool +handleTransitions jl localts refs = do + m <- M.fromList <$> mapM getreftransition refs + let remotets = M.elems m + if all (localts ==) remotets + then return False + else do + let allts = combineTransitions (localts:remotets) + let (transitionedrefs, untransitionedrefs) = + partition (\r -> M.lookup r m == Just allts) refs + performTransitionsLocked jl allts (localts /= allts) transitionedrefs + ignoreRefs untransitionedrefs + return True + where + getreftransition ref = do + ts <- parseTransitionsStrictly "remote" . L.unpack + <$> catFile ref transitionsLog + return (ref, ts) + +ignoreRefs :: [Git.Ref] -> Annex () +ignoreRefs rs = do + old <- getIgnoredRefs + let s = S.unions [old, S.fromList rs] + f <- fromRepo gitAnnexIgnoredRefs + replaceFile f $ \tmp -> liftIO $ writeFile tmp $ + unlines $ map fromRef $ S.elems s + +getIgnoredRefs :: Annex (S.Set Git.Ref) +getIgnoredRefs = S.fromList . mapMaybe Git.Sha.extractSha . lines <$> content + where + content = do + f <- fromRepo gitAnnexIgnoredRefs + liftIO $ catchDefaultIO "" $ readFile f + +{- Performs the specified transitions on the contents of the index file, + - commits it to the branch, or creates a new branch. + -} +performTransitions :: Transitions -> Bool -> [Ref] -> Annex () +performTransitions ts neednewlocalbranch transitionedrefs = lockJournal $ \jl -> + performTransitionsLocked jl ts neednewlocalbranch transitionedrefs +performTransitionsLocked :: JournalLocked -> Transitions -> Bool -> [Ref] -> Annex () +performTransitionsLocked jl ts neednewlocalbranch transitionedrefs = do + -- For simplicity & speed, we're going to use the Annex.Queue to + -- update the git-annex branch, while it usually holds changes + -- for the head branch. Flush any such changes. + Annex.Queue.flush + withIndex $ do + prepareModifyIndex jl + run $ mapMaybe getTransitionCalculator $ transitionList ts + Annex.Queue.flush + if neednewlocalbranch + then do + committedref <- inRepo $ Git.Branch.commitAlways message fullname transitionedrefs + setIndexSha committedref + else do + ref <- getBranch + commitIndex jl ref message (nub $ fullname:transitionedrefs) + where + message + | neednewlocalbranch && null transitionedrefs = "new branch for transition " ++ tdesc + | otherwise = "continuing transition " ++ tdesc + tdesc = show $ map describeTransition $ transitionList ts + + {- The changes to make to the branch are calculated and applied to + - the branch directly, rather than going through the journal, + - which would be innefficient. (And the journal is not designed + - to hold changes to every file in the branch at once.) + - + - When a file in the branch is changed by transition code, + - that value is remembered and fed into the code for subsequent + - transitions. + -} + run [] = noop + run changers = do + trustmap <- calcTrustMap <$> getRaw trustLog + fs <- branchFiles + hasher <- inRepo hashObjectStart + forM_ fs $ \f -> do + content <- getRaw f + apply changers hasher f content trustmap + liftIO $ hashObjectStop hasher + apply [] _ _ _ _ = return () + apply (changer:rest) hasher file content trustmap = + case changer file content trustmap of + RemoveFile -> do + Annex.Queue.addUpdateIndex + =<< inRepo (Git.UpdateIndex.unstageFile file) + -- File is deleted; can't run any other + -- transitions on it. + return () + ChangeFile content' -> do + sha <- inRepo $ hashObject BlobObject content' + Annex.Queue.addUpdateIndex $ Git.UpdateIndex.pureStreamer $ + Git.UpdateIndex.updateIndexLine sha FileBlob (asTopFilePath file) + apply rest hasher file content' trustmap + PreserveFile -> + apply rest hasher file content trustmap diff --git a/Annex/Branch/Transitions.hs b/Annex/Branch/Transitions.hs new file mode 100644 index 0000000000..5c2c145484 --- /dev/null +++ b/Annex/Branch/Transitions.hs @@ -0,0 +1,60 @@ +{- git-annex branch transitions + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Annex.Branch.Transitions ( + FileTransition(..), + getTransitionCalculator +) where + +import Logs +import Logs.Transitions +import Logs.UUIDBased as UUIDBased +import Logs.Presence.Pure as Presence +import Types.TrustLevel +import Types.UUID + +import qualified Data.Map as M + +data FileTransition + = ChangeFile String + | RemoveFile + | PreserveFile + +type TransitionCalculator = FilePath -> String -> TrustMap -> FileTransition + +getTransitionCalculator :: Transition -> Maybe TransitionCalculator +getTransitionCalculator ForgetGitHistory = Nothing +getTransitionCalculator ForgetDeadRemotes = Just dropDead + +dropDead :: FilePath -> String -> TrustMap -> FileTransition +dropDead f content trustmap = case getLogVariety f of + Just UUIDBasedLog + -- Don't remove the dead repo from the trust log, + -- because git remotes may still exist, and they need + -- to still know it's dead. + | f == trustLog -> PreserveFile + | otherwise -> ChangeFile $ UUIDBased.showLog id $ dropDeadFromUUIDBasedLog trustmap $ UUIDBased.parseLog Just content + Just NewUUIDBasedLog -> ChangeFile $ + UUIDBased.showLogNew id $ dropDeadFromUUIDBasedLog trustmap $ UUIDBased.parseLogNew Just content + Just (PresenceLog _) -> + let newlog = Presence.compactLog $ dropDeadFromPresenceLog trustmap $ Presence.parseLog content + in if null newlog + then RemoveFile + else ChangeFile $ Presence.showLog newlog + Just OtherLog -> PreserveFile + Nothing -> PreserveFile + +dropDeadFromUUIDBasedLog :: TrustMap -> UUIDBased.Log String -> UUIDBased.Log String +dropDeadFromUUIDBasedLog trustmap = M.filterWithKey $ notDead trustmap . const + +{- Presence logs can contain UUIDs or other values. Any line that matches + - a dead uuid is dropped; any other values are passed through. -} +dropDeadFromPresenceLog :: TrustMap -> [Presence.LogLine] -> [Presence.LogLine] +dropDeadFromPresenceLog trustmap = filter $ notDead trustmap (toUUID . Presence.info) + +notDead :: TrustMap -> (v -> UUID) -> v -> Bool +notDead trustmap a v = M.findWithDefault SemiTrusted (a v) trustmap /= DeadTrusted diff --git a/Annex/BranchState.hs b/Annex/BranchState.hs new file mode 100644 index 0000000000..9b2f9a04c5 --- /dev/null +++ b/Annex/BranchState.hs @@ -0,0 +1,43 @@ +{- git-annex branch state management + - + - Runtime state about the git-annex branch. + - + - Copyright 2011-2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Annex.BranchState where + +import Common.Annex +import Types.BranchState +import qualified Annex + +getState :: Annex BranchState +getState = Annex.getState Annex.branchstate + +setState :: BranchState -> Annex () +setState state = Annex.changeState $ \s -> s { Annex.branchstate = state } + +changeState :: (BranchState -> BranchState) -> Annex () +changeState changer = setState =<< changer <$> getState + +{- Runs an action to check that the index file exists, if it's not been + - checked before in this run of git-annex. -} +checkIndexOnce :: Annex () -> Annex () +checkIndexOnce a = unlessM (indexChecked <$> getState) $ do + a + changeState $ \s -> s { indexChecked = True } + +{- Runs an action to update the branch, if it's not been updated before + - in this run of git-annex. -} +runUpdateOnce :: Annex () -> Annex () +runUpdateOnce a = unlessM (branchUpdated <$> getState) $ do + a + disableUpdate + +{- Avoids updating the branch. A useful optimisation when the branch + - is known to have not changed, or git-annex won't be relying on info + - from it. -} +disableUpdate :: Annex () +disableUpdate = changeState $ \s -> s { branchUpdated = True } diff --git a/Annex/CatFile.hs b/Annex/CatFile.hs new file mode 100644 index 0000000000..6a778db039 --- /dev/null +++ b/Annex/CatFile.hs @@ -0,0 +1,144 @@ +{- git cat-file interface, with handle automatically stored in the Annex monad + - + - Copyright 2011-2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Annex.CatFile ( + catFile, + catFileDetails, + catObject, + catTree, + catObjectDetails, + catFileHandle, + catKey, + catKeyFile, + catKeyFileHEAD, +) where + +import qualified Data.ByteString.Lazy as L +import qualified Data.Map as M +import System.PosixCompat.Types + +import Common.Annex +import qualified Git +import qualified Git.CatFile +import qualified Annex +import Git.Types +import Git.FilePath +import Git.FileMode +import qualified Git.Ref + +catFile :: Git.Branch -> FilePath -> Annex L.ByteString +catFile branch file = do + h <- catFileHandle + liftIO $ Git.CatFile.catFile h branch file + +catFileDetails :: Git.Branch -> FilePath -> Annex (Maybe (L.ByteString, Sha, ObjectType)) +catFileDetails branch file = do + h <- catFileHandle + liftIO $ Git.CatFile.catFileDetails h branch file + +catObject :: Git.Ref -> Annex L.ByteString +catObject ref = do + h <- catFileHandle + liftIO $ Git.CatFile.catObject h ref + +catTree :: Git.Ref -> Annex [(FilePath, FileMode)] +catTree ref = do + h <- catFileHandle + liftIO $ Git.CatFile.catTree h ref + +catObjectDetails :: Git.Ref -> Annex (Maybe (L.ByteString, Sha, ObjectType)) +catObjectDetails ref = do + h <- catFileHandle + liftIO $ Git.CatFile.catObjectDetails h ref + +{- There can be multiple index files, and a different cat-file is needed + - for each. This is selected by setting GIT_INDEX_FILE in the gitEnv. -} +catFileHandle :: Annex Git.CatFile.CatFileHandle +catFileHandle = do + m <- Annex.getState Annex.catfilehandles + indexfile <- fromMaybe "" . maybe Nothing (lookup "GIT_INDEX_FILE") + <$> fromRepo gitEnv + case M.lookup indexfile m of + Just h -> return h + Nothing -> do + h <- inRepo Git.CatFile.catFileStart + let m' = M.insert indexfile h m + Annex.changeState $ \s -> s { Annex.catfilehandles = m' } + return h + +{- From the Sha or Ref of a symlink back to the key. + - + - Requires a mode witness, to guarantee that the file is a symlink. + -} +catKey :: Ref -> FileMode -> Annex (Maybe Key) +catKey = catKey' True + +catKey' :: Bool -> Ref -> FileMode -> Annex (Maybe Key) +catKey' modeguaranteed ref mode + | isSymLink mode = do + l <- fromInternalGitPath . decodeBS <$> get + return $ if isLinkToAnnex l + then fileKey $ takeFileName l + else Nothing + | otherwise = return Nothing + where + -- If the mode is not guaranteed to be correct, avoid + -- buffering the whole file content, which might be large. + -- 8192 is enough if it really is a symlink. + get + | modeguaranteed = catObject ref + | otherwise = L.take 8192 <$> catObject ref + +{- Looks up the key corresponding to the Ref using the running cat-file. + - + - Currently this always has to look in HEAD, because cat-file --batch + - does not offer a way to specify that we want to look up a tree object + - in the index. So if the index has a file staged not as a symlink, + - and it is a symlink in head, the wrong mode is gotten. + - Also, we have to assume the file is a symlink if it's not yet committed + - to HEAD. For these reasons, modeguaranteed is not set. + -} +catKeyChecked :: Bool -> Ref -> Annex (Maybe Key) +catKeyChecked needhead ref@(Ref r) = + catKey' False ref =<< findmode <$> catTree treeref + where + pathparts = split "/" r + dir = intercalate "/" $ take (length pathparts - 1) pathparts + file = fromMaybe "" $ lastMaybe pathparts + treeref = Ref $ if needhead then "HEAD" ++ dir ++ "/" else dir ++ "/" + findmode = fromMaybe symLinkMode . headMaybe . + map snd . filter (\p -> fst p == file) + +{- From a file in the repository back to the key. + - + - Ideally, this should reflect the key that's staged in the index, + - not the key that's committed to HEAD. Unfortunately, git cat-file + - does not refresh the index file after it's started up, so things + - newly staged in the index won't show up. It does, however, notice + - when branches change. + - + - For command-line git-annex use, that doesn't matter. It's perfectly + - reasonable for things staged in the index after the currently running + - git-annex process to not be noticed by it. However, we do want to see + - what's in the index, since it may have uncommitted changes not in HEAD + - + - For the assistant, this is much more of a problem, since it commits + - files and then needs to be able to immediately look up their keys. + - OTOH, the assistant doesn't keep changes staged in the index for very + - long at all before committing them -- and it won't look at the keys + - of files until after committing them. + - + - So, this gets info from the index, unless running as a daemon. + -} +catKeyFile :: FilePath -> Annex (Maybe Key) +catKeyFile f = ifM (Annex.getState Annex.daemon) + ( catKeyFileHEAD f + , catKeyChecked True $ Git.Ref.fileRef f + ) + +catKeyFileHEAD :: FilePath -> Annex (Maybe Key) +catKeyFileHEAD f = catKeyChecked False $ Git.Ref.fileFromRef Git.Ref.headRef f diff --git a/Annex/CheckAttr.hs b/Annex/CheckAttr.hs new file mode 100644 index 0000000000..8eed9e804c --- /dev/null +++ b/Annex/CheckAttr.hs @@ -0,0 +1,35 @@ +{- git check-attr interface, with handle automatically stored in the Annex monad + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Annex.CheckAttr ( + checkAttr, + checkAttrHandle +) where + +import Common.Annex +import qualified Git.CheckAttr as Git +import qualified Annex + +{- All gitattributes used by git-annex. -} +annexAttrs :: [Git.Attr] +annexAttrs = + [ "annex.backend" + , "annex.numcopies" + ] + +checkAttr :: Git.Attr -> FilePath -> Annex String +checkAttr attr file = do + h <- checkAttrHandle + liftIO $ Git.checkAttr h attr file + +checkAttrHandle :: Annex Git.CheckAttrHandle +checkAttrHandle = maybe startup return =<< Annex.getState Annex.checkattrhandle + where + startup = do + h <- inRepo $ Git.checkAttrStart annexAttrs + Annex.changeState $ \s -> s { Annex.checkattrhandle = Just h } + return h diff --git a/Annex/CheckIgnore.hs b/Annex/CheckIgnore.hs new file mode 100644 index 0000000000..d45e652bcb --- /dev/null +++ b/Annex/CheckIgnore.hs @@ -0,0 +1,32 @@ +{- git check-ignore interface, with handle automatically stored in + - the Annex monad + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Annex.CheckIgnore ( + checkIgnored, + checkIgnoreHandle +) where + +import Common.Annex +import qualified Git.CheckIgnore as Git +import qualified Annex + +checkIgnored :: FilePath -> Annex Bool +checkIgnored file = go =<< checkIgnoreHandle + where + go Nothing = return False + go (Just h) = liftIO $ Git.checkIgnored h file + +checkIgnoreHandle :: Annex (Maybe Git.CheckIgnoreHandle) +checkIgnoreHandle = maybe startup return =<< Annex.getState Annex.checkignorehandle + where + startup = do + v <- inRepo Git.checkIgnoreStart + when (isNothing v) $ + warning "The installed version of git is too old for .gitignores to be honored by git-annex." + Annex.changeState $ \s -> s { Annex.checkignorehandle = Just v } + return v diff --git a/Annex/Content.hs b/Annex/Content.hs new file mode 100644 index 0000000000..9c71037de1 --- /dev/null +++ b/Annex/Content.hs @@ -0,0 +1,624 @@ +{- git-annex file content managing + - + - Copyright 2010-2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Annex.Content ( + inAnnex, + inAnnexSafe, + inAnnexCheck, + lockContent, + getViaTmp, + getViaTmpChecked, + getViaTmpUnchecked, + prepGetViaTmpChecked, + withTmp, + checkDiskSpace, + moveAnnex, + sendAnnex, + prepSendAnnex, + removeAnnex, + fromAnnex, + moveBad, + KeyLocation(..), + getKeysPresent, + saveState, + downloadUrl, + preseedTmp, + freezeContent, + thawContent, + dirKeys, + withObjectLoc, +) where + +import System.IO.Unsafe (unsafeInterleaveIO) + +import Common.Annex +import Logs.Location +import qualified Git +import qualified Annex +import qualified Annex.Queue +import qualified Annex.Branch +import Utility.DiskFree +import Utility.FileMode +import qualified Annex.Url as Url +import Types.Key +import Utility.DataUnits +import Utility.CopyFile +import Config +import Git.SharedRepository +import Annex.Perms +import Annex.Link +import Annex.Content.Direct +import Annex.ReplaceFile +import Annex.Exception + +#ifdef mingw32_HOST_OS +import Utility.WinLock +#endif + +{- Checks if a given key's content is currently present. -} +inAnnex :: Key -> Annex Bool +inAnnex key = inAnnexCheck key $ liftIO . doesFileExist + +{- Runs an arbitrary check on a key's content. -} +inAnnexCheck :: Key -> (FilePath -> Annex Bool) -> Annex Bool +inAnnexCheck key check = inAnnex' id False check key + +{- Generic inAnnex, handling both indirect and direct mode. + - + - In direct mode, at least one of the associated files must pass the + - check. Additionally, the file must be unmodified. + -} +inAnnex' :: (a -> Bool) -> a -> (FilePath -> Annex a) -> Key -> Annex a +inAnnex' isgood bad check key = withObjectLoc key checkindirect checkdirect + where + checkindirect loc = do + whenM (fromRepo Git.repoIsUrl) $ + error "inAnnex cannot check remote repo" + check loc + checkdirect [] = return bad + checkdirect (loc:locs) = do + r <- check loc + if isgood r + then ifM (goodContent key loc) + ( return r + , checkdirect locs + ) + else checkdirect locs + +{- A safer check; the key's content must not only be present, but + - is not in the process of being removed. -} +inAnnexSafe :: Key -> Annex (Maybe Bool) +inAnnexSafe key = inAnnex' (fromMaybe False) (Just False) go key + where + is_locked = Nothing + is_unlocked = Just True + is_missing = Just False + + go contentfile = maybe (checkindirect contentfile) (checkdirect contentfile) + =<< contentLockFile key + +#ifndef mingw32_HOST_OS + checkindirect f = liftIO $ openforlock f >>= check is_missing + {- In direct mode, the content file must exist, but + - the lock file often generally won't exist unless a removal is in + - process. This does not create the lock file, it only checks for + - it. -} + checkdirect contentfile lockfile = liftIO $ + ifM (doesFileExist contentfile) + ( openforlock lockfile >>= check is_unlocked + , return is_missing + ) + openforlock f = catchMaybeIO $ + openFd f ReadOnly Nothing defaultFileFlags + check _ (Just h) = do + v <- getLock h (ReadLock, AbsoluteSeek, 0, 0) + closeFd h + return $ case v of + Just _ -> is_locked + Nothing -> is_unlocked + check def Nothing = return def +#else + checkindirect _ = return is_missing + {- In Windows, see if we can take a shared lock. If so, + - remove the lock file to clean up after ourselves. -} + checkdirect contentfile lockfile = + ifM (liftIO $ doesFileExist contentfile) + ( modifyContent lockfile $ liftIO $ do + v <- lockShared lockfile + case v of + Nothing -> return is_locked + Just lockhandle -> do + dropLock lockhandle + void $ tryIO $ nukeFile lockfile + return is_unlocked + , return is_missing + ) +#endif + +{- Direct mode and especially Windows has to use a separate lock + - file from the content, since locking the actual content file + - would interfere with the user's use of it. -} +contentLockFile :: Key -> Annex (Maybe FilePath) +contentLockFile key = ifM isDirect + ( Just <$> calcRepo (gitAnnexContentLock key) + , return Nothing + ) + +{- Content is exclusively locked while running an action that might remove + - it. (If the content is not present, no locking is done.) -} +lockContent :: Key -> Annex a -> Annex a +lockContent key a = do + contentfile <- calcRepo $ gitAnnexLocation key + lockfile <- contentLockFile key + maybe noop setuplockfile lockfile + bracketAnnex (liftIO $ lock contentfile lockfile) (unlock lockfile) (const a) + where + alreadylocked = error "content is locked" + setuplockfile lockfile = modifyContent lockfile $ + void $ liftIO $ tryIO $ + writeFile lockfile "" + cleanuplockfile lockfile = modifyContent lockfile $ + void $ liftIO $ tryIO $ + nukeFile lockfile +#ifndef mingw32_HOST_OS + lock contentfile Nothing = opencontentforlock contentfile >>= dolock + lock _ (Just lockfile) = openforlock lockfile >>= dolock . Just + {- Since content files are stored with the write bit disabled, have + - to fiddle with permissions to open for an exclusive lock. -} + opencontentforlock f = catchMaybeIO $ ifM (doesFileExist f) + ( withModifiedFileMode f + (`unionFileModes` ownerWriteMode) + (openforlock f) + , openforlock f + ) + openforlock f = openFd f ReadWrite Nothing defaultFileFlags + dolock Nothing = return Nothing + dolock (Just fd) = do + v <- tryIO $ setLock fd (WriteLock, AbsoluteSeek, 0, 0) + case v of + Left _ -> alreadylocked + Right _ -> return $ Just fd + unlock mlockfile mfd = do + maybe noop cleanuplockfile mlockfile + liftIO $ maybe noop closeFd mfd +#else + lock _ (Just lockfile) = maybe alreadylocked (return . Just) =<< lockExclusive lockfile + lock _ Nothing = return Nothing + unlock mlockfile mlockhandle = do + liftIO $ maybe noop dropLock mlockhandle + maybe noop cleanuplockfile mlockfile +#endif + +{- Runs an action, passing it a temporary filename to get, + - and if the action succeeds, moves the temp file into + - the annex as a key's content. -} +getViaTmp :: Key -> (FilePath -> Annex Bool) -> Annex Bool +getViaTmp = getViaTmpChecked (return True) + +{- Like getViaTmp, but does not check that there is enough disk space + - for the incoming key. For use when the key content is already on disk + - and not being copied into place. -} +getViaTmpUnchecked :: Key -> (FilePath -> Annex Bool) -> Annex Bool +getViaTmpUnchecked = finishGetViaTmp (return True) + +getViaTmpChecked :: Annex Bool -> Key -> (FilePath -> Annex Bool) -> Annex Bool +getViaTmpChecked check key action = + prepGetViaTmpChecked key $ + finishGetViaTmp check key action + +{- Prepares to download a key via a tmp file, and checks that there is + - enough free disk space. + - + - When the temp file already exists, count the space it is using as + - free, since the download will overwrite it or resume. + - + - Wen there's enough free space, runs the download action. + -} +prepGetViaTmpChecked :: Key -> Annex Bool -> Annex Bool +prepGetViaTmpChecked key getkey = do + tmp <- fromRepo $ gitAnnexTmpObjectLocation key + + e <- liftIO $ doesFileExist tmp + alreadythere <- if e + then fromIntegral . fileSize <$> liftIO (getFileStatus tmp) + else return 0 + ifM (checkDiskSpace Nothing key alreadythere) + ( do + -- The tmp file may not have been left writable + when e $ thawContent tmp + getkey + , return False + ) + +finishGetViaTmp :: Annex Bool -> Key -> (FilePath -> Annex Bool) -> Annex Bool +finishGetViaTmp check key action = do + tmpfile <- prepTmp key + ifM (action tmpfile <&&> check) + ( do + moveAnnex key tmpfile + logStatus key InfoPresent + return True + -- the tmp file is left behind, in case caller wants + -- to resume its transfer + , return False + ) + +prepTmp :: Key -> Annex FilePath +prepTmp key = do + tmp <- fromRepo $ gitAnnexTmpObjectLocation key + createAnnexDirectory (parentDir tmp) + return tmp + +{- Creates a temp file, runs an action on it, and cleans up the temp file. -} +withTmp :: Key -> (FilePath -> Annex a) -> Annex a +withTmp key action = do + tmp <- prepTmp key + res <- action tmp + liftIO $ nukeFile tmp + return res + +{- Checks that there is disk space available to store a given key, + - in a destination (or the annex) printing a warning if not. -} +checkDiskSpace :: Maybe FilePath -> Key -> Integer -> Annex Bool +checkDiskSpace destination key alreadythere = do + reserve <- annexDiskReserve <$> Annex.getGitConfig + free <- liftIO . getDiskFree =<< dir + force <- Annex.getState Annex.force + case (free, keySize key) of + (Just have, Just need) -> do + let ok = (need + reserve <= have + alreadythere) || force + unless ok $ + needmorespace (need + reserve - have - alreadythere) + return ok + _ -> return True + where + dir = maybe (fromRepo gitAnnexDir) return destination + needmorespace n = + warning $ "not enough free space, need " ++ + roughSize storageUnits True n ++ + " more" ++ forcemsg + forcemsg = " (use --force to override this check or adjust annex.diskreserve)" + +{- Moves a key's content into .git/annex/objects/ + - + - In direct mode, moves it to the associated file, or files. + - + - What if the key there already has content? This could happen for + - various reasons; perhaps the same content is being annexed again. + - Perhaps there has been a hash collision generating the keys. + - + - The current strategy is to assume that in this case it's safe to delete + - one of the two copies of the content; and the one already in the annex + - is left there, assuming it's the original, canonical copy. + - + - I considered being more paranoid, and checking that both files had + - the same content. Decided against it because A) users explicitly choose + - a backend based on its hashing properties and so if they're dealing + - with colliding files it's their own fault and B) adding such a check + - would not catch all cases of colliding keys. For example, perhaps + - a remote has a key; if it's then added again with different content then + - the overall system now has two different peices of content for that + - key, and one of them will probably get deleted later. So, adding the + - check here would only raise expectations that git-annex cannot truely + - meet. + -} +moveAnnex :: Key -> FilePath -> Annex () +moveAnnex key src = withObjectLoc key storeobject storedirect + where + storeobject dest = ifM (liftIO $ doesFileExist dest) + ( alreadyhave + , modifyContent dest $ do + liftIO $ moveFile src dest + freezeContent dest + ) + storeindirect = storeobject =<< calcRepo (gitAnnexLocation key) + + {- In direct mode, the associated file's content may be locally + - modified. In that case, it's preserved. However, the content + - we're moving into the annex may be the only extant copy, so + - it's important we not lose it. So, when the key's content + - cannot be moved to any associated file, it's stored in indirect + - mode. + -} + storedirect = storedirect' storeindirect + storedirect' fallback [] = fallback + storedirect' fallback (f:fs) = do + thawContent src + v <- isAnnexLink f + if Just key == v + then do + updateInodeCache key src + replaceFile f $ liftIO . moveFile src + chmodContent f + forM_ fs $ + addContentWhenNotPresent key f + else ifM (goodContent key f) + ( storedirect' alreadyhave fs + , storedirect' fallback fs + ) + + alreadyhave = liftIO $ removeFile src + +{- Runs an action to transfer an object's content. + - + - In direct mode, it's possible for the file to change as it's being sent. + - If this happens, runs the rollback action and returns False. The + - rollback action should remove the data that was transferred. + -} +sendAnnex :: Key -> Annex () -> (FilePath -> Annex Bool) -> Annex Bool +sendAnnex key rollback sendobject = go =<< prepSendAnnex key + where + go Nothing = return False + go (Just (f, checksuccess)) = do + r <- sendobject f + ifM checksuccess + ( return r + , do + rollback + return False + ) + +{- Returns a file that contains an object's content, + - and an check to run after the transfer is complete. + - + - In direct mode, it's possible for the file to change as it's being sent, + - and the check detects this case and returns False. + - + - Note that the returned check action is, in some cases, run in the + - Annex monad of the remote that is receiving the object, rather than + - the sender. So it cannot rely on Annex state. + -} +prepSendAnnex :: Key -> Annex (Maybe (FilePath, Annex Bool)) +prepSendAnnex key = withObjectLoc key indirect direct + where + indirect f = return $ Just (f, return True) + direct [] = return Nothing + direct (f:fs) = do + cache <- recordedInodeCache key + -- check that we have a good file + ifM (sameInodeCache f cache) + ( return $ Just (f, sameInodeCache f cache) + , direct fs + ) + +{- Performs an action, passing it the location to use for a key's content. + - + - In direct mode, the associated files will be passed. But, if there are + - no associated files for a key, the indirect mode action will be + - performed instead. -} +withObjectLoc :: Key -> (FilePath -> Annex a) -> ([FilePath] -> Annex a) -> Annex a +withObjectLoc key indirect direct = ifM isDirect + ( do + fs <- associatedFiles key + if null fs + then goindirect + else direct fs + , goindirect + ) + where + goindirect = indirect =<< calcRepo (gitAnnexLocation key) + +cleanObjectLoc :: Key -> Annex () -> Annex () +cleanObjectLoc key cleaner = do + file <- calcRepo $ gitAnnexLocation key + void $ tryAnnexIO $ thawContentDir file + cleaner + liftIO $ removeparents file (3 :: Int) + where + removeparents _ 0 = noop + removeparents file n = do + let dir = parentDir file + maybe noop (const $ removeparents dir (n-1)) + <=< catchMaybeIO $ removeDirectory dir + +{- Removes a key's file from .git/annex/objects/ + - + - In direct mode, deletes the associated files or files, and replaces + - them with symlinks. -} +removeAnnex :: Key -> Annex () +removeAnnex key = withObjectLoc key remove removedirect + where + remove file = cleanObjectLoc key $ do + secureErase file + liftIO $ nukeFile file + removeInodeCache key + removedirect fs = do + cache <- recordedInodeCache key + removeInodeCache key + mapM_ (resetfile cache) fs + resetfile cache f = whenM (sameInodeCache f cache) $ do + l <- inRepo $ gitAnnexLink f key + secureErase f + replaceFile f $ makeAnnexLink l + +{- Runs the secure erase command if set, otherwise does nothing. + - File may or may not be deleted at the end; caller is responsible for + - making sure it's deleted. -} +secureErase :: FilePath -> Annex () +secureErase file = maybe noop go =<< annexSecureEraseCommand <$> Annex.getGitConfig + where + go basecmd = void $ liftIO $ + boolSystem "sh" [Param "-c", Param $ gencmd basecmd] + gencmd = massReplace [ ("%file", shellEscape file) ] + +{- Moves a key's file out of .git/annex/objects/ -} +fromAnnex :: Key -> FilePath -> Annex () +fromAnnex key dest = cleanObjectLoc key $ do + file <- calcRepo $ gitAnnexLocation key + thawContent file + liftIO $ moveFile file dest + +{- Moves a key out of .git/annex/objects/ into .git/annex/bad, and + - returns the file it was moved to. -} +moveBad :: Key -> Annex FilePath +moveBad key = do + src <- calcRepo $ gitAnnexLocation key + bad <- fromRepo gitAnnexBadDir + let dest = bad takeFileName src + createAnnexDirectory (parentDir dest) + cleanObjectLoc key $ + liftIO $ moveFile src dest + logStatus key InfoMissing + return dest + +data KeyLocation = InAnnex | InRepository + +{- List of keys whose content exists in the specified location. + + - InAnnex only lists keys under .git/annex/objects, + - while InRepository, in direct mode, also finds keys located in the + - work tree. + - + - Note that InRepository has to check whether direct mode files + - have goodContent. + -} +getKeysPresent :: KeyLocation -> Annex [Key] +getKeysPresent keyloc = do + direct <- isDirect + dir <- fromRepo gitAnnexObjectDir + s <- getstate direct + liftIO $ traverse s direct (2 :: Int) dir + where + traverse s direct depth dir = do + contents <- catchDefaultIO [] (dirContents dir) + if depth == 0 + then do + contents' <- filterM (present s direct) contents + let keys = mapMaybe (fileKey . takeFileName) contents' + continue keys [] + else do + let deeper = traverse s direct (depth - 1) + continue [] (map deeper contents) + continue keys [] = return keys + continue keys (a:as) = do + {- Force lazy traversal with unsafeInterleaveIO. -} + morekeys <- unsafeInterleaveIO a + continue (morekeys++keys) as + + present _ False d = presentInAnnex d + present s True d = presentDirect s d <||> presentInAnnex d + + presentInAnnex = doesFileExist . contentfile + contentfile d = d takeFileName d + + presentDirect s d = case keyloc of + InAnnex -> return False + InRepository -> case fileKey (takeFileName d) of + Nothing -> return False + Just k -> Annex.eval s $ + anyM (goodContent k) =<< associatedFiles k + + {- In order to run Annex monad actions within unsafeInterleaveIO, + - the current state is taken and reused. No changes made to this + - state will be preserved. + - + - As an optimsation, call inodesChanged to prime the state with + - a cached value that will be used in the call to goodContent. + -} + getstate direct = do + when direct $ + void $ inodesChanged + Annex.getState id + +{- Things to do to record changes to content when shutting down. + - + - It's acceptable to avoid committing changes to the branch, + - especially if performing a short-lived action. + -} +saveState :: Bool -> Annex () +saveState nocommit = doSideAction $ do + Annex.Queue.flush + unless nocommit $ + whenM (annexAlwaysCommit <$> Annex.getGitConfig) $ + Annex.Branch.commit "update" + +{- Downloads content from any of a list of urls. -} +downloadUrl :: [Url.URLString] -> FilePath -> Annex Bool +downloadUrl urls file = go =<< annexWebDownloadCommand <$> Annex.getGitConfig + where + go Nothing = Url.withUrlOptions $ \uo -> + anyM (\u -> Url.download u file uo) urls + go (Just basecmd) = liftIO $ anyM (downloadcmd basecmd) urls + downloadcmd basecmd url = + boolSystem "sh" [Param "-c", Param $ gencmd url basecmd] + <&&> doesFileExist file + gencmd url = massReplace + [ ("%file", shellEscape file) + , ("%url", shellEscape url) + ] + +{- Copies a key's content, when present, to a temp file. + - This is used to speed up some rsyncs. -} +preseedTmp :: Key -> FilePath -> Annex Bool +preseedTmp key file = go =<< inAnnex key + where + go False = return False + go True = do + ok <- copy + when ok $ thawContent file + return ok + copy = ifM (liftIO $ doesFileExist file) + ( return True + , do + s <- calcRepo $ gitAnnexLocation key + liftIO $ copyFileExternal s file + ) + +{- Blocks writing to an annexed file, and modifies file permissions to + - allow reading it, per core.sharedRepository setting. -} +freezeContent :: FilePath -> Annex () +freezeContent file = unlessM crippledFileSystem $ + liftIO . go =<< fromRepo getSharedRepository + where + go GroupShared = modifyFileMode file $ + removeModes writeModes . + addModes [ownerReadMode, groupReadMode] + go AllShared = modifyFileMode file $ + removeModes writeModes . + addModes readModes + go _ = modifyFileMode file $ + removeModes writeModes . + addModes [ownerReadMode] + +{- Adjusts read mode of annexed file per core.sharedRepository setting. -} +chmodContent :: FilePath -> Annex () +chmodContent file = unlessM crippledFileSystem $ + liftIO . go =<< fromRepo getSharedRepository + where + go GroupShared = modifyFileMode file $ + addModes [ownerReadMode, groupReadMode] + go AllShared = modifyFileMode file $ + addModes readModes + go _ = modifyFileMode file $ + addModes [ownerReadMode] + +{- Allows writing to an annexed file that freezeContent was called on + - before. -} +thawContent :: FilePath -> Annex () +thawContent file = unlessM crippledFileSystem $ + liftIO . go =<< fromRepo getSharedRepository + where + go GroupShared = groupWriteRead file + go AllShared = groupWriteRead file + go _ = allowWrite file + +{- Finds files directly inside a directory like gitAnnexBadDir + - (not in subdirectories) and returns the corresponding keys. -} +dirKeys :: (Git.Repo -> FilePath) -> Annex [Key] +dirKeys dirspec = do + dir <- fromRepo dirspec + ifM (liftIO $ doesDirectoryExist dir) + ( do + contents <- liftIO $ getDirectoryContents dir + files <- liftIO $ filterM doesFileExist $ + map (dir ) contents + return $ mapMaybe (fileKey . takeFileName) files + , return [] + ) + diff --git a/Annex/Content/Direct.hs b/Annex/Content/Direct.hs new file mode 100644 index 0000000000..7a4fba4559 --- /dev/null +++ b/Annex/Content/Direct.hs @@ -0,0 +1,256 @@ +{- git-annex file content managing for direct mode + - + - Copyright 2012-2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Annex.Content.Direct ( + associatedFiles, + associatedFilesRelative, + removeAssociatedFile, + removeAssociatedFileUnchecked, + removeAssociatedFiles, + addAssociatedFile, + goodContent, + recordedInodeCache, + updateInodeCache, + addInodeCache, + writeInodeCache, + compareInodeCaches, + compareInodeCachesWith, + sameInodeCache, + elemInodeCaches, + sameFileStatus, + removeInodeCache, + toInodeCache, + inodesChanged, + createInodeSentinalFile, + addContentWhenNotPresent, +) where + +import Common.Annex +import qualified Annex +import Annex.Perms +import qualified Git +import Utility.Tmp +import Logs.Location +import Utility.InodeCache +import Utility.CopyFile +import Annex.ReplaceFile +import Annex.Link + +{- Absolute FilePaths of Files in the tree that are associated with a key. -} +associatedFiles :: Key -> Annex [FilePath] +associatedFiles key = do + files <- associatedFilesRelative key + top <- fromRepo Git.repoPath + return $ map (top ) files + +{- List of files in the tree that are associated with a key, relative to + - the top of the repo. -} +associatedFilesRelative :: Key -> Annex [FilePath] +associatedFilesRelative key = do + mapping <- calcRepo $ gitAnnexMapping key + liftIO $ catchDefaultIO [] $ withFile mapping ReadMode $ \h -> do + fileEncoding h + -- Read strictly to ensure the file is closed + -- before changeAssociatedFiles tries to write to it. + -- (Especially needed on Windows.) + lines <$> hGetContentsStrict h + +{- Changes the associated files information for a key, applying a + - transformation to the list. Returns new associatedFiles value. -} +changeAssociatedFiles :: Key -> ([FilePath] -> [FilePath]) -> Annex [FilePath] +changeAssociatedFiles key transform = do + mapping <- calcRepo $ gitAnnexMapping key + files <- associatedFilesRelative key + let files' = transform files + when (files /= files') $ + modifyContent mapping $ + liftIO $ viaTmp writeFileAnyEncoding mapping $ + unlines files' + top <- fromRepo Git.repoPath + return $ map (top ) files' + +{- Removes the list of associated files. -} +removeAssociatedFiles :: Key -> Annex () +removeAssociatedFiles key = do + mapping <- calcRepo $ gitAnnexMapping key + modifyContent mapping $ + liftIO $ nukeFile mapping + +{- Removes an associated file. Returns new associatedFiles value. + - Checks if this was the last copy of the object, and updates location + - log. -} +removeAssociatedFile :: Key -> FilePath -> Annex [FilePath] +removeAssociatedFile key file = do + fs <- removeAssociatedFileUnchecked key file + when (null fs) $ + logStatus key InfoMissing + return fs + +{- Removes an associated file. Returns new associatedFiles value. -} +removeAssociatedFileUnchecked :: Key -> FilePath -> Annex [FilePath] +removeAssociatedFileUnchecked key file = do + file' <- normaliseAssociatedFile file + changeAssociatedFiles key $ filter (/= file') + +{- Adds an associated file. Returns new associatedFiles value. -} +addAssociatedFile :: Key -> FilePath -> Annex [FilePath] +addAssociatedFile key file = do + file' <- normaliseAssociatedFile file + changeAssociatedFiles key $ \files -> + if file' `elem` files + then files + else file':files + +{- Associated files are always stored relative to the top of the repository. + - The input FilePath is relative to the CWD, or is absolute. -} +normaliseAssociatedFile :: FilePath -> Annex FilePath +normaliseAssociatedFile file = do + top <- fromRepo Git.repoPath + liftIO $ relPathDirToFile top <$> absPath file + +{- Checks if a file in the tree, associated with a key, has not been modified. + - + - To avoid needing to fsck the file's content, which can involve an + - expensive checksum, this relies on a cache that contains the file's + - expected mtime and inode. + -} +goodContent :: Key -> FilePath -> Annex Bool +goodContent key file = sameInodeCache file =<< recordedInodeCache key + +{- Gets the recorded inode cache for a key. + - + - A key can be associated with multiple files, so may return more than + - one. -} +recordedInodeCache :: Key -> Annex [InodeCache] +recordedInodeCache key = withInodeCacheFile key $ \f -> + liftIO $ catchDefaultIO [] $ + mapMaybe readInodeCache . lines <$> readFileStrict f + +{- Caches an inode for a file. + - + - Anything else already cached is preserved. + -} +updateInodeCache :: Key -> FilePath -> Annex () +updateInodeCache key file = maybe noop (addInodeCache key) + =<< liftIO (genInodeCache file) + +{- Adds another inode to the cache for a key. -} +addInodeCache :: Key -> InodeCache -> Annex () +addInodeCache key cache = do + oldcaches <- recordedInodeCache key + unlessM (elemInodeCaches cache oldcaches) $ + writeInodeCache key (cache:oldcaches) + +{- Writes inode cache for a key. -} +writeInodeCache :: Key -> [InodeCache] -> Annex () +writeInodeCache key caches = withInodeCacheFile key $ \f -> + modifyContent f $ + liftIO $ writeFile f $ + unlines $ map showInodeCache caches + +{- Removes an inode cache. -} +removeInodeCache :: Key -> Annex () +removeInodeCache key = withInodeCacheFile key $ \f -> + modifyContent f $ + liftIO $ nukeFile f + +withInodeCacheFile :: Key -> (FilePath -> Annex a) -> Annex a +withInodeCacheFile key a = a =<< calcRepo (gitAnnexInodeCache key) + +{- Checks if a InodeCache matches the current version of a file. -} +sameInodeCache :: FilePath -> [InodeCache] -> Annex Bool +sameInodeCache _ [] = return False +sameInodeCache file old = go =<< liftIO (genInodeCache file) + where + go Nothing = return False + go (Just curr) = elemInodeCaches curr old + +{- Checks if a FileStatus matches the recorded InodeCache of a file. -} +sameFileStatus :: Key -> FileStatus -> Annex Bool +sameFileStatus key status = do + old <- recordedInodeCache key + let curr = toInodeCache status + case (old, curr) of + (_, Just c) -> elemInodeCaches c old + ([], Nothing) -> return True + _ -> return False + +{- If the inodes have changed, only the size and mtime are compared. -} +compareInodeCaches :: InodeCache -> InodeCache -> Annex Bool +compareInodeCaches x y + | compareStrong x y = return True + | otherwise = ifM inodesChanged + ( return $ compareWeak x y + , return False + ) + +elemInodeCaches :: InodeCache -> [InodeCache] -> Annex Bool +elemInodeCaches _ [] = return False +elemInodeCaches c (l:ls) = ifM (compareInodeCaches c l) + ( return True + , elemInodeCaches c ls + ) + +compareInodeCachesWith :: Annex InodeComparisonType +compareInodeCachesWith = ifM inodesChanged ( return Weakly, return Strongly ) + +{- Copies the contentfile to the associated file, if the associated + - file has no content. If the associated file does have content, + - even if the content differs, it's left unchanged. -} +addContentWhenNotPresent :: Key -> FilePath -> FilePath -> Annex () +addContentWhenNotPresent key contentfile associatedfile = do + v <- isAnnexLink associatedfile + when (Just key == v) $ + replaceFile associatedfile $ + liftIO . void . copyFileExternal contentfile + updateInodeCache key associatedfile + +{- Some filesystems get new inodes each time they are mounted. + - In order to work on such a filesystem, a sentinal file is used to detect + - when the inodes have changed. + - + - If the sentinal file does not exist, we have to assume that the + - inodes have changed. + -} +inodesChanged :: Annex Bool +inodesChanged = maybe calc return =<< Annex.getState Annex.inodeschanged + where + calc = do + scache <- liftIO . genInodeCache + =<< fromRepo gitAnnexInodeSentinal + scached <- readInodeSentinalFile + let changed = case (scache, scached) of + (Just c1, Just c2) -> not $ compareStrong c1 c2 + _ -> True + Annex.changeState $ \s -> s { Annex.inodeschanged = Just changed } + return changed + +readInodeSentinalFile :: Annex (Maybe InodeCache) +readInodeSentinalFile = do + sentinalcachefile <- fromRepo gitAnnexInodeSentinalCache + liftIO $ catchDefaultIO Nothing $ + readInodeCache <$> readFile sentinalcachefile + +writeInodeSentinalFile :: Annex () +writeInodeSentinalFile = do + sentinalfile <- fromRepo gitAnnexInodeSentinal + createAnnexDirectory (parentDir sentinalfile) + sentinalcachefile <- fromRepo gitAnnexInodeSentinalCache + liftIO $ writeFile sentinalfile "" + liftIO $ maybe noop (writeFile sentinalcachefile . showInodeCache) + =<< genInodeCache sentinalfile + +{- The sentinal file is only created when first initializing a repository. + - If there are any annexed objects in the repository already, creating + - the file would invalidate their inode caches. -} +createInodeSentinalFile :: Annex () +createInodeSentinalFile = + unlessM (alreadyexists <||> hasobjects) + writeInodeSentinalFile + where + alreadyexists = isJust <$> readInodeSentinalFile + hasobjects = liftIO . doesDirectoryExist =<< fromRepo gitAnnexObjectDir diff --git a/Annex/Direct.hs b/Annex/Direct.hs new file mode 100644 index 0000000000..2f583fd943 --- /dev/null +++ b/Annex/Direct.hs @@ -0,0 +1,373 @@ +{- git-annex direct mode + - + - Copyright 2012, 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Annex.Direct where + +import Common.Annex +import qualified Annex +import qualified Git +import qualified Git.LsFiles +import qualified Git.Merge +import qualified Git.DiffTree as DiffTree +import qualified Git.Config +import qualified Git.Ref +import qualified Git.Branch +import Git.Sha +import Git.FilePath +import Git.Types +import Config +import Annex.CatFile +import qualified Annex.Queue +import Logs.Location +import Backend +import Types.KeySource +import Annex.Content +import Annex.Content.Direct +import Annex.Link +import Utility.InodeCache +import Utility.CopyFile +import Annex.Perms +import Annex.ReplaceFile +import Annex.Exception +import Annex.VariantFile + +{- Uses git ls-files to find files that need to be committed, and stages + - them into the index. Returns True if some changes were staged. -} +stageDirect :: Annex Bool +stageDirect = do + Annex.Queue.flush + top <- fromRepo Git.repoPath + (l, cleanup) <- inRepo $ Git.LsFiles.stagedOthersDetails [top] + forM_ l go + void $ liftIO cleanup + staged <- Annex.Queue.size + Annex.Queue.flush + return $ staged /= 0 + where + {- Determine what kind of modified or deleted file this is, as + - efficiently as we can, by getting any key that's associated + - with it in git, as well as its stat info. -} + go (file, Just sha, Just mode) = do + shakey <- catKey sha mode + mstat <- liftIO $ catchMaybeIO $ getSymbolicLinkStatus file + filekey <- isAnnexLink file + case (shakey, filekey, mstat, toInodeCache =<< mstat) of + (_, Just key, _, _) + | shakey == filekey -> noop + {- A changed symlink. -} + | otherwise -> stageannexlink file key + (Just key, _, _, Just cache) -> do + {- All direct mode files will show as + - modified, so compare the cache to see if + - it really was. -} + oldcache <- recordedInodeCache key + case oldcache of + [] -> modifiedannexed file key cache + _ -> unlessM (elemInodeCaches cache oldcache) $ + modifiedannexed file key cache + (Just key, _, Nothing, _) -> deletedannexed file key + (Nothing, _, Nothing, _) -> deletegit file + (_, _, Just _, _) -> addgit file + go _ = noop + + modifiedannexed file oldkey cache = do + void $ removeAssociatedFile oldkey file + void $ addDirect file cache + + deletedannexed file key = do + void $ removeAssociatedFile key file + deletegit file + + stageannexlink file key = do + l <- inRepo $ gitAnnexLink file key + stageSymlink file =<< hashSymlink l + void $ addAssociatedFile key file + + addgit file = Annex.Queue.addCommand "add" [Param "-f"] [file] + + deletegit file = Annex.Queue.addCommand "rm" [Param "-qf"] [file] + +{- Run before a commit to update direct mode bookeeping to reflect the + - staged changes being committed. -} +preCommitDirect :: Annex Bool +preCommitDirect = do + (diffs, clean) <- inRepo $ DiffTree.diffIndex Git.Ref.headRef + makeabs <- flip fromTopFilePath <$> gitRepo + forM_ diffs (go makeabs) + liftIO clean + where + go makeabs diff = do + withkey (DiffTree.srcsha diff) (DiffTree.srcmode diff) removeAssociatedFile + withkey (DiffTree.dstsha diff) (DiffTree.dstmode diff) addAssociatedFile + where + withkey sha mode a = when (sha /= nullSha) $ do + k <- catKey sha mode + case k of + Nothing -> noop + Just key -> void $ a key $ + makeabs $ DiffTree.file diff + +{- Adds a file to the annex in direct mode. Can fail, if the file is + - modified or deleted while it's being added. -} +addDirect :: FilePath -> InodeCache -> Annex Bool +addDirect file cache = do + showStart "add" file + let source = KeySource + { keyFilename = file + , contentLocation = file + , inodeCache = Just cache + } + got =<< genKey source =<< chooseBackend file + where + got Nothing = do + showEndFail + return False + got (Just (key, _)) = ifM (sameInodeCache file [cache]) + ( do + l <- inRepo $ gitAnnexLink file key + stageSymlink file =<< hashSymlink l + addInodeCache key cache + void $ addAssociatedFile key file + logStatus key InfoPresent + showEndOk + return True + , do + showEndFail + return False + ) + +{- In direct mode, git merge would usually refuse to do anything, since it + - sees present direct mode files as type changed files. To avoid this, + - merge is run with the work tree set to a temp directory. + -} +mergeDirect :: FilePath -> Git.Ref -> Git.Repo -> IO Bool +mergeDirect d branch g = do + whenM (doesDirectoryExist d) $ + removeDirectoryRecursive d + createDirectoryIfMissing True d + let g' = g { location = Local { gitdir = Git.localGitDir g, worktree = Just d } } + Git.Merge.mergeNonInteractive branch g' + +{- Cleans up after a direct mode merge. The merge must have been committed, + - and the commit sha passed in, along with the old sha of the tree + - before the merge. Uses git diff-tree to find files that changed between + - the two shas, and applies those changes to the work tree. + - + - There are really only two types of changes: An old item can be deleted, + - or a new item added. Two passes are made, first deleting and then + - adding. This is to handle cases where eg, a file is deleted and a + - directory is added. (The diff-tree output may list these in the opposite + - order, but we cannot add the directory until the file with the + - same name is removed.) + -} +mergeDirectCleanup :: FilePath -> Git.Ref -> Git.Ref -> Annex () +mergeDirectCleanup d oldsha newsha = do + (items, cleanup) <- inRepo $ DiffTree.diffTreeRecursive oldsha newsha + makeabs <- flip fromTopFilePath <$> gitRepo + let fsitems = zip (map (makeabs . DiffTree.file) items) items + forM_ fsitems $ + go makeabs DiffTree.srcsha DiffTree.srcmode moveout moveout_raw + forM_ fsitems $ + go makeabs DiffTree.dstsha DiffTree.dstmode movein movein_raw + void $ liftIO cleanup + liftIO $ removeDirectoryRecursive d + where + go makeabs getsha getmode a araw (f, item) + | getsha item == nullSha = noop + | otherwise = void $ + tryAnnex . maybe (araw item makeabs f) (\k -> void $ a item makeabs k f) + =<< catKey (getsha item) (getmode item) + + moveout _ _ = removeDirect + + {- Files deleted by the merge are removed from the work tree. + - Empty work tree directories are removed, per git behavior. -} + moveout_raw _ _ f = liftIO $ do + nukeFile f + void $ tryIO $ removeDirectory $ parentDir f + + {- If the file is already present, with the right content for the + - key, it's left alone. + - + - If the file is already present, and does not exist in the + - oldsha branch, preserve this local file. + - + - Otherwise, create the symlink and then if possible, replace it + - with the content. -} + movein item makeabs k f = unlessM (goodContent k f) $ do + preserveUnannexed item makeabs f oldsha + l <- inRepo $ gitAnnexLink f k + replaceFile f $ makeAnnexLink l + toDirect k f + + {- Any new, modified, or renamed files were written to the temp + - directory by the merge, and are moved to the real work tree. -} + movein_raw item makeabs f = do + preserveUnannexed item makeabs f oldsha + liftIO $ do + createDirectoryIfMissing True $ parentDir f + void $ tryIO $ rename (d getTopFilePath (DiffTree.file item)) f + +{- If the file that's being moved in is already present in the work + - tree, but did not exist in the oldsha branch, preserve this + - local, unannexed file (or directory), as "variant-local". + - + - It's also possible that the file that's being moved in + - is in a directory that collides with an exsting, non-annexed + - file (not a directory), which should be preserved. + -} +preserveUnannexed :: DiffTree.DiffTreeItem -> (TopFilePath -> FilePath) -> FilePath -> Ref -> Annex () +preserveUnannexed item makeabs absf oldsha = do + whenM (liftIO (collidingitem absf) <&&> unannexed absf) $ + liftIO $ findnewname absf 0 + checkdirs (DiffTree.file item) + where + checkdirs from = do + let p = parentDir (getTopFilePath from) + let d = asTopFilePath p + unless (null p) $ do + let absd = makeabs d + whenM (liftIO (colliding_nondir absd) <&&> unannexed absd) $ + liftIO $ findnewname absd 0 + checkdirs d + + collidingitem f = isJust + <$> catchMaybeIO (getSymbolicLinkStatus f) + colliding_nondir f = maybe False (not . isDirectory) + <$> catchMaybeIO (getSymbolicLinkStatus f) + + unannexed f = (isNothing <$> isAnnexLink f) + <&&> (isNothing <$> catFileDetails oldsha f) + + findnewname :: FilePath -> Int -> IO () + findnewname f n = do + let localf = mkVariant f + ("local" ++ if n > 0 then show n else "") + ifM (collidingitem localf) + ( findnewname f (n+1) + , rename f localf + `catchIO` const (findnewname f (n+1)) + ) + +{- If possible, converts a symlink in the working tree into a direct + - mode file. If the content is not available, leaves the symlink + - unchanged. -} +toDirect :: Key -> FilePath -> Annex () +toDirect k f = fromMaybe noop =<< toDirectGen k f + +toDirectGen :: Key -> FilePath -> Annex (Maybe (Annex ())) +toDirectGen k f = do + loc <- calcRepo $ gitAnnexLocation k + ifM (liftIO $ doesFileExist loc) + ( return $ Just $ fromindirect loc + , do + {- Copy content from another direct file. -} + absf <- liftIO $ absPath f + dlocs <- filterM (goodContent k) =<< + filterM (\l -> isNothing <$> getAnnexLinkTarget l) =<< + (filter (/= absf) <$> addAssociatedFile k f) + case dlocs of + [] -> return Nothing + (dloc:_) -> return $ Just $ fromdirect dloc + ) + where + fromindirect loc = do + {- Move content from annex to direct file. -} + updateInodeCache k loc + void $ addAssociatedFile k f + modifyContent loc $ do + thawContent loc + replaceFile f $ liftIO . moveFile loc + fromdirect loc = do + replaceFile f $ + liftIO . void . copyFileExternal loc + updateInodeCache k f + +{- Removes a direct mode file, while retaining its content in the annex + - (unless its content has already been changed). -} +removeDirect :: Key -> FilePath -> Annex () +removeDirect k f = do + void $ removeAssociatedFileUnchecked k f + unlessM (inAnnex k) $ + ifM (goodContent k f) + ( moveAnnex k f + , logStatus k InfoMissing + ) + liftIO $ do + nukeFile f + void $ tryIO $ removeDirectory $ parentDir f + +{- Called when a direct mode file has been changed. Its old content may be + - lost. -} +changedDirect :: Key -> FilePath -> Annex () +changedDirect oldk f = do + locs <- removeAssociatedFile oldk f + whenM (pure (null locs) <&&> not <$> inAnnex oldk) $ + logStatus oldk InfoMissing + +{- Enable/disable direct mode. -} +setDirect :: Bool -> Annex () +setDirect wantdirect = do + if wantdirect + then do + switchHEAD + setbare + else do + setbare + switchHEADBack + setConfig (annexConfig "direct") val + Annex.changeGitConfig $ \c -> c { annexDirect = wantdirect } + where + val = Git.Config.boolConfig wantdirect + setbare = setConfig (ConfigKey Git.Config.coreBare) val + +{- Since direct mode sets core.bare=true, incoming pushes could change + - the currently checked out branch. To avoid this problem, HEAD + - is changed to a internal ref that nothing is going to push to. + - + - For refs/heads/master, use refs/heads/annex/direct/master; + - this way things that show HEAD (eg shell prompts) will + - hopefully show just "master". -} +directBranch :: Ref -> Ref +directBranch orighead = case split "/" $ fromRef orighead of + ("refs":"heads":"annex":"direct":_) -> orighead + ("refs":"heads":rest) -> + Ref $ "refs/heads/annex/direct/" ++ intercalate "/" rest + _ -> Ref $ "refs/heads/" ++ fromRef (Git.Ref.base orighead) + +{- Converts a directBranch back to the original branch. + - + - Any other ref is left unchanged. + -} +fromDirectBranch :: Ref -> Ref +fromDirectBranch directhead = case split "/" $ fromRef directhead of + ("refs":"heads":"annex":"direct":rest) -> + Ref $ "refs/heads/" ++ intercalate "/" rest + _ -> directhead + +switchHEAD :: Annex () +switchHEAD = maybe noop switch =<< inRepo Git.Branch.currentUnsafe + where + switch orighead = do + let newhead = directBranch orighead + maybe noop (inRepo . Git.Branch.update newhead) + =<< inRepo (Git.Ref.sha orighead) + inRepo $ Git.Branch.checkout newhead + +switchHEADBack :: Annex () +switchHEADBack = maybe noop switch =<< inRepo Git.Branch.currentUnsafe + where + switch currhead = do + let orighead = fromDirectBranch currhead + v <- inRepo $ Git.Ref.sha currhead + case v of + Just headsha + | orighead /= currhead -> do + inRepo $ Git.Branch.update orighead headsha + inRepo $ Git.Branch.checkout orighead + inRepo $ Git.Branch.delete currhead + _ -> inRepo $ Git.Branch.checkout orighead diff --git a/Annex/Direct/Fixup.hs b/Annex/Direct/Fixup.hs new file mode 100644 index 0000000000..13485242ae --- /dev/null +++ b/Annex/Direct/Fixup.hs @@ -0,0 +1,31 @@ +{- git-annex direct mode guard fixup + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Annex.Direct.Fixup where + +import Git.Types +import Git.Config +import qualified Git.Construct as Construct +import Utility.Path +import Utility.SafeCommand + +{- Direct mode repos have core.bare=true, but are not really bare. + - Fix up the Repo to be a non-bare repo, and arrange for git commands + - run by git-annex to be passed parameters that override this setting. -} +fixupDirect :: Repo -> IO Repo +fixupDirect r@(Repo { location = l@(Local { gitdir = d, worktree = Nothing }) }) = do + let r' = r + { location = l { worktree = Just (parentDir d) } + , gitGlobalOpts = gitGlobalOpts r ++ + [ Param "-c" + , Param $ coreBare ++ "=" ++ boolConfig False + ] + } + -- Recalc now that the worktree is correct. + rs' <- Construct.fromRemotes r' + return $ r' { remotes = rs' } +fixupDirect r = return r diff --git a/Annex/Drop.hs b/Annex/Drop.hs new file mode 100644 index 0000000000..71263dc618 --- /dev/null +++ b/Annex/Drop.hs @@ -0,0 +1,124 @@ +{- dropping of unwanted content + - + - Copyright 2012-2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Annex.Drop where + +import Common.Annex +import Logs.Trust +import Config.NumCopies +import Types.Remote (uuid) +import Types.Key (key2file) +import qualified Remote +import qualified Command.Drop +import Command +import Annex.Wanted +import Annex.Exception +import Config +import Annex.Content.Direct + +import qualified Data.Set as S +import System.Log.Logger (debugM) + +type Reason = String + +{- Drop a key from local and/or remote when allowed by the preferred content + - and numcopies settings. + - + - The UUIDs are ones where the content is believed to be present. + - The Remote list can include other remotes that do not have the content; + - only ones that match the UUIDs will be dropped from. + - If allowed to drop fromhere, that drop will be tried first. + - + - A remote can be specified that is known to have the key. This can be + - used an an optimisation when eg, a key has just been uploaded to a + - remote. + - + - In direct mode, all associated files are checked, and only if all + - of them are unwanted are they dropped. + - + - The runner is used to run commands, and so can be either callCommand + - or commandAction. + -} +handleDropsFrom :: [UUID] -> [Remote] -> Reason -> Bool -> Key -> AssociatedFile -> Maybe Remote -> CommandActionRunner -> Annex () +handleDropsFrom locs rs reason fromhere key afile knownpresentremote runner = do + fs <- ifM isDirect + ( do + l <- associatedFilesRelative key + return $ if null l + then maybeToList afile + else l + , return $ maybeToList afile + ) + n <- getcopies fs + if fromhere && checkcopies n Nothing + then go fs rs =<< dropl fs n + else go fs rs n + where + getcopies fs = do + (untrusted, have) <- trustPartition UnTrusted locs + numcopies <- if null fs + then getNumCopies + else maximum <$> mapM getFileNumCopies fs + return (NumCopies (length have), numcopies, S.fromList untrusted) + + {- Check that we have enough copies still to drop the content. + - When the remote being dropped from is untrusted, it was not + - counted as a copy, so having only numcopies suffices. Otherwise, + - we need more than numcopies to safely drop. -} + checkcopies (have, numcopies, _untrusted) Nothing = have > numcopies + checkcopies (have, numcopies, untrusted) (Just u) + | S.member u untrusted = have >= numcopies + | otherwise = have > numcopies + + decrcopies (have, numcopies, untrusted) Nothing = + (NumCopies (fromNumCopies have - 1), numcopies, untrusted) + decrcopies v@(_have, _numcopies, untrusted) (Just u) + | S.member u untrusted = v + | otherwise = decrcopies v Nothing + + go _ [] _ = noop + go fs (r:rest) n + | uuid r `S.notMember` slocs = go fs rest n + | checkcopies n (Just $ Remote.uuid r) = + dropr fs r n >>= go fs rest + | otherwise = noop + + checkdrop fs n u a + | null fs = check $ -- no associated files; unused content + wantDrop True u (Just key) Nothing + | otherwise = check $ + allM (wantDrop True u (Just key) . Just) fs + where + check c = ifM c + ( dodrop n u a + , return n + ) + + dodrop n@(have, numcopies, _untrusted) u a = + ifM (safely $ runner $ a numcopies) + ( do + liftIO $ debugM "drop" $ unwords + [ "dropped" + , fromMaybe (key2file key) afile + , "(from " ++ maybe "here" show u ++ ")" + , "(copies now " ++ show (fromNumCopies have - 1) ++ ")" + , ": " ++ reason + ] + return $ decrcopies n u + , return n + ) + + dropl fs n = checkdrop fs n Nothing $ \numcopies -> + Command.Drop.startLocal afile numcopies key knownpresentremote + + dropr fs r n = checkdrop fs n (Just $ Remote.uuid r) $ \numcopies -> + Command.Drop.startRemote afile numcopies key r + + slocs = S.fromList locs + + safely a = either (const False) id <$> tryAnnex a + diff --git a/Annex/Environment.hs b/Annex/Environment.hs new file mode 100644 index 0000000000..f22c5f2d49 --- /dev/null +++ b/Annex/Environment.hs @@ -0,0 +1,65 @@ +{- git-annex environment + - + - Copyright 2012, 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Annex.Environment where + +import Common.Annex +import Utility.UserInfo +import qualified Git.Config +import Config +import Annex.Exception + +#ifndef mingw32_HOST_OS +import Utility.Env +#endif + +{- Checks that the system's environment allows git to function. + - Git requires a GECOS username, or suitable git configuration, or + - environment variables. + - + - Git also requires the system have a hostname containing a dot. + - Otherwise, it tries various methods to find a FQDN, and will fail if it + - does not. To avoid replicating that code here, which would break if its + - methods change, this function does not check the hostname is valid. + - Instead, code that commits can use ensureCommit. + -} +checkEnvironment :: Annex () +checkEnvironment = do + gitusername <- fromRepo $ Git.Config.getMaybe "user.name" + when (isNothing gitusername || gitusername == Just "") $ + liftIO checkEnvironmentIO + +checkEnvironmentIO :: IO () +checkEnvironmentIO = +#ifdef mingw32_HOST_OS + noop +#else + whenM (null <$> myUserGecos) $ do + username <- myUserName + ensureEnv "GIT_AUTHOR_NAME" username + ensureEnv "GIT_COMMITTER_NAME" username + where +#ifndef __ANDROID__ + -- existing environment is not overwritten + ensureEnv var val = void $ setEnv var val False +#else + -- Environment setting is broken on Android, so this is dealt with + -- in runshell instead. + ensureEnv _ _ = noop +#endif +#endif + +{- Runs an action that commits to the repository, and if it fails, + - sets user.email to a dummy value and tries the action again. -} +ensureCommit :: Annex a -> Annex a +ensureCommit a = either retry return =<< tryAnnex a + where + retry _ = do + setConfig (ConfigKey "user.email") =<< liftIO myUserName + a diff --git a/Annex/Exception.hs b/Annex/Exception.hs new file mode 100644 index 0000000000..11613d51b7 --- /dev/null +++ b/Annex/Exception.hs @@ -0,0 +1,50 @@ +{- exception handling in the git-annex monad + - + - Note that when an Annex action fails and the exception is handled + - by these functions, any changes the action has made to the + - AnnexState are retained. This works because the Annex monad + - internally stores the AnnexState in a MVar. + - + - Copyright 2011-2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE PackageImports #-} + +module Annex.Exception ( + bracketIO, + bracketAnnex, + tryAnnex, + tryAnnexIO, + throwAnnex, + catchAnnex, +) where + +import qualified "MonadCatchIO-transformers" Control.Monad.CatchIO as M +import Control.Exception + +import Common.Annex + +{- Runs an Annex action, with setup and cleanup both in the IO monad. -} +bracketIO :: IO v -> (v -> IO b) -> (v -> Annex a) -> Annex a +bracketIO setup cleanup = M.bracket (liftIO setup) (liftIO . cleanup) + +bracketAnnex :: Annex v -> (v -> Annex b) -> (v -> Annex a) -> Annex a +bracketAnnex = M.bracket + +{- try in the Annex monad -} +tryAnnex :: Annex a -> Annex (Either SomeException a) +tryAnnex = M.try + +{- try in the Annex monad, but only catching IO exceptions -} +tryAnnexIO :: Annex a -> Annex (Either IOException a) +tryAnnexIO = M.try + +{- throw in the Annex monad -} +throwAnnex :: Exception e => e -> Annex a +throwAnnex = M.throw + +{- catch in the Annex monad -} +catchAnnex :: Exception e => Annex a -> (e -> Annex a) -> Annex a +catchAnnex = M.catch diff --git a/Annex/FileMatcher.hs b/Annex/FileMatcher.hs new file mode 100644 index 0000000000..da6a5e0e93 --- /dev/null +++ b/Annex/FileMatcher.hs @@ -0,0 +1,116 @@ +{- git-annex file matching + - + - Copyright 2012-2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Annex.FileMatcher where + +import qualified Data.Map as M + +import Common.Annex +import Limit +import Utility.Matcher +import Types.Group +import Logs.Group +import Logs.Remote +import Annex.UUID +import qualified Annex +import Types.FileMatcher +import Git.FilePath +import Types.Remote (RemoteConfig) + +import Data.Either +import qualified Data.Set as S + +checkFileMatcher :: (FileMatcher Annex) -> FilePath -> Annex Bool +checkFileMatcher matcher file = checkMatcher matcher Nothing (Just file) S.empty True + +checkMatcher :: (FileMatcher Annex) -> Maybe Key -> AssociatedFile -> AssumeNotPresent -> Bool -> Annex Bool +checkMatcher matcher mkey afile notpresent def + | isEmpty matcher = return def + | otherwise = case (mkey, afile) of + (_, Just file) -> go =<< fileMatchInfo file + (Just key, _) -> go (MatchingKey key) + _ -> return def + where + go mi = matchMrun matcher $ \a -> a notpresent mi + +fileMatchInfo :: FilePath -> Annex MatchInfo +fileMatchInfo file = do + matchfile <- getTopFilePath <$> inRepo (toTopFilePath file) + return $ MatchingFile FileInfo + { matchFile = matchfile + , relFile = file + } + +matchAll :: FileMatcher Annex +matchAll = generate [] + +parsedToMatcher :: [Either String (Token (MatchFiles Annex))] -> Either String (FileMatcher Annex) +parsedToMatcher parsed = case partitionEithers parsed of + ([], vs) -> Right $ generate vs + (es, _) -> Left $ unwords $ map ("Parse failure: " ++) es + +exprParser :: FileMatcher Annex -> FileMatcher Annex -> GroupMap -> M.Map UUID RemoteConfig -> Maybe UUID -> String -> [Either String (Token (MatchFiles Annex))] +exprParser matchstandard matchgroupwanted groupmap configmap mu expr = + map parse $ tokenizeMatcher expr + where + parse = parseToken + matchstandard + matchgroupwanted + (limitPresent mu) + (limitInDir preferreddir) + groupmap + preferreddir = fromMaybe "public" $ + M.lookup "preferreddir" =<< (`M.lookup` configmap) =<< mu + +parseToken :: FileMatcher Annex -> FileMatcher Annex -> MkLimit Annex -> MkLimit Annex -> GroupMap -> String -> Either String (Token (MatchFiles Annex)) +parseToken matchstandard matchgroupwanted checkpresent checkpreferreddir groupmap t + | t `elem` tokens = Right $ token t + | t == "standard" = call matchstandard + | t == "groupwanted" = call matchgroupwanted + | t == "present" = use checkpresent + | t == "inpreferreddir" = use checkpreferreddir + | t == "unused" = Right $ Operation limitUnused + | otherwise = maybe (Left $ "near " ++ show t) use $ M.lookup k $ + M.fromList + [ ("include", limitInclude) + , ("exclude", limitExclude) + , ("copies", limitCopies) + , ("lackingcopies", limitLackingCopies False) + , ("approxlackingcopies", limitLackingCopies True) + , ("inbackend", limitInBackend) + , ("largerthan", limitSize (>)) + , ("smallerthan", limitSize (<)) + , ("metadata", limitMetaData) + , ("inallgroup", limitInAllGroup groupmap) + ] + where + (k, v) = separate (== '=') t + use a = Operation <$> a v + call sub = Right $ Operation $ \notpresent mi -> + matchMrun sub $ \a -> a notpresent mi + +{- This is really dumb tokenization; there's no support for quoted values. + - Open and close parens are always treated as standalone tokens; + - otherwise tokens must be separated by whitespace. -} +tokenizeMatcher :: String -> [String] +tokenizeMatcher = filter (not . null ) . concatMap splitparens . words + where + splitparens = segmentDelim (`elem` "()") + +{- Generates a matcher for files large enough (or meeting other criteria) + - to be added to the annex, rather than directly to git. -} +largeFilesMatcher :: Annex (FileMatcher Annex) +largeFilesMatcher = go =<< annexLargeFiles <$> Annex.getGitConfig + where + go Nothing = return matchAll + go (Just expr) = do + gm <- groupMap + rc <- readRemoteLog + u <- getUUID + either badexpr return $ + parsedToMatcher $ exprParser matchAll matchAll gm rc (Just u) expr + badexpr e = error $ "bad annex.largefiles configuration: " ++ e diff --git a/Annex/Hook.hs b/Annex/Hook.hs new file mode 100644 index 0000000000..4848e2d61f --- /dev/null +++ b/Annex/Hook.hs @@ -0,0 +1,71 @@ +{- git-annex git hooks + - + - Note that it's important that the scripts installed by git-annex + - not change, otherwise removing old hooks using an old version of + - the script would fail. + - + - Copyright 2013-2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Annex.Hook where + +import Common.Annex +import qualified Git.Hook as Git +import Config +import qualified Annex +import Utility.Shell +import Utility.FileMode + +import qualified Data.Map as M + +preCommitHook :: Git.Hook +preCommitHook = Git.Hook "pre-commit" (mkHookScript "git annex pre-commit .") + +preCommitAnnexHook :: Git.Hook +preCommitAnnexHook = Git.Hook "pre-commit-annex" "" + +mkHookScript :: String -> String +mkHookScript s = unlines + [ shebang_local + , "# automatically configured by git-annex" + , s + ] + +hookWrite :: Git.Hook -> Annex () +hookWrite h = + -- cannot have git hooks in a crippled filesystem (no execute bit) + unlessM crippledFileSystem $ + unlessM (inRepo $ Git.hookWrite h) $ + hookWarning h "already exists, not configuring" + +hookUnWrite :: Git.Hook -> Annex () +hookUnWrite h = unlessM (inRepo $ Git.hookUnWrite h) $ + hookWarning h "contents modified; not deleting. Edit it to remove call to git annex." + +hookWarning :: Git.Hook -> String -> Annex () +hookWarning h msg = do + r <- gitRepo + warning $ Git.hookName h ++ " hook (" ++ Git.hookFile h r ++ ") " ++ msg + +{- Runs a hook. To avoid checking if the hook exists every time, + - the existing hooks are cached. -} +runAnnexHook :: Git.Hook -> Annex () +runAnnexHook hook = do + cmd <- fromRepo $ Git.hookFile hook + m <- Annex.getState Annex.existinghooks + case M.lookup hook m of + Just True -> run cmd + Just False -> noop + Nothing -> do + exists <- hookexists cmd + Annex.changeState $ \s -> s + { Annex.existinghooks = M.insert hook exists m } + when exists $ + run cmd + where + hookexists f = liftIO $ catchBoolIO $ + isExecutable . fileMode <$> getFileStatus f + run cmd = unlessM (liftIO $ boolSystem cmd []) $ + warning $ cmd ++ " failed" diff --git a/Annex/Index.hs b/Annex/Index.hs new file mode 100644 index 0000000000..a1b2442fc2 --- /dev/null +++ b/Annex/Index.hs @@ -0,0 +1,46 @@ +{- Using other git index files + - + - Copyright 2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Annex.Index ( + withIndexFile, +) where + +import qualified Control.Exception as E + +import Common.Annex +import Git.Types +import qualified Annex +import Utility.Env +import Annex.Exception + +{- Runs an action using a different git index file. -} +withIndexFile :: FilePath -> Annex a -> Annex a +withIndexFile f a = do + g <- gitRepo +#ifdef __ANDROID__ + {- This should not be necessary on Android, but there is some + - weird getEnvironment breakage. See + - https://github.com/neurocyte/ghc-android/issues/7 + - Use getEnv to get some key environment variables that + - git expects to have. -} + let keyenv = words "USER PATH GIT_EXEC_PATH HOSTNAME HOME" + let getEnvPair k = maybe Nothing (\v -> Just (k, v)) <$> getEnv k + e <- liftIO $ catMaybes <$> forM keyenv getEnvPair + let e' = ("GIT_INDEX_FILE", f):e +#else + e <- liftIO getEnvironment + let e' = addEntry "GIT_INDEX_FILE" f e +#endif + let g' = g { gitEnv = Just e' } + + r <- tryAnnex $ do + Annex.changeState $ \s -> s { Annex.repo = g' } + a + Annex.changeState $ \s -> s { Annex.repo = (Annex.repo s) { gitEnv = gitEnv g} } + either E.throw return r diff --git a/Annex/Init.hs b/Annex/Init.hs new file mode 100644 index 0000000000..e095aef61e --- /dev/null +++ b/Annex/Init.hs @@ -0,0 +1,239 @@ +{- git-annex repository initialization + - + - Copyright 2011 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Annex.Init ( + ensureInitialized, + isInitialized, + initialize, + uninitialize, + probeCrippledFileSystem, +) where + +import Common.Annex +import Utility.Network +import qualified Annex +import qualified Git +import qualified Git.LsFiles +import qualified Git.Config +import qualified Git.Construct +import qualified Git.Types as Git +import qualified Annex.Branch +import Logs.UUID +import Annex.Version +import Annex.UUID +import Config +import Annex.Direct +import Annex.Content.Direct +import Annex.Environment +import Annex.Perms +import Backend +#ifndef mingw32_HOST_OS +import Utility.UserInfo +import Utility.FileMode +#endif +import Annex.Hook +import Git.Hook (hookFile) +import Upgrade +import Annex.Content +import Logs.Location + +import System.Log.Logger + +genDescription :: Maybe String -> Annex String +genDescription (Just d) = return d +genDescription Nothing = do + reldir <- liftIO . relHome =<< fromRepo Git.repoPath + hostname <- fromMaybe "" <$> liftIO getHostname +#ifndef mingw32_HOST_OS + let at = if null hostname then "" else "@" + username <- liftIO myUserName + return $ concat [username, at, hostname, ":", reldir] +#else + return $ concat [hostname, ":", reldir] +#endif + +initialize :: Maybe String -> Annex () +initialize mdescription = do + prepUUID + checkFifoSupport + checkCrippledFileSystem + unlessM isBare $ + hookWrite preCommitHook + setVersion supportedVersion + ifM (crippledFileSystem <&&> not <$> isBare) + ( do + enableDirectMode + setDirect True + -- Handle case where this repo was cloned from a + -- direct mode repo + , unlessM isBare + switchHEADBack + ) + createInodeSentinalFile + u <- getUUID + {- This will make the first commit to git, so ensure git is set up + - properly to allow commits when running it. -} + ensureCommit $ do + Annex.Branch.create + describeUUID u =<< genDescription mdescription + +uninitialize :: Annex () +uninitialize = do + hookUnWrite preCommitHook + removeRepoUUID + removeVersion + +{- Will automatically initialize if there is already a git-annex + - branch from somewhere. Otherwise, require a manual init + - to avoid git-annex accidentially being run in git + - repos that did not intend to use it. + - + - Checks repository version and handles upgrades too. + -} +ensureInitialized :: Annex () +ensureInitialized = do + getVersion >>= maybe needsinit checkUpgrade + fixBadBare + where + needsinit = ifM Annex.Branch.hasSibling + ( initialize Nothing + , error "First run: git-annex init" + ) + +{- Checks if a repository is initialized. Does not check version for ugrade. -} +isInitialized :: Annex Bool +isInitialized = maybe Annex.Branch.hasSibling (const $ return True) =<< getVersion + +isBare :: Annex Bool +isBare = fromRepo Git.repoIsLocalBare + +{- A crippled filesystem is one that does not allow making symlinks, + - or removing write access from files. -} +probeCrippledFileSystem :: Annex Bool +probeCrippledFileSystem = do +#ifdef mingw32_HOST_OS + return True +#else + tmp <- fromRepo gitAnnexTmpMiscDir + let f = tmp "gaprobe" + createAnnexDirectory tmp + liftIO $ writeFile f "" + uncrippled <- liftIO $ probe f + liftIO $ removeFile f + return $ not uncrippled + where + probe f = catchBoolIO $ do + let f2 = f ++ "2" + nukeFile f2 + createSymbolicLink f f2 + nukeFile f2 + preventWrite f + allowWrite f + return True +#endif + +checkCrippledFileSystem :: Annex () +checkCrippledFileSystem = whenM probeCrippledFileSystem $ do + warning "Detected a crippled filesystem." + setCrippledFileSystem True + + {- Normally git disables core.symlinks itself when the + - filesystem does not support them, but in Cygwin, git + - does support symlinks, while git-annex, not linking + - with Cygwin, does not. -} + whenM (coreSymlinks <$> Annex.getGitConfig) $ do + warning "Disabling core.symlinks." + setConfig (ConfigKey "core.symlinks") + (Git.Config.boolConfig False) + +probeFifoSupport :: Annex Bool +probeFifoSupport = do +#ifdef mingw32_HOST_OS + return False +#else + tmp <- fromRepo gitAnnexTmpMiscDir + let f = tmp "gaprobe" + createAnnexDirectory tmp + liftIO $ do + nukeFile f + ms <- tryIO $ do + createNamedPipe f ownerReadMode + getFileStatus f + nukeFile f + return $ either (const False) isNamedPipe ms +#endif + +checkFifoSupport :: Annex () +checkFifoSupport = unlessM probeFifoSupport $ do + warning "Detected a filesystem without fifo support." + warning "Disabling ssh connection caching." + setConfig (annexConfig "sshcaching") (Git.Config.boolConfig False) + +enableDirectMode :: Annex () +enableDirectMode = unlessM isDirect $ do + warning "Enabling direct mode." + top <- fromRepo Git.repoPath + (l, clean) <- inRepo $ Git.LsFiles.inRepo [top] + forM_ l $ \f -> + maybe noop (`toDirect` f) =<< isAnnexLink f + void $ liftIO clean + +{- Work around for git-annex version 5.20131118 - 5.20131127, which + - had a bug that unset core.bare when initializing a bare repository. + - + - This resulted in objects sent to the repository being stored in + - repo/.git/annex/objects, so move them to repo/annex/objects. + - + - This check slows down every git-annex run somewhat (by one file stat), + - so should be removed after a suitable period of time has passed. + - Since the bare repository may be on an offline USB drive, best to + - keep it for a while. However, git-annex was only buggy for a few + - weeks, so not too long. + -} +fixBadBare :: Annex () +fixBadBare = whenM checkBadBare $ do + ks <- getKeysPresent InAnnex + liftIO $ debugM "Init" $ unwords + [ "Detected bad bare repository with" + , show (length ks) + , "objects; fixing" + ] + g <- Annex.gitRepo + gc <- Annex.getGitConfig + d <- Git.repoPath <$> Annex.gitRepo + void $ liftIO $ boolSystem "git" + [ Param $ "--git-dir=" ++ d + , Param "config" + , Param Git.Config.coreBare + , Param $ Git.Config.boolConfig True + ] + g' <- liftIO $ Git.Construct.fromPath d + s' <- liftIO $ Annex.new $ g' { Git.location = Git.Local { Git.gitdir = d, Git.worktree = Nothing } } + Annex.changeState $ \s -> s + { Annex.repo = Annex.repo s' + , Annex.gitconfig = Annex.gitconfig s' + } + forM_ ks $ \k -> do + oldloc <- liftIO $ gitAnnexLocation k g gc + thawContentDir oldloc + moveAnnex k oldloc + logStatus k InfoPresent + let dotgit = d ".git" + liftIO $ removeDirectoryRecursive dotgit + `catchIO` const (renameDirectory dotgit (d "removeme")) + +{- A repostory with the problem won't know it's a bare repository, but will + - have no pre-commit hook (which is not set up in a bare repository), + - and will not have a HEAD file in its .git directory. -} +checkBadBare :: Annex Bool +checkBadBare = allM (not <$>) + [isBare, hasPreCommitHook, hasDotGitHEAD] + where + hasPreCommitHook = inRepo $ doesFileExist . hookFile preCommitHook + hasDotGitHEAD = inRepo $ \r -> doesFileExist $ Git.localGitDir r "HEAD" diff --git a/Annex/Journal.hs b/Annex/Journal.hs new file mode 100644 index 0000000000..395e81d293 --- /dev/null +++ b/Annex/Journal.hs @@ -0,0 +1,127 @@ +{- management of the git-annex journal + - + - The journal is used to queue up changes before they are committed to the + - git-annex branch. Among other things, it ensures that if git-annex is + - interrupted, its recorded data is not lost. + - + - Copyright 2011-2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Annex.Journal where + +import System.IO.Binary + +import Common.Annex +import Annex.Exception +import qualified Git +import Annex.Perms + +#ifdef mingw32_HOST_OS +import Utility.WinLock +#endif + +{- Records content for a file in the branch to the journal. + - + - Using the journal, rather than immediatly staging content to the index + - avoids git needing to rewrite the index after every change. + - + - The file in the journal is updated atomically, which allows + - getJournalFileStale to always return a consistent journal file + - content, although possibly not the most current one. + -} +setJournalFile :: JournalLocked -> FilePath -> String -> Annex () +setJournalFile _jl file content = do + tmp <- fromRepo gitAnnexTmpMiscDir + createAnnexDirectory =<< fromRepo gitAnnexJournalDir + createAnnexDirectory tmp + -- journal file is written atomically + jfile <- fromRepo $ journalFile file + let tmpfile = tmp takeFileName jfile + liftIO $ do + writeBinaryFile tmpfile content + moveFile tmpfile jfile + +{- Gets any journalled content for a file in the branch. -} +getJournalFile :: JournalLocked -> FilePath -> Annex (Maybe String) +getJournalFile _jl = getJournalFileStale + +{- Without locking, this is not guaranteed to be the most recent + - version of the file in the journal, so should not be used as a basis for + - changes. -} +getJournalFileStale :: FilePath -> Annex (Maybe String) +getJournalFileStale file = inRepo $ \g -> catchMaybeIO $ + readFileStrict $ journalFile file g + +{- List of files that have updated content in the journal. -} +getJournalledFiles :: JournalLocked -> Annex [FilePath] +getJournalledFiles jl = map fileJournal <$> getJournalFiles jl + +getJournalledFilesStale :: Annex [FilePath] +getJournalledFilesStale = map fileJournal <$> getJournalFilesStale + +{- List of existing journal files. -} +getJournalFiles :: JournalLocked -> Annex [FilePath] +getJournalFiles _jl = getJournalFilesStale + +{- List of existing journal files, but without locking, may miss new ones + - just being added, or may have false positives if the journal is staged + - as it is run. -} +getJournalFilesStale :: Annex [FilePath] +getJournalFilesStale = do + g <- gitRepo + fs <- liftIO $ catchDefaultIO [] $ + getDirectoryContents $ gitAnnexJournalDir g + return $ filter (`notElem` [".", ".."]) fs + +{- Checks if there are changes in the journal. -} +journalDirty :: Annex Bool +journalDirty = not . null <$> getJournalFilesStale + +{- Produces a filename to use in the journal for a file on the branch. + - + - The journal typically won't have a lot of files in it, so the hashing + - used in the branch is not necessary, and all the files are put directly + - in the journal directory. + -} +journalFile :: FilePath -> Git.Repo -> FilePath +journalFile file repo = gitAnnexJournalDir repo concatMap mangle file + where + mangle c + | c == pathSeparator = "_" + | c == '_' = "__" + | otherwise = [c] + +{- Converts a journal file (relative to the journal dir) back to the + - filename on the branch. -} +fileJournal :: FilePath -> FilePath +fileJournal = replace [pathSeparator, pathSeparator] "_" . + replace "_" [pathSeparator] + +{- Sentinal value, only produced by lockJournal; required + - as a parameter by things that need to ensure the journal is + - locked. -} +data JournalLocked = ProduceJournalLocked + +{- Runs an action that modifies the journal, using locking to avoid + - contention with other git-annex processes. -} +lockJournal :: (JournalLocked -> Annex a) -> Annex a +lockJournal a = do + lockfile <- fromRepo gitAnnexJournalLock + createAnnexDirectory $ takeDirectory lockfile + mode <- annexFileMode + bracketIO (lock lockfile mode) unlock (const $ a ProduceJournalLocked) + where +#ifndef mingw32_HOST_OS + lock lockfile mode = do + l <- noUmask mode $ createFile lockfile mode + waitToSetLock l (WriteLock, AbsoluteSeek, 0, 0) + return l + unlock = closeFd +#else + lock lockfile _mode = waitToLock $ lockExclusive lockfile + unlock = dropLock +#endif diff --git a/Annex/Link.hs b/Annex/Link.hs new file mode 100644 index 0000000000..26991e9118 --- /dev/null +++ b/Annex/Link.hs @@ -0,0 +1,105 @@ +{- git-annex links to content + - + - On file systems that support them, symlinks are used. + - + - On other filesystems, git instead stores the symlink target in a regular + - file. + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Annex.Link where + +import Common.Annex +import qualified Annex +import qualified Git.HashObject +import qualified Git.UpdateIndex +import qualified Annex.Queue +import Git.Types +import Git.FilePath + +type LinkTarget = String + +{- Checks if a file is a link to a key. -} +isAnnexLink :: FilePath -> Annex (Maybe Key) +isAnnexLink file = maybe Nothing (fileKey . takeFileName) <$> getAnnexLinkTarget file + +{- Gets the link target of a symlink. + - + - On a filesystem that does not support symlinks, fall back to getting the + - link target by looking inside the file. + - + - Returns Nothing if the file is not a symlink, or not a link to annex + - content. + -} +getAnnexLinkTarget :: FilePath -> Annex (Maybe LinkTarget) +getAnnexLinkTarget file = ifM (coreSymlinks <$> Annex.getGitConfig) + ( check readSymbolicLink $ + return Nothing + , check readSymbolicLink $ + check probefilecontent $ + return Nothing + ) + where + check getlinktarget fallback = do + v <- liftIO $ catchMaybeIO $ getlinktarget file + case v of + Just l + | isLinkToAnnex (fromInternalGitPath l) -> return v + | otherwise -> return Nothing + Nothing -> fallback + + probefilecontent f = withFile f ReadMode $ \h -> do + fileEncoding h + -- The first 8k is more than enough to read; link + -- files are small. + s <- take 8192 <$> hGetContents h + -- If we got the full 8k, the file is too large + if length s == 8192 + then return "" + else + -- If there are any NUL or newline + -- characters, or whitespace, we + -- certianly don't have a link to a + -- git-annex key. + return $ if any (`elem` s) "\0\n\r \t" + then "" + else s + +{- Creates a link on disk. + - + - On a filesystem that does not support symlinks, writes the link target + - to a file. Note that git will only treat the file as a symlink if + - it's staged as such, so use addAnnexLink when adding a new file or + - modified link to git. + -} +makeAnnexLink :: LinkTarget -> FilePath -> Annex () +makeAnnexLink linktarget file = ifM (coreSymlinks <$> Annex.getGitConfig) + ( liftIO $ do + void $ tryIO $ removeFile file + createSymbolicLink linktarget file + , liftIO $ writeFile file linktarget + ) + +{- Creates a link on disk, and additionally stages it in git. -} +addAnnexLink :: LinkTarget -> FilePath -> Annex () +addAnnexLink linktarget file = do + makeAnnexLink linktarget file + stageSymlink file =<< hashSymlink linktarget + +{- Injects a symlink target into git, returning its Sha. -} +hashSymlink :: LinkTarget -> Annex Sha +hashSymlink linktarget = inRepo $ Git.HashObject.hashObject BlobObject $ + toInternalGitPath linktarget + +hashSymlink' :: Git.HashObject.HashObjectHandle -> LinkTarget -> Annex Sha +hashSymlink' h linktarget = liftIO $ Git.HashObject.hashBlob h $ + toInternalGitPath linktarget + +{- Stages a symlink to the annex, using a Sha of its target. -} +stageSymlink :: FilePath -> Sha -> Annex () +stageSymlink file sha = + Annex.Queue.addUpdateIndex =<< + inRepo (Git.UpdateIndex.stageSymlink file sha) diff --git a/Annex/LockPool.hs b/Annex/LockPool.hs new file mode 100644 index 0000000000..5fc167d287 --- /dev/null +++ b/Annex/LockPool.hs @@ -0,0 +1,60 @@ +{- git-annex lock pool + - + - Copyright 2012, 2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Annex.LockPool where + +import Common.Annex +import Annex +import Types.LockPool + +import qualified Data.Map as M + +#ifndef mingw32_HOST_OS +import Annex.Perms +#else +import Utility.WinLock +#endif + +{- Create a specified lock file, and takes a shared lock. -} +lockFile :: FilePath -> Annex () +lockFile file = go =<< fromPool file + where + go (Just _) = noop -- already locked + go Nothing = do +#ifndef mingw32_HOST_OS + mode <- annexFileMode + lockhandle <- liftIO $ noUmask mode $ + openFd file ReadOnly (Just mode) defaultFileFlags + liftIO $ waitToSetLock lockhandle (ReadLock, AbsoluteSeek, 0, 0) +#else + lockhandle <- liftIO $ waitToLock $ lockShared file +#endif + changePool $ M.insert file lockhandle + +unlockFile :: FilePath -> Annex () +unlockFile file = maybe noop go =<< fromPool file + where + go lockhandle = do +#ifndef mingw32_HOST_OS + liftIO $ closeFd lockhandle +#else + liftIO $ dropLock lockhandle +#endif + changePool $ M.delete file + +getPool :: Annex LockPool +getPool = getState lockpool + +fromPool :: FilePath -> Annex (Maybe LockHandle) +fromPool file = M.lookup file <$> getPool + +changePool :: (LockPool -> LockPool) -> Annex () +changePool a = do + m <- getPool + changeState $ \s -> s { lockpool = a m } diff --git a/Annex/MetaData.hs b/Annex/MetaData.hs new file mode 100644 index 0000000000..f382f0ab1a --- /dev/null +++ b/Annex/MetaData.hs @@ -0,0 +1,56 @@ +{- git-annex metadata + - + - Copyright 2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Annex.MetaData ( + genMetaData, + module X +) where + +import Common.Annex +import qualified Annex +import Types.MetaData as X +import Annex.MetaData.StandardFields as X +import Logs.MetaData +import Annex.CatFile + +import qualified Data.Set as S +import qualified Data.Map as M +import Data.Time.Calendar +import Data.Time.Clock +import Data.Time.Clock.POSIX + +{- Adds metadata for a file that has just been ingested into the + - annex, but has not yet been committed to git. + - + - When the file has been modified, the metadata is copied over + - from the old key to the new key. Note that it looks at the old key as + - committed to HEAD -- the new key may or may not have already been staged + - in th annex. + - + - Also, can generate new metadata, if configured to do so. + -} +genMetaData :: Key -> FilePath -> FileStatus -> Annex () +genMetaData key file status = do + maybe noop (flip copyMetaData key) =<< catKeyFileHEAD file + whenM (annexGenMetaData <$> Annex.getGitConfig) $ do + metadata <- getCurrentMetaData key + let metadata' = genMetaData' status metadata + unless (metadata' == emptyMetaData) $ + addMetaData key metadata' + +{- Generates metadata from the FileStatus. + - Does not overwrite any existing metadata values. -} +genMetaData' :: FileStatus -> MetaData -> MetaData +genMetaData' status old = MetaData $ M.fromList $ filter isnew + [ (yearMetaField, S.singleton $ toMetaValue $ show y) + , (monthMetaField, S.singleton $ toMetaValue $ show m) + ] + where + isnew (f, _) = S.null (currentMetaDataValues f old) + (y, m, _d) = toGregorian $ utctDay $ + posixSecondsToUTCTime $ realToFrac $ + modificationTime status diff --git a/Annex/MetaData/StandardFields.hs b/Annex/MetaData/StandardFields.hs new file mode 100644 index 0000000000..d41fb1506f --- /dev/null +++ b/Annex/MetaData/StandardFields.hs @@ -0,0 +1,47 @@ +{- git-annex metadata, standard fields + - + - Copyright 2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Annex.MetaData.StandardFields ( + tagMetaField, + yearMetaField, + monthMetaField, + lastChangedField, + mkLastChangedField, + isLastChangedField +) where + +import Types.MetaData + +import Data.List + +tagMetaField :: MetaField +tagMetaField = mkMetaFieldUnchecked "tag" + +yearMetaField :: MetaField +yearMetaField = mkMetaFieldUnchecked "year" + +monthMetaField :: MetaField +monthMetaField = mkMetaFieldUnchecked "month" + +lastChangedField :: MetaField +lastChangedField = mkMetaFieldUnchecked lastchanged + +mkLastChangedField :: MetaField -> MetaField +mkLastChangedField f = mkMetaFieldUnchecked (fromMetaField f ++ lastchangedSuffix) + +isLastChangedField :: MetaField -> Bool +isLastChangedField f + | f == lastChangedField = True + | otherwise = lastchanged `isSuffixOf` s && s /= lastchangedSuffix + where + s = fromMetaField f + +lastchanged :: String +lastchanged = "lastchanged" + +lastchangedSuffix :: String +lastchangedSuffix = "-lastchanged" diff --git a/Annex/Notification.hs b/Annex/Notification.hs new file mode 100644 index 0000000000..06a099888b --- /dev/null +++ b/Annex/Notification.hs @@ -0,0 +1,81 @@ +{- git-annex desktop notifications + - + - Copyright 2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Annex.Notification where + +import Common.Annex +import Logs.Transfer +#ifdef WITH_DBUS_NOTIFICATIONS +import qualified Annex +import Types.DesktopNotify +import qualified DBus.Notify as Notify +import qualified DBus.Client +#endif + +-- Witness that notification has happened. +data NotifyWitness = NotifyWitness + +{- Wrap around an action that performs a transfer, which may run multiple + - attempts. Displays notification when supported and when the user asked + - for it. -} +notifyTransfer :: Direction -> Maybe FilePath -> (NotifyWitness -> Annex Bool) -> Annex Bool +notifyTransfer _ Nothing a = a NotifyWitness +#ifdef WITH_DBUS_NOTIFICATIONS +notifyTransfer direction (Just f) a = do + wanted <- Annex.getState Annex.desktopnotify + let action = if direction == Upload then "uploading" else "downloading" + let basedesc = action ++ " " ++ f + let startdesc = "started " ++ basedesc + let enddesc ok = if ok + then "finished " ++ basedesc + else basedesc ++ " failed" + if (notifyStart wanted || notifyFinish wanted) + then do + client <- liftIO DBus.Client.connectSession + startnotification <- liftIO $ if notifyStart wanted + then Just <$> Notify.notify client (mkNote startdesc) + else pure Nothing + ok <- a NotifyWitness + when (notifyFinish wanted) $ liftIO $ void $ maybe + (Notify.notify client $ mkNote $ enddesc ok) + (\n -> Notify.replace client n $ mkNote $ enddesc ok) + startnotification + return ok + else a NotifyWitness +#else +notifyTransfer _ (Just _) a = do a NotifyWitness +#endif + +notifyDrop :: Maybe FilePath -> Bool -> Annex () +notifyDrop Nothing _ = noop +#ifdef WITH_DBUS_NOTIFICATIONS +notifyDrop (Just f) ok = do + wanted <- Annex.getState Annex.desktopnotify + when (notifyFinish wanted) $ liftIO $ do + client <- DBus.Client.connectSession + let msg = if ok + then "dropped " ++ f + else "failed to drop" ++ f + void $ Notify.notify client (mkNote msg) +#else +notifyDrop (Just _) _ = noop +#endif + +#ifdef WITH_DBUS_NOTIFICATIONS +mkNote :: String -> Notify.Note +mkNote desc = Notify.blankNote + { Notify.appName = "git-annex" + , Notify.body = Just $ Notify.Text desc + , Notify.hints = + [ Notify.Category Notify.Transfer + , Notify.Urgency Notify.Low + , Notify.SuppressSound True + ] + } +#endif diff --git a/Annex/Path.hs b/Annex/Path.hs new file mode 100644 index 0000000000..a8c4907b23 --- /dev/null +++ b/Annex/Path.hs @@ -0,0 +1,34 @@ +{- git-annex program path + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Annex.Path where + +import Common +import Config.Files +import System.Environment + +{- A fully qualified path to the currently running git-annex program. + - + - getExecutablePath is available since ghc 7.4.2. On OSs it supports + - well, it returns the complete path to the program. But, on other OSs, + - it might return just the basename. + -} +programPath :: IO (Maybe FilePath) +programPath = do +#if MIN_VERSION_base(4,6,0) + exe <- getExecutablePath + p <- if isAbsolute exe + then return exe + else readProgramFile +#else + p <- readProgramFile +#endif + -- In case readProgramFile returned just the command name, + -- fall back to finding it in PATH. + searchPath p diff --git a/Annex/Perms.hs b/Annex/Perms.hs new file mode 100644 index 0000000000..e3a2fa65a2 --- /dev/null +++ b/Annex/Perms.hs @@ -0,0 +1,125 @@ +{- git-annex file permissions + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Annex.Perms ( + setAnnexFilePerm, + setAnnexDirPerm, + annexFileMode, + createAnnexDirectory, + noUmask, + createContentDir, + freezeContentDir, + thawContentDir, + modifyContent, +) where + +import Common.Annex +import Utility.FileMode +import Git.SharedRepository +import qualified Annex +import Annex.Exception +import Config + +import System.Posix.Types + +withShared :: (SharedRepository -> Annex a) -> Annex a +withShared a = maybe startup a =<< Annex.getState Annex.shared + where + startup = do + shared <- fromRepo getSharedRepository + Annex.changeState $ \s -> s { Annex.shared = Just shared } + a shared + +setAnnexFilePerm :: FilePath -> Annex () +setAnnexFilePerm = setAnnexPerm False + +setAnnexDirPerm :: FilePath -> Annex () +setAnnexDirPerm = setAnnexPerm True + +{- Sets appropriate file mode for a file or directory in the annex, + - other than the content files and content directory. Normally, + - use the default mode, but with core.sharedRepository set, + - allow the group to write, etc. -} +setAnnexPerm :: Bool -> FilePath -> Annex () +setAnnexPerm isdir file = unlessM crippledFileSystem $ + withShared $ liftIO . go + where + go GroupShared = modifyFileMode file $ addModes $ + groupSharedModes ++ + if isdir then [ ownerExecuteMode, groupExecuteMode ] else [] + go AllShared = modifyFileMode file $ addModes $ + readModes ++ + [ ownerWriteMode, groupWriteMode ] ++ + if isdir then executeModes else [] + go _ = noop + +{- Gets the appropriate mode to use for creating a file in the annex + - (other than content files, which are locked down more). -} +annexFileMode :: Annex FileMode +annexFileMode = withShared $ return . go + where + go GroupShared = sharedmode + go AllShared = combineModes (sharedmode:readModes) + go _ = stdFileMode + sharedmode = combineModes groupSharedModes + +{- Creates a directory inside the gitAnnexDir, including any parent + - directories. Makes directories with appropriate permissions. -} +createAnnexDirectory :: FilePath -> Annex () +createAnnexDirectory dir = traverse dir [] =<< top + where + top = parentDir <$> fromRepo gitAnnexDir + traverse d below stop + | d `equalFilePath` stop = done + | otherwise = ifM (liftIO $ doesDirectoryExist d) + ( done + , traverse (parentDir d) (d:below) stop + ) + where + done = forM_ below $ \p -> do + liftIO $ createDirectoryIfMissing True p + setAnnexDirPerm p + +{- Blocks writing to the directory an annexed file is in, to prevent the + - file accidentially being deleted. However, if core.sharedRepository + - is set, this is not done, since the group must be allowed to delete the + - file. + -} +freezeContentDir :: FilePath -> Annex () +freezeContentDir file = unlessM crippledFileSystem $ + liftIO . go =<< fromRepo getSharedRepository + where + dir = parentDir file + go GroupShared = groupWriteRead dir + go AllShared = groupWriteRead dir + go _ = preventWrite dir + +thawContentDir :: FilePath -> Annex () +thawContentDir file = unlessM crippledFileSystem $ + liftIO $ allowWrite $ parentDir file + +{- Makes the directory tree to store an annexed file's content, + - with appropriate permissions on each level. -} +createContentDir :: FilePath -> Annex () +createContentDir dest = do + unlessM (liftIO $ doesDirectoryExist dir) $ + createAnnexDirectory dir + -- might have already existed with restricted perms + unlessM crippledFileSystem $ + liftIO $ allowWrite dir + where + dir = parentDir dest + +{- Creates the content directory for a file if it doesn't already exist, + - or thaws it if it does, then runs an action to modify the file, and + - finally, freezes the content directory. -} +modifyContent :: FilePath -> Annex a -> Annex a +modifyContent f a = do + createContentDir f -- also thaws it + v <- tryAnnex a + freezeContentDir f + either throwAnnex return v diff --git a/Annex/Queue.hs b/Annex/Queue.hs new file mode 100644 index 0000000000..a5ef600379 --- /dev/null +++ b/Annex/Queue.hs @@ -0,0 +1,62 @@ +{- git-annex command queue + - + - Copyright 2011, 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Annex.Queue ( + addCommand, + addUpdateIndex, + flush, + flushWhenFull, + size +) where + +import Common.Annex +import Annex hiding (new) +import qualified Git.Queue +import qualified Git.UpdateIndex + +{- Adds a git command to the queue. -} +addCommand :: String -> [CommandParam] -> [FilePath] -> Annex () +addCommand command params files = do + q <- get + store <=< inRepo $ Git.Queue.addCommand command params files q + +{- Adds an update-index stream to the queue. -} +addUpdateIndex :: Git.UpdateIndex.Streamer -> Annex () +addUpdateIndex streamer = do + q <- get + store <=< inRepo $ Git.Queue.addUpdateIndex streamer q + +{- Runs the queue if it is full. Should be called periodically. -} +flushWhenFull :: Annex () +flushWhenFull = do + q <- get + when (Git.Queue.full q) flush + +{- Runs (and empties) the queue. -} +flush :: Annex () +flush = do + q <- get + unless (0 == Git.Queue.size q) $ do + showStoringStateAction + q' <- inRepo $ Git.Queue.flush q + store q' + +{- Gets the size of the queue. -} +size :: Annex Int +size = Git.Queue.size <$> get + +get :: Annex Git.Queue.Queue +get = maybe new return =<< getState repoqueue + +new :: Annex Git.Queue.Queue +new = do + q <- Git.Queue.new . annexQueueSize <$> getGitConfig + store q + return q + +store :: Git.Queue.Queue -> Annex () +store q = changeState $ \s -> s { repoqueue = Just q } diff --git a/Annex/Quvi.hs b/Annex/Quvi.hs new file mode 100644 index 0000000000..1a2edf6b8a --- /dev/null +++ b/Annex/Quvi.hs @@ -0,0 +1,33 @@ +{- quvi options for git-annex + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE Rank2Types #-} + +module Annex.Quvi where + +import Common.Annex +import qualified Annex +import Utility.Quvi +import Utility.Url + +withQuviOptions :: forall a. Query a -> [QuviParam] -> URLString -> Annex a +withQuviOptions a ps url = do + v <- quviVersion + opts <- map Param . annexQuviOptions <$> Annex.getGitConfig + liftIO $ a v (map (\mkp -> mkp v) ps++opts) url + +quviSupported :: URLString -> Annex Bool +quviSupported u = liftIO . flip supported u =<< quviVersion + +quviVersion :: Annex QuviVersion +quviVersion = go =<< Annex.getState Annex.quviversion + where + go (Just v) = return v + go Nothing = do + v <- liftIO probeVersion + Annex.changeState $ \s -> s { Annex.quviversion = Just v } + return v diff --git a/Annex/ReplaceFile.hs b/Annex/ReplaceFile.hs new file mode 100644 index 0000000000..8b15f5ce35 --- /dev/null +++ b/Annex/ReplaceFile.hs @@ -0,0 +1,39 @@ +{- git-annex file replacing + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Annex.ReplaceFile where + +import Common.Annex +import Annex.Perms +import Annex.Exception + +{- Replaces a possibly already existing file with a new version, + - atomically, by running an action. + - + - The action is passed a temp file, which it can write to, and once + - done the temp file is moved into place. + - + - The action can throw an IO exception, in which case the temp file + - will be deleted, and the existing file will be preserved. + - + - Throws an IO exception when it was unable to replace the file. + -} +replaceFile :: FilePath -> (FilePath -> Annex ()) -> Annex () +replaceFile file a = do + tmpdir <- fromRepo gitAnnexTmpMiscDir + void $ createAnnexDirectory tmpdir + bracketIO (setup tmpdir) nukeFile $ \tmpfile -> do + a tmpfile + liftIO $ catchIO (rename tmpfile file) (fallback tmpfile) + where + setup tmpdir = do + (tmpfile, h) <- openTempFileWithDefaultPermissions tmpdir "tmp" + hClose h + return tmpfile + fallback tmpfile _ = do + createDirectoryIfMissing True $ parentDir file + moveFile tmpfile file diff --git a/Annex/Ssh.hs b/Annex/Ssh.hs new file mode 100644 index 0000000000..bd10a40d40 --- /dev/null +++ b/Annex/Ssh.hs @@ -0,0 +1,201 @@ +{- git-annex ssh interface, with connection caching + - + - Copyright 2012,2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Annex.Ssh ( + sshCachingOptions, + sshCacheDir, + sshReadPort, +) where + +import qualified Data.Map as M +import Data.Hash.MD5 +import System.Process (cwd) + +import Common.Annex +import Annex.LockPool +import qualified Build.SysConfig as SysConfig +import qualified Annex +import Config +import Utility.Env +import Types.CleanupActions +#ifndef mingw32_HOST_OS +import Annex.Perms +#endif + +{- Generates parameters to ssh to a given host (or user@host) on a given + - port, with connection caching. -} +sshCachingOptions :: (String, Maybe Integer) -> [CommandParam] -> Annex [CommandParam] +sshCachingOptions (host, port) opts = do + Annex.addCleanup SshCachingCleanup sshCleanup + go =<< sshInfo (host, port) + where + go (Nothing, params) = ret params + go (Just socketfile, params) = do + cleanstale + liftIO $ createDirectoryIfMissing True $ parentDir socketfile + lockFile $ socket2lock socketfile + ret params + ret ps = return $ ps ++ opts ++ portParams port ++ [Param "-T"] + -- If the lock pool is empty, this is the first ssh of this + -- run. There could be stale ssh connections hanging around + -- from a previous git-annex run that was interrupted. + cleanstale = whenM (not . any isLock . M.keys <$> getPool) + sshCleanup + +{- Returns a filename to use for a ssh connection caching socket, and + - parameters to enable ssh connection caching. -} +sshInfo :: (String, Maybe Integer) -> Annex (Maybe FilePath, [CommandParam]) +sshInfo (host, port) = go =<< sshCacheDir + where + go Nothing = return (Nothing, []) + go (Just dir) = do + r <- liftIO $ bestSocketPath $ dir hostport2socket host port + return $ case r of + Nothing -> (Nothing, []) + Just socketfile -> (Just socketfile, sshConnectionCachingParams socketfile) + +{- Given an absolute path to use for a socket file, + - returns whichever is shorter of that or the relative path to the same + - file. + - + - If no path can be constructed that is a valid socket, returns Nothing. -} +bestSocketPath :: FilePath -> IO (Maybe FilePath) +bestSocketPath abssocketfile = do + relsocketfile <- liftIO $ relPathCwdToFile abssocketfile + let socketfile = if length abssocketfile <= length relsocketfile + then abssocketfile + else relsocketfile + return $ if valid_unix_socket_path (socketfile ++ sshgarbage) + then Just socketfile + else Nothing + where + -- ssh appends a 16 char extension to the socket when setting it + -- up, which needs to be taken into account when checking + -- that a valid socket was constructed. + sshgarbage = replicate (1+16) 'X' + +sshConnectionCachingParams :: FilePath -> [CommandParam] +sshConnectionCachingParams socketfile = + [ Param "-S", Param socketfile + , Params "-o ControlMaster=auto -o ControlPersist=yes" + ] + +{- ssh connection caching creates sockets, so will not work on a + - crippled filesystem. A GIT_ANNEX_TMP_DIR can be provided to use + - a different filesystem. -} +sshCacheDir :: Annex (Maybe FilePath) +sshCacheDir + | SysConfig.sshconnectioncaching = ifM crippledFileSystem + ( maybe (return Nothing) usetmpdir =<< gettmpdir + , ifM (fromMaybe True . annexSshCaching <$> Annex.getGitConfig) + ( Just <$> fromRepo gitAnnexSshDir + , return Nothing + ) + ) + | otherwise = return Nothing + where + gettmpdir = liftIO $ getEnv "GIT_ANNEX_TMP_DIR" + usetmpdir tmpdir = liftIO $ catchMaybeIO $ do + createDirectoryIfMissing True tmpdir + return tmpdir + +portParams :: Maybe Integer -> [CommandParam] +portParams Nothing = [] +portParams (Just port) = [Param "-p", Param $ show port] + +{- Stop any unused ssh processes. -} +sshCleanup :: Annex () +sshCleanup = go =<< sshCacheDir + where + go Nothing = noop + go (Just dir) = do + sockets <- liftIO $ filter (not . isLock) + <$> catchDefaultIO [] (dirContents dir) + forM_ sockets cleanup + cleanup socketfile = do +#ifndef mingw32_HOST_OS + -- Drop any shared lock we have, and take an + -- exclusive lock, without blocking. If the lock + -- succeeds, nothing is using this ssh, and it can + -- be stopped. + let lockfile = socket2lock socketfile + unlockFile lockfile + mode <- annexFileMode + fd <- liftIO $ noUmask mode $ + openFd lockfile ReadWrite (Just mode) defaultFileFlags + v <- liftIO $ tryIO $ + setLock fd (WriteLock, AbsoluteSeek, 0, 0) + case v of + Left _ -> noop + Right _ -> stopssh socketfile + liftIO $ closeFd fd +#else + stopssh socketfile +#endif + stopssh socketfile = do + let (dir, base) = splitFileName socketfile + let params = sshConnectionCachingParams base + -- "ssh -O stop" is noisy on stderr even with -q + void $ liftIO $ catchMaybeIO $ + withQuietOutput createProcessSuccess $ + (proc "ssh" $ toCommand $ + [ Params "-O stop" + ] ++ params ++ [Param "localhost"]) + { cwd = Just dir } + liftIO $ nukeFile socketfile + -- Cannot remove the lock file; other processes may + -- be waiting on our exclusive lock to use it. + +{- This needs to be as short as possible, due to limitations on the length + - of the path to a socket file. At the same time, it needs to be unique + - for each host. + -} +hostport2socket :: String -> Maybe Integer -> FilePath +hostport2socket host Nothing = hostport2socket' host +hostport2socket host (Just port) = hostport2socket' $ host ++ "!" ++ show port +hostport2socket' :: String -> FilePath +hostport2socket' s + | length s > lengthofmd5s = md5s (Str s) + | otherwise = s + where + lengthofmd5s = 32 + +socket2lock :: FilePath -> FilePath +socket2lock socket = socket ++ lockExt + +isLock :: FilePath -> Bool +isLock f = lockExt `isSuffixOf` f + +lockExt :: String +lockExt = ".lock" + +{- This is the size of the sun_path component of sockaddr_un, which + - is the limit to the total length of the filename of a unix socket. + - + - On Linux, this is 108. On OSX, 104. TODO: Probe + -} +sizeof_sockaddr_un_sun_path :: Int +sizeof_sockaddr_un_sun_path = 100 + +{- Note that this looks at the true length of the path in bytes, as it will + - appear on disk. -} +valid_unix_socket_path :: FilePath -> Bool +valid_unix_socket_path f = length (decodeW8 f) < sizeof_sockaddr_un_sun_path + +{- Parses the SSH port, and returns the other OpenSSH options. If + - several ports are found, the last one takes precedence. -} +sshReadPort :: [String] -> (Maybe Integer, [String]) +sshReadPort params = (port, reverse args) + where + (port,args) = aux (Nothing, []) params + aux (p,ps) [] = (p,ps) + aux (_,ps) ("-p":p:rest) = aux (readPort p, ps) rest + aux (p,ps) (q:rest) | "-p" `isPrefixOf` q = aux (readPort $ drop 2 q, ps) rest + | otherwise = aux (p,q:ps) rest + readPort p = fmap fst $ listToMaybe $ reads p diff --git a/Annex/TaggedPush.hs b/Annex/TaggedPush.hs new file mode 100644 index 0000000000..35fdf333c4 --- /dev/null +++ b/Annex/TaggedPush.hs @@ -0,0 +1,61 @@ +{- git-annex tagged pushes + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Annex.TaggedPush where + +import Common.Annex +import qualified Remote +import qualified Annex.Branch +import qualified Git +import qualified Git.Ref +import qualified Git.Command +import qualified Git.Branch +import Utility.Base64 + +{- Converts a git branch into a branch that is tagged with a UUID, typically + - the UUID of the repo that will be pushing it, and possibly with other + - information. + - + - Pushing to branches on the remote that have our uuid in them is ugly, + - but it reserves those branches for pushing by us, and so our pushes will + - never conflict with other pushes. + - + - To avoid cluttering up the branch display, the branch is put under + - refs/synced/, rather than the usual refs/remotes/ + - + - Both UUIDs and Base64 encoded data are always legal to be used in git + - refs, per git-check-ref-format. + -} +toTaggedBranch :: UUID -> Maybe String -> Git.Branch -> Git.Branch +toTaggedBranch u info b = Git.Ref $ intercalate "/" $ catMaybes + [ Just "refs/synced" + , Just $ fromUUID u + , toB64 <$> info + , Just $ Git.fromRef $ Git.Ref.base b + ] + +fromTaggedBranch :: Git.Branch -> Maybe (UUID, Maybe String) +fromTaggedBranch b = case split "/" $ Git.fromRef b of + ("refs":"synced":u:info:_base) -> + Just (toUUID u, fromB64Maybe info) + ("refs":"synced":u:_base) -> + Just (toUUID u, Nothing) + _ -> Nothing + where + +taggedPush :: UUID -> Maybe String -> Git.Ref -> Remote -> Git.Repo -> IO Bool +taggedPush u info branch remote = Git.Command.runBool + [ Param "push" + , Param $ Remote.name remote + {- Using forcePush here is safe because we "own" the tagged branch + - we're pushing; it has no other writers. Ensures it is pushed + - even if it has been rewritten by a transition. -} + , Param $ Git.Branch.forcePush $ refspec Annex.Branch.name + , Param $ refspec branch + ] + where + refspec b = Git.fromRef b ++ ":" ++ Git.fromRef (toTaggedBranch u info b) diff --git a/Annex/Transfer.hs b/Annex/Transfer.hs new file mode 100644 index 0000000000..df5aba09cf --- /dev/null +++ b/Annex/Transfer.hs @@ -0,0 +1,131 @@ +{- git-annex transfers + - + - Copyright 2012-2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Annex.Transfer ( + module X, + upload, + download, + runTransfer, + noRetry, + forwardRetry, +) where + +import Common.Annex +import Logs.Transfer as X +import Annex.Notification as X +import Annex.Perms +import Annex.Exception +import Utility.Metered +#ifdef mingw32_HOST_OS +import Utility.WinLock +#endif + +import Control.Concurrent + +upload :: UUID -> Key -> AssociatedFile -> RetryDecider -> (MeterUpdate -> Annex Bool) -> NotifyWitness -> Annex Bool +upload u key f d a _witness = runTransfer (Transfer Upload u key) f d a + +download :: UUID -> Key -> AssociatedFile -> RetryDecider -> (MeterUpdate -> Annex Bool) -> NotifyWitness -> Annex Bool +download u key f d a _witness = runTransfer (Transfer Download u key) f d a + +{- Runs a transfer action. Creates and locks the lock file while the + - action is running, and stores info in the transfer information + - file. + - + - If the transfer action returns False, the transfer info is + - left in the failedTransferDir. + - + - If the transfer is already in progress, returns False. + - + - An upload can be run from a read-only filesystem, and in this case + - no transfer information or lock file is used. + -} +runTransfer :: Transfer -> Maybe FilePath -> RetryDecider -> (MeterUpdate -> Annex Bool) -> Annex Bool +runTransfer t file shouldretry a = do + info <- liftIO $ startTransferInfo file + (meter, tfile, metervar) <- mkProgressUpdater t info + mode <- annexFileMode + (fd, inprogress) <- liftIO $ prep tfile mode info + if inprogress + then do + showNote "transfer already in progress" + return False + else do + ok <- retry info metervar $ + bracketIO (return fd) (cleanup tfile) (const $ a meter) + unless ok $ recordFailedTransfer t info + return ok + where +#ifndef mingw32_HOST_OS + prep tfile mode info = do + mfd <- catchMaybeIO $ + openFd (transferLockFile tfile) ReadWrite (Just mode) + defaultFileFlags { trunc = True } + case mfd of + Nothing -> return (Nothing, False) + Just fd -> do + locked <- catchMaybeIO $ + setLock fd (WriteLock, AbsoluteSeek, 0, 0) + if isNothing locked + then return (Nothing, True) + else do + void $ tryIO $ writeTransferInfoFile info tfile + return (mfd, False) +#else + prep tfile _mode info = do + v <- catchMaybeIO $ lockExclusive (transferLockFile tfile) + case v of + Nothing -> return (Nothing, False) + Just Nothing -> return (Nothing, True) + Just (Just lockhandle) -> do + void $ tryIO $ writeTransferInfoFile info tfile + return (Just lockhandle, False) +#endif + cleanup _ Nothing = noop + cleanup tfile (Just lockhandle) = do + void $ tryIO $ removeFile tfile +#ifndef mingw32_HOST_OS + void $ tryIO $ removeFile $ transferLockFile tfile + closeFd lockhandle +#else + {- Windows cannot delete the lockfile until the lock + - is closed. So it's possible to race with another + - process that takes the lock before it's removed, + - so ignore failure to remove. + -} + dropLock lockhandle + void $ tryIO $ removeFile $ transferLockFile tfile +#endif + retry oldinfo metervar run = do + v <- tryAnnex run + case v of + Right b -> return b + Left _ -> do + b <- getbytescomplete metervar + let newinfo = oldinfo { bytesComplete = Just b } + if shouldretry oldinfo newinfo + then retry newinfo metervar run + else return False + getbytescomplete metervar + | transferDirection t == Upload = + liftIO $ readMVar metervar + | otherwise = do + f <- fromRepo $ gitAnnexTmpObjectLocation (transferKey t) + liftIO $ catchDefaultIO 0 $ + fromIntegral . fileSize <$> getFileStatus f + +type RetryDecider = TransferInfo -> TransferInfo -> Bool + +noRetry :: RetryDecider +noRetry _ _ = False + +{- Retries a transfer when it fails, as long as the failed transfer managed + - to send some data. -} +forwardRetry :: RetryDecider +forwardRetry old new = bytesComplete old < bytesComplete new diff --git a/Annex/UUID.hs b/Annex/UUID.hs new file mode 100644 index 0000000000..4e274503bf --- /dev/null +++ b/Annex/UUID.hs @@ -0,0 +1,96 @@ +{- git-annex uuids + - + - Each git repository used by git-annex has an annex.uuid setting that + - uniquely identifies that repository. + - + - UUIDs of remotes are cached in git config, using keys named + - remote..annex-uuid + - + - Copyright 2010-2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Annex.UUID ( + getUUID, + getRepoUUID, + getUncachedUUID, + prepUUID, + genUUID, + genUUIDInNameSpace, + gCryptNameSpace, + removeRepoUUID, + storeUUID, + setUUID, +) where + +import Common.Annex +import qualified Git +import qualified Git.Config +import Config + +import qualified Data.UUID as U +import qualified Data.UUID.V5 as U5 +import System.Random +import Data.Bits.Utils + +configkey :: ConfigKey +configkey = annexConfig "uuid" + +{- Generates a random UUID, that does not include the MAC address. -} +genUUID :: IO UUID +genUUID = UUID . show <$> (randomIO :: IO U.UUID) + +{- Generates a UUID from a given string, using a namespace. + - Given the same namespace, the same string will always result + - in the same UUID. -} +genUUIDInNameSpace :: U.UUID -> String -> UUID +genUUIDInNameSpace namespace = UUID . show . U5.generateNamed namespace . s2w8 + +{- Namespace used for UUIDs derived from git-remote-gcrypt ids. -} +gCryptNameSpace :: U.UUID +gCryptNameSpace = U5.generateNamed U5.namespaceURL $ + s2w8 "http://git-annex.branchable.com/design/gcrypt/" + +{- Get current repository's UUID. -} +getUUID :: Annex UUID +getUUID = getRepoUUID =<< gitRepo + +{- Looks up a repo's UUID, caching it in .git/config if it's not already. -} +getRepoUUID :: Git.Repo -> Annex UUID +getRepoUUID r = do + c <- toUUID <$> getConfig cachekey "" + let u = getUncachedUUID r + + if c /= u && u /= NoUUID + then do + updatecache u + return u + else return c + where + updatecache u = do + g <- gitRepo + when (g /= r) $ storeUUID cachekey u + cachekey = remoteConfig r "uuid" + +removeRepoUUID :: Annex () +removeRepoUUID = unsetConfig configkey + +getUncachedUUID :: Git.Repo -> UUID +getUncachedUUID = toUUID . Git.Config.get key "" + where + (ConfigKey key) = configkey + +{- Make sure that the repo has an annex.uuid setting. -} +prepUUID :: Annex () +prepUUID = whenM ((==) NoUUID <$> getUUID) $ + storeUUID configkey =<< liftIO genUUID + +storeUUID :: ConfigKey -> UUID -> Annex () +storeUUID configfield = setConfig configfield . fromUUID + +{- Only sets the configkey in the Repo; does not change .git/config -} +setUUID :: Git.Repo -> UUID -> IO Git.Repo +setUUID r u = do + let s = show configkey ++ "=" ++ fromUUID u + Git.Config.store s r diff --git a/Annex/Url.hs b/Annex/Url.hs new file mode 100644 index 0000000000..397a7910be --- /dev/null +++ b/Annex/Url.hs @@ -0,0 +1,42 @@ +{- Url downloading, with git-annex user agent and configured http + - headers and wget/curl options. + - + - Copyright 2013-2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Annex.Url ( + module U, + withUrlOptions, + getUrlOptions, + getUserAgent, +) where + +import Common.Annex +import qualified Annex +import Utility.Url as U +import qualified Build.SysConfig as SysConfig + +defaultUserAgent :: U.UserAgent +defaultUserAgent = "git-annex/" ++ SysConfig.packageversion + +getUserAgent :: Annex (Maybe U.UserAgent) +getUserAgent = Annex.getState $ + Just . fromMaybe defaultUserAgent . Annex.useragent + +getUrlOptions :: Annex U.UrlOptions +getUrlOptions = U.UrlOptions + <$> getUserAgent + <*> headers + <*> options + where + headers = do + v <- annexHttpHeadersCommand <$> Annex.getGitConfig + case v of + Just cmd -> lines <$> liftIO (readProcess "sh" ["-c", cmd]) + Nothing -> annexHttpHeaders <$> Annex.getGitConfig + options = map Param . annexWebOptions <$> Annex.getGitConfig + +withUrlOptions :: (U.UrlOptions -> IO a) -> Annex a +withUrlOptions a = liftIO . a =<< getUrlOptions diff --git a/Annex/VariantFile.hs b/Annex/VariantFile.hs new file mode 100644 index 0000000000..7c849c59f0 --- /dev/null +++ b/Annex/VariantFile.hs @@ -0,0 +1,45 @@ +{- git-annex .variant files for automatic merge conflict resolution + - + - Copyright 2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Annex.VariantFile where + +import Common.Annex +import Types.Key + +import Data.Hash.MD5 + +variantMarker :: String +variantMarker = ".variant-" + +mkVariant :: FilePath -> String -> FilePath +mkVariant file variant = takeDirectory file + dropExtension (takeFileName file) + ++ variantMarker ++ variant + ++ takeExtension file + +{- The filename to use when resolving a conflicted merge of a file, + - that points to a key. + - + - Something derived from the key needs to be included in the filename, + - but rather than exposing the whole key to the user, a very weak hash + - is used. There is a very real, although still unlikely, chance of + - conflicts using this hash. + - + - In the event that there is a conflict with the filename generated + - for some other key, that conflict will itself be handled by the + - conflicted merge resolution code. That case is detected, and the full + - key is used in the filename. + -} +variantFile :: FilePath -> Key -> FilePath +variantFile file key + | doubleconflict = mkVariant file (key2file key) + | otherwise = mkVariant file (shortHash $ key2file key) + where + doubleconflict = variantMarker `isInfixOf` file + +shortHash :: String -> String +shortHash = take 4 . md5s . md5FilePath diff --git a/Annex/Version.hs b/Annex/Version.hs new file mode 100644 index 0000000000..2a75a1c550 --- /dev/null +++ b/Annex/Version.hs @@ -0,0 +1,41 @@ +{- git-annex repository versioning + - + - Copyright 2010,2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Annex.Version where + +import Common.Annex +import Config +import qualified Annex + +type Version = String + +supportedVersion :: Version +supportedVersion = "5" + +upgradableVersions :: [Version] +#ifndef mingw32_HOST_OS +upgradableVersions = ["0", "1", "2", "4"] +#else +upgradableVersions = ["2", "3", "4"] +#endif + +autoUpgradeableVersions :: [Version] +autoUpgradeableVersions = ["3", "4"] + +versionField :: ConfigKey +versionField = annexConfig "version" + +getVersion :: Annex (Maybe Version) +getVersion = annexVersion <$> Annex.getGitConfig + +setVersion :: Version -> Annex () +setVersion = setConfig versionField + +removeVersion :: Annex () +removeVersion = unsetConfig versionField diff --git a/Annex/View.hs b/Annex/View.hs new file mode 100644 index 0000000000..7c187befd2 --- /dev/null +++ b/Annex/View.hs @@ -0,0 +1,448 @@ +{- metadata based branch views + - + - Copyright 2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Annex.View where + +import Common.Annex +import Annex.View.ViewedFile +import Types.View +import Types.MetaData +import Annex.MetaData +import qualified Git +import qualified Git.DiffTree as DiffTree +import qualified Git.Branch +import qualified Git.LsFiles +import qualified Git.Ref +import Git.UpdateIndex +import Git.Sha +import Git.HashObject +import Git.Types +import Git.FilePath +import qualified Backend +import Annex.Index +import Annex.Link +import Annex.CatFile +import Logs.MetaData +import Logs.View +import Utility.Glob +import Utility.FileMode +import Types.Command +import Config +import CmdLine.Action + +import qualified Data.Set as S +import qualified Data.Map as M +import "mtl" Control.Monad.Writer + +{- Each visible ViewFilter in a view results in another level of + - subdirectory nesting. When a file matches multiple ways, it will appear + - in multiple subdirectories. This means there is a bit of an exponential + - blowup with a single file appearing in a crazy number of places! + - + - Capping the view size to 5 is reasonable; why wants to dig + - through 5+ levels of subdirectories to find anything? + -} +viewTooLarge :: View -> Bool +viewTooLarge view = visibleViewSize view > 5 + +visibleViewSize :: View -> Int +visibleViewSize = length . filter viewVisible . viewComponents + +{- Parses field=value, field!=value, tag, and !tag + - + - Note that the field may not be a legal metadata field name, + - but it's let through anyway. + - This is useful when matching on directory names with spaces, + - which are not legal MetaFields. + -} +parseViewParam :: String -> (MetaField, ViewFilter) +parseViewParam s = case separate (== '=') s of + ('!':tag, []) | not (null tag) -> + ( tagMetaField + , mkExcludeValues tag + ) + (tag, []) -> + ( tagMetaField + , mkFilterValues tag + ) + (field, wanted) + | end field == "!" -> + ( mkMetaFieldUnchecked (beginning field) + , mkExcludeValues wanted + ) + | otherwise -> + ( mkMetaFieldUnchecked field + , mkFilterValues wanted + ) + where + mkFilterValues v + | any (`elem` v) "*?" = FilterGlob v + | otherwise = FilterValues $ S.singleton $ toMetaValue v + mkExcludeValues = ExcludeValues . S.singleton . toMetaValue + +data ViewChange = Unchanged | Narrowing | Widening + deriving (Ord, Eq, Show) + +{- Updates a view, adding new fields to filter on (Narrowing), + - or allowing new values in an existing field (Widening). -} +refineView :: View -> [(MetaField, ViewFilter)] -> (View, ViewChange) +refineView origview = checksize . calc Unchanged origview + where + calc c v [] = (v, c) + calc c v ((f, vf):rest) = + let (v', c') = refine v f vf + in calc (max c c') v' rest + + refine view field vf + | field `elem` map viewField (viewComponents view) = + let (components', viewchanges) = runWriter $ + mapM (\c -> updateViewComponent c field vf) (viewComponents view) + viewchange = if field `elem` map viewField (viewComponents origview) + then maximum viewchanges + else Narrowing + in (view { viewComponents = components' }, viewchange) + | otherwise = + let component = mkViewComponent field vf + view' = view { viewComponents = component : viewComponents view } + in (view', Narrowing) + + checksize r@(v, _) + | viewTooLarge v = error $ "View is too large (" ++ show (visibleViewSize v) ++ " levels of subdirectories)" + | otherwise = r + +updateViewComponent :: ViewComponent -> MetaField -> ViewFilter -> Writer [ViewChange] ViewComponent +updateViewComponent c field vf + | viewField c == field = do + let (newvf, viewchange) = combineViewFilter (viewFilter c) vf + tell [viewchange] + return $ mkViewComponent field newvf + | otherwise = return c + +{- Adds an additional filter to a view. This can only result in narrowing + - the view. Multivalued filters are added in non-visible form. -} +filterView :: View -> [(MetaField, ViewFilter)] -> View +filterView v vs = v { viewComponents = viewComponents f' ++ viewComponents v} + where + f = fst $ refineView (v {viewComponents = []}) vs + f' = f { viewComponents = map toinvisible (viewComponents f) } + toinvisible c = c { viewVisible = False } + +{- Combine old and new ViewFilters, yielding a result that matches + - either old+new, or only new. + - + - If we have FilterValues and change to a FilterGlob, + - it's always a widening change, because the glob could match other + - values. OTOH, going the other way, it's a Narrowing change if the old + - glob matches all the new FilterValues. + - + - With two globs, the old one is discarded, and the new one is used. + - We can tell if that's a narrowing change by checking if the old + - glob matches the new glob. For example, "*" matches "foo*", + - so that's narrowing. While "f?o" does not match "f??", so that's + - widening. + -} +combineViewFilter :: ViewFilter -> ViewFilter -> (ViewFilter, ViewChange) +combineViewFilter old@(FilterValues olds) (FilterValues news) + | combined == old = (combined, Unchanged) + | otherwise = (combined, Widening) + where + combined = FilterValues (S.union olds news) +combineViewFilter old@(ExcludeValues olds) (ExcludeValues news) + | combined == old = (combined, Unchanged) + | otherwise = (combined, Narrowing) + where + combined = ExcludeValues (S.union olds news) +combineViewFilter (FilterValues _) newglob@(FilterGlob _) = + (newglob, Widening) +combineViewFilter (FilterGlob oldglob) new@(FilterValues s) + | all (matchGlob (compileGlob oldglob CaseInsensative) . fromMetaValue) (S.toList s) = (new, Narrowing) + | otherwise = (new, Widening) +combineViewFilter (FilterGlob old) newglob@(FilterGlob new) + | old == new = (newglob, Unchanged) + | matchGlob (compileGlob old CaseInsensative) new = (newglob, Narrowing) + | otherwise = (newglob, Widening) +combineViewFilter (FilterGlob _) new@(ExcludeValues _) = (new, Narrowing) +combineViewFilter (ExcludeValues _) new@(FilterGlob _) = (new, Widening) +combineViewFilter (FilterValues _) new@(ExcludeValues _) = (new, Narrowing) +combineViewFilter (ExcludeValues _) new@(FilterValues _) = (new, Widening) + +{- Generates views for a file from a branch, based on its metadata + - and the filename used in the branch. + - + - Note that a file may appear multiple times in a view, when it + - has multiple matching values for a MetaField used in the View. + - + - Of course if its MetaData does not match the View, it won't appear at + - all. + - + - Note that for efficiency, it's useful to partially + - evaluate this function with the view parameter and reuse + - the result. The globs in the view will then be compiled and memoized. + -} +viewedFiles :: View -> MkViewedFile -> FilePath -> MetaData -> [ViewedFile] +viewedFiles view = + let matchers = map viewComponentMatcher (viewComponents view) + in \mkviewedfile file metadata -> + let matches = map (\m -> m metadata) matchers + in if any isNothing matches + then [] + else + let paths = pathProduct $ + map (map toViewPath) (visible matches) + in if null paths + then [mkviewedfile file] + else map ( mkviewedfile file) paths + where + visible = map (fromJust . snd) . + filter (viewVisible . fst) . + zip (viewComponents view) + +{- Checks if metadata matches a ViewComponent filter, and if so + - returns the value, or values that match. Self-memoizing on ViewComponent. -} +viewComponentMatcher :: ViewComponent -> (MetaData -> Maybe [MetaValue]) +viewComponentMatcher viewcomponent = \metadata -> + matcher (currentMetaDataValues metafield metadata) + where + metafield = viewField viewcomponent + matcher = case viewFilter viewcomponent of + FilterValues s -> \values -> setmatches $ + S.intersection s values + FilterGlob glob -> + let cglob = compileGlob glob CaseInsensative + in \values -> setmatches $ + S.filter (matchGlob cglob . fromMetaValue) values + ExcludeValues excludes -> \values -> + if S.null (S.intersection values excludes) + then Just [] + else Nothing + setmatches s + | S.null s = Nothing + | otherwise = Just (S.toList s) + +toViewPath :: MetaValue -> FilePath +toViewPath = concatMap escapeslash . fromMetaValue + where + escapeslash c + | c == '/' = [pseudoSlash] + | c == '\\' = [pseudoBackslash] + | c == pseudoSlash = [pseudoSlash, pseudoSlash] + | c == pseudoBackslash = [pseudoBackslash, pseudoBackslash] + | otherwise = [c] + +fromViewPath :: FilePath -> MetaValue +fromViewPath = toMetaValue . deescapeslash [] + where + deescapeslash s [] = reverse s + deescapeslash s (c:cs) + | c == pseudoSlash = case cs of + (c':cs') + | c' == pseudoSlash -> deescapeslash (pseudoSlash:s) cs' + _ -> deescapeslash ('/':s) cs + | c == pseudoBackslash = case cs of + (c':cs') + | c' == pseudoBackslash -> deescapeslash (pseudoBackslash:s) cs' + _ -> deescapeslash ('/':s) cs + | otherwise = deescapeslash (c:s) cs + +pseudoSlash :: Char +pseudoSlash = '\8725' -- '∕' /= '/' + +pseudoBackslash :: Char +pseudoBackslash = '\9586' -- '╲' /= '\' + +pathProduct :: [[FilePath]] -> [FilePath] +pathProduct [] = [] +pathProduct (l:ls) = foldl combinel l ls + where + combinel xs ys = [combine x y | x <- xs, y <- ys] + +{- Extracts the metadata from a ViewedFile, based on the view that was used + - to construct it. + - + - Derived metadata is excluded. + -} +fromView :: View -> ViewedFile -> MetaData +fromView view f = MetaData $ + M.fromList (zip fields values) `M.difference` derived + where + visible = filter viewVisible (viewComponents view) + fields = map viewField visible + paths = splitDirectories (dropFileName f) + values = map (S.singleton . fromViewPath) paths + MetaData derived = getViewedFileMetaData f + +{- Constructing a view that will match arbitrary metadata, and applying + - it to a file yields a set of ViewedFile which all contain the same + - MetaFields that were present in the input metadata + - (excluding fields that are not visible). -} +prop_view_roundtrips :: FilePath -> MetaData -> Bool -> Bool +prop_view_roundtrips f metadata visible = null f || viewTooLarge view || + all hasfields (viewedFiles view viewedFileFromReference f metadata) + where + view = View (Git.Ref "master") $ + map (\(mf, mv) -> ViewComponent mf (FilterValues $ S.filter (not . null . fromMetaValue) mv) visible) + (fromMetaData metadata) + visiblefields = sort (map viewField $ filter viewVisible (viewComponents view)) + hasfields fv = sort (map fst (fromMetaData (fromView view fv))) == visiblefields + +{- A directory foo/bar/baz/ is turned into metadata fields + - /=foo, foo/=bar, foo/bar/=baz. + - + - Note that this may generate MetaFields that legalField rejects. + - This is necessary to have a 1:1 mapping between directory names and + - fields. So this MetaData cannot safely be serialized. -} +getDirMetaData :: FilePath -> MetaData +getDirMetaData d = MetaData $ M.fromList $ zip fields values + where + dirs = splitDirectories d + fields = map (mkMetaFieldUnchecked . addTrailingPathSeparator . joinPath) + (inits dirs) + values = map (S.singleton . toMetaValue . fromMaybe "" . headMaybe) + (tails dirs) + +getWorkTreeMetaData :: FilePath -> MetaData +getWorkTreeMetaData = getDirMetaData . dropFileName + +getViewedFileMetaData :: FilePath -> MetaData +getViewedFileMetaData = getDirMetaData . dirFromViewedFile . takeFileName + +{- Applies a view to the currently checked out branch, generating a new + - branch for the view. + -} +applyView :: View -> Annex Git.Branch +applyView view = applyView' viewedFileFromReference getWorkTreeMetaData view + +{- Generates a new branch for a View, which must be a more narrow + - version of the View originally used to generate the currently + - checked out branch. That is, it must match a subset of the files + - in view, not any others. + -} +narrowView :: View -> Annex Git.Branch +narrowView = applyView' viewedFileReuse getViewedFileMetaData + +{- Go through each file in the currently checked out branch. + - If the file is not annexed, skip it, unless it's a dotfile in the top. + - Look up the metadata of annexed files, and generate any ViewedFiles, + - and stage them. + - + - Currently only works in indirect mode. Must be run from top of + - repository. + -} +applyView' :: MkViewedFile -> (FilePath -> MetaData) -> View -> Annex Git.Branch +applyView' mkviewedfile getfilemetadata view = do + top <- fromRepo Git.repoPath + (l, clean) <- inRepo $ Git.LsFiles.inRepo [top] + liftIO . nukeFile =<< fromRepo gitAnnexViewIndex + genViewBranch view $ do + uh <- inRepo Git.UpdateIndex.startUpdateIndex + hasher <- inRepo hashObjectStart + forM_ l $ \f -> + go uh hasher f =<< Backend.lookupFile f + liftIO $ do + hashObjectStop hasher + void $ stopUpdateIndex uh + void clean + where + genviewedfiles = viewedFiles view mkviewedfile -- enables memoization + go uh hasher f (Just (k, _)) = do + metadata <- getCurrentMetaData k + let metadata' = getfilemetadata f `unionMetaData` metadata + forM_ (genviewedfiles f metadata') $ \fv -> do + stagesymlink uh hasher fv =<< inRepo (gitAnnexLink fv k) + go uh hasher f Nothing + | "." `isPrefixOf` f = do + s <- liftIO $ getSymbolicLinkStatus f + if isSymbolicLink s + then stagesymlink uh hasher f =<< liftIO (readSymbolicLink f) + else do + sha <- liftIO $ Git.HashObject.hashFile hasher f + let blobtype = if isExecutable (fileMode s) + then ExecutableBlob + else FileBlob + liftIO . Git.UpdateIndex.streamUpdateIndex' uh + =<< inRepo (Git.UpdateIndex.stageFile sha blobtype f) + | otherwise = noop + stagesymlink uh hasher f linktarget = do + sha <- hashSymlink' hasher linktarget + liftIO . Git.UpdateIndex.streamUpdateIndex' uh + =<< inRepo (Git.UpdateIndex.stageSymlink f sha) + +{- Applies a view to the reference branch, generating a new branch + - for the View. + - + - This needs to work incrementally, to quickly update the view branch + - when the reference branch is changed. So, it works based on an + - old version of the reference branch, uses diffTree to find the + - changes, and applies those changes to the view branch. + -} +updateView :: View -> Git.Ref -> Git.Ref -> Annex Git.Branch +updateView view ref oldref = genViewBranch view $ do + (diffs, cleanup) <- inRepo $ DiffTree.diffTree oldref ref + forM_ diffs go + void $ liftIO cleanup + where + go diff + | DiffTree.dstsha diff == nullSha = error "TODO delete file" + | otherwise = error "TODO add file" + +{- Diff between currently checked out branch and staged changes, and + - update metadata to reflect the changes that are being committed to the + - view. + - + - Adding a file to a directory adds the metadata represented by + - that directory to the file, and removing a file from a directory + - removes the metadata. + - + - Note that removes must be handled before adds. This is so + - that moving a file from x/foo/ to x/bar/ adds back the metadata for x. + -} +withViewChanges :: (ViewedFile -> Key -> CommandStart) -> (ViewedFile -> Key -> CommandStart) -> Annex () +withViewChanges addmeta removemeta = do + makeabs <- flip fromTopFilePath <$> gitRepo + (diffs, cleanup) <- inRepo $ DiffTree.diffIndex Git.Ref.headRef + forM_ diffs handleremovals + forM_ diffs (handleadds makeabs) + void $ liftIO cleanup + where + handleremovals item + | DiffTree.srcsha item /= nullSha = + handle item removemeta + =<< catKey (DiffTree.srcsha item) (DiffTree.srcmode item) + | otherwise = noop + handleadds makeabs item + | DiffTree.dstsha item /= nullSha = + handle item addmeta + =<< ifM isDirect + ( catKey (DiffTree.dstsha item) (DiffTree.dstmode item) + -- optimisation + , isAnnexLink $ makeabs $ DiffTree.file item + ) + | otherwise = noop + handle item a = maybe noop + (void . commandAction . a (getTopFilePath $ DiffTree.file item)) + +{- Generates a branch for a view. This is done using a different index + - file. An action is run to stage the files that will be in the branch. + - Then a commit is made, to the view branch. The view branch is not + - checked out, but entering it will display the view. -} +genViewBranch :: View -> Annex () -> Annex Git.Branch +genViewBranch view a = withIndex $ do + a + let branch = branchView view + void $ inRepo $ Git.Branch.commit True (fromRef branch) branch [] + return branch + +{- Runs an action using the view index file. + - Note that the file does not necessarily exist, or can contain + - info staged for an old view. -} +withIndex :: Annex a -> Annex a +withIndex a = do + f <- fromRepo gitAnnexViewIndex + withIndexFile f a + +withCurrentView :: (View -> Annex a) -> Annex a +withCurrentView a = maybe (error "Not in a view.") a =<< currentView diff --git a/Annex/View/ViewedFile.hs b/Annex/View/ViewedFile.hs new file mode 100644 index 0000000000..25ac16a346 --- /dev/null +++ b/Annex/View/ViewedFile.hs @@ -0,0 +1,75 @@ +{- filenames (not paths) used in views + - + - Copyright 2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Annex.View.ViewedFile ( + ViewedFile, + MkViewedFile, + viewedFileFromReference, + viewedFileReuse, + dirFromViewedFile, + prop_viewedFile_roundtrips, +) where + +import Common.Annex + +type FileName = String +type ViewedFile = FileName + +type MkViewedFile = FilePath -> ViewedFile + +{- Converts a filepath used in a reference branch to the + - filename that will be used in the view. + - + - No two filepaths from the same branch should yeild the same result, + - so all directory structure needs to be included in the output filename + - in some way. + - + - So, from dir/subdir/file.foo, generate file_%dir%subdir%.foo + -} +viewedFileFromReference :: MkViewedFile +viewedFileFromReference f = concat + [ escape base + , if null dirs then "" else "_%" ++ intercalate "%" (map escape dirs) ++ "%" + , escape $ concat extensions + ] + where + (path, basefile) = splitFileName f + dirs = filter (/= ".") $ map dropTrailingPathSeparator (splitPath path) + (base, extensions) = splitShortExtensions basefile + + {- To avoid collisions with filenames or directories that contain + - '%', and to allow the original directories to be extracted + - from the ViewedFile, '%' is escaped to '\%' (and '\' to '\\'). + -} + escape :: String -> String + escape = replace "%" "\\%" . replace "\\" "\\\\" + +{- For use when operating already within a view, so whatever filepath + - is present in the work tree is already a ViewedFile. -} +viewedFileReuse :: MkViewedFile +viewedFileReuse = takeFileName + +{- Extracts from a ViewedFile the directory where the file is located on + - in the reference branch. -} +dirFromViewedFile :: ViewedFile -> FilePath +dirFromViewedFile = joinPath . drop 1 . sep [] "" + where + sep l _ [] = reverse l + sep l curr (c:cs) + | c == '%' = sep (reverse curr:l) "" cs + | c == '\\' = case cs of + (c':cs') -> sep l (c':curr) cs' + [] -> sep l curr cs + | otherwise = sep l (c:curr) cs + +prop_viewedFile_roundtrips :: FilePath -> Bool +prop_viewedFile_roundtrips f + -- Relative filenames wanted, not directories. + | any (isPathSeparator) (end f ++ beginning f) = True + | otherwise = dir == dirFromViewedFile (viewedFileFromReference f) + where + dir = joinPath $ beginning $ splitDirectories f diff --git a/Annex/Wanted.hs b/Annex/Wanted.hs new file mode 100644 index 0000000000..42f813bbbc --- /dev/null +++ b/Annex/Wanted.hs @@ -0,0 +1,29 @@ +{- git-annex checking whether content is wanted + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Annex.Wanted where + +import Common.Annex +import Logs.PreferredContent +import Annex.UUID + +import qualified Data.Set as S + +{- Check if a file is preferred content for the local repository. -} +wantGet :: Bool -> Maybe Key -> AssociatedFile -> Annex Bool +wantGet def key file = isPreferredContent Nothing S.empty key file def + +{- Check if a file is preferred content for a remote. -} +wantSend :: Bool -> Maybe Key -> AssociatedFile -> UUID -> Annex Bool +wantSend def key file to = isPreferredContent (Just to) S.empty key file def + +{- Check if a file can be dropped, maybe from a remote. + - Don't drop files that are preferred content. -} +wantDrop :: Bool -> Maybe UUID -> Maybe Key -> AssociatedFile -> Annex Bool +wantDrop def from key file = do + u <- maybe getUUID (return . id) from + not <$> isPreferredContent (Just u) (S.singleton u) key file def diff --git a/Assistant.hs b/Assistant.hs new file mode 100644 index 0000000000..67398f23b8 --- /dev/null +++ b/Assistant.hs @@ -0,0 +1,178 @@ +{- git-annex assistant daemon + - + - Copyright 2012-2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Assistant where + +import qualified Annex +import Assistant.Common +import Assistant.DaemonStatus +import Assistant.NamedThread +import Assistant.Types.ThreadedMonad +import Assistant.Threads.DaemonStatus +import Assistant.Threads.Watcher +import Assistant.Threads.Committer +import Assistant.Threads.Pusher +import Assistant.Threads.Merger +import Assistant.Threads.TransferWatcher +import Assistant.Threads.Transferrer +import Assistant.Threads.SanityChecker +import Assistant.Threads.Cronner +import Assistant.Threads.ProblemFixer +#ifdef WITH_CLIBS +import Assistant.Threads.MountWatcher +#endif +import Assistant.Threads.NetWatcher +import Assistant.Threads.Upgrader +import Assistant.Threads.UpgradeWatcher +import Assistant.Threads.TransferScanner +import Assistant.Threads.TransferPoller +import Assistant.Threads.ConfigMonitor +import Assistant.Threads.Glacier +#ifdef WITH_WEBAPP +import Assistant.WebApp +import Assistant.Threads.WebApp +#ifdef WITH_PAIRING +import Assistant.Threads.PairListener +#endif +#ifdef WITH_XMPP +import Assistant.Threads.XMPPClient +import Assistant.Threads.XMPPPusher +#endif +#else +import Assistant.Types.UrlRenderer +#endif +import qualified Utility.Daemon +import Utility.ThreadScheduler +import Utility.HumanTime +import qualified Build.SysConfig as SysConfig +#ifndef mingw32_HOST_OS +import Utility.LogFile +import Annex.Perms +#endif + +import System.Log.Logger +import Network.Socket (HostName) + +stopDaemon :: Annex () +stopDaemon = liftIO . Utility.Daemon.stopDaemon =<< fromRepo gitAnnexPidFile + +{- Starts the daemon. If the daemon is run in the foreground, once it's + - running, can start the browser. + - + - startbrowser is passed the url and html shim file, as well as the original + - stdout and stderr descriptors. -} +startDaemon :: Bool -> Bool -> Maybe Duration -> Maybe String -> Maybe HostName -> Maybe (Maybe Handle -> Maybe Handle -> String -> FilePath -> IO ()) -> Annex () +startDaemon assistant foreground startdelay cannotrun listenhost startbrowser = do + Annex.changeState $ \s -> s { Annex.daemon = True } + pidfile <- fromRepo gitAnnexPidFile +#ifndef mingw32_HOST_OS + logfile <- fromRepo gitAnnexLogFile + createAnnexDirectory (parentDir logfile) + logfd <- liftIO $ openLog logfile + if foreground + then do + origout <- liftIO $ catchMaybeIO $ + fdToHandle =<< dup stdOutput + origerr <- liftIO $ catchMaybeIO $ + fdToHandle =<< dup stdError + let undaemonize a = do + debugM desc $ "logging to " ++ logfile + Utility.Daemon.lockPidFile pidfile + Utility.LogFile.redirLog logfd + a + start undaemonize $ + case startbrowser of + Nothing -> Nothing + Just a -> Just $ a origout origerr + else + start (Utility.Daemon.daemonize logfd (Just pidfile) False) Nothing +#else + -- Windows is always foreground, and has no log file. + when (foreground || not foreground) $ do + liftIO $ Utility.Daemon.lockPidFile pidfile + start id $ do + case startbrowser of + Nothing -> Nothing + Just a -> Just $ a Nothing Nothing +#endif + where + desc + | assistant = "assistant" + | otherwise = "watch" + start daemonize webappwaiter = withThreadState $ \st -> do + checkCanWatch + dstatus <- startDaemonStatus + logfile <- fromRepo gitAnnexLogFile + liftIO $ debugM desc $ "logging to " ++ logfile + liftIO $ daemonize $ + flip runAssistant (go webappwaiter) + =<< newAssistantData st dstatus + +#ifdef WITH_WEBAPP + go webappwaiter = do + d <- getAssistant id +#else + go _webappwaiter = do +#endif + notice ["starting", desc, "version", SysConfig.packageversion] + urlrenderer <- liftIO newUrlRenderer +#ifdef WITH_WEBAPP + let webappthread = [ assist $ webAppThread d urlrenderer False cannotrun Nothing listenhost webappwaiter ] +#else + let webappthread = [] +#endif + let threads = if isJust cannotrun + then webappthread + else webappthread ++ + [ watch $ commitThread +#ifdef WITH_WEBAPP +#ifdef WITH_PAIRING + , assist $ pairListenerThread urlrenderer +#endif +#ifdef WITH_XMPP + , assist $ xmppClientThread urlrenderer + , assist $ xmppSendPackThread urlrenderer + , assist $ xmppReceivePackThread urlrenderer +#endif +#endif + , assist $ pushThread + , assist $ pushRetryThread + , assist $ mergeThread + , assist $ transferWatcherThread + , assist $ transferPollerThread + , assist $ transfererThread + , assist $ daemonStatusThread + , assist $ sanityCheckerDailyThread urlrenderer + , assist $ sanityCheckerHourlyThread + , assist $ problemFixerThread urlrenderer +#ifdef WITH_CLIBS + , assist $ mountWatcherThread urlrenderer +#endif + , assist $ netWatcherThread + , assist $ upgraderThread urlrenderer + , assist $ upgradeWatcherThread urlrenderer + , assist $ netWatcherFallbackThread + , assist $ transferScannerThread urlrenderer + , assist $ cronnerThread urlrenderer + , assist $ configMonitorThread + , assist $ glacierThread + , watch $ watchThread + -- must come last so that all threads that wait + -- on it have already started waiting + , watch $ sanityCheckerStartupThread startdelay + ] + + mapM_ (startthread urlrenderer) threads + liftIO waitForTermination + + watch a = (True, a) + assist a = (False, a) + startthread urlrenderer (watcher, t) + | watcher || assistant = startNamedThread urlrenderer t + | otherwise = noop diff --git a/Assistant/Alert.hs b/Assistant/Alert.hs new file mode 100644 index 0000000000..192952f56b --- /dev/null +++ b/Assistant/Alert.hs @@ -0,0 +1,452 @@ +{- git-annex assistant alerts + - + - Copyright 2012-2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE OverloadedStrings, CPP, BangPatterns #-} + +module Assistant.Alert where + +import Common.Annex +import Assistant.Types.Alert +import Assistant.Alert.Utility +import qualified Remote +import Utility.Tense +import Logs.Transfer +import Types.Distribution + +import Data.String +import qualified Data.Text as T +import qualified Control.Exception as E + +#ifdef WITH_WEBAPP +import Assistant.DaemonStatus +import Assistant.WebApp.Types +import Assistant.WebApp (renderUrl) +import Yesod +#endif +import Assistant.Monad +import Assistant.Types.UrlRenderer + +{- Makes a button for an alert that opens a Route. + - + - If autoclose is set, the button will close the alert it's + - attached to when clicked. -} +#ifdef WITH_WEBAPP +mkAlertButton :: Bool -> T.Text -> UrlRenderer -> Route WebApp -> Assistant AlertButton +mkAlertButton autoclose label urlrenderer route = do + close <- asIO1 removeAlert + url <- liftIO $ renderUrl urlrenderer route [] + return $ AlertButton + { buttonLabel = label + , buttonUrl = url + , buttonAction = if autoclose then Just close else Nothing + , buttonPrimary = True + } +#endif + +renderData :: Alert -> TenseText +renderData = tenseWords . alertData + +baseActivityAlert :: Alert +baseActivityAlert = Alert + { alertClass = Activity + , alertHeader = Nothing + , alertMessageRender = renderData + , alertData = [] + , alertCounter = 0 + , alertBlockDisplay = False + , alertClosable = False + , alertPriority = Medium + , alertIcon = Just ActivityIcon + , alertCombiner = Nothing + , alertName = Nothing + , alertButtons = [] + } + +warningAlert :: String -> String -> Alert +warningAlert name msg = Alert + { alertClass = Warning + , alertHeader = Just $ tenseWords ["warning"] + , alertMessageRender = renderData + , alertData = [UnTensed $ T.pack msg] + , alertCounter = 0 + , alertBlockDisplay = True + , alertClosable = True + , alertPriority = High + , alertIcon = Just ErrorIcon + , alertCombiner = Just $ dataCombiner $ \_old new -> new + , alertName = Just $ WarningAlert name + , alertButtons = [] + } + +errorAlert :: String -> [AlertButton] -> Alert +errorAlert msg buttons = Alert + { alertClass = Error + , alertHeader = Nothing + , alertMessageRender = renderData + , alertData = [UnTensed $ T.pack msg] + , alertCounter = 0 + , alertBlockDisplay = True + , alertClosable = True + , alertPriority = Pinned + , alertIcon = Just ErrorIcon + , alertCombiner = Nothing + , alertName = Nothing + , alertButtons = buttons + } + +activityAlert :: Maybe TenseText -> [TenseChunk] -> Alert +activityAlert header dat = baseActivityAlert + { alertHeader = header + , alertData = dat + } + +startupScanAlert :: Alert +startupScanAlert = activityAlert Nothing + [Tensed "Performing" "Performed", "startup scan"] + +{- Displayed when a shutdown is occurring, so will be seen after shutdown + - has happened. -} +shutdownAlert :: Alert +shutdownAlert = warningAlert "shutdown" "git-annex has been shut down" + +commitAlert :: Alert +commitAlert = activityAlert Nothing + [Tensed "Committing" "Committed", "changes to git"] + +showRemotes :: [Remote] -> TenseChunk +showRemotes = UnTensed . T.intercalate ", " . map (T.pack . Remote.name) + +syncAlert :: [Remote] -> Alert +syncAlert rs = baseActivityAlert + { alertName = Just SyncAlert + , alertHeader = Just $ tenseWords + [Tensed "Syncing" "Synced", "with", showRemotes rs] + , alertPriority = Low + , alertIcon = Just SyncIcon + } + +syncResultAlert :: [Remote] -> [Remote] -> Alert +syncResultAlert succeeded failed = makeAlertFiller (not $ null succeeded) $ + baseActivityAlert + { alertName = Just SyncAlert + , alertHeader = Just $ tenseWords msg + } + where + msg + | null succeeded = ["Failed to sync with", showRemotes failed] + | null failed = ["Synced with", showRemotes succeeded] + | otherwise = + [ "Synced with", showRemotes succeeded + , "but not with", showRemotes failed + ] + +sanityCheckAlert :: Alert +sanityCheckAlert = activityAlert + (Just $ tenseWords [Tensed "Running" "Ran", "daily sanity check"]) + ["to make sure everything is ok."] + +sanityCheckFixAlert :: String -> Alert +sanityCheckFixAlert msg = Alert + { alertClass = Warning + , alertHeader = Just $ tenseWords ["Fixed a problem"] + , alertMessageRender = render + , alertData = [UnTensed $ T.pack msg] + , alertCounter = 0 + , alertBlockDisplay = True + , alertPriority = High + , alertClosable = True + , alertIcon = Just ErrorIcon + , alertName = Just SanityCheckFixAlert + , alertCombiner = Just $ dataCombiner (++) + , alertButtons = [] + } + where + render alert = tenseWords $ alerthead : alertData alert ++ [alertfoot] + alerthead = "The daily sanity check found and fixed a problem:" + alertfoot = "If these problems persist, consider filing a bug report." + +fsckingAlert :: AlertButton -> Maybe Remote -> Alert +fsckingAlert button mr = baseActivityAlert + { alertData = case mr of + Nothing -> [ UnTensed $ T.pack $ "Consistency check in progress" ] + Just r -> [ UnTensed $ T.pack $ "Consistency check of " ++ Remote.name r ++ " in progress"] + , alertButtons = [button] + } + +showFscking :: UrlRenderer -> Maybe Remote -> IO (Either E.SomeException a) -> Assistant a +showFscking urlrenderer mr a = do +#ifdef WITH_WEBAPP + button <- mkAlertButton False (T.pack "Configure") urlrenderer ConfigFsckR + r <- alertDuring (fsckingAlert button mr) $ + liftIO a +#else + r <- liftIO a +#endif + either (liftIO . E.throwIO) return r + +notFsckedNudge :: UrlRenderer -> Maybe Remote -> Assistant () +#ifdef WITH_WEBAPP +notFsckedNudge urlrenderer mr = do + button <- mkAlertButton True (T.pack "Configure") urlrenderer ConfigFsckR + void $ addAlert (notFsckedAlert mr button) +#else +notFsckedNudge _ _ = noop +#endif + +notFsckedAlert :: Maybe Remote -> AlertButton -> Alert +notFsckedAlert mr button = Alert + { alertHeader = Just $ fromString $ concat + [ "You should enable consistency checking to protect your data" + , maybe "" (\r -> " in " ++ Remote.name r) mr + , "." + ] + , alertIcon = Just InfoIcon + , alertPriority = High + , alertButtons = [button] + , alertClosable = True + , alertClass = Message + , alertMessageRender = renderData + , alertCounter = 0 + , alertBlockDisplay = True + , alertName = Just NotFsckedAlert + , alertCombiner = Just $ dataCombiner $ \_old new -> new + , alertData = [] + } + +baseUpgradeAlert :: [AlertButton] -> TenseText -> Alert +baseUpgradeAlert buttons message = Alert + { alertHeader = Just message + , alertIcon = Just UpgradeIcon + , alertPriority = High + , alertButtons = buttons + , alertClosable = True + , alertClass = Message + , alertMessageRender = renderData + , alertCounter = 0 + , alertBlockDisplay = True + , alertName = Just UpgradeAlert + , alertCombiner = Just $ fullCombiner $ \new _old -> new + , alertData = [] + } + +canUpgradeAlert :: AlertPriority -> GitAnnexVersion -> AlertButton -> Alert +canUpgradeAlert priority version button = + (baseUpgradeAlert [button] $ fromString msg) + { alertPriority = priority + , alertData = [fromString $ " (version " ++ version ++ ")"] + } + where + msg = if priority >= High + then "An important upgrade of git-annex is available!" + else "An upgrade of git-annex is available." + +upgradeReadyAlert :: AlertButton -> Alert +upgradeReadyAlert button = baseUpgradeAlert [button] $ + fromString "A new version of git-annex has been installed." + +upgradingAlert :: Alert +upgradingAlert = activityAlert Nothing [ fromString "Upgrading git-annex" ] + +upgradeFinishedAlert :: Maybe AlertButton -> GitAnnexVersion -> Alert +upgradeFinishedAlert button version = + baseUpgradeAlert (maybeToList button) $ fromString $ + "Finished upgrading git-annex to version " ++ version + +upgradeFailedAlert :: String -> Alert +upgradeFailedAlert msg = (errorAlert msg []) + { alertHeader = Just $ fromString "Upgrade failed." } + +unusedFilesAlert :: [AlertButton] -> String -> Alert +unusedFilesAlert buttons message = Alert + { alertHeader = Just $ fromString $ unwords + [ "Old and deleted files are piling up --" + , message + ] + , alertIcon = Just InfoIcon + , alertPriority = High + , alertButtons = buttons + , alertClosable = True + , alertClass = Message + , alertMessageRender = renderData + , alertCounter = 0 + , alertBlockDisplay = True + , alertName = Just UnusedFilesAlert + , alertCombiner = Just $ fullCombiner $ \new _old -> new + , alertData = [] + } + +brokenRepositoryAlert :: [AlertButton] -> Alert +brokenRepositoryAlert = errorAlert "Serious problems have been detected with your repository. This needs your immediate attention!" + +repairingAlert :: String -> Alert +repairingAlert repodesc = activityAlert Nothing + [ Tensed "Attempting to repair" "Repaired" + , UnTensed $ T.pack repodesc + ] + +pairingAlert :: AlertButton -> Alert +pairingAlert button = baseActivityAlert + { alertData = [ UnTensed "Pairing in progress" ] + , alertPriority = High + , alertButtons = [button] + } + +pairRequestReceivedAlert :: String -> AlertButton -> Alert +pairRequestReceivedAlert who button = Alert + { alertClass = Message + , alertHeader = Nothing + , alertMessageRender = renderData + , alertData = [UnTensed $ T.pack $ who ++ " is sending a pair request."] + , alertCounter = 0 + , alertBlockDisplay = False + , alertPriority = High + , alertClosable = True + , alertIcon = Just InfoIcon + , alertName = Just $ PairAlert who + , alertCombiner = Just $ dataCombiner $ \_old new -> new + , alertButtons = [button] + } + +pairRequestAcknowledgedAlert :: String -> Maybe AlertButton -> Alert +pairRequestAcknowledgedAlert who button = baseActivityAlert + { alertData = ["Pairing with", UnTensed (T.pack who), Tensed "in progress" "complete"] + , alertPriority = High + , alertName = Just $ PairAlert who + , alertCombiner = Just $ dataCombiner $ \_old new -> new + , alertButtons = maybeToList button + } + +xmppNeededAlert :: AlertButton -> Alert +xmppNeededAlert button = Alert + { alertHeader = Just "Share with friends, and keep your devices in sync across the cloud." + , alertIcon = Just TheCloud + , alertPriority = High + , alertButtons = [button] + , alertClosable = True + , alertClass = Message + , alertMessageRender = renderData + , alertCounter = 0 + , alertBlockDisplay = True + , alertName = Just $ XMPPNeededAlert + , alertCombiner = Just $ dataCombiner $ \_old new -> new + , alertData = [] + } + +cloudRepoNeededAlert :: Maybe String -> AlertButton -> Alert +cloudRepoNeededAlert friendname button = Alert + { alertHeader = Just $ fromString $ unwords + [ "Unable to download files from" + , (fromMaybe "your other devices" friendname) ++ "." + ] + , alertIcon = Just ErrorIcon + , alertPriority = High + , alertButtons = [button] + , alertClosable = True + , alertClass = Message + , alertMessageRender = renderData + , alertCounter = 0 + , alertBlockDisplay = True + , alertName = Just $ CloudRepoNeededAlert + , alertCombiner = Just $ dataCombiner $ \_old new -> new + , alertData = [] + } + +remoteRemovalAlert :: String -> AlertButton -> Alert +remoteRemovalAlert desc button = Alert + { alertHeader = Just $ fromString $ + "The repository \"" ++ desc ++ + "\" has been emptied, and can now be removed." + , alertIcon = Just InfoIcon + , alertPriority = High + , alertButtons = [button] + , alertClosable = True + , alertClass = Message + , alertMessageRender = renderData + , alertCounter = 0 + , alertBlockDisplay = True + , alertName = Just $ RemoteRemovalAlert desc + , alertCombiner = Just $ dataCombiner $ \_old new -> new + , alertData = [] + } + +{- Show a message that relates to a list of files. + - + - The most recent several files are shown, and a count of any others. -} +fileAlert :: TenseChunk -> [FilePath] -> Alert +fileAlert msg files = (activityAlert Nothing shortfiles) + { alertName = Just $ FileAlert msg + , alertMessageRender = renderer + , alertCounter = counter + , alertCombiner = Just $ fullCombiner combiner + } + where + maxfilesshown = 10 + + (!somefiles, !counter) = splitcounter (dedupadjacent files) + !shortfiles = map (fromString . shortFile . takeFileName) somefiles + + renderer alert = tenseWords $ msg : alertData alert ++ showcounter + where + showcounter = case alertCounter alert of + 0 -> [] + _ -> [fromString $ "and " ++ show (alertCounter alert) ++ " other files"] + + dedupadjacent (x:y:rest) + | x == y = dedupadjacent (y:rest) + | otherwise = x : dedupadjacent (y:rest) + dedupadjacent (x:[]) = [x] + dedupadjacent [] = [] + + {- Note that this ensures the counter is never 1; no need to say + - "1 file" when the filename could be shown. -} + splitcounter l + | length l <= maxfilesshown = (l, 0) + | otherwise = + let (keep, rest) = splitAt (maxfilesshown - 1) l + in (keep, length rest) + + combiner new old = + let (!fs, n) = splitcounter $ + dedupadjacent $ alertData new ++ alertData old + !cnt = n + alertCounter new + alertCounter old + in old + { alertData = fs + , alertCounter = cnt + } + +addFileAlert :: [FilePath] -> Alert +addFileAlert = fileAlert (Tensed "Adding" "Added") + +{- This is only used as a success alert after a transfer, not during it. -} +transferFileAlert :: Direction -> Bool -> FilePath -> Alert +transferFileAlert direction True file + | direction == Upload = fileAlert "Uploaded" [file] + | otherwise = fileAlert "Downloaded" [file] +transferFileAlert direction False file + | direction == Upload = fileAlert "Upload failed" [file] + | otherwise = fileAlert "Download failed" [file] + +dataCombiner :: ([TenseChunk] -> [TenseChunk] -> [TenseChunk]) -> AlertCombiner +dataCombiner combiner = fullCombiner $ + \new old -> old { alertData = alertData new `combiner` alertData old } + +fullCombiner :: (Alert -> Alert -> Alert) -> AlertCombiner +fullCombiner combiner new old + | alertClass new /= alertClass old = Nothing + | alertName new == alertName old = + Just $! new `combiner` old + | otherwise = Nothing + +shortFile :: FilePath -> String +shortFile f + | len < maxlen = f + | otherwise = take half f ++ ".." ++ drop (len - half) f + where + len = length f + maxlen = 20 + half = (maxlen - 2) `div` 2 + diff --git a/Assistant/Alert/Utility.hs b/Assistant/Alert/Utility.hs new file mode 100644 index 0000000000..be631e9991 --- /dev/null +++ b/Assistant/Alert/Utility.hs @@ -0,0 +1,130 @@ +{- git-annex assistant alert utilities + - + - Copyright 2012, 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Assistant.Alert.Utility where + +import Common.Annex +import Assistant.Types.Alert +import Utility.Tense + +import qualified Data.Text as T +import Data.Text (Text) +import qualified Data.Map as M + +{- This is as many alerts as it makes sense to display at a time. + - A display might be smaller, or larger, the point is to not overwhelm the + - user with a ton of alerts. -} +displayAlerts :: Int +displayAlerts = 6 + +{- This is not a hard maximum, but there's no point in keeping a great + - many filler alerts in an AlertMap, so when there's more than this many, + - they start being pruned, down toward displayAlerts. -} +maxAlerts :: Int +maxAlerts = displayAlerts * 2 + +type AlertPair = (AlertId, Alert) + +{- The desired order is the reverse of: + - + - - Pinned alerts + - - High priority alerts, newest first + - - Medium priority Activity, newest first (mostly used for Activity) + - - Low priority alerts, newest first + - - Filler priorty alerts, newest first + - - Ties are broken by the AlertClass, with Errors etc coming first. + -} +compareAlertPairs :: AlertPair -> AlertPair -> Ordering +compareAlertPairs + (aid, Alert { alertClass = aclass, alertPriority = aprio }) + (bid, Alert { alertClass = bclass, alertPriority = bprio }) + = compare aprio bprio + `mappend` compare aid bid + `mappend` compare aclass bclass + +sortAlertPairs :: [AlertPair] -> [AlertPair] +sortAlertPairs = sortBy compareAlertPairs + +{- Renders an alert's header for display, if it has one. -} +renderAlertHeader :: Alert -> Maybe Text +renderAlertHeader alert = renderTense (alertTense alert) <$> alertHeader alert + +{- Renders an alert's message for display. -} +renderAlertMessage :: Alert -> Text +renderAlertMessage alert = renderTense (alertTense alert) $ + (alertMessageRender alert) alert + +showAlert :: Alert -> String +showAlert alert = T.unpack $ T.unwords $ catMaybes + [ renderAlertHeader alert + , Just $ renderAlertMessage alert + ] + +alertTense :: Alert -> Tense +alertTense alert + | alertClass alert == Activity = Present + | otherwise = Past + +{- Checks if two alerts display the same. -} +effectivelySameAlert :: Alert -> Alert -> Bool +effectivelySameAlert x y = all id + [ alertClass x == alertClass y + , alertHeader x == alertHeader y + , alertData x == alertData y + , alertBlockDisplay x == alertBlockDisplay y + , alertClosable x == alertClosable y + , alertPriority x == alertPriority y + ] + +makeAlertFiller :: Bool -> Alert -> Alert +makeAlertFiller success alert + | isFiller alert = alert + | otherwise = alert + { alertClass = if c == Activity then c' else c + , alertPriority = Filler + , alertClosable = True + , alertButtons = [] + , alertIcon = Just $ if success then SuccessIcon else ErrorIcon + } + where + c = alertClass alert + c' + | success = Success + | otherwise = Error + +isFiller :: Alert -> Bool +isFiller alert = alertPriority alert == Filler + +{- Updates the Alertmap, adding or updating an alert. + - + - Any old filler that looks the same as the alert is removed. + - + - Or, if the alert has an alertCombiner that combines it with + - an old alert, the old alert is replaced with the result, and the + - alert is removed. + - + - Old filler alerts are pruned once maxAlerts is reached. + -} +mergeAlert :: AlertId -> Alert -> AlertMap -> AlertMap +mergeAlert i al m = maybe updatePrune updateCombine (alertCombiner al) + where + pruneSame k al' = k == i || not (effectivelySameAlert al al') + pruneBloat m' + | bloat > 0 = M.fromList $ pruneold $ M.toList m' + | otherwise = m' + where + bloat = M.size m' - maxAlerts + pruneold l = + let (f, rest) = partition (\(_, a) -> isFiller a) l + in drop bloat f ++ rest + updatePrune = pruneBloat $ M.filterWithKey pruneSame $ + M.insertWith' const i al m + updateCombine combiner = + let combined = M.mapMaybe (combiner al) m + in if M.null combined + then updatePrune + else M.delete i $ M.union combined m diff --git a/Assistant/BranchChange.hs b/Assistant/BranchChange.hs new file mode 100644 index 0000000000..c9354544a5 --- /dev/null +++ b/Assistant/BranchChange.hs @@ -0,0 +1,19 @@ +{- git-annex assistant git-annex branch change tracking + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Assistant.BranchChange where + +import Assistant.Common +import Assistant.Types.BranchChange + +import Control.Concurrent.MSampleVar + +branchChanged :: Assistant () +branchChanged = flip writeSV () <<~ (fromBranchChangeHandle . branchChangeHandle) + +waitBranchChange :: Assistant () +waitBranchChange = readSV <<~ (fromBranchChangeHandle . branchChangeHandle) diff --git a/Assistant/Changes.hs b/Assistant/Changes.hs new file mode 100644 index 0000000000..2ecd2036ce --- /dev/null +++ b/Assistant/Changes.hs @@ -0,0 +1,47 @@ +{- git-annex assistant change tracking + - + - Copyright 2012-2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Assistant.Changes where + +import Assistant.Common +import Assistant.Types.Changes +import Utility.TList + +import Data.Time.Clock +import Control.Concurrent.STM + +{- Handlers call this when they made a change that needs to get committed. -} +madeChange :: FilePath -> ChangeInfo -> Assistant (Maybe Change) +madeChange f t = Just <$> (Change <$> liftIO getCurrentTime <*> pure f <*> pure t) + +noChange :: Assistant (Maybe Change) +noChange = return Nothing + +{- Indicates an add needs to be done, but has not started yet. -} +pendingAddChange :: FilePath -> Assistant (Maybe Change) +pendingAddChange f = Just <$> (PendingAddChange <$> liftIO getCurrentTime <*> pure f) + +{- Gets all unhandled changes. + - Blocks until at least one change is made. -} +getChanges :: Assistant [Change] +getChanges = (atomically . getTList) <<~ changePool + +{- Gets all unhandled changes, without blocking. -} +getAnyChanges :: Assistant [Change] +getAnyChanges = (atomically . takeTList) <<~ changePool + +{- Puts unhandled changes back into the pool. + - Note: Original order is not preserved. -} +refillChanges :: [Change] -> Assistant () +refillChanges cs = (atomically . flip appendTList cs) <<~ changePool + +{- Records a change to the pool. -} +recordChange :: Change -> Assistant () +recordChange c = (atomically . flip snocTList c) <<~ changePool + +recordChanges :: [Change] -> Assistant () +recordChanges = refillChanges diff --git a/Assistant/Commits.hs b/Assistant/Commits.hs new file mode 100644 index 0000000000..7d1d3780fe --- /dev/null +++ b/Assistant/Commits.hs @@ -0,0 +1,23 @@ +{- git-annex assistant commit tracking + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Assistant.Commits where + +import Assistant.Common +import Assistant.Types.Commits +import Utility.TList + +import Control.Concurrent.STM + +{- Gets all unhandled commits. + - Blocks until at least one commit is made. -} +getCommits :: Assistant [Commit] +getCommits = (atomically . getTList) <<~ commitChan + +{- Records a commit in the channel. -} +recordCommit :: Assistant () +recordCommit = (atomically . flip consTList Commit) <<~ commitChan diff --git a/Assistant/Common.hs b/Assistant/Common.hs new file mode 100644 index 0000000000..f9719422d9 --- /dev/null +++ b/Assistant/Common.hs @@ -0,0 +1,14 @@ +{- Common infrastructure for the git-annex assistant. + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Assistant.Common (module X) where + +import Common.Annex as X +import Assistant.Monad as X +import Assistant.Types.DaemonStatus as X +import Assistant.Types.NamedThread as X +import Assistant.Types.Alert as X diff --git a/Assistant/DaemonStatus.hs b/Assistant/DaemonStatus.hs new file mode 100644 index 0000000000..eb842b7847 --- /dev/null +++ b/Assistant/DaemonStatus.hs @@ -0,0 +1,261 @@ +{- git-annex assistant daemon status + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE BangPatterns #-} + +module Assistant.DaemonStatus where + +import Assistant.Common +import Assistant.Alert.Utility +import Utility.Tmp +import Assistant.Types.NetMessager +import Utility.NotificationBroadcaster +import Logs.Transfer +import Logs.Trust +import qualified Remote +import qualified Types.Remote as Remote +import qualified Git + +import Control.Concurrent.STM +import System.Posix.Types +import Data.Time.Clock.POSIX +import Data.Time +import System.Locale +import qualified Data.Map as M +import qualified Data.Text as T + +getDaemonStatus :: Assistant DaemonStatus +getDaemonStatus = (atomically . readTMVar) <<~ daemonStatusHandle + +modifyDaemonStatus_ :: (DaemonStatus -> DaemonStatus) -> Assistant () +modifyDaemonStatus_ a = modifyDaemonStatus $ \s -> (a s, ()) + +modifyDaemonStatus :: (DaemonStatus -> (DaemonStatus, b)) -> Assistant b +modifyDaemonStatus a = do + dstatus <- getAssistant daemonStatusHandle + liftIO $ do + (s, b) <- atomically $ do + r@(!s, _) <- a <$> takeTMVar dstatus + putTMVar dstatus s + return r + sendNotification $ changeNotifier s + return b + +{- Returns a function that updates the lists of syncable remotes + - and other associated information. -} +calcSyncRemotes :: Annex (DaemonStatus -> DaemonStatus) +calcSyncRemotes = do + rs <- filter (remoteAnnexSync . Remote.gitconfig) . + concat . Remote.byCost <$> Remote.remoteList + alive <- trustExclude DeadTrusted (map Remote.uuid rs) + let good r = Remote.uuid r `elem` alive + let syncable = filter good rs + let syncdata = filter (not . remoteAnnexIgnore . Remote.gitconfig) $ + filter (not . Remote.isXMPPRemote) syncable + + return $ \dstatus -> dstatus + { syncRemotes = syncable + , syncGitRemotes = filter Remote.gitSyncableRemote syncable + , syncDataRemotes = syncdata + , syncingToCloudRemote = any iscloud syncdata + } + where + iscloud r = not (Remote.readonly r) && Remote.availability r == Remote.GloballyAvailable + +{- Updates the syncRemotes list from the list of all remotes in Annex state. -} +updateSyncRemotes :: Assistant () +updateSyncRemotes = do + modifyDaemonStatus_ =<< liftAnnex calcSyncRemotes + status <- getDaemonStatus + liftIO $ sendNotification $ syncRemotesNotifier status + + when (syncingToCloudRemote status) $ + updateAlertMap $ + M.filter $ \alert -> + alertName alert /= Just CloudRepoNeededAlert + +updateScheduleLog :: Assistant () +updateScheduleLog = + liftIO . sendNotification =<< scheduleLogNotifier <$> getDaemonStatus + +{- Load any previous daemon status file, and store it in a MVar for this + - process to use as its DaemonStatus. Also gets current transfer status. -} +startDaemonStatus :: Annex DaemonStatusHandle +startDaemonStatus = do + file <- fromRepo gitAnnexDaemonStatusFile + status <- liftIO $ + flip catchDefaultIO (readDaemonStatusFile file) =<< newDaemonStatus + transfers <- M.fromList <$> getTransfers + addsync <- calcSyncRemotes + liftIO $ atomically $ newTMVar $ addsync $ status + { scanComplete = False + , sanityCheckRunning = False + , currentTransfers = transfers + } + +{- Don't just dump out the structure, because it will change over time, + - and parts of it are not relevant. -} +writeDaemonStatusFile :: FilePath -> DaemonStatus -> IO () +writeDaemonStatusFile file status = + viaTmp writeFile file =<< serialized <$> getPOSIXTime + where + serialized now = unlines + [ "lastRunning:" ++ show now + , "scanComplete:" ++ show (scanComplete status) + , "sanityCheckRunning:" ++ show (sanityCheckRunning status) + , "lastSanityCheck:" ++ maybe "" show (lastSanityCheck status) + ] + +readDaemonStatusFile :: FilePath -> IO DaemonStatus +readDaemonStatusFile file = parse <$> newDaemonStatus <*> readFile file + where + parse status = foldr parseline status . lines + parseline line status + | key == "lastRunning" = parseval readtime $ \v -> + status { lastRunning = Just v } + | key == "scanComplete" = parseval readish $ \v -> + status { scanComplete = v } + | key == "sanityCheckRunning" = parseval readish $ \v -> + status { sanityCheckRunning = v } + | key == "lastSanityCheck" = parseval readtime $ \v -> + status { lastSanityCheck = Just v } + | otherwise = status -- unparsable line + where + (key, value) = separate (== ':') line + parseval parser a = maybe status a (parser value) + readtime s = do + d <- parseTime defaultTimeLocale "%s%Qs" s + Just $ utcTimeToPOSIXSeconds d + +{- Checks if a time stamp was made after the daemon was lastRunning. + - + - Some slop is built in; this really checks if the time stamp was made + - at least ten minutes after the daemon was lastRunning. This is to + - ensure the daemon shut down cleanly, and deal with minor clock skew. + - + - If the daemon has never ran before, this always returns False. + -} +afterLastDaemonRun :: EpochTime -> DaemonStatus -> Bool +afterLastDaemonRun timestamp status = maybe False (< t) (lastRunning status) + where + t = realToFrac (timestamp + slop) :: POSIXTime + slop = fromIntegral tenMinutes + +tenMinutes :: Int +tenMinutes = 10 * 60 + +{- Mutates the transfer map. Runs in STM so that the transfer map can + - be modified in the same transaction that modifies the transfer queue. + - Note that this does not send a notification of the change; that's left + - to the caller. -} +adjustTransfersSTM :: DaemonStatusHandle -> (TransferMap -> TransferMap) -> STM () +adjustTransfersSTM dstatus a = do + s <- takeTMVar dstatus + let !v = a (currentTransfers s) + putTMVar dstatus $ s { currentTransfers = v } + +{- Checks if a transfer is currently running. -} +checkRunningTransferSTM :: DaemonStatusHandle -> Transfer -> STM Bool +checkRunningTransferSTM dstatus t = M.member t . currentTransfers + <$> readTMVar dstatus + +{- Alters a transfer's info, if the transfer is in the map. -} +alterTransferInfo :: Transfer -> (TransferInfo -> TransferInfo) -> Assistant () +alterTransferInfo t a = updateTransferInfo' $ M.adjust a t + +{- Updates a transfer's info. Adds the transfer to the map if necessary, + - or if already present, updates it while preserving the old transferTid, + - transferPaused, and bytesComplete values, which are not written to disk. -} +updateTransferInfo :: Transfer -> TransferInfo -> Assistant () +updateTransferInfo t info = updateTransferInfo' $ M.insertWith' merge t info + where + merge new old = new + { transferTid = maybe (transferTid new) Just (transferTid old) + , transferPaused = transferPaused new || transferPaused old + , bytesComplete = maybe (bytesComplete new) Just (bytesComplete old) + } + +updateTransferInfo' :: (TransferMap -> TransferMap) -> Assistant () +updateTransferInfo' a = notifyTransfer `after` modifyDaemonStatus_ update + where + update s = s { currentTransfers = a (currentTransfers s) } + +{- Removes a transfer from the map, and returns its info. -} +removeTransfer :: Transfer -> Assistant (Maybe TransferInfo) +removeTransfer t = notifyTransfer `after` modifyDaemonStatus remove + where + remove s = + let (info, ts) = M.updateLookupWithKey + (\_k _v -> Nothing) + t (currentTransfers s) + in (s { currentTransfers = ts }, info) + +{- Send a notification when a transfer is changed. -} +notifyTransfer :: Assistant () +notifyTransfer = do + dstatus <- getAssistant daemonStatusHandle + liftIO $ sendNotification + =<< transferNotifier <$> atomically (readTMVar dstatus) + +{- Send a notification when alerts are changed. -} +notifyAlert :: Assistant () +notifyAlert = do + dstatus <- getAssistant daemonStatusHandle + liftIO $ sendNotification + =<< alertNotifier <$> atomically (readTMVar dstatus) + +{- Returns the alert's identifier, which can be used to remove it. -} +addAlert :: Alert -> Assistant AlertId +addAlert alert = do + notice [showAlert alert] + notifyAlert `after` modifyDaemonStatus add + where + add s = (s { lastAlertId = i, alertMap = m }, i) + where + !i = nextAlertId $ lastAlertId s + !m = mergeAlert i alert (alertMap s) + +removeAlert :: AlertId -> Assistant () +removeAlert i = updateAlert i (const Nothing) + +updateAlert :: AlertId -> (Alert -> Maybe Alert) -> Assistant () +updateAlert i a = updateAlertMap $ \m -> M.update a i m + +updateAlertMap :: (AlertMap -> AlertMap) -> Assistant () +updateAlertMap a = notifyAlert `after` modifyDaemonStatus_ update + where + update s = + let !m = a (alertMap s) + in s { alertMap = m } + +{- Displays an alert while performing an activity that returns True on + - success. + - + - The alert is left visible afterwards, as filler. + - Old filler is pruned, to prevent the map growing too large. -} +alertWhile :: Alert -> Assistant Bool -> Assistant Bool +alertWhile alert a = alertWhile' alert $ do + r <- a + return (r, r) + +{- Like alertWhile, but allows the activity to return a value too. -} +alertWhile' :: Alert -> Assistant (Bool, a) -> Assistant a +alertWhile' alert a = do + let alert' = alert { alertClass = Activity } + i <- addAlert alert' + (ok, r) <- a + updateAlertMap $ mergeAlert i $ makeAlertFiller ok alert' + return r + +{- Displays an alert while performing an activity, then removes it. -} +alertDuring :: Alert -> Assistant a -> Assistant a +alertDuring alert a = do + i <- addAlert $ alert { alertClass = Activity } + removeAlert i `after` a + +getXMPPClientID :: Remote -> ClientID +getXMPPClientID r = T.pack $ drop (length "xmpp::") (Git.repoLocation (Remote.repo r)) diff --git a/Assistant/DeleteRemote.hs b/Assistant/DeleteRemote.hs new file mode 100644 index 0000000000..cc05786e40 --- /dev/null +++ b/Assistant/DeleteRemote.hs @@ -0,0 +1,89 @@ +{- git-annex assistant remote deletion utilities + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Assistant.DeleteRemote where + +import Assistant.Common +import Assistant.Types.UrlRenderer +import Assistant.TransferQueue +import Logs.Transfer +import Logs.Location +import Assistant.DaemonStatus +import qualified Remote +import Remote.List +import qualified Git.Remote +import Logs.Trust +import qualified Annex + +#ifdef WITH_WEBAPP +import Assistant.WebApp.Types +import Assistant.Alert +import qualified Data.Text as T +#endif + +{- Removes a remote (but leave the repository as-is), and returns the old + - Remote data. -} +disableRemote :: UUID -> Assistant Remote +disableRemote uuid = do + remote <- fromMaybe (error "unknown remote") + <$> liftAnnex (Remote.remoteFromUUID uuid) + liftAnnex $ do + inRepo $ Git.Remote.remove (Remote.name remote) + void $ remoteListRefresh + updateSyncRemotes + return remote + +{- Removes a remote, marking it dead .-} +removeRemote :: UUID -> Assistant Remote +removeRemote uuid = do + liftAnnex $ trustSet uuid DeadTrusted + disableRemote uuid + +{- Called when a Remote is probably empty, to remove it. + - + - This does one last check for any objects remaining in the Remote, + - and if there are any, queues Downloads of them, and defers removing + - the remote for later. This is to catch any objects not referred to + - in keys in the current branch. + -} +removableRemote :: UrlRenderer -> UUID -> Assistant () +removableRemote urlrenderer uuid = do + keys <- getkeys + if null keys + then finishRemovingRemote urlrenderer uuid + else do + r <- fromMaybe (error "unknown remote") + <$> liftAnnex (Remote.remoteFromUUID uuid) + mapM_ (queueremaining r) keys + where + queueremaining r k = + queueTransferWhenSmall "remaining object in unwanted remote" + Nothing (Transfer Download uuid k) r + {- Scanning for keys can take a long time; do not tie up + - the Annex monad while doing it, so other threads continue to + - run. -} + getkeys = do + a <- liftAnnex $ Annex.withCurrentState $ loggedKeysFor uuid + liftIO a + +{- With the webapp, this asks the user to click on a button to finish + - removing the remote. + - + - Without the webapp, just do the removal now. + -} +finishRemovingRemote :: UrlRenderer -> UUID -> Assistant () +#ifdef WITH_WEBAPP +finishRemovingRemote urlrenderer uuid = do + desc <- liftAnnex $ Remote.prettyUUID uuid + button <- mkAlertButton True (T.pack "Finish deletion process") urlrenderer $ + FinishDeleteRepositoryR uuid + void $ addAlert $ remoteRemovalAlert desc button +#else +finishRemovingRemote _ uuid = void $ removeRemote uuid +#endif diff --git a/Assistant/Drop.hs b/Assistant/Drop.hs new file mode 100644 index 0000000000..efd74fdb3e --- /dev/null +++ b/Assistant/Drop.hs @@ -0,0 +1,25 @@ +{- git-annex assistant dropping of unwanted content + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Assistant.Drop ( + handleDrops, + handleDropsFrom, +) where + +import Assistant.Common +import Assistant.DaemonStatus +import Annex.Drop (handleDropsFrom, Reason) +import Logs.Location +import CmdLine.Action + +{- Drop from local and/or remote when allowed by the preferred content and + - numcopies settings. -} +handleDrops :: Reason -> Bool -> Key -> AssociatedFile -> Maybe Remote -> Assistant () +handleDrops reason fromhere key f knownpresentremote = do + syncrs <- syncDataRemotes <$> getDaemonStatus + locs <- liftAnnex $ loggedLocations key + liftAnnex $ handleDropsFrom locs syncrs reason fromhere key f knownpresentremote callCommandAction diff --git a/Assistant/Fsck.hs b/Assistant/Fsck.hs new file mode 100644 index 0000000000..791c0cf170 --- /dev/null +++ b/Assistant/Fsck.hs @@ -0,0 +1,50 @@ +{- git-annex assistant fscking + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU AGPL version 3 or higher. + -} + +module Assistant.Fsck where + +import Assistant.Common +import Types.ScheduledActivity +import qualified Types.Remote as Remote +import Annex.UUID +import Assistant.Alert +import Assistant.Types.UrlRenderer +import Logs.Schedule +import qualified Annex + +import qualified Data.Set as S + +{- Displays a nudge in the webapp if a fsck is not configured for + - the specified remote, or for the local repository. -} +fsckNudge :: UrlRenderer -> Maybe Remote -> Assistant () +fsckNudge urlrenderer mr + | maybe True fsckableRemote mr = + whenM (liftAnnex $ annexFsckNudge <$> Annex.getGitConfig) $ + unlessM (liftAnnex $ checkFscked mr) $ + notFsckedNudge urlrenderer mr + | otherwise = noop + +fsckableRemote :: Remote -> Bool +fsckableRemote = isJust . Remote.remoteFsck + +{- Checks if the remote, or the local repository, has a fsck scheduled. + - Only looks at fscks configured to run via the local repository, not + - other repositories. -} +checkFscked :: Maybe Remote -> Annex Bool +checkFscked mr = any wanted . S.toList <$> (scheduleGet =<< getUUID) + where + wanted = case mr of + Nothing -> isSelfFsck + Just r -> flip isFsckOf (Remote.uuid r) + +isSelfFsck :: ScheduledActivity -> Bool +isSelfFsck (ScheduledSelfFsck _ _) = True +isSelfFsck _ = False + +isFsckOf :: ScheduledActivity -> UUID -> Bool +isFsckOf (ScheduledRemoteFsck u _ _) u' = u == u' +isFsckOf _ _ = False diff --git a/Assistant/Gpg.hs b/Assistant/Gpg.hs new file mode 100644 index 0000000000..a55a0cab73 --- /dev/null +++ b/Assistant/Gpg.hs @@ -0,0 +1,36 @@ +{- git-annex assistant gpg stuff + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU AGPL version 3 or higher. + -} + +{-# LANGUAGE QuasiQuotes, TemplateHaskell, OverloadedStrings #-} + +module Assistant.Gpg where + +import Utility.Gpg +import Utility.UserInfo +import Types.Remote (RemoteConfigKey) + +import qualified Data.Map as M + +{- Generates a gpg user id that is not used by any existing secret key -} +newUserId :: IO UserId +newUserId = do + oldkeys <- secretKeys + username <- myUserName + let basekeyname = username ++ "'s git-annex encryption key" + return $ Prelude.head $ filter (\n -> M.null $ M.filter (== n) oldkeys) + ( basekeyname + : map (\n -> basekeyname ++ show n) ([2..] :: [Int]) + ) + +data EnableEncryption = HybridEncryption | SharedEncryption | NoEncryption + deriving (Eq) + +{- Generates Remote configuration for encryption. -} +configureEncryption :: EnableEncryption -> (RemoteConfigKey, String) +configureEncryption SharedEncryption = ("encryption", "shared") +configureEncryption NoEncryption = ("encryption", "none") +configureEncryption HybridEncryption = ("encryption", "hybrid") diff --git a/Assistant/Install.hs b/Assistant/Install.hs new file mode 100644 index 0000000000..4d02c0ece5 --- /dev/null +++ b/Assistant/Install.hs @@ -0,0 +1,131 @@ +{- Assistant installation + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Assistant.Install where + +import Assistant.Common +import Assistant.Install.AutoStart +import Config.Files +import Utility.FileMode +import Utility.Shell +import Utility.Tmp +import Utility.Env +import Utility.SshConfig + +#ifdef darwin_HOST_OS +import Utility.OSX +#else +import Utility.FreeDesktop +import Assistant.Install.Menu +#endif + +standaloneAppBase :: IO (Maybe FilePath) +standaloneAppBase = getEnv "GIT_ANNEX_APP_BASE" + +{- The standalone app does not have an installation process. + - So when it's run, it needs to set up autostarting of the assistant + - daemon, as well as writing the programFile, and putting a + - git-annex-shell wrapper into ~/.ssh + - + - Note that this is done every time it's started, so if the user moves + - it around, the paths this sets up won't break. + - + - Nautilus hook script installation is done even for packaged apps, + - since it has to go into the user's home directory. + -} +ensureInstalled :: IO () +ensureInstalled = go =<< standaloneAppBase + where + go Nothing = installNautilus "git-annex" + go (Just base) = do + let program = base "git-annex" + programfile <- programFile + createDirectoryIfMissing True (parentDir programfile) + writeFile programfile program + +#ifdef darwin_HOST_OS + autostartfile <- userAutoStart osxAutoStartLabel +#else + menufile <- desktopMenuFilePath "git-annex" <$> userDataDir + icondir <- iconDir <$> userDataDir + installMenu program menufile base icondir + autostartfile <- autoStartPath "git-annex" <$> userConfigDir +#endif + installAutoStart program autostartfile + + {- This shim is only updated if it doesn't + - already exist with the right content. -} + sshdir <- sshDir + let shim = sshdir "git-annex-shell" + let runshell var = "exec " ++ base "runshell" ++ + " git-annex-shell -c \"" ++ var ++ "\"" + let content = unlines + [ shebang_local + , "set -e" + , "if [ \"x$SSH_ORIGINAL_COMMAND\" != \"x\" ]; then" + , runshell "$SSH_ORIGINAL_COMMAND" + , "else" + , runshell "$@" + , "fi" + ] + + curr <- catchDefaultIO "" $ readFileStrict shim + when (curr /= content) $ do + createDirectoryIfMissing True (parentDir shim) + viaTmp writeFile shim content + modifyFileMode shim $ addModes [ownerExecuteMode] + + installNautilus program + +installNautilus :: FilePath -> IO () +#ifdef linux_HOST_OS +installNautilus program = do + scriptdir <- (\d -> d "nautilus" "scripts") <$> userDataDir + genscript scriptdir "get" + genscript scriptdir "drop" + where + genscript scriptdir action = + installscript (scriptdir scriptname action) $ unlines + [ shebang_local + , autoaddedcomment + , "exec " ++ program ++ " " ++ action ++ " --notify-start --notify-finish -- \"$@\"" + ] + scriptname action = "git-annex " ++ action + installscript f c = whenM (safetoinstallscript f) $ do + writeFile f c + modifyFileMode f $ addModes [ownerExecuteMode] + safetoinstallscript f = catchDefaultIO True $ + elem autoaddedcomment . lines <$> readFileStrict f + autoaddedcomment = "# Automatically added by git-annex, do not edit. (To disable, chmod 600 this file.)" +#else +installNautilus _ = noop +#endif + +{- Returns a cleaned up environment that lacks settings used to make the + - standalone builds use their bundled libraries and programs. + - Useful when calling programs not included in the standalone builds. + - + - For a non-standalone build, returns Nothing. + -} +cleanEnvironment :: IO (Maybe [(String, String)]) +cleanEnvironment = clean <$> getEnvironment + where + clean env + | null vars = Nothing + | otherwise = Just $ catMaybes $ map (restoreorig env) env + | otherwise = Nothing + where + vars = words $ fromMaybe "" $ + lookup "GIT_ANNEX_STANDLONE_ENV" env + restoreorig oldenv p@(k, _v) + | k `elem` vars = case lookup ("ORIG_" ++ k) oldenv of + (Just v') + | not (null v') -> Just (k, v') + _ -> Nothing + | otherwise = Just p diff --git a/Assistant/Install/AutoStart.hs b/Assistant/Install/AutoStart.hs new file mode 100644 index 0000000000..b03d202244 --- /dev/null +++ b/Assistant/Install/AutoStart.hs @@ -0,0 +1,39 @@ +{- Assistant autostart file installation + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Assistant.Install.AutoStart where + +import Utility.FreeDesktop +#ifdef darwin_HOST_OS +import Utility.OSX +import Utility.Path +import System.Directory +#endif + +installAutoStart :: FilePath -> FilePath -> IO () +installAutoStart command file = do +#ifdef darwin_HOST_OS + createDirectoryIfMissing True (parentDir file) + writeFile file $ genOSXAutoStartFile osxAutoStartLabel command + ["assistant", "--autostart"] +#else + writeDesktopMenuFile (fdoAutostart command) file +#endif + +osxAutoStartLabel :: String +osxAutoStartLabel = "com.branchable.git-annex.assistant" + +fdoAutostart :: FilePath -> DesktopEntry +fdoAutostart command = genDesktopEntry + "Git Annex Assistant" + "Autostart" + False + (command ++ " assistant --autostart") + Nothing + [] diff --git a/Assistant/Install/Menu.hs b/Assistant/Install/Menu.hs new file mode 100644 index 0000000000..d095cdd887 --- /dev/null +++ b/Assistant/Install/Menu.hs @@ -0,0 +1,47 @@ +{- Assistant menu installation. + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Assistant.Install.Menu where + +import Common + +import Utility.FreeDesktop + +installMenu :: FilePath -> FilePath -> FilePath -> FilePath -> IO () +#ifdef darwin_HOST_OS +installMenu _command _menufile _iconsrcdir _icondir = return () +#else +installMenu command menufile iconsrcdir icondir = do + writeDesktopMenuFile (fdoDesktopMenu command) menufile + installIcon (iconsrcdir "logo.svg") $ + iconFilePath (iconBaseName ++ ".svg") "scalable" icondir + installIcon (iconsrcdir "logo_16x16.png") $ + iconFilePath (iconBaseName ++ ".png") "16x16" icondir +#endif + +{- The command can be either just "git-annex", or the full path to use + - to run it. -} +fdoDesktopMenu :: FilePath -> DesktopEntry +fdoDesktopMenu command = genDesktopEntry + "Git Annex" + "Track and sync the files in your Git Annex" + False + (command ++ " webapp") + (Just iconBaseName) + ["Network", "FileTransfer"] + +installIcon :: FilePath -> FilePath -> IO () +installIcon src dest = do + createDirectoryIfMissing True (parentDir dest) + withBinaryFile src ReadMode $ \hin -> + withBinaryFile dest WriteMode $ \hout -> + hGetContents hin >>= hPutStr hout + +iconBaseName :: String +iconBaseName = "git-annex" diff --git a/Assistant/MakeRemote.hs b/Assistant/MakeRemote.hs new file mode 100644 index 0000000000..349d4af9ca --- /dev/null +++ b/Assistant/MakeRemote.hs @@ -0,0 +1,166 @@ +{- git-annex assistant remote creation utilities + - + - Copyright 2012, 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Assistant.MakeRemote where + +import Assistant.Common +import Assistant.Ssh +import qualified Types.Remote as R +import qualified Remote +import Remote.List +import qualified Remote.Rsync as Rsync +import qualified Remote.GCrypt as GCrypt +import qualified Git +import qualified Git.Command +import qualified Command.InitRemote +import Logs.UUID +import Logs.Remote +import Git.Remote +import Git.Types (RemoteName) +import Creds +import Assistant.Gpg +import Utility.Gpg (KeyId) + +import qualified Data.Map as M + +{- Sets up a new git or rsync remote, accessed over ssh. -} +makeSshRemote :: SshData -> Annex RemoteName +makeSshRemote sshdata = maker (sshRepoName sshdata) (genSshUrl sshdata) + where + maker + | onlyCapability sshdata RsyncCapable = makeRsyncRemote + | otherwise = makeGitRemote + +{- Runs an action that returns a name of the remote, and finishes adding it. -} +addRemote :: Annex RemoteName -> Annex Remote +addRemote a = do + name <- a + void remoteListRefresh + maybe (error "failed to add remote") return + =<< Remote.byName (Just name) + +{- Inits a rsync special remote, and returns its name. -} +makeRsyncRemote :: RemoteName -> String -> Annex String +makeRsyncRemote name location = makeRemote name location $ const $ void $ + go =<< Command.InitRemote.findExisting name + where + go Nothing = setupSpecialRemote name Rsync.remote config Nothing + (Nothing, Command.InitRemote.newConfig name) + go (Just (u, c)) = setupSpecialRemote name Rsync.remote config Nothing + (Just u, c) + config = M.fromList + [ ("encryption", "shared") + , ("rsyncurl", location) + , ("type", "rsync") + ] + +{- Inits a gcrypt special remote, and returns its name. -} +makeGCryptRemote :: RemoteName -> String -> KeyId -> Annex RemoteName +makeGCryptRemote remotename location keyid = + initSpecialRemote remotename GCrypt.remote Nothing $ M.fromList + [ ("type", "gcrypt") + , ("gitrepo", location) + , configureEncryption HybridEncryption + , ("keyid", keyid) + ] + +type SpecialRemoteMaker = RemoteName -> RemoteType -> Maybe CredPair -> R.RemoteConfig -> Annex RemoteName + +{- Inits a new special remote. The name is used as a suggestion, but + - will be changed if there is already a special remote with that name. -} +initSpecialRemote :: SpecialRemoteMaker +initSpecialRemote name remotetype mcreds config = go 0 + where + go :: Int -> Annex RemoteName + go n = do + let fullname = if n == 0 then name else name ++ show n + r <- Command.InitRemote.findExisting fullname + case r of + Nothing -> setupSpecialRemote fullname remotetype config mcreds + (Nothing, Command.InitRemote.newConfig fullname) + Just _ -> go (n + 1) + +{- Enables an existing special remote. -} +enableSpecialRemote :: SpecialRemoteMaker +enableSpecialRemote name remotetype mcreds config = do + r <- Command.InitRemote.findExisting name + case r of + Nothing -> error $ "Cannot find a special remote named " ++ name + Just (u, c) -> setupSpecialRemote name remotetype config mcreds (Just u, c) + +setupSpecialRemote :: RemoteName -> RemoteType -> R.RemoteConfig -> Maybe CredPair -> (Maybe UUID, R.RemoteConfig) -> Annex RemoteName +setupSpecialRemote name remotetype config mcreds (mu, c) = do + {- Currently, only 'weak' ciphers can be generated from the + - assistant, because otherwise GnuPG may block once the entropy + - pool is drained, and as of now there's no way to tell the user + - to perform IO actions to refill the pool. -} + (c', u) <- R.setup remotetype mu mcreds $ + M.insert "highRandomQuality" "false" $ M.union config c + describeUUID u name + configSet u c' + return name + +{- Returns the name of the git remote it created. If there's already a + - remote at the location, returns its name. -} +makeGitRemote :: String -> String -> Annex RemoteName +makeGitRemote basename location = makeRemote basename location $ \name -> + void $ inRepo $ Git.Command.runBool + [Param "remote", Param "add", Param name, Param location] + +{- If there's not already a remote at the location, adds it using the + - action, which is passed the name of the remote to make. + - + - Returns the name of the remote. -} +makeRemote :: String -> String -> (RemoteName -> Annex ()) -> Annex RemoteName +makeRemote basename location a = do + g <- gitRepo + if not (any samelocation $ Git.remotes g) + then do + let name = uniqueRemoteName basename 0 g + a name + return name + else return basename + where + samelocation x = Git.repoLocation x == location + +{- Generate an unused name for a remote, adding a number if + - necessary. + - + - Ensures that the returned name is a legal git remote name. -} +uniqueRemoteName :: String -> Int -> Git.Repo -> RemoteName +uniqueRemoteName basename n r + | null namecollision = name + | otherwise = uniqueRemoteName legalbasename (succ n) r + where + namecollision = filter samename (Git.remotes r) + samename x = Git.remoteName x == Just name + name + | n == 0 = legalbasename + | otherwise = legalbasename ++ show n + legalbasename = makeLegalName basename + +{- Finds a CredPair belonging to any Remote that is of a given type + - and matches some other criteria. + - + - This can be used as a default when another repository is being set up + - using the same service. + - + - A function must be provided that returns the CredPairStorage + - to use for a particular Remote's uuid. + -} +previouslyUsedCredPair + :: (UUID -> CredPairStorage) + -> RemoteType + -> (Remote -> Bool) + -> Annex (Maybe CredPair) +previouslyUsedCredPair getstorage remotetype criteria = + getM fromstorage =<< filter criteria . filter sametype <$> remoteList + where + sametype r = R.typename (R.remotetype r) == R.typename remotetype + fromstorage r = do + let storage = getstorage (R.uuid r) + getRemoteCredPair (R.config r) storage diff --git a/Assistant/Monad.hs b/Assistant/Monad.hs new file mode 100644 index 0000000000..7c28c7f6fd --- /dev/null +++ b/Assistant/Monad.hs @@ -0,0 +1,144 @@ +{- git-annex assistant monad + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE GeneralizedNewtypeDeriving, MultiParamTypeClasses #-} + +module Assistant.Monad ( + Assistant, + AssistantData(..), + newAssistantData, + runAssistant, + getAssistant, + LiftAnnex, + liftAnnex, + (<~>), + (<<~), + asIO, + asIO1, + asIO2, + ThreadName, + debug, + notice +) where + +import "mtl" Control.Monad.Reader +import System.Log.Logger + +import Common.Annex +import Assistant.Types.ThreadedMonad +import Assistant.Types.DaemonStatus +import Assistant.Types.ScanRemotes +import Assistant.Types.TransferQueue +import Assistant.Types.TransferSlots +import Assistant.Types.TransferrerPool +import Assistant.Types.Pushes +import Assistant.Types.BranchChange +import Assistant.Types.Commits +import Assistant.Types.Changes +import Assistant.Types.RepoProblem +import Assistant.Types.Buddies +import Assistant.Types.NetMessager +import Assistant.Types.ThreadName + +newtype Assistant a = Assistant { mkAssistant :: ReaderT AssistantData IO a } + deriving ( + Monad, + MonadIO, + MonadReader AssistantData, + Functor, + Applicative + ) + +data AssistantData = AssistantData + { threadName :: ThreadName + , threadState :: ThreadState + , daemonStatusHandle :: DaemonStatusHandle + , scanRemoteMap :: ScanRemoteMap + , transferQueue :: TransferQueue + , transferSlots :: TransferSlots + , transferrerPool :: TransferrerPool + , failedPushMap :: FailedPushMap + , commitChan :: CommitChan + , changePool :: ChangePool + , repoProblemChan :: RepoProblemChan + , branchChangeHandle :: BranchChangeHandle + , buddyList :: BuddyList + , netMessager :: NetMessager + } + +newAssistantData :: ThreadState -> DaemonStatusHandle -> IO AssistantData +newAssistantData st dstatus = AssistantData + <$> pure (ThreadName "main") + <*> pure st + <*> pure dstatus + <*> newScanRemoteMap + <*> newTransferQueue + <*> newTransferSlots + <*> newTransferrerPool (checkNetworkConnections dstatus) + <*> newFailedPushMap + <*> newCommitChan + <*> newChangePool + <*> newRepoProblemChan + <*> newBranchChangeHandle + <*> newBuddyList + <*> newNetMessager + +runAssistant :: AssistantData -> Assistant a -> IO a +runAssistant d a = runReaderT (mkAssistant a) d + +getAssistant :: (AssistantData -> a) -> Assistant a +getAssistant = reader + +{- Using a type class for lifting into the annex monad allows + - easily lifting to it from multiple different monads. -} +class LiftAnnex m where + liftAnnex :: Annex a -> m a + +{- Runs an action in the git-annex monad. Note that the same monad state + - is shared among all assistant threads, so only one of these can run at + - a time. Therefore, long-duration actions should be avoided. -} +instance LiftAnnex Assistant where + liftAnnex a = do + st <- reader threadState + liftIO $ runThreadState st a + +{- Runs an IO action, passing it an IO action that runs an Assistant action. -} +(<~>) :: (IO a -> IO b) -> Assistant a -> Assistant b +io <~> a = do + d <- reader id + liftIO $ io $ runAssistant d a + +{- Creates an IO action that will run an Assistant action when run. -} +asIO :: Assistant a -> Assistant (IO a) +asIO a = do + d <- reader id + return $ runAssistant d a + +asIO1 :: (a -> Assistant b) -> Assistant (a -> IO b) +asIO1 a = do + d <- reader id + return $ \v -> runAssistant d $ a v + +asIO2 :: (a -> b -> Assistant c) -> Assistant (a -> b -> IO c) +asIO2 a = do + d <- reader id + return $ \v1 v2 -> runAssistant d (a v1 v2) + +{- Runs an IO action on a selected field of the AssistantData. -} +(<<~) :: (a -> IO b) -> (AssistantData -> a) -> Assistant b +io <<~ v = reader v >>= liftIO . io + +debug :: [String] -> Assistant () +debug = logaction debugM + +notice :: [String] -> Assistant () +notice = logaction noticeM + +logaction :: (String -> String -> IO ()) -> [String] -> Assistant () +logaction a ws = do + ThreadName name <- getAssistant threadName + liftIO $ a name $ unwords $ (name ++ ":") : ws diff --git a/Assistant/NamedThread.hs b/Assistant/NamedThread.hs new file mode 100644 index 0000000000..e1b3983f76 --- /dev/null +++ b/Assistant/NamedThread.hs @@ -0,0 +1,102 @@ +{- git-annex assistant named threads. + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Assistant.NamedThread where + +import Common.Annex +import Assistant.Types.NamedThread +import Assistant.Types.ThreadName +import Assistant.Types.DaemonStatus +import Assistant.Types.UrlRenderer +import Assistant.DaemonStatus +import Assistant.Monad +import Utility.NotificationBroadcaster + +import Control.Concurrent +import Control.Concurrent.Async +import qualified Data.Map as M +import qualified Control.Exception as E + +#ifdef WITH_WEBAPP +import Assistant.WebApp.Types +import Assistant.Types.Alert +import Assistant.Alert +import qualified Data.Text as T +#endif + +{- Starts a named thread, if it's not already running. + - + - Named threads are run by a management thread, so if they crash + - an alert is displayed, allowing the thread to be restarted. -} +startNamedThread :: UrlRenderer -> NamedThread -> Assistant () +startNamedThread urlrenderer (NamedThread afterstartupsanitycheck name a) = do + m <- startedThreads <$> getDaemonStatus + case M.lookup name m of + Nothing -> start + Just (aid, _) -> do + r <- liftIO (E.try (poll aid) :: IO (Either E.SomeException (Maybe (Either E.SomeException ())))) + case r of + Right Nothing -> noop + _ -> start + where + start + | afterstartupsanitycheck = do + status <- getDaemonStatus + h <- liftIO $ newNotificationHandle False $ + startupSanityCheckNotifier status + startwith $ runmanaged $ + liftIO $ waitNotification h + | otherwise = startwith $ runmanaged noop + startwith runner = do + d <- getAssistant id + aid <- liftIO $ runner $ d { threadName = name } + restart <- asIO $ startNamedThread urlrenderer (NamedThread False name a) + modifyDaemonStatus_ $ \s -> s + { startedThreads = M.insertWith' const name (aid, restart) (startedThreads s) } + runmanaged first d = do + aid <- async $ runAssistant d $ do + void first + a + void $ forkIO $ manager d aid + return aid + manager d aid = do + r <- E.try (wait aid) :: IO (Either E.SomeException ()) + case r of + Right _ -> noop + Left e -> do + let msg = unwords + [ fromThreadName $ threadName d + , "crashed:", show e + ] + hPutStrLn stderr msg +#ifdef WITH_WEBAPP + button <- runAssistant d $ mkAlertButton True + (T.pack "Restart Thread") + urlrenderer + (RestartThreadR name) + runAssistant d $ void $ addAlert $ + (warningAlert (fromThreadName name) msg) + { alertButtons = [button] } +#endif + +namedThreadId :: NamedThread -> Assistant (Maybe ThreadId) +namedThreadId (NamedThread _ name _) = do + m <- startedThreads <$> getDaemonStatus + return $ asyncThreadId . fst <$> M.lookup name m + +{- Waits for all named threads that have been started to finish. + - + - Note that if a named thread crashes, it will probably + - cause this to crash as well. Also, named threads that are started + - after this is called will not be waited on. -} +waitNamedThreads :: Assistant () +waitNamedThreads = do + m <- startedThreads <$> getDaemonStatus + liftIO $ mapM_ (wait . fst) $ M.elems m + diff --git a/Assistant/NetMessager.hs b/Assistant/NetMessager.hs new file mode 100644 index 0000000000..acb18b6484 --- /dev/null +++ b/Assistant/NetMessager.hs @@ -0,0 +1,180 @@ +{- git-annex assistant out of band network messager interface + - + - Copyright 2012-2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE BangPatterns #-} + +module Assistant.NetMessager where + +import Assistant.Common +import Assistant.Types.NetMessager + +import Control.Concurrent.STM +import Control.Concurrent.MSampleVar +import qualified Data.Set as S +import qualified Data.Map as M +import qualified Data.DList as D + +sendNetMessage :: NetMessage -> Assistant () +sendNetMessage m = + (atomically . flip writeTChan m) <<~ (netMessages . netMessager) + +waitNetMessage :: Assistant (NetMessage) +waitNetMessage = (atomically . readTChan) <<~ (netMessages . netMessager) + +notifyNetMessagerRestart :: Assistant () +notifyNetMessagerRestart = + flip writeSV () <<~ (netMessagerRestart . netMessager) + +{- This can be used to get an early indication if the network has + - changed, to immediately restart a connection. However, that is not + - available on all systems, so clients also need to deal with + - restarting dropped connections in the usual way. -} +waitNetMessagerRestart :: Assistant () +waitNetMessagerRestart = readSV <<~ (netMessagerRestart . netMessager) + +{- Store a new important NetMessage for a client, and if an equivilant + - older message is already stored, remove it from both importantNetMessages + - and sentImportantNetMessages. -} +storeImportantNetMessage :: NetMessage -> ClientID -> (ClientID -> Bool) -> Assistant () +storeImportantNetMessage m client matchingclient = go <<~ netMessager + where + go nm = atomically $ do + q <- takeTMVar $ importantNetMessages nm + sent <- takeTMVar $ sentImportantNetMessages nm + putTMVar (importantNetMessages nm) $ + M.alter (Just . maybe (S.singleton m) (S.insert m)) client $ + M.mapWithKey removematching q + putTMVar (sentImportantNetMessages nm) $ + M.mapWithKey removematching sent + removematching someclient s + | matchingclient someclient = S.filter (not . equivilantImportantNetMessages m) s + | otherwise = s + +{- Indicates that an important NetMessage has been sent to a client. -} +sentImportantNetMessage :: NetMessage -> ClientID -> Assistant () +sentImportantNetMessage m client = go <<~ (sentImportantNetMessages . netMessager) + where + go v = atomically $ do + sent <- takeTMVar v + putTMVar v $ + M.alter (Just . maybe (S.singleton m) (S.insert m)) client sent + +{- Checks for important NetMessages that have been stored for a client, and + - sent to a client. Typically the same client for both, although + - a modified or more specific client may need to be used. -} +checkImportantNetMessages :: (ClientID, ClientID) -> Assistant (S.Set NetMessage, S.Set NetMessage) +checkImportantNetMessages (storedclient, sentclient) = go <<~ netMessager + where + go nm = atomically $ do + stored <- M.lookup storedclient <$> (readTMVar $ importantNetMessages nm) + sent <- M.lookup sentclient <$> (readTMVar $ sentImportantNetMessages nm) + return (fromMaybe S.empty stored, fromMaybe S.empty sent) + +{- Queues a push initiation message in the queue for the appropriate + - side of the push but only if there is not already an initiation message + - from the same client in the queue. -} +queuePushInitiation :: NetMessage -> Assistant () +queuePushInitiation msg@(Pushing clientid stage) = do + tv <- getPushInitiationQueue side + liftIO $ atomically $ do + r <- tryTakeTMVar tv + case r of + Nothing -> putTMVar tv [msg] + Just l -> do + let !l' = msg : filter differentclient l + putTMVar tv l' + where + side = pushDestinationSide stage + differentclient (Pushing cid _) = cid /= clientid + differentclient _ = True +queuePushInitiation _ = noop + +{- Waits for a push inititation message to be received, and runs + - function to select a message from the queue. -} +waitPushInitiation :: PushSide -> ([NetMessage] -> (NetMessage, [NetMessage])) -> Assistant NetMessage +waitPushInitiation side selector = do + tv <- getPushInitiationQueue side + liftIO $ atomically $ do + q <- takeTMVar tv + if null q + then retry + else do + let (msg, !q') = selector q + unless (null q') $ + putTMVar tv q' + return msg + +{- Stores messages for a push into the appropriate inbox. + - + - To avoid overflow, only 1000 messages max are stored in any + - inbox, which should be far more than necessary. + - + - TODO: If we have more than 100 inboxes for different clients, + - discard old ones that are not currently being used by any push. + -} +storeInbox :: NetMessage -> Assistant () +storeInbox msg@(Pushing clientid stage) = do + inboxes <- getInboxes side + stored <- liftIO $ atomically $ do + m <- readTVar inboxes + let update = \v -> do + writeTVar inboxes $ + M.insertWith' const clientid v m + return True + case M.lookup clientid m of + Nothing -> update (1, tostore) + Just (sz, l) + | sz > 1000 -> return False + | otherwise -> + let !sz' = sz + 1 + !l' = D.append l tostore + in update (sz', l') + if stored + then netMessagerDebug clientid ["stored", logNetMessage msg, "in", show side, "inbox"] + else netMessagerDebug clientid ["discarded", logNetMessage msg, "; ", show side, "inbox is full"] + where + side = pushDestinationSide stage + tostore = D.singleton msg +storeInbox _ = noop + +{- Gets the new message for a push from its inbox. + - Blocks until a message has been received. -} +waitInbox :: ClientID -> PushSide -> Assistant (NetMessage) +waitInbox clientid side = do + inboxes <- getInboxes side + liftIO $ atomically $ do + m <- readTVar inboxes + case M.lookup clientid m of + Nothing -> retry + Just (sz, dl) + | sz < 1 -> retry + | otherwise -> do + let msg = D.head dl + let dl' = D.tail dl + let !sz' = sz - 1 + writeTVar inboxes $ + M.insertWith' const clientid (sz', dl') m + return msg + +emptyInbox :: ClientID -> PushSide -> Assistant () +emptyInbox clientid side = do + inboxes <- getInboxes side + liftIO $ atomically $ + modifyTVar' inboxes $ + M.delete clientid + +getInboxes :: PushSide -> Assistant Inboxes +getInboxes side = + getSide side . netMessagerInboxes <$> getAssistant netMessager + +getPushInitiationQueue :: PushSide -> Assistant (TMVar [NetMessage]) +getPushInitiationQueue side = + getSide side . netMessagerPushInitiations <$> getAssistant netMessager + +netMessagerDebug :: ClientID -> [String] -> Assistant () +netMessagerDebug clientid l = debug $ + "NetMessager" : l ++ [show $ logClientID clientid] diff --git a/Assistant/Pairing.hs b/Assistant/Pairing.hs new file mode 100644 index 0000000000..bb1384a151 --- /dev/null +++ b/Assistant/Pairing.hs @@ -0,0 +1,92 @@ +{- git-annex assistant repo pairing, core data types + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Assistant.Pairing where + +import Common.Annex +import Utility.Verifiable +import Assistant.Ssh + +import Control.Concurrent +import Network.Socket +import Data.Char +import qualified Data.Text as T + +data PairStage + {- "I'll pair with anybody who shares the secret that can be used + - to verify this request." -} + = PairReq + {- "I've verified your request, and you can verify this to see + - that I know the secret. I set up your ssh key already. + - Here's mine for you to set up." -} + | PairAck + {- "I saw your PairAck; you can stop sending them." -} + | PairDone + deriving (Eq, Read, Show, Ord, Enum) + +newtype PairMsg = PairMsg (Verifiable (PairStage, PairData, SomeAddr)) + deriving (Eq, Read, Show) + +verifiedPairMsg :: PairMsg -> PairingInProgress -> Bool +verifiedPairMsg (PairMsg m) pip = verify m $ inProgressSecret pip + +fromPairMsg :: PairMsg -> Verifiable (PairStage, PairData, SomeAddr) +fromPairMsg (PairMsg m) = m + +pairMsgStage :: PairMsg -> PairStage +pairMsgStage (PairMsg (Verifiable (s, _, _) _)) = s + +pairMsgData :: PairMsg -> PairData +pairMsgData (PairMsg (Verifiable (_, d, _) _)) = d + +pairMsgAddr :: PairMsg -> SomeAddr +pairMsgAddr (PairMsg (Verifiable (_, _, a) _)) = a + +data PairData = PairData + -- uname -n output, not a full domain name + { remoteHostName :: Maybe HostName + , remoteUserName :: UserName + , remoteDirectory :: FilePath + , remoteSshPubKey :: SshPubKey + , pairUUID :: UUID + } + deriving (Eq, Read, Show) + +type UserName = String + +{- A pairing that is in progress has a secret, a thread that is + - broadcasting pairing messages, and a SshKeyPair that has not yet been + - set up on disk. -} +data PairingInProgress = PairingInProgress + { inProgressSecret :: Secret + , inProgressThreadId :: Maybe ThreadId + , inProgressSshKeyPair :: SshKeyPair + , inProgressPairData :: PairData + , inProgressPairStage :: PairStage + } + deriving (Show) + +data SomeAddr = IPv4Addr HostAddress +{- My Android build of the Network library does not currently have IPV6 + - support. -} +#ifndef __ANDROID__ + | IPv6Addr HostAddress6 +#endif + deriving (Ord, Eq, Read, Show) + +{- This contains the whole secret, just lightly obfuscated to make it not + - too obvious. It's only displayed in the user's web browser. -} +newtype SecretReminder = SecretReminder [Int] + deriving (Show, Eq, Ord, Read) + +toSecretReminder :: T.Text -> SecretReminder +toSecretReminder = SecretReminder . map ord . T.unpack + +fromSecretReminder :: SecretReminder -> T.Text +fromSecretReminder (SecretReminder s) = T.pack $ map chr s diff --git a/Assistant/Pairing/MakeRemote.hs b/Assistant/Pairing/MakeRemote.hs new file mode 100644 index 0000000000..3f38236647 --- /dev/null +++ b/Assistant/Pairing/MakeRemote.hs @@ -0,0 +1,96 @@ +{- git-annex assistant pairing remote creation + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Assistant.Pairing.MakeRemote where + +import Assistant.Common +import Assistant.Ssh +import Assistant.Pairing +import Assistant.Pairing.Network +import Assistant.MakeRemote +import Assistant.Sync +import Config.Cost +import Config +import qualified Types.Remote as Remote + +import Network.Socket +import qualified Data.Text as T + +{- Authorized keys are set up before pairing is complete, so that the other + - side can immediately begin syncing. -} +setupAuthorizedKeys :: PairMsg -> FilePath -> IO () +setupAuthorizedKeys msg repodir = do + validateSshPubKey pubkey + unlessM (liftIO $ addAuthorizedKeys True repodir pubkey) $ + error "failed setting up ssh authorized keys" + where + pubkey = remoteSshPubKey $ pairMsgData msg + +{- When local pairing is complete, this is used to set up the remote for + - the host we paired with. -} +finishedLocalPairing :: PairMsg -> SshKeyPair -> Assistant () +finishedLocalPairing msg keypair = do + sshdata <- liftIO $ setupSshKeyPair keypair =<< pairMsgToSshData msg + {- Ensure that we know the ssh host key for the host we paired with. + - If we don't, ssh over to get it. -} + liftIO $ unlessM (knownHost $ sshHostName sshdata) $ + void $ sshTranscript + [ sshOpt "StrictHostKeyChecking" "no" + , sshOpt "NumberOfPasswordPrompts" "0" + , "-n" + , genSshHost (sshHostName sshdata) (sshUserName sshdata) + , "git-annex-shell -c configlist " ++ T.unpack (sshDirectory sshdata) + ] + Nothing + r <- liftAnnex $ addRemote $ makeSshRemote sshdata + liftAnnex $ setRemoteCost (Remote.repo r) semiExpensiveRemoteCost + syncRemote r + +{- Mostly a straightforward conversion. Except: + - * Determine the best hostname to use to contact the host. + - * Strip leading ~/ from the directory name. + -} +pairMsgToSshData :: PairMsg -> IO SshData +pairMsgToSshData msg = do + let d = pairMsgData msg + hostname <- liftIO $ bestHostName msg + let dir = case remoteDirectory d of + ('~':'/':v) -> v + v -> v + return SshData + { sshHostName = T.pack hostname + , sshUserName = Just (T.pack $ remoteUserName d) + , sshDirectory = T.pack dir + , sshRepoName = genSshRepoName hostname dir + , sshPort = 22 + , needsPubKey = True + , sshCapabilities = [GitAnnexShellCapable, GitCapable, RsyncCapable] + } + +{- Finds the best hostname to use for the host that sent the PairMsg. + - + - If remoteHostName is set, tries to use a .local address based on it. + - That's the most robust, if this system supports .local. + - Otherwise, looks up the hostname in the DNS for the remoteAddress, + - if any. May fall back to remoteAddress if there's no DNS. Ugh. -} +bestHostName :: PairMsg -> IO HostName +bestHostName msg = case remoteHostName $ pairMsgData msg of + Just h -> do + let localname = h ++ ".local" + addrs <- catchDefaultIO [] $ + getAddrInfo Nothing (Just localname) Nothing + maybe fallback (const $ return localname) (headMaybe addrs) + Nothing -> fallback + where + fallback = do + let a = pairMsgAddr msg + let sockaddr = case a of + IPv4Addr addr -> SockAddrInet (PortNum 0) addr + IPv6Addr addr -> SockAddrInet6 (PortNum 0) 0 addr 0 + fromMaybe (showAddr a) + <$> catchDefaultIO Nothing + (fst <$> getNameInfo [] True False sockaddr) diff --git a/Assistant/Pairing/Network.hs b/Assistant/Pairing/Network.hs new file mode 100644 index 0000000000..6c625f8814 --- /dev/null +++ b/Assistant/Pairing/Network.hs @@ -0,0 +1,130 @@ +{- git-annex assistant pairing network code + - + - All network traffic is sent over multicast UDP. For reliability, + - each message is repeated until acknowledged. This is done using a + - thread, that gets stopped before the next message is sent. + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Assistant.Pairing.Network where + +import Assistant.Common +import Assistant.Pairing +import Assistant.DaemonStatus +import Utility.ThreadScheduler +import Utility.Verifiable + +import Network.Multicast +import Network.Info +import Network.Socket +import Control.Exception (bracket) +import qualified Data.Map as M +import Control.Concurrent + +{- This is an arbitrary port in the dynamic port range, that could + - conceivably be used for some other broadcast messages. + - If so, hope they ignore the garbage from us; we'll certianly + - ignore garbage from them. Wild wild west. -} +pairingPort :: PortNumber +pairingPort = 55556 + +{- Goal: Reach all hosts on the same network segment. + - Method: Use same address that avahi uses. Other broadcast addresses seem + - to not be let through some routers. -} +multicastAddress :: SomeAddr -> HostName +multicastAddress (IPv4Addr _) = "224.0.0.251" +multicastAddress (IPv6Addr _) = "ff02::fb" + +{- Multicasts a message repeatedly on all interfaces, with a 2 second + - delay between each transmission. The message is repeated forever + - unless a number of repeats is specified. + - + - The remoteHostAddress is set to the interface's IP address. + - + - Note that new sockets are opened each time. This is hardly efficient, + - but it allows new network interfaces to be used as they come up. + - On the other hand, the expensive DNS lookups are cached. + -} +multicastPairMsg :: Maybe Int -> Secret -> PairData -> PairStage -> IO () +multicastPairMsg repeats secret pairdata stage = go M.empty repeats + where + go _ (Just 0) = noop + go cache n = do + addrs <- activeNetworkAddresses + let cache' = updatecache cache addrs + mapM_ (sendinterface cache') addrs + threadDelaySeconds (Seconds 2) + go cache' $ pred <$> n + {- The multicast library currently chokes on ipv6 addresses. -} + sendinterface _ (IPv6Addr _) = noop + sendinterface cache i = void $ tryIO $ + withSocketsDo $ bracket setup cleanup use + where + setup = multicastSender (multicastAddress i) pairingPort + cleanup (sock, _) = sClose sock -- FIXME does not work + use (sock, addr) = do + setInterface sock (showAddr i) + maybe noop (\s -> void $ sendTo sock s addr) + (M.lookup i cache) + updatecache cache [] = cache + updatecache cache (i:is) + | M.member i cache = updatecache cache is + | otherwise = updatecache (M.insert i (show $ mkmsg i) cache) is + mkmsg addr = PairMsg $ + mkVerifiable (stage, pairdata, addr) secret + +startSending :: PairingInProgress -> PairStage -> (PairStage -> IO ()) -> Assistant () +startSending pip stage sender = do + a <- asIO start + void $ liftIO $ forkIO a + where + start = do + tid <- liftIO myThreadId + let pip' = pip { inProgressPairStage = stage, inProgressThreadId = Just tid } + oldpip <- modifyDaemonStatus $ + \s -> (s { pairingInProgress = Just pip' }, pairingInProgress s) + maybe noop stopold oldpip + liftIO $ sender stage + stopold = maybe noop (liftIO . killThread) . inProgressThreadId + +stopSending :: PairingInProgress -> Assistant () +stopSending pip = do + maybe noop (liftIO . killThread) $ inProgressThreadId pip + modifyDaemonStatus_ $ \s -> s { pairingInProgress = Nothing } + +class ToSomeAddr a where + toSomeAddr :: a -> SomeAddr + +instance ToSomeAddr IPv4 where + toSomeAddr (IPv4 a) = IPv4Addr a + +instance ToSomeAddr IPv6 where + toSomeAddr (IPv6 o1 o2 o3 o4) = IPv6Addr (o1, o2, o3, o4) + +showAddr :: SomeAddr -> HostName +showAddr (IPv4Addr a) = show $ IPv4 a +showAddr (IPv6Addr (o1, o2, o3, o4)) = show $ IPv6 o1 o2 o3 o4 + +activeNetworkAddresses :: IO [SomeAddr] +activeNetworkAddresses = filter (not . all (`elem` "0.:") . showAddr) + . concatMap (\ni -> [toSomeAddr $ ipv4 ni, toSomeAddr $ ipv6 ni]) + <$> getNetworkInterfaces + +{- A human-visible description of the repository being paired with. + - Note that the repository's description is not shown to the user, because + - it could be something like "my repo", which is confusing when pairing + - with someone else's repo. However, this has the same format as the + - default decription of a repo. -} +pairRepo :: PairMsg -> String +pairRepo msg = concat + [ remoteUserName d + , "@" + , fromMaybe (showAddr $ pairMsgAddr msg) (remoteHostName d) + , ":" + , remoteDirectory d + ] + where + d = pairMsgData msg diff --git a/Assistant/Pushes.hs b/Assistant/Pushes.hs new file mode 100644 index 0000000000..54f31a84bc --- /dev/null +++ b/Assistant/Pushes.hs @@ -0,0 +1,40 @@ +{- git-annex assistant push tracking + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Assistant.Pushes where + +import Assistant.Common +import Assistant.Types.Pushes + +import Control.Concurrent.STM +import Data.Time.Clock +import qualified Data.Map as M + +{- Blocks until there are failed pushes. + - Returns Remotes whose pushes failed a given time duration or more ago. + - (This may be an empty list.) -} +getFailedPushesBefore :: NominalDiffTime -> Assistant [Remote] +getFailedPushesBefore duration = do + v <- getAssistant failedPushMap + liftIO $ do + m <- atomically $ readTMVar v + now <- getCurrentTime + return $ M.keys $ M.filter (not . toorecent now) m + where + toorecent now time = now `diffUTCTime` time < duration + +{- Modifies the map. -} +changeFailedPushMap :: (PushMap -> PushMap) -> Assistant () +changeFailedPushMap a = do + v <- getAssistant failedPushMap + liftIO $ atomically $ store v . a . fromMaybe M.empty =<< tryTakeTMVar v + where + {- tryTakeTMVar empties the TMVar; refill it only if + - the modified map is not itself empty -} + store v m + | m == M.empty = noop + | otherwise = putTMVar v $! m diff --git a/Assistant/Repair.hs b/Assistant/Repair.hs new file mode 100644 index 0000000000..5e5a28dcec --- /dev/null +++ b/Assistant/Repair.hs @@ -0,0 +1,160 @@ +{- git-annex assistant repository repair + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU AGPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Assistant.Repair where + +import Assistant.Common +import Command.Repair (repairAnnexBranch, trackingOrSyncBranch) +import Git.Fsck (FsckResults, foundBroken) +import Git.Repair (runRepairOf) +import qualified Git +import qualified Remote +import qualified Types.Remote as Remote +import Logs.FsckResults +import Annex.UUID +import Utility.Batch +import Config.Files +import Assistant.Sync +import Assistant.Alert +import Assistant.DaemonStatus +import Assistant.Types.UrlRenderer +#ifdef WITH_WEBAPP +import Assistant.WebApp.Types +import qualified Data.Text as T +#endif +import qualified Utility.Lsof as Lsof +import Utility.ThreadScheduler + +import Control.Concurrent.Async + +{- When the FsckResults require a repair, tries to do a non-destructive + - repair. If that fails, pops up an alert. -} +repairWhenNecessary :: UrlRenderer -> UUID -> Maybe Remote -> FsckResults -> Assistant Bool +repairWhenNecessary urlrenderer u mrmt fsckresults + | foundBroken fsckresults = do + liftAnnex $ writeFsckResults u fsckresults + repodesc <- liftAnnex $ Remote.prettyUUID u + ok <- alertWhile (repairingAlert repodesc) + (runRepair u mrmt False) +#ifdef WITH_WEBAPP + unless ok $ do + button <- mkAlertButton True (T.pack "Click Here") urlrenderer $ + RepairRepositoryR u + void $ addAlert $ brokenRepositoryAlert [button] +#endif + return ok + | otherwise = return False + +runRepair :: UUID -> Maybe Remote -> Bool -> Assistant Bool +runRepair u mrmt destructiverepair = do + fsckresults <- liftAnnex $ readFsckResults u + myu <- liftAnnex getUUID + ok <- if u == myu + then localrepair fsckresults + else remoterepair fsckresults + liftAnnex $ clearFsckResults u + debug [ "Repaired", show u, show ok ] + + return ok + where + localrepair fsckresults = do + -- Stop the watcher from running while running repairs. + changeSyncable Nothing False + + -- This intentionally runs the repair inside the Annex + -- monad, which is not strictly necessary, but keeps + -- other threads that might be trying to use the Annex + -- from running until it completes. + ok <- liftAnnex $ repair fsckresults Nothing + + -- Run a background fast fsck if a destructive repair had + -- to be done, to ensure that the git-annex branch + -- reflects the current state of the repo. + when destructiverepair $ + backgroundfsck [ Param "--fast" ] + + -- Start the watcher running again. This also triggers it to + -- do a startup scan, which is especially important if the + -- git repo repair removed files from the index file. Those + -- files will be seen as new, and re-added to the repository. + when (ok || destructiverepair) $ + changeSyncable Nothing True + + return ok + + remoterepair fsckresults = case Remote.repairRepo =<< mrmt of + Nothing -> return False + Just mkrepair -> do + thisrepopath <- liftIO . absPath + =<< liftAnnex (fromRepo Git.repoPath) + a <- liftAnnex $ mkrepair $ + repair fsckresults (Just thisrepopath) + liftIO $ catchBoolIO a + + repair fsckresults referencerepo = do + (ok, modifiedbranches) <- inRepo $ + runRepairOf fsckresults trackingOrSyncBranch destructiverepair referencerepo + when destructiverepair $ + repairAnnexBranch modifiedbranches + return ok + + backgroundfsck params = liftIO $ void $ async $ do + program <- readProgramFile + batchCommand program (Param "fsck" : params) + +{- Detect when a git lock file exists and has no git process currently + - writing to it. This strongly suggests it is a stale lock file. + - + - However, this could be on a network filesystem. Which is not very safe + - anyway (the assistant relies on being able to check when files have + - no writers to know when to commit them). Also, a few lock-file-ish + - things used by git are not kept open, particularly MERGE_HEAD. + - + - So, just in case, when the lock file appears stale, we delay for one + - minute, and check its size. If the size changed, delay for another + - minute, and so on. This will at work to detect when another machine + - is writing out a new index file, since git does so by writing the + - new content to index.lock. + - + - Returns true if locks were cleaned up. + -} +repairStaleGitLocks :: Git.Repo -> Assistant Bool +repairStaleGitLocks r = do + lockfiles <- liftIO $ filter islock <$> findgitfiles r + repairStaleLocks lockfiles + return $ not $ null lockfiles + where + findgitfiles = dirContentsRecursiveSkipping (== dropTrailingPathSeparator annexDir) True . Git.localGitDir + islock f + | "gc.pid" `isInfixOf` f = False + | ".lock" `isSuffixOf` f = True + | takeFileName f == "MERGE_HEAD" = True + | otherwise = False + +repairStaleLocks :: [FilePath] -> Assistant () +repairStaleLocks lockfiles = go =<< getsizes + where + getsize lf = catchMaybeIO $ + (\s -> (lf, fileSize s)) <$> getFileStatus lf + getsizes = liftIO $ catMaybes <$> mapM getsize lockfiles + go [] = return () + go l = ifM (liftIO $ null <$> Lsof.query ("--" : map fst l)) + ( do + waitforit "to check stale git lock file" + l' <- getsizes + if l' == l + then liftIO $ mapM_ nukeFile (map fst l) + else go l' + , do + waitforit "for git lock file writer" + go =<< getsizes + ) + waitforit why = do + notice ["Waiting for 60 seconds", why] + liftIO $ threadDelaySeconds $ Seconds 60 diff --git a/Assistant/RepoProblem.hs b/Assistant/RepoProblem.hs new file mode 100644 index 0000000000..6913fefc62 --- /dev/null +++ b/Assistant/RepoProblem.hs @@ -0,0 +1,34 @@ +{- git-annex assistant remote problem handling + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Assistant.RepoProblem where + +import Assistant.Common +import Assistant.Types.RepoProblem +import Utility.TList + +import Control.Concurrent.STM + +{- Gets all repositories that have problems. Blocks until there is at + - least one. -} +getRepoProblems :: Assistant [RepoProblem] +getRepoProblems = nubBy sameRepoProblem + <$> (atomically . getTList) <<~ repoProblemChan + +{- Indicates that there was a problem with a repository, and the problem + - appears to not be a transient (eg network connection) problem. + - + - If the problem is able to be repaired, the passed action will be run. + - (However, if multiple problems are reported with a single repository, + - only a single action will be run.) + -} +repoHasProblem :: UUID -> Assistant () -> Assistant () +repoHasProblem u afterrepair = do + rp <- RepoProblem + <$> pure u + <*> asIO afterrepair + (atomically . flip consTList rp) <<~ repoProblemChan diff --git a/Assistant/Restart.hs b/Assistant/Restart.hs new file mode 100644 index 0000000000..2c59a0541a --- /dev/null +++ b/Assistant/Restart.hs @@ -0,0 +1,115 @@ +{- git-annex assistant restarting + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU AGPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Assistant.Restart where + +import Assistant.Common +import Assistant.Threads.Watcher +import Assistant.DaemonStatus +import Assistant.NamedThread +import Utility.ThreadScheduler +import Utility.NotificationBroadcaster +import Utility.Url +import Utility.PID +import qualified Git.Construct +import qualified Git.Config +import Config.Files +import qualified Annex +import qualified Git + +import Control.Concurrent +import System.Process (cwd) +#ifndef mingw32_HOST_OS +import System.Posix (signalProcess, sigTERM) +#else +import Utility.WinProcess +#endif +import Data.Default +import Network.URI + +{- Before the assistant can be restarted, have to remove our + - gitAnnexUrlFile and our gitAnnexPidFile. Pausing the watcher is also + - a good idea, to avoid fighting when two assistants are running in the + - same repo. + -} +prepRestart :: Assistant () +prepRestart = do + liftIO . maybe noop (`throwTo` PauseWatcher) =<< namedThreadId watchThread + liftIO . nukeFile =<< liftAnnex (fromRepo gitAnnexUrlFile) + liftIO . nukeFile =<< liftAnnex (fromRepo gitAnnexPidFile) + +{- To finish a restart, send a global redirect to the new url + - to any web browsers that are displaying the webapp. + - + - Wait for browser to update before terminating this process. -} +postRestart :: URLString -> Assistant () +postRestart url = do + modifyDaemonStatus_ $ \status -> status { globalRedirUrl = Just url } + liftIO . sendNotification . globalRedirNotifier =<< getDaemonStatus + void $ liftIO $ forkIO $ do + threadDelaySeconds (Seconds 120) +#ifndef mingw32_HOST_OS + signalProcess sigTERM =<< getPID +#else + terminatePID =<< getPID +#endif + +runRestart :: Assistant URLString +runRestart = liftIO . newAssistantUrl + =<< liftAnnex (Git.repoLocation <$> Annex.gitRepo) + +{- Starts up the assistant in the repository, and waits for it to create + - a gitAnnexUrlFile. Waits for the assistant to be up and listening for + - connections by testing the url. -} +newAssistantUrl :: FilePath -> IO URLString +newAssistantUrl repo = do + startAssistant repo + geturl + where + geturl = do + r <- Git.Config.read =<< Git.Construct.fromPath repo + waiturl $ gitAnnexUrlFile r + waiturl urlfile = do + v <- tryIO $ readFile urlfile + case v of + Left _ -> delayed $ waiturl urlfile + Right url -> ifM (assistantListening url) + ( return url + , delayed $ waiturl urlfile + ) + delayed a = do + threadDelay 100000 -- 1/10th of a second + a + +{- Checks if the assistant is listening on an url. + - + - Always checks http, because https with self-signed cert is problimatic. + - warp-tls listens to http, in order to show an error page, so this works. + -} +assistantListening :: URLString -> IO Bool +assistantListening url = catchBoolIO $ fst <$> exists url' def + where + url' = case parseURI url of + Nothing -> url + Just uri -> show $ uri + { uriScheme = "http:" + } + +{- Does not wait for assistant to be listening for web connections. + - + - On windows, the assistant does not daemonize, which is why the forkIO is + - done. + -} +startAssistant :: FilePath -> IO () +startAssistant repo = void $ forkIO $ do + program <- readProgramFile + (_, _, _, pid) <- + createProcess $ + (proc program ["assistant"]) { cwd = Just repo } + void $ checkSuccessProcess pid diff --git a/Assistant/ScanRemotes.hs b/Assistant/ScanRemotes.hs new file mode 100644 index 0000000000..2743c0f361 --- /dev/null +++ b/Assistant/ScanRemotes.hs @@ -0,0 +1,41 @@ +{- git-annex assistant remotes needing scanning + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Assistant.ScanRemotes where + +import Assistant.Common +import Assistant.Types.ScanRemotes +import qualified Types.Remote as Remote + +import Data.Function +import Control.Concurrent.STM +import qualified Data.Map as M + +{- Blocks until there is a remote or remotes that need to be scanned. + - + - The list has higher priority remotes listed first. -} +getScanRemote :: Assistant [(Remote, ScanInfo)] +getScanRemote = do + v <- getAssistant scanRemoteMap + liftIO $ atomically $ + reverse . sortBy (compare `on` scanPriority . snd) . M.toList + <$> takeTMVar v + +{- Adds new remotes that need scanning. -} +addScanRemotes :: Bool -> [Remote] -> Assistant () +addScanRemotes _ [] = noop +addScanRemotes full rs = do + v <- getAssistant scanRemoteMap + liftIO $ atomically $ do + m <- fromMaybe M.empty <$> tryTakeTMVar v + putTMVar v $ M.unionWith merge (M.fromList $ zip rs (map info rs)) m + where + info r = ScanInfo (-1 * Remote.cost r) full + merge x y = ScanInfo + { scanPriority = max (scanPriority x) (scanPriority y) + , fullScan = fullScan x || fullScan y + } diff --git a/Assistant/Ssh.hs b/Assistant/Ssh.hs new file mode 100644 index 0000000000..4dd32f7d92 --- /dev/null +++ b/Assistant/Ssh.hs @@ -0,0 +1,352 @@ +{- git-annex assistant ssh utilities + - + - Copyright 2012-2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Assistant.Ssh where + +import Common.Annex +import Utility.Tmp +import Utility.Shell +import Utility.Rsync +import Utility.FileMode +import Utility.SshConfig +import Git.Remote + +import Data.Text (Text) +import qualified Data.Text as T +import Data.Char +import Network.URI + +data SshData = SshData + { sshHostName :: Text + , sshUserName :: Maybe Text + , sshDirectory :: Text + , sshRepoName :: String + , sshPort :: Int + , needsPubKey :: Bool + , sshCapabilities :: [SshServerCapability] + } + deriving (Read, Show, Eq) + +data SshServerCapability = GitAnnexShellCapable | GitCapable | RsyncCapable + deriving (Read, Show, Eq) + +hasCapability :: SshData -> SshServerCapability -> Bool +hasCapability d c = c `elem` sshCapabilities d + +onlyCapability :: SshData -> SshServerCapability -> Bool +onlyCapability d c = all (== c) (sshCapabilities d) + +data SshKeyPair = SshKeyPair + { sshPubKey :: String + , sshPrivKey :: String + } + +instance Show SshKeyPair where + show = sshPubKey + +type SshPubKey = String + +{- ssh -ofoo=bar command-line option -} +sshOpt :: String -> String -> String +sshOpt k v = concat ["-o", k, "=", v] + +{- user@host or host -} +genSshHost :: Text -> Maybe Text -> String +genSshHost host user = maybe "" (\v -> T.unpack v ++ "@") user ++ T.unpack host + +{- Generates a ssh or rsync url from a SshData. -} +genSshUrl :: SshData -> String +genSshUrl sshdata = addtrailingslash $ T.unpack $ T.concat $ + if (onlyCapability sshdata RsyncCapable) + then [u, h, T.pack ":", sshDirectory sshdata] + else [T.pack "ssh://", u, h, d] + where + u = maybe (T.pack "") (\v -> T.concat [v, T.pack "@"]) $ sshUserName sshdata + h = sshHostName sshdata + d + | T.pack "/" `T.isPrefixOf` sshDirectory sshdata = sshDirectory sshdata + | T.pack "~/" `T.isPrefixOf` sshDirectory sshdata = T.concat [T.pack "/", sshDirectory sshdata] + | otherwise = T.concat [T.pack "/~/", sshDirectory sshdata] + addtrailingslash s + | "/" `isSuffixOf` s = s + | otherwise = s ++ "/" + +{- Reverses genSshUrl -} +parseSshUrl :: String -> Maybe SshData +parseSshUrl u + | "ssh://" `isPrefixOf` u = fromssh (drop (length "ssh://") u) + | otherwise = fromrsync u + where + mkdata (userhost, dir) = Just $ SshData + { sshHostName = T.pack host + , sshUserName = if null user then Nothing else Just $ T.pack user + , sshDirectory = T.pack dir + , sshRepoName = genSshRepoName host dir + -- dummy values, cannot determine from url + , sshPort = 22 + , needsPubKey = True + , sshCapabilities = [] + } + where + (user, host) = if '@' `elem` userhost + then separate (== '@') userhost + else ("", userhost) + fromrsync s + | not (rsyncUrlIsShell u) = Nothing + | otherwise = mkdata $ separate (== ':') s + fromssh = mkdata . break (== '/') + +{- Generates a git remote name, like host_dir or host -} +genSshRepoName :: String -> FilePath -> String +genSshRepoName host dir + | null dir = makeLegalName host + | otherwise = makeLegalName $ host ++ "_" ++ dir + +{- The output of ssh, including both stdout and stderr. -} +sshTranscript :: [String] -> (Maybe String) -> IO (String, Bool) +sshTranscript opts input = processTranscript "ssh" opts input + +{- Ensure that the ssh public key doesn't include any ssh options, like + - command=foo, or other weirdness -} +validateSshPubKey :: SshPubKey -> IO () +validateSshPubKey pubkey + | length (lines pubkey) == 1 = + either error return $ check $ words pubkey + | otherwise = error "too many lines in ssh public key" + where + check [prefix, _key, comment] = do + checkprefix prefix + checkcomment comment + check [prefix, _key] = + checkprefix prefix + check _ = err "wrong number of words in ssh public key" + + ok = Right () + err msg = Left $ unwords [msg, pubkey] + + checkprefix prefix + | ssh == "ssh" && all isAlphaNum keytype = ok + | otherwise = err "bad ssh public key prefix" + where + (ssh, keytype) = separate (== '-') prefix + + checkcomment comment = case filter (not . safeincomment) comment of + [] -> ok + badstuff -> err $ "bad comment in ssh public key (contains: \"" ++ badstuff ++ "\")" + safeincomment c = isAlphaNum c || c == '@' || c == '-' || c == '_' || c == '.' + +addAuthorizedKeys :: Bool -> FilePath -> SshPubKey -> IO Bool +addAuthorizedKeys gitannexshellonly dir pubkey = boolSystem "sh" + [ Param "-c" , Param $ addAuthorizedKeysCommand gitannexshellonly dir pubkey ] + +{- Should only be used within the same process that added the line; + - the layout of the line is not kepy stable across versions. -} +removeAuthorizedKeys :: Bool -> FilePath -> SshPubKey -> IO () +removeAuthorizedKeys gitannexshellonly dir pubkey = do + let keyline = authorizedKeysLine gitannexshellonly dir pubkey + sshdir <- sshDir + let keyfile = sshdir "authorized_keys" + ls <- lines <$> readFileStrict keyfile + viaTmp writeSshConfig keyfile $ unlines $ filter (/= keyline) ls + +{- Implemented as a shell command, so it can be run on remote servers over + - ssh. + - + - The ~/.ssh/git-annex-shell wrapper script is created if not already + - present. + -} +addAuthorizedKeysCommand :: Bool -> FilePath -> SshPubKey -> String +addAuthorizedKeysCommand gitannexshellonly dir pubkey = intercalate "&&" + [ "mkdir -p ~/.ssh" + , intercalate "; " + [ "if [ ! -e " ++ wrapper ++ " ]" + , "then (" ++ intercalate ";" (map echoval script) ++ ") > " ++ wrapper + , "fi" + ] + , "chmod 700 " ++ wrapper + , "touch ~/.ssh/authorized_keys" + , "chmod 600 ~/.ssh/authorized_keys" + , unwords + [ "echo" + , shellEscape $ authorizedKeysLine gitannexshellonly dir pubkey + , ">>~/.ssh/authorized_keys" + ] + ] + where + echoval v = "echo " ++ shellEscape v + wrapper = "~/.ssh/git-annex-shell" + script = + [ shebang_portable + , "set -e" + , "if [ \"x$SSH_ORIGINAL_COMMAND\" != \"x\" ]; then" + , runshell "$SSH_ORIGINAL_COMMAND" + , "else" + , runshell "$@" + , "fi" + ] + runshell var = "exec git-annex-shell -c \"" ++ var ++ "\"" + +authorizedKeysLine :: Bool -> FilePath -> SshPubKey -> String +authorizedKeysLine gitannexshellonly dir pubkey + | gitannexshellonly = limitcommand ++ pubkey + {- TODO: Locking down rsync is difficult, requiring a rather + - long perl script. -} + | otherwise = pubkey + where + limitcommand = "command=\"env GIT_ANNEX_SHELL_DIRECTORY="++shellEscape dir++" ~/.ssh/git-annex-shell\",no-agent-forwarding,no-port-forwarding,no-X11-forwarding,no-pty " + +{- Generates a ssh key pair. -} +genSshKeyPair :: IO SshKeyPair +genSshKeyPair = withTmpDir "git-annex-keygen" $ \dir -> do + ok <- boolSystem "ssh-keygen" + [ Param "-P", Param "" -- no password + , Param "-f", File $ dir "key" + ] + unless ok $ + error "ssh-keygen failed" + SshKeyPair + <$> readFile (dir "key.pub") + <*> readFile (dir "key") + +{- Installs a ssh key pair, and sets up ssh config with a mangled hostname + - that will enable use of the key. This way we avoid changing the user's + - regular ssh experience at all. Returns a modified SshData containing the + - mangled hostname. + - + - Note that the key files are put in ~/.ssh/git-annex/, rather than directly + - in ssh because of an **INSANE** behavior of gnome-keyring: It loads + - ~/.ssh/ANYTHING.pub, and uses them indiscriminately. But using this key + - for a normal login to the server will force git-annex-shell to run, + - and locks the user out. Luckily, it does not recurse into subdirectories. + - + - Similarly, IdentitiesOnly is set in the ssh config to prevent the + - ssh-agent from forcing use of a different key. + - + - Force strict host key checking to avoid repeated prompts + - when git-annex and git try to access the remote, if its + - host key has changed. + -} +setupSshKeyPair :: SshKeyPair -> SshData -> IO SshData +setupSshKeyPair sshkeypair sshdata = do + sshdir <- sshDir + createDirectoryIfMissing True $ parentDir $ sshdir sshprivkeyfile + + unlessM (doesFileExist $ sshdir sshprivkeyfile) $ + writeFileProtected (sshdir sshprivkeyfile) (sshPrivKey sshkeypair) + unlessM (doesFileExist $ sshdir sshpubkeyfile) $ + writeFile (sshdir sshpubkeyfile) (sshPubKey sshkeypair) + + setSshConfig sshdata + [ ("IdentityFile", "~/.ssh/" ++ sshprivkeyfile) + , ("IdentitiesOnly", "yes") + , ("StrictHostKeyChecking", "yes") + ] + where + sshprivkeyfile = "git-annex" "key." ++ mangleSshHostName sshdata + sshpubkeyfile = sshprivkeyfile ++ ".pub" + +{- Fixes git-annex ssh key pairs configured in .ssh/config + - by old versions to set IdentitiesOnly. + - + - Strategy: Search for IdentityFile lines with key.git-annex + - in their names. These are for git-annex ssh key pairs. + - Add the IdentitiesOnly line immediately after them, if not already + - present. + -} +fixSshKeyPairIdentitiesOnly :: IO () +fixSshKeyPairIdentitiesOnly = changeUserSshConfig $ unlines . go [] . lines + where + go c [] = reverse c + go c (l:[]) + | all (`isInfixOf` l) indicators = go (fixedline l:l:c) [] + | otherwise = go (l:c) [] + go c (l:next:rest) + | all (`isInfixOf` l) indicators && not ("IdentitiesOnly" `isInfixOf` next) = + go (fixedline l:l:c) (next:rest) + | otherwise = go (l:c) (next:rest) + indicators = ["IdentityFile", "key.git-annex"] + fixedline tmpl = takeWhile isSpace tmpl ++ "IdentitiesOnly yes" + +{- Add StrictHostKeyChecking to any ssh config stanzas that were written + - by git-annex. -} +fixUpSshRemotes :: IO () +fixUpSshRemotes = modifyUserSshConfig (map go) + where + go c@(HostConfig h _) + | "git-annex-" `isPrefixOf` h = fixupconfig c + | otherwise = c + go other = other + + fixupconfig c = case findHostConfigKey c "StrictHostKeyChecking" of + Nothing -> addToHostConfig c "StrictHostKeyChecking" "yes" + Just _ -> c + +{- Setups up a ssh config with a mangled hostname. + - Returns a modified SshData containing the mangled hostname. -} +setSshConfig :: SshData -> [(String, String)] -> IO SshData +setSshConfig sshdata config = do + sshdir <- sshDir + createDirectoryIfMissing True sshdir + let configfile = sshdir "config" + unlessM (catchBoolIO $ isInfixOf mangledhost <$> readFile configfile) $ do + appendFile configfile $ unlines $ + [ "" + , "# Added automatically by git-annex" + , "Host " ++ mangledhost + ] ++ map (\(k, v) -> "\t" ++ k ++ " " ++ v) + (settings ++ config) + setSshConfigMode configfile + + return $ sshdata { sshHostName = T.pack mangledhost } + where + mangledhost = mangleSshHostName sshdata + settings = + [ ("Hostname", T.unpack $ sshHostName sshdata) + , ("Port", show $ sshPort sshdata) + ] + +{- This hostname is specific to a given repository on the ssh host, + - so it is based on the real hostname, the username, and the directory. + - + - The mangled hostname has the form "git-annex-realhostname-username_dir". + - The only use of "-" is to separate the parts shown; this is necessary + - to allow unMangleSshHostName to work. Any unusual characters in the + - username or directory are url encoded, except using "." rather than "%" + - (the latter has special meaning to ssh). + -} +mangleSshHostName :: SshData -> String +mangleSshHostName sshdata = "git-annex-" ++ T.unpack (sshHostName sshdata) + ++ "-" ++ escape extra + where + extra = intercalate "_" $ map T.unpack $ catMaybes + [ sshUserName sshdata + , Just $ sshDirectory sshdata + ] + safe c + | isAlphaNum c = True + | c == '_' = True + | otherwise = False + escape s = replace "%" "." $ escapeURIString safe s + +{- Extracts the real hostname from a mangled ssh hostname. -} +unMangleSshHostName :: String -> String +unMangleSshHostName h = case split "-" h of + ("git":"annex":rest) -> intercalate "-" (beginning rest) + _ -> h + +{- Does ssh have known_hosts data for a hostname? -} +knownHost :: Text -> IO Bool +knownHost hostname = do + sshdir <- sshDir + ifM (doesFileExist $ sshdir "known_hosts") + ( not . null <$> checkhost + , return False + ) + where + {- ssh-keygen -F can crash on some old known_hosts file -} + checkhost = catchDefaultIO "" $ + readProcess "ssh-keygen" ["-F", T.unpack hostname] diff --git a/Assistant/Sync.hs b/Assistant/Sync.hs new file mode 100644 index 0000000000..fc95419ab8 --- /dev/null +++ b/Assistant/Sync.hs @@ -0,0 +1,277 @@ +{- git-annex assistant repo syncing + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Assistant.Sync where + +import Assistant.Common +import Assistant.Pushes +import Assistant.NetMessager +import Assistant.Types.NetMessager +import Assistant.Alert +import Assistant.Alert.Utility +import Assistant.DaemonStatus +import Assistant.ScanRemotes +import qualified Command.Sync +import Utility.Parallel +import qualified Git +import qualified Git.Branch +import qualified Git.Command +import qualified Git.Ref +import qualified Remote +import qualified Types.Remote as Remote +import qualified Remote.List as Remote +import qualified Annex.Branch +import Annex.UUID +import Annex.TaggedPush +import qualified Config +import Git.Config +import Assistant.NamedThread +import Assistant.Threads.Watcher (watchThread, WatcherControl(..)) +import Assistant.TransferSlots +import Assistant.TransferQueue +import Assistant.RepoProblem +import Logs.Transfer + +import Data.Time.Clock +import qualified Data.Map as M +import qualified Data.Set as S +import Control.Concurrent + +{- Syncs with remotes that may have been disconnected for a while. + - + - First gets git in sync, and then prepares any necessary file transfers. + - + - An expensive full scan is queued when the git-annex branches of some of + - the remotes have diverged from the local git-annex branch. Otherwise, + - it's sufficient to requeue failed transfers. + - + - XMPP remotes are also signaled that we can push to them, and we request + - they push to us. Since XMPP pushes run ansynchronously, any scan of the + - XMPP remotes has to be deferred until they're done pushing to us, so + - all XMPP remotes are marked as possibly desynced. + - + - Also handles signaling any connectRemoteNotifiers, after the syncing is + - done. + -} +reconnectRemotes :: Bool -> [Remote] -> Assistant () +reconnectRemotes _ [] = noop +reconnectRemotes notifypushes rs = void $ do + rs' <- liftIO $ filterM (Remote.checkAvailable True) rs + unless (null rs') $ do + modifyDaemonStatus_ $ \s -> s + { desynced = S.union (S.fromList $ map Remote.uuid xmppremotes) (desynced s) } + failedrs <- syncAction rs' (const go) + forM_ failedrs $ \r -> + whenM (liftIO $ Remote.checkAvailable False r) $ + repoHasProblem (Remote.uuid r) (syncRemote r) + mapM_ signal $ filter (`notElem` failedrs) rs' + where + gitremotes = filter (notspecialremote . Remote.repo) rs + (xmppremotes, nonxmppremotes) = partition Remote.isXMPPRemote rs + notspecialremote r + | Git.repoIsUrl r = True + | Git.repoIsLocal r = True + | Git.repoIsLocalUnknown r = True + | otherwise = False + sync (Just branch) = do + (failedpull, diverged) <- manualPull (Just branch) gitremotes + now <- liftIO getCurrentTime + failedpush <- pushToRemotes' now notifypushes gitremotes + return (nub $ failedpull ++ failedpush, diverged) + {- No local branch exists yet, but we can try pulling. -} + sync Nothing = manualPull Nothing gitremotes + go = do + (failed, diverged) <- sync + =<< liftAnnex (inRepo Git.Branch.current) + addScanRemotes diverged $ + filter (not . remoteAnnexIgnore . Remote.gitconfig) + nonxmppremotes + return failed + signal r = liftIO . mapM_ (flip tryPutMVar ()) + =<< fromMaybe [] . M.lookup (Remote.uuid r) . connectRemoteNotifiers + <$> getDaemonStatus + +{- Updates the local sync branch, then pushes it to all remotes, in + - parallel, along with the git-annex branch. This is the same + - as "git annex sync", except in parallel, and will co-exist with use of + - "git annex sync". + - + - After the pushes to normal git remotes, also signals XMPP clients that + - they can request an XMPP push. + - + - Avoids running possibly long-duration commands in the Annex monad, so + - as not to block other threads. + - + - This can fail, when the remote's sync branch (or git-annex branch) has + - been updated by some other remote pushing into it, or by the remote + - itself. To handle failure, a manual pull and merge is done, and the push + - is retried. + - + - When there's a lot of activity, we may fail more than once. + - On the other hand, we may fail because the remote is not available. + - Rather than retrying indefinitely, after the first retry we enter a + - fallback mode, where our push is guarenteed to succeed if the remote is + - reachable. If the fallback fails, the push is queued to be retried + - later. + - + - Returns any remotes that it failed to push to. + -} +pushToRemotes :: Bool -> [Remote] -> Assistant [Remote] +pushToRemotes notifypushes remotes = do + now <- liftIO getCurrentTime + let remotes' = filter (not . remoteAnnexReadOnly . Remote.gitconfig) remotes + syncAction remotes' (pushToRemotes' now notifypushes) +pushToRemotes' :: UTCTime -> Bool -> [Remote] -> Assistant [Remote] +pushToRemotes' now notifypushes remotes = do + (g, branch, u) <- liftAnnex $ do + Annex.Branch.commit "update" + (,,) + <$> gitRepo + <*> inRepo Git.Branch.current + <*> getUUID + let (xmppremotes, normalremotes) = partition Remote.isXMPPRemote remotes + ret <- go True branch g u normalremotes + unless (null xmppremotes) $ do + shas <- liftAnnex $ map fst <$> + inRepo (Git.Ref.matchingWithHEAD + [Annex.Branch.fullname, Git.Ref.headRef]) + forM_ xmppremotes $ \r -> sendNetMessage $ + Pushing (getXMPPClientID r) (CanPush u shas) + return ret + where + go _ Nothing _ _ _ = return [] -- no branch, so nothing to do + go _ _ _ _ [] = return [] -- no remotes, so nothing to do + go shouldretry (Just branch) g u rs = do + debug ["pushing to", show rs] + liftIO $ Command.Sync.updateBranch (Command.Sync.syncBranch branch) g + (succeeded, failed) <- liftIO $ inParallel (push g branch) rs + updatemap succeeded [] + if null failed + then do + when notifypushes $ + sendNetMessage $ NotifyPush $ + map Remote.uuid succeeded + return failed + else if shouldretry + then retry branch g u failed + else fallback branch g u failed + + updatemap succeeded failed = changeFailedPushMap $ \m -> + M.union (makemap failed) $ + M.difference m (makemap succeeded) + makemap l = M.fromList $ zip l (repeat now) + + retry branch g u rs = do + debug ["trying manual pull to resolve failed pushes"] + void $ manualPull (Just branch) rs + go False (Just branch) g u rs + + fallback branch g u rs = do + debug ["fallback pushing to", show rs] + (succeeded, failed) <- liftIO $ + inParallel (\r -> taggedPush u Nothing branch r g) rs + updatemap succeeded failed + when (notifypushes && (not $ null succeeded)) $ + sendNetMessage $ NotifyPush $ + map Remote.uuid succeeded + return failed + + push g branch remote = Command.Sync.pushBranch remote branch g + +{- Displays an alert while running an action that syncs with some remotes, + - and returns any remotes that it failed to sync with. + - + - XMPP remotes are handled specially; since the action can only start + - an async process for them, they are not included in the alert, but are + - still passed to the action. + - + - Readonly remotes are also hidden (to hide the web special remote). + -} +syncAction :: [Remote] -> ([Remote] -> Assistant [Remote]) -> Assistant [Remote] +syncAction rs a + | null visibleremotes = a rs + | otherwise = do + i <- addAlert $ syncAlert visibleremotes + failed <- a rs + let failed' = filter (not . Git.repoIsLocalUnknown . Remote.repo) failed + let succeeded = filter (`notElem` failed) visibleremotes + if null succeeded && null failed' + then removeAlert i + else updateAlertMap $ mergeAlert i $ + syncResultAlert succeeded failed' + return failed + where + visibleremotes = filter (not . Remote.readonly) $ + filter (not . Remote.isXMPPRemote) rs + +{- Manually pull from remotes and merge their branches. Returns any + - remotes that it failed to pull from, and a Bool indicating + - whether the git-annex branches of the remotes and local had + - diverged before the pull. + - + - After pulling from the normal git remotes, requests pushes from any + - XMPP remotes. However, those pushes will run asynchronously, so their + - results are not included in the return data. + -} +manualPull :: Maybe Git.Ref -> [Remote] -> Assistant ([Remote], Bool) +manualPull currentbranch remotes = do + g <- liftAnnex gitRepo + let (xmppremotes, normalremotes) = partition Remote.isXMPPRemote remotes + failed <- liftIO $ forM normalremotes $ \r -> + ifM (Git.Command.runBool [Param "fetch", Param $ Remote.name r] g) + ( return Nothing + , return $ Just r + ) + haddiverged <- liftAnnex Annex.Branch.forceUpdate + forM_ normalremotes $ \r -> + liftAnnex $ Command.Sync.mergeRemote r currentbranch + u <- liftAnnex getUUID + forM_ xmppremotes $ \r -> + sendNetMessage $ Pushing (getXMPPClientID r) (PushRequest u) + return (catMaybes failed, haddiverged) + +{- Start syncing a remote, using a background thread. -} +syncRemote :: Remote -> Assistant () +syncRemote remote = do + updateSyncRemotes + thread <- asIO $ do + reconnectRemotes False [remote] + addScanRemotes True [remote] + void $ liftIO $ forkIO $ thread + +{- Use Nothing to change autocommit setting; or a remote to change + - its sync setting. -} +changeSyncable :: Maybe Remote -> Bool -> Assistant () +changeSyncable Nothing enable = do + liftAnnex $ Config.setConfig key (boolConfig enable) + liftIO . maybe noop (`throwTo` signal) + =<< namedThreadId watchThread + where + key = Config.annexConfig "autocommit" + signal + | enable = ResumeWatcher + | otherwise = PauseWatcher +changeSyncable (Just r) True = do + liftAnnex $ changeSyncFlag r True + syncRemote r +changeSyncable (Just r) False = do + liftAnnex $ changeSyncFlag r False + updateSyncRemotes + {- Stop all transfers to or from this remote. + - XXX Can't stop any ongoing scan, or git syncs. -} + void $ dequeueTransfers tofrom + mapM_ (cancelTransfer False) =<< + filter tofrom . M.keys . currentTransfers <$> getDaemonStatus + where + tofrom t = transferUUID t == Remote.uuid r + +changeSyncFlag :: Remote -> Bool -> Annex () +changeSyncFlag r enabled = do + Config.setConfig key (boolConfig enabled) + void Remote.remoteListRefresh + where + key = Config.remoteConfig (Remote.repo r) "sync" diff --git a/Assistant/Threads/Committer.hs b/Assistant/Threads/Committer.hs new file mode 100644 index 0000000000..cb98b017f7 --- /dev/null +++ b/Assistant/Threads/Committer.hs @@ -0,0 +1,473 @@ +{- git-annex assistant commit thread + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Assistant.Threads.Committer where + +import Assistant.Common +import Assistant.Changes +import Assistant.Types.Changes +import Assistant.Commits +import Assistant.Alert +import Assistant.DaemonStatus +import Assistant.TransferQueue +import Assistant.Drop +import Logs.Transfer +import Logs.Location +import qualified Annex.Queue +import qualified Git.LsFiles +import qualified Command.Add +import Utility.ThreadScheduler +import qualified Utility.Lsof as Lsof +import qualified Utility.DirWatcher as DirWatcher +import Types.KeySource +import Config +import Annex.Exception +import Annex.Content +import Annex.Link +import Annex.CatFile +import qualified Annex +import Utility.InodeCache +import Annex.Content.Direct +import qualified Command.Sync + +import Data.Time.Clock +import Data.Tuple.Utils +import qualified Data.Set as S +import qualified Data.Map as M +import Data.Either +import Control.Concurrent + +{- This thread makes git commits at appropriate times. -} +commitThread :: NamedThread +commitThread = namedThread "Committer" $ do + havelsof <- liftIO $ inPath "lsof" + delayadd <- liftAnnex $ + maybe delayaddDefault (return . Just . Seconds) + =<< annexDelayAdd <$> Annex.getGitConfig + waitChangeTime $ \(changes, time) -> do + readychanges <- handleAdds havelsof delayadd changes + if shouldCommit False time (length readychanges) readychanges + then do + debug + [ "committing" + , show (length readychanges) + , "changes" + ] + void $ alertWhile commitAlert $ + liftAnnex commitStaged + recordCommit + let numchanges = length readychanges + mapM_ checkChangeContent readychanges + return numchanges + else do + refill readychanges + return 0 + +refill :: [Change] -> Assistant () +refill [] = noop +refill cs = do + debug ["delaying commit of", show (length cs), "changes"] + refillChanges cs + +{- Wait for one or more changes to arrive to be committed, and then + - runs an action to commit them. If more changes arrive while this is + - going on, they're handled intelligently, batching up changes into + - large commits where possible, doing rename detection, and + - commiting immediately otherwise. -} +waitChangeTime :: (([Change], UTCTime) -> Assistant Int) -> Assistant () +waitChangeTime a = waitchanges 0 + where + waitchanges lastcommitsize = do + -- Wait one one second as a simple rate limiter. + liftIO $ threadDelaySeconds (Seconds 1) + -- Now, wait until at least one change is available for + -- processing. + cs <- getChanges + handlechanges cs lastcommitsize + handlechanges changes lastcommitsize = do + let len = length changes + -- See if now's a good time to commit. + now <- liftIO getCurrentTime + scanning <- not . scanComplete <$> getDaemonStatus + case (lastcommitsize >= maxCommitSize, shouldCommit scanning now len changes, possiblyrename changes) of + (True, True, _) + | len > maxCommitSize -> + a (changes, now) >>= waitchanges + | otherwise -> aftermaxcommit changes + (_, True, False) -> + a (changes, now) >>= waitchanges + (_, True, True) -> do + morechanges <- getrelatedchanges changes + a (changes ++ morechanges, now) >>= waitchanges + _ -> do + refill changes + waitchanges lastcommitsize + + {- Did we perhaps only get one of the AddChange and RmChange pair + - that make up a file rename? Or some of the pairs that make up + - a directory rename? + -} + possiblyrename = all renamepart + + renamepart (PendingAddChange _ _) = True + renamepart c = isRmChange c + + {- Gets changes related to the passed changes, without blocking + - very long. + - + - If there are multiple RmChanges, this is probably a directory + - rename, in which case it may be necessary to wait longer to get + - all the Changes involved. + -} + getrelatedchanges oldchanges + | length (filter isRmChange oldchanges) > 1 = + concat <$> getbatchchanges [] + | otherwise = do + liftIO humanImperceptibleDelay + getAnyChanges + getbatchchanges cs = do + liftIO $ threadDelay $ fromIntegral $ oneSecond `div` 10 + cs' <- getAnyChanges + if null cs' + then return cs + else getbatchchanges (cs':cs) + + {- The last commit was maximum size, so it's very likely there + - are more changes and we'd like to ensure we make another commit + - of maximum size if possible. + - + - But, it can take a while for the Watcher to wake back up + - after a commit. It can get blocked by another thread + - that is using the Annex state, such as a git-annex branch + - commit. Especially after such a large commit, this can + - take several seconds. When this happens, it defeats the + - normal commit batching, which sees some old changes the + - Watcher found while the commit was being prepared, and sees + - no recent ones, and wants to commit immediately. + - + - All that we need to do, then, is wait for the Watcher to + - wake up, and queue up one more change. + - + - However, it's also possible that we're at the end of changes for + - now. So to avoid waiting a really long time before committing + - those changes we have, poll for up to 30 seconds, and then + - commit them. + - + - Also, try to run something in Annex, to ensure we block + - longer if the Annex state is indeed blocked. + -} + aftermaxcommit oldchanges = loop (30 :: Int) + where + loop 0 = continue oldchanges + loop n = do + liftAnnex noop -- ensure Annex state is free + liftIO $ threadDelaySeconds (Seconds 1) + changes <- getAnyChanges + if null changes + then loop (n - 1) + else continue (oldchanges ++ changes) + continue cs + | null cs = waitchanges 0 + | otherwise = handlechanges cs 0 + +isRmChange :: Change -> Bool +isRmChange (Change { changeInfo = i }) | i == RmChange = True +isRmChange _ = False + +{- An amount of time that is hopefully imperceptably short for humans, + - while long enough for a computer to get some work done. + - Note that 0.001 is a little too short for rename change batching to + - work. -} +humanImperceptibleInterval :: NominalDiffTime +humanImperceptibleInterval = 0.01 + +humanImperceptibleDelay :: IO () +humanImperceptibleDelay = threadDelay $ + truncate $ humanImperceptibleInterval * fromIntegral oneSecond + +maxCommitSize :: Int +maxCommitSize = 5000 + +{- Decide if now is a good time to make a commit. + - Note that the list of changes has an undefined order. + - + - Current strategy: If there have been 10 changes within the past second, + - a batch activity is taking place, so wait for later. + -} +shouldCommit :: Bool -> UTCTime -> Int -> [Change] -> Bool +shouldCommit scanning now len changes + | scanning = len >= maxCommitSize + | len == 0 = False + | len >= maxCommitSize = True + | length recentchanges < 10 = True + | otherwise = False -- batch activity + where + thissecond c = timeDelta c <= 1 + recentchanges = filter thissecond changes + timeDelta c = now `diffUTCTime` changeTime c + +commitStaged :: Annex Bool +commitStaged = do + {- This could fail if there's another commit being made by + - something else. -} + v <- tryAnnex Annex.Queue.flush + case v of + Left _ -> return False + Right _ -> Command.Sync.commitStaged "" + +{- OSX needs a short delay after a file is added before locking it down, + - when using a non-direct mode repository, as pasting a file seems to + - try to set file permissions or otherwise access the file after closing + - it. -} +delayaddDefault :: Annex (Maybe Seconds) +#ifdef darwin_HOST_OS +delayaddDefault = ifM isDirect + ( return Nothing + , return $ Just $ Seconds 1 + ) +#else +delayaddDefault = return Nothing +#endif + +{- If there are PendingAddChanges, or InProcessAddChanges, the files + - have not yet actually been added to the annex, and that has to be done + - now, before committing. + - + - Deferring the adds to this point causes batches to be bundled together, + - which allows faster checking with lsof that the files are not still open + - for write by some other process, and faster checking with git-ls-files + - that the files are not already checked into git. + - + - When a file is added, Inotify will notice the new symlink. So this waits + - for additional Changes to arrive, so that the symlink has hopefully been + - staged before returning, and will be committed immediately. + - + - OTOH, for kqueue, eventsCoalesce, so instead the symlink is directly + - created and staged. + - + - Returns a list of all changes that are ready to be committed. + - Any pending adds that are not ready yet are put back into the ChangeChan, + - where they will be retried later. + -} +handleAdds :: Bool -> Maybe Seconds -> [Change] -> Assistant [Change] +handleAdds havelsof delayadd cs = returnWhen (null incomplete) $ do + let (pending, inprocess) = partition isPendingAddChange incomplete + direct <- liftAnnex isDirect + (pending', cleanup) <- if direct + then return (pending, noop) + else findnew pending + (postponed, toadd) <- partitionEithers <$> safeToAdd havelsof delayadd pending' inprocess + cleanup + + unless (null postponed) $ + refillChanges postponed + + returnWhen (null toadd) $ do + added <- addaction toadd $ + catMaybes <$> if direct + then adddirect toadd + else forM toadd add + if DirWatcher.eventsCoalesce || null added || direct + then return $ added ++ otherchanges + else do + r <- handleAdds havelsof delayadd =<< getChanges + return $ r ++ added ++ otherchanges + where + (incomplete, otherchanges) = partition (\c -> isPendingAddChange c || isInProcessAddChange c) cs + + findnew [] = return ([], noop) + findnew pending@(exemplar:_) = do + (newfiles, cleanup) <- liftAnnex $ + inRepo (Git.LsFiles.notInRepo False $ map changeFile pending) + -- note: timestamp info is lost here + let ts = changeTime exemplar + return (map (PendingAddChange ts) newfiles, void $ liftIO cleanup) + + returnWhen c a + | c = return otherchanges + | otherwise = a + + add :: Change -> Assistant (Maybe Change) + add change@(InProcessAddChange { keySource = ks }) = + catchDefaultIO Nothing <~> doadd + where + doadd = sanitycheck ks $ do + (mkey, mcache) <- liftAnnex $ do + showStart "add" $ keyFilename ks + Command.Add.ingest $ Just ks + maybe (failedingest change) (done change mcache $ keyFilename ks) mkey + add _ = return Nothing + + {- In direct mode, avoid overhead of re-injesting a renamed + - file, by examining the other Changes to see if a removed + - file has the same InodeCache as the new file. If so, + - we can just update bookkeeping, and stage the file in git. + -} + adddirect :: [Change] -> Assistant [Maybe Change] + adddirect toadd = do + ct <- liftAnnex compareInodeCachesWith + m <- liftAnnex $ removedKeysMap ct cs + if M.null m + then forM toadd add + else forM toadd $ \c -> do + mcache <- liftIO $ genInodeCache $ changeFile c + case mcache of + Nothing -> add c + Just cache -> + case M.lookup (inodeCacheToKey ct cache) m of + Nothing -> add c + Just k -> fastadd c k + + fastadd :: Change -> Key -> Assistant (Maybe Change) + fastadd change key = do + let source = keySource change + liftAnnex $ Command.Add.finishIngestDirect key source + done change Nothing (keyFilename source) key + + removedKeysMap :: InodeComparisonType -> [Change] -> Annex (M.Map InodeCacheKey Key) + removedKeysMap ct l = do + mks <- forM (filter isRmChange l) $ \c -> + catKeyFile $ changeFile c + M.fromList . concat <$> mapM mkpairs (catMaybes mks) + where + mkpairs k = map (\c -> (inodeCacheToKey ct c, k)) <$> + recordedInodeCache k + + failedingest change = do + refill [retryChange change] + liftAnnex showEndFail + return Nothing + + done change mcache file key = liftAnnex $ do + logStatus key InfoPresent + link <- ifM isDirect + ( inRepo $ gitAnnexLink file key + , Command.Add.link file key mcache + ) + whenM (pure DirWatcher.eventsCoalesce <||> isDirect) $ + stageSymlink file =<< hashSymlink link + showEndOk + return $ Just $ finishedChange change key + + {- Check that the keysource's keyFilename still exists, + - and is still a hard link to its contentLocation, + - before ingesting it. -} + sanitycheck keysource a = do + fs <- liftIO $ getSymbolicLinkStatus $ keyFilename keysource + ks <- liftIO $ getSymbolicLinkStatus $ contentLocation keysource + if deviceID ks == deviceID fs && fileID ks == fileID fs + then a + else do + -- remove the hard link + when (contentLocation keysource /= keyFilename keysource) $ + void $ liftIO $ tryIO $ removeFile $ contentLocation keysource + return Nothing + + {- Shown an alert while performing an action to add a file or + - files. When only a few files are added, their names are shown + - in the alert. When it's a batch add, the number of files added + - is shown. + - + - Add errors tend to be transient and will be + - automatically dealt with, so the alert is always told + - the add succeeded. + -} + addaction [] a = a + addaction toadd a = alertWhile' (addFileAlert $ map changeFile toadd) $ + (,) + <$> pure True + <*> a + +{- Files can Either be Right to be added now, + - or are unsafe, and must be Left for later. + - + - Check by running lsof on the repository. + -} +safeToAdd :: Bool -> Maybe Seconds -> [Change] -> [Change] -> Assistant [Either Change Change] +safeToAdd _ _ [] [] = return [] +safeToAdd havelsof delayadd pending inprocess = do + maybe noop (liftIO . threadDelaySeconds) delayadd + liftAnnex $ do + keysources <- forM pending $ Command.Add.lockDown . changeFile + let inprocess' = inprocess ++ mapMaybe mkinprocess (zip pending keysources) + openfiles <- if havelsof + then S.fromList . map fst3 . filter openwrite <$> + findopenfiles (map keySource inprocess') + else pure S.empty + let checked = map (check openfiles) inprocess' + + {- If new events are received when files are closed, + - there's no need to retry any changes that cannot + - be done now. -} + if DirWatcher.closingTracked + then do + mapM_ canceladd $ lefts checked + allRight $ rights checked + else return checked + where + check openfiles change@(InProcessAddChange { keySource = ks }) + | S.member (contentLocation ks) openfiles = Left change + check _ change = Right change + + mkinprocess (c, Just ks) = Just InProcessAddChange + { changeTime = changeTime c + , keySource = ks + } + mkinprocess (_, Nothing) = Nothing + + canceladd (InProcessAddChange { keySource = ks }) = do + warning $ keyFilename ks + ++ " still has writers, not adding" + -- remove the hard link + when (contentLocation ks /= keyFilename ks) $ + void $ liftIO $ tryIO $ removeFile $ contentLocation ks + canceladd _ = noop + + openwrite (_file, mode, _pid) + | mode == Lsof.OpenWriteOnly = True + | mode == Lsof.OpenReadWrite = True + | mode == Lsof.OpenUnknown = True + | otherwise = False + + allRight = return . map Right + + {- Normally the KeySources are locked down inside the temp directory, + - so can just lsof that, which is quite efficient. + - + - In crippled filesystem mode, there is no lock down, so must run lsof + - on each individual file. + -} + findopenfiles keysources = ifM crippledFileSystem + ( liftIO $ do + let segments = segmentXargs $ map keyFilename keysources + concat <$> forM segments (\fs -> Lsof.query $ "--" : fs) + , do + tmpdir <- fromRepo gitAnnexTmpMiscDir + liftIO $ Lsof.queryDir tmpdir + ) + +{- After a Change is committed, queue any necessary transfers or drops + - of the content of the key. + - + - This is not done during the startup scan, because the expensive + - transfer scan does the same thing then. + -} +checkChangeContent :: Change -> Assistant () +checkChangeContent change@(Change { changeInfo = i }) = + case changeInfoKey i of + Nothing -> noop + Just k -> whenM (scanComplete <$> getDaemonStatus) $ do + present <- liftAnnex $ inAnnex k + void $ if present + then queueTransfers "new file created" Next k (Just f) Upload + else queueTransfers "new or renamed file wanted" Next k (Just f) Download + handleDrops "file renamed" present k (Just f) Nothing + where + f = changeFile change +checkChangeContent _ = noop diff --git a/Assistant/Threads/ConfigMonitor.hs b/Assistant/Threads/ConfigMonitor.hs new file mode 100644 index 0000000000..d02e53db55 --- /dev/null +++ b/Assistant/Threads/ConfigMonitor.hs @@ -0,0 +1,91 @@ +{- git-annex assistant config monitor thread + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Assistant.Threads.ConfigMonitor where + +import Assistant.Common +import Assistant.BranchChange +import Assistant.DaemonStatus +import Assistant.Commits +import Utility.ThreadScheduler +import Logs +import Logs.UUID +import Logs.Trust +import Logs.PreferredContent +import Logs.Group +import Logs.NumCopies +import Remote.List (remoteListRefresh) +import qualified Git.LsTree as LsTree +import Git.FilePath +import qualified Annex.Branch + +import qualified Data.Set as S + +{- This thread detects when configuration changes have been made to the + - git-annex branch and reloads cached configuration. + - + - If the branch is frequently changing, it's checked for configuration + - changes no more often than once every 60 seconds. On the other hand, + - if the branch has not changed in a while, configuration changes will + - be detected immediately. + -} +configMonitorThread :: NamedThread +configMonitorThread = namedThread "ConfigMonitor" $ loop =<< getConfigs + where + loop old = do + waitBranchChange + new <- getConfigs + when (old /= new) $ do + let changedconfigs = new `S.difference` old + debug $ "reloading config" : + map fst (S.toList changedconfigs) + reloadConfigs new + {- Record a commit to get this config + - change pushed out to remotes. -} + recordCommit + liftIO $ threadDelaySeconds (Seconds 60) + loop new + +{- Config files, and their checksums. -} +type Configs = S.Set (FilePath, String) + +{- All git-annex's config files, and actions to run when they change. -} +configFilesActions :: [(FilePath, Assistant ())] +configFilesActions = + [ (uuidLog, void $ liftAnnex uuidMapLoad) + , (remoteLog, void $ liftAnnex remoteListRefresh) + , (trustLog, void $ liftAnnex trustMapLoad) + , (groupLog, void $ liftAnnex groupMapLoad) + , (numcopiesLog, void $ liftAnnex globalNumCopiesLoad) + , (scheduleLog, void updateScheduleLog) + -- Preferred and required content settings depend on most of the + -- other configs, so will be reloaded whenever any configs change. + , (preferredContentLog, noop) + , (requiredContentLog, noop) + , (groupPreferredContentLog, noop) + ] + +reloadConfigs :: Configs -> Assistant () +reloadConfigs changedconfigs = do + sequence_ as + void $ liftAnnex preferredRequiredMapsLoad + {- Changes to the remote log, or the trust log, can affect the + - syncRemotes list. Changes to the uuid log may affect its + - display so are also included. -} + when (any (`elem` fs) [remoteLog, trustLog, uuidLog]) + updateSyncRemotes + where + (fs, as) = unzip $ filter (flip S.member changedfiles . fst) + configFilesActions + changedfiles = S.map fst changedconfigs + +getConfigs :: Assistant Configs +getConfigs = S.fromList . map extract + <$> liftAnnex (inRepo $ LsTree.lsTreeFiles Annex.Branch.fullname files) + where + files = map fst configFilesActions + extract treeitem = (getTopFilePath $ LsTree.file treeitem, LsTree.sha treeitem) diff --git a/Assistant/Threads/Cronner.hs b/Assistant/Threads/Cronner.hs new file mode 100644 index 0000000000..55b3ca2f10 --- /dev/null +++ b/Assistant/Threads/Cronner.hs @@ -0,0 +1,225 @@ +{- git-annex assistant sceduled jobs runner + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE DeriveDataTypeable #-} + +module Assistant.Threads.Cronner ( + cronnerThread +) where + +import Assistant.Common +import Assistant.DaemonStatus +import Utility.NotificationBroadcaster +import Annex.UUID +import Config.Files +import Logs.Schedule +import Utility.Scheduled +import Types.ScheduledActivity +import Utility.ThreadScheduler +import Utility.HumanTime +import Utility.Batch +import Assistant.TransferQueue +import Annex.Content +import Logs.Transfer +import Assistant.Types.UrlRenderer +import Assistant.Alert +import Remote +import qualified Types.Remote as Remote +import qualified Git +import qualified Git.Fsck +import Assistant.Fsck +import Assistant.Repair + +import Control.Concurrent.Async +import Control.Concurrent.MVar +import Data.Time.LocalTime +import Data.Time.Clock +import qualified Data.Map as M +import qualified Data.Set as S + +{- Loads schedules for this repository, and fires off one thread for each + - scheduled event that runs on this repository. Each thread sleeps until + - its event is scheduled to run. + - + - To handle events that run on remotes, which need to only run when + - their remote gets connected, threads are also started, and are passed + - a MVar to wait on, which is stored in the DaemonStatus's + - connectRemoteNotifiers. + - + - In the meantime the main thread waits for any changes to the + - schedules. When there's a change, compare the old and new list of + - schedules to find deleted and added ones. Start new threads for added + - ones, and kill the threads for deleted ones. -} +cronnerThread :: UrlRenderer -> NamedThread +cronnerThread urlrenderer = namedThreadUnchecked "Cronner" $ do + fsckNudge urlrenderer Nothing + dstatus <- getDaemonStatus + h <- liftIO $ newNotificationHandle False (scheduleLogNotifier dstatus) + go h M.empty M.empty + where + go h amap nmap = do + activities <- liftAnnex $ scheduleGet =<< getUUID + + let addedactivities = activities `S.difference` M.keysSet amap + let removedactivities = M.keysSet amap `S.difference` activities + + forM_ (S.toList removedactivities) $ \activity -> + case M.lookup activity amap of + Just a -> do + debug ["stopping removed job for", fromScheduledActivity activity, show (asyncThreadId a)] + liftIO $ cancel a + Nothing -> noop + + lastruntimes <- liftAnnex getLastRunTimes + started <- startactivities (S.toList addedactivities) lastruntimes + let addedamap = M.fromList $ map fst started + let addednmap = M.fromList $ catMaybes $ map snd started + + let removefiltered = M.filterWithKey (\k _ -> S.member k removedactivities) + let amap' = M.difference (M.union addedamap amap) (removefiltered amap) + let nmap' = M.difference (M.union addednmap nmap) (removefiltered nmap) + modifyDaemonStatus_ $ \s -> s { connectRemoteNotifiers = M.fromListWith (++) (M.elems nmap') } + + liftIO $ waitNotification h + debug ["reloading changed activities"] + go h amap' nmap' + startactivities as lastruntimes = forM as $ \activity -> + case connectActivityUUID activity of + Nothing -> do + runner <- asIO2 (sleepingActivityThread urlrenderer) + a <- liftIO $ async $ + runner activity (M.lookup activity lastruntimes) + return ((activity, a), Nothing) + Just u -> do + mvar <- liftIO newEmptyMVar + runner <- asIO2 (remoteActivityThread urlrenderer mvar) + a <- liftIO $ async $ + runner activity (M.lookup activity lastruntimes) + return ((activity, a), Just (activity, (u, [mvar]))) + +{- Calculate the next time the activity is scheduled to run, then + - sleep until that time, and run it. Then call setLastRunTime, and + - loop. + -} +sleepingActivityThread :: UrlRenderer -> ScheduledActivity -> Maybe LocalTime -> Assistant () +sleepingActivityThread urlrenderer activity lasttime = go lasttime =<< getnexttime lasttime + where + getnexttime = liftIO . nextTime schedule + go _ Nothing = debug ["no scheduled events left for", desc] + go l (Just (NextTimeExactly t)) = waitrun l t Nothing + go l (Just (NextTimeWindow windowstart windowend)) = + waitrun l windowstart (Just windowend) + desc = fromScheduledActivity activity + schedule = getSchedule activity + waitrun l t mmaxt = do + seconds <- liftIO $ secondsUntilLocalTime t + when (seconds > Seconds 0) $ do + debug ["waiting", show seconds, "for next scheduled", desc] + liftIO $ threadDelaySeconds seconds + now <- liftIO getCurrentTime + tz <- liftIO $ getTimeZone now + let nowt = utcToLocalTime tz now + if tolate nowt tz + then do + debug ["too late to run scheduled", desc] + go l =<< getnexttime l + else run nowt + where + tolate nowt tz = case mmaxt of + Just maxt -> nowt > maxt + -- allow the job to start 10 minutes late + Nothing ->diffUTCTime + (localTimeToUTC tz nowt) + (localTimeToUTC tz t) > 600 + run nowt = do + runActivity urlrenderer activity nowt + go (Just nowt) =<< getnexttime (Just nowt) + +{- Wait for the remote to become available by waiting on the MVar. + - Then check if the time is within a time window when activity + - is scheduled to run, and if so run it. + - Otherwise, just wait again on the MVar. + -} +remoteActivityThread :: UrlRenderer -> MVar () -> ScheduledActivity -> Maybe LocalTime -> Assistant () +remoteActivityThread urlrenderer mvar activity lasttime = do + liftIO $ takeMVar mvar + go =<< liftIO (nextTime (getSchedule activity) lasttime) + where + go (Just (NextTimeWindow windowstart windowend)) = do + now <- liftIO getCurrentTime + tz <- liftIO $ getTimeZone now + if now >= localTimeToUTC tz windowstart && now <= localTimeToUTC tz windowend + then do + let nowt = utcToLocalTime tz now + runActivity urlrenderer activity nowt + loop (Just nowt) + else loop lasttime + go _ = noop -- running at exact time not handled here + loop = remoteActivityThread urlrenderer mvar activity + +secondsUntilLocalTime :: LocalTime -> IO Seconds +secondsUntilLocalTime t = do + now <- getCurrentTime + tz <- getTimeZone now + let secs = truncate $ diffUTCTime (localTimeToUTC tz t) now + return $ if secs > 0 + then Seconds secs + else Seconds 0 + +runActivity :: UrlRenderer -> ScheduledActivity -> LocalTime -> Assistant () +runActivity urlrenderer activity nowt = do + debug ["starting", desc] + runActivity' urlrenderer activity + debug ["finished", desc] + liftAnnex $ setLastRunTime activity nowt + where + desc = fromScheduledActivity activity + +runActivity' :: UrlRenderer -> ScheduledActivity -> Assistant () +runActivity' urlrenderer (ScheduledSelfFsck _ d) = do + program <- liftIO $ readProgramFile + g <- liftAnnex gitRepo + fsckresults <- showFscking urlrenderer Nothing $ tryNonAsync $ do + void $ batchCommand program (Param "fsck" : annexFsckParams d) + Git.Fsck.findBroken True g + u <- liftAnnex getUUID + void $ repairWhenNecessary urlrenderer u Nothing fsckresults + mapM_ reget =<< liftAnnex (dirKeys gitAnnexBadDir) + where + reget k = queueTransfers "fsck found bad file; redownloading" Next k Nothing Download +runActivity' urlrenderer (ScheduledRemoteFsck u s d) = handle =<< liftAnnex (remoteFromUUID u) + where + handle Nothing = debug ["skipping remote fsck of uuid without a configured remote", fromUUID u, fromSchedule s] + handle (Just rmt) = void $ case Remote.remoteFsck rmt of + Nothing -> go rmt $ do + program <- readProgramFile + void $ batchCommand program $ + [ Param "fsck" + -- avoid downloading files + , Param "--fast" + , Param "--from" + , Param $ Remote.name rmt + ] ++ annexFsckParams d + Just mkfscker -> do + {- Note that having mkfsker return an IO action + - avoids running a long duration fsck in the + - Annex monad. -} + go rmt =<< liftAnnex (mkfscker (annexFsckParams d)) + go rmt annexfscker = do + fsckresults <- showFscking urlrenderer (Just rmt) $ tryNonAsync $ do + void annexfscker + let r = Remote.repo rmt + if Git.repoIsLocal r && not (Git.repoIsLocalUnknown r) + then Just <$> Git.Fsck.findBroken True r + else pure Nothing + maybe noop (void . repairWhenNecessary urlrenderer u (Just rmt)) fsckresults + +annexFsckParams :: Duration -> [CommandParam] +annexFsckParams d = + [ Param "--incremental-schedule=1d" + , Param $ "--time-limit=" ++ fromDuration d + ] diff --git a/Assistant/Threads/DaemonStatus.hs b/Assistant/Threads/DaemonStatus.hs new file mode 100644 index 0000000000..5bbb15acbe --- /dev/null +++ b/Assistant/Threads/DaemonStatus.hs @@ -0,0 +1,29 @@ +{- git-annex assistant daemon status thread + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Assistant.Threads.DaemonStatus where + +import Assistant.Common +import Assistant.DaemonStatus +import Utility.ThreadScheduler +import Utility.NotificationBroadcaster + +{- This writes the daemon status to disk, when it changes, but no more + - frequently than once every ten minutes. + -} +daemonStatusThread :: NamedThread +daemonStatusThread = namedThread "DaemonStatus" $ do + notifier <- liftIO . newNotificationHandle False + =<< changeNotifier <$> getDaemonStatus + checkpoint + runEvery (Seconds tenMinutes) <~> do + liftIO $ waitNotification notifier + checkpoint + where + checkpoint = do + file <- liftAnnex $ fromRepo gitAnnexDaemonStatusFile + liftIO . writeDaemonStatusFile file =<< getDaemonStatus diff --git a/Assistant/Threads/Glacier.hs b/Assistant/Threads/Glacier.hs new file mode 100644 index 0000000000..4c4012a676 --- /dev/null +++ b/Assistant/Threads/Glacier.hs @@ -0,0 +1,43 @@ +{- git-annex assistant Amazon Glacier retrieval + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} +{-# LANGUAGE OverloadedStrings #-} + +module Assistant.Threads.Glacier where + +import Assistant.Common +import Utility.ThreadScheduler +import qualified Types.Remote as Remote +import qualified Remote.Glacier as Glacier +import Logs.Transfer +import Assistant.DaemonStatus +import Assistant.TransferQueue + +import qualified Data.Set as S + +{- Wakes up every half hour and checks if any glacier remotes have failed + - downloads. If so, runs glacier-cli to check if the files are now + - available, and queues the downloads. -} +glacierThread :: NamedThread +glacierThread = namedThread "Glacier" $ runEvery (Seconds 3600) <~> go + where + isglacier r = Remote.remotetype r == Glacier.remote + go = do + rs <- filter isglacier . syncDataRemotes <$> getDaemonStatus + forM_ rs $ \r -> + check r =<< liftAnnex (getFailedTransfers $ Remote.uuid r) + check _ [] = noop + check r l = do + let keys = map getkey l + (availkeys, failedkeys) <- liftAnnex $ Glacier.jobList r keys + let s = S.fromList (failedkeys ++ availkeys) + let l' = filter (\p -> S.member (getkey p) s) l + forM_ l' $ \(t, info) -> do + liftAnnex $ removeFailedTransfer t + queueTransferWhenSmall "object available from glacier" (associatedFile info) t r + getkey = transferKey . fst diff --git a/Assistant/Threads/Merger.hs b/Assistant/Threads/Merger.hs new file mode 100644 index 0000000000..03bcf0aad2 --- /dev/null +++ b/Assistant/Threads/Merger.hs @@ -0,0 +1,118 @@ +{- git-annex assistant git merge thread + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Assistant.Threads.Merger where + +import Assistant.Common +import Assistant.TransferQueue +import Assistant.BranchChange +import Assistant.DaemonStatus +import Assistant.ScanRemotes +import Utility.DirWatcher +import Utility.DirWatcher.Types +import qualified Annex.Branch +import qualified Git +import qualified Git.Branch +import Annex.AutoMerge +import Annex.TaggedPush +import Remote (remoteFromUUID) + +import qualified Data.Set as S +import qualified Data.Text as T + +{- This thread watches for changes to .git/refs/, and handles incoming + - pushes. -} +mergeThread :: NamedThread +mergeThread = namedThread "Merger" $ do + g <- liftAnnex gitRepo + let dir = Git.localGitDir g "refs" + liftIO $ createDirectoryIfMissing True dir + let hook a = Just <$> asIO2 (runHandler a) + changehook <- hook onChange + errhook <- hook onErr + let hooks = mkWatchHooks + { addHook = changehook + , modifyHook = changehook + , errHook = errhook + } + void $ liftIO $ watchDir dir (const False) True hooks id + debug ["watching", dir] + +type Handler = FilePath -> Assistant () + +{- Runs an action handler. + - + - Exceptions are ignored, otherwise a whole thread could be crashed. + -} +runHandler :: Handler -> FilePath -> Maybe FileStatus -> Assistant () +runHandler handler file _filestatus = + either (liftIO . print) (const noop) =<< tryIO <~> handler file + +{- Called when there's an error with inotify. -} +onErr :: Handler +onErr = error + +{- Called when a new branch ref is written, or a branch ref is modified. + - + - At startup, synthetic add events fire, causing this to run, but that's + - ok; it ensures that any changes pushed since the last time the assistant + - ran are merged in. + -} +onChange :: Handler +onChange file + | ".lock" `isSuffixOf` file = noop + | isAnnexBranch file = do + branchChanged + diverged <- liftAnnex Annex.Branch.forceUpdate + when diverged $ + unlessM handleDesynced $ + queueDeferredDownloads "retrying deferred download" Later + | "/synced/" `isInfixOf` file = + mergecurrent =<< liftAnnex (inRepo Git.Branch.current) + | otherwise = noop + where + changedbranch = fileToBranch file + + mergecurrent (Just current) + | equivBranches changedbranch current = do + debug + [ "merging", Git.fromRef changedbranch + , "into", Git.fromRef current + ] + void $ liftAnnex $ autoMergeFrom changedbranch (Just current) + mergecurrent _ = noop + + handleDesynced = case fromTaggedBranch changedbranch of + Nothing -> return False + Just (u, info) -> do + mr <- liftAnnex $ remoteFromUUID u + case mr of + Nothing -> return False + Just r -> do + s <- desynced <$> getDaemonStatus + if S.member u s || Just (T.unpack $ getXMPPClientID r) == info + then do + modifyDaemonStatus_ $ \st -> st + { desynced = S.delete u s } + addScanRemotes True [r] + return True + else return False + +equivBranches :: Git.Ref -> Git.Ref -> Bool +equivBranches x y = base x == base y + where + base = takeFileName . Git.fromRef + +isAnnexBranch :: FilePath -> Bool +isAnnexBranch f = n `isSuffixOf` f + where + n = '/' : Git.fromRef Annex.Branch.name + +fileToBranch :: FilePath -> Git.Ref +fileToBranch f = Git.Ref $ "refs" base + where + base = Prelude.last $ split "/refs/" f diff --git a/Assistant/Threads/MountWatcher.hs b/Assistant/Threads/MountWatcher.hs new file mode 100644 index 0000000000..39ae67537f --- /dev/null +++ b/Assistant/Threads/MountWatcher.hs @@ -0,0 +1,195 @@ +{- git-annex assistant mount watcher, using either dbus or mtab polling + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} +{-# LANGUAGE OverloadedStrings #-} + +module Assistant.Threads.MountWatcher where + +import Assistant.Common +import Assistant.DaemonStatus +import Assistant.Sync +import qualified Annex +import qualified Git +import Utility.ThreadScheduler +import Utility.Mounts +import Remote.List +import qualified Types.Remote as Remote +import Assistant.Types.UrlRenderer +import Assistant.Fsck + +import qualified Data.Set as S + +#if WITH_DBUS +import Utility.DBus +import DBus.Client +import DBus +import Data.Word (Word32) +import Control.Concurrent +import qualified Control.Exception as E +#else +#warning Building without dbus support; will use mtab polling +#endif + +mountWatcherThread :: UrlRenderer -> NamedThread +mountWatcherThread urlrenderer = namedThread "MountWatcher" $ +#if WITH_DBUS + dbusThread urlrenderer +#else + pollingThread urlrenderer +#endif + +#if WITH_DBUS + +dbusThread :: UrlRenderer -> Assistant () +dbusThread urlrenderer = do + runclient <- asIO1 go + r <- liftIO $ E.try $ runClient getSessionAddress runclient + either onerr (const noop) r + where + go client = ifM (checkMountMonitor client) + ( do + {- Store the current mount points in an MVar, to be + - compared later. We could in theory work out the + - mount point from the dbus message, but this is + - easier. -} + mvar <- liftIO $ newMVar =<< currentMountPoints + handleevent <- asIO1 $ \_event -> do + nowmounted <- liftIO $ currentMountPoints + wasmounted <- liftIO $ swapMVar mvar nowmounted + handleMounts urlrenderer wasmounted nowmounted + liftIO $ forM_ mountChanged $ \matcher -> + listen client matcher handleevent + , do + liftAnnex $ + warning "No known volume monitor available through dbus; falling back to mtab polling" + pollingThread urlrenderer + ) + onerr :: E.SomeException -> Assistant () + onerr e = do + {- If the session dbus fails, the user probably + - logged out of their desktop. Even if they log + - back in, we won't have access to the dbus + - session key, so polling is the best that can be + - done in this situation. -} + liftAnnex $ + warning $ "dbus failed; falling back to mtab polling (" ++ show e ++ ")" + pollingThread urlrenderer + +{- Examine the list of services connected to dbus, to see if there + - are any we can use to monitor mounts. If not, will attempt to start one. -} +checkMountMonitor :: Client -> Assistant Bool +checkMountMonitor client = do + running <- filter (`elem` usableservices) + <$> liftIO (listServiceNames client) + case running of + [] -> startOneService client startableservices + (service:_) -> do + debug [ "Using running DBUS service" + , service + , "to monitor mount events." + ] + return True + where + startableservices = [gvfs, gvfsgdu] + usableservices = startableservices ++ [kde] + gvfs = "org.gtk.Private.UDisks2VolumeMonitor" + gvfsgdu = "org.gtk.Private.GduVolumeMonitor" + kde = "org.kde.DeviceNotifications" + +startOneService :: Client -> [ServiceName] -> Assistant Bool +startOneService _ [] = return False +startOneService client (x:xs) = do + _ <- liftIO $ tryNonAsync $ callDBus client "StartServiceByName" + [toVariant x, toVariant (0 :: Word32)] + ifM (liftIO $ elem x <$> listServiceNames client) + ( do + debug + [ "Started DBUS service", x + , "to monitor mount events." + ] + return True + , startOneService client xs + ) + +{- Filter matching events recieved when drives are mounted and unmounted. -} +mountChanged :: [MatchRule] +mountChanged = [gvfs True, gvfs False, kde, kdefallback] + where + {- gvfs reliably generates this event whenever a + - drive is mounted/unmounted, whether automatically, or manually -} + gvfs mount = matchAny + { matchInterface = Just "org.gtk.Private.RemoteVolumeMonitor" + , matchMember = Just $ if mount then "MountAdded" else "MountRemoved" + } + {- This event fires when KDE prompts the user what to do with a drive, + - but maybe not at other times. And it's not received -} + kde = matchAny + { matchInterface = Just "org.kde.Solid.Device" + , matchMember = Just "setupDone" + } + {- This event may not be closely related to mounting a drive, but it's + - observed reliably when a drive gets mounted or unmounted. -} + kdefallback = matchAny + { matchInterface = Just "org.kde.KDirNotify" + , matchMember = Just "enteredDirectory" + } + +#endif + +pollingThread :: UrlRenderer -> Assistant () +pollingThread urlrenderer = go =<< liftIO currentMountPoints + where + go wasmounted = do + liftIO $ threadDelaySeconds (Seconds 10) + nowmounted <- liftIO currentMountPoints + handleMounts urlrenderer wasmounted nowmounted + go nowmounted + +handleMounts :: UrlRenderer -> MountPoints -> MountPoints -> Assistant () +handleMounts urlrenderer wasmounted nowmounted = + mapM_ (handleMount urlrenderer . mnt_dir) $ + S.toList $ newMountPoints wasmounted nowmounted + +handleMount :: UrlRenderer -> FilePath -> Assistant () +handleMount urlrenderer dir = do + debug ["detected mount of", dir] + rs <- filter (Git.repoIsLocal . Remote.repo) <$> remotesUnder dir + mapM_ (fsckNudge urlrenderer . Just) rs + reconnectRemotes True rs + +{- Finds remotes located underneath the mount point. + - + - Updates state to include the remotes. + - + - The config of git remotes is re-read, as it may not have been available + - at startup time, or may have changed (it could even be a different + - repository at the same remote location..) + -} +remotesUnder :: FilePath -> Assistant [Remote] +remotesUnder dir = do + repotop <- liftAnnex $ fromRepo Git.repoPath + rs <- liftAnnex remoteList + pairs <- liftAnnex $ mapM (checkremote repotop) rs + let (waschanged, rs') = unzip pairs + when (or waschanged) $ do + liftAnnex $ Annex.changeState $ \s -> s { Annex.remotes = catMaybes rs' } + updateSyncRemotes + return $ mapMaybe snd $ filter fst pairs + where + checkremote repotop r = case Remote.localpath r of + Just p | dirContains dir (absPathFrom repotop p) -> + (,) <$> pure True <*> updateRemote r + _ -> return (False, Just r) + +type MountPoints = S.Set Mntent + +currentMountPoints :: IO MountPoints +currentMountPoints = S.fromList <$> getMounts + +newMountPoints :: MountPoints -> MountPoints -> MountPoints +newMountPoints old new = S.difference new old diff --git a/Assistant/Threads/NetWatcher.hs b/Assistant/Threads/NetWatcher.hs new file mode 100644 index 0000000000..0b009647c1 --- /dev/null +++ b/Assistant/Threads/NetWatcher.hs @@ -0,0 +1,140 @@ +{- git-annex assistant network connection watcher, using dbus + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} +{-# LANGUAGE OverloadedStrings #-} + +module Assistant.Threads.NetWatcher where + +import Assistant.Common +import Assistant.Sync +import Utility.ThreadScheduler +import qualified Types.Remote as Remote +import Assistant.DaemonStatus +import Utility.NotificationBroadcaster + +#if WITH_DBUS +import Utility.DBus +import DBus.Client +import DBus +import Data.Word (Word32) +import Assistant.NetMessager +#else +#ifdef linux_HOST_OS +#warning Building without dbus support; will poll for network connection changes +#endif +#endif + +netWatcherThread :: NamedThread +#if WITH_DBUS +netWatcherThread = thread dbusThread +#else +netWatcherThread = thread noop +#endif + where + thread = namedThread "NetWatcher" + +{- This is a fallback for when dbus cannot be used to detect + - network connection changes, but it also ensures that + - any networked remotes that may have not been routable for a + - while (despite the local network staying up), are synced with + - periodically. + - + - Note that it does not call notifyNetMessagerRestart, because + - it doesn't know that the network has changed. + -} +netWatcherFallbackThread :: NamedThread +netWatcherFallbackThread = namedThread "NetWatcherFallback" $ + runEvery (Seconds 3600) <~> handleConnection + +#if WITH_DBUS + +dbusThread :: Assistant () +dbusThread = do + handleerr <- asIO2 onerr + runclient <- asIO1 go + liftIO $ persistentClient getSystemAddress () handleerr runclient + where + go client = ifM (checkNetMonitor client) + ( do + listenNMConnections client <~> handleconn + listenWicdConnections client <~> handleconn + , do + liftAnnex $ + warning "No known network monitor available through dbus; falling back to polling" + ) + handleconn = do + debug ["detected network connection"] + notifyNetMessagerRestart + handleConnection + onerr e _ = do + liftAnnex $ + warning $ "lost dbus connection; falling back to polling (" ++ show e ++ ")" + {- Wait, in hope that dbus will come back -} + liftIO $ threadDelaySeconds (Seconds 60) + +{- Examine the list of services connected to dbus, to see if there + - are any we can use to monitor network connections. -} +checkNetMonitor :: Client -> Assistant Bool +checkNetMonitor client = do + running <- liftIO $ filter (`elem` [networkmanager, wicd]) + <$> listServiceNames client + case running of + [] -> return False + (service:_) -> do + debug [ "Using running DBUS service" + , service + , "to monitor network connection events." + ] + return True + where + networkmanager = "org.freedesktop.NetworkManager" + wicd = "org.wicd.daemon" + +{- Listens for new NetworkManager connections. -} +listenNMConnections :: Client -> IO () -> IO () +listenNMConnections client callback = + listen client matcher $ \event -> + when (Just True == anyM activeconnection (signalBody event)) $ + callback + where + matcher = matchAny + { matchInterface = Just "org.freedesktop.NetworkManager.Connection.Active" + , matchMember = Just "PropertiesChanged" + } + nm_connection_activated = toVariant (2 :: Word32) + nm_state_key = toVariant ("State" :: String) + activeconnection v = do + m <- fromVariant v + vstate <- lookup nm_state_key $ dictionaryItems m + state <- fromVariant vstate + return $ state == nm_connection_activated + +{- Listens for new Wicd connections. -} +listenWicdConnections :: Client -> IO () -> IO () +listenWicdConnections client callback = + listen client matcher $ \event -> + when (any (== wicd_success) (signalBody event)) $ + callback + where + matcher = matchAny + { matchInterface = Just "org.wicd.daemon" + , matchMember = Just "ConnectResultsSent" + } + wicd_success = toVariant ("success" :: String) + +#endif + +handleConnection :: Assistant () +handleConnection = do + liftIO . sendNotification . networkConnectedNotifier =<< getDaemonStatus + reconnectRemotes True =<< networkRemotes + +{- Network remotes to sync with. -} +networkRemotes :: Assistant [Remote] +networkRemotes = filter (isNothing . Remote.localpath) . syncRemotes + <$> getDaemonStatus diff --git a/Assistant/Threads/PairListener.hs b/Assistant/Threads/PairListener.hs new file mode 100644 index 0000000000..cd95ab5a43 --- /dev/null +++ b/Assistant/Threads/PairListener.hs @@ -0,0 +1,160 @@ +{- git-annex assistant thread to listen for incoming pairing traffic + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Assistant.Threads.PairListener where + +import Assistant.Common +import Assistant.Pairing +import Assistant.Pairing.Network +import Assistant.Pairing.MakeRemote +import Assistant.WebApp (UrlRenderer) +import Assistant.WebApp.Types +import Assistant.Alert +import Assistant.DaemonStatus +import Utility.ThreadScheduler +import Utility.Format +import Git + +import Network.Multicast +import Network.Socket +import qualified Data.Text as T +import Data.Char + +pairListenerThread :: UrlRenderer -> NamedThread +pairListenerThread urlrenderer = namedThread "PairListener" $ do + listener <- asIO1 $ go [] [] + liftIO $ withSocketsDo $ + runEvery (Seconds 60) $ void $ tryIO $ + listener =<< getsock + where + {- Note this can crash if there's no network interface, + - or only one like lo that doesn't support multicast. -} + getsock = multicastReceiver (multicastAddress $ IPv4Addr undefined) pairingPort + + go reqs cache sock = liftIO (getmsg sock []) >>= \msg -> case readish msg of + Nothing -> go reqs cache sock + Just m -> do + debug ["received", show msg] + sane <- checkSane msg + (pip, verified) <- verificationCheck m + =<< (pairingInProgress <$> getDaemonStatus) + let wrongstage = maybe False (\p -> pairMsgStage m <= inProgressPairStage p) pip + let fromus = maybe False (\p -> remoteSshPubKey (pairMsgData m) == remoteSshPubKey (inProgressPairData p)) pip + case (wrongstage, fromus, sane, pairMsgStage m) of + (_, True, _, _) -> do + debug ["ignoring message that looped back"] + go reqs cache sock + (_, _, False, _) -> go reqs cache sock + -- PairReq starts a pairing process, so a + -- new one is always heeded, even if + -- some other pairing is in process. + (_, _, _, PairReq) -> if m `elem` reqs + then go reqs (invalidateCache m cache) sock + else do + pairReqReceived verified urlrenderer m + go (m:take 10 reqs) (invalidateCache m cache) sock + (True, _, _, _) -> do + debug + ["ignoring out of order message" + , show (pairMsgStage m) + , "expected" + , show (succ . inProgressPairStage <$> pip) + ] + go reqs cache sock + (_, _, _, PairAck) -> do + cache' <- pairAckReceived verified pip m cache + go reqs cache' sock + (_,_ , _, PairDone) -> do + pairDoneReceived verified pip m + go reqs cache sock + + {- As well as verifying the message using the shared secret, + - check its UUID against the UUID we have stored. If + - they're the same, someone is sending bogus messages, + - which could be an attempt to brute force the shared secret. -} + verificationCheck _ Nothing = return (Nothing, False) + verificationCheck m (Just pip) + | not verified && sameuuid = do + liftAnnex $ warning + "detected possible pairing brute force attempt; disabled pairing" + stopSending pip + return (Nothing, False) + |otherwise = return (Just pip, verified && sameuuid) + where + verified = verifiedPairMsg m pip + sameuuid = pairUUID (inProgressPairData pip) == pairUUID (pairMsgData m) + + checkSane msg + {- Control characters could be used in a + - console poisoning attack. -} + | any isControl (filter (/= '\n') (decode_c msg)) = do + liftAnnex $ warning + "illegal control characters in pairing message; ignoring" + return False + | otherwise = return True + + {- PairReqs invalidate the cache of recently finished pairings. + - This is so that, if a new pairing is started with the + - same secret used before, a bogus PairDone is not sent. -} + invalidateCache msg = filter (not . verifiedPairMsg msg) + + getmsg sock c = do + (msg, n, _) <- recvFrom sock chunksz + if n < chunksz + then return $ c ++ msg + else getmsg sock $ c ++ msg + where + chunksz = 1024 + +{- Show an alert when a PairReq is seen. -} +pairReqReceived :: Bool -> UrlRenderer -> PairMsg -> Assistant () +pairReqReceived True _ _ = noop -- ignore our own PairReq +pairReqReceived False urlrenderer msg = do + button <- mkAlertButton True (T.pack "Respond") urlrenderer (FinishLocalPairR msg) + void $ addAlert $ pairRequestReceivedAlert repo button + where + repo = pairRepo msg + +{- When a verified PairAck is seen, a host is ready to pair with us, and has + - already configured our ssh key. Stop sending PairReqs, finish the pairing, + - and send a single PairDone. -} +pairAckReceived :: Bool -> Maybe PairingInProgress -> PairMsg -> [PairingInProgress] -> Assistant [PairingInProgress] +pairAckReceived True (Just pip) msg cache = do + stopSending pip + repodir <- repoPath <$> liftAnnex gitRepo + liftIO $ setupAuthorizedKeys msg repodir + finishedLocalPairing msg (inProgressSshKeyPair pip) + startSending pip PairDone $ multicastPairMsg + (Just 1) (inProgressSecret pip) (inProgressPairData pip) + return $ pip : take 10 cache +{- A stale PairAck might also be seen, after we've finished pairing. + - Perhaps our PairDone was not received. To handle this, we keep + - a cache of recently finished pairings, and re-send PairDone in + - response to stale PairAcks for them. -} +pairAckReceived _ _ msg cache = do + let pips = filter (verifiedPairMsg msg) cache + unless (null pips) $ + forM_ pips $ \pip -> + startSending pip PairDone $ multicastPairMsg + (Just 1) (inProgressSecret pip) (inProgressPairData pip) + return cache + +{- If we get a verified PairDone, the host has accepted our PairAck, and + - has paired with us. Stop sending PairAcks, and finish pairing with them. + - + - TODO: Should third-party hosts remove their pair request alert when they + - see a PairDone? + - Complication: The user could have already clicked on the alert and be + - entering the secret. Would be better to start a fresh pair request in this + - situation. + -} +pairDoneReceived :: Bool -> Maybe PairingInProgress -> PairMsg -> Assistant () +pairDoneReceived False _ _ = noop -- not verified +pairDoneReceived True Nothing _ = noop -- not in progress +pairDoneReceived True (Just pip) msg = do + stopSending pip + finishedLocalPairing msg (inProgressSshKeyPair pip) diff --git a/Assistant/Threads/ProblemFixer.hs b/Assistant/Threads/ProblemFixer.hs new file mode 100644 index 0000000000..8095581a69 --- /dev/null +++ b/Assistant/Threads/ProblemFixer.hs @@ -0,0 +1,70 @@ +{- git-annex assistant thread to handle fixing problems with repositories + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Assistant.Threads.ProblemFixer ( + problemFixerThread +) where + +import Assistant.Common +import Assistant.Types.RepoProblem +import Assistant.RepoProblem +import Assistant.Types.UrlRenderer +import Assistant.Alert +import Remote +import qualified Types.Remote as Remote +import qualified Git.Fsck +import Assistant.Repair +import qualified Git +import Annex.UUID +import Utility.ThreadScheduler + +{- Waits for problems with a repo, and tries to fsck the repo and repair + - the problem. -} +problemFixerThread :: UrlRenderer -> NamedThread +problemFixerThread urlrenderer = namedThread "ProblemFixer" $ + go =<< getRepoProblems + where + go problems = do + mapM_ (handleProblem urlrenderer) problems + liftIO $ threadDelaySeconds (Seconds 60) + -- Problems may have been re-reported while they were being + -- fixed, so ignore those. If a new unique problem happened + -- 60 seconds after the last was fixed, we're unlikely + -- to do much good anyway. + go =<< filter (\p -> not (any (sameRepoProblem p) problems)) + <$> getRepoProblems + +handleProblem :: UrlRenderer -> RepoProblem -> Assistant () +handleProblem urlrenderer repoproblem = do + fixed <- ifM ((==) (problemUUID repoproblem) <$> liftAnnex getUUID) + ( handleLocalRepoProblem urlrenderer + , maybe (return False) (handleRemoteProblem urlrenderer) + =<< liftAnnex (remoteFromUUID $ problemUUID repoproblem) + ) + when fixed $ + liftIO $ afterFix repoproblem + +handleRemoteProblem :: UrlRenderer -> Remote -> Assistant Bool +handleRemoteProblem urlrenderer rmt + | Git.repoIsLocal r && not (Git.repoIsLocalUnknown r) = + ifM (liftIO $ checkAvailable True rmt) + ( do + fixedlocks <- repairStaleGitLocks r + fsckresults <- showFscking urlrenderer (Just rmt) $ tryNonAsync $ + Git.Fsck.findBroken True r + repaired <- repairWhenNecessary urlrenderer (Remote.uuid rmt) (Just rmt) fsckresults + return $ fixedlocks || repaired + , return False + ) + | otherwise = return False + where + r = Remote.repo rmt + +{- This is not yet used, and should probably do a fsck. -} +handleLocalRepoProblem :: UrlRenderer -> Assistant Bool +handleLocalRepoProblem _urlrenderer = do + repairStaleGitLocks =<< liftAnnex gitRepo diff --git a/Assistant/Threads/Pusher.hs b/Assistant/Threads/Pusher.hs new file mode 100644 index 0000000000..3ec922fe48 --- /dev/null +++ b/Assistant/Threads/Pusher.hs @@ -0,0 +1,49 @@ +{- git-annex assistant git pushing thread + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Assistant.Threads.Pusher where + +import Assistant.Common +import Assistant.Commits +import Assistant.Pushes +import Assistant.DaemonStatus +import Assistant.Sync +import Utility.ThreadScheduler +import qualified Remote +import qualified Types.Remote as Remote + +{- This thread retries pushes that failed before. -} +pushRetryThread :: NamedThread +pushRetryThread = namedThread "PushRetrier" $ runEvery (Seconds halfhour) <~> do + -- We already waited half an hour, now wait until there are failed + -- pushes to retry. + topush <- getFailedPushesBefore (fromIntegral halfhour) + unless (null topush) $ do + debug ["retrying", show (length topush), "failed pushes"] + void $ pushToRemotes True topush + where + halfhour = 1800 + +{- This thread pushes git commits out to remotes soon after they are made. -} +pushThread :: NamedThread +pushThread = namedThread "Pusher" $ runEvery (Seconds 2) <~> do + -- We already waited two seconds as a simple rate limiter. + -- Next, wait until at least one commit has been made + void getCommits + -- Now see if now's a good time to push. + void $ pushToRemotes True =<< pushTargets + +{- We want to avoid pushing to remotes that are marked readonly. + - + - Also, avoid pushing to local remotes we can easily tell are not available, + - to avoid ugly messages when a removable drive is not attached. + -} +pushTargets :: Assistant [Remote] +pushTargets = liftIO . filterM (Remote.checkAvailable True) + =<< candidates <$> getDaemonStatus + where + candidates = filter (not . Remote.readonly) . syncGitRemotes diff --git a/Assistant/Threads/SanityChecker.hs b/Assistant/Threads/SanityChecker.hs new file mode 100644 index 0000000000..d7a71d4770 --- /dev/null +++ b/Assistant/Threads/SanityChecker.hs @@ -0,0 +1,260 @@ +{- git-annex assistant sanity checker + - + - Copyright 2012, 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Assistant.Threads.SanityChecker ( + sanityCheckerStartupThread, + sanityCheckerDailyThread, + sanityCheckerHourlyThread +) where + +import Assistant.Common +import Assistant.DaemonStatus +import Assistant.Alert +import Assistant.Repair +import Assistant.Drop +import Assistant.Ssh +import Assistant.TransferQueue +import Assistant.Types.UrlRenderer +import qualified Annex.Branch +import qualified Git.LsFiles +import qualified Git.Command +import qualified Git.Config +import Utility.ThreadScheduler +import qualified Assistant.Threads.Watcher as Watcher +import Utility.Batch +import Utility.NotificationBroadcaster +import Config +import Utility.HumanTime +import Utility.Tense +import Git.Repair +import Git.Index +import Assistant.Unused +import Logs.Unused +import Logs.Transfer +import Config.Files +import Utility.DiskFree +import qualified Annex +#ifdef WITH_WEBAPP +import Assistant.WebApp.Types +#endif +#ifndef mingw32_HOST_OS +import Utility.LogFile +#endif + +import Data.Time.Clock.POSIX +import qualified Data.Text as T + +{- This thread runs once at startup, and most other threads wait for it + - to finish. (However, the webapp thread does not, to prevent the UI + - being nonresponsive.) -} +sanityCheckerStartupThread :: Maybe Duration -> NamedThread +sanityCheckerStartupThread startupdelay = namedThreadUnchecked "SanityCheckerStartup" $ do + {- Stale git locks can prevent commits from happening, etc. -} + void $ repairStaleGitLocks =<< liftAnnex gitRepo + + {- A corrupt index file can prevent the assistant from working at + - all, so detect and repair. -} + ifM (not <$> liftAnnex (inRepo checkIndexFast)) + ( do + notice ["corrupt index file found at startup; removing and restaging"] + liftAnnex $ inRepo $ nukeFile . indexFile + {- Normally the startup scan avoids re-staging files, + - but with the index deleted, everything needs to be + - restaged. -} + modifyDaemonStatus_ $ \s -> s { forceRestage = True } + , whenM (liftAnnex $ inRepo missingIndex) $ do + debug ["no index file; restaging"] + modifyDaemonStatus_ $ \s -> s { forceRestage = True } + ) + {- If the git-annex index file is corrupt, it's ok to remove it; + - the data from the git-annex branch will be used, and the index + - will be automatically regenerated. -} + unlessM (liftAnnex $ Annex.Branch.withIndex $ inRepo $ Git.Repair.checkIndexFast) $ do + notice ["corrupt annex/index file found at startup; removing"] + liftAnnex $ liftIO . nukeFile =<< fromRepo gitAnnexIndex + + {- Fix up ssh remotes set up by past versions of the assistant. -} + liftIO $ fixUpSshRemotes + + {- If there's a startup delay, it's done here. -} + liftIO $ maybe noop (threadDelaySeconds . Seconds . fromIntegral . durationSeconds) startupdelay + + {- Notify other threads that the startup sanity check is done. -} + status <- getDaemonStatus + liftIO $ sendNotification $ startupSanityCheckNotifier status + +{- This thread wakes up hourly for inxepensive frequent sanity checks. -} +sanityCheckerHourlyThread :: NamedThread +sanityCheckerHourlyThread = namedThread "SanityCheckerHourly" $ forever $ do + liftIO $ threadDelaySeconds $ Seconds oneHour + hourlyCheck + +{- This thread wakes up daily to make sure the tree is in good shape. -} +sanityCheckerDailyThread :: UrlRenderer -> NamedThread +sanityCheckerDailyThread urlrenderer = namedThread "SanityCheckerDaily" $ forever $ do + waitForNextCheck + + debug ["starting sanity check"] + void $ alertWhile sanityCheckAlert go + debug ["sanity check complete"] + where + go = do + modifyDaemonStatus_ $ \s -> s { sanityCheckRunning = True } + + now <- liftIO getPOSIXTime -- before check started + r <- either showerr return + =<< (tryIO . batch) <~> dailyCheck urlrenderer + + modifyDaemonStatus_ $ \s -> s + { sanityCheckRunning = False + , lastSanityCheck = Just now + } + + return r + + showerr e = do + liftAnnex $ warning $ show e + return False + +{- Only run one check per day, from the time of the last check. -} +waitForNextCheck :: Assistant () +waitForNextCheck = do + v <- lastSanityCheck <$> getDaemonStatus + now <- liftIO getPOSIXTime + liftIO $ threadDelaySeconds $ Seconds $ calcdelay now v + where + calcdelay _ Nothing = oneDay + calcdelay now (Just lastcheck) + | lastcheck < now = max oneDay $ + oneDay - truncate (now - lastcheck) + | otherwise = oneDay + +{- It's important to stay out of the Annex monad as much as possible while + - running potentially expensive parts of this check, since remaining in it + - will block the watcher. -} +dailyCheck :: UrlRenderer -> Assistant Bool +dailyCheck urlrenderer = do + g <- liftAnnex gitRepo + batchmaker <- liftIO getBatchCommandMaker + + -- Find old unstaged symlinks, and add them to git. + (unstaged, cleanup) <- liftIO $ Git.LsFiles.notInRepo False ["."] g + now <- liftIO getPOSIXTime + forM_ unstaged $ \file -> do + ms <- liftIO $ catchMaybeIO $ getSymbolicLinkStatus file + case ms of + Just s | toonew (statusChangeTime s) now -> noop + | isSymbolicLink s -> addsymlink file ms + _ -> noop + liftIO $ void cleanup + + {- Allow git-gc to run once per day. More frequent gc is avoided + - by default to avoid slowing things down. Only run repacks when 100x + - the usual number of loose objects are present; we tend + - to have a lot of small objects and they should not be a + - significant size. -} + when (Git.Config.getMaybe "gc.auto" g == Just "0") $ + liftIO $ void $ Git.Command.runBatch batchmaker + [ Param "-c", Param "gc.auto=670000" + , Param "gc" + , Param "--auto" + ] g + + {- Check if the unused files found last time have been dealt with. -} + checkOldUnused urlrenderer + + {- Run git-annex unused once per day. This is run as a separate + - process to stay out of the annex monad and so it can run as a + - batch job. -} + program <- liftIO readProgramFile + let (program', params') = batchmaker (program, [Param "unused"]) + void $ liftIO $ boolSystem program' params' + {- Invalidate unused keys cache, and queue transfers of all unused + - keys, or if no transfers are called for, drop them. -} + unused <- liftAnnex unusedKeys' + void $ liftAnnex $ setUnusedKeys unused + forM_ unused $ \k -> do + unlessM (queueTransfers "unused" Later k Nothing Upload) $ + handleDrops "unused" True k Nothing Nothing + + return True + where + toonew timestamp now = now < (realToFrac (timestamp + slop) :: POSIXTime) + slop = fromIntegral tenMinutes + insanity msg = do + liftAnnex $ warning msg + void $ addAlert $ sanityCheckFixAlert msg + addsymlink file s = do + isdirect <- liftAnnex isDirect + Watcher.runHandler (Watcher.onAddSymlink isdirect) file s + insanity $ "found unstaged symlink: " ++ file + +hourlyCheck :: Assistant () +hourlyCheck = do +#ifndef mingw32_HOST_OS + checkLogSize 0 +#else + noop +#endif + +#ifndef mingw32_HOST_OS +{- Rotate logs once when total log file size is > 2 mb. + - + - If total log size is larger than the amount of free disk space, + - continue rotating logs until size is < 2 mb, even if this + - results in immediately losing the just logged data. + -} +checkLogSize :: Int -> Assistant () +checkLogSize n = do + f <- liftAnnex $ fromRepo gitAnnexLogFile + logs <- liftIO $ listLogs f + totalsize <- liftIO $ sum <$> mapM filesize logs + when (totalsize > 2 * oneMegabyte) $ do + notice ["Rotated logs due to size:", show totalsize] + liftIO $ openLog f >>= redirLog + when (n < maxLogs + 1) $ do + df <- liftIO $ getDiskFree $ takeDirectory f + case df of + Just free + | free < fromIntegral totalsize -> + checkLogSize (n + 1) + _ -> noop + where + filesize f = fromIntegral . fileSize <$> liftIO (getFileStatus f) + + oneMegabyte :: Int + oneMegabyte = 1000000 +#endif + +oneHour :: Int +oneHour = 60 * 60 + +oneDay :: Int +oneDay = 24 * oneHour + +{- If annex.expireunused is set, find any keys that have lingered unused + - for the specified duration, and remove them. + - + - Otherwise, check to see if unused keys are piling up, and let the user + - know. -} +checkOldUnused :: UrlRenderer -> Assistant () +checkOldUnused urlrenderer = go =<< annexExpireUnused <$> liftAnnex Annex.getGitConfig + where + go (Just Nothing) = noop + go (Just (Just expireunused)) = expireUnused (Just expireunused) + go Nothing = maybe noop prompt =<< describeUnusedWhenBig + + prompt msg = +#ifdef WITH_WEBAPP + do + button <- mkAlertButton True (T.pack "Configure") urlrenderer ConfigUnusedR + void $ addAlert $ unusedFilesAlert [button] $ T.unpack $ renderTense Present msg +#else + debug [show $ renderTense Past msg] +#endif diff --git a/Assistant/Threads/TransferPoller.hs b/Assistant/Threads/TransferPoller.hs new file mode 100644 index 0000000000..71bfe3676a --- /dev/null +++ b/Assistant/Threads/TransferPoller.hs @@ -0,0 +1,56 @@ +{- git-annex assistant transfer polling thread + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Assistant.Threads.TransferPoller where + +import Assistant.Common +import Assistant.DaemonStatus +import Logs.Transfer +import Utility.NotificationBroadcaster +import qualified Assistant.Threads.TransferWatcher as TransferWatcher + +import Control.Concurrent +import qualified Data.Map as M + +{- This thread polls the status of ongoing transfers, determining how much + - of each transfer is complete. -} +transferPollerThread :: NamedThread +transferPollerThread = namedThread "TransferPoller" $ do + g <- liftAnnex gitRepo + tn <- liftIO . newNotificationHandle True =<< + transferNotifier <$> getDaemonStatus + forever $ do + liftIO $ threadDelay 500000 -- 0.5 seconds + ts <- currentTransfers <$> getDaemonStatus + if M.null ts + -- block until transfers running + then liftIO $ waitNotification tn + else mapM_ (poll g) $ M.toList ts + where + poll g (t, info) + {- Downloads are polled by checking the size of the + - temp file being used for the transfer. -} + | transferDirection t == Download = do + let f = gitAnnexTmpObjectLocation (transferKey t) g + sz <- liftIO $ catchMaybeIO $ + fromIntegral . fileSize <$> getFileStatus f + newsize t info sz + {- Uploads don't need to be polled for when the TransferWatcher + - thread can track file modifications. -} + | TransferWatcher.watchesTransferSize = noop + {- Otherwise, this code polls the upload progress + - by reading the transfer info file. -} + | otherwise = do + let f = transferFile t g + mi <- liftIO $ catchDefaultIO Nothing $ + readTransferInfoFile Nothing f + maybe noop (newsize t info . bytesComplete) mi + + newsize t info sz + | bytesComplete info /= sz && isJust sz = + alterTransferInfo t $ \i -> i { bytesComplete = sz } + | otherwise = noop diff --git a/Assistant/Threads/TransferScanner.hs b/Assistant/Threads/TransferScanner.hs new file mode 100644 index 0000000000..6df9b1e183 --- /dev/null +++ b/Assistant/Threads/TransferScanner.hs @@ -0,0 +1,184 @@ +{- git-annex assistant thread to scan remotes to find needed transfers + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Assistant.Threads.TransferScanner where + +import Assistant.Common +import Assistant.Types.ScanRemotes +import Assistant.ScanRemotes +import Assistant.TransferQueue +import Assistant.DaemonStatus +import Assistant.Drop +import Assistant.Sync +import Assistant.DeleteRemote +import Assistant.Types.UrlRenderer +import Logs.Transfer +import Logs.Location +import Logs.Group +import Logs.Web (webUUID) +import qualified Remote +import qualified Types.Remote as Remote +import Utility.ThreadScheduler +import Utility.NotificationBroadcaster +import Utility.Batch +import qualified Git.LsFiles as LsFiles +import qualified Backend +import Annex.Content +import Annex.Wanted +import CmdLine.Action + +import qualified Data.Set as S + +{- This thread waits until a remote needs to be scanned, to find transfers + - that need to be made, to keep data in sync. + -} +transferScannerThread :: UrlRenderer -> NamedThread +transferScannerThread urlrenderer = namedThread "TransferScanner" $ do + startupScan + go S.empty + where + go scanned = do + scanrunning False + liftIO $ threadDelaySeconds (Seconds 2) + (rs, infos) <- unzip <$> getScanRemote + scanrunning True + if any fullScan infos || any (`S.notMember` scanned) rs + then do + expensiveScan urlrenderer rs + go $ scanned `S.union` S.fromList rs + else do + mapM_ failedTransferScan rs + go scanned + scanrunning b = do + ds <- modifyDaemonStatus $ \s -> + (s { transferScanRunning = b }, s) + liftIO $ sendNotification $ transferNotifier ds + + {- All git remotes are synced, and all available remotes + - are scanned in full on startup, for multiple reasons, including: + - + - * This may be the first run, and there may be remotes + - already in place, that need to be synced. + - * Changes may have been made last time we run, but remotes were + - not available to be synced with. + - * Changes may have been made to remotes while we were down. + - * We may have run before, and scanned a remote, but + - only been in a subdirectory of the git remote, and so + - not synced it all. + - * We may have run before, and had transfers queued, + - and then the system (or us) crashed, and that info was + - lost. + - * A remote may be in the unwanted group, and this is a chance + - to determine if the remote has been emptied. + -} + startupScan = do + reconnectRemotes True =<< syncGitRemotes <$> getDaemonStatus + addScanRemotes True =<< syncDataRemotes <$> getDaemonStatus + +{- This is a cheap scan for failed transfers involving a remote. -} +failedTransferScan :: Remote -> Assistant () +failedTransferScan r = do + failed <- liftAnnex $ clearFailedTransfers (Remote.uuid r) + mapM_ retry failed + where + retry (t, info) + | transferDirection t == Download = + {- Check if the remote still has the key. + - If not, relies on the expensiveScan to + - get it queued from some other remote. -} + whenM (liftAnnex $ remoteHas r $ transferKey t) $ + requeue t info + | otherwise = + {- The Transferrer checks when uploading + - that the remote doesn't already have the + - key, so it's not redundantly checked here. -} + requeue t info + requeue t info = queueTransferWhenSmall "retrying failed transfer" (associatedFile info) t r + +{- This is a expensive scan through the full git work tree, finding + - files to transfer. The scan is blocked when the transfer queue gets + - too large. + - + - This also finds files that are present either here or on a remote + - but that are not preferred content, and drops them. Searching for files + - to drop is done concurrently with the scan for transfers. + - + - TODO: It would be better to first drop as much as we can, before + - transferring much, to minimise disk use. + - + - During the scan, we'll also check if any unwanted repositories are empty, + - and can be removed. While unrelated, this is a cheap place to do it, + - since we need to look at the locations of all keys anyway. + -} +expensiveScan :: UrlRenderer -> [Remote] -> Assistant () +expensiveScan urlrenderer rs = unless onlyweb $ batch <~> do + debug ["starting scan of", show visiblers] + + let us = map Remote.uuid rs + + mapM_ (liftAnnex . clearFailedTransfers) us + + unwantedrs <- liftAnnex $ S.fromList + <$> filterM inUnwantedGroup us + + g <- liftAnnex gitRepo + (files, cleanup) <- liftIO $ LsFiles.inRepo [] g + removablers <- scan unwantedrs files + void $ liftIO cleanup + + debug ["finished scan of", show visiblers] + + remove <- asIO1 $ removableRemote urlrenderer + liftIO $ mapM_ (void . tryNonAsync . remove) $ S.toList removablers + where + onlyweb = all (== webUUID) $ map Remote.uuid rs + visiblers = let rs' = filter (not . Remote.readonly) rs + in if null rs' then rs else rs' + + scan unwanted [] = return unwanted + scan unwanted (f:fs) = do + (unwanted', ts) <- maybe + (return (unwanted, [])) + (findtransfers f unwanted) + =<< liftAnnex (Backend.lookupFile f) + mapM_ (enqueue f) ts + scan unwanted' fs + + enqueue f (r, t) = + queueTransferWhenSmall "expensive scan found missing object" + (Just f) t r + findtransfers f unwanted (key, _) = do + {- The syncable remotes may have changed since this + - scan began. -} + syncrs <- syncDataRemotes <$> getDaemonStatus + locs <- liftAnnex $ loggedLocations key + present <- liftAnnex $ inAnnex key + liftAnnex $ handleDropsFrom locs syncrs + "expensive scan found too many copies of object" + present key (Just f) Nothing callCommandAction + liftAnnex $ do + let slocs = S.fromList locs + let use a = return $ mapMaybe (a key slocs) syncrs + ts <- if present + then filterM (wantSend True (Just key) (Just f) . Remote.uuid . fst) + =<< use (genTransfer Upload False) + else ifM (wantGet True (Just key) (Just f)) + ( use (genTransfer Download True) , return [] ) + let unwanted' = S.difference unwanted slocs + return (unwanted', ts) + +genTransfer :: Direction -> Bool -> Key -> S.Set UUID -> Remote -> Maybe (Remote, Transfer) +genTransfer direction want key slocs r + | direction == Upload && Remote.readonly r = Nothing + | S.member (Remote.uuid r) slocs == want = Just + (r, Transfer direction (Remote.uuid r) key) + | otherwise = Nothing + +remoteHas :: Remote -> Key -> Annex Bool +remoteHas r key = elem + <$> pure (Remote.uuid r) + <*> loggedLocations key diff --git a/Assistant/Threads/TransferWatcher.hs b/Assistant/Threads/TransferWatcher.hs new file mode 100644 index 0000000000..6e87917328 --- /dev/null +++ b/Assistant/Threads/TransferWatcher.hs @@ -0,0 +1,104 @@ +{- git-annex assistant transfer watching thread + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Assistant.Threads.TransferWatcher where + +import Assistant.Common +import Assistant.DaemonStatus +import Assistant.TransferSlots +import Logs.Transfer +import Utility.DirWatcher +import Utility.DirWatcher.Types +import qualified Remote + +import Control.Concurrent +import qualified Data.Map as M + +{- This thread watches for changes to the gitAnnexTransferDir, + - and updates the DaemonStatus's map of ongoing transfers. -} +transferWatcherThread :: NamedThread +transferWatcherThread = namedThread "TransferWatcher" $ do + dir <- liftAnnex $ gitAnnexTransferDir <$> gitRepo + liftIO $ createDirectoryIfMissing True dir + let hook a = Just <$> asIO2 (runHandler a) + addhook <- hook onAdd + delhook <- hook onDel + modifyhook <- hook onModify + errhook <- hook onErr + let hooks = mkWatchHooks + { addHook = addhook + , delHook = delhook + , modifyHook = modifyhook + , errHook = errhook + } + void $ liftIO $ watchDir dir (const False) True hooks id + debug ["watching for transfers"] + +type Handler = FilePath -> Assistant () + +{- Runs an action handler. + - + - Exceptions are ignored, otherwise a whole thread could be crashed. + -} +runHandler :: Handler -> FilePath -> Maybe FileStatus -> Assistant () +runHandler handler file _filestatus = + either (liftIO . print) (const noop) =<< tryIO <~> handler file + +{- Called when there's an error with inotify. -} +onErr :: Handler +onErr = error + +{- Called when a new transfer information file is written. -} +onAdd :: Handler +onAdd file = case parseTransferFile file of + Nothing -> noop + Just t -> go t =<< liftAnnex (checkTransfer t) + where + go _ Nothing = noop -- transfer already finished + go t (Just info) = do + debug [ "transfer starting:", describeTransfer t info ] + r <- liftAnnex $ Remote.remoteFromUUID $ transferUUID t + updateTransferInfo t info { transferRemote = r } + +{- Called when a transfer information file is updated. + - + - The only thing that should change in the transfer info is the + - bytesComplete, so that's the only thing updated in the DaemonStatus. -} +onModify :: Handler +onModify file = case parseTransferFile file of + Nothing -> noop + Just t -> go t =<< liftIO (readTransferInfoFile Nothing file) + where + go _ Nothing = noop + go t (Just newinfo) = alterTransferInfo t $ + \i -> i { bytesComplete = bytesComplete newinfo } + +{- This thread can only watch transfer sizes when the DirWatcher supports + - tracking modificatons to files. -} +watchesTransferSize :: Bool +watchesTransferSize = modifyTracked + +{- Called when a transfer information file is removed. -} +onDel :: Handler +onDel file = case parseTransferFile file of + Nothing -> noop + Just t -> do + debug [ "transfer finishing:", show t] + minfo <- removeTransfer t + + -- Run transfer hook. + m <- transferHook <$> getDaemonStatus + maybe noop (\hook -> void $ liftIO $ forkIO $ hook t) + (M.lookup (transferKey t) m) + + finished <- asIO2 finishedTransfer + void $ liftIO $ forkIO $ do + {- XXX race workaround delay. The location + - log needs to be updated before finishedTransfer + - runs. -} + threadDelay 10000000 -- 10 seconds + finished t minfo diff --git a/Assistant/Threads/Transferrer.hs b/Assistant/Threads/Transferrer.hs new file mode 100644 index 0000000000..53d8a578cb --- /dev/null +++ b/Assistant/Threads/Transferrer.hs @@ -0,0 +1,27 @@ +{- git-annex assistant data transferrer thread + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Assistant.Threads.Transferrer where + +import Assistant.Common +import Assistant.TransferQueue +import Assistant.TransferSlots +import Logs.Transfer +import Config.Files +import Utility.Batch + +{- Dispatches transfers from the queue. -} +transfererThread :: NamedThread +transfererThread = namedThread "Transferrer" $ do + program <- liftIO readProgramFile + batchmaker <- liftIO getBatchCommandMaker + forever $ inTransferSlot program batchmaker $ + maybe (return Nothing) (uncurry genTransfer) + =<< getNextTransfer notrunning + where + {- Skip transfers that are already running. -} + notrunning = isNothing . startedTime diff --git a/Assistant/Threads/UpgradeWatcher.hs b/Assistant/Threads/UpgradeWatcher.hs new file mode 100644 index 0000000000..ffad09d3dd --- /dev/null +++ b/Assistant/Threads/UpgradeWatcher.hs @@ -0,0 +1,110 @@ +{- git-annex assistant thread to detect when git-annex is upgraded + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Assistant.Threads.UpgradeWatcher ( + upgradeWatcherThread +) where + +import Assistant.Common +import Assistant.Upgrade +import Utility.DirWatcher +import Utility.DirWatcher.Types +import Utility.ThreadScheduler +import Assistant.Types.UrlRenderer +import Assistant.Alert +import Assistant.DaemonStatus +#ifdef WITH_WEBAPP +import Assistant.WebApp.Types +import qualified Build.SysConfig +#endif + +import Control.Concurrent.MVar +import qualified Data.Text as T + +data WatcherState = InStartupScan | Started | Upgrading + deriving (Eq) + +upgradeWatcherThread :: UrlRenderer -> NamedThread +upgradeWatcherThread urlrenderer = namedThread "UpgradeWatcher" $ do + whenM (liftIO checkSuccessfulUpgrade) $ + showSuccessfulUpgrade urlrenderer + go =<< liftIO upgradeFlagFile + where + go Nothing = debug [ "cannot determine program path" ] + go (Just flagfile) = do + mvar <- liftIO $ newMVar InStartupScan + changed <- Just <$> asIO2 (changedFile urlrenderer mvar flagfile) + let hooks = mkWatchHooks + { addHook = changed + , delHook = changed + , addSymlinkHook = changed + , modifyHook = changed + , delDirHook = changed + } + let dir = parentDir flagfile + let depth = length (splitPath dir) + 1 + let nosubdirs f = length (splitPath f) == depth + void $ liftIO $ watchDir dir nosubdirs False hooks (startup mvar) + -- Ignore bogus events generated during the startup scan. + -- We ask the watcher to not generate them, but just to be safe.. + startup mvar scanner = do + r <- scanner + void $ swapMVar mvar Started + return r + +changedFile :: UrlRenderer -> MVar WatcherState -> FilePath -> FilePath -> Maybe FileStatus -> Assistant () +changedFile urlrenderer mvar flagfile file _status + | flagfile /= file = noop + | otherwise = do + state <- liftIO $ readMVar mvar + when (state == Started) $ do + setstate Upgrading + ifM (liftIO upgradeSanityCheck) + ( handleUpgrade urlrenderer + , do + debug ["new version failed sanity check; not using"] + setstate Started + ) + where + setstate = void . liftIO . swapMVar mvar + +handleUpgrade :: UrlRenderer -> Assistant () +handleUpgrade urlrenderer = do + -- Wait 2 minutes for any final upgrade changes to settle. + -- (For example, other associated files may be being put into + -- place.) Not needed when using a distribution bundle, because + -- in that case git-annex handles the upgrade in a non-racy way. + liftIO $ unlessM usingDistribution $ + threadDelaySeconds (Seconds 120) + ifM autoUpgradeEnabled + ( do + debug ["starting automatic upgrade"] + unattendedUpgrade +#ifdef WITH_WEBAPP + , do + button <- mkAlertButton True (T.pack "Finish Upgrade") urlrenderer ConfigFinishUpgradeR + void $ addAlert $ upgradeReadyAlert button +#else + , noop +#endif + ) + +showSuccessfulUpgrade :: UrlRenderer -> Assistant () +showSuccessfulUpgrade urlrenderer = do +#ifdef WITH_WEBAPP + button <- ifM autoUpgradeEnabled + ( pure Nothing + , Just <$> mkAlertButton True + (T.pack "Enable Automatic Upgrades") + urlrenderer ConfigEnableAutomaticUpgradeR + ) + void $ addAlert $ upgradeFinishedAlert button Build.SysConfig.packageversion +#else + noop +#endif diff --git a/Assistant/Threads/Upgrader.hs b/Assistant/Threads/Upgrader.hs new file mode 100644 index 0000000000..60aeec70b6 --- /dev/null +++ b/Assistant/Threads/Upgrader.hs @@ -0,0 +1,101 @@ +{- git-annex assistant thread to detect when upgrade is available + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Assistant.Threads.Upgrader ( + upgraderThread +) where + +import Assistant.Common +import Assistant.Upgrade + +import Assistant.Types.UrlRenderer +import Assistant.DaemonStatus +import Assistant.Alert +import Utility.NotificationBroadcaster +import Utility.Tmp +import qualified Annex +import qualified Build.SysConfig +import qualified Utility.Url as Url +import qualified Annex.Url as Url +import qualified Git.Version +import Types.Distribution +#ifdef WITH_WEBAPP +import Assistant.WebApp.Types +#endif + +import Data.Time.Clock +import qualified Data.Text as T + +upgraderThread :: UrlRenderer -> NamedThread +upgraderThread urlrenderer = namedThread "Upgrader" $ + when (isJust Build.SysConfig.upgradelocation) $ do + {- Check for upgrade on startup, unless it was just + - upgraded. -} + unlessM (liftIO checkSuccessfulUpgrade) $ + checkUpgrade urlrenderer + h <- liftIO . newNotificationHandle False . networkConnectedNotifier =<< getDaemonStatus + go h =<< liftIO getCurrentTime + where + {- Wait for a network connection event. Then see if it's been + - half a day since the last upgrade check. If so, proceed with + - check. -} + go h lastchecked = do + liftIO $ waitNotification h + autoupgrade <- liftAnnex $ annexAutoUpgrade <$> Annex.getGitConfig + if autoupgrade == NoAutoUpgrade + then go h lastchecked + else do + now <- liftIO getCurrentTime + if diffUTCTime now lastchecked > halfday + then do + checkUpgrade urlrenderer + go h =<< liftIO getCurrentTime + else go h lastchecked + halfday = 12 * 60 * 60 + +checkUpgrade :: UrlRenderer -> Assistant () +checkUpgrade urlrenderer = do + debug [ "Checking if an upgrade is available." ] + go =<< getDistributionInfo + where + go Nothing = debug [ "Failed to check if upgrade is available." ] + go (Just d) = do + let installed = Git.Version.normalize Build.SysConfig.packageversion + let avail = Git.Version.normalize $ distributionVersion d + let old = Git.Version.normalize <$> distributionUrgentUpgrade d + if Just installed <= old + then canUpgrade High urlrenderer d + else if installed < avail + then canUpgrade Low urlrenderer d + else debug [ "No new version found." ] + +canUpgrade :: AlertPriority -> UrlRenderer -> GitAnnexDistribution -> Assistant () +canUpgrade urgency urlrenderer d = ifM autoUpgradeEnabled + ( startDistributionDownload d + , do +#ifdef WITH_WEBAPP + button <- mkAlertButton True (T.pack "Upgrade") urlrenderer (ConfigStartUpgradeR d) + void $ addAlert (canUpgradeAlert urgency (distributionVersion d) button) +#else + noop +#endif + ) + +getDistributionInfo :: Assistant (Maybe GitAnnexDistribution) +getDistributionInfo = do + uo <- liftAnnex Url.getUrlOptions + liftIO $ withTmpFile "git-annex.tmp" $ \tmpfile h -> do + hClose h + ifM (Url.downloadQuiet distributionInfoUrl tmpfile uo) + ( readish <$> readFileStrict tmpfile + , return Nothing + ) + +distributionInfoUrl :: String +distributionInfoUrl = fromJust Build.SysConfig.upgradelocation ++ ".info" diff --git a/Assistant/Threads/Watcher.hs b/Assistant/Threads/Watcher.hs new file mode 100644 index 0000000000..97ccf083e8 --- /dev/null +++ b/Assistant/Threads/Watcher.hs @@ -0,0 +1,368 @@ +{- git-annex assistant tree watcher + - + - Copyright 2012-2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE DeriveDataTypeable, CPP #-} + +module Assistant.Threads.Watcher ( + watchThread, + WatcherControl(..), + checkCanWatch, + needLsof, + onAddSymlink, + runHandler, +) where + +import Assistant.Common +import Assistant.DaemonStatus +import Assistant.Changes +import Assistant.Types.Changes +import Assistant.Alert +import Utility.DirWatcher +import Utility.DirWatcher.Types +import qualified Annex +import qualified Annex.Queue +import qualified Git +import qualified Git.UpdateIndex +import qualified Git.LsFiles as LsFiles +import qualified Backend +import Annex.Direct +import Annex.Content.Direct +import Annex.CatFile +import Annex.CheckIgnore +import Annex.Link +import Annex.FileMatcher +import Types.FileMatcher +import Annex.ReplaceFile +import Git.Types +import Config +import Utility.ThreadScheduler +#ifndef mingw32_HOST_OS +import qualified Utility.Lsof as Lsof +#endif + +import Data.Bits.Utils +import Data.Typeable +import qualified Data.ByteString.Lazy as L +import qualified Control.Exception as E +import Data.Time.Clock + +checkCanWatch :: Annex () +checkCanWatch + | canWatch = do +#ifndef mingw32_HOST_OS + liftIO Lsof.setup + unlessM (liftIO (inPath "lsof") <||> Annex.getState Annex.force) + needLsof +#else + noop +#endif + | otherwise = error "watch mode is not available on this system" + +needLsof :: Annex () +needLsof = error $ unlines + [ "The lsof command is needed for watch mode to be safe, and is not in PATH." + , "To override lsof checks to ensure that files are not open for writing" + , "when added to the annex, you can use --force" + , "Be warned: This can corrupt data in the annex, and make fsck complain." + ] + +{- A special exception that can be thrown to pause or resume the watcher. -} +data WatcherControl = PauseWatcher | ResumeWatcher + deriving (Show, Eq, Typeable) + +instance E.Exception WatcherControl + +watchThread :: NamedThread +watchThread = namedThread "Watcher" $ + ifM (liftAnnex $ annexAutoCommit <$> Annex.getGitConfig) + ( runWatcher + , waitFor ResumeWatcher runWatcher + ) + +runWatcher :: Assistant () +runWatcher = do + startup <- asIO1 startupScan + matcher <- liftAnnex largeFilesMatcher + direct <- liftAnnex isDirect + symlinkssupported <- liftAnnex $ coreSymlinks <$> Annex.getGitConfig + addhook <- hook $ if direct + then onAddDirect symlinkssupported matcher + else onAdd matcher + delhook <- hook onDel + addsymlinkhook <- hook $ onAddSymlink direct + deldirhook <- hook onDelDir + errhook <- hook onErr + let hooks = mkWatchHooks + { addHook = addhook + , delHook = delhook + , addSymlinkHook = addsymlinkhook + , delDirHook = deldirhook + , errHook = errhook + } + scanevents <- liftAnnex $ annexStartupScan <$> Annex.getGitConfig + handle <- liftIO $ watchDir "." ignored scanevents hooks startup + debug [ "watching", "."] + + {- Let the DirWatcher thread run until signalled to pause it, + - then wait for a resume signal, and restart. -} + waitFor PauseWatcher $ do + liftIO $ stopWatchDir handle + waitFor ResumeWatcher runWatcher + where + hook a = Just <$> asIO2 (runHandler a) + +waitFor :: WatcherControl -> Assistant () -> Assistant () +waitFor sig next = do + r <- liftIO (E.try pause :: IO (Either E.SomeException ())) + case r of + Left e -> case E.fromException e of + Just s + | s == sig -> next + _ -> noop + _ -> noop + where + pause = runEvery (Seconds 86400) noop + +{- Initial scartup scan. The action should return once the scan is complete. -} +startupScan :: IO a -> Assistant a +startupScan scanner = do + liftAnnex $ showAction "scanning" + alertWhile' startupScanAlert $ do + r <- liftIO scanner + + -- Notice any files that were deleted before + -- watching was started. + top <- liftAnnex $ fromRepo Git.repoPath + (fs, cleanup) <- liftAnnex $ inRepo $ LsFiles.deleted [top] + forM_ fs $ \f -> do + liftAnnex $ onDel' f + maybe noop recordChange =<< madeChange f RmChange + void $ liftIO cleanup + + liftAnnex $ showAction "started" + liftIO $ putStrLn "" + + modifyDaemonStatus_ $ \s -> s { scanComplete = True } + + -- Ensure that the Committer sees any changes + -- that it did not process, and acts on them now that + -- the scan is complete. + refillChanges =<< getAnyChanges + + return (True, r) + +{- Hardcoded ignores, passed to the DirWatcher so it can avoid looking + - at the entire .git directory. Does not include .gitignores. -} +ignored :: FilePath -> Bool +ignored = ig . takeFileName + where + ig ".git" = True + ig ".gitignore" = True + ig ".gitattributes" = True +#ifdef darwin_HOST_OS + ig ".DS_Store" = True +#endif + ig _ = False + +unlessIgnored :: FilePath -> Assistant (Maybe Change) -> Assistant (Maybe Change) +unlessIgnored file a = ifM (liftAnnex $ checkIgnored file) + ( noChange + , a + ) + +type Handler = FilePath -> Maybe FileStatus -> Assistant (Maybe Change) + +{- Runs an action handler, and if there was a change, adds it to the ChangeChan. + - + - Exceptions are ignored, otherwise a whole watcher thread could be crashed. + -} +runHandler :: Handler -> FilePath -> Maybe FileStatus -> Assistant () +runHandler handler file filestatus = void $ do + r <- tryIO <~> handler (normalize file) filestatus + case r of + Left e -> liftIO $ print e + Right Nothing -> noop + Right (Just change) -> do + -- Just in case the commit thread is not + -- flushing the queue fast enough. + liftAnnex Annex.Queue.flushWhenFull + recordChange change + where + normalize f + | "./" `isPrefixOf` file = drop 2 f + | otherwise = f + +{- Small files are added to git as-is, while large ones go into the annex. -} +add :: FileMatcher Annex -> FilePath -> Assistant (Maybe Change) +add bigfilematcher file = ifM (liftAnnex $ checkFileMatcher bigfilematcher file) + ( pendingAddChange file + , do + liftAnnex $ Annex.Queue.addCommand "add" + [Params "--force --"] [file] + madeChange file AddFileChange + ) + +onAdd :: FileMatcher Annex -> Handler +onAdd matcher file filestatus + | maybe False isRegularFile filestatus = + unlessIgnored file $ + add matcher file + | otherwise = noChange + +shouldRestage :: DaemonStatus -> Bool +shouldRestage ds = scanComplete ds || forceRestage ds + +{- In direct mode, add events are received for both new files, and + - modified existing files. + -} +onAddDirect :: Bool -> FileMatcher Annex -> Handler +onAddDirect symlinkssupported matcher file fs = do + v <- liftAnnex $ catKeyFile file + case (v, fs) of + (Just key, Just filestatus) -> + ifM (liftAnnex $ sameFileStatus key filestatus) + {- It's possible to get an add event for + - an existing file that is not + - really modified, but it might have + - just been deleted and been put back, + - so it symlink is restaged to make sure. -} + ( ifM (shouldRestage <$> getDaemonStatus) + ( do + link <- liftAnnex $ inRepo $ gitAnnexLink file key + addLink file link (Just key) + , noChange + ) + , guardSymlinkStandin (Just key) $ do + debug ["changed direct", file] + liftAnnex $ changedDirect key file + add matcher file + ) + _ -> unlessIgnored file $ + guardSymlinkStandin Nothing $ do + debug ["add direct", file] + add matcher file + where + {- On a filesystem without symlinks, we'll get changes for regular + - files that git uses to stand-in for symlinks. Detect when + - this happens, and stage the symlink, rather than annexing the + - file. -} + guardSymlinkStandin mk a + | symlinkssupported = a + | otherwise = do + linktarget <- liftAnnex $ getAnnexLinkTarget file + case linktarget of + Nothing -> a + Just lt -> do + case fileKey $ takeFileName lt of + Nothing -> noop + Just key -> void $ liftAnnex $ + addAssociatedFile key file + onAddSymlink' linktarget mk True file fs + +{- A symlink might be an arbitrary symlink, which is just added. + - Or, if it is a git-annex symlink, ensure it points to the content + - before adding it. + -} +onAddSymlink :: Bool -> Handler +onAddSymlink isdirect file filestatus = unlessIgnored file $ do + linktarget <- liftIO (catchMaybeIO $ readSymbolicLink file) + kv <- liftAnnex (Backend.lookupFile file) + onAddSymlink' linktarget (fmap fst kv) isdirect file filestatus + +onAddSymlink' :: Maybe String -> Maybe Key -> Bool -> Handler +onAddSymlink' linktarget mk isdirect file filestatus = go mk + where + go (Just key) = do + when isdirect $ + liftAnnex $ void $ addAssociatedFile key file + link <- liftAnnex $ inRepo $ gitAnnexLink file key + if linktarget == Just link + then ensurestaged (Just link) =<< getDaemonStatus + else do + unless isdirect $ + liftAnnex $ replaceFile file $ + makeAnnexLink link + addLink file link (Just key) + -- other symlink, not git-annex + go Nothing = ensurestaged linktarget =<< getDaemonStatus + + {- This is often called on symlinks that are already + - staged correctly. A symlink may have been deleted + - and being re-added, or added when the watcher was + - not running. So they're normally restaged to make sure. + - + - As an optimisation, during the startup scan, avoid + - restaging everything. Only links that were created since + - the last time the daemon was running are staged. + - (If the daemon has never ran before, avoid staging + - links too.) + -} + ensurestaged (Just link) daemonstatus + | shouldRestage daemonstatus = addLink file link mk + | otherwise = case filestatus of + Just s + | not (afterLastDaemonRun (statusChangeTime s) daemonstatus) -> noChange + _ -> addLink file link mk + ensurestaged Nothing _ = noChange + +{- For speed, tries to reuse the existing blob for symlink target. -} +addLink :: FilePath -> FilePath -> Maybe Key -> Assistant (Maybe Change) +addLink file link mk = do + debug ["add symlink", file] + liftAnnex $ do + v <- catObjectDetails $ Ref $ ':':file + case v of + Just (currlink, sha, _type) + | s2w8 link == L.unpack currlink -> + stageSymlink file sha + _ -> stageSymlink file =<< hashSymlink link + madeChange file $ LinkChange mk + +onDel :: Handler +onDel file _ = do + debug ["file deleted", file] + liftAnnex $ onDel' file + madeChange file RmChange + +onDel' :: FilePath -> Annex () +onDel' file = do + whenM isDirect $ do + mkey <- catKeyFile file + case mkey of + Nothing -> noop + Just key -> void $ removeAssociatedFile key file + Annex.Queue.addUpdateIndex =<< + inRepo (Git.UpdateIndex.unstageFile file) + +{- A directory has been deleted, or moved, so tell git to remove anything + - that was inside it from its cache. Since it could reappear at any time, + - use --cached to only delete it from the index. + - + - This queues up a lot of RmChanges, which assists the Committer in + - pairing up renamed files when the directory was renamed. -} +onDelDir :: Handler +onDelDir dir _ = do + debug ["directory deleted", dir] + (fs, clean) <- liftAnnex $ inRepo $ LsFiles.deleted [dir] + + liftAnnex $ mapM_ onDel' fs + + -- Get the events queued up as fast as possible, so the + -- committer sees them all in one block. + now <- liftIO getCurrentTime + recordChanges $ map (\f -> Change now f RmChange) fs + + void $ liftIO clean + liftAnnex Annex.Queue.flushWhenFull + noChange + +{- Called when there's an error with inotify or kqueue. -} +onErr :: Handler +onErr msg _ = do + liftAnnex $ warning msg + void $ addAlert $ warningAlert "watcher" msg + noChange diff --git a/Assistant/Threads/WebApp.hs b/Assistant/Threads/WebApp.hs new file mode 100644 index 0000000000..8d977194b2 --- /dev/null +++ b/Assistant/Threads/WebApp.hs @@ -0,0 +1,137 @@ +{- git-annex assistant webapp thread + - + - Copyright 2012-2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE TemplateHaskell, MultiParamTypeClasses #-} +{-# LANGUAGE CPP #-} +{-# OPTIONS_GHC -fno-warn-orphans #-} + +module Assistant.Threads.WebApp where + +import Assistant.Common +import Assistant.WebApp +import Assistant.WebApp.Types +import Assistant.WebApp.DashBoard +import Assistant.WebApp.SideBar +import Assistant.WebApp.Notifications +import Assistant.WebApp.RepoList +import Assistant.WebApp.Configurators +import Assistant.WebApp.Configurators.Local +import Assistant.WebApp.Configurators.Ssh +import Assistant.WebApp.Configurators.Pairing +import Assistant.WebApp.Configurators.AWS +import Assistant.WebApp.Configurators.IA +import Assistant.WebApp.Configurators.WebDAV +import Assistant.WebApp.Configurators.XMPP +import Assistant.WebApp.Configurators.Preferences +import Assistant.WebApp.Configurators.Unused +import Assistant.WebApp.Configurators.Edit +import Assistant.WebApp.Configurators.Delete +import Assistant.WebApp.Configurators.Fsck +import Assistant.WebApp.Configurators.Upgrade +import Assistant.WebApp.Documentation +import Assistant.WebApp.Control +import Assistant.WebApp.OtherRepos +import Assistant.WebApp.Repair +import Assistant.Types.ThreadedMonad +import Utility.WebApp +import Utility.Tmp +import Utility.FileMode +import Git +import qualified Annex + +import Yesod +import Network.Socket (SockAddr, HostName) +import Data.Text (pack, unpack) +import qualified Network.Wai.Handler.WarpTLS as TLS + +mkYesodDispatch "WebApp" $(parseRoutesFile "Assistant/WebApp/routes") + +type Url = String + +webAppThread + :: AssistantData + -> UrlRenderer + -> Bool + -> Maybe String + -> Maybe (IO Url) + -> Maybe HostName + -> Maybe (Url -> FilePath -> IO ()) + -> NamedThread +webAppThread assistantdata urlrenderer noannex cannotrun postfirstrun listenhost onstartup = thread $ liftIO $ do + listenhost' <- if isJust listenhost + then pure listenhost + else getAnnex $ annexListen <$> Annex.getGitConfig + tlssettings <- getAnnex getTlsSettings +#ifdef __ANDROID__ + when (isJust listenhost') $ + -- See Utility.WebApp + error "Sorry, --listen is not currently supported on Android" +#endif + webapp <- WebApp + <$> pure assistantdata + <*> genAuthToken + <*> getreldir + <*> pure staticRoutes + <*> pure postfirstrun + <*> pure cannotrun + <*> pure noannex + <*> pure listenhost' + setUrlRenderer urlrenderer $ yesodRender webapp (pack "") + app <- toWaiAppPlain webapp + app' <- ifM debugEnabled + ( return $ httpDebugLogger app + , return app + ) + runWebApp tlssettings listenhost' app' $ \addr -> if noannex + then withTmpFile "webapp.html" $ \tmpfile h -> do + hClose h + go tlssettings addr webapp tmpfile Nothing + else do + htmlshim <- getAnnex' $ fromRepo gitAnnexHtmlShim + urlfile <- getAnnex' $ fromRepo gitAnnexUrlFile + go tlssettings addr webapp htmlshim (Just urlfile) + where + -- The webapp thread does not wait for the startupSanityCheckThread + -- to finish, so that the user interface remains responsive while + -- that's going on. + thread = namedThreadUnchecked "WebApp" + getreldir + | noannex = return Nothing + | otherwise = Just <$> + (relHome =<< absPath + =<< getAnnex' (fromRepo repoPath)) + go tlssettings addr webapp htmlshim urlfile = do + let url = myUrl tlssettings webapp addr + maybe noop (`writeFileProtected` url) urlfile + writeHtmlShim "Starting webapp..." url htmlshim + maybe noop (\a -> a url htmlshim) onstartup + + getAnnex a + | noannex = pure Nothing + | otherwise = getAnnex' a + getAnnex' = runThreadState (threadState assistantdata) + +myUrl :: Maybe TLS.TLSSettings -> WebApp -> SockAddr -> Url +myUrl tlssettings webapp addr = unpack $ yesodRender webapp urlbase DashboardR [] + where + urlbase = pack $ proto ++ "://" ++ show addr + proto + | isJust tlssettings = "https" + | otherwise = "http" + +getTlsSettings :: Annex (Maybe TLS.TLSSettings) +getTlsSettings = do +#ifdef WITH_WEBAPP_SECURE + cert <- fromRepo gitAnnexWebCertificate + privkey <- fromRepo gitAnnexWebPrivKey + ifM (liftIO $ allM doesFileExist [cert, privkey]) + ( return $ Just $ TLS.tlsSettings cert privkey + , return Nothing + ) +#else + return Nothing +#endif diff --git a/Assistant/Threads/XMPPClient.hs b/Assistant/Threads/XMPPClient.hs new file mode 100644 index 0000000000..ab4de9257f --- /dev/null +++ b/Assistant/Threads/XMPPClient.hs @@ -0,0 +1,368 @@ +{- git-annex XMPP client + - + - Copyright 2012, 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Assistant.Threads.XMPPClient where + +import Assistant.Common +import Assistant.XMPP +import Assistant.XMPP.Client +import Assistant.NetMessager +import Assistant.Types.NetMessager +import Assistant.Types.Buddies +import Assistant.XMPP.Buddies +import Assistant.Sync +import Assistant.DaemonStatus +import qualified Remote +import Utility.ThreadScheduler +import Assistant.WebApp (UrlRenderer) +import Assistant.WebApp.Types hiding (liftAssistant) +import Assistant.Alert +import Assistant.Pairing +import Assistant.XMPP.Git +import Annex.UUID +import Logs.UUID + +import Network.Protocol.XMPP +import Control.Concurrent +import Control.Concurrent.STM.TMVar +import Control.Concurrent.STM (atomically) +import qualified Data.Text as T +import qualified Data.Set as S +import qualified Data.Map as M +import qualified Git.Branch +import Data.Time.Clock +import Control.Concurrent.Async + +xmppClientThread :: UrlRenderer -> NamedThread +xmppClientThread urlrenderer = namedThread "XMPPClient" $ + restartableClient . xmppClient urlrenderer =<< getAssistant id + +{- Runs the client, handing restart events. -} +restartableClient :: (XMPPCreds -> IO ()) -> Assistant () +restartableClient a = forever $ go =<< liftAnnex getXMPPCreds + where + go Nothing = waitNetMessagerRestart + go (Just creds) = do + tid <- liftIO $ forkIO $ a creds + waitNetMessagerRestart + liftIO $ killThread tid + +xmppClient :: UrlRenderer -> AssistantData -> XMPPCreds -> IO () +xmppClient urlrenderer d creds = + retry (runclient creds) =<< getCurrentTime + where + liftAssistant = runAssistant d + inAssistant = liftIO . liftAssistant + + {- When the client exits, it's restarted; + - if it keeps failing, back off to wait 5 minutes before + - trying it again. -} + retry client starttime = do + {- The buddy list starts empty each time + - the client connects, so that stale info + - is not retained. -} + liftAssistant $ + updateBuddyList (const noBuddies) <<~ buddyList + void client + liftAssistant $ modifyDaemonStatus_ $ \s -> s + { xmppClientID = Nothing } + now <- getCurrentTime + if diffUTCTime now starttime > 300 + then do + liftAssistant $ debug ["connection lost; reconnecting"] + retry client now + else do + liftAssistant $ debug ["connection failed; will retry"] + threadDelaySeconds (Seconds 300) + retry client =<< getCurrentTime + + runclient c = liftIO $ connectXMPP c $ \jid -> do + selfjid <- bindJID jid + putStanza gitAnnexSignature + + inAssistant $ do + modifyDaemonStatus_ $ \s -> s + { xmppClientID = Just $ xmppJID creds } + debug ["connected", logJid selfjid] + + lasttraffic <- liftIO $ atomically . newTMVar =<< getCurrentTime + + sender <- xmppSession $ sendnotifications selfjid + receiver <- xmppSession $ receivenotifications selfjid lasttraffic + pinger <- xmppSession $ sendpings selfjid lasttraffic + {- Run all 3 threads concurrently, until + - any of them throw an exception. + - Then kill all 3 threads, and rethrow the + - exception. + - + - If this thread gets an exception, the 3 threads + - will also be killed. -} + liftIO $ pinger `concurrently` sender `concurrently` receiver + + sendnotifications selfjid = forever $ + join $ inAssistant $ relayNetMessage selfjid + receivenotifications selfjid lasttraffic = forever $ do + l <- decodeStanza selfjid <$> getStanza + void $ liftIO $ atomically . swapTMVar lasttraffic =<< getCurrentTime + inAssistant $ debug + ["received:", show $ map logXMPPEvent l] + mapM_ (handle selfjid) l + sendpings selfjid lasttraffic = forever $ do + putStanza pingstanza + + startping <- liftIO getCurrentTime + liftIO $ threadDelaySeconds (Seconds 120) + t <- liftIO $ atomically $ readTMVar lasttraffic + when (t < startping) $ do + inAssistant $ debug ["ping timeout"] + error "ping timeout" + where + {- XEP-0199 says that the server will respond with either + - a ping response or an error message. Either will + - cause traffic, so good enough. -} + pingstanza = xmppPing selfjid + + handle selfjid (PresenceMessage p) = do + void $ inAssistant $ + updateBuddyList (updateBuddies p) <<~ buddyList + resendImportantMessages selfjid p + handle _ (GotNetMessage QueryPresence) = putStanza gitAnnexSignature + handle _ (GotNetMessage (NotifyPush us)) = void $ inAssistant $ pull us + handle selfjid (GotNetMessage (PairingNotification stage c u)) = + maybe noop (inAssistant . pairMsgReceived urlrenderer stage u selfjid) (parseJID c) + handle _ (GotNetMessage m@(Pushing _ pushstage)) + | isPushNotice pushstage = inAssistant $ handlePushNotice m + | isPushInitiation pushstage = inAssistant $ queuePushInitiation m + | otherwise = inAssistant $ storeInbox m + handle _ (Ignorable _) = noop + handle _ (Unknown _) = noop + handle _ (ProtocolError _) = noop + + resendImportantMessages selfjid (Presence { presenceFrom = Just jid }) = do + let c = formatJID jid + (stored, sent) <- inAssistant $ + checkImportantNetMessages (formatJID (baseJID jid), c) + forM_ (S.toList $ S.difference stored sent) $ \msg -> do + let msg' = readdressNetMessage msg c + inAssistant $ debug + [ "sending to new client:" + , logJid jid + , show $ logNetMessage msg' + ] + join $ inAssistant $ convertNetMsg msg' selfjid + inAssistant $ sentImportantNetMessage msg c + resendImportantMessages _ _ = noop + +data XMPPEvent + = GotNetMessage NetMessage + | PresenceMessage Presence + | Ignorable ReceivedStanza + | Unknown ReceivedStanza + | ProtocolError ReceivedStanza + deriving Show + +logXMPPEvent :: XMPPEvent -> String +logXMPPEvent (GotNetMessage m) = logNetMessage m +logXMPPEvent (PresenceMessage p) = logPresence p +logXMPPEvent (Ignorable (ReceivedPresence p)) = "Ignorable " ++ logPresence p +logXMPPEvent (Ignorable _) = "Ignorable message" +logXMPPEvent (Unknown _) = "Unknown message" +logXMPPEvent (ProtocolError _) = "Protocol error message" + +logPresence :: Presence -> String +logPresence (p@Presence { presenceFrom = Just jid }) = unwords + [ "Presence from" + , logJid jid + , show $ extractGitAnnexTag p + ] +logPresence _ = "Presence from unknown" + +logJid :: JID -> String +logJid jid = + let name = T.unpack (buddyName jid) + resource = maybe "" (T.unpack . strResource) (jidResource jid) + in take 1 name ++ show (length name) ++ "/" ++ resource + +logClient :: Client -> String +logClient (Client jid) = logJid jid + +{- Decodes an XMPP stanza into one or more events. -} +decodeStanza :: JID -> ReceivedStanza -> [XMPPEvent] +decodeStanza selfjid s@(ReceivedPresence p) + | presenceType p == PresenceError = [ProtocolError s] + | isNothing (presenceFrom p) = [Ignorable s] + | presenceFrom p == Just selfjid = [Ignorable s] + | otherwise = maybe [PresenceMessage p] decode (gitAnnexTagInfo p) + where + decode i + | tagAttr i == pushAttr = impliedp $ GotNetMessage $ NotifyPush $ + decodePushNotification (tagValue i) + | tagAttr i == queryAttr = impliedp $ GotNetMessage QueryPresence + | otherwise = [Unknown s] + {- Things sent via presence imply a presence message, + - along with their real meaning. -} + impliedp v = [PresenceMessage p, v] +decodeStanza selfjid s@(ReceivedMessage m) + | isNothing (messageFrom m) = [Ignorable s] + | messageFrom m == Just selfjid = [Ignorable s] + | messageType m == MessageError = [ProtocolError s] + | otherwise = [fromMaybe (Unknown s) (GotNetMessage <$> decodeMessage m)] +decodeStanza _ s = [Unknown s] + +{- Waits for a NetMessager message to be sent, and relays it to XMPP. + - + - Chat messages must be directed to specific clients, not a base + - account JID, due to git-annex clients using a negative presence priority. + - PairingNotification messages are always directed at specific + - clients, but Pushing messages are sometimes not, and need to be exploded + - out to specific clients. + - + - Important messages, not directed at any specific client, + - are cached to be sent later when additional clients connect. + -} +relayNetMessage :: JID -> Assistant (XMPP ()) +relayNetMessage selfjid = do + msg <- waitNetMessage + debug ["sending:", logNetMessage msg] + a1 <- handleImportant msg + a2 <- convert msg + return (a1 >> a2) + where + handleImportant msg = case parseJID =<< isImportantNetMessage msg of + Just tojid + | tojid == baseJID tojid -> do + storeImportantNetMessage msg (formatJID tojid) $ + \c -> (baseJID <$> parseJID c) == Just tojid + return $ putStanza presenceQuery + _ -> return noop + convert (Pushing c pushstage) = withOtherClient selfjid c $ \tojid -> + if tojid == baseJID tojid + then do + clients <- maybe [] (S.toList . buddyAssistants) + <$> getBuddy (genBuddyKey tojid) <<~ buddyList + debug ["exploded undirected message to clients", unwords $ map logClient clients] + return $ forM_ clients $ \(Client jid) -> + putStanza $ pushMessage pushstage jid selfjid + else do + debug ["to client:", logJid tojid] + return $ putStanza $ pushMessage pushstage tojid selfjid + convert msg = convertNetMsg msg selfjid + +{- Converts a NetMessage to an XMPP action. -} +convertNetMsg :: NetMessage -> JID -> Assistant (XMPP ()) +convertNetMsg msg selfjid = convert msg + where + convert (NotifyPush us) = return $ putStanza $ pushNotification us + convert QueryPresence = return $ putStanza presenceQuery + convert (PairingNotification stage c u) = withOtherClient selfjid c $ \tojid -> do + changeBuddyPairing tojid True + return $ putStanza $ pairingNotification stage u tojid selfjid + convert (Pushing c pushstage) = withOtherClient selfjid c $ \tojid -> + return $ putStanza $ pushMessage pushstage tojid selfjid + +withOtherClient :: JID -> ClientID -> (JID -> Assistant (XMPP ())) -> Assistant (XMPP ()) +withOtherClient selfjid c a = case parseJID c of + Nothing -> return noop + Just tojid + | tojid == selfjid -> return noop + | otherwise -> a tojid + +withClient :: ClientID -> (JID -> XMPP ()) -> XMPP () +withClient c a = maybe noop a $ parseJID c + +{- Returns an IO action that runs a XMPP action in a separate thread, + - using a session to allow it to access the same XMPP client. -} +xmppSession :: XMPP () -> XMPP (IO ()) +xmppSession a = do + s <- getSession + return $ void $ runXMPP s a + +{- We only pull from one remote out of the set listed in the push + - notification, as an optimisation. + - + - Note that it might be possible (though very unlikely) for the push + - notification to take a while to be sent, and multiple pushes happen + - before it is sent, so it includes multiple remotes that were pushed + - to at different times. + - + - It could then be the case that the remote we choose had the earlier + - push sent to it, but then failed to get the later push, and so is not + - fully up-to-date. If that happens, the pushRetryThread will come along + - and retry the push, and we'll get another notification once it succeeds, + - and pull again. -} +pull :: [UUID] -> Assistant () +pull [] = noop +pull us = do + rs <- filter matching . syncGitRemotes <$> getDaemonStatus + debug $ "push notification for" : map (fromUUID . Remote.uuid ) rs + pullone rs =<< liftAnnex (inRepo Git.Branch.current) + where + matching r = Remote.uuid r `S.member` s + s = S.fromList us + + pullone [] _ = noop + pullone (r:rs) branch = + unlessM (null . fst <$> manualPull branch [r]) $ + pullone rs branch + +{- PairReq from another client using our JID is automatically + - accepted. This is so pairing devices all using the same XMPP + - account works without confirmations. + - + - Also, autoaccept PairReq from the same JID of any repo we've + - already paired with, as long as the UUID in the PairReq is + - one we know about. +-} +pairMsgReceived :: UrlRenderer -> PairStage -> UUID -> JID -> JID -> Assistant () +pairMsgReceived urlrenderer PairReq theiruuid selfjid theirjid + | baseJID selfjid == baseJID theirjid = autoaccept + | otherwise = do + knownjids <- mapMaybe (parseJID . getXMPPClientID) + . filter Remote.isXMPPRemote . syncRemotes <$> getDaemonStatus + um <- liftAnnex uuidMap + if elem (baseJID theirjid) knownjids && M.member theiruuid um + then autoaccept + else showalert + + where + autoaccept = do + selfuuid <- liftAnnex getUUID + sendNetMessage $ + PairingNotification PairAck (formatJID theirjid) selfuuid + finishXMPPPairing theirjid theiruuid + -- Show an alert to let the user decide if they want to pair. + showalert = do + button <- mkAlertButton True (T.pack "Respond") urlrenderer $ + ConfirmXMPPPairFriendR $ + PairKey theiruuid $ formatJID theirjid + void $ addAlert $ pairRequestReceivedAlert + (T.unpack $ buddyName theirjid) + button + +{- PairAck must come from one of the buddies we are pairing with; + - don't pair with just anyone. -} +pairMsgReceived _ PairAck theiruuid _selfjid theirjid = + whenM (isBuddyPairing theirjid) $ do + changeBuddyPairing theirjid False + selfuuid <- liftAnnex getUUID + sendNetMessage $ + PairingNotification PairDone (formatJID theirjid) selfuuid + finishXMPPPairing theirjid theiruuid + +pairMsgReceived _ PairDone _theiruuid _selfjid theirjid = + changeBuddyPairing theirjid False + +isBuddyPairing :: JID -> Assistant Bool +isBuddyPairing jid = maybe False buddyPairing <$> + getBuddy (genBuddyKey jid) <<~ buddyList + +changeBuddyPairing :: JID -> Bool -> Assistant () +changeBuddyPairing jid ispairing = + updateBuddyList (M.adjust set key) <<~ buddyList + where + key = genBuddyKey jid + set b = b { buddyPairing = ispairing } diff --git a/Assistant/Threads/XMPPPusher.hs b/Assistant/Threads/XMPPPusher.hs new file mode 100644 index 0000000000..30c91c7f09 --- /dev/null +++ b/Assistant/Threads/XMPPPusher.hs @@ -0,0 +1,81 @@ +{- git-annex XMPP pusher threads + - + - This is a pair of threads. One handles git send-pack, + - and the other git receive-pack. Each thread can be running at most + - one such operation at a time. + - + - Why not use a single thread? Consider two clients A and B. + - If both decide to run a receive-pack at the same time to the other, + - they would deadlock with only one thread. For larger numbers of + - clients, the two threads are also sufficient. + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Assistant.Threads.XMPPPusher where + +import Assistant.Common +import Assistant.NetMessager +import Assistant.Types.NetMessager +import Assistant.WebApp (UrlRenderer) +import Assistant.WebApp.Configurators.XMPP (checkCloudRepos) +import Assistant.XMPP.Git + +import Control.Exception as E + +xmppSendPackThread :: UrlRenderer -> NamedThread +xmppSendPackThread = pusherThread "XMPPSendPack" SendPack + +xmppReceivePackThread :: UrlRenderer -> NamedThread +xmppReceivePackThread = pusherThread "XMPPReceivePack" ReceivePack + +pusherThread :: String -> PushSide -> UrlRenderer -> NamedThread +pusherThread threadname side urlrenderer = namedThread threadname $ go Nothing + where + go lastpushedto = do + msg <- waitPushInitiation side $ selectNextPush lastpushedto + debug ["started running push", logNetMessage msg] + + runpush <- asIO $ runPush checker msg + r <- liftIO (E.try runpush :: IO (Either SomeException (Maybe ClientID))) + let successful = case r of + Right (Just _) -> True + _ -> False + + {- Empty the inbox, because stuff may have + - been left in it if the push failed. -} + let justpushedto = getclient msg + maybe noop (`emptyInbox` side) justpushedto + + debug ["finished running push", logNetMessage msg, show successful] + go $ if successful then justpushedto else lastpushedto + + checker = checkCloudRepos urlrenderer + + getclient (Pushing cid _) = Just cid + getclient _ = Nothing + +{- Select the next push to run from the queue. + - The queue cannot be empty! + - + - We prefer to select the most recently added push, because its requestor + - is more likely to still be connected. + - + - When passed the ID of a client we just pushed to, we prefer to not + - immediately push again to that same client. This avoids one client + - drowing out others. So pushes from the client we just pushed to are + - relocated to the beginning of the list, to be processed later. + -} +selectNextPush :: Maybe ClientID -> [NetMessage] -> (NetMessage, [NetMessage]) +selectNextPush _ (m:[]) = (m, []) -- common case +selectNextPush _ [] = error "selectNextPush: empty list" +selectNextPush lastpushedto l = go [] l + where + go (r:ejected) [] = (r, ejected) + go rejected (m:ms) = case m of + (Pushing clientid _) + | Just clientid /= lastpushedto -> (m, rejected ++ ms) + _ -> go (m:rejected) ms + go [] [] = undefined diff --git a/Assistant/TransferQueue.hs b/Assistant/TransferQueue.hs new file mode 100644 index 0000000000..93c982224b --- /dev/null +++ b/Assistant/TransferQueue.hs @@ -0,0 +1,233 @@ +{- git-annex assistant pending transfer queue + - + - Copyright 2012-2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE BangPatterns #-} + +module Assistant.TransferQueue ( + TransferQueue, + Schedule(..), + newTransferQueue, + getTransferQueue, + queueTransfers, + queueTransfersMatching, + queueDeferredDownloads, + queueTransfer, + queueTransferAt, + queueTransferWhenSmall, + getNextTransfer, + getMatchingTransfers, + dequeueTransfers, +) where + +import Assistant.Common +import Assistant.DaemonStatus +import Assistant.Types.TransferQueue +import Logs.Transfer +import Types.Remote +import qualified Remote +import qualified Types.Remote as Remote +import Annex.Wanted +import Utility.TList + +import Control.Concurrent.STM +import qualified Data.Map as M +import qualified Data.Set as S + +type Reason = String + +{- Reads the queue's content without blocking or changing it. -} +getTransferQueue :: Assistant [(Transfer, TransferInfo)] +getTransferQueue = (atomically . readTList . queuelist) <<~ transferQueue + +stubInfo :: AssociatedFile -> Remote -> TransferInfo +stubInfo f r = stubTransferInfo + { transferRemote = Just r + , associatedFile = f + } + +{- Adds transfers to queue for some of the known remotes. + - Honors preferred content settings, only transferring wanted files. -} +queueTransfers :: Reason -> Schedule -> Key -> AssociatedFile -> Direction -> Assistant Bool +queueTransfers = queueTransfersMatching (const True) + +{- Adds transfers to queue for some of the known remotes, that match a + - condition. Honors preferred content settings. -} +queueTransfersMatching :: (UUID -> Bool) -> Reason -> Schedule -> Key -> AssociatedFile -> Direction -> Assistant Bool +queueTransfersMatching matching reason schedule k f direction + | direction == Download = ifM (liftAnnex $ wantGet True (Just k) f) + ( go + , return False + ) + | otherwise = go + where + go = do + + rs <- liftAnnex . selectremotes + =<< syncDataRemotes <$> getDaemonStatus + let matchingrs = filter (matching . Remote.uuid) rs + if null matchingrs + then do + defer + return False + else do + forM_ matchingrs $ \r -> + enqueue reason schedule (gentransfer r) (stubInfo f r) + return True + selectremotes rs + {- Queue downloads from all remotes that + - have the key. The list of remotes is ordered with + - cheapest first. More expensive ones will only be tried + - if downloading from a cheap one fails. -} + | direction == Download = do + s <- locs + return $ filter (inset s) rs + {- Upload to all remotes that want the content and don't + - already have it. -} + | otherwise = do + s <- locs + filterM (wantSend True (Just k) f . Remote.uuid) $ + filter (\r -> not (inset s r || Remote.readonly r)) rs + where + locs = S.fromList <$> Remote.keyLocations k + inset s r = S.member (Remote.uuid r) s + gentransfer r = Transfer + { transferDirection = direction + , transferKey = k + , transferUUID = Remote.uuid r + } + defer + {- Defer this download, as no known remote has the key. -} + | direction == Download = do + q <- getAssistant transferQueue + void $ liftIO $ atomically $ + consTList (deferreddownloads q) (k, f) + | otherwise = noop + +{- Queues any deferred downloads that can now be accomplished, leaving + - any others in the list to try again later. -} +queueDeferredDownloads :: Reason -> Schedule -> Assistant () +queueDeferredDownloads reason schedule = do + q <- getAssistant transferQueue + l <- liftIO $ atomically $ readTList (deferreddownloads q) + rs <- syncDataRemotes <$> getDaemonStatus + left <- filterM (queue rs) l + unless (null left) $ + liftIO $ atomically $ appendTList (deferreddownloads q) left + where + queue rs (k, f) = do + uuids <- liftAnnex $ Remote.keyLocations k + let sources = filter (\r -> uuid r `elem` uuids) rs + unless (null sources) $ + forM_ sources $ \r -> + enqueue reason schedule + (gentransfer r) (stubInfo f r) + return $ null sources + where + gentransfer r = Transfer + { transferDirection = Download + , transferKey = k + , transferUUID = Remote.uuid r + } + +enqueue :: Reason -> Schedule -> Transfer -> TransferInfo -> Assistant () +enqueue reason schedule t info + | schedule == Next = go consTList + | otherwise = go snocTList + where + go modlist = whenM (add modlist) $ do + debug [ "queued", describeTransfer t info, ": " ++ reason ] + notifyTransfer + add modlist = do + q <- getAssistant transferQueue + dstatus <- getAssistant daemonStatusHandle + liftIO $ atomically $ ifM (checkRunningTransferSTM dstatus t) + ( return False + , do + l <- readTList (queuelist q) + if (t `notElem` map fst l) + then do + void $ modifyTVar' (queuesize q) succ + void $ modlist (queuelist q) (t, info) + return True + else return False + ) + +{- Adds a transfer to the queue. -} +queueTransfer :: Reason -> Schedule -> AssociatedFile -> Transfer -> Remote -> Assistant () +queueTransfer reason schedule f t remote = + enqueue reason schedule t (stubInfo f remote) + +{- Blocks until the queue is no larger than a given size, and then adds a + - transfer to the queue. -} +queueTransferAt :: Int -> Reason -> Schedule -> AssociatedFile -> Transfer -> Remote -> Assistant () +queueTransferAt wantsz reason schedule f t remote = do + q <- getAssistant transferQueue + liftIO $ atomically $ do + sz <- readTVar (queuesize q) + unless (sz <= wantsz) $ + retry -- blocks until queuesize changes + enqueue reason schedule t (stubInfo f remote) + +queueTransferWhenSmall :: Reason -> AssociatedFile -> Transfer -> Remote -> Assistant () +queueTransferWhenSmall reason = queueTransferAt 10 reason Later + +{- Blocks until a pending transfer is available in the queue, + - and removes it. + - + - Checks that it's acceptable, before adding it to the + - currentTransfers map. If it's not acceptable, it's discarded. + - + - This is done in a single STM transaction, so there is no window + - where an observer sees an inconsistent status. -} +getNextTransfer :: (TransferInfo -> Bool) -> Assistant (Maybe (Transfer, TransferInfo)) +getNextTransfer acceptable = do + q <- getAssistant transferQueue + dstatus <- getAssistant daemonStatusHandle + liftIO $ atomically $ do + sz <- readTVar (queuesize q) + if sz < 1 + then retry -- blocks until queuesize changes + else do + (r@(t,info):rest) <- readTList (queuelist q) + void $ modifyTVar' (queuesize q) pred + setTList (queuelist q) rest + if acceptable info + then do + adjustTransfersSTM dstatus $ + M.insertWith' const t info + return $ Just r + else return Nothing + +{- Moves transfers matching a condition from the queue, to the + - currentTransfers map. -} +getMatchingTransfers :: (Transfer -> Bool) -> Assistant [(Transfer, TransferInfo)] +getMatchingTransfers c = do + q <- getAssistant transferQueue + dstatus <- getAssistant daemonStatusHandle + liftIO $ atomically $ do + ts <- dequeueTransfersSTM q c + unless (null ts) $ + adjustTransfersSTM dstatus $ \m -> M.union m $ M.fromList ts + return ts + +{- Removes transfers matching a condition from the queue, and returns the + - removed transfers. -} +dequeueTransfers :: (Transfer -> Bool) -> Assistant [(Transfer, TransferInfo)] +dequeueTransfers c = do + q <- getAssistant transferQueue + removed <- liftIO $ atomically $ dequeueTransfersSTM q c + unless (null removed) $ + notifyTransfer + return removed + +dequeueTransfersSTM :: TransferQueue -> (Transfer -> Bool) -> STM [(Transfer, TransferInfo)] +dequeueTransfersSTM q c = do + !(removed, ts) <- partition (c . fst) <$> readTList (queuelist q) + let !len = length ts + void $ writeTVar (queuesize q) len + setTList (queuelist q) ts + return removed diff --git a/Assistant/TransferSlots.hs b/Assistant/TransferSlots.hs new file mode 100644 index 0000000000..a36a3ee326 --- /dev/null +++ b/Assistant/TransferSlots.hs @@ -0,0 +1,293 @@ +{- git-annex assistant transfer slots + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Assistant.TransferSlots where + +import Assistant.Common +import Utility.ThreadScheduler +import Assistant.Types.TransferSlots +import Assistant.DaemonStatus +import Assistant.TransferrerPool +import Assistant.Types.TransferrerPool +import Assistant.Types.TransferQueue +import Assistant.TransferQueue +import Assistant.Alert +import Assistant.Alert.Utility +import Assistant.Commits +import Assistant.Drop +import Logs.Transfer +import Logs.Location +import qualified Git +import qualified Remote +import qualified Types.Remote as Remote +import Annex.Content +import Annex.Wanted +import Config.Files +import Utility.Batch + +import qualified Data.Map as M +import qualified Control.Exception as E +import Control.Concurrent +import qualified Control.Concurrent.MSemN as MSemN +#ifndef mingw32_HOST_OS +import System.Posix.Process (getProcessGroupIDOf) +import System.Posix.Signals (signalProcessGroup, sigTERM, sigKILL) +#else +import Utility.WinProcess +#endif + +type TransferGenerator = Assistant (Maybe (Transfer, TransferInfo, Transferrer -> Assistant ())) + +{- Waits until a transfer slot becomes available, then runs a + - TransferGenerator, and then runs the transfer action in its own thread. + -} +inTransferSlot :: FilePath -> BatchCommandMaker -> TransferGenerator -> Assistant () +inTransferSlot program batchmaker gen = do + flip MSemN.wait 1 <<~ transferSlots + runTransferThread program batchmaker =<< gen + +{- Runs a TransferGenerator, and its transfer action, + - without waiting for a slot to become available. -} +inImmediateTransferSlot :: FilePath -> BatchCommandMaker -> TransferGenerator -> Assistant () +inImmediateTransferSlot program batchmaker gen = do + flip MSemN.signal (-1) <<~ transferSlots + runTransferThread program batchmaker =<< gen + +{- Runs a transfer action, in an already allocated transfer slot. + - Once it finishes, frees the transfer slot. + - + - Note that the action is subject to being killed when the transfer + - is canceled or paused. + - + - A PauseTransfer exception is handled by letting the action be killed, + - then pausing the thread until a ResumeTransfer exception is raised, + - then rerunning the action. + -} +runTransferThread :: FilePath -> BatchCommandMaker -> Maybe (Transfer, TransferInfo, Transferrer -> Assistant ()) -> Assistant () +runTransferThread _ _ Nothing = flip MSemN.signal 1 <<~ transferSlots +runTransferThread program batchmaker (Just (t, info, a)) = do + d <- getAssistant id + aio <- asIO1 a + tid <- liftIO $ forkIO $ runTransferThread' program batchmaker d aio + updateTransferInfo t $ info { transferTid = Just tid } + +runTransferThread' :: FilePath -> BatchCommandMaker -> AssistantData -> (Transferrer -> IO ()) -> IO () +runTransferThread' program batchmaker d run = go + where + go = catchPauseResume $ + withTransferrer program batchmaker (transferrerPool d) + run + pause = catchPauseResume $ + runEvery (Seconds 86400) noop + {- Note: This must use E.try, rather than E.catch. + - When E.catch is used, and has called go in its exception + - handler, Control.Concurrent.throwTo will block sometimes + - when signaling. Using E.try avoids the problem. -} + catchPauseResume a' = do + r <- E.try a' :: IO (Either E.SomeException ()) + case r of + Left e -> case E.fromException e of + Just PauseTransfer -> pause + Just ResumeTransfer -> go + _ -> done + _ -> done + done = runAssistant d $ + flip MSemN.signal 1 <<~ transferSlots + +{- By the time this is called, the daemonstatus's currentTransfers map should + - already have been updated to include the transfer. -} +genTransfer :: Transfer -> TransferInfo -> TransferGenerator +genTransfer t info = case transferRemote info of + Just remote + | Git.repoIsLocalUnknown (Remote.repo remote) -> do + -- optimisation for removable drives not plugged in + liftAnnex $ recordFailedTransfer t info + void $ removeTransfer t + return Nothing + | otherwise -> ifM (liftAnnex $ shouldTransfer t info) + ( do + debug [ "Transferring:" , describeTransfer t info ] + notifyTransfer + return $ Just (t, info, go remote) + , do + debug [ "Skipping unnecessary transfer:", + describeTransfer t info ] + void $ removeTransfer t + finishedTransfer t (Just info) + return Nothing + ) + _ -> return Nothing + where + direction = transferDirection t + isdownload = direction == Download + + {- Alerts are only shown for successful transfers. + - Transfers can temporarily fail for many reasons, + - so there's no point in bothering the user about + - those. The assistant should recover. + - + - After a successful upload, handle dropping it from + - here, if desired. In this case, the remote it was + - uploaded to is known to have it. + - + - Also, after a successful transfer, the location + - log has changed. Indicate that a commit has been + - made, in order to queue a push of the git-annex + - branch out to remotes that did not participate + - in the transfer. + - + - If the process failed, it could have crashed, + - so remove the transfer from the list of current + - transfers, just in case it didn't stop + - in a way that lets the TransferWatcher do its + - usual cleanup. However, first check if something else is + - running the transfer, to avoid removing active transfers. + -} + go remote transferrer = ifM (liftIO $ performTransfer transferrer t $ associatedFile info) + ( do + maybe noop + (void . addAlert . makeAlertFiller True + . transferFileAlert direction True) + (associatedFile info) + unless isdownload $ + handleDrops + ("object uploaded to " ++ show remote) + True (transferKey t) + (associatedFile info) + (Just remote) + void recordCommit + , whenM (liftAnnex $ isNothing <$> checkTransfer t) $ + void $ removeTransfer t + ) + +{- Called right before a transfer begins, this is a last chance to avoid + - unnecessary transfers. + - + - For downloads, we obviously don't need to download if the already + - have the object. + - + - Smilarly, for uploads, check if the remote is known to already have + - the object. + - + - Also, uploads get queued to all remotes, in order of cost. + - This may mean, for example, that an object is uploaded over the LAN + - to a locally paired client, and once that upload is done, a more + - expensive transfer remote no longer wants the object. (Since + - all the clients have it already.) So do one last check if this is still + - preferred content. + - + - We'll also do one last preferred content check for downloads. An + - example of a case where this could be needed is if a download is queued + - for a file that gets moved out of an archive directory -- but before + - that download can happen, the file is put back in the archive. + -} +shouldTransfer :: Transfer -> TransferInfo -> Annex Bool +shouldTransfer t info + | transferDirection t == Download = + (not <$> inAnnex key) <&&> wantGet True (Just key) file + | transferDirection t == Upload = case transferRemote info of + Nothing -> return False + Just r -> notinremote r + <&&> wantSend True (Just key) file (Remote.uuid r) + | otherwise = return False + where + key = transferKey t + file = associatedFile info + + {- Trust the location log to check if the remote already has + - the key. This avoids a roundtrip to the remote. -} + notinremote r = notElem (Remote.uuid r) <$> loggedLocations key + +{- Queue uploads of files downloaded to us, spreading them + - out to other reachable remotes. + - + - Downloading a file may have caused a remote to not want it; + - so check for drops from remotes. + - + - Uploading a file may cause the local repo, or some other remote to not + - want it; handle that too. + -} +finishedTransfer :: Transfer -> Maybe TransferInfo -> Assistant () +finishedTransfer t (Just info) + | transferDirection t == Download = + whenM (liftAnnex $ inAnnex $ transferKey t) $ do + dodrops False + void $ queueTransfersMatching (/= transferUUID t) + "newly received object" + Later (transferKey t) (associatedFile info) Upload + | otherwise = dodrops True + where + dodrops fromhere = handleDrops + ("drop wanted after " ++ describeTransfer t info) + fromhere (transferKey t) (associatedFile info) Nothing +finishedTransfer _ _ = noop + +{- Pause a running transfer. -} +pauseTransfer :: Transfer -> Assistant () +pauseTransfer = cancelTransfer True + +{- Cancel a running transfer. -} +cancelTransfer :: Bool -> Transfer -> Assistant () +cancelTransfer pause t = do + m <- getCurrentTransfers + unless pause $ + {- remove queued transfer -} + void $ dequeueTransfers $ equivilantTransfer t + {- stop running transfer -} + maybe noop stop (M.lookup t m) + where + stop info = do + {- When there's a thread associated with the + - transfer, it's signaled first, to avoid it + - displaying any alert about the transfer having + - failed when the transfer process is killed. -} + liftIO $ maybe noop signalthread $ transferTid info + liftIO $ maybe noop killproc $ transferPid info + if pause + then void $ alterTransferInfo t $ + \i -> i { transferPaused = True } + else void $ removeTransfer t + signalthread tid + | pause = throwTo tid PauseTransfer + | otherwise = killThread tid + killproc pid = void $ tryIO $ do +#ifndef mingw32_HOST_OS + {- In order to stop helper processes like rsync, + - kill the whole process group of the process + - running the transfer. -} + g <- getProcessGroupIDOf pid + let signal sig = void $ tryIO $ signalProcessGroup sig g + signal sigTERM + threadDelay 50000 -- 0.05 second grace period + signal sigKILL +#else + terminatePID pid +#endif + +{- Start or resume a transfer. -} +startTransfer :: Transfer -> Assistant () +startTransfer t = do + m <- getCurrentTransfers + maybe startqueued go (M.lookup t m) + where + go info = maybe (start info) resume $ transferTid info + startqueued = do + is <- map snd <$> getMatchingTransfers (== t) + maybe noop start $ headMaybe is + resume tid = do + alterTransferInfo t $ \i -> i { transferPaused = False } + liftIO $ throwTo tid ResumeTransfer + start info = do + program <- liftIO readProgramFile + batchmaker <- liftIO getBatchCommandMaker + inImmediateTransferSlot program batchmaker $ + genTransfer t info + +getCurrentTransfers :: Assistant TransferMap +getCurrentTransfers = currentTransfers <$> getDaemonStatus diff --git a/Assistant/TransferrerPool.hs b/Assistant/TransferrerPool.hs new file mode 100644 index 0000000000..6ad9b6b997 --- /dev/null +++ b/Assistant/TransferrerPool.hs @@ -0,0 +1,97 @@ +{- A pool of "git-annex transferkeys" processes + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Assistant.TransferrerPool where + +import Assistant.Common +import Assistant.Types.TransferrerPool +import Logs.Transfer +import Utility.Batch + +import qualified Command.TransferKeys as T + +import Control.Concurrent.STM hiding (check) +import System.Process (create_group, std_in, std_out) +import Control.Exception (throw) +import Control.Concurrent + +{- Runs an action with a Transferrer from the pool. + - + - Only one Transferrer is left running in the pool at a time. + - So if this needed to start a new Transferrer, it's stopped when done. + -} +withTransferrer :: FilePath -> BatchCommandMaker -> TransferrerPool -> (Transferrer -> IO a) -> IO a +withTransferrer program batchmaker pool a = do + (mi, leftinpool) <- atomically (popTransferrerPool pool) + i@(TransferrerPoolItem (Just t) check) <- case mi of + Nothing -> mkTransferrerPoolItem pool =<< mkTransferrer program batchmaker + Just i -> checkTransferrerPoolItem program batchmaker i + v <- tryNonAsync $ a t + if leftinpool == 0 + then atomically $ pushTransferrerPool pool i + else do + void $ forkIO $ stopTransferrer t + atomically $ pushTransferrerPool pool $ TransferrerPoolItem Nothing check + either throw return v + +{- Check if a Transferrer from the pool is still ok to be used. + - If not, stop it and start a new one. -} +checkTransferrerPoolItem :: FilePath -> BatchCommandMaker -> TransferrerPoolItem -> IO TransferrerPoolItem +checkTransferrerPoolItem program batchmaker i = case i of + TransferrerPoolItem (Just t) check -> ifM check + ( return i + , do + stopTransferrer t + new check + ) + TransferrerPoolItem Nothing check -> new check + where + new check = do + t <- mkTransferrer program batchmaker + return $ TransferrerPoolItem (Just t) check + +{- Requests that a Transferrer perform a Transfer, and waits for it to + - finish. -} +performTransfer :: Transferrer -> Transfer -> AssociatedFile -> IO Bool +performTransfer transferrer t f = catchBoolIO $ do + T.sendRequest t f (transferrerWrite transferrer) + T.readResponse (transferrerRead transferrer) + +{- Starts a new git-annex transferkeys process, setting up handles + - that will be used to communicate with it. -} +mkTransferrer :: FilePath -> BatchCommandMaker -> IO Transferrer +mkTransferrer program batchmaker = do + {- It runs as a batch job. -} + let (program', params') = batchmaker (program, [Param "transferkeys"]) + {- It's put into its own group so that the whole group can be + - killed to stop a transfer. -} + (Just writeh, Just readh, _, pid) <- createProcess + (proc program' $ toCommand params') + { create_group = True + , std_in = CreatePipe + , std_out = CreatePipe + } + fileEncoding readh + fileEncoding writeh + return $ Transferrer + { transferrerRead = readh + , transferrerWrite = writeh + , transferrerHandle = pid + } + +{- Checks if a Transferrer is still running. If not, makes a new one. -} +checkTransferrer :: FilePath -> BatchCommandMaker -> Transferrer -> IO Transferrer +checkTransferrer program batchmaker t = + maybe (return t) (const $ mkTransferrer program batchmaker) + =<< getProcessExitCode (transferrerHandle t) + +{- Closing the fds will stop the transferrer. -} +stopTransferrer :: Transferrer -> IO () +stopTransferrer t = do + hClose $ transferrerRead t + hClose $ transferrerWrite t + void $ waitForProcess $ transferrerHandle t diff --git a/Assistant/Types/Alert.hs b/Assistant/Types/Alert.hs new file mode 100644 index 0000000000..19fe55e6e2 --- /dev/null +++ b/Assistant/Types/Alert.hs @@ -0,0 +1,79 @@ +{- git-annex assistant alert types + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Assistant.Types.Alert where + +import Utility.Tense + +import Data.Text (Text) +import qualified Data.Map as M + +{- Different classes of alerts are displayed differently. -} +data AlertClass = Success | Message | Activity | Warning | Error + deriving (Eq, Ord) + +data AlertPriority = Filler | Low | Medium | High | Pinned + deriving (Eq, Ord) + +{- An alert can have an name, which is used to combine it with other similar + - alerts. -} +data AlertName + = FileAlert TenseChunk + | SanityCheckFixAlert + | WarningAlert String + | PairAlert String + | XMPPNeededAlert + | RemoteRemovalAlert String + | CloudRepoNeededAlert + | SyncAlert + | NotFsckedAlert + | UpgradeAlert + | UnusedFilesAlert + deriving (Eq) + +{- The first alert is the new alert, the second is an old alert. + - Should return a modified version of the old alert. -} +type AlertCombiner = Alert -> Alert -> Maybe Alert + +data Alert = Alert + { alertClass :: AlertClass + , alertHeader :: Maybe TenseText + , alertMessageRender :: Alert -> TenseText + , alertData :: [TenseChunk] + , alertCounter :: Int + , alertBlockDisplay :: Bool + , alertClosable :: Bool + , alertPriority :: AlertPriority + , alertIcon :: Maybe AlertIcon + , alertCombiner :: Maybe AlertCombiner + , alertName :: Maybe AlertName + , alertButtons :: [AlertButton] + } + +data AlertIcon = ActivityIcon | SyncIcon | SuccessIcon | ErrorIcon | InfoIcon | UpgradeIcon | TheCloud + +type AlertMap = M.Map AlertId Alert + +{- Higher AlertId indicates a more recent alert. -} +newtype AlertId = AlertId Integer + deriving (Read, Show, Eq, Ord) + +firstAlertId :: AlertId +firstAlertId = AlertId 0 + +nextAlertId :: AlertId -> AlertId +nextAlertId (AlertId i) = AlertId $ succ i + +{- When clicked, a button always redirects to a URL + - It may also run an IO action in the background, which is useful + - to make the button close or otherwise change the alert. -} +data AlertButton = AlertButton + { buttonLabel :: Text + , buttonUrl :: Text + , buttonAction :: Maybe (AlertId -> IO ()) + , buttonPrimary :: Bool + } diff --git a/Assistant/Types/BranchChange.hs b/Assistant/Types/BranchChange.hs new file mode 100644 index 0000000000..399abee54d --- /dev/null +++ b/Assistant/Types/BranchChange.hs @@ -0,0 +1,19 @@ +{- git-annex assistant git-annex branch change tracking + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Assistant.Types.BranchChange where + +import Control.Concurrent.MSampleVar +import Common.Annex + +newtype BranchChangeHandle = BranchChangeHandle (MSampleVar ()) + +newBranchChangeHandle :: IO BranchChangeHandle +newBranchChangeHandle = BranchChangeHandle <$> newEmptySV + +fromBranchChangeHandle :: BranchChangeHandle -> MSampleVar () +fromBranchChangeHandle (BranchChangeHandle v) = v diff --git a/Assistant/Types/Buddies.hs b/Assistant/Types/Buddies.hs new file mode 100644 index 0000000000..36d8a4fedc --- /dev/null +++ b/Assistant/Types/Buddies.hs @@ -0,0 +1,80 @@ +{- git-annex assistant buddies + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Assistant.Types.Buddies where + +import Common.Annex + +import qualified Data.Map as M +import Control.Concurrent.STM +import Utility.NotificationBroadcaster +import Data.Text as T + +{- For simplicity, dummy types are defined even when XMPP is disabled. -} +#ifdef WITH_XMPP +import Network.Protocol.XMPP +import Data.Set as S +import Data.Ord + +newtype Client = Client JID + deriving (Eq, Show) + +instance Ord Client where + compare = comparing show + +data Buddy = Buddy + { buddyPresent :: S.Set Client + , buddyAway :: S.Set Client + , buddyAssistants :: S.Set Client + , buddyPairing :: Bool + } +#else +data Buddy = Buddy +#endif + deriving (Eq, Show) + +data BuddyKey = BuddyKey T.Text + deriving (Eq, Ord, Show, Read) + +data PairKey = PairKey UUID T.Text + deriving (Eq, Ord, Show, Read) + +type Buddies = M.Map BuddyKey Buddy + +{- A list of buddies, and a way to notify when it changes. -} +type BuddyList = (TMVar Buddies, NotificationBroadcaster) + +noBuddies :: Buddies +noBuddies = M.empty + +newBuddyList :: IO BuddyList +newBuddyList = (,) + <$> atomically (newTMVar noBuddies) + <*> newNotificationBroadcaster + +getBuddyList :: BuddyList -> IO [Buddy] +getBuddyList (v, _) = M.elems <$> atomically (readTMVar v) + +getBuddy :: BuddyKey -> BuddyList -> IO (Maybe Buddy) +getBuddy k (v, _) = M.lookup k <$> atomically (readTMVar v) + +getBuddyBroadcaster :: BuddyList -> NotificationBroadcaster +getBuddyBroadcaster (_, h) = h + +{- Applies a function to modify the buddy list, and if it's changed, + - sends notifications to any listeners. -} +updateBuddyList :: (Buddies -> Buddies) -> BuddyList -> IO () +updateBuddyList a (v, caster) = do + changed <- atomically $ do + buds <- takeTMVar v + let buds' = a buds + putTMVar v buds' + return $ buds /= buds' + when changed $ + sendNotification caster diff --git a/Assistant/Types/Changes.hs b/Assistant/Types/Changes.hs new file mode 100644 index 0000000000..e8ecc6e48b --- /dev/null +++ b/Assistant/Types/Changes.hs @@ -0,0 +1,77 @@ +{- git-annex assistant change tracking + - + - Copyright 2012-2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Assistant.Types.Changes where + +import Types.KeySource +import Types.Key +import Utility.TList + +import Control.Concurrent.STM +import Data.Time.Clock + +{- An un-ordered pool of Changes that have been noticed and should be + - staged and committed. Changes will typically be in order, but ordering + - may be lost. In any case, order should not matter, as any given Change + - may later be reverted by a later Change (ie, a file is added and then + - deleted). Code that processes the changes needs to deal with such + - scenarios. + -} +type ChangePool = TList Change + +newChangePool :: IO ChangePool +newChangePool = atomically newTList + +data Change + = Change + { changeTime :: UTCTime + , _changeFile :: FilePath + , changeInfo :: ChangeInfo + } + | PendingAddChange + { changeTime ::UTCTime + , _changeFile :: FilePath + } + | InProcessAddChange + { changeTime ::UTCTime + , keySource :: KeySource + } + deriving (Show) + +data ChangeInfo = AddKeyChange Key | AddFileChange | LinkChange (Maybe Key) | RmChange + deriving (Show, Eq, Ord) + +changeInfoKey :: ChangeInfo -> Maybe Key +changeInfoKey (AddKeyChange k) = Just k +changeInfoKey (LinkChange (Just k)) = Just k +changeInfoKey _ = Nothing + +changeFile :: Change -> FilePath +changeFile (Change _ f _) = f +changeFile (PendingAddChange _ f) = f +changeFile (InProcessAddChange _ ks) = keyFilename ks + +isPendingAddChange :: Change -> Bool +isPendingAddChange (PendingAddChange {}) = True +isPendingAddChange _ = False + +isInProcessAddChange :: Change -> Bool +isInProcessAddChange (InProcessAddChange {}) = True +isInProcessAddChange _ = False + +retryChange :: Change -> Change +retryChange (InProcessAddChange time ks) = + PendingAddChange time (keyFilename ks) +retryChange c = c + +finishedChange :: Change -> Key -> Change +finishedChange c@(InProcessAddChange { keySource = ks }) k = Change + { changeTime = changeTime c + , _changeFile = keyFilename ks + , changeInfo = AddKeyChange k + } +finishedChange c _ = c diff --git a/Assistant/Types/Commits.hs b/Assistant/Types/Commits.hs new file mode 100644 index 0000000000..500faa9011 --- /dev/null +++ b/Assistant/Types/Commits.hs @@ -0,0 +1,19 @@ +{- git-annex assistant commit tracking + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Assistant.Types.Commits where + +import Utility.TList + +import Control.Concurrent.STM + +type CommitChan = TList Commit + +data Commit = Commit + +newCommitChan :: IO CommitChan +newCommitChan = atomically newTList diff --git a/Assistant/Types/DaemonStatus.hs b/Assistant/Types/DaemonStatus.hs new file mode 100644 index 0000000000..a618c700d7 --- /dev/null +++ b/Assistant/Types/DaemonStatus.hs @@ -0,0 +1,119 @@ +{- git-annex assistant daemon status + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Assistant.Types.DaemonStatus where + +import Common.Annex +import Assistant.Pairing +import Utility.NotificationBroadcaster +import Logs.Transfer +import Assistant.Types.ThreadName +import Assistant.Types.NetMessager +import Assistant.Types.Alert +import Utility.Url + +import Control.Concurrent.STM +import Control.Concurrent.MVar +import Control.Concurrent.Async +import Data.Time.Clock.POSIX +import qualified Data.Map as M +import qualified Data.Set as S + +data DaemonStatus = DaemonStatus + -- All the named threads that comprise the daemon, + -- and actions to run to restart them. + { startedThreads :: M.Map ThreadName (Async (), IO ()) + -- False when the daemon is performing its startup scan + , scanComplete :: Bool + -- True when all files should be restaged. + , forceRestage :: Bool + -- Time when a previous process of the daemon was running ok + , lastRunning :: Maybe POSIXTime + -- True when the daily sanity checker is running + , sanityCheckRunning :: Bool + -- Last time the daily sanity checker ran + , lastSanityCheck :: Maybe POSIXTime + -- True when a scan for file transfers is running + , transferScanRunning :: Bool + -- Currently running file content transfers + , currentTransfers :: TransferMap + -- Messages to display to the user. + , alertMap :: AlertMap + , lastAlertId :: AlertId + -- Ordered list of all remotes that can be synced with + , syncRemotes :: [Remote] + -- Ordered list of remotes to sync git with + , syncGitRemotes :: [Remote] + -- Ordered list of remotes to sync data with + , syncDataRemotes :: [Remote] + -- Are we syncing to any cloud remotes? + , syncingToCloudRemote :: Bool + -- List of uuids of remotes that we may have gotten out of sync with. + , desynced :: S.Set UUID + -- Pairing request that is in progress. + , pairingInProgress :: Maybe PairingInProgress + -- Broadcasts notifications about all changes to the DaemonStatus. + , changeNotifier :: NotificationBroadcaster + -- Broadcasts notifications when queued or current transfers change. + , transferNotifier :: NotificationBroadcaster + -- Broadcasts notifications when there's a change to the alerts. + , alertNotifier :: NotificationBroadcaster + -- Broadcasts notifications when the syncRemotes change. + , syncRemotesNotifier :: NotificationBroadcaster + -- Broadcasts notifications when the scheduleLog changes. + , scheduleLogNotifier :: NotificationBroadcaster + -- Broadcasts a notification once the startup sanity check has run. + , startupSanityCheckNotifier :: NotificationBroadcaster + -- Broadcasts notifications when the network is connected. + , networkConnectedNotifier :: NotificationBroadcaster + -- Broadcasts notifications when a global redirect is needed. + , globalRedirNotifier :: NotificationBroadcaster + , globalRedirUrl :: Maybe URLString + -- Actions to run after a Key is transferred. + , transferHook :: M.Map Key (Transfer -> IO ()) + -- When the XMPP client is connected, this will contain the XMPP + -- address. + , xmppClientID :: Maybe ClientID + -- MVars to signal when a remote gets connected. + , connectRemoteNotifiers :: M.Map UUID [MVar ()] + } + +type TransferMap = M.Map Transfer TransferInfo + +{- This TMVar is never left empty, so accessing it will never block. -} +type DaemonStatusHandle = TMVar DaemonStatus + +newDaemonStatus :: IO DaemonStatus +newDaemonStatus = DaemonStatus + <$> pure M.empty + <*> pure False + <*> pure False + <*> pure Nothing + <*> pure False + <*> pure Nothing + <*> pure False + <*> pure M.empty + <*> pure M.empty + <*> pure firstAlertId + <*> pure [] + <*> pure [] + <*> pure [] + <*> pure False + <*> pure S.empty + <*> pure Nothing + <*> newNotificationBroadcaster + <*> newNotificationBroadcaster + <*> newNotificationBroadcaster + <*> newNotificationBroadcaster + <*> newNotificationBroadcaster + <*> newNotificationBroadcaster + <*> newNotificationBroadcaster + <*> newNotificationBroadcaster + <*> pure Nothing + <*> pure M.empty + <*> pure Nothing + <*> pure M.empty diff --git a/Assistant/Types/NamedThread.hs b/Assistant/Types/NamedThread.hs new file mode 100644 index 0000000000..5dd1364ad2 --- /dev/null +++ b/Assistant/Types/NamedThread.hs @@ -0,0 +1,21 @@ +{- named threads + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Assistant.Types.NamedThread where + +import Assistant.Monad +import Assistant.Types.ThreadName + +{- Information about a named thread that can be run. -} +data NamedThread = NamedThread Bool ThreadName (Assistant ()) + +namedThread :: String -> Assistant () -> NamedThread +namedThread = NamedThread True . ThreadName + +{- A named thread that can start running before the startup sanity check. -} +namedThreadUnchecked :: String -> Assistant () -> NamedThread +namedThreadUnchecked = NamedThread False . ThreadName diff --git a/Assistant/Types/NetMessager.hs b/Assistant/Types/NetMessager.hs new file mode 100644 index 0000000000..41ab4b272f --- /dev/null +++ b/Assistant/Types/NetMessager.hs @@ -0,0 +1,155 @@ +{- git-annex assistant out of band network messager types + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Assistant.Types.NetMessager where + +import Common.Annex +import Assistant.Pairing +import Git.Types + +import qualified Data.Text as T +import qualified Data.Set as S +import qualified Data.Map as M +import qualified Data.DList as D +import Control.Concurrent.STM +import Control.Concurrent.MSampleVar +import Data.ByteString (ByteString) +import qualified Data.ByteString.Char8 as B8 +import Data.Text (Text) + +{- Messages that can be sent out of band by a network messager. -} +data NetMessage + -- indicate that pushes have been made to the repos with these uuids + = NotifyPush [UUID] + -- requests other clients to inform us of their presence + | QueryPresence + -- notification about a stage in the pairing process, + -- involving a client, and a UUID. + | PairingNotification PairStage ClientID UUID + -- used for git push over the network messager + | Pushing ClientID PushStage + deriving (Eq, Ord, Show) + +{- Something used to identify the client, or clients to send the message to. -} +type ClientID = Text + +data PushStage + -- indicates that we have data to push over the out of band network + = CanPush UUID [Sha] + -- request that a git push be sent over the out of band network + | PushRequest UUID + -- indicates that a push is starting + | StartingPush UUID + -- a chunk of output of git receive-pack + | ReceivePackOutput SequenceNum ByteString + -- a chuck of output of git send-pack + | SendPackOutput SequenceNum ByteString + -- sent when git receive-pack exits, with its exit code + | ReceivePackDone ExitCode + deriving (Eq, Ord, Show) + +{- A sequence number. Incremented by one per packet in a sequence, + - starting with 1 for the first packet. 0 means sequence numbers are + - not being used. -} +type SequenceNum = Int + +{- NetMessages that are important (and small), and should be stored to be + - resent when new clients are seen. -} +isImportantNetMessage :: NetMessage -> Maybe ClientID +isImportantNetMessage (Pushing c (CanPush _ _)) = Just c +isImportantNetMessage (Pushing c (PushRequest _)) = Just c +isImportantNetMessage _ = Nothing + +{- Checks if two important NetMessages are equivilant. + - That is to say, assuming they were sent to the same client, + - would it do the same thing for one as for the other? -} +equivilantImportantNetMessages :: NetMessage -> NetMessage -> Bool +equivilantImportantNetMessages (Pushing _ (CanPush _ _)) (Pushing _ (CanPush _ _)) = True +equivilantImportantNetMessages (Pushing _ (PushRequest _)) (Pushing _ (PushRequest _)) = True +equivilantImportantNetMessages _ _ = False + +readdressNetMessage :: NetMessage -> ClientID -> NetMessage +readdressNetMessage (PairingNotification stage _ uuid) c = PairingNotification stage c uuid +readdressNetMessage (Pushing _ stage) c = Pushing c stage +readdressNetMessage m _ = m + +{- Convert a NetMessage to something that can be logged. -} +logNetMessage :: NetMessage -> String +logNetMessage (Pushing c stage) = show $ Pushing (logClientID c) $ + case stage of + ReceivePackOutput n _ -> ReceivePackOutput n elided + SendPackOutput n _ -> SendPackOutput n elided + s -> s + where + elided = B8.pack "" +logNetMessage (PairingNotification stage c uuid) = + show $ PairingNotification stage (logClientID c) uuid +logNetMessage m = show m + +logClientID :: ClientID -> ClientID +logClientID c = T.concat [T.take 1 c, T.pack $ show $ T.length c] + +{- Things that initiate either side of a push, but do not actually send data. -} +isPushInitiation :: PushStage -> Bool +isPushInitiation (PushRequest _) = True +isPushInitiation (StartingPush _) = True +isPushInitiation _ = False + +isPushNotice :: PushStage -> Bool +isPushNotice (CanPush _ _) = True +isPushNotice _ = False + +data PushSide = SendPack | ReceivePack + deriving (Eq, Ord, Show) + +pushDestinationSide :: PushStage -> PushSide +pushDestinationSide (CanPush _ _) = ReceivePack +pushDestinationSide (PushRequest _) = SendPack +pushDestinationSide (StartingPush _) = ReceivePack +pushDestinationSide (ReceivePackOutput _ _) = SendPack +pushDestinationSide (SendPackOutput _ _) = ReceivePack +pushDestinationSide (ReceivePackDone _) = SendPack + +type SideMap a = PushSide -> a + +mkSideMap :: STM a -> IO (SideMap a) +mkSideMap gen = do + (sp, rp) <- atomically $ (,) <$> gen <*> gen + return $ lookupside sp rp + where + lookupside sp _ SendPack = sp + lookupside _ rp ReceivePack = rp + +getSide :: PushSide -> SideMap a -> a +getSide side m = m side + +type Inboxes = TVar (M.Map ClientID (Int, D.DList NetMessage)) + +data NetMessager = NetMessager + -- outgoing messages + { netMessages :: TChan NetMessage + -- important messages for each client + , importantNetMessages :: TMVar (M.Map ClientID (S.Set NetMessage)) + -- important messages that are believed to have been sent to a client + , sentImportantNetMessages :: TMVar (M.Map ClientID (S.Set NetMessage)) + -- write to this to restart the net messager + , netMessagerRestart :: MSampleVar () + -- queue of incoming messages that request the initiation of pushes + , netMessagerPushInitiations :: SideMap (TMVar [NetMessage]) + -- incoming messages containing data for a running + -- (or not yet started) push + , netMessagerInboxes :: SideMap Inboxes + } + +newNetMessager :: IO NetMessager +newNetMessager = NetMessager + <$> atomically newTChan + <*> atomically (newTMVar M.empty) + <*> atomically (newTMVar M.empty) + <*> newEmptySV + <*> mkSideMap newEmptyTMVar + <*> mkSideMap (newTVar M.empty) diff --git a/Assistant/Types/Pushes.hs b/Assistant/Types/Pushes.hs new file mode 100644 index 0000000000..99e0ee1628 --- /dev/null +++ b/Assistant/Types/Pushes.hs @@ -0,0 +1,24 @@ +{- git-annex assistant push tracking + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Assistant.Types.Pushes where + +import Common.Annex + +import Control.Concurrent.STM +import Data.Time.Clock +import qualified Data.Map as M + +{- Track the most recent push failure for each remote. -} +type PushMap = M.Map Remote UTCTime +type FailedPushMap = TMVar PushMap + +{- The TMVar starts empty, and is left empty when there are no + - failed pushes. This way we can block until there are some failed pushes. + -} +newFailedPushMap :: IO FailedPushMap +newFailedPushMap = atomically newEmptyTMVar diff --git a/Assistant/Types/RepoProblem.hs b/Assistant/Types/RepoProblem.hs new file mode 100644 index 0000000000..ece5a52868 --- /dev/null +++ b/Assistant/Types/RepoProblem.hs @@ -0,0 +1,28 @@ +{- git-annex assistant repository problem tracking + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Assistant.Types.RepoProblem where + +import Types +import Utility.TList + +import Control.Concurrent.STM +import Data.Function + +data RepoProblem = RepoProblem + { problemUUID :: UUID + , afterFix :: IO () + } + +{- The afterFix actions are assumed to all be equivilant. -} +sameRepoProblem :: RepoProblem -> RepoProblem -> Bool +sameRepoProblem = (==) `on` problemUUID + +type RepoProblemChan = TList RepoProblem + +newRepoProblemChan :: IO RepoProblemChan +newRepoProblemChan = atomically newTList diff --git a/Assistant/Types/ScanRemotes.hs b/Assistant/Types/ScanRemotes.hs new file mode 100644 index 0000000000..8219f9baf1 --- /dev/null +++ b/Assistant/Types/ScanRemotes.hs @@ -0,0 +1,25 @@ +{- git-annex assistant remotes needing scanning + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Assistant.Types.ScanRemotes where + +import Common.Annex + +import Control.Concurrent.STM +import qualified Data.Map as M + +data ScanInfo = ScanInfo + { scanPriority :: Float + , fullScan :: Bool + } + +type ScanRemoteMap = TMVar (M.Map Remote ScanInfo) + +{- The TMVar starts empty, and is left empty when there are no remotes + - to scan. -} +newScanRemoteMap :: IO ScanRemoteMap +newScanRemoteMap = atomically newEmptyTMVar diff --git a/Assistant/Types/ThreadName.hs b/Assistant/Types/ThreadName.hs new file mode 100644 index 0000000000..c8d264a381 --- /dev/null +++ b/Assistant/Types/ThreadName.hs @@ -0,0 +1,14 @@ +{- name of a thread + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Assistant.Types.ThreadName where + +newtype ThreadName = ThreadName String + deriving (Eq, Read, Show, Ord) + +fromThreadName :: ThreadName -> String +fromThreadName (ThreadName n) = n diff --git a/Assistant/Types/ThreadedMonad.hs b/Assistant/Types/ThreadedMonad.hs new file mode 100644 index 0000000000..1a2aa7eb7f --- /dev/null +++ b/Assistant/Types/ThreadedMonad.hs @@ -0,0 +1,38 @@ +{- making the Annex monad available across threads + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Assistant.Types.ThreadedMonad where + +import Common.Annex +import qualified Annex + +import Control.Concurrent +import Data.Tuple + +{- The Annex state is stored in a MVar, so that threaded actions can access + - it. -} +type ThreadState = MVar Annex.AnnexState + +{- Stores the Annex state in a MVar. + - + - Once the action is finished, retrieves the state from the MVar. + -} +withThreadState :: (ThreadState -> Annex a) -> Annex a +withThreadState a = do + state <- Annex.getState id + mvar <- liftIO $ newMVar state + r <- a mvar + newstate <- liftIO $ takeMVar mvar + Annex.changeState (const newstate) + return r + +{- Runs an Annex action, using the state from the MVar. + - + - This serializes calls by threads; only one thread can run in Annex at a + - time. -} +runThreadState :: ThreadState -> Annex a -> IO a +runThreadState mvar a = modifyMVar mvar $ \state -> swap <$> Annex.run state a diff --git a/Assistant/Types/TransferQueue.hs b/Assistant/Types/TransferQueue.hs new file mode 100644 index 0000000000..e4bf2ae922 --- /dev/null +++ b/Assistant/Types/TransferQueue.hs @@ -0,0 +1,29 @@ +{- git-annex assistant pending transfer queue + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Assistant.Types.TransferQueue where + +import Common.Annex +import Logs.Transfer + +import Control.Concurrent.STM +import Utility.TList + +data TransferQueue = TransferQueue + { queuesize :: TVar Int + , queuelist :: TList (Transfer, TransferInfo) + , deferreddownloads :: TList (Key, AssociatedFile) + } + +data Schedule = Next | Later + deriving (Eq) + +newTransferQueue :: IO TransferQueue +newTransferQueue = atomically $ TransferQueue + <$> newTVar 0 + <*> newTList + <*> newTList diff --git a/Assistant/Types/TransferSlots.hs b/Assistant/Types/TransferSlots.hs new file mode 100644 index 0000000000..5140995a37 --- /dev/null +++ b/Assistant/Types/TransferSlots.hs @@ -0,0 +1,34 @@ +{- git-annex assistant transfer slots + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE DeriveDataTypeable #-} + +module Assistant.Types.TransferSlots where + +import qualified Control.Exception as E +import qualified Control.Concurrent.MSemN as MSemN +import Data.Typeable + +type TransferSlots = MSemN.MSemN Int + +{- A special exception that can be thrown to pause or resume a transfer, while + - keeping its slot in use. -} +data TransferException = PauseTransfer | ResumeTransfer + deriving (Show, Eq, Typeable) + +instance E.Exception TransferException + +{- Number of concurrent transfers allowed to be run from the assistant. + - + - Transfers launched by other means, including by remote assistants, + - do not currently take up slots. + -} +numSlots :: Int +numSlots = 1 + +newTransferSlots :: IO TransferSlots +newTransferSlots = MSemN.new numSlots diff --git a/Assistant/Types/TransferrerPool.hs b/Assistant/Types/TransferrerPool.hs new file mode 100644 index 0000000000..b66fdfa13e --- /dev/null +++ b/Assistant/Types/TransferrerPool.hs @@ -0,0 +1,67 @@ +{- A pool of "git-annex transferkeys" processes available for use + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Assistant.Types.TransferrerPool where + +import Common.Annex +import Utility.NotificationBroadcaster +import Assistant.Types.DaemonStatus + +import Control.Concurrent.STM hiding (check) + +{- This TMVar is never left empty. -} +type TransferrerPool = TMVar (MkCheckTransferrer, [TransferrerPoolItem]) + +type CheckTransferrer = IO Bool +type MkCheckTransferrer = IO (IO Bool) + +{- Each item in the pool may have a transferrer running, and has an + - IO action that can be used to check if it's still ok to use the + - transferrer. -} +data TransferrerPoolItem = TransferrerPoolItem (Maybe Transferrer) CheckTransferrer + +data Transferrer = Transferrer + { transferrerRead :: Handle + , transferrerWrite :: Handle + , transferrerHandle :: ProcessHandle + } + +newTransferrerPool :: MkCheckTransferrer -> IO TransferrerPool +newTransferrerPool c = newTMVarIO (c, []) + +popTransferrerPool :: TransferrerPool -> STM (Maybe TransferrerPoolItem, Int) +popTransferrerPool p = do + (c, l) <- takeTMVar p + case l of + [] -> do + putTMVar p (c, []) + return (Nothing, 0) + (i:is) -> do + putTMVar p (c, is) + return $ (Just i, length is) + +pushTransferrerPool :: TransferrerPool -> TransferrerPoolItem -> STM () +pushTransferrerPool p i = do + (c, l) <- takeTMVar p + let l' = i:l + putTMVar p (c, l') + +{- Note that making a CheckTransferrer may allocate resources, + - such as a NotificationHandle, so it's important that the returned + - TransferrerPoolItem is pushed into the pool, and not left to be + - garbage collected. -} +mkTransferrerPoolItem :: TransferrerPool -> Transferrer -> IO TransferrerPoolItem +mkTransferrerPoolItem p t = do + mkcheck <- atomically $ fst <$> readTMVar p + check <- mkcheck + return $ TransferrerPoolItem (Just t) check + +checkNetworkConnections :: DaemonStatusHandle -> MkCheckTransferrer +checkNetworkConnections dstatushandle = do + dstatus <- atomically $ readTMVar dstatushandle + h <- newNotificationHandle False (networkConnectedNotifier dstatus) + return $ not <$> checkNotification h diff --git a/Assistant/Types/UrlRenderer.hs b/Assistant/Types/UrlRenderer.hs new file mode 100644 index 0000000000..521905bf3c --- /dev/null +++ b/Assistant/Types/UrlRenderer.hs @@ -0,0 +1,26 @@ +{- webapp url renderer access from the assistant + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Assistant.Types.UrlRenderer ( + UrlRenderer, + newUrlRenderer +) where + +#ifdef WITH_WEBAPP + +import Assistant.WebApp (UrlRenderer, newUrlRenderer) + +#else + +data UrlRenderer = UrlRenderer -- dummy type + +newUrlRenderer :: IO UrlRenderer +newUrlRenderer = return UrlRenderer + +#endif diff --git a/Assistant/Unused.hs b/Assistant/Unused.hs new file mode 100644 index 0000000000..3ad98c12e2 --- /dev/null +++ b/Assistant/Unused.hs @@ -0,0 +1,86 @@ +{- git-annex assistant unused files + - + - Copyright 2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE OverloadedStrings #-} + +module Assistant.Unused where + +import qualified Data.Map as M + +import Assistant.Common +import qualified Git +import Types.Key +import Logs.Unused +import Logs.Location +import Annex.Content +import Utility.DataUnits +import Utility.DiskFree +import Utility.HumanTime +import Utility.Tense + +import Data.Time.Clock.POSIX +import qualified Data.Text as T + +describeUnused :: Assistant (Maybe TenseText) +describeUnused = describeUnused' False + +describeUnusedWhenBig :: Assistant (Maybe TenseText) +describeUnusedWhenBig = describeUnused' True + +{- This uses heuristics: 1000 unused keys, or more unused keys + - than the remaining free disk space, or more than 1/10th the total + - disk space being unused keys all suggest a problem. -} +describeUnused' :: Bool -> Assistant (Maybe TenseText) +describeUnused' whenbig = liftAnnex $ go =<< readUnusedLog "" + where + go m = do + let num = M.size m + let diskused = foldl' sumkeysize 0 (M.keys m) + df <- forpath getDiskFree + disksize <- forpath getDiskSize + return $ if num == 0 + then Nothing + else if not whenbig || moreused df diskused || tenthused disksize diskused + then Just $ tenseWords + [ UnTensed $ T.pack $ roughSize storageUnits False diskused + , Tensed "are" "were" + , "taken up by unused files" + ] + else if num > 1000 + then Just $ tenseWords + [ UnTensed $ T.pack $ show num ++ " unused files" + , Tensed "exist" "existed" + ] + else Nothing + + moreused Nothing _ = False + moreused (Just df) used = df <= used + + tenthused Nothing _ = False + tenthused (Just disksize) used = used >= disksize `div` 10 + + sumkeysize s k = s + fromMaybe 0 (keySize k) + + forpath a = inRepo $ liftIO . a . Git.repoPath + +{- With a duration, expires all unused files that are older. + - With Nothing, expires *all* unused files. -} +expireUnused :: Maybe Duration -> Assistant () +expireUnused duration = do + m <- liftAnnex $ readUnusedLog "" + now <- liftIO getPOSIXTime + let oldkeys = M.keys $ M.filter (tooold now) m + forM_ oldkeys $ \k -> do + debug ["removing old unused key", key2file k] + liftAnnex $ do + removeAnnex k + logStatus k InfoMissing + where + boundry = durationToPOSIXTime <$> duration + tooold now (_, mt) = case boundry of + Nothing -> True + Just b -> maybe False (\t -> now - t >= b) mt diff --git a/Assistant/Upgrade.hs b/Assistant/Upgrade.hs new file mode 100644 index 0000000000..aaf6a8478b --- /dev/null +++ b/Assistant/Upgrade.hs @@ -0,0 +1,315 @@ +{- git-annex assistant upgrading + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU AGPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Assistant.Upgrade where + +import Assistant.Common +import Assistant.Restart +import qualified Annex +import Assistant.Alert +import Assistant.DaemonStatus +import Utility.Env +import Types.Distribution +import Logs.Transfer +import Logs.Web +import Logs.Presence +import Logs.Location +import Annex.Content +import qualified Backend +import qualified Types.Backend +import qualified Types.Key +import Assistant.TransferQueue +import Assistant.TransferSlots +import Remote (remoteFromUUID) +import Annex.Path +import Config.Files +import Utility.ThreadScheduler +import Utility.Tmp +import Utility.UserInfo +import qualified Utility.Lsof as Lsof + +import qualified Data.Map as M +import Data.Tuple.Utils + +{- Upgrade without interaction in the webapp. -} +unattendedUpgrade :: Assistant () +unattendedUpgrade = do + prepUpgrade + url <- runRestart + postUpgrade url + +prepUpgrade :: Assistant () +prepUpgrade = do + void $ addAlert upgradingAlert + void $ liftIO $ setEnv upgradedEnv "1" True + prepRestart + +postUpgrade :: URLString -> Assistant () +postUpgrade = postRestart + +autoUpgradeEnabled :: Assistant Bool +autoUpgradeEnabled = liftAnnex $ (==) AutoUpgrade . annexAutoUpgrade <$> Annex.getGitConfig + +checkSuccessfulUpgrade :: IO Bool +checkSuccessfulUpgrade = isJust <$> getEnv upgradedEnv + +upgradedEnv :: String +upgradedEnv = "GIT_ANNEX_UPGRADED" + +{- Start downloading the distribution key from the web. + - Install a hook that will be run once the download is complete, + - and finishes the upgrade. + - + - Creates the destination directory where the upgrade will be installed + - early, in order to check if another upgrade has happened (or is + - happending). On failure, the directory is removed. + -} +startDistributionDownload :: GitAnnexDistribution -> Assistant () +startDistributionDownload d = go =<< liftIO . newVersionLocation d =<< liftIO oldVersionLocation + where + go Nothing = debug ["Skipping redundant upgrade"] + go (Just dest) = do + liftAnnex $ setUrlPresent k u + hook <- asIO1 $ distributionDownloadComplete d dest cleanup + modifyDaemonStatus_ $ \s -> s + { transferHook = M.insert k hook (transferHook s) } + maybe noop (queueTransfer "upgrade" Next (Just f) t) + =<< liftAnnex (remoteFromUUID webUUID) + startTransfer t + k = distributionKey d + u = distributionUrl d + f = takeFileName u ++ " (for upgrade)" + t = Transfer + { transferDirection = Download + , transferUUID = webUUID + , transferKey = k + } + cleanup = liftAnnex $ do + removeAnnex k + setUrlMissing k u + logStatus k InfoMissing + +{- Called once the download is done. + - Passed an action that can be used to clean up the downloaded file. + - + - Fsck the key to verify the download. + -} +distributionDownloadComplete :: GitAnnexDistribution -> FilePath -> Assistant () -> Transfer -> Assistant () +distributionDownloadComplete d dest cleanup t + | transferDirection t == Download = do + debug ["finished downloading git-annex distribution"] + maybe (failedupgrade "bad download") go + =<< liftAnnex (withObjectLoc k fsckit (getM fsckit)) + | otherwise = cleanup + where + k = distributionKey d + fsckit f = case Backend.maybeLookupBackendName (Types.Key.keyBackendName k) of + Nothing -> return $ Just f + Just b -> case Types.Backend.fsckKey b of + Nothing -> return $ Just f + Just a -> ifM (a k f) + ( return $ Just f + , return Nothing + ) + go f = do + ua <- asIO $ upgradeToDistribution dest cleanup f + fa <- asIO1 failedupgrade + liftIO $ ua `catchNonAsync` (fa . show) + failedupgrade msg = do + void $ addAlert $ upgradeFailedAlert msg + cleanup + liftIO $ void $ tryIO $ removeDirectoryRecursive dest + +{- The upgrade method varies by OS. + - + - In general, find where the distribution was installed before, + - and unpack the new distribution next to it (in a versioned directory). + - Then update the programFile to point to the new version. + -} +upgradeToDistribution :: FilePath -> Assistant () -> FilePath -> Assistant () +upgradeToDistribution newdir cleanup distributionfile = do + liftIO $ createDirectoryIfMissing True newdir + (program, deleteold) <- unpack + changeprogram program + cleanup + prepUpgrade + url <- runRestart + {- At this point, the new assistant is fully running, so + - it's safe to delete the old version. -} + liftIO $ void $ tryIO deleteold + postUpgrade url + where + changeprogram program = liftIO $ do + unlessM (boolSystem program [Param "version"]) $ + error "New git-annex program failed to run! Not using." + pf <- programFile + liftIO $ writeFile pf program + +#ifdef darwin_HOST_OS + {- OS X uses a dmg, so mount it, and copy the contents into place. -} + unpack = liftIO $ do + olddir <- oldVersionLocation + withTmpDirIn (parentDir newdir) "git-annex.upgrade" $ \tmpdir -> do + void $ boolSystem "hdiutil" + [ Param "attach", File distributionfile + , Param "-mountpoint", File tmpdir + ] + void $ boolSystem "cp" + [ Param "-R" + , File $ tmpdir installBase "Contents" + , File $ newdir + ] + void $ boolSystem "hdiutil" + [ Param "eject" + , File tmpdir + ] + sanitycheck newdir + let deleteold = do + deleteFromManifest $ olddir "Contents" "MacOS" + makeorigsymlink olddir + return (newdir "Contents" "MacOS" "git-annex", deleteold) +#else + {- Linux uses a tarball (so could other POSIX systems), so + - untar it (into a temp directory) and move the directory + - into place. -} + unpack = liftIO $ do + olddir <- oldVersionLocation + withTmpDirIn (parentDir newdir) "git-annex.upgrade" $ \tmpdir -> do + let tarball = tmpdir "tar" + -- Cannot rely on filename extension, and this also + -- avoids problems if tar doesn't support transparent + -- decompression. + void $ boolSystem "sh" + [ Param "-c" + , Param $ "zcat < " ++ shellEscape distributionfile ++ + " > " ++ shellEscape tarball + ] + tarok <- boolSystem "tar" + [ Param "xf" + , Param tarball + , Param "--directory", File tmpdir + ] + unless tarok $ + error $ "failed to untar " ++ distributionfile + sanitycheck $ tmpdir installBase + installby rename newdir (tmpdir installBase) + let deleteold = do + deleteFromManifest olddir + makeorigsymlink olddir + return (newdir "git-annex", deleteold) + installby a dstdir srcdir = + mapM_ (\x -> a x (dstdir takeFileName x)) + =<< dirContents srcdir +#endif + sanitycheck dir = + unlessM (doesDirectoryExist dir) $ + error $ "did not find " ++ dir ++ " in " ++ distributionfile + makeorigsymlink olddir = do + let origdir = parentDir olddir installBase + nukeFile origdir + createSymbolicLink newdir origdir + +{- Finds where the old version was installed. -} +oldVersionLocation :: IO FilePath +oldVersionLocation = do +#ifdef darwin_HOST_OS + pdir <- parentDir <$> readProgramFile + let dirs = splitDirectories pdir + {- It will probably be deep inside a git-annex.app directory. -} + let olddir = case findIndex ("git-annex.app" `isPrefixOf`) dirs of + Nothing -> pdir + Just i -> joinPath (take (i + 1) dirs) +#else + olddir <- parentDir <$> readProgramFile +#endif + when (null olddir) $ + error $ "Cannot find old distribution bundle; not upgrading." + return olddir + +{- Finds a place to install the new version. + - Generally, put it in the parent directory of where the old version was + - installed, and use a version number in the directory name. + - If unable to write to there, instead put it in the home directory. + - + - The directory is created. If it already exists, returns Nothing. + -} +newVersionLocation :: GitAnnexDistribution -> FilePath -> IO (Maybe FilePath) +newVersionLocation d olddir = + trymkdir newloc $ do + home <- myHomeDir + trymkdir (home s) $ + return Nothing + where + s = installBase ++ "." ++ distributionVersion d + topdir = parentDir olddir + newloc = topdir s + trymkdir dir fallback = + (createDirectory dir >> return (Just dir)) + `catchIO` const fallback + +installBase :: String +installBase = "git-annex." ++ +#ifdef linux_HOST_OS + "linux" +#else +#ifdef darwin_HOST_OS + "app" +#else + "dir" +#endif +#endif + +deleteFromManifest :: FilePath -> IO () +deleteFromManifest dir = do + fs <- map (dir ) . lines <$> catchDefaultIO "" (readFile manifest) + mapM_ nukeFile fs + nukeFile manifest + removeEmptyRecursive dir + where + manifest = dir "git-annex.MANIFEST" + +removeEmptyRecursive :: FilePath -> IO () +removeEmptyRecursive dir = do + mapM_ removeEmptyRecursive =<< dirContents dir + void $ tryIO $ removeDirectory dir + +{- This is a file that the UpgradeWatcher can watch for modifications to + - detect when git-annex has been upgraded. + -} +upgradeFlagFile :: IO (Maybe FilePath) +upgradeFlagFile = ifM usingDistribution + ( Just <$> programFile + , programPath + ) + +{- Sanity check to see if an upgrade is complete and the program is ready + - to be run. -} +upgradeSanityCheck :: IO Bool +upgradeSanityCheck = ifM usingDistribution + ( doesFileExist =<< programFile + , do + -- Ensure that the program is present, and has no writers, + -- and can be run. This should handle distribution + -- upgrades, manual upgrades, etc. + v <- programPath + case v of + Nothing -> return False + Just program -> do + untilM (doesFileExist program <&&> nowriter program) $ + threadDelaySeconds (Seconds 60) + boolSystem program [Param "version"] + ) + where + nowriter f = null + . filter (`elem` [Lsof.OpenReadWrite, Lsof.OpenWriteOnly]) + . map snd3 + <$> Lsof.query [f] + +usingDistribution :: IO Bool +usingDistribution = isJust <$> getEnv "GIT_ANNEX_STANDLONE_ENV" diff --git a/Assistant/WebApp.hs b/Assistant/WebApp.hs new file mode 100644 index 0000000000..e81a1d7120 --- /dev/null +++ b/Assistant/WebApp.hs @@ -0,0 +1,74 @@ +{- git-annex assistant webapp core + - + - Copyright 2012, 2013 Joey Hess + - + - Licensed under the GNU AGPL version 3 or higher. + -} + +{-# LANGUAGE TypeFamilies, QuasiQuotes, MultiParamTypeClasses #-} +{-# LANGUAGE TemplateHaskell, OverloadedStrings, RankNTypes #-} + +module Assistant.WebApp where + +import Assistant.WebApp.Types +import Assistant.Common +import Utility.NotificationBroadcaster +import Utility.Yesod +import Utility.WebApp + +import Data.Text (Text) +import Control.Concurrent +import qualified Network.Wai as W +import qualified Data.ByteString.Char8 as S8 +import qualified Data.Text as T + +waitNotifier :: Assistant NotificationBroadcaster -> NotificationId -> Handler () +waitNotifier getbroadcaster nid = liftAssistant $ do + b <- getbroadcaster + liftIO $ waitNotification $ notificationHandleFromId b nid + +newNotifier :: Assistant NotificationBroadcaster -> Handler NotificationId +newNotifier getbroadcaster = liftAssistant $ do + b <- getbroadcaster + liftIO $ notificationHandleToId <$> newNotificationHandle True b + +{- Adds the auth parameter as a hidden field on a form. Must be put into + - every form. -} +webAppFormAuthToken :: Widget +webAppFormAuthToken = do + webapp <- liftH getYesod + [whamlet||] + +{- A button with an icon, and maybe label or tooltip, that can be + - clicked to perform some action. + - With javascript, clicking it POSTs the Route, and remains on the same + - page. + - With noscript, clicking it GETs the Route. -} +actionButton :: Route WebApp -> (Maybe String) -> (Maybe String) -> String -> String -> Widget +actionButton route label tooltip buttonclass iconclass = $(widgetFile "actionbutton") + +type UrlRenderFunc = Route WebApp -> [(Text, Text)] -> Text +type UrlRenderer = MVar (UrlRenderFunc) + +newUrlRenderer :: IO UrlRenderer +newUrlRenderer = newEmptyMVar + +setUrlRenderer :: UrlRenderer -> (UrlRenderFunc) -> IO () +setUrlRenderer = putMVar + +inFirstRun :: Handler Bool +inFirstRun = isNothing . relDir <$> getYesod + +{- Blocks until the webapp is running and has called setUrlRenderer. -} +renderUrl :: UrlRenderer -> Route WebApp -> [(Text, Text)] -> IO Text +renderUrl urlrenderer route params = do + r <- readMVar urlrenderer + return $ r route params + +{- Redirects back to the referring page, or if there's none, DashboardR -} +redirectBack :: Handler () +redirectBack = do + mr <- lookup "referer" . W.requestHeaders <$> waiRequest + case mr of + Nothing -> redirect DashboardR + Just r -> redirect $ T.pack $ S8.unpack r diff --git a/Assistant/WebApp/Common.hs b/Assistant/WebApp/Common.hs new file mode 100644 index 0000000000..f7a49601f0 --- /dev/null +++ b/Assistant/WebApp/Common.hs @@ -0,0 +1,18 @@ +{- git-annex assistant webapp, common imports + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU AGPL version 3 or higher. + -} + +module Assistant.WebApp.Common (module X) where + +import Assistant.Common as X +import Assistant.WebApp as X +import Assistant.WebApp.Page as X +import Assistant.WebApp.Form as X +import Assistant.WebApp.Types as X +import Assistant.WebApp.RepoId as X +import Utility.Yesod as X hiding (textField, passwordField, insertBy, replace, joinPath, deleteBy, delete, insert, Key, Option) + +import Data.Text as X (Text) diff --git a/Assistant/WebApp/Configurators.hs b/Assistant/WebApp/Configurators.hs new file mode 100644 index 0000000000..625546dfee --- /dev/null +++ b/Assistant/WebApp/Configurators.hs @@ -0,0 +1,44 @@ +{- git-annex assistant webapp configurators + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU AGPL version 3 or higher. + -} + +{-# LANGUAGE QuasiQuotes, TemplateHaskell, OverloadedStrings, CPP #-} + +module Assistant.WebApp.Configurators where + +import Assistant.WebApp.Common +import Assistant.WebApp.RepoList +#ifdef WITH_XMPP +import Assistant.XMPP.Client +#endif + +{- The main configuration screen. -} +getConfigurationR :: Handler Html +getConfigurationR = ifM inFirstRun + ( redirect FirstRepositoryR + , page "Configuration" (Just Configuration) $ do +#ifdef WITH_XMPP + xmppconfigured <- liftAnnex $ isJust <$> getXMPPCreds +#else + let xmppconfigured = False +#endif + $(widgetFile "configurators/main") + ) + +getAddRepositoryR :: Handler Html +getAddRepositoryR = page "Add Repository" (Just Configuration) $ do + let repolist = repoListDisplay mainRepoSelector + $(widgetFile "configurators/addrepository") + +makeMiscRepositories :: Widget +makeMiscRepositories = $(widgetFile "configurators/addrepository/misc") + +makeCloudRepositories :: Widget +makeCloudRepositories = $(widgetFile "configurators/addrepository/cloud") + +makeArchiveRepositories :: Widget +makeArchiveRepositories = $(widgetFile "configurators/addrepository/archive") + diff --git a/Assistant/WebApp/Configurators/AWS.hs b/Assistant/WebApp/Configurators/AWS.hs new file mode 100644 index 0000000000..bb8935b8b2 --- /dev/null +++ b/Assistant/WebApp/Configurators/AWS.hs @@ -0,0 +1,230 @@ +{- git-annex assistant webapp configurators for Amazon AWS services + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU AGPL version 3 or higher. + -} + +{-# LANGUAGE CPP, QuasiQuotes, TemplateHaskell, OverloadedStrings #-} + +module Assistant.WebApp.Configurators.AWS where + +import Assistant.WebApp.Common +import Assistant.WebApp.MakeRemote +#ifdef WITH_S3 +import qualified Remote.S3 as S3 +#endif +import qualified Remote.Glacier as Glacier +import qualified Remote.Helper.AWS as AWS +import Logs.Remote +import qualified Remote +import qualified Types.Remote as Remote +import Types.Remote (RemoteConfig) +import Types.StandardGroups +import Creds +import Assistant.Gpg +import Git.Types (RemoteName) + +import qualified Data.Text as T +import qualified Data.Map as M +import Data.Char + +awsConfigurator :: Widget -> Handler Html +awsConfigurator = page "Add an Amazon repository" (Just Configuration) + +glacierConfigurator :: Widget -> Handler Html +glacierConfigurator a = do + ifM (liftIO $ inPath "glacier") + ( awsConfigurator a + , awsConfigurator needglaciercli + ) + where + needglaciercli = $(widgetFile "configurators/needglaciercli") + +data StorageClass = StandardRedundancy | ReducedRedundancy + deriving (Eq, Enum, Bounded) + +instance Show StorageClass where + show StandardRedundancy = "STANDARD" + show ReducedRedundancy = "REDUCED_REDUNDANCY" + +data AWSInput = AWSInput + { accessKeyID :: Text + , secretAccessKey :: Text + , datacenter :: Text + -- Only used for S3, not Glacier. + , storageClass :: StorageClass + , repoName :: Text + , enableEncryption :: EnableEncryption + } + +data AWSCreds = AWSCreds Text Text + +extractCreds :: AWSInput -> AWSCreds +extractCreds i = AWSCreds (accessKeyID i) (secretAccessKey i) + +s3InputAForm :: Maybe CredPair -> MkAForm AWSInput +s3InputAForm defcreds = AWSInput + <$> accessKeyIDFieldWithHelp (T.pack . fst <$> defcreds) + <*> secretAccessKeyField (T.pack . snd <$> defcreds) + <*> datacenterField AWS.S3 + <*> areq (selectFieldList storageclasses) "Storage class" (Just StandardRedundancy) + <*> areq textField "Repository name" (Just "S3") + <*> enableEncryptionField + where + storageclasses :: [(Text, StorageClass)] + storageclasses = + [ ("Standard redundancy", StandardRedundancy) + , ("Reduced redundancy (costs less)", ReducedRedundancy) + ] + +glacierInputAForm :: Maybe CredPair -> MkAForm AWSInput +glacierInputAForm defcreds = AWSInput + <$> accessKeyIDFieldWithHelp (T.pack . fst <$> defcreds) + <*> secretAccessKeyField (T.pack . snd <$> defcreds) + <*> datacenterField AWS.Glacier + <*> pure StandardRedundancy + <*> areq textField "Repository name" (Just "glacier") + <*> enableEncryptionField + +awsCredsAForm :: Maybe CredPair -> MkAForm AWSCreds +awsCredsAForm defcreds = AWSCreds + <$> accessKeyIDFieldWithHelp (T.pack . fst <$> defcreds) + <*> secretAccessKeyField (T.pack . snd <$> defcreds) + +accessKeyIDField :: Widget -> Maybe Text -> MkAForm Text +accessKeyIDField help = areq (textField `withNote` help) "Access Key ID" + +accessKeyIDFieldWithHelp :: Maybe Text -> MkAForm Text +accessKeyIDFieldWithHelp = accessKeyIDField help + where + help = [whamlet| + + Get Amazon access keys +|] + +secretAccessKeyField :: Maybe Text -> MkAForm Text +secretAccessKeyField = areq passwordField "Secret Access Key" + +datacenterField :: AWS.Service -> MkAForm Text +datacenterField service = areq (selectFieldList list) "Datacenter" defregion + where + list = M.toList $ AWS.regionMap service + defregion = Just $ AWS.defaultRegion service + +getAddS3R :: Handler Html +getAddS3R = postAddS3R + +postAddS3R :: Handler Html +#ifdef WITH_S3 +postAddS3R = awsConfigurator $ do + defcreds <- liftAnnex previouslyUsedAWSCreds + ((result, form), enctype) <- liftH $ + runFormPostNoToken $ renderBootstrap $ s3InputAForm defcreds + case result of + FormSuccess input -> liftH $ do + let name = T.unpack $ repoName input + makeAWSRemote initSpecialRemote S3.remote TransferGroup (extractCreds input) name $ M.fromList + [ configureEncryption $ enableEncryption input + , ("type", "S3") + , ("datacenter", T.unpack $ datacenter input) + , ("storageclass", show $ storageClass input) + ] + _ -> $(widgetFile "configurators/adds3") +#else +postAddS3R = error "S3 not supported by this build" +#endif + +getAddGlacierR :: Handler Html +getAddGlacierR = postAddGlacierR + +postAddGlacierR :: Handler Html +#ifdef WITH_S3 +postAddGlacierR = glacierConfigurator $ do + defcreds <- liftAnnex previouslyUsedAWSCreds + ((result, form), enctype) <- liftH $ + runFormPostNoToken $ renderBootstrap $ glacierInputAForm defcreds + case result of + FormSuccess input -> liftH $ do + let name = T.unpack $ repoName input + makeAWSRemote initSpecialRemote Glacier.remote SmallArchiveGroup (extractCreds input) name $ M.fromList + [ configureEncryption $ enableEncryption input + , ("type", "glacier") + , ("datacenter", T.unpack $ datacenter input) + ] + _ -> $(widgetFile "configurators/addglacier") +#else +postAddGlacierR = error "S3 not supported by this build" +#endif + +getEnableS3R :: UUID -> Handler Html +#ifdef WITH_S3 +getEnableS3R uuid = do + m <- liftAnnex readRemoteLog + if isIARemoteConfig $ fromJust $ M.lookup uuid m + then redirect $ EnableIAR uuid + else postEnableS3R uuid +#else +getEnableS3R = postEnableS3R +#endif + +postEnableS3R :: UUID -> Handler Html +#ifdef WITH_S3 +postEnableS3R uuid = awsConfigurator $ enableAWSRemote S3.remote uuid +#else +postEnableS3R _ = error "S3 not supported by this build" +#endif + +getEnableGlacierR :: UUID -> Handler Html +getEnableGlacierR = postEnableGlacierR + +postEnableGlacierR :: UUID -> Handler Html +postEnableGlacierR = glacierConfigurator . enableAWSRemote Glacier.remote + +enableAWSRemote :: RemoteType -> UUID -> Widget +#ifdef WITH_S3 +enableAWSRemote remotetype uuid = do + defcreds <- liftAnnex previouslyUsedAWSCreds + ((result, form), enctype) <- liftH $ + runFormPostNoToken $ renderBootstrap $ awsCredsAForm defcreds + case result of + FormSuccess creds -> liftH $ do + m <- liftAnnex readRemoteLog + let name = fromJust $ M.lookup "name" $ + fromJust $ M.lookup uuid m + makeAWSRemote enableSpecialRemote remotetype SmallArchiveGroup creds name M.empty + _ -> do + description <- liftAnnex $ + T.pack <$> Remote.prettyUUID uuid + $(widgetFile "configurators/enableaws") +#else +enableAWSRemote _ _ = error "S3 not supported by this build" +#endif + +makeAWSRemote :: SpecialRemoteMaker -> RemoteType -> StandardGroup -> AWSCreds -> RemoteName -> RemoteConfig -> Handler () +makeAWSRemote maker remotetype defaultgroup (AWSCreds ak sk) name config = + setupCloudRemote defaultgroup Nothing $ + maker hostname remotetype (Just creds) config + where + creds = (T.unpack ak, T.unpack sk) + {- AWS services use the remote name as the basis for a host + - name, so filter it to contain valid characters. -} + hostname = case filter isAlphaNum name of + [] -> "aws" + n -> n + +getRepoInfo :: RemoteConfig -> Widget +getRepoInfo c = [whamlet|S3 remote using bucket: #{bucket}|] + where + bucket = fromMaybe "" $ M.lookup "bucket" c + +#ifdef WITH_S3 +isIARemoteConfig :: RemoteConfig -> Bool +isIARemoteConfig = S3.isIAHost . fromMaybe "" . M.lookup "host" + +previouslyUsedAWSCreds :: Annex (Maybe CredPair) +previouslyUsedAWSCreds = getM gettype [S3.remote, Glacier.remote] + where + gettype t = previouslyUsedCredPair AWS.creds t $ + not . isIARemoteConfig . Remote.config +#endif diff --git a/Assistant/WebApp/Configurators/Delete.hs b/Assistant/WebApp/Configurators/Delete.hs new file mode 100644 index 0000000000..8d72853d2e --- /dev/null +++ b/Assistant/WebApp/Configurators/Delete.hs @@ -0,0 +1,131 @@ +{- git-annex assistant webapp repository deletion + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU AGPL version 3 or higher. + -} + +{-# LANGUAGE QuasiQuotes, TemplateHaskell, OverloadedStrings #-} + +module Assistant.WebApp.Configurators.Delete where + +import Assistant.WebApp.Common +import Assistant.DeleteRemote +import Assistant.DaemonStatus +import Assistant.ScanRemotes +import Assistant.Sync +import qualified Remote +import qualified Git +import Config.Files +import Utility.FileMode +import Logs.Trust +import Logs.Remote +import Logs.PreferredContent +import Types.StandardGroups +import Annex.UUID + +import System.IO.HVFS (SystemFS(..)) +import qualified Data.Text as T +import qualified Data.Map as M +import System.Path + +notCurrentRepo :: UUID -> Handler Html -> Handler Html +notCurrentRepo uuid a = do + u <- liftAnnex getUUID + if u == uuid + then redirect DeleteCurrentRepositoryR + else go =<< liftAnnex (Remote.remoteFromUUID uuid) + where + go Nothing = error "Unknown UUID" + go (Just _) = a + +getDisableRepositoryR :: UUID -> Handler Html +getDisableRepositoryR uuid = notCurrentRepo uuid $ do + void $ liftAssistant $ disableRemote uuid + redirect DashboardR + +getDeleteRepositoryR :: UUID -> Handler Html +getDeleteRepositoryR uuid = notCurrentRepo uuid $ + deletionPage $ do + reponame <- liftAnnex $ Remote.prettyUUID uuid + $(widgetFile "configurators/delete/start") + +getStartDeleteRepositoryR :: UUID -> Handler Html +getStartDeleteRepositoryR uuid = do + remote <- fromMaybe (error "unknown remote") + <$> liftAnnex (Remote.remoteFromUUID uuid) + liftAnnex $ do + trustSet uuid UnTrusted + setStandardGroup uuid UnwantedGroup + liftAssistant $ addScanRemotes True [remote] + redirect DashboardR + +getFinishDeleteRepositoryR :: UUID -> Handler Html +getFinishDeleteRepositoryR uuid = deletionPage $ do + void $ liftAssistant $ removeRemote uuid + + reponame <- liftAnnex $ Remote.prettyUUID uuid + {- If it's not listed in the remote log, it must be a git repo. -} + gitrepo <- liftAnnex $ M.notMember uuid <$> readRemoteLog + $(widgetFile "configurators/delete/finished") + +getDeleteCurrentRepositoryR :: Handler Html +getDeleteCurrentRepositoryR = deleteCurrentRepository + +postDeleteCurrentRepositoryR :: Handler Html +postDeleteCurrentRepositoryR = deleteCurrentRepository + +deleteCurrentRepository :: Handler Html +deleteCurrentRepository = dangerPage $ do + reldir <- fromJust . relDir <$> liftH getYesod + havegitremotes <- haveremotes syncGitRemotes + havedataremotes <- haveremotes syncDataRemotes + ((result, form), enctype) <- liftH $ + runFormPostNoToken $ renderBootstrap $ sanityVerifierAForm $ + SanityVerifier magicphrase + case result of + FormSuccess _ -> liftH $ do + dir <- liftAnnex $ fromRepo Git.repoPath + liftIO $ removeAutoStartFile dir + + {- Disable syncing to this repository, and all + - remotes. This stops all transfers, and all + - file watching. -} + liftAssistant $ do + changeSyncable Nothing False + rs <- syncRemotes <$> getDaemonStatus + mapM_ (\r -> changeSyncable (Just r) False) rs + + {- Make all directories writable and files writable + - so all annexed content can be deleted. -} + liftIO $ do + recurseDir SystemFS dir + >>= mapM_ (void . tryIO . allowWrite) + removeDirectoryRecursive dir + + redirect ShutdownConfirmedR + _ -> $(widgetFile "configurators/delete/currentrepository") + where + haveremotes selector = not . null . selector + <$> liftAssistant getDaemonStatus + +data SanityVerifier = SanityVerifier T.Text + deriving (Eq) + +sanityVerifierAForm :: SanityVerifier -> MkAForm SanityVerifier +sanityVerifierAForm template = SanityVerifier + <$> areq checksanity "Confirm deletion?" Nothing + where + checksanity = checkBool (\input -> SanityVerifier input == template) + insane textField + + insane = "Maybe this is not a good idea..." :: Text + +deletionPage :: Widget -> Handler Html +deletionPage = page "Delete repository" (Just Configuration) + +dangerPage :: Widget -> Handler Html +dangerPage = page "Danger danger danger" (Just Configuration) + +magicphrase :: Text +magicphrase = "Yes, please do as I say!" diff --git a/Assistant/WebApp/Configurators/Edit.hs b/Assistant/WebApp/Configurators/Edit.hs new file mode 100644 index 0000000000..f005e17792 --- /dev/null +++ b/Assistant/WebApp/Configurators/Edit.hs @@ -0,0 +1,277 @@ +{- git-annex assistant webapp configurator for editing existing repos + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU AGPL version 3 or higher. + -} + +{-# LANGUAGE CPP, QuasiQuotes, TemplateHaskell, OverloadedStrings #-} + +module Assistant.WebApp.Configurators.Edit where + +import Assistant.WebApp.Common +import Assistant.WebApp.Gpg +import Assistant.DaemonStatus +import Assistant.WebApp.MakeRemote (uniqueRemoteName) +import Assistant.WebApp.Configurators.XMPP (xmppNeeded) +import Assistant.ScanRemotes +import Assistant.Sync +import qualified Assistant.WebApp.Configurators.AWS as AWS +import qualified Assistant.WebApp.Configurators.IA as IA +#ifdef WITH_S3 +import qualified Remote.S3 as S3 +#endif +import qualified Remote +import qualified Types.Remote as Remote +import qualified Remote.List as Remote +import Logs.UUID +import Logs.Group +import Logs.PreferredContent +import Logs.Remote +import Types.StandardGroups +import qualified Git +import qualified Git.Types as Git +import qualified Git.Command +import qualified Git.Config +import qualified Annex +import Git.Remote +import Remote.Helper.Encryptable (extractCipher) +import Types.Crypto +import Utility.Gpg +import Annex.UUID +import Assistant.Ssh +import Config + +import qualified Data.Text as T +import qualified Data.Map as M +import qualified Data.Set as S + +data RepoGroup = RepoGroupCustom String | RepoGroupStandard StandardGroup + deriving (Show, Eq) + +data RepoConfig = RepoConfig + { repoName :: Text + , repoDescription :: Maybe Text + , repoGroup :: RepoGroup + , repoAssociatedDirectory :: Maybe Text + , repoSyncable :: Bool + } + deriving (Show) + +getRepoConfig :: UUID -> Maybe Remote -> Annex RepoConfig +getRepoConfig uuid mremote = do + groups <- lookupGroups uuid + remoteconfig <- M.lookup uuid <$> readRemoteLog + let (repogroup, associateddirectory) = case getStandardGroup groups of + Nothing -> (RepoGroupCustom $ unwords $ S.toList groups, Nothing) + Just g -> (RepoGroupStandard g, associatedDirectory remoteconfig g) + + description <- fmap T.pack . M.lookup uuid <$> uuidMap + + syncable <- case mremote of + Just r -> return $ remoteAnnexSync $ Remote.gitconfig r + Nothing -> annexAutoCommit <$> Annex.getGitConfig + + return $ RepoConfig + (T.pack $ maybe "here" Remote.name mremote) + description + repogroup + (T.pack <$> associateddirectory) + syncable + +setRepoConfig :: UUID -> Maybe Remote -> RepoConfig -> RepoConfig -> Handler () +setRepoConfig uuid mremote oldc newc = do + when descriptionChanged $ liftAnnex $ do + maybe noop (describeUUID uuid . T.unpack) (repoDescription newc) + void uuidMapLoad + when nameChanged $ do + liftAnnex $ do + name <- fromRepo $ uniqueRemoteName (legalName newc) 0 + {- git remote rename expects there to be a + - remote..fetch, and exits nonzero if + - there's not. Special remotes don't normally + - have that, and don't use it. Temporarily add + - it if it's missing. -} + let remotefetch = "remote." ++ T.unpack (repoName oldc) ++ ".fetch" + needfetch <- isNothing <$> fromRepo (Git.Config.getMaybe remotefetch) + when needfetch $ + inRepo $ Git.Command.run + [Param "config", Param remotefetch, Param ""] + inRepo $ Git.Command.run + [ Param "remote" + , Param "rename" + , Param $ T.unpack $ repoName oldc + , Param name + ] + void Remote.remoteListRefresh + liftAssistant updateSyncRemotes + when associatedDirectoryChanged $ case repoAssociatedDirectory newc of + Nothing -> noop + Just t + | T.null t -> noop + | otherwise -> liftAnnex $ do + let dir = takeBaseName $ T.unpack t + m <- readRemoteLog + case M.lookup uuid m of + Nothing -> noop + Just remoteconfig -> configSet uuid $ + M.insert "preferreddir" dir remoteconfig + when groupChanged $ do + liftAnnex $ case repoGroup newc of + RepoGroupStandard g -> setStandardGroup uuid g + RepoGroupCustom s -> groupSet uuid $ S.fromList $ words s + {- Enabling syncing will cause a scan, + - so avoid queueing a duplicate scan. -} + when (repoSyncable newc && not syncableChanged) $ liftAssistant $ + case mremote of + Just remote -> addScanRemotes True [remote] + Nothing -> addScanRemotes True + =<< syncDataRemotes <$> getDaemonStatus + when syncableChanged $ + liftAssistant $ changeSyncable mremote (repoSyncable newc) + where + syncableChanged = repoSyncable oldc /= repoSyncable newc + associatedDirectoryChanged = repoAssociatedDirectory oldc /= repoAssociatedDirectory newc + groupChanged = repoGroup oldc /= repoGroup newc + nameChanged = isJust mremote && legalName oldc /= legalName newc + descriptionChanged = repoDescription oldc /= repoDescription newc + + legalName = makeLegalName . T.unpack . repoName + +editRepositoryAForm :: Maybe Remote -> RepoConfig -> MkAForm RepoConfig +editRepositoryAForm mremote def = RepoConfig + <$> areq (if ishere then readonlyTextField else textField) + "Name" (Just $ repoName def) + <*> aopt textField "Description" (Just $ repoDescription def) + <*> areq (selectFieldList groups `withNote` help) "Repository group" (Just $ repoGroup def) + <*> associateddirectory + <*> areq checkBoxField "Syncing enabled" (Just $ repoSyncable def) + where + ishere = isNothing mremote + isspecial = fromMaybe False $ + (== Git.Unknown) . Git.location . Remote.repo <$> mremote + groups = customgroups ++ standardgroups + standardgroups :: [(Text, RepoGroup)] + standardgroups = map (\g -> (T.pack $ descStandardGroup g , RepoGroupStandard g)) $ + filter sanegroup [minBound..maxBound] + sanegroup + | isspecial = const True + | otherwise = not . specialRemoteOnly + customgroups :: [(Text, RepoGroup)] + customgroups = case repoGroup def of + RepoGroupCustom s -> [(T.pack s, RepoGroupCustom s)] + _ -> [] + help = [whamlet|What's this?|] + + associateddirectory = case repoAssociatedDirectory def of + Nothing -> aopt hiddenField "" Nothing + Just d -> aopt textField "Associated directory" (Just $ Just d) + +getEditRepositoryR :: RepoId -> Handler Html +getEditRepositoryR = postEditRepositoryR + +postEditRepositoryR :: RepoId -> Handler Html +postEditRepositoryR = editForm False + +getEditNewRepositoryR :: UUID -> Handler Html +getEditNewRepositoryR = postEditNewRepositoryR + +postEditNewRepositoryR :: UUID -> Handler Html +postEditNewRepositoryR = editForm True . RepoUUID + +getEditNewCloudRepositoryR :: UUID -> Handler Html +getEditNewCloudRepositoryR = postEditNewCloudRepositoryR + +postEditNewCloudRepositoryR :: UUID -> Handler Html +postEditNewCloudRepositoryR uuid = xmppNeeded >> editForm True (RepoUUID uuid) + +editForm :: Bool -> RepoId -> Handler Html +editForm new (RepoUUID uuid) = page "Edit repository" (Just Configuration) $ do + mremote <- liftAnnex $ Remote.remoteFromUUID uuid + when (mremote == Nothing) $ + whenM ((/=) uuid <$> liftAnnex getUUID) $ + error "unknown remote" + curr <- liftAnnex $ getRepoConfig uuid mremote + liftAnnex $ checkAssociatedDirectory curr mremote + ((result, form), enctype) <- liftH $ + runFormPostNoToken $ renderBootstrap $ editRepositoryAForm mremote curr + case result of + FormSuccess input -> liftH $ do + setRepoConfig uuid mremote curr input + liftAnnex $ checkAssociatedDirectory input mremote + redirect DashboardR + _ -> do + let istransfer = repoGroup curr == RepoGroupStandard TransferGroup + config <- liftAnnex $ M.lookup uuid <$> readRemoteLog + let repoInfo = getRepoInfo mremote config + let repoEncryption = getRepoEncryption mremote config + $(widgetFile "configurators/edit/repository") +editForm _new r@(RepoName _) = page "Edit repository" (Just Configuration) $ do + mr <- liftAnnex (repoIdRemote r) + let repoInfo = getRepoInfo mr Nothing + g <- liftAnnex gitRepo + let sshrepo = maybe False (remoteLocationIsSshUrl . flip parseRemoteLocation g . Git.repoLocation . Remote.repo) mr + $(widgetFile "configurators/edit/nonannexremote") + +{- Makes any directory associated with the repository. -} +checkAssociatedDirectory :: RepoConfig -> Maybe Remote -> Annex () +checkAssociatedDirectory _ Nothing = noop +checkAssociatedDirectory cfg (Just r) = do + repoconfig <- M.lookup (Remote.uuid r) <$> readRemoteLog + case repoGroup cfg of + RepoGroupStandard gr -> case associatedDirectory repoconfig gr of + Just d -> inRepo $ \g -> + createDirectoryIfMissing True $ + Git.repoPath g d + Nothing -> noop + _ -> noop + +getRepoInfo :: Maybe Remote.Remote -> Maybe Remote.RemoteConfig -> Widget +getRepoInfo (Just r) (Just c) = case M.lookup "type" c of + Just "S3" +#ifdef WITH_S3 + | S3.isIA c -> IA.getRepoInfo c +#endif + | otherwise -> AWS.getRepoInfo c + Just t + | t /= "git" -> [whamlet|#{t} remote|] + _ -> getGitRepoInfo $ Remote.repo r +getRepoInfo (Just r) _ = getRepoInfo (Just r) (Just $ Remote.config r) +getRepoInfo _ _ = [whamlet|git repository|] + +getGitRepoInfo :: Git.Repo -> Widget +getGitRepoInfo r = do + let loc = Git.repoLocation r + [whamlet|git repository located at #{loc}|] + +getRepoEncryption :: Maybe Remote.Remote -> Maybe Remote.RemoteConfig -> Widget +getRepoEncryption (Just _) (Just c) = case extractCipher c of + Nothing -> + [whamlet|not encrypted|] + (Just (SharedCipher _)) -> + [whamlet|encrypted: encryption key stored in git repository|] + (Just (EncryptedCipher _ _ (KeyIds { keyIds = ks }))) -> do + knownkeys <- liftIO secretKeys + [whamlet| +encrypted using gpg key: +