summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Joey Hess <joey@kitenet.net>2014-09-18 14:36:20 -0400
committerGravatar Joey Hess <joey@kitenet.net>2014-09-18 14:36:20 -0400
commit2ba86dcb3dd049f592235bcbcb45a6f05c2a13f6 (patch)
treed5cccc978e7b4bf5171a93c7cb5a314b891bb6b8
parentb9343ca1d3e0c7e136f7894cd159edb1d0730a0a (diff)
parent7255a3267c3728822698aafcf5b9d597b17dc9a4 (diff)
Merge branch 'master' into s3-aws
Conflicts: Utility/Url.hs debian/changelog git-annex.cabal
-rw-r--r--Annex.hs6
-rw-r--r--Annex/CatFile.hs9
-rw-r--r--Annex/Content.hs69
-rw-r--r--Annex/Content/Direct.hs2
-rw-r--r--Annex/Direct.hs2
-rw-r--r--Annex/Init.hs12
-rw-r--r--Annex/LockFile.hs24
-rw-r--r--Annex/Ssh.hs13
-rw-r--r--Annex/Transfer.hs7
-rw-r--r--Annex/Url.hs2
-rw-r--r--Assistant/Threads/SanityChecker.hs11
-rw-r--r--Assistant/Unused.hs2
-rw-r--r--Backend/WORM.hs10
-rw-r--r--Build/Configure.hs1
-rw-r--r--Build/LinuxMkLibs.hs2
-rw-r--r--CmdLine.hs52
-rw-r--r--CmdLine/GitAnnex.hs4
-rw-r--r--CmdLine/Seek.hs3
-rw-r--r--Command/Add.hs11
-rw-r--r--Command/Drop.hs10
-rw-r--r--Command/DropKey.hs4
-rw-r--r--Command/Import.hs2
-rw-r--r--Command/Move.hs21
-rw-r--r--Command/PreCommit.hs23
-rw-r--r--Command/SendKey.hs2
-rw-r--r--Command/Sync.hs32
-rw-r--r--Command/TestRemote.hs12
-rw-r--r--Command/Unannex.hs2
-rw-r--r--Command/Uninit.hs2
-rw-r--r--Command/Unlock.hs2
-rw-r--r--Command/Unused.hs7
-rw-r--r--Git/AutoCorrect.hs4
-rw-r--r--Git/Objects.hs14
-rw-r--r--Git/Remote.hs8
-rw-r--r--Logs/Transfer.hs23
-rw-r--r--Logs/Trust.hs16
-rw-r--r--Logs/Trust/Basic.hs32
-rw-r--r--Makefile2
-rw-r--r--Messages.hs14
-rw-r--r--Remote/Git.hs30
-rw-r--r--Remote/Helper/Hooks.hs14
-rw-r--r--Remote/Rsync.hs2
-rw-r--r--Remote/WebDAV.hs2
-rw-r--r--Test.hs19
-rw-r--r--Types/GitConfig.hs2
-rw-r--r--Types/LockPool.hs10
-rw-r--r--Types/Messages.hs5
-rw-r--r--Utility/Bloom.hs4
-rw-r--r--Utility/CopyFile.hs24
-rw-r--r--Utility/Daemon.hs2
-rw-r--r--Utility/Gpg.hs3
-rw-r--r--Utility/LockFile.hs20
-rw-r--r--Utility/LockFile/Posix.hs99
-rw-r--r--Utility/LockFile/Windows.hs (renamed from Utility/WinLock.hs)18
-rw-r--r--Utility/Url.hs67
-rw-r--r--debian/changelog71
-rw-r--r--debian/control32
-rw-r--r--doc/backends.mdwn2
-rw-r--r--doc/bugs/Android_4.4_install_fails_with_permission_denied_errors.mdwn295
-rw-r--r--doc/bugs/Assistant_merge_loop/comment_14_46bddc2451da3bf5029248198cf02dcd._comment8
-rw-r--r--doc/bugs/Assistant_removed_all_references_to_files.mdwn1305
-rw-r--r--doc/bugs/Assistant_removed_all_references_to_files/comment_1_1f7da19ea99c263d56db6331d4b1e346._comment14
-rw-r--r--doc/bugs/Assistant_removed_all_references_to_files/comment_2_0dbb8df1ad267d1c502646a7131a99f1._comment10
-rw-r--r--doc/bugs/Bloom_filter_capacity_too_large_to_represent.mdwn44
-rw-r--r--doc/bugs/Bloom_filter_capacity_too_large_to_represent/comment_1_43c824a3b843faa2377bfd78158c72fe._comment14
-rw-r--r--doc/bugs/Bloom_filter_capacity_too_large_to_represent/comment_2_9b74457549e2739ae45dccd128de946f._comment12
-rw-r--r--doc/bugs/Bloom_filter_capacity_too_large_to_represent/comment_3_5790bbbe347e1806062ccb60fcad046a._comment12
-rw-r--r--doc/bugs/Bloom_filter_capacity_too_large_to_represent/comment_4_9fb9fdbc6218d6b86b0921f411f78891._comment12
-rw-r--r--doc/bugs/Possible_data-loss_if_WORM_keys_do_not_encode_relative_paths.mdwn1
-rw-r--r--doc/bugs/Possible_data-loss_if_WORM_keys_do_not_encode_relative_paths/comment_2_e8f011263bfa4c3c3d04494ea1c88523._comment21
-rw-r--r--doc/bugs/Possible_data-loss_if_WORM_keys_do_not_encode_relative_paths/comment_3_bda1e0d3569a6becf374d0e820219469._comment15
-rw-r--r--doc/bugs/Possible_data-loss_if_WORM_keys_do_not_encode_relative_paths/comment_4_4241c05a0fa7ce597c75ff5992b71b89._comment12
-rw-r--r--doc/bugs/Possible_data-loss_if_WORM_keys_do_not_encode_relative_paths/comment_5_8378cd8c03fabdaa300194b66c1ea53c._comment16
-rw-r--r--doc/bugs/Possible_data-loss_if_WORM_keys_do_not_encode_relative_paths/comment_6_d3c9a1bee717b5b99f31be81150a3ec8._comment10
-rw-r--r--doc/bugs/Problem_setting_up_encrypted_repository_using_the_assistant_with___40__outside_of_git-annex__41___shared_pgp_key.mdwn387
-rw-r--r--doc/bugs/Problem_setting_up_encrypted_repository_using_the_assistant_with___40__outside_of_git-annex__41___shared_pgp_key/comment_1_c8e7be58222afff2a4c1df60f657d2ed._comment35
-rw-r--r--doc/bugs/Upload_to_S3_fails_.mdwn57
-rw-r--r--doc/bugs/Visual_glitch_while_xmpp_pairing.mdwn14
-rw-r--r--doc/bugs/Windows_build_has_hardcoded_paths.mdwn39
-rw-r--r--doc/bugs/Windows_build_has_hardcoded_paths/comment_1_03518523a823a89fbb97b6a57d650e2b._comment8
-rw-r--r--doc/bugs/Windows_build_has_hardcoded_paths/comment_2_58b856e19c8d5e59164b42399ba6b1fd._comment16
-rw-r--r--doc/bugs/Windows_build_has_hardcoded_paths/comment_3_f9543c0ca1ff81c4d495a01c77429ea8._comment9
-rw-r--r--doc/bugs/Windows_build_has_hardcoded_paths/comment_4_01096994c19b7d0df1cc6866d4f22e21._comment12
-rw-r--r--doc/bugs/Windows_build_has_hardcoded_paths/comment_5_0d7a4f740180dff7c0853062e4913804._comment22
-rw-r--r--doc/bugs/Windows_build_has_hardcoded_paths/comment_6_748aa921afee3d7e4667dee50e70a558._comment8
-rw-r--r--doc/bugs/__34__error:_invalid_object__34____44___after_add__59___cannot_commit.mdwn22
-rw-r--r--doc/bugs/__34__error:_invalid_object__34____44___after_add__59___cannot_commit/comment_10_8abfe7417167df54b686960319465a65._comment8
-rw-r--r--doc/bugs/__34__error:_invalid_object__34____44___after_add__59___cannot_commit/comment_1_2a64a2da445a64149da7335f35142a08._comment35
-rw-r--r--doc/bugs/__34__error:_invalid_object__34____44___after_add__59___cannot_commit/comment_2_decb1689b8cc2541077e2d0ae273b5e7._comment30
-rw-r--r--doc/bugs/__34__error:_invalid_object__34____44___after_add__59___cannot_commit/comment_3_1f6443e495cc16a13e2e4175e73dc8f1._comment27
-rw-r--r--doc/bugs/__34__error:_invalid_object__34____44___after_add__59___cannot_commit/comment_4_522020e71393434834def6c80b82e39e._comment16
-rw-r--r--doc/bugs/__34__error:_invalid_object__34____44___after_add__59___cannot_commit/comment_5_cc4cba022869b32d298cdafed9545a34._comment8
-rw-r--r--doc/bugs/__34__error:_invalid_object__34____44___after_add__59___cannot_commit/comment_6_e71b251db2ff1f52a40fec40303cdefc._comment15
-rw-r--r--doc/bugs/__34__error:_invalid_object__34____44___after_add__59___cannot_commit/comment_7_0b6413f9ca403be3d83bb3306d1e7f8f._comment8
-rw-r--r--doc/bugs/__34__error:_invalid_object__34____44___after_add__59___cannot_commit/comment_8_f951981f0bf8cbaecfc46e7b9c903d70._comment8
-rw-r--r--doc/bugs/__34__error:_invalid_object__34____44___after_add__59___cannot_commit/comment_9_7c98c8b291fdf28a09ccb6c7e4001d5a._comment22
-rw-r--r--doc/bugs/__34__old__34___and___34__new__34___hash_formats_are_mixed_up.mdwn31
-rw-r--r--doc/bugs/__34__old__34___and___34__new__34___hash_formats_are_mixed_up/comment_1_5ed3f7b21b007e269f5846cb2d805493._comment35
-rw-r--r--doc/bugs/__34__old__34___and___34__new__34___hash_formats_are_mixed_up/comment_2_436d8994457517e4c6f68f572b83decc._comment13
-rw-r--r--doc/bugs/__39__git_annex_get__39___returns_success_when_file_not_found.mdwn30
-rw-r--r--doc/bugs/annex-rsync-transport_ignored.mdwn30
-rw-r--r--doc/bugs/annex_tries_to_start_old_binaray.mdwn45
-rw-r--r--doc/bugs/annex_tries_to_start_old_binaray/comment_1_209c36b737a48a6136eeb85d1f3d01b3._comment10
-rw-r--r--doc/bugs/box.com.mdwn33
-rw-r--r--doc/bugs/cotinually_prompting_for_gpg_passphrase.mdwn77
-rw-r--r--doc/bugs/direct_command_leaves_repository_inconsistent_if_interrupted/comment_3_2acff7b667e8618251075031cbef6b9a._comment8
-rw-r--r--doc/bugs/direct_command_leaves_repository_inconsistent_if_interrupted/comment_4_c3a4a1ce24fcbe1087041850f490a58a._comment8
-rw-r--r--doc/bugs/git-annex_branch_shows_commit_with_looong_commitlog/comment_3_cbbeaa691d102bd7d29f5e9bad9d6f53._comment32
-rw-r--r--doc/bugs/git-annex_branch_shows_commit_with_looong_commitlog/comment_4_094191b806ac76b2aef325733fe37136._comment8
-rw-r--r--doc/bugs/git_annex_repair_fails_-___47__tmp__47__tmprepo.1__47__.git__47__gc.pid:_removeLink:_does_not_exist___40__No_such_file_or_directory__41__/comment_2_b8ee68b445c6a8d27121d90a2eeba0c7._comment10
-rw-r--r--doc/bugs/ssh_over_IPv6.mdwn29
-rw-r--r--doc/bugs/ssh_over_IPv6/comment_1_0287f73c44645a1f854ecfe4ddddb258._comment15
-rw-r--r--doc/bugs/ssh_over_IPv6/comment_2_cfa63d226ae411551a728af5ab043491._comment29
-rw-r--r--doc/bugs/tahoe_remote_has_no_repair.mdwn27
-rw-r--r--doc/bugs/too_many_open_files_on_OSX.mdwn42
-rw-r--r--doc/bugs/too_many_open_files_on_OSX/comment_1_ef23a3c05a6bd187450e10c524d2ced9._comment8
-rw-r--r--doc/bugs/too_many_open_files_on_OSX/comment_2_798a02e42bfce56c50c9337a8111a57f._comment8
-rw-r--r--doc/bugs/vicfg_and_description_often_not_propagated.mdwn152
-rw-r--r--doc/bugs/vicfg_and_description_often_not_propagated/comment_1_60c5ba2de0c8b9b4538a4abd146007f6._comment8
-rw-r--r--doc/bugs/webapp_missing_on_redhat.mdwn21
-rw-r--r--doc/bugs/webapp_on_windows_7_64_bit_fail_to_add_server_repo.mdwn76
-rw-r--r--doc/bugs/whereis_does_not_work_in_direct_mode.mdwn9
-rw-r--r--doc/bugs/whereis_does_not_work_in_direct_mode/comment_5_00926da970a20de67ba7719610f17142._comment12
-rw-r--r--doc/bugs/whereis_does_not_work_in_direct_mode/comment_6_7f68d9daa542f992c61b7b7c36819933._comment49
-rw-r--r--doc/builds.mdwn5
-rw-r--r--doc/contribute.mdwn3
-rw-r--r--doc/design/assistant/blog/day_232__headless_webapp/comment_5_7e51a197ff9970ae50cf47bd3a922257._comment18
-rw-r--r--doc/design/assistant/polls/Android_default_directory.mdwn2
-rw-r--r--doc/design/metadata.mdwn2
-rw-r--r--doc/design/roadmap.mdwn4
-rw-r--r--doc/devblog/day_216__various_minor_bugs/comment_2_6b06b3f46f20a6d2e60684d1d59fca07._comment8
-rw-r--r--doc/devblog/day_216__various_minor_bugs/comment_3_05177e2ed414d22711dcec57a614e38c._comment8
-rw-r--r--doc/devblog/day_217__autobuilders.mdwn10
-rw-r--r--doc/devblog/day_218__scary_locking.mdwn24
-rw-r--r--doc/devblog/day_219__catching_up_and_looking_back.mdwn109
-rw-r--r--doc/devblog/day_219__catching_up_and_looking_back/comment_1_16b13b2510183a9da5f960ae5765e581._comment10
-rw-r--r--doc/devblog/day_219__catching_up_and_looking_back/comment_2_460c064bebb5061fcba2a6c79f039362._comment19
-rw-r--r--doc/devblog/day_219__catching_up_and_looking_back/comment_3_9699d5a9de5ea64fbc876352e20261c4._comment8
-rw-r--r--doc/devblog/day_219__catching_up_and_looking_back/comment_4_23c4ede3db0ea8165311466881cfa6a2._comment10
-rw-r--r--doc/devblog/day_219__catching_up_and_looking_back/comment_5_7997305d7ec7db072b78dd0c31ecd824._comment8
-rw-r--r--doc/devblog/day_220__working_through_backlog.mdwn14
-rw-r--r--doc/download.mdwn5
-rw-r--r--doc/encryption.mdwn14
-rw-r--r--doc/forum/Attempting_to_repair_fails_with_everincreasing_deltas.mdwn21
-rw-r--r--doc/forum/Attempting_to_repair_fails_with_everincreasing_deltas/comment_1_a8effe196e4a040630d183803768c5a1._comment10
-rw-r--r--doc/forum/Attempting_to_repair_fails_with_everincreasing_deltas/comment_2_9f032e43b132bcad656e1337ab2551ad._comment10
-rw-r--r--doc/forum/Creating_a_more_secure_shared_encryption.mdwn7
-rw-r--r--doc/forum/Git_remote__63_____40__bitbucket__44___github__41__.mdwn1
-rw-r--r--doc/forum/Git_remote__63_____40__bitbucket__44___github__41__/comment_1_8a6de753ac0aa56f470b2aefca628388._comment10
-rw-r--r--doc/forum/How_do_I_sync_files_from_mobile_to_a_repo__63__.mdwn13
-rw-r--r--doc/forum/How_do_I_sync_files_from_mobile_to_a_repo__63__/comment_1_fc914b5998a09943fc8c1917a0e36096._comment8
-rw-r--r--doc/forum/How_do_I_sync_files_from_mobile_to_a_repo__63__/comment_2_fd5257eff7f94971557c031a94ac2766._comment8
-rw-r--r--doc/forum/How_do_I_sync_files_from_mobile_to_a_repo__63__/comment_3_5a11c45f92bae1328a5120945bee1fa0._comment36
-rw-r--r--doc/forum/How_do_I_sync_files_from_mobile_to_a_repo__63__/comment_4_404a8f9daa86c20a046b4c9f9051dfc0._comment16
-rw-r--r--doc/forum/How_do_I_sync_files_from_mobile_to_a_repo__63__/comment_5_3dcdaef370d0df38e7285f1fa11c6bb3._comment8
-rw-r--r--doc/forum/Local_and_remote_in_direct_mode/comment_2_90eeb2bffdb2db8032f9a0eac630ed56._comment8
-rw-r--r--doc/forum/Local_and_remote_in_direct_mode/comment_3_859ec2b3a8e938073b2099fdc5781109._comment8
-rw-r--r--doc/forum/Move_unsynced_file_in_direct_mode.mdwn97
-rw-r--r--doc/forum/Pusher_crashed__44___attempt_to_repair_hangs__44___broken_symlinks/comment_1_c89b64b0dc7c5a760a84a9d2cfd8982c._comment11
-rw-r--r--doc/forum/SSH_remote_transfers_queued_but_no_movement.mdwn3
-rw-r--r--doc/forum/Stale_keys_and_.cache_files_left_in_.git__47__annex__47__objects.mdwn39
-rw-r--r--doc/forum/Using_the_Git-Annex_Assistant_as_a_Backup_and_Syncing_Service.mdwn5
-rw-r--r--doc/forum/Web_app_on_server_without_X11__63__.mdwn3
-rw-r--r--doc/forum/Web_app_on_server_without_X11__63__/comment_1_bee409ad389e5fb5f3e8de4b5c68278d._comment10
-rw-r--r--doc/forum/Windows_installation_notes.mdwn146
-rw-r--r--doc/forum/adding_files_without_hashing_them.mdwn1
-rw-r--r--doc/forum/adding_files_without_hashing_them/comment_1_c3113d7aff6b64a325a32b8b281df605._comment12
-rw-r--r--doc/forum/annex_merge_creates___34__synced__47____42____34___branches.mdwn7
-rw-r--r--doc/forum/annex_merge_creates___34__synced__47____42____34___branches/comment_1_4667fadb05c594b0a212bf455ee65298._comment12
-rw-r--r--doc/forum/annex_merge_creates___34__synced__47____42____34___branches/comment_2_cb6971a766a28bd8c094d0b986272c65._comment11
-rw-r--r--doc/forum/annex_merge_creates___34__synced__47____42____34___branches/comment_3_1a0384edd20cc379e53fe7d7f650f7e2._comment8
-rw-r--r--doc/forum/armhf_binary/comment_2_743ecf263d1ec1bc4f24e32c0a178f2b._comment8
-rw-r--r--doc/forum/big_overhead.mdwn46
-rw-r--r--doc/forum/big_overhead/comment_10_d5f4e353e7f711d8c38cdcc222339bca._comment14
-rw-r--r--doc/forum/big_overhead/comment_11_cbf25217e4149f2cfad4e2bf94f2b4ca._comment8
-rw-r--r--doc/forum/big_overhead/comment_1_0c184520c30a89bd2604ab7c0eb7ac45._comment8
-rw-r--r--doc/forum/big_overhead/comment_2_13a017c6c84511894ded2d89d86eb541._comment10
-rw-r--r--doc/forum/big_overhead/comment_3_b4761cacc02396b5bdf34bcf3457cb91._comment10
-rw-r--r--doc/forum/big_overhead/comment_4_633f8538f368220eaca82b8bbfe9b49d._comment16
-rw-r--r--doc/forum/big_overhead/comment_5_599092b8d4f1fc8f378796328ef42931._comment8
-rw-r--r--doc/forum/big_overhead/comment_6_adb4b4e7eb4dac7760f3425bae6cbbc2._comment8
-rw-r--r--doc/forum/big_overhead/comment_7_a762eb55addf81c1c5350c7968598d0f._comment16
-rw-r--r--doc/forum/big_overhead/comment_8_4a66f57c6c0bdc6123618cb69a719be5._comment65
-rw-r--r--doc/forum/big_overhead/comment_9_5fa681ea0d6bd0dcac7142d40df9d54f._comment12
-rw-r--r--doc/forum/difference_between_full_backup_and_number_of_copies__63__.mdwn9
-rw-r--r--doc/forum/difference_between_full_backup_and_number_of_copies__63__/comment_1_df1850059a7a3006db7cb5c588dac3d7._comment8
-rw-r--r--doc/forum/gcrypt_os_x_app_vs_brew/comment_3_be4de1663a37f49a4e42d6b21c0178fe._comment10
-rw-r--r--doc/forum/git-annex_in_sane_language_for_mere_humans_of_us__63__.mdwn1
-rw-r--r--doc/forum/git-annex_in_sane_language_for_mere_humans_of_us__63__/comment_1_29eda7ec1519f339d5b3601559fe0bb0._comment14
-rw-r--r--doc/forum/git-annex_in_sane_language_for_mere_humans_of_us__63__/comment_2_a2b2183ee86377cdfef7c3acbe9552fb._comment11
-rw-r--r--doc/forum/git-annex_in_sane_language_for_mere_humans_of_us__63__/comment_3_5605d42a68b3140cb660eb710ce5031e._comment12
-rw-r--r--doc/forum/git-annex_in_sane_language_for_mere_humans_of_us__63__/comment_4_f56508164c71b2080150bc354e5de4b7._comment9
-rw-r--r--doc/forum/git-annex_in_sane_language_for_mere_humans_of_us__63__/comment_5_c8cdb0faa342fe1f9407ad4c97e6bc3c._comment10
-rw-r--r--doc/forum/git-annex_in_sane_language_for_mere_humans_of_us__63__/comment_6_25ce5eddeb1b65aacd5d86e09c3719b8._comment13
-rw-r--r--doc/forum/schedule_repository___91__expression__93__.mdwn1
-rw-r--r--doc/forum/schedule_repository___91__expression__93__/comment_1_b123b657a92897017973927e3e47673b._comment12
-rw-r--r--doc/forum/special_remote_for_IMAP/comment_4_0f8e01c453afb02aebf44b3fb2c9a7c1._comment8
-rw-r--r--doc/forum/usability:_creating_an_archive_on_a_new_external_drive.mdwn13
-rw-r--r--doc/forum/usability:_creating_an_archive_on_a_new_external_drive/comment_1_27b5283c65c402f330263426e4ca6ac1._comment10
-rw-r--r--doc/forum/usability:_creating_an_archive_on_a_new_external_drive/comment_2_b3a6b5ff0aaddd78903fc7bc7fbd6ee2._comment10
-rw-r--r--doc/future_proofing/comment_1_2614eb2e9b7b23fa9bb4251c0d025909._comment16
-rw-r--r--doc/git-annex.mdwn71
-rw-r--r--doc/install.mdwn12
-rw-r--r--doc/install/Linux_standalone.mdwn2
-rw-r--r--doc/install/OSX/porting.mdwn3
-rw-r--r--doc/install/Windows.mdwn3
-rw-r--r--doc/install/cabal.mdwn58
-rw-r--r--doc/install/fromscratch.mdwn27
-rw-r--r--doc/install/fromsource.mdwn74
-rw-r--r--doc/install/fromsource/comment_10_7ebe353b05d4df29897dc9a4f45c8a91._comment (renamed from doc/install/cabal/comment_10_7ebe353b05d4df29897dc9a4f45c8a91._comment)0
-rw-r--r--doc/install/fromsource/comment_11_0d06702e6e0ae3cd331cf748a9f6f273._comment (renamed from doc/install/cabal/comment_11_0d06702e6e0ae3cd331cf748a9f6f273._comment)0
-rw-r--r--doc/install/fromsource/comment_12_b93ca271dffca3f948645d3e1326c1d9._comment (renamed from doc/install/cabal/comment_12_b93ca271dffca3f948645d3e1326c1d9._comment)0
-rw-r--r--doc/install/fromsource/comment_13_3dac019cda71bf99878c0a1d9382323b._comment (renamed from doc/install/cabal/comment_13_3dac019cda71bf99878c0a1d9382323b._comment)0
-rw-r--r--doc/install/fromsource/comment_14_14b46470593f84f8c3768a91cb77bdab._comment (renamed from doc/install/cabal/comment_14_14b46470593f84f8c3768a91cb77bdab._comment)0
-rw-r--r--doc/install/fromsource/comment_15_c3a5b0aad28a90e0bb8da31a430578eb._comment (renamed from doc/install/cabal/comment_15_c3a5b0aad28a90e0bb8da31a430578eb._comment)0
-rw-r--r--doc/install/fromsource/comment_16_4faf214f97f9516898d7c17d743ef825._comment (renamed from doc/install/cabal/comment_16_4faf214f97f9516898d7c17d743ef825._comment)0
-rw-r--r--doc/install/fromsource/comment_17_2a9d6807a3a13815c824985521757167._comment (renamed from doc/install/cabal/comment_17_2a9d6807a3a13815c824985521757167._comment)0
-rw-r--r--doc/install/fromsource/comment_18_1efa0c7a963ec452fc6336fbe4964f6e._comment (renamed from doc/install/cabal/comment_18_1efa0c7a963ec452fc6336fbe4964f6e._comment)0
-rw-r--r--doc/install/fromsource/comment_19_6f42f9234f9ff6a2ca6bbb4d2643843e._comment (renamed from doc/install/cabal/comment_19_6f42f9234f9ff6a2ca6bbb4d2643843e._comment)0
-rw-r--r--doc/install/fromsource/comment_1_9d085e460553fa045999ab7cb945cdec._comment (renamed from doc/install/fromscratch/comment_1_9d085e460553fa045999ab7cb945cdec._comment)0
-rw-r--r--doc/install/fromsource/comment_1_f04df6bcd50d1d01eb34868bb00ac35c._comment (renamed from doc/install/cabal/comment_1_f04df6bcd50d1d01eb34868bb00ac35c._comment)0
-rw-r--r--doc/install/fromsource/comment_20_0f553be2a4c666e3bed58b2bce549406._comment (renamed from doc/install/cabal/comment_20_0f553be2a4c666e3bed58b2bce549406._comment)0
-rw-r--r--doc/install/fromsource/comment_21_f91a6ec21e96eced73ea9579fd8cbd15._comment (renamed from doc/install/cabal/comment_21_f91a6ec21e96eced73ea9579fd8cbd15._comment)0
-rw-r--r--doc/install/fromsource/comment_22_2f27b78215f97ade1986ca806c634cb3._comment (renamed from doc/install/cabal/comment_22_2f27b78215f97ade1986ca806c634cb3._comment)0
-rw-r--r--doc/install/fromsource/comment_23_c34d2b1d95830a3e58671a5b566a1758._comment (renamed from doc/install/cabal/comment_23_c34d2b1d95830a3e58671a5b566a1758._comment)0
-rw-r--r--doc/install/fromsource/comment_24_40cbde8ec067b3a860e6df1a9bea5f76._comment (renamed from doc/install/cabal/comment_24_40cbde8ec067b3a860e6df1a9bea5f76._comment)0
-rw-r--r--doc/install/fromsource/comment_25_8a7664e6f9271718dc607a0782366c5b._comment (renamed from doc/install/cabal/comment_25_8a7664e6f9271718dc607a0782366c5b._comment)0
-rw-r--r--doc/install/fromsource/comment_26_bd455c732639728bce2bfc39e32871d2._comment (renamed from doc/install/cabal/comment_26_bd455c732639728bce2bfc39e32871d2._comment)0
-rw-r--r--doc/install/fromsource/comment_27_c080e9239b6eec88d329c28da7bb4141._comment (renamed from doc/install/cabal/comment_27_c080e9239b6eec88d329c28da7bb4141._comment)0
-rw-r--r--doc/install/fromsource/comment_28_15951dd070a675300420eea137a28ef9._comment (renamed from doc/install/cabal/comment_28_15951dd070a675300420eea137a28ef9._comment)0
-rw-r--r--doc/install/fromsource/comment_29_ac082dca67f4a29b06070c0283130f52._comment (renamed from doc/install/cabal/comment_29_ac082dca67f4a29b06070c0283130f52._comment)0
-rw-r--r--doc/install/fromsource/comment_2_a69d17c55e56a707ec6606d5cdddee25._comment (renamed from doc/install/cabal/comment_2_a69d17c55e56a707ec6606d5cdddee25._comment)0
-rw-r--r--doc/install/fromsource/comment_2_b7954521d9ab40622b665f278dd72e17._comment (renamed from doc/install/fromscratch/comment_2_b7954521d9ab40622b665f278dd72e17._comment)0
-rw-r--r--doc/install/fromsource/comment_30_ad639c07cb79e89406e95c1dafce3a01._comment (renamed from doc/install/cabal/comment_30_ad639c07cb79e89406e95c1dafce3a01._comment)0
-rw-r--r--doc/install/fromsource/comment_31_4763b24a29627d55f465b9ea260ea7ec._comment (renamed from doc/install/cabal/comment_31_4763b24a29627d55f465b9ea260ea7ec._comment)0
-rw-r--r--doc/install/fromsource/comment_32_1d34c294486c85b1149675fa5861ae35._comment (renamed from doc/install/cabal/comment_32_1d34c294486c85b1149675fa5861ae35._comment)0
-rw-r--r--doc/install/fromsource/comment_33_8d4dfc33cada6091c30d3a43ce404b8b._comment (renamed from doc/install/cabal/comment_33_8d4dfc33cada6091c30d3a43ce404b8b._comment)0
-rw-r--r--doc/install/fromsource/comment_34_38451e751add6daf479b559c4b6a7c61._comment (renamed from doc/install/cabal/comment_34_38451e751add6daf479b559c4b6a7c61._comment)0
-rw-r--r--doc/install/fromsource/comment_35_4d44e4531e6686bd340f26836ad40026._comment (renamed from doc/install/cabal/comment_35_4d44e4531e6686bd340f26836ad40026._comment)0
-rw-r--r--doc/install/fromsource/comment_36_2a095a5af53a356bd29abd22a9cb1bea._comment (renamed from doc/install/cabal/comment_36_2a095a5af53a356bd29abd22a9cb1bea._comment)0
-rw-r--r--doc/install/fromsource/comment_37_f33e1a4575dccc20b0d3d7c00e6db709._comment (renamed from doc/install/cabal/comment_37_f33e1a4575dccc20b0d3d7c00e6db709._comment)0
-rw-r--r--doc/install/fromsource/comment_38_5c1e96221154a4ae4ebd636232044ced._comment (renamed from doc/install/cabal/comment_38_5c1e96221154a4ae4ebd636232044ced._comment)0
-rw-r--r--doc/install/fromsource/comment_39_a86057d7e6d47113330f79e1812c3a5d._comment10
-rw-r--r--doc/install/fromsource/comment_3_55bed050bdb768543dbe1b86edec057d._comment (renamed from doc/install/cabal/comment_3_55bed050bdb768543dbe1b86edec057d._comment)0
-rw-r--r--doc/install/fromsource/comment_3_a3bf3ce57ea73515a059267f25b816eb._comment (renamed from doc/install/fromscratch/comment_3_a3bf3ce57ea73515a059267f25b816eb._comment)0
-rw-r--r--doc/install/fromsource/comment_45_d9cccbb9620cc8218e72b5380fd89a05._comment8
-rw-r--r--doc/install/fromsource/comment_46_954de34275d33bc4590927f911761563._comment10
-rw-r--r--doc/install/fromsource/comment_4_2ff7f8a3b03bea7e860248829d595bd1._comment (renamed from doc/install/cabal/comment_4_2ff7f8a3b03bea7e860248829d595bd1._comment)0
-rw-r--r--doc/install/fromsource/comment_4_765334858ef1eedff2c5d89ed42aa7f6._comment37
-rw-r--r--doc/install/fromsource/comment_5_4aea55dc5b24d84e0953382ccfea1a01._comment12
-rw-r--r--doc/install/fromsource/comment_5_8789fc27466714faa5a3a7a6b8ec6e5d._comment (renamed from doc/install/cabal/comment_5_8789fc27466714faa5a3a7a6b8ec6e5d._comment)0
-rw-r--r--doc/install/fromsource/comment_6_5afb2d081e8b603bc338cd460ad9317d._comment (renamed from doc/install/cabal/comment_6_5afb2d081e8b603bc338cd460ad9317d._comment)0
-rw-r--r--doc/install/fromsource/comment_7_129c4f2e404c874e5adfa52902a81104._comment (renamed from doc/install/cabal/comment_7_129c4f2e404c874e5adfa52902a81104._comment)0
-rw-r--r--doc/install/fromsource/comment_8_738c108f131e3aab0d720bc4fd6a81fd._comment (renamed from doc/install/cabal/comment_8_738c108f131e3aab0d720bc4fd6a81fd._comment)0
-rw-r--r--doc/install/fromsource/comment_9_5ddbba419d96a7411f7edddaa4d7b739._comment (renamed from doc/install/cabal/comment_9_5ddbba419d96a7411f7edddaa4d7b739._comment)0
-rw-r--r--doc/internals/comment_3_5a26ee5aab274f321a4ea6f8527f53bd._comment12
-rw-r--r--doc/news/version_5.20140606.mdwn14
-rw-r--r--doc/news/version_5.20140613.mdwn16
-rw-r--r--doc/news/version_5.20140707.mdwn23
-rw-r--r--doc/news/version_5.20140817.mdwn42
-rw-r--r--doc/news/version_5.20140831.mdwn13
-rw-r--r--doc/news/version_5.20140915.mdwn27
-rw-r--r--doc/not.mdwn2
-rw-r--r--doc/related_software.mdwn4
-rw-r--r--doc/tips/emacs_integration.mdwn4
-rw-r--r--doc/tips/megaannex/comment_2_c1158b7ec15646d64cae8215ce845642._comment10
-rw-r--r--doc/tips/metadata_driven_views/comment_3_196f55e52a5d8a8f061603ab87ad04ad._comment18
-rw-r--r--doc/tips/using_Amazon_S3/comment_5_6b288e06010bedbb71e0afed6b427704._comment8
-rw-r--r--doc/tips/using_Amazon_S3/comment_6_3b6c74b40ea666389ac04b52ab0819a0._comment10
-rw-r--r--doc/tips/using_Amazon_S3/comment_7_cf6755d88463878f2ea6e4c300899027._comment33
-rw-r--r--doc/tips/using_gitolite_with_git-annex/comment_22_90ead0e1fe8615fe11f6f1bd7dcd7e84._comment13
-rw-r--r--doc/todo/merge_in_ram___40__disk__41____63__.mdwn8
-rw-r--r--doc/todo/windows_support/comment_12_0775dc22516cfa8c5e7deea954084947._comment18
-rw-r--r--doc/todo/wishlist:_provide_a_config_option_for_using_new_hashing_scheme_in_non-bare_remotes.mdwn5
-rw-r--r--git-annex.cabal19
-rwxr-xr-xstandalone/linux/install-haskell-packages3
-rw-r--r--standalone/no-th/haskell-patches/file-embed_remove-TH.patch40
-rw-r--r--standalone/no-th/haskell-patches/yesod-form_spliced-TH.patch1470
278 files changed, 6515 insertions, 1192 deletions
diff --git a/Annex.hs b/Annex.hs
index b915e852b..a04bfd1bb 100644
--- a/Annex.hs
+++ b/Annex.hs
@@ -15,6 +15,7 @@ module Annex (
eval,
getState,
changeState,
+ withState,
setFlag,
setField,
setOutput,
@@ -214,6 +215,11 @@ changeState modifier = do
mvar <- ask
liftIO $ modifyMVar_ mvar $ return . modifier
+withState :: (AnnexState -> (AnnexState, b)) -> Annex b
+withState modifier = do
+ mvar <- ask
+ liftIO $ modifyMVar mvar $ return . modifier
+
{- Sets a flag to True -}
setFlag :: String -> Annex ()
setFlag flag = changeState $ \s ->
diff --git a/Annex/CatFile.hs b/Annex/CatFile.hs
index 2f8c43079..8b4d746e1 100644
--- a/Annex/CatFile.hs
+++ b/Annex/CatFile.hs
@@ -12,6 +12,7 @@ module Annex.CatFile (
catTree,
catObjectDetails,
catFileHandle,
+ catFileStop,
catKey,
catKeyFile,
catKeyFileHEAD,
@@ -71,6 +72,14 @@ catFileHandle = do
Annex.changeState $ \s -> s { Annex.catfilehandles = m' }
return h
+{- Stops all running cat-files. Should only be run when it's known that
+ - nothing is using the handles, eg at shutdown. -}
+catFileStop :: Annex ()
+catFileStop = do
+ m <- Annex.withState $ \s ->
+ (s { Annex.catfilehandles = M.empty }, Annex.catfilehandles s)
+ liftIO $ mapM_ Git.CatFile.catFileStop (M.elems m)
+
{- From the Sha or Ref of a symlink back to the key.
-
- Requires a mode witness, to guarantee that the file is a symlink.
diff --git a/Annex/Content.hs b/Annex/Content.hs
index b51e15827..c0c79ae56 100644
--- a/Annex/Content.hs
+++ b/Annex/Content.hs
@@ -56,10 +56,7 @@ import Annex.Perms
import Annex.Link
import Annex.Content.Direct
import Annex.ReplaceFile
-
-#ifdef mingw32_HOST_OS
-import Utility.WinLock
-#endif
+import Utility.LockFile
{- Checks if a given key's content is currently present. -}
inAnnex :: Key -> Annex Bool
@@ -104,25 +101,21 @@ inAnnexSafe key = inAnnex' (fromMaybe False) (Just False) go key
=<< contentLockFile key
#ifndef mingw32_HOST_OS
- checkindirect f = liftIO $ openforlock f >>= check is_missing
+ checkindirect contentfile = liftIO $ checkOr is_missing contentfile
{- In direct mode, the content file must exist, but
- - the lock file often generally won't exist unless a removal is in
- - process. This does not create the lock file, it only checks for
- - it. -}
+ - the lock file generally won't exist unless a removal is in
+ - process. -}
checkdirect contentfile lockfile = liftIO $
ifM (doesFileExist contentfile)
- ( openforlock lockfile >>= check is_unlocked
+ ( checkOr is_unlocked lockfile
, return is_missing
)
- openforlock f = catchMaybeIO $
- openFd f ReadOnly Nothing defaultFileFlags
- check _ (Just h) = do
- v <- getLock h (ReadLock, AbsoluteSeek, 0, 0)
- closeFd h
+ checkOr def lockfile = do
+ v <- checkLocked lockfile
return $ case v of
- Just _ -> is_locked
- Nothing -> is_unlocked
- check def Nothing = return def
+ Nothing -> def
+ Just True -> is_locked
+ Just False -> is_unlocked
#else
checkindirect f = liftIO $ ifM (doesFileExist f)
( do
@@ -159,14 +152,20 @@ contentLockFile key = ifM isDirect
, return Nothing
)
+newtype ContentLock = ContentLock Key
+
{- Content is exclusively locked while running an action that might remove
- - it. (If the content is not present, no locking is done.) -}
-lockContent :: Key -> Annex a -> Annex a
+ - it. (If the content is not present, no locking is done.)
+ -}
+lockContent :: Key -> (ContentLock -> Annex a) -> Annex a
lockContent key a = do
contentfile <- calcRepo $ gitAnnexLocation key
lockfile <- contentLockFile key
maybe noop setuplockfile lockfile
- bracket (liftIO $ lock contentfile lockfile) (unlock lockfile) (const a)
+ bracket
+ (lock contentfile lockfile)
+ (unlock lockfile)
+ (const $ a $ ContentLock key)
where
alreadylocked = error "content is locked"
setuplockfile lockfile = modifyContent lockfile $
@@ -176,17 +175,17 @@ lockContent key a = do
void $ liftIO $ tryIO $
nukeFile lockfile
#ifndef mingw32_HOST_OS
- lock contentfile Nothing = opencontentforlock contentfile >>= dolock
- lock _ (Just lockfile) = openforlock lockfile >>= dolock . Just
+ lock contentfile Nothing = liftIO $
+ opencontentforlock contentfile >>= dolock
+ lock _ (Just lockfile) = do
+ mode <- annexFileMode
+ liftIO $ createLockFile mode lockfile >>= dolock . Just
{- Since content files are stored with the write bit disabled, have
- to fiddle with permissions to open for an exclusive lock. -}
- opencontentforlock f = catchMaybeIO $ ifM (doesFileExist f)
- ( withModifiedFileMode f
+ opencontentforlock f = catchDefaultIO Nothing $
+ withModifiedFileMode f
(`unionFileModes` ownerWriteMode)
- (openforlock f)
- , openforlock f
- )
- openforlock f = openFd f ReadWrite Nothing defaultFileFlags
+ (openExistingLockFile f)
dolock Nothing = return Nothing
dolock (Just fd) = do
v <- tryIO $ setLock fd (WriteLock, AbsoluteSeek, 0, 0)
@@ -197,7 +196,8 @@ lockContent key a = do
maybe noop cleanuplockfile mlockfile
liftIO $ maybe noop closeFd mfd
#else
- lock _ (Just lockfile) = maybe alreadylocked (return . Just) =<< lockExclusive lockfile
+ lock _ (Just lockfile) = liftIO $
+ maybe alreadylocked (return . Just) =<< lockExclusive lockfile
lock _ Nothing = return Nothing
unlock mlockfile mlockhandle = do
liftIO $ maybe noop dropLock mlockhandle
@@ -377,7 +377,7 @@ sendAnnex key rollback sendobject = go =<< prepSendAnnex key
)
{- Returns a file that contains an object's content,
- - and an check to run after the transfer is complete.
+ - and a check to run after the transfer is complete.
-
- In direct mode, it's possible for the file to change as it's being sent,
- and the check detects this case and returns False.
@@ -432,9 +432,10 @@ cleanObjectLoc key cleaner = do
{- Removes a key's file from .git/annex/objects/
-
- In direct mode, deletes the associated files or files, and replaces
- - them with symlinks. -}
-removeAnnex :: Key -> Annex ()
-removeAnnex key = withObjectLoc key remove removedirect
+ - them with symlinks.
+ -}
+removeAnnex :: ContentLock -> Annex ()
+removeAnnex (ContentLock key) = withObjectLoc key remove removedirect
where
remove file = cleanObjectLoc key $ do
secureErase file
@@ -579,7 +580,7 @@ preseedTmp key file = go =<< inAnnex key
( return True
, do
s <- calcRepo $ gitAnnexLocation key
- liftIO $ copyFileExternal s file
+ liftIO $ copyFileExternal CopyTimeStamps s file
)
{- Blocks writing to an annexed file, and modifies file permissions to
diff --git a/Annex/Content/Direct.hs b/Annex/Content/Direct.hs
index b249e0557..d9e1535f3 100644
--- a/Annex/Content/Direct.hs
+++ b/Annex/Content/Direct.hs
@@ -210,7 +210,7 @@ addContentWhenNotPresent key contentfile associatedfile = do
v <- isAnnexLink associatedfile
when (Just key == v) $
replaceFile associatedfile $
- liftIO . void . copyFileExternal contentfile
+ liftIO . void . copyFileExternal CopyAllMetaData contentfile
updateInodeCache key associatedfile
{- Some filesystems get new inodes each time they are mounted.
diff --git a/Annex/Direct.hs b/Annex/Direct.hs
index 7b91cc342..76a6f27dc 100644
--- a/Annex/Direct.hs
+++ b/Annex/Direct.hs
@@ -357,7 +357,7 @@ toDirectGen k f = do
`catchIO` (\_ -> freezeContent loc)
fromdirect loc = do
replaceFile f $
- liftIO . void . copyFileExternal loc
+ liftIO . void . copyFileExternal CopyAllMetaData loc
updateInodeCache k f
{- Removes a direct mode file, while retaining its content in the annex
diff --git a/Annex/Init.hs b/Annex/Init.hs
index 637b130ee..2f7b66fbc 100644
--- a/Annex/Init.hs
+++ b/Annex/Init.hs
@@ -23,8 +23,11 @@ import qualified Git.LsFiles
import qualified Git.Config
import qualified Git.Construct
import qualified Git.Types as Git
+import qualified Git.Objects
import qualified Annex.Branch
import Logs.UUID
+import Logs.Trust.Basic
+import Types.TrustLevel
import Annex.Version
import Annex.UUID
import Config
@@ -70,6 +73,7 @@ initialize mdescription = do
Annex.Branch.create
describeUUID u =<< genDescription mdescription
+-- Everything except for uuid setup.
initialize' :: Annex ()
initialize' = do
checkFifoSupport
@@ -87,6 +91,7 @@ initialize' = do
switchHEADBack
)
createInodeSentinalFile
+ checkSharedClone
uninitialize :: Annex ()
uninitialize = do
@@ -242,3 +247,10 @@ checkBadBare = allM (not <$>)
where
hasPreCommitHook = inRepo $ doesFileExist . hookFile preCommitHook
hasDotGitHEAD = inRepo $ \r -> doesFileExist $ Git.localGitDir r </> "HEAD"
+
+checkSharedClone :: Annex ()
+checkSharedClone = whenM (inRepo Git.Objects.isSharedClone) $ do
+ showSideAction "Repository was cloned with --shared; setting annex.hardlink=true and making repository untrusted."
+ u <- getUUID
+ trustSet u UnTrusted
+ setConfig (annexConfig "hardlink") (Git.Config.boolConfig True)
diff --git a/Annex/LockFile.hs b/Annex/LockFile.hs
index dc4f82f98..75047e005 100644
--- a/Annex/LockFile.hs
+++ b/Annex/LockFile.hs
@@ -19,13 +19,10 @@ import Annex
import Types.LockPool
import qualified Git
import Annex.Perms
+import Utility.LockFile
import qualified Data.Map as M
-#ifdef mingw32_HOST_OS
-import Utility.WinLock
-#endif
-
{- Create a specified lock file, and takes a shared lock, which is retained
- in the pool. -}
lockFileShared :: FilePath -> Annex ()
@@ -35,9 +32,7 @@ lockFileShared file = go =<< fromLockPool file
go Nothing = do
#ifndef mingw32_HOST_OS
mode <- annexFileMode
- lockhandle <- liftIO $ noUmask mode $
- openFd file ReadOnly (Just mode) defaultFileFlags
- liftIO $ waitToSetLock lockhandle (ReadLock, AbsoluteSeek, 0, 0)
+ lockhandle <- liftIO $ noUmask mode $ lockShared (Just mode) file
#else
lockhandle <- liftIO $ waitToLock $ lockShared file
#endif
@@ -47,11 +42,7 @@ unlockFile :: FilePath -> Annex ()
unlockFile file = maybe noop go =<< fromLockPool file
where
go lockhandle = do
-#ifndef mingw32_HOST_OS
- liftIO $ closeFd lockhandle
-#else
liftIO $ dropLock lockhandle
-#endif
changeLockPool $ M.delete file
getLockPool :: Annex LockPool
@@ -72,15 +63,10 @@ withExclusiveLock getlockfile a = do
lockfile <- fromRepo getlockfile
createAnnexDirectory $ takeDirectory lockfile
mode <- annexFileMode
- bracketIO (lock lockfile mode) unlock (const a)
+ bracketIO (lock mode lockfile) dropLock (const a)
where
#ifndef mingw32_HOST_OS
- lock lockfile mode = do
- l <- noUmask mode $ createFile lockfile mode
- waitToSetLock l (WriteLock, AbsoluteSeek, 0, 0)
- return l
- unlock = closeFd
+ lock mode = noUmask mode . lockExclusive (Just mode)
#else
- lock lockfile _mode = waitToLock $ lockExclusive lockfile
- unlock = dropLock
+ lock _mode = waitToLock . lockExclusive
#endif
diff --git a/Annex/Ssh.hs b/Annex/Ssh.hs
index 246ac338d..ad636b4aa 100644
--- a/Annex/Ssh.hs
+++ b/Annex/Ssh.hs
@@ -35,6 +35,7 @@ import Config.Files
import Utility.Env
import Types.CleanupActions
import Annex.Index (addGitEnv)
+import Utility.LockFile
#ifndef mingw32_HOST_OS
import Annex.Perms
#endif
@@ -151,14 +152,12 @@ sshCleanup = mapM_ cleanup =<< enumSocketFiles
let lockfile = socket2lock socketfile
unlockFile lockfile
mode <- annexFileMode
- fd <- liftIO $ noUmask mode $
- openFd lockfile ReadWrite (Just mode) defaultFileFlags
- v <- liftIO $ tryIO $
- setLock fd (WriteLock, AbsoluteSeek, 0, 0)
+ v <- liftIO $ noUmask mode $ tryLockExclusive (Just mode) lockfile
case v of
- Left _ -> noop
- Right _ -> forceStopSsh socketfile
- liftIO $ closeFd fd
+ Nothing -> noop
+ Just lck -> do
+ forceStopSsh socketfile
+ liftIO $ dropLock lck
#else
forceStopSsh socketfile
#endif
diff --git a/Annex/Transfer.hs b/Annex/Transfer.hs
index 5e98a87d9..d33d3073b 100644
--- a/Annex/Transfer.hs
+++ b/Annex/Transfer.hs
@@ -23,7 +23,7 @@ import Annex.Notification as X
import Annex.Perms
import Utility.Metered
#ifdef mingw32_HOST_OS
-import Utility.WinLock
+import Utility.LockFile
#endif
import Control.Concurrent
@@ -81,10 +81,13 @@ runTransfer' ignorelock t file shouldretry a = do
case mfd of
Nothing -> return (Nothing, False)
Just fd -> do
+ setFdOption fd CloseOnExec True
locked <- catchMaybeIO $
setLock fd (WriteLock, AbsoluteSeek, 0, 0)
if isNothing locked
- then return (Nothing, True)
+ then do
+ closeFd fd
+ return (Nothing, True)
else do
void $ tryIO $ writeTransferInfoFile info tfile
return (mfd, False)
diff --git a/Annex/Url.hs b/Annex/Url.hs
index 397a7910b..736905d33 100644
--- a/Annex/Url.hs
+++ b/Annex/Url.hs
@@ -26,7 +26,7 @@ getUserAgent = Annex.getState $
Just . fromMaybe defaultUserAgent . Annex.useragent
getUrlOptions :: Annex U.UrlOptions
-getUrlOptions = U.UrlOptions
+getUrlOptions = mkUrlOptions
<$> getUserAgent
<*> headers
<*> options
diff --git a/Assistant/Threads/SanityChecker.hs b/Assistant/Threads/SanityChecker.hs
index dce2c2db7..3371f212f 100644
--- a/Assistant/Threads/SanityChecker.hs
+++ b/Assistant/Threads/SanityChecker.hs
@@ -21,7 +21,9 @@ import Assistant.Drop
import Assistant.Ssh
import Assistant.TransferQueue
import Assistant.Types.UrlRenderer
+import Assistant.Restart
import qualified Annex.Branch
+import qualified Git
import qualified Git.LsFiles
import qualified Git.Command.Batch
import qualified Git.Config
@@ -146,6 +148,8 @@ waitForNextCheck = do
- will block the watcher. -}
dailyCheck :: UrlRenderer -> Assistant Bool
dailyCheck urlrenderer = do
+ checkRepoExists
+
g <- liftAnnex gitRepo
batchmaker <- liftIO getBatchCommandMaker
@@ -203,6 +207,7 @@ dailyCheck urlrenderer = do
hourlyCheck :: Assistant ()
hourlyCheck = do
+ checkRepoExists
#ifndef mingw32_HOST_OS
checkLogSize 0
#else
@@ -316,3 +321,9 @@ cleanOld check f = go =<< catchMaybeIO getmtime
getmtime = realToFrac . modificationTime <$> getSymbolicLinkStatus f
go (Just mtime) | check mtime = nukeFile f
go _ = noop
+
+checkRepoExists :: Assistant ()
+checkRepoExists = do
+ g <- liftAnnex gitRepo
+ liftIO $ unlessM (doesDirectoryExist $ Git.repoPath g) $
+ terminateSelf
diff --git a/Assistant/Unused.hs b/Assistant/Unused.hs
index 3ad98c12e..c2c10b048 100644
--- a/Assistant/Unused.hs
+++ b/Assistant/Unused.hs
@@ -77,7 +77,7 @@ expireUnused duration = do
forM_ oldkeys $ \k -> do
debug ["removing old unused key", key2file k]
liftAnnex $ do
- removeAnnex k
+ lockContent k removeAnnex
logStatus k InfoMissing
where
boundry = durationToPOSIXTime <$> duration
diff --git a/Backend/WORM.hs b/Backend/WORM.hs
index 6ba513960..de7779bb3 100644
--- a/Backend/WORM.hs
+++ b/Backend/WORM.hs
@@ -12,6 +12,7 @@ import Types.Backend
import Types.Key
import Types.KeySource
import Backend.Utilities
+import Git.FilePath
backends :: [Backend]
backends = [backend]
@@ -27,16 +28,13 @@ backend = Backend
}
{- The key includes the file size, modification time, and the
- - basename of the filename.
- -
- - That allows multiple files with the same names to have different keys,
- - while also allowing a file to be moved around while retaining the
- - same key.
+ - original filename relative to the top of the git repository.
-}
keyValue :: KeySource -> Annex (Maybe Key)
keyValue source = do
stat <- liftIO $ getFileStatus $ contentLocation source
- n <- genKeyName $ takeFileName $ keyFilename source
+ relf <- getTopFilePath <$> inRepo (toTopFilePath $ keyFilename source)
+ n <- genKeyName relf
return $ Just $ stubKey
{ keyName = n
, keyBackendName = name backend
diff --git a/Build/Configure.hs b/Build/Configure.hs
index d5176bdf5..31b7ccd25 100644
--- a/Build/Configure.hs
+++ b/Build/Configure.hs
@@ -23,6 +23,7 @@ tests =
, TestCase "git version" getGitVersion
, testCp "cp_a" "-a"
, testCp "cp_p" "-p"
+ , testCp "cp_preserve_timestamps" "--preserve=timestamps"
, testCp "cp_reflink_auto" "--reflink=auto"
, TestCase "xargs -0" $ requireCmd "xargs_0" "xargs -0 </dev/null"
, TestCase "rsync" $ requireCmd "rsync" "rsync --version >/dev/null"
diff --git a/Build/LinuxMkLibs.hs b/Build/LinuxMkLibs.hs
index 3db724b0a..1ca2fa651 100644
--- a/Build/LinuxMkLibs.hs
+++ b/Build/LinuxMkLibs.hs
@@ -82,7 +82,7 @@ symToHardLink f = whenM (isSymbolicLink <$> getSymbolicLinkStatus f) $ do
installFile :: FilePath -> FilePath -> IO ()
installFile top f = do
createDirectoryIfMissing True destdir
- void $ copyFileExternal f destdir
+ void $ copyFileExternal CopyTimeStamps f destdir
where
destdir = inTop top $ parentDir f
diff --git a/CmdLine.hs b/CmdLine.hs
index a165b041a..606390130 100644
--- a/CmdLine.hs
+++ b/CmdLine.hs
@@ -6,6 +6,7 @@
-}
{-# LANGUAGE CPP #-}
+{-# LANGUAGE BangPatterns #-}
module CmdLine (
dispatch,
@@ -25,6 +26,7 @@ import Common.Annex
import qualified Annex
import qualified Git
import qualified Git.AutoCorrect
+import qualified Git.Config
import Annex.Content
import Annex.Environment
import Command
@@ -34,30 +36,34 @@ import Types.Messages
dispatch :: Bool -> CmdParams -> [Command] -> [Option] -> [(String, String)] -> String -> IO Git.Repo -> IO ()
dispatch fuzzyok allargs allcmds commonoptions fields header getgitrepo = do
setupConsole
- r <- E.try getgitrepo :: IO (Either E.SomeException Git.Repo)
- case r of
- Left e -> maybe (throw e) (\a -> a params) (cmdnorepo cmd)
- Right g -> do
- state <- Annex.new g
- Annex.eval state $ do
- checkEnvironment
- checkfuzzy
- forM_ fields $ uncurry Annex.setField
- when (cmdnomessages cmd) $
- Annex.setOutput QuietOutput
- sequence_ flags
- whenM (annexDebug <$> Annex.getGitConfig) $
- liftIO enableDebugOutput
- startup
- performCommandAction cmd params
- shutdown $ cmdnocommit cmd
+ case getOptCmd args cmd commonoptions of
+ Right (flags, params) -> go flags params
+ =<< (E.try getgitrepo :: IO (Either E.SomeException Git.Repo))
+ Left parseerr -> error parseerr
where
+ go flags params (Right g) = do
+ state <- Annex.new g
+ Annex.eval state $ do
+ checkEnvironment
+ when fuzzy $
+ inRepo $ autocorrect . Just
+ forM_ fields $ uncurry Annex.setField
+ when (cmdnomessages cmd) $
+ Annex.setOutput QuietOutput
+ sequence_ flags
+ whenM (annexDebug <$> Annex.getGitConfig) $
+ liftIO enableDebugOutput
+ startup
+ performCommandAction cmd params
+ shutdown $ cmdnocommit cmd
+ go _flags params (Left e) = do
+ when fuzzy $
+ autocorrect =<< Git.Config.global
+ maybe (throw e) (\a -> a params) (cmdnorepo cmd)
err msg = msg ++ "\n\n" ++ usage header allcmds
cmd = Prelude.head cmds
(fuzzy, cmds, name, args) = findCmd fuzzyok allargs allcmds err
- (flags, params) = getOptCmd args cmd commonoptions
- checkfuzzy = when fuzzy $
- inRepo $ Git.AutoCorrect.prepare name cmdname cmds
+ autocorrect = Git.AutoCorrect.prepare name cmdname cmds
{- Parses command line params far enough to find the Command to run, and
- returns the remaining params.
@@ -81,12 +87,12 @@ findCmd fuzzyok argv cmds err
{- Parses command line options, and returns actions to run to configure flags
- and the remaining parameters for the command. -}
-getOptCmd :: CmdParams -> Command -> [Option] -> ([Annex ()], CmdParams)
+getOptCmd :: CmdParams -> Command -> [Option] -> Either String ([Annex ()], CmdParams)
getOptCmd argv cmd commonoptions = check $
getOpt Permute (commonoptions ++ cmdoptions cmd) argv
where
- check (flags, rest, []) = (flags, rest)
- check (_, _, errs) = error $ unlines
+ check (flags, rest, []) = Right (flags, rest)
+ check (_, _, errs) = Left $ unlines
[ concat errs
, commandUsage cmd
]
diff --git a/CmdLine/GitAnnex.hs b/CmdLine/GitAnnex.hs
index 80a784dd7..d27866030 100644
--- a/CmdLine/GitAnnex.hs
+++ b/CmdLine/GitAnnex.hs
@@ -96,8 +96,8 @@ import qualified Command.XMPPGit
#endif
import qualified Command.RemoteDaemon
#endif
-#ifdef WITH_TESTSUITE
import qualified Command.Test
+#ifdef WITH_TESTSUITE
import qualified Command.FuzzTest
import qualified Command.TestRemote
#endif
@@ -188,8 +188,8 @@ cmds = concat
#endif
, Command.RemoteDaemon.def
#endif
-#ifdef WITH_TESTSUITE
, Command.Test.def
+#ifdef WITH_TESTSUITE
, Command.FuzzTest.def
, Command.TestRemote.def
#endif
diff --git a/CmdLine/Seek.hs b/CmdLine/Seek.hs
index 431b2e118..397a48118 100644
--- a/CmdLine/Seek.hs
+++ b/CmdLine/Seek.hs
@@ -189,10 +189,9 @@ seekHelper :: ([FilePath] -> Git.Repo -> IO ([FilePath], IO Bool)) -> [FilePath]
seekHelper a params = do
ll <- inRepo $ \g ->
runSegmentPaths (\fs -> Git.Command.leaveZombie <$> a fs g) params
- {- Show warnings only for files/directories that do not exist. -}
forM_ (map fst $ filter (null . snd) $ zip params ll) $ \p ->
unlessM (isJust <$> liftIO (catchMaybeIO $ getSymbolicLinkStatus p)) $
- fileNotFound p
+ error $ p ++ " not found"
return $ concat ll
notSymlink :: FilePath -> IO Bool
diff --git a/Command/Add.hs b/Command/Add.hs
index 5c7054543..e2b6d04fe 100644
--- a/Command/Add.hs
+++ b/Command/Add.hs
@@ -75,14 +75,19 @@ start file = ifAnnexed file addpresent add
showStart "add" file
next $ perform file
addpresent key = ifM isDirect
- ( ifM (goodContent key file) ( stop , add )
+ ( do
+ ms <- liftIO $ catchMaybeIO $ getSymbolicLinkStatus file
+ case ms of
+ Just s | isSymbolicLink s -> fixup key
+ _ -> ifM (goodContent key file) ( stop , add )
, fixup key
)
fixup key = do
- -- fixup from an interrupted add; the symlink
- -- is present but not yet added to git
+ -- the annexed symlink is present but not yet added to git
showStart "add" file
liftIO $ removeFile file
+ whenM isDirect $
+ void $ addAssociatedFile key file
next $ next $ cleanup file key Nothing =<< inAnnex key
{- The file that's being added is locked down before a key is generated,
diff --git a/Command/Drop.hs b/Command/Drop.hs
index 4bac07a53..cf63d2bc7 100644
--- a/Command/Drop.hs
+++ b/Command/Drop.hs
@@ -55,8 +55,12 @@ startRemote afile numcopies key remote = do
showStart' ("drop " ++ Remote.name remote) key afile
next $ performRemote key afile numcopies remote
+-- Note that lockContent is called before checking if the key is present
+-- on enough remotes to allow removal. This avoids a scenario where two
+-- or more remotes are trying to remove a key at the same time, and each
+-- see the key is present on the other.
performLocal :: Key -> AssociatedFile -> NumCopies -> Maybe Remote -> CommandPerform
-performLocal key afile numcopies knownpresentremote = lockContent key $ do
+performLocal key afile numcopies knownpresentremote = lockContent key $ \contentlock -> do
(remotes, trusteduuids) <- Remote.keyPossibilitiesTrusted key
let trusteduuids' = case knownpresentremote of
Nothing -> trusteduuids
@@ -66,7 +70,7 @@ performLocal key afile numcopies knownpresentremote = lockContent key $ do
u <- getUUID
ifM (canDrop u key afile numcopies trusteduuids' tocheck [])
( do
- removeAnnex key
+ removeAnnex contentlock
notifyDrop afile True
next $ cleanupLocal key
, do
@@ -75,7 +79,7 @@ performLocal key afile numcopies knownpresentremote = lockContent key $ do
)
performRemote :: Key -> AssociatedFile -> NumCopies -> Remote -> CommandPerform
-performRemote key afile numcopies remote = lockContent key $ do
+performRemote key afile numcopies remote = do
-- Filter the remote it's being dropped from out of the lists of
-- places assumed to have the key, and places to check.
-- When the local repo has the key, that's one additional copy,
diff --git a/Command/DropKey.hs b/Command/DropKey.hs
index 125e6ded4..8ca41bdb6 100644
--- a/Command/DropKey.hs
+++ b/Command/DropKey.hs
@@ -28,8 +28,8 @@ start key = stopUnless (inAnnex key) $ do
next $ perform key
perform :: Key -> CommandPerform
-perform key = lockContent key $ do
- removeAnnex key
+perform key = lockContent key $ \contentlock -> do
+ removeAnnex contentlock
next $ cleanup key
cleanup :: Key -> CommandCleanup
diff --git a/Command/Import.hs b/Command/Import.hs
index db3601a1b..97e3f7652 100644
--- a/Command/Import.hs
+++ b/Command/Import.hs
@@ -90,7 +90,7 @@ start mode (srcfile, destfile) =
handleexisting =<< liftIO (catchMaybeIO $ getSymbolicLinkStatus destfile)
liftIO $ createDirectoryIfMissing True (parentDir destfile)
liftIO $ if mode == Duplicate || mode == SkipDuplicates
- then void $ copyFileExternal srcfile destfile
+ then void $ copyFileExternal CopyAllMetaData srcfile destfile
else moveFile srcfile destfile
Command.Add.perform destfile
handleexisting Nothing = noop
diff --git a/Command/Move.hs b/Command/Move.hs
index 3d9646dea..c3d641edd 100644
--- a/Command/Move.hs
+++ b/Command/Move.hs
@@ -91,7 +91,7 @@ expectedPresent dest key = do
return $ dest `elem` remotes
toPerform :: Remote -> Bool -> Key -> AssociatedFile -> Bool -> Either String Bool -> CommandPerform
-toPerform dest move key afile fastcheck isthere = moveLock move key $
+toPerform dest move key afile fastcheck isthere = do
case isthere of
Left err -> do
showNote err
@@ -115,8 +115,8 @@ toPerform dest move key afile fastcheck isthere = moveLock move key $
finish
where
finish
- | move = do
- removeAnnex key
+ | move = lockContent key $ \contentlock -> do
+ removeAnnex contentlock
next $ Command.Drop.cleanupLocal key
| otherwise = next $ return True
@@ -150,11 +150,10 @@ fromOk src key = go =<< Annex.getState Annex.force
return $ u /= Remote.uuid src && elem src remotes
fromPerform :: Remote -> Bool -> Key -> AssociatedFile -> CommandPerform
-fromPerform src move key afile = moveLock move key $
- ifM (inAnnex key)
- ( dispatch move True
- , dispatch move =<< go
- )
+fromPerform src move key afile = ifM (inAnnex key)
+ ( dispatch move True
+ , dispatch move =<< go
+ )
where
go = notifyTransfer Download afile $
download (Remote.uuid src) key afile noRetry $ \p -> do
@@ -165,9 +164,3 @@ fromPerform src move key afile = moveLock move key $
dispatch True True = do -- finish moving
ok <- Remote.removeKey src key
next $ Command.Drop.cleanupRemote key src ok
-
-{- Locks a key in order for it to be moved.
- - No lock is needed when a key is being copied. -}
-moveLock :: Bool -> Key -> Annex a -> Annex a
-moveLock True key a = lockContent key a
-moveLock False _ a = a
diff --git a/Command/PreCommit.hs b/Command/PreCommit.hs
index 09ff042aa..355e2766e 100644
--- a/Command/PreCommit.hs
+++ b/Command/PreCommit.hs
@@ -18,16 +18,12 @@ import Annex.Direct
import Annex.Hook
import Annex.View
import Annex.View.ViewedFile
-import Annex.Perms
+import Annex.LockFile
import Logs.View
import Logs.MetaData
import Types.View
import Types.MetaData
-#ifdef mingw32_HOST_OS
-import Utility.WinLock
-#endif
-
import qualified Data.Set as S
def :: [Command]
@@ -92,19 +88,4 @@ showMetaDataChange = showLongNote . unlines . concatMap showmeta . fromMetaData
{- Takes exclusive lock; blocks until available. -}
lockPreCommitHook :: Annex a -> Annex a
-lockPreCommitHook a = do
- lockfile <- fromRepo gitAnnexPreCommitLock
- createAnnexDirectory $ takeDirectory lockfile
- mode <- annexFileMode
- bracketIO (lock lockfile mode) unlock (const a)
- where
-#ifndef mingw32_HOST_OS
- lock lockfile mode = do
- l <- liftIO $ noUmask mode $ createFile lockfile mode
- liftIO $ waitToSetLock l (WriteLock, AbsoluteSeek, 0, 0)
- return l
- unlock = closeFd
-#else
- lock lockfile _mode = liftIO $ waitToLock $ lockExclusive lockfile
- unlock = dropLock
-#endif
+lockPreCommitHook = withExclusiveLock gitAnnexPreCommitLock
diff --git a/Command/SendKey.hs b/Command/SendKey.hs
index 6b5127aca..13e585fc6 100644
--- a/Command/SendKey.hs
+++ b/Command/SendKey.hs
@@ -44,7 +44,7 @@ fieldTransfer :: Direction -> Key -> (MeterUpdate -> Annex Bool) -> CommandStart
fieldTransfer direction key a = do
afile <- Fields.getField Fields.associatedFile
ok <- maybe (a $ const noop)
- (\u -> runTransfer (Transfer direction (toUUID u) key) afile noRetry a)
+ (\u -> runner (Transfer direction (toUUID u) key) afile noRetry a)
=<< Fields.getField Fields.remoteUUID
liftIO $ exitBool ok
where
diff --git a/Command/Sync.hs b/Command/Sync.hs
index 50c6fbe69..6a6a254b3 100644
--- a/Command/Sync.hs
+++ b/Command/Sync.hs
@@ -122,22 +122,22 @@ syncRemotes rs = ifM (Annex.getState Annex.fast) ( nub <$> pickfast , wanted )
fastest = fromMaybe [] . headMaybe . Remote.byCost
commit :: CommandStart
-commit = next $ next $ ifM isDirect
- ( do
- showStart "commit" ""
- void stageDirect
- void preCommitDirect
- commitStaged Git.Branch.ManualCommit commitmessage
- , do
- showStart "commit" ""
- Annex.Branch.commit "update"
- inRepo $ Git.Branch.commitQuiet Git.Branch.ManualCommit
- [ Param "-a"
- , Param "-m"
- , Param commitmessage
- ]
- return True
- )
+commit = next $ next $ do
+ showStart "commit" ""
+ Annex.Branch.commit "update"
+ ifM isDirect
+ ( do
+ void stageDirect
+ void preCommitDirect
+ commitStaged Git.Branch.ManualCommit commitmessage
+ , do
+ inRepo $ Git.Branch.commitQuiet Git.Branch.ManualCommit
+ [ Param "-a"
+ , Param "-m"
+ , Param commitmessage
+ ]
+ return True
+ )
where
commitmessage = "git-annex automatic sync"
diff --git a/Command/TestRemote.hs b/Command/TestRemote.hs
index 3e1933d21..247a243e4 100644
--- a/Command/TestRemote.hs
+++ b/Command/TestRemote.hs
@@ -114,7 +114,7 @@ test st r k =
, check "storeKey when already present" store
, present True
, check "retrieveKeyFile" $ do
- removeAnnex k
+ lockContent k removeAnnex
get
, check "fsck downloaded object" fsck
, check "retrieveKeyFile resume from 33%" $ do
@@ -124,20 +124,20 @@ test st r k =
sz <- hFileSize h
L.hGet h $ fromInteger $ sz `div` 3
liftIO $ L.writeFile tmp partial
- removeAnnex k
+ lockContent k removeAnnex
get
, check "fsck downloaded object" fsck
, check "retrieveKeyFile resume from 0" $ do
tmp <- prepTmp k
liftIO $ writeFile tmp ""
- removeAnnex k
+ lockContent k removeAnnex
get
, check "fsck downloaded object" fsck
, check "retrieveKeyFile resume from end" $ do
loc <- Annex.calcRepo (gitAnnexLocation k)
tmp <- prepTmp k
- void $ liftIO $ copyFileExternal loc tmp
- removeAnnex k
+ void $ liftIO $ copyFileExternal CopyAllMetaData loc tmp
+ lockContent k removeAnnex
get
, check "fsck downloaded object" fsck
, check "removeKey when present" remove
@@ -183,7 +183,7 @@ testUnavailable st r k =
cleanup :: [Remote] -> [Key] -> Bool -> CommandCleanup
cleanup rs ks ok = do
forM_ rs $ \r -> forM_ ks (Remote.removeKey r)
- forM_ ks removeAnnex
+ forM_ ks $ \k -> lockContent k removeAnnex
return ok
chunkSizes :: Int -> Bool -> [Int]
diff --git a/Command/Unannex.hs b/Command/Unannex.hs
index 9cb88564c..c105eb9ce 100644
--- a/Command/Unannex.hs
+++ b/Command/Unannex.hs
@@ -89,7 +89,7 @@ cleanupIndirect file key = do
)
where
copyfrom src =
- thawContent file `after` liftIO (copyFileExternal src file)
+ thawContent file `after` liftIO (copyFileExternal CopyAllMetaData src file)
hardlinkfrom src =
#ifndef mingw32_HOST_OS
-- creating a hard link could fall; fall back to copying
diff --git a/Command/Uninit.hs b/Command/Uninit.hs
index 4433de6d0..3f57782fc 100644
--- a/Command/Uninit.hs
+++ b/Command/Uninit.hs
@@ -103,7 +103,7 @@ removeUnannexed = go []
go c [] = return c
go c (k:ks) = ifM (inAnnexCheck k $ liftIO . enoughlinks)
( do
- removeAnnex k
+ lockContent k removeAnnex
go c ks
, go (k:c) ks
)
diff --git a/Command/Unlock.hs b/Command/Unlock.hs
index 19a1b258f..02704e805 100644
--- a/Command/Unlock.hs
+++ b/Command/Unlock.hs
@@ -46,7 +46,7 @@ perform dest key = do
tmpdest <- fromRepo $ gitAnnexTmpObjectLocation key
liftIO $ createDirectoryIfMissing True (parentDir tmpdest)
showAction "copying"
- ifM (liftIO $ copyFileExternal src tmpdest)
+ ifM (liftIO $ copyFileExternal CopyAllMetaData src tmpdest)
( do
liftIO $ do
removeFile dest
diff --git a/Command/Unused.hs b/Command/Unused.hs
index bf98e53bc..c2179447d 100644
--- a/Command/Unused.hs
+++ b/Command/Unused.hs
@@ -189,7 +189,12 @@ bloomBitsHashes :: Annex (Int, Int)
bloomBitsHashes = do
capacity <- bloomCapacity
accuracy <- bloomAccuracy
- return $ suggestSizing capacity (1/ fromIntegral accuracy)
+ case safeSuggestSizing capacity (1 / fromIntegral accuracy) of
+ Left e -> do
+ warning $ "bloomfilter " ++ e ++ "; falling back to sane value"
+ -- precaulculated value for 500000 (1/1000)
+ return (8388608,10)
+ Right v -> return v
{- Creates a bloom filter, and runs an action, such as withKeysReferenced,
- to populate it.
diff --git a/Git/AutoCorrect.hs b/Git/AutoCorrect.hs
index aa8379849..ecc64e036 100644
--- a/Git/AutoCorrect.hs
+++ b/Git/AutoCorrect.hs
@@ -41,9 +41,9 @@ fuzzymatches input showchoice choices = fst $ unzip $
{- Takes action based on git's autocorrect configuration, in preparation for
- an autocorrected command being run. -}
-prepare :: String -> (c -> String) -> [c] -> Repo -> IO ()
+prepare :: String -> (c -> String) -> [c] -> Maybe Repo -> IO ()
prepare input showmatch matches r =
- case readish $ Git.Config.get "help.autocorrect" "0" r of
+ case readish . Git.Config.get "help.autocorrect" "0" =<< r of
Just n
| n == 0 -> list
| n < 0 -> warn
diff --git a/Git/Objects.hs b/Git/Objects.hs
index 516aa6d3e..dadd4f543 100644
--- a/Git/Objects.hs
+++ b/Git/Objects.hs
@@ -33,3 +33,17 @@ looseObjectFile :: Repo -> Sha -> FilePath
looseObjectFile r sha = objectsDir r </> prefix </> rest
where
(prefix, rest) = splitAt 2 (fromRef sha)
+
+listAlternates :: Repo -> IO [FilePath]
+listAlternates r = catchDefaultIO [] (lines <$> readFile alternatesfile)
+ where
+ alternatesfile = objectsDir r </> "info" </> "alternates"
+
+{- A repository recently cloned with --shared will have one or more
+ - alternates listed, and contain no loose objects or packs. -}
+isSharedClone :: Repo -> IO Bool
+isSharedClone r = allM id
+ [ not . null <$> listAlternates r
+ , null <$> listLooseObjectShas r
+ , null <$> listPackFiles r
+ ]
diff --git a/Git/Remote.hs b/Git/Remote.hs
index 9d969c416..7573c87ee 100644
--- a/Git/Remote.hs
+++ b/Git/Remote.hs
@@ -102,7 +102,13 @@ parseRemoteLocation s repo = ret $ calcloc s
&& not ("::" `isInfixOf` v)
scptourl v = "ssh://" ++ host ++ slash dir
where
- (host, dir) = separate (== ':') v
+ (host, dir)
+ -- handle ipv6 address inside []
+ | "[" `isPrefixOf` v = case break (== ']') v of
+ (h, ']':':':d) -> (h ++ "]", d)
+ (h, ']':d) -> (h ++ "]", d)
+ (h, d) -> (h, d)
+ | otherwise = separate (== ':') v
slash d | d == "" = "/~/" ++ d
| "/" `isPrefixOf` d = d
| "~" `isPrefixOf` d = '/':d
diff --git a/Logs/Transfer.hs b/Logs/Transfer.hs
index b6279ccba..16c3ebb68 100644
--- a/Logs/Transfer.hs
+++ b/Logs/Transfer.hs
@@ -17,9 +17,7 @@ import Utility.Metered
import Utility.Percentage
import Utility.QuickCheck
import Utility.PID
-#ifdef mingw32_HOST_OS
-import Utility.WinLock
-#endif
+import Utility.LockFile
import Data.Time.Clock
import Data.Time.Clock.POSIX
@@ -131,19 +129,12 @@ checkTransfer :: Transfer -> Annex (Maybe TransferInfo)
checkTransfer t = do
tfile <- fromRepo $ transferFile t
#ifndef mingw32_HOST_OS
- mode <- annexFileMode
- mfd <- liftIO $ catchMaybeIO $
- openFd (transferLockFile tfile) ReadOnly (Just mode) defaultFileFlags
- case mfd of
- Nothing -> return Nothing -- failed to open file; not running
- Just fd -> do
- locked <- liftIO $
- getLock fd (WriteLock, AbsoluteSeek, 0, 0)
- liftIO $ closeFd fd
- case locked of
- Nothing -> return Nothing
- Just (pid, _) -> liftIO $ catchDefaultIO Nothing $
- readTransferInfoFile (Just pid) tfile
+ liftIO $ do
+ v <- getLockStatus (transferLockFile tfile)
+ case v of
+ Just (pid, _) -> catchDefaultIO Nothing $
+ readTransferInfoFile (Just pid) tfile
+ Nothing -> return Nothing
#else
v <- liftIO $ lockShared $ transferLockFile tfile
liftIO $ case v of
diff --git a/Logs/Trust.hs b/Logs/Trust.hs
index c6f0ad3ab..047a728f4 100644
--- a/Logs/Trust.hs
+++ b/Logs/Trust.hs
@@ -11,7 +11,6 @@ module Logs.Trust (
TrustLevel(..),
trustGet,
trustMap,
- trustSet,
trustPartition,
trustExclude,
lookupTrust,
@@ -20,17 +19,15 @@ module Logs.Trust (
) where
import qualified Data.Map as M
-import Data.Time.Clock.POSIX
import Common.Annex
import Types.TrustLevel
import qualified Annex.Branch
import qualified Annex
import Logs
-import Logs.UUIDBased
import Remote.List
import qualified Types.Remote
-import Logs.Trust.Pure as X
+import Logs.Trust.Basic as X
{- Returns a list of UUIDs that the trustLog indicates have the
- specified trust level.
@@ -39,17 +36,6 @@ import Logs.Trust.Pure as X
trustGet :: TrustLevel -> Annex [UUID]
trustGet level = M.keys . M.filter (== level) <$> trustMap
-{- Changes the trust level for a uuid in the trustLog. -}
-trustSet :: UUID -> TrustLevel -> Annex ()
-trustSet uuid@(UUID _) level = do
- ts <- liftIO getPOSIXTime
- Annex.Branch.change trustLog $
- showLog showTrustLog .
- changeLog ts uuid level .
- parseLog (Just . parseTrustLog)
- Annex.changeState $ \s -> s { Annex.trustmap = Nothing }
-trustSet NoUUID _ = error "unknown UUID; cannot modify"
-
{- Returns the TrustLevel of a given repo UUID. -}
lookupTrust :: UUID -> Annex TrustLevel
lookupTrust u = (fromMaybe SemiTrusted . M.lookup u) <$> trustMap
diff --git a/Logs/Trust/Basic.hs b/Logs/Trust/Basic.hs
new file mode 100644
index 000000000..646e2e037
--- /dev/null
+++ b/Logs/Trust/Basic.hs
@@ -0,0 +1,32 @@
+{- git-annex trust log, basics
+ -
+ - Copyright 2010-2012 Joey Hess <joey@kitenet.net>
+ -
+ - Licensed under the GNU GPL version 3 or higher.
+ -}
+
+module Logs.Trust.Basic (
+ module X,
+ trustSet,
+) where
+
+import Data.Time.Clock.POSIX
+
+import Common.Annex
+import Types.TrustLevel
+import qualified Annex.Branch
+import qualified Annex
+import Logs
+import Logs.UUIDBased
+import Logs.Trust.Pure as X
+
+{- Changes the trust level for a uuid in the trustLog. -}
+trustSet :: UUID -> TrustLevel -> Annex ()
+trustSet uuid@(UUID _) level = do
+ ts <- liftIO getPOSIXTime
+ Annex.Branch.change trustLog $
+ showLog showTrustLog .
+ changeLog ts uuid level .
+ parseLog (Just . parseTrustLog)
+ Annex.changeState $ \s -> s { Annex.trustmap = Nothing }
+trustSet NoUUID _ = error "unknown UUID; cannot modify"
diff --git a/Makefile b/Makefile
index d8aad6b9b..99ccdeadb 100644
--- a/Makefile
+++ b/Makefile
@@ -218,7 +218,7 @@ android: Build/EvilSplicer
sed -i 's/^ Build-Depends: / Build-Depends: yesod-routes, yesod-core, shakespeare-css, shakespeare-js, shakespeare, blaze-markup, file-embed, wai-app-static, /' tmp/androidtree/git-annex.cabal
# Avoid warnings due to sometimes unused imports added for the splices.
sed -i 's/GHC-Options: \(.*\)-Wall/GHC-Options: \1-Wall -fno-warn-unused-imports /i' tmp/androidtree/git-annex.cabal
- sed -i 's/Extensions: /Extensions: MagicHash /i' tmp/no-th-tree/git-annex.cabal
+ sed -i 's/Extensions: /Extensions: MagicHash /i' tmp/androidtree/git-annex.cabal
# Cabal cannot cross compile with custom build type, so workaround.
sed -i 's/Build-type: Custom/Build-type: Simple/' tmp/androidtree/git-annex.cabal
# Build just once, but link twice, for 2 different versions of Android.
diff --git a/Messages.hs b/Messages.hs
index f27755f3a..3ffa14814 100644
--- a/Messages.hs
+++ b/Messages.hs
@@ -25,7 +25,6 @@ module Messages (
showErr,
warning,
warningIO,
- fileNotFound,
indent,
maybeShowJSON,
showFullJSON,
@@ -45,7 +44,6 @@ import System.Log.Logger
import System.Log.Formatter
import System.Log.Handler (setFormatter, LogHandler)
import System.Log.Handler.Simple
-import qualified Data.Set as S
import Common hiding (handle)
import Types
@@ -172,18 +170,6 @@ warningIO w = do
hFlush stdout
hPutStrLn stderr w
-{- Displays a warning one time about a file the user specified not existing. -}
-fileNotFound :: FilePath -> Annex ()
-fileNotFound file = do
- st <- Annex.getState Annex.output
- let shown = fileNotFoundShown st
- when (S.notMember file shown) $ do
- let shown' = S.insert file shown
- let st' = st { fileNotFoundShown = shown' }
- Annex.changeState $ \s -> s { Annex.output = st' }
- liftIO $ hPutStrLn stderr $ unwords
- [ "git-annex:", file, "not found" ]
-
indent :: String -> String
indent = intercalate "\n" . map (\l -> " " ++ l) . lines
diff --git a/Remote/Git.hs b/Remote/Git.hs
index 5416a5cda..6397c1a2e 100644
--- a/Remote/Git.hs
+++ b/Remote/Git.hs
@@ -51,6 +51,7 @@ import qualified Remote.Helper.Ssh as Ssh
import qualified Remote.GCrypt
import Config.Files
import Creds
+import Annex.CatFile
import Control.Concurrent
import Control.Concurrent.MSampleVar
@@ -338,8 +339,8 @@ dropKey r key
commitOnCleanup r $ onLocal r $ do
ensureInitialized
whenM (Annex.Content.inAnnex key) $ do
- Annex.Content.lockContent key $
- Annex.Content.removeAnnex key
+ Annex.Content.lockContent key
+ Annex.Content.removeAnnex
logStatus key InfoMissing
Annex.Content.saveState True
return True
@@ -354,15 +355,27 @@ copyFromRemote' r key file dest
| not $ Git.repoIsUrl (repo r) = guardUsable (repo r) (return False) $ do
params <- Ssh.rsyncParams r Download
u <- getUUID
+ hardlink <- annexHardLink <$> Annex.getGitConfig
-- run copy from perspective of remote
onLocal r $ do
ensureInitialized
v <- Annex.Content.prepSendAnnex key
case v of
Nothing -> return False
- Just (object, checksuccess) ->
- runTransfer (Transfer Download u key) file noRetry
- (rsyncOrCopyFile params object dest)
+ Just (object, checksuccess) -> do
+ let copier = rsyncOrCopyFile params object dest
+#ifndef mingw32_HOST_OS
+ let linker = createLink object dest >> return True
+ go <- ifM (pure hardlink <&&> not <$> isDirect)
+ ( return $ \m -> liftIO (catchBoolIO linker)
+ <||> copier m
+ , return copier
+ )
+#else
+ let go = copier
+#endif
+ runTransfer (Transfer Download u key)
+ file noRetry go
<&&> checksuccess
| Git.repoIsSsh (repo r) = feedprogressback $ \feeder -> do
direct <- isDirect
@@ -500,6 +513,8 @@ repairRemote r a = return $ do
{- Runs an action from the perspective of a local remote.
-
- The AnnexState is cached for speed and to avoid resource leaks.
+ - However, catFileStop is called to avoid git-cat-file processes hanging
+ - around on removable media.
-
- The repository's git-annex branch is not updated, as an optimisation.
- No caller of onLocal can query data from the branch and be ensured
@@ -520,7 +535,8 @@ onLocal r a = do
cache st = Annex.changeState $ \s -> s
{ Annex.remoteannexstate = M.insert (uuid r) st (Annex.remoteannexstate s) }
go st a' = do
- (ret, st') <- liftIO $ Annex.run st a'
+ (ret, st') <- liftIO $ Annex.run st $
+ catFileStop `after` a'
cache st'
return ret
@@ -539,7 +555,7 @@ rsyncOrCopyFile rsyncparams src dest p =
docopy = liftIO $ bracket
(forkIO $ watchfilesize zeroBytesProcessed)
(void . tryIO . killThread)
- (const $ copyFileExternal src dest)
+ (const $ copyFileExternal CopyTimeStamps src dest)
watchfilesize oldsz = do
threadDelay 500000 -- 0.5 seconds
v <- catchMaybeIO $
diff --git a/Remote/Helper/Hooks.hs b/Remote/Helper/Hooks.hs
index 907400bd1..529c35d3f 100644
--- a/Remote/Helper/Hooks.hs
+++ b/Remote/Helper/Hooks.hs
@@ -16,10 +16,9 @@ import Types.Remote
import Types.CleanupActions
import qualified Annex
import Annex.LockFile
+import Utility.LockFile
#ifndef mingw32_HOST_OS
import Annex.Perms
-#else
-import Utility.WinLock
#endif
{- Modifies a remote's access functions to first run the
@@ -84,19 +83,12 @@ runHooks r starthook stophook a = do
unlockFile lck
#ifndef mingw32_HOST_OS
mode <- annexFileMode
- fd <- liftIO $ noUmask mode $
- openFd lck ReadWrite (Just mode) defaultFileFlags
- v <- liftIO $ tryIO $
- setLock fd (WriteLock, AbsoluteSeek, 0, 0)
- case v of
- Left _ -> noop
- Right _ -> run stophook
- liftIO $ closeFd fd
+ v <- liftIO $ noUmask mode $ tryLockExclusive (Just mode) lck
#else
v <- liftIO $ lockExclusive lck
+#endif
case v of
Nothing -> noop
Just lockhandle -> do
run stophook
liftIO $ dropLock lockhandle
-#endif
diff --git a/Remote/Rsync.hs b/Remote/Rsync.hs
index f7b3461a0..698d733e6 100644
--- a/Remote/Rsync.hs
+++ b/Remote/Rsync.hs
@@ -92,7 +92,7 @@ gen r u c gc = do
genRsyncOpts :: RemoteConfig -> RemoteGitConfig -> [CommandParam] -> RsyncUrl -> RsyncOpts
genRsyncOpts c gc transport url = RsyncOpts
{ rsyncUrl = url
- , rsyncOptions = opts []
+ , rsyncOptions = transport ++ opts []
, rsyncUploadOptions = transport ++ opts (remoteAnnexRsyncUploadOptions gc)
, rsyncDownloadOptions = transport ++ opts (remoteAnnexRsyncDownloadOptions gc)
, rsyncShellEscape = M.lookup "shellescape" c /= Just "no"
diff --git a/Remote/WebDAV.hs b/Remote/WebDAV.hs
index bb8b4cc06..d427d67a9 100644
--- a/Remote/WebDAV.hs
+++ b/Remote/WebDAV.hs
@@ -183,7 +183,7 @@ testDav url (Just (u, p)) = do
test $ liftIO $ evalDAVT url $ do
prepDAV user pass
makeParentDirs
- inLocation tmpDir $ void mkCol
+ void $ mkColRecursive tmpDir
inLocation (tmpLocation "git-annex-test") $ do
putContentM (Nothing, L.empty)
delContentM
diff --git a/Test.hs b/Test.hs
index 9a34835cc..825c01879 100644
--- a/Test.hs
+++ b/Test.hs
@@ -17,9 +17,6 @@ import Test.Tasty.Ingredients.Rerun
import Data.Monoid
import Options.Applicative hiding (command)
-#if MIN_VERSION_optparse_applicative(0,8,0)
-import qualified Options.Applicative.Types as Opt
-#endif
import qualified Data.Map as M
import qualified Text.JSON
@@ -115,17 +112,17 @@ main ps = do
exitFailure
)
where
- progdesc = "git-annex test"
parseOpts pprefs pinfo args =
-#if MIN_VERSION_optparse_applicative(0,8,0)
- pure $ case execParserPure pprefs pinfo args of
- Opt.Success v -> v
- Opt.Failure f -> error $ fst $ Opt.execFailure f progdesc
- Opt.CompletionInvoked _ -> error "completion not supported"
+#if MIN_VERSION_optparse_applicative(0,10,0)
+ case execParserPure pprefs pinfo args of
+ (Options.Applicative.Failure failure) -> do
+ let (msg, _exit) = renderFailure failure progdesc
+ error msg
+ v -> handleParseResult v
#else
- either (error <=< flip errMessage progdesc) return $
- execParserPure pprefs pinfo args
+ handleParseResult $ execParserPure pprefs pinfo args
#endif
+ progdesc = "git-annex test"
ingredients :: [Ingredient]
ingredients =
diff --git a/Types/GitConfig.hs b/Types/GitConfig.hs
index 29a7c9019..deae1df37 100644
--- a/Types/GitConfig.hs
+++ b/Types/GitConfig.hs
@@ -52,6 +52,7 @@ data GitConfig = GitConfig
, annexGenMetaData :: Bool
, annexListen :: Maybe String
, annexStartupScan :: Bool
+ , annexHardLink :: Bool
, coreSymlinks :: Bool
, gcryptId :: Maybe String
}
@@ -87,6 +88,7 @@ extractGitConfig r = GitConfig
, annexGenMetaData = getbool (annex "genmetadata") False
, annexListen = getmaybe (annex "listen")
, annexStartupScan = getbool (annex "startupscan") True
+ , annexHardLink = getbool (annex "hardlink") False
, coreSymlinks = getbool "core.symlinks" True
, gcryptId = getmaybe "core.gcrypt-id"
}
diff --git a/Types/LockPool.hs b/Types/LockPool.hs
index dd392f28b..c7d411cdc 100644
--- a/Types/LockPool.hs
+++ b/Types/LockPool.hs
@@ -5,20 +5,12 @@
- Licensed under the GNU GPL version 3 or higher.
-}
-{-# LANGUAGE CPP #-}
-
module Types.LockPool (
LockPool,
LockHandle
) where
import qualified Data.Map as M
-
-#ifndef mingw32_HOST_OS
-import System.Posix.Types (Fd)
-type LockHandle = Fd
-#else
-import Utility.WinLock -- defines LockHandle
-#endif
+import Utility.LockFile
type LockPool = M.Map FilePath LockHandle
diff --git a/Types/Messages.hs b/Types/Messages.hs
index 4fcce79f8..2196028e3 100644
--- a/Types/Messages.hs
+++ b/Types/Messages.hs
@@ -7,8 +7,6 @@
module Types.Messages where
-import qualified Data.Set as S
-
data OutputType = NormalOutput | QuietOutput | JSONOutput
data SideActionBlock = NoBlock | StartBlock | InBlock
@@ -17,8 +15,7 @@ data SideActionBlock = NoBlock | StartBlock | InBlock
data MessageState = MessageState
{ outputType :: OutputType
, sideActionBlock :: SideActionBlock
- , fileNotFoundShown :: S.Set FilePath
}
defaultMessageState :: MessageState
-defaultMessageState = MessageState NormalOutput NoBlock S.empty
+defaultMessageState = MessageState NormalOutput NoBlock
diff --git a/Utility/Bloom.hs b/Utility/Bloom.hs
index e3000de3d..b0988a8c4 100644
--- a/Utility/Bloom.hs
+++ b/Utility/Bloom.hs
@@ -9,7 +9,7 @@
module Utility.Bloom (
Bloom,
- suggestSizing,
+ safeSuggestSizing,
Hashable,
cheapHashes,
notElemB,
@@ -25,7 +25,7 @@ import qualified Data.BloomFilter as Bloom
#else
import qualified Data.BloomFilter as Bloom
#endif
-import Data.BloomFilter.Easy (suggestSizing, Bloom)
+import Data.BloomFilter.Easy (safeSuggestSizing, Bloom)
import Data.BloomFilter.Hash (Hashable, cheapHashes)
import Control.Monad.ST.Safe (ST)
diff --git a/Utility/CopyFile.hs b/Utility/CopyFile.hs
index e3ccd0a2b..6601d0a80 100644
--- a/Utility/CopyFile.hs
+++ b/Utility/CopyFile.hs
@@ -1,6 +1,6 @@
{- file copying
-
- - Copyright 2010-2013 Joey Hess <joey@kitenet.net>
+ - Copyright 2010-2014 Joey Hess <joey@kitenet.net>
-
- License: BSD-2-clause
-}
@@ -9,16 +9,20 @@
module Utility.CopyFile (
copyFileExternal,
- createLinkOrCopy
+ createLinkOrCopy,
+ CopyMetaData(..)
) where
import Common
import qualified Build.SysConfig as SysConfig
+data CopyMetaData = CopyTimeStamps | CopyAllMetaData
+ deriving (Eq)
+
{- The cp command is used, because I hate reinventing the wheel,
- and because this allows easy access to features like cp --reflink. -}
-copyFileExternal :: FilePath -> FilePath -> IO Bool
-copyFileExternal src dest = do
+copyFileExternal :: CopyMetaData -> FilePath -> FilePath -> IO Bool
+copyFileExternal meta src dest = do
whenM (doesFileExist dest) $
removeFile dest
boolSystem "cp" $ params ++ [File src, File dest]
@@ -26,12 +30,16 @@ copyFileExternal src dest = do
#ifndef __ANDROID__
params = map snd $ filter fst
[ (SysConfig.cp_reflink_auto, Param "--reflink=auto")
- , (SysConfig.cp_a, Param "-a")
- , (SysConfig.cp_p && not SysConfig.cp_a, Param "-p")
+ , (allmeta && SysConfig.cp_a, Param "-a")
+ , (allmeta && SysConfig.cp_p && not SysConfig.cp_a
+ , Param "-p")
+ , (not allmeta && SysConfig.cp_preserve_timestamps
+ , Param "--preserve=timestamps")
]
#else
params = []
#endif
+ allmeta = meta == CopyAllMetaData
{- Create a hard link if the filesystem allows it, and fall back to copying
- the file. -}
@@ -42,7 +50,7 @@ createLinkOrCopy src dest = go `catchIO` const fallback
go = do
createLink src dest
return True
- fallback = copyFileExternal src dest
+ fallback = copyFileExternal CopyAllMetaData src dest
#else
-createLinkOrCopy = copyFileExternal
+createLinkOrCopy = copyFileExternal CopyAllMetaData
#endif
diff --git a/Utility/Daemon.hs b/Utility/Daemon.hs
index 228263911..2f0f84179 100644
--- a/Utility/Daemon.hs
+++ b/Utility/Daemon.hs
@@ -15,7 +15,7 @@ import Utility.PID
import Utility.LogFile
#else
import Utility.WinProcess
-import Utility.WinLock
+import Utility.LockFile
#endif
#ifndef mingw32_HOST_OS
diff --git a/Utility/Gpg.hs b/Utility/Gpg.hs
index 69a47c78f..f9b60f276 100644
--- a/Utility/Gpg.hs
+++ b/Utility/Gpg.hs
@@ -163,8 +163,9 @@ type UserId = String
{- All of the user's secret keys, with their UserIds.
- Note that the UserId may be empty. -}
secretKeys :: IO (M.Map KeyId UserId)
-secretKeys = M.fromList . parse . lines <$> readStrict params
+secretKeys = catchDefaultIO M.empty makemap
where
+ makemap = M.fromList . parse . lines <$> readStrict params
params = [Params "--with-colons --list-secret-keys --fixed-list-mode"]
parse = extract [] Nothing . map (split ":")
extract c (Just keyid) (("uid":_:_:_:_:_:_:_:_:userid:_):rest) =
diff --git a/Utility/LockFile.hs b/Utility/LockFile.hs
new file mode 100644
index 000000000..4f0d4ba3e
--- /dev/null
+++ b/Utility/LockFile.hs
@@ -0,0 +1,20 @@
+{- Lock files
+ -
+ - Posix and Windows lock files are extremely different.
+ - This module does *not* attempt to be a portability shim, it just exposes
+ - the native locking of the OS.
+ -
+ - Copyright 2014 Joey Hess <joey@kitenet.net>
+ -
+ - License: BSD-2-clause
+ -}
+
+{-# LANGUAGE CPP #-}
+
+module Utility.LockFile (module X) where
+
+#ifndef mingw32_HOST_OS
+import Utility.LockFile.Posix as X
+#else
+import Utility.LockFile.Windows as X
+#endif
diff --git a/Utility/LockFile/Posix.hs b/Utility/LockFile/Posix.hs
new file mode 100644
index 000000000..6e4444fcf
--- /dev/null
+++ b/Utility/LockFile/Posix.hs
@@ -0,0 +1,99 @@
+{- Posix lock files
+ -
+ - Copyright 2014 Joey Hess <joey@kitenet.net>
+ -
+ - License: BSD-2-clause
+ -}
+
+module Utility.LockFile.Posix (
+ LockHandle,
+ lockShared,
+ lockExclusive,
+ tryLockExclusive,
+ createLockFile,
+ openExistingLockFile,
+ isLocked,
+ checkLocked,
+ getLockStatus,
+ dropLock,
+) where
+
+import Utility.Exception
+import Utility.Applicative
+
+import System.IO
+import System.Posix
+import Data.Maybe
+
+type LockFile = FilePath
+
+newtype LockHandle = LockHandle Fd
+
+-- Takes a shared lock, blocking until the lock is available.
+lockShared :: Maybe FileMode -> LockFile -> IO LockHandle
+lockShared = lock ReadLock
+
+-- Takes an exclusive lock, blocking until the lock is available.
+lockExclusive :: Maybe FileMode -> LockFile -> IO LockHandle
+lockExclusive = lock WriteLock
+
+-- Tries to take an exclusive lock, but does not block.
+tryLockExclusive :: Maybe FileMode -> LockFile -> IO (Maybe LockHandle)
+tryLockExclusive mode lockfile = do
+ l <- openLockFile mode lockfile
+ v <- tryIO $ setLock l (WriteLock, AbsoluteSeek, 0, 0)
+ case v of
+ Left _ -> do
+ closeFd l
+ return Nothing
+ Right _ -> return $ Just $ LockHandle l
+
+-- Setting the FileMode allows creation of a new lock file.
+-- If it's Nothing then this only succeeds when the lock file already exists.
+lock :: LockRequest -> Maybe FileMode -> LockFile -> IO LockHandle
+lock lockreq mode lockfile = do
+ l <- openLockFile mode lockfile
+ waitToSetLock l (lockreq, AbsoluteSeek, 0, 0)
+ return (LockHandle l)
+
+-- Create and opens lock file; does not lock it.
+createLockFile :: FileMode -> LockFile -> IO Fd
+createLockFile filemode = openLockFile (Just filemode)
+
+-- Opens an existing lock file; does not lock it, and if it does not exist,
+-- returns Nothing.
+openExistingLockFile :: LockFile -> IO (Maybe Fd)
+openExistingLockFile = catchMaybeIO . openLockFile Nothing
+
+-- Close on exec flag is set so child processes do not inherit the lock.
+openLockFile :: Maybe FileMode -> LockFile -> IO Fd
+openLockFile filemode lockfile = do
+ l <- openFd lockfile ReadWrite filemode defaultFileFlags
+ setFdOption l CloseOnExec True
+ return l
+
+-- Check if a file is locked, either exclusively, or with shared lock.
+-- When the file doesn't exist, it's considered not locked.
+isLocked :: LockFile -> IO Bool
+isLocked = fromMaybe False <$$> checkLocked
+
+-- Returns Nothing when the file doesn't exist, for cases where
+-- that is different from it not being locked.
+checkLocked :: LockFile -> IO (Maybe Bool)
+checkLocked = maybe Nothing (Just . isJust) <$$> getLockStatus'
+
+getLockStatus :: LockFile -> IO (Maybe (ProcessID, FileLock))
+getLockStatus = fromMaybe Nothing <$$> getLockStatus'
+
+getLockStatus' :: LockFile -> IO (Maybe (Maybe (ProcessID, FileLock)))
+getLockStatus' lockfile = go =<< catchMaybeIO open
+ where
+ open = openFd lockfile ReadOnly Nothing defaultFileFlags
+ go Nothing = return Nothing
+ go (Just h) = do
+ ret <- getLock h (ReadLock, AbsoluteSeek, 0, 0)
+ closeFd h
+ return (Just ret)
+
+dropLock :: LockHandle -> IO ()
+dropLock (LockHandle fd) = closeFd fd
diff --git a/Utility/WinLock.hs b/Utility/LockFile/Windows.hs
index 369da6782..73c248b03 100644
--- a/Utility/WinLock.hs
+++ b/Utility/LockFile/Windows.hs
@@ -5,7 +5,7 @@
- License: BSD-2-clause
-}
-module Utility.WinLock (
+module Utility.LockFile.Windows (
lockShared,
lockExclusive,
dropLock,
@@ -17,9 +17,6 @@ import System.Win32.Types
import System.Win32.File
import Control.Concurrent
-{- Locking is exclusive, and prevents the file from being opened for read
- - or write by any other process. So for advisory locking of a file, a
- - different LockFile should be used. -}
type LockFile = FilePath
type LockHandle = HANDLE
@@ -30,7 +27,11 @@ lockShared :: LockFile -> IO (Maybe LockHandle)
lockShared = openLock fILE_SHARE_READ
{- Tries to take an exclusive lock on a file. Fails if another process has
- - a shared or exclusive lock. -}
+ - a shared or exclusive lock.
+ -
+ - Note that exclusive locking also prevents the file from being opened for
+ - read or write by any other progess. So for advisory locking of a file's
+ - content, a different LockFile should be used. -}
lockExclusive :: LockFile -> IO (Maybe LockHandle)
lockExclusive = openLock fILE_SHARE_NONE
@@ -44,15 +45,20 @@ lockExclusive = openLock fILE_SHARE_NONE
- Note that createFile busy-waits to try to avoid failing when some other
- process briefly has a file open. But that would make checking locks
- much more expensive, so is not done here. Thus, the use of c_CreateFile.
+ -
+ - Also, passing Nothing for SECURITY_ATTRIBUTES ensures that the lock file
+ - is not inheerited by any child process.
-}
openLock :: ShareMode -> LockFile -> IO (Maybe LockHandle)
openLock sharemode f = do
h <- withTString f $ \c_f ->
- c_CreateFile c_f gENERIC_READ sharemode (maybePtr Nothing)
+ c_CreateFile c_f gENERIC_READ sharemode security_attributes
oPEN_ALWAYS fILE_ATTRIBUTE_NORMAL (maybePtr Nothing)
return $ if h == iNVALID_HANDLE_VALUE
then Nothing
else Just h
+ where
+ security_attributes = maybePtr Nothing
dropLock :: LockHandle -> IO ()
dropLock = closeHandle
diff --git a/Utility/Url.hs b/Utility/Url.hs
index ebcae55ca..9cbabac39 100644
--- a/Utility/Url.hs
+++ b/Utility/Url.hs
@@ -6,11 +6,14 @@
-}
{-# LANGUAGE CPP #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RankNTypes #-}
module Utility.Url (
URLString,
UserAgent,
- UrlOptions(..),
+ UrlOptions,
+ mkUrlOptions,
check,
checkBoth,
exists,
@@ -25,6 +28,7 @@ import Network.HTTP.Conduit
import Network.HTTP.Types
import Data.Default
import qualified Data.CaseInsensitive as CI
+import qualified Data.ByteString as B
import qualified Data.ByteString.UTF8 as B8
import qualified Build.SysConfig
@@ -39,11 +43,39 @@ data UrlOptions = UrlOptions
{ userAgent :: Maybe UserAgent
, reqHeaders :: Headers
, reqParams :: [CommandParam]
+#if MIN_VERSION_http_conduit(2,0,0)
+ , applyRequest :: Request -> Request
+#else
+ , applyRequest :: forall m. Request m -> Request m
+#endif
}
instance Default UrlOptions
where
- def = UrlOptions Nothing [] []
+ def = UrlOptions Nothing [] [] id
+
+mkUrlOptions :: Maybe UserAgent -> Headers -> [CommandParam] -> UrlOptions
+mkUrlOptions useragent reqheaders reqparams =
+ UrlOptions useragent reqheaders reqparams applyrequest
+ where
+ applyrequest = \r -> r { requestHeaders = requestHeaders r ++ addedheaders }
+ addedheaders = uaheader ++ otherheaders
+ uaheader = case useragent of
+ Nothing -> []
+ Just ua -> [(hUserAgent, B8.fromString ua)]
+ otherheaders = map toheader reqheaders
+ toheader s =
+ let (h, v) = separate (== ':') s
+ h' = CI.mk (B8.fromString h)
+ in case v of
+ (' ':v') -> (h', B8.fromString v')
+ _ -> (h', B8.fromString v)
+
+addUserAgent :: UrlOptions -> [CommandParam] -> [CommandParam]
+addUserAgent uo ps = case userAgent uo of
+ Nothing -> ps
+ -- --user-agent works for both wget and curl commands
+ Just ua -> ps ++ [Param "--user-agent", Param ua]
{- Checks that an url exists and could be successfully downloaded,
- also checking that its size, if available, matches a specified size. -}
@@ -105,7 +137,7 @@ exists url uo = case parseURIRelaxed url of
(responseHeaders resp)
existsconduit req = withManager $ \mgr -> do
- let req' = (addUrlOptions uo req) { method = methodHead }
+ let req' = headRequest (applyRequest uo req)
resp <- http req' mgr
-- forces processing the response before the
-- manager is closed
@@ -115,11 +147,19 @@ exists url uo = case parseURIRelaxed url of
liftIO $ closeManager mgr
return ret
--- works for both wget and curl commands
-addUserAgent :: UrlOptions -> [CommandParam] -> [CommandParam]
-addUserAgent uo ps = case userAgent uo of
- Nothing -> ps
- Just ua -> ps ++ [Param "--user-agent", Param ua]
+#if MIN_VERSION_http_conduit(2,0,0)
+headRequest :: Request -> Request
+#else
+headRequest :: Request m -> Request m
+#endif
+headRequest r = r
+ { method = methodHead
+ -- remove defaut Accept-Encoding header, to get actual,
+ -- not gzip compressed size.
+ , requestHeaders = (hAcceptEncoding, B.empty) :
+ filter (\(h, _) -> h /= hAcceptEncoding)
+ (requestHeaders r)
+ }
addUrlOptions :: UrlOptions -> Request -> Request
addUrlOptions uo r = r { requestHeaders = requestHeaders r ++ uaheader ++ otherheaders}
@@ -187,3 +227,14 @@ download' quiet url file uo =
{- Allows for spaces and other stuff in urls, properly escaping them. -}
parseURIRelaxed :: URLString -> Maybe URI
parseURIRelaxed = parseURI . escapeURIString isAllowedInURI
+
+hAcceptEncoding :: CI.CI B.ByteString
+hAcceptEncoding = "Accept-Encoding"
+
+#if ! MIN_VERSION_http_types(0,7,0)
+hContentLength :: CI.CI B.ByteString
+hContentLength = "Content-Length"
+
+hUserAgent :: CI.CI B.ByteString
+hUserAgent = "User-Agent"
+#endif
diff --git a/debian/changelog b/debian/changelog
index e227dfc11..d0bff041d 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,4 +1,63 @@
-git-annex (5.20140718) UNRELEASED; urgency=medium
+git-annex (5.20140916) UNRELEASED; urgency=medium
+
+ * assistant: Detect when repository has been deleted or moved, and
+ automatically shut down the assistant. Closes: #761261
+ * Windows: Avoid crashing trying to list gpg secret keys, for gcrypt
+ which is not yet supported on Windows.
+ * WebDav: Fix enableremote crash when the remote already exists.
+ (Bug introduced in version 5.20140817.)
+ * add: In direct mode, adding an annex symlink will check it into git,
+ as was already done in indirect mode.
+
+ -- Joey Hess <joeyh@debian.org> Mon, 15 Sep 2014 14:39:17 -0400
+
+git-annex (5.20140915) unstable; urgency=medium
+
+ * New annex.hardlink setting. Closes: #758593
+ * init: Automatically detect when a repository was cloned with --shared,
+ and set annex.hardlink=true, as well as marking the repository as
+ untrusted.
+ * Fix parsing of ipv6 address in git remote address when it was not
+ formatted as an url.
+ * The annex-rsync-transport configuration is now also used when checking
+ if a key is present on a rsync remote, and when dropping a key from
+ the remote.
+ * Promote file not found warning message to an error.
+ * Fix transfer lock file FD leak that could occur when two separate
+ git-annex processes were both working to perform the same set of
+ transfers.
+ * sync: Ensure that pending changes to git-annex branch are committed
+ before push when in direct mode. (Fixing a very minor reversion.)
+ * WORM backend: Switched to include the relative path to the file inside
+ the repository, rather than just the file's base name. Note that if you're
+ relying on such things to keep files separate with WORM, you should really
+ be using a better backend.
+ * Rather than crashing when there's a problem with the requested bloomfilter
+ capacity/accuracy, fall back to a reasonable default bloom filter size.
+ * Fix build with optparse-applicative 0.10. Closes: #761484
+ * webapp: Fixed visual glitch in xmpp pairing that was reported live by a
+ user who tracked me down in front of a coffee cart in Portland.
+ (New bug reporting method of choice?)
+
+ -- Joey Hess <joeyh@debian.org> Mon, 15 Sep 2014 10:45:00 -0400
+
+git-annex (5.20140831) unstable; urgency=medium
+
+ * Make --help work when not in a git repository. Closes: #758592
+ * Ensure that all lock fds are close-on-exec, fixing various problems with
+ them being inherited by child processes such as git commands.
+ * When accessing a local remote, shut down git-cat-file processes
+ afterwards, to ensure that remotes on removable media can be unmounted.
+ Closes: #758630
+ * Fix handing of autocorrection when running outside a git repository.
+ * Fix stub git-annex test support when built without tasty.
+ * Do not preserve permissions and acls when copying files from
+ one local git repository to another. Timestamps are still preserved
+ as long as cp --preserve=timestamps is supported. Closes: #729757
+
+ -- Joey Hess <joeyh@debian.org> Sun, 31 Aug 2014 12:30:08 -0700
+
+git-annex (5.20140817) unstable; urgency=medium
* New chunk= option to chunk files stored in special remotes.
Supported by: directory, S3, webdav, gcrypt, rsync, and all external
@@ -16,15 +75,11 @@ git-annex (5.20140718) UNRELEASED; urgency=medium
were incompletely repaired before.
* Fix cost calculation for non-encrypted remotes.
* Display exception message when a transfer fails due to an exception.
- * WebDAV, S3: Sped up by avoiding making multiple http connections
+ * WebDAV: Sped up by avoiding making multiple http connections
when storing a file.
- * WebDAV, S3: Avoid buffering whole file in memory when uploading and
+ * WebDAV: Avoid buffering whole file in memory when uploading and
downloading.
* WebDAV: Dropped support for DAV before 1.0.
- * S3: Switched to using the haskell aws library.
- * S3: Now supports https. To enable this, configure a S3 special remote to
- use port=443. However, with encrypted special remotes, this does not
- add any security.
* testremote: New command to test uploads/downloads to a remote.
* Dropping an object from a bup special remote now deletes the git branch
for the object, although of course the object's content cannot be deleted
@@ -45,7 +100,7 @@ git-annex (5.20140718) UNRELEASED; urgency=medium
remote. The remote may have moved between networks, or reconnected.
* Switched from the old haskell HTTP library to http-conduit.
- -- Joey Hess <joeyh@debian.org> Mon, 21 Jul 2014 14:41:26 -0400
+ -- Joey Hess <joeyh@debian.org> Sun, 17 Aug 2014 10:30:58 -0400
git-annex (5.20140717) unstable; urgency=high
diff --git a/debian/control b/debian/control
index 2b430b4dc..fdd9e00be 100644
--- a/debian/control
+++ b/debian/control
@@ -19,7 +19,7 @@ Build-Depends:
libghc-dav-dev (>= 1.0) [amd64 i386 kfreebsd-amd64 kfreebsd-i386 powerpc],
libghc-quickcheck2-dev,
libghc-monad-control-dev (>= 0.3),
- libghc-exceptions-dev,
+ libghc-exceptions-dev (>= 0.6),
libghc-transformers-dev,
libghc-unix-compat-dev,
libghc-dlist-dev,
@@ -33,16 +33,16 @@ Build-Depends:
libghc-stm-dev (>= 2.3),
libghc-dbus-dev (>= 0.10.3) [linux-any],
libghc-fdo-notify-dev (>= 0.3) [linux-any],
- libghc-yesod-dev [i386 amd64 kfreebsd-i386 kfreebsd-amd64 powerpc sparc],
- libghc-yesod-static-dev [i386 amd64 kfreebsd-i386 kfreebsd-amd64 powerpc sparc],
- libghc-yesod-default-dev [i386 amd64 kfreebsd-amd64 powerpc sparc],
- libghc-hamlet-dev [i386 amd64 kfreebsd-i386 kfreebsd-amd64 powerpc sparc],
- libghc-shakespeare-dev [i386 amd64 kfreebsd-i386 kfreebsd-amd64 powerpc sparc],
- libghc-clientsession-dev [i386 amd64 kfreebsd-i386 kfreebsd-amd64 powerpc sparc],
- libghc-warp-dev [i386 amd64 kfreebsd-i386 kfreebsd-amd64 powerpc sparc],
- libghc-warp-tls-dev [i386 amd64 kfreebsd-i386 kfreebsd-amd64 powerpc sparc],
- libghc-wai-dev [i386 amd64 kfreebsd-i386 kfreebsd-amd64 powerpc sparc],
- libghc-wai-extra-dev [i386 amd64 kfreebsd-i386 kfreebsd-amd64 powerpc sparc],
+ libghc-yesod-dev [i386 amd64 kfreebsd-i386 kfreebsd-amd64 powerpc],
+ libghc-yesod-static-dev [i386 amd64 kfreebsd-i386 kfreebsd-amd64 powerpc],
+ libghc-yesod-default-dev [i386 amd64 kfreebsd-amd64 powerpc],
+ libghc-hamlet-dev [i386 amd64 kfreebsd-i386 kfreebsd-amd64 powerpc],
+ libghc-shakespeare-dev [i386 amd64 kfreebsd-i386 kfreebsd-amd64 powerpc],
+ libghc-clientsession-dev [i386 amd64 kfreebsd-i386 kfreebsd-amd64 powerpc],
+ libghc-warp-dev [i386 amd64 kfreebsd-i386 kfreebsd-amd64 powerpc],
+ libghc-warp-tls-dev [i386 amd64 kfreebsd-i386 kfreebsd-amd64 powerpc],
+ libghc-wai-dev [i386 amd64 kfreebsd-i386 kfreebsd-amd64 powerpc],
+ libghc-wai-extra-dev [i386 amd64 kfreebsd-i386 kfreebsd-amd64 powerpc],
libghc-securemem-dev,
libghc-byteable-dev,
libghc-dns-dev,
@@ -61,12 +61,12 @@ Build-Depends:
libghc-feed-dev (>= 0.3.9.2),
libghc-regex-tdfa-dev [!mipsel !s390],
libghc-regex-compat-dev [mipsel s390],
- libghc-tasty-dev (>= 0.7) [!mipsel !sparc],
- libghc-tasty-hunit-dev [!mipsel !sparc],
- libghc-tasty-quickcheck-dev [!mipsel !sparc],
- libghc-tasty-rerun-dev [!mipsel !sparc],
+ libghc-tasty-dev (>= 0.7) [!sparc],
+ libghc-tasty-hunit-dev [!sparc],
+ libghc-tasty-quickcheck-dev [!sparc],
+ libghc-tasty-rerun-dev [!sparc],
libghc-optparse-applicative-dev [!sparc],
- lsof [!kfreebsd-i386 !kfreebsd-amd64],
+ lsof [!kfreebsd-i386 !kfreebsd-amd64 !hurd-any],
ikiwiki,
perlmagick,
git (>= 1:1.8.4),
diff --git a/doc/backends.mdwn b/doc/backends.mdwn
index baa96c149..06475adfb 100644
--- a/doc/backends.mdwn
+++ b/doc/backends.mdwn
@@ -13,7 +13,7 @@ can use different ones for different files.
* `SHA256` -- Does not include the file extension in the key, which can
lead to better deduplication but can confuse some programs.
* `WORM` ("Write Once, Read Many") This assumes that any file with
- the same basename, size, and modification time has the same content.
+ the same filename, size, and modification time has the same content.
This is the least expensive backend, recommended for really large
files or slow systems.
* `SHA512`, `SHA512E` -- Best SHA-2 hash, for the very paranoid.
diff --git a/doc/bugs/Android_4.4_install_fails_with_permission_denied_errors.mdwn b/doc/bugs/Android_4.4_install_fails_with_permission_denied_errors.mdwn
new file mode 100644
index 000000000..f8baa3b5c
--- /dev/null
+++ b/doc/bugs/Android_4.4_install_fails_with_permission_denied_errors.mdwn
@@ -0,0 +1,295 @@
+### Please describe the problem.
+
+Installing git-annex on a new Nexus 5 with Android 4.4.4 using [Android 4.4 and 4.3 git-annex.apk](http://downloads.kitenet.net/git-annex/android/current/4.3/git-annex.apk) does not give me a working git-annex environment. It seems permission is denied to install many of the app files.
+
+
+### What steps will reproduce the problem?
+
+1. Install git-annex
+2. From within `adb shell`, run: `/data/data/ga.androidterm/runshell`
+3. Try one of the included programs, e.g., `git`
+
+
+### What version of git-annex are you using? On what operating system?
+
+The current (as of 2014-08-30) git-annex for Android 4.3 and up on Android 4.4.4.
+
+
+### Please provide any additional information below.
+
+Running `/data/data/ga.androidterm/runshell` from `adb shell` gives me:
+
+[[!format txt """
+shell@hammerhead:/ $ /data/data/ga.androidterm/runshell
+Falling back to hardcoded app location; cannot find expected files in /data/app-lib
+shell@hammerhead:/sdcard/git-annex.home $ ls
+git-annex-install.log
+shell@hammerhead:/sdcard/git-annex.home $ cat git-annex-install.log
+Installation starting to /data/data/ga.androidterm
+71c22504d777380dd59d2128b97715fde9ef6bec
+mv: can't rename '/data/data/ga.androidterm/bin': Permission denied
+installing busybox
+ln: /data/data/ga.androidterm/bin/busybox: Permission denied
+installing git-annex
+ln: /data/data/ga.androidterm/bin/git-annex: Permission denied
+installing git-shell
+ln: /data/data/ga.androidterm/bin/git-shell: Permission denied
+installing git-upload-pack
+ln: /data/data/ga.androidterm/bin/git-upload-pack: Permission denied
+installing git
+ln: /data/data/ga.androidterm/bin/git: Permission denied
+installing gpg
+ln: /data/data/ga.androidterm/bin/gpg: Permission denied
+installing rsync
+ln: /data/data/ga.androidterm/bin/rsync: Permission denied
+installing ssh
+ln: /data/data/ga.androidterm/bin/ssh: Permission denied
+installing ssh-keygen
+ln: /data/data/ga.androidterm/bin/ssh-keygen: Permission denied
+busybox: /data/data/ga.androidterm/bin/[: Permission denied
+busybox: /data/data/ga.androidterm/bin/[[: Permission denied
+busybox: /data/data/ga.androidterm/bin/ar: Permission denied
+busybox: /data/data/ga.androidterm/bin/arp: Permission denied
+busybox: /data/data/ga.androidterm/bin/ash: Permission denied
+busybox: /data/data/ga.androidterm/bin/base64: Permission denied
+busybox: /data/data/ga.androidterm/bin/basename: Permission denied
+busybox: /data/data/ga.androidterm/bin/beep: Permission denied
+busybox: /data/data/ga.androidterm/bin/blkid: Permission denied
+busybox: /data/data/ga.androidterm/bin/blockdev: Permission denied
+busybox: /data/data/ga.androidterm/bin/bunzip2: Permission denied
+busybox: /data/data/ga.androidterm/bin/bzcat: Permission denied
+busybox: /data/data/ga.androidterm/bin/bzip2: Permission denied
+busybox: /data/data/ga.androidterm/bin/cal: Permission denied
+busybox: /data/data/ga.androidterm/bin/cat: Permission denied
+busybox: /data/data/ga.androidterm/bin/catv: Permission denied
+busybox: /data/data/ga.androidterm/bin/chat: Permission denied
+busybox: /data/data/ga.androidterm/bin/chattr: Permission denied
+busybox: /data/data/ga.androidterm/bin/chgrp: Permission denied
+busybox: /data/data/ga.androidterm/bin/chmod: Permission denied
+busybox: /data/data/ga.androidterm/bin/chown: Permission denied
+busybox: /data/data/ga.androidterm/bin/chpst: Permission denied
+busybox: /data/data/ga.androidterm/bin/chroot: Permission denied
+busybox: /data/data/ga.androidterm/bin/chrt: Permission denied
+busybox: /data/data/ga.androidterm/bin/chvt: Permission denied
+busybox: /data/data/ga.androidterm/bin/cksum: Permission denied
+busybox: /data/data/ga.androidterm/bin/clear: Permission denied
+busybox: /data/data/ga.androidterm/bin/cmp: Permission denied
+busybox: /data/data/ga.androidterm/bin/comm: Permission denied
+busybox: /data/data/ga.androidterm/bin/cp: Permission denied
+busybox: /data/data/ga.androidterm/bin/cpio: Permission denied
+busybox: /data/data/ga.androidterm/bin/cttyhack: Permission denied
+busybox: /data/data/ga.androidterm/bin/cut: Permission denied
+busybox: /data/data/ga.androidterm/bin/dc: Permission denied
+busybox: /data/data/ga.androidterm/bin/dd: Permission denied
+busybox: /data/data/ga.androidterm/bin/deallocvt: Permission denied
+busybox: /data/data/ga.androidterm/bin/devmem: Permission denied
+busybox: /data/data/ga.androidterm/bin/diff: Permission denied
+busybox: /data/data/ga.androidterm/bin/dirname: Permission denied
+busybox: /data/data/ga.androidterm/bin/dmesg: Permission denied
+busybox: /data/data/ga.androidterm/bin/dnsd: Permission denied
+busybox: /data/data/ga.androidterm/bin/dos2unix: Permission denied
+busybox: /data/data/ga.androidterm/bin/dpkg: Permission denied
+busybox: /data/data/ga.androidterm/bin/dpkg-deb: Permission denied
+busybox: /data/data/ga.androidterm/bin/du: Permission denied
+busybox: /data/data/ga.androidterm/bin/dumpkmap: Permission denied
+busybox: /data/data/ga.androidterm/bin/echo: Permission denied
+busybox: /data/data/ga.androidterm/bin/envdir: Permission denied
+busybox: /data/data/ga.androidterm/bin/envuidgid: Permission denied
+busybox: /data/data/ga.androidterm/bin/expand: Permission denied
+busybox: /data/data/ga.androidterm/bin/fakeidentd: Permission denied
+busybox: /data/data/ga.androidterm/bin/false: Permission denied
+busybox: /data/data/ga.androidterm/bin/fbset: Permission denied
+busybox: /data/data/ga.androidterm/bin/fbsplash: Permission denied
+busybox: /data/data/ga.androidterm/bin/fdflush: Permission denied
+busybox: /data/data/ga.androidterm/bin/fdformat: Permission denied
+busybox: /data/data/ga.androidterm/bin/fdisk: Permission denied
+busybox: /data/data/ga.androidterm/bin/fgconsole: Permission denied
+busybox: /data/data/ga.androidterm/bin/find: Permission denied
+busybox: /data/data/ga.androidterm/bin/findfs: Permission denied
+busybox: /data/data/ga.androidterm/bin/flash_lock: Permission denied
+busybox: /data/data/ga.androidterm/bin/flash_unlock: Permission denied
+busybox: /data/data/ga.androidterm/bin/flashcp: Permission denied
+busybox: /data/data/ga.androidterm/bin/flock: Permission denied
+busybox: /data/data/ga.androidterm/bin/fold: Permission denied
+busybox: /data/data/ga.androidterm/bin/freeramdisk: Permission denied
+busybox: /data/data/ga.androidterm/bin/ftpd: Permission denied
+busybox: /data/data/ga.androidterm/bin/ftpget: Permission denied
+busybox: /data/data/ga.androidterm/bin/ftpput: Permission denied
+busybox: /data/data/ga.androidterm/bin/fuser: Permission denied
+busybox: /data/data/ga.androidterm/bin/getopt: Permission denied
+busybox: /data/data/ga.androidterm/bin/grep: Permission denied
+busybox: /data/data/ga.androidterm/bin/gunzip: Permission denied
+busybox: /data/data/ga.androidterm/bin/gzip: Permission denied
+busybox: /data/data/ga.androidterm/bin/hd: Permission denied
+busybox: /data/data/ga.androidterm/bin/hdparm: Permission denied
+busybox: /data/data/ga.androidterm/bin/head: Permission denied
+busybox: /data/data/ga.androidterm/bin/hexdump: Permission denied
+busybox: /data/data/ga.androidterm/bin/httpd: Permission denied
+busybox: /data/data/ga.androidterm/bin/ifconfig: Permission denied
+busybox: /data/data/ga.androidterm/bin/ifdown: Permission denied
+busybox: /data/data/ga.androidterm/bin/ifup: Permission denied
+busybox: /data/data/ga.androidterm/bin/inotifyd: Permission denied
+busybox: /data/data/ga.androidterm/bin/install: Permission denied
+busybox: /data/data/ga.androidterm/bin/iostat: Permission denied
+busybox: /data/data/ga.androidterm/bin/ip: Permission denied
+busybox: /data/data/ga.androidterm/bin/ipaddr: Permission denied
+busybox: /data/data/ga.androidterm/bin/ipcalc: Permission denied
+busybox: /data/data/ga.androidterm/bin/iplink: Permission denied
+busybox: /data/data/ga.androidterm/bin/iproute: Permission denied
+busybox: /data/data/ga.androidterm/bin/iprule: Permission denied
+busybox: /data/data/ga.androidterm/bin/iptunnel: Permission denied
+busybox: /data/data/ga.androidterm/bin/klogd: Permission denied
+busybox: /data/data/ga.androidterm/bin/ln: Permission denied
+busybox: /data/data/ga.androidterm/bin/loadkmap: Permission denied
+busybox: /data/data/ga.androidterm/bin/losetup: Permission denied
+busybox: /data/data/ga.androidterm/bin/lpd: Permission denied
+busybox: /data/data/ga.androidterm/bin/lpq: Permission denied
+busybox: /data/data/ga.androidterm/bin/lpr: Permission denied
+busybox: /data/data/ga.androidterm/bin/ls: Permission denied
+busybox: /data/data/ga.androidterm/bin/lsattr: Permission denied
+busybox: /data/data/ga.androidterm/bin/lsof: Permission denied
+busybox: /data/data/ga.androidterm/bin/lspci: Permission denied
+busybox: /data/data/ga.androidterm/bin/lsusb: Permission denied
+busybox: /data/data/ga.androidterm/bin/lzcat: Permission denied
+busybox: /data/data/ga.androidterm/bin/lzma: Permission denied
+busybox: /data/data/ga.androidterm/bin/lzop: Permission denied
+busybox: /data/data/ga.androidterm/bin/lzopcat: Permission denied
+busybox: /data/data/ga.androidterm/bin/makedevs: Permission denied
+busybox: /data/data/ga.androidterm/bin/makemime: Permission denied
+busybox: /data/data/ga.androidterm/bin/man: Permission denied
+busybox: /data/data/ga.androidterm/bin/md5sum: Permission denied
+busybox: /data/data/ga.androidterm/bin/mkdir: Permission denied
+busybox: /data/data/ga.androidterm/bin/mkfifo: Permission denied
+busybox: /data/data/ga.androidterm/bin/mknod: Permission denied
+busybox: /data/data/ga.androidterm/bin/mkswap: Permission denied
+busybox: /data/data/ga.androidterm/bin/mktemp: Permission denied
+busybox: /data/data/ga.androidterm/bin/more: Permission denied
+busybox: /data/data/ga.androidterm/bin/mpstat: Permission denied
+busybox: /data/data/ga.androidterm/bin/mv: Permission denied
+busybox: /data/data/ga.androidterm/bin/nbd-client: Permission denied
+busybox: /data/data/ga.androidterm/bin/nc: Permission denied
+busybox: /data/data/ga.androidterm/bin/netstat: Permission denied
+busybox: /data/data/ga.androidterm/bin/nice: Permission denied
+busybox: /data/data/ga.androidterm/bin/nmeter: Permission denied
+busybox: /data/data/ga.androidterm/bin/nohup: Permission denied
+busybox: /data/data/ga.androidterm/bin/od: Permission denied
+busybox: /data/data/ga.androidterm/bin/openvt: Permission denied
+busybox: /data/data/ga.androidterm/bin/patch: Permission denied
+busybox: /data/data/ga.androidterm/bin/pidof: Permission denied
+busybox: /data/data/ga.androidterm/bin/pipe_progress: Permission denied
+busybox: /data/data/ga.androidterm/bin/pmap: Permission denied
+busybox: /data/data/ga.androidterm/bin/popmaildir: Permission denied
+busybox: /data/data/ga.androidterm/bin/printenv: Permission denied
+busybox: /data/data/ga.androidterm/bin/printf: Permission denied
+busybox: /data/data/ga.androidterm/bin/pscan: Permission denied
+busybox: /data/data/ga.androidterm/bin/pstree: Permission denied
+busybox: /data/data/ga.androidterm/bin/pwd: Permission denied
+busybox: /data/data/ga.androidterm/bin/pwdx: Permission denied
+busybox: /data/data/ga.androidterm/bin/raidautorun: Permission denied
+busybox: /data/data/ga.androidterm/bin/rdev: Permission denied
+busybox: /data/data/ga.androidterm/bin/readlink: Permission denied
+busybox: /data/data/ga.androidterm/bin/readprofile: Permission denied
+busybox: /data/data/ga.androidterm/bin/realpath: Permission denied
+busybox: /data/data/ga.androidterm/bin/reformime: Permission denied
+busybox: /data/data/ga.androidterm/bin/renice: Permission denied
+busybox: /data/data/ga.androidterm/bin/reset: Permission denied
+busybox: /data/data/ga.androidterm/bin/resize: Permission denied
+busybox: /data/data/ga.androidterm/bin/rev: Permission denied
+busybox: /data/data/ga.androidterm/bin/rm: Permission denied
+busybox: /data/data/ga.androidterm/bin/rmdir: Permission denied
+busybox: /data/data/ga.androidterm/bin/route: Permission denied
+busybox: /data/data/ga.androidterm/bin/rpm: Permission denied
+busybox: /data/data/ga.androidterm/bin/rpm2cpio: Permission denied
+busybox: /data/data/ga.androidterm/bin/rtcwake: Permission denied
+busybox: /data/data/ga.androidterm/bin/run-parts: Permission denied
+busybox: /data/data/ga.androidterm/bin/runsv: Permission denied
+busybox: /data/data/ga.androidterm/bin/runsvdir: Permission denied
+busybox: /data/data/ga.androidterm/bin/rx: Permission denied
+busybox: /data/data/ga.androidterm/bin/script: Permission denied
+busybox: /data/data/ga.androidterm/bin/scriptreplay: Permission denied
+busybox: /data/data/ga.androidterm/bin/sed: Permission denied
+busybox: /data/data/ga.androidterm/bin/sendmail: Permission denied
+busybox: /data/data/ga.androidterm/bin/seq: Permission denied
+busybox: /data/data/ga.androidterm/bin/setconsole: Permission denied
+busybox: /data/data/ga.androidterm/bin/setkeycodes: Permission denied
+busybox: /data/data/ga.androidterm/bin/setlogcons: Permission denied
+busybox: /data/data/ga.androidterm/bin/setserial: Permission denied
+busybox: /data/data/ga.androidterm/bin/setsid: Permission denied
+busybox: /data/data/ga.androidterm/bin/setuidgid: Permission denied
+busybox: /data/data/ga.androidterm/bin/sh: Permission denied
+busybox: /data/data/ga.androidterm/bin/sha1sum: Permission denied
+busybox: /data/data/ga.androidterm/bin/sha256sum: Permission denied
+busybox: /data/data/ga.androidterm/bin/sha512sum: Permission denied
+busybox: /data/data/ga.androidterm/bin/showkey: Permission denied
+busybox: /data/data/ga.androidterm/bin/sleep: Permission denied
+busybox: /data/data/ga.androidterm/bin/smemcap: Permission denied
+busybox: /data/data/ga.androidterm/bin/softlimit: Permission denied
+busybox: /data/data/ga.androidterm/bin/sort: Permission denied
+busybox: /data/data/ga.androidterm/bin/split: Permission denied
+busybox: /data/data/ga.androidterm/bin/start-stop-daemon: Permission denied
+busybox: /data/data/ga.androidterm/bin/strings: Permission denied
+busybox: /data/data/ga.androidterm/bin/stty: Permission denied
+busybox: /data/data/ga.androidterm/bin/sum: Permission denied
+busybox: /data/data/ga.androidterm/bin/sv: Permission denied
+busybox: /data/data/ga.androidterm/bin/svlogd: Permission denied
+busybox: /data/data/ga.androidterm/bin/sync: Permission denied
+busybox: /data/data/ga.androidterm/bin/sysctl: Permission denied
+busybox: /data/data/ga.androidterm/bin/tac: Permission denied
+busybox: /data/data/ga.androidterm/bin/tail: Permission denied
+busybox: /data/data/ga.androidterm/bin/tar: Permission denied
+busybox: /data/data/ga.androidterm/bin/tcpsvd: Permission denied
+busybox: /data/data/ga.androidterm/bin/tee: Permission denied
+busybox: /data/data/ga.androidterm/bin/test: Permission denied
+busybox: /data/data/ga.androidterm/bin/time: Permission denied
+busybox: /data/data/ga.androidterm/bin/timeout: Permission denied
+busybox: /data/data/ga.androidterm/bin/top: Permission denied
+busybox: /data/data/ga.androidterm/bin/touch: Permission denied
+busybox: /data/data/ga.androidterm/bin/tr: Permission denied
+busybox: /data/data/ga.androidterm/bin/true: Permission denied
+busybox: /data/data/ga.androidterm/bin/ttysize: Permission denied
+busybox: /data/data/ga.androidterm/bin/tunctl: Permission denied
+busybox: /data/data/ga.androidterm/bin/tune2fs: Permission denied
+busybox: /data/data/ga.androidterm/bin/udhcpc: Permission denied
+busybox: /data/data/ga.androidterm/bin/uname: Permission denied
+busybox: /data/data/ga.androidterm/bin/uncompress: Permission denied
+busybox: /data/data/ga.androidterm/bin/unexpand: Permission denied
+busybox: /data/data/ga.androidterm/bin/uniq: Permission denied
+busybox: /data/data/ga.androidterm/bin/unix2dos: Permission denied
+busybox: /data/data/ga.androidterm/bin/unlzma: Permission denied
+busybox: /data/data/ga.androidterm/bin/unlzop: Permission denied
+busybox: /data/data/ga.androidterm/bin/unxz: Permission denied
+busybox: /data/data/ga.androidterm/bin/unzip: Permission denied
+busybox: /data/data/ga.androidterm/bin/uudecode: Permission denied
+busybox: /data/data/ga.androidterm/bin/uuencode: Permission denied
+busybox: /data/data/ga.androidterm/bin/vi: Permission denied
+busybox: /data/data/ga.androidterm/bin/volname: Permission denied
+busybox: /data/data/ga.androidterm/bin/watch: Permission denied
+busybox: /data/data/ga.androidterm/bin/wc: Permission denied
+busybox: /data/data/ga.androidterm/bin/wget: Permission denied
+busybox: /data/data/ga.androidterm/bin/which: Permission denied
+busybox: /data/data/ga.androidterm/bin/whoami: Permission denied
+busybox: /data/data/ga.androidterm/bin/whois: Permission denied
+busybox: /data/data/ga.androidterm/bin/xargs: Permission denied
+busybox: /data/data/ga.androidterm/bin/xz: Permission denied
+busybox: /data/data/ga.androidterm/bin/xzcat: Permission denied
+busybox: /data/data/ga.androidterm/bin/yes: Permission denied
+busybox: /data/data/ga.androidterm/bin/zcat: Permission denied
+tar: can't remove old file ./links/git-shell: Permission denied
+cat: can't open '/data/data/ga.androidterm/links/git': Permission denied
+rm: can't stat '/data/data/ga.androidterm/links/git': Permission denied
+cat: can't open '/data/data/ga.androidterm/links/git-shell': Permission denied
+rm: can't stat '/data/data/ga.androidterm/links/git-shell': Permission denied
+cat: can't open '/data/data/ga.androidterm/links/git-upload-pack': Permission denied
+rm: can't stat '/data/data/ga.androidterm/links/git-upload-pack': Permission denied
+lib/lib.runshell.so: line 133: can't create /data/data/ga.androidterm/runshell: Permission denied
+lib/lib.runshell.so: line 133: can't create /data/data/ga.androidterm/runshell: Permission denied
+chmod: runshell: Operation not permitted
+lib/lib.runshell.so: line 133: can't create /data/data/ga.androidterm/bin/trustedkeys.gpg: Permission denied
+lib/lib.runshell.so: line 133: can't create /data/data/ga.androidterm/installed-version: Permission denied
+Installation complete
+tar: write: Broken pipe
+shell@hammerhead:/sdcard/git-annex.home $ ^D
+shell@hammerhead:/ $
+"""]]
+
+Android is new to me, so it's possible I'm doing something utterly wrong.
diff --git a/doc/bugs/Assistant_merge_loop/comment_14_46bddc2451da3bf5029248198cf02dcd._comment b/doc/bugs/Assistant_merge_loop/comment_14_46bddc2451da3bf5029248198cf02dcd._comment
new file mode 100644
index 000000000..6ee3fb79e
--- /dev/null
+++ b/doc/bugs/Assistant_merge_loop/comment_14_46bddc2451da3bf5029248198cf02dcd._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawk9nck8WX8-ADF3Fdh5vFo4Qrw1I_bJcR8"
+ nickname="Jon Ander"
+ subject="comment 14"
+ date="2014-09-08T07:27:46Z"
+ content="""
+Still experiencing this bug in Debian testing (5.20140717) and Debian sid (5.20140831)
+"""]]
diff --git a/doc/bugs/Assistant_removed_all_references_to_files.mdwn b/doc/bugs/Assistant_removed_all_references_to_files.mdwn
new file mode 100644
index 000000000..4014bc729
--- /dev/null
+++ b/doc/bugs/Assistant_removed_all_references_to_files.mdwn
@@ -0,0 +1,1305 @@
+### Please describe the problem.
+
+Over the last few days, the assistant has recorded commits which have removed all the files from four (which is to say: all) of my local repositories. Two were direct mode, two indirect. All still had the actual file data saved still, so switching to indirect mode and reverting the relevant commits restored all my files. The two indirect repositories are synced with each other.
+
+One of the direct repositories also got all of its refs scrambled, pointing to objects that don't exist. I reset that one to indirect mode, found a valid commit from a clone and reset master to that commit. The other I've yet to work on.
+
+The iffy commits appear to have arrived just after the assistant auto-updated to 20140708.
+
+### What steps will reproduce the problem?
+
+I've not tried reproducing it.
+
+### What version of git-annex are you using? On what operating system?
+
+git-annex version: 5.20140708-g42df533
+Fedora 20
+I'm letting the assistant auto-update itself.
+
+### Please provide any additional information below.
+
+Here's a log for the indirect mode repo that's synced. I have two commits at 18:56:43, each removing half of the files.
+
+[[!format text """
+[2014-08-30 18:56:40 BST] main: starting assistant version 5.20140708-g42df533
+[2014-08-30 18:56:40 BST] TransferScanner: Syncing with apollo
+[2014-08-30 18:56:40 BST] UpgradeWatcher: Finished upgrading git-annex to version 5.20140708-g42df533
+
+(scanning...) [2014-08-30 18:56:40 BST] Watcher: Performing startup scan
+error: Ref refs/remotes/apollo/master is at cca3ca9633a98af7af4e029199b31768925298ed but expected efb22a8c5ff1c116ce43d99156112d4cafbdf967
+From apollo.aylett.co.uk:Annex/Family
+ ! efb22a8..cca3ca9 master -> apollo/master (unable to update local ref)
+TransferScanner crashed: /home/axa/Annex/Family/.git/annex/merge/: getDirectoryContents: does not exist (No such file or directory)
+[2014-08-30 18:56:41 BST] TransferScanner: warning TransferScanner crashed: /home/axa/Annex/Family/.git/annex/merge/: getDirectoryContents: does not exist (No such file or directory)
+
+
+
+(started...) [2014-08-30 18:56:43 BST] Committer: Committing changes to git
+[2014-08-30 18:56:43 BST] Pusher: Syncing with apollo
+To lizzie@apollo.aylett.co.uk:Annex/Family
+ 6924eb5..a13c0cd git-annex -> synced/git-annex
+ 5f56a47..972c8da annex/direct/master -> synced/master
+fatal: Run with no arguments or with -c cmd
+git-annex-shell: git-shell failed
+[2014-08-30 18:56:50 BST] RemoteControl: warning Remote apollo needs its git-annex upgraded to 5.20140405 or newer
+[2014-08-30 19:56:40 BST] NetWatcherFallback: Syncing with apollo
+From apollo.aylett.co.uk:Annex/Family
+ 6924eb5..a13c0cd git-annex -> apollo/git-annex
+To lizzie@apollo.aylett.co.uk:Annex/Family
+ 04e7150..9095d13 annex/direct/master -> synced/master
+error: duplicate parent 9095d132bb1bd6f03ba4494bcccec6973a322f1c ignored
+[2014-08-30 20:56:42 BST] NetWatcherFallback: Syncing with apollo
+From apollo.aylett.co.uk:Annex/Family
+ 5f56a47..9095d13 master -> apollo/master
+To lizzie@apollo.aylett.co.uk:Annex/Family
+ 9095d13..1a1d324 annex/direct/master -> synced/master
+error: duplicate parent 1a1d32492a093c00c7386de55be3fc25a9a56187 ignored
+[2014-08-30 21:56:43 BST] NetWatcherFallback: Syncing with apollo
+From apollo.aylett.co.uk:Annex/Family
+ 9095d13..1a1d324 master -> apollo/master
+To lizzie@apollo.aylett.co.uk:Annex/Family
+ 1a1d324..225e820 annex/direct/master -> synced/master
+error: duplicate parent 225e820c9e27db3d278101519932dc5c8b62b64e ignored
+[2014-08-30 22:56:58 BST] NetWatcherFallback: Syncing with apollo
+From apollo.aylett.co.uk:Annex/Family
+ 1a1d324..225e820 master -> apollo/master
+To lizzie@apollo.aylett.co.uk:Annex/Family
+ 225e820..205376f annex/direct/master -> synced/master
+error: duplicate parent 205376fa7f5027653ae3a0bd177562b033b2c06a ignored
+[2014-08-30 23:57:05 BST] NetWatcherFallback: Syncing with apollo
+ControlSocket /run/user/1000/ssh-apollo.aylett.co.uk-22-lizzie already exists, disabling multiplexing
+From apollo.aylett.co.uk:Annex/Family
+ 225e820..205376f master -> apollo/master
+git-annex-shell: Only allowed to access ~/Music not ~/Annex/Family
+fatal: Could not read from remote repository.
+
+Please make sure you have the correct access rights
+and the repository exists.
+git-annex-shell: Only allowed to access ~/Music not ~/Annex/Family
+fatal: Could not read from remote repository.
+
+Please make sure you have the correct access rights
+and the repository exists.
+git-annex-shell: Only allowed to access ~/Music not ~/Annex/Family
+fatal: Could not read from remote repository.
+
+Please make sure you have the correct access rights
+and the repository exists.
+git-annex-shell: Only allowed to access ~/Music not ~/Annex/Family
+fatal: Could not read from remote repository.
+
+Please make sure you have the correct access rights
+and the repository exists.
+[2014-08-30 23:59:59 BST] Cronner: Consistency check in progress
+[2014-08-30 23:59:59 BST] Cronner: Consistency check in progress
+[2014-08-30 23:59:59 BST] Cronner: Consistency check in progress
+[2014-08-30 23:59:59 BST] Cronner: Consistency check in progress
+[2014-08-30 23:59:59 BST] Cronner: Consistency check in progress
+[2014-08-31 00:00:00 BST] Cronner: Consistency check in progress
+[2014-08-31 00:27:29 BST] PushRetrier: Syncing with apollo
+To lizzie@apollo.aylett.co.uk:Annex/Family
+ 205376f..b74eb7b annex/direct/master -> synced/master
+error: duplicate parent b74eb7b1ecc520850efdb304ba995b14b124692c ignored
+[2014-08-31 00:57:29 BST] NetWatcherFallback: Syncing with apollo
+From apollo.aylett.co.uk:Annex/Family
+ 205376f..b74eb7b master -> apollo/master
+To lizzie@apollo.aylett.co.uk:Annex/Family
+ b74eb7b..cb1254d annex/direct/master -> synced/master
+error: duplicate parent cb1254d5ab344a250675fbdaf5dec942636f6026 ignored
+[2014-08-31 01:57:31 BST] NetWatcherFallback: Syncing with apollo
+From apollo.aylett.co.uk:Annex/Family
+ b74eb7b..cb1254d master -> apollo/master
+To lizzie@apollo.aylett.co.uk:Annex/Family
+ cb1254d..8ad18dc annex/direct/master -> synced/master
+error: duplicate parent 8ad18dcdf634a6c2aae224575b232c99c5b92a7c ignored
+[2014-08-31 02:57:33 BST] NetWatcherFallback: Syncing with apollo
+ControlSocket /run/user/1000/ssh-apollo.aylett.co.uk-22-lizzie already exists, disabling multiplexing
+From apollo.aylett.co.uk:Annex/Family
+ cb1254d..8ad18dc master -> apollo/master
+git-annex-shell: Only allowed to access ~/Music not ~/Annex/Family
+fatal: Could not read from remote repository.
+
+Please make sure you have the correct access rights
+and the repository exists.
+git-annex-shell: Only allowed to access ~/Music not ~/Annex/Family
+fatal: Could not read from remote repository.
+
+Please make sure you have the correct access rights
+and the repository exists.
+git-annex-shell: Only allowed to access ~/Music not ~/Annex/Family
+fatal: Could not read from remote repository.
+
+Please make sure you have the correct access rights
+and the repository exists.
+git-annex-shell: Only allowed to access ~/Music not ~/Annex/Family
+fatal: Could not read from remote repository.
+
+Please make sure you have the correct access rights
+and the repository exists.
+[2014-08-31 03:27:55 BST] PushRetrier: Syncing with apollo
+To lizzie@apollo.aylett.co.uk:Annex/Family
+ 8ad18dc..868ab0f annex/direct/master -> synced/master
+error: duplicate parent 868ab0f36977fb70ac2c8ddda86391289b6b0a3c ignored
+[2014-08-31 03:57:55 BST] NetWatcherFallback: Syncing with apollo
+From apollo.aylett.co.uk:Annex/Family
+ 8ad18dc..868ab0f master -> apollo/master
+To lizzie@apollo.aylett.co.uk:Annex/Family
+ 868ab0f..1eea08e annex/direct/master -> synced/master
+error: duplicate parent 1eea08ee2340ccceb7554f8dd8fbae28edd0ee49 ignored
+[2014-08-31 04:57:56 BST] NetWatcherFallback: Syncing with apollo
+From apollo.aylett.co.uk:Annex/Family
+ 868ab0f..1eea08e master -> apollo/master
+To lizzie@apollo.aylett.co.uk:Annex/Family
+ 1eea08e..b542ca6 annex/direct/master -> synced/master
+error: duplicate parent b542ca6756ba13377efa8884453c82eba71e27e6 ignored
+[2014-08-31 05:57:59 BST] NetWatcherFallback: Syncing with apollo
+ControlSocket /run/user/1000/ssh-apollo.aylett.co.uk-22-lizzie already exists, disabling multiplexing
+From apollo.aylett.co.uk:Annex/Family
+ 1eea08e..b542ca6 master -> apollo/master
+git-annex-shell: Only allowed to access ~/Music not ~/Annex/Family
+fatal: Could not read from remote repository.
+
+Please make sure you have the correct access rights
+and the repository exists.
+git-annex-shell: Only allowed to access ~/Music not ~/Annex/Family
+fatal: Could not read from remote repository.
+
+Please make sure you have the correct access rights
+and the repository exists.
+git-annex-shell: Only allowed to access ~/Music not ~/Annex/Family
+fatal: Could not read from remote repository.
+
+Please make sure you have the correct access rights
+and the repository exists.
+git-annex-shell: Only allowed to access ~/Music not ~/Annex/Family
+fatal: Could not read from remote repository.
+
+Please make sure you have the correct access rights
+and the repository exists.
+[2014-08-31 06:28:01 BST] PushRetrier: Syncing with apollo
+To lizzie@apollo.aylett.co.uk:Annex/Family
+ b542ca6..0de348c annex/direct/master -> synced/master
+error: duplicate parent 0de348caffaa453ce30e72ba2e240d8bbba34337 ignored
+[2014-08-31 06:58:01 BST] NetWatcherFallback: Syncing with apollo
+p11-kit: couldn't load module: /usr/lib/x86_64-linux-gnu/pkcs11/p11-kit-trust.so: /usr/lib/x86_64-linux-gnu/pkcs11/p11-kit-trust.so: cannot open shared object file: No such file or directory
+p11-kit: couldn't load module: /usr/lib/x86_64-linux-gnu/pkcs11/gnome-keyring-pkcs11.so: /usr/lib/x86_64-linux-gnu/pkcs11/gnome-keyring-pkcs11.so: cannot open shared object file: No such file or directory
+p11-kit: couldn't load module: /usr/lib/x86_64-linux-gnu/pkcs11/p11-kit-trust.so: /usr/lib/x86_64-linux-gnu/pkcs11/p11-kit-trust.so: cannot open shared object file: No such file or directory
+p11-kit: couldn't load module: /usr/lib/x86_64-linux-gnu/pkcs11/gnome-keyring-pkcs11.so: /usr/lib/x86_64-linux-gnu/pkcs11/gnome-keyring-pkcs11.so: cannot open shared object file: No such file or directory
+gpg: Signature made Mon 18 Aug 2014 20:14:04 BST using DSA key ID 89C809CB
+gpg: /tmp/git-annex-gpg.tmp.0/trustdb.gpg: trustdb created
+gpg: Good signature from "git-annex distribution signing key (for Joey Hess) <id@joeyh.name>"
+gpg: WARNING: This key is not certified with a trusted signature!
+gpg: There is no indication that the signature belongs to the owner.
+Primary key fingerprint: 4005 5C6A FD2D 526B 2961 E78F 5EE1 DBA7 89C8 09CB
+From apollo.aylett.co.uk:Annex/Family
+ b542ca6..0de348c master -> apollo/master
+To lizzie@apollo.aylett.co.uk:Annex/Family
+ 0de348c..8467b09 annex/direct/master -> synced/master
+error: duplicate parent 8467b0948d5e6e3dfb8375c4e84e7770ff9798e2 ignored
+[2014-08-31 07:58:04 BST] NetWatcherFallback: Syncing with apollo
+From apollo.aylett.co.uk:Annex/Family
+ 0de348c..8467b09 master -> apollo/master
+To lizzie@apollo.aylett.co.uk:Annex/Family
+ 8467b09..3a56258 annex/direct/master -> synced/master
+error: duplicate parent 3a56258c6b5b9551a61756c97c563720c87bf692 ignored
+[2014-08-31 08:58:07 BST] NetWatcherFallback: Syncing with apollo
+From apollo.aylett.co.uk:Annex/Family
+ 8467b09..3a56258 master -> apollo/master
+To lizzie@apollo.aylett.co.uk:Annex/Family
+ 3a56258..122eb0d annex/direct/master -> synced/master
+error: duplicate parent 122eb0dbc0e863d4f044a5e0c6eccd4f39dc6599 ignored
+[2014-08-31 09:58:10 BST] NetWatcherFallback: Syncing with apollo
+From apollo.aylett.co.uk:Annex/Family
+ 3a56258..122eb0d master -> apollo/master
+To lizzie@apollo.aylett.co.uk:Annex/Family
+ 122eb0d..46fbb4e annex/direct/master -> synced/master
+error: duplicate parent 46fbb4e5a9d330cbf2fe68c329cb9f10bbba38d6 ignored
+[2014-08-31 10:58:12 BST] NetWatcherFallback: Syncing with apollo
+From apollo.aylett.co.uk:Annex/Family
+ 122eb0d..46fbb4e master -> apollo/master
+To lizzie@apollo.aylett.co.uk:Annex/Family
+ 46fbb4e..cca5e72 annex/direct/master -> synced/master
+error: duplicate parent cca5e72784496181ade94e702533aa5c8e741309 ignored
+[2014-08-31 11:58:14 BST] NetWatcherFallback: Syncing with apollo
+From apollo.aylett.co.uk:Annex/Family
+ 46fbb4e..cca5e72 master -> apollo/master
+To lizzie@apollo.aylett.co.uk:Annex/Family
+ cca5e72..20f0c9d annex/direct/master -> synced/master
+error: duplicate parent 20f0c9da173562c13c4bf109333c9f9787f3a23b ignored
+[2014-08-31 12:58:17 BST] NetWatcherFallback: Syncing with apollo
+From apollo.aylett.co.uk:Annex/Family
+ cca5e72..20f0c9d master -> apollo/master
+To lizzie@apollo.aylett.co.uk:Annex/Family
+ 20f0c9d..3c9eb47 annex/direct/master -> synced/master
+error: duplicate parent 3c9eb47d6ff77f1f7949b64e10d0378220ea95b7 ignored
+[2014-08-31 13:58:19 BST] NetWatcherFallback: Syncing with apollo
+ControlSocket /run/user/1000/ssh-apollo.aylett.co.uk-22-lizzie already exists, disabling multiplexing
+From apollo.aylett.co.uk:Annex/Family
+ 20f0c9d..3c9eb47 master -> apollo/master
+git-annex-shell: Only allowed to access ~/Music not ~/Annex/Family
+fatal: Could not read from remote repository.
+
+Please make sure you have the correct access rights
+and the repository exists.
+git-annex-shell: Only allowed to access ~/Music not ~/Annex/Family
+fatal: Could not read from remote repository.
+
+Please make sure you have the correct access rights
+and the repository exists.
+git-annex-shell: Only allowed to access ~/Music not ~/Annex/Family
+fatal: Could not read from remote repository.
+
+Please make sure you have the correct access rights
+and the repository exists.
+git-annex-shell: Only allowed to access ~/Music not ~/Annex/Family
+fatal: Could not read from remote repository.
+
+Please make sure you have the correct access rights
+and the repository exists.
+[2014-08-31 14:28:21 BST] PushRetrier: Syncing with apollo
+To lizzie@apollo.aylett.co.uk:Annex/Family
+ 3c9eb47..87cbe02 annex/direct/master -> synced/master
+error: duplicate parent 87cbe029cf1b65809cadf6067e9cdbd4ba695118 ignored
+[2014-08-31 14:58:21 BST] NetWatcherFallback: Syncing with apollo
+From apollo.aylett.co.uk:Annex/Family
+ 3c9eb47..87cbe02 master -> apollo/master
+To lizzie@apollo.aylett.co.uk:Annex/Family
+ 87cbe02..71238f0 annex/direct/master -> synced/master
+error: duplicate parent 71238f04ff0429c64d3f3bb24116860e0cc80129 ignored
+[2014-08-31 15:58:23 BST] NetWatcherFallback: Syncing with apollo
+ControlSocket /run/user/1000/ssh-apollo.aylett.co.uk-22-lizzie already exists, disabling multiplexing
+From apollo.aylett.co.uk:Annex/Family
+ 87cbe02..71238f0 master -> apollo/master
+git-annex-shell: Only allowed to access ~/Music not ~/Annex/Family
+fatal: Could not read from remote repository.
+
+Please make sure you have the correct access rights
+and the repository exists.
+git-annex-shell: Only allowed to access ~/Music not ~/Annex/Family
+fatal: Could not read from remote repository.
+
+Please make sure you have the correct access rights
+and the repository exists.
+git-annex-shell: Only allowed to access ~/Music not ~/Annex/Family
+fatal: Could not read from remote repository.
+
+Please make sure you have the correct access rights
+and the repository exists.
+git-annex-shell: Only allowed to access ~/Music not ~/Annex/Family
+fatal: Could not read from remote repository.
+
+Please make sure you have the correct access rights
+and the repository exists.
+[2014-08-31 16:28:31 BST] PushRetrier: Syncing with apollo
+To lizzie@apollo.aylett.co.uk:Annex/Family
+ 71238f0..600343d annex/direct/master -> synced/master
+error: duplicate parent 600343d16d98bb7dd84ffbb1e2c8f27a49bd0bfe ignored
+[2014-08-31 16:58:31 BST] NetWatcherFallback: Syncing with apollo
+git-annex-shell: Only allowed to access ~/Music not ~/Annex/Family
+fatal: Could not read from remote repository.
+
+Please make sure you have the correct access rights
+and the repository exists.
+git-annex-shell: Only allowed to access ~/Music not ~/Annex/Family
+fatal: Could not read from remote repository.
+
+Please make sure you have the correct access rights
+and the repository exists.
+git-annex-shell: Only allowed to access ~/Music not ~/Annex/Family
+fatal: Could not read from remote repository.
+
+Please make sure you have the correct access rights
+and the repository exists.
+git-annex-shell: Only allowed to access ~/Music not ~/Annex/Family
+fatal: Could not read from remote repository.
+
+Please make sure you have the correct access rights
+and the repository exists.
+git-annex-shell: Only allowed to access ~/Music not ~/Annex/Family
+fatal: Could not read from remote repository.
+
+Please make sure you have the correct access rights
+and the repository exists.
+[2014-08-31 17:28:38 BST] PushRetrier: Syncing with apollo
+To lizzie@apollo.aylett.co.uk:Annex/Family
+ 600343d..50a6288 annex/direct/master -> synced/master
+error: duplicate parent 50a6288026156f5956291ad1100bd420fdde564c ignored
+[2014-08-31 17:58:38 BST] NetWatcherFallback: Syncing with apollo
+git-annex-shell: Only allowed to access ~/Music not ~/Annex/Family
+fatal: Could not read from remote repository.
+
+Please make sure you have the correct access rights
+and the repository exists.
+git-annex-shell: Only allowed to access ~/Music not ~/Annex/Family
+fatal: Could not read from remote repository.
+
+Please make sure you have the correct access rights
+and the repository exists.
+git-annex-shell: Only allowed to access ~/Music not ~/Annex/Family
+fatal: Could not read from remote repository.
+
+Please make sure you have the correct access rights
+and the repository exists.
+git-annex-shell: Only allowed to access ~/Music not ~/Annex/Family
+fatal: Could not read from remote repository.
+
+Please make sure you have the correct access rights
+and the repository exists.
+git-annex-shell: Only allowed to access ~/Music not ~/Annex/Family
+fatal: Could not read from remote repository.
+
+Please make sure you have the correct access rights
+and the repository exists.
+[2014-08-31 18:28:40 BST] PushRetrier: Syncing with apollo
+To lizzie@apollo.aylett.co.uk:Annex/Family
+ 50a6288..5b1813a annex/direct/master -> synced/master
+error: duplicate parent 5b1813a8dbbd7ea4b17e230e927419f1d3230534 ignored
+[2014-08-31 18:56:40 BST] SanityCheckerDaily: Running daily sanity check to make sure everything is ok.
+unused . (checking for unused data...) (checking HEAD...) (checking master...) (checking apollo/master...) (checking apollo/synced/master...)
+ Some annexed data is no longer used by any files:
+ NUMBER KEY
+ 1 SHA256E-s1103321--51418dc7fc654ebbeb9173bff598b4031d07d3c5cf651bd18a18ca6af9f7f1f7.jpg
+ 2 SHA256E-s3754--39631a60a771a00e88ef5ab011ab3f56fa8e539619b06aa68e66f2c71f252f9f.png
+ 3 SHA256E-s628641--2eeef2179787270c6307e1070678b6b27cbf0fe12cce71c136e0a89e1df78565.jpg
+ 4 SHA256E-s848--66e696444c6e570fc00d79f6651018d7e6549585e587394b933dcb0d74d8c214.js
+ 5 SHA256E-s21214--f26fa07b51fe0f4c5bc0d746f8b23e50115116bbcd80db057740bccb9841e4b6.png
+ 6 SHA256E-s852198--9fcc545c030c268d660381fd33d66b06605f7c5df16dca0b3fbe4eddfbf6b339.jpg
+ 7 SHA256E-s1334033--d6e722f76229c10ea6a1ff8dce2814ee42c92b643a19ec3f4d72222e1891c210.jpg
+ 8 SHA256E-s664656--85aaeced38501abfec6d23591edb07d7ab98bbe303b98eb07cfa0577ec8309b2.jpg
+ 9 SHA256E-s3213396--90e4ec9054de04c2b2c60a49b812582ba15c8da00208c9fc74acbc69b83182dc.JPG
+ 10 SHA256E-s820026--c1fc64d12cc74f60f8d17302a95217978782ea99758bce99ea2233709be60a6d.jpg
+ 11 SHA256E-s622679--5e8412b3955db206c6836fbd5731b0ab835aa325fc75bc7d75d4511ddbf67644.jpg
+ 12 SHA256E-s917793--7f2ecba64196449b9d7f1ea79e07f496d90d59c59d12472d058566a0881a5c6c.jpg
+ 13 SHA256E-s3493204--7ce9ad40b32b5cd1237e5efbb8f6885f7d734f8af65da8d0e92dc2de13162e07.JPG
+ 14 SHA256E-s910114--be8d66d9261108572efe0266ae386fefa653cea4ef43be9fbd10f7e2fe8d1c4c.jpg
+ 15 SHA256E-s636389--07b609b0cbf827a45cff2ca92367f3c5bf9a9527d4b3cb43961487bca8068ffd.jpg
+ 16 SHA256E-s823401--4cf12d87a9034d34a3019b5002000c92512f901a82f1081705c12e73b5870bad.jpg
+ 17 SHA256E-s1880--add7e1d7d7d98ff96afaec27bb066d6747551358e025176265a31b2b0f74bec0.log
+ 18 SHA256E-s8784--e28377207d41b4fef538b2fcbbd25c05275103a299e74966a88dce53ad5f50c0
+ 19 SHA256E-s8694--490b9f2f9c4c826b68bad68a50cf672ec36c58acb9e24fd46e84abaddec19b9b
+ 20 SHA256E-s2656--96dd5f3d5f8e87ce1552798dd5fe4c8dedab6268c0df9e391a202ffdc4b8fa71.log
+ 21 SHA256E-s459593--b68a62596f7524b6f877d8bd3dbbe49f4de02310e9dd6d5134bbdabfcd5d957a.jpg
+ 22 SHA256E-s11931--5ce30bd4424d544ed954e4722d7ed590a5be46a267c5045953e034309d942a8f.odp
+ 23 SHA256E-s1249581--d834f2dc34ded72086e26c32784e693597be011f28398635286394c7e8b5ded7.jpg
+ 24 SHA256E-s335736--9638a3225f1adbdb736a2cacc476f8eb5201c8124b83dab887a26c6d3a0e5899.jpg
+ 25 SHA256E-s6339776--f42083be1dba62acf81ad5ee8bccad47f267e2ce34c9e73e9aaafe3c69b462bd.pdf
+ 26 SHA256E-s582899--858ad02a9e5f58a6f5ea509865831acd540c290837beb87b37cb36bb62a7b982.jpg
+ 27 SHA256E-s2475657--d3fa5e460a2b164e849213d0417790704d1b4a2df9af5f6b281ac17dbacad30b.jpg
+ 28 SHA256E-s637475--68315445dd9477f07a695cb9fd12bb2c95f3117d949665ec2690184ded6b1ee6.jpg
+ 29 SHA256E-s77771--484ed3d8cc44de2db74c5680659c5c23ccb29ed5e99d0fb4b470a2c130c64c79.pdf
+ 30 SHA256E-s2343639--a7fccfe9a2c8de20ce8df10048b075758c445e5f4c9d9b78368db179e74e9a47.jpg
+ 31 SHA256E-s2282836--66e945f3a37651e1c88c58ff42b4dba9c6c5d822dc59f3e59895c336a0428c3d.jpg
+ 32 SHA256E-s5902--da66d622f9ed0987a0466c2c05c2aea56572e2f991c542b1120d564fb7459e7b.log
+ 33 SHA256E-s61410--4d3f0160bc92d0095a824baa17a08499dc748d06648029051802d24a772ba75d.css
+ 34 SHA256E-s1958077--1717f3036e7ca6b61fe8eeb3ce319de728b9bea10fd814108b9e13397a336db5.jpg
+ 35 SHA256E-s80930--f9b79963053221a10e32c4061b9da3622e89ce56aeed26c58f23bb70a2a57496.jpg
+ 36 SHA256E-s4956--a05854e0d26affdbb3e171c8e9ca3f663c8bc930f6402d9a370104e239bc2601.log
+ 37 SHA256E-s202851--3689503ce6f780d04e659fc85e4e7978c3c445afbd103f3ac118e1c6f3a4b738.jpg
+ 38 SHA256E-s5258--a243d289f629eb2e321c7232aa59c65d10ec79e70d07f25758ac04c0b9ff3f79.log
+ 39 SHA256E-s5406--dc07212d5aaaf5a320b3f9d710a72b68f7112140c76b43b7c0b4bb71f91e823f.log
+ 40 SHA256E-s8427--439c4f2144c9ea726b739494565b05dc47b59a8835e24e9a083171efc0834fc1
+ 41 SHA256E-s46--ca4a766fadecf16bbc25afbd805e2befbfb4cb270f122b0de813fbcfc933c1a2
+ 42 SHA256E-s839129--921ddf15c906a0353cb18bdd0b321bd5a37dfe653edbffc8e3b6b47996d54d8f.jpg
+ 43 SHA256E-s2922183--3aa5d5b22a980a11cee928ba701ffd389542db84fe96219442de1b33a64f840c.JPG
+ 44 SHA256E-s1305363--0b14938c28492e288d35a62334d6436ba8edfb7f65a066dbd9587478f157ab99.jpg
+ 45 SHA256E-s8602--819b18ca30f477f66e558ba1488a06e438a5f0b9c8f6987f68daad039d8020ca.png
+ 46 SHA256E-s6205--14691e198b05dd68b5fe3ed39eb8739182f4f5e75dc43dd7ecb252f01978c7ed.png
+ 47 SHA256E-s5070994--d0c5367647750b1f0b54c9fea7c7c9e1a0f7a0a7f61c92a688887538df3abf7f.m4v
+ 48 SHA256E-s134807--7100078e84c39a2123c0ea7d713e3361c7174f21fb72d39dac2a99a4844f89b7.jpg
+ 49 SHA256E-s535905--f317f11e4e0536ea8172e7827369bd9a3c887fcef2586b8eeda28b2dd36a791c.jpg
+ 50 SHA256E-s6420--72622a4453f4ea48acc0337bb1b288e0fb034d1ee1aa74f98eb9062066c025b5
+ 51 SHA256E-s51483--c9fba5eb0b29216afd9b6f13dd2f351367b7bcd0c8eb93fa0a1b6a0ce4535d57.sla
+ 52 SHA256E-s1957447--c3eddff4df50e1b0c5dc93f85e39acd24723013dd9b27b7b8a407eb5e55f1903.jpg
+ 53 SHA256E-s5345--ee879c6bc3c3ac59f449a9d9f92ec9cc2d15dced1f166805a179b6874d190c25.png
+ 54 SHA256E-s153751--c3fd0000f94ff9c44fef856ee440837fa4c228918ae70d0813d1635d50e6d4a0.odt
+ 55 SHA256E-s682324--33a6a1b34570f9abe0516d9abceefe14aae4cdacc41dc3f30ca92222d545631f.jpg
+ 56 SHA256E-s370109--a00b1c78753de6ae1d64a01d457b53a3572a9324a0facda4ec39a149d9adb37b.jpg
+ 57 SHA256E-s310217--aa0c575a44cac4957e06cd8ed0b058a16454a7be7f32ec8e79c815be6057bfbd.jpg
+ 58 SHA256E-s5798--61852a3ad168d4f27fe0f0e924e7418e838ae4363d85a64ebea80c9154e0c9a0.gif
+ 59 SHA256E-s47071--f1a74e5f9a20776adbe88ac3092e5a20a69d254905c0f93aa0b95a1ad0a5ed00.sla
+ 60 SHA256E-s988--b1f5fb3d38001b8bcf214158c6c7571f5aadb03093d2c307970a728edcb8012b
+ 61 SHA256E-s1397011--b67c04c6c99ccc208734dd39e18d4304a4963ef36600d4adc5827df21bfcc260.jpg
+ 62 SHA256E-s2124--1c64d2a60a40242432550ab3292e1ee38072481c36b8f028f75e3b4ea52fec29.log
+ 63 SHA256E-s1640512--ccb4940713e190a9242b34e18896156733f36df909c7e399bfdfe36299bfa748.jpg
+ 64 SHA256E-s484856--55f146177198dcd03069703c7b8bdf5c10cd7750aaf4b6f9af1946d72a9f9d23.jpg
+ 65 SHA256E-s7031--88bedea3e75aff77858c63a6c30bb06180bd9167fd380d94f132486d6ffeddf4
+ 66 SHA256E-s10100--1df9143f4c02f877ec891262bcbc407a9d4b960dd80c6826d5c1078012dc2614.js
+ 67 SHA256E-s2454--778574fe7cae3bfc2a49cbe3be18ed313b049b6e0bc333cea80723ae2136f9c3.log
+ 68 SHA256E-s63103--474c29d016927bd7dc42d992fc07c353148d393cfbd7c3e8193df91c3bb2d805.jpg
+ 69 SHA256E-s245481--ba0e9ed8876970e0aad7e22aeaf4f7403e1ef6fca474e0b4e90837381c0b810f.js
+ 70 SHA256E-s708--ab8f3c450c5c8944d6d91c35258b9da5ff4564b9b05b1e09ebbaa9b740d14aa4.log
+ 71 SHA256E-s582241--fb565e6fa923f3265a9406abf566d5de7a8e062b1d9ccb8ba7ec61a902ea277e.jpg
+ 72 SHA256E-s601517--fd4a4effd6c6b064be34910b36f1de8011bb3949d0f883a57ed4ca60eff6a642.jpg
+ 73 SHA256E-s613354--0d78d51b5047055d9bd2727e01a7c73ec25bcb99925be26550f3b921054e336b.jpg
+ 74 SHA256E-s20794--0ba2f6756001669bdf934f9d79e8fd1ccf2028130c33a0510279581ec9dfd73a.js
+ 75 SHA256E-s654750--be05edd69e61fb5ebecbddc8c39ae9ebdbca5e94ee395f604bbd73910a7e40f9.jpg
+ 76 SHA256E-s440--4e8500857e2b6a08a6922ca852ff4c9702e2397843011a14dee43d6e20c4f787.log
+ 77 SHA256E-s72381--a170eff1ba771b3e4e769ab2974b8fb1f66cff07bf8b19561a97f9d7767b565a.jpg
+ 78 SHA256E-s344661--21564a2da0f6b1ea6c4a39f4a96ba02680facb9d8a084d4fffa28b0e527c9fc8.jpg
+ 79 SHA256E-s51248--f940d364ad2583a9ae3c0f777fd61406914daa1837ed8dd78f3461760c4ca747.sla
+ 80 SHA256E-s502234--251053730579880833dc12058a6c689ba074f0a981331ec7eb685b69f08e292c.pdf
+ 81 SHA256E-s3682--f75a95ae16e2f8a8e0a607782cf332dc34c1e317d473023cbd7f9915fa400d62
+ 82 SHA256E-s3544--9b40beb44b624520a74057a82ae5e6adb18601e6c1fc7d8496bdd59e3b248945
+ 83 SHA256E-s355156--7056bee290696e681cd3538e2ff2e740842bce032effe509f0919e888cc03ee4.jpg
+ 84 SHA256E-s879539--12cc34616b2dda153890db0a724290fa01bd9dd664061a05c8d2c1039cd4cc3c.odg
+ 85 SHA256E-s2051310--69387e84897ed700b6dd7c418fc3a7884a1e6e16a4267297b3effb95b02a7bc7.jpg
+ 86 SHA256E-s620--eb69406700a3a6122cb532614f4ae6899d97409d76259820176f7ae77158684b.png
+ 87 SHA256E-s693427--e20c50c86937800b14e2773d79eb63d13c0300781f8e71ee3947fb5a2fe98fe5.jpg
+ 88 SHA256E-s87985--b89b279ca5dede3643e8a48402e9b112b1e1fdc14b3326c98cbdb32f9f7fa2cc.jpg
+ 89 SHA256E-s35739--378d1bcb19c2742b8d344459a74f9b4ea44287c4e5cf046b80a46b209ea1ebbb.sla
+ 90 SHA256E-s51515--d4805b60c6e0ea396dc157ca0e399ba355482f2a9696f31fdcf819aa176ea3e7.sla
+ 91 SHA256E-s396738--5e18be640581ced943a676323c80dc283b15d3caf37b2bc2d0b05ceee1d178e5.jpg
+ 92 SHA256E-s334295--7f97df9f93e42a2db9e9efb0aa34a2a9a6b9af49846e6a73f320ee151d535eed.jpg
+ 93 SHA256E-s425513--0f6228a7466c12d1d0e4beda9825f17442b15286a5639e3a894a36d33497c77a.jpg
+ 94 SHA256E-s114076--6a1822942964efa5531de2cae48d3fd69e71baca7ade38b7cbe23964637d4478.jpg
+ 95 SHA256E-s118034--a8b1e6f81534106e9f4563dfe3f288e9425284fbaa74247065cf80448cdb216f.jpg
+ 96 SHA256E-s639--4b491df2b47c2fd4dcfbb99b50ec1367e138c61216704490ada08cddd0d32fda.css
+ 97 SHA256E-s734079--0602d1c85bca8508010ed03c2b1c26c88a8c759783f49d7f7b282b30837c6b32.jpg
+ 98 SHA256E-s130889--751d2fa73ac74e17d2e82fc9a89b3d393028197790657aa075effc7c16b8f528.js
+ 99 SHA256E-s485283--63716cdb8953a9318eb28953af25db2afa02251e6f152d487f5ab05f1d27930e.jpg
+ 100 SHA256E-s59518--6a80f10665ad39dc27ee3a5727ebeee321a289dbc958916f9e6eda01f2703d25.jpg
+ 101 SHA256E-s194--4c0fc707f629bcb314433fc700c6090c970d343adbb921f46084bdb08f99cf6e
+ 102 SHA256E-s303--07ae4fec1962f2f83808ec861e477d5669dd71ff1089cb25a0e1da7b3ec9a5a6.css
+ 103 SHA256E-s24519--3f3cba473c1818b2ce46a034fc323d528df85dd88d3f2ed411ad644a08ff9132
+ 104 SHA256E-s316292--691e653f57643e579c261a827441e63ee3d8cf1f9ed5cdc43d861cf340510d34.pdf
+ 105 SHA256E-s11916--88e5b1e2f5bd0f5c458abb41589028ef35dc75872abd7e04eee4a12ae7bfef38
+ 106 SHA256E-s733240--fe7b7c77712b866c932d391f8305560d488d0e5515f3d9c890ddd11c96ff6069.odt
+ 107 SHA256E-s4323950--c71e34a9fa2d1f54934d3caf829e4b5330811c2937d523f856d43cf5d92b7275.m4v
+ 108 SHA256E-s475740--e2d4880b8561167dd91b57a666f3eba68931ae3546231d102469c76d341f560a.jpg
+ 109 SHA256E-s574--5d1bd8763457376e0ff677895456f9aad26b6d85e15648696e9f4c77af104fee.png
+ 110 SHA256E-s11608--f815f1bad38a05f27b1f7cd416236148fa79554ed2546a014afe148c0e427839.log
+ 111 SHA256E-s3300--7164c4d91218528eedb0310af14927d4ce483889b53da24fdcc01fadae107fbd
+ 112 SHA256E-s962958--9a81dba98b0b910641d035bf662b847fb4785ef2378bef7b2ae6713b1fbd903c.jpg
+ 113 SHA256E-s845627--09f3e811c372a7ee936064d4c48c8b4f36db519a49a0b274f69e3da12a0e2ffe.jpg
+ 114 SHA256E-s2380622--05725288b66460ff1befda38280dea4d05c5dff42818de7d64e619e12aebeaa0.jpg
+ 115 SHA256E-s62795--a32762ee80e176ca1d7869cd5f68e7442327e1a861ed70290f2256179ebd844c.js
+ 116 SHA256E-s3486--f148d21e252ab05ff7039fa276ee309e6d16d2ba7444043acc148b9986164162.log
+ 117 SHA256E-s2393747--1ba6fc7f4d47ced145ceab80128e3ceaf8cfe8f2155b5e33e9273c736a81b910.jpg
+ 118 SHA256E-s4611--bbc334899e27d8fe781f61e06be1c28852e618d1e2bd8b98de0aed7fb6106ad8.js
+ 119 SHA256E-s826134--426211e056784356538d3ac80838e197e2cdf29742cd31db6a386ce7c05aa052.jpg
+ 120 SHA256E-s1072403--87da8298b8c3c76bdfb8c96ac7dcb11349763067056eb0e1fadf5241fc134141.jpg
+ 121 SHA256E-s51028--d6d044282ee1d1d8fc02130ac42ab1d7ee3a6a7e2987b78bb1062529019cf3e5.sla
+ 122 SHA256E-s45783--35b9963b4a8bc3dbee5bbe827c2e18c795b8fce86bb1eb87c6b3b09327380f1f.js
+ 123 SHA256E-s999195--c0fa3d678c9ebe118ea3fb1b664a2f63ccc792a7578fe921d0c299adf40d97f3.jpg
+ 124 SHA256E-s96828--c5ebf871d1c98e5f49d15dc22131e483b514754ad86c6293c69b6d5aa3d44cf9.jpg
+ 125 SHA256E-s159835--47a9ba3de62d6a4b11dd59a60b0047d3d377c224ceac85bfb6a81a972f25fff9.css
+ 126 SHA256E-s9629--588e723593992acb553dd4f2c76a6993135b4f49e674358fae63ff06e145f07a
+ 127 SHA256E-s39867--6e96f4658811bba2f27f930f764111501e438135d793e28fe7eacb6b10866e0d.js
+ 128 SHA256E-s62332730--a2c804ddc66d8175fb5e187d17c904954f1e2cae634c4604ac363eb97d78f7e1.odt
+ 129 SHA256E-s1711933--dd49df68da23021d3e9cc775e86bd5341dda6ba71714c8287872deb9416e051a.jpg
+ 130 SHA256E-s290639--0803de7a02e9a4a1caca69b2a7b2c948e7faf2e4ef2bf3bcdaec148c0f26b842.pdf
+ 131 SHA256E-s5799--fa90e9a478760bc12c2707962f2ea6b9ab213bc7d4b158f28f6739727ffe05e7.log
+ 132 SHA256E-s11156--17ca703a57e9f02ebd71251ca8bdb6d82b71fa586deb034cd384b21a3818035a
+ 133 SHA256E-s16171--47a7946e6364fa5ad3dc595105c79a4946f18cbef0818e72682d9304625ceab9.odt
+ 134 SHA256E-s1962015--2eae4dfa79e014bf4468141bfac8c0065d1b05f2532758c6e68deedd297f22ee.jpg
+ 135 SHA256E-s31268--560829df213299f5db9aeb0b31b40044300c34e92818680f422d0ddfe7602f2c.axd
+ 136 SHA256E-s145407--c34c44643d9d0f7114cce8b31f3442a7b6392c4687af9ab97995bd30ddd3167c.pdf
+ 137 SHA256E-s1773--8417f863ffa4a076dd2d8b5a63170bb0c5b83cf275d72245a79c31d94358fd20.log
+ 138 SHA256E-s701838--3d7abfd8b091e4da1bb61881155c299b78ed693f128f1c693c7970bcbce4e8e0.jpg
+ 139 SHA256E-s2089502--f4c9ec5dce63924cba6f77efd5e20b17cfc0f3c9ae45dce7bb0ecc5a10986205.jpg
+ 140 SHA256E-s1085890--0346c7a329e7b80c7f93b8aa7de039bf322070ebac33cee6ade6fcc4a4f296be.jpg
+ 141 SHA256E-s3998--e38f3a315b698a0e8ccfa395431393af757f882413cea8b4879b5b5993543f86.js
+ 142 SHA256E-s7372--181699a3ca4be8bb0e9913fd96dc5c44ed8a790ea6ef2bb0fb285e741f2c46ab
+ 143 SHA256E-s864279--364b4a4d0a30ddbf1164d5d3ded0702a4b016ffc27d26eb6005d96e68aa4f77f.jpg
+ 144 SHA256E-s2941--7ca4f001618fda61146802286daf472c5daaaded2471e356a752b6a69834e7f7.log
+ 145 SHA256E-s153049--5805df5cecdaa15a549bf7751b1d66f7455e71e2243709d9799f839e42d082f2.jpg
+ 146 SHA256E-s542959--5823d605d7258bd813d09712fd124fd7c63f2cbdf46a9b52c3eb67eb7bb538bc.jpg
+ 147 SHA256E-s45282--b20a77431de35f8e70867cfe520503528fb948d63f724ed90fc249994875b77a.jpg
+ 148 SHA256E-s19556--e5bdba04d2a9d805c491778a742744d3007d38a23c9dc11cf8f6eab7b2dd0a1d.log
+ 149 SHA256E-s392108--c9c76c131588fc29d588afed12d98b6b3a6aa0a9971ad368112bc0c2a603e70c.pdf
+ 150 SHA256E-s8275--ff63b5b012ea62b178310424d817a8a77fb31151dd697659f85f23a6298cf28d
+ 151 SHA256E-s1769251--7d0a2ec1652f1287884f6bd4e0df14106af271e81fc38cae5aac1357966ea672.pdf
+ 152 SHA256E-s464748--aa63c72a4b064f91083228395e1391d970873ad1370900a468db154ed266d475.jpg
+ 153 SHA256E-s6130263--3521b18281dba779713e600fde1a4d15568328baad6baf43cba1530df7165c5d.JPG
+ 154 SHA256E-s494260--aeb91b314f3dee3580093e9610dacd5917265794b49acea9d80dfca83d56b88d.odt
+ 155 SHA256E-s3362329--05fde815df42455fdc1b563ce41bf13d585135da628d01c5ffc9ca627c008225.jpg
+ 156 SHA256E-s489239--d2ab01a94808613489205b7aa5d666cccfeac0a28b5a76ab18fc9fd9435dcabc.jpg
+ 157 SHA256E-s482249--e4979b950d4633515316102d934115b1981c8adf5a14ea80bfda87e623af7989.jpg
+ 158 SHA256E-s93506--3f44779fc3ce611f607c9cde2c114f6f038775485a677e17bcb6bb034e6ac888.jpg
+ 159 SHA256E-s818--66d21ef5da07cc00768b23bb711ccc8e18b91c99ccad2084ec309f51e6c52db6.log
+ 160 SHA256E-s171892--33f34e7d16851c2291d7495754505d391be4668883b43e4b9e587126c693b1d2.png
+ 161 SHA256E-s278132--fca8b8bbcc0f9fe8addb57994c69a9c511b206c27424491809ab31aef86f21b4.jpg
+ 162 SHA256E-s2418631--deb0aadf97aa49010ac3cab5f5299e2d68eeb5ecb4dd5de93316f23a714734f6.jpg
+ 163 SHA256E-s125121--2b2cc905b8c05d4c7253a9c2b45a961df545842e4ce9d17e5248aa6240e77557.pdf
+ 164 SHA256E-s199793--615ac75e6766d637d17159ebe3d48eedf27096e93b83efc159431da4d032e21b.axd
+ 165 SHA256E-s223221--ca5f5160688546f422cf7d041e58f07d5d90e8359666e523a5af515baf0b2980.jpg
+ 166 SHA256E-s1959724--2e44ed4b10ab3c1655b16335b901547713ac8d5c38d4ed3735bcbabb272242b5.jpg
+ 167 SHA256E-s11609--df8dcf81585eccae95b7c4f0a0ba8c6fc4cfe90ebbf9657bd6a10320f7195e61
+ 168 SHA256E-s483419--96cfd3b43e5b7bb1d6a5bc3f78d33e873fa36ee6e53c9f1de083f279c19c5f70.jpg
+ 169 SHA256E-s560766--96f47b698f6502bc758e6d8b9b538368f8085d040306388bfd42d3026c465ff5.jpg
+ 170 SHA256E-s3848--4d18299f8d8ef1bfbd7b206d419ef6f65cbd09a3ae999f3c7cc8496051b34080
+ 171 SHA256E-s1141493--80b7a82ee4edc420c538c4a2a37fc9d80cce4c321f5a9a7fa7e66df0c9e3693c.jpg
+ 172 SHA256E-s9726--14b5e76da3417f5f25f48c2a793aa50da9c920451495af7612b76d3c052d3f13.odt
+ 173 SHA256E-s939529--43d05562e75f2477aa6d412d8a672ce7b6cf2890d4e1578bf88692aabfd0e70d.jpg
+ 174 SHA256E-s888147--948ca59b827f77f75ea981b149a72df976aea360cd263d0f7c03275375a47232.jpg
+ 175 SHA256E-s740710--f1e98c032815161aff44c8ccbb882af5cb234f91c4430cf91d01115649bc9aa5.jpg
+ 176 SHA256E-s961257--e6b21901e268f6d0f3a38b43e5a06d8ad9ec0901f4c9639954da7ecf2ee4a666.jpg
+ 177 SHA256E-s616645--bd10a26926e6cd0fd0ee6cf72692c92134b183927280a00a74e869bbeae8bde6.jpg
+ 178 SHA256E-s47996--f862cbc7bea6fe4b5fe3a3af2b393973220a34975dd36a9d5f92b30d1db80acc.sla
+ 179 SHA256E-s2396909--2e6d435cf96f81a3f3247f2d35b01701f8a46977e813745324ca5b40717fdea9.jpg
+ 180 SHA256E-s180605--66c6df69bba4602100148ffd0f0a0ba0a14b74eaefb3b27708c6792d2b5cd09c.jpg
+ 181 SHA256E-s721289--159f9398adde99e23b05c8c8c99aadd98b6a3a80afe5e3745ff37b0668fe4a24.jpg
+ 182 SHA256E-s95559--0d932a11d465d523f85b17803d44fb0748459771b2cd843dbcfd677248abb0f5.jpg
+ 183 SHA256E-s368166--98be96450123c166cf11f1763aa25040ffb1674f7267a4041cc1a4fbe8e433a1.jpg
+ 184 SHA256E-s846--b3c9f5697bee76715237040d6ba5ff9f657dee2d882e36d818ed2ff50e8e0835.log
+ 185 SHA256E-s581051--217882c3f655c62dd323afe0689c9485d0d09430d5356a63105632cce08ea88e.jpg
+ 186 SHA256E-s586436--006bfd4f9697d8b64be920876bd8c0a40967b253806072ec09d2a630909826e4.jpg
+ 187 SHA256E-s398620--1ab7d488bafe19941f33155959c1bbec199a86ef2334c08b75b450bc9f36a16b.jpg
+ 188 SHA256E-s10457--0be429c323998556486e8f9977ccc980be3ba3920d5cc3bf16a6c7bb57b0fe3c
+ 189 SHA256E-s83789--c286b21f977391efd38b5a5a341f9dbec4da611a16bc1d17d8ca71d49ad64d30.jpg
+ 190 SHA256E-s321943--5e3983f4b43ae782b6f41c4f899027f1d55f78347e2106bc4c96e7f65c652918.jpg
+ 191 SHA256E-s7518--be582d1ce8295d8c47e261eb7bd78a0e720e78dd58805808e9bf64ddfc3c4fe4
+ 192 SHA256E-s6118--3ca5d8ca6cda3acc6c07c604f6880c017e6faa7dad4ba61e9aa956a9fa8b4b0d
+ 193 SHA256E-s1086965--e170514a3651dda3313f4dcfdb9490f039a825b8349f74957a17313bdbcd7e8d.jpg
+ 194 SHA256E-s10504--a57d3172d4a009a1a0d38993ea6dbe03fab6aa1ec429aa4aab563465b0dc43bd.js
+ 195 SHA256E-s530445--7c8e603a03e17bb0c6440df6b695e557357527bc081871b51d0b5a61222dd674.jpg
+ 196 SHA256E-s37480--ba3a0b04e4325bf0853c6201ecf7bb0fc08a0a13f5fdf0a4477c6a1f0cc82559.js
+ 197 SHA256E-s394333--77f7debb969fd22698b60339ed0a0e98d9c43b8c74203528a02f6a185784e808.jpg
+ 198 SHA256E-s568976--43c009e20c1b4b28d651c64ac1faa9ebd5e704bb975e2fb65ece83f4cb8867d2.jpg
+ 199 SHA256E-s13813--4b4db06a82938c002539bc21d9285d63387e1a6241932c111c4f3992fa093092.axd
+ 200 SHA256E-s2735--f73ac06c4be021a97a8c40f5371f0e62fd7094d863d9679407784c09c13ddd5b.log
+ 201 SHA256E-s25176948--4493a4fd3160627db1fdd24c2a6bd402b544c495565815007c2d0d5093478d2a.odt
+ 202 SHA256E-s596273--de2ec9fe99774ea6ce0a746a66888b71cfd744d3d97084439d054e58adebe709.jpg
+ 203 SHA256E-s947995--956f7ec6d1c0c931c40e055fe21c2cfde8ef135f816052147406cb0c3ed0f948.jpg
+ 204 SHA256E-s5283--5fbb8a58b8bf48ea0511c26b1b319f737df54e8e35f13b5d851dc7c0ce662458.png
+ 205 SHA256E-s777575--c9fea606bc2e419967c550c43b5345bf7b08b43a81d0cdc561e048b94d536e10.jpg
+ 206 SHA256E-s51496--36143df60284eae68573cb266a34a25f3c042bfd8314bdf0730c03a4fb81bb38.sla
+ 207 SHA256E-s3013379--4f47c51193c043d2e81aa0bf46927a5f5c305625a09ac9034f9cb6e25ea2c6bc.jpg
+ 208 SHA256E-s592379--4cea82764a163f6da9c6e63f553f82f119d5188d187c0747ee467a337f81446e.jpg
+ 209 SHA256E-s8402--5b400d459743a01405d2d1ffc4d07651c36712caf9030e2a091e48f97c58a2bb.png
+ 210 SHA256E-s662301--f0cf51849e330e861513bee59063450d14759055c67986e8a31dbbde0907a254.jpg
+ 211 SHA256E-s1371822--0c85f348595f845e0076e52157fbb772a9d72a4821310c187b183370d7bb1b4c.jpg
+ 212 SHA256E-s13445--460f9e3ea4f8a260af278d81c59faa45f16b2069b10030a8a253cd852f2e8e34.log
+ 213 SHA256E-s19780--3f513b835cc3299a15178dae45cc523f1b06a1c13bd0e1c29f958027d3f5dc8a.axd
+ 214 SHA256E-s311438--00b3cbd6de31a75e3a017c452099991f1ec09327efe9c6450012f6015eb6e1a4.jpg
+ 215 SHA256E-s8942--e267fde4da4719de2c454d82f907796167f425510ea84098a39b425b69d2df5e
+ 216 SHA256E-s845884--58974bcab0e36d65d606c1acf57e34e2e6f89872fbab65b9abf5250c632967a5.jpg
+ 217 SHA256E-s331598--de52b228ad93c774d4dd1d41556ff27f7f03802378747807f324a9604e32ed66.jpg
+ 218 SHA256E-s201837--d3f750f64687f347f0254d3c602a010ef71636a85f37954690d20bb6548437b1.jpg
+ 219 SHA256E-s537652--aeaa479c57d39b3618006162c80e1c0eaa2cfa0b2a9a2c069a3d601bfe5b0706.jpg
+ 220 SHA256E-s1174974--1d506c737c2dbde4aa286a2a25b22412c83edc5e55c3cc94fa38fb224677cf01.jpg
+ 221 SHA256E-s7068886--945cfae8e22db1c96ec4cfa7b7de021c6bfe4d9e4961eeb2860716d6c8a57354.m4v
+ 222 SHA256E-s684839--02293539aa97de6ab57e9caaec6998f4e64a08967d9f5f2c44581fb1df0acdd0.jpg
+ 223 SHA256E-s371333--36110b44ea216b0166b023d09b52d0d32c3bdd01dafa857ed62e7c806be93193.jpg
+ 224 SHA256E-s195249--21a08a5510bc88e85db2b5da660c61320ccd101a4b86cf3558618bbf37d659f0.jpg
+ 225 SHA256E-s0--e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855.xcf
+ 226 SHA256E-s26368--302de7e36ca407cf1441ab2d3fa855192c9d8b2e6a7ec04638d19db7056b7f2a.png
+ 227 SHA256E-s965404--fd61bc28b2adfd4d2f175e02c662b7a71dc4b09880c8198795994e70f156c46d.jpg
+ 228 SHA256E-s7254--2fcb58c8f60caadcb3e2d9e38921a49e470a9d854a55c89cb9c80f6ed0334669.csv
+ 229 SHA256E-s482912--24330dbfb1d90882bf3f42e96c236f818913c343fd828992cd03ca84a3b9b2f5.jpg
+ 230 SHA256E-s641334--bb06cea748a2feefa1a608635b83ed4311da1990275e32a9fd4549048c91a453.jpg
+ 231 SHA256E-s1239159--2d15a6bf658d588697c5b3c2b1d1382450a40517779c32d435ff672e45539a5c.jpg
+ 232 SHA256E-s2125768--a04f47c1fa5136fa397897bc907b6754a9598b37d34920250b8f70a87aaaa0b8.jpg
+ 233 SHA256E-s3968--f4147a07111527be5bc7e9a5c83e3fd7ed871937167fc6d20fb7ee4d7059aa69.js
+ 234 SHA256E-s462918--aa97a7f50f004dffdf444bb7f69e09c650c8987f52b5f4a0164c6acdeb4a8b28.jpg
+ 235 SHA256E-s29501--67fa8330853830c4b29e05f96e6e3b6369ab908238e425e8faff4ac57e12bdb0.log
+ 236 SHA256E-s158417--4058a56c1350032d640519f3aeb94ba27cd8e8b5afceb6d65e746af4f94777e0.pdf
+ 237 SHA256E-s3437070--12a5bafa210aa79e9abb86c21032003c30c3a1eb5fce45a31488b6ff08db084d.jpg
+ 238 SHA256E-s4373--12f64c274107733ae44f8ea9dc92e3ecf15400d98b3d76f9cc7e11527e4ed81a
+ 239 SHA256E-s51497--218e86c2eb9ded51b764b5296cfff76bae4dca82e07a1602c9c597a1c34e98d7.sla
+ 240 SHA256E-s4372--20e4d3e47c5fd381ffc31e6effbeb29eda97d6def773a3e42596501c6beb6317
+ 241 SHA256E-s317548--cb605575ca9fab16501f2819b000d11bb06fbb2ad1f300cfba3d011e3e8e2ffc.pdf
+ 242 SHA256E-s4960--c10e8c25e9b66e3ef77723373beae89e2fab1010c8b36ca329a3e9da20cbdc7e.log
+ 243 SHA256E-s517805--9c14fd5e5da48efd9951b086c25c04a7c5427111ef2829543497e707f93fce99.jpg
+ 244 SHA256E-s1857451--616661a96876b89472a69d32bd567aeeb95fa7da19ba4c3aa6a0ab237e2dcec3.jpg
+ 245 SHA256E-s2760813--63d375f82234356889c6222a0162bdba3b7f5a1a0cb31e24c2c209f43fc2f37e.jpg
+ 246 SHA256E-s832772--530816bf7c52c72e9b951289b5a35da753c66726d4e7bb2c2267faec6c8c263c.jpg
+ 247 SHA256E-s4660164--2832a896d7af11fc35e1dd7ab527b0fdfeedf7ffe93bcce147381a8739c81298.JPG
+ 248 SHA256E-s688782--71733ec7ffd2077ecf2973a739e4928be5824ad92034f64446a216cf513a1f29.jpg
+ 249 SHA256E-s2876462--92eb9385b333bf9eb8ad56de86e46d1ba9b21c1166814e6f16e50e4a769936fc.odt
+ 250 SHA256E-s496541--80d2e40f680dbd998b487e0ee8d479cb92741ec9c3e1f9d1d1d6d2f21a8cd795.jpg
+ 251 SHA256E-s69339--97fe05a5b2c230c5b1fde5d18555aca13d12a35940d7d8c15249e7e80629aed6.jpg
+ 252 SHA256E-s169446--5e1e9e262a58c5692f0d3c428fb71c0980311a88b474ffee95a5ea8cb5d5bf15.jpg
+ 253 SHA256E-s2678100--a347450551a9055011016920280dd0a63dfc541f4f52f8ee78ef2b7a09afd46a.jpg
+ 254 SHA256E-s87--5c2582459e3550daa4889fae41e3c8f6f4ad26dfa670502e4f516749aeac4113.png
+ 255 SHA256E-s5798--c7167ef62bc21326b00d78b47d672bc25026eb6c7f3919fa47db2e7db8855ba9.gif
+ 256 SHA256E-s53033--80840b2105a7a316a010ec3c3775031bef7fbdabbb7d3f6b7ece1a6253ef1b59.jpg
+ 257 SHA256E-s7407--8ec4462ca6a05614378729bb20bb33c3b892bc943fd698389e44d959c4506843.log
+ 258 SHA256E-s1189946--d23ba452e6e267d93f6233e885bd6f9e15b8ad1aea4c3d2368d901428df78970.jpg
+ 259 SHA256E-s3447000--61a3bd3f7dda48544b67040012d6cd5999499d25e75dc34b82d11955d0fc9b6a.jpg
+ 260 SHA256E-s3263208--69ad68aaad7058af8d14f7e4c03e5b52c9a78dbac7ffd33bd7bc5220c847d6bb.JPG
+ 261 SHA256E-s1226280--d372b699459664c382f607ff56294df49e6d8d0fcab90b509337c347943357cf.jpg
+ 262 SHA256E-s16890--12861c187e68e3591ccd5f708b935cc43bf25f5672daf50913e152c1c55e510c.png
+ 263 SHA256E-s1092669--8e7f7431c487c6cff11ee9f7c8a87aa0d057b518e60bd2b92fd677e5c9a88313.jpg
+ 264 SHA256E-s307511--5fad92167d8f9a7ed4076909a1540388cdae89df956e6011065526bfb10564a4.jpg
+ 265 SHA256E-s8334--212df98aca1ee3d4f10539a786ad746f3856c2715e23d5cb816a2374b5e6c43c.png
+ 266 SHA256E-s3375--2b403c31d4934895cccbe05556b0134bd4b78d4b873193d2b12a8893ab170681.txt
+ 267 SHA256E-s691014--470d607465715a4c0735d74da75a5aafb5f6707b9d10a9a6a8c002f095f447e2.jpg
+ 268 SHA256E-s680701--133c1dc67e394103d9f900cbf80ef508c7d7818edb23406c5f67f027a38093a4.jpg
+ 269 SHA256E-s4024--b5d3e2bb6d51ff8ceb54f501035a5feebe7d5178d35b98abe9e41531bd2abd22
+ 270 SHA256E-s1117--b7c94c25be8e78468071e78481641927450d754fd1bbd8d0d751f116d02b9ab3
+ 271 SHA256E-s476926--ea981873de3e0ca8156ff710429894abbd8a51384b210cc142b074ec9b2c9ba0.jpg
+ 272 SHA256E-s56655--7df6526b49b7aa986070db456b6a3a378c8aaaee8cb7c8892c154eecf401002a.com.htm
+ 273 SHA256E-s2963--4fc53b3029a595b3b7f1f201eb4b7c2df78afc7e083abccd070c8e6fae79a661.txt
+ 274 SHA256E-s761655--486ef18d41898ba80505d7630170305c4b58fa647786bd5447f20045bd6f3b2e.jpg
+ 275 SHA256E-s1389414--3599c1a4da6a3b61cbc4dc431c436af9bf201b634fde2f99ddf54eae8c3590d5.jpg
+ 276 SHA256E-s39678--bea819324e10bc288c75650e2196bebd5339952ce33574625ae5091ad749b63c.jpg
+ 277 SHA256E-s47531--a91ecea2694b4b5c8daab84aa25c675f2f73dbfaa8ccfd581d6868b1e2568b7a.jpg
+ 278 SHA256E-s4923--2f1b9afef156e9c7f4994106eda088868a992d92e66a5d601f77980fea80f777
+ 279 SHA256E-s84101--bca6a8a9640b1ebfa8a2ba01b3a0f7ed20ad77fa5cbb5588d46ce75949fc38db.jpg
+ 280 SHA256E-s1245742--d547d4a18279ec671be7869896c0b3e763cf8499c4dc28a62a49cd657fdf4200.jpg
+ 281 SHA256E-s655461--f9b43d2794fe757d7cb61a704a01c85bc09eb20d70a1550d6934dec12f46f0bf.jpg
+ 282 SHA256E-s137484--51fbe9bc815e41dfe22b9f9d4ed8f3ca98a8cb5cc7b81522b296d45b0279a413.jpg
+ 283 SHA256E-s607392--ead4548b66ac3ab5c930cd89bd60de480184a4f23ffce9b5da24f9269b796283.jpg
+ 284 SHA256E-s6888--405748982bbb3340eea34acbe45085ea62c80767866f0c76c355e4f94b969c7c.png
+ 285 SHA256E-s4327767--eef5840e2f4294a125aaa3ed33f8ccc96c5c2c3e31cbee356013de354e628df9.pdf
+ 286 SHA256E-s411064--4e5e5d477ccc542f78649e4b4ee6aa132bf79ae9aeb64a46cb45a7ee133eb2f7.pdf
+ 287 SHA256E-s224149--204dbb62c5d5352c9b5baead124ecf52c6fffd49120343cc21bb10343353934e.jpg
+ 288 SHA256E-s1333719--9d9ac54db47723755ee0d19731c0b2f4b40074d946da4a1e283a4904feea4534.jpg
+ 289 SHA256E-s1889687--07b79ce21bf5ffe2d80f9878d338fcd63ddc92c5381eb3c290639c3e73a7b927.jpg
+ 290 SHA256E-s686131--93ba1a21ff8cc7d9baa61a2af8407ccc8c1b22705a191e9f0a393d14ec95e232.jpg
+ 291 SHA256E-s619954--3d900d39d16eca00287a0c4bbe20b46767867b5065260a4a1fa8444081998e25.jpg
+ 292 SHA256E-s828309--f1d702dcb350cff7a3229fe62c4f0f4beb5f95ad2f00a6fd1bfb82549cd08129.jpg
+ 293 SHA256E-s516404--0ca06e98fd119847c99bee56264a31ac99b36ae71136624018d308ff8c6a2e3d.jpg
+ 294 SHA256E-s783842--0618e7c3ebc7ff8fcdff82b9fd227e8b83f491e8e1b96c2d0e566fc7fbea27ea.jpg
+ 295 SHA256E-s20748--df0711c99c30b5fdcbfdd109c093f02f6a7f5196e7ffbc8e291bb2780c5735c0.css
+ 296 SHA256E-s61739--387a27967c79b09e21d93f8a8b969dda930e8d26e9ce379c1d71718d4cc5a1df.jpg
+ 297 SHA256E-s1461106--37222c3cd7a3af846c8aaed3a174a0a7e6f775ea4c08c4e2f792c6da724812b9.jpg
+ (To see where data was previously used, try: git log --stat -S'KEY')
+
+ To remove unwanted data: git-annex dropunused NUMBER
+
+ok
+[2014-08-31 18:58:39 BST] NetWatcherFallback: Syncing with apollo
+p11-kit: couldn't load module: /usr/lib/x86_64-linux-gnu/pkcs11/p11-kit-trust.so: /usr/lib/x86_64-linux-gnu/pkcs11/p11-kit-trust.so: cannot open shared object file: No such file or directory
+p11-kit: couldn't load module: /usr/lib/x86_64-linux-gnu/pkcs11/gnome-keyring-pkcs11.so: /usr/lib/x86_64-linux-gnu/pkcs11/gnome-keyring-pkcs11.so: cannot open shared object file: No such file or directory
+git-annex-shell: Only allowed to access ~/Music not ~/Annex/Family
+fatal: Could not read from remote repository.
+
+Please make sure you have the correct access rights
+and the repository exists.
+p11-kit: couldn't load module: /usr/lib/x86_64-linux-gnu/pkcs11/p11-kit-trust.so: /usr/lib/x86_64-linux-gnu/pkcs11/p11-kit-trust.so: cannot open shared object file: No such file or directory
+p11-kit: couldn't load module: /usr/lib/x86_64-linux-gnu/pkcs11/gnome-keyring-pkcs11.so: /usr/lib/x86_64-linux-gnu/pkcs11/gnome-keyring-pkcs11.so: cannot open shared object file: No such file or directory
+git-annex-shell: Only allowed to access ~/Music not ~/Annex/Family
+fatal: Could not read from remote repository.
+
+Please make sure you have the correct access rights
+and the repository exists.
+gpg: Signature made Mon 18 Aug 2014 20:14:04 BST using DSA key ID 89C809CB
+gpg: /tmp/git-annex-gpg.tmp.0/trustdb.gpg: trustdb created
+gpg: Good signature from "git-annex distribution signing key (for Joey Hess) <id@joeyh.name>"
+gpg: WARNING: This key is not certified with a trusted signature!
+gpg: There is no indication that the signature belongs to the owner.
+Primary key fingerprint: 4005 5C6A FD2D 526B 2961 E78F 5EE1 DBA7 89C8 09CB
+git-annex-shell: Only allowed to access ~/Music not ~/Annex/Family
+fatal: Could not read from remote repository.
+
+Please make sure you have the correct access rights
+and the repository exists.
+git-annex-shell: Only allowed to access ~/Music not ~/Annex/Family
+fatal: Could not read from remote repository.
+
+Please make sure you have the correct access rights
+and the repository exists.
+git-annex-shell: Only allowed to access ~/Music not ~/Annex/Family
+fatal: Could not read from remote repository.
+
+Please make sure you have the correct access rights
+and the repository exists.
+[2014-08-31 19:28:42 BST] PushRetrier: Syncing with apollo
+To lizzie@apollo.aylett.co.uk:Annex/Family
+ 5b1813a..68b2827 annex/direct/master -> synced/master
+error: duplicate parent 68b28274ba1f0451a2e93ef4c2757ab795b920e6 ignored
+[2014-08-31 19:58:41 BST] NetWatcherFallback: Syncing with apollo
+From apollo.aylett.co.uk:Annex/Family
+ 71238f0..68b2827 master -> apollo/master
+To lizzie@apollo.aylett.co.uk:Annex/Family
+ 68b2827..16f040e annex/direct/master -> synced/master
+error: duplicate parent 16f040e9cd0bd085dd42e8869cc99d6982f8ea9c ignored
+[2014-08-31 20:58:43 BST] NetWatcherFallback: Syncing with apollo
+From apollo.aylett.co.uk:Annex/Family
+ 68b2827..16f040e master -> apollo/master
+To lizzie@apollo.aylett.co.uk:Annex/Family
+ 16f040e..e8ecdba annex/direct/master -> synced/master
+error: duplicate parent e8ecdbace26ba300e7bf3f4b8237f8cf4d825955 ignored
+[2014-08-31 21:58:46 BST] NetWatcherFallback: Syncing with apollo
+From apollo.aylett.co.uk:Annex/Family
+ 16f040e..e8ecdba master -> apollo/master
+To lizzie@apollo.aylett.co.uk:Annex/Family
+ e8ecdba..82f1c3d annex/direct/master -> synced/master
+error: duplicate parent 82f1c3da446ea356933e764e4ab0f6533d8688f7 ignored
+[2014-08-31 22:58:47 BST] NetWatcherFallback: Syncing with apollo
+From apollo.aylett.co.uk:Annex/Family
+ e8ecdba..82f1c3d master -> apollo/master
+To lizzie@apollo.aylett.co.uk:Annex/Family
+ 82f1c3d..1d82f6d annex/direct/master -> synced/master
+error: duplicate parent 1d82f6dc915ff33c86f9001c50b7c60f212b80a4 ignored
+[2014-08-31 23:58:50 BST] NetWatcherFallback: Syncing with apollo
+From apollo.aylett.co.uk:Annex/Family
+ 82f1c3d..1d82f6d master -> apollo/master
+To lizzie@apollo.aylett.co.uk:Annex/Family
+ 1d82f6d..e6f51b1 annex/direct/master -> synced/master
+error: duplicate parent e6f51b190fc3412b8c10988c2dd9f281014802f0 ignored
+[2014-08-31 23:59:59 BST] Cronner: Consistency check in progress
+[2014-08-31 23:59:59 BST] Cronner: Consistency check in progress
+[2014-08-31 23:59:59 BST] Cronner: Consistency check in progress
+[2014-08-31 23:59:59 BST] Cronner: Consistency check in progress
+[2014-08-31 23:59:59 BST] Cronner: Consistency check in progress
+[2014-08-31 23:59:59 BST] Cronner: Consistency check in progress
+[2014-08-31 23:59:59 BST] Cronner: Consistency check in progress
+[2014-09-01 00:00:00 BST] Cronner: Consistency check in progress
+[2014-09-01 00:58:52 BST] NetWatcherFallback: Syncing with apollo
+From apollo.aylett.co.uk:Annex/Family
+ 1d82f6d..e6f51b1 master -> apollo/master
+To lizzie@apollo.aylett.co.uk:Annex/Family
+ e6f51b1..e6d090c annex/direct/master -> synced/master
+error: duplicate parent e6d090c41e0226cfb58bec304c1205b2fb2a738d ignored
+[2014-09-01 01:58:54 BST] NetWatcherFallback: Syncing with apollo
+From apollo.aylett.co.uk:Annex/Family
+ e6f51b1..e6d090c master -> apollo/master
+To lizzie@apollo.aylett.co.uk:Annex/Family
+ e6d090c..e21ddb1 annex/direct/master -> synced/master
+error: duplicate parent e21ddb1bf0530ae415419ae15edeb1287ef6d9af ignored
+[2014-09-01 02:58:57 BST] NetWatcherFallback: Syncing with apollo
+From apollo.aylett.co.uk:Annex/Family
+ e6d090c..e21ddb1 master -> apollo/master
+To lizzie@apollo.aylett.co.uk:Annex/Family
+ e21ddb1..03a2d0f annex/direct/master -> synced/master
+error: duplicate parent 03a2d0fea214ae4a6acad0837587f5539f06efd8 ignored
+[2014-09-01 03:58:59 BST] NetWatcherFallback: Syncing with apollo
+From apollo.aylett.co.uk:Annex/Family
+ e21ddb1..03a2d0f master -> apollo/master
+To lizzie@apollo.aylett.co.uk:Annex/Family
+ 03a2d0f..f062d0b annex/direct/master -> synced/master
+error: duplicate parent f062d0ba684347871b780a4f0d5ff3e203329cdd ignored
+[2014-09-01 04:59:01 BST] NetWatcherFallback: Syncing with apollo
+From apollo.aylett.co.uk:Annex/Family
+ 03a2d0f..f062d0b master -> apollo/master
+To lizzie@apollo.aylett.co.uk:Annex/Family
+ f062d0b..a695f4d annex/direct/master -> synced/master
+error: duplicate parent a695f4dc83028907d2c9272f8cf8ec88d38049d6 ignored
+[2014-09-01 05:59:03 BST] NetWatcherFallback: Syncing with apollo
+From apollo.aylett.co.uk:Annex/Family
+ f062d0b..a695f4d master -> apollo/master
+To lizzie@apollo.aylett.co.uk:Annex/Family
+ a695f4d..7706c3b annex/direct/master -> synced/master
+error: duplicate parent 7706c3bf24b8529bd248c7a4bfe817573bfa0368 ignored
+[2014-09-01 06:59:05 BST] NetWatcherFallback: Syncing with apollo
+p11-kit: couldn't load module: /usr/lib/x86_64-linux-gnu/pkcs11/p11-kit-trust.so: /usr/lib/x86_64-linux-gnu/pkcs11/p11-kit-trust.so: cannot open shared object file: No such file or directory
+p11-kit: couldn't load module: /usr/lib/x86_64-linux-gnu/pkcs11/gnome-keyring-pkcs11.so: /usr/lib/x86_64-linux-gnu/pkcs11/gnome-keyring-pkcs11.so: cannot open shared object file: No such file or directory
+p11-kit: couldn't load module: /usr/lib/x86_64-linux-gnu/pkcs11/p11-kit-trust.so: /usr/lib/x86_64-linux-gnu/pkcs11/p11-kit-trust.so: cannot open shared object file: No such file or directory
+p11-kit: couldn't load module: /usr/lib/x86_64-linux-gnu/pkcs11/gnome-keyring-pkcs11.so: /usr/lib/x86_64-linux-gnu/pkcs11/gnome-keyring-pkcs11.so: cannot open shared object file: No such file or directory
+gpg: Signature made Sun 31 Aug 2014 21:52:56 BST using DSA key ID 89C809CB
+gpg: /tmp/git-annex-gpg.tmp.0/trustdb.gpg: trustdb created
+gpg: Good signature from "git-annex distribution signing key (for Joey Hess) <id@joeyh.name>"
+gpg: WARNING: This key is not certified with a trusted signature!
+gpg: There is no indication that the signature belongs to the owner.
+Primary key fingerprint: 4005 5C6A FD2D 526B 2961 E78F 5EE1 DBA7 89C8 09CB
+ControlSocket /run/user/1000/ssh-apollo.aylett.co.uk-22-lizzie already exists, disabling multiplexing
+From apollo.aylett.co.uk:Annex/Family
+ a695f4d..7706c3b master -> apollo/master
+git-annex-shell: Only allowed to access ~/Music not ~/Annex/Family
+fatal: Could not read from remote repository.
+
+Please make sure you have the correct access rights
+and the repository exists.
+git-annex-shell: Only allowed to access ~/Music not ~/Annex/Family
+fatal: Could not read from remote repository.
+
+Please make sure you have the correct access rights
+and the repository exists.
+git-annex-shell: Only allowed to access ~/Music not ~/Annex/Family
+fatal: Could not read from remote repository.
+
+Please make sure you have the correct access rights
+and the repository exists.
+git-annex-shell: Only allowed to access ~/Music not ~/Annex/Family
+fatal: Could not read from remote repository.
+
+Please make sure you have the correct access rights
+and the repository exists.
+[2014-09-01 07:29:09 BST] PushRetrier: Syncing with apollo
+To lizzie@apollo.aylett.co.uk:Annex/Family
+ 7706c3b..6936dd7 annex/direct/master -> synced/master
+error: duplicate parent 6936dd71b925b08dac26890cec58186fe0f5da89 ignored
+[2014-09-01 07:59:09 BST] NetWatcherFallback: Syncing with apollo
+From apollo.aylett.co.uk:Annex/Family
+ 7706c3b..6936dd7 master -> apollo/master
+To lizzie@apollo.aylett.co.uk:Annex/Family
+ 6936dd7..dc51bb1 annex/direct/master -> synced/master
+error: duplicate parent dc51bb1571c950330650a2881d443449bae64db1 ignored
+[2014-09-01 18:38:55 BST] NetWatcher: Syncing with apollo
+From apollo.aylett.co.uk:Annex/Family
+ 6936dd7..dc51bb1 master -> apollo/master
+To lizzie@apollo.aylett.co.uk:Annex/Family
+ dc51bb1..8f55d1c annex/direct/master -> synced/master
+error: duplicate parent 8f55d1ccbb0ee6d44e3176006abf71d76f80376d ignored
+[2014-09-01 19:15:05 BST] NetWatcherFallback: Syncing with apollo
+p11-kit: couldn't load module: /usr/lib/x86_64-linux-gnu/pkcs11/p11-kit-trust.so: /usr/lib/x86_64-linux-gnu/pkcs11/p11-kit-trust.so: cannot open shared object file: No such file or directory
+p11-kit: couldn't load module: /usr/lib/x86_64-linux-gnu/pkcs11/gnome-keyring-pkcs11.so: /usr/lib/x86_64-linux-gnu/pkcs11/gnome-keyring-pkcs11.so: cannot open shared object file: No such file or directory
+p11-kit: couldn't load module: /usr/lib/x86_64-linux-gnu/pkcs11/p11-kit-trust.so: /usr/lib/x86_64-linux-gnu/pkcs11/p11-kit-trust.so: cannot open shared object file: No such file or directory
+p11-kit: couldn't load module: /usr/lib/x86_64-linux-gnu/pkcs11/gnome-keyring-pkcs11.so: /usr/lib/x86_64-linux-gnu/pkcs11/gnome-keyring-pkcs11.so: cannot open shared object file: No such file or directory
+gpg: Signature made Sun 31 Aug 2014 21:52:56 BST using DSA key ID 89C809CB
+gpg: /tmp/git-annex-gpg.tmp.0/trustdb.gpg: trustdb created
+gpg: Good signature from "git-annex distribution signing key (for Joey Hess) <id@joeyh.name>"
+gpg: WARNING: This key is not certified with a trusted signature!
+gpg: There is no indication that the signature belongs to the owner.
+Primary key fingerprint: 4005 5C6A FD2D 526B 2961 E78F 5EE1 DBA7 89C8 09CB
+From apollo.aylett.co.uk:Annex/Family
+ dc51bb1..8f55d1c master -> apollo/master
+To lizzie@apollo.aylett.co.uk:Annex/Family
+ 8f55d1c..6cfcfe7 annex/direct/master -> synced/master
+error: duplicate parent 6cfcfe7d46e622dd1e28d7c0d182e8c5082d88df ignored
+[2014-09-01 20:15:07 BST] NetWatcherFallback: Syncing with apollo
+From apollo.aylett.co.uk:Annex/Family
+ 8f55d1c..6cfcfe7 master -> apollo/master
+To lizzie@apollo.aylett.co.uk:Annex/Family
+ 6cfcfe7..0048860 annex/direct/master -> synced/master
+error: duplicate parent 0048860fa55502c1c58d3e4d55d3a687a5fee1cb ignored
+[2014-09-01 21:15:09 BST] NetWatcherFallback: Syncing with apollo
+From apollo.aylett.co.uk:Annex/Family
+ 6cfcfe7..0048860 master -> apollo/master
+To lizzie@apollo.aylett.co.uk:Annex/Family
+ 0048860..3092f0e annex/direct/master -> synced/master
+error: duplicate parent 3092f0e9d36cfb780bf0eb4a667bfe6a8a7b3ba4 ignored
+[2014-09-01 22:15:11 BST] NetWatcherFallback: Syncing with apollo
+From apollo.aylett.co.uk:Annex/Family
+ 0048860..3092f0e master -> apollo/master
+To lizzie@apollo.aylett.co.uk:Annex/Family
+ 3092f0e..c2d3665 annex/direct/master -> synced/master
+error: duplicate parent c2d3665970d928b3eb4b93c0a69f4f1533a01c84 ignored
+[2014-09-01 23:15:13 BST] NetWatcherFallback: Syncing with apollo
+From apollo.aylett.co.uk:Annex/Family
+ 3092f0e..c2d3665 master -> apollo/master
+To lizzie@apollo.aylett.co.uk:Annex/Family
+ c2d3665..0966032 annex/direct/master -> synced/master
+error: duplicate parent 09660328b05c3eb55e78e5ec38d9d043cd6aa78a ignored
+[2014-09-02 00:15:15 BST] NetWatcherFallback: Syncing with apollo
+From apollo.aylett.co.uk:Annex/Family
+ c2d3665..0966032 master -> apollo/master
+To lizzie@apollo.aylett.co.uk:Annex/Family
+ 0966032..b4bd0aa annex/direct/master -> synced/master
+error: duplicate parent b4bd0aae9a45c024247c5ea120970ede21d52b34 ignored
+[2014-09-02 01:15:17 BST] NetWatcherFallback: Syncing with apollo
+From apollo.aylett.co.uk:Annex/Family
+ 0966032..b4bd0aa master -> apollo/master
+To lizzie@apollo.aylett.co.uk:Annex/Family
+ b4bd0aa..dff7898 annex/direct/master -> synced/master
+error: duplicate parent dff789833ff9f83324c35d1892fb271e7f59b6f4 ignored
+[2014-09-02 02:15:18 BST] NetWatcherFallback: Syncing with apollo
+From apollo.aylett.co.uk:Annex/Family
+ b4bd0aa..dff7898 master -> apollo/master
+To lizzie@apollo.aylett.co.uk:Annex/Family
+ dff7898..628cc98 annex/direct/master -> synced/master
+error: duplicate parent 628cc98b8f571d27b1b7f671992d884be9bb776a ignored
+[2014-09-02 03:15:20 BST] NetWatcherFallback: Syncing with apollo
+From apollo.aylett.co.uk:Annex/Family
+ dff7898..628cc98 master -> apollo/master
+To lizzie@apollo.aylett.co.uk:Annex/Family
+ 628cc98..11f0e77 annex/direct/master -> synced/master
+error: duplicate parent 11f0e7756811654bee5ab1ae57068ad4cfebe698 ignored
+[2014-09-02 04:15:22 BST] NetWatcherFallback: Syncing with apollo
+From apollo.aylett.co.uk:Annex/Family
+ 628cc98..11f0e77 master -> apollo/master
+To lizzie@apollo.aylett.co.uk:Annex/Family
+ 11f0e77..fb4d2b8 annex/direct/master -> synced/master
+error: duplicate parent fb4d2b8eda7b2a194d98cf841c63374bf46cc2e0 ignored
+[2014-09-02 05:12:34 BST] SanityCheckerDaily: Running daily sanity check to make sure everything is ok.
+unused . (checking for unused data...) (checking HEAD...) (checking master...) (checking apollo/master...) (checking apollo/synced/master...)
+ Some annexed data is no longer used by any files:
+ NUMBER KEY
+ 1 SHA256E-s1103321--51418dc7fc654ebbeb9173bff598b4031d07d3c5cf651bd18a18ca6af9f7f1f7.jpg
+ 2 SHA256E-s3754--39631a60a771a00e88ef5ab011ab3f56fa8e539619b06aa68e66f2c71f252f9f.png
+ 3 SHA256E-s628641--2eeef2179787270c6307e1070678b6b27cbf0fe12cce71c136e0a89e1df78565.jpg
+ 4 SHA256E-s848--66e696444c6e570fc00d79f6651018d7e6549585e587394b933dcb0d74d8c214.js
+ 5 SHA256E-s21214--f26fa07b51fe0f4c5bc0d746f8b23e50115116bbcd80db057740bccb9841e4b6.png
+ 6 SHA256E-s852198--9fcc545c030c268d660381fd33d66b06605f7c5df16dca0b3fbe4eddfbf6b339.jpg
+ 7 SHA256E-s1334033--d6e722f76229c10ea6a1ff8dce2814ee42c92b643a19ec3f4d72222e1891c210.jpg
+ 8 SHA256E-s664656--85aaeced38501abfec6d23591edb07d7ab98bbe303b98eb07cfa0577ec8309b2.jpg
+ 9 SHA256E-s3213396--90e4ec9054de04c2b2c60a49b812582ba15c8da00208c9fc74acbc69b83182dc.JPG
+ 10 SHA256E-s820026--c1fc64d12cc74f60f8d17302a95217978782ea99758bce99ea2233709be60a6d.jpg
+ 11 SHA256E-s622679--5e8412b3955db206c6836fbd5731b0ab835aa325fc75bc7d75d4511ddbf67644.jpg
+ 12 SHA256E-s917793--7f2ecba64196449b9d7f1ea79e07f496d90d59c59d12472d058566a0881a5c6c.jpg
+ 13 SHA256E-s3493204--7ce9ad40b32b5cd1237e5efbb8f6885f7d734f8af65da8d0e92dc2de13162e07.JPG
+ 14 SHA256E-s910114--be8d66d9261108572efe0266ae386fefa653cea4ef43be9fbd10f7e2fe8d1c4c.jpg
+ 15 SHA256E-s636389--07b609b0cbf827a45cff2ca92367f3c5bf9a9527d4b3cb43961487bca8068ffd.jpg
+ 16 SHA256E-s823401--4cf12d87a9034d34a3019b5002000c92512f901a82f1081705c12e73b5870bad.jpg
+ 17 SHA256E-s1880--add7e1d7d7d98ff96afaec27bb066d6747551358e025176265a31b2b0f74bec0.log
+ 18 SHA256E-s8784--e28377207d41b4fef538b2fcbbd25c05275103a299e74966a88dce53ad5f50c0
+ 19 SHA256E-s8694--490b9f2f9c4c826b68bad68a50cf672ec36c58acb9e24fd46e84abaddec19b9b
+ 20 SHA256E-s2656--96dd5f3d5f8e87ce1552798dd5fe4c8dedab6268c0df9e391a202ffdc4b8fa71.log
+ 21 SHA256E-s459593--b68a62596f7524b6f877d8bd3dbbe49f4de02310e9dd6d5134bbdabfcd5d957a.jpg
+ 22 SHA256E-s11931--5ce30bd4424d544ed954e4722d7ed590a5be46a267c5045953e034309d942a8f.odp
+ 23 SHA256E-s1249581--d834f2dc34ded72086e26c32784e693597be011f28398635286394c7e8b5ded7.jpg
+ 24 SHA256E-s335736--9638a3225f1adbdb736a2cacc476f8eb5201c8124b83dab887a26c6d3a0e5899.jpg
+ 25 SHA256E-s6339776--f42083be1dba62acf81ad5ee8bccad47f267e2ce34c9e73e9aaafe3c69b462bd.pdf
+ 26 SHA256E-s582899--858ad02a9e5f58a6f5ea509865831acd540c290837beb87b37cb36bb62a7b982.jpg
+ 27 SHA256E-s2475657--d3fa5e460a2b164e849213d0417790704d1b4a2df9af5f6b281ac17dbacad30b.jpg
+ 28 SHA256E-s637475--68315445dd9477f07a695cb9fd12bb2c95f3117d949665ec2690184ded6b1ee6.jpg
+ 29 SHA256E-s77771--484ed3d8cc44de2db74c5680659c5c23ccb29ed5e99d0fb4b470a2c130c64c79.pdf
+ 30 SHA256E-s2343639--a7fccfe9a2c8de20ce8df10048b075758c445e5f4c9d9b78368db179e74e9a47.jpg
+ 31 SHA256E-s2282836--66e945f3a37651e1c88c58ff42b4dba9c6c5d822dc59f3e59895c336a0428c3d.jpg
+ 32 SHA256E-s5902--da66d622f9ed0987a0466c2c05c2aea56572e2f991c542b1120d564fb7459e7b.log
+ 33 SHA256E-s61410--4d3f0160bc92d0095a824baa17a08499dc748d06648029051802d24a772ba75d.css
+ 34 SHA256E-s1958077--1717f3036e7ca6b61fe8eeb3ce319de728b9bea10fd814108b9e13397a336db5.jpg
+ 35 SHA256E-s80930--f9b79963053221a10e32c4061b9da3622e89ce56aeed26c58f23bb70a2a57496.jpg
+ 36 SHA256E-s4956--a05854e0d26affdbb3e171c8e9ca3f663c8bc930f6402d9a370104e239bc2601.log
+ 37 SHA256E-s202851--3689503ce6f780d04e659fc85e4e7978c3c445afbd103f3ac118e1c6f3a4b738.jpg
+ 38 SHA256E-s5258--a243d289f629eb2e321c7232aa59c65d10ec79e70d07f25758ac04c0b9ff3f79.log
+ 39 SHA256E-s5406--dc07212d5aaaf5a320b3f9d710a72b68f7112140c76b43b7c0b4bb71f91e823f.log
+ 40 SHA256E-s8427--439c4f2144c9ea726b739494565b05dc47b59a8835e24e9a083171efc0834fc1
+ 41 SHA256E-s46--ca4a766fadecf16bbc25afbd805e2befbfb4cb270f122b0de813fbcfc933c1a2
+ 42 SHA256E-s839129--921ddf15c906a0353cb18bdd0b321bd5a37dfe653edbffc8e3b6b47996d54d8f.jpg
+ 43 SHA256E-s2922183--3aa5d5b22a980a11cee928ba701ffd389542db84fe96219442de1b33a64f840c.JPG
+ 44 SHA256E-s1305363--0b14938c28492e288d35a62334d6436ba8edfb7f65a066dbd9587478f157ab99.jpg
+ 45 SHA256E-s8602--819b18ca30f477f66e558ba1488a06e438a5f0b9c8f6987f68daad039d8020ca.png
+ 46 SHA256E-s6205--14691e198b05dd68b5fe3ed39eb8739182f4f5e75dc43dd7ecb252f01978c7ed.png
+ 47 SHA256E-s5070994--d0c5367647750b1f0b54c9fea7c7c9e1a0f7a0a7f61c92a688887538df3abf7f.m4v
+ 48 SHA256E-s134807--7100078e84c39a2123c0ea7d713e3361c7174f21fb72d39dac2a99a4844f89b7.jpg
+ 49 SHA256E-s535905--f317f11e4e0536ea8172e7827369bd9a3c887fcef2586b8eeda28b2dd36a791c.jpg
+ 50 SHA256E-s6420--72622a4453f4ea48acc0337bb1b288e0fb034d1ee1aa74f98eb9062066c025b5
+ 51 SHA256E-s51483--c9fba5eb0b29216afd9b6f13dd2f351367b7bcd0c8eb93fa0a1b6a0ce4535d57.sla
+ 52 SHA256E-s1957447--c3eddff4df50e1b0c5dc93f85e39acd24723013dd9b27b7b8a407eb5e55f1903.jpg
+ 53 SHA256E-s5345--ee879c6bc3c3ac59f449a9d9f92ec9cc2d15dced1f166805a179b6874d190c25.png
+ 54 SHA256E-s153751--c3fd0000f94ff9c44fef856ee440837fa4c228918ae70d0813d1635d50e6d4a0.odt
+ 55 SHA256E-s682324--33a6a1b34570f9abe0516d9abceefe14aae4cdacc41dc3f30ca92222d545631f.jpg
+ 56 SHA256E-s370109--a00b1c78753de6ae1d64a01d457b53a3572a9324a0facda4ec39a149d9adb37b.jpg
+ 57 SHA256E-s310217--aa0c575a44cac4957e06cd8ed0b058a16454a7be7f32ec8e79c815be6057bfbd.jpg
+ 58 SHA256E-s5798--61852a3ad168d4f27fe0f0e924e7418e838ae4363d85a64ebea80c9154e0c9a0.gif
+ 59 SHA256E-s47071--f1a74e5f9a20776adbe88ac3092e5a20a69d254905c0f93aa0b95a1ad0a5ed00.sla
+ 60 SHA256E-s988--b1f5fb3d38001b8bcf214158c6c7571f5aadb03093d2c307970a728edcb8012b
+ 61 SHA256E-s1397011--b67c04c6c99ccc208734dd39e18d4304a4963ef36600d4adc5827df21bfcc260.jpg
+ 62 SHA256E-s2124--1c64d2a60a40242432550ab3292e1ee38072481c36b8f028f75e3b4ea52fec29.log
+ 63 SHA256E-s1640512--ccb4940713e190a9242b34e18896156733f36df909c7e399bfdfe36299bfa748.jpg
+ 64 SHA256E-s484856--55f146177198dcd03069703c7b8bdf5c10cd7750aaf4b6f9af1946d72a9f9d23.jpg
+ 65 SHA256E-s7031--88bedea3e75aff77858c63a6c30bb06180bd9167fd380d94f132486d6ffeddf4
+ 66 SHA256E-s10100--1df9143f4c02f877ec891262bcbc407a9d4b960dd80c6826d5c1078012dc2614.js
+ 67 SHA256E-s2454--778574fe7cae3bfc2a49cbe3be18ed313b049b6e0bc333cea80723ae2136f9c3.log
+ 68 SHA256E-s63103--474c29d016927bd7dc42d992fc07c353148d393cfbd7c3e8193df91c3bb2d805.jpg
+ 69 SHA256E-s245481--ba0e9ed8876970e0aad7e22aeaf4f7403e1ef6fca474e0b4e90837381c0b810f.js
+ 70 SHA256E-s708--ab8f3c450c5c8944d6d91c35258b9da5ff4564b9b05b1e09ebbaa9b740d14aa4.log
+ 71 SHA256E-s582241--fb565e6fa923f3265a9406abf566d5de7a8e062b1d9ccb8ba7ec61a902ea277e.jpg
+ 72 SHA256E-s601517--fd4a4effd6c6b064be34910b36f1de8011bb3949d0f883a57ed4ca60eff6a642.jpg
+ 73 SHA256E-s613354--0d78d51b5047055d9bd2727e01a7c73ec25bcb99925be26550f3b921054e336b.jpg
+ 74 SHA256E-s20794--0ba2f6756001669bdf934f9d79e8fd1ccf2028130c33a0510279581ec9dfd73a.js
+ 75 SHA256E-s654750--be05edd69e61fb5ebecbddc8c39ae9ebdbca5e94ee395f604bbd73910a7e40f9.jpg
+ 76 SHA256E-s440--4e8500857e2b6a08a6922ca852ff4c9702e2397843011a14dee43d6e20c4f787.log
+ 77 SHA256E-s72381--a170eff1ba771b3e4e769ab2974b8fb1f66cff07bf8b19561a97f9d7767b565a.jpg
+ 78 SHA256E-s344661--21564a2da0f6b1ea6c4a39f4a96ba02680facb9d8a084d4fffa28b0e527c9fc8.jpg
+ 79 SHA256E-s51248--f940d364ad2583a9ae3c0f777fd61406914daa1837ed8dd78f3461760c4ca747.sla
+ 80 SHA256E-s502234--251053730579880833dc12058a6c689ba074f0a981331ec7eb685b69f08e292c.pdf
+ 81 SHA256E-s3682--f75a95ae16e2f8a8e0a607782cf332dc34c1e317d473023cbd7f9915fa400d62
+ 82 SHA256E-s3544--9b40beb44b624520a74057a82ae5e6adb18601e6c1fc7d8496bdd59e3b248945
+ 83 SHA256E-s355156--7056bee290696e681cd3538e2ff2e740842bce032effe509f0919e888cc03ee4.jpg
+ 84 SHA256E-s879539--12cc34616b2dda153890db0a724290fa01bd9dd664061a05c8d2c1039cd4cc3c.odg
+ 85 SHA256E-s2051310--69387e84897ed700b6dd7c418fc3a7884a1e6e16a4267297b3effb95b02a7bc7.jpg
+ 86 SHA256E-s620--eb69406700a3a6122cb532614f4ae6899d97409d76259820176f7ae77158684b.png
+ 87 SHA256E-s693427--e20c50c86937800b14e2773d79eb63d13c0300781f8e71ee3947fb5a2fe98fe5.jpg
+ 88 SHA256E-s87985--b89b279ca5dede3643e8a48402e9b112b1e1fdc14b3326c98cbdb32f9f7fa2cc.jpg
+ 89 SHA256E-s35739--378d1bcb19c2742b8d344459a74f9b4ea44287c4e5cf046b80a46b209ea1ebbb.sla
+ 90 SHA256E-s51515--d4805b60c6e0ea396dc157ca0e399ba355482f2a9696f31fdcf819aa176ea3e7.sla
+ 91 SHA256E-s396738--5e18be640581ced943a676323c80dc283b15d3caf37b2bc2d0b05ceee1d178e5.jpg
+ 92 SHA256E-s334295--7f97df9f93e42a2db9e9efb0aa34a2a9a6b9af49846e6a73f320ee151d535eed.jpg
+ 93 SHA256E-s425513--0f6228a7466c12d1d0e4beda9825f17442b15286a5639e3a894a36d33497c77a.jpg
+ 94 SHA256E-s114076--6a1822942964efa5531de2cae48d3fd69e71baca7ade38b7cbe23964637d4478.jpg
+ 95 SHA256E-s118034--a8b1e6f81534106e9f4563dfe3f288e9425284fbaa74247065cf80448cdb216f.jpg
+ 96 SHA256E-s639--4b491df2b47c2fd4dcfbb99b50ec1367e138c61216704490ada08cddd0d32fda.css
+ 97 SHA256E-s734079--0602d1c85bca8508010ed03c2b1c26c88a8c759783f49d7f7b282b30837c6b32.jpg
+ 98 SHA256E-s130889--751d2fa73ac74e17d2e82fc9a89b3d393028197790657aa075effc7c16b8f528.js
+ 99 SHA256E-s485283--63716cdb8953a9318eb28953af25db2afa02251e6f152d487f5ab05f1d27930e.jpg
+ 100 SHA256E-s59518--6a80f10665ad39dc27ee3a5727ebeee321a289dbc958916f9e6eda01f2703d25.jpg
+ 101 SHA256E-s194--4c0fc707f629bcb314433fc700c6090c970d343adbb921f46084bdb08f99cf6e
+ 102 SHA256E-s303--07ae4fec1962f2f83808ec861e477d5669dd71ff1089cb25a0e1da7b3ec9a5a6.css
+ 103 SHA256E-s24519--3f3cba473c1818b2ce46a034fc323d528df85dd88d3f2ed411ad644a08ff9132
+ 104 SHA256E-s316292--691e653f57643e579c261a827441e63ee3d8cf1f9ed5cdc43d861cf340510d34.pdf
+ 105 SHA256E-s11916--88e5b1e2f5bd0f5c458abb41589028ef35dc75872abd7e04eee4a12ae7bfef38
+ 106 SHA256E-s733240--fe7b7c77712b866c932d391f8305560d488d0e5515f3d9c890ddd11c96ff6069.odt
+ 107 SHA256E-s4323950--c71e34a9fa2d1f54934d3caf829e4b5330811c2937d523f856d43cf5d92b7275.m4v
+ 108 SHA256E-s475740--e2d4880b8561167dd91b57a666f3eba68931ae3546231d102469c76d341f560a.jpg
+ 109 SHA256E-s574--5d1bd8763457376e0ff677895456f9aad26b6d85e15648696e9f4c77af104fee.png
+ 110 SHA256E-s11608--f815f1bad38a05f27b1f7cd416236148fa79554ed2546a014afe148c0e427839.log
+ 111 SHA256E-s3300--7164c4d91218528eedb0310af14927d4ce483889b53da24fdcc01fadae107fbd
+ 112 SHA256E-s962958--9a81dba98b0b910641d035bf662b847fb4785ef2378bef7b2ae6713b1fbd903c.jpg
+ 113 SHA256E-s845627--09f3e811c372a7ee936064d4c48c8b4f36db519a49a0b274f69e3da12a0e2ffe.jpg
+ 114 SHA256E-s2380622--05725288b66460ff1befda38280dea4d05c5dff42818de7d64e619e12aebeaa0.jpg
+ 115 SHA256E-s62795--a32762ee80e176ca1d7869cd5f68e7442327e1a861ed70290f2256179ebd844c.js
+ 116 SHA256E-s3486--f148d21e252ab05ff7039fa276ee309e6d16d2ba7444043acc148b9986164162.log
+ 117 SHA256E-s2393747--1ba6fc7f4d47ced145ceab80128e3ceaf8cfe8f2155b5e33e9273c736a81b910.jpg
+ 118 SHA256E-s4611--bbc334899e27d8fe781f61e06be1c28852e618d1e2bd8b98de0aed7fb6106ad8.js
+ 119 SHA256E-s826134--426211e056784356538d3ac80838e197e2cdf29742cd31db6a386ce7c05aa052.jpg
+ 120 SHA256E-s1072403--87da8298b8c3c76bdfb8c96ac7dcb11349763067056eb0e1fadf5241fc134141.jpg
+ 121 SHA256E-s51028--d6d044282ee1d1d8fc02130ac42ab1d7ee3a6a7e2987b78bb1062529019cf3e5.sla
+ 122 SHA256E-s45783--35b9963b4a8bc3dbee5bbe827c2e18c795b8fce86bb1eb87c6b3b09327380f1f.js
+ 123 SHA256E-s999195--c0fa3d678c9ebe118ea3fb1b664a2f63ccc792a7578fe921d0c299adf40d97f3.jpg
+ 124 SHA256E-s96828--c5ebf871d1c98e5f49d15dc22131e483b514754ad86c6293c69b6d5aa3d44cf9.jpg
+ 125 SHA256E-s159835--47a9ba3de62d6a4b11dd59a60b0047d3d377c224ceac85bfb6a81a972f25fff9.css
+ 126 SHA256E-s9629--588e723593992acb553dd4f2c76a6993135b4f49e674358fae63ff06e145f07a
+ 127 SHA256E-s39867--6e96f4658811bba2f27f930f764111501e438135d793e28fe7eacb6b10866e0d.js
+ 128 SHA256E-s62332730--a2c804ddc66d8175fb5e187d17c904954f1e2cae634c4604ac363eb97d78f7e1.odt
+ 129 SHA256E-s1711933--dd49df68da23021d3e9cc775e86bd5341dda6ba71714c8287872deb9416e051a.jpg
+ 130 SHA256E-s290639--0803de7a02e9a4a1caca69b2a7b2c948e7faf2e4ef2bf3bcdaec148c0f26b842.pdf
+ 131 SHA256E-s5799--fa90e9a478760bc12c2707962f2ea6b9ab213bc7d4b158f28f6739727ffe05e7.log
+ 132 SHA256E-s11156--17ca703a57e9f02ebd71251ca8bdb6d82b71fa586deb034cd384b21a3818035a
+ 133 SHA256E-s16171--47a7946e6364fa5ad3dc595105c79a4946f18cbef0818e72682d9304625ceab9.odt
+ 134 SHA256E-s1962015--2eae4dfa79e014bf4468141bfac8c0065d1b05f2532758c6e68deedd297f22ee.jpg
+ 135 SHA256E-s31268--560829df213299f5db9aeb0b31b40044300c34e92818680f422d0ddfe7602f2c.axd
+ 136 SHA256E-s145407--c34c44643d9d0f7114cce8b31f3442a7b6392c4687af9ab97995bd30ddd3167c.pdf
+ 137 SHA256E-s1773--8417f863ffa4a076dd2d8b5a63170bb0c5b83cf275d72245a79c31d94358fd20.log
+ 138 SHA256E-s701838--3d7abfd8b091e4da1bb61881155c299b78ed693f128f1c693c7970bcbce4e8e0.jpg
+ 139 SHA256E-s2089502--f4c9ec5dce63924cba6f77efd5e20b17cfc0f3c9ae45dce7bb0ecc5a10986205.jpg
+ 140 SHA256E-s1085890--0346c7a329e7b80c7f93b8aa7de039bf322070ebac33cee6ade6fcc4a4f296be.jpg
+ 141 SHA256E-s3998--e38f3a315b698a0e8ccfa395431393af757f882413cea8b4879b5b5993543f86.js
+ 142 SHA256E-s7372--181699a3ca4be8bb0e9913fd96dc5c44ed8a790ea6ef2bb0fb285e741f2c46ab
+ 143 SHA256E-s864279--364b4a4d0a30ddbf1164d5d3ded0702a4b016ffc27d26eb6005d96e68aa4f77f.jpg
+ 144 SHA256E-s2941--7ca4f001618fda61146802286daf472c5daaaded2471e356a752b6a69834e7f7.log
+ 145 SHA256E-s153049--5805df5cecdaa15a549bf7751b1d66f7455e71e2243709d9799f839e42d082f2.jpg
+ 146 SHA256E-s542959--5823d605d7258bd813d09712fd124fd7c63f2cbdf46a9b52c3eb67eb7bb538bc.jpg
+ 147 SHA256E-s45282--b20a77431de35f8e70867cfe520503528fb948d63f724ed90fc249994875b77a.jpg
+ 148 SHA256E-s19556--e5bdba04d2a9d805c491778a742744d3007d38a23c9dc11cf8f6eab7b2dd0a1d.log
+ 149 SHA256E-s392108--c9c76c131588fc29d588afed12d98b6b3a6aa0a9971ad368112bc0c2a603e70c.pdf
+ 150 SHA256E-s8275--ff63b5b012ea62b178310424d817a8a77fb31151dd697659f85f23a6298cf28d
+ 151 SHA256E-s1769251--7d0a2ec1652f1287884f6bd4e0df14106af271e81fc38cae5aac1357966ea672.pdf
+ 152 SHA256E-s464748--aa63c72a4b064f91083228395e1391d970873ad1370900a468db154ed266d475.jpg
+ 153 SHA256E-s6130263--3521b18281dba779713e600fde1a4d15568328baad6baf43cba1530df7165c5d.JPG
+ 154 SHA256E-s494260--aeb91b314f3dee3580093e9610dacd5917265794b49acea9d80dfca83d56b88d.odt
+ 155 SHA256E-s3362329--05fde815df42455fdc1b563ce41bf13d585135da628d01c5ffc9ca627c008225.jpg
+ 156 SHA256E-s489239--d2ab01a94808613489205b7aa5d666cccfeac0a28b5a76ab18fc9fd9435dcabc.jpg
+ 157 SHA256E-s482249--e4979b950d4633515316102d934115b1981c8adf5a14ea80bfda87e623af7989.jpg
+ 158 SHA256E-s93506--3f44779fc3ce611f607c9cde2c114f6f038775485a677e17bcb6bb034e6ac888.jpg
+ 159 SHA256E-s818--66d21ef5da07cc00768b23bb711ccc8e18b91c99ccad2084ec309f51e6c52db6.log
+ 160 SHA256E-s171892--33f34e7d16851c2291d7495754505d391be4668883b43e4b9e587126c693b1d2.png
+ 161 SHA256E-s278132--fca8b8bbcc0f9fe8addb57994c69a9c511b206c27424491809ab31aef86f21b4.jpg
+ 162 SHA256E-s2418631--deb0aadf97aa49010ac3cab5f5299e2d68eeb5ecb4dd5de93316f23a714734f6.jpg
+ 163 SHA256E-s125121--2b2cc905b8c05d4c7253a9c2b45a961df545842e4ce9d17e5248aa6240e77557.pdf
+ 164 SHA256E-s199793--615ac75e6766d637d17159ebe3d48eedf27096e93b83efc159431da4d032e21b.axd
+ 165 SHA256E-s223221--ca5f5160688546f422cf7d041e58f07d5d90e8359666e523a5af515baf0b2980.jpg
+ 166 SHA256E-s1959724--2e44ed4b10ab3c1655b16335b901547713ac8d5c38d4ed3735bcbabb272242b5.jpg
+ 167 SHA256E-s11609--df8dcf81585eccae95b7c4f0a0ba8c6fc4cfe90ebbf9657bd6a10320f7195e61
+ 168 SHA256E-s483419--96cfd3b43e5b7bb1d6a5bc3f78d33e873fa36ee6e53c9f1de083f279c19c5f70.jpg
+ 169 SHA256E-s560766--96f47b698f6502bc758e6d8b9b538368f8085d040306388bfd42d3026c465ff5.jpg
+ 170 SHA256E-s3848--4d18299f8d8ef1bfbd7b206d419ef6f65cbd09a3ae999f3c7cc8496051b34080
+ 171 SHA256E-s1141493--80b7a82ee4edc420c538c4a2a37fc9d80cce4c321f5a9a7fa7e66df0c9e3693c.jpg
+ 172 SHA256E-s9726--14b5e76da3417f5f25f48c2a793aa50da9c920451495af7612b76d3c052d3f13.odt
+ 173 SHA256E-s939529--43d05562e75f2477aa6d412d8a672ce7b6cf2890d4e1578bf88692aabfd0e70d.jpg
+ 174 SHA256E-s888147--948ca59b827f77f75ea981b149a72df976aea360cd263d0f7c03275375a47232.jpg
+ 175 SHA256E-s740710--f1e98c032815161aff44c8ccbb882af5cb234f91c4430cf91d01115649bc9aa5.jpg
+ 176 SHA256E-s961257--e6b21901e268f6d0f3a38b43e5a06d8ad9ec0901f4c9639954da7ecf2ee4a666.jpg
+ 177 SHA256E-s616645--bd10a26926e6cd0fd0ee6cf72692c92134b183927280a00a74e869bbeae8bde6.jpg
+ 178 SHA256E-s47996--f862cbc7bea6fe4b5fe3a3af2b393973220a34975dd36a9d5f92b30d1db80acc.sla
+ 179 SHA256E-s2396909--2e6d435cf96f81a3f3247f2d35b01701f8a46977e813745324ca5b40717fdea9.jpg
+ 180 SHA256E-s180605--66c6df69bba4602100148ffd0f0a0ba0a14b74eaefb3b27708c6792d2b5cd09c.jpg
+ 181 SHA256E-s721289--159f9398adde99e23b05c8c8c99aadd98b6a3a80afe5e3745ff37b0668fe4a24.jpg
+ 182 SHA256E-s95559--0d932a11d465d523f85b17803d44fb0748459771b2cd843dbcfd677248abb0f5.jpg
+ 183 SHA256E-s368166--98be96450123c166cf11f1763aa25040ffb1674f7267a4041cc1a4fbe8e433a1.jpg
+ 184 SHA256E-s846--b3c9f5697bee76715237040d6ba5ff9f657dee2d882e36d818ed2ff50e8e0835.log
+ 185 SHA256E-s581051--217882c3f655c62dd323afe0689c9485d0d09430d5356a63105632cce08ea88e.jpg
+ 186 SHA256E-s586436--006bfd4f9697d8b64be920876bd8c0a40967b253806072ec09d2a630909826e4.jpg
+ 187 SHA256E-s398620--1ab7d488bafe19941f33155959c1bbec199a86ef2334c08b75b450bc9f36a16b.jpg
+ 188 SHA256E-s10457--0be429c323998556486e8f9977ccc980be3ba3920d5cc3bf16a6c7bb57b0fe3c
+ 189 SHA256E-s83789--c286b21f977391efd38b5a5a341f9dbec4da611a16bc1d17d8ca71d49ad64d30.jpg
+ 190 SHA256E-s321943--5e3983f4b43ae782b6f41c4f899027f1d55f78347e2106bc4c96e7f65c652918.jpg
+ 191 SHA256E-s7518--be582d1ce8295d8c47e261eb7bd78a0e720e78dd58805808e9bf64ddfc3c4fe4
+ 192 SHA256E-s6118--3ca5d8ca6cda3acc6c07c604f6880c017e6faa7dad4ba61e9aa956a9fa8b4b0d
+ 193 SHA256E-s1086965--e170514a3651dda3313f4dcfdb9490f039a825b8349f74957a17313bdbcd7e8d.jpg
+ 194 SHA256E-s10504--a57d3172d4a009a1a0d38993ea6dbe03fab6aa1ec429aa4aab563465b0dc43bd.js
+ 195 SHA256E-s530445--7c8e603a03e17bb0c6440df6b695e557357527bc081871b51d0b5a61222dd674.jpg
+ 196 SHA256E-s37480--ba3a0b04e4325bf0853c6201ecf7bb0fc08a0a13f5fdf0a4477c6a1f0cc82559.js
+ 197 SHA256E-s394333--77f7debb969fd22698b60339ed0a0e98d9c43b8c74203528a02f6a185784e808.jpg
+ 198 SHA256E-s568976--43c009e20c1b4b28d651c64ac1faa9ebd5e704bb975e2fb65ece83f4cb8867d2.jpg
+ 199 SHA256E-s13813--4b4db06a82938c002539bc21d9285d63387e1a6241932c111c4f3992fa093092.axd
+ 200 SHA256E-s2735--f73ac06c4be021a97a8c40f5371f0e62fd7094d863d9679407784c09c13ddd5b.log
+ 201 SHA256E-s25176948--4493a4fd3160627db1fdd24c2a6bd402b544c495565815007c2d0d5093478d2a.odt
+ 202 SHA256E-s596273--de2ec9fe99774ea6ce0a746a66888b71cfd744d3d97084439d054e58adebe709.jpg
+ 203 SHA256E-s947995--956f7ec6d1c0c931c40e055fe21c2cfde8ef135f816052147406cb0c3ed0f948.jpg
+ 204 SHA256E-s5283--5fbb8a58b8bf48ea0511c26b1b319f737df54e8e35f13b5d851dc7c0ce662458.png
+ 205 SHA256E-s777575--c9fea606bc2e419967c550c43b5345bf7b08b43a81d0cdc561e048b94d536e10.jpg
+ 206 SHA256E-s51496--36143df60284eae68573cb266a34a25f3c042bfd8314bdf0730c03a4fb81bb38.sla
+ 207 SHA256E-s3013379--4f47c51193c043d2e81aa0bf46927a5f5c305625a09ac9034f9cb6e25ea2c6bc.jpg
+ 208 SHA256E-s592379--4cea82764a163f6da9c6e63f553f82f119d5188d187c0747ee467a337f81446e.jpg
+ 209 SHA256E-s8402--5b400d459743a01405d2d1ffc4d07651c36712caf9030e2a091e48f97c58a2bb.png
+ 210 SHA256E-s662301--f0cf51849e330e861513bee59063450d14759055c67986e8a31dbbde0907a254.jpg
+ 211 SHA256E-s1371822--0c85f348595f845e0076e52157fbb772a9d72a4821310c187b183370d7bb1b4c.jpg
+ 212 SHA256E-s13445--460f9e3ea4f8a260af278d81c59faa45f16b2069b10030a8a253cd852f2e8e34.log
+ 213 SHA256E-s19780--3f513b835cc3299a15178dae45cc523f1b06a1c13bd0e1c29f958027d3f5dc8a.axd
+ 214 SHA256E-s311438--00b3cbd6de31a75e3a017c452099991f1ec09327efe9c6450012f6015eb6e1a4.jpg
+ 215 SHA256E-s8942--e267fde4da4719de2c454d82f907796167f425510ea84098a39b425b69d2df5e
+ 216 SHA256E-s845884--58974bcab0e36d65d606c1acf57e34e2e6f89872fbab65b9abf5250c632967a5.jpg
+ 217 SHA256E-s331598--de52b228ad93c774d4dd1d41556ff27f7f03802378747807f324a9604e32ed66.jpg
+ 218 SHA256E-s201837--d3f750f64687f347f0254d3c602a010ef71636a85f37954690d20bb6548437b1.jpg
+ 219 SHA256E-s537652--aeaa479c57d39b3618006162c80e1c0eaa2cfa0b2a9a2c069a3d601bfe5b0706.jpg
+ 220 SHA256E-s1174974--1d506c737c2dbde4aa286a2a25b22412c83edc5e55c3cc94fa38fb224677cf01.jpg
+ 221 SHA256E-s7068886--945cfae8e22db1c96ec4cfa7b7de021c6bfe4d9e4961eeb2860716d6c8a57354.m4v
+ 222 SHA256E-s684839--02293539aa97de6ab57e9caaec6998f4e64a08967d9f5f2c44581fb1df0acdd0.jpg
+ 223 SHA256E-s371333--36110b44ea216b0166b023d09b52d0d32c3bdd01dafa857ed62e7c806be93193.jpg
+ 224 SHA256E-s195249--21a08a5510bc88e85db2b5da660c61320ccd101a4b86cf3558618bbf37d659f0.jpg
+ 225 SHA256E-s0--e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855.xcf
+ 226 SHA256E-s26368--302de7e36ca407cf1441ab2d3fa855192c9d8b2e6a7ec04638d19db7056b7f2a.png
+ 227 SHA256E-s965404--fd61bc28b2adfd4d2f175e02c662b7a71dc4b09880c8198795994e70f156c46d.jpg
+ 228 SHA256E-s7254--2fcb58c8f60caadcb3e2d9e38921a49e470a9d854a55c89cb9c80f6ed0334669.csv
+ 229 SHA256E-s482912--24330dbfb1d90882bf3f42e96c236f818913c343fd828992cd03ca84a3b9b2f5.jpg
+ 230 SHA256E-s641334--bb06cea748a2feefa1a608635b83ed4311da1990275e32a9fd4549048c91a453.jpg
+ 231 SHA256E-s1239159--2d15a6bf658d588697c5b3c2b1d1382450a40517779c32d435ff672e45539a5c.jpg
+ 232 SHA256E-s2125768--a04f47c1fa5136fa397897bc907b6754a9598b37d34920250b8f70a87aaaa0b8.jpg
+ 233 SHA256E-s3968--f4147a07111527be5bc7e9a5c83e3fd7ed871937167fc6d20fb7ee4d7059aa69.js
+ 234 SHA256E-s462918--aa97a7f50f004dffdf444bb7f69e09c650c8987f52b5f4a0164c6acdeb4a8b28.jpg
+ 235 SHA256E-s29501--67fa8330853830c4b29e05f96e6e3b6369ab908238e425e8faff4ac57e12bdb0.log
+ 236 SHA256E-s158417--4058a56c1350032d640519f3aeb94ba27cd8e8b5afceb6d65e746af4f94777e0.pdf
+ 237 SHA256E-s3437070--12a5bafa210aa79e9abb86c21032003c30c3a1eb5fce45a31488b6ff08db084d.jpg
+ 238 SHA256E-s4373--12f64c274107733ae44f8ea9dc92e3ecf15400d98b3d76f9cc7e11527e4ed81a
+ 239 SHA256E-s51497--218e86c2eb9ded51b764b5296cfff76bae4dca82e07a1602c9c597a1c34e98d7.sla
+ 240 SHA256E-s4372--20e4d3e47c5fd381ffc31e6effbeb29eda97d6def773a3e42596501c6beb6317
+ 241 SHA256E-s317548--cb605575ca9fab16501f2819b000d11bb06fbb2ad1f300cfba3d011e3e8e2ffc.pdf
+ 242 SHA256E-s4960--c10e8c25e9b66e3ef77723373beae89e2fab1010c8b36ca329a3e9da20cbdc7e.log
+ 243 SHA256E-s517805--9c14fd5e5da48efd9951b086c25c04a7c5427111ef2829543497e707f93fce99.jpg
+ 244 SHA256E-s1857451--616661a96876b89472a69d32bd567aeeb95fa7da19ba4c3aa6a0ab237e2dcec3.jpg
+ 245 SHA256E-s2760813--63d375f82234356889c6222a0162bdba3b7f5a1a0cb31e24c2c209f43fc2f37e.jpg
+ 246 SHA256E-s832772--530816bf7c52c72e9b951289b5a35da753c66726d4e7bb2c2267faec6c8c263c.jpg
+ 247 SHA256E-s4660164--2832a896d7af11fc35e1dd7ab527b0fdfeedf7ffe93bcce147381a8739c81298.JPG
+ 248 SHA256E-s688782--71733ec7ffd2077ecf2973a739e4928be5824ad92034f64446a216cf513a1f29.jpg
+ 249 SHA256E-s2876462--92eb9385b333bf9eb8ad56de86e46d1ba9b21c1166814e6f16e50e4a769936fc.odt
+ 250 SHA256E-s496541--80d2e40f680dbd998b487e0ee8d479cb92741ec9c3e1f9d1d1d6d2f21a8cd795.jpg
+ 251 SHA256E-s69339--97fe05a5b2c230c5b1fde5d18555aca13d12a35940d7d8c15249e7e80629aed6.jpg
+ 252 SHA256E-s169446--5e1e9e262a58c5692f0d3c428fb71c0980311a88b474ffee95a5ea8cb5d5bf15.jpg
+ 253 SHA256E-s2678100--a347450551a9055011016920280dd0a63dfc541f4f52f8ee78ef2b7a09afd46a.jpg
+ 254 SHA256E-s87--5c2582459e3550daa4889fae41e3c8f6f4ad26dfa670502e4f516749aeac4113.png
+ 255 SHA256E-s5798--c7167ef62bc21326b00d78b47d672bc25026eb6c7f3919fa47db2e7db8855ba9.gif
+ 256 SHA256E-s53033--80840b2105a7a316a010ec3c3775031bef7fbdabbb7d3f6b7ece1a6253ef1b59.jpg
+ 257 SHA256E-s7407--8ec4462ca6a05614378729bb20bb33c3b892bc943fd698389e44d959c4506843.log
+ 258 SHA256E-s1189946--d23ba452e6e267d93f6233e885bd6f9e15b8ad1aea4c3d2368d901428df78970.jpg
+ 259 SHA256E-s3447000--61a3bd3f7dda48544b67040012d6cd5999499d25e75dc34b82d11955d0fc9b6a.jpg
+ 260 SHA256E-s3263208--69ad68aaad7058af8d14f7e4c03e5b52c9a78dbac7ffd33bd7bc5220c847d6bb.JPG
+ 261 SHA256E-s1226280--d372b699459664c382f607ff56294df49e6d8d0fcab90b509337c347943357cf.jpg
+ 262 SHA256E-s16890--12861c187e68e3591ccd5f708b935cc43bf25f5672daf50913e152c1c55e510c.png
+ 263 SHA256E-s1092669--8e7f7431c487c6cff11ee9f7c8a87aa0d057b518e60bd2b92fd677e5c9a88313.jpg
+ 264 SHA256E-s307511--5fad92167d8f9a7ed4076909a1540388cdae89df956e6011065526bfb10564a4.jpg
+ 265 SHA256E-s8334--212df98aca1ee3d4f10539a786ad746f3856c2715e23d5cb816a2374b5e6c43c.png
+ 266 SHA256E-s3375--2b403c31d4934895cccbe05556b0134bd4b78d4b873193d2b12a8893ab170681.txt
+ 267 SHA256E-s691014--470d607465715a4c0735d74da75a5aafb5f6707b9d10a9a6a8c002f095f447e2.jpg
+ 268 SHA256E-s680701--133c1dc67e394103d9f900cbf80ef508c7d7818edb23406c5f67f027a38093a4.jpg
+ 269 SHA256E-s4024--b5d3e2bb6d51ff8ceb54f501035a5feebe7d5178d35b98abe9e41531bd2abd22
+ 270 SHA256E-s1117--b7c94c25be8e78468071e78481641927450d754fd1bbd8d0d751f116d02b9ab3
+ 271 SHA256E-s476926--ea981873de3e0ca8156ff710429894abbd8a51384b210cc142b074ec9b2c9ba0.jpg
+ 272 SHA256E-s56655--7df6526b49b7aa986070db456b6a3a378c8aaaee8cb7c8892c154eecf401002a.com.htm
+ 273 SHA256E-s2963--4fc53b3029a595b3b7f1f201eb4b7c2df78afc7e083abccd070c8e6fae79a661.txt
+ 274 SHA256E-s761655--486ef18d41898ba80505d7630170305c4b58fa647786bd5447f20045bd6f3b2e.jpg
+ 275 SHA256E-s1389414--3599c1a4da6a3b61cbc4dc431c436af9bf201b634fde2f99ddf54eae8c3590d5.jpg
+ 276 SHA256E-s39678--bea819324e10bc288c75650e2196bebd5339952ce33574625ae5091ad749b63c.jpg
+ 277 SHA256E-s47531--a91ecea2694b4b5c8daab84aa25c675f2f73dbfaa8ccfd581d6868b1e2568b7a.jpg
+ 278 SHA256E-s4923--2f1b9afef156e9c7f4994106eda088868a992d92e66a5d601f77980fea80f777
+ 279 SHA256E-s84101--bca6a8a9640b1ebfa8a2ba01b3a0f7ed20ad77fa5cbb5588d46ce75949fc38db.jpg
+ 280 SHA256E-s1245742--d547d4a18279ec671be7869896c0b3e763cf8499c4dc28a62a49cd657fdf4200.jpg
+ 281 SHA256E-s655461--f9b43d2794fe757d7cb61a704a01c85bc09eb20d70a1550d6934dec12f46f0bf.jpg
+ 282 SHA256E-s137484--51fbe9bc815e41dfe22b9f9d4ed8f3ca98a8cb5cc7b81522b296d45b0279a413.jpg
+ 283 SHA256E-s607392--ead4548b66ac3ab5c930cd89bd60de480184a4f23ffce9b5da24f9269b796283.jpg
+ 284 SHA256E-s6888--405748982bbb3340eea34acbe45085ea62c80767866f0c76c355e4f94b969c7c.png
+ 285 SHA256E-s4327767--eef5840e2f4294a125aaa3ed33f8ccc96c5c2c3e31cbee356013de354e628df9.pdf
+ 286 SHA256E-s411064--4e5e5d477ccc542f78649e4b4ee6aa132bf79ae9aeb64a46cb45a7ee133eb2f7.pdf
+ 287 SHA256E-s224149--204dbb62c5d5352c9b5baead124ecf52c6fffd49120343cc21bb10343353934e.jpg
+ 288 SHA256E-s1333719--9d9ac54db47723755ee0d19731c0b2f4b40074d946da4a1e283a4904feea4534.jpg
+ 289 SHA256E-s1889687--07b79ce21bf5ffe2d80f9878d338fcd63ddc92c5381eb3c290639c3e73a7b927.jpg
+ 290 SHA256E-s686131--93ba1a21ff8cc7d9baa61a2af8407ccc8c1b22705a191e9f0a393d14ec95e232.jpg
+ 291 SHA256E-s619954--3d900d39d16eca00287a0c4bbe20b46767867b5065260a4a1fa8444081998e25.jpg
+ 292 SHA256E-s828309--f1d702dcb350cff7a3229fe62c4f0f4beb5f95ad2f00a6fd1bfb82549cd08129.jpg
+ 293 SHA256E-s516404--0ca06e98fd119847c99bee56264a31ac99b36ae71136624018d308ff8c6a2e3d.jpg
+ 294 SHA256E-s783842--0618e7c3ebc7ff8fcdff82b9fd227e8b83f491e8e1b96c2d0e566fc7fbea27ea.jpg
+ 295 SHA256E-s20748--df0711c99c30b5fdcbfdd109c093f02f6a7f5196e7ffbc8e291bb2780c5735c0.css
+ 296 SHA256E-s61739--387a27967c79b09e21d93f8a8b969dda930e8d26e9ce379c1d71718d4cc5a1df.jpg
+ 297 SHA256E-s1461106--37222c3cd7a3af846c8aaed3a174a0a7e6f775ea4c08c4e2f792c6da724812b9.jpg
+ (To see where data was previously used, try: git log --stat -S'KEY')
+
+ To remove unwanted data: git-annex dropunused NUMBER
+
+ok
+[2014-09-02 05:15:23 BST] NetWatcherFallback: Syncing with apollo
+From apollo.aylett.co.uk:Annex/Family
+ 11f0e77..fb4d2b8 master -> apollo/master
+To lizzie@apollo.aylett.co.uk:Annex/Family
+ fb4d2b8..490e8d4 annex/direct/master -> synced/master
+error: duplicate parent 490e8d462bf7572cf44bf4fb6a820ed38d471a54 ignored
+[2014-09-02 06:15:25 BST] NetWatcherFallback: Syncing with apollo
+From apollo.aylett.co.uk:Annex/Family
+ fb4d2b8..490e8d4 master -> apollo/master
+To lizzie@apollo.aylett.co.uk:Annex/Family
+ 490e8d4..08b6a0a annex/direct/master -> synced/master
+error: duplicate parent 08b6a0ab11b225b34261a4cd5962a6630eed4495 ignored
+[2014-09-02 07:15:27 BST] NetWatcherFallback: Syncing with apollo
+p11-kit: couldn't load module: /usr/lib/x86_64-linux-gnu/pkcs11/p11-kit-trust.so: /usr/lib/x86_64-linux-gnu/pkcs11/p11-kit-trust.so: cannot open shared object file: No such file or directory
+p11-kit: couldn't load module: /usr/lib/x86_64-linux-gnu/pkcs11/gnome-keyring-pkcs11.so: /usr/lib/x86_64-linux-gnu/pkcs11/gnome-keyring-pkcs11.so: cannot open shared object file: No such file or directory
+p11-kit: couldn't load module: /usr/lib/x86_64-linux-gnu/pkcs11/p11-kit-trust.so: /usr/lib/x86_64-linux-gnu/pkcs11/p11-kit-trust.so: cannot open shared object file: No such file or directory
+p11-kit: couldn't load module: /usr/lib/x86_64-linux-gnu/pkcs11/gnome-keyring-pkcs11.so: /usr/lib/x86_64-linux-gnu/pkcs11/gnome-keyring-pkcs11.so: cannot open shared object file: No such file or directory
+gpg: Signature made Sun 31 Aug 2014 21:52:56 BST using DSA key ID 89C809CB
+gpg: /tmp/git-annex-gpg.tmp.0/trustdb.gpg: trustdb created
+gpg: Good signature from "git-annex distribution signing key (for Joey Hess) <id@joeyh.name>"
+gpg: WARNING: This key is not certified with a trusted signature!
+gpg: There is no indication that the signature belongs to the owner.
+Primary key fingerprint: 4005 5C6A FD2D 526B 2961 E78F 5EE1 DBA7 89C8 09CB
+From apollo.aylett.co.uk:Annex/Family
+ 490e8d4..08b6a0a master -> apollo/master
+To lizzie@apollo.aylett.co.uk:Annex/Family
+ 08b6a0a..69244bb annex/direct/master -> synced/master
+error: duplicate parent 69244bbcf029c21782995b78cdfbff789c0d198e ignored
+[2014-09-02 12:19:20 BST] NetWatcher: Syncing with apollo
+ControlSocket /run/user/1000/ssh-apollo.aylett.co.uk-22-lizzie already exists, disabling multiplexing
+From apollo.aylett.co.uk:Annex/Family
+ 08b6a0a..69244bb master -> apollo/master
+git-annex-shell: Only allowed to access ~/Music not ~/Annex/Family
+fatal: Could not read from remote repository.
+
+Please make sure you have the correct access rights
+and the repository exists.
+git-annex-shell: Only allowed to access ~/Music not ~/Annex/Family
+fatal: Could not read from remote repository.
+
+Please make sure you have the correct access rights
+and the repository exists.
+git-annex-shell: Only allowed to access ~/Music not ~/Annex/Family
+fatal: Could not read from remote repository.
+
+Please make sure you have the correct access rights
+and the repository exists.
+git-annex-shell: Only allowed to access ~/Music not ~/Annex/Family
+fatal: Could not read from remote repository.
+
+Please make sure you have the correct access rights
+and the repository exists.
+[2014-09-02 12:20:01 BST] UpgradeWatcher: Upgrading git-annex
+error: refs/heads/synced/git-annex does not point to a valid object!
+error: refs/synced/5879379e-5514-11e3-b428-a79c7bfa61c8/git-annex does not point to a valid object!
+error: refs/synced/5879379e-5514-11e3-b428-a79c7bfa61c8/master does not point to a valid object!
+error: refs/heads/synced/git-annex does not point to a valid object!
+error: refs/synced/5879379e-5514-11e3-b428-a79c7bfa61c8/git-annex does not point to a valid object!
+error: refs/synced/5879379e-5514-11e3-b428-a79c7bfa61c8/master does not point to a valid object!
+error: refs/heads/synced/git-annex does not point to a valid object!
+error: refs/synced/5879379e-5514-11e3-b428-a79c7bfa61c8/git-annex does not point to a valid object!
+error: refs/synced/5879379e-5514-11e3-b428-a79c7bfa61c8/master does not point to a valid object!
+error: refs/heads/synced/git-annex does not point to a valid object!
+error: refs/synced/5879379e-5514-11e3-b428-a79c7bfa61c8/git-annex does not point to a valid object!
+error: refs/synced/5879379e-5514-11e3-b428-a79c7bfa61c8/master does not point to a valid object!
+error: refs/synced/5879379e-5514-11e3-b428-a79c7bfa61c8/git-annex does not point to a valid object!
+error: refs/synced/5879379e-5514-11e3-b428-a79c7bfa61c8/master does not point to a valid object!
+error: refs/synced/5879379e-5514-11e3-b428-a79c7bfa61c8/git-annex does not point to a valid object!
+error: refs/synced/5879379e-5514-11e3-b428-a79c7bfa61c8/master does not point to a valid object!
+error: refs/synced/5879379e-5514-11e3-b428-a79c7bfa61c8/git-annex does not point to a valid object!
+error: refs/synced/5879379e-5514-11e3-b428-a79c7bfa61c8/master does not point to a valid object!
+error: refs/synced/5879379e-5514-11e3-b428-a79c7bfa61c8/git-annex does not point to a valid object!
+error: refs/synced/5879379e-5514-11e3-b428-a79c7bfa61c8/master does not point to a valid object!
+[2014-09-02 12:21:36 BST] NetWatcherFallback: Syncing with apollo
+git-annex-shell: Only allowed to access ~/Music not ~/Annex/Family
+fatal: Could not read from remote repository.
+
+Please make sure you have the correct access rights
+and the repository exists.
+git-annex-shell: Only allowed to access ~/Music not ~/Annex/Family
+fatal: Could not read from remote repository.
+
+Please make sure you have the correct access rights
+and the repository exists.
+git-annex-shell: Only allowed to access ~/Music not ~/Annex/Family
+fatal: Could not read from remote repository.
+
+Please make sure you have the correct access rights
+and the repository exists.
+git-annex-shell: Only allowed to access ~/Music not ~/Annex/Family
+fatal: Could not read from remote repository.
+
+Please make sure you have the correct access rights
+and the repository exists.
+git-annex-shell: Only allowed to access ~/Music not ~/Annex/Family
+fatal: Could not read from remote repository.
+
+Please make sure you have the correct access rights
+and the repository exists.
+"""]]
+
+> This is due to using an old and buggy version of git-annex. This bug was
+> fixed 3 full months ago, in version 5.20140709. [[done]] --[[Joey]]
diff --git a/doc/bugs/Assistant_removed_all_references_to_files/comment_1_1f7da19ea99c263d56db6331d4b1e346._comment b/doc/bugs/Assistant_removed_all_references_to_files/comment_1_1f7da19ea99c263d56db6331d4b1e346._comment
new file mode 100644
index 000000000..f3cfbaabe
--- /dev/null
+++ b/doc/bugs/Assistant_removed_all_references_to_files/comment_1_1f7da19ea99c263d56db6331d4b1e346._comment
@@ -0,0 +1,14 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ ip="209.250.56.132"
+ subject="comment 1"
+ date="2014-09-11T17:45:31Z"
+ content="""
+Unfortunately, the old version of git-annex you have been using is exactly the wrong version, so you ran into this horrible bug, which is fixed in newer versions.
+
+<http://git-annex.branchable.com/bugs/bad_merge_commit_deleting_all_files/>
+
+That page has details, including instructions on how to recover your data.
+
+I hope that you were not using that old version because it's included in some distribution somewhere still?
+"""]]
diff --git a/doc/bugs/Assistant_removed_all_references_to_files/comment_2_0dbb8df1ad267d1c502646a7131a99f1._comment b/doc/bugs/Assistant_removed_all_references_to_files/comment_2_0dbb8df1ad267d1c502646a7131a99f1._comment
new file mode 100644
index 000000000..932a88471
--- /dev/null
+++ b/doc/bugs/Assistant_removed_all_references_to_files/comment_2_0dbb8df1ad267d1c502646a7131a99f1._comment
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="https://andrew.aylett.co.uk/"
+ nickname="andrew"
+ subject="comment 2"
+ date="2014-09-11T19:03:07Z"
+ content="""
+Unfortunately, that bug involves merges while I'm seeing regular commits so I don't think it's identical.
+
+As to why I'm on that version, it appears that the updater and something in my environment conspired against me, leaving an old version in my path. I'll fix that now and let you know if I see the issue again.
+"""]]
diff --git a/doc/bugs/Bloom_filter_capacity_too_large_to_represent.mdwn b/doc/bugs/Bloom_filter_capacity_too_large_to_represent.mdwn
new file mode 100644
index 000000000..56d3d8f8c
--- /dev/null
+++ b/doc/bugs/Bloom_filter_capacity_too_large_to_represent.mdwn
@@ -0,0 +1,44 @@
+### Please describe the problem.
+When running git-annex info I get an error when it tries to show the bloom filter size
+
+### What steps will reproduce the problem?
+git-annex info in my Photos repo
+
+
+### What version of git-annex are you using? On what operating system?
+[[!format sh """
+$ git-annex version
+git-annex version: 5.20140814-g9b89b5c
+build flags: Assistant Webapp Webapp-secure Pairing Testsuite S3 WebDAV Inotify DBus DesktopNotify XMPP DNS Feeds Quvi TDFA CryptoHash
+key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E SHA256 SHA1 SHA512 SHA224 SHA384 SKEIN256 SKEIN512 WORM URL
+remote types: git gcrypt S3 bup directory rsync web webdav tahoe glacier ddar hook external
+local repository version: 5
+supported repository version: 5
+upgrade supported from repository versions: 0 1 2 4
+"""]]
+
+### Please provide any additional information below.
+
+[[!format sh """
+$ git-annex info
+repository mode: direct
+trusted repositories: 2
+ c0e4106e-2631-11e2-9749-1bfa37a61069 -- [rose]
+ ca735977-973c-44bc-9257-915b2c875e39 -- synology [here]
+semitrusted repositories: 3
+ 00000000-0000-0000-0000-000000000001 -- web
+ 7e5c0010-2634-4a5e-bc7b-6fea84b8b947 -- [glacier]
+ d7e01abc-d74b-40e2-8607-3d41ce8bc4bd -- seagate3
+untrusted repositories: 1
+ c1fe5922-43f1-11e2-b146-33530f7fa6cc -- x200s
+transfers in progress: none
+available local disk space: 928.4 gigabytes (+1 megabyte reserved)
+local annex keys: 34758
+local annex size: 186.78 gigabytes
+annexed files in working tree: 35300
+size of annexed files in working tree: 193.76 gigabytes
+bloom filter size: git-annex: Data.BloomFilter.Util.suggestSizing: capacity too large to represent
+"""]]
+
+> I've worked around this problem in the arm autobuilder (only build
+> affected), so [[done]] --[[Joey]]
diff --git a/doc/bugs/Bloom_filter_capacity_too_large_to_represent/comment_1_43c824a3b843faa2377bfd78158c72fe._comment b/doc/bugs/Bloom_filter_capacity_too_large_to_represent/comment_1_43c824a3b843faa2377bfd78158c72fe._comment
new file mode 100644
index 000000000..0bf00d7d5
--- /dev/null
+++ b/doc/bugs/Bloom_filter_capacity_too_large_to_represent/comment_1_43c824a3b843faa2377bfd78158c72fe._comment
@@ -0,0 +1,14 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ ip="209.250.56.132"
+ subject="comment 1"
+ date="2014-09-12T16:03:09Z"
+ content="""
+It seems you must have tweaked the annex.bloomcapacity and/or annex.bloomaccuracy settings, probably to some quite large values.
+
+For example capacity of 50000000 and accuracy of 10000000000 will fail this way.
+
+This happens when it runs out of Double floating point precision to calculate the requested bloom filter size. I think that a bloom filter can be built that has this capacity/accuracy, it's just that Data.BloomFilter.Easy.safeSuggestSizing falls over trying to find the bloom filter size. Also, such a bloom filter may use rather a lot of memory..
+
+
+"""]]
diff --git a/doc/bugs/Bloom_filter_capacity_too_large_to_represent/comment_2_9b74457549e2739ae45dccd128de946f._comment b/doc/bugs/Bloom_filter_capacity_too_large_to_represent/comment_2_9b74457549e2739ae45dccd128de946f._comment
new file mode 100644
index 000000000..803465e01
--- /dev/null
+++ b/doc/bugs/Bloom_filter_capacity_too_large_to_represent/comment_2_9b74457549e2739ae45dccd128de946f._comment
@@ -0,0 +1,12 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ ip="209.250.56.132"
+ subject="comment 2"
+ date="2014-09-12T16:34:56Z"
+ content="""
+However, in Greg's case he had no such configuration. Instead, I think something is broken with the use of floating point or bit math that bloomfilter uses, on the NAS where he's using git-annex.
+
+I have made git-annex not crash when this happens, just show a warning and fall back to a reasonable default bloom filter size. If the problem is with the bit math, then the bloom filter may not work either, which would probably show up as false negatives, so `git annex unused` not finding things that are unused.
+
+I need to update the armel build with this so Greg can test it..
+"""]]
diff --git a/doc/bugs/Bloom_filter_capacity_too_large_to_represent/comment_3_5790bbbe347e1806062ccb60fcad046a._comment b/doc/bugs/Bloom_filter_capacity_too_large_to_represent/comment_3_5790bbbe347e1806062ccb60fcad046a._comment
new file mode 100644
index 000000000..a11d0efc7
--- /dev/null
+++ b/doc/bugs/Bloom_filter_capacity_too_large_to_represent/comment_3_5790bbbe347e1806062ccb60fcad046a._comment
@@ -0,0 +1,12 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ ip="209.250.56.132"
+ subject="comment 3"
+ date="2014-09-12T16:38:47Z"
+ content="""
+I have reproduced the bug, using the standalone build on an arm box (turtle).
+
+On the same box, the debian git-annex build works ok.
+
+Suggests to me the problem is related to the cross-compiling method used for the standalone arm build.
+"""]]
diff --git a/doc/bugs/Bloom_filter_capacity_too_large_to_represent/comment_4_9fb9fdbc6218d6b86b0921f411f78891._comment b/doc/bugs/Bloom_filter_capacity_too_large_to_represent/comment_4_9fb9fdbc6218d6b86b0921f411f78891._comment
new file mode 100644
index 000000000..77097e07c
--- /dev/null
+++ b/doc/bugs/Bloom_filter_capacity_too_large_to_represent/comment_4_9fb9fdbc6218d6b86b0921f411f78891._comment
@@ -0,0 +1,12 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ ip="209.250.56.132"
+ subject="turns out to be an upstream bug already filed"
+ date="2014-09-12T17:46:23Z"
+ content="""
+It seems that this is a bug on bloomfilter 2.0.0.0 on armel generally. It's also preventing this newer version from building on armel currently:
+
+<http://bugs.debian.org/756801>
+
+The git-annex standalone arm autobuilder installed it with cabal, so ended up with the newer, broken version.
+"""]]
diff --git a/doc/bugs/Possible_data-loss_if_WORM_keys_do_not_encode_relative_paths.mdwn b/doc/bugs/Possible_data-loss_if_WORM_keys_do_not_encode_relative_paths.mdwn
index 2b3cf3f2f..716c76f6c 100644
--- a/doc/bugs/Possible_data-loss_if_WORM_keys_do_not_encode_relative_paths.mdwn
+++ b/doc/bugs/Possible_data-loss_if_WORM_keys_do_not_encode_relative_paths.mdwn
@@ -21,3 +21,4 @@ Instead of just using the basename, WORM keys could be kept stable by
using the relative path and anchoring it to the root of the
repository.
+> [[fixed|done]] --[[Joey]]
diff --git a/doc/bugs/Possible_data-loss_if_WORM_keys_do_not_encode_relative_paths/comment_2_e8f011263bfa4c3c3d04494ea1c88523._comment b/doc/bugs/Possible_data-loss_if_WORM_keys_do_not_encode_relative_paths/comment_2_e8f011263bfa4c3c3d04494ea1c88523._comment
new file mode 100644
index 000000000..90684d96c
--- /dev/null
+++ b/doc/bugs/Possible_data-loss_if_WORM_keys_do_not_encode_relative_paths/comment_2_e8f011263bfa4c3c3d04494ea1c88523._comment
@@ -0,0 +1,21 @@
+[[!comment format=mdwn
+ username="zardoz"
+ ip="78.48.163.229"
+ subject="comment 2"
+ date="2014-08-16T11:42:22Z"
+ content="""
+Hm, I don’t quite follow the remark on having everything in a single
+directory. Rather than saying that the relative path adds additional
+entropy, what I was aiming at is the file-system cannot have two
+alternate versions of one file name at the same path with the same
+mtime, and that’s why it occurred to me that encoding both path and
+mtime within the key doesn’t just increase the odds, but effectively
+_guarantees_ that there won’t be any collisions. Does this seem to
+hold up, or am I missing something? (Of course one can fudge the
+mtimes, but that’s something under the user’s control.)
+
+While a large repo with many files very likely has lots of distinct
+files with identical basename, mtime (in s.) and size, all these files
+with the same mtime must necessarily be located at different paths.
+
+"""]]
diff --git a/doc/bugs/Possible_data-loss_if_WORM_keys_do_not_encode_relative_paths/comment_3_bda1e0d3569a6becf374d0e820219469._comment b/doc/bugs/Possible_data-loss_if_WORM_keys_do_not_encode_relative_paths/comment_3_bda1e0d3569a6becf374d0e820219469._comment
new file mode 100644
index 000000000..54fe869c5
--- /dev/null
+++ b/doc/bugs/Possible_data-loss_if_WORM_keys_do_not_encode_relative_paths/comment_3_bda1e0d3569a6becf374d0e820219469._comment
@@ -0,0 +1,15 @@
+[[!comment format=mdwn
+ username="zardoz"
+ ip="78.48.163.229"
+ subject="comment 3"
+ date="2014-08-16T13:58:28Z"
+ content="""
+One scenario where the above guarantee would be violated is when one
+moves a new file of identical size, basename, and mtime, into a path
+where a key-colliding file has been kept before. Still, I’d consider
+this a scenario one could reasonably control for (especially in the
+archive usecase); plus, even without manual control such a
+move-induced collision would be much more unlikely than a collision of
+basenames only.
+
+"""]]
diff --git a/doc/bugs/Possible_data-loss_if_WORM_keys_do_not_encode_relative_paths/comment_4_4241c05a0fa7ce597c75ff5992b71b89._comment b/doc/bugs/Possible_data-loss_if_WORM_keys_do_not_encode_relative_paths/comment_4_4241c05a0fa7ce597c75ff5992b71b89._comment
new file mode 100644
index 000000000..a02b1deb6
--- /dev/null
+++ b/doc/bugs/Possible_data-loss_if_WORM_keys_do_not_encode_relative_paths/comment_4_4241c05a0fa7ce597c75ff5992b71b89._comment
@@ -0,0 +1,12 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ ip="209.250.56.7"
+ subject="comment 4"
+ date="2014-08-18T18:39:33Z"
+ content="""
+> Rather than saying that the relative path adds additional entropy, what I was aiming at is the file-system cannot have two alternate versions of one file name at the same path with the same mtime
+
+True of a single filesystem, but not of a set of connected git repositories. :)
+
+So there are multiple scenarios when encoding the file path in the key doesn't help. The probabilities of these seem low, but perhaps not as low as the probability that there will be two differing files with the same name+size+mtime in the first place. It's not clear to me that it adds more than a false sense of security to change from basename to git filename.
+"""]]
diff --git a/doc/bugs/Possible_data-loss_if_WORM_keys_do_not_encode_relative_paths/comment_5_8378cd8c03fabdaa300194b66c1ea53c._comment b/doc/bugs/Possible_data-loss_if_WORM_keys_do_not_encode_relative_paths/comment_5_8378cd8c03fabdaa300194b66c1ea53c._comment
new file mode 100644
index 000000000..72bc4f8f4
--- /dev/null
+++ b/doc/bugs/Possible_data-loss_if_WORM_keys_do_not_encode_relative_paths/comment_5_8378cd8c03fabdaa300194b66c1ea53c._comment
@@ -0,0 +1,16 @@
+[[!comment format=mdwn
+ username="zardoz"
+ ip="78.48.163.229"
+ subject="comment 5"
+ date="2014-08-18T20:54:10Z"
+ content="""
+> True of a single filesystem, but not of a set of connected git repositories.
+
+That’s a good point. Might depend on the use case, though.
+
+> The probabilities of these seem low, but perhaps not as low as the probability that there will be two differing files with the same name+size+mtime in the first place.
+
+This one I’m not completely sure about. E.g., I have an annex with web pages mirrored from the web. Due to the crawler implementation, there are lots of «index.html» or «favicon.ico» with the same mtime (in particular when mtime is read with a 1 sec. precision). Files like favicon are often bitmaps of the same resolution and often have the same size due to this. Because there are file-formats where both size and basename are semantically pre-determined, there is zero entropy from these sources alone (also cf. «readme.txt»). The entropy of mtime alone is not really large, I suppose, and in some use-cases will also approach zero (think «initializing a repo by cp -r on a fast disk without preserving mtime). The relative path could make a huge difference there. I believe this argument is actually what worried me the most. Does it seem valid?
+
+Apart from entropy, there’s the non-probabilistic advantage we discussed (granted, with some limiting constraints which one has to assure for oneself). Granted, one might argue a hash would be the better way, but this is not always practical in every setup.
+"""]]
diff --git a/doc/bugs/Possible_data-loss_if_WORM_keys_do_not_encode_relative_paths/comment_6_d3c9a1bee717b5b99f31be81150a3ec8._comment b/doc/bugs/Possible_data-loss_if_WORM_keys_do_not_encode_relative_paths/comment_6_d3c9a1bee717b5b99f31be81150a3ec8._comment
new file mode 100644
index 000000000..d22ef3e0a
--- /dev/null
+++ b/doc/bugs/Possible_data-loss_if_WORM_keys_do_not_encode_relative_paths/comment_6_d3c9a1bee717b5b99f31be81150a3ec8._comment
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ ip="209.250.56.132"
+ subject="comment 6"
+ date="2014-09-11T18:41:45Z"
+ content="""
+Ok, those are good examples. I personally think it would be insane to use WORM in a repository in either of those cases, or really in almost any case where you do not have a strong degree of confidence that unique file contents have unique file names. If people are going to abuse WORM like that, it might be best to simply remove it. (Except I have quite a lot of WORMy disks.)
+
+I suppose I'll add the extra data, although I remain unconvinced that it is going to help anyone who should actually be using WORM.
+"""]]
diff --git a/doc/bugs/Problem_setting_up_encrypted_repository_using_the_assistant_with___40__outside_of_git-annex__41___shared_pgp_key.mdwn b/doc/bugs/Problem_setting_up_encrypted_repository_using_the_assistant_with___40__outside_of_git-annex__41___shared_pgp_key.mdwn
new file mode 100644
index 000000000..1d4ea2105
--- /dev/null
+++ b/doc/bugs/Problem_setting_up_encrypted_repository_using_the_assistant_with___40__outside_of_git-annex__41___shared_pgp_key.mdwn
@@ -0,0 +1,387 @@
+### Please describe the problem.
+Using the assistant on two computers to setup a shared encrypted repository (while sharing the same pgp key) on a third computer leads to files not propagating between one and two.
+
+The first and second computer does not get changes done on the other. If new files are added on the first computer it appears as if everything works (no error messages) but the files never reach the second computer (and vice versa).
+
+
+### What steps will reproduce the problem?
+
+Three computers needed.
+
+* Computer A: Use the assistant to create a repository
+* Computer A: Use the assitant to setup a remote repository on Computer C (Add another repository - Remote server - Encrypt with GnuPG key/Encript repository with a new encryption key - Save changes)
+
+[At this point files propagate from A to C]
+
+* Computer A: Export the private and public gpg keys to files
+* Computer B: Import these private and public gpg files, fix trust to ultimate
+* Computer B: Use the assistant to create a repository
+* Computer B: Use the assitant to connect with the remote repository on Computer C (Add another repository - Remote server - Combine the repositories)
+
+[Files created on A before adding B now appear on B]
+
+[New files created on A do not appear on B, new files created on B do not appear on A. Files from A and B seem to propagate to C (the number of files/directories in the object sub directory on C goes up after adding files on A or B)]
+
+
+
+### What version of git-annex are you using? On what operating system?
+Computer A:
+[[!format sh """
+dirk@A:~$ lsb_release -a
+No LSB modules are available.
+Distributor ID: Ubuntu
+Description: Ubuntu 14.04.1 LTS
+Release: 14.04
+Codename: trusty
+dirk@A:~$ git-annex version
+git-annex version: 5.20140818-g10bf03a
+build flags: Assistant Webapp Webapp-secure Pairing Testsuite S3 WebDAV Inotify DBus DesktopNotify XMPP DNS Feeds Quvi TDFA CryptoHash
+key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E SHA256 SHA1 SHA512 SHA224 SHA384 SKEIN256 SKEIN512 WORM URL
+remote types: git gcrypt S3 bup directory rsync web webdav tahoe glacier ddar hook external
+local repository version: 5
+supported repository version: 5
+upgrade supported from repository versions: 0 1 2 4
+dirk@A:~$
+
+dirk@A:~$ gpg --list-keys --list-options show-uid-validity
+/home/dirk/.gnupg/pubring.gpg
+-----------------------------
+pub 4096R/0A7AA2A4 2014-08-23
+uid [ultimate] dirk's git-annex encryption key
+
+dirk@A:~$ gpg --list-secret-keys --list-options show-uid-validity
+/home/dirk/.gnupg/secring.gpg
+-----------------------------
+sec 4096R/0A7AA2A4 2014-08-23
+uid dirk's git-annex encryption key
+
+dirk@A:~$
+"""]]
+
+Computer B:
+[[!format sh """
+dirk@B:~$ lsb_release -a
+No LSB modules are available.
+Distributor ID: Ubuntu
+Description: Ubuntu 14.04.1 LTS
+Release: 14.04
+Codename: trusty
+dirk@B:~$ git-annex version
+git-annex version: 5.20140818-g10bf03a
+build flags: Assistant Webapp Webapp-secure Pairing Testsuite S3 WebDAV Inotify DBus DesktopNotify XMPP DNS Feeds Quvi TDFA CryptoHash
+key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E SHA256 SHA1 SHA512 SHA224 SHA384 SKEIN256 SKEIN512 WORM URL
+remote types: git gcrypt S3 bup directory rsync web webdav tahoe glacier ddar hook external
+dirk@B:~$
+
+dirk@B:~$ gpg --list-keys --list-options show-uid-validity
+/home/dirk/.gnupg/pubring.gpg
+-----------------------------
+pub 4096R/0A7AA2A4 2014-08-23
+uid [ultimate] dirk's git-annex encryption key
+
+dirk@B:~$ gpg --list-secret-keys --list-options show-uid-validity
+/home/dirk/.gnupg/secring.gpg
+-----------------------------
+sec 4096R/0A7AA2A4 2014-08-23
+uid dirk's git-annex encryption key
+
+dirk@B:~$
+"""]]
+
+Computer C:
+[[!format sh """
+dirk@C:~$ lsb_release -a
+No LSB modules are available.
+Distributor ID: Debian
+Description: Debian GNU/Linux 7.6 (wheezy)
+Release: 7.6
+Codename: wheezy
+dirk@C:~$ git-annex version
+git-annex version: 5.20140717~bpo70+1
+build flags: Assistant Webapp Pairing S3 Inotify DBus XMPP Feeds Quvi TDFA
+key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SHA256 SHA1 SHA512 SHA224 SHA384 WORM URL
+remote types: git gcrypt S3 bup directory rsync web tahoe glacier ddar hook external
+dirk@C:~$
+"""]]
+
+### Please provide any additional information below.
+
+.git/annex/daemon.log - Computer A
+[[!format sh """
+# If you can, paste a complete transcript of the problem occurring here.
+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log
+[2014-08-23 15:15:01 CEST] main: starting assistant version 5.20140818-g10bf03a
+[2014-08-23 15:15:01 CEST] Cronner: You should enable consistency checking to protect your data.
+(scanning...) [2014-08-23 15:15:01 CEST] Watcher: Performing startup scan
+(started...)
+gpg: new configuration file `/home/dirk/.gnupg/gpg.conf' created
+gpg: WARNING: options in `/home/dirk/.gnupg/gpg.conf' are not yet active during this run
+
+Not enough random bytes available. Please do some other work to give
+the OS a chance to collect more entropy! (Need 235 more bytes)
+....+++++
+
+Not enough random bytes available. Please do some other work to give
+the OS a chance to collect more entropy! (Need 196 more bytes)
+.......+++++
+gpg: /home/dirk/.gnupg/trustdb.gpg: trustdb created
+gpg: key 0A7AA2A4 marked as ultimately trusted
+Generating public/private rsa key pair.
+Your identification has been saved in /tmp/git-annex-keygen.0/key.
+Your public key has been saved in /tmp/git-annex-keygen.0/key.pub.
+The key fingerprint is:
+7d:02:34:56:d4:86:b6:e5:82:b0:d9:4f:3b:51:b3:c7 dirk@A
+The key's randomart image is:
++--[ RSA 2048]----+
+| +ooo |
+| .o .o * |
+| =.o * + |
+| o oo= o E |
+| Soo+.. |
+| +o |
+| . |
+| |
+| |
++-----------------+
+(encryption setup) (hybrid cipher with gpg key 7815EA570A7AA2A4) gcrypt: Development version -- Repository format MAY CHANGE
+gpg: checking the trustdb
+gpg: 3 marginal(s) needed, 1 complete(s) needed, PGP trust model
+gpg: depth: 0 valid: 1 signed: 0 trust: 0-, 0q, 0n, 0m, 0f, 1u
+gcrypt: Repository not found: ssh://dirk@git-annex-C-dirk_1022_annex/~/annex/
+gcrypt: Development version -- Repository format MAY CHANGE
+gcrypt: Repository not found: ssh://dirk@git-annex-C-dirk_1022_annex/~/annex/
+gcrypt: Setting up new repository
+gcrypt: Remote ID is :id:00RaA3cNQu+nZDMERYMM
+gcrypt: Encrypting to: -r 7815EA570A7AA2A4
+gcrypt: Requesting manifest signature
+To gcrypt::ssh://dirk@git-annex-C-dirk_1022_annex/~/annex/
+ * [new branch] git-annex -> git-annex
+ok
+[2014-08-23 15:25:46 CEST] main: Syncing with C_annex
+gcrypt: Development version -- Repository format MAY CHANGE
+gcrypt: Decrypting manifest
+gpg: Signature made Sat 23 Aug 2014 03:25:45 PM CEST using RSA key ID 0A7AA2A4
+gpg: Good signature from "dirk's git-annex encryption key"
+(Recording state in git...)
+gcrypt: Development version -- Repository format MAY CHANGE
+gcrypt: Decrypting manifest
+gpg: Signature made Sat 23 Aug 2014 03:25:45 PM CEST using RSA key ID 0A7AA2A4
+gpg: Good signature from "dirk's git-annex encryption key"
+gcrypt: Encrypting to: -r 7815EA570A7AA2A4
+gcrypt: Requesting manifest signature
+To gcrypt::ssh://dirk@git-annex-C-dirk_1022_annex/~/annex/
+ * [new branch] git-annex -> synced/git-annex
+ * [new branch] annex/direct/master -> synced/master
+[2014-08-23 15:26:46 CEST] Pusher: Syncing with C_annex
+gcrypt: Development version -- Repository format MAY CHANGE
+gcrypt: Decrypting manifest
+gpg: Signature made Sat 23 Aug 2014 03:25:49 PM CEST using RSA key ID 0A7AA2A4
+gpg: Good signature from "dirk's git-annex encryption key"
+Everything up-to-date
+[2014-08-23 15:34:01 CEST] Committer: Adding hhhhn.txt
+add hhhhn.txt ok
+add hhhhn.txt ok
+[2014-08-23 15:34:01 CEST] Committer: Committing changes to git
+(Recording state in git...)
+[2014-08-23 15:34:01 CEST] Pusher: Syncing with C_annex
+(Recording state in git...)
+gcrypt: Development version -- Repository format MAY CHANGE
+(gpg)
+GPGHMACSHA1--7a46226ea53e4043cb45e8df6a2382ac2696164e
+
+ 74 100% 0.00kB/s 0:00:00
+ 74 100% 0.00kB/s 0:00:00 (xfr#1, to-chk=0/1)
+[2014-08-23 15:34:01 CEST] Transferrer: Uploaded hhhhn.txt
+gcrypt: Decrypting manifest
+gpg: Signature made Sat 23 Aug 2014 03:33:27 PM CEST using RSA key ID 0A7AA2A4
+gpg: Good signature from "dirk's git-annex encryption key"
+gcrypt: WARNING:
+gcrypt: WARNING: Remote ID has changed!
+gcrypt: WARNING: from :id:00RaA3cNQu+nZDMERYMM
+gcrypt: WARNING: to :id:h/BFJbR+mE8CEkASZ/tx
+gcrypt: WARNING:
+gcrypt: Encrypting to: -r 7815EA570A7AA2A4
+gcrypt: Requesting manifest signature
+To gcrypt::ssh://dirk@git-annex-C-dirk_1022_annex/~/annex/
+ 85b70d6..e1d6871 annex/direct/master -> synced/master
+ + 99dc810...a7a89ff git-annex -> synced/git-annex (forced update)
+[2014-08-23 15:34:07 CEST] Pusher: Syncing with C_annex
+(Recording state in git...)
+gcrypt: Development version -- Repository format MAY CHANGE
+gcrypt: Decrypting manifest
+gpg: Signature made Sat 23 Aug 2014 03:34:04 PM CEST using RSA key ID 0A7AA2A4
+gpg: Good signature from "dirk's git-annex encryption key"
+gcrypt: Encrypting to: -r 7815EA570A7AA2A4
+gcrypt: Requesting manifest signature
+To gcrypt::ssh://dirk@git-annex-C-dirk_1022_annex/~/annex/
+ a7a89ff..e68b5a9 git-annex -> synced/git-annex
+[2014-08-23 15:48:30 CEST] main: warning git-annex has been shut down
+# End of transcript or log.
+"""]]
+
+.git/annex/daemon.log - Computer B
+[[!format sh """
+# If you can, paste a complete transcript of the problem occurring here.
+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log
+[2014-08-23 15:30:11 CEST] main: starting assistant version 5.20140818-g10bf03a
+[2014-08-23 15:30:11 CEST] Cronner: You should enable consistency checking to protect your data.
+
+ dbus failed; falling back to mtab polling (ClientError {clientErrorMessage = "runClient: unable to determine DBUS address", clientErrorFatal = True})
+
+ No known network monitor available through dbus; falling back to polling
+(scanning...) [2014-08-23 15:30:11 CEST] Watcher: Performing startup scan
+(started...)
+Generating public/private rsa key pair.
+Your identification has been saved in /tmp/git-annex-keygen.0/key.
+Your public key has been saved in /tmp/git-annex-keygen.0/key.pub.
+The key fingerprint is:
+b5:c3:6b:af:fc:fe:82:f2:a6:f3:42:e9:50:4b:63:9e dirk@A
+The key's randomart image is:
++--[ RSA 2048]----+
+| |
+| |
+| . |
+| =o . |
+| =S=+ |
+| . E o |
+| + o. |
+| =oo.. |
+| .O=++o. |
++-----------------+
+gcrypt: Development version -- Repository format MAY CHANGE
+gcrypt: Decrypting manifest
+gpg: Signature made Sat 23 Aug 2014 03:25:49 PM CEST using RSA key ID 0A7AA2A4
+gpg: checking the trustdb
+gpg: 3 marginal(s) needed, 1 complete(s) needed, PGP trust model
+gpg: depth: 0 valid: 1 signed: 0 trust: 0-, 0q, 0n, 0m, 0f, 1u
+gpg: Good signature from "dirk's git-annex encryption key"
+gcrypt: Remote ID is :id:00RaA3cNQu+nZDMERYMM
+gcrypt: Development version -- Repository format MAY CHANGE
+gcrypt: Decrypting manifest
+gpg: Signature made Sat 23 Aug 2014 03:25:49 PM CEST using RSA key ID 0A7AA2A4
+gpg: Good signature from "dirk's git-annex encryption key"
+gcrypt: Remote ID is :id:00RaA3cNQu+nZDMERYMM
+Receiving objects: 14% (1/7)
+Receiving objects: 28% (2/7)
+Receiving objects: 42% (3/7)
+Receiving objects: 57% (4/7)
+Receiving objects: 71% (5/7)
+Receiving objects: 85% (6/7)
+Receiving objects: 100% (7/7)
+Receiving objects: 100% (7/7), done.
+Receiving objects: 12% (1/8)
+Receiving objects: 25% (2/8)
+Receiving objects: 37% (3/8)
+Receiving objects: 50% (4/8)
+Receiving objects: 62% (5/8)
+Receiving objects: 75% (6/8)
+Receiving objects: 87% (7/8)
+Receiving objects: 100% (8/8)
+Receiving objects: 100% (8/8), done.
+From gcrypt::ssh://dirk@git-annex-C-dirk_1022_annex/~/annex
+ * [new branch] git-annex -> tmpgcryptremote/git-annex
+ * [new branch] synced/git-annex -> tmpgcryptremote/synced/git-annex
+ * [new branch] synced/master -> tmpgcryptremote/synced/master
+ * [new branch] master -> tmpgcryptremote/master
+(merging tmpgcryptremote/git-annex tmpgcryptremote/synced/git-annex into git-annex...)
+(Recording state in git...)
+(encryption update) (hybrid cipher with gpg key 7815EA570A7AA2A4) gcrypt: Development version -- Repository format MAY CHANGE
+gcrypt: Decrypting manifest
+gpg: Signature made Sat 23 Aug 2014 03:25:49 PM CEST using RSA key ID 0A7AA2A4
+gpg: Good signature from "dirk's git-annex encryption key"
+gcrypt: Remote ID is :id:00RaA3cNQu+nZDMERYMM
+From gcrypt::ssh://dirk@git-annex-C-dirk_1022_annex/~/annex
+ * [new branch] git-annex -> C_annex/git-annex
+ * [new branch] synced/git-annex -> C_annex/synced/git-annex
+ * [new branch] synced/master -> C_annex/synced/master
+ * [new branch] master -> C_annex/master
+gcrypt: Development version -- Repository format MAY CHANGE
+gcrypt: Decrypting manifest
+gpg: Signature made Sat 23 Aug 2014 03:25:49 PM CEST using RSA key ID 0A7AA2A4
+gpg: Good signature from "dirk's git-annex encryption key"
+gcrypt: Encrypting to: -r 7815EA570A7AA2A4
+gcrypt: Requesting manifest signature
+remote: error: denying non-fast-forward refs/heads/master (you should pull first)
+To ssh://dirk@git-annex-C-dirk_1022_annex/~/annex/
+ ! [remote rejected] refs/gcrypt/gitception+ -> master (non-fast-forward)
+error: failed to push some refs to 'ssh://dirk@git-annex-C-dirk_1022_annex/~/annex/'
+error: failed to push some refs to 'gcrypt::ssh://dirk@git-annex-C-dirk_1022_annex/~/annex/'
+ok
+[2014-08-23 15:31:36 CEST] main: Syncing with C_annex
+
+Automatic merge went well; stopped before committing as requested
+Already up-to-date!
+gcrypt: Development version -- Repository format MAY CHANGE
+[2014-08-23 15:31:37 CEST] Pusher: Syncing with C_annex
+(Recording state in git...)
+gcrypt: Development version -- Repository format MAY CHANGE
+gcrypt: Decrypting manifest
+gcrypt: Repository not found: ssh://dirk@git-annex-C-dirk_1022_annex/~/annex/
+gcrypt: Setting up new repository
+gpg: Signature made Sat 23 Aug 2014 03:25:49 PM CEST using RSA key ID 0A7AA2A4
+gpg: Good signature from "dirk's git-annex encryption key"
+fatal: ambiguous argument 'refs/heads/synced/master..refs/remotes/C_annex/synced/master': unknown revision or path not in the working tree.
+Use '--' to separate paths from revisions, like this:
+'git <command> [<revision>...] -- [<file>...]'
+gcrypt: Development version -- Repository format MAY CHANGE
+gcrypt: Remote ID is :id:h/BFJbR+mE8CEkASZ/tx
+gcrypt: Encrypting to: -r 7815EA570A7AA2A4
+gcrypt: Requesting manifest signature
+gcrypt: Decrypting manifest
+gpg: Signature made Sat 23 Aug 2014 03:25:49 PM CEST using RSA key ID 0A7AA2A4
+gpg: Good signature from "dirk's git-annex encryption key"
+gcrypt: Encrypting to: -r 7815EA570A7AA2A4
+gcrypt: Requesting manifest signature
+To gcrypt::ssh://dirk@git-annex-C-dirk_1022_annex/~/annex/
+ * [new branch] git-annex -> synced/git-annex
+ * [new branch] annex/direct/master -> synced/master
+fatal: Not a valid object name refs/gcrypt/gitception+
+To gcrypt::ssh://dirk@git-annex-C-dirk_1022_annex/~/annex/
+ 5d2eb63..e4763b8 git-annex -> synced/git-annex
+ da18915..3068bad annex/direct/master -> synced/master
+[2014-08-23 15:32:37 CEST] Pusher: Syncing with C_annex
+gcrypt: Development version -- Repository format MAY CHANGE
+gcrypt: Decrypting manifest
+gpg: Signature made Sat 23 Aug 2014 03:31:43 PM CEST using RSA key ID 0A7AA2A4
+gpg: Good signature from "dirk's git-annex encryption key"
+gcrypt: WARNING:
+gcrypt: WARNING: Remote ID has changed!
+gcrypt: WARNING: from :id:00RaA3cNQu+nZDMERYMM
+gcrypt: WARNING: to :id:h/BFJbR+mE8CEkASZ/tx
+gcrypt: WARNING:
+Everything up-to-date
+[2014-08-23 15:33:17 CEST] Committer: Adding fmksmxxs.txt
+add fmksmxxs.txt ok
+add fmksmxxs.txt ok
+[2014-08-23 15:33:18 CEST] Committer: Committing changes to git
+(Recording state in git...)
+[2014-08-23 15:33:18 CEST] Pusher: Syncing with C_annex
+(Recording state in git...)
+gcrypt: Development version -- Repository format MAY CHANGE
+(gpg) gcrypt: Decrypting manifest
+gpg: Signature made Sat 23 Aug 2014 03:31:43 PM CEST using RSA key ID 0A7AA2A4
+gpg: Good signature from "dirk's git-annex encryption key"
+gcrypt: Encrypting to: -r 7815EA570A7AA2A4
+gcrypt: Requesting manifest signature
+
+GPGHMACSHA1--f605f108429ffba3058a2fcf0bc006a1fbe600be
+
+ 70 100% 0.00kB/s 0:00:00
+ 70 100% 0.00kB/s 0:00:00 (xfr#1, to-chk=0/1)
+[2014-08-23 15:33:20 CEST] Transferrer: Uploaded fmksmxxs.txt
+To gcrypt::ssh://dirk@git-annex-C-dirk_1022_annex/~/annex/
+ e4763b8..85dbfc5 git-annex -> synced/git-annex
+ 3068bad..85b70d6 annex/direct/master -> synced/master
+[2014-08-23 15:33:25 CEST] Pusher: Syncing with C_annex
+(Recording state in git...)
+gcrypt: Development version -- Repository format MAY CHANGE
+gcrypt: Decrypting manifest
+gpg: Signature made Sat 23 Aug 2014 03:33:22 PM CEST using RSA key ID 0A7AA2A4
+gpg: Good signature from "dirk's git-annex encryption key"
+gcrypt: Encrypting to: -r 7815EA570A7AA2A4
+gcrypt: Requesting manifest signature
+To gcrypt::ssh://dirk@git-annex-C-dirk_1022_annex/~/annex/
+ 85dbfc5..99dc810 git-annex -> synced/git-annex
+[2014-08-23 15:48:39 CEST] main: warning git-annex has been shut down
+# End of transcript or log.
+"""]]
diff --git a/doc/bugs/Problem_setting_up_encrypted_repository_using_the_assistant_with___40__outside_of_git-annex__41___shared_pgp_key/comment_1_c8e7be58222afff2a4c1df60f657d2ed._comment b/doc/bugs/Problem_setting_up_encrypted_repository_using_the_assistant_with___40__outside_of_git-annex__41___shared_pgp_key/comment_1_c8e7be58222afff2a4c1df60f657d2ed._comment
new file mode 100644
index 000000000..5b26906da
--- /dev/null
+++ b/doc/bugs/Problem_setting_up_encrypted_repository_using_the_assistant_with___40__outside_of_git-annex__41___shared_pgp_key/comment_1_c8e7be58222afff2a4c1df60f657d2ed._comment
@@ -0,0 +1,35 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawk7iPiqWr3BVPLWEDvJhSSvcOqheLEbLNo"
+ nickname="Dirk"
+ subject="comment 1"
+ date="2014-08-23T18:13:06Z"
+ content="""
+Restarting the two git-annex instances actually now leads to an error message on computer B.
+
+[[!format sh \"\"\"
+[2014-08-23 20:02:00 CEST] main: starting assistant version 5.20140818-g10bf03a
+[2014-08-23 20:02:00 CEST] Cronner: You should enable consistency checking to protect your data.
+
+ dbus failed; falling back to mtab polling (ClientError {clientErrorMessage = \"runClient: unable to determine DBUS address\", clientErrorFatal = True})
+[2014-08-23 20:02:00 CEST] TransferScanner: Syncing with C_annex
+
+ No known network monitor available through dbus; falling back to polling
+(scanning...) [2014-08-23 20:02:00 CEST] Watcher: Performing startup scan
+gcrypt: Development version -- Repository format MAY CHANGE
+(started...)
+gcrypt: Decrypting manifest
+gpg: Signature made Sat 23 Aug 2014 03:34:08 PM CEST using RSA key ID 0A7AA2A4
+gpg: Good signature from \"dirk's git-annex encryption key\"
+gcrypt: Packfile 59a8d97d3d252effb044625e020f9dc8621804649186a5c33c4e47f9e961cc1a does not match digest!
+fatal: early EOF
+gcrypt: Development version -- Repository format MAY CHANGE
+gcrypt: Decrypting manifest
+gpg: Signature made Sat 23 Aug 2014 03:34:08 PM CEST using RSA key ID 0A7AA2A4
+gpg: Good signature from \"dirk's git-annex encryption key\"
+gcrypt: Encrypting to: -r 7815EA570A7AA2A4
+gcrypt: Requesting manifest signature
+To gcrypt::ssh://dirk@git-annex-C-dirk_1022_annex/~/annex/
+ e1d6871..85b70d6 annex/direct/master -> synced/master
+ + e68b5a9...99dc810 git-annex -> synced/git-annex (forced update)
+\"\"\"]]
+"""]]
diff --git a/doc/bugs/Upload_to_S3_fails_.mdwn b/doc/bugs/Upload_to_S3_fails_.mdwn
new file mode 100644
index 000000000..2264c42e4
--- /dev/null
+++ b/doc/bugs/Upload_to_S3_fails_.mdwn
@@ -0,0 +1,57 @@
+### Please describe the problem.
+
+Uploading a 21GB file to an S3 special remote fails. It will generally fail somewhere at about 3-15%. I am using the new chunking feature, with chunks set to 25MiB.
+
+### What steps will reproduce the problem?
+
+ $ git annex copy my-big-file.tar.bz --to s3
+ copy my-big-file.tar.bz (gpg) (checking s3...) (to s3...)
+ 13% 863.8KB/s 6h0m
+ ErrorClosed
+ failed
+ git-annex: copy: 1 failed
+
+### What version of git-annex are you using? On what operating system?
+
+Running on Arch Linux.
+
+ git-annex version: 5.20140818-g10bf03a
+ build flags: Assistant Webapp Webapp-secure Pairing Testsuite S3 WebDAV Inotify DBus DesktopNotify XMPP DNS Feeds Quvi TDFA CryptoHash
+ key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E SHA256 SHA1 SHA512 SHA224 SHA384 SKEIN256 SKEIN512 WORM URL
+ remote types: git gcrypt S3 bup directory rsync web webdav tahoe glacier ddar hook external
+ local repository version: 5
+ supported repository version: 5
+ upgrade supported from repository versions: 0 1 2 4
+
+### Please provide any additional information below.
+
+If I fire up the web app and open the log, the end looks like this:
+
+
+[[!format sh """
+...
+
+3% 857.3KB/s 6h46m
+3% 857.3KB/s 6h46m
+3% 857.3KB/s 6h46m
+3% 857.4KB/s 6h46m
+3% 857.4KB/s 6h46m
+3% 857.5KB/s 6h46m
+3% 857.5KB/s 6h46m
+3% 857.6KB/s 6h46m
+3% 857.6KB/s 6h46m
+3% 857.6KB/s 6h46m
+3% 857.7KB/s 6h46m
+3% 857.7KB/s 6h46m
+3% 857.8KB/s 6h46m
+3% 857.8KB/s 6h46m
+3% 857.8KB/s 6h46m
+3% 857.9KB/s 6h46m
+3% 857.9KB/s 6h46m
+3% 858.0KB/s 6h46m
+3% 858.0KB/s 6h46m
+3% 858.1KB/s 6h46m
+3% 858.1KB/s 6h45m
+3% 858.1KB/s 6h45mmux_client_request_session: read from master failed: Broken pipe
+
+"""]]
diff --git a/doc/bugs/Visual_glitch_while_xmpp_pairing.mdwn b/doc/bugs/Visual_glitch_while_xmpp_pairing.mdwn
new file mode 100644
index 000000000..03b0a5350
--- /dev/null
+++ b/doc/bugs/Visual_glitch_while_xmpp_pairing.mdwn
@@ -0,0 +1,14 @@
+### Please describe the problem.
+When pairing with xmpp buddies, the well does not expand to fit the whole buddy list
+
+### What steps will reproduce the problem?
+Go to the pairing menu
+
+### What version of git-annex are you using? On what operating system?
+ 5.20140717 from the homebrew bottle
+
+### Please provide any additional information below.
+
+![image of bug](http://i.imgur.com/fZe1ERD.png)
+
+> [[fixed|done]] --[[Joey]]
diff --git a/doc/bugs/Windows_build_has_hardcoded_paths.mdwn b/doc/bugs/Windows_build_has_hardcoded_paths.mdwn
new file mode 100644
index 000000000..199d00b03
--- /dev/null
+++ b/doc/bugs/Windows_build_has_hardcoded_paths.mdwn
@@ -0,0 +1,39 @@
+### Please describe the problem.
+
+The windows build seems to be hardcoded to finding git at c:\program files\Git\
+I have git in another directory. Git-annex does not find it.
+
+### What steps will reproduce the problem?
+
+Install git-annex. Run the webapp.
+Get error "Internal Server Error
+You need to install git in order to use git-annex!"
+
+### What version of git-annex are you using? On what operating system?
+
+5.20140817-g71c2250.
+Windows XP.
+
+### Please provide any additional information below.
+
+[[!format sh """
+# If you can, paste a complete transcript of the problem occurring here.
+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log
+
+
+# End of transcript or log.
+"""]]
+
+[[!meta title="git-annex on windows does not find msgit if user does not let msysgit add itsselt to PATH"]]
+
+> I don't think it's any better for git-annex's installer to prompt for the
+> path to git, than it is for msysgit's installer to prompt for adding it
+> to the system path.
+>
+> The best fix would be to bundle msysgit into the git-annex installer
+> along with all the other stuff. But, that adds build-time complications
+> I would rather avoid.
+>
+> For now, I am going to treat this as a documentation problem;
+> I've updated the install page to be clear that msysgit needs to be
+> installed into PATH. [[done]] --[[Joey]]
diff --git a/doc/bugs/Windows_build_has_hardcoded_paths/comment_1_03518523a823a89fbb97b6a57d650e2b._comment b/doc/bugs/Windows_build_has_hardcoded_paths/comment_1_03518523a823a89fbb97b6a57d650e2b._comment
new file mode 100644
index 000000000..f1a170e21
--- /dev/null
+++ b/doc/bugs/Windows_build_has_hardcoded_paths/comment_1_03518523a823a89fbb97b6a57d650e2b._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ ip="24.159.78.125"
+ subject="comment 1"
+ date="2014-08-20T14:37:30Z"
+ content="""
+git-annex does not hardcode any paths, and certianly not the path to git. Your system probably does not have the location you installed git added to the PATH. In that case, git-annex may do what windows programs do and look for git.exe in the same directory it was installed into.
+"""]]
diff --git a/doc/bugs/Windows_build_has_hardcoded_paths/comment_2_58b856e19c8d5e59164b42399ba6b1fd._comment b/doc/bugs/Windows_build_has_hardcoded_paths/comment_2_58b856e19c8d5e59164b42399ba6b1fd._comment
new file mode 100644
index 000000000..a4784c634
--- /dev/null
+++ b/doc/bugs/Windows_build_has_hardcoded_paths/comment_2_58b856e19c8d5e59164b42399ba6b1fd._comment
@@ -0,0 +1,16 @@
+[[!comment format=mdwn
+ username="Hans_Ryding"
+ ip="81.229.194.7"
+ subject="Quite right"
+ date="2014-08-21T08:54:50Z"
+ content="""
+Incorrect assumption from my part.
+I reinstalled git into the expected path (C:\program files\Git)
+and the problem is still there.
+
+Running git-annex from command-line works.
+(I tried running git-annex test. It had 23 failed tests,
+most of them because of inability to access the remote: origin.
+But it ran just fine.)
+Running the web-app gives the error listed above.
+"""]]
diff --git a/doc/bugs/Windows_build_has_hardcoded_paths/comment_3_f9543c0ca1ff81c4d495a01c77429ea8._comment b/doc/bugs/Windows_build_has_hardcoded_paths/comment_3_f9543c0ca1ff81c4d495a01c77429ea8._comment
new file mode 100644
index 000000000..ba06cd435
--- /dev/null
+++ b/doc/bugs/Windows_build_has_hardcoded_paths/comment_3_f9543c0ca1ff81c4d495a01c77429ea8._comment
@@ -0,0 +1,9 @@
+[[!comment format=mdwn
+ username="Hans_Ryding"
+ ip="81.229.194.7"
+ subject="Change the name of the bug"
+ date="2014-08-21T09:14:16Z"
+ content="""
+I can't seem to change the name of the bug to something more appropriate.
+Maybe you can?
+"""]]
diff --git a/doc/bugs/Windows_build_has_hardcoded_paths/comment_4_01096994c19b7d0df1cc6866d4f22e21._comment b/doc/bugs/Windows_build_has_hardcoded_paths/comment_4_01096994c19b7d0df1cc6866d4f22e21._comment
new file mode 100644
index 000000000..5daa87d5e
--- /dev/null
+++ b/doc/bugs/Windows_build_has_hardcoded_paths/comment_4_01096994c19b7d0df1cc6866d4f22e21._comment
@@ -0,0 +1,12 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawmBmv0HhwTFxkpxlf8ifTlMOHnIwHCHTYs"
+ nickname="y"
+ subject="path on windows"
+ date="2014-08-23T22:02:07Z"
+ content="""
+I think I have a related problem on win7 sp1.
+
+When first installing msys git, there's a screen asking for how to set the PATH variable. I chose the option not to update the windows PATH variable, which is the default. Then I installed git annex. Then launching the git-annex-autostart.vbs as well as the webapp one gets an object not found error (on line 2). launching git-annex from git bash with full path yielded an error about not finding git.
+
+Then I proceeded and reinstalled git on top of itself and picked the option to only add git and bash to windows path and it worked.
+"""]]
diff --git a/doc/bugs/Windows_build_has_hardcoded_paths/comment_5_0d7a4f740180dff7c0853062e4913804._comment b/doc/bugs/Windows_build_has_hardcoded_paths/comment_5_0d7a4f740180dff7c0853062e4913804._comment
new file mode 100644
index 000000000..42537f9f4
--- /dev/null
+++ b/doc/bugs/Windows_build_has_hardcoded_paths/comment_5_0d7a4f740180dff7c0853062e4913804._comment
@@ -0,0 +1,22 @@
+[[!comment format=mdwn
+ username="Hans_Ryding"
+ ip="81.229.194.7"
+ subject="Relying on path is not best practice in a Windows environment"
+ date="2014-08-25T16:16:33Z"
+ content="""
+Unlike under POSIX environments
+generally applications under windows don't add themselves to path,
+or to a directory already in path.
+
+Generally applications announce their location using the registry.
+Under either HKEY_LOCAL_MACHINE\SOFTWARE,
+or in case of software installed for one particular user only
+under HKEY_CURRENT_USER\SOFTWARE.
+
+Git however AFAIK does not.
+Most likely the best thing to do is to prompt the user when installing git-annex
+where git is, and store this variable.
+
+Note that in both my installs I installed git-annex into the git directory,
+and the git-annex webapp still couldn't find it.
+"""]]
diff --git a/doc/bugs/Windows_build_has_hardcoded_paths/comment_6_748aa921afee3d7e4667dee50e70a558._comment b/doc/bugs/Windows_build_has_hardcoded_paths/comment_6_748aa921afee3d7e4667dee50e70a558._comment
new file mode 100644
index 000000000..4cbf0ea58
--- /dev/null
+++ b/doc/bugs/Windows_build_has_hardcoded_paths/comment_6_748aa921afee3d7e4667dee50e70a558._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawmBmv0HhwTFxkpxlf8ifTlMOHnIwHCHTYs"
+ nickname="y"
+ subject="path on windows"
+ date="2014-08-26T12:18:39Z"
+ content="""
+To add to my comment I also installed git-annex in the same directory as the msys git distrib in both cases.
+"""]]
diff --git a/doc/bugs/__34__error:_invalid_object__34____44___after_add__59___cannot_commit.mdwn b/doc/bugs/__34__error:_invalid_object__34____44___after_add__59___cannot_commit.mdwn
new file mode 100644
index 000000000..fef6e6681
--- /dev/null
+++ b/doc/bugs/__34__error:_invalid_object__34____44___after_add__59___cannot_commit.mdwn
@@ -0,0 +1,22 @@
+### Please describe the problem.
+After having added new content (SHA1E backend), when trying to commit, git commit fails with the following error:
+
+[[!format sh """
+(Recording state in git...)
+error: invalid object 100644 5d471129a031f0f493de3736eaea6f2f4056aeee for '000/091/WORM-s1493-m1321288671--scrapbook%data%20111114173520%horiz-menu-tab-r_001.png.log'
+fatal: git-write-tree: error building trees
+git-annex: failed to read sha from git write-tree
+"""]]
+
+The commit subsequently fails and the index is left as is. When I did git-annex add, I got the same error, but the additions seem to have been staged, at least.
+
+What’s curious about this is that I migrated all keys to SHA1E earlier and dropped all WORM keys. git annex info also says that all my keys are SHA1E.
+
+Can this be related to your changes to the WORM backend? I upgraded to git-annex 5.20140818 today. Rolling back to 5.20140716 didn’t allow me to commit, either, though.
+
+Any way I could resolve this? I don’t want to git reset for now, since this will leave the added objects in the annex store.
+
+### What version of git-annex are you using? On what operating system?
+git-annex 5.20140818
+
+Linux 3.16.1
diff --git a/doc/bugs/__34__error:_invalid_object__34____44___after_add__59___cannot_commit/comment_10_8abfe7417167df54b686960319465a65._comment b/doc/bugs/__34__error:_invalid_object__34____44___after_add__59___cannot_commit/comment_10_8abfe7417167df54b686960319465a65._comment
new file mode 100644
index 000000000..a8d501682
--- /dev/null
+++ b/doc/bugs/__34__error:_invalid_object__34____44___after_add__59___cannot_commit/comment_10_8abfe7417167df54b686960319465a65._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="CandyAngel"
+ ip="81.111.193.130"
+ subject="comment 10"
+ date="2014-09-08T08:08:50Z"
+ content="""
+Removing .git/annex/index is safe, it is a step in getting git-annex to [forget a commit entirely](http://git-annex.branchable.com/forum/How_to_get_git-annex_to_forget_a_commit__63__).
+"""]]
diff --git a/doc/bugs/__34__error:_invalid_object__34____44___after_add__59___cannot_commit/comment_1_2a64a2da445a64149da7335f35142a08._comment b/doc/bugs/__34__error:_invalid_object__34____44___after_add__59___cannot_commit/comment_1_2a64a2da445a64149da7335f35142a08._comment
new file mode 100644
index 000000000..af980d1bc
--- /dev/null
+++ b/doc/bugs/__34__error:_invalid_object__34____44___after_add__59___cannot_commit/comment_1_2a64a2da445a64149da7335f35142a08._comment
@@ -0,0 +1,35 @@
+[[!comment format=mdwn
+ username="zardoz"
+ ip="78.48.163.229"
+ subject="comment 1"
+ date="2014-08-22T09:27:34Z"
+ content="""
+git fsck only shows a few dangling blobs from a branch I did earlier and left behind, but otherwise reports no errors.
+
+git annex fsck --fast ultimately fails with the original error message at some point:
+
+[[!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
+
+# nx fsck --fast|egrep -v 'ok$'
+[2014-08-22 11:14:43 CEST] read: git [\"--git-dir=/home/seb/Webmirror/.git\",\"--work-tree=/home/seb/Webmirror\",\"ls-files\",\"--cached\",\"-z\",\"--\"]
+[2014-08-22 11:14:43 CEST] chat: git [\"--git-dir=/home/seb/Webmirror/.git\",\"--work-tree=/home/seb/Webmirror\",\"check-attr\",\"-z\",\"--stdin\",\"annex.backend\",\"annex.numcopies\",\"--\"]
+[2014-08-22 11:14:43 CEST] read: git [\"--git-dir=/home/seb/Webmirror/.git\",\"--work-tree=/home/seb/Webmirror\",\"show-ref\",\"git-annex\"]
+[2014-08-22 11:14:43 CEST] read: git [\"--git-dir=/home/seb/Webmirror/.git\",\"--work-tree=/home/seb/Webmirror\",\"show-ref\",\"--hash\",\"refs/heads/git-annex\"]
+[2014-08-22 11:14:43 CEST] read: git [\"--git-dir=/home/seb/Webmirror/.git\",\"--work-tree=/home/seb/Webmirror\",\"log\",\"refs/heads/git-annex..dda9b068ac5c075e79ab63a531770ad772ae8491\",\"-n1\",\"--pretty=%H\"]
+[2014-08-22 11:14:43 CEST] chat: git [\"--git-dir=/home/seb/Webmirror/.git\",\"--work-tree=/home/seb/Webmirror\",\"cat-file\",\"--batch\"]
+[2014-08-22 11:25:24 CEST] chat: git [\"--git-dir=/home/seb/Webmirror/.git\",\"--work-tree=/home/seb/Webmirror\",\"hash-object\",\"-w\",\"--stdin-paths\",\"--no-filters\"]
+[2014-08-22 11:25:24 CEST] feed: git [\"--git-dir=/home/seb/Webmirror/.git\",\"--work-tree=/home/seb/Webmirror\",\"update-index\",\"-z\",\"--index-info\"]
+[2014-08-22 11:25:24 CEST] read: git [\"--git-dir=/home/seb/Webmirror/.git\",\"--work-tree=/home/seb/Webmirror\",\"show-ref\",\"--hash\",\"refs/heads/git-annex\"]
+[2014-08-22 11:25:24 CEST] read: git [\"--git-dir=/home/seb/Webmirror/.git\",\"--work-tree=/home/seb/Webmirror\",\"write-tree\"]
+error: invalid object 100644 5d471129a031f0f493de3736eaea6f2f4056aeee for '000/091/WORM-s1493-m1321288671--scrapbook%data%20111114173520%horiz-menu-tab-r_001.png.log'
+fatal: git-write-tree: error building trees
+git-annex: failed to read sha from git write-tree
+(Recording state in git...)
+
+# End of transcript or log.
+\"\"\"]]
+
+
+"""]]
diff --git a/doc/bugs/__34__error:_invalid_object__34____44___after_add__59___cannot_commit/comment_2_decb1689b8cc2541077e2d0ae273b5e7._comment b/doc/bugs/__34__error:_invalid_object__34____44___after_add__59___cannot_commit/comment_2_decb1689b8cc2541077e2d0ae273b5e7._comment
new file mode 100644
index 000000000..b4feb654f
--- /dev/null
+++ b/doc/bugs/__34__error:_invalid_object__34____44___after_add__59___cannot_commit/comment_2_decb1689b8cc2541077e2d0ae273b5e7._comment
@@ -0,0 +1,30 @@
+[[!comment format=mdwn
+ username="zardoz"
+ ip="78.48.163.229"
+ subject="comment 2"
+ date="2014-08-22T09:38:03Z"
+ content="""
+git commit with git-annex debug output enabled:
+
+
+[[!format sh \"\"\"
+# If you can, paste a complete transcript of the problem occurring here.
+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log
+
+[2014-08-22 11:36:46 CEST] read: git [\"--git-dir=/home/seb/Webmirror/.git\",\"--work-tree=/home/seb/Webmirror\",\"diff\",\"--cached\",\"--name-only\",\"-z\",\"--diff-filter=ACMRT\",\"--\",\".\"]
+[2014-08-22 11:36:46 CEST] read: git [\"--git-dir=/home/seb/Webmirror/.git\",\"--work-tree=/home/seb/Webmirror\",\"diff\",\"--name-only\",\"--diff-filter=T\",\"-z\",\"--cached\",\"--\",\".\"]
+[2014-08-22 11:36:46 CEST] read: git [\"--git-dir=/home/seb/Webmirror/.git\",\"--work-tree=/home/seb/Webmirror\",\"symbolic-ref\",\"HEAD\"]
+[2014-08-22 11:36:46 CEST] read: git [\"--git-dir=/home/seb/Webmirror/.git\",\"--work-tree=/home/seb/Webmirror\",\"show-ref\",\"refs/heads/master\"]
+[2014-08-22 11:36:46 CEST] chat: git [\"--git-dir=/home/seb/Webmirror/.git\",\"--work-tree=/home/seb/Webmirror\",\"hash-object\",\"-w\",\"--stdin-paths\",\"--no-filters\"]
+[2014-08-22 11:36:46 CEST] feed: git [\"--git-dir=/home/seb/Webmirror/.git\",\"--work-tree=/home/seb/Webmirror\",\"update-index\",\"-z\",\"--index-info\"]
+[2014-08-22 11:36:46 CEST] read: git [\"--git-dir=/home/seb/Webmirror/.git\",\"--work-tree=/home/seb/Webmirror\",\"show-ref\",\"--hash\",\"refs/heads/git-annex\"]
+(Recording state in git...)
+[2014-08-22 11:36:46 CEST] read: git [\"--git-dir=/home/seb/Webmirror/.git\",\"--work-tree=/home/seb/Webmirror\",\"write-tree\"]
+error: invalid object 100644 5d471129a031f0f493de3736eaea6f2f4056aeee for '000/091/WORM-s1493-m1321288671--scrapbook%data%20111114173520%horiz-menu-tab-r_001.png.log'
+fatal: git-write-tree: error building trees
+git-annex: failed to read sha from git write-tree
+
+# End of transcript or log.
+\"\"\"]]
+
+"""]]
diff --git a/doc/bugs/__34__error:_invalid_object__34____44___after_add__59___cannot_commit/comment_3_1f6443e495cc16a13e2e4175e73dc8f1._comment b/doc/bugs/__34__error:_invalid_object__34____44___after_add__59___cannot_commit/comment_3_1f6443e495cc16a13e2e4175e73dc8f1._comment
new file mode 100644
index 000000000..78e7f4138
--- /dev/null
+++ b/doc/bugs/__34__error:_invalid_object__34____44___after_add__59___cannot_commit/comment_3_1f6443e495cc16a13e2e4175e73dc8f1._comment
@@ -0,0 +1,27 @@
+[[!comment format=mdwn
+ username="zardoz"
+ ip="78.48.163.229"
+ subject="comment 3"
+ date="2014-08-22T09:58:05Z"
+ content="""
+Doing a git annex fsck on a new clone of the repository succeded; the problem must somehow with the .git/annex/index then, I presume?
+
+I did a git reset to restore to the sane state state before adding, but the problem is that I cannot unannex the files I added. :(
+
+[[!format sh \"\"\"
+nx unannex scrapbook/data/20140822101558/1.jpg
+[2014-08-22 11:56:16 CEST] read: git [\"--git-dir=/home/seb/Webmirror/.git\",\"--work-tree=/home/seb/Webmirror\",\"show-ref\",\"--head\"]
+[2014-08-22 11:56:16 CEST] read: git [\"--git-dir=/home/seb/Webmirror/.git\",\"--work-tree=/home/seb/Webmirror\",\"diff-index\",\"-z\",\"--raw\",\"--no-renames\",\"-l0\",\"--cached\",\"HEAD\"]
+[2014-08-22 11:56:16 CEST] read: git [\"--git-dir=/home/seb/Webmirror/.git\",\"--work-tree=/home/seb/Webmirror\",\"ls-files\",\"--cached\",\"-z\",\"--\",\"scrapbook/data/20140822101558/1.jpg\"]
+[2014-08-22 11:56:16 CEST] call: git [\"--git-dir=/home/seb/Webmirror/.git\",\"--work-tree=/home/seb/Webmirror\",\"commit\",\"-q\",\"--allow-empty\",\"--no-verify\",\"-m\",\"content removed from git annex\"]
+[2014-08-22 11:56:16 CEST] chat: git [\"--git-dir=/home/seb/Webmirror/.git\",\"--work-tree=/home/seb/Webmirror\",\"hash-object\",\"-w\",\"--stdin-paths\",\"--no-filters\"]
+[2014-08-22 11:56:16 CEST] feed: git [\"--git-dir=/home/seb/Webmirror/.git\",\"--work-tree=/home/seb/Webmirror\",\"update-index\",\"-z\",\"--index-info\"]
+[2014-08-22 11:56:16 CEST] read: git [\"--git-dir=/home/seb/Webmirror/.git\",\"--work-tree=/home/seb/Webmirror\",\"show-ref\",\"--hash\",\"refs/heads/git-annex\"]
+(Recording state in git...)
+[2014-08-22 11:56:16 CEST] read: git [\"--git-dir=/home/seb/Webmirror/.git\",\"--work-tree=/home/seb/Webmirror\",\"write-tree\"]
+error: invalid object 100644 5d471129a031f0f493de3736eaea6f2f4056aeee for '000/091/WORM-s1493-m1321288671--scrapbook%data%20111114173520%horiz-menu-tab-r_001.png.log'
+fatal: git-write-tree: error building trees
+git-annex: failed to read sha from git write-tree
+\"\"\"]]
+
+"""]]
diff --git a/doc/bugs/__34__error:_invalid_object__34____44___after_add__59___cannot_commit/comment_4_522020e71393434834def6c80b82e39e._comment b/doc/bugs/__34__error:_invalid_object__34____44___after_add__59___cannot_commit/comment_4_522020e71393434834def6c80b82e39e._comment
new file mode 100644
index 000000000..bfab0d1be
--- /dev/null
+++ b/doc/bugs/__34__error:_invalid_object__34____44___after_add__59___cannot_commit/comment_4_522020e71393434834def6c80b82e39e._comment
@@ -0,0 +1,16 @@
+[[!comment format=mdwn
+ username="zardoz"
+ ip="78.48.163.229"
+ subject="comment 4"
+ date="2014-08-22T10:15:51Z"
+ content="""
+The file referred to in the error message seems to be in good shape:
+
+[[!format sh \"\"\"
+git --no-pager show git-annex:000/091/WORM-s1493-m1321288671--scrapbook%data%20111114173520%horiz-menu-tab-r_001.png.log
+1408605730.57892s 0 b25f42de-f4be-4d31-84d1-ab0b71dfec01
+1408562938.526946s 0 e148ea91-0eb6-4f47-86e9-db2136a15279
+\"\"\"]]
+
+Strangely, the SHA1 of the blob is different from the one reported in the write-tree error.
+"""]]
diff --git a/doc/bugs/__34__error:_invalid_object__34____44___after_add__59___cannot_commit/comment_5_cc4cba022869b32d298cdafed9545a34._comment b/doc/bugs/__34__error:_invalid_object__34____44___after_add__59___cannot_commit/comment_5_cc4cba022869b32d298cdafed9545a34._comment
new file mode 100644
index 000000000..0be1eb958
--- /dev/null
+++ b/doc/bugs/__34__error:_invalid_object__34____44___after_add__59___cannot_commit/comment_5_cc4cba022869b32d298cdafed9545a34._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="zardoz"
+ ip="78.48.163.229"
+ subject="comment 5"
+ date="2014-08-22T13:07:34Z"
+ content="""
+I remembered I keep an hourly snapshot regimen and was able to get back the repository from before doing the «add» this morning. Both git fsck and git annex fsck return no errors, and yet, whenever anything is done to the git-annex branch (I tried add and forget), I get the above error.
+"""]]
diff --git a/doc/bugs/__34__error:_invalid_object__34____44___after_add__59___cannot_commit/comment_6_e71b251db2ff1f52a40fec40303cdefc._comment b/doc/bugs/__34__error:_invalid_object__34____44___after_add__59___cannot_commit/comment_6_e71b251db2ff1f52a40fec40303cdefc._comment
new file mode 100644
index 000000000..3fcbf200b
--- /dev/null
+++ b/doc/bugs/__34__error:_invalid_object__34____44___after_add__59___cannot_commit/comment_6_e71b251db2ff1f52a40fec40303cdefc._comment
@@ -0,0 +1,15 @@
+[[!comment format=mdwn
+ username="zardoz"
+ ip="78.48.163.229"
+ subject="comment 6"
+ date="2014-08-22T13:15:06Z"
+ content="""
+I tried git annex repair on the repo (before doing any adds). It reports no fsck errors, but the repair then dies from a stack overflow.
+
+[[!format sh \"\"\"
+Running git fsck ...
+No problems found.
+Stack space overflow: current size 8388608 bytes.
+Use `+RTS -Ksize -RTS' to increase it.
+\"\"\"]]
+"""]]
diff --git a/doc/bugs/__34__error:_invalid_object__34____44___after_add__59___cannot_commit/comment_7_0b6413f9ca403be3d83bb3306d1e7f8f._comment b/doc/bugs/__34__error:_invalid_object__34____44___after_add__59___cannot_commit/comment_7_0b6413f9ca403be3d83bb3306d1e7f8f._comment
new file mode 100644
index 000000000..eb2dea956
--- /dev/null
+++ b/doc/bugs/__34__error:_invalid_object__34____44___after_add__59___cannot_commit/comment_7_0b6413f9ca403be3d83bb3306d1e7f8f._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="zardoz"
+ ip="78.48.163.229"
+ subject="comment 7"
+ date="2014-08-22T14:00:42Z"
+ content="""
+I experimented on my snapshot a bit and found out something odd: When I reset the git-annex branch from dda9b06 to git-annex~1 (4246f73) my local file additions succeed, even though git-annex will fast-forward the branch to dda9b06 again before adding (when merging from origin/git-annex). dda9b06 is a large commit in which I dropped many unused WORM keys from another remote.
+"""]]
diff --git a/doc/bugs/__34__error:_invalid_object__34____44___after_add__59___cannot_commit/comment_8_f951981f0bf8cbaecfc46e7b9c903d70._comment b/doc/bugs/__34__error:_invalid_object__34____44___after_add__59___cannot_commit/comment_8_f951981f0bf8cbaecfc46e7b9c903d70._comment
new file mode 100644
index 000000000..ec876d2ea
--- /dev/null
+++ b/doc/bugs/__34__error:_invalid_object__34____44___after_add__59___cannot_commit/comment_8_f951981f0bf8cbaecfc46e7b9c903d70._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="zardoz"
+ ip="78.48.163.229"
+ subject="comment 8"
+ date="2014-08-22T18:57:37Z"
+ content="""
+I just checked my other large git annex repo and noticed that here too I could no longer add files to the annex. The same observations as above apply. Here too on the tip of the git-anenx branch I had one huge commit in which I dropped the last of the unused WORM keys from another remote. Resetting the git-annex branch to git-annex~1 allowed me to make additions again, even though the reset tip was subsequently merged in again from the remote tracking branch.
+"""]]
diff --git a/doc/bugs/__34__error:_invalid_object__34____44___after_add__59___cannot_commit/comment_9_7c98c8b291fdf28a09ccb6c7e4001d5a._comment b/doc/bugs/__34__error:_invalid_object__34____44___after_add__59___cannot_commit/comment_9_7c98c8b291fdf28a09ccb6c7e4001d5a._comment
new file mode 100644
index 000000000..1a49e449f
--- /dev/null
+++ b/doc/bugs/__34__error:_invalid_object__34____44___after_add__59___cannot_commit/comment_9_7c98c8b291fdf28a09ccb6c7e4001d5a._comment
@@ -0,0 +1,22 @@
+[[!comment format=mdwn
+ username="zardoz"
+ ip="78.48.163.229"
+ subject="comment 9"
+ date="2014-09-07T14:04:51Z"
+ content="""
+Any ideas? I noticed one alternative way (cf. the reset workaround
+above) to make «git annex add» work again is by deleting
+.git/annex/index*. Is this safe?
+
+In both repos, I had not even staged annex additions before the index
+was corrupted; the corruption must somehow have been left-over from
+earlier actions, altough all previous additions succeeded at the time,
+before both repositories mysteriously stopped working (in the context
+of backend-migration).
+
+I still have the original snapshots around if you’d like to debug
+this. As noted, «git fsck» succeeds, and all the block-level checksums
+check out, so the problem can’t be on the block device or file-system
+level.
+
+"""]]
diff --git a/doc/bugs/__34__old__34___and___34__new__34___hash_formats_are_mixed_up.mdwn b/doc/bugs/__34__old__34___and___34__new__34___hash_formats_are_mixed_up.mdwn
new file mode 100644
index 000000000..e11d79867
--- /dev/null
+++ b/doc/bugs/__34__old__34___and___34__new__34___hash_formats_are_mixed_up.mdwn
@@ -0,0 +1,31 @@
+~~~~
+$ git annex version
+git-annex version: 5.20140818-g10bf03a
+~~~~
+
+When repository was initially created, it used "old" hashing from http://git-annex.branchable.com/internals/hashing/ . After some operations, annex was upgraded to "new" format. However, symlinks are still in "old" format and dangling. "git annex fsck", "git annex repair", "git annex pre-commit" - none helps.
+
+~~~~
+$ ls -l pics
+lrwxrwxrwx 1 pfalcon pfalcon 199 Jan 22 2012 IMG_3776.JPG -> ../.git/annex/objects/KM/j6/SHA256E-s688630--5bc2e8beb7a57f6fbcd7d9321cd5283f04448ea475099dac07ae38f002208040.JPG/SHA256E-s688630--5bc2e8beb7a57f6fbcd7d9321cd5283f04448ea475099dac07ae38f002208040.JPG
+lrwxrwxrwx 1 pfalcon pfalcon 199 Jan 22 2012 renamed2.jpg -> ../.git/annex/objects/7F/z3/SHA256E-s676047--3cd28892ee54aba13e074f230709b2c3b87915ff36efd9be3ddfc603e92ecdda.JPG/SHA256E-s676047--3cd28892ee54aba13e074f230709b2c3b87915ff36efd9be3ddfc603e92ecdda.JPG
+lrwxrwxrwx 1 pfalcon pfalcon 199 Jan 22 2012 renamed.jpg -> ../.git/annex/objects/W1/vK/SHA256E-s585398--005fe0534d6cc17a3536c1817b091d00249834c338f289ec6569e9f262889251.JPG/SHA256E-s585398--005fe0534d6cc17a3536c1817b091d00249834c338f289ec6569e9f262889251.JPG
+
+$ find .git/annex/objects/
+.git/annex/objects/
+.git/annex/objects/219
+.git/annex/objects/219/741
+.git/annex/objects/219/741/SHA256E-s585398--005fe0534d6cc17a3536c1817b091d00249834c338f289ec6569e9f262889251.JPG
+.git/annex/objects/219/741/SHA256E-s585398--005fe0534d6cc17a3536c1817b091d00249834c338f289ec6569e9f262889251.JPG/SHA256E-s585398--005fe0534d6cc17a3536c1817b091d00249834c338f289ec6569e9f262889251.JPG
+.git/annex/objects/7a6
+.git/annex/objects/7a6/632
+.git/annex/objects/7a6/632/SHA256E-s688630--5bc2e8beb7a57f6fbcd7d9321cd5283f04448ea475099dac07ae38f002208040.JPG
+.git/annex/objects/7a6/632/SHA256E-s688630--5bc2e8beb7a57f6fbcd7d9321cd5283f04448ea475099dac07ae38f002208040.JPG/SHA256E-s688630--5bc2e8beb7a57f6fbcd7d9321cd5283f04448ea475099dac07ae38f002208040.JPG
+.git/annex/objects/df3
+.git/annex/objects/df3/9a8
+.git/annex/objects/df3/9a8/SHA256E-s676047--3cd28892ee54aba13e074f230709b2c3b87915ff36efd9be3ddfc603e92ecdda.JPG
+.git/annex/objects/df3/9a8/SHA256E-s676047--3cd28892ee54aba13e074f230709b2c3b87915ff36efd9be3ddfc603e92ecdda.JPG/SHA256E-s676047--3cd28892ee54aba13e074f230709b2c3b87915ff36efd9be3ddfc603e92ecdda.JPG
+~~~~
+
+> Unforunately, I cannot see through the attitude problem to a clear bug
+> report. Lacking time/energy to try to coax one out. [[done]] --[[Joey]]
diff --git a/doc/bugs/__34__old__34___and___34__new__34___hash_formats_are_mixed_up/comment_1_5ed3f7b21b007e269f5846cb2d805493._comment b/doc/bugs/__34__old__34___and___34__new__34___hash_formats_are_mixed_up/comment_1_5ed3f7b21b007e269f5846cb2d805493._comment
new file mode 100644
index 000000000..8ca81d325
--- /dev/null
+++ b/doc/bugs/__34__old__34___and___34__new__34___hash_formats_are_mixed_up/comment_1_5ed3f7b21b007e269f5846cb2d805493._comment
@@ -0,0 +1,35 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawld54zdyk6b0W4jXnssSO_j2Nn3W1uVsUE"
+ nickname="Paul"
+ subject="comment 1"
+ date="2014-08-24T20:27:08Z"
+ content="""
+Aha, so local repo is created with old hash format. But when you add remote (special rsync remote in my case), and copy --to it, it uses new hashes:
+
+~~~~
+copy 20120122 Routing doorbell/IMG_3776.JPG (checking nas-rsync...) (to nas-rsync...)
+sending incremental file list
+7a6/
+7a6/632/
+7a6/632/SHA256E-s688630--5bc2e8beb7a57f6fbcd7d9321cd5283f04448ea475099dac07ae38f002208040.JPG/
+7a6/632/SHA256E-s688630--5bc2e8beb7a57f6fbcd7d9321cd5283f04448ea475099dac07ae38f002208040.JPG/SHA256E-s688630--5bc2e8beb7a57f6fbcd7d9321cd5283f04448ea475099dac07ae38f002208040.JPG
+~~~~
+
+This explains this nonsense:
+
+~~~~
+$ git annex unused --from=nas-rsync
+unused nas-rsync (checking for unused data...) (checking master...)
+ Some annexed data on nas-rsync is not used by any files:
+ NUMBER KEY
+ 1 SHA256E-s585398--005fe0534d6cc17a3536c1817b091d00249834c338f289ec6569e9f262889251.JPG
+ 2 SHA256E-s688630--5bc2e8beb7a57f6fbcd7d9321cd5283f04448ea475099dac07ae38f002208040.JPG
+ 3 SHA256E-s676047--3cd28892ee54aba13e074f230709b2c3b87915ff36efd9be3ddfc603e92ecdda.JPG
+ (To see where data was previously used, try: git log --stat -S'KEY')
+
+ To remove unwanted data: git-annex dropunused --from nas-rsync NUMBER
+
+ok
+~~~~
+
+"""]]
diff --git a/doc/bugs/__34__old__34___and___34__new__34___hash_formats_are_mixed_up/comment_2_436d8994457517e4c6f68f572b83decc._comment b/doc/bugs/__34__old__34___and___34__new__34___hash_formats_are_mixed_up/comment_2_436d8994457517e4c6f68f572b83decc._comment
new file mode 100644
index 000000000..192d48fc7
--- /dev/null
+++ b/doc/bugs/__34__old__34___and___34__new__34___hash_formats_are_mixed_up/comment_2_436d8994457517e4c6f68f572b83decc._comment
@@ -0,0 +1,13 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawld54zdyk6b0W4jXnssSO_j2Nn3W1uVsUE"
+ nickname="Paul"
+ subject="comment 2"
+ date="2014-08-24T22:26:47Z"
+ content="""
+Ok, I see, http://git-annex.branchable.com/internals/hashing/ says that old vs new hash mess is deliberate, to make user experience better. (One might ask why one hash was replaced with another equivalent, but nobody would. Oh wait, it's a filesystem case sensitivity issue of course. But it's too secret to be mentioned on \"hashing\" page.)
+
+\"unused --from=\" issue comes and goes, don't see it now. That initial issue of completely broken symlinks happened after running testremote, then breaking it (because it should say it takes hour(s) to complete). So, many users probably won't be affected (nevermind that those who will, will essentially have data loss).
+
+Last issue I faced that somehow my local working copy gets \"bare = true\" each time I sync against remote SSH repo (which is bare of course, as remote repo should be).
+
+"""]]
diff --git a/doc/bugs/__39__git_annex_get__39___returns_success_when_file_not_found.mdwn b/doc/bugs/__39__git_annex_get__39___returns_success_when_file_not_found.mdwn
new file mode 100644
index 000000000..93f2a8fd9
--- /dev/null
+++ b/doc/bugs/__39__git_annex_get__39___returns_success_when_file_not_found.mdwn
@@ -0,0 +1,30 @@
+### Please describe the problem.
+When attempting to 'git annex get' a file that does not exist in the git repository, git-annex correctly reports "not found". But it still returns exit code 0, incorrectly indicating success. This is problematic for scripting.
+
+### What steps will reproduce the problem?
+See transcript
+
+### What version of git-annex are you using? On what operating system?
+git-annex 5.20140517.4 as supplied by 'git-annex' aptitude package on Ubuntu 12.04.4 LTS (32-bit)
+
+### Please provide any additional information below.
+
+[[!format sh """
+
+henry@commsbox:~/work/tmp$ git init test
+Initialized empty Git repository in /home/henry/work/tmp/test/.git/
+henry@commsbox:~/work/tmp$ cd test
+henry@commsbox:~/work/tmp/test$ git annex init
+init ok
+(Recording state in git...)
+henry@commsbox:~/work/tmp/test$ git annex get nonexistent.file
+git-annex: nonexistent.file not found
+henry@commsbox:~/work/tmp/test$ echo $?
+0
+
+
+"""]]
+
+> Ok, I can find no reason why it was implemented as a warning in
+> 5f3661238de9f31e6fed0be74fca9d5f1659278c in the bug report associated
+> with that commit. So, promoted to error. [[done]] --[[Joey]]
diff --git a/doc/bugs/annex-rsync-transport_ignored.mdwn b/doc/bugs/annex-rsync-transport_ignored.mdwn
new file mode 100644
index 000000000..1c6923a88
--- /dev/null
+++ b/doc/bugs/annex-rsync-transport_ignored.mdwn
@@ -0,0 +1,30 @@
+### Please describe the problem.
+I have an rsync remote with the following option in config:
+annex-rsync-transport = ssh -i /path/to/private/key
+
+and git annex copy --to <remote> still asks for the remote's password. I've checked and I can ssh into the remote using that key with no problems, here's the --debug output:
+
+ copy SHA256E-s152396--56bcf5e3f72daa1a194b16e42330fe82806cc1dbc6f3bb52888ff5e5c57b8d08.log (gpg) (checking <remote>...) [2014-09-05 13:12:41 CEST] read: rsync ["<user>@<remote>:<remote path>/81c/b5e/'GPGHMACSHA1--7d9470e207a5669e2d9120538b68815274dbf16d/GPGHMACSHA1--7d9470e207a5669e2d9120538b68815274dbf16d'"]
+ <user>@<remote>'s password:
+
+
+Once it has asked for the password twice, it starts using the rsync options correctly to copy and the password is no longer needed, until the next "checking remote…". Maybe the "checking remote…" part ignores the configuration?
+
+### What steps will reproduce the problem?
+Use an rsync remote with annex-rsync-transport config set.
+
+### What version of git-annex are you using? On what operating system?
+git annex version gives:
+
+ git-annex version: 5.20140814-g9b89b5c
+ build flags: Assistant Webapp Webapp-secure Pairing Testsuite S3 WebDAV Inotify DBus DesktopNotify XMPP DNS Feeds Quvi TDFA CryptoHash
+ key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E SHA256 SHA1 SHA512 SHA224 SHA384 SKEIN256 SKEIN512 WORM URL
+ remote types: git gcrypt S3 bup directory rsync web webdav tahoe glacier ddar hook external
+ local repository version: 5
+ supported repository version: 5
+ upgrade supported from repository versions: 0 1 2 4
+
+which is the latest available linux-armel version.
+
+> Also removing didn't use the configured transport. Both [[fixed|done]]
+> --[[Joey]]
diff --git a/doc/bugs/annex_tries_to_start_old_binaray.mdwn b/doc/bugs/annex_tries_to_start_old_binaray.mdwn
new file mode 100644
index 000000000..76f935001
--- /dev/null
+++ b/doc/bugs/annex_tries_to_start_old_binaray.mdwn
@@ -0,0 +1,45 @@
+### Please describe the problem.
+See the logs. git-annex-shell tries to use not existing runshell
+
+
+### What steps will reproduce the problem?
+I am on Debian testing and have, some month ago, tried the tarball distribution.
+I have returned to deb packages later and deleted the tarball installation.
+Seems that there some traces left.
+
+I have tried to find the runshell configuration, but failed to do so.
+
+I have destroyed the repo completely, has not helped.
+
+### What version of git-annex are you using? On what operating system?
+ii git-annex 5.20140831 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
+
+[2014-09-07 17:15:04 CEST] main: starting assistant version 5.20140831
+[2014-09-07 17:15:04 CEST] Cronner: Consistency check in progress
+/home/<user>/.ssh/git-annex-shell: 4: exec: /home/<user>/git-annex.linux.5.20131213/runshell: not found
+/home/<user>/.ssh/git-annex-shell: 4: exec: /home/<user>/git-annex.linux.5.20131213/runshell: not found
+fatal: Could not read from remote repository.
+
+Please make sure you have the correct access rights
+and the repository exists.
+/home/<user>/.ssh/git-annex-shell: 4: exec: /home/<user>/git-annex.linux.5.20131213/runshell: not found
+/home/<user>/.ssh/git-annex-shell: 4: exec: /home/<user>/git-annex.linux.5.20131213/runshell: not found
+fatal: Could not read from remote repository.
+
+Please make sure you have the correct access rights
+and the repository exists.
+/home/<user>/.ssh/git-annex-shell: 4: exec: /home/<user>/git-annex.linux.5.20131213/runshell: not found
+(scanning...) [2014-09-07 17:16:47 CEST] Watcher: Performing startup scan
+/home/<user>/.ssh/git-annex-shell: 4: exec: /home/<user>/git-annex.linux.5.20131213/runshell: not found
+/home/<user>/.ssh/git-annex-shell: 4: exec: /home/<user>/git-annex.linux.5.2013121/
+/home/<user>/.ssh/git-annex-shell: 4: exec: /home/<user>/git-annex.linux.5.20131213/runshell: not found
+/home/<user>/.ssh/git-annex-shell: 4: exec: /home/<user>/git-annex.linux.5.20131213/runshell: not found
+
+# End of transcript or log.
+"""]]
diff --git a/doc/bugs/annex_tries_to_start_old_binaray/comment_1_209c36b737a48a6136eeb85d1f3d01b3._comment b/doc/bugs/annex_tries_to_start_old_binaray/comment_1_209c36b737a48a6136eeb85d1f3d01b3._comment
new file mode 100644
index 000000000..753b9a998
--- /dev/null
+++ b/doc/bugs/annex_tries_to_start_old_binaray/comment_1_209c36b737a48a6136eeb85d1f3d01b3._comment
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ ip="209.250.56.132"
+ subject="comment 1"
+ date="2014-09-11T17:55:28Z"
+ content="""
+~/.ssh/git-annex-shell is a wrapper script that gets installed when you use the standalone build. You can delete it and your problem will be fixed.
+
+It would probably be good if the standalone build came with an uninstallation script.
+"""]]
diff --git a/doc/bugs/box.com.mdwn b/doc/bugs/box.com.mdwn
new file mode 100644
index 000000000..7f3bcf58f
--- /dev/null
+++ b/doc/bugs/box.com.mdwn
@@ -0,0 +1,33 @@
+### Please describe the problem.
+
+I´m trying to use an box.com acount as special remote repository for transfering data amoung my clients. Adding the box.com is possible. On the box.com website i see that git-annex has create an folder, but there is no syncing.
+
+When i try to enable the box.com Repository on an another client i get an Internal Error Server: bad creds.
+
+
+### What version of git-annex are you using? On what operating system?
+
+Git-Annex Version: git-annex version 5.20140830-g3c96b79
+
+Mac OS X 10.9.4
+
+### Please provide any additional information below.
+
+[[!format sh """
+# If you can, paste a complete transcript of the problem occurring here.
+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log
+
+03/Sep/2014:20:41:31 +0200 [Error#yesod-core] bad creds @(yesod-core-1.2.19:Yesod.Core.Class.Yesod ./Yesod/Core/Class/Yesod.hs:503:5)
+
+[2014-09-03 20:41:47 CEST] main: Syncing with Box.com
+
+ bad creds
+
+ bad creds
+
+ bad creds
+
+ bad creds
+
+# End of transcript or log.
+"""]]
diff --git a/doc/bugs/cotinually_prompting_for_gpg_passphrase.mdwn b/doc/bugs/cotinually_prompting_for_gpg_passphrase.mdwn
new file mode 100644
index 000000000..c017cf1a6
--- /dev/null
+++ b/doc/bugs/cotinually_prompting_for_gpg_passphrase.mdwn
@@ -0,0 +1,77 @@
+### Please describe the problem.
+
+While the assistant is synchronizing (to local USB backup disks or remote repositories) I am continually prompted for GPG passphrase when it is most definitely already in the gpg-agent.
+
+### What steps will reproduce the problem?
+
+Set up some remote gcrypt repositores using an existing GPG key, add some files, use the system, you are prompted for the passphrase far more often than the timeout of the passphrase in the agent (every few minutes). The number of times you are prompted also seems to increase linearly with the number of repositories - I am guessing they all exhibit the same need for the passphrase and all request at once, resulting in a string of 10+ pinentry popups.
+
+I am wondering if there is something specific in my gpg setup that git annex isn't expecting. Always encrypt to self? Signing subkeys? Either way, standard tools manage to call gpg to encrypt/decrypt using gpg-agent and not prompting for the passphrase, so git annex should be able to as well.
+
+### What version of git-annex are you using? On what operating system?
+
+Arch Linux, 5.20140831-g62e6ad8
+
+### Please provide any additional information below.
+
+I have read the various discussions about using -R or -r for the recipients, and I can see in the logs that -r is being used, but there is definitely something not working correctly. At the same time that git annex is making a gpg-agent request that results in a passphrase request, I can encrypt and decrypt whatever files I want manually with no prompting.
+
+[[!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
+
+gcrypt: Development version -- Repository format MAY CHANGE
+gcrypt: Development version -- Repository format MAY CHANGE
+gcrypt: Development version -- Repository format MAY CHANGE
+gcrypt: Decrypting manifest
+gcrypt: Decrypting manifest
+gpg: anonymous recipient; trying secret key 7426266D ...
+gpg: anonymous recipient; trying secret key 7426266D ...
+gpg: okay, we are the anonymous recipient.
+gpg: Signature made Thu 11 Sep 2014 06:21:58 BST using RSA key ID AC305414
+gpg: Good signature from "user <XXXXXX>" [ultimate]
+gpg: aka "[jpeg image of size 2004]" [ultimate]
+gpg: okay, we are the anonymous recipient.
+gpg: Signature made Thu 11 Sep 2014 06:21:58 BST using RSA key ID AC305414
+gpg: Good signature from "user <XXXXXX>" [ultimate]
+gpg: aka "[jpeg image of size 2004]" [ultimate]
+gcrypt: WARNING:
+gcrypt: WARNING: Remote ID has changed!
+gcrypt: WARNING: from :id:QydYJR8dPq7y7kMUQDG1
+gcrypt: WARNING: to :id:gU3sc34/rhmta4xfSm3O
+gcrypt: WARNING:
+gcrypt: Encrypting to: -r 49AFD42BB9E8CD9D
+gcrypt: Requesting manifest signature
+gcrypt: Encrypting to: -r 49AFD42BB9E8CD9D
+gcrypt: Requesting manifest signature
+gcrypt: Decrypting manifest
+gpg: anonymous recipient; trying secret key 7426266D ...
+gpg: okay, we are the anonymous recipient.
+gpg: Signature made Thu 11 Sep 2014 06:22:58 BST using RSA key ID AC305414
+gpg: Good signature from "user <XXXXXXX>" [ultimate]
+gpg: aka "[jpeg image of size 2004]" [ultimate]
+gcrypt: Encrypting to: -r 49AFD42BB9E8CD9D
+gcrypt: Requesting manifest signature
+gpg: cancelled by user
+gpg: skipped "49AFD42BB9E8CD9D": Operation cancelled
+gpg: [stdin]: sign+encrypt failed: Operation cancelled
+error: failed to push some refs to 'gcrypt::/autofs/ext/wdpassport0/annexes/user/docs'
+[2014-09-11 06:36:18 BST] read: git ["--git-dir=/home/user/docs/.git","--work-tree=/home/user/docs","-c","core.bare=false","push","wdpassport0","master"]
+...
+
+# End of transcript or log.
+"""]]
+
+The section above I clicked cancel on the pinentry dialog as can be seen. The question is, why was it asking me anyway?
+
+> gpg: anonymous recipient; trying secret key 7426266D ...
+>
+> That means that you have git-remote-gcrypt configured to use anonymous
+> recipients. This causes gpg to try a bunch of gpg keys until it finds one
+> that works, rather than immediately trying the right key.
+>
+> I modified git-remote-gcrypt in July so you can configure
+> gcrypt.publish-participants to avoid this problem.
+>
+> There may also be a local confguration problem; I don't know. In any
+> case, it's not git-annex responsible, but git-remote-gcrypt. [[done]] --[[Joey]]
diff --git a/doc/bugs/direct_command_leaves_repository_inconsistent_if_interrupted/comment_3_2acff7b667e8618251075031cbef6b9a._comment b/doc/bugs/direct_command_leaves_repository_inconsistent_if_interrupted/comment_3_2acff7b667e8618251075031cbef6b9a._comment
new file mode 100644
index 000000000..5de6726aa
--- /dev/null
+++ b/doc/bugs/direct_command_leaves_repository_inconsistent_if_interrupted/comment_3_2acff7b667e8618251075031cbef6b9a._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ ip="131.252.200.111"
+ subject="comment 3"
+ date="2014-08-31T22:29:44Z"
+ content="""
+Occurs to me that your repo may not have a pre-commit hook; if not then `git commit -a` would not behave as I described..
+"""]]
diff --git a/doc/bugs/direct_command_leaves_repository_inconsistent_if_interrupted/comment_4_c3a4a1ce24fcbe1087041850f490a58a._comment b/doc/bugs/direct_command_leaves_repository_inconsistent_if_interrupted/comment_4_c3a4a1ce24fcbe1087041850f490a58a._comment
new file mode 100644
index 000000000..82b77f78b
--- /dev/null
+++ b/doc/bugs/direct_command_leaves_repository_inconsistent_if_interrupted/comment_4_c3a4a1ce24fcbe1087041850f490a58a._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="https://andrew.aylett.co.uk/"
+ nickname="andrew"
+ subject="comment 4"
+ date="2014-09-07T18:41:28Z"
+ content="""
+I, too, have seen this issue -- took me a while to recover from it. I do (now, at least) have a pre-commit hook that calls git annex pre-commit; I didn't set that up myself.
+"""]]
diff --git a/doc/bugs/git-annex_branch_shows_commit_with_looong_commitlog/comment_3_cbbeaa691d102bd7d29f5e9bad9d6f53._comment b/doc/bugs/git-annex_branch_shows_commit_with_looong_commitlog/comment_3_cbbeaa691d102bd7d29f5e9bad9d6f53._comment
new file mode 100644
index 000000000..865140509
--- /dev/null
+++ b/doc/bugs/git-annex_branch_shows_commit_with_looong_commitlog/comment_3_cbbeaa691d102bd7d29f5e9bad9d6f53._comment
@@ -0,0 +1,32 @@
+[[!comment format=mdwn
+ username="Francois"
+ ip="2001:788:5:1:29c2:de49:9811:51c8"
+ subject="comment 3"
+ date="2014-08-15T20:45:38Z"
+ content="""
+I've been experiencing the exact same problem and searching for **recovery from race** lead me to this bug report. Thanks for reporting it!
+
+For a few months, a repo storing ~19'000 files (mostly immutable pictures) started to launch memory hungry \"git log\" processes. For example:
+
+ 4797 francois 20 0 8118296 7.719g 2032 D 22.3 50.2 0:11.61 git
+
+ 4797 pts/1 D+ 0:12 git --git-dir=~/Pictures/.git --work-tree=~/Pictures -c core.bare=false log refs/heads/git-annex..52e44b967ad5d316d832562be02c5555c1f6d2a4 --oneline -n1
+
+Thanks to the hints found in this report, I was able to find many huge commit messages such as this one:
+
+ $ git show 6357b208
+ commit 6357b2081e7c85dfe1ccc10824b75f3e212e6386
+ Author: Francois Deppierraz <francois@ctrlaltdel.ch>
+ Date: Sat Jun 14 10:38:46 2014 +0200
+
+ update (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) [...]
+
+ $ git show 6357b208 | wc
+ 5 444026 3108236
+
+There were probably many new files added on Jun 14th and looking for a way to increase to sync speed, especially to a S3-like remote, I found the solution on this wiki for [multiple concurrent transfers](https://git-annex.branchable.com/forum/Feature_request:_Multiple_concurrent_transfers/).
+
+This looks like a likely culprit for generating race conditions. What do you think?
+
+ git-annex version: 5.20140412ubuntu1
+"""]]
diff --git a/doc/bugs/git-annex_branch_shows_commit_with_looong_commitlog/comment_4_094191b806ac76b2aef325733fe37136._comment b/doc/bugs/git-annex_branch_shows_commit_with_looong_commitlog/comment_4_094191b806ac76b2aef325733fe37136._comment
new file mode 100644
index 000000000..e80d66b5a
--- /dev/null
+++ b/doc/bugs/git-annex_branch_shows_commit_with_looong_commitlog/comment_4_094191b806ac76b2aef325733fe37136._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="Francois"
+ ip="2001:788:5:1:29c2:de49:9811:51c8"
+ subject="comment 4"
+ date="2014-08-15T20:51:12Z"
+ content="""
+Bonus question: is there any way to bring this repo back into a working state (for instance with git-filter-branch?) ?
+"""]]
diff --git a/doc/bugs/git_annex_repair_fails_-___47__tmp__47__tmprepo.1__47__.git__47__gc.pid:_removeLink:_does_not_exist___40__No_such_file_or_directory__41__/comment_2_b8ee68b445c6a8d27121d90a2eeba0c7._comment b/doc/bugs/git_annex_repair_fails_-___47__tmp__47__tmprepo.1__47__.git__47__gc.pid:_removeLink:_does_not_exist___40__No_such_file_or_directory__41__/comment_2_b8ee68b445c6a8d27121d90a2eeba0c7._comment
new file mode 100644
index 000000000..6f5570e25
--- /dev/null
+++ b/doc/bugs/git_annex_repair_fails_-___47__tmp__47__tmprepo.1__47__.git__47__gc.pid:_removeLink:_does_not_exist___40__No_such_file_or_directory__41__/comment_2_b8ee68b445c6a8d27121d90a2eeba0c7._comment
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="jg123h12jh3y12g3y"
+ ip="86.62.100.131"
+ subject="Log with --debug"
+ date="2014-08-20T05:49:02Z"
+ content="""
+https://mega.co.nz/#!HYZmwSIb!gCd9jvVIyYye_bpsUq_vuEed4g7NTlEl2xDRheE1Lx4
+
+This is the log of git annex repair --debug.
+"""]]
diff --git a/doc/bugs/ssh_over_IPv6.mdwn b/doc/bugs/ssh_over_IPv6.mdwn
new file mode 100644
index 000000000..b5e9f0358
--- /dev/null
+++ b/doc/bugs/ssh_over_IPv6.mdwn
@@ -0,0 +1,29 @@
+### Please describe the problem.
+When i try to sync to my server (path in .git/config is "[fcb8:b10:1cb8:c94:58d0:2522:89f9:c89e]:/home/thomas/git/musik") the url gets messed up by annex and i get the error "git-annex: bad url ssh://[fcb8/~/b10:1cb8:c94:58d0:2522:89f9:c89e]:/home/thomas/git/musik".
+
+### What steps will reproduce the problem?
+1. init git & annex
+2. add files
+3. add a IPv6 address remote
+4. push git branches
+5. git annex sync
+
+### What version of git-annex are you using? On what operating system?
+```
+git-annex version: 5.20140412ubuntu1
+build flags: Assistant Webapp Webapp-secure Pairing Testsuite S3 WebDAV Inotify DBus DesktopNotify XMPP DNS Feeds Quvi TDFA CryptoHash
+key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E SHA256 SHA1 SHA512 SHA224 SHA384 SKEIN256 SKEIN512 WORM URL
+remote types: git gcrypt S3 bup directory rsync web webdav tahoe glacier hook external
+local repository version: 5
+supported repository version: 5
+upgrade supported from repository versions: 0 1 2 4
+```
+
+> [[Fixed|done]] by adding support for ipv6 addresses when git-annex
+> converts a git remote loction into an url. BTW, the
+> simple workaround is to give it a valid url from the beginning
+> `ssh://[fcb8:b10:1cb8:c94:58d0:2522:89f9:c89e]/home/thomas/git/musik"`
+>
+> As to any problems using an ipv6 remote once it's set up, I've used them
+> with no problems.
+> --[[Joey]]
diff --git a/doc/bugs/ssh_over_IPv6/comment_1_0287f73c44645a1f854ecfe4ddddb258._comment b/doc/bugs/ssh_over_IPv6/comment_1_0287f73c44645a1f854ecfe4ddddb258._comment
new file mode 100644
index 000000000..13c9794e4
--- /dev/null
+++ b/doc/bugs/ssh_over_IPv6/comment_1_0287f73c44645a1f854ecfe4ddddb258._comment
@@ -0,0 +1,15 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawmBUR4O9mofxVbpb8JV9mEbVfIYv670uJo"
+ nickname="Justin"
+ subject="comment 1"
+ date="2014-08-28T20:46:29Z"
+ content="""
+
+Try using ~/.ssh/config as a workaround
+
+ Host myserver
+ Hostname fcb8:b10:1cb8:c94:58d0:2522:89f9:c89e
+
+then just tell git-annex to use myserver
+
+"""]]
diff --git a/doc/bugs/ssh_over_IPv6/comment_2_cfa63d226ae411551a728af5ab043491._comment b/doc/bugs/ssh_over_IPv6/comment_2_cfa63d226ae411551a728af5ab043491._comment
new file mode 100644
index 000000000..032e100ad
--- /dev/null
+++ b/doc/bugs/ssh_over_IPv6/comment_2_cfa63d226ae411551a728af5ab043491._comment
@@ -0,0 +1,29 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawlog_5wIICaMcrKTexlFNA6IO6UTp323aE"
+ nickname="Torkaly"
+ subject="comment 2"
+ date="2014-09-01T11:01:30Z"
+ content="""
+thank you. I workaround this by using the DNS hostname instead the IPv6 address directly. But this is not a nice solution, like any workaround. But now i have problems with `git annex get` over IPv6-only:
+
+```
+get ***.mp3 (not available)
+ Try making some of these repositories available:
+ 5636aefa-c509-4ea0-bebe-f5b96d8eb15a -- hserver
+failed
+<snip>
+```
+
+but i can ping it:
+```
+thomas@alus:~/Musik$ ping6 hserver.h.b128.net
+PING hserver.h.b128.net(fcb8:b10:1cb8:c94:58d0:2522:89f9:c89e) 56 data bytes
+64 bytes from fcb8:b10:1cb8:c94:58d0:2522:89f9:c89e: icmp_seq=1 ttl=42 time=453 ms
+64 bytes from fcb8:b10:1cb8:c94:58d0:2522:89f9:c89e: icmp_seq=2 ttl=42 time=441 ms
+64 bytes from fcb8:b10:1cb8:c94:58d0:2522:89f9:c89e: icmp_seq=3 ttl=42 time=425 ms
+64 bytes from fcb8:b10:1cb8:c94:58d0:2522:89f9:c89e: icmp_seq=5 ttl=42 time=413 ms
+```
+(the high pings are caused by a download from an other source. Also i have no problems with rsync over IPv6)
+
+PS: the markdown for code blocks is not working too :)
+"""]]
diff --git a/doc/bugs/tahoe_remote_has_no_repair.mdwn b/doc/bugs/tahoe_remote_has_no_repair.mdwn
new file mode 100644
index 000000000..1f34767a8
--- /dev/null
+++ b/doc/bugs/tahoe_remote_has_no_repair.mdwn
@@ -0,0 +1,27 @@
+### Please describe the problem.
+
+The tahoe-lafs remote has no built-in way to perform the repair operation.
+This results to data loss if expiration is enabled on the Tahoe grid.
+
+For the current tahoe-lafs release (1.10.0), the only way storage space is freed
+is via garbage collection. Garbage collection removes shares whose lease has expired.
+Data loss will occur if leases are not periodically renewed via
+"tahoe repair --add-lease WRITECAP".
+
+The current implementation of the Tahoe remote in git-annex does not offer a way to
+run lease renewal, and cannot be used on grids where GC is enabled. (GC is not enabled
+in the default configuration, but on private grids it is a sensible option.)
+
+One way renewal could be made easier to do is to add the uploaded files to a directory
+in Tahoe, so that the leases could be easily updated if the directory writecap is known,
+without needing to go through the full list of writecaps for each file stored.
+
+### What steps will reproduce the problem?
+
+1. Use tahoe remote on a tahoe grid where GC is enabled.
+
+2. After GC expiration period, data loss ensues.
+
+### What version of git-annex are you using? On what operating system?
+
+Seems to affect current git master (as of 2014-08-24).
diff --git a/doc/bugs/too_many_open_files_on_OSX.mdwn b/doc/bugs/too_many_open_files_on_OSX.mdwn
new file mode 100644
index 000000000..2ca89fcf0
--- /dev/null
+++ b/doc/bugs/too_many_open_files_on_OSX.mdwn
@@ -0,0 +1,42 @@
+### Please describe the problem.
+
+error message:
+
+ copy somefile.jpg (checking myserver...) (to myserver...)
+ git-annex: runInteractiveProcess: pipe: Too many open files
+
+ rsync failed -- run git annex again to resume file transfer
+ failed
+
+
+### What steps will reproduce the problem?
+
+1. Start a `git annex copy` with lots of files in the queue.
+2. Start a second `git annex copy` on the same set of files.
+The intention is to minimize the amount of silent time on the wire due to administrative work between actual file transfers. These two processes will trip over each other and see that transfer X is already going, and skip to the next file Y, so in the end they upload about half of the files each.
+
+3. Expect all files to be uploaded. Actually observe the above error message for at least one of the processes.
+
+### What version of git-annex are you using? On what operating system?
+
+ git-annex version: 5.20140420-ga25b8bb
+ build flags: Assistant Webapp Webapp-secure Pairing Testsuite S3 WebDAV FsEvents XMPP DNS Feeds Quvi TDFA CryptoHash
+ key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E SHA256 SHA1 SHA512 SHA224 SHA384 SKEIN256 SKEIN512 WORM URL
+ remote types: git gcrypt S3 bup directory rsync web webdav tahoe glacier hook external
+
+ Darwin mymacbook 13.3.0 Darwin Kernel Version 13.3.0: Tue Jun 3 21:27:35 PDT 2014; root:xnu-2422.110.17~1/RELEASE_X86_64 x86_64
+
+### Please provide any additional information below.
+
+[[!format sh """
+lsof -p <my annex process>
+
+... some .app/** files, tty etc ...
+... some unnamed pipes ...
+.../.git/annex/ssh/myserver.lock
+.../.git/annex/transfer/upload/b4d67c4f-8cca-423c-9363-f3063b7fe3e4/lck.SHA256E-s10448418--4f61fab4... ~200 different files.
+"""]]
+
+> Thanks for a very clear bug report! Was easy from that to find
+> where the lock file was not being closed in this situation.
+> [[fixed|done]] --[[Joey]]
diff --git a/doc/bugs/too_many_open_files_on_OSX/comment_1_ef23a3c05a6bd187450e10c524d2ced9._comment b/doc/bugs/too_many_open_files_on_OSX/comment_1_ef23a3c05a6bd187450e10c524d2ced9._comment
new file mode 100644
index 000000000..d7efcb2b1
--- /dev/null
+++ b/doc/bugs/too_many_open_files_on_OSX/comment_1_ef23a3c05a6bd187450e10c524d2ced9._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="http://id.clacke.se/"
+ nickname="Claes"
+ subject="5.20140830"
+ date="2014-09-07T19:24:49Z"
+ content="""
+Will verify if this is still valid for 5.20140830.
+"""]]
diff --git a/doc/bugs/too_many_open_files_on_OSX/comment_2_798a02e42bfce56c50c9337a8111a57f._comment b/doc/bugs/too_many_open_files_on_OSX/comment_2_798a02e42bfce56c50c9337a8111a57f._comment
new file mode 100644
index 000000000..25b6692dc
--- /dev/null
+++ b/doc/bugs/too_many_open_files_on_OSX/comment_2_798a02e42bfce56c50c9337a8111a57f._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="http://id.clacke.se/"
+ nickname="Claes"
+ subject="yep"
+ date="2014-09-07T19:42:04Z"
+ content="""
+Still valid for `git-annex version: 5.20140830-g3c96b79`
+"""]]
diff --git a/doc/bugs/vicfg_and_description_often_not_propagated.mdwn b/doc/bugs/vicfg_and_description_often_not_propagated.mdwn
new file mode 100644
index 000000000..d42ba43a9
--- /dev/null
+++ b/doc/bugs/vicfg_and_description_often_not_propagated.mdwn
@@ -0,0 +1,152 @@
+### Please describe the problem.
+
+I can change the settings in one repo and sync it everywhere. Just to be surprised that one repo starts syncing to the transfer, every time it turns out that this repo lost its vicfg settings. Especially the Repository preferred contents are all back on standard. It was even once that it had the current settings and after the change and sync it goes back to some older state instead of the new one.
+
+### What steps will reproduce the problem?
+
+Well that is very hard. I have 8 repos and it happens randomly to some of them. I recreated all of them recently because I thought they are corrupt, that didn't help, just took me one week of time. It is also very hard to find a way to reproduce this because every vicfg causes a merge which takes minutes to hours.
+
+### What version of git-annex are you using? On what operating system?
+
+Linux: git-annex version: 5.20140412ubuntu1
+
+Mac OS: git-annex version: 5.20140717
+
+### Please provide any additional information below.
+
+Layout:
+
+transfer on rsync.net, conntented to that:
+
+ - Two OS X Clients
+
+ - Two Linux Archives
+
+My settings:
+
+
+
+[[!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 configuration
+#
+# Changes saved to this file will be recorded in the git-annex branch.
+#
+# Lines in this file have the format:
+# setting field = value
+
+# Repository trust configuration
+# (Valid trust levels: trusted semitrusted untrusted dead)
+# (for Music bei Pirmin)
+trust 0734498b-817c-419f-a0c0-660854dc7cbe = trusted
+# (for Music bei Jean (Willikins) [willikins])
+trust 20e9d2e5-9563-4507-82d5-bf8e23be29a5 = trusted
+# (for Music bei Jean (Willikins Clone))
+trust 6e3431e9-8ec2-404a-9c35-b967db63147d = trusted
+# (for Music bei Jean (Watson))
+trust a6febfa0-9fe5-4a65-95bb-dc255d87c2e2 = trusted
+# (for )
+trust dafe9a64-2480-40e2-9688-9f783577ef72 = dead
+# (for web)
+#trust 00000000-0000-0000-0000-000000000001 = semitrusted
+# (for music transfer via rsync.net [music_rsync])
+#trust 83c42610-42ad-459d-92a4-1aca2dfb97e1 = semitrusted
+
+# Repository groups
+# (Standard groups: client transfer backup incrementalbackup smallarchive archive source manual public unwanted)
+# (Separate group names with spaces)
+# (for Music bei Jean (Willikins) [willikins])
+group 20e9d2e5-9563-4507-82d5-bf8e23be29a5 = archive
+# (for Music bei Jean (Willikins Clone))
+group 6e3431e9-8ec2-404a-9c35-b967db63147d = archive
+# (for )
+group 26d38f31-cb6c-412c-84ef-597d7959a680 = backup
+# (for Music bei Pirmin)
+group 0734498b-817c-419f-a0c0-660854dc7cbe = client
+# (for Music bei Jean (Watson))
+group a6febfa0-9fe5-4a65-95bb-dc255d87c2e2 = client
+# (for music transfer via rsync.net [music_rsync])
+group 83c42610-42ad-459d-92a4-1aca2dfb97e1 = transfer
+# (for )
+group dafe9a64-2480-40e2-9688-9f783577ef72 = unwanted
+# (for web)
+#group 00000000-0000-0000-0000-000000000001 =
+
+# Repository preferred contents
+# (Set to "standard" to use a repository's group's preferred contents)
+# (for Music bei Jean (Willikins) [willikins])
+wanted 20e9d2e5-9563-4507-82d5-bf8e23be29a5 = (not (copies=archive:2 or copies=smallarchive:2)) or approxlackingcopies=2
+# (for Music bei Jean (Willikins Clone))
+wanted 6e3431e9-8ec2-404a-9c35-b967db63147d = (not (copies=archive:2 or copies=smallarchive:2)) or approxlackingcopies=2
+# (for music transfer via rsync.net [music_rsync])
+wanted 83c42610-42ad-459d-92a4-1aca2dfb97e1 = not (inallgroup=client and copies=archive:2 and copies=client:2) and ((((exclude=*/archive/* and exclude=archive/*) or (not (copies=archive:1 or copies=smallarchive:1))) and not unused) or approxlackingcopies=1)
+# (for Music bei Pirmin)
+wanted 0734498b-817c-419f-a0c0-660854dc7cbe = standard
+# (for )
+wanted 26d38f31-cb6c-412c-84ef-597d7959a680 = standard
+# (for )
+wanted dafe9a64-2480-40e2-9688-9f783577ef72 = standard
+# (for web)
+#wanted 00000000-0000-0000-0000-000000000001 =
+# (for Music bei Jean (Watson))
+wanted a6febfa0-9fe5-4a65-95bb-dc255d87c2e2 = standard
+
+# Group preferred contents
+# (Used by repositories with "groupwanted" in their preferred contents)
+#groupwanted archive =
+#groupwanted backup =
+#groupwanted client =
+#groupwanted incrementalbackup =
+#groupwanted manual =
+#groupwanted public =
+#groupwanted smallarchive =
+#groupwanted source =
+#groupwanted transfer =
+#groupwanted unwanted =
+
+# Standard preferred contents
+# (Used by wanted or groupwanted expressions containing "standard")
+# (For reference only; built-in and cannot be changed!)
+# standard client = (((exclude=*/archive/* and exclude=archive/*) or (not (copies=archive:1 or copies=smallarchive:1))) and not unused) or approxlackingcopies=1
+# standard transfer = (not (inallgroup=client and copies=client:2) and ((((exclude=*/archive/* and exclude=archive/*) or (not (copies=archive:1 or copies=smallarchive:1))) and not unused) or approxlackingcopies=1)) or approxlackingcopies=1
+# standard backup = include=* or unused
+# standard incrementalbackup = ((include=* or unused) and (not copies=incrementalbackup:1)) or approxlackingcopies=1
+# standard smallarchive = ((include=*/archive/* or include=archive/*) and ((not (copies=archive:1 or copies=smallarchive:1)) or approxlackingcopies=1)) or approxlackingcopies=1
+# standard archive = (not (copies=archive:1 or copies=smallarchive:1)) or approxlackingcopies=1
+# standard source = not (copies=1)
+# standard manual = present and ((((exclude=*/archive/* and exclude=archive/*) or (not (copies=archive:1 or copies=smallarchive:1))) and not unused) or approxlackingcopies=1)
+# standard public = inpreferreddir
+# standard unwanted = exclude=*
+
+# Repository required contents
+# (for web)
+#required 00000000-0000-0000-0000-000000000001 =
+# (for Music bei Pirmin)
+#required 0734498b-817c-419f-a0c0-660854dc7cbe =
+# (for Music bei Jean (Willikins) [willikins])
+#required 20e9d2e5-9563-4507-82d5-bf8e23be29a5 =
+# (for Music bei Jean (Willikins Clone))
+#required 6e3431e9-8ec2-404a-9c35-b967db63147d =
+# (for music transfer via rsync.net [music_rsync])
+#required 83c42610-42ad-459d-92a4-1aca2dfb97e1 =
+# (for Music bei Jean (Watson))
+#required a6febfa0-9fe5-4a65-95bb-dc255d87c2e2 =
+
+# Scheduled activities
+# (Separate multiple activities with "; ")
+# (for web)
+#schedule 00000000-0000-0000-0000-000000000001 =
+# (for Music bei Pirmin)
+#schedule 0734498b-817c-419f-a0c0-660854dc7cbe =
+# (for Music bei Jean (Willikins) [willikins])
+#schedule 20e9d2e5-9563-4507-82d5-bf8e23be29a5 =
+# (for Music bei Jean (Willikins Clone))
+#schedule 6e3431e9-8ec2-404a-9c35-b967db63147d =
+# (for music transfer via rsync.net [music_rsync])
+#schedule 83c42610-42ad-459d-92a4-1aca2dfb97e1 =
+# (for Music bei Jean (Watson))
+#schedule a6febfa0-9fe5-4a65-95bb-dc255d87c2e2 =
+# End of transcript or log.
+"""]]
diff --git a/doc/bugs/vicfg_and_description_often_not_propagated/comment_1_60c5ba2de0c8b9b4538a4abd146007f6._comment b/doc/bugs/vicfg_and_description_often_not_propagated/comment_1_60c5ba2de0c8b9b4538a4abd146007f6._comment
new file mode 100644
index 000000000..47c2de6f1
--- /dev/null
+++ b/doc/bugs/vicfg_and_description_often_not_propagated/comment_1_60c5ba2de0c8b9b4538a4abd146007f6._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ ip="209.250.56.132"
+ subject="comment 1"
+ date="2014-09-11T18:11:43Z"
+ content="""
+vicfg makes changes to files in the git-annex branch, so you can use regular git commands to examine those changes, and look through the history to find any changes that are contrary to the settings you want, and see when and where they were committed. That should provide a strong pointer to what is causing this to happen.
+"""]]
diff --git a/doc/bugs/webapp_missing_on_redhat.mdwn b/doc/bugs/webapp_missing_on_redhat.mdwn
new file mode 100644
index 000000000..ad2578b4f
--- /dev/null
+++ b/doc/bugs/webapp_missing_on_redhat.mdwn
@@ -0,0 +1,21 @@
+### Please describe the problem.
+I am unable to run the webapp on redhat6.5
+
+### What steps will reproduce the problem?
+yum install git-annex
+
+### What version of git-annex are you using? On what operating system?
+I am using git-annex version 3.20120523 and on redhat 6.5
+
+### Please provide any additional information below.
+I am seeing the following error when running git annex webapp:
+
+git-annex: unknown command webapp
+
+> git-annex can be built without the webapp, and this is
+> often done if a distribution does not have the full haskell stack
+> packaged yet. The solution is to contact the distribution and let them
+> know they need to improve it, and/or use the standalone build from this
+> website.
+>
+> So, please file a bug on redhat. [[done]] --[[Joey]]
diff --git a/doc/bugs/webapp_on_windows_7_64_bit_fail_to_add_server_repo.mdwn b/doc/bugs/webapp_on_windows_7_64_bit_fail_to_add_server_repo.mdwn
new file mode 100644
index 000000000..c076dfc54
--- /dev/null
+++ b/doc/bugs/webapp_on_windows_7_64_bit_fail_to_add_server_repo.mdwn
@@ -0,0 +1,76 @@
+### Please describe the problem.
+Cant add Server repo
+
+### What steps will reproduce the problem?
+install linux prebuild torball on server (readynas pro 600)
+un-tar and run with ./git-annex
+(git-annex test pass without error)
+install windows client on win7 64 bit and start webapp
+try add server repo as second repo will led to an internal server error about gpg
+
+followed the assistend video
+### What version of git-annex are you using? On what operating system?
+Readynas (Linux):
+annex@readynas-pro:~/git-annex.linux$ ./git-annex version
+git-annex version: 5.20140831-g62e6ad8
+build flags: Assistant Webapp Webapp-secure Pairing Testsuite S3 WebDAV Inotify DBus DesktopNotify XMPP DNS Feeds Quvi TDFA CryptoHash
+key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E SHA256 SHA1 SHA512 SHA224 SHA384 SKEIN256 SKEIN512 WORM URL
+remote types: git gcrypt S3 bup directory rsync web webdav tahoe glacier ddar hook external
+
+Windows:
+Version: 5.20140914-gb169612
+Build flags: Assistant Webapp Webapp-secure Pairing Testsuite S3 WebDAV DNS Feeds Quvi TDFA CryptoHash
+
+Git on Windows:
+C:\Users\Xaver>git --version
+git version 1.9.4.msysgit.1
+
+GPG on Windows:
+C:\Users\Xaver>gpg --version
+gpg (GnuPG) 2.0.26 (Gpg4win 2.2.2)
+libgcrypt 1.6.1
+Copyright (C) 2013 Free Software Foundation, Inc.
+License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
+This is free software: you are free to change and redistribute it.
+There is NO WARRANTY, to the extent permitted by law.
+
+Home: C:/Users/Xaver/AppData/Roaming/gnupg
+Unterstützte Verfahren:
+Öff. Schlüssel: RSA, ELG, DSA
+Verschlü.: IDEA, 3DES, CAST5, BLOWFISH, AES, AES192, AES256, TWOFISH,
+ CAMELLIA128, CAMELLIA192, CAMELLIA256
+Hash: MD5, SHA1, RIPEMD160, SHA256, SHA384, SHA512, SHA224
+Komprimierung: nicht komprimiert, ZIP, ZLIB, BZIP2
+### Please provide any additional information below.
+Internal Server Error
+user error (gpg ["--quiet","--trust-model","always","--with-colons","--list-secret-keys","--fixed-list-mode"] exited 2)
+
+gpg: fatal: can't create directory `/home/Xaver/.gnupg': No such file or directory
+
+makes no sense on windows machine
+
+must be like "C:\Users\Xaver\AppData\Roaming\gnupg" or %Username%\AppData\Roaming\gnupg I guess.
+
+gpg itself works fine I use it with thunderbird
+
+[[!format sh """
+# If you can, paste a complete transcript of the problem occurring here.
+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log
+gpg: WARNING: using insecure memory!
+gpg: please see http://www.gnupg.org/documentation/faqs.html for more information
+gpg: fatal: can't create directory `/home/Xaver/.gnupg': No such file or directory
+secmem usage: 0/0 bytes in 0/0 blocks of pool 0/65536
+14/Sep/2014:23:17:08 +0200 [Error#yesod-core] user error (gpg ["--quiet","--trust-model","always","--with-colons","--list-secret-keys","--fixed-list-mode"] exited 2) @(yesod-core-1.2.19:Yesod.Core.Class.Yesod .\Yesod\Core\Class\Yesod.hs:503:5)
+
+# End of transcript or log.
+"""]]
+
+> Thanks for reporting this problem. I've fixed it to not crash when gpg
+> fails to list secret keys.
+>
+> That doesn't fix the problem that the cygnus build of gpg does not find
+> the user's home directory properly. But that's only needed for the
+> encrypted repository (gcrypt) support, which is listed in
+> [[windows_support]] as not yet available for Windows.
+>
+> So, not leaving this bug report open. [[done]] --[[Joey]]
diff --git a/doc/bugs/whereis_does_not_work_in_direct_mode.mdwn b/doc/bugs/whereis_does_not_work_in_direct_mode.mdwn
index 69302b0b1..824c91afd 100644
--- a/doc/bugs/whereis_does_not_work_in_direct_mode.mdwn
+++ b/doc/bugs/whereis_does_not_work_in_direct_mode.mdwn
@@ -1,6 +1,6 @@
### Please describe the problem.
-`git annex whereis` says that there are no copies of any of the files that have been added in repositories running in direct mode.
+`git annex whereis` says that there are no copies of any of the files that have been added in repositories running in direct mode when `annex.alwayscommit` is set to `false`.
In other words, if I add a file from PC1 in direct mode, `whereis` in PC2 will fail. Instead, if I add the same file from PC1 in indirect mode, `whereis` in PC2 will work correctly and will report that the file is present in PC1.
@@ -20,7 +20,10 @@ The following script (available at <https://gist.github.com/gioele/dde462df89edf
set -e ; set -u
export LC_ALL=C
-
+
+# alwayscommit must be set globally to affects whereis and sync
+git config --global annex.alwayscommit false
+
direct=true # set to false to make the problem disappear
h=${h:-localhost}
@@ -84,3 +87,5 @@ echo "Why isn't location info available even after sync? (press Enter)"
### What version of git-annex are you using? On what operating system?
git-annex version: 5.20140716-g8c14ba8
+
+> [[fixed|done]] --[[Joey]]
diff --git a/doc/bugs/whereis_does_not_work_in_direct_mode/comment_5_00926da970a20de67ba7719610f17142._comment b/doc/bugs/whereis_does_not_work_in_direct_mode/comment_5_00926da970a20de67ba7719610f17142._comment
new file mode 100644
index 000000000..5873167be
--- /dev/null
+++ b/doc/bugs/whereis_does_not_work_in_direct_mode/comment_5_00926da970a20de67ba7719610f17142._comment
@@ -0,0 +1,12 @@
+[[!comment format=mdwn
+ username="http://svario.it/gioele"
+ nickname="gioele"
+ subject="comment 5"
+ date="2014-08-31T10:15:30Z"
+ content="""
+I have found out that there is a connection between this problem and the _global_ configuration of `annex.alwayscommit`. This problem will appear only if `annex.alwayscommit` is globally set to `false`. What is very strange is that setting `annex.alwayscommit` locally does not make this bug appear; only a globally set `annex.alwayscommit` will trigger this problem.
+
+I fixed the test script to set `annex.alwayscommit` globally.
+
+Now I see why I could reproduce this bug on different machines but Joey could not: all my machines have the same `~/.gitconfig`.
+"""]]
diff --git a/doc/bugs/whereis_does_not_work_in_direct_mode/comment_6_7f68d9daa542f992c61b7b7c36819933._comment b/doc/bugs/whereis_does_not_work_in_direct_mode/comment_6_7f68d9daa542f992c61b7b7c36819933._comment
new file mode 100644
index 000000000..7f5fa824e
--- /dev/null
+++ b/doc/bugs/whereis_does_not_work_in_direct_mode/comment_6_7f68d9daa542f992c61b7b7c36819933._comment
@@ -0,0 +1,49 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ ip="209.250.56.132"
+ subject="comment 6"
+ date="2014-09-11T18:34:02Z"
+ content="""
+It looks like there might be some minor inconsistency in when git-annex syncs when in indirect mode vs direct mode. This results in the location tracking information not being committed until after the git-annex sync in the pc1/Docs repository has pushed the git-annex branch to origin. Since that is the only
+time that pc1/Docs syncs with origin, the location tracking info never reaches origin, and the rest of the behavior follows.
+
+Here is the direct mode sync, showing the git-annex branch commit occurring after the push. Specifically, when the sync merges the git-annex branch, it also commits any deferred changes at that point:
+
+<pre>
+commit ok
+pull origin
+ok
+push origin
+Counting objects: 6, done.
+Delta compression using up to 4 threads.
+Compressing objects: 100% (5/5), done.
+Writing objects: 100% (6/6), 574 bytes | 0 bytes/s, done.
+Total 6 (delta 0), reused 0 (delta 0)
+To localhost:/tmp/annex/Docs.git
+ * [new branch] git-annex -> synced/git-annex
+ * [new branch] annex/direct/master -> synced/master
+ok
+(Recording state in git...)
+</pre>
+
+And here is the indirect mode sync, showing a \"commit\" which includes committing deferred changes to the git-annex branch:
+
+<pre>
+commit (Recording state in git...)
+ok
+pull origin
+ok
+push origin
+Counting objects: 15, done.
+Delta compression using up to 4 threads.
+Compressing objects: 100% (12/12), done.
+Writing objects: 100% (15/15), 1.32 KiB | 0 bytes/s, done.
+Total 15 (delta 0), reused 0 (delta 0)
+To localhost:/tmp/annex/Docs.git
+ * [new branch] git-annex -> synced/git-annex
+ * [new branch] master -> synced/master
+ok
+</pre>
+
+It seems that [[!commit 2cfda59174b9cbc02e87c069982096d44601cd40]] and some subsequent changes accidentially removed the Annex.Branch.commit from the direct mode code path within the first part of `sync`. So, easily fixed.
+"""]]
diff --git a/doc/builds.mdwn b/doc/builds.mdwn
index b920643b5..87f12c998 100644
--- a/doc/builds.mdwn
+++ b/doc/builds.mdwn
@@ -40,5 +40,8 @@
<h2>OSX Mavericks</h2>
<iframe width=1024 scrolling=no frameborder=0 marginheight=0 marginwidth=0 src="https://downloads.kitenet.net/git-annex/autobuild/x86_64-apple-mavericks/">
</iframe>
-<h2>Windows</h2>
+<h2><a href="https://qa.nest-initiative.org/view/msysGit/job/msysgit-git-annex-assistant-test/">Windows</a></h2>
<a href="https://qa.nest-initiative.org/view/msysGit/job/msysgit-git-annex-assistant-test/">here</a>
+<h2><a href="https://buildd.debian.org/status/package.php?p=git-annex&suite=sid">Debian</a></h2>
+<iframe width=1024 scrolling=no height=500px frameborder=0 marginheight=0 marginwidth=0 src="https://buildd.debian.org/status/package.php?p=git-annex&suite=sid">
+</iframe>
diff --git a/doc/contribute.mdwn b/doc/contribute.mdwn
index 71bce6c54..bc087348d 100644
--- a/doc/contribute.mdwn
+++ b/doc/contribute.mdwn
@@ -24,7 +24,8 @@ you'll make Joey more productive!
## code contributions
-[[download]] the source code and send patches!
+[[download]] the source code, [[build|install/fromsource]] it
+and send patches!
If you know Haskell, git-annex has lots of Haskell code that
could be improved. See the [[coding_style]] and have at it.
diff --git a/doc/design/assistant/blog/day_232__headless_webapp/comment_5_7e51a197ff9970ae50cf47bd3a922257._comment b/doc/design/assistant/blog/day_232__headless_webapp/comment_5_7e51a197ff9970ae50cf47bd3a922257._comment
new file mode 100644
index 000000000..de4be2556
--- /dev/null
+++ b/doc/design/assistant/blog/day_232__headless_webapp/comment_5_7e51a197ff9970ae50cf47bd3a922257._comment
@@ -0,0 +1,18 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ ip="209.250.56.22"
+ subject="comment 5"
+ date="2014-09-16T18:36:18Z"
+ content="""
+Note that --listen=address:port had to be removed.
+
+OTOH, the webapp can be run with a https certificate now, which makes remote access much more secure.
+
+The webapp will use HTTPS if it finds
+a .git/annex/privkey.pem and .git/annex/certificate.pem. Here's
+one way to generate those files, using a self-signed certificate:
+
+ openssl genrsa -out .git/annex/privkey.pem 4096
+ openssl req -new -x509 -key .git/annex/privkey.pem > .git/annex/certificate.pem
+
+"""]]
diff --git a/doc/design/assistant/polls/Android_default_directory.mdwn b/doc/design/assistant/polls/Android_default_directory.mdwn
index 52bd892bf..6060dd64c 100644
--- a/doc/design/assistant/polls/Android_default_directory.mdwn
+++ b/doc/design/assistant/polls/Android_default_directory.mdwn
@@ -4,4 +4,4 @@ Same as the desktop webapp, users will be able to enter a directory they
want the first time they run it, but to save typing on android, anything
that gets enough votes will be included in a list of choices as well.
-[[!poll open=yes expandable=yes 68 "/sdcard/annex" 6 "Whole /sdcard" 7 "DCIM directory (photos and videos only)" 2 "Same as for regular git-annex. ~/annex/"]]
+[[!poll open=yes expandable=yes 69 "/sdcard/annex" 6 "Whole /sdcard" 7 "DCIM directory (photos and videos only)" 2 "Same as for regular git-annex. ~/annex/"]]
diff --git a/doc/design/metadata.mdwn b/doc/design/metadata.mdwn
index 10e79b9f8..9da0a3626 100644
--- a/doc/design/metadata.mdwn
+++ b/doc/design/metadata.mdwn
@@ -53,7 +53,7 @@ once, and can be left alone when refining a view.
## automatically added metadata
-When annex.genmetadata is set, git annex add automatically attaches
+When `annex.genmetadata` is set, git annex add automatically attaches
some metadata to a file. Currently year and month fields, from its mtime.
There's also a post-commit-annex hook script.
diff --git a/doc/design/roadmap.mdwn b/doc/design/roadmap.mdwn
index 7a3fa06fe..b6af4db30 100644
--- a/doc/design/roadmap.mdwn
+++ b/doc/design/roadmap.mdwn
@@ -1,6 +1,6 @@
## roadmap
-Now in the
+Just finished the
[sustaining git-annex development](https://campaign.joeyh.name/) year
(starting September 2013).
@@ -15,7 +15,7 @@ Now in the
* Month 9 Brazil!, [[!traillink assistant/sshpassword]]
* Month 10 polish [[assistant/Windows]] port
* Month 11 [[!traillink assistant/chunks]]
-* **Month 12** user-driven features and polishing
+* Month 12 user-driven features and polishing
Deferred until later:
diff --git a/doc/devblog/day_216__various_minor_bugs/comment_2_6b06b3f46f20a6d2e60684d1d59fca07._comment b/doc/devblog/day_216__various_minor_bugs/comment_2_6b06b3f46f20a6d2e60684d1d59fca07._comment
new file mode 100644
index 000000000..559689bb7
--- /dev/null
+++ b/doc/devblog/day_216__various_minor_bugs/comment_2_6b06b3f46f20a6d2e60684d1d59fca07._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ ip="209.250.56.7"
+ subject="comment 2"
+ date="2014-08-15T19:45:28Z"
+ content="""
+That was a typo. Of course, spaces are no problem. Newlines in filenames, on the other hand..
+"""]]
diff --git a/doc/devblog/day_216__various_minor_bugs/comment_3_05177e2ed414d22711dcec57a614e38c._comment b/doc/devblog/day_216__various_minor_bugs/comment_3_05177e2ed414d22711dcec57a614e38c._comment
new file mode 100644
index 000000000..4b3f0248a
--- /dev/null
+++ b/doc/devblog/day_216__various_minor_bugs/comment_3_05177e2ed414d22711dcec57a614e38c._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="EskildHustvedt"
+ ip="80.202.103.55"
+ subject="comment 3"
+ date="2014-08-16T15:22:35Z"
+ content="""
+Ah, well then, that sounds a lot more reasonable. Though legal, I have yet to hear of a sane reason for using newlines in filenames.
+"""]]
diff --git a/doc/devblog/day_217__autobuilders.mdwn b/doc/devblog/day_217__autobuilders.mdwn
new file mode 100644
index 000000000..2a58e0c63
--- /dev/null
+++ b/doc/devblog/day_217__autobuilders.mdwn
@@ -0,0 +1,10 @@
+Over the past couple days, got the arm autobuilder working again. It had
+been down since June with several problems. cabal install tended to crash;
+apparenty this has something to do with threading in user-mode qemu,
+because -j1 avoids that. And strange invalid character problems were fixed
+by downgrading file-embed. Also, with Yury's help I got the Windows
+autobuilder upgraded to the new Haskell Platform and working again.
+
+Today a last few finishing touches, including getting rid of the last
+dependency on the old haskell HTTP library, since http-conduit is being
+used now. Ready for the release!
diff --git a/doc/devblog/day_218__scary_locking.mdwn b/doc/devblog/day_218__scary_locking.mdwn
new file mode 100644
index 000000000..81afb263b
--- /dev/null
+++ b/doc/devblog/day_218__scary_locking.mdwn
@@ -0,0 +1,24 @@
+Plan is to be on vacation and/or low activity this week before DebConf.
+However, today I got involved in fixing a bug that caused the assistant to
+keep files open after syncing with repositories on removable media.
+
+Part of that bug involved lock files not being opend close-on-exec, and
+while fixing that I noticed again that the locking code was scattered all
+around and rather repetitive. That led to a lot of refactoring, which is
+always fun when it involves scary locking code. Thanks goodness for
+referential transparency.
+
+Now there's a Utility.LockFile that works on both POSIX and Windows.
+Howver, that module actually exports very different functions for the two.
+While it might be tempting to try to do a portability layer, the
+two locking models are really very different, and there are lots of gotchas
+such a portability layer would face. The only API that's completely the
+same between the two is dropLock.
+
+This refactoring process and the cleaner, more expressive
+code it led to helped me spot a couple of bugs involving locking. See
+[[!commit e386e26ef207db742da6d406183ab851571047ff]]
+and [[!commit 0a4d301051e4933661b7b0a0791afa95bfe9a1d3]]
+Neither bug has ever seemed to cause
+a problem, but it's nice to be able to spot and fix such bugs before they
+do.
diff --git a/doc/devblog/day_219__catching_up_and_looking_back.mdwn b/doc/devblog/day_219__catching_up_and_looking_back.mdwn
new file mode 100644
index 000000000..8d82d8cb9
--- /dev/null
+++ b/doc/devblog/day_219__catching_up_and_looking_back.mdwn
@@ -0,0 +1,109 @@
+Yesterday and today were the first good solid days working on git-annex in a
+while. There's a big backlog, currently of 133 messages, so I have been
+concentrating on bug reports first. Happily, not many new bugs have been
+reported lately, and I've made good progress on them, fixing 5 bugs today,
+including a file descriptor leak.
+
+## catching up
+
+In this end of summer rush, I've been too busy to blog for the past 20 days,
+but not entirely too busy to work on git-annex. Two releases have been made
+in that time, and a fair amount of improvements worked on.
+
+Including a new feature: When a local git repository is cloned with `git
+clone --shared`, git-annex detects this and defaults to a special mode
+where file contents get hard linked into the clone. It also makes the cloned
+repository be untrusted, to avoid confusing numcopies counting with the
+hard links. This can be useful for temporary working repositories without
+the overhead of lots of copies of files.
+
+## looking back
+
+I want to look back further, over the crowdfunded year of work covered
+by this devblog. There were a lot of things I wanted to accomplish this
+past year, and I managed to get to most of them. As well as a few surprises.
+
+* Windows support improved more than I guessed in my wildest dreams.
+ git-annex went from working not too well on the command line to
+ being pretty solid there, as well as having a working
+ and almost polished webapp on Windows.
+ There are still warts -- it's Windows after all!
+
+* Android didn't get many improvements. Most of the time I had budgeted to
+ Android porting ended up being used on Windows porting instead. I did,
+ however, get the Android build environment cleaned up a lot from the initial
+ hacked together one, and generally kept it building and working on Android.
+
+* The [direct mode guard](http://git-annex.branchable.com/devblog/day_48__direct_mode_guard_design/)
+ was not planned, but the need for it became clear, and
+ it's dramatically reduced the amount of command-line foot-shooting
+ that goes on in direct mode.
+
+* Repository repair was planned, and I've very proud of [git-repair](http://git-repair.branchable.com/).
+ Also pleased with the webapp's UI for scheduling repository consistency
+ checks.
+ Always room for improvement in this kind of thing, but this brings a new
+ capability to both git and git-annex.
+
+* The [[external_special_remote_interface|special_remotes/external]] came
+ together beautifully. External special remotes are now just as well
+ supported as built-in ones, except the webapp cannot be used to configure
+ them.
+
+* Using git-remote-gcrypt for fully encrypted git repositories, including
+ support in the webapp for setting them (and gpg keys if necessary),
+ happened. Still needs testing/more use/improvements. Avoided doing
+ much in the area of gpg key management, which is probably good to avoid when
+ possible, but is probably needed to make this a really suitable option for
+ end users.
+
+* Telehash is still being built, and it's not clear if they've gotten it
+ to work at all yet. The v2 telehash has recently been superseded by a
+ a new v3. So I am not pleased that I didn't get git-annex working with
+ telehash, but it was outside my control. This is a problem that needs to get
+ solved outside git-annex first, either by telehash or something else.
+ The plan is to keep an eye on everything in this space, including for example,
+ Maidsafe.
+
+* In the meantime, the new notifychanges support in git-annex-shell
+ makes XMPP/telehash/whatever unnecessary in a lot of configurations.
+ git-annex's remotedaemon architecture supports that and is designed
+ to support other notification methods later. And the webapp has a lot of
+ improvements in the area of setting up ssh remotes, so fewer users will
+ be stuck with XMPP.
+
+* I didn't quite get to [[design/assistant/deltas]], but the final month
+ of work on chunking provides a lot of new features and hopefully a
+ foundation that will get to deltas eventually. There is a new haskell
+ library that's being developed with the goal of being used for git-annex
+ deltas.
+
+* I hadn't planned to make git-annex be able to upgrade itself, when installed
+ from this website. But there was a need for that, and so it happened.
+ Even got a gpg key trust path for the distribution of git-annex.
+
+* Metadata driven views was an entirely unplanned feature. The current
+ prototype is very exciting, it opens up entire new use cases.
+ I had to hold myself back to not work on it too much,
+ especially as it shaded into adding a caching database to git-annex.
+ Had too much other stuff planned to do all I wanted.
+ Clearly this is an area I want to spend more time on!
+
+Those are most of the big features and changes, but probably half
+of my work on git-annex this past year was in smaller things, and general
+maintenance. Lots of others have contributed, some with
+code (like the large effort to switch to bootstrap3),
+and others with documentation, bug reports, etc.
+
+Perhaps it's best to turn to `git diff --stat` to sum up the activity
+and see just how much both the crowdfunding campaign and
+the previous kickstarter have pushed git-annex into high gear:
+
+ campaign: 5410 files changed, 124159 insertions(+), 79395 deletions(-)
+ kickstarter: 4411 files changed, 123262 insertions(+), 13935 deletions(-)
+ year before: 1281 files changed, 7263 insertions(+), 55831 deletions(-)
+
+What's next? The hope is, no more crowdfunded campaigns where I have
+to promise the moon anytime soon. Instead, the goal is to move to a more
+mature and sustainable funding model, and continue to grow the git-annex
+community, and the spaces where it's useful.
diff --git a/doc/devblog/day_219__catching_up_and_looking_back/comment_1_16b13b2510183a9da5f960ae5765e581._comment b/doc/devblog/day_219__catching_up_and_looking_back/comment_1_16b13b2510183a9da5f960ae5765e581._comment
new file mode 100644
index 000000000..5b839b55c
--- /dev/null
+++ b/doc/devblog/day_219__catching_up_and_looking_back/comment_1_16b13b2510183a9da5f960ae5765e581._comment
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawkRGMQkg9ck_pr47JXZV_C2DJQXrO8LgpI"
+ nickname="Michael"
+ subject="Hard linking on local clone"
+ date="2014-09-13T06:28:01Z"
+ content="""
+Thanks for this feature. It will save a lot of space when working on one-off projects with big scientific datasets.
+
+Unfortunately, there is probably no easy solution to achieve similar savings across file systems. On our shared cluster individual labs have their data in separate ZFS volumes (to ease individual backup handling), but data is often shared (i.e. copied) across volumes when cloning an annex. We need expensive de-duplication on the backup-server to, at least, prevent this kind of waste to hit the backups -- but the master file server still suffers (de-duplication ratio sometimes approaching a factor of 2.0).
+"""]]
diff --git a/doc/devblog/day_219__catching_up_and_looking_back/comment_2_460c064bebb5061fcba2a6c79f039362._comment b/doc/devblog/day_219__catching_up_and_looking_back/comment_2_460c064bebb5061fcba2a6c79f039362._comment
new file mode 100644
index 000000000..a00d33dc6
--- /dev/null
+++ b/doc/devblog/day_219__catching_up_and_looking_back/comment_2_460c064bebb5061fcba2a6c79f039362._comment
@@ -0,0 +1,19 @@
+[[!comment format=mdwn
+ username="https://id.koumbit.net/anarcat"
+ ip="72.0.72.144"
+ subject="comment 2"
+ date="2014-09-14T17:38:34Z"
+ content="""
+thanks so much for your work on git-annex, joeyh. it's hard to imagine that just 4 years ago, we didn't have anything even close to this tool and how far it went since then.
+
+~~~~
+anarcat@marcos:git-annex$ pepper age
+Loading cache index... done
+git-annex is 3 years old
+git-annex's birthday is in about 1 month (October 19th)
+~~~~
+
+birthday is coming soon! :)
+
+it's also quite impressive how much work can be done in a single year with some (fairly minimal) funding to dedicate a full dev on a project. very inspiring - keep up the good work! -- [[anarcat]]
+"""]]
diff --git a/doc/devblog/day_219__catching_up_and_looking_back/comment_3_9699d5a9de5ea64fbc876352e20261c4._comment b/doc/devblog/day_219__catching_up_and_looking_back/comment_3_9699d5a9de5ea64fbc876352e20261c4._comment
new file mode 100644
index 000000000..91fc49409
--- /dev/null
+++ b/doc/devblog/day_219__catching_up_and_looking_back/comment_3_9699d5a9de5ea64fbc876352e20261c4._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="anarcat"
+ ip="70.83.139.100"
+ subject="camlistore"
+ date="2014-09-17T20:18:56Z"
+ content="""
+have you looked at [camlistore](http://camlistore.org/) at all? it's a fairly new project, but it seems like it could be an interesting backend, or at least inspiration for git-annex's design. --[[anarcat]]
+"""]]
diff --git a/doc/devblog/day_219__catching_up_and_looking_back/comment_4_23c4ede3db0ea8165311466881cfa6a2._comment b/doc/devblog/day_219__catching_up_and_looking_back/comment_4_23c4ede3db0ea8165311466881cfa6a2._comment
new file mode 100644
index 000000000..8e24916db
--- /dev/null
+++ b/doc/devblog/day_219__catching_up_and_looking_back/comment_4_23c4ede3db0ea8165311466881cfa6a2._comment
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawmH7o6q2l99M-PQolOfbR3_i5B_jtTIcAE"
+ nickname="Giovanni"
+ subject="Camlistore"
+ date="2014-09-17T20:36:43Z"
+ content="""
+anarcat, have you used it? I tried, but it is buggy. They seem to be at [\"the Archivist\"](http://git-annex.branchable.com/) group of people, but if you don't have a hard drive to store the things, everything breaks up. I paid a lot of money to Amazon because I believed I could use Camlistore to organize data stored at S3, but apparently S3 is \"just for backup\", and if it is your only storage, then Camlistore will keep fetching data over and over \"to index it\" and in the end you pay.
+
+Yes, it keeps working, so you need some server online at all times, with Camlistore running.
+"""]]
diff --git a/doc/devblog/day_219__catching_up_and_looking_back/comment_5_7997305d7ec7db072b78dd0c31ecd824._comment b/doc/devblog/day_219__catching_up_and_looking_back/comment_5_7997305d7ec7db072b78dd0c31ecd824._comment
new file mode 100644
index 000000000..91e4dc5f5
--- /dev/null
+++ b/doc/devblog/day_219__catching_up_and_looking_back/comment_5_7997305d7ec7db072b78dd0c31ecd824._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="anarcat"
+ ip="70.83.139.100"
+ subject="comment 5"
+ date="2014-09-17T20:53:01Z"
+ content="""
+i haven't tried it at all - only looked at [this one demo video](https://www.youtube.com/watch?v=yxSzQIwXM1k) that reminded me of git-annex a lot...
+"""]]
diff --git a/doc/devblog/day_220__working_through_backlog.mdwn b/doc/devblog/day_220__working_through_backlog.mdwn
new file mode 100644
index 000000000..4685e3ff0
--- /dev/null
+++ b/doc/devblog/day_220__working_through_backlog.mdwn
@@ -0,0 +1,14 @@
+Made a release yesterday, which was all bugfixes.
+
+Today, a few more bug fixes. Looked into making the webapp
+create non-bare repositories on removable drives, but before I got too far
+into the code, I noticed [there's a big problem with that idea](http://git-annex.branchable.com/forum/usability:_creating_an_archive_on_a_new_external_drive/).
+
+Rest of day was spent getting caught up on forum posts etc. I'm happy to
+read lots of good answers that have been posted while I've been away.
+Here's an excellent example: <http://git-annex.branchable.com/install/fromsource/#comment-5f8ceb060643ae71cd2adc72f0fca3f0>
+
+That led to rewriting the docs for building git-annex from source.
+New page: [[install/fromsource]].
+
+Backlog is now down to 117.
diff --git a/doc/download.mdwn b/doc/download.mdwn
index 8c6f5b514..46d397fcd 100644
--- a/doc/download.mdwn
+++ b/doc/download.mdwn
@@ -26,13 +26,10 @@ The git repository has some branches:
(merge it into master if you need it)
* `no-bloom` avoids using bloom filters. (merge it into master if you need it)
* `no-s3` avoids using the S3 library (merge it into master if you need it)
-* `debian-stable` contains the latest backport of git-annex to Debian
- stable.
+* `debian-*-backport` contains the latest backport of git-annex.
* `tweak-fetch` adds support for the git tweak-fetch hook, which has
been proposed and implemented but not yet accepted into git.
* `setup` contains configuration for this website
-* `pristine-tar` contains [pristine-tar](http://kitenet.net/~joey/code/pristine-tar)
- data to create tarballs of any past git-annex release.
----
diff --git a/doc/encryption.mdwn b/doc/encryption.mdwn
index 0dac527df..3cbc37ee3 100644
--- a/doc/encryption.mdwn
+++ b/doc/encryption.mdwn
@@ -17,7 +17,7 @@ remote.
You should decide whether to use encryption with a special remote before
any data is stored in it. So, `git annex initremote` requires you
to specify "encryption=none" when first setting up a remote in order
-to disable encryption. To use encryption, you run
+to disable encryption. To use encryption, you run
`git-annex initremote` in one of these ways:
* `git annex initremote newremote type=... encryption=hybrid keyid=KEYID ...`
@@ -29,10 +29,10 @@ to disable encryption. To use encryption, you run
The [[hybrid_key_design|design/encryption]] allows additional
encryption keys to be added on to a special remote later. Due to this
flexibility, it is the default and recommended encryption scheme.
-
+
git annex initremote newremote type=... [encryption=hybrid] keyid=KEYID ...
-Here the KEYID(s) are passed to `gpg` to find encryption keys.
+Here the KEYID(s) are passed to `gpg` to find encryption keys.
Typically, you will say "keyid=2512E3C7" to use a specific gpg key.
Or, you might say "keyid=joey@kitenet.net" to search for matching keys.
@@ -58,8 +58,8 @@ risks associated with encryption.
Alternatively, you can configure git-annex to use a shared cipher to
encrypt data stored in a remote. This shared cipher is stored,
**unencrypted** in the git repository. So it's shared among every
-clone of the git repository.
-
+clone of the git repository.
+
git annex initremote newremote type=... encryption=shared
The advantage is you don't need to set up gpg keys. The disadvantage is
@@ -74,10 +74,10 @@ and since it's exactly the way everyone else uses gpg.
git annex initremote newremote type=.... encryption=pubkey keyid=KEYID ...
-A disavantage is that it is not easy to later add additional public keys
+A disadvantage is that it is not easy to later add additional public keys
to the special remote. While the `enableremote` parameters `keyid+=` and
`keyid-=` can be used, they have **no effect** on files that are already
-present on the remote. Probably the only use for these parameters is
+present on the remote. Probably the only use for these parameters is
to replace a revoked key:
git annex enableremote myremote keyid-=2512E3C7 keyid+=788A3F4C
diff --git a/doc/forum/Attempting_to_repair_fails_with_everincreasing_deltas.mdwn b/doc/forum/Attempting_to_repair_fails_with_everincreasing_deltas.mdwn
new file mode 100644
index 000000000..e71bf040b
--- /dev/null
+++ b/doc/forum/Attempting_to_repair_fails_with_everincreasing_deltas.mdwn
@@ -0,0 +1,21 @@
+Hello,
+
+I am using the latest git-annex with the webui having two local folders (one over nfs) connected as a full backup group.
+
+On every reboot I get a jumping ball icon with the text:
+
+"Attempting to repair [tr2]"
+
+And the later the text:
+
+"failed to sync to tr2"
+
+The debug log is filled with entries like this, where the number of deltas is increasing:
+
+[2014-08-26 20:34:50 CEST] PushRetrier: Syncing with tr2
+fatal: pack has 15 unresolved deltas
+error: unpack failed: index-pack abnormal exit
+To /nfs/backup
+ ! [remote rejected] git-annex -> synced/git-annex (n/a (unpacker error))
+ ! [remote rejected] annex/direct/master -> synced/master (n/a (unpacker error))
+error: failed to push some refs to '/nfs/backup''
diff --git a/doc/forum/Attempting_to_repair_fails_with_everincreasing_deltas/comment_1_a8effe196e4a040630d183803768c5a1._comment b/doc/forum/Attempting_to_repair_fails_with_everincreasing_deltas/comment_1_a8effe196e4a040630d183803768c5a1._comment
new file mode 100644
index 000000000..41f28a0cf
--- /dev/null
+++ b/doc/forum/Attempting_to_repair_fails_with_everincreasing_deltas/comment_1_a8effe196e4a040630d183803768c5a1._comment
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="anders7788"
+ ip="212.247.195.173"
+ subject="comment 1"
+ date="2014-08-27T06:59:08Z"
+ content="""
+My version is:
+
+assistant version 5.20140517.4
+"""]]
diff --git a/doc/forum/Attempting_to_repair_fails_with_everincreasing_deltas/comment_2_9f032e43b132bcad656e1337ab2551ad._comment b/doc/forum/Attempting_to_repair_fails_with_everincreasing_deltas/comment_2_9f032e43b132bcad656e1337ab2551ad._comment
new file mode 100644
index 000000000..c139bd963
--- /dev/null
+++ b/doc/forum/Attempting_to_repair_fails_with_everincreasing_deltas/comment_2_9f032e43b132bcad656e1337ab2551ad._comment
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="anders7788"
+ ip="89.160.15.173"
+ subject="[Solved]"
+ date="2014-09-04T15:47:24Z"
+ content="""
+[Solved]
+
+The following of the steps at: http://git-annex.branchable.com/tips/what_to_do_when_a_repository_is_corrupted/ provided some clues and I discovered that the disk was broken. But a big thanks to git-annex which made it possible to discover this issue early!
+"""]]
diff --git a/doc/forum/Creating_a_more_secure_shared_encryption.mdwn b/doc/forum/Creating_a_more_secure_shared_encryption.mdwn
new file mode 100644
index 000000000..5b2019f37
--- /dev/null
+++ b/doc/forum/Creating_a_more_secure_shared_encryption.mdwn
@@ -0,0 +1,7 @@
+I was wondering if there was a way to make shared encryption more secure. Here is my suggestion:
+The shared repository is encrypted using a key for the whole repository, just the way normal encryption would work.
+The server additionally keeps a copy of every user's public key.
+When a user is authorized, their repository is initialized and they receive the common key, encrypted by their public key.
+The only issue would be storage of the common key, which would have to be restricted to repository on a trusted machine.
+
+Not sure if this would be easy for you to implement, but I figured I'd submit a post detailing it, to see if maybe it was doable.
diff --git a/doc/forum/Git_remote__63_____40__bitbucket__44___github__41__.mdwn b/doc/forum/Git_remote__63_____40__bitbucket__44___github__41__.mdwn
new file mode 100644
index 000000000..245b298ff
--- /dev/null
+++ b/doc/forum/Git_remote__63_____40__bitbucket__44___github__41__.mdwn
@@ -0,0 +1 @@
+Is it possible to use bitbucket as a remote?
diff --git a/doc/forum/Git_remote__63_____40__bitbucket__44___github__41__/comment_1_8a6de753ac0aa56f470b2aefca628388._comment b/doc/forum/Git_remote__63_____40__bitbucket__44___github__41__/comment_1_8a6de753ac0aa56f470b2aefca628388._comment
new file mode 100644
index 000000000..c6c7f6e1c
--- /dev/null
+++ b/doc/forum/Git_remote__63_____40__bitbucket__44___github__41__/comment_1_8a6de753ac0aa56f470b2aefca628388._comment
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ ip="108.236.230.124"
+ subject="comment 1"
+ date="2014-09-18T17:43:44Z"
+ content="""
+You can use any git repository as a git remote in git-annex, since git-annex uses plain old git repos.
+
+You will need to add some kind of [[special_remote|special_remotes]] to hold the content of the files stored in git-annex however.
+"""]]
diff --git a/doc/forum/How_do_I_sync_files_from_mobile_to_a_repo__63__.mdwn b/doc/forum/How_do_I_sync_files_from_mobile_to_a_repo__63__.mdwn
new file mode 100644
index 000000000..d63af388f
--- /dev/null
+++ b/doc/forum/How_do_I_sync_files_from_mobile_to_a_repo__63__.mdwn
@@ -0,0 +1,13 @@
+I have a local repo on a computer with some folder on the path
+/computer1/annex/
+
+Then I tried to run git annex on my phone and added a remote ssh repo syncing to
+/computer1/annex/mobile/ from my mobile's picture folder.
+
+But the files ending up there are:
+ls /computer1/annex/mobile/
+annex branches config description HEAD hooks info objects refs
+
+I chose "full backup"
+
+Why dont I see my pictures there, even if they are hiding in the metadata ?
diff --git a/doc/forum/How_do_I_sync_files_from_mobile_to_a_repo__63__/comment_1_fc914b5998a09943fc8c1917a0e36096._comment b/doc/forum/How_do_I_sync_files_from_mobile_to_a_repo__63__/comment_1_fc914b5998a09943fc8c1917a0e36096._comment
new file mode 100644
index 000000000..ac49670b9
--- /dev/null
+++ b/doc/forum/How_do_I_sync_files_from_mobile_to_a_repo__63__/comment_1_fc914b5998a09943fc8c1917a0e36096._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="Petter_petterson"
+ ip="89.160.15.173"
+ subject="addition"
+ date="2014-09-13T07:54:58Z"
+ content="""
+I understand that the copy of the cellphones' photos are stored on the server too, when typing git annex whereis <photo> I see that it exists on the server, but I need to be able to, at will copy out the jpg files for editing and using in other places.
+"""]]
diff --git a/doc/forum/How_do_I_sync_files_from_mobile_to_a_repo__63__/comment_2_fd5257eff7f94971557c031a94ac2766._comment b/doc/forum/How_do_I_sync_files_from_mobile_to_a_repo__63__/comment_2_fd5257eff7f94971557c031a94ac2766._comment
new file mode 100644
index 000000000..97724fd18
--- /dev/null
+++ b/doc/forum/How_do_I_sync_files_from_mobile_to_a_repo__63__/comment_2_fd5257eff7f94971557c031a94ac2766._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawmBUR4O9mofxVbpb8JV9mEbVfIYv670uJo"
+ nickname="Justin"
+ subject="comment 2"
+ date="2014-09-14T18:57:12Z"
+ content="""
+If `/computer1/annex/` was already an annex repository you should have synced the phone to that, not to a new bare repository at `/computer1/annex/mobile/`
+"""]]
diff --git a/doc/forum/How_do_I_sync_files_from_mobile_to_a_repo__63__/comment_3_5a11c45f92bae1328a5120945bee1fa0._comment b/doc/forum/How_do_I_sync_files_from_mobile_to_a_repo__63__/comment_3_5a11c45f92bae1328a5120945bee1fa0._comment
new file mode 100644
index 000000000..8a9f6cd18
--- /dev/null
+++ b/doc/forum/How_do_I_sync_files_from_mobile_to_a_repo__63__/comment_3_5a11c45f92bae1328a5120945bee1fa0._comment
@@ -0,0 +1,36 @@
+[[!comment format=mdwn
+ username="Petter_petterson"
+ ip="89.160.15.173"
+ subject="comment 3"
+ date="2014-09-16T08:13:59Z"
+ content="""
+Thanks Justin, but that wont work. Even pointing out a normal, non-bare repo and then adding it as a ssh remote will convert it into a bare repo. I confirmed that, and then I read this post:
+
+ http://git-annex.branchable.com/forum/Local_and_remote_in_direct_mode/
+
+that states that
+> The \"Remote server using ssh\" option in the webapp is intended to set up a bare git repository on a server, not a non-bare git repository on a client.\"
+
+I even tried to do
+ git remote add B ssh://machineB:/~/annex
+but to no avail, the created annex on machine B becomes a bare repo.
+
+The only way to do it for me was to do the following,
+Assume my cellphone is device A, and my desktop is device B:
+
+On machine B:
+
+ cd ~/DCIM
+ git init
+ git annex init \"B\"
+ git annex direct
+ echo '*/5 * * * * * cd ~/DCIM; git annex sync' > crontab
+
+On machine A:
+
+ git clone ssh://user@machineB:/home/user/DCIM
+ git annex sync
+ git annex webapp
+
+now pictures are synced to the computer in direct, non-bare format every 5 minutes. I have spent literally days on this and now I finally nailed it in a crude but working fashion.
+"""]]
diff --git a/doc/forum/How_do_I_sync_files_from_mobile_to_a_repo__63__/comment_4_404a8f9daa86c20a046b4c9f9051dfc0._comment b/doc/forum/How_do_I_sync_files_from_mobile_to_a_repo__63__/comment_4_404a8f9daa86c20a046b4c9f9051dfc0._comment
new file mode 100644
index 000000000..cbe73a00b
--- /dev/null
+++ b/doc/forum/How_do_I_sync_files_from_mobile_to_a_repo__63__/comment_4_404a8f9daa86c20a046b4c9f9051dfc0._comment
@@ -0,0 +1,16 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ ip="108.236.230.124"
+ subject="comment 4"
+ date="2014-09-18T18:00:42Z"
+ content="""
+I have double-checked, and when I already have an existing, non-bare repository, pointing the webapp at it over ssh keeps it as a non-bare repository. As I would expect.
+
+> I even tried to do git remote add B ssh://machineB:/~/annex but to no avail, the created annex on machine B becomes a bare repo.
+
+I didn't try this because it's such a violation of the way git actually works that I just can't believe it could happen. If it does, you've found the git bug of the year.
+
+But, I think you just got confused about whether the repository existed before, or gave the wrong path to the existing repository which would result in a new, bare repository being created in the location you told it.
+
+If you really think this happens, show a transcript with enough details for me, or the git developers, to reproduce the problem.
+"""]]
diff --git a/doc/forum/How_do_I_sync_files_from_mobile_to_a_repo__63__/comment_5_3dcdaef370d0df38e7285f1fa11c6bb3._comment b/doc/forum/How_do_I_sync_files_from_mobile_to_a_repo__63__/comment_5_3dcdaef370d0df38e7285f1fa11c6bb3._comment
new file mode 100644
index 000000000..7bcce9706
--- /dev/null
+++ b/doc/forum/How_do_I_sync_files_from_mobile_to_a_repo__63__/comment_5_3dcdaef370d0df38e7285f1fa11c6bb3._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ ip="108.236.230.124"
+ subject="comment 5"
+ date="2014-09-18T18:05:33Z"
+ content="""
+It occurs to me that another way you could have gotten confused is, if ssh://machineB:/~/annex was eg, created in the first place by running the git-annex webapp on machineB, then it would be a direct mode repo. In this case, yes core.bare=true, but so does annex.direct=true. And that repository will not be a bare repo really; it will contain the same file tree as you have on your mobile.
+"""]]
diff --git a/doc/forum/Local_and_remote_in_direct_mode/comment_2_90eeb2bffdb2db8032f9a0eac630ed56._comment b/doc/forum/Local_and_remote_in_direct_mode/comment_2_90eeb2bffdb2db8032f9a0eac630ed56._comment
new file mode 100644
index 000000000..539ad1357
--- /dev/null
+++ b/doc/forum/Local_and_remote_in_direct_mode/comment_2_90eeb2bffdb2db8032f9a0eac630ed56._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="Petter_petterson"
+ ip="89.160.15.173"
+ subject="comment 2"
+ date="2014-09-16T08:15:05Z"
+ content="""
+Doing git remote add B ssh://machineB:/~/annex still makes the repository on machineB a bare one, just try it and check git config -l | grep core.bare...
+"""]]
diff --git a/doc/forum/Local_and_remote_in_direct_mode/comment_3_859ec2b3a8e938073b2099fdc5781109._comment b/doc/forum/Local_and_remote_in_direct_mode/comment_3_859ec2b3a8e938073b2099fdc5781109._comment
new file mode 100644
index 000000000..f39c95c03
--- /dev/null
+++ b/doc/forum/Local_and_remote_in_direct_mode/comment_3_859ec2b3a8e938073b2099fdc5781109._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ ip="108.236.230.124"
+ subject="comment 3"
+ date="2014-09-18T17:55:21Z"
+ content="""
+Petter_petterson, I think you're mistaken about that. If you were right, that would be a massive bug in git -- nothing git-annex specific about that command after all.
+"""]]
diff --git a/doc/forum/Move_unsynced_file_in_direct_mode.mdwn b/doc/forum/Move_unsynced_file_in_direct_mode.mdwn
new file mode 100644
index 000000000..015b5f58e
--- /dev/null
+++ b/doc/forum/Move_unsynced_file_in_direct_mode.mdwn
@@ -0,0 +1,97 @@
+When I rename unsynced files in a direct mode repo, the original symlink gets removed from git, but the new symlink doesn't get added back by autocommit or by explicitly using `git annex add`.
+
+First, I create a file in a git-annex repo:
+
+ $ mkdir annex1
+ $ cd annex1
+ $ git init
+ Initialized empty Git repository in /home/cwarden/annex1/.git/
+ $ git annex init
+ init ok
+ (Recording state in git...)
+ $ echo test > test1
+ $ git annex add test1
+ add test1 ok
+ (Recording state in git...)
+ $ git annex sync
+ commit ok
+ $ ls -l
+ total 4
+ lrwxrwxrwx 1 cwarden cwarden 178 Sep 12 10:14 test1 -> .git/annex/objects/w8/pv/SHA256E-s5--f2ca1bb6c7e907d06dafe4687e579fce76b37e4e93b7605022da52e6ccc26fd2/SHA256E-s5--f2ca1bb6c7e907d06dafe4687e579fce76b37e4e93b7605022da52e6ccc26fd2
+ $ cat test1
+ test
+
+Now, I clone the repo and enable autocommit and direct mode in the second repo:
+
+ $ cd ..
+ $ git clone annex1 annex2
+ Cloning into 'annex2'...
+ done.
+ $ cd annex2
+ $ git config annex.autocommit true
+ $ git annex direct
+ commit
+ On branch master
+ Your branch is up-to-date with 'origin/master'.
+
+ nothing to commit, working directory clean
+ ok
+ direct ok
+
+I drop the file, then rename it:
+
+ $ git annex drop test1
+ (merging origin/git-annex into git-annex...)
+ (Recording state in git...)
+ $ mv test1 test2
+ $ ls -l
+ total 4
+ lrwxrwxrwx 1 cwarden cwarden 178 Sep 12 10:14 test2 -> .git/annex/objects/w8/pv/SHA256E-s5--f2ca1bb6c7e907d06dafe4687e579fce76b37e4e93b7605022da52e6ccc26fd2/SHA256E-s5--f2ca1bb6c7e907d06dafe4687e579fce76b37e4e93b7605022da52e6ccc26fd2
+ $ git annex sync
+ commit (Recording state in git...)
+ ok
+ pull origin
+ ok
+ push origin
+ Counting objects: 6, done.
+ Delta compression using up to 4 threads.
+ Compressing objects: 100% (5/5), done.
+ Writing objects: 100% (6/6), 674 bytes | 0 bytes/s, done.
+ Total 6 (delta 1), reused 0 (delta 0)
+ To /home/cwarden/annex1
+ 2772756..ffcb7a1 annex/direct/master -> synced/master
+ * [new branch] git-annex -> synced/git-annex
+ ok
+ (Recording state in git...)
+
+Now, I want to get the renamed file:
+
+ $ git annex get test2
+ $ ls -l
+ total 4
+ lrwxrwxrwx 1 cwarden cwarden 178 Sep 12 10:14 test2 -> .git/annex/objects/w8/pv/SHA256E-s5--f2ca1bb6c7e907d06dafe4687e579fce76b37e4e93b7605022da52e6ccc26fd2/SHA256E-s5--f2ca1bb6c7e907d06dafe4687e579fce76b37e4e93b7605022da52e6ccc26fd2
+ $ cat test2
+ cat: test2: No such file or directory
+
+Explicitly adding test2 doesn't work:
+
+ $ git annex add test2
+ $ git annex get test2
+ $ cat test2
+ cat: test2: No such file or directory
+
+`git annex fsck` doesn't help:
+
+ $ git annex fsck
+ $ cat test2
+ cat: test2: No such file or directory
+
+The only way I've found to get the renamed file back into git is to use `core.bare=false`, but the [documentation](http://git-annex.branchable.com/direct_mode/) says that "there should be no good reason to need to do this, ever".
+
+ $ git -c core.bare=false add test2
+ $ git -c core.bare=false commit -m'force renamed file back into git'
+ $ git annex get test2
+ $ cat test2
+ test
+
+Is there a better solution?
diff --git a/doc/forum/Pusher_crashed__44___attempt_to_repair_hangs__44___broken_symlinks/comment_1_c89b64b0dc7c5a760a84a9d2cfd8982c._comment b/doc/forum/Pusher_crashed__44___attempt_to_repair_hangs__44___broken_symlinks/comment_1_c89b64b0dc7c5a760a84a9d2cfd8982c._comment
new file mode 100644
index 000000000..38bd4daf8
--- /dev/null
+++ b/doc/forum/Pusher_crashed__44___attempt_to_repair_hangs__44___broken_symlinks/comment_1_c89b64b0dc7c5a760a84a9d2cfd8982c._comment
@@ -0,0 +1,11 @@
+[[!comment format=mdwn
+ username="divB"
+ ip="128.12.90.218"
+ subject="comment 1"
+ date="2014-09-12T02:47:37Z"
+ content="""
+I try it once again - any hints for me?
+I haven't done anything since then because I do not know how to proceed here (except creating everything new from scratch).
+
+Is more information needed? If yes, what?
+"""]]
diff --git a/doc/forum/SSH_remote_transfers_queued_but_no_movement.mdwn b/doc/forum/SSH_remote_transfers_queued_but_no_movement.mdwn
new file mode 100644
index 000000000..de5001f00
--- /dev/null
+++ b/doc/forum/SSH_remote_transfers_queued_but_no_movement.mdwn
@@ -0,0 +1,3 @@
+I created a local repository using the assistant, followed by setting up a remote ssh 'full backup' repository. While the assistant is running, changes in the local repository are detected and transfers are initiated, but they stay at 0%. How can I go about trouble-shooting this? I've made the remote annex directories 777 permissions for testing, but no change.
+
+Thanks
diff --git a/doc/forum/Stale_keys_and_.cache_files_left_in_.git__47__annex__47__objects.mdwn b/doc/forum/Stale_keys_and_.cache_files_left_in_.git__47__annex__47__objects.mdwn
new file mode 100644
index 000000000..043a3f2db
--- /dev/null
+++ b/doc/forum/Stale_keys_and_.cache_files_left_in_.git__47__annex__47__objects.mdwn
@@ -0,0 +1,39 @@
+I recently migrated some of my repositories from WORM to SHA1E, and
+noticed after finishing conversion and dropping all WORM keys that
+there are some stale files and directories left over in the
+.git/annex/objects directory. These seem to fall into two categories:
+
+1. There are some empty directories meant for WORM-keys. Strangely, I
+don’t believe the content of these keys has ever been present on this
+machine, and the corresponding .log files do not contain the local
+UUID. What might be the deal with those?
+
+Another set of empty WORM directories housed content I unannexed and
+checked into regular git on my other remote, and then pulled locally.
+A subsequent «dropunused» seems to have left the empty directories
+after dropping their content.
+
+I suppose the stale directories can be safely pruned away?
+
+One thing I noticed is that, while the terminal leaf in the objects
+directory is usually sticky (mode +t), the stale directories to
+content I unannexed are all non-sticky. Maybe this gives some
+indication where things got stuck? A few (though not all) of the other
+terminal directories are non-sticky, as well.
+
+2. There are some .map and .cache files leftover in
+.git/annex/objects. This is an indirect repository, but I briefly
+switched it to direct once. The stale files seem to belong to content
+with which I had some difficulties when «git annex add»’ing the files
+(I recall I had to add them multiple times before they were correctly
+indexed). I now examined these files again and noticed they were
+tracked via regular git. I «git rm»’ed them and readded them into the
+annex. Can the stale .cache and .map files be safely deleted?
+
+I noticed some of these keys have the format
+«WORM-s123-m-123456789--name», with an additional dash before the
+mtime. Has there been a format change, or does this indicate a
+problem?
+
+Best regards,
+Z.
diff --git a/doc/forum/Using_the_Git-Annex_Assistant_as_a_Backup_and_Syncing_Service.mdwn b/doc/forum/Using_the_Git-Annex_Assistant_as_a_Backup_and_Syncing_Service.mdwn
new file mode 100644
index 000000000..8d3c84024
--- /dev/null
+++ b/doc/forum/Using_the_Git-Annex_Assistant_as_a_Backup_and_Syncing_Service.mdwn
@@ -0,0 +1,5 @@
+I'm looking to use the Git-Annex Assistant to backup a single repository that is present on and synced between two computers (a home and a working computer). Ideally, each computer uses rsync.net for both of these service, while at the same time treating the cloud storage service as untrusted (so anything stored or tranferred through there is encrypted). Is it possible to do this using solely rsync.net (without the addition of some XMPP service)? According to the software, using shared encryption allows anyone with a clone of the repository to decrypt files on a remote, but the simplest way to make this clone seems to be to first clone to a removable drive, and then from the drive to the second computer (and then deleting the records of the clone to the drive). I'm unsure if by then setting up the backup at rsync.net for the second computer, whether the software will create a second backup that acts independently of the first, neglecting any syncing, or if it will recognize the backup as one of the same repository. I'm also unsure as to whether the software will even sync if the backup is recognized, or whether a tranfer repository at rsync.net is also necessary to complete the setup. Could you perhaps give me some advice on how to achieve this setup, or point me to some information that may help me along?
+
+(If the setup is unclear, I'm essentially trying to replicate something like SpiderOak with the Git-Annex Assistant, without using an XMPP service)
+
+[Edit: It may be easier to just use Git-Annex (no assistant), so that works too]
diff --git a/doc/forum/Web_app_on_server_without_X11__63__.mdwn b/doc/forum/Web_app_on_server_without_X11__63__.mdwn
new file mode 100644
index 000000000..cb880cf29
--- /dev/null
+++ b/doc/forum/Web_app_on_server_without_X11__63__.mdwn
@@ -0,0 +1,3 @@
+When I run git-annex-webapp, a browser is opened and I am redirected to the assistant. However, how can I run the web app and just have it start the server process without opening a browser, and navigating to the page from a remote computer?
+
+Thanks!
diff --git a/doc/forum/Web_app_on_server_without_X11__63__/comment_1_bee409ad389e5fb5f3e8de4b5c68278d._comment b/doc/forum/Web_app_on_server_without_X11__63__/comment_1_bee409ad389e5fb5f3e8de4b5c68278d._comment
new file mode 100644
index 000000000..f428ece1e
--- /dev/null
+++ b/doc/forum/Web_app_on_server_without_X11__63__/comment_1_bee409ad389e5fb5f3e8de4b5c68278d._comment
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="Xyem"
+ ip="81.111.193.130"
+ subject="comment 1"
+ date="2014-09-10T14:32:21Z"
+ content="""
+[Running the assistant headless](http://git-annex.branchable.com/design/assistant/blog/day_232__headless_webapp/).
+
+Hope this helps.
+"""]]
diff --git a/doc/forum/Windows_installation_notes.mdwn b/doc/forum/Windows_installation_notes.mdwn
new file mode 100644
index 000000000..3fb25ec05
--- /dev/null
+++ b/doc/forum/Windows_installation_notes.mdwn
@@ -0,0 +1,146 @@
+[[!toc]]
+
+# Introduction
+
+Hello.
+
+I've installed git-annex and git-annex assistant on Windows 7 in a corp environment (hello gotchas!).
+
+In this post I'll describe issues I encountered, how I fixed them, recommendations I have for the installer, and some results from a couple `git annex test` runs.
+
+# Background
+
+My regular domain user doesn't have permissions to write to `C:\Program Files (x86)`, so I use a secondary domain user which is in the Administrators group. I use "Run as different user" to run installers, etc. (cf. "Run as Administrator")
+
+During msysgit installation I checked "only bash, don't add to path, don't integrate with Explorer" etc, since I like my third-party applications isolated.
+
+# The installer
+
+## Where to install `git-annex.exe`
+
+The nightly build of git-annex/assistant from NEST (20140908) only prompts for the base path of the msysgit location and it installs files in `$BASE/bin` and `$BASE/cmd`... I'll try manually copying files post-install to mitigate the path issues described in other posts on this forum.
+
+The msysgit installer (1.9.4-preview20140815) presents a certain screen with three radio options:
+
+1. git bash only
+2. just git in `cmd.exe`
+3. git + unix tools in `cmd.exe`.
+
+I *think* this is the meaning of each:
+
+1. cmd.exe's PATH is not touched.
+2. `$GITBASE/cmd` is added to PATH
+3. `$GITBASE/bin` is added to PATH
+
+Therefore, I think that if you do something so that `git-annex.exe` is added to both $GITBASE/cmd and $GITBASE/bin (perhaps a symlink or even a .lnk file) then all three user preference options will be covered.
+
+All I did was copy `$BASE/cmd/git-annex.exe` to `$BASE/bin/git-annex.exe` and now both `git annex` and `git-annex` work in my msysgit "git bash" console. I didn't test `cmd.exe` since I selected option 1 in the msysgit installer.
+
+## Installer locations: user profile or system-wide?
+
+I found a shortcut for the webapp in Start Menu/Startup ... for the wrong user. Please prompt the user during the installation: "Install startup link system-wide or for current user?"
+
+# git annex test results
+
+## `$HOME` defaulted to some mapped drive, whoops!
+
+The test suite has been running since before I started this post. Is that normal? :)
+
+I notice that it emits "Detected a crippled filesystem", "Enabling direct mode." and other messages again and again. If those checks are expensive, maybe the result should be memoized/cached.
+
+Oh goodness, the test is reading and writing to my "home directory": a remote filesystem I never use. It's slow. I'll have to configure msysgit to use a different, more local `$HOME`. This a common problem on this workstation. I'll let the test finish in case it reveals something useful to you, but this will not be how I use it going forward...
+
+I am unable to attach `testWithMappedDriveHomeDirConsoleOutput.txt` to this post. 1 out of 84 tests failed. Here is the only case sensitive occurrence of FAIL in the console output, with some lines of context.
+
+ OK
+ info: Detected a filesystem without fifo support.
+ Disabling ssh connection caching.
+ Detected a crippled filesystem.
+ Enabling direct mode.
+ git-annex: Data.BloomFilter.Util.suggestSizing: capacity too large to represent
+ FAIL
+ Exception: user error (git-annex ["info","--json"] exited 1)
+ version: Detected a filesystem without fifo support.
+ Disabling ssh connection caching.
+ Detected a crippled filesystem.
+ Enabling direct mode.
+ git-annex version: 5.20140908-g378fbb1
+ build flags: Assistant Webapp Webapp-secure Pairing Testsuite S3 WebDAV DNS Feeds Quvi TDFA CryptoHash
+
+## test results with local NTFS `$HOME`
+
+...The console output is scrolling by much more quickly.
+
+2 out of 84 tests failed.
+
+ prop_past_sane: OK
+ +++ OK, passed 1000 tests.
+ prop_duration_roundtrips: OK
+ +++ OK, passed 1000 tests.
+ prop_metadata_sane: OK
+ +++ OK, passed 1000 tests.
+ prop_metadata_serialize: OK
+ +++ OK, passed 1000 tests.
+ prop_branchView_legal: OK
+ +++ OK, passed 1000 tests.
+ prop_view_roundtrips: OK
+ +++I nOiKt, Tpeasstsse
+ d 1 0i0n0i tt:e sts.
+ prop_viewedFile_rountrips: FAIL
+ *** Failed! Falsifiable (after 51 tests and 1 shrink):
+ "a:"
+ Use --quickcheck-replay '50 592211036 1831676953' to reproduce.
+ Unit Tests
+ add sha1dup: init test repo
+ Detected a filesystem without fifo support.
+
+ Disabling ssh connection caching.
+
+and
+
+ OK
+ info: Detected a filesystem without fifo support.
+ Disabling ssh connection caching.
+ Detected a crippled filesystem.
+ Enabling direct mode.
+ git-annex: Data.BloomFilter.Util.suggestSizing: capacity too large to represent
+ FAIL
+ Exception: user error (git-annex ["info","--json"] exited 1)
+ version: Detected a filesystem without fifo support.
+ Disabling ssh connection caching.
+ Detected a crippled filesystem.
+ Enabling direct mode.
+ git-annex version: 5.20140908-g378fbb1
+ build flags: Assistant Webapp Webapp-secure Pairing Testsuite S3 WebDAV DNS Feeds Quvi TDFA CryptoHash
+
+...Note the corruption. I think this happens when I drag the scroll bar while console output is being emitted. (msysgit's problem?) I would presume and hope that this is a "display only" issue. UPDATE: see section Corruption below.
+
+# .vbs failure
+
+I copied the `git-annex.lnk` out of my admin user's start menu onto my desktop and double clicked it. `wscript.exe` got stuck in a loop where new copies were being spawned over and over again (and old copies dieing at the same rate).
+
+I think I know why. `git-annex.exe` isn't on the path... but `git-annex.lnk` is in the CWD (Desktop in this case). Yeah, that is the problem. The vbs attempts to run "git-annex webapp", and this .lnk points to a valid "executable": `git-annex-webapp.vbs`... So it just calls itself with an argument over and over again.
+
+Workaround: invoke `git annex webapp` from the normal git bash console.
+
+# Corruption?
+
+In some section above I speculated that the "jittery" corruption I was seeing in my console was a "display only" problem caused by scrolling around while new characters were being printed to the console. Now, I don't think so.
+
+The corruption can be seen in the Log in the webapp. Here's an example from the top of the log:
+
+ [2014-09-08 13:37:45 Central Daylight Time] main: starting assistant version 5.20140908-g378fbb1
+ Launching web browser on file://d:\annex\.git\annex\webapp.html
+ [2014-09-08 13:37:45 Central Daylight Time] Cronner: You should enable consistency checking to protect your data.
+ (scanning...) [2014-09-08 13:37:45 Central Daylight Time] Watcher: Performing startup scan
+ (started...) rreerrcceevvcc::vv ::ff aaffiiaalliieellddee dd(( NN((ooNN ooee rreerrrroorrrroo))rr
+
+ ))
+
+I have no clue about this! (Well... "I think it's trying to communicate!")
+
+# Conclusion
+
+I hope this information is helpful. I've enabled the 'email comments to me' option on this post and I'd be happy to perform further tests upon request.
+
+Cheers!
diff --git a/doc/forum/adding_files_without_hashing_them.mdwn b/doc/forum/adding_files_without_hashing_them.mdwn
new file mode 100644
index 000000000..a9aef308f
--- /dev/null
+++ b/doc/forum/adding_files_without_hashing_them.mdwn
@@ -0,0 +1 @@
+I would like to be able to add files without having to hash its contents (like WORM) but being able to modify them and record its changes. Is this possible? In other words, I would like to provide other not-that-expensive mechanism for identifying files of a particular version.
diff --git a/doc/forum/adding_files_without_hashing_them/comment_1_c3113d7aff6b64a325a32b8b281df605._comment b/doc/forum/adding_files_without_hashing_them/comment_1_c3113d7aff6b64a325a32b8b281df605._comment
new file mode 100644
index 000000000..56577ca1a
--- /dev/null
+++ b/doc/forum/adding_files_without_hashing_them/comment_1_c3113d7aff6b64a325a32b8b281df605._comment
@@ -0,0 +1,12 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ ip="209.250.56.22"
+ subject="comment 1"
+ date="2014-09-16T19:50:41Z"
+ content="""
+You can edit files that use the WORM backend, as long as the editing changes their size or mtime, or both. If neither changes, git-annex won't be able to keep your edits separate when using WORM.
+
+A perhaps safer compromise can be to use the WORM backend initially, but them `git annex migrate --backend=SHA256E` when you have spare CPU cycles.
+
+Or, when you commit a change to a file that had been using WORM, use `git annex add $wormy_file --backend=SHA256E` to make the new version use the better backend.
+"""]]
diff --git a/doc/forum/annex_merge_creates___34__synced__47____42____34___branches.mdwn b/doc/forum/annex_merge_creates___34__synced__47____42____34___branches.mdwn
new file mode 100644
index 000000000..b4f02bc56
--- /dev/null
+++ b/doc/forum/annex_merge_creates___34__synced__47____42____34___branches.mdwn
@@ -0,0 +1,7 @@
+Hi,
+
+when I fetch from a central repository and `git annex merge` a synced/master branch is created. How can I disable this behaviour?
+
+Or is there a better workflow for getting and pushing updates from/to a central git repo?
+
+bye
diff --git a/doc/forum/annex_merge_creates___34__synced__47____42____34___branches/comment_1_4667fadb05c594b0a212bf455ee65298._comment b/doc/forum/annex_merge_creates___34__synced__47____42____34___branches/comment_1_4667fadb05c594b0a212bf455ee65298._comment
new file mode 100644
index 000000000..90643ca9b
--- /dev/null
+++ b/doc/forum/annex_merge_creates___34__synced__47____42____34___branches/comment_1_4667fadb05c594b0a212bf455ee65298._comment
@@ -0,0 +1,12 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ ip="209.250.56.22"
+ subject="comment 1"
+ date="2014-09-16T18:22:11Z"
+ content="""
+Why is this a problem? You can delete the branch at any time of course if it's in the way.
+
+It would be possible for `git-annex sync` to avoid creating the synced/master branch at all when syncing with a bare git repository, but this would actually make it less efficient and slower. Where currently it makes one push, updating the remote's master branch when possible, and forcing an update of its synced/master branch at the same time, it would instead need to first try to update remote's master, then check if that succeeded and if not force the update of synced/master. Also, it's not clear how to check if the push to master succeeded, since something else might update it further in a race.
+
+I suppose that `git annex sync/merge` could delete the local synced/* branches once it was done merging them. This wouldn't prevent `git pull` from pulling down those branches, though.
+"""]]
diff --git a/doc/forum/annex_merge_creates___34__synced__47____42____34___branches/comment_2_cb6971a766a28bd8c094d0b986272c65._comment b/doc/forum/annex_merge_creates___34__synced__47____42____34___branches/comment_2_cb6971a766a28bd8c094d0b986272c65._comment
new file mode 100644
index 000000000..5db94a7a0
--- /dev/null
+++ b/doc/forum/annex_merge_creates___34__synced__47____42____34___branches/comment_2_cb6971a766a28bd8c094d0b986272c65._comment
@@ -0,0 +1,11 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawlog_5wIICaMcrKTexlFNA6IO6UTp323aE"
+ nickname="Torkaly"
+ subject="comment 2"
+ date="2014-09-17T08:47:03Z"
+ content="""
+Thank you for the answer.
+
+There are no origin/synced/* branches, only a origin/git-annex and the local git-annex branch. What i need git annex merge to do, is to merge the fetched remote git-annex with the local git-annex. There is no need for creating or merging the synced-branches as there are no.
+
+"""]]
diff --git a/doc/forum/annex_merge_creates___34__synced__47____42____34___branches/comment_3_1a0384edd20cc379e53fe7d7f650f7e2._comment b/doc/forum/annex_merge_creates___34__synced__47____42____34___branches/comment_3_1a0384edd20cc379e53fe7d7f650f7e2._comment
new file mode 100644
index 000000000..cb80c07f9
--- /dev/null
+++ b/doc/forum/annex_merge_creates___34__synced__47____42____34___branches/comment_3_1a0384edd20cc379e53fe7d7f650f7e2._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ ip="108.236.230.124"
+ subject="comment 3"
+ date="2014-09-18T17:39:19Z"
+ content="""
+`git annex merge` does not create any synced/* branches. These branches will be pulled down by `git pull` or `git annex sync`.
+"""]]
diff --git a/doc/forum/armhf_binary/comment_2_743ecf263d1ec1bc4f24e32c0a178f2b._comment b/doc/forum/armhf_binary/comment_2_743ecf263d1ec1bc4f24e32c0a178f2b._comment
new file mode 100644
index 000000000..864d5f23c
--- /dev/null
+++ b/doc/forum/armhf_binary/comment_2_743ecf263d1ec1bc4f24e32c0a178f2b._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="justinl"
+ ip="184.17.213.135"
+ subject="works"
+ date="2014-09-10T17:59:48Z"
+ content="""
+Yep, the standalone armel build worked perfectly. Thanks!
+"""]]
diff --git a/doc/forum/big_overhead.mdwn b/doc/forum/big_overhead.mdwn
new file mode 100644
index 000000000..f16b95942
--- /dev/null
+++ b/doc/forum/big_overhead.mdwn
@@ -0,0 +1,46 @@
+[[!meta title="unreachable git objects"]]
+
+Hi,
+
+I am been seeing quite big overheads using `git-annex`. Is this is normal?
+
+The `.git/objects` folder is explosive in my system, often being larger
+than the content watched by git-annex. Here's the actual statistics
+of my git-annex folders, where the fourth column is calculated as col3/(col2-col3).
+
+[[!table data="""
+folder,size,size .git,relative size
+conf.annex,777536,720100,12.537433
+doc.annex,20351624,11260204,1.2385528
+images.annex,817064,435580,1.1418041
+misc.annex,803328,572476,2.4798399
+music.annex,23756116,9192740,0.63122314"""]]
+
+That is, four of five repos require more space for the `.git` folder than the actual files. Most of this comes from the `objects` folder.
+
+Number of files:
+
+[[!table data="""
+folder,no. files,no files .git,relative size
+conf.annex,11350,9539,5.2672557
+doc.annex,84954,66824,3.6858246
+images.annex,92787,91285,60.775632
+misc.annex,95461,95160,316.14618
+music.annex,16414,13520,4.6717346
+"""]]
+
+
+I use the assistant web interface, and direct
+mode. I use two laptops running Linux that are synchronized
+directly over LAN at home or via a transfer repo on a ssh server
+where git-annex is installed. The latter is set up using the web interface and the gcrypt repo.
+[Mostly, the transfer repo isn't working
+and I often end up with only symlinks on the computer where I did not edit the file in question,
+but this is probably unrelated.]
+
+I have previously tried to fix it using `git gc` or `git annex forget`, but it doesn't seem to significantly reduce the sizes, and what it helps isn't persistent.
+
+Is this kind of 'overhead' something that one must accept when using
+`git-annex` or do such numbers indicate that something is wrong?
+
+Thanks.
diff --git a/doc/forum/big_overhead/comment_10_d5f4e353e7f711d8c38cdcc222339bca._comment b/doc/forum/big_overhead/comment_10_d5f4e353e7f711d8c38cdcc222339bca._comment
new file mode 100644
index 000000000..2ebd56d30
--- /dev/null
+++ b/doc/forum/big_overhead/comment_10_d5f4e353e7f711d8c38cdcc222339bca._comment
@@ -0,0 +1,14 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ ip="108.236.230.124"
+ subject="comment 10"
+ date="2014-09-18T17:27:36Z"
+ content="""
+In the meantime, I've been looking over the Annex.Branch code.
+
+`stageJournal` is only ever called in code paths that commit the updated index, so those code paths cannot result in dangling objects unless git-annex is interrupted before it can commit. (This may explain some of my own repos having a few dangling refs, that were not commits; I could have ctrl-c'd git-annex.)
+
+It's possible for a forced update of the local git-annex branch, done by eg a push from another repo, to overwrite a commit made to it. In this case, the git-annex index is merged with the branch, resulting in a new commit, and the old commit that was overwritten will indeed be dangling. However, `git annex sync` doesn't overwrite the git-annex branch; it pushes to synced/git-annex, or does a `taggedPush` to a private ref. It is the case that both those pushes are forced pushes, so can overwrite a branch ref and leave the old commit it pointed to dangling. In the case of `taggedPush`, the old commit should be a parent of the new, so it won't dangle. In the case of synced/git-annex being overwritten, the old commit could dangle, but only until whatever repo pushed it syncs again, at which time it should get incorporated as one of the parents of the new synced/git-annex it pushes. So, I don't see how long-term dangling commits could happen this way, except for in the case where a repository stops syncing/goes missing/rebases its git-annex branch (ie, git-annex forget is used). (This may explain the 2 dangling commits I found on elephant; we did delete some clones of that repository recently.)
+
+At this point I'm not convinced that the dangling objects I found in my own repos are due to some systematic problem, the above seems like it could explain them, and the above is not a problem on the class of the one Rasmus is having. Of course, it's hard to be sure you've spotted all possible ways that a resource leak can happen, and that's what these dangling objects basically are.
+"""]]
diff --git a/doc/forum/big_overhead/comment_11_cbf25217e4149f2cfad4e2bf94f2b4ca._comment b/doc/forum/big_overhead/comment_11_cbf25217e4149f2cfad4e2bf94f2b4ca._comment
new file mode 100644
index 000000000..e2a74068d
--- /dev/null
+++ b/doc/forum/big_overhead/comment_11_cbf25217e4149f2cfad4e2bf94f2b4ca._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ ip="108.236.230.124"
+ subject="comment 11"
+ date="2014-09-18T17:32:09Z"
+ content="""
+I knew I *had* used \"Initial commit\" somewhere ... etckeeper uses that message. And commits as root. Could an etckeeper repo have somehow gotten merged into your git-annex repo? Seems strange, and the filenames and contents don't really look like /etc to me, but it otherwise somewhat fits.
+"""]]
diff --git a/doc/forum/big_overhead/comment_1_0c184520c30a89bd2604ab7c0eb7ac45._comment b/doc/forum/big_overhead/comment_1_0c184520c30a89bd2604ab7c0eb7ac45._comment
new file mode 100644
index 000000000..20c2ff6c0
--- /dev/null
+++ b/doc/forum/big_overhead/comment_1_0c184520c30a89bd2604ab7c0eb7ac45._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawm8wY171R5c4u_jPmB6LU6n6Px2xePM4sE"
+ nickname="Efraim"
+ subject="comment 1"
+ date="2014-09-07T14:09:05Z"
+ content="""
+have you tried from the command line `git annex unused` to see if you have unused files in your repo? From the assistant, the option under configuration -> Unused files gives you an option to expire old files after a period of time so they get deleted from your repo.
+"""]]
diff --git a/doc/forum/big_overhead/comment_2_13a017c6c84511894ded2d89d86eb541._comment b/doc/forum/big_overhead/comment_2_13a017c6c84511894ded2d89d86eb541._comment
new file mode 100644
index 000000000..25d010fe1
--- /dev/null
+++ b/doc/forum/big_overhead/comment_2_13a017c6c84511894ded2d89d86eb541._comment
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="rasmus"
+ ip="109.201.154.150"
+ subject="comment 2"
+ date="2014-09-07T15:17:25Z"
+ content="""
+Thanks for help, Efraim.
+
+I'm not sure this is it. On my other laptop, where the above statics were not calculated the `.git` folder of `doc.annex` is 26Gb (contents is 8.6Gb). Meanwhile, unused files are 0.6Gb. In `conf.annex` the `.git` folder is 3.2Gb, content is 70Mb and unused files is 2.2Mb. I used the web interface to find the size of unused files.
+"""]]
diff --git a/doc/forum/big_overhead/comment_3_b4761cacc02396b5bdf34bcf3457cb91._comment b/doc/forum/big_overhead/comment_3_b4761cacc02396b5bdf34bcf3457cb91._comment
new file mode 100644
index 000000000..f090e5b25
--- /dev/null
+++ b/doc/forum/big_overhead/comment_3_b4761cacc02396b5bdf34bcf3457cb91._comment
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="http://id.clacke.se/"
+ nickname="Claes"
+ subject="repack parameters"
+ date="2014-09-07T21:53:10Z"
+ content="""
+Because git-annex tracks all the events of an annexed file for each repo -- added, dropped, copied etc -- and it tracks these in one object per file in the git-annex branch, it does indeed create a lot of objects. To improve both space and performance I made sure to add `git gc --auto` as a post-commit hook, as the objects in my case can quickly reach the tens or even hundreds of thousands.
+
+To further improve performance and space, you can choose to set `pack.window` and `pack.depth` to vastly higher values than the defaults (10 and 50, respectively), because there is a large amount of objects with very similar content. I did a `git repack --window 2500 --depth 1000 -f -a d` and brought down my repo from 3 GiB (packed!) to 300 MiB. Make sure to have a lot of memory and CPU available when doing this, or it will take forever. You can set `pack.window` ridiculously high if you like, as long as you limit it with `pack.windowMemory`, so that it makes use of all your available memory for comparing objects and finding the optimal delta.
+"""]]
diff --git a/doc/forum/big_overhead/comment_4_633f8538f368220eaca82b8bbfe9b49d._comment b/doc/forum/big_overhead/comment_4_633f8538f368220eaca82b8bbfe9b49d._comment
new file mode 100644
index 000000000..a0001f71e
--- /dev/null
+++ b/doc/forum/big_overhead/comment_4_633f8538f368220eaca82b8bbfe9b49d._comment
@@ -0,0 +1,16 @@
+[[!comment format=mdwn
+ username="rasmus"
+ ip="109.201.154.209"
+ subject="Re: repack parameters"
+ date="2014-09-08T13:20:36Z"
+ content="""
+Thanks for your tips, Claes. I was really aware of `git repack` and that set of parameters.
+
+I didn't mention, but sadly I'd run `git gc` on the repos just before collecting the above numbers.
+
+I tried to repack two repositories -- `doc.annex` and `config.annex` -- using the values you suggested. However, it did not have any measurable effect (less than 100mb in both cases).
+
+The number of unused files seem to be (much) less than 500 files in the repos.
+
+BTW: All of the extra size is in the `.git/objects/` folder. `.git/annex/` is quite small (always much less than 1GB). Would that indicate that large files are checked in with git sans annex somehow?
+"""]]
diff --git a/doc/forum/big_overhead/comment_5_599092b8d4f1fc8f378796328ef42931._comment b/doc/forum/big_overhead/comment_5_599092b8d4f1fc8f378796328ef42931._comment
new file mode 100644
index 000000000..ee91a5b2b
--- /dev/null
+++ b/doc/forum/big_overhead/comment_5_599092b8d4f1fc8f378796328ef42931._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="rasmus"
+ ip="109.201.154.183"
+ subject="comment 5"
+ date="2014-09-08T13:48:03Z"
+ content="""
+So `git prune` worked wonders on my repos, getting rid of GBs of stuff in the `.git/objects` folders. I don't know why they weren't picked up by `git gc`. In retrospect, it was perhaps a bit careless of me to run `git prune` directly, but hopefully I will be OK. . .
+"""]]
diff --git a/doc/forum/big_overhead/comment_6_adb4b4e7eb4dac7760f3425bae6cbbc2._comment b/doc/forum/big_overhead/comment_6_adb4b4e7eb4dac7760f3425bae6cbbc2._comment
new file mode 100644
index 000000000..0bc1763a3
--- /dev/null
+++ b/doc/forum/big_overhead/comment_6_adb4b4e7eb4dac7760f3425bae6cbbc2._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="rasmus"
+ ip="193.145.48.43"
+ subject="comment 6"
+ date="2014-09-10T12:07:53Z"
+ content="""
+Seems `git prune` only worked as a temporary fix. My `doc.annex/.git/objects` is 3.6Gb after two days. I don't get why `git` sans `annex` is checking in stuff -- which I assume is the reason it's stored in `.git/objects`.
+"""]]
diff --git a/doc/forum/big_overhead/comment_7_a762eb55addf81c1c5350c7968598d0f._comment b/doc/forum/big_overhead/comment_7_a762eb55addf81c1c5350c7968598d0f._comment
new file mode 100644
index 000000000..1ec6a6eef
--- /dev/null
+++ b/doc/forum/big_overhead/comment_7_a762eb55addf81c1c5350c7968598d0f._comment
@@ -0,0 +1,16 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ ip="108.236.230.124"
+ subject="comment 7"
+ date="2014-09-17T20:20:40Z"
+ content="""
+There are a few things that can cause git to leave unreachable objects. These include: Rebasing; interrupting a pull before it updates the refs; running git add on a file and then changing the file's content and adding it a second time before committing.
+
+I can think of one case where this happens when using git-annex at the command line: `git annex add $file; git mv $file other-directory; git commit` will result in a dangling object storing the old symlink target before the file was moved.
+
+It'd be useful to investigate, by using `git fsck --unreachable` to get a list of currently unreachable objects, and then use `git show` to look at the objects and try to determine where they came from. Ie, are they symlink targets or are they git-annex location log files (formatted as columns of timestamps and uuids). Any unreachable commits would be the most useful to investigate.
+
+I see a few loose objects here and there in my annexes, but not very many, and git-gc has cleaned up old ones (> 1 month old). Some of them seem to be location log files. I see those in both repositories where I use the assistant, and repositories where I use only command line git-annex. I was able to find 2 unreachable commits in a repository that runs the assistant full-time; both commits were \"merging origin/synced/git-annex into git-annex\". This suggests to me that perhaps the assistant merged the git-annex branch but that merge was overwritten by another thread that committed changes to the branch at the same time.
+
+You should also check the size of inodes on your system; a thousand small loose objects in .git/objects does not normally take up gigabytes of space; with typical inode sizes it might use up a few megabytes. With 1 mb inodes, those same thousand files would use 1 gb..
+"""]]
diff --git a/doc/forum/big_overhead/comment_8_4a66f57c6c0bdc6123618cb69a719be5._comment b/doc/forum/big_overhead/comment_8_4a66f57c6c0bdc6123618cb69a719be5._comment
new file mode 100644
index 000000000..fdbebf4e4
--- /dev/null
+++ b/doc/forum/big_overhead/comment_8_4a66f57c6c0bdc6123618cb69a719be5._comment
@@ -0,0 +1,65 @@
+[[!comment format=mdwn
+ username="rasmus"
+ ip="217.130.110.20"
+ subject="comment 8"
+ date="2014-09-18T11:28:45Z"
+ content="""
+Hi Joey,
+
+Thanks for your careful reply.
+
+Easy things first:
+
+I *never* add anything from the terminal, though I may do checks and `git annex get`, since sometimes the assistance actually grab the updated files. Until recently I started git annex automatically on boot, but at the moment it simply renders my laptop useless for too long -- presumably due to the errors investigated here.
+
+I use btrfs (don't ask me why). Searching online, I did not find a way to find the size of inodes, but I assume that it's sensible? tune2fs doesn't work but as I understand it is designed for ext*.
+
+What takes up space in my `.git/objects` is files of several Mb. So at the moment the `pack` folder is 700mb. In the next biggest folder there's three files that are 73,4mb and 8 files that are 4kb. This pattern repeats. A couple of large files (73,4 shows up quite a bit as well as 45) and many small files.
+
+I have an astonishing amount of dangling objects. In the `doc.annex` `git rev-list HEAD --count` gives 27354. In this repo I have 1108 unreachable blobs and commits, respectively 569 and 539. This probably explains why `git prune` solves my problem but I don't understand why all these large files reappears when I sync -- even after having run `git prune` on both laptops. Could they come from the `annex` on my remote server?
+
+`git show` isn't nice on blobs, but here is an example of a dangling commit
+
+
+ commit 478425bef867782e8ff22aca24316e9421288c49
+ Author: root <root@localhost>
+ Date: Mon Dec 31 19:00:01 2012 -0400
+
+ Initial commit
+
+ diff --git a/6e5039464b41f39088a4aece64ced787aa2b04ec2dd5ac6f6c6ca4b9a06a99e5 b/6e5039464b41f39088a4aece64ced787aa2b04ec2dd5ac6f6c6ca4b9a06a99e5
+ new file mode 100644
+ index 0000000..af12763
+ Binary files /dev/null and b/6e5039464b41f39088a4aece64ced787aa2b04ec2dd5ac6f6c6ca4b9a06a99e5 differ
+ diff --git a/8ae4ee273eb540fb71b78152d10010ea2dd3d1bb82afe410ecf3d811cb72bd6d b/8ae4ee273eb540fb71b78152d10010ea2dd3d1bb82afe410ecf3d811cb72bd6d
+ new file mode 100644
+ index 0000000..0a6af91
+ Binary files /dev/null and b/8ae4ee273eb540fb71b78152d10010ea2dd3d1bb82afe410ecf3d811cb72bd6d differ
+ diff --git a/91bd0c092128cf2e60e1a608c31e92caf1f9c1595f83f2890ef17c0e4881aa0a b/91bd0c092128cf2e60e1a608c31e92caf1f9c1595f83f2890ef17c0e4881aa0a
+ new file mode 100644
+ index 0000000..26d921e
+ Binary files /dev/null and b/91bd0c092128cf2e60e1a608c31e92caf1f9c1595f83f2890ef17c0e4881aa0a differ
+ diff --git a/9f7728197cfcd9792eef1ff5930a4ab580e38e64291037130f1ad0914e34a1fc b/9f7728197cfcd9792eef1ff5930a4ab580e38e64291037130f1ad0914e34a1fc
+ new file mode 100644
+ index 0000000..2a92974
+ Binary files /dev/null and b/9f7728197cfcd9792eef1ff5930a4ab580e38e64291037130f1ad0914e34a1fc differ
+ diff --git a/ac801235d97275e761efa12a76ee009472cae8549a0835d5be8bd3f6657047fb b/ac801235d97275e761efa12a76ee009472cae8549a0835d5be8bd3f6657047fb
+ new file mode 100644
+ index 0000000..543430c
+ Binary files /dev/null and b/ac801235d97275e761efa12a76ee009472cae8549a0835d5be8bd3f6657047fb differ
+ diff --git a/d400d0f616a980ea5e3ef68a1f9d670d1eeccbd27f34d1cb7ea976e1f98e2fb7 b/d400d0f616a980ea5e3ef68a1f9d670d1eeccbd27f34d1cb7ea976e1f98e2fb7
+ new file mode 100644
+ index 0000000..7b7eadd
+ Binary files /dev/null and b/d400d0f616a980ea5e3ef68a1f9d670d1eeccbd27f34d1cb7ea976e1f98e2fb7 differ
+ diff --git a/e988a26fbabe3f498e2a564096948eafb289ccadfb186423c1f63c5a3b2c19db b/e988a26fbabe3f498e2a564096948eafb289ccadfb186423c1f63c5a3b2c19db
+ new file mode 100644
+ index 0000000..3bd1dfa
+ Binary files /dev/null and b/e988a26fbabe3f498e2a564096948eafb289ccadfb186423c1f63c5a3b2c19db differ
+
+There are several things I don't understand. Why is the author root? I never run `git annex` with `sudo` or as root. I think the date is bogus. I'm pretty sure I wasn't even running `git annex` in 2012 much less working with this repo. . . What is weird is that this is the date for *all* lost commits! (Same for Author). Over all lost commits there are 2352 binary files that differ. Of these there are 284 unique hashes. . . I don't know what this means other than my repo being seriously messed up. I don't understand what I did wrong to end up in this state as I have been fairly careful in mainly using the `webapp`.
+
+I wonder if the best way to proceed is to start over, or whether this repo can be recovered.
+
+Thanks,
+Rasmus
+"""]]
diff --git a/doc/forum/big_overhead/comment_9_5fa681ea0d6bd0dcac7142d40df9d54f._comment b/doc/forum/big_overhead/comment_9_5fa681ea0d6bd0dcac7142d40df9d54f._comment
new file mode 100644
index 000000000..856f326f4
--- /dev/null
+++ b/doc/forum/big_overhead/comment_9_5fa681ea0d6bd0dcac7142d40df9d54f._comment
@@ -0,0 +1,12 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ ip="108.236.230.124"
+ subject="comment 9"
+ date="2014-09-18T16:54:10Z"
+ content="""
+That is a very strange commit by every metric. Weird author, weird date, weird filenames in it (not files that git-annex uses!), with apparently some weird binary content (which git-annex would not be committing). Even a weird commit message -- git-annex never makes a commit with a message of \"Initial commit\", and as far as I can tell using `git log -S`, it never has. (OTOH, it's a pretty common example message used in eg, git documentation.) So, I feel pretty sure that dangling commit was not made by git-annex.
+
+I think you need to take a look at some of the 4+mb unreachable blobs, to get some idea of what these files are. One way is to use git-show on the hash of one of the blobs to get its content, and then, perhaps pass it to `file` or `strings`. Or, you could stop the assistant, `git checkout 478425bef867782e8ff22aca24316e9421288c49` and have a look at this strange tree that was apparently committed in 2012 to see what's in there.
+
+It might be possible that the dangling commits come somehow from the remote server. I'm not 100% sure, but I think that a git pack can end up with dangling objects in it, and then git can pull down that pack to get other, non-dangling objects. You should use `git show` on the server on some of the dangling shas to see if they are present there.
+"""]]
diff --git a/doc/forum/difference_between_full_backup_and_number_of_copies__63__.mdwn b/doc/forum/difference_between_full_backup_and_number_of_copies__63__.mdwn
new file mode 100644
index 000000000..4223a2ded
--- /dev/null
+++ b/doc/forum/difference_between_full_backup_and_number_of_copies__63__.mdwn
@@ -0,0 +1,9 @@
+If I have three repositories setup in the git annex webui as:
+
+full backup,
+
+and every file put into one of the repos seems to be propagated to the other two,
+
+what is the usage of the setting "number of copies" which is default to 1 but can be increased to 2 or 3? Does this setting matter in this context?
+
+I'm using assistant version 5.20140517.4
diff --git a/doc/forum/difference_between_full_backup_and_number_of_copies__63__/comment_1_df1850059a7a3006db7cb5c588dac3d7._comment b/doc/forum/difference_between_full_backup_and_number_of_copies__63__/comment_1_df1850059a7a3006db7cb5c588dac3d7._comment
new file mode 100644
index 000000000..e58f5402b
--- /dev/null
+++ b/doc/forum/difference_between_full_backup_and_number_of_copies__63__/comment_1_df1850059a7a3006db7cb5c588dac3d7._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawm8wY171R5c4u_jPmB6LU6n6Px2xePM4sE"
+ nickname="Efraim"
+ subject="comment 1"
+ date="2014-08-31T07:09:52Z"
+ content="""
+number of copies is the minimum number of copies that can exist when you try to drop a file from a repository/without git-annex telling you that you don't have enough copies and should protect your data better. A full backup by default tries to get every file it can get its hands on, including old versions.
+"""]]
diff --git a/doc/forum/gcrypt_os_x_app_vs_brew/comment_3_be4de1663a37f49a4e42d6b21c0178fe._comment b/doc/forum/gcrypt_os_x_app_vs_brew/comment_3_be4de1663a37f49a4e42d6b21c0178fe._comment
new file mode 100644
index 000000000..99f3b7cbe
--- /dev/null
+++ b/doc/forum/gcrypt_os_x_app_vs_brew/comment_3_be4de1663a37f49a4e42d6b21c0178fe._comment
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="Ganwell"
+ ip="46.14.43.36"
+ subject="brew doesn't include git-remote-gcrypt"
+ date="2014-08-19T21:54:16Z"
+ content="""
+Brew doesn't include git-remote-gcrypt, so I installed your fork of it manually. That works well and if you use a symlink to include it in the PATH you can easily update (pull) the repo. If one can install git-remote-gcrypt using brew, I don't know how.
+
+Best, Jean-Louis
+"""]]
diff --git a/doc/forum/git-annex_in_sane_language_for_mere_humans_of_us__63__.mdwn b/doc/forum/git-annex_in_sane_language_for_mere_humans_of_us__63__.mdwn
new file mode 100644
index 000000000..e091460dc
--- /dev/null
+++ b/doc/forum/git-annex_in_sane_language_for_mere_humans_of_us__63__.mdwn
@@ -0,0 +1 @@
+So, you provide ARM build. But you probably don't know that my NAS box runs OABI. No, you don't know, you can't know, and you shouldn't know. The only thing worth knowing is that writing great software in obscure and esoteric languages drastically limits its usage, impact, and collaboration around it. So, any idea of writing git-annex implementation in a sane, interpreted, "just works" language, e.g. Python? Thanks.
diff --git a/doc/forum/git-annex_in_sane_language_for_mere_humans_of_us__63__/comment_1_29eda7ec1519f339d5b3601559fe0bb0._comment b/doc/forum/git-annex_in_sane_language_for_mere_humans_of_us__63__/comment_1_29eda7ec1519f339d5b3601559fe0bb0._comment
new file mode 100644
index 000000000..1cf6c84d6
--- /dev/null
+++ b/doc/forum/git-annex_in_sane_language_for_mere_humans_of_us__63__/comment_1_29eda7ec1519f339d5b3601559fe0bb0._comment
@@ -0,0 +1,14 @@
+[[!comment format=mdwn
+ username="http://svario.it/gioele"
+ nickname="gioele"
+ subject="comment 1"
+ date="2014-08-24T10:41:58Z"
+ content="""
+> git-annex implementation in a sane, interpreted, \"just works\" language, e.g. Python? Thanks.
+
+Good luck finding anything that works on OARM. Python itself does not support OABI:
+
+> This issue remains as \"won't fix\". ARM is supported; just OABI is not, and never will be. If anybody needs that, they will have to maintain their own fork of Python.
+
+(from <http://bugs.python.org/issue1762561#msg158974>)
+"""]]
diff --git a/doc/forum/git-annex_in_sane_language_for_mere_humans_of_us__63__/comment_2_a2b2183ee86377cdfef7c3acbe9552fb._comment b/doc/forum/git-annex_in_sane_language_for_mere_humans_of_us__63__/comment_2_a2b2183ee86377cdfef7c3acbe9552fb._comment
new file mode 100644
index 000000000..32318b404
--- /dev/null
+++ b/doc/forum/git-annex_in_sane_language_for_mere_humans_of_us__63__/comment_2_a2b2183ee86377cdfef7c3acbe9552fb._comment
@@ -0,0 +1,11 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawld54zdyk6b0W4jXnssSO_j2Nn3W1uVsUE"
+ nickname="Paul"
+ subject="comment 2"
+ date="2014-08-24T11:04:21Z"
+ content="""
+Python on this system \"just works\". That's because Python is a project with a real community, so if one pundit said \"not supported\", dozen of people shrugged and typed \"make\", then packed up result for thousands to use.
+
+But don't get carried away by OABI, that was just one random example how deployment of git-annex is problematic. There're bigger issues like community involvement, being able to investigate and resolve issues, submit patches, bring new working ideas, make git-annex development and lifecycle sustainable, in the end - as vividly cared by the author.
+
+"""]]
diff --git a/doc/forum/git-annex_in_sane_language_for_mere_humans_of_us__63__/comment_3_5605d42a68b3140cb660eb710ce5031e._comment b/doc/forum/git-annex_in_sane_language_for_mere_humans_of_us__63__/comment_3_5605d42a68b3140cb660eb710ce5031e._comment
new file mode 100644
index 000000000..8e613dd21
--- /dev/null
+++ b/doc/forum/git-annex_in_sane_language_for_mere_humans_of_us__63__/comment_3_5605d42a68b3140cb660eb710ce5031e._comment
@@ -0,0 +1,12 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawld54zdyk6b0W4jXnssSO_j2Nn3W1uVsUE"
+ nickname="Paul"
+ subject="comment 3"
+ date="2014-08-24T18:29:23Z"
+ content="""
+Sure, that's the plan. But first I'm doing my homework to understand how it got to that and how community copes with that. Maybe I don't get something and every open-source project should have a notice like: \"Installation from scratch. This is not recommended.\" (http://git-annex.branchable.com/install/). Interested in building software you run? Interested to help? Get lost, you won't get it. Am I surprised? Nope, I'm doing my homework and know where that Haskell thing came from. A piece of Microsoft was largely involved with it, so no surprise of such attitudes.
+
+Surely I'm not the only one who got jaundiced eye on git-annex: https://github.com/tv42/big : \"big is not like git-annex, because: it's not written in Haskell, so it might even work across distribution upgrades and platforms\". Certainly, stories of cvsup and unison, which are now where they should be - rest in peace, didn't help. So, once again, I'm interested to know how other people deal with this lack of proper compilation instructions, ability to get simple and easy tweaks, etc. - short of not using it, which seems to be a popular choice, despite all the git-annex coolness (I for one have been having its deployment in my queue fro half a year, instead of spending exactly a weekend to do tweaks I need and contribute them back).
+
+
+"""]]
diff --git a/doc/forum/git-annex_in_sane_language_for_mere_humans_of_us__63__/comment_4_f56508164c71b2080150bc354e5de4b7._comment b/doc/forum/git-annex_in_sane_language_for_mere_humans_of_us__63__/comment_4_f56508164c71b2080150bc354e5de4b7._comment
new file mode 100644
index 000000000..8afa4c6fb
--- /dev/null
+++ b/doc/forum/git-annex_in_sane_language_for_mere_humans_of_us__63__/comment_4_f56508164c71b2080150bc354e5de4b7._comment
@@ -0,0 +1,9 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawld54zdyk6b0W4jXnssSO_j2Nn3W1uVsUE"
+ nickname="Paul"
+ subject="comment 4"
+ date="2014-08-24T18:31:25Z"
+ content="""
+Previous comment was written in response to a comment suggesting me to rewrite it in Python myself - which was then removed for some reason.
+
+"""]]
diff --git a/doc/forum/git-annex_in_sane_language_for_mere_humans_of_us__63__/comment_5_c8cdb0faa342fe1f9407ad4c97e6bc3c._comment b/doc/forum/git-annex_in_sane_language_for_mere_humans_of_us__63__/comment_5_c8cdb0faa342fe1f9407ad4c97e6bc3c._comment
new file mode 100644
index 000000000..e58191a7f
--- /dev/null
+++ b/doc/forum/git-annex_in_sane_language_for_mere_humans_of_us__63__/comment_5_c8cdb0faa342fe1f9407ad4c97e6bc3c._comment
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="Ganwell"
+ ip="178.174.3.166"
+ subject="How I solved it..."
+ date="2014-08-26T23:03:09Z"
+ content="""
+I decided it was a bit harsh, so I removed comment. Here is how I solved problem:
+
+I have a server without much storage which runs the git-annex process, the data is stored on the NAS mounted via iSCSI. I never even thought of trying to compile git-annex on a NAS. I did things like that many years ago and it used to much time, whether the language was, common or not, didn't change much. Missing floating point units on the NAS killed performance of the programms I wanted to run anyways.
+"""]]
diff --git a/doc/forum/git-annex_in_sane_language_for_mere_humans_of_us__63__/comment_6_25ce5eddeb1b65aacd5d86e09c3719b8._comment b/doc/forum/git-annex_in_sane_language_for_mere_humans_of_us__63__/comment_6_25ce5eddeb1b65aacd5d86e09c3719b8._comment
new file mode 100644
index 000000000..f9fa78e38
--- /dev/null
+++ b/doc/forum/git-annex_in_sane_language_for_mere_humans_of_us__63__/comment_6_25ce5eddeb1b65aacd5d86e09c3719b8._comment
@@ -0,0 +1,13 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ ip="209.250.56.22"
+ subject="comment 6"
+ date="2014-09-16T19:19:00Z"
+ content="""
+There is too much negativity on this page, starting perhaps with its title.
+
+The \"this is not recommended\" is not because we don't want people to build git-annex from source. It's to try to dissuade users who just want to get git-annex installed, and who would be scared off by a transient build failure, from building from source, when there are many builds provided by Linux distributions, etc that would be better choices for them to get started. Hopefully the new page and new wording gets this across better: \"Experienced users should not find it too hard to build and install it from source.\"
+
+If someone wants to reimplement git-annex, or parts of it, I think that the existing documentation (eg [[internals]]) should get them most of the way there.
+
+"""]]
diff --git a/doc/forum/schedule_repository___91__expression__93__.mdwn b/doc/forum/schedule_repository___91__expression__93__.mdwn
new file mode 100644
index 000000000..0904dbb03
--- /dev/null
+++ b/doc/forum/schedule_repository___91__expression__93__.mdwn
@@ -0,0 +1 @@
+what sort of options can we use in the expression field? from the [git annex bible](http://git-annex.branchable.com/git-annex/) it suggests for incremental fscks, but I'm wondering if it can run shell scripts or `git annex importurl` lines too.
diff --git a/doc/forum/schedule_repository___91__expression__93__/comment_1_b123b657a92897017973927e3e47673b._comment b/doc/forum/schedule_repository___91__expression__93__/comment_1_b123b657a92897017973927e3e47673b._comment
new file mode 100644
index 000000000..a0c4e8222
--- /dev/null
+++ b/doc/forum/schedule_repository___91__expression__93__/comment_1_b123b657a92897017973927e3e47673b._comment
@@ -0,0 +1,12 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ ip="209.250.56.22"
+ subject="comment 1"
+ date="2014-09-16T18:13:18Z"
+ content="""
+Only fscking can be scheduled. From the man page:
+
+ These actions are available: \"fsck self\", \"fsck UUID\"
+
+It won't be expanded to allow arbitrary commands, because that would let anyone who you share an annex with schedule arbitrary commands to run on your computer..
+"""]]
diff --git a/doc/forum/special_remote_for_IMAP/comment_4_0f8e01c453afb02aebf44b3fb2c9a7c1._comment b/doc/forum/special_remote_for_IMAP/comment_4_0f8e01c453afb02aebf44b3fb2c9a7c1._comment
new file mode 100644
index 000000000..6e39fd730
--- /dev/null
+++ b/doc/forum/special_remote_for_IMAP/comment_4_0f8e01c453afb02aebf44b3fb2c9a7c1._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawmH7o6q2l99M-PQolOfbR3_i5B_jtTIcAE"
+ nickname="Giovanni"
+ subject="comment 4"
+ date="2014-09-12T18:57:07Z"
+ content="""
+Does this somehow scan the IMAP server for attachments already there?
+"""]]
diff --git a/doc/forum/usability:_creating_an_archive_on_a_new_external_drive.mdwn b/doc/forum/usability:_creating_an_archive_on_a_new_external_drive.mdwn
new file mode 100644
index 000000000..a6bc0b7bd
--- /dev/null
+++ b/doc/forum/usability:_creating_an_archive_on_a_new_external_drive.mdwn
@@ -0,0 +1,13 @@
+story: i got a new drive from the store. plug it in. it's recognized by XFCE and mounted automatically. turns out it's NTFS, but Debian doesn't seem to mind.
+
+go in the assistant, add it as an "External drive", make it a "full backup" and let it sync.
+
+expected result: i see files
+
+actual result: i see a bare git repository.
+
+if i first `git init` the directory so it's not bare, at least i get a better handle on it: i can sync with the assistant, then `git merge synced/master` to see the files.
+
+really confusing to me, sorry if it's a dupe...
+
+workaround: use the commandline: `git clone <repo>` and `git annex get`. --[[anarcat]]
diff --git a/doc/forum/usability:_creating_an_archive_on_a_new_external_drive/comment_1_27b5283c65c402f330263426e4ca6ac1._comment b/doc/forum/usability:_creating_an_archive_on_a_new_external_drive/comment_1_27b5283c65c402f330263426e4ca6ac1._comment
new file mode 100644
index 000000000..1b5508f97
--- /dev/null
+++ b/doc/forum/usability:_creating_an_archive_on_a_new_external_drive/comment_1_27b5283c65c402f330263426e4ca6ac1._comment
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ ip="209.250.56.22"
+ subject="comment 1"
+ date="2014-09-16T18:07:54Z"
+ content="""
+I started to make this change, and then I realized this problem: If a non-bare repository is made on an external drive, then to the user this is another place they can edit their files. Which means they will expect their changes made there to be committed. Which is highly problematic, because the assistant cannot be left running on an external drive or it won't be able to be unmounted. Or, a periodic `git annex add; git annex sync` could be run on the external drive, but that is a more expensive process (especially when run on a slow drive) and would not meet the expectations of users of the assistant that their changes will promptly propagate.
+
+So, I feel that leaving bare repositories is actually the best choice.
+"""]]
diff --git a/doc/forum/usability:_creating_an_archive_on_a_new_external_drive/comment_2_b3a6b5ff0aaddd78903fc7bc7fbd6ee2._comment b/doc/forum/usability:_creating_an_archive_on_a_new_external_drive/comment_2_b3a6b5ff0aaddd78903fc7bc7fbd6ee2._comment
new file mode 100644
index 000000000..e264c8f08
--- /dev/null
+++ b/doc/forum/usability:_creating_an_archive_on_a_new_external_drive/comment_2_b3a6b5ff0aaddd78903fc7bc7fbd6ee2._comment
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="https://id.koumbit.net/anarcat"
+ ip="70.83.139.100"
+ subject="comment 2"
+ date="2014-09-16T20:35:23Z"
+ content="""
+i wouldn't expect those changes to be committed. it's an external drive, and unless i manually sync it, it should take into account my changes.
+
+i am more surprised by the bare repository than i would be surprised by my changes not propagating back, i think. --[[anarcat]]
+"""]]
diff --git a/doc/future_proofing/comment_1_2614eb2e9b7b23fa9bb4251c0d025909._comment b/doc/future_proofing/comment_1_2614eb2e9b7b23fa9bb4251c0d025909._comment
new file mode 100644
index 000000000..dbe429fa9
--- /dev/null
+++ b/doc/future_proofing/comment_1_2614eb2e9b7b23fa9bb4251c0d025909._comment
@@ -0,0 +1,16 @@
+[[!comment format=mdwn
+ username="https://launchpad.net/~electrichead"
+ nickname="electrichead"
+ subject="Regarding accessing files in a time capsule..."
+ date="2014-08-25T15:51:00Z"
+ content="""
+Imagine a rather contrived doomsday scenario: the file paths and/or basenames are important and, for some reason, the symlinks are not present (perhaps they got deleted, or aren't supported). `git` and `git-annex` no longer exist and let's assume knowledge of `git` internals is not useful here. All the *content* is there, stored under hashed file names under `.git/annex/objects`.
+
+I may be missing something obvious but I think options for restoring file paths include:
+
+ - direct mode bypasses this issue; all the files are right there.
+ - the WORM backend perhaps carries enough information in the object file names to work with.
+ - file content/metadata may be sufficient to easily recreate a sensible directory structure in some cases, so no worries.
+
+These first two options may represent compromises in various use-cases and the last may not be applicable or, if it is, practical. The object-path mapping could trivially be backed up in plain text in lieu of these. Like I said, I may be overlooking something here that makes this unnecessary or even a non-concern (actually, I've convinced myself it's not a serious concern in most of the use-cases I've considered, but crossing i's and dotting t's).
+"""]]
diff --git a/doc/git-annex.mdwn b/doc/git-annex.mdwn
index 673e86fc9..71f0c0beb 100644
--- a/doc/git-annex.mdwn
+++ b/doc/git-annex.mdwn
@@ -64,7 +64,7 @@ subdirectories).
Adds files in the path to the annex. If no path is specified, adds
files from the current directory and below.
-
+
Files that are already checked into git, or that git has been configured
to ignore will be silently skipped. (Use `--force` to add ignored files.)
@@ -79,6 +79,10 @@ subdirectories).
Normally git-annex will choose which repository to copy the content from,
but you can override this using the `--from` option.
+
+ Rather than specifying a filename, the `--all` option can be used to
+ get all available versions of all files, or the --key=KEY`
+ option can be used to get a specified key.
* `drop [path ...]`
@@ -272,10 +276,10 @@ subdirectories).
(Other available variables: feedauthor, itemauthor, itemsummary, itemdescription, itemrights, itemid, itempubdate, title, author)
The `--relaxed` and `--fast` options behave the same as they do in addurl.
-
+
When quvi is installed, links in the feed are tested to see if they
are on a video hosting site, and the video is downloaded. This allows
- importing eg, youtube playlists.
+ importing e.g., youtube playlists.
* `watch`
@@ -319,7 +323,7 @@ subdirectories).
This disables running a local web browser, and outputs the url you
can use to open the webapp.
- When using the webapp on a remote computer, you'll almost certianly
+ When using the webapp on a remote computer, you'll almost certainly
want to enable HTTPS. The webapp will use HTTPS if it finds
a .git/annex/privkey.pem and .git/annex/certificate.pem. Here's
one way to generate those files, using a self-signed certificate:
@@ -388,7 +392,7 @@ subdirectories).
The name of the remote is the same name used when originally
creating that remote with "initremote". Run "git annex enableremote"
- with no parameters to get a list of special remote names.
+ without any name to get a list of special remote names.
Some special remotes may need parameters to be specified every time.
For example, the directory special remote requires a directory= parameter.
@@ -425,7 +429,7 @@ subdirectories).
Run without a number to get the current value.
When git-annex is asked to drop a file, it first verifies that the
- required number of copies can be satisfied amoung all the other
+ required number of copies can be satisfied among all the other
repositories that have a copy of the file.
This can be overridden on a per-file basis by the annex.numcopies setting
@@ -509,7 +513,7 @@ subdirectories).
* `fsck [path ...]`
With no parameters, this command checks the whole annex for consistency,
- and warns about or fixes any problems found. This is a good compliment to
+ and warns about or fixes any problems found. This is a good complement to
`git fsck`.
With parameters, only the specified files are checked.
@@ -645,7 +649,7 @@ subdirectories).
`--format`. The default output format is the same as `--format='${file}\\n'`
These variables are available for use in formats: file, key, backend,
- bytesize, humansize, keyname, hashdirlower, hashdirmixed, mtime (for
+ bytesize, humansize, keyname, hashdirlower, hashdirmixed, mtime (for
the mtime field of a WORM key).
* `whereis [path ...]`
@@ -715,13 +719,13 @@ subdirectories).
* `metadata [path ...] [-s field=value -s field+=value -s field-=value ...] [-g field]`
- The content of a file can have any number of metadata fields
+ The content of a file can have any number of metadata fields
attached to it to describe it. Each metadata field can in turn
- have any number of values.
-
+ have any number of values.
+
This command can be used to set metadata, or show the currently set
metadata.
-
+
To show current metadata, run without any -s parameters. The --json
option will enable json output.
@@ -750,7 +754,7 @@ subdirectories).
and checks out the view branch. Only files in the current branch whose
metadata matches all the specified field values and tags will be
shown in the view.
-
+
Multiple values for a metadata field can be specified, either by using
a glob (`field="*"`) or by listing each wanted value. The resulting view
will put files in subdirectories according to the value of their fields.
@@ -785,9 +789,9 @@ subdirectories).
Changes the current view, adding an additional level of directories
to categorize the files.
- For example, when the view is by author/tag, `vadd year=*` will
- change it to year/author/tag.
-
+ For example, when the view is by author/tag, `vadd year=*` will
+ change it to year/author/tag.
+
So will `vadd year=2014 year=2013`, but limiting the years in view
to only those two.
@@ -934,7 +938,7 @@ subdirectories).
* `findref [ref]`
This is similar to the find command, but instead of finding files in the
- current work tree, it finds files in the specified git ref.
+ current work tree, it finds files in the specified git ref.
Most MATCHING OPTIONS can be used with findref, to limit the files it
finds. However, the --include and --exclude options will not work.
@@ -1125,7 +1129,7 @@ subdirectories).
Caused a desktop notification to be displayed after each successful
file download and upload.
- (Only supported on some platforms, eg Linux with dbus. A no-op when
+ (Only supported on some platforms, e.g. Linux with dbus. A no-op when
not supported.)
* `--notify-start`
@@ -1316,7 +1320,7 @@ to e.g., fsck a repository on a removable drive when the drive gets
connected.
The scheduled jobs can be configured using `git annex vicfg` or
-`git annex schedule`.
+`git annex schedule`.
These actions are available: "fsck self", "fsck UUID" (where UUID
is the UUID of a remote to fsck). After the action comes the duration
@@ -1372,7 +1376,7 @@ Here are all the supported configuration settings.
This is a deprecated setting. You should instead use the
`git annex numcopies` command to configure how many copies of files
- are kept acros all repositories.
+ are kept across all repositories.
This config setting is only looked at when `git annex numcopies` has
never been configured.
@@ -1382,8 +1386,8 @@ Here are all the supported configuration settings.
* `annex.genmetadata`
Set this to `true` to make git-annex automatically generate some metadata
- when adding files to the repository.
-
+ when adding files to the repository.
+
In particular, it stores year and month metadata, from the file's
modification date.
@@ -1424,11 +1428,24 @@ Here are all the supported configuration settings.
By default, git-annex automatically commits data to the git-annex branch
after each command is run. If you have a series
- of commands that you want to make a single commit, you can
+ of commands that you want to make a single commit, you can
run the commands with `-c annex.alwayscommit=false`. You can later
commit the data by running `git annex merge` (or by automatic merges)
or `git annex sync`.
+* `annex.hardlink`
+
+ Set this to `true` to make file contents be hard linked into the
+ repository when possible, instead of a more expensive copy.
+
+ Use with caution -- This can invalidate numcopies counting, since
+ with hard links, fewer copies of a file can exist. So, it is a good
+ idea to mark a repository using this setting as untrusted.
+
+ When a repository is set up using `git clone --shared`, git-annex init
+ will automatically set annex.hardlink and mark the repository as
+ untrusted.
+
* `annex.delayadd`
Makes the watch and assistant commands delay for the specified number of
@@ -1441,7 +1458,7 @@ Here are all the supported configuration settings.
Controls what the assistant does about unused file contents
that are stored in the repository.
-
+
The default is `false`, which causes
all old and unused file contents to be retained, unless the assistant
is able to move them to some other repository (such as a backup repository).
@@ -1611,7 +1628,7 @@ Here are all the supported configuration settings.
These options are passed after other applicable rsync options,
so can be used to override them. For example, to limit upload bandwidth
- to 10Kbye/s, set `--bwlimit 10`.
+ to 10Kbyte/s, set `--bwlimit 10`.
* `remote.<name>.annex-rsync-download-options`
@@ -1686,7 +1703,7 @@ Here are all the supported configuration settings.
In the command line, %file is replaced with the file that should be
erased.
- For example, to use the wipe command, set it to `wipe -f %file`
+ For example, to use the wipe command, set it to `wipe -f %file`.
* `remote.<name>.rsyncurl`
@@ -1781,7 +1798,7 @@ not honor the settings from .gitattributes.
Also note that when using views, only the toplevel .gitattributes file is
preserved in the view, so other settings in other files won't have any
-efffect.
+effect.
# FILES
diff --git a/doc/install.mdwn b/doc/install.mdwn
index 7fe21c9ba..adaaa3eb6 100644
--- a/doc/install.mdwn
+++ b/doc/install.mdwn
@@ -22,15 +22,13 @@ detailed instructions | quick install
All the downloads above use https for security. For added security, see
[[verifying_downloads]].
-## Using cabal
+## Building it yourself
-As a haskell package, git-annex can be installed from source pretty easily
-[[using cabal|cabal]].
-
-## Installation from scratch
-
-This is not recommended, but if you really want to, see [[fromscratch]].
+git-annex is [[Free Software|license]], written in [Haskell](http://www.haskell.org/).
+Experienced users should not find it too hard to build and install
+it [[from source|fromsource]].
## See also
+
[[autobuild overview|builds]]
diff --git a/doc/install/Linux_standalone.mdwn b/doc/install/Linux_standalone.mdwn
index f7aca5b9a..fbb3b97ab 100644
--- a/doc/install/Linux_standalone.mdwn
+++ b/doc/install/Linux_standalone.mdwn
@@ -1,5 +1,5 @@
If your Linux distribution does not have git-annex packaged up for you,
-you can either build it [[fromscratch]], or you can use a handy
+you can either build it [[fromsource]], or you can use a handy
prebuilt tarball of the most recent release.
This tarball should work on most Linux systems. It has basically no
diff --git a/doc/install/OSX/porting.mdwn b/doc/install/OSX/porting.mdwn
index 2003af684..7aeb1c12c 100644
--- a/doc/install/OSX/porting.mdwn
+++ b/doc/install/OSX/porting.mdwn
@@ -3,4 +3,5 @@ from eg [[HomeBrew]] or the regular [[OSX]] prebuilt app, you
can try building git-annex from source on OSX, using haskell's cabal package
manager.
-For general instructions for using cabal, see [[this page|/install/cabal]].
+For general instructions on building git-annex from source see
+[[install/fromsource]]
diff --git a/doc/install/Windows.mdwn b/doc/install/Windows.mdwn
index 79aaace92..273fafbf9 100644
--- a/doc/install/Windows.mdwn
+++ b/doc/install/Windows.mdwn
@@ -1,6 +1,7 @@
git-annex now does Windows!
-* First, [install git](http://git-scm.com/downloads) (msysgit 1.9 or newer is needed)
+* First, [install git](http://git-scm.com/downloads) (msysgit 1.9 or newer is needed)
+ _Be sure to tell the msysgit installer to add git to the PATH._
* Then, [install git-annex](https://downloads.kitenet.net/git-annex/windows/current/)
This port is now in reasonably good shape for command-line use of
diff --git a/doc/install/cabal.mdwn b/doc/install/cabal.mdwn
deleted file mode 100644
index 3270dd0f9..000000000
--- a/doc/install/cabal.mdwn
+++ /dev/null
@@ -1,58 +0,0 @@
-As a haskell package, git-annex can be installed using cabal.
-
-This involves building a lot of haskell packages from source, and so it has
-a lot of moving parts, and it's not uncommon for it to be broken from time
-to time.
-
-If you are not comfortable tracking down and dealing with library build
-problems, installing git-annex with cabal is probably not the right choice
-for you!
-
-## prerequisites
-
-Start by installing the [Haskell Platform][]. In Debian, this is as
-simple as:
-
- sudo apt-get install haskell-platform
-
- [Haskell Platform]: http://hackage.haskell.org/platform/
-
-## minimal build
-
-This builds git-annex without some features that require C libraries, that
-can be harder to get installed. This is plenty to get started using it,
-although it does not include the assistant or webapp.
-
- cabal update
- PATH=$HOME/bin:$PATH
- cabal install git-annex --bindir=$HOME/bin -f"-assistant -webapp -webdav -pairing -xmpp -dns"
-
-## full build
-
-To build with all features enabled, including the assistant and webapp,
-you will need to install several C libraries and their headers,
-including libgnutls, libgsasl, libxml2, and zlib. Then run:
-
- cabal update
- PATH=$HOME/bin:$PATH
- cabal install c2hs --bindir=$HOME/bin
- cabal install git-annex --bindir=$HOME/bin
-
-## building from git checkout
-
-But maybe you want something newer (or older). Then [[download]] the version
-you want, and use cabal as follows inside its source tree:
-
- cabal update
- PATH=$HOME/bin:$PATH
- cabal install c2hs --bindir=$HOME/bin
- cabal install --only-dependencies
- cabal configure
- cabal build
- cabal install --bindir=$HOME/bin
-
-## EKG
-
-When building with cabal, you can optionally enable the
-[[EKG monitoring interface|ekg]]. This is great for debugging resource
-usage problems.
diff --git a/doc/install/fromscratch.mdwn b/doc/install/fromscratch.mdwn
deleted file mode 100644
index 46ee5a055..000000000
--- a/doc/install/fromscratch.mdwn
+++ /dev/null
@@ -1,27 +0,0 @@
-To install git-annex from scratch, you need a lot of stuff. Really
-quite a lot.
-
-* Haskell stuff
- * [The Haskell Platform](http://haskell.org/platform/) (GHC 7.4 or newer)
- * A ton of haskell libraries. Rather than try to list them all here,
- see git-annex.cabal. Probably the easiest way to install them:
- `cabal update; cabal install git-annex --only-dependencies`
-* Shell commands
- * [git](http://git-scm.com/) (1.7.2 or newer; 1.8.5 or newer recommended)
- * [xargs](http://savannah.gnu.org/projects/findutils/)
- * [rsync](http://rsync.samba.org/)
- * [curl](http://http://curl.haxx.se/) (optional, but recommended)
- * [wget](http://www.gnu.org/software/wget/) (optional)
- * [sha*sum](ftp://ftp.gnu.org/gnu/coreutils/) (optional)
- * [gpg](http://gnupg.org/) (optional; needed for encryption)
- * [lsof](ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/)
- (optional; recommended for watch mode)
- * [gcrypt](https://github.com/joeyh/git-remote-gcrypt)
- (optional)
- * [nocache](https://github.com/Feh/nocache)
- (optional)
- * multicast DNS support, provided on linux by [nss-mdns](http://www.0pointer.de/lennart/projects/nss-mdns/)
- (optional; recommended for the assistant to support pairing well)
- * [ikiwiki](http://ikiwiki.info) (optional; used to build the docs)
-
-Then just [[download]] git-annex and run: `make; make install`
diff --git a/doc/install/fromsource.mdwn b/doc/install/fromsource.mdwn
new file mode 100644
index 000000000..98a517b14
--- /dev/null
+++ b/doc/install/fromsource.mdwn
@@ -0,0 +1,74 @@
+So you want to build git-annex from source. This is encouraged for
+users with experience building code from source. But the build may
+require some care and feeding. This page will start with the easy
+methods and work up to the harder ones.
+
+## prerequisites
+
+Start by installing the
+[Haskell Platform](http://hackage.haskell.org/platform/).
+
+In Debian, this is as simple as:
+
+ sudo apt-get install haskell-platform
+
+## downloading the source code
+
+The easiest way is using git; see [[download]] or just:
+
+ git clone git://git-annex.branchable.com/ git-annex
+
+Or, you can use cabal to get the source code:
+
+ cabal update; cabal unpack git-annex
+
+## building from source on Debian
+
+This is the method used by git-annex's author, and so it's the one most
+likely to work without problems.
+
+First, install everything git-annex needs to build:
+
+ sudo apt-get build-dep git-annex
+
+Now you can build git-annex by running either `make` or `cabal build`
+inside the source tree.
+
+## minimal build with cabal
+
+This can be done anywhere, and builds git-annex without some features that
+require C libraries, that can be harder to get installed. This is plenty to
+get started using it, although it does not include the assistant or webapp.
+
+Inside the source tree, run:
+
+ cabal configure -f"-assistant -webapp -webdav -pairing -xmpp -dns"
+ cabal install --only-dependencies
+ cabal build
+ PATH=$HOME/bin:$PATH
+ cabal install --bindir=$HOME/bin
+
+Be warned that this involves building a lot of Haskell libraries from
+source, and so it has a lot of moving parts, and it's not uncommon for it
+to be broken from time to time.
+
+## full build with cabal
+
+To build with all features enabled, including the assistant and webapp,
+you will need to install several C libraries and their headers,
+including libgnutls, libgsasl, libxml2, and zlib. How to do that for
+your OS is beyond the scope of this page.
+
+Once the C libraries are installed, run inside the source tree:
+
+ cabal configure
+ cabal install --only-dependencies
+ cabal build
+ PATH=$HOME/bin:$PATH
+ cabal install --bindir=$HOME/bin
+
+## EKG
+
+When building with cabal, you can optionally enable the
+[[EKG monitoring interface|ekg]]. This is great for debugging resource
+usage problems. Just pass `-f+EKG` to `cabal configure`
diff --git a/doc/install/cabal/comment_10_7ebe353b05d4df29897dc9a4f45c8a91._comment b/doc/install/fromsource/comment_10_7ebe353b05d4df29897dc9a4f45c8a91._comment
index 5b813baba..5b813baba 100644
--- a/doc/install/cabal/comment_10_7ebe353b05d4df29897dc9a4f45c8a91._comment
+++ b/doc/install/fromsource/comment_10_7ebe353b05d4df29897dc9a4f45c8a91._comment
diff --git a/doc/install/cabal/comment_11_0d06702e6e0ae3cd331cf748a9f6f273._comment b/doc/install/fromsource/comment_11_0d06702e6e0ae3cd331cf748a9f6f273._comment
index 94919710f..94919710f 100644
--- a/doc/install/cabal/comment_11_0d06702e6e0ae3cd331cf748a9f6f273._comment
+++ b/doc/install/fromsource/comment_11_0d06702e6e0ae3cd331cf748a9f6f273._comment
diff --git a/doc/install/cabal/comment_12_b93ca271dffca3f948645d3e1326c1d9._comment b/doc/install/fromsource/comment_12_b93ca271dffca3f948645d3e1326c1d9._comment
index 8d9c97898..8d9c97898 100644
--- a/doc/install/cabal/comment_12_b93ca271dffca3f948645d3e1326c1d9._comment
+++ b/doc/install/fromsource/comment_12_b93ca271dffca3f948645d3e1326c1d9._comment
diff --git a/doc/install/cabal/comment_13_3dac019cda71bf99878c0a1d9382323b._comment b/doc/install/fromsource/comment_13_3dac019cda71bf99878c0a1d9382323b._comment
index 80e3a6ad1..80e3a6ad1 100644
--- a/doc/install/cabal/comment_13_3dac019cda71bf99878c0a1d9382323b._comment
+++ b/doc/install/fromsource/comment_13_3dac019cda71bf99878c0a1d9382323b._comment
diff --git a/doc/install/cabal/comment_14_14b46470593f84f8c3768a91cb77bdab._comment b/doc/install/fromsource/comment_14_14b46470593f84f8c3768a91cb77bdab._comment
index 93fca1653..93fca1653 100644
--- a/doc/install/cabal/comment_14_14b46470593f84f8c3768a91cb77bdab._comment
+++ b/doc/install/fromsource/comment_14_14b46470593f84f8c3768a91cb77bdab._comment
diff --git a/doc/install/cabal/comment_15_c3a5b0aad28a90e0bb8da31a430578eb._comment b/doc/install/fromsource/comment_15_c3a5b0aad28a90e0bb8da31a430578eb._comment
index fc64af234..fc64af234 100644
--- a/doc/install/cabal/comment_15_c3a5b0aad28a90e0bb8da31a430578eb._comment
+++ b/doc/install/fromsource/comment_15_c3a5b0aad28a90e0bb8da31a430578eb._comment
diff --git a/doc/install/cabal/comment_16_4faf214f97f9516898d7c17d743ef825._comment b/doc/install/fromsource/comment_16_4faf214f97f9516898d7c17d743ef825._comment
index be14b3908..be14b3908 100644
--- a/doc/install/cabal/comment_16_4faf214f97f9516898d7c17d743ef825._comment
+++ b/doc/install/fromsource/comment_16_4faf214f97f9516898d7c17d743ef825._comment
diff --git a/doc/install/cabal/comment_17_2a9d6807a3a13815c824985521757167._comment b/doc/install/fromsource/comment_17_2a9d6807a3a13815c824985521757167._comment
index c0b570dfb..c0b570dfb 100644
--- a/doc/install/cabal/comment_17_2a9d6807a3a13815c824985521757167._comment
+++ b/doc/install/fromsource/comment_17_2a9d6807a3a13815c824985521757167._comment
diff --git a/doc/install/cabal/comment_18_1efa0c7a963ec452fc6336fbe4964f6e._comment b/doc/install/fromsource/comment_18_1efa0c7a963ec452fc6336fbe4964f6e._comment
index e3a523e22..e3a523e22 100644
--- a/doc/install/cabal/comment_18_1efa0c7a963ec452fc6336fbe4964f6e._comment
+++ b/doc/install/fromsource/comment_18_1efa0c7a963ec452fc6336fbe4964f6e._comment
diff --git a/doc/install/cabal/comment_19_6f42f9234f9ff6a2ca6bbb4d2643843e._comment b/doc/install/fromsource/comment_19_6f42f9234f9ff6a2ca6bbb4d2643843e._comment
index 27a3e8c62..27a3e8c62 100644
--- a/doc/install/cabal/comment_19_6f42f9234f9ff6a2ca6bbb4d2643843e._comment
+++ b/doc/install/fromsource/comment_19_6f42f9234f9ff6a2ca6bbb4d2643843e._comment
diff --git a/doc/install/fromscratch/comment_1_9d085e460553fa045999ab7cb945cdec._comment b/doc/install/fromsource/comment_1_9d085e460553fa045999ab7cb945cdec._comment
index 1b68d0f8c..1b68d0f8c 100644
--- a/doc/install/fromscratch/comment_1_9d085e460553fa045999ab7cb945cdec._comment
+++ b/doc/install/fromsource/comment_1_9d085e460553fa045999ab7cb945cdec._comment
diff --git a/doc/install/cabal/comment_1_f04df6bcd50d1d01eb34868bb00ac35c._comment b/doc/install/fromsource/comment_1_f04df6bcd50d1d01eb34868bb00ac35c._comment
index b280d3d3d..b280d3d3d 100644
--- a/doc/install/cabal/comment_1_f04df6bcd50d1d01eb34868bb00ac35c._comment
+++ b/doc/install/fromsource/comment_1_f04df6bcd50d1d01eb34868bb00ac35c._comment
diff --git a/doc/install/cabal/comment_20_0f553be2a4c666e3bed58b2bce549406._comment b/doc/install/fromsource/comment_20_0f553be2a4c666e3bed58b2bce549406._comment
index 288c0e017..288c0e017 100644
--- a/doc/install/cabal/comment_20_0f553be2a4c666e3bed58b2bce549406._comment
+++ b/doc/install/fromsource/comment_20_0f553be2a4c666e3bed58b2bce549406._comment
diff --git a/doc/install/cabal/comment_21_f91a6ec21e96eced73ea9579fd8cbd15._comment b/doc/install/fromsource/comment_21_f91a6ec21e96eced73ea9579fd8cbd15._comment
index ef8a3d2a3..ef8a3d2a3 100644
--- a/doc/install/cabal/comment_21_f91a6ec21e96eced73ea9579fd8cbd15._comment
+++ b/doc/install/fromsource/comment_21_f91a6ec21e96eced73ea9579fd8cbd15._comment
diff --git a/doc/install/cabal/comment_22_2f27b78215f97ade1986ca806c634cb3._comment b/doc/install/fromsource/comment_22_2f27b78215f97ade1986ca806c634cb3._comment
index d7ff05617..d7ff05617 100644
--- a/doc/install/cabal/comment_22_2f27b78215f97ade1986ca806c634cb3._comment
+++ b/doc/install/fromsource/comment_22_2f27b78215f97ade1986ca806c634cb3._comment
diff --git a/doc/install/cabal/comment_23_c34d2b1d95830a3e58671a5b566a1758._comment b/doc/install/fromsource/comment_23_c34d2b1d95830a3e58671a5b566a1758._comment
index 03a5b87ce..03a5b87ce 100644
--- a/doc/install/cabal/comment_23_c34d2b1d95830a3e58671a5b566a1758._comment
+++ b/doc/install/fromsource/comment_23_c34d2b1d95830a3e58671a5b566a1758._comment
diff --git a/doc/install/cabal/comment_24_40cbde8ec067b3a860e6df1a9bea5f76._comment b/doc/install/fromsource/comment_24_40cbde8ec067b3a860e6df1a9bea5f76._comment
index 3bb160546..3bb160546 100644
--- a/doc/install/cabal/comment_24_40cbde8ec067b3a860e6df1a9bea5f76._comment
+++ b/doc/install/fromsource/comment_24_40cbde8ec067b3a860e6df1a9bea5f76._comment
diff --git a/doc/install/cabal/comment_25_8a7664e6f9271718dc607a0782366c5b._comment b/doc/install/fromsource/comment_25_8a7664e6f9271718dc607a0782366c5b._comment
index 929956ede..929956ede 100644
--- a/doc/install/cabal/comment_25_8a7664e6f9271718dc607a0782366c5b._comment
+++ b/doc/install/fromsource/comment_25_8a7664e6f9271718dc607a0782366c5b._comment
diff --git a/doc/install/cabal/comment_26_bd455c732639728bce2bfc39e32871d2._comment b/doc/install/fromsource/comment_26_bd455c732639728bce2bfc39e32871d2._comment
index 5b1f06023..5b1f06023 100644
--- a/doc/install/cabal/comment_26_bd455c732639728bce2bfc39e32871d2._comment
+++ b/doc/install/fromsource/comment_26_bd455c732639728bce2bfc39e32871d2._comment
diff --git a/doc/install/cabal/comment_27_c080e9239b6eec88d329c28da7bb4141._comment b/doc/install/fromsource/comment_27_c080e9239b6eec88d329c28da7bb4141._comment
index 4c007c9ad..4c007c9ad 100644
--- a/doc/install/cabal/comment_27_c080e9239b6eec88d329c28da7bb4141._comment
+++ b/doc/install/fromsource/comment_27_c080e9239b6eec88d329c28da7bb4141._comment
diff --git a/doc/install/cabal/comment_28_15951dd070a675300420eea137a28ef9._comment b/doc/install/fromsource/comment_28_15951dd070a675300420eea137a28ef9._comment
index 19a570cae..19a570cae 100644
--- a/doc/install/cabal/comment_28_15951dd070a675300420eea137a28ef9._comment
+++ b/doc/install/fromsource/comment_28_15951dd070a675300420eea137a28ef9._comment
diff --git a/doc/install/cabal/comment_29_ac082dca67f4a29b06070c0283130f52._comment b/doc/install/fromsource/comment_29_ac082dca67f4a29b06070c0283130f52._comment
index 524a0db0c..524a0db0c 100644
--- a/doc/install/cabal/comment_29_ac082dca67f4a29b06070c0283130f52._comment
+++ b/doc/install/fromsource/comment_29_ac082dca67f4a29b06070c0283130f52._comment
diff --git a/doc/install/cabal/comment_2_a69d17c55e56a707ec6606d5cdddee25._comment b/doc/install/fromsource/comment_2_a69d17c55e56a707ec6606d5cdddee25._comment
index 5a7beea37..5a7beea37 100644
--- a/doc/install/cabal/comment_2_a69d17c55e56a707ec6606d5cdddee25._comment
+++ b/doc/install/fromsource/comment_2_a69d17c55e56a707ec6606d5cdddee25._comment
diff --git a/doc/install/fromscratch/comment_2_b7954521d9ab40622b665f278dd72e17._comment b/doc/install/fromsource/comment_2_b7954521d9ab40622b665f278dd72e17._comment
index 949ee0abf..949ee0abf 100644
--- a/doc/install/fromscratch/comment_2_b7954521d9ab40622b665f278dd72e17._comment
+++ b/doc/install/fromsource/comment_2_b7954521d9ab40622b665f278dd72e17._comment
diff --git a/doc/install/cabal/comment_30_ad639c07cb79e89406e95c1dafce3a01._comment b/doc/install/fromsource/comment_30_ad639c07cb79e89406e95c1dafce3a01._comment
index f068944b0..f068944b0 100644
--- a/doc/install/cabal/comment_30_ad639c07cb79e89406e95c1dafce3a01._comment
+++ b/doc/install/fromsource/comment_30_ad639c07cb79e89406e95c1dafce3a01._comment
diff --git a/doc/install/cabal/comment_31_4763b24a29627d55f465b9ea260ea7ec._comment b/doc/install/fromsource/comment_31_4763b24a29627d55f465b9ea260ea7ec._comment
index 224c1dc19..224c1dc19 100644
--- a/doc/install/cabal/comment_31_4763b24a29627d55f465b9ea260ea7ec._comment
+++ b/doc/install/fromsource/comment_31_4763b24a29627d55f465b9ea260ea7ec._comment
diff --git a/doc/install/cabal/comment_32_1d34c294486c85b1149675fa5861ae35._comment b/doc/install/fromsource/comment_32_1d34c294486c85b1149675fa5861ae35._comment
index 8b2ae67f9..8b2ae67f9 100644
--- a/doc/install/cabal/comment_32_1d34c294486c85b1149675fa5861ae35._comment
+++ b/doc/install/fromsource/comment_32_1d34c294486c85b1149675fa5861ae35._comment
diff --git a/doc/install/cabal/comment_33_8d4dfc33cada6091c30d3a43ce404b8b._comment b/doc/install/fromsource/comment_33_8d4dfc33cada6091c30d3a43ce404b8b._comment
index 8fab5a45f..8fab5a45f 100644
--- a/doc/install/cabal/comment_33_8d4dfc33cada6091c30d3a43ce404b8b._comment
+++ b/doc/install/fromsource/comment_33_8d4dfc33cada6091c30d3a43ce404b8b._comment
diff --git a/doc/install/cabal/comment_34_38451e751add6daf479b559c4b6a7c61._comment b/doc/install/fromsource/comment_34_38451e751add6daf479b559c4b6a7c61._comment
index 619e79012..619e79012 100644
--- a/doc/install/cabal/comment_34_38451e751add6daf479b559c4b6a7c61._comment
+++ b/doc/install/fromsource/comment_34_38451e751add6daf479b559c4b6a7c61._comment
diff --git a/doc/install/cabal/comment_35_4d44e4531e6686bd340f26836ad40026._comment b/doc/install/fromsource/comment_35_4d44e4531e6686bd340f26836ad40026._comment
index 899e4fc01..899e4fc01 100644
--- a/doc/install/cabal/comment_35_4d44e4531e6686bd340f26836ad40026._comment
+++ b/doc/install/fromsource/comment_35_4d44e4531e6686bd340f26836ad40026._comment
diff --git a/doc/install/cabal/comment_36_2a095a5af53a356bd29abd22a9cb1bea._comment b/doc/install/fromsource/comment_36_2a095a5af53a356bd29abd22a9cb1bea._comment
index f6e0d8503..f6e0d8503 100644
--- a/doc/install/cabal/comment_36_2a095a5af53a356bd29abd22a9cb1bea._comment
+++ b/doc/install/fromsource/comment_36_2a095a5af53a356bd29abd22a9cb1bea._comment
diff --git a/doc/install/cabal/comment_37_f33e1a4575dccc20b0d3d7c00e6db709._comment b/doc/install/fromsource/comment_37_f33e1a4575dccc20b0d3d7c00e6db709._comment
index daf7d0b5a..daf7d0b5a 100644
--- a/doc/install/cabal/comment_37_f33e1a4575dccc20b0d3d7c00e6db709._comment
+++ b/doc/install/fromsource/comment_37_f33e1a4575dccc20b0d3d7c00e6db709._comment
diff --git a/doc/install/cabal/comment_38_5c1e96221154a4ae4ebd636232044ced._comment b/doc/install/fromsource/comment_38_5c1e96221154a4ae4ebd636232044ced._comment
index 7c44518d9..7c44518d9 100644
--- a/doc/install/cabal/comment_38_5c1e96221154a4ae4ebd636232044ced._comment
+++ b/doc/install/fromsource/comment_38_5c1e96221154a4ae4ebd636232044ced._comment
diff --git a/doc/install/fromsource/comment_39_a86057d7e6d47113330f79e1812c3a5d._comment b/doc/install/fromsource/comment_39_a86057d7e6d47113330f79e1812c3a5d._comment
new file mode 100644
index 000000000..7573b4784
--- /dev/null
+++ b/doc/install/fromsource/comment_39_a86057d7e6d47113330f79e1812c3a5d._comment
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawkftzaCvV7EDKVDfJhsQZ3E1Vn-0db516w"
+ nickname="Edward"
+ subject="GHC 7.8 Issue"
+ date="2014-08-20T20:06:01Z"
+ content="""
+Just an FYI: I tried to \"cabal install --only-dependencies\" with GHC 7.8 and it fails because DAV-1.0.1 is pulling in lens-3.10.3 which is not compatible with GHC 7.8 due to changes in Typeable.
+
+I don't have enough experience with cabal to figure out why it's not trying to use a newer version of lens.
+"""]]
diff --git a/doc/install/cabal/comment_3_55bed050bdb768543dbe1b86edec057d._comment b/doc/install/fromsource/comment_3_55bed050bdb768543dbe1b86edec057d._comment
index 7a53b2b64..7a53b2b64 100644
--- a/doc/install/cabal/comment_3_55bed050bdb768543dbe1b86edec057d._comment
+++ b/doc/install/fromsource/comment_3_55bed050bdb768543dbe1b86edec057d._comment
diff --git a/doc/install/fromscratch/comment_3_a3bf3ce57ea73515a059267f25b816eb._comment b/doc/install/fromsource/comment_3_a3bf3ce57ea73515a059267f25b816eb._comment
index 1fade16c3..1fade16c3 100644
--- a/doc/install/fromscratch/comment_3_a3bf3ce57ea73515a059267f25b816eb._comment
+++ b/doc/install/fromsource/comment_3_a3bf3ce57ea73515a059267f25b816eb._comment
diff --git a/doc/install/fromsource/comment_45_d9cccbb9620cc8218e72b5380fd89a05._comment b/doc/install/fromsource/comment_45_d9cccbb9620cc8218e72b5380fd89a05._comment
new file mode 100644
index 000000000..e8666b04e
--- /dev/null
+++ b/doc/install/fromsource/comment_45_d9cccbb9620cc8218e72b5380fd89a05._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ ip="209.250.56.22"
+ subject="no need for c2hs"
+ date="2014-09-16T19:28:09Z"
+ content="""
+The c2hs mentioned in some of the above comments is not needed any longer; ghc 7.6.3 and newer come with a hsc2hs command that is used.
+"""]]
diff --git a/doc/install/fromsource/comment_46_954de34275d33bc4590927f911761563._comment b/doc/install/fromsource/comment_46_954de34275d33bc4590927f911761563._comment
new file mode 100644
index 000000000..c0f283f4b
--- /dev/null
+++ b/doc/install/fromsource/comment_46_954de34275d33bc4590927f911761563._comment
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ ip="209.250.56.22"
+ subject="comment 46"
+ date="2014-09-16T19:33:11Z"
+ content="""
+Britt's comment is spot on, but git-annex tries pretty hard to work with lots of older versions of haskell libraries, as well as the latest and greatest. So it should be ok to install haskell libraries with apt-get and use them to build git-annex, as the (revised) instructions above show.
+
+What tends not to work so well is use apt-get to install older versions of haskell libraries and then cabal install on top to add newer stuff. Gets complicated and I'd recommend not going there. The instructions above show using either apt-get or cabal to install the haskell libraries, but not both.
+"""]]
diff --git a/doc/install/cabal/comment_4_2ff7f8a3b03bea7e860248829d595bd1._comment b/doc/install/fromsource/comment_4_2ff7f8a3b03bea7e860248829d595bd1._comment
index 4a04303ce..4a04303ce 100644
--- a/doc/install/cabal/comment_4_2ff7f8a3b03bea7e860248829d595bd1._comment
+++ b/doc/install/fromsource/comment_4_2ff7f8a3b03bea7e860248829d595bd1._comment
diff --git a/doc/install/fromsource/comment_4_765334858ef1eedff2c5d89ed42aa7f6._comment b/doc/install/fromsource/comment_4_765334858ef1eedff2c5d89ed42aa7f6._comment
new file mode 100644
index 000000000..66615dac7
--- /dev/null
+++ b/doc/install/fromsource/comment_4_765334858ef1eedff2c5d89ed42aa7f6._comment
@@ -0,0 +1,37 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawld54zdyk6b0W4jXnssSO_j2Nn3W1uVsUE"
+ nickname="Paul"
+ subject="comment 4"
+ date="2014-08-24T11:53:11Z"
+ content="""
+@azul, thanks for hints, but it still fails. No wonders though - this is Haskell, kids.
+
+~~~~
+$ cabal install git-annex --only-dependencies
+Resolving dependencies...
+cabal: Could not resolve dependencies:
+trying: git-annex-5.20140817
+trying: git-annex-5.20140817:+webapp
+trying: git-annex-5.20140817:+s3
+trying: git-annex-5.20140817:+dns
+trying: dns-1.4.3
+trying: yesod-1.2.6.1
+trying: yesod-auth-1.3.4.2
+trying: http-client-0.3.7.1
+trying: http-client-0.3.7.1:+network-uri
+trying: hS3-0.5.8
+trying: hxt-9.3.1.6
+trying: hxt-9.3.1.6:-network-uri
+rejecting: network-2.6.0.1, 2.6.0.0 (conflict: hxt-9.3.1.6:network-uri =>
+network>=2.4 && <2.6)
+rejecting: network-2.5.0.0, 2.4.2.3, 2.4.2.2, 2.4.2.1, 2.4.2.0, 2.4.1.2,
+2.4.1.1, 2.4.1.0, 2.4.0.1, 2.4.0.0, 2.3.2.0, 2.3.1.1, 2.3.1.0, 2.3.0.14,
+2.3.0.13, 2.3.0.12, 2.3.0.11, 2.3.0.10, 2.3.0.9, 2.3.0.8, 2.3.0.7, 2.3.0.6,
+2.3.0.5, 2.3.0.4, 2.3.0.3, 2.3.0.2, 2.3.0.1, 2.3 (conflict:
+http-client-0.3.7.1:network-uri => network>=2.6)
+rejecting: network-2.2.3.1, 2.2.3, 2.2.1.10, 2.2.1.9, 2.2.1.8, 2.2.1.7,
+2.2.1.6, 2.2.1.5, 2.2.1.4, 2.2.1.3, 2.2.1.2, 2.2.1.1, 2.2.1, 2.2.0.1, 2.2.0.0,
+2.1.0.0, 2.0 (conflict: dns => network>=2.3)
+~~~~
+
+"""]]
diff --git a/doc/install/fromsource/comment_5_4aea55dc5b24d84e0953382ccfea1a01._comment b/doc/install/fromsource/comment_5_4aea55dc5b24d84e0953382ccfea1a01._comment
new file mode 100644
index 000000000..c14b75bc0
--- /dev/null
+++ b/doc/install/fromsource/comment_5_4aea55dc5b24d84e0953382ccfea1a01._comment
@@ -0,0 +1,12 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawmfEGTjv4GsWkSG2lpuBitRDxVkml7yEQg"
+ nickname="Britt"
+ subject="Installing debs"
+ date="2014-09-16T02:16:28Z"
+ content="""
+@azul - the problem with installing dependencies from apt-get is that the Ubuntu haskell packages are rather old. It shouldn't be this way (and it has gotten a LOT better - I suggest installing the newest version of the Haskell Platform that you can), but often cabal will complain about a package it is unable to install because it failed on the install of that package's dependencies. You should try to cabal install $FAILED_DEPENDENCY (not an actual env variable), and you will often get more informative error messages - some packages require non-haskell dependencies (take gtk3, for instance) which cabal doesn't know how to handle at this point, because that would require some cross platform foo (cabal install runs on Windows and OSX, which don't have native package managers at all).
+
+@Paul - It looks like you ran into a bug, because http-client no longer depends on network>=2.6, it now can take network 2.4 - 2.6 or 2.6 or greater. If you try again it should work.
+
+Please don't be put off by haskell because of things like this - git annex is a very large and complicated project, and developing on large projects such as this pretty much require you to have pretty recent versions of all haskell packages. I really suggest you take a look at this book http://learnyouahaskell.com/introduction. Haskell is a beautiful language and it doesn't have to be esoteric, academic, or difficult at all. It's obvious since you are attempting to build this from source that you are either interested in haskell or you are only interested in the development of git-annex. Either way, it would behoove you to read that book. It is short, full of great examples, and it even has pleasant illustrations. It may look like a children's book, but by the end of it you will know how to use all of the major monads (you may not know what a monad is, but that isn't really that important anyway - you just need to know how they are used).
+"""]]
diff --git a/doc/install/cabal/comment_5_8789fc27466714faa5a3a7a6b8ec6e5d._comment b/doc/install/fromsource/comment_5_8789fc27466714faa5a3a7a6b8ec6e5d._comment
index 59bdbdd13..59bdbdd13 100644
--- a/doc/install/cabal/comment_5_8789fc27466714faa5a3a7a6b8ec6e5d._comment
+++ b/doc/install/fromsource/comment_5_8789fc27466714faa5a3a7a6b8ec6e5d._comment
diff --git a/doc/install/cabal/comment_6_5afb2d081e8b603bc338cd460ad9317d._comment b/doc/install/fromsource/comment_6_5afb2d081e8b603bc338cd460ad9317d._comment
index 1ff7b4f76..1ff7b4f76 100644
--- a/doc/install/cabal/comment_6_5afb2d081e8b603bc338cd460ad9317d._comment
+++ b/doc/install/fromsource/comment_6_5afb2d081e8b603bc338cd460ad9317d._comment
diff --git a/doc/install/cabal/comment_7_129c4f2e404c874e5adfa52902a81104._comment b/doc/install/fromsource/comment_7_129c4f2e404c874e5adfa52902a81104._comment
index 40b202d4e..40b202d4e 100644
--- a/doc/install/cabal/comment_7_129c4f2e404c874e5adfa52902a81104._comment
+++ b/doc/install/fromsource/comment_7_129c4f2e404c874e5adfa52902a81104._comment
diff --git a/doc/install/cabal/comment_8_738c108f131e3aab0d720bc4fd6a81fd._comment b/doc/install/fromsource/comment_8_738c108f131e3aab0d720bc4fd6a81fd._comment
index 536f30da0..536f30da0 100644
--- a/doc/install/cabal/comment_8_738c108f131e3aab0d720bc4fd6a81fd._comment
+++ b/doc/install/fromsource/comment_8_738c108f131e3aab0d720bc4fd6a81fd._comment
diff --git a/doc/install/cabal/comment_9_5ddbba419d96a7411f7edddaa4d7b739._comment b/doc/install/fromsource/comment_9_5ddbba419d96a7411f7edddaa4d7b739._comment
index 3284c8caa..3284c8caa 100644
--- a/doc/install/cabal/comment_9_5ddbba419d96a7411f7edddaa4d7b739._comment
+++ b/doc/install/fromsource/comment_9_5ddbba419d96a7411f7edddaa4d7b739._comment
diff --git a/doc/internals/comment_3_5a26ee5aab274f321a4ea6f8527f53bd._comment b/doc/internals/comment_3_5a26ee5aab274f321a4ea6f8527f53bd._comment
new file mode 100644
index 000000000..099f4c8ca
--- /dev/null
+++ b/doc/internals/comment_3_5a26ee5aab274f321a4ea6f8527f53bd._comment
@@ -0,0 +1,12 @@
+[[!comment format=mdwn
+ username="zardoz"
+ ip="134.147.14.84"
+ subject="comment 3"
+ date="2014-09-15T10:34:36Z"
+ content="""
+Some documentation that would be nice having added in the appropriate places:
+
+* Exactly how is the index file being used? Is this just a copy of the git index file that we would get when checking out the git-annex branch? Why is the file kept around? Which sort of operations are done on the index, e.g. when doing git annex add?
+
+* For all time-stamped data-structures: Exactly which significance does the time-stamp have? E.g., for uuid.log, is this the date the name was changed?
+"""]]
diff --git a/doc/news/version_5.20140606.mdwn b/doc/news/version_5.20140606.mdwn
deleted file mode 100644
index d7f26b86f..000000000
--- a/doc/news/version_5.20140606.mdwn
+++ /dev/null
@@ -1,14 +0,0 @@
-git-annex 5.20140606 released with [[!toggle text="these changes"]]
-[[!toggleable text="""
- * webapp: When adding a new local repository, fix bug that caused its
- group and preferred content to be set in the current repository,
- even when not combining.
- * webapp: Avoid stomping on existing description, group and
- preferred content settings when enabling or combining with
- an already existing remote.
- * assistant: Make sanity checker tmp dir cleanup code more robust.
- * unused: Avoid checking view branches for unused files.
- * webapp: Include ssh port in mangled hostname.
- * Windows: Fix bug introduced in last release that caused files
- in the git-annex branch to have lines teminated with \r.
- * Windows: Fix retrieving of files from local bare git repositories."""]] \ No newline at end of file
diff --git a/doc/news/version_5.20140613.mdwn b/doc/news/version_5.20140613.mdwn
deleted file mode 100644
index d4413725d..000000000
--- a/doc/news/version_5.20140613.mdwn
+++ /dev/null
@@ -1,16 +0,0 @@
-git-annex 5.20140613 released with [[!toggle text="these changes"]]
-[[!toggleable text="""
- * Ignore setsid failures.
- * Avoid leaving behind .tmp files when failing in some cases, including
- importing files to a disk that is full.
- * Avoid bad commits after interrupted direct mode sync (or merge).
- * Fix build with wai 0.3.0.
- * Deal with FAT's low resolution timestamps, which in combination with
- Linux's caching of higher res timestamps while a FAT is mounted, caused
- direct mode repositories on FAT to seem to have modified files after
- they were unmounted and remounted.
- * Windows: Fix opening webapp when repository is in a directory with
- spaces in the path.
- * Detect when Windows has lost its mind in a timezone change, and
- automatically apply a delta to the timestamps it returns, to get back to
- sane values."""]] \ No newline at end of file
diff --git a/doc/news/version_5.20140707.mdwn b/doc/news/version_5.20140707.mdwn
deleted file mode 100644
index a00737b3b..000000000
--- a/doc/news/version_5.20140707.mdwn
+++ /dev/null
@@ -1,23 +0,0 @@
-git-annex 5.20140707 released with [[!toggle text="these changes"]]
-[[!toggleable text="""
- * assistant: Fix bug, introduced in last release, that caused the assistant
- to make many unncessary empty merge commits.
- * assistant: Fix one-way assistant-&gt;assistant sync in direct mode.
- * Fix bug in annex.queuesize calculation that caused much more
- queue flushing than necessary.
- * importfeed: When annex.genmetadata is set, metadata from the feed
- is added to files that are imported from it.
- * Support users who have set commit.gpgsign, by disabling gpg signatures
- for git-annex branch commits and commits made by the assistant.
- * Fix memory leak when committing millions of changes to the git-annex
- branch, eg after git-annex add has run on 2 million files in one go.
- * Support building with bloomfilter 2.0.0.
- * Run standalone install process when the assistant is started
- (was only being run when the webapp was opened).
- * Android: patch git to avoid fchmod, which fails on /sdcard.
- * Windows: Got rid of that pesky DOS box when starting the webapp.
- * Windows: Added Startup menu item so assistant starts automatically
- on login.
- * Windows: Fix opening file browser from webapp when repo is in a
- directory with spaces.
- * Windows: Assistant now logs to daemon.log."""]] \ No newline at end of file
diff --git a/doc/news/version_5.20140817.mdwn b/doc/news/version_5.20140817.mdwn
new file mode 100644
index 000000000..82e44eb57
--- /dev/null
+++ b/doc/news/version_5.20140817.mdwn
@@ -0,0 +1,42 @@
+git-annex 5.20140817 released with [[!toggle text="these changes"]]
+[[!toggleable text="""
+ * New chunk= option to chunk files stored in special remotes.
+ Supported by: directory, S3, webdav, gcrypt, rsync, and all external
+ and hook special remotes.
+ * Partially transferred files are automatically resumed when using
+ chunked remotes!
+ * The old chunksize= option is deprecated. Do not use for new remotes.
+ * Legacy code for directory remotes using the old chunksize= option
+ will keep them working, but more slowly than before.
+ * webapp: Automatically install Konqueror integration scripts
+ to get and drop files.
+ * repair: Removing bad objects could leave fsck finding no more
+ unreachable objects, but some branches no longer accessible.
+ Fix this, including support for fixing up repositories that
+ were incompletely repaired before.
+ * Fix cost calculation for non-encrypted remotes.
+ * Display exception message when a transfer fails due to an exception.
+ * WebDAV: Sped up by avoiding making multiple http connections
+ when storing a file.
+ * WebDAV: Avoid buffering whole file in memory when uploading and
+ downloading.
+ * WebDAV: Dropped support for DAV before 1.0.
+ * testremote: New command to test uploads/downloads to a remote.
+ * Dropping an object from a bup special remote now deletes the git branch
+ for the object, although of course the object's content cannot be deleted
+ due to the nature of bup.
+ * unlock: Better error handling; continue past files that are not available
+ or cannot be unlocked due to disk space, and try all specified files.
+ * Windows: Now uses actual inode equivilants in new direct mode
+ repositories, for safer detection of eg, renaming of files with the same
+ size and mtime.
+ * direct: Fix ugly warning messages.
+ * WORM backend: When adding a file in a subdirectory, avoid including the
+ subdirectory in the key name.
+ * S3, Glacier, WebDAV: Fix bug that prevented accessing the creds
+ when the repository was configured with encryption=shared embedcreds=yes.
+ * direct: Avoid leaving file content in misctemp if interrupted.
+ * git-annex-shell sendkey: Don't fail if a remote asks for a key to be sent
+ that already has a transfer lock file indicating it's being sent to that
+ remote. The remote may have moved between networks, or reconnected.
+ * Switched from the old haskell HTTP library to http-conduit."""]] \ No newline at end of file
diff --git a/doc/news/version_5.20140831.mdwn b/doc/news/version_5.20140831.mdwn
new file mode 100644
index 000000000..713adb9fc
--- /dev/null
+++ b/doc/news/version_5.20140831.mdwn
@@ -0,0 +1,13 @@
+git-annex 5.20140831 released with [[!toggle text="these changes"]]
+[[!toggleable text="""
+ * Make --help work when not in a git repository. Closes: #[758592](http://bugs.debian.org/758592)
+ * Ensure that all lock fds are close-on-exec, fixing various problems with
+ them being inherited by child processes such as git commands.
+ * When accessing a local remote, shut down git-cat-file processes
+ afterwards, to ensure that remotes on removable media can be unmounted.
+ Closes: #[758630](http://bugs.debian.org/758630)
+ * Fix handing of autocorrection when running outside a git repository.
+ * Fix stub git-annex test support when built without tasty.
+ * Do not preserve permissions and acls when copying files from
+ one local git repository to another. Timestamps are still preserved
+ as long as cp --preserve=timestamps is supported. Closes: #[729757](http://bugs.debian.org/729757)"""]] \ No newline at end of file
diff --git a/doc/news/version_5.20140915.mdwn b/doc/news/version_5.20140915.mdwn
new file mode 100644
index 000000000..7aa6477c9
--- /dev/null
+++ b/doc/news/version_5.20140915.mdwn
@@ -0,0 +1,27 @@
+git-annex 5.20140915 released with [[!toggle text="these changes"]]
+[[!toggleable text="""
+ * New annex.hardlink setting. Closes: #[758593](http://bugs.debian.org/758593)
+ * init: Automatically detect when a repository was cloned with --shared,
+ and set annex.hardlink=true, as well as marking the repository as
+ untrusted.
+ * Fix parsing of ipv6 address in git remote address when it was not
+ formatted as an url.
+ * The annex-rsync-transport configuration is now also used when checking
+ if a key is present on a rsync remote, and when dropping a key from
+ the remote.
+ * Promote file not found warning message to an error.
+ * Fix transfer lock file FD leak that could occur when two separate
+ git-annex processes were both working to perform the same set of
+ transfers.
+ * sync: Ensure that pending changes to git-annex branch are committed
+ before push when in direct mode. (Fixing a very minor reversion.)
+ * WORM backend: Switched to include the relative path to the file inside
+ the repository, rather than just the file's base name. Note that if you're
+ relying on such things to keep files separate with WORM, you should really
+ be using a better backend.
+ * Rather than crashing when there's a problem with the requested bloomfilter
+ capacity/accuracy, fall back to a reasonable default bloom filter size.
+ * Fix build with optparse-applicative 0.10. Closes: #[761484](http://bugs.debian.org/761484)
+ * webapp: Fixed visual glitch in xmpp pairing that was reported live by a
+ user who tracked me down in front of a coffee cart in Portland.
+ (New bug reporting method of choice?)"""]] \ No newline at end of file
diff --git a/doc/not.mdwn b/doc/not.mdwn
index 3b7cdc1cf..baf43c2b8 100644
--- a/doc/not.mdwn
+++ b/doc/not.mdwn
@@ -5,7 +5,7 @@
system. For a backup system that uses git and that git-annex supports
storing data in, see [[special_remotes/bup]].
-* git-annex is not a filesystem or DropBox clone. However, the git-annex
+* git-annex is not a filesystem or Dropbox clone. However, the git-annex
[[assistant]] is addressing some of the same needs in its own unique ways.
(There is also a FUSE filesystem built on top of git-annex, called
[ShareBox](https://github.com/chmduquesne/sharebox-fs).)
diff --git a/doc/related_software.mdwn b/doc/related_software.mdwn
index 0cd7d7fc8..43ffe0597 100644
--- a/doc/related_software.mdwn
+++ b/doc/related_software.mdwn
@@ -11,5 +11,5 @@ designed to interoperate with it.
utility, with a `-A` switch that enables git-annex support.
* Emacs Org mode can auto-commit attached files to git-annex.
* [git annex darktable integration](https://github.com/xxv/darktable-git-annex)
-* Emacs's [Magit mode](http://www.emacswiki.org/emacs/Magit) has
- [magit integration](http://melpa.milkbox.net/?utm_source=dlvr.it&utm_medium=twitter#/magit-annex)
+* [Magit](http://github.com/magit/magit), an Emacs mode for Git, has
+ [an extension](https://github.com/magit/magit-annex) for git annex.
diff --git a/doc/tips/emacs_integration.mdwn b/doc/tips/emacs_integration.mdwn
index 2390474a4..3eeff788a 100644
--- a/doc/tips/emacs_integration.mdwn
+++ b/doc/tips/emacs_integration.mdwn
@@ -21,5 +21,5 @@ file`; otherwise it will "git add" it.
----
-[magit-annex](https://github.com/kyleam/magit-annex) adds magit support
-for a few features, including adding files and syncing.
+[magit-annex](https://github.com/magit/magit-annex) adds git annex
+operations to Magit.
diff --git a/doc/tips/megaannex/comment_2_c1158b7ec15646d64cae8215ce845642._comment b/doc/tips/megaannex/comment_2_c1158b7ec15646d64cae8215ce845642._comment
new file mode 100644
index 000000000..99da0e370
--- /dev/null
+++ b/doc/tips/megaannex/comment_2_c1158b7ec15646d64cae8215ce845642._comment
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawkzwmw_zyMpZC9_J7ey--woeYPoZkAOgGw"
+ nickname="dxtrish"
+ subject="comment 2"
+ date="2014-09-07T21:16:09Z"
+ content="""
+Because megaannex apparently isn't working nowadays I have created a compatible program in Go. I think it should handle everything except REMOVE right now.
+
+You can find it on github: https://github.com/dxtr/megaannex-go
+"""]]
diff --git a/doc/tips/metadata_driven_views/comment_3_196f55e52a5d8a8f061603ab87ad04ad._comment b/doc/tips/metadata_driven_views/comment_3_196f55e52a5d8a8f061603ab87ad04ad._comment
new file mode 100644
index 000000000..e522ed837
--- /dev/null
+++ b/doc/tips/metadata_driven_views/comment_3_196f55e52a5d8a8f061603ab87ad04ad._comment
@@ -0,0 +1,18 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawnPgn611P6ym5yyL0BS8rUzO0_ZKRldMt0"
+ nickname="Samuel"
+ subject="git annex view */=podcast"
+ date="2014-08-19T06:11:50Z"
+ content="""
+Hi,
+
+Would it be hard to handle the wildcard character in the location view before the = sign.
+
+ git annex foo/=*
+
+works but
+
+ git annex *=/bar
+
+does not.
+"""]]
diff --git a/doc/tips/using_Amazon_S3/comment_5_6b288e06010bedbb71e0afed6b427704._comment b/doc/tips/using_Amazon_S3/comment_5_6b288e06010bedbb71e0afed6b427704._comment
new file mode 100644
index 000000000..320a09d63
--- /dev/null
+++ b/doc/tips/using_Amazon_S3/comment_5_6b288e06010bedbb71e0afed6b427704._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawkmN2ZZIdYNiFKmEH7rz4jMb6sYsx_dptA"
+ nickname="Jack William"
+ subject="What if you do not want to encrypt?"
+ date="2014-09-07T18:35:19Z"
+ content="""
+Once use case for GIT with Amazon S3 is to maintain a web site on S3 you can easily update from a local machine. In that case you would not want to encrypt. Is encryption optional? This isn't clear from the instructions.
+"""]]
diff --git a/doc/tips/using_Amazon_S3/comment_6_3b6c74b40ea666389ac04b52ab0819a0._comment b/doc/tips/using_Amazon_S3/comment_6_3b6c74b40ea666389ac04b52ab0819a0._comment
new file mode 100644
index 000000000..0fce69dad
--- /dev/null
+++ b/doc/tips/using_Amazon_S3/comment_6_3b6c74b40ea666389ac04b52ab0819a0._comment
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="http://schnouki.net/"
+ nickname="Schnouki"
+ subject="comment 6"
+ date="2014-09-09T12:48:59Z"
+ content="""
+Jack, if you don't want to use encryption you can use `encryption=none` as documented [here](http://git-annex.branchable.com/special_remotes/S3/).
+
+I'm not sure exactly what you're trying to do, but please note that you files won't be easily available on S3: they will be named as git-annex keys, with long and unreadable names such as \"SHA256E-s6311--c7533fdd259d872793b7298cbb56a1912e80c52a845661b0b9ff391c65ee2abc.html\" instead of \"index.html\".
+"""]]
diff --git a/doc/tips/using_Amazon_S3/comment_7_cf6755d88463878f2ea6e4c300899027._comment b/doc/tips/using_Amazon_S3/comment_7_cf6755d88463878f2ea6e4c300899027._comment
new file mode 100644
index 000000000..3c7b817f7
--- /dev/null
+++ b/doc/tips/using_Amazon_S3/comment_7_cf6755d88463878f2ea6e4c300899027._comment
@@ -0,0 +1,33 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawmH7o6q2l99M-PQolOfbR3_i5B_jtTIcAE"
+ nickname="Giovanni"
+ subject="How to publish your files to the public"
+ date="2014-09-13T15:29:18Z"
+ content="""
+I don't know if this is what Jack wanted, but you can upload your files to S3 and let them be accessible through a public URL.
+
+First, go to (or create) the bucket you will use at [S3](https://console.aws.amazon.com/s3/) and add a public get policy to it:
+
+```
+ {
+ \"Version\": \"2008-10-17\",
+ \"Statement\": [
+ {
+ \"Sid\": \"AllowPublicRead\",
+ \"Effect\": \"Allow\",
+ \"Principal\": {
+ \"AWS\": \"*\"
+ },
+ \"Action\": \"s3:GetObject\",
+ \"Resource\": \"arn:aws:s3:::BUCKETNAME/*\"
+ }
+ ]
+ }
+```
+
+Then set up your special remote with the options `encryption=none`, `bucket='BUCKETNAME'` `chunk=0` (and any others you want).
+
+Your files will be accessible through `http://BUCKETNAME.s3-website-LOCATION.amazonaws.com/KEY` where location is the one specified through the options `datacenter` and KEY is the SHA-SOMETHING hash of the file, created by git annex and accessible if you run `git annex lookupkey FILEPATH`.
+
+This way you can share a link to each file you have at your S3 remote.
+"""]]
diff --git a/doc/tips/using_gitolite_with_git-annex/comment_22_90ead0e1fe8615fe11f6f1bd7dcd7e84._comment b/doc/tips/using_gitolite_with_git-annex/comment_22_90ead0e1fe8615fe11f6f1bd7dcd7e84._comment
new file mode 100644
index 000000000..6f959c0d7
--- /dev/null
+++ b/doc/tips/using_gitolite_with_git-annex/comment_22_90ead0e1fe8615fe11f6f1bd7dcd7e84._comment
@@ -0,0 +1,13 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawk3gWkz5Qgy5qEa-myg8KWtiTrHSKW1x7Q"
+ nickname="Nicolas"
+ subject="Using Gitolite 3.6.1"
+ date="2014-09-11T00:11:32Z"
+ content="""
+Hi!
+
+I've made a fresh install of Gitolite 3.6.1 and got this error when trying to sync :
+
+FATAL: bad git-annex-shell command: git-annex-shell 'configlist' '/nicolas.git' at /home/git/bin/commands/git-annex-shell line 25, <DATA> line 1.
+
+"""]]
diff --git a/doc/todo/merge_in_ram___40__disk__41____63__.mdwn b/doc/todo/merge_in_ram___40__disk__41____63__.mdwn
new file mode 100644
index 000000000..42090f673
--- /dev/null
+++ b/doc/todo/merge_in_ram___40__disk__41____63__.mdwn
@@ -0,0 +1,8 @@
+git-annex is great. But for my repos the merge and recording state operations take forever.
+
+(merging fotos_enc_pg/synced/git-annex into git-annex...)
+
+Since git-annex is another branch (than master) and git usually needs a worktree for merging I assume that git-annex branch is temporarily checked out somewhere. Would it be possible to move this operation to RAM? Or a RAM-Disk?
+
+> No, it is not checked out. All operations are done with the most
+> effective available git plumbing. [[done]] --[[Joey]]
diff --git a/doc/todo/windows_support/comment_12_0775dc22516cfa8c5e7deea954084947._comment b/doc/todo/windows_support/comment_12_0775dc22516cfa8c5e7deea954084947._comment
new file mode 100644
index 000000000..0c3aa46d4
--- /dev/null
+++ b/doc/todo/windows_support/comment_12_0775dc22516cfa8c5e7deea954084947._comment
@@ -0,0 +1,18 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawkQOUUx4LVAk6EnstSLvdv7gZc0NsRlHXw"
+ nickname="Dave"
+ subject="windows port volunteer tester"
+ date="2014-09-08T15:39:03Z"
+ content="""
+Hello.
+
+I volunteer to test the Windows port. I can only do so on the work computer. :)
+
+I know how to produce a Minimal Reproducible Example. Are there some areas that need attention?
+
+I've enabled the 'email replies to me' ikiwiki feature. (Nice plugin.)
+
+Cheers,
+
+--Dave
+"""]]
diff --git a/doc/todo/wishlist:_provide_a_config_option_for_using_new_hashing_scheme_in_non-bare_remotes.mdwn b/doc/todo/wishlist:_provide_a_config_option_for_using_new_hashing_scheme_in_non-bare_remotes.mdwn
new file mode 100644
index 000000000..b18eace9a
--- /dev/null
+++ b/doc/todo/wishlist:_provide_a_config_option_for_using_new_hashing_scheme_in_non-bare_remotes.mdwn
@@ -0,0 +1,5 @@
+I understand that for backwards compatibility the non-bare remotes use the old "mixed" case scheme. However, for new annexes, it'd make sense to be able to use the new one so the scheme matches in all remotes.
+
+> If this option existed then every clone of a repository would need to set
+> it, or files would be hashed into the wrong location and would appear not
+> visible. Sounds like a bug magnet to me; not attractive. --[[Joey]]
diff --git a/git-annex.cabal b/git-annex.cabal
index 6e57dd1f4..425bc3f90 100644
--- a/git-annex.cabal
+++ b/git-annex.cabal
@@ -1,5 +1,5 @@
Name: git-annex
-Version: 5.20140717
+Version: 5.20140916
Cabal-Version: >= 1.8
License: GPL-3
Maintainer: Joey Hess <joey@kitenet.net>
@@ -92,12 +92,16 @@ Flag EKG
Description: Enable use of EKG to monitor git-annex as it runs (at http://localhost:4242/)
Default: False
+Flag network-uri
+ Description: Get Network.URI from the network-uri package
+ Default: True
+
Executable git-annex
Main-Is: git-annex.hs
Build-Depends: MissingH, hslogger, directory, filepath,
- containers, utf8-string, network (>= 2.0), mtl (>= 2),
+ containers, utf8-string, mtl (>= 2),
bytestring, old-locale, time, dataenc, SHA, process, json,
- base (>= 4.5 && < 4.9), monad-control, exceptions (>= 0.5), transformers,
+ base (>= 4.5 && < 4.9), monad-control, exceptions (>= 0.6), transformers,
IfElse, text, QuickCheck >= 2.1, bloomfilter, edit-distance, process,
SafeSemaphore, uuid, random, dlist, unix-compat, async, stm (>= 2.3),
data-default, case-insensitive, http-conduit, http-types
@@ -107,6 +111,11 @@ Executable git-annex
-- Some things don't work with the non-threaded RTS.
GHC-Options: -threaded
+ if flag(network-uri)
+ Build-Depends: network-uri (>= 2.6), network (>= 2.6)
+ else
+ Build-Depends: network (< 2.6), network (>= 2.0)
+
if flag(Production)
GHC-Options: -O2
@@ -123,7 +132,7 @@ Executable git-annex
if flag(TestSuite)
Build-Depends: tasty (>= 0.7), tasty-hunit, tasty-quickcheck, tasty-rerun,
- optparse-applicative, crypto-api
+ optparse-applicative (>= 0.9.1), crypto-api
CPP-Options: -DWITH_TESTSUITE
if flag(TDFA)
@@ -141,7 +150,7 @@ Executable git-annex
CPP-Options: -DWITH_S3
if flag(WebDAV)
- Build-Depends: DAV (>= 1.0)
+ Build-Depends: DAV (>= 1.0), http-client
CPP-Options: -DWITH_WEBDAV
if flag(Assistant) && ! os(solaris)
diff --git a/standalone/linux/install-haskell-packages b/standalone/linux/install-haskell-packages
index f5fd4edfa..3178b72f8 100755
--- a/standalone/linux/install-haskell-packages
+++ b/standalone/linux/install-haskell-packages
@@ -28,7 +28,6 @@ patched () {
pkg=$1
shift 1
cabal unpack $pkg$1
- shift 1
cd $pkg*
git init
git config user.name dummy
@@ -45,7 +44,7 @@ patched () {
fi
fi
done
- cabalinstall "$@"
+ cabalinstall
rm -rf $pkg*
cd ..
}
diff --git a/standalone/no-th/haskell-patches/file-embed_remove-TH.patch b/standalone/no-th/haskell-patches/file-embed_remove-TH.patch
index a089f1f9e..12e344504 100644
--- a/standalone/no-th/haskell-patches/file-embed_remove-TH.patch
+++ b/standalone/no-th/haskell-patches/file-embed_remove-TH.patch
@@ -1,17 +1,17 @@
-From 2b41af230ea5675592e87a2362d9c17bcd8df1db Mon Sep 17 00:00:00 2001
-From: dummy <dummy@example.com>
-Date: Tue, 10 Jun 2014 19:00:44 +0000
+From 497d09a91f9eb1e5979948cd128078491b0e8bca Mon Sep 17 00:00:00 2001
+From: Joey Hess <joey@kitenet.net>
+Date: Fri, 12 Sep 2014 20:52:08 -0400
Subject: [PATCH] remove TH
---
- Data/FileEmbed.hs | 100 +++---------------------------------------------------
- 1 file changed, 5 insertions(+), 95 deletions(-)
+ Data/FileEmbed.hs | 87 ++++---------------------------------------------------
+ 1 file changed, 5 insertions(+), 82 deletions(-)
diff --git a/Data/FileEmbed.hs b/Data/FileEmbed.hs
-index aae9d5a..efdbb7b 100644
+index 5617493..adacdba 100644
--- a/Data/FileEmbed.hs
+++ b/Data/FileEmbed.hs
-@@ -17,19 +17,18 @@
+@@ -17,13 +17,13 @@
-- > {-# LANGUAGE TemplateHaskell #-}
module Data.FileEmbed
( -- * Embed at compile time
@@ -19,7 +19,7 @@ index aae9d5a..efdbb7b 100644
- , embedOneFileOf
- , embedDir
- , getDir
-+ -- embedFile
++ -- embedFile
+ --, embedOneFileOf
+ --, embedDir
+ getDir
@@ -30,13 +30,7 @@ index aae9d5a..efdbb7b 100644
#endif
, inject
, injectFile
- -- * Internal
- , stringToBs
-- , bsToExp
- ) where
-
- import Language.Haskell.TH.Syntax
-@@ -57,85 +56,12 @@ import Data.ByteString.Unsafe (unsafePackAddressLen)
+@@ -56,73 +56,12 @@ import Data.ByteString.Unsafe (unsafePackAddressLen)
import System.IO.Unsafe (unsafePerformIO)
import System.FilePath ((</>))
@@ -102,27 +96,15 @@ index aae9d5a..efdbb7b 100644
- return $! TupE [LitE $ StringL path, exp']
-
-bsToExp :: B.ByteString -> Q Exp
--#if MIN_VERSION_template_haskell(2, 5, 0)
--bsToExp bs =
-- return $ VarE 'unsafePerformIO
-- `AppE` (VarE 'unsafePackAddressLen
-- `AppE` LitE (IntegerL $ fromIntegral $ B8.length bs)
--#if MIN_VERSION_template_haskell(2, 8, 0)
-- `AppE` LitE (StringPrimL $ B.unpack bs))
--#else
-- `AppE` LitE (StringPrimL $ B8.unpack bs))
--#endif
--#else
-bsToExp bs = do
- helper <- [| stringToBs |]
- let chars = B8.unpack bs
- return $! AppE helper $! LitE $! StringL chars
--#endif
-
stringToBs :: String -> B.ByteString
stringToBs = B8.pack
-@@ -177,22 +103,6 @@ padSize i =
+@@ -164,22 +103,6 @@ padSize i =
let s = show i
in replicate (sizeLen - length s) '0' ++ s
@@ -146,5 +128,5 @@ index aae9d5a..efdbb7b 100644
inject :: B.ByteString -- ^ bs to inject
-> B.ByteString -- ^ original BS containing dummy
--
-2.0.0
+2.1.0
diff --git a/standalone/no-th/haskell-patches/yesod-form_spliced-TH.patch b/standalone/no-th/haskell-patches/yesod-form_spliced-TH.patch
index cb0ff9d08..4f8edee8f 100644
--- a/standalone/no-th/haskell-patches/yesod-form_spliced-TH.patch
+++ b/standalone/no-th/haskell-patches/yesod-form_spliced-TH.patch
@@ -1,19 +1,226 @@
-From 38834f94992679d8c4d936fec12eb32b82073553 Mon Sep 17 00:00:00 2001
-From: dummy <dummy@example.com>
-Date: Wed, 21 May 2014 05:23:19 +0000
+From 6aabd510081681f81f4259190be32fbb2819b46c Mon Sep 17 00:00:00 2001
+From: Joey Hess <joey@kitenet.net>
+Date: Fri, 12 Sep 2014 21:30:27 -0400
Subject: [PATCH] splice TH
---
- Yesod/Form/Fields.hs | 738 +++++++++++++++++++++++++++++++++---------------
- Yesod/Form/Functions.hs | 289 +++++++++++++------
- Yesod/Form/Jquery.hs | 129 +++++++--
- Yesod/Form/MassInput.hs | 233 ++++++++++++---
- Yesod/Form/Nic.hs | 65 ++++-
- yesod-form.cabal | 1 -
- 6 files changed, 1054 insertions(+), 401 deletions(-)
+ Yesod/Form/Bootstrap3.hs | 183 +++++++++---
+ Yesod/Form/Fields.hs | 753 ++++++++++++++++++++++++++++++++++++++---------
+ Yesod/Form/Functions.hs | 257 +++++++++++++---
+ Yesod/Form/Jquery.hs | 134 +++++++--
+ Yesod/Form/MassInput.hs | 226 +++++++++++---
+ Yesod/Form/Nic.hs | 67 ++++-
+ yesod-form.cabal | 1 -
+ 7 files changed, 1319 insertions(+), 302 deletions(-)
+diff --git a/Yesod/Form/Bootstrap3.hs b/Yesod/Form/Bootstrap3.hs
+index 84e85fc..943c416 100644
+--- a/Yesod/Form/Bootstrap3.hs
++++ b/Yesod/Form/Bootstrap3.hs
+@@ -152,44 +152,144 @@ renderBootstrap3 formLayout aform fragment = do
+ let views = views' []
+ has (Just _) = True
+ has Nothing = False
+- widget = [whamlet|
+- $newline never
+- #{fragment}
+- $forall view <- views
+- <div .form-group :fvRequired view:.required :not $ fvRequired view:.optional :has $ fvErrors view:.has-error>
+- $case formLayout
+- $of BootstrapBasicForm
+- $if fvId view /= bootstrapSubmitId
+- <label for=#{fvId view}>#{fvLabel view}
+- ^{fvInput view}
+- ^{helpWidget view}
+- $of BootstrapInlineForm
+- $if fvId view /= bootstrapSubmitId
+- <label .sr-only for=#{fvId view}>#{fvLabel view}
+- ^{fvInput view}
+- ^{helpWidget view}
+- $of BootstrapHorizontalForm labelOffset labelSize inputOffset inputSize
+- $if fvId view /= bootstrapSubmitId
+- <label .control-label .#{toOffset labelOffset} .#{toColumn labelSize} for=#{fvId view}>#{fvLabel view}
+- <div .#{toOffset inputOffset} .#{toColumn inputSize}>
+- ^{fvInput view}
+- ^{helpWidget view}
+- $else
+- <div .#{toOffset (addGO inputOffset (addGO labelOffset labelSize))} .#{toColumn inputSize}>
+- ^{fvInput view}
+- ^{helpWidget view}
+- |]
++ widget = do { (asWidgetT . toWidget) (toHtml fragment);
++ Data.Foldable.mapM_
++ (\ view_as0a
++ -> do { (asWidgetT . toWidget)
++ ((Text.Blaze.Internal.preEscapedText . T.pack)
++ "<div class=\"form-group ");
++ Text.Hamlet.condH
++ [(fvRequired view_as0a,
++ (asWidgetT . toWidget)
++ ((Text.Blaze.Internal.preEscapedText . T.pack) "required "))]
++ Nothing;
++ Text.Hamlet.condH
++ [(not (fvRequired view_as0a),
++ (asWidgetT . toWidget)
++ ((Text.Blaze.Internal.preEscapedText . T.pack) "optional "))]
++ Nothing;
++ Text.Hamlet.condH
++ [(has (fvErrors view_as0a),
++ (asWidgetT . toWidget)
++ ((Text.Blaze.Internal.preEscapedText . T.pack) "has-error"))]
++ Nothing;
++ (asWidgetT . toWidget)
++ ((Text.Blaze.Internal.preEscapedText . T.pack) "\">");
++ case formLayout of {
++ ; BootstrapBasicForm
++ -> do { Text.Hamlet.condH
++ [((/=) (fvId view_as0a) bootstrapSubmitId,
++ do { (asWidgetT . toWidget)
++ ((Text.Blaze.Internal.preEscapedText . T.pack)
++ "<label for=\"");
++ (asWidgetT . toWidget) (toHtml (fvId view_as0a));
++ (asWidgetT . toWidget)
++ ((Text.Blaze.Internal.preEscapedText . T.pack) "\">");
++ (asWidgetT . toWidget) (toHtml (fvLabel view_as0a));
++ (asWidgetT . toWidget)
++ ((Text.Blaze.Internal.preEscapedText . T.pack)
++ "</label>") })]
++ Nothing;
++ (asWidgetT . toWidget) (fvInput view_as0a);
++ (asWidgetT . toWidget) (helpWidget view_as0a) }
++ ; BootstrapInlineForm
++ -> do { Text.Hamlet.condH
++ [((/=) (fvId view_as0a) bootstrapSubmitId,
++ do { (asWidgetT . toWidget)
++ ((Text.Blaze.Internal.preEscapedText . T.pack)
++ "<label class=\"sr-only\" for=\"");
++ (asWidgetT . toWidget) (toHtml (fvId view_as0a));
++ (asWidgetT . toWidget)
++ ((Text.Blaze.Internal.preEscapedText . T.pack) "\">");
++ (asWidgetT . toWidget) (toHtml (fvLabel view_as0a));
++ (asWidgetT . toWidget)
++ ((Text.Blaze.Internal.preEscapedText . T.pack)
++ "</label>") })]
++ Nothing;
++ (asWidgetT . toWidget) (fvInput view_as0a);
++ (asWidgetT . toWidget) (helpWidget view_as0a) }
++ BootstrapHorizontalForm labelOffset_as0b
++ labelSize_as0c
++ inputOffset_as0d
++ inputSize_as0e
++ -> Text.Hamlet.condH
++ [((/=) (fvId view_as0a) bootstrapSubmitId,
++ do { (asWidgetT . toWidget)
++ ((Text.Blaze.Internal.preEscapedText . T.pack)
++ "<label class=\"control-label ");
++ (asWidgetT . toWidget) (toHtml (toOffset labelOffset_as0b));
++ (asWidgetT . toWidget)
++ ((Text.Blaze.Internal.preEscapedText . T.pack) " ");
++ (asWidgetT . toWidget) (toHtml (toColumn labelSize_as0c));
++ (asWidgetT . toWidget)
++ ((Text.Blaze.Internal.preEscapedText . T.pack) "\" for=\"");
++ (asWidgetT . toWidget) (toHtml (fvId view_as0a));
++ (asWidgetT . toWidget)
++ ((Text.Blaze.Internal.preEscapedText . T.pack) "\">");
++ (asWidgetT . toWidget) (toHtml (fvLabel view_as0a));
++ (asWidgetT . toWidget)
++ ((Text.Blaze.Internal.preEscapedText . T.pack)
++ "</label><div class=\"");
++ (asWidgetT . toWidget) (toHtml (toOffset inputOffset_as0d));
++ (asWidgetT . toWidget)
++ ((Text.Blaze.Internal.preEscapedText . T.pack) " ");
++ (asWidgetT . toWidget) (toHtml (toColumn inputSize_as0e));
++ (asWidgetT . toWidget)
++ ((Text.Blaze.Internal.preEscapedText . T.pack) "\">");
++ (asWidgetT . toWidget) (fvInput view_as0a);
++ (asWidgetT . toWidget) (helpWidget view_as0a);
++ (asWidgetT . toWidget)
++ ((Text.Blaze.Internal.preEscapedText . T.pack) "</div>") })]
++ (Just
++ (do { (asWidgetT . toWidget)
++ ((Text.Blaze.Internal.preEscapedText . T.pack)
++ "<div class=\"");
++ (asWidgetT . toWidget)
++ (toHtml
++ (toOffset
++ (addGO
++ inputOffset_as0d
++ (addGO labelOffset_as0b labelSize_as0c))));
++ (asWidgetT . toWidget)
++ ((Text.Blaze.Internal.preEscapedText . T.pack) " ");
++ (asWidgetT . toWidget) (toHtml (toColumn inputSize_as0e));
++ (asWidgetT . toWidget)
++ ((Text.Blaze.Internal.preEscapedText . T.pack) "\">");
++ (asWidgetT . toWidget) (fvInput view_as0a);
++ (asWidgetT . toWidget) (helpWidget view_as0a);
++ (asWidgetT . toWidget)
++ ((Text.Blaze.Internal.preEscapedText . T.pack)
++ "</div>") })) };
++ (asWidgetT . toWidget)
++ ((Text.Blaze.Internal.preEscapedText . T.pack) "</div>") })
++ views }
++
+ return (res, widget)
+
+
+ -- | (Internal) Render a help widget for tooltips and errors.
+ helpWidget :: FieldView site -> WidgetT site IO ()
+-helpWidget view = [whamlet|
+- $maybe tt <- fvTooltip view
+- <span .help-block>#{tt}
+- $maybe err <- fvErrors view
+- <span .help-block>#{err}
+-|]
++helpWidget view = do { Text.Hamlet.maybeH
++ (fvTooltip view)
++ (\ tt_as0k
++ -> do { (asWidgetT . toWidget)
++ ((Text.Blaze.Internal.preEscapedText . T.pack)
++ "<span class=\"help-block\">");
++ (asWidgetT . toWidget) (toHtml tt_as0k);
++ (asWidgetT . toWidget)
++ ((Text.Blaze.Internal.preEscapedText . T.pack) "</span>") })
++ Nothing;
++ Text.Hamlet.maybeH
++ (fvErrors view)
++ (\ err_as0l
++ -> do { (asWidgetT . toWidget)
++ ((Text.Blaze.Internal.preEscapedText . T.pack)
++ "<span class=\"help-block\">");
++ (asWidgetT . toWidget) (toHtml err_as0l);
++ (asWidgetT . toWidget)
++ ((Text.Blaze.Internal.preEscapedText . T.pack) "</span>") })
++ Nothing }
++
+
+
+ -- | How the 'bootstrapSubmit' button should be rendered.
+@@ -244,7 +344,22 @@ mbootstrapSubmit
+ => BootstrapSubmit msg -> MForm m (FormResult (), FieldView site)
+ mbootstrapSubmit (BootstrapSubmit msg classes attrs) =
+ let res = FormSuccess ()
+- widget = [whamlet|<button class="btn #{classes}" type=submit *{attrs}>_{msg}|]
++ widget = do { (asWidgetT . toWidget)
++ ((Text.Blaze.Internal.preEscapedText . T.pack)
++ "<button class=\"btn ");
++ (asWidgetT . toWidget) (toHtml classes);
++ (asWidgetT . toWidget)
++ ((Text.Blaze.Internal.preEscapedText . T.pack)
++ "\" type=\"submit\"");
++ (asWidgetT . toWidget)
++ ((Text.Hamlet.attrsToHtml . Text.Hamlet.toAttributes) attrs);
++ (asWidgetT . toWidget)
++ ((Text.Blaze.Internal.preEscapedText . T.pack) ">");
++ ((liftM (toHtml .) getMessageRender)
++ >>= (\ urender_as0w -> (asWidgetT . toWidget) (urender_as0w msg)));
++ (asWidgetT . toWidget)
++ ((Text.Blaze.Internal.preEscapedText . T.pack) "</button>") }
++
+ fv = FieldView { fvLabel = ""
+ , fvTooltip = Nothing
+ , fvId = bootstrapSubmitId
diff --git a/Yesod/Form/Fields.hs b/Yesod/Form/Fields.hs
-index cd67820..46b5d96 100644
+index c6091a9..3d7b267 100644
--- a/Yesod/Form/Fields.hs
+++ b/Yesod/Form/Fields.hs
@@ -1,4 +1,3 @@
@@ -63,7 +270,7 @@ index cd67820..46b5d96 100644
import qualified Blaze.ByteString.Builder.Html.Utf8 as B
import Blaze.ByteString.Builder (writeByteString, toLazyByteString)
import Blaze.ByteString.Builder.Internal.Write (fromWriteList)
-@@ -84,15 +85,12 @@ import Data.Text as T (Text, concat, intercalate, unpack, pack, splitOn)
+@@ -91,15 +92,12 @@ import qualified Data.Text as T (drop, dropWhile)
import qualified Data.Text.Read
import qualified Data.Map as Map
@@ -79,7 +286,7 @@ index cd67820..46b5d96 100644
defaultFormMessage :: FormMessage -> Text
defaultFormMessage = englishFormMessage
-@@ -104,10 +102,24 @@ intField = Field
+@@ -111,10 +109,25 @@ intField = Field
Right (a, "") -> Right a
_ -> Left $ MsgInvalidInteger s
@@ -87,28 +294,29 @@ index cd67820..46b5d96 100644
-$newline never
-<input id="#{theId}" name="#{name}" *{attrs} type="number" step=1 :isReq:required="" value="#{showVal val}">
-|]
-+ , fieldView = \theId name attrs val isReq -> toWidget $ \ _render_arOn
++ , fieldView = \theId name attrs val isReq -> toWidget $ \ _render_aJJh
+ -> do { id
+ ((Text.Blaze.Internal.preEscapedText . pack) "<input id=\"");
+ id (toHtml theId);
+ id ((Text.Blaze.Internal.preEscapedText . pack) "\" name=\"");
+ id (toHtml name);
+ id
-+ ((Text.Blaze.Internal.preEscapedText . pack) "\" type=\"number\"");
-+ Text.Hamlet.condH
++ ((Text.Blaze.Internal.preEscapedText . pack)
++ "\" type=\"number\" step=\"1\"");
++ condH
+ [(isReq,
+ id ((Text.Blaze.Internal.preEscapedText . pack) " required=\"\""))]
+ Nothing;
+ id ((Text.Blaze.Internal.preEscapedText . pack) " value=\"");
+ id (toHtml (showVal val));
+ id ((Text.Blaze.Internal.preEscapedText . pack) "\"");
-+ id ((Text.Hamlet.attrsToHtml . toAttributes) attrs);
++ id ((attrsToHtml . toAttributes) attrs);
+ id ((Text.Blaze.Internal.preEscapedText . pack) ">") }
+
, fieldEnctype = UrlEncoded
}
where
-@@ -121,10 +133,24 @@ doubleField = Field
+@@ -128,10 +141,25 @@ doubleField = Field
Right (a, "") -> Right a
_ -> Left $ MsgInvalidNumber s
@@ -116,28 +324,29 @@ index cd67820..46b5d96 100644
-$newline never
-<input id="#{theId}" name="#{name}" *{attrs} type="number" step=any :isReq:required="" value="#{showVal val}">
-|]
-+ , fieldView = \theId name attrs val isReq -> toWidget $ \ _render_arOz
++ , fieldView = \theId name attrs val isReq -> toWidget $ \ _render_aJJu
+ -> do { id
+ ((Text.Blaze.Internal.preEscapedText . pack) "<input id=\"");
+ id (toHtml theId);
+ id ((Text.Blaze.Internal.preEscapedText . pack) "\" name=\"");
+ id (toHtml name);
+ id
-+ ((Text.Blaze.Internal.preEscapedText . pack) "\" type=\"text\"");
-+ Text.Hamlet.condH
++ ((Text.Blaze.Internal.preEscapedText . pack)
++ "\" type=\"number\" step=\"any\"");
++ condH
+ [(isReq,
+ id ((Text.Blaze.Internal.preEscapedText . pack) " required=\"\""))]
+ Nothing;
+ id ((Text.Blaze.Internal.preEscapedText . pack) " value=\"");
+ id (toHtml (showVal val));
+ id ((Text.Blaze.Internal.preEscapedText . pack) "\"");
-+ id ((Text.Hamlet.attrsToHtml . toAttributes) attrs);
++ id ((attrsToHtml . toAttributes) attrs);
+ id ((Text.Blaze.Internal.preEscapedText . pack) ">") }
+
, fieldEnctype = UrlEncoded
}
where showVal = either id (pack . show)
-@@ -132,10 +158,24 @@ $newline never
+@@ -139,10 +167,24 @@ $newline never
dayField :: Monad m => RenderMessage (HandlerSite m) FormMessage => Field m Day
dayField = Field
{ fieldParse = parseHelper $ parseDate . unpack
@@ -145,7 +354,7 @@ index cd67820..46b5d96 100644
-$newline never
-<input id="#{theId}" name="#{name}" *{attrs} type="date" :isReq:required="" value="#{showVal val}">
-|]
-+ , fieldView = \theId name attrs val isReq -> toWidget $ \ _render_arOJ
++ , fieldView = \theId name attrs val isReq -> toWidget $ \ _render_aJJF
+ -> do { id
+ ((Text.Blaze.Internal.preEscapedText . pack) "<input id=\"");
+ id (toHtml theId);
@@ -153,20 +362,20 @@ index cd67820..46b5d96 100644
+ id (toHtml name);
+ id
+ ((Text.Blaze.Internal.preEscapedText . pack) "\" type=\"date\"");
-+ Text.Hamlet.condH
++ condH
+ [(isReq,
+ id ((Text.Blaze.Internal.preEscapedText . pack) " required=\"\""))]
+ Nothing;
+ id ((Text.Blaze.Internal.preEscapedText . pack) " value=\"");
+ id (toHtml (showVal val));
+ id ((Text.Blaze.Internal.preEscapedText . pack) "\"");
-+ id ((Text.Hamlet.attrsToHtml . toAttributes) attrs);
++ id ((attrsToHtml . toAttributes) attrs);
+ id ((Text.Blaze.Internal.preEscapedText . pack) ">") }
+
, fieldEnctype = UrlEncoded
}
where showVal = either id (pack . show)
-@@ -143,10 +183,23 @@ $newline never
+@@ -150,10 +192,23 @@ $newline never
timeField :: Monad m => RenderMessage (HandlerSite m) FormMessage => Field m TimeOfDay
timeField = Field
{ fieldParse = parseHelper parseTime
@@ -174,42 +383,47 @@ index cd67820..46b5d96 100644
-$newline never
-<input id="#{theId}" name="#{name}" *{attrs} :isReq:required="" value="#{showVal val}">
-|]
-+ , fieldView = \theId name attrs val isReq -> toWidget $ \ _render_arOW
++ , fieldView = \theId name attrs val isReq -> toWidget $ \ _render_aJJT
+ -> do { id
+ ((Text.Blaze.Internal.preEscapedText . pack) "<input id=\"");
+ id (toHtml theId);
+ id ((Text.Blaze.Internal.preEscapedText . pack) "\" name=\"");
+ id (toHtml name);
+ id ((Text.Blaze.Internal.preEscapedText . pack) "\"");
-+ Text.Hamlet.condH
++ condH
+ [(isReq,
+ id ((Text.Blaze.Internal.preEscapedText . pack) " required=\"\""))]
+ Nothing;
+ id ((Text.Blaze.Internal.preEscapedText . pack) " value=\"");
+ id (toHtml (showVal val));
+ id ((Text.Blaze.Internal.preEscapedText . pack) "\"");
-+ id ((Text.Hamlet.attrsToHtml . toAttributes) attrs);
++ id ((attrsToHtml . toAttributes) attrs);
+ id ((Text.Blaze.Internal.preEscapedText . pack) ">") }
+
, fieldEnctype = UrlEncoded
}
where
-@@ -159,10 +212,18 @@ $newline never
+@@ -166,10 +221,23 @@ $newline never
htmlField :: Monad m => RenderMessage (HandlerSite m) FormMessage => Field m Html
htmlField = Field
{ fieldParse = parseHelper $ Right . preEscapedText . sanitizeBalance
-- , fieldView = \theId name attrs val _isReq -> toWidget [hamlet|
+- , fieldView = \theId name attrs val isReq -> toWidget [hamlet|
-$newline never
--<textarea id="#{theId}" name="#{name}" *{attrs}>#{showVal val}
+-<textarea :isReq:required="" id="#{theId}" name="#{name}" *{attrs}>#{showVal val}
-|]
-+ , fieldView = \theId name attrs val _isReq -> toWidget $ \ _render_arP6
++ , fieldView = \theId name attrs val isReq -> toWidget $ \ _render_aJK4
+ -> do { id
-+ ((Text.Blaze.Internal.preEscapedText . pack) "<textarea id=\"");
++ ((Text.Blaze.Internal.preEscapedText . pack) "<textarea");
++ condH
++ [(isReq,
++ id ((Text.Blaze.Internal.preEscapedText . pack) " required=\"\""))]
++ Nothing;
++ id ((Text.Blaze.Internal.preEscapedText . pack) " id=\"");
+ id (toHtml theId);
+ id ((Text.Blaze.Internal.preEscapedText . pack) "\" name=\"");
+ id (toHtml name);
+ id ((Text.Blaze.Internal.preEscapedText . pack) "\"");
-+ id ((Text.Hamlet.attrsToHtml . toAttributes) attrs);
++ id ((attrsToHtml . toAttributes) attrs);
+ id ((Text.Blaze.Internal.preEscapedText . pack) ">");
+ id (toHtml (showVal val));
+ id ((Text.Blaze.Internal.preEscapedText . pack) "</textarea>") }
@@ -217,16 +431,7 @@ index cd67820..46b5d96 100644
, fieldEnctype = UrlEncoded
}
where showVal = either id (pack . renderHtml)
-@@ -171,8 +232,6 @@ $newline never
- -- br-tags.
- newtype Textarea = Textarea { unTextarea :: Text }
- deriving (Show, Read, Eq, PersistField, Ord, ToJSON, FromJSON)
--instance PersistFieldSql Textarea where
-- sqlType _ = SqlString
- instance ToHtml Textarea where
- toHtml =
- unsafeByteString
-@@ -190,10 +249,18 @@ instance ToHtml Textarea where
+@@ -197,10 +265,18 @@ instance ToHtml Textarea where
textareaField :: Monad m => RenderMessage (HandlerSite m) FormMessage => Field m Textarea
textareaField = Field
{ fieldParse = parseHelper $ Right . Textarea
@@ -234,14 +439,14 @@ index cd67820..46b5d96 100644
-$newline never
-<textarea id="#{theId}" name="#{name}" *{attrs}>#{either id unTextarea val}
-|]
-+ , fieldView = \theId name attrs val _isReq -> toWidget $ \ _render_arPf
++ , fieldView = \theId name attrs val _isReq -> toWidget $ \ _render_aJKe
+ -> do { id
+ ((Text.Blaze.Internal.preEscapedText . pack) "<textarea id=\"");
+ id (toHtml theId);
+ id ((Text.Blaze.Internal.preEscapedText . pack) "\" name=\"");
+ id (toHtml name);
+ id ((Text.Blaze.Internal.preEscapedText . pack) "\"");
-+ id ((Text.Hamlet.attrsToHtml . toAttributes) attrs);
++ id ((attrsToHtml . toAttributes) attrs);
+ id ((Text.Blaze.Internal.preEscapedText . pack) ">");
+ id (toHtml (either id unTextarea val));
+ id ((Text.Blaze.Internal.preEscapedText . pack) "</textarea>") }
@@ -249,7 +454,7 @@ index cd67820..46b5d96 100644
, fieldEnctype = UrlEncoded
}
-@@ -201,10 +268,19 @@ hiddenField :: (Monad m, PathPiece p, RenderMessage (HandlerSite m) FormMessage)
+@@ -208,10 +284,19 @@ hiddenField :: (Monad m, PathPiece p, RenderMessage (HandlerSite m) FormMessage)
=> Field m p
hiddenField = Field
{ fieldParse = parseHelper $ maybe (Left MsgValueRequired) Right . fromPathPiece
@@ -257,7 +462,7 @@ index cd67820..46b5d96 100644
-$newline never
-<input type="hidden" id="#{theId}" name="#{name}" *{attrs} value="#{either id toPathPiece val}">
-|]
-+ , fieldView = \theId name attrs val _isReq -> toWidget $ \ _render_arPo
++ , fieldView = \theId name attrs val _isReq -> toWidget $ \ _render_aJKo
+ -> do { id
+ ((Text.Blaze.Internal.preEscapedText . pack)
+ "<input type=\"hidden\" id=\"");
@@ -267,13 +472,13 @@ index cd67820..46b5d96 100644
+ id ((Text.Blaze.Internal.preEscapedText . pack) "\" value=\"");
+ id (toHtml (either id toPathPiece val));
+ id ((Text.Blaze.Internal.preEscapedText . pack) "\"");
-+ id ((Text.Hamlet.attrsToHtml . toAttributes) attrs);
++ id ((attrsToHtml . toAttributes) attrs);
+ id ((Text.Blaze.Internal.preEscapedText . pack) ">") }
+
, fieldEnctype = UrlEncoded
}
-@@ -212,20 +288,55 @@ textField :: Monad m => RenderMessage (HandlerSite m) FormMessage => Field m Tex
+@@ -219,20 +304,53 @@ textField :: Monad m => RenderMessage (HandlerSite m) FormMessage => Field m Tex
textField = Field
{ fieldParse = parseHelper $ Right
, fieldView = \theId name attrs val isReq ->
@@ -281,28 +486,26 @@ index cd67820..46b5d96 100644
-$newline never
-<input id="#{theId}" name="#{name}" *{attrs} type="text" :isReq:required value="#{either id id val}">
-|]
-+ do { (Yesod.Core.Widget.asWidgetT . toWidget)
++ do { (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) "<input id=\"");
-+ (Yesod.Core.Widget.asWidgetT . toWidget) (toHtml theId);
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ (asWidgetT . toWidget) (toHtml theId);
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) "\" name=\"");
-+ (Yesod.Core.Widget.asWidgetT . toWidget) (toHtml name);
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ (asWidgetT . toWidget) (toHtml name);
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) "\" type=\"text\"");
-+ Text.Hamlet.condH
++ condH
+ [(isReq,
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) " required"))]
+ Nothing;
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) " value=\"");
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
-+ (toHtml (either id id val));
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ (asWidgetT . toWidget) (toHtml (either id id val));
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) "\"");
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
-+ ((Text.Hamlet.attrsToHtml . toAttributes) attrs);
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ (asWidgetT . toWidget) ((attrsToHtml . toAttributes) attrs);
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) ">") }
+
, fieldEnctype = UrlEncoded
@@ -315,7 +518,7 @@ index cd67820..46b5d96 100644
-$newline never
-<input id="#{theId}" name="#{name}" *{attrs} type="password" :isReq:required="" value="#{either id id val}">
-|]
-+ , fieldView = \theId name attrs val isReq -> toWidget $ \ _render_arPF
++ , fieldView = \theId name attrs val isReq -> toWidget $ \ _render_aJKH
+ -> do { id
+ ((Text.Blaze.Internal.preEscapedText . pack) "<input id=\"");
+ id (toHtml theId);
@@ -324,20 +527,20 @@ index cd67820..46b5d96 100644
+ id
+ ((Text.Blaze.Internal.preEscapedText . pack)
+ "\" type=\"password\"");
-+ Text.Hamlet.condH
++ condH
+ [(isReq,
+ id ((Text.Blaze.Internal.preEscapedText . pack) " required=\"\""))]
+ Nothing;
+ id ((Text.Blaze.Internal.preEscapedText . pack) " value=\"");
+ id (toHtml (either id id val));
+ id ((Text.Blaze.Internal.preEscapedText . pack) "\"");
-+ id ((Text.Hamlet.attrsToHtml . toAttributes) attrs);
++ id ((attrsToHtml . toAttributes) attrs);
+ id ((Text.Blaze.Internal.preEscapedText . pack) ">") }
+
, fieldEnctype = UrlEncoded
}
-@@ -297,57 +408,24 @@ emailField = Field
+@@ -304,10 +422,24 @@ emailField = Field
case Email.canonicalizeEmail $ encodeUtf8 s of
Just e -> Right $ decodeUtf8With lenientDecode e
Nothing -> Left $ MsgInvalidEmail s
@@ -345,9 +548,7 @@ index cd67820..46b5d96 100644
-$newline never
-<input id="#{theId}" name="#{name}" *{attrs} type="email" :isReq:required="" value="#{either id id val}">
-|]
-- , fieldEnctype = UrlEncoded
-- }
-+ , fieldView = \theId name attrs val isReq -> toWidget $ \ _render_arQe
++ , fieldView = \theId name attrs val isReq -> toWidget $ \ _render_aJLq
+ -> do { id
+ ((Text.Blaze.Internal.preEscapedText . pack) "<input id=\"");
+ id (toHtml theId);
@@ -355,52 +556,86 @@ index cd67820..46b5d96 100644
+ id (toHtml name);
+ id
+ ((Text.Blaze.Internal.preEscapedText . pack) "\" type=\"email\"");
-+ Text.Hamlet.condH
++ condH
+ [(isReq,
+ id ((Text.Blaze.Internal.preEscapedText . pack) " required=\"\""))]
+ Nothing;
+ id ((Text.Blaze.Internal.preEscapedText . pack) " value=\"");
+ id (toHtml (either id id val));
+ id ((Text.Blaze.Internal.preEscapedText . pack) "\"");
-+ id ((Text.Hamlet.attrsToHtml . toAttributes) attrs);
++ id ((attrsToHtml . toAttributes) attrs);
+ id ((Text.Blaze.Internal.preEscapedText . pack) ">") }
++
+ , fieldEnctype = UrlEncoded
+ }
---- |
----
---- Since 1.3.7
--multiEmailField :: Monad m => RenderMessage (HandlerSite m) FormMessage => Field m [Text]
--multiEmailField = Field
-- { fieldParse = parseHelper $
-- \s ->
-- let addrs = map validate $ splitOn "," s
-- in case partitionEithers addrs of
-- ([], good) -> Right good
-- (bad, _) -> Left $ MsgInvalidEmail $ cat bad
+@@ -322,10 +454,25 @@ multiEmailField = Field
+ in case partitionEithers addrs of
+ ([], good) -> Right good
+ (bad, _) -> Left $ MsgInvalidEmail $ cat bad
- , fieldView = \theId name attrs val isReq -> toWidget [hamlet|
-$newline never
-<input id="#{theId}" name="#{name}" *{attrs} type="email" multiple :isReq:required="" value="#{either id cat val}">
-|]
-- , fieldEnctype = UrlEncoded
-- }
-- where
-- -- report offending address along with error
-- validate a = case Email.validate $ encodeUtf8 a of
-- Left e -> Left $ T.concat [a, " (", pack e, ")"]
-- Right r -> Right $ emailToText r
-- cat = intercalate ", "
-- emailToText = decodeUtf8With lenientDecode . Email.toByteString
--
--type AutoFocus = Bool
--searchField :: Monad m => RenderMessage (HandlerSite m) FormMessage => AutoFocus -> Field m Text
--searchField autoFocus = Field
-- { fieldParse = parseHelper Right
-- , fieldView = \theId name attrs val isReq -> do
++ , fieldView = \theId name attrs val isReq -> toWidget $ \ _render_aJMd
++ -> do { id
++ ((Text.Blaze.Internal.preEscapedText . pack) "<input id=\"");
++ id (toHtml theId);
++ id ((Text.Blaze.Internal.preEscapedText . pack) "\" name=\"");
++ id (toHtml name);
++ id
++ ((Text.Blaze.Internal.preEscapedText . pack)
++ "\" type=\"email\" multiple");
++ condH
++ [(isReq,
++ id ((Text.Blaze.Internal.preEscapedText . pack) " required=\"\""))]
++ Nothing;
++ id ((Text.Blaze.Internal.preEscapedText . pack) " value=\"");
++ id (toHtml (either id cat val));
++ id ((Text.Blaze.Internal.preEscapedText . pack) "\"");
++ id ((attrsToHtml . toAttributes) attrs);
++ id ((Text.Blaze.Internal.preEscapedText . pack) ">") }
++
+ , fieldEnctype = UrlEncoded
+ }
+ where
+@@ -341,20 +488,75 @@ searchField :: Monad m => RenderMessage (HandlerSite m) FormMessage => AutoFocus
+ searchField autoFocus = Field
+ { fieldParse = parseHelper Right
+ , fieldView = \theId name attrs val isReq -> do
- [whamlet|
-$newline never
-<input id="#{theId}" name="#{name}" *{attrs} type="search" :isReq:required="" :autoFocus:autofocus="" value="#{either id id val}">
-|]
-- when autoFocus $ do
-- -- we want this javascript to be placed immediately after the field
++ do { (asWidgetT . toWidget)
++ ((Text.Blaze.Internal.preEscapedText . pack) "<input id=\"");
++ (asWidgetT . toWidget) (toHtml theId);
++ (asWidgetT . toWidget)
++ ((Text.Blaze.Internal.preEscapedText . pack) "\" name=\"");
++ (asWidgetT . toWidget) (toHtml name);
++ (asWidgetT . toWidget)
++ ((Text.Blaze.Internal.preEscapedText . pack) "\" type=\"search\"");
++ condH
++ [(isReq,
++ (asWidgetT . toWidget)
++ ((Text.Blaze.Internal.preEscapedText . pack) " required=\"\""))]
++ Nothing;
++ condH
++ [(autoFocus,
++ (asWidgetT . toWidget)
++ ((Text.Blaze.Internal.preEscapedText . pack) " autofocus=\"\""))]
++ Nothing;
++ (asWidgetT . toWidget)
++ ((Text.Blaze.Internal.preEscapedText . pack) " value=\"");
++ (asWidgetT . toWidget) (toHtml (either id id val));
++ (asWidgetT . toWidget)
++ ((Text.Blaze.Internal.preEscapedText . pack) "\"");
++ (asWidgetT . toWidget) ((attrsToHtml . toAttributes) attrs);
++ (asWidgetT . toWidget)
++ ((Text.Blaze.Internal.preEscapedText . pack) ">") }
++
+ when autoFocus $ do
+ -- we want this javascript to be placed immediately after the field
- [whamlet|
-$newline never
-<script>if (!('autofocus' in document.createElement('input'))) {document.getElementById('#{theId}').focus();}
@@ -409,42 +644,80 @@ index cd67820..46b5d96 100644
- ##{theId}
- -webkit-appearance: textfield
- |]
++ do { (asWidgetT . toWidget)
++ ((Text.Blaze.Internal.preEscapedText . pack)
++ "<script>if (!('autofocus' in document.createElement('input'))) {document.getElementById('");
++ (asWidgetT . toWidget) (toHtml theId);
++ (asWidgetT . toWidget)
++ ((Text.Blaze.Internal.preEscapedText . pack)
++ "').focus();}</script>") }
++
++ toWidget $ \ _render_aJMx
++ -> (Text.Css.CssNoWhitespace
++ . (foldr ($) []))
++ [((++)
++ $ (map
++ Text.Css.TopBlock
++ (((Text.Css.Block
++ {Text.Css.blockSelector = Data.Monoid.mconcat
++ [(Text.Css.fromText
++ . Text.Css.pack)
++ "#",
++ toCss theId],
++ Text.Css.blockAttrs = (Prelude.concat
++ $ ([Text.Css.Attr
++ (Data.Monoid.mconcat
++ [(Text.Css.fromText
++ . Text.Css.pack)
++ "-webkit-appearance"])
++ (Data.Monoid.mconcat
++ [(Text.Css.fromText
++ . Text.Css.pack)
++ "textfield"])]
++ :
++ (map
++ Text.Css.mixinAttrs
++ []))),
++ Text.Css.blockBlocks = (),
++ Text.Css.blockMixins = ()} :)
++ . ((foldr (.) id [])
++ . (concatMap Text.Css.mixinBlocks [] ++)))
++ [])))]
++
, fieldEnctype = UrlEncoded
}
-@@ -358,7 +436,30 @@ urlField = Field
+@@ -365,7 +567,28 @@ urlField = Field
Nothing -> Left $ MsgInvalidUrl s
Just _ -> Right s
, fieldView = \theId name attrs val isReq ->
- [whamlet|<input ##{theId} name=#{name} *{attrs} type=url :isReq:required value=#{either id id val}>|]
-+ do { (Yesod.Core.Widget.asWidgetT . toWidget)
++ do { (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) "<input id=\"");
-+ (Yesod.Core.Widget.asWidgetT . toWidget) (toHtml theId);
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ (asWidgetT . toWidget) (toHtml theId);
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) "\" name=\"");
-+ (Yesod.Core.Widget.asWidgetT . toWidget) (toHtml name);
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ (asWidgetT . toWidget) (toHtml name);
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) "\" type=\"url\"");
-+ Text.Hamlet.condH
++ condH
+ [(isReq,
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) " required"))]
+ Nothing;
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) " value=\"");
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
-+ (toHtml (either id id val));
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ (asWidgetT . toWidget) (toHtml (either id id val));
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) "\"");
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
-+ ((Text.Hamlet.attrsToHtml . toAttributes) attrs);
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ (asWidgetT . toWidget) ((attrsToHtml . toAttributes) attrs);
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) ">") }
+
, fieldEnctype = UrlEncoded
}
-@@ -371,18 +472,56 @@ selectField :: (Eq a, RenderMessage site FormMessage)
+@@ -378,18 +601,54 @@ selectField :: (Eq a, RenderMessage site FormMessage)
=> HandlerT site IO (OptionList a)
-> Field (HandlerT site IO) a
selectField = selectFieldHelper
@@ -460,60 +733,58 @@ index cd67820..46b5d96 100644
-$newline never
-<option value=#{value} :isSel:selected>#{text}
-|]) -- inside
-+ (\theId name attrs inside -> do { (Yesod.Core.Widget.asWidgetT . toWidget)
++ (\theId name attrs inside -> do { (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) "<select id=\"");
-+ (Yesod.Core.Widget.asWidgetT . toWidget) (toHtml theId);
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ (asWidgetT . toWidget) (toHtml theId);
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) "\" name=\"");
-+ (Yesod.Core.Widget.asWidgetT . toWidget) (toHtml name);
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ (asWidgetT . toWidget) (toHtml name);
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) "\"");
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
-+ ((Text.Hamlet.attrsToHtml . toAttributes) attrs);
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ (asWidgetT . toWidget) ((attrsToHtml . toAttributes) attrs);
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) ">");
-+ (Yesod.Core.Widget.asWidgetT . toWidget) inside;
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ (asWidgetT . toWidget) inside;
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) "</select>") })
+ -- outside
-+ (\_theId _name isSel -> do { (Yesod.Core.Widget.asWidgetT . toWidget)
++ (\_theId _name isSel -> do { (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack)
+ "<option value=\"none\"");
-+ Text.Hamlet.condH
++ condH
+ [(isSel,
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) " selected"))]
+ Nothing;
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) ">");
+ ((Control.Monad.liftM (toHtml .) getMessageRender)
+ >>=
-+ (\ urender_arQS
-+ -> (Yesod.Core.Widget.asWidgetT . toWidget)
-+ (urender_arQS MsgSelectNone)));
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ (\ urender_aJMX
++ -> (asWidgetT . toWidget) (urender_aJMX MsgSelectNone)));
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) "</option>") })
+ -- onOpt
-+ (\_theId _name _attrs value isSel text -> do { (Yesod.Core.Widget.asWidgetT . toWidget)
++ (\_theId _name _attrs value isSel text -> do { (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) "<option value=\"");
-+ (Yesod.Core.Widget.asWidgetT . toWidget) (toHtml value);
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ (asWidgetT . toWidget) (toHtml value);
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) "\"");
-+ Text.Hamlet.condH
++ condH
+ [(isSel,
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) " selected"))]
+ Nothing;
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) ">");
-+ (Yesod.Core.Widget.asWidgetT . toWidget) (toHtml text);
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ (asWidgetT . toWidget) (toHtml text);
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) "</option>") })
+ -- inside
multiSelectFieldList :: (Eq a, RenderMessage site FormMessage, RenderMessage site msg)
=> [(msg, a)]
-@@ -405,11 +544,48 @@ multiSelectField ioptlist =
+@@ -412,11 +671,45 @@ multiSelectField ioptlist =
view theId name attrs val isReq = do
opts <- fmap olOptions $ handlerToWidget ioptlist
let selOpts = map (id &&& (optselected val)) opts
@@ -522,68 +793,52 @@ index cd67820..46b5d96 100644
- $forall (opt, optsel) <- selOpts
- <option value=#{optionExternalValue opt} :optsel:selected>#{optionDisplay opt}
- |]
-+ do { (Yesod.Core.Widget.asWidgetT . toWidget)
++ do { (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) "<select id=\"");
-+ (Yesod.Core.Widget.asWidgetT . toWidget) (toHtml theId);
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ (asWidgetT . toWidget) (toHtml theId);
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) "\" name=\"");
-+ (Yesod.Core.Widget.asWidgetT . toWidget) (toHtml name);
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ (asWidgetT . toWidget) (toHtml name);
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) "\"");
-+ Text.Hamlet.condH
++ condH
+ [(isReq,
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) " required"))]
+ Nothing;
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) " multiple");
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
-+ ((Text.Hamlet.attrsToHtml . toAttributes) attrs);
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ (asWidgetT . toWidget) ((attrsToHtml . toAttributes) attrs);
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) ">");
+ Data.Foldable.mapM_
-+ (\ (opt_arRl, optsel_arRm)
-+ -> do { (Yesod.Core.Widget.asWidgetT . toWidget)
++ (\ (opt_aJNs, optsel_aJNt)
++ -> do { (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) "<option value=\"");
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
-+ (toHtml (optionExternalValue opt_arRl));
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ (asWidgetT . toWidget) (toHtml (optionExternalValue opt_aJNs));
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) "\"");
-+ Text.Hamlet.condH
-+ [(optsel_arRm,
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ condH
++ [(optsel_aJNt,
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) " selected"))]
+ Nothing;
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) ">");
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
-+ (toHtml (optionDisplay opt_arRl));
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ (asWidgetT . toWidget) (toHtml (optionDisplay opt_aJNs));
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) "</option>") })
+ selOpts;
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) "</select>") }
+
where
optselected (Left _) _ = False
optselected (Right vals) opt = (optionInternalValue opt) `elem` vals
-@@ -419,67 +595,172 @@ radioFieldList :: (Eq a, RenderMessage site FormMessage, RenderMessage site msg)
- -> Field (HandlerT site IO) a
- radioFieldList = radioField . optionsPairs
-
--checkboxesFieldList :: (Eq a, RenderMessage site FormMessage, RenderMessage site msg) => [(msg, a)]
-- -> Field (HandlerT site IO) [a]
--checkboxesFieldList = checkboxesField . optionsPairs
--
--checkboxesField :: (Eq a, RenderMessage site FormMessage)
-- => HandlerT site IO (OptionList a)
-- -> Field (HandlerT site IO) [a]
--checkboxesField ioptlist = (multiSelectField ioptlist)
-- { fieldView =
-- \theId name attrs val isReq -> do
-- opts <- fmap olOptions $ handlerToWidget ioptlist
-- let optselected (Left _) _ = False
-- optselected (Right vals) opt = (optionInternalValue opt) `elem` vals
+@@ -439,54 +732,196 @@ checkboxesField ioptlist = (multiSelectField ioptlist)
+ opts <- fmap olOptions $ handlerToWidget ioptlist
+ let optselected (Left _) _ = False
+ optselected (Right vals) opt = (optionInternalValue opt) `elem` vals
- [whamlet|
- <span ##{theId}>
- $forall opt <- opts
@@ -591,7 +846,38 @@ index cd67820..46b5d96 100644
- <input type=checkbox name=#{name} value=#{optionExternalValue opt} *{attrs} :optselected val opt:checked>
- #{optionDisplay opt}
- |]
-- }
++ do { (asWidgetT . toWidget)
++ ((Text.Blaze.Internal.preEscapedText . pack) "<span id=\"");
++ (asWidgetT . toWidget) (toHtml theId);
++ (asWidgetT . toWidget)
++ ((Text.Blaze.Internal.preEscapedText . pack) "\">");
++ Data.Foldable.mapM_
++ (\ opt_aJNI
++ -> do { (asWidgetT . toWidget)
++ ((Text.Blaze.Internal.preEscapedText . pack)
++ "<label><input type=\"checkbox\" name=\"");
++ (asWidgetT . toWidget) (toHtml name);
++ (asWidgetT . toWidget)
++ ((Text.Blaze.Internal.preEscapedText . pack) "\" value=\"");
++ (asWidgetT . toWidget) (toHtml (optionExternalValue opt_aJNI));
++ (asWidgetT . toWidget)
++ ((Text.Blaze.Internal.preEscapedText . pack) "\"");
++ condH
++ [(optselected val opt_aJNI,
++ (asWidgetT . toWidget)
++ ((Text.Blaze.Internal.preEscapedText . pack) " checked"))]
++ Nothing;
++ (asWidgetT . toWidget) ((attrsToHtml . toAttributes) attrs);
++ (asWidgetT . toWidget)
++ ((Text.Blaze.Internal.preEscapedText . pack) ">");
++ (asWidgetT . toWidget) (toHtml (optionDisplay opt_aJNI));
++ (asWidgetT . toWidget)
++ ((Text.Blaze.Internal.preEscapedText . pack) "</label>") })
++ opts;
++ (asWidgetT . toWidget)
++ ((Text.Blaze.Internal.preEscapedText . pack) "</span>") }
++
+ }
radioField :: (Eq a, RenderMessage site FormMessage)
=> HandlerT site IO (OptionList a)
@@ -615,78 +901,76 @@ index cd67820..46b5d96 100644
- <input id=#{theId}-#{value} type=radio name=#{name} value=#{value} :isSel:checked *{attrs}>
- \#{text}
-|])
-+ (\theId _name _attrs inside -> do { (Yesod.Core.Widget.asWidgetT . toWidget)
++ (\theId _name _attrs inside -> do { (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) "<div id=\"");
-+ (Yesod.Core.Widget.asWidgetT . toWidget) (toHtml theId);
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ (asWidgetT . toWidget) (toHtml theId);
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) "\">");
-+ (Yesod.Core.Widget.asWidgetT . toWidget) inside;
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
-+ ((Text.Blaze.Internal.preEscapedText . pack) "</div>") })
++ (asWidgetT . toWidget) inside;
++ (asWidgetT . toWidget)
++ ((Text.Blaze.Internal.preEscapedText . pack) "</div>") }
+
-+ (\theId name isSel -> do { (Yesod.Core.Widget.asWidgetT . toWidget)
++ (\theId name isSel -> do { (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack)
+ "<label class=\"radio\" for=\"");
-+ (Yesod.Core.Widget.asWidgetT . toWidget) (toHtml theId);
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ (asWidgetT . toWidget) (toHtml theId);
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack)
+ "-none\"><div><input id=\"");
-+ (Yesod.Core.Widget.asWidgetT . toWidget) (toHtml theId);
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ (asWidgetT . toWidget) (toHtml theId);
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack)
+ "-none\" type=\"radio\" name=\"");
-+ (Yesod.Core.Widget.asWidgetT . toWidget) (toHtml name);
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ (asWidgetT . toWidget) (toHtml name);
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) "\" value=\"none\"");
-+ Text.Hamlet.condH
++ condH
+ [(isSel,
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) " checked"))]
+ Nothing;
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) ">");
+ ((Control.Monad.liftM (toHtml .) getMessageRender)
+ >>=
-+ (\ urender_arRA
-+ -> (Yesod.Core.Widget.asWidgetT . toWidget)
-+ (urender_arRA MsgSelectNone)));
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ (\ urender_aJNY
++ -> (asWidgetT . toWidget) (urender_aJNY MsgSelectNone)));
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) "</div></label>") })
+
-+ (\theId name attrs value isSel text -> do { (Yesod.Core.Widget.asWidgetT . toWidget)
++ (\theId name attrs value isSel text -> do { (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack)
+ "<label class=\"radio\" for=\"");
-+ (Yesod.Core.Widget.asWidgetT . toWidget) (toHtml theId);
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ (asWidgetT . toWidget) (toHtml theId);
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) "-");
-+ (Yesod.Core.Widget.asWidgetT . toWidget) (toHtml value);
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ (asWidgetT . toWidget) (toHtml value);
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack)
+ "\"><div><input id=\"");
-+ (Yesod.Core.Widget.asWidgetT . toWidget) (toHtml theId);
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ (asWidgetT . toWidget) (toHtml theId);
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) "-");
-+ (Yesod.Core.Widget.asWidgetT . toWidget) (toHtml value);
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ (asWidgetT . toWidget) (toHtml value);
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack)
+ "\" type=\"radio\" name=\"");
-+ (Yesod.Core.Widget.asWidgetT . toWidget) (toHtml name);
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ (asWidgetT . toWidget) (toHtml name);
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) "\" value=\"");
-+ (Yesod.Core.Widget.asWidgetT . toWidget) (toHtml value);
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ (asWidgetT . toWidget) (toHtml value);
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) "\"");
-+ Text.Hamlet.condH
++ condH
+ [(isSel,
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) " checked"))]
+ Nothing;
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
-+ ((Text.Hamlet.attrsToHtml . toAttributes) attrs);
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ (asWidgetT . toWidget) ((attrsToHtml . toAttributes) attrs);
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) ">");
-+ (Yesod.Core.Widget.asWidgetT . toWidget) (toHtml text);
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ (asWidgetT . toWidget) (toHtml text);
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) "</div></label>") })
+
@@ -699,99 +983,93 @@ index cd67820..46b5d96 100644
- <input id=#{theId}-none *{attrs} type=radio name=#{name} value=none checked>
- <label for=#{theId}-none>_{MsgSelectNone}
-
--
--<input id=#{theId}-yes *{attrs} type=radio name=#{name} value=yes :showVal id val:checked>
--<label for=#{theId}-yes>_{MsgBoolYes}
-+ , fieldView = \theId name attrs val isReq -> do { Text.Hamlet.condH
++ , fieldView = \theId name attrs val isReq -> do { condH
+ [(not isReq,
-+ do { (Yesod.Core.Widget.asWidgetT . toWidget)
++ do { (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) "<input id=\"");
-+ (Yesod.Core.Widget.asWidgetT . toWidget) (toHtml theId);
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ (asWidgetT . toWidget) (toHtml theId);
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack)
+ "-none\" type=\"radio\" name=\"");
-+ (Yesod.Core.Widget.asWidgetT . toWidget) (toHtml name);
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ (asWidgetT . toWidget) (toHtml name);
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack)
+ "\" value=\"none\" checked");
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
-+ ((Text.Hamlet.attrsToHtml . toAttributes) attrs);
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ (asWidgetT . toWidget) ((attrsToHtml . toAttributes) attrs);
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) "><label for=\"");
-+ (Yesod.Core.Widget.asWidgetT . toWidget) (toHtml theId);
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ (asWidgetT . toWidget) (toHtml theId);
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) "-none\">");
+ ((Control.Monad.liftM (toHtml .) getMessageRender)
+ >>=
-+ (\ urender_arRX
-+ -> (Yesod.Core.Widget.asWidgetT . toWidget)
-+ (urender_arRX MsgSelectNone)));
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ (\ urender_aJOn
++ -> (asWidgetT . toWidget) (urender_aJOn MsgSelectNone)));
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) "</label>") })]
+ Nothing;
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) "<input id=\"");
-+ (Yesod.Core.Widget.asWidgetT . toWidget) (toHtml theId);
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ (asWidgetT . toWidget) (toHtml theId);
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack)
+ "-yes\" type=\"radio\" name=\"");
-+ (Yesod.Core.Widget.asWidgetT . toWidget) (toHtml name);
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ (asWidgetT . toWidget) (toHtml name);
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) "\" value=\"yes\"");
-+ Text.Hamlet.condH
++ condH
+ [(showVal id val,
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) " checked"))]
+ Nothing;
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
-+ ((Text.Hamlet.attrsToHtml . toAttributes) attrs);
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ (asWidgetT . toWidget) ((attrsToHtml . toAttributes) attrs);
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) "><label for=\"");
-+ (Yesod.Core.Widget.asWidgetT . toWidget) (toHtml theId);
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ (asWidgetT . toWidget) (toHtml theId);
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) "-yes\">");
+ ((Control.Monad.liftM (toHtml .) getMessageRender)
+ >>=
-+ (\ urender_arRY
-+ -> (Yesod.Core.Widget.asWidgetT . toWidget)
-+ (urender_arRY MsgBoolYes)));
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ (\ urender_aJOo
++ -> (asWidgetT . toWidget) (urender_aJOo MsgBoolYes)));
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack)
+ "</label><input id=\"");
-+ (Yesod.Core.Widget.asWidgetT . toWidget) (toHtml theId);
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ (asWidgetT . toWidget) (toHtml theId);
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack)
+ "-no\" type=\"radio\" name=\"");
-+ (Yesod.Core.Widget.asWidgetT . toWidget) (toHtml name);
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ (asWidgetT . toWidget) (toHtml name);
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) "\" value=\"no\"");
-+ Text.Hamlet.condH
++ condH
+ [(showVal not val,
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) " checked"))]
+ Nothing;
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
-+ ((Text.Hamlet.attrsToHtml . toAttributes) attrs);
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ (asWidgetT . toWidget) ((attrsToHtml . toAttributes) attrs);
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) "><label for=\"");
-+ (Yesod.Core.Widget.asWidgetT . toWidget) (toHtml theId);
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ (asWidgetT . toWidget) (toHtml theId);
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) "-no\">");
+ ((Control.Monad.liftM (toHtml .) getMessageRender)
+ >>=
-+ (\ urender_arRZ
-+ -> (Yesod.Core.Widget.asWidgetT . toWidget)
-+ (urender_arRZ MsgBoolNo)));
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ (\ urender_aJOp
++ -> (asWidgetT . toWidget) (urender_aJOp MsgBoolNo)));
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) "</label>") }
+-<input id=#{theId}-yes *{attrs} type=radio name=#{name} value=yes :showVal id val:checked>
+-<label for=#{theId}-yes>_{MsgBoolYes}
+-
-<input id=#{theId}-no *{attrs} type=radio name=#{name} value=no :showVal not val:checked>
-<label for=#{theId}-no>_{MsgBoolNo}
-|]
, fieldEnctype = UrlEncoded
}
where
-@@ -505,10 +786,25 @@ $newline never
+@@ -512,10 +947,24 @@ $newline never
checkBoxField :: Monad m => RenderMessage (HandlerSite m) FormMessage => Field m Bool
checkBoxField = Field
{ fieldParse = \e _ -> return $ checkBoxParser e
@@ -799,87 +1077,35 @@ index cd67820..46b5d96 100644
-$newline never
-<input id=#{theId} *{attrs} type=checkbox name=#{name} value=yes :showVal id val:checked>
-|]
-+ , fieldView = \theId name attrs val _ -> do { (Yesod.Core.Widget.asWidgetT . toWidget)
++ , fieldView = \theId name attrs val _ -> do { (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) "<input id=\"");
-+ (Yesod.Core.Widget.asWidgetT . toWidget) (toHtml theId);
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ (asWidgetT . toWidget) (toHtml theId);
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack)
+ "\" type=\"checkbox\" name=\"");
-+ (Yesod.Core.Widget.asWidgetT . toWidget) (toHtml name);
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ (asWidgetT . toWidget) (toHtml name);
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) "\" value=\"yes\"");
-+ Text.Hamlet.condH
++ condH
+ [(showVal id val,
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) " checked"))]
+ Nothing;
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
-+ ((Text.Hamlet.attrsToHtml . toAttributes) attrs);
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ (asWidgetT . toWidget) ((attrsToHtml . toAttributes) attrs);
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) ">") }
+
, fieldEnctype = UrlEncoded
}
-@@ -552,50 +848,6 @@ optionsPairs opts = do
- optionsEnum :: (MonadHandler m, Show a, Enum a, Bounded a) => m (OptionList a)
- optionsEnum = optionsPairs $ map (\x -> (pack $ show x, x)) [minBound..maxBound]
-
--optionsPersist :: ( YesodPersist site, PersistEntity a
-- , PersistQuery (YesodPersistBackend site (HandlerT site IO))
-- , PathPiece (Key a)
-- , PersistEntityBackend a ~ PersistMonadBackend (YesodPersistBackend site (HandlerT site IO))
-- , RenderMessage site msg
-- )
-- => [Filter a]
-- -> [SelectOpt a]
-- -> (a -> msg)
-- -> HandlerT site IO (OptionList (Entity a))
--optionsPersist filts ords toDisplay = fmap mkOptionList $ do
-- mr <- getMessageRender
-- pairs <- runDB $ selectList filts ords
-- return $ map (\(Entity key value) -> Option
-- { optionDisplay = mr (toDisplay value)
-- , optionInternalValue = Entity key value
-- , optionExternalValue = toPathPiece key
-- }) pairs
--
---- | An alternative to 'optionsPersist' which returns just the @Key@ instead of
---- the entire @Entity@.
----
---- Since 1.3.2
--optionsPersistKey
-- :: (YesodPersist site
-- , PersistEntity a
-- , PersistQuery (YesodPersistBackend site (HandlerT site IO))
-- , PathPiece (Key a)
-- , RenderMessage site msg
-- , PersistEntityBackend a ~ PersistMonadBackend (YesodPersistBackend site (HandlerT site IO)))
-- => [Filter a]
-- -> [SelectOpt a]
-- -> (a -> msg)
-- -> HandlerT site IO (OptionList (Key a))
--
--optionsPersistKey filts ords toDisplay = fmap mkOptionList $ do
-- mr <- getMessageRender
-- pairs <- runDB $ selectList filts ords
-- return $ map (\(Entity key value) -> Option
-- { optionDisplay = mr (toDisplay value)
-- , optionInternalValue = key
-- , optionExternalValue = toPathPiece key
-- }) pairs
--
- selectFieldHelper
- :: (Eq a, RenderMessage site FormMessage)
- => (Text -> Text -> [(Text, Text)] -> WidgetT site IO () -> WidgetT site IO ())
-@@ -638,9 +890,21 @@ fileField = Field
+@@ -665,9 +1114,21 @@ fileField = Field
case files of
[] -> Right Nothing
file:_ -> Right $ Just file
- , fieldView = \id' name attrs _ isReq -> toWidget [hamlet|
- <input id=#{id'} name=#{name} *{attrs} type=file :isReq:required>
- |]
-+ , fieldView = \id' name attrs _ isReq -> toWidget $ \ _render_arSN
++ , fieldView = \id' name attrs _ isReq -> toWidget $ \ _render_aJPt
+ -> do { id
+ ((Text.Blaze.Internal.preEscapedText . pack) "<input id=\"");
+ id (toHtml id');
@@ -887,17 +1113,17 @@ index cd67820..46b5d96 100644
+ id (toHtml name);
+ id
+ ((Text.Blaze.Internal.preEscapedText . pack) "\" type=\"file\"");
-+ Text.Hamlet.condH
++ condH
+ [(isReq,
+ id ((Text.Blaze.Internal.preEscapedText . pack) " required"))]
+ Nothing;
-+ id ((Text.Hamlet.attrsToHtml . toAttributes) attrs);
++ id ((attrsToHtml . toAttributes) attrs);
+ id ((Text.Blaze.Internal.preEscapedText . pack) ">") }
+
, fieldEnctype = Multipart
}
-@@ -667,10 +931,20 @@ fileAFormReq fs = AForm $ \(site, langs) menvs ints -> do
+@@ -694,10 +1155,19 @@ fileAFormReq fs = AForm $ \(site, langs) menvs ints -> do
{ fvLabel = toHtml $ renderMessage site langs $ fsLabel fs
, fvTooltip = fmap (toHtml . renderMessage site langs) $ fsTooltip fs
, fvId = id'
@@ -905,24 +1131,23 @@ index cd67820..46b5d96 100644
-$newline never
-<input type=file name=#{name} ##{id'} *{fsAttrs fs}>
-|]
-+ , fvInput = do { (Yesod.Core.Widget.asWidgetT . toWidget)
++ , fvInput = do { (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack)
+ "<input type=\"file\" name=\"");
-+ (Yesod.Core.Widget.asWidgetT . toWidget) (toHtml name);
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ (asWidgetT . toWidget) (toHtml name);
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) "\" id=\"");
-+ (Yesod.Core.Widget.asWidgetT . toWidget) (toHtml id');
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ (asWidgetT . toWidget) (toHtml id');
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) "\"");
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
-+ ((Text.Hamlet.attrsToHtml . toAttributes) (fsAttrs fs));
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ (asWidgetT . toWidget) ((attrsToHtml . toAttributes) (fsAttrs fs));
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) ">") }
+
, fvErrors = errs
, fvRequired = True
}
-@@ -699,10 +973,20 @@ fileAFormOpt fs = AForm $ \(master, langs) menvs ints -> do
+@@ -726,10 +1196,19 @@ fileAFormOpt fs = AForm $ \(master, langs) menvs ints -> do
{ fvLabel = toHtml $ renderMessage master langs $ fsLabel fs
, fvTooltip = fmap (toHtml . renderMessage master langs) $ fsTooltip fs
, fvId = id'
@@ -930,41 +1155,32 @@ index cd67820..46b5d96 100644
-$newline never
-<input type=file name=#{name} ##{id'} *{fsAttrs fs}>
-|]
-+ , fvInput = do { (Yesod.Core.Widget.asWidgetT . toWidget)
++ , fvInput = do { (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack)
+ "<input type=\"file\" name=\"");
-+ (Yesod.Core.Widget.asWidgetT . toWidget) (toHtml name);
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ (asWidgetT . toWidget) (toHtml name);
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) "\" id=\"");
-+ (Yesod.Core.Widget.asWidgetT . toWidget) (toHtml id');
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ (asWidgetT . toWidget) (toHtml id');
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) "\"");
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
-+ ((Text.Hamlet.attrsToHtml . toAttributes) (fsAttrs fs));
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ (asWidgetT . toWidget) ((attrsToHtml . toAttributes) (fsAttrs fs));
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) ">") }
+
, fvErrors = errs
, fvRequired = False
}
diff --git a/Yesod/Form/Functions.hs b/Yesod/Form/Functions.hs
-index d84633e..9d9257f 100644
+index 5fd03e6..b14d900 100644
--- a/Yesod/Form/Functions.hs
+++ b/Yesod/Form/Functions.hs
-@@ -25,7 +25,6 @@ module Yesod.Form.Functions
- , generateFormPost
- , generateFormGet
- -- * More than one form on a handler
-- , identifyForm
- -- * Rendering
- , FormRender
- , renderTable
-@@ -56,12 +55,16 @@ import Text.Blaze (Markup, toMarkup)
+@@ -59,12 +59,16 @@ import Text.Blaze (Markup, toMarkup)
#define toHtml toMarkup
import Yesod.Core
import Network.Wai (requestMethod)
-import Text.Hamlet (shamlet)
-+--`import Text.Hamlet (shamlet)
++--import Text.Hamlet (shamlet)
import Data.Monoid (mempty)
import Data.Maybe (listToMaybe, fromMaybe)
import qualified Data.Map as Map
@@ -977,7 +1193,7 @@ index d84633e..9d9257f 100644
-- | Get a unique identifier.
newFormIdent :: Monad m => MForm m Text
-@@ -213,7 +216,14 @@ postHelper form env = do
+@@ -216,7 +220,14 @@ postHelper form env = do
let token =
case reqToken req of
Nothing -> mempty
@@ -993,7 +1209,7 @@ index d84633e..9d9257f 100644
m <- getYesod
langs <- languages
((res, xml), enctype) <- runFormGeneric (form token) m langs env
-@@ -282,61 +292,17 @@ getHelper :: MonadHandler m
+@@ -296,7 +307,12 @@ getHelper :: MonadHandler m
-> Maybe (Env, FileEnv)
-> m (a, Enctype)
getHelper form env = do
@@ -1007,70 +1223,39 @@ index d84633e..9d9257f 100644
langs <- languages
m <- getYesod
runFormGeneric (form fragment) m langs env
-
-
---- | Creates a hidden field on the form that identifies it. This
---- identification is then used to distinguish between /missing/
---- and /wrong/ form data when a single handler contains more than
---- one form.
----
---- For instance, if you have the following code on your handler:
----
---- > ((fooRes, fooWidget), fooEnctype) <- runFormPost fooForm
---- > ((barRes, barWidget), barEnctype) <- runFormPost barForm
----
---- Then replace it with
----
---- > ((fooRes, fooWidget), fooEnctype) <- runFormPost $ identifyForm "foo" fooForm
---- > ((barRes, barWidget), barEnctype) <- runFormPost $ identifyForm "bar" barForm
----
---- Note that it's your responsibility to ensure that the
---- identification strings are unique (using the same one twice on a
---- single handler will not generate any errors). This allows you
---- to create a variable number of forms and still have them work
---- even if their number or order change between the HTML
---- generation and the form submission.
--identifyForm
-- :: Monad m
-- => Text -- ^ Form identification string.
-- -> (Html -> MForm m (FormResult a, WidgetT (HandlerSite m) IO ()))
-- -> (Html -> MForm m (FormResult a, WidgetT (HandlerSite m) IO ()))
--identifyForm identVal form = \fragment -> do
-- -- Create hidden <input>.
-- let fragment' =
+@@ -331,10 +347,15 @@ identifyForm
+ identifyForm identVal form = \fragment -> do
+ -- Create hidden <input>.
+ let fragment' =
- [shamlet|
- <input type=hidden name=#{identifyFormKey} value=#{identVal}>
- #{fragment}
- |]
--
-- -- Check if we got its value back.
-- mp <- askParams
-- let missing = (mp >>= Map.lookup identifyFormKey) /= Just [identVal]
--
-- -- Run the form proper (with our hidden <input>). If the
-- -- data is missing, then do not provide any params to the
-- -- form, which will turn its result into FormMissing. Also,
-- -- doing this avoids having lots of fields with red errors.
-- let eraseParams | missing = local (\(_, h, l) -> (Nothing, h, l))
-- | otherwise = id
-- eraseParams (form fragment')
--
--identifyFormKey :: Text
--identifyFormKey = "_formid"
--
++ do { id
++ ((Text.Blaze.Internal.preEscapedText . pack)
++ "<input type=\"hidden\" name=\"");
++ id (toHtml identifyFormKey);
++ id ((Text.Blaze.Internal.preEscapedText . pack) "\" value=\"");
++ id (toHtml identVal);
++ id ((Text.Blaze.Internal.preEscapedText . pack) "\">");
++ id (toHtml fragment) }
++
- type FormRender m a =
- AForm m a
-@@ -347,19 +313,66 @@ renderTable, renderDivs, renderDivsNoLabels :: Monad m => FormRender m a
+ -- Check if we got its value back.
+ mp <- askParams
+@@ -364,22 +385,70 @@ renderTable, renderDivs, renderDivsNoLabels :: Monad m => FormRender m a
renderTable aform fragment = do
(res, views') <- aFormToForm aform
let views = views' []
- let widget = [whamlet|
-$newline never
--\#{fragment}
--$forall view <- views
+-$if null views
+- \#{fragment}
+-$forall (isFirst, view) <- addIsFirst views
- <tr :fvRequired view:.required :not $ fvRequired view:.optional>
- <td>
+- $if isFirst
+- \#{fragment}
- <label for=#{fvId view}>#{fvLabel view}
- $maybe tt <- fvTooltip view
- <div .tooltip>#{tt}
@@ -1078,70 +1263,74 @@ index d84633e..9d9257f 100644
- $maybe err <- fvErrors view
- <td .errors>#{err}
-|]
-+ let widget = do { (Yesod.Core.Widget.asWidgetT . toWidget) (toHtml fragment);
++ let widget = do { Text.Hamlet.condH
++ [(null views, (asWidgetT . toWidget) (toHtml fragment))] Nothing;
+ Data.Foldable.mapM_
-+ (\ view_aagq
-+ -> do { (Yesod.Core.Widget.asWidgetT . toWidget)
++ (\ (isFirst_ab5u, view_ab5v)
++ -> do { (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) "<tr");
+ Text.Hamlet.condH
-+ [(or [fvRequired view_aagq, not (fvRequired view_aagq)],
-+ do { (Yesod.Core.Widget.asWidgetT . toWidget)
++ [(or [fvRequired view_ab5v, not (fvRequired view_ab5v)],
++ do { (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) " class=\"");
+ Text.Hamlet.condH
-+ [(fvRequired view_aagq,
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ [(fvRequired view_ab5v,
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) "required "))]
+ Nothing;
+ Text.Hamlet.condH
-+ [(not (fvRequired view_aagq),
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ [(not (fvRequired view_ab5v),
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) "optional"))]
+ Nothing;
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) "\"") })]
+ Nothing;
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
-+ ((Text.Blaze.Internal.preEscapedText . pack) "><td><label for=\"");
-+ (Yesod.Core.Widget.asWidgetT . toWidget) (toHtml (fvId view_aagq));
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ (asWidgetT . toWidget)
++ ((Text.Blaze.Internal.preEscapedText . pack) "><td>");
++ Text.Hamlet.condH
++ [(isFirst_ab5u, (asWidgetT . toWidget) (toHtml fragment))] Nothing;
++ (asWidgetT . toWidget)
++ ((Text.Blaze.Internal.preEscapedText . pack) "<label for=\"");
++ (asWidgetT . toWidget) (toHtml (fvId view_ab5v));
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) "\">");
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
-+ (toHtml (fvLabel view_aagq));
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ (asWidgetT . toWidget) (toHtml (fvLabel view_ab5v));
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) "</label>");
+ Text.Hamlet.maybeH
-+ (fvTooltip view_aagq)
-+ (\ tt_aagr
-+ -> do { (Yesod.Core.Widget.asWidgetT . toWidget)
++ (fvTooltip view_ab5v)
++ (\ tt_ab5w
++ -> do { (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack)
+ "<div class=\"tooltip\">");
-+ (Yesod.Core.Widget.asWidgetT . toWidget) (toHtml tt_aagr);
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ (asWidgetT . toWidget) (toHtml tt_ab5w);
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) "</div>") })
+ Nothing;
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) "</td><td>");
-+ (Yesod.Core.Widget.asWidgetT . toWidget) (fvInput view_aagq);
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ (asWidgetT . toWidget) (fvInput view_ab5v);
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) "</td>");
+ Text.Hamlet.maybeH
-+ (fvErrors view_aagq)
-+ (\ err_aags
-+ -> do { (Yesod.Core.Widget.asWidgetT . toWidget)
++ (fvErrors view_ab5v)
++ (\ err_ab5x
++ -> do { (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack)
+ "<td class=\"errors\">");
-+ (Yesod.Core.Widget.asWidgetT . toWidget) (toHtml err_aags);
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ (asWidgetT . toWidget) (toHtml err_ab5x);
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) "</td>") })
+ Nothing;
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) "</tr>") })
-+ views }
++ (addIsFirst views) }
+
return (res, widget)
-
- -- | render a field inside a div
-@@ -372,19 +385,67 @@ renderDivsMaybeLabels :: Monad m => Bool -> FormRender m a
+ where
+ addIsFirst [] = []
+@@ -395,19 +464,66 @@ renderDivsMaybeLabels :: Monad m => Bool -> FormRender m a
renderDivsMaybeLabels withLabels aform fragment = do
(res, views') <- aFormToForm aform
let views = views' []
@@ -1158,71 +1347,70 @@ index d84633e..9d9257f 100644
- $maybe err <- fvErrors view
- <div .errors>#{err}
-|]
-+ let widget = do { (Yesod.Core.Widget.asWidgetT . toWidget) (toHtml fragment);
++ let widget = do { (asWidgetT . toWidget) (toHtml fragment);
+ Data.Foldable.mapM_
-+ (\ view_aagE
-+ -> do { (Yesod.Core.Widget.asWidgetT . toWidget)
++ (\ view_ab5K
++ -> do { (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) "<div");
+ Text.Hamlet.condH
-+ [(or [fvRequired view_aagE, not (fvRequired view_aagE)],
-+ do { (Yesod.Core.Widget.asWidgetT . toWidget)
++ [(or [fvRequired view_ab5K, not (fvRequired view_ab5K)],
++ do { (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) " class=\"");
+ Text.Hamlet.condH
-+ [(fvRequired view_aagE,
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ [(fvRequired view_ab5K,
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) "required "))]
+ Nothing;
+ Text.Hamlet.condH
-+ [(not (fvRequired view_aagE),
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ [(not (fvRequired view_ab5K),
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) "optional"))]
+ Nothing;
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) "\"") })]
+ Nothing;
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) ">");
+ Text.Hamlet.condH
+ [(withLabels,
-+ do { (Yesod.Core.Widget.asWidgetT . toWidget)
++ do { (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) "<label for=\"");
-+ (Yesod.Core.Widget.asWidgetT . toWidget) (toHtml (fvId view_aagE));
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ (asWidgetT . toWidget) (toHtml (fvId view_ab5K));
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) "\">");
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
-+ (toHtml (fvLabel view_aagE));
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ (asWidgetT . toWidget) (toHtml (fvLabel view_ab5K));
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) "</label>") })]
+ Nothing;
+ Text.Hamlet.maybeH
-+ (fvTooltip view_aagE)
-+ (\ tt_aagF
-+ -> do { (Yesod.Core.Widget.asWidgetT . toWidget)
++ (fvTooltip view_ab5K)
++ (\ tt_ab5L
++ -> do { (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack)
+ "<div class=\"tooltip\">");
-+ (Yesod.Core.Widget.asWidgetT . toWidget) (toHtml tt_aagF);
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ (asWidgetT . toWidget) (toHtml tt_ab5L);
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) "</div>") })
+ Nothing;
-+ (Yesod.Core.Widget.asWidgetT . toWidget) (fvInput view_aagE);
++ (asWidgetT . toWidget) (fvInput view_ab5K);
+ Text.Hamlet.maybeH
-+ (fvErrors view_aagE)
-+ (\ err_aagG
-+ -> do { (Yesod.Core.Widget.asWidgetT . toWidget)
++ (fvErrors view_ab5K)
++ (\ err_ab5M
++ -> do { (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack)
+ "<div class=\"errors\">");
-+ (Yesod.Core.Widget.asWidgetT . toWidget) (toHtml err_aagG);
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ (asWidgetT . toWidget) (toHtml err_ab5M);
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) "</div>") })
+ Nothing;
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) "</div>") })
+ views }
+
return (res, widget)
-- | Render a form using Bootstrap v2-friendly shamlet syntax.
-@@ -410,19 +471,63 @@ renderBootstrap aform fragment = do
+@@ -435,19 +551,62 @@ renderBootstrap2 aform fragment = do
let views = views' []
has (Just _) = True
has Nothing = False
@@ -1239,73 +1427,79 @@ index d84633e..9d9257f 100644
- $maybe err <- fvErrors view
- <span .help-block>#{err}
- |]
-+ let widget = do { (Yesod.Core.Widget.asWidgetT . toWidget) (toHtml fragment);
++ let widget = do { (asWidgetT . toWidget) (toHtml fragment);
+ Data.Foldable.mapM_
-+ (\ view_aagR
-+ -> do { (Yesod.Core.Widget.asWidgetT . toWidget)
++ (\ view_ab5Y
++ -> do { (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack)
+ "<div class=\"control-group clearfix ");
+ Text.Hamlet.condH
-+ [(fvRequired view_aagR,
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ [(fvRequired view_ab5Y,
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) "required "))]
+ Nothing;
+ Text.Hamlet.condH
-+ [(not (fvRequired view_aagR),
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ [(not (fvRequired view_ab5Y),
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) "optional "))]
+ Nothing;
+ Text.Hamlet.condH
-+ [(has (fvErrors view_aagR),
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ [(has (fvErrors view_ab5Y),
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) "error"))]
+ Nothing;
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack)
+ "\"><label class=\"control-label\" for=\"");
-+ (Yesod.Core.Widget.asWidgetT . toWidget) (toHtml (fvId view_aagR));
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ (asWidgetT . toWidget) (toHtml (fvId view_ab5Y));
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) "\">");
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
-+ (toHtml (fvLabel view_aagR));
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ (asWidgetT . toWidget) (toHtml (fvLabel view_ab5Y));
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack)
+ "</label><div class=\"controls input\">");
-+ (Yesod.Core.Widget.asWidgetT . toWidget) (fvInput view_aagR);
++ (asWidgetT . toWidget) (fvInput view_ab5Y);
+ Text.Hamlet.maybeH
-+ (fvTooltip view_aagR)
-+ (\ tt_aagS
-+ -> do { (Yesod.Core.Widget.asWidgetT . toWidget)
++ (fvTooltip view_ab5Y)
++ (\ tt_ab5Z
++ -> do { (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack)
+ "<span class=\"help-block\">");
-+ (Yesod.Core.Widget.asWidgetT . toWidget) (toHtml tt_aagS);
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ (asWidgetT . toWidget) (toHtml tt_ab5Z);
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) "</span>") })
+ Nothing;
+ Text.Hamlet.maybeH
-+ (fvErrors view_aagR)
-+ (\ err_aagT
-+ -> do { (Yesod.Core.Widget.asWidgetT . toWidget)
++ (fvErrors view_ab5Y)
++ (\ err_ab60
++ -> do { (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack)
+ "<span class=\"help-block\">");
-+ (Yesod.Core.Widget.asWidgetT . toWidget) (toHtml err_aagT);
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ (asWidgetT . toWidget) (toHtml err_ab60);
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) "</span>") })
+ Nothing;
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . pack) "</div></div>") })
+ views }
+
return (res, widget)
- {-# DEPRECATED renderBootstrap "Please use the Yesod.Form.Bootstrap3 module." #-}
+ -- | Deprecated synonym for 'renderBootstrap2'.
diff --git a/Yesod/Form/Jquery.hs b/Yesod/Form/Jquery.hs
-index 2c4ae25..ed9b366 100644
+index 362eb8a..1df9966 100644
--- a/Yesod/Form/Jquery.hs
+++ b/Yesod/Form/Jquery.hs
-@@ -12,12 +12,24 @@ module Yesod.Form.Jquery
- , Default (..)
- ) where
+@@ -17,11 +17,23 @@ import Yesod.Core
+ import Yesod.Form
+ import Data.Time (Day)
+ import Data.Default
+-import Text.Hamlet (shamlet)
+-import Text.Julius (julius, rawJS)
++--import Text.Hamlet (shamlet)
++import Text.Julius (rawJS)
+ import Data.Text (Text, pack, unpack)
+ import Data.Monoid (mconcat)
+import qualified Text.Blaze as Text.Blaze.Internal
+import qualified Text.Blaze.Internal
@@ -1319,18 +1513,10 @@ index 2c4ae25..ed9b366 100644
+import qualified Data.Text.Lazy.Builder
+import qualified Text.Shakespeare
+
- import Yesod.Core
- import Yesod.Form
- import Data.Time (Day)
- import Data.Default
--import Text.Hamlet (shamlet)
--import Text.Julius (julius, rawJS)
-+--import Text.Hamlet (shamlet)
-+import Text.Julius (rawJS)
- import Data.Text (Text, pack, unpack)
- import Data.Monoid (mconcat)
-
-@@ -60,27 +72,59 @@ jqueryDayField jds = Field
+ -- | Gets the Google hosted jQuery UI 1.8 CSS file with the given theme.
+ googleHostedJqueryUiCss :: Text -> Text
+ googleHostedJqueryUiCss theme = mconcat
+@@ -61,27 +73,59 @@ jqueryDayField jds = Field
. readMay
. unpack
, fieldView = \theId name attrs val isReq -> do
@@ -1373,7 +1559,7 @@ index 2c4ae25..ed9b366 100644
-});
-|]
+ toWidget $ Text.Julius.asJavascriptUrl
-+ (\ _render_a1lYC
++ (\ _render_a2l4S
+ -> mconcat
+ [Text.Julius.Javascript
+ ((Data.Text.Lazy.Builder.fromText
@@ -1408,8 +1594,8 @@ index 2c4ae25..ed9b366 100644
, fieldEnctype = UrlEncoded
}
where
-@@ -101,16 +145,47 @@ jqueryAutocompleteField :: (RenderMessage site FormMessage, YesodJquery site)
- jqueryAutocompleteField src = Field
+@@ -108,16 +152,52 @@ jqueryAutocompleteField' :: (RenderMessage site FormMessage, YesodJquery site)
+ jqueryAutocompleteField' minLen src = Field
{ fieldParse = parseHelper $ Right
, fieldView = \theId name attrs val isReq -> do
- toWidget [shamlet|
@@ -1438,10 +1624,10 @@ index 2c4ae25..ed9b366 100644
addScript' urlJqueryUiJs
addStylesheet' urlJqueryUiCss
- toWidget [julius|
--$(function(){$("##{rawJS theId}").autocomplete({source:"@{src}",minLength:2})});
+-$(function(){$("##{rawJS theId}").autocomplete({source:"@{src}",minLength:#{toJSON minLen}})});
-|]
+ toWidget $ Text.Julius.asJavascriptUrl
-+ (\ _render_a1lYP
++ (\ _render_a2l58
+ -> mconcat
+ [Text.Julius.Javascript
+ ((Data.Text.Lazy.Builder.fromText
@@ -1454,17 +1640,22 @@ index 2c4ae25..ed9b366 100644
+ "\").autocomplete({source:\""),
+ Text.Julius.Javascript
+ (Data.Text.Lazy.Builder.fromText
-+ (_render_a1lYP src [])),
++ (_render_a2l58 src [])),
++ Text.Julius.Javascript
++ ((Data.Text.Lazy.Builder.fromText
++ . Text.Shakespeare.pack')
++ "\",minLength:"),
++ Text.Julius.toJavascript (toJSON minLen),
+ Text.Julius.Javascript
+ ((Data.Text.Lazy.Builder.fromText
+ . Text.Shakespeare.pack')
-+ "\",minLength:2})});")])
++ "})});")])
+
, fieldEnctype = UrlEncoded
}
diff --git a/Yesod/Form/MassInput.hs b/Yesod/Form/MassInput.hs
-index a2b434d..6766ad8 100644
+index a2b434d..75eb484 100644
--- a/Yesod/Form/MassInput.hs
+++ b/Yesod/Form/MassInput.hs
@@ -9,6 +9,16 @@ module Yesod.Form.MassInput
@@ -1484,7 +1675,7 @@ index a2b434d..6766ad8 100644
import Yesod.Form.Types
import Yesod.Form.Functions
import Yesod.Form.Fields (checkBoxField)
-@@ -70,16 +80,28 @@ inputList label fixXml single mdef = formToAForm $ do
+@@ -70,16 +80,27 @@ inputList label fixXml single mdef = formToAForm $ do
{ fvLabel = label
, fvTooltip = Nothing
, fvId = theId
@@ -1498,32 +1689,31 @@ index a2b434d..6766ad8 100644
- <input type=checkbox name=#{addName}>
- Add another row
-|]
-+ , fvInput = do { (Yesod.Core.Widget.asWidgetT . toWidget) (fixXml views);
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ , fvInput = do { (asWidgetT . toWidget) (fixXml views);
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack) "<p>");
+ Data.Foldable.mapM_
-+ (\ xml_aUS3 -> (Yesod.Core.Widget.asWidgetT . toWidget) xml_aUS3)
-+ xmls;
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ (\ xml_a1yM1 -> (asWidgetT . toWidget) xml_a1yM1) xmls;
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack)
+ "<input class=\"count\" type=\"hidden\" name=\"");
-+ (Yesod.Core.Widget.asWidgetT . toWidget) (toHtml countName);
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ (asWidgetT . toWidget) (toHtml countName);
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack)
+ "\" value=\"");
-+ (Yesod.Core.Widget.asWidgetT . toWidget) (toHtml count);
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ (asWidgetT . toWidget) (toHtml count);
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack)
+ "\"><input type=\"checkbox\" name=\"");
-+ (Yesod.Core.Widget.asWidgetT . toWidget) (toHtml addName);
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ (asWidgetT . toWidget) (toHtml addName);
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack)
+ "\">Add another row</p>") }
+
, fvErrors = Nothing
, fvRequired = False
}])
-@@ -92,10 +114,14 @@ withDelete af = do
+@@ -92,10 +113,14 @@ withDelete af = do
deleteName <- newFormIdent
(menv, _, _) <- ask
res <- case menv >>= Map.lookup deleteName . fst of
@@ -1531,18 +1721,18 @@ index a2b434d..6766ad8 100644
-$newline never
-<input type=hidden name=#{deleteName} value=yes>
-|]
-+ Just ("yes":_) -> return $ Left $ do { (Yesod.Core.Widget.asWidgetT . toWidget)
++ Just ("yes":_) -> return $ Left $ do { (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack)
+ "<input type=\"hidden\" name=\"");
-+ (Yesod.Core.Widget.asWidgetT . toWidget) (toHtml deleteName);
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ (asWidgetT . toWidget) (toHtml deleteName);
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack)
+ "\" value=\"yes\">") }
+
_ -> do
(_, xml2) <- aFormToForm $ areq checkBoxField FieldSettings
{ fsLabel = SomeMessage MsgDelete
-@@ -121,32 +147,155 @@ fixme eithers =
+@@ -121,32 +146,149 @@ fixme eithers =
massDivs, massTable
:: [[FieldView site]]
-> WidgetT site IO ()
@@ -1560,153 +1750,147 @@ index a2b434d..6766ad8 100644
- <div .errors>#{err}
-|]
+massDivs viewss = Data.Foldable.mapM_
-+ (\ views_aUSm
-+ -> do { (Yesod.Core.Widget.asWidgetT . toWidget)
++ (\ views_a1yMm
++ -> do { (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack)
+ "<fieldset>");
+ Data.Foldable.mapM_
-+ (\ view_aUSn
-+ -> do { (Yesod.Core.Widget.asWidgetT . toWidget)
++ (\ view_a1yMn
++ -> do { (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack) "<div");
+ Text.Hamlet.condH
-+ [(or [fvRequired view_aUSn, not (fvRequired view_aUSn)],
-+ do { (Yesod.Core.Widget.asWidgetT . toWidget)
++ [(or [fvRequired view_a1yMn, not (fvRequired view_a1yMn)],
++ do { (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack)
+ " class=\"");
+ Text.Hamlet.condH
-+ [(fvRequired view_aUSn,
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ [(fvRequired view_a1yMn,
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack)
+ "required "))]
+ Nothing;
+ Text.Hamlet.condH
-+ [(not (fvRequired view_aUSn),
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ [(not (fvRequired view_a1yMn),
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack)
+ "optional"))]
+ Nothing;
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack)
+ "\"") })]
+ Nothing;
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack)
+ "><label for=\"");
-+ (Yesod.Core.Widget.asWidgetT . toWidget) (toHtml (fvId view_aUSn));
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ (asWidgetT . toWidget) (toHtml (fvId view_a1yMn));
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack) "\">");
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
-+ (toHtml (fvLabel view_aUSn));
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ (asWidgetT . toWidget) (toHtml (fvLabel view_a1yMn));
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack) "</label>");
+ Text.Hamlet.maybeH
-+ (fvTooltip view_aUSn)
-+ (\ tt_aUSo
-+ -> do { (Yesod.Core.Widget.asWidgetT . toWidget)
++ (fvTooltip view_a1yMn)
++ (\ tt_a1yMo
++ -> do { (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack)
+ "<div class=\"tooltip\">");
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
-+ (toHtml tt_aUSo);
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ (asWidgetT . toWidget) (toHtml tt_a1yMo);
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack)
+ "</div>") })
+ Nothing;
-+ (Yesod.Core.Widget.asWidgetT . toWidget) (fvInput view_aUSn);
++ (asWidgetT . toWidget) (fvInput view_a1yMn);
+ Text.Hamlet.maybeH
-+ (fvErrors view_aUSn)
-+ (\ err_aUSp
-+ -> do { (Yesod.Core.Widget.asWidgetT . toWidget)
++ (fvErrors view_a1yMn)
++ (\ err_a1yMp
++ -> do { (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack)
+ "<div class=\"errors\">");
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
-+ (toHtml err_aUSp);
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ (asWidgetT . toWidget) (toHtml err_a1yMp);
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack)
+ "</div>") })
+ Nothing;
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack) "</div>") })
-+ views_aUSm;
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ views_a1yMm;
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack)
+ "</fieldset>") })
+ viewss
+
+
+massTable viewss = Data.Foldable.mapM_
-+ (\ views_aUSu
-+ -> do { (Yesod.Core.Widget.asWidgetT . toWidget)
++ (\ views_a1yMv
++ -> do { (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack)
+ "<fieldset><table>");
+ Data.Foldable.mapM_
-+ (\ view_aUSv
-+ -> do { (Yesod.Core.Widget.asWidgetT . toWidget)
++ (\ view_a1yMw
++ -> do { (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack) "<tr");
+ Text.Hamlet.condH
-+ [(or [fvRequired view_aUSv, not (fvRequired view_aUSv)],
-+ do { (Yesod.Core.Widget.asWidgetT . toWidget)
++ [(or [fvRequired view_a1yMw, not (fvRequired view_a1yMw)],
++ do { (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack)
+ " class=\"");
+ Text.Hamlet.condH
-+ [(fvRequired view_aUSv,
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ [(fvRequired view_a1yMw,
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack)
+ "required "))]
+ Nothing;
+ Text.Hamlet.condH
-+ [(not (fvRequired view_aUSv),
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ [(not (fvRequired view_a1yMw),
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack)
+ "optional"))]
+ Nothing;
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack)
+ "\"") })]
+ Nothing;
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack)
+ "><td><label for=\"");
-+ (Yesod.Core.Widget.asWidgetT . toWidget) (toHtml (fvId view_aUSv));
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ (asWidgetT . toWidget) (toHtml (fvId view_a1yMw));
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack) "\">");
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
-+ (toHtml (fvLabel view_aUSv));
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ (asWidgetT . toWidget) (toHtml (fvLabel view_a1yMw));
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack) "</label>");
+ Text.Hamlet.maybeH
-+ (fvTooltip view_aUSv)
-+ (\ tt_aUSw
-+ -> do { (Yesod.Core.Widget.asWidgetT . toWidget)
++ (fvTooltip view_a1yMw)
++ (\ tt_a1yMx
++ -> do { (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack)
+ "<div class=\"tooltip\">");
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
-+ (toHtml tt_aUSw);
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ (asWidgetT . toWidget) (toHtml tt_a1yMx);
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack)
+ "</div>") })
+ Nothing;
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack)
+ "</td><td>");
-+ (Yesod.Core.Widget.asWidgetT . toWidget) (fvInput view_aUSv);
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ (asWidgetT . toWidget) (fvInput view_a1yMw);
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack) "</td>");
+ Text.Hamlet.maybeH
-+ (fvErrors view_aUSv)
-+ (\ err_aUSx
-+ -> do { (Yesod.Core.Widget.asWidgetT . toWidget)
++ (fvErrors view_a1yMw)
++ (\ err_a1yMy
++ -> do { (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack)
+ "<td class=\"errors\">");
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
-+ (toHtml err_aUSx);
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ (asWidgetT . toWidget) (toHtml err_a1yMy);
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack)
+ "</td>") })
+ Nothing;
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack) "</tr>") })
-+ views_aUSu;
-+ (Yesod.Core.Widget.asWidgetT . toWidget)
++ views_a1yMv;
++ (asWidgetT . toWidget)
+ ((Text.Blaze.Internal.preEscapedText . Data.Text.pack)
+ "</table></fieldset>") })
+ viewss
@@ -1727,10 +1911,10 @@ index a2b434d..6766ad8 100644
- <td .errors>#{err}
-|]
diff --git a/Yesod/Form/Nic.hs b/Yesod/Form/Nic.hs
-index 2862678..04ddaba 100644
+index 7e4af07..b59745a 100644
--- a/Yesod/Form/Nic.hs
+++ b/Yesod/Form/Nic.hs
-@@ -9,11 +9,24 @@ module Yesod.Form.Nic
+@@ -9,11 +9,22 @@ module Yesod.Form.Nic
, nicHtmlField
) where
@@ -1746,24 +1930,22 @@ index 2862678..04ddaba 100644
+import qualified Data.Text.Lazy.Builder
+import qualified Text.Shakespeare
+
-+
import Yesod.Core
import Yesod.Form
import Text.HTML.SanitizeXSS (sanitizeBalance)
-import Text.Hamlet (shamlet)
-import Text.Julius (julius, rawJS)
-+--import Text.Hamlet (shamlet)
+import Text.Julius ( rawJS)
import Text.Blaze.Html.Renderer.String (renderHtml)
import Data.Text (Text, pack)
import Data.Maybe (listToMaybe)
-@@ -27,20 +40,48 @@ nicHtmlField :: YesodNic site => Field (HandlerT site IO) Html
+@@ -27,20 +38,52 @@ nicHtmlField :: YesodNic site => Field (HandlerT site IO) Html
nicHtmlField = Field
{ fieldParse = \e _ -> return . Right . fmap (preEscapedToMarkup . sanitizeBalance) . listToMaybe $ e
- , fieldView = \theId name attrs val _isReq -> do
+ , fieldView = \theId name attrs val isReq -> do
- toWidget [shamlet|
-$newline never
-- <textarea id="#{theId}" *{attrs} name="#{name}" .html>#{showVal val}
+- <textarea id="#{theId}" *{attrs} name="#{name}" :isReq:required .html>#{showVal val}
-|]
+ toWidget $ do { id
+ ((Text.Blaze.Internal.preEscapedText . pack)
@@ -1772,6 +1954,10 @@ index 2862678..04ddaba 100644
+ id ((Text.Blaze.Internal.preEscapedText . pack) "\" name=\"");
+ id (toHtml name);
+ id ((Text.Blaze.Internal.preEscapedText . pack) "\"");
++ Text.Hamlet.condH
++ [(isReq,
++ id ((Text.Blaze.Internal.preEscapedText . pack) " required"))]
++ Nothing;
+ id ((Text.Hamlet.attrsToHtml . Text.Hamlet.toAttributes) attrs);
+ id ((Text.Blaze.Internal.preEscapedText . pack) ">");
+ id (toHtml (showVal val));
@@ -1788,12 +1974,12 @@ index 2862678..04ddaba 100644
-(function(){new nicEditor({fullPanel:true}).panelInstance("#{rawJS theId}")})();
-|]
+ BottomOfHeadBlocking -> Text.Julius.asJavascriptUrl
-+ (\ _render_a1qhO
++ (\ _render_a2rMh
+ -> Data.Monoid.mconcat
+ [Text.Julius.Javascript
+ ((Data.Text.Lazy.Builder.fromText
+ . Text.Shakespeare.pack')
-+ "\nbkLib.onDomLoaded(function(){new nicEditor({true}).panelInstance(\""),
++ "\nbkLib.onDomLoaded(function(){new nicEditor({fullPanel:true}).panelInstance(\""),
+ Text.Julius.toJavascript (rawJS theId),
+ Text.Julius.Javascript
+ ((Data.Text.Lazy.Builder.fromText
@@ -1801,12 +1987,12 @@ index 2862678..04ddaba 100644
+ "\")});")])
+
+ _ -> Text.Julius.asJavascriptUrl
-+ (\ _render_a1qhS
++ (\ _render_a2rMm
+ -> Data.Monoid.mconcat
+ [Text.Julius.Javascript
+ ((Data.Text.Lazy.Builder.fromText
+ . Text.Shakespeare.pack')
-+ "\n(function(){new nicEditor({true}).panelInstance(\""),
++ "\n(function(){new nicEditor({fullPanel:true}).panelInstance(\""),
+ Text.Julius.toJavascript (rawJS theId),
+ Text.Julius.Javascript
+ ((Data.Text.Lazy.Builder.fromText
@@ -1817,10 +2003,10 @@ index 2862678..04ddaba 100644
}
where
diff --git a/yesod-form.cabal b/yesod-form.cabal
-index 56a3053..e7a0729 100644
+index bfe94df..1f5aef5 100644
--- a/yesod-form.cabal
+++ b/yesod-form.cabal
-@@ -43,7 +43,6 @@ library
+@@ -51,7 +51,6 @@ library
exposed-modules: Yesod.Form
Yesod.Form.Types
Yesod.Form.Functions
@@ -1829,5 +2015,5 @@ index 56a3053..e7a0729 100644
Yesod.Form.Fields
Yesod.Form.Jquery
--
-2.0.0.rc2
+2.1.0