git-annex 5.20150508.1 → 5.20150522
raw patch · 462 files changed
+23455/−624 lines, 462 filesdep +ascii-progressdep +terminal-sizedep −hamletdep ~shakespearebinary-added
Dependencies added: ascii-progress, terminal-size
Dependencies removed: hamlet
Dependency ranges changed: shakespeare
This diff is very large; some files are shown as “too large to diff”. Download the raw patch for the complete diff.
Files
- Annex.hs +6/−6
- Annex/BranchState.hs +2/−4
- Annex/CheckAttr.hs +9/−1
- Annex/CheckIgnore.hs +10/−1
- Annex/Concurrent.hs +65/−0
- Annex/Content.hs +64/−45
- Annex/Drop.hs +1/−1
- Annex/LockFile.hs +18/−18
- Annex/Perms.hs +6/−10
- Annex/Ssh.hs +3/−3
- Annex/Transfer.hs +38/−36
- Assistant/WebApp/DashBoard.hs +3/−2
- Build/mdwn2man +11/−0
- BuildFlags.hs +1/−1
- CHANGELOG +33/−0
- COPYRIGHT +1/−1
- CmdLine/Action.hs +80/−6
- CmdLine/GitAnnex/Options.hs +8/−0
- CmdLine/Seek.hs +1/−1
- CmdLine/Usage.hs +2/−0
- Command/AddUrl.hs +2/−2
- Command/Drop.hs +18/−9
- Command/Fsck.hs +2/−2
- Command/Get.hs +2/−2
- Command/Import.hs +5/−0
- Command/Mirror.hs +1/−1
- Command/Move.hs +3/−3
- Command/SendKey.hs +1/−1
- Command/Sync.hs +3/−3
- Command/TestRemote.hs +1/−1
- Command/TransferKey.hs +2/−2
- Command/TransferKeys.hs +5/−2
- Command/Unlock.hs +1/−1
- Command/Unused.hs +34/−24
- Database/Fsck.hs +1/−1
- Logs/Transfer.hs +46/−9
- Makefile +5/−5
- Messages.hs +7/−6
- Messages/Internal.hs +1/−1
- Messages/Progress.hs +82/−17
- Remote/BitTorrent.hs +2/−2
- Remote/Bup.hs +2/−2
- Remote/Ddar.hs +2/−2
- Remote/Directory.hs +14/−7
- Remote/External.hs +1/−1
- Remote/GCrypt.hs +1/−1
- Remote/Git.hs +20/−11
- Remote/Glacier.hs +2/−2
- Remote/Helper/Hooks.hs +4/−4
- Remote/Helper/Special.hs +10/−10
- Remote/Hook.hs +2/−2
- Remote/Rsync.hs +2/−2
- Remote/S3.hs +2/−2
- Remote/Tahoe.hs +1/−1
- Remote/Web.hs +2/−2
- Remote/WebDAV.hs +2/−2
- Types/GitConfig.hs +7/−0
- Types/LockCache.hs +16/−0
- Types/LockPool.hs +0/−16
- Types/Messages.hs +1/−1
- Types/RefSpec.hs +44/−0
- Types/Remote.hs +1/−1
- Utility/FileMode.hs +1/−12
- Utility/LockFile.hs +3/−0
- Utility/LockFile/Posix.hs +29/−22
- Utility/LockFile/Windows.hs +5/−5
- Utility/LockPool.hs +36/−0
- Utility/LockPool/LockHandle.hs +52/−0
- Utility/LockPool/Posix.hs +61/−0
- Utility/LockPool/STM.hs +122/−0
- Utility/LockPool/Windows.hs +49/−0
- c619362c3cedab65adcfdf7ac9dc3c014479cc12.patch +0/−136
- debian/changelog +33/−0
- debian/control +1/−2
- debian/copyright +1/−1
- doc/Android/oldcomments/comment_10_20e3d513b8b97496d76aca4619026cd6._comment +16/−0
- doc/Android/oldcomments/comment_11_c96b8f1cc1583a74eb2483f48357f023._comment +15/−0
- doc/Android/oldcomments/comment_12_6551f5fa081494b079c10a33c9b0d8ad._comment +10/−0
- doc/Android/oldcomments/comment_13_7c633d245651ec08f63194fe1fc194ae._comment +8/−0
- doc/Android/oldcomments/comment_14_60c2403140085f9caf48a33b59a36ab4._comment +8/−0
- doc/Android/oldcomments/comment_15_77bafc01b47d4cf8f96bde2b6704ed71._comment +8/−0
- doc/Android/oldcomments/comment_16_9af73451be09f03cfff81fdf9481ffc4._comment +27/−0
- doc/Android/oldcomments/comment_17_f76561a654b534df3a807b1c045710b2._comment +8/−0
- doc/Android/oldcomments/comment_18_1b46cdf154ddadfe17e4b6e4054dc619._comment +17/−0
- doc/Android/oldcomments/comment_1_cc9caa5dd22dd67e5c1d22d697096dd2._comment +15/−0
- doc/Android/oldcomments/comment_21_5903f6a4a81a6534fa8cfafb3b6c37bb._comment +8/−0
- doc/Android/oldcomments/comment_22_36afd354f9669a154d7b6b2c4d43ded9._comment +8/−0
- doc/Android/oldcomments/comment_23_de98154792e8611a134429f06d82bcb1._comment +8/−0
- doc/Android/oldcomments/comment_24_7ab509c25243009bfbffd796ec64e77b._comment +10/−0
- doc/Android/oldcomments/comment_25_026d1a01d5753d71ac3dfc002f2a5eec._comment +10/−0
- doc/Android/oldcomments/comment_26_f0a044fb649d43e32c96b08edbc336c3._comment +12/−0
- doc/Android/oldcomments/comment_27_6b9ae35b1ceeba14cd7a74e142870705._comment +34/−0
- doc/Android/oldcomments/comment_28_c91db1215f529aa68bfb0576c3c5eddc._comment +10/−0
- doc/Android/oldcomments/comment_2_c2422b7dd9d526b3616e49f48cf178c2._comment +10/−0
- doc/Android/oldcomments/comment_3_0e4980c27b13dbc28477c02a82898248._comment +14/−0
- doc/Android/oldcomments/comment_4_86f7b5444e2eaea7f8f7b9160f671a1d._comment +10/−0
- doc/Android/oldcomments/comment_5_9d78009435736a178d5a3f5a9bc0ed6a._comment +8/−0
- doc/Android/oldcomments/comment_6_7b9523ddb20dc4a929e556c3ed0c7406._comment +18/−0
- doc/Android/oldcomments/comment_7_a56628a622da752806c42c5b8b54ceef._comment +8/−0
- doc/Android/oldcomments/comment_8_19656ec99b8f6aa64c1d01a3c9ae9bd0._comment +8/−0
- doc/Android/oldcomments/comment_9_55e703ae105d0c0ee9ac50df8cc59dfb._comment +10/−0
- doc/bare_repositories/comment_4_7cf6103709a7a2710686681a6f406214._comment +8/−0
- doc/bare_repositories/comment_5_6328134497c0de6a088087fc9cb0e59e._comment +31/−0
- doc/bare_repositories/comment_6_bf227861ec3cb2ea474c143218c68133._comment +12/−0
- doc/bugs/Assistant_drops_files_from_remote_repos_that_it_shouldn__39__t.mdwn +37/−0
- doc/bugs/Assistant_from_standalone_5.20131230_64bit_crashes_on_startup.mdwn +31/−0
- doc/bugs/Data_loss_when_doing___96__git_annex_import_--force__96__.mdwn +3/−0
- doc/bugs/Huge_annex_out_of_memory_on_switch_to_indirect_mode_and_status.mdwn +69/−0
- doc/bugs/Is_there_any_way_to_rate_limit_uploads_to_an_S3_backend__63__.mdwn +20/−0
- doc/bugs/Mac_OS_10.9_GPG_erro_when_creating_USB_repo___40__solved__41__.mdwn +23/−0
- doc/bugs/Metadata_changes_are_not_reflected_in_a_view.mdwn +31/−0
- doc/bugs/S3_memory_leaks/comment_1_a7268213b090bce6b1f1858a8e23d90e._comment +14/−0
- doc/bugs/S3_memory_leaks/comment_2_320a8e3bb7b207d1aff8926b9247f5ba._comment +8/−0
- doc/bugs/S3_memory_leaks/comment_3_5e9cecb0e2ec7602963406779b6e3c1f._comment +12/−0
- doc/bugs/S3_memory_leaks/comment_4_37e41b518813bd7c349017abf4a0ca0f._comment +8/−0
- doc/bugs/S3_memory_leaks/comment_5_1b6d13852aeb37c5c29baf100bd62789._comment +8/−0
- doc/bugs/S3_memory_leaks/comment_6_71ffb88f548969fd4d45eac4656380c0._comment +11/−0
- doc/bugs/S3_memory_leaks/comment_7_1ac572b79caa23e3f791e4f8461fcddd._comment +10/−0
- doc/bugs/Stale_keys_not_forgotten_upon_git-annex_forget.mdwn +31/−0
- doc/bugs/__34__old__34___and___34__new__34___hash_formats_are_mixed_up.mdwn +31/−0
- doc/bugs/__39__git_annex_get__39___returns_success_when_file_not_found.mdwn +30/−0
- doc/bugs/__96__minimal_build__39____fails_due_to_missing_stm_dependency.mdwn +95/−0
- doc/bugs/can__39__t_get/comment_1_ef32287828481c161bd913c9db9052a5._comment +27/−0
- doc/bugs/can__39__t_get/comment_2_31fe400f4bac516a5c1101612cb06a54._comment +32/−0
- doc/bugs/can__39__t_get/comment_3_87d123c04815d38abb92f967829c3a23._comment +16/−0
- doc/bugs/can__39__t_get/comment_4_b99cff87dbe38f08f888200dfe7e2436._comment +14/−0
- doc/bugs/creating_a_plain_directory_where_a_mountpoint_should_have_been.mdwn +29/−0
- doc/bugs/direct_mode_merge_can_overwrite_local__44___non-annexed_files.mdwn +14/−0
- doc/bugs/git-annex-shell/comment_1_3d2c3827de34509c0a5595eda07dd18f._comment +13/−0
- doc/bugs/git_annex_sync_--content_may_copy_then_drop_a_file_to_a_remote.mdwn +33/−0
- doc/bugs/keeps_demanding_ssh_key_even_if_all_sync__39__s_turned_down.mdwn +60/−0
- doc/bugs/local_pair_fails_if_non-ascii_characters_present_on_annex_path.mdwn +18/−0
- doc/bugs/misuse_of_--git-dir_might_destroy_a_git_repository_completely.mdwn +34/−0
- doc/bugs/transfer_in_progress_not_present_in_json_output.mdwn +28/−0
- doc/bugs/transfer_lock_file_removal_bug.mdwn +61/−0
- doc/bugs/webapp_fails_to_connect_to_ssh_repository___40__windows__41__.mdwn +40/−0
- doc/design/assistant/OSX/comment_1_9290f6e6f265e906b08631224392b7bf._comment +14/−0
- doc/design/assistant/blog/day_81__enabling_pre-existing_special_remotes.mdwn +34/−0
- doc/devblog/day_284__development.mdwn +33/−0
- doc/devblog/day_285__tuning_git-annex_unused_refs.mdwn +20/−0
- doc/devblog/day_286-287__rotten_locks.mdwn +44/−0
- doc/devblog/moving_blogs/comment_1_6caa7e67461a6ea5de8155ae9cf75fab._comment +8/−0
- doc/devblog/moving_blogs/comment_2_e3e2048fc2397b87a2f29c9fe49394cb._comment +10/−0
- doc/feeds.mdwn +0/−4
- doc/forum/Ambiguous_repo_names__63__.mdwn +8/−0
- doc/forum/Direct_Mode_-_Restore_file_from_Full_Backup_Repository__63__.mdwn +14/−0
- doc/forum/How_to_prevent_the_assistant_from_downloading_all_data__63__.mdwn +9/−0
- doc/forum/Import_options/comment_1_118a5f978090a3909299876a01c0adec._comment +21/−0
- doc/forum/Import_options/comment_2_21da91f08cb6b28ae3e79ade033db516._comment +17/−0
- doc/forum/Invalid_cross-device_link.mdwn +9/−0
- doc/forum/Purge_a_remote/comment_1_78b3b77f457c65d31fd8a5abf714905d._comment +8/−0
- doc/forum/Purge_a_remote/comment_2_dc65719157dee63b3979563ed57ee0ce._comment +10/−0
- doc/forum/Purge_a_remote/comment_3_63e0280273b816fa4b837724e102f813._comment +8/−0
- doc/forum/Purge_a_remote/comment_4_7fad1c4798ca03a4095ac3241c279f6d._comment +11/−0
- doc/forum/Symlink_points_to_old_version.mdwn +13/−0
- doc/forum/Syncronisation_of_syncronisation_between_3_repositories__63__.mdwn +11/−0
- doc/forum/Using_the_Git-Annex_Assistant_as_a_Backup_and_Syncing_Service.mdwn +5/−0
- doc/forum/Webapp_on_ARM/comment_1_82ac40cef5b59070136527b8d81a5ce2._comment +10/−0
- doc/forum/__91__NEED_HELP__93___manual_ssh_remote_setup_with_shared_key.mdwn +19/−0
- doc/forum/big_overhead/comment_10_d5f4e353e7f711d8c38cdcc222339bca._comment +14/−0
- doc/forum/big_overhead/comment_11_cbf25217e4149f2cfad4e2bf94f2b4ca._comment +8/−0
- doc/forum/big_overhead/comment_12_475d5af95adcfcd3a51e10f270205eb7._comment +71/−0
- doc/forum/big_overhead/comment_13_1c8cc992f04fc63179094c494bd25025._comment +10/−0
- doc/forum/big_overhead/comment_14_cbfb3d557915258e72c65a4e84df77a9._comment +8/−0
- doc/forum/big_overhead/comment_15_b973529bae549bcbaaae792f0403989b._comment +10/−0
- doc/forum/git_annex_copy_--fast_--to_blah_much_slower_than_--from_blah.mdwn +15/−0
- doc/forum/glacier_-_range_retrievals_and_daily_free_retrieval_allowance.mdwn +6/−0
- doc/forum/how_to_prevent_accidentally_running___96__git_add__96____63__.mdwn +5/−0
- doc/forum/mistakenly_checked___42__files__42___into_an_annex.__bummer..mdwn +3/−0
- doc/forum/switching_to__47__from_direct_mode_while_assistant_is_running.mdwn +2/−0
- doc/forum/workspace.xml_file_disappeared__44___broken_symlink_showed_up.mdwn +27/−0
- doc/git-annex-copy.mdwn +5/−0
- doc/git-annex-drop.mdwn +15/−0
- doc/git-annex-get.mdwn +5/−0
- doc/git-annex-mirror.mdwn +5/−0
- doc/git-annex-move.mdwn +5/−0
- doc/git-annex-shell.mdwn +4/−0
- doc/git-annex-undo.mdwn +1/−1
- doc/git-annex-unused.mdwn +34/−1
- doc/git-annex.mdwn +5/−0
- doc/index.mdwn +0/−6
- doc/install/OSX/MacPorts/comment_3_47a77a03040fe628109bd54f82f9ad7a._comment +17/−0
- doc/install/OSX/porting/comment_10_cd2120552ef894a37933b328136fa4cc._comment +8/−0
- doc/install/OSX/porting/comment_11_740fa80e2e54e6fb570f820ff1f56440._comment +8/−0
- doc/install/OSX/porting/comment_12_a84028080578a8b60115b6c4ef823627._comment +8/−0
- doc/install/OSX/porting/comment_13_d6f1db401858ffea23c123db49f5b296._comment +8/−0
- doc/install/OSX/porting/comment_14_035f856923276b0edad879e196e94097._comment +9/−0
- doc/install/OSX/porting/comment_15_336e0acb00e84943715e69917643a69e._comment +35/−0
- doc/install/OSX/porting/comment_16_1befafa862b7d07b1f6e57c0182497cf._comment +36/−0
- doc/install/OSX/porting/comment_17_19c08b2c6c2c5cd88bf96d2bcbbd9055._comment +10/−0
- doc/install/OSX/porting/comment_18_537fad5d8854e765499d47602d1ab398._comment +8/−0
- doc/install/OSX/porting/comment_19_18d4377f4ded5604d395d73783ba82c9._comment +8/−0
- doc/install/OSX/porting/comment_22_6b5f44a98f9d37a1c6ecfe19a60fe6c5._comment +12/−0
- doc/install/OSX/porting/comment_23_3d82a270dd4b0159f4aab5675166e1e3._comment +30/−0
- doc/install/OSX/porting/comment_24_b9d3563a2cc3d769f27876e028dc344d._comment +12/−0
- doc/install/OSX/porting/comment_27_2a60108a440231ba83f5a54b6bcc5488._comment +14/−0
- doc/install/OSX/porting/comment_27_d453510b9bb62072a4c663206c12c8a4._comment +8/−0
- doc/install/OSX/porting/comment_28_0970bfd63137ea48701dff6aea1b4bcb._comment +18/−0
- doc/install/OSX/porting/comment_29_8622ed56c6a8034c20fb311418d94003._comment +8/−0
- doc/install/OSX/porting/comment_30_ce58633ef5b2f8f4caa7e626358f33be._comment +8/−0
- doc/install/OSX/porting/comment_31_09084a7b3cf06bfa3add0f4991476ffe._comment +10/−0
- doc/install/OSX/porting/comment_32_a46d8e3e7795b9afb1e1c2be943d12af._comment +10/−0
- doc/install/OSX/porting/comment_33_203a36322b3c453c05c8906c64e62e06._comment +8/−0
- doc/install/OSX/porting/comment_34_874ff01f27911baf6ef0f559d5d5f5a0._comment +27/−0
- doc/install/OSX/porting/comment_8_38d9c2eea1090674de2361274eab5b0e._comment +29/−0
- doc/install/OSX/porting/comment_9_35bf3812db6f3ef25da9b3bc84f147c5._comment +8/−0
- doc/install/fromsource.mdwn +10/−6
- doc/install/fromsource/comment_10_7ebe353b05d4df29897dc9a4f45c8a91._comment +8/−0
- doc/install/fromsource/comment_11_0d06702e6e0ae3cd331cf748a9f6f273._comment +44/−0
- doc/install/fromsource/comment_12_b93ca271dffca3f948645d3e1326c1d9._comment +12/−0
- doc/install/fromsource/comment_13_3dac019cda71bf99878c0a1d9382323b._comment +8/−0
- doc/install/fromsource/comment_14_14b46470593f84f8c3768a91cb77bdab._comment +9/−0
- doc/install/fromsource/comment_15_c3a5b0aad28a90e0bb8da31a430578eb._comment +8/−0
- doc/install/fromsource/comment_16_4faf214f97f9516898d7c17d743ef825._comment +10/−0
- doc/install/fromsource/comment_17_2a9d6807a3a13815c824985521757167._comment +10/−0
- doc/install/fromsource/comment_18_1efa0c7a963ec452fc6336fbe4964f6e._comment +10/−0
- doc/install/fromsource/comment_19_6f42f9234f9ff6a2ca6bbb4d2643843e._comment +44/−0
- doc/install/fromsource/comment_20_0f553be2a4c666e3bed58b2bce549406._comment +8/−0
- doc/install/fromsource/comment_21_f91a6ec21e96eced73ea9579fd8cbd15._comment +8/−0
- doc/install/fromsource/comment_22_2f27b78215f97ade1986ca806c634cb3._comment +16/−0
- doc/install/fromsource/comment_23_c34d2b1d95830a3e58671a5b566a1758._comment +8/−0
- doc/install/fromsource/comment_24_40cbde8ec067b3a860e6df1a9bea5f76._comment +8/−0
- doc/install/fromsource/comment_25_8a7664e6f9271718dc607a0782366c5b._comment +8/−0
- doc/install/fromsource/comment_26_bd455c732639728bce2bfc39e32871d2._comment +8/−0
- doc/install/fromsource/comment_27_c080e9239b6eec88d329c28da7bb4141._comment +17/−0
- doc/install/fromsource/comment_28_15951dd070a675300420eea137a28ef9._comment +10/−0
- doc/install/fromsource/comment_29_ac082dca67f4a29b06070c0283130f52._comment +39/−0
- doc/install/fromsource/comment_30_ad639c07cb79e89406e95c1dafce3a01._comment +35/−0
- doc/install/fromsource/comment_31_4763b24a29627d55f465b9ea260ea7ec._comment +22/−0
- doc/install/fromsource/comment_32_1d34c294486c85b1149675fa5861ae35._comment +10/−0
- doc/install/fromsource/comment_33_8d4dfc33cada6091c30d3a43ce404b8b._comment +21/−0
- doc/install/fromsource/comment_34_38451e751add6daf479b559c4b6a7c61._comment +8/−0
- doc/install/fromsource/comment_35_4d44e4531e6686bd340f26836ad40026._comment +8/−0
- doc/install/fromsource/comment_36_2a095a5af53a356bd29abd22a9cb1bea._comment +16/−0
- doc/install/fromsource/comment_37_f33e1a4575dccc20b0d3d7c00e6db709._comment +69/−0
- doc/install/fromsource/comment_38_5c1e96221154a4ae4ebd636232044ced._comment +16/−0
- doc/install/fromsource/comment_39_a86057d7e6d47113330f79e1812c3a5d._comment +10/−0
- doc/install/fromsource/comment_45_d9cccbb9620cc8218e72b5380fd89a05._comment +8/−0
- doc/install/fromsource/comment_46_954de34275d33bc4590927f911761563._comment +10/−0
- doc/install/fromsource/comment_47_6de25c1e450e1e3b1d18d2c76235ccb8._comment +7/−0
- doc/install/fromsource/comment_48_9c08300c5d172ba9223042a00c8acb2b._comment +18/−0
- doc/news/version_5.20150406.mdwn +0/−33
- doc/news/version_5.20150522.mdwn +30/−0
- doc/special_remotes/S3.mdwn +0/−1
- doc/special_remotes/S3/comment_10_c366f020c9b97a365e21878a33360079._comment +10/−0
- doc/special_remotes/S3/comment_11_c1da387e082d91feec13dde91ccb111a._comment +12/−0
- doc/special_remotes/S3/comment_12_59c3ecab7dbc8be53258460473cac21c._comment +8/−0
- doc/special_remotes/S3/comment_13_0789a21d980825188bb09f7fc8bba8be._comment +33/−0
- doc/special_remotes/S3/comment_14_29574a51d5831c51e2e765eb2c06e567._comment +12/−0
- doc/special_remotes/S3/comment_15_ceb9048c743135f6beca57a23505f0a3._comment +8/−0
- doc/special_remotes/S3/comment_16_7b79f8b5ef88a2775d61b5ac5774d3e0._comment +8/−0
- doc/special_remotes/S3/comment_17_52d3510016c099d083553f9b3fa40db9._comment +10/−0
- doc/special_remotes/bup/comment_10_f78c1ed97d2e4c6ebffaa7482cfe0c9b._comment +23/−0
- doc/special_remotes/bup/comment_11_b53bceb0058acf4d1ab12ea4853ee443._comment +24/−0
- doc/special_remotes/bup/comment_12_65d923226cf6120349d807c5c60f640c._comment +8/−0
- doc/special_remotes/bup/comment_12_fca579678edde073716f099c767767e1._comment +10/−0
- doc/special_remotes/bup/comment_1_96179a003da4444f6fc08867872cda0a._comment +43/−0
- doc/special_remotes/bup/comment_2_612b038c15206f9f3c2e23c7104ca627._comment +12/−0
- doc/special_remotes/bup/comment_3_1186def82741ddab1ade256fb2e59e6f._comment +17/−0
- doc/special_remotes/bup/comment_4_7d22a805dd2914971e7ca628ceea69be._comment +10/−0
- doc/special_remotes/bup/comment_6_5942333cde09fd98e26c4f1d389cb76f._comment +10/−0
- doc/special_remotes/bup/comment_7_cb1a0d3076e9d06e7a24204478f6fa98._comment +10/−0
- doc/special_remotes/bup/comment_8_4cbc67e5911748d13cee3c483d7ece8a._comment +12/−0
- doc/special_remotes/bup/comment_9_ca7096a759961af375e6bd49663b45b3._comment +10/−0
- doc/special_remotes/hook/comment_1_6a74a25891974a28a8cb42b87cb53c26._comment +32/−0
- doc/special_remotes/hook/comment_2_ee7c43b93c5b787216334f019643f6a0._comment +17/−0
- doc/special_remotes/hook/comment_3_2593291795e732994862d08bf2ed467b._comment +17/−0
- doc/special_remotes/hook/comment_4_35d79b5ffa5a19056efcdc805070bc4b._comment +18/−0
- doc/special_remotes/hook/comment_5_6fbf1e963fa3ea4b2eb8ca5a3819762d._comment +10/−0
- doc/special_remotes/hook/comment_6_e0ab48d5333e5de85f016b097e6fdac1._comment +12/−0
- doc/special_remotes/hook/comment_7_cc2b1243c2c36e63241513bcaddfea67._comment +10/−0
- doc/special_remotes/hook/comment_8_bbae315233bda48eb04662dfd48cf1ae._comment +30/−0
- doc/special_remotes/hook/comment_9_037523d1994c702239ca96791156fe65._comment +10/−0
- doc/special_remotes/ipfs/comment_1_d1b2da148715476015716a2f866558b9._comment +7/−0
- doc/special_remotes/web/comment_1_0bd570025f6cd551349ea88a4729ac8e._comment +8/−0
- doc/special_remotes/web/comment_2_333141cc9ec6c26ffd19aa95303a91e3._comment +8/−0
- doc/special_remotes/xmpp/comment_1_568247938929a2934e8198fca80b7184._comment +11/−0
- doc/special_remotes/xmpp/comment_2_9fc3f512020b7eb2591d6b7b2e8de2d7._comment +10/−0
- doc/special_remotes/xmpp/comment_3_48ddbba1402d89acaea07cff747c48e0._comment +28/−0
- doc/special_remotes/xmpp/comment_4_59857879abaae22bde444a215e00bf18._comment +14/−0
- doc/special_remotes/xmpp/comment_5_583ee374bd34fcc9ae26c2fd690e8c47._comment +73/−0
- doc/special_remotes/xmpp/comment_6_8f0b5bba1271d031a67e7f0c175d67d5._comment +8/−0
- doc/special_remotes/xmpp/comment_7_ac7acbded03325b015959d82ae77faf1._comment +10/−0
- doc/special_remotes/xmpp/comment_8_81a9636a1e8a36a58185468a26f8633d._comment +8/−0
- doc/special_remotes/xmpp/comment_9_eda76b826491c96b1ce072aacf9d3adf._comment +23/−0
- doc/tips/assume-unstaged/comment_1_44abd811ef79a85e557418e17a3927be._comment +10/−0
- doc/tips/assume-unstaged/comment_2_5b589f37cfc03bf7be33a51826cc4dba._comment +13/−0
- doc/tips/skydriveannex/comment_10_c3465b5587548dea56b80b32cd66d653._comment +16/−0
- doc/tips/using_Amazon_S3/comment_1_666a26f95024760c99c627eed37b1966._comment +8/−0
- doc/tips/using_Amazon_S3/comment_2_f5a0883be7dbb421b584c6dc0165f1ef._comment +8/−0
- doc/tips/using_Amazon_S3/comment_3_32acba030c2ad252e2f7027075e4303e._comment +8/−0
- doc/tips/using_Amazon_S3/comment_4_92df5a9f923beafba55a1c455728112e._comment +13/−0
- doc/tips/using_Amazon_S3/comment_5_6b288e06010bedbb71e0afed6b427704._comment +8/−0
- doc/tips/using_Amazon_S3/comment_6_3b6c74b40ea666389ac04b52ab0819a0._comment +10/−0
- doc/tips/using_Amazon_S3/comment_7_cf6755d88463878f2ea6e4c300899027._comment +33/−0
- doc/tips/using_Amazon_S3/comment_8_4f9c2f6627f8ed3423bcc8b7bf2f76cb._comment +10/−0
- doc/tips/using_Amazon_S3/comment_9_47e4ea77d0262d332d86a06d7aaeddd8._comment +11/−0
- doc/tips/using_git_annex_with_no_fixed_hostname_and_optimising_ssh.mdwn +1/−1
- doc/todo/Move_ssh_config_to___126____47__ssh__47__git-annex__47__config.mdwn +9/−0
- doc/todo/Use_a_remote_as_a_sharing_site_for_files_with_obfuscated_URLs.mdwn +7/−0
- doc/todo/What_if_the_active_annex__39__ed_files_were_not_symlinks__63__.mdwn +26/−0
- doc/todo/cache_key_info/comment_1_578df1b3b2cbfdc4aa1805378f35dc48._comment +11/−0
- doc/todo/ctrl_c_handling/comment_1_3addbe33817db5de836c014287b14c07._comment +8/−0
- doc/todo/ctrl_c_handling/comment_2_cc2776dc4805421180edcdf96a89fcaa._comment +8/−0
- doc/todo/ctrl_c_handling/comment_3_8d7d357368987f5d5d59b4d8d99a0e06._comment +8/−0
- doc/todo/enable_a_discussion_forum_or_support_system.mdwn +132/−0
- doc/todo/fcntl_locks_break_with_threaded_concurrency.mdwn +29/−0
- doc/todo/git_annex_open/comment_1_67d90a1cb104d98e816354d96e1b0306._comment +21/−0
- doc/todo/openwrt_package/comment_1_100d76109e04bc43979775d71b4152ac._comment +12/−0
- doc/todo/openwrt_package/comment_2_2cb7dd4c0cc4413a4588b13cf7700de2._comment +9/−0
- doc/todo/openwrt_package/comment_3_5ba8a325a683ff543d81a366c873070d._comment +8/−0
- doc/todo/openwrt_package/comment_4_132e67b34f9c616217e037e4ecac70a4._comment +8/−0
- doc/todo/parallel_get.mdwn +3/−0
- doc/todo/union_mounting/comment_1_cb08435812dd7766de26199c73f38e8b._comment +8/−0
- doc/todo/union_mounting/comment_2_240b1736f6bd4fbf87c372d3a46e661b._comment +9/−0
- doc/todo/union_mounting/comment_3_cf0a0d4fbd929f24f7056115b2acb7de._comment +8/−0
- doc/todo/unused_by_refspec.mdwn +41/−0
- doc/todo/windows_support/comment_1_3cc26ad8101a22e95a8c60cf0c4dedcc._comment +10/−0
- doc/todo/windows_support/comment_2_8acae818ce468967499050bbe3c532ea._comment +12/−0
- doc/todo/windows_support/comment_3_bd0a12f4c9b884ab8a06082842381a01._comment +8/−0
- doc/todo/windows_support/comment_4_ad06b98b2ddac866ffee334e41fee6a8._comment +8/−0
- doc/todo/windows_support/comment_5_444fc7251f57db241b6e80abae41851c._comment +10/−0
- doc/todo/windows_support/comment_6_34f1f60b570c389bb1e741b990064a7e._comment +8/−0
- doc/todo/windows_support/comment_7_a5ca56c487257434650420acfa60e39f._comment +8/−0
- doc/todo/windows_support/comment_8_61214de7d967740d42905f3823ce2f65._comment +12/−0
- doc/todo/windows_support/comment_9_259a0b1a6f4d8d1944173380adc5e7c8._comment +8/−0
- doc/walkthrough/backups/comment_1_d0244791d2abbf29553546a6a6568a0f._comment +10/−0
- git-annex.cabal +11/−3
- man/git-annex-add.1 +1/−1
- man/git-annex-addunused.1 +1/−1
- man/git-annex-addurl.1 +1/−1
- man/git-annex-assistant.1 +1/−1
- man/git-annex-checkpresentkey.1 +1/−1
- man/git-annex-contentlocation.1 +1/−1
- man/git-annex-copy.1 +5/−1
- man/git-annex-dead.1 +1/−1
- man/git-annex-describe.1 +1/−1
- man/git-annex-diffdriver.1 +1/−1
- man/git-annex-direct.1 +1/−1
- man/git-annex-drop.1 +13/−1
- man/git-annex-dropkey.1 +1/−1
- man/git-annex-dropunused.1 +1/−1
- man/git-annex-edit.1 +1/−1
- man/git-annex-enableremote.1 +1/−1
- man/git-annex-examinekey.1 +1/−1
- man/git-annex-expire.1 +1/−1
- man/git-annex-find.1 +1/−1
- man/git-annex-findref.1 +1/−1
- man/git-annex-fix.1 +1/−1
- man/git-annex-forget.1 +1/−1
- man/git-annex-fromkey.1 +1/−1
- man/git-annex-fsck.1 +1/−1
- man/git-annex-fuzztest.1 +1/−1
- man/git-annex-get.1 +5/−1
- man/git-annex-group.1 +1/−1
- man/git-annex-groupwanted.1 +1/−1
- man/git-annex-import.1 +1/−1
- man/git-annex-importfeed.1 +1/−1
- man/git-annex-indirect.1 +1/−1
- man/git-annex-info.1 +1/−1
- man/git-annex-init.1 +1/−1
- man/git-annex-initremote.1 +1/−1
- man/git-annex-list.1 +1/−1
- man/git-annex-lock.1 +1/−1
- man/git-annex-log.1 +1/−1
- man/git-annex-lookupkey.1 +1/−1
- man/git-annex-map.1 +1/−1
- man/git-annex-merge.1 +1/−1
- man/git-annex-metadata.1 +1/−1
- man/git-annex-migrate.1 +1/−1
- man/git-annex-mirror.1 +5/−1
- man/git-annex-move.1 +5/−1
- man/git-annex-numcopies.1 +1/−1
- man/git-annex-pre-commit.1 +1/−1
- man/git-annex-proxy.1 +1/−1
- man/git-annex-readpresentkey.1 +1/−1
- man/git-annex-registerurl.1 +1/−1
- man/git-annex-reinit.1 +1/−1
- man/git-annex-reinject.1 +1/−1
- man/git-annex-rekey.1 +1/−1
- man/git-annex-remotedaemon.1 +1/−1
- man/git-annex-repair.1 +1/−1
- man/git-annex-required.1 +1/−1
- man/git-annex-resolvemerge.1 +1/−1
- man/git-annex-rmurl.1 +1/−1
- man/git-annex-schedule.1 +1/−1
- man/git-annex-semitrust.1 +1/−1
- man/git-annex-setpresentkey.1 +1/−1
- man/git-annex-shell.1 +4/−0
- man/git-annex-status.1 +1/−1
- man/git-annex-sync.1 +1/−1
- man/git-annex-test.1 +1/−1
- man/git-annex-testremote.1 +1/−1
- man/git-annex-transferkey.1 +1/−1
- man/git-annex-transferkeys.1 +1/−1
- man/git-annex-trust.1 +1/−1
- man/git-annex-unannex.1 +1/−1
- man/git-annex-undo.1 +2/−2
- man/git-annex-ungroup.1 +1/−1
- man/git-annex-uninit.1 +1/−1
- man/git-annex-unlock.1 too large to diff
- man/git-annex-untrust.1 too large to diff
- man/git-annex-unused.1 too large to diff
- man/git-annex-upgrade.1 too large to diff
- man/git-annex-vadd.1 too large to diff
- man/git-annex-vcycle.1 too large to diff
- man/git-annex-version.1 too large to diff
- man/git-annex-vfilter.1 too large to diff
- man/git-annex-vicfg.1 too large to diff
- man/git-annex-view.1 too large to diff
- man/git-annex-vpop.1 too large to diff
- man/git-annex-wanted.1 too large to diff
- man/git-annex-watch.1 too large to diff
- man/git-annex-webapp.1 too large to diff
- man/git-annex-whereis.1 too large to diff
- man/git-annex-xmppgit.1 too large to diff
- man/git-annex.1 too large to diff
- standalone/android/cabal.config too large to diff
- standalone/android/haskell-patches/clock_hack-for-android.patch too large to diff
- standalone/android/haskell-patches/gsasl_0.3.5-0001-link-with-libgsasl.patch too large to diff
- standalone/android/haskell-patches/socks_0.4.2_0001-remove-IPv6-stuff.patch too large to diff
- standalone/android/icons/drawable-hdpi/ic_stat_service_notification_icon.png too large to diff
- standalone/android/icons/drawable-ldpi/ic_stat_service_notification_icon.png too large to diff
- standalone/android/icons/drawable-mdpi/ic_stat_service_notification_icon.png too large to diff
- standalone/android/install-haskell-packages too large to diff
- standalone/android/tmp/network-2.4.1.2/LICENSE too large to diff
- standalone/android/tmp/network-2.4.1.2/Network.hs too large to diff
- standalone/android/tmp/network-2.4.1.2/Network/BSD.hsc too large to diff
- standalone/android/tmp/network-2.4.1.2/Network/Socket.hsc too large to diff
- standalone/android/tmp/network-2.4.1.2/Network/Socket/ByteString.hsc too large to diff
- standalone/android/tmp/network-2.4.1.2/Network/Socket/ByteString/IOVec.hsc too large to diff
- standalone/android/tmp/network-2.4.1.2/Network/Socket/ByteString/Internal.hs too large to diff
- standalone/android/tmp/network-2.4.1.2/Network/Socket/ByteString/Lazy.hsc too large to diff
- standalone/android/tmp/network-2.4.1.2/Network/Socket/ByteString/MsgHdr.hsc too large to diff
- standalone/android/tmp/network-2.4.1.2/Network/Socket/Internal.hsc too large to diff
- standalone/android/tmp/network-2.4.1.2/Network/Socket/Types.hsc too large to diff
- standalone/android/tmp/network-2.4.1.2/Network/URI.hs too large to diff
- standalone/android/tmp/network-2.4.1.2/README too large to diff
- standalone/android/tmp/network-2.4.1.2/Setup.hs too large to diff
- standalone/android/tmp/network-2.4.1.2/cabal.config too large to diff
- standalone/android/tmp/network-2.4.1.2/cbits/HsNet.c too large to diff
- standalone/android/tmp/network-2.4.1.2/cbits/ancilData.c too large to diff
- standalone/android/tmp/network-2.4.1.2/cbits/asyncAccept.c too large to diff
- standalone/android/tmp/network-2.4.1.2/cbits/initWinSock.c too large to diff
- standalone/android/tmp/network-2.4.1.2/cbits/winSockErr.c too large to diff
- standalone/android/tmp/network-2.4.1.2/config.guess too large to diff
- standalone/android/tmp/network-2.4.1.2/config.sub too large to diff
- standalone/android/tmp/network-2.4.1.2/configure too large to diff
- standalone/android/tmp/network-2.4.1.2/configure.ac too large to diff
- standalone/android/tmp/network-2.4.1.2/examples/EchoClient.hs too large to diff
- standalone/android/tmp/network-2.4.1.2/examples/EchoServer.hs too large to diff
- standalone/android/tmp/network-2.4.1.2/include/HsNet.h too large to diff
- standalone/android/tmp/network-2.4.1.2/include/HsNetworkConfig.h too large to diff
- standalone/android/tmp/network-2.4.1.2/include/HsNetworkConfig.h.in too large to diff
- standalone/android/tmp/network-2.4.1.2/install-sh too large to diff
- standalone/android/tmp/network-2.4.1.2/network.buildinfo.in too large to diff
- standalone/android/tmp/network-2.4.1.2/network.cabal too large to diff
- standalone/android/tmp/network-2.4.1.2/tests/Regression.hs too large to diff
- standalone/android/tmp/network-2.4.1.2/tests/Simple.hs too large to diff
- standalone/android/tmp/network-2.4.1.2/tests/uri001.hs too large to diff
- standalone/no-th/haskell-patches/profunctors_3.3-0001-fix-cross-build.patch too large to diff
- standalone/no-th/haskell-patches/yesod-persistent_do-not-really-build.patch too large to diff
@@ -42,7 +42,6 @@ import Git.CatFile import Git.CheckAttr import Git.CheckIgnore-import Git.SharedRepository import qualified Git.Hook import qualified Git.Queue import Types.Key@@ -57,7 +56,7 @@ import Types.UUID import Types.FileMatcher import Types.NumCopies-import Types.LockPool+import Types.LockCache import Types.MetaData import Types.DesktopNotify import Types.CleanupActions@@ -69,6 +68,7 @@ import "mtl" Control.Monad.Reader import Control.Concurrent+import Control.Concurrent.Async import qualified Data.Map as M import qualified Data.Set as S @@ -114,12 +114,11 @@ , uuidmap :: Maybe UUIDMap , preferredcontentmap :: Maybe (FileMatcherMap Annex) , requiredcontentmap :: Maybe (FileMatcherMap Annex)- , shared :: Maybe SharedRepository , forcetrust :: TrustMap , trustmap :: Maybe TrustMap , groupmap :: Maybe GroupMap , ciphers :: M.Map StorableCipher Cipher- , lockpool :: LockPool+ , lockcache :: LockCache , flags :: M.Map String Bool , fields :: M.Map String String , modmeta :: [ModMeta]@@ -134,6 +133,7 @@ #endif , existinghooks :: M.Map Git.Hook.Hook Bool , desktopnotify :: DesktopNotify+ , workers :: [Either AnnexState (Async AnnexState)] } newState :: GitConfig -> Git.Repo -> AnnexState@@ -159,12 +159,11 @@ , uuidmap = Nothing , preferredcontentmap = Nothing , requiredcontentmap = Nothing- , shared = Nothing , forcetrust = M.empty , trustmap = Nothing , groupmap = Nothing , ciphers = M.empty- , lockpool = M.empty+ , lockcache = M.empty , flags = M.empty , fields = M.empty , modmeta = []@@ -179,6 +178,7 @@ #endif , existinghooks = M.empty , desktopnotify = mempty+ , workers = [] } {- Makes an Annex state object for the specified git repo.
@@ -16,11 +16,9 @@ getState :: Annex BranchState getState = Annex.getState Annex.branchstate -setState :: BranchState -> Annex ()-setState state = Annex.changeState $ \s -> s { Annex.branchstate = state }- changeState :: (BranchState -> BranchState) -> Annex ()-changeState changer = setState =<< changer <$> getState+changeState changer = Annex.changeState $ \s -> + s { Annex.branchstate = changer (Annex.branchstate s) } {- Runs an action to check that the index file exists, if it's not been - checked before in this run of git-annex. -}
@@ -7,7 +7,8 @@ module Annex.CheckAttr ( checkAttr,- checkAttrHandle+ checkAttrHandle,+ checkAttrStop, ) where import Common.Annex@@ -33,3 +34,10 @@ h <- inRepo $ Git.checkAttrStart annexAttrs Annex.changeState $ \s -> s { Annex.checkattrhandle = Just h } return h++checkAttrStop :: Annex ()+checkAttrStop = maybe noop stop =<< Annex.getState Annex.checkattrhandle+ where+ stop h = do+ liftIO $ Git.checkAttrStop h+ Annex.changeState $ \s -> s { Annex.checkattrhandle = Nothing }
@@ -8,7 +8,8 @@ module Annex.CheckIgnore ( checkIgnored,- checkIgnoreHandle+ checkIgnoreHandle,+ checkIgnoreStop ) where import Common.Annex@@ -30,3 +31,11 @@ warning "The installed version of git is too old for .gitignores to be honored by git-annex." Annex.changeState $ \s -> s { Annex.checkignorehandle = Just v } return v++checkIgnoreStop :: Annex ()+checkIgnoreStop = maybe noop stop =<< Annex.getState Annex.checkignorehandle+ where+ stop (Just h) = do+ liftIO $ Git.checkIgnoreStop h+ Annex.changeState $ \s -> s { Annex.checkignorehandle = Nothing }+ stop Nothing = noop
@@ -0,0 +1,65 @@+{- git-annex concurrent state+ -+ - Copyright 2015 Joey Hess <id@joeyh.name>+ -+ - Licensed under the GNU GPL version 3 or higher.+ -}++module Annex.Concurrent where++import Common.Annex+import Annex+import Annex.CatFile+import Annex.CheckAttr+import Annex.CheckIgnore++import qualified Data.Map as M++{- Allows forking off a thread that uses a copy of the current AnnexState+ - to run an Annex action.+ -+ - The returned IO action can be used to start the thread.+ - It returns an Annex action that must be run in the original + - calling context to merge the forked AnnexState back into the+ - current AnnexState.+ -}+forkState :: Annex a -> Annex (IO (Annex a))+forkState a = do+ st <- dupState+ return $ do+ (ret, newst) <- run st a+ return $ do+ mergeState newst+ return ret++{- Returns a copy of the current AnnexState that is safe to be+ - used when forking off a thread. + -+ - After an Annex action is run using this AnnexState, it+ - should be merged back into the current Annex's state,+ - by calling mergeState.+ -}+dupState :: Annex AnnexState+dupState = do+ st <- Annex.getState id+ -- avoid sharing eg, open file handles+ return $ st+ { Annex.workers = []+ , Annex.catfilehandles = M.empty+ , Annex.checkattrhandle = Nothing+ , Annex.checkignorehandle = Nothing+ }++{- Merges the passed AnnexState into the current Annex state.+ - Also shuts closes various handles in it. -}+mergeState :: AnnexState -> Annex ()+mergeState st = do+ st' <- liftIO $ snd <$> run st closehandles+ forM_ (M.toList $ Annex.cleanup st') $+ uncurry addCleanup+ changeState $ \s -> s { errcounter = errcounter s + errcounter st' }+ where+ closehandles = do+ catFileStop+ checkAttrStop+ checkIgnoreStop
@@ -41,6 +41,7 @@ import Common.Annex import Logs.Location+import Logs.Transfer import qualified Git import qualified Annex import qualified Annex.Queue@@ -57,7 +58,7 @@ import Annex.Link import Annex.Content.Direct import Annex.ReplaceFile-import Utility.LockFile+import Utility.LockPool import Messages.Progress {- Checks if a given key's content is currently present. -}@@ -93,7 +94,7 @@ {- A safer check; the key's content must not only be present, but - is not in the process of being removed. -} inAnnexSafe :: Key -> Annex (Maybe Bool)-inAnnexSafe key = inAnnex' (fromMaybe False) (Just False) go key+inAnnexSafe key = inAnnex' (fromMaybe True) (Just False) go key where is_locked = Nothing is_unlocked = Just True@@ -149,10 +150,14 @@ - file from the content, since locking the actual content file - would interfere with the user's use of it. -} contentLockFile :: Key -> Annex (Maybe FilePath)+#ifndef mingw32_HOST_OS contentLockFile key = ifM isDirect ( Just <$> calcRepo (gitAnnexContentLock key) , return Nothing )+#else+contentLockFile key = Just <$> calcRepo (gitAnnexContentLock key)+#endif newtype ContentLock = ContentLock Key @@ -163,43 +168,41 @@ lockContent key a = do contentfile <- calcRepo $ gitAnnexLocation key lockfile <- contentLockFile key- maybe noop setuplockfile lockfile bracket (lock contentfile lockfile) (unlock lockfile)- (const $ a $ ContentLock key)+ (const $ a $ ContentLock key ) where alreadylocked = error "content is locked"- setuplockfile lockfile = modifyContent lockfile $- void $ liftIO $ tryIO $- writeFile lockfile ""+ failedtolock e = error $ "failed to lock content: " ++ show e+ trylock locker = locker `catchIO` failedtolock cleanuplockfile lockfile = modifyContent lockfile $ void $ liftIO $ tryIO $ nukeFile lockfile #ifndef mingw32_HOST_OS- 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 = catchDefaultIO Nothing $ - withModifiedFileMode f- (`unionFileModes` ownerWriteMode)- (openExistingLockFile f)- dolock Nothing = return Nothing- dolock (Just fd) = do- v <- tryIO $ setLock fd (WriteLock, AbsoluteSeek, 0, 0)- case v of- Left _ -> alreadylocked- Right _ -> return $ Just fd- unlock mlockfile mfd = do+ lock contentfile Nothing = trylock $ bracket_+ (thawContent contentfile)+ (freezeContent contentfile)+ (maybe alreadylocked return + =<< liftIO (tryLockExclusive Nothing contentfile))+ lock _ (Just lockfile) = trylock $ do+ mode <- annexFileMode+ maybe alreadylocked return + =<< modifyContent lockfile+ (liftIO $ tryLockExclusive (Just mode) lockfile)+ unlock mlockfile lck = do maybe noop cleanuplockfile mlockfile- liftIO $ maybe noop closeFd mfd+ liftIO $ dropLock lck #else- lock _ (Just lockfile) = liftIO $- maybe alreadylocked (return . Just) =<< lockExclusive lockfile+ lock _ (Just lockfile) = do+ modifyContent lockfile $+ void $ liftIO $ tryIO $+ writeFile lockfile ""+ maybe alreadylocked (return . Just)+ =<< liftIO (lockExclusive lockfile)+ -- never reached; windows always uses a separate lock file lock _ Nothing = return Nothing unlock mlockfile mlockhandle = do liftIO $ maybe noop dropLock mlockhandle@@ -239,7 +242,7 @@ alreadythere <- liftIO $ if e then getFileSize tmp else return 0- ifM (checkDiskSpace Nothing key alreadythere)+ ifM (checkDiskSpace Nothing key alreadythere True) ( do -- The tmp file may not have been left writable when e $ thawContent tmp@@ -278,18 +281,34 @@ return res {- Checks that there is disk space available to store a given key,- - in a destination (or the annex) printing a warning if not. -}-checkDiskSpace :: Maybe FilePath -> Key -> Integer -> Annex Bool-checkDiskSpace destination key alreadythere = ifM (Annex.getState Annex.force)+ - in a destination (or the annex) printing a warning if not. + -+ - If the destination is on the same filesystem as the annex,+ - checks for any other running downloads, removing the amount of data still+ - to be downloaded from the free space. This way, we avoid overcommitting+ - when doing concurrent downloads.+ -}+checkDiskSpace :: Maybe FilePath -> Key -> Integer -> Bool -> Annex Bool+checkDiskSpace destination key alreadythere samefilesystem = ifM (Annex.getState Annex.force) ( return True , do- reserve <- annexDiskReserve <$> Annex.getGitConfig+ -- We can't get inprogress and free at the same+ -- time, and both can be changing, so there's a+ -- small race here. Err on the side of caution+ -- by getting inprogress first, so if it takes+ -- a while, we'll see any decrease in the free+ -- disk space.+ inprogress <- if samefilesystem+ then sizeOfDownloadsInProgress (/= key)+ else pure 0 free <- liftIO . getDiskFree =<< dir case (free, fromMaybe 1 (keySize key)) of (Just have, need) -> do- let ok = (need + reserve <= have + alreadythere)+ reserve <- annexDiskReserve <$> Annex.getGitConfig+ let delta = need + reserve - have - alreadythere + inprogress+ let ok = delta <= 0 unless ok $- needmorespace (need + reserve - have - alreadythere)+ needmorespace delta return ok _ -> return True )@@ -596,39 +615,39 @@ - allow reading it, per core.sharedRepository setting. -} freezeContent :: FilePath -> Annex () freezeContent file = unlessM crippledFileSystem $- liftIO . go =<< fromRepo getSharedRepository+ withShared go where- go GroupShared = modifyFileMode file $+ go GroupShared = liftIO $ modifyFileMode file $ removeModes writeModes . addModes [ownerReadMode, groupReadMode]- go AllShared = modifyFileMode file $+ go AllShared = liftIO $ modifyFileMode file $ removeModes writeModes . addModes readModes- go _ = modifyFileMode file $+ go _ = liftIO $ modifyFileMode file $ removeModes writeModes . addModes [ownerReadMode] {- Adjusts read mode of annexed file per core.sharedRepository setting. -} chmodContent :: FilePath -> Annex () chmodContent file = unlessM crippledFileSystem $- liftIO . go =<< fromRepo getSharedRepository+ withShared go where- go GroupShared = modifyFileMode file $+ go GroupShared = liftIO $ modifyFileMode file $ addModes [ownerReadMode, groupReadMode]- go AllShared = modifyFileMode file $+ go AllShared = liftIO $ modifyFileMode file $ addModes readModes- go _ = modifyFileMode file $+ go _ = liftIO $ modifyFileMode file $ addModes [ownerReadMode] {- Allows writing to an annexed file that freezeContent was called on - before. -} thawContent :: FilePath -> Annex () thawContent file = unlessM crippledFileSystem $- liftIO . go =<< fromRepo getSharedRepository+ withShared go where- go GroupShared = groupWriteRead file- go AllShared = groupWriteRead file- go _ = allowWrite file+ go GroupShared = liftIO $ groupWriteRead file+ go AllShared = liftIO $ groupWriteRead file+ go _ = liftIO $ allowWrite file {- Finds files directly inside a directory like gitAnnexBadDir - (not in subdirectories) and returns the corresponding keys. -}
@@ -42,7 +42,7 @@ - The runner is used to run commands, and so can be either callCommand - or commandAction. -}-handleDropsFrom :: [UUID] -> [Remote] -> Reason -> Bool -> Key -> AssociatedFile -> Maybe Remote -> CommandActionRunner -> Annex ()+handleDropsFrom :: [UUID] -> [Remote] -> Reason -> Bool -> Key -> AssociatedFile -> Maybe Remote -> (CommandStart -> CommandCleanup) -> Annex () handleDropsFrom locs rs reason fromhere key afile knownpresentremote runner = do fs <- ifM isDirect ( do
@@ -8,26 +8,26 @@ {-# LANGUAGE CPP #-} module Annex.LockFile (- lockFileShared,+ lockFileCached, unlockFile,- getLockPool,+ getLockCache, withExclusiveLock, tryExclusiveLock, ) where import Common.Annex import Annex-import Types.LockPool+import Types.LockCache import qualified Git import Annex.Perms-import Utility.LockFile+import Utility.LockPool import qualified Data.Map as M {- Create a specified lock file, and takes a shared lock, which is retained- - in the pool. -}-lockFileShared :: FilePath -> Annex ()-lockFileShared file = go =<< fromLockPool file+ - in the cache. -}+lockFileCached :: FilePath -> Annex ()+lockFileCached file = go =<< fromLockCache file where go (Just _) = noop -- already locked go Nothing = do@@ -37,25 +37,25 @@ #else lockhandle <- liftIO $ waitToLock $ lockShared file #endif- changeLockPool $ M.insert file lockhandle+ changeLockCache $ M.insert file lockhandle unlockFile :: FilePath -> Annex ()-unlockFile file = maybe noop go =<< fromLockPool file+unlockFile file = maybe noop go =<< fromLockCache file where go lockhandle = do liftIO $ dropLock lockhandle- changeLockPool $ M.delete file+ changeLockCache $ M.delete file -getLockPool :: Annex LockPool-getLockPool = getState lockpool+getLockCache :: Annex LockCache+getLockCache = getState lockcache -fromLockPool :: FilePath -> Annex (Maybe LockHandle)-fromLockPool file = M.lookup file <$> getLockPool+fromLockCache :: FilePath -> Annex (Maybe LockHandle)+fromLockCache file = M.lookup file <$> getLockCache -changeLockPool :: (LockPool -> LockPool) -> Annex ()-changeLockPool a = do- m <- getLockPool- changeState $ \s -> s { lockpool = a m }+changeLockCache :: (LockCache -> LockCache) -> Annex ()+changeLockCache a = do+ m <- getLockCache+ changeState $ \s -> s { lockcache = a m } {- Runs an action with an exclusive lock held. If the lock is already - held, blocks until it becomes free. -}
@@ -15,6 +15,7 @@ freezeContentDir, thawContentDir, modifyContent,+ withShared, ) where import Common.Annex@@ -26,12 +27,7 @@ import System.Posix.Types withShared :: (SharedRepository -> Annex a) -> Annex a-withShared a = maybe startup a =<< Annex.getState Annex.shared- where- startup = do- shared <- fromRepo getSharedRepository- Annex.changeState $ \s -> s { Annex.shared = Just shared }- a shared+withShared a = a =<< coreSharedRepository <$> Annex.getGitConfig setAnnexFilePerm :: FilePath -> Annex () setAnnexFilePerm = setAnnexPerm False@@ -90,12 +86,12 @@ -} freezeContentDir :: FilePath -> Annex () freezeContentDir file = unlessM crippledFileSystem $- liftIO . go =<< fromRepo getSharedRepository+ withShared go where dir = parentDir file- go GroupShared = groupWriteRead dir- go AllShared = groupWriteRead dir- go _ = preventWrite dir+ go GroupShared = liftIO $ groupWriteRead dir+ go AllShared = liftIO $ groupWriteRead dir+ go _ = liftIO $ preventWrite dir thawContentDir :: FilePath -> Annex () thawContentDir file = unlessM crippledFileSystem $
@@ -37,7 +37,7 @@ import Annex.Index (addGitEnv) #ifndef mingw32_HOST_OS import Annex.Perms-import Utility.LockFile+import Utility.LockPool #endif {- Generates parameters to ssh to a given host (or user@host) on a given@@ -126,13 +126,13 @@ -- If the lock pool is empty, this is the first ssh of this -- run. There could be stale ssh connections hanging around -- from a previous git-annex run that was interrupted.- whenM (not . any isLock . M.keys <$> getLockPool)+ whenM (not . any isLock . M.keys <$> getLockCache) sshCleanup -- Cleanup at end of this run. Annex.addCleanup SshCachingCleanup sshCleanup liftIO $ createDirectoryIfMissing True $ parentDir socketfile- lockFileShared $ socket2lock socketfile+ lockFileCached $ socket2lock socketfile enumSocketFiles :: Annex [FilePath] enumSocketFiles = go =<< sshCacheDir
@@ -9,6 +9,7 @@ module Annex.Transfer ( module X,+ noObserver, upload, download, runTransfer,@@ -22,18 +23,23 @@ import Annex.Notification as X import Annex.Perms import Utility.Metered-#ifdef mingw32_HOST_OS-import Utility.LockFile-#endif+import Utility.LockPool import Control.Concurrent -upload :: UUID -> Key -> AssociatedFile -> RetryDecider -> (MeterUpdate -> Annex Bool) -> NotifyWitness -> Annex Bool-upload u key f d a _witness = runTransfer (Transfer Upload u key) f d a+type TransferAction = MeterUpdate -> Annex Bool -download :: UUID -> Key -> AssociatedFile -> RetryDecider -> (MeterUpdate -> Annex Bool) -> NotifyWitness -> Annex Bool-download u key f d a _witness = runTransfer (Transfer Download u key) f d a+type TransferObserver = Bool -> Transfer -> TransferInfo -> Annex () +noObserver :: TransferObserver+noObserver _ _ _ = noop++upload :: UUID -> Key -> AssociatedFile -> RetryDecider -> TransferObserver -> TransferAction -> NotifyWitness -> Annex Bool+upload u key f d o a _witness = runTransfer (Transfer Upload u key) f d o a++download :: UUID -> Key -> AssociatedFile -> RetryDecider -> TransferObserver -> TransferAction -> NotifyWitness -> Annex Bool+download u key f d o a _witness = runTransfer (Transfer Download u key) f d o a+ {- Runs a transfer action. Creates and locks the lock file while the - action is running, and stores info in the transfer information - file.@@ -46,7 +52,7 @@ - An upload can be run from a read-only filesystem, and in this case - no transfer information or lock file is used. -}-runTransfer :: Transfer -> Maybe FilePath -> RetryDecider -> (MeterUpdate -> Annex Bool) -> Annex Bool+runTransfer :: Transfer -> Maybe FilePath -> RetryDecider -> TransferObserver -> TransferAction -> Annex Bool runTransfer = runTransfer' False {- Like runTransfer, but ignores any existing transfer lock file for the@@ -54,46 +60,41 @@ - - Note that this may result in confusing progress meter display in the - webapp, if multiple processes are writing to the transfer info file. -}-alwaysRunTransfer :: Transfer -> Maybe FilePath -> RetryDecider -> (MeterUpdate -> Annex Bool) -> Annex Bool+alwaysRunTransfer :: Transfer -> Maybe FilePath -> RetryDecider -> TransferObserver -> TransferAction -> Annex Bool alwaysRunTransfer = runTransfer' True -runTransfer' :: Bool -> Transfer -> Maybe FilePath -> RetryDecider -> (MeterUpdate -> Annex Bool) -> Annex Bool-runTransfer' ignorelock t file shouldretry a = do+runTransfer' :: Bool -> Transfer -> Maybe FilePath -> RetryDecider -> TransferObserver -> TransferAction -> Annex Bool+runTransfer' ignorelock t file shouldretry transferobserver transferaction = do info <- liftIO $ startTransferInfo file (meter, tfile, metervar) <- mkProgressUpdater t info mode <- annexFileMode- (fd, inprogress) <- liftIO $ prep tfile mode info+ (lck, inprogress) <- liftIO $ prep tfile mode info if inprogress && not ignorelock then do- showNote "transfer already in progress"+ showNote "transfer already in progress, or unable to take transfer lock" return False else do- ok <- retry info metervar $- bracketIO (return fd) (cleanup tfile) (const $ a meter)- unless ok $ recordFailedTransfer t info+ ok <- retry info metervar $ transferaction meter+ liftIO $ cleanup tfile lck+ transferobserver ok t info return ok where #ifndef mingw32_HOST_OS prep tfile mode info = do- mfd <- catchMaybeIO $- openFd (transferLockFile tfile) ReadWrite (Just mode)- defaultFileFlags { trunc = True }- case mfd of- Nothing -> return (Nothing, False)- Just fd -> do- setFdOption fd CloseOnExec True- locked <- catchMaybeIO $- setLock fd (WriteLock, AbsoluteSeek, 0, 0)- if isNothing locked- then do- closeFd fd- return (Nothing, True)- else do- void $ tryIO $ writeTransferInfoFile info tfile- return (mfd, False)+ let lck = transferLockFile tfile+ r <- tryLockExclusive (Just mode) lck+ case r of+ Nothing -> return (Nothing, True)+ Just lockhandle -> ifM (checkSaneLock lck lockhandle)+ ( do+ void $ tryIO $ writeTransferInfoFile info tfile+ return (Just lockhandle, False)+ , return (Nothing, True)+ ) #else prep tfile _mode info = do- v <- catchMaybeIO $ lockExclusive (transferLockFile tfile)+ let lck = transferLockFile tfile+ v <- catchMaybeIO $ lockExclusive lck case v of Nothing -> return (Nothing, False) Just Nothing -> return (Nothing, True)@@ -103,10 +104,11 @@ #endif cleanup _ Nothing = noop cleanup tfile (Just lockhandle) = do+ let lck = transferLockFile tfile void $ tryIO $ removeFile tfile #ifndef mingw32_HOST_OS- void $ tryIO $ removeFile $ transferLockFile tfile- closeFd lockhandle+ void $ tryIO $ removeFile lck+ dropLock lockhandle #else {- Windows cannot delete the lockfile until the lock - is closed. So it's possible to race with another@@ -114,7 +116,7 @@ - so ignore failure to remove. -} dropLock lockhandle- void $ tryIO $ removeFile $ transferLockFile tfile+ void $ tryIO $ removeFile lck #endif retry oldinfo metervar run = do v <- tryNonAsync run
@@ -132,8 +132,9 @@ #endif ifM (liftIO $ inPath cmd) ( do- let run = void $ liftIO $ forkIO $ void $- createProcess p+ let run = void $ liftIO $ forkIO $ do+ (Nothing, Nothing, Nothing, pid) <- createProcess p+ void $ waitForProcess pid run #ifdef mingw32_HOST_OS {- On windows, if the file browser is not
@@ -43,5 +43,16 @@ $_=".IP\n"; } + if ($inNAME) {+ # make lexgrog happy+ s/^git-annex /git-annex-/;+ }+ if ($_ eq ".SH NAME\n") {+ $inNAME=1;+ }+ else {+ $inNAME=0;+ }+ print $_; }
@@ -84,7 +84,7 @@ #ifdef WITH_TORRENTPARSER , "TorrentParser" #else-#warning Building without haskell torrent library; will instead use btshowmetainfo to parse torrent files.+ #endif #ifdef WITH_EKG , "EKG"
@@ -1,3 +1,36 @@+git-annex (5.20150522) unstable; urgency=medium++ * import: Refuse to import files that are within the work tree, as that+ does not make sense and could cause data loss.+ * drop: Now supports --all, --unused, and --key.+ * drop: Now defaults to --all when run in a bare repository.+ (Previously, did nothing when run in a bare repository.)+ * get, move, copy, mirror: Concurrent transfers are now supported!+ For example: git-annex get -J10+ However, progress bars are not yet displayed for concurrent transfers,+ pending an updated version of the ascii-progress library.+ * --quiet now makes progress output by rsync, wget, etc be quiet too.+ * Take space that will be used by other running downloads into account when+ checking annex.diskreserve.+ * Avoid accumulating transfer failure log files unless the assistant is+ being used.+ * Fix an unlikely race that could result in two transfers of the same key+ running at once.+ * Stale transfer lock and info files will be cleaned up automatically+ when get/unused/info commands are run.+ * unused: Add --used-refspec option and annex.used-refspec, which can+ specify a set of refs to consider used, rather than the default of+ considering all refs used.+ * webapp: Fix zombie xdg-open process left when opening file browser.+ Closes: #785498+ * Safer posix fctnl locking implementation, using lock pools and STM.+ * Build documentation with TZ=UTC for reproducible builds. See #785736.+ * OSX: Corrected the location of trustedkeys.gpg, so the built-in+ upgrade code will find it. Fixes OSX upgrade going forward, but+ older versions won't upgrade themselves due to this problem.++ -- Joey Hess <id@joeyh.name> Fri, 22 May 2015 14:20:18 -0400+ git-annex (5.20150508.1) unstable; urgency=medium * Now builds cleanly using ghc 7.10 (as well as ghc back to 7.6).
@@ -104,7 +104,7 @@ Files: static/*/bootstrap* static/*/glyphicons-halflings* Copyright: 2012-2014 Twitter, Inc.-License: MIT+License: MIT-twitter Copyright (c) 2011-2014 Twitter, Inc . Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -1,6 +1,6 @@ {- git-annex command-line actions -- - Copyright 2010-2014 Joey Hess <id@joeyh.name>+ - Copyright 2010-2015 Joey Hess <id@joeyh.name> - - Licensed under the GNU GPL version 3 or higher. -}@@ -9,10 +9,15 @@ import Common.Annex import qualified Annex+import Annex.Concurrent import Types.Command import qualified Annex.Queue+import Messages.Internal+import Types.Messages -type CommandActionRunner = CommandStart -> CommandCleanup+import Control.Concurrent.Async+import Control.Exception (throwIO)+import Data.Either {- Runs a command, starting with the check stage, and then - the seek stage. Finishes by running the continutation, and @@ -22,6 +27,7 @@ mapM_ runCheck c Annex.changeState $ \s -> s { Annex.errcounter = 0 } seek params+ finishCommandActions cont showerrcount =<< Annex.getState Annex.errcounter where@@ -33,10 +39,78 @@ - including by throwing IO errors (but other errors terminate the whole - command). - - - This should only be run in the seek stage. -}-commandAction :: CommandActionRunner-commandAction a = account =<< tryIO go+ - When concurrency is enabled, a thread is forked off to run the action+ - in the background, as soon as a free slot is available.+ + - This should only be run in the seek stage.+ -}+commandAction :: CommandStart -> Annex ()+commandAction a = withOutputType go where+ go (ParallelOutput n) = do+ ws <- Annex.getState Annex.workers+ (st, ws') <- if null ws+ then do+ st <- dupState+ return (st, replicate (n-1) (Left st))+ else do+ l <- liftIO $ drainTo (n-1) ws+ findFreeSlot l+ w <- liftIO $ async $ snd <$> Annex.run st run+ Annex.changeState $ \s -> s { Annex.workers = Right w:ws' }+ go _ = run+ run = void $ includeCommandAction a++{- Waits for any forked off command actions to finish.+ -+ - Merge together the cleanup actions of all the AnnexStates used by+ - threads, into the current Annex's state, so they'll run at shutdown.+ -+ - Also merge together the errcounters of the AnnexStates.+ -}+finishCommandActions :: Annex ()+finishCommandActions = do+ l <- liftIO . drainTo 0 =<< Annex.getState Annex.workers+ forM_ (lefts l) mergeState++{- Wait for Asyncs from the list to finish, replacing them with their+ - final AnnexStates, until the list of remaining Asyncs is not larger+ - than the specified size, then returns the new list.+ -+ - If the action throws an exception, it is propigated, but first+ - all other actions are waited for, to allow for a clean shutdown.+ -}+drainTo+ :: Int+ -> [Either Annex.AnnexState (Async Annex.AnnexState)]+ -> IO [Either Annex.AnnexState (Async Annex.AnnexState)]+drainTo sz l+ | null as || sz >= length as = return l+ | otherwise = do+ (done, ret) <- waitAnyCatch as+ let as' = filter (/= done) as+ case ret of+ Left e -> do+ void $ drainTo 0 (map Left sts ++ map Right as')+ throwIO e+ Right st -> do+ drainTo sz $ map Left (st:sts) ++ map Right as'+ where+ (sts, as) = partitionEithers l++findFreeSlot :: [Either Annex.AnnexState (Async Annex.AnnexState)] -> Annex (Annex.AnnexState, [Either Annex.AnnexState (Async Annex.AnnexState)])+findFreeSlot = go []+ where+ go c [] = do+ st <- dupState+ return (st, c)+ go c (Left st:rest) = return (st, c ++ rest)+ go c (v:rest) = go (v:c) rest++{- Like commandAction, but without the concurrency. -}+includeCommandAction :: CommandStart -> CommandCleanup+includeCommandAction a = account =<< tryIO go+ where go = do Annex.Queue.flushWhenFull callCommandAction a@@ -53,7 +127,7 @@ {- Runs a single command action through the start, perform and cleanup - stages, without catching errors. Useful if one command wants to run - part of another command. -}-callCommandAction :: CommandActionRunner+callCommandAction :: CommandStart -> CommandCleanup callCommandAction = start where start = stage $ maybe skip perform
@@ -138,6 +138,14 @@ jsonOption = Option ['j'] ["json"] (NoArg (Annex.setOutput JSONOutput)) "enable JSON output" +jobsOption :: Option+jobsOption = Option ['J'] ["jobs"] (ReqArg set paramNumber)+ "enable concurrent jobs"+ where+ set s = case readish s of+ Nothing -> error "Bad --jobs number"+ Just n -> Annex.setOutput (ParallelOutput n)+ timeLimitOption :: Option timeLimitOption = Option ['T'] ["time-limit"] (ReqArg Limit.addTimeLimit paramTime)
@@ -84,7 +84,7 @@ case v of Nothing -> noop Just k -> whenM (matcher $ MatchingKey k) $- void $ commandAction $ a f k+ commandAction $ a f k withPathContents :: ((FilePath, FilePath) -> CommandStart) -> CommandSeek withPathContents a params = do
@@ -95,6 +95,8 @@ paramFile = "FILE" paramRef :: String paramRef = "REF"+paramRefSpec :: String+paramRefSpec = "REFSPEC" paramGroup :: String paramGroup = "GROUP" paramExpression :: String
@@ -223,7 +223,7 @@ tmp <- fromRepo $ gitAnnexTmpObjectLocation key showOutput ok <- Transfer.notifyTransfer Transfer.Download (Just file) $- Transfer.download webUUID key (Just file) Transfer.forwardRetry $ const $ do+ Transfer.download webUUID key (Just file) Transfer.forwardRetry Transfer.noObserver $ const $ do liftIO $ createDirectoryIfMissing True (parentDir tmp) downloadUrl [videourl] tmp if ok@@ -297,7 +297,7 @@ ) where runtransfer tmp = Transfer.notifyTransfer Transfer.Download (Just file) $- Transfer.download u dummykey (Just file) Transfer.forwardRetry $ \p -> do+ Transfer.download u dummykey (Just file) Transfer.forwardRetry Transfer.noObserver $ \p -> do liftIO $ createDirectoryIfMissing True (parentDir tmp) downloader tmp p
@@ -27,7 +27,7 @@ SectionCommon "indicate content of files not currently wanted"] dropOptions :: [Option]-dropOptions = dropFromOption : annexedMatchingOptions ++ [autoOption]+dropOptions = dropFromOption : annexedMatchingOptions ++ [autoOption] ++ keyOptions dropFromOption :: Option dropFromOption = fieldOption ['f'] "from" paramRemote "drop content from a remote"@@ -36,23 +36,32 @@ seek ps = do from <- getOptionField dropFromOption Remote.byNameWithUUID auto <- getOptionFlag autoOption- withFilesInGit (whenAnnexed $ start auto from) ps+ withKeyOptions auto+ (startKeys auto from)+ (withFilesInGit $ whenAnnexed $ start auto from)+ ps start :: Bool -> Maybe Remote -> FilePath -> Key -> CommandStart-start auto from file key = checkDropAuto auto from file key $ \numcopies ->+start auto from file key = start' auto from key (Just file)++start' :: Bool -> Maybe Remote -> Key -> AssociatedFile -> CommandStart+start' auto from key afile = checkDropAuto auto from afile key $ \numcopies -> stopUnless want $ case from of- Nothing -> startLocal (Just file) numcopies key Nothing+ Nothing -> startLocal afile numcopies key Nothing Just remote -> do u <- getUUID if Remote.uuid remote == u- then startLocal (Just file) numcopies key Nothing- else startRemote (Just file) numcopies key remote+ then startLocal afile numcopies key Nothing+ else startRemote afile numcopies key remote where want- | auto = wantDrop False (Remote.uuid <$> from) (Just key) (Just file)+ | auto = wantDrop False (Remote.uuid <$> from) (Just key) afile | otherwise = return True +startKeys :: Bool -> Maybe Remote -> Key -> CommandStart+startKeys auto from key = start' auto from key Nothing+ startLocal :: AssociatedFile -> NumCopies -> Key -> Maybe Remote -> CommandStart startLocal afile numcopies key knownpresentremote = stopUnless (inAnnex key) $ do showStart' "drop" key afile@@ -154,8 +163,8 @@ {- In auto mode, only runs the action if there are enough - copies on other semitrusted repositories. -}-checkDropAuto :: Bool -> Maybe Remote -> FilePath -> Key -> (NumCopies -> CommandStart) -> CommandStart-checkDropAuto auto mremote file key a = go =<< getFileNumCopies file+checkDropAuto :: Bool -> Maybe Remote -> AssociatedFile -> Key -> (NumCopies -> CommandStart) -> CommandStart+checkDropAuto auto mremote afile key a = go =<< maybe getNumCopies getFileNumCopies afile where go numcopies | auto = do
@@ -135,8 +135,8 @@ let cleanup = liftIO $ catchIO (removeFile tmp) (const noop) cleanup cleanup `after` a tmp- getfile tmp = ifM (checkDiskSpace (Just tmp) key 0)- ( ifM (Remote.retrieveKeyFileCheap remote key tmp)+ getfile tmp = ifM (checkDiskSpace (Just tmp) key 0 True)+ ( ifM (Remote.retrieveKeyFileCheap remote key (Just file) tmp) ( return (Just True) , ifM (Annex.getState Annex.fast) ( return Nothing
@@ -21,7 +21,7 @@ SectionCommon "make content of annexed files available"] getOptions :: [Option]-getOptions = fromOption : annexedMatchingOptions ++ keyOptions ++ [autoOption]+getOptions = fromOption : autoOption : jobsOption : annexedMatchingOptions ++ keyOptions seek :: CommandSeek seek ps = do@@ -90,6 +90,6 @@ | Remote.hasKeyCheap r = either (const False) id <$> Remote.hasKey r key | otherwise = return True- docopy r = download (Remote.uuid r) key afile noRetry $ \p -> do+ docopy r = download (Remote.uuid r) key afile noRetry noObserver $ \p -> do showAction $ "from " ++ Remote.name r Remote.retrieveKeyFile r key afile dest p
@@ -9,6 +9,7 @@ import Common.Annex import Command+import qualified Git import qualified Annex import qualified Command.Add import Utility.CopyFile@@ -62,6 +63,10 @@ seek :: CommandSeek seek ps = do mode <- getDuplicateMode+ repopath <- liftIO . absPath =<< fromRepo Git.repoPath+ inrepops <- liftIO $ filter (dirContains repopath) <$> mapM absPath ps+ unless (null inrepops) $ do+ error $ "cannot import files from inside the working tree (use git annex add instead): " ++ unwords inrepops withPathContents (start mode) ps start :: DuplicateMode -> (FilePath, FilePath) -> CommandStart
@@ -21,7 +21,7 @@ SectionCommon "mirror content of files to/from another repository"] mirrorOptions :: [Option]-mirrorOptions = fromToOptions ++ annexedMatchingOptions ++ keyOptions+mirrorOptions = fromToOptions ++ [jobsOption] ++ annexedMatchingOptions ++ keyOptions seek :: CommandSeek seek ps = do
@@ -22,7 +22,7 @@ SectionCommon "move content of files to/from another repository"] moveOptions :: [Option]-moveOptions = fromToOptions ++ keyOptions ++ annexedMatchingOptions+moveOptions = fromToOptions ++ [jobsOption] ++ keyOptions ++ annexedMatchingOptions seek :: CommandSeek seek ps = do@@ -95,7 +95,7 @@ Right False -> do showAction $ "to " ++ Remote.name dest ok <- notifyTransfer Upload afile $- upload (Remote.uuid dest) key afile noRetry $+ upload (Remote.uuid dest) key afile noRetry noObserver $ Remote.storeKey dest key afile if ok then do@@ -152,7 +152,7 @@ ) where go = notifyTransfer Download afile $ - download (Remote.uuid src) key afile noRetry $ \p -> do+ download (Remote.uuid src) key afile noRetry noObserver $ \p -> do showAction $ "from " ++ Remote.name src getViaTmp key $ \t -> Remote.retrieveKeyFile src key afile t p dispatch _ False = stop -- failed
@@ -44,7 +44,7 @@ fieldTransfer direction key a = do afile <- Fields.getField Fields.associatedFile ok <- maybe (a $ const noop)- (\u -> runner (Transfer direction (toUUID u) key) afile noRetry a)+ (\u -> runner (Transfer direction (toUUID u) key) afile noRetry noObserver a) =<< Fields.getField Fields.remoteUUID liftIO $ exitBool ok where
@@ -389,7 +389,7 @@ u <- getUUID let locs' = concat [[u | got], putrs, locs] - -- Using callCommandAction rather than commandAction for drops,+ -- Using callCommandAction rather than includeCommandAction for drops, -- because a failure to drop does not mean the sync failed. handleDropsFrom locs' rs "unwanted" True k (Just f) Nothing callCommandAction@@ -403,7 +403,7 @@ ( return [ get have ] , return [] )- get have = commandAction $ do+ get have = includeCommandAction $ do showStart "get" f next $ next $ getViaTmp k $ \dest -> getKeyFile' k (Just f) dest have @@ -415,7 +415,7 @@ , return [] ) put dest = do- ok <- commandAction $ do+ ok <- includeCommandAction $ do showStart "copy" f Command.Move.toStart' dest False (Just f) k return (ok, if ok then Just (Remote.uuid dest) else Nothing)
@@ -171,7 +171,7 @@ Remote.retrieveKeyFile r k Nothing dest nullMeterUpdate , check (== Right False) "retrieveKeyFileCheap" $ getViaTmp k $ \dest ->- Remote.retrieveKeyFileCheap r k dest+ Remote.retrieveKeyFileCheap r k Nothing dest ] where check checkval desc a = testCase desc $ do
@@ -42,7 +42,7 @@ toPerform :: Remote -> Key -> AssociatedFile -> CommandPerform toPerform remote key file = go Upload file $- upload (uuid remote) key file forwardRetry $ \p -> do+ upload (uuid remote) key file forwardRetry noObserver $ \p -> do ok <- Remote.storeKey remote key file p when ok $ Remote.logStatus remote key InfoPresent@@ -50,7 +50,7 @@ fromPerform :: Remote -> Key -> AssociatedFile -> CommandPerform fromPerform remote key file = go Upload file $- download (uuid remote) key file forwardRetry $ \p ->+ download (uuid remote) key file forwardRetry noObserver $ \p -> getViaTmp key $ \t -> Remote.retrieveKeyFile remote key file t p go :: Direction -> AssociatedFile -> (NotifyWitness -> Annex Bool) -> CommandPerform
@@ -36,14 +36,17 @@ where runner (TransferRequest direction remote key file) | direction == Upload = notifyTransfer direction file $- upload (Remote.uuid remote) key file forwardRetry $ \p -> do+ upload (Remote.uuid remote) key file forwardRetry observer $ \p -> do ok <- Remote.storeKey remote key file p when ok $ Remote.logStatus remote key InfoPresent return ok | otherwise = notifyTransfer direction file $- download (Remote.uuid remote) key file forwardRetry $ \p ->+ download (Remote.uuid remote) key file forwardRetry observer $ \p -> getViaTmp key $ \t -> Remote.retrieveKeyFile remote key file t p+ + observer False t info = recordFailedTransfer t info+ observer True _ _ = noop runRequests :: Handle
@@ -43,7 +43,7 @@ ) perform :: FilePath -> Key -> CommandPerform-perform dest key = ifM (checkDiskSpace Nothing key 0)+perform dest key = ifM (checkDiskSpace Nothing key 0 True) ( do src <- calcRepo $ gitAnnexLocation key tmpdest <- fromRepo $ gitAnnexTmpObjectLocation key
@@ -31,34 +31,43 @@ import qualified Annex.Branch import Annex.CatFile import Types.Key+import Types.RefSpec import Git.FilePath import Logs.View (is_branchView) import Utility.Bloom cmd :: [Command]-cmd = [withOptions [unusedFromOption] $ command "unused" paramNothing seek- SectionMaintenance "look for unused file content"]+cmd = [withOptions [unusedFromOption, refSpecOption] $+ command "unused" paramNothing seek+ SectionMaintenance "look for unused file content"] unusedFromOption :: Option unusedFromOption = fieldOption ['f'] "from" paramRemote "remote to check for unused content" +refSpecOption :: Option+refSpecOption = fieldOption [] "used-refspec" paramRefSpec "refs to consider used (default: all refs)"+ seek :: CommandSeek seek = withNothing start {- Finds unused content in the annex. -} start :: CommandStart start = do- from <- Annex.getField $ optionName unusedFromOption+ cfgrefspec <- fromMaybe allRefSpec . annexUsedRefSpec+ <$> Annex.getGitConfig+ !refspec <- maybe cfgrefspec (either error id . parseRefSpec)+ <$> Annex.getField (optionName refSpecOption)+ from <- Annex.getField (optionName unusedFromOption) let (name, action) = case from of- Nothing -> (".", checkUnused)- Just "." -> (".", checkUnused)- Just "here" -> (".", checkUnused)- Just n -> (n, checkRemoteUnused n)+ Nothing -> (".", checkUnused refspec)+ Just "." -> (".", checkUnused refspec)+ Just "here" -> (".", checkUnused refspec)+ Just n -> (n, checkRemoteUnused n refspec) showStart "unused" name next action -checkUnused :: CommandPerform-checkUnused = chain 0+checkUnused :: RefSpec -> CommandPerform+checkUnused refspec = chain 0 [ check "" unusedMsg $ findunused =<< Annex.getState Annex.fast , check "bad" staleBadMsg $ staleKeysPrune gitAnnexBadDir False , check "tmp" staleTmpMsg $ staleKeysPrune gitAnnexTmpObjectDir True@@ -71,20 +80,20 @@ showAction "checking for unused data" -- InAnnex, not InRepository because if a direct mode -- file exists, it is obviously not unused.- excludeReferenced =<< getKeysPresent InAnnex+ excludeReferenced refspec =<< getKeysPresent InAnnex chain _ [] = next $ return True chain v (a:as) = do v' <- a v chain v' as -checkRemoteUnused :: String -> CommandPerform-checkRemoteUnused name = go =<< fromJust <$> Remote.byNameWithUUID (Just name)+checkRemoteUnused :: String -> RefSpec -> CommandPerform+checkRemoteUnused name refspec = go =<< fromJust <$> Remote.byNameWithUUID (Just name) where go r = do showAction "checking for unused data" _ <- check "" (remoteUnusedMsg r) (remoteunused r) 0 next $ return True- remoteunused r = excludeReferenced <=< loggedKeysFor $ Remote.uuid r+ remoteunused r = excludeReferenced refspec <=< loggedKeysFor $ Remote.uuid r check :: FilePath -> ([(Int, Key)] -> String) -> Annex [Key] -> Int -> Annex Int check file msg a c = do@@ -145,7 +154,7 @@ - * Build a bloom filter of all keys referenced by symlinks. This - is the fastest one to build and will filter out most keys. - * If keys remain, build a second bloom filter of keys referenced by- - all branches.+ - branches maching the RefSpec. - * The list is streamed through these bloom filters lazily, so both will - exist at the same time. This means that twice the memory is used, - but they're relatively small, so the added complexity of using a@@ -157,13 +166,13 @@ - Short-circuiting if the first filter filters all the keys handles the - other common case. -}-excludeReferenced :: [Key] -> Annex [Key]-excludeReferenced ks = runfilter firstlevel ks >>= runfilter secondlevel+excludeReferenced :: RefSpec -> [Key] -> Annex [Key]+excludeReferenced refspec ks = runfilter firstlevel ks >>= runfilter secondlevel where runfilter _ [] = return [] -- optimisation runfilter a l = bloomFilter show l <$> genBloomFilter show a firstlevel = withKeysReferencedM- secondlevel = withKeysReferencedInGit+ secondlevel = withKeysReferencedInGit refspec {- Finds items in the first, smaller list, that are not - present in the second, larger list.@@ -258,14 +267,15 @@ !v' <- a k f v go v' fs -withKeysReferencedInGit :: (Key -> Annex ()) -> Annex ()-withKeysReferencedInGit a = do+withKeysReferencedInGit :: RefSpec -> (Key -> Annex ()) -> Annex ()+withKeysReferencedInGit refspec a = do current <- inRepo Git.Branch.currentUnsafe shaHead <- maybe (return Nothing) (inRepo . Git.Ref.sha) current- showref >>= mapM_ (withKeysReferencedInGitRef a) .- relevantrefs (shaHead, current)+ usedrefs <- applyRefSpec refspec . relevantrefs (shaHead, current)+ <$> inRepo (Git.Command.pipeReadStrict [Param "show-ref"])+ forM_ usedrefs $+ withKeysReferencedInGitRef a where- showref = inRepo $ Git.Command.pipeReadStrict [Param "show-ref"] relevantrefs headRef = addHead headRef . filter ourbranches . map (separate (== ' ')) .@@ -293,8 +303,8 @@ showAction $ "checking " ++ Git.Ref.describe ref bare <- isBareRepo (ts,clean) <- inRepo $ if bare- then DiffTree.diffIndex ref- else DiffTree.diffWorkTree ref+ then DiffTree.diffIndex ref+ else DiffTree.diffWorkTree ref let lookAtWorkingTree = not bare && ref == Git.Ref.headRef forM_ ts $ tKey lookAtWorkingTree >=> maybe noop a liftIO $ void clean
@@ -74,7 +74,7 @@ liftIO $ do void $ tryIO $ removeDirectoryRecursive dbdir rename tmpdbdir dbdir- lockFileShared =<< fromRepo (gitAnnexFsckDbLock u)+ lockFileCached =<< fromRepo (gitAnnexFsckDbLock u) h <- liftIO $ H.openDb db "fscked" return $ FsckHandle h u
@@ -17,7 +17,7 @@ import Utility.Percentage import Utility.QuickCheck import Utility.PID-import Utility.LockFile+import Utility.LockPool import Logs.TimeStamp import Data.Time.Clock@@ -123,17 +123,38 @@ <*> pure file <*> pure False -{- If a transfer is still running, returns its TransferInfo. -}+{- If a transfer is still running, returns its TransferInfo.+ - + - If no transfer is running, attempts to clean up the stale+ - lock and info files. This can happen if a transfer process was+ - interrupted.+ -} checkTransfer :: Transfer -> Annex (Maybe TransferInfo) checkTransfer t = do tfile <- fromRepo $ transferFile t+ let cleanstale = do+ void $ tryIO $ removeFile tfile+ void $ tryIO $ removeFile $ transferLockFile tfile #ifndef mingw32_HOST_OS liftIO $ do- v <- getLockStatus (transferLockFile tfile)+ let lck = transferLockFile tfile+ v <- getLockStatus lck case v of- Just (pid, _) -> catchDefaultIO Nothing $+ StatusLockedBy pid -> catchDefaultIO Nothing $ readTransferInfoFile (Just pid) tfile- Nothing -> return Nothing+ StatusNoLockFile -> return Nothing+ StatusUnLocked -> do+ -- Take a non-blocking lock while deleting+ -- the stale lock file. Ignore failure+ -- due to permissions problems, races, etc.+ void $ tryIO $ do+ r <- tryLockExclusive Nothing lck+ case r of+ Just lockhandle -> do+ cleanstale+ dropLock lockhandle+ _ -> noop+ return Nothing #else v <- liftIO $ lockShared $ transferLockFile tfile liftIO $ case v of@@ -141,21 +162,37 @@ readTransferInfoFile Nothing tfile Just lockhandle -> do dropLock lockhandle- void $ tryIO $ removeFile $ transferLockFile tfile+ cleanstale return Nothing #endif {- Gets all currently running transfers. -} getTransfers :: Annex [(Transfer, TransferInfo)]-getTransfers = do- transfers <- mapMaybe parseTransferFile . concat <$> findfiles+getTransfers = getTransfers' [Download, Upload] (const True)++getTransfers' :: [Direction] -> (Key -> Bool) -> Annex [(Transfer, TransferInfo)]+getTransfers' dirs wanted = do+ transfers <- filter (wanted . transferKey)+ <$> mapMaybe parseTransferFile . concat <$> findfiles infos <- mapM checkTransfer transfers return $ map (\(t, Just i) -> (t, i)) $ filter running $ zip transfers infos where findfiles = liftIO . mapM dirContentsRecursive- =<< mapM (fromRepo . transferDir) [Download, Upload]+ =<< mapM (fromRepo . transferDir) dirs running (_, i) = isJust i++{- Number of bytes remaining to download from matching downloads that are in+ - progress. -}+sizeOfDownloadsInProgress :: (Key -> Bool) -> Annex Integer+sizeOfDownloadsInProgress wanted = sum . map remaining+ <$> getTransfers' [Download] wanted+ where+ remaining (t, info) =+ case (keySize (transferKey t), bytesComplete info) of+ (Just sz, Just done) -> sz - done+ (Just sz, Nothing) -> sz+ (Nothing, _) -> 0 {- Gets failed transfers for a given remote UUID. -} getFailedTransfers :: UUID -> Annex [(Transfer, TransferInfo)]
@@ -73,7 +73,7 @@ mkdir -p man docs: mans- $(IKIWIKI) doc html -v --wikiname git-annex --plugin=goodstuff \+ TZ=UTC $(IKIWIKI) doc html -v --wikiname git-annex --plugin=goodstuff \ --no-usedirs --disable-plugin=openid --plugin=sidebar \ --underlaydir=/dev/null --disable-plugin=shortcut \ --disable-plugin=smiley \@@ -174,7 +174,7 @@ ln -sf git-annex "$(OSXAPP_BASE)/git-annex-shell" gzcat standalone/licences.gz > $(OSXAPP_BASE)/LICENSE cp $(OSXAPP_BASE)/LICENSE tmp/build-dmg/LICENSE.txt- cp standalone/trustedkeys.gpg $(OSXAPP_BASE)+ cp standalone/trustedkeys.gpg $(OSXAPP_DEST)/Contents/MacOS ./Build/Standalone $(OSXAPP_BASE) @@ -207,7 +207,7 @@ # and not overwritten.) cp -uR tmp/splices/* tmp/no-th-tree || true # Some additional dependencies needed by the expanded splices.- sed -i 's/^ Build-Depends: / Build-Depends: yesod-routes, yesod-core, shakespeare-css, shakespeare-js, shakespeare, blaze-markup, file-embed, wai-app-static, unordered-containers, /' tmp/no-th-tree/git-annex.cabal+ sed -i 's/^ Build-Depends: */ Build-Depends: yesod-routes, yesod-core, shakespeare-css, shakespeare-js, shakespeare, blaze-markup, file-embed, wai-app-static, unordered-containers, /' tmp/no-th-tree/git-annex.cabal # Avoid warnings due to sometimes unused imports added for the splices. sed -i 's/GHC-Options: \(.*\)-Wall/GHC-Options: \1-Wall -fno-warn-unused-imports /i' tmp/no-th-tree/git-annex.cabal sed -i 's/Extensions: /Extensions: MagicHash /i' tmp/no-th-tree/git-annex.cabal@@ -237,7 +237,7 @@ # and not overwritten.) cp -uR tmp/splices/* tmp/androidtree || true # Some additional dependencies needed by the expanded splices.- sed -i 's/^ Build-Depends: / Build-Depends: yesod-routes, yesod-core, shakespeare-css, shakespeare-js, shakespeare, blaze-markup, file-embed, wai-app-static, unordered-containers, /' tmp/androidtree/git-annex.cabal+ sed -i 's/^ Build-Depends: */ Build-Depends: yesod-routes, yesod-core, shakespeare-css, shakespeare-js, shakespeare, blaze-markup, file-embed, wai-app-static, unordered-containers, /' 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/androidtree/git-annex.cabal@@ -269,7 +269,7 @@ @$(MAKE) tags >/dev/null 2>&1 & dist/caballog: git-annex.cabal- $(CABAL) configure -f"-Production" -O0+ $(CABAL) configure -f"-Production" -O0 --enable-executable-dynamic $(CABAL) build -v2 | tee $@ # Hardcoded command line to make hdevtools start up and work.
@@ -19,6 +19,7 @@ showEndOk, showEndFail, showEndResult,+ endResult, toplevelWarning, warning, warningIO,@@ -111,12 +112,12 @@ showEndFail = showEndResult False showEndResult :: Bool -> Annex ()-showEndResult ok = handleMessage (JSON.end ok) $ putStrLn msg- where- msg- | ok = "ok"- | otherwise = "failed"+showEndResult ok = handleMessage (JSON.end ok) $ putStrLn $ endResult ok +endResult :: Bool -> String+endResult True = "ok"+endResult False = "failed"+ toplevelWarning :: Bool -> String -> Annex () toplevelWarning makeway s = warning' makeway ("git-annex: " ++ s) @@ -191,6 +192,6 @@ commandProgressDisabled :: Annex Bool commandProgressDisabled = withOutputType $ \t -> return $ case t of QuietOutput -> True- ProgressOutput -> True+ ParallelOutput _ -> True JSONOutput -> True NormalOutput -> False
@@ -17,7 +17,7 @@ where go NormalOutput = liftIO normal go QuietOutput = q- go ProgressOutput = q+ go (ParallelOutput _) = q go JSONOutput = liftIO $ flushed json q :: Monad m => m ()
@@ -5,6 +5,8 @@ - Licensed under the GNU GPL version 3 or higher. -} +{-# LANGUAGE CPP #-}+ module Messages.Progress where import Common@@ -15,35 +17,98 @@ import Types.Messages import Types.Key +#ifdef WITH_ASCIIPROGRESS+import System.Console.AsciiProgress+import qualified System.Console.Terminal.Size as Terminal+import Control.Concurrent+#else import Data.Progress.Meter import Data.Progress.Tracker import Data.Quantity+#endif {- Shows a progress meter while performing a transfer of a key. - The action is passed a callback to use to update the meter. -}-metered :: Maybe MeterUpdate -> Key -> (MeterUpdate -> Annex a) -> Annex a-metered combinemeterupdate key a = go (keySize key)+metered :: Maybe MeterUpdate -> Key -> AssociatedFile -> (MeterUpdate -> Annex a) -> Annex a+metered combinemeterupdate key af a = case keySize key of+ Nothing -> nometer+ Just size -> withOutputType (go $ fromInteger size) where- go (Just size) = meteredBytes combinemeterupdate size a- go _ = a (const noop)+ go _ QuietOutput = nometer+ go _ JSONOutput = nometer+#ifdef WITH_ASCIIPROGRESS+ go size _ = do+ showOutput+ liftIO $ putStrLn "" -{- Shows a progress meter while performing an action on a given number- - of bytes. -}-meteredBytes :: Maybe MeterUpdate -> Integer -> (MeterUpdate -> Annex a) -> Annex a-meteredBytes combinemeterupdate size a = withOutputType go- where- go NormalOutput = do+ cols <- liftIO $ maybe 79 Terminal.width <$> Terminal.size+ let desc = truncatepretty cols $ fromMaybe (key2file key) af++ result <- liftIO newEmptyMVar+ pg <- liftIO $ newProgressBar def+ { pgWidth = cols+ , pgFormat = desc ++ " :percent :bar ETA :eta"+ , pgTotal = size+ , pgOnCompletion = do+ ok <- takeMVar result+ putStrLn $ desc ++ " " ++ endResult ok+ }+ r <- a $ liftIO . pupdate pg++ liftIO $ do+ -- See if the progress bar is complete or not.+ sofar <- stCompleted <$> getProgressStats pg+ putMVar result (sofar >= size)+ -- May not be actually complete if the action failed,+ -- but this just clears the progress bar.+ complete pg++ return r+#else+ -- Old progress bar code, not suitable for parallel output.+ go _ (ParallelOutput _) = do+ r <- nometer+ liftIO $ putStrLn $ fromMaybe (key2file key) af+ return r+ go size NormalOutput = do+ showOutput progress <- liftIO $ newProgress "" size meter <- liftIO $ newMeter progress "B" 25 (renderNums binaryOpts 1)- showOutput- r <- a $ \n -> liftIO $ do- setP progress $ fromBytesProcessed n- displayMeter stdout meter- maybe noop (\m -> m n) combinemeterupdate+ r <- a $ liftIO . pupdate meter progress liftIO $ clearMeter stdout meter return r- go _ = a (const noop)+#endif +#ifdef WITH_ASCIIPROGRESS+ pupdate pg n = do+ let i = fromBytesProcessed n+ sofar <- stCompleted <$> getProgressStats pg+ when (i > sofar) $+ tickN pg (i - sofar)+ threadDelay 100+#else+ pupdate meter progress n = do+ setP progress $ fromBytesProcessed n+ displayMeter stdout meter+#endif+ maybe noop (\m -> m n) combinemeterupdate++ nometer = a (const noop)++#ifdef WITH_ASCIIPROGRESS+ truncatepretty n s+ | length s > n = take (n-2) s ++ ".."+ | otherwise = s+#endif++{- Use when the progress meter is only desired for parallel+ - mode; as when a command's own progress output is preferred. -}+parallelMetered :: Maybe MeterUpdate -> Key -> AssociatedFile -> (MeterUpdate -> Annex a) -> Annex a+parallelMetered combinemeterupdate key af a = withOutputType go+ where+ go (ParallelOutput _) = metered combinemeterupdate key af a+ go _ = a (fromMaybe (const noop) combinemeterupdate)+ {- Progress dots. -} showProgressDots :: Annex () showProgressDots = handleMessage q $@@ -84,5 +149,5 @@ mkStderrEmitter :: Annex (String -> IO ()) mkStderrEmitter = withOutputType go where- go ProgressOutput = return $ \s -> hPutStrLn stderr ("E: " ++ s)+ go (ParallelOutput _) = return $ \s -> hPutStrLn stderr ("E: " ++ s) go _ = return (hPutStrLn stderr)
@@ -93,8 +93,8 @@ , return False ) -downloadKeyCheap :: Key -> FilePath -> Annex Bool-downloadKeyCheap _ _ = return False+downloadKeyCheap :: Key -> AssociatedFile -> FilePath -> Annex Bool+downloadKeyCheap _ _ _ = return False uploadKey :: Key -> AssociatedFile -> MeterUpdate -> Annex Bool uploadKey _ _ _ = do
@@ -148,8 +148,8 @@ liftIO (hClose h >> forceSuccessProcess p pid) `after` (sink =<< liftIO (L.hGetContents h)) -retrieveCheap :: BupRepo -> Key -> FilePath -> Annex Bool-retrieveCheap _ _ _ = return False+retrieveCheap :: BupRepo -> Key -> AssociatedFile -> FilePath -> Annex Bool+retrieveCheap _ _ _ _ = return False {- Cannot revert having stored a key in bup, but at least the data for the - key will be used for deltaing data of other keys stored later.
@@ -142,8 +142,8 @@ liftIO (hClose h >> forceSuccessProcess p pid) `after` (sink =<< liftIO (L.hGetContents h)) -retrieveCheap :: Key -> FilePath -> Annex Bool-retrieveCheap _ _ = return False+retrieveCheap :: Key -> AssociatedFile -> FilePath -> Annex Bool+retrieveCheap _ _ _ = return False remove :: DdarRepo -> Remover remove ddarrepo key = do
@@ -118,9 +118,16 @@ {- Check if there is enough free disk space in the remote's directory to - store the key. Note that the unencrypted key size is checked. -} prepareStore :: FilePath -> ChunkConfig -> Preparer Storer-prepareStore d chunkconfig = checkPrepare- (\k -> checkDiskSpace (Just d) k 0)+prepareStore d chunkconfig = checkPrepare checker (byteStorer $ store d chunkconfig)+ where+ checker k = do+ annexdir <- fromRepo gitAnnexObjectDir+ samefilesystem <- liftIO $ catchDefaultIO False $ + (\a b -> deviceID a == deviceID b)+ <$> getFileStatus d+ <*> getFileStatus annexdir+ checkDiskSpace (Just d) k 0 samefilesystem store :: FilePath -> ChunkConfig -> Key -> L.ByteString -> MeterUpdate -> Annex Bool store d chunkconfig k b p = liftIO $ do@@ -156,12 +163,12 @@ retrieve d _ = simplyPrepare $ byteRetriever $ \k sink -> sink =<< liftIO (L.readFile =<< getLocation d k) -retrieveCheap :: FilePath -> ChunkConfig -> Key -> FilePath -> Annex Bool+retrieveCheap :: FilePath -> ChunkConfig -> Key -> AssociatedFile -> FilePath -> Annex Bool -- no cheap retrieval possible for chunks-retrieveCheap _ (UnpaddedChunks _) _ _ = return False-retrieveCheap _ (LegacyChunks _) _ _ = return False+retrieveCheap _ (UnpaddedChunks _) _ _ _ = return False+retrieveCheap _ (LegacyChunks _) _ _ _ = return False #ifndef mingw32_HOST_OS-retrieveCheap d NoChunks k f = liftIO $ catchBoolIO $ do+retrieveCheap d NoChunks k _af f = liftIO $ catchBoolIO $ do file <- absPath =<< getLocation d k ifM (doesFileExist file) ( do@@ -170,7 +177,7 @@ , return False ) #else-retrieveCheap _ _ _ _ = return False+retrieveCheap _ _ _ _ _ = return False #endif remove :: FilePath -> Remover
@@ -56,7 +56,7 @@ , name = Git.repoDescribe r , storeKey = storeKeyDummy , retrieveKeyFile = retreiveKeyFileDummy- , retrieveKeyFileCheap = \_ _ -> return False+ , retrieveKeyFileCheap = \_ _ _ -> return False , removeKey = removeKeyDummy , checkPresent = checkPresentDummy , checkPresentCheap = False
@@ -108,7 +108,7 @@ , name = Git.repoDescribe r , storeKey = storeKeyDummy , retrieveKeyFile = retreiveKeyFileDummy- , retrieveKeyFileCheap = \_ _ -> return False+ , retrieveKeyFileCheap = \_ _ _ -> return False , removeKey = removeKeyDummy , checkPresent = checkPresentDummy , checkPresentCheap = repoCheap r
@@ -52,6 +52,7 @@ import Annex.Path import Creds import Annex.CatFile+import Messages.Progress import Control.Concurrent import Control.Concurrent.MSampleVar@@ -355,9 +356,11 @@ {- Tries to copy a key's content from a remote's annex to a file. -} copyFromRemote :: Remote -> Key -> AssociatedFile -> FilePath -> MeterUpdate -> Annex Bool-copyFromRemote r key file dest _p = copyFromRemote' r key file dest-copyFromRemote' :: Remote -> Key -> AssociatedFile -> FilePath -> Annex Bool-copyFromRemote' r key file dest+copyFromRemote r key file dest p = parallelMetered (Just p) key file $+ copyFromRemote' r key file dest++copyFromRemote' :: Remote -> Key -> AssociatedFile -> FilePath -> MeterUpdate -> Annex Bool+copyFromRemote' r key file dest meterupdate | not $ Git.repoIsUrl (repo r) = guardUsable (repo r) (return False) $ do params <- Ssh.rsyncParams r Download u <- getUUID@@ -383,7 +386,7 @@ let go = copier #endif runTransfer (Transfer Download u key)- file noRetry go+ file noRetry noObserver go <&&> checksuccess | Git.repoIsSsh (repo r) = feedprogressback $ \feeder -> do direct <- isDirect@@ -435,7 +438,9 @@ send bytes forever $ send =<< readSV v- let feeder = writeSV v . fromBytesProcessed+ let feeder = \n -> do+ meterupdate n+ writeSV v (fromBytesProcessed n) let cleanup = do void $ tryIO $ killThread tid tryNonAsync $@@ -443,9 +448,9 @@ =<< tryTakeMVar pidv bracketIO noop (const cleanup) (const $ a feeder) -copyFromRemoteCheap :: Remote -> Key -> FilePath -> Annex Bool+copyFromRemoteCheap :: Remote -> Key -> AssociatedFile -> FilePath -> Annex Bool #ifndef mingw32_HOST_OS-copyFromRemoteCheap r key file+copyFromRemoteCheap r key af file | not $ Git.repoIsUrl (repo r) = guardUsable (repo r) (return False) $ liftIO $ do loc <- gitAnnexLocation key (repo r) $ fromJust $ remoteGitConfig $ gitconfig r@@ -459,17 +464,21 @@ ) | Git.repoIsSsh (repo r) = ifM (Annex.Content.preseedTmp key file)- ( copyFromRemote' r key Nothing file+ ( parallelMetered Nothing key af $+ copyFromRemote' r key af file , return False ) | otherwise = return False #else-copyFromRemoteCheap _ _ _ = return False+copyFromRemoteCheap _ _ _ _ = return False #endif {- Tries to copy a key's content to a remote's annex. -} copyToRemote :: Remote -> Key -> AssociatedFile -> MeterUpdate -> Annex Bool-copyToRemote r key file p+copyToRemote r key file p = parallelMetered (Just p) key file $ copyToRemote' r key file++copyToRemote' :: Remote -> Key -> AssociatedFile -> MeterUpdate -> Annex Bool+copyToRemote' r key file p | not $ Git.repoIsUrl (repo r) = guardUsable (repo r) (return False) $ commitOnCleanup r $ copylocal =<< Annex.Content.prepSendAnnex key@@ -493,7 +502,7 @@ ( return True , do ensureInitialized- runTransfer (Transfer Download u key) file noRetry $ const $+ runTransfer (Transfer Download u key) file noRetry noObserver $ const $ Annex.Content.saveState True `after` Annex.Content.getViaTmpChecked (liftIO checksuccessio) key (\d -> rsyncOrCopyFile params object d p)
@@ -162,8 +162,8 @@ showLongNote "Recommend you wait up to 4 hours, and then run this command again." return ok -retrieveCheap :: Remote -> Key -> FilePath -> Annex Bool-retrieveCheap _ _ _ = return False+retrieveCheap :: Remote -> Key -> AssociatedFile -> FilePath -> Annex Bool+retrieveCheap _ _ _ _ = return False remove :: Remote -> Remover remove r k = glacierAction r
@@ -16,7 +16,7 @@ import Types.CleanupActions import qualified Annex import Annex.LockFile-import Utility.LockFile+import Utility.LockPool #ifndef mingw32_HOST_OS import Annex.Perms #endif@@ -36,7 +36,7 @@ r' = r { storeKey = \k f p -> wrapper $ storeKey r k f p , retrieveKeyFile = \k f d p -> wrapper $ retrieveKeyFile r k f d p- , retrieveKeyFileCheap = \k f -> wrapper $ retrieveKeyFileCheap r k f+ , retrieveKeyFileCheap = \k af f -> wrapper $ retrieveKeyFileCheap r k af f , removeKey = wrapper . removeKey r , checkPresent = wrapper . checkPresent r }@@ -47,7 +47,7 @@ runHooks r starthook stophook a = do dir <- fromRepo gitAnnexRemotesDir let lck = dir </> remoteid ++ ".lck"- whenM (notElem lck . M.keys <$> getLockPool) $ do+ whenM (notElem lck . M.keys <$> getLockCache) $ do liftIO $ createDirectoryIfMissing True dir firstrun lck a@@ -62,7 +62,7 @@ -- of it from running the stophook. If another -- instance is shutting down right now, this -- will block waiting for its exclusive lock to clear.- lockFileShared lck+ lockFileCached lck -- The starthook is run even if some other git-annex -- is already running, and ran it before.
@@ -157,10 +157,10 @@ specialRemote' cfg c preparestorer prepareretriever prepareremover preparecheckpresent baser = encr where encr = baser- { storeKey = \k _f p -> cip >>= storeKeyGen k p- , retrieveKeyFile = \k _f d p -> cip >>= retrieveKeyFileGen k d p- , retrieveKeyFileCheap = \k d -> cip >>= maybe- (retrieveKeyFileCheap baser k d)+ { storeKey = \k f p -> cip >>= storeKeyGen k f p+ , retrieveKeyFile = \k f d p -> cip >>= retrieveKeyFileGen k f d p+ , retrieveKeyFileCheap = \k f d -> cip >>= maybe+ (retrieveKeyFileCheap baser k f d) -- retrieval of encrypted keys is never cheap (\_ -> return False) , removeKey = \k -> cip >>= removeKeyGen k@@ -182,10 +182,10 @@ safely a = catchNonAsync a (\e -> warning (show e) >> return False) -- chunk, then encrypt, then feed to the storer- storeKeyGen k p enc = safely $ preparestorer k $ safely . go+ storeKeyGen k f p enc = safely $ preparestorer k $ safely . go where go (Just storer) = sendAnnex k rollback $ \src ->- displayprogress p k $ \p' ->+ displayprogress p k f $ \p' -> storeChunks (uuid baser) chunkconfig k src p' (storechunk enc storer) (checkPresent baser)@@ -200,10 +200,10 @@ storer (enck k) (ByteContent encb) p -- call retriever to get chunks; decrypt them; stream to dest file- retrieveKeyFileGen k dest p enc =+ retrieveKeyFileGen k f dest p enc = safely $ prepareretriever k $ safely . go where- go (Just retriever) = displayprogress p k $ \p' ->+ go (Just retriever) = displayprogress p k f $ \p' -> retrieveChunks retriever (uuid baser) chunkconfig enck k dest p' (sink dest enc) go Nothing = return False@@ -223,8 +223,8 @@ chunkconfig = chunkConfig cfg - displayprogress p k a- | displayProgress cfg = metered (Just p) k a+ displayprogress p k f a+ | displayProgress cfg = metered (Just p) k f a | otherwise = a p {- Sink callback for retrieveChunks. Stores the file content into the
@@ -130,8 +130,8 @@ unlessM (runHook h "retrieve" k (Just d) $ return True) $ error "failed to retrieve content" -retrieveCheap :: HookName -> Key -> FilePath -> Annex Bool-retrieveCheap _ _ _ = return False+retrieveCheap :: HookName -> Key -> AssociatedFile -> FilePath -> Annex Bool+retrieveCheap _ _ _ _ = return False remove :: HookName -> Remover remove h k = runHook h "remove" k Nothing $ return True
@@ -191,8 +191,8 @@ unlessM (rsyncRetrieve o k f (Just p)) $ error "rsync failed" -retrieveCheap :: RsyncOpts -> Key -> FilePath -> Annex Bool-retrieveCheap o k f = ifM (preseedTmp k f) ( rsyncRetrieve o k f Nothing , return False )+retrieveCheap :: RsyncOpts -> Key -> AssociatedFile -> FilePath -> Annex Bool+retrieveCheap o k _af f = ifM (preseedTmp k f) ( rsyncRetrieve o k f Nothing , return False ) remove :: RsyncOpts -> Remover remove o k = do
@@ -238,8 +238,8 @@ S.hPut fh bs sinkprogressfile fh meterupdate sofar' -retrieveCheap :: Key -> FilePath -> Annex Bool-retrieveCheap _ _ = return False+retrieveCheap :: Key -> AssociatedFile -> FilePath -> Annex Bool+retrieveCheap _ _ _ = return False {- Internet Archive doesn't easily allow removing content. - While it may remove the file, there are generally other files
@@ -70,7 +70,7 @@ , name = Git.repoDescribe r , storeKey = store u hdl , retrieveKeyFile = retrieve u hdl- , retrieveKeyFileCheap = \_ _ -> return False+ , retrieveKeyFileCheap = \_ _ _ -> return False , removeKey = remove , checkPresent = checkKey u hdl , checkPresentCheap = False
@@ -90,8 +90,8 @@ #endif _ -> downloadUrl [u'] dest -downloadKeyCheap :: Key -> FilePath -> Annex Bool-downloadKeyCheap _ _ = return False+downloadKeyCheap :: Key -> AssociatedFile -> FilePath -> Annex Bool+downloadKeyCheap _ _ _ = return False uploadKey :: Key -> AssociatedFile -> MeterUpdate -> Annex Bool uploadKey _ _ _ = do
@@ -116,8 +116,8 @@ maybe noop (void . mkColRecursive) (locationParent dest) moveDAV baseurl tmp dest -retrieveCheap :: Key -> FilePath -> Annex Bool-retrieveCheap _ _ = return False+retrieveCheap :: Key -> AssociatedFile -> FilePath -> Annex Bool+retrieveCheap _ _ _ = return False retrieve :: ChunkConfig -> Maybe DavHandle -> Retriever retrieve _ Nothing = error "unable to connect"
@@ -16,12 +16,14 @@ import qualified Git import qualified Git.Config import qualified Git.Construct+import Git.SharedRepository import Utility.DataUnits import Config.Cost import Types.Distribution import Types.Availability import Types.NumCopies import Types.Difference+import Types.RefSpec import Utility.HumanTime {- Main git-annex settings. Each setting corresponds to a git-config key@@ -57,8 +59,10 @@ , annexStartupScan :: Bool , annexHardLink :: Bool , coreSymlinks :: Bool+ , coreSharedRepository :: SharedRepository , gcryptId :: Maybe String , annexDifferences :: Differences+ , annexUsedRefSpec :: Maybe RefSpec } extractGitConfig :: Git.Repo -> GitConfig@@ -95,8 +99,11 @@ , annexStartupScan = getbool (annex "startupscan") True , annexHardLink = getbool (annex "hardlink") False , coreSymlinks = getbool "core.symlinks" True+ , coreSharedRepository = getSharedRepository r , gcryptId = getmaybe "core.gcrypt-id" , annexDifferences = getDifferences r+ , annexUsedRefSpec = either (const Nothing) Just . parseRefSpec + =<< getmaybe (annex "used-refspec") } where getbool k d = fromMaybe d $ getmaybebool k
@@ -0,0 +1,16 @@+{- git-annex lock cache data types+ - + - Copyright 2014 Joey Hess <id@joeyh.name>+ -+ - Licensed under the GNU GPL version 3 or higher.+ -}++module Types.LockCache (+ LockCache,+ LockHandle+) where++import qualified Data.Map as M+import Utility.LockPool++type LockCache = M.Map FilePath LockHandle
@@ -1,16 +0,0 @@-{- git-annex lock pool data types- - - - Copyright 2014 Joey Hess <id@joeyh.name>- -- - Licensed under the GNU GPL version 3 or higher.- -}--module Types.LockPool (- LockPool,- LockHandle-) where--import qualified Data.Map as M-import Utility.LockFile--type LockPool = M.Map FilePath LockHandle
@@ -9,7 +9,7 @@ import Data.Default -data OutputType = NormalOutput | QuietOutput | ProgressOutput | JSONOutput+data OutputType = NormalOutput | QuietOutput | ParallelOutput Int | JSONOutput data SideActionBlock = NoBlock | StartBlock | InBlock deriving (Eq)
@@ -0,0 +1,44 @@+{- This is not the same as git's fetch/push refspecs.+ - + - Copyright 2015 Joey Hess <id@joeyh.name>+ -+ - Licensed under the GNU GPL version 3 or higher.+ -}++module Types.RefSpec where++import Common+import Utility.Glob+import Git.Types++import Data.Either++type RefSpec = [RefSpecPart]++data RefSpecPart = AddRef Ref | AddMatching Glob | RemoveMatching Glob++allRefSpec :: RefSpec+allRefSpec = [AddMatching $ compileGlob "*" CaseSensative]++parseRefSpec :: String -> Either String RefSpec+parseRefSpec v = case partitionEithers (map mk $ split ":" v) of+ ([],refspec) -> Right refspec+ (e:_,_) -> Left e+ where+ mk ('+':s)+ | any (`elem` s) "*?" =+ Right $ AddMatching $ compileGlob s CaseSensative+ | otherwise = Right $ AddRef $ Ref s+ mk ('-':s) = Right $ RemoveMatching $ compileGlob s CaseSensative+ mk s = Left $ "bad refspec item \"" ++ s ++ "\" (expected + or - prefix)"++applyRefSpec :: RefSpec -> [Ref] -> [Ref]+applyRefSpec refspec rs = go [] refspec+ where+ go c [] = reverse c+ go c (AddRef r : rest) = go (r:c) rest+ go c (AddMatching g : rest) =+ let add = filter (matchGlob g . fromRef) rs+ in go (add ++ c) rest+ go c (RemoveMatching g : rest) = + go (filter (not . matchGlob g . fromRef) c) rest
@@ -68,7 +68,7 @@ retrieveKeyFile :: Key -> AssociatedFile -> FilePath -> MeterUpdate -> a Bool, -- Retrieves a key's contents to a tmp file, if it can be done cheaply. -- It's ok to create a symlink or hardlink.- retrieveKeyFileCheap :: Key -> FilePath -> a Bool,+ retrieveKeyFileCheap :: Key -> AssociatedFile -> FilePath -> a Bool, -- removes a key's contents (succeeds if the contents are not present) removeKey :: Key -> a Bool, -- Checks if a key is present in the remote.
@@ -22,15 +22,12 @@ {- Applies a conversion function to a file's mode. -} modifyFileMode :: FilePath -> (FileMode -> FileMode) -> IO ()-modifyFileMode f convert = void $ modifyFileMode' f convert-modifyFileMode' :: FilePath -> (FileMode -> FileMode) -> IO FileMode-modifyFileMode' f convert = do+modifyFileMode f convert = do s <- getFileStatus f let old = fileMode s let new = convert old when (new /= old) $ setFileMode f new- return old {- Adds the specified FileModes to the input mode, leaving the rest - unchanged. -}@@ -40,14 +37,6 @@ {- Removes the specified FileModes from the input mode. -} removeModes :: [FileMode] -> FileMode -> FileMode removeModes ms m = m `intersectFileModes` complement (combineModes ms)--{- Runs an action after changing a file's mode, then restores the old mode. -}-withModifiedFileMode :: FilePath -> (FileMode -> FileMode) -> IO a -> IO a-withModifiedFileMode file convert a = bracket setup cleanup go- where- setup = modifyFileMode' file convert- cleanup oldmode = modifyFileMode file (const oldmode)- go _ = a writeModes :: [FileMode] writeModes = [ownerWriteMode, groupWriteMode, otherWriteMode]
@@ -4,6 +4,9 @@ - This module does *not* attempt to be a portability shim, it just exposes - the native locking of the OS. -+ - Posix fcntl locks have some gotchas. So, consider using+ - Utility.LockPool instead of using this module directly.+ - - Copyright 2014 Joey Hess <id@joeyh.name> - - License: BSD-2-clause
@@ -10,12 +10,11 @@ lockShared, lockExclusive, tryLockExclusive,- createLockFile,- openExistingLockFile,- isLocked, checkLocked, getLockStatus,+ LockStatus(..), dropLock,+ checkSaneLock, ) where import Utility.Exception@@ -56,15 +55,6 @@ 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@@ -72,28 +62,45 @@ 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'+data LockStatus = StatusUnLocked | StatusLockedBy ProcessID | StatusNoLockFile+ deriving (Eq) -getLockStatus' :: LockFile -> IO (Maybe (Maybe (ProcessID, FileLock)))+getLockStatus :: LockFile -> IO LockStatus+getLockStatus lockfile = do+ v <- getLockStatus' lockfile+ return $ case v of+ Nothing -> StatusNoLockFile+ Just Nothing -> StatusUnLocked+ Just (Just pid) -> StatusLockedBy pid++getLockStatus' :: LockFile -> IO (Maybe (Maybe ProcessID)) 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)+ v <- getLock h (ReadLock, AbsoluteSeek, 0, 0) closeFd h- return (Just ret)+ return (Just (fmap fst v)) dropLock :: LockHandle -> IO () dropLock (LockHandle fd) = closeFd fd++-- Checks that the lock file still exists, and is the same file that was+-- locked to get the LockHandle.+--+-- This check is useful if the lock file might get deleted by something+-- else.+checkSaneLock :: LockFile -> LockHandle -> IO Bool+checkSaneLock lockfile (LockHandle fd) =+ go =<< catchMaybeIO (getFileStatus lockfile)+ where+ go Nothing = return False+ go (Just st) = do+ fdst <- getFdStatus fd+ return $ deviceID fdst == deviceID st && fileID fdst == fileID st
@@ -22,7 +22,7 @@ type LockHandle = HANDLE {- Tries to lock a file with a shared lock, which allows other processes to- - also lock it shared. Fails is the file is exclusively locked. -}+ - also lock it shared. Fails if the file is exclusively locked. -} lockShared :: LockFile -> IO (Maybe LockHandle) lockShared = openLock fILE_SHARE_READ @@ -30,8 +30,8 @@ - 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. -}+ - read or write by any other process. So for advisory locking of a file's+ - content, a separate LockFile should be used. -} lockExclusive :: LockFile -> IO (Maybe LockHandle) lockExclusive = openLock fILE_SHARE_NONE @@ -47,7 +47,7 @@ - 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.+ - is not inherited by any child process. -} openLock :: ShareMode -> LockFile -> IO (Maybe LockHandle) openLock sharemode f = do@@ -65,7 +65,7 @@ {- If the initial lock fails, this is a BUSY wait, and does not - guarentee FIFO order of waiters. In other news, Windows is a POS. -}-waitToLock :: IO (Maybe LockHandle) -> IO LockHandle+waitToLock :: IO (Maybe lockhandle) -> IO lockhandle waitToLock locker = takelock where takelock = go =<< locker
@@ -0,0 +1,36 @@+{- Lock pool.+ -+ - This avoids a problem with unix fcntl locks: They are not composition-safe.+ -+ - For example, if one thread is holding a lock, and another thread opens the+ - lock file (to attempt to take or check the lock), and then closes it,+ - the lock will be released, despite the first thread still having the+ - lockfile open.+ -+ - Or, if a process is already holding an exclusive lock on a file, an+ - re-opens it and tries to take another exclusive lock, it won't block+ - on the first lock.+ -+ - To avoid these problems, this implements a lock pool. This keeps track+ - of which lock files are being used by the process, and avoids+ - re-opening them. Instead, if a lockfile is in use by the current+ - process, STM is used to handle further concurrent uses of that lock+ - file.+ -+ - Note that, like Utility.LockFile, this does *not* attempt to be a+ - portability shim; the native locking of the OS is used.+ -+ - Copyright 2015 Joey Hess <id@joeyh.name>+ -+ - License: BSD-2-clause+ -}++{-# LANGUAGE CPP #-}++module Utility.LockPool (module X) where++#ifndef mingw32_HOST_OS+import Utility.LockPool.Posix as X+#else+import Utility.LockPool.Windows as X+#endif
@@ -0,0 +1,52 @@+{- Handles for lock pools.+ -+ - Copyright 2015 Joey Hess <id@joeyh.name>+ -+ - License: BSD-2-clause+ -}++{-# LANGUAGE CPP #-}++module Utility.LockPool.LockHandle where++import qualified Utility.LockPool.STM as P+#ifndef mingw32_HOST_OS+import qualified Utility.LockFile.Posix as F+#else+import qualified Utility.LockFile.Windows as F+#endif++import Control.Concurrent.STM+import Control.Exception++data LockHandle = LockHandle P.LockHandle F.LockHandle++dropLock :: LockHandle -> IO ()+dropLock (LockHandle ph fh) = P.releaseLock ph (F.dropLock fh)++-- Take a lock, by first updating the lock pool, and then taking the file+-- lock. If taking the file lock fails for any reason, take care to+-- release the lock in the lock pool.+makeLockHandle :: STM P.LockHandle -> IO F.LockHandle -> IO LockHandle+makeLockHandle pa fa = bracketOnError setup cleanup go+ where+ setup = atomically pa+ cleanup ph = P.releaseLock ph (return ())+ go ph = do+ fh <- fa+ return $ LockHandle ph fh++tryMakeLockHandle :: STM (Maybe P.LockHandle) -> IO (Maybe F.LockHandle) -> IO (Maybe LockHandle)+tryMakeLockHandle pa fa = bracketOnError setup cleanup go+ where+ setup = atomically pa+ cleanup Nothing = return ()+ cleanup (Just ph) = P.releaseLock ph (return ())+ go Nothing = return Nothing+ go (Just ph) = do+ mfh <- fa+ case mfh of+ Nothing -> do+ cleanup (Just ph)+ return Nothing+ Just fh -> return $ Just $ LockHandle ph fh
@@ -0,0 +1,61 @@+{- Posix lock files, using lock pools.+ -+ - Copyright 2015 Joey Hess <id@joeyh.name>+ -+ - License: BSD-2-clause+ -}++module Utility.LockPool.Posix (+ LockHandle,+ lockShared,+ lockExclusive,+ tryLockExclusive,+ checkLocked,+ getLockStatus,+ LockStatus(..),+ dropLock,+ checkSaneLock,+) where++import qualified Utility.LockFile.Posix as F+import Utility.LockFile.Posix (LockStatus(..))+import qualified Utility.LockPool.STM as P+import Utility.LockPool.STM (LockFile, LockMode(..))+import Utility.LockPool.LockHandle++import System.IO+import System.Posix+import Data.Maybe+import Control.Applicative+import Prelude++-- Takes a shared lock, blocking until the lock is available.+lockShared :: Maybe FileMode -> LockFile -> IO LockHandle+lockShared mode file = makeLockHandle+ (P.waitTakeLock P.lockPool file LockShared)+ (F.lockShared mode file)++lockExclusive :: Maybe FileMode -> LockFile -> IO LockHandle+lockExclusive mode file = makeLockHandle+ (P.waitTakeLock P.lockPool file LockExclusive)+ (F.lockExclusive mode file)++tryLockExclusive :: Maybe FileMode -> LockFile -> IO (Maybe LockHandle)+tryLockExclusive mode file = tryMakeLockHandle+ (P.tryTakeLock P.lockPool file LockExclusive)+ (F.tryLockExclusive mode file)++-- 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 file = P.getLockStatus P.lockPool file+ (pure (Just True))+ (F.checkLocked file)++getLockStatus :: LockFile -> IO LockStatus+getLockStatus file = P.getLockStatus P.lockPool file+ (StatusLockedBy <$> getProcessID)+ (F.getLockStatus file)++checkSaneLock :: LockFile -> LockHandle -> IO Bool+checkSaneLock lockfile (LockHandle _ fh) = F.checkSaneLock lockfile fh
@@ -0,0 +1,122 @@+{- STM implementation of lock pools.+ -+ - Copyright 2015 Joey Hess <id@joeyh.name>+ -+ - License: BSD-2-clause+ -}++module Utility.LockPool.STM (+ LockPool,+ lockPool,+ LockFile,+ LockMode(..),+ LockHandle,+ waitTakeLock,+ tryTakeLock,+ getLockStatus,+ releaseLock,+) where++import System.IO.Unsafe (unsafePerformIO)+import qualified Data.Map.Strict as M+import Control.Concurrent.STM+import Control.Applicative+import Control.Exception+import Control.Monad++type LockFile = FilePath++data LockMode = LockExclusive | LockShared+ deriving (Eq)++-- This TMVar is full when the handle is open, and is emptied when it's+-- closed.+type LockHandle = TMVar (LockPool, LockFile)++type LockCount = Integer++data LockStatus = LockStatus LockMode LockCount++-- This TMVar is normally kept full.+type LockPool = TMVar (M.Map LockFile LockStatus)++-- A shared global variable for the lockPool. Avoids callers needing to+-- maintain state for this implementation detail.+lockPool :: LockPool+lockPool = unsafePerformIO (newTMVarIO M.empty)+{-# NOINLINE lockPool #-}++-- Updates the LockPool, blocking as necessary if another thread is holding+-- a conflicting lock.+-- +-- Note that when a shared lock is held, an exclusive lock will block.+-- While that blocking is happening, another call to this function to take+-- the same shared lock should not be blocked on the exclusive lock.+-- Keeping the whole Map in a TMVar accomplishes this, at the expense of+-- sometimes retrying after unrelated changes in the map.+waitTakeLock :: LockPool -> LockFile -> LockMode -> STM LockHandle+waitTakeLock pool file mode = do+ m <- takeTMVar pool+ v <- case M.lookup file m of+ Just (LockStatus mode' n)+ | mode == LockShared && mode' == LockShared ->+ return $ LockStatus mode (succ n)+ | n > 0 -> retry -- wait for lock+ _ -> return $ LockStatus mode 1+ putTMVar pool (M.insert file v m)+ newTMVar (pool, file)++-- Avoids blocking if another thread is holding a conflicting lock.+tryTakeLock :: LockPool -> LockFile -> LockMode -> STM (Maybe LockHandle)+tryTakeLock pool file mode =+ (Just <$> waitTakeLock pool file mode)+ `orElse`+ return Nothing++-- Checks if a lock is being held. If it's held by the current process,+-- runs the getdefault action; otherwise runs the checker action.+--+-- Note that the lock pool is left empty while the checker action is run.+-- This allows checker actions that open/close files, and so would be in+-- danger of conflicting with locks created at the same time this is+-- running. With the lock pool empty, anything that attempts+-- to take a lock will block, avoiding that race.+getLockStatus :: LockPool -> LockFile -> IO v -> IO v -> IO v+getLockStatus pool file getdefault checker = do+ v <- atomically $ do+ m <- takeTMVar pool+ let threadlocked = case M.lookup file m of+ Just (LockStatus _ n) | n > 0 -> True+ _ -> False+ if threadlocked+ then do+ putTMVar pool m+ return Nothing+ else return $ Just $ atomically $ putTMVar pool m+ case v of+ Nothing -> getdefault+ Just restore -> bracket_ (return ()) restore checker++-- Only runs action to close underlying lock file when this is the last+-- user of the lock, and when the handle has not already been closed.+--+-- Note that the lock pool is left empty while the closelockfile action+-- is run, to avoid race with another thread trying to open the same lock+-- file.+releaseLock :: LockHandle -> IO () -> IO ()+releaseLock h closelockfile = go =<< atomically (tryTakeTMVar h)+ where+ go (Just (pool, file)) = do+ (m, unused) <- atomically $ do+ m <- takeTMVar pool+ return $ case M.lookup file m of+ Just (LockStatus mode n)+ | n == 1 -> (M.delete file m, True)+ | otherwise ->+ (M.insert file (LockStatus mode (pred n)) m, False)+ Nothing -> (m, True)+ when unused+ closelockfile+ atomically $ putTMVar pool m+ -- The LockHandle was already closed.+ go Nothing = return ()
@@ -0,0 +1,49 @@+{- Windows lock files, using lock pools.+ -+ - Copyright 2015 Joey Hess <id@joeyh.name>+ -+ - License: BSD-2-clause+ -}++module Utility.LockPool.Windows (+ LockHandle,+ lockShared,+ lockExclusive,+ dropLock,+ waitToLock,+) where++import qualified Utility.LockFile.Windows as F+import qualified Utility.LockPool.STM as P+import Utility.LockPool.LockHandle+import Utility.LockPool.STM (LockPool, LockFile, LockMode(..))+import Utility.Monad++import Control.Concurrent.STM+import System.IO+import Data.Maybe+import Control.Applicative+import Prelude++{- Tries to lock a file with a shared lock, which allows other processes to+ - also lock it shared. Fails if the file is exclusively locked. -}+lockShared :: LockFile -> IO (Maybe LockHandle)+lockShared file = tryMakeLockHandle+ (P.tryTakeLock P.lockPool file LockShared)+ (F.lockShared file)++{- Tries to take an exclusive lock on a file. Fails if another process has+ - a shared or exclusive lock.+ -+ - Note that exclusive locking also prevents the file from being opened for+ - read or write by any other process. So for advisory locking of a file's+ - content, a separate LockFile should be used. -}+lockExclusive :: LockFile -> IO (Maybe LockHandle)+lockExclusive file = tryMakeLockHandle+ (P.tryTakeLock P.lockPool file LockExclusive)+ (F.lockExclusive file)++{- If the initial lock fails, this is a BUSY wait, and does not+ - guarentee FIFO order of waiters. In other news, Windows is a POS. -}+waitToLock :: IO (Maybe lockhandle) -> IO lockhandle+waitToLock = F.waitToLock
@@ -1,136 +0,0 @@-From c619362c3cedab65adcfdf7ac9dc3c014479cc12 Mon Sep 17 00:00:00 2001-From: Yaroslav Halchenko <debian@onerussian.com>-Date: Mon, 11 May 2015 09:45:33 +0100-Subject: [PATCH] ENH: make debianstandalone{,-dsc} rules--Moved rules out of debian/rules and avoided need for patching it for-standalone builds----- Makefile | 19 +++++++++++++++++++- debian/patches/standalone-build | 24 +++---------------------- debian/rules | 26 +++++++++++++++++---------- 3 files changed, 39 insertions(+), 30 deletions(-)--diff --git a/Makefile b/Makefile-index 2bc43ed..1a94684 100644---- a/Makefile-+++ b/Makefile-@@ -140,6 +140,25 @@ linuxstandalone-nobuild: Build/Standalone Build/LinuxMkLibs- cd tmp/git-annex.linux && find . -type l >> git-annex.MANIFEST- cd tmp && tar czf git-annex-standalone-$(shell dpkg --print-architecture).tar.gz git-annex.linux- -+# Run this target to build git-annex-standalone*.deb-+debianstandalone: dpkg-buildpackage-F-+# Run this target to build git-annex-standalone*.dsc-+debianstandalone-dsc: dpkg-buildpackage-S-+-+prep-standalone:-+ $(MAKE) undo-standalone-+ QUILT_PATCHES=debian/patches QUILT_SERIES=series.standalone-build quilt push -a-+ debian/create-standalone-changelog-+-+undo-standalone:-+ test -e .git-+ git checkout debian/changelog-+ quilt pop -a || true-+-+dpkg-buildpackage%: prep-standalone-+ umask 022; dpkg-buildpackage -rfakeroot $*-+ $(MAKE) undo-standalone-+- OSXAPP_DEST=tmp/build-dmg/git-annex.app- OSXAPP_BASE=$(OSXAPP_DEST)/Contents/MacOS/bundle- osxapp: Build/Standalone Build/OSXMkLibs-diff --git a/debian/patches/standalone-build b/debian/patches/standalone-build-index 0936d10..51bfa2f 100644---- a/debian/patches/standalone-build-+++ b/debian/patches/standalone-build-@@ -6,7 +6,7 @@ Last-Update: 2015-04-20- - --- a/debian/control- +++ b/debian/control--@@ -89,15 +89,14 @@ Vcs-Git: git://git.kitenet.net/git-annex-+@@ -87,15 +87,14 @@ Vcs-Git: git://git.kitenet.net/git-annex- Homepage: http://git-annex.branchable.com/- XS-Testsuite: autopkgtest- -@@ -28,7 +28,7 @@ Last-Update: 2015-04-20- Recommends: - lsof,- gnupg,--@@ -112,7 +111,7 @@ Suggests:-+@@ -110,7 +109,7 @@ Suggests:- bup,- tahoe-lafs,- libnss-mdns,-@@ -37,7 +37,7 @@ Last-Update: 2015-04-20- git-annex allows managing files with git, without checking the file- contents into git. While that may seem paradoxical, it is useful when- dealing with files larger than git can currently easily handle, whether due--@@ -130,3 +129,7 @@ Description: manage files with git, with-+@@ -128,3 +127,7 @@ Description: manage files with git, with- noticing when files are changed, and automatically committing them- to git and transferring them to other computers. The git-annex webapp- makes it easy to set up and use git-annex this way.-@@ -57,21 +57,3 @@ Last-Update: 2015-04-20- +++ b/debian/manpages- @@ -0,0 +1 @@- +debian/git-annex-standalone/usr/lib/git-annex.linux/usr/share/man/man1/git-annex*----- a/debian/rules--+++ b/debian/rules--@@ -8,6 +8,15 @@ export RELEASE_BUILD=1-- %:-- dh $@-- --+override_dh_auto_build:--+ make linuxstandalone--+--+override_dh_auto_install:--+ : # nothing to do, we just need to copy the beast, as instructed in debian/install--+--+override_dh_fixperms:--+ dh_fixperms -Xld-linux--+-- # Run this target to build git-annex-standalone.deb-- build-standalone:-- test -e .git-diff --git a/debian/rules b/debian/rules-index 26f2448..927c1c9 100755---- a/debian/rules-+++ b/debian/rules-@@ -2,18 +2,26 @@- - export CABAL=debian/cabal-wrapper- -+STANDALONE_BUILD=$(shell grep -qe '^Package: git-annex-standalone' debian/control \-+ && echo 1 || echo 0)-+- # Do use the changelog's version number, rather than making one up.- export RELEASE_BUILD=1- - %:- dh $@- --# Run this target to build git-annex-standalone.deb--build-standalone:-- test -e .git-- git checkout debian/changelog-- quilt pop -a || true-- QUILT_PATCHES=debian/patches QUILT_SERIES=series.standalone-build quilt push -a-- debian/create-standalone-changelog-- dpkg-buildpackage -rfakeroot-- quilt pop -a-+-+# Standalone build logic/helpers-+ifeq ($(STANDALONE_BUILD),1)-+-+override_dh_auto_build:-+ make linuxstandalone-+-+override_dh_auto_install:-+ : # nothing to do, we just need to copy the beast, as instructed in debian/install-+-+override_dh_fixperms:-+ dh_fixperms -Xld-linux-+-+endif
@@ -1,3 +1,36 @@+git-annex (5.20150522) unstable; urgency=medium++ * import: Refuse to import files that are within the work tree, as that+ does not make sense and could cause data loss.+ * drop: Now supports --all, --unused, and --key.+ * drop: Now defaults to --all when run in a bare repository.+ (Previously, did nothing when run in a bare repository.)+ * get, move, copy, mirror: Concurrent transfers are now supported!+ For example: git-annex get -J10+ However, progress bars are not yet displayed for concurrent transfers,+ pending an updated version of the ascii-progress library.+ * --quiet now makes progress output by rsync, wget, etc be quiet too.+ * Take space that will be used by other running downloads into account when+ checking annex.diskreserve.+ * Avoid accumulating transfer failure log files unless the assistant is+ being used.+ * Fix an unlikely race that could result in two transfers of the same key+ running at once.+ * Stale transfer lock and info files will be cleaned up automatically+ when get/unused/info commands are run.+ * unused: Add --used-refspec option and annex.used-refspec, which can+ specify a set of refs to consider used, rather than the default of+ considering all refs used.+ * webapp: Fix zombie xdg-open process left when opening file browser.+ Closes: #785498+ * Safer posix fctnl locking implementation, using lock pools and STM.+ * Build documentation with TZ=UTC for reproducible builds. See #785736.+ * OSX: Corrected the location of trustedkeys.gpg, so the built-in+ upgrade code will find it. Fixes OSX upgrade going forward, but+ older versions won't upgrade themselves due to this problem.++ -- Joey Hess <id@joeyh.name> Fri, 22 May 2015 14:20:18 -0400+ git-annex (5.20150508.1) unstable; urgency=medium * Now builds cleanly using ghc 7.10 (as well as ghc back to 7.6).
@@ -38,8 +38,7 @@ libghc-yesod-form-dev (>= 1.3.15) [i386 amd64 armel armhf kfreebsd-i386 kfreebsd-amd64 powerpc ppc64el], libghc-yesod-static-dev (>= 1.2.4) [i386 amd64 armel armhf kfreebsd-i386 kfreebsd-amd64 powerpc ppc64el], libghc-yesod-default-dev (>= 1.2.0) [i386 amd64 armel armhf kfreebsd-amd64 powerpc ppc64el],- libghc-hamlet-dev [i386 amd64 armel armhf kfreebsd-i386 kfreebsd-amd64 powerpc ppc64el],- libghc-shakespeare-dev [i386 amd64 armel armhf kfreebsd-i386 kfreebsd-amd64 powerpc ppc64el],+ libghc-shakespeare-dev (>= 2.0.0) [i386 amd64 armel armhf kfreebsd-i386 kfreebsd-amd64 powerpc ppc64el], libghc-clientsession-dev [i386 amd64 armel armhf kfreebsd-i386 kfreebsd-amd64 powerpc ppc64el], libghc-warp-dev (>= 3.0.0.5) [i386 amd64 armel armhf kfreebsd-i386 kfreebsd-amd64 powerpc ppc64el], libghc-warp-tls-dev [i386 amd64 armel armhf kfreebsd-i386 kfreebsd-amd64 powerpc ppc64el],
@@ -104,7 +104,7 @@ Files: static/*/bootstrap* static/*/glyphicons-halflings* Copyright: 2012-2014 Twitter, Inc.-License: MIT+License: MIT-twitter Copyright (c) 2011-2014 Twitter, Inc . Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -0,0 +1,16 @@+[[!comment format=mdwn+ username="http://yarikoptic.myopenid.com/"+ nickname="site-myopenid"+ subject="comment 10"+ date="2013-05-24T03:11:50Z"+ content="""+>you said before the error was \"Read-only file system\". Now you're saying it's \"Cross-device link\". I'm slightly confused.++;-) Sorry for confusion, here are the details:++\"Read-only file system\" -- that error appeared when I started \"stock git annex\", i.e. from running /data/data/ga.androidterm/lib/lib.start.so .+Since you have suggested that it might be coming from hard linking command, I have ran that one manually, and that is when I got \"Cross-device link\" error, which suggests that hard linking is not the one at fault here.++I will try fresh build now+Cheers,+"""]]
@@ -0,0 +1,15 @@+[[!comment format=mdwn+ username="http://yarikoptic.myopenid.com/"+ nickname="site-myopenid"+ subject="fresh build"+ date="2013-05-24T03:21:29Z"+ content="""+With fresh build got:++u0_a39@android:/ $ git annex webapp+/system/bin/sh: git: not found++the PATH is /sbin:/system/bin:/system/xbin++where should git (and ga) reside now ? (/data somehow is not accessible now to u0_a39)+"""]]
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ nickname="joey"+ subject="comment 12"+ date="2013-05-24T03:26:33Z"+ content="""+You should be able to run /data/data/ga.androidterm/runshell even if you cannot ls /data. This adds /data/data/ga.androidterm/bin to PATH++However, the shell that the app starts is started by runshell anyway, so I don't understand how this could happen.+"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawkwjBDXkP9HAQKhjTgThGOxUa1B99y_WRA"+ nickname="Franck"+ subject="Still problems with my old N1/CM7"+ date="2013-05-24T06:01:18Z"+ content="""+Hi, thank you for addressing this issue! I installed the new release but now it fails in another way: the message is just \"In mgmain NJI_OnLoad\" then the terminal says that the session is closed.+"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://yarikoptic.myopenid.com/"+ nickname="site-myopenid"+ subject="It starts after uninstall/install"+ date="2013-05-24T23:29:52Z"+ content="""+Hi Joey -- there is success here... previous installation was \"updated\" by installing the new package without uninstalling previous one, and that apparently didn't work correctly (I didn't even have bin/ directory you mentioned). So I have removed previous installation and reinstalled it again -- it starts now! Thanks ;)+"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://yarikoptic.myopenid.com/"+ nickname="site-myopenid"+ subject="asking for ssh password in the terminal (not in web ui)"+ date="2013-05-24T23:49:40Z"+ content="""+not sure if that is a known issue: whenever \"remote server\" is added, password needs to be typed back in the original terminal... is a bit challenging to do on android and not straightforward user-wise +"""]]
@@ -0,0 +1,27 @@+[[!comment format=mdwn+ username="http://yarikoptic.myopenid.com/"+ nickname="site-myopenid"+ subject="Few other issues"+ date="2013-05-25T15:35:46Z"+ content="""+Hi again.++talking about 4.20130523-gcfe07a2 version:++- because working in the terminal to interact with git-annex probably should not be a common case on Android, may be it is worth making default type of new added repository to become a full backup? I have initiated a new one, attached a remote one, it said \"synced\" but all the files were just containing symlinks and were not usable. I had to switch to \"full backup\" (or whatever that name) to finally get directory synced++- log file might grow too large simply because of containing numerous entries for attempting connect remote repository while offline, e.g.++Please make sure you have the correct access rights+and the repository exists.+ssh: Could not resolve hostname onerussian.com: No address associated with hostname+fatal: Could not read from remote repository.++IMHO those should not be there at all, e.g. if it is known that ATM there is no network connectivity++- In addition to two existing repositories (1 local /sdcard/annex, which is also avail at/storage/sdcard0/annex + 1 remote) I have added one more local (and said to keep it in sync with original local). But it didn't work -- it \"Synced with onerussian.com_annex but not with Annex\" and claimed that the /external/extSdCard/Annex doesn't exist, although it is there (and with .git generated etc). When I restarted the deamon I got into a \"new\" Repository: /storage/extSdCard/Annex which also listed the 1st local but with \"Failed to sync with localhost\" message -- no remote one listed. Whenever I try to \"Switch repository\" to /sdcard/annex (the original local) -- it starts loading a new page but gets stuck right there. The only way to revive webui is to go back to Dashboard. Log there says (retyping from the screen so typos might be there):++error: cannot run git-receive-pack '/storage/sdcard0/annex': No such file or directory+fatal: unable to fork++"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://yarikoptic.myopenid.com/"+ nickname="site-myopenid"+ subject="comment 17"+ date="2013-05-29T02:43:29Z"+ content="""+joey -- any additional information could I provide to troubleshoot the issue? original repository seems to sync ok, but I can't \"administer\" it if I can't even switch to it...+"""]]
@@ -0,0 +1,17 @@+[[!comment format=mdwn+ username="http://aap.liquidid.net/"+ nickname="AAP"+ subject="comment 18"+ date="2013-05-30T11:23:58Z"+ content="""+I too get the 'link busybox: Read-only file system' message. Here is my phone info: ++Phone: Samsung Galaxy Y GT-S5360 (rooted) +Android: 2.3.6 Gingerbread +BusyBox path: /system/xbin/ +++Androids own terminal seems not to understand the d argument (-ld: No such file or directory) but over ssh 'ls -ld /data/data/ga.androidterm' returns+ + drwxr-x--x 1 app_97 app_97 0 May 30 12:57 /data/data/ga.androidterm/+"""]]
@@ -0,0 +1,15 @@+[[!comment format=mdwn+ username="http://yarikoptic.myopenid.com/"+ nickname="site-myopenid"+ subject="Does it require the device to be rooted?"+ date="2013-05-16T20:55:45Z"+ content="""+Following your news on kickstarter downloaded the .apk, and installed it. Upn start I just got a terminal window with++ link busybox: Read-only file system++ [Terminal session finished]++That is on Galaxy Note++"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://afoolishmanifesto.com/"+ nickname="frioux"+ subject="SSH Keys - 2"+ date="2013-07-17T22:56:37Z"+ content="""+@joey should I be using the nightlies to see that? Under \"Adding a remote server using ssh\" I only see Host name, user name, directory, and port. Will it only be an option after I type in a password?+"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="4.154.6.48"+ subject="comment 22"+ date="2013-07-17T23:25:21Z"+ content="""+@frioux it will automatically generate a new ssh key and configure the server to use it, once you submit the form and enter the password to let it into the server.+"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://afoolishmanifesto.com/"+ nickname="frioux"+ subject="comment 23"+ date="2013-07-18T02:01:28Z"+ content="""+@joey: ok, I got it to connect and it indeed sent over a key etc. For some reason now though git-annex (on android) \"crashes\" shortly after starting. To be clear, the web app says that the program crashed, the console is still there. I suspect that it may have something to do with my largish remote repo and the time required to sync just the metadata, but I can't tell. Any ideas what I should do next? (Note that I *did* change it to manual mode because my phone doesn't have 30G of storage :)+"""]]
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="http://afoolishmanifesto.com/"+ nickname="frioux"+ subject="comment 24"+ date="2013-07-18T11:35:06Z"+ content="""+ok, it eventually got the details from the remote server, but now I'm getting some other oddities. here is some of my log that shows what I am running into++Watcher crashed: addWatch: does not exist (No such file or directory) [2013-07-18 06:22:46 CDT] Watcher: warning Watcher crashed: addWatch: does not exist (No such file or directory) (scanning...) [2013-07-18 06:23:19 CDT] Watcher: Performing startup scan Watcher crashed: addWatch: does not exist (No such file or directory) [2013-07-18 06:24:28 CDT] Watcher: warning Watcher crashed: addWatch: does not exist (No such file or directory) (scanning...) [2013-07-18 06:24:31 CDT] Watcher: Performing startup scan Watcher crashed: addWatch: does not exist (No such file or directory) [2013-07-18 06:25:44 CDT] Watcher: warning Watcher crashed: addWatch: does not exist (No such file or directory)+"""]]
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawnRfQArYOmDd7r2DC7DkIJFOQgqXCVcAeU"+ nickname="Frew"+ subject="comment 25"+ date="2013-07-18T13:14:46Z"+ content="""+frioux here (something messed up with myopenid or something)++So I deleted the repo on my phone (via the CLI since the web app seemed hung) and recreated it; this time making sure that I set things to manual mode ASAP. It didn't have the problem it was having before, but now what seems to have happened is that it fetches from the remote, commits to the local repo, and then immediately fetches and commits again. It looks like it's about a 4s repeat loop. Any ideas what I should do next?+"""]]
@@ -0,0 +1,12 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="4.154.0.140"+ subject="comment 26"+ date="2013-07-18T17:07:27Z"+ content="""+@Frew, you should file bug reports when you have a bug.++One problem you mentioned had already had a bug report filed by someone+else:+<http://git-annex.branchable.com/bugs/Watcher_crashed:_addWatch:_does_not_exist/> So you can post your details there.+"""]]
@@ -0,0 +1,34 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawnaH44G3QbxBAYyDwy0PbvL0ls60XoaR3Y"+ nickname="Nigel"+ subject="Watcher crashed in Android on /storage/sdcard1 - bug?"+ date="2013-07-29T11:50:46Z"+ content="""+In webapp UI, added on first install, the location for repository: /storage/sdcard1++!warning++Watcher crashed: addWatch:++permission denied (Permission denied)++[Restart Thread]++:Performing startup scan+++In terminal Window 1:++nex webapp <++ Detected a crippled filesystem.++ Enabling direct mode.++ Detected a filesystem without fifo support.++ Disabling ssh connection caching.+++Android 4.1.1 Huawei Y300 Annex.apk v1.0.52 version 4.20130723+"""]]
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="Jonathan"+ ip="63.131.117.194"+ subject="link busybox: Read-only file system"+ date="2013-07-29T20:08:12Z"+ content="""+Phone: HTC EVO 3d 4g+Model Number: pg86100+Android Version: 4.0.3+"""]]
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ nickname="joey"+ subject="comment 2"+ date="2013-05-17T22:28:34Z"+ content="""+The Android app works on many non-rooted Android systems.++The \"link busybox: Read-only file system\" means that `/data/data/ga.androidterm/lib/lib.busybox.so` cannot be hard linked to `/data/data/ga.androidterm/busybox`. That's not normal. I'd appreciate if you could provide more information on your Android device, like Android version and model number.+"""]]
@@ -0,0 +1,14 @@+[[!comment format=mdwn+ username="http://yarikoptic.myopenid.com/"+ nickname="site-myopenid"+ subject="Follow-up information on my system"+ date="2013-05-18T01:23:28Z"+ content="""+Sorry for the delay: my android is stock Samsung-tuned Jelly beans.+Android 4.1.2+Baseband version N7000XXLSO++not sure if that would be of any use :-/ nothing in the logs (aLogcat) if I filter by annex -- should there any debug output? what should be a key to search by?+++"""]]
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawnu1NYw8UF-NoDbKu8YKVGxi8FoZLH7JPs"+ nickname="Chris"+ subject="Not starting browser on Nexus 7, Android 4.2.2"+ date="2013-05-19T14:04:28Z"+ content="""+I just tried to run this on my Nexus 7 which has Android 4.2.2, and I received the following: <http://hodapple.com/files/Screenshot_2013-05-19-09-49-53.png> <http://hodapple.com/files/git-annex-error.txt>++In spite of that, though, the URL provided still worked.+"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ nickname="joey"+ subject="comment 5"+ date="2013-05-19T19:46:14Z"+ content="""+@Chris, that is a known bug: [[bugs/Android_app_permission_denial_on_startup]]+"""]]
@@ -0,0 +1,18 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ nickname="joey"+ subject="comment 6"+ date="2013-05-19T20:06:56Z"+ content="""+@yarikoptic, there is a process you can perform that will help me determine what's going on.++You should be able to get the git-annex app to let you into a shell. You can do this by starting the app, and then going into its configuration menu, to Preferences, selecting \"Command Line\", and changing it to run \"/system/bin/sh\"++Then when you open a new window in the git-annex app, you'll be at a shell prompt. From there, you can run:++ls -ld /data/data/ga.androidterm++I'm interested to know a) whether the directory exists and b) what permissions and owner it has. On my tablet, I get back \"drwxr-x--x app_39 app_39\" .. and if I run `id` in the shell, it tells me it's running as `app_39`.++My guess is the directory probably does exist, but cannot be written to by the app. If you're able to verify that, the next step will be to investigate if there is some other directory that the app can write to. It needs to be able to write to someplace that is not on the `/sdcard` to install itself.+"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawkwjBDXkP9HAQKhjTgThGOxUa1B99y_WRA"+ nickname="Franck"+ subject="Link issue"+ date="2013-05-22T12:01:38Z"+ content="""+Hi, I have exactly the same problem with the link that fails on my phone. However, I checked the permissions and they are as you describe on your tablet (except for the app number). At the same time, everything is fine on my tablet... The phone runs an old Cyanogenmod 7.2.0 (Android 2.3.7) while the tablet is a more recent Asus TF700T (Android 4.1.1). Let me know if you want me to run tests.+"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://yarikoptic.myopenid.com/"+ nickname="site-myopenid"+ subject="why ln failed"+ date="2013-05-23T13:27:39Z"+ content="""+Finally got to check it out: so indeed hardlinking fails but not because of permissions but \"link failed Cross-device link\" that lib is -> /mnt/asec/ga.androidterm-1/lib which resides on a different partition (vfat, /dev/block/dm-2, ro) from /data (ext4, /dev/block/mmcblk0p10)+"""]]
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ nickname="joey"+ subject="comment 9"+ date="2013-05-23T18:44:46Z"+ content="""+@yarikoptic you said before the error was \"Read-only file system\". Now you're saying it's \"Cross-device link\". I'm slightly confused.++I've reworked the android app to not need any hard links. Try the current autobuild: <http://downloads.kitenet.net/git-annex/autobuild/android/git-annex.apk>+"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="https://me.yahoo.com/a/bBy7WkgQicYHIiiyj.Vm0TcMbxi2quzbPFef#6f9f7"+ nickname="Frederik Vanrenterghem"+ subject="Convert bare repository to normal"+ date="2015-05-19T09:17:15Z"+ content="""+Just wondering what the right steps are to convert a bare repository to a normal one? The comment above from 2.5 years ago includes the creation of a .git directory, which actually already exists. Have things changed in the mean time?+"""]]
@@ -0,0 +1,31 @@+[[!comment format=mdwn+ username="https://id.koumbit.net/anarcat"+ subject="comment 5"+ date="2015-05-19T12:18:05Z"+ content="""+Well, no, i don't think they changed, unless i missed something: there+shouldn't be a `.git` repository there.++There are [various+instructions](http://stackoverflow.com/questions/10637378/how-do-i-convert-a-bare-git-repository-into-a-normal-one-in-place)+on how to do this online. They do seem to agree with the first comment+above.++Personnally, I would just `git clone` to a different repo and `git+annex forget` the old one. Unless you have a very complex repository+with a lot of files, this is simple enough... You could even use `git+annex reinit` to recycle the previous uuid if that's a concern. So in+short:++ git clone repo.git repo+ cd repo+ git annex info --fast # find the UUID of repo.git+ git annex move --from $UUID+ git annex reinit $UUID++Then `repo.git` can be removed if you are certain everything is+correct in `repo`.++Note that you may want to have backups of everything before you do+anything, as usual.+"""]]
@@ -0,0 +1,12 @@+[[!comment format=mdwn+ username="https://me.yahoo.com/a/bBy7WkgQicYHIiiyj.Vm0TcMbxi2quzbPFef#6f9f7"+ nickname="Frederik Vanrenterghem"+ subject="comment 6"+ date="2015-05-21T06:14:33Z"+ content="""+Thanks Anarcat. I actually was dealing with a repository in direct mode, not bare mode. Only realised after today encountering one in bare mode, and reading [[internals]]. Your method worked too, but++ git annex indirect ++would have been quicker I guess.+"""]]
@@ -0,0 +1,37 @@+### Please describe the problem.++git-annex assistant starts to drop files in remote repos, even when they are set to manual.++### What steps will reproduce the problem?+++Create 3 repos:++* A -- standard, archive+* m1 -- standard, manual+* m2 -- standard, manual++System has 3 files annexed: file1, file2, file3. Repo "A" has all three files, m1 has none, m2 has file3.++So, while in m1:++ m1 $ git annex find --want-drop --in m2+ file3++file3 shouln't be dropped from m2. There is no reason to do this. m2 is set as manual, and it shouldn't be touched in any case.++Now, let's get this file in m1:++ m1 $ git annex get file3+ get file3 (from m2...) ok+ (Recording state in git...)+ m1 $ git annex find --want-drop --in m2++So when 'file3' is present in local repo, it's not going to be dropped from m2.++I guess that rule 'present' works in local repo context while 'drop' acts on remote files.+++### What version of git-annex are you using? On what operating system?++I'm using latest version in Debian Jessie (5.20141024) on amd64 and armhf. I've also reproduced the bug with manually compiled 5.20141105-g8d8b248 on amd64.
@@ -0,0 +1,31 @@+The assistant from the standalone 64bit build crashes upon startup.++### Version information++ [0 zerodogg@firefly annexed]$ git annex version+ git-annex version: 5.20131230-g4aa88d8+ build flags: Assistant Webapp Pairing S3 WebDAV Inotify DBus XMPP Feeds Quvi TDFA+ key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SHA256 SHA1 SHA512 SHA224 SHA384 WORM URL+ remote types: git gcrypt S3 bup directory rsync web webdav glacier hook external+ local repository version: 5+ supported repository version: 5+ upgrade supported from repository versions: 0 1 2 4+ [0 zerodogg@firefly annexed]$ uname -a+ Linux firefly 3.12.5-302.fc20.x86_64 #1 SMP Tue Dec 17 20:42:32 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux+ [0 zerodogg@firefly annexed]$ cat /etc/fedora-release + Fedora release 20 (Heisenbug)+ [0 zerodogg@firefly annexed]$ ++### Error++ [0 zerodogg@firefly annexed]$ git annex webapp+ Launching web browser on file:///home/zerodogg/Documents/annexed/.git/annex/webapp.html+ + (process:6045): GLib-CRITICAL **: g_slice_set_config: assertion 'sys_page_size == 0' failed+ libgcc_s.so.1 must be installed for pthread_cancel to work+ error: git-annex died of signal 6+ [134 zerodogg@firefly annexed]$ ls -l /usr/lib64/libgcc_s.so.1+ lrwxrwxrwx. 1 root root 28 2013-12-18 10:54 /usr/lib64/libgcc_s.so.1 -> libgcc_s-4.8.2-20131212.so.1+ [0 zerodogg@firefly annexed]$ ++> [[fixed|done]] --[[Joey]]
@@ -57,3 +57,6 @@ drwxr-xr-x 8 jkt jkt 119 May 8 13:55 .git """]] ...and the file is gone :(.++> You should use `git annex add` in this case, not import. +> I've made import refuse to run in this case. [[done]] --[[Joey]]
@@ -0,0 +1,69 @@+### Please describe the problem.++[[!tag moreinfo]]++I added a lot of files to my annex in direct mode. Now I want to switch to indirect mode. git-annex status and indirect create an out-of-memory error.++### What steps will reproduce the problem?++I am not really sure, I added a lot of files to the annex, almost 3TB.+Then either git-annex status or git-annex indirect cause a similar error (see below).+++### What version of git-annex are you using? On what operating system?++git-annex version: 4.20130501-g4a5bfb3+local repository version: 4+default repository version: 3+supported repository versions: 3 4+upgrade supported from repository versions: 0 1 2+build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP++Ubuntu precise+3.2.0-26-generic+++### Please provide any additional information below.++[[!format sh """+# If you can, paste a complete transcript of the problem occurring here.+# If the problem is with the git-annex assistant, paste in .git/annex/debug.log+git-annex status+supported backends: SHA256E SHA1E SHA512E SHA224E SHA384E SHA256 SHA1 SHA512 SHA224 SHA384 WORM URL+supported remote types: git S3 bup directory rsync web webdav glacier hook+repository mode: direct+trusted repositories: 0+semitrusted repositories: 7+ 00000000-0000-0000-0000-000000000001 -- web+ 0b8e6666-80d5-11e2-adf3-6f4d3d6ef0aa -- marek@x4:~/tmp/annex+ 65c057c6-6027-11e2-84b0-b77d71696e49 -- here (.)+ 96b31c5e-6524-11e2-b136-fbd1a03b2799 -- BackupOnGlacier+ b509c388-629a-11e2-be5f-d376e201ad86 -- marek@x201:~/AllData+ c636e33c-6e31-11e2-a9c4-a3c5546d69d9 -- desktop+ fbaa1c3a-60d7-11e2-842f-9348368d2f4c -- .+untrusted repositories: 0+dead repositories: 0+transfers in progress: none+available local disk space: 81 gigabytes (+1 megabyte reserved)+temporary directory size: 9 megabytes (clean up with git-annex unused)+local annex keys: 61396+local annex size: 3 terabytes+known annex keys: git-annex: out of memory (requested 985661440 bytes)++OR++git-annex indirect+commit git-annex: out of memory (requested 985661440 bytes)++++++# End of transcript or log.+"""]]++> [[fixed|done]]. However, if you saw this behavior,+> you have large files checked directly into git. You may+> want to examine your repository and use git filter-branch to clean+> it up.+> --[[Joey]]
@@ -0,0 +1,20 @@+What steps will reproduce the problem?++Adding files to a local annex set up to sync to a remote S3 one+++What is the expected output? What do you see instead?++It syncs, but maxes out the uplink+++What version of git-annex are you using? On what operating system?++3.20121112 on Debian testing+++Please provide any additional information below.++The man page lists how to configure rate limiting for rsync, not sure how to do it for this++[[!tag confirmed]]
@@ -0,0 +1,23 @@+### Please describe the problem.++Creating a USB repo fails with a GPG error.++### What steps will reproduce the problem?++ * Build git-annex and git-annex assistant using the instructions at https://gist.github.com/calmyournerves/7144127+ * Run git-annex app to launch web interface+ * Create local repo using web interface+ * Try to create USB repo using web interface++### What version of git-annex are you using? On what operating system?++git-annex version 4.20131105-g136b030 on Mac OS 10.9 Mavericks.++### Please provide any additional information below.++[[!format sh """+07/Nov/2013:06:51:07 +1100 [Error#yesod-core] user error (gpg ["--batch","--no-tty","--use-agent","--quiet","--trust-model","always","--with-colons","--list-secret-keys","--fixed-list-mode"] exited 5) @(yesod-core-1.2.4.5:Yesod.Core.Class.Yesod ./Yesod/Core/Class/Yesod.hs:485:5)+"""]]++> [[fixed|done]]; it seems that this was a local build issue ad does not+> affect the autobuild. --[[Joey]]
@@ -0,0 +1,31 @@+### Please describe the problem.+Changing metadata while being in an active view will not update the view.++### What steps will reproduce the problem?+(inside a repository)++1. Create a file++ $ uuidgen >file++2. switch into a view++ $ git annex view !blah+ $ ls+ file++3. changed the metadata the view is based upon++ $ git annex metadata -t blah file+ $ ls+ file++ It would be nice/expected that the view gets updated when the metadata changes, hiding 'file' now+ ++### What version of git-annex are you using? On what operating system?++git-annex version: 5.20141024~bpo70+1+on debian wheezy with backports++### Please provide any additional information below.
@@ -0,0 +1,14 @@+[[!comment format=mdwn+ username="http://schnouki.net/"+ nickname="Schnouki"+ subject="comment 1"+ date="2013-10-18T08:36:45Z"+ content="""+Hi Joey,++It looks like your patch hasn't been merged yet. And this bug is quite annoying for me (can't backup files bigger than 1.5 GB from my NAS).++Would it be possible to include this fix in your standalone builds and Debian packages?++Thanks!+"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://schnouki.net/"+ nickname="Schnouki"+ subject="comment 2"+ date="2014-01-29T01:19:27Z"+ content="""+Any news about this?+"""]]
@@ -0,0 +1,12 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="209.250.56.112"+ subject="comment 3"+ date="2014-08-02T23:08:44Z"+ content="""+hS3's author seems to have abandoned it and it has other problems. I should try to switch to a different S3 library.++There is now a workaround; S3 special remotes can be configured to use [[chunking]]. A max of one chunk will then be buffered in memory at a time. ++For example, to reconfigure an existing mys3 remote: `enableremote mys3 chunk=1MiB`+"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="209.250.56.112"+ subject="comment 4"+ date="2014-08-03T18:40:26Z"+ content="""+Beginning work on a `s3-aws` branch using the aws library instead of hS3.+"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawmUJBh1lYmvfCCiGr3yrdx-QhuLCSRnU5c"+ nickname="Justin"+ subject="comment 5"+ date="2014-11-30T22:18:56Z"+ content="""+This is getting in my way, but I'm concerned about using a mostly-untested branch (and also, compiling for ARM sounds really unpleasant). Can you elaborate on the risks here? Can I perhaps donate developer time to get this merged into mainline?+"""]]
@@ -0,0 +1,11 @@+[[!comment format=mdwn+ username="joey"+ subject="""comment 6"""+ date="2014-12-02T17:10:42Z"+ content="""+The s3-aws branch is well tested now.++I am blocked from merging it by some dependency issues, in particular +<http://hackage.haskell.org/package/dbus> needs to have a small dependency+fix. I have emailed its author a second time now to try to get that done.+"""]]
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawmUJBh1lYmvfCCiGr3yrdx-QhuLCSRnU5c"+ nickname="Justin"+ subject="comment 7"+ date="2014-12-06T18:15:50Z"+ content="""+The new version works really great for me. I've been copying to S3 over the past few days with no issues on my raspberry pi.++Thanks a ton for getting this out.+"""]]
@@ -0,0 +1,31 @@+### Please describe the problem.+At some point, I migrated all my WORM-backed objects to SHA1E. I then squashed my master branch to get rid of any WORM references and dropped unused objects. Recently, I noticed that the git-annex branch still has all tracking information on the old WORM keys. I tried running git-annex forget, but the old keys are not purged, even though no (local or remote) branch refers to them and no git-annex repository has the data for these keys anymore. Should such keys be purged by git-annex forget, too?++### What steps will reproduce the problem?++[[!format sh """+# If you can, paste a complete transcript of the problem occurring here.+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log+git init /tmp/repo+cd /tmp/repo+git annex init+echo hi > file+git annex add --backend=WORM file+git commit -m init+git annex migrate+git commit -m migrated+git checkout --orphan tmp+git commit -m squashed+git branch -m master -f+git annex unused+git annex dropunused 1 --force+git annex forget --drop-dead --force+git ls-tree -r git-annex | grep WORM++# End of transcript or log.+"""]]++### What version of git-annex are you using? On what operating system?+git-annex 5.20150508+Linux 4.0.4+
@@ -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]]
@@ -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]]
@@ -0,0 +1,95 @@+### Please describe the problem.++Building a recent git-annex with cabal with the `minimal build'+options given in the installation instructions fails. It is probably+just a matter of fixing the dependencies in the cabal file.++### What steps will reproduce the problem?+Compile with:++cabal install git-annex-5.20140108 --bindir=$HOME/bin -f"-assistant -webapp -webdav -pairing -xmpp -dns"++### What version of git-annex are you using? On what operating system?+Linux 2.6.32-5-686 i686 GNU/Linux+++### Please provide any additional information below.++[[!format sh """+# If you can, paste a complete transcript of the problem occurring here.+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log+Resolving dependencies...+[ 1 of 27] Compiling Utility.PartialPrelude ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Utility/PartialPrelude.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Utility/PartialPrelude.o )+[ 2 of 27] Compiling Utility.FileSystemEncoding ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Utility/FileSystemEncoding.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Utility/FileSystemEncoding.o )+[ 3 of 27] Compiling Utility.Applicative ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Utility/Applicative.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Utility/Applicative.o )+[ 4 of 27] Compiling Utility.Data ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Utility/Data.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Utility/Data.o )+[ 5 of 27] Compiling Utility.Exception ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Utility/Exception.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Utility/Exception.o )+[ 6 of 27] Compiling Utility.Tmp ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Utility/Tmp.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Utility/Tmp.o )+[ 7 of 27] Compiling Utility.Env ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Utility/Env.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Utility/Env.o )+[ 8 of 27] Compiling Utility.UserInfo ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Utility/UserInfo.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Utility/UserInfo.o )+[ 9 of 27] Compiling Utility.OSX ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Utility/OSX.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Utility/OSX.o )+[10 of 27] Compiling Utility.Monad ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Utility/Monad.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Utility/Monad.o )+[11 of 27] Compiling Utility.Misc ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Utility/Misc.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Utility/Misc.o )+[12 of 27] Compiling Utility.Process ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Utility/Process.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Utility/Process.o )+[13 of 27] Compiling Utility.Path ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Utility/Path.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Utility/Path.o )+[14 of 27] Compiling Utility.FreeDesktop ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Utility/FreeDesktop.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Utility/FreeDesktop.o )+[15 of 27] Compiling Assistant.Install.AutoStart ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Assistant/Install/AutoStart.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Assistant/Install/AutoStart.o )+[16 of 27] Compiling Utility.SafeCommand ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Utility/SafeCommand.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Utility/SafeCommand.o )+[17 of 27] Compiling Utility.ExternalSHA ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Utility/ExternalSHA.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Utility/ExternalSHA.o )+[18 of 27] Compiling Utility.Directory ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Utility/Directory.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Utility/Directory.o )+[19 of 27] Compiling Common ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Common.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Common.o )+[20 of 27] Compiling Git.Version ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Git/Version.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Git/Version.o )+[21 of 27] Compiling Config.Files ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Config/Files.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Config/Files.o )+[22 of 27] Compiling Assistant.Install.Menu ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Assistant/Install/Menu.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Assistant/Install/Menu.o )+[23 of 27] Compiling Build.TestConfig ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Build/TestConfig.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Build/TestConfig.o )+[24 of 27] Compiling Build.Version ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Build/Version.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Build/Version.o )+[25 of 27] Compiling Build.Configure ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Build/Configure.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Build/Configure.o )+[26 of 27] Compiling Build.DesktopFile ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Build/DesktopFile.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Build/DesktopFile.o )+[27 of 27] Compiling Main ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Setup.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Main.o )+Linking /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/setup ...+ checking version...fatal: Not a git repository (or any of the parent directories): .git+ 5.20140107+ checking UPGRADE_LOCATION... not available+ checking git... yes+ checking git version... 1.7.2.5+ checking cp -a... yes+ checking cp -p... yes+ checking cp --reflink=auto... yes+ checking xargs -0... yes+ checking rsync... yes+ checking curl... no+ checking wget... yes+ checking bup... no+ checking quvi... no+ checking newquvi... no+ checking nice... yes+ checking ionice... yes+ checking nocache... no+ checking gpg... gpg+ checking lsof... lsof+ checking git-remote-gcrypt... not available+ checking ssh connection caching... no+ checking sha1... sha1sum+ checking sha256... sha256sum+ checking sha512... sha512sum+ checking sha224... sha224sum+ checking sha384... sha384sum+Configuring git-annex-5.20140108...+Building git-annex-5.20140108...+Preprocessing executable 'git-annex' for git-annex-5.20140108...++Remote/External.hs:29:8:+ Could not find module `Control.Concurrent.STM'+ It is a member of the hidden package `stm-2.4.2'.+ Perhaps you need to add `stm' to the build-depends in your .cabal file.+ Use -v to see a list of the files searched for.+Failed to install git-annex-5.20140108+cabal: Error: some packages failed to install:+git-annex-5.20140108 failed during the building phase. The exception was:+ExitFailure 1+++# End of transcript or log.+"""]]++> [[fixed|done]] --[[Joey]]
@@ -0,0 +1,27 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawnx8kHW66N3BqmkVpgtXDlYMvr8TJ5VvfY"+ nickname="Yaroslav"+ subject="git annex fix starts fixing but then spits bulk of errors"+ date="2014-01-18T05:42:15Z"+ content="""+probably related:++```+fix books/Мои первые книжки/PDF/Благинина Е.А. - Лодочки (Мои первые книжки) - 1962.pdf ok+fix books/Мои первые книжки/PDF/Благинина Е.А. - Не мешайте мне трудиться (Мои первые книжки) - 1975.pdf fatal: This operation must be run in a work tree+ok+(Recording state in git...)++git-annex: user error (xargs [\"-0\",\"git\",\"--git-dir=/home/yoh/annex/.git\",\"add\",\"--force\",\"--\"] exited 123)+fatal: This operation must be run in a work tree+failed+(Recording state in git...)++git-annex: user error (xargs [\"-0\",\"git\",\"--git-dir=/home/yoh/annex/.git\",\"add\",\"--force\",\"--\"] exited 123)+fatal: This operation must be run in a work tree+failed+(Recording state in git...)++....+```+"""]]
@@ -0,0 +1,32 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawnx8kHW66N3BqmkVpgtXDlYMvr8TJ5VvfY"+ nickname="Yaroslav"+ subject="repair seems to be also confused"+ date="2014-01-18T05:47:02Z"+ content="""+[[[+$> git annex repair +Running git fsck ...+No problems found.+fatal: '/home/yoh/annex/.git' is outside repository+Had to delete the .git/annex/index file as it was corrupt.+No data was lost.+ok++$> ls+2enjoy/ 2read/ 2watch/ books/ hardware/ videos/+2listen/ 2review/ abooks/ docs/ pics/++$> git annex repair+Running git fsck ...+No problems found.+fatal: '/home/yoh/annex/.git' is outside repository+Had to delete the .git/annex/index file as it was corrupt.+No data was lost.+ok++$> git annex get 2read/ISNN2010__Tang.pdf+git-annex: Cannot mix --all or --unused with file names.++]]]+"""]]
@@ -0,0 +1,16 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawnx8kHW66N3BqmkVpgtXDlYMvr8TJ5VvfY"+ nickname="Yaroslav"+ subject="could it be part/reason of the problem"+ date="2014-01-18T06:05:50Z"+ content="""+not sure how that happened... definitely not me consciously! ;-) some commands are complaining that \"You cannot run this command in a bare repository\" which I thought is BS since it is not BARE! but then looked into .git/config and it does have core.bare = True ... yikes!.. ++This repository is also under assistant \"control\".++changing to bare=False seems to start 'get'ing things, git annex repair doesn't produce obscure errors.++git annex fix though now doesn't report any problems -- only 'ok', but none of those files mentioned 'ok' has a working symlink,,, but I guess that is a fluke after many upgrades -- just dropping everything locally and getting needed context after purging .git/annex/objects .++So I guess issue is resolved by discovering that repository was set to 'bare' mode somehow although it was not and seemed like working but not quite+"""]]
@@ -0,0 +1,14 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="209.250.56.43"+ subject="comment 4"+ date="2014-01-18T15:42:59Z"+ content="""+git-annex sets core.bare=true for direct mode, but it also then sets annex.direct=true and so does not treat it as a bare mode repository. If you had eg, manually tried to change annex.direct to false, and left it in bare mode, that would explain everything.++> git annex fix though now doesn't report any problems -- only 'ok', but none of those files mentioned 'ok' has a working symlink++That is completely normal behavior; git annex fix does not care if the content is locally present or not; it just checks that the symlinks would point to it if it were present.++(Fixed the partial function in dropunused.)+"""]]
@@ -0,0 +1,29 @@+### Please describe the problem.++This is a one-off thing, not a reproducible bug. It was just so weird that I wanted to make a note of it in case somebody else had the same problem and it was reproducible.++I have a remote on the a USB drive which I mount once in a while on /Volumes/TOSHIBAEXT which has a remote on /Volumes/TOSHIBAEXT/annex. It's a remote which I created by hand using "git clone" a long time ago, not something the assistant set up for me.++Anyway, today the assistant kept reporting that it could not sync to it. I didn't know why, because I checked in my Finder sidebar and it showed a mounted drive called TOSHIBAEXT. It's only when I checked with the command line that I noticed something was up! There was now an ordinary directory at /Volumes/TOSHIBAEXT/annex. This had apparently been created at some point when the drive was unmounted, so when it re-mounted, because there was a directory in the way, it re-mounted at "/Volumes/TOSHIBAEXT 1". But it was displayed in the finder sidebar as just "TOSHIBAEXT" anyway because the finder hides this workaround from the user for whatever reason.++Presumably git-annex assistant at some point, for some reason, created an ordinary directory where it expected to find the annex.++I wonder if this may have to do with the fact that this is a non-bare, created-by-hand repo, from before I was using the assistant, not a normal bare remote that the assistant would have created for me if I'd been using the webapp.++### What steps will reproduce the problem?++I've only seen it once, and report the bug not as an outstanding issue but only as a heads-up that this has ever happened.++### What version of git-annex are you using? On what operating system?++git-annex version: 4.20130501-gb61740e++OS X lion (10.7)++### Please provide any additional information below.++I wasn't logging when this happened.++Again, just a heads-up; I'll keep my eye open for this happening again and post more info if it does.++[[!tag confirmed]]
@@ -0,0 +1,14 @@+Direct mode merge handles the case where there's a conflict between local and remote files, that are checked into git.++However, the the local file (or directory, or symlink, whatever)+is not checked into git, the merge will overwrite it with the remote file from git.++> That's fixed; now this is detected and the local variant+> is renamed with ".variant-local", and possibly a number to make it+> unique.++New problem: If the merge pulls in a directory, and a file exists with+the name of the directory, locally, not annexed, the file is left alone,+but the directory is thus not checked out, and will be deleted on commit.++> [[fixed|done]]; regression test in place. --[[Joey]]
@@ -0,0 +1,13 @@+[[!comment format=mdwn+ username="joey"+ subject="""comment 1"""+ date="2015-04-09T17:48:20Z"+ content="""+GIT_SSH is set to the full path of the binary, unless+~/.config/git-annex/program overrides it.++Finding the full path to the binary is not a trivial or error-free+operation.++Could you please follow up to this bug or close it?+"""]]
@@ -0,0 +1,33 @@+### Please describe the problem.++When using `git annex sync --content` with two archive with different cost, git annex will upload my file to the first archive, then to the second one, then it will drop it from the first one.++### What steps will reproduce the problem?++I've set both remote to "trusted", both in the "archive" group, both with "standard" preferred content, the remote named "hubic2" as an annex-cost of 200.0, and the remote named "hubic3" as an annex-cost of 175.0++### What version of git-annex are you using? On what operating system?+I'm using git-annex 5.20141125 on Debian Sid (upgraded today on November 7 2014).++### Please provide any additional information below.++[[!format sh """+# If you can, paste a complete transcript of the problem occurring here.+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log++$ git annex list | head+here+|hubic2+||hubic3+|||+X__ Avatars/archer.jpg+$ git annex sync --content+commit ok+copy Avatars/archer.jpg copy Avatars/archer.jpg (to hubic3...)+ok+copy Avatars/archer.jpg copy Avatars/archer.jpg (to hubic2...)+ok+drop hubic3 Avatars/archer.jpg ok++# End of transcript or log.+"""]]
@@ -0,0 +1,60 @@+### Please describe the problem.++May be I was simply wrong to assume that if I disable all sync'ing for all the repos, assistant wouldn't try to contact those remote hosts. But it still does++In the logs, since no time stamp per each line, hard to say either recent ones just continuation of previous entries, or new ones:++[[++[2015-05-18 10:29:39 EDT] Watcher: Performing startup scan+(started...) ssh: connect to host vagus.cns.dartmouth.edu port 22: No route to host^M+ssh: connect to host vagus.cns.dartmouth.edu port 22: No route to host^M+ssh: connect to host vagus.cns.dartmouth.edu port 22: No route to host^M+ssh: connect to host vagus.cns.dartmouth.edu port 22: No route to host^M+ssh: connect to host vagus.cns.dartmouth.edu port 22: No route to host^M+ssh: connect to host vagus.cns.dartmouth.edu port 22: No route to host^M+...+]]++and in another++[[+fsck xppaut_6.11b+1.dfsg.orig.tar.gz ok+fsck xserver-xorg-input-synaptics_1.6.2+git44-ge28575b.orig.tar.gz ok+fsck xserver-xorg-video-intel_2.99.917.orig.tar.gz (checksum...)+ok+(recording state in git...)+ ** No known copies exist of python-mne_0.8.3+dfsg.orig.tar.gz+git-annex: fsck: 1 failed++(process:3954): Gtk-WARNING **: Locale not supported by C library.+ Using the fallback 'C' locale.+Write failed: Broken pipe^M++(process:20140): Gtk-WARNING **: Locale not supported by C library.+ Using the fallback 'C' locale.++(process:20178): Gtk-WARNING **: Locale not supported by C library.+ Using the fallback 'C' locale.+git-annex: Daemon is already running.++(process:29035): Gtk-WARNING **: Locale not supported by C library.+ Using the fallback 'C' locale.++(process:29184): Gtk-WARNING **: Locale not supported by C library.+ Using the fallback 'C' locale.++(process:30127): Gtk-WARNING **: Locale not supported by C library.+ Using the fallback 'C' locale.++(process:30817): Gtk-WARNING **: Locale not supported by C library.+ Using the fallback 'C' locale.+Write failed: Broken pipe^M+]]++that host (vagus) is RIP (need to remove from syncs)+btw which are falling into daemon.log.1 not .log++### What version of git-annex are you using? On what operating system?++5.20150509+gitga10e45d-1~ndall+1
@@ -0,0 +1,18 @@+### Please describe the problem.++When the annex directory has a non-ascii character (like a tilde) on its path, local pairing fails and a couple of instances of the following message appear on the log++"illegal control characters in pairing message; ignoring"++### What steps will reproduce the problem?++* make a new annex repo named on /home/someone/Vídeos/blah/ (notice the i with a tilde) on two computers+* try to pair them++### What version of git-annex are you using? On what operating system?++git-annex version: 5.20141016-g26b38fd on Arch Linux++git-annex version: 5.20140717 on Ubuntu 14.10++> [[done]]; see comment
@@ -0,0 +1,34 @@+### Please describe the problem.+Doing a git annex command while passing a bad --git-dir can result in the .git directory being deleted. I've never experienced it with plain git, so I assume that it comes for annex.++### What steps will reproduce the problem?++[[!format sh """+$ mkdir annex_destroyed_my_git_directory+$ cd annex_destroyed_my_git_directory+$ git init+$ git annex init+$ ls -a+. .. .git+$ git --git-dir=$PWD annex find+fatal: Not a git repository: '/home/doudou/tmp/annex_destroyed_my_git_directory'+$ ls -a+. .. config+"""]]++### What version of git-annex are you using? On what operating system?+dpkg -l git-annex reports 5.20141024++I am running Debian sid.++### Please provide any additional information below.++[[!format sh """+# If you can, paste a complete transcript of the problem occurring here.+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log+++# End of transcript or log.+"""]]++> [[fixed|done]] --[[Joey]]
@@ -0,0 +1,28 @@+### Please describe the problem.++i can't find a key in the JSON output of `git annex info` for the "transfer in progress" field. is it missing on purpose? or am I missing some field?++### What steps will reproduce the problem?++<pre>+git annex info+git annex info --json+</pre>+++### What version of git-annex are you using? On what operating system?+5.20150406-g2a9fbec debian jessie++### Please provide any additional information below.++[[!format sh """+# If you can, paste a complete transcript of the problem occurring here.+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log+anarcat@desktop008:mp3$ git annex info --fast --json | grep -i transfer+anarcat@desktop008:mp3$ git annex info --fast | grep -i transfer+transfers in progress:++# End of transcript or log.+"""]]++[[anarcat]]
@@ -0,0 +1,61 @@+There's a race that can result in 2 concurrent downloads+of the same key. This can happen because the transfer lock files get+deleted after a transfer completes.++Scenario:++1. first process creates lock file, takes lock, starts download+2. second process opens existing lock file+3. first process finishes/fails download, so deletes lock file, and then+ drops lock+4. second process takes lock (exclusive, non-blocking) of deleted file!+5. third process sees no lock file, so creates a new one, takes lock,+ starts download++Worst-case, this might result in data loss, if the two concurrent+downloaders confuse one-another. Perhaps the second one overwrites the file+the first was downloading, and then the first, thinking it's written the+file, moves it into the object directory.++Note that the window between 4-5 can be as long as it takes for a+file to download. However, the window between 2-4 is very narrow indeed,+since the second process is not blocking on the lock.+So, this is very unlikely to happen.++But, it could. Can it be prevented?++Yes: The second process, after taking the lock, can check that+the lock file exists, and has the same dev and fileno as the fd it has+locked. If the lock file doesn't exist, or is different, then the+second process can give up.++Oh BTW, this race cannot happen on windows, since on windows, an open lock+file cannot be deleted by another process.++> [[fixed|done]]++Let's also consider if this change will allow for safely expiring stale +lock files..++Situation before with expiry would have been buggy (which is why it never+tried to expire them):++1. first process creates lock file, takes lock, is interrupted (no more+ lock)+2. second process wants to delete stale lock file; checks if it's locked;+ isn't+3. third process opens existing lock file, prepares to take lock+4. second process deletes lock file+5. third process takes lock+6. third process is now doing a transfer w/o a (visible) lock++But, after this bug fix, the third process checks if it's lock file+exists after taking the lock. Since the second process deleted it,+the third process fails with an error "transfer in progress"+which is perhaps not accurate, but at least it stopped.++For this to work though, the second process needs to actually take+the lock, in non-blocking mode. If it succeeds, it can keep the lock+held while deleting the lock file. This ensures that when the third process+takes the lock, the lock file will already be deleted by the time it checks+if it's there.
@@ -0,0 +1,40 @@+### Please describe the problem.++I added a remote repository, and it successfully tested the ssh connection to the server. Nothing happens, however, once it comes to actually creating the remote repository (or merging with an existing one). It'll just sit there forever, never actually connecting to the server.++A quick look in process explorer shows something of what's going on: git-annex has launched ssh, and ssh is spamming subprocesses. It's launching ssh.exe which is launching git-annex.exe (yes, on the local machine.) It exits right away, but the command line is "C:\Program Files (x86)\Git\cmd\git-annex.exe" "Please type 'yes' or 'no': ". I've no idea why it's doing that though.++If I kill that parent ssh process, I get this error message in the transcript:++ Could not create directory '/home/db48x/.ssh'.++This seems a bit dubious; both my local computer and the remote computer have a ~/.ssh directory.++In order to rule out a problem with my local computer (an ancient install of Git or cygwin/msys or something, we've tried this on fresh computers which have never had git installed; we get exactly the same problem there.++### What steps will reproduce the problem?++Create or connect to a repository via SSH.++### What version of git-annex are you using? On what operating system?++Windows 7++ Version: 5.20150420-gb0ebb23+ Build flags: Assistant Webapp Webapp-secure Pairing Testsuite S3 WebDAV DNS Feeds Quvi TDFA TorrentParser++### Please provide any additional information below.++While this is going on, the log has is showing that it's executing the following command:++[[!format sh """+[2015-04-28 22:34:16 Pacific Daylight Time] chat: ssh ["-oNumberOfPasswordPrompts=1","-p","22","db48x@eambar.db48x.net","sh -c 'mkdir -p '\"'\"'annex'\"'\"'&&cd '\"'\"'annex'\"'\"'&&if [ ! -d .git ]; then if [ -x ~/.ssh/git-annex-wrapper ]; then ~/.ssh/git-annex-wrapper git init --bare --shared; else git init --bare --shared; fi && if [ -x ~/.ssh/git-annex-wrapper ]; then ~/.ssh/git-annex-wrapper git config receive.denyNonFastforwards; else git config receive.denyNonFastforwards; fi ;fi&&mkdir -p ~/.ssh&&if [ ! -e ~/.ssh/git-annex-shell ]; then (echo '\"'\"'#!/bin/sh'\"'\"';echo '\"'\"'set -e'\"'\"';echo '\"'\"'if [ \"x$SSH_ORIGINAL_COMMAND\" != \"x\" ]; then'\"'\"';echo '\"'\"'exec git-annex-shell -c \"$SSH_ORIGINAL_COMMAND\"'\"'\"';echo '\"'\"'else'\"'\"';echo '\"'\"'exec git-annex-shell -c \"$@\"'\"'\"';echo '\"'\"'fi'\"'\"') > ~/.ssh/git-annex-shell; fi&&chmod 700 ~/.ssh/git-annex-shell&&touch ~/.ssh/authorized_keys&&chmod 600 ~/.ssh/authorized_keys&&echo '\"'\"'command=\"env GIT_ANNEX_SHELL_DIRECTORY='\"'\"'\"'\"'\"'\"'\"'\"'annex'\"'\"'\"'\"'\"'\"'\"'\"' ~/.ssh/git-annex-shell\",no-agent-forwarding,no-port-forwarding,no-X11-forwarding,no-pty ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDiPFdIMyYCBmc14f9cUZaG36Zw+NziqX9Z+xGl5GAYq16nORxVc+70Bj+A9cHoHLzTMBJnw7G/f7xJNGbKNgKUPKZohT8AQfg8lnyK8qpyzI2dJB3R0vPBMPxZCBm4IOpdB6ad3B6dUiyNtyMn1hza7GVhIFOsHfGG+K3PGtFgwOz/Zj+2zmcZIL/BHObFsba/yhQxbsjLYPI7mmNV9CLb1+XcR0z2okWvxu28lOrcIXDAdEhp1cjjjpBhwTH1F8/gJcJ6ENBa4JiGt/oEKb1b/pXLaMX6dRjc/gYoy7z0Hw7RD73hH+UtPj5TAeKwoNdaVXdqSsVI+3ql+O5PFTxt db48x@caradhras\n'\"'\"' >>~/.ssh/authorized_keys'"]+"""]]++> This sounds like it's all down to the newer ssh from cygwin ignoring HOME+> and trying to use /home/user which doesn't work very well outside cygwin.+>+> Since git-annex has switched to not include that ssh any longer, and+> instead use the ssh that's bundled with msysgit, I think this bug is+> closed. [[done]] Upgrading to the latest daily build should fix your+> system's ssh. Please followup if I'm wrong. --[[Joey]]
@@ -0,0 +1,14 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawlu-fdXIt_RF9ggvg4zP0yBbtjWQwHAMS4"+ nickname="Jörn"+ subject="Mount detection"+ date="2012-09-21T09:23:34Z"+ content="""+regarding the current mount polling on OSX: why not use the NSNotificationCenter for being notified on mount events on OSX?++Details see:++1. <http://stackoverflow.com/questions/12409458/detect-when-a-volume-is-mounted-on-os-x>+2. <http://stackoverflow.com/questions/6062299/how-to-add-an-observer-to-nsnotificationcenter-in-a-c-class-using-objective-c>+3. <https://developer.apple.com/library/mac/#documentation/CoreFoundation/Reference/CFNotificationCenterRef/Reference/reference.html#//apple_ref/doc/uid/20001438>+"""]]
@@ -0,0 +1,34 @@+It's possible for one git annex repository to configure a special remote+that it makes sense for other repositories to also be able to use. Today I+added the UI to support that; in the list of repositories, such+repositories have a "enable" link.++To enable pre-existing rsync special remotes, the webapp has to do the same+probing and ssh key setup that it does when initially creating them.+Rsync.net is also handled as a special case in that code. There was one+ugly part to this.. When a rsync remote is configured in the webapp,+it uses a mangled hostname like "git-annex-example.com-user", to+make ssh use the key it sets up. That gets stored in the `remote.log`, and so+the enabling code has to unmangle it to get back to the real hostname.++---++Based on the still-running [[prioritizing_special_remotes]] poll, a lot+of people want special remote support for their phone or mp3 player.+(As opposed to running git-annex on an Android phone, which comes later..)+It'd be easy enough to make the webapp set up a directory special remote+on such a device, but that makes consuming some types of content on the+phone difficult (mp3 players seem to handle them ok based on what people tell+me). I need to think more about some of the ideas mentioned in [[android]]+for more suitable ways of storing files.++One thing's for sure: You won't want the assistant to sync all your files+to your phone! So I also need to start coming up with partial syncing+controls. One idea is for each remote to have a configurable matcher for files+it likes to receive. That could be only mp3 files, or all files inside a+given subdirectory, or all files *not* in a given subdirectory. That means+that when the assistant detects a file has been moved, it'll need to add+(or remove) a queued transfer. Lots of other things could be matched on,+like file size, number of copies, etc. Oh look, I have a+[beautiful library I wrote earlier](http://joeyh.name/blog/entry/happy_haskell_hacker)+that I can reuse!
@@ -0,0 +1,33 @@+Implemented `git annex drop --all`. This also added for free drop with+`--unused` and `--key`, which overlap with `git annexdropunused` and+`git annex dropkey`.++The `concurrentprogress` branch had gone too long without being merged, and+had a lot of merge conflicts. I resolved those, and went ahead and merged+it into master. However, since the ascii-progress library is not ready yet,+I made it a build flag, and it will build without it by default. So, `git+annex get -J5` can be used now, but no progress bars will display yet.++When doing concurrent downloads, either with the new -J or by hand by+running multiple processes, there was a bug in the diskreserve+checking code. It didn't consider the disk space that was in the process of+being used by other concurrent downloads, so would let more downloads+start up than there was space for.++I was able to fix this pretty easily, thanks to the transfer log files.+Those were originally added just to let the webapp display transfers, but+proved very helpful here!++Finally, made .git/annex/transfer/failed/ files stop accumulating when the+assistant is not being used. Looked into also cleaning up stale+.git/annex/transfer/{upload,download}/ files (from interrupted transfers).+But, since those are used as lock files, it's difficult to remove them+in a concurrency safe way.++Update: Unfortunately, I turned out to have stumbled over an apparent bug+in haskell's implementation of file locking.+<https://github.com/haskell/unix/issues/44> Had to work around that.++Happily, the workaround also let me implement cleanup of stale transfer+info files, left behind when a git-annex process was interrupted. So,+.git/annex/transfer/ will entirely stop accumulating cruft!
@@ -0,0 +1,20 @@+Today I added a feature to `git annex unused` that lets the user tune which+refs they are interested in using. Annexed objects that are used by other+refs then are considered unused.++Did a fairly complicated refspec format for this, with globs and+include/exclude of refs. Example:++ +refs/heads/*:+HEAD^:+refs/tags/*:-refs/tags/old-tag++----++I think that, since Google dropped openid support, there seems to have been+less activity on this website. Although possibly also a higher signal to+noise ratio. :) I have been working on some ikiwiki changes to make it+easier for users who don't have an openid to contiribute. So git-annex's+website should soon let you log in and make posts with just an email address.++People sometimes ask for a git-annex mailing list. I wouldn't mind having+one, and would certianly subscribe, but don't see any reason that I should+be involved in running it.
@@ -0,0 +1,44 @@+There's something rotten in POSIX fctnl locking. It's not composable,+or thread-safe.++The most obvious problem with it is that if you have 2 threads, and they+both try to take an exclusive lock of the same file (each opening it+separately) ... They'll both succeed. Unlike 2 separate processes,+where only one can take the lock.++Then the really crazy bit: If a process has a lock file open and fcntl+locked, and then the same process opens the lock file again, for any+reason, closing the new FD will release the lock that was set+using the other FD.++So, that's a massive gotcha if you're writing complex multithreaded code.+Or generally for composition of code. Of course, C programmers deal with+this kind of thing all the time, but in the clean world of Haskell, this is+a glaring problem. We don't expect to need to worry about this kind of+unrelated side effect that breaks composition and thread safety.++After noticing this problem affected git-anenx in at least one place,+I have to assume there could be more. And I don't want to need to worry+about this problem forever. So, I have been working today on a clean fix+that I can cleanly switch all my lock-related code to use.++One reasonable approach would be to avoid fcntl locking, and use flock.+But, flock works even less well on NFS than fcntl, and git-annex relies on+some fcntl locking features. On Linux, there's an "open file description+locks" feature that fixes POSIX fnctl locking to not have this horrible+wart, but that's not portable.++Instead, my approach is to keep track of which files the process has+locked. If it tries to do something with a lockfile that it already has+locked, it avoids opening the same file again, instead implements its own+in-process locking behavior. I use STM to do that in a thread-safe manner.++I should probably break out git-annex's lock file handling code as a+library. Eventually.. This was about as much fun as a root canal, and I'm+having a real one tomorrow. :-/++----++git-annex is now included in [Stackage](http://www.stackage.org/)!++Daniel Kahn Gillmor is doing some work on reproducible builds of git-annex.
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://pnijjar.livejournal.com/"+ ip="99.236.22.229"+ subject="comment 1"+ date="2013-08-31T00:05:16Z"+ content="""+Do we need to update our RSS feeds? I appear to be getting your devblog posts in my old feed, but I do not know whether that will continue working.+"""]]
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawmkBwMWvNKZZCge_YqobCSILPMeK6xbFw8"+ nickname="develop"+ subject="comment 2"+ date="2013-08-31T10:03:04Z"+ content="""+The old RSS feed will continue working.++So sit back, relax, and enjoy the show.+"""]]
@@ -1,4 +0,0 @@-Aggregating git-annex mentions from elsewhere on the net..--* [[!aggregate expirecount=25 name="twitter" feedurl="http://tmp.kitenet.net/git-annex-twitter.rss" url="http://search.twitter.com/search.atom?q=git-annex"]]-
@@ -0,0 +1,8 @@+The output of `git annex info` includes this:++ 34xx3351-xx14-4039-6xxx-xxx9x5xxxxxx -- wx550 (wx312)+ 9x9x07xx-x6x9-464x-7x5x-x3xx42xx7x70 -- wx550++What does this mean? Do I have two different repos both named wx550?+What is wx312? +
@@ -0,0 +1,14 @@+Hi, I'm using the webapp and created a repository on my local computer. Then I created another remote repository (encrypted remote with gcrypt), this remote repository is selected as type "full backup". ++I've added some files to the local repository, then changed some of them and watched the sync happen. Then I deleted some files, and these also get synced to the remote.++Now, how can I recover those files from the foreign repo, using the webapp or the command line? I could not find any solution.++I tried:+git log --diff-filter=D --summary+and then+git checkout 488408bfcd58eced685d9e3ca5daf55250850f5d -- .+to recover the file listed in this remote but got the following response:+fatal: This operation must be run in a work tree++What do I miss and how does the "Restore" part work when using "full backup" remote repository?
@@ -0,0 +1,9 @@+I have a repository on my laptop with a single remote on a USB drive. Both were created without the assistant.++The remote holds all the content. My understanding is that this would be a "backup" repository, using the group definitions.++The local repository generally holds no content. When I want a file, I make sure the remote is available, and then I `git annex get` it.++This works fine in git annex, but I'm now experimenting with the assistant. As soon as I fire up the assistant, it starts downloading all of the data from the remote. I don't ever want it to automatically get any content from the remote. If it sees new content in the repository, I would like it to push that out to the remote. But never get anything from the remote, and never drop anything that is in the repository.++How can I setup this behaviour in the assistant? I have set the remote's repository group to "backup". The local repository is not in any group, since none of the groups fit my model for this repo.
@@ -0,0 +1,21 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawkeJKC5Sy0stmcTWyePOLEVv0G-x1yaT_w"+ nickname="Josef"+ subject="wishlist"+ date="2013-09-26T11:11:19Z"+ content="""+Posted the above yesterday before realizing that it should probably go to wishlist requests. I am sorry about that.++Basically it is a request to extend import options and perhaps make the options easier to use/understand.++Suggested Import Options:++- source directory,+- destination directory,+- deduplicate in annex ( yes, no )+- delete source files ( yes, no )+- trial run ( screen output only )++Many thanks for a great product!++"""]]
@@ -0,0 +1,17 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawkeJKC5Sy0stmcTWyePOLEVv0G-x1yaT_w"+ nickname="Josef"+ subject="Additional Comments"+ date="2013-09-30T21:33:31Z"+ content="""+Imported several thousand files to annex and would like to add the following comments:++- it would be great to have an option to exclude hidden dot files from import,++- empty directories should be deleted when files located in the directories are deleted,++- \"git annex add\" seems to process directories and files alphabetically, unfortunately import processes files in a different order, which makes it hard to predict which files are deleted when deduplicating,++Cheers,++"""]]
@@ -0,0 +1,9 @@+I want to import from an SD card to a mounted annex:++ user@laptop:/media/.../annex/Pictures/(master)$ git annex import /media/.../sdcard/Download/QuickTransfer+ [...]+ git-annex: /media/.../sdcard/Download/QuickTransfer/20150428_192110.jpg: rename: unsupported operation (Invalid cross-device link)+ [...]++Why is it trying to make a cross-device link? As long as it can read the files, +it should be OK, no?
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="209.250.56.47"+ subject="comment 1"+ date="2013-11-05T16:17:22Z"+ content="""+In the git-annex webapp, each repository has a settings menu with \"delete repository\".+"""]]
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawkzwmw_zyMpZC9_J7ey--woeYPoZkAOgGw"+ nickname="dxtrish"+ subject="comment 2"+ date="2013-11-05T17:46:02Z"+ content="""+When I use that Delete button it seems to still have records of it+because when I delete the repo on the other end and create a new bare+one it complains about some UUID mismatch.+"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="209.250.56.47"+ subject="comment 3"+ date="2013-11-05T18:03:26Z"+ content="""+Hmm well, it's true that deleting a repository does not clean out any git remotes that other repositories might have configured using it, and the uuid of the old remote is cached in there. This is only a problem if you put back another repository in the same location as the old one. `git remote remove` should clean that up for you.+"""]]
@@ -0,0 +1,11 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawkzwmw_zyMpZC9_J7ey--woeYPoZkAOgGw"+ nickname="dxtrish"+ subject="comment 4"+ date="2013-11-06T14:24:21Z"+ content="""+That is exactly what I have wanted to do a couple of times now and 'git remote remove' does not seem to remove it all either.+When I try to create a new repository in the same place it still complains about that darn UUID :)++What is working is to manually add the new UUID to .git/config+"""]]
@@ -0,0 +1,13 @@+Hello everyone,++I have some PDF documents in a git annex repository. I appended a page to (several) of these PDF documents the following way:++- `git annex edit file.pdf`+- Append page to file.pdf+- `git annex add file.pdf`+- `git commit`++If I now look at file.pdf it will not have the appended page. But if do `git annex edit file.pdf` again I will get the version with the appended page. `git annex add file.pdf` and the page "disappears" again. Anyone got any tips on how to solve this "mystery"?++All the best,+Per
@@ -0,0 +1,11 @@+Hello Joey,++I just want to know if file transfers between three inter-connected repositories somehow gets syncronized. I have a laptop, a local file server in my home and a virtual server on the internet.++Both my laptop and my file server are configured with a full git repository and connected through pairing and xmpp. The server on the internet is configured as a rsync special remote.++I want the local file server to hold a copy of everything in my annex, the rsync remote should get everything except the folder "media" (too large to upload and not that important) and the laptop whatever I manually decide (preferred content is set to "present").++I have added some files to the repository on the local file server and transferred their content to my laptop by using "git annex get". But when I started the web interface, I saw that those files who are present on both the file server and on the laptop get uploaded to the remote server from both computers, often the same file at the same time. Previously I though the two assistants would somehow talk to each other via xmpp so that doubled effort like that would be avoided. I'm also worried about data consistency because two apparently separate processes rsync to the same remote repository at the same time.++So my question would be: Is your xmpp protocol designed to deal with situations like this and I did not set it up correctly or is what I'm trying to accomplish simply not (yet) possible?
@@ -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]
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="4.154.1.10"+ subject="comment 1"+ date="2013-07-22T19:13:38Z"+ content="""+To build the WebApp on arm, you need a ghc that supports template haskell on arm. While I have heard persistent rumors of such a thing existing, I have yet to see it.++It's possible to build the WebApp on arm without that, but it's a complicated process, involving first building on x86 with the same versions of the haskell libraries that you have on the arm system, and then using the EvilSplicer to generate a source tree with the template haskell expanded, which can then be built on arm. This build process is not really suitable for a Debian package.+"""]]
@@ -0,0 +1,19 @@++So much time gone by after the kickstarter and now I wanted to give it a kick finally.+I set up everything on my linux desktop with no problems at all.++I configured a ssh remote with shared encryption key.++Then I tried to use this to share files with a windows Desktop. This is where problems started.++1. Since there is no jabber sync I need to exchange keys manually. But although I read and googled for hours I just found that it would be there in the git repo somewhere in plain text. I didnt find a command to actually display it on the command line.+2. I need to setup the (existing) ssh remote on windows manually, because I could not make the webapp recognize the ssh-keys from pageant. Also, unfortunately, all examples refer to s3. I didnt even find out which type I had to specify. There seems to be no comprehensive list of repository types for the cmdline and their required arguments respectively at all. The man page says "type=..." for the three-line description of shared encryption setups which appeared like a mockery to me. Since the remote does not have git metadata I also can not use git clone.+3. The docs say initremote would only be used on fresh remotes, not existing ones. But enableremote only enables remotes that are already configured. So what am I to do here?++Could someone tell me please++1. How to find the shared key+2. How to add the ssh remote properly+3. Where 1 and 2 are documented++Thank you!
@@ -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.+"""]]
@@ -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.+"""]]
@@ -0,0 +1,71 @@+[[!comment format=mdwn+ username="rasmus"+ ip="146.185.23.178"+ subject="comment 12"+ date="2014-09-19T00:43:56Z"+ content="""+Hi Joey,++Thanks for giving the thread a more appropriate title and thanks for the helpful messages. ++Let me start with the easy points:+++* Looking at my log file of installed packages I have never used `etckeeper` on my system. So unless it could have entered through `annex` then I think we can rule that one out. +* According to `git log` the repos are from January 2014 where I restarted my repos. +++ commit 029a8e76ab5f66aa4390987130985550a1ccd69c+ Author: Rasmus <w530@domain.eu>+ Date: Thu Jan 23 21:06:13 2014 +0100++ created repository+++* When I start git repos I typically just use \"init\" so I don't think I did the 2012 commits. +* I checked out one of the 74mb files. When I do `file test.blob` it shows `test.blob: GPG symmetrically encrypted data (CAST5 cipher)`. But none of my normal passwords worked. Could such a gpg'ed file be from local network connections where the assistant asks for a passphrase? I'm pretty sure that my transfer repo has only been using `gcrypt` and I believe I \"restarted\" my repos because I switched to `gcrypt` repos. Also, my transfer repo is 10Gb as well which sounds big for transfer repo. ++I performed a similar \"analysis\" on the `conf.annex` repo which should contain mostly no binary files (some 16x16 pngs etc). ++`conf.annex` has 727 unreachable objects and 3477 commits in total. Of these 338 are commits. Here's an example of a larger commit message of an unreachable commit.++ commit 601c10f9512e8d3502d9dd52ef409560ebb5b7e0+ Author: root <root@localhost>+ Date: Mon Dec 31 19:00:01 2012 -0400++ Initial commit++ diff --git a/6fbbea493cdec9d912d256374199cc4c012022d35524c8789a7aceeb953442a5 b/6fbbea493cdec9d912d256374199cc4c012022d35524c8789a7aceeb953442a5+ new file mode 100644+ index 0000000..ea5fcc3+ Binary files /dev/null and b/6fbbea493cdec9d912d256374199cc4c012022d35524c8789a7aceeb953442a5 differ+ diff --git a/91bd0c092128cf2e60e1a608c31e92caf1f9c1595f83f2890ef17c0e4881aa0a b/91bd0c092128cf2e60e1a608c31e92caf1f9c1595f83f2890ef17c0e4881aa0a+ new file mode 100644+ index 0000000..a86c1a9+ Binary files /dev/null and b/91bd0c092128cf2e60e1a608c31e92caf1f9c1595f83f2890ef17c0e4881aa0a differ+ diff --git a/9da3fcfc1635c674012c35d90c21adce3c35440e629d64fe117fe349a6b3e194 b/9da3fcfc1635c674012c35d90c21adce3c35440e629d64fe117fe349a6b3e194+ new file mode 100644+ index 0000000..ef1d71c+ Binary files /dev/null and b/9da3fcfc1635c674012c35d90c21adce3c35440e629d64fe117fe349a6b3e194 differ+ diff --git a/ad4ae79c29b3756f7e41257db7454f3c319112d06385a8bc12d28209a82f2594 b/ad4ae79c29b3756f7e41257db7454f3c319112d06385a8bc12d28209a82f2594+ new file mode 100644+ index 0000000..61d3e5b+ Binary files /dev/null and b/ad4ae79c29b3756f7e41257db7454f3c319112d06385a8bc12d28209a82f2594 differ+ diff --git a/bd0e9cb492077e0c090bc62892c8de438c51a956c8215b2c68de7caa7e2431cc b/bd0e9cb492077e0c090bc62892c8de438c51a956c8215b2c68de7caa7e2431cc+ new file mode 100644+ index 0000000..92e9bd7+ Binary files /dev/null and b/bd0e9cb492077e0c090bc62892c8de438c51a956c8215b2c68de7caa7e2431cc differ++Across all commits 6006 objects are mentioned, but only 371 are unique. ++I checked out one blob and again `file` reports `GPG symmetrically encrypted data (CAST5 cipher)`. Interesting for `conf.annex` I get this line when trying to decrypt++ gpg: DBG: cleared passphrase cached with ID: SBF83A0F822D0F664+++For `doc.annex` I get++ gpg: DBG: cleared passphrase cached with ID: S32DEAD1E8DD06A4D++And on my other computer I see a third ID. I'm not sure if this means anything when files are symmetrically encrypted, though. +"""]]
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="108.236.230.124"+ subject="I know what it is now"+ date="2014-09-19T02:43:22Z"+ content="""+These objects are the ones written by git-remote-gcrypt when pushing to a remote. That's why the weird dates, root pseudo-commit, crazy filenames, and big gpg encrypted blobs. All countermeasures that git-remote-gcrypt uses to keep your encrypted git remote safe and not leak information about what's in it.++So, this is a bug in git-remote-gcrypt. It needs to clean these objects up after pushing them! (Also after failed pushes.)+"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="108.236.230.124"+ subject="comment 14"+ date="2014-09-19T02:59:36Z"+ content="""+<https://github.com/bluss/git-remote-gcrypt/issues/16>+"""]]
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="rasmus"+ ip="217.130.110.20"+ subject="comment 15"+ date="2014-09-19T06:29:58Z"+ content="""+Brilliant! Thanks for taking time to analyze the issue and taking the bug to `gcrypt`.++[I'm surprised that a different key than my git-annex key is used and that it's a symmetric key, but I will explore the technology on my own].+"""]]
@@ -0,0 +1,15 @@+I keep a repo synced between machines over ssh. Assuming all the files are in sync, so no actual file transfer needs to takes place, when I do++```+git annex copy --fast --quiet --to blah+```++is quite slow, about 10 seconds, using 100% CPU on one core, just to decide nothing needs to be done. On the other hand, doing++```+ git annex copy --fast --quiet --from blah+```++takes about 1 second.++I'm confused, as it seems to me that, since I'm using --fast, both transactions should use only locally available data, and both should need about the same amount of computing. Am I missing something? Can this be fixed?
@@ -0,0 +1,6 @@+I propose to add some functionality to git-annex, to automatically "throttle" the data retrieval from amazon glacier to stay within the daily free retrieval allowance. If someone would need to get his/her files faster, there should be an option to disable this throttling (or even better, specify the retrieval rate).++As far as I understand glacier, this could be implemented using range retrievals. In short range retrievals enable you, to only retrieve a part of an archive in glacier. This can be used to only retrieve / request so much data, that you stay within the free retrieval allowance. ( please see [Q: Why would I retrieve only a range of an archive?](http://aws.amazon.com/glacier/faqs/#Why_would_I_retrieve_only_a_range_of_an_archive) ).+++This would be somewhat similar to the [smart retrieval feature in cloudberry](http://blog.cloudberrylab.com/2012/12/introducing-smart-restore-for-amazon.html) .
@@ -0,0 +1,5 @@+I fear that while using git annex I will at some point accidentally `git add` some small files and not notice it until the only way to fix the problem is to rewrite history. What would be the best way to prevent myself from ever `git add`-ing a file into my annex repository instead of `git annex add`-ing it?++And secondly, how can I best search in my git annex repository whether I already did this mistake in the past or not? Currently I'm using this which returns everything that's not a symlink or a git submodule:++ git ls-files -s | awk ' $1 != 120000 && $1 != 160000 { print $4 }'
@@ -0,0 +1,3 @@+A couple times working in an annex manually, I accidentally did "git add" instead of "git annex add" and ended up with files checked into my repo instead of symlinks. So now there is some file content in git, rather than in the annex. Is there any way to root that out, or is it there forever? (My limited knowledge of git says: it's there forever, unless maybe you go into the branches where it lives, do an interactive rebase to the time before it was added, remove that commit, replay history, and then garbage collect, but I have no idea if that would suddenly break git annex, and it sounds painful anyway.)++If say I were a neat freak and wanted to just start over with a clean annex, I imagine the thing to do would be to just start the hell over -- and if I wanted to do that, the way to go would be to get into a full repository, do a "git annex uninit" and then throw away the .git directory, then do "git init" and "git annex init" and then "git annex add ." ?
@@ -0,0 +1,2 @@+Is that really unsafe? Because I did that and the switch to direct mode seemed to leave a lot of files still as links, and when I panicked and switched back to indirect mode, a whole lot of stuff seemed to have become unannexed and I reannexed it.+
@@ -0,0 +1,27 @@+I am running git-annex on Mac OS 10.9 and syncing to a Linux device that was attached to a Synology NAS. Both were running December versions of git-annex.++While working on an application in IntelliJ my workspace.xml file disappeared. It went from being a real file to being a symlink to a location that didn't exist.++The symlink looks like this: workspace.xml -> ../../../.git/annex/objects/M2/8W/SHA256E-s68106--90e9cc4f617c9034db1bf462d058b82c59ade0be58de1d3a3e2f8c02606631c2.xml/SHA256E-s68106--90e9cc4f617c9034db1bf462d058b82c59ade0be58de1d3a3e2f8c02606631c2.xml++I tried git-annex fsck and I get this message: ** No known copies exist of XXXXXXX/workspace.xml++"XXXXXXX" is a path I needed to obscure I can see it in the git-annex repo but it is a reference to a symlink that doesn't exist++It was mentioned in another thread ( http://git-annex.branchable.com/forum/git_annex_on_osx_only_creating_symlinks__63____63__/ ) that this could happen if I did a forced drop but I do not use git-annex on the command line. I'm using the assistant and having it manage all of my files for me.++I tried looking at the log for it and it shows this:++<pre>+timmattison$ /Applications/git-annex.app/Contents/MacOS/git-annex log XXXXXXX/.idea/workspace.xml +- 2014-01-03 19:49:58 XXXXXXX/.idea/workspace.xml | d6747880-b355-4d41-b4e5-d1ad3afcb4a5 -- timmattison@MacBook-Pro.local:~/Desktop/annex++ 2014-01-03 17:08:32 XXXXXXX/.idea/workspace.xml | d6747880-b355-4d41-b4e5-d1ad3afcb4a5 -- timmattison@MacBook-Pro.local:~/Desktop/annex+(Recording state in git...)+</pre>++So I can see that the git-annex thinks the file was deleted but what really happened is that IntelliJ just modified it. workspace.xml files are modified very often when working in IntelliJ.++Is this a known bug that has been fixed in the new version (2013-12-30 or later)?++Thanks,+Tim
@@ -24,6 +24,11 @@ Use this option to copy the content of files from the local repository to the specified remote. +* `--jobs=N` `-JN`++ Enables parallel transfers with up to the specified number of jobs+ running at once. For example: `-J10`+ * `--auto` Rather than copying all files, only copy files that don't yet have
@@ -35,6 +35,21 @@ the last repository that is storing their content. Data loss can result from using this option. +* `--all`++ Rather than specifying a filename or path to drop, this option can be+ used to drop all available versions of all files.++ This is the default behavior when running git-annex drop in a bare repository.++* `--unused`++ Drop files found by last run of git-annex unused.++* `--key=keyname`++ Use this option to drop a specified key.+ * file matching options The [[git-annex-matching-options]](1)
@@ -27,6 +27,11 @@ Any files that are not available on the remote will be silently skipped. +* `--jobs=N` `-JN`++ Enables parallel download with up to the specified number of jobs+ running at once. For example: `-J10`+ * `--all` Rather than specifying a filename or path to get, this option can be
@@ -31,6 +31,11 @@ Use the remote as the source repository, and mirror its contents to the local repository. +* `--jobs=N` `-JN`++ Enables parallel transfers with up to the specified number of jobs+ running at once. For example: `-J10`+ * `--all` Mirror all objects stored in the git annex, not only objects used by
@@ -22,6 +22,11 @@ Use this option to move the content of files from the local repository to the specified remote. +* `--jobs=N` `-JN`++ Enables parallel transfers with up to the specified number of jobs+ running at once. For example: `-J10`+ * `--all` Rather than specifying a filename or path to move, this option can be
@@ -38,6 +38,10 @@ This checks if all specified keys are present in the annex, and exits zero if so. + Exits 1 if the key is certianly not present in the annex.+ Exits 100 if it's unable to tell (perhaps the key is in the process of+ being removed from the annex).+ * dropkey directory [key ...] This drops the annexed data for the specified keys.
@@ -15,7 +15,7 @@ contents of that directory. Running undo a second time will undo the undo, returning the working-tree to the same state it had before. In order for undoing an undo of+tree to the same state it had before. To support undoing an undo of staged changes, any staged changes are first committed by the undo command.
@@ -26,7 +26,40 @@ * `--from=remote` - Check for unused data on a remote.+ Check for unused data that is located on a remote.++* `--used-refspec=+ref:-ref`++ By default, any data that the work tree uses, or that any refs in the git+ repository point to is considered to be used. If you only want to use+ some refs, you can use this option to specify the ones to use. Data that+ is not in the specified refs (and not used by the work tree) will then be+ considered unused.++ The git configuration annex.used-refspec can be used to configure+ this in a more permanent fashion.++# REFSPEC FORMAT++The refspec format for --used-refspec is a colon-separated list of+additions and removals of refs. For example:++ +refs/heads/*:+HEAD^:+refs/tags/*:-refs/tags/old-tag++This adds all refs/heads/ refs, as well as the previous version+of HEAD. It also adds all tags, except for old-tag.++This refspec is processed by starting with an empty set of refs,+and walking the list in order from left to right.++* Each + using a glob is matched against all relevant refs+ (a subset of `git show-ref`) and all matching refs are added+ to the set.+ For example, "+refs/remotes/*" adds all remote refs.+* Each + without a glob adds the literal value to the set.+ For example, "+HEAD^" adds "HEAD^".+* Each - is matched against the set of refs accumulated so far.+ Any matching refs are removed from the set. # SEE ALSO
@@ -813,6 +813,11 @@ When importfeed is used, it stores additional metadata from the feed, such as the author, title, etc. +* `annex.used-refspec`++ This controls which refs `git-annex unused` considers to be used.+ See REFSPEC FORMAT in [[git-annex-unused]](1) for details.+ * `annex.queuesize` git-annex builds a queue of git commands, in order to combine similar
@@ -2,12 +2,6 @@ [[!sidebar content=""" [[!inline feeds=no template=bare pages=sidebar]]--[[Feeds]]:--<small>-[[!inline pages="internal(feeds/*)" archive=yes show=8 feeds=no]]-</small> """]] <table>
@@ -0,0 +1,17 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawlDDW-g2WLLsLpcnCm4LykAquFY_nwbIrU"+ nickname="Daniel"+ subject="comment 3"+ date="2013-01-15T15:22:43Z"+ content="""+Installing via the MacPorts method. I ran into this error.++ \"_locale_charset\", referenced from: _localeEncoding in libHSbase-4.5.1.0.a(PrelIOUtils.o) + ld: symbol(s) not found for architecture x86_64++I was able to solve and get git-annex to build buy providing the --extra-lib-dirs parameter++ cabal install c2hs git-annex --bindir=$HOME/bin --extra-lib-dirs=/usr/lib++Cheers, [Daniel Wozniak](http://woz.io)+"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawnaYy6kTuKAHmsa4BtGls2oqa42Jo2w2v0"+ nickname="Pere"+ subject="Segmentation Fault"+ date="2013-01-19T16:10:08Z"+ content="""+I guess my adventure ends here. :'(+"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawmyFvkaewo432ELwtCoecUGou4v3jCP0Pc"+ nickname="Eric"+ subject="Updating to latest build"+ date="2013-01-25T06:05:35Z"+ content="""+What is the appropriate way to update to the latest build of git-annex using cabal?+"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawnaYy6kTuKAHmsa4BtGls2oqa42Jo2w2v0"+ nickname="Pere"+ subject="git annex on Snow Leopard"+ date="2013-01-25T14:36:52Z"+ content="""+Is there any way I can try to solve or by-pass the Segmentation Fault I commeted before? +"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="4.154.3.125"+ subject="comment 13"+ date="2013-02-05T19:46:29Z"+ content="""+@eric `cabal update && cabal upgrade git-annex`+"""]]
@@ -0,0 +1,9 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawmCmNS-oUgYfNg85-LPuxzTZJUp0sIgprM"+ nickname="Jonas"+ subject="more homebrew"+ date="2013-02-16T19:46:47Z"+ content="""+i had macports installed. then i installed brew, instaled haskell via brew. i needed to set + PATH=$HOME/bin:/usr/local/bin:$PATH+"""]]
@@ -0,0 +1,35 @@+[[!comment format=mdwn+ username="https://launchpad.net/~wincus"+ nickname="Juan Moyano"+ subject="git annex on Snow Leopard"+ date="2013-03-26T16:02:54Z"+ content="""+I'm having the same issue as @Pere, with a newer version of DAV :(++cabal: Error: some packages failed to install:+DAV-0.3.1 failed during the building phase. The exception was:+ExitFailure 11+git-annex-4.20130323 depends on shakespeare-css-1.0.3 which failed to install.+persistent-1.1.5.1 failed during the building phase. The exception was:+ExitFailure 11+persistent-template-1.1.3.1 depends on persistent-1.1.5.1 which failed to+install.+shakespeare-css-1.0.3 failed during the building phase. The exception was:+ExitFailure 11+yesod-1.1.9.2 depends on shakespeare-css-1.0.3 which failed to install.+yesod-auth-1.1.5.3 depends on shakespeare-css-1.0.3 which failed to install.+yesod-core-1.1.8.2 depends on shakespeare-css-1.0.3 which failed to install.+yesod-default-1.1.3.2 depends on shakespeare-css-1.0.3 which failed to+install.+yesod-form-1.2.1.3 depends on shakespeare-css-1.0.3 which failed to install.+yesod-json-1.1.2.2 depends on shakespeare-css-1.0.3 which failed to install.+yesod-persistent-1.1.0.1 depends on shakespeare-css-1.0.3 which failed to+install.+yesod-static-1.1.2.2 depends on shakespeare-css-1.0.3 which failed to install.++++*Any ideas?*+++"""]]
@@ -0,0 +1,36 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawkurjhi0CRJvgm7QNaZDWS9hitBtavqIpc"+ nickname="Bret"+ subject="Snow Leopard Issues"+ date="2013-04-14T20:17:17Z"+ content="""+I was able to build snow leopard completely for the first time over last night (it took a very long time to build all the tools and dependancies). Woohoo!++The way I was able to fully build on a 32-bit 10.6 machine was this++1. Delete ~/.ghc and ~/.cabal. They were full of random things and were causing problems.+2. `brew uninstall ghc and haskell-platform`+3. `brew update`+4. `brew install git ossp-uuid md5sha1sum coreutils libgsasl gnutls libidn libgsasl pkg-config libxml2`+5. `brew upgrade git ossp-uuid md5sha1sum coreutils libgsasl gnutls libidn libgsasl pkg-config libxml2` (Some of these were already installed/up to date.+6. `brew link libxml2`+7. `brew install haskell-platform` (This takes a long, long time).+8. `cabal update` (assuming you have added `~/.cabal/bin` to your path+9. `cabal install cablal-install`+10. `cabal install c2hs`+11. `cabal install git-annex`+++It also appears to be running fairly smoothly than it had in the past on a 32-bit SL system. Thats also neat. ++The problem is that it seems to not really work as git annex though, probably due to the error relating you get when you start up the webapp:+Running+`git annex webapp` +The browser starts up, and I get 3 of these errors:+`Watcher crashed: Need at least OSX 10.7.0 for file-level FSEvents`++Pairing with a local computer appears to work to systems running 10.7, but when you complete the process, they never show up in the repository list.+++Also on a side note, when running `git annex webapp` it triggers the opening of an html file in whatever the default html file handler is. I edit a lot of html, so for me that is usually a text editor. I had to change the file handler to open html files with my web browser for the `git annex webapp` to actually work. Is there a way to change that so that `git annex webapp` uses the default web browser for the system rather than the default html file handler?+"""]]
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ nickname="joey"+ subject="comment 17"+ date="2013-04-16T20:31:10Z"+ content="""+@Bret, the assistant relies on FSEvents pretty heavily. It seems to me your best bet is to upgrade OSX to a version that supports FSEvents.++You can certainly use the rest of git-annex on Snow Leopard without FSEvents.+"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawkurjhi0CRJvgm7QNaZDWS9hitBtavqIpc"+ nickname="Bret"+ subject="Can't update"+ date="2013-04-18T00:58:19Z"+ content="""+The laptop is one of the first macbook pro's with a 32 bit chip, which apple dropped support for in 10.7, so the furthest it can update to is 10.6.x. :(+"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://edheil.wordpress.com/"+ ip="99.54.57.201"+ subject="comment 19"+ date="2013-04-18T02:05:34Z"+ content="""+sounds like a prime candidate for a nice lightweight linux distro ;)+"""]]
@@ -0,0 +1,12 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawmRFKwny4rArBaz-36xTcsJYqKIgdDaw5Q"+ nickname="Andrew"+ subject="comment 22"+ date="2013-07-25T02:19:53Z"+ content="""+Rather than specifying --bindir on the command line for cabal, I edited my ~/.cabal/config to add this line:++ symlink-bindir: /usr/local/bin++This installs the binaries to ~/.cabal/bin but symlinks them into /usr/local/bin alongside the links that homebrew installs. Additionally, I symlinked /usr/local/bin/git-annex-shell to /usr/local/bin/git-annex which made things work great from remote hosts via ssh.+"""]]
@@ -0,0 +1,30 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawmL8pteP2jbYJUn1M3CbeLDvz2SWAA1wtg"+ nickname="Kristian"+ subject="Build failure using Haskel Platform"+ date="2013-09-15T18:49:01Z"+ content="""+I get this error when I try to build git-annex using \"cabal install git-annex\"++ [ 34 of 347] Compiling Utility.Misc ( Utility/Misc.hs, dist/build/git-annex/git-annex-tmp/Utility/Misc.o )+ [ 35 of 347] Compiling Utility.Process ( Utility/Process.hs, dist/build/git-annex/git-annex-tmp/Utility/Process.o )+ [ 36 of 347] Compiling Utility.Network ( Utility/Network.hs, dist/build/git-annex/git-annex-tmp/Utility/Network.o )+ [ 37 of 347] Compiling Utility.SRV ( Utility/SRV.hs, dist/build/git-annex/git-annex-tmp/Utility/SRV.o )+ + Utility/SRV.hs:70:54:+ Couldn't match expected type `Maybe+ [(Int, Int, Integer, B8.ByteString)]'+ with actual type `Either+ dns-1.0.0:Network.DNS.Internal.DNSError+ [(Int, Int, Int, dns-1.0.0:Network.DNS.Internal.Domain)]'+ In the third argument of `maybe', namely `r'+ In the second argument of `($)', namely+ `maybe [] (orderHosts . map tohosts) r'+ In a stmt of a 'do' block:+ return $ maybe [] (orderHosts . map tohosts) r+ Failed to install git-annex-4.20130909+ cabal: Error: some packages failed to install:+ git-annex-4.20130909 failed during the building phase. The exception was:+ ExitFailure 1++"""]]
@@ -0,0 +1,12 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="4.152.108.128"+ subject="comment 24"+ date="2013-09-17T15:56:17Z"+ content="""+@Kristian, a new version of the DNS library has caused this. A workaround is to pass `-f-DNS` to the cabal command.++I am in the process of adding support for the new DNS library version in git now.++By the way, please [[file_a_bug|bugs]] if you have a big ugly looking build failure like that, so as to not clutter up this page.+"""]]
@@ -0,0 +1,14 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawnZEanlyzay_QlEAL0CWpyZcRTyN7vay8U"+ nickname="Carlo"+ subject="comment 27"+ date="2013-10-16T09:40:23Z"+ content="""+The [FSevents framework itself has been around since leopard](http://arstechnica.com/apple/2007/10/mac-os-x-10-5/7/).++[This fsevents wrapper project](https://github.com/rastersize/CDEvents) supports snow leopard and even leopard, maybe it will provide some clues on how it was done.++I'm guessing it would be worth it, [snow leopard is still the most popular OSX as of April](http://www.patentlyapple.com/patently-apple/2013/04/snow-leopard-remains-the-most-popular-version-of-os-x.html). From my own experience, snow leopard is a huge life extender for 2+ year old hardware. Lion just makes them sluggishly painful to use.++Maybe someone could volunteer an SL machine for remote development? Sorry, mine are tied down :(+"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="64.134.31.139"+ subject="comment 27"+ date="2013-10-16T15:14:53Z"+ content="""+The git-annex assistant uses **file level** FSevents to detect which files have been changed. Would it be possible to make it work with older versions that don't provide file-level events? Probably. The code for BSD kqueue deals with similar limitations in needing to scan the directory to find the files that actually changed. If someone cares about old versions of OSX and wants to do that work I'll happily support you.+"""]]
@@ -0,0 +1,18 @@+[[!comment format=mdwn+ username="http://alan.petitepomme.net/"+ nickname="Alan Schmitt"+ subject="dbus support?"+ date="2013-10-18T08:24:11Z"+ content="""+Hello,++I just compiled git-annex using cabal on OS X, and I see there is no dbus support:++ Assistant/Threads/NetWatcher.hs:26:0:+ warning: #warning Building without dbus support; will poll for network connection changes+ + Assistant/Threads/MountWatcher.hs:33:0:+ warning: #warning Building without dbus support; will use mtab polling++Is this problematic? I see I can install dbus using homebrew. If I do so, will I have dbus support (after recompiling git-annex)?+"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawnZEanlyzay_QlEAL0CWpyZcRTyN7vay8U"+ nickname="Carlo"+ subject="comment 29"+ date="2013-10-18T15:58:59Z"+ content="""+I think I dragged you out of dev mode for commenting unnecessarily, sorry about that. Apparently, [Lion](http://www.redmondpie.com/os-x-lion-vs-os-x-snow-leopard-head-to-head-performance-showdown/) and [Mountain Lion are fine on older hardware](http://apple.stackexchange.com/questions/58453/will-mountain-lion-make-an-older-computer-run-faster-or-slower). For a while [a daemon cause Lion slowdowns for a day after upgrade](https://discussions.apple.com/message/15719036) for a while, which was enough to cause a reputation.+"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="64.134.31.139"+ subject="comment 30"+ date="2013-10-19T15:31:45Z"+ content="""+@Alan you don't need to install dbus on OSX. The polling code will work. On the other hand if you'd like to experiment with installing dbus and report back, perhaps it's worth a try. It's nice when the git-annex assistant can instantly detect when drives are plugged in, and then the network connection changes and react to it. On Linux, dbus gives it that capability.+"""]]
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="http://alan.petitepomme.net/"+ nickname="Alan Schmitt"+ subject="dbus and homebrew"+ date="2013-10-20T17:25:04Z"+ content="""+I'm trying to build git-annex with dbus support, and even though I installed dbus (through homebrew), at the end of compilation I get the warning about \"building without dbus\". Is there something special I need to do for git-annex to see I have installed dbus?++(Also, it tells me at the beginning that I don't have gcrypt, but libgcrypt is installed.)+"""]]
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="64.134.31.139"+ subject="comment 32"+ date="2013-10-21T22:47:14Z"+ content="""+You probably need to install libdbus dev stuff, and then the haskell dbus library. But it's certainly going to need code changes to make git-annex use dbus in any way on OSX, assuming there are even useful dbus events generated for network connections and drives being mounted on OSX.++It was saying \"gcrypt\" when it meant \"git-remote-gcrypt\".+"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://alan.petitepomme.net/"+ nickname="Alan Schmitt"+ subject="comment 33"+ date="2013-10-23T11:39:51Z"+ content="""+I installed the haskell DBus library, but it's still not picking it up. Is there some additional option to pass to cabal, or is it supposed to find it automatically?+"""]]
@@ -0,0 +1,27 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawn3rK4VDzxyhmrIc18z7F5OuXvEbUsgUac"+ nickname="Srinath"+ subject="build issue with brew technique on Darwin Kernel Version 13.0.0"+ date="2014-02-15T02:17:16Z"+ content="""+Following the Mac OS X brew instructions from the top of the board, I got the following error:++[5 of 5] Compiling Yesod ( Yesod.hs, dist/build/Yesod.o )+In-place registering yesod-1.2.5...+Installing library in /Users/srinathv/.cabal/lib/yesod-1.2.5/ghc-7.6.3+Registering yesod-1.2.5...+Installed yesod-1.2.5+cabal: Error: some packages failed to install:+git-annex-5.20140210 depends on libxml-sax-0.7.4 which failed to install.+libxml-sax-0.7.4 failed during the configure step. The exception was:+ExitFailure 1+network-protocol-xmpp-0.4.5 depends on libxml-sax-0.7.4 which failed to+install.+++Then I perused the comments and did:+$brew link libmxl2 --force+$cabal install git-annex --bindir=$HOME/bin++with success. +"""]]
@@ -0,0 +1,29 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawnaYy6kTuKAHmsa4BtGls2oqa42Jo2w2v0"+ nickname="Pere"+ subject="I couldn't install it on Snow Leopard"+ date="2013-01-19T15:04:27Z"+ content="""+Bad news, it looks like I'm not able to install git-annex to my machine: When I run++ sudo cabal install c2hs git-annex --bindir=$HOME/bin++I get the following error:++ cabal: Error: some packages failed to install:+ DAV-0.3 failed during the building phase. The exception was:+ ExitFailure 11+ git-annex-3.20130114 depends on yesod-core-1.1.7.1 which failed to install.+ yesod-1.1.7.2 depends on yesod-core-1.1.7.1 which failed to install.+ yesod-auth-1.1.3 depends on yesod-core-1.1.7.1 which failed to install.+ yesod-core-1.1.7.1 failed during the building phase. The exception was:+ ExitFailure 11+ yesod-default-1.1.3 depends on yesod-core-1.1.7.1 which failed to install.+ yesod-form-1.2.0.2 depends on yesod-core-1.1.7.1 which failed to install.+ yesod-json-1.1.2 depends on yesod-core-1.1.7.1 which failed to install.+ yesod-persistent-1.1.0.1 depends on yesod-core-1.1.7.1 which failed to+ install.+ yesod-static-1.1.1.2 depends on yesod-core-1.1.7.1 which failed to install.++What does *ExitFailure 11* mean?+"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="4.154.3.194"+ subject="comment 9"+ date="2013-01-19T16:02:35Z"+ content="""+sig11 is a Segmentation Fault, probably from a C library used by DAV for HTTP in this case.+"""]]
@@ -34,12 +34,18 @@ Now you can build git-annex by running either `make` or `cabal build` inside the source tree. -## minimal build with cabal+## minimal build with cabal and stackage This can be done anywhere, and builds git-annex without some optional features that require harder-to-install C libraries. This is plenty to let you get started with git-annex, but it does not include the assistant or webapp. +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. A nice way to avoid such breakage is to+[configure cabal to use the Stackage repository](http://www.stackage.org/),+which is a more stable and consistent version of the Hackage repository.+ Inside the source tree, run: cabal configure -f"-assistant -webapp -webdav -pairing -xmpp -dns"@@ -48,16 +54,14 @@ 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+## full build with cabal and stackage 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. ++Using [Stackage](http://www.stackage.org/) is again a good idea here! Once the C libraries are installed, run inside the source tree:
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="4.152.246.110"+ subject="comment 10"+ date="2013-07-27T17:49:07Z"+ content="""+@Henning; see the [[OSX]] page for full installation instructions for OSX. Which include all the neccesary brew incantations.+"""]]
@@ -0,0 +1,44 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawlXEIT2PEAuHuInLP4UYVzWE0lceMYd2lA"+ nickname="Gregor"+ subject="Installation on tonidoplug"+ date="2013-08-03T07:19:54Z"+ content="""+I tried various ways to install git-annex on my [TonidoPlug](http://www.tonidoplug.com/).++System Info:++ root@TonidoPlug2:~# uname -a+ Linux TonidoPlug2 2.6.31.8-topkick1281p2-001-004-20101214 #1 Thu Jun 16 10:06:20 CST 2011 armv5tel GNU/Linux++`apt-get` didn't work.++ root@TonidoPlug2:~# apt-get install git-annex+ Reading package lists... Done+ Building dependency tree + Reading state information... Done+ E: Unable to locate package git-annex++The Linux standalone installation results in an error message like this, when calling `git-annex` (or `git annex`)++ ~$ git-annex.linux/git-annex+ /home/gitolite/git-annex.linux/bin/git-annex: 1: Syntax error: \")\" unexpected++(git-annex.linux/bin/git-annex is a binary file and works fine on other distros)++When installing with cabal, I get the error message (tried as root and gitolite user)++ ~$ cabal install git-annex --bindir=$HOME/bin -f\"-assistant -webapp -webdav -pairing -xmpp -dns\"+ Resolving dependencies...+ cabal: cannot configure git-annex-4.20130802. It requires base >=4.5 && <4.8+ For the dependency on base >=4.5 && <4.8 there are these packages:+ base-4.5.0.0, base-4.5.1.0, base-4.6.0.0 and base-4.6.0.1. However none of+ them are available.+ base-4.5.0.0 was excluded because of the top level dependency base -any+ base-4.5.1.0 was excluded because of the top level dependency base -any+ base-4.6.0.0 was excluded because of the top level dependency base -any+ base-4.6.0.1 was excluded because of the top level dependency base -any++Any help is appreciated.+Thanks for providing git-annex. I started cleaning up my backups with it yesterday and really like it.+"""]]
@@ -0,0 +1,12 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="2001:4978:f:21a::2"+ subject="comment 12"+ date="2013-08-07T16:31:30Z"+ content="""+The Linux standalone builds for i386 and amd64 will not work on Arm systems.++There are builds of git-annex for arm in eg, Debian. You should be able to use one of those if this system is running Debian. You may need to upgrade to eg, Debian stable, which includes git-annex.++It looks like you have an old and/or broken GHC compiler too. You could upgrade that to a newer version (eg from Debian stable) and build it that way, but it seems like the long way around if you have a Debian system there.+"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawlXEIT2PEAuHuInLP4UYVzWE0lceMYd2lA"+ nickname="Gregor"+ subject="TonidoPlug"+ date="2013-08-09T17:46:28Z"+ content="""+@Joey Thanks for the answer. I didn't want to mess around too much with the TonidoPlug. I am currently setting up a raspberry pi, which works fine. +"""]]
@@ -0,0 +1,9 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawlfIVXjkzrYE9qJAO2A0H7K6tKGMaSgc3U"+ nickname="Daniel"+ subject="Problems with cryptocipher"+ date="2013-08-22T01:36:50Z"+ content="""+I had problems following these directions on recent releases of Fedora/Ubuntu. The install attempts failed on cryptocipher-0.3.1, which I think came as a dependency of Yesod.+I was able to work around this by installing yesod-platform with cabal first, then installing git-annex.+"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="RaspberryPie"+ ip="77.247.181.162"+ subject="git-annex assistant on Arm"+ date="2013-08-23T03:07:11Z"+ content="""+I'd like to use the assistant's power on a Raspberry Pi to build an always-on file/sync server. Is there a way to get the assistant running on Arm? I know there's a Debian package, but it's Version 3.20120629 and comes without the assistant. Has anyone ever successfully built a recent git-annex version on Arm? What would I need in order to do it myself? +"""]]
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="4.154.0.63"+ subject="comment 16"+ date="2013-08-23T17:37:52Z"+ content="""+The git-annex assistant can easily be built on arm. But not the webapp. It's entirely possible to use the assistant without the webapp though; you just have to make the git repository and configure the remotes by hand, and then the assistant will sync them the same way the webapp does.++It is possible but very involved to build the webapp for arm. I do not anticipate doing it in the Debian package until ghc gets proper template haskell support for arm. See [[forum/Webapp_on_ARM]]+"""]]
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="RaspberryPie"+ ip="77.247.181.162"+ subject="comment 17"+ date="2013-08-23T18:51:51Z"+ content="""+Thanks for the quick answer. I will try to build git-annex with just the assistant, as you suggest, and once it works set up the server by hand as you suggest. ++BTW: Awesome job you're doing with git-annex. I appreciate your enthusiasm.+"""]]
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="RaspberryPie"+ ip="96.47.226.20"+ subject="git-annex assistant for the Raspberry Pi"+ date="2013-09-04T03:58:37Z"+ content="""+It took a while and a few tries, but I finally built the git-annex binary including the assistant on a Raspberry Pi. The build comes without the flags webapp, webdav, and dbus as these rely on a Template Haskell compiler that hasn't been ported to Arm architecture yet. ++I put the binary up on Github in case anyone's interested: <https://github.com/tradloff/git-annex-RPi>+"""]]
@@ -0,0 +1,44 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawlu7K3h7Ry1uDAU_ERYGuqt0LoGNJqGuRo"+ nickname="Nathan"+ subject="Cabal installing git-annex on Ubuntu 12.04 Precise with GHC 7.6.3"+ date="2013-09-25T22:39:04Z"+ content="""+I now realize [there is a Ubuntu 12.04 Precise PPA with a current+version of+git-annex](http://git-annex.branchable.com/install/Ubuntu/), so that's+probably a better choice, but here's how I cabal isntalled git-annex.++1. Apt install non-cabal dependencies:++ sudo aptitude install c2hs libgsasl7-dev libxml2-dev++2. Manually cabal install yesod-platform to avoid the [cryptocipher problem + mentioned above](+ http://git-annex.branchable.com/install/cabal/#comment-1807da37dc144b572b76aaf4b574bb54):++ cabal install yesod-platform++3. Cabal install git-annex with DNS flag disabled:++ cabal install git-annex -f\"-dns\"++I was getting this error building git-annex before disabling the DNS flag:++ Utility/SRV.hs:70:54:+ Couldn't match expected type `Maybe+ [(Int, Int, Integer, B8.ByteString)]'+ with actual type `Either+ dns-1.0.0:Network.DNS.Internal.DNSError+ [(Int, Int, Int, dns-1.0.0:Network.DNS.Internal.Domain)]'+ In the third argument of `maybe', namely `r'+ In the second argument of `($)', namely+ `maybe [] (orderHosts . map tohosts) r'+ In a stmt of a 'do' block:+ return $ maybe [] (orderHosts . map tohosts) r++Looking at Utiltity/SRV.hs, it appears that disabling the DNS flag+just makes git annex use a different DNS library (ADNS), not+actually disable DNS lookups.++"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawlkA6XinbeOdnEDxEGQUWyjqPGh0kdMXr4"+ nickname="Blake"+ subject="Updating git-annex via cabal"+ date="2013-10-09T21:21:22Z"+ content="""+What is the best way to update git-annex and the dependencies via cabal? Just the `$ cabal install *` commands again?+"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="4.154.4.22"+ subject="comment 21"+ date="2013-10-11T17:09:33Z"+ content="""+If you run the \"cabal update\" command followed by the \"cabal install\" command it'll upgrade git-annex.+"""]]
@@ -0,0 +1,16 @@+[[!comment format=mdwn+ username="RaspberryPie"+ ip="96.44.189.100"+ subject=""Could not find module Crypto.Hash" error when building git-annex "+ date="2013-10-21T19:55:12Z"+ content="""+Lately I get this error message when trying to build git-annex-v4.20131002:++ Utility/Hash.hs:7:8:+ Could not find module `Crypto.Hash'+ Perhaps you meant+ Crypto.HMAC (needs flag -package crypto-api-0.10.2)+ Use -v to see a list of the files searched for.++crypto-api-0.10.2 is installed as a debian dev package. All the dependencies are met. I have no idea what's going on. +"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="64.134.31.139"+ subject="comment 23"+ date="2013-10-21T22:09:05Z"+ content="""+git-annex needs cryptohash version 0.10.0 or greater. You appear to have an old version. You can cabal `configure -f-CryptoHash` if it's for some reason failing to disable the cryptohash support despite the declared dependency not being met.+"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="RaspberryPie"+ ip="37.130.227.133"+ subject="comment 24"+ date="2013-10-22T17:55:32Z"+ content="""+I fixed the error by installing a newer version of cryptohash. Thanks for pointing out the culprit. +"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="RaspberryPie"+ ip="141.138.141.208"+ subject="Bad version on Hackage"+ date="2013-10-30T18:56:25Z"+ content="""+Quick note: The latest version in the Hackage repository (git-annex-4.20131024) fails to build, due to a faulty version of Assistant/Threads/Cronner.hs. +"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="209.250.56.47"+ subject="comment 26"+ date="2013-11-01T16:33:25Z"+ content="""+@RaspberryPie that only affected builds without the webapp, in any case it's fixed now.+"""]]
@@ -0,0 +1,17 @@+[[!comment format=mdwn+ username="RaspberryPie"+ ip="37.221.160.203"+ subject="comment 27"+ date="2013-11-02T12:52:18Z"+ content="""+Okay, the error doesn't show up anymore. I didn't even get to Cronner though, because this time I got a different error:++ Assistant/Alert.hs:195:20:+ Couldn't match expected type `Assistant ()' with actual type `()'+ Expected type: Maybe Remote -> Assistant ()+ Actual type: Maybe Remote -> ()+ In the expression: noop+ In an equation for `notFsckedNudge': notFsckedNudge _ = noop++This is from trying to compile 4.20131101 with `-f\"-webapp -webdav\"`+"""]]
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="209.250.56.47"+ subject="comment 28"+ date="2013-11-02T17:40:18Z"+ content="""+Unfortunate about that. I've fixed it in git.++(It would be best to file bug reports about build failures to avoid cluttering up this page.)+"""]]
@@ -0,0 +1,39 @@+[[!comment format=mdwn+ username="robohack"+ ip="24.67.98.78"+ subject="cabal install failing due to problems building pcre-light-0.4"+ date="2013-11-21T20:17:10Z"+ content="""+After a fresh install of Haskell, and following the instructions above, I end up with the following rather bizarre and unexpected problem:++ $ cabal install git-annex --bindir=$HOME/bin -f\"-assistant -webapp -webdav -pairing -xmpp -dns\"+ Resolving dependencies...+ Configuring pcre-light-0.4...+ Building pcre-light-0.4...+ Preprocessing library pcre-light-0.4...+ Base.hsc:103:18: error: pcre.h: No such file or directory+ Base.hsc: In function ‘main’:+ Base.hsc:402: error: ‘PCRE_ANCHORED’ undeclared (first use in this function)+ Base.hsc:402: error: (Each undeclared identifier is reported only once+ Base.hsc:402: error: for each function it appears in.)+ Base.hsc:405: error: ‘PCRE_AUTO_CALLOUT’ undeclared (first use in this function)++(followed by an error for every other macro that was expected to be defined in the header...)++ compiling dist/build/Text/Regex/PCRE/Light/Base_hsc_make.c failed (exit code 1)+ command was: /usr/bin/gcc -c dist/build/Text/Regex/PCRE/Light/Base_hsc_make.c -o dist/build/Text/Regex/PCRE/Light/Base_hsc_make.o -m64 -fno-stack-protector -m64 -fno-stack-protector -m64 -D__GLASGOW_HASKELL__=700 -Ddarwin_BUILD_OS -Ddarwin_HOST_OS -Dx86_64_BUILD_ARCH -Dx86_64_HOST_ARCH -I/sw/lib/ghc-7.0.4/bytestring-0.9.1.10/include -Idist/build/autogen -include dist/build/autogen/cabal_macros.h -I/sw/lib/ghc-7.0.4/base-4.3.1.0/include -Idist/build/autogen -include dist/build/autogen/cabal_macros.h -Idist/build/autogen -include dist/build/autogen/cabal_macros.h -Idist/build/autogen -include dist/build/autogen/cabal_macros.h -I/sw/lib/ghc-7.0.4/include -Idist/build/autogen -include dist/build/autogen/cabal_macros.h -I/sw/lib/ghc-7.0.4/include -Idist/build/autogen -include dist/build/autogen/cabal_macros.h -I/sw/lib/ghc-7.0.4/include/+ Failed to install pcre-light-0.4+ cabal: Error: some packages failed to install:+ git-annex-3.20120230 depends on pcre-light-0.4 which failed to install.+ pcre-light-0.4 failed during the building phase. The exception was:+ ExitFailure 1++This is a somewhat older Mac OS X 10.6.8 system.++I do have PCRE already installed via Fink, and pcre.h is in /sw/include. I see other -I/sw/... things in the compile command above, but obviously /sw/include is not one of them.++Any clues for me?++(Why the heck does git-annex need pcre in particular anyway??? I saw another regex library get installed earlier somewhere in this (massive) process.)++"""]]
@@ -0,0 +1,35 @@+[[!comment format=mdwn+ username="robohack"+ ip="24.67.98.78"+ subject="hmmm... ok, the PCRE problem was odd, but now this:"+ date="2013-11-21T20:30:54Z"+ content="""+The PCRE problem is solved trivially in my case with a couple more cabal install options, though the need for these seems oddly dissatisfying given the reams of other stuff that was successfully built and installed without these options.++Now however I seem to have encountered a deeper problem:++ $ cabal install git-annex --bindir=$HOME/bin --extra-include-dirs=/sw/include --extra-lib-dirs=/sw/lib + Resolving dependencies...+ [1 of 1] Compiling Main ( /var/folders/7h/7hWHR5m8HPKOnUEvQU7HU++++TI/-Tmp-/git-annex-3.20120230-84797/git-annex-3.20120230/Setup.hs, /var/folders/7h/7hWHR5m8HPKOnUEvQU7HU++++TI/-Tmp-/git-annex-3.20120230-84797/git-annex-3.20120230/dist/setup/Main.o )+ Linking /var/folders/7h/7hWHR5m8HPKOnUEvQU7HU++++TI/-Tmp-/git-annex-3.20120230-84797/git-annex-3.20120230/dist/setup/setup ...+ hsc2hs Utility/StatFS.hsc+ perl -i -pe 's/^{-# INCLUDE.*//' Utility/StatFS.hs+ ghc -O2 -Wall -ignore-package monads-fd --make configure+ + Utility/StatFS.hsc:54:8:+ Could not find module `GHC.Foreign':+ Use -v to see a list of the files searched for.+ make: *** [Build/SysConfig.hs] Error 1+ Configuring git-annex-3.20120230...+ Building git-annex-3.20120230...+ Preprocessing executable 'git-annex' for git-annex-3.20120230...+ + Git/Version.hs:11:18:+ Could not find module `Build.SysConfig':+ Use -v to see a list of the files searched for.+ Failed to install git-annex-3.20120230+ cabal: Error: some packages failed to install:+ git-annex-3.20120230 failed during the building phase. The exception was:+ ExitFailure 1++"""]]
@@ -0,0 +1,22 @@+[[!comment format=mdwn+ username="robohack"+ ip="24.67.98.78"+ subject="a different error trying to build from the git repo...."+ date="2013-11-21T21:14:54Z"+ content="""+I'm using the ghc7.0 branch because Fink's GHC is still at 7.0.4....++ $ cabal build + Building git-annex-3.20120523...+ Preprocessing executable 'git-annex' for git-annex-3.20120523...+ [ 78 of 163] Compiling Utility.Url ( Utility/Url.hs, dist/build/git-annex/git-annex-tmp/Utility/Url.o )+ + Utility/Url.hs:111:88:+ Couldn't match expected type `Maybe URI' with actual type `URI'+ In the second argument of `fromMaybe', namely+ `(newURI `relativeTo` u)'+ In the expression: fromMaybe newURI (newURI `relativeTo` u)+ In an equation for `newURI_abs':+ newURI_abs = fromMaybe newURI (newURI `relativeTo` u)++"""]]
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="209.250.56.64"+ subject="comment 32"+ date="2013-11-22T16:27:36Z"+ content="""+@robohack, the ghc7.0 branch is not being maintained, and is so old I don't recommend it. To build it against current cabal you will probably need to version its dependency on network to an older version than 2.4.0. ++Also, git-annex has not depended on pcre for a long time. But you're building thoroughly old version so get to trip over every bug that's been reported for the past 2 years..+"""]]
@@ -0,0 +1,21 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawn3p4i4lk_zMilvjnJ9sS6g2nerpgz0Fjc"+ nickname="Matthias"+ subject="Build failure"+ date="2014-03-20T09:10:44Z"+ content="""+I followed the instructions and the invocation of++ cabal install git-annex --bindir=$HOME/bin -f\"-assistant -webapp -webdav -pairing -xmpp -dns\"++resulted in the following error:++ Test.hs:107:41: Not in scope: `errMessage'+ Failed to install git-annex-5.20140306+ cabal: Error: some packages failed to install:+ git-annex-5.20140306 failed during the building phase. The exception was:+ ExitFailure 1++I used the Haskell Platform for Mac OS X (10.8)++"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="https://openid.stackexchange.com/user/a05bb829-932b-49f2-85a9-00dcda8b5e20"+ nickname="Christian Pietsch"+ subject="Re: Build failure"+ date="2014-03-20T13:56:16Z"+ content="""+I get exactly the same error message as Matthias when attempting the minimal Cabal install on openSUSE 12.2 (x86_64) Linux.+"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="209.250.56.102"+ subject="comment 35"+ date="2014-03-20T16:06:22Z"+ content="""+The `errMessage` build failure is due to a new version of optparse-applicative. I've added support for it in git master.+"""]]
@@ -0,0 +1,16 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawkNcHu5T1Pxzl-r2co9vf6SxXYWubv2P04"+ nickname="Matthew"+ subject="I did indeed get problems on Ubuntu 13.04"+ date="2014-06-25T01:01:43Z"+ content="""+The issues I had were version mismatches when resolving dependencies of git-annex.++It seems that when you install haskell-platform package with apt-get, it installs a bunch of haskell dependencies as apt packages, yet those aren't needed for any other system packages. So some people here who complain about version mismatches might not have intended to install any Haskell libraries with apt, they just come along for the ride by default.++I can't remember the exact ones, but I ended up uninstalling some of the stuff that gets auto-installed along with haskell-platform, and using cabal to build those. Then all the git-annex dependencies worked.++Why 13.04 in this day and age? Using Zentyal as a home server/gateway, and it currently runs on 13.04.++This method might not work if you installed other apt packages that _do_ need those apt-based Haskell libraries. But if git-annex is all you need that uses the Haskell platform, might work.+"""]]
@@ -0,0 +1,69 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawmveNWaFIL1zEehHr_0416bKBzsul5tGlE"+ nickname="Daniel"+ subject="Install fails horribly"+ date="2014-07-10T23:11:51Z"+ content="""+```+lyriondesktop:/home/zilti/tmp # cabal install c2hs+Resolving dependencies...+Configuring c2hs-0.17.2...+Building c2hs-0.17.2...+Preprocessing executable 'c2hs' for c2hs-0.17.2...+[ 1 of 26] Compiling Data.DLists ( src/Data/DLists.hs, dist/build/c2hs/c2hs-tmp/Data/DLists.o )+[ 2 of 26] Compiling Control.StateTrans ( src/Control/StateTrans.hs, dist/build/c2hs/c2hs-tmp/Control/StateTrans.o )++src/Control/StateTrans.hs:77:1: Warning:+ Module `Prelude' does not export `catch'+[ 3 of 26] Compiling Data.Errors ( src/Data/Errors.hs, dist/build/c2hs/c2hs-tmp/Data/Errors.o )+[ 4 of 26] Compiling Data.Attributes ( src/Data/Attributes.hs, dist/build/c2hs/c2hs-tmp/Data/Attributes.o )+[ 5 of 26] Compiling Text.Lexers ( src/Text/Lexers.hs, dist/build/c2hs/c2hs-tmp/Text/Lexers.o )+[ 6 of 26] Compiling Control.StateBase ( src/Control/StateBase.hs, dist/build/c2hs/c2hs-tmp/Control/StateBase.o )+[ 7 of 26] Compiling Data.NameSpaces ( src/Data/NameSpaces.hs, dist/build/c2hs/c2hs-tmp/Data/NameSpaces.o )+[ 8 of 26] Compiling C2HS.C.Attrs ( src/C2HS/C/Attrs.hs, dist/build/c2hs/c2hs-tmp/C2HS/C/Attrs.o )+[ 9 of 26] Compiling C2HS.C.Builtin ( src/C2HS/C/Builtin.hs, dist/build/c2hs/c2hs-tmp/C2HS/C/Builtin.o )+[10 of 26] Compiling Paths_c2hs ( dist/build/autogen/Paths_c2hs.hs, dist/build/c2hs/c2hs-tmp/Paths_c2hs.o )+[11 of 26] Compiling C2HS.Config ( src/C2HS/Config.hs, dist/build/c2hs/c2hs-tmp/C2HS/Config.o )+[12 of 26] Compiling C2HS.Switches ( src/C2HS/Switches.hs, dist/build/c2hs/c2hs-tmp/C2HS/Switches.o )+[13 of 26] Compiling C2HS.Version ( src/C2HS/Version.hs, dist/build/c2hs/c2hs-tmp/C2HS/Version.o )+[14 of 26] Compiling System.CIO ( src/System/CIO.hs, dist/build/c2hs/c2hs-tmp/System/CIO.o )+[15 of 26] Compiling Control.State ( src/Control/State.hs, dist/build/c2hs/c2hs-tmp/Control/State.o )+[16 of 26] Compiling C2HS.State ( src/C2HS/State.hs, dist/build/c2hs/c2hs-tmp/C2HS/State.o )+[17 of 26] Compiling C2HS.CHS.Lexer ( src/C2HS/CHS/Lexer.hs, dist/build/c2hs/c2hs-tmp/C2HS/CHS/Lexer.o )++src/C2HS/CHS/Lexer.hs:612:16: Warning:+ Defined but not used: `lexeme'+[18 of 26] Compiling C2HS.CHS ( src/C2HS/CHS.hs, dist/build/c2hs/c2hs-tmp/C2HS/CHS.o )+[19 of 26] Compiling C2HS.Gen.Header ( src/C2HS/Gen/Header.hs, dist/build/c2hs/c2hs-tmp/C2HS/Gen/Header.o )+[20 of 26] Compiling C2HS.C.Trav ( src/C2HS/C/Trav.hs, dist/build/c2hs/c2hs-tmp/C2HS/C/Trav.o )+[21 of 26] Compiling C2HS.C.Names ( src/C2HS/C/Names.hs, dist/build/c2hs/c2hs-tmp/C2HS/C/Names.o )+[22 of 26] Compiling C2HS.C ( src/C2HS/C.hs, dist/build/c2hs/c2hs-tmp/C2HS/C.o )+[23 of 26] Compiling C2HS.Gen.Monad ( src/C2HS/Gen/Monad.hs, dist/build/c2hs/c2hs-tmp/C2HS/Gen/Monad.o )++src/C2HS/Gen/Monad.hs:227:10: Warning:+ Orphan instance: instance Read Ident+[24 of 26] Compiling C2HS.C.Info ( src/C2HS/C/Info.hs, dist/build/c2hs/c2hs-tmp/C2HS/C/Info.o )+[25 of 26] Compiling C2HS.Gen.Bind ( src/C2HS/Gen/Bind.hs, dist/build/c2hs/c2hs-tmp/C2HS/Gen/Bind.o )++src/C2HS/Gen/Bind.hs:971:43: Warning:+ In the use of `posColumn' (imported from Language.C.Data.Position):+ Deprecated: \"column number information is inaccurate in presence of macros - do not rely on it.\"++src/C2HS/Gen/Bind.hs:789:10: Warning:+ Orphan instance: instance Num CInteger+[26 of 26] Compiling Main ( src/Main.hs, dist/build/c2hs/c2hs-tmp/Main.o )+Linking dist/build/c2hs/c2hs ...+Installing executable(s) in /root/.cabal/bin+Installed c2hs-0.17.2+lyriondesktop:/home/zilti/tmp # cabal install git-annex+Resolving dependencies...+Configuring gnuidn-0.2.1...+cabal: The program c2hs is required but it could not be found.+Failed to install gnuidn-0.2.1+cabal: Error: some packages failed to install:+git-annex-5.20140709 depends on gnuidn-0.2.1 which failed to install.+gnuidn-0.2.1 failed during the configure step. The exception was:+ExitFailure 1+network-protocol-xmpp-0.4.6 depends on gnuidn-0.2.1 which failed to install.+```+"""]]
@@ -0,0 +1,16 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="209.250.56.2"+ subject="comment 38"+ date="2014-07-11T18:30:55Z"+ content="""+@Daniel, I suggest you either follow the instuctions above, or if you don't want to follow the instructions, follow the error messages. :P In this case, the instructions say to do:++> PATH=$HOME/bin:$PATH+> cabal install c2hs --bindir=$HOME/bin++Which is exactly to work around the problem that we can see in your transcript: `Installing executable(s) in /root/.cabal/bin` ++Also, to reiterate the top of the page: If you are not comfortable tracking down and dealing with library build problems, installing git-annex with cabal is probably not the right choice for you!++"""]]
@@ -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.+"""]]
@@ -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.+"""]]
@@ -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.+"""]]
@@ -0,0 +1,7 @@+[[!comment format=mdwn+ username="thnetos"+ subject="Where to start reading the source code?"+ date="2014-12-15T22:04:06Z"+ content="""+Do you have any recommendations for the overall haskell architecture of the project? Where to start looking if I want to read through the source code?+"""]]
@@ -0,0 +1,18 @@+[[!comment format=mdwn+ username="joey"+ subject="""where to start reading the source code"""+ date="2015-01-05T20:58:50Z"+ content="""+@thnetos, great question!++Annex.hs is a key starting place, as it defines git-annex's main monad.+If you like learning code bases bottom-up, Types/* has files for+the main data types used in git-annex, such as Key and UUID and Remote and+GitConfig.++Command/* gets you the implementation of any particular git-annex command+you are interested in. Or Remote/* for any particular special remote.++I recommend running "make tags" and then your editor should be able to use+the tags file to bounce around in the source code.+"""]]
@@ -1,33 +0,0 @@-git-annex 5.20150406 released with [[!toggle text="these changes"]]-[[!toggleable text="""- * Prevent git-ls-files from double-expanding wildcards when an- unexpanded wildcard is passed to a git-annex command like add or find.- * Fix make build target. Thanks, Justin Geibel.- * Fix GETURLS in external special remote protocol to strip- downloader prefix from logged url info before checking for the- specified prefix.- * importfeed: Avoid downloading a redundant item from a feed whose- guid has been downloaded before, even when the url has changed.- * importfeed: Always store itemid in metadata; before this was only- done when annex.genmetadata was set.- * Relax debian package dependencies to git >= 1:1.8.1 rather- than needing >= 1:2.0.- * test: Fix --list-tests- * addurl --file: When used with a special remote that claims- urls and checks their contents, don't override the user's provided- filename with filenames that the special remote suggests. Also,- don't allow adding the url if the special remote says it contains- multiple files.- * import: --deduplicate and --cleanduplicates now output the keys- corresponding to duplicated files they process.- * expire: New command, for expiring inactive repositories.- * fsck: Record fsck activity for use by expire command.- * Fix truncation of parameters that could occur when using xargs git-annex.- * Significantly sped up processing of large numbers of directories- passed to a single git-annex command.- * version: Add --raw- * init: Improve fifo test to detect NFS systems that support fifos- but not well enough for sshcaching.- * --quiet now suppresses progress displays from eg, rsync.- (The option already suppressed git-annex's own built-in progress- displays.)"""]]
@@ -0,0 +1,30 @@+git-annex 5.20150522 released with [[!toggle text="these changes"]]+[[!toggleable text="""+ * import: Refuse to import files that are within the work tree, as that+ does not make sense and could cause data loss.+ * drop: Now supports --all, --unused, and --key.+ * drop: Now defaults to --all when run in a bare repository.+ (Previously, did nothing when run in a bare repository.)+ * get, move, copy, mirror: Concurrent transfers are now supported!+ For example: git-annex get -J10+ However, progress bars are not yet displayed for concurrent transfers,+ pending an updated version of the ascii-progress library.+ * --quiet now makes progress output by rsync, wget, etc be quiet too.+ * Take space that will be used by other running downloads into account when+ checking annex.diskreserve.+ * Avoid accumulating transfer failure log files unless the assistant is+ being used.+ * Fix an unlikely race that could result in two transfers of the same key+ running at once.+ * Stale transfer lock and info files will be cleaned up automatically+ when get/unused/info commands are run.+ * unused: Add --used-refspec option and annex.used-refspec, which can+ specify a set of refs to consider used, rather than the default of+ considering all refs used.+ * webapp: Fix zombie xdg-open process left when opening file browser.+ Closes: #[785498](http://bugs.debian.org/785498)+ * Safer posix fctnl locking implementation, using lock pools and STM.+ * Build documentation with TZ=UTC for reproducible builds. See #785736.+ * OSX: Corrected the location of trustedkeys.gpg, so the built-in+ upgrade code will find it. Fixes OSX upgrade going forward, but+ older versions won't upgrade themselves due to this problem."""]]
@@ -59,7 +59,6 @@ This is not enabled by default, since other S3 implementations may not support multipart uploads or have different limits, but can be enabled or changed at any time.- time. * `fileprefix` - By default, git-annex places files in a tree rooted at the top of the S3 bucket. When this is set, it's prefixed to the filenames
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ nickname="joey"+ subject="comment 10"+ date="2013-05-23T20:04:03Z"+ content="""+You can enable a special remote on a clone by running `git annex enableremote $name`, where $name is the name you used to originally create the special remote. (Older versions of git-annex used `git annex initremote` to enable the special remote on the clone.)++(Just in case, I have verified that embedcreds does cause the cipher= to be stored in the remote.log. It does.)+"""]]
@@ -0,0 +1,12 @@+[[!comment format=mdwn+ username="basak"+ ip="2001:8b0:1c8::2"+ subject="comment 11"+ date="2013-05-24T09:38:40Z"+ content="""+Thanks Joey - initremote on my slightly older version appears to work. I'll use `enableremote` when I can.++> (Just in case, I have verified that embedcreds does cause the cipher= to be stored in the remote.log. It does.)++This doesn't do what I expect. The documentation suggests that my S3 _login_ credentials would be stored. I understand that the cipher would be stored; but isn't this a separate concept? Instead, I'm being asked to set `AWS_ACCESS_KEY_ID` and `AWS_SECRET_ACCESS_KEY`; my understanding was that git-annex will keep them in the repository for me, so that I don't have to set them after running `initremote` before cloning. This works, apart from surviving the cloning. I'm using `encryption=shared`; does this affect anything? Or am I using a version of git-annex (3.20121112ubuntu3) that's too old?+"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ nickname="joey"+ subject="comment 12"+ date="2013-05-24T15:33:12Z"+ content="""+Ah -- No, your AWS creds are not stored. While some other special remotes, like webdav, can store all necessary credentials, it's not done for AWS. I didn't want git-annex to be responsible for someone accidentially publishing their AWS creds to their friends, since that could cost them a lot of money.+"""]]
@@ -0,0 +1,33 @@+[[!comment format=mdwn+ username="basak"+ ip="2001:8b0:1c8::2"+ subject="comment 13"+ date="2013-05-24T15:47:14Z"+ content="""+That's not what the documentation here says! It even warns me: \"Think carefully about who can access your repository before using embedcreds without gpg encryption.\"++My use case:++Occasional use of EC2, and a desire to store some persistent stuff in S3, since the dataset is large and I have limited bandwidth. I want to destroy the EC2 instance when I'm not using it, leaving the data in S3 for later.++If I use git-annex to manage the S3 store, then I get the ability to clone the repository and destroy the instance. Later, I can start a new instance, push the repo back up, and would like to be able to then pull the data back out of S3 again.++I'd really like the login credentials to persist in the repository (as the documentation here says it should). Even if I have to add a --yes-i-know-my-s3-credentials-will-end-up-available-to-anyone-who-can-see-my-git-repo flag. This is because I use some of my git repos to store private data, too.++If I use an Amazon IAM policy as follows, I can generate a set of credentials that are limited to access to a particular prefix of a specific S3 bucket only - effectively creating a sandboxed area just for git-annex:++ { + \"Statement\": [{\"Sid\": \"Stmt1368780615583\",+ \"Action\": [\"s3:GetObject\", \"s3:PutObject\", \"s3:DeleteObject\"],+ \"Effect\": \"Allow\",+ \"Resource\": [\"arn:aws:s3:::bucketname/prefix/*\"]}+ ],+ \"Statement\": [{\"Sid\": \"Stmt1368781573129\",+ \"Action\": [\"s3:GetBucketLocation\"],+ \"Effect\": \"Allow\",+ \"Resource\": [\"arn:aws:s3:::bucketname\"]}+ ]+ }++Doing this means that I have a different set of credentials for every annex, so it would be really useful to be able have these stored and managed within the repository itself. Each set is limited to what the annex stores, so there is no bigger compromise I have to worry about apart from the compromise of the data that the annex itself manages.+"""]]
@@ -0,0 +1,12 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ nickname="joey"+ subject="comment 14"+ date="2013-05-24T16:45:25Z"+ content="""+I apologise for incorrect information. I was thinking about defaults when using the webapp.++I have verified that embedcreds=yes stores the AWS creds, always.+++"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawne_amN4fko4p5cRY_9EYwaYuJKNn7LRio"+ nickname="Tobias"+ subject="different s3 storage URLs"+ date="2013-08-23T08:59:32Z"+ content="""+Is it possible to change the S3 endpoint hosts? I'm running a radosgw with S3 support which I'd like to define as S3 remote for git-annex+"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="4.154.0.63"+ subject="comment 16"+ date="2013-08-23T17:39:56Z"+ content="""+Yes, you can specify the host to use when setting up the remote. It's actually documented earlier on this very page, if ou search for \"host\". Any S3 compatabile host will probably work -- the Internet Archive's S3 does, for example.+"""]]
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawlc-3pdibcizrdz4WmZooECL0k6AvM1cWc"+ nickname="Joe"+ subject="S3 file/folder names"+ date="2015-02-19T22:22:26Z"+ content="""+Is there a way to tell the S3 backend to store the files as they are named locally, instead of by hashed content name? i.e., I've annexed foo/bar.txt and annex puts it in s3 as mybucket.name/foo/bar.txt instead of mybucket.name/GPGHMACSHA1-random.txt++Or should I just write a script to s3cmd sync my annex, and add the S3/cloudfront distribution URL as a web remote?+"""]]
@@ -0,0 +1,23 @@+[[!comment format=mdwn+ username="http://sekenre.wordpress.com/"+ nickname="sekenre"+ subject="Synchronizing Bup repositories"+ date="2013-05-07T16:46:34Z"+ content="""+Hi All,++I managed to answer my questions above about copying changes between local bup repositories efficiently.++You run the following commands ++ git annex copy . --to bup_repo_1 # Uses bup split in the background (slow)+ rsync -av /mnt/repodisk1/repo/ /mnt/repodisk2/repo/ \+ --exclude=config --exclude=*.bloom --exclude=*.midx # rsync without bup-specific indices (speed depends on delta between repositories)+ BUP_DIR=/mnt/repodisk2/repo/ bup midx -a && bup bloom # rebuild bup-specific indices on the target (this is extremely fast)+ git annex copy . --to bup_repo_2 # Records file is now available in repo2 (also extremely fast)++Now `git annex whereis` will show the correct location and `git annex get <file> --from bup_repo_2` will work.++So far in my testing I haven't found any problems...++"""]]
@@ -0,0 +1,24 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawnAvbXOnK57sqgvZvxkbG74NUKBDwKDcuk"+ nickname="Tim"+ subject="bup location data not synced through annex assistant"+ date="2013-05-15T15:08:54Z"+ content="""+I set up 2 servers running git annex assistant, both with a ~/annex dir and an additional ~/annex-bup bup repo. There is no additional cloud repository.+For test, I added my /etc dir which uploaded correctly from server1, but which never arrived on server2++ bup@bup1:~/annex/etc$ git annex whereis updatedb.conf+ whereis updatedb.conf (3 copies) + 687d3a7f-4798-4dbe-8774-1785b8ab6b7d -- here (bup@bup1:~/annex)+ adfc1307-771f-40e9-b794-bae2e1f21b8b -- bup2-annex-bup+ e4e0ac0b-992a-4312-a4ac-fc8d3d9f7c0f -- bup1-annex-bup+ ok++ bup@bup2:~/annex/etc$ git annex whereis updatedb.conf+ whereis updatedb.conf (1 copy) + 687d3a7f-4798-4dbe-8774-1785b8ab6b7d -- bup1 (bup@bup1:~/annex)+ ok++As you can see, server 2 just doesn't know the data is already on it's own disk in it's local bup repo.+Is there a reason this data does not get synced? Should I set up a transfer repo?+"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawnAvbXOnK57sqgvZvxkbG74NUKBDwKDcuk"+ nickname="Tim"+ subject="my bad"+ date="2013-05-15T15:39:31Z"+ content="""+Sorry, looks like I did initremote twice on the same folder, instead of enableremote the second time...+"""]]
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawkEYZEqLf3Aj_FGV7S0FvsMplmGqqb555M"+ nickname="Sergiusz"+ subject="bup-join local-arch/2014-12-03-235617 "+ date="2014-12-04T19:38:07Z"+ content="""+How can I restore the previous commit from bup archives created with bup-split? Yes, I know I can use bup-join local-arch~1 git notation, but I would like to use bup-join local-arch/2014-12-03-235617 (bup-ls local-arch results) ...but this method does not work ...++s.+"""]]
@@ -0,0 +1,43 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawkgbXwQtPQSG8igdS7U8l031N8sqDmuyvk"+ nickname="Albert"+ subject="Error with bup and gnupg"+ date="2012-10-22T20:56:56Z"+ content="""+Hello,++I get this error when trying to use git-annex with bup and gnupg:++<pre>+move importable_pilot_surveys.tar (gpg) (checking localaseebup...) (to localaseebup...) +Traceback (most recent call last):+ File \"/usr/lib/bup/cmd/bup-split\", line 133, in <module>+ progress=prog)+ File \"/usr/lib/bup/bup/hashsplit.py\", line 167, in split_to_shalist+ for (sha,size,bits) in sl:+ File \"/usr/lib/bup/bup/hashsplit.py\", line 118, in _split_to_blobs+ for (blob, bits) in hashsplit_iter(files, keep_boundaries, progress):+ File \"/usr/lib/bup/bup/hashsplit.py\", line 86, in _hashsplit_iter+ bnew = next(fi)+ File \"/usr/lib/bup/bup/helpers.py\", line 86, in next+ return it.next()+ File \"/usr/lib/bup/bup/hashsplit.py\", line 49, in blobiter+ for filenum,f in enumerate(files):+ File \"/usr/lib/bup/cmd/bup-split\", line 128, in <genexpr>+ files = extra and (open(fn) for fn in extra) or [sys.stdin]+IOError: [Errno 2] No such file or directory: '-'+</pre>+++I was able to work-around this issue by altering /usr/lib/bup/cmd/bup-split (though I don't think its a bup bug) to just pull from stdin:++files = [sys.stdin]++on ~ line 128.++Any ideas? Also, do you think that bup's data-deduplication does anything when gnupg is enabled, i.e. is it just as well to use a directory remote with gnupg?++Thanks! Git annex rules!++Albert+"""]]
@@ -0,0 +1,12 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="4.154.0.23"+ subject="comment 2"+ date="2012-10-23T20:01:43Z"+ content="""+@Albert, thanks for reporting this bug (but put them in [[bugs]] in future please).++This is specific to using the bup special remote with encryption. Without encryption it works. And no, it won't manage to deduplicate anything that's encrypted, as far as I know. ++I think bup-split must have used - for stdin in the past, but now, it just reads from stdin when no file is specified, so I've updated git-annex.+"""]]
@@ -0,0 +1,17 @@+[[!comment format=mdwn+ username="http://sekenre.wordpress.com/"+ nickname="sekenre"+ subject="Bup remotes in git-annex assistant"+ date="2013-03-13T12:54:56Z"+ content="""+Hi,++Is the bup remote available via the Assistant user interface?++Unrelated question;++If you are syncing files between two bup repos on local usb drives, does it use git to sync the changes or does it use \"bup split\" to re-add the file? (Basically, is the syncing as efficient as possible using git-annex or would I have to go to a lower level)++Many Thanks,+Sek+"""]]
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ nickname="joey"+ subject="comment 4"+ date="2013-03-13T16:05:50Z"+ content="""+I don't plan to support creating bup spefial remotes in the assistant, currently. Of course the assistant can use bup special remotes you set up.++Your two bup repos would be synced using bup-split.+"""]]
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawnZWCbRYPVnwscdkdEDwgQHZJLwW6H_AHo"+ nickname="Tobias"+ subject="bup fail?"+ date="2013-03-31T21:05:32Z"+ content="""+I've run into problems storing a huge number of files in the bup repo. It seems that thousands of branches are a problem. I don't know if it's a problem of git-annex, bup, or the filesystem.++How about adding an option to store tree/commit ids in git-annex instead of using branches in bup?+"""]]
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ nickname="joey"+ subject="comment 7"+ date="2013-04-02T21:24:06Z"+ content="""+`bup-split` uses a git branch to name the objects stored in the bup repository. So it will be limited by any scalability issues affecting large numbers of git branches. I don't know what those are.++Yes, it would be possible to make git-annex store this in the git-annex branch instead.+"""]]
@@ -0,0 +1,12 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawlsXhOlsW6RaGR83VNSMxPh159l5dFau70"+ nickname="Yung-Chin"+ subject="re scaling issue"+ date="2013-05-03T14:57:51Z"+ content="""+Tobias/joey,++I think there are at least two scaling issues that may be causing you trouble. One is that bup writes pack+idx files rather than bare objects, and if you send 1 file per call to bup-split, you end up with a pair of pack and idx files for each such call. When you later try to retrieve a blob, bup currently just calls git, and git will have to traverse all these tiny idx files looking for the right hash (bare objects you could at least find by name). You can probably ameliorate the pain by calling git repack (look at the -a and --max-pack-size switches) on your bup repository. The other is the \"thousands of branches\" issue, and I think \"git pack-refs --all\" (that's again on your bup repository) might help a little bit. ++It would certainly help performance if you could store blob/tree ids in git-annex instead of branch names. For small files, all bup would need to store is a blob, but currently you end up storing a blob, a tree, and a commit (and looking-up all of those, plus the ref too, on calling bup-join). (you might want to patch bup-split, so it would allow you to ask it for \"--blob-or-tree\", because currently if you say you pass it -b for blob-ids, then for bigger files you get a series of IDs, whereas you'd be much better off with a tree-id there)+"""]]
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawlsXhOlsW6RaGR83VNSMxPh159l5dFau70"+ nickname="Yung-Chin"+ subject="comment 9"+ date="2013-05-03T16:34:05Z"+ content="""+Thinking about this some more, a very elegant way to make a bup remote could actually be to just pass the whole .git/annex tree into bup-index/save (you could avoid sending some files by only bup-indexing select subtrees, or by using --exclude-*'s, but you'd run bup-save over the whole .git/annex tree). You could then use bup-restore to retrieve files or whole subtrees, and you'd refer to the files you're retrieving by their actual pathname under which they live in .git/annex (if that doesn't make sense it's because I've misunderstood how git-annex is organised!), so something like \"bup restore branch_name/latest/.git/annex/aa/bb/sha-of-some-sort\" would work - that's cute, right? And you'd only have 1 branch.++However... somebody who is good with lazy-evaluation would need to rework bup.vfs: currently, if you'd call bup-restore on a path like that, it would instantiate a _lot_ of vfs-nodes you don't need - to begin with, it would make a node for every commit you ever made (on any branch!) - on a big repository you'd wait ages for it to just find the commit objects...+"""]]
@@ -0,0 +1,32 @@+[[!comment format=mdwn+ username="helmut"+ ip="89.0.176.236"+ subject="Asynchronous hooks?"+ date="2012-10-13T09:46:14Z"+ content="""+Is there a way to use asynchronous remotes? Interaction with git annex would have to+split the part of initiating some action from completing it.++I imagine I could `git annex copy` a file to an asynchronous remote and the command+would almost immediately complete. Later I would learn that the transfer is+completed, so the hook must be able to record that information in the `git-annex`+branch. An additional plumbing command seems required here as well as a way to+indicate that even though the store-hook completed, the file is not transferred.++Similarly `git annex get` would immediately return without actually fetching the+file. This should already be possible by returning non-zero from the retrieve-hook.+Later the hook could use plumbing level commands to actually stick the received file+into the repository.++The remove-hook should need no changes, but the checkpresent-hook would be more like+a trigger without any actual result. The extension of the plumbing required for the+extension to the receive-hook could update the location log. A downside here is that+you never know when a fsck has completed.++My proposal does not include a way to track the completion of actions, but relies on+the hook to always complete them reliably. It is not clear that this is the best road+for asynchronous hooks.++One use case for this would be a remote that is only accessible via uucp. Are there+other use cases? Is the drafted interface useful?+"""]]
@@ -0,0 +1,17 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawnWvnTWY6LrcPB4BzYEBn5mRTpNhg5EtEg"+ nickname="Bence"+ subject="More environment variables"+ date="2013-07-09T10:28:58Z"+ content="""+Could you please include the original filename+path in the environment variables (_next to ANNEX_KEY & ANNEX_FILE_)? Like ANNEX_FILENAME and ANNEX_PATH.++Having these infos in a hook would help eg. a flickr backend to be more usefull. [Tags](http://www.flickr.com/help/tags/) would contain the ANNEX_KEY and the image title could be the original filename (ANNEX_FILENAME). Also, having directory path (ANNEX_PATH) for the given file, the uploading process could put images into the proper sets/collections. Voila, you have a \"filesystem based\" flickr image gallery (almost like flickrfs).++Other backends, like AmazonS3 having [meta data](http://docs.aws.amazon.com/AmazonS3/latest/dev/UsingMetadata.html) also could benefit from this. ++To build the Death Star further, an _annex.$hooktype-**sync**-hook_ would instruct the backend to sync data, eg. place or move images/files in the proper image-sets/directories after they are moved/repositioned in git-annex, but that would be the backend's job, not git-annex's. Maybe the sync-hook would be called when _git annex sync_ is called. This is just an idea.++While writing this, a new hook for sharing came into my mind: _annex.$hooktype-**share**-hook_.+Calling this on a file/directory (_git annex share my_image_to_share.jpg_) would return a publicly shareable (short)url pointing to the file/directory. This would work for web-backends like AmazonS3, flickr, DropBox, Google Drive, ...+"""]]
@@ -0,0 +1,17 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawmWg4VvDTer9f49Y3z-R0AH16P4d1ygotA"+ nickname="Tobias"+ subject="comment 3"+ date="2013-07-09T10:54:58Z"+ content="""+I have requested this before. But it doesn't seem to be entirely doable because some items may have multiple equally correct filenames/paths. And some items may have zero filenames/paths.++That said I hope a solution can be found because I really want this feature too. And would implement it in all my hooks.++And for some of the cases i don't really see it as an issue. If you have a public flickr repo with clean(unencrypted) files. It is because you want to access existing files. If an object has no filename/path the hook could/would/should just ignore the file, sure this means no backup of old versions of files, but you can have other backends for those versions.++The bigger issue is with the same file existing multiple places in the annex, which filename/path should be used? And the filename/path can change between sync(if it is deleted from one of the positions). I personally still see this as being entirely doable. The key for downloading would always be the same, so worst case scenario is the image may be duplicated on flickr. Or that the picture only one of the multiple folders it should be in on flickr. Still, i see these issues as being minor, and that usability would increase if this was implemented, even with these caveats.++And there probably is some issues I haven't realized/know about.++"""]]
@@ -0,0 +1,18 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawnWvnTWY6LrcPB4BzYEBn5mRTpNhg5EtEg"+ nickname="Bence"+ subject="checkpresent success and failure"+ date="2013-07-31T13:06:21Z"+ content="""+What value should be returned in the \"checkpresent-hook\" to signal that the given file does not exist in the given backend? ++Should the called hook process return an exit code less or greater then zero? In this case the following is displayed: +>(user error (sh [\"-c\",\"name_of_the_process\"] exited 1)) failed++This tells that the process failed (no internet connection or something that prevents the process from doing its job) and not that result is false, which would mean the file/entry does not exist in the given backend.+If the return code is zero the file is treated as existing file/entry (no matter what I write to stderr).++Also I think, the \"checkpresent\" block misses the ending ;; in the example.++Here is my work-in-progress hook: https://gist.github.com/parhuzamos/31bf4516eea434e0d248+"""]]
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="4.154.0.21"+ subject="comment 5"+ date="2013-07-31T16:25:55Z"+ content="""+The checkpresent hook should always exit 0 unless there was an exceptional condition (eg, perhaps it cannot check if the file exists one way or the other). Like the documentation for it says, the important thing is what it outputs to stdout, which should contain the key name if it's present, and should not contain the key name if it's not present.++I hope you post to this website about your special remote when you get it fully working!+"""]]
@@ -0,0 +1,12 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawnWvnTWY6LrcPB4BzYEBn5mRTpNhg5EtEg"+ nickname="Bence"+ subject="comment 6"+ date="2013-07-31T17:34:50Z"+ content="""+Roger that.++If this is acceptable: [terminal output screenshot](http://i.imgur.com/lsJJYwF.png), than I'm almost done and will publish soon.+(Of course a REST API using client would much be better, but this is just the start.)++"""]]
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="4.154.0.21"+ subject="comment 7"+ date="2013-07-31T17:42:22Z"+ content="""+If I were you I'd suppress that \"File not found\" error.++Hook special remotes *can* output messages to stderr, and it's also fine to output eg, progress bars to stdout when seding/receving files. But unnecessary cluttery output should be avoided.+"""]]
@@ -0,0 +1,30 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawnWvnTWY6LrcPB4BzYEBn5mRTpNhg5EtEg"+ nickname="Bence"+ subject="checkpresent again"+ date="2013-08-01T23:18:38Z"+ content="""+In the current [HEAD](https://github.com/joeyh/git-annex/commit/bb74db6ef094324062adcf26a677113ee6fd0e58) the \"checkpresent\" method in [Hook.hs](https://github.com/joeyh/git-annex/blob/master/Remote/Hook.hs#L145) is missing a \"return\" while other hooks have a return value eg. [Directory.hs](https://github.com/joeyh/git-annex/blob/master/Remote/Directory.hs#L241), [Rsync.hs](https://github.com/joeyh/git-annex/blob/master/Remote/Rsync.hs#L272), ...+++I noticed that if my *checkpresent* hook does not output anything (to be exact: I commented out all the lines in the block) it behaves strangely. I copied the test file to \"copyrepo\", removed it by hand (so git-annex does not know about the change) and executed a fsck.++ ~/annex5/test1/123 $ git annex fsck --from copyrepo --fast+ fsck somefile.1 (checking copyrepo...) (fixing location log) + ** Based on the location log, somefile.1+ ** was expected to be present, but its content is missing.+ failed++running the check again++ ~/annex5/test1/123 $ ga fsck --from copyrepo --fast+ fsck somefile.1 (checking copyrepo...) ok++and running the check again without --fast++ ~/annex5/test1/123 $ ga fsck --from copyrepo+ fsck somefile.1 (checking copyrepo...) ok++It thinks, the file is in the repo but it is not.++"""]]
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="4.152.108.145"+ subject="comment 9"+ date="2013-08-01T23:51:48Z"+ content="""+The behavior you show with `fsck --from` is that the first time it's run against the damaged remote it notices the file is not present using the checkpresent hook. It then updates the location log. The subsequent times it's run, it sees that the location log says the file is not present in the remote. It verifies this is the case by calling the checkpresent hook. Since the two data sources agree, and numcopies is still satisfied, it prints \"ok\". There does not seem to be a bug here.++(`return` in Haskell does not do what you would expect to happen in a traditional imperative language. It does not alter control flow, and any function using `return` can be mechanically converted to one that does not use `return`.)+"""]]
@@ -0,0 +1,7 @@+[[!comment format=mdwn+ username="https://id.koumbit.net/anarcat"+ subject="about copying to the local store"+ date="2015-03-07T13:16:02Z"+ content="""+there's a [discussion](https://github.com/jbenet/go-ipfs/issues/875) happening upstream about how copying to the local datastore could be avoided.+"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://olivier.berger.myopenid.com/"+ nickname="obergix"+ subject="Which URL prefix are supported ?"+ date="2013-08-17T08:44:05Z"+ content="""+It is not clear whether only http:// URLs are supported. Can you list others ?+"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="2001:4978:f:21a::2"+ subject="comment 2"+ date="2013-08-17T08:59:11Z"+ content="""+When it says \"arbitrary urls\", it means it. The only requirement is that the url be well formed and that wget or whatever command you have it configured to use via annex.web-download-command knows how to download it.+"""]]
@@ -0,0 +1,11 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawmWg4VvDTer9f49Y3z-R0AH16P4d1ygotA"+ nickname="Tobias"+ subject="User defined server"+ date="2013-04-17T09:45:59Z"+ content="""+It would be nice if you could expand the XMPP setup in the assistant to support an \"advanced\" settings view where a custom server could be defined.++Example: I have a google Apps domain called mytest.com, with the users bla1@mytest.com and bla2@mytest.com. When trying to add either of those accounts to the assistant XMPP will try to use mytest.com as the jabber server, and not googles server.++"""]]
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawmRFKwny4rArBaz-36xTcsJYqKIgdDaw5Q"+ nickname="Andrew"+ subject="comment 2"+ date="2013-04-17T22:28:39Z"+ content="""+Yeah, I agree, this would be nice. ++For your own domain, you can configure DNS like this: [[http://support.google.com/a/bin/answer.py?hl=en&answer=34143]] to make XMPP find the right server. But for some that's not an option and the \"advanced\" mode would be useful in that case.+"""]]
@@ -0,0 +1,28 @@+[[!comment format=mdwn+ username="RaspberryPie"+ ip="46.19.143.203"+ subject="Missing prerequisites for XMPP syncing?"+ date="2013-09-17T06:53:59Z"+ content="""+I set up two fresh annexes that can talk via XMPP and no other way. After I fire up the assistants I expect them to sync their metadata, but nothing happens. One log gives me an 'XMPPClient: received: [\"Unknown message\"]' message every two minutes. The other one doesn't contain the string XMPP at all, not once. So my suspicion is that this particular version of git-annex doesn't support XMPP, which is weird because:++ $ git annex version+ git-annex version: 4.20130909+ build flags: Assistant Pairing Testsuite S3 Inotify XMPP DNS Feeds+ local repository version: 3+ default repository version: 3+ supported repository versions: 3 4+ upgrade supported from repository versions: 0 1 2++This is the version output from the other machine: ++ $ git annex version+ git-annex version: 4.20130827+ build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP+ local repository version: 3+ default repository version: 3+ supported repository versions: 3 4+ upgrade supported from repository versions: 0 1 2++What am I missing? Are there more build flags for XMPP than the one called XMPP? (Also, no, I can't just copy versions between machines b/c the architectures are different. And yep, the one giving me trouble is ARM.)+"""]]
@@ -0,0 +1,14 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="4.153.14.105"+ subject="comment 4"+ date="2013-09-19T21:07:35Z"+ content="""+If you have the XMPP flag in your git-annex build, it will support XMPP. Are you sure you set up the xmpp creds file and the xmpp special remote correctly on the ARM machine? (I assume it has no webapp, so you had to set that up manually..)++Here's how you can do that manually:++1. Run git-annex on a machine with the webapp, set up XMPP, and copy the .git/annex/creds/xmpp to the machine without the webapp.+2. On the machine without the webapp, add a git remote that has its \"url = xmpp::loginname@xmppserver.com\" and its annex-uuid set to the annex.uuid of the repository on the first machine.+3. Run git-annex assistant on the machine without the webapp.+"""]]
@@ -0,0 +1,73 @@+[[!comment format=mdwn+ username="RaspberryPie"+ ip="37.221.161.234"+ subject="Nope"+ date="2013-09-24T22:05:55Z"+ content="""+Your guess is right, Joey, I'm configuring by hand as the ARM machine has no webapp. And yes, I'm mostly sure I set up everything correctly. The XMPP account is working, and my configuration of git-annex is all but identical to your example.++Here's what I do. First on the machine with the webapp:++ mkdir ~/test+ cd ~/test+ git init+ git annex init+ git annex webapp++I set up XMPP from within the webapp. The file ~/test/.git/annex/creds/xmpp is created with the correct credentials. (BTW: The file's default permissions are 620 instead of 600 - is that a bug?)++I add a file or two to the annex for good measure. Then, on the ARM machine:++ mkdir ~/test+ cd ~/test+ git init+ git annex init+ mkdir .git/annex/creds+ scp -2 webappmachine:~/test/.git/annex/creds/xmpp .git/annex/creds + chmod 600 .git/annex/creds/xmpp+ git remote add webappmachine xmpp::login@server++The final step is to edit .git/config on the ARM machine. The [remote] section now looks like this:++ [remote \"webappmachine\"]+ url = xmpp::login@server+ fetch = +refs/heads/*:refs/remotes/webappmachine/*+ annex-uuid = aaaaaaaa-bbbb-cccc-dddddddddddd++where aaaaaaaa-bbbb-cccc-dddddddddddd is the return value of `git config --get annex.uuid` on the webapp machine.++I then run `git annex assistant` on the ARM machine and expect the two machines to synchronize their metadata, e.g. the number of knownn annex keys in the repo. But it doesn't happen.++So I set `debug = true`, restart the assistants and check the log. This is what I get on the webapp machine:++ [2013-09-24 17:45:41 EDT] XMPPClient: connected a5/25577ac4-3248-4c83-8391-bd93708bcf2b+ [2013-09-24 17:45:41 EDT] XMPPClient: received: [\"Presence from a5/dc9bcde8-fe18-47de-807c-c620019279f2 Just (Element {elementName = Name {nameLocalName = \\"git-annex\\", nameNamespace = Just \\"git-annex\\", namePrefix = Nothing}, elementAttributes = [(Name {nameLocalName = \\"query\\", nameNamespace = Nothing, namePrefix = Nothing},[ContentText \\"\\"])], elementNodes = []})\",\"QueryPresence\"]+ [2013-09-24 17:45:42 EDT] XMPPClient: received: [\"Presence from a5/900e3b6e-a7f4-4a6a-8d12-ed94de429258 Just (Element {elementName = Name {nameLocalName = \\"git-annex\\", nameNamespace = Just \\"git-annex\\", namePrefix = Nothing}, elementAttributes = [(Name {nameLocalName = \\"push\\", nameNamespace = Nothing, namePrefix = Nothing},[ContentText \\"43357474-abbb-4667-a334-e4615ea6d4a2\\"])], elementNodes = []})\",\"NotifyPush [UUID \\"43357474-abbb-4667-a334-e4615ea6d4a2\\"]\"]+ [2013-09-24 17:45:42 EDT] XMPPClient: push notification for+ [2013-09-24 17:45:42 EDT] read: git [\"--git-dir=/home/pi/test/.git\",\"--work-tree=/home/pi/test\",\"symbolic-ref\",\"HEAD\"]+ [2013-09-24 17:45:42 EDT] read: git [\"--git-dir=/home/pi/test/.git\",\"--work-tree=/home/pi/test\",\"show-ref\",\"refs/heads/master\"]+ [2013-09-24 17:45:42 EDT] XMPPClient: received: [\"Pushing \\"a59\\" (CanPush (UUID \\"d50c4cc9-e7c0-4ef0-84c6-f11012051eb9\\") [34f875cc7fa1198414f93990af9ab78e6cee893e,6fad42234060361435d6cf2ab4bd40e438c2d05c])\"]+ [2013-09-24 17:45:42 EDT] read: git [\"--git-dir=/home/pi/test/.git\",\"--work-tree=/home/pi/test\",\"show-ref\",\"git-annex\"]+ [2013-09-24 17:45:42 EDT] read: git [\"--git-dir=/home/pi/test/.git\",\"--work-tree=/home/pi/test\",\"show-ref\",\"--hash\",\"refs/heads/git-annex\"]+ [2013-09-24 17:45:42 EDT] read: git [\"--git-dir=/home/pi/test/.git\",\"--work-tree=/home/pi/test\",\"log\",\"refs/heads/git-annex..6fad42234060361435d6cf2ab4bd40e438c2d05c\",\"--oneline\",\"-n1\"]+ [2013-09-24 17:45:42 EDT] chat: git [\"--git-dir=/home/pi/test/.git\",\"--work-tree=/home/pi/test\",\"cat-file\",\"--batch\"]+ [2013-09-24 17:45:42 EDT] XMPPClient: received: [\"Ignorable Presence from a5/25577ac4-3248-4c83-8391-bd93708bcf2b Just (Element {elementName = Name {nameLocalName = \\"git-annex\\", nameNamespace = Just \\"git-annex\\", namePrefix = Nothing}, elementAttributes = [], elementNodes = []})\"]+ [2013-09-24 17:45:42 EDT] XMPPClient: received: [\"Unknown message\"]+ [2013-09-24 17:45:42 EDT] XMPPClient: received: [\"Pushing \\"a59\\" (PushRequest (UUID \\"d50c4cc9-e7c0-4ef0-84c6-f11012051eb9\\"))\"]+ [2013-09-24 17:45:42 EDT] XMPPSendPack: started running push Pushing \"a59\" (PushRequest (UUID \"d50c4cc9-e7c0-4ef0-84c6-f11012051eb9\"))+ [2013-09-24 17:45:42 EDT] read: git [\"--git-dir=/home/pi/test/.git\",\"--work-tree=/home/pi/test\",\"symbolic-ref\",\"HEAD\"]+ [2013-09-24 17:45:42 EDT] XMPPClient: received: [\"Ignorable Presence from a5/25577ac4-3248-4c83-8391-bd93708bcf2b Just (Element {elementName = Name {nameLocalName = \\"git-annex\\", nameNamespace = Just \\"git-annex\\", namePrefix = Nothing}, elementAttributes = [], elementNodes = []})\"]+ [2013-09-24 17:45:42 EDT] read: git [\"--git-dir=/home/pi/test/.git\",\"--work-tree=/home/pi/test\",\"show-ref\",\"refs/heads/master\"]+ [2013-09-24 17:45:42 EDT] call: git [\"--git-dir=/home/pi/test/.git\",\"--work-tree=/home/pi/test\",\"branch\",\"-f\",\"synced/master\"]+ [2013-09-24 17:45:42 EDT] XMPPSendPack: finished running push Pushing \"a59\" (PushRequest (UUID \"d50c4cc9-e7c0-4ef0-84c6-f11012051eb9\")) False++And from then on, in two-minute intervals:++ [2013-09-24 17:47:42 EDT] XMPPClient: received: [\"Unknown message\"]+ [2013-09-24 17:49:42 EDT] XMPPClient: received: [\"Unknown message\"]+ [2013-09-24 17:51:42 EDT] XMPPClient: received: [\"Unknown message\"]+ +The log on the ARM machine is rather unhelpful. Actually it doesn't even contain the string \"XMPP\". This looks to me like the webapp machine tries to communicate via Jabber but doesn't get any intelligible answer. And this is the reason I wondered whether the problem lies with my self-compiled ARM git-annex binary. I actually spent a while compiling 4.20130909 with all flags but webapp and webdav, but the result is still the same. ++Any other ideas what I'm doing wrong here?+"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="4.152.108.220"+ subject="comment 6"+ date="2013-09-25T18:13:24Z"+ content="""+If you're not getting an \"XMPPClient: connected\", then my guess would be that your git-annex build's XMPP is screwed up somehow. For example, if it hung forever when connecting to the XMPP server, it would never get as far as printing that message. (If it tried and failed to connect, you'd get a message about the connection having failed.)+"""]]
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="RaspberryPie"+ ip="46.165.221.166"+ subject="comment 7"+ date="2013-09-26T03:46:18Z"+ content="""+I see. Is there a way to check whether the build is corrupt? The build logs gave me nothing. ++Anyway, XMPP is not the most important feature to me. It still bugs me though that it doesn't work when it should. +"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawnZEanlyzay_QlEAL0CWpyZcRTyN7vay8U"+ nickname="Carlo"+ subject="comment 8"+ date="2013-10-22T14:30:58Z"+ content="""+Same setup, same problem... no log output on raspberry pi.+"""]]
@@ -0,0 +1,23 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawlu-fdXIt_RF9ggvg4zP0yBbtjWQwHAMS4"+ nickname="Jörn"+ subject="Same problem, no XMPP showing up in daemon.log"+ date="2013-11-21T21:13:16Z"+ content="""+I have the same setup like @RaspberryPie, except that my server is not running on the Pi but on Debian7-amd64. On my client (OSX, self-compiled using cabal) I can see XMPP log entries like @RaspberryPi, however, on the Debian7 machine (also self-compiled) I do not see any XMPP entry in the daemon.log. Setup regarding .git/annex/creds/xmpp and the special xmpp remote is correct (checked a thousand times).++Do you have any idea what could be wrong, Joey? Thanks a lot.++Output of git annex version:++ git-annex version: 5.20131120+ build flags: Assistant Pairing Testsuite S3 WebDAV Inotify DBus XMPP DNS Feeds Quvi CryptoHash + key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E SHA256 SHA1 SHA512 SHA224 SHA384 SKEIN256 SKEIN512 WORM URL+ remote types: git gcrypt S3 bup directory rsync web webdav glacier hook+ local repository version: 4+ default repository version: 3+ supported repository versions: 3 5+ upgrade supported from repository versions: 0 1 2 4++Jörn+"""]]
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="https://me.yahoo.com/a/2djv2EYwk43rfJIAQXjYt_vfuOU-#a11a6"+ nickname="Olivier R"+ subject="It doesn't work 100%"+ date="2012-05-03T21:42:54Z"+ content="""+When you remove tracked files... it doesn't show the new status. it's like if the file was ignored.+++"""]]
@@ -0,0 +1,13 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawnxlx1UrzVhdy6_gFjzmF42x6QXxBUxg00"+ nickname="Jakukyo"+ subject="comment 2"+ date="2013-09-05T12:14:42Z"+ content="""+> There are two gotchas...++So just always run `git annex add` after editing a file+and `git update-index --really-refresh` after migrating+backend?++"""]]
@@ -0,0 +1,16 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawkAUMhKOSkh9JaBA6xst3XxQIIsDEq5Zd4"+ nickname="Ovidiu"+ subject="Syncing not working :-/"+ date="2014-05-17T19:52:33Z"+ content="""+Error log says:++ git-annex-remote-skydrive is not installed in PATH (/Applications/git-annex.app/Contents/MacOS/bundle:/Applications/git-annex.app/Contents/MacOS/bundle:/Applications/git-annex.app/Contents/MacOS/bundle:/Applications/git-annex.app/Contents/MacOS/bundle:/Applications/git-annex.app/Contents/MacOS/bundle:/Applications/git-annex.app/Contents/MacOS/bundle:/Applications/git-annex.app/Contents/MacOS/bundle:/Applications/git-annex.app/Contents/MacOS/bundle:/usr/bin:/bin:/usr/sbin:/sbin)++BUT I did a symlink, I even did 2 to 2 different locations that are in my path:++ cd /Users/ovi/skydriveannex/+ ln -sf `pwd`/git-annex-remote-skydrive /usr/bin/git-annex-remote-skydrive+ ln -sf `pwd`/git-annex-remote-skydrive /opt/local/bin/git-annex-remote-skydrive+"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawnoUOqs_lbuWyZBqyU6unHgUduJwDDgiKY"+ nickname="Matt"+ subject="ANNEX_S3 vs AWS for keys"+ date="2012-05-29T12:24:25Z"+ content="""+The instructions state ANNEX_S3_ACCESS_KEY_ID and ANNEX_SECRET_ACCESS_KEY but git-annex cannot connect with those constants. git-annex tells me to set both \"AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY\" instead, which works. This is with Xubuntu 12.04.+"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="4.153.81.112"+ subject="comment 2"+ date="2012-05-29T19:10:42Z"+ content="""+Thanks, I've fixed that. (You could have too.. this is a wiki ;)+"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="annexuser"+ ip="64.71.7.82"+ subject="Altering AWS credentials"+ date="2014-04-15T21:59:43Z"+ content="""+If I revoke old AWS credentials and create new ones, how would I inform git-annex of the change to `AWS_ACCESS_KEY_ID` and `AWS_SECRET_ACCESS_KEY`?+"""]]
@@ -0,0 +1,13 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="209.250.56.191"+ subject="comment 4"+ date="2014-04-17T19:44:55Z"+ content="""+You can use `git annex enableremote` to change an existing remote's configuration. So this should work:++ # export AWS_ACCESS_KEY_ID=\"newRANDOMGOBBLDEYGOOK\"+ # export AWS_SECRET_ACCESS_KEY=\"news3kr1t\"+ # git annex enableremote cloud++"""]]
@@ -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.+"""]]
@@ -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\".+"""]]
@@ -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.+"""]]
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawkPIqJZ88VZEVqLhLOd1LMdYXcy6bAW9qE"+ nickname="Lemao"+ subject="comment 8"+ date="2015-01-07T13:54:23Z"+ content="""+I use github as my central git repository and I would like to use S3 to store large files with annex. Since the s3 remote in .git/config is not stored in github, how do I make sure I reconnect to the same s3 bucket in case I delete my local clone? Reinitializing the remote will create a completely new bucket.++I would also be a good idea to centralize git-annex folders inside a single bucket so I keep the global namespace under control and can narrow down the permissioning.+"""]]
@@ -0,0 +1,11 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ subject="comment 9"+ date="2015-01-07T17:25:43Z"+ content="""+Lemao, make sure you have pushed your git-annex branch to your central git repository.++When you clone that repo elsewhere, you can add the S3 remote by running `git annex enableremote cloud` (replace \"cloud\" with whatever name you originally picked when you used `git annex initremote` to set up the S3 remote in the first place.++git-annex stores the necessary configuration of the S3 remote on the git-annex branch.+"""]]
@@ -28,7 +28,7 @@ git remote add desktop ssh://desktop/~/annex -However for the desktop to add an ever changing laptops hostname it's a little tricky. We make use of remote SSH tunnels to do this. Essentially we have the laptop (which always knows it's own name and address and knows the address of the desktop) create a tunnel starting on an arbitrary port at the desktop and heads back to the laptop on it's own SSH server port (22).+However for the desktop to add an ever changing laptops hostname it's a little tricky. We make use of remote SSH tunnels to do this. Essentially we have the laptop (which always knows its own name and address and knows the address of the desktop) create a tunnel starting on an arbitrary port at the desktop and heads back to the laptop on its own SSH server port (22). To do this make part of your laptop's SSH config look like this:
@@ -0,0 +1,9 @@+### Please describe the problem.+Instead of storing config for each remote in ~/.ssh/config, which mixes the user own config with that of git-annex-assistant, which is irritating if (like me) you store your ssh config in a vcs. Since the option -F allows the choice of the config file, it should be possible to move the config into ~/.ssh/git-annex/config. The only issue I see is according to the ssh man page on my system states that the system-wide config is ignored if a config file is specified on the command line.++### What version of git-annex are you using? On what operating system?+I'm using git-annex 4.20130601 on a Debian Testing/Unstable/Experimental mix.++[[!tag design/assistant]]++[[wontfix]]
@@ -0,0 +1,7 @@+There are times when it is handy to be able to upload a file to a web host somewhere and share a link for that file to a select few people.++It seems to be that the assistant could handle this scenario. It could generate a directory with a random name on the remote, and transfer the file there (using the existing filename) and the appropriate URL could be displayed in the assistant webapp to allow the user to copy the URL to send it to the appropriate people.++Note: Joey and I had a quick chat about this use case at LCA2013.++[[!tag design/assistant]]
@@ -0,0 +1,26 @@+So annex is super cool and all. But there is one really annoying thing about it. The symlinks disrupt workflow really horribly! For example if I have a .psd file that is annex'd and I open that file in photoshop, edit it, then try to save it again. It doesn't allow me, because the actual file is the one deep in the annex sub structure that is read only. There a bunch of other annoyances like this. But you basically can't work with annex'd files without some additional struggle.++But there is a solution to this. Just don't symlink the files that are active. I think potentially the simplest way to do this is to have a 'annex' and 'unannex' command. Or rather, a 'create symlink' and 'uncreate symlink' command. ++So then you can be going along, doing your work, nothing in your directory symlinked.++You then type you 'annex symlink' command all priorly annexed filed will be deleted and replaced with their symlinks.++Then you can add your new files to annex. Adding new files will just automatically symlink them unless you put like a -ns or something to signify to not symlink them.++With all priorly annexed filed symlinked and all your new files symlinked, you then git commit and push.++Then you do a git annex unsymlink command. And then all your symlinks are deleted and the actual file placed there.++Then you just type git annex symlink again to re-symlink them all.++> I think you are looking for the `unlock` and `add` (or `lock`) commands. Basically, to edit the file in photoshop, you want:+>+> <pre>+> git annex unlock file.psd+> photoshop file.psd # ...+> git annex add file.psd # if you are happy with your changes or...+> git annex lock file.psd # if you want to discard your changes+> </pre>+>+> So basically what you are asking for is already [[done]], in my mind. I still think there are significant [[usability issues|forum/usability:_what_are_those_arrow_things__63__/]] with symlinks, but that's another story. --[[anarcat]]
@@ -0,0 +1,11 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U"+ nickname="Richard"+ subject="comment 1"+ date="2011-05-17T07:27:02Z"+ content="""+Sounds like a good idea.++* git annex fsck (or similar) should check/rebuild the caches+* I would simply require a clean tree with a verbose error. 80/20 rule and defaulting to save actions.+"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="209.250.56.172"+ subject="comment 1"+ date="2014-02-21T21:36:14Z"+ content="""+This really depends on the remote, some can resume where they were interrupted, such as rsync, and some cannot, such as glacier (and, er, encrypted rsync).+"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://grossmeier.net/"+ nickname="greg"+ subject="very remote specific"+ date="2014-02-21T22:11:16Z"+ content="""+Yeah, this is very remote specific and probably means adding the functionality there as well (eg: in the glacier.py code, not only in git-annex haskell). Maybe I should file bugs there accordingly :)+"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="209.250.56.172"+ subject="comment 3"+ date="2014-02-21T22:34:14Z"+ content="""+Hmm, I forget if it's possible for git-annex to mask SIGINT when it runs glacier or rsync, so that the child process does not receive it, but the parent git-annex does.+"""]]
@@ -0,0 +1,132 @@+I has been [[discussed|devblog/day_268_stressed_out]]+[[twice|devblog/day_285__tuning_git-annex_unused_refs]] that the+current [[forum]] support system is not ideal for providing+support. It constitutes the [largest part of this wiki][] yet we+sometimes get duplicated questions and it seems the forum may be a+barrier to entry for people.++ [largest part of this wiki]: http://git-annex.branchable.com/devblog/day_268_stressed_out/#comment-e0814585df0047e6d4e11515aebe1dec++A few alternatives have been proposed, from a mailing list to using a+StackExchange site. This post is to discuss the possible+alternatives. The requirement is that the system may be available+offline and on low-bandwidth connections yet enable conversations+better than a simple web forum or mailing list; which may end up being+the only solution considering the first requirements, but let's give+it a try. :)++Stack exchange+==============++i looked up how this works in stackexchange, and it turns out they+provide [regular dumps][] of the data hosted. unfortunately, it's a+gigantic zip file and not really designed for low-bandwidth+use. There's also a [data explorer][] that was promising, until i+realized that the query engine takes up 154KB, three times the space+of the regular search engine (~54KB, which I guess is way too much for+dialup).++ [regular dumps]: http://blog.stackoverflow.com/category/cc-wiki-dump/+ [data explorer]: http://data.stackexchange.com/++Also: there is a [mobile version][] of all the stackexchange sites,+which take up around 3KB, but still only works online. There's an app+for mobile devices as well, but it [doesn't support offline access+either][] - so another dead-end.++ [mobile version]: http://meta.stackexchange.com/questions/104458/switch-to-mobile-site-on-standard-browser+ [doesn't support offline access either]: http://meta.stackexchange.com/questions/220036/offline-features-in-stack-exchange-app++Stackexchange runs a [garbled mess][] of IIS, MSSQL, ASP, Redis and+Elasticsearch so there is probably little hope in integrating into+something like git. I have asked for the [proverbial pony in this+stackexchange question][] (yes, it's all very meta), describing the+use case, but i am not holding my breath for a change.++ [garbled mess]: http://en.wikipedia.org/wiki/Stack_Exchange#Technologies_used+ [proverbial pony in this stackexchange question]: http://meta.stackexchange.com/questions/256573/best-way-to-use-stackexchange-sites-offline-or-on-dialup+ +Askbot+======++Besides, SE sites are based on proprietary software, and i am not sure+we'd want to advocate that here. There are free software alternatives,+of which i made an [evaluation about 2 years ago][] after which we+tried Askbot at [Koumbit][]. it never took off: staff didn't seem+interested in it so much and we never made people aware of it too+much. plus, it didn't integrate with existing authentication+mechanisms (which are a little bit of a mess for us)...++But it does seem like an interesting alternative, and has [primitive+email integration][] where you can ask questions by email, but not+answer (!). I haven't looked at such support in other software, but i+suspect it is similarly not a priority as they struggle to monetize+their free software...++Most of those free software alternatives of Stackexchange are written+in Python/Django or Ruby/Rails (iirc) with SQL backends, which would+probably make git integration... also "challenging".++ [evaluation about 2 years ago]: (https://wiki.koumbit.net/FaqService#A.2BAMk-valuation_logicielle)+ [Koumbit]: http://koumbit.org/+ [primitive email integration]: http://askbot.org/doc/sending-email-to-askbot.html++Discourse+=========++From that point of view, maybe [discourse][] could be an interesting+alternative. It has built-in email support, as it is designed as an+alternative to mailing lists. With a simple setting, you can+collaborate directly by email. What is interesting, compared to the+mailing list model, is that posts can be collaboratively edited to+(for example) arrive at a collective wisdom by refining an answer (or+a question). There are also interesting community moderation and+reputation systems.++There seems to be some [offline tool][] for Discourse, but it's+unclear to me how it works, as it seems to be a separate (nodejs!)+application that connects with a discourse plugin. There's a+[discussion about offline suport in discourse][] in the meta site...++Discourse uses Ruby/Rails and PostgreSQL, and somewhat is only+[officially supported in Docker][]...++The discourse people do [warn against switching existing+communities][] to Discourse because of the resulting friction, so it+is also in that spirit that I open discussion about this here, that+is, in the hope the change can be acknowledged, supported and+discussed by everyone here, in a spirit of consensus building. :)++ [offline tool]: https://github.com/etewiah/offcourse+ [discussion about offline suport in discourse]: https://meta.discourse.org/t/offcourse-a-proof-of-concept-offline-reader-for-discourse/22356+ [discourse]: http://discourse.org/+ [warn against switching existing communities]: http://www.discourse.org/faq/#switch+ [officially supported in Docker]: https://github.com/discourse/discourse/blob/master/docs/INSTALL.md++Mailing lists+=============++Of course, the forum could simply be moved to a mailing list. The+would have the advantage of reducing the barrier of entry to the site,+reduce the load on the wiki, at the cost of adding the additionnal+"how do i subscribe to a mailing list" barrier of entry, which, oddly+enough, exists for a lot of mailing lists...++Like it or not, web forums do enable a lot of less technical users to+participate because they only need their web browser, and crossing+that boundary can be hard for some people. Mailing lists also do not+necessarily favor collaboration as much as the other systems, because+they are articulated more towards discussion, as opposed to establishing+common knowledge.++A good option may be Mailman 3 which, with the new web interface, allows+forum-like functionalities. Mailman 2 also used to have a usenet interface,+not sure what became of that in Mailman 3.++Web forums+==========++There's a plethora of "php-bb-like" software out there, i am just+ignoring them for now, as I am not very familiar with them and they+have never been too attractive for me, but people are of course free+to edit this page to add suggestions! :)
@@ -0,0 +1,29 @@+When using git-annex get -J2, one thread can clear another thread's+transfer lock.++This happens because fcntl locking is used, and it is not thread-safe.+<https://github.com/haskell/unix/issues/44>++> * If a process closes any file descriptor referring to a+> file, then all of the process's locks on that file are+> released, regardless of the file descriptor(s) on which the+> locks were obtained. ++One thread starts a transfer and locks it; the second thread starts a+transfer of a different file, and in order to check annex.diskreserve,+checks to see which other transfers are currently running. In doing this+check, it closes a fd attached to the first thread's lock, which causes the+lock to be dropped.++This only affects -J mode.++To fix it, probably need to use STM to keep a list of transfers all threads+in the current process are doing. Then the lock checking code can avoid+re-opening locks for transfers in the STM list.++A more generic approach is to use Annex.LockFile for everything,+and make it check its lock pool via STM for other threads holding a lock.+(Currently, the pool is only used for shared locks.)+--[[Joey]] ++> [[fixed|done]] via LockPools. --[[Joey]]
@@ -0,0 +1,21 @@+[[!comment format=mdwn+ username="joey"+ subject="""comment 1"""+ date="2014-11-10T17:11:52Z"+ content="""+Hmm, well, there have been requests for access to files as they're being+get-ed before. This does have the advantage of providing that,+but I don't know if I like trying in xdg-open, which might not always+be the way a user wants to open a file.++git-annex does have progress info available while a file is being+transferred. (If nothing else, it tends to know the key size, and can+see the file size.) However I don't know how it could tell if "enough"+of the file was available to stream it.++I guess what I'd be most comfortable with is putting in plumbing.+Like making `examinekey` be able to report the temporary file+that is used when a key is being downloaded. It might also make sense to+have a bit of plumbing that waits for a file being downloaded to get+to X% complete, or something.+"""]]
@@ -0,0 +1,12 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="206.74.132.139"+ subject="comment 1"+ date="2014-02-06T17:26:58Z"+ content="""+I would be quite happy if someone took care of adding git-annex to openwrt.++I don't have time to personally handle packaging for different linux distributions myself. What I could do is add mips builds of git-annex to the existing standalone linux builds. These would need to be built the same way the arm builds are done, using a Debian chroot and qemu to run tools from it. This is rather a lot of work for me to set up, and I don't know if I'd have to do it for both little and big endian mips.++Also, it seems that Debian does not currently have a working haskell toolchain for mips. Which may well mean that ghc is not in a working state on mips at all.+"""]]
@@ -0,0 +1,9 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawkNE-H4vEcbcGndxq5daT8qUb7yIf7r1OE"+ nickname="Łukasz"+ subject="comment 2"+ date="2014-02-11T21:05:00Z"+ content="""+if debian does not have working toolchain for mips then there is no way to port it into mips machines.+am i correct ?+"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="209.250.56.172"+ subject="comment 3"+ date="2014-02-11T21:39:34Z"+ content="""+Actually, debian stable does still have ghc building for mips/mipsel. It's just newer versions that have failed to build and nobody has fixed it yet.+"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="joey"+ subject="""comment 4"""+ date="2015-01-13T20:39:53Z"+ content="""+I checked, and the current status is that mips and mipsel in Debian have+up-to-date builds of ghc and git-annex.+"""]]
@@ -76,3 +76,6 @@ > It has nice support for multiple progress bars, and is portable. > I have filed 7 issues on it, around 4 of which need to get fixed before > it's suitable for git-annex to use.. --[[Joey]]++>> `git annex get -JN` works now, but lacks any progress display.+>> Waiting on some updates to ascii-progress. --[[Joey]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawln3ckqKx0x_xDZMYwa9Q1bn4I06oWjkog"+ nickname="Michael"+ subject="comment 1"+ date="2013-03-01T01:26:36Z"+ content="""+This would indeed be very helpful when remotely mounting a photo/video collection over samba.+"""]]
@@ -0,0 +1,9 @@+[[!comment format=mdwn+ username="http://edheil.wordpress.com/"+ ip="173.162.44.162"+ subject="comment 2"+ date="2013-03-01T04:50:28Z"+ content="""++1 this would be sweet as hell++"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://ypid.wordpress.com/"+ nickname="ypid"+ subject="Please add this ;)"+ date="2014-03-13T19:10:17Z"+ content="""++1 This would be so great. For me the only thing which is missing in this awesome project.+"""]]
@@ -0,0 +1,41 @@+Currently `git annex unused` assumes that all branches (including remote+tracking branches) and tags are "used" and finds only objects not used by+any of those refs.++That's a reasonable default, but in some cases, we don't care about+specific refs. Perhaps we don't consider remote tracking branches+important. Or perhaps we only want objects in HEAD to be considered used.++This could be handled by adding an option to specify a refspec when running+git-annex unused. Only matching refs would be checked. It's probably worth+making this be both a command-line option --used-refspec, as well as a+annex.used-refspec config setting.++git's refspec format is not quite right (since it specifies a local side+and a remote side for push/pull). But, it can be used as a point of+departure. Let's allow wildcards as it does, and use leading '+' to add a+ref, and '-' to remove. Let the user specify multiple such expressions,+separated by ':'.++ +refs/heads/*:+HEAD^:+refs/tags/*:-refs/tags/old-tag++This is processed by starting with an empty set of refs, and walking the+refspec in order. ++* Each + is matched against all known refs (from `git show-ref`), and adds+ everything it matches to the set. If the + does not contain a wildcard,+ it is literally added to the set, rather than looking in the known refs.+ This allows "+refs/heads/*" to match all heads, and "+HEAD"+ to match HEAD, or even "+sha" to match a given SHA, or "+HEAD^" to match+ the previous head.+* Each - is matched against the contents of the set, and removes everything+ it matches, using a lexographic matching with wildcards (not looking at+ the SHAs that the refs point to, so -refs/heads/master does not remove+ +HEAD).++Hmm, unused currently does a separate pass to find files used in the work+tree. I think it's best to keep that as-is.++--[[Joey]]++> [[done]] --[[Joey]]
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawkRITTYYsN0TFKN7G5sZ6BWGZOTQ88Pz4s"+ nickname="Zoltán"+ subject="cygwin"+ date="2012-05-15T00:14:08Z"+ content="""+What about [Cygwin](http://cygwin.com/)? It emulates POSIX fairly well under Windows (including signals, forking, fs (also things like /dev/null, /proc), unix file permissions), has all standard gnu utilities. It also emulates symlinks, but they are unfortunately incompatible with NTFS symlinks introduced in Vista [due to some stupid restrictions on Windows](http://cygwin.com/ml/cygwin/2009-10/msg00756.html).++If git-annex could be modified to not require symlinks to work, the it would be a pretty neat solution (and you get a real shell, not some command.com on drugs (aka cmd.exe))+"""]]
@@ -0,0 +1,12 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawk5cj-itfFHq_yhJHdzk3QOPp-PNW_MjPU"+ nickname="Michael"+ subject="+1 Cygwin"+ date="2012-05-23T19:30:21Z"+ content="""+Windows support is a must. In my experience, binary file means proprietary editor, which means Windows.++Unfortunately, there's not much overlap between people who use graphical editors in Windows all day vs. people who are willing to tolerate Cygwin's setup.exe, compile a Haskell program, learn git and git-annex's 90-odd subcommands, and use a mintty terminal to manage their repository, especially now that there's a sexy GitHub app for Windows.++That aside, I think Windows-based content producers are still *the* audience for git-annex. First Windows support, then a GUI, then the world.+"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://xolus.net/openid/max"+ nickname="B0FH"+ subject="What about NTFS support ?"+ date="2012-08-02T17:45:10Z"+ content="""+Has git-annex been tested with an NTFS-formatted disk under Linux ? NTFS is supposed to be case-sensitive and to allow symlinks, and these are supposed to work with ntfs3g.+"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawlc1og3PqIGudOMkFNrCCNg66vB7s-jLpc"+ nickname="Paul"+ subject="Re: What about NTFS support?"+ date="2012-08-16T19:30:38Z"+ content="""+I successfully use git-annex on an NTFS formatted external USB drive, so yes, it is possible and works well.+"""]]
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="https://me.yahoo.com/a/dASECLNzvckz4VwqUGYsvthiplY.#d2c27"+ nickname="A. D. Sicks"+ subject="comment 5"+ date="2012-09-09T23:48:21Z"+ content="""+Haskell has C++ binding, so it should be possible to port it to .net/Mono with a VB GUI for Windows users. Windows has a primitive form of symlinks called shortcuts. Perhaps shortcut support in Windows could replace the use of symlinks. I've used shortcuts since XP to put my home Windows directory on another partition and never had a hitch...++If anyone is interested in working on this, hit me up. I would like to use this in my XP vbox to have access to files on my host OS...I have a student edition of Visual Studio 2005 to do an open source port...+"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawnlwEMhiNYv__mEUABW4scn83yMraC3hqE"+ nickname="Sean"+ subject="NTFS symlinks"+ date="2013-01-11T21:44:21Z"+ content="""+It seems that NTFS (from Vista forward) has full POSIX support for symlinks. At least, Wikipedia [seems to think so.](http://en.wikipedia.org/wiki/NTFS_symbolic_link). What about doing like GitHub and using MinGW for compatibility? Cygwin absolutely blows in terms of installation size and compatability with the rest of Windows.+"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawlpSOjMH7Iaz56v6Pr9KCFSpbvMXvg-y9o"+ nickname="Dominik"+ subject="So close :-)"+ date="2013-06-30T12:46:40Z"+ content="""+I was fighting my way forward until I read here that special remote with ssh+rsync and encryption doesn't work. Interestingly I got everything working so far, ssh login is keybased, gpg -k works and the remote setup also correctly cooperated with gpg... but it just didn't sync. Any ideas how complex it is to get this last missing piece moving?+"""]]
@@ -0,0 +1,12 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="4.154.4.193"+ subject="comment 8"+ date="2013-06-30T17:58:08Z"+ content="""+It should be easy to fix whatever's wrong the the rsync special remote. Just a matter of debugging that.++Adding encryption support on Windows is stuck at a roadblock I don't know the way around. To drive gpg, git-annex uses the `--passphrase-fd` option, and sends the \"passphrase\" (really a big block of binary foo!) over a file descriptor of a pipe that it set up.++Windows, AFAIK, doesn't have file descriptors, or at least there is no equivilant to them that I have access to in the Haskell POSIX compatability layer for Windows. I am reluctant to fall back to using `--passphrase-file` on Windows, since that would be a massive security hole (as would passing the passphrase as a parameter via `--passphrase=`).+"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawlpSOjMH7Iaz56v6Pr9KCFSpbvMXvg-y9o"+ nickname="Dominik"+ subject="comment 9"+ date="2013-07-31T10:29:51Z"+ content="""+The tradeoff for me is a \"local\" security hole (where I can secure my own laptop) vs. a remotely exploitable thing... If it needs to go through a file, so be it -- it would however be good if that file would be overwritten with garbage before being deleted :-)+"""]]
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="madduck"+ ip="2001:a60:f0fb:0:224:d7ff:fe04:c82c"+ subject="Warn while inconsistent"+ date="2014-04-06T20:44:17Z"+ content="""+Sure, git-annex prevents me from dropping files unless there are numcopies around elsewhere, but shouldn't it also ensure that numcopies cannot be set unless that requirement is already met?++Furthermore, shouldn't it ensure that when new files are added, they are automatically distributed to fulfill the requirement?+"""]]
@@ -1,5 +1,5 @@ Name: git-annex-Version: 5.20150508.1+Version: 5.20150522 Cabal-Version: >= 1.8 License: GPL-3 Maintainer: Joey Hess <id@joeyh.name>@@ -93,6 +93,10 @@ Flag TorrentParser Description: Use haskell torrent library to parse torrent files +Flag AsciiProgress+ Description: Use ascii-progress library (experimental)+ Default: False+ Flag EKG Description: Enable use of EKG to monitor git-annex as it runs (at http://localhost:4242/) Default: False@@ -223,9 +227,9 @@ warp (>= 3.0.0.5), warp-tls, wai, wai-extra,- blaze-builder, crypto-api, hamlet, clientsession,+ blaze-builder, crypto-api, clientsession, template-haskell, aeson,- shakespeare+ shakespeare (>= 2.0.0) CPP-Options: -DWITH_WEBAPP if flag(Webapp) && flag (Webapp-secure)@@ -259,6 +263,10 @@ if flag(TorrentParser) Build-Depends: torrent (>= 10000.0.0) CPP-Options: -DWITH_TORRENTPARSER++ if flag(AsciiProgress)+ Build-Depends: ascii-progress (<= 0.2.1.2), terminal-size+ CPP-Options: -DWITH_ASCIIPROGRESS if flag(EKG) Build-Depends: ekg
@@ -1,6 +1,6 @@ .TH git-annex-add 1 .SH NAME-git-annex add \- adds files to the git annex+git-annex-add \- adds files to the git annex .PP .SH SYNOPSIS git annex add \fB[path ...]\fP
@@ -1,6 +1,6 @@ .TH git-annex-addunused 1 .SH NAME-git-annex addunused \- add back unused files+git-annex-addunused \- add back unused files .PP .SH SYNOPSIS git annex addunused \fB[number|range ...]\fP
@@ -1,6 +1,6 @@ .TH git-annex-addurl 1 .SH NAME-git-annex addurl \- add urls to annex+git-annex-addurl \- add urls to annex .PP .SH SYNOPSIS git annex addurl \fB[url ...]\fP
@@ -1,6 +1,6 @@ .TH git-annex-assistant 1 .SH NAME-git-annex assistant \- automatically sync changes+git-annex-assistant \- automatically sync changes .PP .SH SYNOPSIS git annex assistant
@@ -1,6 +1,6 @@ .TH git-annex-checkpresentkey 1 .SH NAME-git-annex checkpresentkey \- check if key is present in remote+git-annex-checkpresentkey \- check if key is present in remote .PP .SH SYNOPSIS git annex \fBkey remote\fP
@@ -1,6 +1,6 @@ .TH git-annex-contentlocation 1 .SH NAME-git-annex contentlocation \- looks up content for a key+git-annex-contentlocation \- looks up content for a key .PP .SH SYNOPSIS git annex contentlocation \fB[key ...]\fP
@@ -1,6 +1,6 @@ .TH git-annex-copy 1 .SH NAME-git-annex copy \- copy content of files to/from another repository+git-annex-copy \- copy content of files to/from another repository .PP .SH SYNOPSIS git annex copy \fB[path ...] [\-\-from=remote|\-\-to=remote]\fP@@ -19,6 +19,10 @@ .IP "\fB\-\-to=remote\fP" Use this option to copy the content of files from the local repository to the specified remote.+.IP+.IP "\fB\-\-jobs=N\fP \fB\-JN\fP"+Enables parallel transfers with up to the specified number of jobs+running at once. For example: \fB\-J10\fP .IP .IP "\fB\-\-auto\fP" Rather than copying all files, only copy files that don't yet have
@@ -1,6 +1,6 @@ .TH git-annex-dead 1 .SH NAME-git-annex trust \- hide a lost repository+git-annex-trust \- hide a lost repository .PP .SH SYNOPSIS git annex dead \fB[repository ...]\fP
@@ -1,6 +1,6 @@ .TH git-annex-describe 1 .SH NAME-git-annex describe \- change description of a repository+git-annex-describe \- change description of a repository .PP .SH SYNOPSIS git annex describe repository description
@@ -1,6 +1,6 @@ .TH git-annex-diffdriver 1 .SH NAME-git-annex diffdriver \- external git diff driver shim+git-annex-diffdriver \- external git diff driver shim .PP .SH SYNOPSIS git annex diffdriver \fB\-\- cmd \-\-opts \-\-\fP
@@ -1,6 +1,6 @@ .TH git-annex-direct 1 .SH NAME-git-annex direct \- switch repository to direct mode+git-annex-direct \- switch repository to direct mode .PP .SH SYNOPSIS git annex direct
@@ -1,6 +1,6 @@ .TH git-annex-drop 1 .SH NAME-git-annex drop \- indicate content of files not currently wanted+git-annex-drop \- indicate content of files not currently wanted .PP .SH SYNOPSIS git annex drop \fB[path ...]\fP@@ -29,6 +29,18 @@ git-annex to delete the content of the specified files, even from the last repository that is storing their content. Data loss can result from using this option.+.IP+.IP "\fB\-\-all\fP"+Rather than specifying a filename or path to drop, this option can be+used to drop all available versions of all files.+.IP+This is the default behavior when running git-annex drop in a bare repository.+.IP+.IP "\fB\-\-unused\fP"+Drop files found by last run of git-annex unused.+.IP+.IP "\fB\-\-key=keyname\fP"+Use this option to drop a specified key. .IP .IP "file matching options" The git-annex\-matching\-options(1)
@@ -1,6 +1,6 @@ .TH git-annex-dropkey 1 .SH NAME-git-annex dropkey \- drops annexed content for specified keys+git-annex-dropkey \- drops annexed content for specified keys .PP .SH SYNOPSIS git annex dropkey \fB[key ...]\fP
@@ -1,6 +1,6 @@ .TH git-annex-dropunused 1 .SH NAME-git-annex dropunused \- drop unused file content+git-annex-dropunused \- drop unused file content .PP .SH SYNOPSIS git annex dropunused \fB[number|range ...]\fP
@@ -1,6 +1,6 @@ .TH git-annex-edit 1 .SH NAME-git-annex unlock \- unlock files for modification+git-annex-unlock \- unlock files for modification .PP .SH SYNOPSIS git annex edit \fB[path ...]\fP
@@ -1,6 +1,6 @@ .TH git-annex-enableremote 1 .SH NAME-git-annex enableremote \- enables use of an existing special remote+git-annex-enableremote \- enables use of an existing special remote .PP .SH SYNOPSIS git annex enableremote \fBname [param=value ...]\fP
@@ -1,6 +1,6 @@ .TH git-annex-examinekey 1 .SH NAME-git-annex examinekey \- prints information from a key+git-annex-examinekey \- prints information from a key .PP .SH SYNOPSIS git annex examinekey \fB[key ...]\fP
@@ -1,6 +1,6 @@ .TH git-annex-expire 1 .SH NAME-git-annex expire \- expire inactive repositories+git-annex-expire \- expire inactive repositories .PP .SH SYNOPSIS git annex expire \fB[repository:]time ...\fP
@@ -1,6 +1,6 @@ .TH git-annex-find 1 .SH NAME-git-annex find \- lists available files+git-annex-find \- lists available files .PP .SH SYNOPSIS git annex find \fB[path ...]\fP
@@ -1,6 +1,6 @@ .TH git-annex-findref 1 .SH NAME-git-annex findref \- lists files in a git ref+git-annex-findref \- lists files in a git ref .PP .SH SYNOPSIS git annex findref \fB[ref]\fP
@@ -1,6 +1,6 @@ .TH git-annex-fix 1 .SH NAME-git-annex fix \- fix up symlinks to point to annexed content+git-annex-fix \- fix up symlinks to point to annexed content .PP .SH SYNOPSIS git annex fix \fB[path ...]\fP
@@ -1,6 +1,6 @@ .TH git-annex-forget 1 .SH NAME-git-annex forget \- prune git-annex branch history+git-annex-forget \- prune git-annex branch history .PP .SH SYNOPSIS git annex forget
@@ -1,6 +1,6 @@ .TH git-annex-fromkey 1 .SH NAME-git-annex fromkey \- adds a file using a specific key+git-annex-fromkey \- adds a file using a specific key .PP .SH SYNOPSIS git annex fromkey \fB[key file]\fP
@@ -1,6 +1,6 @@ .TH git-annex-fsck 1 .SH NAME-git-annex fsck \- check for problems+git-annex-fsck \- check for problems .PP .SH SYNOPSIS git annex fsck \fB[path ...]\fP
@@ -1,6 +1,6 @@ .TH git-annex-fuzztest 1 .SH NAME-git-annex fuzztest \- generates fuzz test files+git-annex-fuzztest \- generates fuzz test files .PP .SH SYNOPSIS git annex fuzztest
@@ -1,6 +1,6 @@ .TH git-annex-get 1 .SH NAME-git-annex get \- make content of annexed files available+git-annex-get \- make content of annexed files available .PP .SH SYNOPSIS git annex get \fB[path ...]\fP@@ -22,6 +22,10 @@ from. Use this option to specify which remote to use. .IP Any files that are not available on the remote will be silently skipped.+.IP+.IP "\fB\-\-jobs=N\fP \fB\-JN\fP"+Enables parallel download with up to the specified number of jobs+running at once. For example: \fB\-J10\fP .IP .IP "\fB\-\-all\fP" Rather than specifying a filename or path to get, this option can be
@@ -1,6 +1,6 @@ .TH git-annex-group 1 .SH NAME-git-annex group \- add a repository to a group+git-annex-group \- add a repository to a group .PP .SH SYNOPSIS git annex group \fBrepository groupname\fP
@@ -1,6 +1,6 @@ .TH git-annex-groupwanted 1 .SH NAME-git-annex groupwanted \- get or set groupwanted expression+git-annex-groupwanted \- get or set groupwanted expression .PP .SH SYNOPSIS git annex groupwanted \fBgroupname [expression]\fP
@@ -1,6 +1,6 @@ .TH git-annex-import 1 .SH NAME-git-annex import \- move and add files from outside git working copy+git-annex-import \- move and add files from outside git working copy .PP .SH SYNOPSIS git annex import \fB[path ...]\fP
@@ -1,6 +1,6 @@ .TH git-annex-importfeed 1 .SH NAME-git-annex importfeed \- import files from podcast feeds+git-annex-importfeed \- import files from podcast feeds .PP .SH SYNOPSIS git annex importfeed \fB[url ...]\fP
@@ -1,6 +1,6 @@ .TH git-annex-indirect 1 .SH NAME-git-annex indirect \- switch repository to indirect mode+git-annex-indirect \- switch repository to indirect mode .PP .SH SYNOPSIS git annex indirect
@@ -1,6 +1,6 @@ .TH git-annex-info 1 .SH NAME-git-annex info \- shows information about the specified item or the repository as a whole+git-annex-info \- shows information about the specified item or the repository as a whole .PP .SH SYNOPSIS git annex info \fB[directory|file|remote|uuid ...]\fP
@@ -1,6 +1,6 @@ .TH git-annex-init 1 .SH NAME-git-annex init \- initialize git-annex+git-annex-init \- initialize git-annex .PP .SH SYNOPSIS git annex init \fB[description]\fP
@@ -1,6 +1,6 @@ .TH git-annex-initremote 1 .SH NAME-git-annex initremote \- creates a special (non\-git) remote+git-annex-initremote \- creates a special (non\-git) remote .PP .SH SYNOPSIS git annex initremote \fBname type=value [param=value ...]\fP
@@ -1,6 +1,6 @@ .TH git-annex-list 1 .SH NAME-git-annex list \- show which remotes contain files+git-annex-list \- show which remotes contain files .PP .SH SYNOPSIS git annex list \fB[path ...]\fP
@@ -1,6 +1,6 @@ .TH git-annex-lock 1 .SH NAME-git-annex lock \- undo unlock command+git-annex-lock \- undo unlock command .PP .SH SYNOPSIS git annex lock \fB[path ...]\fP
@@ -1,6 +1,6 @@ .TH git-annex-log 1 .SH NAME-git-annex log \- shows location log+git-annex-log \- shows location log .PP .SH SYNOPSIS git annex log \fB[path ...]\fP
@@ -1,6 +1,6 @@ .TH git-annex-lookupkey 1 .SH NAME-git-annex lookupkey \- looks up key used for file+git-annex-lookupkey \- looks up key used for file .PP .SH SYNOPSIS git annex lookupkey \fB[file ...]\fP
@@ -1,6 +1,6 @@ .TH git-annex-map 1 .SH NAME-git-annex map \- generate map of repositories+git-annex-map \- generate map of repositories .PP .SH SYNOPSIS git annex map
@@ -1,6 +1,6 @@ .TH git-annex-merge 1 .SH NAME-git-annex merge \- automatically merge changes from remotes+git-annex-merge \- automatically merge changes from remotes .PP .SH SYNOPSIS git annex merge
@@ -1,6 +1,6 @@ .TH git-annex-metadata 1 .SH NAME-git-annex metadata \- sets or gets metadata of a file+git-annex-metadata \- sets or gets metadata of a file .PP .SH SYNOPSIS git annex metadata \fB[path ...]\fP
@@ -1,6 +1,6 @@ .TH git-annex-migrate 1 .SH NAME-git-annex migrate \- switch data to different backend+git-annex-migrate \- switch data to different backend .PP .SH SYNOPSIS git annex migrate \fB[path ...]\fP
@@ -1,6 +1,6 @@ .TH git-annex-mirror 1 .SH NAME-git-annex mirror \- mirror content of files to/from another repository+git-annex-mirror \- mirror content of files to/from another repository .PP .SH SYNOPSIS git annex mirror \fB[path ...] [\-\-to=remote|\-\-from=remote]\fP@@ -26,6 +26,10 @@ .IP "\fB\-\-from=remote\fP" Use the remote as the source repository, and mirror its contents to the local repository.+.IP+.IP "\fB\-\-jobs=N\fP \fB\-JN\fP"+Enables parallel transfers with up to the specified number of jobs+running at once. For example: \fB\-J10\fP .IP .IP "\fB\-\-all\fP" Mirror all objects stored in the git annex, not only objects used by
@@ -1,6 +1,6 @@ .TH git-annex-move 1 .SH NAME-git-annex move \- move content of files to/from another repository+git-annex-move \- move content of files to/from another repository .PP .SH SYNOPSIS git annex move \fB[path ...] [\-\-from=remote|\-\-to=remote]\fP@@ -17,6 +17,10 @@ .IP "\fB\-\-to=remote\fP" Use this option to move the content of files from the local repository to the specified remote.+.IP+.IP "\fB\-\-jobs=N\fP \fB\-JN\fP"+Enables parallel transfers with up to the specified number of jobs+running at once. For example: \fB\-J10\fP .IP .IP "\fB\-\-all\fP" Rather than specifying a filename or path to move, this option can be
@@ -1,6 +1,6 @@ .TH git-annex-numcopies 1 .SH NAME-git-annex numcopies \- configure desired number of copies+git-annex-numcopies \- configure desired number of copies .PP .SH SYNOPSIS git annex numcopies \fBN\fP
@@ -1,6 +1,6 @@ .TH git-annex-pre-commit 1 .SH NAME-git-annex pre\-commit \- run by git pre\-commit hook+git-annex-pre\-commit \- run by git pre\-commit hook .PP .SH SYNOPSIS git annex pre\-commit \fB[path ...]\fP
@@ -1,6 +1,6 @@ .TH git-annex-proxy 1 .SH NAME-git-annex proxy \- safely bypass direct mode guard+git-annex-proxy \- safely bypass direct mode guard .PP .SH SYNOPSIS git annex proxy \fB\-\- git cmd [options]\fP
@@ -1,6 +1,6 @@ .TH git-annex-readpresentkey 1 .SH NAME-git-annex readpresentkey \- read records of where key is present+git-annex-readpresentkey \- read records of where key is present .PP .SH SYNOPSIS git annex readpresentkey \fBkey uuid\fP
@@ -1,6 +1,6 @@ .TH git-annex-registerurl 1 .SH NAME-git-annex registerurl \- registers an url for a key+git-annex-registerurl \- registers an url for a key .PP .SH SYNOPSIS git annex registerurl \fB[key url]\fP
@@ -1,6 +1,6 @@ .TH git-annex-reinit 1 .SH NAME-git-annex reinit \- initialize repository, reusing old UUID+git-annex-reinit \- initialize repository, reusing old UUID .PP .SH SYNOPSIS git annex reinit \fBuuid|description\fP
@@ -1,6 +1,6 @@ .TH git-annex-reinject 1 .SH NAME-git-annex reinject \- sets content of annexed file+git-annex-reinject \- sets content of annexed file .PP .SH SYNOPSIS git annex reinject \fBsrc dest\fP
@@ -1,6 +1,6 @@ .TH git-annex-rekey 1 .SH NAME-git-annex rekey \- change keys used for files+git-annex-rekey \- change keys used for files .PP .SH SYNOPSIS git annex rekey \fB[file key ...]\fP
@@ -1,6 +1,6 @@ .TH git-annex-remotedaemon 1 .SH NAME-git-annex remotedaemon \- detects when remotes have changed, and fetches from them+git-annex-remotedaemon \- detects when remotes have changed, and fetches from them .PP .SH SYNOPSIS git annex remotedaemon
@@ -1,6 +1,6 @@ .TH git-annex-repair 1 .SH NAME-git-annex repair \- recover broken git repository+git-annex-repair \- recover broken git repository .PP .SH SYNOPSIS git annex repair
@@ -1,6 +1,6 @@ .TH git-annex-required 1 .SH NAME-git-annex required \- get or set required content expression+git-annex-required \- get or set required content expression .PP .SH SYNOPSIS git annex required \fBrepository [expression]\fP
@@ -1,6 +1,6 @@ .TH git-annex-resolvemerge 1 .SH NAME-git-annex resolvemerge \- resolve merge conflicts+git-annex-resolvemerge \- resolve merge conflicts .PP .SH SYNOPSIS git annex resolvemerge
@@ -1,6 +1,6 @@ .TH git-annex-rmurl 1 .SH NAME-git-annex rmurl \- record file is not available at url+git-annex-rmurl \- record file is not available at url .PP .SH SYNOPSIS git annex rmurl \fBfile url\fP
@@ -1,6 +1,6 @@ .TH git-annex-schedule 1 .SH NAME-git-annex schedule \- get or set scheduled jobs+git-annex-schedule \- get or set scheduled jobs .PP .SH SYNOPSIS git annex schedule \fBrepository [expression]\fP
@@ -1,6 +1,6 @@ .TH git-annex-semitrust 1 .SH NAME-git-annex semitrust \- return repository to default trust level+git-annex-semitrust \- return repository to default trust level .PP .SH SYNOPSIS git annex semitrust \fB[repository ...]\fP
@@ -1,6 +1,6 @@ .TH git-annex-setpresentkey 1 .SH NAME-git-annex setpresentkey \- change records of where key is present+git-annex-setpresentkey \- change records of where key is present .PP .SH SYNOPSIS git annex setpresentkey \fBkey uuid [1|0]\fP
@@ -33,6 +33,10 @@ This checks if all specified keys are present in the annex, and exits zero if so. .IP+Exits 1 if the key is certianly not present in the annex.+Exits 100 if it's unable to tell (perhaps the key is in the process of+being removed from the annex).+.IP .IP "dropkey directory [key ...]" This drops the annexed data for the specified keys. .IP
@@ -1,6 +1,6 @@ .TH git-annex-status 1 .SH NAME-git-annex status \- show the working tree status+git-annex-status \- show the working tree status .PP .SH SYNOPSIS git annex status \fB[path ...]\fP
@@ -1,6 +1,6 @@ .TH git-annex-sync 1 .SH NAME-git-annex sync \- synchronize local repository with remotes+git-annex-sync \- synchronize local repository with remotes .PP .SH SYNOPSIS git annex sync \fB[remote ...]\fP
@@ -1,6 +1,6 @@ .TH git-annex-test 1 .SH NAME-git-annex test \- run built\-in test suite+git-annex-test \- run built\-in test suite .PP .SH SYNOPSIS git annex test
@@ -1,6 +1,6 @@ .TH git-annex-testremote 1 .SH NAME-git-annex testremote \- test transfers to/from a remote+git-annex-testremote \- test transfers to/from a remote .PP .SH SYNOPSIS git annex testremote \fBremote\fP
@@ -1,6 +1,6 @@ .TH git-annex-transferkey 1 .SH NAME-git-annex transferkey \- transfers a key from or to a remote+git-annex-transferkey \- transfers a key from or to a remote .PP .SH SYNOPSIS git annex transferkey \fBkey [\-\-from=remote|\-\-to=remote]\fP
@@ -1,6 +1,6 @@ .TH git-annex-transferkeys 1 .SH NAME-git-annex transferkeys \- transfers keys+git-annex-transferkeys \- transfers keys .PP .SH SYNOPSIS git annex transferkeys
@@ -1,6 +1,6 @@ .TH git-annex-trust 1 .SH NAME-git-annex trust \- trust a repository+git-annex-trust \- trust a repository .PP .SH SYNOPSIS git annex trust \fB[repository ...]\fP
@@ -1,6 +1,6 @@ .TH git-annex-unannex 1 .SH NAME-git-annex unannex \- undo accidental add command+git-annex-unannex \- undo accidental add command .PP .SH SYNOPSIS git annex unannex \fB[path ...]\fP
@@ -1,6 +1,6 @@ .TH git-annex-undo 1 .SH NAME-git-annex undo \- undo last change to a file or directory+git-annex-undo \- undo last change to a file or directory .PP .SH SYNOPSIS git annex \fB[filename|directory] ...\fP@@ -13,7 +13,7 @@ contents of that directory. .PP Running undo a second time will undo the undo, returning the working-tree to the same state it had before. In order for undoing an undo of+tree to the same state it had before. To support undoing an undo of staged changes, any staged changes are first committed by the undo command. .PP
@@ -1,6 +1,6 @@ .TH git-annex-ungroup 1 .SH NAME-git-annex ungroup \- remove a repository from a group+git-annex-ungroup \- remove a repository from a group .PP .SH SYNOPSIS git annex ungroup \fBrepository groupname\fP
@@ -1,6 +1,6 @@ .TH git-annex-uninit 1 .SH NAME-git-annex uninit \- de\-initialize git-annex and clean out repository+git-annex-uninit \- de\-initialize git-annex and clean out repository .PP .SH SYNOPSIS git annex uninit
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff