From 4d3d9e2bac64943dd48e61334f115f0a30f4aebf Mon Sep 17 00:00:00 2001 From: "https://www.google.com/accounts/o8/id?id=AItOawkutSE8_3fFAETmO_E598zja4gKwYXbb8E" <@web> Date: Tue, 14 Apr 2015 19:57:52 +0000 Subject: [PATCH 001/362] Added a comment --- .../comment_2_52c04c388b807993cecacc7f98b73cd3._comment | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 doc/todo/addurl___8211__force-torrent_option/comment_2_52c04c388b807993cecacc7f98b73cd3._comment diff --git a/doc/todo/addurl___8211__force-torrent_option/comment_2_52c04c388b807993cecacc7f98b73cd3._comment b/doc/todo/addurl___8211__force-torrent_option/comment_2_52c04c388b807993cecacc7f98b73cd3._comment new file mode 100644 index 0000000000..f6d52be655 --- /dev/null +++ b/doc/todo/addurl___8211__force-torrent_option/comment_2_52c04c388b807993cecacc7f98b73cd3._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkutSE8_3fFAETmO_E598zja4gKwYXbb8E" + nickname="Сергей" + subject="comment 2" + date="2015-04-14T19:57:52Z" + content=""" +Sure, that's even better. +"""]] From b7790477cc8479db65cc11ba0cb5a463dfc990cc Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Tue, 14 Apr 2015 16:40:57 -0400 Subject: [PATCH 002/362] update --- doc/devblog/day_275-276__mostly_Windows.mdwn | 3 +++ 1 file changed, 3 insertions(+) diff --git a/doc/devblog/day_275-276__mostly_Windows.mdwn b/doc/devblog/day_275-276__mostly_Windows.mdwn index 4b5a066e2a..bcdc94696d 100644 --- a/doc/devblog/day_275-276__mostly_Windows.mdwn +++ b/doc/devblog/day_275-276__mostly_Windows.mdwn @@ -2,6 +2,9 @@ Mostly working on Windows recently. Fixed handling of git repos on different drive letters. Fixed crazy start menu loop. Worked around stange msysgit version problem. +Also some more work on the `concurrentprogress` branch, making the progress +display prettier. + Added one nice new feature yesterday: `git annex info $dir` now includes a table of repositories that are storing files in the directory, with their sizes. From be43b5405af515d375cb110a7aaf3ab32aab79bf Mon Sep 17 00:00:00 2001 From: "http://hendry.iki.fi/" Date: Wed, 15 Apr 2015 04:08:27 +0000 Subject: [PATCH 003/362] --- ...eted_files_that_I_know_have_been_backed_up__63__.mdwn | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 doc/forum/How_to_find_deleted_files_that_I_know_have_been_backed_up__63__.mdwn diff --git a/doc/forum/How_to_find_deleted_files_that_I_know_have_been_backed_up__63__.mdwn b/doc/forum/How_to_find_deleted_files_that_I_know_have_been_backed_up__63__.mdwn new file mode 100644 index 0000000000..998c608dd4 --- /dev/null +++ b/doc/forum/How_to_find_deleted_files_that_I_know_have_been_backed_up__63__.mdwn @@ -0,0 +1,9 @@ + + +I removed some archived directories perhaps foolishly with `rm -rf`. How do I find the files that I've had deleted? + + + +I also have an issue where by I want one command to sync between two hardrives and [github](https://github.com/kaihendry/uploadme). Or do I have to: `git-annex move --to {foo,bar}; git-annex drop; git-annex sync`? Basically I want copies everywhere except on my laptop (X1C3). + +I also expected my git dir to be much smaller than 1.4GB after dropping everything. Thanks! From 1f223a1017a67be6415ce5a8feb4037c89a95c43 Mon Sep 17 00:00:00 2001 From: "https://www.google.com/accounts/o8/id?id=AItOawlXt6nnNs-3uw61EGYtxr_AVhJqXybwLR8" Date: Wed, 15 Apr 2015 17:51:18 +0000 Subject: [PATCH 004/362] Added a comment --- ..._d13a0af48b8831c81276a0b2c8e25303._comment | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 doc/forum/__34__git_annex_sync__34___synced_after_8_hours/comment_2_d13a0af48b8831c81276a0b2c8e25303._comment diff --git a/doc/forum/__34__git_annex_sync__34___synced_after_8_hours/comment_2_d13a0af48b8831c81276a0b2c8e25303._comment b/doc/forum/__34__git_annex_sync__34___synced_after_8_hours/comment_2_d13a0af48b8831c81276a0b2c8e25303._comment new file mode 100644 index 0000000000..940922e6c2 --- /dev/null +++ b/doc/forum/__34__git_annex_sync__34___synced_after_8_hours/comment_2_d13a0af48b8831c81276a0b2c8e25303._comment @@ -0,0 +1,37 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlXt6nnNs-3uw61EGYtxr_AVhJqXybwLR8" + nickname="Bruno" + subject="comment 2" + date="2015-04-15T17:51:18Z" + content=""" +@CandyAngel Thank you for your **git annex find** tips. But for git gc, it seem not working fine :) +After i have executed the **git gc**, the **git annex info** return the result after **1h 45m** + + % time git annex info + repository mode: indirect + trusted repositories: 0 + semitrusted repositories: 5 + 00000000-0000-0000-0000-000000000001 -- web + 00000000-0000-0000-0000-000000000002 -- bittorrent + 181d4dae-2131-435e-9c00-b8c7f1bfc332 -- [sbackup] + 2db1f8e7-0b29-4d61-8875-a4a4a42a79dd -- [dellcomputer] + 703df355-73a6-4487-97fd-a3a5d6ae034e -- usbhomebackup [here] + untrusted repositories: 0 + transfers in progress: none + available local disk space: 135.24 gigabytes (+1 megabyte reserved) + local annex keys: 275416 + local annex size: 780.55 gigabytes + annexed files in working tree: 265888 + size of annexed files in working tree: 751.49 gigabytes + bloom filter size: 16 mebibytes (55.1% full) + backend usage: + SHA256E: 541304 + +git annex info 83,95s user 50,68s system 2% **cpu 1:45:01,70 total** + + +Can you explain exactly the git gc or git repack parameters that you use for optimizing git annex performance ? + +Thanks + +"""]] From d3a1047b5f2aafba252890dd609869eb314da3aa Mon Sep 17 00:00:00 2001 From: "https://www.google.com/accounts/o8/id?id=AItOawm5WyknJirJJridJjiPNgrlYxGG9xrZBvA" Date: Wed, 15 Apr 2015 19:55:53 +0000 Subject: [PATCH 005/362] --- .../addurl_+_sync_vs_addurl_+_commit.mdwn | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 doc/bugs/addurl_+_sync_vs_addurl_+_commit.mdwn diff --git a/doc/bugs/addurl_+_sync_vs_addurl_+_commit.mdwn b/doc/bugs/addurl_+_sync_vs_addurl_+_commit.mdwn new file mode 100644 index 0000000000..23490a4246 --- /dev/null +++ b/doc/bugs/addurl_+_sync_vs_addurl_+_commit.mdwn @@ -0,0 +1,23 @@ +### Please describe the problem. + +I think this is what happened; I need to go back and check this again (maybe I was just misreading something) but I want to get it written down first. + +I've got a git repository, and I just ran git annex init. Then I ran git annex addurl a bunch of times, followed by git annex sync. The result was apparently a repository where the files downloaded by addurl were added using the SHA256 backend rather than the URL backend. I deleted the branches and tried again, but this time after calling git annex addurl a bunch of times I did a normal git commit. This time everything looked fine; the files were all listed in as present in the web remote. + +### What steps will reproduce the problem? + +git annex init +git annex addurl https://archive.org/download/emularity_engine_jsmess/messnapple2e.js.gz --file messnapple2e.js.gz +git annex sync + +### What version of git-annex are you using? On what operating system? + +git-annex version: 5.20150412-g2be4834 +build flags: Assistant Webapp Webapp-secure Pairing Testsuite S3 WebDAV Inotify DBus DesktopNotify XMPP DNS Feeds Quvi TDFA TorrentParser +key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E MD5E SHA256 SHA1 SHA512 SHA224 SHA384 SKEIN256 SKEIN512 MD5 WORM URL +remote types: git gcrypt S3 bup directory rsync web bittorrent webdav tahoe glacier ddar hook external +local repository version: 5 +supported repository version: 5 +upgrade supported from repository versions: 0 1 2 4 + +This is on Linux. From d91ab8be72eefe7d9afed83a2606bf519a485f3d Mon Sep 17 00:00:00 2001 From: "https://www.google.com/accounts/o8/id?id=AItOawm5WyknJirJJridJjiPNgrlYxGG9xrZBvA" Date: Wed, 15 Apr 2015 19:58:11 +0000 Subject: [PATCH 006/362] formatting --- doc/bugs/addurl_+_sync_vs_addurl_+_commit.mdwn | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/doc/bugs/addurl_+_sync_vs_addurl_+_commit.mdwn b/doc/bugs/addurl_+_sync_vs_addurl_+_commit.mdwn index 23490a4246..ab5f00f985 100644 --- a/doc/bugs/addurl_+_sync_vs_addurl_+_commit.mdwn +++ b/doc/bugs/addurl_+_sync_vs_addurl_+_commit.mdwn @@ -6,9 +6,11 @@ I've got a git repository, and I just ran git annex init. Then I ran git annex a ### What steps will reproduce the problem? +[[!format sh """ git annex init -git annex addurl https://archive.org/download/emularity_engine_jsmess/messnapple2e.js.gz --file messnapple2e.js.gz +git annex addurl "https://archive.org/download/emularity_engine_jsmess/messnapple2e.js.gz" --file "messnapple2e.js.gz" git annex sync +"""]] ### What version of git-annex are you using? On what operating system? From 5f4d9ef61a113dd0088a8c2073fb4db2e7b58991 Mon Sep 17 00:00:00 2001 From: "https://www.google.com/accounts/o8/id?id=AItOawnVnsqEy82M-MuS2gLri-az83wSQ6lXSrc" Date: Thu, 16 Apr 2015 06:02:53 +0000 Subject: [PATCH 007/362] --- ...ow_do_I_hide_files_not_present_in_the_local_annex__63__.mdwn | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 doc/forum/How_do_I_hide_files_not_present_in_the_local_annex__63__.mdwn diff --git a/doc/forum/How_do_I_hide_files_not_present_in_the_local_annex__63__.mdwn b/doc/forum/How_do_I_hide_files_not_present_in_the_local_annex__63__.mdwn new file mode 100644 index 0000000000..72e39cc360 --- /dev/null +++ b/doc/forum/How_do_I_hide_files_not_present_in_the_local_annex__63__.mdwn @@ -0,0 +1,2 @@ +Files only present in remotes show up as broken symlinks. That's great for knowing what files exist, but sometimes I just want to browse the files that are actually present. In this case, the many broken symlinks are just clutter. +Is there a straightforward way to switch to a view that shows only locally present files? From 57f90e64e4c11ca330a5538fb672c9a6d2bb454d Mon Sep 17 00:00:00 2001 From: CandyAngel Date: Thu, 16 Apr 2015 07:41:07 +0000 Subject: [PATCH 008/362] Added a comment --- ...t_3_c50b62e5a84b861117a4405c2a2f5cfb._comment | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 doc/forum/__34__git_annex_sync__34___synced_after_8_hours/comment_3_c50b62e5a84b861117a4405c2a2f5cfb._comment diff --git a/doc/forum/__34__git_annex_sync__34___synced_after_8_hours/comment_3_c50b62e5a84b861117a4405c2a2f5cfb._comment b/doc/forum/__34__git_annex_sync__34___synced_after_8_hours/comment_3_c50b62e5a84b861117a4405c2a2f5cfb._comment new file mode 100644 index 0000000000..20031b9529 --- /dev/null +++ b/doc/forum/__34__git_annex_sync__34___synced_after_8_hours/comment_3_c50b62e5a84b861117a4405c2a2f5cfb._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="CandyAngel" + subject="comment 3" + date="2015-04-16T07:41:07Z" + content=""" +*git annex info* has check every file (not sure if it traverses *.git/annex/objects* specifically or not) to get \"local annex\" information. You can improve its performance by improving directory traversal in general (different filesystem or [changing the hashing method so it isn't Xx/Yy/KEY/FILE](https://github.com/datalad/datalad/issues/32)). + +The repack/gc speeds up operations for the git side of things, like syncing (pull/push), cloning and committing. + +Here's what I used: + + git repack -ad + git gc + +This took git actions down from 1 hour+ to ~10 minutes (for a repo with 5.6 million objects). +"""]] From 40f1e5336b3277fb932458aeef8ee663075d8472 Mon Sep 17 00:00:00 2001 From: edward Date: Thu, 16 Apr 2015 07:49:17 +0000 Subject: [PATCH 009/362] fix git-annex version formatting --- doc/bugs/addurl_+_sync_vs_addurl_+_commit.mdwn | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/doc/bugs/addurl_+_sync_vs_addurl_+_commit.mdwn b/doc/bugs/addurl_+_sync_vs_addurl_+_commit.mdwn index ab5f00f985..cb8640531a 100644 --- a/doc/bugs/addurl_+_sync_vs_addurl_+_commit.mdwn +++ b/doc/bugs/addurl_+_sync_vs_addurl_+_commit.mdwn @@ -14,12 +14,11 @@ git annex sync ### What version of git-annex are you using? On what operating system? -git-annex version: 5.20150412-g2be4834 -build flags: Assistant Webapp Webapp-secure Pairing Testsuite S3 WebDAV Inotify DBus DesktopNotify XMPP DNS Feeds Quvi TDFA TorrentParser -key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E MD5E SHA256 SHA1 SHA512 SHA224 SHA384 SKEIN256 SKEIN512 MD5 WORM URL -remote types: git gcrypt S3 bup directory rsync web bittorrent webdav tahoe glacier ddar hook external -local repository version: 5 -supported repository version: 5 -upgrade supported from repository versions: 0 1 2 4 - + git-annex version: 5.20150412-g2be4834 + build flags: Assistant Webapp Webapp-secure Pairing Testsuite S3 WebDAV Inotify DBus DesktopNotify XMPP DNS Feeds Quvi TDFA TorrentParser + key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E MD5E SHA256 SHA1 SHA512 SHA224 SHA384 SKEIN256 SKEIN512 MD5 WORM URL + remote types: git gcrypt S3 bup directory rsync web bittorrent webdav tahoe glacier ddar hook external + local repository version: 5 + supported repository version: 5 + upgrade supported from repository versions: 0 1 2 4 This is on Linux. From a6ea8547454b121457e02741b4eb29bc783f7e87 Mon Sep 17 00:00:00 2001 From: "https://www.google.com/accounts/o8/id?id=AItOawlXt6nnNs-3uw61EGYtxr_AVhJqXybwLR8" Date: Thu, 16 Apr 2015 11:47:51 +0000 Subject: [PATCH 010/362] Added a comment --- ...ent_4_0051e83196945b97e2f3ed14a58daaea._comment | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 doc/forum/__34__git_annex_sync__34___synced_after_8_hours/comment_4_0051e83196945b97e2f3ed14a58daaea._comment diff --git a/doc/forum/__34__git_annex_sync__34___synced_after_8_hours/comment_4_0051e83196945b97e2f3ed14a58daaea._comment b/doc/forum/__34__git_annex_sync__34___synced_after_8_hours/comment_4_0051e83196945b97e2f3ed14a58daaea._comment new file mode 100644 index 0000000000..2fc762f77b --- /dev/null +++ b/doc/forum/__34__git_annex_sync__34___synced_after_8_hours/comment_4_0051e83196945b97e2f3ed14a58daaea._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlXt6nnNs-3uw61EGYtxr_AVhJqXybwLR8" + nickname="Bruno" + subject="comment 4" + date="2015-04-16T11:47:50Z" + content=""" +Thanks @CandyAngle, + +Effectively, your tips for reduce a time for some git-annex commands if works fine, i will see in the long term if that is work perfectly + +ex:, now **git annex sync** it work in **45s** ! :) + +Thanks +"""]] From 22e8c637dec2cb6bf979c7b84378d353d340c24a Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Thu, 16 Apr 2015 11:29:49 -0400 Subject: [PATCH 011/362] patch --- doc/bugs/Proxy_support.mdwn | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/doc/bugs/Proxy_support.mdwn b/doc/bugs/Proxy_support.mdwn index ae6eaf6891..05274ded98 100644 --- a/doc/bugs/Proxy_support.mdwn +++ b/doc/bugs/Proxy_support.mdwn @@ -17,3 +17,10 @@ Please provide any additional information below. I don't use networkmanager if proxy information is obtained from it. There should be a fallback to environment variables. [[!tag confirmed]] + +> Here's a patch that shows how to enable proxy support for the +> parts of git-annex that use http-client and http-conduit: +> +> +> Other parts of git-annex use wget/curl and should already support +> the environment variables. From 7d0ba7326e94eddd2626eb35718c7bd33ca96b2f Mon Sep 17 00:00:00 2001 From: CandyAngel Date: Thu, 16 Apr 2015 21:08:32 +0000 Subject: [PATCH 012/362] Added a comment --- .../comment_5_26de32ea240621e23717c55866ad9764._comment | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 doc/forum/__34__git_annex_sync__34___synced_after_8_hours/comment_5_26de32ea240621e23717c55866ad9764._comment diff --git a/doc/forum/__34__git_annex_sync__34___synced_after_8_hours/comment_5_26de32ea240621e23717c55866ad9764._comment b/doc/forum/__34__git_annex_sync__34___synced_after_8_hours/comment_5_26de32ea240621e23717c55866ad9764._comment new file mode 100644 index 0000000000..907f32b940 --- /dev/null +++ b/doc/forum/__34__git_annex_sync__34___synced_after_8_hours/comment_5_26de32ea240621e23717c55866ad9764._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="CandyAngel" + subject="comment 5" + date="2015-04-16T21:08:32Z" + content=""" +My pleasure, glad it is working for you! + +Going forward, you should run *git repack* (without -ad) every now and again to pack new objects into pack files. You can use *git count-objects -v* to find out how many unpacked objects you have. +"""]] From 238bad054bfa2a7879b339200938096efb816210 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=98yvind=20A=2E=20Holm?= Date: Fri, 17 Apr 2015 16:42:16 +0200 Subject: [PATCH 013/362] Various typo fixes in doc/*.mdwn One of my for f in `ls *.mdwn | sort -R`; do aspell -c $f; sleep 2; done sessions. 3647f704-e510-11e4-bf50-000df06acc56 --- doc/git-annex-lock.mdwn | 2 +- doc/git-annex-preferred-content.mdwn | 2 +- doc/git-annex-readpresentkey.mdwn | 2 +- doc/git-annex-shell.mdwn | 2 +- doc/privacy.mdwn | 2 +- doc/transferring_data.mdwn | 2 +- doc/trust.mdwn | 4 ++-- doc/upgrades.mdwn | 4 ++-- 8 files changed, 10 insertions(+), 10 deletions(-) diff --git a/doc/git-annex-lock.mdwn b/doc/git-annex-lock.mdwn index aa03d4ce70..21be9f5aaf 100644 --- a/doc/git-annex-lock.mdwn +++ b/doc/git-annex-lock.mdwn @@ -1,6 +1,6 @@ # NAME -git-annex lock - unco unlock command +git-annex lock - undo unlock command # SYNOPSIS diff --git a/doc/git-annex-preferred-content.mdwn b/doc/git-annex-preferred-content.mdwn index 9ea19ce09a..95dae8c14e 100644 --- a/doc/git-annex-preferred-content.mdwn +++ b/doc/git-annex-preferred-content.mdwn @@ -18,7 +18,7 @@ For example: The main differences are that `exclude=` and `include=` always match relative to the top of the git repository, and that there is -no equivilant to `--in`. +no equivalent to `--in`. For more details about preferred content expressions, see See diff --git a/doc/git-annex-readpresentkey.mdwn b/doc/git-annex-readpresentkey.mdwn index 3e552e05db..6dcc2ca0bc 100644 --- a/doc/git-annex-readpresentkey.mdwn +++ b/doc/git-annex-readpresentkey.mdwn @@ -9,7 +9,7 @@ git annex readpresentkey `key uuid` # DESCRIPTION This plumbing-level command reads git-annex's records about whether -the specified key's content is present in the remote with the speficied +the specified key's content is present in the remote with the specified uuid. It exits 0 if the key is recorded to be present and 1 if not. diff --git a/doc/git-annex-shell.mdwn b/doc/git-annex-shell.mdwn index e43d516574..4185774e79 100644 --- a/doc/git-annex-shell.mdwn +++ b/doc/git-annex-shell.mdwn @@ -86,7 +86,7 @@ to git-annex-shell are: * -- fields=val fields=val.. -- - Additional fields may be specified this way, to retain compatability with + Additional fields may be specified this way, to retain compatibility with past versions of git-annex-shell (that ignore these, but would choke on new dashed options). diff --git a/doc/privacy.mdwn b/doc/privacy.mdwn index 3ac4b1eecf..5be735d1ad 100644 --- a/doc/privacy.mdwn +++ b/doc/privacy.mdwn @@ -41,7 +41,7 @@ output you post, and feel free to remove identifying information. Note that the git-annex assistant *does* sanitize XMPP protocol information logged when debugging is enabled. -If you prefer not to post information publicaly, you can send a GPG +If you prefer not to post information publically, you can send a GPG encrypted mail to Joey Hess (gpg key ID 2512E3C7). Or you can post a public bug report, and send a followup email with private details. diff --git a/doc/transferring_data.mdwn b/doc/transferring_data.mdwn index d1ec5963f5..2aab3b01f9 100644 --- a/doc/transferring_data.mdwn +++ b/doc/transferring_data.mdwn @@ -9,7 +9,7 @@ If a data transfer is interrupted, git-annex retains the partial transfer to allow it to be automatically resumed later. It's equally easy to transfer a single file to or from a repository, -or to launch a retrievel of a massive pile of files from whatever +or to launch a retrieval of a massive pile of files from whatever repositories they are scattered amongst. git-annex automatically uses whatever remotes are currently accessible, diff --git a/doc/trust.mdwn b/doc/trust.mdwn index 1fd47fd1d3..a33c6dd423 100644 --- a/doc/trust.mdwn +++ b/doc/trust.mdwn @@ -45,7 +45,7 @@ archival drive, from which you rarely or never remove content. Deciding when it makes sense to trust the tracking info is up to you. One way to handle this is just to use `--force` when a command cannot -access a remote you trust. Or to use `--trust` to specify a repisitory to +access a remote you trust. Or to use `--trust` to specify a repository to trust temporarily. To configure a repository as fully and permanently trusted, @@ -55,5 +55,5 @@ use the `git annex trust` command. This is used to indicate that you have no trust that the repository exists at all. It's appropriate to use when a drive has been lost, -or a directory irretrevably deleted. It will make git-annex avoid +or a directory irretrievably deleted. It will make git-annex avoid even showing the repository as a place where data might still reside. diff --git a/doc/upgrades.mdwn b/doc/upgrades.mdwn index 0b43a972df..6cf2784e74 100644 --- a/doc/upgrades.mdwn +++ b/doc/upgrades.mdwn @@ -1,9 +1,9 @@ -Occasionally improvments are made to how git-annex stores its data, +Occasionally improvements are made to how git-annex stores its data, that require an upgrade process to convert repositories made with an older version to be used by a newer version. It's annoying, it should happen rarely, but sometimes, it's worth it. -There's a committment that git-annex will always support upgrades from all +There's a commitment that git-annex will always support upgrades from all past versions. After all, you may have offline drives from an earlier git-annex, and might want to use them with a newer git-annex. From 23425c6e9b688bfa1a57563c09c244ec9c7ba1fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=98yvind=20A=2E=20Holm?= Date: Fri, 17 Apr 2015 18:32:03 +0200 Subject: [PATCH 014/362] More typo fixes in doc/*.mdwn --- doc/git-union-merge.mdwn | 2 +- doc/preferred_content.mdwn | 6 +++--- doc/related_software.mdwn | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/doc/git-union-merge.mdwn b/doc/git-union-merge.mdwn index d0ceb3a8f7..ca06d2f933 100644 --- a/doc/git-union-merge.mdwn +++ b/doc/git-union-merge.mdwn @@ -12,7 +12,7 @@ Does a union merge between two refs, storing the result in the specified newref. The union merge will always succeed, but assumes that files can be merged -simply by concacenating together lines from all the oldrefs, in any order. +simply by concatenating together lines from all the oldrefs, in any order. So, this is useful only for branches containing log-type data. Note that this does not touch the checked out working copy. It operates diff --git a/doc/preferred_content.mdwn b/doc/preferred_content.mdwn index 557305aae4..d3aa4fa47e 100644 --- a/doc/preferred_content.mdwn +++ b/doc/preferred_content.mdwn @@ -44,7 +44,7 @@ options in commands like this: git annex get --include='*.mp3' --and -'(' --not --largerthan=100mb -')' -The equivilant preferred content expression looks like this: +The equivalent preferred content expression looks like this: include=*.mp3 and (not largerthan=100mb) @@ -63,7 +63,7 @@ to not retain those files, like this: ### difference: no "in=" -Preferred content expressions have no direct equivilant to `--in`. +Preferred content expressions have no direct equivalent to `--in`. Often, it's best to add repositories to groups, and match against the groups in a preferred content expression. So rather than @@ -146,7 +146,7 @@ expression tuned for your needs, and every repository you put in this group and make its preferred content be "groupwanted" will use it. For example, the archive group only wants to archive 1 copy of each file, -spread amoung every repository in the group. +spread among every repository in the group. Here's how to configure a group named redundantarchive, that instead wants to contain 3 copies of each file: diff --git a/doc/related_software.mdwn b/doc/related_software.mdwn index 4b6f42d2f7..a0462f5414 100644 --- a/doc/related_software.mdwn +++ b/doc/related_software.mdwn @@ -4,9 +4,9 @@ designed to interoperate with it. * The [[git-annex assistant|assistant]] is included in git-annex, and extends its use cases into new territory. * [gitlab-shell](https://gitlab.com/gitlab-org/gitlab-shell) supports - git-annex. So git-annex can be used with repositries served by Gitlab, + git-annex. So git-annex can be used with repositories served by GitLab, including gitlab.com, or deploy your own. - [See Gitlab's announcment](https://about.gitlab.com/2015/02/17/gitlab-annex-solves-the-problem-of-versioning-large-binaries-with-git/) + [See GitLab's announcement](https://about.gitlab.com/2015/02/17/gitlab-annex-solves-the-problem-of-versioning-large-binaries-with-git/) * Emacs Org mode can auto-commit attached files to git-annex. * [git annex darktable integration](https://github.com/xxv/darktable-git-annex) * [Magit](http://github.com/magit/magit), an Emacs mode for Git, has From 44c88af81f272d3bd4b904aa87d43a5a8c6ccd76 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=98yvind=20A=2E=20Holm?= Date: Fri, 17 Apr 2015 18:35:23 +0200 Subject: [PATCH 015/362] Typo fixes in doc/tips/*.mdwn Gotta do at least something when I don't have the faintest clue about Haskell. :) Learning Haskell is on my agenda, though. --- doc/tips/Synology_NAS_and_git_annex.mdwn | 2 +- doc/tips/file_manager_integration.mdwn | 8 ++++---- doc/tips/megaannex.mdwn | 2 +- doc/tips/using_gitolite_with_git-annex.mdwn | 2 +- doc/tips/using_the_web_as_a_special_remote.mdwn | 2 +- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/doc/tips/Synology_NAS_and_git_annex.mdwn b/doc/tips/Synology_NAS_and_git_annex.mdwn index 50c6044838..8a6d282c92 100644 --- a/doc/tips/Synology_NAS_and_git_annex.mdwn +++ b/doc/tips/Synology_NAS_and_git_annex.mdwn @@ -19,7 +19,7 @@ This is known to work with DSM 4.3-3810 Update 1 and git-annex standalone versio (2) Setup ssh key based authentication with the Synology for each computer you want to sync with it. You want a specific key that is used only by git-annex, for each computer. Again, many good guides online. -(3) In the Synology .ssh/authorized_keys file for your account, add (substituing your username) +(3) In the Synology .ssh/authorized_keys file for your account, add (substituting your username) [[!format sh """ command="/home/$yourusername/.ssh/git-annex-shell" """]] diff --git a/doc/tips/file_manager_integration.mdwn b/doc/tips/file_manager_integration.mdwn index 4429b90935..cd4218ff27 100644 --- a/doc/tips/file_manager_integration.mdwn +++ b/doc/tips/file_manager_integration.mdwn @@ -24,9 +24,9 @@ Even more recent git-annex comes with built-in integration with Konqueror. This is set up by git-annex creating a `~/.kde/share/kde4/services/ServiceMenus/git-annex.desktop file. -## XFCE (Thunar) +## Xfce (Thunar) -XFCE uses the Thunar file manager, which can also be easily configured to +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, drop, and undo with the following commands: @@ -72,12 +72,12 @@ This gives me the resulting config on disk, in `.config/Thunar/uca.xml`: -The complete instructions on how to setup actions is [in the XFCE documentation](http://docs.xfce.org/xfce/thunar/custom-actions). +The complete instructions on how to setup actions is [in the Xfce documentation](http://docs.xfce.org/xfce/thunar/custom-actions). ## OS X (Finder) For OS X, it is possible to get context menus in Finder. Due to how OS X -deals with sym links, one needs to operate on folders if using indirect +deals with symlinks, one needs to operate on folders if using indirect mode. Direct mode operation has not been tested. 1. Open Automator and create a new Service. diff --git a/doc/tips/megaannex.mdwn b/doc/tips/megaannex.mdwn index 46bab4aefd..b547aaa5c7 100644 --- a/doc/tips/megaannex.mdwn +++ b/doc/tips/megaannex.mdwn @@ -1,7 +1,7 @@ megaannex 0.2.0 ========= -Hook program for gitannex to use mega.co.nz as backend +Hook program for git-annex to use mega.co.nz as backend # Requirements: diff --git a/doc/tips/using_gitolite_with_git-annex.mdwn b/doc/tips/using_gitolite_with_git-annex.mdwn index 31f34c6fb0..0d20c93723 100644 --- a/doc/tips/using_gitolite_with_git-annex.mdwn +++ b/doc/tips/using_gitolite_with_git-annex.mdwn @@ -92,7 +92,7 @@ Make the ADC directory, and a "ua" subdirectory. mkdir -p /usr/local/lib/gitolite/adc/ua -Install the git-annex-shell ADC into the "ua" subdirectory from the gitolie repository. +Install the git-annex-shell ADC into the "ua" subdirectory from the gitolite repository.
   
 cd /usr/local/lib/gitolite/adc/ua/
diff --git a/doc/tips/using_the_web_as_a_special_remote.mdwn b/doc/tips/using_the_web_as_a_special_remote.mdwn
index 087d2e24bd..2dc3419ad3 100644
--- a/doc/tips/using_the_web_as_a_special_remote.mdwn
+++ b/doc/tips/using_the_web_as_a_special_remote.mdwn
@@ -81,7 +81,7 @@ it is a video and download the video content for offline viewing.
 Later, in another clone of the repository, you can run `git annex get` on
 the file and it will also be downloaded with the help of quvi. This works
 even if the video host has transcoded or otherwise changed the video
-in the meantime; the assumption is that these video files are equivilant.
+in the meantime; the assumption is that these video files are equivalent.
 
 There is an `annex.quvi-options` configuration setting that can be used
 to pass parameters to quvi. For example, you could set `git config

From 3ca491b5457d342e1241d29b09892ba65aafc6cc Mon Sep 17 00:00:00 2001
From: 
 "https://www.google.com/accounts/o8/id?id=AItOawkW9u-8uqR62QBZjeTNCXsL7Ds55dAMGbA"
 
Date: Fri, 17 Apr 2015 21:50:25 +0000
Subject: [PATCH 016/362] git annex removed deleted recovery

---
 ...es__44___how_can_I_recover_them__63__.mdwn | 19 +++++++++++++++++++
 1 file changed, 19 insertions(+)
 create mode 100644 doc/forum/Git-annex_deleted_all_my_files__44___how_can_I_recover_them__63__.mdwn

diff --git a/doc/forum/Git-annex_deleted_all_my_files__44___how_can_I_recover_them__63__.mdwn b/doc/forum/Git-annex_deleted_all_my_files__44___how_can_I_recover_them__63__.mdwn
new file mode 100644
index 0000000000..ed86cd8833
--- /dev/null
+++ b/doc/forum/Git-annex_deleted_all_my_files__44___how_can_I_recover_them__63__.mdwn
@@ -0,0 +1,19 @@
+I am trying to follow this guide:
+
+https://git-annex.branchable.com/walkthrough/
+
+I:
+
+* created a repository
+* added a remote
+* added all the files via `git annex add .`
+* commited my changes
+* synced my repositories
+
+
+By the time I tied to actually get the content from repo one into repo two (via `git annex get folder`) I noticed that all of my stuff had been deleted from repo one (and not backed up by git annex anywhere else!).
+
+How can I get my stuff back?
+
+Also, why would any software which is meant for backup (or any sane software in general) delete stuff without me actually typing `rm` or `delete` into the terminal and without giving me a big warning message and a confirmation prompt? 
+ 

From de6a75f3920137d38a553d674672dc9fc178613a Mon Sep 17 00:00:00 2001
From: 
 "https://www.google.com/accounts/o8/id?id=AItOawkW9u-8uqR62QBZjeTNCXsL7Ds55dAMGbA"
 
Date: Fri, 17 Apr 2015 22:01:39 +0000
Subject: [PATCH 017/362]

---
 ...deleted_all_my_files__44___how_can_I_recover_them__63__.mdwn | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/doc/forum/Git-annex_deleted_all_my_files__44___how_can_I_recover_them__63__.mdwn b/doc/forum/Git-annex_deleted_all_my_files__44___how_can_I_recover_them__63__.mdwn
index ed86cd8833..c5a0d70fb8 100644
--- a/doc/forum/Git-annex_deleted_all_my_files__44___how_can_I_recover_them__63__.mdwn
+++ b/doc/forum/Git-annex_deleted_all_my_files__44___how_can_I_recover_them__63__.mdwn
@@ -15,5 +15,5 @@ By the time I tied to actually get the content from repo one into repo two (via
 
 How can I get my stuff back?
 
-Also, why would any software which is meant for backup (or any sane software in general) delete stuff without me actually typing `rm` or `delete` into the terminal and without giving me a big warning message and a confirmation prompt? 
+Also, why would any software which is meant for backup or archiving (or any sane software in general) delete stuff without me actually typing `rm` or `delete` into the terminal and without giving me a big warning message and a confirmation prompt? 
  

From 894a8948bef5b13d6a9f08a6f4f3a36ad3550218 Mon Sep 17 00:00:00 2001
From: 
 "https://www.google.com/accounts/o8/id?id=AItOawkW9u-8uqR62QBZjeTNCXsL7Ds55dAMGbA"
 
Date: Fri, 17 Apr 2015 22:15:07 +0000
Subject: [PATCH 018/362] Added a comment

---
 .../comment_5_fe2ba9550fc9dc2dc877965b436fe823._comment   | 8 ++++++++
 1 file changed, 8 insertions(+)
 create mode 100644 doc/bugs/git-annex_happily_deleted_most_of_my_files___36____35____38____33__/comment_5_fe2ba9550fc9dc2dc877965b436fe823._comment

diff --git a/doc/bugs/git-annex_happily_deleted_most_of_my_files___36____35____38____33__/comment_5_fe2ba9550fc9dc2dc877965b436fe823._comment b/doc/bugs/git-annex_happily_deleted_most_of_my_files___36____35____38____33__/comment_5_fe2ba9550fc9dc2dc877965b436fe823._comment
new file mode 100644
index 0000000000..d5d2c35d20
--- /dev/null
+++ b/doc/bugs/git-annex_happily_deleted_most_of_my_files___36____35____38____33__/comment_5_fe2ba9550fc9dc2dc877965b436fe823._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawkW9u-8uqR62QBZjeTNCXsL7Ds55dAMGbA"
+ nickname="Horea"
+ subject="comment 5"
+ date="2015-04-17T22:15:07Z"
+ content="""
+I am experiencing the same thing (and have experienced it 1.5 years ago as well, right before deciding to never again use git-annex). Enough info or not is it simply unacceptable for your software to do this and you should look into it as best you can. Try to repeat the steps which he described. I for one, am getting much the same results.
+"""]]

From 3a078ab357de50444a64f08e46f2b5d0939d9047 Mon Sep 17 00:00:00 2001
From: Joey Hess 
Date: Fri, 17 Apr 2015 21:29:15 -0400
Subject: [PATCH 019/362] When a key's size is unknown, still check the
 annex.diskreserve, and avoid getting content if the disk is too full.

We can't check if there's enough disk space to download the content,
but we *can* check if there's certainly not enough!
---
 Annex/Content.hs | 24 +++++++++++++-----------
 debian/changelog |  2 ++
 2 files changed, 15 insertions(+), 11 deletions(-)

diff --git a/Annex/Content.hs b/Annex/Content.hs
index 9d70ccee33..bbf87880b8 100644
--- a/Annex/Content.hs
+++ b/Annex/Content.hs
@@ -280,17 +280,19 @@ withTmp key action = do
 {- 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
+checkDiskSpace destination key alreadythere = ifM (Annex.getState Annex.force)
+	( return True
+	, do
+		reserve <- annexDiskReserve <$> Annex.getGitConfig
+		free <- liftIO . getDiskFree =<< dir
+		case (free, fromMaybe 1 (keySize key)) of
+			(Just have, need) -> do
+				let ok = (need + reserve <= have + alreadythere)
+				unless ok $
+					needmorespace (need + reserve - have - alreadythere)
+				return ok
+			_ -> return True
+	)
   where
 	dir = maybe (fromRepo gitAnnexDir) return destination
 	needmorespace n =
diff --git a/debian/changelog b/debian/changelog
index 5f62dc62c6..8bbadfea27 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -12,6 +12,8 @@ git-annex (5.20150410) UNRELEASED; urgency=medium
   * bittorrent: Fix handling of magnet links.
   * Windows: Fixed support of remotes on other drives.
     (A reversion introduced in version 5.20150113.)
+  * When a key's size is unknown, still check the annex.diskreserve,
+    and avoid getting content if the disk is too full.
 
  -- Joey Hess   Thu, 09 Apr 2015 20:59:43 -0400
 

From 42285e30f6a7ddeb2d14fe5d8fda99a4fb84d6d9 Mon Sep 17 00:00:00 2001
From: CandyAngel 
Date: Sat, 18 Apr 2015 07:16:01 +0000
Subject: [PATCH 020/362] Added a comment

---
 .../comment_1_65b41a6eb28261e04e4fe8732f97a1f1._comment  | 9 +++++++++
 1 file changed, 9 insertions(+)
 create mode 100644 doc/forum/Git-annex_deleted_all_my_files__44___how_can_I_recover_them__63__/comment_1_65b41a6eb28261e04e4fe8732f97a1f1._comment

diff --git a/doc/forum/Git-annex_deleted_all_my_files__44___how_can_I_recover_them__63__/comment_1_65b41a6eb28261e04e4fe8732f97a1f1._comment b/doc/forum/Git-annex_deleted_all_my_files__44___how_can_I_recover_them__63__/comment_1_65b41a6eb28261e04e4fe8732f97a1f1._comment
new file mode 100644
index 0000000000..c06b202f29
--- /dev/null
+++ b/doc/forum/Git-annex_deleted_all_my_files__44___how_can_I_recover_them__63__/comment_1_65b41a6eb28261e04e4fe8732f97a1f1._comment
@@ -0,0 +1,9 @@
+[[!comment format=mdwn
+ username="CandyAngel"
+ subject="comment 1"
+ date="2015-04-18T07:16:01Z"
+ content="""
+Are you sure the files are actually deleted? You don't mention using direct mode or anything, so you should be able to reset the git repository to the last commit you did (restoring the symlinks) and be back on track.
+
+Sounds like you missed something either in your description of the problem, or while following the tutorial.
+"""]]

From 466e795747b32c0373fb20b6ea0d0a00e6b30708 Mon Sep 17 00:00:00 2001
From: 
 "https://www.google.com/accounts/o8/id?id=AItOawlZ-6dtxJY4cP7shhvV8E6YyuV0Rak8it4"
 
Date: Sat, 18 Apr 2015 07:56:32 +0000
Subject: [PATCH 021/362] Added a comment: direct mode: avoid broken symlinks;
 indirect mode: matching-options in views (not woring)

---
 ..._005e9254a1239164df34ab5fbf2115a8._comment | 27 +++++++++++++++++++
 1 file changed, 27 insertions(+)
 create mode 100644 doc/forum/How_do_I_hide_files_not_present_in_the_local_annex__63__/comment_1_005e9254a1239164df34ab5fbf2115a8._comment

diff --git a/doc/forum/How_do_I_hide_files_not_present_in_the_local_annex__63__/comment_1_005e9254a1239164df34ab5fbf2115a8._comment b/doc/forum/How_do_I_hide_files_not_present_in_the_local_annex__63__/comment_1_005e9254a1239164df34ab5fbf2115a8._comment
new file mode 100644
index 0000000000..b15296b33b
--- /dev/null
+++ b/doc/forum/How_do_I_hide_files_not_present_in_the_local_annex__63__/comment_1_005e9254a1239164df34ab5fbf2115a8._comment
@@ -0,0 +1,27 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawlZ-6dtxJY4cP7shhvV8E6YyuV0Rak8it4"
+ nickname="Giovanni"
+ subject="direct mode: avoid broken symlinks; indirect mode: matching-options in views (not woring)"
+ date="2015-04-18T07:56:32Z"
+ content="""
+I would like to see only locally present files too, for some of my use case (e.g.: movies exported via NFS to a XBMS/Kodi media player)
+
+I'm using git annex (debian) version 5.20141024~bpo70+1
+
+# [direct mode](http://git-annex.branchable.com/direct_mode/)
+
+as far as I understand, in direct mode broken symlinks (or text files placeholders for filesystems not supporting symlinks) are there by [design](
+https://git-annex.branchable.com/design/assistant/desymlink/), in particular in [partial content](
+https://git-annex.branchable.com/design/assistant/partial_content/) use case where \"there needs to be a way for the user to browse files not on the gadget and request they be transferred to it\"
+
+if there are no other reasons to have broken symlinks (or placeholders) I think git-annex should avoid them (at least in direct mode): if a user needs a file not listed by regular filesystem tools she can simply `git-annex find` it and `git-annex get` it: or do I miss something here?
+
+please consider avoiding broken symlinks or placeholders
+
+# indirect mode
+
+in indirect mode we could live with broken symlinks using views; I tried `git annex view /=* --include=\"*\" --in=here` but the resulting tree was not filtered by matching-options
+
+are matching-options intended to work with the view command or not?
+
+"""]]

From e0a840e7358def15a21dbc9c9847ffa5a496d49b Mon Sep 17 00:00:00 2001
From: Joey Hess 
Date: Sat, 18 Apr 2015 12:19:32 -0400
Subject: [PATCH 022/362] FORCE_GIT_VERSION hack no longer needed; windows
 autobuilder fixed

---
 standalone/windows/build.sh | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/standalone/windows/build.sh b/standalone/windows/build.sh
index 56323d8a33..ef990004c3 100755
--- a/standalone/windows/build.sh
+++ b/standalone/windows/build.sh
@@ -26,8 +26,8 @@ export UPGRADE_LOCATION
 
 # This can be used to force git-annex to build supporting a particular
 # version of git, instead of the version installed at build time.
-FORCE_GIT_VERSION=1.9.5
-export FORCE_GIT_VERSION
+#FORCE_GIT_VERSION=1.9.5
+#export FORCE_GIT_VERSION
 
 # Uncomment to get rid of cabal installed libraries.
 #rm -rf /c/Users/jenkins/AppData/Roaming/cabal /c/Users/jenkins/AppData/Roaming/ghc

From 8065671ffad91d582ad60f1bf5565a5373fd58bb Mon Sep 17 00:00:00 2001
From: Joey Hess 
Date: Sat, 18 Apr 2015 12:39:41 -0400
Subject: [PATCH 023/362] fixed for us by newer http-client library!

---
 doc/bugs/Proxy_support.mdwn | 16 ++++++++++++++++
 1 file changed, 16 insertions(+)

diff --git a/doc/bugs/Proxy_support.mdwn b/doc/bugs/Proxy_support.mdwn
index 05274ded98..2af63d706f 100644
--- a/doc/bugs/Proxy_support.mdwn
+++ b/doc/bugs/Proxy_support.mdwn
@@ -24,3 +24,19 @@ I don't use networkmanager if proxy information is obtained from it. There shoul
 > 
 > Other parts of git-annex use wget/curl and should already support
 > the environment variables.
+
+>> I had a closer look at this, and it turns out that http-client 
+>> now enables http proxy support by default, when the environment variable
+>> is set. Since version 0.4.7. See `defaultProxy`.
+>> 
+>> git-annex uses http-client for all its http access (either directly
+>> or through layers like http-conduit and DAV).
+>> 
+>> So I don't need to change
+>> git-annex at all; it just needs to be built with a new enough version
+>> of http-client. This will happen for the linux autobuilders once the new
+>> version reaches Debian. I've updated the OSX autobuilder's http-client
+>> so it will already support proxying and anyone can built git-annex
+>> using the new http-client and get proxy support.
+>>
+>> Calling this [[done]] as nothing remains to do in git-annex. --[[Joey]]

From cfe20dd788480e8dbc36f6e40780bab3757cd4f9 Mon Sep 17 00:00:00 2001
From: Joey Hess 
Date: Sat, 18 Apr 2015 12:44:44 -0400
Subject: [PATCH 024/362] update pinned versions for android and armel to use
 new enough http-client for proxy support

I have not updated the autobuilder yet; these versions seem ok by
inspection.
---
 standalone/android/cabal.config | 4 ++--
 standalone/linux/cabal.config   | 4 ++--
 2 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/standalone/android/cabal.config b/standalone/android/cabal.config
index 4eecbfeaf2..5ba5bacc25 100644
--- a/standalone/android/cabal.config
+++ b/standalone/android/cabal.config
@@ -82,9 +82,9 @@ constraints: Crypto ==4.2.5.1,
              hinotify ==0.3.5,
              hjsmin ==0.1.4.7,
              hslogger ==1.2.1,
-             http-client ==0.3.8.2,
+             http-client ==0.4.11.1,
              http-client-tls ==0.2.2,
-             http-conduit ==2.1.2.3,
+             http-conduit ==2.1.5,
              http-date ==0.0.2,
              http-types ==0.8.5,
              hxt ==9.3.1.4,
diff --git a/standalone/linux/cabal.config b/standalone/linux/cabal.config
index 4eecbfeaf2..5ba5bacc25 100644
--- a/standalone/linux/cabal.config
+++ b/standalone/linux/cabal.config
@@ -82,9 +82,9 @@ constraints: Crypto ==4.2.5.1,
              hinotify ==0.3.5,
              hjsmin ==0.1.4.7,
              hslogger ==1.2.1,
-             http-client ==0.3.8.2,
+             http-client ==0.4.11.1,
              http-client-tls ==0.2.2,
-             http-conduit ==2.1.2.3,
+             http-conduit ==2.1.5,
              http-date ==0.0.2,
              http-types ==0.8.5,
              hxt ==9.3.1.4,

From 66806fa52775d33377ab9ce19919ac61ac791690 Mon Sep 17 00:00:00 2001
From: CandyAngel 
Date: Sat, 18 Apr 2015 16:55:50 +0000
Subject: [PATCH 025/362]

---
 ...___copies_symlinks_instead_of_content.mdwn | 78 +++++++++++++++++++
 1 file changed, 78 insertions(+)
 create mode 100644 doc/bugs/fsck_--from___36__remote__44___copies_symlinks_instead_of_content.mdwn

diff --git a/doc/bugs/fsck_--from___36__remote__44___copies_symlinks_instead_of_content.mdwn b/doc/bugs/fsck_--from___36__remote__44___copies_symlinks_instead_of_content.mdwn
new file mode 100644
index 0000000000..593b7e9aad
--- /dev/null
+++ b/doc/bugs/fsck_--from___36__remote__44___copies_symlinks_instead_of_content.mdwn
@@ -0,0 +1,78 @@
+### Please describe the problem.
+
+    git annex fsck --from $remote
+
+copies the symlinks from the remote into *.git/annex/tmp*, which then fail to fsck as they don't point to content.
+
+In the transcript below, the 'a' file should fail fsck, but the rest pass.
+
+### What steps will reproduce the problem?
+
+See transcript
+
+### What version of git-annex are you using? On what operating system?
+
+* git-annex version: 5.20150409-g3575ee5
+* Arch Linux (git-annex-bin)
+
+### Please provide any additional information below.
+
+    ## git init origin
+    ## cd corrupt/
+    ## git annex init corrupt
+    ## echo a > a.txt
+    ## echo b > b.txt
+    ## echo c > c.txt
+
+    ## git annex add .
+    add a.txt ok
+    add b.txt ok
+    add c.txt ok
+    (recording state in git...)
+
+    ## git commit -m "add files"
+    [master (root-commit) 1d670a5] add files
+     3 files changed, 3 insertions(+)
+     create mode 120000 a.txt
+     create mode 120000 b.txt
+     create mode 120000 c.txt
+
+("corrupting" a file not needed but here for completeness)
+
+    ## chmod +w .git/annex/objects/41/pJ/SHA256E-s2--87428fc522803d31065e7bce3cf03fe475096631e5e07bbd7a0fde60c4cf25c7.txt/
+    ## echo 'd' > .git/annex/objects/41/pJ/SHA256E-s2--87428fc522803d31065e7bce3cf03fe475096631e5e07bbd7a0fde60c4cf25c7.txt/SHA256E-s2--87428fc522803d31065e7bce3cf03fe475096631e5e07bbd7a0fde60c4cf25c7.txt
+
+    ## cd ..
+
+    ## git clone corrupt/ recovery/
+    Cloning into 'recovery'...
+    done.
+
+    ## cd recovery/
+
+    ## git annex init recovery
+    init recovery (merging origin/git-annex into git-annex...)
+    (recording state in git...)
+    ok
+    (recording state in git...)
+
+    ## git annex fsck --from origin
+    fsck a.txt 
+    git-annex: .git/annex/tmp/fsck24477.SHA256E-s2--87428fc522803d31065e7bce3cf03fe475096631e5e07bbd7a0fde60c4cf25c7.txt: getFileStatus: does not exist (No such file or directory)
+    failed
+    fsck b.txt 
+    git-annex: .git/annex/tmp/fsck24477.SHA256E-s2--0263829989b6fd954f72baaf2fc64bc2e2f01d692d4de72986ea808f6e99813f.txt: getFileStatus: does not exist (No such file or directory)
+    failed
+    fsck c.txt 
+    git-annex: .git/annex/tmp/fsck24477.SHA256E-s2--a3a5e715f0cc574a73c3f9bebb6bc24f32ffd5b67b387244c2c909da779a1478.txt: getFileStatus: does not exist (No such file or directory)
+    failed
+    (recording state in git...)
+    git-annex: fsck: 3 failed
+
+    ## ls -lah .git/annex/tmp/
+    total 20K
+    drwxr-xr-x 2 gemma users 4.0K Apr 18 17:27 ..
+    drwxr-xr-x 5 gemma users 4.0K Apr 18 17:27 ..
+    lrwxrwxrwx 1 gemma users  197 Apr 18 17:27 fsck24477.SHA256E-s2--0263829989b6fd954f72baaf2fc64bc2e2f01d692d4de72986ea808f6e99813f.txt -> ../corrupt/.git/annex/objects/x7/01/SHA256E-s2--0263829989b6fd954f72baaf2fc64bc2e2f01d692d4de72986ea808f6e99813f.txt/SHA256E-s2--0263829989b6fd954f72baaf2fc64bc2e2f01d692d4de72986ea808f6e99813f.txt
+    lrwxrwxrwx 1 gemma users  197 Apr 18 17:27 fsck24477.SHA256E-s2--87428fc522803d31065e7bce3cf03fe475096631e5e07bbd7a0fde60c4cf25c7.txt -> ../corrupt/.git/annex/objects/41/pJ/SHA256E-s2--87428fc522803d31065e7bce3cf03fe475096631e5e07bbd7a0fde60c4cf25c7.txt/SHA256E-s2--87428fc522803d31065e7bce3cf03fe475096631e5e07bbd7a0fde60c4cf25c7.txt
+    lrwxrwxrwx 1 gemma users  197 Apr 18 17:27 fsck24477.SHA256E-s2--a3a5e715f0cc574a73c3f9bebb6bc24f32ffd5b67b387244c2c909da779a1478.txt -> ../corrupt/.git/annex/objects/Vw/zz/SHA256E-s2--a3a5e715f0cc574a73c3f9bebb6bc24f32ffd5b67b387244c2c909da779a1478.txt/SHA256E-s2--a3a5e715f0cc574a73c3f9bebb6bc24f32ffd5b67b387244c2c909da779a1478.txt

From 234830b5c9853c522cd7034ec0ad98196738d5ea Mon Sep 17 00:00:00 2001
From: Joey Hess 
Date: Sat, 18 Apr 2015 13:07:57 -0400
Subject: [PATCH 026/362] comment

---
 Types/Remote.hs | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/Types/Remote.hs b/Types/Remote.hs
index 5df08c7757..ad8c0c4a74 100644
--- a/Types/Remote.hs
+++ b/Types/Remote.hs
@@ -66,7 +66,8 @@ data RemoteA a = Remote {
 	-- (The MeterUpdate does not need to be used if it retrieves
 	-- directly to the file, and not to an intermediate file.)
 	retrieveKeyFile :: Key -> AssociatedFile -> FilePath -> MeterUpdate -> a Bool,
-	-- retrieves a key's contents to a tmp file, if it can be done cheaply
+	-- Retrieves a key's contents to a tmp file, if it can be done cheaply.
+	-- It's ok to create a symlink or hardlink.
 	retrieveKeyFileCheap :: Key -> FilePath -> a Bool,
 	-- removes a key's contents (succeeds if the contents are not present)
 	removeKey :: Key -> a Bool,

From 0def1f0b532443d72185c313c5f051edff6cc614 Mon Sep 17 00:00:00 2001
From: Joey Hess 
Date: Sat, 18 Apr 2015 13:36:12 -0400
Subject: [PATCH 027/362] Fix fsck --from a git remote in a local directory,
 and from a directory special remote. This was a reversion caused by the
 relative path changes in 5.20150113.

The directory special remote was not affected in its normal configuration,
since annex-directory is an absolute path normally. But it could fail
when a relative path was used.

The git remote was affected even when an absolute path to it was used in
.git/config, since git-annex now converts all such paths to relative.
---
 Remote/Directory.hs                                 | 10 +++++++---
 Remote/Git.hs                                       | 13 ++++++++++---
 Test.hs                                             |  5 +++++
 debian/changelog                                    |  3 +++
 ...te__44___copies_symlinks_instead_of_content.mdwn |  2 ++
 5 files changed, 27 insertions(+), 6 deletions(-)

diff --git a/Remote/Directory.hs b/Remote/Directory.hs
index 2eeb793179..916013172d 100644
--- a/Remote/Directory.hs
+++ b/Remote/Directory.hs
@@ -162,9 +162,13 @@ retrieveCheap _ (UnpaddedChunks _) _ _ = return False
 retrieveCheap _ (LegacyChunks _) _ _ = return False
 #ifndef mingw32_HOST_OS
 retrieveCheap d NoChunks k f = liftIO $ catchBoolIO $ do
-	file <- getLocation d k
-	createSymbolicLink file f
-	return True
+	file <- absPath =<< getLocation d k
+	ifM (doesFileExist file)
+		( do
+			createSymbolicLink file f
+			return True
+		, return False
+		)
 #else
 retrieveCheap _ _ _ _ = return False
 #endif
diff --git a/Remote/Git.hs b/Remote/Git.hs
index abefc113e8..fdd0049ca9 100644
--- a/Remote/Git.hs
+++ b/Remote/Git.hs
@@ -445,10 +445,17 @@ copyFromRemote' r key file dest
 copyFromRemoteCheap :: Remote -> Key -> FilePath -> Annex Bool
 #ifndef mingw32_HOST_OS
 copyFromRemoteCheap r key file
-	| not $ Git.repoIsUrl (repo r) = guardUsable (repo r) (return False) $ do
-		loc <- liftIO $ gitAnnexLocation key (repo r) $
+	| not $ Git.repoIsUrl (repo r) = guardUsable (repo r) (return False) $ liftIO $ do
+		loc <- gitAnnexLocation key (repo r) $
 			fromJust $ remoteGitConfig $ gitconfig r
-		liftIO $ catchBoolIO $ createSymbolicLink loc file >> return True
+		ifM (doesFileExist loc)
+			( do
+				absloc <- absPath loc
+				catchBoolIO $ do
+					createSymbolicLink absloc file
+					return True
+			, return False
+			)
 	| Git.repoIsSsh (repo r) =
 		ifM (Annex.Content.preseedTmp key file)
 			( copyFromRemote' r key Nothing file
diff --git a/Test.hs b/Test.hs
index e57c9021cb..e8440dd1d5 100644
--- a/Test.hs
+++ b/Test.hs
@@ -199,6 +199,7 @@ unitTests note = testGroup ("Unit Tests " ++ note)
 	, testCase "fsck (bare)" test_fsck_bare
 	, testCase "fsck (local untrusted)" test_fsck_localuntrusted
 	, testCase "fsck (remote untrusted)" test_fsck_remoteuntrusted
+	, testCase "fsck --from remote" test_fsck_fromremote
 	, testCase "migrate" test_migrate
 	, testCase "migrate (via gitattributes)" test_migrate_via_gitattributes
 	, testCase "unused" test_unused
@@ -613,6 +614,10 @@ test_fsck_remoteuntrusted = intmpclonerepo $ do
 	git_annex "untrust" ["origin"] @? "untrust of origin failed"
 	fsck_should_fail "content not replicated to enough non-untrusted repositories"
 
+test_fsck_fromremote :: Assertion
+test_fsck_fromremote = intmpclonerepo $ do
+	git_annex "fsck" ["--from", "origin"] @? "fsck --from origin failed"
+
 fsck_should_fail :: String -> Assertion
 fsck_should_fail m = not <$> git_annex "fsck" []
 	@? "fsck failed to fail with " ++ m
diff --git a/debian/changelog b/debian/changelog
index 8bbadfea27..fc7c23d87d 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -14,6 +14,9 @@ git-annex (5.20150410) UNRELEASED; urgency=medium
     (A reversion introduced in version 5.20150113.)
   * When a key's size is unknown, still check the annex.diskreserve,
     and avoid getting content if the disk is too full.
+  * Fix fsck --from a git remote in a local directory, and from
+    a directory special remote.
+    This was a reversion caused by the relative path changes in 5.20150113.
 
  -- Joey Hess   Thu, 09 Apr 2015 20:59:43 -0400
 
diff --git a/doc/bugs/fsck_--from___36__remote__44___copies_symlinks_instead_of_content.mdwn b/doc/bugs/fsck_--from___36__remote__44___copies_symlinks_instead_of_content.mdwn
index 593b7e9aad..732af29909 100644
--- a/doc/bugs/fsck_--from___36__remote__44___copies_symlinks_instead_of_content.mdwn
+++ b/doc/bugs/fsck_--from___36__remote__44___copies_symlinks_instead_of_content.mdwn
@@ -76,3 +76,5 @@ See transcript
     lrwxrwxrwx 1 gemma users  197 Apr 18 17:27 fsck24477.SHA256E-s2--0263829989b6fd954f72baaf2fc64bc2e2f01d692d4de72986ea808f6e99813f.txt -> ../corrupt/.git/annex/objects/x7/01/SHA256E-s2--0263829989b6fd954f72baaf2fc64bc2e2f01d692d4de72986ea808f6e99813f.txt/SHA256E-s2--0263829989b6fd954f72baaf2fc64bc2e2f01d692d4de72986ea808f6e99813f.txt
     lrwxrwxrwx 1 gemma users  197 Apr 18 17:27 fsck24477.SHA256E-s2--87428fc522803d31065e7bce3cf03fe475096631e5e07bbd7a0fde60c4cf25c7.txt -> ../corrupt/.git/annex/objects/41/pJ/SHA256E-s2--87428fc522803d31065e7bce3cf03fe475096631e5e07bbd7a0fde60c4cf25c7.txt/SHA256E-s2--87428fc522803d31065e7bce3cf03fe475096631e5e07bbd7a0fde60c4cf25c7.txt
     lrwxrwxrwx 1 gemma users  197 Apr 18 17:27 fsck24477.SHA256E-s2--a3a5e715f0cc574a73c3f9bebb6bc24f32ffd5b67b387244c2c909da779a1478.txt -> ../corrupt/.git/annex/objects/Vw/zz/SHA256E-s2--a3a5e715f0cc574a73c3f9bebb6bc24f32ffd5b67b387244c2c909da779a1478.txt/SHA256E-s2--a3a5e715f0cc574a73c3f9bebb6bc24f32ffd5b67b387244c2c909da779a1478.txt
+
+> reproduced, test cased, fixed, [[done]] --[[Joey]]

From 8489057e8d883271394e5d332e2457387e5d2903 Mon Sep 17 00:00:00 2001
From: Joey Hess 
Date: Sat, 18 Apr 2015 14:13:07 -0400
Subject: [PATCH 028/362] fsck --from remote: When bad content is found in the
 remote, and the local repo does not have a copy of the content, preserve the
 bad content in .git/annex/bad/ to avoid further data loss.

---
 Command/Fsck.hs     | 40 ++++++++++++++++++++++++++++++++--------
 Utility/CopyFile.hs |  7 ++++++-
 debian/changelog    |  3 +++
 3 files changed, 41 insertions(+), 9 deletions(-)

diff --git a/Command/Fsck.hs b/Command/Fsck.hs
index 08753b6123..74cff74912 100644
--- a/Command/Fsck.hs
+++ b/Command/Fsck.hs
@@ -31,6 +31,7 @@ import Config
 import Types.Key
 import Types.CleanupActions
 import Utility.HumanTime
+import Utility.CopyFile
 import Git.FilePath
 import Utility.PID
 import qualified Database.Fsck as FsckDb
@@ -273,7 +274,7 @@ checkKeySize key = ifM isDirect
 checkKeySizeRemote :: Key -> Remote -> Maybe FilePath -> Annex Bool
 checkKeySizeRemote _ _ Nothing = return True
 checkKeySizeRemote key remote (Just file) =
-	checkKeySizeOr (badContentRemote remote) key file
+	checkKeySizeOr (badContentRemote remote file) key file
 
 checkKeySizeOr :: (Key -> Annex String) -> Key -> FilePath -> Annex Bool
 checkKeySizeOr bad key file = case Types.Key.keySize key of
@@ -318,7 +319,7 @@ checkBackend backend key mfile = go =<< isDirect
 checkBackendRemote :: Backend -> Key -> Remote -> Maybe FilePath -> Annex Bool
 checkBackendRemote backend key remote = maybe (return True) go
   where
-	go = checkBackendOr (badContentRemote remote) backend key
+	go file = checkBackendOr (badContentRemote remote file) backend key file
 
 checkBackendOr :: (Key -> Annex String) -> Backend -> Key -> FilePath -> Annex Bool
 checkBackendOr bad backend key file =
@@ -380,13 +381,36 @@ badContentDirect file key = do
 	logStatus key InfoMissing
 	return "left in place for you to examine"
 
-badContentRemote :: Remote -> Key -> Annex String
-badContentRemote remote key = do
-	ok <- Remote.removeKey remote key
-	when ok $
+{- Bad content is dropped from the remote. We have downloaded a copy
+ - from the remote to a temp file already (in some cases, it's just a
+ - symlink to a file in the remote). To avoid any further data loss,
+ - that temp file is moved to the bad content directory unless 
+ - the local annex has a copy of the content. -}
+badContentRemote :: Remote -> FilePath -> Key -> Annex String
+badContentRemote remote localcopy key = do
+	bad <- fromRepo gitAnnexBadDir
+	let destbad = bad  key2file key
+	movedbad <- ifM (inAnnex key <||> liftIO (doesFileExist destbad))
+		( return False
+		, do
+			createAnnexDirectory (parentDir destbad)
+			liftIO $ catchDefaultIO False $
+				ifM (isSymbolicLink <$> getSymbolicLinkStatus localcopy)
+					( copyFileExternal CopyTimeStamps localcopy destbad
+					, do
+						moveFile localcopy destbad
+						return True
+					)
+		)
+
+	dropped <- Remote.removeKey remote key
+	when dropped $
 		Remote.logStatus remote key InfoMissing
-	return $ (if ok then "dropped from " else "failed to drop from ")
-		++ Remote.name remote
+	return $ case (movedbad, dropped) of
+		(True, True) -> "moved from " ++ Remote.name remote ++
+			" to " ++ destbad
+		(False, True) -> "dropped from " ++ Remote.name remote
+		(_, False) -> "failed to drop from" ++ Remote.name remote
 
 runFsck :: Incremental -> FilePath -> Key -> Annex Bool -> CommandStart
 runFsck inc file key a = ifM (needFsck inc key)
diff --git a/Utility/CopyFile.hs b/Utility/CopyFile.hs
index b123d006d4..1c07ca110b 100644
--- a/Utility/CopyFile.hs
+++ b/Utility/CopyFile.hs
@@ -16,7 +16,12 @@ module Utility.CopyFile (
 import Common
 import qualified Build.SysConfig as SysConfig
 
-data CopyMetaData = CopyTimeStamps | CopyAllMetaData
+data CopyMetaData 
+	-- Copy timestamps when possible, but no other metadata, and
+	-- when copying a symlink, makes a copy of its content.
+	= CopyTimeStamps
+	-- Copy all metadata when possible.
+	| CopyAllMetaData
 	deriving (Eq)
 
 {- The cp command is used, because I hate reinventing the wheel,
diff --git a/debian/changelog b/debian/changelog
index fc7c23d87d..00aed03a01 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -17,6 +17,9 @@ git-annex (5.20150410) UNRELEASED; urgency=medium
   * Fix fsck --from a git remote in a local directory, and from
     a directory special remote.
     This was a reversion caused by the relative path changes in 5.20150113.
+  * fsck --from remote: When bad content is found in the remote,
+    and the local repo does not have a copy of the content, preserve
+    the bad content in .git/annex/bad/ to avoid further data loss.
 
  -- Joey Hess   Thu, 09 Apr 2015 20:59:43 -0400
 

From 8d685768d33f209c9879706f32bcbee2bd7a8aab Mon Sep 17 00:00:00 2001
From: Joey Hess 
Date: Sat, 18 Apr 2015 14:23:34 -0400
Subject: [PATCH 029/362] fsck --from remote: Avoid downloading a key if it
 would go over the annex.diskreserve limit.

---
 Command/Fsck.hs  | 6 ++++--
 debian/changelog | 2 ++
 2 files changed, 6 insertions(+), 2 deletions(-)

diff --git a/Command/Fsck.hs b/Command/Fsck.hs
index 74cff74912..39dba08ddb 100644
--- a/Command/Fsck.hs
+++ b/Command/Fsck.hs
@@ -135,14 +135,16 @@ performRemote key file backend numcopies remote =
 		let cleanup = liftIO $ catchIO (removeFile tmp) (const noop)
 		cleanup
 		cleanup `after` a tmp
-	getfile tmp =
-		ifM (Remote.retrieveKeyFileCheap remote key tmp)
+	getfile tmp = ifM (checkDiskSpace (Just tmp) key 0)
+		( ifM (Remote.retrieveKeyFileCheap remote key tmp)
 			( return True
 			, ifM (Annex.getState Annex.fast)
 				( return False
 				, Remote.retrieveKeyFile remote key Nothing tmp dummymeter
 				)
 			)
+		, return False
+		)
 	dummymeter _ = noop
 
 startKey :: Incremental -> Key -> NumCopies -> CommandStart
diff --git a/debian/changelog b/debian/changelog
index 00aed03a01..2acdfac968 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -20,6 +20,8 @@ git-annex (5.20150410) UNRELEASED; urgency=medium
   * fsck --from remote: When bad content is found in the remote,
     and the local repo does not have a copy of the content, preserve
     the bad content in .git/annex/bad/ to avoid further data loss.
+  * fsck --from remote: Avoid downloading a key if it would go over
+    the annex.diskreserve limit.
 
  -- Joey Hess   Thu, 09 Apr 2015 20:59:43 -0400
 

From b89866f8ca3201844fa4d5e5a9beea42c29ea919 Mon Sep 17 00:00:00 2001
From: Joey Hess 
Date: Sat, 18 Apr 2015 14:46:28 -0400
Subject: [PATCH 030/362] probably peback

---
 ..._1_513d89ddd728dc9c6cc9fbf8af18afb0._comment | 17 +++++++++++++++++
 1 file changed, 17 insertions(+)
 create mode 100644 doc/bugs/addurl_+_sync_vs_addurl_+_commit/comment_1_513d89ddd728dc9c6cc9fbf8af18afb0._comment

diff --git a/doc/bugs/addurl_+_sync_vs_addurl_+_commit/comment_1_513d89ddd728dc9c6cc9fbf8af18afb0._comment b/doc/bugs/addurl_+_sync_vs_addurl_+_commit/comment_1_513d89ddd728dc9c6cc9fbf8af18afb0._comment
new file mode 100644
index 0000000000..48ce2354dc
--- /dev/null
+++ b/doc/bugs/addurl_+_sync_vs_addurl_+_commit/comment_1_513d89ddd728dc9c6cc9fbf8af18afb0._comment
@@ -0,0 +1,17 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 1"""
+ date="2015-04-18T18:44:16Z"
+ content="""
+If you use `git annex addurl`, the file will use the SHA256 backend.
+
+If you use `git annex addurl --fast`, it will use the URL backend.
+
+**Either way**, git-annex will know that you added the file from the web,
+and `git-annex whereis` will tell you the file is in the web remote,
+and tell you its url.
+
+I don't think there's a bug here. I think you got confused by
+seeing URL some of the time and SHA256 some of the time. 
+If you disagree, please post a transcript demonstrating your problem.
+"""]]

From c41bc24198b4622116fcd5d9d807b891f3701dc1 Mon Sep 17 00:00:00 2001
From: Joey Hess 
Date: Sat, 18 Apr 2015 14:55:00 -0400
Subject: [PATCH 031/362] try to encourage use of that paste feature that some
 OS's have

---
 ...t_6_f36c0ab40bac68445fa0f205661c9f51._comment | 16 ++++++++++++++++
 1 file changed, 16 insertions(+)
 create mode 100644 doc/bugs/git-annex_happily_deleted_most_of_my_files___36____35____38____33__/comment_6_f36c0ab40bac68445fa0f205661c9f51._comment

diff --git a/doc/bugs/git-annex_happily_deleted_most_of_my_files___36____35____38____33__/comment_6_f36c0ab40bac68445fa0f205661c9f51._comment b/doc/bugs/git-annex_happily_deleted_most_of_my_files___36____35____38____33__/comment_6_f36c0ab40bac68445fa0f205661c9f51._comment
new file mode 100644
index 0000000000..d794c23f94
--- /dev/null
+++ b/doc/bugs/git-annex_happily_deleted_most_of_my_files___36____35____38____33__/comment_6_f36c0ab40bac68445fa0f205661c9f51._comment
@@ -0,0 +1,16 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 6"""
+ date="2015-04-18T18:52:20Z"
+ content="""
+It's approximately 1000 times easier for someone who is experiencing a
+problem to paste a tracript into this bug report than it is for me to guess
+what someone might be doing and reproduce their bug (or problem, or mistake
+or oops, or whatever) from basically no information.
+
+This is why I ask for bugs to be filed with either transcripts, or the
+steps that can be used to reproduce them.
+
+I think you'll find that if you post enough information for a bug to be
+reproduced, it'll get fixed quite fast.
+"""]]

From d4b87e482a3f08fb9b75e098fa73506711612208 Mon Sep 17 00:00:00 2001
From: Joey Hess 
Date: Sat, 18 Apr 2015 15:11:37 -0400
Subject: [PATCH 032/362] comment

---
 ...1_8332f71241335a31e270407477bd84f3._comment | 18 ++++++++++++++++++
 1 file changed, 18 insertions(+)
 create mode 100644 doc/forum/How_to_find_deleted_files_that_I_know_have_been_backed_up__63__/comment_1_8332f71241335a31e270407477bd84f3._comment

diff --git a/doc/forum/How_to_find_deleted_files_that_I_know_have_been_backed_up__63__/comment_1_8332f71241335a31e270407477bd84f3._comment b/doc/forum/How_to_find_deleted_files_that_I_know_have_been_backed_up__63__/comment_1_8332f71241335a31e270407477bd84f3._comment
new file mode 100644
index 0000000000..d142d742c1
--- /dev/null
+++ b/doc/forum/How_to_find_deleted_files_that_I_know_have_been_backed_up__63__/comment_1_8332f71241335a31e270407477bd84f3._comment
@@ -0,0 +1,18 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 1"""
+ date="2015-04-18T19:06:27Z"
+ content="""
+Is your titular question a git-annex question, or a generic git question?
+Because I think the answer would be the same in either case. Ie, `git log`
+or `git status` will tell you what changes you've made to the work tree.
+
+If you've deleted files from your git working tree with rm -rf, then
+their content is still stored in the .git directory. This is also true
+when using git-annex (unless you're using direct mode). 
+
+The size of your .git directory might be a clue: If you've deleted
+files from the working tree, you may not have dropped their content
+from git annex. You can use `git annex unused` to find and clean up
+such file contents.
+"""]]

From 460e04ce9efc41ab6c699628b59d5d4b115b05b6 Mon Sep 17 00:00:00 2001
From: Joey Hess 
Date: Sat, 18 Apr 2015 15:17:59 -0400
Subject: [PATCH 033/362] cmment

---
 ...ment_4_aee3fc6be01bb75709451eea0decf112._comment | 13 +++++++++++++
 1 file changed, 13 insertions(+)
 create mode 100644 doc/forum/Slow_transfer_speeds_on_copy_in_Windows/comment_4_aee3fc6be01bb75709451eea0decf112._comment

diff --git a/doc/forum/Slow_transfer_speeds_on_copy_in_Windows/comment_4_aee3fc6be01bb75709451eea0decf112._comment b/doc/forum/Slow_transfer_speeds_on_copy_in_Windows/comment_4_aee3fc6be01bb75709451eea0decf112._comment
new file mode 100644
index 0000000000..ed2f3cc358
--- /dev/null
+++ b/doc/forum/Slow_transfer_speeds_on_copy_in_Windows/comment_4_aee3fc6be01bb75709451eea0decf112._comment
@@ -0,0 +1,13 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 4"""
+ date="2015-04-18T19:12:19Z"
+ content="""
+Well, git-annex bundles a copy of rsync, and the one that it includes 
+is the one from cygwin.
+
+It sounds like there's a newer version, also from cygwin, that is faster?
+
+I've pinged the git-annex Windows autobuilder admin to see if we can
+upgrade that.
+"""]]

From 9c5c39cf54b2c720a31f8122c7e27f9b1e39a8f1 Mon Sep 17 00:00:00 2001
From: Joey Hess 
Date: Sat, 18 Apr 2015 15:24:25 -0400
Subject: [PATCH 034/362] comment

---
 ...1_6e7cceb9d23f0cad3d9f839dd2a04901._comment | 18 ++++++++++++++++++
 1 file changed, 18 insertions(+)
 create mode 100644 doc/todo/wishlist:_rsync_efficiency/comment_1_6e7cceb9d23f0cad3d9f839dd2a04901._comment

diff --git a/doc/todo/wishlist:_rsync_efficiency/comment_1_6e7cceb9d23f0cad3d9f839dd2a04901._comment b/doc/todo/wishlist:_rsync_efficiency/comment_1_6e7cceb9d23f0cad3d9f839dd2a04901._comment
new file mode 100644
index 0000000000..35f6b885b4
--- /dev/null
+++ b/doc/todo/wishlist:_rsync_efficiency/comment_1_6e7cceb9d23f0cad3d9f839dd2a04901._comment
@@ -0,0 +1,18 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 1"""
+ date="2015-04-18T19:21:44Z"
+ content="""
+The `concurrentprogress` branch can already parallelize transfers.
+It's waiting on some progress display improvements for merging.
+
+I imagine this would keep the pipe full more consistently.
+
+Although, ssh caching is perhaps even more important, since
+it avoids a tcp slow start having to be done for each file
+that's transferred. So make sure it's working.
+
+Even with those, I would not expect git-annex to be as efficient
+as pure rsync of a directory. git-annex's more general design mean
+that there are more moving parts..
+"""]]

From c3732bddda07248d70c6c5579ffe973234bf79ba Mon Sep 17 00:00:00 2001
From: Joey Hess 
Date: Sat, 18 Apr 2015 15:30:36 -0400
Subject: [PATCH 035/362] comment

---
 ...ment_5_b1841fc129a9ce6d1c22840ee648f958._comment | 13 +++++++++++++
 1 file changed, 13 insertions(+)
 create mode 100644 doc/forum/Slow_transfer_speeds_on_copy_in_Windows/comment_5_b1841fc129a9ce6d1c22840ee648f958._comment

diff --git a/doc/forum/Slow_transfer_speeds_on_copy_in_Windows/comment_5_b1841fc129a9ce6d1c22840ee648f958._comment b/doc/forum/Slow_transfer_speeds_on_copy_in_Windows/comment_5_b1841fc129a9ce6d1c22840ee648f958._comment
new file mode 100644
index 0000000000..147ca76828
--- /dev/null
+++ b/doc/forum/Slow_transfer_speeds_on_copy_in_Windows/comment_5_b1841fc129a9ce6d1c22840ee648f958._comment
@@ -0,0 +1,13 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 5"""
+ date="2015-04-18T19:26:25Z"
+ content="""
+
+
+Hmm, ok, so that's not the cygwin rsync and it has a gui and bundles its
+own ssh that won't behave the same as the one bundled with git-annex.
+
+Maybe at least some of the speed improvements could be had by just
+upgrading the rsync and ssh from cygwin though..
+"""]]

From ef2202fd94e0149c6bd469ac14eac589d8967bc8 Mon Sep 17 00:00:00 2001
From: Joey Hess 
Date: Sat, 18 Apr 2015 16:04:25 -0400
Subject: [PATCH 036/362] required: New command, like wanted, but for required
 content.

Also refactored some code to reduce duplication.
---
 CmdLine/GitAnnex.hs                           |  2 +
 Command/GroupWanted.hs                        | 19 ++-----
 Command/Wanted.hs                             | 52 +++++++++++--------
 debian/changelog                              |  1 +
 doc/git-annex-preferred-content.mdwn          |  7 +++
 doc/git-annex.mdwn                            |  8 +++
 doc/required_content.mdwn                     |  3 +-
 ...erface_for_required_content_setthings.mdwn |  2 +
 8 files changed, 55 insertions(+), 39 deletions(-)

diff --git a/CmdLine/GitAnnex.hs b/CmdLine/GitAnnex.hs
index fde4e2d08b..326dd3b2be 100644
--- a/CmdLine/GitAnnex.hs
+++ b/CmdLine/GitAnnex.hs
@@ -74,6 +74,7 @@ import qualified Command.Dead
 import qualified Command.Group
 import qualified Command.Wanted
 import qualified Command.GroupWanted
+import qualified Command.Required
 import qualified Command.Schedule
 import qualified Command.Ungroup
 import qualified Command.Vicfg
@@ -149,6 +150,7 @@ cmds = concat
 	, Command.Group.cmd
 	, Command.Wanted.cmd
 	, Command.GroupWanted.cmd
+	, Command.Required.cmd
 	, Command.Schedule.cmd
 	, Command.Ungroup.cmd
 	, Command.Vicfg.cmd
diff --git a/Command/GroupWanted.hs b/Command/GroupWanted.hs
index 859a39c1b9..8fff470134 100644
--- a/Command/GroupWanted.hs
+++ b/Command/GroupWanted.hs
@@ -13,6 +13,7 @@ import Command
 import Logs.PreferredContent
 import Types.Messages
 import Types.Group
+import Command.Wanted (performGet, performSet)
 
 import qualified Data.Map as M
 
@@ -24,22 +25,8 @@ seek :: CommandSeek
 seek = withWords start
 
 start :: [String] -> CommandStart
-start (g:[]) = next $ performGet g
+start (g:[]) = next $ performGet groupPreferredContentMapRaw g
 start (g:expr:[]) = do
 	showStart "groupwanted" g
-	next $ performSet g expr
+	next $ performSet groupPreferredContentSet expr g
 start _ = error "Specify a group."
-
-performGet :: Group -> CommandPerform
-performGet g = do
-	Annex.setOutput QuietOutput
-	m <- groupPreferredContentMapRaw
-	liftIO $ putStrLn $ fromMaybe "" $ M.lookup g m
-	next $ return True
-
-performSet :: Group -> String -> CommandPerform
-performSet g expr = case checkPreferredContentExpression expr of
-	Just e -> error $ "Parse error: " ++ e
-	Nothing -> do
-		groupPreferredContentSet g expr
-		next $ return True
diff --git a/Command/Wanted.hs b/Command/Wanted.hs
index 6b87e51d84..07f5ee7c34 100644
--- a/Command/Wanted.hs
+++ b/Command/Wanted.hs
@@ -1,6 +1,6 @@
 {- git-annex command
  -
- - Copyright 2013 Joey Hess 
+ - Copyright 2013-2015 Joey Hess 
  -
  - Licensed under the GNU GPL version 3 or higher.
  -}
@@ -13,39 +13,47 @@ import Command
 import qualified Remote
 import Logs.PreferredContent
 import Types.Messages
+import Types.StandardGroups
 
 import qualified Data.Map as M
 
 cmd :: [Command]
-cmd = [command "wanted" (paramPair paramRemote (paramOptional paramExpression)) seek
-	SectionSetup "get or set preferred content expression"]
+cmd = cmd' "wanted" "get or set preferred content expression" 
+	preferredContentMapRaw
+	preferredContentSet
 
-seek :: CommandSeek
-seek = withWords start
-
-start :: [String] -> CommandStart
-start = parse
+cmd'
+	:: String
+	-> String
+	-> Annex (M.Map UUID PreferredContentExpression)
+	-> (UUID -> PreferredContentExpression -> Annex ())
+	-> [Command]
+cmd' name desc getter setter = [command name pdesc seek SectionSetup desc]
   where
-	parse (name:[]) = go name performGet
-	parse (name:expr:[]) = go name $ \uuid -> do
-		showStart "wanted" name
-		performSet expr uuid
-	parse _ = error "Specify a repository."
+	pdesc = paramPair paramRemote (paramOptional paramExpression)
 
-	go name a = do
-		u <- Remote.nameToUUID name
+	seek = withWords start
+
+	start (rname:[]) = go rname (performGet getter)
+	start (rname:expr:[]) = go rname $ \uuid -> do
+		showStart name rname
+		performSet setter expr uuid
+	start _ = error "Specify a repository."
+		
+	go rname a = do
+		u <- Remote.nameToUUID rname
 		next $ a u
 
-performGet :: UUID -> CommandPerform
-performGet uuid = do
+performGet :: Ord a => Annex (M.Map a PreferredContentExpression) -> a -> CommandPerform
+performGet getter a = do
 	Annex.setOutput QuietOutput
-	m <- preferredContentMapRaw
-	liftIO $ putStrLn $ fromMaybe "" $ M.lookup uuid m
+	m <- getter
+	liftIO $ putStrLn $ fromMaybe "" $ M.lookup a m
 	next $ return True
 
-performSet :: String -> UUID -> CommandPerform
-performSet expr uuid = case checkPreferredContentExpression expr of
+performSet :: Ord a => (a -> PreferredContentExpression -> Annex ()) -> String -> a -> CommandPerform
+performSet setter expr a = case checkPreferredContentExpression expr of
 	Just e -> error $ "Parse error: " ++ e
 	Nothing -> do
-		preferredContentSet uuid expr
+		setter a expr
 		next $ return True
diff --git a/debian/changelog b/debian/changelog
index 2acdfac968..53de77cc86 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -22,6 +22,7 @@ git-annex (5.20150410) UNRELEASED; urgency=medium
     the bad content in .git/annex/bad/ to avoid further data loss.
   * fsck --from remote: Avoid downloading a key if it would go over
     the annex.diskreserve limit.
+  * required: New command, like wanted, but for required content.
 
  -- Joey Hess   Thu, 09 Apr 2015 20:59:43 -0400
 
diff --git a/doc/git-annex-preferred-content.mdwn b/doc/git-annex-preferred-content.mdwn
index 95dae8c14e..49512f465b 100644
--- a/doc/git-annex-preferred-content.mdwn
+++ b/doc/git-annex-preferred-content.mdwn
@@ -10,6 +10,13 @@ using `git annex vicfg` or `git annex wanted`.
 They are used by the `--auto` option, by `git annex sync --content`,
 and by the git-annex assistant.
 
+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. A repository's
+required content can be configured using `git annex vicfg` or
+`git annex required`.
+
 Preferred content expressions are similar, but not identical to
 the [[git-annex-matching-options]](1), just without the dashes.
 For example:
diff --git a/doc/git-annex.mdwn b/doc/git-annex.mdwn
index 6fd10aed00..3dc54a308b 100644
--- a/doc/git-annex.mdwn
+++ b/doc/git-annex.mdwn
@@ -264,8 +264,16 @@ subdirectories).
 
 * `groupwanted groupname [expression]`
 
+  Get or set groupwanted expression.
+
   See [[git-annex-groupwanted]](1) for details.
 
+* `required repository [expression]`
+  
+  Get or set required content expression.
+  
+  See [[git-annex-required]](1) for details.
+
 * `schedule repository [expression]`
 
   Get or set scheduled jobs.
diff --git a/doc/required_content.mdwn b/doc/required_content.mdwn
index 91c5614a80..e17951d9d8 100644
--- a/doc/required_content.mdwn
+++ b/doc/required_content.mdwn
@@ -6,7 +6,8 @@ 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`.
+Required content settings can be edited using `git annex vicfg`
+or set using `git annex required`.
 Each repository can have its own settings, and other repositories will
 try to honor those settings when interacting with it.
 
diff --git a/doc/todo/command_line_interface_for_required_content_setthings.mdwn b/doc/todo/command_line_interface_for_required_content_setthings.mdwn
index 1334b151a2..30889f8bb3 100644
--- a/doc/todo/command_line_interface_for_required_content_setthings.mdwn
+++ b/doc/todo/command_line_interface_for_required_content_setthings.mdwn
@@ -9,3 +9,5 @@ used feature, and vicfg can already configure it.
 one when it comes to that. Oh well.)
 
 --[[Joey]]
+
+> [[done]] --[[Joey]]

From 22c445f3eb3c77dbc35def9994d3c1e793b48882 Mon Sep 17 00:00:00 2001
From: Joey Hess 
Date: Sat, 18 Apr 2015 16:07:02 -0400
Subject: [PATCH 037/362] response

---
 ...ent_1_1fafdc4ed4a0f601918361dca688aa6c._comment | 14 ++++++++++++++
 1 file changed, 14 insertions(+)
 create mode 100644 doc/forum/Cant_see_git-annex-shell_via_SSH_in_OSX/comment_1_1fafdc4ed4a0f601918361dca688aa6c._comment

diff --git a/doc/forum/Cant_see_git-annex-shell_via_SSH_in_OSX/comment_1_1fafdc4ed4a0f601918361dca688aa6c._comment b/doc/forum/Cant_see_git-annex-shell_via_SSH_in_OSX/comment_1_1fafdc4ed4a0f601918361dca688aa6c._comment
new file mode 100644
index 0000000000..edbf2edfc4
--- /dev/null
+++ b/doc/forum/Cant_see_git-annex-shell_via_SSH_in_OSX/comment_1_1fafdc4ed4a0f601918361dca688aa6c._comment
@@ -0,0 +1,14 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 1"""
+ date="2015-04-18T20:05:42Z"
+ content="""
+This is a common gotcha; bash sources something like .bashrc
+or whatever that puts /usr/local/bin/ in your path when it's a login shell.
+However, when git-annex is sshing in, there is no login shell,
+and bash does not source any dotfiles, and so git-annex-shell in not in
+PATH.
+
+The solution is probably to move or symlink it to some other directory
+that is in PATH always.
+"""]]

From 978906c6166b025afe1c5aa078688d73617b7f1a Mon Sep 17 00:00:00 2001
From: Joey Hess 
Date: Sat, 18 Apr 2015 16:09:09 -0400
Subject: [PATCH 038/362] forgot to add these

---
 Command/Required.hs         | 17 +++++++++++++++++
 doc/git-annex-required.mdwn | 29 +++++++++++++++++++++++++++++
 2 files changed, 46 insertions(+)
 create mode 100644 Command/Required.hs
 create mode 100644 doc/git-annex-required.mdwn

diff --git a/Command/Required.hs b/Command/Required.hs
new file mode 100644
index 0000000000..3d9c592796
--- /dev/null
+++ b/Command/Required.hs
@@ -0,0 +1,17 @@
+{- git-annex command
+ -
+ - Copyright 2015 Joey Hess 
+ -
+ - Licensed under the GNU GPL version 3 or higher.
+ -}
+
+module Command.Required where
+
+import Command
+import Logs.PreferredContent
+import qualified Command.Wanted
+
+cmd :: [Command]
+cmd = Command.Wanted.cmd' "required" "get or set required content expression"
+	requiredContentMapRaw
+	requiredContentSet
diff --git a/doc/git-annex-required.mdwn b/doc/git-annex-required.mdwn
new file mode 100644
index 0000000000..cde3cd6ab8
--- /dev/null
+++ b/doc/git-annex-required.mdwn
@@ -0,0 +1,29 @@
+# NAME
+
+git-annex required - get or set required content expression
+
+# SYNOPSIS
+
+git annex required `repository [expression]`
+
+# DESCRIPTION
+
+When run with an expression, configures the content that is required
+to be held in the archive. See [[git-annex-preferred-content]](1)
+
+For example:
+
+	git annex required . "include=*.mp3 or include=*.ogg"
+
+Without an expression, displays the current required content setting
+of the repository.
+
+# SEE ALSO
+
+[[git-annex]](1)
+
+# AUTHOR
+
+Joey Hess 
+
+Warning: Automatically converted into a man page by mdwn2man. Edit with care.

From d7f4c823d72f56f734011c753d5f40004aed21ad Mon Sep 17 00:00:00 2001
From: Joey Hess 
Date: Sat, 18 Apr 2015 16:15:06 -0400
Subject: [PATCH 039/362] devblog

---
 doc/devblog/day_277__thanks.mdwn | 20 ++++++++++++++++++++
 1 file changed, 20 insertions(+)
 create mode 100644 doc/devblog/day_277__thanks.mdwn

diff --git a/doc/devblog/day_277__thanks.mdwn b/doc/devblog/day_277__thanks.mdwn
new file mode 100644
index 0000000000..de82769bb4
--- /dev/null
+++ b/doc/devblog/day_277__thanks.mdwn
@@ -0,0 +1,20 @@
+Recent work has included improving `fsck --from remote` (and fixing a
+reversion caused by the relative path changes in January), and making
+annex.diskreserve be checked in more cases. And added a `git annex
+required` command for setting [[required_content]].
+
+Also, I want to thank several people for their work:
+
+* Roy sent a patch to enable http proxy support.. despite
+  having only learned some haskell by "30 mins with YAHT". I investigated
+  that more, and no patch is actually necessary, but just a newer version
+  of the http-client library.
+* CandyAngel has been posting lots of helpful comments on the website,
+  including [this tip](http://git-annex.branchable.com/forum/__34__git_annex_sync__34___synced_after_8_hours/#comment-890ca1381d800ac833ccbb8c5db175ea)
+  that significantly speeds up a large git repository.
+* Øyvind fixed a lot of typos throughout the git-annex
+  documentation.
+* Yaroslav has created a `git-annex-standalone.deb` package
+  that will work on any system where debian packages can be installed,
+  no matter how out of date it is (within reason), using the same
+  methods as the standalone tarball.

From addc82dab70b5b69dd3ea0e4d63668b727cfc210 Mon Sep 17 00:00:00 2001
From: Joey Hess 
Date: Sun, 19 Apr 2015 00:38:29 -0400
Subject: [PATCH 040/362] removed all uses of undefined from code base

It's a code smell, can lead to hard to diagnose error messages.
---
 Assistant/Pairing.hs              |  2 ++
 Assistant/Pairing/Network.hs      |  8 ++++----
 Assistant/Threads/Committer.hs    |  2 +-
 Assistant/Threads/PairListener.hs |  2 +-
 Assistant/Threads/XMPPPusher.hs   |  3 ++-
 Command/WebApp.hs                 |  4 ++--
 Crypto.hs                         |  2 +-
 Database/Fsck.hs                  |  2 +-
 Git.hs                            |  6 +++---
 Git/CatFile.hs                    |  2 +-
 Git/LsFiles.hs                    | 13 +++++++------
 Remote/GCrypt.hs                  |  2 +-
 Remote/Git.hs                     |  7 ++++---
 Remote/Helper/Chunked.hs          |  2 +-
 Utility/DirWatcher.hs             | 10 +++++-----
 Utility/Directory.hs              |  2 +-
 Utility/FileMode.hs               |  2 +-
 Utility/Metered.hs                |  2 +-
 Utility/Touch.hsc                 |  6 +++---
 19 files changed, 42 insertions(+), 37 deletions(-)

diff --git a/Assistant/Pairing.hs b/Assistant/Pairing.hs
index b24e5fdb61..2390379e22 100644
--- a/Assistant/Pairing.hs
+++ b/Assistant/Pairing.hs
@@ -81,6 +81,8 @@ data PairingInProgress = PairingInProgress
 	}
 	deriving (Show)
 
+data AddrClass = IPv4AddrClass | IPv6AddrClass
+
 data SomeAddr = IPv4Addr HostAddress
 {- My Android build of the Network library does not currently have IPV6
  - support. -}
diff --git a/Assistant/Pairing/Network.hs b/Assistant/Pairing/Network.hs
index 7a4ac3ffe5..694dcbbcc3 100644
--- a/Assistant/Pairing/Network.hs
+++ b/Assistant/Pairing/Network.hs
@@ -33,9 +33,9 @@ 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"
+multicastAddress :: AddrClass -> HostName
+multicastAddress IPv4AddrClass = "224.0.0.251"
+multicastAddress IPv6AddrClass = "ff02::fb"
 
 {- Multicasts a message repeatedly on all interfaces, with a 2 second
  - delay between each transmission. The message is repeated forever
@@ -62,7 +62,7 @@ multicastPairMsg repeats secret pairdata stage = go M.empty repeats
 	sendinterface cache i = void $ tryIO $
 		withSocketsDo $ bracket setup cleanup use
 	  where
-		setup = multicastSender (multicastAddress i) pairingPort
+		setup = multicastSender (multicastAddress IPv4AddrClass) pairingPort
 		cleanup (sock, _) = sClose sock -- FIXME does not work
 		use (sock, addr) = do
 			setInterface sock (showAddr i)
diff --git a/Assistant/Threads/Committer.hs b/Assistant/Threads/Committer.hs
index 717a99c964..f4af932859 100644
--- a/Assistant/Threads/Committer.hs
+++ b/Assistant/Threads/Committer.hs
@@ -196,7 +196,7 @@ 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.
+ - Note that the list of changes has a random order.
  -
  - Current strategy: If there have been 10 changes within the past second,
  - a batch activity is taking place, so wait for later.
diff --git a/Assistant/Threads/PairListener.hs b/Assistant/Threads/PairListener.hs
index e4f87494c8..ba2ae955cb 100644
--- a/Assistant/Threads/PairListener.hs
+++ b/Assistant/Threads/PairListener.hs
@@ -31,7 +31,7 @@ pairListenerThread urlrenderer = namedThread "PairListener" $ do
   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
+	getsock = multicastReceiver (multicastAddress IPv4AddrClass) pairingPort
 		
 	go reqs cache sock = liftIO (getmsg sock []) >>= \msg -> case readish msg of
 		Nothing -> go reqs cache sock
diff --git a/Assistant/Threads/XMPPPusher.hs b/Assistant/Threads/XMPPPusher.hs
index ec11b9b944..bff17356d7 100644
--- a/Assistant/Threads/XMPPPusher.hs
+++ b/Assistant/Threads/XMPPPusher.hs
@@ -78,4 +78,5 @@ selectNextPush lastpushedto l = go [] l
 		(Pushing clientid _)
 			| Just clientid /= lastpushedto -> (m, rejected ++ ms)
 		_ -> go (m:rejected) ms
-	go [] [] = undefined
+	go [] [] = error "empty push queue"
+
diff --git a/Command/WebApp.hs b/Command/WebApp.hs
index 46ba556a37..e872d4be01 100644
--- a/Command/WebApp.hs
+++ b/Command/WebApp.hs
@@ -143,10 +143,10 @@ firstRun :: Maybe HostName -> IO ()
 firstRun listenhost = do
 	checkEnvironmentIO
 	{- Without a repository, we cannot have an Annex monad, so cannot
-	 - get a ThreadState. Using undefined is only safe because the
+	 - get a ThreadState. This is only safe because the
 	 - webapp checks its noAnnex field before accessing the
 	 - threadstate. -}
-	let st = undefined
+	let st = error "annex state not available"
 	{- Get a DaemonStatus without running in the Annex monad. -}
 	dstatus <- atomically . newTMVar =<< newDaemonStatus
 	d <- newAssistantData st dstatus
diff --git a/Crypto.hs b/Crypto.hs
index c2076f4613..4e3741715f 100644
--- a/Crypto.hs
+++ b/Crypto.hs
@@ -93,7 +93,7 @@ genSharedCipher highQuality =
 {- Updates an existing Cipher, re-encrypting it to add or remove keyids,
  - depending on whether the first component is True or False. -}
 updateEncryptedCipher :: [(Bool, String)] -> StorableCipher -> IO StorableCipher
-updateEncryptedCipher _ SharedCipher{} = undefined
+updateEncryptedCipher _ SharedCipher{} = error "Cannot update shared cipher"
 updateEncryptedCipher [] encipher = return encipher
 updateEncryptedCipher newkeys encipher@(EncryptedCipher _ variant (KeyIds ks)) = do
 	dropKeys <- listKeyIds [ k | (False, k) <- newkeys ]
diff --git a/Database/Fsck.hs b/Database/Fsck.hs
index bf0c72f6dd..8de0a8f3d4 100644
--- a/Database/Fsck.hs
+++ b/Database/Fsck.hs
@@ -55,7 +55,7 @@ Fscked
  -
  - This may fail, if other fsck processes are currently running using the
  - database. Removing the database in that situation would lead to crashes
- - or undefined behavior.
+ - or unknown behavior.
  -}
 newPass :: UUID -> Annex Bool
 newPass u = isJust <$> tryExclusiveLock (gitAnnexFsckDbLock u) go
diff --git a/Git.hs b/Git.hs
index 6e270815e3..1bc789f85d 100644
--- a/Git.hs
+++ b/Git.hs
@@ -60,7 +60,7 @@ repoLocation Repo { location = Url url } = show url
 repoLocation Repo { location = Local { worktree = Just dir } } = dir
 repoLocation Repo { location = Local { gitdir = dir } } = dir
 repoLocation Repo { location = LocalUnknown dir } = dir
-repoLocation Repo { location = Unknown } = undefined
+repoLocation Repo { location = Unknown } = error "unknown repoLocation"
 
 {- Path to a repository. For non-bare, this is the worktree, for bare, 
  - it's the gitdir, and for URL repositories, is the path on the remote
@@ -70,12 +70,12 @@ repoPath Repo { location = Url u } = unEscapeString $ uriPath u
 repoPath Repo { location = Local { worktree = Just d } } = d
 repoPath Repo { location = Local { gitdir = d } } = d
 repoPath Repo { location = LocalUnknown dir } = dir
-repoPath Repo { location = Unknown } = undefined
+repoPath Repo { location = Unknown } = error "unknown repoPath"
 
 {- Path to a local repository's .git directory. -}
 localGitDir :: Repo -> FilePath
 localGitDir Repo { location = Local { gitdir = d } } = d
-localGitDir _ = undefined
+localGitDir _ = error "unknown localGitDir"
 
 {- Some code needs to vary between URL and normal repos,
  - or bare and non-bare, these functions help with that. -}
diff --git a/Git/CatFile.hs b/Git/CatFile.hs
index a1a0a0d284..c63a0647ce 100644
--- a/Git/CatFile.hs
+++ b/Git/CatFile.hs
@@ -110,4 +110,4 @@ catTree h treeref = go <$> catObjectDetails h treeref
 	parsemodefile b = 
 		let (modestr, file) = separate (== ' ') (decodeBS b)
 		in (file, readmode modestr)
-	readmode = fst . fromMaybe (0, undefined) . headMaybe . readOct
+	readmode = fromMaybe 0 . fmap fst . headMaybe . readOct
diff --git a/Git/LsFiles.hs b/Git/LsFiles.hs
index c23c282d0a..e80c1b2883 100644
--- a/Git/LsFiles.hs
+++ b/Git/LsFiles.hs
@@ -181,12 +181,13 @@ parseUnmerged s
 	| otherwise = case words metadata of
 		(rawblobtype:rawsha:rawstage:_) -> do
 			stage <- readish rawstage :: Maybe Int
-			unless (stage == 2 || stage == 3) $
-				fail undefined -- skip stage 1
-			blobtype <- readBlobType rawblobtype
-			sha <- extractSha rawsha
-			return $ InternalUnmerged (stage == 2) file
-				(Just blobtype) (Just sha)
+			if stage /= 2 && stage /= 3
+				then Nothing
+				else do
+					blobtype <- readBlobType rawblobtype
+					sha <- extractSha rawsha
+					return $ InternalUnmerged (stage == 2) file
+						(Just blobtype) (Just sha)
 		_ -> Nothing
   where
 	(metadata, file) = separate (== '\t') s
diff --git a/Remote/GCrypt.hs b/Remote/GCrypt.hs
index c275198259..01efc60601 100644
--- a/Remote/GCrypt.hs
+++ b/Remote/GCrypt.hs
@@ -397,7 +397,7 @@ getGCryptId fast r gc
 	| Git.repoIsLocal r || Git.repoIsLocalUnknown r = extract <$>
 		liftIO (catchMaybeIO $ Git.Config.read r)
 	| not fast = extract . liftM fst <$> getM (eitherToMaybe <$>)
-		[ Ssh.onRemote r (Git.Config.fromPipe r, return (Left undefined)) "configlist" [] []
+		[ Ssh.onRemote r (Git.Config.fromPipe r, return (Left $ error "configlist failed")) "configlist" [] []
 		, getConfigViaRsync r gc
 		]
 	| otherwise = return (Nothing, r)
diff --git a/Remote/Git.hs b/Remote/Git.hs
index fdd0049ca9..4804cb10e2 100644
--- a/Remote/Git.hs
+++ b/Remote/Git.hs
@@ -199,7 +199,7 @@ tryGitConfigRead :: Git.Repo -> Annex Git.Repo
 tryGitConfigRead r 
 	| haveconfig r = return r -- already read
 	| Git.repoIsSsh r = store $ do
-		v <- Ssh.onRemote r (pipedconfig, return (Left undefined)) "configlist" [] []
+		v <- Ssh.onRemote r (pipedconfig, return (Left $ error "configlist failed")) "configlist" [] []
 		case v of
 			Right r'
 				| haveconfig r' -> return r'
@@ -228,9 +228,10 @@ tryGitConfigRead r
 		uo <- Url.getUrlOptions
 		v <- liftIO $ withTmpFile "git-annex.tmp" $ \tmpfile h -> do
 			hClose h
-			ifM (Url.downloadQuiet (Git.repoLocation r ++ "/config") tmpfile uo)
+			let url = Git.repoLocation r ++ "/config"
+			ifM (Url.downloadQuiet url tmpfile uo)
 				( pipedconfig "git" [Param "config", Param "--null", Param "--list", Param "--file", File tmpfile]
-				, return $ Left undefined
+				, return $ Left $ error $ "unable to load config from " ++ url
 				)
 		case v of
 			Left _ -> do
diff --git a/Remote/Helper/Chunked.hs b/Remote/Helper/Chunked.hs
index 2f21ba66cf..23ed3dbf89 100644
--- a/Remote/Helper/Chunked.hs
+++ b/Remote/Helper/Chunked.hs
@@ -72,7 +72,7 @@ chunkKeyStream basek chunksize = ChunkKeyStream $ map mk [1..]
 
 nextChunkKeyStream :: ChunkKeyStream -> (Key, ChunkKeyStream)
 nextChunkKeyStream (ChunkKeyStream (k:l)) = (k, ChunkKeyStream l)
-nextChunkKeyStream (ChunkKeyStream []) = undefined -- stream is infinite!
+nextChunkKeyStream (ChunkKeyStream []) = error "expected infinite ChunkKeyStream"
 
 takeChunkKeyStream :: ChunkCount -> ChunkKeyStream -> [Key]
 takeChunkKeyStream n (ChunkKeyStream l) = genericTake n l
diff --git a/Utility/DirWatcher.hs b/Utility/DirWatcher.hs
index 3d3c146195..bde7106265 100644
--- a/Utility/DirWatcher.hs
+++ b/Utility/DirWatcher.hs
@@ -57,7 +57,7 @@ eventsCoalesce = False
 #if (WITH_KQUEUE || WITH_FSEVENTS)
 eventsCoalesce = True
 #else
-eventsCoalesce = undefined
+eventsCoalesce = error "eventsCoalesce not defined"
 #endif
 #endif
 
@@ -78,7 +78,7 @@ closingTracked = True
 #if WITH_KQUEUE
 closingTracked = False
 #else
-closingTracked = undefined
+closingTracked = error "closingTracked not defined"
 #endif
 #endif
 
@@ -93,7 +93,7 @@ modifyTracked = True
 #if WITH_KQUEUE
 modifyTracked = False
 #else
-modifyTracked = undefined
+modifyTracked = error "modifyTracked not defined"
 #endif
 #endif
 
@@ -131,7 +131,7 @@ watchDir dir prune scanevents hooks runstartup =
 #else
 type DirWatcherHandle = ()
 watchDir :: FilePath -> Pruner -> Bool -> WatchHooks -> (IO () -> IO ()) -> IO DirWatcherHandle
-watchDir = undefined
+watchDir = error "watchDir not defined"
 #endif
 #endif
 #endif
@@ -150,7 +150,7 @@ stopWatchDir = FSEvents.eventStreamDestroy
 #if WITH_WIN32NOTIFY
 stopWatchDir = Win32Notify.killWatchManager
 #else
-stopWatchDir = undefined
+stopWatchDir = error "stopWatchDir not defined"
 #endif
 #endif
 #endif
diff --git a/Utility/Directory.hs b/Utility/Directory.hs
index 85ec8bf45f..2e037fddad 100644
--- a/Utility/Directory.hs
+++ b/Utility/Directory.hs
@@ -111,7 +111,7 @@ moveFile src dest = tryIO (rename src dest) >>= onrename
 			-- But, mv will move into a directory if
 			-- dest is one, which is not desired.
 			whenM (isdir dest) rethrow
-			viaTmp mv dest undefined
+			viaTmp mv dest ""
 	  where
 		rethrow = throwM e
 		mv tmp _ = do
diff --git a/Utility/FileMode.hs b/Utility/FileMode.hs
index 5c4001ed8a..f98e1bc870 100644
--- a/Utility/FileMode.hs
+++ b/Utility/FileMode.hs
@@ -124,7 +124,7 @@ withUmask _ a = a
 #endif
 
 combineModes :: [FileMode] -> FileMode
-combineModes [] = undefined
+combineModes [] = 0
 combineModes [m] = m
 combineModes (m:ms) = foldl unionFileModes m ms
 
diff --git a/Utility/Metered.hs b/Utility/Metered.hs
index f94b5d1216..c34e931a43 100644
--- a/Utility/Metered.hs
+++ b/Utility/Metered.hs
@@ -144,7 +144,7 @@ defaultChunkSize :: Int
 defaultChunkSize = 32 * k - chunkOverhead
   where
 	k = 1024
-	chunkOverhead = 2 * sizeOf (undefined :: Int) -- GHC specific
+	chunkOverhead = 2 * sizeOf (1 :: Int) -- GHC specific
 
 data OutputHandler = OutputHandler
 	{ quietMode :: Bool
diff --git a/Utility/Touch.hsc b/Utility/Touch.hsc
index f87bb62d69..c3318e6da3 100644
--- a/Utility/Touch.hsc
+++ b/Utility/Touch.hsc
@@ -54,8 +54,8 @@ instance Storable TimeSpec where
 	-- use the larger alignment of the two types in the struct
 	alignment _ = max sec_alignment nsec_alignment
 	  where
-		sec_alignment = alignment (undefined::CTime)
-		nsec_alignment = alignment (undefined::CLong)
+		sec_alignment = alignment (1::CTime)
+		nsec_alignment = alignment (1::CLong)
 	sizeOf _ = #{size struct timespec}
 	peek ptr = do
 		sec <- #{peek struct timespec, tv_sec} ptr
@@ -92,7 +92,7 @@ touchBoth file atime mtime follow =
  -}
 
 instance Storable TimeSpec where
-	alignment _ = alignment (undefined::CLong)
+	alignment _ = alignment (1::CLong)
 	sizeOf _ = #{size struct timeval}
 	peek ptr = do
 		sec <- #{peek struct timeval, tv_sec} ptr

From c3dd133257d9a128bc51ee6ed94bc114dee52a06 Mon Sep 17 00:00:00 2001
From: Joey Hess 
Date: Sun, 19 Apr 2015 08:18:17 -0400
Subject: [PATCH 041/362] desc

---
 Git/Remote/Remove.hs | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Git/Remote/Remove.hs b/Git/Remote/Remove.hs
index 2ffc9b358d..e6c13b9ea7 100644
--- a/Git/Remote/Remove.hs
+++ b/Git/Remote/Remove.hs
@@ -1,4 +1,4 @@
-{- git remote stuff
+{- git remote removal
  -
  - Copyright 2012 Joey Hess 
  -

From fc41977f90efc403fb5a8620b7b52c38b9bb8b6d Mon Sep 17 00:00:00 2001
From: "http://hendry.iki.fi/" 
Date: Sun, 19 Apr 2015 13:24:51 +0000
Subject: [PATCH 042/362] Added a comment: git annex unused doesn't help

---
 ..._984286a35ec828f1e8dda928ea577571._comment | 35 +++++++++++++++++++
 1 file changed, 35 insertions(+)
 create mode 100644 doc/forum/How_to_find_deleted_files_that_I_know_have_been_backed_up__63__/comment_2_984286a35ec828f1e8dda928ea577571._comment

diff --git a/doc/forum/How_to_find_deleted_files_that_I_know_have_been_backed_up__63__/comment_2_984286a35ec828f1e8dda928ea577571._comment b/doc/forum/How_to_find_deleted_files_that_I_know_have_been_backed_up__63__/comment_2_984286a35ec828f1e8dda928ea577571._comment
new file mode 100644
index 0000000000..15a48bfe41
--- /dev/null
+++ b/doc/forum/How_to_find_deleted_files_that_I_know_have_been_backed_up__63__/comment_2_984286a35ec828f1e8dda928ea577571._comment
@@ -0,0 +1,35 @@
+[[!comment format=mdwn
+ username="http://hendry.iki.fi/"
+ nickname="Kai Hendry"
+ subject="git annex unused doesn't help"
+ date="2015-04-19T13:24:50Z"
+ content="""
+This is a git-annex question. I want to find files that are not in my working tree but are on the backups on my two USB hard drives.
+
+
+I see in this commit the images that I deleted: 
+
+How can I simply just get a listing of where the copies are?
+
+For example I deleted IMG_4110.JPG.
+
+But when I run:
+
+    X1C3:~/media/uploadme$ git-annex whereis IMG_4110.JPG
+    git-annex: IMG_4110.JPG not found
+
+I am pretty confident I have a copy of this on my external USB drives.
+
+Also tried another file:
+
+    X1C3:~/media/uploadme$ git-annex whereis IMG_4558.JPG
+    git-annex: IMG_4558.JPG not found
+    X1C3:~/media/uploadme$ git-annex whereis 2014-10-05/IMG_4558.JPG
+    git-annex: 2014-10-05/IMG_4558.JPG not found
+
+So I am still in the dark how to see how git-annex tracks deleted files across my remotes.
+
+
+
+
+"""]]

From 6f932205fb65a8eaaf74ce8b1929bdc6dbfdbadf Mon Sep 17 00:00:00 2001
From: 
 "https://www.google.com/accounts/o8/id?id=AItOawkR8WOH6nas8O1_HG0w8AMmq7owXZQHYJw"
 
Date: Sun, 19 Apr 2015 14:07:31 +0000
Subject: [PATCH 043/362]

---
 ...al_remote_of_type___34__directory__34__.mdwn | 17 +++++++++++++++++
 1 file changed, 17 insertions(+)
 create mode 100644 doc/forum/__34__git_annex_sync_--content__34___with_special_remote_of_type___34__directory__34__.mdwn

diff --git a/doc/forum/__34__git_annex_sync_--content__34___with_special_remote_of_type___34__directory__34__.mdwn b/doc/forum/__34__git_annex_sync_--content__34___with_special_remote_of_type___34__directory__34__.mdwn
new file mode 100644
index 0000000000..bab3167e5e
--- /dev/null
+++ b/doc/forum/__34__git_annex_sync_--content__34___with_special_remote_of_type___34__directory__34__.mdwn
@@ -0,0 +1,17 @@
+Hello, I started using the "wanted" feature of git-annex.
+
+I have (besides others) one local repository ("neon"), and two special remotes "ldk" (rsync) and "storage" (directory).
+
+"wanted" and "group" are configured as (replaced UUIDs with names):
+
+    group "storage" = backup
+    wanted "storage" = standard
+    wanted "neon" = (exclude=pictures/* and exclude=video/*) or present
+
+Now, let's assume there is a file named "video/foo.mp4". It is only present in "ldk". I want it to be present in "storage", too.
+
+When I run "git annex sync --content" on "neon" the file "video/foo.mp4" is neither fetched to be placed in "neon" nor in "storage".
+
+Which command do I have to run to transfer the file "video/foo.mp4" from "ldk" to "storage" when run from "neon".
+
+Previously, I started with "git annex get \`git annex find --not --in storage\`" and then continued with "git annex copy \`git annex find --not --in storage\` --to storage". I was hoping that the wanted feature would simplify this.

From ca2cf63e344510632971fd314ee769501923f837 Mon Sep 17 00:00:00 2001
From: Joey Hess 
Date: Sun, 19 Apr 2015 10:47:07 -0400
Subject: [PATCH 044/362] clean up imports

---
 Command/GroupWanted.hs | 5 -----
 1 file changed, 5 deletions(-)

diff --git a/Command/GroupWanted.hs b/Command/GroupWanted.hs
index 8fff470134..5cdf785d70 100644
--- a/Command/GroupWanted.hs
+++ b/Command/GroupWanted.hs
@@ -8,15 +8,10 @@
 module Command.GroupWanted where
 
 import Common.Annex
-import qualified Annex
 import Command
 import Logs.PreferredContent
-import Types.Messages
-import Types.Group
 import Command.Wanted (performGet, performSet)
 
-import qualified Data.Map as M
-
 cmd :: [Command]
 cmd = [command "groupwanted" (paramPair paramGroup (paramOptional paramExpression)) seek
 	SectionSetup "get or set groupwanted expression"]

From d3cff7a32014532a1eb0cbd4fbd20f1bd496073d Mon Sep 17 00:00:00 2001
From: Joey Hess 
Date: Sun, 19 Apr 2015 10:52:49 -0400
Subject: [PATCH 045/362] add test for stable macs

---
 Test.hs         |  1 +
 Types/Crypto.hs | 15 +++++++++++++++
 2 files changed, 16 insertions(+)

diff --git a/Test.hs b/Test.hs
index e8440dd1d5..c84b366455 100644
--- a/Test.hs
+++ b/Test.hs
@@ -156,6 +156,7 @@ properties = localOption (QuickCheckTests 1000) $ testGroup "QuickCheck"
 	, testProperty "prop_read_show_TrustLevel" Types.TrustLevel.prop_read_show_TrustLevel
 	, testProperty "prop_parse_show_TrustLog" Logs.Trust.prop_parse_show_TrustLog
 	, testProperty "prop_hashes_stable" Utility.Hash.prop_hashes_stable
+	, testProperty "prop_mac_stable" Utility.Hash.prop_mac_stable
 	, testProperty "prop_schedule_roundtrips" Utility.Scheduled.prop_schedule_roundtrips
 	, testProperty "prop_past_sane" Utility.Scheduled.prop_past_sane
 	, testProperty "prop_duration_roundtrips" Utility.HumanTime.prop_duration_roundtrips
diff --git a/Types/Crypto.hs b/Types/Crypto.hs
index 682629d6a7..005be4531d 100644
--- a/Types/Crypto.hs
+++ b/Types/Crypto.hs
@@ -18,6 +18,8 @@ module Types.Crypto (
 ) where
 
 import qualified Data.ByteString.Lazy as L
+import qualified Data.Text as T
+import qualified Data.Text.Encoding as T
 import Data.Digest.Pure.SHA
 
 import Utility.Gpg (KeyIds(..))
@@ -71,3 +73,16 @@ calcMac mac = case mac of
 	HmacSha512 -> showDigest $* hmacSha512
   where
 	($*) g f x y = g $ f x y
+
+-- Check that all the MACs continue to produce the same.
+prop_mac_stable :: Bool
+prop_mac_stable = all (\(mac, result) -> calcMac mac key msg == result)
+	[ (HmacSha1, "46b4ec586117154dacd49d664e5d63fdc88efb51")
+	, (HmacSha224, "4c1f774863acb63b7f6e9daa9b5c543fa0d5eccf61e3ffc3698eacdd")
+	, (HmacSha256, "f9320baf0249169e73850cd6156ded0106e2bb6ad8cab01b7bbbebe6d1065317")
+	, (HmacSha384, "3d10d391bee2364df2c55cf605759373e1b5a4ca9355d8f3fe42970471eca2e422a79271a0e857a69923839015877fc6")
+	, (HmacSha512, "114682914c5d017dfe59fdc804118b56a3a652a0b8870759cf9e792ed7426b08197076bf7d01640b1b0684df79e4b67e37485669e8ce98dbab60445f0db94fce")
+	]
+  where
+	key = L.fromChunks [T.encodeUtf8 $ T.pack "foo"]
+	msg = L.fromChunks [T.encodeUtf8 $ T.pack "bar"]

From c0497aa571ec46834ac2c5807dbea40c48eba928 Mon Sep 17 00:00:00 2001
From: Joey Hess 
Date: Sun, 19 Apr 2015 10:54:12 -0400
Subject: [PATCH 046/362] switch to using cryptohash for MAC

---
 Crypto.hs       |  2 +-
 Types/Crypto.hs | 25 +++++++++++++------------
 debian/control  |  2 +-
 git-annex.cabal |  2 +-
 4 files changed, 16 insertions(+), 15 deletions(-)

diff --git a/Crypto.hs b/Crypto.hs
index 4e3741715f..66c27c5271 100644
--- a/Crypto.hs
+++ b/Crypto.hs
@@ -34,7 +34,7 @@ module Crypto (
 ) where
 
 import qualified Data.ByteString.Lazy as L
-import Data.ByteString.Lazy.UTF8 (fromString)
+import Data.ByteString.UTF8 (fromString)
 import Control.Applicative
 import qualified Data.Map as M
 import Control.Monad.IO.Class
diff --git a/Types/Crypto.hs b/Types/Crypto.hs
index 005be4531d..ec61f1c4b1 100644
--- a/Types/Crypto.hs
+++ b/Types/Crypto.hs
@@ -1,6 +1,6 @@
 {- git-annex crypto types
  -
- - Copyright 2011-2012 Joey Hess 
+ - Copyright 2011-2015 Joey Hess 
  -
  - Licensed under the GNU GPL version 3 or higher.
  -}
@@ -17,10 +17,11 @@ module Types.Crypto (
 	calcMac,
 ) where
 
-import qualified Data.ByteString.Lazy as L
 import qualified Data.Text as T
 import qualified Data.Text.Encoding as T
 import Data.Digest.Pure.SHA
+import qualified Data.ByteString as B
+import Crypto.Hash
 
 import Utility.Gpg (KeyIds(..))
 
@@ -62,17 +63,17 @@ readMac _ = Nothing
 
 calcMac
 	:: Mac          -- ^ MAC
-	-> L.ByteString -- ^ secret key
-	-> L.ByteString -- ^ message
+	-> B.ByteString -- ^ secret key
+	-> B.ByteString -- ^ message
 	-> String       -- ^ MAC'ed message, in hexadecimal
 calcMac mac = case mac of
-	HmacSha1   -> showDigest $* hmacSha1
-	HmacSha224 -> showDigest $* hmacSha224
-	HmacSha256 -> showDigest $* hmacSha256
-	HmacSha384 -> showDigest $* hmacSha384
-	HmacSha512 -> showDigest $* hmacSha512
+	HmacSha1   -> use SHA1
+	HmacSha224 -> use SHA224
+	HmacSha256 -> use SHA256
+	HmacSha384 -> use SHA384
+	HmacSha512 -> use SHA512
   where
-	($*) g f x y = g $ f x y
+	use alg k m = show (hmacGetDigest (hmacAlg alg k m))
 
 -- Check that all the MACs continue to produce the same.
 prop_mac_stable :: Bool
@@ -84,5 +85,5 @@ prop_mac_stable = all (\(mac, result) -> calcMac mac key msg == result)
 	, (HmacSha512, "114682914c5d017dfe59fdc804118b56a3a652a0b8870759cf9e792ed7426b08197076bf7d01640b1b0684df79e4b67e37485669e8ce98dbab60445f0db94fce")
 	]
   where
-	key = L.fromChunks [T.encodeUtf8 $ T.pack "foo"]
-	msg = L.fromChunks [T.encodeUtf8 $ T.pack "bar"]
+	key = T.encodeUtf8 $ T.pack "foo"
+	msg = T.encodeUtf8 $ T.pack "bar"
diff --git a/debian/control b/debian/control
index 6cb4a6327d..11f42a8c16 100644
--- a/debian/control
+++ b/debian/control
@@ -11,7 +11,7 @@ Build-Depends:
 	libghc-hslogger-dev,
 	libghc-pcre-light-dev,
 	libghc-sha-dev,
-	libghc-cryptohash-dev,
+	libghc-cryptohash-dev (>= 0.11.0),
 	libghc-dataenc-dev,
 	libghc-utf8-string-dev,
 	libghc-aws-dev (>= 0.9.2-2~),
diff --git a/git-annex.cabal b/git-annex.cabal
index b5ddb7d794..9b0407e1a2 100644
--- a/git-annex.cabal
+++ b/git-annex.cabal
@@ -110,7 +110,7 @@ Executable git-annex
    IfElse, text, QuickCheck >= 2.1, bloomfilter, edit-distance,
    SafeSemaphore, uuid, random, dlist, unix-compat, async, stm (>= 2.3),
    data-default, case-insensitive, http-conduit, http-types,
-   cryptohash (>= 0.10.0),
+   cryptohash (>= 0.11.0),
    esqueleto, persistent-sqlite, persistent, persistent-template,
    monad-logger, resourcet
   CC-Options: -Wall

From be3895be45c61d0c240f3f1ca1882b6f84e3c89c Mon Sep 17 00:00:00 2001
From: Joey Hess 
Date: Sun, 19 Apr 2015 10:57:14 -0400
Subject: [PATCH 047/362] refactor

---
 Types/Crypto.hs | 41 +----------------------------------------
 Utility/Hash.hs | 41 +++++++++++++++++++++++++++++++++++++++--
 2 files changed, 40 insertions(+), 42 deletions(-)

diff --git a/Types/Crypto.hs b/Types/Crypto.hs
index ec61f1c4b1..79970c2885 100644
--- a/Types/Crypto.hs
+++ b/Types/Crypto.hs
@@ -17,12 +17,7 @@ module Types.Crypto (
 	calcMac,
 ) where
 
-import qualified Data.Text as T
-import qualified Data.Text.Encoding as T
-import Data.Digest.Pure.SHA
-import qualified Data.ByteString as B
-import Crypto.Hash
-
+import Utility.Hash
 import Utility.Gpg (KeyIds(..))
 
 -- XXX ideally, this would be a locked memory region
@@ -34,13 +29,6 @@ data StorableCipher = EncryptedCipher String EncryptedCipherVariant KeyIds
 data EncryptedCipherVariant = Hybrid | PubKey
 	deriving (Ord, Eq)
 
-{- File names are (client-side) MAC'ed on special remotes.
- - The chosen MAC algorithm needs to be same for all files stored on the
- - remote.
- -}
-data Mac = HmacSha1 | HmacSha224 | HmacSha256 | HmacSha384 | HmacSha512
-	deriving (Eq)
-
 defaultMac :: Mac
 defaultMac = HmacSha1
 
@@ -60,30 +48,3 @@ readMac "HMACSHA256" = Just HmacSha256
 readMac "HMACSHA384" = Just HmacSha384
 readMac "HMACSHA512" = Just HmacSha512
 readMac _ = Nothing
-
-calcMac
-	:: Mac          -- ^ MAC
-	-> B.ByteString -- ^ secret key
-	-> B.ByteString -- ^ message
-	-> String       -- ^ MAC'ed message, in hexadecimal
-calcMac mac = case mac of
-	HmacSha1   -> use SHA1
-	HmacSha224 -> use SHA224
-	HmacSha256 -> use SHA256
-	HmacSha384 -> use SHA384
-	HmacSha512 -> use SHA512
-  where
-	use alg k m = show (hmacGetDigest (hmacAlg alg k m))
-
--- Check that all the MACs continue to produce the same.
-prop_mac_stable :: Bool
-prop_mac_stable = all (\(mac, result) -> calcMac mac key msg == result)
-	[ (HmacSha1, "46b4ec586117154dacd49d664e5d63fdc88efb51")
-	, (HmacSha224, "4c1f774863acb63b7f6e9daa9b5c543fa0d5eccf61e3ffc3698eacdd")
-	, (HmacSha256, "f9320baf0249169e73850cd6156ded0106e2bb6ad8cab01b7bbbebe6d1065317")
-	, (HmacSha384, "3d10d391bee2364df2c55cf605759373e1b5a4ca9355d8f3fe42970471eca2e422a79271a0e857a69923839015877fc6")
-	, (HmacSha512, "114682914c5d017dfe59fdc804118b56a3a652a0b8870759cf9e792ed7426b08197076bf7d01640b1b0684df79e4b67e37485669e8ce98dbab60445f0db94fce")
-	]
-  where
-	key = T.encodeUtf8 $ T.pack "foo"
-	msg = T.encodeUtf8 $ T.pack "bar"
diff --git a/Utility/Hash.hs b/Utility/Hash.hs
index 9881815bd0..f960a134fd 100644
--- a/Utility/Hash.hs
+++ b/Utility/Hash.hs
@@ -9,13 +9,16 @@ module Utility.Hash (
 	skein256,
 	skein512,
 	md5,
-	prop_hashes_stable
+	prop_hashes_stable,
+	Mac(..),
+	calcMac,
+	prop_mac_stable,
 ) where
 
 import qualified Data.ByteString.Lazy as L
 import qualified Data.Text as T
 import qualified Data.Text.Encoding as T
-
+import qualified Data.ByteString as S
 import Crypto.Hash
 
 sha1 :: L.ByteString -> Digest SHA1
@@ -60,3 +63,37 @@ prop_hashes_stable = all (\(hasher, result) -> hasher foo == result)
 	]
   where
 	foo = L.fromChunks [T.encodeUtf8 $ T.pack "foo"]
+
+{- File names are (client-side) MAC'ed on special remotes.
+ - The chosen MAC algorithm needs to be same for all files stored on the
+ - remote.
+ -}
+data Mac = HmacSha1 | HmacSha224 | HmacSha256 | HmacSha384 | HmacSha512
+	deriving (Eq)
+
+calcMac
+	:: Mac          -- ^ MAC
+	-> S.ByteString -- ^ secret key
+	-> S.ByteString -- ^ message
+	-> String       -- ^ MAC'ed message, in hexadecimal
+calcMac mac = case mac of
+	HmacSha1   -> use SHA1
+	HmacSha224 -> use SHA224
+	HmacSha256 -> use SHA256
+	HmacSha384 -> use SHA384
+	HmacSha512 -> use SHA512
+  where
+	use alg k m = show (hmacGetDigest (hmacAlg alg k m))
+
+-- Check that all the MACs continue to produce the same.
+prop_mac_stable :: Bool
+prop_mac_stable = all (\(mac, result) -> calcMac mac key msg == result)
+	[ (HmacSha1, "46b4ec586117154dacd49d664e5d63fdc88efb51")
+	, (HmacSha224, "4c1f774863acb63b7f6e9daa9b5c543fa0d5eccf61e3ffc3698eacdd")
+	, (HmacSha256, "f9320baf0249169e73850cd6156ded0106e2bb6ad8cab01b7bbbebe6d1065317")
+	, (HmacSha384, "3d10d391bee2364df2c55cf605759373e1b5a4ca9355d8f3fe42970471eca2e422a79271a0e857a69923839015877fc6")
+	, (HmacSha512, "114682914c5d017dfe59fdc804118b56a3a652a0b8870759cf9e792ed7426b08197076bf7d01640b1b0684df79e4b67e37485669e8ce98dbab60445f0db94fce")
+	]
+  where
+	key = T.encodeUtf8 $ T.pack "foo"
+	msg = T.encodeUtf8 $ T.pack "bar"

From 5f73bc3a1292ce0ea516e73d796dcd8644d49841 Mon Sep 17 00:00:00 2001
From: Joey Hess 
Date: Sun, 19 Apr 2015 11:05:32 -0400
Subject: [PATCH 048/362] Removed dependency on haskell SHA library, instead
 using cryptohash >= 0.11.0.

---
 Assistant/WebApp/Configurators/Pairing.hs |  4 ++--
 Utility/Verifiable.hs                     | 11 ++++++-----
 debian/changelog                          |  2 ++
 debian/control                            |  1 -
 git-annex.cabal                           |  2 +-
 standalone/android/cabal.config           |  1 -
 standalone/linux/cabal.config             |  1 -
 7 files changed, 11 insertions(+), 11 deletions(-)

diff --git a/Assistant/WebApp/Configurators/Pairing.hs b/Assistant/WebApp/Configurators/Pairing.hs
index 8f073680ee..beaf57fc11 100644
--- a/Assistant/WebApp/Configurators/Pairing.hs
+++ b/Assistant/WebApp/Configurators/Pairing.hs
@@ -39,7 +39,7 @@ import Git
 import qualified Data.Text as T
 #ifdef WITH_PAIRING
 import qualified Data.Text.Encoding as T
-import qualified Data.ByteString.Lazy as B
+import qualified Data.ByteString as B
 import Data.Char
 import qualified Control.Exception as E
 import Control.Concurrent
@@ -304,7 +304,7 @@ secretProblem s
 	| otherwise = Nothing
 
 toSecret :: Text -> Secret
-toSecret s = B.fromChunks [T.encodeUtf8 $ T.toLower $ T.filter isAlphaNum s]
+toSecret s = T.encodeUtf8 $ T.toLower $ T.filter isAlphaNum s
 
 {- From Dickens -}
 sampleQuote :: Text
diff --git a/Utility/Verifiable.hs b/Utility/Verifiable.hs
index a861416e2a..278c320aee 100644
--- a/Utility/Verifiable.hs
+++ b/Utility/Verifiable.hs
@@ -7,11 +7,12 @@
 
 module Utility.Verifiable where
 
-import Data.Digest.Pure.SHA
-import Data.ByteString.Lazy.UTF8 (fromString)
-import qualified Data.ByteString.Lazy as L
+import Data.ByteString.UTF8 (fromString)
+import qualified Data.ByteString as S
 
-type Secret = L.ByteString
+import Utility.Hash
+
+type Secret = S.ByteString
 type HMACDigest = String
 
 {- A value, verifiable using a HMAC digest and a secret. -}
@@ -28,7 +29,7 @@ verify :: (Eq a, Show a) => Verifiable a -> Secret -> Bool
 verify v secret = v == mkVerifiable (verifiableVal v) secret
 
 calcDigest :: String -> Secret -> HMACDigest
-calcDigest v secret = showDigest $ hmacSha1 secret $ fromString v
+calcDigest v secret = calcMac HmacSha1 secret (fromString v)
 
 {- for quickcheck -}
 prop_verifiable_sane :: String -> String -> Bool
diff --git a/debian/changelog b/debian/changelog
index 53de77cc86..ba498e0a15 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -23,6 +23,8 @@ git-annex (5.20150410) UNRELEASED; urgency=medium
   * fsck --from remote: Avoid downloading a key if it would go over
     the annex.diskreserve limit.
   * required: New command, like wanted, but for required content.
+  * Removed dependency on haskell SHA library,
+    instead using cryptohash >= 0.11.0.
 
  -- Joey Hess   Thu, 09 Apr 2015 20:59:43 -0400
 
diff --git a/debian/control b/debian/control
index 11f42a8c16..85a3e67e6d 100644
--- a/debian/control
+++ b/debian/control
@@ -10,7 +10,6 @@ Build-Depends:
 	libghc-data-default-dev,
 	libghc-hslogger-dev,
 	libghc-pcre-light-dev,
-	libghc-sha-dev,
 	libghc-cryptohash-dev (>= 0.11.0),
 	libghc-dataenc-dev,
 	libghc-utf8-string-dev,
diff --git a/git-annex.cabal b/git-annex.cabal
index 9b0407e1a2..99601f2a3c 100644
--- a/git-annex.cabal
+++ b/git-annex.cabal
@@ -105,7 +105,7 @@ Executable git-annex
   Main-Is: git-annex.hs
   Build-Depends: MissingH, hslogger, directory, filepath,
    containers (>= 0.5.0.0), utf8-string, mtl (>= 2),
-   bytestring, old-locale, time, dataenc, SHA, process, json,
+   bytestring, old-locale, time, dataenc, process, json,
    base (>= 4.5 && < 4.9), monad-control, exceptions (>= 0.6), transformers,
    IfElse, text, QuickCheck >= 2.1, bloomfilter, edit-distance,
    SafeSemaphore, uuid, random, dlist, unix-compat, async, stm (>= 2.3),
diff --git a/standalone/android/cabal.config b/standalone/android/cabal.config
index 5ba5bacc25..f39dee91fc 100644
--- a/standalone/android/cabal.config
+++ b/standalone/android/cabal.config
@@ -6,7 +6,6 @@ constraints: Crypto ==4.2.5.1,
              MissingH ==1.2.1.0,
              MonadRandom ==0.1.13,
              QuickCheck ==2.7.6,
-             SHA ==1.6.1,
              SafeSemaphore ==0.10.1,
              aeson ==0.7.0.6,
              ansi-terminal ==0.6.1.1,
diff --git a/standalone/linux/cabal.config b/standalone/linux/cabal.config
index 5ba5bacc25..f39dee91fc 100644
--- a/standalone/linux/cabal.config
+++ b/standalone/linux/cabal.config
@@ -6,7 +6,6 @@ constraints: Crypto ==4.2.5.1,
              MissingH ==1.2.1.0,
              MonadRandom ==0.1.13,
              QuickCheck ==2.7.6,
-             SHA ==1.6.1,
              SafeSemaphore ==0.10.1,
              aeson ==0.7.0.6,
              ansi-terminal ==0.6.1.1,

From 6ed1e1e2bf15bf8aa008c3f0e89c0249da395475 Mon Sep 17 00:00:00 2001
From: CandyAngel 
Date: Sun, 19 Apr 2015 15:51:45 +0000
Subject: [PATCH 049/362] Added a comment

---
 ...ment_3_29f6f9df1ad22113e9690b0d1da36ba0._comment | 13 +++++++++++++
 1 file changed, 13 insertions(+)
 create mode 100644 doc/forum/How_to_find_deleted_files_that_I_know_have_been_backed_up__63__/comment_3_29f6f9df1ad22113e9690b0d1da36ba0._comment

diff --git a/doc/forum/How_to_find_deleted_files_that_I_know_have_been_backed_up__63__/comment_3_29f6f9df1ad22113e9690b0d1da36ba0._comment b/doc/forum/How_to_find_deleted_files_that_I_know_have_been_backed_up__63__/comment_3_29f6f9df1ad22113e9690b0d1da36ba0._comment
new file mode 100644
index 0000000000..3a39314a98
--- /dev/null
+++ b/doc/forum/How_to_find_deleted_files_that_I_know_have_been_backed_up__63__/comment_3_29f6f9df1ad22113e9690b0d1da36ba0._comment
@@ -0,0 +1,13 @@
+[[!comment format=mdwn
+ username="CandyAngel"
+ subject="comment 3"
+ date="2015-04-19T15:51:45Z"
+ content="""
+Have you tried checking out a commit which it was present in and then using whereis?
+
+Not sure if you can do:
+
+    git annex whereis --key $KEY
+
+But if not, may be worth a feature request!
+"""]]

From 900e1b676c7cc6e5d5bc5bf4e09068930c4aeeaa Mon Sep 17 00:00:00 2001
From: 
 "https://www.google.com/accounts/o8/id?id=AItOawnSenxKyE_2Z6Wb-EBMO8FciyRywjx1ZiQ"
 
Date: Sun, 19 Apr 2015 22:25:03 +0000
Subject: [PATCH 050/362]

---
 ...t_content_from_S3_with_s3-aws_library.mdwn | 57 +++++++++++++++++++
 1 file changed, 57 insertions(+)
 create mode 100644 doc/bugs/Can__39__t_get_content_from_S3_with_s3-aws_library.mdwn

diff --git a/doc/bugs/Can__39__t_get_content_from_S3_with_s3-aws_library.mdwn b/doc/bugs/Can__39__t_get_content_from_S3_with_s3-aws_library.mdwn
new file mode 100644
index 0000000000..f4af0cdd58
--- /dev/null
+++ b/doc/bugs/Can__39__t_get_content_from_S3_with_s3-aws_library.mdwn
@@ -0,0 +1,57 @@
+### Please describe the problem.
+I have lots of content stored in Amazon S3. Using git-annex from before commit 911ba8d972e4e7b151385d30c198598e1a0dfaca, I am able to ``git annex get`` from S3 and files are downloaded.
+Using a more recent version (eg that commit, or the current master, or release 20150409), I am unable to download the content.
+
+I'm not sure if my repo or remote is somehow misconfigured, or if there's something else going on here.
+
+--Walter
+
+### What steps will reproduce the problem?
+Use a version of git-annex with s3-aws
+
+### What version of git-annex are you using? On what operating system?
+Debian, versions as above
+
+### Please provide any additional information below.
+
+[[!format sh """
+# If you can, paste a complete transcript of the problem occurring here.
+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log
+
+git annex get . --from cloud --debug
+[2015-04-19 22:23:37 BST] read: git ["--git-dir=../../../.git","--work-tree=../../..","--literal-pathspecs","show-ref","git-annex"]
+[2015-04-19 22:23:37 BST] read: git ["--git-dir=../../../.git","--work-tree=../../..","--literal-pathspecs","show-ref","--hash","refs/heads/git-annex"]
+[2015-04-19 22:23:37 BST] read: git ["--git-dir=../../../.git","--work-tree=../../..","--literal-pathspecs","log","refs/heads/git-annex..a51a912223d3d86f19762e387e3eae23c3024d2c","-n1","--pretty=%H"]
+[2015-04-19 22:23:37 BST] chat: git ["--git-dir=../../../.git","--work-tree=../../..","--literal-pathspecs","cat-file","--batch"]
+[2015-04-19 22:23:37 BST] read: git ["--git-dir=../../../.git","--work-tree=../../..","--literal-pathspecs","ls-files","--cached","-z","--","."]
+get IMG_7079.JPG (from cloud...) [2015-04-19 22:23:37 BST] chat: gpg ["--batch","--no-tty","--use-agent","--quiet","--trust-model","always","--decrypt"]
+
+failed                  
+get IMG_7080.JPG (from cloud...) 
+failed                  
+
+
+
+git annex info cloud
+remote: cloud
+description: [cloud]
+uuid: be992080-b1db-11e1-8f79-1b10bb4092ef
+trust: semitrusted
+cost: 250.0
+type: S3
+creds: embedded in git repository (gpg encrypted)
+bucket: ffffffffffffffffffffffffff
+partsize: unlimited
+encryption: encrypted (to gpg keys: FFFFFFFFFFFF) (hybrid mode)
+chunking: none
+remote annex keys: 0
+remote annex size: 0 bytes
+
+
+git annex fsck -f cloud
+fsck IMG_6876.JPG (checking cloud...) (StatusCodeException (Status {statusCode = 301, statusMessage = "Moved Permanently"}) [("x-amz-request-id","275ADF5B1B77D514"),("x-amz-id-2","flWGBHOZYEZAohygAzBIZAYd7nBGkm3HpSMfJuhgRp3txXx20yJz7S4yRlNLwCs1cHUMyWc9JbA="),("Content-Type","application/xml"),("Transfer-Encoding","chunked"),("Date","Sun, 19 Apr 2015 22:23:15 GMT"),("Server","AmazonS3")] (CJ {expose = []})) failed
+
+
+
+# End of transcript or log.
+"""]]

From de3d2d5295db1c27fc8aeefb581df1cb1aa43190 Mon Sep 17 00:00:00 2001
From: 
 "https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U"
 
Date: Mon, 20 Apr 2015 14:37:03 +0000
Subject: [PATCH 051/362] Added a comment

---
 ...mment_2_d87df8f1012f71248ed33f64f9ace17e._comment | 12 ++++++++++++
 1 file changed, 12 insertions(+)
 create mode 100644 doc/todo/wishlist:_rsync_efficiency/comment_2_d87df8f1012f71248ed33f64f9ace17e._comment

diff --git a/doc/todo/wishlist:_rsync_efficiency/comment_2_d87df8f1012f71248ed33f64f9ace17e._comment b/doc/todo/wishlist:_rsync_efficiency/comment_2_d87df8f1012f71248ed33f64f9ace17e._comment
new file mode 100644
index 0000000000..3acd6b74b7
--- /dev/null
+++ b/doc/todo/wishlist:_rsync_efficiency/comment_2_d87df8f1012f71248ed33f64f9ace17e._comment
@@ -0,0 +1,12 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U"
+ nickname="Richard"
+ subject="comment 2"
+ date="2015-04-20T14:37:03Z"
+ content="""
+I read the blog after my time abroad and chuckled about the timing of my request, yah :)
+
+Could git-annex reasonably detach generating the list of files to transfer from the actual transfer? That way, there is never a delay while git-annex looks for the next file.
+
+Richard
+"""]]

From 7eaf015a6695dd23783de2a22a8668d3dcae9edc Mon Sep 17 00:00:00 2001
From: 
 "https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U"
 
Date: Mon, 20 Apr 2015 14:37:10 +0000
Subject: [PATCH 052/362] Added a comment

---
 ...mment_3_f6de0140e61877d2d15cd6e8d8ab784d._comment | 12 ++++++++++++
 1 file changed, 12 insertions(+)
 create mode 100644 doc/todo/wishlist:_rsync_efficiency/comment_3_f6de0140e61877d2d15cd6e8d8ab784d._comment

diff --git a/doc/todo/wishlist:_rsync_efficiency/comment_3_f6de0140e61877d2d15cd6e8d8ab784d._comment b/doc/todo/wishlist:_rsync_efficiency/comment_3_f6de0140e61877d2d15cd6e8d8ab784d._comment
new file mode 100644
index 0000000000..44178ae3c1
--- /dev/null
+++ b/doc/todo/wishlist:_rsync_efficiency/comment_3_f6de0140e61877d2d15cd6e8d8ab784d._comment
@@ -0,0 +1,12 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U"
+ nickname="Richard"
+ subject="comment 3"
+ date="2015-04-20T14:37:10Z"
+ content="""
+I read the blog after my time abroad and chuckled about the timing of my request, yah :)
+
+Could git-annex reasonably detach generating the list of files to transfer from the actual transfer? That way, there is never a delay while git-annex looks for the next file.
+
+Richard
+"""]]

From 957ac64361a7618e6e74e33c060cfb31282fcdcd Mon Sep 17 00:00:00 2001
From: 
 "https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U"
 
Date: Mon, 20 Apr 2015 14:37:46 +0000
Subject: [PATCH 053/362] removed

---
 ...mment_3_f6de0140e61877d2d15cd6e8d8ab784d._comment | 12 ------------
 1 file changed, 12 deletions(-)
 delete mode 100644 doc/todo/wishlist:_rsync_efficiency/comment_3_f6de0140e61877d2d15cd6e8d8ab784d._comment

diff --git a/doc/todo/wishlist:_rsync_efficiency/comment_3_f6de0140e61877d2d15cd6e8d8ab784d._comment b/doc/todo/wishlist:_rsync_efficiency/comment_3_f6de0140e61877d2d15cd6e8d8ab784d._comment
deleted file mode 100644
index 44178ae3c1..0000000000
--- a/doc/todo/wishlist:_rsync_efficiency/comment_3_f6de0140e61877d2d15cd6e8d8ab784d._comment
+++ /dev/null
@@ -1,12 +0,0 @@
-[[!comment format=mdwn
- username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U"
- nickname="Richard"
- subject="comment 3"
- date="2015-04-20T14:37:10Z"
- content="""
-I read the blog after my time abroad and chuckled about the timing of my request, yah :)
-
-Could git-annex reasonably detach generating the list of files to transfer from the actual transfer? That way, there is never a delay while git-annex looks for the next file.
-
-Richard
-"""]]

From ace24739ac7118b8123dc4b6ed60f3aa0fafd859 Mon Sep 17 00:00:00 2001
From: 
 "https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U"
 
Date: Mon, 20 Apr 2015 14:41:27 +0000
Subject: [PATCH 054/362]

---
 doc/todo/wishlist:___96__git_annex_optimize__96__.mdwn | 6 ++++++
 1 file changed, 6 insertions(+)
 create mode 100644 doc/todo/wishlist:___96__git_annex_optimize__96__.mdwn

diff --git a/doc/todo/wishlist:___96__git_annex_optimize__96__.mdwn b/doc/todo/wishlist:___96__git_annex_optimize__96__.mdwn
new file mode 100644
index 0000000000..8e6fced45f
--- /dev/null
+++ b/doc/todo/wishlist:___96__git_annex_optimize__96__.mdwn
@@ -0,0 +1,6 @@
+Given [this tip](https://git-annex.branchable.com/forum/__34__git_annex_sync__34___synced_after_8_hours/#comment-890ca1381d800ac833ccbb8c5db175ea), [this comment](https://git-annex.branchable.com/todo/wishlist:_rsync_efficiency/#comment-870ae805efd35343edefdbed792dac04) and possibly others, it would be nice if git-annex could look at any given repo and make suggestions for improvements. As a second step, it could look at remotes as well. And as a third, maybe even change repo settings and not just make suggestions.
+
+Having a few old repos with terabytes of data on various disks, I would just toss this stanza into my mr templates to eventually optimize all my repos to current best practices.
+
+
+-- Richard

From 2665be44d54a934cb9a1754e36e151dde47d0953 Mon Sep 17 00:00:00 2001
From: Joey Hess 
Date: Mon, 20 Apr 2015 11:08:32 -0400
Subject: [PATCH 055/362] update some windows libraries for newer version of
 cygwin

---
 Build/NullSoftInstaller.hs | 3 ++-
 debian/changelog           | 2 ++
 2 files changed, 4 insertions(+), 1 deletion(-)

diff --git a/Build/NullSoftInstaller.hs b/Build/NullSoftInstaller.hs
index 42260bd3f0..160225bf10 100644
--- a/Build/NullSoftInstaller.hs
+++ b/Build/NullSoftInstaller.hs
@@ -191,11 +191,12 @@ cygwinDlls =
 	, "cygintl-8.dll"
 	, "cygwind-0.dll"
 	, "cyggssapi-3.dll"
+	, "cyggssapi_krb5-2.dll"
 	, "cygkrb5-26.dll"
 	, "cygz.dll"
 	, "cygidn-11.dll"
 	, "libcurl-4.dll"
-	, "cyggnutls-26.dll"
+	, "cyggnutls-28.dll"
 	, "libcrypto.dll"
 	, "libssl.dll"
 	, "cyggcrypt-11.dll"
diff --git a/debian/changelog b/debian/changelog
index ba498e0a15..ed8e389737 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -25,6 +25,8 @@ git-annex (5.20150410) UNRELEASED; urgency=medium
   * required: New command, like wanted, but for required content.
   * Removed dependency on haskell SHA library,
     instead using cryptohash >= 0.11.0.
+  * Windows: Bundled versions of rsync, wget, ssh, and gpg from
+    cygwin all updated. Thanks, Yury V. Zaytsev.
 
  -- Joey Hess   Thu, 09 Apr 2015 20:59:43 -0400
 

From c1859130c23fd16a3b93693273fd752db32cbe3e Mon Sep 17 00:00:00 2001
From: Joey Hess 
Date: Mon, 20 Apr 2015 11:12:59 -0400
Subject: [PATCH 056/362] prune old lib

---
 Build/NullSoftInstaller.hs | 1 -
 1 file changed, 1 deletion(-)

diff --git a/Build/NullSoftInstaller.hs b/Build/NullSoftInstaller.hs
index 160225bf10..cbe24f71d4 100644
--- a/Build/NullSoftInstaller.hs
+++ b/Build/NullSoftInstaller.hs
@@ -195,7 +195,6 @@ cygwinDlls =
 	, "cygkrb5-26.dll"
 	, "cygz.dll"
 	, "cygidn-11.dll"
-	, "libcurl-4.dll"
 	, "cyggnutls-28.dll"
 	, "libcrypto.dll"
 	, "libssl.dll"

From b1cb603b6b38ac29d0a0752e36518f89b0fb178c Mon Sep 17 00:00:00 2001
From: Joey Hess 
Date: Mon, 20 Apr 2015 11:25:40 -0400
Subject: [PATCH 057/362] more libs

---
 Build/NullSoftInstaller.hs | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/Build/NullSoftInstaller.hs b/Build/NullSoftInstaller.hs
index cbe24f71d4..3d8780fa7a 100644
--- a/Build/NullSoftInstaller.hs
+++ b/Build/NullSoftInstaller.hs
@@ -207,6 +207,8 @@ cygwinDlls =
 	, "cygreadline7.dll"
 	, "cygncursesw-10.dll"
 	, "cygusb0.dll"
+	, "cyghogweed-2.dll"
+	, "cygk5crypto-3.dll"
 	]
 
 -- msysgit opens Program Files/Git/doc/git/html/git-annex.html

From 2387c6f5c61466d1217c19207f8e90eb4d756d41 Mon Sep 17 00:00:00 2001
From: Joey Hess 
Date: Mon, 20 Apr 2015 11:27:47 -0400
Subject: [PATCH 058/362] unused import on windows

---
 Assistant.hs | 1 -
 1 file changed, 1 deletion(-)

diff --git a/Assistant.hs b/Assistant.hs
index fb04f51106..265827a773 100644
--- a/Assistant.hs
+++ b/Assistant.hs
@@ -57,7 +57,6 @@ import Utility.LogFile
 #ifdef mingw32_HOST_OS
 import Utility.Env
 import Annex.Path
-import Config.Files
 import System.Environment (getArgs)
 #endif
 

From 0bc67213cc96e179007393d6237353a076ee215f Mon Sep 17 00:00:00 2001
From: Joey Hess 
Date: Mon, 20 Apr 2015 11:47:58 -0400
Subject: [PATCH 059/362] more libs

---
 Build/NullSoftInstaller.hs | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/Build/NullSoftInstaller.hs b/Build/NullSoftInstaller.hs
index 3d8780fa7a..495dfcab89 100644
--- a/Build/NullSoftInstaller.hs
+++ b/Build/NullSoftInstaller.hs
@@ -209,6 +209,8 @@ cygwinDlls =
 	, "cygusb0.dll"
 	, "cyghogweed-2.dll"
 	, "cygk5crypto-3.dll"
+	, "cygkrb5support-0.dll"
+	, "cyggmp-10.dll"
 	]
 
 -- msysgit opens Program Files/Git/doc/git/html/git-annex.html

From 7c17ad05d2e6effaa1808e5b31d3852fab675da7 Mon Sep 17 00:00:00 2001
From: Joey Hess 
Date: Mon, 20 Apr 2015 12:01:26 -0400
Subject: [PATCH 060/362] more libs

---
 Build/NullSoftInstaller.hs | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/Build/NullSoftInstaller.hs b/Build/NullSoftInstaller.hs
index 495dfcab89..d460e675ac 100644
--- a/Build/NullSoftInstaller.hs
+++ b/Build/NullSoftInstaller.hs
@@ -211,6 +211,8 @@ cygwinDlls =
 	, "cygk5crypto-3.dll"
 	, "cygkrb5support-0.dll"
 	, "cyggmp-10.dll"
+	, "cygkrb5-3.dll"
+	, "cygnettle-4.dll"
 	]
 
 -- msysgit opens Program Files/Git/doc/git/html/git-annex.html

From 9f4647e091779549379dd52ff6a514a6dcf40102 Mon Sep 17 00:00:00 2001
From: Joey Hess 
Date: Mon, 20 Apr 2015 12:09:55 -0400
Subject: [PATCH 061/362] updated lib version

---
 Build/NullSoftInstaller.hs | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Build/NullSoftInstaller.hs b/Build/NullSoftInstaller.hs
index d460e675ac..3f150badac 100644
--- a/Build/NullSoftInstaller.hs
+++ b/Build/NullSoftInstaller.hs
@@ -201,7 +201,6 @@ cygwinDlls =
 	, "cyggcrypt-11.dll"
 	, "cyggpg-error-0.dll"
 	, "cygp11-kit-0.dll"
-	, "cygtasn1-3.dll"
 	, "cygffi-6.dll"
 	, "cygbz2-1.dll"
 	, "cygreadline7.dll"
@@ -213,6 +212,7 @@ cygwinDlls =
 	, "cyggmp-10.dll"
 	, "cygkrb5-3.dll"
 	, "cygnettle-4.dll"
+	, "cygtasn1-6.dll"
 	]
 
 -- msysgit opens Program Files/Git/doc/git/html/git-annex.html

From ed10722faee05ba0761baaf00d59cfe08abe94f5 Mon Sep 17 00:00:00 2001
From: Joey Hess 
Date: Mon, 20 Apr 2015 12:20:42 -0400
Subject: [PATCH 062/362] another lib

---
 Build/NullSoftInstaller.hs | 1 +
 1 file changed, 1 insertion(+)

diff --git a/Build/NullSoftInstaller.hs b/Build/NullSoftInstaller.hs
index 3f150badac..26ce737d17 100644
--- a/Build/NullSoftInstaller.hs
+++ b/Build/NullSoftInstaller.hs
@@ -213,6 +213,7 @@ cygwinDlls =
 	, "cygkrb5-3.dll"
 	, "cygnettle-4.dll"
 	, "cygtasn1-6.dll"
+	, "cygpcre-1.dll"
 	]
 
 -- msysgit opens Program Files/Git/doc/git/html/git-annex.html

From 10afac3fba2e73733e5b5103257c5c25fcaac8fb Mon Sep 17 00:00:00 2001
From: Joey Hess 
Date: Mon, 20 Apr 2015 13:03:46 -0400
Subject: [PATCH 063/362] another lib

---
 Build/NullSoftInstaller.hs | 1 +
 1 file changed, 1 insertion(+)

diff --git a/Build/NullSoftInstaller.hs b/Build/NullSoftInstaller.hs
index 26ce737d17..bf0875e2c6 100644
--- a/Build/NullSoftInstaller.hs
+++ b/Build/NullSoftInstaller.hs
@@ -214,6 +214,7 @@ cygwinDlls =
 	, "cygnettle-4.dll"
 	, "cygtasn1-6.dll"
 	, "cygpcre-1.dll"
+	, "cyguuid-1.dll"
 	]
 
 -- msysgit opens Program Files/Git/doc/git/html/git-annex.html

From 911335247cbb3d11856d4ae8573014ecac7f8312 Mon Sep 17 00:00:00 2001
From: Joey Hess 
Date: Mon, 20 Apr 2015 13:15:01 -0400
Subject: [PATCH 064/362] if ~/.ssh does not exist and cannot be created, avoid
 failing

---
 standalone/linux/skel/runshell                | 22 ++++++++++---------
 .../osx/git-annex.app/Contents/MacOS/runshell | 22 ++++++++++---------
 2 files changed, 24 insertions(+), 20 deletions(-)

diff --git a/standalone/linux/skel/runshell b/standalone/linux/skel/runshell
index f6db1da130..6d846104ca 100755
--- a/standalone/linux/skel/runshell
+++ b/standalone/linux/skel/runshell
@@ -31,16 +31,18 @@ cd "$orig"
 # assistant.
 if [ ! -e "$HOME/.ssh/git-annex-shell" ]; then
 	mkdir "$HOME/.ssh" >/dev/null 2>&1 || true
-	(
-		echo "#!/bin/sh"
-		echo "set -e"
-		echo "if [ \"x\$SSH_ORIGINAL_COMMAND\" != \"x\" ]; then"
-		echo "exec $base/runshell git-annex-shell -c \"\$SSH_ORIGINAL_COMMAND\""
-		echo "else"
-		echo "exec $base/runshell git-annex-shell -c \"\$@\""
-		echo "fi"
-	) > "$HOME/.ssh/git-annex-shell"
-	chmod +x "$HOME/.ssh/git-annex-shell"
+	if [ -e "$HOME/.ssh" ]; then
+		(
+			echo "#!/bin/sh"
+			echo "set -e"
+			echo "if [ \"x\$SSH_ORIGINAL_COMMAND\" != \"x\" ]; then"
+			echo "exec $base/runshell git-annex-shell -c \"\$SSH_ORIGINAL_COMMAND\""
+			echo "else"
+			echo "exec $base/runshell git-annex-shell -c \"\$@\""
+			echo "fi"
+		) > "$HOME/.ssh/git-annex-shell"
+		chmod +x "$HOME/.ssh/git-annex-shell"
+	fi
 fi
 
 # And this shim is used by the webapp when adding a remote ssh server.
diff --git a/standalone/osx/git-annex.app/Contents/MacOS/runshell b/standalone/osx/git-annex.app/Contents/MacOS/runshell
index c5d689c6e1..534e9707e1 100755
--- a/standalone/osx/git-annex.app/Contents/MacOS/runshell
+++ b/standalone/osx/git-annex.app/Contents/MacOS/runshell
@@ -33,16 +33,18 @@ cd "$orig"
 # assistant.
 if [ ! -e "$HOME/.ssh/git-annex-shell" ]; then
 	mkdir "$HOME/.ssh" >/dev/null 2>&1 || true
-	(
-		echo "#!/bin/sh"
-		echo "set -e"
-		echo "if [ \"x\$SSH_ORIGINAL_COMMAND\" != \"x\" ]; then"
-		echo "exec $base/runshell git-annex-shell -c \"\$SSH_ORIGINAL_COMMAND\""
-		echo "else"
-		echo "exec $base/runshell git-annex-shell -c \"\$@\""
-		echo "fi"
-	) > "$HOME/.ssh/git-annex-shell"
-	chmod +x "$HOME/.ssh/git-annex-shell"
+	if [ -e "$HOME/.ssh" ]; then
+		(
+			echo "#!/bin/sh"
+			echo "set -e"
+			echo "if [ \"x\$SSH_ORIGINAL_COMMAND\" != \"x\" ]; then"
+			echo "exec $base/runshell git-annex-shell -c \"\$SSH_ORIGINAL_COMMAND\""
+			echo "else"
+			echo "exec $base/runshell git-annex-shell -c \"\$@\""
+			echo "fi"
+		) > "$HOME/.ssh/git-annex-shell"
+		chmod +x "$HOME/.ssh/git-annex-shell"
+	fi
 fi
 
 # And this shim is used by the webapp when adding a remote ssh server.

From fdf0d708d21a33f7767e1f2fdfcc399685697527 Mon Sep 17 00:00:00 2001
From: Joey Hess 
Date: Mon, 20 Apr 2015 13:35:09 -0400
Subject: [PATCH 065/362] reorder

---
 debian/changelog | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/debian/changelog b/debian/changelog
index ed8e389737..9248df3297 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -7,11 +7,7 @@ git-annex (5.20150410) UNRELEASED; urgency=medium
   * info dir: Added information about repositories that
     contain files in the specified directory.
   * info: Added --bytes option.
-  * Windows: Renamed start menu file to avoid loop in some versions
-    of Windows where the menu file is treated as a git-annex program.
   * bittorrent: Fix handling of magnet links.
-  * Windows: Fixed support of remotes on other drives.
-    (A reversion introduced in version 5.20150113.)
   * When a key's size is unknown, still check the annex.diskreserve,
     and avoid getting content if the disk is too full.
   * Fix fsck --from a git remote in a local directory, and from
@@ -25,6 +21,10 @@ git-annex (5.20150410) UNRELEASED; urgency=medium
   * required: New command, like wanted, but for required content.
   * Removed dependency on haskell SHA library,
     instead using cryptohash >= 0.11.0.
+  * Windows: Renamed start menu file to avoid loop in some versions
+    of Windows where the menu file is treated as a git-annex program.
+  * Windows: Fixed support of remotes on other drives.
+    (A reversion introduced in version 5.20150113.)
   * Windows: Bundled versions of rsync, wget, ssh, and gpg from
     cygwin all updated. Thanks, Yury V. Zaytsev.
 

From 1ba092080c7d6c81f4c99e4473f6bbaf19114b20 Mon Sep 17 00:00:00 2001
From: 
 "https://www.google.com/accounts/o8/id?id=AItOawlh1G1u_AMJEyADqlfuzV2cePniocDyK6A"
 
Date: Mon, 20 Apr 2015 17:40:38 +0000
Subject: [PATCH 066/362] Added a comment

---
 .../comment_6_1ce9bb47dadd2b1c500b2a20fd669907._comment  | 9 +++++++++
 1 file changed, 9 insertions(+)
 create mode 100644 doc/forum/Slow_transfer_speeds_on_copy_in_Windows/comment_6_1ce9bb47dadd2b1c500b2a20fd669907._comment

diff --git a/doc/forum/Slow_transfer_speeds_on_copy_in_Windows/comment_6_1ce9bb47dadd2b1c500b2a20fd669907._comment b/doc/forum/Slow_transfer_speeds_on_copy_in_Windows/comment_6_1ce9bb47dadd2b1c500b2a20fd669907._comment
new file mode 100644
index 0000000000..43f5c3f2ee
--- /dev/null
+++ b/doc/forum/Slow_transfer_speeds_on_copy_in_Windows/comment_6_1ce9bb47dadd2b1c500b2a20fd669907._comment
@@ -0,0 +1,9 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawlh1G1u_AMJEyADqlfuzV2cePniocDyK6A"
+ nickname="Adam"
+ subject="comment 6"
+ date="2015-04-20T17:40:38Z"
+ content="""
+There are pathing issues with other applications if I add cygwin to the path or are you saying copy over cygwin's copy?  I did have issues with ssh and had to copy all the files to the bin dir rather than the cmd dir to get it to work.  This also screwed up my home dir, making c:\ my home.  I went with it, since I'm the only user, and copied my .ssh folder to C:\... not the most secure option, but it worked.  (Note: it seemed to ignore the $HOME env variable)
+
+"""]]

From 6de407904784b28d12f4339c610e0dbb28b06131 Mon Sep 17 00:00:00 2001
From: 
 "https://www.google.com/accounts/o8/id?id=AItOawlh1G1u_AMJEyADqlfuzV2cePniocDyK6A"
 
Date: Mon, 20 Apr 2015 17:43:11 +0000
Subject: [PATCH 067/362] Added a comment

---
 .../comment_7_4b78b200b884c4ac7c052055b3e26784._comment   | 8 ++++++++
 1 file changed, 8 insertions(+)
 create mode 100644 doc/forum/Slow_transfer_speeds_on_copy_in_Windows/comment_7_4b78b200b884c4ac7c052055b3e26784._comment

diff --git a/doc/forum/Slow_transfer_speeds_on_copy_in_Windows/comment_7_4b78b200b884c4ac7c052055b3e26784._comment b/doc/forum/Slow_transfer_speeds_on_copy_in_Windows/comment_7_4b78b200b884c4ac7c052055b3e26784._comment
new file mode 100644
index 0000000000..a49eacd140
--- /dev/null
+++ b/doc/forum/Slow_transfer_speeds_on_copy_in_Windows/comment_7_4b78b200b884c4ac7c052055b3e26784._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawlh1G1u_AMJEyADqlfuzV2cePniocDyK6A"
+ nickname="Adam"
+ subject="comment 7"
+ date="2015-04-20T17:43:11Z"
+ content="""
+I'm not using cygwin for git-annex.  I'm using msysgit and git's command window.
+"""]]

From e3ccc0675377da30ad4fb2b13932e0d3d91c81eb Mon Sep 17 00:00:00 2001
From: "http://joeyh.name/" 
Date: Mon, 20 Apr 2015 17:43:48 +0000
Subject: [PATCH 068/362] Added a comment

---
 .../comment_8_97ef11581c5dc6eeeabb4b244bdc6c30._comment    | 7 +++++++
 1 file changed, 7 insertions(+)
 create mode 100644 doc/forum/Slow_transfer_speeds_on_copy_in_Windows/comment_8_97ef11581c5dc6eeeabb4b244bdc6c30._comment

diff --git a/doc/forum/Slow_transfer_speeds_on_copy_in_Windows/comment_8_97ef11581c5dc6eeeabb4b244bdc6c30._comment b/doc/forum/Slow_transfer_speeds_on_copy_in_Windows/comment_8_97ef11581c5dc6eeeabb4b244bdc6c30._comment
new file mode 100644
index 0000000000..9363c0bfa7
--- /dev/null
+++ b/doc/forum/Slow_transfer_speeds_on_copy_in_Windows/comment_8_97ef11581c5dc6eeeabb4b244bdc6c30._comment
@@ -0,0 +1,7 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ subject="comment 8"
+ date="2015-04-20T17:43:48Z"
+ content="""
+We've updated the autobuilder, so the daily build now has the most recent rsync and ssh from cygwin included in it. I'd be curious if that improves the speed any.
+"""]]

From 5948c148fb1317b85b542a86af1bb816908f34bd Mon Sep 17 00:00:00 2001
From: Joey Hess 
Date: Mon, 20 Apr 2015 14:01:41 -0400
Subject: [PATCH 069/362] Make repo init more robust.

The setDifferences that got added to initialize turns out to make a git
commit, and before ensureCommit has been used. Thus, repo init can fail
when the system has a broken hostname etc.

Move the ensureCommit to the very first thing to avoid this kind of breakage.
---
 Annex/Init.hs    | 10 +++++-----
 debian/changelog |  1 +
 2 files changed, 6 insertions(+), 5 deletions(-)

diff --git a/Annex/Init.hs b/Annex/Init.hs
index 50f4d8522b..2cc1c18973 100644
--- a/Annex/Init.hs
+++ b/Annex/Init.hs
@@ -57,15 +57,15 @@ genDescription Nothing = do
 
 initialize :: Maybe String -> Annex ()
 initialize mdescription = do
+	{- This will make the first commit to git, so ensure git is set up
+	 - properly to allow commits when running it. -}
+	ensureCommit $ Annex.Branch.create
+
 	prepUUID
 	initialize'
 
 	u <- getUUID
-	{- This will make the first commit to git, so ensure git is set up
-	 - properly to allow commits when running it. -}
-	ensureCommit $ do
-		Annex.Branch.create
-		describeUUID u =<< genDescription mdescription
+	describeUUID u =<< genDescription mdescription
 
 -- Everything except for uuid setup.
 initialize' :: Annex ()
diff --git a/debian/changelog b/debian/changelog
index 9248df3297..2628369bc9 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -21,6 +21,7 @@ git-annex (5.20150410) UNRELEASED; urgency=medium
   * required: New command, like wanted, but for required content.
   * Removed dependency on haskell SHA library,
     instead using cryptohash >= 0.11.0.
+  * Make repo init more robust.
   * Windows: Renamed start menu file to avoid loop in some versions
     of Windows where the menu file is treated as a git-annex program.
   * Windows: Fixed support of remotes on other drives.

From b7be1680a72faaf35c5ff54eac5cc6500dccd42e Mon Sep 17 00:00:00 2001
From: Joey Hess 
Date: Mon, 20 Apr 2015 14:44:15 -0400
Subject: [PATCH 070/362] prep release

---
 debian/changelog | 4 ++--
 git-annex.cabal  | 2 +-
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/debian/changelog b/debian/changelog
index 2628369bc9..553e91cb2f 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,4 +1,4 @@
-git-annex (5.20150410) UNRELEASED; urgency=medium
+git-annex (5.20150420) unstable; urgency=medium
 
   * Fix activity log parsing, which caused the log to not retain
     activity from other uuids.
@@ -29,7 +29,7 @@ git-annex (5.20150410) UNRELEASED; urgency=medium
   * Windows: Bundled versions of rsync, wget, ssh, and gpg from
     cygwin all updated. Thanks, Yury V. Zaytsev.
 
- -- Joey Hess   Thu, 09 Apr 2015 20:59:43 -0400
+ -- Joey Hess   Mon, 20 Apr 2015 14:44:04 -0400
 
 git-annex (5.20150409) unstable; urgency=medium
 
diff --git a/git-annex.cabal b/git-annex.cabal
index 99601f2a3c..e49bb9a587 100644
--- a/git-annex.cabal
+++ b/git-annex.cabal
@@ -1,5 +1,5 @@
 Name: git-annex
-Version: 5.20150409
+Version: 5.20150420
 Cabal-Version: >= 1.8
 License: GPL-3
 Maintainer: Joey Hess 

From 38e03d5b3a8033f38810a2bf7801cb58a8def795 Mon Sep 17 00:00:00 2001
From: Yaroslav Halchenko 
Date: Mon, 20 Apr 2015 11:05:02 -0400
Subject: [PATCH 071/362] NF: debian/patches/*standalone-build for providing a
 standalone build of git-annex

---
 debian/patches/series.standalone-build |  1 +
 debian/patches/standalone-build        | 75 ++++++++++++++++++++++++++
 2 files changed, 76 insertions(+)
 create mode 100644 debian/patches/series.standalone-build
 create mode 100644 debian/patches/standalone-build

diff --git a/debian/patches/series.standalone-build b/debian/patches/series.standalone-build
new file mode 100644
index 0000000000..9dc994164d
--- /dev/null
+++ b/debian/patches/series.standalone-build
@@ -0,0 +1 @@
+standalone-build
diff --git a/debian/patches/standalone-build b/debian/patches/standalone-build
new file mode 100644
index 0000000000..68ab36989f
--- /dev/null
+++ b/debian/patches/standalone-build
@@ -0,0 +1,75 @@
+From: Yaroslav Halchenko 
+Subject: Patch debian/ to provide a standalone build of git-annex
+
+Origin: NeuroDebian
+Last-Update: 2015-04-20
+
+--- a/debian/control
++++ b/debian/control
+@@ -87,11 +87,13 @@ Vcs-Git: git://git.kitenet.net/git-annex
+ Homepage: http://git-annex.branchable.com/
+ XS-Testsuite: autopkgtest
+ 
+-Package: git-annex
++Package: git-annex-standalone
+ Architecture: any
+ Section: utils
+-Depends: ${misc:Depends}, ${shlibs:Depends},
+-	git (>= 1:1.8.1),
++Conflicts: git-annex
++Provides: git-annex
++Depends: ${misc:Depends},
++	git,
+ 	rsync,
+ 	wget,
+ 	curl,
+@@ -110,7 +112,7 @@ Suggests:
+ 	bup,
+ 	tahoe-lafs,
+ 	libnss-mdns,
+-Description: manage files with git, without checking their contents into git
++Description: manage files with git, without checking their contents into git -- standalone build
+  git-annex allows managing files with git, without checking the file
+  contents into git. While that may seem paradoxical, it is useful when
+  dealing with files larger than git can currently easily handle, whether due
+@@ -128,3 +130,7 @@ Description: manage files with git, with
+  noticing when files are changed, and automatically committing them
+  to git and transferring them to other computers. The git-annex webapp
+  makes it easy to set up and use git-annex this way.
++ .
++ This package provides a standalone bundle build of git-annex, which
++ should be installable on any more or less recent Debian or Ubuntu
++ release.
+--- /dev/null
++++ b/debian/install
+@@ -0,0 +1 @@
++tmp/git-annex.linux usr/lib
+--- /dev/null
++++ b/debian/links
+@@ -0,0 +1 @@
++/usr/lib/git-annex.linux/git-annex /usr/bin/git-annex
+--- /dev/null
++++ b/debian/manpages
+@@ -0,0 +1 @@
++debian/git-annex-standalone/usr/lib/git-annex.linux/usr/share/man/man1/git-annex*
+--- a/debian/rules
++++ b/debian/rules
+@@ -3,7 +3,17 @@
+ export CABAL=debian/cabal-wrapper
+ 
+ # Do use the changelog's version number, rather than making one up.
+-export RELEASE_BUILD=1
++export RELEASE_BUILD=0
+ 
+ %:
+ 	dh $@
++
++override_dh_auto_build:
++	make linuxstandalone
++
++override_dh_auto_install:
++	: # nothing to do, we just need to copy the beast, as instructed in debian/install
++
++override_dh_fixperms:
++	dh_fixperms -Xld-linux
++

From bfef0ba69fa9d2badcc48fa5747fff7fd57778ae Mon Sep 17 00:00:00 2001
From: Yaroslav Halchenko 
Date: Mon, 20 Apr 2015 11:29:32 -0400
Subject: [PATCH 072/362] NF: provide debian/rules build-standalone

---
 debian/create-standalone-changelog | 16 ++++++++++++++++
 debian/patches/standalone-build    | 15 ++++++---------
 debian/rules                       | 13 +++++++++++++
 3 files changed, 35 insertions(+), 9 deletions(-)
 create mode 100755 debian/create-standalone-changelog

diff --git a/debian/create-standalone-changelog b/debian/create-standalone-changelog
new file mode 100755
index 0000000000..250673bdc6
--- /dev/null
+++ b/debian/create-standalone-changelog
@@ -0,0 +1,16 @@
+#!/bin/bash
+#
+# A little helper script to build a package with standalone git-annex
+# It relies on being run within git-annex Git repository
+#
+set -eu
+
+umask 022
+
+git checkout debian/changelog
+
+ANNEX_VERSION=$(git describe HEAD)
+ANNEX_NDVERSION=$( echo ${ANNEX_VERSION} | sed -e 's,-,+git,' -e 's,$,-1~ndall+1,')
+
+dch --noconf -v ${ANNEX_NDVERSION} \
+    --force-bad-version --force-distribution -D neurodebian "Backported fresh snapshot"
diff --git a/debian/patches/standalone-build b/debian/patches/standalone-build
index 68ab36989f..81d94561b6 100644
--- a/debian/patches/standalone-build
+++ b/debian/patches/standalone-build
@@ -54,16 +54,10 @@ Last-Update: 2015-04-20
 +debian/git-annex-standalone/usr/lib/git-annex.linux/usr/share/man/man1/git-annex*
 --- a/debian/rules
 +++ b/debian/rules
-@@ -3,7 +3,17 @@
- export CABAL=debian/cabal-wrapper
+@@ -12,6 +12,15 @@ export RELEASE_BUILD=1
+ # Rules for providing a standalone build of annex.
+ #
  
- # Do use the changelog's version number, rather than making one up.
--export RELEASE_BUILD=1
-+export RELEASE_BUILD=0
- 
- %:
- 	dh $@
-+
 +override_dh_auto_build:
 +	make linuxstandalone
 +
@@ -73,3 +67,6 @@ Last-Update: 2015-04-20
 +override_dh_fixperms:
 +	dh_fixperms -Xld-linux
 +
+ build-standalone:
+ 	[ -e .git ]
+ 	git checkout debian/changelog
diff --git a/debian/rules b/debian/rules
index dab54a7b1f..75254c0792 100755
--- a/debian/rules
+++ b/debian/rules
@@ -7,3 +7,16 @@ export RELEASE_BUILD=1
 
 %:
 	dh $@
+
+#
+# Rules for providing a standalone build of annex.
+#
+
+build-standalone:
+	[ -e .git ]
+	git checkout debian/changelog
+	quilt pop -a || :
+	QUILT_SERIES=series.standalone-build quilt push -a
+	debian/create-standalone-changelog
+	dpkg-buildpackage -rfakeroot
+	quilt pop -a

From 92833a7e9907b212226533ca77f1472294747af2 Mon Sep 17 00:00:00 2001
From: Joey Hess 
Date: Mon, 20 Apr 2015 14:51:34 -0400
Subject: [PATCH 073/362] update to generate version in same format git-annex
 uses

---
 debian/create-standalone-changelog | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/debian/create-standalone-changelog b/debian/create-standalone-changelog
index 250673bdc6..d1e5bbf5ce 100755
--- a/debian/create-standalone-changelog
+++ b/debian/create-standalone-changelog
@@ -1,15 +1,16 @@
 #!/bin/bash
 #
 # A little helper script to build a package with standalone git-annex
-# It relies on being run within git-annex Git repository
+# It relies on being run within git-annex's git repository
 #
 set -eu
 
 umask 022
 
-git checkout debian/changelog
+# This is the same method that the configure script uses when git-annex is
+# built from git master.
+ANNEX_VERSION=$(git log -n 1 --format=format:'%ci %h'| sed -e 's/-//g' -e 's/ .* /-g/')
 
-ANNEX_VERSION=$(git describe HEAD)
 ANNEX_NDVERSION=$( echo ${ANNEX_VERSION} | sed -e 's,-,+git,' -e 's,$,-1~ndall+1,')
 
 dch --noconf -v ${ANNEX_NDVERSION} \

From bf0e8606179ebb424ca977ec11b3c8a56a1b9504 Mon Sep 17 00:00:00 2001
From: Joey Hess 
Date: Mon, 20 Apr 2015 14:53:14 -0400
Subject: [PATCH 074/362] changelog for
 https://github.com/joeyh/git-annex/pull/41

---
 debian/changelog | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/debian/changelog b/debian/changelog
index 553e91cb2f..eda96be460 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -22,6 +22,9 @@ git-annex (5.20150420) unstable; urgency=medium
   * Removed dependency on haskell SHA library,
     instead using cryptohash >= 0.11.0.
   * Make repo init more robust.
+  * New debian/rules build-standalone target, which generates a
+    git-annex-standalone.deb that should work on many old Debian etc
+    systems. Thanks, Yaroslav Halchenko.
   * Windows: Renamed start menu file to avoid loop in some versions
     of Windows where the menu file is treated as a git-annex program.
   * Windows: Fixed support of remotes on other drives.

From 5e347db6e5831ced1e118773235a7709327a0b67 Mon Sep 17 00:00:00 2001
From: Joey Hess 
Date: Mon, 20 Apr 2015 14:53:52 -0400
Subject: [PATCH 075/362] close

---
 doc/todo/git-annex-standalone_Debian_package.mdwn | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/doc/todo/git-annex-standalone_Debian_package.mdwn b/doc/todo/git-annex-standalone_Debian_package.mdwn
index 0172e1e72e..e45a728436 100644
--- a/doc/todo/git-annex-standalone_Debian_package.mdwn
+++ b/doc/todo/git-annex-standalone_Debian_package.mdwn
@@ -1 +1,3 @@
 As proposed with a sketch in https://github.com/joeyh/git-annex/pull/39, for DataLad we would need to get recent annex on older Debian/Ubuntu releases to get our testing farm and perspective users equipped with bleeding edge annex
+
+> merged [[done]] --[[Joey]]

From b0ebb232ecee1b512cde8db8bb587052cd8a195a Mon Sep 17 00:00:00 2001
From: Joey Hess 
Date: Mon, 20 Apr 2015 14:55:30 -0400
Subject: [PATCH 076/362] style changes

---
 debian/rules | 9 +++------
 1 file changed, 3 insertions(+), 6 deletions(-)

diff --git a/debian/rules b/debian/rules
index 75254c0792..0105f94db6 100755
--- a/debian/rules
+++ b/debian/rules
@@ -8,14 +8,11 @@ export RELEASE_BUILD=1
 %:
 	dh $@
 
-#
-# Rules for providing a standalone build of annex.
-#
-
+# Run this target to build git-annex-standalone.deb
 build-standalone:
-	[ -e .git ]
+	test -e .git
 	git checkout debian/changelog
-	quilt pop -a || :
+	quilt pop -a || true
 	QUILT_SERIES=series.standalone-build quilt push -a
 	debian/create-standalone-changelog
 	dpkg-buildpackage -rfakeroot

From a14040e9472200ece16b8cb0d5649bd1c492fa59 Mon Sep 17 00:00:00 2001
From: Joey Hess 
Date: Mon, 20 Apr 2015 15:33:13 -0400
Subject: [PATCH 077/362] avoid needing mingw to build on windows

It was only used for its shell;  cygwin has a shell.
---
 build.bat                | 2 +-
 doc/install/Windows.mdwn | 5 ++++-
 2 files changed, 5 insertions(+), 2 deletions(-)

diff --git a/build.bat b/build.bat
index 66a7e1f06d..52d03e0e24 100644
--- a/build.bat
+++ b/build.bat
@@ -1 +1 @@
-C:\MINGW\MSYS\1.0\BIN\SH.EXE standalone/windows/build-simple.sh
+C:\CYGWIN\BIN\SH.EXE standalone/windows/build-simple.sh
diff --git a/doc/install/Windows.mdwn b/doc/install/Windows.mdwn
index 5080fc9cbf..3d4b7a0731 100644
--- a/doc/install/Windows.mdwn
+++ b/doc/install/Windows.mdwn
@@ -25,7 +25,7 @@ A daily build is also available, thanks to Yury V. Zaytsev and
 ## building it yourself
 
 To build git-annex from source on Windows, you need to install
-the Haskell Platform, Mingw, and Cygwin. Use Cygwin to install:
+the Haskell Platform and Cygwin. Use Cygwin to install these packages:
 gcc rsync git wget ssh gnupg
 
 Once the prerequisites are installed, run:
@@ -35,5 +35,8 @@ Once the prerequisites are installed, run:
 	cd gitannex
 	build
 
+Note that git from Cygwin is able to clone git-annex's git repository;
+Msysgit cannot due to some characters in filenames.
+
 (To build the git-annex installer, you also need to install the NullSoft
 installer system.)

From 463bdd9e22e2cf52cec9d8fcb8fc774e106666e5 Mon Sep 17 00:00:00 2001
From: Joey Hess 
Date: Mon, 20 Apr 2015 15:54:24 -0400
Subject: [PATCH 078/362] fix whatis section (hack)

---
 Build/mdwn2man | 1 +
 1 file changed, 1 insertion(+)

diff --git a/Build/mdwn2man b/Build/mdwn2man
index a29ce649e7..df6e34e571 100755
--- a/Build/mdwn2man
+++ b/Build/mdwn2man
@@ -20,6 +20,7 @@ while (<>) {
 	s/^[ \n]+//;
 	s/^\t/ /;
 	s/-/\\-/g;
+	s/git\-annex/git-annex/g;
 	s/^Warning:.*//g;
 	s/^$/.PP\n/;
 	s/^\*\s+(.*)/.IP "$1"/;

From e651b29e9070a3df3570d8e81e8dd23871e27627 Mon Sep 17 00:00:00 2001
From: Joey Hess 
Date: Mon, 20 Apr 2015 15:56:28 -0400
Subject: [PATCH 079/362] reuse Build.Version to generate version

---
 Build/Version.hs                   | 3 +++
 debian/create-standalone-changelog | 2 +-
 2 files changed, 4 insertions(+), 1 deletion(-)

diff --git a/Build/Version.hs b/Build/Version.hs
index da9d1bbcba..82cca034f6 100644
--- a/Build/Version.hs
+++ b/Build/Version.hs
@@ -67,3 +67,6 @@ cabalSetup cabalfile = do
 		| otherwise = s
 	  where
 		fullfield = field ++ ": "
+
+main :: IO ()
+main = putStr =<< getVersion
diff --git a/debian/create-standalone-changelog b/debian/create-standalone-changelog
index d1e5bbf5ce..40b0c69644 100755
--- a/debian/create-standalone-changelog
+++ b/debian/create-standalone-changelog
@@ -9,7 +9,7 @@ umask 022
 
 # This is the same method that the configure script uses when git-annex is
 # built from git master.
-ANNEX_VERSION=$(git log -n 1 --format=format:'%ci %h'| sed -e 's/-//g' -e 's/ .* /-g/')
+ANNEX_VERSION=$(runghc Build/Version.hs)
 
 ANNEX_NDVERSION=$( echo ${ANNEX_VERSION} | sed -e 's,-,+git,' -e 's,$,-1~ndall+1,')
 

From b79a3332ae0c849e6b9965ca5c2ea9c24fe4614e Mon Sep 17 00:00:00 2001
From: Joey Hess 
Date: Mon, 20 Apr 2015 16:04:09 -0400
Subject: [PATCH 080/362] typo

---
 Build/mdwn2man | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Build/mdwn2man b/Build/mdwn2man
index df6e34e571..7ad0d889bf 100755
--- a/Build/mdwn2man
+++ b/Build/mdwn2man
@@ -20,7 +20,7 @@ while (<>) {
 	s/^[ \n]+//;
 	s/^\t/ /;
 	s/-/\\-/g;
-	s/git\-annex/git-annex/g;
+	s/git\\-annex/git-annex/g;
 	s/^Warning:.*//g;
 	s/^$/.PP\n/;
 	s/^\*\s+(.*)/.IP "$1"/;

From 015b2ed83bb7df0280979300ce23f6301de52adf Mon Sep 17 00:00:00 2001
From: Joey Hess 
Date: Mon, 20 Apr 2015 16:06:42 -0400
Subject: [PATCH 081/362] add news item for git-annex 5.20150420

---
 doc/news/version_5.20150317.mdwn | 45 --------------------------------
 doc/news/version_5.20150420.mdwn | 33 +++++++++++++++++++++++
 2 files changed, 33 insertions(+), 45 deletions(-)
 delete mode 100644 doc/news/version_5.20150317.mdwn
 create mode 100644 doc/news/version_5.20150420.mdwn

diff --git a/doc/news/version_5.20150317.mdwn b/doc/news/version_5.20150317.mdwn
deleted file mode 100644
index fb889413b3..0000000000
--- a/doc/news/version_5.20150317.mdwn
+++ /dev/null
@@ -1,45 +0,0 @@
-git-annex 5.20150317 released with [[!toggle text="these changes"]]
-[[!toggleable text="""
-   * fsck: Incremental fsck uses sqlite to store its records, instead
-     of abusing the sticky bit. Existing sticky bits are ignored;
-     incremental fscks started by old versions won't be resumed by
-     this version.
-   * fsck: Multiple incremental fscks of different repos (including remotes)
-     can now be running at the same time in the same repo without it
-     getting confused about which files have been checked for which remotes.
-   * unannex: Refuse to unannex when repo is too new to have a HEAD,
-     since in this case there must be staged changes in the index
-     (if there is anything to unannex), and the unannex code path
-     needs to run with a clean index.
-   * Linux standalone: Set LOCPATH=/dev/null to work around
-     https://ghc.haskell.org/trac/ghc/ticket/7695
-     This prevents localization from working, but git-annex
-     is not localized anyway.
-   * sync: As well as the synced/git-annex push, attempt a
-     git-annex:git-annex push, as long as the remote branch
-     is an ancestor of the local branch, to better support bare git repos.
-     (This used to be done, but it forgot to do it since version 4.20130909.)
-   * When re-execing git-annex, use current program location, rather than
-     ~/.config/git-annex/program, when possible.
-   * Submodules are now supported by git-annex!
-   * metadata: Fix encoding problem that led to mojibake when storing
-     metadata strings that contained both unicode characters and a space
-     (or '!') character.
-   * Also potentially fixes encoding problem when embedding credentials
-     that contain unicode characters.
-   * sync: Fix committing when in a direct mode repo that has no HEAD ref.
-     (For example, a newly checked out git submodule.)
-   * Added SETURIPRESENT and SETURIMISSING to external special remote protocol,
-     useful for things like ipfs that don't use regular urls.
-   * addurl: Added --raw option, which bypasses special handling of quvi,
-     bittorrent etc urls.
-   * git-annex-shell: Improve error message when the specified repository
-     doesn't exist or git config fails for some reason.
-   * fromkey --force: Skip test that the key has its content in the annex.
-   * fromkey: Add stdin mode.
-   * registerurl: New plumbing command for mass-adding urls to keys.
-   * remotedaemon: Fixed support for notifications of changes to gcrypt
-     remotes, which was never tested and didn't quite work before."""]]
-
-Update: The OSX build for this release was missing the webapp. An updated
-build is now available fixing that problem.
diff --git a/doc/news/version_5.20150420.mdwn b/doc/news/version_5.20150420.mdwn
new file mode 100644
index 0000000000..e084735c4a
--- /dev/null
+++ b/doc/news/version_5.20150420.mdwn
@@ -0,0 +1,33 @@
+git-annex 5.20150420 released with [[!toggle text="these changes"]]
+[[!toggleable text="""
+   * Fix activity log parsing, which caused the log to not retain
+     activity from other uuids.
+   * Union merge could fall over if there was a file in the repository
+     with the same name as a git ref. Now fixed.
+   * info dir: Added information about repositories that
+     contain files in the specified directory.
+   * info: Added --bytes option.
+   * bittorrent: Fix handling of magnet links.
+   * When a key's size is unknown, still check the annex.diskreserve,
+     and avoid getting content if the disk is too full.
+   * Fix fsck --from a git remote in a local directory, and from
+     a directory special remote.
+     This was a reversion caused by the relative path changes in 5.20150113.
+   * fsck --from remote: When bad content is found in the remote,
+     and the local repo does not have a copy of the content, preserve
+     the bad content in .git/annex/bad/ to avoid further data loss.
+   * fsck --from remote: Avoid downloading a key if it would go over
+     the annex.diskreserve limit.
+   * required: New command, like wanted, but for required content.
+   * Removed dependency on haskell SHA library,
+     instead using cryptohash >= 0.11.0.
+   * Make repo init more robust.
+   * New debian/rules build-standalone target, which generates a
+     git-annex-standalone.deb that should work on many old Debian etc
+     systems. Thanks, Yaroslav Halchenko.
+   * Windows: Renamed start menu file to avoid loop in some versions
+     of Windows where the menu file is treated as a git-annex program.
+   * Windows: Fixed support of remotes on other drives.
+     (A reversion introduced in version 5.20150113.)
+   * Windows: Bundled versions of rsync, wget, ssh, and gpg from
+     cygwin all updated. Thanks, Yury V. Zaytsev."""]]
\ No newline at end of file

From cd2541f729eebc244595be1fe6ab871b2375c6d2 Mon Sep 17 00:00:00 2001
From: Joey Hess 
Date: Mon, 20 Apr 2015 16:08:12 -0400
Subject: [PATCH 082/362] fix

---
 Build/DistributionUpdate.hs | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Build/DistributionUpdate.hs b/Build/DistributionUpdate.hs
index 37b8e04aaa..c34a86bede 100644
--- a/Build/DistributionUpdate.hs
+++ b/Build/DistributionUpdate.hs
@@ -10,7 +10,7 @@
 
 import Common.Annex
 import Types.Distribution
-import Build.Version
+import Build.Version (getChangelogVersion)
 import Utility.UserInfo
 import Utility.Url
 import qualified Git.Construct

From 2cb8fc5fee5abcf46d5bff38339b936986c33dbf Mon Sep 17 00:00:00 2001
From: Joey Hess 
Date: Mon, 20 Apr 2015 16:09:24 -0400
Subject: [PATCH 083/362] another fix

---
 Build/DistributionUpdate.hs | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Build/DistributionUpdate.hs b/Build/DistributionUpdate.hs
index c34a86bede..da1202fe2b 100644
--- a/Build/DistributionUpdate.hs
+++ b/Build/DistributionUpdate.hs
@@ -10,7 +10,7 @@
 
 import Common.Annex
 import Types.Distribution
-import Build.Version (getChangelogVersion)
+import Build.Version (getChangelogVersion, Version)
 import Utility.UserInfo
 import Utility.Url
 import qualified Git.Construct

From 5a249144eae2cecab6f04d0ed764d60f7b07d67f Mon Sep 17 00:00:00 2001
From: Joey Hess 
Date: Mon, 20 Apr 2015 18:56:01 -0400
Subject: [PATCH 084/362] devblog

---
 doc/devblog/day_278__release_day.mdwn | 25 +++++++++++++++++++++++++
 1 file changed, 25 insertions(+)
 create mode 100644 doc/devblog/day_278__release_day.mdwn

diff --git a/doc/devblog/day_278__release_day.mdwn b/doc/devblog/day_278__release_day.mdwn
new file mode 100644
index 0000000000..22870d16e4
--- /dev/null
+++ b/doc/devblog/day_278__release_day.mdwn
@@ -0,0 +1,25 @@
+I hope that today's git-annex release will be landing in Debian unstable
+toward the end of the month. And I'm looking forward to some changes that
+have been blocked by wanting to keep git-annex buildable on Debian 7.
+
+Yesterday I got rid of the [SHA](http://hackage.haskell.org/package/SHA/)
+dependency, switching git-annex to use a newer version of cryptohash for
+HMAC generation (which its author Vincent Hanquez kindly added to it when I
+requested it, waay back in 2013). I'm considering using the LambdaCase
+extension to clean up a lot of the code next, and there are 500+ lines of
+old yesod compatability code I can eventually remove.
+
+These changes and others will prevent backporting to the soon to be Debian
+oldstable, but the standalone tarball will still work there. And, the
+git-annex-standalone.deb that can be installed on any version of Debian is
+[now available from the NeuroDebian repository](http://neuro.debian.net/install_pkg.html?p=git-annex-standalone),
+and its build support has been merged into the source tree.
+
+In the run up to the release today, I also dealt with getting the
+Windows build tested and working, now that it's been updated to newer
+versions of rsync, ssh, etc from Cygwin. Had to add several more dlls to
+the installer. That testing also turned up a case where `git-annex init`
+could fail, which got a last-minute fix.
+
+PS, scroll down [this 10 year of git timeline](http://neuro.debian.net/install_pkg.html?p=git-annex-standalone)
+and see what you find!

From 7d54c2f0dbd75c711269689621c1ff5012eeed3a Mon Sep 17 00:00:00 2001
From: Joey Hess 
Date: Mon, 20 Apr 2015 19:00:07 -0400
Subject: [PATCH 085/362] fix link

---
 doc/devblog/day_278__release_day.mdwn | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/doc/devblog/day_278__release_day.mdwn b/doc/devblog/day_278__release_day.mdwn
index 22870d16e4..22d637c89e 100644
--- a/doc/devblog/day_278__release_day.mdwn
+++ b/doc/devblog/day_278__release_day.mdwn
@@ -21,5 +21,5 @@ versions of rsync, ssh, etc from Cygwin. Had to add several more dlls to
 the installer. That testing also turned up a case where `git-annex init`
 could fail, which got a last-minute fix.
 
-PS, scroll down [this 10 year of git timeline](http://neuro.debian.net/install_pkg.html?p=git-annex-standalone)
+PS, scroll down [this 10 year of git timeline](https://www.atlassian.com/git/articles/10-years-of-git/)
 and see what you find!

From d2ba5fb5065716ad6cc03159acadc6d0b3cca637 Mon Sep 17 00:00:00 2001
From: Joey Hess 
Date: Tue, 21 Apr 2015 01:01:16 -0400
Subject: [PATCH 086/362] fix windows simple build script

---
 build.bat                          | 2 +-
 standalone/windows/build-simple.sh | 6 +++---
 2 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/build.bat b/build.bat
index 52d03e0e24..268a02835a 100644
--- a/build.bat
+++ b/build.bat
@@ -1 +1 @@
-C:\CYGWIN\BIN\SH.EXE standalone/windows/build-simple.sh
+SH.EXE standalone/windows/build-simple.sh
diff --git a/standalone/windows/build-simple.sh b/standalone/windows/build-simple.sh
index ade21ce6da..2c9aeb9152 100755
--- a/standalone/windows/build-simple.sh
+++ b/standalone/windows/build-simple.sh
@@ -4,10 +4,10 @@
 set -e
 set -x
 
-# Path to the Haskell Platform.
-HP="/c/Program Files/Haskell Platform/2013.2.0.0"
+# Path to the Haskell Platform. (As mingw sh sees it)
+HP="/c/Program Files/Haskell Platform/2014.2.0.0"
 
-PATH="$HP/bin:$HP/lib/extralibs/bin:$PATH"
+PATH="$HP/bin:$HP/mingw/bin:$HP/lib/extralibs/bin:$PATH"
 
 # Run a command with the cygwin environment available.
 # However, programs not from cygwin are preferred.

From 552ed5433f3d8af37d1d5ca5419a6ae38972f9cf Mon Sep 17 00:00:00 2001
From: Joey Hess 
Date: Tue, 21 Apr 2015 01:28:47 -0400
Subject: [PATCH 087/362] add NSIS to path

---
 standalone/windows/build-simple.sh | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/standalone/windows/build-simple.sh b/standalone/windows/build-simple.sh
index 2c9aeb9152..ea1b2660ae 100755
--- a/standalone/windows/build-simple.sh
+++ b/standalone/windows/build-simple.sh
@@ -7,7 +7,7 @@ set -x
 # Path to the Haskell Platform. (As mingw sh sees it)
 HP="/c/Program Files/Haskell Platform/2014.2.0.0"
 
-PATH="$HP/bin:$HP/mingw/bin:$HP/lib/extralibs/bin:$PATH"
+PATH="$HP/bin:$HP/mingw/bin:$HP/lib/extralibs/bin:/c/Program Files/NSIS:$PATH"
 
 # Run a command with the cygwin environment available.
 # However, programs not from cygwin are preferred.

From 26e1969147ebe29fb5892880ddf1a702c175ea92 Mon Sep 17 00:00:00 2001
From: 
 "https://www.google.com/accounts/o8/id?id=AItOawkonqAD8cq3RsaNrAuWUraueNaACA-Gjgw"
 
Date: Tue, 21 Apr 2015 12:55:30 +0000
Subject: [PATCH 088/362] Port git-core has been renamed to git.

---
 doc/install/OSX/MacPorts.mdwn | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/doc/install/OSX/MacPorts.mdwn b/doc/install/OSX/MacPorts.mdwn
index 379e42d12a..dd6db8b0eb 100644
--- a/doc/install/OSX/MacPorts.mdwn
+++ b/doc/install/OSX/MacPorts.mdwn
@@ -8,7 +8,7 @@ The version provided by Macports is too old to work with current versions of git
 Then execute
 
 
-sudo port install git-core ossp-uuid md5sha1sum coreutils gnutls libxml2 libgsasl pkgconfig
+sudo port install git ossp-uuid md5sha1sum coreutils gnutls libxml2 libgsasl pkgconfig
 sudo cabal update
 PATH=$HOME/bin:$PATH
 cabal install c2hs git-annex --bindir=$HOME/bin

From 140cb56b2e56b2e5962b44dbc759fb6a9b807ada Mon Sep 17 00:00:00 2001
From: Joey Hess 
Date: Tue, 21 Apr 2015 13:59:04 -0400
Subject: [PATCH 089/362] add msysgit to PATH, before cyg git

---
 standalone/windows/build-simple.sh | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/standalone/windows/build-simple.sh b/standalone/windows/build-simple.sh
index ea1b2660ae..bb63b4fa20 100755
--- a/standalone/windows/build-simple.sh
+++ b/standalone/windows/build-simple.sh
@@ -7,7 +7,7 @@ set -x
 # Path to the Haskell Platform. (As mingw sh sees it)
 HP="/c/Program Files/Haskell Platform/2014.2.0.0"
 
-PATH="$HP/bin:$HP/mingw/bin:$HP/lib/extralibs/bin:/c/Program Files/NSIS:$PATH"
+PATH="$HP/bin:$HP/mingw/bin:$HP/lib/extralibs/bin:/c/Program Files/Git/cmd:/c/Program Files/NSIS:$PATH"
 
 # Run a command with the cygwin environment available.
 # However, programs not from cygwin are preferred.

From e5060706460f24fb31cacfd58c141aa24a965968 Mon Sep 17 00:00:00 2001
From: Joey Hess 
Date: Tue, 21 Apr 2015 14:10:30 -0400
Subject: [PATCH 090/362] avoid cabal update every time

---
 standalone/windows/build-simple.sh | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/standalone/windows/build-simple.sh b/standalone/windows/build-simple.sh
index bb63b4fa20..9b26e51899 100755
--- a/standalone/windows/build-simple.sh
+++ b/standalone/windows/build-simple.sh
@@ -21,8 +21,10 @@ withcygpreferred () {
 # Install haskell dependencies.
 # cabal install is not run in cygwin, because we don't want configure scripts
 # for haskell libraries to link them with the cygwin library.
-cabal update || true
-cabal install --only-dependencies || true
+if ! cabal install --only-dependencies; then
+	cabal update || true
+	cabal install --only-dependencies
+fi
 
 # Build git-annex
 if [ ! -e "dist/setup-config" ]; then

From 6b956c86785b75e0442e69d354fdc44d33da5564 Mon Sep 17 00:00:00 2001
From: Joey Hess 
Date: Tue, 21 Apr 2015 14:11:06 -0400
Subject: [PATCH 091/362] let build.bat also be run from cygwin terminal

---
 build.bat | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/build.bat b/build.bat
index 268a02835a..c2ccfac5fb 100644
--- a/build.bat
+++ b/build.bat
@@ -1 +1 @@
-SH.EXE standalone/windows/build-simple.sh
+sh standalone/windows/build-simple.sh

From cd4fb498a72a2f70eed085f4bccf38f1f48a8dfa Mon Sep 17 00:00:00 2001
From: Joey Hess 
Date: Tue, 21 Apr 2015 14:24:28 -0400
Subject: [PATCH 092/362] use cygwin ldd to find dlls to include, instead of
 manually listing

---
 Build/NullSoftInstaller.hs | 70 ++++++++++----------------------------
 1 file changed, 18 insertions(+), 52 deletions(-)

diff --git a/Build/NullSoftInstaller.hs b/Build/NullSoftInstaller.hs
index bf0875e2c6..75591aaa39 100644
--- a/Build/NullSoftInstaller.hs
+++ b/Build/NullSoftInstaller.hs
@@ -1,7 +1,8 @@
 {- Generates a NullSoft installer program for git-annex on Windows.
  - 
  - To build the installer, git-annex should already be built by cabal,
- - and ssh and rsync, as well as cygwin libraries, already installed.
+ - and ssh and rsync etc, as well as cygwin libraries, already installed
+ - from cygwin.
  -
  - This uses the Haskell nsis package (cabal install nsis)
  - to generate a .nsi file, which is then used to produce
@@ -11,7 +12,7 @@
  - exception of git. The user needs to install git separately,
  - and the installer checks for that.
  -
- - Copyright 2013 Joey Hess 
+ - Copyright 2013-2015 Joey Hess 
  -
  - Licensed under the GNU GPL version 3 or higher.
  -}
@@ -22,13 +23,17 @@ import Development.NSIS
 import System.Directory
 import System.FilePath
 import Control.Monad
+import Control.Applicative
 import Data.String
 import Data.Maybe
+import Data.Char
+import Data.List (nub)
 
 import Utility.Tmp
 import Utility.Path
 import Utility.CopyFile
 import Utility.SafeCommand
+import Utility.Process
 import Build.BundledPrograms
 
 main = do
@@ -37,17 +42,19 @@ main = do
 		mustSucceed "ln" [File "dist/build/git-annex/git-annex.exe", File gitannex]
 		let license = tmpdir  licensefile
 		mustSucceed "sh" [Param "-c", Param $ "zcat standalone/licences.gz > '" ++ license ++ "'"]
-		extrabins <- forM (cygwinPrograms ++ cygwinDlls) $ \f -> do
+		extrabins <- forM (cygwinPrograms) $ \f -> do
 			p <- searchPath f
 			when (isNothing p) $
 				print ("unable to find in PATH", f)
 			return p
+		dlls <- forM (catMaybes extrabins) findLibs
+		dllpaths <- mapM searchPath (nub (concat dlls))
 		webappscript <- vbsLauncher tmpdir "git-annex-webapp" "git-annex webapp"
 		autostartscript <- vbsLauncher tmpdir "git-annex-autostart" "git annex assistant --autostart"
 		let htmlhelp = tmpdir  "git-annex.html"
 		writeFile htmlhelp htmlHelpText
 		writeFile nsifile $ makeInstaller gitannex license htmlhelp
-			(catMaybes extrabins)
+			(catMaybes (extrabins ++ dllpaths))
 			[ webappscript, autostartscript ]
 		mustSucceed "makensis" [File nsifile]
 	removeFile nsifile -- left behind if makensis fails
@@ -169,54 +176,6 @@ makeInstaller gitannex license htmlhelp extrabins launchers = nsis $ do
 cygwinPrograms :: [FilePath]
 cygwinPrograms = map (\p -> p ++ ".exe") bundledPrograms
 
--- These are the dlls needed by Cygwin's rsync, ssh, etc.
--- TODO: Use ldd (available in cygwin) to automatically find all
--- needed libs.
-cygwinDlls :: [FilePath]
-cygwinDlls =
-	[ "cygwin1.dll"
-	, "cygasn1-8.dll"
-	, "cygattr-1.dll"
-	, "cygheimbase-1.dll"
-	, "cygroken-18.dll"
-	, "cygcom_err-2.dll"
-	, "cygheimntlm-0.dll"
-	, "cygsqlite3-0.dll"
-	, "cygcrypt-0.dll"
-	, "cyghx509-5.dll"
-	, "cygssp-0.dll"
-	, "cygcrypto-1.0.0.dll"
-	, "cygiconv-2.dll"
-	, "cyggcc_s-1.dll"
-	, "cygintl-8.dll"
-	, "cygwind-0.dll"
-	, "cyggssapi-3.dll"
-	, "cyggssapi_krb5-2.dll"
-	, "cygkrb5-26.dll"
-	, "cygz.dll"
-	, "cygidn-11.dll"
-	, "cyggnutls-28.dll"
-	, "libcrypto.dll"
-	, "libssl.dll"
-	, "cyggcrypt-11.dll"
-	, "cyggpg-error-0.dll"
-	, "cygp11-kit-0.dll"
-	, "cygffi-6.dll"
-	, "cygbz2-1.dll"
-	, "cygreadline7.dll"
-	, "cygncursesw-10.dll"
-	, "cygusb0.dll"
-	, "cyghogweed-2.dll"
-	, "cygk5crypto-3.dll"
-	, "cygkrb5support-0.dll"
-	, "cyggmp-10.dll"
-	, "cygkrb5-3.dll"
-	, "cygnettle-4.dll"
-	, "cygtasn1-6.dll"
-	, "cygpcre-1.dll"
-	, "cyguuid-1.dll"
-	]
-
 -- msysgit opens Program Files/Git/doc/git/html/git-annex.html
 -- when git annex --help is run.
 htmlHelpText :: String
@@ -229,3 +188,10 @@ htmlHelpText = unlines
 	, ""
 	, " IO [FilePath]
+findLibs p = mapMaybe parse . lines <$> readProcess "ldd" [p]
+  where
+	parse l = case words (dropWhile isSpace l) of
+		(dll:"=>":_dllpath:_offset:[]) -> Just dll
+		_ -> Nothing

From 611b0483ee641322471bc73bb8ea2007e9f94aaf Mon Sep 17 00:00:00 2001
From: Joey Hess 
Date: Tue, 21 Apr 2015 15:08:48 -0400
Subject: [PATCH 093/362] mention gitlab

---
 doc/tips/centralized_git_repository_tutorial.mdwn | 12 +++++++-----
 1 file changed, 7 insertions(+), 5 deletions(-)

diff --git a/doc/tips/centralized_git_repository_tutorial.mdwn b/doc/tips/centralized_git_repository_tutorial.mdwn
index 8088e7d23c..9f2d15cb40 100644
--- a/doc/tips/centralized_git_repository_tutorial.mdwn
+++ b/doc/tips/centralized_git_repository_tutorial.mdwn
@@ -1,13 +1,13 @@
 The [[walkthrough]] builds up a decentralized git repository setup, but
 git-annex can also be used with a centralized bare repository, just like
 git can. This tutorial shows how to set up a centralized repository hosted on
-GitHub.
+GitHub on GitLab or your own git server.
 
 ## set up the repository, and make a checkout
 
 I've created a repository for technical talk videos, which you can
 [fork on Github](https://github.com/joeyh/techtalks).
-Or make your own repository on GitHub (or elsewhere) now.
+Or make your own repository on GitHub (or GitLab elsewhere) now.
 
 On your laptop, [[install]] git-annex, and clone the repository:
 
@@ -21,12 +21,14 @@ located:
 	init my laptop ok
 
 Let's tell git-annex that GitHub doesn't support running git-annex-shell there.
+
+	# git config remote.origin.annex-ignore true
+
 This means you can't store annexed file *contents* on GitHub; it would
 really be better to host the bare repository on your own server, which
 would not have this limitation. (If you want to do that, check out
-[[using_gitolite_with_git-annex]].)
-
-	# git config remote.origin.annex-ignore true
+[[using_gitolite_with_git-annex]].) Or, you could use GitLab, which
+*does* [support git-annex on their servers](https://about.gitlab.com/2015/02/17/gitlab-annex-solves-the-problem-of-versioning-large-binaries-with-git/).
 
 ## add files to the repository
 

From a7c35d696158d0e40f15ebc5d04f7e1114cc800b Mon Sep 17 00:00:00 2001
From: Joey Hess 
Date: Tue, 21 Apr 2015 15:11:59 -0400
Subject: [PATCH 094/362] update to work better with git's change to not push
 matching branches by default

---
 doc/tips/centralized_git_repository_tutorial.mdwn | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/doc/tips/centralized_git_repository_tutorial.mdwn b/doc/tips/centralized_git_repository_tutorial.mdwn
index 9f2d15cb40..e646ed0eee 100644
--- a/doc/tips/centralized_git_repository_tutorial.mdwn
+++ b/doc/tips/centralized_git_repository_tutorial.mdwn
@@ -55,9 +55,9 @@ Feel free to rename the files, etc, using normal git commands:
 	# git mv kitenet.net_~joey_screencasts_git-annex_coding_in_haskell.ogg git-annex_coding_in_haskell.ogg
 	# git commit -m 'better filenames'
 
-Now push your changes back to the central repository. This first time,
-remember to push the git-annex branch, which is used to track the file
-contents.
+Now push your changes back to the central repository. As well as pushing
+the master branch, remember to push the git-annex branch, which is used to
+track the file contents.
 
 	# git push origin master git-annex
 	To git@github.com:joeyh/techtalks.git
@@ -128,7 +128,7 @@ desired.
 After you use git-annex to move files around, remember to push, 
 which will broadcast its updated location information.
 
-	# git push
+	# git push origin master git-annex
 
 ## take it farther
 

From 3b3aaf0d56e86089aa37b14309ee80212580ef54 Mon Sep 17 00:00:00 2001
From: Joey Hess 
Date: Tue, 21 Apr 2015 15:55:42 -0400
Subject: [PATCH 095/362] S3: Enable debug logging when annex.debug or --debug
 is set.

To debug a bug report, but generally useful.
---
 Remote/S3.hs                                   | 11 ++++++++---
 debian/changelog                               |  6 ++++++
 ...1_533c4a26200501486a9ec103e1301391._comment | 18 ++++++++++++++++++
 3 files changed, 32 insertions(+), 3 deletions(-)
 create mode 100644 doc/bugs/Can__39__t_get_content_from_S3_with_s3-aws_library/comment_1_533c4a26200501486a9ec103e1301391._comment

diff --git a/Remote/S3.hs b/Remote/S3.hs
index b0c1de1144..06aa79d656 100644
--- a/Remote/S3.hs
+++ b/Remote/S3.hs
@@ -28,6 +28,7 @@ import Control.Monad.Trans.Resource
 import Control.Monad.Catch
 import Data.Conduit
 import Data.IORef
+import System.Log.Logger
 
 import Common.Annex
 import Types.Remote
@@ -149,7 +150,7 @@ s3Setup' u mcreds c = if configIA c then archiveorg else defaulthost
 			writeUUIDFile archiveconfig u
 		use archiveconfig
 
--- Sets up a http connection manager for S3 encdpoint, which allows
+-- Sets up a http connection manager for S3 endpoint, which allows
 -- http connections to be reused across calls to the helper.
 prepareS3 :: Remote -> S3Info -> (S3Handle -> helper) -> Preparer helper
 prepareS3 r info = resourcePrepare $ const $
@@ -388,13 +389,13 @@ sendS3Handle'
 	=> S3Handle
 	-> r
 	-> ResourceT IO a
-sendS3Handle' h = AWS.pureAws (hawscfg h) (hs3cfg h) (hmanager h)
+sendS3Handle' h r = AWS.pureAws (hawscfg h) (hs3cfg h) (hmanager h) r
 
 withS3Handle :: RemoteConfig -> UUID -> S3Info -> (S3Handle -> Annex a) -> Annex a
 withS3Handle c u info a = do
 	creds <- getRemoteCredPairFor "S3" c (AWS.creds u)
 	awscreds <- liftIO $ genCredentials $ fromMaybe nocreds creds
-	let awscfg = AWS.Configuration AWS.Timestamp awscreds (AWS.defaultLog AWS.Error)
+	let awscfg = AWS.Configuration AWS.Timestamp awscreds debugMapper
 	bracketIO (newManager httpcfg) closeManager $ \mgr -> 
 		a $ S3Handle mgr awscfg s3cfg info
   where
@@ -518,3 +519,7 @@ genCredentials (keyid, secret) = AWS.Credentials
 mkLocationConstraint :: AWS.Region -> S3.LocationConstraint
 mkLocationConstraint "US" = S3.locationUsClassic
 mkLocationConstraint r = r
+
+debugMapper :: AWS.Logger
+debugMapper AWS.Debug t = debugM "S3" (T.unpack t)
+debugMapper _ _ = noop
diff --git a/debian/changelog b/debian/changelog
index eda96be460..ad08554d8e 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,9 @@
+git-annex (5.20150421) UNRELEASED; urgency=medium
+
+  * S3: Enable debug logging when annex.debug or --debug is set.
+
+ -- Joey Hess   Tue, 21 Apr 2015 15:54:10 -0400
+
 git-annex (5.20150420) unstable; urgency=medium
 
   * Fix activity log parsing, which caused the log to not retain
diff --git a/doc/bugs/Can__39__t_get_content_from_S3_with_s3-aws_library/comment_1_533c4a26200501486a9ec103e1301391._comment b/doc/bugs/Can__39__t_get_content_from_S3_with_s3-aws_library/comment_1_533c4a26200501486a9ec103e1301391._comment
new file mode 100644
index 0000000000..8921214a92
--- /dev/null
+++ b/doc/bugs/Can__39__t_get_content_from_S3_with_s3-aws_library/comment_1_533c4a26200501486a9ec103e1301391._comment
@@ -0,0 +1,18 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 1"""
+ date="2015-04-21T19:23:18Z"
+ content="""
+So the http 301 redirect seems to be the relevant clue.
+
+Perhaps the old S3 library followed such redirects and the new aws library
+does not. Although AFAICS, http-client should follow redirects by default.
+
+Are you able to store new files in this remote and get them back out?
+
+Which Amazon datacenter is the bucket at?
+
+I've added some more debugging to the S3 remote; --debug will now
+have it log the http requests and responses. Perhaps this will give us
+more clues to the problem.
+"""]]

From ae9bbf25a043e8418e13afa497c3801e094e018a Mon Sep 17 00:00:00 2001
From: Joey Hess 
Date: Tue, 21 Apr 2015 15:59:30 -0400
Subject: [PATCH 096/362] convert all log prorities, not just debug

In particular, error should go to stderr
---
 Remote/S3.hs | 9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)

diff --git a/Remote/S3.hs b/Remote/S3.hs
index 06aa79d656..c9de36745d 100644
--- a/Remote/S3.hs
+++ b/Remote/S3.hs
@@ -521,5 +521,10 @@ mkLocationConstraint "US" = S3.locationUsClassic
 mkLocationConstraint r = r
 
 debugMapper :: AWS.Logger
-debugMapper AWS.Debug t = debugM "S3" (T.unpack t)
-debugMapper _ _ = noop
+debugMapper level t = forward "S3" (T.unpack t)
+  where
+	forward = case level of
+		AWS.Debug -> debugM
+		AWS.Info -> infoM
+		AWS.Warning -> warningM
+		AWS.Error -> errorM

From be522c96b33e5eccb70dd5172a399dbfecb51f4c Mon Sep 17 00:00:00 2001
From: Joey Hess 
Date: Tue, 21 Apr 2015 16:13:59 -0400
Subject: [PATCH 097/362] comment

---
 ..._c51363e109bcc5cd1df40c5d0ec993b3._comment | 38 +++++++++++++++++++
 1 file changed, 38 insertions(+)
 create mode 100644 doc/forum/__34__git_annex_sync_--content__34___with_special_remote_of_type___34__directory__34__/comment_1_c51363e109bcc5cd1df40c5d0ec993b3._comment

diff --git a/doc/forum/__34__git_annex_sync_--content__34___with_special_remote_of_type___34__directory__34__/comment_1_c51363e109bcc5cd1df40c5d0ec993b3._comment b/doc/forum/__34__git_annex_sync_--content__34___with_special_remote_of_type___34__directory__34__/comment_1_c51363e109bcc5cd1df40c5d0ec993b3._comment
new file mode 100644
index 0000000000..b7d538ae9b
--- /dev/null
+++ b/doc/forum/__34__git_annex_sync_--content__34___with_special_remote_of_type___34__directory__34__/comment_1_c51363e109bcc5cd1df40c5d0ec993b3._comment
@@ -0,0 +1,38 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 1"""
+ date="2015-04-21T20:01:26Z"
+ content="""
+What's going on here is that git-annex does not know that you want to
+use "neon" as a repository that transfers content between "ldk" and
+"storage". The configuration for "neon" only makes it want a specific
+set of files, so it doesn't get other files from "ldk", and so does
+not have them to send to "storage".
+
+The solution is to change "neon"'s preferred content settings so it wants
+files that are not yet present in "storage".
+
+The [[transfer repository expression|preferred_content/standard_groups]]
+is one way to configure preferred content settings so that a repo
+will want to download files that other repos want to have. 
+
+	not (inallgroup=client and copies=client:2) and ($client)
+
+But that expression only works for transfer repsitories in between client
+repositories. Your "storage" repo is set to be a backup repository.
+
+So, we need something a little bit different.
+
+	not inallgroup=backup and include=*
+
+I think that would work, but I don't see a way to reconcile it with
+the configuration you already have for "neon". If neon wants to
+"exclude=pictures/* and exclude=video/*" then it will never get those
+and so can never send them on to "storage". And if neon wants all
+"present" files, then anything it does get for whatever reason
+will stay in it, which is just not how a transfer repo needs to work.
+
+What might work better is to set up a separate repository that can talk
+to "ldk" and "storage" (as well as perhaps pulling files from "neon"
+when available), and make it have that preferred content expression.
+"""]]

From a143390212c6e2da99b8c8d9963429dc253ce4e0 Mon Sep 17 00:00:00 2001
From: Joey Hess 
Date: Tue, 21 Apr 2015 16:31:00 -0400
Subject: [PATCH 098/362] both whereis and metadata accept --key, --all, and
 --unused; document that

---
 doc/git-annex-metadata.mdwn | 13 +++++++++++++
 doc/git-annex-whereis.mdwn  | 13 +++++++++++++
 2 files changed, 26 insertions(+)

diff --git a/doc/git-annex-metadata.mdwn b/doc/git-annex-metadata.mdwn
index 7d613456b8..c539de6eef 100644
--- a/doc/git-annex-metadata.mdwn
+++ b/doc/git-annex-metadata.mdwn
@@ -66,6 +66,19 @@ When run without any -s or -t parameters, displays the current metadata.
   Enable JSON output. This is intended to be parsed by programs that use
   git-annex. Each line of output is a JSON object.
 
+* `--all`
+
+  Specify instead of a file to get/set metadata on all known keys.
+
+* `--unused`
+
+  Specify instead of a file to get/set metadata on
+  files found by last run of git-annex unused.
+
+* `--key=keyname`
+
+  Specify instead of a file to get/set metadata of the specified key.
+
 # EXAMPLES
 
 To set some tags on a file and also its author:
diff --git a/doc/git-annex-whereis.mdwn b/doc/git-annex-whereis.mdwn
index 1e1092ba3f..c99e0722c6 100644
--- a/doc/git-annex-whereis.mdwn
+++ b/doc/git-annex-whereis.mdwn
@@ -32,6 +32,19 @@ For example:
   The [[git-annex-matching-options]](1)
   can be used to specify files to act on.
 
+* `--key=keyname`
+
+  Show where a particular git-annex key is located.
+
+* `--all`
+
+  Show whereis information for all known keys.
+
+* `--unused`
+
+  Show whereis information for files found by last run of git-annex unused.
+
+
 # SEE ALSO
 
 [[git-annex]](1)

From 0cf8af6d8a7b56d3b6dedd7ac982df6cf1f08311 Mon Sep 17 00:00:00 2001
From: Joey Hess 
Date: Tue, 21 Apr 2015 16:31:19 -0400
Subject: [PATCH 099/362] comment

---
 ...nt_4_43549b3d231f52cf53a66c477c34a708._comment | 15 +++++++++++++++
 1 file changed, 15 insertions(+)
 create mode 100644 doc/forum/How_to_find_deleted_files_that_I_know_have_been_backed_up__63__/comment_4_43549b3d231f52cf53a66c477c34a708._comment

diff --git a/doc/forum/How_to_find_deleted_files_that_I_know_have_been_backed_up__63__/comment_4_43549b3d231f52cf53a66c477c34a708._comment b/doc/forum/How_to_find_deleted_files_that_I_know_have_been_backed_up__63__/comment_4_43549b3d231f52cf53a66c477c34a708._comment
new file mode 100644
index 0000000000..7d29bec3a7
--- /dev/null
+++ b/doc/forum/How_to_find_deleted_files_that_I_know_have_been_backed_up__63__/comment_4_43549b3d231f52cf53a66c477c34a708._comment
@@ -0,0 +1,15 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 4"""
+ date="2015-04-21T20:22:25Z"
+ content="""
+Yeah, you need to `git checkout` a tree from before you deleted the files,
+and then you'll be able to use `git annex whereis` in there on the deleted
+files. This will tell you where the files are currently located (not some historical data).
+
+`git annex whereis --key` is indeed an alternative approach, if you know
+the key corresponding to the deleted file. You can see the keys in the git
+diff, if you know where to look.
+
+[[internals]] will let you understand how this all really works.
+"""]]

From dc6949b509ba92e16d5f275a7aaf5a7ba270dff3 Mon Sep 17 00:00:00 2001
From: Joey Hess 
Date: Tue, 21 Apr 2015 16:38:49 -0400
Subject: [PATCH 100/362] filter out non-cygwin libs

---
 Build/NullSoftInstaller.hs | 10 ++++++----
 1 file changed, 6 insertions(+), 4 deletions(-)

diff --git a/Build/NullSoftInstaller.hs b/Build/NullSoftInstaller.hs
index 75591aaa39..0abd07f95e 100644
--- a/Build/NullSoftInstaller.hs
+++ b/Build/NullSoftInstaller.hs
@@ -27,7 +27,7 @@ import Control.Applicative
 import Data.String
 import Data.Maybe
 import Data.Char
-import Data.List (nub)
+import Data.List (nub, isPrefixOf)
 
 import Utility.Tmp
 import Utility.Path
@@ -47,7 +47,7 @@ main = do
 			when (isNothing p) $
 				print ("unable to find in PATH", f)
 			return p
-		dlls <- forM (catMaybes extrabins) findLibs
+		dlls <- forM (catMaybes extrabins) findCygLibs
 		dllpaths <- mapM searchPath (nub (concat dlls))
 		webappscript <- vbsLauncher tmpdir "git-annex-webapp" "git-annex webapp"
 		autostartscript <- vbsLauncher tmpdir "git-annex-autostart" "git annex assistant --autostart"
@@ -189,9 +189,11 @@ htmlHelpText = unlines
 	, " IO [FilePath]
-findLibs p = mapMaybe parse . lines <$> readProcess "ldd" [p]
+-- Find cygwin libraries used by the specified executable.
+findCygLibs :: FilePath -> IO [FilePath]
+findCygLibs p = filter iscyg . mapMaybe parse . lines <$> readProcess "ldd" [p]
   where
 	parse l = case words (dropWhile isSpace l) of
 		(dll:"=>":_dllpath:_offset:[]) -> Just dll
 		_ -> Nothing
+	iscyg f = "cyg" `isPrefixOf` f || "lib" `isPrefixOf` f

From a15e1158c6d3c5e14a2eaf93d9e8f0b74f7c9920 Mon Sep 17 00:00:00 2001
From: Joey Hess 
Date: Tue, 21 Apr 2015 16:42:54 -0400
Subject: [PATCH 101/362] use BuildVersion in debian, which fixes windows build

---
 Build/Version.hs                   | 3 ---
 debian/create-standalone-changelog | 2 +-
 2 files changed, 1 insertion(+), 4 deletions(-)

diff --git a/Build/Version.hs b/Build/Version.hs
index 82cca034f6..da9d1bbcba 100644
--- a/Build/Version.hs
+++ b/Build/Version.hs
@@ -67,6 +67,3 @@ cabalSetup cabalfile = do
 		| otherwise = s
 	  where
 		fullfield = field ++ ": "
-
-main :: IO ()
-main = putStr =<< getVersion
diff --git a/debian/create-standalone-changelog b/debian/create-standalone-changelog
index 40b0c69644..d972f4e306 100755
--- a/debian/create-standalone-changelog
+++ b/debian/create-standalone-changelog
@@ -9,7 +9,7 @@ umask 022
 
 # This is the same method that the configure script uses when git-annex is
 # built from git master.
-ANNEX_VERSION=$(runghc Build/Version.hs)
+ANNEX_VERSION=$(runghc Build/BuildVersion.hs)
 
 ANNEX_NDVERSION=$( echo ${ANNEX_VERSION} | sed -e 's,-,+git,' -e 's,$,-1~ndall+1,')
 

From 9835eb54c5a63bf26f22630b2d79ea4f23284f06 Mon Sep 17 00:00:00 2001
From: 
 "https://www.google.com/accounts/o8/id?id=AItOawnSenxKyE_2Z6Wb-EBMO8FciyRywjx1ZiQ"
 
Date: Tue, 21 Apr 2015 22:53:21 +0000
Subject: [PATCH 102/362] Added a comment

---
 ..._24224679a1516e2852b43624c787f639._comment | 63 +++++++++++++++++++
 1 file changed, 63 insertions(+)
 create mode 100644 doc/bugs/Can__39__t_get_content_from_S3_with_s3-aws_library/comment_2_24224679a1516e2852b43624c787f639._comment

diff --git a/doc/bugs/Can__39__t_get_content_from_S3_with_s3-aws_library/comment_2_24224679a1516e2852b43624c787f639._comment b/doc/bugs/Can__39__t_get_content_from_S3_with_s3-aws_library/comment_2_24224679a1516e2852b43624c787f639._comment
new file mode 100644
index 0000000000..2bafdf7ea1
--- /dev/null
+++ b/doc/bugs/Can__39__t_get_content_from_S3_with_s3-aws_library/comment_2_24224679a1516e2852b43624c787f639._comment
@@ -0,0 +1,63 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawnSenxKyE_2Z6Wb-EBMO8FciyRywjx1ZiQ"
+ nickname="Walter"
+ subject="comment 2"
+ date="2015-04-21T22:53:21Z"
+ content="""
+It's in bucket ap-southeast-2, which conflicts with the info in the log below. I'm not sure why they disagree.
+
+This was a new file, which I also \"uploaded\" with a ``git annex copy --to cloud test_file``, and ``git annex whereis`` says is in cloud. However, using ``s3cmd`` to retrieve it (using the info from the log below), it claims it doesn't exist (404). So, I don't think it got uploaded correctly. I don't seem to get any useful logs when forcing an upload with ``--debug`` (as in no S3-related logs, but I've included that at the very bottom).
+
+[[!format sh \"\"\"
+> git annex get test_file
+get test_file (from cloud...) 
+                        
+  Unable to access these remotes: cloud
+
+  Try making some of these repositories available:
+  	be992080-b1db-11e1-8f79-1b10bb4092ef -- [cloud]
+
+  (Note that these git remotes have annex-ignore set: origin)
+failed
+git-annex: get: 1 failed
+walter@kronos:~/NewPics$ git annex get test_file --debug
+[2015-04-21 23:39:57 BST] read: git [\"--git-dir=.git\",\"--work-tree=.\",\"--literal-pathspecs\",\"ls-files\",\"--cached\",\"-z\",\"--\",\"test_file\"]
+get test_file [2015-04-21 23:39:57 BST] read: git [\"--git-dir=.git\",\"--work-tree=.\",\"--literal-pathspecs\",\"show-ref\",\"git-annex\"]
+[2015-04-21 23:39:57 BST] read: git [\"--git-dir=.git\",\"--work-tree=.\",\"--literal-pathspecs\",\"show-ref\",\"--hash\",\"refs/heads/git-annex\"]
+[2015-04-21 23:39:57 BST] read: git [\"--git-dir=.git\",\"--work-tree=.\",\"--literal-pathspecs\",\"log\",\"refs/heads/git-annex..347f154f5dfa9e41dc459eda328421741e1e90a6\",\"-n1\",\"--pretty=%H\"]
+[2015-04-21 23:39:57 BST] read: git [\"--git-dir=.git\",\"--work-tree=.\",\"--literal-pathspecs\",\"log\",\"refs/heads/git-annex..83793925a571a3228cc64e204598f8c54203b1f7\",\"-n1\",\"--pretty=%H\"]
+[2015-04-21 23:39:57 BST] chat: git [\"--git-dir=.git\",\"--work-tree=.\",\"--literal-pathspecs\",\"cat-file\",\"--batch\"]
+(from cloud...) [2015-04-21 23:39:57 BST] chat: gpg [\"--batch\",\"--no-tty\",\"--use-agent\",\"--quiet\",\"--trust-model\",\"always\",\"--decrypt\"]
+
+[2015-04-21 23:39:57 BST] String to sign: \"GET\n\n\nTue, 21 Apr 2015 22:39:57 GMT\n/BUCKETID/GPGHMACSHA1--417830f4c50a2887674917abd2c18c522853255a\"
+[2015-04-21 23:39:57 BST] Host: \"BUCKETID.s3-ap-southeast-1.amazonaws.com\"
+[2015-04-21 23:39:57 BST] Path: \"/GPGHMACSHA1--417830f4c50a2887674917abd2c18c522853255a\"
+[2015-04-21 23:39:57 BST] Query string: \"\"
+[2015-04-21 23:39:57 BST] Response status: Status {statusCode = 301, statusMessage = \"Moved Permanently\"}
+[2015-04-21 23:39:57 BST] Response header 'x-amz-request-id': 'C2825FBB20ED22B4'
+[2015-04-21 23:39:57 BST] Response header 'x-amz-id-2': 'I93feDTHOrPR+bwVqoMBuEEwYQAN7ZfjOq0jdIJ6ywzOPYYxTfqZg9OR+M0L+MFdilHKRJ+CEv8='
+[2015-04-21 23:39:57 BST] Response header 'Content-Type': 'application/xml'
+[2015-04-21 23:39:57 BST] Response header 'Transfer-Encoding': 'chunked'
+[2015-04-21 23:39:57 BST] Response header 'Date': 'Tue, 21 Apr 2015 22:39:56 GMT'
+[2015-04-21 23:39:57 BST] Response header 'Server': 'AmazonS3'
+[2015-04-21 23:39:57 BST] Response metadata: S3: request ID=C2825FBB20ED22B4, x-amz-id-2=I93feDTHOrPR+bwVqoMBuEEwYQAN7ZfjOq0jdIJ6ywzOPYYxTfqZg9OR+M0L+MFdilHKRJ+CEv8=
+                        
+  Unable to access these remotes: cloud
+
+  Try making some of these repositories available:
+  	be992080-b1db-11e1-8f79-1b10bb4092ef -- [cloud]
+
+  (Note that these git remotes have annex-ignore set: origin)
+failed
+git-annex: get: 1 failed
+
+> git annex copy --to cloud --force --debug test_file 
+[2015-04-21 23:47:24 BST] read: git [\"--git-dir=.git\",\"--work-tree=.\",\"--literal-pathspecs\",\"show-ref\",\"git-annex\"]
+[2015-04-21 23:47:24 BST] read: git [\"--git-dir=.git\",\"--work-tree=.\",\"--literal-pathspecs\",\"show-ref\",\"--hash\",\"refs/heads/git-annex\"]
+[2015-04-21 23:47:24 BST] read: git [\"--git-dir=.git\",\"--work-tree=.\",\"--literal-pathspecs\",\"log\",\"refs/heads/git-annex..347f154f5dfa9e41dc459eda328421741e1e90a6\",\"-n1\",\"--pretty=%H\"]
+[2015-04-21 23:47:24 BST] read: git [\"--git-dir=.git\",\"--work-tree=.\",\"--literal-pathspecs\",\"log\",\"refs/heads/git-annex..83793925a571a3228cc64e204598f8c54203b1f7\",\"-n1\",\"--pretty=%H\"]
+[2015-04-21 23:47:24 BST] chat: git [\"--git-dir=.git\",\"--work-tree=.\",\"--literal-pathspecs\",\"cat-file\",\"--batch\"]
+[2015-04-21 23:47:24 BST] read: git [\"--git-dir=.git\",\"--work-tree=.\",\"--literal-pathspecs\",\"ls-files\",\"--cached\",\"-z\",\"--\",\"test_file\"]
+
+\"\"\"]]
+"""]]

From b97339b64eb73c22dc94fa5dd232ea6fb0da117f Mon Sep 17 00:00:00 2001
From: "https://me.yahoo.com/a/wS4b1K9kooKjDS5nqjBuZsN4Czwko0ECcg--#2eff3"
 
Date: Wed, 22 Apr 2015 10:47:27 +0000
Subject: [PATCH 103/362] Added a comment

---
 .../comment_2_be52a6d21df4732c9f83463bb5e6f612._comment   | 8 ++++++++
 1 file changed, 8 insertions(+)
 create mode 100644 doc/forum/__34__git_annex_sync_--content__34___with_special_remote_of_type___34__directory__34__/comment_2_be52a6d21df4732c9f83463bb5e6f612._comment

diff --git a/doc/forum/__34__git_annex_sync_--content__34___with_special_remote_of_type___34__directory__34__/comment_2_be52a6d21df4732c9f83463bb5e6f612._comment b/doc/forum/__34__git_annex_sync_--content__34___with_special_remote_of_type___34__directory__34__/comment_2_be52a6d21df4732c9f83463bb5e6f612._comment
new file mode 100644
index 0000000000..c2566bf60f
--- /dev/null
+++ b/doc/forum/__34__git_annex_sync_--content__34___with_special_remote_of_type___34__directory__34__/comment_2_be52a6d21df4732c9f83463bb5e6f612._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="https://me.yahoo.com/a/wS4b1K9kooKjDS5nqjBuZsN4Czwko0ECcg--#2eff3"
+ nickname="Markus"
+ subject="comment 2"
+ date="2015-04-22T10:47:26Z"
+ content="""
+Thank you. I settled on using `present or (not inallgroup=backup) or (exclude=pictures/* and exclude=video/*)`, which seems to be doing what I want. The most important thing to me is that files are transferred to the backup group. Some files might be left in pictures/ or video/ on \"neon\", but I can drop those from time to time if disk space is low.
+"""]]

From 657b6e5b2df92facb2d0081b168e1da2a5877b38 Mon Sep 17 00:00:00 2001
From: clacke 
Date: Wed, 22 Apr 2015 11:39:19 +0000
Subject: [PATCH 104/362] Added a comment: regression

---
 .../comment_6_703ecd8e1dfc5b5b58655e27c9db838a._comment  | 9 +++++++++
 1 file changed, 9 insertions(+)
 create mode 100644 doc/forum/Adding_files_with_wildcard_on_Mac_Yosemite/comment_6_703ecd8e1dfc5b5b58655e27c9db838a._comment

diff --git a/doc/forum/Adding_files_with_wildcard_on_Mac_Yosemite/comment_6_703ecd8e1dfc5b5b58655e27c9db838a._comment b/doc/forum/Adding_files_with_wildcard_on_Mac_Yosemite/comment_6_703ecd8e1dfc5b5b58655e27c9db838a._comment
new file mode 100644
index 0000000000..30a6bd26fc
--- /dev/null
+++ b/doc/forum/Adding_files_with_wildcard_on_Mac_Yosemite/comment_6_703ecd8e1dfc5b5b58655e27c9db838a._comment
@@ -0,0 +1,9 @@
+[[!comment format=mdwn
+ username="clacke"
+ subject="regression"
+ date="2015-04-22T11:39:19Z"
+ content="""
+The fix is a regression compared to previous behavior.
+
+Being able to do `git annex add '*'.{JPG,jp{,e}g,AVI,avi,MOV,mov,3GP,3gp,mp4,tif,pdf,PDF,doc,pps,bmp,png,mp{,e}g,MP{,E}G,wav,WAV,nef,NEF,thm,THM,key.gz,ogg,OGG,ppt,GIF,gif,m4a}` in the root of my binary files archive to catch any newly copied files was a real feature. This worked until recently. I was just about to add a bug report stating the same problem as the OP for the OSX homebrew version, but I verified with the latest Linux standalone and there wildcards were completely turned off.
+"""]]

From 235e40279a42ef5d48f5df2ef4db4b5de433daf4 Mon Sep 17 00:00:00 2001
From: clacke 
Date: Wed, 22 Apr 2015 12:02:01 +0000
Subject: [PATCH 105/362] Added a comment: Workaround

---
 ...comment_7_5de2bccade78489d236872e5a3c86edd._comment | 10 ++++++++++
 1 file changed, 10 insertions(+)
 create mode 100644 doc/forum/Adding_files_with_wildcard_on_Mac_Yosemite/comment_7_5de2bccade78489d236872e5a3c86edd._comment

diff --git a/doc/forum/Adding_files_with_wildcard_on_Mac_Yosemite/comment_7_5de2bccade78489d236872e5a3c86edd._comment b/doc/forum/Adding_files_with_wildcard_on_Mac_Yosemite/comment_7_5de2bccade78489d236872e5a3c86edd._comment
new file mode 100644
index 0000000000..dabdb0588e
--- /dev/null
+++ b/doc/forum/Adding_files_with_wildcard_on_Mac_Yosemite/comment_7_5de2bccade78489d236872e5a3c86edd._comment
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="clacke"
+ subject="Workaround"
+ date="2015-04-22T12:02:01Z"
+ content="""
+This is a workaround for the missing wildcard functionality:
+
+`git annex add . $( echo --include='*'.{JPG,jp{,e}g,AVI,avi,MOV,mov,3GP,3gp,mp4,tif,pdf,PDF,doc,pps,bmp,png,mp{,e}g,MP{,E}G,wav,WAV,nef,NEF,thm,THM,key.gz,ogg,OGG,ppt,GIF,gif,m4a
+}\ --or --include=dummy.qwerasdfzxcv )`
+"""]]

From f1a657b787c3c845e8608e0909d3bbfc8c7f4681 Mon Sep 17 00:00:00 2001
From: clacke 
Date: Wed, 22 Apr 2015 12:33:40 +0000
Subject: [PATCH 106/362]

---
 ...havior_when_files_to_add_do_not_exist.mdwn | 101 ++++++++++++++++++
 1 file changed, 101 insertions(+)
 create mode 100644 doc/bugs/regression:_behavior_when_files_to_add_do_not_exist.mdwn

diff --git a/doc/bugs/regression:_behavior_when_files_to_add_do_not_exist.mdwn b/doc/bugs/regression:_behavior_when_files_to_add_do_not_exist.mdwn
new file mode 100644
index 0000000000..c31700194a
--- /dev/null
+++ b/doc/bugs/regression:_behavior_when_files_to_add_do_not_exist.mdwn
@@ -0,0 +1,101 @@
+### Please describe the problem.
+
+When adding a list of files, where some exist and some don't, annex claims to add some of the files until it encounters the first missing file. Then it bails out, leaving files hashed but not added.
+
+### What steps will reproduce the problem?
+
+Create a file, ask annex to add the file and a non-existant file
+
+Expected and historic behavior: annex adds the file
+
+Actual behavior: annex hashes but does not add the file
+
+### What version of git-annex are you using? On what operating system?
+
+git-annex version: 5.20150420-gb0ebb23
+standalone linux amd64
+
+### Please provide any additional information below.
+
+[[!format sh """
+# If you can, paste a complete transcript of the problem occurring here.
+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log
+
+$ git annex version
+git-annex version: 5.20150420-gb0ebb23
+[ . . . ]
+
+$ git init asdf
+Initialized empty Git repository in /tmp/asdf/.git/
+
+$ cd asdf
+
+$ git annex init
+init  ok
+(recording state in git...)
+
+$ touch asdf
+
+$ git add asdf qwer
+fatal: pathspec 'qwer' did not match any files
+
+$ git annex add asdf qwer
+add asdf ok
+git-annex: qwer not found
+
+$ file *
+asdf: symbolic link to `.git/annex/objects/pX/ZJ/SHA256E-s0--e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855/SHA256E-s0--e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855' 
+
+$ git status
+On branch master
+
+Initial commit
+
+Untracked files:
+  (use "git add ..." to include in what will be committed)
+
+	asdf
+
+nothing added to commit but untracked files present (use "git add" to track)
+
+
+# End of transcript or log.
+"""]]
+
+Older version of git-annex:
+
+[[!format sh """
+
+$ git annex version
+git-annex version: 5.20140412ubuntu1
+[ . . . ]
+
+$ git init asdf
+Initialized empty Git repository in /tmp/asdf/.git/
+
+$ cd asdf
+
+$ git annex init asdf
+init asdf ok
+(Recording state in git...)
+
+$ touch asdf
+
+$ git annex add asdf qwer
+add asdf ok
+git-annex: qwer not found
+(Recording state in git...)
+
+$ file *
+asdf: symbolic link to `.git/annex/objects/pX/ZJ/SHA256E-s0--e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855/SHA256E-s0--e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855' 
+
+$ git status
+On branch master
+
+Initial commit
+
+Changes to be committed:
+  (use "git rm --cached ..." to unstage)
+
+	new file:   asdf
+"""]]

From f47701cbdbcfa8929bda7cc9e2c5e27a0b91e085 Mon Sep 17 00:00:00 2001
From: clacke 
Date: Wed, 22 Apr 2015 12:56:42 +0000
Subject: [PATCH 107/362] Added a comment: Inconsistent between batches of
 files

---
 ..._3e444d500071779bcbfbc781b4756daf._comment | 30 +++++++++++++++++++
 1 file changed, 30 insertions(+)
 create mode 100644 doc/bugs/regression:_behavior_when_files_to_add_do_not_exist/comment_1_3e444d500071779bcbfbc781b4756daf._comment

diff --git a/doc/bugs/regression:_behavior_when_files_to_add_do_not_exist/comment_1_3e444d500071779bcbfbc781b4756daf._comment b/doc/bugs/regression:_behavior_when_files_to_add_do_not_exist/comment_1_3e444d500071779bcbfbc781b4756daf._comment
new file mode 100644
index 0000000000..6fc7f84db2
--- /dev/null
+++ b/doc/bugs/regression:_behavior_when_files_to_add_do_not_exist/comment_1_3e444d500071779bcbfbc781b4756daf._comment
@@ -0,0 +1,30 @@
+[[!comment format=mdwn
+ username="clacke"
+ subject="Inconsistent between batches of files"
+ date="2015-04-22T12:56:42Z"
+ content="""
+If you add enough files, annex gets past the first `(Recording state in git...)` and then breaks on only the last portion, so some files are added and some are only hashed:
+
+[[!format sh \"\"\"
+$ touch {10000..20240} 20242
+
+$ git annex add {10000..20242}
+[ . . . ]
+add 20240 ok
+(recording state in git...)
+add 20242 ok
+git-annex: 20241 not found
+
+$ file 20240 20242 | sed -e 's/`.*//'
+20240: symbolic link to 
+20242: symbolic link to 
+
+$ git status | tail -n 7
+	new file:   20240
+
+Untracked files:
+  (use \"git add ...\" to include in what will be committed)
+
+	20242
+\"\"\"]]
+"""]]

From c9e3c59aecc37fd4570f80a5d19df05100157fae Mon Sep 17 00:00:00 2001
From: clacke 
Date: Wed, 22 Apr 2015 12:59:03 +0000
Subject: [PATCH 108/362] Remove shell output that breaks formatting

---
 ...gression:_behavior_when_files_to_add_do_not_exist.mdwn | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/doc/bugs/regression:_behavior_when_files_to_add_do_not_exist.mdwn b/doc/bugs/regression:_behavior_when_files_to_add_do_not_exist.mdwn
index c31700194a..b7555e77a2 100644
--- a/doc/bugs/regression:_behavior_when_files_to_add_do_not_exist.mdwn
+++ b/doc/bugs/regression:_behavior_when_files_to_add_do_not_exist.mdwn
@@ -43,8 +43,8 @@ $ git annex add asdf qwer
 add asdf ok
 git-annex: qwer not found
 
-$ file *
-asdf: symbolic link to `.git/annex/objects/pX/ZJ/SHA256E-s0--e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855/SHA256E-s0--e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855' 
+$ file * | sed -e 's/`.*//'
+asdf: symbolic link to 
 
 $ git status
 On branch master
@@ -86,8 +86,8 @@ add asdf ok
 git-annex: qwer not found
 (Recording state in git...)
 
-$ file *
-asdf: symbolic link to `.git/annex/objects/pX/ZJ/SHA256E-s0--e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855/SHA256E-s0--e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855' 
+$ file * | sed -e 's/`.*//'
+asdf: symbolic link to 
 
 $ git status
 On branch master

From 7d8c0bd16e109517b151f527f37e129814559e2a Mon Sep 17 00:00:00 2001
From: clacke 
Date: Wed, 22 Apr 2015 13:16:01 +0000
Subject: [PATCH 109/362] Added a comment

---
 ...ent_8_a2b10366426158bcb6c91df6c2e843b7._comment | 14 ++++++++++++++
 1 file changed, 14 insertions(+)
 create mode 100644 doc/forum/Adding_files_with_wildcard_on_Mac_Yosemite/comment_8_a2b10366426158bcb6c91df6c2e843b7._comment

diff --git a/doc/forum/Adding_files_with_wildcard_on_Mac_Yosemite/comment_8_a2b10366426158bcb6c91df6c2e843b7._comment b/doc/forum/Adding_files_with_wildcard_on_Mac_Yosemite/comment_8_a2b10366426158bcb6c91df6c2e843b7._comment
new file mode 100644
index 0000000000..c57fbaf047
--- /dev/null
+++ b/doc/forum/Adding_files_with_wildcard_on_Mac_Yosemite/comment_8_a2b10366426158bcb6c91df6c2e843b7._comment
@@ -0,0 +1,14 @@
+[[!comment format=mdwn
+ username="clacke"
+ subject="comment 8"
+ date="2015-04-22T13:16:01Z"
+ content="""
+This is a bit more readable, even avoids the commas and casing of the original line I was using:
+
+[[!format sh \"\"\"
+$ find . -name .git -prune -o -print0 | grep -izZ -f <(printf '\.%s\n' jp{,e}g avi mov 3gp mp4 tif pdf doc pps bmp png mp{,e}g wav nef thm key.gz ogg ppt gif m4a) - | xargs -0 git annex add
+\"\"\"]]
+
+(`ggrep` necessary on OSX)
+
+"""]]

From e5f18acc1782224b5fc56b9f66066d1a536abd48 Mon Sep 17 00:00:00 2001
From: clacke 
Date: Wed, 22 Apr 2015 13:22:25 +0000
Subject: [PATCH 110/362] Added a comment: Nicer expression

---
 ...ment_9_81243b0c7f24e5d93cfa4335f73cd83f._comment | 13 +++++++++++++
 1 file changed, 13 insertions(+)
 create mode 100644 doc/forum/Adding_files_with_wildcard_on_Mac_Yosemite/comment_9_81243b0c7f24e5d93cfa4335f73cd83f._comment

diff --git a/doc/forum/Adding_files_with_wildcard_on_Mac_Yosemite/comment_9_81243b0c7f24e5d93cfa4335f73cd83f._comment b/doc/forum/Adding_files_with_wildcard_on_Mac_Yosemite/comment_9_81243b0c7f24e5d93cfa4335f73cd83f._comment
new file mode 100644
index 0000000000..41095c82a6
--- /dev/null
+++ b/doc/forum/Adding_files_with_wildcard_on_Mac_Yosemite/comment_9_81243b0c7f24e5d93cfa4335f73cd83f._comment
@@ -0,0 +1,13 @@
+[[!comment format=mdwn
+ username="clacke"
+ subject="Nicer expression"
+ date="2015-04-22T13:22:25Z"
+ content="""
+This is a bit more readable, even avoids the commas and casing of the original line I was using:
+
+find . -name .git -prune -o -print0 | ggrep -izZ -f <(printf '\.%s$\n' jp{,e}g avi mov 3gp mp4 tif pdf doc pps bmp png mp{,e}g wav nef thm key.gz ogg ppt gif m4a) - | xargs -0 git annex add
+
+(`ggrep` necessary on OSX)
+
+(removed comment with faulty overbroad regex)
+"""]]

From 5ed462fe80d29fa132679ee714a37fb57df0dd4c Mon Sep 17 00:00:00 2001
From: clacke 
Date: Wed, 22 Apr 2015 13:22:49 +0000
Subject: [PATCH 111/362] removed

---
 ...ent_8_a2b10366426158bcb6c91df6c2e843b7._comment | 14 --------------
 1 file changed, 14 deletions(-)
 delete mode 100644 doc/forum/Adding_files_with_wildcard_on_Mac_Yosemite/comment_8_a2b10366426158bcb6c91df6c2e843b7._comment

diff --git a/doc/forum/Adding_files_with_wildcard_on_Mac_Yosemite/comment_8_a2b10366426158bcb6c91df6c2e843b7._comment b/doc/forum/Adding_files_with_wildcard_on_Mac_Yosemite/comment_8_a2b10366426158bcb6c91df6c2e843b7._comment
deleted file mode 100644
index c57fbaf047..0000000000
--- a/doc/forum/Adding_files_with_wildcard_on_Mac_Yosemite/comment_8_a2b10366426158bcb6c91df6c2e843b7._comment
+++ /dev/null
@@ -1,14 +0,0 @@
-[[!comment format=mdwn
- username="clacke"
- subject="comment 8"
- date="2015-04-22T13:16:01Z"
- content="""
-This is a bit more readable, even avoids the commas and casing of the original line I was using:
-
-[[!format sh \"\"\"
-$ find . -name .git -prune -o -print0 | grep -izZ -f <(printf '\.%s\n' jp{,e}g avi mov 3gp mp4 tif pdf doc pps bmp png mp{,e}g wav nef thm key.gz ogg ppt gif m4a) - | xargs -0 git annex add
-\"\"\"]]
-
-(`ggrep` necessary on OSX)
-
-"""]]

From f68676d96d96e4d4c5aa620fb91f3bd1e22817e9 Mon Sep 17 00:00:00 2001
From: clacke 
Date: Wed, 22 Apr 2015 13:29:21 +0000
Subject: [PATCH 112/362] removed

---
 ...comment_7_5de2bccade78489d236872e5a3c86edd._comment | 10 ----------
 1 file changed, 10 deletions(-)
 delete mode 100644 doc/forum/Adding_files_with_wildcard_on_Mac_Yosemite/comment_7_5de2bccade78489d236872e5a3c86edd._comment

diff --git a/doc/forum/Adding_files_with_wildcard_on_Mac_Yosemite/comment_7_5de2bccade78489d236872e5a3c86edd._comment b/doc/forum/Adding_files_with_wildcard_on_Mac_Yosemite/comment_7_5de2bccade78489d236872e5a3c86edd._comment
deleted file mode 100644
index dabdb0588e..0000000000
--- a/doc/forum/Adding_files_with_wildcard_on_Mac_Yosemite/comment_7_5de2bccade78489d236872e5a3c86edd._comment
+++ /dev/null
@@ -1,10 +0,0 @@
-[[!comment format=mdwn
- username="clacke"
- subject="Workaround"
- date="2015-04-22T12:02:01Z"
- content="""
-This is a workaround for the missing wildcard functionality:
-
-`git annex add . $( echo --include='*'.{JPG,jp{,e}g,AVI,avi,MOV,mov,3GP,3gp,mp4,tif,pdf,PDF,doc,pps,bmp,png,mp{,e}g,MP{,E}G,wav,WAV,nef,NEF,thm,THM,key.gz,ogg,OGG,ppt,GIF,gif,m4a
-}\ --or --include=dummy.qwerasdfzxcv )`
-"""]]

From 01c28fdcd11814a93b4ae5c91a39dded1597592a Mon Sep 17 00:00:00 2001
From: clacke 
Date: Wed, 22 Apr 2015 13:29:53 +0000
Subject: [PATCH 113/362] removed

---
 ...ment_9_81243b0c7f24e5d93cfa4335f73cd83f._comment | 13 -------------
 1 file changed, 13 deletions(-)
 delete mode 100644 doc/forum/Adding_files_with_wildcard_on_Mac_Yosemite/comment_9_81243b0c7f24e5d93cfa4335f73cd83f._comment

diff --git a/doc/forum/Adding_files_with_wildcard_on_Mac_Yosemite/comment_9_81243b0c7f24e5d93cfa4335f73cd83f._comment b/doc/forum/Adding_files_with_wildcard_on_Mac_Yosemite/comment_9_81243b0c7f24e5d93cfa4335f73cd83f._comment
deleted file mode 100644
index 41095c82a6..0000000000
--- a/doc/forum/Adding_files_with_wildcard_on_Mac_Yosemite/comment_9_81243b0c7f24e5d93cfa4335f73cd83f._comment
+++ /dev/null
@@ -1,13 +0,0 @@
-[[!comment format=mdwn
- username="clacke"
- subject="Nicer expression"
- date="2015-04-22T13:22:25Z"
- content="""
-This is a bit more readable, even avoids the commas and casing of the original line I was using:
-
-find . -name .git -prune -o -print0 | ggrep -izZ -f <(printf '\.%s$\n' jp{,e}g avi mov 3gp mp4 tif pdf doc pps bmp png mp{,e}g wav nef thm key.gz ogg ppt gif m4a) - | xargs -0 git annex add
-
-(`ggrep` necessary on OSX)
-
-(removed comment with faulty overbroad regex)
-"""]]

From 661900458425fb4074494e76958e7f43fdc238fd Mon Sep 17 00:00:00 2001
From: clacke 
Date: Wed, 22 Apr 2015 13:31:10 +0000
Subject: [PATCH 114/362] Added a comment: workaround

---
 ...omment_7_dbe40fef2ba65cc0f1c20f41f2daab4d._comment | 11 +++++++++++
 1 file changed, 11 insertions(+)
 create mode 100644 doc/forum/Adding_files_with_wildcard_on_Mac_Yosemite/comment_7_dbe40fef2ba65cc0f1c20f41f2daab4d._comment

diff --git a/doc/forum/Adding_files_with_wildcard_on_Mac_Yosemite/comment_7_dbe40fef2ba65cc0f1c20f41f2daab4d._comment b/doc/forum/Adding_files_with_wildcard_on_Mac_Yosemite/comment_7_dbe40fef2ba65cc0f1c20f41f2daab4d._comment
new file mode 100644
index 0000000000..47b00a5f06
--- /dev/null
+++ b/doc/forum/Adding_files_with_wildcard_on_Mac_Yosemite/comment_7_dbe40fef2ba65cc0f1c20f41f2daab4d._comment
@@ -0,0 +1,11 @@
+[[!comment format=mdwn
+ username="clacke"
+ subject="workaround"
+ date="2015-04-22T13:31:10Z"
+ content="""
+This is a workaround to the missing functionality, generating an `--include` expression:
+
+[[!format sh \"\"\"
+git annex add $(printf -- '--include=*.%s --or ' jp{,e}g avi mov 3gp mp4 tif pdf doc pps bmp png mp{,e}g wav nef thm key.gz ogg ppt gif) --include='*.m4a'
+\"\"\"]]
+"""]]

From eb8ef441336732a583b49fdc97ff09aa5fb4029b Mon Sep 17 00:00:00 2001
From: Joey Hess 
Date: Wed, 22 Apr 2015 16:19:05 -0400
Subject: [PATCH 115/362] Dropped support for older versions of yesod and warp
 than the ones in Debian Jessie.

466 lines of compat cruft deleted!
---
 Assistant/WebApp/Bootstrap3.hs          | 260 ------------------------
 Assistant/WebApp/Common.hs              |   6 -
 Assistant/WebApp/Configurators/Local.hs |   8 -
 Assistant/WebApp/Configurators/Ssh.hs   |   4 -
 Assistant/WebApp/Form.hs                |  73 -------
 Assistant/WebApp/Notifications.hs       |  16 +-
 Assistant/WebApp/Types.hs               |  35 ----
 Utility/WebApp.hs                       |  22 --
 Utility/Yesod.hs                        |  32 ---
 debian/changelog                        |   2 +
 debian/control                          |  10 +-
 debian/copyright                        |   4 -
 git-annex.cabal                         |  13 +-
 13 files changed, 19 insertions(+), 466 deletions(-)
 delete mode 100644 Assistant/WebApp/Bootstrap3.hs

diff --git a/Assistant/WebApp/Bootstrap3.hs b/Assistant/WebApp/Bootstrap3.hs
deleted file mode 100644
index 3fa20fc4dd..0000000000
--- a/Assistant/WebApp/Bootstrap3.hs
+++ /dev/null
@@ -1,260 +0,0 @@
-{-# LANGUAGE QuasiQuotes #-}
-{-# LANGUAGE TypeFamilies #-}
-{-# LANGUAGE OverloadedStrings #-}
--- | Helper functions for creating forms when using Bootstrap v3.
--- This is a copy of the Yesod.Form.Bootstrap3 module that has been slightly
--- modified to be compatible with Yesod 1.0.1
-module Assistant.WebApp.Bootstrap3
-  ( -- * Rendering forms
-    renderBootstrap3
-  , BootstrapFormLayout(..)
-  , BootstrapGridOptions(..)
-    -- * Field settings
-  , bfs
-  , withPlaceholder
-  , withAutofocus
-  , withLargeInput
-  , withSmallInput
-    -- * Submit button
-  , bootstrapSubmit
-  , mbootstrapSubmit
-  , BootstrapSubmit(..)
-  ) where
-
-import Control.Arrow (second)
-import Control.Monad (liftM)
-import Data.Text (Text)
-import Data.String (IsString(..))
-import Yesod.Core
-
-import qualified Data.Text as T
-
-import Yesod.Form.Types
-import Yesod.Form.Functions
-
--- | Create a new 'FieldSettings' with the classes that are
--- required by Bootstrap v3.
---
--- Since: yesod-form 1.3.8
-bfs :: RenderMessage site msg => msg -> FieldSettings site
-bfs msg =
-    FieldSettings (SomeMessage msg) Nothing Nothing Nothing [("class", "form-control")]
-
-
--- | Add a placeholder attribute to a field.  If you need i18n
--- for the placeholder, currently you\'ll need to do a hack and
--- use 'getMessageRender' manually.
---
--- Since: yesod-form 1.3.8
-withPlaceholder :: Text -> FieldSettings site -> FieldSettings site
-withPlaceholder placeholder fs = fs { fsAttrs = newAttrs }
-    where newAttrs = ("placeholder", placeholder) : fsAttrs fs
-
-
--- | Add an autofocus attribute to a field.
---
--- Since: yesod-form 1.3.8
-withAutofocus :: FieldSettings site -> FieldSettings site
-withAutofocus fs = fs { fsAttrs = newAttrs }
-    where newAttrs = ("autofocus", "autofocus") : fsAttrs fs
-
-
--- | Add the @input-lg@ CSS class to a field.
---
--- Since: yesod-form 1.3.8
-withLargeInput :: FieldSettings site -> FieldSettings site
-withLargeInput fs = fs { fsAttrs = newAttrs }
-    where newAttrs = addClass "input-lg" (fsAttrs fs)
-
-
--- | Add the @input-sm@ CSS class to a field.
---
--- Since: yesod-form 1.3.8
-withSmallInput :: FieldSettings site -> FieldSettings site
-withSmallInput fs = fs { fsAttrs = newAttrs }
-    where newAttrs = addClass "input-sm" (fsAttrs fs)
-
-
-addClass :: Text -> [(Text, Text)] -> [(Text, Text)]
-addClass klass []                    = [("class", klass)]
-addClass klass (("class", old):rest) = ("class", T.concat [old, " ", klass]) : rest
-addClass klass (other         :rest) = other : addClass klass rest
-
-
--- | How many bootstrap grid columns should be taken (see
--- 'BootstrapFormLayout').
---
--- Since: yesod-form 1.3.8
-data BootstrapGridOptions =
-    ColXs !Int
-  | ColSm !Int
-  | ColMd !Int
-  | ColLg !Int
-    deriving (Eq, Ord, Show)
-
-toColumn :: BootstrapGridOptions -> String
-toColumn (ColXs 0) = ""
-toColumn (ColSm 0) = ""
-toColumn (ColMd 0) = ""
-toColumn (ColLg 0) = ""
-toColumn (ColXs columns) = "col-xs-" ++ show columns
-toColumn (ColSm columns) = "col-sm-" ++ show columns
-toColumn (ColMd columns) = "col-md-" ++ show columns
-toColumn (ColLg columns) = "col-lg-" ++ show columns
-
-toOffset :: BootstrapGridOptions -> String
-toOffset (ColXs 0) = ""
-toOffset (ColSm 0) = ""
-toOffset (ColMd 0) = ""
-toOffset (ColLg 0) = ""
-toOffset (ColXs columns) = "col-xs-offset-" ++ show columns
-toOffset (ColSm columns) = "col-sm-offset-" ++ show columns
-toOffset (ColMd columns) = "col-md-offset-" ++ show columns
-toOffset (ColLg columns) = "col-lg-offset-" ++ show columns
-
-addGO :: BootstrapGridOptions -> BootstrapGridOptions -> BootstrapGridOptions
-addGO (ColXs a) (ColXs b) = ColXs (a+b)
-addGO (ColSm a) (ColSm b) = ColSm (a+b)
-addGO (ColMd a) (ColMd b) = ColMd (a+b)
-addGO (ColLg a) (ColLg b) = ColLg (a+b)
-addGO a b     | a > b = addGO b a
-addGO (ColXs a) other = addGO (ColSm a) other
-addGO (ColSm a) other = addGO (ColMd a) other
-addGO (ColMd a) other = addGO (ColLg a) other
-addGO (ColLg _) _     = error "Yesod.Form.Bootstrap.addGO: never here"
-
-
--- | The layout used for the bootstrap form.
---
--- Since: yesod-form 1.3.8
-data BootstrapFormLayout =
-    BootstrapBasicForm
-  | BootstrapInlineForm
-  | BootstrapHorizontalForm
-      { bflLabelOffset :: !BootstrapGridOptions
-      , bflLabelSize   :: !BootstrapGridOptions
-      , bflInputOffset :: !BootstrapGridOptions
-      , bflInputSize   :: !BootstrapGridOptions
-      }
-    deriving (Show)
-
-
--- | Render the given form using Bootstrap v3 conventions.
---
--- Sample Hamlet for 'BootstrapHorizontalForm':
---
--- >  
--- > ^{formWidget} --- > ^{bootstrapSubmit MsgSubmit} --- --- Since: yesod-form 1.3.8 -renderBootstrap3 :: BootstrapFormLayout -> FormRender sub master a -renderBootstrap3 formLayout aform fragment = do - (res, views') <- aFormToForm aform - let views = views' [] - has (Just _) = True - has Nothing = False - widget = [whamlet| - #{fragment} - $forall view <- views -
- $case formLayout - $of BootstrapBasicForm - $if nequals (fvId view) bootstrapSubmitId -