git-annex 4.20131002 → 4.20131024
raw patch · 2081 files changed
+56770/−969 lines, 2081 filesdep ~basedep ~cryptohashbinary-added
Dependency ranges changed: base, cryptohash
Files
- .gitignore +7/−4
- Annex.hs +1/−1
- Annex/Branch.hs +89/−57
- Annex/CatFile.hs +1/−1
- Annex/Content.hs +16/−0
- Annex/Content/Direct.hs +1/−1
- Annex/Direct.hs +11/−8
- Annex/Journal.hs +39/−15
- Annex/Ssh.hs +35/−14
- Assistant.hs +5/−0
- Assistant/Alert.hs +35/−5
- Assistant/DaemonStatus.hs +4/−0
- Assistant/DeleteRemote.hs +1/−1
- Assistant/NamedThread.hs +19/−8
- Assistant/Sync.hs +16/−3
- Assistant/Threads/Committer.hs +13/−12
- Assistant/Threads/ConfigMonitor.hs +12/−11
- Assistant/Threads/Cronner.hs +236/−0
- Assistant/Threads/Glacier.hs +1/−1
- Assistant/Threads/Merger.hs +2/−2
- Assistant/Threads/MountWatcher.hs +3/−3
- Assistant/Threads/PairListener.hs +1/−1
- Assistant/Threads/SanityChecker.hs +63/−3
- Assistant/Threads/TransferScanner.hs +4/−4
- Assistant/Threads/TransferWatcher.hs +4/−5
- Assistant/Threads/Transferrer.hs +2/−2
- Assistant/Threads/Watcher.hs +11/−11
- Assistant/Threads/WebApp.hs +6/−1
- Assistant/Threads/XMPPClient.hs +12/−14
- Assistant/Types/DaemonStatus.hs +12/−4
- Assistant/Types/NamedThread.hs +6/−2
- Assistant/WebApp/Configurators/AWS.hs +3/−3
- Assistant/WebApp/Configurators/Delete.hs +1/−1
- Assistant/WebApp/Configurators/Edit.hs +1/−1
- Assistant/WebApp/Configurators/Fsck.hs +149/−0
- Assistant/WebApp/Configurators/IA.hs +2/−2
- Assistant/WebApp/Configurators/Local.hs +8/−8
- Assistant/WebApp/Configurators/Pairing.hs +1/−1
- Assistant/WebApp/Configurators/Preferences.hs +1/−1
- Assistant/WebApp/Configurators/Ssh.hs +12/−14
- Assistant/WebApp/Configurators/WebDAV.hs +3/−3
- Assistant/WebApp/Configurators/XMPP.hs +2/−2
- Assistant/WebApp/Gpg.hs +12/−3
- Assistant/WebApp/Page.hs +1/−1
- Assistant/WebApp/Repair.hs +80/−0
- Assistant/WebApp/Types.hs +5/−0
- Assistant/WebApp/routes +8/−0
- Backend/Hash.hs +8/−2
- Backend/URL.hs +5/−12
- Backend/Utilities.hs +25/−0
- Backend/WORM.hs +8/−6
- Build/BundledPrograms.hs +5/−2
- Build/Configure.hs +5/−57
- Build/Version.hs +69/−0
- Build/make-sdist.sh +0/−1
- BuildFlags.hs +6/−0
- CHANGELOG +46/−0
- Command/AddUrl.hs +12/−9
- Command/Direct.hs +2/−2
- Command/Fsck.hs +1/−1
- Command/PreCommit.hs +6/−3
- Command/Repair.hs +71/−0
- Command/Schedule.hs +50/−0
- Command/Status.hs +16/−14
- Command/Sync.hs +100/−37
- Command/Unused.hs +4/−15
- Command/Vicfg.hs +23/−4
- Creds.hs +0/−2
- Git/Branch.hs +1/−1
- Git/CatFile.hs +18/−43
- Git/CheckAttr.hs +34/−5
- Git/Command.hs +20/−7
- Git/Construct.hs +0/−2
- Git/DiffTree.hs +3/−2
- Git/FilePath.hs +6/−0
- Git/Fsck.hs +87/−0
- Git/HashObject.hs +5/−2
- Git/LsFiles.hs +6/−3
- Git/LsTree.hs +12/−7
- Git/Objects.hs +29/−0
- Git/Queue.hs +14/−6
- Git/RefLog.hs +22/−0
- Git/Remote.hs +3/−0
- Git/Repair.hs +495/−0
- Git/Types.hs +7/−0
- Git/UpdateIndex.hs +6/−0
- GitAnnex.hs +4/−0
- Limit.hs +2/−1
- Locations.hs +68/−20
- Logs.hs +4/−0
- Logs/FsckResults.hs +43/−0
- Logs/Schedule.hs +72/−0
- Makefile +10/−3
- Remote.hs +1/−0
- Remote/Bup.hs +1/−0
- Remote/Directory.hs +1/−0
- Remote/GCrypt.hs +1/−0
- Remote/Git.hs +24/−1
- Remote/Glacier.hs +1/−0
- Remote/Helper/Hooks.hs +1/−1
- Remote/Hook.hs +1/−0
- Remote/Rsync.hs +1/−0
- Remote/S3.hs +11/−9
- Remote/Web.hs +2/−1
- Remote/WebDAV.hs +1/−0
- Seek.hs +2/−1
- Test.hs +42/−12
- Types/Key.hs +8/−2
- Types/Remote.hs +5/−0
- Types/ScheduledActivity.hs +69/−0
- Utility/Batch.hs +49/−0
- Utility/Daemon.hs +4/−1
- Utility/Directory.hs +12/−7
- Utility/Hash.hs +25/−4
- Utility/HumanTime.hs +72/−14
- Utility/Lsof.hs +2/−2
- Utility/Misc.hs +1/−1
- Utility/Process.hs +4/−4
- Utility/QuickCheck.hs +3/−0
- Utility/Scheduled.hs +347/−0
- Utility/Url.hs +11/−4
- Utility/WebApp.hs +1/−1
- debian/changelog +46/−0
- doc/Android.mdwn +53/−0
- doc/Android/comment_15_77bafc01b47d4cf8f96bde2b6704ed71._comment +8/−0
- doc/Android/comment_19_dc7b428f525a082834cb87221fc627ff._comment +8/−0
- doc/Android/comment_20_81940ea56ace3dcd5fa84dfccd88ad96._comment +10/−0
- doc/Android/comment_29_37aa87a451d4390ed367402eec740855._comment +12/−0
- doc/Android/comment_5_ba11b81c671d9bcd6f496fbd6f562b0f._comment +16/−0
- doc/Android/oldcomments.mdwn +2/−0
- 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_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/android/DCIM.png binary
- doc/android/appinstalled.png binary
- doc/android/apps.png binary
- doc/android/install.png binary
- doc/android/newwindow.png binary
- doc/android/terminal.png binary
- doc/android/webapp.png binary
- doc/assistant.mdwn +42/−0
- doc/assistant/addsshserver.png binary
- doc/assistant/archival_walkthrough.mdwn +32/−0
- doc/assistant/brokenrepositoryalert.png binary
- doc/assistant/buddylist.png binary
- doc/assistant/cloudnudge.png binary
- doc/assistant/combinerepos.png binary
- doc/assistant/comment_1_f2c4857b7b000e005f0c19279db14eaf._comment +8/−0
- doc/assistant/comment_2_befa1f48e5a43a7965060491430a6bc4._comment +9/−0
- doc/assistant/controlmenu.png binary
- doc/assistant/crashrecovery.png binary
- doc/assistant/dashboard.png binary
- doc/assistant/deleterepository.png binary
- doc/assistant/encryptdrive.png binary
- doc/assistant/example.png binary
- doc/assistant/fsckconfig.png binary
- doc/assistant/genkey.png binary
- doc/assistant/iaitem.png binary
- doc/assistant/inotify_max_limit_alert.png binary
- doc/assistant/local_pairing_walkthrough.mdwn +90/−0
- doc/assistant/local_pairing_walkthrough/addrepository.png binary
- doc/assistant/local_pairing_walkthrough/pairing.png binary
- doc/assistant/local_pairing_walkthrough/pairrequest.png binary
- doc/assistant/local_pairing_walkthrough/secret.png binary
- doc/assistant/local_pairing_walkthrough/secretempty.png binary
- doc/assistant/logs.png binary
- doc/assistant/makerepo.png binary
- doc/assistant/menu.png binary
- doc/assistant/osx-app.png binary
- doc/assistant/preferences.png binary
- doc/assistant/quickstart.mdwn +30/−0
- doc/assistant/release_notes.mdwn +352/−0
- doc/assistant/remote_sharing_walkthrough.mdwn +12/−0
- doc/assistant/repairrepository.png binary
- doc/assistant/repogroups.png binary
- doc/assistant/repoinfo.png binary
- doc/assistant/repositories.png binary
- doc/assistant/rsync.net.encryption.png binary
- doc/assistant/rsync.net.png binary
- doc/assistant/running.png binary
- doc/assistant/share_with_a_friend_walkthrough.mdwn +58/−0
- doc/assistant/share_with_a_friend_walkthrough/buddylist.png binary
- doc/assistant/share_with_a_friend_walkthrough/pairing.png binary
- doc/assistant/share_with_a_friend_walkthrough/repolist.png binary
- doc/assistant/share_with_a_friend_walkthrough/xmppalert.png binary
- doc/assistant/thanks.mdwn +243/−0
- doc/assistant/thumbnail.png binary
- doc/assistant/xmpp.png binary
- doc/assistant/xmppnudge.png binary
- doc/assistant/xmpppairingend.png binary
- doc/automatic_conflict_resolution.mdwn +23/−0
- doc/backends.mdwn +42/−0
- doc/backends/comment_1_375bb1fb5973e8fa67b763f2dd6e404b._comment +13/−0
- doc/backends/comment_2_1f2626eca9004b31a0b7fc1a0df8027b._comment +24/−0
- doc/backends/comment_3_fdcbf8727fdefb9942a54689234b9698._comment +12/−0
- doc/bare_repositories.mdwn +48/−0
- doc/bare_repositories/comment_1_148e1da70d37d311634a0309a4ff8dcd._comment +22/−0
- doc/bugs.mdwn +18/−0
- doc/bugs/3.20121112:_build_error_in_assistant.mdwn +432/−0
- doc/bugs/3.20121112_build_fails_on_Ubuntu_12.04.mdwn +97/−0
- doc/bugs/3.20121113_build_error___39__not_in_scope_getAddBoxComR__39__.mdwn +33/−0
- doc/bugs/4.20130601_xmpp_sync_error.mdwn +125/−0
- doc/bugs/400_mode_leakage.mdwn +25/−0
- doc/bugs/Add_another_repository_on_USB_drive_causes_sync_loop.mdwn +22/−0
- doc/bugs/Adding_box.com_remote_on_Android_fails_for_me.mdwn +20/−0
- doc/bugs/Adding_git_ssh_remote_fails.mdwn +32/−0
- doc/bugs/Adding_second_remote_repository_over_ssh_fails.mdwn +41/−0
- doc/bugs/Addurl_downloads_but_does_not_checkout_files.mdwn +74/−0
- doc/bugs/Allow_syncing_to_a_specific_directory_on_a_USB_remote.mdwn +30/−0
- doc/bugs/Android_app_permission_denial_on_startup.mdwn +18/−0
- doc/bugs/Android_daily_build_missing_webapp.mdwn +23/−0
- doc/bugs/Annex_thinks_file_exists_afer_being_dropped.mdwn +27/−0
- doc/bugs/Assistant_doesn__39__t_actually_sync_file_contents_by_default.mdwn +16/−0
- doc/bugs/Assistant_dropping_from_backup_repo.mdwn +28/−0
- doc/bugs/Assistant_stalls_when_adding__47__creating_repo_on_ArchLinux.mdwn +75/−0
- doc/bugs/Assistant_uses_obsolete_GDU_volume_monitor.mdwn +28/−0
- doc/bugs/Build-depends_needs___39__hxt__39___added_-_3.20121127.mdwn +36/−0
- doc/bugs/Build_error_on_Mac_OSX_10.6.mdwn +11/−0
- doc/bugs/Build_failure_at_commit_1efe4f3.mdwn +45/−0
- doc/bugs/Building_fails:_Could_not_find_module___96__Text.Blaze__39__.mdwn +105/−0
- doc/bugs/Building_fails:_Not_in_scope:___96__myHomeDir__39___.mdwn +56/−0
- doc/bugs/Cabal_cannot_solve_dependencies.mdwn +36/−0
- doc/bugs/Cabal_dependency_monadIO_missing.mdwn +17/−0
- doc/bugs/Calls_to_rsync_don__39__t_always_use__annex-rsync-options.mdwn +35/−0
- doc/bugs/Can__39__t___34__git-annex_get__34___with_3.20111203.mdwn +27/−0
- doc/bugs/Can__39__t_rename___34__here__34___repository.mdwn +32/−0
- doc/bugs/Can__39__t_set_repositories_directory.mdwn +15/−0
- doc/bugs/Can__39__t_start_on_Cyanogenmod_10.2_nightly.mdwn +158/−0
- doc/bugs/Cannot_build_the_latest_with_GHC_7.6.1.mdwn +18/−0
- doc/bugs/Cannot_clone_an_annex.mdwn +69/−0
- doc/bugs/Cannot_copy_to_a_git-annex_remote.mdwn +14/−0
- doc/bugs/Committer_crashed.mdwn +32/−0
- doc/bugs/Compile_needs_more_than_1.5gb_of_memory.mdwn +16/−0
- doc/bugs/Complete_failure_trying_to_unannex_a_large_annex.mdwn +56/−0
- doc/bugs/ControlPath_too_long_for_Unix_domain_socket.mdwn +53/−0
- doc/bugs/Could_not_find_module_Data.Default.mdwn +33/−0
- doc/bugs/Could_not_read_from_remote_repository.mdwn +24/−0
- doc/bugs/Could_not_resolve_dependencies.mdwn +40/−0
- doc/bugs/Crash_trying_to_sync_with_a_repo_over_ssh.mdwn +43/−0
- doc/bugs/Crash_when_adding_jabber_account_.mdwn +32/−0
- doc/bugs/Creating_an_encrypted_S3_does_not_check_for_presence_of_GPG.mdwn +18/−0
- doc/bugs/DS__95__Store_not_gitignored.mdwn +26/−0
- doc/bugs/Deasn__39__t_clean_up_ssh_keys_after_removing_remote_repo.mdwn +18/−0
- doc/bugs/Detection_assumes_that_shell_is_bash.mdwn +24/−0
- doc/bugs/Difficult_to_troubleshoot_XMPP_login_failures.mdwn +11/−0
- doc/bugs/Direct_mode_keeps_re-checksuming_duplicated_files.mdwn +25/−0
- doc/bugs/Direct_mode_repositories_end_up_with_unstaged_changes.mdwn +46/−0
- doc/bugs/Direct_mode_repositories_still_use_symlinks_sometimes.mdwn +32/−0
- doc/bugs/Disconcerting_warning_from_git-annex.mdwn +6/−0
- doc/bugs/Displayed_copy_speed_is_wrong.mdwn +8/−0
- doc/bugs/Error_creating_remote_repository_using_ssh_on_OSX.mdwn +36/−0
- doc/bugs/Error_when_dropping___34__hGetLine:_end_of_file__34__.mdwn +31/−0
- doc/bugs/Error_when_moving_annexed_file_to_a_.gitignored_location.mdwn +21/−0
- doc/bugs/Every_new_file_gets_symlinked_to_a_git_object.mdwn +78/−0
- doc/bugs/Fails_to_create_remote_repo_if_no_global_email_set.mdwn +55/−0
- doc/bugs/Feature_request:___34__quvi__34___flag.mdwn +14/−0
- doc/bugs/Files_disappear_from_locally_paired_annexes_when_edited.mdwn +36/−0
- doc/bugs/GIT_DIR_support_incomplete.mdwn +17/−0
- doc/bugs/GPG_can__39__t_handle_some_files.mdwn +23/−0
- doc/bugs/GPG_passphrase_repeated_prompt.mdwn +24/−0
- doc/bugs/GPG_problem_on_Mac.mdwn +34/−0
- doc/bugs/Glacier_remote_uploads_duplicates.mdwn +36/−0
- doc/bugs/Hanging_on_install_on_Mountain_lion.mdwn +26/−0
- doc/bugs/Hangs_on_creating_repository_when_using_--listen.mdwn +46/−0
- doc/bugs/Hard_links_not_synced_in_direct_mode.mdwn +125/−0
- doc/bugs/Huge_annex_out_of_memory_on_switch_to_indirect_mode_and_status.mdwn +69/−0
- doc/bugs/Incorrect_version_on_64_Standalone_Build.mdwn +11/−0
- doc/bugs/Install_of_git-annex-3.20121112_fails.mdwn +20/−0
- doc/bugs/Internal_Server_Error:_Unknown_UUID.mdwn +37/−0
- doc/bugs/Internal_Server_Error_unknown_UUID__59___cannot_modify.mdwn +26/−0
- doc/bugs/Internal_server_error_adding_USB_drive_on_OS_X.mdwn +25/−0
- doc/bugs/Is_there_any_way_to_rate_limit_uploads_to_an_S3_backend__63__.mdwn +19/−0
- doc/bugs/Issue_on_OSX_with_some_system_limits.mdwn +26/−0
- doc/bugs/It_is_very_easy_to_turn_git-annex_into_a_zombie.mdwn +25/−0
- doc/bugs/JSON_output_broken_with___34__git_annex_sync__34__.mdwn +21/−0
- doc/bugs/Killing_the_assistant_daemon_leaves_ssh_mux_sessions_behind.mdwn +38/−0
- doc/bugs/Last_two_versions_didn__39__t_show_up_on_hackage.mdwn +11/−0
- doc/bugs/Local_files_not_found.mdwn +50/−0
- doc/bugs/Local_network___40__ssh__41___fails_to_pair__47__sync.mdwn +175/−0
- doc/bugs/Local_pairing_fails:_PairListener_crashed.mdwn +18/−0
- doc/bugs/Lost_S3_Remote.mdwn +59/−0
- doc/bugs/Lost_S3_Remote/comment_1_6e80e6db6671581d471fc9a54181c04c._comment +10/−0
- doc/bugs/Lost_S3_Remote/comment_2_c99c65882a3924f4890e500f9492b442._comment +8/−0
- doc/bugs/Lost_S3_Remote/comment_3_1e434d5a20a692cd9dc7f6f8f20f30dd._comment +8/−0
- doc/bugs/Makefile_is_missing_dependancies.mdwn +47/−0
- doc/bugs/Manual_content_mode_isn__39__t_manual.mdwn +89/−0
- doc/bugs/Manual_mode_weirdness.mdwn +37/−0
- doc/bugs/Missing_repo_uuid_after_local_pairing_with_older_annex.mdwn +31/−0
- doc/bugs/More_sync__39__ing_weirdness_with_the_assistant_branch_on_OSX.mdwn +15/−0
- doc/bugs/Most_recent_git-annex_will_not_build_on_OpenIndiana.mdwn +36/−0
- doc/bugs/Name_scheme_does_not_follow_git__39__s_rules.mdwn +31/−0
- doc/bugs/Need_to_manually_install_c2hs_-_3.20121127_and_previous.mdwn +37/−0
- doc/bugs/No_easy_way_to_re-inject_a_file_into_an_annex.mdwn +12/−0
- doc/bugs/No_progress_bars_with_S3.mdwn +26/−0
- doc/bugs/No_version_information_from_cli.mdwn +18/−0
- doc/bugs/OSX_alias_permissions_and_versions_problem.mdwn +37/−0
- doc/bugs/OSX_app_issues.mdwn +6/−0
- doc/bugs/OSX_app_issues/comment_10_54d8f3e429df9a9958370635c890abf0._comment +11/−0
- doc/bugs/OSX_app_issues/comment_10_6d23232fbb15d0ee3ab532a4884f81ed._comment +10/−0
- doc/bugs/OSX_app_issues/comment_11_5db2baa771fd01a284eac8a16c1c8c67._comment +8/−0
- doc/bugs/OSX_app_issues/comment_11_bb2ceb95a844449795addee6986d0763._comment +26/−0
- doc/bugs/OSX_app_issues/comment_12_62170597c7f441d84d48986857998858._comment +10/−0
- doc/bugs/OSX_app_issues/comment_12_f3bc5a4e4895ac9351786f0bdd8005ba._comment +11/−0
- doc/bugs/OSX_app_issues/comment_13_cb12d419459e5cac766022ee0697fedc._comment +18/−0
- doc/bugs/OSX_app_issues/comment_14_c966fa549bc73c52034ac9abc49de52a._comment +8/−0
- doc/bugs/OSX_app_issues/comment_15_10f1df95266f1a8c9ef933183190f6e2._comment +8/−0
- doc/bugs/OSX_app_issues/comment_16_064e151da121f9c2ef13c19ecb4e7458._comment +16/−0
- doc/bugs/OSX_app_issues/comment_2_fd560811c57df5cbc3976639642b8b19._comment +8/−0
- doc/bugs/OSX_app_issues/comment_7_93e0bb53ac2d7daef53426fbdc5f92d9._comment +15/−0
- doc/bugs/OSX_app_issues/comment_8_141eac2f3fb25fe18b4268786f00ad6a._comment +8/−0
- doc/bugs/OSX_app_issues/comment_8_f4d5b2645d7f29b80925159efb94a998._comment +8/−0
- doc/bugs/OSX_app_issues/comment_9_2e6dfca0fd8df04066769653724eae28._comment +17/−0
- doc/bugs/OSX_app_issues/comment_9_e1bbe83a1b9a7385ed6d443d0cc22bc7._comment +18/−0
- doc/bugs/OSX_app_issues/old.mdwn +1/−0
- doc/bugs/OSX_git-annex.app_error:__LSOpenURLsWithRole__40____41__.mdwn +26/−0
- doc/bugs/OS_X_10.8:_Can__39__t_reopen_webapp.mdwn +31/−0
- doc/bugs/Old_repository_stuck.mdwn +9/−0
- doc/bugs/On_Windows__44___wget_is_not_used__44___even_if_available.mdwn +67/−0
- doc/bugs/Out_of_memory_error_in_fsck_whereis_find_and_status_cmds.mdwn +84/−0
- doc/bugs/Partial_direct__47__indirect_repo.mdwn +24/−0
- doc/bugs/Prevent_accidental_merges.mdwn +14/−0
- doc/bugs/Problem_when_dropping_unused_files.mdwn +21/−0
- doc/bugs/Problem_with_bup:_cannot_lock_refs.mdwn +52/−0
- doc/bugs/Problems_building_on_Mac_OS_X.mdwn +62/−0
- doc/bugs/Problems_running_make_on_osx.mdwn +49/−0
- doc/bugs/Problems_with_syncing_gnucash.mdwn +568/−0
- doc/bugs/Provide_64-bit_standalone_build.mdwn +6/−0
- doc/bugs/Proxy_support.mdwn +18/−0
- doc/bugs/Remote_repo_and_set_operation_with_find.mdwn +6/−0
- doc/bugs/Remote_repositories_have_to_be_setup_encrypted.mdwn +27/−0
- doc/bugs/Renamed_special_remote_cannot_be_reactivated_by_the_webapp.mdwn +30/−0
- doc/bugs/Repository_deletion_error.mdwn +46/−0
- doc/bugs/Resource_exhausted.mdwn +45/−0
- doc/bugs/Resource_leak_somewhere_in_the___39__get__39___code.mdwn +24/−0
- doc/bugs/Rsync_encrypted_remote_asks_for_ssh_key_password_for_each_file.mdwn +30/−0
- doc/bugs/Rsync_remote_created_via_webapp_remains_empty.mdwn +138/−0
- doc/bugs/S3_bucket_uses_the_same_key_for_encryption_and_hashing.mdwn +10/−0
- doc/bugs/S3_buckets_with_capital_letters_breaks_authentication.mdwn +32/−0
- doc/bugs/S3_memory_leaks.mdwn +14/−0
- doc/bugs/S3_memory_leaks/comment_1_a7268213b090bce6b1f1858a8e23d90e._comment +14/−0
- doc/bugs/S3_upload_not_using_multipart.mdwn +53/−0
- doc/bugs/Segfaults_on_Fedora_18_with_SELinux_enabled.mdwn +65/−0
- doc/bugs/Selfsigned_certificates_with_jabber_fail_miserably..mdwn +22/−0
- doc/bugs/Should_ignore_.thumbnails__47___on_android.mdwn +28/−0
- doc/bugs/Should_try_again_when_network_fails___40__esp._DNS__41__.mdwn +50/−0
- doc/bugs/Small_archive_behaving_like_archive.mdwn +33/−0
- doc/bugs/Stale_lock_files_on_Android.mdwn +44/−0
- doc/bugs/Stress_test.mdwn +45/−0
- doc/bugs/Stress_test/comment_10_1694e990eab6592159309c231c6dcc16._comment +12/−0
- doc/bugs/Stress_test/comment_11_ab4cb6eefd279e6c1f229e089f703581._comment +25/−0
- doc/bugs/Stress_test/comment_1_c4c764488ac082f5c48d3a6b4b5fba42._comment +17/−0
- doc/bugs/Stress_test/comment_2_42125bba09a0ea9821cda7183e458100._comment +47/−0
- doc/bugs/Stress_test/comment_3_8240e61106b494d3600ad91f16eb5b1c._comment +20/−0
- doc/bugs/Stress_test/comment_4_c38d84e0dcc834931804c44bce7f7b7a._comment +11/−0
- doc/bugs/Stress_test/comment_5_60ce20ee255451c4ea809ba475561adb._comment +15/−0
- doc/bugs/Stress_test/comment_6_1371562e201393986cd41597f6f288cb._comment +14/−0
- doc/bugs/Stress_test/comment_7_a14be7699da224a8f6c9b34f1b911219._comment +8/−0
- doc/bugs/Stress_test/comment_8_a01995bdca7ade7dde9842b53fbc4e0c._comment +57/−0
- doc/bugs/Stress_test/comment_9_9f7efe81b7e40aaa04a865394c53e20f._comment +52/−0
- doc/bugs/Switching_from_indirect_mode_to_direct_mode_breaks_duplicates.mdwn +30/−0
- doc/bugs/Syncing_creates_broken_links_instead_of_proper_files.mdwn +51/−0
- doc/bugs/Test_failure_on_debian_dropunused.mdwn +31/−0
- doc/bugs/The_assistant_hangs_forever.mdwn +46/−0
- doc/bugs/The_webapp_doesn__39__t_allow_deleting_repositories.mdwn +33/−0
- doc/bugs/TransferScanner_crash_on_Android.mdwn +24/−0
- doc/bugs/Tries_to_upload_to_remote_although_remote_is_dead.mdwn +51/−0
- doc/bugs/Trouble_initializing_git_annex_on_NFS.mdwn +16/−0
- doc/bugs/True_backup_support.mdwn +7/−0
- doc/bugs/Truncated_file_transferred_via_S3.mdwn +614/−0
- doc/bugs/Unable_to_add_files_on_Android_due_to_weird_rename_error.mdwn +37/−0
- doc/bugs/Unable_to_import_feed.mdwn +27/−0
- doc/bugs/Unable_to_switch_back_to_direct_mode.mdwn +55/−0
- doc/bugs/Unable_to_sync_a_second_machine_through_Box.mdwn +46/−0
- doc/bugs/Unable_to_use_remotes_with_space_in_the_path.mdwn +35/−0
- doc/bugs/Unfortunate_interaction_with_Calibre.mdwn +24/−0
- doc/bugs/Unknown_command___39__list__39__.mdwn +15/−0
- doc/bugs/Unknown_remote_type_webdav.mdwn +8/−0
- doc/bugs/Update_dependency_on_certificate___62____61___1.3.3.mdwn +64/−0
- doc/bugs/Use_a_git_repository_on_the_server_don__39__t_work.mdwn +49/−0
- doc/bugs/Using_Github_as_remote_throws_proxy_errors.mdwn +27/−0
- doc/bugs/Using_a_revoked_GPG_key.mdwn +34/−0
- doc/bugs/WEBDAV_443.mdwn +307/−0
- doc/bugs/WEBDAV_443/comment_10_9ee2c5ed44295455af890caee7b06f1a._comment +18/−0
- doc/bugs/WEBDAV_443/comment_11_863a7d315212c9a8ab8f6fafa5d1b7f5._comment +8/−0
- doc/bugs/WEBDAV_443/comment_12_c17a4e23011e0a917dbe0ecf7e9f0cb5._comment +8/−0
- doc/bugs/WEBDAV_443/comment_13_3414416ff455d2fd1a7c7e7c4554b54d._comment +11/−0
- doc/bugs/WEBDAV_443/comment_14_e1da141eefb0445c217e5f5c119356da._comment +8/−0
- doc/bugs/WEBDAV_443/comment_15_41c3134bcc222b97bf183559723713d9._comment +27/−0
- doc/bugs/WEBDAV_443/comment_16_89621b526065b5bef753ce75db1af7b5._comment +14/−0
- doc/bugs/WEBDAV_443/comment_17_131a1b65c8008cf9f02c93d4fb75720b._comment +10/−0
- doc/bugs/WEBDAV_443/comment_18_b4f894a0b9ebb84ab73f6ffcf0778090._comment +29/−0
- doc/bugs/WEBDAV_443/comment_1_c6572ca1eaaf89b01c0ed99a4058412f._comment +10/−0
- doc/bugs/WEBDAV_443/comment_2_a357969cde382a91e13920ee1e9f711c._comment +8/−0
- doc/bugs/WEBDAV_443/comment_3_213815d6b827d467c60f3e8af925813b._comment +14/−0
- doc/bugs/WEBDAV_443/comment_4_b775be4b722fc7124d9fbe2d5d01cc9f._comment +22/−0
- doc/bugs/WEBDAV_443/comment_5_c4ea745da437e56b2426d1c2c00dfcec._comment +17/−0
- doc/bugs/WEBDAV_443/comment_6_ef05c0ae88fee9c626922c6064ffdf1e._comment +8/−0
- doc/bugs/WEBDAV_443/comment_7_eecabe8d5ed564cb540450770ca7d0b6._comment +8/−0
- doc/bugs/WEBDAV_443/comment_8_7f77ba8ebd90186d3b3949ae529ba393._comment +12/−0
- doc/bugs/WEBDAV_443/comment_9_87ebdc92b48d672964fb3f248c53600f._comment +9/−0
- doc/bugs/WORM:_Handle_long_filenames_correctly.mdwn +4/−0
- doc/bugs/Watcher_crashed:_addWatch:_does_not_exist.mdwn +25/−0
- doc/bugs/WebDAV_HandshakeFailed_.mdwn +7/−0
- doc/bugs/Webapp_fails_to_resolve_ipv6_hostname.mdwn +15/−0
- doc/bugs/Weird_behaviour_of_direct_and_indirect_annexes.mdwn +57/−0
- doc/bugs/Windows_and_Linux_in_direct_mode_confuses_git.mdwn +379/−0
- doc/bugs/Windows_build_test_failures.mdwn +1232/−0
- doc/bugs/With_S3__44___GPG_ask_for_a_new_passphrase.mdwn +21/−0
- doc/bugs/Wrong_port_while_configuring_ssh_remote.mdwn +35/−0
- doc/bugs/__34__Adding_4923_files__34___is_really_slow.mdwn +100/−0
- doc/bugs/__34__drop__34___deletes_all_files_with_identical_content.mdwn +49/−0
- doc/bugs/__34__fatal:_bad_config_file__34__.mdwn +14/−0
- doc/bugs/__34__git_annex_watch__34___adds_map.dot.mdwn +23/−0
- doc/bugs/__34__make_test__34___fails_silently.mdwn +4/−0
- doc/bugs/__91__webapp__93___pause_syncing_with_specific_repository.mdwn +8/−0
- doc/bugs/__96__git_annex_fix__96___run_on_non-annexed_files_is_no-op.mdwn +15/−0
- doc/bugs/__96__git_annex_import__96___clobbers_mtime.mdwn +62/−0
- doc/bugs/__96__git_annex_sync__96___ignores_remotes.mdwn +106/−0
- doc/bugs/_impossible_to_switch_repositories_on_android__in_webapp.mdwn +21/−0
- doc/bugs/acl_not_honoured_in_rsync_remote.mdwn +57/−0
- doc/bugs/add_range_argument_to___34__git_annex_dropunused__34___.mdwn +21/−0
- doc/bugs/add_script-friendly_output_options.mdwn +19/−0
- doc/bugs/added_branches_makes___39__git_annex_unused__39___slow.mdwn +87/−0
- doc/bugs/adding_an_rsync.net_repo_give_an_gpg_error.mdwn +22/−0
- doc/bugs/addurl_--relaxed_with_--file_doesn__39__t_actually_relax.mdwn +26/−0
- doc/bugs/addurl_fails_on_the_internet_archive.mdwn +65/−0
- doc/bugs/allows_repository_with_the_same_name_twice.mdwn +24/−0
- doc/bugs/android:_high_CPU_usage__44___unclear_how_to_quit.mdwn +28/−0
- doc/bugs/android_4.2.1__44___galaxy_nexus_java.lang.SecurityException.mdwn +41/−0
- doc/bugs/annex-rsync-options_shell-split_carelessly.mdwn +16/−0
- doc/bugs/annex.numcopies_not_overriden_by_--numcopies_option.mdwn +16/−0
- doc/bugs/annex_add_in_annex.mdwn +6/−0
- doc/bugs/annex_get_fails:___34__No_such_file_or_directory__34__.mdwn +68/−0
- doc/bugs/annex_get_over_SSH_is_very_slow.mdwn +33/−0
- doc/bugs/annex_unannex__47__uninit_should_handle_copies.mdwn +20/−0
- doc/bugs/another_build_error_in_assistant.mdwn +79/−0
- doc/bugs/archiving_git_repositories.mdwn +1/−0
- doc/bugs/assistant_-_GTalk_collision.mdwn +17/−0
- doc/bugs/assistant_always_assumes_port_22__63__.mdwn +39/−0
- doc/bugs/assistant_bails_when_adding_encrypted_usbdrive_repo_on_mac.mdwn +51/−0
- doc/bugs/assistant_does_not_allow_adding_an_existing_repo.mdwn +8/−0
- doc/bugs/assistant_does_not_list_remote___39__origin__39__.mdwn +26/−0
- doc/bugs/assistant_does_not_warn_on_files_it_failed_to_add.mdwn +46/−0
- doc/bugs/assistant_doesn__39__t_sync_empty_directories.mdwn +30/−0
- doc/bugs/assistant_doesn__39__t_sync_file_permissions.mdwn +45/−0
- doc/bugs/assistant_fails_to_sync_in_preferred_content_mode_manual.mdwn +24/−0
- doc/bugs/assistant_hangs_during_commit.mdwn +27/−0
- doc/bugs/assistant_ignore_.gitignore.mdwn +31/−0
- doc/bugs/assistant_not_noticing_file_renames__44___not_fixing_files.mdwn +68/−0
- doc/bugs/assistant_syncs_with_remotes_even_when_all_remotes_disabled.mdwn +33/−0
- doc/bugs/authentication_to_rsync.net_fails.mdwn +30/−0
- doc/bugs/backend_version_upgrade_leaves_repo_unusable.mdwn +72/−0
- doc/bugs/bad_behaviour_with_file_names_with_newline_in_them.mdwn +5/−0
- doc/bugs/bad_comment_in_ssh_public_key_ssh-rsa.mdwn +22/−0
- doc/bugs/bare_git_repos.mdwn +29/−0
- doc/bugs/box.com_never_stops_syncing..mdwn +63/−0
- doc/bugs/build_fails_in_Assistant__47__WebApp__47__Gpg.hs.mdwn +57/−0
- doc/bugs/build_is_broken_at_commit_cc0e5b7.mdwn +13/−0
- doc/bugs/build_issue_with_8baff14054e65ecbe801eb66786a55fa5245cb30.mdwn +43/−0
- doc/bugs/build_issue_with_latest_release_0.20110522-1-gde817ba.mdwn +14/−0
- doc/bugs/build_problem_on_OSX.mdwn +18/−0
- doc/bugs/building_on_lenny.mdwn +80/−0
- doc/bugs/bup_initremote_failed_with_localhost_+_username.mdwn +49/−0
- doc/bugs/cabal_configure_is_broken_on_OSX_builds.mdwn +14/−0
- doc/bugs/cabal_install_fails_to_install_manpage.mdwn +43/−0
- doc/bugs/can__39__t_annex_get_from_annex_in_direct_mode.mdwn +23/−0
- doc/bugs/cannot_add_file__44___get___34__user_error__34__.mdwn +32/−0
- doc/bugs/cannot_connect_to_xmpp_server.mdwn +32/−0
- doc/bugs/cannot_determine_uuid_for_origin.mdwn +135/−0
- doc/bugs/cannot_link_executable_on_android.mdwn +28/−0
- doc/bugs/case-insensitive.mdwn +20/−0
- doc/bugs/case_sensitivity_on_FAT.mdwn +49/−0
- doc/bugs/check_for_curl_in_configure.hs.mdwn +92/−0
- doc/bugs/clicking_back_in_the_web_browser_crashes.mdwn +23/−0
- doc/bugs/com.branchable.git-annex.assistant.plist_is_invalid.mdwn +15/−0
- doc/bugs/commitBuffer:_invalid_argument___40__invalid_character__41__.mdwn +228/−0
- doc/bugs/commit_f20a40f_breaks_on_OSX_as_mntent.h_doesn__39__t_exist.mdwn +8/−0
- doc/bugs/concurrent_git-annex_processes_can_lead_to_locking_issues.mdwn +53/−0
- doc/bugs/configurable_path_to_git-annex-shell.mdwn +7/−0
- doc/bugs/configure_script_should_detect_uuidgen_instead_of_just_uuid.mdwn +6/−0
- doc/bugs/conflicting_haskell_packages.mdwn +17/−0
- doc/bugs/conq:_invalid_command_syntax.mdwn +30/−0
- doc/bugs/copy_doesn__39__t_scale.mdwn +38/−0
- doc/bugs/copy_fast_confusing_with_broken_locationlog.mdwn +6/−0
- doc/bugs/copy_to_webdav_sometimes_doesn__39__t_work.mdwn +69/−0
- doc/bugs/creating_a_plain_directory_where_a_mountpoint_should_have_been.mdwn +27/−0
- doc/bugs/creating_a_remote_server_repository.mdwn +24/−0
- doc/bugs/creds_directory_not_automatically_created.mdwn +3/−0
- doc/bugs/cross_platform_permissions_woes.mdwn +36/−0
- doc/bugs/cyclic_drop.mdwn +104/−0
- doc/bugs/direct_mode_assistant_in_subdir_confusion.mdwn +37/−0
- doc/bugs/direct_mode_renames.mdwn +15/−0
- doc/bugs/direct_repository_on_FAT32_fails_to_addurl_containing___63__.mdwn +44/−0
- doc/bugs/done.mdwn +4/−0
- doc/bugs/dotdot_problem.mdwn +4/−0
- doc/bugs/drop_fails_to_see_copies_that_whereis_sees.mdwn +69/−0
- doc/bugs/dropping_and_re-adding_from_web_remotes_doesn__39__t_work.mdwn +139/−0
- doc/bugs/dropping_files_with_a_URL_backend_fails.mdwn +13/−0
- doc/bugs/dropunused_doesn__39__t_handle_double_spaces_in_filename.mdwn +87/−0
- doc/bugs/dropunused_doesn__39__t_work_in_my_case__63__.mdwn +70/−0
- doc/bugs/encfs_accused_of_being_crippled.mdwn +41/−0
- doc/bugs/encrpyted_ssh_remote_on_macosx.mdwn +42/−0
- doc/bugs/encrypted_S3_stalls.mdwn +9/−0
- doc/bugs/encryption_given_a_gpg_keyid_still_uses_symmetric_encryption.mdwn +46/−0
- doc/bugs/encryption_key_is_surprising.mdwn +24/−0
- doc/bugs/error_building_git-annex_3.20120624_using_cabal.mdwn +159/−0
- doc/bugs/error_on_only_repository_copy_deletion.mdwn +16/−0
- doc/bugs/error_propigation.mdwn +3/−0
- doc/bugs/error_when_using_repositories_with_non-ASCII_characters.mdwn +62/−0
- doc/bugs/error_with_file_names_starting_with_dash.mdwn +15/−0
- doc/bugs/extraneous_shell_escaping_for_rsync_remotes.mdwn +15/−0
- doc/bugs/fails_to_handle_lot_of_files.mdwn +445/−0
- doc/bugs/failure_to_return_to_indirect_mode_on_usb.mdwn +19/−0
- doc/bugs/fat_support.mdwn +13/−0
- doc/bugs/fat_support/comment_1_04bcc4795d431e8cb32293aab29bbfe2._comment +12/−0
- doc/bugs/fat_support/comment_2_bb4a97ebadb5c53809fc78431eabd7c8._comment +14/−0
- doc/bugs/fat_support/comment_3_df3b943bc1081a8f3f7434ae0c8e061e._comment +11/−0
- doc/bugs/fat_support/comment_4_90a8a15bedd94480945a374f9d706b86._comment +10/−0
- doc/bugs/fat_support/comment_5_64bbf89de0836673224b83fdefa0407b._comment +8/−0
- doc/bugs/fat_support/comment_6_a3b6000330c9c376611c228d746a1d55._comment +8/−0
- doc/bugs/fat_support/comment_7_a0ac7f2c44efc8116940c7b94b35e9d0._comment +7/−0
- doc/bugs/fat_support/comment_8_acc947643a635eb10a1bff92083a3506._comment +10/−0
- doc/bugs/fatal:_empty_ident_name.mdwn +51/−0
- doc/bugs/file_access__47__locking_issues_with_the_assitant.mdwn +54/−0
- doc/bugs/file_modification_times.mdwn +13/−0
- doc/bugs/free_space_checking.mdwn +21/−0
- doc/bugs/fsck_output.mdwn +46/−0
- doc/bugs/fsck_should_double-check_when_a_content-check_fails.mdwn +3/−0
- doc/bugs/fsck_thinks_file_content_is_bad_when_it_isn__39__t.mdwn +35/−0
- doc/bugs/gcrypt_initremote_pushes_git-annex_but_not_master.mdwn +19/−0
- doc/bugs/get_failed__44___but_remote_has_the_file.mdwn +40/−0
- doc/bugs/git-annex:_Argument_list_too_long.mdwn +40/−0
- doc/bugs/git-annex:_Cannot_decode_byte___39____92__xfc__39__.mdwn +34/−0
- doc/bugs/git-annex:_Not_in_a_git_repository._.mdwn +22/−0
- doc/bugs/git-annex:_fd:14:_hGetLine:_end_of_file.mdwn +51/−0
- doc/bugs/git-annex:_getUserEntryForID:_failed___40__Success__41__.mdwn +13/−0
- doc/bugs/git-annex:_status:_1_failed.mdwn +25/−0
- doc/bugs/git-annex_3.20130216.1_tests_are_broken.mdwn +43/−0
- doc/bugs/git-annex_add_should_repack_as_it_goes.mdwn +32/−0
- doc/bugs/git-annex_branch_corruption.mdwn +95/−0
- doc/bugs/git-annex_branch_push_race.mdwn +45/−0
- doc/bugs/git-annex_broken_on_Android_4.3.mdwn +3/−0
- doc/bugs/git-annex_directory_hashing_problems_on_osx.mdwn +100/−0
- doc/bugs/git-annex_dropunused_has_no_effect.mdwn +12/−0
- doc/bugs/git-annex_fix_not_noticing_file_renames.mdwn +36/−0
- doc/bugs/git-annex_get:_requested_key_is_not_present.mdwn +41/−0
- doc/bugs/git-annex_has_issues_with_git_when_staging__47__commiting_logs.mdwn +34/−0
- doc/bugs/git-annex_immediately_re-gets_dropped_files.mdwn +27/−0
- doc/bugs/git-annex_incorrectly_parses_bare_IPv6_addresses.mdwn +59/−0
- doc/bugs/git-annex_losing_rsync_remotes_with_encryption_enabled.mdwn +103/−0
- doc/bugs/git-annex_merge_stalls.mdwn +16/−0
- doc/bugs/git-annex_on_crippled_filesystem_can_still_failed_due_to_case_.mdwn +32/−0
- doc/bugs/git-annex_opens_too_many_files.mdwn +40/−0
- doc/bugs/git-annex_quit_unexpectedly___40__macosx__41__.mdwn +358/−0
- doc/bugs/git-annex_sync_broken_on_squeeze_backports.mdwn +20/−0
- doc/bugs/git-annex_thinks_files_are_in_repositories_they_are_not.mdwn +29/−0
- doc/bugs/git-annex_webapp_command_not_found.mdwn +25/−0
- doc/bugs/git_annex_add_..._adds_too_much.mdwn +25/−0
- doc/bugs/git_annex_add_eats_files_when_filename_is_too_long.mdwn +14/−0
- doc/bugs/git_annex_add_error_with_Andrew_File_System.mdwn +28/−0
- doc/bugs/git_annex_add_memory_leak.mdwn +39/−0
- doc/bugs/git_annex_add_removes_file_with_no_data_left.mdwn +103/−0
- doc/bugs/git_annex_assistant_--autostart_failed.mdwn +39/−0
- doc/bugs/git_annex_copy_--fast_does_not_copy_files.mdwn +22/−0
- doc/bugs/git_annex_copy_-f_REMOTE_._doesn__39__t_work_as_expected.mdwn +18/−0
- doc/bugs/git_annex_copy_trying_to_connect_to_remotes_uninvolved.mdwn +27/−0
- doc/bugs/git_annex_does_nothing_useful.mdwn +67/−0
- doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9.mdwn +218/−0
- doc/bugs/git_annex_fork_bombs_on_gpg_file.mdwn +25/−0
- doc/bugs/git_annex_fsck_in_direct_mode_does_not_checksum_files.mdwn +18/−0
- doc/bugs/git_annex_fsck_is_a_no-op_in_bare_repos.mdwn +21/−0
- doc/bugs/git_annex_get_choke_when_remote_is_an_ssh_url_with_a_port.mdwn +13/−0
- doc/bugs/git_annex_gets_confused_about_remotes_with_dots_in_their_names.mdwn +34/−0
- doc/bugs/git_annex_import_destroys_a_fellow_git_annex_repository.mdwn +130/−0
- doc/bugs/git_annex_importfeed_fails.mdwn +64/−0
- doc/bugs/git_annex_indirect_can_fail_catastrophically.mdwn +78/−0
- doc/bugs/git_annex_initremote_needs_some___34__error_checking__34__.mdwn +65/−0
- doc/bugs/git_annex_initremote_walks_.git-annex.mdwn +19/−0
- doc/bugs/git_annex_map_has_problems_with_urls_containing___126__.mdwn +46/−0
- doc/bugs/git_annex_migrate_leaves_old_backend_versions_around.mdwn +19/−0
- doc/bugs/git_annex_should_use___39__git_add_-f__39___internally.mdwn +11/−0
- doc/bugs/git_annex_sync_in_direct_mode_does_not_honor_skip-worktree.mdwn +35/−0
- doc/bugs/git_annex_uninit_loses_content_when_interrupted.mdwn +33/−0
- doc/bugs/git_annex_uninit_removes_files_not_previously_added_to_annex.mdwn +32/−0
- doc/bugs/git_annex_unlock_is_not_atomic.mdwn +7/−0
- doc/bugs/git_annex_unused_aborts_due_to_filename_encoding_problems.mdwn +15/−0
- doc/bugs/git_annex_unused_failes_on_empty_repository.mdwn +15/−0
- doc/bugs/git_annex_unused_seems_to_check_for_current_path.mdwn +39/−0
- doc/bugs/git_annex_upgrade_output_is_inconsistent_and_spammy.mdwn +15/−0
- doc/bugs/git_annex_version_should_without_being_in_a_repo_.mdwn +7/−0
- doc/bugs/git_annex_webapp_--listen_on_a_remote_linux_server.mdwn +50/−0
- doc/bugs/git_annex_webapp_runs_on_wine.mdwn +47/−0
- doc/bugs/git_annex_won__39__t_copy_files_to_my_usb_drive.mdwn +60/−0
- doc/bugs/git_annix_breaks_git_commit_after_uninstall.mdwn +42/−0
- doc/bugs/git_defunct_processes___40__child_of_git-annex_assistant__41__.mdwn +34/−0
- doc/bugs/git_rename_detection_on_file_move.mdwn +13/−0
- doc/bugs/git_version_in_prebuilt_linux_tarball_is_outdated.mdwn +8/−0
- doc/bugs/gix-annex_help_is_homicidal.mdwn +23/−0
- doc/bugs/glacier_from_multiple_repos.mdwn +14/−0
- doc/bugs/googlemail.mdwn +16/−0
- doc/bugs/gpg_bundled_with_OSX_build_fails.mdwn +25/−0
- doc/bugs/gpg_error_on_android.mdwn +39/−0
- doc/bugs/gpg_goes_to_100__37___cpu_on_bad_input_data.mdwn +18/−0
- doc/bugs/gpg_hangs_on_glacier_remote_creation.mdwn +78/−0
- doc/bugs/gpg_needs_--use-agent.mdwn +53/−0
- doc/bugs/hGetContents:_user_error.mdwn +38/−0
- doc/bugs/host_with_rysnc_installed__44___not_recognized.mdwn +19/−0
- doc/bugs/immediately_drops_files.mdwn +222/−0
- doc/bugs/importfeed_fails__44___bad_feed_content.mdwn +36/−0
- doc/bugs/importfeed_uses___34____95__foo__34___as_extension.mdwn +17/−0
- doc/bugs/inconsistent_use_of_SI_prefixes.mdwn +55/−0
- doc/bugs/internal_server_error_creating_repo_on_ssh_server.mdwn +26/−0
- doc/bugs/interrupting_migration_causes_problems.mdwn +52/−0
- doc/bugs/javascript_functions_qouting_issue.mdwn +44/−0
- doc/bugs/journal_commit_error_when_using_annex.mdwn +21/−0
- doc/bugs/long_running_assistant_causes_resource_starvation_on_OSX.mdwn +30/−0
- doc/bugs/lsof__47__committer_thread_loops_occassionally.mdwn +53/−0
- doc/bugs/make_SHA512E_the_default.mdwn +29/−0
- doc/bugs/make_install_can__39__t_be_used_with_sudo.mdwn +20/−0
- doc/bugs/make_install_doesn__39__t_create_git-annex-shell.mdwn +62/−0
- doc/bugs/making_annex-merge_try_a_fast-forward.mdwn +35/−0
- doc/bugs/manpage_has_slight_indentation_error.mdwn +38/−0
- doc/bugs/map_not_respecting_annex_ssh_options__63__.mdwn +38/−0
- doc/bugs/merge_causes_out_of_memory_on_large_repos.mdwn +26/−0
- doc/bugs/migrated_files_not_showing_up_in_unused_list.mdwn +62/−0
- doc/bugs/minor_bug:_errors_are_not_verbose_enough.mdwn +26/−0
- doc/bugs/missing_dependency_in_git-annex-3.20130216.mdwn +29/−0
- doc/bugs/missing_kde__47__gnome_menu_item..mdwn +29/−0
- doc/bugs/moreinfo.mdwn +6/−0
- doc/bugs/nfs_mounted_repo_results_in_errors_on_drop_move.mdwn +59/−0
- doc/bugs/non-annexed_file_changed_to_annexed_on_typechange.mdwn +40/−0
- doc/bugs/not_possible_to_have_annex_on_a_separate_filesystem.mdwn +32/−0
- doc/bugs/old_data_isn__39__t_unused_after_migration.mdwn +66/−0
- doc/bugs/on--git-dir_and_--work-tree_options.mdwn +31/−0
- doc/bugs/ordering.mdwn +12/−0
- doc/bugs/pasting_into_annex_on_OSX.mdwn +28/−0
- doc/bugs/problem_commit_normal_links.mdwn +59/−0
- doc/bugs/problem_with_upgrade_v2_-__62___v3.mdwn +3/−0
- doc/bugs/problems_with_utf8_names.mdwn +81/−0
- doc/bugs/random_files_vanishing_when_assistant_gets_restarted.mdwn +34/−0
- doc/bugs/reinject_should_leave_file_in_place_on_checksum_mismatch.mdwn +15/−0
- doc/bugs/removable_device_configurator_chokes_on_spaces.mdwn +18/−0
- doc/bugs/rename:_permission_denied__44___after_direct_mode_switch.mdwn +81/−0
- doc/bugs/restart_daemon_required.mdwn +22/−0
- doc/bugs/rsync_remote_shows_no_progress.mdwn +15/−0
- doc/bugs/scp_interrupt_to_background.mdwn +2/−0
- doc/bugs/show_version_without_having_to_be_in_a_git_repo.mdwn +11/−0
- doc/bugs/signal_weirdness.mdwn +48/−0
- doc/bugs/smarter_flood_filling.mdwn +31/−0
- doc/bugs/softlink_mtime.mdwn +54/−0
- doc/bugs/ssh-keygen_failed_when_adding_remote_server_repo.mdwn +42/−0
- doc/bugs/ssh_connection_caching_broken_on_NTFS.mdwn +66/−0
- doc/bugs/submodule_path_problem.mdwn +56/−0
- doc/bugs/test_suite_failure_on_samba_mount.mdwn +278/−0
- doc/bugs/test_suite_shouldn__39__t_fail_silently.mdwn +3/−0
- doc/bugs/tests_fail_when_there_is_no_global_.gitconfig_for_the_user.mdwn +50/−0
- doc/bugs/tests_failed_to_build_-_after_an_update_of_haskell_platform.mdwn +23/−0
- doc/bugs/three_character_directories_created.mdwn +56/−0
- doc/bugs/three_way_sync_via_S3_and_Jabber.mdwn +119/−0
- doc/bugs/tmp_file_handling.mdwn +13/−0
- doc/bugs/touch.hsc_has_problems_on_non-linux_based_systems.mdwn +19/−0
- doc/bugs/transferkey_fails_due_to_gpg.mdwn +51/−0
- doc/bugs/typo_in___34__ready_to_add_remote_server__34___message.mdwn +16/−0
- doc/bugs/unable_to_change_repository_group_of___34__here__34__.mdwn +13/−0
- doc/bugs/unannex_and_uninit_do_not_work_when_git_index_is_broken.mdwn +14/−0
- doc/bugs/unannex_command_doesn__39__t_all_files.mdwn +30/−0
- doc/bugs/unannex_removes_object_even_if_referred_to_by_others.mdwn +20/−0
- doc/bugs/unannex_vs_unlock_hook_confusion.mdwn +15/−0
- doc/bugs/undefined.mdwn +5/−0
- doc/bugs/unfinished_repos_in_webapp.mdwn +31/−0
- doc/bugs/unhappy_without_UTF8_locale.mdwn +41/−0
- doc/bugs/uninit_and_indirect_don__39__t_work_on_android.mdwn +23/−0
- doc/bugs/uninit_does_not_abort_when_hard_link_creation_fails.mdwn +47/−0
- doc/bugs/uninit_does_not_work_in_old_repos.mdwn +20/−0
- doc/bugs/uninit_loses_data_if_git-annex_add_didn__39__t_complete.mdwn +15/−0
- doc/bugs/uninit_should_not_run_when_branch_git-annex_is_checked_out.mdwn +15/−0
- doc/bugs/unlock_fails_silently_with_directory_symlinks.mdwn +53/−0
- doc/bugs/unlock_not_working_on_os_x_10.6_-_cp:_illegal_option_--_-_.mdwn +22/−0
- doc/bugs/unlock_then_lock_of_uncommitted_file_loses_it.mdwn +7/−0
- doc/bugs/upgrade_left_untracked_.git-annex__47____42___directories.mdwn +16/−0
- doc/bugs/uploads_queued_to_annex-ignore_remotes.mdwn +34/−0
- doc/bugs/using_old_remote_format_generates_irritating_output.mdwn +28/−0
- doc/bugs/utf8.mdwn +192/−0
- doc/bugs/utf8/comment_10_f298b8b480d3ab2dd9c279589afcd0ea._comment +10/−0
- doc/bugs/utf8/comment_11_a8864a46f8154680beeea27449ac6f09._comment +142/−0
- doc/bugs/utf8/comment_12_2202c3479d19d306f31aac5a47b55e7d._comment +10/−0
- doc/bugs/utf8/comment_13_7044d2c5bb1c91ee37eb9868963a1ff2._comment +41/−0
- doc/bugs/utf8/comment_14_656b3caa16ae93b092fb5804fa575a3b._comment +8/−0
- doc/bugs/utf8/comment_15_25b3d4c47c45b72129b17b171a45c5f9._comment +8/−0
- doc/bugs/utf8/comment_16_2aaab9253bbc75012292c7b5a7d55696._comment +173/−0
- doc/bugs/utf8/comment_1_416ad6fb5f7379732129dc5283a7e550._comment +23/−0
- doc/bugs/utf8/comment_2_cd55f6bbeb145fd554f331dcff64f5e1._comment +10/−0
- doc/bugs/utf8/comment_3_bb583a419d6fa4e33e5364c4468b35c6._comment +8/−0
- doc/bugs/utf8/comment_4_cd8a22cfb70d9d21f0a5339ccc52ee93._comment +14/−0
- doc/bugs/utf8/comment_5_14eefd4bee283802e9c462fa20b7835c._comment +19/−0
- doc/bugs/utf8/comment_6_58d8b5bdb9f11e8c344e86a675a075dd._comment +11/−0
- doc/bugs/utf8/comment_7_00fa9672ce55b6bfa885b8a13287ac25._comment +10/−0
- doc/bugs/utf8/comment_8_a01e26fa0fafbc291020f53dbfdf6443._comment +10/−0
- doc/bugs/utf8/comment_9_b7c084be01ce985be51e48503fcba468._comment +8/−0
- doc/bugs/uuid.log_trust.log_and_remote.log_merge_wackiness.mdwn +36/−0
- doc/bugs/view_logs_fails:_Internal_Server_Error__internal_liftAnnex.mdwn +20/−0
- doc/bugs/watch_command_on_OSX_--_hangs_with_a_small_repo.mdwn +41/−0
- doc/bugs/watch_command_on_OSX_10.7.mdwn +37/−0
- doc/bugs/watcher_commits_unlocked_files.mdwn +37/−0
- doc/bugs/webapp:_difficult_to_abort_adding_a_repository.mdwn +24/−0
- doc/bugs/webapp_hang.mdwn +144/−0
- doc/bugs/webapp_hang/comment_1_08aa908a64d0fe2d50438d01545c3f01._comment +8/−0
- doc/bugs/webapp_hang/comment_2_2a21ac5657128a454f9deb77c4d18057._comment +21/−0
- doc/bugs/webapp_requires_reload_for_notification_bubbles.mdwn +41/−0
- doc/bugs/webapp_shows___34__Added_x_files__34___a_bit_ugly.mdwn +15/−0
- doc/bugs/webapp_usability:_put_the_notices_on_the_right.mdwn +18/−0
- doc/bugs/weird_local_clone_confuses.mdwn +20/−0
- doc/bugs/whereis_outputs_no_informaiton_for_unlocked_files.mdwn +44/−0
- doc/bugs/windows_fails_test___34__recoverEncode__34__.mdwn +39/−0
- doc/bugs/windows_install_failure.mdwn +30/−0
- doc/bugs/windows_port_-_can__39__t_directly_access_files.mdwn +250/−0
- doc/bugs/windows_port_-_repo_can__39__t_pull_newly_added_files_.mdwn +559/−0
- doc/bugs/xdg-user-dir_error.mdwn +8/−0
- doc/bugs/xmpp_needs_one_account_per_distinct_repository.mdwn +107/−0
- doc/bugs/yesod-default_is_needed_as_a_dependancy.mdwn +10/−0
- doc/bugs/yesod-form_missing.mdwn +23/−0
- doc/bugs/youtube_support_suddenly_stopped_working.mdwn +62/−0
- doc/builds.mdwn +20/−0
- doc/coding_style.mdwn +92/−0
- doc/comments.mdwn +9/−0
- doc/contact.mdwn +11/−0
- doc/contact/comment_1_12d60f767d90bea94974e1ff6b206d31._comment +8/−0
- doc/contact/comment_2_95b6d868b913418de50ba121d71d2390._comment +10/−0
- doc/contact/comment_3_2cf43bd406673294e6cdbd785c4a0d0c._comment +16/−0
- doc/contact/comment_4_586a506e27379d74fbc0f4b654e89c7d._comment +10/−0
- doc/copies.mdwn +38/−0
- doc/copies/comment_1_af9bee33777fb8a187b714fc8c5fb11d._comment +8/−0
- doc/design.mdwn +8/−0
- doc/design/assistant.mdwn +45/−0
- doc/design/assistant/OSX.mdwn +13/−0
- doc/design/assistant/OSX/comment_1_9290f6e6f265e906b08631224392b7bf._comment +14/−0
- doc/design/assistant/android.mdwn +42/−0
- doc/design/assistant/blog.mdwn +11/−0
- doc/design/assistant/blog/day_100__cursed_clouds.mdwn +19/−0
- doc/design/assistant/blog/day_102__very_high_level_programming.mdwn +37/−0
- doc/design/assistant/blog/day_103__bugfix_day.mdwn +25/−0
- doc/design/assistant/blog/day_104__misc.mdwn +18/−0
- doc/design/assistant/blog/day_105__lazy_Sunday.mdwn +43/−0
- doc/design/assistant/blog/day_106__lazy_Monday.mdwn +10/−0
- doc/design/assistant/blog/day_107__memory_leak.mdwn +11/−0
- doc/design/assistant/blog/day_108__another_zombie_outbreak.mdwn +33/−0
- doc/design/assistant/blog/day_109__dropping.mdwn +16/−0
- doc/design/assistant/blog/day_10__lsof.mdwn +54/−0
- doc/design/assistant/blog/day_110__more_dropping.mdwn +55/−0
- doc/design/assistant/blog/day_111__config_monitor.mdwn +18/−0
- doc/design/assistant/blog/day_113__notifier_work.mdwn +22/−0
- doc/design/assistant/blog/day_114__xmpp.mdwn +56/−0
- doc/design/assistant/blog/day_115__my_new_form.mdwn +17/−0
- doc/design/assistant/blog/day_116__the_segfault.mdwn +25/−0
- doc/design/assistant/blog/day_117__new_topologies.mdwn +41/−0
- doc/design/assistant/blog/day_118__monadic_discontinuity.mdwn +15/−0
- doc/design/assistant/blog/day_119__time_for_testing.mdwn +12/−0
- doc/design/assistant/blog/day_11__freebsd.mdwn +50/−0
- doc/design/assistant/blog/day_120__test_day.mdwn +2/−0
- doc/design/assistant/blog/day_121__buddy_list.mdwn +10/−0
- doc/design/assistant/blog/day_122__xmpp_pairing.mdwn +29/−0
- doc/design/assistant/blog/day_123__xmpp_insanity.mdwn +49/−0
- doc/design/assistant/blog/day_124__git_push_over_xmpp_groundwork.mdwn +28/−0
- doc/design/assistant/blog/day_125__xmpp_push_continues.mdwn +15/−0
- doc/design/assistant/blog/day_126__mr_watson_come_here.mdwn +52/−0
- doc/design/assistant/blog/day_127__xmpp_syncs.mdwn +35/−0
- doc/design/assistant/blog/day_128__last_xmpp_day.mdwn +49/−0
- doc/design/assistant/blog/day_129__release.mdwn +4/−0
- doc/design/assistant/blog/day_12__freebsd_redux.mdwn +23/−0
- doc/design/assistant/blog/day_130__what_now.mdwn +36/−0
- doc/design/assistant/blog/day_131__webdav_groundwork.mdwn +28/−0
- doc/design/assistant/blog/day_132__webdav_continued.mdwn +22/−0
- doc/design/assistant/blog/day_133__webdav_working.mdwn +31/−0
- doc/design/assistant/blog/day_134__box.com_configurator.mdwn +8/−0
- doc/design/assistant/blog/day_135__progress_revisited.mdwn +37/−0
- doc/design/assistant/blog/day_136__misc.mdwn +14/−0
- doc/design/assistant/blog/day_137__Glacier.mdwn +30/−0
- doc/design/assistant/blog/day_138__back.mdwn +25/−0
- doc/design/assistant/blog/day_139__catch_up.mdwn +11/−0
- doc/design/assistant/blog/day_13__kqueue_continued.mdwn +34/−0
- doc/design/assistant/blog/day_140__release_monday.mdwn +25/−0
- doc/design/assistant/blog/day_141__release_tuesday.mdwn +6/−0
- doc/design/assistant/blog/day_142__filling_in.mdwn +9/−0
- doc/design/assistant/blog/day_143__what_next.mdwn +22/−0
- doc/design/assistant/blog/day_144__webapp_work.mdwn +8/−0
- doc/design/assistant/blog/day_145__more_webapp_work.mdwn +12/−0
- doc/design/assistant/blog/day_146__meanwhile.mdwn +22/−0
- doc/design/assistant/blog/day_147__direct_mode.mdwn +36/−0
- doc/design/assistant/blog/day_148__direct_mode.mdwn +42/−0
- doc/design/assistant/blog/day_149__rainy_day.mdwn +15/−0
- doc/design/assistant/blog/day_14__kqueue_kqueue_kqueue.mdwn +23/−0
- doc/design/assistant/blog/day_14__thinking_about_syncing.mdwn +44/−0
- doc/design/assistant/blog/day_150__12:12.mdwn +53/−0
- doc/design/assistant/blog/day_151__direct_mode_toggle.mdwn +59/−0
- doc/design/assistant/blog/day_152__bugfixes.mdwn +18/−0
- doc/design/assistant/blog/day_153__hibernation.mdwn +26/−0
- doc/design/assistant/blog/day_154__direct_mode_merging.mdwn +21/−0
- doc/design/assistant/blog/day_155__bugfixes.mdwn +15/−0
- doc/design/assistant/blog/day_156_and_157__direct_mode_assistant.mdwn +45/−0
- doc/design/assistant/blog/day_158__fsevents.mdwn +20/−0
- doc/design/assistant/blog/day_159__fsevents_and_assistant.mdwn +16/−0
- doc/design/assistant/blog/day_15__its_aliiive.mdwn +33/−0
- doc/design/assistant/blog/day_160__finishing_up_direct_mode.mdwn +10/−0
- doc/design/assistant/blog/day_161__release_day.mdwn +8/−0
- doc/design/assistant/blog/day_162__UI.mdwn +17/−0
- doc/design/assistant/blog/day_163__free_features.mdwn +32/−0
- doc/design/assistant/blog/day_164__bugfixes.mdwn +17/−0
- doc/design/assistant/blog/day_165__release_day.mdwn +16/−0
- doc/design/assistant/blog/day_166__a_short_long_day.mdwn +25/−0
- doc/design/assistant/blog/day_167__safe_direct_mode_transfers.mdwn +12/−0
- doc/design/assistant/blog/day_168__back_to_theme.mdwn +18/−0
- doc/design/assistant/blog/day_169__direct_mode_is_safe.mdwn +24/−0
- doc/design/assistant/blog/day_16__more_robust_syncing.mdwn +44/−0
- doc/design/assistant/blog/day_170__bugfixes_and_release.mdwn +8/−0
- doc/design/assistant/blog/day_171__logs.mdwn +23/−0
- doc/design/assistant/blog/day_172__short_day.mdwn +22/−0
- doc/design/assistant/blog/day_173__snow_day.mdwn +22/−0
- doc/design/assistant/blog/day_174__last_weekend_before_AU.mdwn +25/−0
- doc/design/assistant/blog/day_175__pacific_features.mdwn +15/−0
- doc/design/assistant/blog/day_176__thread_management.mdwn +13/−0
- doc/design/assistant/blog/day_178__bus_hacking.mdwn +10/−0
- doc/design/assistant/blog/day_179__brief_updates.mdwn +19/−0
- doc/design/assistant/blog/day_17__push_queue_prune.mdwn +19/−0
- doc/design/assistant/blog/day_180__back.mdwn +7/−0
- doc/design/assistant/blog/day_181__triage.mdwn +23/−0
- doc/design/assistant/blog/day_182__it_begins.mdwn +50/−0
- doc/design/assistant/blog/day_183__plan_b.mdwn +19/−0
- doc/design/assistant/blog/day_184__just_wanna_run_something.mdwn +46/−0
- doc/design/assistant/blog/day_185__android_liftoff.mdwn +20/−0
- doc/design/assistant/blog/day_186__Android_success.mdwn +33/−0
- doc/design/assistant/blog/day_187__porting_utilities.mdwn +22/−0
- doc/design/assistant/blog/day_188__crippled_filesystem_support.mdwn +37/−0
- doc/design/assistant/blog/day_189__more_crippling.mdwn +44/−0
- doc/design/assistant/blog/day_18__merging.mdwn +82/−0
- doc/design/assistant/blog/day_190-191__weekend.mdwn +28/−0
- doc/design/assistant/blog/day_192_193__more_porting.mdwn +44/−0
- doc/design/assistant/blog/day_194__nice_moment.mdwn +37/−0
- doc/design/assistant/blog/day_195__real_android_app.mdwn +32/−0
- doc/design/assistant/blog/day_196__android_bugfixes.mdwn +26/−0
- doc/design/assistant/blog/day_197__template_haskell.mdwn +36/−0
- doc/design/assistant/blog/day_198__bugfixes.mdwn +11/−0
- doc/design/assistant/blog/day_199__wrapping_up_Android_for_now.mdwn +26/−0
- doc/design/assistant/blog/day_19__random_improvements.mdwn +50/−0
- doc/design/assistant/blog/day_1__inotify.mdwn +57/−0
- doc/design/assistant/blog/day_200__release_day.mdwn +19/−0
- doc/design/assistant/blog/day_201__real_Android_wrapup.mdwn +38/−0
- doc/design/assistant/blog/day_201__real_Android_wrapup/fib.png binary
- doc/design/assistant/blog/day_201__working_web_server.mdwn +31/−0
- doc/design/assistant/blog/day_203__procrastination.mdwn +25/−0
- doc/design/assistant/blog/day_204__deprocrastination.mdwn +62/−0
- doc/design/assistant/blog/day_205_206__rainy_day__snow_day.mdwn +12/−0
- doc/design/assistant/blog/day_207__XMPP.mdwn +7/−0
- doc/design/assistant/blog/day_208__bugfixes.mdwn +17/−0
- doc/design/assistant/blog/day_209__The_Bug.mdwn +23/−0
- doc/design/assistant/blog/day_20__data_transfer_design.mdwn +22/−0
- doc/design/assistant/blog/day_210__spring.mdwn +29/−0
- doc/design/assistant/blog/day_211__zooming_along.mdwn +24/−0
- doc/design/assistant/blog/day_212__accidental_all_nighter.mdwn +24/−0
- doc/design/assistant/blog/day_213__costs.mdwn +34/−0
- doc/design/assistant/blog/day_214__release_day.mdwn +5/−0
- doc/design/assistant/blog/day_215__dashboard_UI_refresh.mdwn +25/−0
- doc/design/assistant/blog/day_216__more_bugfixes.mdwn +42/−0
- doc/design/assistant/blog/day_217__nothing.mdwn +2/−0
- doc/design/assistant/blog/day_219__bug_triage.mdwn +14/−0
- doc/design/assistant/blog/day_21__transfer_tracking.mdwn +28/−0
- doc/design/assistant/blog/day_220__performance.mdwn +40/−0
- doc/design/assistant/blog/day_221__this_and_that.mdwn +28/−0
- doc/design/assistant/blog/day_222__back.mdwn +16/−0
- doc/design/assistant/blog/day_223__progress_revisited.mdwn +24/−0
- doc/design/assistant/blog/day_224__annex.largefiles.mdwn +23/−0
- doc/design/assistant/blog/day_225__back_from_the_dead.mdwn +47/−0
- doc/design/assistant/blog/day_226__poll_results.mdwn +28/−0
- doc/design/assistant/blog/day_227__bigfixing_all_day_today.mdwn +21/−0
- doc/design/assistant/blog/day_228__more_work_on_repository_removals.mdwn +27/−0
- doc/design/assistant/blog/day_229__rainy_day_bugfixes.mdwn +17/−0
- doc/design/assistant/blog/day_22__horrible_option_parsing_hack.mdwn +34/−0
- doc/design/assistant/blog/day_230__Mom.mdwn +35/−0
- doc/design/assistant/blog/day_231__insert_title.mdwn +26/−0
- doc/design/assistant/blog/day_232__headless_webapp.mdwn +22/−0
- doc/design/assistant/blog/day_233__taxes.mdwn +11/−0
- doc/design/assistant/blog/day_234__clean_shutdown.mdwn +29/−0
- doc/design/assistant/blog/day_235__birthday.mdwn +31/−0
- doc/design/assistant/blog/day_236__evil_splicer.mdwn +29/−0
- doc/design/assistant/blog/day_237__gnome-keyring_craziness.mdwn +29/−0
- doc/design/assistant/blog/day_238__back_to_Android.mdwn +11/−0
- doc/design/assistant/blog/day_239__bugfixes_and_frustration.mdwn +28/−0
- doc/design/assistant/blog/day_23__transfer_watching.mdwn +25/−0
- doc/design/assistant/blog/day_240__it_builds.mdwn +37/−0
- doc/design/assistant/blog/day_241__cleanup.mdwn +14/−0
- doc/design/assistant/blog/day_242__more_porting.mdwn +4/−0
- doc/design/assistant/blog/day_243__in_the_field.mdwn +21/−0
- doc/design/assistant/blog/day_244__android_porting.mdwn +6/−0
- doc/design/assistant/blog/day_245__misc.mdwn +15/−0
- doc/design/assistant/blog/day_246__bug_treadmill.mdwn +18/−0
- doc/design/assistant/blog/day_247__performance_tuning.mdwn +16/−0
- doc/design/assistant/blog/day_248__Internet_Archive.mdwn +28/−0
- doc/design/assistant/blog/day_249__quiet_day.mdwn +7/−0
- doc/design/assistant/blog/day_24__airport_digressions.mdwn +99/−0
- doc/design/assistant/blog/day_250__stymied.mdwn +23/−0
- doc/design/assistant/blog/day_251__xmpp_improvements.mdwn +34/−0
- doc/design/assistant/blog/day_252__release_day.mdwn +6/−0
- doc/design/assistant/blog/day_253__OMG.mdwn +22/−0
- doc/design/assistant/blog/day_254__Android_app_polishing.mdwn +35/−0
- doc/design/assistant/blog/day_255__Debian_release_day.mdwn +26/−0
- doc/design/assistant/blog/day_256__8bit.mdwn +27/−0
- doc/design/assistant/blog/day_257__rainy_day.mdwn +6/−0
- doc/design/assistant/blog/day_258__beginning_of_the_end.mdwn +24/−0
- doc/design/assistant/blog/day_259__Android_dominos_toppling.mdwn +15/−0
- doc/design/assistant/blog/day_25__transfer_queueing.mdwn +41/−0
- doc/design/assistant/blog/day_260__Windows_dev_environment.mdwn +46/−0
- doc/design/assistant/blog/day_261__Windows_first_stage_complete.mdwn +29/−0
- doc/design/assistant/blog/day_262__DOS_path_separators.mdwn +14/−0
- doc/design/assistant/blog/day_263_catching_up.mdwn +11/−0
- doc/design/assistant/blog/day_264__Windows_second_stage_complete.mdwn +21/−0
- doc/design/assistant/blog/day_265__correctness.mdwn +23/−0
- doc/design/assistant/blog/day_266__release_day.mdwn +6/−0
- doc/design/assistant/blog/day_267__windows_autobuilder.mdwn +9/−0
- doc/design/assistant/blog/day_268__core_monad_change.mdwn +9/−0
- doc/design/assistant/blog/day_269__bugfixes.mdwn +14/−0
- doc/design/assistant/blog/day_26__dying_drives.mdwn +28/−0
- doc/design/assistant/blog/day_270__release_and_xmpp.mdwn +39/−0
- doc/design/assistant/blog/day_271__more_xmpp.mdwn +31/−0
- doc/design/assistant/blog/day_272__fuzz_tester.mdwn +37/−0
- doc/design/assistant/blog/day_273-274__fun.mdwn +19/−0
- doc/design/assistant/blog/day_275__working_hard_or.mdwn +12/−0
- doc/design/assistant/blog/day_276__fuzzing_continues.mdwn +12/−0
- doc/design/assistant/blog/day_277__private_static_protected_void.mdwn +19/−0
- doc/design/assistant/blog/day_278__winding_down.mdwn +11/−0
- doc/design/assistant/blog/day_279__final_release_prep.mdwn +14/−0
- doc/design/assistant/blog/day_27__robust_transfers.mdwn +31/−0
- doc/design/assistant/blog/day_28-35__threaded_runtime_tarpit.mdwn +17/−0
- doc/design/assistant/blog/day_280__yesod.mdwn +7/−0
- doc/design/assistant/blog/day_281__back.mdwn +37/−0
- doc/design/assistant/blog/day_282-283__caught_up.mdwn +18/−0
- doc/design/assistant/blog/day_284__porting.mdwn +13/−0
- doc/design/assistant/blog/day_285__fixed_the_archive_directory_loop.mdwn +23/−0
- doc/design/assistant/blog/day_286__Windows_test_suite.mdwn +19/−0
- doc/design/assistant/blog/day_287__niceness.mdwn +13/−0
- doc/design/assistant/blog/day_288__success_stories.mdwn +32/−0
- doc/design/assistant/blog/day_289__back_in_the_swing.mdwn +16/−0
- doc/design/assistant/blog/day_290__https_release.mdwn +17/−0
- doc/design/assistant/blog/day_291__--all.mdwn +32/−0
- doc/design/assistant/blog/day_292__bugfixes.mdwn +24/−0
- doc/design/assistant/blog/day_293__gpg_builds.mdwn +32/−0
- doc/design/assistant/blog/day_294__release_day.mdwn +7/−0
- doc/design/assistant/blog/day_295__balls_in_the_air.mdwn +13/−0
- doc/design/assistant/blog/day_296__new_crowdfunding_campaign.mdwn +41/−0
- doc/design/assistant/blog/day_297__back_to_work.mdwn +16/−0
- doc/design/assistant/blog/day_298__exceptional.mdwn +21/−0
- doc/design/assistant/blog/day_299__bugfixing.mdwn +8/−0
- doc/design/assistant/blog/day_2__races.mdwn +45/−0
- doc/design/assistant/blog/day_300__new_logo.mdwn +36/−0
- doc/design/assistant/blog/day_301__direct_unannex.mdwn +21/−0
- doc/design/assistant/blog/day_302_release_day.mdwn +6/−0
- doc/design/assistant/blog/day_303__oops.mdwn +8/−0
- doc/design/assistant/blog/day_304__dropunused_safety.mdwn +28/−0
- doc/design/assistant/blog/day_305__interesting_bugs.mdwn +21/−0
- doc/design/assistant/blog/day_306__offtopic.mdwn +2/−0
- doc/design/assistant/blog/day_307__buuuugs.mdwn +31/−0
- doc/design/assistant/blog/day_308__ssh-agent.mdwn +16/−0
- doc/design/assistant/blog/day_309__filenames.mdwn +17/−0
- doc/design/assistant/blog/day_310__release_day.mdwn +18/−0
- doc/design/assistant/blog/day_311__Windows_porting.mdwn +10/−0
- doc/design/assistant/blog/day_312__DebConf_midpoint.mdwn +30/−0
- doc/design/assistant/blog/day_313__back.mdwn +34/−0
- doc/design/assistant/blog/day_314__quvi.mdwn +27/−0
- doc/design/assistant/blog/day_315__backlog.mdwn +12/−0
- doc/design/assistant/blog/day_316__day_off.mdwn +6/−0
- doc/design/assistant/blog/day_317__misc.mdwn +17/−0
- doc/design/assistant/blog/day_36__minimal_test_case.mdwn +9/−0
- doc/design/assistant/blog/day_37__back.mdwn +64/−0
- doc/design/assistant/blog/day_39__twice_is_enemy_action.mdwn +66/−0
- doc/design/assistant/blog/day_3__more_races.mdwn +26/−0
- doc/design/assistant/blog/day_40__dbus.mdwn +100/−0
- doc/design/assistant/blog/day_41__foo.mdwn +46/−0
- doc/design/assistant/blog/day_42__the_answer.mdwn +27/−0
- doc/design/assistant/blog/day_43__simple_scanner.mdwn +37/−0
- doc/design/assistant/blog/day_44__webapp_basics.mdwn +83/−0
- doc/design/assistant/blog/day_45__long_polling.mdwn +66/−0
- doc/design/assistant/blog/day_45__long_polling/full.png binary
- doc/design/assistant/blog/day_45__long_polling/phone.png binary
- doc/design/assistant/blog/day_46__notification_pools.mdwn +68/−0
- doc/design/assistant/blog/day_47__alert_messages.mdwn +14/−0
- doc/design/assistant/blog/day_48__intro.mdwn +8/−0
- doc/design/assistant/blog/day_49__first_run_experience.mdwn +39/−0
- doc/design/assistant/blog/day_4__speed.mdwn +47/−0
- doc/design/assistant/blog/day_50__directory_name.mdwn +20/−0
- doc/design/assistant/blog/day_51__desktop.mdwn +34/−0
- doc/design/assistant/blog/day_52__file_browser.mdwn +21/−0
- doc/design/assistant/blog/day_54__adding_removable_drives.mdwn +99/−0
- doc/design/assistant/blog/day_55__alerts.mdwn +10/−0
- doc/design/assistant/blog/day_56__transfer_control.mdwn +8/−0
- doc/design/assistant/blog/day_57__afk.mdwn +40/−0
- doc/design/assistant/blog/day_58__more_transfer_control.mdwn +26/−0
- doc/design/assistant/blog/day_59__dinner.mdwn +10/−0
- doc/design/assistant/blog/day_5__committing.mdwn +57/−0
- doc/design/assistant/blog/day_60__taking_stock.mdwn +40/−0
- doc/design/assistant/blog/day_61__network_connection_detection.mdwn +36/−0
- doc/design/assistant/blog/day_62__smarter_syncing.mdwn +21/−0
- doc/design/assistant/blog/day_63__transfer_retries.mdwn +26/−0
- doc/design/assistant/blog/day_64__syncing_robustly.mdwn +33/−0
- doc/design/assistant/blog/day_65__transfer_polish.mdwn +33/−0
- doc/design/assistant/blog/day_66__the_merge.mdwn +19/−0
- doc/design/assistant/blog/day_67__progress_bars.mdwn +10/−0
- doc/design/assistant/blog/day_68__transfers.mdwn +15/−0
- doc/design/assistant/blog/day_69__build_fixes.mdwn +7/−0
- doc/design/assistant/blog/day_6__polish.mdwn +50/−0
- doc/design/assistant/blog/day_70__adding_ssh_remotes.mdwn +66/−0
- doc/design/assistant/blog/day_71__ssh_probing.mdwn +26/−0
- doc/design/assistant/blog/day_73__rsync.net_configurator.mdwn +17/−0
- doc/design/assistant/blog/day_74__bits_and_peices.mdwn +7/−0
- doc/design/assistant/blog/day_75__zeromq_and_pairing.mdwn +50/−0
- doc/design/assistant/blog/day_76__pairing.mdwn +16/−0
- doc/design/assistant/blog/day_77_alert_buttons.mdwn +21/−0
- doc/design/assistant/blog/day_78__pairing_continued.mdwn +8/−0
- doc/design/assistant/blog/day_79__pairing_finished.mdwn +33/−0
- doc/design/assistant/blog/day_7__bugfixes.mdwn +45/−0
- doc/design/assistant/blog/day_7__bugfixes/profile.png binary
- doc/design/assistant/blog/day_7__bugfixes/profile2.png binary
- doc/design/assistant/blog/day_80__default_backend.mdwn +14/−0
- doc/design/assistant/blog/day_81__enabling_pre-existing_special_remotes.mdwn +34/−0
- doc/design/assistant/blog/day_82__git-annex_branch_work.mdwn +26/−0
- doc/design/assistant/blog/day_83__3-way.mdwn +73/−0
- doc/design/assistant/blog/day_84__deferred_downloads.mdwn +33/−0
- doc/design/assistant/blog/day_85__more_foundation_work.mdwn +17/−0
- doc/design/assistant/blog/day_86__towards_the_beta.mdwn +33/−0
- doc/design/assistant/blog/day_87__more_progress_progress.mdwn +28/−0
- doc/design/assistant/blog/day_88__progressbars_still_progressing.mdwn +18/−0
- doc/design/assistant/blog/day_89__final_polish.mdwn +24/−0
- doc/design/assistant/blog/day_8__speed.mdwn +67/−0
- doc/design/assistant/blog/day_90__beta.mdwn +16/−0
- doc/design/assistant/blog/day_91__break.mdwn +7/−0
- doc/design/assistant/blog/day_92__S3.mdwn +23/−0
- doc/design/assistant/blog/day_93__OSX_standalone_app.mdwn +23/−0
- doc/design/assistant/blog/day_93__easy_install.mdwn +34/−0
- doc/design/assistant/blog/day_95__repository_groups.mdwn +21/−0
- doc/design/assistant/blog/day_96__revisiting_file_adds.mdwn +24/−0
- doc/design/assistant/blog/day_97__stuffing.mdwn +14/−0
- doc/design/assistant/blog/day_98__preferred_content.mdwn +44/−0
- doc/design/assistant/blog/day_99_shotgun.mdwn +70/−0
- doc/design/assistant/blog/day_9__correctness.mdwn +30/−0
- doc/design/assistant/chunks.mdwn +7/−0
- doc/design/assistant/cloud.mdwn +45/−0
- doc/design/assistant/comment_10_f2233fad55c20686cf299bf6788f1f23._comment +10/−0
- doc/design/assistant/comment_11_a38f0f21c2346e65b786d791b6829f9b._comment +12/−0
- doc/design/assistant/comment_12_5e991177d6577384f39a36ae02f5f574._comment +13/−0
- doc/design/assistant/comment_13_f8625c6f43b58847840df338a73b7972._comment +7/−0
- doc/design/assistant/comment_14_c37ef5931b0f5c1f808083e0d636a208._comment +11/−0
- doc/design/assistant/comment_15_68c98a27083567f20c2e6bc2a760991b._comment +9/−0
- doc/design/assistant/comment_16_8e6788c817c60371d2a2f158e1a65f87._comment +8/−0
- doc/design/assistant/comment_17_97bdfacac5ac492281c9454ee4c0228e._comment +8/−0
- doc/design/assistant/comment_18_53137b2df4913496c0afb2d895aa4ee2._comment +8/−0
- doc/design/assistant/comment_19_ff1b0ba57e22ed757ec3fc5400b5e43e._comment +8/−0
- doc/design/assistant/comment_1_a48fcfbf97f0a373ea375cd8f07f0fc8._comment +8/−0
- doc/design/assistant/comment_20_099da245e3276fa84f5e14312d186621._comment +8/−0
- doc/design/assistant/comment_2_6d3552414fdcc2ed3244567e6c67989d._comment +7/−0
- doc/design/assistant/comment_3_05223be50c889b2ed6bc4abf74116450._comment +9/−0
- doc/design/assistant/comment_4_fbbd93b55803ae21e6ba4b6568c2fafd._comment +9/−0
- doc/design/assistant/comment_5_f4e9af3fed6c27e8ff39badb9794064d._comment +12/−0
- doc/design/assistant/comment_6_c7ad07cade1f44f9a8b61f92225bb9c5._comment +10/−0
- doc/design/assistant/comment_7_609d38e993267195a80fecd84c93d1e2._comment +8/−0
- doc/design/assistant/comment_8_22b818e1a2a825efb78139271a14f944._comment +10/−0
- doc/design/assistant/comment_9_d052e2142da8b4838fb1edf791ea23ae._comment +10/−0
- doc/design/assistant/configurators.mdwn +20/−0
- doc/design/assistant/deltas.mdwn +9/−0
- doc/design/assistant/desymlink.mdwn +145/−0
- doc/design/assistant/disaster_recovery.mdwn +176/−0
- doc/design/assistant/encrypted_git_remotes.mdwn +22/−0
- doc/design/assistant/gpgkeys.mdwn +37/−0
- doc/design/assistant/inotify.mdwn +196/−0
- doc/design/assistant/leftovers.mdwn +17/−0
- doc/design/assistant/more_cloud_providers.mdwn +24/−0
- doc/design/assistant/pairing.mdwn +83/−0
- doc/design/assistant/partial_content.mdwn +36/−0
- doc/design/assistant/polls.mdwn +1/−0
- doc/design/assistant/polls/Android.mdwn +18/−0
- doc/design/assistant/polls/Android_default_directory.mdwn +7/−0
- doc/design/assistant/polls/goals_for_April.mdwn +17/−0
- doc/design/assistant/polls/prioritizing_special_remotes.mdwn +16/−0
- doc/design/assistant/progressbars.mdwn +43/−0
- doc/design/assistant/rate_limiting.mdwn +57/−0
- doc/design/assistant/screenshot/firstrun.png binary
- doc/design/assistant/screenshot/intro.png binary
- doc/design/assistant/sshpassword.mdwn +12/−0
- doc/design/assistant/syncing.mdwn +260/−0
- doc/design/assistant/todo.mdwn +4/−0
- doc/design/assistant/transfer_control.mdwn +123/−0
- doc/design/assistant/webapp.mdwn +65/−0
- doc/design/assistant/windows.mdwn +33/−0
- doc/design/assistant/xmpp.mdwn +136/−0
- doc/design/assistant/xmpp_security.mdwn +26/−0
- doc/design/encryption.mdwn +126/−0
- doc/design/encryption/comment_1_4715ffafb3c4a9915bc33f2b26aaa9c1._comment +12/−0
- doc/design/encryption/comment_2_a610b3d056a059899178859a3a821ea5._comment +10/−0
- doc/design/encryption/comment_3_cca186a9536cd3f6e86994631b14231c._comment +12/−0
- doc/design/encryption/comment_4_8f3ba3e504b058791fc6e6f9c38154cf._comment +10/−0
- doc/design/encryption/comment_5_520e60aa53217b5ba428d4c05d897dee._comment +16/−0
- doc/design/encryption/comment_6_d677fead0fe0c543f48f07d85f83f592._comment +14/−0
- doc/design/encryption/comment_7_c1c38a09b1276e29adc3ba564dc0fe4e._comment +14/−0
- doc/design/gcrypt.mdwn +8/−0
- doc/design/roadmap.mdwn +18/−0
- doc/devblog.mdwn +10/−0
- doc/devblog/day_-1__drop_dead.mdwn +5/−0
- doc/devblog/day_-3__.mdwn +29/−0
- doc/devblog/day_-4__forgetting.mdwn +80/−0
- doc/devblog/day_10__lazy_Sunday.mdwn +23/−0
- doc/devblog/day_11__webapp_encrypted_drives.mdwn +12/−0
- doc/devblog/day_12__gpg_key_generation.mdwn +35/−0
- doc/devblog/day_13__encrypted_sneakernet_working.mdwn +13/−0
- doc/devblog/day_14__gcrypt_refinements_and_OOM_fixes.mdwn +26/−0
- doc/devblog/day_15-17__Android_rebuild.mdwn +67/−0
- doc/devblog/day_19__moving_on.mdwn +37/−0
- doc/devblog/day_1__inauspicious_beginning.mdwn +11/−0
- doc/devblog/day_20__gcrypt_and_git-annex-shell.mdwn +14/−0
- doc/devblog/day_21__bugfix_day.mdwn +5/−0
- doc/devblog/day_22__gcrypt_on_rsync.net.mdwn +20/−0
- doc/devblog/day_23__GNU_day.mdwn +23/−0
- doc/devblog/day_24__nearly_done_with_gcrypt.mdwn +23/−0
- doc/devblog/day_25__finishing_up_gcrypt.mdwn +25/−0
- doc/devblog/day_26__gcrypt_really_done_this_time.mdwn +17/−0
- doc/devblog/day_27__locking_fun.mdwn +49/−0
- doc/devblog/day_28__lazy_saturday.mdwn +17/−0
- doc/devblog/day_29__scheduling.mdwn +10/−0
- doc/devblog/day_2__new_laptop.mdwn +8/−0
- doc/devblog/day_30__cronner.mdwn +17/−0
- doc/devblog/day_31__blah.mdwn +17/−0
- doc/devblog/day_32__fsck_config_UI.mdwn +20/−0
- doc/devblog/day_33__fsck_on_connect.mdwn +9/−0
- doc/devblog/day_34__wrapping_up_fsck.mdwn +7/−0
- doc/devblog/day_35__anacron_and_bugfixing.mdwn +15/−0
- doc/devblog/day_36__bugfixing.mdwn +1/−0
- doc/devblog/day_37__long_day.mdwn +6/−0
- doc/devblog/day_38__starting_git_repo_repair.mdwn +11/−0
- doc/devblog/day_39__git-recover-repository.mdwn +54/−0
- doc/devblog/day_3__gcrypt_uuids.mdwn +63/−0
- doc/devblog/day_40__another_fine_mess.mdwn +15/−0
- doc/devblog/day_41__onward.mdwn +17/−0
- doc/devblog/day_42__repair_milestone.mdwn +35/−0
- doc/devblog/day_4__unexpected_windows_day.mdwn +10/−0
- doc/devblog/day_5__gcrypt_special_remote_part_1.mdwn +7/−0
- doc/devblog/day_6__gcrypt_fully_working.mdwn +8/−0
- doc/devblog/day_7__release_day.mdwn +10/−0
- doc/devblog/day_8__ill.mdwn +20/−0
- doc/devblog/day_9__Friday_the_13th.mdwn +21/−0
- doc/devblog/moving_blogs.mdwn +5/−0
- doc/devblog/moving_blogs/comment_1_6caa7e67461a6ea5de8155ae9cf75fab._comment +8/−0
- doc/devblog/moving_blogs/comment_2_e3e2048fc2397b87a2f29c9fe49394cb._comment +10/−0
- doc/direct_mode.mdwn +85/−0
- doc/direct_mode/comment_10_94284a476604e9c812b7ee475ca22959._comment +12/−0
- doc/direct_mode/comment_11_1c79c93f4b17cfc354ab920e3775cc60._comment +26/−0
- doc/direct_mode/comment_12_1b5218fdb6ee362d6df68ff1229590d4._comment +10/−0
- doc/direct_mode/comment_13_55108ac736ea450df89332ba5de4a208._comment +12/−0
- doc/direct_mode/comment_14_ff4ffc2aabc5fd174d7386ef13860f78._comment +10/−0
- doc/direct_mode/comment_15_1cd32456630b25d5aaa6d2763e6eb384._comment +8/−0
- doc/direct_mode/comment_1_93fc31e8dc0ad16248a2593a1482d375._comment +8/−0
- doc/direct_mode/comment_2_7f7086b34ed136851963f145868a1d23._comment +12/−0
- doc/direct_mode/comment_3_8020d74bddf0e38b0a297e5dae7c217b._comment +12/−0
- doc/direct_mode/comment_4_97c26bd82f623a3b2d56bab4afff0126._comment +13/−0
- doc/direct_mode/comment_5_42363bf0367f935b3eee8ad3d2eaf5cf._comment +10/−0
- doc/direct_mode/comment_6_5f03b1686c1fb3f7606a5bc724ac3812._comment +8/−0
- doc/direct_mode/comment_7_5355ac418bfb26e990762b80f4c36b77._comment +12/−0
- doc/direct_mode/comment_8_6cd15e2c5fd0bef48f60c6993322c2fc._comment +9/−0
- doc/direct_mode/comment_9_cff56dbcdfec60375c30d5b1b1c60614._comment +12/−0
- doc/distributed_version_control.mdwn +21/−0
- doc/download.mdwn +40/−0
- doc/download/comment_1_ec2578241a966cfcdd43f2a26a5c8709._comment +13/−0
- doc/download/comment_2_ee0d158ac59903737dbc4ef632f11fe3._comment +7/−0
- doc/encryption.mdwn +99/−0
- doc/encryption/comment_1_1afca8d7182075d46db41f6ad3dd5911._comment +10/−0
- doc/feeds.mdwn +4/−0
- doc/footer/column_a.mdwn +7/−0
- doc/footer/column_b.mdwn +7/−0
- doc/forum.mdwn +8/−0
- doc/forum/A_really_stupid_question.mdwn +3/−0
- doc/forum/Accessing_files_directly_on__a_USB_device.mdwn +11/−0
- doc/forum/Accessing_files_in_bare_repository.mdwn +5/−0
- doc/forum/Adding_existing_S3_bucket_to_sync_with.mdwn +16/−0
- doc/forum/Android:_is_constant_high_cpu_usage_to_be_expected__63__.mdwn +3/−0
- doc/forum/Annex_contents_just_disappeared__63__.mdwn +12/−0
- doc/forum/Annex_dropping_files.mdwn +12/−0
- doc/forum/Assistant:_configure_auto-sync.mdwn +11/−0
- doc/forum/Assistant_not_syncing_to_Rsync.mdwn +15/−0
- doc/forum/Auto_archiving.mdwn +17/−0
- doc/forum/Automatic_commit_messages_for_git_annex_sync.mdwn +1/−0
- doc/forum/Automatically_syncronise_centralised_repository.mdwn +14/−0
- doc/forum/Behaviour_of_fsck.mdwn +13/−0
- doc/forum/Best_way_to_manage_files_on_removable_media__63__.mdwn +18/−0
- doc/forum/Box.com_hasn__39__t_been_working_for_a_few_days.mdwn +72/−0
- doc/forum/Building_a_Debian_package_of_git-annex.mdwn +27/−0
- doc/forum/Building_git-annex-3.20121112-19309.mdwn +78/−0
- doc/forum/Cabal:_Could_not_resolve_dependencies___40__yesod__41__.mdwn +19/−0
- doc/forum/Calculating_Annex_Cost_by_Ping_Times.mdwn +1/−0
- doc/forum/Can__39__t_get_git-annex_merge_to_work_from_git_hook.mdwn +41/−0
- doc/forum/Can__39__t_get_pairing_to_work.mdwn +5/−0
- doc/forum/Can__39__t_init_git_annex.mdwn +15/−0
- doc/forum/Can__39__t_install:_Mac_OS_10.8.2.mdwn +36/−0
- doc/forum/Can_we_have_remotes_that_aren__39__t_tracked__63___.mdwn +13/−0
- doc/forum/Cannot_find_git-annex_in_server.mdwn +10/−0
- doc/forum/Cannot_launch_webapp_on_ubuntu_12.04_using_ppa.mdwn +6/−0
- doc/forum/Centralized_repository_with_webapp.mdwn +13/−0
- doc/forum/Check_if_remote_is_using_GPG__63__.mdwn +1/−0
- doc/forum/Check_when_your_last_fsck_was__63__.mdwn +4/−0
- doc/forum/Cleaning_up_after_aborted_sync_in_direct_mode.mdwn +19/−0
- doc/forum/Coming_from_git_world.mdwn +9/−0
- doc/forum/DBus_on_Ubuntu_12.04__63__.mdwn +3/−0
- doc/forum/DS__95__Store_files_are_not_added.mdwn +3/−0
- doc/forum/Debugging_Git_Annex.mdwn +4/−0
- doc/forum/Default_text__47__html_handler.mdwn +2/−0
- doc/forum/Delete_unused_files__47__metadata.mdwn +7/−0
- doc/forum/Deleting_Unused_Files_by_Age.mdwn +1/−0
- doc/forum/Detached_git_work_tree__63__.mdwn +11/−0
- doc/forum/Difference_between_copy__44___move_and_get__63__.mdwn +24/−0
- doc/forum/Different_annexes_pointing_to_same_special_remote__63__.mdwn +6/−0
- doc/forum/Direct_special_remotes.mdwn +26/−0
- doc/forum/Does_Jabber_syncing_work_when_the_buddy_is_offline__63__.mdwn +1/−0
- doc/forum/Does_git-annex_version_big_files__63__.mdwn +5/−0
- doc/forum/Does_migrate_ensure_data_integrity__63__.mdwn +7/−0
- doc/forum/Don__39__t_understand_how_to_delete__47__recover_files.mdwn +25/−0
- doc/forum/Don__39__t_understand_local_vs._known_keys.mdwn +19/−0
- doc/forum/Drop_with_assistant.mdwn +5/−0
- doc/forum/Encrypted_ssh_remote__44___synced_folders.mdwn +87/−0
- doc/forum/Error_adding_ssh_remote_in_assistant.mdwn +15/−0
- doc/forum/External_drive_syncs_git-annex_branch_but_not_master_branch.mdwn +1/−0
- doc/forum/Feature_Request:_add_filename_to_hash_objects.mdwn +6/−0
- doc/forum/Feature_request:_Multiple_concurrent_transfers.mdwn +19/−0
- doc/forum/Feature_request:_git_annex_copy_--auto_does_the_right_thing.mdwn +5/−0
- doc/forum/Feature_request:_webapp_support_for_centralized_bare_repos.mdwn +1/−0
- doc/forum/First_attempt_at_an_OSX_launcher___40__.app__41__.mdwn +3/−0
- doc/forum/Fixing_up_corrupt_annexes.mdwn +10/−0
- doc/forum/Forcing_one_repo_to_contain_a_copy_of_all_files.mdwn +1/−0
- doc/forum/Getting_started_with_Amazon_S3.mdwn +28/−0
- doc/forum/Git_Annex_Assistant:_How_to_add_a_remote__63__.mdwn +11/−0
- doc/forum/Git_Annex_Transfer_Protocols.mdwn +9/−0
- doc/forum/Git_annex_assistant_in_command_line.mdwn +2/−0
- doc/forum/Git_annex_assistant_on_EC2.mdwn +5/−0
- doc/forum/Git_annex_on_Windows.mdwn +11/−0
- doc/forum/Git_annex_syncing_speed__44___possible__63__.mdwn +21/−0
- doc/forum/Git_repos_in_git_annex__63__.mdwn +7/−0
- doc/forum/Git_repositories_in_the_annex__63__.mdwn +5/−0
- doc/forum/Handling_web_special_remote_when_content_changes__63__.mdwn +19/−0
- doc/forum/Help_Windows_walkthrough.mdwn +177/−0
- doc/forum/Help_with_syncing_file_contents.mdwn +68/−0
- doc/forum/How_do_I_dropunused_with_an_rsync_remote__63__.mdwn +3/−0
- doc/forum/How_do_you_know_when_something_fails_a_fsck__63__.mdwn +4/−0
- doc/forum/How_to_deal_with_renamed_files_in_direct_mode__63__.mdwn +3/−0
- doc/forum/How_to_delete_a_remote__63__.mdwn +1/−0
- doc/forum/How_to_handle_the_git-annex_branch__63__.mdwn +5/−0
- doc/forum/How_to_make_Maven_releases_work_with_git_annex___63__.mdwn +5/−0
- doc/forum/How_to_prevent_the_assistant_from_downloading_all_data__63__.mdwn +9/−0
- doc/forum/How_to_rename_a_remote__63__.mdwn +1/−0
- doc/forum/How_to_restore_symlinks.mdwn +1/−0
- doc/forum/How_to_retroactively_annex_a_file_already_in_a_git_repo.mdwn +5/−0
- doc/forum/Howto_remove_a_repository__63__.mdwn +4/−0
- doc/forum/Howto_remove_unused_files.mdwn +31/−0
- doc/forum/Import_options/comment_1_118a5f978090a3909299876a01c0adec._comment +21/−0
- doc/forum/Import_options/comment_2_21da91f08cb6b28ae3e79ade033db516._comment +17/−0
- doc/forum/Is_an_automagic_upgrade_of_the_object_directory_safe__63__.mdwn +9/−0
- doc/forum/Is_it_possible_to_make_git-sync_not_nullify_symlinks__63__.mdwn +23/−0
- doc/forum/Lacking_webapp_on_Trisquel__47__Ubuntu_Precise.mdwn +7/−0
- doc/forum/Let_watch_selectively_annex_files.mdwn +27/−0
- doc/forum/Links_or_actual_files__63___Confused__33__.mdwn +21/−0
- doc/forum/Local_and_remote_in_direct_mode.mdwn +7/−0
- doc/forum/Looking_at_the_webapp_on_OSX.mdwn +18/−0
- doc/forum/Make_whereis_output_more_compact.mdwn +13/−0
- doc/forum/Making_git-annex_a_self-funded_project__63__.mdwn +10/−0
- doc/forum/Making_git-annex_less_necessary.mdwn +5/−0
- doc/forum/Managing_multiple_annexes_with_assistant__63__.mdwn +13/−0
- doc/forum/Managing_multiple_repositories_concurrently__63__.mdwn +5/−0
- doc/forum/Manual_Setup_of_a_Central_Repo.mdwn +1/−0
- doc/forum/Manual_mode_option_in_assistant_auto-syncs.mdwn +11/−0
- doc/forum/Manual_webapp_behaviour_on_ARM.mdwn +15/−0
- doc/forum/Missing_git-annex.linux__47__runshell.mdwn +44/−0
- doc/forum/Moving_large_files_within_the_repo_without_copying___63__.mdwn +19/−0
- doc/forum/Need_new_build_instructions_for_Debian_stable.mdwn +5/−0
- doc/forum/Need_some_help_to_fix_my_repository.mdwn +31/−0
- doc/forum/New_git-annex_integration_mode_for_Emacs_users.mdwn +3/−0
- doc/forum/New_user_misunderstandings.mdwn +24/−0
- doc/forum/No_SSL_traffic_for_S3__63__.mdwn +8/−0
- doc/forum/Not_sure_how_to_get_my_s3_remote_back.mdwn +31/−0
- doc/forum/OSX_Mavericks_anyone__63__.mdwn +3/−0
- doc/forum/OSX__39__s_default_sshd_behaviour_has_limited_paths_set.mdwn +12/−0
- doc/forum/OSX__39__s_haskell-platform_statically_links_things.mdwn +17/−0
- doc/forum/OpenOffice___47___Libre_Office.mdwn +5/−0
- doc/forum/Overwriting_data_without_getting_it.mdwn +3/−0
- doc/forum/Please_fix_compatibility_with_ghc_7.0.mdwn +1/−0
- doc/forum/Podcast_syncing_use-case.mdwn +34/−0
- doc/forum/Poor_man__39__s_IMAP.mdwn +6/−0
- doc/forum/Post-Kickstarter.mdwn +5/−0
- doc/forum/Problem_compiling_current_master.mdwn +12/−0
- doc/forum/Problems_syncing_with_box.com.mdwn +26/−0
- doc/forum/Problems_using_submodules_with_git-annex__63__.mdwn +1/−0
- doc/forum/Problems_with_large_numbers_of_files.mdwn +8/−0
- doc/forum/Pruning_out_unwanted_Git_objects.mdwn +3/−0
- doc/forum/Push__47__Pull_with_the_Assistant.mdwn +1/−0
- doc/forum/Pushing_git_repo_to_AWS_S3_from_behind_proxy.mdwn +9/−0
- doc/forum/Reappearing_repos_in_webapp_and_vicfg.mdwn +43/−0
- doc/forum/Recommended_number_of_repositories.mdwn +4/−0
- doc/forum/Relocating_annex_directory.mdwn +1/−0
- doc/forum/Removing_files_not_found_by_git_annex_unused.mdwn +29/−0
- doc/forum/Restricting_git-annex-shell_to_a_specific_repository.mdwn +25/−0
- doc/forum/Retrieve_previous_version_in_direct_mode.mdwn +5/−0
- doc/forum/Revert_file_linkage_to_original_files.mdwn +9/−0
- doc/forum/Running_assistant_on_a_server___40__no_X_available__41__.mdwn +2/−0
- doc/forum/Running_assistant_steps_manually.mdwn +20/−0
- doc/forum/Running_out_of__inodes.mdwn +17/−0
- doc/forum/Same_Jabber_account_for_different_annexes.mdwn +1/−0
- doc/forum/Securing_a_shared_ssh_server.mdwn +3/−0
- doc/forum/Setup_of_rsync_special_remote_with_non-standard_ssh_port.mdwn +13/−0
- doc/forum/Share_only_certain_files_of_a_repo___40__Assistant__41__.mdwn +6/−0
- doc/forum/Share_with_friend_copies_only_sym_links.mdwn +38/−0
- doc/forum/Sharing_annex_with_local_clones.mdwn +1/−0
- doc/forum/Simple_check_out_with_assistant__63__.mdwn +2/−0
- doc/forum/Slightly_finer_control_over_file_whereabouts.mdwn +18/−0
- doc/forum/Special_remote_without_chmod.mdwn +12/−0
- doc/forum/Storing_uncontrolled_files_in_an_annex.mdwn +3/−0
- doc/forum/Stupid_mistake:_recoverable__63__.mdwn +31/−0
- doc/forum/Sync_without_jabber_account.mdwn +9/−0
- doc/forum/Synchronize_large_files___40__VM_images__41__.mdwn +10/−0
- doc/forum/Syncing_machines_on_different_networks.mdwn +9/−0
- doc/forum/Syncronisation_of_syncronisation_between_3_repositories__63__.mdwn +11/−0
- doc/forum/Transfer_remotes.mdwn +3/−0
- doc/forum/Trouble_installing_from_cabal_on_debian-testing.mdwn +15/−0
- doc/forum/Truly_purging_dead_repositories.mdwn +1/−0
- doc/forum/USB_backup_with_files_visible.mdwn +7/−0
- doc/forum/Ubuntu_PPA.mdwn +3/−0
- doc/forum/Ubuntu_PPA/comment_1_b55535258b1b4bcfc802235f0cba075d._comment +8/−0
- doc/forum/Ubuntu_PPA/comment_2_adc4d644fed058d1811acf0b35db9c18._comment +8/−0
- doc/forum/Ubuntu_PPA/comment_3_fc9cd51558c47718f243437202a11803._comment +8/−0
- doc/forum/Ubuntu_PPA/comment_4_3a8bbd0a7450a7f5323cd13144824aea._comment +12/−0
- doc/forum/Ubuntu_PPA/comment_5_2e1beaeebda0201c635db8b276cedf20._comment +12/−0
- doc/forum/Ubuntu_PPA/comment_6_bd99fb70399fc58d98781a89c6d38428._comment +8/−0
- doc/forum/Ubuntu_PPA/comment_7_c3f7ec8573934c59d70a48e36e321c13._comment +12/−0
- doc/forum/Un-git-annex__63__.mdwn +6/−0
- doc/forum/Undo_Git_Annex_Changes_To_Linked_Files.mdwn +7/−0
- doc/forum/Unknown_remote_type_S3.mdwn +5/−0
- doc/forum/Unlock_files_when_assistant_is_running__63__.mdwn +13/−0
- doc/forum/Use_case_with_syncing_only_a_subset_possible__63__.mdwn +13/−0
- doc/forum/Use_local_files_instead_of_re-downloading_from_S3_remote.mdwn +3/−0
- doc/forum/Use_reflinks_on_BTRFS_instead_of_symlinks___63__.mdwn +1/−0
- doc/forum/Using_Linux_static_builds.mdwn +25/−0
- doc/forum/Using___34__sync__34___to_sink_all_branches__63__.mdwn +9/−0
- doc/forum/Using_for_Music_repo.mdwn +13/−0
- doc/forum/Using_git-annex_as_a_library.mdwn +1/−0
- doc/forum/Using_git-annex_via_command_line_in_OS_X.mdwn +3/−0
- doc/forum/Watch__47__assistant__47__webapp_documentation.mdwn +12/−0
- doc/forum/Webapp_on_ARM.mdwn +6/−0
- doc/forum/Webapp_on_ARM/comment_1_82ac40cef5b59070136527b8d81a5ce2._comment +10/−0
- doc/forum/Weird_behavior_with_OS_X_Finder_and_Preview.app.mdwn +12/−0
- doc/forum/What_can_be_done_in_case_of_conflict.mdwn +7/−0
- doc/forum/What_happened_to_the_walkthrough__63__.mdwn +1/−0
- doc/forum/What_is_the_best_way_to___34__git_annex_mv__34___file__63__.mdwn +1/−0
- doc/forum/Which_cloud_providers_are_supported__63___.mdwn +3/−0
- doc/forum/Why_does_the_bup_remote_use___126____47__.bup__63__.mdwn +5/−0
- doc/forum/Will_git-annex_solve_my_problem__63__.mdwn +7/−0
- doc/forum/Will_git_annex_work_on_a_FAT32_formatted_key__63__.mdwn +3/−0
- doc/forum/Windows_support.mdwn +6/−0
- doc/forum/Windows_usage_instructions.mdwn +25/−0
- doc/forum/Wishlist:_Bittorrent-like_transfers.mdwn +5/−0
- doc/forum/Wishlist:_Don__39__t_make_files_readonly.mdwn +3/−0
- doc/forum/Wishlist:_Ways_of_selecting_files_based_on_meta-information.mdwn +15/−0
- doc/forum/Wishlist:_automatic_reinject.mdwn +14/−0
- doc/forum/Wishlist:_getting_the_disk_used_by_a_subtree_of_files.mdwn +10/−0
- doc/forum/Wishlist:_mark_remotes_offline.mdwn +12/−0
- doc/forum/Wishlist:_options_for_syncing_meta-data_and_data.mdwn +13/−0
- doc/forum/XMPP_authentication_failure.mdwn +15/−0
- doc/forum/__34__Pairing__34___more_than_two_computers.mdwn +11/−0
- doc/forum/__34__du__34___equivalent_on_an_annex__63__.mdwn +5/−0
- doc/forum/__34__git_annex_lock__34___very_slow_for_big_repo.mdwn +7/−0
- doc/forum/__34__permission_denied__34___in_fsck_on_shared_repo.mdwn +17/−0
- doc/forum/advantages_of_SHA__42___over_WORM.mdwn +5/−0
- doc/forum/android_binary-only_download.mdwn +9/−0
- doc/forum/annexed_file_key_for_web_remote_with_SHA256E_backend.mdwn +12/−0
- doc/forum/archaeology_of_deleted_files.mdwn +36/−0
- doc/forum/archival_and_multiple_users.mdwn +8/−0
- doc/forum/assistant_overzealously_moving_stuff_to_other_repos.mdwn +5/−0
- doc/forum/assistant_without_watch__63__.mdwn +13/−0
- doc/forum/autobuilders_for_git-annex_to_aid_development.mdwn +34/−0
- doc/forum/bainstorming:_git_annex_push___38___pull.mdwn +28/−0
- doc/forum/bash_completion.mdwn +1/−0
- doc/forum/batch_check_on_remote_when_using_copy.mdwn +34/−0
- doc/forum/benefit_of_splitting_a_repository.mdwn +10/−0
- doc/forum/cabal_install_fails_on_uuid.mdwn +23/−0
- doc/forum/can_I_only_add_my_own_files__63__.mdwn +27/−0
- doc/forum/can_git-annex_replace_ddm__63__.mdwn +13/−0
- doc/forum/clear_box.com_repository.mdwn +1/−0
- doc/forum/cloud_services_to_support.mdwn +16/−0
- doc/forum/cloudcmd.mdwn +6/−0
- doc/forum/commit_current_workdir_state_in_direct_mode.mdwn +5/−0
- doc/forum/confusion_with_remotes__44___map.mdwn +113/−0
- doc/forum/correct_way_to_add_two_preexisting_datasets.mdwn +25/−0
- doc/forum/dot_git_slash_annex_slash_tmp.mdwn +5/−0
- doc/forum/endless_password_prompt_loop.mdwn +8/−0
- doc/forum/error_in_installation_of_base-4.5.0.0.mdwn +14/−0
- doc/forum/example_of_massively_disconnected_operation.mdwn +33/−0
- doc/forum/exclude_files_from_annex.mdwn +10/−0
- doc/forum/expire_files__44___move_to_other_hosts.mdwn +19/−0
- doc/forum/exporting_annexed_files.mdwn +4/−0
- doc/forum/first-time_setup_git-annex.mdwn +7/−0
- doc/forum/flickrannex_--_not_sure_I_get_it.mdwn +7/−0
- doc/forum/fsck_gives_false_positives.mdwn +6/−0
- doc/forum/gadu_-_git-annex_disk_usage.mdwn +7/−0
- doc/forum/get_and_copy_with_bare_repositories.mdwn +7/−0
- doc/forum/getting_git_annex_to_do_a_force_copy_to_a_remote.mdwn +11/−0
- doc/forum/git-annex___38___ikiwiki_experiment.mdwn +28/−0
- doc/forum/git-annex_across_two_filesystems.mdwn +30/−0
- doc/forum/git-annex_and_tagfs.mdwn +14/−0
- doc/forum/git-annex_communication_channels.mdwn +10/−0
- doc/forum/git-annex_on_OSX.mdwn +1/−0
- doc/forum/git-annex_on_Samba_share.mdwn +9/−0
- doc/forum/git-annex_on_Ubuntu_13.04_and_13.10_not_working.mdwn +12/−0
- doc/forum/git-annex_on_archlinuxarm__44___armv6.mdwn +20/−0
- doc/forum/git-annex_pre-commit_eats_all_my_4GB_of_ram.mdwn +24/−0
- doc/forum/git-annex_teams___47___groups.mdwn +5/−0
- doc/forum/git-annex_unused_not_dropping_deleted_files.mdwn +34/−0
- doc/forum/git-assistant_clarification.mdwn +11/−0
- doc/forum/git-remote-gcrypt.mdwn +1/−0
- doc/forum/git-status_typechange_in_direct_mode.mdwn +48/−0
- doc/forum/git-subtree_support__63__.mdwn +9/−0
- doc/forum/git_annex_add_crash_and_subsequent_recovery.mdwn +25/−0
- doc/forum/git_annex_alternative.mdwn +10/−0
- doc/forum/git_annex_assistant__44___share_with_other_devices.mdwn +3/−0
- doc/forum/git_annex_copy_--fast_--to_blah_much_slower_than_--from_blah.mdwn +15/−0
- doc/forum/git_annex_get_creates_a_new_uuid.mdwn +6/−0
- doc/forum/git_annex_ls___47___metadata_in_git_annex_whereis.mdwn +1/−0
- doc/forum/git_annex_sync_dies___40__sometimes__41__.mdwn +22/−0
- doc/forum/git_pull_remote_git-annex.mdwn +11/−0
- doc/forum/git_tag_missing_for_3.20111011.mdwn +1/−0
- doc/forum/git_unannex_speed.mdwn +1/−0
- doc/forum/glacier_-_range_retrievals_and_daily_free_retrieval_allowance.mdwn +6/−0
- doc/forum/hashing_objects_directories.mdwn +27/−0
- doc/forum/help_running_git-annex_on_top_of_existing_repo.mdwn +12/−0
- doc/forum/how_to_decrypt_file_from_encrypted_special_remote__63__.mdwn +14/−0
- doc/forum/howto_update_feed.mdwn +14/−0
- doc/forum/incompatible_versions__63__.mdwn +1/−0
- doc/forum/linux_standalone_tarballs.mdwn +1/−0
- doc/forum/location_tracking_cleanup.mdwn +24/−0
- doc/forum/making_good_use_of_my_shiny_new_rsync.net_account.mdwn +20/−0
- doc/forum/man_pages_in_the_prebuilt_linux_tarball.mdwn +1/−0
- doc/forum/managing_multiple_repositories.mdwn +3/−0
- doc/forum/many_remotes.mdwn +24/−0
- doc/forum/migrate_existing_git_repository_to_git-annex.mdwn +66/−0
- doc/forum/migration_to_git-annex_and_rsync.mdwn +33/−0
- doc/forum/mistakenly_checked___42__files__42___into_an_annex.__bummer..mdwn +3/−0
- doc/forum/multiple_routes_to_same_repository.mdwn +2/−0
- doc/forum/multiple_sym_links___40__for_tagging_photos__41____63__.mdwn +11/−0
- doc/forum/multiple_urls_for_the_same_UUID.mdwn +26/−0
- doc/forum/new_microfeatures.mdwn +59/−0
- doc/forum/nntp__47__usenet_special_remote.mdwn +18/−0
- doc/forum/non-bare_repo_on_cloud_remote.mdwn +6/−0
- doc/forum/not_getting_file_contents.mdwn +1/−0
- doc/forum/one_annex_versus_many_annexes__63__.mdwn +10/−0
- doc/forum/one_or_many_annexes__63__.mdwn +7/−0
- doc/forum/performance_and_multiple_replication_problems.mdwn +17/−0
- doc/forum/post-copy__47__sync_hook.mdwn +14/−0
- doc/forum/preferred_content_settings_for_multiple_symlinks.mdwn +7/−0
- doc/forum/public-web-frontend.mdwn +16/−0
- doc/forum/pulling_from_encrypted_remote.mdwn +12/−0
- doc/forum/pure_git-annex_only_workflow.mdwn +46/−0
- doc/forum/purge_files_with_no_copies.mdwn +3/−0
- doc/forum/question_about_assistant_and___47__archive__47__.mdwn +22/−0
- doc/forum/recover_deleted_files___63__.mdwn +66/−0
- doc/forum/recovering_from_repo_corruption.mdwn +11/−0
- doc/forum/reliability__47__completeness_of_XMPP_updates.mdwn +7/−0
- doc/forum/relying_on_git_for_numcopies.mdwn +47/−0
- doc/forum/remote_server_client_repositories_are_bare__33____63__.mdwn +17/−0
- doc/forum/reserving_space_with_directory_special_remotes.mdwn +2/−0
- doc/forum/retrieving_previous_versions.mdwn +7/−0
- doc/forum/rsync_over_ssh__63__.mdwn +2/−0
- doc/forum/safely_dropping_git-annex_history.mdwn +20/−0
- doc/forum/seems_to_build_fine_on_haskell_platform_2011.mdwn +1/−0
- doc/forum/shared_cipher_tries_to_use_gpg.mdwn +10/−0
- doc/forum/something_really_good_happened_with_3.20130124.mdwn +5/−0
- doc/forum/sparse_git_checkouts_with_annex.mdwn +31/−0
- doc/forum/special_remote_for_IMAP.mdwn +44/−0
- doc/forum/special_remote_for_iPods.mdwn +5/−0
- doc/forum/ssh_password.mdwn +3/−0
- doc/forum/ssh_password/comment_1_a3e5a41e1d4da683d577976b134b11ee._comment +10/−0
- doc/forum/ssh_password/comment_2_fa261676a99d49d4b237b0d43048d76d._comment +10/−0
- doc/forum/start_assistant_from_command_line.mdwn +11/−0
- doc/forum/switching_backends.mdwn +12/−0
- doc/forum/switching_to__47__from_direct_mode_while_assistant_is_running.mdwn +2/−0
- doc/forum/syncing_home_directories.mdwn +7/−0
- doc/forum/syncing_non-git_trees_with_git-annex.mdwn +46/−0
- doc/forum/taskwarrior.mdwn +11/−0
- doc/forum/taskwarrior/comment_1_1c3a29e7d292cb602d9d349f8009b51e._comment +10/−0
- doc/forum/tell_us_how_you__39__re_using_git-annex.mdwn +6/−0
- doc/forum/tips:_special__95__remotes__47__hook_with_tahoe-lafs.mdwn +22/−0
- doc/forum/ui.mdwn +11/−0
- doc/forum/ui/comment_1_f3e3446b05d6b573e29e6cad300fb635._comment +10/−0
- doc/forum/ui/comment_2_b493ee97eb2378e72c12f3d137109580._comment +15/−0
- doc/forum/unannex_alternatives.mdwn +9/−0
- doc/forum/unknown_response_from_git_cat-file.mdwn +8/−0
- doc/forum/unlock__47__lock_always_gets_me.mdwn +11/−0
- doc/forum/updating_the___34__number_of_copies__34__.mdwn +14/−0
- doc/forum/use_existing_ssh_keys__63__.mdwn +5/−0
- doc/forum/version_3_upgrade.mdwn +9/−0
- doc/forum/vlc_and_git-annex.mdwn +11/−0
- doc/forum/webapp___47___assistant_without_watch.mdwn +9/−0
- doc/forum/webapp_and_manual_mode.mdwn +7/−0
- doc/forum/webapp_listen_port_with_autostart.mdwn +3/−0
- doc/forum/windows_port__63__.mdwn +2/−0
- doc/forum/wishlist:_get__47__drop_via_webapp_file_explorer.mdwn +1/−0
- doc/forum/wishlist:_make_copy_stop_on_exhausted_disk_space.mdwn +4/−0
- doc/forum/working_without_git-annex_commits.mdwn +20/−0
- doc/future_proofing.mdwn +38/−0
- doc/git-annex-shell.mdwn +120/−0
- doc/git-annex.mdwn +1359/−0
- doc/git-recover-repository.mdwn +40/−0
- doc/git-union-merge.mdwn +38/−0
- doc/how_it_works.mdwn +41/−0
- doc/how_it_works/comment_1_b3bdd6a06d5764db521ae54878131f5f._comment +14/−0
- doc/index.mdwn +45/−0
- doc/install.mdwn +31/−0
- doc/install/Android.mdwn +32/−0
- doc/install/Android/comment_10_225f2c6fe255be93702cfbd4dc172f3b._comment +8/−0
- doc/install/Android/comment_11_4e970633d9073fcf4bc33f3fff2525b2._comment +10/−0
- doc/install/Android/comment_12_87da4f379a0276b662583e7e22061218._comment +8/−0
- doc/install/Android/comment_13_f077a27c04131da89db1d7abcab3e68f._comment +20/−0
- doc/install/Android/comment_1_f9ced494a530e6ae3e76cfbaddb89f5d._comment +8/−0
- doc/install/Android/comment_2_74cccae04ea23a8600069c7e658143aa._comment +8/−0
- doc/install/Android/comment_3_82c7cb31d19d4e18ca5548da5ca19a79._comment +8/−0
- doc/install/Android/comment_4_cebaa8ee5bbed27d9b2d032ca7bdec6e._comment +8/−0
- doc/install/Android/comment_5_40cb6cb72c4ad4aa19a4a40f41a6a757._comment +13/−0
- doc/install/Android/comment_6_b0f723538e7328d5070c563f070858bd._comment +8/−0
- doc/install/Android/comment_7_c6dc23d0e6f4138c4bf8e3452755676f._comment +8/−0
- doc/install/Android/comment_8_34f7c42050fa48769a6bfae60d72e477._comment +8/−0
- doc/install/Android/comment_9_f3d289b78d6bdb3cc65689495a8439a5._comment +11/−0
- doc/install/ArchLinux.mdwn +19/−0
- doc/install/ArchLinux/comment_1_da5919c986d2ae187bc2f73de9633978._comment +8/−0
- doc/install/ArchLinux/comment_2_e5f923e6d81cfb3fba7a72f60baaf4ab._comment +16/−0
- doc/install/ArchLinux/comment_3_8e607cd883ec174571e9dfe3b25bfd05._comment +8/−0
- doc/install/ArchLinux/comment_4_a378391dd218859f381c479259dd8fe3._comment +10/−0
- doc/install/Debian.mdwn +16/−0
- doc/install/Debian/comment_10_d5da996e106d2e4d8a822aa9bcc78596._comment +12/−0
- doc/install/Debian/comment_11_84283676da247c401bc9b4bb12c2b453._comment +8/−0
- doc/install/Debian/comment_12_0aca83b055d0a9dd8589c50250a8bbea._comment +13/−0
- doc/install/Debian/comment_13_167a091764e5e99ec0f35a65e95a22de._comment +8/−0
- doc/install/Debian/comment_14_a34e23d9aa3027012ab1236aa4f7d5cb._comment +8/−0
- doc/install/Debian/comment_15_20d8271ba3f6cfe3c8849c3d41607630._comment +8/−0
- doc/install/Debian/comment_1_029486088d098c2d4f1099f2f0e701a9._comment +9/−0
- doc/install/Debian/comment_2_648e3467e260cdf233acdb0b53313ce0._comment +8/−0
- doc/install/Debian/comment_3_4d922e11249627634ecc35bba4044d9e._comment +8/−0
- doc/install/Debian/comment_4_2a93ab18b05ccb90e7acc5885866fca2._comment +9/−0
- doc/install/Debian/comment_5_38e6399083e10a6a274f35bddc15d4ac._comment +18/−0
- doc/install/Debian/comment_6_2e7bbdbaabbfb9d89de22e913066e822._comment +8/−0
- doc/install/Debian/comment_7_1bccc7bf7a4ef61a9b30024b9b22ba7d._comment +12/−0
- doc/install/Debian/comment_8_5b5a3b0e8abe8831a6a15a4e258d14fd._comment +10/−0
- doc/install/Debian/comment_9_97eaed998ffd1ed79585075ed5cff06e._comment +8/−0
- doc/install/Fedora.mdwn +39/−0
- doc/install/Fedora/comment_1_c4db84e672ad4b45b522db735706b00f._comment +16/−0
- doc/install/Fedora/comment_2_f98c488c09bef86e2b0414589ce9e141._comment +25/−0
- doc/install/Fedora/comment_3_d872acf8865fe7c99a9b712db5b38ea4._comment +8/−0
- doc/install/Fedora/comment_4_93b3402e4c51e1a5c96f907bb528164b._comment +16/−0
- doc/install/Fedora/comment_5_0427e0503764b29e57abf9e97155136b._comment +15/−0
- doc/install/Fedora/comment_6_1b1b38a79251fe2e8c1e4debbe3bc3c5._comment +12/−0
- doc/install/FreeBSD.mdwn +2/−0
- doc/install/Gentoo.mdwn +3/−0
- doc/install/Linux_standalone.mdwn +34/−0
- doc/install/NixOS.mdwn +6/−0
- doc/install/OSX.mdwn +73/−0
- doc/install/OSX/comment_10_cd2120552ef894a37933b328136fa4cc._comment +8/−0
- doc/install/OSX/comment_11_740fa80e2e54e6fb570f820ff1f56440._comment +8/−0
- doc/install/OSX/comment_12_a84028080578a8b60115b6c4ef823627._comment +8/−0
- doc/install/OSX/comment_13_d6f1db401858ffea23c123db49f5b296._comment +8/−0
- doc/install/OSX/comment_14_035f856923276b0edad879e196e94097._comment +9/−0
- doc/install/OSX/comment_15_336e0acb00e84943715e69917643a69e._comment +35/−0
- doc/install/OSX/comment_16_1befafa862b7d07b1f6e57c0182497cf._comment +36/−0
- doc/install/OSX/comment_17_19c08b2c6c2c5cd88bf96d2bcbbd9055._comment +10/−0
- doc/install/OSX/comment_18_537fad5d8854e765499d47602d1ab398._comment +8/−0
- doc/install/OSX/comment_19_18d4377f4ded5604d395d73783ba82c9._comment +8/−0
- doc/install/OSX/comment_20_3e6a3c00444badf2cf7a9ee3d54af11e._comment +8/−0
- doc/install/OSX/comment_21_987f1302f56107c926b6daf83e124654._comment +11/−0
- doc/install/OSX/comment_22_6b5f44a98f9d37a1c6ecfe19a60fe6c5._comment +12/−0
- doc/install/OSX/comment_23_3d82a270dd4b0159f4aab5675166e1e3._comment +30/−0
- doc/install/OSX/comment_24_b9d3563a2cc3d769f27876e028dc344d._comment +12/−0
- doc/install/OSX/comment_25_db90984062a07576a4777b2d743161f1._comment +24/−0
- doc/install/OSX/comment_27_2a60108a440231ba83f5a54b6bcc5488._comment +14/−0
- doc/install/OSX/comment_27_d453510b9bb62072a4c663206c12c8a4._comment +8/−0
- doc/install/OSX/comment_28_0970bfd63137ea48701dff6aea1b4bcb._comment +18/−0
- doc/install/OSX/comment_29_8622ed56c6a8034c20fb311418d94003._comment +8/−0
- doc/install/OSX/comment_2_25552ff2942048fafe97d653757f1ad6._comment +8/−0
- doc/install/OSX/comment_30_ce58633ef5b2f8f4caa7e626358f33be._comment +8/−0
- doc/install/OSX/comment_31_09084a7b3cf06bfa3add0f4991476ffe._comment +10/−0
- doc/install/OSX/comment_32_a46d8e3e7795b9afb1e1c2be943d12af._comment +10/−0
- doc/install/OSX/comment_33_203a36322b3c453c05c8906c64e62e06._comment +8/−0
- doc/install/OSX/comment_3_47a77a03040fe628109bd54f82f9ad7a._comment +17/−0
- doc/install/OSX/comment_4_25cac8bcd84a5210fc0a5243260b8cc7._comment +18/−0
- doc/install/OSX/comment_4_bbe99673033e4c48c8bb3db24ee419f9._comment +8/−0
- doc/install/OSX/comment_5_39b4b748b4586bf32b37edfefef84bba._comment +8/−0
- doc/install/OSX/comment_6_1a9c91ef43edc4148947f202ff604114._comment +8/−0
- doc/install/OSX/comment_7_892f7e65f95f43697164267c4b71c0d5._comment +8/−0
- doc/install/OSX/comment_8_38d9c2eea1090674de2361274eab5b0e._comment +29/−0
- doc/install/OSX/comment_9_35bf3812db6f3ef25da9b3bc84f147c5._comment +8/−0
- doc/install/OSX/old_comments.mdwn +1/−0
- doc/install/ScientificLinux5.mdwn +62/−0
- doc/install/Ubuntu.mdwn +29/−0
- doc/install/Ubuntu/comment_10_490e065314693423ab6969d8ae6978fe._comment +8/−0
- doc/install/Ubuntu/comment_11_4ebac3fb43de854ed1a3b1d2ea94011a._comment +10/−0
- doc/install/Ubuntu/comment_1_d1c511153fe94bf33e19a1281f1c92f2._comment +8/−0
- doc/install/Ubuntu/comment_2_ad13886c1c1f76d1cd995ea7b7d8471c._comment +8/−0
- doc/install/Ubuntu/comment_3_a08817322739b03cf0fec97283b16f1a._comment +8/−0
- doc/install/Ubuntu/comment_4_fe0997e56136bd30749f0995cbf19b56._comment +12/−0
- doc/install/Ubuntu/comment_5_fbb5306a162db1a1ee9efa3523aac952._comment +11/−0
- doc/install/Ubuntu/comment_6_a97e7f0e62ac685c3ded423bddeaa67f._comment +14/−0
- doc/install/Ubuntu/comment_7_921a223fd7e679b9ced3d8ba5ce688e0._comment +8/−0
- doc/install/Ubuntu/comment_8_1f943cb084fa8e21bc6ee5fc3118f02f._comment +8/−0
- doc/install/Ubuntu/comment_9_c2f8b35ada873acb1ce593b04e2899fe._comment +11/−0
- doc/install/Windows.mdwn +34/−0
- doc/install/cabal.mdwn +52/−0
- doc/install/cabal/comment_10_7ebe353b05d4df29897dc9a4f45c8a91._comment +8/−0
- doc/install/cabal/comment_11_0d06702e6e0ae3cd331cf748a9f6f273._comment +44/−0
- doc/install/cabal/comment_12_b93ca271dffca3f948645d3e1326c1d9._comment +12/−0
- doc/install/cabal/comment_13_3dac019cda71bf99878c0a1d9382323b._comment +8/−0
- doc/install/cabal/comment_14_14b46470593f84f8c3768a91cb77bdab._comment +9/−0
- doc/install/cabal/comment_15_c3a5b0aad28a90e0bb8da31a430578eb._comment +8/−0
- doc/install/cabal/comment_16_4faf214f97f9516898d7c17d743ef825._comment +10/−0
- doc/install/cabal/comment_17_2a9d6807a3a13815c824985521757167._comment +10/−0
- doc/install/cabal/comment_18_1efa0c7a963ec452fc6336fbe4964f6e._comment +10/−0
- doc/install/cabal/comment_19_6f42f9234f9ff6a2ca6bbb4d2643843e._comment +44/−0
- doc/install/cabal/comment_1_f04df6bcd50d1d01eb34868bb00ac35c._comment +18/−0
- doc/install/cabal/comment_20_0f553be2a4c666e3bed58b2bce549406._comment +8/−0
- doc/install/cabal/comment_21_f91a6ec21e96eced73ea9579fd8cbd15._comment +8/−0
- doc/install/cabal/comment_22_2f27b78215f97ade1986ca806c634cb3._comment +16/−0
- doc/install/cabal/comment_23_c34d2b1d95830a3e58671a5b566a1758._comment +8/−0
- doc/install/cabal/comment_24_40cbde8ec067b3a860e6df1a9bea5f76._comment +8/−0
- doc/install/cabal/comment_2_a69d17c55e56a707ec6606d5cdddee25._comment +17/−0
- doc/install/cabal/comment_3_55bed050bdb768543dbe1b86edec057d._comment +10/−0
- doc/install/cabal/comment_4_2ff7f8a3b03bea7e860248829d595bd1._comment +14/−0
- doc/install/cabal/comment_5_8789fc27466714faa5a3a7a6b8ec6e5d._comment +24/−0
- doc/install/cabal/comment_6_5afb2d081e8b603bc338cd460ad9317d._comment +21/−0
- doc/install/cabal/comment_7_129c4f2e404c874e5adfa52902a81104._comment +22/−0
- doc/install/cabal/comment_8_738c108f131e3aab0d720bc4fd6a81fd._comment +8/−0
- doc/install/cabal/comment_9_5ddbba419d96a7411f7edddaa4d7b739._comment +12/−0
- doc/install/fromscratch.mdwn +72/−0
- doc/install/openSUSE.mdwn +3/−0
- doc/internals.mdwn +132/−0
- doc/internals/hashing.mdwn +30/−0
- doc/internals/key_format.mdwn +20/−0
- doc/license.mdwn +14/−0
- doc/links/key_concepts.mdwn +7/−0
- doc/links/other_stuff.mdwn +7/−0
- doc/links/the_details.mdwn +8/−0
- doc/location_tracking.mdwn +30/−0
- doc/logo.mdwn +13/−0
- doc/meta.mdwn +5/−0
- doc/news.mdwn +11/−0
- doc/news/LWN_article.mdwn +2/−0
- doc/news/Presentation_at_FOSDEM.mdwn +4/−0
- doc/news/git_annex_fall_of_code.mdwn +27/−0
- doc/news/sharebox_a_FUSE_filesystem_for_git-annex.mdwn +19/−0
- doc/news/version_4.20130827.mdwn +27/−0
- doc/news/version_4.20130909.mdwn +36/−0
- doc/news/version_4.20131002.mdwn +42/−0
- doc/news/version_4.20131024.mdwn +43/−0
- doc/not.mdwn +55/−0
- doc/not/comment_1_ab41bec1ccc884e71780cb9458439170._comment +8/−0
- doc/not/comment_2_0e19ff7deb5ed65f2bc685d4c516d816._comment +8/−0
- doc/not/comment_3_bab9584c41a25dda934ad230e3eb732d._comment +8/−0
- doc/not/comment_4_b2a0d5a45ab8ddd66c29dde9412d7a12._comment +51/−0
- doc/not/comment_5_f2829ecbe80a61aa9a8411d2403de69e._comment +14/−0
- doc/not/comment_6_547fc59b19ad66d7280c53a7f923ea08._comment +13/−0
- doc/not/comment_7_581e23cca0219711f8a4500a8d5d20fc._comment +16/−0
- doc/not/comment_8_5c61457f117de38ef487e5cc2780d554._comment +24/−0
- doc/preferred_content.mdwn +197/−0
- doc/preferred_content/comment_10_f0bce3c67f293eaba97b92f0942876b6._comment +8/−0
- doc/preferred_content/comment_1_7d45e21dfb016e9ffa4715346dd0c1a6._comment +19/−0
- doc/preferred_content/comment_2_1ccd90b009245667ad59f4d29d2a3a37._comment +8/−0
- doc/preferred_content/comment_4_384025b5fa23a3f175985a081438149f._comment +8/−0
- doc/preferred_content/comment_4_6a9bc657bc7415f0e118357d8c6664c6._comment +18/−0
- doc/preferred_content/comment_5_f0a957e67297c4bb5a8778c11b3c9fd4._comment +9/−0
- doc/preferred_content/comment_6_b434c0e2aaa132020fd4a01551285376._comment +12/−0
- doc/preferred_content/comment_7_c4acaa237bf1a8512c5e8ea4cdbd11b9._comment +8/−0
- doc/preferred_content/comment_8_ff2a2dc9c566ebd9f570bdfcd7bfc030._comment +27/−0
- doc/preferred_content/comment_9_f82538be42428691d7cab60a7add2e74._comment +13/−0
- doc/privacy.mdwn +47/−0
- doc/related_software.mdwn +12/−0
- doc/scalability.mdwn +44/−0
- doc/sidebar.mdwn +15/−0
- doc/sitemap.mdwn +4/−0
- doc/special_remotes.mdwn +63/−0
- doc/special_remotes/S3.mdwn +53/−0
- 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_1_4a1f7a230dad6caa84831685b236fd73._comment +8/−0
- doc/special_remotes/S3/comment_2_5b22d67de946f4d34a4a3c7449d32988._comment +8/−0
- doc/special_remotes/S3/comment_3_bcab2bd0f168954243aa9bcc9671bd94._comment +8/−0
- doc/special_remotes/S3/comment_4_38c0b062997fde1ad28facc05d973e83._comment +12/−0
- doc/special_remotes/S3/comment_5_409bc2b56382417cf26bb222fb783ba7._comment +8/−0
- doc/special_remotes/S3/comment_6_78da9e233882ec0908962882ea8c4056._comment +10/−0
- doc/special_remotes/S3/comment_7_6af9781004d982d8e6b20a83ad29eead._comment +8/−0
- doc/special_remotes/S3/comment_8_0fa68d584ee7f6b5c9058fba7e911a11._comment +12/−0
- doc/special_remotes/S3/comment_9_7ad757b3865b04967c79af0a263bb3b0._comment +10/−0
- doc/special_remotes/bup.mdwn +39/−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_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/comment_10_e9881290486a1770bd260f8650ada9c6._comment +8/−0
- doc/special_remotes/comment_11_e01b5cc5a0d81b071e93e27e7b91fe2a._comment +8/−0
- doc/special_remotes/comment_12_13237170ef5b6646e0e25d3421af3fe5._comment +10/−0
- doc/special_remotes/comment_13_1a36a0483a9db04d36e0234a192ebad8._comment +12/−0
- doc/special_remotes/comment_14_a8419963dc024b1d9eb73807596012dc._comment +8/−0
- doc/special_remotes/comment_15_95ccfdd22a2391daa99e0beb04adedd6._comment +11/−0
- doc/special_remotes/comment_16_b9d238fb15ad7628e33c90b071e07bb0._comment +12/−0
- doc/special_remotes/comment_17_cc21b81a8f809f6efa5f5b6332513fc3._comment +12/−0
- doc/special_remotes/comment_18_3fe750118ff1edbe91a110b86fb5b662._comment +10/−0
- doc/special_remotes/comment_19_6794eb52bd87c28ef1df3172aa7d5780._comment +9/−0
- doc/special_remotes/comment_1_961276c18e9353ca8e25cad53e7ec51f._comment +8/−0
- doc/special_remotes/comment_2_97543acfa7434e332ebea5672e446317._comment +8/−0
- doc/special_remotes/comment_3_9229776623c234204c8b164edff95da0._comment +8/−0
- doc/special_remotes/comment_4_3bbda479d13f6bf393dcd59ed94ddeaa._comment +10/−0
- doc/special_remotes/comment_5_f7000975d38077828ab11a99095b39eb._comment +8/−0
- doc/special_remotes/comment_6_5d2bd7c1e1493d3c3784708a9b0bc001._comment +8/−0
- doc/special_remotes/comment_7_af01ee5ce31b1490af565cb087d65277._comment +10/−0
- doc/special_remotes/comment_8_3d4ffec566d68d601eafe8758a616756._comment +13/−0
- doc/special_remotes/comment_9_26af468952f0403171370b56e127830a._comment +8/−0
- doc/special_remotes/directory.mdwn +33/−0
- doc/special_remotes/directory/comment_12._comment +16/−0
- doc/special_remotes/gcrypt.mdwn +45/−0
- doc/special_remotes/glacier.mdwn +47/−0
- doc/special_remotes/hook.mdwn +103/−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/rsync.mdwn +56/−0
- doc/special_remotes/web.mdwn +11/−0
- doc/special_remotes/web/comment_1_0bd570025f6cd551349ea88a4729ac8e._comment +8/−0
- doc/special_remotes/web/comment_2_333141cc9ec6c26ffd19aa95303a91e3._comment +8/−0
- doc/special_remotes/webdav.mdwn +42/−0
- doc/special_remotes/xmpp.mdwn +39/−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/summary.mdwn +11/−0
- doc/sync.mdwn +38/−0
- doc/sync/comment_1_59681be5568f568f5c54eb0445163dd2._comment +8/−0
- doc/sync/comment_2_9301ff5e81d37475f594e74fbe32f24e._comment +11/−0
- doc/sync/comment_3_49560003da47490e4fabd4ab0089f2d7._comment +8/−0
- doc/sync/comment_4_cf29326408e62575085d1f980087c923._comment +8/−0
- doc/sync/comment_5_18c396c59907147bb2bf713e55392b6b._comment +8/−0
- doc/templates/bugtemplate.mdwn +18/−0
- doc/testimonials.mdwn +34/−0
- doc/tips.mdwn +4/−0
- doc/tips/Decentralized_repository_behind_a_Firewall.mdwn +59/−0
- doc/tips/Delay_Assistant_Startup_on_Login.mdwn +13/−0
- doc/tips/Git_annex_and_Calibre.mdwn +118/−0
- doc/tips/How_to_retroactively_annex_a_file_already_in_a_git_repo.mdwn +19/−0
- doc/tips/Internet_Archive_via_S3.mdwn +58/−0
- doc/tips/Using_Git-annex_as_a_web_browsing_assistant.mdwn +46/−0
- doc/tips/assume-unstaged.mdwn +31/−0
- doc/tips/assume-unstaged/comment_1_44abd811ef79a85e557418e17a3927be._comment +10/−0
- doc/tips/assume-unstaged/comment_2_5b589f37cfc03bf7be33a51826cc4dba._comment +13/−0
- doc/tips/automatically_getting_files_on_checkout.mdwn +15/−0
- doc/tips/beware_of_SSD_wear_when_doing_fsck_on_large_special_remotes.mdwn +2/−0
- doc/tips/centralised_repository:_starting_from_nothing.mdwn +75/−0
- doc/tips/centralized_git_repository_tutorial.mdwn +140/−0
- doc/tips/downloading_podcasts.mdwn +63/−0
- doc/tips/dropboxannex.mdwn +28/−0
- doc/tips/emacs_integration.mdwn +20/−0
- doc/tips/finding_duplicate_files.mdwn +21/−0
- doc/tips/finding_duplicate_files/comment_3._comment +39/−0
- doc/tips/flickrannex.mdwn +62/−0
- doc/tips/flickrannex/comment_10_50707f259abe5829ce075dfbecd5a4ba._comment +13/−0
- doc/tips/flickrannex/comment_11_ab5bcb025381b3da4d7c6dfd0c7310dd._comment +46/−0
- doc/tips/flickrannex/comment_12_90a331275d888221bc695003c8acbe46._comment +58/−0
- doc/tips/flickrannex/comment_13_1596e70dca71c853fd1d6fc9bde02b18._comment +12/−0
- doc/tips/flickrannex/comment_2_d74c4fc7edf8e47f7482564ce0ef4d12._comment +10/−0
- doc/tips/flickrannex/comment_2_f53d0d5520e2835e9705bea4e75556f0._comment +30/−0
- doc/tips/flickrannex/comment_4_9ebba4d61140f6c2071e988c9328cf7e._comment +14/−0
- doc/tips/flickrannex/comment_5_4470dae270613dd8712623474bc80ab0._comment +24/−0
- doc/tips/flickrannex/comment_5_d395cdcf815cb430e374ff05c1a63ff4._comment +17/−0
- doc/tips/flickrannex/comment_6_8cf730097001ffe106f2c743edce9d0a._comment +12/−0
- doc/tips/flickrannex/comment_7_a80c8087c4e1562a4c98a24edc182e5a._comment +12/−0
- doc/tips/flickrannex/comment_8_94f84254c32cf0f7dd1441b7da5d2bc6._comment +8/−0
- doc/tips/flickrannex/comment_9_5299b4cab4a4cb8e8fd4d2b39f0ea59c._comment +9/−0
- doc/tips/fully_encrypted_git_repositories_with_gcrypt.mdwn +112/−0
- doc/tips/googledriveannex.mdwn +28/−0
- doc/tips/imapannex.mdwn +27/−0
- doc/tips/megaannex.mdwn +41/−0
- doc/tips/migrating_data_to_a_new_backend.mdwn +16/−0
- doc/tips/migrating_two_seperate_disconnected_directories_to_git_annex.mdwn +77/−0
- doc/tips/offline_archive_drives.mdwn +69/−0
- doc/tips/owncloudannex.mdwn +28/−0
- doc/tips/owncloudannex/comment_1_129652308c3c499462828dcaf8e747a4._comment +40/−0
- doc/tips/owncloudannex/comment_2_38604990368666f654d41891ba99ac61._comment +15/−0
- doc/tips/owncloudannex/comment_3_1bfd290d00d6536da7d31818db46f8ec._comment +87/−0
- doc/tips/owncloudannex/comment_4_492b6922a7c5bb5464fedb46b0c5303b._comment +17/−0
- doc/tips/owncloudannex/comment_5_1d48ac08714fadcb06d874570d745bd8._comment +16/−0
- doc/tips/owncloudannex/comment_6_65959f49a2f56bffd6fe48670c0c8d5a._comment +8/−0
- doc/tips/owncloudannex/comment_7_7482002991672ef67836bae43b8d0be8._comment +8/−0
- doc/tips/powerful_file_matching.mdwn +36/−0
- doc/tips/recover_data_from_lost+found.mdwn +19/−0
- doc/tips/replacing_Sparkleshare_or_dvcs-autosync_with_the_assistant.mdwn +41/−0
- doc/tips/setup_a_public_repository_on_a_web_site.mdwn +55/−0
- doc/tips/shared_git_annex_directory_between_multiple_users.mdwn +39/−0
- doc/tips/skydriveannex.mdwn +29/−0
- doc/tips/untrusted_repositories.mdwn +28/−0
- doc/tips/using_Amazon_Glacier.mdwn +75/−0
- doc/tips/using_Amazon_S3.mdwn +37/−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_Google_Cloud_Storage.mdwn +9/−0
- doc/tips/using_box.com_as_a_special_remote.mdwn +71/−0
- doc/tips/using_git_annex_with_no_fixed_hostname_and_optimising_ssh.mdwn +59/−0
- doc/tips/using_gitolite_with_git-annex.mdwn +89/−0
- doc/tips/using_the_SHA1_backend.mdwn +11/−0
- doc/tips/using_the_web_as_a_special_remote.mdwn +101/−0
- doc/tips/visualizing_repositories_with_gource.mdwn +22/−0
- doc/tips/visualizing_repositories_with_gource/screenshot.jpg binary
- doc/tips/what_to_do_when_a_repository_is_corrupted.mdwn +22/−0
- doc/tips/what_to_do_when_you_lose_a_repository.mdwn +19/−0
- doc/tips/yet_another_simple_disk_usage_like_utility.mdwn +9/−0
- doc/todo.mdwn +4/−0
- doc/todo/A_really_simple_way_to_pair_devices_like_bittorent_sync.mdwn +7/−0
- doc/todo/Bittorrent-like_features.mdwn +45/−0
- doc/todo/Build_for_Synology_DSM.mdwn +1/−0
- doc/todo/Move_ssh_config_to___126____47__ssh__47__git-annex__47__config.mdwn +7/−0
- doc/todo/Please_abort_build_if___34__make_test__34___fails.mdwn +7/−0
- doc/todo/Please_add_support_for_monad-control_0.3.x.mdwn +9/−0
- doc/todo/S3.mdwn +24/−0
- doc/todo/Slow_transfer_for_a_lot_of_small_files..mdwn +20/−0
- doc/todo/Use_MediaScannerConnection_on_Android.mdwn +7/−0
- doc/todo/Use_a_remote_as_a_sharing_site_for_files_with_obfuscated_URLs.mdwn +7/−0
- doc/todo/Wishlist:_additional_environment_variables_for_hooks.mdwn +14/−0
- doc/todo/Wishlist:_sanitychecker_fix_wrong_UUID__47__duplicate_remote.mdwn +7/−0
- doc/todo/add_--exclude_option_to_git_annex_find.mdwn +4/−0
- doc/todo/add_-all_option.mdwn +22/−0
- doc/todo/add_a_git_backend.mdwn +18/−0
- doc/todo/add_an_icon_for_the_.desktop_file.mdwn +1/−0
- doc/todo/add_metadata_to_annexed_files.mdwn +5/−0
- doc/todo/assistant_git_sync_laddering.mdwn +10/−0
- doc/todo/assistant_smarter_archive_directory_handling.mdwn +31/−0
- doc/todo/assistant_threaded_runtime.mdwn +40/−0
- doc/todo/auto_remotes.mdwn +29/−0
- doc/todo/auto_remotes/discussion.mdwn +7/−0
- doc/todo/automatic_bookkeeping_watch_command.mdwn +15/−0
- doc/todo/avoid_unnecessary_union_merges.mdwn +20/−0
- doc/todo/backendSHA1.mdwn +7/−0
- doc/todo/branching.mdwn +159/−0
- doc/todo/cache_key_info.mdwn +37/−0
- doc/todo/cache_key_info/comment_1_578df1b3b2cbfdc4aa1805378f35dc48._comment +11/−0
- doc/todo/checkout.mdwn +23/−0
- doc/todo/checksum_verification_on_transfer.mdwn +7/−0
- doc/todo/direct_mode_guard.mdwn +22/−0
- doc/todo/done.mdwn +4/−0
- doc/todo/exclude_files_on_a_given_remote.mdwn +18/−0
- doc/todo/faster_gnupg_cipher.mdwn +9/−0
- doc/todo/faster_rsync_remotes.mdwn +4/−0
- doc/todo/file_copy_progress_bar.mdwn +5/−0
- doc/todo/free_space_checking_for_local_special_remotes.mdwn +4/−0
- doc/todo/fsck.mdwn +11/−0
- doc/todo/fsck_special_remotes.mdwn +13/−0
- doc/todo/git-annex-shell.mdwn +15/−0
- doc/todo/git-annex_unused_eats_memory.mdwn +32/−0
- doc/todo/gitolite_and_gitosis_support.mdwn +39/−0
- doc/todo/gitrm.mdwn +5/−0
- doc/todo/hidden_files.mdwn +30/−0
- doc/todo/http_git_annex_404_retry.mdwn +16/−0
- doc/todo/http_headers.mdwn +8/−0
- doc/todo/immutable_annexed_files.mdwn +8/−0
- doc/todo/importfeed:_allow___36____123__itemdate__125___with_--template.mdwn +5/−0
- doc/todo/incremental_fsck.mdwn +24/−0
- doc/todo/keep_annexed_files_for_a_while.mdwn +8/−0
- doc/todo/link_file_to_remote_repo_feature.mdwn +52/−0
- doc/todo/makefile:_respect___36__PREFIX.mdwn +25/−0
- doc/todo/mdwn2man:_make_backticks_bold.mdwn +22/−0
- doc/todo/network_remotes.mdwn +5/−0
- doc/todo/nicer_whereis_output.mdwn +100/−0
- doc/todo/object_dir_reorg_v2.mdwn +25/−0
- doc/todo/optimise_git-annex_merge.mdwn +23/−0
- doc/todo/optinally_transfer_file_unencryptedly.mdwn +6/−0
- doc/todo/parallel_possibilities.mdwn +13/−0
- doc/todo/pushpull.mdwn +4/−0
- doc/todo/redundancy_stats_in_status.mdwn +23/−0
- doc/todo/resuming_encrypted_uploads.mdwn +22/−0
- doc/todo/rsync.mdwn +4/−0
- doc/todo/smudge.mdwn +162/−0
- doc/todo/smudge/comment_1_4ea616bcdbc9e9a6fae9f2e2795c31c9._comment +8/−0
- doc/todo/smudge/comment_2_e04b32caa0d2b4c577cdaf382a3ff7f6._comment +12/−0
- doc/todo/special_remote_for_amazon_glacier.mdwn +30/−0
- doc/todo/speed_up_fsck.mdwn +40/−0
- doc/todo/stream_feature__63__.mdwn +23/−0
- doc/todo/support-non-utf8-locales.mdwn +26/−0
- doc/todo/support_S3_multipart_uploads.mdwn +14/−0
- doc/todo/support_for_lossy_remotes.mdwn +11/−0
- doc/todo/support_for_writing_external_special_remotes.mdwn +25/−0
- doc/todo/support_fsck_in_bare_repos.mdwn +17/−0
- doc/todo/symlink_farming_commit_hook.mdwn +14/−0
- doc/todo/sync_my_local_git-annex_from_a_dump_remote.mdwn +6/−0
- doc/todo/tahoe_lfs_for_reals.mdwn +21/−0
- doc/todo/union_mounting.mdwn +10/−0
- doc/todo/union_mounting/comment_1_cb08435812dd7766de26199c73f38e8b._comment +8/−0
- doc/todo/union_mounting/comment_2_240b1736f6bd4fbf87c372d3a46e661b._comment +9/−0
- doc/todo/untracked_remotes.mdwn +9/−0
- doc/todo/use_cp_reflink.mdwn +7/−0
- doc/todo/using_url_backend.mdwn +11/−0
- doc/todo/windows_support.mdwn +15/−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/todo/wishlist:_Add_to_Android_version_to_Google_Play.mdwn +9/−0
- doc/todo/wishlist:_Advanced_settings_for_xmpp_and_webdav.mdwn +7/−0
- doc/todo/wishlist:_An_--all_option_for_dropunused.mdwn +4/−0
- doc/todo/wishlist:_An_option_like_--git-dir.mdwn +3/−0
- doc/todo/wishlist:_Freeing_X_space_on_remote_Y.mdwn +1/−0
- doc/todo/wishlist:_GnuPG_options.mdwn +16/−0
- doc/todo/wishlist:_Have_a_preview_of_download_or_upload_size.mdwn +10/−0
- doc/todo/wishlist:_Option_to_specify_max_transfer_rate.mdwn +3/−0
- doc/todo/wishlist:_Prevent_repeated_password_prompts_for_one_command.mdwn +45/−0
- doc/todo/wishlist:_Restore_s3_files_moved_to_Glacier.mdwn +7/−0
- doc/todo/wishlist:___34__git_annex_add__34___multiple_processes.mdwn +10/−0
- doc/todo/wishlist:___34__quiet__34___annex_get_for_centralized_use_case.mdwn +14/−0
- doc/todo/wishlist:___39__get__39___queue_and_schedule..mdwn +30/−0
- doc/todo/wishlist:___39__whereis__39___support_in_the_webapp.mdwn +4/−0
- doc/todo/wishlist:___96__git_annex_drop_--relaxed__96__.mdwn +5/−0
- doc/todo/wishlist:___96__git_annex_sync_-m__96__.mdwn +10/−0
- doc/todo/wishlist:_addurl_https:.mdwn +11/−0
- doc/todo/wishlist:_allow_configuration_of_downloader_for_addurl.mdwn +3/−0
- doc/todo/wishlist:_annex.largefiles_support_for_mimetypes.mdwn +1/−0
- doc/todo/wishlist:_archive_from_remote_with_the_least_free_space.mdwn +1/−0
- doc/todo/wishlist:_command_options_changes.mdwn +17/−0
- doc/todo/wishlist:_define_remotes_that_must_have_all_files.mdwn +18/−0
- doc/todo/wishlist:_disable_automatic_commits.mdwn +36/−0
- doc/todo/wishlist:_display_status_of_remotes_in_the_webapp.mdwn +1/−0
- doc/todo/wishlist:_do_round_robin_downloading_of_data.mdwn +5/−0
- doc/todo/wishlist:_dropping_git-annex_history.mdwn +28/−0
- doc/todo/wishlist:_generic_annex.cost-command.mdwn +17/−0
- doc/todo/wishlist:_git-annex_replicate.mdwn +12/−0
- doc/todo/wishlist:_git_annex_diff.mdwn +9/−0
- doc/todo/wishlist:_git_annex_put_--_same_as_get__44___but_for_defaults.mdwn +17/−0
- doc/todo/wishlist:_git_annex_status.mdwn +21/−0
- doc/todo/wishlist:_git_backend_for_git-annex.mdwn +9/−0
- doc/todo/wishlist:_history_of_operations.mdwn +8/−0
- doc/todo/wishlist:_make_git_annex_reinject_work_in_direct_mode.mdwn +18/−0
- doc/todo/wishlist:_make_partial_files_available_during_transfer.mdwn +18/−0
- doc/todo/wishlist:_more_descriptive_commit_messages_in_git-annex_branch.mdwn +39/−0
- doc/todo/wishlist:_option_to_disable_url_checking_with_addurl.mdwn +9/−0
- doc/todo/wishlist:_option_to_print_more_info_with___39__unused__39__.mdwn +37/−0
- doc/todo/wishlist:_perform_fsck_remotely.mdwn +39/−0
- doc/todo/wishlist:_print_locations_for_files_in_rsync_remote.mdwn +6/−0
- doc/todo/wishlist:_query_things_like_description__44___trust_level.mdwn +4/−0
- doc/todo/wishlist:_recursive_directory_remote_setup__47__addurl.mdwn +7/−0
- doc/todo/wishlist:_simple_url_for_webapp.mdwn +36/−0
- doc/todo/wishlist:_simpler_gpg_usage.mdwn +12/−0
- doc/todo/wishlist:_special_remote_Ubuntu_One.mdwn +1/−0
- doc/todo/wishlist:_special_remote_for_sftp_or_rsync.mdwn +28/−0
- doc/todo/wishlist:_special_remote_mega.co.nz.mdwn +3/−0
- doc/todo/wishlist:_support_copy_--from__61__x_--to__61__y.mdwn +29/−0
- doc/todo/wishlist:_support_drop__44___find_on_special_remotes.mdwn +18/−0
- doc/todo/wishlist:_support_for_more_ssh_urls_.mdwn +22/−0
- doc/todo/wishlist:_swift_backend.mdwn +5/−0
- doc/todo/wishlist:_traffic_accounting_for_git-annex.mdwn +3/−0
- doc/todo/wishlist:_unify_directory_scheme_for_the_store.mdwn +20/−0
- doc/todo/wishlist:_use_hardlinks_for_local_clones.mdwn +9/−0
- doc/todo/wishlist:_vicfg_possible_repo_group_names.mdwn +16/−0
- doc/todo/wishlist:alias_system.mdwn +1/−0
- doc/transferring_data.mdwn +19/−0
- doc/trust.mdwn +59/−0
- doc/upgrades.mdwn +98/−0
- doc/upgrades/SHA_size.mdwn +20/−0
- doc/upgrades/SHA_size/comment_1_20f9b7b75786075de666b2146dc13a60._comment +12/−0
- doc/upgrades/gcrypt.mdwn +25/−0
- doc/upgrades/gcrypt/comment_1_606c1527735996ae671f78948e4ad84b._comment +8/−0
- doc/use_case/Alice.mdwn +24/−0
- doc/use_case/Bob.mdwn +25/−0
- doc/users.mdwn +9/−0
- doc/users/anarcat.mdwn +41/−0
- doc/users/chrysn.mdwn +11/−0
- doc/users/fmarier.mdwn +6/−0
- doc/users/gebi.mdwn +1/−0
- doc/users/joey.mdwn +2/−0
- doc/users/tobiastheviking.mdwn +20/−0
- doc/videos.mdwn +8/−0
- doc/videos/FOSDEM2012.mdwn +7/−0
- doc/videos/LCA2013.mdwn +8/−0
- doc/videos/git-annex_assistant_archiving.mdwn +5/−0
- doc/videos/git-annex_assistant_introduction.mdwn +5/−0
- doc/videos/git-annex_assistant_remote_sharing.mdwn +6/−0
- doc/videos/git-annex_assistant_sync_demo.mdwn +8/−0
- doc/videos/git-annex_watch_demo.mdwn +7/−0
- doc/videos/git-annex_weppapp_demo.mdwn +8/−0
- doc/walkthrough.mdwn +25/−0
- doc/walkthrough/adding_a_remote.mdwn +19/−0
- doc/walkthrough/adding_files.mdwn +11/−0
- doc/walkthrough/automatically_managing_content.mdwn +45/−0
- doc/walkthrough/backups.mdwn +25/−0
- doc/walkthrough/creating_a_repository.mdwn +6/−0
- doc/walkthrough/fsck:_verifying_your_data.mdwn +16/−0
- doc/walkthrough/fsck:_when_things_go_wrong.mdwn +13/−0
- doc/walkthrough/getting_file_content.mdwn +12/−0
- doc/walkthrough/modifying_annexed_files.mdwn +44/−0
- doc/walkthrough/more.mdwn +3/−0
- doc/walkthrough/moving_file_content_between_repositories.mdwn +13/−0
- doc/walkthrough/removing_files.mdwn +17/−0
- doc/walkthrough/removing_files:_When_things_go_wrong.mdwn +24/−0
- doc/walkthrough/renaming_files.mdwn +13/−0
- doc/walkthrough/syncing.mdwn +27/−0
- doc/walkthrough/transferring_files:_When_things_go_wrong.mdwn +17/−0
- doc/walkthrough/unused_data.mdwn +35/−0
- doc/walkthrough/using_bup.mdwn +37/−0
- doc/walkthrough/using_ssh_remotes.mdwn +33/−0
- doc/walkthrough/using_tags_and_branches.mdwn +14/−0
- git-annex.1 +67/−4
- git-annex.cabal +13/−8
- git-recover-repository.hs +42/−0
- standalone/android/Makefile +1/−1
- standalone/android/buildchroot-inchroot +1/−1
- standalone/android/haskell-patches/comonad_cross-build.patch +7/−7
- standalone/android/haskell-patches/entropy_cross-build.patch +9/−9
- standalone/android/haskell-patches/file-embed_export-TH-symbols.patch +0/−25
- standalone/android/haskell-patches/hamlet_export-TH-splice-stuff.patch +0/−28
- standalone/android/haskell-patches/lens_various-hacking-to-cross-build.patch +13/−13
- standalone/android/haskell-patches/primitive_fix-build-with-new-ghc.patch +0/−96
- standalone/android/haskell-patches/shakespeare-js_TH-exports.patch +0/−25
- standalone/android/haskell-patches/stm-chans_cross-build.patch +25/−0
- standalone/android/haskell-patches/unix-time_hack-for-Bionic.patch +37/−6
- standalone/android/haskell-patches/vector_hack-to-build-with-new-ghc.patch +5/−111
- standalone/android/haskell-patches/yesod-core_expand_TH.patch +5/−21
- standalone/android/haskell-patches/yesod-form_spliced-TH.patch +75/−35
- standalone/android/install-haskell-packages +2/−5
- standalone/linux/runshell +0/−3
- standalone/osx/git-annex.app/Contents/MacOS/runshell +0/−3
- templates/configurators/fsck.cassius +4/−0
- templates/configurators/fsck.hamlet +21/−0
- templates/configurators/fsck/form.hamlet +2/−0
- templates/configurators/fsck/formcontent.hamlet +15/−0
- templates/configurators/fsck/status.hamlet +5/−0
- templates/configurators/main.hamlet +8/−0
- templates/control/repairrepository.hamlet +25/−0
- templates/control/repairrepository/done.hamlet +13/−0
@@ -1,3 +1,7 @@+tags+Setup+*.hi+*.o tmp test build-stamp@@ -9,7 +13,10 @@ git-annex git-annex.1 git-annex-shell.1+git-union-merge git-union-merge.1+git-recover-repository+git-recover-repository.1 doc/.ikiwiki html *.tix@@ -22,7 +29,3 @@ # OSX related .DS_Store .virthualenv-tags-Setup-*.hi-*.o
@@ -5,7 +5,7 @@ - Licensed under the GNU GPL version 3 or higher. -} -{-# LANGUAGE GeneralizedNewtypeDeriving, TypeFamilies, MultiParamTypeClasses #-}+{-# LANGUAGE GeneralizedNewtypeDeriving #-} module Annex ( Annex,
@@ -20,6 +20,7 @@ get, change, commit,+ forceCommit, files, withIndex, performTransitions,@@ -136,39 +137,39 @@ {- Even when no refs need to be merged, the index - may still be updated if the branch has gotten ahead - of the index. -}- then whenM (needUpdateIndex branchref) $ lockJournal $ do- forceUpdateIndex branchref+ then whenM (needUpdateIndex branchref) $ lockJournal $ \jl -> do+ forceUpdateIndex jl branchref {- When there are journalled changes - as well as the branch being updated, - a commit needs to be done. -} when dirty $- go branchref True [] []+ go branchref True [] [] jl else lockJournal $ go branchref dirty refs branches return $ not $ null refs where isnewer ignoredrefs (r, _) | S.member r ignoredrefs = return False | otherwise = inRepo $ Git.Branch.changed fullname r- go branchref dirty refs branches = withIndex $ do- cleanjournal <- if dirty then stageJournal else return noop+ go branchref dirty refs branches jl = withIndex $ do+ cleanjournal <- if dirty then stageJournal jl else return noop let merge_desc = if null branches then "update" else "merging " ++ unwords (map Git.Ref.describe branches) ++ " into " ++ show name localtransitions <- parseTransitionsStrictly "local"- <$> getStale transitionsLog+ <$> getLocal transitionsLog unless (null branches) $ do showSideAction merge_desc- mergeIndex refs+ mergeIndex jl refs let commitrefs = nub $ fullname:refs- unlessM (handleTransitions localtransitions commitrefs) $ do+ unlessM (handleTransitions jl localtransitions commitrefs) $ do ff <- if dirty then return False else inRepo $ Git.Branch.fastForward fullname refs if ff- then updateIndex branchref- else commitBranch branchref merge_desc commitrefs+ then updateIndex jl branchref+ else commitIndex jl branchref merge_desc commitrefs liftIO cleanjournal {- Gets the content of a file, which may be in the journal, or in the index@@ -181,21 +182,18 @@ get :: FilePath -> Annex String get file = do update- get' file+ getLocal file {- Like get, but does not merge the branch, so the info returned may not - reflect changes in remotes. - (Changing the value this returns, and then merging is always the - same as using get, and then changing its value.) -}-getStale :: FilePath -> Annex String-getStale = get'--get' :: FilePath -> Annex String-get' file = go =<< getJournalFile file+getLocal :: FilePath -> Annex String+getLocal file = go =<< getJournalFileStale file where go (Just journalcontent) = return journalcontent go Nothing = getRaw file- + getRaw :: FilePath -> Annex String getRaw file = withIndex $ L.unpack <$> catFile fullname file @@ -205,18 +203,23 @@ - modifes the current content of the file on the branch. -} change :: FilePath -> (String -> String) -> Annex ()-change file a = lockJournal $ a <$> getStale file >>= set file+change file a = lockJournal $ \jl -> a <$> getLocal file >>= set jl file {- Records new content of a file into the journal -}-set :: FilePath -> String -> Annex ()+set :: JournalLocked -> FilePath -> String -> Annex () set = setJournalFile {- Stages the journal, and commits staged changes to the branch. -} commit :: String -> Annex ()-commit message = whenM journalDirty $ lockJournal $ do- cleanjournal <- stageJournal+commit = whenM journalDirty . forceCommit++{- Commits the current index to the branch even without any journalleda+ - changes. -}+forceCommit :: String -> Annex ()+forceCommit message = lockJournal $ \jl -> do+ cleanjournal <- stageJournal jl ref <- getBranch- withIndex $ commitBranch ref message [fullname]+ withIndex $ commitIndex jl ref message [fullname] liftIO cleanjournal {- Commits the staged changes in the index to the branch.@@ -237,13 +240,13 @@ - previous point, though getting it a long time ago makes the race - more likely to occur. -}-commitBranch :: Git.Ref -> String -> [Git.Ref] -> Annex ()-commitBranch branchref message parents = do+commitIndex :: JournalLocked -> Git.Ref -> String -> [Git.Ref] -> Annex ()+commitIndex jl branchref message parents = do showStoringStateAction- commitBranch' branchref message parents-commitBranch' :: Git.Ref -> String -> [Git.Ref] -> Annex ()-commitBranch' branchref message parents = do- updateIndex branchref+ commitIndex' jl branchref message parents+commitIndex' :: JournalLocked -> Git.Ref -> String -> [Git.Ref] -> Annex ()+commitIndex' jl branchref message parents = do+ updateIndex jl branchref committedref <- inRepo $ Git.Branch.commit message fullname parents setIndexSha committedref parentrefs <- commitparents <$> catObject committedref@@ -267,8 +270,8 @@ {- To recover from the race, union merge the lost refs - into the index, and recommit on top of the bad commit. -} fixrace committedref lostrefs = do- mergeIndex lostrefs- commitBranch committedref racemessage [committedref]+ mergeIndex jl lostrefs+ commitIndex jl committedref racemessage [committedref] racemessage = message ++ " (recovery from race)" @@ -278,7 +281,7 @@ update (++) <$> branchFiles- <*> getJournalledFiles+ <*> getJournalledFilesStale {- Files in the branch, not including any from journalled changes, - and without updating the branch. -}@@ -300,11 +303,27 @@ {- Merges the specified refs into the index. - Any changes staged in the index will be preserved. -}-mergeIndex :: [Git.Ref] -> Annex ()-mergeIndex branches = do+mergeIndex :: JournalLocked -> [Git.Ref] -> Annex ()+mergeIndex jl branches = do+ prepareModifyIndex jl h <- catFileHandle inRepo $ \g -> Git.UnionMerge.mergeIndex h g branches +{- Removes any stale git lock file, to avoid git falling over when+ - updating the index.+ -+ - Since all modifications of the index are performed inside this module,+ - and only when the journal is locked, the fact that the journal has to be+ - locked when this is called ensures that no other process is currently+ - modifying the index. So any index.lock file must be stale, caused+ - by git running when the system crashed, or the repository's disk was+ - removed, etc.+ -}+prepareModifyIndex :: JournalLocked -> Annex ()+prepareModifyIndex _jl = do+ index <- fromRepo gitAnnexIndex+ void $ liftIO $ tryIO $ removeFile $ index ++ ".lock"+ {- Runs an action using the branch's index file. -} withIndex :: Annex a -> Annex a withIndex = withIndex' False@@ -342,40 +361,48 @@ - Compares the ref stored in the lock file with the current - ref of the branch to see if an update is needed. -}-updateIndex :: Git.Ref -> Annex ()-updateIndex branchref = whenM (needUpdateIndex branchref) $- forceUpdateIndex branchref+updateIndex :: JournalLocked -> Git.Ref -> Annex ()+updateIndex jl branchref = whenM (needUpdateIndex branchref) $+ forceUpdateIndex jl branchref -forceUpdateIndex :: Git.Ref -> Annex ()-forceUpdateIndex branchref = do- withIndex $ mergeIndex [fullname]+forceUpdateIndex :: JournalLocked -> Git.Ref -> Annex ()+forceUpdateIndex jl branchref = do+ withIndex $ mergeIndex jl [fullname] setIndexSha branchref {- Checks if the index needs to be updated. -} needUpdateIndex :: Git.Ref -> Annex Bool needUpdateIndex branchref = do- lock <- fromRepo gitAnnexIndexLock- lockref <- Git.Ref . firstLine <$>- liftIO (catchDefaultIO "" $ readFileStrict lock)- return (lockref /= branchref)+ f <- fromRepo gitAnnexIndexStatus+ committedref <- Git.Ref . firstLine <$>+ liftIO (catchDefaultIO "" $ readFileStrict f)+ return (committedref /= branchref) {- Record that the branch's index has been updated to correspond to a - given ref of the branch. -} setIndexSha :: Git.Ref -> Annex () setIndexSha ref = do- lock <- fromRepo gitAnnexIndexLock- liftIO $ writeFile lock $ show ref ++ "\n"- setAnnexPerm lock+ f <- fromRepo gitAnnexIndexStatus+ liftIO $ writeFile f $ show ref ++ "\n"+ setAnnexPerm f {- Stages the journal into the index and returns an action that will - clean up the staged journal files, which should only be run once- - the index has been committed to the branch. Should be run within- - lockJournal, to prevent others from modifying the journal. -}-stageJournal :: Annex (IO ())-stageJournal = withIndex $ do+ - the index has been committed to the branch.+ -+ - Before staging, this removes any existing git index file lock.+ - This is safe to do because stageJournal is the only thing that+ - modifies this index file, and only one can run at a time, because+ - the journal is locked. So any existing git index file lock must be+ - stale, and the journal must contain any data that was in the process+ - of being written to the index file when it crashed.+ -}+stageJournal :: JournalLocked -> Annex (IO ())+stageJournal jl = withIndex $ do+ prepareModifyIndex jl g <- gitRepo let dir = gitAnnexJournalDir g- fs <- getJournalFiles+ fs <- getJournalFiles jl liftIO $ do h <- hashObjectStart g Git.UpdateIndex.streamUpdateIndex g@@ -405,8 +432,8 @@ - throw away history), so they are added to the list of refs to ignore, - to avoid re-merging content from them again. -}-handleTransitions :: Transitions -> [Git.Ref] -> Annex Bool-handleTransitions localts refs = do+handleTransitions :: JournalLocked -> Transitions -> [Git.Ref] -> Annex Bool+handleTransitions jl localts refs = do m <- M.fromList <$> mapM getreftransition refs let remotets = M.elems m if all (localts ==) remotets@@ -415,7 +442,7 @@ let allts = combineTransitions (localts:remotets) let (transitionedrefs, untransitionedrefs) = partition (\r -> M.lookup r m == Just allts) refs- performTransitions allts (localts /= allts) transitionedrefs+ performTransitionsLocked jl allts (localts /= allts) transitionedrefs ignoreRefs untransitionedrefs return True where@@ -440,14 +467,19 @@ liftIO $ catchDefaultIO "" $ readFile f {- Performs the specified transitions on the contents of the index file,- - commits it to the branch, or creates a new branch. -}+ - commits it to the branch, or creates a new branch.+ -} performTransitions :: Transitions -> Bool -> [Ref] -> Annex ()-performTransitions ts neednewlocalbranch transitionedrefs = do+performTransitions ts neednewlocalbranch transitionedrefs = lockJournal $ \jl ->+ performTransitionsLocked jl ts neednewlocalbranch transitionedrefs+performTransitionsLocked :: JournalLocked -> Transitions -> Bool -> [Ref] -> Annex ()+performTransitionsLocked jl ts neednewlocalbranch transitionedrefs = do -- For simplicity & speed, we're going to use the Annex.Queue to -- update the git-annex branch, while it usually holds changes -- for the head branch. Flush any such changes. Annex.Queue.flush withIndex $ do+ prepareModifyIndex jl run $ mapMaybe getTransitionCalculator $ transitionList ts Annex.Queue.flush if neednewlocalbranch@@ -456,7 +488,7 @@ setIndexSha committedref else do ref <- getBranch- commitBranch ref message (nub $ fullname:transitionedrefs)+ commitIndex jl ref message (nub $ fullname:transitionedrefs) where message | neednewlocalbranch && null transitionedrefs = "new branch for transition " ++ tdesc
@@ -43,7 +43,7 @@ h <- catFileHandle liftIO $ Git.CatFile.catTree h ref -catObjectDetails :: Git.Ref -> Annex (Maybe (L.ByteString, Sha))+catObjectDetails :: Git.Ref -> Annex (Maybe (L.ByteString, Sha, ObjectType)) catObjectDetails ref = do h <- catFileHandle liftIO $ Git.CatFile.catObjectDetails h ref
@@ -30,6 +30,7 @@ freezeContent, thawContent, cleanObjectLoc,+ dirKeys, ) where import System.IO.Unsafe (unsafeInterleaveIO)@@ -522,3 +523,18 @@ go GroupShared = groupWriteRead file go AllShared = groupWriteRead file go _ = allowWrite file++{- Finds files directly inside a directory like gitAnnexBadDir + - (not in subdirectories) and returns the corresponding keys. -}+dirKeys :: (Git.Repo -> FilePath) -> Annex [Key]+dirKeys dirspec = do+ dir <- fromRepo dirspec+ ifM (liftIO $ doesDirectoryExist dir)+ ( do+ contents <- liftIO $ getDirectoryContents dir+ files <- liftIO $ filterM doesFileExist $+ map (dir </>) contents+ return $ mapMaybe (fileKey . takeFileName) files+ , return []+ )+
@@ -101,7 +101,7 @@ else file':files {- Associated files are always stored relative to the top of the repository.- - The input FilePath is relative to the CWD. -}+ - The input FilePath is relative to the CWD, or is absolute. -} normaliseAssociatedFile :: FilePath -> Annex FilePath normaliseAssociatedFile file = do top <- fromRepo Git.repoPath
@@ -13,6 +13,7 @@ import qualified Git.Merge import qualified Git.DiffTree as DiffTree import Git.Sha+import Git.FilePath import Git.Types import Annex.CatFile import qualified Annex.Queue@@ -122,6 +123,8 @@ -} mergeDirect :: FilePath -> Git.Ref -> Git.Repo -> IO Bool mergeDirect d branch g = do+ whenM (doesDirectoryExist d) $+ removeDirectoryRecursive d createDirectoryIfMissing True d let g' = g { location = Local { gitdir = Git.localGitDir g, worktree = Just d } } Git.Merge.mergeNonInteractive branch g'@@ -134,22 +137,22 @@ mergeDirectCleanup :: FilePath -> Git.Ref -> Git.Ref -> Annex () mergeDirectCleanup d oldsha newsha = do (items, cleanup) <- inRepo $ DiffTree.diffTreeRecursive oldsha newsha- forM_ items updated+ makeabs <- flip fromTopFilePath <$> gitRepo+ forM_ items (updated makeabs) void $ liftIO cleanup liftIO $ removeDirectoryRecursive d where- updated item = do+ updated makeabs item = do+ let f = makeabs (DiffTree.file item) void $ tryAnnex $- go DiffTree.srcsha DiffTree.srcmode moveout moveout_raw+ go f DiffTree.srcsha DiffTree.srcmode moveout moveout_raw void $ tryAnnex $ - go DiffTree.dstsha DiffTree.dstmode movein movein_raw+ go f DiffTree.dstsha DiffTree.dstmode movein movein_raw where- go getsha getmode a araw+ go f getsha getmode a araw | getsha item == nullSha = noop- | otherwise =- maybe (araw f) (\k -> void $ a k f)+ | otherwise = maybe (araw f) (\k -> void $ a k f) =<< catKey (getsha item) (getmode item)- f = DiffTree.file item moveout = removeDirect
@@ -1,10 +1,10 @@ {- management of the git-annex journal - - The journal is used to queue up changes before they are committed to the- - git-annex branch. Amoung other things, it ensures that if git-annex is+ - git-annex branch. Among other things, it ensures that if git-annex is - interrupted, its recorded data is not lost. -- - Copyright 2011 Joey Hess <joey@kitenet.net>+ - Copyright 2011-2013 Joey Hess <joey@kitenet.net> - - Licensed under the GNU GPL version 3 or higher. -}@@ -23,9 +23,14 @@ {- Records content for a file in the branch to the journal. - - Using the journal, rather than immediatly staging content to the index- - avoids git needing to rewrite the index after every change. -}-setJournalFile :: FilePath -> String -> Annex ()-setJournalFile file content = do+ - avoids git needing to rewrite the index after every change.+ - + - The file in the journal is updated atomically, which allows+ - getJournalFileStale to always return a consistent journal file+ - content, although possibly not the most current one.+ -}+setJournalFile :: JournalLocked -> FilePath -> String -> Annex ()+setJournalFile _jl file content = do createAnnexDirectory =<< fromRepo gitAnnexJournalDir createAnnexDirectory =<< fromRepo gitAnnexTmpDir -- journal file is written atomically@@ -37,17 +42,32 @@ moveFile tmpfile jfile {- Gets any journalled content for a file in the branch. -}-getJournalFile :: FilePath -> Annex (Maybe String)-getJournalFile file = inRepo $ \g -> catchMaybeIO $+getJournalFile :: JournalLocked -> FilePath -> Annex (Maybe String)+getJournalFile _jl = getJournalFileStale++{- Without locking, this is not guaranteed to be the most recent+ - version of the file in the journal, so should not be used as a basis for+ - changes. -}+getJournalFileStale :: FilePath -> Annex (Maybe String)+getJournalFileStale file = inRepo $ \g -> catchMaybeIO $ readFileStrict $ journalFile file g {- List of files that have updated content in the journal. -}-getJournalledFiles :: Annex [FilePath]-getJournalledFiles = map fileJournal <$> getJournalFiles+getJournalledFiles :: JournalLocked -> Annex [FilePath]+getJournalledFiles jl = map fileJournal <$> getJournalFiles jl +getJournalledFilesStale :: Annex [FilePath]+getJournalledFilesStale = map fileJournal <$> getJournalFilesStale+ {- List of existing journal files. -}-getJournalFiles :: Annex [FilePath]-getJournalFiles = do+getJournalFiles :: JournalLocked -> Annex [FilePath]+getJournalFiles _jl = getJournalFilesStale++{- List of existing journal files, but without locking, may miss new ones+ - just being added, or may have false positives if the journal is staged+ - as it is run. -}+getJournalFilesStale :: Annex [FilePath]+getJournalFilesStale = do g <- gitRepo fs <- liftIO $ catchDefaultIO [] $ getDirectoryContents $ gitAnnexJournalDir g@@ -55,7 +75,7 @@ {- Checks if there are changes in the journal. -} journalDirty :: Annex Bool-journalDirty = not . null <$> getJournalFiles+journalDirty = not . null <$> getJournalFilesStale {- Produces a filename to use in the journal for a file on the branch. -@@ -77,14 +97,19 @@ fileJournal = replace [pathSeparator, pathSeparator] "_" . replace "_" [pathSeparator] +{- Sentinal value, only produced by lockJournal; required+ - as a parameter by things that need to ensure the journal is+ - locked. -}+data JournalLocked = ProduceJournalLocked+ {- Runs an action that modifies the journal, using locking to avoid - contention with other git-annex processes. -}-lockJournal :: Annex a -> Annex a+lockJournal :: (JournalLocked -> Annex a) -> Annex a lockJournal a = do lockfile <- fromRepo gitAnnexJournalLock createAnnexDirectory $ takeDirectory lockfile mode <- annexFileMode- bracketIO (lock lockfile mode) unlock (const a)+ bracketIO (lock lockfile mode) unlock (const $ a ProduceJournalLocked) where #ifndef mingw32_HOST_OS lock lockfile mode = do@@ -101,4 +126,3 @@ #else unlock = removeFile #endif-
@@ -16,6 +16,7 @@ import qualified Data.Map as M import Data.Hash.MD5+import System.Process (cwd) import Common.Annex import Annex.LockPool@@ -52,15 +53,31 @@ where go Nothing = return (Nothing, []) go (Just dir) = do- let socketfile = dir </> hostport2socket host port- if valid_unix_socket_path socketfile- then return (Just socketfile, sshConnectionCachingParams socketfile)- else do- socketfile' <- liftIO $ relPathCwdToFile socketfile- return $ if valid_unix_socket_path socketfile'- then (Just socketfile', sshConnectionCachingParams socketfile')- else (Nothing, [])+ r <- liftIO $ bestSocketPath $ dir </> hostport2socket host port+ return $ case r of+ Nothing -> (Nothing, [])+ Just socketfile -> (Just socketfile, sshConnectionCachingParams socketfile) +{- Given an absolute path to use for a socket file,+ - returns whichever is shorter of that or the relative path to the same+ - file.+ -+ - If no path can be constructed that is a valid socket, returns Nothing. -}+bestSocketPath :: FilePath -> IO (Maybe FilePath)+bestSocketPath abssocketfile = do+ relsocketfile <- liftIO $ relPathCwdToFile abssocketfile+ let socketfile = if length abssocketfile <= length relsocketfile+ then abssocketfile+ else relsocketfile+ return $ if valid_unix_socket_path (socketfile ++ sshgarbage)+ then Just socketfile+ else Nothing+ where+ -- ssh appends a 16 char extension to the socket when setting it+ -- up, which needs to be taken into account when checking+ -- that a valid socket was constructed.+ sshgarbage = take (1+16) $ repeat 'X'+ sshConnectionCachingParams :: FilePath -> [CommandParam] sshConnectionCachingParams socketfile = [ Param "-S", Param socketfile@@ -96,8 +113,8 @@ where go Nothing = noop go (Just dir) = do- sockets <- filter (not . isLock) <$>- liftIO (catchDefaultIO [] $ dirContents dir)+ sockets <- liftIO $ filter (not . isLock)+ <$> catchDefaultIO [] (dirContents dir) forM_ sockets cleanup cleanup socketfile = do #ifndef mingw32_HOST_OS@@ -120,13 +137,15 @@ stopssh socketfile #endif stopssh socketfile = do- let params = sshConnectionCachingParams socketfile+ let (dir, base) = splitFileName socketfile+ let params = sshConnectionCachingParams base -- "ssh -O stop" is noisy on stderr even with -q void $ liftIO $ catchMaybeIO $ withQuietOutput createProcessSuccess $- proc "ssh" $ toCommand $+ (proc "ssh" $ toCommand $ [ Params "-O stop"- ] ++ params ++ [Param "any"]+ ] ++ params ++ [Param "any"])+ { cwd = Just dir } -- Cannot remove the lock file; other processes may -- be waiting on our exclusive lock to use it. @@ -139,8 +158,10 @@ hostport2socket host (Just port) = hostport2socket' $ host ++ "!" ++ show port hostport2socket' :: String -> FilePath hostport2socket' s- | length s > 32 = md5s (Str s)+ | length s > lengthofmd5s = md5s (Str s) | otherwise = s+ where+ lengthofmd5s = 32 socket2lock :: FilePath -> FilePath socket2lock socket = socket ++ lockExt
@@ -22,6 +22,7 @@ import Assistant.Threads.TransferWatcher import Assistant.Threads.Transferrer import Assistant.Threads.SanityChecker+import Assistant.Threads.Cronner #ifdef WITH_CLIBS import Assistant.Threads.MountWatcher #endif@@ -133,9 +134,13 @@ , assist $ netWatcherThread , assist $ netWatcherFallbackThread , assist $ transferScannerThread urlrenderer+ , assist $ cronnerThread urlrenderer , assist $ configMonitorThread , assist $ glacierThread , watch $ watchThread+ -- must come last so that all threads that wait+ -- on it have already started waiting+ , watch $ sanityCheckerStartupThread ] liftIO waitForTermination
@@ -15,6 +15,7 @@ import qualified Remote import Utility.Tense import Logs.Transfer+import Git.Remote (RemoteName) import Data.String import qualified Data.Text as T@@ -27,17 +28,19 @@ import Yesod #endif -{- Makes a button for an alert that opens a Route. The button will- - close the alert it's attached to when clicked. -}+{- Makes a button for an alert that opens a Route. + -+ - If autoclose is set, the button will close the alert it's+ - attached to when clicked. -} #ifdef WITH_WEBAPP-mkAlertButton :: T.Text -> UrlRenderer -> Route WebApp -> Assistant AlertButton-mkAlertButton label urlrenderer route = do+mkAlertButton :: Bool -> T.Text -> UrlRenderer -> Route WebApp -> Assistant AlertButton+mkAlertButton autoclose label urlrenderer route = do close <- asIO1 removeAlert url <- liftIO $ renderUrl urlrenderer route [] return $ AlertButton { buttonLabel = label , buttonUrl = url- , buttonAction = Just close+ , buttonAction = if autoclose then Just close else Nothing } #endif @@ -76,6 +79,22 @@ , alertButton = Nothing } +errorAlert :: String -> AlertButton -> Alert+errorAlert msg button = Alert+ { alertClass = Error+ , alertHeader = Nothing+ , alertMessageRender = renderData+ , alertData = [UnTensed $ T.pack msg]+ , alertCounter = 0+ , alertBlockDisplay = True+ , alertClosable = True+ , alertPriority = Pinned+ , alertIcon = Just ErrorIcon+ , alertCombiner = Nothing+ , alertName = Nothing+ , alertButton = Just button+ }+ activityAlert :: Maybe TenseText -> [TenseChunk] -> Alert activityAlert header dat = baseActivityAlert { alertHeader = header@@ -146,6 +165,17 @@ render alert = tenseWords $ alerthead : alertData alert ++ [alertfoot] alerthead = "The daily sanity check found and fixed a problem:" alertfoot = "If these problems persist, consider filing a bug report."++fsckAlert :: AlertButton -> Maybe RemoteName -> Alert+fsckAlert button n = baseActivityAlert+ { alertData = case n of+ Nothing -> [ UnTensed $ T.pack $ "Consistency check in progress" ]+ Just remotename -> [ UnTensed $ T.pack $ "Consistency check of " ++ remotename ++ " in progress"]+ , alertButton = Just button+ }++brokenRepositoryAlert :: AlertButton -> Alert+brokenRepositoryAlert = errorAlert "Serious problems have been detected with your repository. This needs your immediate attention!" pairingAlert :: AlertButton -> Alert pairingAlert button = baseActivityAlert
@@ -76,6 +76,10 @@ M.filter $ \alert -> alertName alert /= Just CloudRepoNeededAlert +updateScheduleLog :: Assistant ()+updateScheduleLog =+ liftIO . sendNotification =<< scheduleLogNotifier <$> getDaemonStatus+ {- Load any previous daemon status file, and store it in a MVar for this - process to use as its DaemonStatus. Also gets current transfer status. -} startDaemonStatus :: Annex DaemonStatusHandle
@@ -81,7 +81,7 @@ #ifdef WITH_WEBAPP finishRemovingRemote urlrenderer uuid = do desc <- liftAnnex $ Remote.prettyUUID uuid- button <- mkAlertButton (T.pack "Finish deletion process") urlrenderer $+ button <- mkAlertButton True (T.pack "Finish deletion process") urlrenderer $ FinishDeleteRepositoryR uuid void $ addAlert $ remoteRemovalAlert desc button #else
@@ -16,6 +16,7 @@ import Assistant.Types.UrlRenderer import Assistant.DaemonStatus import Assistant.Monad+import Utility.NotificationBroadcaster import Control.Concurrent import Control.Concurrent.Async@@ -34,7 +35,7 @@ - Named threads are run by a management thread, so if they crash - an alert is displayed, allowing the thread to be restarted. -} startNamedThread :: UrlRenderer -> NamedThread -> Assistant ()-startNamedThread urlrenderer namedthread@(NamedThread name a) = do+startNamedThread urlrenderer (NamedThread afterstartupsanitycheck name a) = do m <- startedThreads <$> getDaemonStatus case M.lookup name m of Nothing -> start@@ -44,14 +45,24 @@ Right Nothing -> noop _ -> start where- start = do+ start+ | afterstartupsanitycheck = do+ status <- getDaemonStatus+ h <- liftIO $ newNotificationHandle False $+ startupSanityCheckNotifier status+ startwith $ runmanaged $+ liftIO $ waitNotification h+ | otherwise = startwith $ runmanaged noop+ startwith runner = do d <- getAssistant id- aid <- liftIO $ runmanaged $ d { threadName = name }- restart <- asIO $ startNamedThread urlrenderer namedthread+ aid <- liftIO $ runner $ d { threadName = name }+ restart <- asIO $ startNamedThread urlrenderer (NamedThread False name a) modifyDaemonStatus_ $ \s -> s { startedThreads = M.insertWith' const name (aid, restart) (startedThreads s) }- runmanaged d = do- aid <- async $ runAssistant d a+ runmanaged first d = do+ aid <- async $ runAssistant d $ do+ void first+ a void $ forkIO $ manager d aid return aid manager d aid = do@@ -65,7 +76,7 @@ ] hPutStrLn stderr msg #ifdef WITH_WEBAPP- button <- runAssistant d $ mkAlertButton+ button <- runAssistant d $ mkAlertButton True (T.pack "Restart Thread") urlrenderer (RestartThreadR name)@@ -75,7 +86,7 @@ #endif namedThreadId :: NamedThread -> Assistant (Maybe ThreadId)-namedThreadId (NamedThread name _) = do+namedThreadId (NamedThread _ name _) = do m <- startedThreads <$> getDaemonStatus return $ asyncThreadId . fst <$> M.lookup name m
@@ -44,13 +44,19 @@ - they push to us. Since XMPP pushes run ansynchronously, any scan of the - XMPP remotes has to be deferred until they're done pushing to us, so - all XMPP remotes are marked as possibly desynced.+ -+ - Also handles signaling any connectRemoteNotifiers, after the syncing is+ - done. -} reconnectRemotes :: Bool -> [Remote] -> Assistant () reconnectRemotes _ [] = noop reconnectRemotes notifypushes rs = void $ do- modifyDaemonStatus_ $ \s -> s- { desynced = S.union (S.fromList $ map Remote.uuid xmppremotes) (desynced s) }- syncAction rs (const go)+ rs' <- filterM (checkavailable . Remote.repo) rs+ unless (null rs') $ do+ modifyDaemonStatus_ $ \s -> s+ { desynced = S.union (S.fromList $ map Remote.uuid xmppremotes) (desynced s) }+ failedrs <- syncAction rs' (const go)+ mapM_ signal $ filter (`notElem` failedrs) rs' where gitremotes = filter (notspecialremote . Remote.repo) rs (xmppremotes, nonxmppremotes) = partition isXMPPRemote rs@@ -73,6 +79,13 @@ filter (not . remoteAnnexIgnore . Remote.gitconfig) nonxmppremotes return failed+ signal r = liftIO . mapM_ (flip tryPutMVar ())+ =<< fromMaybe [] . M.lookup (Remote.uuid r) . connectRemoteNotifiers+ <$> getDaemonStatus+ checkavailable r+ | Git.repoIsLocal r || Git.repoIsLocalUnknown r =+ liftIO $ doesDirectoryExist $ Git.repoPath r+ | otherwise = return True {- Updates the local sync branch, then pushes it to all remotes, in - parallel, along with the git-annex branch. This is the same
@@ -112,7 +112,7 @@ - that make up a file rename? Or some of the pairs that make up - a directory rename? -}- possiblyrename cs = all renamepart cs+ possiblyrename = all renamepart renamepart (PendingAddChange _ _) = True renamepart c = isRmChange c@@ -309,7 +309,7 @@ inRepo (Git.LsFiles.notInRepo False $ map changeFile pending) -- note: timestamp info is lost here let ts = changeTime exemplar- return (map (PendingAddChange ts) newfiles, void $ liftIO $ cleanup)+ return (map (PendingAddChange ts) newfiles, void $ liftIO cleanup) returnWhen c a | c = return otherchanges@@ -317,12 +317,13 @@ add :: Change -> Assistant (Maybe Change) add change@(InProcessAddChange { keySource = ks }) = - catchDefaultIO Nothing <~> do- sanitycheck ks $ do- (mkey, mcache) <- liftAnnex $ do- showStart "add" $ keyFilename ks- Command.Add.ingest $ Just ks- maybe (failedingest change) (done change mcache $ keyFilename ks) mkey+ catchDefaultIO Nothing <~> doadd+ where+ doadd = sanitycheck ks $ do+ (mkey, mcache) <- liftAnnex $ do+ showStart "add" $ keyFilename ks+ Command.Add.ingest $ Just ks+ maybe (failedingest change) (done change mcache $ keyFilename ks) mkey add _ = return Nothing {- In direct mode, avoid overhead of re-injesting a renamed@@ -371,7 +372,7 @@ ( inRepo $ gitAnnexLink file key , Command.Add.link file key mcache )- whenM (pure DirWatcher.eventsCoalesce <||> isDirect) $ do+ whenM (pure DirWatcher.eventsCoalesce <||> isDirect) $ stageSymlink file =<< hashSymlink link showEndOk return $ Just $ finishedChange change key@@ -415,8 +416,8 @@ safeToAdd delayadd pending inprocess = do maybe noop (liftIO . threadDelaySeconds) delayadd liftAnnex $ do- keysources <- mapM Command.Add.lockDown (map changeFile pending)- let inprocess' = inprocess ++ catMaybes (map mkinprocess $ zip pending keysources)+ keysources <- forM pending $ Command.Add.lockDown . changeFile+ let inprocess' = inprocess ++ mapMaybe mkinprocess (zip pending keysources) openfiles <- S.fromList . map fst3 . filter openwrite <$> findopenfiles (map keySource inprocess') let checked = map (check openfiles) inprocess'@@ -434,7 +435,7 @@ | S.member (contentLocation ks) openfiles = Left change check _ change = Right change - mkinprocess (c, Just ks) = Just $ InProcessAddChange+ mkinprocess (c, Just ks) = Just InProcessAddChange { changeTime = changeTime c , keySource = ks }
@@ -12,13 +12,14 @@ import Assistant.DaemonStatus import Assistant.Commits import Utility.ThreadScheduler+import Logs import Logs.UUID import Logs.Trust-import Logs.Remote import Logs.PreferredContent import Logs.Group import Remote.List (remoteListRefresh) import qualified Git.LsTree as LsTree+import Git.FilePath import qualified Annex.Branch import qualified Data.Set as S@@ -52,12 +53,13 @@ type Configs = S.Set (FilePath, String) {- All git-annex's config files, and actions to run when they change. -}-configFilesActions :: [(FilePath, Annex ())]+configFilesActions :: [(FilePath, Assistant ())] configFilesActions =- [ (uuidLog, void $ uuidMapLoad)- , (remoteLog, void remoteListRefresh)- , (trustLog, void trustMapLoad)- , (groupLog, void groupMapLoad)+ [ (uuidLog, void $ liftAnnex uuidMapLoad)+ , (remoteLog, void $ liftAnnex remoteListRefresh)+ , (trustLog, void $ liftAnnex trustMapLoad)+ , (groupLog, void $ liftAnnex groupMapLoad)+ , (scheduleLog, void updateScheduleLog) -- Preferred content settings depend on most of the other configs, -- so will be reloaded whenever any configs change. , (preferredContentLog, noop)@@ -65,13 +67,12 @@ reloadConfigs :: Configs -> Assistant () reloadConfigs changedconfigs = do- liftAnnex $ do- sequence_ as- void preferredContentMapLoad+ sequence_ as+ void $ liftAnnex preferredContentMapLoad {- Changes to the remote log, or the trust log, can affect the - syncRemotes list. Changes to the uuid log may affect its - display so are also included. -}- when (any (`elem` fs) [remoteLog, trustLog, uuidLog]) $+ when (any (`elem` fs) [remoteLog, trustLog, uuidLog]) updateSyncRemotes where (fs, as) = unzip $ filter (flip S.member changedfiles . fst)@@ -83,4 +84,4 @@ <$> liftAnnex (inRepo $ LsTree.lsTreeFiles Annex.Branch.fullname files) where files = map fst configFilesActions- extract treeitem = (LsTree.file treeitem, LsTree.sha treeitem)+ extract treeitem = (getTopFilePath $ LsTree.file treeitem, LsTree.sha treeitem)
@@ -0,0 +1,236 @@+{- git-annex assistant sceduled jobs runner+ -+ - Copyright 2013 Joey Hess <joey@kitenet.net>+ -+ - Licensed under the GNU GPL version 3 or higher.+ -}++{-# LANGUAGE DeriveDataTypeable, CPP #-}++module Assistant.Threads.Cronner (+ cronnerThread+) where++import Assistant.Common+import Assistant.DaemonStatus+import Utility.NotificationBroadcaster+import Annex.UUID+import Config.Files+import Logs.Schedule+import Utility.Scheduled+import Types.ScheduledActivity+import Utility.ThreadScheduler+import Utility.HumanTime+import Utility.Batch+import Assistant.TransferQueue+import Annex.Content+import Logs.Transfer+import Assistant.Types.UrlRenderer+import Assistant.Alert+import Remote+#ifdef WITH_WEBAPP+import Assistant.WebApp.Types+#endif+import Git.Remote (RemoteName)+import qualified Git.Fsck+import Logs.FsckResults++import Control.Concurrent.Async+import Control.Concurrent.MVar+import Data.Time.LocalTime+import Data.Time.Clock+import qualified Data.Map as M+import qualified Data.Set as S+import qualified Control.Exception as E+import qualified Data.Text as T++{- Loads schedules for this repository, and fires off one thread for each + - scheduled event that runs on this repository. Each thread sleeps until+ - its event is scheduled to run.+ -+ - To handle events that run on remotes, which need to only run when+ - their remote gets connected, threads are also started, and are passed+ - a MVar to wait on, which is stored in the DaemonStatus's+ - connectRemoteNotifiers.+ -+ - In the meantime the main thread waits for any changes to the+ - schedules. When there's a change, compare the old and new list of+ - schedules to find deleted and added ones. Start new threads for added+ - ones, and kill the threads for deleted ones. -}+cronnerThread :: UrlRenderer -> NamedThread+cronnerThread urlrenderer = namedThreadUnchecked "Cronner" $ do+ dstatus <- getDaemonStatus+ h <- liftIO $ newNotificationHandle False (scheduleLogNotifier dstatus)+ go h M.empty M.empty+ where+ go h amap nmap = do+ activities <- liftAnnex $ scheduleGet =<< getUUID++ let addedactivities = activities `S.difference` M.keysSet amap+ let removedactivities = M.keysSet amap `S.difference` activities++ forM_ (S.toList removedactivities) $ \activity ->+ case M.lookup activity amap of+ Just a -> do+ debug ["stopping removed job for", fromScheduledActivity activity, show (asyncThreadId a)]+ liftIO $ cancel a+ Nothing -> noop++ lastruntimes <- liftAnnex getLastRunTimes+ started <- startactivities (S.toList addedactivities) lastruntimes+ let addedamap = M.fromList $ map fst started+ let addednmap = M.fromList $ catMaybes $ map snd started++ let removefiltered = M.filterWithKey (\k _ -> S.member k removedactivities)+ let amap' = M.difference (M.union addedamap amap) (removefiltered amap)+ let nmap' = M.difference (M.union addednmap nmap) (removefiltered nmap)+ modifyDaemonStatus_ $ \s -> s { connectRemoteNotifiers = M.fromListWith (++) (M.elems nmap') }++ liftIO $ waitNotification h+ debug ["reloading changed activities"]+ go h amap' nmap'+ startactivities as lastruntimes = forM as $ \activity ->+ case connectActivityUUID activity of+ Nothing -> do+ runner <- asIO2 (sleepingActivityThread urlrenderer)+ a <- liftIO $ async $+ runner activity (M.lookup activity lastruntimes)+ return ((activity, a), Nothing)+ Just u -> do+ mvar <- liftIO newEmptyMVar+ runner <- asIO2 (remoteActivityThread urlrenderer mvar)+ a <- liftIO $ async $+ runner activity (M.lookup activity lastruntimes)+ return ((activity, a), Just (activity, (u, [mvar])))++{- Calculate the next time the activity is scheduled to run, then+ - sleep until that time, and run it. Then call setLastRunTime, and+ - loop.+ -}+sleepingActivityThread :: UrlRenderer -> ScheduledActivity -> Maybe LocalTime -> Assistant ()+sleepingActivityThread urlrenderer activity lasttime = go lasttime =<< getnexttime lasttime+ where+ getnexttime = liftIO . nextTime schedule+ go _ Nothing = debug ["no scheduled events left for", desc]+ go l (Just (NextTimeExactly t)) = waitrun l t Nothing+ go l (Just (NextTimeWindow windowstart windowend)) =+ waitrun l windowstart (Just windowend)+ desc = fromScheduledActivity activity+ schedule = getSchedule activity+ waitrun l t mmaxt = do+ seconds <- liftIO $ secondsUntilLocalTime t+ when (seconds > Seconds 0) $ do+ debug ["waiting", show seconds, "for next scheduled", desc]+ liftIO $ threadDelaySeconds seconds+ now <- liftIO getCurrentTime+ tz <- liftIO $ getTimeZone now+ let nowt = utcToLocalTime tz now+ if tolate nowt tz+ then do+ debug ["too late to run scheduled", desc]+ go l =<< getnexttime l+ else run nowt+ where+ tolate nowt tz = case mmaxt of+ Just maxt -> nowt > maxt+ -- allow the job to start 10 minutes late+ Nothing ->diffUTCTime + (localTimeToUTC tz nowt)+ (localTimeToUTC tz t) > 600+ run nowt = do+ runActivity urlrenderer activity nowt+ go (Just nowt) =<< getnexttime (Just nowt)++{- Wait for the remote to become available by waiting on the MVar.+ - Then check if the time is within a time window when activity+ - is scheduled to run, and if so run it.+ - Otherwise, just wait again on the MVar.+ -}+remoteActivityThread :: UrlRenderer -> MVar () -> ScheduledActivity -> Maybe LocalTime -> Assistant ()+remoteActivityThread urlrenderer mvar activity lasttime = do+ liftIO $ takeMVar mvar+ go =<< liftIO (nextTime (getSchedule activity) lasttime)+ where+ go (Just (NextTimeWindow windowstart windowend)) = do+ now <- liftIO getCurrentTime+ tz <- liftIO $ getTimeZone now+ if now >= localTimeToUTC tz windowstart && now <= localTimeToUTC tz windowend+ then do+ let nowt = utcToLocalTime tz now+ runActivity urlrenderer activity nowt+ loop (Just nowt)+ else loop lasttime+ go _ = noop -- running at exact time not handled here+ loop = remoteActivityThread urlrenderer mvar activity++secondsUntilLocalTime :: LocalTime -> IO Seconds+secondsUntilLocalTime t = do+ now <- getCurrentTime+ tz <- getTimeZone now+ let secs = truncate $ diffUTCTime (localTimeToUTC tz t) now+ return $ if secs > 0+ then Seconds secs+ else Seconds 0++runActivity :: UrlRenderer -> ScheduledActivity -> LocalTime -> Assistant ()+runActivity urlrenderer activity nowt = do+ debug ["starting", desc]+ runActivity' urlrenderer activity+ debug ["finished", desc]+ liftAnnex $ setLastRunTime activity nowt+ where+ desc = fromScheduledActivity activity++runActivity' :: UrlRenderer -> ScheduledActivity -> Assistant ()+runActivity' urlrenderer (ScheduledSelfFsck _ d) = do+ program <- liftIO $ readProgramFile+ g <- liftAnnex gitRepo+ fsckresults <- showFscking urlrenderer Nothing $ tryNonAsync $ do+ r <- Git.Fsck.findBroken True g+ void $ batchCommand program (Param "fsck" : annexFsckParams d)+ return r+ when (Git.Fsck.foundBroken fsckresults) $ do+ u <- liftAnnex getUUID+ liftAnnex $ writeFsckResults u fsckresults+ button <- mkAlertButton True (T.pack "Click Here") urlrenderer $+ RepairRepositoryR u+ void $ addAlert $ brokenRepositoryAlert button+ mapM_ reget =<< liftAnnex (dirKeys gitAnnexBadDir)+ where+ reget k = queueTransfers "fsck found bad file; redownloading" Next k Nothing Download+runActivity' urlrenderer (ScheduledRemoteFsck u s d) = go =<< liftAnnex (remoteFromUUID u)+ where+ go (Just r) = void $ case Remote.remoteFsck r of+ Nothing -> void $ showFscking urlrenderer (Just $ Remote.name r) $ tryNonAsync $ do+ program <- readProgramFile+ batchCommand program $ + [ Param "fsck"+ -- avoid downloading files+ , Param "--fast"+ , Param "--from"+ , Param $ Remote.name r+ ] ++ annexFsckParams d+ Just mkfscker ->+ {- Note that having mkfsker return an IO action+ - avoids running a long duration fsck in the+ - Annex monad. -}+ void . showFscking urlrenderer (Just $ Remote.name r) . tryNonAsync+ =<< liftAnnex (mkfscker (annexFsckParams d))+ go Nothing = debug ["skipping remote fsck of uuid without a configured remote", fromUUID u, fromSchedule s]++showFscking :: UrlRenderer -> Maybe RemoteName -> IO (Either E.SomeException a) -> Assistant a+showFscking urlrenderer remotename a = do+#ifdef WITH_WEBAPP+ button <- mkAlertButton False (T.pack "Configure") urlrenderer ConfigFsckR+ r <- alertDuring (fsckAlert button remotename) $+ liftIO a+ either (liftIO . E.throwIO) return r+#else+ a+#endif++annexFsckParams :: Duration -> [CommandParam]+annexFsckParams d =+ [ Param "--incremental-schedule=1d"+ , Param $ "--time-limit=" ++ fromDuration d+ ]
@@ -30,7 +30,7 @@ go = do rs <- filter isglacier . syncDataRemotes <$> getDaemonStatus forM_ rs $ \r -> - check r =<< (liftAnnex $ getFailedTransfers $ Remote.uuid r)+ check r =<< liftAnnex (getFailedTransfers $ Remote.uuid r) check _ [] = noop check r l = do let keys = map getkey l
@@ -54,7 +54,7 @@ {- Called when there's an error with inotify. -} onErr :: Handler-onErr msg = error msg+onErr = error {- Called when a new branch ref is written, or a branch ref is modified. -@@ -110,7 +110,7 @@ isAnnexBranch :: FilePath -> Bool isAnnexBranch f = n `isSuffixOf` f where- n = "/" ++ show Annex.Branch.name+ n = '/' : show Annex.Branch.name fileToBranch :: FilePath -> Git.Ref fileToBranch f = Git.Ref $ "refs" </> base
@@ -34,7 +34,7 @@ #endif mountWatcherThread :: NamedThread-mountWatcherThread = namedThread "MountWatcher" $+mountWatcherThread = namedThread "MountWatcher" #if WITH_DBUS dbusThread #else@@ -173,10 +173,10 @@ rs <- liftAnnex remoteList pairs <- liftAnnex $ mapM (checkremote repotop) rs let (waschanged, rs') = unzip pairs- when (any id waschanged) $ do+ when (or waschanged) $ do liftAnnex $ Annex.changeState $ \s -> s { Annex.remotes = catMaybes rs' } updateSyncRemotes- return $ catMaybes $ map snd $ filter fst pairs+ return $ mapMaybe snd $ filter fst pairs where checkremote repotop r = case Remote.localpath r of Just p | dirContains dir (absPathFrom repotop p) ->
@@ -102,7 +102,7 @@ pairReqReceived :: Bool -> UrlRenderer -> PairMsg -> Assistant () pairReqReceived True _ _ = noop -- ignore our own PairReq pairReqReceived False urlrenderer msg = do- button <- mkAlertButton (T.pack "Respond") urlrenderer (FinishLocalPairR msg)+ button <- mkAlertButton True (T.pack "Respond") urlrenderer (FinishLocalPairR msg) void $ addAlert $ pairRequestReceivedAlert repo button where repo = pairRepo msg
@@ -1,11 +1,12 @@ {- git-annex assistant sanity checker -- - Copyright 2012 Joey Hess <joey@kitenet.net>+ - Copyright 2012, 2013 Joey Hess <joey@kitenet.net> - - Licensed under the GNU GPL version 3 or higher. -} module Assistant.Threads.SanityChecker (+ sanityCheckerStartupThread, sanityCheckerDailyThread, sanityCheckerHourlyThread ) where@@ -20,10 +21,20 @@ import qualified Assistant.Threads.Watcher as Watcher import Utility.LogFile import Utility.Batch+import Utility.NotificationBroadcaster import Config+import qualified Git+import qualified Utility.Lsof as Lsof import Data.Time.Clock.POSIX +{- This thread runs once at startup, and most other threads wait for it+ - to finish. (However, the webapp thread does not, to prevent the UI+ - being nonresponsive.) -}+sanityCheckerStartupThread :: NamedThread+sanityCheckerStartupThread = namedThreadUnchecked "SanityCheckerStartup" $+ startupCheck+ {- This thread wakes up hourly for inxepensive frequent sanity checks. -} sanityCheckerHourlyThread :: NamedThread sanityCheckerHourlyThread = namedThread "SanityCheckerHourly" $ forever $ do@@ -42,7 +53,7 @@ go = do modifyDaemonStatus_ $ \s -> s { sanityCheckRunning = True } - now <- liftIO $ getPOSIXTime -- before check started+ now <- liftIO getPOSIXTime -- before check started r <- either showerr return =<< (tryIO . batch) <~> dailyCheck modifyDaemonStatus_ $ \s -> s@@ -69,6 +80,14 @@ oneDay - truncate (now - lastcheck) | otherwise = oneDay +startupCheck :: Assistant ()+startupCheck = do+ checkStaleGitLocks++ {- Notify other threads that the startup sanity check is done. -}+ status <- getDaemonStatus+ liftIO $ sendNotification $ startupSanityCheckNotifier status+ {- It's important to stay out of the Annex monad as much as possible while - running potentially expensive parts of this check, since remaining in it - will block the watcher. -}@@ -78,7 +97,7 @@ -- Find old unstaged symlinks, and add them to git. (unstaged, cleanup) <- liftIO $ Git.LsFiles.notInRepo False ["."] g- now <- liftIO $ getPOSIXTime+ now <- liftIO getPOSIXTime forM_ unstaged $ \file -> do ms <- liftIO $ catchMaybeIO $ getSymbolicLinkStatus file case ms of@@ -128,6 +147,46 @@ where filesize f = fromIntegral . fileSize <$> liftIO (getFileStatus f) +{- Detect when a git lock file exists and has no git process currently+ - writing to it. This strongly suggests it is a stale lock file.+ -+ - However, this could be on a network filesystem. Which is not very safe+ - anyway (the assistant relies on being able to check when files have+ - no writers to know when to commit them). Just in case, when the lock+ - file appears stale, we delay for one minute, and check its size. If+ - the size changed, delay for another minute, and so on. This will at+ - least work to detect is another machine is writing out a new index+ - file, since git does so by writing the new content to index.lock.+ -}+checkStaleGitLocks :: Assistant ()+checkStaleGitLocks = do+ lockfiles <- filter (not . isInfixOf "gc.pid") + . filter (".lock" `isSuffixOf`)+ <$> (liftIO . dirContentsRecursiveSkipping (== dropTrailingPathSeparator annexDir)+ =<< liftAnnex (fromRepo Git.localGitDir))+ checkStaleLocks lockfiles+checkStaleLocks :: [FilePath] -> Assistant ()+checkStaleLocks lockfiles = go =<< getsizes+ where+ getsize lf = catchMaybeIO $ + (\s -> (lf, fileSize s)) <$> getFileStatus lf+ getsizes = liftIO $ catMaybes <$> mapM getsize lockfiles+ go [] = return ()+ go l = ifM (liftIO $ null <$> Lsof.query ("--" : map fst l))+ ( do+ waitforit "to check stale git lock file"+ l' <- getsizes+ if l' == l+ then liftIO $ mapM_ nukeFile (map fst l)+ else go l'+ , do+ waitforit "for git lock file writer"+ go =<< getsizes+ )+ waitforit why = do+ notice ["Waiting for 60 seconds", why]+ liftIO $ threadDelaySeconds $ Seconds 60+ oneMegabyte :: Int oneMegabyte = 1000000 @@ -136,3 +195,4 @@ oneDay :: Int oneDay = 24 * oneHour+
@@ -85,13 +85,13 @@ mapM_ retry failed where retry (t, info)- | transferDirection t == Download = do+ | transferDirection t == Download = {- Check if the remote still has the key. - If not, relies on the expensiveScan to - get it queued from some other remote. -} whenM (liftAnnex $ remoteHas r $ transferKey t) $ requeue t info- | otherwise = do+ | otherwise = {- The Transferrer checks when uploading - that the remote doesn't already have the - key, so it's not redundantly checked here. -}@@ -161,7 +161,7 @@ present key (Just f) Nothing liftAnnex $ do let slocs = S.fromList locs- let use a = return $ catMaybes $ map (a key slocs) syncrs+ let use a = return $ mapMaybe (a key slocs) syncrs ts <- if present then filterM (wantSend True (Just f) . Remote.uuid . fst) =<< use (genTransfer Upload False)@@ -173,7 +173,7 @@ genTransfer :: Direction -> Bool -> Key -> S.Set UUID -> Remote -> Maybe (Remote, Transfer) genTransfer direction want key slocs r | direction == Upload && Remote.readonly r = Nothing- | (S.member (Remote.uuid r) slocs) == want = Just+ | S.member (Remote.uuid r) slocs == want = Just (r, Transfer direction (Remote.uuid r) key) | otherwise = Nothing
@@ -51,7 +51,7 @@ {- Called when there's an error with inotify. -} onErr :: Handler-onErr msg = error msg+onErr = error {- Called when a new transfer information file is written. -} onAdd :: Handler@@ -70,10 +70,9 @@ - The only thing that should change in the transfer info is the - bytesComplete, so that's the only thing updated in the DaemonStatus. -} onModify :: Handler-onModify file = do- case parseTransferFile file of- Nothing -> noop- Just t -> go t =<< liftIO (readTransferInfoFile Nothing file)+onModify file = case parseTransferFile file of+ Nothing -> noop+ Just t -> go t =<< liftIO (readTransferInfoFile Nothing file) where go _ Nothing = noop go t (Just newinfo) = alterTransferInfo t $
@@ -31,7 +31,7 @@ transfererThread = namedThread "Transferrer" $ do program <- liftIO readProgramFile forever $ inTransferSlot program $- maybe (return Nothing) (uncurry $ genTransfer)+ maybe (return Nothing) (uncurry genTransfer) =<< getNextTransfer notrunning where {- Skip transfers that are already running. -}@@ -96,7 +96,7 @@ True (transferKey t) (associatedFile info) (Just remote)- void $ recordCommit+ void recordCommit , whenM (liftAnnex $ isNothing <$> checkTransfer t) $ void $ removeTransfer t )
@@ -5,7 +5,7 @@ - Licensed under the GNU GPL version 3 or higher. -} -{-# LANGUAGE DeriveDataTypeable, BangPatterns, CPP #-}+{-# LANGUAGE DeriveDataTypeable, CPP #-} module Assistant.Threads.Watcher ( watchThread,@@ -23,7 +23,7 @@ import Assistant.Alert import Utility.DirWatcher import Utility.DirWatcher.Types-import Utility.Lsof+import qualified Utility.Lsof as Lsof import qualified Annex import qualified Annex.Queue import qualified Git@@ -50,7 +50,7 @@ checkCanWatch :: Annex () checkCanWatch | canWatch = do- liftIO setupLsof+ liftIO Lsof.setup unlessM (liftIO (inPath "lsof") <||> Annex.getState Annex.force) needLsof | otherwise = error "watch mode is not available on this system"@@ -79,7 +79,7 @@ runWatcher :: Assistant () runWatcher = do startup <- asIO1 startupScan- matcher <- liftAnnex $ largeFilesMatcher+ matcher <- liftAnnex largeFilesMatcher direct <- liftAnnex isDirect symlinkssupported <- liftAnnex $ coreSymlinks <$> Annex.getGitConfig addhook <- hook $ if direct@@ -109,7 +109,7 @@ waitFor :: WatcherException -> Assistant () -> Assistant () waitFor sig next = do- r <- liftIO $ (E.try pause :: IO (Either E.SomeException ()))+ r <- liftIO (E.try pause :: IO (Either E.SomeException ())) case r of Left e -> case E.fromException e of Just s@@ -124,7 +124,7 @@ startupScan scanner = do liftAnnex $ showAction "scanning" alertWhile' startupScanAlert $ do- r <- liftIO $ scanner+ r <- liftIO scanner -- Notice any files that were deleted before -- watching was started.@@ -133,7 +133,7 @@ forM_ fs $ \f -> do liftAnnex $ onDel' f maybe noop recordChange =<< madeChange f RmChange- void $ liftIO $ cleanup+ void $ liftIO cleanup liftAnnex $ showAction "started" liftIO $ putStrLn ""@@ -176,7 +176,7 @@ Right (Just change) -> do -- Just in case the commit thread is not -- flushing the queue fast enough.- liftAnnex $ Annex.Queue.flushWhenFull+ liftAnnex Annex.Queue.flushWhenFull recordChange change where normalize f@@ -300,7 +300,7 @@ liftAnnex $ do v <- catObjectDetails $ Ref $ ':':file case v of- Just (currlink, sha)+ Just (currlink, sha, _type) | s2w8 link == L.unpack currlink -> stageSymlink file sha _ -> stageSymlink file =<< hashSymlink link@@ -340,8 +340,8 @@ now <- liftIO getCurrentTime recordChanges $ map (\f -> Change now f RmChange) fs - void $ liftIO $ clean- liftAnnex $ Annex.Queue.flushWhenFull+ void $ liftIO clean+ liftAnnex Annex.Queue.flushWhenFull noChange {- Called when there's an error with inotify or kqueue. -}
@@ -29,9 +29,11 @@ import Assistant.WebApp.Configurators.Preferences import Assistant.WebApp.Configurators.Edit import Assistant.WebApp.Configurators.Delete+import Assistant.WebApp.Configurators.Fsck import Assistant.WebApp.Documentation import Assistant.WebApp.Control import Assistant.WebApp.OtherRepos+import Assistant.WebApp.Repair import Assistant.Types.ThreadedMonad import Utility.WebApp import Utility.Tmp@@ -83,7 +85,10 @@ urlfile <- runThreadState st $ fromRepo gitAnnexUrlFile go addr webapp htmlshim (Just urlfile) where- thread = namedThread "WebApp"+ -- The webapp thread does not wait for the startupSanityCheckThread+ -- to finish, so that the user interface remains responsive while+ -- that's going on.+ thread = namedThreadUnchecked "WebApp" getreldir | noannex = return Nothing | otherwise = Just <$>
@@ -103,9 +103,8 @@ - will also be killed. -} liftIO $ pinger `concurrently` sender `concurrently` receiver - sendnotifications selfjid = forever $ do- a <- inAssistant $ relayNetMessage selfjid- a+ sendnotifications selfjid = forever $+ join $ inAssistant $ relayNetMessage selfjid receivenotifications selfjid lasttraffic = forever $ do l <- decodeStanza selfjid <$> getStanza void $ liftIO $ atomically . swapTMVar lasttraffic =<< getCurrentTime@@ -115,7 +114,7 @@ sendpings selfjid lasttraffic = forever $ do putStanza pingstanza - startping <- liftIO $ getCurrentTime+ startping <- liftIO getCurrentTime liftIO $ threadDelaySeconds (Seconds 120) t <- liftIO $ atomically $ readTMVar lasttraffic when (t < startping) $ do@@ -154,8 +153,7 @@ , logJid jid , show $ logNetMessage msg' ]- a <- inAssistant $ convertNetMsg msg' selfjid- a+ join $ inAssistant $ convertNetMsg msg' selfjid inAssistant $ sentImportantNetMessage msg c resendImportantMessages _ _ = noop @@ -196,7 +194,7 @@ decodeStanza :: JID -> ReceivedStanza -> [XMPPEvent] decodeStanza selfjid s@(ReceivedPresence p) | presenceType p == PresenceError = [ProtocolError s]- | presenceFrom p == Nothing = [Ignorable s]+ | isNothing (presenceFrom p) = [Ignorable s] | presenceFrom p == Just selfjid = [Ignorable s] | otherwise = maybe [PresenceMessage p] decode (gitAnnexTagInfo p) where@@ -209,7 +207,7 @@ - along with their real meaning. -} impliedp v = [PresenceMessage p, v] decodeStanza selfjid s@(ReceivedMessage m)- | messageFrom m == Nothing = [Ignorable s]+ | isNothing (messageFrom m) = [Ignorable s] | messageFrom m == Just selfjid = [Ignorable s] | messageType m == MessageError = [ProtocolError s] | otherwise = [fromMaybe (Unknown s) (GotNetMessage <$> decodeMessage m)]@@ -241,13 +239,13 @@ \c -> (baseJID <$> parseJID c) == Just tojid return $ putStanza presenceQuery _ -> return noop- convert (Pushing c pushstage) = withOtherClient selfjid c $ \tojid -> do+ convert (Pushing c pushstage) = withOtherClient selfjid c $ \tojid -> if tojid == baseJID tojid then do clients <- maybe [] (S.toList . buddyAssistants) <$> getBuddy (genBuddyKey tojid) <<~ buddyList debug ["exploded undirected message to clients", unwords $ map logClient clients]- return $ forM_ (clients) $ \(Client jid) ->+ return $ forM_ clients $ \(Client jid) -> putStanza $ pushMessage pushstage jid selfjid else do debug ["to client:", logJid tojid]@@ -266,7 +264,7 @@ convert (Pushing c pushstage) = withOtherClient selfjid c $ \tojid -> return $ putStanza $ pushMessage pushstage tojid selfjid -withOtherClient :: JID -> ClientID -> (JID -> Assistant (XMPP ())) -> (Assistant (XMPP ()))+withOtherClient :: JID -> ClientID -> (JID -> Assistant (XMPP ())) -> Assistant (XMPP ()) withOtherClient selfjid c a = case parseJID c of Nothing -> return noop Just tojid@@ -323,10 +321,10 @@ pairMsgReceived urlrenderer PairReq theiruuid selfjid theirjid | baseJID selfjid == baseJID theirjid = autoaccept | otherwise = do- knownjids <- catMaybes . map (parseJID . getXMPPClientID)+ knownjids <- mapMaybe (parseJID . getXMPPClientID) . filter isXMPPRemote . syncRemotes <$> getDaemonStatus um <- liftAnnex uuidMap- if any (== baseJID theirjid) knownjids && M.member theiruuid um+ if elem (baseJID theirjid) knownjids && M.member theiruuid um then autoaccept else showalert @@ -338,7 +336,7 @@ finishXMPPPairing theirjid theiruuid -- Show an alert to let the user decide if they want to pair. showalert = do- button <- mkAlertButton (T.pack "Respond") urlrenderer $+ button <- mkAlertButton True (T.pack "Respond") urlrenderer $ ConfirmXMPPPairFriendR $ PairKey theiruuid $ formatJID theirjid void $ addAlert $ pairRequestReceivedAlert
@@ -5,8 +5,6 @@ - Licensed under the GNU GPL version 3 or higher. -} -{-# LANGUAGE RankNTypes, ImpredicativeTypes #-}- module Assistant.Types.DaemonStatus where import Common.Annex@@ -18,6 +16,7 @@ import Assistant.Types.Alert import Control.Concurrent.STM+import Control.Concurrent.MVar import Control.Concurrent.Async import Data.Time.Clock.POSIX import qualified Data.Map as M@@ -31,9 +30,9 @@ , scanComplete :: Bool -- Time when a previous process of the daemon was running ok , lastRunning :: Maybe POSIXTime- -- True when the sanity checker is running+ -- True when the daily sanity checker is running , sanityCheckRunning :: Bool- -- Last time the sanity checker ran+ -- Last time the daily sanity checker ran , lastSanityCheck :: Maybe POSIXTime -- True when a scan for file transfers is running , transferScanRunning :: Bool@@ -62,9 +61,15 @@ , alertNotifier :: NotificationBroadcaster -- Broadcasts notifications when the syncRemotes change , syncRemotesNotifier :: NotificationBroadcaster+ -- Broadcasts notifications when the scheduleLog changes+ , scheduleLogNotifier :: NotificationBroadcaster+ -- Broadcasts a notification once the startup sanity check has run.+ , startupSanityCheckNotifier :: NotificationBroadcaster -- When the XMPP client is connected, this will contain the XMPP -- address. , xmppClientID :: Maybe ClientID+ -- MVars to signal when a remote gets connected.+ , connectRemoteNotifiers :: M.Map UUID [MVar ()] } type TransferMap = M.Map Transfer TransferInfo@@ -93,4 +98,7 @@ <*> newNotificationBroadcaster <*> newNotificationBroadcaster <*> newNotificationBroadcaster+ <*> newNotificationBroadcaster+ <*> newNotificationBroadcaster <*> pure Nothing+ <*> pure M.empty
@@ -11,7 +11,11 @@ import Assistant.Types.ThreadName {- Information about a named thread that can be run. -}-data NamedThread = NamedThread ThreadName (Assistant ())+data NamedThread = NamedThread Bool ThreadName (Assistant ()) namedThread :: String -> Assistant () -> NamedThread-namedThread = NamedThread . ThreadName+namedThread = NamedThread True . ThreadName++{- A named thread that can start running before the startup sanity check. -}+namedThreadUnchecked :: String -> Assistant () -> NamedThread+namedThreadUnchecked = NamedThread False . ThreadName
@@ -121,7 +121,7 @@ postAddS3R = awsConfigurator $ do defcreds <- liftAnnex previouslyUsedAWSCreds ((result, form), enctype) <- liftH $- runFormPost $ renderBootstrap $ s3InputAForm defcreds+ runFormPostNoToken $ renderBootstrap $ s3InputAForm defcreds case result of FormSuccess input -> liftH $ do let name = T.unpack $ repoName input@@ -144,7 +144,7 @@ postAddGlacierR = glacierConfigurator $ do defcreds <- liftAnnex previouslyUsedAWSCreds ((result, form), enctype) <- liftH $- runFormPost $ renderBootstrap $ glacierInputAForm defcreds+ runFormPostNoToken $ renderBootstrap $ glacierInputAForm defcreds case result of FormSuccess input -> liftH $ do let name = T.unpack $ repoName input@@ -187,7 +187,7 @@ enableAWSRemote remotetype uuid = do defcreds <- liftAnnex previouslyUsedAWSCreds ((result, form), enctype) <- liftH $- runFormPost $ renderBootstrap $ awsCredsAForm defcreds+ runFormPostNoToken $ renderBootstrap $ awsCredsAForm defcreds case result of FormSuccess creds -> liftH $ do m <- liftAnnex readRemoteLog
@@ -81,7 +81,7 @@ havegitremotes <- haveremotes syncGitRemotes havedataremotes <- haveremotes syncDataRemotes ((result, form), enctype) <- liftH $- runFormPost $ renderBootstrap $ sanityVerifierAForm $+ runFormPostNoToken $ renderBootstrap $ sanityVerifierAForm $ SanityVerifier magicphrase case result of FormSuccess _ -> liftH $ do
@@ -181,7 +181,7 @@ curr <- liftAnnex $ getRepoConfig uuid mremote liftAnnex $ checkAssociatedDirectory curr mremote ((result, form), enctype) <- liftH $- runFormPost $ renderBootstrap $ editRepositoryAForm (isNothing mremote) curr+ runFormPostNoToken $ renderBootstrap $ editRepositoryAForm (isNothing mremote) curr case result of FormSuccess input -> liftH $ do setRepoConfig uuid mremote curr input
@@ -0,0 +1,149 @@+{- git-annex assistant fsck configuration+ -+ - Copyright 2013 Joey Hess <joey@kitenet.net>+ -+ - Licensed under the GNU AGPL version 3 or higher.+ -}++{-# LANGUAGE QuasiQuotes, TemplateHaskell, OverloadedStrings #-}++module Assistant.WebApp.Configurators.Fsck where++import qualified Data.Map as M+import qualified Data.Set as S+import qualified Data.Text as T++import Assistant.WebApp.Common+import Types.ScheduledActivity+import Utility.HumanTime+import Utility.Scheduled+import Logs.Schedule+import Annex.UUID+import qualified Remote+import Assistant.DaemonStatus+import qualified Annex.Branch++{- This adds a form to the page. It does not handle posting of the form,+ - because unlike a typical yesod form that posts using the same url+ - that generated it, this form posts using one of two other routes. -}+showFsckForm :: Bool -> ScheduledActivity -> Widget+showFsckForm new activity = do+ u <- liftAnnex getUUID+ let action = if new+ then AddActivityR u+ else ChangeActivityR u activity+ ((res, form), enctype) <- liftH $ runFsckForm new activity+ case res of+ FormSuccess _ -> noop+ _ -> $(widgetFile "configurators/fsck/form")++{- This does not display a form, but it does get it from a post, and run+ - some Annex action on it. -}+withFsckForm :: (ScheduledActivity -> Annex ()) -> Handler ()+withFsckForm a = do+ ((res, _form), _enctype) <- runFsckForm False defaultFsck+ case res of+ FormSuccess activity -> liftAnnex $ a activity+ _ -> noop++mkFsck :: UUID -> UUID -> Schedule -> Duration -> ScheduledActivity+mkFsck hereu u s d+ | u == hereu = ScheduledSelfFsck s d + | otherwise = ScheduledRemoteFsck u s d++runFsckForm :: Bool -> ScheduledActivity -> Handler ((FormResult ScheduledActivity, Widget), Enctype)+runFsckForm new activity = case activity of+ ScheduledSelfFsck s d -> go s d =<< liftAnnex getUUID+ ScheduledRemoteFsck ru s d -> go s d ru+ where+ go (Schedule r t) d ru = do+ u <- liftAnnex getUUID+ repolist <- liftAssistant (getrepolist ru)+ runFormPostNoToken $ \msg -> do+ (reposRes, reposView) <- mreq (selectFieldList repolist) "" (Just ru)+ (durationRes, durationView) <- mreq intField "" (Just $ durationSeconds d `quot` 60 )+ (timeRes, timeView) <- mreq (selectFieldList times) "" (Just t)+ (recurranceRes, recurranceView) <- mreq (selectFieldList recurrances) "" (Just r)+ let form = do+ webAppFormAuthToken+ $(widgetFile "configurators/fsck/formcontent")+ let formresult = mkFsck+ <$> pure u+ <*> reposRes+ <*> (Schedule <$> recurranceRes <*> timeRes)+ <*> (Duration <$> ((60 *) <$> durationRes))+ return (formresult, form)+ where+ times :: [(Text, ScheduledTime)]+ times = ensurevalue t (T.pack $ fromScheduledTime t) $+ map (\x -> (T.pack $ fromScheduledTime x, x)) $+ AnyTime : map (\h -> SpecificTime h 0) [0..23]+ recurrances :: [(Text, Recurrance)]+ recurrances = ensurevalue r (T.pack $ fromRecurrance r) $+ [ ("every day", Daily)+ , ("every Sunday", Weekly $ Just 1)+ , ("every Monday", Weekly $ Just 2)+ , ("every Tuesday", Weekly $ Just 3)+ , ("every Wednesday", Weekly $ Just 4)+ , ("every Thursday", Weekly $ Just 5)+ , ("every Friday", Weekly $ Just 6)+ , ("every Saturday", Weekly $ Just 7)+ , ("monthly", Monthly Nothing)+ , ("twice a month", Divisible 2 (Weekly Nothing))+ , ("yearly", Yearly Nothing)+ , ("twice a year", Divisible 6 (Monthly Nothing))+ , ("quarterly", Divisible 4 (Monthly Nothing))+ ]+ ensurevalue v desc l = case M.lookup v (M.fromList $ map (\(x,y) -> (y,x)) l) of+ Just _ -> l+ Nothing -> (desc, v) : l+ getrepolist :: UUID -> Assistant [(Text, UUID)]+ getrepolist ensureu = do+ -- It is possible to have fsck jobs for remotes that+ -- do not implement remoteFsck, but it's not too useful,+ -- so omit them from the UI normally.+ remotes <- filter (\r -> Remote.uuid r == ensureu || isJust (Remote.remoteFsck r)) . syncRemotes+ <$> getDaemonStatus+ u <- liftAnnex getUUID+ let us = u : (map Remote.uuid remotes)+ liftAnnex $ + zip <$> (map T.pack <$> Remote.prettyListUUIDs us) <*> pure us++defaultFsck :: ScheduledActivity+defaultFsck = ScheduledSelfFsck (Schedule Daily AnyTime) (Duration $ 60*60)++showFsckStatus :: ScheduledActivity -> Widget+showFsckStatus activity = do+ m <- liftAnnex getLastRunTimes+ let lastrun = M.lookup activity m+ $(widgetFile "configurators/fsck/status")++getConfigFsckR :: Handler Html+getConfigFsckR = postConfigFsckR+postConfigFsckR :: Handler Html+postConfigFsckR = page "Consistency checks" (Just Configuration) $ do+ checks <- liftAnnex $ S.toList <$> (scheduleGet =<< getUUID)+ $(widgetFile "configurators/fsck")++changeSchedule :: Handler () -> Handler Html+changeSchedule a = do+ a+ liftAnnex $ Annex.Branch.commit "update"+ redirect ConfigFsckR++getRemoveActivityR :: UUID -> ScheduledActivity -> Handler Html+getRemoveActivityR u activity = changeSchedule $+ liftAnnex $ scheduleRemove u activity++getAddActivityR :: UUID -> Handler Html+getAddActivityR = postAddActivityR+postAddActivityR :: UUID -> Handler Html+postAddActivityR u = changeSchedule $+ withFsckForm $ scheduleAdd u++getChangeActivityR :: UUID -> ScheduledActivity -> Handler Html+getChangeActivityR = postChangeActivityR+postChangeActivityR :: UUID -> ScheduledActivity -> Handler Html+postChangeActivityR u oldactivity = changeSchedule $+ withFsckForm $ \newactivity -> scheduleChange u $+ S.insert newactivity . S.delete oldactivity
@@ -126,7 +126,7 @@ postAddIAR = iaConfigurator $ do defcreds <- liftAnnex previouslyUsedIACreds ((result, form), enctype) <- liftH $- runFormPost $ renderBootstrap $ iaInputAForm defcreds+ runFormPostNoToken $ renderBootstrap $ iaInputAForm defcreds case result of FormSuccess input -> liftH $ do let name = escapeBucket $ T.unpack $ itemName input@@ -165,7 +165,7 @@ enableIARemote uuid = do defcreds <- liftAnnex previouslyUsedIACreds ((result, form), enctype) <- liftH $- runFormPost $ renderBootstrap $ iaCredsAForm defcreds+ runFormPostNoToken $ renderBootstrap $ iaCredsAForm defcreds case result of FormSuccess creds -> liftH $ do m <- liftAnnex readRemoteLog
@@ -155,7 +155,7 @@ let androidspecial = False path <- liftIO . defaultRepositoryPath =<< liftH inFirstRun #endif- ((res, form), enctype) <- liftH $ runFormPost $ newRepositoryForm path+ ((res, form), enctype) <- liftH $ runFormPostNoToken $ newRepositoryForm path case res of FormSuccess (RepositoryPath p) -> liftH $ startFullAssistant (T.unpack p) ClientGroup Nothing@@ -178,7 +178,7 @@ postNewRepositoryR :: Handler Html postNewRepositoryR = page "Add another repository" (Just Configuration) $ do home <- liftIO myHomeDir- ((res, form), enctype) <- liftH $ runFormPost $ newRepositoryForm home+ ((res, form), enctype) <- liftH $ runFormPostNoToken $ newRepositoryForm home case res of FormSuccess (RepositoryPath p) -> do let path = T.unpack p@@ -233,7 +233,7 @@ removabledrives <- liftIO driveList writabledrives <- liftIO $ filterM (canWrite . T.unpack . mountPoint) removabledrives- ((res, form), enctype) <- liftH $ runFormPost $+ ((res, form), enctype) <- liftH $ runFormPostNoToken $ selectDriveForm (sort writabledrives) case res of FormSuccess drive -> liftH $ redirect $ ConfirmAddDriveR drive@@ -294,11 +294,11 @@ r <- liftAnnex $ addRemote $ makeGCryptRemote remotename dir keyid return (Types.Remote.uuid r, r)- go NoRepoKey = checkGCryptRepoEncryption dir makeunencrypted $ do- mu <- liftAnnex $ probeGCryptRemoteUUID dir- case mu of- Just u -> enableexistinggcryptremote u- Nothing -> error "The drive contains a gcrypt repository that is not a git-annex special remote. This is not supported."+ go NoRepoKey = checkGCryptRepoEncryption dir makeunencrypted makeunencrypted $ do+ mu <- liftAnnex $ probeGCryptRemoteUUID dir+ case mu of+ Just u -> enableexistinggcryptremote u+ Nothing -> error "The drive contains a gcrypt repository that is not a git-annex special remote. This is not supported." enableexistinggcryptremote u = do remotename' <- liftAnnex $ getGCryptRemoteName u dir makewith $ const $ do
@@ -265,7 +265,7 @@ promptSecret :: Maybe PairMsg -> (Text -> Secret -> Widget) -> Handler Html promptSecret msg cont = pairPage $ do ((result, form), enctype) <- liftH $- runFormPost $ renderBootstrap $+ runFormPostNoToken $ renderBootstrap $ InputSecret <$> aopt textField "Secret phrase" Nothing case result of FormSuccess v -> do
@@ -90,7 +90,7 @@ postPreferencesR = page "Preferences" (Just Configuration) $ do ((result, form), enctype) <- liftH $ do current <- liftAnnex getPrefs- runFormPost $ renderBootstrap $ prefsAForm current+ runFormPostNoToken $ renderBootstrap $ prefsAForm current case result of FormSuccess new -> liftH $ do liftAnnex $ storePrefs new
@@ -116,7 +116,7 @@ postAddSshR = sshConfigurator $ do username <- liftIO $ T.pack <$> myUserName ((result, form), enctype) <- liftH $- runFormPost $ renderBootstrap $ sshInputAForm textField $+ runFormPostNoToken $ renderBootstrap $ sshInputAForm textField $ SshInput Nothing (Just username) Nothing 22 case result of FormSuccess sshinput -> do@@ -168,7 +168,7 @@ case (mkSshInput . unmangle <$> getsshinput m, M.lookup "name" m) of (Just sshinput, Just reponame) -> sshConfigurator $ do ((result, form), enctype) <- liftH $- runFormPost $ renderBootstrap $ sshInputAForm textField sshinput+ runFormPostNoToken $ renderBootstrap $ sshInputAForm textField sshinput case result of FormSuccess sshinput' | isRsyncNet (inputHostname sshinput') ->@@ -342,15 +342,12 @@ {- Detect if the user entered a location with an existing, known - gcrypt repository, and enable it. Otherwise, runs the action. -} checkExistingGCrypt :: SshData -> Widget -> Widget-checkExistingGCrypt sshdata nope = ifM (liftIO isGcryptInstalled)- ( checkGCryptRepoEncryption repourl nope $ do- mu <- liftAnnex $ probeGCryptRemoteUUID repourl- case mu of- Just u -> void $ liftH $- combineExistingGCrypt sshdata u- Nothing -> error "The location contains a gcrypt repository that is not a git-annex special remote. This is not supported."- , nope- )+checkExistingGCrypt sshdata nope = checkGCryptRepoEncryption repourl nope nope $ do+ mu <- liftAnnex $ probeGCryptRemoteUUID repourl+ case mu of+ Just u -> void $ liftH $+ combineExistingGCrypt sshdata u+ Nothing -> error "The location contains a gcrypt repository that is not a git-annex special remote. This is not supported." where repourl = genSshUrl sshdata @@ -413,7 +410,7 @@ getAddRsyncNetR = postAddRsyncNetR postAddRsyncNetR :: Handler Html postAddRsyncNetR = do- ((result, form), enctype) <- runFormPost $+ ((result, form), enctype) <- runFormPostNoToken $ renderBootstrap $ sshInputAForm hostnamefield $ SshInput Nothing Nothing Nothing 22 let showform status = inpage $@@ -465,11 +462,12 @@ enableRsyncNetGCrypt :: SshInput -> RemoteName -> Handler Html enableRsyncNetGCrypt sshinput reponame = - prepRsyncNet sshinput reponame $ \sshdata ->- checkGCryptRepoEncryption (genSshUrl sshdata) notencrypted $+ prepRsyncNet sshinput reponame $ \sshdata -> whenGcryptInstalled $+ checkGCryptRepoEncryption (genSshUrl sshdata) notencrypted notinstalled $ enableGCrypt sshdata reponame where notencrypted = error "Unexpectedly found a non-encrypted git repository, instead of the expected encrypted git repository."+ notinstalled = error "internal" {- Prepares rsync.net ssh key, and if successful, runs an action with - its SshData. -}
@@ -18,7 +18,6 @@ import Types.Remote (RemoteConfig) import Types.StandardGroups import Logs.Remote-import Assistant.Gpg import Assistant.WebApp.Utility import Git.Remote @@ -26,6 +25,7 @@ #endif import qualified Data.Text as T import Network.URI+import Assistant.Gpg webDAVConfigurator :: Widget -> Handler Html webDAVConfigurator = page "Add a WebDAV repository" (Just Configuration)@@ -67,7 +67,7 @@ postAddBoxComR = boxConfigurator $ do defcreds <- liftAnnex $ previouslyUsedWebDAVCreds "box.com" ((result, form), enctype) <- liftH $- runFormPost $ renderBootstrap $ boxComAForm defcreds+ runFormPostNoToken $ renderBootstrap $ boxComAForm defcreds case result of FormSuccess input -> liftH $ makeWebDavRemote initSpecialRemote "box.com" (toCredPair input) $ M.fromList@@ -110,7 +110,7 @@ maybe (pure Nothing) previouslyUsedWebDAVCreds $ urlHost url ((result, form), enctype) <- liftH $- runFormPost $ renderBootstrap $ webDAVCredsAForm defcreds+ runFormPostNoToken $ renderBootstrap $ webDAVCredsAForm defcreds case result of FormSuccess input -> liftH $ makeWebDavRemote enableSpecialRemote name (toCredPair input) M.empty
@@ -55,7 +55,7 @@ checkCloudRepos urlrenderer r = unlessM (syncingToCloudRemote <$> getDaemonStatus) $ do buddyname <- getBuddyName $ Remote.uuid r- button <- mkAlertButton "Add a cloud repository" urlrenderer $+ button <- mkAlertButton True "Add a cloud repository" urlrenderer $ NeedCloudRepoR $ Remote.uuid r void $ addAlert $ cloudRepoNeededAlert buddyname button #else@@ -112,7 +112,7 @@ xmppform next = xmppPage $ do ((result, form), enctype) <- liftH $ do oldcreds <- liftAnnex getXMPPCreds- runFormPost $ renderBootstrap $ xmppAForm $+ runFormPostNoToken $ renderBootstrap $ xmppAForm $ creds2Form <$> oldcreds let showform problem = $(widgetFile "configurators/xmpp") case result of
@@ -79,9 +79,18 @@ where missing = error $ "Cannot find configuration for the gcrypt remote at " ++ repoloc -checkGCryptRepoEncryption :: (Monad m, LiftAnnex m) => String -> m a -> m a -> m a-checkGCryptRepoEncryption location notencrypted encrypted = - dispatch =<< liftAnnex (inRepo $ Git.GCrypt.probeRepo location)+{- Checks to see if a repo is encrypted with gcrypt, and runs one action if+ - it's not an another if it is.+ -+ - Since the probing requires gcrypt to be installed, a third action must+ - be provided to run if it's not installed.+ -}+checkGCryptRepoEncryption :: (Monad m, LiftAnnex m) => String -> m a -> m a -> m a -> m a+checkGCryptRepoEncryption location notencrypted notinstalled encrypted = + ifM (liftAnnex $ liftIO isGcryptInstalled)+ ( dispatch =<< liftAnnex (inRepo $ Git.GCrypt.probeRepo location)+ , notinstalled+ ) where dispatch Git.GCrypt.Decryptable = encrypted dispatch Git.GCrypt.NotEncrypted = notencrypted
@@ -45,8 +45,8 @@ page :: Hamlet.Html -> Maybe NavBarItem -> Widget -> Handler Html page title navbaritem content = customPage navbaritem $ do setTitle title- sideBarDisplay content+ sideBarDisplay {- A custom page, with no title or sidebar set. -} customPage :: Maybe NavBarItem -> Widget -> Handler Html
@@ -0,0 +1,80 @@+{- git-annex assistant repository repair+ -+ - Copyright 2013 Joey Hess <joey@kitenet.net>+ -+ - Licensed under the GNU AGPL version 3 or higher.+ -}++{-# LANGUAGE QuasiQuotes, TemplateHaskell, OverloadedStrings #-}++module Assistant.WebApp.Repair where++import Assistant.WebApp.Common+import Assistant.WebApp.Utility+import Assistant.WebApp.RepoList+import Remote (prettyUUID)+import Command.Repair (repairAnnexBranch)+import Git.Repair (runRepairOf)+import Logs.FsckResults+import Annex.UUID+import Utility.Batch+import Config.Files++import Control.Concurrent.Async++getRepairRepositoryR :: UUID -> Handler Html+getRepairRepositoryR = postRepairRepositoryR+postRepairRepositoryR :: UUID -> Handler Html+postRepairRepositoryR u = page "Repair repository" Nothing $ do+ repodesc <- liftAnnex $ prettyUUID u+ $(widgetFile "control/repairrepository")++getRepairRepositoryRunR :: UUID -> Handler Html+getRepairRepositoryRunR = postRepairRepositoryRunR+postRepairRepositoryRunR :: UUID -> Handler Html+postRepairRepositoryRunR u = do+ -- Stop the watcher from running while running repairs.+ changeSyncable Nothing False++ fsckthread <- liftAssistant $ runRepair u++ -- Start the watcher running again. This also triggers it to do a+ -- startup scan, which is especially important if the git repo+ -- repair removed files from the index file. Those files will be+ -- seen as new, and re-added to the repository.+ changeSyncable Nothing True++ liftAnnex $ writeFsckResults u Nothing++ page "Repair repository" Nothing $ do+ let repolist = repoListDisplay $+ mainRepoSelector { nudgeAddMore = True }+ $(widgetFile "control/repairrepository/done")++runRepair :: UUID -> Assistant ()+runRepair u = do+ fsckresults <- liftAnnex (readFsckResults u)+ myu <- liftAnnex getUUID+ if u == myu+ then localrepair fsckresults+ else remoterepair fsckresults+ where+ localrepair fsckresults = do+ -- This intentionally runs the repair inside the Annex+ -- monad, which is not stricktly necessary, but keeps+ -- other threads that might be trying to use the Annex+ -- from running until it completes.+ needfsck <- liftAnnex $ do+ (ok, stillmissing, modifiedbranches) <- inRepo $+ runRepairOf fsckresults True+ repairAnnexBranch stillmissing modifiedbranches+ return (not ok)+ when needfsck $+ backgroundfsck [ Param "--fast" ]++ remoterepair fsckresults = do+ error "TODO: remote repair"+ + backgroundfsck params = liftIO $ void $ async $ do+ program <- readProgramFile+ batchCommand program (Param "fsck" : params)
@@ -23,6 +23,7 @@ import Logs.Transfer import Utility.Gpg (KeyId) import Build.SysConfig (packageversion)+import Types.ScheduledActivity import Yesod.Static import Text.Hamlet@@ -209,5 +210,9 @@ fromPathPiece = readish . unpack instance PathPiece ThreadName where+ toPathPiece = pack . show+ fromPathPiece = readish . unpack++instance PathPiece ScheduledActivity where toPathPiece = pack . show fromPathPiece = readish . unpack
@@ -19,6 +19,7 @@ /config/xmpp/for/self XMPPConfigForPairSelfR GET POST /config/xmpp/for/frield XMPPConfigForPairFriendR GET POST /config/xmpp/needcloudrepo/#UUID NeedCloudRepoR GET+/config/fsck ConfigFsckR GET POST /config/addrepository AddRepositoryR GET /config/repository/new NewRepositoryR GET POST@@ -83,6 +84,10 @@ /config/repository/delete/finish/#UUID FinishDeleteRepositoryR GET /config/repository/delete/here DeleteCurrentRepositoryR GET POST +/config/activity/add/#UUID AddActivityR GET POST+/config/activity/change/#UUID/#ScheduledActivity ChangeActivityR GET POST+/config/activity/remove/#UUID/#ScheduledActivity RemoveActivityR GET+ /transfers/#NotificationId TransfersR GET /notifier/transfers NotifierTransfersR GET @@ -102,5 +107,8 @@ /transfer/pause/#Transfer PauseTransferR GET POST /transfer/start/#Transfer StartTransferR GET POST /transfer/cancel/#Transfer CancelTransferR GET POST++/repair/#UUID RepairRepositoryR GET POST+/repair/run/#UUID RepairRepositoryRunR GET POST /static StaticR Static getStatic
@@ -5,6 +5,8 @@ - Licensed under the GNU GPL version 3 or higher. -} +{-# LANGUAGE CPP #-}+ module Backend.Hash (backends) where import Common.Annex@@ -27,7 +29,9 @@ hashes :: [Hash] hashes = concat [ map SHAHash [256, 1, 512, 224, 384]+#ifdef WITH_CRYPTOHASH , map SkeinHash [256, 512]+#endif ] {- The SHA256E backend is the default, so genBackendE comes first. -}@@ -143,7 +147,7 @@ | hashsize == 224 = use SysConfig.sha224 sha224 | hashsize == 384 = use SysConfig.sha384 sha384 | hashsize == 512 = use SysConfig.sha512 sha512- | otherwise = error $ "bad sha size " ++ show hashsize+ | otherwise = error $ "unsupported sha size " ++ show hashsize where use Nothing hasher = Left $ show . hasher use (Just c) hasher@@ -157,6 +161,8 @@ skeinHasher :: HashSize -> (L.ByteString -> String) skeinHasher hashsize +#ifdef WITH_CRYPTOHASH | hashsize == 256 = show . skein256 | hashsize == 512 = show . skein512- | otherwise = error $ "bad skein size " ++ show hashsize+#endif+ | otherwise = error $ "unsupported skein size " ++ show hashsize
@@ -10,11 +10,10 @@ fromUrl ) where -import Data.Hash.MD5- import Common.Annex import Types.Backend import Types.Key+import Backend.Utilities backends :: [Backend] backends = [backend]@@ -27,18 +26,12 @@ , canUpgradeKey = Nothing } -{- When it's not too long, use the full url as the key name.- - If the url is too long, it's truncated at half the filename length- - limit, and the md5 of the url is prepended to ensure a unique key. -}+{- Every unique url has a corresponding key. -} fromUrl :: String -> Maybe Integer -> Annex Key fromUrl url size = do- limit <- liftIO . fileNameLengthLimit =<< fromRepo gitAnnexDir- let truncurl = truncateFilePath (limit `div` 2) url- let key = if url == truncurl- then url- else truncurl ++ "-" ++ md5s (Str url)+ n <- genKeyName url return $ stubKey- { keyName = key+ { keyName = n , keyBackendName = "URL" , keySize = size- }+ }
@@ -0,0 +1,25 @@+{- git-annex backend utilities+ -+ - Copyright 2012 Joey Hess <joey@kitenet.net>+ -+ - Licensed under the GNU GPL version 3 or higher.+ -}++module Backend.Utilities where++import Data.Hash.MD5++import Common.Annex++{- Generates a keyName from an input string. Takes care of sanitizing it.+ - If it's not too long, the full string is used as the keyName.+ - Otherwise, it's truncated at half the filename length limit, and its+ - md5 is prepended to ensure a unique key. -}+genKeyName :: String -> Annex String+genKeyName s = do+ limit <- liftIO . fileNameLengthLimit =<< fromRepo gitAnnexDir+ let s' = preSanitizeKeyName s+ let truncs = truncateFilePath (limit `div` 2) s'+ return $ if s' == truncs+ then s'+ else truncs ++ "-" ++ md5s (Str s)
@@ -11,6 +11,7 @@ import Types.Backend import Types.Key import Types.KeySource+import Backend.Utilities backends :: [Backend] backends = [backend]@@ -33,9 +34,10 @@ keyValue :: KeySource -> Annex (Maybe Key) keyValue source = do stat <- liftIO $ getFileStatus $ contentLocation source- return $ Just Key {- keyName = takeFileName $ keyFilename source,- keyBackendName = name backend,- keySize = Just $ fromIntegral $ fileSize stat,- keyMtime = Just $ modificationTime stat- }+ n <- genKeyName $ keyFilename source+ return $ Just Key+ { keyName = n+ , keyBackendName = name backend+ , keySize = Just $ fromIntegral $ fileSize stat+ , keyMtime = Just $ modificationTime stat+ }
@@ -24,7 +24,10 @@ , Just "git" #endif , Just "cp"+#ifndef mingw32_HOST_OS+ -- using xargs on windows led to problems, so it's not used there , Just "xargs"+#endif , Just "rsync" , Just "ssh" #ifndef mingw32_HOST_OS@@ -41,8 +44,8 @@ , SysConfig.sha512 , SysConfig.sha224 , SysConfig.sha384- -- ionice is not included in the bundle; we rely on the system's- -- own version, which may better match its kernel+ -- nice and ionice are not included in the bundle; we rely on the+ -- system's own version, which may better match its kernel ] where ifset True s = Just s
@@ -13,9 +13,9 @@ import Data.Char import Build.TestConfig+import Build.Version import Utility.SafeCommand import Utility.Monad-import Utility.Exception import Utility.ExternalSHA import qualified Git.Version @@ -33,12 +33,13 @@ , TestCase "wget" $ testCmd "wget" "wget --version >/dev/null" , TestCase "bup" $ testCmd "bup" "bup --version >/dev/null" , TestCase "quvi" $ testCmd "quvi" "quvi --version >/dev/null"+ , TestCase "nice" $ testCmd "nice" "nice true >/dev/null" , TestCase "ionice" $ testCmd "ionice" "ionice -c3 true >/dev/null" , TestCase "gpg" $ maybeSelectCmd "gpg" [ ("gpg", "--version >/dev/null") , ("gpg2", "--version >/dev/null") ] , TestCase "lsof" $ findCmdPath "lsof" "lsof"- , TestCase "gcrypt" $ findCmdPath "gcrypt" "git-remote-gcrypt"+ , TestCase "git-remote-gcrypt" $ findCmdPath "gcrypt" "git-remote-gcrypt" , TestCase "ssh connection caching" getSshConnectionCaching ] ++ shaTestCases [ (1, "da39a3ee5e6b4b0d3255bfef95601890afd80709")@@ -89,40 +90,6 @@ cmd = "cp " ++ option cmdline = cmd ++ " " ++ testFile ++ " " ++ testFile ++ ".new" -isReleaseBuild :: IO Bool-isReleaseBuild = isJust <$> catchMaybeIO (getEnv "RELEASE_BUILD")--{- Version is usually based on the major version from the changelog, - - plus the date of the last commit, plus the git rev of that commit.- - This works for autobuilds, ad-hoc builds, etc.- -- - If git or a git repo is not available, or something goes wrong,- - or this is a release build, just use the version from the changelog. -}-getVersion :: Test-getVersion = do- changelogversion <- getChangelogVersion- version <- ifM (isReleaseBuild)- ( return changelogversion- , catchDefaultIO changelogversion $ do- let major = takeWhile (/= '.') changelogversion- autoversion <- readProcess "sh"- [ "-c"- , "git log -n 1 --format=format:'%ci %h'| sed -e 's/-//g' -e 's/ .* /-g/'"- ] ""- if null autoversion- then return changelogversion- else return $ concat [ major, ".", autoversion ]- )- return $ Config "packageversion" (StringConfig version)- -getChangelogVersion :: IO String-getChangelogVersion = do- changelog <- readFile "debian/changelog"- let verline = takeWhile (/= '\n') changelog- return $ middle (words verline !! 1)- where- middle = drop 1 . init- getGitVersion :: Test getGitVersion = Config "gitversion" . StringConfig . show <$> Git.Version.installed@@ -131,25 +98,6 @@ getSshConnectionCaching = Config "sshconnectioncaching" . BoolConfig <$> boolSystem "sh" [Param "-c", Param "ssh -o ControlPersist=yes -V >/dev/null 2>/dev/null"] -{- Set up cabal file with version. -}-cabalSetup :: IO ()-cabalSetup = do- version <- takeWhile (\c -> isDigit c || c == '.')- <$> getChangelogVersion- cabal <- readFile cabalfile- writeFile tmpcabalfile $ unlines $ - map (setfield "Version" version) $- lines cabal- renameFile tmpcabalfile cabalfile- where- cabalfile = "git-annex.cabal"- tmpcabalfile = cabalfile++".tmp"- setfield field value s- | fullfield `isPrefixOf` s = fullfield ++ value- | otherwise = s- where- fullfield = field ++ ": "- setup :: IO () setup = do createDirectoryIfMissing True tmpDir@@ -167,8 +115,8 @@ then writeSysConfig $ androidConfig config else writeSysConfig config cleanup- whenM (isReleaseBuild) $- cabalSetup+ whenM isReleaseBuild $+ cabalSetup "git-annex.cabal" {- Hard codes some settings to cross-compile for Android. -} androidConfig :: [Config] -> [Config]
@@ -0,0 +1,69 @@+{- Package version determination, for configure script. -}++module Build.Version where++import Data.Maybe+import Control.Applicative+import Data.List+import System.Environment+import System.Directory+import Data.Char+import System.Process++import Build.TestConfig+import Utility.Monad+import Utility.Exception++{- Set when making an official release. (Distribution vendors should set+ - this too.) -}+isReleaseBuild :: IO Bool+isReleaseBuild = isJust <$> catchMaybeIO (getEnv "RELEASE_BUILD")++{- Version is usually based on the major version from the changelog, + - plus the date of the last commit, plus the git rev of that commit.+ - This works for autobuilds, ad-hoc builds, etc.+ -+ - If git or a git repo is not available, or something goes wrong,+ - or this is a release build, just use the version from the changelog. -}+getVersion :: Test+getVersion = do+ changelogversion <- getChangelogVersion+ version <- ifM (isReleaseBuild)+ ( return changelogversion+ , catchDefaultIO changelogversion $ do+ let major = takeWhile (/= '.') changelogversion+ autoversion <- takeWhile (\c -> isAlphaNum c || c == '-') <$> readProcess "sh"+ [ "-c"+ , "git log -n 1 --format=format:'%ci %h'| sed -e 's/-//g' -e 's/ .* /-g/'"+ ] ""+ if null autoversion+ then return changelogversion+ else return $ concat [ major, ".", autoversion ]+ )+ return $ Config "packageversion" (StringConfig version)+ +getChangelogVersion :: IO String+getChangelogVersion = do+ changelog <- readFile "debian/changelog"+ let verline = takeWhile (/= '\n') changelog+ return $ middle (words verline !! 1)+ where+ middle = drop 1 . init++{- Set up cabal file with version. -}+cabalSetup :: FilePath -> IO ()+cabalSetup cabalfile = do+ version <- takeWhile (\c -> isDigit c || c == '.')+ <$> getChangelogVersion+ cabal <- readFile cabalfile+ writeFile tmpcabalfile $ unlines $ + map (setfield "Version" version) $+ lines cabal+ renameFile tmpcabalfile cabalfile+ where+ tmpcabalfile = cabalfile++".tmp"+ setfield field value s+ | fullfield `isPrefixOf` s = fullfield ++ value+ | otherwise = s+ where+ fullfield = field ++ ": "
@@ -10,7 +10,6 @@ find . \( -name .git -or -name dist -or -name cabal-dev \) -prune \ -or -not -name \\*.orig -not -type d -print \ | perl -ne "print unless length >= 100 - length q{$sdist_dir}" \-| grep -v \\._comment | grep -v \\.mdwn | grep -v /doc/design/ | grep -v /doc/android/ | grep -v /doc/assistant/ | grep -v /doc/tips/ \ | xargs cp --parents --target-directory dist/$sdist_dir cd dist
@@ -54,4 +54,10 @@ #ifdef WITH_QUVI , "Quvi" #endif+#ifdef WITH_TDFA+ , "TDFA"+#endif+#ifdef WITH_CRYPTOHASH+ , "CryptoHash"+#endif ]
@@ -1,3 +1,49 @@+git-annex (4.20131024) unstable; urgency=low++ * webapp: Fix bug when adding a remote and git-remote-gcrypt+ is not installed.+ * The assitant can now run scheduled incremental fsck jobs on the local+ repository and remotes. These can be configured using vicfg or with the+ webapp.+ * repair: New command, which can repair damaged git repositories+ (even ones not using git-annex).+ * webapp: When git repository damange is detected, repairs can be+ done using the webapp UI.+ * Automatically and safely detect and recover from dangling+ .git/annex/index.lock files, which would prevent git from+ committing to the git-annex branch, eg after a crash.+ * assistant: Detect stale git lock files at startup time, and remove them.+ * addurl: Better sanitization of generated filenames.+ * Better sanitization of problem characters when generating URL and WORM+ keys.+ * The control socket path passed to ssh needs to be 17 characters+ shorter than the maximum unix domain socket length, because ssh+ appends stuff to it to make a temporary filename. Closes: #725512+ * status: Fix space leak in local mode, introduced in version 4.20130920.+ * import: Skip .git directories.+ * Remove bogus runshell loop check.+ * addurl: Improve message when adding url with wrong size to existing file.+ * Fixed handling of URL keys that have no recorded size.+ * status: Fix a crash if a temp file went away while its size was+ being checked for status.+ * Deal with git check-attr -z output format change in git 1.8.5.+ * Work around sed output difference that led to version containing a newline+ on OSX.+ * sync: Fix automatic resolution of merge conflicts where one side is an+ annexed file, and the other side is a non-annexed file, or a directory.+ * S3: Try to ensure bucket name is valid for archive.org.+ * assistant: Bug fix: When run in a subdirectory, files from incoming merges+ were wrongly added to that subdirectory, and removed from their original+ locations.+ * Windows: Deal with strange msysgit 1.8.4 behavior of not understanding+ DOS formatted paths for --git-dir and --work-tree.+ * Removed workaround for bug in git 1.8.4r0.+ * Added git-recover-repository command to git-annex source+ (not built by default; this needs to move to someplace else).+ * webapp: Move sidebar to the right hand side of the screen.++ -- Joey Hess <joeyh@debian.org> Thu, 24 Oct 2013 12:59:55 -0400+ git-annex (4.20131002) unstable; urgency=low * Note that the layout of gcrypt repositories has changed, and
@@ -83,7 +83,8 @@ page <- fromMaybe badquvi <$> withQuviOptions Quvi.forceQuery [Quvi.quiet, Quvi.httponly] s' let link = fromMaybe badquvi $ headMaybe $ Quvi.pageLinks page- let file = choosefile $ sanitizeFilePath $+ pathmax <- liftIO $ fileNameLengthLimit "."+ let file = choosefile $ truncateFilePath pathmax $ sanitizeFilePath $ Quvi.pageTitle page ++ "." ++ Quvi.linkSuffix link showStart "addurl" file next $ performQuvi relaxed s' (Quvi.linkUrl link) file@@ -123,14 +124,16 @@ next $ return True | otherwise = do headers <- getHttpHeaders- ifM (Url.withUserAgent $ Url.check url headers $ keySize key)- ( do+ (exists, samesize) <- Url.withUserAgent $ Url.check url headers $ keySize key+ if exists && samesize+ then do setUrlPresent key url next $ return True- , do- warning $ "failed to verify url exists: " ++ url+ else do+ warning $ if exists+ then "url does not have expected file size (use --relaxed to bypass this check) " ++ url+ else "failed to verify url exists: " ++ url stop- ) addUrlFile :: Bool -> URLString -> FilePath -> Annex Bool addUrlFile relaxed url file = do@@ -214,7 +217,7 @@ url2file :: URI -> Maybe Int -> Int -> FilePath url2file url pathdepth pathmax = case pathdepth of- Nothing -> truncateFilePath pathmax $ escape fullurl+ Nothing -> truncateFilePath pathmax $ sanitizeFilePath fullurl Just depth | depth >= length urlbits -> frombits id | depth > 0 -> frombits $ drop depth@@ -223,6 +226,6 @@ where fullurl = uriRegName auth ++ uriPath url ++ uriQuery url frombits a = intercalate "/" $ a urlbits- urlbits = map (truncateFilePath pathmax . escape) $ filter (not . null) $ split "/" fullurl+ urlbits = map (truncateFilePath pathmax . sanitizeFilePath) $+ filter (not . null) $ split "/" fullurl auth = fromMaybe (error $ "bad url " ++ show url) $ uriAuthority url- escape = replace "/" "_" . replace "?" "_"
@@ -54,8 +54,8 @@ Nothing -> noop Just a -> do showStart "direct" f- r <- tryAnnex a- case r of+ r' <- tryAnnex a+ case r' of Left e -> warnlocked e Right _ -> showEndOk return Nothing
@@ -104,7 +104,7 @@ Nothing -> noop Just started -> do now <- liftIO getPOSIXTime- when (now - realToFrac started >= delta)+ when (now - realToFrac started >= durationToPOSIXTime delta) resetStartTime return True
@@ -16,6 +16,7 @@ import Annex.CatFile import Annex.Content.Direct import Git.Sha+import Git.FilePath def :: [Command] def = [command "pre-commit" paramPaths seek SectionPlumbing@@ -40,10 +41,11 @@ startDirect :: [String] -> CommandStart startDirect _ = next $ do (diffs, clean) <- inRepo $ Git.DiffTree.diffIndex Git.Ref.headRef- forM_ diffs go+ makeabs <- flip fromTopFilePath <$> gitRepo+ forM_ diffs (go makeabs) next $ liftIO clean where- go diff = do+ go makeabs diff = do withkey (Git.DiffTree.srcsha diff) (Git.DiffTree.srcmode diff) removeAssociatedFile withkey (Git.DiffTree.dstsha diff) (Git.DiffTree.dstmode diff) addAssociatedFile where@@ -51,4 +53,5 @@ k <- catKey sha mode case k of Nothing -> noop- Just key -> void $ a key (Git.DiffTree.file diff)+ Just key -> void $ a key $+ makeabs $ Git.DiffTree.file diff
@@ -0,0 +1,71 @@+{- git-annex command+ -+ - Copyright 2013 Joey Hess <joey@kitenet.net>+ -+ - Licensed under the GNU GPL version 3 or higher.+ -}++module Command.Repair where++import Common.Annex+import Command+import qualified Annex+import qualified Git.Repair+import qualified Annex.Branch+import Git.Fsck (MissingObjects)+import Git.Types+import Annex.Version++def :: [Command]+def = [noCommit $ dontCheck repoExists $+ command "repair" paramNothing seek SectionMaintenance "recover broken git repository"]++seek :: [CommandSeek]+seek = [withNothing start]++start :: CommandStart+start = next $ next $ runRepair =<< Annex.getState Annex.force++runRepair :: Bool -> Annex Bool+runRepair forced = do+ (ok, stillmissing, modifiedbranches) <- inRepo $+ Git.Repair.runRepair forced+ -- This command can be run in git repos not using git-annex,+ -- so avoid git annex branch stuff in that case.+ whenM (isJust <$> getVersion) $+ repairAnnexBranch stillmissing modifiedbranches+ return ok++{- After git repository repair, the .git/annex/index file could+ - still be broken, by pointing to bad objects, or might just be corrupt on+ - its own. Since this index file is not used to stage things+ - for long durations of time, it can safely be deleted if it is broken.+ -+ - Otherwise, if the git-annex branch was modified by the repair,+ - commit the index file to the git-annex branch.+ - This way, if the git-annex branch got rewound to an old version by+ - the repository repair, or was completely deleted, this will get it back+ - to a good state. Note that in the unlikely case where the git-annex+ - branch was rewound to a state that, had new changes from elsewhere not+ - yet reflected in the index, this does properly merge those into the+ - index before committing.+ -}+repairAnnexBranch :: MissingObjects -> [Branch] -> Annex ()+repairAnnexBranch missing modifiedbranches+ | Annex.Branch.fullname `elem` modifiedbranches = ifM okindex+ ( commitindex+ , do+ nukeindex+ liftIO $ putStrLn "Had to delete the .git/annex/index file as it was corrupt. Since the git-annex branch is not up-to-date anymore. It would be a very good idea to run: git annex fsck --fast"+ )+ | otherwise = ifM okindex+ ( noop+ , nukeindex+ )+ where+ okindex = Annex.Branch.withIndex $+ inRepo $ Git.Repair.checkIndex missing+ commitindex = do+ Annex.Branch.forceCommit "committing index after git repository repair"+ liftIO $ putStrLn "Successfully recovered the git-annex branch using .git/annex/index"+ nukeindex = inRepo $ nukeFile . gitAnnexIndex
@@ -0,0 +1,50 @@+{- git-annex command+ -+ - Copyright 2013 Joey Hess <joey@kitenet.net>+ -+ - Licensed under the GNU GPL version 3 or higher.+ -}++module Command.Schedule where++import Common.Annex+import Command+import qualified Remote+import Logs.Schedule+import Types.ScheduledActivity++import qualified Data.Set as S++def :: [Command]+def = [command "schedule" (paramPair paramRemote (paramOptional paramExpression)) seek+ SectionSetup "get or set scheduled jobs"]++seek :: [CommandSeek]+seek = [withWords start]++start :: [String] -> CommandStart+start = parse+ where+ parse (name:[]) = go name performGet+ parse (name:expr:[]) = go name $ \uuid -> do+ showStart "schedile" name+ performSet expr uuid+ parse _ = error "Specify a repository."++ go name a = do+ u <- Remote.nameToUUID name+ next $ a u++performGet :: UUID -> CommandPerform+performGet uuid = do+ s <- scheduleGet uuid+ liftIO $ putStrLn $ intercalate "; " $ + map fromScheduledActivity $ S.toList s+ next $ return True++performSet :: String -> UUID -> CommandPerform+performSet expr uuid = case parseScheduledActivities expr of+ Left e -> error $ "Parse error: " ++ e+ Right l -> do+ scheduleSet uuid l+ next $ return True
@@ -70,7 +70,7 @@ type StatState = StateT StatInfo Annex def :: [Command]-def = [command "status" paramPaths seek+def = [noCommit $ command "status" paramPaths seek SectionQuery "shows status information about the annex"] seek :: [CommandSeek]@@ -311,15 +311,16 @@ initial = (emptyKeyData, emptyKeyData, emptyNumCopiesStats) update matcher fast key file vs@(presentdata, referenceddata, numcopiesstats) = ifM (matcher $ FileInfo file file)- ( (,,)- <$> ifM (inAnnex key)+ ( do+ !presentdata' <- ifM (inAnnex key) ( return $ addKey key presentdata , return presentdata )- <*> pure (addKey key referenceddata)- <*> if fast+ let !referenceddata' = addKey key referenceddata+ !numcopiesstats' <- if fast then return numcopiesstats else updateNumCopiesStats key file numcopiesstats+ return $! (presentdata', referenceddata', numcopiesstats') , return vs ) @@ -345,11 +346,11 @@ ks = keySize key updateNumCopiesStats :: Key -> FilePath -> NumCopiesStats -> Annex NumCopiesStats-updateNumCopiesStats key file stats = do- variance <- Variance <$> numCopiesCheck file key (-)- return $ stats { numCopiesVarianceMap = update (numCopiesVarianceMap stats) variance }- where- update m variance = M.insertWith' (+) variance 1 m+updateNumCopiesStats key file (NumCopiesStats m) = do+ !variance <- Variance <$> numCopiesCheck file key (-)+ let !m' = M.insertWith' (+) variance 1 m+ let !ret = NumCopiesStats m'+ return ret showSizeKeys :: KeyData -> String showSizeKeys d = total ++ missingnote@@ -362,7 +363,7 @@ " keys of unknown size" staleSize :: String -> (Git.Repo -> FilePath) -> Stat-staleSize label dirspec = go =<< lift (Command.Unused.staleKeys dirspec)+staleSize label dirspec = go =<< lift (dirKeys dirspec) where go [] = nostat go keys = onsize =<< sum <$> keysizes keys@@ -370,10 +371,11 @@ onsize size = stat label $ json (++ aside "clean up with git-annex unused") $ return $ roughSize storageUnits False size- keysizes keys = map (fromIntegral . fileSize) <$> stats keys- stats keys = do+ keysizes keys = do dir <- lift $ fromRepo dirspec- liftIO $ forM keys $ \k -> getFileStatus (dir </> keyFile k)+ liftIO $ forM keys $ \k -> catchDefaultIO 0 $+ fromIntegral . fileSize + <$> getFileStatus (dir </> keyFile k) aside :: String -> String aside s = " (" ++ s ++ ")"
@@ -31,7 +31,9 @@ import Annex.ReplaceFile import Git.FileMode +import qualified Data.Set as S import Data.Hash.MD5+import Control.Concurrent.MVar def :: [Command] def = [command "sync" (paramOptional (paramRepeating paramRemote))@@ -41,18 +43,29 @@ seek :: CommandSeek seek rs = do prepMerge- branch <- fromMaybe nobranch <$> inRepo Git.Branch.current++ -- There may not be a branch checked out until after the commit,+ -- so only look it up once needed, and only look it up once.+ mvar <- liftIO newEmptyMVar+ let getbranch = ifM (liftIO $ isEmptyMVar mvar)+ ( do+ branch <- fromMaybe (error "no branch is checked out")+ <$> inRepo Git.Branch.current+ liftIO $ putMVar mvar branch+ return branch+ , liftIO $ readMVar mvar+ )+ let withbranch a = a =<< getbranch+ remotes <- syncRemotes rs return $ concat [ [ commit ]- , [ mergeLocal branch ]- , [ pullRemote remote branch | remote <- remotes ]+ , [ withbranch mergeLocal ]+ , [ withbranch (pullRemote remote) | remote <- remotes ] , [ mergeAnnex ]- , [ pushLocal branch ]- , [ pushRemote remote branch | remote <- remotes ]+ , [ withbranch pushLocal ]+ , [ withbranch (pushRemote remote) | remote <- remotes ] ]- where- nobranch = error "no branch is checked out" {- Merging may delete the current directory, so go to the top - of the repo. -}@@ -257,25 +270,33 @@ - - This uses the Keys pointed to by the files to construct new - filenames. So when both sides modified file foo, - - it will be deleted, and replaced with files foo.KEYA and foo.KEYB.+ - it will be deleted, and replaced with files foo.variant-A and+ - foo.variant-B. - - On the other hand, when one side deleted foo, and the other modified it, - it will be deleted, and the modified version stored as file- - foo.KEYA (or KEYB).+ - foo.variant-A (or B).+ -+ - It's also possible that one side has foo as an annexed file, and+ - the other as a directory or non-annexed file. The annexed file+ - is renamed to resolve the merge, and the other object is preserved as-is. -} resolveMerge :: Annex Bool resolveMerge = do top <- fromRepo Git.repoPath (fs, cleanup) <- inRepo (LsFiles.unmerged [top])- merged <- and <$> mapM resolveMerge' fs+ mergedfs <- catMaybes <$> mapM resolveMerge' fs+ let merged = not (null mergedfs) void $ liftIO cleanup (deleted, cleanup2) <- inRepo (LsFiles.deleted [top]) unless (null deleted) $ Annex.Queue.addCommand "rm" [Params "--quiet -f --"] deleted void $ liftIO cleanup2- + when merged $ do+ unlessM isDirect $+ cleanConflictCruft mergedfs top Annex.Queue.flush void $ inRepo $ Git.Command.runBool [ Param "commit"@@ -284,44 +305,86 @@ ] return merged -resolveMerge' :: LsFiles.Unmerged -> Annex Bool+resolveMerge' :: LsFiles.Unmerged -> Annex (Maybe FilePath) resolveMerge' u- | issymlink LsFiles.valUs && issymlink LsFiles.valThem =- withKey LsFiles.valUs $ \keyUs ->- withKey LsFiles.valThem $ \keyThem -> do+ | issymlink LsFiles.valUs && issymlink LsFiles.valThem = do+ kus <- getKey LsFiles.valUs+ kthem <- getKey LsFiles.valThem+ case (kus, kthem) of+ -- Both sides of conflict are annexed files+ (Just keyUs, Just keyThem) -> do+ removeoldfile keyUs+ if keyUs == keyThem+ then makelink keyUs+ else do+ makelink keyUs+ makelink keyThem+ return $ Just file+ -- Our side is annexed, other side is not.+ (Just keyUs, Nothing) -> do ifM isDirect- ( maybe noop (`removeDirect` file) keyUs- , liftIO $ nukeFile file+ -- Move newly added non-annexed object+ -- out of direct mode merge directory.+ ( do+ removeoldfile keyUs+ makelink keyUs+ d <- fromRepo gitAnnexMergeDir+ liftIO $ rename (d </> file) file+ -- cleaup tree after git merge+ , do+ unstageoldfile+ makelink keyUs )- Annex.Queue.addCommand "rm" [Params "--quiet -f --"] [file]- go keyUs keyThem- | otherwise = return False+ return $ Just file+ -- Our side is not annexed, other side is.+ (Nothing, Just keyThem) -> do+ makelink keyThem+ unstageoldfile+ return $ Just file+ -- Neither side is annexed; cannot resolve.+ (Nothing, Nothing) -> return Nothing+ | otherwise = return Nothing where- go keyUs keyThem- | keyUs == keyThem = do- makelink keyUs- return True- | otherwise = do- makelink keyUs- makelink keyThem- return True file = LsFiles.unmergedFile u issymlink select = select (LsFiles.unmergedBlobType u) `elem` [Just SymlinkBlob, Nothing]- makelink (Just key) = do+ makelink key = do let dest = mergeFile file key l <- inRepo $ gitAnnexLink dest key replaceFile dest $ makeAnnexLink l stageSymlink dest =<< hashSymlink l whenM isDirect $ toDirect key dest- makelink _ = noop- withKey select a = do- let msha = select $ LsFiles.unmergedSha u- case msha of- Nothing -> a Nothing- Just sha -> do- key <- catKey sha symLinkMode- maybe (return False) (a . Just) key+ removeoldfile keyUs = do+ ifM isDirect+ ( removeDirect keyUs file+ , liftIO $ nukeFile file+ )+ Annex.Queue.addCommand "rm" [Params "--quiet -f --"] [file]+ unstageoldfile = Annex.Queue.addCommand "rm" [Params "--quiet -f --cached --"] [file]+ getKey select = case select (LsFiles.unmergedSha u) of+ Nothing -> return Nothing+ Just sha -> catKey sha symLinkMode++{- git-merge moves conflicting files away to files+ - named something like f~HEAD or f~branch, but the+ - exact name chosen can vary. Once the conflict is resolved,+ - this cruft can be deleted. To avoid deleting legitimate+ - files that look like this, only delete files that are+ - A) not staged in git and B) look like git-annex symlinks.+ -}+cleanConflictCruft :: [FilePath] -> FilePath -> Annex ()+cleanConflictCruft resolvedfs top = do+ (fs, cleanup) <- inRepo $ LsFiles.notInRepo False [top]+ mapM_ clean fs+ void $ liftIO cleanup+ where+ clean f+ | matchesresolved f = whenM (isJust <$> isAnnexLink f) $+ liftIO $ nukeFile f+ | otherwise = noop+ s = S.fromList resolvedfs+ matchesresolved f = S.member (base f) s+ base f = reverse $ drop 1 $ dropWhile (/= '~') $ reverse f {- The filename to use when resolving a conflicted merge of a file, - that points to a key.
@@ -36,6 +36,7 @@ import qualified Option import Annex.CatFile import Types.Key+import Git.FilePath def :: [Command] def = [withOptions [fromOption] $ command "unused" paramNothing seek@@ -293,9 +294,9 @@ forM_ ts $ tKey lookAtWorkingTree >=> maybe noop a liftIO $ void clean where- tKey True = fmap fst <$$> Backend.lookupFile . DiffTree.file+ tKey True = fmap fst <$$> Backend.lookupFile . getTopFilePath . DiffTree.file tKey False = fileKey . takeFileName . encodeW8 . L.unpack <$$>- catFile ref . DiffTree.file+ catFile ref . getTopFilePath . DiffTree.file {- Looks in the specified directory for bad/tmp keys, and returns a list - of those that might still have value, or might be stale and removable.@@ -304,7 +305,7 @@ -} staleKeysPrune :: (Git.Repo -> FilePath) -> Bool -> Annex [Key] staleKeysPrune dirspec nottransferred = do- contents <- staleKeys dirspec+ contents <- dirKeys dirspec dups <- filterM inAnnex contents let stale = contents `exclude` dups@@ -318,18 +319,6 @@ <$> getTransfers return $ filter (`S.notMember` inprogress) stale else return stale--staleKeys :: (Git.Repo -> FilePath) -> Annex [Key]-staleKeys dirspec = do- dir <- fromRepo dirspec- ifM (liftIO $ doesDirectoryExist dir)- ( do- contents <- liftIO $ getDirectoryContents dir- files <- liftIO $ filterM doesFileExist $- map (dir </>) contents- return $ mapMaybe (fileKey . takeFileName) files- , return []- ) data UnusedMaps = UnusedMaps { unusedMap :: UnusedMap
@@ -21,7 +21,9 @@ import Logs.Trust import Logs.Group import Logs.PreferredContent+import Logs.Schedule import Types.StandardGroups+import Types.ScheduledActivity import Remote def :: [Command]@@ -59,6 +61,7 @@ { cfgTrustMap :: TrustMap , cfgGroupMap :: M.Map UUID (S.Set Group) , cfgPreferredContentMap :: M.Map UUID String+ , cfgScheduleMap :: M.Map UUID [ScheduledActivity] } getCfg :: Annex Cfg@@ -66,22 +69,25 @@ <$> trustMapRaw -- without local trust overrides <*> (groupsByUUID <$> groupMap) <*> preferredContentMapRaw+ <*> scheduleMap setCfg :: Cfg -> Cfg -> Annex () setCfg curcfg newcfg = do- let (trustchanges, groupchanges, preferredcontentchanges) = diffCfg curcfg newcfg+ let (trustchanges, groupchanges, preferredcontentchanges, schedulechanges) = diffCfg curcfg newcfg mapM_ (uncurry trustSet) $ M.toList trustchanges mapM_ (uncurry groupSet) $ M.toList groupchanges mapM_ (uncurry preferredContentSet) $ M.toList preferredcontentchanges+ mapM_ (uncurry scheduleSet) $ M.toList schedulechanges -diffCfg :: Cfg -> Cfg -> (TrustMap, M.Map UUID (S.Set Group), M.Map UUID String)-diffCfg curcfg newcfg = (diff cfgTrustMap, diff cfgGroupMap, diff cfgPreferredContentMap)+diffCfg :: Cfg -> Cfg -> (TrustMap, M.Map UUID (S.Set Group), M.Map UUID String, M.Map UUID [ScheduledActivity])+diffCfg curcfg newcfg = (diff cfgTrustMap, diff cfgGroupMap, diff cfgPreferredContentMap, diff cfgScheduleMap) where diff f = M.differenceWith (\x y -> if x == y then Nothing else Just x) (f newcfg) (f curcfg) genCfg :: Cfg -> M.Map UUID String -> String-genCfg cfg descs = unlines $ concat [intro, trust, groups, preferredcontent]+genCfg cfg descs = unlines $ concat+ [intro, trust, groups, preferredcontent, schedule] where intro = [ com "git-annex configuration"@@ -120,6 +126,14 @@ (\(s, u) -> line "content" u s) (\u -> line "content" u "") + schedule = settings cfgScheduleMap+ [ ""+ , com "Scheduled activities"+ , com "(Separate multiple activities with \"; \")"+ ]+ (\(l, u) -> line "schedule" u $ fromScheduledActivities l)+ (\u -> line "schedule" u "")+ settings field desc showvals showdefaults = concat [ desc , concatMap showvals $ sort $ map swap $ M.toList $ field cfg@@ -173,6 +187,11 @@ Nothing -> let m = M.insert u value (cfgPreferredContentMap cfg) in Right $ cfg { cfgPreferredContentMap = m }+ | setting == "schedule" = case parseScheduledActivities value of+ Left e -> Left e+ Right l -> + let m = M.insert u l (cfgScheduleMap cfg)+ in Right $ cfg { cfgScheduleMap = m } | otherwise = badval "setting" setting showerr (Just msg, l) = [parseerr ++ msg, l]
@@ -15,9 +15,7 @@ import Crypto import Types.Remote (RemoteConfig, RemoteConfigKey) import Remote.Helper.Encryptable (remoteCipher, embedCreds)-#ifndef mingw32_HOST_OS import Utility.Env (setEnv, getEnv)-#endif import qualified Data.ByteString.Lazy.Char8 as L import qualified Data.Map as M
@@ -96,7 +96,7 @@ pipeReadStrict [Param "write-tree"] repo sha <- getSha "commit-tree" $ pipeWriteRead (map Param $ ["commit-tree", show tree] ++ ps)- message repo+ (Just $ flip hPutStr message) repo run [Param "update-ref", Param $ show branch, Param $ show sha] repo return sha where
@@ -8,6 +8,7 @@ module Git.CatFile ( CatFileHandle, catFileStart,+ catFileStart', catFileStop, catFile, catTree,@@ -18,8 +19,7 @@ import System.IO import qualified Data.ByteString as S import qualified Data.ByteString.Lazy as L-import Data.Char-import System.Process (std_out, std_err)+import Data.Tuple.Utils import Numeric import System.Posix.Types @@ -30,13 +30,15 @@ import Git.Types import Git.FilePath import qualified Utility.CoProcess as CoProcess-import Utility.Hash data CatFileHandle = CatFileHandle CoProcess.CoProcessHandle Repo catFileStart :: Repo -> IO CatFileHandle-catFileStart repo = do- coprocess <- CoProcess.rawMode =<< gitCoProcessStart True+catFileStart = catFileStart' True++catFileStart' :: Bool -> Repo -> IO CatFileHandle+catFileStart' restartable repo = do+ coprocess <- CoProcess.rawMode =<< gitCoProcessStart restartable [ Param "cat-file" , Param "--batch" ] repo@@ -53,11 +55,10 @@ {- Uses a running git cat-file read the content of an object. - Objects that do not exist will have "" returned. -} catObject :: CatFileHandle -> Ref -> IO L.ByteString-catObject h object = maybe L.empty fst <$> catObjectDetails h object+catObject h object = maybe L.empty fst3 <$> catObjectDetails h object -{- Gets both the content of an object, and its Sha. -}-catObjectDetails :: CatFileHandle -> Ref -> IO (Maybe (L.ByteString, Sha))-catObjectDetails (CatFileHandle hdl repo) object = CoProcess.query hdl send receive+catObjectDetails :: CatFileHandle -> Ref -> IO (Maybe (L.ByteString, Sha, ObjectType))+catObjectDetails (CatFileHandle hdl _) object = CoProcess.query hdl send receive where query = show object send to = hPutStrLn to query@@ -65,56 +66,30 @@ header <- hGetLine from case words header of [sha, objtype, size]- | length sha == shaSize &&- isJust (readObjectType objtype) -> - case reads size of- [(bytes, "")] -> readcontent bytes from sha+ | length sha == shaSize ->+ case (readObjectType objtype, reads size) of+ (Just t, [(bytes, "")]) -> readcontent t bytes from sha _ -> dne | otherwise -> dne _ | header == show object ++ " missing" -> dne- | otherwise -> - if any isSpace query- then fallback- else error $ "unknown response from git cat-file " ++ show (header, object)- readcontent bytes from sha = do+ | otherwise -> error $ "unknown response from git cat-file " ++ show (header, object)+ readcontent objtype bytes from sha = do content <- S.hGet from bytes eatchar '\n' from- return $ Just (L.fromChunks [content], Ref sha)+ return $ Just (L.fromChunks [content], Ref sha, objtype) dne = return Nothing eatchar expected from = do c <- hGetChar from when (c /= expected) $ error $ "missing " ++ (show expected) ++ " from git cat-file" - {- Work around a bug in git 1.8.4 rc0 which broke it for filenames- - containing spaces. http://bugs.debian.org/718517 - - Slow! Also can use a lot of memory, if the object is large. -}- fallback = do- let p = gitCreateProcess - [ Param "cat-file"- , Param "-p"- , Param query- ] repo- (_, Just h, _, pid) <- withNullHandle $ \h -> - createProcess p- { std_out = CreatePipe- , std_err = UseHandle h- }- fileEncoding h- content <- L.hGetContents h- let sha = (\s -> length s `seq` s) (show $ sha1 content)- ok <- checkSuccessProcess pid- return $ if ok- then Just (content, Ref sha)- else Nothing- {- Gets a list of files and directories in a tree. (Not recursive.) -} catTree :: CatFileHandle -> Ref -> IO [(FilePath, FileMode)] catTree h treeref = go <$> catObjectDetails h treeref where- go Nothing = []- go (Just (b, _)) = parsetree [] b+ go (Just (b, _, TreeObject)) = parsetree [] b+ go _ = [] parsetree c b = case L.break (== 0) b of (modefile, rest)
@@ -13,6 +13,8 @@ import qualified Git.BuildVersion import qualified Utility.CoProcess as CoProcess +import System.IO.Error+ type CheckAttrHandle = (CoProcess.CoProcessHandle, [Attr], String) type Attr = String@@ -37,16 +39,41 @@ {- Gets an attribute of a file. -} checkAttr :: CheckAttrHandle -> Attr -> FilePath -> IO String checkAttr (h, attrs, cwd) want file = do- pairs <- CoProcess.query h send receive+ pairs <- CoProcess.query h send (receive "") let vals = map snd $ filter (\(attr, _) -> attr == want) pairs case vals of [v] -> return v _ -> error $ "unable to determine " ++ want ++ " attribute of " ++ file where send to = hPutStr to $ file' ++ "\0"- receive from = forM attrs $ \attr -> do- l <- hGetLine from- return (attr, attrvalue attr l)+ receive c from = do+ s <- hGetSomeString from 1024+ if null s+ then eofError+ else do+ let v = c ++ s+ maybe (receive v from) return (parse v)+ eofError = ioError $ mkIOError userErrorType "git check-attr EOF" Nothing Nothing+ parse s+ -- new null separated output+ | '\0' `elem` s = if "\0" `isSuffixOf` s+ then+ let bits = segment (== '\0') s+ in if length bits == (numattrs * 3) + 1+ then Just $ getattrvalues bits []+ else Nothing -- more attributes to come+ else Nothing -- output incomplete+ -- old one line per value output+ | otherwise = if "\n" `isSuffixOf` s+ then+ let ls = lines s+ in if length ls == numattrs+ then Just $ map (\(attr, val) -> (attr, oldattrvalue attr val))+ (zip attrs ls)+ else Nothing -- more attributes to come+ else Nothing -- line incomplete+ numattrs = length attrs+ {- Before git 1.7.7, git check-attr worked best with - absolute filenames; using them worked around some bugs - with relative filenames.@@ -58,7 +85,9 @@ file' | oldgit = absPathFrom cwd file | otherwise = relPathDirToFile cwd $ absPathFrom cwd file- attrvalue attr l = end bits !! 0+ oldattrvalue attr l = end bits !! 0 where bits = split sep l sep = ": " ++ attr ++ ": "+ getattrvalues (_filename:attr:val:rest) c = getattrvalues rest ((attr,val):c)+ getattrvalues _ c = c
@@ -1,10 +1,12 @@ {- running git commands -- - Copyright 2010-2012 Joey Hess <joey@kitenet.net>+ - Copyright 2010-2013 Joey Hess <joey@kitenet.net> - - Licensed under the GNU GPL version 3 or higher. -} +{-# LANGUAGE CPP #-}+ module Git.Command where import System.Process (std_out, env)@@ -13,15 +15,26 @@ import Git import Git.Types import qualified Utility.CoProcess as CoProcess+#ifdef mingw32_HOST_OS+import Git.FilePath+#endif {- Constructs a git command line operating on the specified repo. -} gitCommandLine :: [CommandParam] -> Repo -> [CommandParam] gitCommandLine params Repo { location = l@(Local _ _ ) } = setdir : settree ++ params where- setdir = Param $ "--git-dir=" ++ gitdir l+ setdir = Param $ "--git-dir=" ++ gitpath (gitdir l) settree = case worktree l of Nothing -> []- Just t -> [Param $ "--work-tree=" ++ t]+ Just t -> [Param $ "--work-tree=" ++ gitpath t]+#ifdef mingw32_HOST_OS+ -- despite running on windows, msysgit wants a unix-formatted path+ gitpath s+ | isAbsolute s = "/" ++ dropDrive (toInternalGitPath s)+ | otherwise = s+#else+ gitpath = id+#endif gitCommandLine _ repo = assertLocal repo $ error "internal" {- Runs git in the specified repo. -}@@ -72,13 +85,13 @@ where p = gitCreateProcess params repo -{- Runs a git command, feeding it input, and returning its output,+{- Runs a git command, feeding it an input, and returning its output, - which is expected to be fairly small, since it's all read into memory - strictly. -}-pipeWriteRead :: [CommandParam] -> String -> Repo -> IO String-pipeWriteRead params s repo = assertLocal repo $+pipeWriteRead :: [CommandParam] -> Maybe (Handle -> IO ()) -> Repo -> IO String+pipeWriteRead params writer repo = assertLocal repo $ writeReadProcessEnv "git" (toCommand $ gitCommandLine params repo) - (gitEnv repo) s (Just adjusthandle)+ (gitEnv repo) writer (Just adjusthandle) where adjusthandle h = do fileEncoding h
@@ -25,8 +25,6 @@ #ifndef mingw32_HOST_OS import System.Posix.User-#else-import Git.FilePath #endif import qualified Data.Map as M hiding (map, split) import Network.URI
@@ -20,6 +20,7 @@ import Git import Git.Sha import Git.Command+import Git.FilePath import qualified Git.Filename import qualified Git.Ref @@ -29,7 +30,7 @@ , srcsha :: Sha -- nullSha if file was added , dstsha :: Sha -- nullSha if file was deleted , status :: String- , file :: FilePath+ , file :: TopFilePath } deriving Show {- Diffs two tree Refs. -}@@ -86,7 +87,7 @@ , srcsha = fromMaybe (error "bad srcsha") $ extractSha ssha , dstsha = fromMaybe (error "bad dstsha") $ extractSha dsha , status = s- , file = Git.Filename.decode f+ , file = asTopFilePath $ Git.Filename.decode f } where readmode = fst . Prelude.head . readOct
@@ -14,6 +14,7 @@ module Git.FilePath ( TopFilePath,+ fromTopFilePath, getTopFilePath, toTopFilePath, asTopFilePath,@@ -27,6 +28,11 @@ {- A FilePath, relative to the top of the git repository. -} newtype TopFilePath = TopFilePath { getTopFilePath :: FilePath }+ deriving (Show)++{- Returns an absolute FilePath. -}+fromTopFilePath :: TopFilePath -> Git.Repo -> FilePath+fromTopFilePath p repo = absPathFrom (repoPath repo) (getTopFilePath p) {- The input FilePath can be absolute, or relative to the CWD. -} toTopFilePath :: FilePath -> Git.Repo -> IO TopFilePath
@@ -0,0 +1,87 @@+{- git fsck interface+ -+ - Copyright 2013 Joey Hess <joey@kitenet.net>+ -+ - Licensed under the GNU GPL version 3 or higher.+ -}++module Git.Fsck (+ FsckResults,+ MissingObjects,+ findBroken,+ foundBroken,+ findMissing,+) where++import Common+import Git+import Git.Command+import Git.Sha+import Git.CatFile+import Utility.Batch++import qualified Data.Set as S++type MissingObjects = S.Set Sha++{- If fsck succeeded, Just a set of missing objects it found.+ - If it failed, Nothing. -}+type FsckResults = Maybe MissingObjects++{- Runs fsck to find some of the broken objects in the repository.+ - May not find all broken objects, if fsck fails on bad data in some of+ - the broken objects it does find.+ -+ - Strategy: Rather than parsing fsck's current specific output,+ - look for anything in its output (both stdout and stderr) that appears+ - to be a git sha. Not all such shas are of broken objects, so ask git+ - to try to cat the object, and see if it fails.+ -}+findBroken :: Bool -> Repo -> IO FsckResults+findBroken batchmode r = do+ (output, fsckok) <- processTranscript command' (toCommand params') Nothing+ let objs = parseFsckOutput output+ badobjs <- findMissing objs r+ if S.null badobjs && not fsckok+ then return Nothing+ else return $ Just badobjs+ where+ (command, params) = ("git", fsckParams r)+ (command', params')+ | batchmode = toBatchCommand (command, params)+ | otherwise = (command, params)++foundBroken :: FsckResults -> Bool+foundBroken Nothing = True+foundBroken (Just s) = not (S.null s)++{- Finds objects that are missing from the git repsitory, or are corrupt.+ -+ - Note that catting a corrupt object will cause cat-file to crash;+ - this is detected and it's restarted.+ -}+findMissing :: [Sha] -> Repo -> IO MissingObjects+findMissing objs r = go objs [] =<< start+ where+ start = catFileStart' False r+ go [] c h = do+ catFileStop h+ return $ S.fromList c+ go (o:os) c h = do+ v <- tryIO $ isNothing <$> catObjectDetails h o+ case v of+ Left _ -> do+ void $ tryIO $ catFileStop h+ go os (o:c) =<< start+ Right True -> go os (o:c) h+ Right False -> go os c h++parseFsckOutput :: String -> [Sha]+parseFsckOutput = catMaybes . map extractSha . concat . map words . lines++fsckParams :: Repo -> [CommandParam]+fsckParams = gitCommandLine+ [ Param "fsck"+ , Param "--no-dangling"+ , Param "--no-reflogs"+ ]
@@ -36,8 +36,11 @@ {- Injects some content into git, returning its Sha. -} hashObject :: ObjectType -> String -> Repo -> IO Sha-hashObject objtype content repo = getSha subcmd $- pipeWriteRead (map Param params) content repo+hashObject objtype content = hashObject' objtype (flip hPutStr content)++hashObject' :: ObjectType -> (Handle -> IO ()) -> Repo -> IO Sha+hashObject' objtype writer repo = getSha subcmd $+ pipeWriteRead (map Param params) (Just writer) repo where subcmd = "hash-object" params = [subcmd, "-t", show objtype, "-w", "--stdin", "--no-filters"]
@@ -20,6 +20,7 @@ Conflicting(..), Unmerged(..), unmerged,+ StagedDetails, ) where import Common@@ -79,18 +80,20 @@ prefix = [Params "diff --cached --name-only -z"] suffix = Param "--" : map File l +type StagedDetails = (FilePath, Maybe Sha, Maybe FileMode)+ {- Returns details about files that are staged in the index, - as well as files not yet in git. Skips ignored files. -}-stagedOthersDetails :: [FilePath] -> Repo -> IO ([(FilePath, Maybe Sha, Maybe FileMode)], IO Bool)+stagedOthersDetails :: [FilePath] -> Repo -> IO ([StagedDetails], IO Bool) stagedOthersDetails = stagedDetails' [Params "--others --exclude-standard"] {- Returns details about all files that are staged in the index. -}-stagedDetails :: [FilePath] -> Repo -> IO ([(FilePath, Maybe Sha, Maybe FileMode)], IO Bool)+stagedDetails :: [FilePath] -> Repo -> IO ([StagedDetails], IO Bool) stagedDetails = stagedDetails' [] {- Gets details about staged files, including the Sha of their staged - contents. -}-stagedDetails' :: [CommandParam] -> [FilePath] -> Repo -> IO ([(FilePath, Maybe Sha, Maybe FileMode)], IO Bool)+stagedDetails' :: [CommandParam] -> [FilePath] -> Repo -> IO ([StagedDetails], IO Bool) stagedDetails' ps l repo = do (ls, cleanup) <- pipeNullSplit params repo return (map parse ls, cleanup)
@@ -8,6 +8,7 @@ module Git.LsTree ( TreeItem(..), lsTree,+ lsTreeParams, lsTreeFiles, parseLsTree ) where@@ -20,26 +21,30 @@ import Git import Git.Command import Git.Sha+import Git.FilePath import qualified Git.Filename data TreeItem = TreeItem { mode :: FileMode , typeobj :: String , sha :: String- , file :: FilePath+ , file :: TopFilePath } deriving Show -{- Lists the complete contents of a tree, with lazy output. -}+{- Lists the complete contents of a tree, recursing into sub-trees,+ - with lazy output. -} lsTree :: Ref -> Repo -> IO [TreeItem]-lsTree t repo = map parseLsTree <$> pipeNullSplitZombie ps repo- where- ps = [Params "ls-tree --full-tree -z -r --", File $ show t]+lsTree t repo = map parseLsTree+ <$> pipeNullSplitZombie (lsTreeParams t) repo +lsTreeParams :: Ref -> [CommandParam]+lsTreeParams t = [ Params "ls-tree --full-tree -z -r --", File $ show t ]+ {- Lists specified files in a tree. -} lsTreeFiles :: Ref -> [FilePath] -> Repo -> IO [TreeItem] lsTreeFiles t fs repo = map parseLsTree <$> pipeNullSplitStrict ps repo where- ps = [Params "ls-tree -z --", File $ show t] ++ map File fs+ ps = [Params "ls-tree --full-tree -z --", File $ show t] ++ map File fs {- Parses a line of ls-tree output. - (The --long format is not currently supported.) -}@@ -48,7 +53,7 @@ { mode = fst $ Prelude.head $ readOct m , typeobj = t , sha = s- , file = Git.Filename.decode f+ , file = asTopFilePath $ Git.Filename.decode f } where -- l = <mode> SP <type> SP <sha> TAB <file>
@@ -0,0 +1,29 @@+{- .git/objects+ -+ - Copyright 2013 Joey Hess <joey@kitenet.net>+ -+ - Licensed under the GNU GPL version 3 or higher.+ -}++module Git.Objects where++import Common+import Git++objectsDir :: Repo -> FilePath+objectsDir r = localGitDir r </> "objects"++packDir :: Repo -> FilePath+packDir r = objectsDir r </> "pack"++listPackFiles :: Repo -> IO [FilePath]+listPackFiles r = filter (".pack" `isSuffixOf`) + <$> catchDefaultIO [] (dirContents $ packDir r)++packIdxFile :: FilePath -> FilePath+packIdxFile = flip replaceExtension "idx"++looseObjectFile :: Repo -> Sha -> FilePath+looseObjectFile r sha = objectsDir r </> prefix </> rest+ where+ (prefix, rest) = splitAt 2 (show sha)
@@ -5,7 +5,7 @@ - Licensed under the GNU GPL version 3 or higher. -} -{-# LANGUAGE BangPatterns #-}+{-# LANGUAGE CPP, BangPatterns #-} module Git.Queue ( Queue,@@ -26,7 +26,7 @@ import Git import Git.Command import qualified Git.UpdateIndex- + {- Queable actions that can be performed in a git repository. -} data Action@@ -147,13 +147,21 @@ runAction repo (UpdateIndexAction streamers) = -- list is stored in reverse order Git.UpdateIndex.streamUpdateIndex repo $ reverse streamers-runAction repo action@(CommandAction {}) =+runAction repo action@(CommandAction {}) = +#ifndef mingw32_HOST_OS withHandle StdinHandle createProcessSuccess p $ \h -> do fileEncoding h hPutStr h $ intercalate "\0" $ toCommand $ getFiles action hClose h+#else+ -- Using xargs on Windows is problimatic, so just run the command+ -- once per file (not as efficient.)+ if null (getFiles action)+ then void $ boolSystem "git" gitparams+ else forM_ (getFiles action) $ \f ->+ void $ boolSystem "git" (gitparams ++ [f])+#endif where- p = (proc "xargs" params) { env = gitEnv repo }- params = "-0":"git":baseparams- baseparams = toCommand $ gitCommandLine+ p = (proc "xargs" $ "-0":"git":toCommand gitparams) { env = gitEnv repo }+ gitparams = gitCommandLine (Param (getSubcommand action):getParams action) repo
@@ -0,0 +1,22 @@+{- git reflog interface+ -+ - Copyright 2013 Joey Hess <joey@kitenet.net>+ -+ - Licensed under the GNU GPL version 3 or higher.+ -}++module Git.RefLog where++import Common+import Git+import Git.Command+import Git.Sha++{- Gets the reflog for a given branch. -}+get :: Branch -> Repo -> IO [Sha]+get b = mapMaybe extractSha . lines <$$> pipeReadStrict+ [ Param "log"+ , Param "-g"+ , Param "--format=%H"+ , Param (show b)+ ]
@@ -17,6 +17,9 @@ import Data.Char import qualified Data.Map as M import Network.URI+#ifdef mingw32_HOST_OS+import Git.FilePath+#endif type RemoteName = String
@@ -0,0 +1,495 @@+{- git repository recovery+ -+ - Copyright 2013 Joey Hess <joey@kitenet.net>+ -+ - Licensed under the GNU GPL version 3 or higher.+ -}++module Git.Repair (+ runRepair,+ runRepairOf,+ cleanCorruptObjects,+ retrieveMissingObjects,+ resetLocalBranches,+ removeTrackingBranches,+ rewriteIndex,+ checkIndex,+ emptyGoodCommits,+) where++import Common+import Git+import Git.Command+import Git.Objects+import Git.Sha+import Git.Types+import Git.Fsck+import qualified Git.Config as Config+import qualified Git.Construct as Construct+import qualified Git.LsTree as LsTree+import qualified Git.LsFiles as LsFiles+import qualified Git.Ref as Ref+import qualified Git.RefLog as RefLog+import qualified Git.UpdateIndex as UpdateIndex+import qualified Git.Branch as Branch+import Utility.Tmp+import Utility.Rsync++import qualified Data.Set as S+import qualified Data.ByteString.Lazy as L+import Data.Tuple.Utils++{- Given a set of bad objects found by git fsck, removes all+ - corrupt objects, and returns a list of missing objects,+ - which need to be found elsewhere to finish recovery.+ -+ - Since git fsck may crash on corrupt objects, and so not+ - report the full set of corrupt or missing objects,+ - this removes corrupt objects, and re-runs fsck, until it+ - stabalizes.+ -+ - To remove corrupt objects, unpack all packs, and remove the packs+ - (to handle corrupt packs), and remove loose object files.+ -}+cleanCorruptObjects :: FsckResults -> Repo -> IO MissingObjects+cleanCorruptObjects mmissing r = check mmissing+ where+ check Nothing = do+ putStrLn "git fsck found a problem but no specific broken objects. Perhaps a corrupt pack file?"+ ifM (explodePacks r)+ ( retry S.empty+ , return S.empty+ )+ check (Just bad)+ | S.null bad = return S.empty+ | otherwise = do+ putStrLn $ unwords + [ "git fsck found"+ , show (S.size bad)+ , "broken objects."+ ]+ exploded <- explodePacks r+ removed <- removeLoose r bad+ if exploded || removed+ then retry bad+ else return bad+ retry oldbad = do+ putStrLn "Re-running git fsck to see if it finds more problems."+ v <- findBroken False r+ case v of+ Nothing -> error $ unwords+ [ "git fsck found a problem, which was not corrected after removing"+ , show (S.size oldbad)+ , "corrupt objects."+ ]+ Just newbad -> do+ removed <- removeLoose r newbad+ let s = S.union oldbad newbad+ if not removed || s == oldbad+ then return s+ else retry s++removeLoose :: Repo -> MissingObjects -> IO Bool+removeLoose r s = do+ let fs = map (looseObjectFile r) (S.toList s)+ count <- length <$> filterM doesFileExist fs+ if (count > 0)+ then do+ putStrLn $ unwords+ [ "removing"+ , show count+ , "corrupt loose objects"+ ]+ mapM_ nukeFile fs+ return True+ else return False++explodePacks :: Repo -> IO Bool+explodePacks r = do+ packs <- listPackFiles r+ if null packs+ then return False+ else do+ putStrLn "Unpacking all pack files."+ mapM_ go packs+ return True+ where+ go packfile = do+ -- May fail, if pack file is corrupt.+ void $ tryIO $+ pipeWrite [Param "unpack-objects"] r $ \h ->+ L.hPut h =<< L.readFile packfile+ nukeFile packfile+ nukeFile $ packIdxFile packfile++{- Try to retrieve a set of missing objects, from the remotes of a+ - repository. Returns any that could not be retreived.+ -}+retrieveMissingObjects :: MissingObjects -> Repo -> IO MissingObjects+retrieveMissingObjects missing r+ | S.null missing = return missing+ | otherwise = withTmpDir "tmprepo" $ \tmpdir -> do+ unlessM (boolSystem "git" [Params "init", File tmpdir]) $+ error $ "failed to create temp repository in " ++ tmpdir+ tmpr <- Config.read =<< Construct.fromAbsPath tmpdir+ stillmissing <- pullremotes tmpr (remotes r) fetchrefstags missing+ if S.null stillmissing+ then return stillmissing+ else pullremotes tmpr (remotes r) fetchallrefs stillmissing+ where+ pullremotes _tmpr [] _ stillmissing = return stillmissing+ pullremotes tmpr (rmt:rmts) fetchrefs s+ | S.null s = return s+ | otherwise = do+ putStrLn $ "Trying to recover missing objects from remote " ++ repoDescribe rmt+ ifM (fetchsome rmt fetchrefs tmpr)+ ( do+ void $ copyObjects tmpr r+ stillmissing <- findMissing (S.toList s) r+ pullremotes tmpr rmts fetchrefs stillmissing+ , do+ putStrLn $ unwords+ [ "failed to fetch from remote"+ , repoDescribe rmt+ , "(will continue without it, but making this remote available may improve recovery)"+ ]+ pullremotes tmpr rmts fetchrefs s+ )+ fetchsome rmt ps = runBool $+ [ Param "fetch"+ , Param (repoLocation rmt)+ , Params "--force --update-head-ok --quiet"+ ] ++ ps+ -- fetch refs and tags+ fetchrefstags = [ Param "+refs/heads/*:refs/heads/*", Param "--tags"]+ -- Fetch all available refs (more likely to fail,+ -- as the remote may have refs it refuses to send).+ fetchallrefs = [ Param "+*:*" ]++{- Copies all objects from the src repository to the dest repository.+ - This is done using rsync, so it copies all missing object, and all+ - objects they rely on. -}+copyObjects :: Repo -> Repo -> IO Bool+copyObjects srcr destr = rsync+ [ Param "-qr"+ , File $ addTrailingPathSeparator $ objectsDir srcr+ , File $ addTrailingPathSeparator $ objectsDir destr+ ]++{- To deal with missing objects that cannot be recovered, resets any+ - local branches to point to an old commit before the missing+ - objects. Returns all branches that were changed, and deleted.+ -}+resetLocalBranches :: MissingObjects -> GoodCommits -> Repo -> IO ([Branch], [Branch], GoodCommits)+resetLocalBranches missing goodcommits r =+ go [] [] goodcommits =<< filter islocalbranch <$> getAllRefs r+ where+ islocalbranch b = "refs/heads/" `isPrefixOf` show b+ go changed deleted gcs [] = return (changed, deleted, gcs)+ go changed deleted gcs (b:bs) = do+ (mc, gcs') <- findUncorruptedCommit missing gcs b r+ case mc of+ Just c+ | c == b -> go changed deleted gcs' bs+ | otherwise -> do+ reset b c+ go (b:changed) deleted gcs' bs+ Nothing -> do+ nukeBranchRef b r+ go changed (b:deleted) gcs' bs+ reset b c = do+ nukeBranchRef b r+ void $ runBool+ [ Param "branch"+ , Param (show $ Ref.base b)+ , Param (show c)+ ] r++{- To deal with missing objects that cannot be recovered, removes+ - any remote tracking branches that reference them. Returns a list of+ - all removed branches.+ -}+removeTrackingBranches :: MissingObjects -> GoodCommits -> Repo -> IO ([Branch], GoodCommits)+removeTrackingBranches missing goodcommits r =+ go [] goodcommits =<< filter istrackingbranch <$> getAllRefs r+ where+ istrackingbranch b = "refs/remotes/" `isPrefixOf` show b+ go removed gcs [] = return (removed, gcs)+ go removed gcs (b:bs) = do+ (ok, gcs') <- verifyCommit missing gcs b r+ if ok+ then go removed gcs' bs+ else do+ nukeBranchRef b r+ go (b:removed) gcs' bs++{- Gets all refs, including ones that are corrupt.+ - git show-ref does not output refs to commits that are directly+ - corrupted, so it is not used.+ -}+getAllRefs :: Repo -> IO [Ref]+getAllRefs r = do+ packedrs <- mapMaybe parsePacked . lines+ <$> catchDefaultIO "" (readFile $ packedRefsFile r)+ loosers <- map toref <$> dirContentsRecursive refdir+ return $ packedrs ++ loosers+ where+ refdir = localGitDir r </> "refs"+ toref = Ref . relPathDirToFile (localGitDir r)++packedRefsFile :: Repo -> FilePath+packedRefsFile r = localGitDir r </> "packed-refs"++parsePacked :: String -> Maybe Ref+parsePacked l = case words l of+ (sha:ref:[])+ | isJust (extractSha sha) -> Just $ Ref ref+ _ -> Nothing++{- git-branch -d cannot be used to remove a branch that is directly+ - pointing to a corrupt commit. However, it's tried first. -}+nukeBranchRef :: Branch -> Repo -> IO ()+nukeBranchRef b r = void $ usegit <||> byhand+ where+ usegit = runBool+ [ Param "branch"+ , Params "-r -d"+ , Param $ show $ Ref.base b+ ] r+ byhand = do+ nukeFile $ localGitDir r </> show b+ whenM (doesFileExist packedrefs) $+ withTmpFile "packed-refs" $ \tmp h -> do+ ls <- lines <$> readFile packedrefs+ hPutStr h $ unlines $+ filter (not . skiprefline) ls+ hClose h+ renameFile tmp packedrefs+ return True+ skiprefline l = case parsePacked l of+ Just packedref+ | packedref == b -> True+ _ -> False+ packedrefs = packedRefsFile r++{- Finds the most recent commit to a branch that does not need any+ - of the missing objects. If the input branch is good as-is, returns it.+ - Otherwise, tries to traverse the commits in the branch to find one+ - that is ok. That might fail, if one of them is corrupt, or if an object+ - at the root of the branch is missing. Finally, looks for an old version+ - of the branch from the reflog.+ -}+findUncorruptedCommit :: MissingObjects -> GoodCommits -> Branch -> Repo -> IO (Maybe Sha, GoodCommits)+findUncorruptedCommit missing goodcommits branch r = do+ (ok, goodcommits') <- verifyCommit missing goodcommits branch r+ if ok+ then return (Just branch, goodcommits')+ else do+ (ls, cleanup) <- pipeNullSplit+ [ Param "log"+ , Param "-z"+ , Param "--format=%H"+ , Param (show branch)+ ] r+ let branchshas = catMaybes $ map extractSha ls+ reflogshas <- RefLog.get branch r+ -- XXX Could try a bit harder here, and look+ -- for uncorrupted old commits in branches in the+ -- reflog.+ cleanup `after` findfirst goodcommits (branchshas ++ reflogshas)+ where+ findfirst gcs [] = return (Nothing, gcs)+ findfirst gcs (c:cs) = do+ (ok, gcs') <- verifyCommit missing gcs c r+ if ok+ then return (Just c, gcs')+ else findfirst gcs' cs++{- Verifies tha none of the missing objects in the set are used by+ - the commit. Also adds to a set of commit shas that have been verified to+ - be good, which can be passed into subsequent calls to avoid+ - redundant work when eg, chasing down branches to find the first+ - uncorrupted commit. -}+verifyCommit :: MissingObjects -> GoodCommits -> Sha -> Repo -> IO (Bool, GoodCommits)+verifyCommit missing goodcommits commit r+ | checkGoodCommit commit goodcommits = return (True, goodcommits)+ | otherwise = do+ (ls, cleanup) <- pipeNullSplit+ [ Param "log"+ , Param "-z"+ , Param "--format=%H %T"+ , Param (show commit)+ ] r+ let committrees = map parse ls+ if any isNothing committrees || null committrees+ then do+ void cleanup+ return (False, goodcommits)+ else do+ let cts = catMaybes committrees+ ifM (cleanup <&&> check cts)+ ( return (True, addGoodCommits (map fst cts) goodcommits)+ , return (False, goodcommits)+ )+ where+ parse l = case words l of+ (commitsha:treesha:[]) -> (,)+ <$> extractSha commitsha+ <*> extractSha treesha+ _ -> Nothing+ check [] = return True+ check ((c, t):rest)+ | checkGoodCommit c goodcommits = return True+ | otherwise = verifyTree missing t r <&&> check rest++{- Verifies that a tree is good, including all trees and blobs+ - referenced by it. -}+verifyTree :: MissingObjects -> Sha -> Repo -> IO Bool+verifyTree missing treesha r+ | S.member treesha missing = return False+ | otherwise = do+ (ls, cleanup) <- pipeNullSplit (LsTree.lsTreeParams treesha) r+ let objshas = map (extractSha . LsTree.sha . LsTree.parseLsTree) ls+ if any isNothing objshas || any (`S.member` missing) (catMaybes objshas)+ then do+ void cleanup+ return False+ -- as long as ls-tree succeeded, we're good+ else cleanup++{- Checks that the index file only refers to objects that are not missing. -}+checkIndex :: MissingObjects -> Repo -> IO Bool+checkIndex missing r = do+ (bad, _good, cleanup) <- partitionIndex missing r+ if null bad+ then cleanup+ else do+ void cleanup+ return False++partitionIndex :: MissingObjects -> Repo -> IO ([LsFiles.StagedDetails], [LsFiles.StagedDetails], IO Bool)+partitionIndex missing r = do+ (indexcontents, cleanup) <- LsFiles.stagedDetails [repoPath r] r+ let (bad, good) = partition ismissing indexcontents+ return (bad, good, cleanup)+ where+ getblob (_file, Just sha, Just _mode) = Just sha+ getblob _ = Nothing+ ismissing = maybe False (`S.member` missing) . getblob++{- Rewrites the index file, removing from it any files whose blobs are+ - missing. Returns the list of affected files. -}+rewriteIndex :: MissingObjects -> Repo -> IO [FilePath]+rewriteIndex missing r+ | repoIsLocalBare r = return []+ | otherwise = do+ (bad, good, cleanup) <- partitionIndex missing r+ unless (null bad) $ do+ nukeFile (localGitDir r </> "index")+ UpdateIndex.streamUpdateIndex r+ =<< (catMaybes <$> mapM reinject good)+ void cleanup+ return $ map fst3 bad+ where+ reinject (file, Just sha, Just mode) = case toBlobType mode of+ Nothing -> return Nothing+ Just blobtype -> Just <$>+ UpdateIndex.stageFile sha blobtype file r+ reinject _ = return Nothing++newtype GoodCommits = GoodCommits (S.Set Sha)++emptyGoodCommits :: GoodCommits+emptyGoodCommits = GoodCommits S.empty++checkGoodCommit :: Sha -> GoodCommits -> Bool+checkGoodCommit sha (GoodCommits s) = S.member sha s++addGoodCommits :: [Sha] -> GoodCommits -> GoodCommits+addGoodCommits shas (GoodCommits s) = GoodCommits $+ S.union s (S.fromList shas)++displayList :: [String] -> String -> IO ()+displayList items header+ | null items = return ()+ | otherwise = do+ putStrLn header+ putStr $ unlines $ map (\i -> "\t" ++ i) truncateditems+ where+ numitems = length items+ truncateditems+ | numitems > 10 = take 10 items ++ ["(and " ++ show (numitems - 10) ++ " more)"]+ | otherwise = items++{- Put it all together. -}+runRepair :: Bool -> Repo -> IO (Bool, MissingObjects, [Branch])+runRepair forced g = do+ putStrLn "Running git fsck ..."+ fsckresult <- findBroken False g+ if foundBroken fsckresult+ then runRepairOf fsckresult forced g+ else do+ putStrLn "No problems found."+ return (True, S.empty, [])+runRepairOf :: FsckResults -> Bool -> Repo -> IO (Bool, MissingObjects, [Branch])+runRepairOf fsckresult forced g = do+ missing <- cleanCorruptObjects fsckresult g+ stillmissing <- retrieveMissingObjects missing g+ if S.null stillmissing+ then successfulfinish stillmissing []+ else do+ putStrLn $ unwords+ [ show (S.size stillmissing)+ , "missing objects could not be recovered!"+ ]+ if forced+ then continuerepairs stillmissing+ else unsuccessfulfinish stillmissing+ where+ continuerepairs stillmissing = do+ (remotebranches, goodcommits) <- removeTrackingBranches stillmissing emptyGoodCommits g+ unless (null remotebranches) $+ putStrLn $ unwords+ [ "removed"+ , show (length remotebranches)+ , "remote tracking branches that referred to missing objects"+ ]+ (resetbranches, deletedbranches, _) <- resetLocalBranches stillmissing goodcommits g+ displayList (map show resetbranches)+ "Reset these local branches to old versions before the missing objects were committed:"+ displayList (map show deletedbranches)+ "Deleted these local branches, which could not be recovered due to missing objects:"+ deindexedfiles <- rewriteIndex stillmissing g+ displayList deindexedfiles+ "Removed these missing files from the index. You should look at what files are present in your working tree and git add them back to the index when appropriate."+ let modifiedbranches = resetbranches ++ deletedbranches+ if null resetbranches && null deletedbranches+ then successfulfinish stillmissing modifiedbranches+ else do+ unless (repoIsLocalBare g) $ do+ mcurr <- Branch.currentUnsafe g+ case mcurr of+ Nothing -> return ()+ Just curr -> when (any (== curr) modifiedbranches) $ do+ putStrLn $ unwords+ [ "You currently have"+ , show curr+ , "checked out. You may have staged changes in the index that can be committed to recover the lost state of this branch!"+ ]+ putStrLn "Successfully recovered repository!"+ putStrLn "Please carefully check that the changes mentioned above are ok.."+ return (True, stillmissing, modifiedbranches)+ successfulfinish stillmissing modifiedbranches = do+ mapM_ putStrLn+ [ "Successfully recovered repository!"+ , "You should run \"git fsck\" to make sure, but it looks like"+ , "everything was recovered ok."+ ]+ return (True, stillmissing, modifiedbranches)+ unsuccessfulfinish stillmissing = do+ if repoIsLocalBare g+ then do+ putStrLn "If you have a clone of this bare repository, you should add it as a remote of this repository, and re-run git-recover-repository."+ putStrLn "If there are no clones of this repository, you can instead run git-recover-repository with the --force parameter to force recovery to a possibly usable state."+ else putStrLn "To force a recovery to a usable state, run this command again with the --force parameter."+ return (False, stillmissing, [])
@@ -9,6 +9,7 @@ import Network.URI import qualified Data.Map as M+import System.Posix.Types {- Support repositories on local disk, and repositories accessed via an URL. -@@ -81,3 +82,9 @@ readBlobType "100755" = Just ExecutableBlob readBlobType "120000" = Just SymlinkBlob readBlobType _ = Nothing++toBlobType :: FileMode -> Maybe BlobType+toBlobType 0o100644 = Just FileBlob+toBlobType 0o100755 = Just ExecutableBlob+toBlobType 0o120000 = Just SymlinkBlob+toBlobType _ = Nothing
@@ -13,6 +13,7 @@ streamUpdateIndex, lsTree, updateIndexLine,+ stageFile, unstageFile, stageSymlink ) where@@ -60,6 +61,11 @@ updateIndexLine :: Sha -> BlobType -> TopFilePath -> String updateIndexLine sha filetype file = show filetype ++ " blob " ++ show sha ++ "\t" ++ indexPath file++stageFile :: Sha -> BlobType -> FilePath -> Repo -> IO Streamer+stageFile sha filetype file repo = do+ p <- toTopFilePath file repo+ return $ pureStreamer $ updateIndexLine sha filetype p {- A streamer that removes a file from the index. -} unstageFile :: FilePath -> Repo -> IO Streamer
@@ -34,6 +34,7 @@ import qualified Command.InitRemote import qualified Command.EnableRemote import qualified Command.Fsck+import qualified Command.Repair import qualified Command.Unused import qualified Command.DropUnused import qualified Command.AddUnused@@ -54,6 +55,7 @@ import qualified Command.Dead import qualified Command.Group import qualified Command.Content+import qualified Command.Schedule import qualified Command.Ungroup import qualified Command.Vicfg import qualified Command.Sync@@ -117,6 +119,7 @@ , Command.Dead.def , Command.Group.def , Command.Content.def+ , Command.Schedule.def , Command.Ungroup.def , Command.Vicfg.def , Command.FromKey.def@@ -128,6 +131,7 @@ , Command.ReKey.def , Command.Fix.def , Command.Fsck.def+ , Command.Repair.def , Command.Unused.def , Command.DropUnused.def , Command.AddUnused.def
@@ -238,7 +238,8 @@ addTimeLimit :: String -> Annex () addTimeLimit s = do- let seconds = fromMaybe (error "bad time-limit") $ parseDuration s+ let seconds = maybe (error "bad time-limit") durationToPOSIXTime $+ parseDuration s start <- liftIO getPOSIXTime let cutoff = start + seconds addLimit $ Right $ const $ const $ do
@@ -1,6 +1,6 @@ {- git-annex file locations -- - Copyright 2010-2011 Joey Hess <joey@kitenet.net>+ - Copyright 2010-2013 Joey Hess <joey@kitenet.net> - - Licensed under the GNU GPL version 3 or higher. -}@@ -10,6 +10,7 @@ fileKey, keyPaths, keyPath,+ annexDir, objectDir, gitAnnexLocation, gitAnnexLink,@@ -27,6 +28,8 @@ gitAnnexBadLocation, gitAnnexUnusedLog, gitAnnexFsckState,+ gitAnnexFsckResultsLog,+ gitAnnexScheduleState, gitAnnexTransferDir, gitAnnexCredsDir, gitAnnexFeedStateDir,@@ -35,7 +38,7 @@ gitAnnexJournalDir, gitAnnexJournalLock, gitAnnexIndex,- gitAnnexIndexLock,+ gitAnnexIndexStatus, gitAnnexIgnoredRefs, gitAnnexPidFile, gitAnnexDaemonStatusFile,@@ -51,6 +54,7 @@ annexHashes, hashDirMixed, hashDirLower,+ preSanitizeKeyName, prop_idempotent_fileKey ) where@@ -58,10 +62,12 @@ import Data.Bits import Data.Word import Data.Hash.MD5+import Data.Char import Common import Types import Types.Key+import Types.UUID import qualified Git {- Conventions:@@ -189,6 +195,15 @@ gitAnnexFsckState :: Git.Repo -> FilePath gitAnnexFsckState r = gitAnnexDir r </> "fsckstate" +{- .git/annex/fsckresults/uuid is used to store results of git fscks -}+gitAnnexFsckResultsLog :: UUID -> Git.Repo -> FilePath+gitAnnexFsckResultsLog u r = gitAnnexDir r </> "fsckresults" </> fromUUID u++{- .git/annex/schedulestate is used to store information about when+ - scheduled jobs were last run. -}+gitAnnexScheduleState :: Git.Repo -> FilePath+gitAnnexScheduleState r = gitAnnexDir r </> "schedulestate"+ {- .git/annex/creds/ is used to store credentials to access some special - remotes. -} gitAnnexCredsDir :: Git.Repo -> FilePath@@ -223,9 +238,12 @@ gitAnnexIndex :: Git.Repo -> FilePath gitAnnexIndex r = gitAnnexDir r </> "index" -{- Lock file for .git/annex/index. -}-gitAnnexIndexLock :: Git.Repo -> FilePath-gitAnnexIndexLock r = gitAnnexDir r </> "index.lck"+{- Holds the ref of the git-annex branch that the index was last updated to.+ -+ - The .lck in the name is a historical accident; this is not used as a+ - lock. -}+gitAnnexIndexStatus :: Git.Repo -> FilePath+gitAnnexIndexStatus r = gitAnnexDir r </> "index.lck" {- List of refs that should not be merged into the git-annex branch. -} gitAnnexIgnoredRefs :: Git.Repo -> FilePath@@ -281,6 +299,32 @@ isLinkToAnnex :: FilePath -> Bool isLinkToAnnex s = (pathSeparator:objectDir) `isInfixOf` s +{- Sanitizes a String that will be used as part of a Key's keyName,+ - dealing with characters that cause problems on substandard filesystems.+ -+ - This is used when a new Key is initially being generated, eg by getKey.+ - Unlike keyFile and fileKey, it does not need to be a reversable+ - escaping. Also, it's ok to change this to add more problimatic+ - characters later. Unlike changing keyFile, which could result in the+ - filenames used for existing keys changing and contents getting lost.+ -+ - It is, however, important that the input and output of this function+ - have a 1:1 mapping, to avoid two different inputs from mapping to the+ - same key.+ -}+preSanitizeKeyName :: String -> String+preSanitizeKeyName = concatMap escape+ where+ escape c+ | isAsciiUpper c || isAsciiLower c || isDigit c = [c]+ | c `elem` ".-_ " = [c] -- common, assumed safe+ | c `elem` "/%:" = [c] -- handled by keyFile+ -- , is safe and uncommon, so will be used to escape+ -- other characters. By itself, it is escaped to + -- doubled form.+ | c == ',' = ",,"+ | otherwise = ',' : show(ord(c))+ {- Converts a key into a filename fragment without any directory. - - Escape "/" in the key name, to keep a flat tree of files and avoid@@ -290,13 +334,30 @@ - a slash - "%" is escaped to "&s", and "&" to "&a"; this ensures that the mapping - is one to one.- - ":" is escaped to "&c", because despite it being 2011, people still care- - about FAT.+ - ":" is escaped to "&c", because it seemed like a good idea at the time.+ -+ - Changing what this function escapes and how is not a good idea, as it+ - can cause existing objects to get lost. -} keyFile :: Key -> FilePath keyFile key = replace "/" "%" $ replace ":" "&c" $ replace "%" "&s" $ replace "&" "&a" $ key2file key +{- Reverses keyFile, converting a filename fragment (ie, the basename of+ - the symlink target) into a key. -}+fileKey :: FilePath -> Maybe Key+fileKey file = file2key $+ replace "&a" "&" $ replace "&s" "%" $+ replace "&c" ":" $ replace "%" "/" file++{- for quickcheck -}+prop_idempotent_fileKey :: String -> Bool+prop_idempotent_fileKey s+ | null s = True -- it's not legal for a key to have no keyName+ | otherwise= Just k == fileKey (keyFile k)+ where+ k = stubKey { keyName = s, keyBackendName = "test" }+ {- A location to store a key on the filesystem. A directory hash is used, - to protect against filesystems that dislike having many items in a - single directory.@@ -312,19 +373,6 @@ {- All possibile locations to store a key using different directory hashes. -} keyPaths :: Key -> [FilePath] keyPaths key = map (keyPath key) annexHashes--{- Reverses keyFile, converting a filename fragment (ie, the basename of- - the symlink target) into a key. -}-fileKey :: FilePath -> Maybe Key-fileKey file = file2key $- replace "&a" "&" $ replace "&s" "%" $- replace "&c" ":" $ replace "%" "/" file--{- for quickcheck -}-prop_idempotent_fileKey :: String -> Bool-prop_idempotent_fileKey s = Just k == fileKey (keyFile k)- where- k = stubKey { keyName = s, keyBackendName = "test" } {- Two different directory hashes may be used. The mixed case hash - came first, and is fine, except for the problem of case-strict
@@ -28,6 +28,7 @@ , trustLog , groupLog , preferredContentLog+ , scheduleLog ] {- All the ways to get a key from a presence log file -}@@ -51,6 +52,9 @@ preferredContentLog :: FilePath preferredContentLog = "preferred-content.log"++scheduleLog :: FilePath+scheduleLog = "schedule.log" {- The pathname of the location log file for a given key. -} locationLogFile :: Key -> String
@@ -0,0 +1,43 @@+{- git-annex fsck results log files+ -+ - Copyright 2013 Joey Hess <joey@kitenet.net>+ -+ - Licensed under the GNU GPL version 3 or higher.+ -}++module Logs.FsckResults (+ writeFsckResults,+ readFsckResults+) where++import Common.Annex+import Utility.Tmp+import Git.Fsck+import Git.Types++import qualified Data.Set as S++writeFsckResults :: UUID -> FsckResults -> Annex ()+writeFsckResults u fsckresults = do+ logfile <- fromRepo $ gitAnnexFsckResultsLog u+ liftIO $ + case fsckresults of+ Nothing -> store S.empty logfile+ Just s+ | S.null s -> nukeFile logfile+ | otherwise -> store s logfile+ where+ store s logfile = do + createDirectoryIfMissing True (parentDir logfile)+ liftIO $ viaTmp writeFile logfile $ serialize s+ serialize = unlines . map show . S.toList++readFsckResults :: UUID -> Annex FsckResults+readFsckResults u = do+ logfile <- fromRepo $ gitAnnexFsckResultsLog u+ liftIO $ catchDefaultIO (Just S.empty) $+ deserialize <$> readFile logfile+ where+ deserialize l = + let s = S.fromList $ map Ref $ lines l+ in if S.null s then Nothing else Just s
@@ -0,0 +1,72 @@+{- git-annex scheduled activities log+ -+ - Copyright 2013 Joey Hess <joey@kitenet.net>+ -+ - Licensed under the GNU GPL version 3 or higher.+ -}++module Logs.Schedule (+ scheduleLog,+ scheduleSet,+ scheduleAdd,+ scheduleRemove,+ scheduleChange,+ scheduleGet,+ scheduleMap,+ getLastRunTimes,+ setLastRunTime,+) where++import qualified Data.Map as M+import qualified Data.Set as S+import Data.Time.Clock.POSIX+import Data.Time.LocalTime++import Common.Annex+import Types.ScheduledActivity+import qualified Annex.Branch+import Logs+import Logs.UUIDBased+import Utility.Tmp++scheduleSet :: UUID -> [ScheduledActivity] -> Annex ()+scheduleSet uuid@(UUID _) activities = do+ ts <- liftIO getPOSIXTime+ Annex.Branch.change scheduleLog $+ showLog id . changeLog ts uuid val . parseLog Just+ where+ val = fromScheduledActivities activities+scheduleSet NoUUID _ = error "unknown UUID; cannot modify"++scheduleMap :: Annex (M.Map UUID [ScheduledActivity])+scheduleMap = simpleMap+ . parseLogWithUUID parser+ <$> Annex.Branch.get scheduleLog+ where+ parser _uuid = eitherToMaybe . parseScheduledActivities++scheduleGet :: UUID -> Annex (S.Set ScheduledActivity)+scheduleGet u = do+ m <- scheduleMap+ return $ maybe S.empty S.fromList (M.lookup u m)++scheduleRemove :: UUID -> ScheduledActivity -> Annex ()+scheduleRemove u activity = scheduleChange u $ S.delete activity++scheduleAdd :: UUID -> ScheduledActivity -> Annex ()+scheduleAdd u activity = scheduleChange u $ S.insert activity++scheduleChange :: UUID -> (S.Set ScheduledActivity -> S.Set ScheduledActivity) -> Annex ()+scheduleChange u a = scheduleSet u . S.toList . a =<< scheduleGet u++getLastRunTimes :: Annex (M.Map ScheduledActivity LocalTime)+getLastRunTimes = do+ f <- fromRepo gitAnnexScheduleState+ liftIO $ fromMaybe M.empty+ <$> catchDefaultIO Nothing (readish <$> readFile f)++setLastRunTime :: ScheduledActivity -> LocalTime -> Annex ()+setLastRunTime activity lastrun = do+ f <- fromRepo gitAnnexScheduleState+ liftIO . viaTmp writeFile f . show . M.insert activity lastrun+ =<< getLastRunTimes
@@ -2,7 +2,6 @@ all=git-annex $(mans) docs GHC?=ghc-GHCMAKE=$(GHC) $(GHCFLAGS) --make PREFIX?=/usr CABAL?=cabal # set to "./Setup" if you lack a cabal program @@ -28,8 +27,15 @@ git-annex-shell.1: doc/git-annex-shell.mdwn ./Build/mdwn2man git-annex-shell 1 doc/git-annex-shell.mdwn > git-annex-shell.1 +# These are not built normally. git-union-merge.1: doc/git-union-merge.mdwn ./Build/mdwn2man git-union-merge 1 doc/git-union-merge.mdwn > git-union-merge.1+git-recover-repository.1: doc/git-recover-repository.mdwn+ ./Build/mdwn2man git-recover-repository 1 doc/git-recover-repository.mdwn > git-recover-repository.1+git-union-merge:+ $(GHC) --make -threaded $@+git-recover-repository:+ $(GHC) --make -threaded $@ install-mans: $(mans) install -d $(DESTDIR)$(PREFIX)/share/man/man1@@ -75,7 +81,8 @@ rm -rf tmp dist git-annex $(mans) configure *.tix .hpc \ doc/.ikiwiki html dist tags Build/SysConfig.hs build-stamp \ Setup Build/InstallDesktopFile Build/EvilSplicer \- Build/Standalone Build/OSXMkLibs+ Build/Standalone Build/OSXMkLibs \+ git-union-merge git-recover-repository find -name \*.o -exec rm {} \; find -name \*.hi -exec rm {} \; @@ -214,4 +221,4 @@ hdevtools --stop-server || true hdevtools check git-annex.hs -g -cpp -g -i -g -idist/build/git-annex/git-annex-tmp -g -i. -g -idist/build/autogen -g -Idist/build/autogen -g -Idist/build/git-annex/git-annex-tmp -g -IUtility -g -DWITH_TESTSUITE -g -DWITH_S3 -g -DWITH_ASSISTANT -g -DWITH_INOTIFY -g -DWITH_DBUS -g -DWITH_PAIRING -g -DWITH_XMPP -g -optP-include -g -optPdist/build/autogen/cabal_macros.h -g -odir -g dist/build/git-annex/git-annex-tmp -g -hidir -g dist/build/git-annex/git-annex-tmp -g -stubdir -g dist/build/git-annex/git-annex-tmp -g -threaded -g -Wall -g -XHaskell98 -g -XPackageImports -.PHONY: git-annex tags build-stamp+.PHONY: git-annex git-union-merge git-recover-repository tags build-stamp
@@ -16,6 +16,7 @@ hasKey, hasKeyCheap, whereisKey,+ remoteFsck, remoteTypes, remoteList,
@@ -63,6 +63,7 @@ , hasKey = checkPresent r bupr' , hasKeyCheap = bupLocal buprepo , whereisKey = Nothing+ , remoteFsck = Nothing , config = c , repo = r , gitconfig = gc
@@ -54,6 +54,7 @@ hasKey = checkPresent dir chunksize, hasKeyCheap = True, whereisKey = Nothing,+ remoteFsck = Nothing, config = M.empty, repo = r, gitconfig = gc,
@@ -107,6 +107,7 @@ , hasKey = checkPresent this rsyncopts , hasKeyCheap = repoCheap r , whereisKey = Nothing+ , remoteFsck = Nothing , config = M.empty , localpath = localpathCalc r , repo = r
@@ -42,10 +42,13 @@ #ifndef mingw32_HOST_OS import Utility.CopyFile #endif+import Utility.Env+import Utility.Batch import Remote.Helper.Git import Remote.Helper.Messages import qualified Remote.Helper.Ssh as Ssh import qualified Remote.GCrypt+import Config.Files import Control.Concurrent import Control.Concurrent.MSampleVar@@ -111,6 +114,9 @@ , hasKey = inAnnex r , hasKeyCheap = repoCheap r , whereisKey = Nothing+ , remoteFsck = if Git.repoIsUrl r+ then Nothing+ else Just $ fsckOnRemote r , config = M.empty , localpath = localpathCalc r , repo = r@@ -241,7 +247,7 @@ where checkhttp headers = do showChecking r- ifM (anyM (\u -> Url.withUserAgent $ Url.check u headers (keySize key)) (keyUrls r key))+ ifM (anyM (\u -> Url.withUserAgent $ Url.checkBoth u headers (keySize key)) (keyUrls r key)) ( return $ Right True , return $ Left "not found" )@@ -395,6 +401,23 @@ Annex.Content.getViaTmpChecked (liftIO checksuccessio) key (\d -> rsyncOrCopyFile params object d p) )++fsckOnRemote :: Git.Repo -> [CommandParam] -> Annex (IO Bool)+fsckOnRemote r params+ | Git.repoIsUrl r = do+ s <- Ssh.git_annex_shell r "fsck" params []+ return $ case s of+ Nothing -> return False+ Just (c, ps) -> batchCommand c ps+ | otherwise = return $ do+ program <- readProgramFile+ env <- getEnvironment+ r' <- Git.Config.read r+ let env' =+ [ ("GIT_WORK_TREE", Git.repoPath r')+ , ("GIT_DIR", Git.localGitDir r')+ ] ++ env+ batchCommandEnv program (Param "fsck" : params) (Just env') {- Runs an action on a local repository inexpensively, by making an annex - monad using that repository. -}
@@ -59,6 +59,7 @@ hasKey = checkPresent this, hasKeyCheap = False, whereisKey = Nothing,+ remoteFsck = Nothing, config = c, repo = r, gitconfig = gc,
@@ -73,7 +73,7 @@ run starthook Annex.addCleanup (remoteid ++ "-stop-command") $ runstop lck-#ifndef __WINDOWS__+#ifndef mingw32_HOST_OS runstop lck = do -- Drop any shared lock we have, and take an -- exclusive lock, without blocking. If the lock
@@ -52,6 +52,7 @@ hasKey = checkPresent r hooktype, hasKeyCheap = False, whereisKey = Nothing,+ remoteFsck = Nothing, config = M.empty, localpath = Nothing, repo = r,
@@ -79,6 +79,7 @@ , hasKey = checkPresent r o , hasKeyCheap = False , whereisKey = Nothing+ , remoteFsck = Nothing , config = M.empty , repo = r , gitconfig = gc
@@ -62,6 +62,7 @@ hasKey = checkPresent this, hasKeyCheap = False, whereisKey = Nothing,+ remoteFsck = Nothing, config = c, repo = r, gitconfig = gc,@@ -101,23 +102,24 @@ archiveorg = do showNote "Internet Archive mode"- maybe (error "specify bucket=") (const noop) $- getBucket archiveconfig- writeUUIDFile archiveconfig u- use archiveconfig- where- archiveconfig =+ -- Ensure user enters a valid bucket name, since+ -- this determines the name of the archive.org item.+ let bucket = replace " " "-" $ map toLower $+ fromMaybe (error "specify bucket=") $+ getBucket c+ let archiveconfig = -- hS3 does not pass through x-archive-* headers M.mapKeys (replace "x-archive-" "x-amz-") $ -- encryption does not make sense here M.insert "encryption" "none" $+ M.insert "bucket" bucket $ M.union c $ -- special constraints on key names M.insert "mungekeys" "ia" $ -- bucket created only when files are uploaded- M.insert "x-amz-auto-make-bucket" "1" $- -- no default bucket name; should be human-readable- M.delete "bucket" defaults+ M.insert "x-amz-auto-make-bucket" "1" defaults+ writeUUIDFile archiveconfig u+ use archiveconfig store :: Remote -> Key -> AssociatedFile -> MeterUpdate -> Annex Bool store r k _f p = s3Action r False $ \(conn, bucket) ->
@@ -56,6 +56,7 @@ hasKey = checkKey, hasKeyCheap = False, whereisKey = Just getUrls,+ remoteFsck = Nothing, config = M.empty, gitconfig = gc, localpath = Nothing,@@ -118,7 +119,7 @@ #endif DefaultDownloader -> do headers <- getHttpHeaders- Right <$> Url.withUserAgent (Url.check u' headers $ keySize key)+ Right <$> Url.withUserAgent (Url.checkBoth u' headers $ keySize key) where firsthit [] miss _ = return miss firsthit (u:rest) _ a = do
@@ -65,6 +65,7 @@ hasKey = checkPresent this, hasKeyCheap = False, whereisKey = Nothing,+ remoteFsck = Nothing, config = c, repo = r, gitconfig = gc,
@@ -60,7 +60,8 @@ withPathContents a params = map a . concat <$> liftIO (mapM get params) where get p = ifM (isDirectory <$> getFileStatus p)- ( map (\f -> (f, makeRelative (parentDir p) f)) <$> dirContentsRecursive p+ ( map (\f -> (f, makeRelative (parentDir p) f))+ <$> dirContentsRecursiveSkipping (".git" `isSuffixOf`) p , return [(p, takeFileName p)] )
@@ -59,6 +59,8 @@ import qualified Utility.Matcher import qualified Utility.Exception import qualified Utility.Hash+import qualified Utility.Scheduled+import qualified Utility.HumanTime #ifndef mingw32_HOST_OS import qualified GitAnnex import qualified Remote.Helper.Encryptable@@ -117,6 +119,7 @@ , check "prop_idempotent_deencode" Utility.Format.prop_idempotent_deencode , check "prop_idempotent_fileKey" Locations.prop_idempotent_fileKey , check "prop_idempotent_key_encode" Types.Key.prop_idempotent_key_encode+ , check "prop_idempotent_key_decode" Types.Key.prop_idempotent_key_decode , check "prop_idempotent_shellEscape" Utility.SafeCommand.prop_idempotent_shellEscape , check "prop_idempotent_shellEscape_multiword" Utility.SafeCommand.prop_idempotent_shellEscape_multiword , check "prop_logs_sane" Logs.prop_logs_sane@@ -138,6 +141,8 @@ , check "prop_read_show_TrustLevel" Types.TrustLevel.prop_read_show_TrustLevel , check "prop_parse_show_TrustLog" Logs.Trust.prop_parse_show_TrustLog , check "prop_hashes_stable" Utility.Hash.prop_hashes_stable+ , check "prop_schedule_roundtrips" Utility.Scheduled.prop_schedule_roundtrips+ , check "prop_duration_roundtrips" Utility.HumanTime.prop_duration_roundtrips ] where check desc prop = do@@ -715,25 +720,20 @@ - thought the file was still in r2 -} git_annex_expectoutput env "find" ["--in", "r2"] [] -{- Regression test for the automatic conflict resolution bug fixed- - in f4ba19f2b8a76a1676da7bb5850baa40d9c388e2. -} test_conflict_resolution :: TestEnv -> Test test_conflict_resolution env = "automatic conflict resolution" ~:- withtmpclonerepo env False $ \r1 -> do+ TestList [movein_bug, check_mixed_conflict True, check_mixed_conflict False]+ where+ {- Regression test for the automatic conflict resolution bug fixed+ - in f4ba19f2b8a76a1676da7bb5850baa40d9c388e2. -}+ movein_bug = TestCase $ withtmpclonerepo env False $ \r1 -> do withtmpclonerepo env False $ \r2 -> do let rname r = if r == r1 then "r1" else "r2" forM_ [r1, r2] $ \r -> indir env r $ do {- Get all files, see check below. -} git_annex env "get" [] @? "get failed"- {- Set up repos as remotes of each other;- - remove origin since we're going to sync- - some changes to a file. -}- when (r /= r1) $- boolSystem "git" [Params "remote add r1", File ("../../" ++ r1)] @? "remote add"- when (r /= r2) $- boolSystem "git" [Params "remote add r2", File ("../../" ++ r2)] @? "remote add"- boolSystem "git" [Params "remote rm origin"] @? "remote rm"-+ pair r1 r2+ forM_ [r1, r2] $ \r -> indir env r $ do {- Set up a conflict. -} let newcontent = content annexedfile ++ rname r ifM (annexeval Config.isDirect)@@ -755,6 +755,36 @@ - been put in it. -} forM_ [r1, r2] $ \r -> indir env r $ do git_annex env "get" [] @? "unable to get all files after merge conflict resolution in " ++ rname r++ {- Check merge conflict resolution when one side is an annexed+ - file, and the other is a directory. -}+ check_mixed_conflict inr1 = TestCase $ withtmpclonerepo env False $ \r1 ->+ withtmpclonerepo env False $ \r2 -> do+ indir env r1 $ do+ writeFile conflictor "conflictor"+ git_annex env "add" [conflictor] @? "add conflicter failed"+ git_annex env "sync" [] @? "sync failed"+ indir env r2 $ do+ createDirectory conflictor+ writeFile (conflictor </> "subfile") "subfile"+ git_annex env "add" [conflictor] @? "add conflicter failed"+ git_annex env "sync" [] @? "sync failed"+ pair r1 r2+ let r = if inr1 then r1 else r2+ indir env r $ do+ git_annex env "sync" [] @? "sync failed in mixed conflict"+ where+ conflictor = "conflictor"++ {- Set up repos as remotes of each other;+ - remove origin since we're going to sync+ - some changes to a file. -}+ pair r1 r2 = forM_ [r1, r2] $ \r -> indir env r $ do+ when (r /= r1) $+ boolSystem "git" [Params "remote add r1", File ("../../" ++ r1)] @? "remote add"+ when (r /= r2) $+ boolSystem "git" [Params "remote add r2", File ("../../" ++ r2)] @? "remote add"+ boolSystem "git" [Params "remote rm origin"] @? "remote rm" test_map :: TestEnv -> Test test_map env = "git-annex map" ~: intmpclonerepo env $ do
@@ -14,7 +14,8 @@ key2file, file2key, - prop_idempotent_key_encode+ prop_idempotent_key_encode,+ prop_idempotent_key_decode ) where import System.Posix.Types@@ -59,7 +60,7 @@ _ ?: _ = "" file2key :: FilePath -> Maybe Key-file2key s = if key == Just stubKey then Nothing else key+file2key s = if key == Just stubKey || (keyName <$> key) == Just "" then Nothing else key where key = startbackend stubKey s @@ -88,3 +89,8 @@ prop_idempotent_key_encode :: Key -> Bool prop_idempotent_key_encode k = Just k == (file2key . key2file) k++prop_idempotent_key_decode :: FilePath -> Bool+prop_idempotent_key_decode f+ | null f = True -- skip illegal empty filename+ | otherwise = maybe True (\k -> key2file k == f) (file2key f)
@@ -19,6 +19,7 @@ import Config.Cost import Utility.Metered import Git.Remote+import Utility.SafeCommand type RemoteConfigKey = String type RemoteConfig = M.Map RemoteConfigKey String@@ -64,6 +65,10 @@ hasKeyCheap :: Bool, -- Some remotes can provide additional details for whereis. whereisKey :: Maybe (Key -> a [String]),+ -- Some remotes can run a fsck operation on the remote,+ -- without transferring all the data to the local repo+ -- The parameters are passed to the fsck command on the remote.+ remoteFsck :: Maybe ([CommandParam] -> a (IO Bool)), -- a Remote has a persistent configuration store config :: RemoteConfig, -- git repo for the Remote
@@ -0,0 +1,69 @@+{- git-annex scheduled activities+ -+ - Copyright 2013 Joey Hess <joey@kitenet.net>+ -+ - Licensed under the GNU GPL version 3 or higher.+ -}++module Types.ScheduledActivity where++import Common+import Utility.Scheduled+import Utility.HumanTime+import Types.UUID++import Data.Either++data ScheduledActivity + = ScheduledSelfFsck Schedule Duration+ | ScheduledRemoteFsck UUID Schedule Duration+ deriving (Eq, Read, Show, Ord)++{- Activities that run on a remote, within a time window, so+ - should be run when the remote gets connected. -}+connectActivityUUID :: ScheduledActivity -> Maybe UUID+connectActivityUUID (ScheduledRemoteFsck u (Schedule _ AnyTime) _) = Just u+connectActivityUUID _ = Nothing++getSchedule :: ScheduledActivity -> Schedule+getSchedule (ScheduledSelfFsck s _) = s+getSchedule (ScheduledRemoteFsck _ s _) = s++getDuration :: ScheduledActivity -> Duration+getDuration (ScheduledSelfFsck _ d) = d+getDuration (ScheduledRemoteFsck _ _ d) = d++fromScheduledActivity :: ScheduledActivity -> String+fromScheduledActivity (ScheduledSelfFsck s d) = unwords+ [ "fsck self", fromDuration d, fromSchedule s ]+fromScheduledActivity (ScheduledRemoteFsck u s d) = unwords+ [ "fsck", fromUUID u, fromDuration d, fromSchedule s ]++toScheduledActivity :: String -> Maybe ScheduledActivity+toScheduledActivity = eitherToMaybe . parseScheduledActivity++parseScheduledActivity :: String -> Either String ScheduledActivity+parseScheduledActivity s = case words s of+ ("fsck":"self":d:rest) -> qualified $ ScheduledSelfFsck+ <$> parseSchedule (unwords rest)+ <*> getduration d+ ("fsck":u:d:rest) -> qualified $ ScheduledRemoteFsck+ <$> pure (toUUID u)+ <*> parseSchedule (unwords rest)+ <*> getduration d+ _ -> qualified $ Left "unknown activity"+ where+ qualified (Left e) = Left $ e ++ " in \"" ++ s ++ "\""+ qualified v = v+ getduration d = maybe (Left $ "failed to parse duration \""++d++"\"") Right (parseDuration d)++fromScheduledActivities :: [ScheduledActivity] -> String+fromScheduledActivities = intercalate "; " . map fromScheduledActivity++parseScheduledActivities :: String -> Either String [ScheduledActivity]+parseScheduledActivities s+ | null bad = Right good+ | otherwise = Left $ intercalate "; " bad+ where+ (bad, good) = partitionEithers $+ map parseScheduledActivity $ split "; " s
@@ -9,10 +9,15 @@ module Utility.Batch where +import Common+import qualified Build.SysConfig+ #if defined(linux_HOST_OS) || defined(__ANDROID__) import Control.Concurrent.Async import System.Posix.Process #endif+import qualified Control.Exception as E+import System.Process (env) {- Runs an operation, at batch priority. -@@ -38,3 +43,47 @@ maxNice :: Int maxNice = 19++{- Converts a command to run niced. -}+toBatchCommand :: (String, [CommandParam]) -> (String, [CommandParam])+toBatchCommand (command, params) = (command', params')+ where+#ifndef mingw32_HOST_OS+ commandline = unwords $ map shellEscape $ command : toCommand params+ nicedcommand+ | Build.SysConfig.nice = "nice " ++ commandline+ | otherwise = commandline+ command' = "sh"+ params' =+ [ Param "-c"+ , Param $ "exec " ++ nicedcommand+ ]+#else+ command' = command+ params' = params+#endif++{- Runs a command in a way that's suitable for batch jobs that can be+ - interrupted.+ -+ - The command is run niced. If the calling thread receives an async+ - exception, it sends the command a SIGTERM, and after the command+ - finishes shuttting down, it re-raises the async exception. -}+batchCommand :: String -> [CommandParam] -> IO Bool+batchCommand command params = batchCommandEnv command params Nothing++batchCommandEnv :: String -> [CommandParam] -> Maybe [(String, String)] -> IO Bool+batchCommandEnv command params environ = do+ (_, _, _, pid) <- createProcess $ p { env = environ }+ r <- E.try (waitForProcess pid) :: IO (Either E.SomeException ExitCode)+ case r of+ Right ExitSuccess -> return True+ Right _ -> return False+ Left asyncexception -> do+ terminateProcess pid+ void $ waitForProcess pid+ E.throwIO asyncexception+ where+ (command', params') = toBatchCommand (command, params)+ p = proc command' $ toCommand params'+
@@ -16,6 +16,7 @@ #ifndef mingw32_HOST_OS import System.Posix+import Control.Concurrent.Async #else import System.PosixCompat #endif@@ -46,7 +47,9 @@ nullfd <- openFd "/dev/null" ReadOnly Nothing defaultFileFlags redir nullfd stdInput redirLog logfd- a+ {- forkProcess masks async exceptions; unmask them inside+ - the action. -}+ wait =<< asyncWithUnmask (\unmask -> unmask a) out out = exitImmediately ExitSuccess #else
@@ -38,15 +38,20 @@ - and lazily. If the directory does not exist, no exception is thrown, - instead, [] is returned. -} dirContentsRecursive :: FilePath -> IO [FilePath]-dirContentsRecursive topdir = dirContentsRecursive' [topdir]+dirContentsRecursive topdir = dirContentsRecursiveSkipping (const False) topdir -dirContentsRecursive' :: [FilePath] -> IO [FilePath]-dirContentsRecursive' [] = return []-dirContentsRecursive' (dir:dirs) = unsafeInterleaveIO $ do- (files, dirs') <- collect [] [] =<< catchDefaultIO [] (dirContents dir)- files' <- dirContentsRecursive' (dirs' ++ dirs)- return (files ++ files')+{- Skips directories whose basenames match the skipdir. -}+dirContentsRecursiveSkipping :: (FilePath -> Bool) -> FilePath -> IO [FilePath]+dirContentsRecursiveSkipping skipdir topdir = go [topdir] where+ go [] = return []+ go (dir:dirs)+ | skipdir (takeFileName dir) = go dirs+ | otherwise = unsafeInterleaveIO $ do+ (files, dirs') <- collect [] []+ =<< catchDefaultIO [] (dirContents dir)+ files' <- go (dirs' ++ dirs)+ return (files ++ files') collect files dirs' [] = return (reverse files, reverse dirs') collect files dirs' (entry:entries) | dirCruft entry = collect files dirs' entries
@@ -1,13 +1,30 @@ {- Convenience wrapper around cryptohash.- -- - The resulting Digests can be shown to get a canonical hash encoding. -}+ - Falls back to SHA if it's not available.+ -} -module Utility.Hash where+{-# LANGUAGE CPP #-} -import Crypto.Hash+module Utility.Hash (+ sha1,+ sha224,+ sha256,+ sha384,+ sha512,+#ifdef WITH_CRYPTOHASH+ skein256,+ skein512,+#endif+ prop_hashes_stable+) where+ import qualified Data.ByteString.Lazy as L import qualified Data.ByteString.Char8 as C8 +#ifndef WITH_CRYPTOHASH+import Data.Digest.Pure.SHA+#else+import Crypto.Hash+ sha1 :: L.ByteString -> Digest SHA1 sha1 = hashlazy @@ -33,6 +50,8 @@ skein512 :: L.ByteString -> Digest Skein512_512 skein512 = hashlazy +#endif+ {- Check that all the hashes continue to hash the same. -} prop_hashes_stable :: Bool prop_hashes_stable = all (\(hasher, result) -> hasher foo == result)@@ -41,8 +60,10 @@ , (show . sha256, "2c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7ae") , (show . sha384, "98c11ffdfdd540676b1a137cb1a22b2a70350c9a44171d6b1180c6be5cbb2ee3f79d532c8a1dd9ef2e8e08e752a3babb") , (show . sha512, "f7fbba6e0636f890e56fbbf3283e524c6fa3204ae298382d624741d0dc6638326e282c41be5e4254d8820772c5518a2c5a8c0c7f7eda19594a7eb539453e1ed7")+#ifdef WITH_CRYPTOHASH , (show . skein256, "a04efd9a0aeed6ede40fe5ce0d9361ae7b7d88b524aa19917b9315f1ecf00d33") , (show . skein512, "fd8956898113510180aa4658e6c0ac85bd74fb47f4a4ba264a6b705d7a8e8526756e75aecda12cff4f1aca1a4c2830fbf57f458012a66b2b15a3dd7d251690a7")+#endif ] where foo = L.fromChunks [C8.pack "foo"]
@@ -1,26 +1,84 @@ {- Time for humans. -- - Copyright 2012 Joey Hess <joey@kitenet.net>+ - Copyright 2012-2013 Joey Hess <joey@kitenet.net> - - Licensed under the GNU GPL version 3 or higher. -} -module Utility.HumanTime where+module Utility.HumanTime (+ Duration(..),+ durationToPOSIXTime,+ parseDuration,+ fromDuration,+ prop_duration_roundtrips+) where import Utility.PartialPrelude+import Utility.Applicative+import Utility.QuickCheck import Data.Time.Clock.POSIX (POSIXTime)+import Data.Char+import Control.Applicative+import qualified Data.Map as M -{- Parses a human-input time duration, of the form "5h" or "1m". -}-parseDuration :: String -> Maybe POSIXTime-parseDuration s = do- num <- readish s :: Maybe Integer- units <- findUnits =<< lastMaybe s- return $ fromIntegral num * units+newtype Duration = Duration { durationSeconds :: Integer }+ deriving (Eq, Ord, Read, Show)++durationToPOSIXTime :: Duration -> POSIXTime+durationToPOSIXTime = fromIntegral . durationSeconds++{- Parses a human-input time duration, of the form "5h", "1m", "5h1m", etc -}+parseDuration :: String -> Maybe Duration+parseDuration = Duration <$$> go 0 where- findUnits 's' = Just 1- findUnits 'm' = Just 60- findUnits 'h' = Just $ 60 * 60- findUnits 'd' = Just $ 60 * 60 * 24- findUnits 'y' = Just $ 60 * 60 * 24 * 365- findUnits _ = Nothing+ go n [] = return n+ go n s = do+ num <- readish s :: Maybe Integer+ let (c:rest) = dropWhile isDigit s+ u <- M.lookup c unitmap+ go (n + num * u) rest++fromDuration :: Duration -> String+fromDuration Duration { durationSeconds = d }+ | d == 0 = "0s"+ | otherwise = concat $ map showunit $ go [] units d+ where+ showunit (u, n)+ | n > 0 = show n ++ [u]+ | otherwise = ""+ go c [] _ = reverse c+ go c ((u, n):us) v =+ let (q,r) = v `quotRem` n+ in go ((u, q):c) us r++units :: [(Char, Integer)]+units = + [ ('y', ysecs)+ , ('d', dsecs)+ , ('h', hsecs)+ , ('m', msecs)+ , ('s', 1)+ ]++unitmap :: M.Map Char Integer+unitmap = M.fromList units++ysecs :: Integer+ysecs = dsecs * 365++dsecs :: Integer+dsecs = hsecs * 24++hsecs :: Integer+hsecs = msecs * 60++msecs :: Integer+msecs = 60++-- Durations cannot be negative.+instance Arbitrary Duration where+ arbitrary = Duration <$> nonNegative arbitrary++prop_duration_roundtrips :: Duration -> Bool+prop_duration_roundtrips d = parseDuration (fromDuration d) == Just d
@@ -26,8 +26,8 @@ {- lsof is not in PATH on all systems, so SysConfig may have the absolute - path where the program was found. Make sure at runtime that lsof is - available, and if it's not in PATH, adjust PATH to contain it. -}-setupLsof :: IO ()-setupLsof = do+setup :: IO ()+setup = do let cmd = fromMaybe "lsof" SysConfig.lsof when (isAbsolute cmd) $ do path <- getSearchPath
@@ -29,7 +29,7 @@ readFileStrict :: FilePath -> IO String readFileStrict = readFile >=> \s -> length s `seq` return s -{- Like break, but the character matching the condition is not included+{- Like break, but the item matching the condition is not included - in the second result list. - - separate (== ':') "foo:bar" = ("foo", "bar")
@@ -72,17 +72,17 @@ , env = environ } -{- Writes a string to a process on its stdin, +{- Runs an action to write to a process on its stdin, - returns its output, and also allows specifying the environment. -} writeReadProcessEnv :: FilePath -> [String] -> Maybe [(String, String)]- -> String -> (Maybe (Handle -> IO ()))+ -> (Maybe (Handle -> IO ())) -> IO String-writeReadProcessEnv cmd args environ input adjusthandle = do+writeReadProcessEnv cmd args environ writestdin adjusthandle = do (Just inh, Just outh, _, pid) <- createProcess p maybe (return ()) (\a -> a inh) adjusthandle@@ -94,7 +94,7 @@ _ <- forkIO $ E.evaluate (length output) >> putMVar outMVar () -- now write and flush any input- when (not (null input)) $ do hPutStr inh input; hFlush inh+ maybe (return ()) (\a -> a inh >> hFlush inh) writestdin hClose inh -- done with stdin -- wait on the output
@@ -43,3 +43,6 @@ nonNegative :: (Num a, Ord a) => Gen a -> Gen a nonNegative g = g `suchThat` (>= 0)++positive :: (Num a, Ord a) => Gen a -> Gen a+positive g = g `suchThat` (> 0)
@@ -0,0 +1,347 @@+{- scheduled activities+ - + - Copyright 2013 Joey Hess <joey@kitenet.net>+ -+ - Licensed under the GNU GPL version 3 or higher.+ -}++module Utility.Scheduled (+ Schedule(..),+ Recurrance(..),+ ScheduledTime(..),+ NextTime(..),+ nextTime,+ fromSchedule,+ fromScheduledTime,+ toScheduledTime,+ fromRecurrance,+ toRecurrance,+ toSchedule,+ parseSchedule,+ prop_schedule_roundtrips+) where++import Common+import Utility.QuickCheck++import Data.Time.Clock+import Data.Time.LocalTime+import Data.Time.Calendar+import Data.Time.Calendar.WeekDate+import Data.Time.Calendar.OrdinalDate+import Data.Tuple.Utils+import Data.Char++{- Some sort of scheduled event. -}+data Schedule = Schedule Recurrance ScheduledTime+ deriving (Eq, Read, Show, Ord)++data Recurrance+ = Daily+ | Weekly (Maybe WeekDay)+ | Monthly (Maybe MonthDay)+ | Yearly (Maybe YearDay)+ -- Days, Weeks, or Months of the year evenly divisible by a number.+ -- (Divisible Year is years evenly divisible by a number.)+ | Divisible Int Recurrance+ deriving (Eq, Read, Show, Ord)++type WeekDay = Int+type MonthDay = Int+type YearDay = Int++data ScheduledTime+ = AnyTime+ | SpecificTime Hour Minute+ deriving (Eq, Read, Show, Ord)++type Hour = Int+type Minute = Int++{- Next time a Schedule should take effect. The NextTimeWindow is used+ - when a Schedule is allowed to start at some point within the window. -}+data NextTime+ = NextTimeExactly LocalTime+ | NextTimeWindow LocalTime LocalTime+ deriving (Eq, Read, Show)++startTime :: NextTime -> LocalTime+startTime (NextTimeExactly t) = t+startTime (NextTimeWindow t _) = t++nextTime :: Schedule -> Maybe LocalTime -> IO (Maybe NextTime)+nextTime schedule lasttime = do+ now <- getCurrentTime+ tz <- getTimeZone now+ return $ calcNextTime schedule lasttime $ utcToLocalTime tz now++{- Calculate the next time that fits a Schedule, based on the+ - last time it occurred, and the current time. -}+calcNextTime :: Schedule -> Maybe LocalTime -> LocalTime -> Maybe NextTime+calcNextTime (Schedule recurrance scheduledtime) lasttime currenttime+ | scheduledtime == AnyTime = do+ next <- findfromtoday True+ return $ case next of+ NextTimeWindow _ _ -> next+ NextTimeExactly t -> window (localDay t) (localDay t)+ | otherwise = NextTimeExactly . startTime <$> findfromtoday False+ where+ findfromtoday anytime = findfrom recurrance afterday today+ where+ today = localDay currenttime+ afterday = sameaslastday || toolatetoday+ toolatetoday = not anytime && localTimeOfDay currenttime >= nexttime+ sameaslastday = lastday == Just today+ lastday = localDay <$> lasttime+ nexttime = case scheduledtime of+ AnyTime -> TimeOfDay 0 0 0+ SpecificTime h m -> TimeOfDay h m 0+ exactly d = NextTimeExactly $ LocalTime d nexttime+ window startd endd = NextTimeWindow+ (LocalTime startd nexttime)+ (LocalTime endd (TimeOfDay 23 59 0))+ findfrom r afterday day = case r of+ Daily+ | afterday -> Just $ exactly $ addDays 1 day+ | otherwise -> Just $ exactly day+ Weekly Nothing+ | afterday -> skip 1+ | otherwise -> case (wday <$> lastday, wday day) of+ (Nothing, _) -> Just $ window day (addDays 6 day)+ (Just old, curr)+ | old == curr -> Just $ window day (addDays 6 day)+ | otherwise -> skip 1+ Monthly Nothing+ | afterday -> skip 1+ | maybe True (\old -> mnum day > mday old && mday day >= (mday old `mod` minmday)) lastday ->+ -- Window only covers current month,+ -- in case there is a Divisible requirement.+ Just $ window day (endOfMonth day)+ | otherwise -> skip 1+ Yearly Nothing+ | afterday -> skip 1+ | maybe True (\old -> ynum day > ynum old && yday day >= (yday old `mod` minyday)) lastday ->+ Just $ window day (endOfYear day)+ | otherwise -> skip 1+ Weekly (Just w)+ | w < 0 || w > maxwday -> Nothing+ | w == wday day -> if afterday+ then Just $ exactly $ addDays 7 day+ else Just $ exactly day+ | otherwise -> Just $ exactly $+ addDays (fromIntegral $ (w - wday day) `mod` 7) day+ Monthly (Just m)+ | m < 0 || m > maxmday -> Nothing+ -- TODO can be done more efficiently than recursing+ | m == mday day -> if afterday+ then skip 1+ else Just $ exactly day+ | otherwise -> skip 1+ Yearly (Just y)+ | y < 0 || y > maxyday -> Nothing+ | y == yday day -> if afterday+ then skip 365+ else Just $ exactly day+ | otherwise -> skip 1+ Divisible n r'@Daily -> handlediv n r' yday (Just maxyday)+ Divisible n r'@(Weekly _) -> handlediv n r' wnum (Just maxwnum)+ Divisible n r'@(Monthly _) -> handlediv n r' mnum (Just maxmnum)+ Divisible n r'@(Yearly _) -> handlediv n r' ynum Nothing+ Divisible _ r'@(Divisible _ _) -> findfrom r' afterday day+ where+ skip n = findfrom r False (addDays n day)+ handlediv n r' getval mmax+ | n > 0 && maybe True (n <=) mmax =+ findfromwhere r' (divisible n . getval) afterday day+ | otherwise = Nothing+ findfromwhere r p afterday day+ | maybe True (p . getday) next = next+ | otherwise = maybe Nothing (findfromwhere r p True . getday) next+ where+ next = findfrom r afterday day+ getday = localDay . startTime+ divisible n v = v `rem` n == 0++endOfMonth :: Day -> Day+endOfMonth day =+ let (y,m,_d) = toGregorian day+ in fromGregorian y m (gregorianMonthLength y m)++endOfYear :: Day -> Day+endOfYear day =+ let (y,_m,_d) = toGregorian day+ in endOfMonth (fromGregorian y maxmnum 1)++-- extracting various quantities from a Day+wday :: Day -> Int+wday = thd3 . toWeekDate+wnum :: Day -> Int+wnum = snd3 . toWeekDate+mday :: Day -> Int+mday = thd3 . toGregorian+mnum :: Day -> Int+mnum = snd3 . toGregorian+yday :: Day -> Int+yday = snd . toOrdinalDate+ynum :: Day -> Int+ynum = fromIntegral . fst . toOrdinalDate++{- Calendar max and mins. -}+maxyday :: Int+maxyday = 366 -- with leap days+minyday :: Int+minyday = 365+maxwnum :: Int+maxwnum = 53 -- some years have more than 52+maxmday :: Int+maxmday = 31+minmday :: Int+minmday = 28+maxmnum :: Int+maxmnum = 12+maxwday :: Int+maxwday = 7++fromRecurrance :: Recurrance -> String+fromRecurrance (Divisible n r) =+ fromRecurrance' (++ "s divisible by " ++ show n) r+fromRecurrance r = fromRecurrance' ("every " ++) r++fromRecurrance' :: (String -> String) -> Recurrance -> String+fromRecurrance' a Daily = a "day"+fromRecurrance' a (Weekly n) = onday n (a "week")+fromRecurrance' a (Monthly n) = onday n (a "month")+fromRecurrance' a (Yearly n) = onday n (a "year")+fromRecurrance' a (Divisible _n r) = fromRecurrance' a r -- not used++onday :: Maybe Int -> String -> String+onday (Just n) s = "on day " ++ show n ++ " of " ++ s+onday Nothing s = s++toRecurrance :: String -> Maybe Recurrance+toRecurrance s = case words s of+ ("every":"day":[]) -> Just Daily+ ("on":"day":sd:"of":"every":something:[]) -> withday sd something+ ("every":something:[]) -> noday something+ ("days":"divisible":"by":sn:[]) -> + Divisible <$> getdivisor sn <*> pure Daily+ ("on":"day":sd:"of":something:"divisible":"by":sn:[]) -> + Divisible+ <$> getdivisor sn+ <*> withday sd something+ ("every":something:"divisible":"by":sn:[]) -> + Divisible+ <$> getdivisor sn+ <*> noday something+ (something:"divisible":"by":sn:[]) -> + Divisible+ <$> getdivisor sn+ <*> noday something+ _ -> Nothing+ where+ constructor "week" = Just Weekly+ constructor "month" = Just Monthly+ constructor "year" = Just Yearly+ constructor u+ | "s" `isSuffixOf` u = constructor $ reverse $ drop 1 $ reverse u+ | otherwise = Nothing+ withday sd u = do+ c <- constructor u+ d <- readish sd+ Just $ c (Just d)+ noday u = do+ c <- constructor u+ Just $ c Nothing+ getdivisor sn = do+ n <- readish sn+ if n > 0+ then Just n+ else Nothing++fromScheduledTime :: ScheduledTime -> String+fromScheduledTime AnyTime = "any time"+fromScheduledTime (SpecificTime h m) = + show h' ++ (if m > 0 then ":" ++ pad 2 (show m) else "") ++ " " ++ ampm+ where+ pad n s = take (n - length s) (repeat '0') ++ s+ (h', ampm)+ | h == 0 = (12, "AM")+ | h < 12 = (h, "AM")+ | h == 12 = (h, "PM")+ | otherwise = (h - 12, "PM")++toScheduledTime :: String -> Maybe ScheduledTime+toScheduledTime "any time" = Just AnyTime+toScheduledTime v = case words v of+ (s:ampm:[])+ | map toUpper ampm == "AM" ->+ go s (\h -> if h == 12 then 0 else h)+ | map toUpper ampm == "PM" ->+ go s (+ 12)+ | otherwise -> Nothing+ (s:[]) -> go s id+ _ -> Nothing+ where+ go :: String -> (Int -> Int) -> Maybe ScheduledTime+ go s adjust =+ let (h, m) = separate (== ':') s+ in SpecificTime+ <$> (adjust <$> readish h)+ <*> if null m then Just 0 else readish m++fromSchedule :: Schedule -> String+fromSchedule (Schedule recurrance scheduledtime) = unwords+ [ fromRecurrance recurrance+ , "at"+ , fromScheduledTime scheduledtime+ ]++toSchedule :: String -> Maybe Schedule+toSchedule = eitherToMaybe . parseSchedule++parseSchedule :: String -> Either String Schedule+parseSchedule s = do+ r <- maybe (Left $ "bad recurrance: " ++ recurrance) Right+ (toRecurrance recurrance)+ t <- maybe (Left $ "bad time of day: " ++ scheduledtime) Right+ (toScheduledTime scheduledtime)+ Right $ Schedule r t+ where+ (rws, tws) = separate (== "at") (words s)+ recurrance = unwords rws+ scheduledtime = unwords tws++instance Arbitrary Schedule where+ arbitrary = Schedule <$> arbitrary <*> arbitrary++instance Arbitrary ScheduledTime where+ arbitrary = oneof+ [ pure AnyTime+ , SpecificTime + <$> nonNegative arbitrary + <*> nonNegative arbitrary+ ]++instance Arbitrary Recurrance where+ arbitrary = oneof+ [ pure Daily+ , Weekly <$> arbday+ , Monthly <$> arbday+ , Yearly <$> arbday+ , Divisible+ <$> positive arbitrary+ <*> oneof -- no nested Divisibles+ [ pure Daily+ , Weekly <$> arbday+ , Monthly <$> arbday+ , Yearly <$> arbday+ ]+ ]+ where+ arbday = oneof+ [ Just <$> nonNegative arbitrary+ , pure Nothing+ ]++prop_schedule_roundtrips :: Schedule -> Bool+prop_schedule_roundtrips s = toSchedule (fromSchedule s) == Just s
@@ -11,6 +11,7 @@ URLString, UserAgent, check,+ checkBoth, exists, download, downloadQuiet@@ -32,12 +33,18 @@ {- Checks that an url exists and could be successfully downloaded, - also checking that its size, if available, matches a specified size. -}-check :: URLString -> Headers -> Maybe Integer -> Maybe UserAgent -> IO Bool+checkBoth :: URLString -> Headers -> Maybe Integer -> Maybe UserAgent -> IO Bool+checkBoth url headers expected_size ua = do+ v <- check url headers expected_size ua+ return (fst v && snd v)+check :: URLString -> Headers -> Maybe Integer -> Maybe UserAgent -> IO (Bool, Bool) check url headers expected_size = handle <$$> exists url headers where- handle (False, _) = False- handle (True, Nothing) = True- handle (True, s) = expected_size == s+ handle (False, _) = (False, False)+ handle (True, Nothing) = (True, True)+ handle (True, s) = case expected_size of+ Just _ -> (True, expected_size == s)+ Nothing -> (True, True) {- Checks that an url exists and could be successfully downloaded, - also returning its size if available.
@@ -24,7 +24,7 @@ import qualified Data.CaseInsensitive as CI import Network.Socket import Control.Exception-import Crypto.Random+import "crypto-api" Crypto.Random import qualified Web.ClientSession as CS import qualified Data.ByteString.Lazy as L import qualified Data.ByteString.Lazy.UTF8 as L8
@@ -1,3 +1,49 @@+git-annex (4.20131024) unstable; urgency=low++ * webapp: Fix bug when adding a remote and git-remote-gcrypt+ is not installed.+ * The assitant can now run scheduled incremental fsck jobs on the local+ repository and remotes. These can be configured using vicfg or with the+ webapp.+ * repair: New command, which can repair damaged git repositories+ (even ones not using git-annex).+ * webapp: When git repository damange is detected, repairs can be+ done using the webapp UI.+ * Automatically and safely detect and recover from dangling+ .git/annex/index.lock files, which would prevent git from+ committing to the git-annex branch, eg after a crash.+ * assistant: Detect stale git lock files at startup time, and remove them.+ * addurl: Better sanitization of generated filenames.+ * Better sanitization of problem characters when generating URL and WORM+ keys.+ * The control socket path passed to ssh needs to be 17 characters+ shorter than the maximum unix domain socket length, because ssh+ appends stuff to it to make a temporary filename. Closes: #725512+ * status: Fix space leak in local mode, introduced in version 4.20130920.+ * import: Skip .git directories.+ * Remove bogus runshell loop check.+ * addurl: Improve message when adding url with wrong size to existing file.+ * Fixed handling of URL keys that have no recorded size.+ * status: Fix a crash if a temp file went away while its size was+ being checked for status.+ * Deal with git check-attr -z output format change in git 1.8.5.+ * Work around sed output difference that led to version containing a newline+ on OSX.+ * sync: Fix automatic resolution of merge conflicts where one side is an+ annexed file, and the other side is a non-annexed file, or a directory.+ * S3: Try to ensure bucket name is valid for archive.org.+ * assistant: Bug fix: When run in a subdirectory, files from incoming merges+ were wrongly added to that subdirectory, and removed from their original+ locations.+ * Windows: Deal with strange msysgit 1.8.4 behavior of not understanding+ DOS formatted paths for --git-dir and --work-tree.+ * Removed workaround for bug in git 1.8.4r0.+ * Added git-recover-repository command to git-annex source+ (not built by default; this needs to move to someplace else).+ * webapp: Move sidebar to the right hand side of the screen.++ -- Joey Hess <joeyh@debian.org> Thu, 24 Oct 2013 12:59:55 -0400+ git-annex (4.20131002) unstable; urgency=low * Note that the layout of gcrypt repositories has changed, and
@@ -0,0 +1,53 @@+git-annex is now available for Android. This includes the +[[git-annex assistant|/assistant]], for easy syncing between your Android+and other devices. You do not need to root your Android to use git-annex.++[[Android installation instructions|/install/android]]++When you run the git-annex Android app, two windows will open. The first is+a terminal window, and the second is a web browser showing the git-annex+webapp.++[[!img apps.png alt="two windows"]]++[[!toc ]]++## closing and reopening the webapp++The webapp does not need to be left open after you've set up your+repository. As long as the terminal window is left open, git-annex will+remain running and sync your files. To re-open the webapp after closing it,+use the [[!img newwindow.png alt="New Window"]] icon in the terminal window.++## starting git-annex++The app is not currently automatically started on boot, so you will need to+manually open it to keep your files in sync. You do not need to leave the+app running all the time, though. It will sync back up automatically when+started.++## stopping git-annex++Simply close the terminal window to stop git-annex from running.++## using the command line++[[!img terminal.png alt="Android terminal"]]++If you prefer to use `git-annex` at the command line, you can do so using the+terminal. A fairly full set of tools is provided, including `git`, `ssh`,+`rsync`, and `gpg`.++To prevent the webapp from being automatically started+when a terminal window opens, go into the terminal preferences, to "Inital+Command", and clear out the default `git annex webapp` setting.++Or, if you'd like to run the assistant automatically, but not open the+webapp, change the "Initial Command" to: `git annex assistant --autostart`++## using from adb shell++To set up the git-annex environment from within `adb shell`, run:+`/data/data/ga.androidterm/runshell`++This will launch a shell that has git-annex, git, etc in PATH.
@@ -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,8 @@+[[!comment format=mdwn+ username="http://afoolishmanifesto.com/"+ nickname="frioux"+ subject="SSH Keys?"+ date="2013-07-17T16:50:46Z"+ content="""+Is there a way I can use an SSH Key to connect to a remote server? What would be really cool, though maybe not feasible, would be to use connectbot as an ssh-agent.+"""]]
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="4.154.4.90"+ subject="comment 20"+ date="2013-07-17T19:06:31Z"+ content="""+@frioux the webapp has a \"ssh server\" option that will set up a ssh key and use it for passwordless data transfer to a ssh server. You have to enter your password twice in the git-annex terminal app, and then it's set up.++The openssh included in the git-annex app fully supports everything you can usually do with ssh keys, so you can also set this up by hand.+"""]]
@@ -0,0 +1,12 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="4.154.0.21"+ subject="comment 29"+ date="2013-07-30T17:45:27Z"+ content="""+If you are experiencing a problem using git-annex on Android, please examine the list of [[bugs]] and add a new, detailed bug report if no-one has reported the problem. If you are not sure if you have a bug, or need help in filing a good bug report, ask for help in the [[forum]].++I have moved to [[oldcomments]] a lot of old comments about problems that may be fixed or+not (hard to tell without a bug report!) " This page cannot+scale to handle every bug report that someone wants to paste into it.+"""]]
@@ -0,0 +1,16 @@+[[!comment format=mdwn+ username="http://mebus.myopenid.com/"+ ip="2a01:198:3eb:0:4a5b:39ff:fea4:55b3"+ subject="comment 5"+ date="2013-10-19T18:05:52Z"+ content="""+Hallo,++how can I use the app with public/private keys for SSH. Where can I add them?++Thanks++Mebus+++"""]]
@@ -0,0 +1,2 @@+If one of these comments is yours, and you are still experiencing the+problem, please file a proper [[bug_report|bugs]]. --[[Joey]]
@@ -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,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=txt+ 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>+"""]]
binary file changed (absent → 95786 bytes)
binary file changed (absent → 16805 bytes)
binary file changed (absent → 53971 bytes)
binary file changed (absent → 55106 bytes)
binary file changed (absent → 1009 bytes)
binary file changed (absent → 20565 bytes)
binary file changed (absent → 64097 bytes)
@@ -0,0 +1,42 @@+The git-annex assistant creates a synchronised folder on each of your+OSX and Linux computers, Android devices, removable drives, and+cloud services. The contents of the folder are the same everywhere.+It's very easy to use, and has all the power of git and git-annex.++## installation++The git-annex assistant comes as part of git-annex. +See [[install]] to get it installed.++See the [[release_notes]] for an overview of the status, and upgrade+instructions.++## intro screencast++[[!inline feeds=no template=bare pages=videos/git-annex_assistant_introduction]]++## documentation++* [[Basic usage|quickstart]]+* [[Android documentation|/Android]]+* Want to make two nearby computers share the same synchronised folder? + Follow the [[local_pairing_walkthrough]].+* Or perhaps you want to share files between computers in different+ locations, like home and work? + Follow the [[remote_sharing_walkthrough]].+* Want to share a synchronised folder with a friend? + Follow the [[share_with_a_friend_walkthrough]].+* Want to archive data to a drive or the cloud? + Follow the [[archival_walkthrough]].++## colophon++The git-annex assistant is being+[crowd funded on+Kickstarter](http://www.kickstarter.com/projects/joeyh/git-annex-assistant-like-dropbox-but-with-your-own/).+[[/assistant/Thanks]] to all my backers. This kickstarter is now closed, and there is a new home-made crowdfunding project to support the project for 2013-2014 [here](https://campaign.joeyh.name/).++I blog about my work on the git-annex assistant on a daily basis+in [[this_blog|design/assistant/blog]]. Follow along!++See also: The [[design|/design/assistant]] pages.
binary file changed (absent → 31740 bytes)
@@ -0,0 +1,32 @@+Normally, the git-annex assistant makes your files be available+wherever you use it, and so a copy of each file is stored in each repository.+That's perfect for files you're using right now, but what about files you're+not using any more?++You could just delete those files, but it's better to archive them, so+you can access them later. All you need to get started archiving your old+files is a USB drive, or an [Amazon Glacier](http://aws.amazon.com/glacier/)+account.++The webapp makes it easy to make a repository on either a USB drive,+or on Amazon Glacier. Once the repository is created, be sure to+put it in either the small archive, or full archive repository group.++[[!img repogroups.png]]++Now when you're done with a file, just move it into a directory named+"archive". The assistant will notice you put it there, and next time it+has the opportunity (when you plug in the USB drive, or when it can+talk to Amazon Glacier over the network), will move the file's+content to your archive repository.++You'll no longer be able to open the file once it's been archived.+If you later want to access it, you can just copy or move it out+of the archive directory, and the assistant will retrieve its+content from the archive.++Note that retrieving data from Amazon Glacier takes 4 to 5 hours.++### screencast++[[!inline feeds=no template=bare pages=videos/git-annex_assistant_archiving]]
binary file changed (absent → 5806 bytes)
binary file changed (absent → 4347 bytes)
binary file changed (absent → 7332 bytes)
binary file changed (absent → 10677 bytes)
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawkYrMBMTCEFUKskhWGD-1pzcw2ITshsi_8"+ nickname="Robert"+ subject="Annex on OS X 10.6"+ date="2013-06-04T23:10:03Z"+ content="""+I really hope they can get annex working on os x 10.6. This is a great effort. Thanks +"""]]
@@ -0,0 +1,9 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawl9smfyJFgp3f2WjqqZWY6b7vo5eZv7GGQ"+ nickname="Bryan"+ subject="Ooh. Do want on Windows"+ date="2013-07-03T20:44:05Z"+ content="""+Sadly, I didn't know about this when the Kickstarter was underway - I'd be happy to chip in $100 if it means I can get annex assistant on Windows earlier.++"""]]
binary file changed (absent → 8863 bytes)
binary file changed (absent → 6594 bytes)
binary file changed (absent → 41061 bytes)
binary file changed (absent → 22780 bytes)
binary file changed (absent → 42725 bytes)
binary file changed (absent → 110994 bytes)
binary file changed (absent → 59050 bytes)
binary file changed (absent → 27854 bytes)
binary file changed (absent → 34868 bytes)
binary file changed (absent → 12583 bytes)
@@ -0,0 +1,90 @@+So you have two computers in the same building, and you want them to share+the same synchronised folder, communicating directly with each other.++This is incredibly easy to set up with the git annex assistant.++Let's say the two computers are your computer and your friend's computer.+We'll start on your computer, where you open up your git annex dashboard.++[[!img addrepository.png alt="Add another repository button"]]++`*click*`++[[!img pairing.png alt="Pair with another computer"]]++`*click*`++Now the hard bit. You have to think up a secret phrase, and type it in,+(and perhaps get the spelling correct).++[[!img secret.png alt="Enter secret phrase"]]++Now your computer is in pairing mode. When your friend looks at her git+annex dashboard, she sees something like this.++[[!img pairrequest.png alt="Pair request"]]++`*click*`++[[!img secretempty.png alt="Enter same secret phrase"]]++Now it's up to you to let her know what the secret is. As soon as she+enters it, both your computers will be paired, and will begin to sync their+git-annex folders. Just like that you can share files.++----++## Requirements++For local pairing to work, you must have sshd (ssh server daemon) installed and working on all machines involved. That means you must allow at least local connections to sshd. On most Linux distributions, sshd is packaged in either openssh (openSUSE) or openssh-server (Debian). ++It is highly recommended that you disable root login, disable password login to sshd and just enable key based authentication instead. No one will be able to login without your key.++To disable root, after installing sshd, edit the sshd config (usually /etc/ssh/sshd_config file) and disable root login by adding:++ PermitRootLogin no++Restart sshd. See man sshd_config for details.++To disable password login and enable key based authentication, edit the sshd config (just like above) by uncommenting and changing the following options:++ ChallengeResponseAuthentication no+ PasswordAuthentication no+ UsePAM no+ + PubkeyAuthentication yes++Restart sshd. See man sshd_config for details.++You can also restrict login to your local network only (not allow internet users from trying to log into your computer). Edit the hosts.deny file (usually /etc/hosts.deny) by adding the following:++ sshd : ALL EXCEPT LOCAL++Do note that restricting login to your local network may or may not block git-annex. Also note that this will not work on Mac OSX because Apple decided to disable this feature and replace it with a crippled version made by Apple.++## Tips++Something to keep in mind, especially if pairing doesn't seem to be+working, is that the two computers need to be on the same network for this+pairing process to work. Sometimes a building will have more than one+network inside it, and you'll need to connect them both to the same one.+Make sure the wireless network name is the same, or that they're both+plugged into the same router.++Also, the file sharing set up by this pairing only works when both+computers are on the same network. If you go on a trip, any files you+edit will not be visible to your friend until you get back. ++To get around this, you'll often also want to set up+[[jabber_pairing|share_with_a_friend_walkthrough]], and a server+in the cloud, which they can use to exchange files while away.++And also, you can pair with as many other computers as you like, not just+one!++## What does pairing actually do behind the scenes?++It ensures that both repositories have correctly configured +[[remotes|walkthrough/adding_a_remote]] pointing to each other.+If you have already configured this manually, you do not need to+perform pairing.
binary file changed (absent → 2259 bytes)
binary file changed (absent → 6771 bytes)
binary file changed (absent → 5383 bytes)
binary file changed (absent → 5132 bytes)
binary file changed (absent → 9575 bytes)
binary file changed (absent → 33631 bytes)
binary file changed (absent → 32061 bytes)
binary file changed (absent → 22921 bytes)
binary file changed (absent → 2604 bytes)
binary file changed (absent → 22815 bytes)
@@ -0,0 +1,30 @@+## first run++To get started with the git-annex assistant, just pick it from+your system's list of applications.++[[!img assistant/menu.png]]+[[!img assistant/osx-app.png]]++It'll prompt you to set up a folder:++[[!img assistant/makerepo.png]]++Then any changes you make to its folder will automatically be committed to+git, and synced to repositories on other computers. You can use the+interface to add repositories and control the git-annex assistant.++[[!img assistant/running.png]]++## starting on boot++The git-annex assistant will automatically be started when you log in to+desktop environments like Mac OS X, Gnome, XFCE, and KDE, and the menu item+shown above can be used to open the webapp. On other systems, you may need+to start it by hand.++To start the webapp, run `git annex webapp` at the command line.++To start the assistant without opening the webapp, +you can run the command "git annex assistant --autostart". This is a+good thing to configure your system to run automatically when you log in.
@@ -0,0 +1,352 @@+## version 4.20131002++Now you can use the webapp to set up an encrypted git repository on a+remote ssh server, or on rsync.net, and use it as a live cloud backup. Or,+use the webapp to make an encrypted git repository on a removable drive,+and store it offsite as a secure backup.++## version 4.20130920++This release is the first to support fully encrypted git repositories+stored on removable drives. This can be set up easily using the webapp.++## version 4.20130909++This release fixes a crash that could occur when using XMPP with the+assitant. It has only been seen on OS X so far. The bug is not believed to+be explitable, but upgrading is still recommended.++## version 4.20130802++This release fixes several bugs, including a reversion introduced in the last+version that broke direct mode on Windows, Android, and other crippled+filesystems. It contains a workaround for a bug in recent git pre-releases+that broke handling of filenames containing spaces.+It is a highly recommended upgrade.++The webapp can now detect repositories that did not finish getting properly set+up, and can recover from one common bug that broke local pairing and remote+ssh server setups on systems using `ssh-agent`.++## version 4.20130723++This release fixes some bugs. Notably it fixes a bug that could result in data+loss when adding a tarball of a git-annex repository to your git-annex+repository.++Rsync.net have committed to support git-annex and offer a special+discounted rate for git-annex users.+<http://www.rsync.net/products/git-annex-pricing.html>++## version 4.20130709++This release is mostly bug fixes.++One of the bugs involved setting up rsync remotes on servers other than+rsync.net. The wrong `.ssh/authorized_keys` line was deployed to the+remote server. If you set up a rsync remote with a past release, and it does+not work, you will need to manually edit the `.ssh/authorized_keys` file,+and remove the `command=` forced command.++## version 4.20130621, 4.20130627++These releases mostly consist of bug fixes.++## version 4.20130601++This is a bugfix release, featuring significant XMPP improvements and+more robustness thanks to automated fuzz testing. Recommended upgrade.++This version changes its XMPP protocol, so it will fail to sync with older+git-annex versions over XMPP.++## version 4.20130521++This is a bugfix release. Recommended upgrade.++## version 4.20130516++This version contains numerous bug fixes, and improvements.++This is the first release with a fully usable Android app. No command-line+typing needed to set up syncing to your Android phone or tablet!+A few of the more advanced features may not work (or not work reliably)+on Android. The Android app is still beta quality.++This is also the first release with a Windows port! The Windows port+is in an alpha quality state, and is missing many features.+It does not yet include the assistant.++## version 4.20130501++This version contains numerous bug fixes, and improvements.++## version 4.20130417++This version contains numerous bug fixes, and improvements.++One bug that was fixed can affect users of gnome-keyring who+have set up remote repositories on ssh servers using the webapp.+The gnome-keyring may load the restricted key that is set up+for that, and make it be used for regular logins to the server;+with the result that you'll get an error message about "git-annex-shell"+when sshing to the server. ++If you experience this problem you can fix it by+moving `.ssh/key.git-annex*` to `.ssh/git-annex/` (creating+that directory first), and edit `.ssh/config` to reflect the new+location of the key. You will also need to restart gnome-keyring.++Another change relates to files in `archive/` directories. Client repositories+now sync these files between themselves like any other files, until+the files reach an archive repository. Only then are they removed from+the client repositories. So you need to ensure you have at least one+archive repository if you want to use the `archive/` directory feature.++## version 4.20130323, 4.20130405++These versions continue fixing bugs and adding features.++## version 4.20130314++This version makes a great many improvements and bugfixes, and is+a recommended upgrade.++If you have already used the webapp to locally pair two computers,+a bug caused the paired repository to not be given an appropriate cost.+To fix this, go into the Repositories page in the webapp, and drag the+repository for the locally paired computer to come before any repositories+that it's more expensive to transfer data to.++## version 4.20130227++This release fixes a bug with globbing that broke preferred content expressions.+So, it is a recommended upgrade from the previous release, which introduced+that bug.++In this release, the assistant is fully working on Android, although+it must be set up using the command line.++Repositories can now be placed on filesystems that lack support for symbolic+links; FAT support is complete.++## version 3.20130216++This adds a port to Android. Only usable at the command line so far;+beta qualitty.++Also a bugfix release, and improves support for FAT.++The following are known limitations of this release of the git-annex+assistant:++* No Android app yet.+* On BSD operating systems (but not on OS X), the assistant uses kqueue to+ watch files. Kqueue has to open every directory it watches, so too many+ directories will run it out of the max number of open files (typically+ 1024), and fail. See [[this_bug|bugs/Issue_on_OSX_with_some_system_limits]]+ for a workaround.+* Also on systems with kqueue, modifications to existing files in direct+ mode will not be noticed.++## version 3.20130107, 3.20130114, 3.20130124, 3.20130207++These are bugfix releases.++## version 3.20130102++This release makes several significant improvements to the git-annex+assistant, which is still in beta.++The main improvement is direct mode. This allows you to directly edit files+in the repository, and the assistant will automatically commit and sync+your changes. Direct mode is the default for new repositories created+by the assistant. To convert your existing repository to use direct mode,+manually run `git annex direct` inside the repository.++## version 3.20121211++This release of the git-annex assistant (which is still in beta)+consists of mostly bugfixes, user interface improvements, and improvements+to existing features.++In general, anything you can configure with the assistant's web app+will work. Some examples of use cases supported by this release include:++* Using Box.com's 5 gigabytes of free storage space as a cloud transfer+ point between between repositories that cannot directly contact+ one-another. (Many other cloud providers are also supported, from Rsync.net+ to Amazon S3, to your own ssh server.)+* Archiving or backing up files to Amazon Glacier. See [[archival_walkthrough]].+* [[Sharing repositories with friends|share_with_a_friend_walkthrough]]+ contacted through a Jabber server (such as Google Talk).+* [[Pairing|local_pairing_walkthrough]] two computers that are on the same local+ network (or VPN) and automatically keeping the files in the annex in+ sync as changes are made to them.+* Cloning your repository to removable drives, USB keys, etc. The assistant+ will notice when the drive is mounted and keep it in sync.+ Such a drive can be stored as an offline backup, or transported between+ computers to keep them in sync.++The following are known limitations of this release of the git-annex+assistant:++* The Max OSX standalone app may not work on all versions of Max OSX.+ Please test!+* On Mac OSX and BSD operating systems, the assistant uses kqueue to watch+ files. Kqueue has to open every directory it watches, so too many+ directories will run it out of the max number of open files (typically+ 1024), and fail. See [[bugs/Issue_on_OSX_with_some_system_limits]]+ for a workaround.++## version 3.20121126++This adds several features to the git-annex assistant, which is still in beta.++In general, anything you can configure with the assistant's web app+will work. Some examples of use cases supported by this release include:++* Using Box.com's 5 gigabytes of free storage space as a cloud transfer+ point between between repositories that cannot directly contact+ one-another. (Many other cloud providers are also supported, from Rsync.net+ to Amazon S3, to your own ssh server.)+* Archiving or backing up files to Amazon Glacier.+* [[Sharing repositories with friends|share_with_a_friend_walkthrough]]+ contacted through a Jabber server (such as Google Talk).+* [[Pairing|local_pairing_walkthrough]] two computers that are on the same local+ network (or VPN) and automatically keeping the files in the annex in+ sync as changes are made to them.+* Cloning your repository to removable drives, USB keys, etc. The assistant+ will notice when the drive is mounted and keep it in sync.+ Such a drive can be stored as an offline backup, or transported between+ computers to keep them in sync.++The following are known limitations of this release of the git-annex+assistant:++* The Max OSX standalone app does not work on all versions of Max OSX.+* On Mac OSX and BSD operating systems, the assistant uses kqueue to watch+ files. Kqueue has to open every directory it watches, so too many+ directories will run it out of the max number of open files (typically+ 1024), and fail. See [[bugs/Issue_on_OSX_with_some_system_limits]]+ for a workaround.+* Retrieval of files from Amazon Glacier is not fully automated; the+ assistant does not automatically retry in the 4 to 5 hours period + when Glacier makes the files available.++## version 3.20121112++This is a major upgrade of the git-annex assistant, which is still in beta.++In general, anything you can configure with the assistant's web app+will work. Some examples of use cases supported by this release include:++* [[Sharing repositories with friends|share_with_a_friend_walkthrough]]+ contacted through a Jabber server (such as Google Talk).+* Setting up cloud repositories, that are used as backups, archives,+ or transfer points between repositories that cannot directly contact+ one-another.+* [[Pairing|local_pairing_walkthrough]] two computers that are on the same local+ network (or VPN) and automatically keeping the files in the annex in+ sync as changes are made to them.+* Cloning your repository to removable drives, USB keys, etc. The assistant+ will notice when the drive is mounted and keep it in sync.+ Such a drive can be stored as an offline backup, or transported between+ computers to keep them in sync.++The following upgrade notes apply if you're upgrading from a previous version:++* For best results, edit the configuration of repositories you set+ up with older versions, and place them in a repository group.+ This lets the assistant know how you want to use the repository; for backup,+ archival, as a transfer point for clients, etc. Go to Configuration ->+ Manage Repositories, and click in the "configure" link to edit a repository's+ configuration.+* If you set up a cloud repository with an older version, and have multiple+ clients using it, you are recommended to configure an Jabber account,+ so that clients can use it to communicate when sending data to the+ cloud repository. Configure Jabber by opening the webapp, and going to+ Configuration -> Configure jabber account+* When setting up local pairing, the assistant did not limit the paired+ computer to accessing a single git repository. This new version does,+ by setting GIT_ANNEX_SHELL_DIRECTORY in `~/.ssh/authorized_keys`.++The following are known limitations of this release of the git-annex+assistant:++* On Mac OSX and BSD operating systems, the assistant uses kqueue to watch+ files. Kqueue has to open every directory it watches, so too many+ directories will run it out of the max number of open files (typically+ 1024), and fail. See [[bugs/Issue_on_OSX_with_some_system_limits]]+ for a workaround.++## version 3.20121009++This is a maintenance release of the git-annex assistant, which is still in+beta.++In general, anything you can configure with the assistant's web app+will work. Some examples of use cases supported by this release include:++* [[Pairing|local_pairing_walkthrough]] two computers that are on the same local+ network (or VPN) and automatically keeping the files in the annex in+ sync as changes are made to them.+* Cloning your repository to removable drives, USB keys, etc. The assistant+ will notice when the drive is mounted and keep it in sync.+ Such a drive can be stored as an offline backup, or transported between+ computers to keep them in sync.+* Cloning your repository to a remote server, running ssh, and uploading+ changes made to your files to the server. There is special support+ for using the rsync.net cloud provider this way, or any shell account+ on a typical unix server, such as a Linode VPS can be used.++The following are known limitations of this release of the git-annex+assistant:++* On Mac OSX and BSD operating systems, the assistant uses kqueue to watch+ files. Kqueue has to open every directory it watches, so too many+ directories will run it out of the max number of open files (typically+ 1024), and fail. See [[bugs/Issue_on_OSX_with_some_system_limits]]+ for a workaround.+* In order to ensure that all multiple repositories are kept in sync,+ each computer with a repository must be running the git-annex assistant.+* The assistant does not yet always manage to keep repositories in sync+ when some are hidden from others behind firewalls.++## version 3.20120924++This is the first beta release of the git-annex assistant.++In general, anything you can configure with the assistant's web app+will work. Some examples of use cases supported by this release include:++* [[Pairing|local_pairing_walkthrough]] two computers that are on the same local+ network (or VPN) and automatically keeping the files in the annex in+ sync as changes are made to them.+* Cloning your repository to removable drives, USB keys, etc. The assistant+ will notice when the drive is mounted and keep it in sync.+ Such a drive can be stored as an offline backup, or transported between+ computers to keep them in sync.+* Cloning your repository to a remote server, running ssh, and uploading+ changes made to your files to the server. There is special support+ for using the rsync.net cloud provider this way, or any shell account+ on a typical unix server, such as a Linode VPS can be used.++The following are known limitations of this release of the git-annex+assistant:++* On Mac OSX and BSD operating systems, the assistant uses kqueue to watch+ files. Kqueue has to open every directory it watches, so too many+ directories will run it out of the max number of open files (typically+ 1024), and fail. See [[bugs/Issue_on_OSX_with_some_system_limits]]+ for a workaround.+* In order to ensure that all multiple repositories are kept in sync,+ each computer with a repository must be running the git-annex assistant.+* The assistant does not yet always manage to keep repositories in sync+ when some are hidden from others behind firewalls.+* If a file is checked into git as a normal file and gets modified+ (or merged, etc), it will be converted into an annexed file. So you+ should not mix use of the assistant with normal git files in the same+ repository yet.+* If you `git annex unlock` a file, it will immediately be re-locked.+ See [[bugs/watcher_commits_unlocked_files]].
@@ -0,0 +1,12 @@+So you have two computers that are not in the same place, and you want them+to share the same synchronised folder, communicating directly with each other.++[[!inline feeds=no template=bare pages=videos/git-annex_assistant_remote_sharing]]++You can add even more computers using the same method shown here.++----++If you have a laptop that is sometimes near another computer, you can+speed up file transfers when it is by also connecting it using the+[[local_pairing_walkthrough]].
binary file changed (absent → 31791 bytes)
binary file changed (absent → 15636 bytes)
binary file changed (absent → 7603 bytes)
binary file changed (absent → 63405 bytes)
binary file changed (absent → 40504 bytes)
binary file changed (absent → 61465 bytes)
binary file changed (absent → 24664 bytes)
@@ -0,0 +1,58 @@+Want to share all the files in your repository with a friend?++Let's suppose you use Google Mail, and so does your friend, and you+sometimes also chat in Google Talk. The git-annex assistant will+use your Google account to share with your friend. (This actually+works with any Jabber account you use, not just Google Talk.)++Start by opening up your git annex dashboard.++[[!img local_pairing_walkthrough/addrepository.png alt="Add another repository button"]]++`*click*`++[[!img pairing.png alt="Share with a friend"]]++`*click*`++[[!img xmpp.png alt="Configuring Jabber account"]]++Fill that out, and git-annex will be able to show you a list of your+friends.++[[!img buddylist.png alt="Buddy list"]]++This list will refresh as friends log on and off, so you can+leave it open in a tab until a friend is available to start pairing.++(If your friend is not using git-annex yet, now's a great time to spread+the word!)++Once you click on "Start Pairing", your friend will see this pop up+on their git annex dashboard.++[[!img xmppalert.png alt="Pair request"]]++Once your friend clicks on that, your repositories will be paired.++### But, wait, there's one more step...++Despite the repositories being paired now, you and your friend can't yet+quite share files. You'll start to see your friend's files show up in your+git-annex folder, but you won't be able to open them yet.++What you need to do now is set up a repository out there in the cloud,+that both you and your friend can access. This will be used to transfer+files between the two of you.++At the end of the pairing process, a number of cloud providers are+suggested, and the git-annex assistant makes it easy to configure one of+them. Once you or your friend sets it up, it'll show up in the other+one's list of repositories:++[[!img repolist.png alt="Repository list"]]++The final step is to share the login information for the cloud repository+with your friend, so they can enable it too.++With that complete, you'll be able to open your friend's files!
binary file changed (absent → 5114 bytes)
binary file changed (absent → 6892 bytes)
binary file changed (absent → 8525 bytes)
binary file changed (absent → 4070 bytes)
@@ -0,0 +1,243 @@+The development of the git-annex assistant was made possible by the+generous donations of many people. I want to say "Thank You!" to each of+you individually, but until I meet all 951 of you, this page will have to+do. You have my most sincere thanks. --[[Joey]]++(If I got your name wrong, or you don't want it publically posted here,+email <joey@kitenet.net>.)++## Major Backers++These people are just inspiring in their enthusiasm and generosity to this+project.++* Jason Scott+* strager++## Beta Testers++Whole weeks of my time were made possible thanks to each of these+people, and their testing is invaluable to the development of+the git-annex assistant.++* Jimmy Tang+* David Pollak+* Pater+* Francois Marier+* Paul Sherwood+* Fred Epma+* Robert Ristroph+* Josh Triplett+* David Haslem+* AJ Ashton+* Svenne Krap+* Drew Hess+* Peter van Westen++## Prioritizers++These forward-thinking people contributed generously just to help+set my priorities in which parts of the git-annex assistant were most+important to develop.++Paul C. Bryan, Paul Tötterman, Don Marti, Dean Thompson, Djoume, David Johnston+Asokan Pichai, Anders Østhus, Dominik Wagenknecht, Charlie Fox, Yazz D. Atlas,+fenchel, Erik Penninga, Richard Hartmann, Graham, Stan Yamane, Ben Skelton,+Ian McEwen, asc, Paul Tagliamonte, Sherif Abouseda, Igor Támara, Anne Wind,+Mesar Hameed, Brandur K. Holm Petersen, Takahiro Inoue, Kai Hendry,+Stephen Youndt, Lee Roberson, Ben Strawbridge, Andrew Greenberg, Alfred Adams+Andrew, Aaron De Vries, Monti Knazze, Jorge Canseco, Hamish, Mark Eichin,+Sherif Abouseda, Ben Strawbridge, chee rabbits, Pedro Côrte-Real++And special thanks to Kevin McKenzie, who also gave me a login to a Mac OSX+machine, which has proven invaluable, Jimmy Tang who has helped+with Mac OSX autobuilding and packaging, and Yury V. Zaytsev who+provides the Windows autobuilder.++## Other Backers++Most of the success of the Kickstarter is thanks to these folks. Some of+them spent significant amounts of money in the guise of getting some+swag. For others, being listed here, and being crucial to making the +git-annex assistant happen was reward enough. Large or small, these+contributions are, literally, my bread and butter this year.++Amitai Schlair, mvime, Romain Lenglet, James Petts, Jouni Uuksulainen,+Wichert Akkerman, Robert Bellus, Kasper Souren, rob, Michiel Buddingh',+Kevin, Rob Avina, Alon Levy, Vikash, Michael Alan Dorman, Harley Pig,+Andreas Olsson, Pietpiet, Christine Spang, Liz Young, Oleg Kosorukov,+Allard Hoeve, Valentin Haenel, Joost Baaij, Nathan Yergler, Nathan Howell,+Frédéric Schütz, Matti Eskelinen, Neil McGovern, Lane Lillquist, db48x,+Stuart Prescott, Mark Matienzo, KarlTheGood, leonm, Drew Slininger, +Andreas Fuchs, Conrad Parker, Johannes Engelke, Battlegarden, Justin Kelly,+Robin Wagner, Thad Ward, crenquis, Trudy Goold, Mike Cochrane, Adam Venturella,+Russell Foo, furankupan, Giorgio Occhioni, andy, mind, Mike Linksvayer,+Stefan Strahl, Jelmer Vernooij, Markus Fix, David Hicks, Justin Azoff,+Iain Nicol, Bob Ippolito, Thomas Lundstrøm, Jason Mandel, federico2,+Edd Cochran, Jose Ortega, Emmett Agnew, Rudy Garcia, Kodi, Nick Rusnov,+Michael Rubin, Tom de Grunt, Richard Murray, Peter, Suzanne Pierce, Jared+Marcotte, folk, Eamon, Jeff Richards, Leo Sutedja, dann frazier, Mikkel+kristiansen, Matt Thomas, Kilian Evang, Gergely Risko, Kristian Rumberg,+Peter Kropf, Mark Hepburn, greymont, D. Joe Anderson, Jeremy Zunker, ctebo,+Manuel Roumain, Jason Walsh, np, Shawn, Johan Tibell, Branden Tyree, Dinyar+Rabady, Andrew Mason, damond armstead, Ethan Aubin, TomTom Tommie, Jimmy+Kaplowitz, Steven Zakulec, mike smith, Jacob Kirkwood, Mark Hymers, Nathan+Collins, Asbjørn Sloth Tønnesen, Misty De Meo, James Shubin,+Jim Paris, Adam Sjøgren, miniBill, Taneli, Kumar Appaiah, Greg Grossmeier,+Sten Turpin, Otavio Salvador, Teemu Hukkanen, Brian Stengaard, bob walker,+bibeneus, andrelo, Yaroslav Halchenko, hesfalling, Tommy L, jlargentaye,+Serafeim Zanikolas, Don Armstrong, Chris Cormack, shayne.oneill, Radu+Raduta, Josh S, Robin Sheat, Henrik Mygind, kodx, Christian, Geoff+Crompton, Brian May, Olivier Berger, Filippo Gadotti, Daniel Curto-Millet,+Eskild Hustvedt, Douglas Soares de Andrade, Tom L, Michael Nacos, Michaël+P., William Roe, Joshua Honeycutt, Brian Kelly, Nathan Rasch, jorge, Martin+Galese, alex cox, Avery Brooks, David Whittington, Dan Martinez, Forrest+Sutton, Jouni K. Seppänen, Arnold Cano, Robert Beaty, Daniel, Kevin Savetz,+Randy, Ernie Braganza, Aaron Haviland, Brian Brunswick, asmw, sean, Michael+Williams, Alexander, Dougal Campbell, Robert Bacchas, Michael Lewis, Collin+Price, Wes Frazier, Matt Wall, Brandon Barclay, Derek van Vliet, Martin+DeMello, kitt hodsden, Stephen Kitt, Leif Bergman, Simon Lilburn, Michael+Prokop, Christiaan Conover, Nick Coombe, Tim Dysinger, Brandon Robinson,+Philip Newborough, keith, Mike Fullerton, Kyle, Phil Windley, Tyler Head,+George V. Reilly, Matthew, Ali Gündüz, Vasyl Diakonov, Paolo Capriotti,+allanfranta, Martin Haeberli, msingle, Vincent Sanders, Steven King, Dmitry+Gribanov, Brandon High, Ben Hughes, Mike Dank, JohnE, Diggory Hardy,+Michael Hanke, valhalla, Samuli Tuomola, Jeff Rau, Benjamin Lebsanft, John+Drago, James, Aidan Cooper, rondie, Paul Kohler, Matthew Knights, Aaron+Junod, Patrick R McDonald, Christopher Browne, Daniel Engel, John SJ+Anderson, Peter Sarossy, Mike Prasad, Christoph Ender, Jan Dittberner,+Zohar, Alexander Jelinek, stefan, Danny O'Brien, Matthew Thode, Nicole+Aptekar, maurice gaston, Chris Adams, Mike Klemencic, Reedy, Subito, Tobias+Gruetzmacher, Ole-Morten Duesund, André Koot, mp, gdop, Cole Scott, Blaker,+Matt Sottile, W. Craig Trader, Louis-Philippe Dubrule, Brian Boucheron,+Duncan Smith, Brenton Buchbach, Kyle Stevenson, Eliot Lash, Egon Elbre,+Praveen, williamji, Thomas Schreiber, Neil Ford, Ryan Pratt, Joshua Brand,+Peter Cox, Markus Engstrom, John Sutherland, Dean Bailey, Ed Summers,+Hillel Arnold, David Fiander, Kurt Yoder, Trevor Muñoz, keri, Ivan+Sergeyenko, Shad Bolling, Tal Kelrich, Steve Presley, gerald ocker, Essex+Taylor, Josh Thomson, Trevor Bramble, Lance Higgins, Frank Motta, Dirk+Kraft, soundray, Joe Haskins, nmjk, Apurva Desai, Colin Dean, docwhat,+Joseph Costello, Jst, flamsmark, Alex Lang, Bill Traynor, Anthony David,+Marc-André Lureau, AlNapp, Giovanni Moretti, John Lawrence, João Paulo+Pizani Flor, Jim Ray, Gregory Thrush, Alistair McGann, Andrew Wied,+Koutarou Furukawa, Xiscu Ignacio, Aaron Sachs, Matt, Quirijn, Chet+Williams, Chris Gray, Bruce Segal, Tom Conder, Louis Tovar, Alex Duryee,+booltox, d8uv, Decklin Foster, Rafael Cervantes, Micah R Ledbetter, Kevin+Sjöberg, Johan Strombom, Zachary Cohen, Jason Lewis, Yves Bilgeri, Ville+Aine, Mark Hurley, Marco Bonetti, Maximilian Haack, Hynek Schlawack,+Michael Leinartas, Andreas Liebschner, Duotrig, Nat Fairbanks, David+Deutsch, Colin Hayhurst, calca, Kyle Goodrick, Marc Bobillier, Robert+Snook, James Kim, Olivier Serres, Jon Redfern, Itai Tavor, Michael+Fladischer, Rob, Jan Schmid, Thomas H., Anders Söderbäck, Abhishek+Dasgupta, Jeff Goeke-Smith, Tommy Thorn, bonuswavepilot, Philipp Edelmann,+Nick, Alejandro Navarro Fulleda, Yann Lallemant, andrew brennan, +Dave Allen Barker Jr, Fabian, Lukas Anzinger, Carl Witty, Andy Taylor,+Andre Klärner, Andrew Chilton, Adam Gibbins, Alexander Wauck, Shane O'Dea,+Paul Waite, Iain McLaren, Maggie Ellen Robin Hess, Willard Korfhage,+Nicolas, Eric Nikolaisen, Magnus Enger, Philipp Kern, Andrew Alderwick,+Raphael Wimmer, Benjamin Schötz, Ana Guerrero, Pete, Pieter van der Eems,+Aaron Suggs, Fred Benenson, Cedric Howe, Lance Ivy, Tieg Zaharia, Kevin+Cooney, Jon Williams, Anton Kudris, Roman Komarov, Brad Hilton, Rick Dakan,+Adam Whitcomb, Paul Casagrande, Evgueni Baldin, Robert Sanders, Kagan+Kayal, Dean Gardiner, micah altman, Cameron Banga, Ross Mcnairn, Oscar+Vilaplana, Robin Graham, Dan Gervais, Jon Åslund, Ragan Webber, Noble Hays,+stephen brown, Sean True, Maciek Swiech, faser, eikenberry, Kai Laborenz,+Sergey Fedoseev, Chris Fournier, Svend Sorensen, Greg K, wojtek, Johan+Ribenfors, Anton, Benjamin, Oleg Tsarev, PsychoHazard, John Cochrane,+Kasper Lauritzen, Patrick Naish, Rob, Keith Nasman, zenmaster, David Royer,+Max Woolf, Dan Gabber, martin rhoads, Martin Schmidinger, Paul+Scott-Wilson, Tom Gromak, Andy Webster, Dale Webb, Jim Watson, Stephen+Hansen, Mircea, Dan Goodenberger, Matthias Fink, Andy Gott, Daniel, Jai+Nelson, Shrayas Rajagopal, Vladimir Rutsky, Alexander, Thorben Westerhuys,+hiruki, Tao Neuendorffer Flaherty, Elline, Marco Hegenberg, robert, Balda,+Brennen Bearnes, Richard Parkins, David Gwilliam, Mark Johnson, Jeff Eaton,+Reddawn90, Heather Pusey, Chris Heinz, Colin, Phatsaphong Thadabusapa,+valunthar, Michael Martinez, redlukas, Yury V. Zaytsev, Blake, Tobias+"betabrain" A., Leon, sopyer, Steve Burnett, bessarabov, sarble, krsch.com,+Jack Self, Jeff Welch, Sam Pettiford, Jimmy Stridh, Diego Barberá, David+Steele, Oscar Ciudad, John Braman, Jacob, Nick Jenkins, Ben Sullivan, Brian+Cleary, James Brosnahan, Darryn Ten, Alex Brem, Jonathan Hitchcock, Jan+Schmidle, Wolfrzx99, Steve Pomeroy, Matthew Sitton, Finkregh, Derek Reeve,+GDR!, Cory Chapman, Marc Olivier Chouinard, Andreas Ryland, Justin, Andreas+Persenius, Games That Teach, Walter Somerville, Bill Haecker, Brandon+Phenix, Justin Shultz, Colin Scroggins, Tim Goddard, Ben Margolin, Michael+Martinez, David Hobbs, Andre Le, Jason Roberts, Bob Lopez, Gert Van Gool,+Robert Carnel, Anders Lundqvist, Aniruddha Sathaye, Marco Gillies, Basti+von Bejga, Esko Arajärvi, Dominik Deobald, Pavel Yudaev, Fionn Behrens,+Davide Favargiotti, Perttu Luukko, Silvan Jegen, Marcelo Bittencourt,+Leonard Peris, smercer, Alexandre Dupas, Solomon Matthews, Peter Hogg,+Richard E. Varian, Ian Oswald, James W. Sarvey, Ed Grether, Frederic+Savard, Sebastian Nerz, Hans-Chr. Jehg, Matija Nalis, Josh DiMauro, Jason+Harris, Adam Byrtek, Tellef, Magnus, Bart Schuurmans, Giel van Schijndel,+Ryan, kiodos, Richard 'maddog' Collins, PawZubr, Jason Gassel, Alex+Boisvert, Richard Thompson, maddi bolton, csights, Aaron Bryson, Jason Chu,+Maxime Côté, Kineteka Systems, Joe Cabezas, Mike Czepiel, Rami Nasra,+Christian Simonsen, Wouter Beugelsdijk, Adam Gibson, Gal Buki, James+Marble, Alan Chambers, Bernd Wiehle, Simon Korzun, Daniel Glassey, Eero af+Heurlin, Mikael, Timo Engelhardt, Wesley Faulkner, Jay Wo, Mike Belle,+David Fowlkes Jr., Karl-Heinz Strass, Ed Mullins, Sam Flint,+Hendrica, Mark Emer Anderson, Joshua Cole, Jan Gondol, Henrik Lindhe,+Albert Delgado, Patrick, Alexa Avellar, Chris, sebsn1349, Maxim Kachur,+Andrew Marshall, Navjot Narula, Alwin Mathew, Christian Mangelsdorf, Avi+Shevin, Kevin S., Guillermo Sanchez Estrada, Alex Krieger, Luca Meier, Will+Jessop, Nick Ruest, Lani Aung, Ulf Benjaminsson, Rudi Engelbrecht, Miles+Matton, Cpt_Threepwood, Adam Kuyper, reacocard, David Kilsheimer, Peter+Olson, Bill Fischofer, Prashant Shah, Simon Bonnick, Alexander Grudtsov,+Antoine Boegli, Richard Warren, Sebastian Rust, AlmostHuman, Timmy+Crawford, PC, Marek Belski, pontus, Douglas S Butts, Eric Wallmander, Joe+Pelar, VIjay, Trahloc, Vernon Vantucci, Matthew baya, Viktor Štujber,+Stephen Akiki, Daniil Zamoldinov, Atley, Chris Thomson, Jacob Briggs, Falko+Richter, Andy Schmitz, Sergi Sagas, Peder Refsnes, Jonatan, Ben, Bill+Niblock, Agustin Acuna, Jeff Curl, Tim Humphrey, bib, James Zarbock,+Lachlan Devantier, Michal Berg, Jeff Lucas, Sid Irish, Franklyn, Jared+Dickson, Olli Jarva, Adam Gibson, Lukas Loesche, Jukka Määttä, Alexander+Lin, Dao Tran, Kirk, briankb, Ryan Villasenor, Daniel Wong, barista, Tomas+Jungwirth, Jesper Hansen, Nivin Singh, Alessandro Tieghi, Billy Roessler,+Peter Fetterer, Pallav Laskar, jcherney, Tyler Wang, Steve, Gigahost, Beat+Wolf, Hannibal Skorepa, aktiveradio, Mark Nunnikhoven, Bret Comnes, Alan+Ruttenberg, Anthony DiSanti, Adam Warkiewicz, Brian Bowman, Jonathan, Mark+Filley, Tobias Mohr, Christian St. Cyr, j. faceless user, Karl Miller,+Thomas Taimre, Vikram, Jason Mountcastle, Jason, Paul Elliott, Alexander,+Stephen Farmer, rayslava, Peter Leurs, Sky Kruse, JP Reeves, John J Schatz,+Martin Sandmair, Will Thompson, John Hergenroeder, Thomas, Christophe+Ponsart, Wolfdog, Eagertolearn, LukasM, Federico Hernandez, Vincent Bernat,+Christian Schmidt, Cameron Colby Thomson, Josh Duff, James Brown, Theron+Trowbridge, Falke, Don Meares, tauu, Greg Cornford, Max Fenton, Kenneth+Reitz, Bruce Bensetler, Mark Booth, Herb Mann, Sindre Sorhus, Chris+Knadler, Daniel Digerås, Derek, Sin Valentine, Ben Gamari, david+lampenscherf, fardles, Richard Burdeniuk, Tobias Kienzler, Dawid Humbla,+Bruno Barbaroxa, D Malt, krivar, James Valleroy, Peter, Tim Geddings,+Matthias Holzinger, Hanen, Petr Vacek, Raymond, Griff Maloney, Andreas+Helveg Rudolph, Nelson Blaha, Colonel Fubar, Skyjacker Captain Gavin+Phoenix, shaun, Michael, Kari Salminen, Rodrigo Miranda, Alan Chan, Justin+Eugene Evans, Isaac, Ben Staffin, Matthew Loar, Magos, Roderik, Eugenio+Piasini, Nico B, Scott Walter, Lior Amsalem, Thongrop Rodsavas, Alberto de+Paola, Shawn Poulen, John Swiderski, lluks, Waelen, Mark Slosarek, Jim+Cristol, mikesol, Bilal Quadri, LuP, Allan Nicolson, Kevin Washington,+Isaac Wedin, Paul Anguiano, ldacruz, Jason Manheim, Sawyer, Jason+Woofenden, Joe Danziger, Declan Morahan, KaptainUfolog, Vladron, bart, Jeff+McNeill, Christian Schlotter, Ben McQuillan, Anthony, Julian, Martin O,+altruism, Eric Solheim, MarkS, ndrwc, Matthew, David Lehn, Matthew+Cisneros, Mike Skoglund, Kristy Carey, fmotta, Tom Lowenthal, Branden+Tyree, Aaron Whitehouse++## Also thanks to++* The Kickstarter team, who have unleashed much good on the world.+* The Haskell developers, who toiled for 20 years in obscurity+ before most of us noticed them, and on whose giant shoulders I now stand,+ in awe of the view.+* The Git developers, for obvious reasons.+* All of git-annex's early adopters, who turned it from a personal+ toy project into something much more, and showed me the interest was there.+* Rsync.net, for providing me a free account so I can make sure git-annex+ works well with it.+* LeastAuthority.com, for providing me a free Tahoe-LAFS grid account,+ so I can test git-annex with that, and back up the git-annex assistant+ screencasts.+* Anna and Mark, for the loan of the video camera; as well as the rest of+ my family, for your support. Even when I couldn't explain what I was+ working on.+* The Hodges, for providing such a congenial place for me to live and work+ on these first world problems, while you're off helping people in the+ third world.
binary file changed (absent → 3491 bytes)
binary file changed (absent → 27753 bytes)
binary file changed (absent → 6156 bytes)
binary file changed (absent → 34379 bytes)
@@ -0,0 +1,23 @@+Running `git annex sync` or using the [[assistant]] involves merging+changes from elsewhere into your repository's currently checked out branch.+This could lead to a merge conflict, perhaps because the same file+got changed in two different ways. A nice feature is that these+merge conflicts are automatically resolved, rather than leaving+git in the middle of a conflicted merge, which would prevent further+syncing from happening.++When a conflict occurs, there will be several messages printed about the merge+conflict, and the file that has the merge conflict will be renamed, with+".variant-XXX" tacked onto it. So if there are two versions of file foo,+you might end up with "foo.variant-AAA" and "foo.variant-BBB". It's then+up to you to decide what to do with these two files. Perhaps you can+manually combine them back into a single file. Or perhaps you choose to+rename them to better names and keep two versions, or delete one version+you don't want.++The "AAA" and "BBB" in the above example are essentially arbitrary+(technically they are the MD5 checksum of the key). The automatic merge+conflict resoltuion is designed so that if two or more repositories both get+a merge conflict, and resolve it, the resolved repositories will not+themselves conflict. This is why it doesn't use something nicer, like+perhaps the name of the remote that the file came from.
@@ -0,0 +1,42 @@+When a file is annexed, a key is generated from its content and/or metadata.+The file checked into git symlinks to the key. This key can later be used+to retrieve the file's content (its value).++Multiple pluggable key-value backends are supported, and a single repository+can use different ones for different files.++* `SHA256E` -- The default backend for new files, combines a SHA256 hash of+ the file's content with the file's extension. This allows+ verifying that the file content is right, and can avoid duplicates of+ files with the same content. Its need to generate checksums+ can make it slower for large files. +* `SHA256` -- Does not include the file extension in the key, which can+ lead to better deduplication but can confuse some programs.+* `WORM` ("Write Once, Read Many") This assumes that any file with+ the same basename, size, and modification time has the same content.+ This is the least expensive backend, recommended for really large+ files or slow systems.+* `SHA512`, `SHA512E` -- Best currently available hash, for the very paranoid.+* `SHA1`, `SHA1E` -- Smaller hash than `SHA256` for those who want a checksum+ but are not concerned about security.+* `SHA384`, `SHA384E`, `SHA224`, `SHA224E` -- Hashes for people who like+ unusual sizes.+* `SKEIN512`, `SKEIN256` -- [Skein hash](http://en.wikipedia.org/wiki/Skein_hash),+ a well-regarded SHA3 hash competition finalist.++The `annex.backends` git-config setting can be used to list the backends+git-annex should use. The first one listed will be used by default when+new files are added.++For finer control of what backend is used when adding different types of+files, the `.gitattributes` file can be used. The `annex.backend`+attribute can be set to the name of the backend to use for matching files.++For example, to use the SHA256E backend for sound files, which tend to be+smallish and might be modified or copied over time,+while using the WORM backend for everything else, you could set+in `.gitattributes`:++ * annex.backend=WORM+ *.mp3 annex.backend=SHA256E+ *.ogg annex.backend=SHA256E
@@ -0,0 +1,13 @@+[[!comment format=mdwn+ username="http://nanotech.nanotechcorp.net/"+ nickname="NanoTech"+ subject="SHA performance"+ date="2012-08-10T04:37:32Z"+ content="""+It turns out that (at least on x86-64 machines) `SHA512` [is faster than][1] `SHA256`. In some benchmarks I performed<sup>1</sup> `SHA256` was 1.8–2.2x slower than `SHA1` while `SHA512` was only 1.5–1.6x slower.++`SHA224` and `SHA384` are effectively just truncated versions of `SHA256` and `SHA512` so their performance characteristics are identical.++[1]: https://community.emc.com/community/edn/rsashare/blog/2010/11/01/sha-2-algorithms-when-sha-512-is-more-secure-and-faster+<sup>1</sup> `time head -c 100000000 /dev/zero | shasum -a 512`+"""]]
@@ -0,0 +1,24 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawm7eqCMh_B7mxE0tnchbr0JoYu11FUAFRY"+ nickname="Stéphane"+ subject="Tracking remote copies not even stored locally / URL backend turned into a "special remote"."+ date="2013-01-03T10:59:35Z"+ content="""+In case you came here looking for the URL backend.++## The URL backend++Several documents on the web refer to a special \"URL backend\", e.g. [Large file management with git-annex [LWN.net]](http://lwn.net/Articles/419241/). Historical content will never be updated yet it drives people to living places.++## Why a URL backend ?++It is interesting because you can:++* let `git-annex` rest on the fact that some documents are available as extra copies available at any time (but from something that is not a git repository).+* track these documents like your own with all git features, which opens up some truly marvelous combinations, which this margin is too narrow to contain (Pierre d.F. wouldn't disapprove ;-).++## How/Where now ?++`git-annex` used to have a URL backend. It seems that the design changed into a \"special remote\" feature, not limited to the web. You can now track files available through plain directories, rsync, webdav, some cloud storage, etc, even clay tablets. For details see [[special remotes]].++"""]]
@@ -0,0 +1,12 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawmicVKRM8vJX4wPuAwlLEoS2cjmFXQkjkE"+ nickname="Thomas"+ subject="Please be more specific about what information goes into the key"+ date="2013-07-31T11:55:09Z"+ content="""+It's a bit confusing to read that SHA256 does not include the file extension from which I can deduct that SHA256E does include it. What else does it include? I used to \"seed\" my git-annex with localy available data by \"git-annex add\"-ing it in a temporary folder without doing a commit and than to initiate a copy from the slow remote annex repo. My theory was that remote copy sees the pre-seeded files and does not need to copy them again.++But does this theory hold true for different file names, extensions, modification date, full path? Maybe you could also link to the code that implements the different backends so that curious readers can check for themselves.++Thank you!+"""]]
@@ -0,0 +1,48 @@+Due to popular demand, git-annex can now be used with bare repositories.++So, for example, you can stash a file away in the origin:+`git annex move mybigfile --to origin`++Of course, for that to work, the bare repository has to be on a system with+[[git-annex-shell]] installed. If "origin" is on GitWeb, you still can't+use git-annex to store stuff there.++It took a while, but bare repositories are now supported exactly as well+as non-bare repositories. Except for these caveats:++* `git annex fsck` works in a bare repository, but does not display+ warnings about insufficient+ [[copies]]. To get those warnings, just run it in one of the non-bare+ checkouts.+* `git annex unused` in a bare repository only knows about keys used in+ branches that have been pushed to the bare repository. So use it with care..+* Commands that need a work tree, like `git annex add` won't work in a bare+ repository, of course.+* However, you can (with recent versions of git-annex) run `git annex copy`,+ `git annex get`, and `git annex move` in a bare repository. These behave+ as if the `--all` option were used, and just operate on every single+ version of every single file that is present in the git repository+ history.++***++Here is a quick example of how to set this up, using `origin` as the remote name, and assuming `~/annex` contains an annex:++On the server:++ git init --bare bare-annex.git+ cd bare-annex.git && git annex init origin++Now configure the remote and do the initial push:++ cd ~/annex+ git remote add origin example.com:bare-annex.git+ git push origin master git-annex++Now `git annex status` should show the configured bare remote. If it does not, you may have to pull from the remote first (older versions of `git-annex`)++If you wish to configure git such that you can push/pull without arguments, set the upstream branch:++ git branch master --set-upstream origin/master++
@@ -0,0 +1,22 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawmraN_ldJplGunVGmnjjLN6jL9s9TrVMGE"+ nickname="Ævar Arnfjörð"+ subject="How to convert bare repositories to non-bare"+ date="2012-11-11T20:14:44Z"+ content="""+I made a repository bare and later wanted to convert it, this would have worked with just plain git:++ cd bare-repo.git+ mkdir .git+ mv .??* * .git/+ git config --unset core.bare+ git reset --hard++But because git-annex uses different hashing directories under bare repositories all the files in the repo will point to files you don't have. Here's how you can fix that up assuming you're using a backend that assigns unique hashes based on file content (e.g. the SHA256 backend):++ mv .git/annex/objects from-bare-repo+ git annex add from-bare-repo+ git rm -f from-bare-repo+++"""]]
@@ -0,0 +1,18 @@+This is git-annex's bug list.++[[!sidebar content="""+[[!inline feeds=no template=bare pages=sidebar]]++Categories:++* [[Bugs_affecting_the_assistant|design/assistant/todo]]+* [[Bugs_needing_more_info|moreinfo]]+* [[Closed_bugs|bugs/done]]+"""+]]++[[!inline pages="./bugs/* and !./bugs/*/* and !./bugs/done and !link(done) +and !./bugs/moreinfo and !link(moreinfo)+and !*/Discussion" actions=yes postform=yes show=0 archive=yes]]++[[!edittemplate template=templates/bugtemplate match="bugs/*" silent=yes]]
@@ -0,0 +1,432 @@+Git-annex stopped compiling with GHC 7.4.2 after updating Yesod and friends to the respective latest version. The complete build log is attached below. I hope this helps. Further build logs are available at <http://hydra.nixos.org/job/nixpkgs/trunk/gitAndTools.gitAnnex>, too.++ building+ make flags: PREFIX=/nix/store/9az61h33v1j6fkdmwdfy7gi0rhspsb9k-git-annex-3.20121112+ building Build/SysConfig.hs+ ghc -O2 -Wall -outputdir tmp -IUtility -DWITH_ASSISTANT -DWITH_S3 -DWITH_WEBAPP -DWITH_PAIRING -DWITH_XMPP -DWITH_DNS -DWITH_INOTIFY -DWITH_DBUS -threaded --make configure[b+ [1 of 7] Compiling Utility.Exception ( Utility/Exception.hs, tmp/Utility/Exception.o )+ [2 of 7] Compiling Utility.Misc ( Utility/Misc.hs, tmp/Utility/Misc.o )+ [3 of 7] Compiling Utility.Process ( Utility/Process.hs, tmp/Utility/Process.o )+ [4 of 7] Compiling Utility.SafeCommand ( Utility/SafeCommand.hs, tmp/Utility/SafeCommand.o )+ [5 of 7] Compiling Build.TestConfig ( Build/TestConfig.hs, tmp/Build/TestConfig.o )+ [6 of 7] Compiling Build.Configure ( Build/Configure.hs, tmp/Build/Configure.o )+ [7 of 7] Compiling Main ( configure.hs, tmp/Main.o )+ Linking configure ...+ ./configure+ checking version... 3.20121112+ checking git... yes+ checking git version... 1.8.0+ checking cp -a... yes+ checking cp -p... yes+ checking cp --reflink=auto... yes+ checking uuid generator... uuidgen+ checking xargs -0... yes+ checking rsync... yes+ checking curl... yes+ checking wget... no+ checking bup... no+ checking gpg... no+ checking lsof... no+ checking ssh connection caching... yes+ checking sha1... sha1sum+ checking sha256... sha256sum+ checking sha512... sha512sum+ checking sha224... sha224sum+ checking sha384... sha384sum+ building Utility/Touch.hs+ hsc2hs Utility/Touch.hsc[b+ building Utility/Mounts.hs+ hsc2hs Utility/Mounts.hsc[b+ building Utility/libdiskfree.o+ cc -Wall -c -o Utility/libdiskfree.o Utility/libdiskfree.c[b+ building Utility/libmounts.o+ cc -Wall -c -o Utility/libmounts.o Utility/libmounts.c[b+ building git-annex+ install -d tmp[b+ ghc -O2 -Wall -outputdir tmp -IUtility -DWITH_ASSISTANT -DWITH_S3 -DWITH_WEBAPP -DWITH_PAIRING -DWITH_XMPP -DWITH_DNS -DWITH_INOTIFY -DWITH_DBUS -threaded --make git-annex -o tmp/git-annex Utility/libdiskfree.o Utility/libmounts.o[b+ [ 1 of 279] Compiling Utility.Dot ( Utility/Dot.hs, tmp/Utility/Dot.o )+ [ 2 of 279] Compiling Utility.ThreadLock ( Utility/ThreadLock.hs, tmp/Utility/ThreadLock.o )+ [ 3 of 279] Compiling Utility.Mounts ( Utility/Mounts.hs, tmp/Utility/Mounts.o )+ [ 4 of 279] Compiling Utility.Yesod ( Utility/Yesod.hs, tmp/Utility/Yesod.o )+ [ 5 of 279] Compiling Utility.Tense ( Utility/Tense.hs, tmp/Utility/Tense.o )+ [ 6 of 279] Compiling Utility.Verifiable ( Utility/Verifiable.hs, tmp/Utility/Verifiable.o )+ [ 7 of 279] Compiling Assistant.Types.TransferSlots ( Assistant/Types/TransferSlots.hs, tmp/Assistant/Types/TransferSlots.o )+ [ 8 of 279] Compiling Types.StandardGroups ( Types/StandardGroups.hs, tmp/Types/StandardGroups.o )+ [ 9 of 279] Compiling Utility.Percentage ( Utility/Percentage.hs, tmp/Utility/Percentage.o )+ [ 10 of 279] Compiling Utility.Base64 ( Utility/Base64.hs, tmp/Utility/Base64.o )+ [ 11 of 279] Compiling Utility.DataUnits ( Utility/DataUnits.hs, tmp/Utility/DataUnits.o )+ [ 12 of 279] Compiling Utility.JSONStream ( Utility/JSONStream.hs, tmp/Utility/JSONStream.o )+ [ 13 of 279] Compiling Messages.JSON ( Messages/JSON.hs, tmp/Messages/JSON.o )+ [ 14 of 279] Compiling Build.SysConfig ( Build/SysConfig.hs, tmp/Build/SysConfig.o )+ [ 15 of 279] Compiling Types.KeySource ( Types/KeySource.hs, tmp/Types/KeySource.o )+ [ 16 of 279] Compiling Utility.State ( Utility/State.hs, tmp/Utility/State.o )+ [ 17 of 279] Compiling Types.UUID ( Types/UUID.hs, tmp/Types/UUID.o )+ [ 18 of 279] Compiling Types.Messages ( Types/Messages.hs, tmp/Types/Messages.o )+ [ 19 of 279] Compiling Types.Group ( Types/Group.hs, tmp/Types/Group.o )+ [ 20 of 279] Compiling Types.TrustLevel ( Types/TrustLevel.hs, tmp/Types/TrustLevel.o )+ [ 21 of 279] Compiling Types.BranchState ( Types/BranchState.hs, tmp/Types/BranchState.o )+ [ 22 of 279] Compiling Utility.PartialPrelude ( Utility/PartialPrelude.hs, tmp/Utility/PartialPrelude.o )+ [ 23 of 279] Compiling Utility.HumanTime ( Utility/HumanTime.hs, tmp/Utility/HumanTime.o )+ [ 24 of 279] Compiling Utility.Format ( Utility/Format.hs, tmp/Utility/Format.o )+ [ 25 of 279] Compiling Utility.FileSystemEncoding ( Utility/FileSystemEncoding.hs, tmp/Utility/FileSystemEncoding.o )+ [ 26 of 279] Compiling Utility.Touch ( Utility/Touch.hs, tmp/Utility/Touch.o )+ [ 27 of 279] Compiling Utility.Applicative ( Utility/Applicative.hs, tmp/Utility/Applicative.o )+ [ 28 of 279] Compiling Utility.Monad ( Utility/Monad.hs, tmp/Utility/Monad.o )+ [ 29 of 279] Compiling Utility.Exception ( Utility/Exception.hs, tmp/Utility/Exception.o )+ [ 30 of 279] Compiling Utility.DBus ( Utility/DBus.hs, tmp/Utility/DBus.o )+ [ 31 of 279] Compiling Utility.Misc ( Utility/Misc.hs, tmp/Utility/Misc.o )+ [ 32 of 279] Compiling Utility.Process ( Utility/Process.hs, tmp/Utility/Process.o )+ [ 33 of 279] Compiling Utility.SafeCommand ( Utility/SafeCommand.hs, tmp/Utility/SafeCommand.o )+ [ 34 of 279] Compiling Utility.Network ( Utility/Network.hs, tmp/Utility/Network.o )+ [ 35 of 279] Compiling Utility.SRV ( Utility/SRV.hs, tmp/Utility/SRV.o )++ Utility/SRV.hs:88:1: Warning: Defined but not used: `lookupSRVHost'++ Utility/SRV.hs:94:1: Warning: Defined but not used: `parseSrvHost'+ [ 36 of 279] Compiling Git.Types ( Git/Types.hs, tmp/Git/Types.o )+ [ 37 of 279] Compiling Utility.UserInfo ( Utility/UserInfo.hs, tmp/Utility/UserInfo.o )+ [ 38 of 279] Compiling Utility.Path ( Utility/Path.hs, tmp/Utility/Path.o )+ [ 39 of 279] Compiling Utility.TempFile ( Utility/TempFile.hs, tmp/Utility/TempFile.o )+ [ 40 of 279] Compiling Utility.Directory ( Utility/Directory.hs, tmp/Utility/Directory.o )+ [ 41 of 279] Compiling Utility.FreeDesktop ( Utility/FreeDesktop.hs, tmp/Utility/FreeDesktop.o )+ [ 42 of 279] Compiling Assistant.Install.AutoStart ( Assistant/Install/AutoStart.hs, tmp/Assistant/Install/AutoStart.o )+ [ 43 of 279] Compiling Common ( Common.hs, tmp/Common.o )+ [ 44 of 279] Compiling Utility.FileMode ( Utility/FileMode.hs, tmp/Utility/FileMode.o )+ [ 45 of 279] Compiling Git ( Git.hs, tmp/Git.o )+ [ 46 of 279] Compiling Git.FilePath ( Git/FilePath.hs, tmp/Git/FilePath.o )+ [ 47 of 279] Compiling Utility.Matcher ( Utility/Matcher.hs, tmp/Utility/Matcher.o )+ [ 48 of 279] Compiling Utility.Gpg ( Utility/Gpg.hs, tmp/Utility/Gpg.o )+ [ 49 of 279] Compiling Types.Crypto ( Types/Crypto.hs, tmp/Types/Crypto.o )+ [ 50 of 279] Compiling Types.Key ( Types/Key.hs, tmp/Types/Key.o )+ [ 51 of 279] Compiling Types.Backend ( Types/Backend.hs, tmp/Types/Backend.o )+ [ 52 of 279] Compiling Types.Remote ( Types/Remote.hs, tmp/Types/Remote.o )+ [ 53 of 279] Compiling Git.Sha ( Git/Sha.hs, tmp/Git/Sha.o )+ [ 54 of 279] Compiling Utility.CoProcess ( Utility/CoProcess.hs, tmp/Utility/CoProcess.o )+ [ 55 of 279] Compiling Git.Command ( Git/Command.hs, tmp/Git/Command.o )+ [ 56 of 279] Compiling Git.Ref ( Git/Ref.hs, tmp/Git/Ref.o )+ [ 57 of 279] Compiling Git.Branch ( Git/Branch.hs, tmp/Git/Branch.o )+ [ 58 of 279] Compiling Git.UpdateIndex ( Git/UpdateIndex.hs, tmp/Git/UpdateIndex.o )+ [ 59 of 279] Compiling Git.Queue ( Git/Queue.hs, tmp/Git/Queue.o )+ [ 60 of 279] Compiling Git.HashObject ( Git/HashObject.hs, tmp/Git/HashObject.o )+ [ 61 of 279] Compiling Git.CatFile ( Git/CatFile.hs, tmp/Git/CatFile.o )+ [ 62 of 279] Compiling Git.UnionMerge ( Git/UnionMerge.hs, tmp/Git/UnionMerge.o )+ [ 63 of 279] Compiling Git.Url ( Git/Url.hs, tmp/Git/Url.o )+ [ 64 of 279] Compiling Git.Construct ( Git/Construct.hs, tmp/Git/Construct.o )+ [ 65 of 279] Compiling Git.Config ( Git/Config.hs, tmp/Git/Config.o )+ [ 66 of 279] Compiling Git.SharedRepository ( Git/SharedRepository.hs, tmp/Git/SharedRepository.o )+ [ 67 of 279] Compiling Git.Version ( Git/Version.hs, tmp/Git/Version.o )+ [ 68 of 279] Compiling Git.CheckAttr ( Git/CheckAttr.hs, tmp/Git/CheckAttr.o )+ [ 69 of 279] Compiling Annex ( Annex.hs, tmp/Annex.o )+ [ 70 of 279] Compiling Types.Option ( Types/Option.hs, tmp/Types/Option.o )+ [ 71 of 279] Compiling Types ( Types.hs, tmp/Types.o )+ [ 72 of 279] Compiling Messages ( Messages.hs, tmp/Messages.o )+ [ 73 of 279] Compiling Types.Command ( Types/Command.hs, tmp/Types/Command.o )+ [ 74 of 279] Compiling Locations ( Locations.hs, tmp/Locations.o )+ [ 75 of 279] Compiling Common.Annex ( Common/Annex.hs, tmp/Common/Annex.o )+ [ 76 of 279] Compiling Fields ( Fields.hs, tmp/Fields.o )+ [ 77 of 279] Compiling Annex.BranchState ( Annex/BranchState.hs, tmp/Annex/BranchState.o )+ [ 78 of 279] Compiling Annex.CatFile ( Annex/CatFile.hs, tmp/Annex/CatFile.o )+ [ 79 of 279] Compiling Annex.Perms ( Annex/Perms.hs, tmp/Annex/Perms.o )+ [ 80 of 279] Compiling Crypto ( Crypto.hs, tmp/Crypto.o )+ [ 81 of 279] Compiling Annex.Exception ( Annex/Exception.hs, tmp/Annex/Exception.o )+ [ 82 of 279] Compiling Annex.Journal ( Annex/Journal.hs, tmp/Annex/Journal.o )+ [ 83 of 279] Compiling Annex.Branch ( Annex/Branch.hs, tmp/Annex/Branch.o )+ [ 84 of 279] Compiling Usage ( Usage.hs, tmp/Usage.o )+ [ 85 of 279] Compiling Annex.CheckAttr ( Annex/CheckAttr.hs, tmp/Annex/CheckAttr.o )+ [ 86 of 279] Compiling Remote.Helper.Special ( Remote/Helper/Special.hs, tmp/Remote/Helper/Special.o )+ [ 87 of 279] Compiling Logs.Presence ( Logs/Presence.hs, tmp/Logs/Presence.o )+ [ 88 of 279] Compiling Logs.Location ( Logs/Location.hs, tmp/Logs/Location.o )+ [ 89 of 279] Compiling Logs.Web ( Logs/Web.hs, tmp/Logs/Web.o )+ [ 90 of 279] Compiling Annex.LockPool ( Annex/LockPool.hs, tmp/Annex/LockPool.o )+ [ 91 of 279] Compiling Logs.Transfer ( Logs/Transfer.hs, tmp/Logs/Transfer.o )+ [ 92 of 279] Compiling Backend.SHA ( Backend/SHA.hs, tmp/Backend/SHA.o )+ [ 93 of 279] Compiling Backend.WORM ( Backend/WORM.hs, tmp/Backend/WORM.o )+ [ 94 of 279] Compiling Backend.URL ( Backend/URL.hs, tmp/Backend/URL.o )+ [ 95 of 279] Compiling Assistant.Types.ScanRemotes ( Assistant/Types/ScanRemotes.hs, tmp/Assistant/Types/ScanRemotes.o )+ [ 96 of 279] Compiling Assistant.Types.ThreadedMonad ( Assistant/Types/ThreadedMonad.hs, tmp/Assistant/Types/ThreadedMonad.o )+ [ 97 of 279] Compiling Assistant.Types.TransferQueue ( Assistant/Types/TransferQueue.hs, tmp/Assistant/Types/TransferQueue.o )+ [ 98 of 279] Compiling Assistant.Types.Pushes ( Assistant/Types/Pushes.hs, tmp/Assistant/Types/Pushes.o )+ [ 99 of 279] Compiling Assistant.Types.BranchChange ( Assistant/Types/BranchChange.hs, tmp/Assistant/Types/BranchChange.o )+ [100 of 279] Compiling Logs.UUIDBased ( Logs/UUIDBased.hs, tmp/Logs/UUIDBased.o )+ [101 of 279] Compiling Logs.Remote ( Logs/Remote.hs, tmp/Logs/Remote.o )+ [102 of 279] Compiling Logs.Group ( Logs/Group.hs, tmp/Logs/Group.o )+ [103 of 279] Compiling Utility.DiskFree ( Utility/DiskFree.hs, tmp/Utility/DiskFree.o )+ [104 of 279] Compiling Utility.Url ( Utility/Url.hs, tmp/Utility/Url.o )+ [105 of 279] Compiling Utility.CopyFile ( Utility/CopyFile.hs, tmp/Utility/CopyFile.o )+ [106 of 279] Compiling Utility.Rsync ( Utility/Rsync.hs, tmp/Utility/Rsync.o )+ [107 of 279] Compiling Git.LsFiles ( Git/LsFiles.hs, tmp/Git/LsFiles.o )+ [108 of 279] Compiling Git.AutoCorrect ( Git/AutoCorrect.hs, tmp/Git/AutoCorrect.o )+ [109 of 279] Compiling Git.CurrentRepo ( Git/CurrentRepo.hs, tmp/Git/CurrentRepo.o )+ [110 of 279] Compiling Locations.UserConfig ( Locations/UserConfig.hs, tmp/Locations/UserConfig.o )+ [111 of 279] Compiling Utility.ThreadScheduler ( Utility/ThreadScheduler.hs, tmp/Utility/ThreadScheduler.o )+ [112 of 279] Compiling Git.Merge ( Git/Merge.hs, tmp/Git/Merge.o )+ [113 of 279] Compiling Utility.Parallel ( Utility/Parallel.hs, tmp/Utility/Parallel.o )+ [114 of 279] Compiling Git.Remote ( Git/Remote.hs, tmp/Git/Remote.o )+ [115 of 279] Compiling Assistant.Ssh ( Assistant/Ssh.hs, tmp/Assistant/Ssh.o )+ [116 of 279] Compiling Assistant.Pairing ( Assistant/Pairing.hs, tmp/Assistant/Pairing.o )+ [117 of 279] Compiling Assistant.Types.NetMessager ( Assistant/Types/NetMessager.hs, tmp/Assistant/Types/NetMessager.o )+ [118 of 279] Compiling Utility.NotificationBroadcaster ( Utility/NotificationBroadcaster.hs, tmp/Utility/NotificationBroadcaster.o )+ [119 of 279] Compiling Assistant.Types.Buddies ( Assistant/Types/Buddies.hs, tmp/Assistant/Types/Buddies.o )+ [120 of 279] Compiling Utility.TSet ( Utility/TSet.hs, tmp/Utility/TSet.o )+ [121 of 279] Compiling Assistant.Types.Commits ( Assistant/Types/Commits.hs, tmp/Assistant/Types/Commits.o )+ [122 of 279] Compiling Assistant.Types.Changes ( Assistant/Types/Changes.hs, tmp/Assistant/Types/Changes.o )+ [123 of 279] Compiling Utility.WebApp ( Utility/WebApp.hs, tmp/Utility/WebApp.o )+ [124 of 279] Compiling Utility.Daemon ( Utility/Daemon.hs, tmp/Utility/Daemon.o )+ [125 of 279] Compiling Utility.LogFile ( Utility/LogFile.hs, tmp/Utility/LogFile.o )+ [126 of 279] Compiling Git.Filename ( Git/Filename.hs, tmp/Git/Filename.o )+ [127 of 279] Compiling Git.LsTree ( Git/LsTree.hs, tmp/Git/LsTree.o )+ [128 of 279] Compiling Utility.Types.DirWatcher ( Utility/Types/DirWatcher.hs, tmp/Utility/Types/DirWatcher.o )+ [129 of 279] Compiling Utility.INotify ( Utility/INotify.hs, tmp/Utility/INotify.o )+ [130 of 279] Compiling Utility.DirWatcher ( Utility/DirWatcher.hs, tmp/Utility/DirWatcher.o )+ [131 of 279] Compiling Utility.Lsof ( Utility/Lsof.hs, tmp/Utility/Lsof.o )+ [132 of 279] Compiling Config ( Config.hs, tmp/Config.o )+ [133 of 279] Compiling Annex.UUID ( Annex/UUID.hs, tmp/Annex/UUID.o )+ [134 of 279] Compiling Logs.UUID ( Logs/UUID.hs, tmp/Logs/UUID.o )+ [135 of 279] Compiling Backend ( Backend.hs, tmp/Backend.o )+ [136 of 279] Compiling Remote.Helper.Hooks ( Remote/Helper/Hooks.hs, tmp/Remote/Helper/Hooks.o )+ [137 of 279] Compiling Remote.Helper.Encryptable ( Remote/Helper/Encryptable.hs, tmp/Remote/Helper/Encryptable.o )+ [138 of 279] Compiling Annex.Queue ( Annex/Queue.hs, tmp/Annex/Queue.o )+ [139 of 279] Compiling Annex.Content ( Annex/Content.hs, tmp/Annex/Content.o )+ [140 of 279] Compiling Remote.S3 ( Remote/S3.hs, tmp/Remote/S3.o )+ [141 of 279] Compiling Remote.Directory ( Remote/Directory.hs, tmp/Remote/Directory.o )+ [142 of 279] Compiling Remote.Rsync ( Remote/Rsync.hs, tmp/Remote/Rsync.o )+ [143 of 279] Compiling Remote.Web ( Remote/Web.hs, tmp/Remote/Web.o )+ [144 of 279] Compiling Remote.Hook ( Remote/Hook.hs, tmp/Remote/Hook.o )+ [145 of 279] Compiling Upgrade.V2 ( Upgrade/V2.hs, tmp/Upgrade/V2.o )+ [146 of 279] Compiling Annex.Ssh ( Annex/Ssh.hs, tmp/Annex/Ssh.o )+ [147 of 279] Compiling Remote.Helper.Ssh ( Remote/Helper/Ssh.hs, tmp/Remote/Helper/Ssh.o )+ [148 of 279] Compiling Remote.Bup ( Remote/Bup.hs, tmp/Remote/Bup.o )+ [149 of 279] Compiling Annex.Version ( Annex/Version.hs, tmp/Annex/Version.o )+ [150 of 279] Compiling Init ( Init.hs, tmp/Init.o )+ [151 of 279] Compiling Checks ( Checks.hs, tmp/Checks.o )+ [152 of 279] Compiling Remote.Git ( Remote/Git.hs, tmp/Remote/Git.o )+ [153 of 279] Compiling Remote.List ( Remote/List.hs, tmp/Remote/List.o )+ [154 of 279] Compiling Logs.Trust ( Logs/Trust.hs, tmp/Logs/Trust.o )+ [155 of 279] Compiling Remote ( Remote.hs, tmp/Remote.o )+ [156 of 279] Compiling Assistant.Alert ( Assistant/Alert.hs, tmp/Assistant/Alert.o )+ Loading package ghc-prim ... linking ... done.+ Loading package integer-gmp ... linking ... done.+ Loading package base ... linking ... done.+ Loading object (static) Utility/libdiskfree.o ... done+ Loading object (static) Utility/libmounts.o ... done+ final link ... done+ Loading package pretty-1.1.1.0 ... linking ... done.+ Loading package filepath-1.3.0.0 ... linking ... done.+ Loading package old-locale-1.0.0.4 ... linking ... done.+ Loading package old-time-1.1.0.0 ... linking ... done.+ Loading package bytestring-0.9.2.1 ... linking ... done.+ Loading package unix-2.5.1.0 ... linking ... done.+ Loading package directory-1.1.0.2 ... linking ... done.+ Loading package process-1.1.0.1 ... linking ... done.+ Loading package array-0.4.0.0 ... linking ... done.+ Loading package deepseq-1.3.0.0 ... linking ... done.+ Loading package time-1.4 ... linking ... done.+ Loading package containers-0.4.2.1 ... linking ... done.+ Loading package text-0.11.2.0 ... linking ... done.+ Loading package blaze-builder-0.3.1.0 ... linking ... done.+ Loading package blaze-markup-0.5.1.1 ... linking ... done.+ Loading package blaze-html-0.5.1.0 ... linking ... done.+ Loading package hashable-1.1.2.5 ... linking ... done.+ Loading package case-insensitive-0.4.0.3 ... linking ... done.+ Loading package primitive-0.5.0.1 ... linking ... done.+ Loading package vector-0.10.0.1 ... linking ... done.+ Loading package random-1.0.1.1 ... linking ... done.+ Loading package dlist-0.5 ... linking ... done.+ Loading package data-default-0.5.0 ... linking ... done.+ Loading package transformers-0.3.0.0 ... linking ... done.+ Loading package mtl-2.1.1 ... linking ... done.+ Loading package parsec-3.1.2 ... linking ... done.+ Loading package network-2.3.0.13 ... linking ... done.+ Loading package failure-0.2.0.1 ... linking ... done.+ Loading package template-haskell ... linking ... done.+ Loading package shakespeare-1.0.2 ... linking ... done.+ Loading package hamlet-1.1.1.1 ... linking ... done.+ Loading package http-types-0.7.3.0.1 ... linking ... done.+ Loading package base-unicode-symbols-0.2.2.4 ... linking ... done.+ Loading package transformers-base-0.4.1 ... linking ... done.+ Loading package monad-control-0.3.1.4 ... linking ... done.+ Loading package lifted-base-0.2 ... linking ... done.+ Loading package resourcet-0.4.3 ... linking ... done.+ Loading package semigroups-0.8.4.1 ... linking ... done.+ Loading package void-0.5.8 ... linking ... done.+ Loading package conduit-0.5.4.1 ... linking ... done.+ Loading package unordered-containers-0.2.2.1 ... linking ... done.+ Loading package vault-0.2.0.1 ... linking ... done.+ Loading package wai-1.3.0.1 ... linking ... done.+ Loading package date-cache-0.3.0 ... linking ... done.+ Loading package unix-time-0.1.2 ... linking ... done.+ Loading package fast-logger-0.3.1 ... linking ... done.+ Loading package attoparsec-0.10.2.0 ... linking ... done.+ Loading package cookie-0.4.0.1 ... linking ... done.+ Loading package shakespeare-css-1.0.2 ... linking ... done.+ Loading package syb-0.3.6.1 ... linking ... done.+ Loading package aeson-0.6.0.2 ... linking ... done.+ Loading package shakespeare-js-1.1.0 ... linking ... done.+ Loading package ansi-terminal-0.5.5 ... linking ... done.+ Loading package blaze-builder-conduit-0.5.0.2 ... linking ... done.+ Loading package stringsearch-0.3.6.4 ... linking ... done.+ Loading package byteorder-1.0.3 ... linking ... done.+ Loading package wai-logger-0.3.0 ... linking ... done.+ Loading package zlib-0.5.3.3 ... linking ... done.+ Loading package zlib-bindings-0.1.1.1 ... linking ... done.+ Loading package zlib-conduit-0.5.0.2 ... linking ... done.+ Loading package wai-extra-1.3.0.4 ... linking ... done.+ Loading package monad-logger-0.2.1 ... linking ... done.+ Loading package cereal-0.3.5.2 ... linking ... done.+ Loading package base64-bytestring-1.0.0.0 ... linking ... done.+ Loading package cipher-aes-0.1.2 ... linking ... done.+ Loading package entropy-0.2.1 ... linking ... done.+ Loading package largeword-1.0.3 ... linking ... done.+ Loading package tagged-0.4.4 ... linking ... done.+ Loading package crypto-api-0.10.2 ... linking ... done.+ Loading package cpu-0.1.1 ... linking ... done.+ Loading package crypto-pubkey-types-0.1.1 ... linking ... done.+ Loading package cryptocipher-0.3.5 ... linking ... done.+ Loading package cprng-aes-0.2.4 ... linking ... done.+ Loading package skein-0.1.0.9 ... linking ... done.+ Loading package clientsession-0.8.0.1 ... linking ... done.+ Loading package path-pieces-0.1.2 ... linking ... done.+ Loading package shakespeare-i18n-1.0.0.2 ... linking ... done.+ Loading package yesod-routes-1.1.1.1 ... linking ... done.+ Loading package yesod-core-1.1.5 ... linking ... done.+ [157 of 279] Compiling Assistant.Types.DaemonStatus ( Assistant/Types/DaemonStatus.hs, tmp/Assistant/Types/DaemonStatus.o )+ [158 of 279] Compiling Assistant.Monad ( Assistant/Monad.hs, tmp/Assistant/Monad.o )+ [159 of 279] Compiling Assistant.Types.NamedThread ( Assistant/Types/NamedThread.hs, tmp/Assistant/Types/NamedThread.o )+ [160 of 279] Compiling Assistant.Common ( Assistant/Common.hs, tmp/Assistant/Common.o )+ [161 of 279] Compiling Assistant.XMPP ( Assistant/XMPP.hs, tmp/Assistant/XMPP.o )+ [162 of 279] Compiling Assistant.XMPP.Buddies ( Assistant/XMPP/Buddies.hs, tmp/Assistant/XMPP/Buddies.o )+ [163 of 279] Compiling Assistant.NetMessager ( Assistant/NetMessager.hs, tmp/Assistant/NetMessager.o )++ Assistant/NetMessager.hs:12:1:+ Warning: The import of `Types.Remote' is redundant+ except perhaps to import instances from `Types.Remote'+ To import instances alone, use: import Types.Remote()++ Assistant/NetMessager.hs:13:1:+ Warning: The import of `Git' is redundant+ except perhaps to import instances from `Git'+ To import instances alone, use: import Git()++ Assistant/NetMessager.hs:20:1:+ Warning: The import of `Data.Text' is redundant+ except perhaps to import instances from `Data.Text'+ To import instances alone, use: import Data.Text()+ [164 of 279] Compiling Assistant.Pushes ( Assistant/Pushes.hs, tmp/Assistant/Pushes.o )+ [165 of 279] Compiling Assistant.ScanRemotes ( Assistant/ScanRemotes.hs, tmp/Assistant/ScanRemotes.o )+ [166 of 279] Compiling Assistant.Install ( Assistant/Install.hs, tmp/Assistant/Install.o )+ [167 of 279] Compiling Assistant.XMPP.Client ( Assistant/XMPP/Client.hs, tmp/Assistant/XMPP/Client.o )+ [168 of 279] Compiling Assistant.Commits ( Assistant/Commits.hs, tmp/Assistant/Commits.o )+ [169 of 279] Compiling Assistant.BranchChange ( Assistant/BranchChange.hs, tmp/Assistant/BranchChange.o )+ [170 of 279] Compiling Assistant.Changes ( Assistant/Changes.hs, tmp/Assistant/Changes.o )+ [171 of 279] Compiling Assistant.WebApp.Types ( Assistant/WebApp/Types.hs, tmp/Assistant/WebApp/Types.o )+ Loading package unix-compat-0.4.0.0 ... linking ... done.+ Loading package file-embed-0.0.4.6 ... linking ... done.+ Loading package system-filepath-0.4.7 ... linking ... done.+ Loading package system-fileio-0.3.10 ... linking ... done.+ Loading package cryptohash-0.7.8 ... linking ... done.+ Loading package crypto-conduit-0.4.0.1 ... linking ... done.+ Loading package http-date-0.0.2 ... linking ... done.+ Loading package mime-types-0.1.0.0 ... linking ... done.+ Loading package wai-app-static-1.3.0.4 ... linking ... done.+ Loading package yesod-static-1.1.1.1 ... linking ... done.+ [172 of 279] Compiling Assistant.WebApp ( Assistant/WebApp.hs, tmp/Assistant/WebApp.o )+ Loading package network-conduit-0.6.1.1 ... linking ... done.+ Loading package safe-0.3.3 ... linking ... done.+ Loading package simple-sendfile-0.2.8 ... linking ... done.+ Loading package warp-1.3.4.4 ... linking ... done.+ Loading package yaml-0.8.1 ... linking ... done.+ Loading package yesod-default-1.1.2 ... linking ... done.+ [173 of 279] Compiling Assistant.WebApp.OtherRepos ( Assistant/WebApp/OtherRepos.hs, tmp/Assistant/WebApp/OtherRepos.o )+ [174 of 279] Compiling Limit ( Limit.hs, tmp/Limit.o )+ [175 of 279] Compiling Option ( Option.hs, tmp/Option.o )+ [176 of 279] Compiling Seek ( Seek.hs, tmp/Seek.o )+ [177 of 279] Compiling Command ( Command.hs, tmp/Command.o )+ [178 of 279] Compiling CmdLine ( CmdLine.hs, tmp/CmdLine.o )+ [179 of 279] Compiling Command.ConfigList ( Command/ConfigList.hs, tmp/Command/ConfigList.o )+ [180 of 279] Compiling Command.InAnnex ( Command/InAnnex.hs, tmp/Command/InAnnex.o )+ [181 of 279] Compiling Command.DropKey ( Command/DropKey.hs, tmp/Command/DropKey.o )+ [182 of 279] Compiling Command.SendKey ( Command/SendKey.hs, tmp/Command/SendKey.o )+ [183 of 279] Compiling Command.RecvKey ( Command/RecvKey.hs, tmp/Command/RecvKey.o )+ [184 of 279] Compiling Command.TransferInfo ( Command/TransferInfo.hs, tmp/Command/TransferInfo.o )+ [185 of 279] Compiling Command.Commit ( Command/Commit.hs, tmp/Command/Commit.o )+ [186 of 279] Compiling Command.Add ( Command/Add.hs, tmp/Command/Add.o )+ [187 of 279] Compiling Command.Unannex ( Command/Unannex.hs, tmp/Command/Unannex.o )+ [188 of 279] Compiling Command.FromKey ( Command/FromKey.hs, tmp/Command/FromKey.o )+ [189 of 279] Compiling Command.ReKey ( Command/ReKey.hs, tmp/Command/ReKey.o )+ [190 of 279] Compiling Command.Fix ( Command/Fix.hs, tmp/Command/Fix.o )+ [191 of 279] Compiling Command.Describe ( Command/Describe.hs, tmp/Command/Describe.o )+ [192 of 279] Compiling Command.InitRemote ( Command/InitRemote.hs, tmp/Command/InitRemote.o )+ [193 of 279] Compiling Command.Unlock ( Command/Unlock.hs, tmp/Command/Unlock.o )+ [194 of 279] Compiling Command.Lock ( Command/Lock.hs, tmp/Command/Lock.o )+ [195 of 279] Compiling Command.PreCommit ( Command/PreCommit.hs, tmp/Command/PreCommit.o )+ [196 of 279] Compiling Command.Log ( Command/Log.hs, tmp/Command/Log.o )+ [197 of 279] Compiling Command.Merge ( Command/Merge.hs, tmp/Command/Merge.o )+ [198 of 279] Compiling Command.Group ( Command/Group.hs, tmp/Command/Group.o )+ [199 of 279] Compiling Command.Ungroup ( Command/Ungroup.hs, tmp/Command/Ungroup.o )+ [200 of 279] Compiling Command.Import ( Command/Import.hs, tmp/Command/Import.o )+ [201 of 279] Compiling Logs.Unused ( Logs/Unused.hs, tmp/Logs/Unused.o )+ [202 of 279] Compiling Command.AddUnused ( Command/AddUnused.hs, tmp/Command/AddUnused.o )+ [203 of 279] Compiling Command.Find ( Command/Find.hs, tmp/Command/Find.o )+ [204 of 279] Compiling Logs.PreferredContent ( Logs/PreferredContent.hs, tmp/Logs/PreferredContent.o )+ [205 of 279] Compiling Annex.Wanted ( Annex/Wanted.hs, tmp/Annex/Wanted.o )+ [206 of 279] Compiling Command.Whereis ( Command/Whereis.hs, tmp/Command/Whereis.o )+ [207 of 279] Compiling Command.Trust ( Command/Trust.hs, tmp/Command/Trust.o )+ [208 of 279] Compiling Command.Untrust ( Command/Untrust.hs, tmp/Command/Untrust.o )+ [209 of 279] Compiling Command.Semitrust ( Command/Semitrust.hs, tmp/Command/Semitrust.o )+ [210 of 279] Compiling Command.Dead ( Command/Dead.hs, tmp/Command/Dead.o )+ [211 of 279] Compiling Command.Vicfg ( Command/Vicfg.hs, tmp/Command/Vicfg.o )+ [212 of 279] Compiling Command.Map ( Command/Map.hs, tmp/Command/Map.o )+ [213 of 279] Compiling Command.Init ( Command/Init.hs, tmp/Command/Init.o )+ [214 of 279] Compiling Command.Uninit ( Command/Uninit.hs, tmp/Command/Uninit.o )+ [215 of 279] Compiling Command.Version ( Command/Version.hs, tmp/Command/Version.o )+ [216 of 279] Compiling Upgrade.V1 ( Upgrade/V1.hs, tmp/Upgrade/V1.o )+ [217 of 279] Compiling Upgrade.V0 ( Upgrade/V0.hs, tmp/Upgrade/V0.o )+ [218 of 279] Compiling Upgrade ( Upgrade.hs, tmp/Upgrade.o )+ [219 of 279] Compiling Command.Upgrade ( Command/Upgrade.hs, tmp/Command/Upgrade.o )+ [220 of 279] Compiling Command.Drop ( Command/Drop.hs, tmp/Command/Drop.o )+ [221 of 279] Compiling Command.Move ( Command/Move.hs, tmp/Command/Move.o )+ [222 of 279] Compiling Command.Copy ( Command/Copy.hs, tmp/Command/Copy.o )+ [223 of 279] Compiling Command.Get ( Command/Get.hs, tmp/Command/Get.o )+ [224 of 279] Compiling Command.TransferKey ( Command/TransferKey.hs, tmp/Command/TransferKey.o )+ [225 of 279] Compiling Command.DropUnused ( Command/DropUnused.hs, tmp/Command/DropUnused.o )+ [226 of 279] Compiling Command.Fsck ( Command/Fsck.hs, tmp/Command/Fsck.o )+ [227 of 279] Compiling Command.Reinject ( Command/Reinject.hs, tmp/Command/Reinject.o )+ [228 of 279] Compiling Command.Migrate ( Command/Migrate.hs, tmp/Command/Migrate.o )+ [229 of 279] Compiling Command.Unused ( Command/Unused.hs, tmp/Command/Unused.o )+ [230 of 279] Compiling Command.Status ( Command/Status.hs, tmp/Command/Status.o )+ [231 of 279] Compiling Command.Sync ( Command/Sync.hs, tmp/Command/Sync.o )+ [232 of 279] Compiling Command.Help ( Command/Help.hs, tmp/Command/Help.o )+ [233 of 279] Compiling Command.AddUrl ( Command/AddUrl.hs, tmp/Command/AddUrl.o )+ [234 of 279] Compiling Assistant.DaemonStatus ( Assistant/DaemonStatus.hs, tmp/Assistant/DaemonStatus.o )+ [235 of 279] Compiling Assistant.Sync ( Assistant/Sync.hs, tmp/Assistant/Sync.o )+ [236 of 279] Compiling Assistant.MakeRemote ( Assistant/MakeRemote.hs, tmp/Assistant/MakeRemote.o )+ [237 of 279] Compiling Assistant.XMPP.Git ( Assistant/XMPP/Git.hs, tmp/Assistant/XMPP/Git.o )+ [238 of 279] Compiling Command.XMPPGit ( Command/XMPPGit.hs, tmp/Command/XMPPGit.o )+ [239 of 279] Compiling Assistant.Threads.NetWatcher ( Assistant/Threads/NetWatcher.hs, tmp/Assistant/Threads/NetWatcher.o )+ [240 of 279] Compiling Assistant.NamedThread ( Assistant/NamedThread.hs, tmp/Assistant/NamedThread.o )+ [241 of 279] Compiling Assistant.WebApp.Notifications ( Assistant/WebApp/Notifications.hs, tmp/Assistant/WebApp/Notifications.o )++ Assistant/WebApp/Notifications.hs:39:11:+ No instances for (Text.Julius.ToJavascript String,+ Text.Julius.ToJavascript Text)+ arising from a use of `Text.Julius.toJavascript'+ Possible fix:+ add instance declarations for+ (Text.Julius.ToJavascript String, Text.Julius.ToJavascript Text)+ In the first argument of `Text.Julius.Javascript', namely+ `Text.Julius.toJavascript delay'+ In the expression:+ Text.Julius.Javascript (Text.Julius.toJavascript delay)+ In the first argument of `Data.Monoid.mconcat', namely+ `[Text.Julius.Javascript+ ((Data.Text.Lazy.Builder.fromText . Text.Shakespeare.pack')+ "function longpoll_"),+ Text.Julius.Javascript (Text.Julius.toJavascript ident),+ Text.Julius.Javascript+ ((Data.Text.Lazy.Builder.fromText . Text.Shakespeare.pack')+ "() {\+ \\tlongpoll(longpoll_"),+ Text.Julius.Javascript (Text.Julius.toJavascript ident), ....]'+ make: *** [git-annex] Error 1++> Reproduced this and confirmed it's fixed in git. --[[Joey]] [[done]]
@@ -0,0 +1,97 @@+What steps will reproduce the problem?++* Start with Ubuntu 12.04+* sudo apt-get install haskell-platform libgsasl7-dev gsasl g2hs+* cabal install git-annex --bindir=$HOME/bin++What is the expected output? What do you see instead?++Expected omething like "installation successful"++Actual output, after build notices:+++Loading package IfElse-0.85 ... linking ... done.+Loading object (static) dist/build/git-annex/git-annex-tmp/Utility/libdiskfree.o ... done+Loading object (static) dist/build/git-annex/git-annex-tmp/Utility/libmounts.o ... done+final link ... done+[157 of 279] Compiling Assistant.Types.DaemonStatus ( Assistant/Types/DaemonStatus.hs, dist/build/git-annex/git-annex-tmp/Assistant/Types/DaemonStatus.o )+[158 of 279] Compiling Assistant.Monad ( Assistant/Monad.hs, dist/build/git-annex/git-annex-tmp/Assistant/Monad.o )++Assistant/Monad.hs:86:16:+ Couldn't match expected type `Assistant a'+ with actual type `Reader AssistantData a'+ Expected type: (AssistantData -> a) -> Assistant a+ Actual type: (AssistantData -> a) -> Reader AssistantData a+ In the expression: reader+ In an equation for `getAssistant': getAssistant = reader++Assistant/Monad.hs:93:15:+ Couldn't match expected type `Assistant t0'+ with actual type `Reader r0 a0'+ In the return type of a call of `reader'+ In a stmt of a 'do' block: st <- reader threadState+ In the expression:+ do { st <- reader threadState;+ liftIO $ runThreadState st a }++Assistant/Monad.hs:99:14:+ Couldn't match expected type `Assistant t0'+ with actual type `Reader r0 a0'+ In the return type of a call of `reader'+ In a stmt of a 'do' block: d <- reader id+ In the expression:+ do { d <- reader id;+ liftIO $ io $ runAssistant d a }++Assistant/Monad.hs:105:14:+ Couldn't match expected type `Assistant t0'+ with actual type `Reader r0 a0'+ In the return type of a call of `reader'+ In a stmt of a 'do' block: d <- reader id+ In the expression:+ do { d <- reader id;+ return $ runAssistant d a }++Assistant/Monad.hs:110:14:+ Couldn't match expected type `Assistant t0'+ with actual type `Reader r0 a0'+ In the return type of a call of `reader'+ In a stmt of a 'do' block: d <- reader id+ In the expression:+ do { d <- reader id;+ return $ \ v -> runAssistant d $ a v }++Assistant/Monad.hs:115:14:+ Couldn't match expected type `Assistant t0'+ with actual type `Reader r0 a0'+ In the return type of a call of `reader'+ In a stmt of a 'do' block: d <- reader id+ In the expression:+ do { d <- reader id;+ return $ \ v1 v2 -> runAssistant d (a v1 v2) }++Assistant/Monad.hs:120:12:+ Couldn't match expected type `Assistant a0'+ with actual type `Reader r0 a1'+ In the return type of a call of `reader'+ In the first argument of `(>>=)', namely `reader v'+ In the expression: reader v >>= liftIO . io+cabal: Error: some packages failed to install:+git-annex-3.20121112 failed during the building phase. The exception was:+ExitFailure 1+++What version of git-annex are you using? On what operating system?++git annex 3.20121112+Ubuntu 12.04 (current "long term support", all packages up to date)++Please provide any additional information below.++No idea how important this is for git-annex in general but reporting in case it is. Thank you for working on git annex!++> I was able to reproduce this build error when I force installed+> an old version of the haskell mtl library. So git-annex needs version+> 2.1.1 to build, and I have adjusted the build dependencies appropriately.+> [[done]] --[[Joey]]
@@ -0,0 +1,33 @@+What steps will reproduce the problem?++Building from latest source, Cabal update, cabal install --only dependencies, cabal configure, Cabal build++What is the expected output? What do you see instead?++Error message from build++...++Loading package DAV-0.2 ... linking ... done.++Loading object (static) dist/build/git-annex/git-annex-tmp/Utility/libdiskfree.o ... done++Loading object (static) dist/build/git-annex/git-annex-tmp/Utility/libmounts.o ... done++final link ... done+++Assistant/Threads/WebApp.hs:47:1: Not in scope: `getAddBoxComR'++Assistant/Threads/WebApp.hs:47:1: Not in scope: `getEnableWebDAVR'+++What version of git-annex are you using? On what operating system?++Latest version via git from git-annex.branchable.com++Debian Squeeze (6.0.6)++Please provide any additional information below.++> I noticed this earlier and fixed it. [[done]] --[[Joey]]
@@ -0,0 +1,125 @@+4.20130601 xmpp sync error.++setup: A debian machine, with indirect fresh annex, android galaxy s3 with a+fresh direct annex, both running ga-20130601.++steps:+- Start assistant on both, add jabber account to both.+- Add box.com account on desktop with no encryption, (now correctly shows up on android, wasn't the case with 20130521).+- Add hello.txt on desktop repo, filename is now visible on android, but content is not.+- Add greeting.txt on desktop, nothing shows up on android, content still missing for hello.txt+- Webapp shows uploading messages, but no errors.+- Manually checking box.com confirms that files have been uploaded.++debian desktop daemon.log:++ [2013-06-02 17:57:03 CEST] main: starting assistant version 4.20130601+ (scanning...) [2013-06-02 17:57:03 CEST] Watcher: Performing startup scan+ (started...) [2013-06-02 17:57:52 CEST] XMPPClient: Pairing with myJabberAccount in progress+ [2013-06-02 17:57:53 CEST] XMPPReceivePack: Syncing with myJabberAccount + [2013-06-02 17:58:03 CEST] XMPPClient: Pairing with myJabberAccount in progress+ [2013-06-02 17:58:52 CEST] main: Syncing with box.com + warning: Not updating non-default fetch respec+ + Please update the configuration manually if necessary.+ fatal: The remote end hung up unexpectedly+ [2013-06-02 17:59:53 CEST] XMPPReceivePack: Syncing with myJabberAccount + [2013-06-02 18:00:02 CEST] Committer: Adding hello.txt++ (testing WebDAV server...)+ add hello.txt (checksum...) [2013-06-02 18:00:02 CEST] Committer: Committing changes to git+ [2013-06-02 18:00:02 CEST] XMPPSendPack: Syncing with myJabberAccount + Already up-to-date.+ [2013-06-02 18:00:03 CEST] Committer: Committing changes to git+ fatal: The remote end hung up unexpectedly+ fatal: The remote end hung up unexpectedly+ [2013-06-02 18:00:03 CEST] XMPPSendPack: Syncing with myJabberAccount ++ +100% 1.0 B/s 0s+ +[2013-06-02 18:00:19 CEST] Transferrer: Uploaded hello.txt+ fatal: The remote end hung up unexpectedly+ [2013-06-02 18:01:53 CEST] XMPPReceivePack: Syncing with myJabberAccount + fatal: The remote end hung up unexpectedly+ [2013-06-02 18:02:04 CEST] XMPPSendPack: Syncing with myJabberAccount + fatal: The remote end hung up unexpectedly+ [2013-06-02 18:03:53 CEST] XMPPReceivePack: Syncing with myJabberAccount + fatal: The remote end hung up unexpectedly+ [2013-06-02 18:05:10 CEST] Committer: Adding greeting.txt+ ok+ (Recording state in git...)+ (Recording state in git...)++ (Recording state in git...)+ add greeting.txt (checksum...) [2013-06-02 18:05:10 CEST] Committer: Committing changes to git+ [2013-06-02 18:05:10 CEST] XMPPSendPack: Syncing with myJabberAccount + Already up-to-date.+ [2013-06-02 18:05:11 CEST] Committer: Committing changes to git++ +100% 9.0 B/s 0s+ +[2013-06-02 18:05:24 CEST] Transferrer: Uploaded greeting.txt+ fatal: The remote end hung up unexpectedly+ [2013-06-02 18:06:13 CEST] XMPPReceivePack: Syncing with myJabberAccount + ok+ (Recording state in git...)+ (Recording state in git...)++ (Recording state in git...)+ fatal: The remote end hung up unexpectedly++Thanks as always.+++Android daemon.log:+ [2013-06-02 17:53:07 CEST] main: starting assistant version 4.20130601-g7483ca4+ (scanning...) [2013-06-02 17:53:07 CEST] Watcher: Performing startup scan+ (started...) [2013-06-02 17:57:51 CEST] XMPPClient: Pairing with myJabberAccount in progress+ [2013-06-02 17:57:52 CEST] XMPPSendPack: Syncing with myJabberAccount + Already up-to-date.+ [2013-06-02 17:58:00 CEST] XMPPSendPack: Unable to download files from your other devices. + [2013-06-02 17:58:00 CEST] XMPPSendPack: Syncing with myJabberAccount + [2013-06-02 17:58:02 CEST] XMPPClient: Pairing with myJabberAccount in progress+ [2013-06-02 17:58:07 CEST] XMPPSendPack: Unable to download files from your other devices. + [2013-06-02 17:58:07 CEST] XMPPSendPack: Syncing with myJabberAccount + [2013-06-02 17:58:15 CEST] XMPPSendPack: Unable to download files from your other devices. + [2013-06-02 18:00:02 CEST] XMPPReceivePack: Syncing with myJabberAccount + [2013-06-02 18:00:03 CEST] XMPPReceivePack: Unable to download files from your other devices. + [2013-06-02 18:00:04 CEST] XMPPReceivePack: Syncing with myJabberAccount + Merge made by the 'recursive' strategy.+ hello.txt | 1 ++ 1 file changed, 1 insertion(+)+ create mode 120000 hello.txt+ [2013-06-02 18:00:05 CEST] Committer: Committing changes to git+ [2013-06-02 18:00:06 CEST] XMPPSendPack: Syncing with myJabberAccount + Already up-to-date.+ [2013-06-02 18:00:14 CEST] XMPPSendPack: Unable to download files from your other devices. + [2013-06-02 18:00:14 CEST] XMPPSendPack: Syncing with myJabberAccount + [2013-06-02 18:00:25 CEST] XMPPSendPack: Unable to download files from your other devices. + [2013-06-02 18:02:03 CEST] Committer: Committing changes to git+ fatal: The remote end hung up unexpectedly+ [2013-06-02 18:02:04 CEST] XMPPReceivePack: Unable to download files from your other devices. + [2013-06-02 18:02:04 CEST] XMPPSendPack: Syncing with myJabberAccount + [2013-06-02 18:02:04 CEST] XMPPReceivePack: Syncing with myJabberAccount + [2013-06-02 18:02:13 CEST] XMPPSendPack: Unable to download files from your other devices. + [2013-06-02 18:02:15 CEST] XMPPSendPack: Syncing with myJabberAccount + [2013-06-02 18:02:24 CEST] XMPPSendPack: Unable to download files from your other devices. + fatal: The remote end hung up unexpectedly+ [2013-06-02 18:04:04 CEST] XMPPReceivePack: Unable to download files from your other devices. + [2013-06-02 18:05:10 CEST] XMPPReceivePack: Syncing with myJabberAccount + [2013-06-02 18:06:12 CEST] Committer: Committing changes to git+ [2013-06-02 18:06:13 CEST] XMPPSendPack: Syncing with myJabberAccount + [2013-06-02 18:06:21 CEST] XMPPSendPack: Unable to download files from your other devices. + [2013-06-02 18:06:21 CEST] XMPPSendPack: Syncing with myJabberAccount + [2013-06-02 18:06:29 CEST] XMPPSendPack: Unable to download files from your other devices. + fatal: The remote end hung up unexpectedly+ [2013-06-02 18:07:10 CEST] XMPPReceivePack: Unable to download files from your other devices. +++thanks++> Since this seems clearly a lack of box.com being configured +> to be used on the Android, I'm closing the bug: [[done]]. +> If I'm wrong, write back, and I'll reopen ;) --[[Joey]]
@@ -0,0 +1,25 @@+git-annex tends to preserve files that are added to an annex with+a mode such as 400. (Happens to me sometimes with email attachments.) +As these files are rsynced around, and end up on eg, a+publically visible repo with a webserver frontend, or a repo that is+acessible to a whole group of users, they will not be readable. ++I think it would make sense for git-annex to normalize file permissions+when adding them. Of course, there's some tension here with generally+storing file metadata when possible. Perhaps the normalization should only+ensure that group and other have read access?++(Security: We can assume that a repo that is not intended to be public is+in a 700 directory. And since git-annex cannot preserve file modes when+files transit through a special remote, using modes to limit access to+individual files is not wise.)++--[[Joey]]++> Revisiting this, git-annex already honors core.sharedrepository settings,+> so I just needed to set it to `world` to allow everyone to read.+> +> There was a code path in direct mode where that didn't work; fixed that.+> +> [[done]]+> --[[Joey]]
@@ -0,0 +1,22 @@+What steps will reproduce the problem?++Mount USB drive formatted as FAT+Make directory for repository in it.+Set up another repository and choose to sync it with the existing one.++What is the expected output? What do you see instead?+The files should transfer from the main repository to the directory on the USB drive.+This happens, but afterwards a new sync happens from the USB drive repository back to the other existing repositories, because the file date of all the files on the USB drive has been set to today.+Further, git seemed to keep the USB key locked so umount was impossible until after killing it.++What version of git-annex are you using? On what operating system?+4.20130405+Linux++Please provide any additional information below.+++> Reproduced the core bug, which is that the assistant saw symlink standin+> files as new files, and annexed them. Now it doesn't, and I have+> it running on FAT with no trouble; can even rename symlink standin files+> and it commits symlink changes. Calling this [[done]]. --[[Joey]]
@@ -0,0 +1,20 @@+### Please describe the problem.++After submitting the form in the webapp for adding a box.com remote, I get:++ Internal Server Error - WEBDAV failed to write file: "Unauthorized": user error++### What steps will reproduce the problem?++Fill in the box.com add remote form. Username=username, password=password, "share..."=checked, directory=annex, Encryption="Encrypt all data" and hit the "Add repository" button.++### What version of git-annex are you using? On what operating system?++ git-annex version 4.20130513-g5185533 on Android 4.2.2++### Please provide any additional information below.++Didn't find a .git/annex/debug.log++> This error seems entirely consistent with you entering the wrong password.+> [[done]] --[[Joey]]
@@ -0,0 +1,32 @@+### Please describe the problem.++While trying to add a ssh remote, the webapp promts the error:++ Reinitialized existing shared Git repository in /home/chris/annex-test/+ git-annex: please specify a description of this repository++resp.++ Initialized empty shared Git repository in /home/chris/annex-test-2/+ git-annex: please specify a description of this repository++### What steps will reproduce the problem?++Adding a ssh git remote.++### What version of git-annex are you using? On what operating system?++4.20130704-gaf18656 linux-amd64 and android++### Please provide any additional information below.++[[!format sh """+# If you can, paste a complete transcript of the problem occurring here.+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log++only successful ssh key generation in daemon.log++# End of transcript or log.+"""]]++> [[done]]; bad installation. --[[Joey]]
@@ -0,0 +1,41 @@+What steps will reproduce the problem?++Create a local and "remote server" repository++Create another local repositorty and keep it seperate from the first one. Fails while creating second repository on the remote.++What is the expected output? What do you see instead?++Expected to get two seperate repositories on the client and server. Only first one works.++Got an error:++ Failed to make repository++ Something went wrong setting up the repository on the remote server.++ Transcript: fatal: unrecognized command 'sh -c 'mkdir -p '"'"'second'"'"'&&cd '"'"'second'"'"'&&git init --bare --shared&&git annex init&&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="GIT_ANNEX_SHELL_DIRECTORY='"'"'"'"'"'"'"'"'second'"'"'"'"'"'"'"'"' ~/.ssh/git-annex-shell",no-agent-forwarding,no-port-forwarding,no-X11-forwarding ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCvoTn+XBdlw/mQlu+NScAeuddUJqJaVXH6KUsO09OddnUvzv4W185ezbAjXfWDgN7ou0Q0xQzwiCzdoSl7T3USJQ1ywTG5Xt2sBV3RIqxyReNA7Nz0yhwWhZBJcFzof34ezNIsi9NVgEJcK2JEs2XqhO5wK5nxEDeays7ti2bqY6V21iOWSy9hlzjD4VTWTEFxQkDp4BCzDpPN934ztOtInwI8ayiTRJZlNQ+ej/AaA+/zOBWNvIFc/96iuMLKY6lLFThw1jNj5r5N7yPaysLdnwTJ3irtCzDygCpD4mau4frrOPvG90ZdcdrQSfIjRtM9nPZ5jIpohfvz0dIfgNFz marvin@marvin-U-100 '"'"' >>~/.ssh/authorized_keys'' git-annex-shell: git-shell failed+++What version of git-annex are you using? On what operating system?++4.20130413-g5747bf4 ubuntu 12.10 local++3.20120629 debian wheezy remote (also tried 4.20130413-g5747bf4)++Please provide any additional information below.++> This bug would appear to be the same as a bug I fixed today.+> +> Except this last bit:++**Also noticed if a user has no full name set in unix account, creating+remote repository always fails**++> So, I'm going to repurpose this bug to track that problem. --[[Joey]]++[[!meta title="assistant can fail to make git repository if remote server is lacking GECOS"]]++>> [[done]]; git-annex always checks for missing gecos and enables+>> a workaround. This does mean the server needs to be upgraded in order+>> for the fix to work. --[[Joey]]
@@ -0,0 +1,74 @@+What steps will reproduce the problem?++Example below illustrates downloading a podcast with git annex addurl:++list directory before...++~/Podcasts/TuxRadar Linux Podcast (Ogg)$ ls+folder.jpg tuxradar_s04e24.ogg+tuxradar_s04e09.ogg tuxradar_s05e01.ogg+tuxradar_s04e11.ogg tuxradar_s05e02.ogg+tuxradar_s04e13.ogg tuxradar_s05e03.ogg+tuxradar_s04e15.ogg tuxradar_s05e04.ogg+tuxradar_s04e16.ogg www.tuxradar.com_files_podcast_tuxradar_s04e10.ogg+tuxradar_s04e19.ogg www.tuxradar.com_files_podcast_tuxradar_s04e12.ogg+tuxradar_s04e20.ogg www.tuxradar.com_files_podcast_tuxradar_s04e14.ogg+tuxradar_s04e21.ogg www.tuxradar.com_files_podcast_tuxradar_s04e17.ogg+tuxradar_s04e22.ogg www.tuxradar.com_files_podcast_tuxradar_s04e18.ogg+tuxradar_s04e23.ogg++download file...++~/Podcasts/TuxRadar Linux Podcast (Ogg)$ git annex addurl http://www.tuxradar.com/files/podcast/tuxradar_s05e05.ogg+addurl www.tuxradar.com_files_podcast_tuxradar_s05e05.ogg (downloading http://www.tuxradar.com/files/podcast/tuxradar_s05e05.ogg ...) --2013-04-10 21:18:12-- http://www.tuxradar.com/files/podcast/tuxradar_s05e05.ogg+Resolving www.tuxradar.com (www.tuxradar.com)... 80.244.178.150+Connecting to www.tuxradar.com (www.tuxradar.com)|80.244.178.150|:80... connected.+HTTP request sent, awaiting response... 200 OK+Length: 33249291 (32M) [application/ogg]+Saving to: `/home/rob/Podcasts/.git/annex/tmp/URL--http&c%%www.tuxradar.com%files%podcast%tuxradar_s05e05.ogg'++100%[===============================>] 33,249,291 404K/s in 81s ++2013-04-10 21:19:35 (399 KB/s) - `/home/rob/Podcasts/.git/annex/tmp/URL--http&c%%www.tuxradar.com%files%podcast%tuxradar_s05e05.ogg' saved [33249291/33249291]++(checksum...) ok+(Recording state in git...)++file appears to have been downloaded, but isn't there...++~/Podcasts/TuxRadar Linux Podcast (Ogg)$ ls+folder.jpg tuxradar_s04e24.ogg+tuxradar_s04e09.ogg tuxradar_s05e01.ogg+tuxradar_s04e11.ogg tuxradar_s05e02.ogg+tuxradar_s04e13.ogg tuxradar_s05e03.ogg+tuxradar_s04e15.ogg tuxradar_s05e04.ogg+tuxradar_s04e16.ogg www.tuxradar.com_files_podcast_tuxradar_s04e10.ogg+tuxradar_s04e19.ogg www.tuxradar.com_files_podcast_tuxradar_s04e12.ogg+tuxradar_s04e20.ogg www.tuxradar.com_files_podcast_tuxradar_s04e14.ogg+tuxradar_s04e21.ogg www.tuxradar.com_files_podcast_tuxradar_s04e17.ogg+tuxradar_s04e22.ogg www.tuxradar.com_files_podcast_tuxradar_s04e18.ogg+tuxradar_s04e23.ogg++What is the expected output? What do you see instead?++File should exist in current directory. As you can see from above output, this has worked in the past (with older versions).++What version of git-annex are you using? On what operating system?++git-annex version: 4.20130405+local repository version: 3+default repository version: 3+supported repository versions: 3 4+upgrade supported from repository versions: 0 1 2+build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP++OS: Debian Testing/Unstable++Please provide any additional information below.++The repository in question was created by the assistant and I tried the above with the assistant both running and not running, with no difference. I have also tried downloading other files.++EDIT: formatting++> Bug only affected direct mode. I think it used to work but I broke+> it when fixing another bug in direct mode. [[fixed|done]] --[[Joey]]
@@ -0,0 +1,30 @@+This follows up to the [comment made by+Laszlo](http://git-annex.branchable.com/design/assistant/polls/what_is_preventing_me_from_using_git-annex_assistant/#comment-f26d3b6b45bb66601ecfaa883ace161c)+on the [recent+poll](http://git-annex.branchable.com/design/assistant/polls/what_is_preventing_me_from_using_git-annex_assistant/).++I too need to be able to select the directory on the remote drive that the+annex will be synced to.++If I just add a remote drive via the web app, it syncs the repository to+`/mnt/usb/annex`, and it looks like it just creates a bare repository in+that folder. I need the repository to be synced to something like+`/mnt/usb/subfolder/myspecifiedfoldername` and I need that remote to be a+full repository.++My use case is that I use the USB drive to keep annexes in sync between two+computers. I have multiple annexes that need to be synced between the two+computers, and none of them are in a directory called `annex`. I also need+to be able to plug the drive into other computers and access the files+directly, without doing a `git clone` or anything like that. I have all of+this setup and working fine with just plain old git annex, but the web app+does not seem to support creating new repositories with this workflow.++I think it makes a lot of sense to allow the web application to add a new+remote that is simply a directory. People like me could specify the path of+the directory to be on the mounted USB drive. Others may want to add a+remote that is a mounted network share or something like that.++> [[done]], the webapp now has a "Add another repository" option,+> and you can just enter the path to whatever place you like inside a USB+> drive. --[[Joey]]
@@ -0,0 +1,18 @@+### Please describe the problem.++Android app barfs on startup.++### What steps will reproduce the problem?++Download/install/start Android app :)++### What version of git-annex are you using? On what operating system?++Just downloaded the .apk (Friday May 3rd). Android 4.2.2 on Google/LG Nexus 4 ++### Please provide any additional information below.++See this [screenshot](https://docs.google.com/file/d/0B8tqeaAn45VORU1ET1ZpTWxLTjQ/edit?usp=sharing).+Feel free to ping me on IRC if you need additional info or want to test a fix.++> [[done]]; now comprehensively fixed. --[[Joey]]
@@ -0,0 +1,23 @@+### Please describe the problem.++The daily Android build is missing the webapp, raising a bug in case this is unexpected.++### What steps will reproduce the problem?++Down the daily APK, it is 9MB.++### What version of git-annex are you using? On what operating system?+++### Please provide any additional information below.++[[!format sh """+# If you can, paste a complete transcript of the problem occurring here.+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log+++# End of transcript or log.+"""]]++> Probably several of them were. I've fixed the cabal file, re-running+> android build now. [[done]] --[[Joey]]
@@ -0,0 +1,27 @@+#### What steps will reproduce the problem?++I've posted some code here:+ https://gist.github.com/4552036+++#### What is the expected output? What do you see instead?++I think I've found three bugs. If they aren't bugs then there is a usage issue that could do with some documentation improvements.++Problem 1 - With 3 local annexes git-annex doesn't seem to search properly for them (See code)++Problem 2 - Even after a sync an annex thinks another (local) annex has a file, even after it has been dropped (See code)++SCARY bug - `whereis` seems to think that a locally dropped file still exists (See code) +++#### What version of git-annex are you using? On what operating system?++git-annex version: 3.20130114++OS: OSX 10.6.8+++#### Please provide any additional information below.++> [[done]]; see comments --[[Joey]]
@@ -0,0 +1,16 @@+### Please describe the problem.++I'm trying to use the assistant to replicate the basic dropbox functionality of having a synced folder between two machines. Instead of actually syncing file contents by default the assistant just creates broken symlinks.++### What steps will reproduce the problem?++I've setup two repositories with each other as ssh remotes and ran the assistant on each after setting them in direct mode. I can create files on each of the repositories and have them show up on the other but all that shows up is a broken link. Actual contents don't get transferred. If I do a "git annex get" I can get the contents just fine. I tried setting annex.numcopies to 2 and that didn't work either.++What I'm missing here is some setting to tell the assistant "sync the contents of every new file". What it's doing instead is unacceptable. If I have the file in both repositories and change it in one, the other repository gets it's previous version of the file replaced by a broken symlink. From my point of view for the assistant to be a dropbox replacement it should never, under any circumstances, create a broken symlink in the sync folder. I had understood that that's what direct mode was, but it's not behaving that way right now at least.++### What version of git-annex are you using? On what operating system?++My basic setup for testing is two Ubuntu 12.04 LTS machines running git-annex 4.20130501++> [[done]], broken ~/.config/git-annex/program file, which is now detected+> and worked around. --[[Joey]]
@@ -0,0 +1,28 @@+Setup:++* fresh install of Debian Wheezy with git-annex 4.20130227 pulled in from unstable++Steps:++* clone existing repository and activate assistant+* Have USB drive, U, with repository group `backup` and preferred content string `standard`++Expected:++* Assistant never ever tries to drop anything from U++Actual:++* Assistant immediately tries to drop files from U; fortunately I didn't have the USB drive plugged in+* Changing the preferred content string of U to `present or include=*` stops the dropping, but this was never required before++Additional information:++* The files that the Assistant started trying to drop were, I believe, the first (alphabetically) files in my repository to contain non-ascii characters in their file names (some French accented letters)++Thanks.++> The non-ascii characters are the giveaway: For 1 version, git-annex used+> a regex library that failed to ever match non-ascii characters. So it+> thought backup repos, which match "*" with a regex, wanted no such files.+> This is [[fixed|done]]. --[[Joey]]
@@ -0,0 +1,75 @@+### Please describe the problem.++I am experiencing a weird issue with any install I've had on this one (and only) ArchLinux machine: all of aur/git-annex 4.20130516-1, aur/git-annex-bin-4.20130909-1, aur/git-annex-standalone-4.20130909-1 and a Cabal install just stall when trying to create the initial Git annex repo in the webapp.++When started, it offers me to create the annex in ~/annex/ or ~/Desktop/annex/, where ~ gets turned into /home/USER when I press “Make repository”, but nothing else happens. This is regardless of if that repo exists when I try to create it or start the webapp.++If I start the webapp from an existing annex (now in ~/annex), it seems to work a bit better, but any other remote (SSH) server that I try to add fails. I just get a fleeting Bootstrap message box when I click “Check this server”, and nothing in the logs of eithr git annex webapp or the ssh logs of the server.++If an annex exists, but I start the webapp from another directory, it just behaves as if none were found.++Calls to git annex assistant --autostart complain that "Nothing listed in /home/omehani/.config/git-annex/autostart". I have checked the permissions on that directory, and tried deleting it to let git-annex recreate it, which it did, to no avail.+++### What steps will reproduce the problem?++Install any of the git-annex packages available from AUR++### What version of git-annex are you using? On what operating system?++* up-to-date ArchLinux, Linux cancey 3.10.10-1-ARCH #1 SMP PREEMPT Fri Aug 30 11:30:06 CEST 2013 x86_64 GNU/Linux+* aur/git-annex 4.20130516-1, aur/git-annex-bin-4.20130909-1, aur/git-annex-standalone-4.20130909-1 or through Cabal (on 2013-09-12)++### Please provide any additional information below.++The following is the output of webapp --debug. Nothing actually appears when trying to add/edit a repo.++[[!format sh """+# If you can, paste a complete transcript of the problem occurring here.+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log++~/annex (master)$ git annex webapp --debug+[2013-09-16 10:26:55 EST] read: git ["--git-dir=/home/omehani/annex/.git","--work-tree=/home/omehani/annex","show-ref","git-annex"]+[2013-09-16 10:26:55 EST] read: git ["--git-dir=/home/omehani/annex/.git","--work-tree=/home/omehani/annex","show-ref","--hash","refs/heads/git-annex"]+[2013-09-16 10:26:55 EST] read: git ["--git-dir=/home/omehani/annex/.git","--work-tree=/home/omehani/annex","log","refs/heads/git-annex..27c891f84f6ea7a10c68c0dd696ab84d88ef0cec","--oneline","-n1"]+[2013-09-16 10:26:55 EST] read: git ["--git-dir=/home/omehani/annex/.git","--work-tree=/home/omehani/annex","log","refs/heads/git-annex..d0a1cb518045af01b443694aa2cd9af6386de38a","--oneline","-n1"]+[2013-09-16 10:26:55 EST] read: git ["--git-dir=/home/omehani/annex/.git","--work-tree=/home/omehani/annex","log","refs/heads/git-annex..3ff23e23d74ace008b03143120e84f07e52ed8ee","--oneline","-n1"]+[2013-09-16 10:26:55 EST] chat: git ["--git-dir=/home/omehani/annex/.git","--work-tree=/home/omehani/annex","cat-file","--batch"]+[2013-09-16 10:26:55 EST] logging to /home/omehani/annex/.git/annex/daemon.log+[2013-09-16 10:26:55 EST] logging to /home/omehani/annex/.git/annex/daemon.log+Launching web browser on file:///home/omehani/annex/.git/annex/webapp.html+START /usr/lib/firefox/firefox "/home/omehani/annex/.git/annex/webapp.html"++(process:2699): GLib-CRITICAL **: g_slice_set_config: assertion `sys_page_size == 0' failed+++# End of transcript or log.+"""]]++Running git annex from a different directory.+[[!format sh """+# If you can, paste a complete transcript of the problem occurring here.+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log++~$ git annex webapp --debug+Launching web browser on file:///tmp/webapp3934.html+START /usr/lib/firefox/firefox "/tmp/webapp3934.html"++(process:4008): GLib-CRITICAL **: g_slice_set_config: assertion `sys_page_size == 0' failed++# End of transcript or log.+"""]]++Trying the autostart:+[[!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 assistant --autostart --debug+git-annex: Nothing listed in /home/omehani/.config/git-annex/autostart+++# End of transcript or log.+"""]]++> workaround is in place [[done]] --[[Joey]]
@@ -0,0 +1,28 @@+### What steps will reproduce the problem?++Run `git annex assistant`.+++### What is the expected output? What do you see instead?++git-annex complains:++ dbus failed; falling back to mtab polling (ClientError {clientErrorMessage =+ "Call failed: The name org.gtk.Private.GduVolumeMonitor was not provided+ by any .service files", clientErrorFatal = False})++This is because the `gvfs-gdu-volume-monitor` daemon has been obsoleted and removed from GNOME 3.6 (maybe even earlier).++git-annex should start using `gvfs-udisks2-volume-monitor` at bus name `org.gtk.Private.UDisks2VolumeMonitor`.++Alternatively, git-annex should stop relying on any per-user services, and use kernel interfaces directly when available. (This way, monitoring could work even if the user wasn't logged in and/or didn't have a DBus session bus.)++ * On all Linux kernels since 2.6.15, the `/proc/self/mounts` file is pollable – you can use **select(), poll() or epoll** to detect new mounted filesystems, without having to rely on periodic checks. (Run `findmnt -p` to see it in action.)++ * On BSD systems, kqueue on `/etc/mtab`.++### What version of git-annex are you using? On what operating system?++git-annex 3.20130102 on Linux 3.7.1, GNOME 3.7++> [[done]] --[[Joey]]
@@ -0,0 +1,36 @@+What steps will reproduce the problem?++Install git-annex via cabal - either from Hackage or as a manual install. (i.e. <http://git-annex.branchable.com/install/cabal/>)++What is the expected output? What do you see instead?++Expect a clean install.++However, get the following error:++ Assistant/Install.hs:24:8:+ Could not find module `Data.AssocList'+ It is a member of the hidden package `hxt-9.3.1.1'.+ Perhaps you need to add `hxt' to the build-depends in your .cabal file.+ Use -v to see a list of the files searched for.+++What version of git-annex are you using? On what operating system?++git-annex: 3.20121127+OS: Mac OSX 10.6.8++Please provide any additional information below.++The fix seems to be as simple as adding 'htx' to the 'git-annex.cabal' file:++ Executable git-annex+ Main-Is: git-annex.hs+ Build-Depends: MissingH, hslogger, directory, filepath,+ unix, containers, utf8-string, network (>= 2.0), mtl (>= 2.1.1),+ bytestring, old-locale, time,+ -- Added htx here+ hxt,+ pcre-light, extensible-exceptions, dataenc, SHA, process, json, HTTP,++> I removed the need for hxt, which was accidental. [[done]] --[[Joey]]
@@ -0,0 +1,11 @@+While following the instructions given at the OSX build page , I get this error:++$ make+ghc -O2 -Wall -ignore-package monads-fd -fspec-constr-count=5 --make git-annex++Utility/JSONStream.hs:14:8:+ Could not find module `Text.JSON':+ Use -v to see a list of the files searched for.+make: *** [git-annex] Error 1++> Updated the instructions. [[done]] --[[Joey]]
@@ -0,0 +1,45 @@+Applying this++<pre>+laplace:git-annex jtang$ git diff+diff --git a/Assistant/WebApp/Configurators.hs b/Assistant/WebApp/Configurators.hs+index b9630b1..bf36e59 100644+--- a/Assistant/WebApp/Configurators.hs++++ b/Assistant/WebApp/Configurators.hs+@@ -101,7 +101,7 @@ checkRepositoryPath p = do+ -+ - If run in another directory, the user probably wants to put it there. -}+ defaultRepositoryPath :: Bool -> IO FilePath+-defaultRepositoryPath firstrun = do++defaultRepositoryPath firstRun = do+ cwd <- liftIO $ getCurrentDirectory+ home <- myHomeDir+ if home == cwd && firstRun+</pre>++Causes this to occur,++<pre>+Assistant/WebApp/Configurators.hs:114:17:+ Couldn't match expected type `Control.Monad.Trans.RWS.Lazy.RWST+ (Maybe (Env, FileEnv), WebApp, [Yesod.Form.Types.Lang])+ Enctype+ Ints+ (GHandler WebApp WebApp)+ t0'+ with actual type `Text'+ Expected type: String+ -> Control.Monad.Trans.RWS.Lazy.RWST+ (Maybe (Env, FileEnv), WebApp, [Yesod.Form.Types.Lang])+ Enctype+ Ints+ (GHandler WebApp WebApp)+ t0+ Actual type: String -> Text+ In the first argument of `(.)', namely `T.pack'+ In the first argument of `(<$>)', namely+ `T.pack . addTrailingPathSeparator'+make: *** [git-annex] Error 1+</pre>++> [[fixed|done]] --[[Joey]]
@@ -0,0 +1,105 @@+What steps will reproduce the problem?++<pre>+dominik@Atlantis:/var/tmp$ git clone git://github.com/joeyh/git-annex.git+Cloning into 'git-annex'...+remote: Counting objects: 40580, done.+remote: Compressing objects: 100% (10514/10514), done.+remote: Total 40580 (delta 29914), reused 40502 (delta 29837)+Receiving objects: 100% (40580/40580), 9.17 MiB | 238 KiB/s, done.+Resolving deltas: 100% (29914/29914), done.+dominik@Atlantis:/var/tmp$ cd git-annex/+dominik@Atlantis:/var/tmp/git-annex$ cabal update+Downloading the latest package list from hackage.haskell.org+dominik@Atlantis:/var/tmp/git-annex$ cabal install --only-dependencies+Resolving dependencies...+All the requested packages are already installed:+Use --reinstall if you want to reinstall anyway.+dominik@Atlantis:/var/tmp/git-annex$ cabal configure+Resolving dependencies...+[ 1 of 21] Compiling Utility.FileSystemEncoding ( Utility/FileSystemEncoding.hs, dist/setup/Utility/FileSystemEncoding.o )+[ 2 of 21] Compiling Utility.Applicative ( Utility/Applicative.hs, dist/setup/Utility/Applicative.o )+[ 3 of 21] Compiling Utility.PartialPrelude ( Utility/PartialPrelude.hs, dist/setup/Utility/PartialPrelude.o )+[ 4 of 21] Compiling Utility.UserInfo ( Utility/UserInfo.hs, dist/setup/Utility/UserInfo.o )+[ 5 of 21] Compiling Utility.Monad ( Utility/Monad.hs, dist/setup/Utility/Monad.o )+[ 6 of 21] Compiling Utility.Path ( Utility/Path.hs, dist/setup/Utility/Path.o )+[ 7 of 21] Compiling Utility.OSX ( Utility/OSX.hs, dist/setup/Utility/OSX.o )+[ 8 of 21] Compiling Utility.Exception ( Utility/Exception.hs, dist/setup/Utility/Exception.o )+[ 9 of 21] Compiling Utility.TempFile ( Utility/TempFile.hs, dist/setup/Utility/TempFile.o )+[10 of 21] Compiling Utility.Misc ( Utility/Misc.hs, dist/setup/Utility/Misc.o )+[11 of 21] Compiling Utility.Process ( Utility/Process.hs, dist/setup/Utility/Process.o )+[12 of 21] Compiling Utility.FreeDesktop ( Utility/FreeDesktop.hs, dist/setup/Utility/FreeDesktop.o )+[13 of 21] Compiling Assistant.Install.AutoStart ( Assistant/Install/AutoStart.hs, dist/setup/Assistant/Install/AutoStart.o )+[14 of 21] Compiling Utility.SafeCommand ( Utility/SafeCommand.hs, dist/setup/Utility/SafeCommand.o )+[15 of 21] Compiling Utility.Directory ( Utility/Directory.hs, dist/setup/Utility/Directory.o )+[16 of 21] Compiling Common ( Common.hs, dist/setup/Common.o )+[17 of 21] Compiling Locations.UserConfig ( Locations/UserConfig.hs, dist/setup/Locations/UserConfig.o )+[18 of 21] Compiling Build.TestConfig ( Build/TestConfig.hs, dist/setup/Build/TestConfig.o )+[19 of 21] Compiling Build.Configure ( Build/Configure.hs, dist/setup/Build/Configure.o )+[20 of 21] Compiling Build.InstallDesktopFile ( Build/InstallDesktopFile.hs, dist/setup/Build/InstallDesktopFile.o )+[21 of 21] Compiling Main ( Setup.hs, dist/setup/Main.o )+Linking ./dist/setup/setup ...+ checking version... 3.20121018+ checking git... yes+ checking git version... 1.7.10.4+ checking cp -a... yes+ checking cp -p... yes+ checking cp --reflink=auto... yes+ checking uuid generator... uuidgen+ checking xargs -0... yes+ checking rsync... yes+ checking curl... yes+ checking wget... yes+ checking bup... no+ checking gpg... yes+ checking lsof... yes+ checking host... no+ checking ssh connection caching... yes+ checking sha1... sha1sum+ checking sha256... sha256sum+ checking sha512... sha512sum+ checking sha224... sha224sum+ checking sha384... sha384sum+Configuring git-annex-3.20121018...+dominik@Atlantis:/var/tmp/git-annex$ cabal build+Building git-annex-3.20121018...+Preprocessing executable 'git-annex' for git-annex-3.20121018...++Assistant/Alert.hs:21:8:+ Could not find module `Text.Blaze'+ It is a member of the hidden package `blaze-markup-0.5.1.1'.+ Perhaps you need to add `blaze-markup' to the build-depends in your .cabal file.+ Use -v to see a list of the files searched for.+</pre>++What is the expected output? What do you see instead?++I expect the latest git HEAD to build without an error message or provide me with a package I need to install. Instead the error above is shown. In fact the package requested is installed:++<pre>+dominik@Atlantis:/var/tmp/git-annex$ cabal install blaze-markup+Resolving dependencies...+All the requested packages are already installed:+blaze-markup-0.5.1.1+Use --reinstall if you want to reinstall anyway.+</pre>++What version of git-annex are you using? On what operating system?++git HEAD, Ubuntu 12.10++Please provide any additional information below.++<pre>+$ cabal --version+cabal-install version 0.14.0+using version 1.14.0 of the Cabal library ++$ ghc --version+The Glorious Glasgow Haskell Compilation System, version 7.4.2++$ uname -a+Linux Atlantis 3.5.0-17-generic #28-Ubuntu SMP Tue Oct 9 19:31:23 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux+</pre>++> [[done]] --[[Joey]]
@@ -0,0 +1,56 @@+What steps will reproduce the problem?++Building of the current github HEAD fails with a strange error message regarding OSX. I'm not using OSX but Ubuntu 12.10, why is cabal trying to build these files?++<pre>+dominik@Atlantis:/var/tmp$ git clone git://github.com/joeyh/git-annex.git+Cloning into 'git-annex'...+remote: Counting objects: 40243, done.+remote: Compressing objects: 100% (10568/10568), done.+remote: Total 40243 (delta 29647), reused 40044 (delta 29449)+Receiving objects: 100% (40243/40243), 9.12 MiB | 184 KiB/s, done.+Resolving deltas: 100% (29647/29647), done.+dominik@Atlantis:/var/tmp$ cd git-annex/+dominik@Atlantis:/var/tmp/git-annex$ cabal update+Downloading the latest package list from hackage.haskell.org+dominik@Atlantis:/var/tmp/git-annex$ cabal install --only-dependencies+Resolving dependencies...+All the requested packages are already installed:+Use --reinstall if you want to reinstall anyway.+dominik@Atlantis:/var/tmp/git-annex$ cabal configure+Resolving dependencies...+[ 1 of 21] Compiling Utility.FileSystemEncoding ( Utility/FileSystemEncoding.hs, dist/setup/Utility/FileSystemEncoding.o )+[ 2 of 21] Compiling Utility.Applicative ( Utility/Applicative.hs, dist/setup/Utility/Applicative.o )+[ 3 of 21] Compiling Utility.PartialPrelude ( Utility/PartialPrelude.hs, dist/setup/Utility/PartialPrelude.o )+[ 4 of 21] Compiling Utility.UserInfo ( Utility/UserInfo.hs, dist/setup/Utility/UserInfo.o )+[ 5 of 21] Compiling Utility.Monad ( Utility/Monad.hs, dist/setup/Utility/Monad.o )+[ 6 of 21] Compiling Utility.Path ( Utility/Path.hs, dist/setup/Utility/Path.o )+[ 7 of 21] Compiling Utility.OSX ( Utility/OSX.hs, dist/setup/Utility/OSX.o )++Utility/OSX.hs:22:17: Not in scope: `myHomeDir'+</pre>++What is the expected output? What do you see instead?++I expect cabal to build git-annex. ++What version of git-annex are you using? On what operating system?++github HEAD on Ubuntu 12.10++Please provide any additional information below.++<pre>+$ cabal --version+cabal-install version 0.14.0+using version 1.14.0 of the Cabal library ++$ ghc --version+The Glorious Glasgow Haskell Compilation System, version 7.4.2++$ uname -a+Linux Atlantis 3.5.0-17-generic #28-Ubuntu SMP Tue Oct 9 19:31:23 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux++</pre>++> [[fixed|done]] --[[Joey]]
@@ -0,0 +1,36 @@+### Please describe the problem.++This is a follow up of [[Problems building on Mac OS X]].+As of 4.20130521.1, cabal still cannot resolve the dependencies.++### What steps will reproduce the problem?++ cabal update+ cabal install git-annex-4.20130521.1 --user --only-dependencies++### Please provide any additional information below.++[[!format sh """+Resolving dependencies...+cabal: Could not resolve dependencies:+trying: git-annex-4.20130521.1+trying: git-annex-4.20130521.1:+webapp+trying: yesod-form-1.3.0+trying: yesod-core-1.2.1+rejecting: yesod-default-1.2.0 (conflict: git-annex-4.20130521.1:webapp =>+yesod-default(<1.2))+rejecting: yesod-default-1.1.3.2, 1.1.3.1, 1.1.3, 1.1.2, 1.1.1, 1.1.0.2,+1.1.0.1, 1.1.0 (conflict: yesod-core==1.2.1, yesod-default => yesod-core>=1.1+&& <1.2)+rejecting: yesod-default-1.0.1.1, 1.0.1, 1.0.0 (conflict: yesod-core==1.2.1,+yesod-default => yesod-core>=1.0 && <1.1)+rejecting: yesod-default-0.6.1 (conflict: yesod-core==1.2.1, yesod-default =>+yesod-core>=0.10.1 && <0.11)+rejecting: yesod-default-0.5.0 (conflict: yesod-core==1.2.1, yesod-default =>+yesod-core>=0.9.4 && <0.10)+rejecting: yesod-default-0.4.1, 0.4.0, 0.3.1 (conflict: yesod-core==1.2.1,+yesod-default => yesod-core>=0.9 && <0.10+"""]]++> At the risk of closing early again, I have uploaded a .2 with+> hints for the version of yesod-form and yesod-static. [[done]] --[[Joey]]
@@ -0,0 +1,17 @@+Just issuing the command `cabal install` results in the following error message.++ Command/Add.hs:54:3:+ No instance for (Control.Monad.IO.Control.MonadControlIO+ (Control.Monad.State.Lazy.StateT Annex.AnnexState IO))+ arising from a use of `handle' at Command/Add.hs:54:3-24++Adding the dependency for `monadIO` to `git-annex.cabal` should fix this? +-- Thomas++> No, it's already satisfied by `monad-control` being listed as a+> dependency in the cabal file. Your system might be old/new/or broken,+> perhaps it's time to provide some details about the version of haskell+> and of `monad-control` you have installed? --[[Joey]] ++>> Closing as apparently user error or a broken system.+>> If you see this problem please do say. [[done]] --[[Joey]]
@@ -0,0 +1,35 @@+What steps will reproduce the problem?++Add a rsync special remote - one that you need a username/password to access (stored in text file $HOME/.rsync.password):++ $ git annex initremote myrsync type=rsync rsyncurl=rsync://username@rsync.example.com/myrsync encryption=none+ $ git annex describe myrsync "rsync server"+ $ git config remote.myrsync.annex-rsync-options "--password-file=$HOME/.rsync.password"++Copy a file to the remote:++ $ git annex -d copy my-file --to myrsync++What is the expected output? What do you see instead?++Expect to see the file copied over to the rsync remote, but the check doesn't use the annex-rsync-options and asks for a password. The debug output is:++ copy my-file (checking myrsync...) [2012-10-28 01:01:01 EST] call: sh ["-c","rsync --quiet 'rsync://username@rsync.example.com/myrsync/[...SNIP...]' 2>/dev/null"]++However the actual copy does use annex-rsync-options and the copy works:++ [2012-10-28 01:01:05 EST] read: rsync ["--password-file=/home/blah/.rsync.password","--progress","--recursive","--partial","--partial-dir=.rsync-partial","/home/blah/annex/.git/annex/tmp/rsynctmp/12345/","rsync://username@rsync.example.com/myrsync"]+++What version of git-annex are you using? On what operating system?++git-annex: 3.20121017++OS: Ubuntu 12.04++Please provide any additional information below.++I think this fix is as easy as including the annex-rsync-options wherever rsync is called.++> I belive there was only the one place this was neglected. [[done]]+> --[[Joey]]
@@ -0,0 +1,27 @@+Hi there,++After updating to 3.20111203 (on Arch Linux) I noticed I was not able to use `git annex get` from a SSH remote (server running Arch Linux, same version of git-annex): "requested key is not present". Same behavior with current master (commit 6cf28585). I had no issue with the previous version (3.20111122).++On this server, I was able to track down the issue using `git-annex-shell inannex` and `strace`:++ $ strace -f -o log git-annex-shell inannex ~/photos-annex.git WORM-s369360-m1321602916--2011-11-17.jpg + $ echo $?+ 1+ $ tail -n20 log+ [...]+ 25623 chdir("/home/schnouki/git-annex") = 0+ 25623 stat("/home/schnouki/photos-annex.git/annex/objects/082/676/WORM-s369360-m1321602916--2011-11-17.jpg/WORM-s369360-m1321602916--2011-11-17.jpg", {st_mode=S_IFREG|0400, st_size=369360, ...}) = 0+ 25623 open("annex/objects/082/676/WORM-s369360-m1321602916--2011-11-17.jpg/WORM-s369360-m1321602916--2011-11-17.jpg", O_RDONLY) = -1 ENOENT (No such file or directory)+ [...]++Note there is a call to `stat()` with the full path to the requested file, and *then* a call to `open()` with a relative path -- which calls this call to fail, and git-annex-shell to return 1. With 3.20111122, there was no call to `stat()`, just a successful call to `open()` with a full absolute path.++Using `git bisect` I was able to determine that this bug appeared in commit 64672c62 ("refactor"). Reverting it makes `git-annex-shell` work as expected, but I'm sure there are better ways to fix this. However I don't know enough Haskell to do it myself.++Could you please try to fix this in a future version?++> Thanks for a very good bug report. +> +> I've fixed this stupid mistake introduced in the code refactoring.+> [[done]]+> --[[Joey]]
@@ -0,0 +1,32 @@+### Please describe the problem.+Trying to rename the "here" repository fails++### What steps will reproduce the problem?+* Start git-annex webapp in the console (for the first time, or remove old annex directory + .config/git-annex)+* In the browser window that opens click "Make repository"+* The "here" repository should show up in the dashboard+* Go to settings and select edit+* Change the repository name (e.g. to here2) and click save changes+* You should be back at the dashboard and the repository name is still "here"+++### What version of git-annex are you using? On what operating system?+* git-annex version: 4.20130601+* build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP DNS+* built using cabal+* on Ubuntu 13.04 32bit++### Please provide any additional information below.++[[!format sh """+# If you can, paste a complete transcript of the problem occurring here.+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log++[2013-06-12 22:22:57 CEST] main: starting assistant version 4.20130601+(scanning...) [2013-06-12 22:22:57 CEST] Watcher: Performing startup scan+(started...) ++# End of transcript or log.+"""]]++> Made text field for this repository disabled. The current repository has no remote name to edit. [[done]] --[[Joey]]
@@ -0,0 +1,15 @@+Can't set the repository directory+++At beginning during the webapp installation+++0.0.1 for OS X 10.8.2+++user error (git ["--git-dir=/Users/filippo/Desktop/annex/.git","--work-tree=/Users/filippo/Desktop/annex","commit-tree","4b825dc642cb6eb9a060e54bf8d69288fbee4904"] exited 128)++[[!tag moreinfo assistant]]++> [[done]]; based on the comment, this was a broken git email issue, which+> git-annex now works around. --[[Joey]]
@@ -0,0 +1,158 @@+### Please describe the problem.+The android app won't start on Cyanogenmod 10.2. Not sure if this is cyanogenmod specific or if it is because the underlying android is now version 4.3++### What steps will reproduce the problem?+Install the apk and start the program++### What version of git-annex are you using? On what operating system?+A 7 day old nightly as of this post(can't get specific number since it won't run)++### Please provide any additional information below.++Tested this on both a samsung galaxy S and a samsung galaxy note 2. With different nightlies of cyanogenmod 10.2++[[!format sh """+# If you can, paste a complete transcript of the problem occurring here.+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log++Falling back to hardcoded app location; cannot find expected files in /data/app-lib+git annex webapp+u0_a115@android:/sdcard/git-annex.home $ git annex webapp+CANNOT LINK EXECUTABLE: git-annex invalid R_ARM_COPY relocation against DT_SYMBOLIC shared library libc.so (built with -Bsymbolic?)+1|u0_a115@android:/sdcard/git-annex.home $++---+++cat git-annex-install.log++Installation starting to /data/data/ga.androidterm+34c88243533e9b0a725ebe33533d990e628dc44b+installing busybox+installing git-annex+installing git-shell+installing git-upload-pack+installing git+installing gpg+installing rsync+installing ssh+installing ssh-keygen+linking ./libexec/git-core/git-config to git+linking ./libexec/git-core/git-fetch to git+linking ./libexec/git-core/git-fsck to git+linking ./libexec/git-core/git-unpack-file to git+linking ./libexec/git-core/git-get-tar-commit-id to git+linking ./libexec/git-core/git-fmt-merge-msg to git+linking ./libexec/git-core/git-push to git+linking ./libexec/git-core/git-for-each-ref to git+linking ./libexec/git-core/git-pack-redundant to git+linking ./libexec/git-core/git-mv to git+linking ./libexec/git-core/git-ls-remote to git+linking ./libexec/git-core/git-prune-packed to git+linking ./libexec/git-core/git-apply to git+linking ./libexec/git-core/git-check-ignore to git+linking ./libexec/git-core/git-log to git+linking ./libexec/git-core/git-cherry-pick to git+linking ./libexec/git-core/git-diff-files to git+linking ./libexec/git-core/git-commit-tree to git+linking ./libexec/git-core/git-index-pack to git+linking ./libexec/git-core/git-reflog to git+linking ./libexec/git-core/git-merge-index to git+linking ./libexec/git-core/git-column to git+linking ./libexec/git-core/git-checkout-index to git+linking ./libexec/git-core/git-diff-index to git+linking ./libexec/git-core/git-count-objects to git+linking ./libexec/git-core/git-fast-export to git+linking ./libexec/git-core/git-fetch-pack to git+linking ./libexec/git-core/git-merge-file to git+linking ./libexec/git-core/git-init to git+linking ./libexec/git-core/git-remote to git+linking ./libexec/git-core/git-init-db to git+linking ./libexec/git-core/git-ls-tree to git+linking ./libexec/git-core/git-merge-subtree to git+linking ./libexec/git-core/git-rev-parse to git+linking ./libexec/git-core/git-bundle to git+linking ./libexec/git-core/git-prune to git+linking ./libexec/git-core/git-peek-remote to git+linking ./libexec/git-core/git-tar-tree to git+linking ./libexec/git-core/git-describe to git+linking ./libexec/git-core/git-update-index to git+linking ./libexec/git-core/git to git+linking ./libexec/git-core/git-revert to git+linking ./libexec/git-core/git-show-ref to git+linking ./libexec/git-core/git-upload-archive to git+linking ./libexec/git-core/git-add to git+linking ./libexec/git-core/git-verify-tag to git+linking ./libexec/git-core/git-format-patch to git+linking ./libexec/git-core/git-show-branch to git+linking ./libexec/git-core/git-remote-fd to git+linking ./libexec/git-core/git-pack-refs to git+linking ./libexec/git-core/git-replace to git+linking ./libexec/git-core/git-pack-objects to git+linking ./libexec/git-core/git-notes to git+linking ./libexec/git-core/git-tag to git+linking ./libexec/git-core/git-var to git+linking ./libexec/git-core/git-help to git+linking ./libexec/git-core/git-gc to git+linking ./libexec/git-core/git-check-ref-format to git+linking ./libexec/git-core/git-shortlog to git+linking ./libexec/git-core/git-stage to git+linking ./libexec/git-core/git-mktree to git+linking ./libexec/git-core/git-merge-recursive to git+linking ./libexec/git-core/git-grep to git+linking ./libexec/git-core/git-clean to git+linking ./libexec/git-core/git-merge-base to git+linking ./libexec/git-core/git-repo-config to git+linking ./libexec/git-core/git-hash-object to git+linking ./libexec/git-core/git-read-tree to git+linking ./libexec/git-core/git-rm to git+linking ./libexec/git-core/git-fsck-objects to git+linking ./libexec/git-core/git-ls-files to git+linking ./libexec/git-core/git-mktag to git+linking ./libexec/git-core/git-stripspace to git+linking ./libexec/git-core/git-mailsplit to git+linking ./libexec/git-core/git-diff-tree to git+linking ./libexec/git-core/git-merge-ours to git+linking ./libexec/git-core/git-cherry to git+linking ./libexec/git-core/git-checkout to git+linking ./libexec/git-core/git-rev-list to git+linking ./libexec/git-core/git-write-tree to git+linking ./libexec/git-core/git-update-ref to git+linking ./libexec/git-core/git-blame to git+linking ./libexec/git-core/git-archive to git+linking ./libexec/git-core/git-update-server-info to git+linking ./libexec/git-core/git-merge-tree to git+linking ./libexec/git-core/git-show to git+linking ./libexec/git-core/git-remote-ext to git+linking ./libexec/git-core/git-merge to git+linking ./libexec/git-core/git-name-rev to git+linking ./libexec/git-core/git-bisect--helper to git+linking ./libexec/git-core/git-clone to git+linking ./libexec/git-core/git-symbolic-ref to git+linking ./libexec/git-core/git-send-pack to git+linking ./libexec/git-core/git-commit to git+linking ./libexec/git-core/git-mailinfo to git+linking ./libexec/git-core/git-credential to git+linking ./libexec/git-core/git-diff to git+linking ./libexec/git-core/git-patch-id to git+linking ./libexec/git-core/git-rerere to git+linking ./libexec/git-core/git-branch to git+linking ./libexec/git-core/git-reset to git+linking ./libexec/git-core/git-receive-pack to git+linking ./libexec/git-core/git-verify-pack to git+linking ./libexec/git-core/git-unpack-objects to git+linking ./libexec/git-core/git-check-attr to git+linking ./libexec/git-core/git-whatchanged to git+linking ./libexec/git-core/git-status to git+linking ./libexec/git-core/git-cat-file to git+linking ./libexec/git-core/git-annotate to git+linking ./bin/git-upload-archive to git+linking ./bin/git-receive-pack to git+linking ./libexec/git-core/git-shell to git-shell+linking ./libexec/git-core/git-upload-pack to git-upload-pack+Installation complete++# End of transcript or log.+"""]]++> [[dup|done]] of [[git-annex_broken_on_Android_4.3]].--[[Joey]]
@@ -0,0 +1,18 @@+What steps will reproduce the problem?++cabal install git-annex++What is the expected output? What do you see instead?++I get this:++ Assistant/WebApp/Configurators/Local.hs:55:11:+ `fieldEnctype' is not a (visible) field of constructor `Field'++What version of git-annex are you using? On what operating system?++20121127++Please provide any additional information below.++> [[done]]; see comments. --[[Joey]]
@@ -0,0 +1,69 @@+I have an annex that I use to store my digital photos. I had a few false+starts creating this annex, but now it's looking good on my server:++ root@titan.local:/tank/Media/Pictures# git annex status+ supported backends: SHA256E SHA1E SHA512E SHA224E SHA384E SHA256 SHA1 SHA512 SHA224 SHA384 WORM URL+ supported remote types: git S3 bup directory rsync web hook+ trusted repositories: 0+ semitrusted repositories: 2+ 00000000-0000-0000-0000-000000000001 -- web+ be88bc5a-17e2-11e2-a99b-d388d4437350 -- here (titan)+ untrusted repositories: 0+ dead repositories: 5+ 0A9F3136-A12A-43C7-9BE2-33F59954FD52 -- vulcan+ 57349F02-E497-4420-9230-6B15D8AB14EE -- vulcan+ 6195C912-2707-4B75-AC8C-11C51FAA8FE0 -- vulcan+ D51DEDC4-9255-4A99-8520-2B1CED337674 -- hermes+ EE327B34-3E20-4B5B-8F0E-D500CBC9738D -- hermes+ transfers in progress: none+ available local disk space: unknown+ local annex keys: 20064+ local annex size: 217 gigabytes+ known annex keys: 21496+ known annex size: 217 gigabytes+ bloom filter size: 16 mebibytes (4% full)+ backend usage: + SHA256E: 41560+ root@titan.local:/tank/Media/Pictures# git annex unused+ unused . (checking for unused data...) ok++It passes `git annex fsck` without any problems. However, when I "git clone"+this annex to my desktop machine and then do a `git annex sync`, I see this:++ Vulcan /Volumes/tank/Media/Pictures (master) $ git annex status+ supported backends: SHA256E SHA1E SHA512E SHA224E SHA384E SHA256 SHA1 SHA512 SHA224 SHA384 WORM URL+ supported remote types: git S3 bup directory rsync web hook+ trusted repositories: 0+ semitrusted repositories: 5+ 00000000-0000-0000-0000-000000000001 -- web+ 0A9F3136-A12A-43C7-9BE2-33F59954FD52 -- vulcan+ 274D3474-7A25-44CD-8368-CF11C451014F -- here (vulcan)+ EE327B34-3E20-4B5B-8F0E-D500CBC9738D -- hermes+ be88bc5a-17e2-11e2-a99b-d388d4437350 -- titan+ untrusted repositories: 0+ dead repositories: 3+ 57349F02-E497-4420-9230-6B15D8AB14EE -- vulcan+ 6195C912-2707-4B75-AC8C-11C51FAA8FE0 -- vulcan+ D51DEDC4-9255-4A99-8520-2B1CED337674 -- hermes+ transfers in progress: none+ available local disk space: 1 terabyte (+1 megabyte reserved)+ local annex keys: 0+ local annex size: 0 bytes+ known annex keys: 21025+ known annex size: 217 gigabytes+ bloom filter size: 16 mebibytes (0% full)+ backend usage: + SHA256: 18707+ SHA256E: 2318++Where did all these `SHA256` keys come from?++Why doesn't the known annex keys size match?++Further, I cannot `git annex get` on most of the files, because it says that+the `SHA256` key is not present.++It looks like I'll have to rollback my ZFS snapshots and start over, but I'm+wondering: how was I even able to create this situation?++> [[Done]]; user error. --[[Joey]]
@@ -0,0 +1,14 @@+What steps will reproduce the problem?++I really have no way to reproduce. I have these two annex repository, both living on CentOS 6.3 machines, using SSH to copy from one to the other. Everything has always worked fine, and I've copied hundreds of gigabytes and tens of thousands of files so far without a problem.++What is the expected output? What do you see instead?++I do "git copy --to storage FILE" and it says "Copying FILE... failed". That's it.++How do I fix things so that I can copy again? Nothing that I tried had any effect on the problem.++Thanks!++> Thanks to Jim's smart correlation of this with another bug, I've fixed+> them both. [[done]] --[[Joey]]
@@ -0,0 +1,32 @@+# What steps will reproduce the problem?++Editing a text file with vim++#What is the expected output? What do you see instead?++ # On branch master+ # Changes not staged for commit:++ # (use "git add <file>..." to update what will be committed)+ # (use "git checkout -- <file>..." to discard changes in working directory)+ #+ # typechange: test+ #+ # Untracked files:+ # (use "git add <file>..." to include in what will be committed)+ #+ # .test.swp++ no changes added to commit (use "git add" and/or "git commit -a")++ /.test.swp still has writers, not adding++ Committer crashed: ./test~: createLink: does not exist (No such file or directory)++# What version of git-annex are you using? On what operating system?++3.20130107 prebuilt tar ball on Debian testing++> Could also fail in `getFileStatus`. In either case it's a race+> with the file being deleted while it's still in the process of being+> locked down. Fixed this [[done]] --[[Joey]]
@@ -0,0 +1,16 @@+What steps will reproduce the problem?++> cabal install git-annex++What is the expected output? What do you see instead?++> I would expect a working git-annex on my little linode. I have a linode 768 and trouble building the latest version. The process get's killed because of an out of memory condition.++What version of git-annex are you using? On what operating system?++> git-annex version: 4.20130314+> Ubuntu 12.04++Please provide any additional information below.++[[done]]
@@ -0,0 +1,56 @@+I really don't know what's happened here, I just did `git annex unannex .` in a very large annex:++ unannex Inbox/Lolcat.JPG (Recording state in git...)+ ok+ unannex Inbox/Lolcat.jpg (Recording state in git...)+ ok+ unannex Inbox/May 2012 Photo Stream/120502_0004.JPG (Recording state in git...)+ ok+ unannex Inbox/May 2012 Photo Stream/120518_0005.JPG (Recording state in git...)+ ok+ unannex Inbox/May 2012 Photo Stream/120523_0006.JPG (Recording state in git...)+ ok+ unannex Inbox/May 2012 Photo Stream/120523_0007.JPG (Recording state in git...)+ ok+ unannex Inbox/My boyfriend of 7 years and I are both physicists. Here's how he proposed to me. - Imgur.jpg (Recording state in git...)+ ok+ unannex Inbox/Nov 2012 Photo Stream/121102_0035.JPG (Recording state in git...)+ ok+ unannex Inbox/Nov 2012 Photo Stream/121102_0036.JPG (Recording state in git...)+ ok+ unannex Inbox/Nov 2012 Photo Stream/121102_0037.JPG (Recording state in git...)+ ok+ unannex Inbox/Nov 2012 Photo Stream/121102_0038.JPG (Recording state in git...)+ ok+ unannex Inbox/Nov 2012 Photo Stream/121102_0039.JPG (Recording state in git...)+ ok+ unannex Inbox/Nov 2012 Photo Stream/121103_0040.JPG (Recording state in git...)+ ok+ unannex Inbox/Nov 2012 Photo Stream/121104_0041.JPG (Recording state in git...)+ ok+ unannex Inbox/Nov 2012 Photo Stream/121105_0042.JPG (Recording state in git...)+ error: bad index file sha1 signature+ fatal: index file corrupt+ git-annex: failed to read sha from git write-tree+ git-annex: git commit [Param "-q",Params "-m",Param "content removed from git annex",Param "--",File "Inbox/Nov 2012 Photo Stream/121105_0042.JPG"] failed+ Vulcan:~/Pictures $ ga unannex .+ unannex Inbox/Nov 2012 Photo Stream/121109_0043.JPG error: bad index file sha1 signature+ fatal: index file corrupt++ git-annex: fd:12: hClose: resource vanished (Broken pipe)+ failed+ git-annex: pre-commit: 1 failed+ git-annex: git commit [Param "-q",Params "-m",Param "content removed from git annex",Param "--",File "Inbox/Nov 2012 Photo Stream/121109_0043.JPG"] failed+ Vulcan:~/Pictures $ ga -F unannex .+ unannex Inbox/Nov 2012 Photo Stream/121124_0044.JPG error: bad index file sha1 signature+ fatal: index file corrupt++ git-annex: fd:12: hClose: resource vanished (Broken pipe)+ failed+ git-annex: pre-commit: 1 failed+ git-annex: git commit [Param "-q",Params "-m",Param "content removed from git annex",Param "--",File "Inbox/Nov 2012 Photo Stream/121124_0044.JPG"] failed++I guess now I'll just try to unlink the symlinks by hand, and drop the `.git` directory?++> [[done]]; per my comment this seems like a corrupt git repository.+> --[[Joey]]
@@ -0,0 +1,53 @@+What steps will reproduce the problem?+Pairing an existing git annex repository with a fresh repository on another computer in the git-annex webapp+++What is the expected output? What do you see instead?+Expected result is that the two machines sync correctly.++What i see are some "ControlPath <data> too long for unix domain socket" errors from ssh, but the computers do actually sync properly. ++Even though the data is synced properly, either the sender(or both of the clients) don't actually realize this. And the queue circles, all the transfers are being redone constantly(On every start of git-annex webapp on the original repository at least).+++What version of git-annex are you using? On what operating system?+Latest git master as of this post. Debian sid and Ubuntu 12.04+++Please provide any additional information below.+++stdout snippet from git-annex webapp:+++ ControlPath "/home/alansmithee/Desktop/annex/.git/annex/ssh/alansmithee@git-annex-debbook.local-alansmithee.dxpXHVCkLhsxvWaH" too long for Unix domain socket+ SHA256-s51233--0b4c59b3ab03b1ca6d95d4084fa6ff7220cf26695b6e3dd575f78af3dec6b701+ 51233 100% 5.43MB/s 0:00:00 (xfer#1, to-check=0/1)++ sent 30 bytes received 51385 bytes 102830.00 bytes/sec+ total size is 51233 speedup is 1.00+ ok+ (Recording state in git...)++ ControlPath "/home/alansmithee/Desktop/annex/.git/annex/ssh/alansmithee@git-annex-debbook.local-alansmithee.9ZQwEjraTxi20B6W" too long for Unix domain socket+ SHA256-s47883982--4b7cbb49506dcdd223a9db7b400cc41fc2e3ebbf5b2b17b75c9334bb949b6754+ 47883982 100% 1.34MB/s 0:00:34 (xfer#1, to-check=0/1)++ sent 30 bytes received 47889978 bytes 1388116.17 bytes/sec+ total size is 47883982 speedup is 1.00+ ok+ (Recording state in git...)+++This data appears on both the sending and receiving git-annex stdout. At least for the initial sync. For later syncs it only appears on the sender, though the client system is using a lot of resources.++> I've made git-annex detect if the control path would be too long,+> and disable ssh connection caching. It also tries a relative path+> to the file, which tends to make it shorter, and I think would+> keep ssh connection caching working in your example.+> +> Please test and see if it works, and also if the "looping" problem+> still happens. --[[Joey]]++>> Closing; I'm pretty sure the looping is just transfer retrying, to be+>> expected if they fail. [[done]] --[[Joey]]
@@ -0,0 +1,33 @@+**What steps will reproduce the problem?**++Manually building git-annex from git.++**What is the expected output? What do you see instead?**++ $ cabal update+ ...+ $ cabal install --only-dependencies+ ...+ $ cabal configure+ ...+ $ cabal build+ Building git-annex-3.20120826...+ Preprocessing executable 'git-annex' for git-annex-3.20120826...+ + Utility/Yesod.hs:15:8:+ Could not find module `Data.Default'+ It is a member of the hidden package `data-default-0.5.0'.+ Perhaps you need to add `data-default' to the build-depends in your .cabal file.+ Use -v to see a list of the files searched for.+ $++**What version of git-annex are you using? On what operating system?**++commit e7d728672a5fc923be9ab1d6fe4b65f2058b49c7+Arch Linux++**Please provide any additional information below.**++When I add data-default to git-annex.cabal's Build-Deps it works fine.++> Thanks, [[done]]. --[[Joey]]
@@ -0,0 +1,24 @@+### Please describe the problem.++I've been using git-annex for a few weeks now, and everything was working fine until today. Now, when git-annex goes to sync my files, it will hang for a while, and then display a red box on the left side, saying `! Synced with adam.liter`. So, basically, it doesn't really sync. The logs say that it cannot read from the remote repository, which is set up on box.com and was working just fine until today.++I've tried reconfiguring my jabber account on all my devices with git-annex as well as deleting and remaking the box.com repository, and none of these steps have solved the problem.++### What steps will reproduce the problem?++Making changes to any file located in the repository.++### What version of git-annex are you using? On what operating system?++Mac OS X 10.8.4 and git-annex version 4.20130801-gc88bbc4.++### Please provide any additional information below.++[[!format sh """+[2013-09-09 01:33:03 EDT] XMPPSendPack: Syncing with adam.liter +Already up-to-date.+fatal: Could not read from remote repository.++Please make sure you have the correct access rights+and the repository exists.+"""]]
@@ -0,0 +1,40 @@+I'm not able to install git-annex with cabal.++What steps will reproduce the problem?++ bbigras@bbigras-VirtualBox:~$ cabal update+ Downloading the latest package list from hackage.haskell.org+ bbigras@bbigras-VirtualBox:~$ cabal install git-annex --bindir=$HOME/bin+ Resolving dependencies...+ cabal: Could not resolve dependencies:+ trying: git-annex-3.20130207 (user goal)+ trying: git-annex-3.20130207:+webdav+ trying: git-annex-3.20130207:+webapp+ trying: git-annex-3.20130207:+assistant+ trying: yesod-1.1.8.2 (dependency of git-annex-3.20130207:+assistant)+ trying: yesod-auth-1.1.5.2 (dependency of yesod-1.1.8.2)+ trying: authenticate-1.3.2.4 (dependency of yesod-auth-1.1.5.2)+ trying: xml-conduit-1.1.0.1 (dependency of authenticate-1.3.2.4)+ next goal: DAV (dependency of git-annex-3.20130207:+webdav)+ rejecting: DAV-0.3 (conflict: xml-conduit==1.1.0.1, DAV => xml-conduit>=1.0 &&+ <=1.1)+ rejecting: DAV-0.2, 0.1, 0.0.1, 0.0 (conflict: git-annex-3.20130207:webdav =>+ DAV(>=0.3))+ bbigras@bbigras-VirtualBox:~$+++What version of git-annex are you using? On what operating system?++Ubuntu 12.10 x86_64++cabal-install version 0.14.0+using version 1.14.0 of the Cabal library++> The Haskell DAV library needs to be updated to build with+> the newer version of xml-conduit. Library skew of this sort +> is common when using cabal.+> +> You can work around this by building git-annex without webdav:+> `cabal configure --flags=-WebDAV`+> +> This is not a git-annex bug. [[done]] --[[Joey]]
@@ -0,0 +1,43 @@+What steps will reproduce the problem?++I create a new annex, added in a bunch of files.++I cloned this annex to another machine, where I already had those files, so I copied them into a directory named "foo", did "git annex add foo", and then did "git rm -r foo", and git commit'd my clone of the annex.++Then I try to "git annex sync" with the remote.++What is the expected output? What do you see instead?++I don't know, I've never used git-annex before. This is what I get each time:++ Hermes ~/Products/tmp/Movies (master) $ ga sync+ git-annex-shell: Prelude.(!!): index too large++What version of git-annex are you using? On what operating system?++It's the 'master' as of yesterday: c504f4025fec49e62601fbd4a3cd8f1270c7d221++I'm on OS X 10.8.2, using GHC 7.6.1. The annex in question has 38G in a few hundred files.++Please provide any additional information below.++I'm willing to help track this down!++> I've got it, October 9th's release +> included commit bc649a35bacbecef93e378b1497f6a05b30bf452, which included a+> change to a `segment` function. It was supposed to be a+> rewrite in terms of a more general version, but it introduced a bug+> in what it returned in an edge case and this in turn led git-annex-shell's+> parameter parser to fail in a code path that was never reachable before.+> +> It'd fail both when a new repo was running `git-annex-shell configlist`,+> and in `git-annex-shell commit`, although this latter crash was less+> noticible and I'm sure you saw the former.+> +> Fixed the reversion; fixed insufficient guards around the partial code+> (which I cannot see a way to entirely eliminate sadly; look at+> GitAnnexShell.hs's `partitionParams` and weep or let me know if you have +> any smart ideas..); added a regression test to check the non-obvious+> behavior of segment with an empty segment. I'll be releasing a new+> version with this fix as soon as I have bandwidth, ie tomorrow.+> [[done]] --[[Joey]]
@@ -0,0 +1,32 @@+*What steps will reproduce the problem?*++1. Start git-annex webapp+2. Configuration+3. Configure Jabber Account+4. Insert user and pass+5. Click "User this account"++Tryed 4 times, all the same.+++*What is the expected output? What do you see instead?*++On Chrome I get "Error 101 (net::ERR_CONNECTION_RESET): The connection was reset." or "Error 324 (net::ERR_EMPTY_RESPONSE): The server closed the connection without sending any data."++On the terminal where git-annex was running I get "Segmentation fault (core dumped)"+++*What version of git-annex are you using? On what operating system?*++git-annex version: I downloaded 3.20130107 (twice to be sure), but for some reason 'git-annex version' reports 3.20130102 ++OS: Ubuntu 12.04.1 LTS 3.2.0-35-generic-pae #55-Ubuntu SMP Wed Dec 5 18:04:39 UTC 2012 i686 i686 i386 GNU/Linux+++*Please provide any additional information below.*++On dmesg: +[45773.212717] git-annex[26779]: segfault at b724e840 ip 09699150 sp b4cfd038 error 7 in git-annex[8048000+1762000]++[[!tag /design/assistant]]+> [[done]], see comments --[[Joey]]
@@ -0,0 +1,18 @@+What steps will reproduce the problem?++Don't have gpg installed/on your $PATH, and attempt to create an encrypted S3 remote via the web interface.++What is the expected output? What do you see instead?++Expected to be told to install GPG. Actual output was a Yesod error:++Internal Server Error+user error (gpg ["--batch","--no-tty","--use-agent","--quiet","--trust-model","always","--gen-random","--armor","1","512"] exited 127)++What version of git-annex are you using? On what operating system?++3.20130107 on Fedora 17 (64-bit).++Please provide any additional information below.++[[!tag /design/assistant]]
@@ -0,0 +1,26 @@+What steps will reproduce the problem?++Create a new git repo on OS X. create a .gitignore file containing the line ".DS_Store". Check it into git. do "git annex init" to make the directory into a git annex repo. do "git annex direct" to put it in direct mode. do "git annex assistant" to start the assistant and watch it with "git annex webapp".++Open the directory in the finder. Drag in some files and watch the assistant as it checks them in. Play with your window's viewing preferences, maybe view things as "icons" so that the finder is forced to store metadata about where you dragged the icons in the window in the .DS_Store file. As you do this, watch the webapp. .DS_Store will start to be checked into git annex, and rechecked in frequently as it is updated. Git annex assistant is not respecting the .gitignore file. Is there some other way to tell git annex assistant that certain files should be ignored than .gitignore?+++What is the expected output? What do you see instead?++.DS_Store files are ignored by the assistant.+++What version of git-annex are you using? On what operating system?++git-annex version: 3.20130124++OS X Lion++Please provide any additional information below.++> Assistant does not support .gitignore yet. Requires an efficient query+> interface for ignores, which git does not provide.+>+> However, I've added a special case, OSX only ignore for .DS_Store files.+> [[done]] --[[Joey]] +
@@ -0,0 +1,18 @@+### Please describe the problem.+I created a remote repo on ssh server with the same git-annex version, no personal ssh keys for the repo (password authentication). But I put ~ in front of the repo name so it created in different place than I wanted. I deleted it from assistant and then deleted the remote repo dir. When I added it with the correct path again it always asks for server password (it has some old annex pub key in authorized_keys, but not the new one; it might have been prompted for the password also with the initial repo). During the whole thing it failed to connect a few times due to wrong password or me realizing too late that it asks for yet another one and it generated keys few times, but ultimately didn't put the last one in remote's authorized_keys.++### What steps will reproduce the problem?+Create, delete and create again a new repo on remote ssh server with password auth.++### What version of git-annex are you using? On what operating system?+git-annex 4.20130601 Gentoo amd64++### Please provide any additional information below.++[[!format sh """+# If you can, paste a complete transcript of the problem occurring here.+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log+++# End of transcript or log.+"""]]
@@ -0,0 +1,24 @@+###What steps will reproduce the problem?###++"Adding a remote server using ssh" and try to add a remote server where the account has ex. tcsh as loginshell++###What is the expected output? What do you see instead?###++To discover remote programs, it dumps away some born-shell code like:+"echo git-annex-probe loggedin;if which git-annex-shell; then echo git-annex-probe git-annex-shell; fi;if which rsync; then echo git-annex-probe rsync; fi;if which ~/.ssh/git-annex-shell; then echo git-annex-probe ~/.ssh/git-annex-shell; fi"++just wrap it with a bash -c '..' and you know that its interpreted by bash.++###What version of git-annex are you using? On what operating system?###++git-annex version: 3.20121017++###Please provide any additional information below.###++Not everyone has bash as there login-shell.++[[!tag /design/assistant]]++> [[done]]; assistant now uses sh -c "sane shell stuff here" to work+> around csh. (There are systems without bash, but probably fewer without sh)+> --[[Joey]]
@@ -0,0 +1,11 @@+### Please describe the problem.++I have a jabber account on `jabber.ccc.de`. When trying to log in to that account, I get "Unable to connect to the Jabber server. Maybe you entered the wrong password? (Error message: AuthenticationFailure)" I've typed the password enough times that I'm relatively certain that I've typed it correctly at least once. It's difficult to see behind this error message. This is the only thing that shows up in the debug log:++ [2013-05-26 21:40:16 EDT] read: host ["-t","SRV","--","_xmpp-client._tcp.jabber.ccc.de"]+ [2013-05-26 21:40:16 EDT] read: host ["-t","SRV","--","_xmpp-client._tcp.jabber.ccc.de"]++It'd be great if this error were a wee bit more verbose.++> The XMPP library has been updated to include the actual error message from the server.+> [[done]] --[[Joey]]
@@ -0,0 +1,25 @@+##What steps will reproduce the problem?++ mkdir test+ git init+ git annex init "test"+ echo "test" > a+ echo "test" > b+ git annex add a b+ git annex sync+ git annex direct+ git annex sync | grep add+ git annex sync | grep add++##What is the expected output? What do you see instead?++The last two syncs shouldn't need to add or checksum anything.+Firstly, the output is very confusing because the files have already been added.+Secondly, the sync can take quite a while if you have lots of duplicates or a lot of files that are incidentally similar.++##What version of git-annex are you using? On what operating system?++git-annex version: 4.20130227 on Archlinux++> [[done]]; fixed inode caching code to support multiple files for the+> same content. --[[Joey]]
@@ -0,0 +1,46 @@+### Please describe the problem.++After running two repositories syncing with one another in direct mode "git status" shows unstaged changes in both.++### What steps will reproduce the problem?++1. Create two direct mode repositories with each other as ssh remotes+2. Run "git annex assistant" on each+3. Create files on each and they get synced+4. Run "git status"++In my current repository the output is:++[[!format sh """+$ git status+# On branch master+# Changes not staged for commit:+# (use "git add <file>..." to update what will be committed)+# (use "git checkout -- <file>..." to discard changes in working directory)+#+# typechange: fromgolias+# typechange: fromwintermute+#+no changes added to commit (use "git add" and/or "git commit -a")+"""]]++### What version of git-annex are you using? On what operating system?++[[!format sh """+$ git annex version+git-annex version: 4.20130516.1+build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP+local repository version: 4+default repository version: 3+supported repository versions: 3 4+upgrade supported from repository versions: 0 1 2++$ lsb_release -a+No LSB modules are available.+Distributor ID: Ubuntu+Description: Ubuntu 12.04.2 LTS+Release: 12.04+Codename: precise+"""]]++> [[done]] --[[Joey]]
@@ -0,0 +1,32 @@+### Please describe the problem.++When a repository is set in direct mode it will still replace files with symlinks when it becomes aware of a change but still hasn't been able to sync the file contents. This can create repositories that are temporarily unusable with files replaced with broken symlinks.++### What steps will reproduce the problem?++1. Create two repositories with each other as remotes+2. Run the assistant on both+3. Create some file changes in one and watch the directory in another.+4. For a brief (or sometimes long) time the destination repository will have it's old version of the file replaced by a broken symlink++This is particularly noticeable when using XMPP as it can often be the case that the two repositories can't connect to each other directly but can talk through XMPP. This breaks using git-annex in direct mode for things like having a synced config directory across machines. Something like having "~/.bashrc" linked into "~/annex-repository/bashrc", doesn't work as there will be times when a machine is broken because .bashrc is linked to a broken symlink while it fetches a new version. ++The desired behavior would be to have git-annex in direct mode only replace older versions of files with newer versions of files.++### What version of git-annex are you using? On what operating system?++[[!format sh """+$ git annex version+git-annex version: 4.20130516.1+build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP+local repository version: 4+default repository version: 3+supported repository versions: 3 4+upgrade supported from repository versions: 0 1 2+$ lsb_release -a+No LSB modules are available.+Distributor ID: Ubuntu+Description: Ubuntu 12.04.2 LTS+Release: 12.04+Codename: precise+"""]]
@@ -0,0 +1,6 @@+I did a "git annex add" of a bunch of files on a storage server with low IOPS, and saw this:++ git-annex: /tank/Media/Pictures/.git/annex/tmp/430_32b_SHA256E-s4464838--c1785a76ee1451f602e93c99c147e214705004e541de8256d74a3be3717d15e5.jpg.log: openBinaryFile: resource busy (file is locked)+failed++How is that even possible, when the server is doing nothing else?
@@ -0,0 +1,8 @@+When copying data to my remote, I regularly see speeds in excess of 100 MB/s on my home DSL line.++ 2073939 100% 176.96MB/s 0:00:00 (xfer#1, to-check=0/1)++This is definitely not correct.++> Closing, as rsync does this to show you when it's making your life+> faster than it would be w/o rsync. [[done]] --[[Joey]]
@@ -0,0 +1,36 @@+What steps will reproduce the problem?++1. Click "Remote server: Set up a repository on a remote server using ssh." +2. Enter hostname and different username than currently logged in user+3. Click check this server+++What is the expected output? ++> I expected to see the next step in the remote repo creration process.++What do you see instead?+++> Failed to ssh to the server. Transcript: ssh_askpass: exec(/usr/libexec/ssh-askpass): No such file or directory Permission denied, please try again. ssh_askpass: exec(/usr/libexec/ssh-askpass): No such file or directory Permission denied, please try again. ssh_askpass: exec(/usr/libexec/ssh-askpass): No such file or directory Permission denied (publickey,password). +++What version of git-annex are you using? ++> git-annex: Version: 3.20130114 +++On what operating system?++> OSX: 10.8.2++++Please provide any additional information below.++> I mentioned "with a different username" because the assistant will allow me to create a remote repository on the same target machine when I use my normal username. I think this is most likely because I have a ssh-key setup for the account on the remote machine. However I do not want to assume anything and send you down the wrong OSX rabbit hole. ++> After a little research it seems that OSX does not have a ssh-askpass++[[!tag /design/assistant/OSX]]+[[!meta title="ssh-askpass not available on OSX"]]
@@ -0,0 +1,31 @@+Running 3.20121112 on Debian Squeeze.++Since adding a certain directory of files (just a bunch of PDFs) yesterday I am getting errors when I try to use `git annex drop .` when the files aren't present, rather doing nothing or saying 'ok', as it used to do/should do. The errors are of the form `git-annex: fd:10: hGetLine: end of file` and sometimes of the form `git-annex: fd:17: hFlush: resource vanished (Broken pipe)`. In my `daemon.log`, I have the errors++ (scanning...) Already up-to-date.+ Already up-to-date.+ TransferScanner crashed: fd:26: hGetLine: end of file+ Already up-to-date.+ (started...) git-annex: fd:25: hGetLine: end of file+ git-annex: fd:24: hFlush: resource vanished (Broken pipe)+ git-annex: fd:24: hFlush: resource vanished (Broken pipe)+ git-annex: fd:24: hFlush: resource vanished (Broken pipe)+ git-annex: fd:24: hFlush: resource vanished (Broken pipe)+ git-annex: fd:24: hFlush: resource vanished (Broken pipe)+ git-annex: fd:24: hFlush: resource vanished (Broken pipe)+ git-annex: fd:24: hFlush: resource vanished (Broken pipe)+ git-annex: fd:24: hFlush: resource vanished (Broken pipe)+ git-annex: fd:24: hFlush: resource vanished (Broken pipe)+ git-annex: fd:24: hFlush: resource vanished (Broken pipe)+ git-annex: fd:24: hFlush: resource vanished (Broken pipe)+ [many more repetitions]++If I `git annex get` the files and then drop them again, a further attempt at a drop gives all these errors again.++> So in summary, a git-annex built against the old version of git in+> debian stable fails to work with a newer version of git, and rebuilding+> fixes it. FWIW, the git-annex backport to stable does not have this+> problem, because it checks git version at runtime. But I want to avoid+> the overhead of that check in git-annex mainline, because this old git+> version is well, very old and increasingly unlikely to be used. So,+> I don't think any changes to git-annex are warrented. [[done]] --[[Joey]]
@@ -0,0 +1,21 @@+I just noticed that if you move a git-annex symlink to a location ignored by git, it simply works. Upon committing that change, however, part of git-annex's `fix` function apparently tries to `git-add` the symlink. This fails because the new, ignored location requires a `git-add --force`.++Considering that git proper doesn't fail or warn, I think git-annex shouldn't either.++This is the error message:++ $ git mv annexed-file ignored-dir/+ $ git commit+ fix ignored-dir/annexed-file ok+ (Recording state in git...)+ The following paths are ignored by one of your .gitignore files:+ ignored-dir+ Use -f if you really want to add them.+ fatal: no files added+ Command xargs ["-0","git","--git-dir=/home/[...]/repo/.git","--work-tree=/home/[...]/repo","add","--"] failed; exit code 123++ git-annex: user error (Command xargs ["-0","git","--git-dir=/home/[...]/repo/.git","--work-tree=/home/[...]/repo","add","--"] failed; exit code 123)+ failed+ git-annex: 1 failed++> Weird edge case.. ok, fixed. [[done]] --[[Joey]]
@@ -0,0 +1,78 @@+### Please describe the problem.+Every file I add to a watched repository (by git-annex assistant) becomes symlinked, and sub-subsequently write protected.++Sorry if I'm missing something obvious.++### What steps will reproduce the problem?+1) Fresh install+2) create directory, init repo and git-annex+3) git annex assistant+4) add a file+5) ls -lsa to see the symlinked file+6) trying to write to the file throws a write-protected error+++### What version of git-annex are you using? On what operating system?+git-annex version: 4.20130725-g8140f7c +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++Using the generic linux distribution with ./runshell on Ubuntu 13.04 (I saw this same behaviour from the ubuntu package, i.e. apt-get install git-annex)+++### Please provide any additional information below.++Here is the output from my ls -lsa+[[!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+ 4 drwxrwxr-x 3 jetaggart jetaggart 4096 Jul 27 20:38 .+16 drwx------ 60 jetaggart jetaggart 16384 Jul 27 20:44 ..+ 4 drwxrwxr-x 7 jetaggart jetaggart 4096 Jul 27 20:38 .git+ 4 lrwxrwxrwx 1 jetaggart jetaggart 188 Jul 27 20:38 another.org -> .git/annex/objects/Qm/j7/SHA256E-s11--9484d4be897ca66ad4c9bbf299d12adfe37e089bbca1daecbbb49c375a9cf1e9.org/SHA256E-s11--9484d4be897ca66ad4c9bbf299d12adfe37e089bbca1daecbbb49c375a9cf1e9.org+ 4 lrwxrwxrwx 1 jetaggart jetaggart 186 Jul 27 20:33 blah.org -> .git/annex/objects/kj/q5/SHA256E-s0--e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855.org/SHA256E-s0--e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855.org+12 -rw-rw-r-- 1 jetaggart jetaggart 119 Jul 27 20:37 todo.org+++# End of transcript or log.+"""]]++Here is the daemon.log++[[!format sh """++[2013-07-27 20:32:55 BST] main: starting assistant version 4.20130725-g8140f7c+(scanning...) [2013-07-27 20:32:55 BST] Watcher: Performing startup scan+(started...) +[2013-07-27 20:33:52 BST] Committer: Adding blah.org+add blah.org (checksum...) ok+[2013-07-27 20:33:52 BST] Committer: Committing changes to git+(Recording state in git...)+(Recording state in git...)+[2013-07-27 20:35:59 BST] Committer: Committing changes to git+(Recording state in git...)+[2013-07-27 20:36:01 BST] Committer: Committing changes to git+(Recording state in git...)+[2013-07-27 20:37:52 BST] Committer: Committing changes to git+(Recording state in git...)+[2013-07-27 20:37:55 BST] Committer: Committing changes to git+(Recording state in git...)+[2013-07-27 20:38:44 BST] Committer: Committing changes to git+(Recording state in git...)+[2013-07-27 20:38:46 BST] Committer: Adding another.org+add another.org (checksum...) ok+[2013-07-27 20:38:46 BST] Committer: Committing changes to git+(Recording state in git...)+(Recording state in git...)+[2013-07-27 20:38:51 BST] Committer: Committing changes to git+(Recording state in git...)+[2013-07-27 20:38:56 BST] Committer: Committing changes to git+(Recording state in git...)++# End of transcript or log.+"""]]++> [[done]] --[[Joey]]
@@ -0,0 +1,55 @@+### Please describe the problem.+Trying to create repo on ssh server failed because git didn't know my email.++There were other issues I encountered:++ - While connecting to the server assistant says that there will be a password prompt, but doesn't tell that one should expect it to appear in the terminal.++ - When creating keys it says that I will be prompted for key password again, but it asks for password to remote server (I understood it wanted a password for its new key pair).. there is no telling for what those password prompts in terminal are for++ - It actually requires password for remote server multiple times before it starts to use its own keys++ - When failed to test the server or create the repo there the "Retry" button doesn't work (does nothing)++ - Maybe it should strip leading ~ from repo name?++ - Local pairing with annex 3.20121112ubuntu4 from Ubuntu 13.04 sort of works, but not quite.. it syncs the files, but assistant on Ubuntu doesn't show the name for repo on Gentoo (matching versions are important?)++ - When pairing it doesn't check if localhost has running sshd++ - I think that was the reason why progress bars were showing pending transfers even after the status message about syncing was green after starting sshd (synced, already up-to-date)++### What steps will reproduce the problem?+Create repo on remote ssh server without global git settings.++### What version of git-annex are you using? On what operating system?+git-annex-4.20130601, Gentoo amd64++### Please provide any additional information below.++[[!format sh """+# If you can, paste a complete transcript of the problem occurring here.+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log+Initialized empty shared Git repository in /home/reinis/~/Annex/Lit/+init +*** Please tell me who you are.++Run++ git config --global user.email "you@example.com"+ git config --global user.name "Your Name"++to set your account's default identity.+Omit --global to set the identity only in this repository.++fatal: unable to auto-detect email address (got 'reinis@RD-HC.(none)')++git-annex: user error (git ["--git-dir=/home/me/~/Annex/Lit","commit-tree","4b825dc642cb6eb9a060e54bf8d69288fbee4904"] efailed+xited 128)+git-annex: init: 1 failed+++# End of transcript or log.+"""]]++> [[done]]; I've made git-annex detect such broken systems and configure them so git will work. (sigh!) --[[Joey]]
@@ -0,0 +1,14 @@+### Please describe the problem.+git-annex v4.20130827 can't be built on ARM. Technically it's vector that can't be built due to a lack of Template Haskell compilers for this architecture. Vector is a dependency of aeson, which is a dependency of git-annex, which therefore fails to compile.++The only functionality that relies on aeson is, to my knowledge, quvi. Thus my feature request: If you were to introduce a flag to switch quvi support on or off, ARM users like me could circumvent the aeson dependency at build time. In this case we weren't stuck with 4.20130815 (the latest version to not depend on aeson) and could use current and future versions of git-annex. I would appreciate it.+++### What steps will reproduce the problem?+See above.+++### What version of git-annex are you using? On what operating system?+I'm running Raspbian Wheezy on a Raspberry Pi. The git-annex version to be built is 4.20130827. ++> [[done]] --[[Joey]]
@@ -0,0 +1,36 @@+**What steps will reproduce the problem?**++Create two annexes from the command line on two separate machines:++ mkdir ~/Files.annex+ cd ~/Files.annex+ git init+ git annex init+ git annex untrust .+ git annex direct++Add remote to each one pointing to the other:++ git remote add [remote] [remote hostname]:Files.annex++Start assistant on both repos:++ git annex assistant++Fill one repository with a few text files, and wait for them to propagate.++Edit one of the text files using vim, and save.++**What is the expected output? What do you see instead?**++Edited file should remain in the repo, but a significant portion of the time, the file disappeared from the repo in which it was edited (the file is present and properly synced on the other repo).++**What version of git-annex are you using? On what operating system?**++git-annex 4.20130323, Mac OS X on the repo where the file was edited, Arch Linux for the other paired repo.++**Please provide any additional information below.**++I have observed this problem setting up the repos through the webapp as well, so I don't think it is related to setting up the repos manually. I think the way vim is writing the files seems to be tickling a race condition (both command-line vim and MacVim produce the behavior). I started trying to work around it by switching to emacs to edit those files, and the files haven't disappeared from the edited repo (so far at least).++[[!tag /design/assistant moreinfo]]
@@ -0,0 +1,17 @@+`GIT_DIR` support isn't right. Git does not look for `GIT_DIR/.git`;+git-annex does.++Also, to support this scenario, support for core.worktree needs to be added+as well:++ mkdir repo workdir+ git --work-tree=$PWD/workdir --git-dir=$PWD/repo init+ export GIT_DIR=$PWD/repo+ git status+ # ok+ git annex init "new repo"+ # fail++--[[Joey]] ++> [[fixed|done]] --[[Joey]]
@@ -0,0 +1,23 @@+### Please describe the problem.++It looks like GPG is being used in text mode, or at least isn't overriding the GPG config.++### What steps will reproduce the problem?++Have a binary file with long lines, and attempt to copy it into git-annex.++This will happen:++ $ git-annex copy 09\ Into\ The\ Dissonance.mp3 -t rsync.net_annex+ copy 09 Into The Dissonance.mp3 (gpg) (checking rsync.net_annex...) (to rsync.net_annex...) gpg: can't handle text lines longer than 19995 characters+ failed+ git-annex: copy: 1 failed++A workaround is to remove "textmode" from your gpg.conf, but git-annex should force this.++### What version of git-annex are you using? On what operating system?++7ae625363bcb6e1fc8b3733c1d7814aca05a2368 on Ubuntu 13.04 x86_64++> The sheer number of ways gpg offers of shooting yourself in the foot..+> Ok [[done]] --[[Joey]]
@@ -0,0 +1,24 @@+#### What steps will reproduce the problem?++1. Create a new repository with a directory+2. Add files+3. Select "Store your data in the cloud" with the "Remote server" option+4. Enter host, user, directory+5. Select "Use an encrypted rsync repository on the server" (Will there be an option for unencrypted later?)+6. GPG Passphrase prompt comes up for every file++#### What is the expected output? What do you see instead?++I expect to enter a passphase once and then it will sync all files with the remote server.++Instead, it begins syncing the files to the server but prompts for a GPG passphase for every single file.++#### What version of git-annex are you using? On what operating system?++3.20121017 precompiled binary on Arch Linux++#### Please provide any additional information below.++Not sure if I'm just missing a setting for GPG, but I would think I should only need to use the web app to configure the remote server.++[[!tag /design/assistant]]
@@ -0,0 +1,34 @@+### Please describe the problem.+Adding a box.com repository fails with an Internal server error and the message "user error (gpg ["--quiet","--trust-model","always","--batch","--passphrase-fd","48","--symmetric","--force-mdc"] exited 2)"++Looking at the logfile it seems like git-annex is looking for gpg (gpg-agent) in /usr/local/MacGPG2/bin/. On my system it is in /usr/local/bin (installed using homebrew). I do not have the directory /usr/local/MacGPG2/.++Not sure if what the git-annex philosophy is: detect the location of such external programs or ship them together with git-annex.++### What steps will reproduce the problem?+Add a box.com repository (I assume every repository type that uses gpg will fail in the same way) on a Mac.+++### What version of git-annex are you using? On what operating system?+* git-annex version 4.20130626-g2dd6f84 (from https://downloads.kitenet.net/git-annex/OSX/current/10.8.2_Mountain_Lion/)+* Mac OS 10.8.4++### Please provide any additional information below.++[[!format sh """+# If you can, paste a complete transcript of the problem occurring here.+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log++(Recording state in git...)++(encryption setup) (shared cipher) (testing WebDAV server...)+(gpg) gpg: error running `/usr/local/MacGPG2/bin/gpg-agent': probably not installed+gpg: DBG: running `/usr/local/MacGPG2/bin/gpg-agent' for testing failed: Configuration error+gpg: can't connect to the agent: IPC connect call failed+gpg: problem with the agent: No agent running+27/Jun/2013:13:41:37 +0200 [Error#yesod-core] user error (gpg ["--quiet","--trust-model","always","--batch","--passphrase-fd","21","--symmetric","--force-mdc"] exited 2) @(yesod-core-1.1.8.3:Yesod.Internal.Core ./Yesod/Internal/Core.hs:550:5)+# End of transcript or log.+"""]]++> [[done]]; I've updated the OSX autobuild to +> use a gpg that doesn't fail when gpg-agent is missing. --[[Joey]]
@@ -0,0 +1,36 @@+### Please describe the problem.++Other references:++https://github.com/basak/glacier-cli/pull/19+http://git-annex.branchable.com/special_remotes/glacier/#comment-a2b05b8dc2d640ee498d90398f02931c++#### Background++ * Glacier doesn't support keys that the client selects, unlike S3. If you upload to Glacier, Glacier assigns a unique ID, not the client.+ * Glacier does support an "archive description" which is immutable. It also provides this "archive description" in an inventory listing, together with the unique IDs.+ * An "archive description" is not a unique key. It's perfectly possible to upload multiple archives to Glacier with the same "archive description".+ * glacier-cli uses the "archive description" field as an upload identifier, since the unique IDs are unfriendly to users. However, since they are potentially ambiguous identifiers, it also supports disambiguation using the ID itself. See "Addressing Archives" in README.md for details.++#### The Problem++This what I believe is happening in the two reports referenced above. When git-annex is used without `--trust-glacier`, it can end up uploading the same data multiple times. From git-annex's point of view, it cannot verify that the data is already in Glacier, so it uploads again, expecting an overwrite operation if the key is already in Glacier. Since glacier-cli maps the key to an "archive description" that can be duplicated, this is not what happens. Instead, a second archive is uploaded.++When git-annex later does a "checkpresent" operation, glacier-cli fails. This is because the request is ambiguous, since there are two archives in Glacier with the same "key". The error message could be better here, but I believe that the behaviour is correct.++#### Discussion++glacier-cli can find out what data Glacier claims to have using an inventory retrieval. However, this retrieval takes about four hours and can be out of date (eg. if someone else recently deleted the archive from another client). Thus, I can understand git-annex's desire not to trust this data or a cache of it.++However, whatever we do, it is impossible to map an "upload or overwrite on key X" type command to Glacier. We'll always end up with duplicates. Even if git-annex stored the Glacier archive IDs, there is no API to replace an existing archive with the same ID, and inventories are out of date even before we retrieve them.++#### Workaround++If the problem is as I think it is, always applying `--trust-glacier` should prevent the problem from occurring in most cases, since git-annex will run "checkpresent" and glacier-cli will confirm that the archive exists.++To fix the problem after it has occurred, it should be sufficient to delete duplicates using glacier-cli, since they _should_ be identical to each other. Some enhancement of the `glacier-cli archive list` command would help here.++Update 10 June 2013: I've pushed a `glacier-cli` update and helper script in commit `b68835`. This adds a `--force-ids` option to `glacier archive list`, with which the helper script `glacier-list-duplicates.sh` uses to identify duplicates that can be removed. If you're affected by this issue, I suggest that you use this helper to identify and fix your problem by removing the duplicates. Please do so carefully by checking that the output of the helper is correct before you use it to delete the duplicates. See the comments at the top of the helper script for usage information.++> [[fixed|done]], at least for the only well-working case for glacier, where+> only one repository can access glacier directly. --[[Joey]]
@@ -0,0 +1,26 @@+### Please describe the problem.++In trying to install git-annex on my mac OSX Mountain Lion, the program is hanging when I open the program.++### What steps will reproduce the problem?++Open the DMG, drag the app to applications folder, double-click on the application. Web browser opens with a localhost url. The webpage says "Starting webapp..." and doesn't go anywhere. Initialization seems to fail and I need to force quit the application.++### What version of git-annex are you using? On what operating system?++I'm not totally sure (since it hangs and I can't check a version number, but since I just downloaded it now and the homepage says the latest version is "version 4.20130621" which was released 2 days and 13 hours ago, I assume that is it. ++I'm using OSX 10.8.4.+++### Please provide any additional information below.++[[!format sh """+# If you can, paste a complete transcript of the problem occurring here.+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log+++# End of transcript or log.+"""]]++> Fixed root cause. [[done]] --[[Joey]]
@@ -0,0 +1,46 @@+### Please describe the problem.+When using the git-annex webapp with the --listen paramter it as usual asks one to create a new repository on first startup. Selecting a repository location here and clicking "Make repository" button leads to a never ending loading browser and some git zombies. ++### What steps will reproduce the problem?+Two machines needed++1. On machine one: git-annex webapp --listen=\<machine1-public-ip\>:34561 (you can choose another port as well)+2. On machine two: use a browser to go to the url the last step gave you+3. Click on make repository+++### What version of git-annex are you using? On what operating system?+* git-annex version: 4.20130601+* build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP DNS+* built using cabal+* on Ubuntu 13.04 32bit+++### Please provide any additional information below.++[[!format sh """+# If you can, paste a complete transcript of the problem occurring here.+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log++[2013-06-12 21:59:37 CEST] main: starting assistant version 4.20130601+WebApp crashed: unable to bind to local socket+[2013-06-12 21:59:37 CEST] WebApp: warning WebApp crashed: unable to bind to local socket++ dbus failed; falling back to mtab polling (ClientError {clientErrorMessage = "runClient: unable to determine DBUS address", clientErrorFatal = True})++ No known network monitor available through dbus; falling back to polling+(scanning...) [2013-06-12 21:59:37 CEST] Watcher: Performing startup scan+(started...) +++# End of transcript or log.+"""]]++> The problem is that, when a port is specified, it is used for each web+> server started, and the process of making a new repository unavoidably+> requires it to start a second web server instance. This would also affect+> switching between existing repositories in the webapp. I don't see+> any way to make it not crash here, except for ignoring the port it was told+> to use when something else is already listening there. --[[Joey]] ++[[!tag /design/assistant]]
@@ -0,0 +1,125 @@+### Please describe the problem.++Direct mode repositories seem to initially ignore hard linked files and then when changes are done to them sync them as separate files. However, changes to one file are only propagated to that file and not to any of the others that are hardlinked to it.++### What steps will reproduce the problem?++Inside a direct mode repository linked to a ssh remote:++[[!format sh """+$ ls -l+total 0+$ echo "something" > foo+$ ln foo bar+$ ls -l+total 8+-rw-r--r-- 2 pedrocr pedrocr 10 May 29 12:08 bar+-rw-r--r-- 2 pedrocr pedrocr 10 May 29 12:08 foo+$ tail .git/annex/daemon.log+ 6c0fbd7..0bb8ef9 git-annex -> synced/git-annex+ 0bae1b4..bfedc45 master -> synced/master++sent 77 bytes received 31 bytes 72.00 bytes/sec+total size is 10 speedup is 0.09+[2013-05-29 12:08:03 WEST] Transferrer: Uploaded foo+Already up-to-date.+[2013-05-29 12:08:05 WEST] Pusher: Syncing with golias +To ssh://golias.git-annex/home/pedrocr/testsync+ 0bb8ef9..2ce5013 git-annex -> synced/git-annex+$ git status+# On branch master+# Changes not staged for commit:+# (use "git add <file>..." to update what will be committed)+# (use "git checkout -- <file>..." to discard changes in working directory)+#+# typechange: foo+#+# Untracked files:+# (use "git add <file>..." to include in what will be committed)+#+# bar+no changes added to commit (use "git add" and/or "git commit -a")+"""]]++On the remote repository:++[[!format sh """+$ ls -l+total 4+-rw-r--r-- 1 pedrocr pedrocr 10 May 29 12:08 foo+"""]]++If I now just touch the linked file on the repository:++[[!format sh """+$ touch bar+$ tail .git/annex/daemon.log++(merging synced/git-annex into git-annex...)+(Recording state in git...)+add bar (checksum...) [2013-05-29 12:12:49 WEST] Committer: Committing changes to git+[2013-05-29 12:12:49 WEST] Pusher: Syncing with golias +Already up-to-date.+To ssh://golias.git-annex/home/pedrocr/testsync+ 2ce5013..d36166b git-annex -> synced/git-annex+ bfedc45..ee3a7a1 master -> synced/master+Already up-to-date.+"""]]++On the remote repository:++[[!format sh """+$ ls -l+total 8+-rw-r--r-- 1 pedrocr pedrocr 10 May 29 12:08 bar+-rw-r--r-- 1 pedrocr pedrocr 10 May 29 12:08 foo+"""]]++Note that now bar has been synced as a new file and not a hardlink as it should be (the 1's after the permissions). ++The sync also isn't acting properly on the linked files. For example. ++First in the origin repository:++[[!format sh """+$ cat bar+something+$ cat foo+something+$ echo "someotherthing" > bar+$ cat bar+someotherthing+$ cat foo+someotherthing+"""]]++The result in the destination:++[[!format sh """+$ cat bar+someotherthing+$ cat foo+something+"""]]++So even if the intended behavior is for hardlinked files to be synced as two separate files the sync isn't correct because the two files changed in the origin and only one of them changed in the destination. This probably needs to be fixed with actual hard links for real filesystems and with some copying for crippled filesystems.++### What version of git-annex are you using? On what operating system?++[[!format sh """+$ git annex version+git-annex version: 4.20130516.1+build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP+local repository version: 4+default repository version: 3+supported repository versions: 3 4+upgrade supported from repository versions: 0 1 2+$ lsb_release -a+No LSB modules are available.+Distributor ID: Ubuntu+Description: Ubuntu 12.04.2 LTS+Release: 12.04+Codename: precise+"""]]++
@@ -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,11 @@+ $ wget https://downloads.kitenet.net/git-annex/linux/current/git-annex-standalone-amd64.tar.gz+ $ tar xvzf git-annex-standalone-amd64.tar.gz+ $ cd git-annex.linux+ $ ./git-annex version+ git-annex version: 4.20130324++Shouldn't that be `4.20130405`?++The md5sum of the build I downloaded is `aabbb3aa2397be206cae86f33db9eef4`.++> [[done]]; new version will look like eg `4.20130410-gc149c67` --[[Joey]]
@@ -0,0 +1,20 @@+What steps will reproduce the problem?++- rm -rf ~/.ghc/ && cabal update && cabal install git-annex --bindir=$HOME/bin++What is the expected output? What do you see instead?++- I would like to have the latest release installed++What version of git-annex are you using? On what operating system?++- git-annex-3.20121112+- Ubuntu 12.04 LTS+- The Glorious Glasgow Haskell Compilation System, version 7.4.1++Please provide any additional information below.++I use it heavily on 4 machines since a month and I really like it.++> closing since this is a cabal library problem, and not something that+> can be fixed by any change to git-annex. [[done]] --[[Joey]]
@@ -0,0 +1,37 @@+### Please describe the problem.++One of my repositories has no name:+http://screencast.com/t/3OjxFzpz++And when I try to disable it I get this error:++ Internal Server Error+ Unknown UUID++When I try to delete it I get this error:++ Internal Server Error+ unknown UUID; cannot modify++I think this was the result of adding a Local Computer Repo, and then that computer signed off. Maybe.++### What version of git-annex are you using? On what operating system?++git-annex version 4.20130601-g2b6c3f2+Mac OS 10.7.5++### Please provide any additional information below.++Maybe it's a glitch that only will happen this once, the problem is I can't get rid of it! Are there anyways of manually getting rid of a repo with uid?++> Also reported here:+> [[Missing_repo_uuid_after_local_pairing_with_older_annex]] and+> [[Internal_Server_Error_unknown_UUID;_cannot_modify]]+> and [[Local_network___40__ssh__41___fails_to_pair__47__sync]]+> and [[Internal_Server_Error:_Unknown_UUID]]+> --[[Joey]] ++[[!meta title="local pairing leads to unknown UUID"]]++> This bug is [[fixed|done]]. The webapp will detect the problem and+> provides an interface to correct it. --[[Joey]]
@@ -0,0 +1,26 @@+### Please describe the problem.+I was trying to use "Local Computer" option to sync up two machines on my local network. I was having some firewall issues and it failed on one machine.+It still created a repository without a name in the web ui and i get that Error unknown UUID when trying to edit or delete it.++### What steps will reproduce the problem?+Machine A initiates pairing. Machine B accepts pairing. Machine A has a firewall blocking outgoing connections.+Machine B times out. Machine A accepts outgoing connections for vnetd. Machine A starts syncing with Machine B.+Machine B gets files but have a broken web ui.+++### What version of git-annex are you using? On what operating system?++4.20130601-g2b6c3f2+OSX 10.7.5 on both Machine A and B++### Please provide any additional information below.++[[!format sh """+# If you can, paste a complete transcript of the problem occurring here.+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log+++# End of transcript or log.+"""]]++> [[dup|done]] of [[Internal_Server_Error:_Unknown_UUID]] --[[Joey]]
@@ -0,0 +1,25 @@+What steps will reproduce the problem?++* Start with a clean setup.+* Allow webapp to start; use it to create annex in ~/Documents/annex That works.+* Go to add remote repo. Removable drive.+* Select "/Volumes/G-DRIVE slim". Click next.++What is the expected output? What do you see instead?+Expected is something like "done". What I see is++Internal Server Error++git config [Param "annex.uuid",Param "6898F314-7817-4CD5-B1C3-588C55522A3B"] failed++What version of git-annex are you using? On what operating system?++git-annex version 3.20130107, OS X Mountain Lion. No MacPorts/homebrew/fink installed. gcc / git are installed.++Please provide any additional information below.++Maybe something to do with the drive name having spaces? "/Volumes/git-annex" worked fine.++> Good thought in the comment. I was able to reproduce the failure+> if the removable drive already had an "annex" directory that was not+> a git repo. I've made it handle this case. [[done]] --[[Joey]]
@@ -0,0 +1,19 @@+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+
@@ -0,0 +1,26 @@+I was dumping ~gigs of files of approximately 3-6megs a pop (my music collection) so I could track the files that I want to listen to when I'm on the go. I had the git watch command running from the assistant branch.++I was getting something along the lines of...++ /Users/jtang/annex/.git/annex/tmp/: openTempFile: resource exhausted (Too many open files)++and++ git-annex: createPipe: resource exhausted (Too many open files)++I also noticed that I somehow ended up with 256 ssh-agent's running on one of my machines, I'm not sure if the two issues are related or not, I had not noticed this type of behaviour up until recently.++Also this was appearing in the logs++ x00:annex jtang$ tail -f .git/annex/daemon.log+ (scanning...) Already up-to-date.+ kqueue: Too many open files++To be precise, I suspect that the kqueue limit is 256, I had 325 files in the 'queue', I ended up doing a _git annex add_ manually and all was fine.++[[!meta title="kqueue system limits"]]++> This affects BSD systems that use Kqueue. It no longer affects OSX,+> since we use FSEvents there instead. --[[Joey]] ++[[!tag /design/assistant]]
@@ -0,0 +1,25 @@+What steps will reproduce the problem?++Run the git-annex assitant, and then "sudo kill" it.++What is the expected output? What do you see instead?++I expect it to die, instead I end up with:++ 14604 ?? S 0:00.64 ga assistant+ 14623 ?? Z 0:00.00 (git)+ 14624 ?? Z 0:00.00 (git)+ 14936 ?? Z 0:00.00 (git-annex)++The only way to clear these zombies is to reboot. Perhaps there is some resource not being correctly terminated under exceptional conditions?++Note that on OpenIndiana the problem is even more severe: Aborting git-annex at the wrong time leaves behind both zombie processes and lock files which cause the machine to suddenly halt if I try to access them in any way (via mv, rsync, etc)!++What version of git-annex are you using? On what operating system?++4d1e0c9 on OS X 10.8.2.++Please provide any additional information below.++[[!meta title="strange OSX behavior when killed"]]+[[!tag /design/assistant/OSX moreinfo]]
@@ -0,0 +1,21 @@+What steps will reproduce the problem?++ $ git annex -j sync | json_reformat++What is the expected output? What do you see instead?++Expecting valid JSON, instead this happens:++ $ git annex -j sync | json_reformat+ lexical error: invalid char in json text.+ {"command":"commit","file":""# On branch master nothing to c+ (right here) ------^+ $+++What version of git-annex are you using? On what operating system?++Newest standalone (3.20121126), Linux i386. The "json_reformat" program is from the "yajl-tools" .deb package.++> [[done]]; I've updated the --json documentation to note that it only+> works with some query commands. --[[Joey]]
@@ -0,0 +1,38 @@+### Please describe the problem.++If the assistant daemon is killed, ssh mux sessions are left behind. Incidentally there may be a better way to stop the assistant daemon besides "killall git-annex" but I haven't found it in the docs.++### What steps will reproduce the problem?++[[!format sh """+$ ps aux | grep mux+$ git-annex assistant+$ date > fromwintermute # Just causing a change that needs to be pushed, any will do+$ ps aux | grep mux+pedrocr 32665 0.0 0.0 6396 948 ? Ss 11:06 0:00 ssh: /home/pedrocr/testsync/.git/annex/ssh/golias.git-annex [mux]+$ killall git-annex+$ ps aux | grep mux+pedrocr 32665 0.0 0.0 6396 948 ? Ss 11:06 0:00 ssh: /home/pedrocr/testsync/.git/annex/ssh/golias.git-annex [mux]+"""]]++### What version of git-annex are you using? On what operating system?++[[!format sh """+$ git annex version+git-annex version: 4.20130516.1+build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP+local repository version: 4+default repository version: 3+supported repository versions: 3 4+upgrade supported from repository versions: 0 1 2+$ lsb_release -a+No LSB modules are available.+Distributor ID: Ubuntu+Description: Ubuntu 12.04.2 LTS+Release: 12.04+Codename: precise+"""]]++++> [[done]] --[[Joey]]
@@ -0,0 +1,11 @@+### Please describe the problem.+I don't know how the packages at hackage are managed, but the last version there is 4.20130601 while in the mean time there have been two other releases.++### What steps will reproduce the problem?+Check [[http://hackage.haskell.org/packages/archive/git-annex/]]++> Thanks for reporting. Turns out that hackage was rejecting+> it since it doesn't know about the OS name for the hurd. Since I +> am not sure I have the right name either, I have removed those bits+> and re-uploaded.+> [[done]] --[[Joey]]
@@ -0,0 +1,50 @@+### Please describe the problem.++I have a git annex repo which cannot find the files with whereis, even though the files and contents are there. I have changed ownership of all the files. I am not sure, but I think that is when the problem was introduced. The current user that is invoking git annex owns and can access all files in the repository/annex)++Creating a new repository from scratch works just fine.+++### What steps will reproduce the problem?++ # (in my current, somehow corrupt annex)+ $ echo hello > testfile+ $ git annex add testfile+ add testfile (checksum...) ok+ (Recording state in git...)+ $ git commit -am testfile+ [master 73ed120] testfile+ 1 file changed, 1 insertion(+)+ create mode 120000 testfile+ $ git annex whereis testfile+ whereis testfile (0 copies) failed+ git-annex: whereis: 1 failed+ + + # The contents exists though+ $ ls -l testfile+ lrwxrwxrwx 1 ftp ftp 176 May 13 09:43 testfile -> .git/annex/objects/P5/4q/SHA256-s6--5891b5b522d5df086d0ff0b110fbd9d21bb4fc7163af34d08286a2e846f6be03/SHA256-s6--5891b5b522d5df086d0ff0b110fbd9d21bb4fc7163af34d08286a2e846f6be03+ $ cat .git/annex/objects/P5/4q/SHA256-s6--5891b5b522d5df086d0ff0b110fbd9d21bb4fc7163af34d08286a2e846f6be03/SHA256-s6--5891b5b522d5df086d0ff0b110fbd9d21bb4fc7163af34d08286a2e846f6be03+ hello+ $ sha256sum testfile+ 5891b5b522d5df086d0ff0b110fbd9d21bb4fc7163af34d08286a2e846f6be03 testfile+++ # the file can be found when unlocking/locking+ $ git annex unlock testfile+ unlock testfile (copying...) ok+ $ git annex lock testfile+ lock testfile ok+ (Recording state in git...)++### What version of git-annex are you using? On what operating system?+I ran Debian squeeze, with git annex 3.20120629~bpo60+2 when the problem was introduced. I just upgraded to wheezy, but the same problem exists with 3.20120629 from wheezy.++I also manually installed 4.20130501 from unstable, which also showed the same problem.+++### Please provide any additional information below.++I am not sure what information to supply, please provide pointers on what information might be useful.++> [[done]] per comment --[[Joey]]
@@ -0,0 +1,175 @@+### Please describe the problem.+I am trying to set out two computers on the same network to synchronise.++### What steps will reproduce the problem?+Install Git-Annex. Start the webapp. Try to connect. Enter a secret phrase on both. The Mythbuntu machine shows "Failed to sync with Inspiron 14z" (the laptop). The laptop shows "Pairing in progress" forever.++The machines can normally connect together passwordlessly through ssh with public key encryption. ++### What version of git-annex are you using? On what operating system?+Ubuntu Raring Version: 3.20121112ubuntu2 from the repos on my laptop. Install version 4.20130627 from the PPA on Mythbuntu Precise (which I use as a home server).++### Please provide any additional information below.+From the the laptop, where I started the pairing:+[[!format sh """+# If you can, paste a complete transcript of the problem occurring here.+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log+$ git-annex webapp ++(process:3084): GLib-CRITICAL **: g_slice_set_config: assertion `sys_page_size == 0' failed++** (firefox:3084): WARNING **: Failed to find domain member of JSON manifest+Running global cleanup code from study base classes.+(Recording state in git...)++Launching web browser on file:///tmp/webapp3075.html+(scanning...) + dbus failed; falling back to mtab polling (ClientError {clientErrorMessage = "Call failed: The name org.gtk.Private.GduVolumeMonitor was not provided by any .service files", clientErrorFatal = False})+(started...) Generating public/private rsa key pair.+Your identification has been saved in /tmp/git-annex-keygen3075.0/key.+Your public key has been saved in /tmp/git-annex-keygen3075.0/key.pub.+The key fingerprint is:+79:00:67:a4:f0:5f:62:26:78:ed:09:97:e4:c4:dd:56 aaron@Inspiron-14z+The key's randomart image is:++--[ RSA 2048]----++| . .o*. . .E |+| + X... o |+| . * X .. |+| . O * |+| S . |+| . |+| |+| |+| |++-----------------++Control socket connect(/home/shared/annex/.git/annex/ssh/mythbuntu@git-annex-mythbuntu-server.local-mythbuntu): Connection refused+Failed to connect to new control master+warning: no common commits++ Remote mythbuntuserver.local_annex does not have git-annex installed; setting remote.mythbuntuserver.local_annex.annex-ignore+Already up-to-date.+Counting objects: 13, done.+Delta compression using up to 4 threads.+Compressing objects: 100% (9/9), done.+Writing objects: 100% (11/11), 1.06 KiB, done.+Total 11 (delta 2), reused 0 (delta 0)+To ssh://mythbuntu@git-annex-mythbuntu-server.local-mythbuntu/~/annex/+ * [new branch] git-annex -> synced/git-annex+ * [new branch] master -> synced/master+Already up-to-date!+Merge made by the 'recursive' strategy.+Already up-to-date.+Already up-to-date.+Counting objects: 2, done.+Delta compression using up to 4 threads.+Compressing objects: 100% (2/2), done.+Writing objects: 100% (2/2), 326 bytes, done.+Total 2 (delta 1), reused 0 (delta 0)+To ssh://mythbuntu@git-annex-mythbuntu-server.local-mythbuntu/~/annex/+ 82bf946..dfe0bd1 master -> synced/master+Already up-to-date.+SendMessage (77594660, 0x101f, (nil), (nil))+SendMessage (0, 0x1203, (nil), 0x7fffc68a1850)+SendMessage (0, 0x1204, (nil), 0x7fffc68a1850)+SendMessage (0, 0x1203, 0x1, 0x7fffc68a1850)+SendMessage (0, 0x1204, 0x1, 0x7fffc68a1850)+SendMessage (0, 0x1203, 0x2, 0x7fffc68a1850)+SendMessage (0, 0x1204, 0x2, 0x7fffc68a1850)+SendMessage (0, 0x1203, 0x3, 0x7fffc68a1850)+SendMessage (0, 0x1204, 0x3, 0x7fffc68a1850)+SendMessage (0, 0x1203, 0x4, 0x7fffc68a1850)+SendMessage (0, 0x1204, 0x4, 0x7fffc68a1850)+SendMessage (77594660, 0x101f, (nil), (nil))+SendMessage (0, 0x1203, (nil), 0x7fffc68a1810)+SendMessage (0, 0x1204, (nil), 0x7fffc68a1810)+SendMessage (0, 0x1203, 0x1, 0x7fffc68a1810)+SendMessage (0, 0x1204, 0x1, 0x7fffc68a1810)+SendMessage (0, 0x1203, 0x2, 0x7fffc68a1810)+SendMessage (0, 0x1204, 0x2, 0x7fffc68a1810)+SendMessage (0, 0x1203, 0x3, 0x7fffc68a1810)+SendMessage (0, 0x1204, 0x3, 0x7fffc68a1810)+SendMessage (0, 0x1203, 0x4, 0x7fffc68a1810)+SendMessage (0, 0x1204, 0x4, 0x7fffc68a1810)+SendMessage (77594660, 0x101f, (nil), (nil))+SendMessage (0, 0x1203, (nil), 0x7fffc68a2920)+SendMessage (0, 0x1204, (nil), 0x7fffc68a2920)+SendMessage (0, 0x1203, 0x1, 0x7fffc68a2920)+SendMessage (0, 0x1204, 0x1, 0x7fffc68a2920)+SendMessage (0, 0x1203, 0x2, 0x7fffc68a2920)+SendMessage (0, 0x1204, 0x2, 0x7fffc68a2920)+SendMessage (0, 0x1203, 0x3, 0x7fffc68a2920)+SendMessage (0, 0x1204, 0x3, 0x7fffc68a2920)+SendMessage (0, 0x1203, 0x4, 0x7fffc68a2920)+SendMessage (0, 0x1204, 0x4, 0x7fffc68a2920)+Redirection loop trying to set HTTPS on:+ http://www.aol.com/favicon.ico+(falling back to HTTP)+SendMessage (77594652, 0x444, 0x1, 0x3652e00)+SendMessage (77594652, 0x444, 0x1, 0x3647de0)+SendMessage (77594652, 0x444, 0x1, 0x3667a80)+SendMessage (77594652, 0x444, 0x1, 0x3667a80)++# End of transcript or log.+# End of transcript or log.+"""]]++On the Mythbuntu machine:+[[!format sh """+$ git-annex webapp+Launching web browser on file:///tmp/webapp8399.html+(Recording state in git...)+"""]]++Unless I'm going mad, there doesn't seem to be a daemon.log on my laptop.++Daemon.log on the Mythbuntu machine:+[[!format sh """+[2013-07-14 10:38:56 BST] main: starting assistant version 4.20130627+(scanning...) [2013-07-14 10:38:56 BST] Watcher: Performing startup scan+(started...) [2013-07-14 10:38:57 BST] PairListener: aaron@Inspiron-14z:/home/shared/annex is sending a pair request.+Generating public/private rsa key pair.+Your identification has been saved in /tmp/git-annex-keygen.0/key.+Your public key has been saved in /tmp/git-annex-keygen.0/key.pub.+The key fingerprint is:+bb:8c:66:05:22:8e:fa:e1:10:33:6d:cb:d6:57:e2:47 mythbuntu@mythbuntu-server+The key's randomart image is:++--[ RSA 2048]----++| |+| |+| |+| .. . . |+|+oo. ...E |+|.*.o . +.. |+|o = . o.o |+|.+ . .o+ . |+| .o o. o |++-----------------++[2013-07-14 10:39:13 BST] main: Pairing with aaron@Inspiron-14z:/home/shared/annex in progress+ssh: connect to host Inspiron-14z.local port 22: Connection refused+ssh: connect to host Inspiron-14z.local port 22: Connection refused+fatal: The remote end hung up unexpectedly+[2013-07-14 10:39:17 BST] PairListener: Syncing with Inspiron14z.local__home_shared_annex +ssh: connect to host Inspiron-14z.local port 22: Connection refused+fatal: The remote end hung up unexpectedly+ssh: connect to host Inspiron-14z.local port 22: Connection refused+fatal: The remote end hung up unexpectedly+ssh: connect to host Inspiron-14z.local port 22: Connection refused+fatal: The remote end hung up unexpectedly+Already up-to-date.+Already up-to-date.+ssh: connect to host Inspiron-14z.local port 22: Connection refused+fatal: The remote end hung up unexpectedly+ssh: connect to host Inspiron-14z.local port 22: Connection refused+fatal: The remote end hung up unexpectedly+Updating 82bf946..dfe0bd1+Fast-forward+[2013-07-14 10:39:56 BST] Pusher: Syncing with Inspiron14z.local__home_shared_annex +ssh: connect to host Inspiron-14z.local port 22: Connection refused+fatal: The remote end hung up unexpectedly+ssh: connect to host Inspiron-14z.local port 22: Connection refused+fatal: The remote end hung up unexpectedly+ssh: connect to host Inspiron-14z.local port 22: Connection refused+fatal: The remote end hung up unexpectedly+ssh: connect to host Inspiron-14z.local port 22: Connection refused+fatal: The remote end hung up unexpectedly+"""]]
@@ -0,0 +1,18 @@+What steps will reproduce the problem?++Attempting to pair between a local repository and a repository on a remote computer on my LAN. Pairing is initiated from my local machine and I'm interacting with the webapp on the remote machine via firefox running over an ssh -X connection. Pairing appears to work up to a point: I enter the secret at one end, the pairing request shows up at the other end. I then enter the secret at that end.++What is the expected output? What do you see instead?++Pairing should complete successfully. Instead I get the error message "PairListener crashed: bad comment in public key", followed by the public key. The pairing process then does not move beyond the 'awaiting pairing' pages.++What version of git-annex are you using? On what operating system?++Local Machine: 3.20121127, Debian Wheezy/Sid (the only package from unstable is git-annex).+Remote Machine: 3.20121113, Arch Linux (I installed the version from: https://aur.archlinux.org/packages/git-annex-bin/, which is supposedly the same as above, but reports the version specified here).++Please provide any additional information below.++None as yet. Let me know if there are any log files, etc. that I can post.++> So it was the period in the hostname! [[fixed|done]] --[[Joey]]
@@ -0,0 +1,59 @@+Somehow I've lost my S3 remote... git-annex knows it's there, but its not associating it with the git remote in .git/config++ $ git-annex whereis pebuilder.iso + whereis pebuilder.iso (3 copies) + 3b6fc6f6-3025-11e1-b496-33bffbc0f3ed -- housebackup (external seagate drive on /mnt/back/RemoteStore)+ 6b1326d8-2abb-11e1-8f43-979159a7f900 -- synology+ 9b297772-2ab2-11e1-a86f-2fd669cb2417 -- Amazon S3+ ok++Amazon S3 is the description from the remote. My .git/config file contains this block:++ [remote "cloud"]+ annex-s3 = true+ annex-uuid = 9b297772-2ab2-11e1-a86f-2fd669cb2417+ annex-cost = 70++The UUID matches... But I cannot access it... see below:++ [39532:39531 - 0:626] 08:20:38 [vivitron@tronlap:o +3] ~/annex/ISO + $ git-annex get pebuilder.iso --from=cloud+ git-annex: there is no git remote named "cloud"+ + [39532:39531 - 0:627] 08:20:56 [vivitron@tronlap:o +3] ~/annex/ISO + $ git-annex get pebuilder.iso --from="Amazon S3"+ git-annex: there is no git remote named "Amazon S3"+ + [39532:39531 - 0:628] 08:21:01 [vivitron@tronlap:o +3] ~/annex/ISO + $ git-annex get pebuilder.iso --from=9b297772-2ab2-11e1-a86f-2fd669cb2417+ git-annex: there is no git remote named "9b297772-2ab2-11e1-a86f-2fd669cb2417"++ [39532:39531 - 0:629] 08:21:08 [vivitron@tronlap:o +3] ~/annex/ISO + $ ++git remote lists "cloud" as a remote:++ $ git remote+ all+ cloud+ cs+ es3+ origin++git-annex status lists S3 support:++ $ git-annex status+ supported backends: SHA256 SHA1 SHA512 SHA224 SHA384 SHA256E SHA1E SHA512E SHA224E SHA384E WORM URL+ supported remote types: git S3 bup directory rsync web hook++++I appreciate any help.... I've tested versions 3.20111211, 3.20111231, and 3.20120105++ $ git --version+ git version 1.7.8.1++++> [[done]]; I've fixed the build system so this confusing thing cannot+> happen anymore. --[[Joey]]
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="http://joey.kitenet.net/"+ nickname="joey"+ subject="comment 1"+ date="2012-01-06T03:04:35Z"+ content="""+Despite `status` listing S3 support, your git-annex is actually built with S3stub, probably because it failed to find the necessary S3 module at build time. Rebuild git-annex and watch closely, you'll see \"** building without S3 support\". Look above that for the error and fix it.++It was certianly a bug that it showed S3 as supported when built without it. I've fixed that.+"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://joey.kitenet.net/"+ nickname="joey"+ subject="comment 2"+ date="2012-01-06T03:08:28Z"+ content="""+BTW, you'll want to \"make clean\", since the S3stub hack symlinks a file into place and it will continue building with S3stub even if you fix the problem until you clean.+"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawkey8WuXUh_x5JC2c9_it1CYRnVTgdGu1M"+ nickname="Dustin"+ subject="Thank you!"+ date="2012-01-06T03:38:27Z"+ content="""+make clean and rebuild worked... Thank you+"""]]
@@ -0,0 +1,47 @@+<pre>+From e45c73e66fc18d27bdf5797876fbeb07786a4af1 Mon Sep 17 00:00:00 2001+From: Jimmy Tang <jtang@tchpc.tcd.ie>+Date: Tue, 22 Mar 2011 22:24:07 +0000+Subject: [PATCH] Touch up Makefile to depend on StatFS.hs++---+ Makefile | 2 +-+ 1 files changed, 1 insertions(+), 1 deletions(-)++diff --git a/Makefile b/Makefile+index 08e2f59..4ae8392 100644+--- a/Makefile++++ b/Makefile+@@ -15,7 +15,7 @@ SysConfig.hs: configure.hs TestConfig.hs+ hsc2hs $<+ perl -i -pe 's/^{-# INCLUDE.*//' $@+ +-$(bins): SysConfig.hs Touch.hs++$(bins): SysConfig.hs Touch.hs StatFS.hs+ $(GHCMAKE) $@+ + git-annex.1: doc/git-annex.mdwn+-- +1.7.4.1++</pre>+++StatFS.hs never gets depended on and compiled, the makefile was just missing something++> Thanks, [[done]]! Interested to hear if StatFS.hs works on OSX (no warning) or+> is a no-op (with warning). --[[Joey]] ++>> +>> for now it gives a warning, it looks like it should be easy enough to add OSX+>> support, I guess it's a case of just digging around documentation to find the equivalent+>> calls/headers. I'll give it a go at making this feature work on OSX and get back to you.+>> ++<pre>+jtang@exia:~/develop/git-annex $ make+hsc2hs StatFS.hsc+StatFS.hsc:85:2: warning: #warning free space checking code not available for this OS+StatFS.hsc:85:2: warning: #warning free space checking code not available for this OS+StatFS.hsc:85:2: warning: #warning free space checking code not available for this OS+</pre>
@@ -0,0 +1,89 @@+### Please describe the problem.++The `manual` content mode doesn't follow the description provided in the help page, instead it seems to collect content.++### What steps will reproduce the problem?++1. Create a new git annex repository using the webapp, set the content type to `client`.+2. Create another repository, and set the content type to `manual`.+3. Copy something into the `client` repository.+4. It will be pushed/pulled into the `manual` repository.++### What version of git-annex are you using? On what operating system?++ git-annex version: 4.20130521-g25dba9d+ Ubuntu 13.04 x64.++### Please provide any additional information below.++I have also noticed very weird behaviour that I have been unable to replicate in testing, but I will describe the setup that it currently happens in:+I have 3x repositories, one a `client` repository, and the other two are set to `manual`. When put a new file into the `client` repository, it is pushed onto the two `manual` repositories. When these repositories have received it, the client drops the file and re-downloads it from one of the `manual` repositories. Once it's been pushed, deleted, and pulled, everything is happy... but the extra step makes no difference.++[[!format sh """+[2013-05-22 20:41:44 EST] main: starting assistant version 4.20130521-g25dba9d+[2013-05-22 20:41:44 EST] TransferScanner: Syncing with test3, test2 +Already up-to-date.++(scanning...) [2013-05-22 20:41:44 EST] Watcher: Performing startup scan+Already up-to-date.+Already up-to-date.+++(started...) From /home/valorin/workspace/tmp/test3+ f285dc2..406c20c git-annex -> test3/git-annex+ cdf2ad3..508983c master -> test3/master+From /home/valorin/workspace/tmp/test2+ 1e04829..1c03533 git-annex -> test2/git-annex+ 8ad4bd3..18a5408 master -> test2/master+Updating 508983c..18a5408+Fast-forward+Already up-to-date.+To /home/valorin/workspace/tmp/test2+ 4e49293..a66ce5d git-annex -> synced/git-annex+ 508983c..18a5408 master -> synced/master+To /home/valorin/workspace/tmp/test3+ 4e49293..a66ce5d git-annex -> synced/git-annex+ 508983c..18a5408 master -> synced/master+Already up-to-date.+Already up-to-date.+[2013-05-22 20:42:07 EST] Committer: Adding Firefly S..acked.m4v++(merging test3/git-annex into git-annex...)+(merging test2/git-annex into git-annex...)+(Recording state in git...)+++++add Firefly S01E03 Bushwhacked.m4v (checksum...) [2013-05-22 20:42:15 EST] Committer: Committing changes to git+[2013-05-22 20:42:15 EST] Pusher: Syncing with test3, test2 +Already up-to-date.+To /home/valorin/workspace/tmp/test2+ a66ce5d..a6773dd git-annex -> synced/git-annex+ 18a5408..f9e7692 master -> synced/master+To /home/valorin/workspace/tmp/test3+ a66ce5d..a6773dd git-annex -> synced/git-annex+ 18a5408..f9e7692 master -> synced/master+Already up-to-date.+Already up-to-date.+[2013-05-22 20:42:26 EST] Transferrer: Uploaded Firefly S..acked.m4v+[2013-05-22 20:42:26 EST] Pusher: Syncing with test3, test2 +To /home/valorin/workspace/tmp/test3+ a6773dd..c35f992 git-annex -> synced/git-annex+To /home/valorin/workspace/tmp/test2+ a6773dd..c35f992 git-annex -> synced/git-annex+[2013-05-22 20:42:35 EST] Transferrer: Uploaded Firefly S..acked.m4v+[2013-05-22 20:42:35 EST] Pusher: Syncing with test3, test2 +To /home/valorin/workspace/tmp/test3+ c35f992..9e47813 git-annex -> synced/git-annex+To /home/valorin/workspace/tmp/test2+ c35f992..9e47813 git-annex -> synced/git-annex+[2013-05-22 20:42:44 EST] Pusher: Syncing with test3, test2 +Everything up-to-date+Everything up-to-date+"""]]++> It turns out there was a bug in the preferred content expression parser,+> that made it parse the expression for manual mode (but I think no other standard+> expression) quite wrong, as if it had parens in the wrong place. This explains+> the broken behavior. [[fixed|done]] --[[Joey]]
@@ -0,0 +1,37 @@+### Please describe the problem.++I have an annex which contains all my photos. There are repositories on my laptop and my home server as well as an s3 backup (for which syncing is currently disabled). I switched the copy on my laptop to manual mode via 'git annex vicfg' (this correctly shows up in the webapp). I then proceeded to drop several folders (each containing a year's worth of photos). This works fine, however the assistant immediately starts downloading the dropped files from the server! Numcopies is set to 1 and the problem exists with the server in both the 'transfer' and 'backup' groups (haven't tried others).++### What steps will reproduce the problem?++1. Create a repo with some files.+2. Create a bare-git remote on another machine.+3. Make sure the assistant is running for the repo in question. +4. Switch your local copy to manual mode.+5. Drop some files.+6. Watch as the assistant re-downloads them!++### What version of git-annex are you using? On what operating system?++git-annex version: 4.20130501+local repository version: unknown+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++Debian Testing/Sid.++### Please provide any additional information below.++If it's relevant I switched the local repository to indirect mode by manually shutting down the assistant and running 'git annex indirect' before restarting the assistant. This was done before any of the steps above.++[[!format sh """+# If you can, paste a complete transcript of the problem occurring here.+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log+++# End of transcript or log.+"""]]++> [[done]] --[[Joey]]
@@ -0,0 +1,31 @@+### Please describe the problem.+I paired my repo running on Gentoo (git-annex 4.20130601) with Ubuntu 13.04 (git-annex 3.10121112ubuntu4). The repo on Ubuntu doesn't have uuid for the Gentoo remote, so:++- There is no name in assistan's repo settings for it++- Trying to access its settings gives Internal server error: Unknown UUID+15/Jun/2013:12:39:10 +0300 [Error#yesod-core] Unknown UUID @(yesod-core-1.1.8.3:Yesod.Internal.Core ./Yesod/Internal/Core.hs:550:5)++- In dashboard on Ubuntu all changes stay queued forever (although the syncing seems to work)++### What steps will reproduce the problem?+Pair local computers with different annex versions.++### What version of git-annex are you using? On what operating system?+Gentoo (git-annex 4.20130601)+Ubuntu 13.04 (git-annex 3.10121112ubuntu4)++### Please provide any additional information below.++[[!format sh """+# If you can, paste a complete transcript of the problem occurring here.+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log+++# End of transcript or log.+"""]]++> Others are reporting what seems to be the same problem here:+> [[Internal_Server_Error:_Unknown_UUID]].+> +> [[dup|done]] --[[Joey]]
@@ -0,0 +1,15 @@+Running the 'assistant' branch, I occassionally get++To myhost1:/Users/jtang/annex+ ! [rejected] master -> synced/master (non-fast-forward)+error: failed to push some refs to 'myhost1:/Users/jtang/annex'+hint: Updates were rejected because a pushed branch tip is behind its remote+hint: counterpart. Check out this branch and merge the remote changes+hint: (e.g. 'git pull') before pushing again.+hint: See the 'Note about fast-forwards' in 'git push --help' for details.+(Recording state in git...)++manually running a 'git annex sync' usually fixes it, I guess once the sync command runs periodically this problem will go away, is this even OSX specific? I don't quite get the behaviour that is described in [[design/assistant/blog/day_15__its_aliiive]].++> With my changes today, I've seen it successfully recover from this+> situation. [[done]] --[[Joey]]
@@ -0,0 +1,36 @@+Version 3.20120825 built on my OpenIndiana system just fine, but the latest release gives me this during setup:++ Linking /tmp/git-annex-3.20121017-13013/git-annex-3.20121017/dist/setup/setup ...+ checking version... 3.20121017+ checking git... yes+ checking git version... 1.7.8.2+ checking cp -a... yes+ checking cp -p... yes+ checking cp --reflink=auto... yes+ checking uuid generator... uuid -m+ checking xargs -0... yes+ checking rsync... yes+ checking curl... yes+ checking wget... yes+ checking bup... no+ checking gpg... no+ checking lsof... no+ checking ssh connection caching... yes+ checking sha1... sha1sum+ checking sha256... sha256sum+ checking sha512... sha512sum+ checking sha224... sha224sum+ checking sha384... sha384sum+ Configuring git-annex-3.20121017...+ Building git-annex-3.20121017...+ Preprocessing executable 'git-annex' for git-annex-3.20121017...+ In file included from Mounts.hsc:25:0:+ Utility/libmounts.h:13:3: warning: #warning mounts listing code not available for this OS [-Wcpp]++ Utility/libkqueue.c:13:23:+ fatal error: sys/event.h: No such file or directory+ compilation terminated.++Is it possible to remove the new requirement? Thanks!++> [[done]] --[[Joey]]
@@ -0,0 +1,31 @@+I can create an annex remote named 'test:/test'. git itself does not allow colons in names, though. The name scheme for an annex should be the same as for git repos themselves.++> What do you mean by "an annex remote"? git-annex uses the same+> remotes configuration as does git. If you put invalid+> stuff in .git/config it might handle it slightly different than +> git, I don't know. Examples needed. --[[Joey]] ++>> What I mean is this:++ % cd 1+ % git init+ % git annex init "my:colon"+ % [...]+ % cd ../2+ % git init+ % git annex init "second"+ % git remote add "my:colon" ../1+ fatal: 'my:colon' is not a valid remote name++>> -- RichiH++>>> I see.. Git annex init does not specifiy a remote's name, it specifies+>>> an arbitrary human-readable description of the repository, which will+>>> be displayed when there is no configured remote corresponding to the+>>> repository. So this is not a bug unless some documentation of that is+>>> unclear. --[[Joey]] ++>>>> Nobody spoke up to say it's unclear, so closing as PEBKAC :)+>>>> [[done]] --[[Joey]] ++>>>>> I still think git-annex should follow the same rules as git in this regard, but if your design decision is different, I won't try to argue the point :) -- RichiH
@@ -0,0 +1,37 @@+What steps will reproduce the problem?++Install git-annex via cabal - either from Hackage or as a manual install. (i.e. <http://git-annex.branchable.com/install/cabal/>)++What is the expected output? What do you see instead?++Expect a clean install.++However, get the following error:++ Configuring gnuidn-0.2...+ cabal: The program c2hs is required but it could not be found.+ Failed to install gnuidn-0.2+ cabal: Error: some packages failed to install:+ git-annex-3.20121127 depends on gnuidn-0.2 which failed to install.+ gnuidn-0.2 failed during the configure step. The exception was:+ ExitFailure 1+ network-protocol-xmpp-0.4.4 depends on gnuidn-0.2 which failed to install.++What version of git-annex are you using? On what operating system?++git-annex: 3.20121127 (and previous versions)++OS: Mac OSX 10.6.8+++Please provide any additional information below.++The fix seems as easy as++ cabal install c2hs++Should c2hs be included as a dep got git-annex or is this a bug in gnuidn?++> Apparently cabal does not support automatically installing programs+> needed for the build. I've updated the cabal installation instructions+> to document the need to install c2hs. [[done]] --[[Joey]]
@@ -0,0 +1,12 @@+My local git index got corrupted and I needed to clone and annex get all data from my main repo.++Some files were never copied anywhere so I am stuck with symlinks to nowhere.++I tried to copy over the symlink with a copy of the actual file, which did not work. Trying to unlock, copying over the symlink, and relock did not work, either.++Then, I copied the annex object to the correct place in .git/annex/objects/..., set all modes, re-ran fsck and the file re-appeared.+++Long story short, I think there should be a `git annex reinject $file` or similar which will take a file, either one replacing the symlink or with an arbitrary path, and put it into the correct place in the object store. Called normally, it should reject all reinjects where the checksum does not match. With --force, this should be overridden. For reasons of safety, WORM should always require --force.++> [[closing|done]], seems addressed --[[Joey]]
@@ -0,0 +1,26 @@+## What steps will reproduce the problem?++Add new data to a repository with an S3 special remote. Monitor the repository with the web app.+++## What is the expected output? What do you see instead?++I expect a changing status bar and percentage. Instead I see no changes when an upload becomes active.+++## What version of git-annex are you using? On what operating system?++3.20130102 on Arch 64-bit.+++## Please provide any additional information below.+++When uploading local data to an S3 remote, I see no progress bars. The progress bar area on active uploads stays the same grey as the bar on queued uploads. The status does not change from "0% of...". The uploads are completing, but this makes it very difficult to judge their activity.++The only remotes I currently have setup are S3 special remotes, so I cannot say whether progress bars are working for uploads to other remote types.++> [[done]], this turned out to be a confusion in the progress code;+> parts were expecting a full number of bytes since the start, while+> other parts were sending the number of bytes in a chunk. Result was+> progress bars stuck at 0% often. --[[Joey]]
@@ -0,0 +1,18 @@+git-annex does not listen to -v, --version or version.++At the very least, it should return both the version of the binary and the version of the object store it supports.+If it supports several annex versions, they should be listed in a comma-separated fashion.+If git-annex is called from within an annex, it should print the version of the local object store.++Sample:++ % git annex version+ git-annex version : 0.24+ default object store version : 3+ supported object store versions : 2,3+ local object store version : 2+ % ++The above might look like overkill, but it's in a form that will, most likely, never need to be extended.++> Great idea, [[done]] --[[Joey]]
@@ -0,0 +1,37 @@+What steps will reproduce the problem?++Use assistant and create repository the a folder in home dir.+Use textedit and save a new txt to the repository folder. ++What is the expected output? What do you see instead?++The alias solution is broken. It should work more like Dropbox.+Textedit saves the file initially, but it is immediately locked.+Since it autosaves, it asks to unlock or duplicate.+Then gives the error:+"The file “Untitled 16.txt” cannot be unlocked."++If the file exists:+The document “Untitled 14” could not be saved as “Untitled 14.txt”. You don’t have permission.++If you open a file from the repository (now replaced by a symlink) with textedit, there are other problems:+- The filename will not be correct (will show the sha hash). +- It will ask to unlock, then give the error "You don’t have permission to write to the folder that the file “SHA256E-s8--8985d9832de2e28b5e1af64258c391a34d7528709ef916bac496e698c139020c.txt” is in."++What version of git-annex are you using? On what operating system?++OSX Lion+git-annex version: 3.20120924++Please provide any additional information below.++Even if you fix these problems, automatic versioning in lion will probably don't work, and the symlinks seem a hackish solution and don't seem intuitive or easy to the end user. +The sync should be transparent but it's not, and it's error prone. It would even be best to keep file copies in the git repo and sync them with the original folder than make symlinks.++Dropbox even allows to put a symlink in the dropbox directory, and it will sync the file. ++[[!tag /design/assistant/OSX]]++> Now the assistant creates new repositories using direct mode on OSX.+> In direct mode, there is no locking of files; they can be modified+> directly. [[done]] --[[Joey]]
@@ -0,0 +1,6 @@+This is a collection of problem reports for the standalone OSX app.+If you have a problem using it, post it here. --[[Joey]] ++(Some things that should be fixed now have been moved to [[old]].)++[[!tag /design/assistant/OSX]]
@@ -0,0 +1,11 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="4.154.3.194"+ subject="comment 10"+ date="2013-01-19T16:13:20Z"+ content="""+The app uses the version of git included in it, because using the system's installed version if there is one is likely to run into other version incompatabilities. ++You can either install git-annex using cabal and homebrew, as documented, or you could go in and delete+all the git programs out of the app, and then it'd use the system's git stuff instead.+"""]]
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ nickname="joey"+ subject="comment 10"+ date="2013-04-16T17:14:13Z"+ content="""+@Jeremy, it's been a long time since anyone reported having the \"LSOpenURLsWithRole()\". It seemed to go away when the dmg was fixed to include all the necessary libraries. So my guess is you installed it wrong, somehow, and perhaps it's not finding those libraries that are part of the dmg.++You should be able to start the assistant by running it directly from the dmg.+"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawlkAghrKEvslMcV2INKUhtPPMsfnzQyyd8"+ nickname="Jeremy"+ subject="comment 11"+ date="2013-04-17T02:02:00Z"+ content="""+@joey, figured it out. There was a program added to the startup list, presumably from when I ran things from the dmg a while ago. Once I delete that, it started fine. Of course, I forgot to write down the name of the program... I remember it had an LW in the name.+"""]]
@@ -0,0 +1,26 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawlYy4BrJyV1PdfqzevCVziXRp89iUH6Xzw"+ nickname="Christopher"+ subject="Code signing errors in log on starting git-annex.app"+ date="2013-01-19T22:30:32Z"+ content="""+When I run via the App and set up a fresh repo, i get some Console.app spam (looks like one per file added to the repo dir... or maybe one per git command?):++ 2013-01-19 2:44:55.000 PM kernel[0]: CODE SIGNING: cs_invalid_page(0x1008b4000): p=73995[git] clearing CS_VALID+ 2013-01-19 2:44:55.000 PM kernel[0]: CODE SIGNING: cs_invalid_page(0x10f99e000): p=73996[git] clearing CS_VALID+ 2013-01-19 2:44:55.000 PM kernel[0]: CODE SIGNING: cs_invalid_page(0x102b44000): p=73997[git] clearing CS_VALID+ 2013-01-19 2:44:55.000 PM kernel[0]: CODE SIGNING: cs_invalid_page(0x1029f4000): p=73998[git] clearing CS_VALID+ ...++and nothing seems to work. The page address and the pid increment steadily with each line. I'm using 10.8.2 (12C60) on a Mac Pro, and grabbed:++ /git-annex/OSX/current/10.8.2_Mountain_Lion/git-annex.dmg.bz2 ++(published 14-Jan-2013 15:19)++It seems to be a code signing issue, perhaps with the vendored git binaries. While things are sort-of working, the web app shows the files flying by really fast. ++Using a fresh repo via `git annex webapp` works great (I built that after much teeth-knashing, brew install/link cycles, and then cabal install git-annex). ++I am very excited for this to work, this is exactly what I've been waiting for to replace dropbox. Came very close to writing it myself a few times (and in Haskell no less!!). +"""]]
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawkCw26IdxXXPBoLcZsQFslM67OJSJynb1w"+ nickname="Alexander"+ subject="standalone app dmg won't open in OSX 10.8.3"+ date="2013-04-29T18:05:54Z"+ content="""+I downloaded the app build from [http://downloads.kitenet.net/git-annex/OSX/current/10.8.2_Mountain_Lion/](http://downloads.kitenet.net/git-annex/OSX/current/10.8.2_Mountain_Lion/) and unpacked it, but the .dmg won't open. I can run other dmg's successfully. ++Trying to install git-annex via cabal on the same machine led to this issue: [http://git-annex.branchable.com/tips/Building_git-annex_on_Debian_OR___37____164____35____34____164____37____38____34____35___Haskell__33__/#comment-7cc94df1bf9a75a6d03369f3897d6816](http://git-annex.branchable.com/tips/Building_git-annex_on_Debian_OR___37____164____35____34____164____37____38____34____35___Haskell__33__/#comment-7cc94df1bf9a75a6d03369f3897d6816)+"""]]
@@ -0,0 +1,11 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawmYiJgOvC4IDYkr2KIjMlfVD9r_1Sij_jY"+ nickname="Douglas"+ subject="Error creating remote repository using ssh on OSX"+ date="2013-01-25T13:18:40Z"+ content="""+There is an issue with creating remote repositories using ssh (the problem may require using a different account name.) I filed the following bug:+++<http://git-annex.branchable.com/bugs/Error_creating_remote_repository_using_ssh_on_OSX/>+"""]]
@@ -0,0 +1,18 @@+[[!comment format=mdwn+ username="John"+ ip="109.242.130.160"+ subject="runshell typo prevents execution"+ date="2013-09-22T00:24:10Z"+ content="""+Using the latest Mountain Lion build available.++>$ /Applications/git-annex.app/Contents/MacOS/git-annex++>/Applications/git-annex.app/Contents/MacOS/runshell: line 25: syntax error near unexpected token `&'++Line 25:+>echo \"** runshell loop detected!\"> &2++Fix (obvious but for the sake of completeness):+>echo \"** runshell loop detected!\" >&2+"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="4.154.1.250"+ subject="comment 14"+ date="2013-09-22T14:15:28Z"+ content="""+I have fixed the runshell typo and updated the builds.+"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="gueux"+ ip="2a01:240:fe6d:0:8947:cf55:f955:49b9"+ subject="same typo on Lion build"+ date="2013-10-23T09:17:58Z"+ content="""+Could you please fix this typo on the Lion build?+"""]]
@@ -0,0 +1,16 @@+[[!comment format=mdwn+ username="Remy"+ ip="83.87.21.84"+ subject="Crashes on OSX 10.9"+ date="2013-10-23T20:30:12Z"+ content="""+I just installed OSX Mavericks. I also took the latest autobuild and copied it over the old git-annex.app to be sure it doesn't work.+When I execute \"git-annex status\" I get the following message+++> dyld: Symbol not found: _objc_debug_taggedpointer_mask+> Referenced from: /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation+> Expected in: /Applications/git-annex.app/Contents/MacOS/bundle/I+> in /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation+> [1] 1361 trace trap git-annex status+"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawkN91jAhoesnVI9TtWANaBPaYjd1V9Pag8"+ nickname="Benjamin"+ subject="Package for older OS X"+ date="2012-11-17T12:36:45Z"+ content="""+Is there an option to provide application bundle for older versions of OS X? The last time I tried the bundle wouldn't work under 10.5. If no specific features from newer OS X versions are required, it could be enough to add a simple switch when building.+"""]]
@@ -0,0 +1,15 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawkurjhi0CRJvgm7QNaZDWS9hitBtavqIpc"+ nickname="Bret"+ subject="git-annex.app Not working on 32 bit machines"+ date="2012-11-03T19:18:47Z"+ content="""+I tried running the git-annex.app on my Core Duo Macbook pro, and it does not run at all. I get an error on my system.log++`Nov 3 12:13:26 Bret-Mac [0x0-0x15015].com.branchable.git-annex[155]: /Applications/git-annex.app/Contents/MacOS/runshell: line 52: /Applications/git-annex.app/Contents/MacOS/bin/git-annex: Bad CPU type in executable+Nov 3 12:13:26 Bret-Mac com.apple.launchd.peruser.501[92] ([0x0-0x15015].com.branchable.git-annex[155]): Exited with exit code: 1`++It works on my 64 bit machine, and this has become quite the problem for a while now, where people with newer macs dont compile back for a 32bit machine. ++Is there any hope for a pre-compiled binary that works on a 32 bit machine?+"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawkSq2FDpK2n66QRUxtqqdbyDuwgbQmUWus"+ nickname="Jimmy"+ subject="comment 8"+ date="2012-11-07T16:08:00Z"+ content="""+I've been updating my haskell platform install recently, i used to try and get the builder to spit out 32/64bit binaries, but recently it's just become too messy, I've just migrated to a full 64bit build system. I'm afraid I won't be able to provide 32bit builds any more.+"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawmOsimKUgz6rxpmsS_nrBQGavEYyUpDlsE"+ nickname="Tim"+ subject="OS X 10.8.2"+ date="2013-01-11T00:07:54Z"+ content="""+Double click on the app, give permission for it to run and ... nothing+"""]]
@@ -0,0 +1,17 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawmRFKwny4rArBaz-36xTcsJYqKIgdDaw5Q"+ nickname="Andrew"+ subject="Prefer the system/path git binaries if they're a newer version"+ date="2013-01-19T06:20:38Z"+ content="""+I have used homebrew to install git v1.8.0.2 but git-annex.app packages git v1.7.10.2. git 1.7 crashes due to some newer directives in my global git config.++ error: Malformed value for push.default: simple+ error: Must be one of nothing, matching, tracking or current.+ fatal: bad config file line 38 in /Users/akraut/.gitconfig+ + git-annex: fd:13: hGetLine: end of file+ failed+ git-annex: webapp: 1 failed++"""]]
@@ -0,0 +1,18 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawlkAghrKEvslMcV2INKUhtPPMsfnzQyyd8"+ nickname="Jeremy"+ subject="Unable to start assistant"+ date="2013-04-16T01:07:05Z"+ content="""+I got the git-annex assistant to work once a long time ago when I ran it the first time directly from the dmg. Ever since then (i.e., after putting it in my applications folder) I have never gotten it to run. Wondering if anyone else has experienced this?++I am running OSX 10.7.5 and just pulled the latest app (05-Apr-2013 10:17).++For reference, when I try to kick off the the assistant from the command line I get the error:++ $ open /Applications/git-annex.app+ LSOpenURLsWithRole() failed with error -10810 for the file /Applications/git-annex.app.++I am wondering if there is some sort of file or modification that was made when I accidently kicked it off initially from the dmg, if so any thoughts on what to clear / change?++"""]]
@@ -0,0 +1,1 @@+These issues should be fixed now.
@@ -0,0 +1,26 @@+**What steps will reproduce the problem?**++Either double click on the app or from the terminal++ $ open /Applications/git-annex.app++**What is the expected output? What do you see instead?**++I'd expect to see git-annex run. "git-annex" doesn't run and what I see (in the terminal) is:++ LSOpenURLsWithRole() failed with error -10810 for the file /Applications/git-annex.app.++**What version of git-annex are you using? On what operating system?**++*git-annex*: 3.20121017++*git-annex.app*: ???++*OS*: OSX 10.6.8 64 bit+++**Please provide any additional information below.**++[[!tag /design/assistant/OSX]]++> This was fixed a while ago. [[done]] --[[Joey]]
@@ -0,0 +1,31 @@+### Please describe the problem.++If the assistant is not running, I can successfully open the git-annex application, which will trigger my browser to open a new tab with the assistant interface.++However, once that has been done one time, there appears to be no way to get back to the assistant if the tab is closed. Attempting to open the application again while the assistant is running in the background results in nothing happening at all. ++### What steps will reproduce the problem?++1. Open git-annex.app+2. See assistant and then close the browser tab+3. Open git-annex.app again+4. Nothing happens++### What version of git-annex are you using? On what operating system?++Version 4.20130723-ge023649 on OS X 10.8.4.++### Please provide any additional information below.++From .git/annex/daemon.log:++[[!format sh """+[2013-07-28 00:01:08 CDT] main: starting assistant version 4.20130723-ge023649++(scanning...) [2013-07-28 00:01:08 CDT] Watcher: Performing startup scan+(started...)+"""]]++> [[done]]; I added the `&` to git-annex-shell.+> Hopefully that does not cause any other unwanted behavior..+> --[[Joey]]
@@ -0,0 +1,9 @@+I had created a test repository a time ago with an old version of git-annex. I didn't really used it so I simply deleted the directory by hand. Now I've installed a new version of git-annex and the old repository stills appears on the webapp, but there is no interface to delete it.++* Old git-annex version: don't remember +* New git-annex version: I downloaded 3.20130107 (twice to be sure), but for some reason 'git-annex version' reports 3.20130102+* OS: Ubuntu 12.04.1 LTS 3.2.0-35-generic-pae #55-Ubuntu SMP Wed Dec 5 18:04:39 UTC 2012 i686 i686 i386 GNU/Linux++> This is [[fixed|done]] in git; assuming the repo was showing up+> in the upper-right menu for switching amoung local repositories.+> --[[Joey]]
@@ -0,0 +1,67 @@+### Please describe the problem.+On Windows, with a remote repository configured for HTTP access, wget is never used, even if it's available in the system. curl is always used.++### What steps will reproduce the problem?+1. Set up an annex on a remote system, configure it for HTTP access, run an HTTP server.+2. over HTTP, clone it to Windows+3. "annex get -vd <file>"+4. note that curl is used.+++### What version of git-annex are you using? On what operating system?+Windows 7: 4.20140627-g8a36ec5 (from the git-annex download page)++### Additional Info+After some debugging, it appears the issue is that git-annex looks to see if the file 'wget' is available in any directory on the PATH. on windows, wget is installed as 'wget.exe', and the file 'wget' does not exist anywhere. creating a file named 'wget' works around the issue. (wget.exe appears to still be the file used)++###Full Transcript+1. remote annex is created on host 192.168.0.8, with file "file1.txt"+[[!format sh """+#Windows 7+#download and install git from git-scm.com/download/win+#Git-1.8.3-preview20130601.exe+#on install, selecting "Run Git from the Windows Command Prompt"+#on install, selecting "checkout as-is, commit as-is"+#installs to C:\Program Files (x86)\Git+#download and install git-annex from http://git-annex.branchable.com/install/+#git-annex-installer.exe+#need to right-click 'run as administrator', per reported bug (link here)+#installs to C:\Program Files (x86)\Git\cmd+#also installs some utilities, including wget.exe++C:\Users\test-git-annex>git clone http://192.168.0.8:8000/test_annex/.git+Cloning into 'test_annex'...++C:\Users\test-git-annex>cd test_annex++C:\Users\test-git-annex\test_annex>dir+ Volume in drive C has no label.++ Directory of C:\Users\test-git-annex\test_annex++<DIR> .+<DIR> ..+ 178 file1.txt+ 1 File(s) 178 bytes++C:\Users\test-git-annex\test_annex>type file1.txt+.git/annex/objects/J9/m6/SHA256-s21--6ed275e9e01c84a57fdd99d6af793c5d587d02e699cd2c28b32b7dc90f73e729/SHA256-s21--6ed275e9e01c84a57fdd99d6af793c5d587d02e699cd2c28b32b7dc90f73e729++C:\Users\test-git-annex\test_annex>git annex init windows+init windows+ Detected a crippled filesystem.++ Enabling direct mode.++ Detected a filesystem without fifo support.++ Disabling ssh connection caching.+ok+(Recording state in git...)++C:\Users\test-git-annex\test_annex> git annex get file.txt+#fails, with error dialog box, indicating libcurl-4.dll is missing, indicating git-annex is trying to use curl.++"""]]++> I fixed this immediately after it was mentioned on IRC. [[done]] --[[Joey]]
@@ -0,0 +1,84 @@+Before I start on what's gone wrong, many thanks for a great program: finally a way of finding out where I've put all those files, and I enjoyed your talk in Australia. Not quite to New Zealand, but a good start :-)++To play with git-annex, I decided to convert my ~/Downloads directory to a git-annex repository, as there were a wide variety of files in it, mostly easily replaceable, and also handy to have on multiple machines. In hindsight, probably wasn't a great idea, as I'd regularly forget it was a git-annex repo and move files and directories out manually, which caused all sorts of fun trying to sort out the dead symlinks. Then I after one update, the repository format changed, from WORM to xxx256 format which meant there were now both sorts in the GA object store.++More recently I'd tried converting the repo to direct mode, you get the idea: lots of playing with git-annex commands, and now that I think about it, possibly some git commands too trying to repair missing files.++Anyway I've ended up with a 27GB git-annex repo that now manages to kill git-annex whenever I try to check it using "git-annex fsck". ++Not only does the fsck subcommand cause it to die, but also "find", "whereis" and "status". It dies on the same file (for find/whereis/fsck).++e.g.++ ... lots of stuff deleted ...+ whereis 1wolf14.zip (2 copies) + 051f0b00-e265-11e1-894e-3b0b3f3844f2 -- Laptop+ 2c4e11e0-a1b4-11e1-9a02-73e17b04c00f -- here (myPC - Downloads)+ ok+ git-annex: out of memory (requested 2097152 bytes)++Now "git status" for some repo data:++ myPC:~/Downloads$ git annex status+ supported backends: SHA256E SHA1E SHA512E SHA224E SHA384E SHA256 SHA1 SHA512 SHA224 SHA384 WORM URL+ supported remote types: git S3 bup directory rsync web webdav glacier hook+ repository mode: direct+ trusted repositories: 0+ semitrusted repositories: 4+ 00000000-0000-0000-0000-000000000001 -- web+ 051f0b00-e265-11e1-894e-3b0b3f3844f2 -- Laptop+ 2c4e11e0-a1b4-11e1-9a02-73e17b04c00f -- here (myPC - Downloads)+ 48fbe52a-a1b3-11e1-bb80-ebc15118871d -- netbk+ untrusted repositories: 0+ dead repositories: 0+ transfers in progress: none+ available local disk space: 100 gigabytes (+1 megabyte reserved)+ local annex keys: 1719+ local annex size: 27 gigabytes+ known annex keys: git-annex: out of memory (requested 2097152 bytes)++It always seems to die at about 3.5GB memory usage. This is running on Ubuntu 12.04, using the latest GA release built using cabal:++ git-annex version: 4.20130227+ local repository version: 3+ default repository version: 3+ supported repository versions: 3 4+ upgrade supported from repository versions: 0 1 2++There are also dead symlinks that point to directories that have meta-data but not the symlink target (manually line-wrapped):++ myPC:~/Downloads$ ls -l precise*+ lrwxrwxrwx 1 nino nino 194 Oct 21 12:48 precise-dvd-i386.iso -> + .git/annex/objects/0x/Xz/SHA256-s3590631424--+ b08ecdd4846948ec076b23afae7f87be9cfba5218fb9ba4160f26c0b8d4b5dd0/+ SHA256-s3590631424--b08ecdd4846948ec076b23afae7f87be9cfba5218fb9ba4160f26c0b8d4b5dd0++But looking in the symlink destination directory, there's no corresponding object, only metadata:++ myPC:~/Downloads/.git/annex/objects/0x/Xz/SHA256-s3590631424--b08ecdd4846948ec076b23afae7f87be9cfba5218fb9ba4160f26c0b8d4b5dd0$ ls -l+ total 8+ -rw-rw-r-- 1 nino nino 30 Jan 8 23:15 SHA256-s3590631424--b08ecdd4846948ec076b23afae7f87be9cfba5218fb9ba4160f26c0b8d4b5dd0.cache+ -rw-rw-r-- 1 nino nino 49 Jan 8 23:15 SHA256-s3590631424--b08ecdd4846948ec076b23afae7f87be9cfba5218fb9ba4160f26c0b8d4b5dd0.map++But there is another version somewhere else.++ -r--r--r-- 1 nino nino 3590631424 Mar 18 2012 ./.git/annex/objects/Kj/wM/WORM-s3590631424-m1331991509+ --precise-dvd-i386.iso/WORM-s3590631424-m1331991509--precise-dvd-i386.iso++This actual file does exist in the "Used" directory:++ -rw-r--r-- 1 nino nino 3.4G May 27 2012 precise-dvd-i386.iso++I'm not so worried about the mangled repo - it's quite possibly because of clueless git/git-annex command usage - but the inability to use the fsck command is concerning++I could just uninit everything, but as it dies prematurely, I'm not certain that all the contents would be restored.+Any thoughts on how I can get git-annex (esp. fsck) to complete would be appreciated.++Thanks+Giovanni++> [[fixed|done]]. However, if you saw this behavior,+> you have large files checked directly into git. You may+> want to examine your repository and use git filter-branch to clean+> it up.+> --[[Joey]]
@@ -0,0 +1,24 @@+Setup:++* Fresh install of Debian Wheezy on machines A & B, git-annex 4.20130227 pulled in from unstable+* On both machines, clone old repository which contains both annexed files and a three small files checked straight into git++Steps:++* On both machines, use webapp to create `~/.config/git-annex/autostart` by just firing it up and typing in location of existing repository+* Move a new file into B's annex, in a subdirectory that is preferred on both A & B++Expected:++* The new file is copied over to A and everything remains in indirect mode+* Three files checked straight into git remain checked straight into git (see below for why this is a variant on [[bugs/Switching_between_direct_and_indirect_stomps_on___39__regular__39___git_files/]])++Actual:++* New file copied over but seems to be in direct mode, while all the other content that is present is still symlinked+* Files checked into git converted to direct mode files too (can tell this has happened by following step:)+* Typing `git annex indirect` on A & B shows conversion of precisely four files (three files originally checked into git and new file added to B ) back to indirect++Thanks.++> [[done]], webapp now avoids changing existing repos here. --[[Joey]]
@@ -0,0 +1,14 @@+With the storage layout v3, pulling the git-annex branch into the master branch is... less than ideal.++The fact that the two branches contain totally different data make an accidental merge worse, arguably.++Adding a tiny binary file called .gitnomerge to both branches would solve that without any noticeable overhead.++Yes, there is an argument to be made that this is too much hand-holding, but I still think it's worth it.++-- Richard++> It should be as easy to undo such an accidential merge+> as it is to undo any other git commit, right? I quite like that git-annex +> no longer adds any clutter to the master branch, and would be reluctant+> to change that. --[[Joey]]
@@ -0,0 +1,21 @@+### Please describe the problem.++While dropping 19 unused files from an annex, I got this error:++ error: invalid object 100644 c873416e78db4dd94b6ab40470d6fe99b2ecb8bd for '002/0a6/SHA256E-s427690--03aeabcde841b66168b72de80098d74e047f3ffc832d4bbefa1f2f70ee6c92f8.jpg.log'+ fatal: git-write-tree: error building trees+ git-annex: failed to read sha from git write-tree++I've actually seen this before, a few months ago.++### What steps will reproduce the problem?++I have no idea, but once it happens I can't interact with unused files anymore. Also, `git annex fsck` now reports this same problem as well.++### What version of git-annex are you using? On what operating system?++git-annex version: 4.20130815, OS X 10.8.4++> [[done]]; no indication this is anything other than a corrupt git+> repository, which can be caused by system crash, disk data loss, +> cosmic rays, etc. This is why we keep backups... --[[Joey]]
@@ -0,0 +1,52 @@+Hi!++Using bup for storing seems a good idea to save space, but I still have a problem when trying to copy files to my local git repo.+I have two partitions:++- /Data (NTFS)++- / (ext4)++I turned the directory /Data/Audio into a git-annex repo, and cloned it into /home/me/AudioClone.+I added the remote bup to AudioClone by doing:++ git annex initremote mybup type=bup encryption=none buprepo=++But when I try to copy some files that I have previously got by "git annex get" by doing:++ [~/AudioClone]$ git annex copy someartist/somealbum --to mybup++it fails and tells me:++ copy Order To Die/01 Morituri Te Salutant.flac (to mybup...) + fatal: Cannot lock the ref 'refs/heads/WORM-s7351771-m1318841909--01 Morituri Te Salutant.flac'.+ Traceback (most recent call last):+ File "/usr/lib/bup/cmd/bup-split", line 170, in <module>+ git.update_ref(refname, commit, oldref)+ File "/usr/lib/bup/bup/git.py", line 835, in update_ref+ _git_wait('git update-ref', p)+ File "/usr/lib/bup/bup/git.py", line 930, in _git_wait+ raise GitError('%s returned %d' % (cmd, rv))+ bup.git.GitError: git update-ref returned 128++for each file, **except for the album cover file**, which is a simple JPG that bup doesn't try to split. This one gets copied nicely but the big FLAC files don't.++I tried to restart my session, in case bup adds my username to a group or something.++(I'm using Ubuntu 11.10)++> Apparently bup-split does not allow storing data using filenames with+> spaces in them. I can reproduce the same bug using the same filename;+> if I remove the spaces all is well.+> +> Since bup-split -n uses git branches, I guess git-annex needs to avoid+> giving it any names containing spaces, or anything else not allowed+> in a git branch name. The rules for legal git branch names are quite complex+> (see git-check-ref-format(1)) so it will take me some times to code+> this up.+> +> A workaround is to switch to the SHA256 backend+> (`git annex migrate --backend=SHA256`), which avoids spaces in its keys.+> --[[Joey]]++>> Now fixed in git. [[done]] --[[Joey]]
@@ -0,0 +1,62 @@+### Please describe the problem.++Installing via Cabal fails due to dependency conflicts with yesod. If I build without the webapp flag, the problem disappears.++### What steps will reproduce the problem?+Running `cabal install c2hs git-annex --bindir=$HOME/bin`.++### What version of git-annex are you using? On what operating system?+I was attempting to install 4.20130521 from Hackage. My operating system is Mac OS X 10.6.8. Cabal-install is at 0.14.0.++### 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+Resolving dependencies...+cabal: Could not resolve dependencies:+trying: git-annex-4.20130521 (user goal)+trying: git-annex-4.20130521:+webapp+trying: yesod-default-1.2.0 (dependency of git-annex-4.20130521:+webapp)+trying: yesod-core-1.2.1 (dependency of yesod-default-1.2.0)+trying: cookie-0.4.0.1/installed-9d9... (dependency of yesod-core-1.2.1)+next goal: yesod (dependency of git-annex-4.20130521:+webapp)+rejecting: yesod-1.2.0.1, 1.2.0 (conflict: git-annex-4.20130521:webapp =>+yesod(<1.2))+rejecting: yesod-1.1.9.3, 1.1.9.2, 1.1.9.1, 1.1.9, 1.1.8.2, 1.1.8.1, 1.1.8,+1.1.7.2, 1.1.7.1, 1.1.7, 1.1.6, 1.1.5, 1.1.4.1, 1.1.4 (conflict:+yesod-core==1.2.1, yesod => yesod-core>=1.1.5 && <1.2)+rejecting: yesod-1.1.3.1, 1.1.3, 1.1.2, 1.1.1.2, 1.1.1, 1.1.0.3, 1.1.0.2,+1.1.0.1, 1.1.0 (conflict: yesod-core==1.2.1, yesod => yesod-core>=1.1 && <1.2)+rejecting: yesod-1.0.1.6, 1.0.1.5, 1.0.1.4, 1.0.1.3, 1.0.1.2, 1.0.1.1, 1.0.1,+1.0.0.2, 1.0.0.1, 1.0.0 (conflict: yesod-core==1.2.1, yesod => yesod-core>=1.0+&& <1.1)+rejecting: yesod-0.10.2, 0.10.1.4, 0.10.1.3, 0.10.1.2, 0.10.1.1, 0.10.1+(conflict: yesod-core==1.2.1, yesod => yesod-core>=0.10.1 && <0.11)+rejecting: yesod-0.9.4.1, 0.9.4, 0.9.3.4, 0.9.3.3, 0.9.3.2 (conflict:+yesod-core==1.2.1, yesod => yesod-core>=0.9.3.4 && <0.10)+rejecting: yesod-0.9.3.1, 0.9.3, 0.9.2.2, 0.9.2.1, 0.9.2, 0.9.1.1 (conflict:+yesod-core==1.2.1, yesod => yesod-core>=0.9.1.1 && <0.10)+rejecting: yesod-0.9.1 (conflict: yesod-core==1.2.1, yesod => yesod-core>=0.9+&& <0.10)+rejecting: yesod-0.8.2.1, 0.8.2, 0.8.1 (conflict: yesod-core==1.2.1, yesod =>+yesod-core>=0.8.1 && <0.9)+rejecting: yesod-0.8.0 (conflict: yesod-core==1.2.1, yesod => yesod-core>=0.8+&& <0.9)+rejecting: yesod-0.7.3, 0.7.2 (conflict: yesod-core==1.2.1, yesod =>+yesod-core>=0.7.0.2 && <0.8)+rejecting: yesod-0.7.1 (conflict: yesod-core==1.2.1, yesod =>+yesod-core>=0.7.0.1 && <0.8)+rejecting: yesod-0.7.0 (conflict: yesod-core==1.2.1, yesod => yesod-core>=0.7+&& <0.8)+rejecting: yesod-0.6.7, 0.6.6, 0.6.5, 0.6.4, 0.6.3, 0.6.2, 0.6.1.2, 0.6.1.1,+0.6.1, 0.6.0.2, 0.6.0.1, 0.6.0, 0.5.4.2, 0.5.4.1, 0.5.4, 0.5.3, 0.5.2, 0.5.1,+0.5.0.3, 0.5.0.2, 0.5.0.1, 0.5.0, 0.4.1, 0.4.0.3, 0.4.0.2, 0.4.0.1, 0.4.0+(conflict: cookie => time==1.4/installed-d61..., yesod => time>=1.1.4 && <1.3)+rejecting: yesod-0.3.1.1, 0.3.1, 0.3.0, 0.2.0, 0.0.0.2, 0.0.0.1, 0.0.0+(conflict: cookie => time==1.4/installed-d61..., yesod => time>=1.1.3 && <1.2)+# End of transcript or log.+"""]]++> Not OSX specific. I have added a version hint that makes cabal work and uploaded+> a point release with this fix. [[done]] --[[Joey]]
@@ -0,0 +1,49 @@+Followed the instructions over here: http://git-annex.branchable.com/forum/git-annex_on_OSX/++and had to install the following extra packages to be able to get make to start:++[realizes pcre-light is needed but pcre not installed on my mac] +sudo port install pcre +sudo cabal install pcre-light ++> Ah right, that is a new dependency. I've updated the forum page+> with this info.+> --[[Joey]] ++But then I got the following error: ++<pre>+ghc -O2 -Wall --make git-annex +[ 7 of 52] Compiling BackendTypes ( BackendTypes.hs, BackendTypes.o ++BackendTypes.hs:71:17: + No instance for (Arbitrary Char) + arising from a use of `arbitrary' at BackendTypes.hs:71:17-25 + Possible fix: add an instance declaration for (Arbitrary Char) + In a stmt of a 'do' expression: backendname <- arbitrary + In the expression: + do backendname <- arbitrary + keyname <- arbitrary + return $ Key (backendname, keyname) + In the definition of `arbitrary': + arbitrary = do backendname <- arbitrary + keyname <- arbitrary + return $ Key (backendname, keyname) +make: *** [git-annex] Error 1 +</pre>++My knowledge of Haskell (had to lookup the spelling...) is more than rudimentary so any help would be appreciated.++> Hmm, it seems you may be missing part of the quickcheck haskell+> library, or have a different version than me.+> +> The easy fix is probably to just edit BackendTypes.hs and delete the+> entire end of the file from line 68, "for quickcheck" down. This code+> is only used by the test suite (so "make test" will fail), +> but it should get it to build. --[[Joey]]++---++Closing this bug because the above problem now has a solution documented on+the install page, and the below test suite failure problems should all be+resolved on OSX. [[done]] --[[Joey]]
@@ -0,0 +1,568 @@+### Please describe the problem.+I am trying to sync gnucash between my server and my notebook. Both devices are connected via VPN to provide bidirectional SSH connectivity. After adding some data in gnucash the logfiles get synced properly but the changes to the gnucash.gnucash file are not recognized. Touching the file afterwards causes git-annex to immediately transfer the file.++### What steps will reproduce the problem?++Store your gnucash configuration in a git-annex repository. Add some transactions and wait for git-annex to sync your *.gnucash file.++### What version of git-annex are you using? On what operating system?++server and notebook -> Ubuntu 12.04.2 LTS:+[[!format sh """+florz@server:~$ git-annex version+git-annex version: 4.20130601+build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP DNS+"""]]++### Please provide any additional information below.++before opening gnucash:+[[!format sh """+florz@notebook:~$ stat annex-sync/gnucash/gnucash.gnucash+ Datei: »annex-sync/gnucash/gnucash.gnucash“+ Größe: 113902 Blöcke: 240 EA Block: 4096 Normale Datei+Gerät: 15h/21d Inode: 2974371 Verknüpfungen: 1+Zugriff: (0600/-rw-------) Uid: ( 1000/ florz) Gid: ( 1000/ florz)+Zugriff : 2013-06-22 19:32:37.974073365 +0200+Modifiziert: 2013-06-22 19:32:37.846073367 +0200+Geändert : 2013-06-22 19:32:37.970073365 +0200+ Geburt : -++florz@server:~$ stat annex-sync/gnucash/gnucash.gnucash+ Datei: »annex-sync/gnucash/gnucash.gnucash“+ Größe: 113902 Blöcke: 224 EA Block: 4096 Normale Datei+Gerät: fc00h/64512d Inode: 401737579 Verknüpfungen: 1+Zugriff: (0600/-rw-------) Uid: ( 1000/ florz) Gid: ( 1000/ florz)+Zugriff : 2013-06-22 19:40:24.148876398 +0200+Modifiziert: 2013-06-22 19:24:18.000000000 +0200+Geändert : 2013-06-22 19:24:26.817865369 +0200+ Geburt : -+"""]]++after doing some changes in gnucash:+[[!format sh """+florz@notebook:~$ stat annex-sync/gnucash/gnucash.gnucash+ Datei: »annex-sync/gnucash/gnucash.gnucash“+ Größe: 114039 Blöcke: 240 EA Block: 4096 Normale Datei+Gerät: 15h/21d Inode: 2974990 Verknüpfungen: 1+Zugriff: (0600/-rw-------) Uid: ( 1000/ florz) Gid: ( 1000/ florz)+Zugriff : 2013-06-22 19:52:12.226049268 +0200+Modifiziert: 2013-06-22 19:52:12.342049265 +0200+Geändert : 2013-06-22 19:52:12.342049265 +0200+ Geburt : -++florz@server:~$ stat annex-sync/gnucash/gnucash.gnucash+ Datei: »annex-sync/gnucash/gnucash.gnucash“+ Größe: 113902 Blöcke: 224 EA Block: 4096 Normale Datei+Gerät: fc00h/64512d Inode: 401737579 Verknüpfungen: 1+Zugriff: (0600/-rw-------) Uid: ( 1000/ florz) Gid: ( 1000/ florz)+Zugriff : 2013-06-22 19:40:24.148876398 +0200+Modifiziert: 2013-06-22 19:24:18.000000000 +0200+Geändert : 2013-06-22 19:24:26.817865369 +0200+ Geburt : -++# after some time -> still no transfer++florz@server:~$ stat annex-sync/gnucash/gnucash.gnucash+ Datei: »annex-sync/gnucash/gnucash.gnucash“+ Größe: 113902 Blöcke: 224 EA Block: 4096 Normale Datei+Gerät: fc00h/64512d Inode: 401737579 Verknüpfungen: 1+Zugriff: (0600/-rw-------) Uid: ( 1000/ florz) Gid: ( 1000/ florz)+Zugriff : 2013-06-22 19:40:24.148876398 +0200+Modifiziert: 2013-06-22 19:24:18.000000000 +0200+Geändert : 2013-06-22 19:24:26.817865369 +0200+ Geburt : -+"""]]++doing a touch on the file:+[[!format sh """+florz@notebook:~$ touch annex-sync/gnucash/gnucash.gnucash+florz@notebook:~$ stat annex-sync/gnucash/gnucash.gnucash+ Datei: »annex-sync/gnucash/gnucash.gnucash“+ Größe: 114039 Blöcke: 240 EA Block: 4096 Normale Datei+Gerät: 15h/21d Inode: 2974990 Verknüpfungen: 1+Zugriff: (0600/-rw-------) Uid: ( 1000/ florz) Gid: ( 1000/ florz)+Zugriff : 2013-06-22 19:54:27.222046497 +0200+Modifiziert: 2013-06-22 19:54:27.070046501 +0200+Geändert : 2013-06-22 19:54:27.214046498 +0200+ Geburt : -++#it syncs immediately++florz@server:~$ stat annex-sync/gnucash/gnucash.gnucash+ Datei: »annex-sync/gnucash/gnucash.gnucash“+ Größe: 114039 Blöcke: 224 EA Block: 4096 Normale Datei+Gerät: fc00h/64512d Inode: 401737638 Verknüpfungen: 1+Zugriff: (0600/-rw-------) Uid: ( 1000/ florz) Gid: ( 1000/ florz)+Zugriff : 2013-06-22 19:54:35.307056482 +0200+Modifiziert: 2013-06-22 19:54:27.000000000 +0200+Geändert : 2013-06-22 19:54:34.787072264 +0200+ Geburt : -+"""]]++on my notebook:+[[!format sh """+Everything up-to-date+Everything up-to-date+Everything up-to-date+[2013-06-22 19:52:12 CEST] Watcher: file deleted gnucash/gnucash.gnucash.tmp-rFzA3U+[2013-06-22 19:52:12 CEST] Committer: committing 1 changes+[2013-06-22 19:52:12 CEST] Committer: Committing changes to git+[2013-06-22 19:52:12 CEST] feed: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","update-index","-z","--index-info"]+[2013-06-22 19:52:12 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","commit","--allow-empty-message","--no-edit","-m","","--quiet","--no-verify"]+[2013-06-22 19:52:12 CEST] Pusher: Syncing with server192.168.2.2, home192.168.1.3 +[2013-06-22 19:52:12 CEST] Watcher: add direct gnucash/gnucash.gnucash.20130622195200.log+[2013-06-22 19:52:12 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","symbolic-ref","HEAD"]+[2013-06-22 19:52:12 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","refs/heads/master"]+[2013-06-22 19:52:12 CEST] Pusher: pushing to [Remote { name ="server192.168.2.2" },Remote { name ="home192.168.1.3" }]+[2013-06-22 19:52:12 CEST] call: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","branch","-f","synced/master"]+[2013-06-22 19:52:12 CEST] call: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","push","home192.168.1.3","git-annex:synced/git-annex","master:synced/master"]+[2013-06-22 19:52:12 CEST] call: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","push","server192.168.2.2","git-annex:synced/git-annex","master:synced/master"]+[2013-06-22 19:52:13 CEST] read: lsof ["-F0can","+d","/home/florz/annex-sync/.git/annex/tmp/"]+[2013-06-22 19:52:13 CEST] Committer: Adding gnucash.g..95200.log+ok+(Recording state in git...)+(Recording state in git...)++++(Recording state in git...)+add gnucash/gnucash.gnucash.20130622195200.log (checksum...) [2013-06-22 19:52:13 CEST] chat: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","hash-object","-t","blob","-w","--stdin"]+[2013-06-22 19:52:13 CEST] Committer: committing 1 changes+[2013-06-22 19:52:13 CEST] Committer: Committing changes to git+[2013-06-22 19:52:13 CEST] feed: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","update-index","-z","--index-info"]+[2013-06-22 19:52:13 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","commit","--allow-empty-message","--no-edit","-m","","--quiet","--no-verify"]+[2013-06-22 19:52:13 CEST] Committer: queued Upload UUID "dc591dd7-2446-45c6-84dc-55bdf79e7512" gnucash/gnucash.gnucash.20130622195200.log Nothing : new file created+[2013-06-22 19:52:13 CEST] Transferrer: Transferring: Upload UUID "dc591dd7-2446-45c6-84dc-55bdf79e7512" gnucash/gnucash.gnucash.20130622195200.log Nothing+[2013-06-22 19:52:13 CEST] Committer: queued Upload UUID "84bab1ab-238f-4602-953a-a297aab6da44" gnucash/gnucash.gnucash.20130622195200.log Nothing : new file created+[2013-06-22 19:52:13 CEST] call: /home/florz/bin/git-annex ["transferkeys","--readfd","29","--writefd","27"]+[2013-06-22 19:52:13 CEST] TransferWatcher: transfer starting: Upload UUID "dc591dd7-2446-45c6-84dc-55bdf79e7512" gnucash/gnucash.gnucash.20130622195200.log Nothing+[2013-06-22 19:52:14 CEST] Watcher: changed direct .gnucash/books/gnucash.gnucash.gcm+[2013-06-22 19:52:14 CEST] Watcher: file deleted gnucash/gnucash.gnucash.7f0101.29284.LNK+[2013-06-22 19:52:14 CEST] Watcher: file deleted gnucash/gnucash.gnucash.LCK+[2013-06-22 19:52:14 CEST] Watcher: changed direct .gnucash/accelerator-map+[2013-06-22 19:52:14 CEST] Watcher: changed direct .gnucash/expressions-2.0+[2013-06-22 19:52:14 CEST] Watcher: changed direct .gnucash/stylesheets-2.0+[2013-06-22 19:52:14 CEST] Watcher: add direct gnucash/gnucash.gnucash.20130622195212.log+[2013-06-22 19:52:14 CEST] read: lsof ["-F0can","+d","/home/florz/annex-sync/.git/annex/tmp/"]+[2013-06-22 19:52:14 CEST] Committer: Adding 5 files+ok+(Recording state in git...)+add .gnucash/books/gnucash.gnucash.gcm (checksum...) [2013-06-22 19:52:15 CEST] chat: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","hash-object","-t","blob","-w","--stdin"]+ok+add .gnucash/accelerator-map (checksum...) [2013-06-22 19:52:15 CEST] chat: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","hash-object","-t","blob","-w","--stdin"]+ok+add .gnucash/expressions-2.0 (checksum...) [2013-06-22 19:52:15 CEST] chat: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","hash-object","-t","blob","-w","--stdin"]+ok+add .gnucash/stylesheets-2.0 (checksum...) [2013-06-22 19:52:15 CEST] chat: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","hash-object","-t","blob","-w","--stdin"]+ok+add gnucash/gnucash.gnucash.20130622195212.log (checksum...) [2013-06-22 19:52:15 CEST] chat: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","hash-object","-t","blob","-w","--stdin"]+[2013-06-22 19:52:15 CEST] Committer: committing 7 changes+[2013-06-22 19:52:15 CEST] Committer: Committing changes to git+[2013-06-22 19:52:15 CEST] feed: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","update-index","-z","--index-info"]+To ssh://florz@192.168.1.3/home/florz/annex-sync/+ 7d4c30d..1954c7f master -> synced/master+[2013-06-22 19:52:15 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","commit","--allow-empty-message","--no-edit","-m","","--quiet","--no-verify"]+[2013-06-22 19:52:15 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","symbolic-ref","HEAD"]+[2013-06-22 19:52:15 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","refs/heads/master"]+[2013-06-22 19:52:15 CEST] Merger: merging refs/remotes/home192.168.1.3/synced/master into refs/heads/master+[2013-06-22 19:52:15 CEST] Committer: queued Upload UUID "dc591dd7-2446-45c6-84dc-55bdf79e7512" gnucash/gnucash.gnucash.20130622195212.log Nothing : new file created+[2013-06-22 19:52:15 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","symbolic-ref","HEAD"]+[2013-06-22 19:52:15 CEST] Committer: queued Upload UUID "84bab1ab-238f-4602-953a-a297aab6da44" gnucash/gnucash.gnucash.20130622195212.log Nothing : new file created+[2013-06-22 19:52:15 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","refs/heads/master"]+[2013-06-22 19:52:15 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","--hash","refs/heads/master"]+[2013-06-22 19:52:15 CEST] call: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync/.git/annex/merge/","merge","--no-edit","refs/remotes/home192.168.1.3/synced/master"]+Already up-to-date.+[2013-06-22 19:52:15 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","--hash","refs/heads/master"]+[2013-06-22 19:52:15 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","diff-tree","-z","--raw","--no-renames","-l0","-r","e1cb6c3b8bc0c851e6dab51271a4cde04815c50c","e1cb6c3b8bc0c851e6dab51271a4cde04815c50c"]+To ssh://florz@192.168.2.2/home/florz/annex-sync/+ 7d4c30d..e1cb6c3 master -> synced/master+[2013-06-22 19:52:16 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","symbolic-ref","HEAD"]+[2013-06-22 19:52:16 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","refs/heads/master"]+[2013-06-22 19:52:16 CEST] Merger: merging refs/remotes/server192.168.2.2/synced/master into refs/heads/master+[2013-06-22 19:52:16 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","symbolic-ref","HEAD"]+[2013-06-22 19:52:16 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","refs/heads/master"]+[2013-06-22 19:52:16 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","--hash","refs/heads/master"]+[2013-06-22 19:52:16 CEST] call: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync/.git/annex/merge/","merge","--no-edit","refs/remotes/server192.168.2.2/synced/master"]+Already up-to-date.+[2013-06-22 19:52:16 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","--hash","refs/heads/master"]+[2013-06-22 19:52:16 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","diff-tree","-z","--raw","--no-renames","-l0","-r","e1cb6c3b8bc0c851e6dab51271a4cde04815c50c","e1cb6c3b8bc0c851e6dab51271a4cde04815c50c"]++gnucash.gnucash.20130622195200.log++ 778 100% 0.00kB/s 0:00:00 + 778 100% 0.00kB/s 0:00:00 (xfer#1, to-check=0/1)+[2013-06-22 19:52:17 CEST] TransferWatcher: transfer starting: Upload UUID "dc591dd7-2446-45c6-84dc-55bdf79e7512" gnucash/gnucash.gnucash.20130622195200.log Just 778++sent 876 bytes received 31 bytes 201.56 bytes/sec+total size is 778 speedup is 0.86+[2013-06-22 19:52:17 CEST] TransferWatcher: transfer finishing: Transfer {transferDirection = Upload, transferUUID = UUID "dc591dd7-2446-45c6-84dc-55bdf79e7512", transferKey = Key {keyName = "8b8aa5c2cfe4466c6b897f7987246021468033301a696e2db0070386f7d0f3fd.log", keyBackendName = "SHA256E", keySize = Just 778, keyMtime = Nothing}}+[2013-06-22 19:52:17 CEST] Transferrer: Uploaded gnucash.g..95200.log+[2013-06-22 19:52:17 CEST] Transferrer: Transferring: Upload UUID "84bab1ab-238f-4602-953a-a297aab6da44" gnucash/gnucash.gnucash.20130622195212.log Nothing+[2013-06-22 19:52:17 CEST] TransferWatcher: transfer starting: Upload UUID "84bab1ab-238f-4602-953a-a297aab6da44" gnucash/gnucash.gnucash.20130622195212.log Nothing+[2013-06-22 19:52:18 CEST] Pusher: Syncing with server192.168.2.2, home192.168.1.3 +[2013-06-22 19:52:18 CEST] chat: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","hash-object","-w","--stdin-paths"]+[2013-06-22 19:52:18 CEST] feed: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","update-index","-z","--index-info"]+[2013-06-22 19:52:18 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","--hash","refs/heads/git-annex"]+[2013-06-22 19:52:18 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","write-tree"]+[2013-06-22 19:52:18 CEST] chat: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","commit-tree","f2463d30e73fec86e14c9df4bcae5e568398a503","-p","refs/heads/git-annex"]+[2013-06-22 19:52:18 CEST] call: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","update-ref","refs/heads/git-annex","776258f91d4245ffe13117a771dc8c7723867c1a"]+[2013-06-22 19:52:18 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","symbolic-ref","HEAD"]+[2013-06-22 19:52:18 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","refs/heads/master"]+[2013-06-22 19:52:18 CEST] Pusher: pushing to [Remote { name ="server192.168.2.2" },Remote { name ="home192.168.1.3" }]+[2013-06-22 19:52:18 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","git-annex"]+[2013-06-22 19:52:18 CEST] call: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","branch","-f","synced/master"]+[2013-06-22 19:52:18 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","--hash","refs/heads/git-annex"]+[2013-06-22 19:52:18 CEST] call: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","push","server192.168.2.2","git-annex:synced/git-annex","master:synced/master"]+[2013-06-22 19:52:18 CEST] call: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","push","home192.168.1.3","git-annex:synced/git-annex","master:synced/master"]+[2013-06-22 19:52:18 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..776258f91d4245ffe13117a771dc8c7723867c1a","--oneline","-n1"]+[2013-06-22 19:52:18 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..e7d4504abea59b0b59659908ba771783acc6cd55","--oneline","-n1"]+[2013-06-22 19:52:18 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..69a00fc4a2079b3a87725cc0e3e8b8a1e3a9ae20","--oneline","-n1"]+[2013-06-22 19:52:18 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..3c87a082e3b5340597dc59b9d5963b191f24a936","--oneline","-n1"]+[2013-06-22 19:52:18 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","ls-tree","-z","--","refs/heads/git-annex","uuid.log","remote.log","trust.log","group.log","preferred-content.log"]+[2013-06-22 19:52:18 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","symbolic-ref","HEAD"]+[2013-06-22 19:52:18 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","refs/heads/master"]+[2013-06-22 19:52:18 CEST] Merger: merging refs/heads/synced/master into refs/heads/master+[2013-06-22 19:52:18 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","symbolic-ref","HEAD"]+[2013-06-22 19:52:18 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","refs/heads/master"]+[2013-06-22 19:52:18 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","--hash","refs/heads/master"]+[2013-06-22 19:52:18 CEST] call: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync/.git/annex/merge/","merge","--no-edit","refs/heads/synced/master"]+Already up-to-date.+[2013-06-22 19:52:18 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","--hash","refs/heads/master"]+[2013-06-22 19:52:18 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","diff-tree","-z","--raw","--no-renames","-l0","-r","e1cb6c3b8bc0c851e6dab51271a4cde04815c50c","e1cb6c3b8bc0c851e6dab51271a4cde04815c50c"]++gnucash.gnucash.20130622195212.log++ 411 100% 0.00kB/s 0:00:00 + 411 100% 0.00kB/s 0:00:00 (xfer#1, to-check=0/1)+[2013-06-22 19:52:20 CEST] TransferWatcher: transfer starting: Upload UUID "84bab1ab-238f-4602-953a-a297aab6da44" gnucash/gnucash.gnucash.20130622195212.log Just 411++sent 509 bytes received 31 bytes 154.29 bytes/sec+total size is 411 speedup is 0.76+[2013-06-22 19:52:20 CEST] Transferrer: Uploaded gnucash.g..95212.log+[2013-06-22 19:52:20 CEST] TransferWatcher: transfer finishing: Transfer {transferDirection = Upload, transferUUID = UUID "84bab1ab-238f-4602-953a-a297aab6da44", transferKey = Key {keyName = "36e8842e91f7577d12992724c8f52586e9ea7cb0234312dc5544ea4dc6f6c39a.log", keyBackendName = "SHA256E", keySize = Just 411, keyMtime = Nothing}}+[2013-06-22 19:52:20 CEST] Transferrer: Transferring: Upload UUID "dc591dd7-2446-45c6-84dc-55bdf79e7512" gnucash/gnucash.gnucash.20130622195212.log Nothing+[2013-06-22 19:52:20 CEST] TransferWatcher: transfer starting: Upload UUID "dc591dd7-2446-45c6-84dc-55bdf79e7512" gnucash/gnucash.gnucash.20130622195212.log Nothing+To ssh://florz@192.168.1.3/home/florz/annex-sync/+ e7d4504..776258f git-annex -> synced/git-annex+[2013-06-22 19:52:21 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","git-annex"]+[2013-06-22 19:52:21 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","--hash","refs/heads/git-annex"]+[2013-06-22 19:52:21 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..776258f91d4245ffe13117a771dc8c7723867c1a","--oneline","-n1"]+[2013-06-22 19:52:21 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..e7d4504abea59b0b59659908ba771783acc6cd55","--oneline","-n1"]+[2013-06-22 19:52:21 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..69a00fc4a2079b3a87725cc0e3e8b8a1e3a9ae20","--oneline","-n1"]+[2013-06-22 19:52:21 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..3c87a082e3b5340597dc59b9d5963b191f24a936","--oneline","-n1"]+[2013-06-22 19:52:21 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","symbolic-ref","HEAD"]+[2013-06-22 19:52:21 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","refs/heads/master"]+[2013-06-22 19:52:21 CEST] Merger: merging refs/remotes/home192.168.1.3/synced/master into refs/heads/master+[2013-06-22 19:52:21 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","symbolic-ref","HEAD"]+[2013-06-22 19:52:21 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","refs/heads/master"]+[2013-06-22 19:52:21 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","--hash","refs/heads/master"]+[2013-06-22 19:52:21 CEST] call: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync/.git/annex/merge/","merge","--no-edit","refs/remotes/home192.168.1.3/synced/master"]+Already up-to-date.+[2013-06-22 19:52:21 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","--hash","refs/heads/master"]+[2013-06-22 19:52:21 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","diff-tree","-z","--raw","--no-renames","-l0","-r","e1cb6c3b8bc0c851e6dab51271a4cde04815c50c","e1cb6c3b8bc0c851e6dab51271a4cde04815c50c"]++gnucash.gnucash.20130622195212.log++ 411 100% 0.00kB/s 0:00:00 + 411 100% 0.00kB/s 0:00:00 (xfer#1, to-check=0/1)+[2013-06-22 19:52:21 CEST] TransferWatcher: transfer starting: Upload UUID "dc591dd7-2446-45c6-84dc-55bdf79e7512" gnucash/gnucash.gnucash.20130622195212.log Just 411++sent 509 bytes received 31 bytes 360.00 bytes/sec+total size is 411 speedup is 0.76+[2013-06-22 19:52:22 CEST] Transferrer: Uploaded gnucash.g..95212.log+[2013-06-22 19:52:22 CEST] TransferWatcher: transfer finishing: Transfer {transferDirection = Upload, transferUUID = UUID "dc591dd7-2446-45c6-84dc-55bdf79e7512", transferKey = Key {keyName = "36e8842e91f7577d12992724c8f52586e9ea7cb0234312dc5544ea4dc6f6c39a.log", keyBackendName = "SHA256E", keySize = Just 411, keyMtime = Nothing}}+[2013-06-22 19:52:22 CEST] Transferrer: Transferring: Upload UUID "84bab1ab-238f-4602-953a-a297aab6da44" gnucash/gnucash.gnucash.20130622195200.log Nothing+[2013-06-22 19:52:22 CEST] TransferWatcher: transfer starting: Upload UUID "84bab1ab-238f-4602-953a-a297aab6da44" gnucash/gnucash.gnucash.20130622195200.log Nothing+To ssh://florz@192.168.2.2/home/florz/annex-sync/+ e7d4504..776258f git-annex -> synced/git-annex+[2013-06-22 19:52:22 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","git-annex"]+[2013-06-22 19:52:22 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","--hash","refs/heads/git-annex"]+[2013-06-22 19:52:22 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..776258f91d4245ffe13117a771dc8c7723867c1a","--oneline","-n1"]+[2013-06-22 19:52:22 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..e7d4504abea59b0b59659908ba771783acc6cd55","--oneline","-n1"]+[2013-06-22 19:52:22 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..69a00fc4a2079b3a87725cc0e3e8b8a1e3a9ae20","--oneline","-n1"]+[2013-06-22 19:52:22 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..3c87a082e3b5340597dc59b9d5963b191f24a936","--oneline","-n1"]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+[2013-06-22 19:52:22 CEST] TransferWatcher: transfer finishing: Transfer {transferDirection = Upload, transferUUID = UUID "84bab1ab-238f-4602-953a-a297aab6da44", transferKey = Key {keyName = "8b8aa5c2cfe4466c6b897f7987246021468033301a696e2db0070386f7d0f3fd.log", keyBackendName = "SHA256E", keySize = Just 778, keyMtime = Nothing}}+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+[2013-06-22 19:52:24 CEST] Pusher: Syncing with server192.168.2.2, home192.168.1.3 +[2013-06-22 19:52:24 CEST] chat: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","hash-object","-w","--stdin-paths"]+[2013-06-22 19:52:24 CEST] feed: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","update-index","-z","--index-info"]+[2013-06-22 19:52:24 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","--hash","refs/heads/git-annex"]+[2013-06-22 19:52:24 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","write-tree"]+[2013-06-22 19:52:24 CEST] chat: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","commit-tree","1641422d48162f533f80693486d7c5a1208b9fcf","-p","refs/heads/git-annex"]+[2013-06-22 19:52:24 CEST] call: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","update-ref","refs/heads/git-annex","48cfe2eb07d63d4a59c237994eb07896c92ef1c4"]+[2013-06-22 19:52:24 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","symbolic-ref","HEAD"]+[2013-06-22 19:52:24 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","refs/heads/master"]+[2013-06-22 19:52:24 CEST] Pusher: pushing to [Remote { name ="server192.168.2.2" },Remote { name ="home192.168.1.3" }]+[2013-06-22 19:52:24 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","git-annex"]+[2013-06-22 19:52:24 CEST] call: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","branch","-f","synced/master"]+[2013-06-22 19:52:24 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","--hash","refs/heads/git-annex"]+[2013-06-22 19:52:24 CEST] call: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","push","server192.168.2.2","git-annex:synced/git-annex","master:synced/master"]+[2013-06-22 19:52:24 CEST] call: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","push","home192.168.1.3","git-annex:synced/git-annex","master:synced/master"]+[2013-06-22 19:52:24 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..48cfe2eb07d63d4a59c237994eb07896c92ef1c4","--oneline","-n1"]+[2013-06-22 19:52:24 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..e7d4504abea59b0b59659908ba771783acc6cd55","--oneline","-n1"]+[2013-06-22 19:52:24 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..69a00fc4a2079b3a87725cc0e3e8b8a1e3a9ae20","--oneline","-n1"]+[2013-06-22 19:52:24 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..776258f91d4245ffe13117a771dc8c7723867c1a","--oneline","-n1"]+[2013-06-22 19:52:24 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..3c87a082e3b5340597dc59b9d5963b191f24a936","--oneline","-n1"]+[2013-06-22 19:52:25 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","git-annex"]+[2013-06-22 19:52:25 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","--hash","refs/heads/git-annex"]+[2013-06-22 19:52:25 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..48cfe2eb07d63d4a59c237994eb07896c92ef1c4","--oneline","-n1"]+[2013-06-22 19:52:25 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..df87e3bef80902abc6d48ce0fbfe3432c790cd21","--oneline","-n1"]+[2013-06-22 19:52:25 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..69a00fc4a2079b3a87725cc0e3e8b8a1e3a9ae20","--oneline","-n1"]+[2013-06-22 19:52:25 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..776258f91d4245ffe13117a771dc8c7723867c1a","--oneline","-n1"]+[2013-06-22 19:52:25 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..3c87a082e3b5340597dc59b9d5963b191f24a936","--oneline","-n1"]+[2013-06-22 19:52:25 CEST] feed: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","update-index","-z","--index-info"]+[2013-06-22 19:52:25 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","diff-index","--raw","-z","-r","--no-renames","-l0","--cached","df87e3bef80902abc6d48ce0fbfe3432c790cd21"]+[2013-06-22 19:52:25 CEST] chat: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","hash-object","-t","blob","-w","--stdin"]+[2013-06-22 19:52:25 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","df87e3bef80902abc6d48ce0fbfe3432c790cd21..refs/heads/git-annex","--oneline","-n1"]+[2013-06-22 19:52:25 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","write-tree"]+[2013-06-22 19:52:25 CEST] chat: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","commit-tree","5bf44cd143b2c35a44e609e083af23093eb02028","-p","refs/heads/git-annex","-p","df87e3bef80902abc6d48ce0fbfe3432c790cd21"]+[2013-06-22 19:52:25 CEST] call: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","update-ref","refs/heads/git-annex","4cd264f192611f5a0d76e54d31329921a650f896"]+[2013-06-22 19:52:25 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","git-annex"]+[2013-06-22 19:52:25 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","--hash","refs/heads/git-annex"]+[2013-06-22 19:52:25 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..4cd264f192611f5a0d76e54d31329921a650f896","--oneline","-n1"]+[2013-06-22 19:52:25 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..df87e3bef80902abc6d48ce0fbfe3432c790cd21","--oneline","-n1"]+[2013-06-22 19:52:25 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..69a00fc4a2079b3a87725cc0e3e8b8a1e3a9ae20","--oneline","-n1"]+[2013-06-22 19:52:25 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..776258f91d4245ffe13117a771dc8c7723867c1a","--oneline","-n1"]+[2013-06-22 19:52:25 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..3c87a082e3b5340597dc59b9d5963b191f24a936","--oneline","-n1"]+To ssh://florz@192.168.1.3/home/florz/annex-sync/+ df87e3b..4cd264f git-annex -> synced/git-annex+[2013-06-22 19:52:26 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","git-annex"]+[2013-06-22 19:52:26 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","--hash","refs/heads/git-annex"]+[2013-06-22 19:52:27 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..4cd264f192611f5a0d76e54d31329921a650f896","--oneline","-n1"]+[2013-06-22 19:52:27 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..df87e3bef80902abc6d48ce0fbfe3432c790cd21","--oneline","-n1"]+[2013-06-22 19:52:27 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..69a00fc4a2079b3a87725cc0e3e8b8a1e3a9ae20","--oneline","-n1"]+[2013-06-22 19:52:27 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..776258f91d4245ffe13117a771dc8c7723867c1a","--oneline","-n1"]+[2013-06-22 19:52:27 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..3c87a082e3b5340597dc59b9d5963b191f24a936","--oneline","-n1"]+To ssh://florz@192.168.2.2/home/florz/annex-sync/+ 776258f..4cd264f git-annex -> synced/git-annex+[2013-06-22 19:52:28 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","git-annex"]+[2013-06-22 19:52:28 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","--hash","refs/heads/git-annex"]+[2013-06-22 19:52:28 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..4cd264f192611f5a0d76e54d31329921a650f896","--oneline","-n1"]+[2013-06-22 19:52:28 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..df87e3bef80902abc6d48ce0fbfe3432c790cd21","--oneline","-n1"]+[2013-06-22 19:52:28 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..69a00fc4a2079b3a87725cc0e3e8b8a1e3a9ae20","--oneline","-n1"]+[2013-06-22 19:52:28 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..3c87a082e3b5340597dc59b9d5963b191f24a936","--oneline","-n1"]+[2013-06-22 19:53:18 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","ls-tree","-z","--","refs/heads/git-annex","uuid.log","remote.log","trust.log","group.log","preferred-content.log"]+[2013-06-22 19:54:27 CEST] Watcher: changed direct gnucash/gnucash.gnucash+[2013-06-22 19:54:27 CEST] read: lsof ["-F0can","+d","/home/florz/annex-sync/.git/annex/tmp/"]+[2013-06-22 19:54:27 CEST] Committer: Adding gnucash.gnucash+ok+(Recording state in git...)+++(Recording state in git...)+++(Recording state in git...)+(merging synced/git-annex into git-annex...)+(Recording state in git...)+add gnucash/gnucash.gnucash (checksum...) [2013-06-22 19:54:27 CEST] read: sha256sum ["/home/florz/annex-sync/.git/annex/tmp/gnucash25536.gnucash"]+[2013-06-22 19:54:27 CEST] chat: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","hash-object","-t","blob","-w","--stdin"]+[2013-06-22 19:54:27 CEST] Committer: committing 1 changes+[2013-06-22 19:54:27 CEST] Committer: Committing changes to git+[2013-06-22 19:54:27 CEST] feed: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","update-index","-z","--index-info"]+[2013-06-22 19:54:27 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","commit","--allow-empty-message","--no-edit","-m","","--quiet","--no-verify"]+[2013-06-22 19:54:27 CEST] Committer: queued Upload UUID "dc591dd7-2446-45c6-84dc-55bdf79e7512" gnucash/gnucash.gnucash Nothing : new file created+[2013-06-22 19:54:27 CEST] Pusher: Syncing with server192.168.2.2, home192.168.1.3 +[2013-06-22 19:54:27 CEST] Transferrer: Transferring: Upload UUID "dc591dd7-2446-45c6-84dc-55bdf79e7512" gnucash/gnucash.gnucash Nothing+[2013-06-22 19:54:27 CEST] Committer: queued Upload UUID "84bab1ab-238f-4602-953a-a297aab6da44" gnucash/gnucash.gnucash Nothing : new file created+[2013-06-22 19:54:27 CEST] chat: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","hash-object","-w","--stdin-paths"]+[2013-06-22 19:54:27 CEST] feed: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","update-index","-z","--index-info"]+[2013-06-22 19:54:27 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","--hash","refs/heads/git-annex"]+[2013-06-22 19:54:27 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","write-tree"]+[2013-06-22 19:54:27 CEST] chat: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","commit-tree","4c81716cf1a0e0df472ffb43770ac8a27ca45420","-p","refs/heads/git-annex"]+[2013-06-22 19:54:27 CEST] call: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","update-ref","refs/heads/git-annex","e9e2f951a5c1c645447ccc565bc3def9caeff93c"]+[2013-06-22 19:54:27 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","symbolic-ref","HEAD"]+[2013-06-22 19:54:27 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","refs/heads/master"]+[2013-06-22 19:54:27 CEST] Pusher: pushing to [Remote { name ="server192.168.2.2" },Remote { name ="home192.168.1.3" }]+[2013-06-22 19:54:27 CEST] TransferWatcher: transfer starting: Upload UUID "dc591dd7-2446-45c6-84dc-55bdf79e7512" gnucash/gnucash.gnucash Nothing+[2013-06-22 19:54:27 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","git-annex"]+[2013-06-22 19:54:27 CEST] call: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","branch","-f","synced/master"]+[2013-06-22 19:54:27 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","--hash","refs/heads/git-annex"]+[2013-06-22 19:54:27 CEST] call: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","push","server192.168.2.2","git-annex:synced/git-annex","master:synced/master"]+[2013-06-22 19:54:27 CEST] call: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","push","home192.168.1.3","git-annex:synced/git-annex","master:synced/master"]+[2013-06-22 19:54:27 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..e9e2f951a5c1c645447ccc565bc3def9caeff93c","--oneline","-n1"]+[2013-06-22 19:54:27 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..df87e3bef80902abc6d48ce0fbfe3432c790cd21","--oneline","-n1"]+[2013-06-22 19:54:27 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..69a00fc4a2079b3a87725cc0e3e8b8a1e3a9ae20","--oneline","-n1"]+[2013-06-22 19:54:27 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..4cd264f192611f5a0d76e54d31329921a650f896","--oneline","-n1"]+[2013-06-22 19:54:27 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..3c87a082e3b5340597dc59b9d5963b191f24a936","--oneline","-n1"]+[2013-06-22 19:54:27 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","ls-tree","-z","--","refs/heads/git-annex","uuid.log","remote.log","trust.log","group.log","preferred-content.log"]+[2013-06-22 19:54:27 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","symbolic-ref","HEAD"]+[2013-06-22 19:54:27 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","refs/heads/master"]+[2013-06-22 19:54:27 CEST] Merger: merging refs/heads/synced/master into refs/heads/master+[2013-06-22 19:54:27 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","symbolic-ref","HEAD"]+[2013-06-22 19:54:27 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","refs/heads/master"]+[2013-06-22 19:54:27 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","--hash","refs/heads/master"]+[2013-06-22 19:54:27 CEST] call: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync/.git/annex/merge/","merge","--no-edit","refs/heads/synced/master"]+Already up-to-date.+[2013-06-22 19:54:27 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","--hash","refs/heads/master"]+[2013-06-22 19:54:27 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","diff-tree","-z","--raw","--no-renames","-l0","-r","e41ffae310ed2a50058b2f963decde4f9bc10a14","e41ffae310ed2a50058b2f963decde4f9bc10a14"]++++gnucash.gnucash++ 32768 28% 0.00kB/s 0:00:00 [2+ 114039 100% 15.50MB/s 0:00:00 (xfer#1, to-check=0/1)+013-06-22 19:54:28 CEST] TransferWatcher: transfer starting: Upload UUID "dc591dd7-2446-45c6-84dc-55bdf79e7512" gnucash/gnucash.gnucash Just 32768+[2013-06-22 19:54:28 CEST] TransferWatcher: transfer starting: Upload UUID "dc591dd7-2446-45c6-84dc-55bdf79e7512" gnucash/gnucash.gnucash Just 114039+To ssh://florz@192.168.1.3/home/florz/annex-sync/+ 4cd264f..e9e2f95 git-annex -> synced/git-annex+ e1cb6c3..e41ffae master -> synced/master+[2013-06-22 19:54:33 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","git-annex"]+[2013-06-22 19:54:33 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","--hash","refs/heads/git-annex"]+[2013-06-22 19:54:33 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..e9e2f951a5c1c645447ccc565bc3def9caeff93c","--oneline","-n1"]+[2013-06-22 19:54:33 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..df87e3bef80902abc6d48ce0fbfe3432c790cd21","--oneline","-n1"]+[2013-06-22 19:54:33 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..69a00fc4a2079b3a87725cc0e3e8b8a1e3a9ae20","--oneline","-n1"]+[2013-06-22 19:54:33 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..4cd264f192611f5a0d76e54d31329921a650f896","--oneline","-n1"]+[2013-06-22 19:54:33 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..3c87a082e3b5340597dc59b9d5963b191f24a936","--oneline","-n1"]+[2013-06-22 19:54:33 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","symbolic-ref","HEAD"]+[2013-06-22 19:54:33 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","refs/heads/master"]+[2013-06-22 19:54:33 CEST] Merger: merging refs/remotes/home192.168.1.3/synced/master into refs/heads/master+[2013-06-22 19:54:33 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","symbolic-ref","HEAD"]+[2013-06-22 19:54:33 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","refs/heads/master"]+[2013-06-22 19:54:33 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","--hash","refs/heads/master"]+[2013-06-22 19:54:33 CEST] call: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync/.git/annex/merge/","merge","--no-edit","refs/remotes/home192.168.1.3/synced/master"]+Already up-to-date.+[2013-06-22 19:54:33 CEST] read: git ["--git-dir=/home/florz/ann+sent 114130 bytes received 31 bytes 20756.55 bytes/sec+total size is 114039 espeedup is 1.00+x-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","--hash","refs/heads/master"]+[2013-06-22 19:54:33 CEST] Transferrer: Uploaded gnucash.gnucash+[2013-06-22 19:54:33 CEST] TransferWatcher: transfer finishing: Transfer {transferDirection = Upload, transferUUID = UUID "dc591dd7-2446-45c6-84dc-55bdf79e7512", transferKey = Key {keyName = "91ec950e4004863219ea33f1398ea4308e0969267c207272e046858ede8bf9d9", keyBackendName = "SHA256E", keySize = Just 114039, keyMtime = Nothing}}+[2013-06-22 19:54:33 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","diff-tree","-z","--raw","--no-renames","-l0","-r","e41ffae310ed2a50058b2f963decde4f9bc10a14","e41ffae310ed2a50058b2f963decde4f9bc10a14"]+[2013-06-22 19:54:33 CEST] Transferrer: Transferring: Upload UUID "84bab1ab-238f-4602-953a-a297aab6da44" gnucash/gnucash.gnucash Nothing+[2013-06-22 19:54:33 CEST] TransferWatcher: transfer starting: Upload UUID "84bab1ab-238f-4602-953a-a297aab6da44" gnucash/gnucash.gnucash Nothing++gnucash.gnucash++ 32768 28% 0.00kB/s 0:00:00 + 114039 100% 19.38MB/s 0:00:00 (xfer#1, to-check=0/1)+[2013-06-22 19:54:33 CEST] TransferWatcher: transfer starting: Upload UUID "84bab1ab-238f-4602-953a-a297aab6da44" gnucash/gnucash.gnucash Just 32768+[2013-06-22 19:54:33 CEST] TransferWatcher: transfer starting: Upload UUID "84bab1ab-238f-4602-953a-a297aab6da44" gnucash/gnucash.gnucash Just 114039+To ssh://florz@192.168.2.2/home/florz/annex-sync/+ 4cd264f..e9e2f95 git-annex -> synced/git-annex+ e1cb6c3..e41ffae master -> synced/master+[2013-06-22 19:54:34 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","git-annex"]+[2013-06-22 19:54:34 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","--hash","refs/heads/git-annex"]+[2013-06-22 19:54:34 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..e9e2f951a5c1c645447ccc565bc3def9caeff93c","--oneline","-n1"]+[2013-06-22 19:54:34 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..df87e3bef80902abc6d48ce0fbfe3432c790cd21","--oneline","-n1"]+[2013-06-22 19:54:34 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..69a00fc4a2079b3a87725cc0e3e8b8a1e3a9ae20","--oneline","-n1"]+[2013-06-22 19:54:34 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..3c87a082e3b5340597dc59b9d5963b191f24a936","--oneline","-n1"]+[2013-06-22 19:54:34 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","symbolic-ref","HEAD"]+[2013-06-22 19:54:34 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","refs/heads/master"]+[2013-06-22 19:54:34 CEST] Merger: merging refs/remotes/server192.168.2.2/synced/master into refs/heads/master+[2013-06-22 19:54:34 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","symbolic-ref","HEAD"]+[2013-06-22 19:54:34 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","refs/heads/master"]+[2013-06-22 19:54:34 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","--hash","refs/heads/master"]+[2013-06-22 19:54:34 CEST] call: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync/.git/annex/merge/","merge","--no-edit","refs/remotes/server192.168.2.2/synced/master"]+Already up-to-date.+[2013-06-22 19:54:34 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","--hash","refs/heads/master"]+[2013-06-22 19:54:34 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","diff-tree","-z","--raw","--no-renames","-l0","-r","e41ffae310ed2a50058b2f963decde4f9bc10a14","e41ffae310ed2a50058b2f963decde4f9bc10a14"]++sent 114130 bytes received 31 bytes 45664.40 bytes/sec+total size is 114039 speedup is 1.00+[2013-06-22 19:54:35 CEST] Transferrer: Uploaded gnucash.gnucash+[2013-06-22 19:54:35 CEST] TransferWatcher: transfer finishing: Transfer {transferDirection = Upload, transferUUID = UUID "84bab1ab-238f-4602-953a-a297aab6da44", transferKey = Key {keyName = "91ec950e4004863219ea33f1398ea4308e0969267c207272e046858ede8bf9d9", keyBackendName = "SHA256E", keySize = Just 114039, keyMtime = Nothing}}+[2013-06-22 19:54:36 CEST] Pusher: Syncing with server192.168.2.2, home192.168.1.3 +[2013-06-22 19:54:36 CEST] chat: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","hash-object","-w","--stdin-paths"]+[2013-06-22 19:54:36 CEST] feed: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","update-index","-z","--index-info"]+[2013-06-22 19:54:36 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","--hash","refs/heads/git-annex"]+[2013-06-22 19:54:36 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","write-tree"]+[2013-06-22 19:54:36 CEST] chat: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","commit-tree","fb43dcef4baa4b928faec6622a4f7889125c6c0a","-p","refs/heads/git-annex"]+[2013-06-22 19:54:36 CEST] call: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","update-ref","refs/heads/git-annex","b74b3402e31d7394815733811b9668b00cc51aa9"]+[2013-06-22 19:54:36 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","symbolic-ref","HEAD"]+[2013-06-22 19:54:36 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","refs/heads/master"]+[2013-06-22 19:54:36 CEST] Pusher: pushing to [Remote { name ="server192.168.2.2" },Remote { name ="home192.168.1.3" }]+[2013-06-22 19:54:36 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","git-annex"]+[2013-06-22 19:54:36 CEST] call: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","branch","-f","synced/master"]+[2013-06-22 19:54:36 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","--hash","refs/heads/git-annex"]+[2013-06-22 19:54:36 CEST] call: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","push","server192.168.2.2","git-annex:synced/git-annex","master:synced/master"]+[2013-06-22 19:54:36 CEST] call: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","push","home192.168.1.3","git-annex:synced/git-annex","master:synced/master"]+[2013-06-22 19:54:36 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..b74b3402e31d7394815733811b9668b00cc51aa9","--oneline","-n1"]+[2013-06-22 19:54:36 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..df87e3bef80902abc6d48ce0fbfe3432c790cd21","--oneline","-n1"]+[2013-06-22 19:54:36 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..69a00fc4a2079b3a87725cc0e3e8b8a1e3a9ae20","--oneline","-n1"]+[2013-06-22 19:54:36 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..e9e2f951a5c1c645447ccc565bc3def9caeff93c","--oneline","-n1"]+[2013-06-22 19:54:36 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..3c87a082e3b5340597dc59b9d5963b191f24a936","--oneline","-n1"]+[2013-06-22 19:54:39 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","git-annex"]+[2013-06-22 19:54:39 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","--hash","refs/heads/git-annex"]+[2013-06-22 19:54:39 CEST] read: git ["--gitTo ssh://florz@192.168.1.3/home/florz/annex-sync/+- ! [rejected] dgit-annex -> synced/git-annexi (r=/non-fast-forwardh)o+me/florz/aerror: failed to push some refs to 'ssh://florz@192.168.1.3/home/florz/annex-sync/'+nTo prevent you from losing history, non-fast-forward updates were rejected+Merge the remote changes (e.g. 'git pull') before pushing again. See the+'Note about fast-forwards' section of 'git push --help' for details.+nex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..b74b3402e31d7394815733811b9668b00cc51aa9","--oneline","-n1"]+[2013-06-22 19:54:39 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..89e2137442dfdb06facbaba3079873d90c7af281","--oneline","-n1"]+[2013-06-22 19:54:39 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..69a00fc4a2079b3a87725cc0e3e8b8a1e3a9ae20","--oneline","-n1"]+[2013-06-22 19:54:39 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..e9e2f951a5c1c645447ccc565bc3def9caeff93c","--oneline","-n1"]+[2013-06-22 19:54:39 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..3c87a082e3b5340597dc59b9d5963b191f24a936","--oneline","-n1"]+[2013-06-22 19:54:39 CEST] feed: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","update-index","-z","--index-info"]+[2013-06-22 19:54:39 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","diff-index","--raw","-z","-r","--no-renames","-l0","--cached","89e2137442dfdb06facbaba3079873d90c7af281"]+[2013-06-22 19:54:39 CEST] chat: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","hash-object","-t","blob","-w","--stdin"]+[2013-06-22 19:54:39 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","89e2137442dfdb06facbaba3079873d90c7af281..refs/heads/git-annex","--oneline","-n1"]+[2013-06-22 19:54:39 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","write-tree"]+[2013-06-22 19:54:39 CEST] chat: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","commit-tree","f175a05b82160942363f46bf1af3e7af1660dfa1","-p","refs/heads/git-annex","-p","89e2137442dfdb06facbaba3079873d90c7af281"]+[2013-06-22 19:54:39 CEST] call: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","update-ref","refs/heads/git-annex","fabac4b203dce9e812b4637f7e95375b15a3f739"]+[2013-06-22 19:54:39 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","git-annex"]+[2013-06-22 19:54:39 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","--hash","refs/heads/git-annex"]+[2013-06-22 19:54:39 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..fabac4b203dce9e812b4637f7e95375b15a3f739","--oneline","-n1"]+[2013-06-22 19:54:39 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..89e2137442dfdb06facbaba3079873d90c7af281","--oneline","-n1"]+[2013-06-22 19:54:39 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..69a00fc4a2079b3a87725cc0e3e8b8a1e3a9ae20","--oneline","-n1"]+[2013-06-22 19:54:39 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..e9e2f951a5c1c645447ccc565bc3def9caeff93c","--oneline","-n1"]+[2013-06-22 19:54:39 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..3c87a082e3b5340597dc59b9d5963b191f24a936","--oneline","-n1"]+To ssh://florz@192.168.2.2/home/florz/annex-sync/+ e9e2f95..fabac4b git-annex -> synced/git-annex+[2013-06-22 19:54:40 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","git-annex"]+[2013-06-22 19:54:40 CEST] Pusher: trying manual pull to resolve failed pushes+[2013-06-22 19:54:40 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","--hash","refs/heads/git-annex"]+[2013-06-22 19:54:40 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..fabac4b203dce9e812b4637f7e95375b15a3f739","--oneline","-n1"]+[2013-06-22 19:54:40 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..89e2137442dfdb06facbaba3079873d90c7af281","--oneline","-n1"]+[2013-06-22 19:54:40 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..69a00fc4a2079b3a87725cc0e3e8b8a1e3a9ae20","--oneline","-n1"]+[2013-06-22 19:54:40 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..e9e2f951a5c1c645447ccc565bc3def9caeff93c","--oneline","-n1"]+[2013-06-22 19:54:40 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..3c87a082e3b5340597dc59b9d5963b191f24a936","--oneline","-n1"]+[2013-06-22 19:54:40 CEST] call: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","fetch","home192.168.1.3"]+From ssh://192.168.1.3/home/florz/annex-sync+ e9e2f95..89e2137 synced/git-annex -> home192.168.1.3/synced/git-annex+[2013-06-22 19:54:42 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","git-annex"]+[2013-06-22 19:54:42 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","--hash","refs/heads/git-annex"]+[2013-06-22 19:54:42 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..fabac4b203dce9e812b4637f7e95375b15a3f739","--oneline","-n1"]+[2013-06-22 19:54:42 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..89e2137442dfdb06facbaba3079873d90c7af281","--oneline","-n1"]+[2013-06-22 19:54:42 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..69a00fc4a2079b3a87725cc0e3e8b8a1e3a9ae20","--oneline","-n1"]+[2013-06-22 19:54:43 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..3c87a082e3b5340597dc59b9d5963b191f24a936","--oneline","-n1"]+[2013-06-22 19:54:43 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","git-annex"]+[2013-06-22 19:54:43 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","--hash","refs/heads/git-annex"]+[2013-06-22 19:54:43 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..fabac4b203dce9e812b4637f7e95375b15a3f739","--oneline","-n1"]+[2013-06-22 19:54:43 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..89e2137442dfdb06facbaba3079873d90c7af281","--oneline","-n1"]+[2013-06-22 19:54:43 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..69a00fc4a2079b3a87725cc0e3e8b8a1e3a9ae20","--oneline","-n1"]+[2013-06-22 19:54:43 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..3c87a082e3b5340597dc59b9d5963b191f24a936","--oneline","-n1"]+[2013-06-22 19:54:43 CEST] call: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","--verify","-q","refs/remotes/home192.168.1.3/master"]+[2013-06-22 19:54:43 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/master..refs/remotes/home192.168.1.3/master","--oneline","-n1"]+[2013-06-22 19:54:43 CEST] call: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","--verify","-q","refs/remotes/home192.168.1.3/synced/master"]+[2013-06-22 19:54:43 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/synced/master..refs/remotes/home192.168.1.3/synced/master","--oneline","-n1"]+[2013-06-22 19:54:43 CEST] Pusher: pushing to [Remote { name ="home192.168.1.3" }]+[2013-06-22 19:54:43 CEST] call: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","branch","-f","synced/master"]+[2013-06-22 19:54:43 CEST] call: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","push","home192.168.1.3","git-annex:synced/git-annex","master:synced/master"]+[2013-06-22 19:54:45 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","git-annex"]+[2013-06-22 19:54:45 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","--hash","refs/heads/git-annex"]+[2013-06-22 19:54:45 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..fabac4b203dce9e812b4637f7e95375b15a3f739","--oneline","-n1"]+[2013-06-22 19:54:45 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..69a00fc4a2079b3a87725cc0e3e8b8a1e3a9ae20","--oneline","-n1"]+[2013-06-22 19:54:45 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..89e2137442dfdb06facbaba3079873d90c7af281","--oneline","-n1"]+[2013-06-22 19:54:45 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..3c87a082e3b5340597dc59b9d5963b191f24a936","--oneline","-n1"]+Everything up-to-date+[2013-06-22 19:54:46 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","git-annex"]+[2013-06-22 19:54:46 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","--hash","refs/heads/git-annex"]+[2013-06-22 19:54:47 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..fabac4b203dce9e812b4637f7e95375b15a3f739","--oneline","-n1"]+[2013-06-22 19:54:47 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..69a00fc4a2079b3a87725cc0e3e8b8a1e3a9ae20","--oneline","-n1"]+[2013-06-22 19:54:47 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..3c87a082e3b5340597dc59b9d5963b191f24a936","--oneline","-n1"]+"""]]++[[!tag /design/assistant]]+[[!meta title="hard link to open file which is then deleted"]]++> I have fixed this bug. [[done]] --[[Joey]]
@@ -0,0 +1,6 @@+The 32-bit standalone build appears to require two libraries (lib32-libyaml and lib32-gsasl) that are not available on Arch Linux. [See the comments on the AUR package](https://aur.archlinux.org/packages/git-annex-bin/). I'd appreciate it if you could bring back the 64-bit build.++> [[done]], based on <https://aur.archlinux.org/packages/git-annex-bin/>+> they are managing with what I am providing. Also, Arch Linux has a+> proper build of git-annex from source, so I'm not going to worry about+> git-annex-bin, the rationalle for which I don't even understand. --[[Joey]]
@@ -0,0 +1,18 @@+What steps will reproduce the problem?++Adding a e.g box.com repository from behind a http proxy via webapp.++What is the expected output? What do you see instead?++Connection should be made. But there is an error message:++"Internal Server Error+connect: does not exist (Connection refused): user error"++What version of git-annex are you using? On what operating system?++3.20121127 on Archlinux++Please provide any additional information below.++I don't use networkmanager if proxy information is obtained from it. There should be a fallback to environment variables.
@@ -0,0 +1,6 @@+Currently, git annex find lists files that are present in the current repository, possibly restricted to a subdirectory. But it does not easily seem possible to get this information about a remote repository.++I would find it useful if this command understood flags that makes it tell me what is present somewhere else (maybe "--on remote") and combinations of the flags ("--on remote1 --and --not-on remote2" or "--on disk1 --or --on disk2").++> Almost. You're looking for `--in remote`, which was added 2 months ago.+> [[done]] --[[Joey]]
@@ -0,0 +1,27 @@+What steps will reproduce the problem?++Create a new remote repository in the webapp. Get to the final phase of the setup where it asks you if you want to encrypt it, yet no other option is given to continue.++What is the expected output? What do you see instead?++At least two options:++1. Use an encrypted rsync repository on the server (the existing one)+2. Use an unencrypted rsync repository on the server++What version of git-annex are you using? On what operating system?++ $ ./git-annex version+ git-annex version: 3.20130102++ $ uname -a+ Linux wintermute 3.2.0-35-generic #55-Ubuntu SMP Wed Dec 5 17:45:18 UTC 2012 i686 i686 i386 GNU/Linux++ $ lsb_release -a+ Distributor ID: Ubuntu+ Description: Ubuntu 12.04.1 LTS+ Release: 12.04+ Codename: precise++[[!meta title="webapp does not allow disabling encryption on rsync special remotes"]]+[[!tag /design/assistant]]
@@ -0,0 +1,30 @@+Setup:++* fresh install of Debian Wheezy with git-annex 4.20130227 pulled in from unstable+* clone existing repository and activate assistant+* repository has encrypted rsync remote originally setup with the name `metaarray`+* this remote was renamed to `ma` a long time ago, using the webapp+* had to perform this rename on each client++Steps:++* attempt to reactivate special remote using webapp repositories page, on reinstalled machine++Expected:++* special remote starts working+* renaming special remotes ought to survive clones++Actual:++* firstly, special remote activation page has blank hostname box and the hostname of the machine is in the username box+* form gives error "cannot change encryption type of existing remote"++Workaround:++* execute `git annex initremote metaarray`+* rename `metaarray` to `ma` again using the webapp++Perhaps the renaming of the remote not surviving clones is unavoidable, but the webapp should be able to cope with the situation. Thanks.++[[!tag /design/assistant]]
@@ -0,0 +1,46 @@+**What steps will reproduce the problem?**++On the dashboard, click settings > Delete on the repo you want to remove.+Wait for the dropping to finish.+Start final deletion when the message "The repository "repo" has been emptied, and can now be removed." pops up.++**What is the expected output? What do you see instead?**++The repository should be deleted, but I only see "Internal Server Error: git [Param "remote",Param "remove",Param "repo"] failed".++**What version of git-annex are you using? On what operating system?**++Standalone build, git-annex version 4.20130417-g4bb97d5++**Please provide any additional information below.**++The log shows:++ [2013-04-22 22:17:22 CEST] TransferScanner: The repository "repo" has been emptied, and can now be removed. + error: Unknown subcommand: remove+ usage: git remote [-v | --verbose]+ or: git remote add [-t <branch>] [-m <master>] [-f] [--mirror=<fetch|push>] <name> <url>+ or: git remote rename <old> <new>+ or: git remote rm <name>+ or: git remote set-head <name> (-a | -d | <branch>)+ or: git remote [-v | --verbose] show [-n] <name>+ or: git remote prune [-n | --dry-run] <name>+ or: git remote [-v | --verbose] update [-p | --prune] [(<group> | <remote>)...]+ or: git remote set-branches [--add] <name> <branch>...+ or: git remote set-url <name> <newurl> [<oldurl>]+ or: git remote set-url --add <name> <newurl>+ or: git remote set-url --delete <name> <url>++ -v, --verbose be verbose; must be placed before a subcommand++++> Seems that `git remote remove` is new as of git 1.8.0 or so.+> Older gits only support `git remote rm`. Which newer gits+> support as well. but it seems to be in the process+> of being deprecated so I'd rather not use it.+> +> So, I've made the version of git it's+> built for determine which subcommand it uses. [[done]] --[[Joey]]+> +> (You can run `git remote rm repo` by hand to clean up from this BTW.)
@@ -0,0 +1,45 @@+What steps will reproduce the problem?+My annex dir has 23459 files and uses 749MB disk space.+Just create a repository put this dir inside, and git-annex will crash.++What is the expected output? What do you see instead?+I expect git-annex handles large number of files, and does not watch every single file of it.++What version of git-annex are you using? On what operating system?+I'm using git-annex linux build, version 2013.04.17.++Please provide any additional information below.++ [2013-04-17 23:52:35 CEST] Transferrer: Downloaded pappas_hu..di_44.jpg+ git-annex: runInteractiveProcess: pipe: Too many open files+ Committer crashed: lsof: createProcess: resource exhausted (Too many open files)+ [2013-04-17 23:53:52 CEST] Committer: warning Committer crashed: lsof: createProcess: resource exhausted (Too many open files)+ git-annex: runInteractiveProcess: pipe: Too many open files+ git: createProcess: resource exhausted (Too many open files)+ DaemonStatus crashed: /home/user/Desktop/down/annex_test/.git/annex/daemon.status.tmp21215: openFile: resource exhausted (Too many open files)+ [2013-04-17 23:57:24 CEST] DaemonStatus: warning DaemonStatus crashed: /home/user/Desktop/down/annex_test/.git/annex/daemon.status.tmp21215: openFile: resource exhausted (Too many open files)+ git-annex: runInteractiveProcess: pipe: Too many open files+ git: createProcess: resource exhausted (Too many open files)+ git-annex: runInteractiveProcess: pipe: Too many open files+ NetWatcherFallback crashed: git: createProcess: resource exhausted (Too many open files)+ [2013-04-18 00:27:17 CEST] NetWatcherFallback: warning NetWatcherFallback crashed: git: createProcess: resource exhausted (Too many open files)+ git-annex: runInteractiveProcess: pipe: Too many open files+ git-annex: git: createProcess: resource exhausted (Too many open files)+ git-annex: accept: resource exhausted (Too many open files)++Instead of raising system's limit (which is a neverending story), can we make git-annex only watch a directory and not every file of it?++Or could the user specify some directory which he knows it is rarely change, to not be watched only check it once a day?++The best would be if git annex could automatically adapt itself.+Ie. it watches eg. 200 files, and if some of it does not change for three days, then it drops from the watching basket, and those who changed (noticed while sanity checked) it adds to the basket.++I don't really want to raise the ulimit, because my ultimate goal is to have git-annex on multiple raspberry pi with external harddrive (one at my home, one at my mom's home, one at my friends home, etc, etc). And raspberry is fairly low on resource.++I'm interested in your thoughts.++Best, + Laszlo++[[!tag /design/assistant]]+[[!meta title="assistant can try to add too many files at once in batch add mode"]]
@@ -0,0 +1,24 @@+What steps will reproduce the problem?++I have an Annex with about 18k files in it. If I clone it and then run `git annex get .`, it gets a few thousand files and then starts reporting:++ get 2004-2012/Originals/110414_0362.jpg (from titan...) + rsync: fork: Resource temporarily unavailable (35)+ rsync error: error in IPC code (code 14) at pipe.c(63) [Receiver=3.0.9]++I have to abort and re-run `git annex get .` several times to finally get all of the files.++What is the expected output? What do you see instead?++I didn't expect what I saw! I think there's a resource not being released in the `get` code.++What version of git-annex are you using? On what operating system?++master branch, d430fb1.++Please provide any additional information below.++OS X 10.8.2. The machine has tons of RAM and tons of process handles free. It's really not doing anything else but this git-annex at the time of my tests.++> [[done]], this is a bug introduced in 3.20121009, and I've reverted the+> buggy change. --[[Joey]]
@@ -0,0 +1,30 @@+What steps will reproduce the problem?++Add an encrypted rsync remote by it's 'Host' value in ~/.ssh/config.++eg.:++cat ~/.ssh/config | grep Host++ Host serverNick++git annex initremote rsyncRemote type=rsync rsyncurl=serverNick:/home/USER/Music encryption=USER@gmail.com++git annex copy some\ artist --to serverNick+++What is the expected output? What do you see instead?++I'd expect it to remember the key password like a normal ssh remote. Instead I get asked for the key password 3 times for each file in the folder.++What version of git-annex are you using? On what operating system?++3.20130216. Arch x64 (up to date as of 2013-03-07)++Please provide any additional information below.+++[[!meta title="rsync special remote does not use ssh connection caching"]]++> [[done]]; ssh connection caching is now done for these remotes.+> --[[Joey]]
@@ -0,0 +1,138 @@+### Please describe the problem.+The remote server, connected with rsync and with encryption enabled doesn't fill with files.++### What steps will reproduce the problem?+* Add remote server via webapp+* Supply password when asked+* both buttons turn green ('ready to add remote server')+* Select encrypted rsync repository+* When done, files will be queued for transfer, and the queue empties quickly. Afterwards, no files have actually been transferred, but a green message appears and says something like 'synced with xxx'.+* Also, on the remote an empty directory (~/annex) is created.++### What version of git-annex are you using? On what operating system?+local: kubuntu 12.10, git-annex 4.20130621-g36258de+remote: debian (linux 3.8.0-25), git-annex 4.20130621-g36258de+Both are installed from tarball and PATH is set at the top of .bashrc.++### Please provide any additional information below.++[[!format sh """++Here is what is put in the logs when the button is toggled from 'syncing disabled' to 'syncing enabled'.+daemon.log:++[2013-07-03 13:43:07 CEST] call: git ["--git-dir=/home/boris/annex/.git","--work-tree=/home/boris/annex","config","remote.mybox.annex-sync","true"]+[2013-07-03 13:43:07 CEST] read: git ["config","--null","--list"]+[2013-07-03 13:43:07 CEST] read: git ["config","--null","--list"]+[2013-07-03 13:43:07 CEST] main: Syncing with mybox +[2013-07-03 13:43:07 CEST] read: git ["--git-dir=/home/boris/annex/.git","--work-tree=/home/boris/annex","symbolic-ref","HEAD"]+[2013-07-03 13:43:07 CEST] read: git ["--git-dir=/home/boris/annex/.git","--work-tree=/home/boris/annex","show-ref","refs/heads/master"]+[2013-07-03 13:43:07 CEST] read: git ["--git-dir=/home/boris/annex/.git","--work-tree=/home/boris/annex","show-ref","git-annex"]+[2013-07-03 13:43:07 CEST] read: git ["--git-dir=/home/boris/annex/.git","--work-tree=/home/boris/annex","show-ref","--hash","refs/heads/git-annex"]+[2013-07-03 13:43:07 CEST] read: git ["--git-dir=/home/boris/annex/.git","--work-tree=/home/boris/annex","log","refs/heads/git-annex..4cc51b410f5257f60e4ea187ab0c29783effcc88","--oneline","-n1"]+[2013-07-03 13:43:07 CEST] read: git ["--git-dir=/home/boris/annex/.git","--work-tree=/home/boris/annex","log","refs/heads/git-annex..6728d4d49ef97365eea0e2d379951acee9a9ded8","--oneline","-n1"]+[2013-07-03 13:43:07 CEST] read: git ["--git-dir=/home/boris/annex/.git","--work-tree=/home/boris/annex","symbolic-ref","HEAD"]+[2013-07-03 13:43:07 CEST] read: git ["--git-dir=/home/boris/annex/.git","--work-tree=/home/boris/annex","show-ref","refs/heads/master"]+[2013-07-03 13:43:07 CEST] TransferScanner: starting scan of [Remote { name ="mybox" }]+[2013-07-03 13:43:07 CEST] read: git ["--git-dir=/home/boris/annex/.git","--work-tree=/home/boris/annex","ls-files","--cached","-z","--"]+[2013-07-03 13:43:07 CEST] TransferScanner: queued Upload UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23" afstuderen/TSPC_FF_R.png Nothing : expensive scan found missing object+[2013-07-03 13:43:07 CEST] Transferrer: Transferring: Upload UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23" afstuderen/TSPC_FF_R.png Nothing+[2013-07-03 13:43:07 CEST] TransferScanner: queued Upload UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23" afstuderen/Thumbs.db Nothing : expensive scan found missing object+[2013-07-03 13:43:07 CEST] TransferWatcher: transfer starting: Upload UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23" afstuderen/TSPC_FF_R.png Nothing+[2013-07-03 13:43:07 CEST] TransferScanner: queued Upload UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23" afstuderen/administratie/Aanmeldingsformulier Masterexamen.odt Nothing : expensive scan found missing object+[2013-07-03 13:43:07 CEST] TransferScanner: queued Upload UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23" afstuderen/administratie/Intake_form_MSc_Electrical_Engineering_def dec 2011-1.pdf Nothing : expensive scan found missing object+[2013-07-03 13:43:07 CEST] TransferScanner: queued Upload UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23" afstuderen/administratie/Opdrachtomschrijving Master.doc Nothing : expensive scan found missing object+[2013-07-03 13:43:07 CEST] TransferScanner: queued Upload UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23" afstuderen/administratie/Opdrachtomschrijving Master.pdf Nothing : expensive scan found missing object+[2013-07-03 13:43:07 CEST] TransferScanner: queued Upload UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23" afstuderen/administratie/uren.xls Nothing : expensive scan found missing object+[2013-07-03 13:43:07 CEST] TransferScanner: queued Upload UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23" afstuderen/eldo_ur.pdf Nothing : expensive scan found missing object+[2013-07-03 13:43:07 CEST] TransferScanner: queued Upload UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23" afstuderen/literatuur/ A 65J-Conversion-Step 0-to-50MS 0-to-0.7mW 9b Charge-Sharing SAR ADC in 90nm Digital CMOS.pdf Nothing : expensive scan found missing object+[2013-07-03 13:43:07 CEST] TransferScanner: queued Upload UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23" afstuderen/literatuur/.directory Nothing : expensive scan found missing object+[2013-07-03 13:43:07 CEST] TransferScanner: queued Upload UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23" afstuderen/literatuur/2009SOVC_A_0.92mW_10-bit_50-MSs_SAR_ADC_in_0.13um_CMOS_Process.pdf Nothing : expensive scan found missing object+[2013-07-03 13:43:07 CEST] TransferScanner: queued Upload UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23" afstuderen/literatuur/A 8-bit 500-KSs Low Power SAR ADC for Biomedical Applications.pdf Nothing : expensive scan found missing object+fatal: unrecognized command 'rsync --server -vre.iLsf --partial-dir .rsync-partial . annex/'+git-annex-shell: git-shell failed+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+[2013-07-03 13:43:07 CEST] TransferWatcher: transfer finishing: Transfer {transferDirection = Upload, transferUUID = UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23", transferKey = Key {keyName = "ea86501fb0db033a103ed2c0806a1bddc145224afc4eb5e17fceb70bf1f674da.png", keyBackendName = "SHA256E", keySize = Just 11004, keyMtime = Nothing}}+fatal: unrecognized command 'rsync --server -vre.iLsf --partial-dir .rsync-partial . annex/'+git-annex-shell: git-shell failed+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+[2013-07-03 13:43:07 CEST] TransferScanner: queued Upload UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23" afstuderen/literatuur/A 9.2b 47fJ SAR with input range prediction DAC switching.pdf Nothing : expensive scan found missing object+[2013-07-03 13:43:07 CEST] Transferrer: Transferring: Upload UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23" afstuderen/Thumbs.db Nothing+[2013-07-03 13:43:07 CEST] TransferWatcher: transfer starting: Upload UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23" afstuderen/Thumbs.db Nothing+fatal: unrecognized command 'rsync --server -vre.iLsf --partial-dir .rsync-partial . annex/'+git-annex-shell: git-shell failed+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+[2013-07-03 13:43:07 CEST] TransferWatcher: transfer finishing: Transfer {transferDirection = Upload, transferUUID = UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23", transferKey = Key {keyName = "23b9a2be728c8af402ededb3eef7e9238b38d54c0ca50a05cbdf4aeea8f03c76.db", keyBackendName = "SHA256E", keySize = Just 12800, keyMtime = Nothing}}+fatal: unrecognized command 'rsync --server -vre.iLsf --partial-dir .rsync-partial . annex/'+git-annex-shell: git-shell failed+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+:+[2013-07-03 13:43:07 CEST] TransferScanner: queued Upload UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23" afstuderen/literatuur/A Low-Power Static Dual Edge-Triggered Flip-Flop.pdf Nothing : expensive scan found missing object+[2013-07-03 13:43:07 CEST] Transferrer: Transferring: Upload UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23" afstuderen/administratie/Aanmeldingsformulier Masterexamen.odt Nothing+[2013-07-03 13:43:07 CEST] TransferWatcher: transfer starting: Upload UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23" afstuderen/administratie/Aanmeldingsformulier Masterexamen.odt Nothing+fatal: unrecognized command 'rsync --server -vre.iLsf --partial-dir .rsync-partial . annex/'+git-annex-shell: git-shell failed+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+[2013-07-03 13:43:07 CEST] TransferWatcher: transfer finishing: Transfer {transferDirection = Upload, transferUUID = UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23", transferKey = Key {keyName = "f27ac57481c9eb0bf7bf1f6c99666aca5c8282137effa33791241b3d36b12de2.odt", keyBackendName = "SHA256E", keySize = Just 22041, keyMtime = Nothing}}+fatal: unrecognized command 'rsync --server -vre.iLsf --partial-dir .rsync-partial . annex/'+git-annex-shell: git-shell failed+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+[2013-07-03 13:43:07 CEST] TransferScanner: queued Upload UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23" afstuderen/literatuur/An Energy-Efficient Charge Recycling Approach for a SAR Converter With Capacitive DAC.pdf Nothing : expensive scan found missing object+[2013-07-03 13:43:07 CEST] Transferrer: Transferring: Upload UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23" afstuderen/administratie/Intake_form_MSc_Electrical_Engineering_def dec 2011-1.pdf Nothing+[2013-07-03 13:43:07 CEST] TransferWatcher: transfer starting: Upload UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23" afstuderen/administratie/Intake_form_MSc_Electrical_Engineering_def dec 2011-1.pdf Nothing+fatal: unrecognized command 'rsync --server -vre.iLsf --partial-dir .rsync-partial . annex/'+git-annex-shell: git-shell failed+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+[2013-07-03 13:43:07 CEST] TransferWatcher: transfer finishing: Transfer {transferDirection = Upload, transferUUID = UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23", transferKey = Key {keyName = "a261cb3835ed869c6ad2347d303ed10e94efa8a50cc9ff053d772c2158097244.pdf", keyBackendName = "SHA256E", keySize = Just 667666, keyMtime = Nothing}}+fatal: unrecognized command 'rsync --server -vre.iLsf --partial-dir .rsync-partial . annex/'+git-annex-shell: git-shell failed+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+[2013-07-03 13:43:07 CEST] TransferScanner: queued Upload UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23" afstuderen/literatuur/Calibration Technique for SAR Analog-to-Digital Converters.pdf Nothing : expensive scan found missing object+[2013-07-03 13:43:07 CEST] Transferrer: Transferring: Upload UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23" afstuderen/administratie/Opdrachtomschrijving Master.doc Nothing+[2013-07-03 13:43:07 CEST] TransferWatcher: transfer starting: Upload UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23" afstuderen/administratie/Opdrachtomschrijving Master.doc Nothing+fatal: unrecognized command 'rsync --server -vre.iLsf --partial-dir .rsync-partial . annex/'+git-annex-shell: git-shell failed+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+[2013-07-03 13:43:08 CEST] TransferWatcher: transfer finishing: Transfer {transferDirection = Upload, transferUUID = UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23", transferKey = Key {keyName = "cb69f2f4ae313277acd163b9bba19392ce50d3c5205ba8bbd90bf9c453088176.doc", keyBackendName = "SHA256E", keySize = Just 34304, keyMtime = Nothing}}+[2013-07-03 13:43:08 CEST] call: git ["--git-dir=/home/boris/annex/.git","--work-tree=/home/boris/annex","config","remote.mybox.annex-sync","false"]+[2013-07-03 13:43:08 CEST] read: git ["config","--null","--list"]+[2013-07-03 13:43:08 CEST] read: git ["config","--null","--list"]+fatal: unrecognized command 'rsync --server -vre.iLsf --partial-dir .rsync-partial . annex/'+git-annex-shell: git-shell failed+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+[2013-07-03 13:43:08 CEST] TransferScanner: queued Upload UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23" afstuderen/literatuur/D15_01.pdf Nothing : expensive scan found missing object+[2013-07-03 13:43:08 CEST] Transferrer: Transferring: Upload UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23" afstuderen/administratie/Opdrachtomschrijving Master.pdf Nothing+[2013-07-03 13:43:08 CEST] TransferWatcher: transfer starting: Upload UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23" afstuderen/administratie/Opdrachtomschrijving Master.pdf Nothing+fatal: unrecognized command 'rsync --server -vre.iLsf --partial-dir .rsync-partial . annex/'+git-annex-shell: git-shell failed+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+[2013-07-03 13:43:08 CEST] TransferWatcher: transfer finishing: Transfer {transferDirection = Upload, transferUUID = UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23", transferKey = Key {keyName = "cea054d80cb5ca572b7055c0132ec2d13125534566ed4a79ab2514c9a60d8ee4.pdf", keyBackendName = "SHA256E", keySize = Just 19802, keyMtime = Nothing}}+fatal: unrecognized command 'rsync --server -vre.iLsf --partial-dir .rsync-partial . annex/'+git-annex-shell: git-shell failed+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+[2013-07-03 13:43:08 CEST] Transferrer: Transferring: Upload UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23" afstuderen/literatuur/D15_01.pdf Nothing+[2013-07-03 13:43:08 CEST] TransferWatcher: transfer starting: Upload UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23" afstuderen/literatuur/D15_01.pdf Nothing+fatal: unrecognized command 'rsync --server -vre.iLsf --partial-dir .rsync-partial . annex/'+git-annex-shell: git-shell failed+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]++++# End of transcript or log.+"""]]++> [[fixed|done]], corrected logic error that caused `authorized_keys`+> to incorrectly force the git-annex-shell command for rsync remotes. --[[Joey]]
@@ -0,0 +1,10 @@+While using HMAC instead of "plain" hash functions is inherently more secure, it's still a bad idea to re-use keys for different purposes.++Also, ttbomk, HMAC needs two keys, not one. Are you re-using the same key twice?++Compability for old buckets and support for different ones can be maintained by introducing a new option and simply copying over the encryption key's identifier into this new option should it be missing.++> Bug was filed prematurely, but was a good bit of paranoia, and gpg and+> hmac are given different secret keys [[done]] --[[Joey]] ++>> Thanks :) -- RIchiH
@@ -0,0 +1,32 @@+### Please describe the problem.++As described in [[tips/Internet_Archive_via_S3]], there is a problem using S3 with buckets that have capital letters. The bug lies either in the hS3 library or in archive.org itself.++### What steps will reproduce the problem?++Try to add an [[special_remotes/S3]] remote with capital letters in the bucket name.++### What version of git-annex are you using? On what operating system?++[[!format txt """+git-annex version: 4.20130921-g434dc22+build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP DNS Feeds Quvi+local repository version: 3+default repository version: 3+supported repository versions: 3 4+upgrade supported from repository versions: 0 1 2+"""]]++### Please provide any additional information below.++[[!format sh """+# If you can, paste a complete transcript of the problem occurring here.+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log+anarcat@angela:video$ git annex initremote archive-moglenrepublica type=S3 host=s3.us.archive.org bucket=Republica2012-EbenMoglen-FreedomOfThoughtRequiresFreeMedia+initremote archive-moglenrepublica (Internet Archive mode) git-annex: The request signature we calculated does not match the signature you provided. Check your AWS Secret Access Key and signing method. For more information, see REST Authentication and SOAP Authentication for details.+# End of transcript or log.+"""]]++Just thought it would be better to have a separate thread for this bug. :)++> [[fixed|done]] --[[Joey]]
@@ -0,0 +1,14 @@+S3 has memory leaks++Sending a file to S3 causes a slow memory increase toward the file size.++Copying the file back from S3 causes a slow memory increase toward the+file size.++The author of hS3 is aware of the problem, and working on it. I think I+have identified the root cause of the buffering; it's done by hS3 so it can+resend the data if S3 sends it a 307 redirect. --[[Joey]]++At least the send leak should be fixed by the patch in the s3-memory-leak+branch in git. That needs a patch to hS3, which I have sent to its author.+--[[Joey]]
@@ -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,53 @@+What steps will reproduce the problem?++> Try to copy/move a file greater than 5G to S3.++ git annex copy large_file.tgz --to cloud++What is the expected output? What do you see instead?++> Looks like git-annex may not be using the Multipart Upload API: http://docs.aws.amazon.com/AmazonS3/latest/dev/uploadobjusingmpu.html++> Expected transfer to succeed, instead this error is output:++ copy large-file.tgz (gpg) (checking cloud...) (to cloud...) Reading passphrase from file descriptor 12 +++ Your proposed upload exceeds the maximum allowed size+ failed+ git-annex: copy: 1 failed++What version of git-annex are you using? On what operating system?++> OSX 10.8.2++Please provide any additional information below.++ annex [master●] % git annex status+ supported backends: SHA256E SHA1E SHA512E SHA224E SHA384E SHA256 SHA1 SHA512 SHA224 SHA384 WORM URL+ supported remote types: git S3 bup directory rsync web webdav glacier hook+ repository mode: indirect+ trusted repositories: 0+ semitrusted repositories: 3+ 00000000-0000-0000-0000-000000000001 -- web+ BE1D8EC7-C64B-47DE-AD4E-2A50437532B4 -- cloud+ E84568BA-6A4B-4AA1-B622-605B9248EDB1 -- here (eric laptop)+ untrusted repositories: 0+ dead repositories: 0+ transfers in progress: none+ available local disk space: 169 gigabytes (+1 megabyte reserved)+ temporary directory size: 218 megabytes (clean up with git-annex unused)+ local annex keys: 24+ local annex size: 8 gigabytes+ known annex keys: 25+ known annex size: 8 gigabytes+ bloom filter size: 16 mebibytes (0% full)+ backend usage: + SHA256E: 49+ annex [master●] % git annex version+ git-annex version: 3.20130114+ local repository version: 3+ default repository version: 3+ supported repository versions: 3+ upgrade supported from repository versions: 0 1 2+
@@ -0,0 +1,65 @@+git-annex version: 4.20130323++Running the webapp with SELinux enabled:++ [0 zerodogg@browncoats annexed]$ git annex webapp --debug+ Launching web browser on file:///home/zerodogg/Documents/annexed/.git/annex/webapp.html+ /home/zerodogg/bin/git-annex: line 25: 5801 Segmentation fault (core dumped) "$base/runshell" git-annex "$@"++After disabling SELinux it works just fine. This is on a freshly installed (default settings) Fedora 18 on x86-64.++Running the assistant also works, but segfaults when attempting to open the webapp:++ [0 zerodogg@browncoats annexed]$ git annex assistant &+ [1] 6241+ [0 zerodogg@browncoats annexed]$ + [0 zerodogg@browncoats annexed]$ git annex webapp --debug+ Launching web browser on file:///home/zerodogg/Documents/annexed/.git/annex/webapp.html+ /home/zerodogg/bin/git-annex: line 25: 6322 Segmentation fault (core dumped) "$base/runshell" git-annex "$@"+ [139 zerodogg@browncoats annexed]$ Created new window in existing browser session.++Here's what `dmesg` says:++ [ 71.488843] SELinux: initialized (dev proc, type proc), uses genfs_contexts+ [ 115.443932] git-annex[3985]: segfault at e6e62984 ip 0000000009b8085a sp 00000000f4bfd028 error 4 in git-annex[8048000+1c75000]+ [ 125.148819] SELinux: initialized (dev proc, type proc), uses genfs_contexts+ [ 125.230155] git-annex[4043]: segfault at e6eda984 ip 0000000009b8085a sp 00000000f63fd028 error 4 in git-annex[8048000+1c75000]+ [ 406.855659] SELinux: initialized (dev proc, type proc), uses genfs_contexts+ [ 407.033966] git-annex[5806]: segfault at e6faa984 ip 0000000009b8085a sp 00000000f6dfd028 error 4 in git-annex[8048000+1c75000]+ [ 462.368045] git-annex[6279]: segfault at e6f76984 ip 0000000009b8085a sp 00000000f49fd028 error 4 in git-annex[8048000+1c75000]+ [ 465.714636] SELinux: initialized (dev proc, type proc), uses genfs_contexts+ [ 465.930434] git-annex[6329]: segfault at e6e7a984 ip 0000000009b8085a sp 00000000f63fd028 error 4 in git-annex[8048000+1c75000]+ [ 560.570480] git-annex[7050]: segfault at e7022984 ip 0000000009b8085a sp 00000000f54fd028 error 4 in git-annex[8048000+1c75000]+ [ 565.510664] SELinux: initialized (dev proc, type proc), uses genfs_contexts+ [ 565.688681] git-annex[7108]: segfault at e7196984 ip 0000000009b8085a sp 00000000f54fd028 error 4 in git-annex[8048000+1c75000]++Running the whole thing with --debug doesn't appear to provide anything useful:++ [0 zerodogg@browncoats annexed]$ git annex assistant --debug &+ [1] 7018+ [0 zerodogg@browncoats annexed]$ [2013-03-24 16:27:02 CET] read: git ["--git-dir=/home/zerodogg/Documents/annexed/.git","--work-tree=/home/zerodogg/Documents/annexed","show-ref","git-annex"]+ [2013-03-24 16:27:02 CET] read: git ["--git-dir=/home/zerodogg/Documents/annexed/.git","--work-tree=/home/zerodogg/Documents/annexed","show-ref","--hash","refs/heads/git-annex"]+ [2013-03-24 16:27:02 CET] read: git ["--git-dir=/home/zerodogg/Documents/annexed/.git","--work-tree=/home/zerodogg/Documents/annexed","log","refs/heads/git-annex..f2260840bd9563f3d9face53dddd6807813860cd","--oneline","-n1"]+ [2013-03-24 16:27:02 CET] read: git ["--git-dir=/home/zerodogg/Documents/annexed/.git","--work-tree=/home/zerodogg/Documents/annexed","log","refs/heads/git-annex..798526ef1315811296b1ac95d4cf97c72141ad29","--oneline","-n1"]+ [2013-03-24 16:27:02 CET] read: git ["--git-dir=/home/zerodogg/Documents/annexed/.git","--work-tree=/home/zerodogg/Documents/annexed","log","refs/heads/git-annex..0d827b1ef545a88e94ee8cc973e54a1b74d216f4","--oneline","-n1"]+ [2013-03-24 16:27:02 CET] read: git ["--git-dir=/home/zerodogg/Documents/annexed/.git","--work-tree=/home/zerodogg/Documents/annexed","log","refs/heads/git-annex..1d8f91411b827c4d59735dbc572e7f278e870e43","--oneline","-n1"]+ [2013-03-24 16:27:02 CET] read: git ["--git-dir=/home/zerodogg/Documents/annexed/.git","--work-tree=/home/zerodogg/Documents/annexed","log","refs/heads/git-annex..cc442416b325866139db6dbe374bddacda6fef91","--oneline","-n1"]+ [2013-03-24 16:27:02 CET] read: git ["--git-dir=/home/zerodogg/Documents/annexed/.git","--work-tree=/home/zerodogg/Documents/annexed","log","refs/heads/git-annex..3c2f44ffd82df1a0ae8858bdf2610e933b105a09","--oneline","-n1"]+ [2013-03-24 16:27:02 CET] read: git ["--git-dir=/home/zerodogg/Documents/annexed/.git","--work-tree=/home/zerodogg/Documents/annexed","log","refs/heads/git-annex..fb8819ca92d9a2ed39e6d329160b5f8da60df83f","--oneline","-n1"]+ [2013-03-24 16:27:02 CET] read: git ["--git-dir=/home/zerodogg/Documents/annexed/.git","--work-tree=/home/zerodogg/Documents/annexed","log","refs/heads/git-annex..68d0f936ee044b0ca34cf4029bcd6274fed88499","--oneline","-n1"]+ [2013-03-24 16:27:02 CET] read: git ["--git-dir=/home/zerodogg/Documents/annexed/.git","--work-tree=/home/zerodogg/Documents/annexed","log","refs/heads/git-annex..3ba3dfef6340196126f4fc630b5048188230d1ff","--oneline","-n1"]+ [2013-03-24 16:27:02 CET] chat: git ["--git-dir=/home/zerodogg/Documents/annexed/.git","--work-tree=/home/zerodogg/Documents/annexed","cat-file","--batch"]+ + [1] + done GITWRAP annex assistant --debug+ [0 zerodogg@browncoats annexed]$ git annex webapp --debug &+ [1] 7082+ [0 zerodogg@browncoats annexed]$ Launching web browser on file:///home/zerodogg/Documents/annexed/.git/annex/webapp.html+ /home/zerodogg/bin/git-annex: line 25: 7088 Segmentation fault (core dumped) "$base/runshell" git-annex "$@"+ + [1] + exit 139 GITWRAP annex webapp --debug+ [0 zerodogg@browncoats annexed]$ Created new window in existing browser session.++> On IRC it developed that it segfaulted at other times, and gdb complained+> of a library mismatch. Seems something changed in Fedora libc, and +> the 32 bit binary is not working on 64 bit. I've brought back the 64 bit+> standalone builds, which work. [[done]] --[[Joey]]
@@ -0,0 +1,22 @@+### Please describe the problem.+Entering a jabber address which's server got a selfsigned certificate, the process just fails, without asking for acceptance for that certificate. This is quite a showstopper.+(for example: jabber.ccc.de)+++### What steps will reproduce the problem?+Try with an account from e.g. jabber.ccc.de+++### What version of git-annex are you using? On what operating system?+Arch Linux, aur/git-annex-standalone 4.20130709-1 ++### Please provide any additional information below.+There is no logoutput to add... I'm sorry.++[[!format sh """+# If you can, paste a complete transcript of the problem occurring here.+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log+++# End of transcript or log.+"""]]
@@ -0,0 +1,28 @@+### Please describe the problem.++When creating a Camera repository on android, the .thumbnails/ directory (containing useless crushed JPGs and even more useless oodles of thumbnail metadata databases) is annexed. This leads to confusion (assistant tries to annex database and thumbnails in modification) and waste (uploading/annexing unusable/unneeded metadata).++### What steps will reproduce the problem?++Install git-annex on Android and choose the defaults for a camera repository.+++### What version of git-annex are you using? On what operating system?++4.20130601, Android 4.2.2+++### Please provide any additional information below.++[[!format sh """+# If you can, paste a complete transcript of the problem occurring here.+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log+++# End of transcript or log.+"""]]++> I've [[done]] this, however the .gitignore file it writes will+> not actually be used by the assistant until it gets support+> for querying gitignore settings from git. There is already a+> bug tracking that, and it's in process. --[[Joey]]
@@ -0,0 +1,50 @@+### Please describe the problem.++If you have a flaky connection big uploads and downloads will fail. git-annex should try again few times.++This is an example of failed download.++[[!format sh """+$ git annex get --not --in here+get File1.bin (from s3...) (gpg) +You need a passphrase to unlock the secret key for+user: "Gioele"+4096-bit RSA key, ....++gpg: gpg-agent is not available in this session++ ErrorMisc "<socket: 14>: hGetBuf: resource vanished (Connection reset by peer)"+ + Unable to access these remotes: s3++ Try making some of these repositories available:+ 331fa184-799d-4511-1725-ef2a17ace8b4 -- s3+ c2a0cfa0-8871-9721-9b81-5649281fabdc -- other+failed+get File2.bin (from s3...) ++ Unable to access these remotes: s3++ Try making some of these repositories available:+ 331fa184-799d-4511-1725-ef2a17ace8b4 -- s3+ c2a0cfa0-8871-9721-9b81-5649281fabdc -- other+failed+git-annex: get: 2 failed+"""]]++This is especially annoying when the DNS is out of order for a few seconds every now and then. In such cases, git-annex will complain, skip very fast to the next file, and repeat this process until it runs out of files. In the end it will have uploaded or downloaded very few files.++Please not that it may not possible to write a simple shell loop to try again as the are GPG passwords to be entered.++Git-annex should try again to upload or download a file in case something goes wrong.++### What version of git-annex are you using? On what operating system?++ git-annex version: 4.20130709.1+ build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP+ local repository version: unknown+ default repository version: 3+ supported repository versions: 3 4+ upgrade supported from repository versions: 0 1 2++Ubuntu 12.04.2 LTS
@@ -0,0 +1,33 @@+### Please describe the problem.++repos of group smallarchive have started trying to accumulate all files.++I have an archive repo (rsync) and a smallarchive repo (glacier). The assistant is now trying to transfer everything up to glacier. This is new behavior as of this version of annex.++### What steps will reproduce the problem?+++### What version of git-annex are you using? On what operating system?++Mac OSX 10.8.3 (Build 12D78)++ git-annex version: 4.20130501-ged2fc6f+ + local repository version: 4+ default repository version: 3+ supported repository versions: 3 4+ upgrade supported from repository versions: 0 1 2+ build flags: Assistant Webapp Pairing Testsuite S3 WebDAV FsEvents XMPP DNS+++### Please provide any additional information below.++[[!format sh """+# If you can, paste a complete transcript of the problem occurring here.+# If the problem is with the git-annex assistant, paste in .git/annex/debug.log+++# End of transcript or log.+"""]]++[[!tag moreinfo]]
@@ -0,0 +1,44 @@+### Please describe the problem.++Both my Android devices where not processing git-annex updates due to stale lock files. While the lock files are different, I've reported them both together as they are related. ++### What steps will reproduce the problem?++Unknown, perhaps the assistant crashed, or the battery ran flat on them.++To resolve the issue I had to manually remove the lock files.++### What version of git-annex are you using? On what operating system?++On my Android phone, daily build 4.20130614-g221aea4+On my Android tablet, daily build 4.20130621-g36258de++### Please provide any additional information below.++It seems to me that it'd be useful to have the assistant check to see if the lock files are still valid and remove them if they're stale.++[[!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++My phone:++From ssh://git-annex-flick-andrewannex_phonecamera/~/phone-camera+ 987dc25..682cdd1 git-annex -> flick_phonecamera/git-annex+fatal: Unable to create '/storage/emulated/legacy/DCIM/.git/refs/remotes/flick_phonecamera/synced/git-annex.lock': File exists.++My tablet:++Committer: Adding Coleman-C..eedom.pdf+Committer: Committing changes to git+fatal: Unable to create '/mnt/sdcard/reference/.git/index.lock': File exists.++# End of transcript or log.+"""]]++> The '/mnt/sdcard/reference/.git/index.lock' lock file will now be+> automatically dealt with. Have not done anything about the refs/remotes+> lock files yet. --[[Joey]]+> +> Now the assistant deals with all stale git lock files on startup. +> [[done]] --[[Joey]]
@@ -0,0 +1,45 @@+What steps will reproduce the problem?++mkdir annex_stress; cd annex_stress, +then execute the following script:++ #! /bin/sh+ + # creating a directory, in which we dump all the files.+ mkdir probes; cd probes+ + for i in `seq -w 1 25769`; do+ mkdir probe$i+ echo "This is an important file, which saved also in backup ('back') directory too.\n Content changes: $i" > probe$i/probe$i.txt+ echo "This is just an identical content file. Saved in each subdir." > probe$i/defaults.txt+ echo "This is a variable ($i) content file, which is not backed up in 'back' directory." > probe$i/probe-nb$i.txt+ mkdir probe$i/back+ cp probe$i/probe$i.txt probe$i/back/probe$i.txt+ done+++It creates about 25000 directory and 3 files in each, two of them are identical.++What is the expected output? What do you see instead?++I expect git annex could import the directory within 12 hours. +Yet, it just crashes the gui (starting webapp, uses the cpu 100% and it does not finish after 28hours.)+++What version of git-annex are you using? On what operating system?++version 2013.04.17++Please provide any additional information below.++I do hope git-annex can be fixed to handle large number of files.+This stress test models well enough my own directory structure, +relatively high number of files relatively low disk space usage +(my own directory structure: 750MB, this test creates 605MB).+++Best, + Laszlo++[[!meta title="assistant Stress test"]]+[[!tag /design/assistant]]
@@ -0,0 +1,12 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ nickname="joey"+ subject="comment 10"+ date="2013-05-06T16:54:36Z"+ content="""+My estimate was indeed slightly optimistic. While I did not run the whole import, it did run slower for the later batches of files. As far as I can see, that slowdown is just because git gets slower as it has more files. So nothing I can do about it. git-annex is now scaling well itself, though.++Re checksumming on startup: There was a bug that caused the assistant to re-checksum all direct mode files on startup. This bug was fixed in version 4.20130417. If you're using that version and still see it re-checksumming files, please file a new bug report about it, as this is not intended behavior.++You seem to be saying that the assistant is failing to add some files, and then when stopped and restarted it finds and adds them. I don't quite know how that would happen. If you can provide a test case that I can use to reproduce that behavior, I will try to debug it.+"""]]
@@ -0,0 +1,25 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawm5iosFbL2By7UFeViqkc6v-hoAtqILeDA"+ nickname="Laszlo"+ subject="comment 11"+ date="2013-05-11T05:36:48Z"+ content="""+rechecksuming: it seem like it is indeed fixed in the newest (2013.05.01) version downloaded from here:+http://downloads.kitenet.net/git-annex/linux/++I tried to add the big stress test dir as a secondary repository into git-annex (along with my real data dir), but +seems like some library is not matching on my system, so some curl is complaining:++ curl: /lib/tls/i686/cmov/libc.so.6: version `GLIBC_2.12' not found (required by /home/user/Desktop/down/git-annex.linux//usr/lib/i386-linux-gnu/libldap_r-2.4.so.2)++I'm on ubuntu 10.04.++And the log file is starting to fill up, so maybe once a problem occur, it should only write into the log file once.++I will redone this stress test next week, without combining with any repository.+Thank you very much for your response, I do appreciate you are bothering/dealing with my complains!:)++Best, + Laszlo++"""]]
@@ -0,0 +1,17 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ nickname="joey"+ subject="comment 1"+ date="2013-04-23T20:00:31Z"+ content="""+Is this related or unrelated to the bug you filed at [[Resource_exhausted]]?++I tried this test, and noticed that it was taking the assistant rather a long time to get to the 10 thousand file threshhold where it makes a batch commit. A small change to a better data structure for its queue reduced that time from probably 10 minutes to 2.5. ++I was unable to reproduce any problem with the webapp. Please provide lots of details to back up \"it just crashes the GUI\".++The main problem with this directory tree is that it has more directories than inotify can watch, in the default configuration. +So after it adds the first 8192 directories, it begins failing to watch any more, and printing a message about you needing to increase the inotify limits for each additional directory. I don't think that 51 thousand directories is a particularly realistic amount for any real-world usage of git-annex. (It will also break file manager, dropbox, etc, which all use inotify in the same way.)++The other main time sink is that git-annex needs to run `git hash-object` once per file to stage its symlink. That is a lot of processes to run, and perhaps it could be sped up by using `git fast-import`.+"""]]
@@ -0,0 +1,47 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawm5iosFbL2By7UFeViqkc6v-hoAtqILeDA"+ nickname="Laszlo"+ subject="comment 2"+ date="2013-04-24T06:30:16Z"+ content="""+Hi,++First of all thank you for your time looking into my bug. I try to research more from my side.++The 'Resource exhausted' bugreport +(which lost its title, and could not click on it to add this testcase as a comment)+was tested on real data, my own working directory (a copy of it).+This bugreport is tested on the output of this small shell script.++None of them succeeded to import, and I quickly assumed it is the exact same.++So I will test again, raising the ulimit to 81920, and report.++ The main problem with this directory tree is that it has more directories than inotify can watch, in the default configuration++I would be perfectly fine if I could configure git-annex to sync those directory only once a month or once a week+(ie. check for update once a week). So no need to watch it real time, those are my archived work files.++ I don't think that 51 thousand directories is a particularly realistic amount for any real-world usage of git-annex.++Well, it is not 25000 dir in a single a folder, but rather something like this:++ work_done/2009/workname/back9/back8/back7/back6/back5++Where each 'backX' contains a whole backup the work until it. +So the directory structure is a bit more deep, and no 25000 subdirectory in a single dir. +But the overall numbers are right.++If I could somehow mark this **work_done** dir to not sync real time (or work_done/2008,work_done/2009,work_done/2010,work_done/2011,work_done/2012 subdir in them), +then my whole issue would vanish.++I only want to use git-annex to have a backup of this directory. +In case of laptop theft, or misfunction I could have a backup. +I dont need live sync anywhere, I have directories which I know I will not touch for months.++Best,+ Laszlo++++"""]]
@@ -0,0 +1,20 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawm5iosFbL2By7UFeViqkc6v-hoAtqILeDA"+ nickname="Laszlo"+ subject="comment 3"+ date="2013-04-24T09:10:20Z"+ content="""+ (It will also break file manager, dropbox, etc, which all use inotify in the same way.)++I beg to differ: with dropbox I handle my scrapbook(1) folder, +which means 130 thousand files for over 2 years now without problem between three computers.++ ~/Dropbox/scrapbook$ ls -R -1 |wc -l+ 130263++Don't get me wrong. I'm not complaining, I only give you a completely unrelated usecase, +which requires also high number of files handling. And in that case the 81 thousand ulimit would not help either.++(1): https://addons.mozilla.org/hu/firefox/addon/scrapbook/++"""]]
@@ -0,0 +1,11 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ nickname="joey"+ subject="comment 4"+ date="2013-04-24T15:05:33Z"+ content="""+You're confusing number of files (inotify doesn't care) with number of directories (inotify does care).++Dropbox is on record about being limited in the number of directories it can watch without adjusting the inotify limit. +<https://www.dropbox.com/help/145>+"""]]
@@ -0,0 +1,15 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ nickname="joey"+ subject="comment 5"+ date="2013-04-24T15:30:04Z"+ content="""+I found a bug in the webapp thanks to this stress test. When inotify goes over limit, it displays a message about how to fix it..+But it displays that message over and over for each file. The result is a constantly updating very large web page. ++Unless you tell me differently, I'm going to assume that's what the GUI crash you referred to was, since it can make a web browser very slow.++I've fixed this problem. Now when it goes over limit, the webapp will just display this:++[[/assistant/inotify_max_limit_alert.png]]+"""]]
@@ -0,0 +1,14 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ nickname="joey"+ subject="comment 6"+ date="2013-04-24T17:26:39Z"+ content="""+I put in a further change to reduce the number of alerts shown in the webapp when bulk adding files. This probably quadrupled the speed or more, even when the webapp was not running, as updating an alert every time a file was added was a lot of unnecessary work.++After these changes, it adds the first 10 thousand files in 35 minutes, on my five year old netbook. It should scale linear+(aside from git's own scalability issues with a lot of files, which I don't think are very bad under 1 million files),+so adding all 100 thousand files should take 6 hours or so.++I'm interested to see what results you get, compared with before..+"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ nickname="joey"+ subject="comment 7"+ date="2013-04-24T21:02:55Z"+ content="""+A few more changes got the rate down to 21 minutes per 10 thousand files. Estimate 3.5 hours for all.+"""]]
@@ -0,0 +1,57 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawm5iosFbL2By7UFeViqkc6v-hoAtqILeDA"+ nickname="Laszlo"+ subject="Definite improvement"+ date="2013-05-03T06:27:12Z"+ content="""+Hi,++I have just tried it out again with the latest (20130501) version.++It is really nice to see you have been working on it, and it have improved tremendously!+The logging issue solved, and logrotates even, and it finished importing without crashing!++Remaining polishing things:++a)+The import time is not as good (as you write), it slowes itself down.+It is true the first 10000 files import in about an hour, but it finishes with everything+in 9 hours 20 minutes.+(on a normal laptop, the last 5000 file portion took more then 2 hours)++b) +Every startup means rechecksuming everything, so it means the second start took also around 8-12 hours.+(I don't know exactly because it finished somewhere during the night, but it was longer then 8 hours)+I don't think rechecksuming is necessary at all, if the filename, size and date have not modified, +then why rechecksuming (sha) it?+++c) +It is leaking. +At the second startup, it reported it successfully added:+ Added 2375 files 5 files probe25366.txt++I have not touched the directory. ls confirms leaking:++ After first start (importing):+ annex_many/.git$ ls -lR |wc -l+ 770199++ After second startup:+ annex_many/.git$ ls -lR |wc -l+ 788351++d) Without ulimit raise, it does not work at all.+I think it could be solved by not watching each and every directory all the time.+Every users will likely have a working directory and some which he don't intend to touch/modify at all.+Some usecases: photo archiving, video archiving, finished work archiving, etc++All the above results with the stress test script. +I would love to have a confirmation by a thirdparty.++Overall I'm impressed with the work you have done.++Best, + Laszlo++"""]]
@@ -0,0 +1,52 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawm5iosFbL2By7UFeViqkc6v-hoAtqILeDA"+ nickname="Laszlo"+ subject="Maybe it is not leaking after all"+ date="2013-05-03T18:37:48Z"+ content="""+I have been working the whole day zipping up (tar.gz) all the unused directories.+Now my real data dir looks like this:++ ./annex_real/work_done$ du -hs .+ 1,1G .+ Has 9088 files and 1608 directories in total:+ ./annex_real/work_done$ ls -R1l |grep \\-r |wc -l+ 9088+ ./annex_real/work_done$ ls -R1l |grep ^d |wc -l+ 1608++When I first started git annex, it added 5492 files, then next time it added the missing 3596 files. Then it stopped adding files.+From the gui everything looked fine even at the first start (performed startup scan), even in the log files (daemon.log.x) was nothing suspicious.++ ./annex_real/work_done$ for i in ../.git/annex/daemon.log.*; do echo $i; cat $i |grep files; done+ ../.git/annex/daemon.log.1+ ../.git/annex/daemon.log.2+ ../.git/annex/daemon.log.3+ ../.git/annex/daemon.log.4+ [2013-05-03 20:03:34 CEST] Committer: Adding 3596 files+ ../.git/annex/daemon.log.5+ [2013-05-03 19:15:22 CEST] Committer: Adding 5492 files++As you can see, this case is not a stress test at all, +it is really the minimal test case, 1.1GB diskspace, 9088 files and a thousand dirs. +The real question is, why git-annex miss at the first startup 3492 files (ie. adding all the files).++It would help tremendously, if it would display at startup how many files he found, +and when it adds, then how many left to be added.+Something like this:++ (scanning...) [2013-05-03 20:03:14 CEST] Watcher: Performing startup scan+ (started...)+ [2013-05-03 20:03:34 CEST] Committer: Found 9088 files+ [2013-05-03 20:03:34 CEST] Committer: Adding 3596 files of 9088 remaining files (9088 in total)+ ....+ [2013-05-03 20:05:04 CEST] Committer: Adding 1492 files of 5492 remaining files (9088 in total)+ ....+ [2013-05-03 20:06:02 CEST] Committer: Adding 4000 files of 4000 remaining files (9088 in total)++So it is definietly a bug, and I stuck how to debug it further. Everything looks just fine.++Best, + Laszlo++"""]]
@@ -0,0 +1,30 @@+#What steps will reproduce the problem?++1. Create a new repository in indirect mode.++2. Add the same file twice under a different name. Now you have two symlinks pointing to the same file under .git/annex/objects/++3. Switch to direct mode. The first symlink gets replaced by the actual file. The second stays unchanged, pointing to nowhere. But git annex whereis still reports it has a copy.++4. Delete the first file. Git annex whereis still thinks it has a copy of file 2, which is not true -> data loss.++#What is the expected output? What do you see instead?++When switching to direct mode, both symlinks should be replaced by a copy (or at least a hardlink) of the actual file.++> The typo that caused this bug is fixed. --[[Joey]] ++#What version of git-annex are you using? On what operating system?++3.20130107 on Arch Linux x64++#Please provide any additional information below.++The deduplication performed by git-annex is very dangerous in itself+because files with identical content become replaced by references to the+same file without the user necessarily being aware. Think of the user+making a copy of a file, than modifying it. He would expect to end up with+two files, the unchanged original and the modified copy. But what he really+gets is two symlinks pointing to the same modified file.++> I agree, it now copies rather than hard linking. [[done]] --[[Joey]]
@@ -0,0 +1,51 @@+What steps will reproduce the problem?++Create two repositories by running git annex webapp. Sync them by linking them to the same xmpp account. Add files on both sides.++What is the expected output? What do you see instead?++I expect the same file to show up on both sides with the same contents. Instead adding a file on any side creates a broken link with the same name on the other side. For example:++Side A:++ $ ls -la+ total 20+ drwxrwxr-x 3 pedrocr pedrocr 4096 Jan 3 19:24 .+ drwxr-xr-x 55 pedrocr pedrocr 4096 Jan 3 19:19 ..+ lrwxrwxrwx 1 pedrocr pedrocr 178 Jan 3 19:22 bar -> .git/annex/objects/FQ/vV/SHA256E-s8--12a61f4e173fb3a11c05d6471f74728f76231b4a5fcd9667cef3af87a3ae4dc2/SHA256E-s8--12a61f4e173fb3a11c05d6471f74728f76231b4a5fcd9667cef3af87a3ae4dc2+ lrwxrwxrwx 1 pedrocr pedrocr 178 Jan 3 19:20 foo -> .git/annex/objects/g7/9v/SHA256E-s4--7d865e959b2466918c9863afca942d0fb89d7c9ac0c99bafc3749504ded97730/SHA256E-s4--7d865e959b2466918c9863afca942d0fb89d7c9ac0c99bafc3749504ded97730+ drwxrwxr-x 7 pedrocr pedrocr 4096 Jan 3 19:24 .git+ -rw-r--r-- 1 pedrocr pedrocr 0 Jan 3 19:24 testing++"foo" and "bar" are broken links that were created on Side B++Side B:++ $ ls -la+ total 24+ drwxrwxr-x 3 pedrocr pedrocr 4096 Jan 3 19:24 .+ drwx------ 42 pedrocr pedrocr 4096 Jan 3 19:18 ..+ -rw-r--r-- 1 pedrocr pedrocr 8 Jan 3 19:22 bar+ -rw-r--r-- 1 pedrocr pedrocr 4 Jan 3 19:20 foo+ drwxrwxr-x 7 pedrocr pedrocr 4096 Jan 3 19:24 .git+ lrwxrwxrwx 1 pedrocr pedrocr 178 Jan 3 19:24 testing -> .git/annex/objects/pX/ZJ/SHA256E-s0--e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855/SHA256E-s0--e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855++In this case "testing" is a broken link and was created on Side A.++What version of git-annex are you using? On what operating system?++ $ ./git-annex version+ git-annex version: 3.20130102++ $ uname -a+ Linux wintermute 3.2.0-35-generic #55-Ubuntu SMP Wed Dec 5 17:45:18 UTC 2012 i686 i686 i386 GNU/Linux++ $ lsb_release -a+ Distributor ID: Ubuntu+ Description: Ubuntu 12.04.1 LTS+ Release: 12.04+ Codename: precise++> [[done]]; the webapp now detects when XMPP pairing has been used but no+> transfer remote is available, and prompts the user to create one.+> --[[Joey]]
@@ -0,0 +1,31 @@+### Please describe the problem.+./git-annex test fails:+ + ### Failure in: git-annex unused/dropunused + dropunused failed+ Cases: 1 Tried: 1 Errors: 0 Failures: 1 ++### What steps will reproduce the problem?+./git-annex test++### What version of git-annex are you using? On what operating system?+4.20130723-206-g1647361+++debian 7.1 i686++### Please provide any additional information below.++I'm not sure if there is a way to get extra information out of the test harness. I had a quick look at the code and couldn't see anything obvious.+I've tried a clean and rebuild and it reappears, so if there is more information you need just let me know what.++[[!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.+"""]]++> Forgot to update the test suite for this behavior change.+> [[done]] --[[Joey]]
@@ -0,0 +1,46 @@+What steps will reproduce the problem?++1. Open the assistant with git-annex webapp+2. Click add another repository+3. Choose "add another repository"+4. Use "/home/pierre/testme" (try and get the problem with a new directory or an existing directory)+5. Press "Make Repository"+5. Choose "Keep the repository separate" ++What is the expected output? What do you see instead?++Go to the created repository but the interface hangs forever+I have 4 git-annex processes that use no CPUs.+I can still use the UI by clicking around with success or even shutdown the daemon.+If I shutdown the daemon, all git-annex process gets killed.++What version of git-annex are you using? On what operating system?++It is said to be git-annex version: 4.20130324 but it is actually 4.20130405 (known bug)++Please provide any additional information below.+++OS: Arch linux, bin package (not installed from source)+All tests are OK+Nothing happens on the log pages++This is so weird that I would like to see the log file but I cannot find it. I have looked at /var/log without success.+I have tried other available version on Arch linux (AUR git-annex-bin, AUR git-annex-standalone, haskell-web git-annex) and they all exhibit the same problem.+At that stage, what I would like to be able is to try to figure out what is going on using the log file.+Thanks++> This could happen when using the amd64 standalone build, because I +> forgot to install curl into its chroot, so it was not included in the+> bundle. If the host system also lacked curl, or something prevented+> curl from working, it would fail like this.+> +> I've included curl into the amd64 standalone build. I've also made the+> assistant fall back to using a built-in http client if it is built+> without curl.+> +> None of which helps at all with the Arch git-annex-bin hack, since+> that binary will be built with a working curl (when my amd64 standalone+> builder builds it), and then installed onto a system, that,+> apparently, has a broken curl. Which is one of many reasons I cannot+> support that hack. [[done]] --[[Joey]]
@@ -0,0 +1,33 @@+What steps will reproduce the problem?++After creating new remote repositories in the webapp there's no option to delete them++What is the expected output? What do you see instead?++Some option to delete a repository, just like I can disable sync or change the config of a remote++What version of git-annex are you using? On what operating system?++ $ ./git-annex version+ git-annex version: 3.20130102++ $ uname -a+ Linux wintermute 3.2.0-35-generic #55-Ubuntu SMP Wed Dec 5 17:45:18 UTC 2012 i686 i686 i386 GNU/Linux++ $ lsb_release -a+ Distributor ID: Ubuntu+ Description: Ubuntu 12.04.1 LTS+ Release: 12.04+ Codename: precise++[[!tag /design/assistant]]++> Status: You can delete the current repository. You can also remove+> repositories from the list of remotes (without deleting their content)+> and you can tell it you want to stop using a remote, and it will+> suck all content off that remote until it's empty.+> +> Still todo: Detect when a remote has been sucked dry, and actually delete+> it. --[[Joey]]++>> [[done]] --[[Joey]]
@@ -0,0 +1,24 @@+### Please describe the problem.++TransferScanner crashes trying to add a file.++### What steps will reproduce the problem?++Start the web app.++### What version of git-annex are you using? On what operating system?++4.20130709-g339d1e0 on Android.++### Please provide any additional information below.++There was a whole stack of nulls in some of those log lines as well. I've ++[[!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++TransferScanner crashed: unknown response from git cat-file ("refs/heads/git-annex:289/20f/SHA256E-s85883241--3bf01cfd6a422f9b661ed335e6142bbdaf899cd71587bb3cc812256064c7071e missing",refs/heads/git-annex:289/20f/SHA256E-s85883241--3bf01cfd6a422f9b661ed335e6142bbdaf899cd71587bb3cc812256064c7071e\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00(7981 more elided)\00.log)+[2013-07-16 15:19:26 NZST] TransferScanner: warning TransferScanner crashed: unknown response from git cat-file ("refs/heads/git-annex:289/20f/SHA256E-s85883241--3bf01cfd6a422f9b661ed335e6142bbdaf899cd71587bb3cc812256064c7071e missing",refs/heads/git-annex:289/20f/SHA256E-s85883241--3bf01cfd6a422f9b661ed335e6142bbdaf899cd71587bb3cc812256064c7071e\00\00\00\00\00(7991 more elided)\00.log)+# End of transcript or log.+"""]]
@@ -0,0 +1,51 @@+What steps will reproduce the problem?++I added a (encrypted) ssh remote and everything worked fine. Now I marked the remote as dead, but git-annex still tries to upload to this remote. I recognize this because it asks for my ssh and gpg keys passwords. ++While transfering (or asking for the password), `git annex status` shows the following:+<pre>+supported backends: SHA256E SHA1E SHA512E SHA224E SHA384E SHA256 SHA1 SHA512 SHA224 SHA384 WORM URL+supported remote types: git S3 bup directory rsync web hook+trusted repositories: 0+semitrusted repositories: 2+ 00000000-0000-0000-0000-000000000001 -- web+ cd16b9c6-f464-11e1-9845-8749687232d2 -- here (Dell)+untrusted repositories: 0+dead repositories: 7+ 11379fa0-ecd6-49e2-9bec-24fc19cc7b9f -- vserver.dbruhn.de_annex+ 2195e036-d2ef-4357-8c89-a9aaec23ebdc -- vserver-plain+ 4d066ea1-fb9f-45fd-990a-5c5c836f530e -- inTmp+ bb276045-6ba6-488f-88d0-39a3c5f5134d -- vserver-enc+ c49f3372-3fcf-49fc-b626-73ba4454c172 -- annexBare (bareAnnex)+ e52645b3-bfb6-457d-b281-967353919e29 -- AnnexUSBFAT+ ea3d6acc-716c-48e8-9b6b-993b90dcc1db -- vserver2+transfers in progress: + uploading Schmidt/somefile.m4a+++ to vserver2+available local disk space: 43 gigabytes (+1 megabyte reserved)+temporary directory size: 389 megabytes (clean up with git-annex unused)+local annex keys: 23+local annex size: 396 megabytes+known annex keys: 19+known annex size: 396 megabytes+bloom filter size: 16 mebibytes (0% full)+backend usage: + SHA256E: 42+</pre>++As you can see, the `vserver2` remote is marked as dead but git-annex still tries to upload. This problem keeps occuring even after restarts. ++What is the expected output? What do you see instead?++If I do not get the `dead` status wrong, git-annex should not use these remotes.+++What version of git-annex are you using? On what operating system?++git-annex HEAD from yesterdays git. Ubuntu 12.10++Please provide any additional information below.++[[!tag /design/assistant moreinfo]]
@@ -0,0 +1,16 @@+The following occurs in a directory that is shared on an NFS server:++ /media/mybook/movies $ git init+ Initialized empty Git repository in /media/mybook/movies/.git/+ /media/mybook/movies $ git annex init mybook-movies+ init mybook-movies + git-annex: waitToSetLock: resource exhausted (No locks available)+ failed+ git-annex: init: 1 failed+ /media/mybook/movies $++This happens reliably. Is there any way around it? I have shell+access on the NFS server, but it is a NAS, so I don't think it is+capable of running git-annex.++[[done]]
@@ -0,0 +1,7 @@+I'd like to be able to restore my data from S3/Glacier following a catastrophic loss of information.++As I understand it, git-annex doesn't solve this problem for me because it only stores file *contents* in S3/Glacier. A restore-from-nothing requires both the file contents and also the file names and metadata, which git-annex doesn't store in S3.++I'm still feeling my way around git-annex, but I think it will probably be sufficient for my purposes to set up a cron job to push my annex to github. But I think it would be helpful if git-annex could take care of this automatically.++> Based on the comments, this is [[done]] --[[Joey]]
@@ -0,0 +1,614 @@+### Please describe the problem.++I have two machines connected with annex assistant via XMPP and S3. I placed a file into the annex directory on one computer, and it fairly immediately transferred to the other, as expected. However the resulting file appears to be truncated.++### What steps will reproduce the problem?++Unknown, I haven't noticed this happen before.++### What version of git-annex are you using? On what operating system?++The sending end was from commit ef1fd09c5c1c3950727f0760df36075e45192b33 (Tue Jul 2 16:52:43 2013 +0000), the receiving end was at 1c16de8ebcef6c1920a8437af380f8aea5a2c535 (Wed Jun 12 20:31:43 2013 +0000). Both on Ubuntu 13.04.++### Please provide any additional information below.++Details of the file at the sending end:++[[!format text """+$ stat git-annex_4.20130627_amd64.deb + Bestand: ‘git-annex_4.20130627_amd64.deb’+ Grootte: 10140744 Blokken: 19808 IO-blok: 4096 normaal bestand+Apparaat: 801h/2049d Inode: 27394054 Koppelingen: 1+Toegang: (0644/-rw-r--r--) UID: ( 1000/ robin) GID: ( 1000/ robin)+Toegang: 2013-07-03 21:57:26.774297184 +1200+Gewijzigd: 2013-07-03 21:57:25.526306867 +1200+Veranderd: 2013-07-03 21:57:26.770297214 +1200+"""]]++and at the receiving end:++[[!format text """+ Bestand: ‘git-annex_4.20130627_amd64.deb’+ Grootte: 10105870 Blokken: 19760 IO-blok: 4096 normaal bestand+Apparaat: 16h/22d Inode: 6167474 Koppelingen: 1+Toegang: (0664/-rw-rw-r--) UID: ( 1000/ robin) GID: ( 1000/ robin)+Toegang: 2013-07-03 10:58:02.653724449 +0100+Gewijzigd: 2013-07-03 10:58:02.365724461 +0100+Veranderd: 2013-07-03 10:58:02.369724461 +0100+"""]]++(it was coincidence I expect that it was a deb of git-annex I'd just made :)++Some more poking indicates that it's not strictly a truncation, not too far into the file, the content changes:++Sent:++[[!format text """+00002a0 4ea6 bb1e 4c18 d54e b836 b19a d9a2 6314+00002b0 4a0d 2954 d6aa fb42 2699 7437 df7f 6a6d+00002c0 7f7f 4f1c bce5 5e0f 5cc3 d5b1 e896 2829+00002d0 4ed2 8426 9496 a669 3dd1 d6ed 26dd 3b1d+00002e0 4c2a 4ef2 e29b 778c 4818 0e49 990e 314c+"""]]++Received:++[[!format text """+00002a0 4ea6 bb1e 4c18 d54e b836 b19a d9a2 6314+00002b0 544a aa29 42d6 99fb 3726 7f74 6ddf 7f6a+00002c0 1c7f e54f 0fbc c35e b15c 96d5 29e8 d228+00002d0 264e 9684 6994 d1a6 ed3d ddd6 1d26 2a3b+00002e0 f24c 9b4e 8ce2 1877 4948 0e0e 4c99 1931+"""]]++Oddly, there seems to be a pattern in the difference of the first incorrect row, it looks like kind of like strange endian weirdness rearranging things.++aabb ccdd eeff gghh++becomes:++bbdd ffcc hhee ..gg++where the .. comes from further along the pattern.++Deleting and re-adding the file doesn't cause the new version to appear, but that's presumably because it's addressing by SHA, so it doesn't see that as a change.++[[!format text """+# If you can, paste a complete transcript of the problem occurring here.+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log++Sending machine:++(started...) [2013-07-03 21:57:17 NZST] XMPPSendPack: Syncing with eythian+[2013-07-03 21:57:17 NZST] XMPPReceivePack: Syncing with eythian+Everything up-to-date+[2013-07-03 21:57:25 NZST] Committer: Adding git-annex..amd64.deb++add git-annex_4.20130627_amd64.deb (checksum...) [2013-07-03 21:57:25 NZST] Committer: Committing changes to git+[2013-07-03 21:57:25 NZST] Pusher: Syncing with backups+To /mnt/backups/annex+ 2783051..69b3503 git-annex -> synced/git-annex+ 0b10576..e1b6f29 master -> synced/master+(gpg) Already up-to-date.+Already up-to-date.+[2013-07-03 21:57:26 NZST] XMPPSendPack: Syncing with eythian+[2013-07-03 21:57:26 NZST] Committer: Adding git-annex..amd64.deb+ok+(Recording state in git...)+(Recording state in git...)+++add git-annex_4.20130627_amd64.deb (checksum...) [2013-07-03 21:57:26 NZST] Committer: Committing changes to git++0% 96.0KB/s 1m42s[2013-07-03 21:57:27 NZST] Pusher: Syncing with backups+To /mnt/backups/annex+ 69b3503..026ba8e git-annex -> synced/git-annex+To xmpp::eythian@jabber.kallisti.net.nz+ 2783051..69b3503 git-annex -> refs/synced/9e67bebc-655c-47da-97a0-2bb02bbbc580/ZXl0aGlhbkBqYWJiZXIua2FsbGlzdGkubmV0Lm56/git-annex+ 0b10576..e1b6f29 master -> refs/synced/9e67bebc-655c-47da-97a0-2bb02bbbc580/ZXl0aGlhbkBqYWJiZXIua2FsbGlzdGkubmV0Lm56/master+1% 127.9KB/s 1m16s[2013-07-03 21:57:27 NZST] XMPPSendPack: Syncing with eythian+25% 631.7KB/s 12sTo xmpp::eythian@jabber.kallisti.net.nz+ 69b3503..35b3fd8 git-annex -> refs/synced/9e67bebc-655c-47da-97a0-2bb02bbbc580/ZXl0aGlhbkBqYWJiZXIua2FsbGlzdGkubmV0Lm56/git-annex+[2013-07-03 21:57:30 NZST] XMPPSendPack: Syncing with eythian+51% 1.2MB/s 4sEverything up-to-date+[2013-07-03 21:57:34 NZST] Transferrer: Uploaded git-annex..amd64.deb+[2013-07-03 21:57:34 NZST] Pusher: Syncing with backups+To /mnt/backups/annex+ 026ba8e..1eb67d8 git-annex -> synced/git-annex+[2013-07-03 21:57:35 NZST] XMPPSendPack: Syncing with eythian+To xmpp::eythian@jabber.kallisti.net.nz+ 35b3fd8..1eb67d8 git-annex -> refs/synced/9e67bebc-655c-47da-97a0-2bb02bbbc580/ZXl0aGlhbkBqYWJiZXIua2FsbGlzdGkubmV0Lm56/git-annex+[2013-07-03 21:57:36 NZST] XMPPSendPack: Syncing with eythian+Everything up-to-date+[2013-07-03 21:58:03 NZST] XMPPReceivePack: Syncing with eythian+Already up-to-date.+[2013-07-03 21:58:04 NZST] XMPPReceivePack: Syncing with eythian+[2013-07-03 22:09:44 NZST] XMPPSendPack: Syncing with eythian+To xmpp::eythian@jabber.kallisti.net.nz+ 1eb67d8..822dbb1 git-annex -> refs/synced/9e67bebc-655c-47da-97a0-2bb02bbbc580/ZXl0aGlhbkBqYWJiZXIua2FsbGlzdGkubmV0Lm56/git-annex+[2013-07-03 22:09:45 NZST] XMPPSendPack: Syncing with eythian+Everything up-to-date++Receiving machine:++[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from 0/ Nothing"]+[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from a18/msn Nothing"]+[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from a22/msn Nothing"]+[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from a20/msn Nothing"]+[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from b24/msn Nothing"]+[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from c27/msn Nothing"]+[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from c25/msn Nothing"]+[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from c16/msn Nothing"]+[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from c22/msn Nothing"]+[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from c21/msn Nothing"]+[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from d23/msn Nothing"]+[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from d24/msn Nothing"]+[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from d15/msn Nothing"]+[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from d27/msn Nothing"]+[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from d15/msn Nothing"]+[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from d21/msn Nothing"]+[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from d24/msn Nothing"]+[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from f21/msn Nothing"]+[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from h24/msn Nothing"]+[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from h24/msn Nothing"]+[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from h26/msn Nothing"]+[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from j22/msn Nothing"]+[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from j20/msn Nothing"]+[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from j23/msn Nothing"]+[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from k22/msn Nothing"]+[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from k26/msn Nothing"]+[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from k26/msn Nothing"]+[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from k22/msn Nothing"]+[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from l26/msn Nothing"]+[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from l17/msn Nothing"]+[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from m32/msn Nothing"]+[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from m23/msn Nothing"]+[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from m18/msn Nothing"]+[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from m21/msn Nothing"]+[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from o20/msn Nothing"]+[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from s24/msn Nothing"]+[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from s24/msn Nothing"]+[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from s19/msn Nothing"]+[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from s21/msn Nothing"]+[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from s25/msn Nothing"]+[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from s19/msn Nothing"]+[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from s20/msn Nothing"]+[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from s25/msn Nothing"]+[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from s16/msn Nothing"]+[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from s26/msn Nothing"]+[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from w23/msn Nothing"]+[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from w20/msn Nothing"]+[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from e7/27209141331372845435882587 Nothing"]+[2013-07-03 10:57:16 BST] XMPPClient: sending to new client: e7/27209141331372845435882587 "Pushing \"e57\" (CanPush (UUID \"2c0b788e-7b2d-474b-8963-d889b9556229\") [0b10576100879220b2f50bf53f552befe2fda8de,27830516f221de09f7906954ba0bcc6b3dd31680])"+[2013-07-03 10:57:16 BST] XMPPClient: sending to new client: e7/27209141331372845435882587 "Pushing \"e57\" (PushRequest (UUID \"2c0b788e-7b2d-474b-8963-d889b9556229\"))"+[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from m9/Adium Nothing"]+[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from p6/NEW_HOTNESS Nothing"]+[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from 0/ Nothing"]+[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from e7/27209141331372845435882587 Just (Element {elementName = Name {nameLocalName = \"git-annex\", nameNamespace = Just \"git-annex\", namePrefix = Nothing}, elementAttributes = [], elementNodes = []})"]+[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from 0/ Nothing"]+[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from e7/27209141331372845435882587 Just (Element {elementName = Name {nameLocalName = \"git-annex\", nameNamespace = Just \"git-annex\", namePrefix = Nothing}, elementAttributes = [(Name {nameLocalName = \"query\", nameNamespace = Nothing, namePrefix = Nothing},[ContentText \"\"])], elementNodes = []})","QueryPresence"]+[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from e7/27209141331372845435882587 Just (Element {elementName = Name {nameLocalName = \"git-annex\", nameNamespace = Just \"git-annex\", namePrefix = Nothing}, elementAttributes = [(Name {nameLocalName = \"push\", nameNamespace = Nothing, namePrefix = Nothing},[ContentText \"a23dd126-7bb7-42ce-b15a-b01990df5f2a\"])], elementNodes = []})","NotifyPush [UUID \"a23dd126-7bb7-42ce-b15a-b01990df5f2a\"]"]+[2013-07-03 10:57:17 BST] XMPPClient: push notification for+[2013-07-03 10:57:17 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","symbolic-ref","HEAD"]+[2013-07-03 10:57:17 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","refs/heads/master"]+[2013-07-03 10:57:17 BST] XMPPClient: received: ["Presence from e7/27209141331372845435882587 Just (Element {elementName = Name {nameLocalName = \"git-annex\", nameNamespace = Just \"git-annex\", namePrefix = Nothing}, elementAttributes = [(Name {nameLocalName = \"query\", nameNamespace = Nothing, namePrefix = Nothing},[ContentText \"\"])], elementNodes = []})","QueryPresence"]+[2013-07-03 10:57:17 BST] XMPPClient: received: ["Presence from 0/ Nothing"]+[2013-07-03 10:57:17 BST] XMPPClient: received: ["Presence from 0/ Nothing"]+[2013-07-03 10:57:17 BST] XMPPClient: received: ["Presence from 0/ Nothing"]+[2013-07-03 10:57:17 BST] XMPPClient: received: ["Pushing \"e57\" (CanPush (UUID \"9e67bebc-655c-47da-97a0-2bb02bbbc580\") [0b10576100879220b2f50bf53f552befe2fda8de,27830516f221de09f7906954ba0bcc6b3dd31680])"]+[2013-07-03 10:57:17 BST] XMPPClient: ignoring CanPush with known shas+[2013-07-03 10:57:17 BST] XMPPClient: received: ["Pushing \"e57\" (PushRequest (UUID \"9e67bebc-655c-47da-97a0-2bb02bbbc580\"))"]+[2013-07-03 10:57:17 BST] XMPPSendPack: started running push Pushing "e57" (PushRequest (UUID "9e67bebc-655c-47da-97a0-2bb02bbbc580"))+[2013-07-03 10:57:17 BST] XMPPClient: received: ["Presence from 0/ Nothing"]+[2013-07-03 10:57:17 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","symbolic-ref","HEAD"]+[2013-07-03 10:57:17 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","refs/heads/master"]+[2013-07-03 10:57:17 BST] call: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","branch","-f","synced/master"]+[2013-07-03 10:57:17 BST] XMPPSendPack: Syncing with eythian +[2013-07-03 10:57:17 BST] XMPPClient: sending: Pushing "e57" (StartingPush (UUID "2c0b788e-7b2d-474b-8963-d889b9556229"))+[2013-07-03 10:57:17 BST] call: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","push","eythian","git-annex:refs/synced/2c0b788e-7b2d-474b-8963-d889b9556229/ZXl0aGlhbkBqYWJiZXIua2FsbGlzdGkubmV0Lm56/git-annex","refs/heads/master:refs/synced/2c0b788e-7b2d-474b-8963-d889b9556229/ZXl0aGlhbkBqYWJiZXIua2FsbGlzdGkubmV0Lm56/master"]+[2013-07-03 10:57:17 BST] XMPPClient: to client: e7/27209141331372845435882587+[2013-07-03 10:57:17 BST] XMPPClient: received: ["Presence from 0/ Nothing"]+[2013-07-03 10:57:17 BST] XMPPClient: received: ["Pushing \"e57\" (StartingPush (UUID \"9e67bebc-655c-47da-97a0-2bb02bbbc580\"))"]+[2013-07-03 10:57:17 BST] XMPPReceivePack: started running push Pushing "e57" (StartingPush (UUID "9e67bebc-655c-47da-97a0-2bb02bbbc580"))+[2013-07-03 10:57:17 BST] XMPPClient: received: ["Pushing \"e57\" (ReceivePackOutput 1 \"<elided>\")"]+[2013-07-03 10:57:17 BST] XMPPReceivePack: Syncing with eythian +[2013-07-03 10:57:17 BST] XMPPClient: NetMessager stored Pushing "e57" (ReceivePackOutput 1 "<elided>") in SendPack inbox "e57"+[2013-07-03 10:57:17 BST] chat: git ["receive-pack","/home/robin/Bureaublad/annex"]+[2013-07-03 10:57:17 BST] XMPPClient: received: ["Pushing \"e57\" (ReceivePackOutput 2 \"<elided>\")"]+[2013-07-03 10:57:17 BST] XMPPClient: sending: Pushing "e57" (ReceivePackOutput 1 "<elided>")+[2013-07-03 10:57:17 BST] XMPPClient: NetMessager stored Pushing "e57" (ReceivePackOutput 2 "<elided>") in SendPack inbox "e57"+[2013-07-03 10:57:17 BST] XMPPClient: to client: e7/27209141331372845435882587+[2013-07-03 10:57:17 BST] XMPPClient: sending: Pushing "e57" (ReceivePackOutput 2 "<elided>")+[2013-07-03 10:57:17 BST] XMPPClient: to client: e7/27209141331372845435882587+[2013-07-03 10:57:17 BST] XMPPClient: sending: Pushing "e57" (ReceivePackOutput 3 "<elided>")+[2013-07-03 10:57:17 BST] XMPPClient: to client: e7/27209141331372845435882587+[2013-07-03 10:57:17 BST] XMPPClient: received: ["Pushing \"e57\" (ReceivePackOutput 3 \"<elided>\")"]+[2013-07-03 10:57:17 BST] XMPPClient: NetMessager stored Pushing "e57" (ReceivePackOutput 3 "<elided>") in SendPack inbox "e57"+[2013-07-03 10:57:17 BST] XMPPClient: received: ["Pushing \"e57\" (ReceivePackOutput 4 \"<elided>\")"]+[2013-07-03 10:57:17 BST] XMPPClient: NetMessager stored Pushing "e57" (ReceivePackOutput 4 "<elided>") in SendPack inbox "e57"+[2013-07-03 10:57:17 BST] XMPPClient: received: ["Pushing \"e57\" (ReceivePackOutput 5 \"<elided>\")"]+[2013-07-03 10:57:17 BST] XMPPClient: NetMessager stored Pushing "e57" (ReceivePackOutput 5 "<elided>") in SendPack inbox "e57"+[2013-07-03 10:57:17 BST] XMPPClient: sending: Pushing "e57" (SendPackOutput 1 "<elided>")+[2013-07-03 10:57:17 BST] XMPPClient: to client: e7/27209141331372845435882587+[2013-07-03 10:57:18 BST] XMPPClient: received: ["Pushing \"e57\" (SendPackOutput 1 \"<elided>\")"]+[2013-07-03 10:57:18 BST] XMPPClient: NetMessager stored Pushing "e57" (SendPackOutput 1 "<elided>") in ReceivePack inbox "e57"+[2013-07-03 10:57:18 BST] XMPPReceivePack: finished running push Pushing "e57" (StartingPush (UUID "9e67bebc-655c-47da-97a0-2bb02bbbc580")) True+[2013-07-03 10:57:18 BST] XMPPClient: sending: Pushing "e57" (ReceivePackDone ExitSuccess)+[2013-07-03 10:57:18 BST] XMPPClient: to client: e7/27209141331372845435882587+[2013-07-03 10:57:18 BST] XMPPClient: received: ["Pushing \"e57\" (ReceivePackDone ExitSuccess)"]+[2013-07-03 10:57Everything up-to-date+:18 BST] XMPPClient: NetMessager stored Pushing "e57" (ReceivePackDone ExitSuccess) in SendPack inbox "e57"+[2013-07-03 10:57:18 BST] XMPPSendPack: finished running push Pushing "e57" (PushRequest (UUID "9e67bebc-655c-47da-97a0-2bb02bbbc580")) True+[2013-07-03 10:57:21 BST] XMPPClient: received: ["Presence from a15/android_talk53f054b9e972 Nothing"]+[2013-07-03 10:57:26 BST] XMPPClient: received: ["Presence from e7/27209141331372845435882587 Just (Element {elementName = Name {nameLocalName = \"git-annex\", nameNamespace = Just \"git-annex\", namePrefix = Nothing}, elementAttributes = [(Name {nameLocalName = \"push\", nameNamespace = Nothing, namePrefix = Nothing},[ContentText \"a23dd126-7bb7-42ce-b15a-b01990df5f2a\"])], elementNodes = []})","NotifyPush [UUID \"a23dd126-7bb7-42ce-b15a-b01990df5f2a\"]"]+[2013-07-03 10:57:26 BST] XMPPClient: push notification for+[2013-07-03 10:57:26 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","symbolic-ref","HEAD"]+[2013-07-03 10:57:26 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","refs/heads/master"]+[2013-07-03 10:57:26 BST] XMPPClient: received: ["Presence from 0/ Nothing"]+[2013-07-03 10:57:26 BST] XMPPClient: received: ["Presence from e7/27209141331372845435882587 Just (Element {elementName = Name {nameLocalName = \"git-annex\", nameNamespace = Just \"git-annex\", namePrefix = Nothing}, elementAttributes = [(Name {nameLocalName = \"query\", nameNamespace = Nothing, namePrefix = Nothing},[ContentText \"\"])], elementNodes = []})","QueryPresence"]+[2013-07-03 10:57:26 BST] XMPPClient: received: ["Pushing \"e57\" (CanPush (UUID \"9e67bebc-655c-47da-97a0-2bb02bbbc580\") [e1b6f2944e7d082299cb1696c55d9064a11c4577,69b3503287d87c26989a755d0cc660c3c68f2c80])"]+[2013-07-03 10:57:26 BST] XMPPClient: sending: Pushing "e57" (PushRequest (UUID "2c0b788e-7b2d-474b-8963-d889b9556229"))+[2013-07-03 10:57:26 BST] XMPPClient: to client: e7/27209141331372845435882587+[2013-07-03 10:57:26 BST] XMPPClient: received: ["Presence from 0/ Nothing"]+[2013-07-03 10:57:26 BST] XMPPClient: received: ["Pushing \"e57\" (CanPush (UUID \"9e67bebc-655c-47da-97a0-2bb02bbbc580\") [e1b6f2944e7d082299cb1696c55d9064a11c4577,69b3503287d87c26989a755d0cc660c3c68f2c80])"]+[2013-07-03 10:57:26 BST] XMPPClient: sending: Pushing "e57" (PushRequest (UUID "2c0b788e-7b2d-474b-8963-d889b9556229"))+[2013-07-03 10:57:26 BST] XMPPClient: to client: e7/27209141331372845435882587+[2013-07-03 10:57:26 BST] XMPPClient: received: ["Pushing \"e57\" (StartingPush (UUID \"9e67bebc-655c-47da-97a0-2bb02bbbc580\"))"]+[2013-07-03 10:57:26 BST] XMPPReceivePack: started running push Pushing "e57" (StartingPush (UUID "9e67bebc-655c-47da-97a0-2bb02bbbc580"))+[2013-07-03 10:57:26 BST] XMPPReceivePack: Syncing with eythian +[2013-07-03 10:57:26 BST] chat: git ["receive-pack","/home/robin/Bureaublad/annex"]+[2013-07-03 10:57:26 BST] XMPPClient: sending: Pushing "e57" (ReceivePackOutput 1 "<elided>")+[2013-07-03 10:57:26 BST] XMPPClient: to client: e7/27209141331372845435882587+[2013-07-03 10:57:26 BST] XMPPClient: sending: Pushing "e57" (ReceivePackOutput 2 "<elided>")+[2013-07-03 10:57:26 BST] XMPPClient: to client: e7/27209141331372845435882587+[2013-07-03 10:57:27 BST] XMPPClient: received: ["Pushing \"e57\" (SendPackOutput 1 \"<elided>\")"]+[2013-07-03 10:57:27 BST] XMPPClient: NetMessager stored Pushing "e57" (SendPackOutput 1 "<elided>") in ReceivePack inbox "e57"+[2013-07-03 10:57:27 BST] XMPPClient: received: ["Pushing \"e57\" (SendPackOutput 2 \"<elided>\")"]+[2013-07-03 10:57:27 BST] XMPPClient: NetMessager stored Pushing "e57" (SendPackOutput 2 "<elided>") in ReceivePack inbox "e57"+[2013-07-03 10:57:27 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","git-annex"]+[2013-07-03 10:57:27 BST] XMPPClient: sending: Pushing "e57" (ReceivePackOutput 3 "<elided>")+[2013-07-03 10:57:27 BST] XMPPReceivePack: finished running push Pushing "e57" (StartingPush (UUID "9e67bebc-655c-47da-97a0-2bb02bbbc580")) True+[2013-07-03 10:57:27 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","--hash","refs/heads/git-annex"]+[2013-07-03 10:57:27 BST] XMPPClient: to client: e7/27209141331372845435882587+[2013-07-03 10:57:27 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","log","refs/heads/git-annex..27830516f221de09f7906954ba0bcc6b3dd31680","--oneline","-n1"]+[2013-07-03 10:57:27 BST] XMPPClient: sending: Pushing "e57" (ReceivePackOutput 4 "<elided>")+[2013-07-03 10:57:27 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","log","refs/heads/git-annex..69b3503287d87c26989a755d0cc660c3c68f2c80","--oneline","-n1"]+[2013-07-03 10:57:27 BST] XMPPClient: to client: e7/27209141331372845435882587+[2013-07-03 10:57:27 BST] feed: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","update-index","-z","--index-info"]+[2013-07-03 10:57:27 BST] XMPPClient: sending: Pushing "e57" (ReceivePackDone ExitSuccess)+[2013-07-03 10:57:27 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","diff-index","--raw","-z","-r","--no-renames","-l0","--cached","69b3503287d87c26989a755d0cc660c3c68f2c80"]+[2013-07-03 10:57:27 BST] XMPPClient: to client: e7/27209141331372845435882587+[2013-07-03 10:57:27 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","log","69b3503287d87c26989a755d0cc660c3c68f2c80..refs/heads/git-annex","--oneline","-n1"]+[2013-07-03 10:57:27 BST] call: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","update-ref","refs/heads/git-annex","69b3503287d87c26989a755d0cc660c3c68f2c80"]+[2013-07-03 10:57:27 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","ls-tree","-z","--","refs/heads/git-annex","uuid.log","remote.log","trust.log","group.log","preferred-content.log"]+[2013-07-03 10:57:27 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","symbolic-ref","HEAD"]+[2013-07-03 10:57:27 BST] TransferScanner: starting scan of [Remote { name ="eythian" }]+[2013-07-03 10:57:27 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","refs/heads/master"]+[2013-07-03 10:57:27 BST] Merger: merging refs/synced/9e67bebc-655c-47da-97a0-2bb02bbbc580/ZXl0aGlhbkBqYWJiZXIua2FsbGlzdGkubmV0Lm56/master into refs/heads/master+[2013-07-03 10:57:27 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","ls-files","--cached","-z","--"]+[2013-07-03 10:57:27 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","symbolic-ref","HEAD"]+[2013-07-03 10:57:27 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","refs/heads/master"]+[2013-07-03 10:57:27 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","--hash","refs/heads/master"]+[2013-07-03 10:57:27 BST] call: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex/.git/annex/merge/","merge","--no-edit","refs/synced/9e67bebc-655c-47da-97a0-2bb02bbbc580/ZXl0aGlhbkBqYWJiZXIua2FsbGlzdGkubmV0Lm56/master"]+Updating 0b10576..e1b6f29+Fast-forward+ git-annex_4.20130627_amd64.deb | 1 ++ 1 file changed, 1 insertion(+)+ create mode 120000 git-annex_4.20130627_amd64.deb+[2013-07-03 10:57:27 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","--hash","refs/heads/master"]+[2013-07-03 10:57:27 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","diff-tree","-z","--raw","--no-renames","-l0","-r","0b10576100879220b2f50bf53f552befe2fda8de","e1b6f2944e7d082299cb1696c55d9064a11c4577"]+[2013-07-03 10:57:27 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","git-annex"]+[2013-07-03 10:57:27 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","--hash","refs/heads/git-annex"]+[2013-07-03 10:57:27 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","log","refs/heads/git-annex..69b3503287d87c26989a755d0cc660c3c68f2c80","--oneline","-n1"]+[2013-07-03 10:57:27 BST] feed: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","update-index","-z","--index-info"]+[2013-07-03 10:57:27 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","diff-index","--raw","-z","-r","--no-renames","-l0","--cached","refs/heads/git-annex"]+[2013-07-03 10:57:28 BST] Watcher: add symlink git-annex_4.20130627_amd64.deb+[2013-07-03 10:57:28 BST] chat: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","hash-object","-t","blob","-w","--stdin"]+[2013-07-03 10:57:28 BST] Committer: committing 1 changes+[2013-07-03 10:57:28 BST] Committer: Committing changes to git+[2013-07-03 10:57:28 BST] XMPPClient: received: ["Presence from e7/27209141331372845435882587 Just (Element {elementName = Name {nameLocalName = \"git-annex\", nameNamespace = Just \"git-annex\", namePrefix = Nothing}, elementAttributes = [(Name {nameLocalName = \"push\", nameNamespace = Nothing, namePrefix = Nothing},[ContentText \"a23dd126-7bb7-42ce-b15a-b01990df5f2a\"])], elementNodes = []})","NotifyPush [UUID \"a23dd126-7bb7-42ce-b15a-b01990df5f2a\"]"]+[2013-07-03 10:57:28 BST] feed: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","update-index","-z","--index-info"]+[2013-07-03 10:57:28 BST] XMPPClient: push notification for+[2013-07-03 10:57:28 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","commit","--allow-empty-message","--no-edit","-m","","--quiet","--no-verify"]+[2013-07-03 10:57:28 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","symbolic-ref","HEAD"]+[2013-07-03 10:57:28 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","refs/heads/master"]+[2013-07-03 10:57:28 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","symbolic-ref","HEAD"]+[2013-07-03 10:57:28 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","refs/heads/master"]+[2013-07-03 10:57:28 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","--head","refs/heads/git-annex","HEAD"]+[2013-07-03 10:57:28 BST] XMPPClient: sending: Pushing "e30" (CanPush (UUID "2c0b788e-7b2d-474b-8963-d889b9556229") [e1b6f2944e7d082299cb1696c55d9064a11c4577,69b3503287d87c26989a755d0cc660c3c68f2c80])+[2013-07-03 10:57:28 BST] XMPPClient: received: ["Presence from e7/27209141331372845435882587 Just (Element {elementName = Name {nameLocalName = \"git-annex\", nameNamespace = Just \"git-annex\", namePrefix = Nothing}, elementAttributes = [(Name {nameLocalName = \"query\", nameNamespace = Nothing, namePrefix = Nothing},[ContentText \"\"])], elementNodes = []})","QueryPresence"]+[2013-07-03 10:57:28 BST] XMPPClient: exploded undirected message to clients e7/27209141331372845435882587+[2013-07-03 10:57:28 BST] XMPPClient: sending to new client: e7/27209141331372845435882587 "Pushing \"e57\" (CanPush (UUID \"2c0b788e-7b2d-474b-8963-d889b9556229\") [e1b6f2944e7d082299cb1696c55d9064a11c4577,69b3503287d87c26989a755d0cc660c3c68f2c80])"+[2013-07-03 10:57:28 BST] XMPPClient: received: ["Pushing \"e57\" (CanPush (UUID \"9e67bebc-655c-47da-97a0-2bb02bbbc580\") [e1b6f2944e7d082299cb1696c55d9064a11c4577,026ba8e7ba89bccd22f5ff31a26c82ee75641b55])"]+[2013-07-03 10:57:28 BST] XMPPClient: sending: Pushing "e57" (PushRequest (UUID "2c0b788e-7b2d-474b-8963-d889b9556229"))+[2013-07-03 10:57:28 BST] XMPPClient: received: ["Pushing \"e57\" (StartingPush (UUID \"9e67bebc-655c-47da-97a0-2bb02bbbc580\"))"]+[2013-07-03 10:57:28 BST] XMPPClient: to client: e7/27209141331372845435882587+[2013-07-03 10:57:28 BST] XMPPReceivePack: started running push Pushing "e57" (StartingPush (UUID "9e67bebc-655c-47da-97a0-2bb02bbbc580"))+[2013-07-03 10:57:29 BST] XMPPClient: received: ["Pushing \"e57\" (CanPush (UUID \"9e67bebc-655c-47da-97a0-2bb02bbbc580\") [e1b6f2944e7d082299cb1696c55d9064a11c4577,026ba8e7ba89bccd22f5ff31a26c82ee75641b55])"]+[2013-07-03 10:57:29 BST] XMPPReceivePack: Syncing with eythian +[2013-07-03 10:57:29 BST] XMPPClient: sending: Pushing "e57" (PushRequest (UUID "2c0b788e-7b2d-474b-8963-d889b9556229"))+[2013-07-03 10:57:29 BST] chat: git ["receive-pack","/home/robin/Bureaublad/annex"]+[2013-07-03 10:57:29 BST] XMPPClient: received: ["Presence from e7/27209141331372845435882587 Just (Element {elementName = Name {nameLocalName = \"git-annex\", nameNamespace = Just \"git-annex\", namePrefix = Nothing}, elementAttributes = [], elementNodes = []})"]+[2013-07-03 10:57:29 BST] XMPPClient: to client: e7/27209141331372845435882587+[2013-07-03 10:57:29 BST] XMPPClient: sending: Pushing "e57" (ReceivePackOutput 1 "<elided>")+[2013-07-03 10:57:29 BST] XMPPClient: to client: e7/27209141331372845435882587+[2013-07-03 10:57:29 BST] TransferScanner: finished scan of [Remote { name ="eythian" }]+[2013-07-03 10:57:29 BST] XMPPClient: received: ["Pushing \"e57\" (SendPackOutput 1 \"<elided>\")"]+[2013-07-03 10:57:29 BST] XMPPClient: NetMessager stored Pushing "e57" (SendPackOutput 1 "<elided>") in ReceivePack inbox "e57"+[2013-07-03 10:57:30 BST] XMPPClient: received: ["Pushing \"e57\" (SendPackOutput 2 \"<elided>\")"]+[2013-07-03 10:57:30 BST] XMPPClient: NetMessager stored Pushing "e57" (SendPackOutput 2 "<elided>") in ReceivePack inbox "e57"+[2013-07-03 10:57:30 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","git-annex"]+[2013-07-03 10:57:30 BST] XMPPClient: sending: Pushing "e57" (ReceivePackOutput 2 "<elided>")+[2013-07-03 10:57:30 BST] XMPPReceivePack: finished running push Pushing "e57" (StartingPush (UUID "9e67bebc-655c-47da-97a0-2bb02bbbc580")) True+[2013-07-03 10:57:30 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","--hash","refs/heads/git-annex"]+[2013-07-03 10:57:30 BST] XMPPClient: to client: e7/27209141331372845435882587+[2013-07-03 10:57:30 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","log","refs/heads/git-annex..69b3503287d87c26989a755d0cc660c3c68f2c80","--oneline","-n1"]+[2013-07-03 10:57:30 BST] XMPPClient: sending: Pushing "e57" (ReceivePackOutput 3 "<elided>")+[2013-07-03 10:57:30 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","log","refs/heads/git-annex..35b3fd81218834a29b9f516b64b4671c0b0902d3","--oneline","-n1"]+[2013-07-03 10:57:30 BST] XMPPClient: to client: e7/27209141331372845435882587+[2013-07-03 10:57:30 BST] feed: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","update-index","-z","--index-info"]+[2013-07-03 10:57:30 BST] XMPPClient: sending: Pushing "e57" (ReceivePackDone ExitSuccess)+[2013-07-03 10:57:30 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","diff-index","--raw","-z","-r","--no-renames","-l0","--cached","35b3fd81218834a29b9f516b64b4671c0b0902d3"]+[2013-07-03 10:57:30 BST] XMPPClient: to client: e7/27209141331372845435882587+[2013-07-03 10:57:30 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","log","35b3fd81218834a29b9f516b64b4671c0b0902d3..refs/heads/git-annex","--oneline","-n1"]+[2013-07-03 10:57:30 BST] call: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","update-ref","refs/heads/git-annex","35b3fd81218834a29b9f516b64b4671c0b0902d3"]+[2013-07-03 10:57:30 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","git-annex"]+[2013-07-03 10:57:30 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","--hash","refs/heads/git-annex"]+[2013-07-03 10:57:30 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","log","refs/heads/git-annex..35b3fd81218834a29b9f516b64b4671c0b0902d3","--oneline","-n1"]+[2013-07-03 10:57:30 BST] feed: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","update-index","-z","--index-info"]+[2013-07-03 10:57:30 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","diff-index","--raw","-z","-r","--no-renames","-l0","--cached","refs/heads/git-annex"]+[2013-07-03 10:57:30 BST] XMPPClient: received: ["Pushing \"e57\" (StartingPush (UUID \"9e67bebc-655c-47da-97a0-2bb02bbbc580\"))"]+[2013-07-03 10:57:30 BST] XMPPReceivePack: started running push Pushing "e57" (StartingPush (UUID "9e67bebc-655c-47da-97a0-2bb02bbbc580"))+[2013-07-03 10:57:30 BST] XMPPReceivePack: Syncing with eythian +[2013-07-03 10:57:30 BST] chat: git ["receive-pack","/home/robin/Bureaublad/annex"]+[2013-07-03 10:57:30 BST] XMPPClient: sending: Pushing "e57" (ReceivePackOutput 1 "<elided>")+[2013-07-03 10:57:30 BST] XMPPClient: to client: e7/27209141331372845435882587+[2013-07-03 10:57:30 BST] XMPPClient: sending: Pushing "e57" (ReceivePackOutput 2 "<elided>")+[2013-07-03 10:57:30 BST] XMPPClient: to client: e7/27209141331372845435882587+[2013-07-03 10:57:30 BST] XMPPClient: sending: Pushing "e57" (ReceivePackOutput 3 "<elided>")+[2013-07-03 10:57:30 BST] XMPPClient: to client: e7/27209141331372845435882587+[2013-07-03 10:57:31 BST] XMPPClient: received: ["Pushing \"e57\" (SendPackOutput 1 \"<elided>\")"]+[2013-07-03 10:57:31 BST] XMPPClient: NetMessager stored Pushing "e57" (SendPackOutput 1 "<elided>") in ReceivePack inbox "e57"+[2013-07-03 10:57:31 BST] XMPPReceivePack: finished running push Pushing "e57" (StartingPush (UUID "9e67bebc-655c-47da-97a0-2bb02bbbc580")) True+[2013-07-03 10:57:31 BST] XMPPClient: sending: Pushing "e57" (ReceivePackDone ExitSuccess)+[2013-07-03 10:57:31 BST] XMPPClient: to client: e7/27209141331372845435882587+[2013-07-03 10:57:31 BST] TransferScanner: starting scan of [Remote { name ="eythian" }]+[2013-07-03 10:57:31 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","ls-files","--cached","-z","--"]+[2013-07-03 10:57:32 BST] TransferScanner: finished scan of [Remote { name ="eythian" }]+[2013-07-03 10:57:34 BST] XMPPClient: received: ["Presence from e7/27209141331372845435882587 Just (Element {elementName = Name {nameLocalName = \"git-annex\", nameNamespace = Just \"git-annex\", namePrefix = Nothing}, elementAttributes = [(Name {nameLocalName = \"push\", nameNamespace = Nothing, namePrefix = Nothing},[ContentText \"a23dd126-7bb7-42ce-b15a-b01990df5f2a\"])], elementNodes = []})","NotifyPush [UUID \"a23dd126-7bb7-42ce-b15a-b01990df5f2a\"]"]+[2013-07-03 10:57:34 BST] XMPPClient: push notification for+[2013-07-03 10:57:34 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","symbolic-ref","HEAD"]+[2013-07-03 10:57:34 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","refs/heads/master"]+[2013-07-03 10:57:35 BST] XMPPClient: received: ["Presence from e7/27209141331372845435882587 Just (Element {elementName = Name {nameLocalName = \"git-annex\", nameNamespace = Just \"git-annex\", namePrefix = Nothing}, elementAttributes = [(Name {nameLocalName = \"query\", nameNamespace = Nothing, namePrefix = Nothing},[ContentText \"\"])], elementNodes = []})","QueryPresence"]+[2013-07-03 10:57:35 BST] XMPPClient: received: ["Pushing \"e57\" (CanPush (UUID \"9e67bebc-655c-47da-97a0-2bb02bbbc580\") [e1b6f2944e7d082299cb1696c55d9064a11c4577,1eb67d85f89c92345757805d83939d75e8ce54a0])"]+[2013-07-03 10:57:35 BST] XMPPClient: sending: Pushing "e57" (PushRequest (UUID "2c0b788e-7b2d-474b-8963-d889b9556229"))+[2013-07-03 10:57:35 BST] XMPPClient: to client: e7/27209141331372845435882587+[2013-07-03 10:57:35 BST] XMPPClient: received: ["Pushing \"e57\" (CanPush (UUID \"9e67bebc-655c-47da-97a0-2bb02bbbc580\") [e1b6f2944e7d082299cb1696c55d9064a11c4577,1eb67d85f89c92345757805d83939d75e8ce54a0])"]+[2013-07-03 10:57:35 BST] XMPPClient: sending: Pushing "e57" (PushRequest (UUID "2c0b788e-7b2d-474b-8963-d889b9556229"))+[2013-07-03 10:57:35 BST] XMPPClient: to client: e7/27209141331372845435882587+[2013-07-03 10:57:35 BST] XMPPClient: received: ["Pushing \"e57\" (StartingPush (UUID \"9e67bebc-655c-47da-97a0-2bb02bbbc580\"))"]+[2013-07-03 10:57:35 BST] XMPPReceivePack: started running push Pushing "e57" (StartingPush (UUID "9e67bebc-655c-47da-97a0-2bb02bbbc580"))+[2013-07-03 10:57:35 BST] XMPPReceivePack: Syncing with eythian +[2013-07-03 10:57:35 BST] chat: git ["receive-pack","/home/robin/Bureaublad/annex"]+[2013-07-03 10:57:35 BST] XMPPClient: sending: Pushing "e57" (ReceivePackOutput 1 "<elided>")+[2013-07-03 10:57:35 BST] XMPPClient: to client: e7/27209141331372845435882587+[2013-07-03 10:57:35 BST] XMPPClient: sending: Pushing "e57" (ReceivePackOutput 2 "<elided>")+[2013-07-03 10:57:35 BST] XMPPClient: to client: e7/27209141331372845435882587+[2013-07-03 10:57:36 BST] XMPPClient: received: ["Pushing \"e57\" (SendPackOutput 1 \"<elided>\")"]+[2013-07-03 10:57:36 BST] XMPPClient: NetMessager stored Pushing "e57" (SendPackOutput 1 "<elided>") in ReceivePack inbox "e57"+[2013-07-03 10:57:36 BST] XMPPClient: received: ["Pushing \"e57\" (SendPackOutput 2 \"<elided>\")"]+[2013-07-03 10:57:36 BST] XMPPClient: NetMessager stored Pushing "e57" (SendPackOutput 2 "<elided>") in ReceivePack inbox "e57"+[2013-07-03 10:57:36 BST] XMPPClient: sending: Pushing "e57" (ReceivePackOutput 3 "<elided>")+[2013-07-03 10:57:36 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","git-annex"]+[2013-07-03 10:57:36 BST] XMPPReceivePack: finished running push Pushing "e57" (StartingPush (UUID "9e67bebc-655c-47da-97a0-2bb02bbbc580")) True+[2013-07-03 10:57:36 BST] XMPPClient: to client: e7/27209141331372845435882587+[2013-07-03 10:57:36 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","--hash","refs/heads/git-annex"]+[2013-07-03 10:57:36 BST] XMPPClient: sending: Pushing "e57" (ReceivePackOutput 4 "<elided>")+[2013-07-03 10:57:36 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","log","refs/heads/git-annex..35b3fd81218834a29b9f516b64b4671c0b0902d3","--oneline","-n1"]+[2013-07-03 10:57:36 BST] XMPPClient: to client: e7/27209141331372845435882587+[2013-07-03 10:57:36 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","log","refs/heads/git-annex..1eb67d85f89c92345757805d83939d75e8ce54a0","--oneline","-n1"]+[2013-07-03 10:57:36 BST] XMPPClient: sending: Pushing "e57" (ReceivePackDone ExitSuccess)+[2013-07-03 10:57:36 BST] feed: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","update-index","-z","--index-info"]+[2013-07-03 10:57:36 BST] XMPPClient: to client: e7/27209141331372845435882587+[2013-07-03 10:57:36 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","diff-index","--raw","-z","-r","--no-renames","-l0","--cached","1eb67d85f89c92345757805d83939d75e8ce54a0"]+[2013-07-03 10:57:36 BST] chat: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","hash-object","-t","blob","-w","--stdin"]+[2013-07-03 10:57:36 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","log","1eb67d85f89c92345757805d83939d75e8ce54a0..refs/heads/git-annex","--oneline","-n1"]+[2013-07-03 10:57:36 BST] call: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","update-ref","refs/heads/git-annex","1eb67d85f89c92345757805d83939d75e8ce54a0"]+[2013-07-03 10:57:36 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","git-annex"]+[2013-07-03 10:57:36 BST] TransferScanner: starting scan of [Remote { name ="eythian" }]+[2013-07-03 10:57:36 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","--hash","refs/heads/git-annex"]+[2013-07-03 10:57:36 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","log","refs/heads/git-annex..1eb67d85f89c92345757805d83939d75e8ce54a0","--oneline","-n1"]+[2013-07-03 10:57:36 BST] feed: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","update-index","-z","--index-info"]+[2013-07-03 10:57:36 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","diff-index","--raw","-z","-r","--no-renames","-l0","--cached","refs/heads/git-annex"]+[2013-07-03 10:57:36 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","ls-files","--cached","-z","--"]+[2013-07-03 10:57:37 BST] XMPPClient: received: ["Pushing \"e57\" (StartingPush (UUID \"9e67bebc-655c-47da-97a0-2bb02bbbc580\"))"]+[2013-07-03 10:57:37 BST] XMPPReceivePack: started running push Pushing "e57" (StartingPush (UUID "9e67bebc-655c-47da-97a0-2bb02bbbc580"))+[2013-07-03 10:57:37 BST] XMPPReceivePack: Syncing with eythian +[2013-07-03 10:57:37 BST] chat: git ["receive-pack","/home/robin/Bureaublad/annex"]+[2013-07-03 10:57:37 BST] XMPPClient: sending: Pushing "e57" (ReceivePackOutput 1 "<elided>")+[2013-07-03 10:57:37 BST] XMPPClient: to client: e7/27209141331372845435882587+[2013-07-03 10:57:37 BST] XMPPClient: received: ["Pushing \"e57\" (SendPackOutput 1 \"<elided>\")"]+[2013-07-03 10:57:37 BST] XMPPClient: NetMessager stored Pushing "e57" (SendPackOutput 1 "<elided>") in ReceivePack inbox "e57"+[2013-07-03 10:57:37 BST] XMPPReceivePack: finished running push Pushing "e57" (StartingPush (UUID "9e67bebc-655c-47da-97a0-2bb02bbbc580")) True+[2013-07-03 10:57:37 BST] XMPPClient: sending: Pushing "e57" (ReceivePackDone ExitSuccess)+[2013-07-03 10:57:37 BST] TransferScanner: queued Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Nothing : expensive scan found missing object+[2013-07-03 10:57:37 BST] Transferrer: Transferring: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Nothing+[2013-07-03 10:57:38 BST] XMPPClient: to client: e7/27209141331372845435882587+[2013-07-03 10:57:38 BST] TransferScanner: finished scan of [Remote { name ="eythian" }]+[2013-07-03 10:57:38 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Nothing+[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 131008+[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 262016+[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 393024+[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 524032+[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 655040+[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 786048+[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 917056+[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 1048064+[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 1179072+[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 1310080+[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 1441088+[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 1572096+[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 1703104+[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 1834112+[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 1965120+[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 2096128+[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 2227136+[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 2358144+[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 2489152+[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 2620160+[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 2751168+[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 2882176+[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 3013184+[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 3144192+[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 3275200+[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 3406208+[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 3537216+[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 3668224+[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 3799232+[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 3930240+[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 4192256+[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 4323264+[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 4454272+[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 4585280+[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 4716288+[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 4847296+[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 5109312+[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 5240320+[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 5371328+[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 5502336+[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 5633344+[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 5764352+[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 5895360+[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 6157376+[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 6288384+[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 6419392+[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 6550400+[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 6681408+[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 6943424+[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 7074432+[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 7205440+[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 7336448+[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 7598464+[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 7729472+[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 7860480+[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 7991488+[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 8122496+[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 8253504+[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 8384512+[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 8515520+[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 8646528+[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 8646528+[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 8777536+[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 8908544+[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 9039552+[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 9170560+[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 9301568+[2013-07-03 10:58:02 BST] XMPPClient: received: ["Unknown message"]+[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 9432576+[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 9563584+[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 9694592+[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 9694592+[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 9825600+[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 9956608+[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 10087616+[2013-07-03 10:58:02 BST] Watcher: add symlink git-annex_4.20130627_amd64.deb+[2013-07-03 10:58:02 BST] Transferrer: Downloaded git-annex..amd64.deb+[2013-07-03 10:58:02 BST] TransferWatcher: transfer finishing: Transfer {transferDirection = Download, transferUUID = UUID "971c808b-ce67-4edb-b317-21c0da6b5462", transferKey = Key {keyName = "8514472fd7c4ea28b385b0335db408ee28f58911b5ad0ba9d2e2cbfd1b99c86d.deb", keyBackendName = "SHA256E", keySize = Just 10140744, keyMtime = Nothing}}+[2013-07-03 10:58:02 BST] chat: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","hash-object","-t","blob","-w","--stdin"]+[2013-07-03 10:58:02 BST] chat: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","hash-object","-w","--stdin-paths"]+[2013-07-03 10:58:02 BST] feed: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","update-index","-z","--index-info"]+[2013-07-03 10:58:02 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","--hash","refs/heads/git-annex"]+[2013-07-03 10:58:02 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","write-tree"]+[2013-07-03 10:58:02 BST] chat: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","commit-tree","9b6f9b59c19650e25f11e2d50acb3bf25b631150","-p","refs/heads/git-annex"]+[2013-07-03 10:58:02 BST] call: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","update-ref","refs/heads/git-annex","822dbb101976fed8b775d04bba6da876c591a9f0"]+[2013-07-03 10:58:02 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","symbolic-ref","HEAD"]+[2013-07-03 10:58:02 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","refs/heads/master"]+[2013-07-03 10:58:02 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","git-annex"]+[2013-07-03 10:58:02 BST] Committer: committing 1 changes+[2013-07-03 10:58:02 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","--hash","refs/heads/git-annex"]+[2013-07-03 10:58:02 BST] Committer: Committing changes to git+[2013-07-03 10:58:02 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","log","refs/heads/git-annex..822dbb101976fed8b775d04bba6da876c591a9f0","--oneline","-n1"]+[2013-07-03 10:58:02 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","log","refs/heads/git-annex..1eb67d85f89c92345757805d83939d75e8ce54a0","--oneline","-n1"]+[2013-07-03 10:58:02 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","--head","refs/heads/git-annex","HEAD"]+[2013-07-03 10:58:02 BST] feed: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","update-index","-z","--index-info"]+[2013-07-03 10:58:02 BST] XMPPClient: sending: Pushing "e30" (CanPush (UUID "2c0b788e-7b2d-474b-8963-d889b9556229") [e1b6f2944e7d082299cb1696c55d9064a11c4577,822dbb101976fed8b775d04bba6da876c591a9f0])+[2013-07-03 10:58:02 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","commit","--allow-empty-message","--no-edit","-m","","--quiet","--no-verify"]+[2013-07-03 10:58:02 BST] XMPPClient: exploded undirected message to clients e7/27209141331372845435882587+[2013-07-03 10:58:03 BST] XMPPClient: received: ["Presence from 0/ Nothing"]+[2013-07-03 10:58:03 BST] XMPPClient: received: ["Presence from e7/27209141331372845435882587 Just (Element {elementName = Name {nameLocalName = \"git-annex\", nameNamespace = Just \"git-annex\", namePrefix = Nothing}, elementAttributes = [], elementNodes = []})"]+[2013-07-03 10:58:03 BST] XMPPClient: sending to new client: e7/27209141331372845435882587 "Pushing \"e57\" (CanPush (UUID \"2c0b788e-7b2d-474b-8963-d889b9556229\") [e1b6f2944e7d082299cb1696c55d9064a11c4577,822dbb101976fed8b775d04bba6da876c591a9f0])"+[2013-07-03 10:58:03 BST] XMPPClient: received: ["Presence from 0/ Nothing"]+[2013-07-03 10:58:03 BST] XMPPClient: received: ["Pushing \"e57\" (PushRequest (UUID \"9e67bebc-655c-47da-97a0-2bb02bbbc580\"))"]+[2013-07-03 10:58:03 BST] XMPPSendPack: started running push Pushing "e57" (PushRequest (UUID "9e67bebc-655c-47da-97a0-2bb02bbbc580"))+[2013-07-03 10:58:03 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","symbolic-ref","HEAD"]+[2013-07-03 10:58:03 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","refs/heads/master"]+[2013-07-03 10:58:03 BST] call: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","branch","-f","synced/master"]+[2013-07-03 10:58:03 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","symbolic-ref","HEAD"]+[2013-07-03 10:58:03 BST] XMPPSendPack: Syncing with eythian +[2013-07-03 10:58:03 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","refs/heads/master"]+[2013-07-03 10:58:03 BST] Merger: merging refs/heads/synced/master into refs/heads/master+[2013-07-03 10:58:03 BST] XMPPClient: sending: Pushing "e57" (StartingPush (UUID "2c0b788e-7b2d-474b-8963-d889b9556229"))+[2013-07-03 10:58:03 BST] call: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","push","eythian","git-annex:refs/synced/2c0b788e-7b2d-474b-8963-d889b9556229/ZXl0aGlhbkBqYWJiZXIua2FsbGlzdGkubmV0Lm56/git-annex","refs/heads/master:refs/synced/2c0b788e-7b2d-474b-8963-d889b9556229/ZXl0aGlhbkBqYWJiZXIua2FsbGlzdGkubmV0Lm56/master"]+[2013-07-03 10:58:03 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","symbolic-ref","HEAD"]+[2013-07-03 10:58:03 BST] XMPPClient: to client: e7/27209141331372845435882587+[2013-07-03 10:58:03 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","refs/heads/master"]+[2013-07-03 10:58:03 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","--hash","refs/heads/master"]+[2013-07-03 10:58:03 BST] call: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex/.git/annex/merge/","merge","--no-edit","refs/heads/synced/master"]+Already up-to-date.+[2013-07-03 10:58:03 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","--hash","refs/heads/master"]+[2013-07-03 10:58:03 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","diff-tree","-z","--raw","--no-renames","-l0","-r","e1b6f2944e7d082299cb1696c55d9064a11c4577","e1b6f2944e7d082299cb1696c55d9064a11c4577"]+[2013-07-03 10:58:03 BST] XMPPClient: received: ["Pushing \"e57\" (PushRequest (UUID \"9e67bebc-655c-47da-97a0-2bb02bbbc580\"))"]+[2013-07-03 10:58:03 BST] XMPPClient: received: ["Pushing \"e57\" (ReceivePackOutput 1 \"<elided>\")"]+[2013-07-03 10:58:03 BST] XMPPClient: NetMessager stored Pushing "e57" (ReceivePackOutput 1 "<elided>") in SendPack inbox "e57"+[2013-07-03 10:58:03 BST] XMPPClient: received: ["Pushing \"e57\" (ReceivePackOutput 2 \"<elided>\")"]+[2013-07-03 10:58:03 BST] XMPPClient: NetMessager stored Pushing "e57" (ReceivePackOutput 2 "<elided>") in SendPack inbox "e57"+[2013-07-03 10:58:03 BST] XMPPClient: received: ["Pushing \"e57\" (ReceivePackOutput 3 \"<elided>\")"]+[2013-07-03 10:58:03 BST] XMPPClient: NetMessager stored Pushing "e57" (ReceivePackOutput 3 "<elided>") in SendPack inbox "e57"+[2013-07-03 10:58:03 BST] XMPPClient: received: ["Pushing \"e57\" (ReceivePackOutput 4 \"<elided>\")"]+[2013-07-03 10:58:03 BST] XMPPClient: NetMessager stored Pushing "e57" (ReceivePackOutput 4 "<elided>") in SendPack inbox "e57"+[2013-07-03 10:58:03 BST] XMPPClient: received: ["Pushing \"e57\" (ReceivePackOutput 5 \"<elided>\")"]+[2013-07-03 10:58:03 BST] XMPPClient: NetMessager stored Pushing "e57" (ReceivePackOutput 5 "<elided>") in SendPack inbox "e57"+[2013-07-03 10:58:03 BST] XMPPClient: sending: Pushing "e57" (SendPackOutput 1 "<elided>")+[2013-07-03 10:58:03 BST] XMPPClient: to client: e7/27209141331372845435882587+[2013-07-03 10:58:03 BST] XMPPClient: sending: Pushing "e57" (SendPackOutput 2 "<elided>")+[2013-07-03 10:58:03 BST] XMPPClient: to client: e7/27209141331372845435882587+[2013-07-03 10:58:04 BST] XMPPClient: received: ["Pushing \"e57\" (ReceivePackOutput 6 \"<elided>\")"]+[2013-07-03 10:58:04 BST] XMPPClient: NetMessager stored Pushing "e57" (ReceivePackOutput 6 "<elided>") in SendPack inbox "e57"+[2013-07-03 10:58:04 BST] XMPPClient: received: ["Pushing \"e57\" (ReceivePackOutput 7 \"<elided>\")"]+[2013-07-03 10:58:04 BST] XMPPClient: NetMessager stored Pushing "e57" (ReceivePackOutput 7 "<elided>") in SendPack inbox "e57"+[2013-07-03 10:58:04 BST] XMPPClient: received: ["Pushing \"e57\" (ReceivePackDone ExitSuccess)"]+[2013-07-03 10:58To xmpp::eythian@jabber.kallisti.net.nz+:0 2783051..822dbb1 4git-annex -> refs/synced/2c0b788e-7b2d-474b-8963-d889b9556229/ZXl0aGlhbkBqYWJiZXIua2FsbGlzdGkubmV0Lm56/git-annex +BS 0b10576..e1b6f29 Tmaster -> refs/synced/2c0b788e-7b2d-474b-8963-d889b9556229/ZXl0aGlhbkBqYWJiZXIua2FsbGlzdGkubmV0Lm56/master]+ XMPPClient: NetMessager stored Pushing "e57" (ReceivePackDone ExitSuccess) in SendPack inbox "e57"+[2013-07-03 10:58:04 BST] XMPPSendPack: finished running push Pushing "e57" (PushRequest (UUID "9e67bebc-655c-47da-97a0-2bb02bbbc580")) True+[2013-07-03 10:58:04 BST] XMPPSendPack: started running push Pushing "e57" (PushRequest (UUID "9e67bebc-655c-47da-97a0-2bb02bbbc580"))+[2013-07-03 10:58:04 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","symbolic-ref","HEAD"]+[2013-07-03 10:58:04 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","refs/heads/master"]+[2013-07-03 10:58:04 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","symbolic-ref","HEAD"]+[2013-07-03 10:58:04 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","refs/heads/master"]+[2013-07-03 10:58:04 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","--head","refs/heads/git-annex","HEAD"]+[2013-07-03 10:58:04 BST] call: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","branch","-f","synced/master"]+[2013-07-03 10:58:04 BST] XMPPClient: sending: Pushing "e30" (CanPush (UUID "2c0b788e-7b2d-474b-8963-d889b9556229") [e1b6f2944e7d082299cb1696c55d9064a11c4577,822dbb101976fed8b775d04bba6da876c591a9f0])+[2013-07-03 10:58:04 BST] XMPPSendPack: Syncing with eythian +[2013-07-03 10:58:04 BST] XMPPClient: exploded undirected message to clients e7/27209141331372845435882587+[2013-07-03 10:58:04 BST] call: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","push","eythian","git-annex:refs/synced/2c0b788e-7b2d-474b-8963-d889b9556229/ZXl0aGlhbkBqYWJiZXIua2FsbGlzdGkubmV0Lm56/git-annex","refs/heads/master:refs/synced/2c0b788e-7b2d-474b-8963-d889b9556229/ZXl0aGlhbkBqYWJiZXIua2FsbGlzdGkubmV0Lm56/master"]+[2013-07-03 10:58:04 BST] XMPPClient: sending: Pushing "e57" (StartingPush (UUID "2c0b788e-7b2d-474b-8963-d889b9556229"))+[2013-07-03 10:58:04 BST] XMPPClient: to client: e7/27209141331372845435882587+[2013-07-03 10:58:04 BST] XMPPClient: received: ["Presence from 0/ Nothing"]+[2013-07-03 10:58:05 BST] XMPPClient: received: ["Presence from e7/27209141331372845435882587 Just (Element {elementName = Name {nameLocalName = \"git-annex\", nameNamespace = Just \"git-annex\", namePrefix = Nothing}, elementAttributes = [], elementNodes = []})"]+[2013-07-03 10:58:05 BST] XMPPClient: sending to new client: e7/27209141331372845435882587 "Pushing \"e57\" (CanPush (UUID \"2c0b788e-7b2d-474b-8963-d889b9556229\") [e1b6f2944e7d082299cb1696c55d9064a11c4577,822dbb101976fed8b775d04bba6da876c591a9f0])"+[2013-07-03 10:58:05 BST] XMPPClient: received: ["Presence from 0/ Nothing"]+[2013-07-03 10:58:05 BST] XMPPClient: received: ["Pushing \"e57\" (ReceivePackOutput 1 \"<elided>\")"]+[2013-07-03 10:58:05 BST] XMPPClient: NetMessager stored Pushing "e57" (ReceivePackOutput 1 "<elided>") in SendPack inbox "e57"+[2013-07-03 10:58:05 BST] XMPPClient: sending: Pushing "e57" (SendPackOutput 1 "<elided>")+[2013-07-03 10:58:05 BST] XMPPClient: to client: e7/27209141331372845435882587+[2013-07-03 10:58:05 BST] XMPPClient: received: ["Pushing \"e57\" (ReceivePackDone ExitSuccess)"]+[2013-07-03 10:58:05 Everything up-to-date+BST] XMPPClient: NetMessager stored Pushing "e57" (ReceivePackDone ExitSuccess) in SendPack inbox "e57"+[2013-07-03 10:58:05 BST] XMPPSendPack: finished running push Pushing "e57" (PushRequest (UUID "9e67bebc-655c-47da-97a0-2bb02bbbc580")) True+[2013-07-03 10:58:27 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","ls-tree","-z","--","refs/heads/git-annex","uuid.log","remote.log","trust.log","group.log","preferred-content.log"]+++# End of transcript or log.+"""]]
@@ -0,0 +1,37 @@+### Please describe the problem.++I am receiving a weird error when trying to add a file into a git annex repo on Android. I can't explain how it got into this state, and I can't figure out how to fix it.++### What steps will reproduce the problem?++See the output below - I'm happy to run any debugging commands that are required.++### What version of git-annex are you using? On what operating system?++ASUS Transformer Infinity Android Tablet, Android 4.2.1.++[[!format sh """+git-annex version: 4.20130601-g7483ca4+build flags: Assistant Webapp Testsuite S3 WebDAV Inotify XMPP DNS+local repository version: 3+default repository version: 3+supported repository versions: 3 4+upgrade supported from repository versions: 0 1 2+"""]]+++### Please provide any additional information below.++[[!format sh """+u0_a141@android:/sdcard/git-annex.home/Documents $ git annex add Music/MobileSheets/The\ New\ Real\ Book\ 1/New\ Real\ Book\ 1\ Eb_19.pdf+add Music/MobileSheets/The New Real Book 1/New Real Book 1 Eb_19.pdf (checksum...) unknown option -- reflink=auto+git-annex: /storage/emulated/legacy/git-annex.home/Documents/.git/annex/tmp/New Real Book 1 Eb15137.pdf: rename: does not exist (No such file or directory)+failed+git-annex: add: 1 failed+1|u0_a141@android:/sdcard/git-annex.home/Documents $ ls -la .git/annex/tmp/+drwxrwxr-x 2 root sdcard_r 4096 Jun 14 13:42 .+drwxrwxr-x 6 root sdcard_r 4096 Jun 14 13:35 ..+u0_a141@android:/sdcard/git-annex.home/Documents $+"""]]++> Should be [[fixed|done]] --[[Joey]]
@@ -0,0 +1,27 @@+Using `git-annex version: 4.20130802` on Debian unstable, when trying to add the feed at <http://www.ndr.de/fernsehen/sendungen/extra_3/videos/zum_mitnehmen/extradrei196_version-hq.xml>, I get:++[[!format sh """+importfeed http://www.ndr.de/fernsehen/sendungen/extra_3/videos/zum_mitnehmen/extradrei196_version-hq.xml +--2013-08-16 09:14:13-- http://www.ndr.de/fernsehen/sendungen/extra_3/videos/zum_mitnehmen/extradrei196_version-hq.xml+Auflösen des Hostnamen »www.ndr.de (www.ndr.de)«... 212.201.100.171, 212.201.100.187+Verbindungsaufbau zu www.ndr.de (www.ndr.de)|212.201.100.171|:80... verbunden.+HTTP-Anforderung gesendet, warte auf Antwort... 200 OK+Länge: 61809 (60K) [application/xml]+In »»/tmp/feed4404«« speichern.++100%[============================================>] 61.809 --.-K/s in 0,03s ++2013-08-16 09:14:13 (2,20 MB/s) - »»/tmp/feed4404«« gespeichert [61809/61809]++failed+git-annex: importfeed: 1 failed+"""]]++(Oh, and using `format` with nono-ASCII seems to break down., at least in the preview.)++> I'm going to close this since I've narrowed it down to a bug in the+> upstream feed library. [[done]]. Of course, if we get a lot of reports of+> the library not working, I may need to revisit using it, but for now this+> seems an isolated problem. Also, I tried validating the feed, and it is+> not 100% valid, and one of the validity problems is a missing enclosure+> length. --[[Joey]]
@@ -0,0 +1,55 @@+### Please describe the problem.++I seem to be unable to switch back and forth between git annex direct and git annex indirect mode in one of my repositories. I can in others just fine.++### What steps will reproduce the problem?++In the broken repository I can do:++ cwebber@earlgrey:~/gfx-proj/mediagoblin_vid$ git annex direct+ commit + add audio/part2.aup (checksum...) ok+ ok+ add images/campaign.png (checksum...) ok+ ok+ add images/transifex.png (checksum...) ok+ ok+ add script-lines.txt (checksum...) ok+ ok+ add vid_pitch.blend (checksum...) ok+ ok+ (Recording state in git...)+ [master 9f13dc0] commit before switching to direct mode+ 1 file changed, 145 insertions(+), 1 deletion(-)+ rewrite audio/part2.aup (100%)+ mode change 120000 => 100644+ ok+ direct gavroche-vid-shot.blend + git-annex: /home/cwebber/gfx-proj/mediagoblin_vid/.git/annex/objects/3M/mx/SHA256E-s2935980--3a1c838333a4a0ee1eaa837c3f08a910d3f29fc60baf41affd936fbefe11111f/SHA256E-s2935980--3a1c838333a4a0ee1eaa837c3f08a910d3f29fc60baf41affd936fbefe11111f: rename: permission denied (Permission denied)+ failed+ git-annex: direct: 1 failed++looking at the files:++ cwebber@earlgrey:~/gfx-proj/mediagoblin_vid$ ls -l gavroche-vid-shot.blend+ lrwxrwxrwx 1 cwebber cwebber 190 Apr 28 18:27 gavroche-vid-shot.blend -> .git/annex/objects/3M/mx/SHA256E-s2935980--3a1c838333a4a0ee1eaa837c3f08a910d3f29fc60baf41affd936fbefe11111f/SHA256E-s2935980--3a1c838333a4a0ee1eaa837c3f08a910d3f29fc60baf41affd936fbefe11111f+ cwebber@earlgrey:~/gfx-proj/mediagoblin_vid$ ls -l .git/annex/objects/3M/mx/SHA256E-s2935980--3a1c838333a4a0ee1eaa837c3f08a910d3f29fc60baf41affd936fbefe11111f/SHA256E-s2935980--3a1c838333a4a0ee1eaa837c3f08a910d3f29fc60baf41affd936fbefe11111f+ -rw-r--r-- 1 cwebber cwebber 2935980 Apr 28 18:27 .git/annex/objects/3M/mx/SHA256E-s2935980--3a1c838333a4a0ee1eaa837c3f08a910d3f29fc60baf41affd936fbefe11111f/SHA256E-s2935980--3a1c838333a4a0ee1eaa837c3f08a910d3f29fc60baf41affd936fbefe11111f+ cwebber@earlgrey:~/gfx-proj/mediagoblin_vid$++... it looks like these permissions should be fine!++Some notable things:++* I believe Blender wrote directly to a file that was in "locked" somehow, despite it being in that state. It may have actually followed the symlink and overwritten that file, I'm not sure.+* However, the file that git-annex is now reporting with "permission denied" is not the one it did previously... I did git checkout -- on all the files, switched them over, and it's a different set of broken things now!+* It's actually easy enough to fix... in fact, I did fix it! I just did a fresh clone of the git repository and a git annex get and everything is fine now. However, it seemed like possibly a bug that might hit other people, hence my reporting it.++### What version of git-annex are you using? On what operating system?++git annex version 4.20130417 on debian wheezy++### Please provide any additional information below.+++> [[done]]; see comments. --[[Joey]]
@@ -0,0 +1,46 @@+What steps will reproduce the problem?++Install 4.20130417 as packaged in Debian unstable.+Using "git annex webapp", setup on first machine adding repository ~/annex. Add a Box.com repository in directory "annex", encrypted. Add a jabber account (apparently successful).+Add test file to ~/annex. Login via website to box.com, notice that the "annex" directory is created and contains encrypted file.+On second (remote machine), follow the same steps (add repository in ~/annex, Add a Box.com repository in directory "annex", encrypted, Add same jabber account).++What is the expected output? What do you see instead?++Expected the file to appear in the second machine's ~/annex. The webapp indicates: Synced with box.com+Log file says:++[2013-04-23 06:50:16 EDT] main: starting assistant version 4.20130417+(scanning...) [2013-04-23 06:50:16 EDT] Watcher: Performing startup scan+(started...) +(encryption setup shared cipher) (testing WebDAV server...)+(gpg) [2013-04-23 06:50:50 EDT] main: Syncing with box.com +[2013-04-23 06:50:50 EDT] main: Share with friends, and keep your devices in sync across the cloud. +[2013-04-23 06:51:03 EDT] main: Share with friends, and keep your devices in sync across the cloud. +warning: Not updating non-default fetch respec+ + Please update the configuration manually if necessary.+Initializing nautilus-gdu extension+Shutting down nautilus-gdu extension+git-annex: Daemon is already running.++What version of git-annex are you using? On what operating system?++4.20130417, debian testing with apt-pinning to unstable on both systems.++Please provide any additional information below.++When editing the Box.com repository, the option to select a directory no longer appears (and the configuration doesn't show the one selected at creation).+There's no indication if the jabber communication is working successfully. It could be that signalling isn't working for some reason, but the user has no information to determine that.+It would be helpful if there were some indication in the Dashboard as to the number of files/directories/objects that git annex believes exists in each location. It could be that it's not accessing the Box.com server successfully, but again, this is difficult to determine.++It's great to see that git annex might make a box.com account useful for automatic upload and sync... looking forward to getting it to work on both sides! Thanks for making this!++[[!tag /design/assistant moreinfo]]++> The robustness of the XMPP support has massively improved since this bug+> report was filed. Since no more information is forthcoming, I consider+> this bug [[done]].+>+> (Incidentially, this bug got me to santize all information logged about+> XMPP protocol, including the names/emails of buddies..) --[[Joey]]
@@ -0,0 +1,35 @@+### Please describe the problem.++Git annex can't use remotes with the type "file://" if the path contains spaces++### What steps will reproduce the problem?++- Create one repository with a space in the path (and initialize annex in it)+- Clone that repo to an other directory (and initialize annex also in that)+- add a file to the first repository in the annex way+- chdir to the second repository and try to get that file, it won't work (also after git pull or git sync pull)++Check this typescripts for a more detailed description++<http://uz.sns.it/~enrico/git-annex-bugreport.txt>++<http://pastebin.com/f8wkDNrG> (thanks mhameed for that data)+++### What version of git-annex are you using? On what operating system?++I'm using debian testing (jessie) on a i386 machine.++`git-annex` version: 4.20130521 (according to apt data and `git annex version`)++`git-annex` build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP++`git` version: 1.7.10.4+++### Please provide any additional information below.++I don't use git annex assistant nor the webapp++> Tested and only file:// and not other urls have this problem.+> guilhem provided a fix. [[done]] --[[Joey]]
@@ -0,0 +1,24 @@+# Calibre ++Calibre is a somewhat popular eBook management package that's also free software. <http://calibre-ebook.com/> ++Install via+ # apt-get install calibre++There is a somewhat unfortunate interaction between Calibre and git-annex...++* git-annex makes its files become read-only. By the way, that's not quite obvious from the documentation; I suggest making that more prominent.+* Calibre modifies files (not quite sure of semantics, how, or why) when doing various operations, notably such as when copying a book from one's library to one's portable reading device.++These don't play well together, sadly.++I'd expect most of the issue to sit on the Calibre side, and have reported it as a bug.+[Calibre bug #739045](https://bugs.launchpad.net/calibre/+bug/739045)+Preliminary indication is that they're treating it as a functionality change they'll decline to fix. Which isn't entirely unreasonable - I anticipated as much, and I don't want to treat that as a bad/wrong decision.++However, I think it's:+* Unfortunate, as fitting Calibre together with git-annex seems like a neat idea.+* Useful to make sure that this kind of "doesn't play well together" condition is documented, even if only as a bug report.++> [[done]]; the assistant uses direct mode by default now to avoid+> this kind of thing. --[[Joey]]
@@ -0,0 +1,15 @@+### Please describe the problem.++The man page claims there exists a query command 'list' but:++ % git annex list somefile+ git-annex: Unknown command 'list'++### What version of git-annex are you using? On what operating system?++man page online and git-annex version 4.20130909.++> Your last line explains the problem. The online man page+> documents the latest release, or in some cases+> unrelased git version. You have a version 2 releases old installed.+> [[done]] --[[Joey]]
@@ -0,0 +1,8 @@+When I attempt to setup a [box.com special remote](http://git-annex.branchable.com/tips/using_box.com_as_a_special_remote/) I get the following error:++ git-annex: Unknown remote type webdav++I'm using the Linux prebuilt tarball. Does it not include webdav support?++> The amd64 standalone tarball was indeed built without it for the last+> release. Fixed that. [[done]] --[[Joey]]
@@ -0,0 +1,64 @@+What steps will reproduce the problem?++Run:++ cabal install git-annex++What is the expected output? What do you see instead?++The current output is the following:++ $ cabal install git-annex + Resolving dependencies... + Configuring certificate-1.3.2...+ Building certificate-1.3.2...+ Preprocessing library certificate-1.3.2...+ [ 1 of 10] Compiling Data.Certificate.KeyDSA ( Data/Certificate/KeyDSA.hs, dist/build/Data/Certificate/KeyDSA.o )+ [ 2 of 10] Compiling Data.Certificate.KeyRSA ( Data/Certificate/KeyRSA.hs, dist/build/Data/Certificate/KeyRSA.o )+ + Data/Certificate/KeyRSA.hs:64:27:+ `RSA.private_pub' is not a (visible) field of constructor `RSA.PrivateKey'+ cabal: Error: some packages failed to install:+ DAV-0.3 depends on certificate-1.3.2 which failed to install.+ authenticate-1.3.2 depends on certificate-1.3.2 which failed to install.+ certificate-1.3.2 failed during the building phase. The exception was:+ ExitFailure 1+ git-annex-3.20130107 depends on certificate-1.3.2 which failed to install.+ http-conduit-1.8.6.3 depends on certificate-1.3.2 which failed to install.+ http-reverse-proxy-0.1.1.1 depends on certificate-1.3.2 which failed to install.+ tls-1.0.3 depends on certificate-1.3.2 which failed to install.+ tls-extra-0.5.1 depends on certificate-1.3.2 which failed to install.+ yesod-1.1.7.2 depends on certificate-1.3.2 which failed to install.+ yesod-auth-1.1.3 depends on certificate-1.3.2 which failed to install.++I'd rather get a message stating how awesome the software I just installed is. :)++What version of git-annex are you using? On what operating system?++ * Debian (testing)+ * GHC 7.4.1+ * Cabal 1.14.0, cabal-install 0.14.0+ * cabal list git-annex says the installing version is: 3.20130107++Please provide any additional information below.++The certificate package version 1.3.2 does not seem to install properly with+this version of GHC (I think).++Version 1.3.3 solves the issue. I don't know if there is a way for me to+override the dependency tree to try to force the version update with+cabal-install, so maybe it's worth filing a bug.++Thanks a lot for git-annex.++> Welcome to cabal hell! This problem is why haskell's cabal system is not+> a sufficient way for users to install git-annex, and we have to provide+> prebuilt builds.+> +> No change to git-annex can fix this problem. The problem is that+> the old version of certificate got busted by some change to one of its+> dependencies, and several libraries that git-annex depends on have not+> yet been updated to use the new version of certificate. Once those+> libraries get updated, it'll fix itself.+> +> [[done]]; not git-annex bug. --[[Joey]]
@@ -0,0 +1,49 @@+What steps will reproduce the problem?+1. Create a Repository+2. Add a Remote Server++What is the expected output? What do you see instead?+The option "Use a git repository on the server" is marked as not available++What version of git-annex are you using? On what operating system?+Version: 4.20130405 but on Webapp ist shows: Version: 4.20130324+Linux 64bit++Please provide any additional information below.+git and git-annex are available on the Remote Server++> While this bug report was about a server that did not get git-annex-shell+> installed in PATH (something trivially fixed by `apt-get install+> git-annex`), the comments below would like to turn this into a bug report about +> the error message "unknown UUID; cannot modify". All right then..+> --[[Joey]]+> +> This can occur if a ssh key is locked down to use directory A, and a+> new repo is added in directory B which uses the same ssh key. Things will+> then fail when git-annex-shell rejects the attept to use directory B, and+> this results in the webapp displaying an internal server error of+> "unknown UUID; cannot modify" since NoUUID is retreived for the repo.+> +> In fact, I already dealt with this+> once in 79561774450c8abf7c2cb42b08575a3ca27010dc; it used to not use +> the directory name at all as part of the mangled hostname. Most of the +> "me too" responses" predate that fix.+> +> Now, this can only happen+> if the mangled hostname for directory A and B is the same. One way this can+> happen is if the directories are "annex" and "~/annex". In other words,+> I suspect that users are entering "annex" once, and "~/annex" another+> time, when setting up what they intend to be the same repo. Perhaps the+> first time something else fails (like the original problem of+> git-annex-shell not being in path), or they want to set it up again,+> and the next time the subtly different directory is entered.+> +> To fix this,+> `mangleSshHostName` would need to be changed to generate different mangled+> hostnames in all cases. Currently, it skips non-alpha-numeric+> characters in the directory. [[done]] --[[Joey]]+> --[[Joey]] +> +> Additionally, just entering a path starting with "~/" would cause this+> error, since the webapp tacks on "/~/" to make a relative path absolute.+> I've also fixed that. [[done]] --[[Joey]]
@@ -0,0 +1,27 @@+What steps will reproduce the problem?++1. cd to an already existing git repository that uses Github as a remote, with the remote format similar to git@github.com:user/repo.git+2. git annex init+3. git annex status++What is the expected output? What do you see instead?++ $ git annex status+ supported backends: SHA256 SHA1 SHA512 SHA224 SHA384 SHA256E SHA1E SHA512E SHA224E SHA384E WORM URL+ supported remote types: git S3 bup directory rsync web hook+ trusted repositories: Invalid command: 'git-annex-shell 'configlist' '/~/dlo/objectifier.git''+ You appear to be using ssh to clone a git:// URL.+ Make sure your core.gitProxy config option and the+ GIT_PROXY_COMMAND environment variable are NOT set.+ Command ssh ["-S","/Users/dan/Documents/Web/objectifier/.git/annex/ssh/git@github.com","-o","ControlMaster=auto","-o","ControlPersist=yes","git@github.com","git-annex-shell 'configlist' '/~/dlo/objectifier.git'"] failed; exit code 1+ 0+ # ... other stuff that isn't relevant+++What version of git-annex are you using? On what operating system?++git-annex-3.20120825++Max OS X 10.8.1++> [[done]]; see comments --[[Joey]]
@@ -0,0 +1,34 @@+### Please describe the problem.+git-annex refuses to use revoked GPG keys. This may be understandable for the initial remote setup, but it hit me when I tried to add a new key to a remote. The previous key has been revoked (because it has been superseded by the new one), and git-annex refused to reinvoke the shared key with both keys because one of them was revoked.++Given the encryption model does not allow key replacement, it should not refuse to reencrypt using a revoked key. Maybe using `--expert` would help.++### What steps will reproduce the problem?+Encrypt a special remote with a key K1. Revoke key K1. Try to add key K2 with enableremote. git-annex will refuse to encrypt the shared key with the revoked one.++### What version of git-annex are you using? On what operating system?+git-annex version: 4.20130802-g1452ac3++### Please provide any additional information below.++[[!format sh """+% git annex enableremote zoidberg-crypted encryption=42B8F7C2 +enableremote zoidberg-crypted (encryption update) +You need a passphrase to unlock the secret key for+user: "Samuel Tardieu <sam@rfc1149.net>"+2048-bit ELG key, ID F0D70BAF, created 2002-05-31 (main key ID 1B80ADE6)++gpg: NOTE: key has been revoked+gpg: reason for revocation: Key is superseded+gpg: revocation comment: Key superseded by 42B8F7C2+gpg: revocation comment: (fingerprint 1D36 D924 8B33 DCAB 7BA5 BA44 7A30 BCF4 42B8 F7C2)+gpg: F13322411B80ADE6: skipped: Unusable public key+gpg: [stdin]: encryption failed: Unusable public key++git-annex: user error (gpg ["--quiet","--trust-model","always","--encrypt","--no-encrypt-to","--no-default-recipient","--recipient","7A30BCF442B8F7C2","--recipient","F13322411B80ADE6"] exited 2)+failed+git-annex: enableremote: 1 failed+"""]]++> [[done]]; can now use: `git annex enableremote foo keyid-=REVOKEDKEY+> keyid+=NEWKEY` to remove it, and add a new key. --[[Joey]]
@@ -0,0 +1,307 @@+What steps will reproduce the problem?++```+WEBDAV_USERNAME=pradermecker@yahoo.ca WEBDAV_PASSWORD=xxxxxx git annex initremote box.com type=webdav url=https://www.box.com/dav/git-annex chunksize=75mb encryption=none+```++What is the expected output? What do you see instead?++I have: +```+git-annex: WebDAV failed to write file: FailedConnectionException "www.box.com" 443: user error+```+# What version of git-annex are you using? On what operating system?++```+git-annex version: 4.20130314+local repository version: 3+default repository version: 3+supported repository versions: 3 4+upgrade supported from repository versions: 0 1 2+build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP DNS+```+Archlinux 64: https://aur.archlinux.org/packages/git-annex/++# Please provide any additional information below.++1. Try my password a couple of time. It works with Chrome, Firefox or cadaver+2. I am using a zsh shell and try exporting both env. variables+3. git-annex test has errors++### Error in: git-annex add:1 +sha1foodup: openFile: does not exist (No such file or directory)+Cases: 3 Tried: 2 Errors: 2 Failures: 0warning: remote HEAD refers to nonexistent ref, unable to checkout.++git-annex: dir/foo: getFileStatus: does not exist (No such file or directory)+### Failure in: git-annex add:2 +add of subdir failed+Cases: 3 Tried: 3 Errors: 2 Failures: 1+----------------------------------------------------------------------+reinject+Cases: 1 Tried: 0 Errors: 0 Failures: 0warning: remote HEAD refers to nonexistent ref, unable to checkout.++git-annex: sha1foo not found+### Failure in: git-annex reinject/fromkey+reinject failed+Cases: 1 Tried: 1 Errors: 0 Failures: 1+----------------------------------------------------------------------+unannex+Cases: 2 Tried: 0 Errors: 0 Failures: 0warning: remote HEAD refers to nonexistent ref, unable to checkout.++### Error in: git-annex unannex:0:no content+foo: getSymbolicLinkStatus: does not exist (No such file or directory)+Cases: 2 Tried: 1 Errors: 1 Failures: 0warning: remote HEAD refers to nonexistent ref, unable to checkout.++git-annex: foo not found+### Error in: git-annex unannex:1:with content+foo: getSymbolicLinkStatus: does not exist (No such file or directory)+Cases: 2 Tried: 2 Errors: 2 Failures: 0+----------------------------------------------------------------------+drop+Cases: 3 Tried: 0 Errors: 0 Failures: 0warning: remote HEAD refers to nonexistent ref, unable to checkout.++git-annex: foo not found+git-annex: foo not found+### Failure in: git-annex drop:0:no remotes+drop wrongly succeeded with no known copy of file+Cases: 3 Tried: 1 Errors: 0 Failures: 1warning: remote HEAD refers to nonexistent ref, unable to checkout.++git-annex: foo not found+### Error in: git-annex drop:1:with remote+foo: getSymbolicLinkStatus: does not exist (No such file or directory)+Cases: 3 Tried: 2 Errors: 1 Failures: 1warning: remote HEAD refers to nonexistent ref, unable to checkout.++git-annex: foo not found+### Error in: git-annex drop:2:untrusted remote+foo: getSymbolicLinkStatus: does not exist (No such file or directory)+Cases: 3 Tried: 3 Errors: 2 Failures: 1+----------------------------------------------------------------------+get+Cases: 1 Tried: 0 Errors: 0 Failures: 0warning: remote HEAD refers to nonexistent ref, unable to checkout.++### Error in: git-annex get +foo: openFile: does not exist (No such file or directory)+Cases: 1 Tried: 1 Errors: 1 Failures: 0+----------------------------------------------------------------------+move+Cases: 1 Tried: 0 Errors: 0 Failures: 0warning: remote HEAD refers to nonexistent ref, unable to checkout.++### Error in: git-annex move +foo: getSymbolicLinkStatus: does not exist (No such file or directory)+Cases: 1 Tried: 1 Errors: 1 Failures: 0+----------------------------------------------------------------------+copy+Cases: 1 Tried: 0 Errors: 0 Failures: 0warning: remote HEAD refers to nonexistent ref, unable to checkout.++### Error in: git-annex copy +foo: getSymbolicLinkStatus: does not exist (No such file or directory)+Cases: 1 Tried: 1 Errors: 1 Failures: 0+----------------------------------------------------------------------+lock+Cases: 1 Tried: 0 Errors: 0 Failures: 0warning: remote HEAD refers to nonexistent ref, unable to checkout.++### Error in: git-annex unlock/lock +foo: getSymbolicLinkStatus: does not exist (No such file or directory)+Cases: 1 Tried: 1 Errors: 1 Failures: 0+----------------------------------------------------------------------+edit+Cases: 2 Tried: 0 Errors: 0 Failures: 0warning: remote HEAD refers to nonexistent ref, unable to checkout.++git-annex: foo not found+### Error in: git-annex edit/commit:0 +foo: getSymbolicLinkStatus: does not exist (No such file or directory)+Cases: 2 Tried: 1 Errors: 1 Failures: 0warning: remote HEAD refers to nonexistent ref, unable to checkout.++git-annex: foo not found+### Error in: git-annex edit/commit:1 +foo: getSymbolicLinkStatus: does not exist (No such file or directory)+Cases: 2 Tried: 2 Errors: 2 Failures: 0+----------------------------------------------------------------------+fix+Cases: 1 Tried: 0 Errors: 0 Failures: 0warning: remote HEAD refers to nonexistent ref, unable to checkout.++### Error in: git-annex fix +foo: getSymbolicLinkStatus: does not exist (No such file or directory)+Cases: 1 Tried: 1 Errors: 1 Failures: 0+----------------------------------------------------------------------+trust+Cases: 1 Tried: 0 Errors: 0 Failures: 0warning: remote HEAD refers to nonexistent ref, unable to checkout.++Cases: 1 Tried: 1 Errors: 0 Failures: 0+----------------------------------------------------------------------+fsck+Cases: 4 Tried: 0 Errors: 0 Failures: 0warning: remote HEAD refers to nonexistent ref, unable to checkout.++### Failure in: git-annex fsck:0 +fsck failed to fail with numcopies unsatisfied+Cases: 4 Tried: 2 Errors: 0 Failures: 1warning: remote HEAD refers to nonexistent ref, unable to checkout.++git-annex: foo not found+### Failure in: git-annex fsck:2 +fsck failed to fail with content only available in untrusted (current) repository+Cases: 4 Tried: 3 Errors: 0 Failures: 2warning: remote HEAD refers to nonexistent ref, unable to checkout.++git-annex: foo not found+git-annex: sha1foo not found+### Failure in: git-annex fsck:3 +fsck failed to fail with content not replicated to enough non-untrusted repositories+Cases: 4 Tried: 4 Errors: 0 Failures: 3+----------------------------------------------------------------------+migrate+Cases: 2 Tried: 0 Errors: 0 Failures: 0warning: remote HEAD refers to nonexistent ref, unable to checkout.++### Error in: git-annex migrate:0 +foo: getSymbolicLinkStatus: does not exist (No such file or directory)+Cases: 2 Tried: 1 Errors: 1 Failures: 0warning: remote HEAD refers to nonexistent ref, unable to checkout.++### Error in: git-annex migrate:1 +foo: getSymbolicLinkStatus: does not exist (No such file or directory)+Cases: 2 Tried: 2 Errors: 2 Failures: 0+----------------------------------------------------------------------+ unused+Cases: 1 Tried: 0 Errors: 0 Failures: 0warning: remote HEAD refers to nonexistent ref, unable to checkout.++git-annex: foo not found+git-annex: sha1foo not found+fatal: pathspec 'foo' did not match any files+### Failure in: git-annex unused/dropunused+git rm failed+Cases: 1 Tried: 1 Errors: 0 Failures: 1+----------------------------------------------------------------------+describe+Cases: 1 Tried: 0 Errors: 0 Failures: 0warning: remote HEAD refers to nonexistent ref, unable to checkout.++Cases: 1 Tried: 1 Errors: 0 Failures: 0+----------------------------------------------------------------------+find+Cases: 1 Tried: 0 Errors: 0 Failures: 0warning: remote HEAD refers to nonexistent ref, unable to checkout.++### Error in: git-annex find +foo: getSymbolicLinkStatus: does not exist (No such file or directory)+Cases: 1 Tried: 1 Errors: 1 Failures: 0+----------------------------------------------------------------------+merge+Cases: 1 Tried: 0 Errors: 0 Failures: 0warning: remote HEAD refers to nonexistent ref, unable to checkout.++Cases: 1 Tried: 1 Errors: 0 Failures: 0+----------------------------------------------------------------------+status+Cases: 1 Tried: 0 Errors: 0 Failures: 0warning: remote HEAD refers to nonexistent ref, unable to checkout.++{"command":"status","supported backends":["SHA256E","SHA1E","SHA512E","SHA224E","SHA384E","SHA256","SHA1","SHA512","SHA224","SHA384","WORM","URL"],"supported remote types":["git","S3","bup","directory","rsync","web","webdav","glacier","hook"],"repository mode":"indirect","trusted repositories":[],"semitrusted repositories":[{"uuid":"00000000-0000-0000-0000-000000000001","description":"web","here":false},{"uuid":"80db3ccc-8c73-4279-b803-1b02c91dd158","description":".t/tmprepo0","here":true},{"uuid":"c01ef662-caa7-46d1-95de-544bee8b08f1","description":"origin (test repo)","here":false}],"untrusted repositories":[],"dead repositories":[],"available local disk space":"75 gigabytes (+1 megabyte reserved)","local annex keys":0,"local annex size":"0 bytes","known annex keys":0,"known annex size":"0 bytes","bloom filter size":"16 mebibytes (0% full)","success":true}+Cases: 1 Tried: 1 Errors: 0 Failures: 0+----------------------------------------------------------------------+version+Cases: 1 Tried: 0 Errors: 0 Failures: 0warning: remote HEAD refers to nonexistent ref, unable to checkout.++git-annex version: 4.20130314+local repository version: 3+default repository version: 3+supported repository versions: 3 4+upgrade supported from repository versions: 0 1 2+build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP DNS+Cases: 1 Tried: 1 Errors: 0 Failures: 0+----------------------------------------------------------------------+sync+Cases: 1 Tried: 0 Errors: 0 Failures: 0warning: remote HEAD refers to nonexistent ref, unable to checkout.++# On branch master+#+# Initial commit+#+nothing to commit (create/copy files and use "git add" to track)+### Failure in: git-annex sync +sync failed+Cases: 1 Tried: 1 Errors: 0 Failures: 1+----------------------------------------------------------------------+sync regression+Cases: 1 Tried: 0 Errors: 0 Failures: 0warning: remote HEAD refers to nonexistent ref, unable to checkout.++warning: remote HEAD refers to nonexistent ref, unable to checkout.++warning: remote HEAD refers to nonexistent ref, unable to checkout.++git-annex: foo not found+git-annex: foo not found+git-annex: foo not found+# On branch master+#+# Initial commit+#+nothing to commit (create/copy files and use "git add" to track)+### Failure in: git-annex sync_regression +sync failed+Cases: 1 Tried: 1 Errors: 0 Failures: 1+----------------------------------------------------------------------+map+Cases: 1 Tried: 0 Errors: 0 Failures: 0warning: remote HEAD refers to nonexistent ref, unable to checkout.++Cases: 1 Tried: 1 Errors: 0 Failures: 0+----------------------------------------------------------------------+uninit+Cases: 1 Tried: 0 Errors: 0 Failures: 0warning: remote HEAD refers to nonexistent ref, unable to checkout.++### Error in: git-annex uninit +foo: getSymbolicLinkStatus: does not exist (No such file or directory)+Cases: 1 Tried: 1 Errors: 1 Failures: 0+----------------------------------------------------------------------+upgrade+Cases: 1 Tried: 0 Errors: 0 Failures: 0warning: remote HEAD refers to nonexistent ref, unable to checkout.++Cases: 1 Tried: 1 Errors: 0 Failures: 0+----------------------------------------------------------------------+whereis+Cases: 1 Tried: 0 Errors: 0 Failures: 0warning: remote HEAD refers to nonexistent ref, unable to checkout.++### Error in: git-annex whereis +foo: getSymbolicLinkStatus: does not exist (No such file or directory)+Cases: 1 Tried: 1 Errors: 1 Failures: 0+----------------------------------------------------------------------+hook remote+Cases: 1 Tried: 0 Errors: 0 Failures: 0warning: remote HEAD refers to nonexistent ref, unable to checkout.++git-annex: foo not found+### Error in: git-annex hook remote +foo: getSymbolicLinkStatus: does not exist (No such file or directory)+Cases: 1 Tried: 1 Errors: 1 Failures: 0+----------------------------------------------------------------------+directory remote+Cases: 1 Tried: 0 Errors: 0 Failures: 0warning: remote HEAD refers to nonexistent ref, unable to checkout.++git-annex: foo not found+### Error in: git-annex directory remote+foo: getSymbolicLinkStatus: does not exist (No such file or directory)+Cases: 1 Tried: 1 Errors: 1 Failures: 0+----------------------------------------------------------------------+rsync remote+Cases: 1 Tried: 0 Errors: 0 Failures: 0warning: remote HEAD refers to nonexistent ref, unable to checkout.++git-annex: foo not found+### Error in: git-annex rsync remote +foo: getSymbolicLinkStatus: does not exist (No such file or directory)+Cases: 1 Tried: 1 Errors: 1 Failures: 0+----------------------------------------------------------------------+bup remote+Cases: 1 Tried: 0 Errors: 0 Failures: 0warning: remote HEAD refers to nonexistent ref, unable to checkout.++Cases: 1 Tried: 1 Errors: 0 Failures: 0+----------------------------------------------------------------------+crypto+Cases: 1 Tried: 0 Errors: 0 Failures: 0warning: remote HEAD refers to nonexistent ref, unable to checkout.++git-annex: foo not found+### Error in: git-annex crypto +foo: getSymbolicLinkStatus: does not exist (No such file or directory)+Cases: 1 Tried: 1 Errors: 1 Failures: 0+----------------------------------------------------------------------+Some tests failed!+ (This could be due to a bug in git-annex, or an incompatability+ with utilities, such as git, installed on this system.)++> (The test suite output suggests to me that it was run on a system+> that does not support symlinks, and may be broken in some other way+> as well, but is not relevant to this bug report.)+> --[[Joey]] ++> Closing this bug since the bug submitter cannot reproduce it and+> had many problems that seems to point at a bad build. [[done]] --[[Joey]]
@@ -0,0 +1,18 @@+[[!comment format=mdwn+ username="https://pradermecker.myopenid.com/"+ ip="195.244.162.7"+ subject="comment 10"+ date="2013-03-18T15:47:19Z"+ content="""+Ok, I will try that.++For your information, I have rebuild the aur package inside a VM using the latest master. All tests passed.++Now I get a new error message with WEBDAV saying:++```+git-annex: WebDAV failed to write file: \"Conflict\": user error+```++As a note the current aur build is rather cumbersome because it needs to rebuild a lot of packages using cabal. I believe this is due to a few missing dependencies in the Arch repos [haskell-core] and [haskell-web] such as uuid, SafeSemaphore or c2hs.+"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="https://pradermecker.myopenid.com/"+ ip="195.244.162.7"+ subject="comment 11"+ date="2013-03-18T16:24:52Z"+ content="""+FYI, it is a bit heavy for me to try the standalone version as it is 32 bits only (I am on 64-bits)+"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ nickname="joey"+ subject="comment 12"+ date="2013-03-18T16:33:31Z"+ content="""+The standalone version works on either architecture, it does not depend on any system libraries, thus the name \"standalone\".+"""]]
@@ -0,0 +1,11 @@+[[!comment format=mdwn+ username="https://pradermecker.myopenid.com/"+ ip="195.244.162.7"+ subject="comment 13"+ date="2013-03-18T16:39:58Z"+ content="""+I actually don't know if it has something to do with 32 or 64 bits but with the standalone I have got:+/opt/git-annex.linux/runshell: line 69: /opt/git-annex.linux/bin/git-annex-shell: No such file or directory++I have tried both the aur standalone and directly downloading the tarball.+"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ nickname="joey"+ subject="comment 14"+ date="2013-03-18T16:54:02Z"+ content="""+Given that line 69 of runshell is a newline, and that runshell does not ever try to run git-annex-shell, I wonder what you downloaded exactly...+"""]]
@@ -0,0 +1,27 @@+[[!comment format=mdwn+ username="https://pradermecker.myopenid.com/"+ ip="195.244.162.7"+ subject="comment 15"+ date="2013-03-18T19:07:31Z"+ content="""+Euh. I actually feel stupid enough with this but ...++I have try first with your link and it gives me:++```+./runshell: line 75: /home/vagrant/programs/git-annex.linux/bin/sh: No such file or directory+```++As I told you I then try the AUR package : https://aur.archlinux.org/packages/git-annex-standalone/++And it does give me the same error on line 69.++It is the same line (3 lines before the end):++```+exec \"$cmd\" \"$@\"+```++I really don't get it because the file is there ... and the first sanity checks of the script have pass.++"""]]
@@ -0,0 +1,14 @@+[[!comment format=mdwn+ username="https://pradermecker.myopenid.com/"+ ip="195.244.162.7"+ subject="comment 16"+ date="2013-03-18T19:31:42Z"+ content="""+Actually it is even worse ...++With your link, line 75 is actually 2 lines below (sh).++So same command (runshell), same error, different places (I guess it is always the last line executed) ...++Is it supposed to work fine in 64 bits also ?+"""]]
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ nickname="joey"+ subject="comment 7"+ date="2013-03-18T23:05:26Z"+ content="""+The standalone linux tarball will work on 64 or 32 bit systems, as long as they are capable of linking 32 bit elf executables. I cannot test if Arch Linux is incapable of this.++I'm getting a bit tired of wild tangents, can we you just find someplace, be it a Debian chroot or whatever, to run the standalone linux tarball and test if DAV works there?+"""]]
@@ -0,0 +1,29 @@+[[!comment format=mdwn+ username="https://pradermecker.myopenid.com/"+ ip="195.244.162.7"+ subject="It works !"+ date="2013-03-19T10:40:31Z"+ content="""+Sorry for the wild tangents.++It is now working. I am not sure what went wrong.++For the record here are the steps I took (all using the Git annex UI):++* Set up removable media -> OK+* Set up remote SSH -> missing lsof -> install it -> everything OK+* Set up S3 -> had issue with time -> solve it with ntp -> everything OK+* Try again WebDav -> \"Conflict\" message -> try using another dir -> everything OK++There might be a \"cleanup after error problem\" somewhere that would explain the conflict message I have received.++Again for the record, I made it works inside a VM using the AUR \"git-annex 4.20130314-1\" (not the standalone). The only change I made on the PKGBUILD was to install everything with cabal except for the packages in the [haskell-core] Arch repo. I know you are not aware with Arch but basically I choose not to rely on the [haskell-web] Arch repo.++I will try again at home on my laptop and I will try the standalone as well.++Thanks you so much for the wonderful product !++Cheers+++"""]]
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ nickname="joey"+ subject="comment 1"+ date="2013-03-16T15:35:05Z"+ content="""+The i386 standalone build for 4.20130314, which is IIRC repackaged by Arch linux, was made using a known broken webdav library. I've since updated that build to use a new version of webdav. Since it only affected that one build, I do not plan to do a full re-release with a new version number.++Probably Arch needs to update their package.+"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="https://pradermecker.myopenid.com/"+ ip="81.244.205.197"+ subject="Thanks"+ date="2013-03-16T15:46:45Z"+ content="""+Thanks for your quick comment ! I was about to get crazy trying my password again and again ;-)+"""]]
@@ -0,0 +1,14 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ nickname="joey"+ subject="comment 3"+ date="2013-03-17T21:07:50Z"+ content="""+Seems that I misdiagnosed this. The error message from the bad TLS library was about a had certificate, not \"user error\" (which, confusingly, does not mean what user error normally means!).++Also, I see you reported this at <https://aur.archlinux.org/packages/git-annex/>, so you're using that build and not the \"git-annex-bin\" build at <https://aur.archlinux.org/packages.php?ID=63503>. The Arch Linux build that's done from source couldn't be affected by the Debian-spefific TLS bug anyway.++I am reopening this bug report. ++Now, FailedConnectionException could be any of several things, but I noticed that someone else (perhaps cooindidentially using Arch Linux) reported the same error message here: [[Proxy_support]]. I wonder if you perhaps also have a http proxy that could be causing trouble.+"""]]
@@ -0,0 +1,22 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ nickname="joey"+ subject="comment 4"+ date="2013-03-17T21:19:20Z"+ content="""+Digging into your error message a bit more, it looks like this is not a http proxy (or if it is, it's letting some connections through). ++git-annex is testing the box.com WebDAV server, by performing 3 actions:++1. Creating the requested subdirectory on it, in your case \"git-annex\". +2. Creating an empty file to that directory, named \"git-annex-test\"+3. Deleting the file.++Step 2 is failing. Which sort of suggests step 1 succeeded, but who knows..++So, if you go look at your files on box.com, do you have a git-annex directory?++Does git-annex/git-annex-test exist?++Does it also fail if you use a different directory, like https://www.box.com/dav/git-annex2 ?+"""]]
@@ -0,0 +1,17 @@+[[!comment format=mdwn+ username="https://pradermecker.myopenid.com/"+ ip="81.244.157.3"+ subject="comment 5"+ date="2013-03-17T22:03:22Z"+ content="""+No there is no directory created on box.com. I have actually tried with other names without success. I did even try to create the directory myself and use this one but it makes no difference.++I am not sure to understand what 443 means.++To be sure it is not a local config problem on my computer, I have tried to put a file to box using cadaver: cadaver works just fine (create dir, upload, delete file).++After your comment, I actually rebuild the package using master. I still have the same error with WebDav but now all tests pass (git annex test)++Let me know if you need me to do further investigation. Thanks.++"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="https://pradermecker.myopenid.com/"+ ip="81.244.157.3"+ subject="comment 6"+ date="2013-03-17T22:07:06Z"+ content="""+I have also tried with the gui and got the same error.+"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ nickname="joey"+ subject="comment 7"+ date="2013-03-18T00:18:52Z"+ content="""+443 is the port used for https.+"""]]
@@ -0,0 +1,12 @@+[[!comment format=mdwn+ username="https://pradermecker.myopenid.com/"+ ip="195.244.162.7"+ subject="comment 8"+ date="2013-03-18T08:33:04Z"+ content="""+Yes, of course, I know about 443.++I was just surprised to see it in the error message (where as a code my mind was expecting a http error code).++What I meant is that I don't really see how it fits in the current error message.+"""]]
@@ -0,0 +1,9 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ nickname="joey"+ subject="comment 9"+ date="2013-03-18T15:04:00Z"+ content="""+I think what you need to do is try installing the [Linux standalone tarball](http://downloads.kitenet.net/git-annex/linux/current/) and see if it works with WebDAV. We need to rule out this being a bad build on the Arch side. The Linux standalone tarball works with box.com for me.++"""]]
@@ -0,0 +1,4 @@+I have files with very long filenames on an xfs at home. On my laptop the annex should have been checked out on an encfs, but there filenames can't be as long as on the xfs. So perhaps it would be good to limit the keysize to a sane substring of the filename e.g. use only the first 120 characters.++> Since there seems no strong argument for a WORM100, and better options+> exist, closing. [[done]] --[[Joey]]
@@ -0,0 +1,25 @@+### Please describe the problem.++When starting an git annex webapp in my documents repository, i get the error message, that the watcher thread has died. The error message seems to be arising from the fact, that a watcher thread for an empty string should be started, which does not work.++### What steps will reproduce the problem?++I've no idea, how to reproduce this in another repostory.++### What version of git-annex are you using? On what operating system?++ii git-annex 4.20130709 i386 manage files with git, without checking their contents into git++### 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++Watcher crashed: addWatch: does not exist (No such file or directory)+[2013-07-14 10:30:35 CEST] Watcher: warning Watcher crashed: addWatch: does not exist (No such file or directory)++# End of transcript or log.+"""]]++> [[done]]; see my comment --[[Joey]]
@@ -0,0 +1,7 @@+When I attempt to add a Box.com special remote to my annex I get the following error:++ git-annex: HandshakeFailed (Error_Protocol ("certificate rejected: certificate is not allowed to sign another certificate",True,CertificateUnknown))++Running git-annex version: 3.20130207++> Got that bug fixed in Debian and all builds updated. [[done]] --[[Joey]]
@@ -0,0 +1,15 @@+What steps will reproduce the problem?++From the webapp, go to Configuration > Manage repositories > Remote server. Enter a hostname that only has an IPv6 hostname (e.g. ipv6.google.com). Click Check this server.++What is the expected output? What do you see instead?++Expect the application to attempt to check the server via SSH. Instead, it results in error "cannot resolve host name".++What version of git-annex are you using? On what operating system?++git-annex 3.20120924 on Debian testing (amd64).++Please provide any additional information below.++> Thanks, [[fixed|done]] --[[Joey]]
@@ -0,0 +1,57 @@+## What steps will reproduce the problem?++ ~$ git annex webapp+++* Add Another Local Repository (~/Direct) "Direct", keep separate (from existing repo) no repo type+* Add Repository, ~/Indirect "Indirect", combine (with Direct) , repo type client+* Syncing enabled on both++Then++ ~/Indirect$ git annex indirect+ commit ok+ indirect ok+ ok+ ~/Indirect$ touch ../Direct/Test.File+ ++## What is the expected output? What do you see instead?++That ~/Indirect/Test.File be a symlink into .git/annex/objects/.......++Instead, it is not a symlink. However, doing++ ~/Indirect$ git annex direct+ ~/Indirect$ git annex indirect++results in what I would expect (until the content of Direct/Test.File is changed, when it ceases to be a symlink in ~/Indirect once more)++++## What version of git-annex are you using? On what operating system?+git-annex version: 4.20130405++Ubuntu 12.10+++## Please provide any additional information below.++Reading [[direct_mode]], I thought that I could have two repos on my computer, one direct, and one indirect, and if running the assistant, that I could gain the security of retaining old versions, as well as the convenience of direct mode. (I think I understand that correctly; if a direct-mode file only exists in one repository, and is edited, the old version is lost, but if it is in multiple repos, then the old versions will be retained).++It seems to me that if I do++ ~/Direct$ echo Content > Test.File+ ~/Direct$ echo More Content > Test.File+ ~/Direct$ echo Even More Content > Test.File++that all three copies are stored in ~/Indirect, so the functionality I'm after seems to work. However, ~/Indirect/Test.File ends up not being a symlink, which I think is odd/unexpected.+++**Edit: Doing a git annex sync in ~/Indirect results in the continuing behaviour to be correct, so there's some issue telling Direct that Indirect is no longer in direct-mode?**+This appears to fix it, but I guess shouldn't be necessary.++> AFAICS, the entire problem is that the assistant does not notice when the+> repository it's running in is changed from direct to indirect mode. Since this+> has also been reported to cause problems with the assistant, I have added+> a check to prevent it from being done. [[done]] --[[Joey]]
@@ -0,0 +1,379 @@+### Please describe the problem.+I try to share some files between a windows machine and a linux machine in direct mode, with a remote repository between the two. I can't seem to reproduce the problem in indirect mode...++I add a file on the windows machine then copy it to the remote repository. I then get it on the linux machine and edit it there. If I `git annex sync` and copy the file's data to the remote repository, a `git annex sync` on windows will fail like this:++[[!format sh """+$ git annex sync+commit+ok+pull origin+remote: Counting objects: 41, done.+remote: Compressing objects: 100% (24/24), done.+remote: Total 31 (delta 9), reused 0 (delta 0)+Unpacking objects: 100% (31/31), done.+From ssh://192.168.1.29:/home/raz/work/test+ b23cb44..9073cc3 git-annex -> origin/git-annex+ 7d4f0e2..87438fc master -> origin/master+ 57a661c..b33b025 synced/git-annex -> origin/synced/git-annex+ 7d4f0e2..87438fc synced/master -> origin/synced/master+ok+(merging origin/git-annex origin/synced/git-annex into git-annex...)+(Recording state in git...)+push origin+Counting objects: 17, done.+Delta compression using up to 8 threads.+Compressing objects: 100% (4/4), done.+Writing objects: 100% (5/5), 565 bytes | 0 bytes/s, done.+Total 5 (delta 2), reused 0 (delta 0)+To ssh://192.168.1.29:/home/raz/work/test.git+ b33b025..dcfaf23 git-annex -> synced/git-annex+ ! [rejected] master -> synced/master (non-fast-forward)+error: failed to push some refs to 'ssh://192.168.1.29:/home/raz/work/test.git'+hint: Updates were rejected because a pushed branch tip is behind its remote+hint: counterpart. Check out this branch and merge the remote changes+hint: (e.g. 'git pull') before pushing again.+hint: See the 'Note about fast-forwards' in 'git push --help' for details.+failed+git-annex: sync: 1 failed+"""]]++A `git log` tells me the master branch is not properly merged so I assume the pull failed silently (I paste the log in the transcript).++I can then try to manually fix the windows working copy and sometimes it kind of work, but sometimes I have a hard time recovering and I am better off cloning a new version and moving data's around...++### What steps will reproduce the problem?+Create a repository on a windows.++Add a file.++`git clone --bare` the repository and put it on a remote machine.++Clone the remote repository to a linux machine.++Get the file's data.++Edit the file on linux.++Commit it and copy the data's to the remote machine.++`git clone sync` on the windows machine --> Error.++### What version of git-annex are you using? On what operating system?+On Windows:+[[!format sh """+git-annex version: 4.20130827-g4f18612+build flags: Pairing Testsuite S3 WebDAV DNS+local repository version: 4+default repository version: 3+supported repository versions: 3 4+upgrade supported from repository versions: 2+"""]]++On Linux+[[!format sh """+git-annex version: 4.20130815+build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP+local repository version: 4+default repository version: 3+supported repository versions: 3 4+upgrade supported from repository versions: 0 1 2+"""]]++### 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++### On Windows++$ mkdir test_windows++$ cd test_windows/++$ git init+Initialized empty Git repository in c:/Users/raz/test_windows/.git/++$ git annex init windows+init windows+ Detected a crippled filesystem.++ Enabling direct mode.++ Detected a filesystem without fifo support.++ Disabling ssh connection caching.+ok+(Recording state in git...)++$ echo "test 1" > test.txt++$ git annex add test.txt+add test.txt (checksum...) ok+(Recording state in git...)++$ git annex sync+commit+ok+git-annex: no branch is checked out++$ cd ..++$ git clone --bare test_windows/ test.git+Cloning into bare repository 'test.git'...+done.++$ scp -r test.git 192.168.1.29:/home/raz/work/+config 100% 183 0.2KB/s 00:00+description 100% 73 0.1KB/s 00:00+HEAD 100% 23 0.0KB/s 00:00+applypatch-msg.sample 100% 452 0.4KB/s 00:00+commit-msg.sample 100% 896 0.9KB/s 00:00+post-commit.sample 100% 160 0.2KB/s 00:00+post-receive.sample 100% 552 0.5KB/s 00:00+post-update.sample 100% 189 0.2KB/s 00:00+pre-applypatch.sample 100% 398 0.4KB/s 00:00+pre-commit.sample 100% 1704 1.7KB/s 00:00+pre-push.sample 100% 1348 1.3KB/s 00:00+pre-rebase.sample 100% 4951 4.8KB/s 00:00+prepare-commit-msg.sample 100% 1239 1.2KB/s 00:00+update.sample 100% 3611 3.5KB/s 00:00+exclude 100% 240 0.2KB/s 00:00+825dc642cb6eb9a060e54bf8d69288fbee4904 100% 15 0.0KB/s 00:00+a31b7a55380d79248658d3fffff6d2dc41a726 100% 116 0.1KB/s 00:00+dcabbf728abe62b6e2bcc06b8306eb3aa9a497 100% 176 0.2KB/s 00:00+332ecbfe923879df51a7a3f9bb86ebdfb64273 100% 45 0.0KB/s 00:00+4f0e20d38d6dc757340a8c569270b5a857fc67 100% 160 0.2KB/s 00:00+62956bcf45c63b24a637b22a742db0d9458248 100% 86 0.1KB/s 00:00+7ec519eb1b257a85ae8f9373d0835dea9ddc04 100% 82 0.1KB/s 00:00+1d1559a050b4a2df2e653b1e7ac15bdf7d56b1 100% 51 0.1KB/s 00:00+b74dbedfac4d6a0a90580cff2088a5d61f6675 100% 130 0.1KB/s 00:00+0ca042f439ef997f04a25a449aa1f539b93cf4 100% 53 0.1KB/s 00:00+bbce5e51e5a90ffd26900de3546fc4f9704181 100% 151 0.2KB/s 00:00+18bd66316298fcc5c06af9865c30a2fe4d2476 100% 176 0.2KB/s 00:00+edf8b5cc207e16ca0173785a2ba569c5d4208c 100% 71 0.1KB/s 00:00+packed-refs 100% 160 0.2KB/s 00:00++$ cd test_windows/++$ git remote add origin ssh://192.168.1.29:/home/raz/work/test.git++$ git annex copy --to origin+copy test.txt (checking origin...) (to origin...)+test.txt+ 7 100% 0.00kB/s 0:00:00 (xfer#1, to-check=0/1)++sent 79 bytes received 31 bytes 220.00 bytes/sec+total size is 7 speedup is 0.06+ok+(Recording state in git...)++$ git annex sync+commit+ok+pull origin+remote: Counting objects: 11, done.+remote: Compressing objects: 100% (5/5), done.+remote: Total 6 (delta 1), reused 0 (delta 0)+Unpacking objects: 100% (6/6), done.+From ssh://192.168.1.29:/home/raz/work/test+ * [new branch] git-annex -> origin/git-annex+ * [new branch] master -> origin/master+ok+(merging origin/git-annex into git-annex...)+(Recording state in git...)+push origin+Counting objects: 18, done.+Delta compression using up to 8 threads.+Compressing objects: 100% (8/8), done.+Writing objects: 100% (10/10), 874 bytes | 0 bytes/s, done.+Total 10 (delta 4), reused 0 (delta 0)+To ssh://192.168.1.29:/home/raz/work/test.git+ * [new branch] git-annex -> synced/git-annex+ * [new branch] master -> synced/master+ok++### On Linux++$ git clone test.git test_linux+Cloning into 'test_linux'...+done.++$ cd test_linux ++$ git annex init linux+init linux ok+(Recording state in git...)++$ git annex sync+(merging origin/git-annex origin/synced/git-annex into git-annex...)+(Recording state in git...)+commit +ok+pull origin +ok+push origin +Counting objects: 11, done.+Delta compression using up to 4 threads.+Compressing objects: 100% (6/6), done.+Writing objects: 100% (8/8), 775 bytes | 0 bytes/s, done.+Total 8 (delta 3), reused 0 (delta 0)+To /home/raz/work/test.git+ 0b4f175..41fba1d git-annex -> synced/git-annex+ok++$ git annex get+get test.txt (from origin...) ok+(Recording state in git...)++$ git annex direct+commit +# On branch master+nothing to commit, working directory clean+ok+direct test.txt ok+direct ok++$ git annex sync+commit +ok+pull origin +ok+push origin +Counting objects: 9, done.+Delta compression using up to 4 threads.+Compressing objects: 100% (4/4), done.+Writing objects: 100% (5/5), 492 bytes | 0 bytes/s, done.+Total 5 (delta 1), reused 0 (delta 0)+To /home/raz/work/test.git+ 41fba1d..57a661c git-annex -> synced/git-annex+ok++$ cat test.txt +test 1++$ echo "test 2" > test.txt++$ git annex sync+add test.txt (checksum...) ok+(Recording state in git...)+commit +(Recording state in git...)+ok+pull origin +ok+push origin +Counting objects: 22, done.+Delta compression using up to 4 threads.+Compressing objects: 100% (12/12), done.+Writing objects: 100% (16/16), 1.40 KiB | 0 bytes/s, done.+Total 16 (delta 4), reused 0 (delta 0)+To /home/raz/work/test.git+ 57a661c..4883cad git-annex -> synced/git-annex+ 7d4f0e2..87438fc master -> synced/master+ok++$ git annex copy --to origin+copy test.txt (to origin...) ok+(Recording state in git...)++$ git annex sync +commit +ok+pull origin +remote: Counting objects: 6, done.+remote: Compressing objects: 100% (4/4), done.+remote: Total 5 (delta 0), reused 0 (delta 0)+Unpacking objects: 100% (5/5), done.+From /home/raz/work/test+ b23cb44..9073cc3 git-annex -> origin/git-annex+ok+(merging origin/git-annex into git-annex...)+(Recording state in git...)+push origin +Counting objects: 18, done.+Delta compression using up to 4 threads.+Compressing objects: 100% (8/8), done.+Writing objects: 100% (10/10), 924 bytes | 0 bytes/s, done.+Total 10 (delta 3), reused 0 (delta 0)+To /home/raz/work/test.git+ 4883cad..b33b025 git-annex -> synced/git-annex+ok++$ +++### On Windows++$ git annex sync+commit+ok+pull origin+remote: Counting objects: 41, done.+remote: Compressing objects: 100% (24/24), done.+remote: Total 31 (delta 9), reused 0 (delta 0)+Unpacking objects: 100% (31/31), done.+From ssh://192.168.1.29:/home/raz/work/test+ b23cb44..9073cc3 git-annex -> origin/git-annex+ 7d4f0e2..87438fc master -> origin/master+ 57a661c..b33b025 synced/git-annex -> origin/synced/git-annex+ 7d4f0e2..87438fc synced/master -> origin/synced/master+ok+(merging origin/git-annex origin/synced/git-annex into git-annex...)+(Recording state in git...)+push origin+Counting objects: 17, done.+Delta compression using up to 8 threads.+Compressing objects: 100% (4/4), done.+Writing objects: 100% (5/5), 565 bytes | 0 bytes/s, done.+Total 5 (delta 2), reused 0 (delta 0)+To ssh://192.168.1.29:/home/raz/work/test.git+ b33b025..dcfaf23 git-annex -> synced/git-annex+ ! [rejected] master -> synced/master (non-fast-forward)+error: failed to push some refs to 'ssh://192.168.1.29:/home/raz/work/test.git'+hint: Updates were rejected because a pushed branch tip is behind its remote+hint: counterpart. Check out this branch and merge the remote changes+hint: (e.g. 'git pull') before pushing again.+hint: See the 'Note about fast-forwards' in 'git push --help' for details.+failed+git-annex: sync: 1 failed++$ git log --graph --oneline --decorate --all+* 87438fc (origin/synced/master, origin/master) git-annex automatic sync+* 7d4f0e2 (HEAD, synced/master, master) git-annex automatic sync+*-. dcfaf23 (origin/synced/git-annex, git-annex) merging origin/git-annex orig+|\ \+| | * b33b025 merging origin/git-annex into git-annex+| | |\+| | |/+| |/|+| * | 9073cc3 (origin/git-annex) update+| | * 73518bc update+| | * 4883cad update+| | * 1b447f5 update+| |/+|/|+* | 57a661c update+| |+| \+*-. \ 41fba1d merging origin/git-annex origin/synced/git-annex into git-annex+|\ \ \+| | |/+| |/|+| | * 0b4f175 merging origin/git-annex into git-annex+| | |\+| | |/+| |/|+| * | b23cb44 update+| | * b5755a2 update+| |/+| * 6adcabb update+| * df18bd6 update+| * dcbbce5 branch created+* 0d138eb update+* fe6bccc branch created++$++# End of transcript or log.+"""]]
@@ -0,0 +1,1232 @@+Given that others can build+run OK I wonder if this is a build environment setup problem rather than a code issue. +This might be two bugs, but I rather suspect the fix to one is the fix to the other.++### Please describe the problem.+Some tests fail with:+ssh: Could not resolve hostname C: no address associated with name++then if you try and do a copy to/from an ssh remote then it fails with simply 'copy: 1 failed'++### What steps will reproduce the problem?++For the tests, simply sh standalone/windows/build.sh++For the other, I'm using a modified version of the other windows user's script, the set -x'd output is:++<pre>++ git-annex version+git-annex version: 4.20130621-g36258de^M+build flags: Pairing Testsuite S3 WebDAV DNS^M++ ssh gitremote sh testrepo.sh+git-annex version: 4.20130621-g36258de+build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP DNS+Initialized empty Git repository in /media/backup/git/repo.git/+init origin ok+(Recording state in git...)+commit+ok+git-annex: no branch is checked out++ rm -rf repo++ git init repo+Initialized empty Git repository in c:/Users/Oliver/repo/.git/++ cd repo++ git-annex init+init ^M+ Detected a crippled filesystem.^M+^M+ Enabling direct mode.^M+^M+ Detected a filesystem without fifo support.^M+^M+ Disabling ssh connection caching.^M+ok^M+(Recording state in git...)^M++ git remote add origin ssh://git@remote/~/repo.git++ echo hello++ git-annex add .+add foo.txt (checksum...) ok^M+(Recording state in git...)^M++ git commit -m .+[master (root-commit) f34a076] .+ 1 file changed, 1 insertion(+)+ create mode 120000 foo.txt++ git-annex sync+commit ^M+ok^M+pull origin warning: no common commits+From ssh://remote/~/repo+ * [new branch] git-annex -> origin/git-annex+^M+ok^M+(merging origin/git-annex into git-annex...)^M+(Recording state in git...)^M+push origin To ssh://git@remote/~/repo.git+ * [new branch] git-annex -> synced/git-annex+ * [new branch] master -> synced/master+^M+ok^M++ git-annex copy --to origin+copy foo.txt (checking origin...) (to origin...) ^M+failed^M+git-annex.exe: copy: 1 failed+</pre>++++++### What version of git-annex are you using? On what operating system?+Windows (8 x64):+git-annex version: 4.20130621-g36258de+build flags: Pairing Testsuite S3 WebDAV DNS+Linux (debian wheezy i386):+git-annex version: 4.20130621-g36258de+build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP DNS++other versions+git-bash: git(1.8.0.msysgit.0),ssh(ssh 4.6p1, ssl 0.9.8e 23 feb 2007)+msys: git(none) ssh(ssh 5.4p1, ssl 1.0.0 29 Mar 2010)+cygwin: git(1.7.9) ssh(none)++### Please provide any additional information below.++[[!format sh """+# If you can, paste a complete transcript of the problem occurring here.+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log++build.log:++ set -e++ HP='/c/Program Files (x86)/Haskell Platform/2012.4.0.0'++ FLAGS='-Webapp -Assistant -XMPP'++ PATH='/c/Program Files (x86)/Haskell Platform/2012.4.0.0/bin:/c/Program Files (x86)/Haskell Platform/2012.4.0.0/lib/extralibs/bin:/c/Program Files (x86)/NSIS:/home/Oliver/bin:.:/usr/local/bin:/mingw/bin:/bin:/c/Program Files (x86)/Haskell/bin:/c/Program Files (x86)/Haskell Platform/2013.2.0.0/lib/extralibs/bin:/c/Program Files (x86)/Haskell Platform/2013.2.0.0/bin:/c/Program Files (x86)/AMD APP/bin/x86_64:/c/Program Files (x86)/AMD APP/bin/x86:/c/Windows/system32:/c/Windows:/c/Windows/System32/Wbem:/c/Windows/System32/WindowsPowerShell/v1.0/:/c/Program Files (x86)/ATI Technologies/ATI.ACE/Core-Static:/c/Program Files (x86)/Windows Kits/8.0/Windows Performance Toolkit/:/c/Program Files/Microsoft/Web Platform Installer/:/c/Program Files (x86)/Haskell Platform/2013.2.0.0/mingw/bin:/c/Users/Oliver/AppData/Roaming/cabal/bin'++ rm -f git-annex-installer.exe++ cabal update+Downloading the latest package list from hackage.haskell.org++ rm -rf MissingH-1.2.0.0++ cabal unpack MissingH+Unpacking to MissingH-1.2.0.0\++ cd MissingH-1.2.0.0++ withcyg patch -p1++ PATH='/c/Program Files (x86)/Haskell Platform/2012.4.0.0/bin:/c/Program Files (x86)/Haskell Platform/2012.4.0.0/lib/extralibs/bin:/c/Program Files (x86)/NSIS:/home/Oliver/bin:.:/usr/local/bin:/mingw/bin:/bin:/c/Program Files (x86)/Haskell/bin:/c/Program Files (x86)/Haskell Platform/2013.2.0.0/lib/extralibs/bin:/c/Program Files (x86)/Haskell Platform/2013.2.0.0/bin:/c/Program Files (x86)/AMD APP/bin/x86_64:/c/Program Files (x86)/AMD APP/bin/x86:/c/Windows/system32:/c/Windows:/c/Windows/System32/Wbem:/c/Windows/System32/WindowsPowerShell/v1.0/:/c/Program Files (x86)/ATI Technologies/ATI.ACE/Core-Static:/c/Program Files (x86)/Windows Kits/8.0/Windows Performance Toolkit/:/c/Program Files/Microsoft/Web Platform Installer/:/c/Program Files (x86)/Haskell Platform/2013.2.0.0/mingw/bin:/c/Users/Oliver/AppData/Roaming/cabal/bin:/c/cygwin/bin'++ patch -p1+patching file src/System/IO/WindowsCompat.hs+Hunk #1 succeeded at 119 (offset -1 lines).+Hunk #2 succeeded at 132 (offset -1 lines).++ cabal install+Resolving dependencies...+In order, the following would be installed:+MissingH-1.2.0.0 (reinstall)+cabal.exe: The following packages are likely to be broken by the reinstalls:+hS3-0.5.7+Use --force-reinstalls if you want to install anyway.++ true++ cd ..++ cabal install --only-dependencies '-f-Webapp -Assistant -XMPP'+Resolving dependencies...+All the requested packages are already installed:+Use --reinstall if you want to reinstall anyway.++ '[' -e last-incremental-failed ']'++ touch last-incremental-failed++ withcyg cabal configure '-f-Webapp -Assistant -XMPP'++ PATH='/c/Program Files (x86)/Haskell Platform/2012.4.0.0/bin:/c/Program Files (x86)/Haskell Platform/2012.4.0.0/lib/extralibs/bin:/c/Program Files (x86)/NSIS:/home/Oliver/bin:.:/usr/local/bin:/mingw/bin:/bin:/c/Program Files (x86)/Haskell/bin:/c/Program Files (x86)/Haskell Platform/2013.2.0.0/lib/extralibs/bin:/c/Program Files (x86)/Haskell Platform/2013.2.0.0/bin:/c/Program Files (x86)/AMD APP/bin/x86_64:/c/Program Files (x86)/AMD APP/bin/x86:/c/Windows/system32:/c/Windows:/c/Windows/System32/Wbem:/c/Windows/System32/WindowsPowerShell/v1.0/:/c/Program Files (x86)/ATI Technologies/ATI.ACE/Core-Static:/c/Program Files (x86)/Windows Kits/8.0/Windows Performance Toolkit/:/c/Program Files/Microsoft/Web Platform Installer/:/c/Program Files (x86)/Haskell Platform/2013.2.0.0/mingw/bin:/c/Users/Oliver/AppData/Roaming/cabal/bin:/c/cygwin/bin'++ cabal configure '-f-Webapp -Assistant -XMPP'+Resolving dependencies...+[ 1 of 24] Compiling Utility.Applicative ( Utility\Applicative.hs, dist\setup\Utility\Applicative.o )+[ 2 of 24] Compiling Utility.PartialPrelude ( Utility\PartialPrelude.hs, dist\setup\Utility\PartialPrelude.o )+[ 3 of 24] Compiling Utility.FileSystemEncoding ( Utility\FileSystemEncoding.hs, dist\setup\Utility\FileSystemEncoding.o )+[ 4 of 24] Compiling Utility.Exception ( Utility\Exception.hs, dist\setup\Utility\Exception.o )+[ 5 of 24] Compiling Utility.Misc ( Utility\Misc.hs, dist\setup\Utility\Misc.o )+[ 6 of 24] Compiling Utility.Process ( Utility\Process.hs, dist\setup\Utility\Process.o )+[ 7 of 24] Compiling Utility.Env ( Utility\Env.hs, dist\setup\Utility\Env.o )+[ 8 of 24] Compiling Utility.UserInfo ( Utility\UserInfo.hs, dist\setup\Utility\UserInfo.o )+[ 9 of 24] Compiling Utility.OSX ( Utility\OSX.hs, dist\setup\Utility\OSX.o )+[10 of 24] Compiling Utility.Tmp ( Utility\Tmp.hs, dist\setup\Utility\Tmp.o )+[11 of 24] Compiling Utility.Monad ( Utility\Monad.hs, dist\setup\Utility\Monad.o )+[12 of 24] Compiling Utility.Path ( Utility\Path.hs, dist\setup\Utility\Path.o )+[13 of 24] Compiling Utility.FreeDesktop ( Utility\FreeDesktop.hs, dist\setup\Utility\FreeDesktop.o )+[16 of 24] Compiling Utility.SafeCommand ( Utility\SafeCommand.hs, dist\setup\Utility\SafeCommand.o )+[17 of 24] Compiling Utility.ExternalSHA ( Utility\ExternalSHA.hs, dist\setup\Utility\ExternalSHA.o )+[18 of 24] Compiling Utility.Directory ( Utility\Directory.hs, dist\setup\Utility\Directory.o )+Linking .\dist\setup\setup.exe ...+ checking version... 4.20130621-g36258de+ checking git... yes+ checking git version... 1.7.9+ checking cp -a... yes+ checking cp -p... yes+ checking cp --reflink=auto... no+ checking xargs -0... yes+ checking rsync... yes+ checking curl... no+ checking wget... yes+ checking bup... no+ checking gpg... not available+ checking lsof... not available+ checking ssh connection caching... no+ checking sha1... sha1sum+ checking sha256... sha256sum+ checking sha512... sha512sum+ checking sha224... sha224sum+ checking sha384... sha384sum+Configuring git-annex-4.20130601...++ withcyg cabal build++ PATH='/c/Program Files (x86)/Haskell Platform/2012.4.0.0/bin:/c/Program Files (x86)/Haskell Platform/2012.4.0.0/lib/extralibs/bin:/c/Program Files (x86)/NSIS:/home/Oliver/bin:.:/usr/local/bin:/mingw/bin:/bin:/c/Program Files (x86)/Haskell/bin:/c/Program Files (x86)/Haskell Platform/2013.2.0.0/lib/extralibs/bin:/c/Program Files (x86)/Haskell Platform/2013.2.0.0/bin:/c/Program Files (x86)/AMD APP/bin/x86_64:/c/Program Files (x86)/AMD APP/bin/x86:/c/Windows/system32:/c/Windows:/c/Windows/System32/Wbem:/c/Windows/System32/WindowsPowerShell/v1.0/:/c/Program Files (x86)/ATI Technologies/ATI.ACE/Core-Static:/c/Program Files (x86)/Windows Kits/8.0/Windows Performance Toolkit/:/c/Program Files/Microsoft/Web Platform Installer/:/c/Program Files (x86)/Haskell Platform/2013.2.0.0/mingw/bin:/c/Users/Oliver/AppData/Roaming/cabal/bin:/c/cygwin/bin'++ cabal build+Building git-annex-4.20130601...+Preprocessing executable 'git-annex' for git-annex-4.20130601...+Touch.hsc:117:2: warning: #warning "utimensat and lutimes not available; building without symlink timestamp preservation support"+Touch.hsc: In function 'main':+Touch.hsc:117:2: warning: #warning "utimensat and lutimes not available; building without symlink timestamp preservation support"+Touch.hsc:117:2: warning: #warning "utimensat and lutimes not available; building without symlink timestamp preservation support"+In file included from Mounts.hsc:23:0:+Utility/libmounts.h:17:3: warning: #warning mounts listing code not available for this OS++Utility\libdiskfree.c:36:3:+ warning: #warning free space checking code not available for this OS++In file included from Utility\libmounts.c:35:0: ++Utility\libmounts.h:17:3:+ warning: #warning mounts listing code not available for this OS+[ 1 of 217] Compiling Utility.Dot ( Utility\Dot.hs, dist\build\git-annex\git-annex-tmp\Utility\Dot.o )+[ 2 of 217] Compiling BuildFlags ( BuildFlags.hs, dist\build\git-annex\git-annex-tmp\BuildFlags.o )+[ 3 of 217] Compiling Utility.Percentage ( Utility\Percentage.hs, dist\build\git-annex\git-annex-tmp\Utility\Percentage.o )+[ 4 of 217] Compiling Utility.Base64 ( Utility\Base64.hs, dist\build\git-annex\git-annex-tmp\Utility\Base64.o )+[ 5 of 217] Compiling Utility.JSONStream ( Utility\JSONStream.hs, dist\build\git-annex\git-annex-tmp\Utility\JSONStream.o )+[ 6 of 217] Compiling Git.Types ( Git\Types.hs, dist\build\git-annex\git-annex-tmp\Git\Types.o )+[ 7 of 217] Compiling Utility.DataUnits ( Utility\DataUnits.hs, dist\build\git-annex\git-annex-tmp\Utility\DataUnits.o )+[ 8 of 217] Compiling Types.FileMatcher ( Types\FileMatcher.hs, dist\build\git-annex\git-annex-tmp\Types\FileMatcher.o )+[ 9 of 217] Compiling Types.BranchState ( Types\BranchState.hs, dist\build\git-annex\git-annex-tmp\Types\BranchState.o )+[ 10 of 217] Compiling Messages.JSON ( Messages\JSON.hs, dist\build\git-annex\git-annex-tmp\Messages\JSON.o )+[ 11 of 217] Compiling Types.UUID ( Types\UUID.hs, dist\build\git-annex\git-annex-tmp\Types\UUID.o )+[ 12 of 217] Compiling Types.Group ( Types\Group.hs, dist\build\git-annex\git-annex-tmp\Types\Group.o )+[ 13 of 217] Compiling Utility.Shell ( Utility\Shell.hs, dist\build\git-annex\git-annex-tmp\Utility\Shell.o )+[ 14 of 217] Compiling Utility.QuickCheck ( Utility\QuickCheck.hs, dist\build\git-annex\git-annex-tmp\Utility\QuickCheck.o )+[ 15 of 217] Compiling Utility.PartialPrelude ( Utility\PartialPrelude.hs, dist\build\git-annex\git-annex-tmp\Utility\PartialPrelude.o )+[ 16 of 217] Compiling Utility.HumanTime ( Utility\HumanTime.hs, dist\build\git-annex\git-annex-tmp\Utility\HumanTime.o )+[ 17 of 217] Compiling Utility.FileSystemEncoding ( Utility\FileSystemEncoding.hs, dist\build\git-annex\git-annex-tmp\Utility\FileSystemEncoding.o )+[ 18 of 217] Compiling Utility.Touch ( dist\build\git-annex\git-annex-tmp\Utility\Touch.hs, dist\build\git-annex\git-annex-tmp\Utility\Touch.o )++UtilityTouch.hsc:17:1: Warning:+ The import of `Utility.FileSystemEncoding' is redundant+ except perhaps to import instances from `Utility.FileSystemEncoding'+ To import instances alone, use: import Utility.FileSystemEncoding()++UtilityTouch.hsc:19:1: Warning:+ The import of `Foreign' is redundant+ except perhaps to import instances from `Foreign'+ To import instances alone, use: import Foreign()++UtilityTouch.hsc:21:1: Warning:+ The import of `Control.Monad' is redundant+ except perhaps to import instances from `Control.Monad'+ To import instances alone, use: import Control.Monad()+[ 19 of 217] Compiling Utility.Applicative ( Utility\Applicative.hs, dist\build\git-annex\git-annex-tmp\Utility\Applicative.o )+[ 20 of 217] Compiling Utility.Monad ( Utility\Monad.hs, dist\build\git-annex\git-annex-tmp\Utility\Monad.o )+[ 21 of 217] Compiling Utility.Exception ( Utility\Exception.hs, dist\build\git-annex\git-annex-tmp\Utility\Exception.o )+[ 22 of 217] Compiling Utility.Tmp ( Utility\Tmp.hs, dist\build\git-annex\git-annex-tmp\Utility\Tmp.o )+[ 23 of 217] Compiling Utility.Env ( Utility\Env.hs, dist\build\git-annex\git-annex-tmp\Utility\Env.o )+[ 24 of 217] Compiling Utility.UserInfo ( Utility\UserInfo.hs, dist\build\git-annex\git-annex-tmp\Utility\UserInfo.o )+[ 25 of 217] Compiling Utility.Misc ( Utility\Misc.hs, dist\build\git-annex\git-annex-tmp\Utility\Misc.o )++Utility\Misc.hs:22:1: Warning:+ The import of `Utility.Exception' is redundant+ except perhaps to import instances from `Utility.Exception'+ To import instances alone, use: import Utility.Exception()+[ 26 of 217] Compiling Utility.Process ( Utility\Process.hs, dist\build\git-annex\git-annex-tmp\Utility\Process.o )++Utility\Process.hs:44:1: Warning:+ The import of `Data.Maybe' is redundant+ except perhaps to import instances from `Data.Maybe'+ To import instances alone, use: import Data.Maybe()+[ 27 of 217] Compiling Utility.Network ( Utility\Network.hs, dist\build\git-annex\git-annex-tmp\Utility\Network.o )+[ 28 of 217] Compiling Utility.Verifiable ( Utility\Verifiable.hs, dist\build\git-annex\git-annex-tmp\Utility\Verifiable.o )+[ 29 of 217] Compiling Utility.Format ( Utility\Format.hs, dist\build\git-annex\git-annex-tmp\Utility\Format.o )+[ 30 of 217] Compiling Build.SysConfig ( Build\SysConfig.hs, dist\build\git-annex\git-annex-tmp\Build\SysConfig.o )+[ 31 of 217] Compiling Utility.Path ( Utility\Path.hs, dist\build\git-annex\git-annex-tmp\Utility\Path.o )+[ 32 of 217] Compiling Config.Cost ( Config\Cost.hs, dist\build\git-annex\git-annex-tmp\Config\Cost.o )+[ 33 of 217] Compiling Types.Messages ( Types\Messages.hs, dist\build\git-annex\git-annex-tmp\Types\Messages.o )+[ 34 of 217] Compiling Types.TrustLevel ( Types\TrustLevel.hs, dist\build\git-annex\git-annex-tmp\Types\TrustLevel.o )+[ 35 of 217] Compiling Utility.SafeCommand ( Utility\SafeCommand.hs, dist\build\git-annex\git-annex-tmp\Utility\SafeCommand.o )+[ 36 of 217] Compiling Utility.Directory ( Utility\Directory.hs, dist\build\git-annex\git-annex-tmp\Utility\Directory.o )+[ 37 of 217] Compiling Utility.ExternalSHA ( Utility\ExternalSHA.hs, dist\build\git-annex\git-annex-tmp\Utility\ExternalSHA.o )+[ 38 of 217] Compiling Common ( Common.hs, dist\build\git-annex\git-annex-tmp\Common.o )+[ 39 of 217] Compiling Git.Filename ( Git\Filename.hs, dist\build\git-annex\git-annex-tmp\Git\Filename.o )+[ 40 of 217] Compiling Logs.UUIDBased ( Logs\UUIDBased.hs, dist\build\git-annex\git-annex-tmp\Logs\UUIDBased.o )+[ 41 of 217] Compiling Types.Key ( Types\Key.hs, dist\build\git-annex\git-annex-tmp\Types\Key.o )+[ 42 of 217] Compiling Utility.FileMode ( Utility\FileMode.hs, dist\build\git-annex\git-annex-tmp\Utility\FileMode.o )+[ 43 of 217] Compiling Git ( Git.hs, dist\build\git-annex\git-annex-tmp\Git.o )++Git.hs:41:1: Warning:+ The import of `Utility.FileMode' is redundant+ except perhaps to import instances from `Utility.FileMode'+ To import instances alone, use: import Utility.FileMode()+[ 44 of 217] Compiling Utility.InodeCache ( Utility\InodeCache.hs, dist\build\git-annex\git-annex-tmp\Utility\InodeCache.o )+[ 45 of 217] Compiling Types.KeySource ( Types\KeySource.hs, dist\build\git-annex\git-annex-tmp\Types\KeySource.o )+[ 46 of 217] Compiling Types.Backend ( Types\Backend.hs, dist\build\git-annex\git-annex-tmp\Types\Backend.o )+[ 47 of 217] Compiling Utility.Gpg ( Utility\Gpg.hs, dist\build\git-annex\git-annex-tmp\Utility\Gpg.o )++Utility\Gpg.hs:12:1: Warning:+ The import of `System.Posix.Types' is redundant+ except perhaps to import instances from `System.Posix.Types'+ To import instances alone, use: import System.Posix.Types()++Utility\Gpg.hs:14:1: Warning:+ The import of `Control.Concurrent' is redundant+ except perhaps to import instances from `Control.Concurrent'+ To import instances alone, use: import Control.Concurrent()++Utility\Gpg.hs:15:1: Warning:+ The import of `Control.Exception' is redundant+ except perhaps to import instances from `Control.Exception'+ To import instances alone, use: import Control.Exception()++Utility\Gpg.hs:16:1: Warning:+ The import of `System.Path' is redundant+ except perhaps to import instances from `System.Path'+ To import instances alone, use: import System.Path()++Utility\Gpg.hs:19:1: Warning:+ The import of `Utility.Env' is redundant+ except perhaps to import instances from `Utility.Env'+ To import instances alone, use: import Utility.Env()+[ 48 of 217] Compiling Types.Crypto ( Types\Crypto.hs, dist\build\git-annex\git-annex-tmp\Types\Crypto.o )+[ 49 of 217] Compiling Utility.Matcher ( Utility\Matcher.hs, dist\build\git-annex\git-annex-tmp\Utility\Matcher.o )+[ 50 of 217] Compiling Utility.Metered ( Utility\Metered.hs, dist\build\git-annex\git-annex-tmp\Utility\Metered.o )+[ 51 of 217] Compiling Git.FilePath ( Git\FilePath.hs, dist\build\git-annex\git-annex-tmp\Git\FilePath.o )+[ 52 of 217] Compiling Git.Url ( Git\Url.hs, dist\build\git-annex\git-annex-tmp\Git\Url.o )+[ 53 of 217] Compiling Git.Construct ( Git\Construct.hs, dist\build\git-annex\git-annex-tmp\Git\Construct.o )+[ 54 of 217] Compiling Git.Config ( Git\Config.hs, dist\build\git-annex\git-annex-tmp\Git\Config.o )+[ 55 of 217] Compiling Git.CurrentRepo ( Git\CurrentRepo.hs, dist\build\git-annex\git-annex-tmp\Git\CurrentRepo.o )++Git\CurrentRepo.hs:16:1: Warning:+ The import of `Utility.Env' is redundant+ except perhaps to import instances from `Utility.Env'+ To import instances alone, use: import Utility.Env()++Git\CurrentRepo.hs:43:17: Warning: Defined but not used: `s'+[ 56 of 217] Compiling Git.SharedRepository ( Git\SharedRepository.hs, dist\build\git-annex\git-annex-tmp\Git\SharedRepository.o )+[ 57 of 217] Compiling Types.GitConfig ( Types\GitConfig.hs, dist\build\git-annex\git-annex-tmp\Types\GitConfig.o )+[ 58 of 217] Compiling Types.Remote ( Types\Remote.hs, dist\build\git-annex\git-annex-tmp\Types\Remote.o )+[ 59 of 217] Compiling Types.StandardGroups ( Types\StandardGroups.hs, dist\build\git-annex\git-annex-tmp\Types\StandardGroups.o )+[ 60 of 217] Compiling Utility.Gpg.Types ( Utility\Gpg\Types.hs, dist\build\git-annex\git-annex-tmp\Utility\Gpg\Types.o )+[ 61 of 217] Compiling Git.Sha ( Git\Sha.hs, dist\build\git-annex\git-annex-tmp\Git\Sha.o )+[ 62 of 217] Compiling Utility.CoProcess ( Utility\CoProcess.hs, dist\build\git-annex\git-annex-tmp\Utility\CoProcess.o )+[ 63 of 217] Compiling Git.Command ( Git\Command.hs, dist\build\git-annex\git-annex-tmp\Git\Command.o )+[ 64 of 217] Compiling Git.LsFiles ( Git\LsFiles.hs, dist\build\git-annex\git-annex-tmp\Git\LsFiles.o )+[ 65 of 217] Compiling Git.CatFile ( Git\CatFile.hs, dist\build\git-annex\git-annex-tmp\Git\CatFile.o )+[ 66 of 217] Compiling Git.UpdateIndex ( Git\UpdateIndex.hs, dist\build\git-annex\git-annex-tmp\Git\UpdateIndex.o )+[ 67 of 217] Compiling Git.Queue ( Git\Queue.hs, dist\build\git-annex\git-annex-tmp\Git\Queue.o )+[ 68 of 217] Compiling Git.Version ( Git\Version.hs, dist\build\git-annex\git-annex-tmp\Git\Version.o )+[ 69 of 217] Compiling Git.CheckAttr ( Git\CheckAttr.hs, dist\build\git-annex\git-annex-tmp\Git\CheckAttr.o )+[ 70 of 217] Compiling Annex ( Annex.hs, dist\build\git-annex\git-annex-tmp\Annex.o )+[ 71 of 217] Compiling Types.Option ( Types\Option.hs, dist\build\git-annex\git-annex-tmp\Types\Option.o )+[ 72 of 217] Compiling Types ( Types.hs, dist\build\git-annex\git-annex-tmp\Types.o )+[ 73 of 217] Compiling Locations ( Locations.hs, dist\build\git-annex\git-annex-tmp\Locations.o )+[ 74 of 217] Compiling Messages ( Messages.hs, dist\build\git-annex\git-annex-tmp\Messages.o )+[ 75 of 217] Compiling Common.Annex ( Common\Annex.hs, dist\build\git-annex\git-annex-tmp\Common\Annex.o )+[ 76 of 217] Compiling Crypto ( Crypto.hs, dist\build\git-annex\git-annex-tmp\Crypto.o )+[ 77 of 217] Compiling Annex.CatFile ( Annex\CatFile.hs, dist\build\git-annex\git-annex-tmp\Annex\CatFile.o )+[ 78 of 217] Compiling Backend.SHA ( Backend\SHA.hs, dist\build\git-annex\git-annex-tmp\Backend\SHA.o )+[ 79 of 217] Compiling Backend.WORM ( Backend\WORM.hs, dist\build\git-annex\git-annex-tmp\Backend\WORM.o )+[ 80 of 217] Compiling Backend.URL ( Backend\URL.hs, dist\build\git-annex\git-annex-tmp\Backend\URL.o )+[ 81 of 217] Compiling Annex.Exception ( Annex\Exception.hs, dist\build\git-annex\git-annex-tmp\Annex\Exception.o )+[ 82 of 217] Compiling Remote.Helper.Special ( Remote\Helper\Special.hs, dist\build\git-annex\git-annex-tmp\Remote\Helper\Special.o )+[ 83 of 217] Compiling Remote.Helper.Chunked ( Remote\Helper\Chunked.hs, dist\build\git-annex\git-annex-tmp\Remote\Helper\Chunked.o )+[ 84 of 217] Compiling Annex.Environment ( Annex\Environment.hs, dist\build\git-annex\git-annex-tmp\Annex\Environment.o )++Annex\Environment.hs:13:1: Warning:+ The import of `Utility.Env' is redundant+ except perhaps to import instances from `Utility.Env'+ To import instances alone, use: import Utility.Env()++Annex\Environment.hs:14:1: Warning:+ The import of `Utility.UserInfo' is redundant+ except perhaps to import instances from `Utility.UserInfo'+ To import instances alone, use: import Utility.UserInfo()+[ 85 of 217] Compiling Types.Command ( Types\Command.hs, dist\build\git-annex\git-annex-tmp\Types\Command.o )+[ 86 of 217] Compiling Usage ( Usage.hs, dist\build\git-annex\git-annex-tmp\Usage.o )+[ 87 of 217] Compiling Annex.Queue ( Annex\Queue.hs, dist\build\git-annex\git-annex-tmp\Annex\Queue.o )+[ 88 of 217] Compiling Annex.BranchState ( Annex\BranchState.hs, dist\build\git-annex\git-annex-tmp\Annex\BranchState.o )+[ 89 of 217] Compiling Remote.Helper.Encryptable ( Remote\Helper\Encryptable.hs, dist\build\git-annex\git-annex-tmp\Remote\Helper\Encryptable.o )+[ 90 of 217] Compiling Fields ( Fields.hs, dist\build\git-annex\git-annex-tmp\Fields.o )+[ 91 of 217] Compiling Annex.CheckAttr ( Annex\CheckAttr.hs, dist\build\git-annex\git-annex-tmp\Annex\CheckAttr.o )+[ 92 of 217] Compiling Git.HashObject ( Git\HashObject.hs, dist\build\git-annex\git-annex-tmp\Git\HashObject.o )+[ 93 of 217] Compiling Annex.Link ( Annex\Link.hs, dist\build\git-annex\git-annex-tmp\Annex\Link.o )+[ 94 of 217] Compiling Utility.CopyFile ( Utility\CopyFile.hs, dist\build\git-annex\git-annex-tmp\Utility\CopyFile.o )+[ 95 of 217] Compiling Git.Ref ( Git\Ref.hs, dist\build\git-annex\git-annex-tmp\Git\Ref.o )+[ 96 of 217] Compiling Git.Branch ( Git\Branch.hs, dist\build\git-annex\git-annex-tmp\Git\Branch.o )+[ 97 of 217] Compiling Git.UnionMerge ( Git\UnionMerge.hs, dist\build\git-annex\git-annex-tmp\Git\UnionMerge.o )+[ 98 of 217] Compiling Git.Merge ( Git\Merge.hs, dist\build\git-annex\git-annex-tmp\Git\Merge.o )+[ 99 of 217] Compiling Git.DiffTree ( Git\DiffTree.hs, dist\build\git-annex\git-annex-tmp\Git\DiffTree.o )+[100 of 217] Compiling Utility.DiskFree ( Utility\DiskFree.hs, dist\build\git-annex\git-annex-tmp\Utility\DiskFree.o )+[101 of 217] Compiling Utility.Url ( Utility\Url.hs, dist\build\git-annex\git-annex-tmp\Utility\Url.o )+[102 of 217] Compiling Utility.Rsync ( Utility\Rsync.hs, dist\build\git-annex\git-annex-tmp\Utility\Rsync.o )+[103 of 217] Compiling Utility.LogFile ( Utility\LogFile.hs, dist\build\git-annex\git-annex-tmp\Utility\LogFile.o )++Utility\LogFile.hs:67:1: Warning:+ Top-level binding with no type signature:+ redir :: forall t t1 t2. t -> t1 -> t2+[104 of 217] Compiling Utility.Daemon ( Utility\Daemon.hs, dist\build\git-annex\git-annex-tmp\Utility\Daemon.o )++Utility\Daemon.hs:13:1: Warning:+ The import of `Utility.LogFile' is redundant+ except perhaps to import instances from `Utility.LogFile'+ To import instances alone, use: import Utility.LogFile()++Utility\Daemon.hs:19:1: Warning:+ The import of `System.Posix.Types' is redundant+ except perhaps to import instances from `System.Posix.Types'+ To import instances alone, use: import System.Posix.Types()+[105 of 217] Compiling Git.AutoCorrect ( Git\AutoCorrect.hs, dist\build\git-annex\git-annex-tmp\Git\AutoCorrect.o )+[106 of 217] Compiling Utility.ThreadScheduler ( Utility\ThreadScheduler.hs, dist\build\git-annex\git-annex-tmp\Utility\ThreadScheduler.o )+[107 of 217] Compiling Git.LsTree ( Git\LsTree.hs, dist\build\git-annex\git-annex-tmp\Git\LsTree.o )+[108 of 217] Compiling Config ( Config.hs, dist\build\git-annex\git-annex-tmp\Config.o )+[109 of 217] Compiling Annex.UUID ( Annex\UUID.hs, dist\build\git-annex\git-annex-tmp\Annex\UUID.o )+[110 of 217] Compiling Backend ( Backend.hs, dist\build\git-annex\git-annex-tmp\Backend.o )+[111 of 217] Compiling Annex.Version ( Annex\Version.hs, dist\build\git-annex\git-annex-tmp\Annex\Version.o )+[112 of 217] Compiling Annex.Perms ( Annex\Perms.hs, dist\build\git-annex\git-annex-tmp\Annex\Perms.o )+[113 of 217] Compiling Logs.Transfer ( Logs\Transfer.hs, dist\build\git-annex\git-annex-tmp\Logs\Transfer.o )++Logs\Transfer.hs:126:20: Warning: Defined but not used: `mode'++Logs\Transfer.hs:146:29: Warning: Defined but not used: `fd'+[114 of 217] Compiling Annex.ReplaceFile ( Annex\ReplaceFile.hs, dist\build\git-annex\git-annex-tmp\Annex\ReplaceFile.o )+[115 of 217] Compiling Annex.Journal ( Annex\Journal.hs, dist\build\git-annex\git-annex-tmp\Annex\Journal.o )++Annex\Journal.hs:89:23: Warning: Defined but not used: `mode'+[116 of 217] Compiling Annex.Branch ( Annex\Branch.hs, dist\build\git-annex\git-annex-tmp\Annex\Branch.o )+[117 of 217] Compiling Logs.Remote ( Logs\Remote.hs, dist\build\git-annex\git-annex-tmp\Logs\Remote.o )+[118 of 217] Compiling Logs.Presence ( Logs\Presence.hs, dist\build\git-annex\git-annex-tmp\Logs\Presence.o )+[119 of 217] Compiling Logs.UUID ( Logs\UUID.hs, dist\build\git-annex\git-annex-tmp\Logs\UUID.o )+[120 of 217] Compiling Logs.Location ( Logs\Location.hs, dist\build\git-annex\git-annex-tmp\Logs\Location.o )+[121 of 217] Compiling Annex.Content.Direct ( Annex\Content\Direct.hs, dist\build\git-annex\git-annex-tmp\Annex\Content\Direct.o )+[122 of 217] Compiling Annex.Content ( Annex\Content.hs, dist\build\git-annex\git-annex-tmp\Annex\Content.o )++Annex\Content.hs:50:1: Warning:+ The import of `Annex.Exception' is redundant+ except perhaps to import instances from `Annex.Exception'+ To import instances alone, use: import Annex.Exception()++Annex\Content.hs:89:21: Warning: Defined but not used: `f'++Annex\Content.hs:96:21: Warning: Defined but not used: `h'++Annex\Content.hs:106:9: Warning: Defined but not used: `is_locked'++Annex\Content.hs:113:13: Warning: Defined but not used: `key'+[123 of 217] Compiling Annex.Direct ( Annex\Direct.hs, dist\build\git-annex\git-annex-tmp\Annex\Direct.o )+[124 of 217] Compiling Init ( Init.hs, dist\build\git-annex\git-annex-tmp\Init.o )++Init.hs:29:1: Warning:+ The import of `Utility.UserInfo' is redundant+ except perhaps to import instances from `Utility.UserInfo'+ To import instances alone, use: import Utility.UserInfo()++Init.hs:31:1: Warning:+ The import of `Utility.FileMode' is redundant+ except perhaps to import instances from `Utility.FileMode'+ To import instances alone, use: import Utility.FileMode()+[125 of 217] Compiling Logs.Web ( Logs\Web.hs, dist\build\git-annex\git-annex-tmp\Logs\Web.o )+[126 of 217] Compiling Logs.Group ( Logs\Group.hs, dist\build\git-annex\git-annex-tmp\Logs\Group.o )+[127 of 217] Compiling Upgrade.V2 ( Upgrade\V2.hs, dist\build\git-annex\git-annex-tmp\Upgrade\V2.o )+[128 of 217] Compiling Upgrade ( Upgrade.hs, dist\build\git-annex\git-annex-tmp\Upgrade.o )+[129 of 217] Compiling Creds ( Creds.hs, dist\build\git-annex\git-annex-tmp\Creds.o )++Creds.hs:18:1: Warning:+ The import of `Utility.Env' is redundant+ except perhaps to import instances from `Utility.Env'+ To import instances alone, use: import Utility.Env()+[130 of 217] Compiling Remote.Helper.AWS ( Remote\Helper\AWS.hs, dist\build\git-annex\git-annex-tmp\Remote\Helper\AWS.o )+[131 of 217] Compiling Annex.LockPool ( Annex\LockPool.hs, dist\build\git-annex\git-annex-tmp\Annex\LockPool.o )++Annex\LockPool.hs:17:1: Warning:+ The import of `Annex.Perms' is redundant+ except perhaps to import instances from `Annex.Perms'+ To import instances alone, use: import Annex.Perms()++Annex\LockPool.hs:39:12: Warning: Defined but not used: `fd'+[132 of 217] Compiling Remote.Helper.Hooks ( Remote\Helper\Hooks.hs, dist\build\git-annex\git-annex-tmp\Remote\Helper\Hooks.o )++Remote\Helper\Hooks.hs:18:1: Warning:+ The import of `Annex.Perms' is redundant+ except perhaps to import instances from `Annex.Perms'+ To import instances alone, use: import Annex.Perms()++Remote\Helper\Hooks.hs:74:17: Warning: Defined but not used: `lck'+[133 of 217] Compiling Remote.S3 ( Remote\S3.hs, dist\build\git-annex\git-annex-tmp\Remote\S3.o )+[134 of 217] Compiling Remote.Directory ( Remote\Directory.hs, dist\build\git-annex\git-annex-tmp\Remote\Directory.o )+[135 of 217] Compiling Remote.Web ( Remote\Web.hs, dist\build\git-annex\git-annex-tmp\Remote\Web.o )+[136 of 217] Compiling Remote.WebDAV ( Remote\WebDAV.hs, dist\build\git-annex\git-annex-tmp\Remote\WebDAV.o )+[137 of 217] Compiling Remote.Glacier ( Remote\Glacier.hs, dist\build\git-annex\git-annex-tmp\Remote\Glacier.o )+[138 of 217] Compiling Remote.Hook ( Remote\Hook.hs, dist\build\git-annex\git-annex-tmp\Remote\Hook.o )+[139 of 217] Compiling Annex.Ssh ( Annex\Ssh.hs, dist\build\git-annex\git-annex-tmp\Annex\Ssh.o )++Annex\Ssh.hs:21:1: Warning:+ The import of `Annex.Perms' is redundant+ except perhaps to import instances from `Annex.Perms'+ To import instances alone, use: import Annex.Perms()+[140 of 217] Compiling Remote.Rsync ( Remote\Rsync.hs, dist\build\git-annex\git-annex-tmp\Remote\Rsync.o )+[141 of 217] Compiling Remote.Helper.Ssh ( Remote\Helper\Ssh.hs, dist\build\git-annex\git-annex-tmp\Remote\Helper\Ssh.o )+[142 of 217] Compiling Remote.Git ( Remote\Git.hs, dist\build\git-annex\git-annex-tmp\Remote\Git.o )++Remote\Git.hs:20:1: Warning:+ The import of `Utility.CopyFile' is redundant+ except perhaps to import instances from `Utility.CopyFile'+ To import instances alone, use: import Utility.CopyFile()++Remote\Git.hs:360:21: Warning: Defined but not used: `r'++Remote\Git.hs:360:23: Warning: Defined but not used: `key'++Remote\Git.hs:360:27: Warning: Defined but not used: `file'+[143 of 217] Compiling Remote.Bup ( Remote\Bup.hs, dist\build\git-annex\git-annex-tmp\Remote\Bup.o )+[144 of 217] Compiling Remote.List ( Remote\List.hs, dist\build\git-annex\git-annex-tmp\Remote\List.o )+[145 of 217] Compiling Logs.Trust ( Logs\Trust.hs, dist\build\git-annex\git-annex-tmp\Logs\Trust.o )+[146 of 217] Compiling Remote ( Remote.hs, dist\build\git-annex\git-annex-tmp\Remote.o )+[147 of 217] Compiling Limit ( Limit.hs, dist\build\git-annex\git-annex-tmp\Limit.o )+[148 of 217] Compiling Option ( Option.hs, dist\build\git-annex\git-annex-tmp\Option.o )+[149 of 217] Compiling Annex.FileMatcher ( Annex\FileMatcher.hs, dist\build\git-annex\git-annex-tmp\Annex\FileMatcher.o )+[150 of 217] Compiling Logs.PreferredContent ( Logs\PreferredContent.hs, dist\build\git-annex\git-annex-tmp\Logs\PreferredContent.o )+[151 of 217] Compiling Annex.Wanted ( Annex\Wanted.hs, dist\build\git-annex\git-annex-tmp\Annex\Wanted.o )+[152 of 217] Compiling Seek ( Seek.hs, dist\build\git-annex\git-annex-tmp\Seek.o )+[153 of 217] Compiling Checks ( Checks.hs, dist\build\git-annex\git-annex-tmp\Checks.o )+[154 of 217] Compiling Command ( Command.hs, dist\build\git-annex\git-annex-tmp\Command.o )+[155 of 217] Compiling Logs.Unused ( Logs\Unused.hs, dist\build\git-annex\git-annex-tmp\Logs\Unused.o )+[156 of 217] Compiling CmdLine ( CmdLine.hs, dist\build\git-annex\git-annex-tmp\CmdLine.o )+[157 of 217] Compiling Command.ConfigList ( Command\ConfigList.hs, dist\build\git-annex\git-annex-tmp\Command\ConfigList.o )+[158 of 217] Compiling Command.InAnnex ( Command\InAnnex.hs, dist\build\git-annex\git-annex-tmp\Command\InAnnex.o )+[159 of 217] Compiling Command.DropKey ( Command\DropKey.hs, dist\build\git-annex\git-annex-tmp\Command\DropKey.o )+[160 of 217] Compiling Command.SendKey ( Command\SendKey.hs, dist\build\git-annex\git-annex-tmp\Command\SendKey.o )+[161 of 217] Compiling Command.RecvKey ( Command\RecvKey.hs, dist\build\git-annex\git-annex-tmp\Command\RecvKey.o )+[162 of 217] Compiling Command.TransferInfo ( Command\TransferInfo.hs, dist\build\git-annex\git-annex-tmp\Command\TransferInfo.o )+[163 of 217] Compiling Command.Commit ( Command\Commit.hs, dist\build\git-annex\git-annex-tmp\Command\Commit.o )+[164 of 217] Compiling GitAnnex.Options ( GitAnnex\Options.hs, dist\build\git-annex\git-annex-tmp\GitAnnex\Options.o )+[165 of 217] Compiling Command.Unannex ( Command\Unannex.hs, dist\build\git-annex\git-annex-tmp\Command\Unannex.o )+[166 of 217] Compiling Command.FromKey ( Command\FromKey.hs, dist\build\git-annex\git-annex-tmp\Command\FromKey.o )+[167 of 217] Compiling Command.Fix ( Command\Fix.hs, dist\build\git-annex\git-annex-tmp\Command\Fix.o )+[168 of 217] Compiling Command.Init ( Command\Init.hs, dist\build\git-annex\git-annex-tmp\Command\Init.o )+[169 of 217] Compiling Command.Describe ( Command\Describe.hs, dist\build\git-annex\git-annex-tmp\Command\Describe.o )+[170 of 217] Compiling Command.InitRemote ( Command\InitRemote.hs, dist\build\git-annex\git-annex-tmp\Command\InitRemote.o )+[171 of 217] Compiling Command.EnableRemote ( Command\EnableRemote.hs, dist\build\git-annex\git-annex-tmp\Command\EnableRemote.o )+[172 of 217] Compiling Command.Unused ( Command\Unused.hs, dist\build\git-annex\git-annex-tmp\Command\Unused.o )+[173 of 217] Compiling Command.Unlock ( Command\Unlock.hs, dist\build\git-annex\git-annex-tmp\Command\Unlock.o )+[174 of 217] Compiling Command.Lock ( Command\Lock.hs, dist\build\git-annex\git-annex-tmp\Command\Lock.o )+[175 of 217] Compiling Command.Find ( Command\Find.hs, dist\build\git-annex\git-annex-tmp\Command\Find.o )+[176 of 217] Compiling Command.Whereis ( Command\Whereis.hs, dist\build\git-annex\git-annex-tmp\Command\Whereis.o )+[177 of 217] Compiling Command.Log ( Command\Log.hs, dist\build\git-annex\git-annex-tmp\Command\Log.o )+[178 of 217] Compiling Command.Merge ( Command\Merge.hs, dist\build\git-annex\git-annex-tmp\Command\Merge.o )+[179 of 217] Compiling Command.Uninit ( Command\Uninit.hs, dist\build\git-annex\git-annex-tmp\Command\Uninit.o )+[180 of 217] Compiling Command.Trust ( Command\Trust.hs, dist\build\git-annex\git-annex-tmp\Command\Trust.o )+[181 of 217] Compiling Command.Untrust ( Command\Untrust.hs, dist\build\git-annex\git-annex-tmp\Command\Untrust.o )+[182 of 217] Compiling Command.Semitrust ( Command\Semitrust.hs, dist\build\git-annex\git-annex-tmp\Command\Semitrust.o )+[183 of 217] Compiling Command.Dead ( Command\Dead.hs, dist\build\git-annex\git-annex-tmp\Command\Dead.o )+[184 of 217] Compiling Command.Group ( Command\Group.hs, dist\build\git-annex\git-annex-tmp\Command\Group.o )+[185 of 217] Compiling Command.Content ( Command\Content.hs, dist\build\git-annex\git-annex-tmp\Command\Content.o )+[186 of 217] Compiling Command.Ungroup ( Command\Ungroup.hs, dist\build\git-annex\git-annex-tmp\Command\Ungroup.o )+[187 of 217] Compiling Command.Vicfg ( Command\Vicfg.hs, dist\build\git-annex\git-annex-tmp\Command\Vicfg.o )+[188 of 217] Compiling Command.RmUrl ( Command\RmUrl.hs, dist\build\git-annex\git-annex-tmp\Command\RmUrl.o )+[189 of 217] Compiling Command.Map ( Command\Map.hs, dist\build\git-annex\git-annex-tmp\Command\Map.o )+[190 of 217] Compiling Command.Upgrade ( Command\Upgrade.hs, dist\build\git-annex\git-annex-tmp\Command\Upgrade.o )+[191 of 217] Compiling Command.Version ( Command\Version.hs, dist\build\git-annex\git-annex-tmp\Command\Version.o )+[192 of 217] Compiling Command.Test ( Command\Test.hs, dist\build\git-annex\git-annex-tmp\Command\Test.o )+[193 of 217] Compiling Command.Add ( Command\Add.hs, dist\build\git-annex\git-annex-tmp\Command\Add.o )+[194 of 217] Compiling Command.ReKey ( Command\ReKey.hs, dist\build\git-annex\git-annex-tmp\Command\ReKey.o )+[195 of 217] Compiling Command.AddUnused ( Command\AddUnused.hs, dist\build\git-annex\git-annex-tmp\Command\AddUnused.o )+[196 of 217] Compiling Command.PreCommit ( Command\PreCommit.hs, dist\build\git-annex\git-annex-tmp\Command\PreCommit.o )+[197 of 217] Compiling Command.Import ( Command\Import.hs, dist\build\git-annex\git-annex-tmp\Command\Import.o )+[198 of 217] Compiling Command.Drop ( Command\Drop.hs, dist\build\git-annex\git-annex-tmp\Command\Drop.o )+[199 of 217] Compiling Command.Move ( Command\Move.hs, dist\build\git-annex\git-annex-tmp\Command\Move.o )+[200 of 217] Compiling Command.Copy ( Command\Copy.hs, dist\build\git-annex\git-annex-tmp\Command\Copy.o )+[201 of 217] Compiling Command.Get ( Command\Get.hs, dist\build\git-annex\git-annex-tmp\Command\Get.o )+[202 of 217] Compiling Command.TransferKey ( Command\TransferKey.hs, dist\build\git-annex\git-annex-tmp\Command\TransferKey.o )+[203 of 217] Compiling Command.DropUnused ( Command\DropUnused.hs, dist\build\git-annex\git-annex-tmp\Command\DropUnused.o )+[204 of 217] Compiling Command.Fsck ( Command\Fsck.hs, dist\build\git-annex\git-annex-tmp\Command\Fsck.o )+[205 of 217] Compiling Command.Reinject ( Command\Reinject.hs, dist\build\git-annex\git-annex-tmp\Command\Reinject.o )+[206 of 217] Compiling Command.Migrate ( Command\Migrate.hs, dist\build\git-annex\git-annex-tmp\Command\Migrate.o )+[207 of 217] Compiling Command.Status ( Command\Status.hs, dist\build\git-annex\git-annex-tmp\Command\Status.o )+[208 of 217] Compiling Command.Sync ( Command\Sync.hs, dist\build\git-annex\git-annex-tmp\Command\Sync.o )+[209 of 217] Compiling Command.Help ( Command\Help.hs, dist\build\git-annex\git-annex-tmp\Command\Help.o )+[210 of 217] Compiling Command.AddUrl ( Command\AddUrl.hs, dist\build\git-annex\git-annex-tmp\Command\AddUrl.o )+[211 of 217] Compiling Command.Direct ( Command\Direct.hs, dist\build\git-annex\git-annex-tmp\Command\Direct.o )+[212 of 217] Compiling Command.Indirect ( Command\Indirect.hs, dist\build\git-annex\git-annex-tmp\Command\Indirect.o )+[213 of 217] Compiling Command.FuzzTest ( Command\FuzzTest.hs, dist\build\git-annex\git-annex-tmp\Command\FuzzTest.o )+[214 of 217] Compiling Test ( Test.hs, dist\build\git-annex\git-annex-tmp\Test.o )+[215 of 217] Compiling GitAnnexShell ( GitAnnexShell.hs, dist\build\git-annex\git-annex-tmp\GitAnnexShell.o )+[216 of 217] Compiling GitAnnex ( GitAnnex.hs, dist\build\git-annex\git-annex-tmp\GitAnnex.o )+[217 of 217] Compiling Main ( git-annex.hs, dist\build\git-annex\git-annex-tmp\Main.o )+Linking dist\build\git-annex\git-annex.exe ...++ cabal install nsis+Resolving dependencies...+All the requested packages are already installed:+nsis-0.2.2+Use --reinstall if you want to reinstall anyway.++ ghc --make Build/NullSoftInstaller.hs+[15 of 18] Compiling Build.SysConfig ( Build\SysConfig.hs, Build\SysConfig.o )+Linking Build\NullSoftInstaller.exe ...++ withcyg Build/NullSoftInstaller.exe++ PATH='/c/Program Files (x86)/Haskell Platform/2012.4.0.0/bin:/c/Program Files (x86)/Haskell Platform/2012.4.0.0/lib/extralibs/bin:/c/Program Files (x86)/NSIS:/home/Oliver/bin:.:/usr/local/bin:/mingw/bin:/bin:/c/Program Files (x86)/Haskell/bin:/c/Program Files (x86)/Haskell Platform/2013.2.0.0/lib/extralibs/bin:/c/Program Files (x86)/Haskell Platform/2013.2.0.0/bin:/c/Program Files (x86)/AMD APP/bin/x86_64:/c/Program Files (x86)/AMD APP/bin/x86:/c/Windows/system32:/c/Windows:/c/Windows/System32/Wbem:/c/Windows/System32/WindowsPowerShell/v1.0/:/c/Program Files (x86)/ATI Technologies/ATI.ACE/Core-Static:/c/Program Files (x86)/Windows Kits/8.0/Windows Performance Toolkit/:/c/Program Files/Microsoft/Web Platform Installer/:/c/Program Files (x86)/Haskell Platform/2013.2.0.0/mingw/bin:/c/Users/Oliver/AppData/Roaming/cabal/bin:/c/cygwin/bin'++ Build/NullSoftInstaller.exe+MakeNSIS v2.46 - Copyright 1995-2009 Contributors+See the file COPYING for license details.+Credits can be found in the Users Manual.++Processing config: +Processing plugin dlls: "c:\Program Files (x86)\NSIS\Plugins\*.dll"+ - AdvSplash::show+ - Banner::destroy+ - Banner::getWindow+ - Banner::show+ - BgImage::AddImage+ - BgImage::AddText+ - BgImage::Clear+ - BgImage::Destroy+ - BgImage::Redraw+ - BgImage::SetBg+ - BgImage::SetReturn+ - BgImage::Sound+ - Dialer::AttemptConnect+ - Dialer::AutodialHangup+ - Dialer::AutodialOnline+ - Dialer::AutodialUnattended+ - Dialer::GetConnectedState+ - InstallOptions::dialog+ - InstallOptions::initDialog+ - InstallOptions::show+ - LangDLL::LangDialog+ - Math::Script+ - NSISdl::download+ - NSISdl::download_quiet+ - Splash::show+ - StartMenu::Init+ - StartMenu::Select+ - StartMenu::Show+ - System::Alloc+ - System::Call+ - System::Copy+ - System::Free+ - System::Get+ - System::Int64Op+ - System::Store+ - TypeLib::GetLibVersion+ - TypeLib::Register+ - TypeLib::UnRegister+ - UserInfo::GetAccountType+ - UserInfo::GetName+ - UserInfo::GetOriginalAccountType+ - VPatch::GetFileCRC32+ - VPatch::GetFileMD5+ - VPatch::vpatchfile+ - nsDialogs::Create+ - nsDialogs::CreateControl+ - nsDialogs::CreateItem+ - nsDialogs::CreateTimer+ - nsDialogs::GetUserData+ - nsDialogs::KillTimer+ - nsDialogs::OnBack+ - nsDialogs::OnChange+ - nsDialogs::OnClick+ - nsDialogs::OnNotify+ - nsDialogs::SelectFileDialog+ - nsDialogs::SelectFolderDialog+ - nsDialogs::SetRTL+ - nsDialogs::SetUserData+ - nsDialogs::Show+ - nsExec::Exec+ - nsExec::ExecToLog+ - nsExec::ExecToStack++!define: "MUI_INSERT_NSISCONF"=""++Changing directory to: "C:\MinGW\msys\1.0\home\Oliver\src\git-annex"++Processing script file: "git-annex.nsi"+!include: "c:\Program Files (x86)\NSIS\Include\MUI2.nsh"+!include: "c:\Program Files (x86)\NSIS\Contrib\Modern UI 2\MUI2.nsh"+NSIS Modern User Interface version 2.0 - Copyright 2002-2009 Joost Verburg (c:\Program Files (x86)\NSIS\Contrib\Modern UI 2\MUI2.nsh:8)+!define: "MUI_INCLUDED"=""+!define: "MUI_SYSVERSION"="2.0"+!define: "MUI_VERBOSE"="3"+!include: closed: "c:\Program Files (x86)\NSIS\Contrib\Modern UI 2\MUI2.nsh"+!include: closed: "c:\Program Files (x86)\NSIS\Include\MUI2.nsh"+Name: "git-annex"+OutFile: "git-annex-installer.exe"+InstallDir: "$PROGRAMFILES\Git\cmd"+!insertmacro: MUI_PAGE_DIRECTORY+!insertmacro: end of MUI_PAGE_DIRECTORY+!insertmacro: MUI_PAGE_LICENSE+!insertmacro: end of MUI_PAGEDECLARATION_LICENSE+!insertmacro: end of MUI_PAGE_LICENSE+!insertmacro: MUI_PAGE_INSTFILES+!insertmacro: end of MUI_PAGE_INSTFILES+!insertmacro: MUI_LANGUAGE+!insertmacro: end of MUI_LANGUAGE+Section: "main" ->(_sec10)+SetOutPath: "$INSTDIR"+File: "git-annex.exe" [compress] 7664822/31704766 bytes+File: "git-annex-licenses.txt" [compress] 60509/237415 bytes+File: "cp.exe" [compress] 62591/116736 bytes+File: "xargs.exe" [compress] 17002/33280 bytes+File: "rsync.exe" [compress] 188346/359424 bytes+File: "ssh.exe" [compress] 157190/320000 bytes+File: "wget.exe" [compress] 155666/349184 bytes+File: "sha1sum.exe" [compress] 20337/39424 bytes+File: "sha256sum.exe" [compress] 18279/37390 bytes+File: "sha512sum.exe" [compress] 30393/92174 bytes+File: "sha224sum.exe" [compress] 18279/37390 bytes+File: "sha384sum.exe" [compress] 30392/92174 bytes+File: "cygwin1.dll" [compress] 1036075/2874639 bytes+File: "cygasn1-8.dll" [compress] 154881/459293 bytes+File: "cygattr-1.dll" [compress] 5460/13838 bytes+File: "cygheimbase-1.dll" [compress] 4441/10781 bytes+File: "cygroken-18.dll" [compress] 26103/52253 bytes+File: "cygcom_err-2.dll" [compress] 3984/9757 bytes+File: "cygheimntlm-0.dll" [compress] 9018/20509 bytes+File: "cygsqlite3-0.dll" [compress] 334366/601629 bytes+File: "cygcrypt-0.dll" [compress] 3352/7182 bytes+File: "cyghx509-5.dll" [compress] 95839/216093 bytes+File: "cygssp-0.dll" [compress] 3377/8206 bytes+File: "cygcrypto-1.0.0.dll" [compress] 652766/1553920 bytes+File: "cygiconv-2.dll" [compress] 738899/1008654 bytes+File: "cyggcc_s-1.dll" [compress] 40241/80910 bytes+File: "cygintl-8.dll" [compress] 17737/35342 bytes+File: "cygwind-0.dll" [compress] 73172/160797 bytes+File: "cyggssapi-3.dll" [compress] 81662/183837 bytes+File: "cygkrb5-26.dll" [compress] 170204/381469 bytes+File: "cygz.dll" [compress] 42634/74269 bytes+WriteUninstaller: "git-annex-uninstall.exe"+SectionEnd+Section: "Uninstall" ->(_sec11)+Delete: /REBOOTOK "$INSTDIR\git-annex.exe"+Delete: /REBOOTOK "$INSTDIR\git-annex-licenses.txt"+Delete: /REBOOTOK "$INSTDIR\git-annex-uninstall.exe"+Delete: /REBOOTOK "$INSTDIR\cp.exe"+Delete: /REBOOTOK "$INSTDIR\xargs.exe"+Delete: /REBOOTOK "$INSTDIR\rsync.exe"+Delete: /REBOOTOK "$INSTDIR\ssh.exe"+Delete: /REBOOTOK "$INSTDIR\wget.exe"+Delete: /REBOOTOK "$INSTDIR\sha1sum.exe"+Delete: /REBOOTOK "$INSTDIR\sha256sum.exe"+Delete: /REBOOTOK "$INSTDIR\sha512sum.exe"+Delete: /REBOOTOK "$INSTDIR\sha224sum.exe"+Delete: /REBOOTOK "$INSTDIR\sha384sum.exe"+Delete: /REBOOTOK "$INSTDIR\cygwin1.dll"+Delete: /REBOOTOK "$INSTDIR\cygasn1-8.dll"+Delete: /REBOOTOK "$INSTDIR\cygattr-1.dll"+Delete: /REBOOTOK "$INSTDIR\cygheimbase-1.dll"+Delete: /REBOOTOK "$INSTDIR\cygroken-18.dll"+Delete: /REBOOTOK "$INSTDIR\cygcom_err-2.dll"+Delete: /REBOOTOK "$INSTDIR\cygheimntlm-0.dll"+Delete: /REBOOTOK "$INSTDIR\cygsqlite3-0.dll"+Delete: /REBOOTOK "$INSTDIR\cygcrypt-0.dll"+Delete: /REBOOTOK "$INSTDIR\cyghx509-5.dll"+Delete: /REBOOTOK "$INSTDIR\cygssp-0.dll"+Delete: /REBOOTOK "$INSTDIR\cygcrypto-1.0.0.dll"+Delete: /REBOOTOK "$INSTDIR\cygiconv-2.dll"+Delete: /REBOOTOK "$INSTDIR\cyggcc_s-1.dll"+Delete: /REBOOTOK "$INSTDIR\cygintl-8.dll"+Delete: /REBOOTOK "$INSTDIR\cygwind-0.dll"+Delete: /REBOOTOK "$INSTDIR\cyggssapi-3.dll"+Delete: /REBOOTOK "$INSTDIR\cygkrb5-26.dll"+Delete: /REBOOTOK "$INSTDIR\cygz.dll"+SectionEnd+Function: ".onInit"+IfFileExists: "$PROGRAMFILES\Git\cmd" ? _lbl3 : 0+MessageBox: 48: "You need git installed to use git-annex. Looking at $PROGRAMFILES\Git\cmd , it seems to not be installed, or may be installed in another location. You can install git from http://git-scm.com/" (on IDOK goto 0)+FunctionEnd++Processed 1 file, writing output:+Processing pages... Done!+Removing unused resources... Done!+Generating language tables... Done!+Generating uninstaller... Done!++Output: "C:\MinGW\msys\1.0\home\Oliver\src\git-annex\git-annex-installer.exe"+Install: 4 pages (256 bytes), 1 section (1048 bytes), 98 instructions (2744 bytes), 133 strings (239643 bytes), 1 language table (278 bytes).+Uninstall: 2 pages (128 bytes), +1 section (1048 bytes), 33 instructions (924 bytes), 72 strings (1154 bytes), 1 language table (194 bytes).++Using zlib compression.++EXE header size: 48640 / 35840 bytes+Install code: 63270 / 244345 bytes+Install data: 11918141 / 41172867 bytes+Uninstall code+data: 10537 / 14897 bytes+CRC (0x090A4FD3): 4 / 4 bytes++Total size: 12040592 / 41467953 bytes (29.0%)++ rm -f last-incremental-failed++ rm -rf .t++ withcyg dist/build/git-annex/git-annex.exe test++ PATH='/c/Program Files (x86)/Haskell Platform/2012.4.0.0/bin:/c/Program Files (x86)/Haskell Platform/2012.4.0.0/lib/extralibs/bin:/c/Program Files (x86)/NSIS:/home/Oliver/bin:.:/usr/local/bin:/mingw/bin:/bin:/c/Program Files (x86)/Haskell/bin:/c/Program Files (x86)/Haskell Platform/2013.2.0.0/lib/extralibs/bin:/c/Program Files (x86)/Haskell Platform/2013.2.0.0/bin:/c/Program Files (x86)/AMD APP/bin/x86_64:/c/Program Files (x86)/AMD APP/bin/x86:/c/Windows/system32:/c/Windows:/c/Windows/System32/Wbem:/c/Windows/System32/WindowsPowerShell/v1.0/:/c/Program Files (x86)/ATI Technologies/ATI.ACE/Core-Static:/c/Program Files (x86)/Windows Kits/8.0/Windows Performance Toolkit/:/c/Program Files/Microsoft/Web Platform Installer/:/c/Program Files (x86)/Haskell Platform/2013.2.0.0/mingw/bin:/c/Users/Oliver/AppData/Roaming/cabal/bin:/c/cygwin/bin'++ dist/build/git-annex/git-annex.exe test+(0 tests) (1 test) (2 tests) (3 tests) (4 tests) (5 tests) (6 tests) (7 tests) (8 tests) (9 tests) (10 tests) (11 tests) (12 tests) (13 tests) (14 tests) (15 tests) (16 tests) (17 tests) (18 tests) (19 tests) (20 tests) (21 tests) (22 tests) (23 tests) (24 tests) (25 tests) (26 tests) (27 tests) (28 tests) (29 tests) (30 tests) (31 tests) (32 tests) (33 tests) (34 tests) (35 tests) (36 tests) (37 tests) (38 tests) (39 tests) (40 tests) (41 tests) (42 tests) (43 tests) (44 tests) (45 tests) (46 tests) (47 tests) (48 tests) (49 tests) (50 tests) (51 tests) (52 tests) (53 tests) (54 tests) (55 tests) (56 tests) (57 tests) (58 tests) (59 tests) (60 tests) (61 tests) (62 tests) (63 tests) (64 tests) (65 tests) (66 tests) (67 tests) (68 tests) (69 tests) (70 tests) (71 tests) (72 tests) (73 tests) (74 tests) (75 tests) (76 tests) (77 tests) (78 tests) (79 tests) (80 tests) (81 tests) (82 tests) (83 tests) (84 tests) (85 tests) (86 tests) (87 tests) (88 tests) (89 tests) (90 tests) (91 tests) (92 tests) (93 tests) (94 tests) (95 tests) (96 tests) (97 tests) (98 tests) (99 tests) ----------------------------------------------------------------------+First, some automated quick checks of properties ...+----------------------------------------------------------------------+prop_idempotent_deencode_git++++ OK, passed 100 tests.+(0 tests) (1 test) (2 tests) (3 tests) (4 tests) (5 tests) (6 tests) (7 tests) (8 tests) (9 tests) (10 tests) (11 tests) (12 tests) (13 tests) (14 tests) (15 tests) (16 tests) (17 tests) (18 tests) (19 tests) (20 tests) (21 tests) (22 tests) (23 tests) (24 tests) (25 tests) (26 tests) (27 tests) (28 tests) (29 tests) (30 tests) (31 tests) (32 tests) (33 tests) (34 tests) (35 tests) (36 tests) (37 tests) (38 tests) (39 tests) (40 tests) (41 tests) (42 tests) (43 tests) (44 tests) (45 tests) (46 tests) (47 tests) (48 tests) (49 tests) (50 tests) (51 tests) (52 tests) (53 tests) (54 tests) (55 tests) (56 tests) (57 tests) (58 tests) (59 tests) (60 tests) (61 tests) (62 tests) (63 tests) (64 tests) (65 tests) (66 tests) (67 tests) (68 tests) (69 tests) (70 tests) (71 tests) (72 tests) (73 tests) (74 tests) (75 tests) (76 tests) (77 tests) (78 tests) (79 tests) (80 tests) (81 tests) (82 tests) (83 tests) (84 tests) (85 tests) (86 tests) (87 tests) (88 tests) (89 tests) (90 tests) (91 tests) (92 tests) (93 tests) (94 tests) (95 tests) (96 tests) (97 tests) (98 tests) (99 tests) prop_idempotent_deencode++++ OK, passed 100 tests.+(0 tests) (1 test) (2 tests) (3 tests) (4 tests) (5 tests) (6 tests) (7 tests) (8 tests) (9 tests) (10 tests) (11 tests) (12 tests) (13 tests) (14 tests) (15 tests) (16 tests) (17 tests) (18 tests) (19 tests) (20 tests) (21 tests) (22 tests) (23 tests) (24 tests) (25 tests) (26 tests) (27 tests) (28 tests) (29 tests) (30 tests) (31 tests) (32 tests) (33 tests) (34 tests) (35 tests) (36 tests) (37 tests) (38 tests) (39 tests) (40 tests) (41 tests) (42 tests) (43 tests) (44 tests) (45 tests) (46 tests) (47 tests) (48 tests) (49 tests) (50 tests) (51 tests) (52 tests) (53 tests) (54 tests) (55 tests) (56 tests) (57 tests) (58 tests) (59 tests) (60 tests) (61 tests) (62 tests) (63 tests) (64 tests) (65 tests) (66 tests) (67 tests) (68 tests) (69 tests) (70 tests) (71 tests) (72 tests) (73 tests) (74 tests) (75 tests) (76 tests) (77 tests) (78 tests) (79 tests) (80 tests) (81 tests) (82 tests) (83 tests) (84 tests) (85 tests) (86 tests) (87 tests) (88 tests) (89 tests) (90 tests) (91 tests) (92 tests) (93 tests) (94 tests) (95 tests) (96 tests) (97 tests) (98 tests) (99 tests) prop_idempotent_fileKey++++ OK, passed 100 tests.+(0 tests) (1 test) (2 tests) (3 tests) (4 tests) (5 tests) (6 tests) (7 tests) (8 tests) (9 tests) (10 tests) (11 tests) (12 tests) (13 tests) (14 tests) (15 tests) (16 tests) (17 tests) (18 tests) (19 tests) (20 tests) (21 tests) (22 tests) (23 tests) (24 tests) (25 tests) (26 tests) (27 tests) (28 tests) (29 tests) (30 tests) (31 tests) (32 tests) (33 tests) (34 tests) (35 tests) (36 tests) (37 tests) (38 tests) (39 tests) (40 tests) (41 tests) (42 tests) (43 tests) (44 tests) (45 tests) (46 tests) (47 tests) (48 tests) (49 tests) (50 tests) (51 tests) (52 tests) (53 tests) (54 tests) (55 tests) (56 tests) (57 tests) (58 tests) (59 tests) (60 tests) (61 tests) (62 tests) (63 tests) (64 tests) (65 tests) (66 tests) (67 tests) (68 tests) (69 tests) (70 tests) (71 tests) (72 tests) (73 tests) (74 tests) (75 tests) (76 tests) (77 tests) (78 tests) (79 tests) (80 tests) (81 tests) (82 tests) (83 tests) (84 tests) (85 tests) (86 tests) (87 tests) (88 tests) (89 tests) (90 tests) (91 tests) (92 tests) (93 tests) (94 tests) (95 tests) (96 tests) (97 tests) (98 tests) (99 tests) prop_idempotent_key_encode++++ OK, passed 100 tests.+(0 tests) (1 test) (2 tests) (3 tests) (4 tests) (5 tests) (6 tests) (7 tests) (8 tests) (9 tests) (10 tests) (11 tests) (12 tests) (13 tests) (14 tests) (15 tests) (16 tests) (17 tests) (18 tests) (19 tests) (20 tests) (21 tests) (22 tests) (23 tests) (24 tests) (25 tests) (26 tests) (27 tests) (28 tests) (29 tests) (30 tests) (31 tests) (32 tests) (33 tests) (34 tests) (35 tests) (36 tests) (37 tests) (38 tests) (39 tests) (40 tests) (41 tests) (42 tests) (43 tests) (44 tests) (45 tests) (46 tests) (47 tests) (48 tests) (49 tests) (50 tests) (51 tests) (52 tests) (53 tests) (54 tests) (55 tests) (56 tests) (57 tests) (58 tests) (59 tests) (60 tests) (61 tests) (62 tests) (63 tests) (64 tests) (65 tests) (66 tests) (67 tests) (68 tests) (69 tests) (70 tests) (71 tests) (72 tests) (73 tests) (74 tests) (75 tests) (76 tests) (77 tests) (78 tests) (79 tests) (80 tests) (81 tests) (82 tests) (83 tests) (84 tests) (85 tests) (86 tests) (87 tests) (88 tests) (89 tests) (90 tests) (91 tests) (92 tests) (93 tests) (94 tests) (95 tests) (96 tests) (97 tests) (98 tests) (99 tests) prop_idempotent_shellEscape++++ OK, passed 100 tests.+(0 tests) (1 test) (2 tests) (3 tests) (4 tests) (5 tests) (6 tests) (7 tests) (8 tests) (9 tests) (10 tests) (11 tests) (12 tests) (13 tests) (14 tests) (15 tests) (16 tests) (17 tests) (18 tests) (19 tests) (20 tests) (21 tests) (22 tests) (23 tests) (24 tests) (25 tests) (26 tests) (27 tests) (28 tests) (29 tests) (30 tests) (31 tests) (32 tests) (33 tests) (34 tests) (35 tests) (36 tests) (37 tests) (38 tests) (39 tests) (40 tests) (41 tests) (42 tests) (43 tests) (44 tests) (45 tests) (46 tests) (47 tests) (48 tests) (49 tests) (50 tests) (51 tests) (52 tests) (53 tests) (54 tests) (55 tests) (56 tests) (57 tests) (58 tests) (59 tests) (60 tests) (61 tests) (62 tests) (63 tests) (64 tests) (65 tests) (66 tests) (67 tests) (68 tests) (69 tests) (70 tests) (71 tests) (72 tests) (73 tests) (74 tests) (75 tests) (76 tests) (77 tests) (78 tests) (79 tests) (80 tests) (81 tests) (82 tests) (83 tests) (84 tests) (85 tests) (86 tests) (87 tests) (88 tests) (89 tests) (90 tests) (91 tests) (92 tests) (93 tests) (94 tests) (95 tests) (96 tests) (97 tests) (98 tests) (99 tests) prop_idempotent_shellEscape_multiword++++ OK, passed 100 tests.+(0 tests) (1 test) (2 tests) (3 tests) (4 tests) (5 tests) (6 tests) (7 tests) (8 tests) (9 tests) (10 tests) (11 tests) (12 tests) (13 tests) (14 tests) (15 tests) (16 tests) (17 tests) (18 tests) (19 tests) (20 tests) (21 tests) (22 tests) (23 tests) (24 tests) (25 tests) (26 tests) (27 tests) (28 tests) (29 tests) (30 tests) (31 tests) (32 tests) (33 tests) (34 tests) (35 tests) (36 tests) (37 tests) (38 tests) (39 tests) (40 tests) (41 tests) (42 tests) (43 tests) (44 tests) (45 tests) (46 tests) (47 tests) (48 tests) (49 tests) (50 tests) (51 tests) (52 tests) (53 tests) (54 tests) (55 tests) (56 tests) (57 tests) (58 tests) (59 tests) (60 tests) (61 tests) (62 tests) (63 tests) (64 tests) (65 tests) (66 tests) (67 tests) (68 tests) (69 tests) (70 tests) (71 tests) (72 tests) (73 tests) (74 tests) (75 tests) (76 tests) (77 tests) (78 tests) (79 tests) (80 tests) (81 tests) (82 tests) (83 tests) (84 tests) (85 tests) (86 tests) (87 tests) (88 tests) (89 tests) (90 tests) (91 tests) (92 tests) (93 tests) (94 tests) (95 tests) (96 tests) (97 tests) (98 tests) (99 tests) prop_idempotent_configEscape++++ OK, passed 100 tests.+(0 tests) (1 test) (2 tests) (3 tests) (4 tests) (5 tests) (6 tests) (7 tests) (8 tests) (9 tests) (10 tests) (11 tests) (12 tests) (13 tests) (14 tests) (15 tests) (16 tests) (17 tests) (18 tests) (19 tests) (20 tests) (21 tests) (22 tests) (23 tests) (24 tests) (25 tests) (26 tests) (27 tests) (28 tests) (29 tests) (30 tests) (31 tests) (32 tests) (33 tests) (34 tests) (35 tests) (36 tests) (37 tests) (38 tests) (39 tests) (40 tests) (41 tests) (42 tests) (43 tests) (44 tests) (45 tests) (46 tests) (47 tests) (48 tests) (49 tests) (50 tests) (51 tests) (52 tests) (53 tests) (54 tests) (55 tests) (56 tests) (57 tests) (58 tests) (59 tests) (60 tests) (61 tests) (62 tests) (63 tests) (64 tests) (65 tests) (66 tests) (67 tests) (68 tests) (69 tests) (70 tests) (71 tests) (72 tests) (73 tests) (74 tests) (75 tests) (76 tests) (77 tests) (78 tests) (79 tests) (80 tests) (81 tests) (82 tests) (83 tests) (84 tests) (85 tests) (86 tests) (87 tests) (88 tests) (89 tests) (90 tests) (91 tests) (92 tests) (93 tests) (94 tests) (95 tests) (96 tests) (97 tests) (98 tests) (99 tests) prop_parse_show_Config++++ OK, passed 100 tests.+(0 tests) (1 test) (2 tests) (3 tests) (4 tests) (5 tests) (6 tests) (7 tests) (8 tests) (9 tests) (10 tests) (11 tests) (12 tests) (13 tests) (14 tests) (15 tests) (16 tests) (17 tests) (18 tests) (19 tests) (20 tests) (21 tests) (22 tests) (23 tests) (24 tests) (25 tests) (26 tests) (27 tests) (28 tests) (29 tests) (30 tests) (31 tests) (32 tests) (33 tests) (34 tests) (35 tests) (36 tests) (37 tests) (38 tests) (39 tests) (40 tests) (41 tests) (42 tests) (43 tests) (44 tests) (45 tests) (46 tests) (47 tests) (48 tests) (49 tests) (50 tests) (51 tests) (52 tests) (53 tests) (54 tests) (55 tests) (56 tests) (57 tests) (58 tests) (59 tests) (60 tests) (61 tests) (62 tests) (63 tests) (64 tests) (65 tests) (66 tests) (67 tests) (68 tests) (69 tests) (70 tests) (71 tests) (72 tests) (73 tests) (74 tests) (75 tests) (76 tests) (77 tests) (78 tests) (79 tests) (80 tests) (81 tests) (82 tests) (83 tests) (84 tests) (85 tests) (86 tests) (87 tests) (88 tests) (89 tests) (90 tests) (91 tests) (92 tests) (93 tests) (94 tests) (95 tests) (96 tests) (97 tests) (98 tests) (99 tests) prop_parentDir_basics++++ OK, passed 100 tests.+(0 tests) (1 test) (2 tests) (3 tests) (4 tests) (5 tests) (6 tests) (7 tests) (8 tests) (9 tests) (10 tests) (11 tests) (12 tests) (13 tests) (14 tests) (15 tests) (16 tests) (17 tests) (18 tests) (19 tests) (20 tests) (21 tests) (22 tests) (23 tests) (24 tests) (25 tests) (26 tests) (27 tests) (28 tests) (29 tests) (30 tests) (31 tests) (32 tests) (33 tests) (34 tests) (35 tests) (36 tests) (37 tests) (38 tests) (39 tests) (40 tests) (41 tests) (42 tests) (43 tests) (44 tests) (45 tests) (46 tests) (47 tests) (48 tests) (49 tests) (50 tests) (51 tests) (52 tests) (53 tests) (54 tests) (55 tests) (56 tests) (57 tests) (58 tests) (59 tests) (60 tests) (61 tests) (62 tests) (63 tests) (64 tests) (65 tests) (66 tests) (67 tests) (68 tests) (69 tests) (70 tests) (71 tests) (72 tests) (73 tests) (74 tests) (75 tests) (76 tests) (77 tests) (78 tests) (79 tests) (80 tests) (81 tests) (82 tests) (83 tests) (84 tests) (85 tests) (86 tests) (87 tests) (88 tests) (89 tests) (90 tests) (91 tests) (92 tests) (93 tests) (94 tests) (95 tests) (96 tests) (97 tests) (98 tests) (99 tests) prop_relPathDirToFile_basics++++ OK, passed 100 tests.+(0 tests) prop_relPathDirToFile_regressionTest++++ OK, passed 1 tests.+(0 tests) prop_cost_sane++++ OK, passed 1 tests.+(0 tests) prop_matcher_sane++++ OK, passed 1 tests.+(0 tests) prop_HmacSha1WithCipher_sane++++ OK, passed 1 tests.+(0 tests) prop_TimeStamp_sane++++ OK, passed 1 tests.+(0 tests) prop_addLog_sane++++ OK, passed 1 tests.+(0 tests) (1 test) (2 tests) (3 tests) (4 tests) (5 tests) (6 tests) (7 tests) (8 tests) (9 tests) (10 tests) (11 tests) (12 tests) (13 tests) (14 tests) (15 tests) (16 tests) (17 tests) (18 tests) (19 tests) (20 tests) (21 tests) (22 tests) (23 tests) (24 tests) (25 tests) (26 tests) (27 tests) (28 tests) (29 tests) (30 tests) (31 tests) (32 tests) (33 tests) (34 tests) (35 tests) (36 tests) (37 tests) (38 tests) (39 tests) (40 tests) (41 tests) (42 tests) (43 tests) (44 tests) (45 tests) (46 tests) (47 tests) (48 tests) (49 tests) (50 tests) (51 tests) (52 tests) (53 tests) (54 tests) (55 tests) (56 tests) (57 tests) (58 tests) (59 tests) (60 tests) (61 tests) (62 tests) (63 tests) (64 tests) (65 tests) (66 tests) (67 tests) (68 tests) (69 tests) (70 tests) (71 tests) (72 tests) (73 tests) (74 tests) (75 tests) (76 tests) (77 tests) (78 tests) (79 tests) (80 tests) (81 tests) (82 tests) (83 tests) (84 tests) (85 tests) (86 tests) (87 tests) (88 tests) (89 tests) (90 tests) (91 tests) (92 tests) (93 tests) (94 tests) (95 tests) (96 tests) (97 tests) (98 tests) (99 tests) prop_verifiable_sane++++ OK, passed 100 tests.+(0 tests) prop_segment_regressionTest++++ OK, passed 1 tests.+(0 tests) (1 test) (2 tests) (3 tests) (4 tests) (5 tests) (6 tests) (7 tests) (8 tests) (9 tests) (10 tests) (11 tests) (12 tests) (13 tests) (14 tests) (15 tests) (16 tests) (17 tests) (18 tests) (19 tests) (20 tests) (21 tests) (22 tests) (23 tests) (24 tests) (25 tests) (26 tests) (27 tests) (28 tests) (29 tests) (30 tests) (31 tests) (32 tests) (33 tests) (34 tests) (35 tests) (36 tests) (37 tests) (38 tests) (39 tests) (40 tests) (41 tests) (42 tests) (43 tests) (44 tests) (45 tests) (46 tests) (47 tests) (48 tests) (49 tests) (50 tests) (51 tests) (52 tests) (53 tests) (54 tests) (55 tests) (56 tests) (57 tests) (58 tests) (59 tests) (60 tests) (61 tests) (62 tests) (63 tests) (64 tests) (65 tests) (66 tests) (67 tests) (68 tests) (69 tests) (70 tests) (71 tests) (72 tests) (73 tests) (74 tests) (75 tests) (76 tests) (77 tests) (78 tests) (79 tests) (80 tests) (81 tests) (82 tests) (83 tests) (84 tests) (85 tests) (86 tests) (87 tests) (88 tests) (89 tests) (90 tests) (91 tests) (92 tests) (93 tests) (94 tests) (95 tests) (96 tests) (97 tests) (98 tests) (99 tests) prop_read_write_transferinfo++++ OK, passed 100 tests.+(0 tests) (1 test) (2 tests) (3 tests) (4 tests) (5 tests) (6 tests) (7 tests) (8 tests) (9 tests) (10 tests) (11 tests) (12 tests) (13 tests) (14 tests) (15 tests) (16 tests) (17 tests) (18 tests) (19 tests) (20 tests) (21 tests) (22 tests) (23 tests) (24 tests) (25 tests) (26 tests) (27 tests) (28 tests) (29 tests) (30 tests) (31 tests) (32 tests) (33 tests) (34 tests) (35 tests) (36 tests) (37 tests) (38 tests) (39 tests) (40 tests) (41 tests) (42 tests) (43 tests) (44 tests) (45 tests) (46 tests) (47 tests) (48 tests) (49 tests) (50 tests) (51 tests) (52 tests) (53 tests) (54 tests) (55 tests) (56 tests) (57 tests) (58 tests) (59 tests) (60 tests) (61 tests) (62 tests) (63 tests) (64 tests) (65 tests) (66 tests) (67 tests) (68 tests) (69 tests) (70 tests) (71 tests) (72 tests) (73 tests) (74 tests) (75 tests) (76 tests) (77 tests) (78 tests) (79 tests) (80 tests) (81 tests) (82 tests) (83 tests) (84 tests) (85 tests) (86 tests) (87 tests) (88 tests) (89 tests) (90 tests) (91 tests) (92 tests) (93 tests) (94 tests) (95 tests) (96 tests) (97 tests) (98 tests) (99 tests) prop_read_show_inodecache++++ OK, passed 100 tests.+(0 tests) (1 test) (2 tests) (3 tests) (4 tests) (5 tests) (6 tests) (7 tests) (8 tests) (9 tests) (10 tests) (11 tests) (12 tests) (13 tests) (14 tests) (15 tests) (16 tests) (17 tests) (18 tests) (19 tests) (20 tests) (21 tests) (22 tests) (23 tests) (24 tests) (25 tests) (26 tests) (27 tests) (28 tests) (29 tests) (30 tests) (31 tests) (32 tests) (33 tests) (34 tests) (35 tests) (36 tests) (37 tests) (38 tests) (39 tests) (40 tests) (41 tests) (42 tests) (43 tests) (44 tests) (45 tests) (46 tests) (47 tests) (48 tests) (49 tests) (50 tests) (51 tests) (52 tests) (53 tests) (54 tests) (55 tests) (56 tests) (57 tests) (58 tests) (59 tests) (60 tests) (61 tests) (62 tests) (63 tests) (64 tests) (65 tests) (66 tests) (67 tests) (68 tests) (69 tests) (70 tests) (71 tests) (72 tests) (73 tests) (74 tests) (75 tests) (76 tests) (77 tests) (78 tests) (79 tests) (80 tests) (81 tests) (82 tests) (83 tests) (84 tests) (85 tests) (86 tests) (87 tests) (88 tests) (89 tests) (90 tests) (91 tests) (92 tests) (93 tests) (94 tests) (95 tests) (96 tests) (97 tests) (98 tests) (99 tests) prop_parse_show_log++++ OK, passed 100 tests.+(0 tests) prop_read_show_TrustLevel++++ OK, passed 1 tests.+(0 tests) prop_parse_show_TrustLog++++ OK, passed 1 tests.++Cases: 1 Tried: 0 Errors: 0 Failures: 0init test repo + Detected a crippled filesystem.++ Disabling core.symlinks.++ Enabling direct mode.++ Detected a filesystem without fifo support.++ Disabling ssh connection caching.+ok+(Recording state in git...)++ +Cases: 1 Tried: 1 Errors: 0 Failures: 0++Cases: 3 Tried: 0 Errors: 0 Failures: 0add foo (checksum...) ok+(Recording state in git...)+add sha1foo (checksum...) ok+(Recording state in git...)+add apple ok+(Recording state in git...)++Cases: 3 Tried: 1 Errors: 0 Failures: 0ssh: Could not resolve hostname C: no address associated with name+fatal: The remote end hung up unexpectedly++ +### Failure in: git-annex add:1+git clone failed++Cases: 3 Tried: 2 Errors: 0 Failures: 1ssh: Could not resolve hostname C: no address associated with name+fatal: The remote end hung up unexpectedly++ +### Failure in: git-annex add:2+git clone failed+Cases: 3 Tried: 3 Errors: 0 Failures: 2++Cases: 1 Tried: 0 Errors: 0 Failures: 0ssh: Could not resolve hostname C: no address associated with name+fatal: The remote end hung up unexpectedly++ +### Failure in: git-annex reinject/fromkey+git clone failed+Cases: 1 Tried: 1 Errors: 0 Failures: 1++Cases: 2 Tried: 0 Errors: 0 Failures: 0ssh: Could not resolve hostname C: no address associated with name+fatal: The remote end hung up unexpectedly++ +### Failure in: git-annex unannex:0:no content+git clone failed++Cases: 2 Tried: 1 Errors: 0 Failures: 1ssh: Could not resolve hostname C: no address associated with name+fatal: The remote end hung up unexpectedly++ +### Failure in: git-annex unannex:1:with content+git clone failed+Cases: 2 Tried: 2 Errors: 0 Failures: 2++Cases: 3 Tried: 0 Errors: 0 Failures: 0ssh: Could not resolve hostname C: no address associated with name+fatal: The remote end hung up unexpectedly++ +### Failure in: git-annex drop:0:no remotes+git clone failed++Cases: 3 Tried: 1 Errors: 0 Failures: 1ssh: Could not resolve hostname C: no address associated with name+fatal: The remote end hung up unexpectedly++ +### Failure in: git-annex drop:1:with remote+git clone failed++Cases: 3 Tried: 2 Errors: 0 Failures: 2ssh: Could not resolve hostname C: no address associated with name+fatal: The remote end hung up unexpectedly++ +### Failure in: git-annex drop:2:untrusted remote+git clone failed+Cases: 3 Tried: 3 Errors: 0 Failures: 3++Cases: 1 Tried: 0 Errors: 0 Failures: 0ssh: Could not resolve hostname C: no address associated with name+fatal: The remote end hung up unexpectedly++ +### Failure in: git-annex get+git clone failed+Cases: 1 Tried: 1 Errors: 0 Failures: 1++Cases: 1 Tried: 0 Errors: 0 Failures: 0ssh: Could not resolve hostname C: no address associated with name+fatal: The remote end hung up unexpectedly++ +### Failure in: git-annex move+git clone failed+Cases: 1 Tried: 1 Errors: 0 Failures: 1++Cases: 1 Tried: 0 Errors: 0 Failures: 0ssh: Could not resolve hostname C: no address associated with name+fatal: The remote end hung up unexpectedly++ +### Failure in: git-annex copy+git clone failed+Cases: 1 Tried: 1 Errors: 0 Failures: 1++Cases: 1 Tried: 0 Errors: 0 Failures: 0ssh: Could not resolve hostname C: no address associated with name+fatal: The remote end hung up unexpectedly++ +### Failure in: git-annex unlock/lock+git clone failed+Cases: 1 Tried: 1 Errors: 0 Failures: 1++Cases: 2 Tried: 0 Errors: 0 Failures: 0ssh: Could not resolve hostname C: no address associated with name+fatal: The remote end hung up unexpectedly++ +### Failure in: git-annex edit/commit:0+git clone failed++Cases: 2 Tried: 1 Errors: 0 Failures: 1ssh: Could not resolve hostname C: no address associated with name+fatal: The remote end hung up unexpectedly++ +### Failure in: git-annex edit/commit:1+git clone failed+Cases: 2 Tried: 2 Errors: 0 Failures: 2++Cases: 1 Tried: 0 Errors: 0 Failures: 0ssh: Could not resolve hostname C: no address associated with name+fatal: The remote end hung up unexpectedly++ +### Failure in: git-annex fix+git clone failed+Cases: 1 Tried: 1 Errors: 0 Failures: 1++Cases: 1 Tried: 0 Errors: 0 Failures: 0ssh: Could not resolve hostname C: no address associated with name+fatal: The remote end hung up unexpectedly++ +### Failure in: git-annex trust/untrust/semitrust/dead+git clone failed+Cases: 1 Tried: 1 Errors: 0 Failures: 1++Cases: 4 Tried: 0 Errors: 0 Failures: 0ssh: Could not resolve hostname C: no address associated with name+fatal: The remote end hung up unexpectedly++ +### Failure in: git-annex fsck:0+git clone failed++Cases: 4 Tried: 1 Errors: 0 Failures: 1ssh: Could not resolve hostname C: no address associated with name+fatal: The remote end hung up unexpectedly++ +### Failure in: git-annex fsck:1+git clone failed++Cases: 4 Tried: 2 Errors: 0 Failures: 2ssh: Could not resolve hostname C: no address associated with name+fatal: The remote end hung up unexpectedly++ +### Failure in: git-annex fsck:2+git clone failed++Cases: 4 Tried: 3 Errors: 0 Failures: 3ssh: Could not resolve hostname C: no address associated with name+fatal: The remote end hung up unexpectedly++ +### Failure in: git-annex fsck:3+git clone failed+Cases: 4 Tried: 4 Errors: 0 Failures: 4++Cases: 2 Tried: 0 Errors: 0 Failures: 0ssh: Could not resolve hostname C: no address associated with name+fatal: The remote end hung up unexpectedly++ +### Failure in: git-annex migrate:0+git clone failed++Cases: 2 Tried: 1 Errors: 0 Failures: 1ssh: Could not resolve hostname C: no address associated with name+fatal: The remote end hung up unexpectedly++ +### Failure in: git-annex migrate:1+git clone failed+Cases: 2 Tried: 2 Errors: 0 Failures: 2++Cases: 1 Tried: 0 Errors: 0 Failures: 0ssh: Could not resolve hostname C: no address associated with name+fatal: The remote end hung up unexpectedly++ +### Failure in: git-annex unused/dropunused+git clone failed+Cases: 1 Tried: 1 Errors: 0 Failures: 1++Cases: 1 Tried: 0 Errors: 0 Failures: 0ssh: Could not resolve hostname C: no address associated with name+fatal: The remote end hung up unexpectedly++ +### Failure in: git-annex describe+git clone failed+Cases: 1 Tried: 1 Errors: 0 Failures: 1++Cases: 1 Tried: 0 Errors: 0 Failures: 0ssh: Could not resolve hostname C: no address associated with name+fatal: The remote end hung up unexpectedly++ +### Failure in: git-annex find+git clone failed+Cases: 1 Tried: 1 Errors: 0 Failures: 1++Cases: 1 Tried: 0 Errors: 0 Failures: 0ssh: Could not resolve hostname C: no address associated with name+fatal: The remote end hung up unexpectedly++ +### Failure in: git-annex merge+git clone failed+Cases: 1 Tried: 1 Errors: 0 Failures: 1++Cases: 1 Tried: 0 Errors: 0 Failures: 0ssh: Could not resolve hostname C: no address associated with name+fatal: The remote end hung up unexpectedly++ +### Failure in: git-annex status+git clone failed+Cases: 1 Tried: 1 Errors: 0 Failures: 1++Cases: 1 Tried: 0 Errors: 0 Failures: 0ssh: Could not resolve hostname C: no address associated with name+fatal: The remote end hung up unexpectedly++ +### Failure in: git-annex version+git clone failed+Cases: 1 Tried: 1 Errors: 0 Failures: 1++Cases: 1 Tried: 0 Errors: 0 Failures: 0ssh: Could not resolve hostname C: no address associated with name+fatal: The remote end hung up unexpectedly++ +### Failure in: git-annex sync+git clone failed+Cases: 1 Tried: 1 Errors: 0 Failures: 1++Cases: 1 Tried: 0 Errors: 0 Failures: 0ssh: Could not resolve hostname C: no address associated with name+fatal: The remote end hung up unexpectedly++ +### Failure in: union merge regression+git clone failed+Cases: 1 Tried: 1 Errors: 0 Failures: 1++Cases: 1 Tried: 0 Errors: 0 Failures: 0ssh: Could not resolve hostname C: no address associated with name+fatal: The remote end hung up unexpectedly++ +### Failure in: automatic conflict resolution+git clone failed+Cases: 1 Tried: 1 Errors: 0 Failures: 1++Cases: 1 Tried: 0 Errors: 0 Failures: 0ssh: Could not resolve hostname C: no address associated with name+fatal: The remote end hung up unexpectedly++ +### Failure in: git-annex map+git clone failed+Cases: 1 Tried: 1 Errors: 0 Failures: 1++Cases: 1 Tried: 0 Errors: 0 Failures: 0ssh: Could not resolve hostname C: no address associated with name+fatal: The remote end hung up unexpectedly++ +### Failure in: git-annex uninit+git clone failed+Cases: 1 Tried: 1 Errors: 0 Failures: 1++Cases: 1 Tried: 0 Errors: 0 Failures: 0ssh: Could not resolve hostname C: no address associated with name+fatal: The remote end hung up unexpectedly++ +### Failure in: git-annex upgrade+git clone failed+Cases: 1 Tried: 1 Errors: 0 Failures: 1++Cases: 1 Tried: 0 Errors: 0 Failures: 0ssh: Could not resolve hostname C: no address associated with name+fatal: The remote end hung up unexpectedly++ +### Failure in: git-annex whereis+git clone failed+Cases: 1 Tried: 1 Errors: 0 Failures: 1++Cases: 1 Tried: 0 Errors: 0 Failures: 0ssh: Could not resolve hostname C: no address associated with name+fatal: The remote end hung up unexpectedly++ +### Failure in: git-annex hook remote+git clone failed+Cases: 1 Tried: 1 Errors: 0 Failures: 1++Cases: 1 Tried: 0 Errors: 0 Failures: 0ssh: Could not resolve hostname C: no address associated with name+fatal: The remote end hung up unexpectedly++ +### Failure in: git-annex directory remote+git clone failed+Cases: 1 Tried: 1 Errors: 0 Failures: 1++Cases: 1 Tried: 0 Errors: 0 Failures: 0ssh: Could not resolve hostname C: no address associated with name+fatal: The remote end hung up unexpectedly++ +### Failure in: git-annex rsync remote+git clone failed+Cases: 1 Tried: 1 Errors: 0 Failures: 1++Cases: 1 Tried: 0 Errors: 0 Failures: 0ssh: Could not resolve hostname C: no address associated with name+fatal: The remote end hung up unexpectedly++ +### Failure in: git-annex bup remote+git clone failed+Cases: 1 Tried: 1 Errors: 0 Failures: 1++Cases: 1 Tried: 0 Errors: 0 Failures: 0ssh: Could not resolve hostname C: no address associated with name+fatal: The remote end hung up unexpectedly++ +### Failure in: git-annex crypto+git clone failed+Cases: 1 Tried: 1 Errors: 0 Failures: 1++Cases: 1 Tried: 0 Errors: 0 Failures: 0ssh: Could not resolve hostname C: no address associated with name+fatal: The remote end hung up unexpectedly++ +### Failure in: git-annex preferred-content+git clone failed+Cases: 1 Tried: 1 Errors: 0 Failures: 1+----------------------------------------------------------------------+Now, some broader checks ...+ (Do not be alarmed by odd output here; it's normal.+ wait for the last line to see how it went.)+----------------------------------------------------------------------+init+----------------------------------------------------------------------+add+----------------------------------------------------------------------+reinject+----------------------------------------------------------------------+unannex+----------------------------------------------------------------------+drop+----------------------------------------------------------------------+get+----------------------------------------------------------------------+move+----------------------------------------------------------------------+copy+----------------------------------------------------------------------+lock+----------------------------------------------------------------------+edit+----------------------------------------------------------------------+fix+----------------------------------------------------------------------+trust+----------------------------------------------------------------------+fsck+----------------------------------------------------------------------+migrate+----------------------------------------------------------------------+ unused+----------------------------------------------------------------------+describe+----------------------------------------------------------------------+find+----------------------------------------------------------------------+merge+----------------------------------------------------------------------+status+----------------------------------------------------------------------+version+----------------------------------------------------------------------+sync+----------------------------------------------------------------------+union merge regression+----------------------------------------------------------------------+conflict resolution+----------------------------------------------------------------------+map+----------------------------------------------------------------------+uninit+----------------------------------------------------------------------+upgrade+----------------------------------------------------------------------+whereis+----------------------------------------------------------------------+hook remote+----------------------------------------------------------------------+directory remote+----------------------------------------------------------------------+rsync remote+----------------------------------------------------------------------+bup remote+----------------------------------------------------------------------+crypto+----------------------------------------------------------------------+preferred content+----------------------------------------------------------------------+Some tests failed!+ (This could be due to a bug in git-annex, or an incompatability+ with utilities, such as git, installed on this system.)+++# End of transcript or log.+"""]]++[[!tag moreinfo]]
@@ -0,0 +1,21 @@+I'm using S3 special remote that I initialized like this:++ git annex initremote s3 type=S3 encryption=EEF2B390 datacenter="EU" storageclass="REDUCED_REDUNDANCY"++Instead of asking me my key passphrase (I have gpg-agent running), it ask me a new passphase an then repeat it. So it's not my passphrase because if I kill gpg-agent, it will ask me three passphrase for each file: one mine and two for the new one. If i don't put anything there it says:++ copy GOPR1672.JPG (checking s3...) (to s3...) gpg: error creating passphrase: Invalid passphrase+ gpg: symmetric encryption of `[stdin]' failed: Invalid passphrase+ failed+ git-annex: fd:13: hPutBuf: resource vanished (Broken pipe)+ copy GOPR1673.JPG (checking s3...) (to s3...) ++So I create a new passphrase (two times) for each file I tried to upload. The problem is that I have more than 12000 files to upload!++What's this new passphrase for?++BTW: git-annex version: 3.20130102 same precompiled binary on Arch Linux.++> I've reproduced this with gpg 2.0.19. It is a documented incompatability+> between gpg 1.x and 2.x; the latter needs --batch included in its+> parameters. I've put in a fix. [[done]]
@@ -0,0 +1,35 @@+### Please describe the problem.++When the assistant connects the second time during adding a ssh remote, it assumes port 22 when different port is given.++### What steps will reproduce the problem?++Adding a ssh git remote with non-standard port.++### What version of git-annex are you using? On what operating system?++GNU/Linux, Ubuntu 12.10, amd64, git-annex 4.20130627-g728b27a++Happens on android as well.++### Please provide any additional information below.++[[!format sh """+# If you can, paste a complete transcript of the problem occurring here.+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log++Error message (nothing related in daemon.log):++Failed to make repository++Something went wrong setting up the repository on the remote server.++Transcript:++ssh: connect to host xxxxx port 22: Connection refused++# End of transcript or log.+"""]]++> [[Fixed|done]]; this bug was introcuded in version+> 4.20130627 while making some other ssh fixes. --[[Joey]]
@@ -0,0 +1,100 @@+Wow, what a great archiving system. Thank you for all your work on git annex!++### Please describe the problem.++I was using 'git annex assistant' on a brand-new annex that I created today. I had previously added about 20GB of data and a couple thousand files, mostly MP4 videos and MP3 music.++I then used regular 'mv' to add a folder containing about 20GB of music. This went well for a while—git annex assistant added two groups of files, containing roughly 700 and 1000 MP3s each. But the third group contained 4,923 files, and it's taking a really long time to import.++CPU usage is pretty consistently near 100%. According to the log, the files are being processed slowly.++### What steps will reproduce the problem?++I don't want to try to reproduce this problem until the MP3s finish being imported. I can try again later with thousands of digital photos if that would help.++### What version of git-annex are you using? On what operating system?++Version: 4.20130709.1 +Build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP++Ubuntu 12.04.2 LTS++### Please provide any additional information below.++Here's the 'top' output and a snippet of the log. Let me know if you need anything else.++[[!format sh """+# CPU usage++ PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND + 584 ...me... 20 0 776m 147m 16m S 100 0.9 181:16.87 git-annex +++# If you can, paste a complete transcript of the problem occurring here.+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log++[201ok+add music/Pop/Various/Like, Omigod! The 80s Pop Culture Box (totally)/._3-06 Words.mp3 3-0(checksum...) 7-22 14:52:14 EDT] TransferScanner: queued Upload UUID "8dbe75a4-b065-46fd-99f7-22599b2eaf06" music/Rock/Aerosmith/A Little South of Sanity/._2-08 Walk This Way.mp3 Nothing : expensive scan found missing object+[2013-07-22 14:52:34 EDT] Transferrer: Transferring: Upload UUID "8dbe75a4-b065-46fd-99f7-22599b2eaf06" music/Rock/Aerosmith/A Little South of Sanity/._2-08 Walk This Way.mp3 Nothing+[2013-07-22 14:52:34 EDT] chat: git ["--git-dir=/mnt/storage/private/annex/.git","--work-tree=/mnt/storage/private/annex","hash-object","-t","blob","-w","--stdin","--no-filters"]+[ok+add music/Pop/Various/Like, Omigod! The 80s Pop Culture Box (totally)/._4-05 Our House.mp3 2013-0(checksum...) 7-22 14:52:34 EDT] TransferWatcher: transfer starting: Upload UUID "8dbe75a4-b065-46fd-99f7-22599b2eaf06" music/Rock/Aerosmith/A Little South of Sanity/._2-08 Walk This Way.mp3 Nothing+[2013-07-22 14:52:54 EDT] TransferWatcher: transfer finishing: Transfer {transferDirection = Upload, transferUUID = UUID "8dbe75a4-b065-46fd-99f7-22599b2eaf06", transferKey = Key {keyName = "a8ddf79be61cf4a5ab3c7c8e95d8c259ceb102410dff50eb1260e7d818f8c5a8.mp3", keyBackendName = "SHA256E", keySize = Just 70, keyMtime = Nothing}}+[2013-07-22 14:52:54 EDT] chat: git ["--git-dir=/mnt/storage/private/annex/.git","--work-tree=/mnt/storage/private/annex","hash-object","-t","blob","-w","--stdin","--no-filters"]+ok+add music/Pop/Various/Like, Omigod! The 80s Pop Culture Box (totally)/7-15 Never Gonna Give You Up.mp3 (checksum...) [2013-07-22 14:52:54 EDT] read: sha256sum ["/mnt/storage/private/annex/.git/annex/tmp/7-15 Never Gonna Give You Up584.mp3"]+[2013-07-22 14:52:55 EDT] chat: git ["--git-dir=/mnt/storage/private/annex/.git","--work-tree=/mnt/storage/private/annex","hash-object","-t","blob","-w","--stdin","--no-filters"]+[ok+add music/Pop/Various/Like, Omigod! The 80s Pop Culture Box (totally)/3-09 Down Under.mp3 2013-07-(checksum...) 22 14:52:55 EDT] TransferScanner: queued Upload UUID "8dbe75a4-b065-46fd-99f7-22599b2eaf06" music/Rock/Aerosmith/A Little South of Sanity/._2-09 Dude (Looks Like A Lady).mp3 Nothing : expensive scan found missing object+[2013-07-22 14:52:55 EDT] read: sha256sum ["/mnt/storage/private/annex/.git/annex/tmp/3-09 Down Under584.mp3"]+[2013-07-22 14:52:55 EDT] Transferrer: Transferring: Upload UUID "8dbe75a4-b065-46fd-99f7-22599b2eaf06" music/Rock/Aerosmith/A Little South of Sanity/._2-09 Dude (Looks Like A Lady).mp3 Nothing+[2013-07-22 14:52:55 EDT] chat: git ["--git-dir=/mnt/storage/private/annex/.git","--work-tree=/mnt/storage/private/annex","hash-object","-t","blob","-w","--stdin","--no-filters"]+[ok+add music/Pop/Various/Like, Omigod! The 80s Pop Culture Box (totally)/7-19 Right Here Waiting.mp3 2013(checksum...) -07-22 14:52:55 EDT] TransferWatcher: transfer starting: Upload UUID "8dbe75a4-b065-46fd-99f7-22599b2eaf06" music/Rock/Aerosmith/A Little South of Sanity/._2-09 Dude (Looks Like A Lady).mp3 Nothing+[2013-07-22 14:52:55 EDT] read: sha256sum ["/mnt/storage/private/annex/.git/annex/tmp/7-19 Right Here Waiting584.mp3"]+[2013-07-22 14:52:55 EDT] TransferWatcher: transfer finishing: Transfer {transferDirection = Upload, transferUUID = UUID "8dbe75a4-b065-46fd-99f7-22599b2eaf06", transferKey = Key {keyName = "a8ddf79be61cf4a5ab3c7c8e95d8c259ceb102410dff50eb1260e7d818f8c5a8.mp3", keyBackendName = "SHA256E", keySize = Just 70, keyMtime = Nothing}}+[2013-07-22 14:52:55 EDT] chat: git ["--git-dir=/mnt/storage/private/annex/.git","--work-tree=/mnt/storage/private/annex","hash-object","-t","blob","-w","--stdin","--no-filters"]+ok+add music/Pop/Various/Like, Omigod! The 80s Pop Culture Box (totally)/._1-04 Another One Bites The Dust.mp3 (checksum...) [2013-07-22 14:53:15 EDT] chat: git ["--git-dir=/mnt/storage/private/annex/.git","--work-tree=/mnt/storage/private/annex","hash-object","-t","blob","-w","--stdin","--no-filters"]+[2013ok+add music/Pop/Various/Like, Omigod! The 80s Pop Culture Box (totally)/2-08 Hold On Loosely.mp3 -07(checksum...) -22 14:53:15 EDT] TransferScanner: queued Upload UUID "8dbe75a4-b065-46fd-99f7-22599b2eaf06" music/Rock/Aerosmith/A Little South of Sanity/._2-10 What It Takes.mp3 Nothing : expensive scan found missing object+[2013-07-22 14:53:15 EDT] read: sha256sum ["/mnt/storage/private/annex/.git/annex/tmp/2-08 Hold On Loosely584.mp3"]+[2013-07-22 14:53:15 EDT] Transferrer: Transferring: Upload UUID "8dbe75a4-b065-46fd-99f7-22599b2eaf06" music/Rock/Aerosmith/A Little South of Sanity/._2-10 What It Takes.mp3 Nothing+[2013-07-22 14:53:15 EDT] chat: git ["--git-dir=/mnt/storage/private/annex/.git","--work-tree=/mnt/storage/private/annex","hash-object","-t","blob","-w","--stdin","--no-filters"]+[ok+add music/Pop/Various/Like, Omigod! The 80s Pop Culture Box (totally)/._6-11 Kyrie.mp3 201(checksum...) 3-07-22 14:53:15 EDT] TransferWatcher: transfer starting: Upload UUID "8dbe75a4-b065-46fd-99f7-22599b2eaf06" music/Rock/Aerosmith/A Little South of Sanity/._2-10 What It Takes.mp3 Nothing+[2013-07-22 14:53:36 EDT] TransferWatcher: transfer finishing: Transfer {transferDirection = Upload, transferUUID = UUID "8dbe75a4-b065-46fd-99f7-22599b2eaf06", transferKey = Key {keyName = "a8ddf79be61cf4a5ab3c7c8e95d8c259ceb102410dff50eb1260e7d818f8c5a8.mp3", keyBackendName = "SHA256E", keySize = Just 70, keyMtime = Nothing}}+[2013-07-22 14:53:36 EDT] chat: git ["--git-dir=/mnt/storage/private/annex/.git","--work-tree=/mnt/storage/private/annex","hash-object","-t","blob","-w","--stdin","--no-filters"]+ok+add music/Pop/Various/Like, Omigod! The 80s Pop Culture Box (totally)/._5-03 I'm So Excited.mp3 (checksum...) [2013-07-22 14:53:56 EDT] chat: git ["--git-dir=/mnt/storage/private/annex/.git","--work-tree=/mnt/storage/private/annex","hash-object","-t","blob","-w","--stdin","--no-filters"]+[2013ok+add music/Pop/Various/Like, Omigod! The 80s Pop Culture Box (totally)/7-20 Roam.mp3 -07-(checksum...) 22 14:53:56 EDT] TransferScanner: queued Upload UUID "8dbe75a4-b065-46fd-99f7-22599b2eaf06" music/Rock/Aerosmith/A Little South of Sanity/._2-11 Sweet Emotion.mp3 Nothing : expensive scan found missing object+[2013-07-22 14:53:56 EDT] read: sha256sum ["/mnt/storage/private/annex/.git/annex/tmp/7-20 Roam584.mp3"]+[2013-07-22 14:53:57 EDT] Transferrer: Transferring: Upload UUID "8dbe75a4-b065-46fd-99f7-22599b2eaf06" music/Rock/Aerosmith/A Little South of Sanity/._2-11 Sweet Emotion.mp3 Nothing+[2013-07-22 14:53:57 EDT] chat: git ["--git-dir=/mnt/storage/private/annex/.git","--work-tree=/mnt/storage/private/annex","hash-object","-t","blob","-w","--stdin","--no-filters"]+[2ok+add music/Pop/Various/Like, Omigod! The 80s Pop Culture Box (totally)/._3-20 Goodbye To You.mp3 013-07(checksum...) -22 14:53:57 EDT] TransferWatcher: transfer finishing: Transfer {transferDirection = Upload, transferUUID = UUID "8dbe75a4-b065-46fd-99f7-22599b2eaf06", transferKey = Key {keyName = "a8ddf79be61cf4a5ab3c7c8e95d8c259ceb102410dff50eb1260e7d818f8c5a8.mp3", keyBackendName = "SHA256E", keySize = Just 70, keyMtime = Nothing}}+[2013-07-22 14:54:17 EDT] chat: git ["--git-dir=/mnt/storage/private/annex/.git","--work-tree=/mnt/storage/private/annex","hash-object","-t","blob","-w","--stdin","--no-filters"]+ok+add music/Pop/Various/Like, Omigod! The 80s Pop Culture Box (totally)/._7-18 Don't Worry Be Happy.mp3 (checksum...) [2013-07-22 14:54:37 EDT] chat: git ["--git-dir=/mnt/storage/private/annex/.git","--work-tree=/mnt/storage/private/annex","hash-object","-t","blob","-w","--stdin","--no-filters"]+[ok+add music/Pop/Various/Like, Omigod! The 80s Pop Culture Box (totally)/._3-04 Rock This Town.mp3 2013-(checksum...) 07-22 14:54:37 EDT] TransferScanner: queued Upload UUID "8dbe75a4-b065-46fd-99f7-22599b2eaf06" music/Rock/Aerosmith/A Little South of Sanity/1-01 Eat The Rich.mp3 Nothing : expensive scan found missing object+[2013-07-22 14:54:57 EDT] Transferrer: Transferring: Upload UUID "8dbe75a4-b065-46fd-99f7-22599b2eaf06" music/Rock/Aerosmith/A Little South of Sanity/1-01 Eat The Rich.mp3 Nothing+[2013-07-22 14:54:57 EDT] chat: git ["--git-dir=/mnt/storage/private/annex/.git","--work-tree=/mnt/storage/private/annex","hash-object","-t","blob","-w","--stdin","--no-filters"]+ok+add music/Pop/Various/Like, Omigod! The 80s Pop Culture Box (totally)/._7-13 Since You've Been Gone.mp3 [2013-(checksum...) 07-22 14:54:57 EDT] TransferWatcher: transfer finishing: Transfer {transferDirection = Upload, transferUUID = UUID "8dbe75a4-b065-46fd-99f7-22599b2eaf06", transferKey = Key {keyName = "2cb6e7b6ee77f9f98e01e942185265dfe18868503e93d78201485672e6939ab7.mp3", keyBackendName = "SHA256E", keySize = Just 6354105, keyMtime = Nothing}}+[2013-07-22 14:55:18 EDT] chat: git ["--git-dir=/mnt/storage/private/annex/.git","--work-tree=/mnt/storage/private/annex","hash-object","-t","blob","-w","--stdin","--no-filters"]+ok+add music/Pop/Various/Like, Omigod! The 80s Pop Culture Box (totally)/._2-09 Believe It Or Not (Theme From _Greatest American Hero_).mp3 (checksum...) [2013-07-22 14:55:38 EDT] chat: git ["--git-dir=/mnt/storage/private/annex/.git","--work-tree=/mnt/storage/private/annex","hash-object","-t","blob","-w","--stdin","--no-filters"]+[ok+add music/Pop/Various/Like, Omigod! The 80s Pop Culture Box (totally)/7-14 Only In My Dreams.mp3 2013(checksum...) -07-22 14:55:38 EDT] TransferScanner: queued Upload UUID "8dbe75a4-b065-46fd-99f7-22599b2eaf06" music/Rock/Aerosmith/A Little South of Sanity/1-02 Love In An Elevator.mp3 Nothing : expensive scan found missing object+[2013-07-22 14:55:38 EDT] read: sha256sum ["/mnt/storage/private/annex/.git/annex/tmp/7-14 Only In My Dreams584.mp3"]+[2013-07-22 14:55:38 EDT] Transferrer: Transferring: Upload UUID "8dbe75a4-b065-46fd-99f7-22599b2eaf06" music/Rock/Aerosmith/A Little South of Sanity/1-02 Love In An Elevator.mp3 Nothing+[2013-07-22 14:55:38 EDT] chat: git ["--git-dir=/mnt/storage/private/annex/.git","--work-tree=/mnt/storage/private/annex","hash-object","-t","blob","-w","--stdin","--no-filters"]+[2013-ok+add music/Pop/Various/Like, Omigod! The 80s Pop Culture Box (totally)/._4-08 Talking In Your Sleep.mp3 07-2(checksum...) 2 14:55:38 EDT] TransferWatcher: transfer finishing: Transfer {transferDirection = Upload, transferUUID = UUID "8dbe75a4-b065-46fd-99f7-22599b2eaf06", transferKey = Key {keyName = "7cd4b9aefb99f044c5f3b24e9890f45673a63ada3b71e7399e17eb1d710ea0f6.mp3", keyBackendName = "SHA256E", keySize = Just 7181660, keyMtime = Nothing}}++# End of transcript or log.+"""]]++[[!meta title="direct mode mappings scale badly with thousands of identical files"]]
@@ -0,0 +1,49 @@+# What steps will reproduce the problem?++ echo "TEST CONTENT" > fileA+ cp fileA fileB+ git annex add file{A,B}+ git annex drop fileA --force+ cat fileB++# What is the expected output? What do you see instead?++## expected: ++--> TEST CONTENT++## observed:++--> cat: fileB: No such file or directory+++# What version of git-annex are you using? On what operating system?++git-annex version: 3.20121017++# Please provide any additional information below.++I really like git annex's feature, to store the same content only once. But as this happens transparently (i.e. the user does not need to no, nor is he told, that contents are identical (which is very comfortable, of course)), the "git annex drop" function is broken. For it effectively deleting (seemingly) random files, WITHOUT notifying the user.+++# Possible solution?++One simple solution would be to use "git annex find" functionality to see who else uses the file and NOT deleting it.++But this still leaves a problem:++Consider the following variation of the above example and assume, that "drop" does not delete content that is still used (i.e. implementing the above solution). ++ echo "TEST CONTENT" > fileA+ cp fileA fileB+ git annex add file{A,B}+ git rm fileB+ git annex drop fileA --force+ git checkout --force+ cat fileB+--> cat: fileB: No such file or directory++Here again, the problem is, that the user would probably (correct me if I am wrong) expect that the fileB still exists, because removing a file and checking it out again is expected to not mess with the annex contents (?). He does not know, that the "annex frop fileA" actually drop fileB's contents, because there was no additional file linking to it. It effectively performed a "git annex dropunused".++> We seem to have agreed this is reasonable behavior, and a doc change was done.+> Do feel free to suggest other doc changes.. [[done]] --[[Joey]]
@@ -0,0 +1,14 @@+### Please describe the problem.++When running a command like `git annex copy --not --in bucket --to bucket`, I got:++`fatal: bad config file line 1 in /home/jim/tmp/git-annex14898.tmp`++I caught `git-annex14898.tmp` before it was deleted and it contained an HTML error page.+I have a remote `https://git.example.com/jim/annex.git`, and it appears that git-annex+is requesting `https://git.example.com/jim/annex.git/config`. My server returns a 401 +Forbidden and an error page for that URL, but git-annex tries to use the response as a config file anyway.++Jim++> [[fixed|done]] --[[Joey]]
@@ -0,0 +1,23 @@+"git annex watch" will add the file generated by "git annex map", which is+probably not intended. Shouldn’t this file be created in /tmp or+.git/annex/ or somewhere else?++> Indeed, so [[done]] --[[Joey]]++ /tmp $ cd test/+ /tmp/test $ git init+ Initialized empty Git repository in /tmp/test/.git/+ /tmp/test $ git annex init+ init ok+ (Recording state in git...)+ /tmp/test $ git annex watch+ /tmp/test $ git annex map+ map /tmp/test ok+ + running: dot -Tx11 map.dot+ + ok+ /tmp/test $ ls -l+ insgesamt 4+ lrwxrwxrwx 1 jojo jojo 180 Jul 15 23:36 map.dot -> .git/annex/objects/P3/76/SHA256-s208--44199582b5948512ff12cf03de0b86fa1bebf09785dba2827fe52afee0afbe3d/SHA256-s208--44199582b5948512ff12cf03de0b86fa1bebf09785dba2827fe52afee0afbe3d+
@@ -0,0 +1,4 @@+`make test` fails silently when the test program cannot be built. This happens, for example, when attempting to compile git-annex with `QuickCheck-2.4.2`.++> I've made "make test" exit nonzero if the test suite cannot be built.+> [[done]] --[[Joey]]
@@ -0,0 +1,8 @@+[Due to some stupid issue on my and AT&T's part] one of my remote repositories is currently unreachable. I would like to tell the webapp/assistant to not attempt to sync with it, or, at least, modify this error message to be more specific (by telling me which repository is unreachable).++In a red bubble it says: "Synced with rose 60justin"++That verbage is the same if they all succeed. The only difference is the red instead of green. Would be nice to know exactly which machine to kick (if I didn't already know, eg I was syncing only with repositories not under my control).++> Fixed alert display. Webapp has allowed pausing syncing with a repository+> for a while. [[done]] --[[Joey]]
@@ -0,0 +1,15 @@+### Please describe the problem.++`git annex fix` only works on files that have been annexed, already.+While that's a safety measure of course, an option like `--force` or similar would be nice if one is shuffling around data by hand.++### What steps will reproduce the problem?++Please see [[bugs/__96__git_annex_add__96___changes_mtime_if_symlinks_are_fixed_in_the_background/]] for details; I didn't want to spam exactly the same output twice.++### What version of git-annex are you using? On what operating system?++git-annex 4.20130709 on Debian unstable i386 and x64.++> We've discussed this on IRC and there seems to be nothing more to do here.+> [[done]] --[[Joey]]
@@ -0,0 +1,62 @@+### Please describe the problem.++mtimes are clobbered with what I think is the time of the first time `git annex` saw a file in that directory on all files which are `git annex import`ed.+++### What steps will reproduce the problem?++ richih@eudyptes (git)-[master] ~/killme/target % date; stat ../source/*; date; git annex import ../source/*; date; stat *; date+ Tue Jul 30 01:41:43 CEST 2013+ File: ‘../source/foo’+ Size: 0 Blocks: 0 IO Block: 4096 regular empty file+ Device: 804h/2052d Inode: 110095 Links: 1+ Access: (0644/-rw-r--r--) Uid: ( 1000/ richih) Gid: ( 1000/ richih)+ Access: 2013-07-30 01:41:03.860703428 +0200+ Modify: 2013-07-30 01:41:03.860703428 +0200+ Change: 2013-07-30 01:41:03.860703428 +0200+ Birth: -+ File: ‘../source/foobar’+ Size: 0 Blocks: 0 IO Block: 4096 regular empty file+ Device: 804h/2052d Inode: 110104 Links: 1+ Access: (0644/-rw-r--r--) Uid: ( 1000/ richih) Gid: ( 1000/ richih)+ Access: 2013-07-30 01:41:05.512703349 +0200+ Modify: 2013-07-30 01:41:05.512703349 +0200+ Change: 2013-07-30 01:41:05.512703349 +0200+ Birth: -+ Tue Jul 30 01:41:43 CEST 2013+ import foo (checksum...) ok+ import foobar (checksum...) ok+ (Recording state in git...)+ Tue Jul 30 01:41:43 CEST 2013+ File: ‘foo’ -> ‘.git/annex/objects/pX/ZJ/SHA256E-s0--e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855/SHA256E-s0--e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855’+ Size: 178 Blocks: 8 IO Block: 4096 symbolic link+ Device: 804h/2052d Inode: 268638577 Links: 1+ Access: (0777/lrwxrwxrwx) Uid: ( 1000/ richih) Gid: ( 1000/ richih)+ Access: 2013-07-30 01:41:43.704701516 +0200+ Modify: 2013-07-30 01:19:41.000000000 +0200+ Change: 2013-07-30 01:41:43.700701516 +0200+ Birth: -+ File: ‘foobar’ -> ‘.git/annex/objects/pX/ZJ/SHA256E-s0--e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855/SHA256E-s0--e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855’+ Size: 178 Blocks: 8 IO Block: 4096 symbolic link+ Device: 804h/2052d Inode: 268774374 Links: 1+ Access: (0777/lrwxrwxrwx) Uid: ( 1000/ richih) Gid: ( 1000/ richih)+ Access: 2013-07-30 01:41:43.704701516 +0200+ Modify: 2013-07-30 01:19:41.000000000 +0200+ Change: 2013-07-30 01:41:43.700701516 +0200+ Birth: -+ Tue Jul 30 01:41:43 CEST 2013+ richih@eudyptes (git)-[master] ~/killme/target %+++### What version of git-annex are you using? On what operating system?++ git-annex version: 4.20130709+ build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP+ local repository version: 3+ default repository version: 3+ supported repository versions: 3 4+ upgrade supported from repository versions: 0 1 2++Debian unstable amd64++> [[fixed|done]] --[[Joey]]
@@ -0,0 +1,106 @@+### Please describe the problem.++A mere `git annex sync` does not go through the reachable remotes.++### What steps will reproduce the problem?++I do not know what could have put my repository in this state.++### What version of git-annex are you using? On what operating system?++git-annex version: 4.20130802-g1452ac3+build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP+local repository version: 4+default repository version: 3+supported repository versions: 3 4+upgrade supported from repository versions: 0 1 2++Linux dawn 3.10.3-1-ARCH #1 SMP PREEMPT Fri Jul 26 11:26:59 CEST 2013 x86_64 GNU/Linux++### Please provide any additional information below.++[[!format sh """+% git annex status+supported backends: SHA256E SHA1E SHA512E SHA224E SHA384E SHA256 SHA1 SHA512 SHA224 SHA384 WORM URL+supported remote types: git S3 bup directory rsync web webdav glacier hook+repository mode: direct+trusted repositories: 1+ f3cb4e8f-65f1-4ded-a6a1-abef64ddcff5 -- zoidberg (sam@git-annex:/media/git-annex/Music)+semitrusted repositories: 5+ 00000000-0000-0000-0000-000000000001 -- web+ 063a31dc-542d-407f-a9ed-124479fa6354 -- here (dawn)+ 22b72aa6-058b-4622-8132-27aa2d8950dc -- arrakis (sam@arrakis:~/Music)+ 5b3a1abf-5e0b-41bc-a141-774d6236ec76 -- backup on old USB disk+ 6affec3c-fd26-11e2-9ddd-53f02e5ca176 -- music on eeePC+untrusted repositories: 0+transfers in progress: none+available local disk space: 9.83 gigabytes (+1 megabyte reserved)+local annex keys: 3947+local annex size: 23.51 gigabytes+known annex keys: 3965+known annex size: 23.56 gigabytes+bloom filter size: 16 mebibytes (0.8% full)+backend usage: + SHA256E: 7912++% git remote -v+arrakis arrakis:Music (fetch)+arrakis arrakis:Music (push)+zoidberg ssh://git-annex@zoidberg.rfc1149.net:2222/~/Music (fetch)+zoidberg ssh://git-annex@zoidberg.rfc1149.net:2222/~/Music (push)++# Note how here it does not seem to sync with any remote+% git annex sync+(Recording state in git...)+commit +ok++% git annex sync zoidberg+(Recording state in git...)+commit +ok+pull zoidberg +ok+push zoidberg +Everything up-to-date+ok++% git annex sync arrakis+(Recording state in git...)+commit +ok+pull arrakis +From arrakis:Music+ c1a24bd..ba060b7 git-annex -> arrakis/git-annex+ 98b9a8e..be9c146 master -> arrakis/master+ e0df2be..be9c146 synced/master -> arrakis/synced/master+ok++# A nameless sync with debug turned on+% git annex sync --debug +[2013-08-06 10:59:57 CEST] read: git ["--git-dir=/home/sam/Music/.git","--work-tree=/home/sam/Music","symbolic-ref","HEAD"]+[2013-08-06 10:59:57 CEST] read: git ["--git-dir=/home/sam/Music/.git","--work-tree=/home/sam/Music","show-ref","refs/heads/master"]+[2013-08-06 10:59:57 CEST] read: git ["--git-dir=/home/sam/Music/.git","--work-tree=/home/sam/Music","show-ref","git-annex"]+[2013-08-06 10:59:57 CEST] read: git ["--git-dir=/home/sam/Music/.git","--work-tree=/home/sam/Music","show-ref","--hash","refs/heads/git-annex"]+[2013-08-06 10:59:57 CEST] read: git ["--git-dir=/home/sam/Music/.git","--work-tree=/home/sam/Music","log","refs/heads/git-annex..ba060b7777413ab687d64771b5d6c2b36a072335","--oneline","-n1"]+[2013-08-06 10:59:57 CEST] read: git ["--git-dir=/home/sam/Music/.git","--work-tree=/home/sam/Music","log","refs/heads/git-annex..f401f2b7b67567862df7c5b8d304f52c3af43f4b","--oneline","-n1"]+[2013-08-06 10:59:57 CEST] read: git ["--git-dir=/home/sam/Music/.git","--work-tree=/home/sam/Music","log","refs/heads/git-annex..feaba7c5ea5f4ca73c123e6ea44ffd6333bf383e","--oneline","-n1"]+[2013-08-06 10:59:57 CEST] chat: git ["--git-dir=/home/sam/Music/.git","--work-tree=/home/sam/Music","cat-file","--batch"]+[2013-08-06 10:59:57 CEST] read: git ["--git-dir=/home/sam/Music/.git","--work-tree=/home/sam/Music","ls-files","--stage","-z","--others","--exclude-standard","--","/home/sam/Music"]+[2013-08-06 10:59:57 CEST] chat: git ["--git-dir=/home/sam/Music/.git","--work-tree=/home/sam/Music","cat-file","--batch"]+(Recording state in git...)+[2013-08-06 11:00:16 CEST] feed: xargs ["-0","git","--git-dir=/home/sam/Music/.git","--work-tree=/home/sam/Music","add","-f"]+commit +[2013-08-06 11:00:16 CEST] read: git ["--git-dir=/home/sam/Music/.git","--work-tree=/home/sam/Music","commit","-m","git-annex automatic sync"]+ok+[2013-08-06 11:00:17 CEST] call: git ["--git-dir=/home/sam/Music/.git","--work-tree=/home/sam/Music","show-ref","--verify","-q","refs/heads/synced/master"]+[2013-08-06 11:00:17 CEST] read: git ["--git-dir=/home/sam/Music/.git","--work-tree=/home/sam/Music","log","refs/heads/master..refs/heads/synced/master","--oneline","-n1"]+[2013-08-06 11:00:17 CEST] read: git ["--git-dir=/home/sam/Music/.git","--work-tree=/home/sam/Music","show-ref","git-annex"]+[2013-08-06 11:00:17 CEST] read: git ["--git-dir=/home/sam/Music/.git","--work-tree=/home/sam/Music","show-ref","--hash","refs/heads/git-annex"]+[2013-08-06 11:00:17 CEST] read: git ["--git-dir=/home/sam/Music/.git","--work-tree=/home/sam/Music","log","refs/heads/git-annex..ba060b7777413ab687d64771b5d6c2b36a072335","--oneline","-n1"]+[2013-08-06 11:00:17 CEST] read: git ["--git-dir=/home/sam/Music/.git","--work-tree=/home/sam/Music","log","refs/heads/git-annex..f401f2b7b67567862df7c5b8d304f52c3af43f4b","--oneline","-n1"]+[2013-08-06 11:00:17 CEST] read: git ["--git-dir=/home/sam/Music/.git","--work-tree=/home/sam/Music","log","refs/heads/git-annex..feaba7c5ea5f4ca73c123e6ea44ffd6333bf383e","--oneline","-n1"]+[2013-08-06 11:00:17 CEST] call: git ["--git-dir=/home/sam/Music/.git","--work-tree=/home/sam/Music","branch","-f","synced/master"]+"""]]++[[done]]
@@ -0,0 +1,21 @@+### Please describe the problem.+I didn't spot this bugs page before so here is my report I have commented on android page++In addition to two existing repositories (1 local /sdcard/annex, which is also avail at/storage/sdcard0/annex + 1 remote) I have added one more local (and said to keep it in sync with original local). But it didn't work -- it "Synced with onerussian.com_annex but not with Annex" and claimed that the /external/extSdCard/Annex doesn't exist, although it is there (and with .git generated etc). When I restarted the deamon I got into a "new" Repository: /storage/extSdCard/Annex which also listed the 1st local but with "Failed to sync with localhost" message -- no remote one listed. Whenever I try to "Switch repository" to /sdcard/annex (the original local) -- it starts loading a new page but gets stuck right there. The only way to revive webui is to go back to Dashboard. Log there says (retyping from the screen so typos might be there):++error: cannot run git-receive-pack '/storage/sdcard0/annex': No such file or directory fatal: unable to fork+### What steps will reproduce the problem?+++### What version of git-annex are you using? On what operating system?+android++### Please provide any additional information below.++[[!format sh """+# If you can, paste a complete transcript of the problem occurring here.+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log+++# End of transcript or log.+"""]]
@@ -0,0 +1,57 @@+in a setup where an rsync(+gnupg) remote is shared among different users of the same git-annex repository (ie, the people copying to there use different accounts on the rsync server), acls are not honored under some circumstances.++the error message reads as follows:++ copy …filename… (to prometheus...) Reading passphrase from file descriptor 11 + + sending incremental file list+ rsync: recv_generator: mkdir "/home/shared/photos/encrypted_storage/9a6/0ff" failed: Permission denied (13)+ *** Skipping any contents from this failed directory ***+ 9a6/0ff/+ rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1070) [sender=3.0.8]+ + sent 185 bytes received 18 bytes 135.33 bytes/sec+ total size is 2119419 speedup is 10440.49+ + This could have failed because --fast is enabled.+ failed++the acl used in my particular case is:++ # file: .+ # owner: chrysn+ # group: chrysn+ user::rwx+ group::rwx+ group:family:rwx+ mask::rwx+ other::r-x+ default:user::rwx+ default:group::rwx+ default:group:family:rwx+ default:mask::rwx+ default:other::r-x++sub-directories are observed to have diverging permissions, though:++ # file: 794+ # owner: chrysn+ # group: chrysn+ user::rwx+ group::rwx #effective:r-x+ group:family:rwx #effective:r-x+ mask::r-x+ other::r-x+ default:user::rwx+ default:group::rwx+ default:group:family:rwx+ default:mask::rwx+ default:other::r-x++something seems to apply the umask (default 022) and revoke group write access from the files, overruling the acl. this is not what a umask is normally used for, and smells of [coreutils slavishly observing posix specs that don't consider all features](http://savannah.gnu.org/bugs/?19546) -- the observed effect is exactly what's described there.++the git annex version used is 3.20121017 as in debian, the receiving site uses rsync 3.0.7; the affected directories come from a time when these very versions are known to have been used.++this is probably not a bug of git-annex alone, but affects its operation and might be solvable by invoking rsync differently.++(this is kind of a follow-up on [[forum/__34__permission_denied__34___in_fsck_on_shared_repo]])
@@ -0,0 +1,21 @@+The command `git annex dropunused` currently takes a number, as referenced in output of last `git annex unused` command.++When you want to drop all, or a range, this may be annoying, as you have to specify each number on the command line. ++A range argument, such as `1-1845`, possibly combined with other argument types (Cf. many print dialogues: `1,3,5-7,9`) would be great.++I work around this lack as I want to drop all unused files anyway by something like this:+ + git annex unused | grep -o -P "^ [0-9]+" | xargs git annex dropunused++> It's designed to be used with `seq`. There's an example in the+> [[walkthrough|walkthrough/unused_data]], and of course multiple seq calls can be used to+> specifiy multiple ranges. So:++ git annex dropunused `seq 1 9` `seq 11 1845`++> I don't see adding my own range operations to be an improvement worth+> making; it'd arguably only be a complication. --[[Joey]] [[done]]++>> Actually, this did get implemented, since using seq could fall afoul +>> of command-line length limits in extreme cases.
@@ -0,0 +1,19 @@+I have a need to use git-annex from a larger program. It'd be great if the information output by some of the commands that is descriptive (for example, whereis) could be sent to stdout in a machine-readable format like (preferably) JSON, or XML. That way I can simply read in the output of the command and use the data directly instead of having to parse it via regexes or other such string manipulation.++This could perhaps be triggered by a --json or --xml flag to the relevant commands.++> This is [[done]], --json is supported by all commands, more or less.+> +> Caveats: +> +> * the version, status, and find commands produce custom output and so+> no json. This could change for version and status; find needs to just+> be a simple list of files, I think +> * The "note" fields may repeat multiple times per object with different+> notes and are of course not machine readable, and subject to change.+> * Output of helper commands like rsync is not diverted away, and+> could clutter up the json output badly. Should only affect commands+> that transfer data. And AFAICS, wget and rsync both output their+> progress displays to stderr, so shouldn't be a problem.+> +> --[[Joey]]
@@ -0,0 +1,87 @@+Creating additional branches in history seems to slow down the 'git annex unused' command quadratically, even if the location of the branches should be irrelevant as far as unused data goes.++This was tested on:++ $ git annex version+ git-annex version: 3.20130216+ local repository version: 3+ default repository version: 3+ supported repository versions: 3+ upgrade supported from repository versions: 0 1 2++What steps will reproduce the problem?++ $ mkdir a+ $ cd a+ $ git init+ $ git annex init+ $ i=0 ; while test $i -lt 1000; do dd if=/dev/urandom of=$i.img bs=1M count=1; i=$(($i+1)); done+ $ git annex add .+ $ git commit -m"foo"+ $ git rm 1*+ $ git commit -m"bar"+ $ git log --oneline --decorate+ ffcca3a (HEAD, master) bar+ 3e7793d foo+ $ time -p git annex unused+ unused . (checking for unused data...) (checking master...)+ (...)+ real 0.76+ user 0.40+ sys 0.06+ git commit --allow-empty -m"baz"+ $ git log --oneline --decorate+ 4390c32 (HEAD, master) baz+ ffcca3a bar+ 3e7793d foo+ $ time -p git annex unused+ unused . (checking for unused data...) (checking master...)+ (...)+ real 0.75+ user 0.38+ sys 0.07+ $ git branch boo HEAD^+ $ time -p git annex unused+ unused . (checking for unused data...) (checking boo...) (checking master...)+ (...)+ real 1.29+ user 0.62+ sys 0.08+ arand@mas:~/tmp/more/a(master)$ git branch beeboo HEAD^+ 4390c32 (HEAD, master) baz+ ffcca3a (boo, beeboo) bar+ 3e7793d foo+ arand@mas:~/tmp/more/a(master)$ time -p git annex unused+ unused . (checking for unused data...) (checking beeboo...) (checking master...)+ (...)+ real 2.50+ user 1.12+ sys 0.14+ $ git branch -d boo beeboo+ $ git log --oneline --decorate+ 4390c32 (HEAD, master) baz+ ffcca3a bar+ 3e7793d foo+ $ time -p git annex unused+ unused . (checking for unused data...) (checking master...)+ (...)+ real 0.77+ user 0.42+ sys 0.04++What is the expected output? What do you see instead?++I would expect the time to be the same in all the above cases.++What version of git-annex are you using? On what operating system?++ $ git annex version+ git-annex version: 3.20130216++On current Debian sid/experimental++> [[Done]], thanks to guilhem. We ended up using a different algorythm+> which is faster yet, basically it now does a diff-index between the+> index and each branch for its second stage bloom filter.+> Speedup is 30x with 0 (or 1?) branch, and then massive for each+> additional branch. --[[Joey]]
@@ -0,0 +1,22 @@+### Please describe the problem.+adding an rsync.net repo returns an internal server error "user error (gpg ["--quite","--trust-model","always","--gen-random","--armor","1","512"] exited 127)+++### What steps will reproduce the problem?+add an rsync.net repo+++### What version of git-annex are you using? On what operating system?+4.20130516-g8a26544 for OSX Mountain Lion++### Please provide any additional information below.++[[!format sh """+# If you can, paste a complete transcript of the problem occurring here.+# If the problem is with the git-annex assistant, paste in .git/annex/debug.log+++# End of transcript or log.+"""]]++> [[done]]; the OSX gpg was broken for a while, now fixed. --[[Joey]]
@@ -0,0 +1,26 @@+It appears like addurl --relaxed if used incombination with --file doesn't actually relax.++(I'm interested in quickly adding links to an extremely large set of files (and for a large set of revisions), and the fact that addurl takes a second or so per file makes this impossible performance-wise.)++What steps will reproduce the problem? (Well, this isn't the problem per see, but it illustrates that it does checking)++ $ echo foo > foo+ $ git annex add foo+ $ git annex addurl --relaxed http://lambda.haskell.org/platform/download/2012.4.0.0/haskell-platform-2012.4.0.0.tar.gz --file foo+ addurl foo + failed to verify url: http://lambda.haskell.org/platform/download/2012.4.0.0/haskell-platform-2012.4.0.0.tar.gz+ failed+ git-annex: addurl: 1 failed++What version of git-annex are you using? On what operating system?++Debian Sid++ git-annex version: 4.20130228+ local repository version: 3+ default repository version: 3+ supported repository versions: 3 4+ upgrade supported from repository versions: 0 1 2+ build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP DNS++> Missed the case of adding an url to an existing file. [[done]] --[[Joey]]
@@ -0,0 +1,65 @@+### Please describe the problem.++`addurl` doesn't support the internet archive:++1. it doesn't actually accept the proper URL as a secondary source of content+2. it doesn't parse the HTML from the video page (the "details page")++### What steps will reproduce the problem?++ # download eben moglen's excellent re:publica presentation from youtube+ git annex addurl https://www.youtube.com/watch?v=sKOk4Y4inVY+ # copy that file aside+ cp -L re_publica_2012___Eben_Moglen___Freedom_of_Thought_Requires_Free_Media.webm re_publica_2012___Eben_Moglen___Freedom_of_Thought_Requires_Free_Media.webm-bak+ # drop it so we can try again+ git annex drop re_publica_2012___Eben_Moglen___Freedom_of_Thought_Requires_Free_Media.webm+ # add the IA URL for the same video, failing+ git annex addurl --file=re_publica_2012___Eben_Moglen___Freedom_of_Thought_Requires_Free_Media.webm http://ia601009.us.archive.org/9/items/Republica2012-EbenMoglen-FreedomOfThoughtRequiresFreeMedia/re_publica_2012___Eben_Moglen___Freedom_of_Thought_Requires_Free_Media.webm+ # try again with --relaxed to skip some checks+ git annex addurl --relaxed --file=re_publica_2012___Eben_Moglen___Freedom_of_Thought_Requires_Free_Media.webm http://ia601009.us.archive.org/9/items/Republica2012-EbenMoglen-FreedomOfThoughtRequiresFreeMedia/re_publica_2012___Eben_Moglen___Freedom_of_Thought_Requires_Free_Media.webm+ # observe both files are the same size and checksum++The files should look like this:++[[!format txt """+anarcat@angela:presentations$ ls -alL re_publica_2012___Eben_Moglen___Freedom_of_Thought_Requires_Free_Media.webm*+-r--r--r-- 1 anarcat anarcat 419359123 oct 9 23:41 re_publica_2012___Eben_Moglen___Freedom_of_Thought_Requires_Free_Media.webm+-r--r--r-- 1 anarcat anarcat 419359123 oct 11 19:40 re_publica_2012___Eben_Moglen___Freedom_of_Thought_Requires_Free_Media.webm-bak+anarcat@angela:presentations$ md5sum re_publica_2012___Eben_Moglen___Freedom_of_Thought_Requires_Free_Media.webm*+7892df24a9e1c40e2587be1035728ef0 re_publica_2012___Eben_Moglen___Freedom_of_Thought_Requires_Free_Media.webm+7892df24a9e1c40e2587be1035728ef0 re_publica_2012___Eben_Moglen___Freedom_of_Thought_Requires_Free_Media.webm-bak+"""]]++There are two separate bugs here: one is the above need to use --relaxed even though the file is the same.++The second is probably simply that quvi doesn't support the internet archive, and maybe that one should be moved to a separate [[todo]]/[[wishlist]]. I was expecting this to "do the right thing" (ie. download the video):++ git annex addurl http://archive.org/details/Republica2012-EbenMoglen-FreedomOfThoughtRequiresFreeMedia++... but instead it downloads the HTML.+### What version of git-annex are you using? On what operating system?++my good old faithful `4.20130921-g434dc22` i compiled manually some time ago. :)++This is [[done]] in git-annex version: 4.20131011-g2c0badc. Thanks!++### Please provide any additional information below.++[[!format sh """+anarcat@marcos:presentations$ git annex addurl --file=re_publica_2012___Eben_Moglen___Freedom_of_Thought_Requires_Free_Media.webm http://archive.org/download/Republica2012-EbenMoglen-FreedomOfThoughtRequiresFreeMedia/re_publica_2012___Eben_Moglen___Freedom_of_Thought_Requires_Free_Media.webm+addurl re_publica_2012___Eben_Moglen___Freedom_of_Thought_Requires_Free_Media.webm+ failed to verify url exists: http://archive.org/download/Republica2012-EbenMoglen-FreedomOfThoughtRequiresFreeMedia/re_publica_2012___Eben_Moglen___Freedom_of_Thought_Requires_Free_Media.webm+failed+git-annex: addurl: 1 failed+anarcat@marcos:presentations$ git annex addurl --debug --file=re_publica_2012___Eben_Moglen___Freedom_of_Thought_Requires_Free_Media.webm http://ia601009.us.archive.org/9/items/Republica2012-EbenMoglen-FreedomOfThoughtRequiresFreeMedia/re_publica_2012___Eben_Moglen___Freedom_of_Thought_Requires_Free_Media.webm+[2013-10-09 18:26:30 EDT] call: quvi ["-v","mute","--support","http://ia601009.us.archive.org/9/items/Republica2012-EbenMoglen-FreedomOfThoughtRequiresFreeMedia/re_publica_2012___Eben_Moglen___Freedom_of_Thought_Requires_Free_Media.webm"]+addurl re_publica_2012___Eben_Moglen___Freedom_of_Thought_Requires_Free_Media.webm [2013-10-09 18:26:30 EDT] read: curl ["-s","--head","-L","http://ia601009.us.archive.org/9/items/Republica2012-EbenMoglen-FreedomOfThoughtRequiresFreeMedia/re_publica_2012___Eben_Moglen___Freedom_of_Thought_Requires_Free_Media.webm","-w","%{http_code}"]++ failed to verify url exists: http://ia601009.us.archive.org/9/items/Republica2012-EbenMoglen-FreedomOfThoughtRequiresFreeMedia/re_publica_2012___Eben_Moglen___Freedom_of_Thought_Requires_Free_Media.webm+failed+git-annex: addurl: 1 failed+"""]]++Originally reported in [[tips/Internet_Archive_via_S3]]. --[[anarcat]]++> [[done]] --[[Joey]]
@@ -0,0 +1,24 @@+What steps will reproduce the problem?++Unsure. I believe:++* Add a git remote+* Mark it as dead+* Remove the git remote, re-add with the same name++What is the expected output? What do you see instead?++When I do a `git annex status` I see:++ 04e701b5-8a22-4391-ad74-d75dde715c7b -- bigserver+ 6ddfda5d-0f17-45a9-b41a-2a626a823101 -- bigserver++What version of git-annex are you using? On what operating system?++4.20130323 on OSX and Linux++Please provide any additional information below.++Trying to get a file from bigserver kept on failing with the message "Try making some of these repositories available". Which led me on a wild goose chases blaming SSH keys and PATH issues.++> [[done]]; not a bug --[[Joey]]
@@ -0,0 +1,28 @@+### Please describe the problem.++I installed git-annex on my android device (Nook HD+, with Cyanogenmod 10.1 installed) for the first time today and was excited to get it working. However, I noticed the device warming alarmingly, and, after installing a CPU usage monitor, it became clear that git annex was the problem, as it was hovering around 30-40% even when idle.++I tried quitting git-annex using the webapp's "Shutdown Daemon" menu option, and it seemed to shut down successfully, but the CPU monitor still showed that process present and taking up high amounts of CPU (sometimes well over 50%). I used the android app switcher and noticed that the terminal emulator for git annex was still running; I tried to quit this by using the X button and it seemed to close, but the CPU monitor still showed the git-annex process consuming large amounts of CPU. Finally I had to quit the process forcefully from the monitor.++### What steps will reproduce the problem?++Install & run; observe CPU. I used a dedicated CPU monitor to stop it the first time; another time, I tried stopping it by going to Preferences, Apps, Running Applications, where it told me it had one process and one service running. I stopped the service without issue; it said the process could not be safely stopped but I stopped it anyway and that successfully stopped the app.+++### What version of git-annex are you using? On what operating system?++the current (4.20130826-g46f422) version on Android.++### Please provide any additional information below.++[[!format sh """+# If you can, paste a complete transcript of the problem occurring here.+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log++(I'm not sure how to get a log out of the web app to paste here unfortunately.++# End of transcript or log.+"""]]++> [[done]]; I fixed the bug which turned out to be a stupid+> minunderstanding of how a java library worked. --[[Joey]]
@@ -0,0 +1,41 @@+### Please describe the problem.+The app fails to open after the install++### What steps will reproduce the problem?+Downloaded, installed, chose open.++### What version of git-annex are you using? On what operating system?+today's version. android 4.2.1++### Please provide any additional information below.++I also sent this by email.++Falling back to hardcoded app location; cannot find expected files in /data/app-lib+git annex webapp+u0_a72@android:/sdcard/git-annex.home $ git annex webapp+Launching web browser on http://127.0.0.1:48812/?auth=cf45448c3690730f05f1a9567e62c6a3cf8d25c43ed14362c8ae78601de0e96d32d2b02923ba95962e80c9bd8ffab621918dd582741f18160f6e2565af61aba5+Starting: Intent { act=android.intent.action.VIEW dat=http://127.0.0.1:48812/?auth=cf45448c3690730f05f1a9567e62c6a3cf8d25c43ed14362c8ae78601de0e96d32d2b02923ba95962e80c9bd8ffab621918dd582741f18160f6e2565af61aba5 }+java.lang.SecurityException: Permission Denial: startActivity asks to run as user -2 but is calling from user 0; this requires android.permission.INTERACT_ACROSS_USERS_FULL+ at android.os.Parcel.readException(Parcel.java:1425)+ at android.os.Parcel.readException(Parcel.java:1379)+ at android.app.ActivityManagerProxy.startActivityAsUser(ActivityManagerNative.java:1906)+ at com.android.commands.am.Am.runStart(Am.java:494)+ at com.android.commands.am.Am.run(Am.java:109)+ at com.android.commands.am.Am.main(Am.java:82)+ at com.android.internal.os.RuntimeInit.nativeFinishInit(Native Method)+ at com.android.internal.os.RuntimeInit.main(RuntimeInit.java:235)+ at dalvik.system.NativeStart.main(Native Method)+failed to start web browser++[[!format sh """+# If you can, paste a complete transcript of the problem occurring here.+# If the problem is with the git-annex assistant, paste in .git/annex/debug.log+++# End of transcript or log.+"""]]++This is a duplicate of [[Android_app_permission_denial_on_startup]]++[[closing|done]] as dup. --[[Joey]]
@@ -0,0 +1,16 @@+with rsync, it is sometimes the case that one needs to specify ssh options -- typical examples from the rsync man page are `rsync -e 'ssh -p 2234'`. as git-annex does the shell splitting of the arguments in `annex-rsync-options` (see [[special remotes/rsync]]) itself by looking for whitespace, these options can't be passed directly. (`annex-rsync-options = -e 'ssh -p 2234'` gets split to `["rsync", "-e", "'ssh", "-p", "2234'"]` instead of `["rsync", "-e", "ssh -p 2234"]`).++git-annex should respect shell splitting rules when looking at annex-rsync-options. (i suppose there is a haskell library or module for that; in python, we have the `shlex` module for that).++## workaround++put this in .git/ssh and mark it as executable:++ #!/bin/sh+ exec ssh -p 2234 $@++put this in your git annex config in the particular remote's section:++ annex-rsync-options = -e /local/path/to/your/repo/.git/ssh++(typical bug report information: observed with git-annex 3.20121127 on debian)
@@ -0,0 +1,16 @@+### Please describe the problem.+Using "--numcopies=N" on the command line doesn't overrides (as advertised) the annex.numcopies variable when set via .gitattributes. ++### What steps will reproduce the problem?++$ echo '* annex.numcopies=2' > .gitattributes++$ git annex drop --numcopies=1 somefile.txt++Second line fails if only one other copy exists.++### What version of git-annex are you using? On what operating system?+git-annex version: 4.20130627++> I don't think this was ever handled correctly.+> I've fixed it now. [[done]] --[[Joey]]
@@ -0,0 +1,6 @@+I accidentally annexed some files in the .git-annex directory and it cause git-annex/git to be very unhappy when i pulled the repo to somewhere else. It might be worth teaching git-annex to disallow annex'ing of files inside the .git-annex/.git directories.++> There is a guard against `git annex add .git-annex/foo`, but it doesn't+> notice `cd .git-annex; git annex add foo`. --[[Joey]]++> Now fixed, by removing the .git-annex directory. [[done]] --[[Joey]]
@@ -0,0 +1,68 @@+**What steps will reproduce the problem?**++I did a basic git annex setup with two repositories talking to each other. They are on the same macine, but I identified them via the hostname, because I intend to set up my production systems on two machines. Since I am new to annex, I'll reproduce the full sequence of commands to create the repos and sync them. *I* noticed the trouble at the last step, when `git annex get` failed.++Here is the full sequence of commands:++ >>> cd /scr/wandschn/hackNtest/distributed/nyc/STU_files+ >>> git init+ >>> git annex init nyc+ >>> cd /scr/wandschn/hackNtest/distributed/pdx++ >>> git clone xerxes:/scr/wandschn/hackNtest/distributed/nyc/STU_files+ >>> git annex init pdx+ >>> git remote add nyc xerxes:/scr/wandschn/hackNtest/distributed/nyc/STU_files++ >>> cd /scr/wandschn/hackNtest/distributed/nyc/STU_files+ >>> git remote add pdx xerxes:/scr/wandschn/hackNtest/distributed/pdx/STU_files++ >>> mkdir shared+ >>> cp ../../../files/shared/* shared/.+ >>> git annex add shared+ >>> git commit -a -m "initial add of shared files"++ >>> cd /scr/wandschn/hackNtest/distributed/pdx/STU_files+ >>> git fetch nyc+ >>> git merge nyc/master+ >>> ls shared/135.mae+ shared/135.mae+ >>> git annex whereis shared/135.mae+ whereis shared/135.mae (1 copy)+ 6f0368db-f1b1-4192-9200-3575c16c2ef1 -- origin (nyc)+ ok+ >>> git annex get shared/135.mae+ fatal: Could not switch to '../.git/annex/objects/KV/5f/SHA256-s1499628--4a7e2ba13096ee2d1a6b3c3b314efae623516d200c09d35ff0f695395b6ad47a': No such file or directory++ git-annex: <file descriptor: 4>: hGetLine: end of file+ failed+ git-annex: get: 1 failed++**What is the expected output? What do you see instead?**++I expected the file shared/135.mae to be copied from the remote repo to the local repo. Instead, this command failed, and said that there was a missing file. This file path is the one that the broken link points to, and it exists on the remote repo.++**What version of git-annex are you using? On what operating system?**++git version 1.7.9.6++git-annex 3.20120523++CentOS 6.3 (kernel 2.6.32)++64bit Xeon processor+++**Please provide any additional information below.**++> Thanks for the command sequence, which I have tested here is ok with+> a current version of git-annex (except for one cd you left out..).+> +> You version of git-annex is quite old, and this+> particular bug was fixed in version 3.20120721.+> +> The bug is that it fails to correctly determine the git version at+> compile time, and I think it thinks you have an old version of git+> from before 1.7.7, which changed some behavior of `git check-attr`.+> +> Upgrading git-annex should fix this, please let me know if not. [[done]]+> --[[Joey]]
@@ -0,0 +1,33 @@+### Please describe the problem.+Attempting to populate one annex from another over an SSH connection is very slow.++### What steps will reproduce the problem?+1. Create an annex on Linux+2. Clone annex to Windows system+3. Set up sshd on Linux system, access keys, etc.+4. "git annex get ."+5. Checking if an individual file exists takes a few seconds, and downloading it takes a few seconds. on a 100Mbps LAN, transfers at an average of 7Mbps.+6. By comparison operating over a working HTTP connection transfers between 20~40 Mbps.+++### What version of git-annex are you using? On what operating system?+Windows 7: 4.20140627-g8a36ec5 (from the git-annex download page)++Debian Linux: 3.20120629 (from the package manager)++> The problem is that git-annex is designed to be used with ssh connection+> caching. However, I have not gotten ssh connection caching to work on +> Windows. I did try getting this to work with IIRC, cygwin's ssh, but+> it seems that the Unix sockets it expects to use with `-o ControlMaster`+> don't work, or it's not been ported to use the Windows equivilant.+>+> It's not practical to make git-annex reuse a single ssh connection+> itself, due to the way rsync is run over ssh.+> +> Since this is basically a bug in ssh for Windows, and not in git-annex+> per se, I am going to close this bug report. However, I do mention+> this in [[todo/windows_support]].+> +> [[done]] --[[Joey]]++[[!meta title="No ssh connection caching support on Windows"]]
@@ -0,0 +1,20 @@+Just starting using v3, even more awesome, thanks!++With git-annex, I take the habit to do copies of files without restriction, as they end up into (cheap) symlink copies.+However, if 2 copies are unannexed, only one is restored, the other becomes a broken symlink, so I kind of loose some information +(my use case: I have a repo on which I recently started using annex, but most of the files, which i would want to be annexed, are only in git,+so my plan is to unninit this repo, delete the .git dir, and then annex everything, as I don't mind the history).++Rafaël++> The only way for git-annex to support this in its current state would be+> for the unannex command to copy the file content from the annex, rather+> than moving it out. Then multiple links to the same content could be+> unannexed.+> +> But, this would be slower, and would depend on a later `unused` and+> `dropunused` to actually remove the content. While doable, by use case+> for unannex is more to quickly undo a mistaken add, and it's unlikely there+> are multiple symlinks to the same content in this situation. --[[Joey]] ++[[!tag done]]
@@ -0,0 +1,79 @@+What steps will reproduce the problem?+Just trying to install git-annex last release (20121120) from cabal or from bundled sources++What is the expected output? What do you see instead?+Build stop like this :+(doing cabal install or build from the bundle)+...+[161 of 284] Compiling Assistant.Alert ( Assistant/Alert.hs, dist/build/git-annex/git-annex-tmp/Assistant/Alert.o )+[162 of 284] Compiling Assistant.Types.DaemonStatus ( Assistant/Types/DaemonStatus.hs, dist/build/git-annex/git-annex-tmp/Assistant/Types/DaemonStatus.o )+[163 of 284] Compiling Assistant.Monad ( Assistant/Monad.hs, dist/build/git-annex/git-annex-tmp/Assistant/Monad.o )++Assistant/Monad.hs:86:16:+ Couldn't match expected type `Assistant a'+ with actual type `Reader AssistantData a'+ Expected type: (AssistantData -> a) -> Assistant a+ Actual type: (AssistantData -> a) -> Reader AssistantData a+ In the expression: reader+ In an equation for `getAssistant': getAssistant = reader++Assistant/Monad.hs:93:15:+ Couldn't match expected type `Assistant t0'+ with actual type `Reader r0 a0'+ In the return type of a call of `reader'+ In a stmt of a 'do' block: st <- reader threadState+ In the expression:+ do { st <- reader threadState;+ liftIO $ runThreadState st a }++Assistant/Monad.hs:99:14:+ Couldn't match expected type `Assistant t0'+ with actual type `Reader r0 a0'+ In the return type of a call of `reader'+ In a stmt of a 'do' block: d <- reader id+ In the expression:+ do { d <- reader id;+ liftIO $ io $ runAssistant d a }++Assistant/Monad.hs:105:14:+ Couldn't match expected type `Assistant t0'+ with actual type `Reader r0 a0'+ In the return type of a call of `reader'+ In a stmt of a 'do' block: d <- reader id+ In the expression:+ do { d <- reader id;+ return $ runAssistant d a }++Assistant/Monad.hs:110:14:+ Couldn't match expected type `Assistant t0'+ with actual type `Reader r0 a0'+ In the return type of a call of `reader'+ In a stmt of a 'do' block: d <- reader id+ In the expression:+ do { d <- reader id;+ return $ \ v -> runAssistant d $ a v }++Assistant/Monad.hs:115:14:+ Couldn't match expected type `Assistant t0'+ with actual type `Reader r0 a0'+ In the return type of a call of `reader'+ In a stmt of a 'do' block: d <- reader id+ In the expression:+ do { d <- reader id;+ return $ \ v1 v2 -> runAssistant d (a v1 v2) }++Assistant/Monad.hs:120:12:+ Couldn't match expected type `Assistant a0'+ with actual type `Reader r0 a1'+ In the return type of a call of `reader'+ In the first argument of `(>>=)', namely `reader v'+ In the expression: reader v >>= liftIO . io+++++What version of git-annex are you using? On what operating system?+- version 3.20121112+- Ubuntu 12.04 LTS, 64 bits++> Dup of [[3.20121112_build_fails_on_Ubuntu_12.04]]. --[[Joey]] [[done]]
@@ -0,0 +1,1 @@+In a true dropbox-like fashion, I tried to import my entire homefolder into the git-annex assistant. However, it seems that git-annex breaks on the several git repositories I've got checked out in my "Projects" folder. Is this a possible use case, or should I look at other tools to perform this with?
@@ -0,0 +1,17 @@+##What steps will reproduce the problem?++Follow the [share with a friend walkthrough](http://git-annex.branchable.com/assistant/share_with_a_friend_walkthrough/). I use my Google Talk account to pair with myself. With the assistant running, log in to Google Talk on the web interface and set your status 'Invisible'.++##What is the expected output? What do you see instead?++I expect to remain invisible, but I get the following warning: "Oops! You are not invisible because you're logged into Google Talk from another client, device or location that doesn't support invisibility."++##What version of git-annex are you using? On what operating system?++4.20130314 on Linux.++##Please provide any additional information below.++Syncing between the repositories works ok.++[[!tag /design/assistant]]
@@ -0,0 +1,39 @@+### Please describe the problem.+git-annex assistant always assumes port 22 (I use a different port), despite my editing .ssh/config to correct this.++Also, assistant doesn't give me a port option like it did in the intro screencast.++### What steps will reproduce the problem?+Using my version of git-annex, I assume.++### What version of git-annex are you using? On what operating system?+git-annex version: 3.20121112ubuntu2++xubuntu 13.04++### Please provide any additional information below.+I don't see any .git/annex/daemon.log.++I click the "remote server" link, sign in just fine [note below]. I click "Use a git repository on the server" (but "Use an encrypted rsync repository on the server" also does this), and eventually I get an error:+[[!format sh """+# If you can, paste a complete transcript of the problem occurring here.+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log+Failed to make repository++Something went wrong setting up the repository on the remote server.++Transcript: ssh: connect to host <host> port 22: Connection timed out ++# End of transcript or log.+"""]]++> Your version of git-annex is too old. +> Support for setting the port was added in version 3.20121211 --+> about a month after the version you have installed+> (ah, the period where everything was 11 and 12.. I don't miss it!)+> +> I don't recommend using such an old version of the assistant,+> *massive* numbers of bugs have been fixed since then. Upgrade to +> the Ubuntu PPA. [[done]] --[[Joey]]++note: if I use "git-annex webapp" in the terminal it works fine; if I use xfce's "internet -> git annex" menu, it errors trying to use ssh_askpass, which I don't have. I'm going to make a new thread about this.
@@ -0,0 +1,51 @@+### Please describe the problem.+Tried adding a removable drive repository through git-annex assistant on Mac, asked to encrypt it, got Internal server error with explanation: unable to determine gcrypt-id of remote++### What steps will reproduce the problem?+current (today's) version of git-annex build for Mountain Lion installed+app launched+default annex initialized, a couple file added+a removable 2GB USB drive (ExFAT) mounted in OS+click Add another repository+choose removable drive+choose to encrypt+a window explaining the need to wait for entropy shows+then we get the Internal server error: unable to determine gcrypt-id of remote++### What version of git-annex are you using? On what operating system?+git-annex version 4.20130922-g7dc188a+Mac OS X 10.8.5++### Please provide any additional information below.++looking at transcript below, it appears the root cause is the lack of initial git/gcrypt configuration. perhaps this needs to be caught/addressed somehow++[[!format sh """+# If you can, paste a complete transcript of the problem occurring here.+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log++gpg: can't open `/usr/local/share/gnupg/options.skel': No such file or directory+.......++++++.++++++gpg: key 71BFBC31 marked as ultimately trusted+ok+(Recording state in git...)+(Recording state in git...)+(encryption setup) (hybrid cipher with gpg key C4B2EA8D71BFBC31) gcrypt: Development version -- Repository format MAY CHANGE+gpg: checking the trustdb+gpg: 3 marginal(s) needed, 1 complete(s) needed, PGP trust model+gpg: depth: 0 valid: 1 signed: 0 trust: 0-, 0q, 0n, 0m, 0f, 1u+gcrypt: WARNING: Skipping missing key C4B2EA8D71BFBC31+gcrypt: You have not configured any keys you can encrypt to for this repository+gcrypt: Use ::+gcrypt: git config gcrypt.participants YOURKEYID+gcrypt: Development version -- Repository format MAY CHANGE+gcrypt: WARNING: Skipping missing key C4B2EA8D71BFBC31+gcrypt: You have not configured any keys you can encrypt to for this repository+gcrypt: Use ::+gcrypt: git config gcrypt.participants YOURKEYID+03/Oct/2013:00:05:24 +0400 [Error#yesod-core] unable to determine gcrypt-id of remote @(yesod-core-1.1.8.3:Yesod.Internal.Core ./Yesod/Internal/Core.hs:550:5)+++# End of transcript or log.+"""]]
@@ -0,0 +1,8 @@+The assistant does not allow adding an existing repo: I tried to add a "remote server", to enter the credits, and then I add to choose between "git-annex" or "rsync". Choosing "git-annex" tries to create a new repo and then fails. The repo on the server is a bare one, accessed via gitolite. Setting the remote manually ("git remote add origin git@example.org:my-annex.git" works (I can pull, push, ...))++Mac OS 10.7 version 2013-09-10+++[[!meta title="assistant does not interoperate with gitolite when adding a repository"]]++[2013-09-13 17:00:55 CEST] chat: ssh ["-p","22","git@example.org","sh -c 'mkdir -p '\"'\"'my-annex.git'\"'\"'&&cd '\"'\"'my-annex.git'\"'\"'&&if [ ! -d .git ]; then git init --bare --shared; fi&&git annex init'"]
@@ -0,0 +1,26 @@+What steps will reproduce the problem?++1. create a git annex repo on a server+2. clone it on workstation+3. open the webapp on the workstation+++What is the expected output? What do you see instead?++The webapp should show the 'origin' remote and the assistant should ensure syncing.+Instead the remote does not show up in the webapp.+I checked with `git annex status` and the remote is there.++What version of git-annex are you using? On what operating system?++3.20130207 on latest Ubuntu++Please provide any additional information below.++I tried both with direct and indirect mode for the local annex repo.++I am sorry if I am missing the point. I checked the docs, however without much success.++[[!tag /design/assistant]]++[[done]]
@@ -0,0 +1,46 @@+What steps will reproduce the problem?++Unable to reproduce as it seems to happen randomly, to very few files (4/250).++What is the expected output? What do you see instead?++I expect to see the assistant warn if it attempts to add a file which fails to add to the annex.+Instead, I see no output from the assistant, but lines like this in the log.++daemon.log.2:add Indie Game Stand/Deadly 30/Deadly30_MAC.zip (checksum...) failed+daemon.log.2:add Indie Game Stand/Wyv and Keep/xnafx40_redist.msi (checksum...) failed+daemon.log.2:add Indie Game Stand/Blueberry Garden/Blueberry_Garden_1.1.zip (checksum...) failed+daemon.log.2:add Indie Game Stand/Flatspace Bundle/fsmusicpack3setup.exe (checksum...) failed++There is no reason given for the failure in the log file. The assistant also never tries to add them again in normal running (but did add them when it was started again after a reboot).++What version of git-annex are you using? On what operating system?++git-annex version: 4.20130314+OS: Arch Linux++Please provide any additional information below.++The assistant in this case is being used as nothing more than a way for me to see which files have been added (--verbose, --foreground and --debug with 'watch' outputs nothing..). No remotes or anything like that.++> I have made the assistant re-queue any file that it fails to add,+> so it will retry it later. Typically within a few seconds. [[done]]+> +> I have only been able to think of one scenario in which this could+> happen. It's pretty unusual:+> +> * Something writes to a file, and closes it.+> * Assistant sees file has no writers, and locks it down in preparation+> to add it.+> * Something then re-opens the file to write to it some more.+> Note that it would seem to need to bypass permissions that prevent+> the file from being written to in order to do this. It makes a change+> to the file.+> * Assistant is checksumming file, reaches end, and detects it has been+> tampered with and gives up.+> +> I would still like more information about circumstances that+> cause this to happen, because while a possible scenario, the +> above is too weird to believe anyone could run into it.+> +> --[[Joey]]
@@ -0,0 +1,30 @@+### Please describe the problem.++The assistant seems to only sync files and not directories, so empty directories will not be synced.++### What steps will reproduce the problem?++- Create an empty directory on HostA+- See that nothing gets synced (daemon.log is silent) and the directory doesn't exist on the other HostB+- Create an empty file inside the empty directory on HostA+- See that now HostB has the empty file inside the directory++I'm sure this comes directly from the git behavior but is at least surprising for a direct mode repository using the assistant.++### What version of git-annex are you using? On what operating system?++[[!format sh """+$ git annex version+git-annex version: 4.20130516.1+build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP+local repository version: 4+default repository version: 3+supported repository versions: 3 4+upgrade supported from repository versions: 0 1 2+$ lsb_release -a+No LSB modules are available.+Distributor ID: Ubuntu+Description: Ubuntu 12.04.2 LTS+Release: 12.04+Codename: precise+"""]]
@@ -0,0 +1,45 @@+### Please describe the problem.++The assistant does not sync file permissions so if you set something as executable it won't be set the same on the other repositories.++### What steps will reproduce the problem?++On the first host:++[[!format sh """+$ echo -e '#!/bin/sh\necho "Hello World!"' > testscript+$ chmod ugo+x testscript +$ ./testscript +Hello World!+$ ls -l+total 4+-rwxr-xr-x 1 pedrocr pedrocr 30 May 31 20:00 testscript+"""]]++And on the second host:++[[!format sh """+$ ls -l+total 4+-rw-r--r-- 1 pedrocr pedrocr 30 May 31 20:00 testscript+$ ./testscript+bash: ./testscript: Permission denied+"""]]++### What version of git-annex are you using? On what operating system?++[[!format sh """+$ git annex version+git-annex version: 4.20130516.1+build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP+local repository version: 4+default repository version: 3+supported repository versions: 3 4+upgrade supported from repository versions: 0 1 2+$ lsb_release -a+No LSB modules are available.+Distributor ID: Ubuntu+Description: Ubuntu 12.04.2 LTS+Release: 12.04+Codename: precise+"""]]
@@ -0,0 +1,24 @@+Thanks for git annex!++### Please describe the problem.++I've set up two computers A, B to sync to (and each other through) a remote server S. If I add files to A, it syncs with S. But B is not getting synced unless I run 'git annex sync' or restart the daemon in the webapp, i.e. I don't see these files on B at all, not even as broken symlinks. +The same happens if I manually copy files from A to S. B is not updating the copy count in 'git annex whereis' until I manually sync on B.++It would be great if B could automatically sync when S is changed, either file locations or contents.++### What steps will reproduce the problem?++Both computers' local repos were setup with annex assistant, and switched into indirect mode. The server contains git repo and file data. All systems, computers and server are set to manual in the preferred content mode.++### What version of git-annex are you using? On what operating system?++A is running Debian testing with git-annex 4.20130827, B and S are running Debian stable with the backports version of git-annex 4.20130815~bpo70+1. A and S are 64 bit, B is 32 bit. All are up to date.++### Please provide any additional information below.++I tried this setup before with direct mode and different preferred content settings (A, B as client, S as backup or archive), and syncing of git and file data was working then.++Despite being able to run 'sync' it is at least inconvenient to not have automatically updated file location information when I run the assistant. (I could then just run without it, but I had it happen to me that I setup a local repo w/o assistant, and when I ran assistant, expecting it would tell me "there are no local repos, would you like to create one?" it somehow automatically found the manually created one and started copying files. But that's another problem.)++> [[done]] unless my diagnosis is wrong. --[[Joey]]
@@ -0,0 +1,27 @@+What steps will reproduce the problem?++Use git-annex and add file to repo.+++What is the expected output? What do you see instead?++File is committed and added to annex.++Instead a command like this is run "git --git-dir=/home/jchu/annex/.git --work-tree=/home/jchu/annex commit --allow-empty-message -m --quiet" and for some reason git decides to open a COMMIT_EDITMSG file in my editor of choice "vim .git/COMMIT_EDITMSG". Since git annex doesn't give me access to the terminal, I don't see it.++Depending on when it happens, the web interface could refuse to start (if the commit hang happens on startup) or if it happens during regular operation, then everything looks fine but the web interface doesn't update after that.+++What version of git-annex are you using? On what operating system?++git-annex (binary release) 4.20130405+git 1.8.2.1++On Arch Linux.+++Please provide any additional information below.++I'm not sure if the git interface has changed, but I do see that --allow-empty-message does still exist. If I run the git commit command (with a '' after the -m), it does indeed start up vim for me. Would we benefit from just making a custom commit message ("Commit from date YYYYMMDDTHHMMSSZ")?++> [[fixed|done]] --[[Joey]]
@@ -0,0 +1,31 @@+What steps will reproduce the problem?++1. have an existing directory with a bunch of files+2. create a `.gitignore` file that matches some files (*.log *.aux *~ etc.)+3. `git init .`+4. `git annex init work`+5. `git remote add server server:Blabla`+6. `ssh server`+7. `@server $ mkdir Blabla`+8. `@server $ cd Blabla`+9. `@server $ git init .`+10. `@server $ git annex init server`+11. `@server $ exit`+12. `git annex webapp`++What is the expected output? What do you see instead?++I expect that ingored files stay ignored,+I see instead that all the files (including the ignored) are transfered to the server++What version of git-annex are you using? On what operating system?++3.20130124, debian sid (on both machines)++> As noted in [[design/assistant/inotify]]'s TODO list, this+> needs an efficient gitignore query interface in git (DNE) +> or a gitignore parser. --[[Joey]] ++[[!tag /design/assistant]]++> [[fixed|done]]; with git 1.8.4 the assistant honors .gitignore --[[Joey]]
@@ -0,0 +1,68 @@+What steps will reproduce the problem?++In one terminal, I created a new annex and started the assistant watching it. ++In another, I added a file file1; assistant noticed it and added it to the annex.++I moved file1 to a directory directory1; the link broke and assistant did not fix it. ++I created a file called file2 inside directory 2; assistant noticed it and added it to the annex.++I moved file2 back up to the annex root directory; the link broke and assistant did not fix it.++I created a file file3 in the annex root directory; assistant noticed it and added it to the annex.++Here is the content of the first terminal, where I created the annex and ran assistant:+++ ~$ mkdir testannex+ ~$ cd testannex/+ testannex$ git init .+ Initialized empty Git repository in /Users/ed/testannex/.git/+ testannex$ git annex init "test annex"+ init test annex ok+ (Recording state in git...)+ testannex$ git annex assistant --foreground+ assistant . (scanning...) (started...) add file1 (checksum...) ok+ (Recording state in git...)+ (Recording state in git...)+ add directory1/file2 (checksum...) ok+ (Recording state in git...)+ (Recording state in git...)+ add file3 (checksum...) ++here is the content of the second terminal, where I created and moved files:++ ~$ cd testannex+ testannex$ echo "file1 content" > file1+ testannex$ mkdir directory1+ testannex$ ls -l file1+ lrwxr-xr-x 1 ed staff 180 Dec 13 15:40 file1 -> .git/annex/objects/FX/51/SHA256E-s14--edac79763e630b1b77aefb6c284bcb0362dea71c0548be0e793ffa8fd5907b80/SHA256E-s14--edac79763e630b1b77aefb6c284bcb0362dea71c0548be0e793ffa8fd5907b80+ testannex$ mv file1 directory1/+ testannex$ cd directory1/+ directory1$ cat file1+ cat: file1: No such file or directory+ directory1$ echo "file2 content" > file2+ directory1$ cat file2+ file2 content+ directory1$ cat file1+ cat: file1: No such file or directory+ directory1$ mv file2 ../+ directory1$ cd ..+ testannex$ echo "file3 content" > file3+ testannex$ +++What is the expected output? What do you see instead?++The links do not break when moved to another directory.++What version of git-annex are you using? On what operating system?++One compiled using cabal from checkout 739c937++Please provide any additional information below.++> [[fixed|done]]; this turned out to be an kqueue specific bug,+> the kqueue code statted new files, but that files for a broken symlink.+> Using lstat instead fixed this. --[[Joey]]
@@ -0,0 +1,33 @@+### Please describe the problem.++I migrated a repo I set up by hand on my Android phone to use the assistant and webapp. That repo has two remotes, both full git-annex repos over SSH. I still want to control when I synchronize (cellular data is precious), so the vast majority of the time I disable syncing on both remotes. However, when I return to the webapp after it's been running for "a while," it shows a status message indicating it has synced with the remotes.++It looks like it might be related to the NetWatcherFallback, because a NetWatcherFallback entry appears in the log approximately every hour, followed by the usual repo sync output.++### What steps will reproduce the problem?++1. Set up a repo with a git-annex over SSH remote, and set annex-sync on that remote to false.+2. Run the webapp.+3. Observe after a period of time that the webapp shows that the repo has been synced.++### What version of git-annex are you using? On what operating system?++git-annex 20130709 on Android (4.2)++### Please provide any additional information below.++[[!format sh """+[2013-07-22 22:50:31 MST] NetWatcherFallback: Syncing with sigsegv, sigusr1+Everything up-to-date+Everything up-to-date+[2013-07-22 23:52:57 MST] NetWatcherFallback: Syncing with sigsegv, sigusr1+Everything up-to-date+Everything up-to-date+[2013-07-23 00:54:15 MST] NetWatcherFallback: Syncing with sigsegv, sigusr1+Everything up-to-date+Everything up-to-date+"""]]++> Excellent bug report! Especially useful that you tracked it+> down to the NetWatcher. Indeed it was not honoring the+> annex-sync setting. [[fixed|done]] --[[Joey]]
@@ -0,0 +1,30 @@+### Please describe the problem.++Used assistant to "Add a cloud repository". Supplied hostname, username in webapp. Directory "annex" port 22.+Clicked on "Use this rsync.net repository" and got++**********************+ssh_askpass: exec(/usr/bin/ssh-askpass): No such file or directory+ssh_askpass: exec(/usr/bin/ssh-askpass): No such file or directory+ssh_askpass: exec(/usr/bin/ssh-askpass): No such file or directory+Received disconnect from 69.43.165.7: 2: Too many authentication failures for 2440+**********************++### What steps will reproduce the problem?+See above? A simple "ssh user@host.rsync.net ls /usr/bin" reveals that indeed no ssh-askpass is available in that namespace.++### What version of git-annex are you using? On what operating system?+git-annex version: 4.20130521 on debian linux 7.1.++### Please provide any additional information below.++[[!format sh """+# If you can, paste a complete transcript of the problem occurring here.+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log++That log is empty.+# End of transcript or log.+"""]]++> I added ssh-askpass as a recommends, so I suppose+> I can close this. [[done]] --[[Joey]]
@@ -0,0 +1,72 @@+foo is a local repo, bar is a bare remote.++I upgraded foo's git-annex to 0.20110325 and upgraded a local repo backend+to version 2. I then ran `git annex copy . --to bar` and checked the+remote. This created WORM:SHA512--123123 files in annex/objects.+Understandable but unwanted. So I upgraded git-annex on bar's machine, as+well.++ % git annex copy . --to bar+ copy quux (checking bar) git-annex-shell: Repository version 1 is not supported. Upgrade this repository: git-annex upgrade (to bar)+ git-annex-shell: Repository version 1 is not supported. Upgrade this repository: git-annex upgrade+ rsync: connection unexpectedly closed (0 bytes received so far) [sender]+ rsync error: error in rsync protocol data stream (code 12) at io.c(601) [sender=3.0.7]+ + rsync failed -- run git annex again to resume file transfer+ failed++Running `git annex upgrade` on bar's machine I get:++ % git annex upgrade+ upgrade (v1 to v2) (moving content...) git-annex: Prelude.read: no parse++Again, bar is a bare repo.+Running the copy job again, I am still getting the same error as above (as expected). Partial contents of annex/objects on bar:++ [...]+ SHA512:123+ WORM:SHA512--234+ [...]+++-- RichiH++> Upgrading bare repos to v2 generally works fine, so I actually need+> to see the full content of annex/, not a fragment, in order to debug this.+> (Filename contents I don't need to see.) Feel free to email me the details at+> joey@kitenet.net if you don't want to post them here. --[[Joey]]++>> Sent. -- RichiH++>>> Ok, I'm going to go work on my reading comprehension. I see now+>>> that you+>>> explained the problem pretty well. The problem is caused by these+>>> few weird v1 mixed with v2 keys in the annex.+>>> Ones like "annex/objects/WORM:SHA512--$sha512".+>>>+>>> That's a v1 key, but a corrupt form of the key; it's missing the +>>> size and mtime fields that all WORM keys have in v1. And +>>> the filename is itself a key, a v2 SHA512 key. These were+>>> created when you did the `git annex copy to the v1 bare repo.+>>> In v2, git-annex-shell takes a full key object, while in v1,+>>> it takes a key name and a backend name. This incompatability+>>> leads to the weird behavior seen.+>>>+>>> I had suggested you delete data.. don't. On second thought,+>>> you shouldn't delete anything. I'll simply make the v2 upgrade+>>> detect and work around this bug.+>>> --[[Joey]]++>>>> This should be fixed in current git. The scambled keys will be +>>>> fixed up on upgrade. Thanks for your patience! [[done]] --[[Joey]]++>>>>> I should stop reading your answers via git; by the time I got to+>>>>> "second thoughts", I had already deleted the files & directories+>>>>> in question, upgraded the bare repo and was busy uploading from my+>>>>> local repo. I agree that taking care of this in the upgrade code+>>>>> is the cleanest approach, by the way.+>>>>> No need to thank me for my patience; thank you for your quickness!+>>>>> RichiH+>>>>> +>>>>> PS: If I get a handle on the mtime issue in the SHA backend, git+>>>>> annex will be pretty much perfect :)
@@ -0,0 +1,5 @@+Found this out the hard way. See the comment in the below post for what happens.++[[/forum/git_annex_add_crash_and_subsequent_recovery/]]++> [[fixed|done]] --[[Joey]]
@@ -0,0 +1,22 @@+What steps will reproduce the problem?+I was trying to pair two repositories on 2 different computers, +but my public key had this email address at the end:+bachir@Bachirs-iMac.local++What is the expected output? What do you see instead?+I was expecting successful pairing.+I got:+bad comment in ssh public key ssh-rsa+AAB3....SAK+bachir@Bachirs-iMac.local++What version of git-annex are you using? On what operating system?+I am using the package git-annex Version: 3.20120925 +on MacOSX Lion++Please provide any additional information below.+I've checked your code, seems to complain about the dash '-' in the email address+bachir@Bachirs-iMac.local++> This bug is already fixed, the fix is in the +> 3.20121001 release. [[done]] --[[Joey]]
@@ -0,0 +1,29 @@+It would be nice if git-annex could be used in bare git repos.+However, that is not currently supported. Problems include:++* git-annex often does not read a git repo's config before touching it,+ so it doesn't know if the repo is bare or not+ (reading the config when operating on ssh repos would be a pain and SLOW;+ I had some of that code in as of 1aa19422ac8748eeff219ac4f46df166dae783c5,+ but ripped it all out)+* .. which results in creating `.git/annex` in a bare repo, which mightily+ confuses git (so it will complain that the bare repo is not+ a git repo at all!)+* `.git-annex/` needs to have state recorded to it and committed, and that+ is not possible with a bare repo. (If [[todo/branching]] were done,+ that might be fixed.) (now fixed)++----++Update: Now that git-annex-shell is used for accessing remote repos,+it would be possible to add smarts about bare repos there, and avoid+some of the above problems. Probably only the state recording problem+remains.++A possible other approach to the state recording repo is to not+record state changes on the remote in that case. Git-annex already+records remote state changes locally whenever it modifies the state of a+remote. --[[Joey]]++> And... [[done]]! See [[/bare_repositories]] for current status+> and gotchas. --[[Joey]]
@@ -0,0 +1,63 @@+### Please describe the problem.+Git-annex will constantly sync most(if not all) my files to box.com++### What steps will reproduce the problem?+1 - Use git-annex instead of Dropbox at work+2 - Boot computer.+3 - Watch it sync everything to box.com (even files i believe it has transferred each and every day for the last few months)++### What version of git-annex are you using? On what operating system?+git-annex version: 4.20130827++But i have never seen it work satisfactory in any version.++Also, i have seen this is 10+ different clean git-annexes. So it isn't annex specific. ++### Please provide any additional information below.++I am going to add more debug to this bug constantly. (I intend to do a full 'git annex copy --to box.com --not --in box.com' daily, and see if the same files are transfered again and again)+++For now, i see a few different issues already:+++[[!format sh """+# If you can, paste a complete transcript of the problem occurring here.+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log+++tou@DSK1049:~/work-annex$ git annex copy --to box.com --not --in box.com 2>&1 | tee ../work-annex-copy-to-box.com-not-in-box.com-run1.log+[2013-09-11 09:24:53 CEST] read: git ["--git-dir=/home/tou/work-annex/.git","--work-tree=/home/tou/work-annex","show-ref","git-annex"]+[2013-09-11 09:24:53 CEST] read: git ["--git-dir=/home/tou/work-annex/.git","--work-tree=/home/tou/work-annex","show-ref","--hash","refs/heads/git-annex"]+[2013-09-11 09:24:53 CEST] read: git ["--git-dir=/home/tou/work-annex/.git","--work-tree=/home/tou/work-annex","log","refs/heads/git-annex..dbe8b1cfa5f84126c45a39fdc7c7f26e272c71cc","--oneline","-n1"]+[2013-09-11 09:24:53 CEST] read: git ["--git-dir=/home/tou/work-annex/.git","--work-tree=/home/tou/work-annex","log","refs/heads/git-annex..45e279375897a2cd7f5b893402e0ec25c1b23436","--oneline","-n1"]+[2013-09-11 09:24:54 CEST] read: git ["--git-dir=/home/tou/work-annex/.git","--work-tree=/home/tou/work-annex","log","refs/heads/git-annex..c4921be4434f751493fce1c932ac759214abacd4","--oneline","-n1"]+[2013-09-11 09:24:54 CEST] read: git ["--git-dir=/home/tou/work-annex/.git","--work-tree=/home/tou/work-annex","log","refs/heads/git-annex..d591398dc1cac824a5fc5bdacdcb82301a9b15a3","--oneline","-n1"]+[2013-09-11 09:24:54 CEST] chat: git ["--git-dir=/home/tou/work-annex/.git","--work-tree=/home/tou/work-annex","cat-file","--batch"]+[2013-09-11 09:24:54 CEST] read: git ["config","--null","--list"]+[2013-09-11 09:24:54 CEST] read: git ["--git-dir=/home/tou/work-annex/.git","--work-tree=/home/tou/work-annex","ls-files","--cached","-z","--"]+[2013-09-11 09:24:54 CEST] chat: git ["--git-dir=/home/tou/work-annex/.git","--work-tree=/home/tou/work-annex","cat-file","--batch"]+copy Documents/Gamle catillo overførsler/Rapport b-bm.odt (gpg) (checking box.com...) ok+copy Documents/Gamle catillo overførsler/Rapport brandt skorstensfejeren.odt (checking box.com...) (failed to read https://www.box.com/dav/work-annex/4a5/18e/GPGHMACSHA1--5f8660edac93899cf9adc5fadcc480ddc2992bb1/GPGHMACSHA1--5f8660edac93899cf9adc5fadcc480ddc2992bb1.chunkcount) failed+copy Documents/Gamle catillo overførsler/Rapport teamkoege.odt (checking box.com...) (failed to read https://www.box.com/dav/work-annex/98d/ae7/GPGHMACSHA1--5253241407527aa6c980f1174fdbc32713c54c44/GPGHMACSHA1--5253241407527aa6c980f1174fdbc32713c54c44.chunkcount) failed+copy Documents/Gamle catillo overførsler/Rapport vikarborsen.odt (checking box.com...) ok+copy Documents/Gamle catillo overførsler/Rapport-terrariemesteren.odt (checking box.com...) ok+copy Documents/Gamle catillo overførsler/catillo-efhandel.odt (checking box.com...) (failed to read https://www.box.com/dav/work-annex/9d9/aea/GPGHMACSHA1--1516eac1ec7b4ceaa840faebabde1f50f5db0a52/GPGHMACSHA1--1516eac1ec7b4ceaa840faebabde1f50f5db0a52.chunkcount) failed+copy Documents/Nøgeordsanalyse catillo104.xlsx (checking box.com...) (ResponseTimeout) failed+copy Documents/Søgeordsliste.txt (checking box.com...) ok+copy Documents/catillo guide.odt (checking box.com...) ok+copy Documents/guide bruger oprettelse.odt (checking box.com...) (failed to read https://www.box.com/dav/work-annex/49e/175/GPGHMACSHA1--2b47737f8de7faac7704eaa322785edad63a921c/GPGHMACSHA1--2b47737f8de7faac7704eaa322785edad63a921c.chunkcount) failed+copy Documents/guide skift backup bånd.odt (checking box.com...) ok+copy Documents/lilletest.csv (checking box.com...) (failed to read https://www.box.com/dav/work-annex/915/373/GPGHMACSHA1--49ba3d5f63c012ae2cd2c0fc3e729178b1023c33/GPGHMACSHA1--49ba3d5f63c012ae2cd2c0fc3e729178b1023c33.chunkcount) failed+copy Dropbox/adams-scraper/CommonFunctions.py (checking box.com...) (ResponseTimeout) failed+copy Dropbox/adams-scraper/__pycache__/CommonFunctions.cpython-33.pyc (checking box.com...) (to box.com...) [2013-09-11 09:28:30 CEST] chat: gpg ["--batch","--no-tty","--use-agent","--quiet","--trust-model","always","--batch","--passphrase-fd","14","--symmetric","--force-mdc"]++100% 0.0 B/s 0sResponseTimeout+ResponseTimeout+failed +++# End of transcript or log.+"""]]++More to come(full log)
@@ -0,0 +1,57 @@+### Please describe the problem.++Building from git fails in Assistant/WebApp/Gpg.hs++### What steps will reproduce the problem?++Follow instructions at <http://git-annex.branchable.com/install/cabal/> for building from git:++[[!format sh """+cabal update+PATH=$HOME/bin:$PATH+cabal install c2hs --bindir=$HOME/bin+cabal install --only-dependencies+cabal configure+cabal build+"""]]++### What version of git-annex are you using? On what operating system?++git master (7da58f3ebf8), openSUSE 12.3++### Please provide any additional information below.++[[!format txt """+# If you can, paste a complete transcript of the problem occurring here.+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log++Assistant/WebApp/Configurators/Fsck.hs:69:35:+ Warning: This binding for `u' shadows the existing binding+ bound at Assistant/WebApp/Configurators/Fsck.hs:60:17++Assistant/WebApp/Configurators/Fsck.hs:126:11:+ Warning: This binding for `check' shadows the existing binding+ imported from `Assistant.WebApp.Common' at Assistant/WebApp/Configurators/Fsck.hs:16:1+-30+ (and originally defined in `Yesod.Form.Functions')+[322 of 371] Compiling Assistant.TransferQueue ( Assistant/TransferQueue.hs, dist/build/git-annex/git+-annex-tmp/Assistant/TransferQueue.o )+[323 of 371] Compiling Assistant.Threads.Glacier ( Assistant/Threads/Glacier.hs, dist/build/git-annex+/git-annex-tmp/Assistant/Threads/Glacier.o )+[324 of 371] Compiling Assistant.Threads.Merger ( Assistant/Threads/Merger.hs, dist/build/git-annex/g+it-annex-tmp/Assistant/Threads/Merger.o )+[325 of 371] Compiling Assistant.Threads.Cronner ( Assistant/Threads/Cronner.hs, dist/build/git-annex+/git-annex-tmp/Assistant/Threads/Cronner.o )+[326 of 371] Compiling Assistant.MakeRemote ( Assistant/MakeRemote.hs, dist/build/git-annex/git-annex+-tmp/Assistant/MakeRemote.o )+[327 of 371] Compiling Assistant.WebApp.Gpg ( Assistant/WebApp/Gpg.hs, dist/build/git-annex/git-annex+-tmp/Assistant/WebApp/Gpg.o )++Assistant/WebApp/Gpg.hs:88:40:+ Not in scope: type constructor or class `MonadIO'+ Perhaps you meant `Monad' (imported from Assistant.WebApp.Common)++# End of transcript or log.+"""]]++> [[fixed|done]] --[[Joey]]
@@ -0,0 +1,13 @@+the build is currently borked with++<pre>+ghc -O2 -threaded -Wall -ignore-package monads-fd -ignore-package monads-tf -outputdir tmp -IUtility -DWITH_ASSISTANT -DWITH_S3 -DWITH_WEBAPP -DWITH_PAIRING -DWITH_KQUEUE -DOSX --make git-annex -o tmp/git-annex Utility/libdiskfree.o Utility/libmounts.o Utility/libkqueue.o+Assistant/Install.hs:19:8:+Could not find module `Utility'+Use -v to see a list of the files searched for.+make: *** [git-annex] Error 1+</pre>++This was first introduced at commit e88e3ba++> oops, -DOSX is not a good idea. [[done]] --[[Joey]]
@@ -0,0 +1,43 @@+Building commit 8baff14054e65ecbe801eb66786a55fa5245cb30 yields this...+++<pre>+[164 of 189] Compiling Command.Sync ( Command/Sync.hs, tmp/Command/Sync.o )+Command/Sync.hs:268:34:+Not in scope: `vermarker'+Perhaps you meant `varmarker' (line 267)+make: *** [git-annex] Error 1+</pre>++Supplied fix...++<pre>++From a23a1af99c7a95c316a87f9c6f5f67a6f8ff6937 Mon Sep 17 00:00:00 2001+From: Jimmy Tang <jtang@tchpc.tcd.ie>+Date: Wed, 27 Jun 2012 21:55:22 +0100+Subject: [PATCH 14/14] fix build issue introduced in+ 8baff14054e65ecbe801eb66786a55fa5245cb30++---+ Command/Sync.hs | 2 +-+ 1 file changed, 1 insertion(+), 1 deletion(-)++diff --git a/Command/Sync.hs b/Command/Sync.hs+index b2bf24d..dfaed59 100644+--- a/Command/Sync.hs++++ b/Command/Sync.hs+@@ -265,7 +265,7 @@ mergeFile file key+ | otherwise = go $ shortHash $ show key+ where+ varmarker = ".variant-"+- doubleconflict = vermarker `isSuffixOf` (dropExtension file)++ doubleconflict = varmarker `isSuffixOf` (dropExtension file)+ go v = takeDirectory file+ </> dropExtension (takeFileName file)+ ++ varmarker ++ v+-- +1.7.11.1+</pre>++[[fixed|done]]
@@ -0,0 +1,14 @@+A recent checkout of git-annex fails to build for me (I've installed the new dependancies as well)++<pre>+[70 of 81] Compiling Command.DropUnused ( Command/DropUnused.hs, Command/DropUnused.o )+[71 of 81] Compiling Command.Status ( Command/Status.hs, Command/Status.o )++Command/Status.hs:133:37: Not in scope: `swap'+make: *** [git-annex] Error 1+</pre>++it fails on OSX 10.6.x with ghc 6.12.3 and a corresponding haskell-platform install. I ran a bisect and found that commit 75a3f5027f74565d909fb940893636d081d9872a seems to have broken git-annex for me, reverting the commit allows me to build git-annex, I have not run the tests to verify everything is working correctly though.++> Probably `swap` appeared only in a newer GHC. I've reverted to avoid a+> versioned build dependency. [[done]] --[[Joey]]
@@ -0,0 +1,18 @@+I just squelched a bunch of build issues (to do with dependancies) on my autobuilder for OSX, this is currently happening++<pre>+install -d tmp+ghc -O2 -Wall -outputdir tmp -IUtility -DWITH_ASSISTANT -DWITH_S3 -DWITH_WEBAPP -DWITH_PAIRING -DWITH_XMPP -DWITH_DNS -DWITH_KQUEUE -threaded --make git-annex -o tmp/git-annex Utility/libdiskfree.o Utility/libmounts.o Utility/libkqueue.o++Assistant/Threads/NetWatcher.hs:29:0:+ warning: #warning Building without dbus support; will poll for network connection changes++Assistant/Threads/MountWatcher.hs:36:0:+ warning: #warning Building without dbus support; will use mtab polling+[ 29 of 259] Compiling Utility.OSX ( Utility/OSX.hs, tmp/Utility/OSX.o )++Utility/OSX.hs:22:17: Not in scope: `myHomeDir'+make: *** [git-annex] Error 1+</pre>++> Someone else reported that too; I fixed it. [[done]] --[[Joey]]
@@ -0,0 +1,80 @@+hi,++I am trying to build git annex on lenny.++I checked out the latest from git c88d4939453845efee04da811d64aa41046f9c11,+installed all the packages (some from backports) as required by dpkg-buildpackage++Then I get this:++ ...+ mkdir -p build+ ghc -odir build -hidir build --make git-annex+ [ 1 of 19] Compiling Utility ( Utility.hs, build/Utility.o )+ [ 2 of 19] Compiling GitRepo ( GitRepo.hs, build/GitRepo.o )+ [ 3 of 19] Compiling GitQueue ( GitQueue.hs, build/GitQueue.o )+ [ 4 of 19] Compiling TypeInternals ( TypeInternals.hs, build/TypeInternals.o )+ [ 5 of 19] Compiling Types ( Types.hs, build/Types.o )+ [ 6 of 19] Compiling Annex ( Annex.hs, build/Annex.o )+ [ 7 of 19] Compiling Locations ( Locations.hs, build/Locations.o )+ [ 8 of 19] Compiling UUID ( UUID.hs, build/UUID.o )+ [ 9 of 19] Compiling LocationLog ( LocationLog.hs, build/LocationLog.o )+ [10 of 19] Compiling Core ( Core.hs, build/Core.o )+ [11 of 19] Compiling Backend.URL ( Backend/URL.hs, build/Backend/URL.o )+ [12 of 19] Compiling Backend ( Backend.hs, build/Backend.o )++ Backend.hs:114:50:+ Not in scope: type constructor or class `SomeException'+ make[1]: *** [git-annex] Error 1+ make[1]: Leaving directory `/home/cstamas/tmp/git-annex'+ dh_auto_build: make -j1 returned exit code 2+ make: *** [build] Error 2+ dpkg-buildpackage: failure: debian/rules build gave error exit status 2++I will try to check the mentioned file for error, but I do not know how to program in haskell.++Thanks for your help! --[[cstamas]]++> Newer versions of ghc changed their exception handling types, and+> I coded git-annex to use the new style and not the old. gch6 6.12 will+> work. I do not think there is a backport available though. --[[Joey]]+>+> Ok, found and deployed a workaround. It is not tested. Let me know how it+> works for you. --[[Joey]]++>> I did a git pull and now I get:++ mkdir -p build+ ghc -cpp -odir build -hidir build --make git-annex+ [ 1 of 20] Compiling Portability ( Portability.hs, build/Portability.o )++ Portability.hs:13:21:+ Not in scope: type constructor or class `Exception'+ make[1]: *** [git-annex] Error 1+ make[1]: Leaving directory `/home/cstamas/tmp/git-annex'+ dh_auto_build: make -j1 returned exit code 2+ make: *** [build] Error 2+ dpkg-buildpackage: failure: debian/rules build gave error exit status 2++>> --[[cstamas]]++>>> Ok well, I'm not going to try to reimplement all of+>>> Control.Exception.Extensible so I've made it use it. You will have to+>>> figure out how to install that library yourself though, I don't know+>>> how to use cabal with such an old ghc. Library is here:+>>> <http://hackage.haskell.org/package/extensible-exceptions> +>>> and I asked how to get it on stable here:+>>> <http://ask.debian.net/questions/how-to-get-haskell-extensible-extceptions-on-stable> --[[Joey]] ++>>>> I made some effort with cabal on lenny. I can install (and I did it) cabal+>>>> from squeeze as dependencies are ok. Then I installed extensible+>>>> exceptions, but it places it in some local dir that git-annex's installer+>>>> (or ghc itself) does not know about.+>>>>+>>>> Later I realized that *only* for the compilation ghc6 and its friends are+>>>> needed. So I built the package on my other machine running squeeze. Then+>>>> resulting deb packages cleanly installs on lenny+>>>> +>>>> For me this is OK. Thanks! --[[cstamas]]++[[done]]
@@ -0,0 +1,49 @@+### Please describe the problem.+Attempted to create a bup remote on the current system via ssh. It appears to have created the bup remote fine, but fails when sshing to it and does not add the remote.+This is a normal indirect annex (currently containing a single test jpg in its root)+I'm presuming the error is "(storing uuid...) sh: 1: cd: can't cd to /~/archie" +++### What steps will reproduce the problem?+git annex initremote bup type=bup encryption=none buprepo=sshservername:path++I've tried using .ssh/config to remove the username from the servername passed to bup repo and it still fails.++### What version of git-annex are you using? On what operating system?+[[!format sh """+>git-annex version+git-annex version: 4.20130615-g29d5bb9+build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP DNS+local repository version: 3+default repository version: 3+supported repository versions: 3 4+upgrade supported from repository versions: 0 1 2+"""]]+debian wheezy i686++### Please provide any additional information below.++[[!format sh """+# If you can, paste a complete transcript of the problem occurring here.+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log++> git annex initremote bup type=bup encryption=none buprepo=bup@localhost:archie+initremote bup (bup init...)+Reinitialized existing Git repository in /media/backup/home/archie/.bup/+Initialized empty Git repository in /media/backup/bup/archie/+(storing uuid...) sh: 1: cd: can't cd to /~/archie+git-annex: ssh failed++> ssh bup@localhost+Last login: Mon Jun 17 10:35:45 2013 from localhost+$ ls+archie+$ cd archie+$ ls+branches config description HEAD hooks info objects refs+++# End of transcript or log.+"""]]++> applied patchm, [[done]] --[[Joey]]
@@ -0,0 +1,14 @@+Seems the last few commits have borked 'cabal configure' on OSX with the following error message++<pre>+[jtang@laplace git-annex (master)]$ cabal configure +Resolving dependencies...++Build/InstallDesktopFile.hs:19:8:+ Could not find module `Assistant.OSX'+ Use -v to see a list of the files searched for.+</pre>++Looks like a missing module.++> Was broken everywhere really, so I fixed it. [[done]] --[[Joey]]
@@ -0,0 +1,43 @@+### Please describe the problem.++The git-annex manual page is not installed when using [[install/cabal]] to install git-annex.++### What steps will reproduce the problem?++Follow [[install/cabal]] with `--bin-dir=/usr/local` and try `man git-annex`.++I was expecting the manpage to be installed in `/usr/local/share/man`.++### What version of git-annex are you using? On what operating system?++git annex from a recent git build (4.20130909-g7f079d6) in Debian wheezy.++### Please provide any additional information below.++<del>This could be just a documentation problem...</del> Actually, the manpage can be read directly from the source tree in `doc/git-annex.mdwn`, but I still think it should be installed, for [[!wikipedia POLA]]'s sake. --[[anarcat]]++I figured it out - that stuff is in the makefile, I updated [[install/cabal]] accordingly, so <del>done</del> - not done just yet. --[[anarcat]]++> Doesn't seem right to me; Setup.hs has some stuff to do with+> installing man pages. This does currently require that they +> are distributed in pre-built form in the .tar.gz on hackage, +> which I've just checked and they are.+> +> Perhaps cabal put the man pages somewhere else? After all, you +> apparently did not set --datadir --[[Joey]] ++> > True, I didn't - the docs didn't say to. ;) But really, it's one of two things, either Setup.hs can install manpages, and then the Makefile shouldn't install it, or we should update documentation to use the makefile only. I'll try this again next time I reinstall through cabal i guess... -- [[anarcat]]a++>>> The default location cabal installs man pages to is+>>> `~/.cabal/share/man/man1`. That is insane, but it is not as+>>> insane as not installing programs into PATH, which is why+>>> the documentation tells how to set --bindir to fix that particular+>>> cabal insanity. (Also, many systems don't have a good per-user+>>> man directory anyway.)+>>>+>>> `make install` does not use `cabal install` because as noted, cabal+>>> install is thurougly bat shit crazy. Not all systems that have+>>> cabal have make, which is why the cabal documentation is the way it is.+>>> --[[Joey]]++[[done]]
@@ -0,0 +1,23 @@+### Please describe the problem.+When trying to annex get *from* an annex on a Windows machine, over HTTP, annex get fails with 404 errors.++### What steps will reproduce the problem?+1. Create an annex on a Windows and Linux machine.+2. annex add some content on Windows repository.+3. Configure Windows repository for HTTP access+4. on Linux machine, fetch updates. this succeeds.+5. attempt to "annex get <new files>"+6. requests for files of the format ".git/annex/objects/<3-char-hash>/<3-char-hash>/SHA<filehash>.<extension>" fail with 404 errors. the annex get fails.+++### What version of git-annex are you using? On what operating system?+Windows 7: 4.20140627-g8a36ec5 (from the git-annex download page)++Debian Linux: 3.20120629 (from the package manager)++### Please provide any additional information below.+there is no <filehash>.<extension> file in the relevant directories, there are only .map and .cache files. The Windows annex is in direct mode, and the Linux annex fails to annex get from this correctly.++[[!meta title="can't use a direct mode repository as a http remote"]]++> [[done]]; unsupported configuration. --[[Joey]]
@@ -0,0 +1,32 @@+What steps will reproduce the problem?++I can reproduce it locally:++ % annex -d add Eigene\ Bilder/+ [2013-03-19 15:44:01 CET] read: git ["--git-dir=/Users/fschulze/Bilder/.git","--work-tree=/Users/fschulze/Bilder","ls-files","--others","--exclude-standard","-z","--","Eigene Bilder/"]+ [2013-03-19 15:44:01 CET] read: git ["--git-dir=/Users/fschulze/Bilder/.git","--work-tree=/Users/fschulze/Bilder","diff","--name-only","--diff-filter=T","-z","--","Eigene Bilder/"]+ add Eigene Bilder/20070311/Bild023.jpg [2013-03-19 15:44:01 CET] chat: git ["--git-dir=/Users/fschulze/Bilder/.git","--work-tree=/Users/fschulze/Bilder","check-attr","-z","-- stdin","annex.backend","annex.numcopies","--"]+ (checksum...) [2013-03-19 15:44:01 CET] read: sha512sum ["/Users/fschulze/Bilder/.git/annex/tmp/Bild02366551.jpg"]++git-annex: user error (sha512sum ["/Users/fschulze/Bilder/.git/annex/tmp/Bild02366551.jpg"] exited 127)+failed++What is the expected output? What do you see instead?++The file isn't added.++What version of git-annex are you using? On what operating system?++OS X from dmg++ git-annex version: 4.20130314+ local repository version: 3+ default repository version: 3+ supported repository versions: 3 4+ upgrade supported from repository versions: 0 1 2+ build flags: Assistant Webapp Pairing Testsuite S3 WebDAV FsEvents XMPP DNS++> The OSX app is now changed so that git-annex is a wrapper+> script using runshell. This allows putting `git-annex.app/Contents/MacOS`+> into PATH and using git-annex, and it will find all the libraries and+> utilities bundled with it. [[done]] --[[Joey]]
@@ -0,0 +1,32 @@+I cannot get the assistant to connect to my jabber account, db48x@db48x.net. I get the message stating that it may take a minute, which is never updated. At the very least I would expect some sort of error message.++I get the same symptoms if I connect to an account @gmail.com, but type in the wrong password. If I put in the correct password, it connects quite quickly.++### What version of git-annex are you using? On what operating system?++[[!format txt """+[db48x@celebdil ~]$ git annex version+git-annex version: 4.20130709+build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP DNS+[db48x@celebdil ~]$ uname -a+Linux celebdil 3.9.9-201.fc18.x86_64 #1 SMP Fri Jul 5 16:42:02 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux+"""]]++(Fedora 18)++I get exactly the same behavior on my phone, which is running Android 4.1.2+++### Please provide any additional information below.++[[!format txt """+[db48x@celebdil books]$ cat .git/annex/daemon.log+[2013-07-20 16:21:28 PDT] main: starting assistant version 4.20130709+(scanning...) [2013-07-20 16:21:28 PDT] Watcher: Performing startup scan+(started...) +"""]]++> Closing this bug, since it's not something I can fix in git-annex,+> but would have to be dealt with in the haskell XMPP library. +> Which seems unlikely given John's reply, but you never know --+> and the bug I filed is still open ;) [[done]] --[[Joey]]
@@ -0,0 +1,135 @@+[[!toc]]++### Please describe the problem.++I get this error when trying to copy annexed files from my laptop to the bare repository on my server:++ anarcat@angela:ohm2013$ git annex copy -t origin .+ git-annex: cannot determine uuid for origin++### What steps will reproduce the problem?++Here's my setup:++ * `angela`: regular git repository on my laptop (`angela`) where i ran `git annex init` and `git annex add`ed 4 big files (in `~anarcat/presentations/ohm2013`)+ * `marcos-bare`: a bare git repository where i ran `git annex init` on a different server (`marcos`) (in `~anarcat/repos/presentations/ohm2013.git`)+ * `marcos-checkout`: a checkout of the above repository on marcos (in `~anarcat/presentations/ohm2013`)++I ran `git pull/push` everwhere in there, and still get the error.++Remotes on all repos:++ * `angela`: `origin anarcat.ath.cx:repos/presentations/ohm2013.git`+ * `marcos-bare`: no remote+ * `marcos-checkout`: `origin /home/anarcat/repos/presentations/ohm2013.git`++Note that file added with `git annex addurl` on `marcos-checkout` properly gets propagated on `angela` once i do `git annex get` there.++### What version of git-annex are you using? On what operating system?++`angela` runs:++[[!format txt """+git-annex version: 4.20130730-ge59a8c6+build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP DNS+local repository version: 3+default repository version: 3+supported repository versions: 3 4+upgrade supported from repository versions: 0 1 2+"""]]++I was able to reproduce with the backport version too.++I compiled it by hand from git.++`marcos` runs:++[[!format txt """+git-annex version: 3.20120629+local repository version: unknown+default repository version: 3+supported repository versions: 3+upgrade supported from repository versions: 0 1 2+"""]]++### Please provide any additional information below.++In addition, there's this error on `marcos-bare`:++[[!format sh """+anarcat@marcos:ohm2013.git$ git annex status -d+supported backends: SHA256 SHA1 SHA512 SHA224 SHA384 SHA256E SHA1E SHA512E SHA224E SHA384E WORM URL+supported remote types: git S3 bup directory rsync web hook+trusted repositories: git ["--git-dir=/home/anarcat/repos/presentations/ohm2013.git","show-ref","git-annex"]+git ["--git-dir=/home/anarcat/repos/presentations/ohm2013.git","show-ref","--hash","refs/heads/git-annex"]+git ["--git-dir=/home/anarcat/repos/presentations/ohm2013.git","log","refs/heads/git-annex..6063e958c02259a39b87d0f1dc44c9272c52df3f","--oneline","-n1"]+git ["--git-dir=/home/anarcat/repos/presentations/ohm2013.git","cat-file","--batch"]+0+semitrusted repositories: 4+ 00000000-0000-0000-0000-000000000001 -- web+ 5868f840-02e7-11e3-94e9-9b3701bd28bb -- marcos-checkout+ aafdd242-02e7-11e3-bb6a-6f16a5c6103e -- here (marcos-bare)+ befc3057-d23d-4312-843a-0645e93107d8 -- angela+untrusted repositories: 0+dead repositories: 0+available local disk space: 14 gigabytes (+1 megabyte reserved)+local annex keys: 0+local annex size: 0 bytes+known annex keys: git ["--git-dir=/home/anarcat/repos/presentations/ohm2013.git","ls-files","--cached","-z","--","/home/anarcat/repos/presentations/ohm2013.git"]+fatal: '/home/anarcat/repos/presentations/ohm2013.git' is outside repository+0+known annex size: 0 bytes+bloom filter size: 16 mebibytes (0% full)+backend usage:+"""]]++### Workaround!++I found that I could succesfully push to the non-bare repo, like this:++[[!format txt """+anarcat@angela:ohm2013$ git remote add marcos-checkout ssh://anarcat.ath.cx/~/presentations/ohm2013+anarcat@angela:ohm2013$ git fetch marcos-checkout+From ssh://anarcat.ath.cx/~/presentations/ohm2013+ * [new branch] git-annex -> marcos-checkout/git-annex+ * [new branch] master -> marcos-checkout/master+anarcat@angela:ohm2013$ git annex copy AlerteRouge.webm --to marcos-checkout+copy AlerteRouge.webm (checking marcos-checkout...) (to marcos-checkout...)+SHA256E-s138903105--a69db8d4c3835b03bdb08cb1cccfde5c76f586f934d63283694e7101b25352a8.webm+[...]+"""]]++It seems that git-annex doesn't like bare repos at all...++### Fix++It seems that my problem was specifically related to [[bare repositories]], which are not well supported historically. There has been other reports of problems in the past, which I missed in my search because symptoms were different:++ * [[bugs/bare git repos]]+ * [[forum/get and copy with bare repositories]]++Yet while I was able to do `git annex get --all` *from* the `marcos-bare` repository, I still get the original error message while trying to `git annex copy -t marcos-bare`, which is pretty annoying considering the original files are on my laptop, which is not publicly accessible. So I basically need to add the `marcos-checkout` as a remote, copy there, then get from the bare repo to make this work, which is a rather convoluted way of doing things. :)++It seems to me a proper fix would be to be able to `git annex copy --to marcos-bare`. Thanks!++Update: it seems te problem was that I had the following in my `.git/config`:++ [remote "marcos-bare"]+ url = ssh://anarcat.ath.cx/~/repos/presentations/ohm2013.git+ annex-ignore = true+ fetch = +refs/heads/*:refs/remotes/marcos-bare/*++I have *no* idea how that `annex-ignore` got there, but that was the root of my problem. Removing it it allowed my to do `git annex copy`. I really don't know how this happened, but I guess this is [[done]], although I believe this error message is really confusing and could be improved. --[[anarcat]]++> `annex-ignore` is set automatically by git-annex if it fails to query+> the uuid of a remote the first time it tries to use it. It will say+> when it does that. The assumption+> is that a remote whose uuid cannot be looked up is a git remote+> on a server w/o git-annex support (like github) and it would be annoying+> to constantly be trying and failing to get that uuid.+> +> So, I've improved the error message. Now when annex-ignore is set+> for a remote, the error you got will mention that.+> +> (Also, there is not currently anything lacking in git-annex's support+> for bare repositories.) --[[Joey]]
@@ -0,0 +1,28 @@+### Please describe the problem.+Then starting git-annex on my Galaxy Nexus Android device, in the terminal window I get:++[[!format sh """+Falling back to hardcoded app location: cannot find expected files in /data/app-lib+git annex webapp+u0_a123@maguro:/sdcad/git-annex.home $ git annex webapp+CANNOT LINK EXECUTABLE: git-annex invalid R_ARM_COPY relocation against DT_SYMBOLIC shared library libc.so (built with -Bsymbolic?)+u0_a123@maguro:/sdcad/git-annex.home $ +"""]]++### What steps will reproduce the problem?+Start git-annex.++### What version of git-annex are you using? On what operating system?+Nightly build and release from a few days ago - 1.0.52++### Please provide any additional information below.++[[!format sh """+# If you can, paste a complete transcript of the problem occurring here.+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log+++# End of transcript or log.+"""]]++> [[dup|done]] of [[git-annex_broken_on_Android_4.3]].--[[Joey]]
@@ -0,0 +1,20 @@+What steps will reproduce the problem?++> Building git-annex on the ghc7.0 branch on a Mac with the default case-insensitive file system++What is the expected output? What do you see instead?++> Expected: build successfully; instead: + + ld: duplicate symbol _UtilityziDiskFree_zdwa_info in dist/build/git-annex/git-annex-tmp/Utility/diskfree.o and dist/build/git-annex/git-annex-tmp/Utility/DiskFree.o for architecture x86_64++What version of git-annex are you using? On what operating system?++> commit `0bd5c90ef0518f75d52f0c5889422d8233df847d` on a Mac OS 10.6 and 10.7, using the Haskell Platform 2012.04++Please provide any additional information below.++> The problem is that since `DiskFree.hs` generates `DiskFree.o` and `diskfree.c` generates `diskfree.o`, a case-insensitive file system overwrites one object file with the other. Renaming `diskfree.c` to `diskfreec.c` and changing the corresponding filenames in `git-annex.cabal` fixes the problem.++>> Man, not this again. The 80's called, they want their +>> unix portability wars back. [[fixed|done]]. --[[Joey]]
@@ -0,0 +1,49 @@+I was copying files to a directory remote with `git annex copy`. Out of 114 files, 9 of them failed with no message, just:++ copy data/foo.dat (to usbdrive...) failed+ copy data/bar.dat (to usbdrive...) failed++According to strace:++ 31338 mkdir("/media/annex/Zp/9v/SHA256-s1362999320--d650297c8cf8c2dc0575110a52d0c5cc0ff266f294a0599f85796a6b44b23492", 0777) = -1 ENOENT (No such file or directory)+ 31338 mkdir("/media/annex/Zp/9v", 0777) = -1 ENOENT (No such file or directory)+ 31338 mkdir("/media/annex/Zp", 0777) = -1 EEXIST (File exists)+ 31338 stat("/media/annex/Zp", 0x7f8449f170d0) = -1 ENOENT (No such file or directory)++The filesystem is FAT32 and has weird case semantics. This was mounted by udisks with its default options:++ /dev/sdb1 on /media/annex type vfat (rw,nosuid,nodev,uhelper=udisks,uid=1000,gid=1000,shortname=mixed,dmask=0077,utf8=1,showexec)++I wonder if the directory remote should use hashDirLower instead of hashDirMixed?++> git-annex intentionally uses the same layout for directory and rsync+> special remotes as it does for the .git/annex directory. As far+> as I know it works ok on (truely) case-insensative filesystems.+> +> Based on your strace, if you `ls /media/annex/Zp`, you will see+> "No such file or directory", but if you `mkdir /media/annex/Zp` it will+> fail with "File exists". Doesn't make much sense to me.+> +> The (default) VFAT mount option shortname=mixed causes this behavior.+> With shortname=lower it works ok. --[[Joey]]+> +>> So, the options for fixing this bug seem to be to fix Linux (which would+>> be a good idea IMHO but I don't really want to go there), or generally+>> convert git-annex to using lowercase for its hashing (which would be a+>> large amount of pain to rewrite all the symlinks in every git repo),+>> or some special hack around this problem. +>> +>> I've put in a workaround for the problem in the directory special+>> remote; it will use mixed case but fall-back to lowercase as necessary.+>> +>> That does leave the case of a bare git repository with annexed content+>> stored on VFAT. More special casing could fix it, but that is, I+>> think, an unusual configuration. Leaving the bug open for that case,+>> and for the even more unlikely configuration of a rsync special remote+>> stored on VFAT. --[[Joey]] ++>>> Bare repositories now use lowercase. rsync is the only remaining+>>> unsupported possibility. --[[Joey]]+>>>> Everything now uses lowercase, with the exception of non-bare+>>>> repos, which cannot be on FAT anyway due to using symlinks. [[done]]+>>>> --[[Joey]]
@@ -0,0 +1,92 @@+[[!meta title="arbitrary/configurable backends"]]++(Retitling as this has drifted..)++---++I thought this might be useful, since curl is being used for the URL backend, it might be worth checking for it's existence.++<pre>+diff --git a/configure.hs b/configure.hs+index 772ba54..1a563e0 100644+--- a/configure.hs++++ b/configure.hs+@@ -13,6 +13,7 @@ tests = [+ , TestCase "uuid generator" $ selectCmd "uuid" ["uuid", "uuidgen"]+ , TestCase "xargs -0" $ requireCmd "xargs_0" "xargs -0 </dev/null"+ , TestCase "rsync" $ requireCmd "rsync" "rsync --version >/dev/null"++ , TestCase "curl" $ requireCmd "curl" "curl --version >/dev/null"+ , TestCase "unicode FilePath support" $ unicodeFilePath+ ] ++ shaTestCases [1, 256, 512, 224, 384]+</pre>++> Well, curl is an optional extra, so requireCmd is too strong. Changed+> to testCmd and applied, thank you!+>+> I thought about actually *using* the resulting SysConfig.curl+> to disable the URL backend if False.. but probably it's better+> to just let it fail if curl is not available. Although, if we wanted+> to add a check for wget or something and use it when curl was not+> available, that might be worth doing. --[[Joey]] ++>> I was thinking that is it worth doing a generic "stat", "delete", "get" +>> and "put" options, I do like the idea of having the possibility of +>> being about to use completely arbitrary storage systems or arbitrary +>> transfer systems. If there was the capability of doing so it would be +>> interesting to see possibilities of using aria2 for using something +>> like bittorrent as backend, or using something like irods or some +>> grid storage system as the storage archive. It's just an idea as +>> I have seen it implemented quite well in irods.++>>> I'm unsure about the idea of having a backend where that is+>>> parameterized. It would mean that one annex's GENERIC-foo key+>>> might be entirely different from another's key with the same backend+>>> and details. And a misconfiguration could get data the wrong+>>> way and get the wrong data, etc.+>>>+>>> I mostly look at the URL backend as an example that can be modified to+>>> make this kind of custom backend. You already probably know enough to+>>> make a TORRENT backend where keys are the urls to torrents to download+>>> with `aria2c --follow-torrent=mem`.+>>>+>>> I am also interested in doing backends that use eg, cloud storage.+>>> A S3 backend that could upload files to S3 in addition to downloading+>>> them, for example, would be handy. --[[Joey]]++>>>> So, rather than use backends to do this, it instead made more sense+>>>> to make them [[special_remotes]]. The URL backend remains a bit+>>>> of a special case, and a bittorrent backend that downloaded a file+>>>> from a bittorrent url would still be a good use of backend, but for+>>>> storing files in external data stores like S3, making it a remote+>>>> makes better sense. I think I can close this bug now, [[done]]+>>>> --[[Joey]] ++also in Backend/URL.hs is it worth making a minor change to the way curl is called (I'm not sure if the following is correct or not)++> It's correct, typewise, but I don't see any real reason to bother+> with the change. But I do appreciate patches, which have been rare+> so far, probaby because of Haskell.. :) --[[Joey]] ++>> heh agreed++<pre>+diff --git a/Backend/URL.hs b/Backend/URL.hs+index 29dc8fe..4afcf86 100644+--- a/Backend/URL.hs++++ b/Backend/URL.hs+@@ -50,10 +50,13 @@ dummyFsck _ _ _ = return True+ dummyOk :: Key -> Annex Bool+ dummyOk _ = return True+ ++curl :: [CommandParam] -> IO Bool++curl = boolSystem "curl"+++ downloadUrl :: Key -> FilePath -> Annex Bool+ downloadUrl key file = do+ showNote "downloading"+ showProgress -- make way for curl progress bar+- liftIO $ boolSystem "curl" [Params "-# -o", File file, File url]++ liftIO $ curl [Params "-# -o", File file, File url]+ where+ url = join ":" $ drop 1 $ split ":" $ show key +</pre>
@@ -0,0 +1,23 @@+### Please describe the problem.++When I click on the "back" button in my web browser, I get the following error message:++ git-annex has shut down+ + You can now close this browser window.++### What steps will reproduce the problem?++ 1. git annex webapp+ 2. click on "configuration" (or whatever)+ 3. click on the back button of your web browser++### What version of git-annex are you using? On what operating system?++4.20130815~bpo70+1 on Debian Wheezy, with Chromium Version 29.0.1547.57 Debian 7.1 (217859)++### Please provide any additional information below.++Click "forward" actually brings us back to sanity, and the webapp doesn't actually *crash*. -- [[anarcat]]++> I have applied the page reload fix/hack. [[done]] --[[Joey]]
@@ -0,0 +1,15 @@+What steps will reproduce the problem?+`cat com.branchable.git-annex.assistant`++What version of git-annex are you using? On what operating system?+ git-annex version: 3.20121112 on OS X Mountain Lion++Please provide any additional information below.+The '`RunAtLoad`' key is missing a value.++It should say:++`<key>RunAtLoad</key>`<br>+`<true/>`++> Fixed in git. [[done]] --[[Joey]]
@@ -0,0 +1,228 @@+What steps will reproduce the problem?++ $ git init a.git+ Initialized empty Git repository in /var/tmp/git-annex-bug/a.git/.git/+ $ cd a.git+ $ git annex init a+ init a ok+ (Recording state in git...)+ $ touch Ren$'\351'+ $ git annex add Ren$'\351'+ add René (checksum...) ok+ (Recording state in git...)+ $ git ci -m "Added Rene'."+ [master (root-commit) a61b796] Added Rene'.+ 1 files changed, 1 insertions(+), 0 deletions(-)+ create mode 120000 "Ren\351"+ $ cd ..+ $ git clone -o a a.git b.git+ Cloning into b.git...+ remote: Counting objects: 13, done.+ remote: Compressing objects: 100% (9/9), done.+ remote: Total 13 (delta 1), reused 0 (delta 0)+ Receiving objects: 100% (13/13), done.+ Resolving deltas: 100% (1/1), done.+ $ cd b.git+ $ git annex copy --from=a --fast -v+ (merging a/git-annex into git-annex...)+ copy René + git-annex: /var/tmp/git-annex-bug/b.git/.git/annex/transfer/download/7c5ee764-e8c6-11e1-b0c5-67c6ec1236d6/SHA256-s0--e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855: commitBuffer: invalid argument (invalid character)+ failed+ (Recording state in git...)+ git-annex: copy: 1 failed++What is the expected output? What do you see instead?++Expect that files will be copied, but they are not.++What version of git-annex are you using? On what operating system?++ $ echo $LANG+ en_US.UTF-8+ $ lsb_release -a+ No LSB modules are available.+ Distributor ID: Ubuntu+ Description: Ubuntu 11.10+ Release: 11.10+ Codename: oneiric+ $ uname -a+ Linux pdx-desktop 3.0.0-23-generic #39-Ubuntu SMP Thu Jul 19 19:18:53 UTC 2012 i686 i686 i386 GNU/Linux+ $ bash --version+ GNU bash, version 4.2.10(1)-release (i686-pc-linux-gnu)+ Copyright (C) 2011 Free Software Foundation, Inc.+ License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>++ This is free software; you are free to change and redistribute it.+ There is NO WARRANTY, to the extent permitted by law.+ $ ghc --version+ The Glorious Glasgow Haskell Compilation System, version 7.4.2+ $ git annex version+ git-annex version: 3.20120807+ local repository version: 3+ default repository version: 3+ supported repository versions: 3+ upgrade supported from repository versions: 0 1 2++Please provide any additional information below.++The problem is related to weird characters in file names. In the+above example, the "weird character" is an accented 'e' (entered with+$'\351' in bash and zsh). I am able to add the files with weird+characters in their name to one annex, but I cannot copy them to other+annexes using `git annex copy`.++The above example is a simplification of a real problem I am+experiencing. In my real scenario, the file is not empty. See the+attachment for some variations, including with non-empty+files. UPDATE: I'm not allowed to add attachments. See below.++May be related to these (long-ago fixed) bugs:+http://git-annex.branchable.com/todo/support-non-utf8-locales/+++"Attachment": Here are my notes, including more examples:++ Programs I'm using:++ $ echo $LANG+ en_US.UTF-8+ $ lsb_release -a+ No LSB modules are available.+ Distributor ID: Ubuntu+ Description: Ubuntu 11.10+ Release: 11.10+ Codename: oneiric+ $ uname -a+ Linux pdx-desktop 3.0.0-23-generic #39-Ubuntu SMP Thu Jul 19 19:18:53 UTC 2012 i686 i686 i386 GNU/Linux+ $ bash --version+ GNU bash, version 4.2.10(1)-release (i686-pc-linux-gnu)+ Copyright (C) 2011 Free Software Foundation, Inc.+ License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>++ This is free software; you are free to change and redistribute it.+ There is NO WARRANTY, to the extent permitted by law.+ $ ghc --version+ The Glorious Glasgow Haskell Compilation System, version 7.4.2+ $ git annex version+ git-annex version: 3.20120807+ local repository version: 3+ default repository version: 3+ supported repository versions: 3+ upgrade supported from repository versions: 0 1 2+++ Simplest way to see problem: one empty file with weird character+ (accented e: $'\351') in name:++ $ git init a.git+ Initialized empty Git repository in /var/tmp/git-annex-bug/a.git/.git/+ $ cd a.git+ $ git annex init a+ init a ok+ (Recording state in git...)+ $ touch Ren$'\351'+ $ git annex add Ren$'\351'+ add René (checksum...) ok+ (Recording state in git...)+ $ git ci -m "Added Rene'."+ [master (root-commit) a61b796] Added Rene'.+ 1 files changed, 1 insertions(+), 0 deletions(-)+ create mode 120000 "Ren\351"+ $ cd ..+ $ git clone -o a a.git b.git+ Cloning into b.git...+ remote: Counting objects: 13, done.+ remote: Compressing objects: 100% (9/9), done.+ remote: Total 13 (delta 1), reused 0 (delta 0)+ Receiving objects: 100% (13/13), done.+ Resolving deltas: 100% (1/1), done.+ $ cd b.git+ $ git annex copy --from=a --fast -v+ (merging a/git-annex into git-annex...)+ copy René + git-annex: /var/tmp/git-annex-bug/b.git/.git/annex/transfer/download/7c5ee764-e8c6-11e1-b0c5-67c6ec1236d6/SHA256-s0--e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855: commitBuffer: invalid argument (invalid character)+ failed+ (Recording state in git...)+ git-annex: copy: 1 failed+++ Problem disappears with two empty files:++ $ cd ..+ $ git init a2.git+ Initialized empty Git repository in /var/tmp/git-annex-bug/a2.git/.git/+ $ cd a2.git+ $ git annex init a2+ init a2 ok+ (Recording state in git...)+ $ touch Ren$'\351'+ $ git annex add Ren$'\351'+ add René (checksum...) ok+ (Recording state in git...)+ $ git ci -m "Add Ren$'\351'."+ [master (root-commit) 62ac1c8] Add Ren$'\351'.+ 1 files changed, 1 insertions(+), 0 deletions(-)+ create mode 120000 "Ren\351"+ $ touch Rene+ $ git annex add Rene+ add Rene (checksum...) ok+ (Recording state in git...)+ $ git ci -m "Add Rene."+ [master c455523] Add Rene.+ 1 files changed, 1 insertions(+), 0 deletions(-)+ create mode 120000 Rene+ $ cd ..+ $ git clone -o a2 a2.git b2.git+ Cloning into b2.git...+ done.+ $ cd b2.git+ $ git annex copy --from=a2 --fast -v+ (merging a2/git-annex into git-annex...)+ copy Rene (from a2...) ok+ (Recording state in git...)+++ Problem returns with two non-empty files:++ $ cd ..+ $ git init a4.git+ Initialized empty Git repository in /var/tmp/git-annex-bug/a4.git/.git/+ $ cd a4.git+ $ git annex init a4+ init a4 ok+ (Recording state in git...)+ $ touch Ren$'\351'+ $ rm Ren$'\351'+ $ ls+ $ echo "some content" > Ren$'\351'+ $ git annex add Ren$'\351'+ add René (checksum...) ok+ (Recording state in git...)+ $ git ci -m "Add Ren$'\351'."+ [master (root-commit) f090d90] Add Ren$'\351'.+ 1 files changed, 1 insertions(+), 0 deletions(-)+ create mode 120000 "Ren\351"+ $ echo "some other content" > Rene+ $ git annex add Rene+ add Rene (checksum...) ok+ (Recording state in git...)+ $ git ci -m "Add Rene."+ [master 97c20cd] Add Rene.+ 1 files changed, 1 insertions(+), 0 deletions(-)+ create mode 120000 Rene+ $ cd ..+ $ git clone -o a4 a4.git b4.git+ Cloning into b4.git...+ done.+ $ cd b4.git+ $ git annex copy --from=a4 --fast -v+ (merging a4/git-annex into git-annex...)+ copy Rene (from a4...) ok+ copy René + git-annex: /var/tmp/git-annex-bug/b4.git/.git/annex/transfer/download/a5fcd0d4-e8c8-11e1-bb41-43ce1cb9a9f1/SHA256-s13--1c87b6727f523662df714f06a94ea27fa4d9050c38f4f7712bd4663ffbfdfa01: commitBuffer: invalid argument (invalid character)+ failed+ (Recording state in git...)+ git-annex: copy: 1 failed++> [[Fixed|done]]. Sorry this took so long, I was at a very busy point when+> you filed this and am only just getting caught up. --[[Joey]]
@@ -0,0 +1,8 @@+commit f20a40f breaks on OSX as mntent.h doesn't exist, the closet thing available to what mntent.h provides is getmntinfo(), it looks yet another bunch of ifdef's might be needed to work around OSX. This problem maybe similarly true with FreeBSD, libfam seems to have worked around the issue - <http://oss.sgi.com/projects/fam/download/contrib/freebsd-mntent.patch>++hope the above report helps.++> Thanks, that was a very useful pointer. I couldn't figure out how to+> use Haskell's FFI to loop over the list of statfs structs returned by+> getmntinfo, so I incorporated that C code into a little library, +> and it seems to work ok. [[done]] --[[Joey]]
@@ -0,0 +1,53 @@+When two git-annex processes are running and both modifying the git-annex+branch, it's possible one will fail due to git's locking. When this+happens, git-annex has already recorded its state in the journal (so no+data is lost), but git-annex does crash, which can be surprising.++I feel that, in general, multiple git-annex processes should be able to run+concurrently. A big lock around all commands, or even all+repository-modifying commands is a bad idea. Also, it's probably best to+only worry about locking conflicts editing the git-annex branch. While `git+annex add` and a few other commands make changes to the main git repo,+and can have similar locking issues, so can any git commands that stage+changes (I think.. check).++Probably should KISS. Just add a lock file that is taken before changes to+the git-annex branch, and if it's locked, wait. Changes to the git-annex+branch tend to happen quickly (unless it's committing an enormous set of+changes, and even that is relatively fast), so waiting seems ok. --[[Joey]] ++----++Commit 7981eb4cb512fbe3c49a3dd165c31be14ae4bc49 is more pessimistic, +describes some other potential issues. ++* The journal needs to be emptied (done) and kept locked (not done) during+ a merge, since a merge operates at a level below the journal, and any+ changes that are journaled during a merge can overwrite changes merged+ in from another branch.++* Two git-annex processes can be doing conflicting things and inconsistent+ information be written to the journal.++ - One example would be concurrent get and drop of the same key.+ But could this really race? If the key was already present, the get+ would do nothing, so record no changes. If the key was not yet present,+ the drop would do nothing, and record no changes.++ - Instead, consider two copys of a key to different locations. If the+ slower copy starts first and ends last, it could cache the location + info, add the new location, and lose the other location it was copied to.+ Tested it and the location is not cached during the whole copy (logChange+ reads the current log immediatly before writing), so this+ race's window is very small -- but does exist.++---- ++## Updated plan++Make Branch.change transactional, so it takes a lock, reads a file,+applies a function to it, and writes the changed file.++Make Branch.update hold the same lock.++> [[Done]].
@@ -0,0 +1,7 @@+On one of my ssh remotes I had to install git-annex using cabal. No system-wide installation possible. Hence `git-annex` and `git-annex-shell` are not in the default `$PATH` but in `$HOME/.cabal/bin`.++Right now the command run by git-annex when ssh'ing to a remote is hardcoded to "`git-annex-shell`", which doesn't work for me. It would be nice to be able to change this per remote, for example with an option named `annex.<remote>.annex-shell-command`. Changing "`git-annex-shell`" in `Remote/Helper/Ssh.hs` to "`~/.cabal/bin/git-annex-shell`" worked for me, but it's obviously very ugly :)++Could you do that please? I'll try to hack it myself and send you a patch in the next few days, but I'm pretty new to Haskell so it may take me a while... Thanks!++> [[closing|done]], see comments --[[Joey]]
@@ -0,0 +1,6 @@+On RHEL5 (and clones) systems uuidgen is available as an alternative to+uuid, the configure script fails, it should probably detect either uuid or+uuidgen, or let the user decide? - also uuidgen behaves differently from+uuid on debian.++> uuidgen is now supported. --[[Joey]] [[done]]
@@ -0,0 +1,17 @@+The compilation command should states which packages are used and avoid the default mechnasim that automatically search for them.++This can be done by the flags -hide-packages and then -package foo++> My ghc does not have a `--hide-packages` option.+> +> Could you just show the build problem that you are suggesting I work+> around? --[[Joey]]+++> Thanks npouillard, I see the problem now.+> <http://stackoverflow.com/questions/2048953/control-monad-state-found-in-multiple-packages-haskell>+> +> I've added "-ignore-package monads-fd" to GHCFLAGS. I hope I don't+> really have to hide all packages and individually turn them back on;+> surely this monads-fd/mtl conflict is an exception, and Haskell's module+> system is not a mess of conflicting modules? --[[Joey]] [[done]]
@@ -0,0 +1,30 @@+I've been getting an occasional error from git-annex.++The error is: 'conq: invalid command syntax.'++For example, the last two commands I ran are:++ $ git annex unused+ unused . (checking for unused data...) (checking master...) (checking origin/master...) + Some annexed data is no longer used by any files:+ NUMBER KEY+ 1 SHA256-s.....+ (To see where data was previously used, try: git log --stat -S'KEY')+ + To remove unwanted data: git-annex dropunused NUMBER+ + ok+ + $ git annex dropunused 1+ dropunused 1 conq: invalid command syntax.+ ok++++*OS:* OSX + port installs of the GNU tools++*git-annex-version:* 3.20111211++*git-version:* 1.7.7.4++> [[done]], apparently not a git-annex bug --[[Joey]]
@@ -0,0 +1,38 @@+It seems that git-annex copies every individual file in a separate+transaction. This is quite costly for mass transfers: each file involves a+separate rsync invocation and the creation of a new commit. Even with a+meager thousand files or so in the annex, I have to wait for fifteen+minutes to copy the contents to another disk, simply because every+individual file involves some disk thrashing. Also, it seems suspicious+that the git-annex branch would get a thousands commits of history from the+simple procedure of copying everything to a new repository. Surely it would+be better to first copy everything and then create only a single commit+that registers the changes to the files' availability?++> git-annex is very careful to commit as infrequently as possible,+> and the current version makes *1* commit after all the copies are+> complete, even if it transferred a billion files. The only overhead+> incurred for each file is writing a journal file.+> You must have an old version.+> --[[Joey]]++(I'm also not quite clear on why rsync is being used when both repositories+are local. It seems to be just overhead.)++> Even when copying to another disk it's often on +> some slow bus, and the file is by definition large. So it's+> nice to support resumes of interrupted transfers of files.+> Also because rsync has a handy progress display that is hard to get with cp.+> +> (However, if the copy is to another directory in the same disk, it does+> use cp, and even supports really fast copies on COW filesystems.)+> --[[Joey]]++---++Oneshot mode is now implemented, making git-annex-shell and other+short lifetime processes not bother with committing changes.+[[done]] --[[Joey]] ++Update: Now it makes one commit at the very end of such a mass transfer.+--[[Joey]]
@@ -0,0 +1,6 @@+Conversation moved from [[tips/recover_data_from_lost+found]]+to a proper bug. --[[Joey]]++(Unfortunatly that scrambled the comment creation times and thus order.)++> Added a message [[done]] --[[Joey]]
@@ -0,0 +1,69 @@+### Please describe the problem.+Copying to a gpg encrypted webdav remote (with davfs) seems to work, but fails.+The command "git annex copy --to 1und1 some/file" returns ok, but a fsck fails and running+the copy again copies the file again to the remote.++### What steps will reproduce the problem?+[[!format sh """+git annex copy --to 1und1 some/file # seems ok+git annex copy --to 1und1 some/file # copies again+git annex fsck --from 1und1 some/file # fails+"""]]++### What version of git-annex are you using? On what operating system?+4.20131002 on debian (mostly stable), armel.++### Please provide any additional information below.++I used strace to see what is going on. It seems the chunkcount file is not written. When I create that file by hand fsck is happy.+(git annex seems to have two different locations for that file (dcf/85a and 3W/Qm). The second (3W/Qm) doesn't exist.)++[[!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+copy to webdav (git annex copy --to 1und1 some/file)+output of basically "strace git annex ... | grep media":++9871 stat64("/media/1und1/git-annex/dcf/85a/GPGHMACSHA1--10ff9e1cc8191235670c2fd95375bccf62004f33/GPGHMACSHA1--10ff9e1cc8191235670c2fd95375bccf62004f33.chunkcount", <unfinished ...>+9871 stat64("/media/1und1/git-annex/3W/Qm/GPGHMACSHA1--10ff9e1cc8191235670c2fd95375bccf62004f33/GPGHMACSHA1--10ff9e1cc8191235670c2fd95375bccf62004f33.chunkcount", 0xb65145d0) = -1 ENOENT (No such file or directory)+9871 mkdir("/media/1und1/git-annex/tmp/GPGHMACSHA1--10ff9e1cc8191235670c2fd95375bccf62004f33", 0777 <unfinished ...>+9871 statfs("/media/1und1/git-annex/tmp/GPGHMACSHA1--10ff9e1cc8191235670c2fd95375bccf62004f33/", <unfinished ...>+9871 stat64("/media/1und1/git-annex/tmp/GPGHMACSHA1--10ff9e1cc8191235670c2fd95375bccf62004f33/", {st_mode=S_IFDIR|0755, st_size=0, ...}) = 0+9871 open("/media/1und1/git-annex/tmp/GPGHMACSHA1--10ff9e1cc8191235670c2fd95375bccf62004f33/GPGHMACSHA1--10ff9e1cc8191235670c2fd95375bccf62004f33.chunk1", O_WRONLY|O_CREAT|O_NOCTTY|O_NONBLOCK|O_LARGEFILE, 0666 <unfinished ...>+9871 stat64("/media/1und1/git-annex/dcf/85a/GPGHMACSHA1--10ff9e1cc8191235670c2fd95375bccf62004f33/", <unfinished ...>+9871 chmod("/media/1und1/git-annex/dcf/85a/GPGHMACSHA1--10ff9e1cc8191235670c2fd95375bccf62004f33/", 040755 <unfinished ...>+9871 openat(AT_FDCWD, "/media/1und1/git-annex/dcf/85a/GPGHMACSHA1--10ff9e1cc8191235670c2fd95375bccf62004f33/", O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_DIRECTORY|O_CLOEXEC) = 15+9871 unlink("/media/1und1/git-annex/dcf/85a/GPGHMACSHA1--10ff9e1cc8191235670c2fd95375bccf62004f33/GPGHMACSHA1--10ff9e1cc8191235670c2fd95375bccf62004f33.chunk1" <unfinished ...>+9871 rmdir("/media/1und1/git-annex/dcf/85a/GPGHMACSHA1--10ff9e1cc8191235670c2fd95375bccf62004f33/" <unfinished ...>+9871 mkdir("/media/1und1/git-annex/dcf/85a", 0777) = -1 EEXIST (File exists)+9871 stat64("/media/1und1/git-annex/dcf/85a", {st_mode=S_IFDIR|0755, st_size=64, ...}) = 0+9871 stat64("/media/1und1/git-annex/tmp/GPGHMACSHA1--10ff9e1cc8191235670c2fd95375bccf62004f33/", {st_mode=S_IFDIR|0755, st_size=0, ...}) = 0+9871 rename("/media/1und1/git-annex/tmp/GPGHMACSHA1--10ff9e1cc8191235670c2fd95375bccf62004f33/", "/media/1und1/git-annex/dcf/85a/GPGHMACSHA1--10ff9e1cc8191235670c2fd95375bccf62004f33/" <unfinished ...>+9871 openat(AT_FDCWD, "/media/1und1/git-annex/dcf/85a/GPGHMACSHA1--10ff9e1cc8191235670c2fd95375bccf62004f33/", O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_DIRECTORY|O_CLOEXEC) = 15+9871 stat64("/media/1und1/git-annex/dcf/85a/GPGHMACSHA1--10ff9e1cc8191235670c2fd95375bccf62004f33/GPGHMACSHA1--10ff9e1cc8191235670c2fd95375bccf62004f33.chunk1", {st_mode=S_IFREG|0644, st_size=11705, ...}) = 0+9871 chmod("/media/1und1/git-annex/dcf/85a/GPGHMACSHA1--10ff9e1cc8191235670c2fd95375bccf62004f33/GPGHMACSHA1--10ff9e1cc8191235670c2fd95375bccf62004f33.chunk1", 0100444) = 0+9871 stat64("/media/1und1/git-annex/dcf/85a/GPGHMACSHA1--10ff9e1cc8191235670c2fd95375bccf62004f33/", {st_mode=S_IFDIR|0755, st_size=152, ...}) = 0+9871 chmod("/media/1und1/git-annex/dcf/85a/GPGHMACSHA1--10ff9e1cc8191235670c2fd95375bccf62004f33/", 040555 <unfinished ...>++fsck webdav, but fails (git annex fsck --from 1und1 some/file):++10208 stat64("/media/1und1/git-annex/dcf/85a/GPGHMACSHA1--10ff9e1cc8191235670c2fd95375bccf62004f33/GPGHMACSHA1--10ff9e1cc8191235670c2fd95375bccf62004f33.chunkcount", <unfinished ...>+10208 stat64("/media/1und1/git-annex/3W/Qm/GPGHMACSHA1--10ff9e1cc8191235670c2fd95375bccf62004f33/GPGHMACSHA1--10ff9e1cc8191235670c2fd95375bccf62004f33.chunkcount", 0xb6428160) = -1 ENOENT (No such file or directory)+++manual file creation:+chmod u+w ...+echo -n 1 > /media/1und1/git-annex/dcf/85a/GPGHMACSHA1--10ff9e1cc8191235670c2fd95375bccf62004f33/GPGHMACSHA1--10ff9e1cc8191235670c2fd95375bccf62004f33.chunkcount+chmod u-w ...+++fsck webdav again, now all is fine ("fixing location log"):+10670 stat64("/media/1und1/git-annex/dcf/85a/GPGHMACSHA1--10ff9e1cc8191235670c2fd95375bccf62004f33/GPGHMACSHA1--10ff9e1cc8191235670c2fd95375bccf62004f33.chunkcount", {st_mode=S_IFREG|0444, st_size=1, ...}) = 0+10670 open("/media/1und1/git-annex/dcf/85a/GPGHMACSHA1--10ff9e1cc8191235670c2fd95375bccf62004f33/GPGHMACSHA1--10ff9e1cc8191235670c2fd95375bccf62004f33.chunkcount", O_RDONLY|O_NOCTTY|O_NONBLOCK|O_LARGEFILE) = 14+10670 stat64("/media/1und1/git-annex/dcf/85a/GPGHMACSHA1--10ff9e1cc8191235670c2fd95375bccf62004f33/GPGHMACSHA1--10ff9e1cc8191235670c2fd95375bccf62004f33.chunk1", {st_mode=S_IFREG|0444, st_size=11705, ...}) = 0+10670 stat64("/media/1und1/git-annex/dcf/85a/GPGHMACSHA1--10ff9e1cc8191235670c2fd95375bccf62004f33/GPGHMACSHA1--10ff9e1cc8191235670c2fd95375bccf62004f33.chunkcount", {st_mode=S_IFREG|0444, st_size=1, ...}) = 0+10670 open("/media/1und1/git-annex/dcf/85a/GPGHMACSHA1--10ff9e1cc8191235670c2fd95375bccf62004f33/GPGHMACSHA1--10ff9e1cc8191235670c2fd95375bccf62004f33.chunkcount", O_RDONLY|O_NOCTTY|O_NONBLOCK|O_LARGEFILE) = 14+10670 stat64("/media/1und1/git-annex/dcf/85a/GPGHMACSHA1--10ff9e1cc8191235670c2fd95375bccf62004f33/GPGHMACSHA1--10ff9e1cc8191235670c2fd95375bccf62004f33.chunk1", {st_mode=S_IFREG|0444, st_size=11705, ...}) = 0+10672 open("/media/1und1/git-annex/dcf/85a/GPGHMACSHA1--10ff9e1cc8191235670c2fd95375bccf62004f33/GPGHMACSHA1--10ff9e1cc8191235670c2fd95375bccf62004f33.chunk1", O_RDONLY|O_NOCTTY|O_NONBLOCK|O_LARGEFILE) = 20+# End of transcript or log.+"""]]
@@ -0,0 +1,27 @@+### 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.
@@ -0,0 +1,24 @@+What steps will reproduce the problem?++I was trying to add a remote server repository. Unfortunately, this didn't work. Enter Host name, user name, directory, port+(left most of them at their default), but there is no way, to specify a password.) Clicking check this server failed:++ Failed to ssh to the server. Transcript: Permission denied, please try again. Permission denied, please try again. Permission denied (publickey,password). ++(Problem was, I could never enter a password. Interestingly, on the konsole, I get a prompt for a password, but I can't enter anything there).+++What is the expected output? What do you see instead?++Successfully create a connection and use the remote server.+++What version of git-annex are you using? On what operating system?+Version: 3.20130124++++Please provide any additional information below.++[[!tag /design/assistant done]]+[[!meta title="ssh password prompting issue with assistant"]]
@@ -0,0 +1,3 @@+I just compiled ff7810eb83d8372e6206d487c63482d678e0b3d4 and created a new git-annex repository through the setup steps of "git-annex webapp". Then I tried configuring a Jabber account from the webapp. It then failed to create $REPO/.git/annex/creds/xmpp with a "No such file or directory" message because $REPO/.git/annex/creds did not get created. After doing a manual mkdir the Jabber setup went through fine.++> [[Fixed|done]], thanks. --[[Joey]]
@@ -0,0 +1,36 @@+a little introduction:+i am forced to use windows on my work laptop and workstation, also my wife needs windows.+my "servers" would be linux, i am actually using fedora and i upgraded from fc17 since i was not able to get a recent version of git annex to compile there.++what happens, is that once i try to copy from the windows machine where the file is to the linux through ssh+rsync, i receive this error - as long as the user owning the linux repository isn't root:++ c:\locale>git annex copy --to linux myfile+ copy myfile (checking linux...) (to linux...)+ rsync: failed to open "/linux/annex/tmp/SHA256E-s10--937a89b559820f8658892"+ myfile+ 10 100% 0.00kB/s 0:00:00 (xfer#1, to-check=0/1)+ rsync error: syntax or usage error (code 1) at /home/lapo/package/rsync-3.0.9-1/src/rsyn+ total size is 10 speedup is 0.09+ failed+ git-annex: copy: 1 failed++the file in tmp has no permissions at all:++ me@linux annex]$ ls -lart tmp/SHA256E-s10--937a89b559820f86588921ef3eb12c13074d078b62ef205bb597bf2e895408c3+ ----------. 1 me me 10 Oct 13 22:50 tmp/SHA256Es10--937a89b559820f86588921ef3eb12c13074d078b62ef205bb597bf2e895408c3++(just consider the following if the above makes any sense:) in another case (i cannot reproduce it now, possibly due to having upgraded git annex from some 2012 release), it happened that a failed download via copy/move from linux to windows (failed for permissions) would not be recorded as failed (on windows side), causing files to possibly be killed at the first subsequent drop command.++my question is: are these 0-permissions on tmp files a bug or just due to some ignorance i did put in setting up the git/annex repo ? is a git/annex repo to be run solely as root/sudoer ? or shall i take any other step in configuring it ? ++technicalities:++"client": windows version:++ git-annex version: 4.20131002-gf25991c++"server": linux version:++ git-annex version: 3.20130207++> [[done]]; fixed in newer git-annex versions. --[[Joey]]
@@ -0,0 +1,104 @@+drop's verification that a remote still has content can fail+if the remote is also dropping the content at the same time. Each+repository checks that the other still has the content, and then both+drop it. Could also happen with larger cycles of repositories.++> Confirmed fixed now. All cases tested. [[done]]++---++Fixing this requires locking. (Well, there are other ways, like moving the+content to a holding area when checking if it's safe to drop, but they+seem complicated, and would be hard to implement for move --from.)++Add per-content lock files. An exclusive lock is held on content when+it's in the process of being dropped, or moved. The lock is taken+nonblocking; if it cannot be obtained, something else is acting on the+content and git-annex should refuse to do anything.++Then when checking inannex, try to take a shared lock. Note that to avoid+deadlock, this must be a nonblocking lock. (Actually, with fcntl locking,+can just check if there is a lock, without needing to take one.) +If it fails, the status of the content is unknown, so inannex should fail.+Note that this failure needs to be distinguishable from "not in annex".++> Thinking about these lock files, this would be a lot more files, +> and would possibly break some assumptions that everything in+> `.git/annex/objects` is a key's content. (Or would need lots more+> directories to put the lock files elsewhere.) There would be more+> overhead to manage these and have them on disk.+> +> What if it just locked the actual content file? The obvious limitation+> is only content that was already inannex could be locked, but that+> happens to be exactly what's needed here; if content is not present,+> it's not going to get dropped or moved.+>+> Of course, if some consumer of a file locked it, then it could prevent it+> from being dropped or moved. This could be considered a bug, or a feature. :)+> +> However, this would mean that such a hypothetical consumer could also+> make inannex checks fail.+>+> The other downside is that, for fcntl exclusive locking, the file has to+> be opened for write. Normally the modes of content files are locked down+> to prevent modifcation. Dealt with, but oh so nasty. Almost makes flock+> locking seem worth using.++---++drop --from could also cycle. Locking should fix.++> Confirmed fixed now. ++---++move --to can also be included in the cycle, since it can drop data. ++Consider move to a remote that already has the content and +is at the same time doing a drop (or a move). The remote+verifies the content is present on the movee, and removes its copy.+The movee removes its copy.++So move --to needs to take the content lock on start. Then the inannex+will fail.++This is why it's important for inannex to fail in a way that is+distinguishable from "not in annex". Otherwise, move --to+would see the cycle as the remote not having content, and try to+redundantly send it, drop it locally, and still race.++> Confirmed fixed now.++-- ++move --from is similar. Consider a case where both the local and the remote+are doing a move --from. Both have the content, and confirm the other does,+via inannex checks. Then both run git-annex-shell dropkey, removing both+copies.++So move --from needs to take the content lock on start, so the inannex will+fail. NB: If the content is not locally present, don't take the lock.++> Confirmed fixed now.++---++Another cycle might be running move --to and move --from on the same file,+locally. The exclusivity of the content lock solves this, as only one can+run at a time.++Would it work with a shared lock? The --to would run git-annex-shell+inannex. The --from would also be running, and would run git-annex-shell+dropkey. So inannex and dropkey would end up running on the remote+at the same time. Dropkey takes the content lock, and inannex checks it,+but what if inannex runs first? Then it returns true, and then the content+is removed, so both the --to and --from see success and the --to proceeds+to remove the local content that the --from already caused to be removed+from the remote. So, no, the nasty exclusive lock is needed.++> Confirmed fixed now.++---++Another cycle might involve move --from and drop, both run on the same+file, locally. Again, the exclusive lock solves this.
@@ -0,0 +1,37 @@+I ran the assistant in a subdir in direct mode, and it seemed to move files from other places outside that subdir+into it, and commit them there. These may have been files that needed to be committed, and it just staged them to the wrong place.++I'm pretty sure this does not affect indirect mode.++--[[Joey]]++The relevant commit, in my family's annex is+22e694549d698922389deb017c39c2b40371cdf0 --[[Joey]]++Was able to reproduce this as follows: ++1. Make 2 repositories A and B, with B in direct mode.+2. In A, touch topfile; git annex add topfile; git annex sync+3. In B: mkdir subdir; cd subdir; git annex assistant++Result is a subdir/topfile appearing in B, which is wrong.++<pre>+ subdir/topfile | 1 ++ topfile | 1 -+</pre>++Note that manually doing a git-annex sync in B's subdir does not cause this+to happen. It's specific to the assistant somehow.++--[[Joey]] ++Before 2407170eaf78d9aa38d73d1af68c20da9882779b, git-annex sync in a subdir+had the same problem. That made it always run from the top of the work+tree, which its code actually assumes is the case. ++The assistant, however, does not do that, and it's useful in general to+only run it in a subdir. ++> Made sync merge code handle this correctly. Conflicted merge handing code+> was already ok. [[fixed|done]] --[[Joey]]
@@ -0,0 +1,15 @@+When in direct mode, renaming a file with `git mv` does not update the+direct mode mapping to use the new filename. --[[Joey]]++Consistency checks now prevent anything bad happening when the mapping file+contains old filenames. Still, missing the new filename will prevent that+file working properly in direct mode.++Perhaps the pre-commit hook needs to update the mapping for files that were+deleted or added.++This also affects moves of files when the assistant is being used.+In this case, the assistant updates the mapping to add the new name,+but does not delete the old name from the mapping.++> [[done]]; the pre-commit hook now updates the mappings. --[[Joey]]
@@ -0,0 +1,44 @@+### Please describe the problem.++git-annex attempts to create files with question marks in them on my direct repository on a FAT32 drive. This fails.++### What steps will reproduce the problem?++git annex addurl 'http://rf.proxycast.org/m/media/273073201426.mp3?c=culture&p=La+t%C3%AAte+au+carr%C3%A9_10212&l3=20131002&l4=&media_url=http%3A%2F%2Fmedia.radiofrance-podcast.net%2Fpodcast09%2F10212-02.10.2013-ITEMA_20531825-0.mp3'++### What version of git-annex are you using? On what operating system?++[[!format sh """+$ cat /etc/lsb-release+DISTRIB_ID=Ubuntu+DISTRIB_RELEASE=12.04+DISTRIB_CODENAME=precise+DISTRIB_DESCRIPTION="Ubuntu 12.04.3 LTS"++$ git annex version+git-annex version: 4.20130922-g7dc188a+build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP Feeds Quvi+local repository version: 4+default repository version: 3+supported repository versions: 3 4+upgrade supported from repository versions: 0 1 2+"""]]++### Please provide any additional information below.++[[!format sh """+# If you can, paste a complete transcript of the problem occurring here.+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log++$ git annex addurl 'http://rf.proxycast.org/m/media/273073201426.mp3?c=culture&p=La+t%C3%AAte+au+carr%C3%A9_10212&l3=20131002&l4=&media_url=http%3A%2F%2Fmedia.radiofrance-podcast.net%2Fpodcast09%2F10212-02.10.2013-ITEMA_20531825-0.mp3'+addurl rf.proxycast.org_m_media_273073201426.mp3_c=culture&p=La+t%C3%AAte+au+carr%C3%A9_10212&l3=20131002&l4=&media_url=http%3A%2F%2Fmedia.radiofrance-podcast.net%2Fpodcast09%2F10212-02.10.2013-ITEMA_20531825-0.mp3 (downloading http://rf.proxycast.org/m/media/273073201426.mp3?c=culture&p=La+t%C3%AAte+au+carr%C3%A9_10212&l3=20131002&l4=&media_url=http%3A%2F%2Fmedia.radiofrance-podcast.net%2Fpodcast09%2F10212-02.10.2013-ITEMA_20531825-0.mp3 ...)+/media/sixtyfour/audio/.git/annex/tmp/URL--http&c%%rf.proxycast.org%m%media%273073201426.mp3?c=culture&ap=La+t&sC3&sAAte+au+carr&sC3&sA9_10212&al3=20131002&al4=&amedia_url=http&s3A-86e83c2aaa925b3bc337c1d6a27bd300: Argument invalide++git-annex: /media/sixtyfour/audio/.git/annex/transfer/failed/download/00000000-0000-0000-0000-000000000001/URL--http&c%%rf.proxycast.org%m%media%273073201426.mp3?c=culture&ap=La+t&sC3&sAAte+au+carr&sC3&sA9_10212&al3=20131002&al4=&amedia_url=http&s3A-86e83c2aaa925b3bc337c1d6a27bd300: openFile: invalid argument (Invalid argument)+failed+git-annex: addurl: 1 failed++# End of transcript or log.+"""]]++> [[fixed|done]] --[[Joey]]
@@ -0,0 +1,4 @@+recently fixed [[bugs]]++[[!inline pages="./* and link(./done) and !*/Discussion" sort=mtime show=10+archive=yes]]
@@ -0,0 +1,4 @@+cannot "git annex ../foo" (GitRepo.relative is buggy and+git-ls-files also refuses w/o --full-name, which would need other changes)++[[done]]
@@ -0,0 +1,69 @@+What steps will reproduce the problem?+------------------------------------------------------++I haven't tried doing this again, but here's what I did:++I was copying files to my usb drive (hugex) with probably this command:++ git annex copy --to=hugex .++While doing that, I did something stupid in another window, and filled my local hard drive (the one I was copying from) and git annex spit out some errors about not being able to write to log files (because my local drive was full.)++I suspended (^Z) git annex, made some hard drive space, then resumed (fg).++At first, git annex whereis didn't see the copies of some of the files in hugex (apparently the ones where git annex had trouble writing the local log files). After a "git remote update hugex" and I think a ``git annex merge``, whereis was able to see both copies.++But git drop can't see both copies, and won't let me drop my local copy. I ran ``git annex fsck .`` on the directory with the now files I was copying above, and that didn't seem to change anything (or report errors.)++Here's a terminal session where I'm showing the problem and some hopefully useful text:++ compy compy compy ~/video/tv/keen-eddie> git annex whereis 02-horse-heir.avi + whereis 02-horse-heir.avi (2 copies) + 5bfe091c-ed07-11df-842e-eb791a485889 -- here (compy)+ e15161ec-f1bf-11df-a7b5-eb1f0e6921ee -- hugex+ ok+ compy compy compy ~/video/tv/keen-eddie> git annex drop 02-horse-heir.avi + drop 02-horse-heir.avi (unsafe) + Could only verify the existence of 1 out of 2 necessary copies++ No other repository is known to contain the file.++ (Use --force to override this check, or adjust annex.numcopies.)+ failed+ git-annex: drop: 1 failed+ zsh: exit 1 git annex drop 02-horse-heir.avi+ compy compy compy ~/video/tv/keen-eddie> ls -lh 02-horse-heir.avi + lrwxrwxrwx 1 jasonwoof jasonwoof 149 Nov 15 04:19 02-horse-heir.avi -> ../../../.git/annex/objects/KV/8G/SHA1-s358316330--7fcbf33b711e41def269f042842212d0bf3736a7/SHA1-s358316330--7fcbf33b711e41def269f042842212d0bf3736a7+ compy compy compy ~/video/tv/keen-eddie> ls --dereference -lh 02-horse-heir.avi+ -r--r--r-- 1 jasonwoof jasonwoof 342M Nov 15 04:19 02-horse-heir.avi+ compy compy compy ~/video/tv/keen-eddie> ls -lh ../../../.git/annex/objects/KV/8G/SHA1-s358316330--7fcbf33b711e41def269f042842212d0bf3736a7/SHA1-s358316330--7fcbf33b711e41def269f042842212d0bf3736a7+ -r--r--r-- 1 jasonwoof jasonwoof 342M Nov 15 04:19 ../../../.git/annex/objects/KV/8G/SHA1-s358316330--7fcbf33b711e41def269f042842212d0bf3736a7/SHA1-s358316330--7fcbf33b711e41def269f042842212d0bf3736a7+ compy compy compy ~/video/tv/keen-eddie> ls -lh /media/hugex/jason/home.git/annex/objects/5bd/6a1/SHA1-s358316330--7fcbf33b711e41def269f042842212d0bf3736a7/SHA1-s358316330--7fcbf33b711e41def269f042842212d0bf3736a7+ -r--r--r-- 1 jasonwoof jasonwoof 342M Jan 7 16:27 /media/hugex/jason/home.git/annex/objects/5bd/6a1/SHA1-s358316330--7fcbf33b711e41def269f042842212d0bf3736a7/SHA1-s358316330--7fcbf33b711e41def269f042842212d0bf3736a7++That last command is showing that the file is indeed in hugex's annex/objects+++Oh, and another wrinkle. hugex is a bare repo. I tried to fsck hugex's video/tv directory, but it said that directory doesn't exist (I assume because there's no working copy.)+++What is the expected output? What do you see instead?+------------------------------------------------------------------------------++I'd like ``git annex drop`` to have the same kind of confidence in the copies of these files on hugex.++How can I resolve this. I tried ``git annex copy --to=hugex .`` again, but that command knows that these files are already copied to hugex.++What version of git-annex are you using? On what operating system?++3.20130102 on debian unstable (thanks for packaging!)++Please provide any additional information below.+------------------------------------------------------------------++You can also reach me at ``jason@jasonwoof.com``++> [[done]]; the confusing message has been improved.+> +> BTW, you can use `git annex move` to ensure a file is on another repo and+> drop it locally. --[[Joey]]
@@ -0,0 +1,139 @@+In experimenting with the web remote, I found that dropping a URL gave an error, but still succeeded, while re-adding the same URL fails to work correctly.++#What steps will reproduce the problem?++<pre>+/tmp $ dd if=/dev/zero of=/tmp/file.bin count=1024+1024+0 records in+1024+0 records out+524288 bytes (524 kB) copied, 0.0135652 s, 38.6 MB/s+/tmp $ mkdir /tmp/repo+/tmp $ cd /tmp/repo+/tmp/repo $ git init+Initialized empty Git repository in /tmp/repo/.git/+/tmp/repo $ git annex init "test"+init test ok+(Recording state in git...)+/tmp/repo $ git annex addurl file:///tmp/file.bin --file annexed.bin+######################################################################## 100.0%+(checksum...) ok+(Recording state in git...)+/tmp/repo $ git annex drop annexed.bin +drop annexed.bin (checking file:///tmp/file.bin...) ok+(Recording state in git...)+/tmp/repo $ mv /tmp/file.bin /tmp/file2.bin +/tmp/repo $ git annex get annexed.bin +get annexed.bin (from web...) +curl: (37) Couldn't open file /tmp/file.bin++ Unable to access these remotes: web++ Try making some of these repositories available:+ 00000000-0000-0000-0000-000000000001 -- web+failed+git-annex: get: 1 failed+/tmp/repo $ git annex drop --from web annexed.bin --force+drop web annexed.bin+ removal from web not supported+failed+(Recording state in git...)+git-annex: drop: 1 failed+/tmp/repo $ git annex get annexed.bin +get annexed.bin (not available) + No other repository is known to contain the file.+failed+git-annex: get: 1 failed+/tmp/repo $ mv /tmp/file2.bin /tmp/file.bin +/tmp/repo $ git annex addurl file:///tmp/file.bin --file annexed.bin+addurl annexed.bin ok+/tmp/repo $ git annex whereis annexed.bin+whereis annexed.bin (0 copies) failed+git-annex: whereis: 1 failed+/tmp/repo $ git annex addurl file:///tmp/file.bin --file annexed2.bin+######################################################################## 100.0%+(checksum...) ok+(Recording state in git...)+/tmp/repo $ git annex whereis annexed.bin+whereis annexed.bin (1 copy)+ e2418e81-ec04-4091-aabe-ed75d65f93fa -- here (test)+ok+/tmp/repo $ git annex whereis annexed2.bin+whereis annexed2.bin (1 copy)+ e2418e81-ec04-4091-aabe-ed75d65f93fa -- here (test)+ok+/tmp/repo $ git annex drop annexed.bin+drop annexed.bin (unsafe)+ Could only verify the existence of 0 out of 1 necessary copies++ No other repository is known to contain the file.++ (Use --force to override this check, or adjust annex.numcopies.)+failed+git-annex: drop: 1 failed+/tmp/repo $ git annex drop annexed2.bin+drop annexed2.bin (unsafe)+ Could only verify the existence of 0 out of 1 necessary copies++ No other repository is known to contain the file.++ (Use --force to override this check, or adjust annex.numcopies.)+failed+git-annex: drop: 1 failed+/tmp/repo $ mv /tmp/file.bin /tmp/file2.bin +/tmp/repo $ git annex addurl file:///tmp/file2.bin --file annexed.bin+addurl annexed.bin ok+(Recording state in git...)+/tmp/repo $ git annex whereis annexed2.bin +whereis annexed2.bin (2 copies) + 00000000-0000-0000-0000-000000000001 -- web+ e2418e81-ec04-4091-aabe-ed75d65f93fa -- here (test)++ web: file:///tmp/file.bin+ web: file:///tmp/file2.bin+ok+/tmp/repo $ mv /tmp/file2.bin /tmp/file.bin +/tmp/repo $ git annex drop annexed.bin +drop annexed.bin (checking file:///tmp/file.bin...) ok+(Recording state in git...)+/tmp/repo $ git annex get annexed.bin +get annexed.bin (from web...) +######################################################################## 100.0%+ok+(Recording state in git...)+/tmp/repo $ git annex drop annexed.bin +drop annexed.bin (checking file:///tmp/file.bin...) ok+(Recording state in git...)+/tmp/repo $ mv /tmp/file.bin /tmp/file2.bin +/tmp/repo $ git annex get annexed.bin +get annexed.bin (from web...) +curl: (37) Couldn't open file /tmp/file.bin+######################################################################## 100.0%+ok+(Recording state in git...)+</pre>++#What is the expected output? What do you see inst+++When dropping one file and I see "git-annex: drop: 1 failed" I would expect the file to still be in the remote as far as git-annex is concerned.++When re-adding the URL, I expect the file to be re-added to the web remote. (note that it re-appears after adding the same file via a different URL)+++#What version of git-annex are you using? On what operating system?+++3.20121112 on Gentoo Linux+++#Please provide any additional information below.++This seems to be a corner case, and would probably have minimal impact on most people.++> Yeah, dropping from the web is pretty weird.+> +> I guess it makes sense to do if a website stops having a file and you don't+> want git-annex to try to download from it anymore. So, I've made dropping+> from the web remove all urls associated with the file, rather than failing.+> +> [[done]] --[[Joey]]
@@ -0,0 +1,13 @@+I was trying out the example with the walkthrough using_the_URL_backend. I tried dropping files that I had after doing an "git annex get ." which have the URL backend associated with the files it fails with+++<pre>+[jtang@lenny gc]$ git annex drop -v curl-7.21.4.tar.gz+drop curl-7.21.4.tar.gz+failed+git-annex: 1 failed+</pre>++At first I thought it was just my OSX machine not having the coreutils stuff load up before the BSD utils, but I then tried the same thing on my archlinux machine and it showed the same behaviour, that is I could not drop a file with the URL backend as shown in the walkthrough.++> Whoops, got some logic backwards. [[fixed|done]]! --[[Joey]]
@@ -0,0 +1,87 @@+Unused files with double spaces in their name are not removed by `dropunused`:++Script:++ #!/bin/bash+ + BASE=/tmp/unused-bug+ + # setup+ set -x+ chmod -R +w $BASE+ rm -rf $BASE+ mkdir -p $BASE+ cd $BASE+ + # create annex+ git init .+ git annex init+ + # make a file with two spaces+ echo hello > 'foo bar'+ + # add it+ git annex add --backend WORM 'foo bar'+ git commit -m 'add'+ + # remove it+ git rm 'foo bar'+ git commit -m 'remove'+ + # unused+ git annex unused+ git annex dropunused 1+ git annex unused++Output:++ + chmod -R +w /tmp/unused-bug+ + rm -rf /tmp/unused-bug+ + mkdir -p /tmp/unused-bug+ + cd /tmp/unused-bug+ + git init .+ Initialized empty Git repository in /tmp/unused-bug/.git/+ + git annex init+ init ok+ + echo hello+ + git annex add --backend WORM 'foo bar'+ add foo bar ok+ (Recording state in git...)+ + git commit -m add+ [master (root-commit) 926f7f5] add+ 1 files changed, 1 insertions(+), 0 deletions(-)+ create mode 120000 foo bar+ + git rm 'foo bar'+ rm 'foo bar'+ + git commit -m remove+ [master d025e3f] remove+ 1 files changed, 0 insertions(+), 1 deletions(-)+ delete mode 120000 foo bar+ + git annex unused+ unused . (checking for unused data...) (checking master...) + Some annexed data is no longer used by any files:+ NUMBER KEY+ 1 WORM-s6-m1322200438--foo bar+ (To see where data was previously used, try: git log --stat -S'KEY')+ + To remove unwanted data: git-annex dropunused NUMBER+ + ok+ + git annex dropunused 1+ dropunused 1 ok+ + git annex unused+ unused . (checking for unused data...) (checking master...) + Some annexed data is no longer used by any files:+ NUMBER KEY+ 1 WORM-s6-m1322200438--foo bar+ (To see where data was previously used, try: git log --stat -S'KEY')+ + To remove unwanted data: git-annex dropunused NUMBER+ + ok++Strange that `dropunused` still said "ok" when it didn't succeed at removing the file.++> It was misparsing the unused file, so it thought you'd asked it to drop a+> key that didn't exist (which means already dropped) so no error. I've+> fixed the bug. [[done]] --[[Joey]]
@@ -0,0 +1,70 @@+What steps will reproduce the problem?++I am unable to create a minimal setup to reproduce this unfortunately. But my case is the following:++* Two synced repos, I have switched between direct and indirect in both, currently they are indirect+* I have two submodules in the repos (not related to the unuesd files)++* I used "git rm -r" to remove a bunch of files along with "git mv" to move some+* I have three commits of actions like this++* In one repo, the one where I did the deletions, I have 172 unused files, and all seem to come from the first of the three commits+* In the second repo, to which I synced, I have 188 unused files, which includes a couple of files from the third commit as well++* If I try to dropunused either a single file or the whole range of the files, from either repo, I get git-annex telling me "ok, recording state" but when I run unused again the files are still there. And looking into .git/objects/annex/ the file is still present++This is the debug from the drop command:++ dropunused 9 [2013-02-07 12:47:24 CET] read: git ["--git-dir=/home/arand/.git","--work-tree=/home/arand","show-ref","git-annex"]+ [2013-02-07 12:47:24 CET] read: git ["--git-dir=/home/arand/.git","--work-tree=/home/arand","show-ref","--hash","refs/heads/git-annex"]+ [2013-02-07 12:47:24 CET] read: git ["--git-dir=/home/arand/.git","--work-tree=/home/arand","log","refs/heads/git-annex..5f3fc9db5c7badb5fb25c3159c20584f11dadaf9","--oneline","-n1"]+ [2013-02-07 12:47:24 CET] read: git ["--git-dir=/home/arand/.git","--work-tree=/home/arand","log","refs/heads/git-annex..8e5674078706864f2eade86d8aa43027e05afc1d","--oneline","-n1"]+ [2013-02-07 12:47:24 CET] read: git ["--git-dir=/home/arand/.git","--work-tree=/home/arand","log","refs/heads/git-annex..cbe492cfa79728698f5d891d7f716fbcd9fc29e2","--oneline","-n1"]+ [2013-02-07 12:47:24 CET] read: git ["--git-dir=/home/arand/.git","--work-tree=/home/arand","log","refs/heads/git-annex..48a1bdf98a10ad9a81c0587f8909e94c1c0dccc4","--oneline","-n1"]+ [2013-02-07 12:47:24 CET] chat: git ["--git-dir=/home/arand/.git","--work-tree=/home/arand","cat-file","--batch"]+ [2013-02-07 12:47:24 CET] read: git ["config","--null","--list"]+ [2013-02-07 12:47:24 CET] chat: git ["--git-dir=/home/arand/.git","--work-tree=/home/arand","hash-object","-w","--stdin-paths"]+ [2013-02-07 12:47:24 CET] feed: git ["--git-dir=/home/arand/.git","--work-tree=/home/arand","update-index","-z","--index-info"]+ [2013-02-07 12:47:24 CET] read: git ["--git-dir=/home/arand/.git","--work-tree=/home/arand","show-ref","--hash","refs/heads/git-annex"]+ [2013-02-07 12:47:24 CET] read: git ["--git-dir=/home/arand/.git","--work-tree=/home/arand","write-tree"]+ [2013-02-07 12:47:24 CET] chat: git ["--git-dir=/home/arand/.git","--work-tree=/home/arand","commit-tree","76f5041bc6e8a109e0309a09b5f36cd0da8b204a","-p","refs/heads/git-annex"]+ [2013-02-07 12:47:24 CET] call: git ["--git-dir=/home/arand/.git","--work-tree=/home/arand","update-ref","refs/heads/git-annex","96de755475bdd8f0f948dd6421c3956803a63e66"]+ ok+ (Recording state in git...)++If I run it again, I get:++ dropunused 9 [2013-02-07 12:47:47 CET] read: git ["--git-dir=/home/arand/.git","--work-tree=/home/arand","show-ref","git-annex"]+ [2013-02-07 12:47:47 CET] read: git ["--git-dir=/home/arand/.git","--work-tree=/home/arand","show-ref","--hash","refs/heads/git-annex"]+ [2013-02-07 12:47:47 CET] read: git ["--git-dir=/home/arand/.git","--work-tree=/home/arand","log","refs/heads/git-annex..96de755475bdd8f0f948dd6421c3956803a63e66","--oneline","-n1"]+ [2013-02-07 12:47:48 CET] read: git ["--git-dir=/home/arand/.git","--work-tree=/home/arand","log","refs/heads/git-annex..8e5674078706864f2eade86d8aa43027e05afc1d","--oneline","-n1"]+ [2013-02-07 12:47:48 CET] read: git ["--git-dir=/home/arand/.git","--work-tree=/home/arand","log","refs/heads/git-annex..cbe492cfa79728698f5d891d7f716fbcd9fc29e2","--oneline","-n1"]+ [2013-02-07 12:47:48 CET] read: git ["--git-dir=/home/arand/.git","--work-tree=/home/arand","log","refs/heads/git-annex..48a1bdf98a10ad9a81c0587f8909e94c1c0dccc4","--oneline","-n1"]+ [2013-02-07 12:47:48 CET] chat: git ["--git-dir=/home/arand/.git","--work-tree=/home/arand","cat-file","--batch"]+ [2013-02-07 12:47:48 CET] read: git ["config","--null","--list"]+ [2013-02-07 12:47:48 CET] chat: git ["--git-dir=/home/arand/.git","--work-tree=/home/arand","hash-object","-w","--stdin-paths"]+ [2013-02-07 12:47:48 CET] feed: git ["--git-dir=/home/arand/.git","--work-tree=/home/arand","update-index","-z","--index-info"]+ [2013-02-07 12:47:48 CET] read: git ["--git-dir=/home/arand/.git","--work-tree=/home/arand","show-ref","--hash","refs/heads/git-annex"]+ [2013-02-07 12:47:48 CET] read: git ["--git-dir=/home/arand/.git","--work-tree=/home/arand","write-tree"]+ [2013-02-07 12:47:48 CET] chat: git ["--git-dir=/home/arand/.git","--work-tree=/home/arand","commit-tree","e40d82db10c60519f6a3a72055e9577850972fdf","-p","refs/heads/git-annex"]+ [2013-02-07 12:47:48 CET] call: git ["--git-dir=/home/arand/.git","--work-tree=/home/arand","update-ref","refs/heads/git-annex","6cf49f629251f9b39fa8b457cf6590c71c1d509b"]+ ok+ (Recording state in git...)+++What version of git-annex are you using? On what operating system?++git-annex: 3.20130124+Debian: sid 2013-02-01++> I put a fix in for this in 57780cb3a4dfe1292b72e1412ec4d2a70b6d04ce +> but it was buggy and I had to revert it.+> +> The bug is caused by direct mode cache and mapping info.+> This makes getKeysPresent find keys that are not present.+> It would be expensive to make getKeysPresent check that the+> actual key files are present (it just lists the directories). +> But this seems to be needed, since direct mode can leave+> cache and mapping files behind. --[[Joey]]++>> Now fixed properly. [[done]] --[[Joey]]
@@ -0,0 +1,41 @@+### Please describe the problem.++I tried to create an annex (``git annex init foo``) inside a ``encfs`` mount, and git-annex says that it's crippled, and disables core.symlinks and goes into direct mode++### What steps will reproduce the problem?++ apt-get install encfs+ encfs -o kernel_cache empty_dir other_empty_dir+ cd other_empty_dir+ git init+ git annex init foo++### Expected results++ init foo ok+ (Recording state in git...)++### Actual results++ init foo + Detected a crippled filesystem.++ Disabling core.symlinks.++ Enabling direct mode.+ ok+ (Recording state in git...)++### What version of git-annex are you using? On what operating system?++4.20130601 on debian unstable+++### P.S.++This was particularly annoying when I tried this on a bare repository. I'm pretty sure bare repositories don't need symlinks, and should definitely not be in direct mode. Hopefully you can fix it before I have time to file another bug report :)++Thank you!+++> [[fixed|done]] --[[Joey]]
@@ -0,0 +1,42 @@+### Please describe the problem.+Could not get ssh-askpass running on macosx.+Transfered the publich key with scp.+certificate based ssh from macosx to ssh server (debian testing) works.+After successfull login to ssh server git annex stops with the following errors:++Browser Error Message: +user error (gpg ["--batch","--no-tty","--use-agent","--quiet","--trust-model","always","--gen-random","--armor","1","512"] exited 2)++### What steps will reproduce the problem?+1. git annex on debian gnu linux+2. git annex on macosx+3. set up "share with a friend"+4. create rsa keys on macosx "ssh-kegen -t rsa"+5. scp public key to server with hosts encrypted ssh remote +6. configure the server use a encrypted ssh remote in tranport mode ++### What version of git-annex are you using? On what operating system?+current debian testing (20130827)+macosx 20130827+### Please provide any additional information below.++[[!format sh """+# If you can, paste a complete transcript of the problem occurring here.+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log++(scanning...) [2013-09-28 17:39:25 CEST] Watcher: Performing startup scan+(started...) [2013-09-28 17:39:26 CEST] XMPPSendPack: Syncing with jlueters +Everything up-to-date+[2013-09-28 17:39:30 CEST] XMPPSendPack: Unable to download files from jlueters. ++(encryption setup) gpg: /Users/lambert/.gnupg/gpg.conf:241: invalid auto-key-locate list+28/Sep/2013:17:40:06 +0200 [Error#yesod-core] user error (gpg ["--batch","--no-tty","--use-agent","--quiet","--trust-model","always","--gen-random","--armor","1","512"] exited 2) @(yesod-core-1.1.8.3:Yesod.Internal.Core ./Yesod/Internal/Core.hs:550:5)+(encryption setup) gpg: /Users/lambert/.gnupg/gpg.conf:241: invalid auto-key-locate list+28/Sep/2013:17:40:48 +0200 [Error#yesod-core] user error (gpg ["--batch","--no-tty","--use-agent","--quiet","--trust-model","always","--gen-random","--armor","1","512"] exited 2) @(yesod-core-1.1.8.3:Yesod.Internal.Core ./Yesod/Internal/Core.hs:550:5)++++# End of transcript or log.+"""]]++> [[dup|done]] --[[Joey]]
@@ -0,0 +1,9 @@+Sending large-ish (few megabytes) files to encrypted S3 remotes stalls out.+It works for the tiny files I was using to test while developing it, on+dialup.++There was a similar issue with bup, which I fixed by forking a process+rather than using a thread to do some IO. Probably need the same here.+--[[Joey]]++[[done]] --[[Joey]]
@@ -0,0 +1,46 @@+What steps will reproduce the problem?+ % > git annex initremote glacier type=glacier encryption=E9053BDA+ -- SNIP --+ initremote glacier [2013-01-10 14:50:12 PST] read: gpg ["--quiet","--trust-model","always","--with-colons","--list-public-keys","E9053BDA"]+ [2013-01-10 14:50:12 PST] chat: gpg ["--quiet","--trust-model","always","--decrypt"]+ + You need a passphrase to unlock the secret key for+ user: "Andrew Mark Kraut <akraut@gmail.com>"+ 4096-bit ELG key, ID 353E49B9, created 2008-11-11 (main key ID E9053BDA)+ + [2013-01-10 14:50:13 PST] chat: gpg ["--quiet","--trust-model","always","--encrypt","--no-encrypt-to","--no-default-recipient","--recipient","B608B8F6E9053BDA"]+ (encryption updated with gpg key B608B8F6E9053BDA) [2013-01-10 14:50:13 PST] call: glacier ["--region=us-west-1","vault","create","glacier-06D927EC-5761-447B-86AC-CA66040BAC25"]+ [2013-01-10 14:50:13 PST] call: git ["--git-dir=/Users/akraut/Desktop/annex/.git","--work-tree=/Users/akraut/Desktop/annex","config","remote.glacier.annex-glacier","true"]+ [2013-01-10 14:50:13 PST] call: git ["--git-dir=/Users/akraut/Desktop/annex/.git","--work-tree=/Users/akraut/Desktop/annex","config","remote.glacier.annex-uuid","06D927EC-5761-447B-86AC-CA66040BAC25"]+ (gpg) [2013-01-10 14:50:13 PST] chat: gpg ["--quiet","--trust-model","always","--decrypt"]+ + You need a passphrase to unlock the secret key for+ user: "Andrew Mark Kraut <akraut@gmail.com>"+ 4096-bit ELG key, ID 353E49B9, created 2008-11-11 (main key ID E9053BDA)+ + [2013-01-10 14:50:14 PST] chat: gpg ["--quiet","--trust-model","always","--passphrase-fd","8","--symmetric","--force-mdc"]+ ok++What is the expected output? What do you see instead?++> I expect any transfers to this remote (glacier) to use the given gpg key, but instead it uses --symmetric, as you can see above.++What version of git-annex are you using? On what operating system?++ git-annex version: 3.20130107+ local repository version: 3+ default repository version: 3+ supported repository versions: 3+ upgrade supported from repository versions: 0 1 2+++Please provide any additional information below.++> Symmetric encryption is used as described in [[design/encryption]],+> with the symmetric key stored encrypted using your gpg key.+> +> The extra prompting described in the comments in the bug.+> +> I've reproduced this with gpg 2.0.19. It is a documented incompatability+> between gpg 1.x and 2.x; the latter needs --batch included in its+> parameters. I've put in a fix. [[done]]
@@ -0,0 +1,24 @@+Crypto.hs seems to imply that the cipher key it's acting upon is 512 bytes long. Because of a probable programming mistake the key that's actually used is a bit surprising. The random key is generated by this snippet in Utility/Gpg.hs:++ {- Creates a block of high-quality random data suitable to use as a cipher.+ - It is armored, to avoid newlines, since gpg only reads ciphers up to the+ - first newline. -}+ genRandom :: Int -> IO String+ genRandom size = readStrict+ [ Params "--gen-random --armor"+ , Param $ show randomquality+ , Param $ show size+ ]+ where+ -- 1 is /dev/urandom; 2 is /dev/random+ randomquality = 1 :: Int++This lets GPG generate the randomness and by passing armor, it avoids newlines. However, this base64 encoding is never undone on the way to Crypto.hs. Hence what cipherPassphrase and cipherHmac do is dropping or skipping the first 256 bytes of the base64 value. Base64, with its 6 bit per byte encoding, causes the Hmac function to operate on 192 bytes instead of 256 bytes. The key used by GPG will be larger. Some assertions that the resulting functions really operate on strings of the right length would've been helpful. Also GPG and HMAC get tested, the encryption/decryption part are not tested AFAICS.++The encryption wiki page could have had more information. Enough code (sadly in Python, not reusing the Haskell code) to operate on the resulting files can be found in [this Gist](https://gist.github.com/pkern/5078559).++-- Philipp Kern++> In addition to the comment below, I have added a check that gpg outputs+> the expected quantity of data, and the storage of the cipher is now+> documented in [[internals]]. Think I can call this [[done]]. --[[Joey]]
@@ -0,0 +1,159 @@+I am trying to install git-annex 3.20120624 using cabal. My currently installed version of git-annex is 3.20120615. After a "cabal update", the build of git-annex fails:++ bram@falafel% cabal install git-annex+ Resolving dependencies...+ [1 of 4] Compiling Utility.SafeCommand ( /tmp/git-annex-3.20120624-4173/git-annex-3.20120624/Utility/SafeCommand.hs, /tmp/git-annex-3.20120624-4173/git-annex-3.20120624/dist/setup/Utility/SafeCommand.o )+ [2 of 4] Compiling Build.TestConfig ( /tmp/git-annex-3.20120624-4173/git-annex-3.20120624/Build/TestConfig.hs, /tmp/git-annex-3.20120624-4173/git-annex-3.20120624/dist/setup/Build/TestConfig.o )+ [3 of 4] Compiling Build.Configure ( /tmp/git-annex-3.20120624-4173/git-annex-3.20120624/Build/Configure.hs, /tmp/git-annex-3.20120624-4173/git-annex-3.20120624/dist/setup/Build/Configure.o )+ [4 of 4] Compiling Main ( /tmp/git-annex-3.20120624-4173/git-annex-3.20120624/Setup.hs, /tmp/git-annex-3.20120624-4173/git-annex-3.20120624/dist/setup/Main.o )+ Linking /tmp/git-annex-3.20120624-4173/git-annex-3.20120624/dist/setup/setup ...+ checking version... 3.20120624+ checking git... yes+ checking git version... 1.7.9.5+ checking cp -a... yes+ checking cp -p... yes+ checking cp --reflink=auto... yes+ checking uuid generator... uuid+ checking xargs -0... yes+ checking rsync... yes+ checking curl... no+ checking wget... yes+ checking bup... no+ checking gpg... yes+ checking lsof... yes+ checking ssh connection caching... yes+ checking sha1... sha1sum+ checking sha512... sha512sum+ checking sha224... sha224sum+ checking sha384... sha384sum+ checking sha256... sha256sum+ Configuring git-annex-3.20120624...+ Building git-annex-3.20120624...+ Preprocessing executable 'git-annex' for git-annex-3.20120624...+ [ 1 of 183] Compiling Utility.Percentage ( Utility/Percentage.hs, dist/build/git-annex/git-annex-tmp/Utility/Percentage.o )+ [ 2 of 183] Compiling Utility.Dot ( Utility/Dot.hs, dist/build/git-annex/git-annex-tmp/Utility/Dot.o )+ [ 3 of 183] Compiling Utility.ThreadLock ( Utility/ThreadLock.hs, dist/build/git-annex/git-annex-tmp/Utility/ThreadLock.o )+ [ 4 of 183] Compiling Utility.Base64 ( Utility/Base64.hs, dist/build/git-annex/git-annex-tmp/Utility/Base64.o )+ [ 5 of 183] Compiling Utility.DataUnits ( Utility/DataUnits.hs, dist/build/git-annex/git-annex-tmp/Utility/DataUnits.o )+ [ 6 of 183] Compiling Utility.JSONStream ( Utility/JSONStream.hs, dist/build/git-annex/git-annex-tmp/Utility/JSONStream.o )+ [ 7 of 183] Compiling Messages.JSON ( Messages/JSON.hs, dist/build/git-annex/git-annex-tmp/Messages/JSON.o )+ [ 8 of 183] Compiling Build.SysConfig ( Build/SysConfig.hs, dist/build/git-annex/git-annex-tmp/Build/SysConfig.o )+ [ 9 of 183] Compiling Types.KeySource ( Types/KeySource.hs, dist/build/git-annex/git-annex-tmp/Types/KeySource.o )+ [ 10 of 183] Compiling Types.UUID ( Types/UUID.hs, dist/build/git-annex/git-annex-tmp/Types/UUID.o )+ [ 11 of 183] Compiling Utility.State ( Utility/State.hs, dist/build/git-annex/git-annex-tmp/Utility/State.o )+ [ 12 of 183] Compiling Types.Messages ( Types/Messages.hs, dist/build/git-annex/git-annex-tmp/Types/Messages.o )+ [ 13 of 183] Compiling Types.TrustLevel ( Types/TrustLevel.hs, dist/build/git-annex/git-annex-tmp/Types/TrustLevel.o )+ [ 14 of 183] Compiling Types.BranchState ( Types/BranchState.hs, dist/build/git-annex/git-annex-tmp/Types/BranchState.o )+ [ 15 of 183] Compiling Git.Index ( Git/Index.hs, dist/build/git-annex/git-annex-tmp/Git/Index.o )+ [ 16 of 183] Compiling Utility.PartialPrelude ( Utility/PartialPrelude.hs, dist/build/git-annex/git-annex-tmp/Utility/PartialPrelude.o )+ [ 17 of 183] Compiling Utility.Format ( Utility/Format.hs, dist/build/git-annex/git-annex-tmp/Utility/Format.o )+ [ 18 of 183] Compiling Utility.FileSystemEncoding ( Utility/FileSystemEncoding.hs, dist/build/git-annex/git-annex-tmp/Utility/FileSystemEncoding.o )+ [ 19 of 183] Compiling Utility.Touch ( dist/build/git-annex/git-annex-tmp/Utility/Touch.hs, dist/build/git-annex/git-annex-tmp/Utility/Touch.o )+ [ 20 of 183] Compiling Utility.Monad ( Utility/Monad.hs, dist/build/git-annex/git-annex-tmp/Utility/Monad.o )+ [ 21 of 183] Compiling Utility.Path ( Utility/Path.hs, dist/build/git-annex/git-annex-tmp/Utility/Path.o )+ [ 22 of 183] Compiling Utility.SafeCommand ( Utility/SafeCommand.hs, dist/build/git-annex/git-annex-tmp/Utility/SafeCommand.o )+ [ 23 of 183] Compiling Utility.RsyncFile ( Utility/RsyncFile.hs, dist/build/git-annex/git-annex-tmp/Utility/RsyncFile.o )+ [ 24 of 183] Compiling Utility.Exception ( Utility/Exception.hs, dist/build/git-annex/git-annex-tmp/Utility/Exception.o )+ [ 25 of 183] Compiling Utility.TempFile ( Utility/TempFile.hs, dist/build/git-annex/git-annex-tmp/Utility/TempFile.o )+ [ 26 of 183] Compiling Utility.Directory ( Utility/Directory.hs, dist/build/git-annex/git-annex-tmp/Utility/Directory.o )+ [ 27 of 183] Compiling Utility.Misc ( Utility/Misc.hs, dist/build/git-annex/git-annex-tmp/Utility/Misc.o )+ [ 28 of 183] Compiling Git.Types ( Git/Types.hs, dist/build/git-annex/git-annex-tmp/Git/Types.o )+ [ 29 of 183] Compiling Common ( Common.hs, dist/build/git-annex/git-annex-tmp/Common.o )+ [ 30 of 183] Compiling Utility.FileMode ( Utility/FileMode.hs, dist/build/git-annex/git-annex-tmp/Utility/FileMode.o )+ [ 31 of 183] Compiling Git ( Git.hs, dist/build/git-annex/git-annex-tmp/Git.o )+ [ 32 of 183] Compiling Git.Command ( Git/Command.hs, dist/build/git-annex/git-annex-tmp/Git/Command.o )+ [ 33 of 183] Compiling Git.Ref ( Git/Ref.hs, dist/build/git-annex/git-annex-tmp/Git/Ref.o )+ [ 34 of 183] Compiling Git.FilePath ( Git/FilePath.hs, dist/build/git-annex/git-annex-tmp/Git/FilePath.o )+ [ 35 of 183] Compiling Utility.Matcher ( Utility/Matcher.hs, dist/build/git-annex/git-annex-tmp/Utility/Matcher.o )+ [ 36 of 183] Compiling Utility.Gpg ( Utility/Gpg.hs, dist/build/git-annex/git-annex-tmp/Utility/Gpg.o )+ [ 37 of 183] Compiling Types.Crypto ( Types/Crypto.hs, dist/build/git-annex/git-annex-tmp/Types/Crypto.o )+ [ 38 of 183] Compiling Types.Key ( Types/Key.hs, dist/build/git-annex/git-annex-tmp/Types/Key.o )+ [ 39 of 183] Compiling Types.Backend ( Types/Backend.hs, dist/build/git-annex/git-annex-tmp/Types/Backend.o )+ [ 40 of 183] Compiling Types.Remote ( Types/Remote.hs, dist/build/git-annex/git-annex-tmp/Types/Remote.o )+ [ 41 of 183] Compiling Git.Sha ( Git/Sha.hs, dist/build/git-annex/git-annex-tmp/Git/Sha.o )+ [ 42 of 183] Compiling Git.Branch ( Git/Branch.hs, dist/build/git-annex/git-annex-tmp/Git/Branch.o )+ [ 43 of 183] Compiling Git.UpdateIndex ( Git/UpdateIndex.hs, dist/build/git-annex/git-annex-tmp/Git/UpdateIndex.o )+ [ 44 of 183] Compiling Git.Queue ( Git/Queue.hs, dist/build/git-annex/git-annex-tmp/Git/Queue.o )+ [ 45 of 183] Compiling Git.Url ( Git/Url.hs, dist/build/git-annex/git-annex-tmp/Git/Url.o )+ [ 46 of 183] Compiling Git.Construct ( Git/Construct.hs, dist/build/git-annex/git-annex-tmp/Git/Construct.o )+ [ 47 of 183] Compiling Git.Config ( Git/Config.hs, dist/build/git-annex/git-annex-tmp/Git/Config.o )+ [ 48 of 183] Compiling Git.SharedRepository ( Git/SharedRepository.hs, dist/build/git-annex/git-annex-tmp/Git/SharedRepository.o )+ [ 49 of 183] Compiling Git.Version ( Git/Version.hs, dist/build/git-annex/git-annex-tmp/Git/Version.o )+ [ 50 of 183] Compiling Utility.CoProcess ( Utility/CoProcess.hs, dist/build/git-annex/git-annex-tmp/Utility/CoProcess.o )+ [ 51 of 183] Compiling Git.HashObject ( Git/HashObject.hs, dist/build/git-annex/git-annex-tmp/Git/HashObject.o )+ [ 52 of 183] Compiling Git.CatFile ( Git/CatFile.hs, dist/build/git-annex/git-annex-tmp/Git/CatFile.o )+ [ 53 of 183] Compiling Git.UnionMerge ( Git/UnionMerge.hs, dist/build/git-annex/git-annex-tmp/Git/UnionMerge.o )+ [ 54 of 183] Compiling Git.CheckAttr ( Git/CheckAttr.hs, dist/build/git-annex/git-annex-tmp/Git/CheckAttr.o )+ [ 55 of 183] Compiling Annex ( Annex.hs, dist/build/git-annex/git-annex-tmp/Annex.o )+ [ 56 of 183] Compiling Types.Option ( Types/Option.hs, dist/build/git-annex/git-annex-tmp/Types/Option.o )+ [ 57 of 183] Compiling Types ( Types.hs, dist/build/git-annex/git-annex-tmp/Types.o )+ [ 58 of 183] Compiling Messages ( Messages.hs, dist/build/git-annex/git-annex-tmp/Messages.o )+ [ 59 of 183] Compiling Types.Command ( Types/Command.hs, dist/build/git-annex/git-annex-tmp/Types/Command.o )+ [ 60 of 183] Compiling Locations ( Locations.hs, dist/build/git-annex/git-annex-tmp/Locations.o )+ [ 61 of 183] Compiling Common.Annex ( Common/Annex.hs, dist/build/git-annex/git-annex-tmp/Common/Annex.o )+ [ 62 of 183] Compiling Annex.Exception ( Annex/Exception.hs, dist/build/git-annex/git-annex-tmp/Annex/Exception.o )+ [ 63 of 183] Compiling Annex.BranchState ( Annex/BranchState.hs, dist/build/git-annex/git-annex-tmp/Annex/BranchState.o )+ [ 64 of 183] Compiling Annex.CatFile ( Annex/CatFile.hs, dist/build/git-annex/git-annex-tmp/Annex/CatFile.o )+ [ 65 of 183] Compiling Annex.Perms ( Annex/Perms.hs, dist/build/git-annex/git-annex-tmp/Annex/Perms.o )+ [ 66 of 183] Compiling Annex.Journal ( Annex/Journal.hs, dist/build/git-annex/git-annex-tmp/Annex/Journal.o )+ [ 67 of 183] Compiling Annex.Branch ( Annex/Branch.hs, dist/build/git-annex/git-annex-tmp/Annex/Branch.o )+ [ 68 of 183] Compiling Crypto ( Crypto.hs, dist/build/git-annex/git-annex-tmp/Crypto.o )+ [ 69 of 183] Compiling Usage ( Usage.hs, dist/build/git-annex/git-annex-tmp/Usage.o )+ [ 70 of 183] Compiling Annex.CheckAttr ( Annex/CheckAttr.hs, dist/build/git-annex/git-annex-tmp/Annex/CheckAttr.o )+ [ 71 of 183] Compiling Remote.Helper.Special ( Remote/Helper/Special.hs, dist/build/git-annex/git-annex-tmp/Remote/Helper/Special.o )+ [ 72 of 183] Compiling Logs.Presence ( Logs/Presence.hs, dist/build/git-annex/git-annex-tmp/Logs/Presence.o )+ [ 73 of 183] Compiling Logs.Location ( Logs/Location.hs, dist/build/git-annex/git-annex-tmp/Logs/Location.o )+ [ 74 of 183] Compiling Logs.Web ( Logs/Web.hs, dist/build/git-annex/git-annex-tmp/Logs/Web.o )+ [ 75 of 183] Compiling Annex.LockPool ( Annex/LockPool.hs, dist/build/git-annex/git-annex-tmp/Annex/LockPool.o )+ [ 76 of 183] Compiling Backend.SHA ( Backend/SHA.hs, dist/build/git-annex/git-annex-tmp/Backend/SHA.o )+ [ 77 of 183] Compiling Backend.WORM ( Backend/WORM.hs, dist/build/git-annex/git-annex-tmp/Backend/WORM.o )+ [ 78 of 183] Compiling Backend.URL ( Backend/URL.hs, dist/build/git-annex/git-annex-tmp/Backend/URL.o )+ [ 79 of 183] Compiling Assistant.ThreadedMonad ( Assistant/ThreadedMonad.hs, dist/build/git-annex/git-annex-tmp/Assistant/ThreadedMonad.o )+ [ 80 of 183] Compiling Logs.UUIDBased ( Logs/UUIDBased.hs, dist/build/git-annex/git-annex-tmp/Logs/UUIDBased.o )+ [ 81 of 183] Compiling Logs.Remote ( Logs/Remote.hs, dist/build/git-annex/git-annex-tmp/Logs/Remote.o )+ [ 82 of 183] Compiling Utility.DiskFree ( Utility/DiskFree.hs, dist/build/git-annex/git-annex-tmp/Utility/DiskFree.o )+ [ 83 of 183] Compiling Utility.Url ( Utility/Url.hs, dist/build/git-annex/git-annex-tmp/Utility/Url.o )+ [ 84 of 183] Compiling Utility.CopyFile ( Utility/CopyFile.hs, dist/build/git-annex/git-annex-tmp/Utility/CopyFile.o )+ [ 85 of 183] Compiling Git.LsFiles ( Git/LsFiles.hs, dist/build/git-annex/git-annex-tmp/Git/LsFiles.o )+ [ 86 of 183] Compiling Git.AutoCorrect ( Git/AutoCorrect.hs, dist/build/git-annex/git-annex-tmp/Git/AutoCorrect.o )+ [ 87 of 183] Compiling Git.CurrentRepo ( Git/CurrentRepo.hs, dist/build/git-annex/git-annex-tmp/Git/CurrentRepo.o )+ [ 88 of 183] Compiling Utility.Daemon ( Utility/Daemon.hs, dist/build/git-annex/git-annex-tmp/Utility/Daemon.o )+ [ 89 of 183] Compiling Utility.LogFile ( Utility/LogFile.hs, dist/build/git-annex/git-annex-tmp/Utility/LogFile.o )+ [ 90 of 183] Compiling Utility.ThreadScheduler ( Utility/ThreadScheduler.hs, dist/build/git-annex/git-annex-tmp/Utility/ThreadScheduler.o )+ [ 91 of 183] Compiling Assistant.DaemonStatus ( Assistant/DaemonStatus.hs, dist/build/git-annex/git-annex-tmp/Assistant/DaemonStatus.o )+ [ 92 of 183] Compiling Utility.Types.DirWatcher ( Utility/Types/DirWatcher.hs, dist/build/git-annex/git-annex-tmp/Utility/Types/DirWatcher.o )+ [ 93 of 183] Compiling Utility.INotify ( Utility/INotify.hs, dist/build/git-annex/git-annex-tmp/Utility/INotify.o )+ [ 94 of 183] Compiling Utility.DirWatcher ( Utility/DirWatcher.hs, dist/build/git-annex/git-annex-tmp/Utility/DirWatcher.o )+ [ 95 of 183] Compiling Utility.Lsof ( Utility/Lsof.hs, dist/build/git-annex/git-annex-tmp/Utility/Lsof.o )+ [ 96 of 183] Compiling Git.Merge ( Git/Merge.hs, dist/build/git-annex/git-annex-tmp/Git/Merge.o )+ [ 97 of 183] Compiling Git.Filename ( Git/Filename.hs, dist/build/git-annex/git-annex-tmp/Git/Filename.o )+ [ 98 of 183] Compiling Git.LsTree ( Git/LsTree.hs, dist/build/git-annex/git-annex-tmp/Git/LsTree.o )+ [ 99 of 183] Compiling Config ( Config.hs, dist/build/git-annex/git-annex-tmp/Config.o )+ [100 of 183] Compiling Annex.UUID ( Annex/UUID.hs, dist/build/git-annex/git-annex-tmp/Annex/UUID.o )+ [101 of 183] Compiling Logs.UUID ( Logs/UUID.hs, dist/build/git-annex/git-annex-tmp/Logs/UUID.o )+ [102 of 183] Compiling Backend ( Backend.hs, dist/build/git-annex/git-annex-tmp/Backend.o )+ [103 of 183] Compiling Remote.Helper.Hooks ( Remote/Helper/Hooks.hs, dist/build/git-annex/git-annex-tmp/Remote/Helper/Hooks.o )+ [104 of 183] Compiling Remote.Helper.Encryptable ( Remote/Helper/Encryptable.hs, dist/build/git-annex/git-annex-tmp/Remote/Helper/Encryptable.o )+ [105 of 183] Compiling Annex.Queue ( Annex/Queue.hs, dist/build/git-annex/git-annex-tmp/Annex/Queue.o )+ [106 of 183] Compiling Annex.Content ( Annex/Content.hs, dist/build/git-annex/git-annex-tmp/Annex/Content.o )+ [107 of 183] Compiling Remote.S3 ( Remote/S3.hs, dist/build/git-annex/git-annex-tmp/Remote/S3.o )+ [108 of 183] Compiling Remote.Directory ( Remote/Directory.hs, dist/build/git-annex/git-annex-tmp/Remote/Directory.o )+ [109 of 183] Compiling Remote.Rsync ( Remote/Rsync.hs, dist/build/git-annex/git-annex-tmp/Remote/Rsync.o )+ [110 of 183] Compiling Remote.Web ( Remote/Web.hs, dist/build/git-annex/git-annex-tmp/Remote/Web.o )+ [111 of 183] Compiling Remote.Hook ( Remote/Hook.hs, dist/build/git-annex/git-annex-tmp/Remote/Hook.o )+ [112 of 183] Compiling Upgrade.V2 ( Upgrade/V2.hs, dist/build/git-annex/git-annex-tmp/Upgrade/V2.o )+ [113 of 183] Compiling Assistant.Changes ( Assistant/Changes.hs, dist/build/git-annex/git-annex-tmp/Assistant/Changes.o )+ + Assistant/Changes.hs:73:30:+ Not in scope: `tryReadTChan'+ Perhaps you meant `readTChan' (imported from Control.Concurrent.STM)+ cabal: Error: some packages failed to install:+ git-annex-3.20120624 failed during the building phase. The exception was:+ ExitFailure 1++This is using haskell-platform 2012.1.0.0~debian1 on Ubuntu 12.04.++> Turns out it needs version 2.3 of the STM library. (libghc-stm-dev+> package). I've made cabal detect an older version and skip building+> the new `git annex watch` command, so you'll be able to build the next+> release. [[done]] --[[Joey]]
@@ -0,0 +1,16 @@+**What steps will reproduce the problem?**<br>+Delete the last repository in the current repository (where it says: warning type in "yes please do as i say").+Then try running git annex webapp+<br><br>+**What is the expected output? What do you see instead?**<br>+Webapp starts. git-annex: Not in a git repository.+<br><br>+**What version of git-annex are you using? On what operating system?**<br>+4.20130417. Debian wheezy/testing+<br><br>+**Please provide any additional information below.**<br>+See also+[[bugs/git-annex:_Not_in_a_git_repository._/]]+where the same error message occurs++[[!tag /design/assistant moreinfo]]
@@ -0,0 +1,3 @@+If a subcommand fails w/o throwing an error, no error is propigated to the+git-annex exit code. With --quiet, this makes it look like the command+succeeded. [[done]]
@@ -0,0 +1,62 @@+*What steps will reproduce the problem?*++ hactar% mkdir demonstração+ hactar% cd demonstração+ hactar% cp ~/tmp/*(.) .+ hactar% git init+ Initialized empty Git repository in /tmp/demonstração/.git/+ hactar% git annex init+ init ok+ (Recording state in git...)+ hactar% git annex add .+ add Equipment Consumption.ods (checksum...) ok+ add Personal.vcard (checksum...) ok+ add Trampo.vcard (checksum...) ok+ add blah.txt (checksum...) ok+ [ more git output ]+ hactar% git commit -m initial+ [master (root-commit) d16bafb] initial+ 42 files changed, 42 insertions(+)+ [ more git output ]+ hactar% cd /var/tmp+ hactar% git clone ssh://localhost//tmp/demonstração demonstração+ Cloning into 'demonstração'...+ remote: Counting objects: 176, done.+ remote: Compressing objects: 100% (134/134), done.+ remote: Total 176 (delta 1), reused 0 (delta 0)+ Receiving objects: 100% (176/176), 17.23 KiB, done.+ Resolving deltas: 100% (1/1), done.+ hactar% cd demonstração+ hactar% git annex init+ init ok+ (Recording state in git...)+ hactar% git annex status+ supported backends: SHA256E SHA1E SHA512E SHA224E SHA384E SHA256 SHA1 SHA512 SHA224 SHA384 WORM URL+ supported remote types: git S3 bup directory rsync web hook+ trusted repositories: (merging origin/git-annex into git-annex...)++ git-annex: fd:14: commitBuffer: invalid argument (invalid character)+ failed+ git-annex: status: 1 failed++*What is the expected output? What do you see instead?*++I expect that "git annex status" will complete successfuly and show information about all repositories.+Instead of that I get the "git-annex: fd:14: commitBuffer: invalid argument (invalid character)" error above.++*What version of git-annex are you using? On what operating system?*++This is with Debian's git-annex_3.20121001_i386.deb installed on an Ubuntu 12.04 system.+Using Ubuntu's original version (3.20120406) the error message is a bit different (here I used the name acentuação instead of demonstração):++ trusted repositories: git-annex-shell: //tmp/acentuação: changeWorkingDirectory: does not exist (No such file or directory)+ Command ssh ["-S","/var/tmp/acentua\231\227o/.git/annex/ssh/localhost","-o","ControlMaster=auto","-o","ControlPersist=yes","localhost","git-annex-shell 'configlist' '//tmp/acentua\195\167\195\163o'"] failed; exit code 1++> I think this is the last unvalid utf-8 bug in git-annex. At least,+> the last one I hypothesized exists. It's in the union merge code. I will+> try to look at it again soon; the last 2 times I looked at that code+> I could not see an easy way to make it allow invalid utf-8 encoded data.+> --[[Joey]] ++>> [[done]], although I am no longer so sure this was the last utf-8+>> encoding bug.. --[[Joey]]
@@ -0,0 +1,15 @@+git annex add has problems if items start with dashes, example:++-wut-a-directory-name-/file1++leads to++[[!format bash """+add -wut-a-directory-name-/file1 (checksum...) sha1sum: invalid option -- 'u'+„sha1sum --help“ gibt weitere Informationen.++ git-annex: <file descriptor: 15>: hGetLine: end of file+"""]]++> This is fixed in git, at least I think I've found all cases where+> filenames are passed to programs and escaped them. --[[Joey]] [[done]]
@@ -0,0 +1,15 @@+When using `git annex get foo` where foo is available in a rsync remote with encryption I got an error saying that rsync cannot+find the required file but extra ' are here.++I attached a patch for this.++> But you didn't, sadly. :(+>+> I don't seem to see the problem, set up a rsync over ssh with encryption+> and sent over a file "foo", and then got it back from rsync, without+> trouble.+> +> Ah, you're not using rsync over ssh, but just to a local directory,+> right? --[[Joey]]++>> [[fixed|done]] --[[Joey]]
@@ -0,0 +1,445 @@+ git-annex version: 3.20111011+ local repository version: 3+ default repository version: 3+ supported repository versions: 3+ upgrade supported from repository versions: 0 1 2++I just created a new remote on a USB drive and wanted to copy my files over. git-annex wasn't too happy about that ;)+I included a few OK transfers as there was an error before git-annex ran into a wall. As I could easily access that temp file after it aborted, I suspect something went wrong internally before git-annex started to throw those errors.++Please note the "_n TIMES_" comments. It's how often I got the same error message...++++ git annex copy . --to USB --fast+ + copy redacted.JPG (to USB...) + redacted+ 4035668 100% 77.91MB/s 0:00:00 (xfer#1, to-check=0/1)+ + sent 4036374 bytes received 31 bytes 8072810.00 bytes/sec+ total size is 4035668 speedup is 1.00+ ok+ copy redacted.NEF (to USB...) + redacted+ 18002094 100% 74.19MB/s 0:00:00 (xfer#1, to-check=0/1)+ WARNING: redacted failed verification -- update retained (will try again).+ redacted+ 18002094 100% 19.60MB/s 0:00:00 (xfer#2, to-check=0/1)+ rsync: open "copy_target/.git/annex/tmp/redacted_E13" failed: Permission denied (13)+ + sent 36008841 bytes received 52 bytes 24005928.67 bytes/sec+ total size is 18002094 speedup is 0.50+ rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1070) [sender=3.0.8]+ + rsync failed -- run git annex again to resume file transfer+ failed+ copy redacted.JPG (to USB...) + redacted+ 3687111 100% 39.16MB/s 0:00:00 (xfer#1, to-check=0/1)+ + sent 3687773 bytes received 31 bytes 2458536.00 bytes/sec+ total size is 3687111 speedup is 1.00+ ok+ copy redacted.NEF (to USB...) + redacted+ 17877177 100% 79.15MB/s 0:00:00 (xfer#1, to-check=0/1)+ + sent 17879573 bytes received 31 bytes 11919736.00 bytes/sec+ total size is 17877177 speedup is 1.00+ ok+ copy redacted.JPG (to USB...) + redacted+ 3694921 100% 40.14MB/s 0:00:00 (xfer#1, to-check=0/1)+ + sent 3695583 bytes received 31 bytes 2463742.67 bytes/sec+ total size is 3694921 speedup is 1.00+ ok+ copy redacted.NEF (to USB...) + redacted+ 17875448 100% 71.20MB/s 0:00:00 (xfer#1, to-check=0/1)+ + sent 17877844 bytes received 31 bytes 11918583.33 bytes/sec+ total size is 17875448 speedup is 1.00+ ok+ copy redacted.JPG (to USB...) + redacted+ 3833377 100% 62.49MB/s 0:00:00 (xfer#1, to-check=0/1)+ + sent 3834055 bytes received 31 bytes 2556057.33 bytes/sec+ total size is 3833377 speedup is 1.00+ ok+ copy redacted.NEF (to USB...) + redacted+ 17938200 100% 65.43MB/s 0:00:00 (xfer#1, to-check=0/1)+ + sent 17940604 bytes received 31 bytes 11960423.33 bytes/sec+ total size is 17938200 speedup is 1.00+ ok+ copy redacted.JPG (to USB...) + redacted+ 4512557 100% 83.77MB/s 0:00:00 (xfer#1, to-check=0/1)+ + sent 4513319 bytes received 31 bytes 3008900.00 bytes/sec+ total size is 4512557 speedup is 1.00+ ok+ copy redacted.NEF (to USB...) + redacted+ 18001641 100% 76.16MB/s 0:00:00 (xfer#1, to-check=0/1)+ + sent 18004053 bytes received 31 bytes 12002722.67 bytes/sec+ total size is 18001641 speedup is 1.00+ ok+ copy redacted.JPG (to USB...) + redacted+ 4394272 100% 50.11MB/s 0:00:00 (xfer#1, to-check=0/1)+ + sent 4395022 bytes received 31 bytes 8790106.00 bytes/sec+ total size is 4394272 speedup is 1.00+ ok+ copy redacted.NEF (to USB...) + redacted+ 18095781 100% 73.30MB/s 0:00:00 (xfer#1, to-check=0/1)+ + sent 18098205 bytes received 31 bytes 12065490.67 bytes/sec+ total size is 18095781 speedup is 1.00+ ok+ copy redacted.JPG (to USB...) + redacted+ 4683795 100% 65.23MB/s 0:00:00 (xfer#1, to-check=0/1)+ + sent 4684577 bytes received 31 bytes 9369216.00 bytes/sec+ total size is 4683795 speedup is 1.00+ ok+ copy redacted.NEF (to USB...) + redacted+ 18172801 100% 74.25MB/s 0:00:00 (xfer#1, to-check=0/1)+ + sent 18175233 bytes received 31 bytes 36350528.00 bytes/sec+ total size is 18172801 speedup is 1.00+ ok+ copy redacted.JPG (to USB...) + redacted+ 4486231 100% 77.22MB/s 0:00:00 (xfer#1, to-check=0/1)+ + sent 4486989 bytes received 31 bytes 8974040.00 bytes/sec+ total size is 4486231 speedup is 1.00+ ok+ copy redacted.NEF (to USB...) + redacted+ 17860427 100% 68.56MB/s 0:00:00 (xfer#1, to-check=0/1)+ + sent 17862823 bytes received 31 bytes 35725708.00 bytes/sec+ total size is 17860427 speedup is 1.00+ ok+ copy redacted.JPG (to USB...) + redacted+ 4499768 100% 36.41MB/s 0:00:00 (xfer#1, to-check=0/1)+ + sent 4500530 bytes received 31 bytes 9001122.00 bytes/sec+ total size is 4499768 speedup is 1.00+ ok+ copy redacted.NEF (to USB...) + redacted+ 17840132 100% 74.48MB/s 0:00:00 (xfer#1, to-check=0/1)+ + sent 17842524 bytes received 31 bytes 11895036.67 bytes/sec+ total size is 17840132 speedup is 1.00+ ok+ copy redacted.JPG (to USB...) + redacted+ 4358032 100% 75.00MB/s 0:00:00 (xfer#1, to-check=0/1)+ + sent 4358774 bytes received 31 bytes 8717610.00 bytes/sec+ total size is 4358032 speedup is 1.00+ ok+ copy redacted.NEF (to USB...) + redacted+ 18084753 100% 61.48MB/s 0:00:00 (xfer#1, to-check=0/1)+ + sent 18087173 bytes received 31 bytes 12058136.00 bytes/sec+ total size is 18084753 speedup is 1.00+ ok+ copy redacted.JPG (to USB...) + redacted+ 4270213 100% 68.49MB/s 0:00:00 (xfer#1, to-check=0/1)+ + sent 4270947 bytes received 31 bytes 2847318.67 bytes/sec+ total size is 4270213 speedup is 1.00+ ok+ copy redacted.NEF (to USB...) + redacted+ 17661246 100% 68.34MB/s 0:00:00 (xfer#1, to-check=0/1)+ + sent 17663614 bytes received 31 bytes 11775763.33 bytes/sec+ total size is 17661246 speedup is 1.00+ ok+ copy redacted.JPG (to USB...) + redacted+ 4538305 100% 63.19MB/s 0:00:00 (xfer#1, to-check=0/1)+ + sent 4539071 bytes received 31 bytes 9078204.00 bytes/sec+ total size is 4538305 speedup is 1.00+ ok+ copy redacted.NEF (to USB...) + redacted+ 18672466 100% 68.90MB/s 0:00:00 (xfer#1, to-check=0/1)+ + sent 18674958 bytes received 31 bytes 12449992.67 bytes/sec+ total size is 18672466 speedup is 1.00+ ok+ copy redacted.JPG (to USB...) + redacted+ 4453445 100% 73.96MB/s 0:00:00 (xfer#1, to-check=0/1)+ + sent 4454199 bytes received 31 bytes 8908460.00 bytes/sec+ total size is 4453445 speedup is 1.00+ ok+ copy redacted.NEF (to USB...) + redacted+ 18495494 100% 59.28MB/s 0:00:00 (xfer#1, to-check=0/1)+ + sent 18497966 bytes received 31 bytes 12331998.00 bytes/sec+ total size is 18495494 speedup is 1.00+ ok+ copy redacted.JPG (to USB...) + redacted+ 4255858 100% 70.66MB/s 0:00:00 (xfer#1, to-check=0/1)+ + sent 4256588 bytes received 31 bytes 1702647.60 bytes/sec+ total size is 4255858 speedup is 1.00+ ok+ copy redacted.NEF (to USB...) + redacted+ 18376531 100% 69.15MB/s 0:00:00 (xfer#1, to-check=0/1)+ + sent 18378987 bytes received 31 bytes 36758036.00 bytes/sec+ total size is 18376531 speedup is 1.00+ ok+ copy redacted.JPG (to USB...) + redacted+ 4013365 100% 48.67MB/s 0:00:00 (xfer#1, to-check=0/1)+ + sent 4014067 bytes received 31 bytes 8028196.00 bytes/sec+ total size is 4013365 speedup is 1.00+ ok+ copy redacted.NEF (to USB...) + redacted+ 17606341 100% 51.73MB/s 0:00:00 (xfer#1, to-check=0/1)+ + sent 17608705 bytes received 31 bytes 11739157.33 bytes/sec+ total size is 17606341 speedup is 1.00+ ok+ copy redacted.JPG (to USB...) + redacted+ 4179869 100% 74.62MB/s 0:00:00 (xfer#1, to-check=0/1)+ + sent 4180591 bytes received 31 bytes 8361244.00 bytes/sec+ total size is 4179869 speedup is 1.00+ ok+ copy redacted.NEF (to USB...) + redacted+ 18382569 100% 67.05MB/s 0:00:00 (xfer#1, to-check=0/1)+ + sent 18385025 bytes received 31 bytes 12256704.00 bytes/sec+ total size is 18382569 speedup is 1.00+ ok+ copy redacted.JPG (to USB...) + redacted+ 4318363 100% 44.91MB/s 0:00:00 (xfer#1, to-check=0/1)+ + sent 4319101 bytes received 31 bytes 8638264.00 bytes/sec+ total size is 4318363 speedup is 1.00+ ok+ copy redacted.NEF (to USB...) + redacted+ 17715958 100% 72.69MB/s 0:00:00 (xfer#1, to-check=0/1)+ + sent 17718334 bytes received 31 bytes 11812243.33 bytes/sec+ total size is 17715958 speedup is 1.00+ ok+ copy redacted.JPG (to USB...) + redacted+ 4241893 100% 65.81MB/s 0:00:00 (xfer#1, to-check=0/1)+ + sent 4242623 bytes received 31 bytes 8485308.00 bytes/sec+ total size is 4241893 speedup is 1.00+ ok+ copy redacted.NEF (to USB...) + redacted+ 17717287 100% 71.77MB/s 0:00:00 (xfer#1, to-check=0/1)+ + sent 17719663 bytes received 31 bytes 11813129.33 bytes/sec+ total size is 17717287 speedup is 1.00+ ok+ copy redacted.JPG (to USB...) + redacted+ 4488380 100% 49.99MB/s 0:00:00 (xfer#1, to-check=0/1)+ + sent 4489138 bytes received 31 bytes 2992779.33 bytes/sec+ total size is 4488380 speedup is 1.00+ ok+ copy redacted.NEF (to USB...) + redacted+ 17770208 100% 38.80MB/s 0:00:00 (xfer#1, to-check=0/1)+ + sent 17772592 bytes received 31 bytes 11848415.33 bytes/sec+ total size is 17770208 speedup is 1.00+ ok+ copy redacted.JPG (to USB...) + redacted+ 4603958 100% 76.48MB/s 0:00:00 (xfer#1, to-check=0/1)+ + sent 4604732 bytes received 31 bytes 9209526.00 bytes/sec+ total size is 4603958 speedup is 1.00+ ok+ copy redacted.NEF (to USB...) + redacted+ 18744380 100% 74.66MB/s 0:00:00 (xfer#1, to-check=0/1)+ + sent 18746884 bytes received 31 bytes 12497943.33 bytes/sec+ total size is 18744380 speedup is 1.00+ ok+ copy redacted.JPG (to USB...) + redacted+ 4592098 100% 79.06MB/s 0:00:00 (xfer#1, to-check=0/1)+ + sent 4592872 bytes received 31 bytes 3061935.33 bytes/sec+ total size is 4592098 speedup is 1.00+ ok+ copy redacted.NEF (to USB...) + redacted+ 18746205 100% 43.00MB/s 0:00:00 (xfer#1, to-check=0/1)+ + sent 18748709 bytes received 31 bytes 12499160.00 bytes/sec+ total size is 18746205 speedup is 1.00+ ok+ copy redacted.JPG (to USB...) + redacted+ 7493353 100% 80.85MB/s 0:00:00 (xfer#1, to-check=0/1)+ + sent 7494479 bytes received 31 bytes 14989020.00 bytes/sec+ total size is 7493353 speedup is 1.00+ ok+ copy redacted.NEF (to USB...) + redacted+ 19496768 100% 81.77MB/s 0:00:00 (xfer#1, to-check=0/1)+ + sent 19499360 bytes received 31 bytes 12999594.00 bytes/sec+ total size is 19496768 speedup is 1.00+ ok+ copy redacted.JPG (to USB...) + redacted+ 5462482 100% 82.19MB/s 0:00:00 (xfer#1, to-check=0/1)+ + sent 5463360 bytes received 31 bytes 10926782.00 bytes/sec+ total size is 5462482 speedup is 1.00+ ok+ copy redacted.NEF (to USB...) + redacted+ 19669815 100% 80.37MB/s 0:00:00 (xfer#1, to-check=0/1)+ + sent 19672431 bytes received 31 bytes 13114974.67 bytes/sec+ total size is 19669815 speedup is 1.00+ ok+ copy redacted.JPG (to USB...) + redacted+ 5449487 100% 57.40MB/s 0:00:00 (xfer#1, to-check=0/1)+ + sent 5450365 bytes received 31 bytes 3633597.33 bytes/sec+ total size is 5449487 speedup is 1.00+ ok+ copy redacted.NEF (to USB...) + redacted+ 19633259 100% 74.18MB/s 0:00:00 (xfer#1, to-check=0/1)+ + sent 19635871 bytes received 31 bytes 13090601.33 bytes/sec+ total size is 19633259 speedup is 1.00+ ok+ copy redacted.JPG (to USB...) + redacted+ 5392184 100% 62.33MB/s 0:00:00 (xfer#1, to-check=0/1)+ + sent 5393054 bytes received 31 bytes 3595390.00 bytes/sec+ total size is 5392184 speedup is 1.00+ ok+ copy redacted.NEF (to USB...) + redacted+ 18912104 100% 65.00MB/s 0:00:00 (xfer#1, to-check=0/1)+ + sent 18914628 bytes received 31 bytes 12609772.67 bytes/sec+ total size is 18912104 speedup is 1.00+ ok+ copy redacted.JPG (to USB...) + redacted+ 4869300 100% 80.92MB/s 0:00:00 (xfer#1, to-check=0/1)+ + sent 4870106 bytes received 31 bytes 9740274.00 bytes/sec+ total size is 4869300 speedup is 1.00+ ok+ copy redacted.NEF (to USB...) + redacted+ 20178932 100% 68.13MB/s 0:00:00 (xfer#1, to-check=0/1)+ + sent 20181608 bytes received 31 bytes 13454426.00 bytes/sec+ total size is 20178932 speedup is 1.00+ ok+ copy redacted.JPG (to USB...) + redacted+ 4995425 100% 86.05MB/s 0:00:00 (xfer#1, to-check=0/1)+ + sent 4996247 bytes received 31 bytes 9992556.00 bytes/sec+ total size is 4995425 speedup is 1.00+ ok+ copy redacted.NEF (to USB...) + redacted+ 19970679 100% 76.36MB/s 0:00:00 (xfer#1, to-check=0/1)+ + sent 19973331 bytes received 31 bytes 13315574.67 bytes/sec+ total size is 19970679 speedup is 1.00+ ok+ copy redacted.JPG (to USB...) + redacted+ 7905795 100% 66.45MB/s 0:00:00 (xfer#1, to-check=0/1)+ + sent 7906973 bytes received 31 bytes 15814008.00 bytes/sec+ total size is 7905795 speedup is 1.00+ ok+ copy redacted.NEF (to USB...) + redacted+ 21234069 100% 78.07MB/s 0:00:00 (xfer#1, to-check=0/1)+ + sent 21236877 bytes received 31 bytes 8494763.20 bytes/sec+ total size is 21234069 speedup is 1.00+ ok+ copy redacted.JPG (to USB...) + redacted+ 7963979 100% 62.51MB/s 0:00:00 (xfer#1, to-check=0/1)+ + sent 7965165 bytes received 31 bytes 5310130.67 bytes/sec+ total size is 7963979 speedup is 1.00+ git ["--git-dir=copy_target/.git","--work-tree=copy_target","update-index","-z","--index-info"]: Error in fork: forkProcess: resource exhausted (Resource temporarily unavailable)+ + git-annex: user error (git ["--git-dir=copy_target/.git","--work-tree=copy_target","update-index","-z","--index-info"]: Error in fork: forkProcess: resource exhausted (Resource temporarily unavailable))+ failed+ _506 TIMES_ (user error (Error in fork: forkProcess: resource exhausted (Resource temporarily unavailable))) failed+ _11 TIMES_ copy foo (createPipe: resource exhausted (Too many open files)) failed+ _2 TIMES_ (user error (Error in fork: forkProcess: resource exhausted (Resource temporarily unavailable))) failed+ _8574 TIMES_: copy foo (createPipe: resource exhausted (Too many open files)) failed+ git-annex: createPipe: resource exhausted (Too many open files)+ failed+ git-annex: 9101 failed+ + % ls copy_target/.git/annex/tmp/redacted_E13 copy_target/.git/annex/tmp/SHA512E-redacted_E13 # works+ % find source -type l | wc -l+ 13554+ % find copy_target -type l | wc -l+ 13554+ % find copy_target/.git/annex/objects -type f | wc -l+ 4455+ % find source -type f | wc -l+ 13554++> Fixed unreaped process leak.+> (This has nothing to do with NTFS). Ran test with 10k files+> [[done]] --[[Joey]]
@@ -0,0 +1,19 @@+### Please describe the problem.+In a usb drive with a repository in direct mode, when I converted to indirect mode it fails++### What steps will reproduce the problem?+cd /Volumes/usb+git annex indirect++### What version of git-annex are you using? On what operating system?+git-annex version: 4.20130627++### Please provide any additional information below.++[[!format sh """+openFile: resource busy (file is locked)+failed+git-annex: indirect: 1 failed+"""]]++[[!tag moreinfo]]
@@ -0,0 +1,13 @@+Klaus pointed out that there are two problems that keep+git-annex from being used on USB keys, that would typically+be VFAT formatted:++- Use of symlinks, which VFAT does not support. Very hard to fix.+ Instead, just use [[/bare_repositories]] on the key,+ they're supported now.+- Use of ":" in filenames of object files, also not supported.+ Could easily be fixed by reorganizing the object directory.++[[Done]]; in annex.version 2 repos, colons are entirely avoided in+filenames. So a bare git clone can be put on VFAT, and git-annex+used to move stuff --to and --from it, for sneakernet.
@@ -0,0 +1,12 @@+[[!comment format=mdwn+ username="fmarier"+ ip="121.73.248.43"+ subject="Exporting to a FAT filesystem?"+ date="2011-04-04T07:40:41Z"+ content="""+I'm using git-annex to keep my music in sync between all of my different machines. What I'd love to be able to do is to also keep it in sync with my iRiver player. Unfortunately, the firmware, Rockbox, doesn't support ext3, so I'm stuck with a FAT filesystem.++I can see how the design of git-annex makes it rather difficult to get rid of the symlinks, so how about taking a different approach: something like a \"git annex export DEST\" which would take a destination (not a git remote) and rsync the content over to there as regular files.++Maybe \"git annex sync DEST\" or \"git annex rsync DEST\" would be better names if we want to convey the idea that the destination will be made to look like the source repo, including performing the necessary deletions.+"""]]
@@ -0,0 +1,14 @@+[[!comment format=mdwn+ username="http://joey.kitenet.net/"+ nickname="joey"+ subject="comment 2"+ date="2011-04-04T18:20:45Z"+ content="""+Hey @fmarier. Well, this bug report is closed because you can already get rid of the symlinks. Just put a bare git repo on your fat filesystem, and use git-annex copy --to/--from there.++Now, that puts all the files that are on the device in .git/annex/objects/xx/yy/blah.mp3 -- how well rockbox would support that I don't know. And if it tries to modify or delete those files, git annex also can't help you manage those changes.++Another recent option is the [[special_remotes/directory]] special remote type, which again uses \"xx/yy/blah.mp3\" and can't track changes made to the files. This could perhaps be extended in the direction you suggest, although trying to fit this into the special remote infrastructure might not be a good fit really.++The most likely way this has to get dealt with is really by using [[todo/smudge]] filters, which would eliminate the symlinks and allow copying a non-bare git repo onto vfat. +"""]]
@@ -0,0 +1,11 @@+[[!comment format=mdwn+ username="fmarier"+ subject="comment 3"+ date="2011-04-05T10:00:21Z"+ content="""+Thanks for the reply @joey.++While it would certainly be possible for a bare repo to exist on my iRiver, the problem is that the music player uses the filesystem to organize files into directories like \"Artist/Album/Track.ogg\". So replacing that with \"..../xx/yy/Track.ogg\" would make it fairly difficult to browse my music collection and select the album/track I want to listen to :)++So unless I have the files physically organized like the symlinks, then it's probably not going to work very for that particular workflow. Smudge filters are interesting though. In the meantime, I'll look into rsyncing from another box which has the right filesystem layout onto my iRiver directly.+"""]]
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="http://ethan.betacantrips.com/"+ nickname="ethan.glasser.camp"+ subject="no symlinks"+ date="2011-06-08T20:59:38Z"+ content="""+If you try to clone a git repo that has a symlink over to a VFAT filesystem, you get (in its place) a regular file that contains the name of the symlink target. So why can't git-annex use that? I could still do git annex get on this file, git annex would still \"know\" that it's a symlink, and could replace it with a copy of the real file (instead of putting it in .git/annex).++I know if it were that simple, someone would have done it already, so what am I missing? I guess trying to get the file FROM the repository would fail because it wouldn't find the file in .git/annex? Couldn't you store a reverse mapping? You wouldn't be able to move the file around, but you already lose that once you give up symlinks. It would also be a little harder to tell which symlinks were \"dangling\"; I don't see an easy way to get around that. It would still be better than a bare repo..+"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://joey.kitenet.net/"+ nickname="joey"+ subject="comment 5"+ date="2011-06-10T16:41:43Z"+ content="""+@ethan the reason that wouldn't work is because git would then see a file that was checked in and had its one line symlinkish content replaced with a huge binary blob. And git commit would try to commit that etc. The potential for foot-shooting is too high.+"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawkZRoTRyW3tox-FD2DQWxskgI6_tkEtHL4"+ nickname="Ben"+ subject="comment 6"+ date="2012-07-23T16:11:52Z"+ content="""+The above would work fine for me but the files in my annex (e.g. .git/annex/objects/xx/yy/blah.ogg) don't have extensions like that, so my media player doesn't recognize them as media files. How do I get the files under \"objects\" to keep the extensions of the original files like in Joey's example?+"""]]
@@ -0,0 +1,7 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ subject="comment 7"+ date="2012-07-24T14:51:50Z"+ content="""+You can get the extensions by migrating to the SHA1E (or SHA256E) backend. +"""]]
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawmcYryijvlF8bJvM_eZNSrUPEkMlxMDGTQ"+ nickname="Thiago"+ subject="POSIX layer on top of VFAT using FUSE"+ date="2012-11-24T00:21:23Z"+ content="""+I just found out about this project and didn't try it, but it looks like it would allow using git-annex on an usb stick with a normal repository:++<http://sourceforge.net/projects/posixovl/>+"""]]
@@ -0,0 +1,51 @@+**What steps will reproduce the problem?**++ stone@skynet ~/annex $ git init+ Initialized empty Git repository in /home/stone/annex/.git/+ stone@skynet ~/annex $ git annex init "work"+ init work + *** Please tell me who you are.+ + Run+ + git config --global user.email "you@example.com"+ git config --global user.name "Your Name"+ + to set your account's default identity.+ Omit --global to set the identity only in this repository.+ + fatal: empty ident name (for <stone@skynet>) not allowed+ git-annex: git ["--git-dir=/home/stone/annex/.git","--work-tree=/home/stone/annex","commit-tree","4b825dc652cb6eb9a060e64bf8d69288fbee4904"] exited 128+ stone@skynet ~/annex $ git config -l+ user.email=stone@nospam.hu+ user.name=Stone+ core.editor=nano+ color.ui=auto+ core.repositoryformatversion=0+ core.filemode=true+ core.bare=false+ core.logallrefupdates=true+ annex.uuid=499fb545-0b98-4bfc-816c-fb3704f3aaa0+ stone@skynet ~/annex $ cat ~/.gitconfig + [user]+ email = stone@nospam.hu+ name = Stone+ [core]+ editor = nano+ [color]+ ui = auto+ stone@skynet ~/annex $ ++**What is the expected output? What do you see instead?**+++**What version of git-annex are you using? On what operating system?**++commit 56c037c69e75def74d6ea90de8aa8a1954c52178 Arch Linux++**Please provide any additional information below.**++> [[done]] by adding name to the user, in /etc/passwd. --Stone++>> Actually, [[done]] by avoiding clobbering HOME when running some git+>> commands. --[[Joey]]
@@ -0,0 +1,54 @@+### Please describe the problem.++I have a latex file which takes two passes to build. It is in a directory managed by git-annex assistant and configured to use a remote SSH server as a transfer back-end.++If I use latexmk to build the file with the git-assistant on then the build fails. If I turn off the git-assistant it succeeds.++### What steps will reproduce the problem?++[[!format sh """+~/current/www.cmt.mhs.man.ac.uk $ git-annex assistant --autostart+~/current/www.cmt.mhs.man.ac.uk $ latexmk -c admin_guide_cmt.tex+~/current/www.cmt.mhs.man.ac.uk $ latexmk -pdf -silent admin_guide_cmt.tex++Latexmk: Run number 1 of rule 'pdflatex'+This is pdfTeX, Version 3.1415926-2.5-1.40.13 (TeX Live 2013/dev)+ restricted \write18 enabled.+entering extended mode+print() on closed filehandle GEN32 at /usr/bin/latexmk line 4742.+print() on closed filehandle GEN32 at /usr/bin/latexmk line 4759.+print() on closed filehandle GEN32 at /usr/bin/latexmk line 4761.+"""]]++Dropping the silent option shows that the admin_guide_cmt.aux file is not available for writing - despite being created. I suspect that the assistant is somehow locking the file, or using it between passes of latex. If the auxillary files all ready exist then there is no problem (i.e., don't do the cleanup via latexmk -c)++Disabling the assistant makes everything work. Latexmk is doing something odd - I can't replicate with the native latex build commands.++### What version of git-annex are you using? On what operating system?++Latest version, via cabal, on Fedora 18.++### Please provide any additional information below.++Nothing appears wrong with the assistant transfer wise.+[[!format sh """+add www.cmt.mhs.man.ac.uk/admin_guide_cmt.aux (checksum...) ok+add www.cmt.mhs.man.ac.uk/admin_guide_cmt.fdb_latexmk (checksum...) [2013-06-11 14:42:17 BST] Committer: Committing changes to g+it +admin_guide_cmt.fdb_latexmk+ 264 100% 0.00kB/s 0:00:00 (xfer#1, to-check=0/1)++sent 372 bytes received 42 bytes 828.00 bytes/sec+total size is 264 speedup is 0.64+[2013-06-11 14:42:17 BST] Transferrer: Uploaded admin_gui..b_latexmk+[2013-06-11 14:42:18 BST] Committer: Adding 3 files+ok+(Recording state in git...)+add www.cmt.mhs.man.ac.uk/admin_guide_cmt.fls (checksum...) ok+add www.cmt.mhs.man.ac.uk/admin_guide_cmt.log (checksum...) ok++# End of transcript or log.+"""]]++> Ok, I was able to remove the write bit fiddling in direct mode. [[done]]+> --[[Joey]]
@@ -0,0 +1,13 @@+### Please describe the problem.+The files created in another remote when syncing is "now" rather than keeping the modification time of the source file. As such, git-annex assistant is removing an important bit of information about the file.++### What steps will reproduce the problem?+1) create two repositories in your computer using webapp+2) add files to RepoA, see that they are synced to the RepoB.+3) check the file modification times from any file manager. you will see that while files in RepoA carry correct modification time, synced file in RepoB carries current time.++### What version of git-annex are you using? On what operating system?+Ubuntu 13.10 32bit version 4.20130815 from apt-get.++> duplicate of [[todo/add_metadata_to_annexed_files]] --[[Joey]]+> [[done]]
@@ -0,0 +1,21 @@+Should check that there is enough free space before trying to copy a+file around.++* Need a way to tell how much free space is available on the disk containing+ a given repository.++* And, need a way to tell the size of a file before copying it from+ a remote, to check local disk space.++ As of annex.version 2, this metadata can be available for any type+ of backend. Newly added files will always have file size metadata,+ while files that used a SHA backend and were added before the upgrade+ won't.++ So, need a migration process from eg SHA1 to SHA1+filesize. It will+ find files that lack size info, and rename their keys to add the size+ info. Users with old repos can run this on them, to get the missing+ info recorded.++> [[done]]; no migtation process for old SHA1 keys from v1 repo though.+> --[[Joey]]
@@ -0,0 +1,46 @@+When you check several files and the fsck fails, you get confusing output:++<pre>+O fsck test1 (checksum...) +E Only 1 of 2 trustworthy copies of test1 exist.+E Back it up with git-annex copy.+O+O failed+O fsck test2 (checksum...) +E Only 1 of 2 trustworthy copies of test2 exist.+E Back it up with git-annex copy.+O +O failed+</pre>++The newline is in the wrong place and confuses the user. It should be printed _after_ "failed".++> This is a consequence of part of the output being printed to stderr, and+> part to stdout. I've marked the lines above with E and O.+> +> Normally a "failed" is preceeded by a message output to stdout desribing+> the problem; such a message will not be "\n" terminated, so a newline+> is always displayed before "failed". In this case, since the message+> is sent to stderr, it is newline terminated.+> +> Fixing this properly would involve storing state, or rethinking +> when git-annex displays newlines (and I rather like its behavior+> otherwise).+> +> A related problem occurs if an error message is unexpetedly printed.+> Dummying up an example:+> +> O get test1 (from foo...) E git-annex: failed to run ssh+> failed+> +> --[[Joey]] ++>> Well, I fixed this in all cases except a thrown non-IO error (last+>> example aboce), which output is printed by haskell's runtime. I'd+>> have to add a second error handler to handle those, and it's not+>> clear what it would do. Often an error will occur before anything+>> else is printed, and then the current behavior is right; if something+>> has been printed it would be nice to have a newline before the error,+>> but by the time the error is caught we'd be out of the annex monad+>> and not really have any way to know if something has been printed.+>> I think my fix is good enough [[done]] --[[Joey]]
@@ -0,0 +1,3 @@+git annex fsck marks files as bad when the checksumming fails. But this could also be due to a read error when the actual data stored is correct. So, fsck should check twice when a checksum fails.++> [[done]]; apparently problem was caused by bad RAM. --[[Joey]]
@@ -0,0 +1,35 @@+What steps will reproduce the problem?+What is the expected output? What do you see instead?++I can reproduce it locally, but don't know what's causing it. The file content is the same, I checked with md5sum and sha512sum. But fsck still thinks the content is different. Are there other factors I could check which fsck looks at? I'm using SHA512E backend.++What version of git-annex are you using? On what operating system?++git-annex version: 3.20120807 Ubuntu 12.04 updated on Aug 20th annex was installed via cabal on Aug 20th, all other packages are from ubuntu.++> What is the error message from fsck? --[[Joey]] ++This is the output:++> reinject ....Moon.avi (checksum...) +> Bad file content; moved to /mnt/.../.git/annex/bad/SHA512E-s94402560--ead9db1f34739014a216239d9624bce74d92fe723de06505f9b94cb4c063142ba42b04546f11d3d33869b736e40ded2ff779cb32b26aa10482f09407df0f3c8d.Moon.avi+failed+> (Recording state in git...)+> git-annex: reinject: 1 failed++The original file also has sha512 ead9db1f34739014a216239d9624bce74d92fe723de06505f9b94cb4c063142ba42b04546f11d3d33869b736e40ded2ff779cb32b26aa10482f09407df0f3c8d++>> And what sha512 does the file in .git/annex/bad have **now**? (fsck+>> preserves the original filename; this says nothing about what the+>> current checksum is, if the file has been corrupted). --[[Joey]]++The same, as it's the file I was trying to inject:++ead9db1f34739014a216239d9624bce74d92fe723de06505f9b94cb4c063142ba42b04546f11d3d33869b736e40ded2ff779cb32b26aa10482f09407df0f3c8d .git/annex/bad/SHA512E-s94402560--ead9db1f34739014a216239d9624bce74d92fe723de06505f9b94cb4c063142ba42b04546f11d3d33869b736e40ded2ff779cb32b26aa10482f09407df0f3c8d.Moon.avi++That's what puzzles me, it is the same file, but for some weird reason git annex thinks it's not.++> Ok, reproduced and fixed the bug. The "E" backends recently got support+> for 2 levels of filename extensions, but were not made to drop them both+> when fscking. [[done]] (I'll release a fixed version probably tomorrow;+> fix is in git now.) --[[Joey]]
@@ -0,0 +1,19 @@+git-annex 4.20130911 on Debian Wheezy.++Using `git annex initremote type=gcrypt` as described [here](http://git-annex.branchable.com/tips/fully_encrypted_git_repositories_with_gcrypt/) creates the repository and pushes the `git-annex` branch to it. It doesn't push `master` (or more generally: the currently checked out branch), as I have verified using `git remote show`.++Manually pushing the branch makes `git annex sync` sync both branches with the gcrypt remote.++I think that it should push the current branch upon creation of the special remote, since for at least me, the whole reason for wanting `git-remote-gcrypt` is that metadata as well as data can be stored encrypted on an SSH server.++Thanks for considering this.++> The git-annex branch is pushed by initremote because I have to push+> *something* to determine the gcrypt-id. However, this is an implementation+> detail, and not a feature of initremote. (It's more like a bug of+> git-remote-gcrypt.)+> +> `git annex sync` will always push your currently checked out branch,+> as well as the git-annex branch, no matter what `initremote` has done.+> +> [[done]] --[[Joey]]
@@ -0,0 +1,40 @@+Not sure what caused this, but I have a file that exists on two remotes, but I can only get it from one of them. If I try to get it from the other, it fails immediately (without even connecting):++ pilot:~/vid/tv/Show$ git annex whereis Show\ -\ S03E08.mp4+ whereis Show - S03E08.mp4 (2 copies) + 09c0b436-f8de-11e0-842f-b7644539d57f -- psychosis+ 82814942-f8e0-11e0-b053-e70a61e98e19 -- bucket+ ok++ pilot:~/vid/tv/Show$ git annex fsck Show\ -\ S03E08.mp4+ fsck Show - S03E08.mp4 ok++ pilot:~/vid/tv/Show$ git annex get --from bucket Show\ -\ S03E08.mp4+ get Show - S03E08.mp4 failed+ git-annex: get: 1 failed++ pilot:~/vid/tv/Show$ git annex get --debug --from bucket Show\ -\ S03E08.mp4+ [2013-01-17 19:05:13 EST] read: git ["--git-dir=/home/jim/vid/.git","--work-tree=/home/jim/vid","show-ref","git-annex"]+ [2013-01-17 19:05:13 EST] read: git ["--git-dir=/home/jim/vid/.git","--work-tree=/home/jim/vid","show-ref","--hash","refs/heads/git-annex"]+ [2013-01-17 19:05:13 EST] read: git ["--git-dir=/home/jim/vid/.git","--work-tree=/home/jim/vid","log","refs/heads/git-annex..e41c3b1ee9127129f2c9fc3fa5d4771afcb5ffd7","--oneline","-n1"]+ [2013-01-17 19:05:13 EST] read: git ["--git-dir=/home/jim/vid/.git","--work-tree=/home/jim/vid","log","refs/heads/git-annex..a7ae08bccede282f46c2073f6c3e52685a593482","--oneline","-n1"]+ [2013-01-17 19:05:13 EST] read: git ["--git-dir=/home/jim/vid/.git","--work-tree=/home/jim/vid","log","refs/heads/git-annex..ae0f84e906423f4da465e3d3df9d46545684d3f5","--oneline","-n1"]+ [2013-01-17 19:05:13 EST] chat: git ["--git-dir=/home/jim/vid/.git","--work-tree=/home/jim/vid","cat-file","--batch"]+ [2013-01-17 19:05:13 EST] read: git ["--git-dir=/home/jim/vid/.git","--work-tree=/home/jim/vid","ls-files","--cached","-z","--","Show - S03E08.mp4"]+ get Show - S03E08.mp4 failed+ git-annex: get: 1 failed++Same `git annex version` on both `pilot` and `bucket`, and I ran `git annex sync` on both.++ git-annex version: 3.20130114+ local repository version: 3+ default repository version: 3+ supported repository versions: 3+ upgrade supported from repository versions: 0 1 2++How should I debug this?++> [[done]], in c6fbed48 I had made some changes to allow transfers+> to work from readonly filesystems, but a too broad error trapping+> hid the "transfer already in progress" error it is supposed to display+> in this case. --[[Joey]]
@@ -0,0 +1,40 @@+### Please describe the problem.++Creating a SSH remote git-annex repository using the assisstant gives transcript:++Initialized empty shared Git repository in /home/flindner/annex2/+exec: 76: git-annex: Argument list too long++### What steps will reproduce the problem?++Using assistent: Creating a new empty local repository. Next, add another remote server repository using SSH. Checking the server went fine. I choose creating git repository. After about 5 minutes the error message above appears. In that time on the server runshell and git take plenty of CPU power but almost no memory. The directory on the server is created, but pairing was not successfull.++### What version of git-annex are you using? On what operating system?++Local: git-annex-standalone 4.20130909-1 from Archlinux AUR+Remote: git-annex-standalone-i386.tar.gz as of 13. sept. 13. on Debian Squeeze.++### 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++daemon.log is empty.++Log from the web GUI:++[2013-09-13 12:34:11 CEST] main: starting assistant version 4.20130827-g4f18612++ No known network monitor available through dbus; falling back to polling+(scanning...) [2013-09-13 12:34:11 CEST] Watcher: Performing startup scan+(started...) +++# End of transcript or log.+"""]]++> [[done]]; I have added a guard to runshell to detect when it has+> started to loop. Although I don't understand how a system could be+> misconfigured to let that happen, without going far out of your way to +> mess it up, it's a failure mode that's worth guarding against. --[[Joey]]
@@ -0,0 +1,34 @@+What steps will reproduce the problem?++ alip@hayalet /tmp/aaa (git)-[master] % git annex init aaa+ init aaa ok+ (Recording state in git...)+ alip@hayalet /tmp/aaa (git)-[master] % git remote add çüş /tmp/çüş+ alip@hayalet /tmp/aaa (git)-[master] % git annex sync --debug+ git ["--git-dir=/tmp/aaa/.git","--work-tree=/tmp/aaa","symbolic-ref","HEAD"]+ git ["--git-dir=/tmp/aaa/.git","--work-tree=/tmp/aaa","show-ref","git-annex"]+ git ["--git-dir=/tmp/aaa/.git","--work-tree=/tmp/aaa","show-ref","--hash","refs/heads/git-annex"]+ git ["--git-dir=/tmp/aaa/.git","--work-tree=/tmp/aaa","log","refs/heads/git-annex..bc45cd9c2cb7c9b0c7a12a4c0210fe6a262abac9","--oneline","-n1"]+ git ["--git-dir=/tmp/aaa/.git","--work-tree=/tmp/aaa","log","refs/heads/git-annex..9220bfedd1e13b2d791c918e2d59901af353825f","--oneline","-n1"]+ (merging origin/git-annex into git-annex...)+ git ["--git-dir=/tmp/aaa/.git","--work-tree=/tmp/aaa","cat-file","--batch"]+ git ["--git-dir=/tmp/aaa/.git","--work-tree=/tmp/aaa","update-index","-z","--index-info"]+ git ["--git-dir=/tmp/aaa/.git","--work-tree=/tmp/aaa","diff-index","--raw","-z","-r","--no-renames","-l0","--cached","9220bfedd1e13b2d791c918e2d59901af353825f"]+ git-annex: Cannot decode byte '\xfc': Data.Text.Encoding.decodeUtf8: Invalid UTF-8 stream+ 1 alip@hayalet /tmp/aaa (git)-[master] % ++What is the expected output? What do you see instead?++Syncing a repository under a path with utf-8 characters in its name fails.++What version of git-annex are you using? On what operating system?++git-annex version: 3.20120624++On Exherbo, linux-3.4++Please provide any additional information below.++'\xfc' is valid UTF-8: 'LATIN SMALL LETTER U WITH DIAERESIS'++> closing as non-reproducible and presumably fixed. [[done]] --[[Joey]]
@@ -0,0 +1,22 @@+What steps will reproduce the problem?++As a default user i want to start git-annex assistent with++`$ git-annex webapp`++`git-annex: Not in a git repository.`++What is the expected output? What do you see instead?++I would expect the assistent to popup in a opened browser window.++What version of git-annex are you using? On what operating system?++Debian wheezy with git-annex version: 3.20130114++Please provide any additional information below.++Its working if i start `git-annex webapp` as root. I had the same error on previous version.++> I've made some improvements. Think this was user error. [[done]]+> --[[Joey]]
@@ -0,0 +1,51 @@+[[!tag moreinfo]]++### Please describe the problem.++git-annex webapp won't run ++### What steps will reproduce the problem?++[[!format sh """+arthur@machine:~/annex$ git-annex --debug webapp+[2013-07-29 15:02:15 CEST] read: git ["--git-dir=/home/arthur/annex/.git","--work-tree=/home/arthur/annex","show-ref","git-annex"]+[2013-07-29 15:02:15 CEST] read: git ["--git-dir=/home/arthur/annex/.git","--work-tree=/home/arthur/annex","show-ref","--hash","refs/heads/git-annex"]+[2013-07-29 15:02:15 CEST] read: git ["--git-dir=/home/arthur/annex/.git","--work-tree=/home/arthur/annex","log","refs/heads/git-annex..a2b8f10ef258dff1a91e0354b2e2a58241631c9a","--oneline","-n1"]+error: object file /home/arthur/annex/.git/objects/a2/b8f10ef258dff1a91e0354b2e2a58241631c9a is empty+fatal: loose object a2b8f10ef258dff1a91e0354b2e2a58241631c9a (stored in /home/arthur/annex/.git/objects/a2/b8f10ef258dff1a91e0354b2e2a58241631c9a) is corrupt+[2013-07-29 15:02:15 CEST] read: git ["--git-dir=/home/arthur/annex/.git","--work-tree=/home/arthur/annex","log","refs/heads/git-annex..8d4b8e04ccf0092d625f680b42e73d7bf15c6517","--oneline","-n1"]+error: object file /home/arthur/annex/.git/objects/a2/b8f10ef258dff1a91e0354b2e2a58241631c9a is empty+fatal: loose object a2b8f10ef258dff1a91e0354b2e2a58241631c9a (stored in /home/arthur/annex/.git/objects/a2/b8f10ef258dff1a91e0354b2e2a58241631c9a) is corrupt+[2013-07-29 15:02:15 CEST] read: git ["--git-dir=/home/arthur/annex/.git","--work-tree=/home/arthur/annex","log","refs/heads/git-annex..6b2665208c11c9ecf969294bf45baac31894d8a7","--oneline","-n1"]+error: object file /home/arthur/annex/.git/objects/a2/b8f10ef258dff1a91e0354b2e2a58241631c9a is empty+fatal: loose object a2b8f10ef258dff1a91e0354b2e2a58241631c9a (stored in /home/arthur/annex/.git/objects/a2/b8f10ef258dff1a91e0354b2e2a58241631c9a) is corrupt+[2013-07-29 15:02:15 CEST] read: git ["--git-dir=/home/arthur/annex/.git","--work-tree=/home/arthur/annex","log","refs/heads/git-annex..9d8429668f2148ea43760fb430e5950fbf42751e","--oneline","-n1"]+error: object file /home/arthur/annex/.git/objects/a2/b8f10ef258dff1a91e0354b2e2a58241631c9a is empty+fatal: loose object a2b8f10ef258dff1a91e0354b2e2a58241631c9a (stored in /home/arthur/annex/.git/objects/a2/b8f10ef258dff1a91e0354b2e2a58241631c9a) is corrupt+[2013-07-29 15:02:15 CEST] chat: git ["--git-dir=/home/arthur/annex/.git","--work-tree=/home/arthur/annex","cat-file","--batch"]++git-annex: fd:14: hGetLine: end of file+failed+[2013-07-29 15:02:15 CEST] read: ssh ["-O","stop","-S","/home/arthur/annex/.git/annex/ssh/arthur@git-annex-hostname-arthur_annex","-o","ControlMaster=auto","-o","ControlPersist=yes","arthur@git-annex-hostname-arthur_annex"]+git-annex: webapp: 1 failed+"""]]+++### What version of git-annex are you using? On what operating system?+++$ git-annex version+git-annex version: 4.20130516.1+build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP+local repository version: 3+default repository version: 3+supported repository versions: 3 4+upgrade supported from repository versions: 0 1 2++$ git --version+git version 1.7.9.5+++### Please provide any additional information below.++
@@ -0,0 +1,13 @@+What steps will reproduce the problem?+ Start "./git-annex-webapp"++What is the expected output? What do you see instead?+ The webapp should start, but I get the error "git-annex: getUserEntryForID: failed (Success)"++What version of git-annex are you using? On what operating system?+ 3.20121017 on "Ubuntu 10.04.4 LTS" 32-Bit++Please provide any additional information below.+++> [[fixed|done]] --[[Joey]]
@@ -0,0 +1,25 @@+Hi++I have a 1 To repository on my local linux box++when i try :++ git annex status++i get :++ git-annex: /media/malima/nazare/.git/annex/tmp/0723300. Everywhere I Dub --: getFileStatus: does not exist (No such file or directory)+ failed++how could i fix this issue ?++many thanks for help++> [[done]]; I managed to reproduce this bug by making a temp file named+> ".git/annex/tmp/foo-", or indeed with any dash in it. This is enough+> to make git-annex think it's a key, but badly formed enough that+> it fails trying to use that key. Fixed to ignore such non-key files.+> +> I'm unsure why `.git/annex/tmp` would have such files in it.+> Perhaps the assistant was running, but crashed while adding files?+> --[[Joey]]
@@ -0,0 +1,43 @@+ $ pwd+ [bla]/git-annex-3.20130216.1+ $ runhaskell Setup configure --prefix=/usr --libdir=/usr/lib64 --docdir=/usr/share/doc/git-annex-3.20130216.1-r2 \+ --htmldir=/usr/share/doc/git-annex-3.20130216.1-r2/html --with-compiler=ghc-7.6.2 --enable-shared \+ --disable-executable-stripping --global --verbose --enable-tests --flags=S3 --flags=-WebDAV --flags=-Inotify \+ --flags=Dbus --flags=-Assistant --flags=-Webapp --flags=-Pairing --flags=-XMPP --flags=-DNS+ $ runhaskell Setup.hs build+ Building git-annex-3.20130217...+ Preprocessing test suite 'test' for git-annex-3.20130217...+ + Annex/UUID.hs:30:8:+ Could not find module `System.Random'+ It is a member of the hidden package `random-1.0.1.1'.+ Perhaps you need to add `random' to the build-depends in your .cabal file.+ Use -v to see a list of the files searched for.++Adding `random` to the dependencies of the test suite results in:++ $ runhaskell Setup.hs build+ Building git-annex-3.20130217...+ Preprocessing test suite 'test' for git-annex-3.20130217...+ + Annex/UUID.hs:29:18:+ Could not find module `Data.UUID'+ It is a member of the hidden package `uuid-1.2.9'.+ Perhaps you need to add `uuid' to the build-depends in your .cabal file.+ Use -v to see a list of the files searched for.++Adding `uuid` results in:++ $ runhaskell Setup.hs build+ Building git-annex-3.20130217...+ Preprocessing test suite 'test' for git-annex-3.20130217...+ + Command/Add.hs:25:8:+ Could not find module `Utility.Touch'+ Use -v to see a list of the files searched for.+++Also: you included ".git-annex.cabal.swp" in the tarball.++> These problems in the cabal file were fixed the other day. [[done]]+> --[[Joey]]
@@ -0,0 +1,32 @@+What steps will reproduce the problem?++1. Create a fresh git-annex repository+2. Add a directory tree to it with about 300,000 files in it+3. wait+4. change the tree; attempt a git commit++What is the expected output? What do you see instead?++git commit hangs due to the large number of loose objects created during the git annex add. If git annex had stopped to repack the git repo a few times along the way, I think this might have been avoided.++What version of git-annex are you using? On what operating system?++git-annex version: 4.20130323+local repository version: 3+default repository version: 3+supported repository versions: 3 4+upgrade supported from repository versions: 0 1 2+build flags: Assistant Webapp Pairing Testsuite S3 WebDAV FsEvents XMPP DNS++Darwin pluto.local 12.3.0 Darwin Kernel Version 12.3.0: Sun Jan 6 22:37:10 PST 2013; root:xnu-2050.22.13~1/RELEASE_X86_64 x86_64+(Mac OS 10.8.3)++git version 1.8.2++> Based on the benchmarks below, repacking even once does not speed things+> up; repacking repeatedly as `git annex add` runs would slow things down.+> +> It might be worth following up with the git developers why `git commit`+> scans loose objects after it has already output the commit sha1sum.+> +> Don't see any improvements git-annex can make. [[done]] --[[Joey]]
@@ -0,0 +1,95 @@+Below is a test case which shows a way that the git-annex branch+can become corrupted and lose data, including location log records and+uuid.log lines.++At the end, a commit on the git-annex branch removes one of the 2 lines+from the uuid.log; which should never happen.++The actual problem occurs earlier, at the "push point". Here a repo is+cloned from the main one, initialized (adding the last uuid.log line),+and then pushed back to the main one. That push is a fast-forward, so is+allowed to directly update the git-annex branch in the main repo:++ b884fe5..c497739 git-annex -> git-annex++Now the git-annex branch has a change that is not reflected in+`.git/annex/index`, so the next time a change is made, it's committed+using the out of date index, which causes a reversion of the changes+that were pushed to the branch.++---++## Thoughts++This is essentially the same reason why git blocks pushes to the checked-out+branch of a non-bare repository. ++This problem only affects workflows that involve pushing. Pulling workflows+do not directly update the local git-annex branch, so avoid the problem.++And while bare repos are pushed to, they rarely have changes made directly+to their git-annex branches, so while I think the same problem could+happen with pushing to a bare repo, it's unlikely.++None of which is to say this is not a bad bug that needs to be comprehensively+fixed. ++Probably git-annex needs to record which ref of the git-annex branch+corresponds to its index, and if the branch is at a different ref,+merge it into the index.++> And now that's [[done]]. I managed to do it with very little slowdown.+> +> A side benefit is that users can now safely check out the git-annex+> branch and commit changes to it, and git-annex will notice them.+> Before, it was documented to ignore such changes.+> --[[Joey]] ++---++## Workaround++Users who want to prevent this bug from occuring when pushing to their+non-bare repositories can install this script as `.git/hooks/update`++<pre>+#!/bin/sh+if [ "$1" = refs/heads/git-annex ]; then+ exit 1+fi+</pre>++--[[Joey]] ++---++## Test Case+<pre>+#!/bin/sh+mkdir annextest+cd annextest++git init dir1+cd dir1+git annex init+touch foo +echo hi > bar+git annex add+git commit -m add++cd ..+git clone dir1 dir2+cd dir2+git annex init otherdir+git annex get+# push point+git push++cd ..+cd dir1+echo "before"+git show git-annex:uuid.log+git annex drop foo --force+echo "after"+git show git-annex:uuid.log+</pre>
@@ -0,0 +1,45 @@+The fix for the [[git-annex_branch_corruption]] bug is subject to a race.+With that fix, git-annex does this when committing a change to the branch:++1. lock the journal file (this avoids git-annex racing itself, FWIW)+2. check what the head of the branch points to, to see if a newer branch+ has appeared+3. if so, updates the index file from the branch+4. stages changes in the index+5. commits to the branch using the index file++If a push to the branch comes in during 2-5, then+[[git-annex_branch_corruption]] could still occur.++---++## approach 1, using locking++Add an update hook and a post-update hook. The update hook+will use locking to ensure that no git-annex is currently running+a commit, and block any git-annex's from starting one. It+will background itself, and remain running during the push.+The post-update hook will signal it to exit.++I don't like this approach much, since it involves a daemon, two hooks,+and lots of things to go wrong. And it blocks using git-annex during a+push. This approach should be a last resort.++## approach 2, lockless method++After a commit is made to the branch, check to see if the parent of+the commit is the same ref that the index file was last updated to. If it's+not, then the race occurred.++How to recover from the race? Well, just union merging the parent of the+commit into the index file and re-committing should work, I think. When+the race occurs, the commit reverts its parent's changes, and this will+redo them. ++(Of course, this re-commit will also be subject to the race, and+will need the same check for the race as the other commits. It won't loop+forever, I hope.)++> [[done]] and tested.++--[[Joey]]
@@ -0,0 +1,3 @@+As per [[install/Android/#comment-e218073735d67691a2c3f66cc53ca6ac]] and [[install/Android/#comment-29bd13ab9cb830ffcd7850b84fb111c8]] :++git-annex is broken on Android 4.3; both on Nexus 4 and Nexus 7.
@@ -0,0 +1,100 @@+Currently the hashed directories in .git-annex allow for upper and lower case directory names... on linux (or any case sensitive filesystem) the directory names such as 'Gg' and 'GG' are different and unique. However on systems like OSX (and probably windows if it is ever supported) the directory names 'Gg' is the same as 'GG'++In one of the annex'd repos that I have this has occured...++<pre>+$ git add -i + staged unstaged path+ 1: unchanged +1/-1 .git-annex/GM/GV/WORM-s183630166-m1301072171--somefile.log+ 2: unchanged +1/-1 .git-annex/Gm/GV/WORM-s183630166-m1301072171--somefile.log+</pre>+++this has somewhat confused git when it tries to stage/merge files, I didn't notice this at first, but it is definately a problem for someone using case insensitive filesystems like the default OSX HFS+ formats or vfat/fat32.++> I feel a bit stupid to not have considered case-insensative filesystems.+> They are just so far from where I have lived for 20 years that it's hard+> to keep them in mind.+> +> I guess that+> [[git-annex_has_issues_with_git_when_staging__47__commiting_logs]] is+> somehow a consequence (or cause?) of this, but I don't quite understand+> how this is causing git to fail to stage files, or stage the same file+> twice under different capitalizations. git-annex always will run git add+> on the path with the "correct" capitalization. So unless something else+> has added the path with the other capitalization (perhaps git add+> .git-annex manually?) I don't understand how you get to this state.+> --[[Joey]]++>> I think I got myself into this situation when I copied some files over from a HFS+ partition to a GPFS network share (which is pretty posix compliant) over samba. It probably is related to the [[git-annex_has_issues_with_git_when_staging__47__commiting_logs]]. I thought they were unique enough to have two bug reports logged as one is a git behavioural thing and the other is git-annex specific.++>>> If you copied `.git/` over, perhaps you got a git repo without+>>> core.ignorecase set right for the filesystem it landed on?++>>>> I usually git clone or do a fresh repository and pull things in, I was also unaware of this ignorecase setting as well.++>>> +>>> Something like this might reproduce it:++<pre>+# mkdir test; cd test; git init+# git config core.ignorecase false+# mkdir Foo+# touch Foo/bar+# git add Foo/bar+# git add foo/bar+# git add fOo/bar+# git status+# touch foo/other+# git add fOo/other+# git status+</pre>++>>>> And then either git commit or git clone would probably get confused+>>>> if it thought 3 distinct files had been committed.+>>>> --[[Joey]]++>>>>> Doing the above test on a HFS+ partition yields this++<pre>+## with ignorecase=false+commit bb024c6fd7482b2d10f60ae899cb7a949aca1ad8+Author: Jimmy Tang <jtang@exia>+Date: Sun Mar 27 18:40:24 2011 +0100++ commit++diff --git a/Foo/bar b/Foo/bar+new file mode 100644+index 0000000..e69de29+diff --git a/fOo/bar b/fOo/bar+new file mode 100644+index 0000000..e69de29+diff --git a/fOo/other b/fOo/other+new file mode 100644+index 0000000..e69de29+diff --git a/foo/bar b/foo/bar+new file mode 100644+index 0000000..e69de29+</pre>++>>>>> and without changing ignorecase++<pre>+commit 909a089158ffb98f8e91f98905e2bfdc7234666f+Author: Jimmy Tang <jtang@exia>+Date: Sun Mar 27 18:46:57 2011 +0100++ commit++diff --git a/Foo/bar b/Foo/bar+new file mode 100644+index 0000000..e69de29+diff --git a/Foo/other b/Foo/other+new file mode 100644+index 0000000..e69de29+</pre>++> Closing this bug, as it seems I have dealt with it adequately now.+> [[done]]+> --[[Joey]]
@@ -0,0 +1,12 @@+Hi Joey,++I have a repository with many thousands of unused files. It's hard to know exactly how many because it takes up to 5 seconds to print the name of every single one, so I'm largely guessing based on my knowledge of what I've recently deleted.++When I run `git annex dropunused FOO`, it doesn't matter what `FOO` is -- a number, a range, the word "foo" -- the `dropunused` command returns to the prompt instantly in all cases.++What can I do to drop all these unused files eating up i-nodes? Is there a debug flag I can turn on?++Thanks,+ John++> added a message [[done]] --[[Joey]]
@@ -0,0 +1,36 @@+What steps will reproduce the problem?++ ~$ mkdir testannex+ ~$ cd testannex/+ testannex$ git init+ Initialized empty Git repository in /Users/ed/testannex/.git/+ testannex$ git annex init "test annex"+ init test annex ok+ (Recording state in git...)+ testannex$ echo "file1" > file1+ testannex$ git annex add file1+ add file1 (checksum...) ok+ (Recording state in git...)+ testannex$ mkdir directory+ testannex$ mv file1 directory/+ testannex$ cat directory/file1 + cat: directory/file1: No such file or directory+ testannex$ git annex fix directory/file1+ git-annex: directory/file1 not found+++What is the expected output? What do you see instead?++ git annex fix should fix the symlink. It looks like maybe it's *following* the symlink?++What version of git-annex are you using? On what operating system?++ checkout: 20d195f compiled on OS X 10.7 using cabal. ++Please provide any additional information below.++ git annex assistant is not noticing file renames either.++> git-annex commands (other than `git annex add`) only operate on files+> checked into git, which `directory/file1` is not, since you did not use+> `git mv`. Once you `git add` the file, it'll work. [[done]] --[[Joey]]
@@ -0,0 +1,41 @@+### Please describe the problem.++I setup 3 repositories on my laptop and 3 on my server using the webapp, see the following scheme:++Laptop <- sync with -> Server++ /home/fabian/Dokumente (Client) <-> /mnt/raid/Dokumente (Full-Backup)+ /home/fabian/Bilder (Client) <-> /mnt/raid/Bilder (Full-Backup)+ /mnt/data-common/Audio (Manual) <-> /mnt/raid/Audio (Full-Backup)++As you can see, the Audio folder is in manual mode on the laptop, so it does not get any files automatically.+If I now want to get a folder with 'git-annex get' I get the following error:++ fabian@fabian-thinkpad /mnt/data-common/Audio $ git-annex get Musik+ get Musik/+⁄-/2003 - You Are Here (Bonus Disc)/01 - I've Been Lost.ogg (from eifel.fritz.box__mnt_raid_Audio...) + requested key is not present+ rsync: connection unexpectedly closed (0 bytes received so far) [Receiver]+ rsync error: error in rsync protocol data stream (code 12) at io.c(605) [Receiver=3.0.9]++ Unable to access these remotes: eifel.fritz.box__mnt_raid_Audio+ + Try making some of these repositories available:+ efe13d8c-2b02-455f-9874-b7043caa332f -- eifel.fritz.box__mnt_raid_Audio (fabian@eifel:/mnt/raid/Audio)+ failed++### What steps will reproduce the problem?++I do not really know the minimal setup to reproduce this problem.++### What version of git-annex are you using? On what operating system?++git-annex 4.20130417 on Gentoo Linux using Ebuilds from Haskell overlay++> I suspect this was some kind of misconfiguration, or +> one of the kinds of data corruption that git-annex can automatically heal from. +> +> I am pretty sure I didn't make any changes to git-annex that caused+> the problem to stop happening!+> +> While it would be very good to get to the bottom of this, I don't see+> any benefit to keeping this report open without more info. [[done]] --[[Joey]]
@@ -0,0 +1,34 @@+After a series of pretty convoluted copying files around between annex'd repos and pulling changes around between repos. I noticed that occassionally when git-annex tries to stage files (the `.git-annex/*/*/*logs`) git some times gets wedged and doing a "git commit -a" doesn't seem to work or files might not get added thus leaving a bunch of untracked files or modified files that aren't staged for a commit.++I tried running a *`git rm --cached -f -r *`* then *git add -u .git-annex/* or the usual *git add* then a commit fixes things for me. If I don't do that then my subsequent merges/pulls will fail and result in *no known copies of files* I suspect git-annex might have just touched some file modes and git picked up the changes but got confused since there was no content change. It might also just be a git on OSX thing and it doesn't affect linux/bsd users.++For now it's just a bit of extra work for me when it does occur but it does not seem to occur often.++> What do you mean when you say that git "got wedged"? It hung somehow?+>+> If git-annex runs concurrently with another git command that locks+> the repository, its git add of log files can fail.+> +> Update: Also, of course, if you are running a "got annex get" or+> similar, and ctrl-c it after it has gotten some files, it can+> end up with unstaged or in some cases un-added log files that git-annex+> wrote -- since git-annex only stages log files in git on shutdown, and+> ctrl-c bypasses that.+> --[[Joey]] ++>> It "got wedged" as in git doesn't let me commit anything, even though it tells me that there is stuff to be committed in the staging area.++>>> I've never seen git refuse to commit staged files. There would have to+>>> be some error message? --[[Joey]] ++>>>> there were no error messages at all++>>>>> Can I see a transcript? I'm having difficulty getting my head around+>>>>> what git is doing. Sounds like the files could just not be `git+>>>>> added` yet, but I get the impression from other things that you say+>>>>> that it's not so simple. --[[Joey]] ++This turns out to be a bug in git, and I have posted a bug report on the mailing list.+The git-annex behavior that causes this situation is being handled as+another bug, [[git-annex directory hashing problems on osx]].+So, closing this bug report. [[done]] --[[Joey]]
@@ -0,0 +1,27 @@+### Please describe the problem.++I have some files that I want to drop from my laptop. However, as soon as I drop them (git-annex drop), the assistant starts to download them again from another repository. At first glance, this seems like a variant of [[bugs/Handling_of_files_inside_and_outside_archive_directory_at_the_same_time]].++I would expect that after an explicit drop command, the files would not be re-downloaded.++The repository that this is happening on is a "client" type, direct-mode repository.++### What steps will reproduce the problem?++ git annex drop drop-test/TestFile.data++### What version of git-annex are you using? On what operating system?+ git-annex version: 4.20130618-g333cb8e+ build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP DNS+ local repository version: 4+ default repository version: 3+ supported repository versions: 3 4+ upgrade supported from repository versions: 0 1 2++ I am running Ubuntu 13.04++### Please provide any additional information below.++log emailed.++> [[done]]; not a bug, should use manual mode if manually deciding which files are in a repository --[[Joey]]
@@ -0,0 +1,59 @@+I have a git remote in a git-annex-enabled repository. Here's what it looks like in .git/config:++<pre>+[remote "renaissance"]+ url = ssh://[2001:0:53aa:64c:24ef:5ce4:2ef9:cdda]/home/paulproteus/Music/annex/+ fetch = +refs/heads/*:refs/remotes/renaissance/*+ annex-uuid = 2992752e-1a13-11e0-ba68-57d3c800da64+</pre>++I wanted to "git annex get" some data. git-annex appears to pass incorrectly-formatted IPv6 addresses to rsync:++<pre>+get primary/emusiq/Arab Strap/Monday At The Hug And Pint/01-The Shy Retirer.mp3 (copying from renaissance...) +ssh: Could not resolve hostname [2001:0:53aa:64c:24ef:5ce4:2ef9:cdda]: Name or service not known+rsync: connection unexpectedly closed (0 bytes received so far) [Receiver]+rsync error: unexplained error (code 255) at io.c(601) [Receiver=3.0.7]++ rsync failed -- run git annex again to resume file transfer+ Unable to access these remotes: renaissance+ Try making some of these repositories available:+ 2992752e-1a13-11e0-ba68-57d3c800da64+failed+</pre>++In this case, the square brackets should not be there.++I tried changing the .git/config syntax slightly, and got a different, also-incorrect behavior:++<pre>+[remote "renaissance"]+ url = [2001:0:53aa:64c:24ef:5ce4:2ef9:cdda]:/home/paulproteus/Music/annex/+ fetch = +refs/heads/*:refs/remotes/renaissance/*+ annex-uuid = 2992752e-1a13-11e0-ba68-57d3c800da64+</pre>++<pre>+paulproteus@pathi:~/Music/annex$ git annex get+git-annex: bad url ssh://[2001/~/0:53aa:64c:24ef:5ce4:2ef9:cdda]:/home/paulproteus/Music/annex/+</pre>++(Note that both these .git/config entries work fine with "git fetch".)++-- Asheesh.++> Technically, this seems to be a bug in the haskell URI library; it honors+> the `[]` in parsing, but does not remove them when the URI is queried for+> the host part. ++<pre>+Prelude Network.URI> let (Just u) = parseURI "http://foo@[2001:0:53aa:64c:24ef:5ce4:2ef9:cdda]/bar"+Prelude Network.URI> let (Just a) = uriAuthority u+Prelude Network.URI> uriRegName a+"[2001:0:53aa:64c:24ef:5ce4:2ef9:cdda]"+Prelude Network.URI> isIPv6address $ uriRegName a+False+</pre>++> I have filed a [bug upstream](http://trac.haskell.org/network/ticket/40), and put a workaround in git-annex. [[done]]+> --[[Joey]]
@@ -0,0 +1,103 @@+Somehow git-annex has again lost a complete rsync remote with encryption enabled...++git-annex version was 3.20111111++> "once again" ? When did it do it before?++>> It's the second time i uploaded all the files to an encrypted rsync remote and git-annex is not able to find it anymore. --[[gebi]]++> "lost" ? How is the remote lost?++>> git-annex is not able to find any files on the encrypted rsync remote anymore.+>> Copy does not copy the content again but drop doesn't find it, thus it's somehow "lost" and in an strange state.+>> I've also had the state where the content was already on the remote side but git-annex copy would copy it again,+>> ignoring all the data on the remote side. --[[gebi]]++Both *remoteserver* and *localserver* are rsync remotes with enabled encryption.+All commands are executed on the git repository on my laptop.+Target of origin is a gitolite repository without annex support (thus the two rsync remotes).++Is there a way in git-annex to verify that all files fullfill the numcopies, in my case+numcopies=2, and can be read from the remotes their are on?+I thought that *copy* would verify that, but seems not.+ + % g a copy --to remoteserver tools+ copy tools/md5_sha1_utility.exe (gpg) (checking remoteserver...) ok+ copy tools/win32diskimager-RELEASE-0.2-r23-win32.zip (checking remoteserver...) ok+ + % g a copy --to localserver tools+ copy tools/md5_sha1_utility.exe (gpg) (checking localserver...) ok+ copy tools/win32diskimager-RELEASE-0.2-r23-win32.zip (checking localserver...) ok+ + % g a drop tools+ drop tools/md5_sha1_utility.exe (gpg) (checking localserver...) (checking remoteserver...) (unsafe)+ Could only verify the existence of 1 out of 2 necessary copies+ + Try making some of these repositories available:+ 718a9b5c-1b4a-11e1-8211-6f094f20e050 -- remoteserver (remote backupserver)+ + (Use --force to override this check, or adjust annex.numcopies.)+ failed+ drop tools/win32diskimager-RELEASE-0.2-r23-win32.zip (checking localserver...) (checking remoteserver...) (unsafe)+ Could only verify the existence of 1 out of 2 necessary copies+ + Try making some of these repositories available:+ 718a9b5c-1b4a-11e1-8211-6f094f20e050 -- remoteserver (remote backupserver)+ + (Use --force to override this check, or adjust annex.numcopies.)+ failed+ git-annex: drop: 2 failed+ + % g a fsck tools+ fsck tools/md5_sha1_utility.exe (checksum...) ok+ fsck tools/win32diskimager-RELEASE-0.2-r23-win32.zip (checksum...) ok++> Copy does do an explicit check that the content is present on remoteserver,+> and based on the above, the content was found to be already there,+> which is why it did not copy it again.+> +> Drop does an indentical check that the content is present, and +> since it failed to find it, I am left thinking something must have+> happened to the remove in between the copy and the drop to cause the+> content to go away.+> +> What happens if you copy the data to remoteserver again? --[[Joey]]++The commands above are executed within a few seconds and completely repeatable. --[[gebi]]++> In that case, why don't you run the commands with `-d` to see the actual+> rsync command it's running to check if the content is present. +> Then you can try repeatedly running the command by hand and see why it+> sometimes succeeds and sometimes fail.++The commands fail and succeed consistently, not either or.+git annex copy succeeds consistently with not copying the content to remote because it checks and it's already there.++git annex drop fails consistently with error because content is missing on the exact same remote git annex copy checks+and thinks the content is there. --[[gebi]]++> The command will be something like this:+> `rsync --quiet hostname:/dir/file 2>/dev/null`+> +> The exit status is what's used to see if content is present -- and+> currently any failure even a failure to connect is taken to mean it's not+> present. --[[Joey]]++hm... thats interesting, git annex drop and git annex copy check for different hashes on the same file at the same remote...++git annex drop -d tools/md5_sha1_utility.exe+> Running: sh ["-c","rsync --quiet 'REMOVED_HOST:annex/work/JF/z7/'\"'\"'GPGHMACSHA1--7ffb3840f0e37aee964352e98808403655e8473a/GPGHMACSHA1--7ffb3840f0e37aee964352e98808403655e8473a'\"'\"'' 2>/dev/null"]++git annex copy --to remoteserver -d tools/md5_sha1_utility.exe+> Running: sh ["-c","rsync --quiet 'REMOVED_HOST:annex/work/1F/PQ/'\"'\"'GPGHMACSHA1--ff075e57f649300c5698e346be74fb6e22d70e35/GPGHMACSHA1--ff075e57f649300c5698e346be74fb6e22d70e35'\"'\"'' 2>/dev/null"]++And yes, only the hash *annex copy* is checking for exists on the remote side. --[[gebi]]++> Ok, this is due to too aggressive caching of the decrypted cipher+> for a remote. When dopping, it decrypts localserver's cipher, +> caches it, and then when checking remoteserver it says hey, +> here's an already decrypted cipher -- it must be the right one!+> +> Problem reproduced here, and fixed. [[done]] --[[Joey]]++THX Joey! -- [[gebi]]
@@ -0,0 +1,16 @@+### Please describe the problem.++Running git-annex merge shows the output "git-annex merge ", followed by a blinking cursor. The command never seems to end.++### What steps will reproduce the problem?+++### What version of git-annex are you using? On what operating system?++4.20130827-gd04d9bb on MacOS X Mountain Lion++### Please provide any additional information below.++dtruss output at https://www.dropbox.com/s/4b3yqn7ajfz5el2/annex-merge.log++[[!meta title="no indication when git-annex is stuck waiting for a lock"]]
@@ -0,0 +1,32 @@+What steps will reproduce the problem?++ $ git clone ~/corbeau/travail/ travail+ Cloning into 'travail'...+ done.+ Checking out files: 100% (8670/8670), done.+ $ cd travail+ $ git annex init "portable USB drive"+ init portable USB drive + Detected a crippled filesystem.++ Enabling direct mode.++ git-annex: /media/LACIE/travail/.git/annex/objects/k1: createDirectory: already exists (File exists)+ failed+ git-annex: init: 1 failed++What version of git-annex are you using? On what operating system?+ $ apt-cache policy git-annex+ git-annex:+ Installé : 3.20130216++This on a amd64 debian sid recently updated+++Please provide any additional information below.++The problem is that git annex already created a /media/LACIE/travail/.git/annex/objects/K1 file (same name in uppercase) and FAT isn't realy case sensitive.+++> I *think* I've found the place that used createDirectory+> rather than createDirectoryIfMissing and fixed it. [[done]] --[[Joey]]
@@ -0,0 +1,40 @@+[[!meta title="network-muticast FD leak fix not deployed to Linux autobuilds yet"]]++### Please describe the problem.+After running git-annex some minutes, the websites is not responsible any more and it even crashes eventually.++### What steps will reproduce the problem?+Start the assistant.++### What version of git-annex are you using? On what operating system?+it-annex version: 4.20130802-g1452ac3+build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP++### Please provide any additional information below.++[[!format sh """+# If you can, paste a complete transcript of the problem occurring here.+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log+[2013-08-06 13:32:51 CEST] main: starting assistant version 4.20130802-g1452ac3 + +Already up-to-date. +(scanning...) [2013-08-06 13:32:51 CEST] Watcher: Performing startup scan + +Already up-to-date. +(started...) +git-annex: accept: resource exhausted (Too many open files) +[2013-08-06 19:50:37 CEST] read: git ["--git-dir=/home/christian/git-annex/.git","--work-tree=/home/+christian/git-annex","symbolic-ref","HEAD"] +git-annex: runInteractiveProcess: pipe: Too many open files +[2013-08-06 19ND:ea5te1Wm:ao1tn1cS htCeaErtSFuTas]l lcNbreaatcsWkha etcdcr:ha es/rhh:eo dmd:ee /tgc+eihctrt:ie sdct rineaeantt/wegoPirrtko- cacenosnnsen:xe /cr.tegisiootnu/ +racnen[ e2ex0x/1h:3a -uo0sp8te-en0dT6 e (m1Tp9oF:oi5 l1me:a:1n 1yr eCosEpoSeuTnr] c feri eleaexdsh:+)a +ugsitte d[ "(-T-ogoi tm-adniyr =o/pheonm ef/iclhersi)s +tian/git-annex/.git","--work-tree=/home/christian/git-annex","symbolic-ref","HEAD"] +git-annex: runInteractiveProcess: pipe: Too many open files +git-annex: git: createProcess: resource exhausted (Too many open files) +[2013-08-06 19:51:11 CEST] NetWatcherFallback: warning NetWatcherFallback crashed: git: createProces+s: resource exhausted (Too many open files) +[2013-08-06 19:51:11 CEST] DaemonStatus: warning DaemonStatus crashed: /home/christian/git-annex/.gi+t/annex/: openTempFile: resource exhausted (Too many open files) ++(system was asleep from 14:00 until 19:50)++# End of transcript or log.+"""]]
@@ -0,0 +1,358 @@+### Please describe the problem.++I installed the git-annex app for MacOSX (10.8.4)++### What steps will reproduce the problem?++- Created a repository+- In the configuration, entered my google username/password++### What version of git-annex are you using? On what operating system?++bundle version: 0.0.1++### Please provide any additional information below.++[[!format sh """+# If you can, paste a complete transcript of the problem occurring here.+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log++Process: git-annex [12934]+Path: /Applications/git-annex.app/Contents/MacOS/bundle/git-annex+Identifier: git-annex+Version: 0+Code Type: X86-64 (Native)+Parent Process: ??? [1]+User ID: 502++Date/Time: 2013-08-17 12:27:12.495 -0700+OS Version: Mac OS X 10.8.4 (12E55)+Report Version: 10+Sleep/Wake UUID: 6DB42174-0147-4C8B-B83E-F305823297CA++Interval Since Last Report: 294009 sec+Crashes Since Last Report: 4+Per-App Crashes Since Last Report: 4+Anonymous UUID: 0D492F72-DAE5-360C-A6D6-ECB38FD53115++Crashed Thread: 3++Exception Type: EXC_BAD_ACCESS (SIGSEGV)+Exception Codes: KERN_INVALID_ADDRESS at 0x0000000000000000++VM Regions Near 0:+--> + __TEXT 000000010b5e6000-000000010e08d000 [ 42.7M] r-x/rwx SM=COW /Applications/git-annex.app/Contents/MacOS/bundle/git-annex++Thread 0:: Dispatch queue: com.apple.main-thread+0 libsystem_kernel.dylib 0x00007fff931400fa __psynch_cvwait + 10+1 libsystem_c.dylib 0x00007fff86adffe9 _pthread_cond_wait + 869+2 git-annex 0x000000010df20179 0x10b5e6000 + 43229561+3 git-annex 0x000000010defc8eb 0x10b5e6000 + 43084011+4 git-annex 0x000000010df0bc86 0x10b5e6000 + 43146374+5 git-annex 0x000000010df0c6fb 0x10b5e6000 + 43149051+6 git-annex 0x000000010df07b46 0x10b5e6000 + 43129670+7 git-annex 0x000000010df07c69 0x10b5e6000 + 43129961+8 git-annex 0x000000010bcff518 0x10b5e6000 + 7443736+9 libdyld.dylib 0x00007fff8c3e47e1 start + 1++Thread 1:+0 libsystem_kernel.dylib 0x00007fff931400fa __psynch_cvwait + 10+1 libsystem_c.dylib 0x00007fff86adffe9 _pthread_cond_wait + 869+2 git-annex 0x000000010df20179 0x10b5e6000 + 43229561+3 git-annex 0x000000010defc8eb 0x10b5e6000 + 43084011+4 git-annex 0x000000010df0bc86 0x10b5e6000 + 43146374+5 git-annex 0x000000010df0c5e0 0x10b5e6000 + 43148768+6 libsystem_c.dylib 0x00007fff86adb7a2 _pthread_start + 327+7 libsystem_c.dylib 0x00007fff86ac81e1 thread_start + 13++Thread 2:+0 libsystem_kernel.dylib 0x00007fff931400fa __psynch_cvwait + 10+1 libsystem_c.dylib 0x00007fff86adffe9 _pthread_cond_wait + 869+2 git-annex 0x000000010df20179 0x10b5e6000 + 43229561+3 git-annex 0x000000010defc8eb 0x10b5e6000 + 43084011+4 git-annex 0x000000010df0bc86 0x10b5e6000 + 43146374+5 git-annex 0x000000010df0c5e0 0x10b5e6000 + 43148768+6 libsystem_c.dylib 0x00007fff86adb7a2 _pthread_start + 327+7 libsystem_c.dylib 0x00007fff86ac81e1 thread_start + 13++Thread 3 Crashed:+0 libsystem_c.dylib 0x00007fff86ae0bf9 pthread_mutex_lock + 20+1 H 0x000000010e9fd29f gnutls_system_mutex_lock + 12+2 H 0x000000010ea7fa29 wrap_nettle_rnd_refresh + 20+3 H 0x000000010e9fee89 gnutls_deinit + 42+4 git-annex 0x000000010caf0a3a 0x10b5e6000 + 22063674++Thread 4:+0 libsystem_kernel.dylib 0x00007fff93140d2a kevent64 + 10+1 git-annex 0x000000010deab5fa 0x10b5e6000 + 42751482++Thread 5:+0 libsystem_kernel.dylib 0x00007fff931400fa __psynch_cvwait + 10+1 libsystem_c.dylib 0x00007fff86adffe9 _pthread_cond_wait + 869+2 git-annex 0x000000010df20179 0x10b5e6000 + 43229561+3 git-annex 0x000000010defc8eb 0x10b5e6000 + 43084011+4 git-annex 0x000000010df0bc86 0x10b5e6000 + 43146374+5 git-annex 0x000000010df0c5e0 0x10b5e6000 + 43148768+6 libsystem_c.dylib 0x00007fff86adb7a2 _pthread_start + 327+7 libsystem_c.dylib 0x00007fff86ac81e1 thread_start + 13++Thread 6:: Dispatch queue: com.apple.libdispatch-manager+0 libsystem_kernel.dylib 0x00007fff93140d16 kevent + 10+1 libdispatch.dylib 0x00007fff8e6fedea _dispatch_mgr_invoke + 883+2 libdispatch.dylib 0x00007fff8e6fe9ee _dispatch_mgr_thread + 54++Thread 7:+0 libsystem_kernel.dylib 0x00007fff9313e686 mach_msg_trap + 10+1 libsystem_kernel.dylib 0x00007fff9313dc42 mach_msg + 70+2 com.apple.CoreFoundation 0x00007fff8c1e2233 __CFRunLoopServiceMachPort + 195+3 com.apple.CoreFoundation 0x00007fff8c1e7916 __CFRunLoopRun + 1078+4 com.apple.CoreFoundation 0x00007fff8c1e70e2 CFRunLoopRunSpecific + 290+5 com.apple.CoreFoundation 0x00007fff8c1f5dd1 CFRunLoopRun + 97+6 git-annex 0x000000010c72b3ec 0x10b5e6000 + 18109420+7 libsystem_c.dylib 0x00007fff86adb7a2 _pthread_start + 327+8 libsystem_c.dylib 0x00007fff86ac81e1 thread_start + 13++Thread 8:+0 libsystem_kernel.dylib 0x00007fff9313e686 mach_msg_trap + 10+1 libsystem_kernel.dylib 0x00007fff9313dc42 mach_msg + 70+2 com.apple.CoreFoundation 0x00007fff8c1e2233 __CFRunLoopServiceMachPort + 195+3 com.apple.CoreFoundation 0x00007fff8c1e7916 __CFRunLoopRun + 1078+4 com.apple.CoreFoundation 0x00007fff8c1e70e2 CFRunLoopRunSpecific + 290+5 com.apple.CoreFoundation 0x00007fff8c1f5dd1 CFRunLoopRun + 97+6 git-annex 0x000000010c72b3ec 0x10b5e6000 + 18109420+7 libsystem_c.dylib 0x00007fff86adb7a2 _pthread_start + 327+8 libsystem_c.dylib 0x00007fff86ac81e1 thread_start + 13++Thread 9:+0 libsystem_kernel.dylib 0x00007fff9313e686 mach_msg_trap + 10+1 libsystem_kernel.dylib 0x00007fff9313dc42 mach_msg + 70+2 com.apple.CoreFoundation 0x00007fff8c1e2233 __CFRunLoopServiceMachPort + 195+3 com.apple.CoreFoundation 0x00007fff8c1e7916 __CFRunLoopRun + 1078+4 com.apple.CoreFoundation 0x00007fff8c1e70e2 CFRunLoopRunSpecific + 290+5 com.apple.CoreFoundation 0x00007fff8c1f5dd1 CFRunLoopRun + 97+6 git-annex 0x000000010c72b3ec 0x10b5e6000 + 18109420+7 libsystem_c.dylib 0x00007fff86adb7a2 _pthread_start + 327+8 libsystem_c.dylib 0x00007fff86ac81e1 thread_start + 13++Thread 3 crashed with X86 Thread State (64-bit):+ rax: 0x000000010eaaca28 rbx: 0x00007f9dc38000c0 rcx: 0x000000010f87ce00 rdx: 0x000000010e3c28f0+ rdi: 0x0000000000000000 rsi: 0x001c4500001c4500 rbp: 0x000000010f87ce10 rsp: 0x000000010f87cdd0+ r8: 0x0000000000002060 r9: 0x000000010f87ce00 r10: 0x000000010eabf328 r11: 0x000000010e9fee5f+ r12: 0x000000010f5585d8 r13: 0x000000010e3c2798 r14: 0x0000000000000000 r15: 0x000000010f548140+ rip: 0x00007fff86ae0bf9 rfl: 0x0000000000010202 cr2: 0x0000000000000000+Logical CPU: 0++Binary Images:+ 0x10b5e6000 - 0x10e08cff7 +git-annex (0) <2C4C13B3-4830-322A-A144-9E51B386EB1E> /Applications/git-annex.app/Contents/MacOS/bundle/git-annex+ 0x10e85a000 - 0x10e957ff7 +E (22.3) <47B09CB2-C636-3024-8B55-6040F7829B4C> /Applications/git-annex.app/Contents/MacOS/bundle/E+ 0x10e990000 - 0x10e9a4fff +F (0) <FA90B1B1-A866-3A6C-BB97-06955F4C8C0B> /Applications/git-annex.app/Contents/MacOS/bundle/F+ 0x10e9ab000 - 0x10e9d8ff7 +G (0) <D80652C0-9A55-351C-8EAF-2364359BA0A2> /Applications/git-annex.app/Contents/MacOS/bundle/G+ 0x10e9de000 - 0x10eaabfdf +H (0) <29C3AFF5-8EFB-3A16-81F6-0DA6CF2675A6> /Applications/git-annex.app/Contents/MacOS/bundle/H+ 0x10eadd000 - 0x10eaefff7 +B (43) <2A1551E8-A272-3DE5-B692-955974FE1416> /Applications/git-annex.app/Contents/MacOS/bundle/B+ 0x10eaf7000 - 0x10ebecfff +D (34) <FEE8B996-EB44-37FA-B96E-D379664DEFE1> /Applications/git-annex.app/Contents/MacOS/bundle/D+ 0x10ec01000 - 0x10ed1992f +I (532.2) <90D31928-F48D-3E37-874F-220A51FD9E37> /Applications/git-annex.app/Contents/MacOS/bundle/I+ 0x10ed3d000 - 0x10ef3dfff +S (491.11.3) <5783D305-04E8-3D17-94F7-1CEAFA975240> /Applications/git-annex.app/Contents/MacOS/bundle/S+ 0x10f048000 - 0x10f06dff7 +Z (26) <D86169F3-9F31-377A-9AF3-DB17142052E4> /Applications/git-annex.app/Contents/MacOS/bundle/Z+ 0x10f0a1000 - 0x10f109ff7 +0A (65.1) <20E31B90-19B9-3C2A-A9EB-474E08F9FE05> /Applications/git-annex.app/Contents/MacOS/bundle/0A+ 0x10f163000 - 0x10f1ccfff +0B (56) <EAA2B53E-EADE-39CF-A0EF-FB9D4940672A> /Applications/git-annex.app/Contents/MacOS/bundle/0B+ 0x10f235000 - 0x10f248fff +T (0) <C8970714-4C86-3BE6-94D6-4835DCC8A003> /Applications/git-annex.app/Contents/MacOS/bundle/T+ 0x10f257000 - 0x10f264ff7 +U (0) <DCFF385A-090B-3407-868C-91544A2EFEE1> /Applications/git-annex.app/Contents/MacOS/bundle/U+ 0x10f26f000 - 0x10f291ff7 +V (0) <51B317C7-94CC-3C58-B515-924BB3AF0BCC> /Applications/git-annex.app/Contents/MacOS/bundle/V+ 0x10f29b000 - 0x10f2a8ff7 +W (0) <91CF16BE-027F-3FE6-B1EE-6B8BFD51FC1B> /Applications/git-annex.app/Contents/MacOS/bundle/W+ 0x10f2b4000 - 0x10f310fd7 +X (0) <84D934AF-A321-36C0-BBCF-CD3FDAEB0B95> /Applications/git-annex.app/Contents/MacOS/bundle/X+ 0x7fff6b1e6000 - 0x7fff6b21a93f dyld (210.2.3) <36CAA36E-72BC-3E48-96D9-B96A2DF77730> /usr/lib/dyld+ 0x7fff8652a000 - 0x7fff865d0ff7 com.apple.CoreServices.OSServices (557.6 - 557.6) <FFDDD2D8-690D-388F-A48F-4750A792D2CD> /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/OSServices.framework/Versions/A/OSServices+ 0x7fff865d1000 - 0x7fff865e8fff libGL.dylib (8.9.2) <B8E5948D-BCF2-3727-B74E-D74B8EDC82D6> /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGL.dylib+ 0x7fff865e9000 - 0x7fff86610fff com.apple.framework.familycontrols (4.1 - 410) <50F5A52C-8FB6-300A-977D-5CFDE4D5796B> /System/Library/PrivateFrameworks/FamilyControls.framework/Versions/A/FamilyControls+ 0x7fff86611000 - 0x7fff8663cfff libxslt.1.dylib (11.3) <441776B8-9130-3893-956F-39C85FFA644F> /usr/lib/libxslt.1.dylib+ 0x7fff86649000 - 0x7fff86698ff7 libcorecrypto.dylib (106.2) <CE0C29A3-C420-339B-ADAA-52F4683233CC> /usr/lib/system/libcorecrypto.dylib+ 0x7fff8669d000 - 0x7fff866a3fff com.apple.DiskArbitration (2.5.2 - 2.5.2) <C713A35A-360E-36CE-AC0A-25C86A3F50CA> /System/Library/Frameworks/DiskArbitration.framework/Versions/A/DiskArbitration+ 0x7fff866a4000 - 0x7fff86ac1fff FaceCoreLight (2.4.1) <DDAFFD7A-D312-3407-A010-5AEF3E17831B> /System/Library/PrivateFrameworks/FaceCoreLight.framework/Versions/A/FaceCoreLight+ 0x7fff86ac7000 - 0x7fff86b93ff7 libsystem_c.dylib (825.26) <4C9EB006-FE1F-3F8F-8074-DFD94CF2CE7B> /usr/lib/system/libsystem_c.dylib+ 0x7fff86d50000 - 0x7fff86da1ff7 com.apple.SystemConfiguration (1.12.2 - 1.12.2) <581BF463-C15A-363B-999A-E830222FA925> /System/Library/Frameworks/SystemConfiguration.framework/Versions/A/SystemConfiguration+ 0x7fff86dee000 - 0x7fff86deefff com.apple.Accelerate.vecLib (3.8 - vecLib 3.8) <B5A18EE8-DF81-38DD-ACAF-7076B2A26225> /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/vecLib+ 0x7fff86def000 - 0x7fff86df4fff com.apple.OpenDirectory (10.8 - 151.10) <CF44120B-9B01-32DD-852E-C9C0E1243FC0> /System/Library/Frameworks/OpenDirectory.framework/Versions/A/OpenDirectory+ 0x7fff86df5000 - 0x7fff86df6fff libDiagnosticMessagesClient.dylib (8) <8548E0DC-0D2F-30B6-B045-FE8A038E76D8> /usr/lib/libDiagnosticMessagesClient.dylib+ 0x7fff86e0a000 - 0x7fff87201fff libLAPACK.dylib (1073.4) <D632EC8B-2BA0-3853-800A-20DA00A1091C> /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libLAPACK.dylib+ 0x7fff87622000 - 0x7fff87650ff7 libsystem_m.dylib (3022.6) <B434BE5C-25AB-3EBD-BAA7-5304B34E3441> /usr/lib/system/libsystem_m.dylib+ 0x7fff8766c000 - 0x7fff8769dff7 com.apple.DictionaryServices (1.2 - 184.4) <FB0540FF-5034-3591-A28D-6887FBC220F7> /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/DictionaryServices.framework/Versions/A/DictionaryServices+ 0x7fff8769e000 - 0x7fff8769efff libkeymgr.dylib (25) <CC9E3394-BE16-397F-926B-E579B60EE429> /usr/lib/system/libkeymgr.dylib+ 0x7fff87732000 - 0x7fff87754ff7 libxpc.dylib (140.43) <70BC645B-6952-3264-930C-C835010CCEF9> /usr/lib/system/libxpc.dylib+ 0x7fff87755000 - 0x7fff877d7ff7 com.apple.Heimdal (3.0 - 2.0) <C94B0C6C-1320-35A1-8143-FE252E7B2A08> /System/Library/PrivateFrameworks/Heimdal.framework/Versions/A/Heimdal+ 0x7fff877d8000 - 0x7fff87859fff com.apple.Metadata (10.7.0 - 707.11) <2DD25313-420D-351A-90F1-300E95C970CA> /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/Metadata.framework/Versions/A/Metadata+ 0x7fff87cbf000 - 0x7fff87d19fff com.apple.print.framework.PrintCore (8.3 - 387.2) <5BA0CBED-4D80-386A-9646-F835C9805B71> /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/PrintCore.framework/Versions/A/PrintCore+ 0x7fff87e27000 - 0x7fff87e34ff7 com.apple.NetAuth (4.0 - 4.0) <F5BC7D7D-AF28-3C83-A674-DADA48FF7810> /System/Library/PrivateFrameworks/NetAuth.framework/Versions/A/NetAuth+ 0x7fff87f54000 - 0x7fff87f68fff com.apple.speech.synthesis.framework (4.1.12 - 4.1.12) <94EDF2AB-809C-3D15-BED5-7AD45B2A7C16> /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/SpeechSynthesis.framework/Versions/A/SpeechSynthesis+ 0x7fff87f77000 - 0x7fff87f7dff7 libunwind.dylib (35.1) <21703D36-2DAB-3D8B-8442-EAAB23C060D3> /usr/lib/system/libunwind.dylib+ 0x7fff87fab000 - 0x7fff87fabfff com.apple.Accelerate (1.8 - Accelerate 1.8) <6AD48543-0864-3D40-80CE-01F184F24B45> /System/Library/Frameworks/Accelerate.framework/Versions/A/Accelerate+ 0x7fff88161000 - 0x7fff88162ff7 libSystem.B.dylib (169.3) <9089D72D-E714-31E1-80C8-698A8E8B05AD> /usr/lib/libSystem.B.dylib+ 0x7fff88167000 - 0x7fff88205ff7 com.apple.ink.framework (10.8.2 - 150) <3D8D16A2-7E01-3EA1-B637-83A36D353308> /System/Library/Frameworks/Carbon.framework/Versions/A/Frameworks/Ink.framework/Versions/A/Ink+ 0x7fff88222000 - 0x7fff88223ff7 libsystem_sandbox.dylib (220.3) <B739DA63-B675-387A-AD84-412A651143C0> /usr/lib/system/libsystem_sandbox.dylib+ 0x7fff88224000 - 0x7fff88228ff7 com.apple.TCC (1.0 - 1) <F2F3B753-FC73-3543-8BBE-859FDBB4D6A6> /System/Library/PrivateFrameworks/TCC.framework/Versions/A/TCC+ 0x7fff88229000 - 0x7fff88230fff libcopyfile.dylib (89) <876573D0-E907-3566-A108-577EAD1B6182> /usr/lib/system/libcopyfile.dylib+ 0x7fff88a6e000 - 0x7fff88a8dff7 libresolv.9.dylib (51) <0882DC2D-A892-31FF-AD8C-0BB518C48B23> /usr/lib/libresolv.9.dylib+ 0x7fff88a8e000 - 0x7fff88aa1ff7 libbsm.0.dylib (32) <F497D3CE-40D9-3551-84B4-3D5E39600737> /usr/lib/libbsm.0.dylib+ 0x7fff88bbd000 - 0x7fff88bbdfff com.apple.ApplicationServices (45 - 45) <A3ABF20B-ED3A-32B5-830E-B37831A45A80> /System/Library/Frameworks/ApplicationServices.framework/Versions/A/ApplicationServices+ 0x7fff88bce000 - 0x7fff88bf6fff libJPEG.dylib (850) <DC750E1E-BD07-339B-A4A6-D86BFE969F68> /System/Library/Frameworks/ImageIO.framework/Versions/A/Resources/libJPEG.dylib+ 0x7fff88bf7000 - 0x7fff88bf9fff libquarantine.dylib (52.1) <143B726E-DF47-37A8-90AA-F059CFD1A2E4> /usr/lib/system/libquarantine.dylib+ 0x7fff88fe0000 - 0x7fff8933ffff com.apple.Foundation (6.8 - 945.18) <1D7E58E6-FA3A-3CE8-AC85-B9D06B8C0AA0> /System/Library/Frameworks/Foundation.framework/Versions/C/Foundation+ 0x7fff89340000 - 0x7fff89575ff7 com.apple.CoreData (106.1 - 407.7) <A676E1A4-2144-376B-92B8-B450DD1D78E5> /System/Library/Frameworks/CoreData.framework/Versions/A/CoreData+ 0x7fff89576000 - 0x7fff8957dfff libGFXShared.dylib (8.9.2) <398F8D57-EC82-3E13-AC8E-470BE19237D7> /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGFXShared.dylib+ 0x7fff895d4000 - 0x7fff8a201fff com.apple.AppKit (6.8 - 1187.39) <199962F0-B06B-3666-8FD5-5C90374BA16A> /System/Library/Frameworks/AppKit.framework/Versions/C/AppKit+ 0x7fff8a202000 - 0x7fff8a519ff7 com.apple.CoreServices.CarbonCore (1037.6 - 1037.6) <1E567A52-677F-3168-979F-5FBB0818D52B> /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/CarbonCore.framework/Versions/A/CarbonCore+ 0x7fff8a5e0000 - 0x7fff8a5e7fff com.apple.NetFS (5.0 - 4.0) <82E24B9A-7742-3DA3-9E99-ED267D98C05E> /System/Library/Frameworks/NetFS.framework/Versions/A/NetFS+ 0x7fff8a5e8000 - 0x7fff8a63fff7 com.apple.ScalableUserInterface (1.0 - 1) <F1D43DFB-1796-361B-AD4B-39F1EED3BE19> /System/Library/Frameworks/QuartzCore.framework/Versions/A/Frameworks/ScalableUserInterface.framework/Versions/A/ScalableUserInterface+ 0x7fff8a71b000 - 0x7fff8a767ff7 libauto.dylib (185.4) <AD5A4CE7-CB53-313C-9FAE-673303CC2D35> /usr/lib/libauto.dylib+ 0x7fff8a768000 - 0x7fff8a768fff libOpenScriptingUtil.dylib (148.3) <F8681222-0969-3B10-8BCE-C55A4B9C520C> /usr/lib/libOpenScriptingUtil.dylib+ 0x7fff8a7e7000 - 0x7fff8a808ff7 libCRFSuite.dylib (33) <736ABE58-8DED-3289-A042-C25AF7AE5B23> /usr/lib/libCRFSuite.dylib+ 0x7fff8a809000 - 0x7fff8a815fff com.apple.CrashReporterSupport (10.8.3 - 418) <DE6AFE16-D97E-399D-82ED-3522C773C36E> /System/Library/PrivateFrameworks/CrashReporterSupport.framework/Versions/A/CrashReporterSupport+ 0x7fff8a816000 - 0x7fff8b1a64af com.apple.CoreGraphics (1.600.0 - 332) <5AB32E51-9154-3733-B83B-A9A748652847> /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/CoreGraphics.framework/Versions/A/CoreGraphics+ 0x7fff8b1a7000 - 0x7fff8b1befff com.apple.CFOpenDirectory (10.8 - 151.10) <10F41DA4-AD54-3F52-B898-588D9A117171> /System/Library/Frameworks/OpenDirectory.framework/Versions/A/Frameworks/CFOpenDirectory.framework/Versions/A/CFOpenDirectory+ 0x7fff8b242000 - 0x7fff8b285ff7 com.apple.bom (12.0 - 192) <0BF1F2D2-3648-36B7-BE4B-551A0173209B> /System/Library/PrivateFrameworks/Bom.framework/Versions/A/Bom+ 0x7fff8b286000 - 0x7fff8b2c3fef libGLImage.dylib (8.9.2) <C38649ED-E1C9-315E-9953-F33E8C6A3C89> /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGLImage.dylib+ 0x7fff8b2c4000 - 0x7fff8b303ff7 com.apple.QD (3.42.1 - 285.1) <77A20C25-EBB5-341C-A05C-5D458B97AD5C> /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/QD.framework/Versions/A/QD+ 0x7fff8b304000 - 0x7fff8b39efff libvMisc.dylib (380.6) <714336EA-1C0E-3735-B31C-19DFDAAF6221> /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libvMisc.dylib+ 0x7fff8b3b8000 - 0x7fff8b566fff com.apple.QuartzCore (1.8 - 304.3) <F450F2DE-2F24-3557-98B6-310E05DAC17F> /System/Library/Frameworks/QuartzCore.framework/Versions/A/QuartzCore+ 0x7fff8ba39000 - 0x7fff8ba4cff7 com.apple.LangAnalysis (1.7.0 - 1.7.0) <2F2694E9-A7BC-33C7-B4CF-8EC907DF0FEB> /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/LangAnalysis.framework/Versions/A/LangAnalysis+ 0x7fff8bd12000 - 0x7fff8bd1cfff com.apple.speech.recognition.framework (4.1.5 - 4.1.5) <D803919C-3102-3515-A178-61E9C86C46A1> /System/Library/Frameworks/Carbon.framework/Versions/A/Frameworks/SpeechRecognition.framework/Versions/A/SpeechRecognition+ 0x7fff8c0d6000 - 0x7fff8c0d7ff7 libdnsinfo.dylib (453.19) <14202FFB-C3CA-3FCC-94B0-14611BF8692D> /usr/lib/system/libdnsinfo.dylib+ 0x7fff8c179000 - 0x7fff8c17efff libcompiler_rt.dylib (30) <08F8731D-5961-39F1-AD00-4590321D24A9> /usr/lib/system/libcompiler_rt.dylib+ 0x7fff8c1b2000 - 0x7fff8c39cff7 com.apple.CoreFoundation (6.8 - 744.19) <0F7403CA-2CB8-3D0A-992B-679701DF27CA> /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation+ 0x7fff8c39d000 - 0x7fff8c3c4ff7 com.apple.PerformanceAnalysis (1.16 - 16) <E4888388-F41B-313E-9CBB-5807D077BDA9> /System/Library/PrivateFrameworks/PerformanceAnalysis.framework/Versions/A/PerformanceAnalysis+ 0x7fff8c3e2000 - 0x7fff8c3e5ff7 libdyld.dylib (210.2.3) <F59367C9-C110-382B-A695-9035A6DD387E> /usr/lib/system/libdyld.dylib+ 0x7fff8c3e6000 - 0x7fff8c3e8fff libCVMSPluginSupport.dylib (8.9.2) <EF1192AC-3357-3A0B-BFAF-6594D7737892> /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libCVMSPluginSupport.dylib+ 0x7fff8c3e9000 - 0x7fff8c484fff com.apple.CoreSymbolication (3.0 - 117) <50716F74-41C2-3BB9-AC16-12C4D4C2DD1E> /System/Library/PrivateFrameworks/CoreSymbolication.framework/Versions/A/CoreSymbolication+ 0x7fff8c75b000 - 0x7fff8c75bfff com.apple.CoreServices (57 - 57) <9DD44CB0-C644-35C3-8F57-0B41B3EC147D> /System/Library/Frameworks/CoreServices.framework/Versions/A/CoreServices+ 0x7fff8cf1f000 - 0x7fff8d094ff7 com.apple.CFNetwork (596.4.3 - 596.4.3) <A57B3308-2F08-3EC3-B4AC-39A3D9F0B9F7> /System/Library/Frameworks/CFNetwork.framework/Versions/A/CFNetwork+ 0x7fff8d0ae000 - 0x7fff8d0e4fff libsystem_info.dylib (406.17) <4FFCA242-7F04-365F-87A6-D4EFB89503C1> /usr/lib/system/libsystem_info.dylib+ 0x7fff8d0e5000 - 0x7fff8d148ff7 com.apple.audio.CoreAudio (4.1.1 - 4.1.1) <9ACD3AED-6C04-3BBB-AB2A-FC253B16D093> /System/Library/Frameworks/CoreAudio.framework/Versions/A/CoreAudio+ 0x7fff8d156000 - 0x7fff8d16cfff com.apple.MultitouchSupport.framework (235.29 - 235.29) <617EC8F1-BCE7-3553-86DD-F857866E1257> /System/Library/PrivateFrameworks/MultitouchSupport.framework/Versions/A/MultitouchSupport+ 0x7fff8d16d000 - 0x7fff8d171fff libGIF.dylib (850) <D4525F87-759C-338C-B283-BB8DE815D3D5> /System/Library/Frameworks/ImageIO.framework/Versions/A/Resources/libGIF.dylib+ 0x7fff8d264000 - 0x7fff8d2aeff7 libGLU.dylib (8.9.2) <1B5511FF-1064-3004-A245-972CE5687D37> /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGLU.dylib+ 0x7fff8d2b2000 - 0x7fff8d2dcff7 com.apple.CoreVideo (1.8 - 99.4) <E5082966-6D81-3973-A05A-38AA5B85F886> /System/Library/Frameworks/CoreVideo.framework/Versions/A/CoreVideo+ 0x7fff8d58d000 - 0x7fff8d591fff com.apple.IOSurface (86.0.4 - 86.0.4) <26F01CD4-B76B-37A3-989D-66E8140542B3> /System/Library/Frameworks/IOSurface.framework/Versions/A/IOSurface+ 0x7fff8d6de000 - 0x7fff8d78ffff com.apple.LaunchServices (539.9 - 539.9) <07FC6766-778E-3479-8F28-D2C9917E1DD1> /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/LaunchServices.framework/Versions/A/LaunchServices+ 0x7fff8d7bf000 - 0x7fff8d80eff7 libFontRegistry.dylib (100) <2E03D7DA-9B8F-31BB-8FB5-3D3B6272127F> /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/ATS.framework/Versions/A/Resources/libFontRegistry.dylib+ 0x7fff8d80f000 - 0x7fff8d88fff7 com.apple.ApplicationServices.ATS (332 - 341.1) <39B53565-FA31-3F61-B090-C787C983142E> /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/ATS.framework/Versions/A/ATS+ 0x7fff8d94e000 - 0x7fff8d95bfff com.apple.AppleFSCompression (49 - 1.0) <5508344A-2A7E-3122-9562-6F363910A80E> /System/Library/PrivateFrameworks/AppleFSCompression.framework/Versions/A/AppleFSCompression+ 0x7fff8d95c000 - 0x7fff8d99fff7 com.apple.RemoteViewServices (2.0 - 80.6) <5CFA361D-4853-3ACC-9EFC-A2AC1F43BA4B> /System/Library/PrivateFrameworks/RemoteViewServices.framework/Versions/A/RemoteViewServices+ 0x7fff8dac2000 - 0x7fff8dac8fff libmacho.dylib (829) <BF332AD9-E89F-387E-92A4-6E1AB74BD4D9> /usr/lib/system/libmacho.dylib+ 0x7fff8dac9000 - 0x7fff8db03ff7 com.apple.GSS (3.0 - 2.0) <970CAE00-1437-3F4E-B677-0FDB3714C08C> /System/Library/Frameworks/GSS.framework/Versions/A/GSS+ 0x7fff8db09000 - 0x7fff8db12ff7 com.apple.CommerceCore (1.0 - 26.1) <40A129A8-4E5D-3C7A-B299-8CB203C4C65D> /System/Library/PrivateFrameworks/CommerceKit.framework/Versions/A/Frameworks/CommerceCore.framework/Versions/A/CommerceCore+ 0x7fff8db13000 - 0x7fff8db15fff com.apple.TrustEvaluationAgent (2.0 - 23) <A97D348B-32BF-3E52-8DF2-59BFAD21E1A3> /System/Library/PrivateFrameworks/TrustEvaluationAgent.framework/Versions/A/TrustEvaluationAgent+ 0x7fff8de6c000 - 0x7fff8de6eff7 libunc.dylib (25) <92805328-CD36-34FF-9436-571AB0485072> /usr/lib/system/libunc.dylib+ 0x7fff8de6f000 - 0x7fff8de8eff7 com.apple.ChunkingLibrary (2.0 - 133.3) <8BEC9AFB-DCAA-37E8-A5AB-24422B234ECF> /System/Library/PrivateFrameworks/ChunkingLibrary.framework/Versions/A/ChunkingLibrary+ 0x7fff8de8f000 - 0x7fff8deeefff com.apple.AE (645.6 - 645.6) <44F403C1-660A-3543-AB9C-3902E02F936F> /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/AE.framework/Versions/A/AE+ 0x7fff8deef000 - 0x7fff8dfecfff libsqlite3.dylib (138.1) <ADE9CB98-D77D-300C-A32A-556B7440769F> /usr/lib/libsqlite3.dylib+ 0x7fff8e06b000 - 0x7fff8e076ff7 com.apple.bsd.ServiceManagement (2.0 - 2.0) <C12962D5-85FB-349E-AA56-64F4F487F219> /System/Library/Frameworks/ServiceManagement.framework/Versions/A/ServiceManagement+ 0x7fff8e077000 - 0x7fff8e086fff com.apple.opengl (1.8.9 - 1.8.9) <6FD163A7-16CC-3D1F-B4B5-B0FDC4ADBF79> /System/Library/Frameworks/OpenGL.framework/Versions/A/OpenGL+ 0x7fff8e087000 - 0x7fff8e092fff com.apple.CommonAuth (3.0 - 2.0) <7A953C1F-8B18-3E46-9BEA-26D9B5B7745D> /System/Library/PrivateFrameworks/CommonAuth.framework/Versions/A/CommonAuth+ 0x7fff8e093000 - 0x7fff8e093fff com.apple.Cocoa (6.7 - 19) <1F77945C-F37A-3171-B22E-F7AB0FCBB4D4> /System/Library/Frameworks/Cocoa.framework/Versions/A/Cocoa+ 0x7fff8e1f3000 - 0x7fff8e1f4fff libsystem_blocks.dylib (59) <D92DCBC3-541C-37BD-AADE-ACC75A0C59C8> /usr/lib/system/libsystem_blocks.dylib+ 0x7fff8e23c000 - 0x7fff8e23cffd com.apple.audio.units.AudioUnit (1.9 - 1.9) <EC55FB59-2443-3F08-9142-7BCC93C76E4E> /System/Library/Frameworks/AudioUnit.framework/Versions/A/AudioUnit+ 0x7fff8e23d000 - 0x7fff8e30fff7 com.apple.CoreText (260.0 - 275.16) <5BFC1D67-6A6F-38BC-9D90-9C712684EDAC> /System/Library/Frameworks/CoreText.framework/Versions/A/CoreText+ 0x7fff8e310000 - 0x7fff8e31eff7 libkxld.dylib (2050.24.15) <A619A9AC-09AF-3FF3-95BF-F07CC530EC31> /usr/lib/system/libkxld.dylib+ 0x7fff8e31f000 - 0x7fff8e38dff7 com.apple.framework.IOKit (2.0.1 - 755.24.1) <04BFB138-8AF4-310A-8E8C-045D8A239654> /System/Library/Frameworks/IOKit.framework/Versions/A/IOKit+ 0x7fff8e39f000 - 0x7fff8e525fff libBLAS.dylib (1073.4) <C102C0F6-8CB6-3B49-BA6B-2EB61F0B2784> /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libBLAS.dylib+ 0x7fff8e553000 - 0x7fff8e597fff libcups.2.dylib (327.6) <9C01D012-6F4C-3B69-B614-1B408B0ED4E3> /usr/lib/libcups.2.dylib+ 0x7fff8e598000 - 0x7fff8e5a6fff libcommonCrypto.dylib (60027) <BAAFE0C9-BB86-3CA7-88C0-E3CBA98DA06F> /usr/lib/system/libcommonCrypto.dylib+ 0x7fff8e6fa000 - 0x7fff8e70fff7 libdispatch.dylib (228.23) <D26996BF-FC57-39EB-8829-F63585561E09> /usr/lib/system/libdispatch.dylib+ 0x7fff8e710000 - 0x7fff8e71eff7 libsystem_network.dylib (77.10) <0D99F24E-56FE-380F-B81B-4A4C630EE587> /usr/lib/system/libsystem_network.dylib+ 0x7fff8e71f000 - 0x7fff8e741ff7 com.apple.Kerberos (2.0 - 1) <C49B8820-34ED-39D7-A407-A3E854153556> /System/Library/Frameworks/Kerberos.framework/Versions/A/Kerberos+ 0x7fff8e788000 - 0x7fff8e797ff7 libxar.1.dylib (105) <370ED355-E516-311E-BAFD-D80633A84BE1> /usr/lib/libxar.1.dylib+ 0x7fff8f144000 - 0x7fff8f1d1ff7 com.apple.SearchKit (1.4.0 - 1.4.0) <C7F43889-F8BF-3CB9-AD66-11AEFCBCEDE7> /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/SearchKit.framework/Versions/A/SearchKit+ 0x7fff8f24c000 - 0x7fff8f24ffff libRadiance.dylib (850) <62E3F7FB-03E3-3937-A857-AF57A75EAF09> /System/Library/Frameworks/ImageIO.framework/Versions/A/Resources/libRadiance.dylib+ 0x7fff8f533000 - 0x7fff8f7d7ff7 com.apple.CoreImage (8.4.0 - 1.0.1) <CC6DD22B-FFC6-310B-BE13-2397A02C79EF> /System/Library/Frameworks/QuartzCore.framework/Versions/A/Frameworks/CoreImage.framework/Versions/A/CoreImage+ 0x7fff8f7d8000 - 0x7fff8f840fff libvDSP.dylib (380.6) <CD4C5EEB-9E63-30C4-8103-7A5EAEA0BE60> /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libvDSP.dylib+ 0x7fff8f8ab000 - 0x7fff8f8affff libpam.2.dylib (20) <C8F45864-5B58-3237-87E1-2C258A1D73B8> /usr/lib/libpam.2.dylib+ 0x7fff8fabb000 - 0x7fff8fb28ff7 com.apple.datadetectorscore (4.1 - 269.3) <5775F0DB-87D6-310D-8B03-E2AD729EFB28> /System/Library/PrivateFrameworks/DataDetectorsCore.framework/Versions/A/DataDetectorsCore+ 0x7fff8fc60000 - 0x7fff8fcbcff7 com.apple.Symbolication (1.3 - 93) <97F3B1D2-D81D-3F37-87B3-B9A686124CF5> /System/Library/PrivateFrameworks/Symbolication.framework/Versions/A/Symbolication+ 0x7fff8fd91000 - 0x7fff8fe6bfff com.apple.backup.framework (1.4.3 - 1.4.3) <6B65C44C-7777-3331-AD9D-438D10AAC777> /System/Library/PrivateFrameworks/Backup.framework/Versions/A/Backup+ 0x7fff8fe6c000 - 0x7fff8fe79fff libbz2.1.0.dylib (29) <CE9785E8-B535-3504-B392-82F0064D9AF2> /usr/lib/libbz2.1.0.dylib+ 0x7fff8fe89000 - 0x7fff8ffdbfff com.apple.audio.toolbox.AudioToolbox (1.9 - 1.9) <62770C0F-5600-3EF9-A893-8A234663FFF5> /System/Library/Frameworks/AudioToolbox.framework/Versions/A/AudioToolbox+ 0x7fff90071000 - 0x7fff90173fff libJP2.dylib (850) <2E43216C-3A5A-3693-820C-38B360698FA0> /System/Library/Frameworks/ImageIO.framework/Versions/A/Resources/libJP2.dylib+ 0x7fff90ab4000 - 0x7fff90b79ff7 com.apple.coreui (2.0 - 181.1) <83D2C92D-6842-3C9D-9289-39D5B4554C3A> /System/Library/PrivateFrameworks/CoreUI.framework/Versions/A/CoreUI+ 0x7fff90e1a000 - 0x7fff90e1bfff liblangid.dylib (116) <864C409D-D56B-383E-9B44-A435A47F2346> /usr/lib/liblangid.dylib+ 0x7fff90f20000 - 0x7fff90fddff7 com.apple.ColorSync (4.8.0 - 4.8.0) <6CE333AE-EDDB-3768-9598-9DB38041DC55> /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/ColorSync.framework/Versions/A/ColorSync+ 0x7fff90fde000 - 0x7fff9105dff7 com.apple.securityfoundation (6.0 - 55115.4) <8676E0DF-295F-3690-BDAA-6C9C1D210B88> /System/Library/Frameworks/SecurityFoundation.framework/Versions/A/SecurityFoundation+ 0x7fff9105e000 - 0x7fff910b4fff com.apple.HIServices (1.20 - 417) <BCD36950-013F-35C2-918E-05A93A47BE8C> /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/HIServices.framework/Versions/A/HIServices+ 0x7fff910b5000 - 0x7fff910d6fff com.apple.Ubiquity (1.2 - 243.15) <C9A7EE77-B637-3676-B667-C0843BBB0409> /System/Library/PrivateFrameworks/Ubiquity.framework/Versions/A/Ubiquity+ 0x7fff910de000 - 0x7fff91133ff7 libTIFF.dylib (850) <EDAF0D99-70AF-3B3F-9EFA-9463C91D0E3C> /System/Library/Frameworks/ImageIO.framework/Versions/A/Resources/libTIFF.dylib+ 0x7fff9125c000 - 0x7fff9127cfff libPng.dylib (850) <203C43BF-FAD3-3CCB-81D5-F2770E36338B> /System/Library/Frameworks/ImageIO.framework/Versions/A/Resources/libPng.dylib+ 0x7fff9127f000 - 0x7fff91398fff com.apple.ImageIO.framework (3.2.1 - 850) <C3FFCEEB-AA0C-314B-9E94-7005EE48A403> /System/Library/Frameworks/ImageIO.framework/Versions/A/ImageIO+ 0x7fff9139f000 - 0x7fff913b6fff com.apple.GenerationalStorage (1.1 - 132.3) <FD4A84B3-13A8-3C60-A59E-25A361447A17> /System/Library/PrivateFrameworks/GenerationalStorage.framework/Versions/A/GenerationalStorage+ 0x7fff91582000 - 0x7fff91586fff libCoreVMClient.dylib (32.3) <AD8391D9-56DD-3A78-A294-6A30E6ECE1A2> /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libCoreVMClient.dylib+ 0x7fff91587000 - 0x7fff915bdfff com.apple.DebugSymbols (98 - 98) <14E788B1-4EB2-3FD7-934B-849534DFC198> /System/Library/PrivateFrameworks/DebugSymbols.framework/Versions/A/DebugSymbols+ 0x7fff915cd000 - 0x7fff915d5fff liblaunch.dylib (442.26.2) <2F71CAF8-6524-329E-AC56-C506658B4C0C> /usr/lib/system/liblaunch.dylib+ 0x7fff915d6000 - 0x7fff915e1fff libsystem_notify.dylib (98.5) <C49275CC-835A-3207-AFBA-8C01374927B6> /usr/lib/system/libsystem_notify.dylib+ 0x7fff91650000 - 0x7fff917ebfef com.apple.vImage (6.0 - 6.0) <FAE13169-295A-33A5-8E6B-7C2CC1407FA7> /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vImage.framework/Versions/A/vImage+ 0x7fff917ec000 - 0x7fff917f4ff7 libsystem_dnssd.dylib (379.38.1) <BDCB8566-0189-34C0-9634-35ABD3EFE25B> /usr/lib/system/libsystem_dnssd.dylib+ 0x7fff9182d000 - 0x7fff91938fff libFontParser.dylib (84.6) <96C42E49-79A6-3475-B5E4-6A782599A6DA> /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/ATS.framework/Versions/A/Resources/libFontParser.dylib+ 0x7fff919d8000 - 0x7fff919ddfff libcache.dylib (57) <65187C6E-3FBF-3EB8-A1AA-389445E2984D> /usr/lib/system/libcache.dylib+ 0x7fff919de000 - 0x7fff919defff com.apple.vecLib (3.8 - vecLib 3.8) <794317C7-4E38-338A-A874-5E18001C8503> /System/Library/Frameworks/vecLib.framework/Versions/A/vecLib+ 0x7fff919df000 - 0x7fff91cb0ff7 com.apple.security (7.0 - 55179.13) <F428E306-C407-3B55-BA82-E58755E8A76F> /System/Library/Frameworks/Security.framework/Versions/A/Security+ 0x7fff91d3f000 - 0x7fff9206ffff com.apple.HIToolbox (2.0 - 626.1) <656D08C2-9068-3532-ABDD-32EC5057CCB2> /System/Library/Frameworks/Carbon.framework/Versions/A/Frameworks/HIToolbox.framework/Versions/A/HIToolbox+ 0x7fff92084000 - 0x7fff920deff7 com.apple.opencl (2.2.19 - 2.2.19) <3C7DFB2C-B3F9-3447-A1FC-EAAA42181A6E> /System/Library/Frameworks/OpenCL.framework/Versions/A/OpenCL+ 0x7fff9216c000 - 0x7fff9216dff7 libremovefile.dylib (23.2) <6763BC8E-18B8-3AD9-8FFA-B43713A7264F> /usr/lib/system/libremovefile.dylib+ 0x7fff9312e000 - 0x7fff93149ff7 libsystem_kernel.dylib (2050.24.15) <A9F97289-7985-31D6-AF89-151830684461> /usr/lib/system/libsystem_kernel.dylib+ 0x7fff9314d000 - 0x7fff9326dfff com.apple.desktopservices (1.7.4 - 1.7.4) <ED3DA8C0-160F-3CDC-B537-BF2E766AB7C1> /System/Library/PrivateFrameworks/DesktopServicesPriv.framework/Versions/A/DesktopServicesPriv++External Modification Summary:+ Calls made by other processes targeting this process:+ task_for_pid: 1+ thread_create: 0+ thread_set_state: 0+ Calls made by this process:+ task_for_pid: 0+ thread_create: 0+ thread_set_state: 0+ Calls made by all processes on this machine:+ task_for_pid: 168404+ thread_create: 1+ thread_set_state: 0++VM Region Summary:+ReadOnly portion of Libraries: Total=109.3M resident=31.8M(29%) swapped_out_or_unallocated=77.5M(71%)+Writable regions: Total=90.9M written=16.1M(18%) resident=17.5M(19%) swapped_out=0K(0%) unallocated=73.4M(81%)+ +REGION TYPE VIRTUAL+=========== =======+MALLOC 62.5M+MALLOC guard page 48K+STACK GUARD 56.0M+Stack 12.6M+VM_ALLOCATE 12.0M+__DATA 13.8M+__IMAGE 528K+__LINKEDIT 58.6M+__TEXT 134.3M+__UNICODE 544K+shared memory 308K+=========== =======+TOTAL 351.2M++Model: MacBookPro10,1, BootROM MBP101.00EE.B03, 4 processors, Intel Core i7, 2.8 GHz, 16 GB, SMC 2.3f35+Graphics: Intel HD Graphics 4000, Intel HD Graphics 4000, Built-In, 512 MB+Graphics: NVIDIA GeForce GT 650M, NVIDIA GeForce GT 650M, PCIe, 1024 MB+Memory Module: BANK 0/DIMM0, 8 GB, DDR3, 1600 MHz, 0x80AD, 0x484D5434314753364D465238432D50422020+Memory Module: BANK 1/DIMM0, 8 GB, DDR3, 1600 MHz, 0x80AD, 0x484D5434314753364D465238432D50422020+AirPort: spairport_wireless_card_type_airport_extreme (0x14E4, 0xEF), Broadcom BCM43xx 1.0 (5.106.98.100.17)+Bluetooth: Version 4.1.4f2 12041, 2 service, 18 devices, 1 incoming serial ports+Network Service: Wi-Fi, AirPort, en0+Serial ATA Device: APPLE SSD SM768E, 751.28 GB+USB Device: hub_device, 0x8087 (Intel Corporation), 0x0024, 0x1a100000 / 2+USB Device: FaceTime HD Camera (Built-in), apple_vendor_id, 0x8510, 0x1a110000 / 3+USB Device: USB Receiver, 0x046d (Logitech Inc.), 0xc52b, 0x14200000 / 1+USB Device: hub_device, 0x8087 (Intel Corporation), 0x0024, 0x1d100000 / 2+USB Device: hub_device, 0x0424 (SMSC), 0x2512, 0x1d180000 / 3+USB Device: Apple Internal Keyboard / Trackpad, apple_vendor_id, 0x0262, 0x1d182000 / 5+USB Device: BRCM20702 Hub, 0x0a5c (Broadcom Corp.), 0x4500, 0x1d181000 / 4+USB Device: Bluetooth USB Host Controller, apple_vendor_id, 0x8286, 0x1d181300 / 6++# End of transcript or log.+"""]]++> This got fixed in haskell gnutls 0.1.5. I have updated the Mtn Lion+> autobuilder and it will be in tonight's build. [[done]]+> --[[Joey]]
@@ -0,0 +1,20 @@+What steps will reproduce the problem?++ git-annex sync++What is the expected output? What do you see instead?++The following error is mixed in with the output, took me a while to notice it:++ Running: git ["--git-dir=/spare/annex/.git","--work-tree=/spare/annex","merge","--no-edit","refs/remotes/pip/synced/master"] + error: unknown option `no-edit'++What version of git-annex are you using? On what operating system?++3.20120629~bpo60+1 on debian squeeze++Please provide any additional information below.++Installing git from backports as well cleared up the problem.++> Uploading a fix for this now. [[done]] Thanks for reporting. --[[Joey]]
@@ -0,0 +1,29 @@+###What steps will reproduce the problem?++1. Start git annex webapp, and make new repository on two computers.+1. Pair them as "Local computer"s, and they synchronize fine, a file created on one shows up on the other.+1. Disconnect one of the computers from the network, and create a new file+1. Check where the file is.++###What is the expected output? What do you see instead?++ git annex whereis new file++shows the file being in both repositories, when in fact it has had no chance to get added to the one on the other computer, and is not in it.+++###What version of git-annex are you using? On what operating system?++Both 4.20130405 on Ubuntu 12.10++###Please provide any additional information below.++I noticed this first when using a USB drive to communicate between work and home. Making changes at home, it thought that the new files were now present at work, when the computer there is off, and a long way away.+--Walter++> A little while ago, I made this change:++ * direct mode: Direct mode commands now work on files staged in the index,+ they do not need to be committed to git.++> I think that fixes the confusing behavior described here. [[done]] --[[Joey]]
@@ -0,0 +1,25 @@+###What steps will reproduce the problem?++ greg@x220:~/Music$ git-annex version+ git-annex version: 3.20121017++ greg@x220:~/Documents$ git-annex watch+ greg@x220:~/Documents$ git-annex: Daemon is already running.++ greg@x220:~/Documents$ git-annex assistant+ greg@x220:~/Documents$ git-annex: Daemon is already running.++ greg@x220:~/Documents$ git-annex webapp+ git-annex: unknown command webapp++This is on an Ubuntu (12.10) machine, using git-annex from ubuntu+1 (13.04), which is just an autosync from sid:++https://launchpad.net/ubuntu/+source/git-annex/3.20121017++###What is the expected output? What do you see instead?+I expect my browser to open the webapp.+++(Also, it is odd how the output of "Daemon is already running" appears after my prompt is given back to me)++> [[closing|done]]; forwarded upstream --[[Joey]]
@@ -0,0 +1,25 @@+When a hidden file (starting with a dot) is git-annex add'ed, other non-tracked files are also added ++What steps will reproduce the problem?++$ touch a .b++$ git annex add .b++add a (checksum...) ok++add .b (checksum...) ok++(Recording state in git...)+++What is the expected output? What do you see instead?++Only file .b should be added.++What version of git-annex are you using? On what operating system?++3.20120406+(same problem with version 3.20120123) on Debian.++> Thanks for reporting this bug, I've fixed it in git. [[done]] --[[Joey]]
@@ -0,0 +1,14 @@+Recently I ran into the following situation under Ubuntu with an encrypted home directory (which shortens the length that filenames can be):++ $ git annex add 687474703a2f2f6d656469612e74756d626c722e636f6d2f74756d626c725f6c656673756557324c703171663879656b2e676966.gif+ add 687474703a2f2f6d656469612e74756d626c722e636f6d2f74756d626c725f6c656673756557324c703171663879656b2e676966.gif failed+ git-annex: /home/lhuhn/annex/.git/annex/tmp/155_518_WORM-s426663-m1310064100--687474703a2f2f6d656469612e74756d626c722e636f6d2f74756d626c725f6c656673756557324c703171663879656b2e676966.gif.log: openBinaryFile: invalid argument (File name too long)+ git-annex: 1 failed++The file seems to be completely gone. It no longer exists in the current directory, or under .git/annex.++I don't mind horribly that git-annex failed due to the name length limit, but it shouldn't have deleted my file in the process (fortunately the file wasn't very important, or hard to recover).++> [[done]], as noted it did not delete content and now it makes the symlink+> before trying to write to the location log, avoiding that gotcha.+> --[[Joey]]
@@ -0,0 +1,28 @@+### Please describe the problem.+I have a git annex clone on Andrew File System. I obtain an error when I try+to add a file to the annex:++git-annex: test: createLink: unsupported operation (Invalid cross-device link)++### What steps will reproduce the problem?+Create a test file with touch and add it with git annex add.++### What version of git-annex are you using? On what operating system?+git-annex 4.20130723 on Debian sid.++### Please provide any additional information below.++[[!format sh """+gio@crack:~/nobackup/archive$ touch test+gio@crack:~/nobackup/archive$ git annex add test+add test +git-annex: test: createLink: unsupported operation (Invalid cross-device link)+failed+git-annex: add: 1 failed+gio@crack:~/nobackup/archive$ logout+"""]]++It seems to me that AFS doesn't support hard links between different+directories.++> [[done]] per comments --[[Joey]]
@@ -0,0 +1,39 @@+For the record, `git annex add` has had a series of memory leaks.+Mostly these are minor -- until you need to check in a few+million files in a single operation. ++If this happens to you, git-annex will run out of memory and stop.+(Generally well before your system runs out of memory, since it has some+built-in ulimits.) You can recover by just re-running the `git annex add`+-- it will automatically pick up where it left off.++A history of the leaks:++* Originally, `git annex add` remembered all the files+ it had added, and fed them to git at the end. Of course+ that made its memory use grow, so it was fixed to periodically+ flush its buffer. Fixed in version 0.20110417.++* Something called a "lazy state monad" caused "thunks" to build+ up and memory to leak. Also affected other git annex commands+ than `add`. Adding files using a SHA* backend hit the worst.+ Fixed in versions afer 3.20120123.++* Committing journal files turned out to have another memory leak.+ After adding a lot of files ran out of memory, this left the journal+ behind and could affect other git-annex commands. Fixed in versions afer+ 3.20120123.++* The count of the number of failed commands was updated lazily, which+ caused a slow leak when running on a lot of files. Fixed in versions afer+ 3.20120123.++* (Note that `git ls-files --others`, which is used to find files to add,+ also uses surpsisingly large amounts+ of memory when you have a lot of files. It buffers+ the entire list, so it can compare it with the files in the index,+ before outputting anything.+ This is Not Our Problem, but I'm sure the git developers+ would appreciate a patch that fixes it.)++[[done]]
@@ -0,0 +1,103 @@+### Please describe the problem.+Using git-annex from Debian (4.20130709), I attempted to add a 410M file named `Expressionlessm.tar`. It acted like it succeeded, but the link it created was broken. Other files would add correctly.++### What steps will reproduce the problem?+I can reliably cause the file to be removed and replaced with a dangling symlink by doing `git annex add Expressionlessm.tar`. The "addition" completes much faster than normal. Using the old version of git-annex that Ubuntu provides (3.20131112ubuntu4), the file adds correctly in at least one place it was having issues.++### What version of git-annex are you using? On what operating system?+I'm using the version of git-annex from Debian Sid on Ubuntu 13.04 (perhaps that's my issue?)++### 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++andrew@andrew-desktop:/media/MainStore/Projects$ git status+# On branch master+# Untracked files:+# (use "git add <file>..." to include in what will be committed)+#+==========Snip!=================+nothing added to commit but untracked files present (use "git add" to track)++++andrew@andrew-desktop:/media/MainStore/Projects$ ls+==========Snip!=================+Expressionlessm.tar+Expressionlessm.tar.bkup+==========Snip!=================++++andrew@andrew-desktop:/media/MainStore/Projects$ tar tf Expressionlessm.tar +Expressionlessm/+==========Snip!=================+# Tar file is valid at this point+++andrew@andrew-desktop:/media/MainStore/Projects$ git annex add Expressionlessm.tar+add Expressionlessm.tar ok+(Recording state in git...)++++andrew@andrew-desktop:/media/MainStore/Projects$ ls+==========Snip!=================+Expressionlessm.tar+Expressionlessm.tar.bkup+==========Snip!=================++++andrew@andrew-desktop:/media/MainStore/Projects$ ls -l+==========Snip!=================+lrwxrwxrwx 1 andrew andrew 109 Jul 12 02:29 Expressionlessm.tar -> ../.git/annex/objects/vk/mF/SHA256-s3131909--a2808d850ba2e880ac58bf622cd68edd7e72ea2775b984d52b5d5266c43b03f0+-rw-rw-r-- 1 andrew andrew 428759040 Jul 10 20:30 Expressionlessm.tar.bkup+==========Snip!=================++++andrew@andrew-desktop:/media/MainStore/Projects$ tar tf Expressionlessm.tar +tar: Expressionlessm.tar: Cannot open: No such file or directory+tar: Error is not recoverable: exiting now+++=================================================================+W O R K I N G V E R S I O N+This is what it looks like when the add works.+=================================================================+andrew@andrew-desktop:/media/MainStore/Projects$ cp Expressionlessm.tar.bkup Expressionlessm.tar+andrew@andrew-desktop:/media/MainStore/Projects$ git annex add Expressionlessm.tar+add Expressionlessm.tar (checksum...) ok+(Recording state in git...)+andrew@andrew-desktop:/media/MainStore/Projects$ git status+# On branch master+# Changes to be committed:+# (use "git reset HEAD <file>..." to unstage)+#+# new file: Expressionlessm.tar+#+# Untracked files:+==========Snip!=================++++andrew@andrew-desktop:/media/MainStore/Projects$ ls -l+==========Snip!=================+lrwxrwxrwx 1 andrew andrew 195 Jul 12 02:20 Expressionlessm.tar -> ../.git/annex/objects/3v/Z7/SHA256-s428759040--133040f7b9d34ebce235aa24a0a16ab72af8f70e7a0722810d873815a2338eb2/SHA256-s428759040--133040f7b9d34ebce235aa24a0a16ab72af8f70e7a0722810d873815a2338eb2+-rw-rw-r-- 1 andrew andrew 428759040 Jul 10 20:30 Expressionlessm.tar.bkup+==========Snip!=================+# Notice the link target is different this time.+++# End of transcript or log.+"""]]++> [[done]]; this bug is now prevented on several levels.+> +> BTW, the earlier behavior where it didn't even make a valid .git/annex/objects/+> symlink is also explained by this bug I've fixed. It pulled a truncated+> link out of the tarball, and used that.+> --[[Joey]]
@@ -0,0 +1,39 @@+**What steps will reproduce the problem?**++Run *git annex assistant --autostart*++ git-annex autostart in /home/tobru/annex/repo1+ failed+ git-annex autostart in /home/tobru/annex/repo2+ failed+ git-annex autostart in /home/tobru/annex/repo3+ failed+ git-annex autostart in /home/tobru/annex/repo4+ failed+ git-annex autostart in /home/tobru/annex/repo5+ failed++Running *git annex assistant* in each directory starts the assistant without errors.++What could cause autostart to fail? Is there any log? Or a --debug parameter?+++**What is the expected output? What do you see instead?**++The assistant should start on all known repositories++**What version of git-annex are you using? On what operating system?**++4.20130417-g4bb97d5 on Ubuntu++**Please provide any additional information below.**++The ~/.config/git-annex/autostart file looks like this:++ /home/tobru/annex/repo1+ /home/tobru/annex/repo2+ /home/tobru/annex/repo3+ /home/tobru/annex/repo4+ /home/tobru/annex/repo5++> Closing, seems local misconfiguration. --[[Joey]] [[done]]
@@ -0,0 +1,22 @@+Workflow:++ % git annex add+ # list new files+ % git commit -a -m "foo"+ # commit summary+ % git annex copy . --to remote --fast+ # all files listed with "ok"+ % git annex copy . --to remote+ # again, lists all files, _but the new ones are actually copied, this time_.++This happens no matter if I++ % git push++before copy or not.++PS: Arguably, a copy should push automagically.++> Whups, not supposed to be that fast! [[Fixed|done]], and+> you should run `git annex fsck --fast` on the repo you ran the+> copy in. --[[Joey]]
@@ -0,0 +1,18 @@+I was testing out the fix/workaround for [[git-annex directory hashing problems on osx]] and I tried using the short forms of some of the commands i.e.++ git annex copy -f externalusb .++which gives me++ git-annex: user error (option `-f' is ambiguous; could be one of:+ -f --force allow actions that may lose annexed data+ -f REMOTE --from=REMOTE specify from where to transfer content+++I would have expected that since *--to* is the same as *-t* and *--from* is the same as *-f* as the in program documentation suggests. But *-f* clashes with the force command, I would suggest that the short form of *--force* be changed to *-F* and possibly rename the *Fast* commands to *Quick* and use *-Q* as the short form of the *Quick* operations. I didn't try the *-f* option with the move command, but it probably suffers from the same issue. It's probably better to avoid clashing short forms of command options.++I guess this issue is just a documentation issue and a minor interface change if needed and not a bug of git-annex, but a quirk.++> Yeah, -f needs to be from; -F was already --fast. I have made --force not+> have any short option abbreviation, I think it's entirely reasonable to+> avoid fat-fingering an option that can lose data. [[done]] --[[Joey]]
@@ -0,0 +1,27 @@+git-annex is trying to ssh (twice by the look of it) to a remote that is not involved in the copy. In this case, git-annex gives a usage error, but not before calling ssh twice:++ $ git annex copy --from=hugex --to=h2 01-pilot.avi+ ssh: connect to host 192.168.1.5 port 22: No route to host+ ssh: connect to host 192.168.1.5 port 22: No route to host+ fatal: Could not read from remote repository.+ + Please make sure you have the correct access rights+ and the repository exists.+ git-annex: only one of --from or --to can be specified++git-annex shouldn't be running ssh before checking commandline arguments! Or, in this case at all, since both remotes mentioned on the commandline are local:++ $ git config remote.hugex.url+ /media/hugex/jason/home.git+ $ git config remote.h2.url+ /media/h2/backup/git/home.git+++I'm running git-annex 4.20130627 as shipped with debian unstable.++-- +Jason++P.S. 192.168.1.5 is set as the HostName for one of my other remotes in my ~/.ssh/config, so this isn't _totally_ out of the blue. ++> [[done]]; see comment's explanation. --[[Joey]]
@@ -0,0 +1,67 @@+As you can see, I'm running a pretty recent build of git-annex (ac799c3f363e0008b23e9c174e6fedc35e6fa92a),++ $ git annex version+ git-annex version: 3.20120630+ local repository version: 3+ default repository version: 3+ supported repository versions: 3+ upgrade supported from repository versions: 0 1 2++We have a file here which isn't currently available yet isn't+currently available (the link is shown in red),++ $ ls -l plot.py+ lrwxrwxrwx 1 ben ben 77 Jul 6 14:01 plot.py -> ../.git/annex/objects/WORM:1301941019:720:plot.py/WORM:1301941019:720:plot.py+ $ ++Yet git-annex should be able to tell us where it is,++ $ git-annex whereis plot.py+ $ ++Hmm, well that's strange. What's happening here,++ $ git-annex whereis plot.py -d+ git ["--git-dir=/home/ben/lori/analysis/data/.git","--work-tree=/home/ben/lori/analysis/data","show-ref","git-annex"]+ git ["--git-dir=/home/ben/lori/analysis/data/.git","--work-tree=/home/ben/lori/analysis/data","show-ref","--hash","refs/heads/git-annex"]+ git ["--git-dir=/home/ben/lori/analysis/data/.git","--work-tree=/home/ben/lori/analysis/data","log","refs/heads/git-annex..d5582e05f41011b571a17003934fe9e40859e4be","--oneline","-n1"]+ git ["--git-dir=/home/ben/lori/analysis/data/.git","--work-tree=/home/ben/lori/analysis/data","cat-file","--batch"]+ git ["--git-dir=/home/ben/lori/analysis/data/.git","--work-tree=/home/ben/lori/analysis/data","ls-files","--cached","-z","--","plot.py"]+ $ ++Alright, well maybe `git-annex get` will work,++ $ git annex get plot.py -d+ git ["--git-dir=/home/ben/lori/analysis/data/.git","--work-tree=/home/ben/lori/analysis/data","ls-files","--cached","-z","--","plot.py"]+ $ ls -l plot.py+ lrwxrwxrwx 1 ben ben 77 Jul 6 14:01 plot.py -> ../.git/annex/objects/WORM:1301941019:720:plot.py/WORM:1301941019:720:plot.py++Nope, the link is still shown in red.++Alright, what about `git-annex copy`?++ $ git annex copy plot.py --from=goldnerlab --to=here -d + git ["--git-dir=/home/ben/lori/analysis/data/.git","--work-tree=/home/ben/lori/analysis/data","show-ref","git-annex"]+ git ["--git-dir=/home/ben/lori/analysis/data/.git","--work-tree=/home/ben/lori/analysis/data","show-ref","--hash","refs/heads/git-annex"]+ git ["--git-dir=/home/ben/lori/analysis/data/.git","--work-tree=/home/ben/lori/analysis/data","log","refs/heads/git-annex..d5582e05f41011b571a17003934fe9e40859e4be","--oneline","-n1"]+ git ["--git-dir=/home/ben/lori/analysis/data/.git","--work-tree=/home/ben/lori/analysis/data","cat-file","--batch"]+ git ["--git-dir=/home/ben/lori/analysis/data/.git","--work-tree=/home/ben/lori/analysis/data","ls-files","--cached","-z","--","plot.py"]+ $ ls -l plot.py+ lrwxrwxrwx 1 ben ben 77 Jul 6 14:01 plot.py -> ../.git/annex/objects/WORM:1301941019:720:plot.py/WORM:1301941019:720:plot.py++Still red.++Alright, what if I just try to get a non-existent file?++ $ git annex get adsflkah -d+ git ["--git-dir=/home/ben/lori/analysis/data/.git","--work-tree=/home/ben/lori/analysis/data","ls-files","--cached","-z","--","adsflkah"]+ $++Alright, it didn't fail with an error, that's very strange. What is going on here?++[[!meta title="v1 file is ignored"]]++> I don't think I want to make git-annex deal with v1 files, and+> I doubt there are many repos left using them. This seems to be a case+> of an upgrade not being done, for whatever reason. Closing [[done]]+> --[[Joey]]
@@ -0,0 +1,218 @@+### Please describe the problem.+git-annex crashes on Max OS X 10.9 at startup++### What steps will reproduce the problem?+- install Mac OS X 10.9 developer preview+- download and install the latest git-annex from here http://downloads.kitenet.net/git-annex/OSX/current/10.8.2_Mountain_Lion/ (I tried with the 10.8 version)+- attempt to start it, see it crashing++### What version of git-annex are you using? On what operating system?+- latest version that is available for 10.8, on 10.9 DP 2++### Please provide any additional information below.++I see the following in Console: ++15.07.2013 21:20:49,362 com.apple.launchd.peruser.501[259]: (com.branchable.git-annex.103872[67263]) Exited with code: 133+15.07.2013 21:20:49,546 ReportCrash[67272]: Saved crash report for git-annex[67268] version ??? to /Users/stelianiancu/Library/Logs/DiagnosticReports/git-annex_2013-07-15-212049_poseidon-2.crash++And the crash is as follows:++Process: git-annex [67268]+Path: /Applications/git-annex.app/Contents/MacOS/bundle/git-annex+Identifier: git-annex+Version: ???+Code Type: X86-64 (Native)+Parent Process: sh [67263]+Responsible: sh [67263]+User ID: 501++Date/Time: 2013-07-15 21:20:48.946 +0200+OS Version: Mac OS X 10.9 (13A497d)+Report Version: 11+Anonymous UUID: 634E8812-1F1A-11E0-61DA-7527061A194C++Sleep/Wake UUID: AFC18477-57D2-4B69-8B0F-AE26BC3D9D0C++Crashed Thread: 0++Exception Type: EXC_BREAKPOINT (SIGTRAP)+Exception Codes: 0x0000000000000002, 0x0000000000000000++Application Specific Information:+dyld: launch, loading dependent libraries++Dyld Error Message:+ Symbol not found: _objc_debug_taggedpointer_mask+ Referenced from: /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation+ Expected in: /Applications/git-annex.app/Contents/MacOS/bundle/I+ in /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation++Binary Images:+ 0x104412000 - 0x10450fff7 +E (22.3) <47B09CB2-C636-3024-8B55-6040F7829B4C> /Applications/git-annex.app/Contents/MacOS/bundle/E+ 0x104547000 - 0x10455bfff +F (0) <FA90B1B1-A866-3A6C-BB97-06955F4C8C0B> /Applications/git-annex.app/Contents/MacOS/bundle/F+ 0x104567000 - 0x104594ff7 +G (0) <E276B5C2-6FAC-36A7-940B-7A75322F71AE> /Applications/git-annex.app/Contents/MacOS/bundle/G+ 0x10459c000 - 0x104669fdf +H (0) <29C3AFF5-8EFB-3A16-81F6-0DA6CF2675A6> /Applications/git-annex.app/Contents/MacOS/bundle/H+ 0x104699000 - 0x1046abff7 +B (43) <2A1551E8-A272-3DE5-B692-955974FE1416> /Applications/git-annex.app/Contents/MacOS/bundle/B+ 0x1046b1000 - 0x1047a6fff +D (34) <FEE8B996-EB44-37FA-B96E-D379664DEFE1> /Applications/git-annex.app/Contents/MacOS/bundle/D+ 0x1047b7000 - 0x1048cf92f +I (532.2) <90D31928-F48D-3E37-874F-220A51FD9E37> /Applications/git-annex.app/Contents/MacOS/bundle/I+ 0x1048f6000 - 0x104af6fff +S (491.11.3) <5783D305-04E8-3D17-94F7-1CEAFA975240> /Applications/git-annex.app/Contents/MacOS/bundle/S+ 0x104c06000 - 0x104c2bff7 +Z (26) <D86169F3-9F31-377A-9AF3-DB17142052E4> /Applications/git-annex.app/Contents/MacOS/bundle/Z+ 0x104c5e000 - 0x104cc6ff7 +0A (65.1) <20E31B90-19B9-3C2A-A9EB-474E08F9FE05> /Applications/git-annex.app/Contents/MacOS/bundle/0A+ 0x104d21000 - 0x104d8afff +0B (56) <EAA2B53E-EADE-39CF-A0EF-FB9D4940672A> /Applications/git-annex.app/Contents/MacOS/bundle/0B+ 0x104df3000 - 0x104e06fff +T (0) <DB28CA35-537D-3644-A6BE-179D1A1E9785> /Applications/git-annex.app/Contents/MacOS/bundle/T+ 0x104e0e000 - 0x104e1bff7 +U (0) <DCFF385A-090B-3407-868C-91544A2EFEE1> /Applications/git-annex.app/Contents/MacOS/bundle/U+ 0x104e1f000 - 0x104e41ff7 +V (0) <51B317C7-94CC-3C58-B515-924BB3AF0BCC> /Applications/git-annex.app/Contents/MacOS/bundle/V+ 0x104e4e000 - 0x104e5bff7 +W (0) <91CF16BE-027F-3FE6-B1EE-6B8BFD51FC1B> /Applications/git-annex.app/Contents/MacOS/bundle/W+ 0x104e68000 - 0x104ec4fd7 +X (0) <84D934AF-A321-36C0-BBCF-CD3FDAEB0B95> /Applications/git-annex.app/Contents/MacOS/bundle/X+ 0x7fff6ca9d000 - 0x7fff6cad04a7 dyld (237) <BB7160C2-117E-3369-87F0-866ED454490E> /usr/lib/dyld+ 0x7fff8ba5b000 - 0x7fff8ba5dfff libCVMSPluginSupport.dylib (9.0.74) <11FCA581-0FFD-37B1-966A-E47F4722D297> /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libCVMSPluginSupport.dylib+ 0x7fff8c053000 - 0x7fff8c05affb liblaunch.dylib (842.1.1) <7055DF9E-52CE-3746-96EB-3718DDBF0BD0> /usr/lib/system/liblaunch.dylib+ 0x7fff8c11d000 - 0x7fff8c41cff7 com.apple.Foundation (6.9 - 1042) <CE00D0BB-1053-3EA0-A31F-C9F1E3FEFBF2> /System/Library/Frameworks/Foundation.framework/Versions/C/Foundation+ 0x7fff8c41d000 - 0x7fff8c444ff7 libsystem_network.dylib (241.3) <D518703F-4C71-3CC5-99EF-A15C8F41A834> /usr/lib/system/libsystem_network.dylib+ 0x7fff8c445000 - 0x7fff8c47eff7 com.apple.QD (3.49 - 297) <EE1DD6BE-5881-35C7-A9E8-30CCB26E6CF3> /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/QD.framework/Versions/A/QD+ 0x7fff8c483000 - 0x7fff8c864ffe libLAPACK.dylib (1094.4) <19E25957-74BA-3770-AAB5-B6A05F19BDC2> /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libLAPACK.dylib+ 0x7fff8c8bc000 - 0x7fff8c8cbff8 com.apple.LangAnalysis (1.7.0 - 1.7.0) <ED300EBD-7AEF-34B4-B314-DFBD648214E1> /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/LangAnalysis.framework/Versions/A/LangAnalysis+ 0x7fff8c8cc000 - 0x7fff8c8d9ff7 libxar.1.dylib (202) <E0BFCC9B-89D4-3F42-8460-4918573EFCA1> /usr/lib/libxar.1.dylib+ 0x7fff8c8da000 - 0x7fff8cbaaff4 com.apple.CoreImage (9.0.33) <8BB17AEC-D09A-3173-8767-7DB5C982670E> /System/Library/Frameworks/QuartzCore.framework/Versions/A/Frameworks/CoreImage.framework/Versions/A/CoreImage+ 0x7fff8cbab000 - 0x7fff8cbabff7 libkeymgr.dylib (28) <AB6DE146-DDC4-397B-9182-ECE54FCDF5D7> /usr/lib/system/libkeymgr.dylib+ 0x7fff8d095000 - 0x7fff8d09eff7 com.apple.speech.synthesis.framework (4.5.3 - 4.5.3) <B4B4F401-701F-3A6E-AB39-65BDBB9F3FA0> /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/SpeechSynthesis.framework/Versions/A/SpeechSynthesis+ 0x7fff8d21a000 - 0x7fff8d274ff8 com.apple.AE (665.2 - 665.2) <DB39E7DF-E5EA-3D5C-81A5-1BA2159A2694> /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/AE.framework/Versions/A/AE+ 0x7fff8d2fb000 - 0x7fff8d342ff7 libcups.2.dylib (365) <49F3E642-D748-3A60-AF51-F9E90F65C543> /usr/lib/libcups.2.dylib+ 0x7fff8d343000 - 0x7fff8d350ff0 libbz2.1.0.dylib (29) <C1100E81-9C9D-3E4E-B238-F4015BB35B15> /usr/lib/libbz2.1.0.dylib+ 0x7fff8d489000 - 0x7fff8d489fff com.apple.Accelerate (1.9 - Accelerate 1.9) <94C28250-6BDB-30AD-B157-995D9C34A6FA> /System/Library/Frameworks/Accelerate.framework/Versions/A/Accelerate+ 0x7fff8d75b000 - 0x7fff8d7a8fff com.apple.opencl (2.3.50 - 2.3.50) <33C1EC76-02A2-3474-BB9D-8F77B96E57CC> /System/Library/Frameworks/OpenCL.framework/Versions/A/OpenCL+ 0x7fff8dd58000 - 0x7fff8dd5dff7 libunwind.dylib (35.3) <838CE69D-44F1-305C-8FA5-5E439D217F78> /usr/lib/system/libunwind.dylib+ 0x7fff8dd5e000 - 0x7fff8dd61fff libCoreVMClient.dylib (58.1) <331C429A-3AE5-30B8-A4DE-1BF4EE4D8FA6> /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libCoreVMClient.dylib+ 0x7fff8de3e000 - 0x7fff8de3fff7 libDiagnosticMessagesClient.dylib (100) <B28C426E-E826-3EC3-80AD-E69F2EABE46B> /usr/lib/libDiagnosticMessagesClient.dylib+ 0x7fff8de40000 - 0x7fff8de6ffff com.apple.DebugSymbols (106 - 106) <545E5A48-3516-3398-A33D-D6FB4FED4B7B> /System/Library/PrivateFrameworks/DebugSymbols.framework/Versions/A/DebugSymbols+ 0x7fff8e4b2000 - 0x7fff8e500fff libcorecrypto.dylib (161) <56048D2C-3668-3E15-AF02-5C5A377320F6> /usr/lib/system/libcorecrypto.dylib+ 0x7fff8e501000 - 0x7fff8e5c7ff7 com.apple.LaunchServices (572.3 - 572.3.1) <39618733-CC97-3991-BD3B-485BD7247115> /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/LaunchServices.framework/Versions/A/LaunchServices+ 0x7fff8e5ca000 - 0x7fff8e5caffd libOpenScriptingUtil.dylib (154) <9B8CECA0-360D-3C6D-A37D-95EE34AE2B16> /usr/lib/libOpenScriptingUtil.dylib+ 0x7fff8e9ac000 - 0x7fff8e9b4ff7 com.apple.speech.recognition.framework (4.2.4 - 4.2.4) <1CE37DE8-BA4A-30CD-A802-18DAF42C328F> /System/Library/Frameworks/Carbon.framework/Versions/A/Frameworks/SpeechRecognition.framework/Versions/A/SpeechRecognition+ 0x7fff8ea01000 - 0x7fff8ea65ff6 com.apple.Heimdal (4.0 - 2.0) <463F41AC-39FF-30FC-B03A-4198E7A9321F> /System/Library/PrivateFrameworks/Heimdal.framework/Versions/A/Heimdal+ 0x7fff8ea66000 - 0x7fff8ea6efff libsystem_dnssd.dylib (522.1.3) <29695A12-75FC-36EE-97AC-179F6E9DA419> /usr/lib/system/libsystem_dnssd.dylib+ 0x7fff8eb28000 - 0x7fff8eb33fff libGL.dylib (9.0.74) <2DB19533-5983-3F59-93F3-2761DA6EEDA5> /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGL.dylib+ 0x7fff8eb37000 - 0x7fff8eb43ff3 com.apple.AppleFSCompression (56 - 1.0) <D80DF0B8-AC14-3686-9242-9750D6A8B8D3> /System/Library/PrivateFrameworks/AppleFSCompression.framework/Versions/A/AppleFSCompression+ 0x7fff8eb44000 - 0x7fff8f44a043 com.apple.CoreGraphics (1.600.0 - 565) <81F84822-675E-3466-97A7-6FF69DF569E3> /System/Library/Frameworks/CoreGraphics.framework/Versions/A/CoreGraphics+ 0x7fff8f44b000 - 0x7fff8f461fff com.apple.CFOpenDirectory (10.9 - 171) <A650D21D-D825-3C4E-AA2E-1218F8A5048E> /System/Library/Frameworks/OpenDirectory.framework/Versions/A/Frameworks/CFOpenDirectory.framework/Versions/A/CFOpenDirectory+ 0x7fff9003c000 - 0x7fff900c5fe7 libsystem_c.dylib (997) <5BAB0B09-A39E-39B9-9552-48B540B3ABD0> /usr/lib/system/libsystem_c.dylib+ 0x7fff9088e000 - 0x7fff908b2fff libJPEG.dylib (1029) <D161F451-9A14-31DD-83D8-C475F8576ACF> /System/Library/Frameworks/ImageIO.framework/Versions/A/Resources/libJPEG.dylib+ 0x7fff908b3000 - 0x7fff908f7ffe com.apple.HIServices (1.22 - 454) <3625AF2C-1965-349D-B831-1FCC9084B675> /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/HIServices.framework/Versions/A/HIServices+ 0x7fff908f8000 - 0x7fff90bc7fdf com.apple.vImage (7.0 - 7.0) <C50F8737-E292-3D53-9AF7-F76797A1DDDD> /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vImage.framework/Versions/A/vImage+ 0x7fff90ce8000 - 0x7fff90d03ff7 libsystem_kernel.dylib (2422.1.26.0.1) <5F99677C-C760-3877-AFF7-F60B5ECE365E> /usr/lib/system/libsystem_kernel.dylib+ 0x7fff90d04000 - 0x7fff90d77ffb com.apple.securityfoundation (6.0 - 55122) <A946CA5A-1396-3467-94B1-E6A8FA0347FC> /System/Library/Frameworks/SecurityFoundation.framework/Versions/A/SecurityFoundation+ 0x7fff90e98000 - 0x7fff91034fff com.apple.QuartzCore (1.8 - 329.0) <08CE1885-71E8-3A38-AEB6-4BBB1A43785F> /System/Library/Frameworks/QuartzCore.framework/Versions/A/QuartzCore+ 0x7fff91035000 - 0x7fff91050ff7 libPng.dylib (1029) <AB7D23B2-CB41-3108-A19E-9F7BA6F37178> /System/Library/Frameworks/ImageIO.framework/Versions/A/Resources/libPng.dylib+ 0x7fff910c3000 - 0x7fff9113aff7 com.apple.CoreServices.OSServices (600 - 600) <73820122-62D4-359C-9312-CD49FCEDFE09> /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/OSServices.framework/Versions/A/OSServices+ 0x7fff9115a000 - 0x7fff911e5fff com.apple.Metadata (10.7.0 - 778.1) <93F05A4E-6581-3CD5-8697-84783CEBF764> /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/Metadata.framework/Versions/A/Metadata+ 0x7fff9139d000 - 0x7fff913a4ff3 libcopyfile.dylib (103) <54DD5730-3F05-3F18-B55C-24EA9546286F> /usr/lib/system/libcopyfile.dylib+ 0x7fff9152c000 - 0x7fff91530ff7 libheimdal-asn1.dylib (323.3) <90100758-0CC6-3D00-90AB-D3C7DC8CCE45> /usr/lib/libheimdal-asn1.dylib+ 0x7fff9193c000 - 0x7fff91947fff libkxld.dylib (2422.1.26.0.1) <CF43FD8E-E8FE-34F7-A3B1-286530AA9EFD> /usr/lib/system/libkxld.dylib+ 0x7fff9194e000 - 0x7fff91950ff7 libquarantine.dylib (69) <1776AABC-F1D7-3CB0-B698-B0C70D4E535B> /usr/lib/system/libquarantine.dylib+ 0x7fff91951000 - 0x7fff9195efff com.apple.Sharing (112 - 112) <24BA2112-4FFB-318A-B881-93FEB4648371> /System/Library/PrivateFrameworks/Sharing.framework/Versions/A/Sharing+ 0x7fff919fb000 - 0x7fff91a02ff7 libsystem_pthread.dylib (53) <2160EC74-26FC-32CE-8161-B1A72D2B09B0> /usr/lib/system/libsystem_pthread.dylib+ 0x7fff91a03000 - 0x7fff91a2cfff com.apple.DictionaryServices (1.2 - 197) <862F498E-3CB7-3087-BB07-AC185D5D08F8> /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/DictionaryServices.framework/Versions/A/DictionaryServices+ 0x7fff91a3c000 - 0x7fff91b04ff7 libvDSP.dylib (423.29) <72A38066-D6F5-38EC-A8B9-0D025AFC6E2B> /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libvDSP.dylib+ 0x7fff91b05000 - 0x7fff91b43ff7 libGLImage.dylib (9.0.74) <0DD99DA1-A8E7-3309-8DED-A2AB410E59C8> /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGLImage.dylib+ 0x7fff92ade000 - 0x7fff92b00fff libxpc.dylib (300.1.4) <4F832032-9709-3E80-91C4-71914C67A32B> /usr/lib/system/libxpc.dylib+ 0x7fff92b01000 - 0x7fff92b04ff7 libdyld.dylib (237) <EA2A0414-849F-3976-BA4E-A93D3206ECE5> /usr/lib/system/libdyld.dylib+ 0x7fff92b05000 - 0x7fff92b05fff com.apple.ApplicationServices (48 - 48) <21188B7D-50E8-3C28-A15E-5345AE7BAFBB> /System/Library/Frameworks/ApplicationServices.framework/Versions/A/ApplicationServices+ 0x7fff92b08000 - 0x7fff92b6cff7 com.apple.datadetectorscore (5.0 - 343.0) <7FE14856-0C85-3382-AD6C-1B9E21C276CB> /System/Library/PrivateFrameworks/DataDetectorsCore.framework/Versions/A/DataDetectorsCore+ 0x7fff92b6d000 - 0x7fff92b6fff3 libsystem_configuration.dylib (596.1) <1E0FDEA3-8822-3E80-AA0D-57D0F4E30E2E> /usr/lib/system/libsystem_configuration.dylib+ 0x7fff92e00000 - 0x7fff92e53fff com.apple.ScalableUserInterface (1.0 - 1) <A82F7DD8-1C79-3872-96D1-875B4ED121D4> /System/Library/Frameworks/QuartzCore.framework/Versions/A/Frameworks/ScalableUserInterface.framework/Versions/A/ScalableUserInterface+ 0x7fff92e72000 - 0x7fff92e73fff libunc.dylib (28) <53C7CED6-55F5-3121-B00E-4339C29297C8> /usr/lib/system/libunc.dylib+ 0x7fff92e91000 - 0x7fff92f53ff9 com.apple.CoreText (352.0 - 367.6) <CAFF0767-3351-3FE3-843F-6EA65B8264C8> /System/Library/Frameworks/CoreText.framework/Versions/A/CoreText+ 0x7fff934c7000 - 0x7fff934e2ff7 libCRFSuite.dylib (34) <E2353929-97B1-356A-84A0-CC650BC734D5> /usr/lib/libCRFSuite.dylib+ 0x7fff934e3000 - 0x7fff93508ffb com.apple.CoreVideo (1.8 - 117.0) <50587BF1-D111-3D49-9DAB-8F86B5E95808> /System/Library/Frameworks/CoreVideo.framework/Versions/A/CoreVideo+ 0x7fff93509000 - 0x7fff93522ff7 com.apple.Kerberos (3.0 - 1) <13DDC487-95C0-379F-BD7F-E0FC5F5922D3> /System/Library/Frameworks/Kerberos.framework/Versions/A/Kerberos+ 0x7fff93523000 - 0x7fff935a2fff com.apple.CoreSymbolication (3.0 - 137) <85C4F6E2-5039-3E53-9AB2-6D65CAC9AAC5> /System/Library/PrivateFrameworks/CoreSymbolication.framework/Versions/A/CoreSymbolication+ 0x7fff935a3000 - 0x7fff935bdfff libsystem_malloc.dylib (23.1.1) <FBCF2C62-AA8D-322E-859E-B5D90C610A3F> /usr/lib/system/libsystem_malloc.dylib+ 0x7fff935bf000 - 0x7fff93600ff7 com.apple.PerformanceAnalysis (1.45 - 45) <6C498B15-45DB-362F-983B-764ECC9B8E21> /System/Library/PrivateFrameworks/PerformanceAnalysis.framework/Versions/A/PerformanceAnalysis+ 0x7fff9360f000 - 0x7fff93618ff3 libsystem_notify.dylib (121) <D34E9B17-297F-3C3F-BD16-69D1D9495B79> /usr/lib/system/libsystem_notify.dylib+ 0x7fff93619000 - 0x7fff9362bff7 com.apple.MultitouchSupport.framework (245.12 - 245.12) <06CAA8FB-BEC6-3EF1-96FA-3D8A1EEB0959> /System/Library/PrivateFrameworks/MultitouchSupport.framework/Versions/A/MultitouchSupport+ 0x7fff9367e000 - 0x7fff9368efff libbsm.0.dylib (33) <65C2FC5C-4B4B-3C1B-B935-D67A3BF96A79> /usr/lib/libbsm.0.dylib+ 0x7fff937f6000 - 0x7fff937fafff libpam.2.dylib (20) <17E3DA0D-EE71-3398-BA30-BDD8514A6135> /usr/lib/libpam.2.dylib+ 0x7fff93aea000 - 0x7fff93aedfff libsystem_stats.dylib (93.1.8.1.1) <CAC30E07-CE62-3536-8CD4-1A3CE44DD973> /usr/lib/system/libsystem_stats.dylib+ 0x7fff93b96000 - 0x7fff93d79ff7 com.apple.CoreFoundation (6.9 - 842) <DC8875C4-DC2C-3ADC-B88B-D66722953255> /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation+ 0x7fff93d7a000 - 0x7fff93db9fff libGLU.dylib (9.0.74) <294F4F86-E900-356C-9A47-0C47A929F2FB> /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGLU.dylib+ 0x7fff93dba000 - 0x7fff93e9cff7 com.apple.backup.framework (1.5 - 1.5) <70E20485-EDB6-3225-8AF6-6D9494CB98B7> /System/Library/PrivateFrameworks/Backup.framework/Versions/A/Backup+ 0x7fff93edb000 - 0x7fff93ee6ff7 com.apple.NetAuth (5.0 - 5.0) <64D42204-C075-3440-8C29-BBD68A99A771> /System/Library/PrivateFrameworks/NetAuth.framework/Versions/A/NetAuth+ 0x7fff93ee7000 - 0x7fff93ef3fff com.apple.OpenDirectory (10.9 - 171) <FDE80473-0ADF-363A-8111-43CAB01A3F61> /System/Library/Frameworks/OpenDirectory.framework/Versions/A/OpenDirectory+ 0x7fff93f3a000 - 0x7fff93f48ff7 com.apple.opengl (9.0.74 - 9.0.74) <9BD0013A-E503-3DA2-9F94-C42A11D2E734> /System/Library/Frameworks/OpenGL.framework/Versions/A/OpenGL+ 0x7fff93f56000 - 0x7fff93f85ff5 com.apple.GSS (4.0 - 2.0) <6765C9D7-8AC9-3694-B5D4-5C26B119851D> /System/Library/Frameworks/GSS.framework/Versions/A/GSS+ 0x7fff943f6000 - 0x7fff943fdfff libcompiler_rt.dylib (35) <A0A9D62C-E1A5-39A0-A38E-B0B38762002D> /usr/lib/system/libcompiler_rt.dylib+ 0x7fff943fe000 - 0x7fff94404fef libsystem_platform.dylib (24) <5D8FE8C3-2A62-3705-AB7D-FBD7C284AFBD> /usr/lib/system/libsystem_platform.dylib+ 0x7fff94405000 - 0x7fff9440fff7 com.apple.CrashReporterSupport (10.9 - 529) <F3BB7C5D-0775-3A05-944A-3A061E62B107> /System/Library/PrivateFrameworks/CrashReporterSupport.framework/Versions/A/CrashReporterSupport+ 0x7fff94428000 - 0x7fff9442bffc com.apple.IOSurface (91 - 91) <1B7746FC-3599-3BDB-A0DA-65795C999435> /System/Library/Frameworks/IOSurface.framework/Versions/A/IOSurface+ 0x7fff9442c000 - 0x7fff944dbff7 libvMisc.dylib (423.29) <83CBEBB6-B9C2-3D83-A32A-CED47CDB65D6> /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libvMisc.dylib+ 0x7fff9451b000 - 0x7fff9451cffb libremovefile.dylib (33) <D7EF6E8B-95D8-3D8E-918C-2D3F51D00060> /usr/lib/system/libremovefile.dylib+ 0x7fff9465b000 - 0x7fff94898fff com.apple.CoreData (107 - 468) <51F9B655-84D2-3E88-991B-914C9017BB08> /System/Library/Frameworks/CoreData.framework/Versions/A/CoreData+ 0x7fff948ab000 - 0x7fff948acfff com.apple.TrustEvaluationAgent (2.0 - 25) <644D981B-A5A7-31F5-99A6-9F180B9A5DE3> /System/Library/PrivateFrameworks/TrustEvaluationAgent.framework/Versions/A/TrustEvaluationAgent+ 0x7fff948ad000 - 0x7fff948d0fff com.apple.IconServices (25 - 25.4) <525BAAE5-F45C-3A15-ACED-2AF4EFFED546> /System/Library/PrivateFrameworks/IconServices.framework/Versions/A/IconServices+ 0x7fff948f6000 - 0x7fff94be0ff7 com.apple.CoreServices.CarbonCore (1077.6 - 1077.6) <C32B5E2A-3BD8-3D6C-A931-E05B47ECB3C9> /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/CarbonCore.framework/Versions/A/CarbonCore+ 0x7fff94be1000 - 0x7fff94c09ffb libxslt.1.dylib (13) <33D39746-6FCD-3F32-AFAE-2E45232BF6FB> /usr/lib/libxslt.1.dylib+ 0x7fff94c0a000 - 0x7fff94c14ff7 com.apple.bsd.ServiceManagement (2.0 - 2.0) <3E92DCA9-DA23-34E1-8C38-DA7488621FFB> /System/Library/Frameworks/ServiceManagement.framework/Versions/A/ServiceManagement+ 0x7fff94c15000 - 0x7fff94c1ffff libcommonCrypto.dylib (60049) <FC0D70F5-E485-32E6-BFC2-1E072047282B> /usr/lib/system/libcommonCrypto.dylib+ 0x7fff94c94000 - 0x7fff94d82fff libJP2.dylib (1029) <720403F5-7863-30D6-AC09-F5A04F069E1B> /System/Library/Frameworks/ImageIO.framework/Versions/A/Resources/libJP2.dylib+ 0x7fff94daf000 - 0x7fff94dc8ff3 com.apple.Ubiquity (1.3 - 280) <581DAEFC-B314-3F92-93CF-7B70BF22AEEF> /System/Library/PrivateFrameworks/Ubiquity.framework/Versions/A/Ubiquity+ 0x7fff95037000 - 0x7fff9513cfff com.apple.ImageIO.framework (3.2.0 - 1029) <FEF93B49-D136-3248-B46B-C026F7E906BD> /System/Library/Frameworks/ImageIO.framework/Versions/A/ImageIO+ 0x7fff9513d000 - 0x7fff9526aff7 com.apple.desktopservices (1.8 - 1.8) <ACF9A2F5-6285-316E-958A-25C0AFDF3AEA> /System/Library/PrivateFrameworks/DesktopServicesPriv.framework/Versions/A/DesktopServicesPriv+ 0x7fff9526b000 - 0x7fff95273ffc libGFXShared.dylib (9.0.74) <13A420C1-1B14-36F8-8F08-4698D423E52F> /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGFXShared.dylib+ 0x7fff95274000 - 0x7fff9528cff7 com.apple.GenerationalStorage (2.0 - 158) <5BCFBEED-09D2-3BD3-8EE0-85E809C47380> /System/Library/PrivateFrameworks/GenerationalStorage.framework/Versions/A/GenerationalStorage+ 0x7fff952b3000 - 0x7fff9533cff7 com.apple.ColorSync (4.9.0 - 4.9.0) <CBF9EA13-4FC4-34D8-812A-6A37189CD09E> /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/ColorSync.framework/Versions/A/ColorSync+ 0x7fff95361000 - 0x7fff953baff7 libTIFF.dylib (1029) <12303E45-734B-3D6C-A5C8-1495ECBC0344> /System/Library/Frameworks/ImageIO.framework/Versions/A/Resources/libTIFF.dylib+ 0x7fff9548c000 - 0x7fff954d9ff2 com.apple.print.framework.PrintCore (9.0 - 424) <B09BB55A-67C0-34F9-95DB-6F735842EAE5> /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/PrintCore.framework/Versions/A/PrintCore+ 0x7fff954e4000 - 0x7fff95547ff3 com.apple.SystemConfiguration (1.13 - 1.13) <73B50935-DFE8-31B8-8583-27A28B5A9D1E> /System/Library/Frameworks/SystemConfiguration.framework/Versions/A/SystemConfiguration+ 0x7fff955ac000 - 0x7fff955c6fff libdispatch.dylib (339.1.2) <A9C37B4E-B908-3212-BF59-CE336EC30E78> /usr/lib/system/libdispatch.dylib+ 0x7fff95ca6000 - 0x7fff95ca7ff3 libSystem.B.dylib (1197) <7589D08E-9338-3E28-AA74-9734F0D51CE0> /usr/lib/libSystem.B.dylib+ 0x7fff95cb3000 - 0x7fff95cfaff3 libFontRegistry.dylib (121.1) <C8BC9042-B3EA-35FB-B4D7-2B1A6E0E6AB5> /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/ATS.framework/Versions/A/Resources/libFontRegistry.dylib+ 0x7fff95cfb000 - 0x7fff95deafff libFontParser.dylib (106) <16B9215D-3244-365F-910F-FA033495E3F5> /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/ATS.framework/Versions/A/Resources/libFontParser.dylib+ 0x7fff95deb000 - 0x7fff95debfff com.apple.Cocoa (6.8 - 20) <B2519A80-93F8-3BEB-A6B2-780B0D291E89> /System/Library/Frameworks/Cocoa.framework/Versions/A/Cocoa+ 0x7fff95e0f000 - 0x7fff95e10fff liblangid.dylib (117) <5146A22B-088F-3D8D-B245-F03DD3CDA2B0> /usr/lib/liblangid.dylib+ 0x7fff95e11000 - 0x7fff9696ffff com.apple.AppKit (6.9 - 1240) <53CEC6E0-F928-32EC-919D-B34C0818C88C> /System/Library/Frameworks/AppKit.framework/Versions/C/AppKit+ 0x7fff96970000 - 0x7fff96977fff com.apple.NetFS (6.0 - 4.0) <553EA9F4-7B2C-371A-AF03-4B709A730582> /System/Library/Frameworks/NetFS.framework/Versions/A/NetFS+ 0x7fff96978000 - 0x7fff969c8ffa com.apple.audio.CoreAudio (4.2.0 - 4.2.0) <548AC059-62DD-3CF6-B083-CABE454AFA38> /System/Library/Frameworks/CoreAudio.framework/Versions/A/CoreAudio+ 0x7fff96a12000 - 0x7fff96a7cff7 com.apple.framework.IOKit (2.0.1 - 907.1.5) <BC9D0F47-DB6F-3AD0-B38F-267E891099D0> /System/Library/Frameworks/IOKit.framework/Versions/A/IOKit+ 0x7fff96add000 - 0x7fff96ae0fff com.apple.TCC (1.0 - 1) <1DF1D216-1355-3E4F-B4BE-3E3BA5A696EB> /System/Library/PrivateFrameworks/TCC.framework/Versions/A/TCC+ 0x7fff96ae1000 - 0x7fff96b06ff7 com.apple.ChunkingLibrary (2.0 - 154) <EBFF01E3-D26B-3031-9E4C-670303B1086A> /System/Library/PrivateFrameworks/ChunkingLibrary.framework/Versions/A/ChunkingLibrary+ 0x7fff96b07000 - 0x7fff96b0bff7 libGIF.dylib (1029) <000B8500-FC82-3016-8E59-9FA0D6395F04> /System/Library/Frameworks/ImageIO.framework/Versions/A/Resources/libGIF.dylib+ 0x7fff96b58000 - 0x7fff96b59ff7 libsystem_blocks.dylib (63) <7836104E-39B9-31B6-A0C7-C02ACD401ADE> /usr/lib/system/libsystem_blocks.dylib+ 0x7fff96db9000 - 0x7fff96db9ffd com.apple.audio.units.AudioUnit (1.9 - 1.9) <BBAD4575-CE0A-34EF-A5AF-36CD66FF260C> /System/Library/Frameworks/AudioUnit.framework/Versions/A/AudioUnit+ 0x7fff96df6000 - 0x7fff96e07fff libsystem_asl.dylib (217) <F8795719-7E14-3FB2-8F4D-FF814AFFB7F7> /usr/lib/system/libsystem_asl.dylib+ 0x7fff96e2d000 - 0x7fff96e5cfd2 libsystem_m.dylib (3047.15) <8A6B4EC2-BB25-342B-B3FE-9585175225B8> /usr/lib/system/libsystem_m.dylib+ 0x7fff96e5d000 - 0x7fff96fb3ff3 com.apple.audio.toolbox.AudioToolbox (1.9 - 1.9) <D3F44C67-987D-3955-B15F-74A27C7E59E3> /System/Library/Frameworks/AudioToolbox.framework/Versions/A/AudioToolbox+ 0x7fff96fb4000 - 0x7fff9709ffff libsqlite3.dylib (155) <F60CCD67-FA68-379E-9D9C-4085E06F5665> /usr/lib/libsqlite3.dylib+ 0x7fff970a0000 - 0x7fff97348ff9 com.apple.HIToolbox (2.1 - 681) <F25DDDC9-D3BC-3E80-A57D-EC1FE747B40B> /System/Library/Frameworks/Carbon.framework/Versions/A/Frameworks/HIToolbox.framework/Versions/A/HIToolbox+ 0x7fff97349000 - 0x7fff97383ffb com.apple.bom (12.0 - 192) <FE625F33-643C-310A-B931-14CEBC007302> /System/Library/PrivateFrameworks/Bom.framework/Versions/A/Bom+ 0x7fff97758000 - 0x7fff97759ff7 libsystem_sandbox.dylib (278.1) <F723F1D9-5561-344A-A6F0-B1373D355DBA> /usr/lib/system/libsystem_sandbox.dylib+ 0x7fff977fb000 - 0x7fff977fbfff com.apple.Accelerate.vecLib (3.9 - vecLib 3.9) <349BA8B4-1C72-30BE-B2BB-1898F51B9B5E> /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/vecLib+ 0x7fff97939000 - 0x7fff97aa2ff3 com.apple.CFNetwork (657 - 657) <59A9476F-19A2-3F8B-A9B0-8531EA36A4AE> /System/Library/Frameworks/CFNetwork.framework/Versions/A/CFNetwork+ 0x7fff97ac9000 - 0x7fff97b20fff com.apple.Symbolication (1.4 - 125) <C3269812-583B-3349-A675-CCCFDF3140DB> /System/Library/PrivateFrameworks/Symbolication.framework/Versions/A/Symbolication+ 0x7fff97b24000 - 0x7fff97b93ff1 com.apple.ApplicationServices.ATS (360 - 360) <8A3AD47D-2777-3019-80BB-4B17AA055E13> /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/ATS.framework/Versions/A/ATS+ 0x7fff97c01000 - 0x7fff97c28ff3 libsystem_info.dylib (449) <B5F10962-3DA2-3557-A0B1-369BB80EA6A5> /usr/lib/system/libsystem_info.dylib+ 0x7fff97d95000 - 0x7fff97e21ff7 com.apple.ink.framework (10.9 - 205) <A3B23363-D876-39CF-9290-F01520C484E3> /System/Library/Frameworks/Carbon.framework/Versions/A/Frameworks/Ink.framework/Versions/A/Ink+ 0x7fff97e22000 - 0x7fff97f04fff com.apple.coreui (2.1 - 224) <9F8C1983-1795-34DA-A0C1-7F126ECA0D8E> /System/Library/PrivateFrameworks/CoreUI.framework/Versions/A/CoreUI+ 0x7fff97f4d000 - 0x7fff97fbafff com.apple.SearchKit (1.4.0 - 1.4.0) <EACE2CF5-06EA-3899-9208-F9914C1922BD> /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/SearchKit.framework/Versions/A/SearchKit+ 0x7fff98062000 - 0x7fff982b6ff0 com.apple.security (7.0 - 55377) <2F4EFC9E-DD86-32E5-A2CB-E83A5DF34F8F> /System/Library/Frameworks/Security.framework/Versions/A/Security+ 0x7fff982b7000 - 0x7fff982bbff7 libcache.dylib (61) <E9CD6B70-0553-3808-87DA-D16A1A6AC3FB> /usr/lib/system/libcache.dylib+ 0x7fff982bc000 - 0x7fff982c1fff com.apple.DiskArbitration (2.6 - 2.6) <4D7487BB-C4A7-32DB-BEE2-CE55EA7F40B2> /System/Library/Frameworks/DiskArbitration.framework/Versions/A/DiskArbitration+ 0x7fff9838e000 - 0x7fff9838efff com.apple.CoreServices (59 - 59) <D84FB78F-0F3C-3383-AE76-4BD6E3173F7F> /System/Library/Frameworks/CoreServices.framework/Versions/A/CoreServices+ 0x7fff983e0000 - 0x7fff98418ff7 com.apple.RemoteViewServices (2.0 - 94) <7E7B5F1F-9F0E-3DF7-B6B9-152DFD2DFFC7> /System/Library/PrivateFrameworks/RemoteViewServices.framework/Versions/A/RemoteViewServices+ 0x7fff987c8000 - 0x7fff987e4fff libresolv.9.dylib (54) <78D891A1-6F8B-34D4-8F0D-59DB6DF53411> /usr/lib/libresolv.9.dylib+ 0x7fff987e5000 - 0x7fff987eafff libmacho.dylib (845) <0038681B-CEC4-348A-A7B8-4236C701F2F8> /usr/lib/system/libmacho.dylib+ 0x7fff98802000 - 0x7fff98844ff7 libauto.dylib (185.4) <379FBDA3-DB2A-35A3-A637-3893C0F0E52F> /usr/lib/libauto.dylib+ 0x7fff9890a000 - 0x7fff98d3dff7 com.apple.vision.FaceCore (3.0.0 - 3.0.0) <14255DCC-80BD-3690-9269-057D175A9FC5> /System/Library/PrivateFrameworks/FaceCore.framework/Versions/A/FaceCore+ 0x7fff98d66000 - 0x7fff98ed4ff7 libBLAS.dylib (1094.4) <80E99B02-BD2D-3D88-97B6-0BE2D8973633> /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libBLAS.dylib+ 0x7fff98f6b000 - 0x7fff98f6dfff libRadiance.dylib (1029) <4E13C7E9-9B17-33D3-9142-B645B5BBCCD6> /System/Library/Frameworks/ImageIO.framework/Versions/A/Resources/libRadiance.dylib+ 0x7fff98f6e000 - 0x7fff98f77ffe com.apple.CommonAuth (4.0 - 2.0) <3918EBA0-A124-37DC-9BA6-4D1370AF03A8> /System/Library/PrivateFrameworks/CommonAuth.framework/Versions/A/CommonAuth++ ++[[!format sh """+# If you can, paste a complete transcript of the problem occurring here.+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log+++# End of transcript or log.+"""]]
@@ -0,0 +1,25 @@+### Please describe the problem.+git-annex goes into a loop of I think Haskell's createProcess function and causes the entire operating system to starve of process creation.++### What steps will reproduce the problem?+The last file git-annex was processing was tinco.gpg, my gpg key exported with+ + gpg --export mail@tinco.nl --output tinco.gpg ++### What version of git-annex are you using? On what operating system?+4.20130516-g8a26544 on OSX++I had a remote setup using bup.++### Please provide any additional information below.+Unfortunately to fix the problem I have deleted the entire git repository and made a new init in the same directory, this time without the gpg file. Everything seems to be working now.++What I remember about the log file is that the last thing it said was something along the lines of ++add tinco.gpg++.. (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) ..etc++recv (resource unavailable or something) ..++> [[done]]; fixed 3 bugs! --[[Joey]]
@@ -0,0 +1,18 @@+What steps will reproduce the problem?++Put some large files into a direct mode repository (so fsck time is noticeable). git annex add them, commit, run git annex fsck.++What is the expected output? What do you see instead?++Expected: files are checksummed, which should take considerable amount of time for each file. For reference, in indirect mode, fsck takes a while for files of ~1GB size.+Actually: in direct mode, git annex fsck goes through all of the files in an instant and prints OK for each. I believe the file content is not verified.+Multiple runs of git annex fsck do the same thing.++What version of git-annex are you using? On what operating system?++git-annex version: 4.20130405, Linux++Please provide any additional information below.++> I've fixed it, fsck is indeed checksumming direct mode files now, as long+> as they're not known to be modified. [[done]] --[[Joey]]
@@ -0,0 +1,21 @@+What is says on the tin:++git annex fsck is a no-op in bare repos++See http://lists.madduck.net/pipermail/vcs-home/2011-June/000433.html++> Thinking about this some more, it would be difficult to do anything+> when bad content is found, since it also cannot update the location log.+> +> So this may be another thing blocked by [[todo/branching]], assuming+> that is fixed in a way that makes `.git-annex` available to bare repos.+> --[[Joey]] ++>> Even if there is nothing it can _do_, knowing that the data is intact,+>> or not, is valuable in and as of itself. -- RichiH++>>> While storing the data is no longer an issue in bare repos, fsck would+>>> need a special mode that examines all the location logs, since it+>>> cannot run thru the checked out files. --[[Joey]] ++>>>> [[done]]! --[[Joey]]
@@ -0,0 +1,13 @@+when i want to++ git annex get file++on repo ssh://host-without-port/annex, it works, but if i want to get a file from ssh://host:5122/annex, it tries to run command+ssh ["host:5122", "git-annex-shell 'configlist' '/annex/file'"] and fails. ssh needs the -p option to set the default port, it doesn't support host:port notation.+this is confusing because git can handle this url correctly, and will happily clone/push/pull to/from these url.++temporary workaround is to use ssh://host/annex as url and define remote.name.annex-ssh-options to "-p 5122", but we need to use this workaround when doing annex get and undo the workaround when pushing/cloning.++if i had more time, i would have learned haskell and provided a patch ;)++> Fixed in git! --[[Joey]] [[done]]
@@ -0,0 +1,34 @@+For test.com//test, I get this:++ % git annex copy . --to test.com//test+ (getting UUID for test...) git-annex: there is no git remote named "test.com//test"++And my .git/config changes from++ [remote "test.com//test"]+ url = richih@test.com:/test+ fetch = +refs/heads/*:refs/remotes/test.com//test/*++to++ [remote "test.com//test"]+ url = richih@test.com:/test+ fetch = +refs/heads/*:refs/remotes/test.com//test/*+ annex-uuid = xyz+ [remote "test"]+ annex-uuid = xyz+++Unless I am misunderstanding something, git annex gets confused about what the name of the remote it supposed to be, truncates at the dot for some operations and uses the full name for others.++> I've fixed this bug. [[done]]+> +> However, using "/" in a remote name seems likely to me to confuse +> git's own remote branch handling. Although I've never tried it.+> --[[Joey]] ++>> From what I can see, git handles / just fine, but would get upset about : which is why it's not allowed in a remote's name.+>> My naming scheme is host//path/to/annex. It sorts nicely and gives all important information left to right with the most specific parts at the beginning and end.+>> If you have any other ideas or scheme, I am all ears :)+>> Either way, thanks for fixing this so quickly.+>> -- RichiH
@@ -0,0 +1,130 @@+### Please describe the problem.++`git annex import` not only [[does not work with git annex repositories|bugs/`git annex import` does not work on other git annex repositories]], it even destroys the meta-data in that repository, because it moves the `.git/*` metadata out of the remote repository.++### What steps will reproduce the problem?++[[!format txt """+git init foo+cd foo+git annex init+dd if=/dev/urandom of=foo bs=1M count=1+git annex add foo+git commit -m'files'+cd ../+git init bar+cd bar+git annex init+mkdir foo+cd foo+git annex import ../../foo+cd ../../foo+git status+"""]]+++### What version of git-annex are you using? On what operating system?++[[!format txt """+anarcat@angela:foo$ git annex version+git-annex version: 4.20130921-g434dc22+build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP DNS Feeds Quvi+"""]]++### Please provide any additional information below.++[[!format sh """+# If you can, paste a complete transcript of the problem occurring here.+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log+anarcat@angela:~$ cd /tmp+anarcat@angela:/tmp$ mkdir test+anarcat@angela:/tmp$ cd test+anarcat@angela:test$ ls+anarcat@angela:test$ git init foo+Initialized empty Git repository in /tmp/test/foo/.git/+anarcat@angela:test$ cd foo+anarcat@angela:foo$ git annex init+init ok+(Recording state in git...)+anarcat@angela:foo$ dd if=/dev/urandom of=foo bs=1M count=1+1+0 enregistrements lus+1+0 enregistrements écrits+1048576 octets (1,0 MB) copiés, 0,410384 s, 2,6 MB/s+anarcat@angela:foo$ git annex add foo+add foo (checksum...) ok+(Recording state in git...)+anarcat@angela:foo$ git commit -m'files'+[master (root-commit) 83daa0b] files+ 1 file changed, 1 insertion(+)+ create mode 120000 foo+anarcat@angela:foo$ cd ../+anarcat@angela:test$ git init bar+Initialized empty Git repository in /tmp/test/bar/.git/+anarcat@angela:test$ cd bar+anarcat@angela:bar$ git annex init+init ok+(Recording state in git...)+anarcat@angela:bar$ mkdir foo+anarcat@angela:bar$ cd foo+anarcat@angela:foo$ git annex import ../../foo+import .git/COMMIT_EDITMSG (checksum...) ok+import .git/description (checksum...) ok+import .git/config (checksum...) ok+import .git/index (checksum...) ok+import .git/HEAD (checksum...) ok+import .git/annex/journal.lck (checksum...) ok+import .git/annex/index.lck (checksum...) ok+import .git/annex/sentinal (checksum...) ok+import .git/annex/sentinal.cache (checksum...) ok+import .git/annex/index (checksum...) ok+import .git/annex/objects/w2/Kz/SHA256E-s1048576--f957108785c8dc30cf792948b89d61af257c40e5ef0e1d20ff6cf6aadaf6f66b/SHA256E-s1048576--f957108785c8dc30cf792948b89d61af257c40e5ef0e1d20ff6cf6aadaf6f66b+git-annex: ../../foo/.git/annex/objects/w2/Kz/SHA256E-s1048576--f957108785c8dc30cf792948b89d61af257c40e5ef0e1d20ff6cf6aadaf6f66b/SHA256E-s1048576--f957108785c8dc30cf792948b89d61af257c40e5ef0e1d20ff6cf6aadaf6f66b: rename: permission denied (Permission denied)+failed+import .git/objects/0e/6881452189b7fc34809f101f075da7cca9d9d8 (checksum...) ok+import .git/objects/03/c0163611cd061af17b2dd58a93c95ffbb05040 (checksum...) ok+import .git/objects/39/10912eab082d015bface04ed3a8ed658b94893 (checksum...) ok+import .git/objects/21/05f6aaf523510f25516b04a0c07d5900df2b0b (checksum...) ok+import .git/objects/83/daa0b1d8290191f53d1d3b5e39e03653a89ce2 (checksum...) ok+import .git/objects/83/8fa78626a6cdc4399186172df9109d321ca0bf (checksum...) ok+import .git/objects/dc/1e1b7b811079e1c5826d44958b736fc3a3a458 (checksum...) ok+import .git/objects/7b/4d3d6a3ee2286b2da15c1aca39353d63c16fa2 (checksum...) ok+import .git/objects/86/2b2a09ebc7a1eb298dccc57be75bad897a7c10 (checksum...) ok+import .git/objects/e1/61ad2ad1843e39937caaf6add6f690fd361126 (checksum...) ok+import .git/objects/4b/825dc642cb6eb9a060e54bf8d69288fbee4904 (checksum...) ok+import .git/objects/9b/47feee99b5f24e0dc96cf4a20fcb88c0ec007d (checksum...) ok+import .git/objects/b0/8c838cfb09bafae40a05312092c37360c880b0 (checksum...) ok+import .git/refs/heads/master (checksum...) ok+import .git/refs/heads/git-annex (checksum...) ok+import .git/logs/HEAD (checksum...) ok+import .git/logs/refs/heads/master (checksum...) ok+import .git/logs/refs/heads/git-annex (checksum...) ok+import .git/info/exclude (checksum...) ok+import .git/hooks/pre-applypatch.sample (checksum...) ok+import .git/hooks/applypatch-msg.sample (checksum...) ok+import .git/hooks/pre-rebase.sample (checksum...) ok+import .git/hooks/update.sample (checksum...) ok+import .git/hooks/commit-msg.sample (checksum...) ok+import .git/hooks/pre-commit (checksum...) ok+import .git/hooks/prepare-commit-msg.sample (checksum...) ok+import .git/hooks/post-update.sample (checksum...) ok+import .git/hooks/pre-commit.sample (checksum...) ok+(Recording state in git...)+error: Invalid path 'foo/.git/COMMIT_EDITMSG'+error: unable to add foo/.git/COMMIT_EDITMSG to index+fatal: adding files failed++git-annex: user error (xargs ["-0","git","--git-dir=/tmp/test/bar/.git","--work-tree=/tmp/test/bar","add","--"] exited 123)+failed+git-annex: import: 2 failed+anarcat@angela:foo$ cd ../../foo+anarcat@angela:foo$ git status+fatal: Not a git repository (or any of the parent directories): .git+anarcat@angela:foo$+# End of transcript or log.+"""]]++Thanks! --[[anarcat]]++> Would have thought this was obviously something you shouldn't do+> (sorta like running git-annex import on your home directory),+> but ok, it can skip .git directories. [[done]] --[[Joey]]
@@ -0,0 +1,64 @@+### Please describe the problem.++git annex importfeed fails++### What steps will reproduce the problem?++git annex importfeed http://www.tatw.co.uk/podcast.xml++### On what operating system?++Ubuntu 12.04, the prebuilt linux tarball++[[!format sh """+$ git annex version+git-annex version: 4.20130922-g7dc188a+build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP Feeds Quvi+local repository version: 3+default repository version: 3+supported repository versions: 3 4+upgrade supported from repository versions: 0 1 2+"""]]+++### Please provide any additional information below.++[[!format sh """+# If you can, paste a complete transcript of the problem occurring here.+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log++$ git annex importfeed http://www.tatw.co.uk/podcast.xml+(checking known urls...)+(Recording state in git...)+importfeed http://www.tatw.co.uk/podcast.xml+--2013-09-27 12:16:09-- http://www.tatw.co.uk/podcast.xml+Résolution de www.tatw.co.uk (www.tatw.co.uk)... 88.190.26.130+Connexion vers www.tatw.co.uk (www.tatw.co.uk)|88.190.26.130|:80... connecté.+requête HTTP transmise, en attente de la réponse... 200 OK+Longueur: 41267 (40K) [application/xml]+Sauvegarde en : «/tmp/user/2166/feed10670»++100%[==========================================================================>] 41 267 81,6K/s ds 0,5s++2013-09-27 12:16:10 (81,6 KB/s) - «/tmp/user/2166/feed10670» sauvegardé [41267/41267]++addurl Above___Beyond__Group_Therapy/_001_Group_Therapy_Radio_with_Above___Beyond (downloading ...)+failed+addurl Above___Beyond__Group_Therapy/_002_Group_Therapy_Radio_with_Above___Beyond (downloading ...)+failed+addurl Above___Beyond__Group_Therapy/_003_Group_Therapy_Radio_with_Above___Beyond (downloading ...)+failed+addurl Above___Beyond__Group_Therapy/_004_Group_Therapy_Radio_with_Above___Beyond (downloading ...)+failed++etc+++# End of transcript or log.+"""]]++> This is a bug in the feed library: <https://github.com/sof/feed/issues/7> +> And already fixed upstream this morning, so if you need the fix +> immediately, build with cabal. Otherwise fix will percolate out to+> builds eventually.+> [[done]] --[[Joey]]
@@ -0,0 +1,78 @@+### Please describe the problem.++I have a repo that I initialized in direct mode because i felt unconfortable with the "symlink forest" approach.++Now that I prefer that, i want to switch back to indirect mode. The problem is, when I did that, I realized that some files in the repo were not writable by my user, and git annex indirect crashed, and didn't "indirect" all the files. Now the repo is in a "half-direct" state, and I seem to be unable to recover.++### What steps will reproduce the problem?++[[!format txt """+git init+git annex init+git annex direct+git annex add . # make sure some files are not writable by your user+git annex indirect+"""]]++The `indirect` step will stop at the file that is not writable and will fail to move some files to `.git/annex`. And then the repo is in `indirect` mode yet some files are still not symlinks.++Doing a `git annex direct` will try to commit all those nasty files into git, as it does a `git commit -a`.++### What version of git-annex are you using? On what operating system?++ git-annex version: 4.20130912-ga1faca3+ build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP DNS Feeds Quvi++Debian wheezy.++### Please provide any additional information below.++Ideally, there would be a way to just tell git annex it's really still in direct mode and migrate the remaining files.++The workaround is, obviously, to make sure you own all those files before messing around:++ chown -R you *+ chmod -R u+w *++A [[patch]], maybe, that allows you to flip cleanly between the two modes:++[[!format diff """+From a21dfc97da96883b2a088bb5f3f466296f08d858 Mon Sep 17 00:00:00 2001+From: =?UTF-8?q?Antoine=20Beaupr=C3=A9?= <anarcat@koumbit.org>+Date: Mon, 16 Sep 2013 13:58:29 -0400+Subject: [PATCH] do not commit -a when going back to direct mode++without this, if we switched to indirect mode but failed doing so+(because of a permission problem, for example), going back to+direct mode will commit all files to git, which we really want +to avoid.++---+ Command/Direct.hs | 1 -+ 1 file changed, 1 deletion(-)++diff --git a/Command/Direct.hs b/Command/Direct.hs+index 7835988..ed8ea6c 100644+--- a/Command/Direct.hs++++ b/Command/Direct.hs+@@ -33,7 +33,6 @@ perform = do+ showOutput+ _ <- inRepo $ Git.Command.runBool+ [ Param "commit"+- , Param "-a"+ , Param "-m"+ , Param "commit before switching to direct mode"+ ]+--+1.7.10.4++"""]]++Any update on this? Why is `-a` used here? -- [[anarcat]]++> -a is not really the problem. You certianly do usually want+> to commit your changes before converting to direct mode.+> +> [[done]]; now when this happens it catches the exception and +> leaves the file in direct mode, which is the same as it being+> unlocked. --[[Joey]]
@@ -0,0 +1,65 @@+_git annex initremote_ without a complete command set still adds an entry to the uuid.log etc... and thus clutters up the state of the annex. I would not have expected this behaviour as a user.++_initremote_ should fail and not do anything if the commands that it has been given are incomplete or incorrect. I was initialising a few rsync repos and noticed that i ended up having mutiple rsync remotes with the same name but different uuid's. I know its hard if not impossible to remove these uuid's so I have just marked them as "dead" in my live annexes.++Here's a transcript of the problem++<pre>+x00:sandbox jtang$ mkdir atest+x00:sandbox jtang$ cd atest/+x00:atest jtang$ git init+Initialized empty Git repository in /Users/jtang/sandbox/atest/.git/+x00:atest jtang$ git annex init +init ok+(Recording state in git...)+x00:atest jtang$ git annex status+supported backends: SHA256 SHA1 SHA512 SHA224 SHA384 SHA256E SHA1E SHA512E SHA224E SHA384E WORM URL+supported remote types: git S3 bup directory rsync web hook+trusted repositories: 0+semitrusted repositories: 2+ 00000000-0000-0000-0000-000000000001 -- web+ cbb58e1c-d737-11e1-b682-83239d5ff2e0 -- here+untrusted repositories: 0+dead repositories: 0+transfers in progress: none+available local disk space: 185 gigabytes (+1 megabyte reserved)+local annex keys: 0+local annex size: 0 bytes+known annex keys: 0+known annex size: 0 bytes+bloom filter size: 16 mebibytes (0% full)+backend usage: +x00:atest jtang$ git annex initremote foo+git-annex: Specify the type of remote with type=+x00:atest jtang$ git annex initremote foo type=rsync+(Recording state in git...)+initremote foo git-annex: Specify encryption=key or encryption=none or encryption=shared+x00:atest jtang$ git annex initremote foo type=rsync+(Recording state in git...)+initremote foo git-annex: Specify encryption=key or encryption=none or encryption=shared+x00:atest jtang$ git annex status+supported backends: SHA256 SHA1 SHA512 SHA224 SHA384 SHA256E SHA1E SHA512E SHA224E SHA384E WORM URL+supported remote types: git S3 bup directory rsync web hook+trusted repositories: (Recording state in git...)+0+semitrusted repositories: 5+ 00000000-0000-0000-0000-000000000001 -- web+ cbb58e1c-d737-11e1-b682-83239d5ff2e0 -- here+ d3adfcd0-d737-11e1-b15b-b7032388f8aa -- foo+ d6d8e1e0-d737-11e1-956a-0b3d3451226a -- foo+ d78d795c-d737-11e1-ac98-4fe3d6fdfd54 -- foo+untrusted repositories: 0+dead repositories: 0+transfers in progress: none+available local disk space: 185 gigabytes (+1 megabyte reserved)+local annex keys: 0+local annex size: 0 bytes+known annex keys: 0+known annex size: 0 bytes+bloom filter size: 16 mebibytes (0% full)+backend usage: +x00:atest jtang$ +</pre>++> Indeed, I broke that in June by making it record the name in a much too+> early stage. Now fixed. [[done]] --[[Joey]]
@@ -0,0 +1,19 @@+a <!-- (a suggestion for introducing severity tags on bugs,+feel free to discard) --> issue: `git annex initremote` (in particular, adding+a key as described in [[encryption]] -- `git annex initremote my_remote+encryption=my_key`) seems to iterate over the `.git-annex/???/???/*.log` files+with lstat (tested using strace).++in a 50k key git-annex on a slow disk, this takes quite a while, while not+seeming necessary (it's just re-encrypting the shared secret, is it?).++could you verify the observed behavior?++> This is due to `git commit` being called. `git commit` exposes git's +> rather innefficient handling of the index; in order to make a commit+> it has to write a new index file, and it does this by scanning every+> file in the repository. I think that git generally needs its index+> file handleing overhauled, particularly to deal with repositories with+> large numbers of files. git-annex is seems to already be running+> `git commit` in its most efficient mode, by specifying exactly what file+> to commit. [[done]] --[[Joey]]
@@ -0,0 +1,46 @@+I discovered a problem with `git annex map` and relative urls containing `~`.+In this case i have a remote `noam` configured with the the following urls:++ zsh» git remote show noam | head -3+ * remote noam+ Fetch URL: noam:bare-annex+ Push URL: noam:bare-annex++If i try to run `git annex map` i get the following error:++ zsh» git annex map+ map /home/esc/annex ok+ map noam (sshing...)+ bash: line 0: cd: /~/bare-annex/: No such file or directory+ Command ssh ["noam","cd '/~/bare-annex/' && git config --list"] failed; exit code 1+ (sshing...)+ ok++ running: dot -Tx11 map.dot++ ok++If i run the failing command manually, i get:++ zsh» ssh noam "cd ~/bare-annex && git config --list"+ core.repositoryformatversion=0+ core.filemode=true+ core.bare=true+ annex.uuid=f267f55c-0732-11e1-a93b-93119f9aaf54+ annex.version=3++Also i can change the remote url to an absolute one, in which case `git annex+map` works too:++ zsh» git remote set-url noam noam:/home/esc/bare-annex+ zsh» git annex map+ map /home/esc/annex ok+ map noam (sshing...)+ ok++ running: dot -Tx11 map.dot++ ok+++> [[fixed|done]] --[[Joey]]
@@ -0,0 +1,19 @@+`git annex migrate` leaves old, unlinked backend versions lying around. It+would be great if these were purged automatically somehow. ++> Yes, this is an issue mentioned in the+> [[tips/migrating_data_to_a_new_backend]].+> +> Since multiple files can point to the same content, it could be that+> only one file has been migrated, and the content is still used. So+> the content either has to be retained, or an operation as expensive+> as `git annex unused` used to find if something else still uses it. +> +> Rather than adding such an+> expensive operation to each call to migrate, I focused on hard-linking+> the values for the old and new keys, so that the old keys don't actually+> use any additional resources (beyond an extra inode).+> +> This way a lot of migrations can be done, and only when you're done you+> can do the more expensive cleanup pass if you want to. --[[Joey]]+> [[done]]
@@ -0,0 +1,11 @@+I have this line in the .gitignore file of one of my repos:+*log++So the command 'git annex init name' fails to add the file ".git-annex/uuid.log", and the same problem happens when git-annex-add'ing files.++> This is avoided on the v3 branch, which does not store these files in the+> same branch as your repository.++Also, when a file is git-ignored, it should be possible to 'git annex add' it with a -f/--force option, the same way git does it.++> Reasonable, [[done]] --[[Joey]]
@@ -0,0 +1,35 @@+### Please describe the problem.++In a direct mode repo (crippled/uncrippled filesystem does not matter), when a symlink is marked using `git update-index --skip-worktree <FILE>` and removed, git annex sync still `git rm`s the symlink. This does not happen in indirect mode (git annex sync leaves the symlink in git intact).++### What steps will reproduce the problem?++[[!format sh """+mkdir test-repo; cd test-repo+git init+git annex init+echo file1 >file1+git annex add+git commit -m"update"+cd ..+git clone test-repo test-repo2; cd test-repo2+git annex init+git annex direct+git update-index --skip-worktree file1+rm file1+git annex sync+"""]]++Output of `git annex sync` indicates file has been removed from git. Repeating these steps without the `git annex direct` above to set the second repo to direct mode will succeed in retaining the symlink in git.++### What version of git-annex are you using? On what operating system?++4.20130521 using git-annex-standalone AUR build (uses Linux executable tarball) on Arch Linux++### Please provide any additional information below.++I'd like to use the skip-worktree scheme in order to be able to rm the symlink files (from the filesystem, not git), specifically for my Android devices. Syncing my music annex creates .mp3 symlinks that aren't actually MP3s, which gives the stock apps some fits. This would only be for clearing out symlinks; I fully understand that trying to doing this for downloaded content in a direct repo would be a Class A no-no. :-)++I did a little digging in the code, and it looks like the source of this is the stageDirect step done specifically by `git annex sync` in direct repos (which makes sense, since indirect repos work). It does `git ls-files --others --exclude-standard --stage`. This list includes files marked skip-worktree, which means skip-worktree files would be treated like normal, and deleted because it's no longer there. There is an additional `-t` argument that could be added to ls-files that would provide the tag field to indicate if a file was marked skip-worktree, and they could be filtered out of processing.++I wonder if this would have side effects, or if there are other places in the code where skip-worktree files would need to be handled, though. I'm particularly motivated to solve this, so let me know if it doesn't look like it would get looked at right away, and I'll have an excuse to get a Haskell dev environment setup again and shake the rust off.
@@ -0,0 +1,33 @@+### Please describe the problem.++When git annex uninit is interrupted, git status shows++# On branch master+# Changes to be committed:+# (use "git reset HEAD <file>..." to unstage)++deleted: file1++file1 is the file that was being processed at the time of the interrupt.++### What steps will reproduce the problem?++git annex uninit++Ctrl-C++### What version of git-annex are you using? On what operating system?++4.20130709++### Please provide any additional information below.++[[!format sh """+# If you can, paste a complete transcript of the problem occurring here.+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log+++# End of transcript or log.+"""]]++> [[done]]; see my comment --[[Joey]]
@@ -0,0 +1,32 @@+### Please describe the problem.++Suppose there are files not added/committed to git annex.+Once git annex uninit is complete, these files are deleted.++### What steps will reproduce the problem?++cp big-file annex-dir;+cd annex-dir;+git annex uninit++...+big-file is gone++### What version of git-annex are you using? On what operating system?++4.20130709+Linux Ubuntu 13.04++### Please provide any additional information below.++[[!format sh """+# If you can, paste a complete transcript of the problem occurring here.+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log+++# End of transcript or log.+"""]]++[[!tag moreinfo]]++> [[done]]; unreproducible by anyone. --[[Joey]]
@@ -0,0 +1,7 @@+Running a command like++git annex unlock myfile++is not atomic, that is if the execution is aborted you may end up with an incomplete version of myfile in the directory. If you don't notice this you may lock it again and then propagate this bad version of the file to your other repositories. A simple workaround is to simply name it something else while unlocking and then rename it to the correct filename once it's completely copied. I don't know Haskel yet so I can not fix this issue otherwise I would sure try. A part from this, I love git annex.++> [[fixed|done]] --[[Joey]]
@@ -0,0 +1,15 @@+What steps will reproduce the problem?+I don't know exactly when it started++What is the expected output? What do you see instead?+When I run git annex unused I get++ unused . (checking for unused data...) (checking master...) git-annex: Cannot decode byte '\xb4': Data.Text.Encoding.decodeUtf8: Invalid UTF-8 stream++Most likely I have added some file with a strange encoding that git-annex can't decode. The problem is that the unused process aborts because of this.++What version of git-annex are you using? On what operating system?+ 3.20120522, Debian testing++> I've just fixed this bug in git, will be in the next release. --[[Joey]]+> [[done]]
@@ -0,0 +1,15 @@+[[!meta title="`git annex unused` fails on empty repository"]]++The ``git annex unused`` command fails on a git-annex repository, if there are no objects yet:++ $ git annex unused+ unused (checking for unused data...) + git-annex: /tmp/annextest/other_annex/.git/annex/objects: getDirectoryContents: does not exist (No such file or directory) + git-annex: 1 failed+ $++This can give a user (especially one that wants to try out simple commands with his newly created repo) the impression that something is wrong, while it is not. I'd expect the program either to show the same message ``git annex unused`` shows when everything is ok (since it is, or should be).++This can be a bug in the ``unused`` subcommand (that fails to accept the absence of an objects directory) or in the ``init`` subcommand (that fails to create it).++> [[fixed|done]] --[[Joey]]
@@ -0,0 +1,39 @@+When I run `git annex unused` from my repository's root it shows everything ok:++ ~/annex$ git annex unused+ unused (checking for unused data...) ok++But... When I run it from a subdirectory, it shows a lot:++ ~/annex/Software$ git annex unused+ unused (checking for unused data...) + Some annexed data is no longer pointed to by any files in the repository:+ NUMBER KEY+ 1 SHA1:########################################+ ...+ 921 SHA1:########################################+ (To see where data was previously used, try: git log --stat -S'KEY')+ (To remove unwanted data: git-annex dropunused NUMBER)+ ok++Is this a bug or by design? By removing these "unused" files with `dropunused` I've just lost the only copy of 160 files.++I am using git-annex version 836e71297b8e3b5bd6f89f7eb1198f59af985b0b++> I'm very sorry you lost data.+> +> But, git annex unused absolutely does not let the current directory+> influence what it does. It always scans the entire repo from the top.+> And I've tested it just now to make sure that in a subdirectory+> it does the same thing as at the top. +> +> There are only two ways this could happen that I can think of:+> +> 1. If "Software" were a separate git repository than "~/annex".+> 2. If gitignores or something made `git ls-files`+> not list the files when ran in the subdir. This seems *possible*,+> but I don't know how to construct such an ignore.+> +> --[[Joey]] ++>> Closing as there is no followup. [[done]] --[[Joey]]
@@ -0,0 +1,15 @@+Upgrading from v1 to v3:++ upgrade . (v1 to v2...) (moving content...) (updating symlinks...) (moving location logs...) (v2 to v3...) ..............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+ git-annex branch created+ Be sure to push this branch when pushing to remotes.+ ok++A whirly would be preferable, imo.++> Erm, I'm pretty sure you were the one who asked for there to be some+> progress dots, Richard.+> +> I'm not particularly interested in implementing a whirley that would only+> be used in this one place, in code that very few users are going to run+> again. I could remove the dots.. [[done]] --[[Joey]]
@@ -0,0 +1,7 @@+was checking the version of git-annex on a machine before cloning a repo...++ $ git annex version+ git-annex: Not in a git repository.++> made difficult by the Annex monad, but I made it work! --[[Joey]]+> [[done]]
@@ -0,0 +1,50 @@+### Please describe the problem.++webapp needs to be killed and restarted to finish setting up a new repository++### What steps will reproduce the problem?++I run on a remote linux server++git annex webapp --listen=10.222.0.1:4000++I get a url printed++click the url, it opens in my browser+click make a repository, and it doesn't finish loading the web page+if I ctrl-c git on the remote server and start it up again, click+the url again, i can continue to set up the new repository+++### What version of git-annex are you using? On what operating system?++git-annex version: 4.20130709+build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP++debian wheezy with git-annex pinned from sid++### Please provide any additional information below.++[[!format sh """+# If you can, paste a complete transcript of the problem occurring here.+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log++[2013-07-19 08:09:54 EST] main: starting assistant version 4.20130709+WebApp crashed: unable to bind to local socket+[2013-07-19 08:09:54 EST] WebApp: warning WebApp crashed: unable to bind to local socket++ dbus failed; falling back to mtab polling (ClientError {clientErrorMessage = "runClient: unable to determine DBUS address", clientErrorFatal = True})++ No known network monitor available through dbus; falling back to polling+(scanning...) [2013-07-19 08:09:54 EST] Watcher: Performing startup scan+(started...) Merge made by the 'recursive' strategy.+ ...book.azw | 1 ++ 1 file changed, 1 insertion(+)+ create mode 120000 Books/book.azw+[2013-07-19 08:13:03 EST] Committer: Committing changes to git+++# End of transcript or log.+"""]]++> Duplicate; [[closed|done]]. --[[Joey]]
@@ -0,0 +1,47 @@+### Please describe the problem.+I just installed git-annex-20130601 on Gentoo and when running git annex webapp it started to run things on wine.++### What steps will reproduce the problem?+On Gentoo ~amd64:+[[!format sh """+ ~$ layman -a haskell+ ~$ USE=webapp emerge -1 git-annex+ ~$ git annex webapp+"""]]+### What version of git-annex are you using? On what operating system?+dev-vcs/git-annex-4.20130601 from https://github.com/gentoo-haskell/gentoo-haskell/tree/master/dev-vcs/git-annex++On Gentoo ~amd64++### Please provide any additional information below.++[[!format sh """+# If you can, paste a complete transcript of the problem occurring here.+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log+~$ git annex webapp+Launching web browser on file:///tmp/webapp14071.html+libpng warning: Application built with libpng-1.6.2 but running with 1.5.13+err:menubuilder:convert_to_native_icon error 0x80004005 initializing encoder+libpng warning: Application built with libpng-1.6.2 but running with 1.5.13+err:menubuilder:convert_to_native_icon error 0x80004005 initializing encoder+libpng warning: Application built with libpng-1.6.2 but running with 1.5.13+err:menubuilder:convert_to_native_icon error 0x80004005 initializing encoder+...+fixme:exec:SHELL_execute flags ignored: 0x00000100+fixme:exec:SHELL_execute flags ignored: 0x00000100+fixme:exec:SHELL_execute flags ignored: 0x00000100+...++22185 me 20 0 2580M 10196 8156 S 0.0 0.1 0:00.09 ├─ start /ProgIDOpen htmlfile /home/reinis/.wine/dosdevices/z:/tmp/webapp2554.html+ 2597 me 21 1 2596M 10984 8764 S 0.0 0.1 0:01.23 ├─ c:\windows\system32\explorer.exe /desktop+ 2589 me 20 0 2581M 2344 1932 S 0.0 0.0 0:00.00 ├─ c:\windows\system32\plugplay.exe+ 2581 me 20 0 2593M 8900 7500 S 0.0 0.1 0:00.09 ├─ c:\windows\system32\winedevice.exe MountMgr+ 2577 me 20 0 2583M 2776 2272 S 0.0 0.0 0:00.00 ├─ c:\windows\system32\services.exe+ 2571 me 20 0 24960 7532 772 S 46.1 0.1 2:29.06 ├─ /usr/bin/wineserver++# End of transcript or log.+"""]]++> [[done]]; this is a misconfigured system, not a git-annex bug, +> and git-annex honors git config web.browser to allow working around+> this. --[[Joey]]
@@ -0,0 +1,60 @@+One of my remotes, on a USB drive, is behaving exceedingly strangely. Files sometimes refuse to copy to it - whether I copy to it from my home annex, or whether I "cd" to that USB drive and try to "get" files to it.++Note that the external HD is a FAT32 filesystem. This has never caused problems in the past, but I am wondering if some of the recent work on "crippled" filesystems might have caused breakage on existing repositories which had been working well on FAT32 filesystems?++What steps will reproduce the problem?++On my annex, something like this:++<pre>+Talislanta Books$ git annex whereis talislanta_fantasy_roleplaying.pdf+whereis talislanta_fantasy_roleplaying.pdf (2 copies) + d16d0d1a-3cdd-11e2-9161-67c83599f720 -- homeworld+ fa2bd02e-3ce2-11e2-a675-47389975a32e -- here (macbook)+ok+Talislanta Books$ git annex copy --to=toshiba talislanta_fantasy_roleplaying.pdf+copy talislanta_fantasy_roleplaying.pdf ok+Talislanta Books$ git annex whereis talislanta_fantasy_roleplaying.pdf+whereis talislanta_fantasy_roleplaying.pdf (2 copies) + d16d0d1a-3cdd-11e2-9161-67c83599f720 -- homeworld+ fa2bd02e-3ce2-11e2-a675-47389975a32e -- here (macbook)+ok+Talislanta Books$ cd /Volumes/TOSHIBAEXT/annex/Books/archive/Talislanta\ Books/+Talislanta Books$ git annex whereis talislanta_fantasy_roleplaying.pdf+whereis talislanta_fantasy_roleplaying.pdf (2 copies) + d16d0d1a-3cdd-11e2-9161-67c83599f720 -- homeworld+ fa2bd02e-3ce2-11e2-a675-47389975a32e -- macbook+ok+Talislanta Books$ git annex get talislanta_fantasy_roleplaying.pdf+Talislanta Books$ git annex whereis talislanta_fantasy_roleplaying.pdf+whereis talislanta_fantasy_roleplaying.pdf (2 copies) + d16d0d1a-3cdd-11e2-9161-67c83599f720 -- homeworld+ fa2bd02e-3ce2-11e2-a675-47389975a32e -- macbook+ok+Talislanta Books$+</pre>+++What is the expected output? What do you see instead?++I should be able to copy files to my external hard drive, /Volumes/TOSHIBAEXT/annex+++What version of git-annex are you using? On what operating system?++<pre>+Talislanta Books$ git annex version+git-annex version: 3.20130216+local repository version: 3+default repository version: 3+supported repository versions: 3+upgrade supported from repository versions: 0 1 2+</pre>++OS X 10.6 (lion)++Please provide any additional information below.++Most files are affected by this, a few are not. I don't see any pattern to which is which.++> Both bugs reported here are now [[done]]. --[[Joey]]
@@ -0,0 +1,42 @@+Sorry to be reporting another vague bug, this one interferes with my work unfortunately.++### Please describe the problem.+After uninstalling git-annix, running git commit returns the following error:++git: 'annex' is not a git command. See 'git --help'.++### What steps will reproduce the problem?++Install git-annex using the ubuntu ppa of fmarcier like so:++ sudo apt-get install git-annex++Then remove it:++ sudo apt-get remove git-annex++Then go to work in a git project, that is not in annex and has no relation to it. Add your changes and run commit:++ git add my-new-file+ git commit -m "added new file"++I expect it to confirm the file is committed, instead I get the error message:+ + git: 'annex' is not a git command. See 'git --help'.++### What version of git-annex are you using? On what operating system?++Ubuntu 13.04, using the PPA by marcier linked on the branchable website.++> I don't think this is something I want to change.. `git-annex init`+> installs a pre-commit hook that runs `git annex fix`. If git-annex+> is removed that hook is left behind to fail. However, if you were really+> using git-annex in the repo, that's the least of your troubles. If you were+> using git-annex in the repo and stopped, then you should run `git annex uninit` to remove the hook.+>+> The only change I could make is to have the hook check if git-annex+> is in PATH before trying to run it. But this adds time and complexity+> to the usual case for a edge case. And keeps cruft around in the edge case+> rather than informing you of the problem. +> +> [[done]] --[[Joey]]
@@ -0,0 +1,34 @@+What steps will reproduce the problem?++run git annex assistant, add a file, which is picked up and pushed by the assistant. ++What is the expected output? What do you see instead?++a ps -ef shows a large number of defunct git processes.. for example:+<pre>+nelg 9622 1 0 02:01 ? 00:00:01 git-annex assistant+nelg 9637 9622 0 02:01 ? 00:00:00 git --git-dir=/home/nelg/Downloads/test2/.git --work-tree=/home/nelg/Downloads/test2 cat-file --batch+nelg 12080 9622 0 02:19 ? 00:00:00 [git] <defunct>+nelg 12082 9622 0 02:19 ? 00:00:00 [git] <defunct>+nelg 12083 9622 0 02:19 ? 00:00:00 [git] <defunct>+nelg 12084 9622 0 02:19 ? 00:00:00 [git] <defunct>+-----+</pre>++What version of git-annex are you using? On what operating system?++Compiled git annex from git (cbcd208d158f8e42dda03a5eeaf1bac21045a140), on Mandriva 2010.2, 32 bit, using ghc-7.4.1.+ git version 1.7.1+++Please provide any additional information below.++I also found that the version of git I have does not support the option: --allow-empty-message+So, suggest that if the version of git installed is an older version, that the params in Assistant/Threads/Committer.hs+are changed to [ Param "-m", Param "git assistant".... or something like that.++I have done this on my copy for testing it.++For testing, I am also using two repositories on the same computer. I set this up from the command line, as the web app does not seem to support syncing to two different git folders on the same computer.++> [[done]]; all zombies are squelched now in the assistant. --[[Joey]]
@@ -0,0 +1,13 @@+It's unfortunate that git-annex sorta defeats git's rename detection.++When an annexed file is moved to a different directory (specifically, a+directory that is shallower or deeper than the old directory),+the symlink often has to change. And so git log cannot --follow back+through the rename history, since all it has to go on is that symlink,+which it effectively sees as a one line file containing the symlink target.++One way to fix this might be to do the `git annex fix` *after* the rename+is committed. This would mean that a commit would result in new staged+changes for another commit, which is perhaps startling behavior.++The other way to fix it is to stop using symlinks, see [[todo/smudge]].
@@ -0,0 +1,8 @@+### Please describe the problem.+I created a .gitignore file and added it to git annex. In the assistant webapp log, the error "The installed version of git is too old for .gitignores to be honored by git-annex." shows up. According to [[bugs/assistant_ignore_.gitignore/]] this bug should be fixed in a later git version.++### What steps will reproduce the problem?+Download the current prebuilt linux tarball from [[/install]], extract it, run "./runshell", then "git --version" returns "git version 1.7.10.4"++### What version of git-annex are you using? On what operating system?+git-annex-standalone-amd64.tar.gz 2013-09-22 09:56 (Linux Ubuntu Precise)
@@ -0,0 +1,23 @@+> What steps will reproduce the problem?++Run 'git-annex help'++> What is the expected output?++Something similar to 'git-annex --help', or a pointer to --help.++> What do you see instead?++ git-annex: Unknown command 'help'+ Did you mean one of these?+ drop+ dead++> What version of git-annex are you using? On what operating system?++git-annex version 3.20120825 on Arch Linux x86_64, installed from AUR package git-annex and using the [haskell] repository for dependencies.++>> Lol, that's great! Also worth noting that with help.autocorrect=1, it'd+>> actually run drop. Only with --force can you lose data however.+>>+>> I've added a help command. [[done]] --[[Joey]]
@@ -0,0 +1,14 @@+glacier-cli currently relies on a local cache of+inventory information, and so other git-annexes using the same glacier+repository are not able to access stuff in it, unless and until+`glacier vault sync` is run.++An example of this causing trouble is with the assistant. When a file is+moved into archive/, the assistant that sends it to glacier is able to+trust that it's in glacier and remove the local copy. But other assistants+that also have a copy cannot trust that, and so don't remove their copies.++I've discussed with glacier-cli's author making git-annex store enough info+in its branch to be able to bootstrap glacier-cli to know about a file.+This seems doable and he had a design; waiting on movement +on the glacier-cli side.
@@ -0,0 +1,16 @@+### Please describe the problem.+Git-Annex crashes when configuring jabber account with foo.bar@googlemail.com++### What steps will reproduce the problem?+Configure the Jabber Account with foo.bar@googlemail.com instead of foo.bar@gmail.com. The domain googlemail was used for a long time in germany because of a license issue. ++### What version of git-annex are you using? On what operating system?+Mac OS X - 10.8.3 Mountain Lion++Version: 4.20130709-g18e5f43 ++Build flags: Assistant Webapp Pairing Testsuite S3 WebDAV FsEvents XMPP DNS+++[[!meta title="xmpp fails to work with googlemail domain"]]+[[!tag design/assistant]]
@@ -0,0 +1,25 @@+What steps will reproduce the problem?++run++ /Applications/git-annex.app/Contents/MacOS/bin/gpg++from the terminal++What is the expected output? What do you see instead?++I expect to see typical gpg output. Instead, I see++ dyld: Library not loaded: /opt/local/lib/libiconv.2.dylib+ Referenced from: /Applications/git-annex.app/Contents/MacOS/bin/gpg+ Reason: Incompatible library version: gpg requires version 8.0.0 or later, but libiconv.2.dylib provides version 7.0.0+ Trace/BPT trap: 5++What version of git-annex are you using? On what operating system?++git annex Version: 3.20121017 on Mac OS X 10.7.5++[[!tag /design/assistant/OSX]]++> Libraries are now handled better in the OSX app and this should be able+> to happen anymore. [[done]] --[[Joey]]
@@ -0,0 +1,39 @@+### Please describe the problem.++Adding an existing cloud repo on box.com results in an gpg error:++ user error (gpg ["--quiet","--trust-model","always","--batch","--passphrase-fd","86","--decrypt"] exited 2)++### What steps will reproduce the problem?++Enabling an existing cloud repository.++### What version of git-annex are you using? On what operating system?++Latest Android (4.20130516-g32 40006) on a rooted Samsung Galaxy Note (CyanogenMod 10.1)++### Please provide any additional information below.++[[!format sh """+# If you can, paste a complete transcript of the problem occurring here.+# If the problem is with the git-annex assistant, paste in .git/annex/debug.log++(merging refs/synced/de8a8792-70de-48c3-a646-a168ce1d9d35/c25hdXRoQGphYmJlci5vcmc=/git-annex into git-annex...)+(Recording state in git...)+(gpg) gpg: can't open `/usr/local/share/gnupg/options.skel': No such file or directory+gpg: DBG: locking for `/sdcard/git-annex.home/.gnupg/secring.gpg.lock' done via O_EXCL+gpg: DBG: locking for `/sdcard/git-annex.home/.gnupg/pubring.gpg.lock' done via O_EXCL+gpg: encrypted with unknown algorithm 3+gpg: decryption failed: secret key not available+(gpg) gpg: encrypted with unknown algorithm 3+gpg: decryption failed: secret key not available+(gpg) gpg: encrypted with unknown algorithm 3+gpg: decryption failed: secret key not available+(gpg) gpg: encrypted with unknown algorithm 3+gpg: decryption failed: secret key not available++# End of transcript or log.+"""]]++> [[done]]; I have deployed the new gpg build for Android and the+> nightly Android app build is now using it. --[[Joey]]
@@ -0,0 +1,18 @@+### Please describe the problem.+Bad input data given to gpg will make it lock.++### What steps will reproduce the problem?+Trying to download gpg encrypted data from remote with bad/incorrect data++### What version of git-annex are you using? On what operating system?+4.20130501-gd9e288b, on ubuntu 13.04++### Please provide any additional information below.+Transcript+http://paste.ubuntu.com/5626517/++Note: The problem is most likely caused by bad data from either the nntp hooks program, or the nntp server itself.++I also have one file with bad data that consistently is NOT a problem for gpg to handle(lines 24-25 of log).++[[!tag moreinfo]]
@@ -0,0 +1,78 @@+### Please describe the problem.+when attempting to create a glacier special remote one of the gpg sub-commands hangs without returning.++### What steps will reproduce the problem?+I'm not sure what will reproduce this issue. I recently upgraded from the apt-get version of git-annex (version 3) to the cabal version (version 4 shown below), but I'm not sure if that is relevant at all).++### What version of git-annex are you using? On what operating system?++git version: 1.7.9.5++(git annex was installed using cabal)+[[!format sh """+$> git-annex version+git-annex version: 4.20130709+build flags: Testsuite S3 Inotify DBus+local repository version: 3+default repository version: 3+supported repository versions: 3 4+upgrade supported from repository versions: 0 1 2+"""]]++OS version:++12.04.2 LTS, Precise Pangolin++GPG version:++[[!format sh """+$> gpg --version+gpg (GnuPG) 1.4.11+Copyright (C) 2010 Free Software Foundation, Inc.+License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>+This is free software: you are free to change and redistribute it.+There is NO WARRANTY, to the extent permitted by law.++Home: ~/.gnupg+Supported algorithms:+Pubkey: RSA, RSA-E, RSA-S, ELG-E, DSA+Cipher: 3DES, CAST5, BLOWFISH, AES, AES192, AES256, TWOFISH, CAMELLIA128,+ CAMELLIA192, CAMELLIA256+Hash: MD5, SHA1, RIPEMD160, SHA256, SHA384, SHA512, SHA224+Compression: Uncompressed, ZIP, ZLIB, BZIP2+"""]]++### Please provide any additional information below.++[[!format sh """+# If you can, paste a complete transcript of the problem occurring here.+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log++$> git annex initremote glacier type=glacier encryption=annex-l1@ggg.local embedcreds=yes vault=some-vault-name --verbose --debug+[2013-07-20 22:45:13 MDT] read: git ["--git-dir=/home/cantora/annex-l1/.git","--work-tree=/home/cantora/annex-l1","show-ref","git-annex"]+[2013-07-20 22:45:13 MDT] read: git ["--git-dir=/home/cantora/annex-l1/.git","--work-tree=/home/cantora/annex-l1","show-ref","--hash","refs/heads/git-annex"]+[2013-07-20 22:45:13 MDT] read: git ["--git-dir=/home/cantora/annex-l1/.git","--work-tree=/home/cantora/annex-l1","log","refs/heads/git-annex..181aa86dfd264557ab73285220d70c67f868b349","--oneline","-n1"]+[2013-07-20 22:45:13 MDT] read: git ["--git-dir=/home/cantora/annex-l1/.git","--work-tree=/home/cantora/annex-l1","log","refs/heads/git-annex..1dc6e1c4bca2102fc25e86491ab89338750ee1f6","--oneline","-n1"]+[2013-07-20 22:45:13 MDT] read: git ["--git-dir=/home/cantora/annex-l1/.git","--work-tree=/home/cantora/annex-l1","log","refs/heads/git-annex..b919b83cafeff420d23af24ff7de35b4ff955c8c","--oneline","-n1"]+[2013-07-20 22:45:13 MDT] chat: git ["--git-dir=/home/cantora/annex-l1/.git","--work-tree=/home/cantora/annex-l1","cat-file","--batch"]+[2013-07-20 22:45:13 MDT] read: git ["config","--null","--list"]+initremote glacier (encryption setup) [2013-07-20 22:45:13 MDT] read: gpg ["--batch","--no-tty","--use-agent","--quiet","--trust-model","always","--with-colons","--list-public-keys","annex-l1@ggg.local"]+[2013-07-20 22:45:13 MDT] read: gpg ["--batch","--no-tty","--use-agent","--quiet","--trust-model","always","--gen-random","--armor","2","512"]+[2013-07-20 22:47:37 MDT] chat: gpg ["--batch","--no-tty","--use-agent","--quiet","--trust-model","always","--encrypt","--no-encrypt-to","--no-default-recipient","--recipient","DF31708872834ABA"]+(with gpg key DF31708872834ABA) [2013-07-20 22:47:37 MDT] call: glacier ["--region=us-east-1","vault","create","some-vault-name"]+[2013-07-20 22:47:38 MDT] call: git ["--git-dir=/home/cantora/annex-l1/.git","--work-tree=/home/cantora/annex-l1","config","remote.glacier.annex-glacier","true"]+[2013-07-20 22:47:38 MDT] call: git ["--git-dir=/home/cantora/annex-l1/.git","--work-tree=/home/cantora/annex-l1","config","remote.glacier.annex-uuid","a9739087-7860-4ed0-bc38-0b6031b1afd3"]+(gpg) [2013-07-20 22:47:38 MDT] chat: gpg ["--batch","--no-tty","--use-agent","--quiet","--trust-model","always","--decrypt"]+[2013-07-20 22:47:38 MDT] chat: gpg ["--batch","--no-tty","--use-agent","--quiet","--trust-model","always","--batch","--passphrase-fd","3","--symmetric","--force-mdc"]+#at this point it simply waits forever. not sure what it's waiting for, stdin maybe? maybe fd 3 is empty??++#[on a different terminal]+$> ps ax | grep gpg | grep -v ssh+ 2024 ? Ss 0:00 /usr/bin/gpg-agent --daemon --sh --write-env-file=/home/cantora/.gnupg/gpg-agent-info-ggg /usr/bin/dbus-launch --exit-with-session gnome-session --session=ubuntu+ 8341 pts/4 SL+ 0:00 gpg --batch --no-tty --use-agent --quiet --trust-model always --batch --passphrase-fd 3 --symmetric --force-mdc+ 8652 pts/5 S+ 0:00 grep --color=auto gpg++# End of transcript or log.+"""]]++> [[done]]; see comments --[[Joey]]
@@ -0,0 +1,53 @@+git-annex gpg encryption fails here when GPG_AGENT_INFO is set, it needs to be supplied --use-agent to work.++Output from git-annex:++ copy file (to origin...) (gpg) gpg: can't query passphrase in batch mode+ gpg: decryption failed: secret key not available+ Command gpg ["--batch","--no-tty","--quiet","--trust-model","always","--decrypt"] failed; exit code 2+ + git-annex: user error (Command gpg ["--batch","--no-tty","--quiet","--trust-model","always","--decrypt"] failed; exit code 2)+ failed++Reproduced on command-line:++ [0 zerodogg@browncoats ~]$ echo test > testfile+ [0 zerodogg@browncoats ~]$ gpg -e testfile+ [0 zerodogg@browncoats ~]$ gpg --batch --no-tty --quiet --trust-model always --decrypt testfile.gpg + gpg: can't query passphrase in batch mode+ gpg: decryption failed: secret key not available+ [2 zerodogg@browncoats ~]$ gpg --use-agent --batch --no-tty --quiet --trust-model always --decrypt testfile.gpg+ test+ [0 zerodogg@browncoats ~]$ ++A patch to fix this issue:+++ From 77cb02d15245e9ad6e127388adcda960000fb3b8 Mon Sep 17 00:00:00 2001+ From: Eskild Hustvedt <code@zerodogg.org>+ Date: Fri, 17 Aug 2012 09:21:44 +0200+ Subject: [PATCH] Explicitly enable agent to ensure decryption works+ + Otherwise gpg will fail when GPG_AGENT_INFO is set in certain cases.+ ---+ Utility/Gpg.hs | 2 +-+ 1 file changed, 1 insertion(+), 1 deletion(-)+ + diff --git a/Utility/Gpg.hs b/Utility/Gpg.hs+ index e13afe5..c28b209 100644+ --- a/Utility/Gpg.hs+ +++ b/Utility/Gpg.hs+ @@ -29,7 +29,7 @@ stdParams params = do+ b <- getEnv "GPG_BATCH"+ let batch = if isNothing e && isNothing b+ then []+ - else ["--batch", "--no-tty"]+ + else ["--batch", "--no-tty", "--use-agent"]+ return $ batch ++ defaults ++ toCommand params+ where+ -- be quiet, even about checking the trustdb+ -- + 1.7.10.4++> Thanks, [[done]].. I never noticed this since I have use-agent set in+> gpg.conf. --[[Joey]
@@ -0,0 +1,38 @@+### Please describe the problem.+My server is on debian testing. After an upgrade (git annex: 3.20120629 → 4.20130521) I can't do anything in my repository anymore. git itself works, but invoking any git-annex command leads to:++ git-annex: fd:6: hGetContents: user error (Pattern match failure in do expression at libraries/base/GHC/Event/Thread.hs:90:3-10)++This repo is handled by a script, which invokes only the following git/git-annex commands:++ $ git annex sync+ $ git annex add+ $ git commit -m "…"++I realized this after trying to move files from my server to my local repo. My local machine runs debian sid. When trying to transfer files, this happens:++ $ git annex sync+ → ok+ $ git annex move --from origin .+ move x.zip (from origin...) + user@host's password: ← pw ok+ git-annex-shell: fd:6: hGetContents: user error (Pattern match failure in do expression at libraries/base/GHC/Event/Thread.hs:90:3-10)+ rsync: connection unexpectedly closed (0 bytes received so far) [Receiver]+ rsync error: error in rsync protocol data stream (code 12) at io.c(605) [Receiver=3.0.9]+ failed++I updated git-annex on both machines to 4.20130627 (rest of server is still on debian testing), but it didn't change anything.++The server was not down since the last successful transfer, so I can't imagine anything interrupting any git-annex process.++### What steps will reproduce the problem?+See above.++### What version of git-annex are you using? On what operating system?+Server: 4.20130521 on debian testing (now: 4.20130627)+Local: 4.20130621 on debian sid (now: 4.20130627)++[[!meta title="fails to run on Linux with libc 2.17 and old kernel 2.6.32"]]++> Closing this since it's a bad kernel and there is a workaround to build+> a git-annex that will work with this kernel (see comments). [[done]] --[[Joey]]
@@ -0,0 +1,19 @@+What steps will reproduce the problem?+Set up a remote server using ssh to a FreeNAS box++What is the expected output? What do you see instead?+Neither rsync nor git-annex are installed+rsync is in the path, user with permissions is able to run it++What version of git-annex are you using? On what operating system?+4.20130227 OSX++Please provide any additional information below.+ssh keys were installed to allow login, when ssh-askpass was not found on osx version++[[!meta title="webapp rsync probe command failed on FreeNAS box"]]+[[!tag /design/assistant]]++> [[done]]; based on the error message it's using csh and +> the assistant will now wrap its shell commands to work with csh.+> --[[Joey]]
@@ -0,0 +1,222 @@+### Please describe the problem.+When I `git annex get` files in a certain directory, they are got, then are dropped.+When I do the same in a different directory, then the files there remains (as expected).++`git annex fsck` also fails on these files, but after that the problem persists.++I'm not really sure where to look to see why this is happening, especially why only on some directories.+The filesystem (ext4) this is on has several GB free.++Looking at the (broken) symlinks, they are strange:++[[!format sh """+git annex fsck IMG_4230.JPG > /dev/null+ls -l IMG_4230.JPG+lrwxrwxrwx 1 walter walter 207 Aug 13 12:14 IMG_4230.JPG -> ../../../.git/annex/objects/86/KF/SHA256E-s4209479--bba2489f526ed1288d23157b2b985bfda99321c52d05d3f4ddb92144b301318e.JPG/SHA256E-s4209479--bba2489f526ed1288d23157b2b985bfda99321c52d05d3f4ddb92144b301318e.JPG+"""]]++But then after getting it (and it being dropped somehow), the symlink is different (the number of ..s)++[[!format sh """+git annex get IMG_4230.JPG > /dev/null+ls -l IMG_4230.JPG+lrwxrwxrwx 1 walter walter 210 Aug 13 12:16 IMG_4230.JPG -> ../../../../.git/annex/objects/86/KF/SHA256E-s4209479--bba2489f526ed1288d23157b2b985bfda99321c52d05d3f4ddb92144b301318e.JPG/SHA256E-s4209479--bba2489f526ed1288d23157b2b985bfda99321c52d05d3f4ddb92144b301318e.JPG+"""]]++++### What steps will reproduce the problem?++I'm not really sure; I will test later whether this happens on other computers.++### What version of git-annex are you using? On what operating system?+ git-annex version: 4.20130812-gc590455+ build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP DNS+ local repository version: 3+ default repository version: 3+ supported repository versions: 3 4+ upgrade supported from repository versions: 0 1 2++On ubuntu 12.10+++--Walter++### Please provide any additional information below.++*output of git annex fsck*+[[!format sh """+git annex fsck 2013/08/01/IMG_4230.JPG+[2013-08-13 12:01:25 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","ls-files","--cached","-z","--","2013/08/01/IMG_4230.JPG"]+[2013-08-13 12:01:25 NZST] chat: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","check-attr","-z","--stdin","annex.backend","annex.numcopies","--"]+fsck 2013/08/01/IMG_4230.JPG [2013-08-13 12:01:25 NZST] chat: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","cat-file","--batch"]+[2013-08-13 12:01:25 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","show-ref","git-annex"]+[2013-08-13 12:01:25 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","show-ref","--hash","refs/heads/git-annex"]+[2013-08-13 12:01:25 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","log","refs/heads/git-annex..3afd101dade8be4e1ed7ac48fdf4173274d3ecd7","--oneline","-n1"]+[2013-08-13 12:01:25 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","log","refs/heads/git-annex..9be78e75db197a26db6aaaffbcddf5057e30d23f","--oneline","-n1"]+[2013-08-13 12:01:25 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","log","refs/heads/git-annex..2bae49a6e1ce85ad501b0fa85439da7cde8c8597","--oneline","-n1"]+[2013-08-13 12:01:25 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","log","refs/heads/git-annex..b5858e25b7f7c45564ab463ecf3e74ecd8979609","--oneline","-n1"]+[2013-08-13 12:01:25 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","log","refs/heads/git-annex..cad75ea77d513a24006ee0b56ff0aad12b7aa805","--oneline","-n1"]+[2013-08-13 12:01:25 NZST] read: git ["config","--null","--list"]+ok+[2013-08-13 12:01:25 NZST] chat: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","hash-object","-w","--stdin-paths","--no-filters"]+[2013-08-13 12:01:25 NZST] feed: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","update-index","-z","--index-info"]+[2013-08-13 12:01:25 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","show-ref","--hash","refs/heads/git-annex"]+(Recording state in git...)+[2013-08-13 12:01:25 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","write-tree"]+[2013-08-13 12:01:25 NZST] chat: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","commit-tree","78aca82f86ffb91bc841a3978f410e55aa6e0efe","-p","refs/heads/git-annex"]+[2013-08-13 12:01:25 NZST] call: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","update-ref","refs/heads/git-annex","14908fedbd44917815dd013125b69def1f7f8f7c"]++"""]]++*output of git annex get* (output taken from daemon.log, as output from command does not include the dropping part)+[[!format sh """+git annex get 2013/08/01/IMG_4230.JPG+[2013-08-13 12:03:46 NZST] TransferWatcher: transfer starting: Download UUID "e6bb2ef2-b2b5-11e1-bd1b-3fd40e5e767d" 2013/08/01/IMG_4230.JPG Nothing+[2013-08-13 12:03:46 NZST] TransferWatcher: transfer starting: Download UUID "e6bb2ef2-b2b5-11e1-bd1b-3fd40e5e767d" 2013/08/01/IMG_4230.JPG Nothing+[2013-08-13 12:03:46 NZST] TransferWatcher: transfer finishing: Transfer {transferDirection = Download, transferUUID = UUID "e6bb2ef2-b2b5-11e1-bd1b-3fd40e5e767d", transferKey = Key {keyName = "bba2489f526ed1288d23157b2b985bfda99321c52d05d3f4ddb92144b301318e.JPG", keyBackendName = "SHA256E", keySize = Just 4209479, keyMtime = Nothing}}+[2013-08-13 12:03:46 NZST] Watcher: add symlink 01/IMG_4230.JPG+[2013-08-13 12:03:46 NZST] chat: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","hash-object","-t","blob","-w","--stdin","--no-filters"]+[2013-08-13 12:03:46 NZST] Committer: committing 1 changes+[2013-08-13 12:03:46 NZST] Committer: Committing changes to git+[2013-08-13 12:03:46 NZST] feed: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","update-index","-z","--index-info"]+[2013-08-13 12:03:46 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","commit","--allow-empty-message","--no-edit","-m","","--quiet","--no-verify"]+[2013-08-13 12:03:46 NZST] Pusher: Synok+(Recording state in git...)+(Recording state in git...)+(Recording state in git...)+(Recording state in git...)+(Recording state in git...)+(Recording state in git...)+drop 01/IMG_4230.JPG cing with Adata, b(checking cloud...) itbucket +[2013-08-13 12:03:46 NZST] Committer: dropped 01/IMG_4230.JPG (from here) (copies now 4) : file renamed+[2013-08-13 12:03:46 NZST] chat: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","hash-object","-w","--stdin-paths","--no-filters"]+[2013-08-13 12:03:46 NZST] feed: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","update-index","-z","--index-info"]+[2013-08-13 12:03:47 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","show-ref","--hash","refs/heads/git-annex"]+[2013-08-13 12:03:47 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","write-tree"]+[2013-08-13 12:03:47 NZST] chat: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","commit-tree","f288bfce8d133cc0ce00b65d48ca726809da34e6","-p","refs/heads/git-annex"]+[2013-08-13 12:03:47 NZST] call: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","update-ref","refs/heads/git-annex","5a188246bda51207d12adf86c6d87568ca7076d7"]+[2013-08-13 12:03:47 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","symbolic-ref","HEAD"]+[2013-08-13 12:03:47 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","show-ref","refs/heads/master"]+[2013-08-13 12:03:47 NZST] Pusher: pushing to [Remote { name ="Adata" },Remote { name ="bitbucket" }]+[2013-08-13 12:03:47 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","show-ref","git-annex"]+[2013-08-13 12:03:47 NZST] call: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","branch","-f","synced/master"]+[2013-08-13 12:03:47 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","show-ref","--hash","refs/heads/git-annex"]+[2013-08-13 12:03:47 NZST] call: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","push","bitbucket","git-annex:synced/git-annex","master:synced/master"]+[2013-08-13 12:03:47 NZST] call: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","push","Adata","git-annex:synced/git-annex","master:synced/master"]+[2013-08-13 12:03:47 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","log","refs/heads/git-annex..5a188246bda51207d12adf86c6d87568ca7076d7","--oneline","-n1"]+[2013-08-13 12:03:47 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","log","refs/heads/git-annex..9be78e75db197a26db6aaaffbcddf5057e30d23f","--oneline","-n1"]+[2013-08-13 12:03:47 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","log","refs/heads/git-annex..2bae49a6e1ce85ad501b0fa85439da7cde8c8597","--oneline","-n1"]+[2013-08-13 12:03:47 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","log","refs/heads/git-annex..b5858e25b7f7c45564ab463ecf3e74ecd8979609","--oneline","-n1"]+[2013-08-13 12:03:47 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","log","refs/heads/git-annex..3afd101dade8be4e1ed7ac48fdf4173274d3ecd7","--oneline","-n1"]+[2013-08-13 12:03:47 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","log","refs/heads/git-annex..cad75ea77d513a24006ee0b56ff0aad12b7aa805","--oneline","-n1"]+[2013-08-13 12:03:47 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","ls-tree","-z","--","refs/heads/git-annex","uuid.log","remote.log","trust.log","group.log","preferred-content.log"]+[2013-08-13 12:03:47 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","show-ref","git-annex"]+[2013-08-13 12:03:47 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","show-ref","--hash","refs/heads/git-annex"]+[2013-08-13 12:03:47 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","log","refs/heads/git-annex..5a188246bda51207d12adf86c6d87568ca7076d7","--oneline","-n1"]+[2013-08-13 12:03:47 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","log","refs/heads/git-annex..9be78e75db197a26db6aaaffbcddf5057e30d23f","--oneline","-n1"]+[2013-08-13 12:03:47 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","log","refs/heads/git-annex..2bae49a6e1ce85ad501b0fa85439da7cde8c8597","--oneline","-n1"]+[2013-08-13 12:03:47 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","log","refs/heads/git-annex..b5858e25b7f7c45564ab463ecf3e74ecd8979609","--oneline","-n1"]+[2013-08-13 12:03:47 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","log","refs/heads/git-annex..3afd101dade8be4e1ed7ac48fdf4173274d3ecd7","--oneline","-n1"]+[2013-08-13 12:03:47 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","log","refs/heads/git-annex..cad75ea77d513a24006ee0b56ff0aad12b7aa805","--oneline","-n1"]+[2013-08-13 12:03:47 NZST] Watcher: add symlink 01/IMG_4230.JPG+[2013-08-13 12:03:47 NZST] chat: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","hash-object","-t","blob","-w","--stdin","--no-filters"]+To /media/walter/327D522A6727FE79/Pictures+ 3afd101..5a18824 git-annex -> synced/git-annex+[2013-08-13 12:03:48 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","show-ref","git-annex"]+[2013-08-13 12:03:48 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","push","Adata","git-annex:synced/git-annex","master"]+[2013-08-13 12:03:48 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","show-ref","--hash","refs/heads/git-annex"]+[2013-08-13 12:03:48 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","log","refs/heads/git-annex..5a188246bda51207d12adf86c6d87568ca7076d7","--oneline","-n1"]+[2013-08-13 12:03:48 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","log","refs/heads/git-annex..9be78e75db197a26db6aaaffbcddf5057e30d23f","--oneline","-n1"]+[2013-08-13 12:03:48 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","log","refs/heads/git-annex..2bae49a6e1ce85ad501b0fa85439da7cde8c8597","--oneline","-n1"]+[2013-08-13 12:03:48 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","log","refs/heads/git-annex..b5858e25b7f7c45564ab463ecf3e74ecd8979609","--oneline","-n1"]+[2013-08-13 12:03:48 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","log","refs/heads/git-annex..cad75ea77d513a24006ee0b56ff0aad12b7aa805","--oneline","-n1"]+[2013-08-13 12:03:48 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","log","refs/heads/git-annex..3afd101dade8be4e1ed7ac48fdf4173274d3ecd7","--oneline","-n1"]+[2013-08-13 12:03:48 NZST] Committer: committing 1 changes+[2013-08-13 12:03:48 NZST] Committer: Committing changes to git+[2013-08-13 12:03:48 NZST] feed: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","update-index","-z","--index-info"]+[2013-08-13 12:03:48 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","commit","--allow-empty-message","--no-edit","-m","","--quiet","--no-verify"]+To git@bitbucket.org:waltersom/Pictures.git+ 3afd101..5a18824 git-annex -> synced/git-annex+[2013-08-13 12:03:52 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","show-ref","git-annex"]+[2013-08-13 12:03:52 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","push","bitbucket","git-annex:synced/git-annex","master"]+[2013-08-13 12:03:52 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","show-ref","--hash","refs/heads/git-annex"]+[2013-08-13 12:03:52 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","log","refs/heads/git-annex..5a188246bda51207d12adf86c6d87568ca7076d7","--oneline","-n1"]+[2013-08-13 12:03:52 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","log","refs/heads/git-annex..9be78e75db197a26db6aaaffbcddf5057e30d23f","--oneline","-n1"]+[2013-08-13 12:03:52 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","log","refs/heads/git-annex..2bae49a6e1ce85ad501b0fa85439da7cde8c8597","--oneline","-n1"]+[2013-08-13 12:03:52 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","log","refs/heads/git-annex..b5858e25b7f7c45564ab463ecf3e74ecd8979609","--oneline","-n1"]+[2013-08-13 12:03:52 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","log","refs/heads/git-annex..cad75ea77d513a24006ee0b56ff0aad12b7aa805","--oneline","-n1"]+[2013-08-13 12:03:58 NZST] Pusher: Syncing with Adata, bitbucket +[2013-08-13 12:03:58 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","symbolic-ref","HEAD"]+[2013-08-13 12:03:58 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","show-ref","refs/heads/master"]+[2013-08-13 12:03:58 NZST] Pusher: pushing to [Remote { name ="Adata" },Remote { name ="bitbucket" }]+[2013-08-13 12:03:58 NZST] call: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","branch","-f","synced/master"]+[2013-08-13 12:03:58 NZST] call: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","push","Adata","git-annex:synced/git-annex","master:synced/master"]+[2013-08-13 12:03:58 NZST] call: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","push","bitbucket","git-annex:synced/git-annex","master:synced/master"]+Everything up-to-date+[2013-08-13 12:03:58 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","push","Adata","git-annex:synced/git-annex","master"]+Everything up-to-date+[2013-08-13 12:04:02 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","push","bitbucket","git-annex:synced/git-annex","master"]++"""+]]++++I tried removing the USB drive I had plugged in, and was able to get the file from S3, and it wasn't dropped.+However, checking the logs, I see that it did try to drop the file, but was unable to verify numcopies, so gives up.+Also odd, is that it doesn't suggest making the USB drive available, but `git annex whereis` knows that the drive does have it. Also, annex.numcopies is 1, and it got it from S3, so why can't it drop it on the computer?+Or, why does it say that it needs two copies? `git config annex.numcopies` gives 1.++[[!format sh """+[2013-08-13 16:52:08 NZST] TransferWatcher: transfer starting: Download UUID "be992080-b1db-11e1-8f79-1b10bb4092ef" 01/IMG_4230.JPG Nothing+[2013-08-13 16:54:06 NZST] TransferWatcher: transfer starting: Download UUID "be992080-b1db-11e1-8f79-1b10bb4092ef" 01/IMG_4230.JPG Just 65504+[...]+[2013-08-13 16:54:06 NZST] TransferWatcher: transfer starting: Download UUID "be992080-b1db-11e1-8f79-1b10bb4092ef" 01/IMG_4230.JPG Just 4192256+[2013-08-13 16:54:06 NZST] TransferWatcher: transfer finishing: Transfer {transferDirection = Download, transferUUID = UUID "be992080-b1db-11e1-8f79-1b10bb4092ef", transferKey = Key {keyName = "bba2489f526ed1288d23157b2b985bfda99321c52d05d3f4ddb92144b301318e.JPG", keyBackendName = "SHA256E", keySize = Just 4209479, keyMtime = Nothing}}+[2013-08-13 16:54:06 NZST] Watcher: add symlink 01/IMG_4230.JPG+[2013-08-13 16:54:06 NZST] chat: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","hash-object","-t","blob","-w","--stdin","--no-filters"]+[2013-08-13 16:54:06 NZST] Committer: committing 1 changes+[2013-08-13 16:54:06 NZST] Committer: Committing changes to git+[2013-08-13 16:54:06 NZST] feed: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","update-index","-z","--index-info"]+[2013-08-13 16:54:06 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","commit","--allow-empty-message","--no-edit","-m","","--quiet","--no-verify"]+[2013-08-13 16:54:06 + Could only verify the existence of 1 out of 2 necessary copies++ Try making some of these repositories available:+ 416aa28e-b1d4-11e1-9539-c39b14a3f7d2 -- timeline laptop+ f42d30a0-b1d2-11e1-8b32-3bdd169e3280 -- my desktop++ (Use --force to override this check, or adjust annex.numcopies.)+failed+(Recording state in git...)+(Recording state in git...)+(Recording state in git...)+drop 01/IMG_4230.JPG NZST] Pusher:(checking cloud...) Syncing with bitbucket +(unsafe) [2013-08-13 16:54:07 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","symbolic-ref","HEAD"]+[2013-08-13 16:54:07 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","show-ref","refs/heads/master"]+[2013-08-13 16:54:07 NZST] Pusher: pushing to [Remote { name ="bitbucket" }]+[2013-08-13 16:54:07 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","show-ref","git-annex"]+[2013-08-13 16:54:07 NZST] call: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","branch","-f","synced/master"]+[2013-08-13 16:54:07 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","show-ref","--hash","refs/heads/git-annex"]+[2013-08-13 16:54:07 NZST] call: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","push","bitbucket","git-annex:synced/git-annex","master:synced/master"]+[2013-08-13 16:54:07 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","log","refs/heads/git-annex..7b6b1c6c479a13f9d4ece135bdf3ba31bc484b31","--oneline","-n1"]+[2013-08-13 16:54:07 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","log","refs/heads/git-annex..9be78e75db197a26db6aaaffbcddf5057e30d23f","--oneline","-n1"]+[2013-08-13 16:54:07 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","log","refs/heads/git-annex..2bae49a6e1ce85ad501b0fa85439da7cde8c8597","--oneline","-n1"]+[2013-08-13 16:54:07 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","log","refs/heads/git-annex..b5858e25b7f7c45564ab463ecf3e74ecd8979609","--oneline","-n1"]+[2013-08-13 16:54:07 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","log","refs/heads/git-annex..11a0c19d7c79f3e574b81295782ab2820caea232","--oneline","-n1"]+[2013-08-13 16:54:07 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","log","refs/heads/git-annex..cad75ea77d513a24006ee0b56ff0aad12b7aa805","--oneline","-n1"]+[2013-08-13 16:54:07 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","log","refs/heads/git-annex..5ebb3e46b8fc109c2966ceccdd716f469d94fcad","--oneline","-n1"]+[2013-08-13 16:54:07 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","ls-tree","-z","--","refs/heads/git-annex","uuid.log","remote.log","trust.log","group.log","preferred-content.log"]+To git@bitbucket.org:waltersom/Pictures.git+ 5ebb3e4..7b6b1c6 git-annex -> synced/git-annex+[2013-08-13 16:54:12 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","show-ref","git-annex"]+[2013-08-13 16:54:12 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","push","bitbucket","git-annex:synced/git-annex","master"]+[2013-08-13 16:54:12 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","show-ref","--hash","refs/heads/git-annex"]+[2013-08-13 16:54:12 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","log","refs/heads/git-annex..7b6b1c6c479a13f9d4ece135bdf3ba31bc484b31","--oneline","-n1"]+[2013-08-13 16:54:12 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","log","refs/heads/git-annex..9be78e75db197a26db6aaaffbcddf5057e30d23f","--oneline","-n1"]+[2013-08-13 16:54:12 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","log","refs/heads/git-annex..2bae49a6e1ce85ad501b0fa85439da7cde8c8597","--oneline","-n1"]+[2013-08-13 16:54:12 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","log","refs/heads/git-annex..b5858e25b7f7c45564ab463ecf3e74ecd8979609","--oneline","-n1"]+[2013-08-13 16:54:12 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","log","refs/heads/git-annex..11a0c19d7c79f3e574b81295782ab2820caea232","--oneline","-n1"]+[2013-08-13 16:54:12 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","log","refs/heads/git-annex..cad75ea77d513a24006ee0b56ff0aad12b7aa805","--oneline","-n1"]+"""]]
@@ -0,0 +1,36 @@+### Please describe the problem.++I just added a new podcast to my feeds list and it is complaining of "bad feed content" when trying to import.++### What steps will reproduce the problem?++1. git-annex importfeed --fast http://redecentralize.org/podcast/feed.rss+3. see the sad error "warning: bad feed content"++### What version of git-annex are you using? On what operating system?++git-annex version: 4.20130827++### Please provide any additional information below.++[[!format sh """+greg@x200s:~/annex/Podcasts$ git-annex importfeed --fast http://redecentralize.org/podcast/feed.rss+(checking known urls...)+importfeed http://redecentralize.org/podcast/feed.rss +--2013-09-09 15:05:17-- http://redecentralize.org/podcast/feed.rss+Resolving redecentralize.org (redecentralize.org)... 204.232.175.78+Connecting to redecentralize.org (redecentralize.org)|204.232.175.78|:80... connected.+HTTP request sent, awaiting response... 200 OK+Length: 4331 (4.2K) [text/xml]+Saving to: ‘/tmp/feed12649’++100%[==============================================================>] 4,331 --.-K/s in 0.08s ++2013-09-09 15:05:17 (56.0 KB/s) - ‘/tmp/feed12649’ saved [4331/4331]+++ warning: bad feed content+ok+"""]]++> upstream bug <https://github.com/sof/feed/issues/5> ; [[done]] --[[Joey]]
@@ -0,0 +1,17 @@+### Please describe the problem.+When running importfeed on gitminutes <http://feeds.gitminutes.com/gitminutes-podcast> git-annex interprets the extension as "_mp3" rather than ".mp3" which means that renaming is needed for various audio players to accept the files.++### What steps will reproduce the problem?+git annex importfeed http://feeds.gitminutes.com/gitminutes-podcast --fast++### What version of git-annex are you using? On what operating system?+git-annex version: 4.20130802+build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP+local repository version: 3+default repository version: 3+supported repository versions: 3 4+upgrade supported from repository versions: 0 1 2++on Debian Sid++> Already fixed in git. [[done]] --[[Joey]]
@@ -0,0 +1,55 @@+### Please describe the problem.++`git annex status` inconsistently uses mebi (SI) and giga (informal) prefixes.++### What steps will reproduce the problem?++Example:++[[!format txt """+anarcat@marcos:mp3$ git annex status+supported backends: SHA256E SHA1E SHA512E SHA224E SHA384E SHA256 SHA1 SHA512 SHA224 SHA384 WORM URL+supported remote types: git S3 bup directory rsync web glacier hook+repository mode: direct+trusted repositories: 0+semitrusted repositories: 2+ 00000000-0000-0000-0000-000000000001 -- web+ b7802161-c984-4c9f-8d05-787a29c41cfe -- here (anarcat@marcos:/srv/mp3)+untrusted repositories: 0+transfers in progress: none+available local disk space: 31.93 gigabytes (+1 megabyte reserved)+local annex keys: 19913+local annex size: 111.08 gigabytes+known annex keys: 20085+known annex size: 111.38 gigabytes+bloom filter size: 16 mebibytes (3.1% full)+backend usage:+ SHA256E: 39998+"""]]++Notice `mebibytes` and `gigabytes`. It is unclear whether those are gigabytes (1000^3) or gibibytes (1024^3).++### What version of git-annex are you using? On what operating system?++4.20130802~bpo70+2, Debian wheezy.++### Please provide any additional information below.++nil. --[[anarcat]]++> git-annex consistently uses the powers of ten units+> for disk storage sizes. Its "gigabyte" is the SI gigabyte.+> +> It uses the absurdly named units for powers of 2 for memory sizes,+> in the few places it deals with memory (probably only the above bloom+> filter size number). +> +> AFAIK I am complying with all relevant standards and best practices.+> Even though I consider them rather dumb, as is clear if you+> [read the opionated source code I wrote to handle this]().+> +> If git-annex used "gibibyte", the numbers it reports for disk size+> would not match the numbers disk vendors and most tools use.+> +> [[bug_is_in_world_not_in_git-annex|done]] --[[Joey]] +
@@ -0,0 +1,26 @@+What steps will reproduce the problem?++I downloaded the os x assistant today.++I'd previously installed it but hadn't linked it to another repo.++I tried to create a remote repo on an ssh server using the assistant.++What is the expected output? What do you see instead?++Creating a remote repo or giving an understandable error message.++What version of git-annex are you using? On what operating system?++3.20121212+OS X 10.8.2 (Mountain Lion)++The remote machine is running debian stable.++Please provide any additional information below.++Internal Server Error+user error (gpg ["--quiet","--trust-model","always","--gen-random","--armor","1","512"] exited 127)+git-annex version 3.20121212++> [[done]], see comments --[[Joey]]
@@ -0,0 +1,52 @@+Killing a migration from WORM to SHA256 with ^C breaks things; future attempts to do the migration fail:++ #!/bin/bash+ + BASE=/tmp/migrate-bug+ + set -x+ + chmod -R +w $BASE+ rm -rf $BASE+ mkdir -p $BASE+ cd $BASE+ + # create annex+ git init .+ git annex init+ + # make a big (sparse) file and add it+ dd if=/dev/zero of=bigfile bs=1 count=0 seek=1G+ git annex add --backend WORM bigfile+ git commit -m 'added bigfile'+ + # look at status+ git annex status+ + # now migrate it, but kill migration during checksum+ # Simulate ^C by making a new process group and sending SIGINT+ setsid git annex migrate --backend SHA256 bigfile &+ PID=$!+ sleep 1+ kill -INT -$PID+ wait+ + # look at status+ git annex status+ + # this migration fails+ git annex migrate --backend SHA256 bigfile+ + # but fsck says everything's OK+ git annex fsck++The error:++ migrate bigfile + git-annex: /tmp/migrate-bug/.git/annex/objects/K9/V1/WORM-s1073741824-m1321566308--bigfile/WORM-s1073741824-m1321566308--bigfile: createLink: already exists (File exists)+ failed+ git-annex: migrate: 1 failed++> Fixed it to delete the stale temp file. [[done]]+> +> Thanks for making such clear test cases, Jim! --[[Joey]]
@@ -0,0 +1,44 @@+**What is the expected output? What do you see instead?**++SyntaxError: missing ( before formal parameters++function longpoll_"sidebar"() {++reposi...c5e0ead (строка 5, столбец 18)+ ++**Please provide any additional information below.**++functions have illegal characters in their names: *function longpoll_"sidebar"*++ <script>function longpoll_"sidebar"() {+ longpoll(longpoll_"sidebar"_url, '"sidebar"'+ , function() { setTimeout(longpoll_"sidebar", "10"); }+ , function() { webapp_disconnected(); }+ );+ }+ $(function() {+ $.get("/notifier/sidebar?auth=bd717e7499f2c42363719c833d3df2d25b77cf42184aacbcd0f969895911a0208ba17fd4f468c4b97274d5e3f7f419260e5df7d83d2e7642524a89325c5e0ead", function(url){+ longpoll_"sidebar"_url = url;+ setTimeout(longpoll_"sidebar", "10");+ });+ });+ function longpoll_"repolist"() {+ longpoll(longpoll_"repolist"_url, '"repolist"'+ , function() { setTimeout(longpoll_"repolist", "10"); }+ , function() { webapp_disconnected(); }+ );+ }+ $(function() {+ $.get("/notifier/repolist/RepoSelector%20%7BonlyCloud%20=%20False,%20onlyConfigured%20=%20False,%20includeHere%20=%20True%7D?auth=bd717e7499f2c42363719c833d3df2d25b77cf42184aacbcd0f969895911a0208ba17fd4f468c4b97274d5e3f7f419260e5df7d83d2e7642524a89325c5e0ead", function(url){+ longpoll_"repolist"_url = url;+ setTimeout(longpoll_"repolist", "10");+ });+ });++> This is already fixed in the 3.20130124 release. [[done]]+> +> (Standalone builds of that release are not yet available for Mountian+> Lion.+> +> --[[Joey]]
@@ -0,0 +1,21 @@+Sorry for the noise - notabug - [[done]]++Setup:++* git-annex version: 3.20120629 on Debian unstable.+* external RAID1 array connected via usb++I did: <code> git-annex add \<a specific album of ogg files\> </code>++When it gets to the fourth song, there is a long delay and a bunch of "journal commit I/O error" from the kernel start appearing. Then GNOME helpfully tells me that my drive was just connected (implying that it thought it was disconnected momentarily)++Log outputs:++Both trying to add whole album, failing at song 4++* <http://paste.mitechie.com/show/745/>+* <http://paste.mitechie.com/show/746/>++Just trying to add song 4 individually++* <http://paste.mitechie.com/show/747/> (lots o' journal commit I/O errors that time)
@@ -0,0 +1,30 @@+What steps will reproduce the problem?++leave the assistant running for multiple days++What is the expected output? ++Glorious git-annex enlightenment++What do you see instead?++After ~2-3 days, there are hundreds of zombied git processes and the system is unable to fork new processes. This has occurred on 3 differently hardware configured mac's (macbooks and imacs) all running Mountain Lion 10.8.2 Build 12C3006+In each case, once the system gets to this point, the only solution is forcing a reboot by holding down the power button as not even kill can spin up it's process.++What version of git-annex are you using?++ git-annex version: 3.20130122++On what operating system?++Mac OSX 10.8.2 Mountain Lion Build 12C3006++Please provide any additional information below.++I'm really not sure what to look for next. Happy to take suggestions.++[!tag /design/assistant]]++> [[done]], I found the zombie leak; the ConfigMonitor was +> leaving one zombie every time it checked a push/pull.+> Not a fast leak, but over time they would add up. --[[Joey]]
@@ -0,0 +1,53 @@+I've noticed this to occur occassionally ++<pre>+laplace:atest jtang$ ls+1@ 2@ 3@ 4@ 5@ readme.txt@+laplace:atest jtang$ git annex watch -d --foreground+watch . [2012-07-29 11:49:26 IST] read: git ["--git-dir=/Users/jtang/sandbox/atest/.git","--work-tree=/Users/jtang/sandbox/atest","show-ref","git-annex"] +[2012-07-29 11:49:26 IST] read: git ["--git-dir=/Users/jtang/sandbox/atest/.git","--work-tree=/Users/jtang/sandbox/atest","show-ref","--hash","refs/heads/git-annex"] +[2012-07-29 11:49:26 IST] read: git ["--git-dir=/Users/jtang/sandbox/atest/.git","--work-tree=/Users/jtang/sandbox/atest","log","refs/heads/git-annex..f85faa60e73efabc2e92f837b19c3918d3ab030f","--oneline","-n1"] +[2012-07-29 11:49:26 IST] chat: git ["--git-dir=/Users/jtang/sandbox/atest/.git","--work-tree=/Users/jtang/sandbox/atest","cat-file","--batch"] +(scanning...) [2012-07-29 11:49:26 IST] Assistant: all threads started+[2012-07-29 11:49:26 IST] Merger: watching /Users/jtang/sandbox/atest/.git/refs/heads/synced+[2012-07-29 11:49:26 IST] TransferWatcher: watching for transfers+[2012-07-29 11:49:26 IST] read: git ["--git-dir=/Users/jtang/sandbox/atest/.git","--work-tree=/Users/jtang/sandbox/atest","symbolic-ref","HEAD"] +[2012-07-29 11:49:26 IST] call: git ["--git-dir=/Users/jtang/sandbox/atest/.git","--work-tree=/Users/jtang/sandbox/atest","add","--update"] +[2012-07-29 11:49:26 IST] Merger: merging changes into Just refs/heads/master+[2012-07-29 11:49:26 IST] call: git ["--git-dir=/Users/jtang/sandbox/atest/.git","--work-tree=/Users/jtang/sandbox/atest","merge","--no-edit","refs/heads/synced/master"] +(started...) [2012-07-29 11:49:26 IST] Watcher: watching .+[2012-07-29 11:49:26 IST] WebApp: running on port 60042+Already up-to-date.+[2012-07-29 11:49:26 IST] Watcher: add symlink ./1+[2012-07-29 11:49:26 IST] chat: git ["--git-dir=/Users/jtang/sandbox/atest/.git","--work-tree=/Users/jtang/sandbox/atest","cat-file","--batch"] +[2012-07-29 11:49:26 IST] Watcher: add symlink ./2+[2012-07-29 11:49:26 IST] Watcher: add symlink ./3+[2012-07-29 11:49:26 IST] Watcher: add symlink ./4+[2012-07-29 11:49:26 IST] Watcher: add symlink ./5+[2012-07-29 11:49:26 IST] Watcher: add symlink ./readme.txt+[2012-07-29 11:49:27 IST] Committer: committing 6 changes+(Recording state in git...)+[2012-07-29 11:49:27 IST] feed: git ["--git-dir=/Users/jtang/sandbox/atest/.git","--work-tree=/Users/jtang/sandbox/atest","update-index","-z","--index-info"] +[2012-07-29 11:49:27 IST] call: git ["--git-dir=/Users/jtang/sandbox/atest/.git","--work-tree=/Users/jtang/sandbox/atest","commit","--allow-empty-message","-m","","--allow-empty","--quiet"] +[2012-07-29 11:49:28 IST] read: git ["--git-dir=/Users/jtang/sandbox/atest/.git","--work-tree=/Users/jtang/sandbox/atest","symbolic-ref","HEAD"] +[2012-07-29 11:49:28 IST] Pusher: pushing to []+[2012-07-29 11:49:28 IST] call: git ["--git-dir=/Users/jtang/sandbox/atest/.git","--work-tree=/Users/jtang/sandbox/atest","branch","-f","synced/master"] +[2012-07-29 11:49:28 IST] read: git ["--git-dir=/Users/jtang/sandbox/atest/.git","--work-tree=/Users/jtang/sandbox/atest","symbolic-ref","HEAD"] +[2012-07-29 11:49:28 IST] Merger: merging changes into Just refs/heads/master+[2012-07-29 11:49:28 IST] call: git ["--git-dir=/Users/jtang/sandbox/atest/.git","--work-tree=/Users/jtang/sandbox/atest","merge","--no-edit","refs/heads/synced/master"] +Already up-to-date.+[2012-07-29 11:49:43 IST] Watcher: file added ./.gitignore+[2012-07-29 11:49:43 IST] read: lsof ["-F0can","+d","/Users/jtang/sandbox/atest/.git/annex/tmp/"] +[2012-07-29 11:49:44 IST] Committer: delaying commit of 0 changes+[2012-07-29 11:49:45 IST] read: lsof ["-F0can","+d","/Users/jtang/sandbox/atest/.git/annex/tmp/"] +[2012-07-29 11:49:46 IST] Committer: delaying commit of 0 changes+[2012-07-29 11:49:47 IST] read: lsof ["-F0can","+d","/Users/jtang/sandbox/atest/.git/annex/tmp/"] +[2012-07-29 11:49:48 IST] Committer: delaying commit of 0 changes+[2012-07-29 11:49:49 IST] read: lsof ["-F0can","+d","/Users/jtang/sandbox/atest/.git/annex/tmp/"] +</pre>++I ran " git annex watch -d --foreground" to watch what was going one, and just created a .gitignore file and the the commiter/lsof thread just loops over and over.... I only noticed as my laptop battery had drained at somepoint when git-annex was running in the background.++[[!meta title="assistant: lsof/committer thread loops occassionally"]]++> Closing this since it doesn't seem reproducible. [[done]] --[[Joey]]
@@ -0,0 +1,29 @@+What steps will reproduce the problem?++As described in+http://git-annex.branchable.com/backends/#comment-3c1cd45d2a015b4fc412dd813293ad7d+, sha512 is faster. On my 64-bit system, the speed difference is about+1.5times.++What is the expected output? What do you see instead?+++What version of git-annex are you using? On what operating system?+++Please provide any additional information below.++> You are free to change the default in your own annexes. This is very easy+> to do: `echo '* annex.backend=SHA512E' > .gitattributes`+> +> I don't anticipate moving to SHA512, because+> +> 1. It makes `ls -l` really ugly. Each symlink takes like 4 lines+> on an 80 column terminal.+> 2. There are better hashes coming. Particularly SHA3. That should be+> faster and/or more secure. And without adding so much length to the+> hash.+> +> --[[Joey]]++[[done]]
@@ -0,0 +1,20 @@+What steps will reproduce the problem?+In the git-annex tree,++ $ make+ $ sudo make install++What is the expected output? What do you see instead?++One would expect git-annex to be installed in the configured prefix. Unfortunately, make tries to rebuild the "all" target before "install". This fails (presumably) due to incorrect environment state,++ ghc -O2 -Wall -ignore-package monads-fd -ignore-package monads-tf -outputdir tmp -IUtility -DWITH_ASSISTANT -DWITH_S3 -DWITH_INOTIFY --make git-annex Utility/libdiskfree.o+ + Utility/FileSystemEncoding.hs:17:8:+ Could not find module `Data.Bits.Utils':+ Use -v to see a list of the files searched for.+ make: *** [git-annex] Error 1++Removing "all" from the dependencies of "install" allows the process to run to completion, although this is clearly not a satisfactory solution.++> [[fixed|done]] using an ugly stamp file. --[[Joey]]
@@ -0,0 +1,62 @@+### Please describe the problem.+There is no git-annex-shell command in path and thus sync with ssh server fails. If I symlink /usr/bin/git-annex-shell -> /usr/bin/git-annex, it complains that key is already present in annex and errors out. There is executable git-annex-shell in server's ~/.ssh/++### What steps will reproduce the problem?+Start webapp to sync local repo with ssh server.++### What version of git-annex are you using? On what operating system?+git-annex 4.20130627 on Gentoo++### Please provide any additional information below.++[[!format sh """+# If you can, paste a complete transcript of the problem occurring here.+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log++[2013-07-08 17:28:48 EEST] main: starting assistant version 4.20130627+[2013-07-08 17:28:49 EEST] TransferScanner: Syncing with netbook_Lit, sigma_Lit ++ dbus failed; falling back to mtab polling (SocketError {socketErrorMessage = "connect: does not exist (Connection refused)", socketErrorFatal = True, socketErrorAddress = Just (Address "unix:abstract=/tmp/dbus-HBxh6EyMJ3,guid=adc3101676daede2a128013351daa535")})+Already up-to-date.++(scanning...) [2013-07-08 17:28:49 EEST] Watcher: Performing startup scan+Already up-to-date.+Already up-to-date.+++(started...) Everything up-to-date+Everything up-to-date+bash: git-annex-shell: command not found+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: remote command not found (code 127) at io.c(605) [sender=3.0.9]+bash: git-annex-shell: command not found+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: remote command not found (code 127) at io.c(605) [sender=3.0.9]+++[2013-07-08 17:50:23 EEST] main: starting assistant version 4.20130627+[2013-07-08 17:50:23 EEST] TransferScanner: Syncing with netbook_Lit, sigma_Lit ++ dbus failed; falling back to mtab polling (SocketError {socketErrorMessage = "connect: does not exist (Connection refused)", socketErrorFatal = True, socketErrorAddress = Just (Address "unix:abstract=/tmp/dbus-HBxh6EyMJ3,guid=adc3101676daede2a128013351daa535")})+Already up-to-date.++(scanning...) [2013-07-08 17:50:23 EEST] Watcher: Performing startup scan+Already up-to-date.+Already up-to-date.+++(started...) Everything up-to-date+Everything up-to-date+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]++++# End of transcript or log.+"""]]++[[!tag done]]
@@ -0,0 +1,35 @@+While merging the git-annex branch, annex-merge does not end up in a fast-forward even when it would be possible.+But as sometimes annex-merge takes time, it would probably be worth it+(but maybe I miss something with my workflow...).++> I don't think a fast-forward will make things much faster.+> +> git-annex needs its index file to be updated to reflect the merge.+> With the union merge it does now, this can be accomplished by using+> `git-diff-index` to efficiently get a list of files that have changed,+> and only merge those changes into the index with `git-update-index`.+> Then the index gets committed, generating the merge.+> +> To fast-forward, it would just reset the git-annex branch to the new+> head of the remote it's merging to. But then the index needs to be+> updated to reflect this new head too. To do that needs the same method+> described above, essentially (with the difference that it can replace+> files in the index with the version from the git-annex branch, rather+> than merging in the changes... but only if the index is known to be+> already committed and have no other changes, which would require both+> an attempt to commit it first, and+> locking). +> +> So will take basically the same amount of time, except+> it would not need to commit the index at the end of the merge. The+> most expensive work is the `git-diff-index` and `git-update-index`,+> which are not avoided.+> +> Although, perhaps fast-forward merge would use slightly+> less space. --[[Joey]]++>> To avoid the ladder-merge between two repositories described at+>> <http://sprunge.us/LOMU>, seems a fast-forward should be detected and+>> written to git, even if the index is still updated the current way.+>> [[done]]+>> --[[Joey]]
@@ -0,0 +1,38 @@+### Please describe the problem.++The "import" section of the manpage has an indentation error.++### What steps will reproduce the problem?++man git-annex++### What version of git-annex are you using? On what operating system?++anything after 20130827, i believe.++### Please provide any additional information below.++silly patch:++[[!format diff """+# If you can, paste a complete transcript of the problem occurring here.+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log+diff --git a/Build/mdwn2man b/Build/mdwn2man+index ba5919b..b3ee404 100755+--- a/Build/mdwn2man++++ b/Build/mdwn2man+@@ -25,7 +25,7 @@ while (<>) {+ $inlist=1;+ $spippara=0;+ }+- elsif (/.SH/) {++ elsif (/^.SH/) {+ $skippara=0;+ $inlist=0;+ }+# End of transcript or log.+"""]]++-- [[anarcat]]++> [[applied|done]] --[[Joey]]
@@ -0,0 +1,38 @@+### What steps will reproduce the problem?++1. Have a remote that uses annex-ssh-options to specify an sshkey which is needed to invoke git-annex-shell on that remote.+2. Run git-annex map.++### What is the expected output? What do you see instead?++I expect to see a map without any errors complaining of commands not recognized.++Instead I see:++ greg@x200s:~/Pictures/Photos$ git-annex map+ map /home/greg/Pictures/Photos ok+ map 60justin (sshing...) + ok+ map rose (sshing...) + fatal: unrecognized command 'cd '/home/greg/Media/Pictures/Photos/' && git config --null --list'+ git-annex-shell: git-shell failed++relevant part of .git/config:++ [remote "rose"]+ url = greg@rose.makesad.us:/home/greg/Media/Pictures/Photos/+ fetch = +refs/heads/*:refs/remotes/rose/*+ annex-ssh-options = "-i /home/greg/.ssh/annex.x200s_rsa"+ annex-trustlevel = trusted+ annex-uuid = c0e4106e-2631-11e2-9749-1bfa37a61069+++### What version of git-annex are you using? On what operating system?++ git-annex version: 3.20121017+ local repository version: 3+ default repository version: 3+ supported repository versions: 3+ upgrade supported from repository versions: 0 1 2++> [[done]], see comment --[[Joey]]
@@ -0,0 +1,26 @@+### Please describe the problem.++`git annex merge` goes out of memory on a large repo.+++### What steps will reproduce the problem?++ $ git annex merge+ merge git-annex git-annex: out of memory (requested 1048576 bytes)++### What version of git-annex are you using? On what operating system?++ git-annex version: 4.20130827+ build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP DNS++On debian wheezy i386++### Please provide any additional information below.++The repository contains a lot of files:++ $ cd .git/objects+ $ find . -type f | wc -l + 1091548++[[!tag moreinfo]]
@@ -0,0 +1,62 @@+Word summary: After migrating from SHA256 to SHA256E I still have a ton of SHA256 files around that aren't being found by unused.++Command outputs (see, specifically, the output of status showing number of SHA256 and SHA256E files):+++ greg@eeepc:/mnt/blackbox/Media/Pictures/Photos$ less .gitattributes+ * annex.backend=SHA256E++ greg@eeepc:/mnt/blackbox/Media/Pictures/Photos$ git-annex migrate .+ (Recording state in git...)++ greg@eeepc:/mnt/blackbox/Media/Pictures/Photos$ git-annex unused+ unused . (checking for unused data...) (checking master...) (checking rose/master...) (checking x200s/master...)+ Some partially transferred data exists in temporary files:+ NUMBER KEY+ 1 SHA256E-s15766010--8132a02a8b245eb9842e89c5e696df4e9c82d676f8dec3c6bb96892c19f99d51.jpg++ To remove unwanted data: git-annex dropunused NUMBER++ ok+ (Recording state in git...)++ greg@eeepc:/mnt/blackbox/Media/Pictures/Photos$ git-annex status+ supported backends: SHA256E SHA1E SHA512E SHA224E SHA384E SHA256 SHA1 SHA512 SHA224 SHA384 WORM URL+ supported remote types: git S3 bup directory rsync web hook+ trusted repositories: 1+ c0e4106e-2631-11e2-9749-1bfa37a61069 -- rose+ semitrusted repositories: 3+ 00000000-0000-0000-0000-000000000001 -- web+ 9bd4077e-196c-11e2-9cc9-9faafb3e34ee -- x200s+ c69d6fcc-18d1-11e2-9487-2fe6dbf0516b -- here (photos on eeepc)+ untrusted repositories: 0+ dead repositories: 1+ 3ebd5ac2-2092-11e2-856a-bb0203cce179 -- Photos on Rose+ transfers in progress: + downloading 2011/06/30/IMG_8180.jpg+ from rose+ available local disk space: 2 terabytes (+1 megabyte reserved)+ temporary directory size: 9 megabytes (clean up with git-annex unused)+ local annex keys: 36210+ local annex size: 136 gigabytes+ known annex keys: 23388+ known annex size: 102 gigabytes+ bloom filter size: 16 mebibytes (7.2% full)+ backend usage: + SHA256E: 37453+ SHA256: 22145+ (Recording state in git...)++ greg@eeepc:/mnt/blackbox/Media/Pictures/Photos$ apt-cache policy git-annex+ git-annex:+ Installed: 3.20121017+ Candidate: 3.20121017+ Version table:+ *** 3.20121017 0+ 600 http://ftp.us.debian.org/debian/ unstable/main i386 Packages+ 100 /var/lib/dpkg/status+ 3.20120629 0+ 650 http://ftp.us.debian.org/debian/ wheezy/main i386 Packages+++As Joey predicted, this took care of itself over time. Marking as [[bugs/done]].
@@ -0,0 +1,26 @@+Current:++ % git annex status+ git-annex: unknown command++Better: ++ % git annex status+ git-annex: status: unknown command++Current:++ % git annex fsck+ [...]+ git-annex: 18 failed++Better:++ % git annex fsck+ [...]+ git-annex: fsck: 18 failed+++etc pp.++> [[done]] --[[Joey]]
@@ -0,0 +1,29 @@+What steps will reproduce the problem?++build git-annex-3.20130216 on OS X lion+++What is the expected output? What do you see instead?++successful compile; error was:++```+Annex/UUID.hs:30:8:+ Could not find module `System.Random'+ It is a member of the hidden package `random-1.0.1.1'.+ Perhaps you need to add `random' to the build-depends in your .cabal file.+ Use -v to see a list of the files searched for.+```+++What version of git-annex are you using? On what operating system?++building git-annex-3.20130216 on OS X Lion+++Please provide any additional information below.+++adding 'random' to the BuildDepends in git-annex.cabal does indeed fix the error.++> [[done]] --[[Joey]]
@@ -0,0 +1,29 @@+What steps will reproduce the problem?+ apt-get install git-annex++++What is the expected output?+ a menu item at kde or gnome at internet> Git Annex , as+http://git-annex.branchable.com/assistant/ shows.++ What do you see instead? no menu item.+++What version of git-annex are you using?+Version: 1:1.7.10.4-1+wheezy1++ On what operating system?+Wheezy+++ Also+I just installed git-annex on a squeeze system and had the same result.++same with ubuntu precise 12.04++> git-annex ships a /usr/share/applications/git-annex.desktop+> file that provies the menu item. But there has never been a version+> 1.7.10. I suspect this is user error; installing a version of git-annex+> that predates the git-annex assistant and expecting it to have the+> assistant and its menu item. [[done]] --[[Joey]]
@@ -0,0 +1,6 @@+If your bug report is listed here, it has been flagged as needing more+information. Please respond to the bug and provide the requested+information.++[[!inline pages="./* and link(./moreinfo) and !link(./done) and !*/Discussion" sort=mtime show=10+archive=yes]]
@@ -0,0 +1,59 @@+I'm on an nfs mounted filesystem (some netapp somewhere). This is repeatable, every time.++ git init repo; cd repo;+ git annex init repo+ truncate -s 20M big+ git annex add big+ git commit -m "annexed file"+ cd ..+ git clone repo repo_copy+ cd repo_copy;+ git annex get .+ git annex whereis big++ #whereis big (2 copies) + # 9310b242-6021-4621-8cef-4548a00907ff -- here+ # b3526e4d-38d7-4781-a9c3-436007899f1b -- origin (repo)+ #ok++ git annex drop big++ #git-annex: /nfspath/repo_copy/.git/annex/objects/fM/4k/SHA1-s20971520--9674344c90c2f0646f0b78026e127c9b86e3ad77: removeDirectory: unsatisified constraints (Directory not empty)+ #failed+ #git-annex: drop: 1 failed++ git annex drop big # no error second time, I suspect nfs has caught up by now.+ git annex fsck # Doesn't know that the second drop succeeded.++ #fsck big (fixing location log) + # ** Based on the location log, big+ # ** was expected to be present, but its content is missing.+ #failed+ #git-annex: fsck: 1 failed++ git annex fsck++ #fsck big ok++ git annex whereis big++ #whereis big (1 copy) + # b3526e4d-38d7-4781-a9c3-436007899f1b -- origin (repo)+ #ok++I suspect git-annex is just too fast and optimistic for big slow nfs directories.++> git-annex locks files while it is operating on their content+> to avoid race conditions with other git-annex processes. +> Quite likely this problem (which I can reproduce) is due to+> NFS having bad (non-POSIX) locking semantics. +> +> Probably the+> lock is represented on the NFS server as some form of lock file+> next to the file being locked, and so when that file is deleted, with+> the lock still held, the directory, which should then be empty, still+> contains this lock file.+> +> So, this can be worked around by it not failing when the directory+> unexpectedly cannot be removed. I've made that change. [[done]]+> --[[Joey]]
@@ -0,0 +1,40 @@+### Please describe the problem.++Changing a file in a repository from a symlink to a normal file causes annex to create an annexed file from that typechange regardless of weather or not it was an annexed file.+++### What steps will reproduce the problem?++ git init newrepo+ cd newrepo && git annex init+ touch realfile+ git add .+ git commit -m "added realfile"+ mkdir newdir && cd newdir+ ln -s ../realfile newfile+ git add .+ git commit -m "Added placeholder until we get assets from designers"+ rm newfile+ dd bs=1024 count=10000 if=/dev/zero of=newfile+ git add .+ git commit -m "Finally got assets from designers"+ ls -la newfile+ # lrwxrwxrwx 1 user user <date> newfile -> ../.git/annex/objects/XX/XX/UUID/UUID++### What version of git-annex are you using? On what operating system?++git-annex version: 4.20130802++Ubuntu 12.04 LTS++### Please provide any additional information below.++[[!format sh """+# If you can, paste a complete transcript of the problem occurring here.+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log+++# End of transcript or log.+"""]]++> [[fixed|done]] --[[Joey]]
@@ -0,0 +1,32 @@+I belive I have found a regression.++Inspired by +<http://git-annex.branchable.com/forum/performance_improvement:_git_on_ssd__44___annex_on_spindle_disk/>+I tried to only have .git/annex/objects (also tested moving .git/annex) on NFS while having the rest on local SSD disk.++But when trying to add files i get:++ > git annex add testfile+ add testfile (checksum...) + git-annex: testfile: rename: unsupported operation (Invalid cross-device link)+ failed+ git-annex: add: 1 failed++I have tried both using bind-mount and with a sym-link.++> Grepping for `renameFile` and `createLink` will find all the places+> in git-annex that assume one filesystem. These would have to be changed+> to catch errors and fall back to expensive copying.+> +> Putting a separate repository on the file server could work better+> depending on what you're trying to do. --[[Joey]] ++>> I've added support for putting `.git/annex` on a separate filesystem+>> from the rest of the git repository.+>> +>> Putting individual subdirectories like `.git/annex/objects` on separate+>> filesystems from other subdirectories is not fully supported; it may+>> work but it may be slow and a few things (like `git annex migrate`) are+>> known to fail due to using hard links. I don't think this is worth+>> supporting. [[done]]+>> --[[Joey]]
@@ -0,0 +1,66 @@+Old data isn't listed as unused after migrating backends:++ #!/bin/bash+ + BASE=/tmp/migrate-bug-2+ set -x+ chmod -R +w $BASE+ rm -rf $BASE+ mkdir -p $BASE+ cd $BASE+ + # create annex+ git init .+ git annex init+ + # make a big (sparse) file and add it+ dd if=/dev/zero of=bigfile bs=1 count=0 seek=1G+ git annex add --backend WORM bigfile+ git commit -m 'added bigfile'+ + # migrate it+ git annex migrate --backend SHA256 bigfile+ + # status shows 2 keys taking up 2G+ git annex status+ + # but nothing is unused+ git annex unused++Output:++ ++ git annex status+ supported backends: SHA256 SHA1 SHA512 SHA224 SHA384 SHA256E SHA1E SHA512E SHA224E SHA384E WORM URL+ supported remote types: git S3 bup directory rsync web hook+ known repositories: + ede95a82-1166-11e1-a475-475d55eb0f8f -- here+ local annex keys: 2+ local annex size: 2 gigabytes+ visible annex keys: 1+ visible annex size: 1 gigabyte+ backend usage: + WORM: 1+ SHA256: 1+ ++ git annex unused+ unused . (checking for unused data...) (checking master...) ok++The two files are hardlinked, so it's not taking up extra space, but it would be nice to be able to remove the old keys.++> `git annex unused` checks the content of all branches, and assumes that,+> when a branch contains a file that points to a key, that key is still +> used. In this case, the migration has staged a change to the file,+> but it is not yet committed, so when it checks the master branch, it+> still finds a file referring to the old key. +> +> So, slightly surprising, but not a bug. --[[Joey]] [[done]]++>> Thanks for the explanation. In my real repository, it was a bit trickier:+>> the migration was commited to `master`, but other *remote* branches still+>> referenced those keys. I was just doing a `git pull` from a central repo, but+>> needed a `git remote update` to remove those references from `remotes/foo/master` too.+>> --Jim++>>> I have considered making unused ignore remote tracking branches. +>>> On the one hand, it can be a little bit confusing, and those branches+>>> can be out of date. On the other hand, it can be useful to know you're+>>> not dropping anything that some remote might still refer to. --[[Joey]]
@@ -0,0 +1,31 @@+git-annex does not take into account the --git-dir and --work-tree command line options (while they can be useful when scripting).++ > mkdir /tmp/test+ > cd /tmp/test+ > git init+ Initialized empty Git repository in /tmp/test/.git/+ > git annex init test+ init test ok+ > touch foo+ > cd+ > git --git-dir=/tmp/test/.git --work-tree=/tmp/test annex add foo+ git-annex: Not in a git repository.++regular git add works:++ > git --git-dir=/tmp/test/.git --work-tree=/tmp/test add foo+ > git --git-dir=/tmp/test/.git --work-tree=/tmp/test status + # On branch master+ #+ # Initial commit+ #+ # Changes to be committed:+ # (use "git rm --cached <file>..." to unstage)+ #+ # new file: foo+ #++git-annex version: 3.20110702++> [[done]], git-annex now honors `GIT_DIR` and `GIT_WORK_TREE` like other+> git commands do. --[[Joey]]
@@ -0,0 +1,12 @@+One would expect "git annex get foo bar" to first retrieve foo, and then+bar. Actually though, it will operate on them in alphabetical order+(probably). This is annoying when you wanted to 1st list the most important+files to get. Maybe you'll run out of time before all can be gotten. The+workaround of course is to run "git annex get" twice.++This ordering comes from "git ls-files". git-annex passes it all the files+the user specified. This is a useful optimisation -- earlier it would+run "git ls-files" once per parameter, and so "git annex get *" could be+rather slow. But, it produces this ordering problem.++[[done]]
@@ -0,0 +1,28 @@+What steps will reproduce the problem?++Try pasting file into annex directory while assistant is running.+++What is the expected output? What do you see instead?++Expect file to successfully paste into directory, then be annexed. Instead, see a permissions error, and file disappears.+++What version of git-annex are you using? On what operating system?++OSX - 10.6. zsh. git-annex version: 3.20120826++Please provide any additional information below.++> Ok, I've put in the one second delay to adding by default on OSX.+> I consider this bug done, at least for now..++>> Reopening since I've heard from someone else that it can still happen.+>> --[[Joey]] ++>>> Closing again, since the assistant now makes new repositories on OSX+>>> using direct mode, which should avoid this problem. NB: any existing+>>> repositories you have on OSX should be switched to use direct mode by+>>> manually running `git annex direct` in them. [[done]] --[[Joey]]++[[!tag /design/assistant/OSX]]
@@ -0,0 +1,59 @@+Dear All,++thank you for this wonderful tool!++I am having an issue when I try to commit a normal link++diokletian*194-> mkdir test++diokletian*195-> cd test++diokletian*196-> git init++Initialized empty Git repository in /home/henrus/test/.git/++diokletian*197-> git annex init new++init new [master (root-commit) 49f5f91] git-annex setup++ 1 files changed, 1 insertions(+), 0 deletions(-)++ create mode 100644 .gitattributes++[master 76496ff] git annex init++ 1 files changed, 1 insertions(+), 0 deletions(-)++ create mode 100644 .git-annex/uuid.log++ok++diokletian*198-> mkdir subdir++diokletian*199-> ln -s subdir link++diokletian*200-> git add link++diokletian*201-> git commit -m "ok"++[master f12f62d] ok++ 1 files changed, 1 insertions(+), 0 deletions(-)++ create mode 120000 link++diokletian*202-> ln -s subdir/ link2++diokletian*203-> git add link2++diokletian*204-> git commit -m "not ok"++git-annex: Prelude.head: empty list++The trailing slash seems to make a difference!++Best Regards,++Henrik++> Thanks for the bug report. This is fixed in 0.17. --[[Joey]] [[!tag done]]
@@ -0,0 +1,3 @@+On several of my repos, the upgrade to v3 seemed to take forever. A Crl-C followed by another "git annex upgrade" "solved" the problem in some cases. Sometimes, I had to also delete the .git/annex/journal dir to have the upgrade. I didn't notice anything special about the non-working repos to help diagnose the problem.++[[!tag done]]
@@ -0,0 +1,81 @@+This bug is reopened to track some new UTF-8 filename issues caused by GHC+7.4. In this version of GHC, git-annex's hack to support filenames in any+encoding no longer works. Even unicode filenames fail to work when+git-annex is built with 7.4. --[[Joey]]++This bug is now fixed in current master. Once again, git-annex will work+for all filename encodings, and all system encodings. It will+only build with the new GHC. [[done]] --[[Joey]] ++----++Old, now fixed bug report follows:++There are problems with displaying filenames in UTF8 encoding, as shown here:++ $ echo $LANG+ en_GB.UTF-8+ $ git init+ $ git annex init test+ [...]+ $ touch "Umlaut Ü.txt"+ $ git annex add Uml*+ add Umlaut Ã.txt ok+ (Recording state in git...)+ $ find -name U\* | hexdump -C+ 00000000 2e 2f 55 6d 6c 61 75 74 20 c3 9c 2e 74 78 74 0a |./Umlaut ...txt.|+ 00000010+ $ git annex find | hexdump -C+ 00000000 55 6d 6c 61 75 74 20 c3 83 c2 9c 2e 74 78 74 0a |Umlaut .....txt.|+ 00000010+ $++It looks like the common latin1-to-UTF8 encoding. Functionality other than otuput seems not to be affected.++> Yes, I believe that git-annex is reading filename data from git+> as a stream of char8s, and not decoding unicode in it into logical+> characters.+> Haskell then I guess, tries to unicode encode it when it's output to+> the console.+> This only seems to matter WRT its output to the console; the data+> does not get mangled internally and so it accesses the right files+> under the hood.+> +> I am too new to haskell to really have a handle on how to handle+> unicode and other encodings issues with it. In general, there are three+> valid approaches: --[[Joey]] +> +> 1. Convert all input data to unicode and be unicode clean end-to-end+> internally. Problimatic here since filenames may not necessarily be+> encoded in utf-8 (an archive could have historical filenames using+> varying encodings), and you don't want which files are accessed to+> depend on locale settings.+> > I tried to do this by making parts of GitRepo call+> > Codec.Binary.UTF8.String.decodeString when reading filenames from+> > git. This seemed to break attempts to operate on the files,+> > weirdly encoded strings were seen in syscalls in strace.+> 1. Keep input and internal data un-decoded, but decode it when+> outputting a filename (assuming the filename is encoded using the+> user's configured encoding), and allow haskell's output encoding to then+> encode it according to the user's locale configuration.+> > This is now implemented. I'm not very happy that I have to watch+> > out for any place that a filename is output and call `filePathToString`+> > on it, but there are really not too many such places in git-annex.+> >+> > Note that this only affects filenames apparently. +> > (Names of files in the annex, and also some places where names+> > of keys are displayed.) Utf-8 in the uuid.map file etc seems+> > to be handled cleanly.+> 1. Avoid encodings entirely. Mostly what I'm doing now; probably+> could find a way to disable encoding of console output. Then the raw+> filename would be displayed, which should work ok. git-annex does+> not really need to pull apart filenames; they are almost entirely+> opaque blobs. I guess that the `--exclude` option is the exception+> to that, but it is currently not unicode safe anyway. (Update: tried+> `--exclude` again, seems it is unicode clean..)+> One other possible+> issue would be that this could cause problems if git-annex were+> translated.+> > On second thought, I switched to this. Any decoding of a filename+> > is going to make someone unhappy; the previous approach broke+> > non-utf8 filenames.
@@ -0,0 +1,34 @@+#What steps will reproduce the problem?++Running assistant in foreground on one repository that is paired to another repository, than killing it using CTRL-C and restarting it+++#What is the expected output? What do you see instead?++I get messages like:++ (Recording state in git...)+ # Auf Zweig master+ # Änderungen, die nicht zum Eintragen bereitgestellt sind:+ # (benutze "git add/rm <Datei>..." zum Bereitstellen)+ # (benutze "git checkout -- <Datei>..." um die Änderungen im Arbeitsverzeichnis zu verwerfen)+ #+ # gelöscht: "path/to/file"+ #+ keine Änderungen zum Eintragen hinzugefügt (benutze "git add" und/oder "git commit -a")+ Total 0 (delta 0), reused 0 (delta 0)+ To ssh://stormking@git-annex-volyova-stormking/data/repository/+ 4e2c631..911b80c git-annex -> synced/git-annex+ + Already up-to-date.++Sorry for the german language, I'll try to reproduce it in english, later.+After that, the symlinks for the file in the repository are gone. I can get+them back by reverting the commit but things like that make me very nervous.+++#What version of git-annex are you using? On what operating system?++3.20130102 on Arch Linux x64++[[!tag /design/assistant moreinfo]]
@@ -0,0 +1,15 @@+What steps will reproduce the problem?++Run git annex reinject source dest with a file that has the wrong content and thus a wrong checksum.++What is the expected output? What do you see instead?++The file should stay in it's original location. Currently it's moved to .git/annex/bad with a mangled filename.++What version of git-annex are you using? On what operating system?++git-annex version: 3.20120807+Ubuntu 12.04 updated on Aug 20th+annex was installed via cabal on Aug 20th, all other packages are from ubuntu.++> [[done]] --[[Joey]]
@@ -0,0 +1,18 @@+# What steps will reproduce the problem?++1. Get a removable device and create a filesystem with a label containing a space, e.g.:+ # mkfs.ext4 -L "Backup Home" /dev/sdb1+2. Open the webapp and add a new repository on a removabledevice+3. Select the devices mountpoint, e.g. /media/Backup\ Home++# What is the expected output? What do you see instead?++The configurator should remove spaces for branch names, but it actually seems to call git remote add with "Backup Home" as argument which is invalid.++The assistant produces an internal server error and subsequently crashes completely.++# What version of git-annex are you using? On what operating system?++git-annex 3.20120924 from the Debian package in sid on Debian wheezy, amd64.++> Thanks for reporting this, I've fixed it in git. [[done]] --[[Joey]]
@@ -0,0 +1,81 @@+### Please describe the problem.++On Mac OS X, I tried to switch a repository to direct mode, but there was a+problem in the middle of the switch (permission denied) and the switch+aborted, leaving the repository in a half switched state.++I tried different manipulations, one of which was a checkout (oops), switch+back to indirect, then direct again, and now I have the repository in direct+mode except one file which caused the permission denied error.++### What steps will reproduce the problem?++Do not know exactly why this file is special. I still have the repository, and+each time I try to get this file, it fails with the same error message.++### What version of git-annex are you using? On what operating system?++On Umba, git-annex version: 4.20130723, on Mac OS X 10.6.8.++### Please provide any additional information below.++Umba is the Mac OS X, camaar and riva are Debian machines.++[[!format sh """+Umba$ git annex version+git-annex version: 4.20130723+build flags: Assistant Webapp Pairing Testsuite S3 WebDAV FsEvents XMPP DNS+Umba$++Umba$ git annex get --from riva --not --in here+get 2013-07-31/2013-07-31_180411.jpg (from riva...) +Password: +SHA256-s2819887--987f9811d7b5c7a287a74b7adbb852be4d18eeda61c3507f4e08c534d2356f4c+ 2819887 100% 943.08kB/s 0:00:02 (xfer#1, to-check=0/1)++sent 42 bytes received 2820397 bytes 433913.69 bytes/sec+total size is 2819887 speedup is 1.00+failed+git-annex: get: 1 failed+Umba$ find . -name SHA256-s2819887-\*+./.git/annex/objects/wq/3j/SHA256-s2819887--987f9811d7b5c7a287a74b7adbb852be4d18eeda61c3507f4e08c534d2356f4c+./.git/annex/objects/wq/3j/SHA256-s2819887--987f9811d7b5c7a287a74b7adbb852be4d18eeda61c3507f4e08c534d2356f4c/SHA256-s2819887--987f9811d7b5c7a287a74b7adbb852be4d18eeda61c3507f4e08c534d2356f4c.cache+./.git/annex/objects/wq/3j/SHA256-s2819887--987f9811d7b5c7a287a74b7adbb852be4d18eeda61c3507f4e08c534d2356f4c/SHA256-s2819887--987f9811d7b5c7a287a74b7adbb852be4d18eeda61c3507f4e08c534d2356f4c.map+./.git/annex/transfer/failed/download/13fd5d5a-ed97-11e2-9178-574d3b1c0618/SHA256-s2819887--987f9811d7b5c7a287a74b7adbb852be4d18eeda61c3507f4e08c534d2356f4c+./.git/annex/transfer/failed/download/95443f2e-ed96-11e2-9d3f-8ffa5b1aae7a/SHA256-s2819887--987f9811d7b5c7a287a74b7adbb852be4d18eeda61c3507f4e08c534d2356f4c+Umba$ git annex fsck+fsck 2013-07-31/2013-07-31_180411.jpg ok+(Recording state in git...)+Umba$ git annex drop 2013-07-31/2013-07-31_180411.jpg +Umba$ git annex get --from riva --not --in here+get 2013-07-31/2013-07-31_180411.jpg (from riva...) +Password: +SHA256-s2819887--987f9811d7b5c7a287a74b7adbb852be4d18eeda61c3507f4e08c534d2356f4c+ 2819887 100% 949.58kB/s 0:00:02 (xfer#1, to-check=0/1)++sent 42 bytes received 2820397 bytes 512807.09 bytes/sec+total size is 2819887 speedup is 1.00+failed+git-annex: get: 1 failed+Umba$++camaar% git annex copy --to umba --not --in umba+copy 2013-07-31/2013-07-31_180411.jpg (checking umba...) (to umba...)+SHA256-s2819887--987f9811d7b5c7a287a74b7adbb852be4d18eeda61c3507f4e08c534d2356f4c+ 2819887 100% 4.19MB/s 0:00:00 (xfer#1, to-check=0/1)+git-annex: //Users/nicolas/Pictures/Petites Boutes/.git/annex/tmp/2013-07-31_18041141700.jpg: rename: permission denied (Operation not permitted)+git-annex-shell: recvkey: 1 failed++sent 2820393 bytes received 42 bytes 1128174.00 bytes/sec+total size is 2819887 speedup is 1.00+rsync error: syntax or usage error (code 1) at main.c(1070) [sender=3.0.9]+ + rsync failed -- run git annex again to resume file transfer+failed+git-annex: copy: 1 failed+camaar%+"""]]++> Put in a fix that works, although perhaps not ideal as I do not+> understand how the repo got into the original problem state. [[done]]+> --[[Joey]]
@@ -0,0 +1,22 @@+Git annex refuses to get/drop files until it's manually relaunched.++I'm trying to setup a basic dropbox like system where a couple of computers sync with a local server I have constantly running ubuntu with ssh.++I think I've setup git annex correctly: when I put files in the repo folder they get uploaded to the bare git repo on the server over ssh automatically and the other computer updates with a broken alias to the file. However the file does not then download from the server despite it being available without a manual restart of the daemon or a git-annex get command from the terminal.++Additionally, files inside archive folders do not get dropped once uploaded to the server without a restart of the daemon.+++My computers are each setup with the ssh server as a 2nd repository (fullarchive), they are both OSX, and running Version: 4.20130521-g25dba9d according to the webapp. I have also entered my gmail/jabber account on each mac which I believe allows them to communicate indirectly when using the ssh repo.+++I don't know if this is a setup/misconfiguration error or a bug but I can't see how I've setup the assistant wrong, I did manually change the remote url in the config file, as the assistant was having issues connecting (I'm sshing on 21 for various reasons, although I thought this was supported and I no longer receive errors in the webapp now I've specified my remote.++Should I put the corresponding computers as a repositories of each other? I thought each syncing independently with a centralised git would be a more reliable/simple situation than a potential 3 way sync?+++I hope this is enough information, I'm usually good at working out issues myself, however this is just frustrating me and the git-annex solution is so nearly perfect if it would work reliably that I can't bring myself to give up on it!++Thanks!++> [[done]], release notes updated; see my comment --[[Joey]]
@@ -0,0 +1,15 @@+What steps will reproduce the problem?+Init a annex, add rsync remote (with or without encryption, does not matter), launch annex assistant++What is the expected output? What do you see instead?+In the dashboard, no progress is recorded for the transfer. Each file stays at 0% and then disappears as it is fully transfered. I expect the progressbar to move and show the actual transfer progress.++What version of git-annex are you using? On what operating system?+git head of today, Ubuntu 12.04++Please provide any additional information below.+I looked in the source code and found some hints that the rsync progress should actually be evaluated and shown, I'm opening a bug report for this reason.++[[!meta title="assistant: No progress bars for file uploads"]]++> now upload progress bars work! [[done]] --[[Joey]]
@@ -0,0 +1,2 @@+When getting a file with scp, SIGINT is blocked, exposing the git+subcommand fork to background bug again. [[done]]
@@ -0,0 +1,11 @@+It'd be nice to be able to run "git annex version" -- and maybe some other+commands, like "git annex" itself for the help text, without having to be+inside a git repo. Right now it requires you to be in a git repo even if+it's not a git-annex repo.++> You need a newer verison of git-annex. --[[Joey]] ++ joey@gnu:/>git annex version+ git-annex version: 3.20120124++[[done]]
@@ -0,0 +1,48 @@+For the record, there is a slight weirdness with how git-annex+handles a signal like ctrl-c.++For example:++ joey@gnu:~/tmp/b>git annex copy a b --to origin+ copy a (checking origin...) (to origin...) + SHA256-s104857600--20492a4d0d84f8beb1767f6616229f85d44c2827b64bdbfb260ee12fa1109e0e+ 3272 0% 0.00kB/s 0:00:00 ^C+ zsh: interrupt git annex copy a --to origin+ joey@gnu:~/tmp/b>+ rsync error: unexplained error (code 130) at rsync.c(549) [sender=3.0.9]++Here git-annex exits before rsync has fully exited. Not a large problem+but sorta weird.++The culprit is `CmdLine.startup` in Utility.SafeCommand, which installs+a default signal handler for SIGINT, which causes it to immediatly+terminate git-annex. rsync, in turn, has its own SIGINT handler, which +prints the message, typically later.++(Why it prints that message and not its more usual message about having+received a signal, I'm not sure?)++It's more usual for a `system` like thing to block SIGINT, letting the child+catch it and exit, and then detecting the child's exit status and terminating. +However, since rsync *is* trapping SIGINT, and exiting nonzero explicitly,+git-annex can't tell that rsync failed due to a SIGINT by examining the+`waitpid` result.+And, git-annex typically doesn't stop when a single child fails. In the+example above, it would go on to copy `b` after a ctrl-c!++A further complication is that git-annex is itself a child process+of git, which does not block SIGINT either. So if git-annex blocks SIGINT,+it will be left running in the background after git exits, and continuing+with further actions too. (Perhaps its SIGINT handling is a bug in git.)++Now, rsync does have a documented exit code it uses after a SIGINT.+But other programs git-annex runs generally do not. So it would be possible+to special case in support for rsync, blocking SIGINT while running it,+noticing it exited with 20, and git-annex then stopping. But this is+ugly and failure prone if rsync's code 20 changes. And it only+would fix the rsync case, not helping with other commands like wget, unless+it assumes they never trap SIGINT on their own.++Which is why the current behavior of not blocking SIGINT was chosen,+as a less bad alternative. Still, I'd like to find a better one.+--[[Joey]]
@@ -0,0 +1,31 @@+The assistant performs a flood fill, sending every file to every remote+that will have it. This is naive, but it's a good way to ensure the file+gets to every corner of the repo network that it possibly can.++However, this means that locally paired computers will still upload files+to a transfer repo, even when they're next to each other and that+is a massive waste of bandwidth.++It occurred to me this morning that there is a simple change that can avoid+this.++1. Ensure that locally paired computers have a lower cost than network+ transfer remotes. (done)+2. When queuing uploads, queue transfers to the lowest cost remotes first.+ (already done)+3. Just before starting a transfer, re-check if the transfer is still wanted.+ (done)++> [[done]]++Now, unnecessary transfers to tranfer repos are avoided if it can send+the file locally instead.++It doesn't solve it for all network topologies of course. If there+are three computers paired in a line "A --- B --- C", and all 3 share+a transfer repo, A will still send to both B and the transfer repo+even though B can reach C via a faster route.++See also: [[assistant does not always use repo cost info when queueing downloads]]++[[!tag /design/assistant]]
@@ -0,0 +1,54 @@+When adding files to git annex, softlinks are created with current atime (and ctime, etc). Instead, the atime of the added file should be used and added to the meta-data, restoring it everywhere an annex is cloned to. -- RichiH++Optionally, editing the meta-data should change the times in all annexes.++> Thing is, git does not preserve file timestamps much at all. +> It's not uncommon for a `git checkout` to or `git update` to+> mess up timestamps. This is why things like metastore exist (and+> metastore should work ok with git annexed files too). Trying to +> make annexed file symlinks have better timestamp handling than regular+> files in git seems pointless. --[[Joey]]++> > Improving an area where git is (not yet?) good at still makes sense, imo. Photos and the like need absolute timestamps more than source code which is fine with relative timestamps (local builds & updates). Maintaining global timestamps for source code could even cause a lot of unwanted effects. As it is, this issue is the only, but a major, blocker for me before I can start adapting git-annex. As I have three different use cases for it, this is a shame. Unfortunately, I don't speak any Haskell so scratching my own itch isn't do-able (without major effort and not soon, at least). Is there a realistic chance that you will tackle this nonetheless or is this WONTFIX? -- RichiH++>>> Not quite WONTFIX. git-annex should at least, when adding new files,+>>> preserve their timestamp in the symlink it creates.+>>>+>>> Since it doesn't have anything to do with maintaining the symlinks+>>> during an update, or a clone, etc, maintaining the permissions of them +>>> is also out of scope, and it's best to just use metastore if you need+>>> it. Otherwise, git-annex would have to reimplement metastore, and is+>>> unlikely to do it better.++>>>> OK, thanks for the clarification. Would it be acceptable for you to put the timestamps into the metastore with vanilla git? If such an option existed, everyone would be able to benefit and not just me. -- RichiH++>>>>> I've now committed to git changes to make git-annex add make+>>>>> symlinks that reflect the original file's mtime. (It's not possible+>>>>> to set the ctime of a symlink; nor would you want to as messing with+>>>>> ctimes can break backup software ... and atime doesn't much matter.)+>>>>> +>>>>> So all you have to do is make the pre-commit hook call+>>>>> [metastore](http://david.hardeman.nu/software.php). The hook+>>>>> would look like this: ---[[Joey]]++ #!/bin/sh+ git annex pre-commit .+ metastore --save+ git add .metadata++>>>>>> Thanks a lot. Doing this in a new git-annex repo from the start should at least ensure local consistency and I assume I can simply add a post-pull hook to restore the mtimes on all all other repositories? -- RichiH++>>>>>>> This is even better:++ #!/bin/sh+ if ! type metastore >/dev/null; then echo "$0: metastore is not installed; exiting"; exit 1; fi+ git annex pre-commit .+ metastore --save+ git add .metadata++>>>>>>> -- RichiH++>>>>>>>> After getting to actually play with this from different machines with a bare git as central instance for several distributed repos, the metastore trick does not work. The .metadata is causing merge conflicts for every pull. I removed the "done" tag from this issue. -- RichiH++>>>>>>>>> softbox sounds _really_ nice. File systems need to preserve mtimes. Oviously, it would be nice if git-annex exposed this to the upper layer instead of relying on this FUSE implementation, or the next, or the other totally cool thing around the corner to implement it again and again. +>>>>>>>>> I talked to the author of metastore; he is aware that the format is merge-unfriendly but never needed merges for himself. He is aware that this is not ideal for something like git. He does not have the time to implement a text storage instead of binary and I lack the skills to do it. If metastore is used, all it would need to do is introduce a new version of the store (it's versioned, apparently) and save metadata in text, one file per line. xattr would need to be ASCII-armoured, the rest could be plain text. I still think storing this directly in git-annex would make the most sense. Introducing a metadata storage file per storage object in .git/annex and using the object file's name as index is impossible because several softlinks might point to one object so it would need to be done per-softlink :/ -- RichiH
@@ -0,0 +1,42 @@+### Please describe the problem.++When I try to add remote ssh server repository it fails with an error:++Internal Server Error+ssh-keygen failed"+++### What steps will reproduce the problem?+1. Select "Add another repository", then choose "Remote server", enter credentials.+2. On the page "Ready to add remote server" click any choice ("Use a git repository on the server" or "Use an encrypted rsync repository on the server")+3. Error is raised++### What version of git-annex are you using? On what operating system?+git-annex version 4.20130922-g7dc188a++Fedora 18 x86_64++### Please provide any additional information below.++[[!format sh """+# If you can, paste a complete transcript of the problem occurring here.+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log++[2013-10-03 19:27:27 NOVT] main: starting assistant version 4.20130922-g7dc188a+(scanning...) [2013-10-03 19:27:27 NOVT] Watcher: Performing startup scan+(started...) +ssh-keygen: symbol lookup error: /lib64/libldap-2.4.so.2: undefined symbol: ber_sockbuf_io_udp+ssh-keygen: symbol lookup error: /lib64/libldap-2.4.so.2: undefined symbol: ber_sockbuf_io_udp+ssh-keygen: symbol lookup error: /lib64/libldap-2.4.so.2: undefined symbol: ber_sockbuf_io_udp+ssh-keygen: symbol lookup error: /lib64/libldap-2.4.so.2: undefined symbol: ber_sockbuf_io_udp+ssh-keygen: symbol lookup error: /lib64/libldap-2.4.so.2: undefined symbol: ber_sockbuf_io_udp+ssh-keygen: symbol lookup error: /lib64/libldap-2.4.so.2: undefined symbol: ber_sockbuf_io_udp+ssh-keygen: symbol lookup error: /lib64/libldap-2.4.so.2: undefined symbol: ber_sockbuf_io_udp+ssh-keygen: symbol lookup error: /lib64/libldap-2.4.so.2: undefined symbol: ber_sockbuf_io_udp+ssh-keygen: symbol lookup error: /lib64/libldap-2.4.so.2: undefined symbol: ber_sockbuf_io_udp+[2013-10-03 19:55:23 NOVT] call: ssh-keygen ["-P","","-f","/tmp/git-annex-keygen.0/key"]+ssh-keygen: symbol lookup error: /lib64/libldap-2.4.so.2: undefined symbol: ber_sockbuf_io_udp+++# End of transcript or log.+"""]]
@@ -0,0 +1,66 @@+TL;DNR ssh connection caching seems to cause git-annex to not work on NTFS volumes. Setting `annex.sshcaching` to `false` seems to solve the problem.++## What version of git-annex are you using? On what operating system? Please provide any additional information below.++* git-annex version: 3.20120629 on Debian Testing.+* `the-repo` is located on an NTFS volume on a USB HDD.+* `the-remote` is on the server `example.com`.+* `example.com` is running gitolite3 v3.2-19-gb9bbb78, git 1.7.2.5, and git-annex 3.20120629~bpo60+2+++## What steps will reproduce the problem? What is the expected output? What do you see instead?++Create or clone a repo onto an NTFS volume. +Make sure `git annex` is initialized. +Run some regular git operations. These always seem to work. +Try git-annex operations. ++Some operations work despite the error messages:++ $ git annex sync+ Control socket connect(/media/NTFSVOL/the-repo/.git/annex/ssh/git@example.com): Connection refused+ Failed to connect to new control master+ Command ssh ["-S","/media/NTFSVOL/the-repo/.git/annex/ssh/git@example.com","-o","ControlMaster=auto","-o","ControlPersist=yes","git@example.com","git-annex-shell 'configlist' '/~/the-repo.git'"] failed; exit code 255+ Control socket connect(/media/NTFSVOL/the-repo/.git/annex/ssh/git@example.com): Connection refused+ Failed to connect to new control master+ Command ssh ["-S","/media/NTFSVOL/the-repo/.git/annex/ssh/git@example.com","-o","ControlMaster=auto","-o","ControlPersist=yes","git@example.com","git-annex-shell 'configlist' '/~/the-repo'"] failed; exit code 255+ commit + # On branch master+ nothing to commit (working directory clean)+ ok+ pull the-remote + ok+ pull origin + ok++Other operations fail:++ $ git annex copy -t the-remote the-file.jpg+ Control socket connect(/media/NTFSVOL/the-repo/.git/annex/ssh/git@example.com): Connection refused+ Failed to connect to new control master+ Command ssh ["-S","/media/NTFSVOL/the-repo/.git/annex/ssh/git@example.com","-o","ControlMaster=auto","-o","ControlPersist=yes","git@example.com","git-annex-shell 'configlist' '/~/the-repo.git'"] failed; exit code 255+ Control socket connect(/media/NTFSVOL/the-repo/.git/annex/ssh/git@example.com): Connection refused+ Failed to connect to new control master+ Command ssh ["-S","/media/NTFSVOL/the-repo/.git/annex/ssh/git@example.com","-o","ControlMaster=auto","-o","ControlPersist=yes","git@example.com","git-annex-shell 'configlist' '/~/the-repo'"] failed; exit code 255+ copy the-file.jpg (checking the-remote...) Control socket connect(/media/NTFSVOL/the-repo/.git/annex/ssh/git@example.com): Connection refused+ Failed to connect to new control master+ (unable to check the-remote) failed+ git-annex: copy: 1 failed++Some googling revealed the errors to be stale socket files. +- [Three SSH Tips](http://shallowsky.com/blog/tags/ssh/) +- [Improving SSH (OpenSSH) connection speed with shared connections](http://protempore.net/~calvins/howto/ssh-connection-sharing/#section-03) ++It appears that SSH connection caching was implemented in response to this wishlist item: +[wishlist: Prevent repeated password prompts for one command](http://git-annex.branchable.com/todo/wishlist:_Prevent_repeated_password_prompts_for_one_command/)++However ssh connection caching breaks things on NTFS volumes. If I turn off connection caching, it seems to work fine++ $ git config annex.sshcaching false++but it would be nifty if git-annex could detect the filesystem type and do The Right Thing.++Thanks for all the work on git-annex -- it's an awesome project!++> [[done]], `git annex init` now probes for fifo support and disables ssh+> connection caching if it cannot make one. --[[Joey]]
@@ -0,0 +1,56 @@+If a submodule isn't toplevel, git-annex breaks++**What steps will reproduce the problem?**++Make two non-empty repositories:++ mkdir submod+ cd submod+ git init+ touch README && git add README+ git commit -a -m "first import of submodule"+ cd ..++ mkdir test+ cd test+ git init+ touch README && git add README+ git commit -a -m "first import of master"++Add first repository as a non-toplevel submodule:++ git submodule add ../submod lib/submod+ +Setup git-annex for the submodule inside the other repository:++ cd lib/submod+ git annex init++**What is the expected output? What do you see instead?**++Expected:++ init ok+ (Recording state in git...)++Got:++ init fatal: Could not switch to '../../../../lib': No such file or directory+ git-annex: git config [Param "annex.uuid",Param "55D974D1-73E8-489E-B454-03D164664C82"] failed+++**What version of git-annex are you using? On what operating system?**++3.20121011 compiled from git on Mac OS X 10.8+++**Please provide any additional information below.**++* git-annex read the path from the "worktree" variable in the git config.+* The git config for a submodule is storen in the main repository, e.g. "../../.git/modules/lib/submod/config"+* The path in that config is relative to the config file: "worktree = ../../../../lib/submod"+* Git-annex expect the path to be relative to the current directory, which is why it fails.++> Impressive analysis, thanks. I've fixed handling of relative+> core.worktree. [[done]] --[[Joey]]+
@@ -0,0 +1,278 @@+### Please describe the problem.++`git annex test` show multiple failures on a samba mounted partition.++### What steps will reproduce the problem?++just run `git annex test` (in the mounted dir)++### What version of git-annex are you using? On what operating system?++4.20130521, built for architecture `armhf` by the Raspbian maintainers ("jessie" suite at the time of writing)++### Please provide any additional information below.++Here are the last lines of `git annex test` output; AFAICT they are the only lines mentioning failures. Before them the output mentions `+++ OK, passed 100 tests.`.++[[!format text """+# If you can, paste a complete transcript of the problem occurring here.+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log++Cases: 1 Tried: 0 Errors: 0 Failures: 0----------------------------------------------------------------------+Now, some broader checks ...+ (Do not be alarmed by odd output here; it's normal.+ wait for the last line to see how it went.)+----------------------------------------------------------------------+init+ Detected a crippled filesystem.+ Enabling direct mode.+ Detected a filesystem without fifo support.+ Disabling ssh connection caching.+ Cases: 1 Tried: 1 Errors: 0 Failures: 0+Cases: 3 Tried: 0 Errors: 0 Failures: 0Cases: 3 Tried: 1 Errors: 0 Failures: 0----------------------------------------------------------------------+add+ Detected a crippled filesystem.+ Enabling direct mode.+ Detected a filesystem without fifo support.+ Disabling ssh connection caching.+Cases: 3 Tried: 2 Errors: 0 Failures: 0 Detected a crippled filesystem.+ Enabling direct mode.+ Detected a filesystem without fifo support.+ Disabling ssh connection caching.+error: unable to create temporary sha1 filename : No such file or directory++git-annex: user error (git ["--git-dir=/media/freebox/.t/tmprepo0/.git","--work-tree=/media/freebox/.t/tmprepo0","commit-tree","4b825dc642cb6eb9a060e54bf8d69288fbee4904"] exited 1)+ ### Failure in: git-annex add:2+git annex init failed+Cases: 3 Tried: 3 Errors: 0 Failures: 1+Cases: 1 Tried: 0 Errors: 0 Failures: 0----------------------------------------------------------------------+reinject+ Detected a crippled filesystem.+ Enabling direct mode.+ Detected a filesystem without fifo support.+ Disabling ssh connection caching.+ Detected a crippled filesystem.+ Detected a filesystem without fifo support.+ Disabling ssh connection caching.+ Cases: 1 Tried: 1 Errors: 0 Failures: 0+Cases: 2 Tried: 0 Errors: 0 Failures: 0not supported in direct mode; skipping+----------------------------------------------------------------------+unannex+ Detected a crippled filesystem.+ Enabling direct mode.+ Detected a filesystem without fifo support.+ Disabling ssh connection caching.+error: unable to create temporary sha1 filename : No such file or directory++git-annex: user error (git ["--git-dir=/media/freebox/.t/tmprepo1/.git","--work-tree=/media/freebox/.t/tmprepo1","commit-tree","4b825dc642cb6eb9a060e54bf8d69288fbee4904"] exited 1)+ ### Failure in: git-annex unannex:0:no content+git annex init failed+Cases: 2 Tried: 1 Errors: 0 Failures: 1 Detected a crippled filesystem.+ Enabling direct mode.+ Detected a filesystem without fifo support.+ Disabling ssh connection caching.+ Detected a crippled filesystem.+ Detected a filesystem without fifo support.+ Disabling ssh connection caching.+ Cases: 2 Tried: 2 Errors: 0 Failures: 1+Cases: 3 Tried: 0 Errors: 0 Failures: 0not supported in direct mode; skipping+----------------------------------------------------------------------+drop+ Detected a crippled filesystem.+ Enabling direct mode.+ Detected a filesystem without fifo support.+ Disabling ssh connection caching.+error: unable to create temporary sha1 filename : No such file or directory++git-annex: user error (git ["--git-dir=/media/freebox/.t/tmprepo2/.git","--work-tree=/media/freebox/.t/tmprepo2","commit-tree","4b825dc642cb6eb9a060e54bf8d69288fbee4904"] exited 1)+ ### Failure in: git-annex drop:0:no remotes+git annex init failed+Cases: 3 Tried: 1 Errors: 0 Failures: 1 Detected a crippled filesystem.+ Enabling direct mode.+ Detected a filesystem without fifo support.+ Disabling ssh connection caching.+Cases: 3 Tried: 2 Errors: 0 Failures: 1/media/freebox/.t/tmprepo3/.git: No such file or directory+ ### Failure in: git-annex drop:2:untrusted remote+git clone failed+Cases: 3 Tried: 3 Errors: 0 Failures: 2+Cases: 1 Tried: 0 Errors: 0 Failures: 0/media/freebox/.t/tmprepo3/.git: No such file or directory+ ### Failure in: git-annex get+git clone failed+Cases: 1 Tried: 1 Errors: 0 Failures: 1+Cases: 1 Tried: 0 Errors: 0 Failures: 0/media/freebox/.t/tmprepo3/.git: No such file or directory+ ### Failure in: git-annex move+git clone failed+Cases: 1 Tried: 1 Errors: 0 Failures: 1+Cases: 1 Tried: 0 Errors: 0 Failures: 0/media/freebox/.t/tmprepo3/.git: No such file or directory+ ### Failure in: git-annex copy+git clone failed+Cases: 1 Tried: 1 Errors: 0 Failures: 1+Cases: 1 Tried: 0 Errors: 0 Failures: 0/media/freebox/.t/tmprepo3/.git: No such file or directory+ ### Failure in: git-annex unlock/lock+git clone failed+Cases: 1 Tried: 1 Errors: 0 Failures: 1+Cases: 2 Tried: 0 Errors: 0 Failures: 0/media/freebox/.t/tmprepo3/.git: No such file or directory+ ### Failure in: git-annex edit/commit:0+git clone failed+Cases: 2 Tried: 1 Errors: 0 Failures: 1/media/freebox/.t/tmprepo3/.git: No such file or directory+ ### Failure in: git-annex edit/commit:1+git clone failed+Cases: 2 Tried: 2 Errors: 0 Failures: 2+Cases: 1 Tried: 0 Errors: 0 Failures: 0/media/freebox/.t/tmprepo3/.git: No such file or directory+ ### Failure in: git-annex fix+git clone failed+Cases: 1 Tried: 1 Errors: 0 Failures: 1+Cases: 1 Tried: 0 Errors: 0 Failures: 0/media/freebox/.t/tmprepo3/.git: No such file or directory+ ### Failure in: git-annex trust/untrust/semitrust/dead+git clone failed+Cases: 1 Tried: 1 Errors: 0 Failures: 1+Cases: 4 Tried: 0 Errors: 0 Failures: 0/media/freebox/.t/tmprepo3/.git: No such file or directory+ ### Failure in: git-annex fsck:0+git clone failed+Cases: 4 Tried: 1 Errors: 0 Failures: 1/media/freebox/.t/tmprepo3/refs: No such file or directory+ ### Failure in: git-annex fsck:1+git clone failed+Cases: 4 Tried: 2 Errors: 0 Failures: 2/media/freebox/.t/tmprepo3/.git: No such file or directory+ ### Failure in: git-annex fsck:2+git clone failed+Cases: 4 Tried: 3 Errors: 0 Failures: 3/media/freebox/.t/tmprepo3/.git: No such file or directory+ ### Failure in: git-annex fsck:3+git clone failed+Cases: 4 Tried: 4 Errors: 0 Failures: 4+Cases: 2 Tried: 0 Errors: 0 Failures: 0/media/freebox/.t/tmprepo3/.git: No such file or directory+ ### Failure in: git-annex migrate:0+git clone failed+Cases: 2 Tried: 1 Errors: 0 Failures: 1/media/freebox/.t/tmprepo3/.git: No such file or directory+ ### Failure in: git-annex migrate:1+git clone failed+Cases: 2 Tried: 2 Errors: 0 Failures: 2+Cases: 1 Tried: 0 Errors: 0 Failures: 0/media/freebox/.t/tmprepo3/.git: No such file or directory+ ### Failure in: git-annex unused/dropunused+git clone failed+Cases: 1 Tried: 1 Errors: 0 Failures: 1+Cases: 1 Tried: 0 Errors: 0 Failures: 0/media/freebox/.t/tmprepo3/.git: No such file or directory+ ### Failure in: git-annex describe+git clone failed+Cases: 1 Tried: 1 Errors: 0 Failures: 1+Cases: 1 Tried: 0 Errors: 0 Failures: 0/media/freebox/.t/tmprepo3/.git: No such file or directory+ ### Failure in: git-annex find+git clone failed+Cases: 1 Tried: 1 Errors: 0 Failures: 1+Cases: 1 Tried: 0 Errors: 0 Failures: 0/media/freebox/.t/tmprepo3/.git: No such file or directory+ ### Failure in: git-annex merge+git clone failed+Cases: 1 Tried: 1 Errors: 0 Failures: 1+Cases: 1 Tried: 0 Errors: 0 Failures: 0/media/freebox/.t/tmprepo3/.git: No such file or directory+ ### Failure in: git-annex status+git clone failed+Cases: 1 Tried: 1 Errors: 0 Failures: 1+Cases: 1 Tried: 0 Errors: 0 Failures: 0/media/freebox/.t/tmprepo3/.git: No such file or directory+ ### Failure in: git-annex version+git clone failed+Cases: 1 Tried: 1 Errors: 0 Failures: 1+Cases: 1 Tried: 0 Errors: 0 Failures: 0/media/freebox/.t/tmprepo3/.git: No such file or directory+ ### Failure in: git-annex sync+git clone failed+Cases: 1 Tried: 1 Errors: 0 Failures: 1+Cases: 1 Tried: 0 Errors: 0 Failures: 0/media/freebox/.t/tmprepo3/.git: No such file or directory+ ### Failure in: union merge regression+git clone failed+Cases: 1 Tried: 1 Errors: 0 Failures: 1+Cases: 1 Tried: 0 Errors: 0 Failures: 0/media/freebox/.t/tmprepo3/.git: No such file or directory+ ### Failure in: automatic conflict resolution+git clone failed+Cases: 1 Tried: 1 Errors: 0 Failures: 1+Cases: 1 Tried: 0 Errors: 0 Failures: 0/media/freebox/.t/tmprepo3/.git: No such file or directory+ ### Failure in: git-annex map+git clone failed+Cases: 1 Tried: 1 Errors: 0 Failures: 1+Cases: 1 Tried: 0 Errors: 0 Failures: 0/media/freebox/.t/tmprepo3/.git: No such file or directory+ ### Failure in: git-annex uninit+git clone failed+Cases: 1 Tried: 1 Errors: 0 Failures: 1+Cases: 1 Tried: 0 Errors: 0 Failures: 0/media/freebox/.t/tmprepo3/.git: No such file or directory+ ### Failure in: git-annex upgrade+git clone failed+Cases: 1 Tried: 1 Errors: 0 Failures: 1+Cases: 1 Tried: 0 Errors: 0 Failures: 0/media/freebox/.t/tmprepo3/.git: No such file or directory+ ### Failure in: git-annex whereis+git clone failed+Cases: 1 Tried: 1 Errors: 0 Failures: 1+Cases: 1 Tried: 0 Errors: 0 Failures: 0/media/freebox/.t/tmprepo3/.git: No such file or directory+ ### Failure in: git-annex hook remote+git clone failed+Cases: 1 Tried: 1 Errors: 0 Failures: 1+Cases: 1 Tried: 0 Errors: 0 Failures: 0/media/freebox/.t/tmprepo3/.git: No such file or directory+ ### Failure in: git-annex directory remote+git clone failed+Cases: 1 Tried: 1 Errors: 0 Failures: 1+Cases: 1 Tried: 0 Errors: 0 Failures: 0/media/freebox/.t/tmprepo3/.git: No such file or directory+ ### Failure in: git-annex rsync remote+git clone failed+Cases: 1 Tried: 1 Errors: 0 Failures: 1+Cases: 1 Tried: 0 Errors: 0 Failures: 0/media/freebox/.t/tmprepo3/.git: No such file or directory+ ### Failure in: git-annex bup remote+git clone failed+Cases: 1 Tried: 1 Errors: 0 Failures: 1+Cases: 1 Tried: 0 Errors: 0 Failures: 0/media/freebox/.t/tmprepo3/.git: No such file or directory+ ### Failure in: git-annex crypto+git clone failed+Cases: 1 Tried: 1 Errors: 0 Failures: 1+----------------------------------------------------------------------+get+----------------------------------------------------------------------+move+----------------------------------------------------------------------+copy+----------------------------------------------------------------------+lock+----------------------------------------------------------------------+edit+----------------------------------------------------------------------+fix+----------------------------------------------------------------------+trust+----------------------------------------------------------------------+fsck+----------------------------------------------------------------------+migrate+----------------------------------------------------------------------+ unused+----------------------------------------------------------------------+describe+----------------------------------------------------------------------+find+----------------------------------------------------------------------+merge+----------------------------------------------------------------------+status+----------------------------------------------------------------------+version+----------------------------------------------------------------------+sync+----------------------------------------------------------------------+union merge regression+----------------------------------------------------------------------+conflict resolution+----------------------------------------------------------------------+map+----------------------------------------------------------------------+uninit+----------------------------------------------------------------------+upgrade+----------------------------------------------------------------------+whereis+----------------------------------------------------------------------+hook remote+----------------------------------------------------------------------+directory remote+----------------------------------------------------------------------+rsync remote+----------------------------------------------------------------------+bup remote+----------------------------------------------------------------------+crypto+git-annex: .t/repo/.git/annex: removeDirectory: unsatisified constraints (Directory not empty)++# End of transcript or log.+"""]]
@@ -0,0 +1,3 @@+When the test suite cannot be compiled, the build just fails silenty. This means that in automated builds there is no easy way to ensure that the generated binaries have passed the test suite, because it may not even have been run! IMHO, "make test" should fail (i.e. return a non-zero exit code) when it can't succeeed.++> Ok, fixed. --[[Joey]] [[done]]
@@ -0,0 +1,50 @@+Make test fails when git doesn't know what identity to give to commits++<pre>++Testing 1:blackbox:0:git-annex init+Cases: 30 Tried: 7 Errors: 0 Failures: 0+*** Please tell me who you are.++Run++ git config --global user.email "you@example.com"+ git config --global user.name "Your Name"++to set your account's default identity.+Omit --global to set the identity only in this repository.++fatal: empty ident <jtang@lenny.localdomain> not allowed+### Failure in: 1:blackbox:0:git-annex init+init failed+Testing 1:blackbox:1:git-annex add:0+Cases: 30 Tried: 8 Errors: 0 Failures: 1+*** Please tell me who you are.+</pre>++I guess most users testing git-annex probably have a .gitconfig sitting in their home directories already so the above never cropped up. This failure was initially found in a clean and fresh install of a virtual machine with archlinux and repeated again on my archlinux laptop.++Update: I pulled the master on my rhel5 test machine and moved my .gitconfig out of the way, the tests passes and continues but I still get a "warning message" from git. ++<pre>+Testing 1:blackbox:3:git-annex unannex:1:with content +Cases: 30 Tried: 12 Errors: 0 Failures: 0[master fce0cde] content removed from git annex+ Committer: Jimmy Tang <jtang@removed.removed.tcd.ie>+Your name and email address were configured automatically based+on your username and hostname. Please check that they are accurate.+You can suppress this message by setting them explicitly:++ git config --global user.name "Your Name"+ git config --global user.email you@example.com++After doing this, you may fix the identity used for this commit with:++ git commit --amend --reset-author++ 2 files changed, 1 insertions(+), 2 deletions(-)+ delete mode 120000 foo+</pre>++I guess it also depends a bit on how git figures out who it is is committing and how the machine in question is configured with hostnames and domain names.++> Fixed that. [[done]] --[[Joey]]
@@ -0,0 +1,23 @@+I updated haskell platform, and now++<pre>+[jtang@x00 git-annex (master)]$ make test++Assistant/Threads/NetWatcher.hs:26:2:+ warning: #warning Building without dbus support; will poll for network connection changes [-Wcpp]++Assistant/Threads/MountWatcher.hs:33:2:+ warning: #warning Building without dbus support; will use mtab polling [-Wcpp]++test.hs:11:8:+ Could not find module `Test.HUnit.Tools'+ Perhaps you meant Test.HUnit.Text (from HUnit-1.2.5.1)+ Use -v to see a list of the files searched for.+** failed to build the test suite+make: *** [test] Error 1+</pre>++Looks like a missing dep somewhere with testpack or quickcheck... I haven't had time to figure it out yet, its not git-annex specific but I thought I might log it as a reminder for myself just in case if the osxapp is more borked than usual, I probably need to flush my .cabal directory of installed userland dependancies.++> The testpack library has been broken by some other library changes. I+> made changes in git yesterday to avoid using it. [[done]] --[[Joey]]
@@ -0,0 +1,56 @@+What steps will reproduce the problem?++I don't know how, but this happened already a second time, I don't know how to reproduce this yet.++What is the expected output? What do you see instead?++There are many three character name directories created that look like the parts of a hash - and each contains a logfile.++ % ls+ 027+ 1d1+ 1e3+ 232+ 36e+ 583+ 5f6+ 69c+ 9ea+ bd7+ c46+ d20+ d48+ f31+ f88+ uuid.log+ [+the intended data directories]++ % find 027/+ 027/+ 027//b73+ 027//b73/SHA256-s10108928--3c3766aed8b66de9d0ef37820e0ddfba25f9463b37f30e25ceb5ce3cdf12db36.log++ % cat f88/7c3/SHA256-s4100608--903530747dfdc7bc9d487d7cbd8ab09ddc1ffad52c08849d049c8a5ff5cfb854.log+ 1351711677.187589s 1 2efd46d2-0e32-11e2-95fe-f73f09c6615e+ 1351971337.667243s 1 ab50cd8a-11c0-11e2-934c-87e45f64e5c6++What version of git-annex are you using? On what operating system?++% git-annex version+git-annex version: 3.20121017+local repository version: 3+default repository version: 3+supported repository versions: 3+upgrade supported from repository versions: 0 1 2++OS X 10.6.8++Please provide any additional information below.++I use a symlink to the repository to change into it.++> Closing this bug as user error. If the `git-annex` branch+> gets merged into master by the user, then that adds all its log files+> to master, and so they're visible as regular files. Solution: Don't do+> that, or if you do that, use `git log --stat` to find the commit that+> adds all those files, and `git revery` the commit. [[done]] --[[Joey]]
@@ -0,0 +1,119 @@+## What steps will reproduce the problem?++I wanted to setup a `~/Desktop/annex` synchronised between three machines, my home desktop (`dagon`), my work desktop (`zakaz`) and my laptop (`hastur`).++I set this up via the annex interface, using my gmail account and Amazon S3.++## What is the expected output? What do you see instead?++I expected that anything dropped into `~/Desktop/annex` on any of the three machines would be synced to the other 2.++I ran:+<pre>+ $ echo Created on `hostname` > `hostname`.txt on each of the three machines.+</pre>++What I ended up with was:++* Home desktop (`dagon`): dagon.txt (ok)+* Work desktop (`zakaz`): zakaz.txt (ok) and hastur.txt (broken link)+* Laptop (`hastur`): hastur.txt (ok) and zakaz.txt (broken link)++In each case the local file had been detected and annexed -- "(ok)" means it is a symlink to the annex.++Manually running `git annex sync` on any of the machines didn't change anything. Running `git annex copy --auto --from=DesktopAnnex` on the Work desktop synced the broken hastur.txt but dagon.txt didn't appear. Running the same on my laptop did nothing. Likewise on my home desktop it did nothing. (I'm not sure if running stuff from the CLI is valid when the assistant is running, but I couldn't see a "force refresh" option in the UI)++In the `git log --oneline` my laptop and Work machines both have:+<pre>+3f541e5 Merge commit 'refs/synced/552d29fe-4a86-11e2-819a-9f61585ee7a2/master'+cbee12b +dddc4f0 +d8854e7 Merge commit 'refs/synced/1167ef76-4791-11e2-9bfe-4319f44b8a5f/master'+</pre>++While my home desktop has:+<pre>+43a80d5 git-annex automatic sync+46328db +d8854e7 Merge commit 'refs/synced/1167ef76-4791-11e2-9bfe-4319f44b8a5f/master'+</pre>++There are other commits prior to d8854e7 which appear to be the same on all hosts. d8854e7 was committed in December when I first played with this stuff. All the commits after that were made today as part of the experiment above, with the exception of 43a80d5 on my home desktop with was the removal of a "Test.txt" created last year. This removal also didn't sync to the other two machines.++git-annex status on my home desktop (dagon) shows:+<pre>+semitrusted repositories: 5+ 00000000-0000-0000-0000-000000000001 -- web+ 1167ef76-4791-11e2-9bfe-4319f44b8a5f -- annex on hastur+ 54f6febc-4791-11e2-952f-13bd7a1c79f1 -- here (annex on dagon)+ 552d29fe-4a86-11e2-819a-9f61585ee7a2 -- ian.james.campbell (annex on zakaz)+ ad5c6a4c-4791-11e2-b9f0-53f8af10a9e6 -- DesktopAnnex+</pre>+(DesktopAnnex is the S3 remote, ian.james.campbell is my gmail username)++However the webapp only shows 3 repos:+<pre>+ here (annex on dagon)+ ian.james.campbell (annex on zakaz)+ DesktopAnnex+</pre>++git-annex status on my laptop (hastur) shows only:+<pre>+ 00000000-0000-0000-0000-000000000001 -- web+ 1167ef76-4791-11e2-9bfe-4319f44b8a5f -- here (ijc@hastur:~/Desktop/annex)+ 54f6febc-4791-11e2-952f-13bd7a1c79f1 -- ian.james.campbell (ijc@dagon:~/Desktop/annex)+ ad5c6a4c-4791-11e2-b9f0-53f8af10a9e6 -- DesktopAnnex+</pre>++while the webapp shows:+<pre>+ here (ijc@hastur:~/Desktop/annex)+ ian.james.campbell (ijc@dagon:~/Desktop/annex)+ DesktopAnnex+</pre>++Lastly on my work desktop (zakaz) annex status shows:+<pre>+ 00000000-0000-0000-0000-000000000001 -- web+ 1167ef76-4791-11e2-9bfe-4319f44b8a5f -- annex on hastur+ 54f6febc-4791-11e2-952f-13bd7a1c79f1 -- ian.james.campbell (annex on dagon)+ 552d29fe-4a86-11e2-819a-9f61585ee7a2 -- here (annex on zakaz)+ ad5c6a4c-4791-11e2-b9f0-53f8af10a9e6 -- DesktopAnnex+</pre>++The webapp shows:+<pre>+ here (annex on zakaz)+ ian.james.campbell (annex on dagon)+ DesktopAnnex +</pre>++git-annex sync on any of them shows:+<pre>+$ git annex sync+commit +# On branch master+nothing to commit (working directory clean)+ok+pull ian.james.campbell +fatal: Unable to find remote helper for 'xmpp'+failed+push ian.james.campbell +fatal: Unable to find remote helper for 'xmpp'+failed+git-annex: sync: 2 failed+</pre>++## What version of git-annex are you using? On what operating system?++3.20121211 on Debian Sid. All machines are amd64++## Please provide any additional information below.++I'm not 100% sure this sort of multiway synching is supposed to work, so maybe this is just as expected. If this isn't a bug you could consider it a feature request though ;-)++This issue also made me wonder about how one would go about syncing multiple unrelated annexes via XMPP. Would you need a different gmail account for each? Maybe there is a trick similar to the email local+foo@ thing?++> [[done]], turned out I left XMPP git push working,+> but had not done all the stuff around it to get reliable syncing. Now have. --[[Joey]]
@@ -0,0 +1,13 @@+git-annex deletes all tmp files on shutdown, if everything succeeded.+This presents 2 problems:++1. If git-annex is rsyncing something and another one is run, it will+ delete the running instance's tmp files.+2. If a long-running rsync transfer is interrupted partway through, the+ tmp file was expensive to obtain, and one needs to avoid running+ git-annex to do anything else until that transfer can be resumed and+ finished.++--[[Joey]] ++[[done]]
@@ -0,0 +1,19 @@+It seems that commit bc5c54c987f548505a3877e8a0e460abe0b2a081 introduced some linux specific things...++<pre>+hsc2hs Touch.hsc+Touch.hsc: In function ‘main’:+Touch.hsc:46: error: ‘UTIME_OMIT’ undeclared (first use in this function)+Touch.hsc:46: error: (Each undeclared identifier is reported only once+Touch.hsc:46: error: for each function it appears in.)+Touch.hsc:48: error: ‘UTIME_NOW’ undeclared (first use in this function)+Touch.hsc:67: error: ‘AT_FDCWD’ undeclared (first use in this function)+Touch.hsc:68: error: ‘AT_SYMLINK_NOFOLLOW’ undeclared (first use in this function)+compiling Touch_hsc_make.c failed+command was: /usr/bin/gcc -c -m32 -I/Library/Frameworks/GHC.framework/Versions/612/usr/lib/ghc-6.12.3/include/ Touch_hsc_make.c -o Touch_hsc_make.o+make: *** [Touch.hs] Error 1+</pre>++I dug around the OSX documentation and fcntl.h header file and it seems that UTIME_OMIT, UTIME_NOW, AT_FDCWD and AT_SYMLINK_NOFOLLOW aren't defined (at least on OSX). I suspect the BSD's in general will have problems compiling git-annex.++[[!meta title="annexed symlink mtime matching code is disabled on non-linux systems; needs testing"]]
@@ -0,0 +1,51 @@+What steps will reproduce the problem?+Create a new annex, add a new repository:++ git annex initremote vserver2 type=rsync rsyncurl=vserver.dbruhn.de:/annex encryption=dominik@dbruhn.de++Add some files, add them to annex, try to transfer them:+ git annex transferkey SHA256-s6486446--df84b11a0e9543134224d0ac1e0f2567bcd79d86605117c5af008a1b133cee3a --to vserver2 --file MKBD/OB.mp3 --debug++What is the expected output? What do you see instead?++I expect the file to be transfered to my remote server. Instead I see a 'gpg>' prompt with nothing happening. When pressing CTRL+C, the following mesage is shown:++gpg: Interrupt caught ... exiting++There must be some faults when interfacing gpg. The other console-output is:++-----+ [2012-09-08 18:50:12 CEST] read: git ["--git-dir=/home/dominik/Annex/.git","--work-tree=/home/dominik/Annex","show-ref","git-annex"] + [2012-09-08 18:50:12 CEST] read: git ["--git-dir=/home/dominik/Annex/.git","--work-tree=/home/dominik/Annex","show-ref","--hash","refs/heads/git-annex"] + [2012-09-08 18:50:12 CEST] read: git ["--git-dir=/home/dominik/Annex/.git","--work-tree=/home/dominik/Annex","log","refs/heads/gitannex..245fa80db6733dbbeff6c40d46bd65ed00811548","--oneline","-n1"] + [2012-09-08 18:50:12 CEST] chat: git ["--git-dir=/home/dominik/Annex/.git","--work-tree=/home/dominik/Annex","cat-file","--batch"] + (gpg) [2012-09-08 18:50:12 CEST] chat: gpg ["--batch","--no-tty","--use-agent","--quiet","--trust-model","always","--decrypt"] + [2012-09-08 18:50:12 CEST] chat: gpg ["--batch","--no-tty","--use-agent","--quiet","--trust-model","always","--passphrase-fd","8","--symmetric","--force-mdc"] + sdgdg+ dsgdgs+ ^C+ gpg: Interrupt caught ... exiting+-----++What version of git-annex are you using? On what operating system?+git-annex version: 3.20120826+Ubuntu 12.04, GHC 7.4.1+gpg is 'gpg (GnuPG) 1.4.11'++Please provide any additional information below.++The key which is used for the remote is password protected. The GnuPG Agent asks me for the password, so this seems to work. I do not know what content the gpg expects but does not recieve. The .git/config entry for the remote looks reasonable:++ [remote "vserver2"]+ annex-rsyncurl = vserver.dbruhn.de:/annex+ annex-uuid = ea3d6acc-716c-48e8-9b6b-993b90dcc1db++When adding a new rsync-remote with encryption set to 'none' (therefore disabled), everything works, so it really seems a gpg issue.++How can I help debugging?++> Thanks, I reproduced a deadlock in the gpg code, which was introduced+> with some of my earlier changes to use threading. No released version of+> git-annex was affected, and I have developed a fix, which works for me+> and is now committed to master. Marking this [[done]]; please do check+> that my fix works for you! --[[Joey]]
@@ -0,0 +1,16 @@+What steps will reproduce the problem?+Add a ssh remote to an existing git annex repository. The word "sensitive" is misspelled.++What is the expected output? What do you see instead?+I expect to see:+"The contents of your files will be stored, fully encrypted, on the server. The server will not store other information about your git repository. This is the best choice if you don't run the server yourself, or have sensitive data."++But instead I see:+"The contents of your files will be stored, fully encrypted, on the server. The server will not store other information about your git repository. This is the best choice if you don't run the server yourself, or have sensative data."++What version of git-annex are you using? On what operating system?+3.20130102, Fedora 17 x86_64++Please provide any additional information below.++> [[done]] --[[Joey]]
@@ -0,0 +1,13 @@+### Please describe the problem.+(I assume) following your change to disallow changing the name of "here", I am unable to change the repository group of "here"+++### What steps will reproduce the problem?+In webapp, edit "here", and try and change repository group.+It highlights the (now empty) name field, and says "value is required".++### What version of git-annex are you using? On what operating system?+git-annex version: 4.20130618-g333cb8e+Ubuntu 13.04++> [[fixed|done]] --[[Joey]]
@@ -0,0 +1,14 @@+git's index broke and I was unable to restore it. While this is not git-annex' problem, it should still be possible to get my data in an un-annexed state.++ % git status+ fatal: index file smaller than expected+ % git annex unannex foo+ fatal: index file smaller than expected+ % git annex uninit+ fatal: index file smaller than expected+ uninit + pre-commit hook (/path/to/git-annex/.git/hooks/pre-commit) contents modified; not deleting. Edit it to remove call to git annex.+ ok+ %++Ttbomk, the softlinks and objects are enough to un-annex the files; side-stepping git's index if necessary.
@@ -0,0 +1,30 @@+ $ git init ; git annex init test ; dd if=/dev/urandom of=file1 count=128 ; cp file1 file2 ; git annex add --backend=SHA1 file? ; git commit -m init ; git annex unannex ; ls -l+ Initialized empty Git repository in /tmp/annex/.git/+ init test ok+ 128+0 records in+ 128+0 records out+ 65536 bytes (66 kB) copied, 0.007173 s, 9.1 MB/s+ add file1 (checksum...) ok+ add file2 (checksum...) ok+ (Recording state in git...)+ [master (root-commit) 2177b10] init+ 2 files changed, 2 insertions(+), 0 deletions(-)+ create mode 120000 file1+ create mode 120000 file2+ unannex file1 ok+ (Recording state in git...)+ [master bef78b1] content removed from git annex+ 1 files changed, 0 insertions(+), 1 deletions(-)+ delete mode 120000 file1+ total 72+ -rw-r--r-- 1 simons users 65536 Jul 15 17:29 file1+ lrwxrwxrwx 1 simons users 132 Jul 15 17:29 file2 -> .git/annex/objects/jp/Fk/SHA1-s65536--795b58cc4e5190b02e7026fd9e94a10c98c6475f/SHA1-s65536--795b58cc4e5190b02e7026fd9e94a10c98c6475f++> This was recently discussed in+> [[annex_unannex__47__uninit_should_handle_copies]] and `unannex --fast`+> added to leave contents behind in the annex, which allows handling+> copies. But needs manual cleanup later with dropunused. --[[Joey]] ++> This is basically a dup of [[Large unannex operations result in stale symlinks and data loss]],+> or at least the ideas in there will also deal with this. Closing as dupe.+> [[done]] --[[Joey]]
@@ -0,0 +1,20 @@+##What steps will reproduce the problem?++ echo text > foo+ echo text > bar+ git annex add foo bar+ git annex unannex foo++##What is the expected output? What do you see instead?++I would expect that the object behind 'bar' remained intact, what happens is that the object is moved out of the annex and 'bar' is left as a dangling symlink, if you are unlucky and don't spot this, it could be potentially dangerous, since you can easily lose data.++##What version of git-annex are you using? On what operating system?++git-annex built from git on Tue Mar 12 15:58:36 2013 -0400++From commit: 70b7555eaf9ac5f88bb137985d93bed8d5a434e8++On Debian Sid++> [[done]]; duplicate bug report
@@ -0,0 +1,15 @@+See [[forum/unannex_alternatives]] for problem description.++If an unannex is followed by a "git add; git commit", git-annex's hook thinks+that you have used git annex unlock on the file and are+now committing a changed version, and the right thing to do there is to add the+new content to the annex and update the symlink accordingly.++Can we tell the difference between an unannexed file that has yet to be committed+and has been re-added as a normal file, vs an unlocked file? --[[Joey||++> Hmm, not really. An unannexed file's content will have been dropped from+> the backend, but that's about the only difference. Perhaps unannex should+> just commit the removal of the file itself? --[[Joey]]++> [[done]], staged changes committed at end.
@@ -0,0 +1,5 @@+Trying to move files from a local remote that is not mounted:++ git-annex: Prelude.undefined++> [[fixed|done]] --[[Joey]]
@@ -0,0 +1,31 @@+### Please describe the problem.++Hi, all excited that the new release fixes the unknown UUID issue in the Webapp I hurridly installed the latest versions. ++Some progress in that the webapp now reports my missing/non-existent repo as an "unfinished repository" in the process of being setup. I see a check status box that when clicked says "in progress please be patient". Also I see the ssh config has changed to use IdentitiesOnly option.++I had a go a deleting details via git-annex vicfg and directly editing the git-annex branch log files as detailed [here](http://git-annex.branchable.com/forum/Reappearing_repos_in_webapp_and_vicfg/). But still no joy. ++Any hints on what to do? Nothing in the log seems to help...++### What steps will reproduce the problem?++Not sure anymore.++### What version of git-annex are you using? On what operating system?++Latest.++### Please provide any additional information below.++[[!format sh """+# If you can, paste a complete transcript of the problem occurring here.+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log+++# End of transcript or log.+"""]]++> This seems to be [[done]], at least the bug reporter didn't feel the need+> to follow up with the info I asked for and says the problem does not+> affect him. --[[Joey]]
@@ -0,0 +1,41 @@+Try unsetting LANG and passing git-annex unicode filenames.++ joey@gnu:~/tmp/aa>git annex add ./Üa+ add add add add git-annex: <stdout>: commitAndReleaseBuffer: invalid+ argument (Invalid or incomplete multibyte or wide character)++> Interestingly, I can get the same crash in the de_DE.UTF-8 locale+> with certian input filenames, while in en_US.UTF-8, it's ok.+> The workaround below avoided the problem in de_DE.UTF-8. --[[Joey]]++> Put in the utf-8 forcing workaround for now. [[done]] --[[Joey]] ++## underlying haskell problem and workaround++The same problem can be seen with a simple haskell program:++ import System.Environment+ import Codec.Binary.UTF8.String+ main = do+ args <- getArgs+ putStrLn $ decodeString $ args !! 0++ joey@gnu:~/src/git-annex>LANG= runghc ~/foo.hs Ü+ foo.hs: <stdout>: hPutChar: invalid argument (Invalid or incomplete multibyte or wide character)++(The call to `decodeString` is necessary to make the input+unicode string be displayed properly in a utf8 locale, but+does not contribute to this problem.)++I guess that haskell is setting the IO encoding to latin1, which+is [documented](http://haskell.org/ghc/docs/latest/html/libraries/base/System-IO.html#v:latin1)+to error out on characters > 255. ++So this program doesn't have the problem -- but may output garbage+on non-utf-8 capable terminals:++ import System.IO+ main = do+ hSetEncoding stdout utf8+ args <- getArgs+ putStrLn $ decodeString $ args !! 0
@@ -0,0 +1,23 @@+### Please describe the problem.+I am unable to restore a git-annex dir to its pre init state.++### What steps will reproduce the problem?+init a git-annex dir on android with a file system with out symlinks.+use for a while.+Run: "git-annex uninit" -> You cannot run this command in a direct mode repository.+Run: "git-annex indirect" -> Git is configured to not use symlinks, so you must use direct mode.++### What version of git-annex are you using? On what operating system?+git-annex version: 4.20130601-g7483ca4++### Please provide any additional information below.++[[!format sh """+# If you can, paste a complete transcript of the problem occurring here.+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log+++# End of transcript or log.+"""]]++> [[done]]; added support for direct mode --[[Joey]]
@@ -0,0 +1,47 @@+> What steps will reproduce the problem?++Issue the following commands on a file system where hard links are disabled:++ $ touch foo+ + $ ln foo bar # just to check that hard links are disabled+ ln: failed to create hard link `bar' => `foo': Operation not permitted+ + $ git init && git annex init+ + $ git annex add .+ + $ git annex uninit+ unannex foo + git-annex: [...]: createLink: permission denied (Operation not permitted)+ failed+ Deleted branch git-annex [...].++ $ echo $? # exit status of last command+ 0+ + $ ls foo+ ls: cannot access foo: No such file or directory+++> What is the expected output? What do you see instead?++`git annex uninit` should abort and exit with a non-`0` return code. Instead, `git annex uninit` cleans up git-annex objects and exits with return code `0`.+++> What version of git-annex are you using? On what operating system?++3.20120406 on Ubuntu 12.04.1.+++> Please provide any additional information below.++git-annex should probably not be used on a file system where hard links are disabled.++However, if the user is not aware that he's using git-annex on such a filesystem, he will accidently delete his annexed files by issuing a `git annex uninit` command.++> git-annex needs a POSIX filesystem, which includes the ability to create+> hard links. The `git annex add` in the example above will fail+> trying to create a hard link with current versions.+> +> I've made uninit fall back to a non-hard link mode. [[done]] --[[Joey]]
@@ -0,0 +1,20 @@+As uninit does not need to actually write out any data, just remove it, it should be possible to uninit in old stores.++ % git annex uninit+ git-annex: Repository version 2 is not supported. Upgrade this repository: git-annex upgrade++If the repo happens to be broken, this essentially locks in data.++> No, because you can always check out the version of git-annex you need+> for that repository.+> +> uninit, as implemented, runs unannex on every file and then does some+> cleanup. The cleanup does not need to write state, but the unannex does.+> And it depends on the object directory layout, which has changed between+> versions. So supporting old versions in this code would complicate it+> quite a lot. I don't want to go there. --[[Joey]]++>>Requiring a version upgrade for unannex is fine. Yet, I see a problem when a git repo is broken; you are stuck without being able to uninit. In this case an uninit that does nothing but undo the symlinking would be useful. -- Richard++>>> As I said, version 2 of git-annex is still there for people who need+>>> it for whatever reason. [[done]] --[[Joey]]
@@ -0,0 +1,15 @@+* Create a git-annex repo where a lot of files live.+* Start an annex add.+* Kill it.+* git-annex uninit++Now, whatever files were annexed (ie: moved to .git/annex/objects/) but not committed are lost as the .git/annex directory was deleted.++I know there are two conflicting issues here:++1. if there is legitimately unused data in .git/annex then that shouldn't be unannexed+2. the above case where some files were annexed but not committed should be unannexed++Maybe uninit could check to see if all symlinks currently in the repo pointing to something under .git/annex/objects are committed. If not, commit them then uninit, or just de-annex them.++> Added a check for this, [[done]] --[[Joey]]
@@ -0,0 +1,15 @@+Running `git annex uninit` in a repo which has branch git-annex checked out will result in:++ error: Cannot delete the branch 'git-annex' which you are currently on.+ git-annex: git [Param "-D",Param "git-annex"] failed++and trying to checkout branch master afterwards results in:++ error: The following untracked working tree files would be overwritten by checkout:++Both of which is logical. The best thing would be if git-annex refused to run uninit while in branch git-annex.+++Richard++> [[done]] --[[Joey]]
@@ -0,0 +1,53 @@+What steps will reproduce the problem?+++ ```~/``` is tracked by git and git annex++ ```~/text/books/foo``` is annexed++ ```~/books``` is a symlink to ```text/books```++ from ```~/``` execute: ```git annex unlock books/foo```++ which returns immediately with zero exit code and does not unlock foo.++What is the expected output? What do you see instead?+++ I expect ```~/text/books/foo`` to be unlocked+++ I think ```git annex unlock``` should resolve the symlinks and realize that this is a tracked file.++What version of git-annex are you using? On what operating system?+++ 3.20121112 in debian unstable++Please provide any additional information below.+++ I can unlock foo if I provide the full path, eg:+from ```~/``` execute: ```git annex unlock text/books/foo```+++ Interestingly, the following _does_ successfully unlock the file: ```cd ~/books && git annex unlock foo```++ So it seems that symlinks in $PWD are being resolved, but not those in file paths passed as arguments.++Thank you, thank you!++ - Jason++jason@jasonwoof.com++> I'm afraid this is not a bug. Here's why: If you run "git mv books/foo+> books/bar", git will complain:+>+>> fatal: not under version control, source=books/foo, destination=books/bar+>+> So git-annex is just following git's lead (indeed, it's just running+> `git ls-files` to find files to act on), and git doesn't+> recognise this path as a file that's in git. --[[Joey]] +++ Also, I think ```git annex unlock``` should emit an error message if a file explicitly addressed on the commandline can not be acted upon.++> I'm beginning to think perhaps it should. Users seem to find the current+> behavior to be sometimes confusing.+> +> However, it's actually a very difficult change to make. Several commands+> have multiple seek stages that act on different types of files, so+> any warning printed by an earlier stage may be premature if a later+> stage comes along and deals with a file. --[[Joey]]++>> Figured out a non-invasive way to add that warning. [[done]] --[[Joey]]
@@ -0,0 +1,22 @@+What steps will reproduce the problem?++ try to unlock a file in a git annex checkout++What is the expected output? What do you see instead?++ % git annex unlock FILENAME+ unlock FILENAME (copying...) cp: illegal option -- -+ usage: cp [-R [-H | -L | -P]] [-fi | -n] [-apvX] source_file target_file+ cp [-R [-H | -L | -P]] [-fi | -n] [-apvX] source_file ... target_directory+ git-annex: copy failed!++ (should unlock the file)++What version of git-annex are you using? On what operating system?++ latest git annex osx build as of yesterday (12-11-03)+++> I've made the `cp` command be included in the OSX standalone build, +> so it will use the same one it's built with. So the next time we get+> an OSX build this will be fixed. [[done]] --[[Joey]]
@@ -0,0 +1,7 @@+Add a file (do not commit), then unlock it, and then lock it.+There is an error and the symlink gets deleted.++The file will still be staged in the index, and the file content is still+in the annex. --[[Joey]] ++[[done]]
@@ -0,0 +1,16 @@+I upgraded another one of my git-annex clones. The upgrade worked fine (i.e.+according to the manual) on two other clones before, but this time something is+different.++After 'git pull' and 'git annex upgrade', which took a long time and seemed to+have succeeded, there are no staged changes in git. Instead there are lots of+untracked directories in .git-annex. Aside from that, nothing seems to be+wrong.++At the time I had git-annex version 0.20110329 and I've been using the SHA1+backend since version 1.++> Yes, I agree with Jimmy, it's the same bug. So I'll be closing this one.+> Please keep us informed how the workaround committed to git-annex+> yesterday for the case insensativity issue works out. [[dup|done]]+> --[[Joey]]
@@ -0,0 +1,34 @@+## What steps will reproduce the problem?++After the assistant idles for a while, it queues many transfers to remotes configured annex-ignore=true++##What is the expected output? What do you see instead?++No attempts to upload to repos marked 'annex-ignore=true'++Instead I see many queued transfers to the remote 'origin'++[Screenshot](https://www.evernote.com/shard/s1/sh/ea0de76c-4b68-4266-b9f6-8a9c343997b6/72baab4a3ce73b0915b151829bbeaf75/res/8a8ab1fb-3173-47ea-875d-b0e320cb827b/skitch.png)++##What version of git-annex are you using? On what operating system?++ % > git annex version+ git-annex version: 4.20130315+ local repository version: 3+ default repository version: 3+ supported repository versions: 3 4+ upgrade supported from repository versions: 0 1 2+ build flags: Assistant Webapp Pairing Testsuite S3 WebDAV FsEvents XMPP DNS++Mac OSX 10.8.2 Build 12C3006++##Please provide any additional information below.++The remote in question:++ [remote "origin"]+ url = git@git.example.com:annex-home+ fetch = +refs/heads/*:refs/remotes/origin/*+ annex-ignore = true++> belived to be [[fixed|done]] --[[Joey]]
@@ -0,0 +1,28 @@+a special remote (encrypted rsync) that got copied to long ago (not sure when, there are old files that already have sizes in their unencrypted file names) seems to use the aa/bb/GPGHMACSHA1-- format instead of aaa/bbb/GPGHMACSHA1-. ``git annex fsck`` over such files produces very irritating output:++<code>+fsck L1100423.JPG (gpg) (checking …remote…...) +rsync: change_dir "…somewhere…/0a0/8cd/GPGHMACSHA1--91234b770b34eeff811d09c97ce94bb2398b3d72" failed: No such file or directory (2)++sent 8 bytes received 12 bytes 40.00 bytes/sec+total size is 0 speedup is 0.00+rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1536) [Receiver=3.0.9]++ rsync failed -- run git annex again to resume file transfer++GPGHMACSHA1--91234b770b34eeff811d09c97ce94bb2398b3d72+ 3922730 100% 623.81kB/s 0:00:06 (xfer#1, to-check=0/1)++sent 30 bytes received 3923328 bytes 523114.40 bytes/sec+total size is 3922730 speedup is 1.00+(checksum...) ok+</code>++(observed with debian's git-annex 3.20121017).++while this does output an "ok" at th end and a zero exit status, having such messages in an fsck is highly irritating.++i see two ways to enhance the situation:++* silence the "not found" error when the file is found in another location+* a way to rename the files in the remote (i guess the aaa/bbb part can be derived from the file name; in that case, that could even be done w/o network interaction).
@@ -0,0 +1,192 @@+### Please describe the problem.++Git Annex stumbles and does not transfer files with special characters...+++### What steps will reproduce the problem?++Added the file "Freddie_Mercury/Barcelona_[+video]/B00921KHNS_(disc_1)_04_-_Ensueño_(New_Orchestrated_Version).mp3" to Git Annex on my Galaxy Nexus (Android), which was committed successfully but not gettable.+++### What version of git-annex are you using? On what operating system?++Phone: 4.20130709-g339d1eo+Transfer Server: 3.20120406 (which it did not get to)+Desktop: 3.20120629+++### 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+++fozz@cobol:~/Phone $ git annex get+get Freddie_Mercury/Barcelona_[+video]/B00921KHNS_(disc_1)_04_-_Ensueño_(New_Orchestrated_Version).mp3 (not available) + Try making some of these repositories available:+ 1f368162-f02f-4794-af0c-1b5489e099b3 -- u0_a84@localhost:/sdcard/annex+failed+get Freddie_Mercury/Barcelona_[+video]/B00921KKSA_(disc_2)_05_-_Ensueño_(Monsterrat's_Live_Takes).mp3 (not available) + Try making some of these repositories available:+ 1f368162-f02f-4794-af0c-1b5489e099b3 -- u0_a84@localhost:/sdcard/annex+failed+get Freddie_Mercury/Barcelona_[+video]/B00921KMYW_(disc_3)_04_-_Ensueno_(Orchestral_Version).mp3 (not available) + Try making some of these repositories available:+ 1f368162-f02f-4794-af0c-1b5489e099b3 -- u0_a84@localhost:/sdcard/annex+failed+get Freddie_Mercury/Barcelona_[+video]/B00921KMYW_(disc_3)_04_-_Ensueño_(Orchestral_Version).mp3 (not available) + Try making some of these repositories available:+ 1f368162-f02f-4794-af0c-1b5489e099b3 -- u0_a84@localhost:/sdcard/annex+failed+git-annex: get: 4 failed++===============++fozz@cobol:~/Phone $ git annex whereis Freddie_Mercury/+whereis Freddie_Mercury/Barcelona_[+video]/B00921KGRK_(disc_1)_01_-_Barcelona_(New_Orchestrated_Version.mp3 (3 copies) + 1f368162-f02f-4794-af0c-1b5489e099b3 -- u0_a84@localhost:/sdcard/annex+ 53f03d06-f1e3-11e2-8519-1b41c09abecd -- here (Cobol: Phone)+ cb6240e0-f1df-11e2-836a-7f4323e50c49 -- origin (Markdown: Phone)+ok+whereis Freddie_Mercury/Barcelona_[+video]/B00921KH5G_(disc_1)_02_-_La_Japonaise_(New_Orchestrated_Vers.mp3 (3 copies) + 1f368162-f02f-4794-af0c-1b5489e099b3 -- u0_a84@localhost:/sdcard/annex+ 53f03d06-f1e3-11e2-8519-1b41c09abecd -- here (Cobol: Phone)+ cb6240e0-f1df-11e2-836a-7f4323e50c49 -- origin (Markdown: Phone)+ok+whereis Freddie_Mercury/Barcelona_[+video]/B00921KHD8_(disc_1)_03_-_The_Fallen_Priest_(New_Orchestrated.mp3 (3 copies) + 1f368162-f02f-4794-af0c-1b5489e099b3 -- u0_a84@localhost:/sdcard/annex+ 53f03d06-f1e3-11e2-8519-1b41c09abecd -- here (Cobol: Phone)+ cb6240e0-f1df-11e2-836a-7f4323e50c49 -- origin (Markdown: Phone)+ok+whereis Freddie_Mercury/Barcelona_[+video]/B00921KHNS_(disc_1)_04_-_Ensueño_(New_Orchestrated_Version).mp3 (1 copy) + 1f368162-f02f-4794-af0c-1b5489e099b3 -- u0_a84@localhost:/sdcard/annex+ok+whereis Freddie_Mercury/Barcelona_[+video]/B00921KHY2_(disc_1)_05_-_The_Golden_Boy_(New_Orchestrated_Ve.mp3 (3 copies) + 1f368162-f02f-4794-af0c-1b5489e099b3 -- u0_a84@localhost:/sdcard/annex+ 53f03d06-f1e3-11e2-8519-1b41c09abecd -- here (Cobol: Phone)+ cb6240e0-f1df-11e2-836a-7f4323e50c49 -- origin (Markdown: Phone)+ok+whereis Freddie_Mercury/Barcelona_[+video]/B00921KI9G_(disc_1)_06_-_Guide_Me_Home_(New_Orchestrated_Ver.mp3 (3 copies) + 1f368162-f02f-4794-af0c-1b5489e099b3 -- u0_a84@localhost:/sdcard/annex+ 53f03d06-f1e3-11e2-8519-1b41c09abecd -- here (Cobol: Phone)+ cb6240e0-f1df-11e2-836a-7f4323e50c49 -- origin (Markdown: Phone)+ok+whereis Freddie_Mercury/Barcelona_[+video]/B00921KIIW_(disc_1)_07_-_How_Can_I_Go_On_(New_Orchestrated_V.mp3 (3 copies) + 1f368162-f02f-4794-af0c-1b5489e099b3 -- u0_a84@localhost:/sdcard/annex+ 53f03d06-f1e3-11e2-8519-1b41c09abecd -- here (Cobol: Phone)+ cb6240e0-f1df-11e2-836a-7f4323e50c49 -- origin (Markdown: Phone)+ok+whereis Freddie_Mercury/Barcelona_[+video]/B00921KITG_(disc_1)_08_-_Exercises_In_Free_Love_(New_Orchest.mp3 (3 copies) + 1f368162-f02f-4794-af0c-1b5489e099b3 -- u0_a84@localhost:/sdcard/annex+ 53f03d06-f1e3-11e2-8519-1b41c09abecd -- here (Cobol: Phone)+ cb6240e0-f1df-11e2-836a-7f4323e50c49 -- origin (Markdown: Phone)+ok+whereis Freddie_Mercury/Barcelona_[+video]/B00921KJ22_(disc_1)_09_-_Overture_Piccante_(New_Orchestrated.mp3 (3 copies) + 1f368162-f02f-4794-af0c-1b5489e099b3 -- u0_a84@localhost:/sdcard/annex+ 53f03d06-f1e3-11e2-8519-1b41c09abecd -- here (Cobol: Phone)+ cb6240e0-f1df-11e2-836a-7f4323e50c49 -- origin (Markdown: Phone)+ok+whereis Freddie_Mercury/Barcelona_[+video]/B00921KJB8_(disc_1)_10_-_How_Can_I_Go_On_(New_Orchestrated_V.mp3 (3 copies) + 1f368162-f02f-4794-af0c-1b5489e099b3 -- u0_a84@localhost:/sdcard/annex+ 53f03d06-f1e3-11e2-8519-1b41c09abecd -- here (Cobol: Phone)+ cb6240e0-f1df-11e2-836a-7f4323e50c49 -- origin (Markdown: Phone)+ok+whereis Freddie_Mercury/Barcelona_[+video]/B00921KJMW_(disc_2)_01_-_Exercises_In_Free_Love_(1987_B-Side.mp3 (3 copies) + 1f368162-f02f-4794-af0c-1b5489e099b3 -- u0_a84@localhost:/sdcard/annex+ 53f03d06-f1e3-11e2-8519-1b41c09abecd -- here (Cobol: Phone)+ cb6240e0-f1df-11e2-836a-7f4323e50c49 -- origin (Markdown: Phone)+ok+whereis Freddie_Mercury/Barcelona_[+video]/B00921KJVI_(disc_2)_02_-_Barcelona_(Early_Version__Freddie's.mp3 (3 copies) + 1f368162-f02f-4794-af0c-1b5489e099b3 -- u0_a84@localhost:/sdcard/annex+ 53f03d06-f1e3-11e2-8519-1b41c09abecd -- here (Cobol: Phone)+ cb6240e0-f1df-11e2-836a-7f4323e50c49 -- origin (Markdown: Phone)+ok+whereis Freddie_Mercury/Barcelona_[+video]/B00921KK5I_(disc_2)_03_-_La_Japonaise_(Early_Version__Freddi.mp3 (3 copies) + 1f368162-f02f-4794-af0c-1b5489e099b3 -- u0_a84@localhost:/sdcard/annex+ 53f03d06-f1e3-11e2-8519-1b41c09abecd -- here (Cobol: Phone)+ cb6240e0-f1df-11e2-836a-7f4323e50c49 -- origin (Markdown: Phone)+ok+whereis Freddie_Mercury/Barcelona_[+video]/B00921KKHQ_(disc_2)_04_-_Rachmaninov's_Revenge_(The_Fallen_P.mp3 (3 copies) + 1f368162-f02f-4794-af0c-1b5489e099b3 -- u0_a84@localhost:/sdcard/annex+ 53f03d06-f1e3-11e2-8519-1b41c09abecd -- here (Cobol: Phone)+ cb6240e0-f1df-11e2-836a-7f4323e50c49 -- origin (Markdown: Phone)+ok+whereis Freddie_Mercury/Barcelona_[+video]/B00921KKSA_(disc_2)_05_-_Ensueño_(Monsterrat's_Live_Takes).mp3 (1 copy) + 1f368162-f02f-4794-af0c-1b5489e099b3 -- u0_a84@localhost:/sdcard/annex+ok+whereis Freddie_Mercury/Barcelona_[+video]/B00921KL2U_(disc_2)_06_-_The_Golden_Boy_(Early_Version__Fred.mp3 (3 copies) + 1f368162-f02f-4794-af0c-1b5489e099b3 -- u0_a84@localhost:/sdcard/annex+ 53f03d06-f1e3-11e2-8519-1b41c09abecd -- here (Cobol: Phone)+ cb6240e0-f1df-11e2-836a-7f4323e50c49 -- origin (Markdown: Phone)+ok+whereis Freddie_Mercury/Barcelona_[+video]/B00921KLBQ_(disc_2)_07_-_Guide_Me_Home_(Alternative_Version).mp3 (3 copies) + 1f368162-f02f-4794-af0c-1b5489e099b3 -- u0_a84@localhost:/sdcard/annex+ 53f03d06-f1e3-11e2-8519-1b41c09abecd -- here (Cobol: Phone)+ cb6240e0-f1df-11e2-836a-7f4323e50c49 -- origin (Markdown: Phone)+ok+whereis Freddie_Mercury/Barcelona_[+video]/B00921KLJI_(disc_2)_08_-_How_Can_I_Go_On_(Alternative_Versio.mp3 (3 copies) + 1f368162-f02f-4794-af0c-1b5489e099b3 -- u0_a84@localhost:/sdcard/annex+ 53f03d06-f1e3-11e2-8519-1b41c09abecd -- here (Cobol: Phone)+ cb6240e0-f1df-11e2-836a-7f4323e50c49 -- origin (Markdown: Phone)+ok+whereis Freddie_Mercury/Barcelona_[+video]/B00921KLUC_(disc_2)_09_-_How_Can_I_Go_On_(Alternative_Piano_.mp3 (3 copies) + 1f368162-f02f-4794-af0c-1b5489e099b3 -- u0_a84@localhost:/sdcard/annex+ 53f03d06-f1e3-11e2-8519-1b41c09abecd -- here (Cobol: Phone)+ cb6240e0-f1df-11e2-836a-7f4323e50c49 -- origin (Markdown: Phone)+ok+whereis Freddie_Mercury/Barcelona_[+video]/B00921KM3I_(disc_3)_01_-_Barcelona_(Orchestral_Version).mp3 (3 copies) + 1f368162-f02f-4794-af0c-1b5489e099b3 -- u0_a84@localhost:/sdcard/annex+ 53f03d06-f1e3-11e2-8519-1b41c09abecd -- here (Cobol: Phone)+ cb6240e0-f1df-11e2-836a-7f4323e50c49 -- origin (Markdown: Phone)+ok+whereis Freddie_Mercury/Barcelona_[+video]/B00921KMBU_(disc_3)_02_-_La_Japonaise_(Orchestral_Version).mp3 (3 copies) + 1f368162-f02f-4794-af0c-1b5489e099b3 -- u0_a84@localhost:/sdcard/annex+ 53f03d06-f1e3-11e2-8519-1b41c09abecd -- here (Cobol: Phone)+ cb6240e0-f1df-11e2-836a-7f4323e50c49 -- origin (Markdown: Phone)+ok+whereis Freddie_Mercury/Barcelona_[+video]/B00921KMM4_(disc_3)_03_-_The_Fallen_Priest_(Orchestral_Versi.mp3 (3 copies) + 1f368162-f02f-4794-af0c-1b5489e099b3 -- u0_a84@localhost:/sdcard/annex+ 53f03d06-f1e3-11e2-8519-1b41c09abecd -- here (Cobol: Phone)+ cb6240e0-f1df-11e2-836a-7f4323e50c49 -- origin (Markdown: Phone)+ok+whereis Freddie_Mercury/Barcelona_[+video]/B00921KMYW_(disc_3)_04_-_Ensueno_(Orchestral_Version).mp3 (1 copy) + 1f368162-f02f-4794-af0c-1b5489e099b3 -- u0_a84@localhost:/sdcard/annex+ok+whereis Freddie_Mercury/Barcelona_[+video]/B00921KMYW_(disc_3)_04_-_Ensueño_(Orchestral_Version).mp3 (1 copy) + 1f368162-f02f-4794-af0c-1b5489e099b3 -- u0_a84@localhost:/sdcard/annex+ok+whereis Freddie_Mercury/Barcelona_[+video]/B00921KNAK_(disc_3)_05_-_The_Golden_Boy_(Orchestral_Version).mp3 (3 copies) + 1f368162-f02f-4794-af0c-1b5489e099b3 -- u0_a84@localhost:/sdcard/annex+ 53f03d06-f1e3-11e2-8519-1b41c09abecd -- here (Cobol: Phone)+ cb6240e0-f1df-11e2-836a-7f4323e50c49 -- origin (Markdown: Phone)+ok+whereis Freddie_Mercury/Barcelona_[+video]/B00921KNUA_(disc_3)_06_-_Guide_Me_Home_(Orchestral_Version).mp3 (3 copies) + 1f368162-f02f-4794-af0c-1b5489e099b3 -- u0_a84@localhost:/sdcard/annex+ 53f03d06-f1e3-11e2-8519-1b41c09abecd -- here (Cobol: Phone)+ cb6240e0-f1df-11e2-836a-7f4323e50c49 -- origin (Markdown: Phone)+ok+whereis Freddie_Mercury/Barcelona_[+video]/B00921KOVI_(disc_3)_07_-_How_Can_I_Go_On_(Orchestral_Version.mp3 (3 copies) + 1f368162-f02f-4794-af0c-1b5489e099b3 -- u0_a84@localhost:/sdcard/annex+ 53f03d06-f1e3-11e2-8519-1b41c09abecd -- here (Cobol: Phone)+ cb6240e0-f1df-11e2-836a-7f4323e50c49 -- origin (Markdown: Phone)+ok+whereis Freddie_Mercury/Barcelona_[+video]/B00921KPP8_(disc_3)_08_-_Exercises_In_Free_Love_(Orchestral_.mp3 (3 copies) + 1f368162-f02f-4794-af0c-1b5489e099b3 -- u0_a84@localhost:/sdcard/annex+ 53f03d06-f1e3-11e2-8519-1b41c09abecd -- here (Cobol: Phone)+ cb6240e0-f1df-11e2-836a-7f4323e50c49 -- origin (Markdown: Phone)+ok+whereis Freddie_Mercury/Barcelona_[+video]/B00921KQJ8_(disc_3)_09_-_Overture_Piccante_(Orchestral_Versi.mp3 (3 copies) + 1f368162-f02f-4794-af0c-1b5489e099b3 -- u0_a84@localhost:/sdcard/annex+ 53f03d06-f1e3-11e2-8519-1b41c09abecd -- here (Cobol: Phone)+ cb6240e0-f1df-11e2-836a-7f4323e50c49 -- origin (Markdown: Phone)+ok+++# End of transcript or log.+"""]]++> We seem to have reached a point of confusion, lack of information,+> and/or diminishing returns with this bug report. I have fixed+> it as best I can. If you have any problems, please file a new bug report+> with as complete information as possible. [[done]] --[[Joey]]
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawnRai_qFYPVvEgC6i1nlM1bh-C__jbhqS0"+ nickname="Matthew"+ subject="Ooops"+ date="2013-07-26T21:28:46Z"+ content="""+Hi Joey,++I started replicating it today but managed to make annex a directory structure I did not mean to through my own silly fault and it's taking ages to unannex, I'll have another go over the weekend, this time with not so fat fingers!+"""]]
@@ -0,0 +1,142 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawnRai_qFYPVvEgC6i1nlM1bh-C__jbhqS0"+ nickname="Matthew"+ subject="Replicated, I think"+ date="2013-07-27T10:02:32Z"+ content="""+I think I have it replicated, I did not do _exactly_ the same thing, no renaming of the tilde-n file but I still got the ControlPath error.++ # On phone - Copy folder into Git Annex... wait till done+ # On Server with new Git Annex: git annex sync+ fozz@markdown:~/tmp/zzz$ git annex get .+ get Freddie_Mercury/Barcelona_[+video]/B00921KGRK_(disc_1)_01_-_Barcelona_(New_Orchestrated_Version.mp3 (from origin...) ok+ get Freddie_Mercury/Barcelona_[+video]/B00921KH5G_(disc_1)_02_-_La_Japonaise_(New_Orchestrated_Vers.mp3 (from origin...) ok+ get Freddie_Mercury/Barcelona_[+video]/B00921KHD8_(disc_1)_03_-_The_Fallen_Priest_(New_Orchestrated.mp3 (from origin...) ok+ get Freddie_Mercury/Barcelona_[+video]/B00921KHNS_(disc_1)_04_-_Ensueño_(New_Orchestrated_Version).mp3 (not available)+ Try making some of these repositories available:+ bc0525c4-cf9e-45da-a8e1-19003dee1dcb -- u0_a84@localhost:/sdcard/annex+ failed+ get Freddie_Mercury/Barcelona_[+video]/B00921KHY2_(disc_1)_05_-_The_Golden_Boy_(New_Orchestrated_Ve.mp3 (from origin...) ok+ get Freddie_Mercury/Barcelona_[+video]/B00921KI9G_(disc_1)_06_-_Guide_Me_Home_(New_Orchestrated_Ver.mp3 (from origin...) ok+ get Freddie_Mercury/Barcelona_[+video]/B00921KIIW_(disc_1)_07_-_How_Can_I_Go_On_(New_Orchestrated_V.mp3 ^[[A^[[A^[[A^[[A^[[A^[[A(from origin...) ^[[A^[[A^[[A^[[A^[[A^[[A^[[A^[[A^[[A^[[A^[[A^[[A^[[A^[[A^[[A^[[A^[[A^[[A^[[A^[[A^[[A^[[A^[[A^[[A^[[A^[[A^[[A^[[A^[[A^[[Aok+ get Freddie_Mercury/Barcelona_[+video]/B00921KITG_(disc_1)_08_-_Exercises_In_Free_Love_(New_Orchest.mp3 ^[[A^[[A^[[A^[[A^[[A^[[A(from origin...) ^[[A^[[A^[[A^[[A^[[A^[[Aok+ get Freddie_Mercury/Barcelona_[+video]/B00921KJ22_(disc_1)_09_-_Overture_Piccante_(New_Orchestrated.mp3 ^C+ fozz@markdown:~/tmp/zzz$ git annex get .+ get Freddie_Mercury/Barcelona_[+video]/B00921KHNS_(disc_1)_04_-_Ensueño_(New_Orchestrated_Version).mp3 (not available)+ Try making some of these repositories available:+ bc0525c4-cf9e-45da-a8e1-19003dee1dcb -- u0_a84@localhost:/sdcard/annex+ failed+ get Freddie_Mercury/Barcelona_[+video]/B00921KJ22_(disc_1)_09_-_Overture_Piccante_(New_Orchestrated.mp3 (from origin...) ok+ get Freddie_Mercury/Barcelona_[+video]/B00921KJB8_(disc_1)_10_-_How_Can_I_Go_On_(New_Orchestrated_V.mp3 (from origin...) ok+ get Freddie_Mercury/Barcelona_[+video]/B00921KJMW_(disc_2)_01_-_Exercises_In_Free_Love_(1987_B-Side.mp3 (from origin...) ok+ get Freddie_Mercury/Barcelona_[+video]/B00921KJVI_(disc_2)_02_-_Barcelona_(Early_Version__Freddie's.mp3 (from origin...) ok+ get Freddie_Mercury/Barcelona_[+video]/B00921KK5I_(disc_2)_03_-_La_Japonaise_(Early_Version__Freddi.mp3 (from origin...) ok+ get Freddie_Mercury/Barcelona_[+video]/B00921KKHQ_(disc_2)_04_-_Rachmaninov's_Revenge_(The_Fallen_P.mp3 (from origin...) ok+ get Freddie_Mercury/Barcelona_[+video]/B00921KKSA_(disc_2)_05_-_Ensueño_(Monsterrat's_Live_Takes).mp3 (not available)+ Try making some of these repositories available:+ bc0525c4-cf9e-45da-a8e1-19003dee1dcb -- u0_a84@localhost:/sdcard/annex+ failed+ get Freddie_Mercury/Barcelona_[+video]/B00921KL2U_(disc_2)_06_-_The_Golden_Boy_(Early_Version__Fred.mp3 (from origin...) ok+ get Freddie_Mercury/Barcelona_[+video]/B00921KLBQ_(disc_2)_07_-_Guide_Me_Home_(Alternative_Version).mp3 (from origin...) ok+ get Freddie_Mercury/Barcelona_[+video]/B00921KLJI_(disc_2)_08_-_How_Can_I_Go_On_(Alternative_Versio.mp3 (from origin...) ok+ get Freddie_Mercury/Barcelona_[+video]/B00921KLUC_(disc_2)_09_-_How_Can_I_Go_On_(Alternative_Piano_.mp3 (from origin...) ok+ get Freddie_Mercury/Barcelona_[+video]/B00921KM3I_(disc_3)_01_-_Barcelona_(Orchestral_Version).mp3 (from origin...) ok+ get Freddie_Mercury/Barcelona_[+video]/B00921KMBU_(disc_3)_02_-_La_Japonaise_(Orchestral_Version).mp3 (from origin...) ok+ get Freddie_Mercury/Barcelona_[+video]/B00921KMM4_(disc_3)_03_-_The_Fallen_Priest_(Orchestral_Versi.mp3 (from origin...) ok+ get Freddie_Mercury/Barcelona_[+video]/B00921KMYW_(disc_3)_04_-_Ensueño_(Orchestral_Version).mp3 (not available)+ Try making some of these repositories available:+ bc0525c4-cf9e-45da-a8e1-19003dee1dcb -- u0_a84@localhost:/sdcard/annex+ failed+ get Freddie_Mercury/Barcelona_[+video]/B00921KNAK_(disc_3)_05_-_The_Golden_Boy_(Orchestral_Version).mp3 (from origin...) ok+ get Freddie_Mercury/Barcelona_[+video]/B00921KNUA_(disc_3)_06_-_Guide_Me_Home_(Orchestral_Version).mp3 (from origin...) ok+ get Freddie_Mercury/Barcelona_[+video]/B00921KOVI_(disc_3)_07_-_How_Can_I_Go_On_(Orchestral_Version.mp3 (from origin...) ok+ get Freddie_Mercury/Barcelona_[+video]/B00921KPP8_(disc_3)_08_-_Exercises_In_Free_Love_(Orchestral_.mp3 (from origin...) ok+ get Freddie_Mercury/Barcelona_[+video]/B00921KQJ8_(disc_3)_09_-_Overture_Piccante_(Orchestral_Versi.mp3 (from origin...) ok+ (Recording state in git...)+ git-annex: get: 3 failed+ + fozz@markdown:~/tmp/zzz$ git annex whereis Freddie_Mercury/Barcelona_\[+video\]/B00921KMYW_\(disc_3\)_04_-_Ensueño_\(Orchestral_Version\).mp3 + whereis Freddie_Mercury/Barcelona_[+video]/B00921KMYW_(disc_3)_04_-_Ensueño_(Orchestral_Version).mp3 (1 copy) + bc0525c4-cf9e-45da-a8e1-19003dee1dcb -- u0_a84@localhost:/sdcard/annex+ ok+ + # On phone+ Falling back to hardcoded app location; cannot find expected files in /data/app-lib+ git annex webapp+ u0_a84@android:/sdcard/git-annex.home $ git annex webapp+ + Detected a crippled filesystem.+ + Enabling direct mode.+ fozz@markdown.lang.speechmarks.com's password:+ fozz@markdown.lang.speechmarks.com's password:+ ^Z[1] + Stopped git annex webapp+ u0_a84@android:/sdcard/git-annex.home $ bg+ [1] git annex webapp+ u0_a84@android:/sdcard/git-annex.home $ cd ../annex/+ u0_a84@android:/sdcard/annex $ ls+ Freddie_Mercury+ u0_a84@android:/sdcard/annex $ git remote -v+ markdown.lang.speechmarks.com_phoneannex ssh://fozz@git-annex-markdown.lang.speechmarks.com-fozz_phone.2Dannex/~/phone-annex/ (fetch)+ markdown.lang.speechmarks.com_phoneannex ssh://fozz@git-annex-markdown.lang.speechmarks.com-fozz_phone.2Dannex/~/phone-annex/ (push)+ u0_a84@android:/sdcard/annex $ git annex copy . --to markdown.lang.speechmarks.com_phoneannex+ copy Freddie_Mercury/Barcelona_[+video]/B00921KGRK_(disc_1)_01_-_Barcelona_(New_Orchestrated_Version.mp3 (checking markdown.lang.speechmarks.com_phoneannex...) ControlPath \"/data/data/ga.androidterm/tmp/fozz@git-annex-markdown.lang.speechmarks.com-fozz_phone.2Dannex.IdWwlXHtSsjVUMcq\" too long for Unix domain socket+ ok+ copy Freddie_Mercury/Barcelona_[+video]/B00921KH5G_(disc_1)_02_-_La_Japonaise_(New_Orchestrated_Vers.mp3 (checking markdown.lang.speechmarks.com_phoneannex...) ControlPath \"/data/data/ga.androidterm/tmp/fozz@git-annex-markdown.lang.speechmarks.com-fozz_phone.2Dannex.WisPICyIHiMGEO3k\" too long for Unix domain socket+ ok+ copy Freddie_Mercury/Barcelona_[+video]/B00921KHD8_(disc_1)_03_-_The_Fallen_Priest_(New_Orchestrated.mp3 (checking markdown.lang.speechmarks.com_phoneannex...) ControlPath \"/data/data/ga.androidterm/tmp/fozz@git-annex-markdown.lang.speechmarks.com-fozz_phone.2Dannex.hYyDKddvBHgjW4AI\" too long for Unix domain socket+ ok+ copy Freddie_Mercury/Barcelona_[+video]/B00921KHNS_(disc_1)_04_-_Ensueo_(New_Orchestrated_Version).mp3 (checking markdown.lang.speechmarks.com_phoneannex...) ControlPath \"/data/data/ga.androidterm/tmp/fozz@git-annex-markdown.lang.speechmarks.com-fozz_phone.2Dannex.PR2s7Btep0Vklpr1\" too long for Unix domain socket+ ok+ copy Freddie_Mercury/Barcelona_[+video]/B00921KHY2_(disc_1)_05_-_The_Golden_Boy_(New_Orchestrated_Ve.mp3 (checking markdown.lang.speechmarks.com_phoneannex...) ControlPath \"/data/data/ga.androidterm/tmp/fozz@git-annex-markdown.lang.speechmarks.com-fozz_phone.2Dannex.GuiE6O9sVgvAsPjv\" too long for Unix domain socket+ ok+ copy Freddie_Mercury/Barcelona_[+video]/B00921KI9G_(disc_1)_06_-_Guide_Me_Home_(New_Orchestrated_Ver.mp3 (checking markdown.lang.speechmarks.com_phoneannex...) ControlPath \"/data/data/ga.androidterm/tmp/fozz@git-annex-markdown.lang.speechmarks.com-fozz_phone.2Dannex.MNE7Nrd4rTe59BpR\" too long for Unix domain socket+ ok+ copy Freddie_Mercury/Barcelona_[+video]/B00921KIIW_(disc_1)_07_-_How_Can_I_Go_On_(New_Orchestrated_V.mp3 (checking markdown.lang.speechmarks.com_phoneannex...) ControlPath \"/data/data/ga.androidterm/tmp/fozz@git-annex-markdown.lang.speechmarks.com-fozz_phone.2Dannex.MtXCKPHds4ma0iPl\" too long for Unix domain socket+ ok+ copy Freddie_Mercury/Barcelona_[+video]/B00921KITG_(disc_1)_08_-_Exercises_In_Free_Love_(New_Orchest.mp3 (checking markdown.lang.speechmarks.com_phoneannex...) ControlPath \"/data/data/ga.androidterm/tmp/fozz@git-annex-markdown.lang.speechmarks.com-fozz_phone.2Dannex.6iovvzKR6HE4nZwz\" too long for Unix domain socket+ ok+ copy Freddie_Mercury/Barcelona_[+video]/B00921KJ22_(disc_1)_09_-_Overture_Piccante_(New_Orchestrated.mp3 (checking markdown.lang.speechmarks.com_phoneannex...) ControlPath \"/data/data/ga.androidterm/tmp/fozz@git-annex-markdown.lang.speechmarks.com-fozz_phone.2Dannex.wZy825TDcYvHhDUx\" too long for Unix domain socket+ ok+ copy Freddie_Mercury/Barcelona_[+video]/B00921KJB8_(disc_1)_10_-_How_Can_I_Go_On_(New_Orchestrated_V.mp3 (checking markdown.lang.speechmarks.com_phoneannex...) ControlPath \"/data/data/ga.androidterm/tmp/fozz@git-annex-markdown.lang.speechmarks.com-fozz_phone.2Dannex.RQLLAcX2MGpLvJC5\" too long for Unix domain socket+ ok+ copy Freddie_Mercury/Barcelona_[+video]/B00921KJMW_(disc_2)_01_-_Exercises_In_Free_Love_(1987_B-Side.mp3 (checking markdown.lang.speechmarks.com_phoneannex...) ControlPath \"/data/data/ga.androidterm/tmp/fozz@git-annex-markdown.lang.speechmarks.com-fozz_phone.2Dannex.kiQQXvKBLNSP3cRO\" too long for Unix domain socket+ ok+ copy Freddie_Mercury/Barcelona_[+video]/B00921KJVI_(disc_2)_02_-_Barcelona_(Early_Version__Freddie's.mp3 (checking markdown.lang.speechmarks.com_phoneannex...) ControlPath \"/data/data/ga.androidterm/tmp/fozz@git-annex-markdown.lang.speechmarks.com-fozz_phone.2Dannex.CIdY4uFDFCIboOpG\" too long for Unix domain socket+ ok+ copy Freddie_Mercury/Barcelona_[+video]/B00921KK5I_(disc_2)_03_-_La_Japonaise_(Early_Version__Freddi.mp3 (checking markdown.lang.speechmarks.com_phoneannex...) ControlPath \"/data/data/ga.androidterm/tmp/fozz@git-annex-markdown.lang.speechmarks.com-fozz_phone.2Dannex.sza5nEOnJ4qnh6op\" too long for Unix domain socket+ ok+ copy Freddie_Mercury/Barcelona_[+video]/B00921KKHQ_(disc_2)_04_-_Rachmaninov's_Revenge_(The_Fallen_P.mp3 (checking markdown.lang.speechmarks.com_phoneannex...) ControlPath \"/data/data/ga.androidterm/tmp/fozz@git-annex-markdown.lang.speechmarks.com-fozz_phone.2Dannex.PXT6QfTHojjPvlBM\" too long for Unix domain socket+ ok+ copy Freddie_Mercury/Barcelona_[+video]/B00921KKSA_(disc_2)_05_-_Ensueo_(Monsterrat's_Live_Takes).mp3 (checking markdown.lang.speechmarks.com_phoneannex...) ControlPath \"/data/data/ga.androidterm/tmp/fozz@git-annex-markdown.lang.speechmarks.com-fozz_phone.2Dannex.LaHS26WonwTUqBDO\" too long for Unix domain socket+ ok+ copy Freddie_Mercury/Barcelona_[+video]/B00921KL2U_(disc_2)_06_-_The_Golden_Boy_(Early_Version__Fred.mp3 (checking markdown.lang.speechmarks.com_phoneannex...) ControlPath \"/data/data/ga.androidterm/tmp/fozz@git-annex-markdown.lang.speechmarks.com-fozz_phone.2Dannex.rw9hP3fjehIAJc1P\" too long for Unix domain socket+ ok+ copy Freddie_Mercury/Barcelona_[+video]/B00921KLBQ_(disc_2)_07_-_Guide_Me_Home_(Alternative_Version).mp3 (checking markdown.lang.speechmarks.com_phoneannex...) ControlPath \"/data/data/ga.androidterm/tmp/fozz@git-annex-markdown.lang.speechmarks.com-fozz_phone.2Dannex.aJOWNwtRBDG6pecN\" too long for Unix domain socket+ ok+ copy Freddie_Mercury/Barcelona_[+video]/B00921KLJI_(disc_2)_08_-_How_Can_I_Go_On_(Alternative_Versio.mp3 (checking markdown.lang.speechmarks.com_phoneannex...) ControlPath \"/data/data/ga.androidterm/tmp/fozz@git-annex-markdown.lang.speechmarks.com-fozz_phone.2Dannex.fOFCaugrRAzzHAMZ\" too long for Unix domain socket+ ok+ copy Freddie_Mercury/Barcelona_[+video]/B00921KLUC_(disc_2)_09_-_How_Can_I_Go_On_(Alternative_Piano_.mp3 (checking markdown.lang.speechmarks.com_phoneannex...) ControlPath \"/data/data/ga.androidterm/tmp/fozz@git-annex-markdown.lang.speechmarks.com-fozz_phone.2Dannex.onG8CR4YP9x5c3ZK\" too long for Unix domain socket+ ok+ copy Freddie_Mercury/Barcelona_[+video]/B00921KM3I_(disc_3)_01_-_Barcelona_(Orchestral_Version).mp3 (checking markdown.lang.speechmarks.com_phoneannex...) ControlPath \"/data/data/ga.androidterm/tmp/fozz@git-annex-markdown.lang.speechmarks.com-fozz_phone.2Dannex.KgOqB8Rg1ZZI1fzP\" too long for Unix domain socket+ ok+ copy Freddie_Mercury/Barcelona_[+video]/B00921KMBU_(disc_3)_02_-_La_Japonaise_(Orchestral_Version).mp3 (checking markdown.lang.speechmarks.com_phoneannex...) ControlPath \"/data/data/ga.androidterm/tmp/fozz@git-annex-markdown.lang.speechmarks.com-fozz_phone.2Dannex.xN1FqoX79hSxwQS7\" too long for Unix domain socket+ ok+ copy Freddie_Mercury/Barcelona_[+video]/B00921KMM4_(disc_3)_03_-_The_Fallen_Priest_(Orchestral_Versi.mp3 (checking markdown.lang.speechmarks.com_phoneannex...) ControlPath \"/data/data/ga.androidterm/tmp/fozz@git-annex-markdown.lang.speechmarks.com-fozz_phone.2Dannex.YpZgAo1LVawkOIBd\" too long for Unix domain socket+ ok+ copy Freddie_Mercury/Barcelona_[+video]/B00921KMYW_(disc_3)_04_-_Ensueo_(Orchestral_Version).mp3 (checking markdown.lang.speechmarks.com_phoneannex...) ControlPath \"/data/data/ga.androidterm/tmp/fozz@git-annex-markdown.lang.speechmarks.com-fozz_phone.2Dannex.TDvJl5gPqOFTbqgF\" too long for Unix domain socket+ ok+ copy Freddie_Mercury/Barcelona_[+video]/B00921KNAK_(disc_3)_05_-_The_Golden_Boy_(Orchestral_Version).mp3 (checking markdown.lang.speechmarks.com_phoneannex...) ControlPath \"/data/data/ga.androidterm/tmp/fozz@git-annex-markdown.lang.speechmarks.com-fozz_phone.2Dannex.CYBfRJuMZTYUgTnN\" too long for Unix domain socket+ ok+ copy Freddie_Mercury/Barcelona_[+video]/B00921KNUA_(disc_3)_06_-_Guide_Me_Home_(Orchestral_Version).mp3 (checking markdown.lang.speechmarks.com_phoneannex...) ControlPath \"/data/data/ga.androidterm/tmp/fozz@git-annex-markdown.lang.speechmarks.com-fozz_phone.2Dannex.VjyVTH1bRjeRl7fE\" too long for Unix domain socket+ ok+ copy Freddie_Mercury/Barcelona_[+video]/B00921KOVI_(disc_3)_07_-_How_Can_I_Go_On_(Orchestral_Version.mp3 (checking markdown.lang.speechmarks.com_phoneannex...) ControlPath \"/data/data/ga.androidterm/tmp/fozz@git-annex-markdown.lang.speechmarks.com-fozz_phone.2Dannex.SfA8ZMsoaea1JqZm\" too long for Unix domain socket+ ok+ copy Freddie_Mercury/Barcelona_[+video]/B00921KPP8_(disc_3)_08_-_Exercises_In_Free_Love_(Orchestral_.mp3 (checking markdown.lang.speechmarks.com_phoneannex...) ControlPath \"/data/data/ga.androidterm/tmp/fozz@git-annex-markdown.lang.speechmarks.com-fozz_phone.2Dannex.uYsVLhxvYZl1F7Dj\" too long for Unix domain socket+ ok+ copy Freddie_Mercury/Barcelona_[+video]/B00921KQJ8_(disc_3)_09_-_Overture_Piccante_(Orchestral_Versi.mp3 (checking markdown.lang.speechmarks.com_phoneannex...) ControlPath \"/data/data/ga.androidterm/tmp/fozz@git-annex-markdown.lang.speechmarks.com-fozz_phone.2Dannex.NRAFY6O124W6tAdG\" too long for Unix domain socket+ ok+ (Recording state in git...)+ u0_a84@android:/sdcard/annex $++"""]]
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="4.152.246.110"+ subject="comment 12"+ date="2013-07-27T17:46:11Z"+ content="""+Ok, I think if you upgrade to the current build for Android, you'll find that the problem goes away. I put in a fix several days ago that makes it use much shorter controlpaths.++The question remains why it ever used a path of \"/data/data/ga.androidterm/tmp/fozz@git-annex-markdown.lang.speechmarks.com-fozz_phone.2Dannex.IdWwlXHtSsjVUMcq\". This is 110 bytes; the code checks for a path of longer than 99 bytes. It should have disabled ssh connection caching when it was unable to construct a short enough path.+"""]]
@@ -0,0 +1,41 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="4.152.246.110"+ subject="comment 13"+ date="2013-07-27T20:46:01Z"+ content="""+I've verified that the (old) code correctly returned no path when it's too long:++<pre>+*Annex.Ssh System.Directory System.Posix.Directory Annex Git.Construct Git.Config System.Posix.Env Utility.Env> eval (newState r') $ changeGitConfig (\c -> c { annexCrippledFileSystem = True }) >> sshInfo (\"fozz@git-annex-markdown.lang.speechmarks.com-fozz_phone.2Dannex.IdWwlXHtSsjVUMcq\", Nothing)+(Nothing,[])+</pre>++In case the problem was somehow related to calculating the length on Android (ie, Data.Bits.Utils broken), I built a small program that calculated the length of the string the same way++[[!format haskell \"\"\"+import Utility.FileSystemEncoding++main = do+ let s = \"/data/data/ga.androidterm/tmp/fozz@git-annex-markdown.lang.speechmarks.com-fozz_phone.2Dannex.IdWwlXHtSsjVUMcq\"+ let ws = decodeW8 s+ print (length ws)+\"\"\"]]++Outputs 110 on Android as expected.++Finally, using git-annex 4.20130721-g002de3e on Android (a newer version than the bug reporter's but with no changes to Annex.Ssh), I manually set up a repository using the same hostname:++<pre>+[remote \"foo\"]+ url = ssh://fozz@git-annex-markdown.lang.speechmarks.com-fozz_phone.2Dannex.IdWwlXHtSsjVUMcq+ fetch = +refs/heads/*:refs/remotes/foo/*+ annex-uuid = dummy+</pre>++And still cannot replicate the bug; as expected it does not use the socket since it's too long:++copy foo (checking foo...) [2013-07-27 16:40:42 EDT] call: ssh [\"-T\",\"fozz@git-annex-markdown.lang.speechmarks.com-fozz_phone.2Dannex.IdWwlXHtSsjVUMcq\",\"git-annex-shell 'inannex' '' 'SHA256E-s29--093429efb0d1427753d1f038f5279ec4df66785a1b2429b3fa5e3a01bcb75bd8' --uuid 111\"]++So, I don't understand how this could have happened. Although my recent changes mean it'll use a 62 byte path max on Android now, which certianly should avoid the problem, even if there's some actual bug here that I cannot reproduce.+"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawnRai_qFYPVvEgC6i1nlM1bh-C__jbhqS0"+ nickname="Matthew"+ subject="Will give the new version a got tomorrow..."+ date="2013-07-27T21:45:29Z"+ content="""+But do you have any idea why it didn't transfer the filename with the ~ above the n?+"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="4.152.246.110"+ subject="comment 15"+ date="2013-07-27T21:50:32Z"+ content="""+AFAICS it was failing to transfer every file, no matter what the name, due to the socket length too long problem.+"""]]
@@ -0,0 +1,173 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawnRai_qFYPVvEgC6i1nlM1bh-C__jbhqS0"+ nickname="Matthew"+ subject="Not completely..."+ date="2013-07-28T11:44:40Z"+ content="""+So done a bit of testing this morning...++I upgraded the Git Annex on my phone and added a text file called \"mañnequin\" into my Git Annex. The assistant web app did not do anything and it did not appear on my desktop when I sync'd... So I went to my phone manually added it and synced. Which then did make it appear on my desktop when I did a sync.++Phone Log:++ Falling back to hardcoded app location; cannot find expected files in /data/app-lib+ git annex webapp+ u0_a84@android:/sdcard/git-annex.home $ git annex webapp+ ^Z[1] + Stopped git annex webapp+ u0_a84@android:/sdcard/git-annex.home $ bg+ [1] git annex webapp+ u0_a84@android:/sdcard/git-annex.home $ cd ../annex/+ u0_a84@android:/sdcard/annex $ git remote -v+ markdown.lang.speechmarks.com_phoneannex ssh://fozz@git-annex-markdown.lang.speechmarks.com-fozz_phone.2Dannex/~/phone-annex/ (fetch)+ markdown.lang.speechmarks.com_phoneannex ssh://fozz@git-annex-markdown.lang.speechmarks.com-fozz_phone.2Dannex/~/phone-annex/ (push)+ u0_a84@android:/sdcard/annex $ git-annex version+ git-annex version: 4.20130723-ged05a63+ build flags: Assistant Webapp Testsuite S3 WebDAV Inotify XMPP DNS+ local repository version: 4+ default repository version: 3+ supported repository versions: 3 4+ upgrade supported from repository versions: 0 1 2+ u0_a84@android:/sdcard/annex $ git annex copy . --to markdown.lang.speechmarks.com_phoneannex+ copy Freddie_Mercury/Barcelona_[+video]/B00921KGRK_(disc_1)_01_-_Barcelona_(New_Orchestrated_Version.mp3 (checking markdown.lang.speechmarks.com_phoneannex...) ok+ copy Freddie_Mercury/Barcelona_[+video]/B00921KH5G_(disc_1)_02_-_La_Japonaise_(New_Orchestrated_Vers.mp3 (checking markdown.lang.speechmarks.com_phoneannex...) ok+ copy Freddie_Mercury/Barcelona_[+video]/B00921KHD8_(disc_1)_03_-_The_Fallen_Priest_(New_Orchestrated.mp3 (checking markdown.lang.speechmarks.com_phoneannex...) ok+ copy Freddie_Mercury/Barcelona_[+video]/B00921KHNS_(disc_1)_04_-_Ensueo_(New_Orchestrated_Version).mp3 (checking markdown.lang.speechmarks.com_phoneannex...) ok+ copy Freddie_Mercury/Barcelona_[+video]/B00921KHY2_(disc_1)_05_-_The_Golden_Boy_(New_Orchestrated_Ve.mp3 (checking markdown.lang.speechmarks.com_phoneannex...) ok+ copy Freddie_Mercury/Barcelona_[+video]/B00921KI9G_(disc_1)_06_-_Guide_Me_Home_(New_Orchestrated_Ver.mp3 (checking markdown.lang.speechmarks.com_phoneannex...) ok+ copy Freddie_Mercury/Barcelona_[+video]/B00921KIIW_(disc_1)_07_-_How_Can_I_Go_On_(New_Orchestrated_V.mp3 (checking markdown.lang.speechmarks.com_phoneannex...) ok+ copy Freddie_Mercury/Barcelona_[+video]/B00921KITG_(disc_1)_08_-_Exercises_In_Free_Love_(New_Orchest.mp3 (checking markdown.lang.speechmarks.com_phoneannex...) ok+ copy Freddie_Mercury/Barcelona_[+video]/B00921KJ22_(disc_1)_09_-_Overture_Piccante_(New_Orchestrated.mp3 (checking markdown.lang.speechmarks.com_phoneannex...) ok+ copy Freddie_Mercury/Barcelona_[+video]/B00921KJB8_(disc_1)_10_-_How_Can_I_Go_On_(New_Orchestrated_V.mp3 (checking markdown.lang.speechmarks.com_phoneannex...) ok+ copy Freddie_Mercury/Barcelona_[+video]/B00921KJMW_(disc_2)_01_-_Exercises_In_Free_Love_(1987_B-Side.mp3 (checking markdown.lang.speechmarks.com_phoneannex...) ok+ copy Freddie_Mercury/Barcelona_[+video]/B00921KJVI_(disc_2)_02_-_Barcelona_(Early_Version__Freddie's.mp3 (checking markdown.lang.speechmarks.com_phoneannex...) ok+ copy Freddie_Mercury/Barcelona_[+video]/B00921KK5I_(disc_2)_03_-_La_Japonaise_(Early_Version__Freddi.mp3 (checking markdown.lang.speechmarks.com_phoneannex...) ok+ copy Freddie_Mercury/Barcelona_[+video]/B00921KKHQ_(disc_2)_04_-_Rachmaninov's_Revenge_(The_Fallen_P.mp3 (checking markdown.lang.speechmarks.com_phoneannex...) ok+ copy Freddie_Mercury/Barcelona_[+video]/B00921KKSA_(disc_2)_05_-_Ensueo_(Monsterrat's_Live_Takes).mp3 (checking markdown.lang.speechmarks.com_phoneannex...) ok+ copy Freddie_Mercury/Barcelona_[+video]/B00921KL2U_(disc_2)_06_-_The_Golden_Boy_(Early_Version__Fred.mp3 (checking markdown.lang.speechmarks.com_phoneannex...) ok+ copy Freddie_Mercury/Barcelona_[+video]/B00921KLBQ_(disc_2)_07_-_Guide_Me_Home_(Alternative_Version).mp3 (checking markdown.lang.speechmarks.com_phoneannex...) ok+ copy Freddie_Mercury/Barcelona_[+video]/B00921KLJI_(disc_2)_08_-_How_Can_I_Go_On_(Alternative_Versio.mp3 (checking markdown.lang.speechmarks.com_phoneannex...) ok+ copy Freddie_Mercury/Barcelona_[+video]/B00921KLUC_(disc_2)_09_-_How_Can_I_Go_On_(Alternative_Piano_.mp3 (checking markdown.lang.speechmarks.com_phoneannex...) ok+ copy Freddie_Mercury/Barcelona_[+video]/B00921KM3I_(disc_3)_01_-_Barcelona_(Orchestral_Version).mp3 (checking markdown.lang.speechmarks.com_phoneannex...) ok+ copy Freddie_Mercury/Barcelona_[+video]/B00921KMBU_(disc_3)_02_-_La_Japonaise_(Orchestral_Version).mp3 (checking markdown.lang.speechmarks.com_phoneannex...) ok+ copy Freddie_Mercury/Barcelona_[+video]/B00921KMM4_(disc_3)_03_-_The_Fallen_Priest_(Orchestral_Versi.mp3 (checking markdown.lang.speechmarks.com_phoneannex...) ok+ copy Freddie_Mercury/Barcelona_[+video]/B00921KMYW_(disc_3)_04_-_Ensueo_(Orchestral_Version).mp3 (checking markdown.lang.speechmarks.com_phoneannex...) ok+ copy Freddie_Mercury/Barcelona_[+video]/B00921KNAK_(disc_3)_05_-_The_Golden_Boy_(Orchestral_Version).mp3 (checking markdown.lang.speechmarks.com_phoneannex...) ok+ copy Freddie_Mercury/Barcelona_[+video]/B00921KNUA_(disc_3)_06_-_Guide_Me_Home_(Orchestral_Version).mp3 (checking markdown.lang.speechmarks.com_phoneannex...) ok+ copy Freddie_Mercury/Barcelona_[+video]/B00921KOVI_(disc_3)_07_-_How_Can_I_Go_On_(Orchestral_Version.mp3 (checking markdown.lang.speechmarks.com_phoneannex...) ok+ copy Freddie_Mercury/Barcelona_[+video]/B00921KPP8_(disc_3)_08_-_Exercises_In_Free_Love_(Orchestral_.mp3 (checking markdown.lang.speechmarks.com_phoneannex...) ok+ copy Freddie_Mercury/Barcelona_[+video]/B00921KQJ8_(disc_3)_09_-_Overture_Piccante_(Orchestral_Versi.mp3 (checking markdown.lang.speechmarks.com_phoneannex...) ok+ u0_a84@android:/sdcard/annex $ ls+ Freddie_Mercury+ u0_a84@android:/sdcard/annex $ ls+ ls lsattr lsmod lsof lspci lsusb+ rcury/Barcelona_\[+video]/B00921K <+ B00921KGRK_(disc_1)_01_-_Barcelona_(New_Orchestrated_Version.mp3+ B00921KH5G_(disc_1)_02_-_La_Japonaise_(New_Orchestrated_Vers.mp3+ B00921KHD8_(disc_1)_03_-_The_Fallen_Priest_(New_Orchestrated.mp3+ B00921KHNS_(disc_1)_04_-_Ensueo_(New_Orchestrated_Version).mp3+ B00921KHY2_(disc_1)_05_-_The_Golden_Boy_(New_Orchestrated_Ve.mp3+ B00921KI9G_(disc_1)_06_-_Guide_Me_Home_(New_Orchestrated_Ver.mp3+ B00921KIIW_(disc_1)_07_-_How_Can_I_Go_On_(New_Orchestrated_V.mp3+ B00921KITG_(disc_1)_08_-_Exercises_In_Free_Love_(New_Orchest.mp3+ B00921KJ22_(disc_1)_09_-_Overture_Piccante_(New_Orchestrated.mp3+ B00921KJB8_(disc_1)_10_-_How_Can_I_Go_On_(New_Orchestrated_V.mp3+ B00921KJMW_(disc_2)_01_-_Exercises_In_Free_Love_(1987_B-Side.mp3+ B00921KJVI_(disc_2)_02_-_Barcelona_(Early_Version__Freddie's.mp3+ B00921KK5I_(disc_2)_03_-_La_Japonaise_(Early_Version__Freddi.mp3+ B00921KKHQ_(disc_2)_04_-_Rachmaninov's_Revenge_(The_Fallen_P.mp3+ B00921KKSA_(disc_2)_05_-_Ensueo_(Monsterrat's_Live_Takes).mp3+ B00921KL2U_(disc_2)_06_-_The_Golden_Boy_(Early_Version__Fred.mp3+ B00921KLBQ_(disc_2)_07_-_Guide_Me_Home_(Alternative_Version).mp3+ B00921KLJI_(disc_2)_08_-_How_Can_I_Go_On_(Alternative_Versio.mp3+ B00921KLUC_(disc_2)_09_-_How_Can_I_Go_On_(Alternative_Piano_.mp3+ B00921KM3I_(disc_3)_01_-_Barcelona_(Orchestral_Version).mp3+ B00921KMBU_(disc_3)_02_-_La_Japonaise_(Orchestral_Version).mp3+ B00921KMM4_(disc_3)_03_-_The_Fallen_Priest_(Orchestral_Versi.mp3+ B00921KMYW_(disc_3)_04_-_Ensueo_(Orchestral_Version).mp3+ B00921KNAK_(disc_3)_05_-_The_Golden_Boy_(Orchestral_Version).mp3+ B00921KNUA_(disc_3)_06_-_Guide_Me_Home_(Orchestral_Version).mp3+ B00921KOVI_(disc_3)_07_-_How_Can_I_Go_On_(Orchestral_Version.mp3+ B00921KPP8_(disc_3)_08_-_Exercises_In_Free_Love_(Orchestral_.mp3+ B00921KQJ8_(disc_3)_09_-_Overture_Piccante_(Orchestral_Versi.mp3+ rcury/Barcelona_\[+video]/B00921K <+ ls: Freddie_Mercury/Barcelona_[+video]/B00921K: No such file or directory+ 1|u0_a84@android:/sdcard/annex $+ 1|u0_a84@android:/sdcard/annex $+ 1|u0_a84@android:/sdcard/annex $+ 1|u0_a84@android:/sdcard/annex $+ 1|u0_a84@android:/sdcard/annex $+ 1|u0_a84@android:/sdcard/annex $ fg+ git annex webapp+ bg+ ^Z[1] + Stopped git annex webapp+ u0_a84@android:/sdcard/annex $ bg+ [1] git annex webapp+ u0_a84@android:/sdcard/annex $ ls+ Freddie_Mercury ma??nequin+ u0_a84@android:/sdcard/annex $ git annex add manequin+ Freddie_Mercury/ manequin+ u0_a84@android:/sdcard/annex $ git annex add manequin+ add manequin (checksum...) ok+ (Recording state in git...)+ u0_a84@android:/sdcard/annex $ git annex sync+ commit+ ok+ pull markdown.lang.speechmarks.com_phoneannex+ remote: Counting objects: 12, done.+ remote: Compressing objects: 100% (6/6), done.+ remote: Total 8 (delta 4), reused 0 (delta 0)+ Unpacking objects: 100% (8/8), done.+ From ssh://git-annex-markdown.lang.speechmarks.com-fozz_phone.2Dannex/~/phone-annex+ c709e47..d2678a5 synced/git-annex -> markdown.lang.speechmarks.com_phoneannex/synced/git-annex+ ok+ (merging markdown.lang.speechmarks.com_phoneannex/synced/git-annex into git-annex...)+ (Recording state in git...)+ (Recording state in git...)+ push markdown.lang.speechmarks.com_phoneannex+ warning: no threads support, ignoring --threads+ Counting objects: 15, done.+ Compressing objects: 100% (11/11), done.+ Writing objects: 100% (12/12), 1.19 KiB, done.+ Total 12 (delta 4), reused 0 (delta 0)+ To ssh://fozz@git-annex-markdown.lang.speechmarks.com-fozz_phone.2Dannex/~/phone-annex/+ d2678a5..577fa92 git-annex -> synced/git-annex+ c829a0a..2aa892f master -> synced/master+ ok+ u0_a84@android:/sdcard/annex $++I have no idea in this log why it is wrote \"manequin\" not \"mañnequin\" but this is what the command completion gave me ( I don't know how to type that letter ), but as you can see later it came over correctly later.++Desktop:++ fozz@cobol:~/phone-annex $ git annex sync+ commit+ # On branch master+ nothing to commit, working directory clean+ ok+ pull origin+ remote: Counting objects: 15, done.+ remote: Compressing objects: 100% (11/11), done.+ remote: Total 12 (delta 4), reused 0 (delta 0)+ Unpacking objects: 100% (12/12), done.+ From ssh://markdown.lang.speechmarks.com/home/fozz/phone-annex+ c829a0a..2aa892f master -> origin/master+ d2678a5..577fa92 synced/git-annex -> origin/synced/git-annex+ c829a0a..2aa892f synced/master -> origin/synced/master+ + Updating c829a0a..2aa892f+ Fast-forward+ \"ma\303\261nequin\" | 1 ++ 1 file changed, 1 insertion(+)+ create mode 120000 \"ma\303\261nequin\"+ + Already up-to-date.+ ok+ (merging origin/synced/git-annex into git-annex...)+ push origin+ Everything up-to-date+ ok++I have since gone through and replicated this with \"mañnequin.txt\" from scratch with a completely empty repository and it did an identical thing again. I then added a backup of my KeePass.kdb database and it went over fine. So it seems that git-annex has no problem with the \"ñ\" file now, but the assistant does not see it at all.++I have left the repository on my phone / desktop / server in this state so if you want further output please let me know.+"""]]
@@ -0,0 +1,23 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawnRai_qFYPVvEgC6i1nlM1bh-C__jbhqS0"+ nickname="Matthew"+ subject="Renaming files"+ date="2013-07-21T10:08:16Z"+ content="""+Renaming the files does not fix it, Git annex on all computers knows that those files are only in my phone, but the assistant is refusing to transfer the contents, it does not seem to know that it needs to...++ whereis Freddie_Mercury/Barcelona_[+video]/B00921KMM4_(disc_3)_03_-_The_Fallen_Priest_(Orchestral_Versi.mp3 (3 copies) + 1f368162-f02f-4794-af0c-1b5489e099b3 -- u0_a84@localhost:/sdcard/annex+ 53f03d06-f1e3-11e2-8519-1b41c09abecd -- here (Cobol: Phone)+ cb6240e0-f1df-11e2-836a-7f4323e50c49 -- origin (Markdown: Phone)+ ok+ whereis Freddie_Mercury/Barcelona_[+video]/B00921KMYW_(disc_3)_04_-_Ensueno_(Orchestral_Version).mp3 (1 copy) + 1f368162-f02f-4794-af0c-1b5489e099b3 -- u0_a84@localhost:/sdcard/annex+ ok+ whereis Freddie_Mercury/Barcelona_[+video]/B00921KNAK_(disc_3)_05_-_The_Golden_Boy_(Orchestral_Version).mp3 (3 copies) + 1f368162-f02f-4794-af0c-1b5489e099b3 -- u0_a84@localhost:/sdcard/annex+ 53f03d06-f1e3-11e2-8519-1b41c09abecd -- here (Cobol: Phone)+ cb6240e0-f1df-11e2-836a-7f4323e50c49 -- origin (Markdown: Phone)+ ok++"""]]
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawnRai_qFYPVvEgC6i1nlM1bh-C__jbhqS0"+ nickname="Matthew"+ subject="git annex copy --to won't get them across either..."+ date="2013-07-21T10:12:03Z"+ content="""+git annex copy . --to markdown.DOMAIN_phoneannex responds with++ ControlPath \"/data/data/ga.androidterm/tmp/fozz@...somethingthatlookslikeahash\" too long for Unix domain socket+"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="4.154.0.140"+ subject="seems to not involve utf8 at all.."+ date="2013-07-21T18:17:00Z"+ content="""+Can you please show me the actual filename, that you obfuscated as \"/data/data/ga.androidterm/tmp/fozz@...somethingthatlookslikeahash\" ?+"""]]
@@ -0,0 +1,14 @@+[[!comment format=mdwn+ username="GLITTAH"+ ip="37.130.227.133"+ subject="comment 4"+ date="2013-07-21T19:36:16Z"+ content="""+This sounds like a bug I ran into a while ago that got fixed.++>What version of git-annex are you using? On what operating system?+>+>Phone: 4.20130709-g339d1eo Transfer Server: 3.20120406 (which it did not get to) Desktop: 3.20120629++Maybe try upgrading your server and desktop versions? Those look old enough to still have the utf-8 bug.+"""]]
@@ -0,0 +1,19 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawnRai_qFYPVvEgC6i1nlM1bh-C__jbhqS0"+ nickname="Matthew"+ subject="Darn it..."+ date="2013-07-21T20:29:33Z"+ content="""+Hi,++Sorry, it was on my phone and very long and I didn't think it'd be important... Sheesh Users eh!++I think the error happened for every file or at least lots, not just the one with the strange tilde above the \"n\".+Eventually, it might have been after a phone reboot, it sorted itself and continued.++I can try and recreate it if it'll help, though it won't be till Wednesday / Thursday as I'm going away for a few days and I still need to pack.++Sorry for the bad bug report, I know how annoying they are.++It's not so easy for me to upgrade because one's an Ubuntu LTS and one is a Mint Debian Edition, both are the repository versions.+"""]]
@@ -0,0 +1,11 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawmkBwMWvNKZZCge_YqobCSILPMeK6xbFw8"+ nickname="develop"+ subject="comment 6"+ date="2013-07-21T20:31:50Z"+ content="""+As much i myself personally would hate it. You really should go with the standalone builds provided on this site then.++Just download the zip, extract on both machines. Make sure the PATH is correct, and it should Just Work(TM)++"""]]
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="4.154.1.10"+ subject="comment 7"+ date="2013-07-22T18:34:55Z"+ content="""+The only version of git-annex that matters is the one installed on the Android device. Which is fine.++I reiterate my request for the actual thing that got obfuscated as \"/data/data/ga.androidterm/tmp/fozz@...somethingthatlookslikeahash\". Once I have that peice of information I should be able to fix this bug in short order. I understand exactly what's going on, except I don't know what the actual length of the filename that is causing the problem is.+"""]]
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawnRai_qFYPVvEgC6i1nlM1bh-C__jbhqS0"+ nickname="Matthew"+ subject="I will give recreating the bug a go in about 3 days time..."+ date="2013-07-22T19:26:44Z"+ content="""+I will give recreating the bug a go in about 3 days time when I get back off holiday.++Thanks+"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="4.152.246.110"+ subject="comment 9"+ date="2013-07-26T21:09:36Z"+ content="""+Any luck reproducing this bug and getting the info I need to know exactly what's going on?+"""]]
@@ -0,0 +1,36 @@+Since uuid.log, trust.log and remote.log are union merged, it's possible+for any given item in them to have multiple values after a merge.+This would happen, for example, if the value was changed in different ways+in two repos which were then merged. git-annex will use an arbitrary+one of the multiple values.++A workaround if this should happen to you is to use `git annex describe`+or other commands to re-set the value you want. The process of setting+the value will remove the multiple lines.++To fix this the file format needs to be changed to include a timestamp+as is done with the other log files, then git-annex can consistently+pick the newest value -- which is as close to the "right" value as can be+determined in this situation.++----++File format backwards-compatability is the issue. Ideally, old git-annex+would keep working, ignoring the timestamp.++- uuid.log: "uuid description timestamp" would work; old git-annex + would just treat the timestamp as part of the description which would be+ ok+ > update: converted! --[[Joey]] +- trust.log: "uuid trustlevel timestamp" would work; old git-annex+ ignores trailing words+ > update: converted! --[[Joey]] +- remote.log: "uuid key=value ... timestamp" is on the edge but does work+ (old git-annex will include the timestamp in the key/value map it builds,+ but that should not break anything really)+ > update: converted! --[[Joey]] ++Appending "timestamp=xxxxx" would be good for clarity, and make+it easier to parse the timestamp out from lines that have it.++> [[done]] --[[Joey]]
@@ -0,0 +1,20 @@+### Please describe the problem.+I tried to setup a fresh local repository and got an error:+> Internal Server Error+> user error (git ["--git-dir=/home/jana/Bilder/Fotos/.git","--work-tree=/home/jana/Bilder/Fotos","commit-tree","4b825dc642cb6eb9a060e54bf8d69288fbee4904"] exited 128)++When clicking on "View logs", I get the following error:++> Internal Server Error+> internal liftAnnex++### What steps will reproduce the problem?+1. Run git-annex from programs menu+2. Click "Make repository"++### What version of git-annex are you using? On what operating system?+- git-annex 4.20130627 on Ubuntu 13.10, installed from debian unstable (sid) repository.+- git version 1.8.1.2++> I've made it detect systems that lack a FQDN and set user.email+> automatically. [[done]] --[[Joey]]
@@ -0,0 +1,41 @@+I had started a fresh repo to test out the watch command again on OSX and noticed that it's borked, I'm not sure when it was broken.++The snippet of the log message and command is++<pre>+$ git annex watch --foreground -d -v+watch . read: git ["--git-dir=/Users/jtang/sandbox/atest/.git","--work-tree=/Users/jtang/sandbox/atest","show-ref","git-annex"] +read: git ["--git-dir=/Users/jtang/sandbox/atest/.git","--work-tree=/Users/jtang/sandbox/atest","show-ref","--hash","refs/heads/git-annex"] +read: git ["--git-dir=/Users/jtang/sandbox/atest/.git","--work-tree=/Users/jtang/sandbox/atest","log","refs/heads/git-annex..6702e5361146450800ae5af0b63e97bd9c55d70b","--oneline","-n1"] +chat: git ["--git-dir=/Users/jtang/sandbox/atest/.git","--work-tree=/Users/jtang/sandbox/atest","cat-file","--batch"] +(scanning...) call: git ["--git-dir=/Users/jtan+</pre>++I had run git-annex with a new repo with just doing a git init and git annex init, I just threw in one or two small text files to see if it was working. It just hangs and does nothing. I had also tried it out on one of my bigger repos and it does the same thing it just hangs at _(scanning...)_ There isn't much to go on, I wonder if it's hitting the [[Issue on OSX with some system limits]] or if its just a thread/fork issue on OSX.++It still hangs on the small repo even if I do++ $ sudo sysctl -w kern.maxfilesperproc=400000+ $ ulimit -n 2000++Also, just in case if you need it still (on a clean OSX 10.7 system)++<pre>+$ ulimit -a+core file size (blocks, -c) 0+data seg size (kbytes, -d) unlimited+file size (blocks, -f) unlimited+max locked memory (kbytes, -l) unlimited+max memory size (kbytes, -m) unlimited+open files (-n) 256+pipe size (512 bytes, -p) 1+stack size (kbytes, -s) 8192+cpu time (seconds, -t) unlimited+max user processes (-u) 709+virtual memory (kbytes, -v) unlimited+</pre>++Please close or merge this report if it's a duplicate.++> I've fixed this, it works in my (so far limited) tests. [[done]]+> --[[Joey]]
@@ -0,0 +1,37 @@+Running the tip of the watch branch on OSX in an annex'ed directory.++The watch command detects the changes, does _something_, see the output below.++Output from watch command++<pre>+(Recording state in git...)+Added "./KeePass2.18.dmg"+Added "./KeePassX-0.4.3.dmg"+add ./KeePass2.18.dmg (checksum...) ok+add ./KeePassX-0.4.3.dmg (checksum...) ok+</pre>++State of the annex++<pre>+laplace:annex jtang$ git status+# On branch master+# Untracked files:+# (use "git add <file>..." to include in what will be committed)+#+# KeePass2.18.dmg+# KeePassX-0.4.3.dmg+nothing added to commit but untracked files present (use "git add" to track)+</pre>++It seems to not do a git add and commit after the creation of the symlinks, manually doing this makes it all happy again till more files are added.++note: i had posted a comment in the blog post, but posting the issue here is probably more appropriate.++> Yeah, this is the issue I was struggling with last night. +> I think it's fixed in 57cf65eb6d811ba7fd19eb62a54e3b83a0c2dfa7,+> but the kqueue watch still needs a lot of work. --[[Joey]]++>> Confirmed this is fixed, but do note the known kqueue bugs in +>> [[design/assistant/inotify]]! [[done]] --[[Joey]]
@@ -0,0 +1,37 @@+When having "git annex watch" running, unlocking files causes the watcher+to immediately lock/commit them.++----++Possible approaches:++* The watcher could detect unlocked files by checking if newly added files+ are a typechange of a file already in git. But this would add git overhead+ to every file add.+* `git annex unlock` could add some type of flag file, which the assistant+ could check. This would work fine, for users who want to use `git annex+ unlock` with the assistant. That's probably not simple enough for most+ users, though.+* There could be a UI in the assistant to pick a file and unlock it.+ The assistant would have its own list of files it knows are unlocked.+ But I'm trying to avoid mandatory UI to use the assistant.+* Perhaps instead, have a directory, like "edit". The assistant could notice+ when files move into this special directory, and automatically unlock them.+ Then when they're moved out, automatically commit them.+* Alternatively, files that are moved out of the repository entirely could be+ automatically unlocked, and then when they're moved back in, it would+ automatically do the right thing. This may be worth implementing in+ combination with the "edit" directory, as different use cases would work+ better with one or the other. However, I don't currently get inotify+ events when files are moved out of the repository (well, I do, but it+ just says "file moved", with no forwarding address, so I don't know + how to find the file to unlock it.++[[!meta title="assistant: watcher_commits_unlocked_files"]]++> [[done]]; I just tested and somehow this no longer happens;+> the watcher/assistant leaves the unlocked file alone, and then+> as soon as it's modified re-adds it.+> +> Also, of course, there is direct mode, which avoids needing to unlock...+> --[[Joey]]
@@ -0,0 +1,24 @@+### Please describe the problem.+I could not find a way to abort the addition of a new remote repository.++### What steps will reproduce the problem?+- start adding a remote repository (unencrypted, with git-annex installed);+- forget to create the folder on the remote host;+- navigate away from the repository page;+- the dashboard says the repository is partially set-up, and the only thing one can do is look at the log (which says the folder is missing).++I was able to solve it by creating another repository with the exact same data.++### What version of git-annex are you using? On what operating system?++Version: 4.20131002-gf25991c on OS X 10.8.5++### Please provide any additional information below.++[[!format sh """+# If you can, paste a complete transcript of the problem occurring here.+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log+++# End of transcript or log.+"""]]
@@ -0,0 +1,144 @@+Occasionally, clicking on a link in the webapp will hang. When this+happens, which has only been seen in Chromium so far, the tab will spin+forever, without anything loading. Other tabs can be opened with+middle-click on links in the webapp, and work fine. Stopping and reloading+in the tab tends to hang again, although eventually this will clear the+hang up.++-------++My best procedure to replicate this, about 25% of the time:++* have 2 large files and a libreoffice spreadsheet+* start webapp, make repository+* open file browser using button in webapp+* move files into repository+* make media subdir; move media into it+* open spreadsheet, modify, save+* click on New Repository button for the hang++Running recordmydesktop at the same time may also help.. Or giving a+presentation in Australia. :/++-------++Hypotheses:++* Warp's slowloris protection could be triggering. Possibly by the+ repeated hits to update the alerts? I added a settingsOnException handler+ that logs all exceptions, and ThreadKilled is happening several times.+ The only place in Warp that kills threads is due to a timeout installed+ for that. ++ **Verified** Bug filed upstream: <https://github.com/yesodweb/wai/issues/146>++ ** workaround in place **++* Something deep in git-annex, such as the inotidy code, could be+ preventing a web server thread from running. But then why do other+ tabs and other web browsers work while it's stuck?+ It would have to affect only 1 thread.++-------++I captured a clean protocol dump of this happening. It includes only the+final, hanging http request and subsequent traffic, not the setup.++We can see the web browser send a request. The server ACKs it at the TCP+level, but never sends any reply. The web browser continues sending TCP+keep-alive packets, which are acked by the server. This continued as long+as the browser tab was left open.++Question: Did the browser send a complete & valid request? The last part+sent is a cookie and "\r\n\r\n".. So it seems complete. Unless warp is+expecting a request body?++<pre>+17:22:30.533079 IP localhost.localdomain.53239 > localhost.localdomain.45836: Flags [P.], seq 4237976899:4237977772, ack 2608808926, win 2048, options [nop,nop,TS val 4895706 ecr 4885760], length 873+ 0x0000: 4500 039d be84 4000 4006 7ad4 7f00 0001 E.....@.@.z.....+ 0x0010: 7f00 0001 cff7 b30c fc9a 6543 9b7f 43de ..........eC..C.+ 0x0020: 8018 0800 0192 0000 0101 080a 004a b3da .............J..+ 0x0030: 004a 8d00 4745 5420 2f63 6f6e 6669 672f .J..GET./config/+ 0x0040: 7265 706f 7369 746f 7279 3f61 7574 683d repository?auth=+ 0x0050: 6437 6266 3037 3438 6663 3863 3031 3965 d7bf0748fc8c019e+ 0x0060: 6230 3966 3530 3631 6164 6663 3861 3563 b09f5061adfc8a5c+ 0x0070: 3430 3437 3633 6562 3736 6630 6163 3533 404763eb76f0ac53+ 0x0080: 3663 3362 6230 3066 3835 6663 6361 3233 6c3bb00f85fcca23+ 0x0090: 6235 3639 3764 3332 3464 3737 3930 3063 b5697d324d77900c+ 0x00a0: 3739 3532 6430 6165 3235 3166 6331 6337 7952d0ae251fc1c7+ 0x00b0: 3532 3632 6330 3233 6265 3936 3066 3563 5262c023be960f5c+ 0x00c0: 3364 6135 6532 6262 6234 3639 3863 3035 3da5e2bbb4698c05+ 0x00d0: 2048 5454 502f 312e 310d 0a48 6f73 743a .HTTP/1.1..Host:+ 0x00e0: 2031 3237 2e30 2e30 2e31 3a34 3538 3336 .127.0.0.1:45836+ 0x00f0: 0d0a 436f 6e6e 6563 7469 6f6e 3a20 6b65 ..Connection:.ke+ 0x0100: 6570 2d61 6c69 7665 0d0a 4163 6365 7074 ep-alive..Accept+ 0x0110: 3a20 7465 7874 2f68 746d 6c2c 6170 706c :.text/html,appl+ 0x0120: 6963 6174 696f 6e2f 7868 746d 6c2b 786d ication/xhtml+xm+ 0x0130: 6c2c 6170 706c 6963 6174 696f 6e2f 786d l,application/xm+ 0x0140: 6c3b 713d 302e 392c 2a2f 2a3b 713d 302e l;q=0.9,*/*;q=0.+ 0x0150: 380d 0a55 7365 722d 4167 656e 743a 204d 8..User-Agent:.M+ 0x0160: 6f7a 696c 6c61 2f35 2e30 2028 5831 313b ozilla/5.0.(X11;+ 0x0170: 204c 696e 7578 2069 3638 3629 2041 7070 .Linux.i686).App+ 0x0180: 6c65 5765 624b 6974 2f35 3337 2e31 3720 leWebKit/537.17.+ 0x0190: 284b 4854 4d4c 2c20 6c69 6b65 2047 6563 (KHTML,.like.Gec+ 0x01a0: 6b6f 2920 4368 726f 6d65 2f32 342e 302e ko).Chrome/24.0.+ 0x01b0: 3133 3132 2e36 3820 5361 6661 7269 2f35 1312.68.Safari/5+ 0x01c0: 3337 2e31 370d 0a52 6566 6572 6572 3a20 37.17..Referer:.+ 0x01d0: 6874 7470 3a2f 2f31 3237 2e30 2e30 2e31 http://127.0.0.1+ 0x01e0: 3a34 3538 3336 2f3f 6175 7468 3d64 3762 :45836/?auth=d7b+ 0x01f0: 6630 3734 3866 6338 6330 3139 6562 3039 f0748fc8c019eb09+ 0x0200: 6635 3036 3161 6466 6338 6135 6334 3034 f5061adfc8a5c404+ 0x0210: 3736 3365 6237 3666 3061 6335 3336 6333 763eb76f0ac536c3+ 0x0220: 6262 3030 6638 3566 6363 6132 3362 3536 bb00f85fcca23b56+ 0x0230: 3937 6433 3234 6437 3739 3030 6337 3935 97d324d77900c795+ 0x0240: 3264 3061 6532 3531 6663 3163 3735 3236 2d0ae251fc1c7526+ 0x0250: 3263 3032 3362 6539 3630 6635 6333 6461 2c023be960f5c3da+ 0x0260: 3565 3262 6262 3436 3938 6330 350d 0a41 5e2bbb4698c05..A+ 0x0270: 6363 6570 742d 456e 636f 6469 6e67 3a20 ccept-Encoding:.+ 0x0280: 677a 6970 2c64 6566 6c61 7465 2c73 6463 gzip,deflate,sdc+ 0x0290: 680d 0a41 6363 6570 742d 4c61 6e67 7561 h..Accept-Langua+ 0x02a0: 6765 3a20 656e 2d55 532c 656e 3b71 3d30 ge:.en-US,en;q=0+ 0x02b0: 2e38 0d0a 4163 6365 7074 2d43 6861 7273 .8..Accept-Chars+ 0x02c0: 6574 3a20 4953 4f2d 3838 3539 2d31 2c75 et:.ISO-8859-1,u+ 0x02d0: 7466 2d38 3b71 3d30 2e37 2c2a 3b71 3d30 tf-8;q=0.7,*;q=0+ 0x02e0: 2e33 0d0a 436f 6f6b 6965 3a20 5f53 4553 .3..Cookie:._SES+ 0x02f0: 5349 4f4e 3d45 3363 7455 496c 7341 5451 SION=E3ctUIlsATQ+ 0x0300: 3631 694c 6d54 6954 7131 6f37 6465 7830 61iLmTiTq1o7dex0+ 0x0310: 3361 6f57 3049 4b63 7663 467a 5838 4344 3aoW0IKcvcFzX8CD+ 0x0320: 5432 7666 4b31 6c42 416d 6279 3166 764f T2vfK1lBAmby1fvO+ 0x0330: 4643 7952 7863 6f5a 6277 5633 6a4b 4971 FCyRxcoZbwV3jKIq+ 0x0340: 6b35 6958 4674 7557 5261 6b48 6944 6132 k5iXFtuWRakHiDa2+ 0x0350: 7769 3075 2f53 6430 5a49 7a75 4464 7947 wi0u/Sd0ZIzuDdyG+ 0x0360: 774f 6a31 7838 3130 356a 772f 5a2b 355a wOj1x8105jw/Z+5Z+ 0x0370: 6f4b 6f48 396e 6779 6e4b 5366 5839 742f oKoH9ngynKSfX9t/+ 0x0380: 6862 4b79 435a 6966 7739 4148 3053 6d4b hbKyCZifw9AH0SmK+ 0x0390: 436e 4c38 5358 513d 3d0d 0a0d 0a CnL8SXQ==....+17:22:30.571152 IP localhost.localdomain.45836 > localhost.localdomain.53239: Flags [.], ack 873, win 2048, options [nop,nop,TS val 4895716 ecr 4895706], length 0+ 0x0000: 4500 0034 f15b 4000 4006 4b66 7f00 0001 E..4.[@.@.Kf....+ 0x0010: 7f00 0001 b30c cff7 9b7f 43de fc9a 68ac ..........C...h.+ 0x0020: 8010 0800 fe28 0000 0101 080a 004a b3e4 .....(.......J..+ 0x0030: 004a b3da .J..+17:22:35.803152 IP localhost.localdomain.53240 > localhost.localdomain.45836: Flags [.], ack 2157632553, win 2048, options [nop,nop,TS val 4897024 ecr 4885760], length 0+ 0x0000: 4500 0034 3a63 4000 4006 025f 7f00 0001 E..4:c@.@.._....+ 0x0010: 7f00 0001 cff8 b30c 7533 e963 809a dc29 ........u3.c...)+ 0x0020: 8010 0800 fe28 0000 0101 080a 004a b900 .....(.......J..+ 0x0030: 004a 8d00 .J..+17:22:35.803213 IP localhost.localdomain.45836 > localhost.localdomain.53240: Flags [.], ack 1, win 2048, options [nop,nop,TS val 4897024 ecr 4840696], length 0+ 0x0000: 4500 0034 10e5 4000 4006 2bdd 7f00 0001 E..4..@.@.+.....+ 0x0010: 7f00 0001 b30c cff8 809a dc29 7533 e964 ...........)u3.d+ 0x0020: 8010 0800 fe28 0000 0101 080a 004a b900 .....(.......J..+ 0x0030: 0049 dcf8 .I..+17:23:15.611193 IP localhost.localdomain.53239 > localhost.localdomain.45836: Flags [.], ack 1, win 2048, options [nop,nop,TS val 4906976 ecr 4895716], length 0+ 0x0000: 4500 0034 be85 4000 4006 7e3c 7f00 0001 E..4..@.@.~<....+ 0x0010: 7f00 0001 cff7 b30c fc9a 68ab 9b7f 43de ..........h...C.+ 0x0020: 8010 0800 fe28 0000 0101 080a 004a dfe0 .....(.......J..+ 0x0030: 004a b3e4 .J..+17:23:15.611290 IP localhost.localdomain.45836 > localhost.localdomain.53239: Flags [.], ack 873, win 2048, options [nop,nop,TS val 4906976 ecr 4895706], length 0+ 0x0000: 4500 0034 f15c 4000 4006 4b65 7f00 0001 E..4.\@.@.Ke....+ 0x0010: 7f00 0001 b30c cff7 9b7f 43de fc9a 68ac ..........C...h.+ 0x0020: 8010 0800 fe28 0000 0101 080a 004a dfe0 .....(.......J..+ 0x0030: 004a b3da .J..+</pre>++[[!tag /design/assistant]]+[[done]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://gdr.name/"+ nickname="gdr.name"+ subject="Not only Chrome"+ date="2013-03-09T10:55:57Z"+ content="""+It happened to me numerous times with Opera. I was never able to repeat it hence no bug report.+"""]]
@@ -0,0 +1,21 @@+[[!comment format=mdwn+ username="http://crosstwine.com/dd/"+ ip="88.65.128.43"+ subject="chrome://net-internals/"+ date="2013-03-09T20:10:54Z"+ content="""+Hi Joey,++I see that you have found the cause and a workaround for this particular+problem, but would like to point out that `chrome://net-internals/` can be+very useful for diagnosing such issues.++(I once hit the `SOCKET_POOL_STALLED_MAX_SOCKETS_PER_GROUP` problem+mentioned in+<https://code.google.com/p/chromium/issues/detail?id=27324>, which can+cause Chromium to keep spinning while not issuing any new requests to a+specific web server.)++Cheers, +Damien Diederen+"""]]
@@ -0,0 +1,41 @@+What steps will reproduce the problem?++> Open Webapp on Mac OSX Mountain Lion++What is the expected output? What do you see instead?++> I expect notification bubbles and transfer progress bars to show and update on the fly, as well as notifications to disappear when I click the X.+> +> Instead, I have to reload the page after clicking an X or to see new bubbles and progress bar updates.++What version of git-annex are you using? On what operating system?++> git-annex version: 3.20130107+> local repository version: 3+> default repository version: 3+> supported repository versions: 3+> upgrade supported from repository versions: 0 1 2+> +> Mac OS X 10.8.2 Build 12C3006+> +> Chrome Version 23.0.1271.101++Please provide any additional information below.++Javascript console error log says "Syntax error on localhost:5" which is this line:++ <link rel="stylesheet" href="/static/css/bootstrap.css"><link rel="stylesheet" href="/static/css/bootstrap-responsive.css"><style>body{padding-top:60px;padding-bottom:40px}.sidebar-nav{padding:9px 0}</style><script src="/static/jquery.full.js"></script><script src="/static/js/bootstrap-dropdown.js"></script><script src="/static/js/bootstrap-modal.js"></script><script src="/static/js/bootstrap-collapse.js"></script><script src="/static/longpolling.js"></script><script>function longpoll_"sidebar"() {++> And the bug is the quoting inside the function name.+> +> I believe this affects all builds done using shakespeare-js 1.0.0.2.+> It may be that some browsers manage to run the javascript despite the+> quoting. Otherwise, I don't know why noone has reported this bug+> before now.+> +> I've fixed this bug in git. Your testing with tomorrow's+> autobuild would be appreciated. --[[Joey]]++>> There was a second issue as noted. I fixed that last week,+>> and the fix is in the autobuilds if you'd like to test before+>> the next release. [[done]] again --[[Joey]]
@@ -0,0 +1,15 @@+### Please describe the problem.+When adding a folder with some 80.000 files, the sidebar with "Added x files" gets updated in batches. After some time, it shows (also see attached screenshot):++> Added 6496 files 5781 files 8633 files 7363 files 6159 files++This is a bit ugly. There could a newline after "files".++### What steps will reproduce the problem?+Add a folder with many files and subfolders in it.++### What version of git-annex are you using? On what operating system?+4.20130627 ++> I have improved the display, now it will just show a single ongoing count,+> and the most recent 10 or so files added. [[done]] --[[Joey]]
@@ -0,0 +1,18 @@+### Please describe the problem.++The colored notices on the left of the screen are a little off. When they disappear, it also leaves a huge gap on the left side.++### What steps will reproduce the problem?++Click the `X` on all the messages on the left.++### What version of git-annex are you using? On what operating system?++4.20130815~bpo70+1 on Debian Wheezy, with Chromium Version 29.0.1547.57 Debian 7.1 (217859)++### Please provide any additional information below.++This is admittedly a very mild problem, but from a usability perspective, it would be less confusing to show those on the right. When they were gone, I thought git-annex was broken somewhat... -- [[anarcat]]++> [[done]], although I'm not sure I'm sold on their being on the right+> being better. --[[Joey]]
@@ -0,0 +1,20 @@+See+<http://www.git.code-experiments.com/blog/2011/01/manage-large-files-with-git-annex-by-joey-hess.html>++If a local repo is cloned with "git clone orig/.git new", then git-annex in+new cannot see origin. ++the .git/config has "url=/.../orig/.git". Apparently git is ok with that+weird construction; probably it treats it as a bare git repo. But git-annex+just sees a directory w/o a .git subdir, and gives up.++---++Just tested, and the new support for bare repositories didn't solve this.+(Because config.bare is not set.)++I think this is not something git-annex should go out of its way to+support. [[done]]+--[[Joey]] ++Later.. Fixed this after all. --[[Joey]]
@@ -0,0 +1,44 @@+What steps will reproduce the problem?++ ...:/tmp$ mkdir repro+ ...:/tmp$ cd repro/+ ...:/tmp/repro$ git init+ Initialized empty Git repository in /tmp/repro/.git/+ ...:/tmp/repro$ git annex init test+ init test ok+ ...:/tmp/repro$ echo "A" > a.txt+ ...:/tmp/repro$ git annex add a.txt+ add a.txt (checksum...) ok+ (Recording state in git...)+ ...:/tmp/repro$ git commit -m "add file"+ [master (root-commit) bf53ce2] add file+ 1 file changed, 1 insertion(+)+ create mode 120000 a.txt+ ...:/tmp/repro$ git annex whereis a.txt+ whereis a.txt (1 copy) + 5c028c6a-2c5e-11e2-bb9c-17bd7ce81377 -- here (test)+ ok+ ...:/tmp/repro$ git annex unlock a.txt+ unlock a.txt (copying...) ok+ ...:/tmp/repro$ git annex whereis a.txt++What is the expected output? What do you see instead?++ I'd expect that whereis executed on an unlocked file would behave like whereis executed on a locked file.++What version of git-annex are you using? On what operating system?++ $ cat /etc/issue+ Ubuntu 12.04.1 LTS \n \l++ $ git-annex version+ git-annex version: 3.20120406+ local repository version: 3+ default repository version: 3+ supported repository versions: 3+ upgrade supported from repository versions: 0 1 2++ $ uname -a+ Linux ... 3.2.0-31-generic #50-Ubuntu SMP Fri Sep 7 16:16:45 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux++Please provide any additional information below.
@@ -0,0 +1,39 @@+### Please describe the problem.++My windows install (2013-09-09) fails "quick checks" when running "git annex test". See below the errors from two seperate runs of the test in two fresh empty directories:++*** Failed! Exception: 'recoverEncode: invalid argument (invalid character)' (after 13 tests): +Key {keyName = "\140\DEL\159/\RS'", keyBackendName = "WQACSWJDVY", keySize = Just 6, keyMtime = Just 3}+prop_idempotent_configEscape++*** Failed! Exception: 'recoverEncode: invalid argument (invalid character)' (after 4 tests): +Key {keyName = "\130", keyBackendName = "Y", keySize = Nothing, keyMtime = Nothing}+prop_idempotent_configEscape++### What steps will reproduce the problem?++create a directory+cd to it in cmd or Git Bash+run "git annex test"+++### What version of git-annex are you using? On what operating system?++OS Name: Microsoft Windows 7 Professional (64bit)+OS Version: 6.1.7601 Service Pack 1 Build 7601++Install Git-1.8.3-preview20130601 (third option to add git and tools to path)+Install git-annex-installer (2013-09-09)++### 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.+"""]]++> I've released a fix for this problem. Thanks for reporting! [[done]]+> --[[Joey]]
@@ -0,0 +1,30 @@+### Please describe the problem.+When installing the windows aplha dated 2013-06-21 12:17 it gives an error:++Error opening file for writing:+c:\program files (x86)\Git\cmd\git-annex.exe+Abort,retry or ignore?++If you run as administrator it works.++++### What steps will reproduce the problem?++Download the alpha installer and run as normal user.++### What version of git-annex are you using? On what operating system?+Windows 7 64 bit+++### Please provide any additional information below.++[[!format sh """+# If you can, paste a complete transcript of the problem occurring here.+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log+++# End of transcript or log.+"""]]++[[!meta title="windows installer fails unless run as admin user"]]
@@ -0,0 +1,250 @@+### Please describe the problem.+Using the windows port of git annex, I'm unable to directly access files that are retrieved from a remote ssh repository. Instead, the file contains a reference to ../.git/annex/objects....++**Update** This appears to be a problem with remote bare repositories only. I was able to get from a remote regular git repository without the stand-in symlinks. The stand-in symlink file gets replaced with the real content on "get" using a non-base repository.++### What steps will reproduce the problem?++[[!format sh """+** on ssh server **++git init --bare annex.git+cd annex.git+git annex init origin++** on windows laptop - add content main repository ** +git init annex+cd annex+git annex init laptop++git remote add origin ssh://xxxxx/~/annex.git+echo hello > foo.txt+git annex add .+git commit -m "done"+git annex sync+git annex copy --to origin+git annex sync+git annex whereis foo.txt++** on windows laptop - backup repository **++cd ..+git init annex.backup+cd annex.backup+git annex init "backup"+git remote add origin ssh://joebo@xxxxx.com/~/annex.git+git fetch origin+git merge origin/synced/master+git annex sync+git annex get .+find . | xargs grep hello+./.git/annex/objects/d91/b11/SHA256E-s6--5891b5b522d5df086d0ff0b110fbd9d21bb4fc7+163af34d08286a2e846f6be03.txt/SHA256E-s6--5891b5b522d5df086d0ff0b110fbd9d21bb4fc+7163af34d08286a2e846f6be03.txt:hello++** updating the file from windows laptop **+cd ..\annex+echo hello2 > foo.txt+git annex add .+git commit -m "updated"+git annex sync+git annex copy --to origin+git annex sync ++cd ..\annex.backup+git fetch origin+git merge origin/synced/master+get annex sync+git annex get .+find . | xargs grep hello2+./.git/annex/objects/7ed/895/SHA256E-s9--3f70947299d2926028fd0107c4309e65ca33a9a+e0175fc4bc57792ca17240d18.txt/SHA256E-s9--3f70947299d2926028fd0107c4309e65ca33a9+ae0175fc4bc57792ca17240d18.txt:hello2+"""]]++++### What version of git-annex are you using? On what operating system?++ git-annex version: 4.20130601-gc01f842+ build flags: Pairing Testsuite S3 WebDAV DNS+ local repository version: 4+ default repository version: 3+ supported repository versions: 3 4+ upgrade supported from repository versions: 2+++### 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++joebo@joebo:~$ sudo rm -rf annex.git+joebo@joebo:~$ git init --bare annex.git+Initialized empty Git repository in /home/joebo/annex.git/+joebo@joebo:~$ cd annex.git+joebo@joebo:~/annex.git$ git annex init origin+init origin ok++++C:\Users\joebo>cd annex++C:\Users\joebo\annex>git annex init laptop+init laptop+ Detected a crippled filesystem.++ Enabling direct mode.++ Detected a filesystem without fifo support.++ Disabling ssh connection caching.+ok+(Recording state in git...)++C:\Users\joebo\annex>+C:\Users\joebo\annex>git remote add origin ssh://joebo@xxxxx.com/~+cho hello > foo.txt++C:\Users\joebo\annex>git annex add .+add foo.txt (checksum...) ok+(Recording state in git...)++C:\Users\joebo\annex>git commit -m "done"+[master (root-commit) 7f54efa] done+ 1 file changed, 1 insertion(+)+ create mode 120000 foo.txt++C:\Users\joebo\annex>git annex sync+commit+ok+pull origin+warning: no common commits+remote: Counting objects: 5, done.+remote: Compressing objects: 100% (3/3), done.+remote: Total 5 (delta 1), reused 0 (delta 0)+Unpacking objects: 100% (5/5), done.+From ssh://xxxxx.com/~/annex+ * [new branch] git-annex -> origin/git-annex+ok+(merging origin/git-annex into git-annex...)+(Recording state in git...)+push origin+Counting objects: 18, done.+Delta compression using up to 4 threads.+Compressing objects: 100% (12/12), done.+Writing objects: 100% (16/16), 1.48 KiB, done.+Total 16 (delta 1), reused 0 (delta 0)+To ssh://joebo@xxxxx.com/~/annex.git+ * [new branch] git-annex -> synced/git-annex+ * [new branch] master -> synced/master+ok++C:\Users\joebo\annex>git annex copy --to origin+copy foo.txt (checking origin...) (to origin...)+foo.txt+ 0 100% 0.00kB/s 0:00:00 (xfer#1, to-check=0/1)++sent 67 bytes received 31 bytes 65.33 bytes/sec+total size is 0 speedup is 0.00+ok+(Recording state in git...)++C:\Users\joebo\annex>git annex sync+commit+ok+pull origin+ok+push origin+Counting objects: 9, done.+Delta compression using up to 4 threads.+Compressing objects: 100% (4/4), done.+Writing objects: 100% (5/5), 446 bytes, done.+Total 5 (delta 1), reused 0 (delta 0)+To ssh://joebo@xxxxx.com/~/annex.git+ ed1a701..c4c9cd0 git-annex -> synced/git-annex+ok++C:\Users\joebo\annex>git annex whereis foo.txt+whereis foo.txt (2 copies)+ 03573d86-d460-11e2-8500-ebab2910b225 -- origin+ 3b6b60fb-0979-4869-98de-38208182ab92 -- here (laptop)+ok+++C:\Users\joebo\annex>cd ..++C:\Users\joebo>git init annex.backup+Initialized empty Git repository in C:/Users/joebo/annex.backup/.git/++C:\Users\joebo>cd annex.backup++C:\Users\joebo\annex.backup>git annex init "backup"+init backup+ Detected a crippled filesystem.++ Enabling direct mode.++ Detected a filesystem without fifo support.++ Disabling ssh connection caching.+ok+(Recording state in git...)++C:\Users\joebo\annex.backup>git remote add origin ssh://joebo@xxxxx.com/~/anne+x.git++C:\Users\joebo\annex.backup>git fetch origin+warning: no common commits+remote: Counting objects: 25, done.+remote: Compressing objects: 100% (19/19), done.+remote: Total 25 (delta 4), reused 0 (delta 0)+Unpacking objects: 100% (25/25), done.+From ssh://xxxxx.com/~/annex+ * [new branch] git-annex -> origin/git-annex+ * [new branch] synced/git-annex -> origin/synced/git-annex+ * [new branch] synced/master -> origin/synced/master++C:\Users\joebo\annex.backup>git merge origin/synced/master++C:\Users\joebo\annex.backup>git annex sync+(merging origin/git-annex origin/synced/git-annex into git-annex...)+(Recording state in git...)+commit+ok+pull origin+ok+push origin+Counting objects: 12, done.+Delta compression using up to 4 threads.+Compressing objects: 100% (6/6), done.+Writing objects: 100% (8/8), 818 bytes, done.+Total 8 (delta 2), reused 0 (delta 0)+To ssh://joebo@xxxxx.com/~/annex.git+ c4c9cd0..f403560 git-annex -> synced/git-annex+ok++C:\Users\joebo\annex.backup>git annex get .+get foo.txt (from origin...)+SHA256E-s0--e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855.txt++ 0 100% 0.00kB/s 0:00:00 (xfer#1, to-check=0/1)++sent 30 bytes received 145 bytes 116.67 bytes/sec+total size is 0 speedup is 0.00+ok+(Recording state in git...)++C:\Users\joebo\annex.backup>cat foo.txt+.git/annex/objects/fW/Gk/SHA256E-s0--e3b0c44298fc1c149afbf4c8996fb92427ae41e4649+b934ca495991b7852b855.txt/SHA256E-s0--e3b0c44298fc1c149afbf4c8996fb92427ae41e464+9b934ca495991b7852b855.txt+C:\Users\joebo\annex.backup>ls+foo.txt+++# End of transcript or log.+"""]]++> [[done]]; see my comment. --[[Joey]]
@@ -0,0 +1,559 @@+### Please describe the problem.++Using a centralized remote repository, new files that are added to the repository after it's pulled cannot be directly accessed - instead are pulled as symlinks.++The workaround is to create a new remote repository that clones from the source. That repo can pull all files correctly++### What steps will reproduce the problem?++The following script works fine when everything is run on a linux box. If the same script is run on the windows box, it will not show foo2.txt in the repository clone. foo.txt is still valid.++a file, testrepo.sh is set up on the server to simplify the creation of the repo for testing++**testrepo.sh**+[[!format sh """++rm -rf repo.git+git init --bare repo.git+cd repo.git+git annex init origin+git annex sync+++"""]]++**test script**+[[!format sh """++ssh joebo@xxxxx sh testrepo.sh+++rm -rf repo+git init repo+cd repo++git annex init+git remote add origin ssh://joebo@xxxxx/~/repo.git+echo hello > foo.txt+git annex add .+git commit -m "initial commit"+git annex sync+git annex copy --to origin+git annex sync++cd ..+rm -rf repo-bak+git init repo-bak+cd repo-bak+git remote add origin ssh://joebo@xxxxx/~/repo.git+git fetch origin+git merge origin/synced/master+git annex sync+git annex get .+cat foo.txt #works just fine!++cd ..+cd repo+echo foo2 > foo2.txt+git annex add .+git commit -m "another"+git annex sync+git annex copy --to origin+git annex sync++cd ..+cd repo-bak+git annex sync++## throws a fastforward error:+commit+ok+pull origin+remote: Counting objects: 21, done.+remote: Compressing objects: 100% (14/14), done.+remote: Total 16 (delta 3), reused 0 (delta 0)+Unpacking objects: 100% (16/16), done.+From ssh://xxxx.com/~/repo+ c5ed8e1..7ea5586 synced/git-annex -> origin/synced/git-annex+ a8402ae..1a72b3d synced/master -> origin/synced/master+ok+(merging origin/synced/git-annex into git-annex...)+(Recording state in git...)+push origin+Counting objects: 15, done.+Delta compression using up to 4 threads.+Compressing objects: 100% (7/7), done.+Writing objects: 100% (8/8), 844 bytes, done.+Total 8 (delta 2), reused 0 (delta 0)+To ssh://joebo@xxxx.com/~/repo.git+ 7ea5586..5df3c85 git-annex -> synced/git-annex+ ! [rejected] master -> synced/master (non-fast-forward)+error: failed to push some refs to 'ssh://joebo@xxx.com/~/repo.git'+hint: Updates were rejected because a pushed branch tip is behind its remote+hint: counterpart. Check out this branch and merge the remote changes+hint: (e.g. 'git pull') before pushing again.+hint: See the 'Note about fast-forwards' in 'git push --help' for details.+failed+git-annex: sync: 1 failed+"""]]++If I try to work around it by merging, then I get the symlink in the file after getting+++[[!format sh """++C:\joe\backup\repo-bak>git merge origin/synced/master+Updating f586b6a..fcae7bc+Fast-forward+ foo2.txt | 1 ++ 1 file changed, 1 insertion(+)+ create mode 120000 foo2.txt++C:\joe\backup\repo-bak>git annex get foo2.txt+get foo2.txt (from origin...)+SHA256E-s7--eef0e29200a3194851e5fb4ff77d0d0aec5cd3f5ccd78762e80a45f0bbece05f.txt++ 7 100% 6.84kB/s 0:00:00 (xfer#1, to-check=0/1)++sent 30 bytes received 156 bytes 124.00 bytes/sec+total size is 7 speedup is 0.04+ok+warning: LF will be replaced by CRLF in C:\joe\backup\repo-bak\.git\annex\journa+l\fba_8bb_SHA256E-s7--eef0e29200a3194851e5fb4ff77d0d0aec5cd3f5ccd78762e80a45f0bb+ece05f.txt.log.+The file will have its original line endings in your working directory.+(Recording state in git...)++C:\joe\backup\repo-bak>cat foo2.txt+.git/annex/objects/3V/kM/SHA256E-s7--eef0e29200a3194851e5fb4ff77d0d0aec5cd3f5ccd+78762e80a45f0bbece05f.txt/SHA256E-s7--eef0e29200a3194851e5fb4ff77d0d0aec5cd3f5cc+d78762e80a45f0bbece05f.txt++"""]]++removing the backup repository and starting over works:++[[!format sh """++C:\joe\backup>git init repo-bak+Initialized empty Git repository in C:/joe/backup/repo-bak/.git/++C:\joe\backup>cd repo-bak++C:\joe\backup\repo-bak>git remote add origin ssh://joebo@xxxx.com/~/repo.git++C:\joe\backup\repo-bak>git fetch origin+remote: Counting objects: 57, done.+remote: Compressing objects: 100% (48/48), done.+remote: Total 57 (delta 20), reused 0 (delta 0)+Unpacking objects: 100% (57/57), done.+From ssh://xxxx.com/~/repo+ * [new branch] git-annex -> origin/git-annex+ * [new branch] synced/git-annex -> origin/synced/git-annex+ * [new branch] synced/master -> origin/synced/master++C:\joe\backup\repo-bak>git merge origin/synced/master++C:\joe\backup\repo-bak>git annex sync++ Detected a crippled filesystem.++ Enabling direct mode.++ Detected a filesystem without fifo support.++ Disabling ssh connection caching.+warning: LF will be replaced by CRLF in C:\joe\backup\repo-bak\.git\annex\journa+l\uuid.log.+The file will have its original line endings in your working directory.+(merging origin/git-annex origin/synced/git-annex into git-annex...)+(Recording state in git...)+commit+ok+pull origin+ok+push origin+Counting objects: 9, done.+Delta compression using up to 4 threads.+Compressing objects: 100% (4/4), done.+Writing objects: 100% (5/5), 533 bytes, done.+Total 5 (delta 3), reused 0 (delta 0)+To ssh://joebo@xxxx.com/~/repo.git+ 5038806..67d6383 git-annex -> synced/git-annex+ok++C:\joe\backup\repo-bak>git annex get .+get foo.txt (from origin...)+SHA256E-s8--f873eef4f852e335da367d76ce7f1973c15b8ffebf532b064df4bc691cd51a87.txt++ 8 100% 7.81kB/s 0:00:00 (xfer#1, to-check=0/1)++sent 30 bytes received 157 bytes 124.67 bytes/sec+total size is 8 speedup is 0.04+ok+get foo2.txt (from origin...)+SHA256E-s7--eef0e29200a3194851e5fb4ff77d0d0aec5cd3f5ccd78762e80a45f0bbece05f.txt++ 7 100% 6.84kB/s 0:00:00 (xfer#1, to-check=0/1)++sent 30 bytes received 156 bytes 124.00 bytes/sec+total size is 7 speedup is 0.04+ok+warning: LF will be replaced by CRLF in C:\joe\backup\repo-bak\.git\annex\journa+l\fba_8bb_SHA256E-s7--eef0e29200a3194851e5fb4ff77d0d0aec5cd3f5ccd78762e80a45f0bb+ece05f.txt.log.+The file will have its original line endings in your working directory.+warning: LF will be replaced by CRLF in C:\joe\backup\repo-bak\.git\annex\journa+l\ae4_1e9_SHA256E-s8--f873eef4f852e335da367d76ce7f1973c15b8ffebf532b064df4bc691c+d51a87.txt.log.+The file will have its original line endings in your working directory.+(Recording state in git...)++C:\joe\backup\repo-bak>cat *+hello+foo2++C:\joe\backup\repo-bak>ls -lah+total 5.0k+drwxr-xr-x 1 jbogner Administ 0 Jun 15 08:44 .+drwxr-xr-x 23 jbogner Administ 4.0k Jun 15 08:43 ..+drwxr-xr-x 1 jbogner Administ 4.0k Jun 15 08:44 .git+-rw-r--r-- 1 jbogner Administ 8 Jun 15 08:44 foo.txt+-rw-r--r-- 1 jbogner Administ 7 Jun 15 08:44 foo2.txt++C:\joe\backup\repo-bak>++"""]]++### What version of git-annex are you using? On what operating system?++Windows:++ C:\joe\backup\repo-bak>git annex version+ git-annex version: 4.20130614-g3a93e24+ build flags: Pairing Testsuite S3 WebDAV DNS+ local repository version: 4+ default repository version: 3+ supported repository versions: 3 4+ upgrade supported from repository versions: 2+++Linux:++ git-annex version: 4.20130531-g5df09b5+ build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP+++### Please provide any additional information below.++[[!format sh """+# If you can, paste a complete transcript of the problem occurring here.+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log++C:\joe\backup>cd repo++C:\joe\backup\repo>git annex init+init+ Detected a crippled filesystem.++ Enabling direct mode.++ Detected a filesystem without fifo support.++ Disabling ssh connection caching.+ok+warning: LF will be replaced by CRLF in C:\joe\backup\repo\.git\annex\journal\uu+id.log.+The file will have its original line endings in your working directory.+(Recording state in git...)++C:\joe\backup\repo>git remote add origin ssh://joebo@xxxx.com/~/repo.git++C:\joe\backup\repo>echo hello 1>foo.txt++C:\joe\backup\repo>git annex add .+add foo.txt (checksum...) ok+(Recording state in git...)+warning: LF will be replaced by CRLF in C:\joe\backup\repo\.git\annex\journal\ae+4_1e9_SHA256E-s8--f873eef4f852e335da367d76ce7f1973c15b8ffebf532b064df4bc691cd51a+87.txt.log.+The file will have its original line endings in your working directory.++C:\joe\backup\repo>git commit -m "initial commit"+[master (root-commit) 47c05ea] initial commit+ 1 file changed, 1 insertion(+)+ create mode 120000 foo.txt++C:\joe\backup\repo>git annex sync+commit+ok+pull origin+warning: no common commits+remote: Counting objects: 5, done.+remote: Compressing objects: 100% (3/3), done.+remote: Total 5 (delta 1), reused 0 (delta 0)+Unpacking objects: 100% (5/5), done.+From ssh://xxxx.com/~/repo+ * [new branch] git-annex -> origin/git-annex+ok+(merging origin/git-annex into git-annex...)+(Recording state in git...)+push origin+Counting objects: 18, done.+Delta compression using up to 4 threads.+Compressing objects: 100% (12/12), done.+Writing objects: 100% (16/16), 1.40 KiB, done.+Total 16 (delta 3), reused 0 (delta 0)+To ssh://joebo@xxxx.com/~/repo.git+ * [new branch] git-annex -> synced/git-annex+ * [new branch] master -> synced/master+ok++C:\joe\backup\repo>git annex copy --to origin+copy foo.txt (checking origin...) (to origin...)+foo.txt+ 8 100% 0.00kB/s 0:00:00 (xfer#1, to-check=0/1)++sent 79 bytes received 31 bytes 73.33 bytes/sec+total size is 8 speedup is 0.07+ok+warning: LF will be replaced by CRLF in C:\joe\backup\repo\.git\annex\journal\ae+4_1e9_SHA256E-s8--f873eef4f852e335da367d76ce7f1973c15b8ffebf532b064df4bc691cd51a+87.txt.log.+The file will have its original line endings in your working directory.+(Recording state in git...)++C:\joe\backup\repo>git annex sync+commit+ok+pull origin+ok+push origin+Counting objects: 9, done.+Delta compression using up to 4 threads.+Compressing objects: 100% (4/4), done.+Writing objects: 100% (5/5), 450 bytes, done.+Total 5 (delta 1), reused 0 (delta 0)+To ssh://joebo@xxxx.com/~/repo.git+ bd52e5f..02a0a4a git-annex -> synced/git-annex+ok++C:\joe\backup\repo>cd ..++C:\joe\backup>rm -rf repo-bak++C:\joe\backup>git init repo-bak+Initialized empty Git repository in C:/joe/backup/repo-bak/.git/++C:\joe\backup>cd repo-bak++C:\joe\backup\repo-bak>git remote add origin ssh://joebo@xxxx.com/~/repo.git++C:\joe\backup\repo-bak>git fetch origin+remote: Counting objects: 25, done.+remote: Compressing objects: 100% (19/19), done.+remote: Total 25 (delta 6), reused 0 (delta 0)+Unpacking objects: 100% (25/25), done.+From ssh://xxxx.com/~/repo+ * [new branch] git-annex -> origin/git-annex+ * [new branch] synced/git-annex -> origin/synced/git-annex+ * [new branch] synced/master -> origin/synced/master++C:\joe\backup\repo-bak>git merge origin/synced/master++C:\joe\backup\repo-bak>git annex sync++ Detected a crippled filesystem.++ Enabling direct mode.++ Detected a filesystem without fifo support.++ Disabling ssh connection caching.+warning: LF will be replaced by CRLF in C:\joe\backup\repo-bak\.git\annex\journa+l\uuid.log.+The file will have its original line endings in your working directory.+(merging origin/git-annex origin/synced/git-annex into git-annex...)+(Recording state in git...)+commit+ok+pull origin+ok+push origin+Counting objects: 9, done.+Delta compression using up to 4 threads.+Compressing objects: 100% (4/4), done.+Writing objects: 100% (5/5), 610 bytes, done.+Total 5 (delta 1), reused 0 (delta 0)+To ssh://joebo@xxxx.com/~/repo.git+ 02a0a4a..88d19ce git-annex -> synced/git-annex+ok++C:\joe\backup\repo-bak>git annex get .+get foo.txt (from origin...)+SHA256E-s8--f873eef4f852e335da367d76ce7f1973c15b8ffebf532b064df4bc691cd51a87.txt++ 8 100% 7.81kB/s 0:00:00 (xfer#1, to-check=0/1)++sent 30 bytes received 157 bytes 124.67 bytes/sec+total size is 8 speedup is 0.04+ok+warning: LF will be replaced by CRLF in C:\joe\backup\repo-bak\.git\annex\journa+l\ae4_1e9_SHA256E-s8--f873eef4f852e335da367d76ce7f1973c15b8ffebf532b064df4bc691c+d51a87.txt.log.+The file will have its original line endings in your working directory.+(Recording state in git...)++C:\joe\backup\repo-bak>cat foo.txt+hello++C:\joe\backup\repo-bak>cd ..++C:\joe\backup>cd repo++C:\joe\backup\repo>echo foo2 1>foo2.txt++C:\joe\backup\repo>git annex add .+add foo2.txt (checksum...) ok+(Recording state in git...)+warning: LF will be replaced by CRLF in C:\joe\backup\repo\.git\annex\journal\fb+a_8bb_SHA256E-s7--eef0e29200a3194851e5fb4ff77d0d0aec5cd3f5ccd78762e80a45f0bbece0+5f.txt.log.+The file will have its original line endings in your working directory.++C:\joe\backup\repo>git commit -m "another"+[master 76a9e44] another+ 1 file changed, 1 insertion(+)+ create mode 120000 foo2.txt++C:\joe\backup\repo>git annex sync+commit+ok+pull origin+remote: Counting objects: 9, done.+remote: Compressing objects: 100% (4/4), done.+remote: Total 5 (delta 1), reused 0 (delta 0)+Unpacking objects: 100% (5/5), done.+From ssh://xxxx.com/~/repo+ 02a0a4a..88d19ce synced/git-annex -> origin/synced/git-annex+ok+(merging origin/synced/git-annex into git-annex...)+(Recording state in git...)+push origin+Counting objects: 16, done.+Delta compression using up to 4 threads.+Compressing objects: 100% (10/10), done.+Writing objects: 100% (11/11), 1.11 KiB, done.+Total 11 (delta 2), reused 0 (delta 0)+To ssh://joebo@xxxx.com/~/repo.git+ 88d19ce..f47091a git-annex -> synced/git-annex+ 47c05ea..76a9e44 master -> synced/master+ok++C:\joe\backup\repo>git annex copy --to origin+copy foo.txt (checking origin...) ok+copy foo2.txt (checking origin...) (to origin...)+foo2.txt+ 7 100% 0.00kB/s 0:00:00 (xfer#1, to-check=0/1)++sent 79 bytes received 31 bytes 73.33 bytes/sec+total size is 7 speedup is 0.06+ok+warning: LF will be replaced by CRLF in C:\joe\backup\repo\.git\annex\journal\fb+a_8bb_SHA256E-s7--eef0e29200a3194851e5fb4ff77d0d0aec5cd3f5ccd78762e80a45f0bbece0+5f.txt.log.+The file will have its original line endings in your working directory.+(Recording state in git...)++C:\joe\backup\repo>git annex sync+commit+ok+pull origin+ok+push origin+Counting objects: 9, done.+Delta compression using up to 4 threads.+Compressing objects: 100% (4/4), done.+Writing objects: 100% (5/5), 477 bytes, done.+Total 5 (delta 1), reused 0 (delta 0)+To ssh://joebo@xxxx.com/~/repo.git+ f47091a..98082cb git-annex -> synced/git-annex+ok++C:\joe\backup\repo>cd ..++C:\joe\backup>cd repo-bak++C:\joe\backup\repo-bak>git annex sync+commit+ok+pull origin+remote: Counting objects: 21, done.+remote: Compressing objects: 100% (14/14), done.+remote: Total 16 (delta 4), reused 0 (delta 0)+Unpacking objects: 100% (16/16), done.+From ssh://xxxx.com/~/repo+ 88d19ce..98082cb synced/git-annex -> origin/synced/git-annex+ 47c05ea..76a9e44 synced/master -> origin/synced/master+ok+(merging origin/synced/git-annex into git-annex...)+(Recording state in git...)+push origin+Counting objects: 15, done.+Delta compression using up to 4 threads.+Compressing objects: 100% (7/7), done.+Writing objects: 100% (8/8), 843 bytes, done.+Total 8 (delta 2), reused 0 (delta 0)+To ssh://joebo@xxxx.com/~/repo.git+ 98082cb..2537203 git-annex -> synced/git-annex+ ! [rejected] master -> synced/master (non-fast-forward)+error: failed to push some refs to 'ssh://joebo@xxxx.com/~/repo.git'+hint: Updates were rejected because a pushed branch tip is behind its remote+hint: counterpart. Check out this branch and merge the remote changes+hint: (e.g. 'git pull') before pushing again.+hint: See the 'Note about fast-forwards' in 'git push --help' for details.+failed+git-annex: sync: 1 failed++C:\joe\backup\repo-bak>git annex get foo2.txt+git-annex: foo2.txt not found++C:\joe\backup\repo-bak>cat foo2.txt+cat: foo2.txt: No such file or directory+C:\joe\backup\repo-bak>git pull origin synced/master+From ssh://xxxx.com/~/repo+ * branch synced/master -> FETCH_HEAD+Updating 47c05ea..76a9e44+Fast-forward+ foo2.txt | 1 ++ 1 file changed, 1 insertion(+)+ create mode 120000 foo2.txt++C:\joe\backup\repo-bak>git annex get foo2.txt+get foo2.txt (from origin...)+SHA256E-s7--eef0e29200a3194851e5fb4ff77d0d0aec5cd3f5ccd78762e80a45f0bbece05f.txt++ 7 100% 6.84kB/s 0:00:00 (xfer#1, to-check=0/1)++sent 30 bytes received 156 bytes 124.00 bytes/sec+total size is 7 speedup is 0.04+ok+warning: LF will be replaced by CRLF in C:\joe\backup\repo-bak\.git\annex\journa+l\fba_8bb_SHA256E-s7--eef0e29200a3194851e5fb4ff77d0d0aec5cd3f5ccd78762e80a45f0bb+ece05f.txt.log.+The file will have its original line endings in your working directory.+(Recording state in git...)++C:\joe\backup\repo-bak>cat foo2.txt+.git/annex/objects/3V/kM/SHA256E-s7--eef0e29200a3194851e5fb4ff77d0d0aec5cd3f5ccd+78762e80a45f0bbece05f.txt/SHA256E-s7--eef0e29200a3194851e5fb4ff77d0d0aec5cd3f5cc+d78762e80a45f0bbece05f.txt+C:\joe\backup\repo-bak>++++# End of transcript or log.+"""]]++> Apparently the last of the issues discussed here is fixed.+> Closing this bug report before it grows a new issue. ;) [[done]] --[[Joey]]
@@ -0,0 +1,8 @@+Run *git annex webapp* in Debian Sid with KDE.++It opens the web browser with this error: **Internal Server Error** *xdg-user-dir ["DESKTOP"] exited 127*.++I've tried to changing the xdg-user-dir config with no success.++> This is fixed in my master branch. Workaround: Install the xdg-user-dirs+> package. [[done]] --[[Joey]]
@@ -0,0 +1,107 @@+The way [[XMPP pairing|design/assistant/XMPP]] currently works, each+separate repository needs to use a different XMPP account. If two+repositories use the same XMPP account, then they will be combined together+when XMPP pairing takes place.++There are two different UIs for XMPP pairing. While the same protocol+is running behind the scenes, these UIs should be considered separately.++## Share with your other devices++Here, I think it makes sense to require the user to use the same XMPP+account on all their devices (otherwise it's pairing with a friend), and+automatically combine repositories of devices that use the same XMPP+account.++The UI is pretty clear about this:++ If you have multiple devices, all running git-annex, and using #+ your Jabber account #{account}, you can configure them to share #+ your files between themselves.++Doing it this way avoids needing to confirm pair requests coming from the same+XMPP account. Which means that, for example, you can have a device at home,+and one at work, and pair them by simply initiating a pair request from one+to the other. You don't have to travel between home and work to confirm +the request.++(Also, when you have a lot of devices, this avoids a combinatorial explosion+of pair request confirmations.)++The only problem with this is that users who want multiple repositories+need to find multiple XMPP accounts. However, I'm inclined to think this is+a reasonable requirement.++## Share with a friend++Suppose that Alice wants to share with Bob. Bob is using the same XMPP+account for two separate repositories (B1 and B2), that are not+themselves paired.++When Alice chooses to share with Bob, a XMPP pair request is sent.+Both of Bob's repositories see it, and both ask him to confirm.+Bob can choose to only confirm the request in B1, and +not in B2. This should work ok.++* The UI for this only says "Pair request received from #{name}",+ it does not indicate which repository of Alice's is being paired+ with. This could be improved. If Alice has two repositories as well,+ she and Bob will want to coordinate pairing the right ones together.+ Could be fixed by just displaying the description of Alice's repository+ to Bob.++-----++Now, suppose that Alice makes a second, distinct repository (A2),+and chooses to share it with Bob (intending to share with B2). This+sends an XMPP pair request to both of Bob's repositories.++B1 has already paired with Alice, so it assumes this+new pair request is from a different device belonging to Alice, and it+automatically ACKs the pair request. ++The result is that Alice's new A2 repository combines with B1,+which is already combined with A1. Effectively combining all of A1, A2, B1,+and B2, unexpectedly. **This is a bug**.++Some possible fixes:++1. Stop auto-accepting pair requests+ from friends we're already paired with. Require another confirmation.+2. Or, only auto-accept pair requests from friends we're already paired with+ when they come from a repository whose UUID we already know. This+ enhancment to fix #1 makes it easier to build more robust networks of+ repositories. **done**++Hmm, I don't think those fixes are sufficient. Suppose they're in place.+Then when Alice shares A2 with Bob, both his repositories will ask him to+confirm the pair request. He confirms in B2, and pairing proceeds.++But, XMPP git push is broadcast to all clients of an XMPP account.+So when B2 sends a push, A1 sees it, and happily merges away. The+repositories still combine!++So, we need another fix:++* Send UUID in XMPP git push protocol messages. Only respond to git push+ messages from a known UUID, and ignore all others. (XMPP pairing+ already sends the UUID, so it will be known.) **done**++----++* Alternatively, we could say that the problem is that Bob has two + distinct repositories using the same XMPP account, and try to prevent+ him from doing that in the first place. + + One way to do this would be, when configuring the+ XMPP account, scan for other repositories using the same account, and+ don't let it be used unless the user confirms they want to pair them.+ But, this doesn't seem viable because if the other repository is on+ another device, which is turned off, this check wouldn't see it.++ Or there could be a warning about account reuse. Doesn't seem likely to+ be effective.++-----++> [[done]]. I've put in the fixes around pairing with friends. --[[Joey]]
@@ -0,0 +1,10 @@+Seems like there is a needed dependancy, yesod-default is needed on OSX.++<pre>+Utility/Yesod.hs:10:8:+ Could not find module `Yesod.Default.Util'+ Use -v to see a list of the files searched for.+make: *** [git-annex] Error 1+</pre>++> Only on OSX apparently. Weird. Added. [[done]] --[[Joey]]
@@ -0,0 +1,23 @@+What steps will reproduce the problem?++build using cabal from a git checkout++What is the expected output? What do you see instead?++successful build; error message is:++Assistant/WebApp/Form.hs:15:8:+ Could not find module `Yesod.Form.Fields'+ It is a member of the hidden package `yesod-form-1.2.0'.+ Perhaps you need to add `yesod-form' to the build-depends in your .cabal file.+++What version of git-annex are you using? On what operating system?++git checkout commit 90b62db1defdd223294935ec0bbaac883cd20c04 on OS X Lion++Please provide any additional information below.++adding yesod-form to the build depends in git-annex.cabal does indeed fix the problem!++> [[done]] --[[Joey]]
@@ -0,0 +1,62 @@+### Please describe the problem.++[[This|design/assistant/blog/day_314__quvi/]] says that I can download youtube videos with git-annex, but I can't - it downloads the HTML of the page instead!++### What steps will reproduce the problem?++ git annex addurl http://www.youtube.com/watch?v=BTzNLhxPzjo++Should have downloaded a Bill Hicks video, instead it downloads the HTML.++### What version of git-annex are you using? On what operating system?++[[!format txt """+git-annex version: 4.20130912-ga1faca3+build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP DNS Feeds Quvi+local repository version: 3+default repository version: 3+supported repository versions: 3 4+upgrade supported from repository versions: 0 1 2+"""]]++Note that quvi is still capable of fetching that video, no problem there.++### Please provide any additional information below.++[[!format sh """+# If you can, paste a complete transcript of the problem occurring here.+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log+anarcat@marcos:clips$ git annex addurl http://www.youtube.com/watch?v=BTzNLhxPzjo+addurl www.youtube.com_watch_v=BTzNLhxPzjo ok+anarcat@marcos:clips$ file www.youtube.com_watch_v\=BTzNLhxPzjo+www.youtube.com_watch_v=BTzNLhxPzjo: broken symbolic link to `.git/annex/objects/qZ/q1/SHA256E-s123162--96fe8634aaf035373077473ac2b166c5ad22bfe099112c414eee9fe753f4ce2b/SHA256E-s123162--96fe8634aaf035373077473ac2b166c5ad22bfe099112c414eee9fe753f4ce2b'+anarcat@marcos:clips$ file www.youtube.com_watch_v\=BTzNLhxPzjo ^C+anarcat@marcos:clips$ file .git/annex/objects/qZ/q1/SHA256E-s123162--96fe8634aaf035373077473ac2b166c5ad22bfe099112c414eee9fe753f4ce2b/SHA256E-s123162--96fe8634aaf035373077473ac2b166c5ad22bfe099112c414eee9fe753f4ce2b+.git/annex/objects/qZ/q1/SHA256E-s123162--96fe8634aaf035373077473ac2b166c5ad22bfe099112c414eee9fe753f4ce2b/SHA256E-s123162--96fe8634aaf035373077473ac2b166c5ad22bfe099112c414eee9fe753f4ce2b: ERROR: cannot open `.git/annex/objects/qZ/q1/SHA256E-s123162--96fe8634aaf035373077473ac2b166c5ad22bfe099112c414eee9fe753f4ce2b/SHA256E-s123162--96fe8634aaf035373077473ac2b166c5ad22bfe099112c414eee9fe753f4ce2b' (No such file or directory)+anarcat@marcos:clips$ git annex get www.youtube.com_watch_v\=BTzNLhxPzjo+get www.youtube.com_watch_v=BTzNLhxPzjo (from web...)+--2013-09-14 17:24:23-- http://www.youtube.com/watch?v=BTzNLhxPzjo+Résolution de www.youtube.com (www.youtube.com)... 173.194.43.96, 173.194.43.97, 173.194.43.98, ...+Connexion vers www.youtube.com (www.youtube.com)|173.194.43.96|:80...connecté.+requête HTTP transmise, en attente de la réponse...200 OK+Longueur: non spécifié [text/html]+Sauvegarde en : «/srv/video/clips/.git/annex/tmp/SHA256E-s123162--96fe8634aaf035373077473ac2b166c5ad22bfe099112c414eee9fe753f4ce2b»++ [ <=> ] 123 245 346K/s ds 0,3s++2013-09-14 17:24:23 (346 KB/s) - «/srv/video/clips/.git/annex/tmp/SHA256E-s123162--96fe8634aaf035373077473ac2b166c5ad22bfe099112c414eee9fe753f4ce2b» sauvegardé [123245]++ok+(Recording state in git...)+anarcat@marcos:clips$ file www.youtube.com_watch_v\=BTzNLhxPzjo+www.youtube.com_watch_v=BTzNLhxPzjo: symbolic link to `.git/annex/objects/qZ/q1/SHA256E-s123162--96fe8634aaf035373077473ac2b166c5ad22bfe099112c414eee9fe753f4ce2b/SHA256E-s123162--96fe8634aaf035373077473ac2b166c5ad22bfe099112c414eee9fe753f4ce2b'+anarcat@marcos:clips$ file .git/annex/objects/qZ/q1/SHA256E-s123162--96fe8634aaf035373077473ac2b166c5ad22bfe099112c414eee9fe753f4ce2b/SHA256E-s123162--96fe8634aaf035373077473ac2b166c5ad22bfe099112c414eee9fe753f4ce2b+.git/annex/objects/qZ/q1/SHA256E-s123162--96fe8634aaf035373077473ac2b166c5ad22bfe099112c414eee9fe753f4ce2b/SHA256E-s123162--96fe8634aaf035373077473ac2b166c5ad22bfe099112c414eee9fe753f4ce2b: HTML document, UTF-8 Unicode text, with very long lines+# End of transcript or log.+"""]]++### Workaround++Use the `quvi` prefix.++> Typo introduced in last release. [[fixed|done]] --[[Joey]]
@@ -0,0 +1,20 @@+[[!meta title="git-annex autobuild overview"]]++<h2>Linux i386</h2>+<iframe width=1024 scrolling=no frameborder=0 marginheight=0 marginwidth=0 src="https://downloads.kitenet.net/git-annex/autobuild/i386/">+</iframe>+<h2>Linux amd64</h2>+<iframe width=1024 scrolling=no frameborder=0 marginheight=0 marginwidth=0 src="https://downloads.kitenet.net/git-annex/autobuild/amd64/">+</iframe>+<h2>Android</h2>+<iframe width=1024 scrolling=no frameborder=0 marginheight=0 marginwidth=0 src="https://downloads.kitenet.net/git-annex/autobuild/android/">+</iframe>+<h2>OSX Mountain Lion</h2>+<iframe width=1024 scrolling=no frameborder=0 marginheight=0 marginwidth=0 src="https://downloads.kitenet.net/git-annex/autobuild/x86_64-apple-mountain-lion/">+</iframe>+<h2>OSX Lion</h2>+<iframe width=1024 scrolling=no frameborder=0 marginheight=0 marginwidth=0 src="http://www.sgenomics.org/~jtang/gitbuilder-git-annex-x00-x86_64-apple-darwin10.8.0-binary/">+</iframe>+<h2>Windows</h2>+<iframe width=1024 height=1024 scrolling=no frameborder=0 marginheight=0 marginwidth=0 src="https://qa.nest-initiative.org/view/msysGit/job/msysgit-git-annex-assistant-test/">+</iframe>
@@ -0,0 +1,92 @@+If you do nothing else, avoid use of partial functions from the Prelude!+`import Utility.PartialPrelude` helps avoid this by defining conflicting+functions for all the common ones. Also avoid `!!`, it's partial too.++Use tabs for indentation. The one exception to this rule are+the Hamlet format files in `templates/*`. Hamlet, infuriatingly, refuses+to allow tabs to be used for indentation.++Code should make sense with any tab stop setting, but 8 space tabs are+the default. With 8 space tabs, code should not exceed 80 characters+per line. (With larger tabs, it may of course.)++Use spaces for layout. For example, here spaces (indicated with `.`)+are used after the initial tab to make the third test line up with+the others.++ when (foo_test || bar_test ||+ ......some_other_long_test)+ print "hi"++As a special Haskell-specific rule, "where" clauses are indented with two+spaces, rather than a tab. This makes them stand out from the main body+of the function, and avoids excessive indentation of the where cause content.+The definitions within the where clause should be put on separate lines,+each indented with a tab.++ main = do+ foo+ bar+ foo+ where+ foo = ...+ bar = ...++Where clauses for instance definitions and modules tend to appear at the end+of a line, rather than on a separate line.++ module Foo (Foo, mkFoo, unFoo) where+ instance MonadBaseControl IO Annex where++When a function's type signature needs to be wrapped to another line,+it's typical to switch to displaying one parameter per line.++ foo :: Bar -> Baz -> (Bar -> Baz) -> IO Baz++ foo'+ :: Bar+ -> Baz+ -> (Bar -> Baz)+ -> IO Baz+ +Note that the "::" then starts its own line. It is not put on the same+line as the function name because then it would not be guaranteed to line+up with the "->" at all tab width settings. Similarly, guards are put+on their own lines:++ splat i+ | odd i = error "splat!"+ | otherwise = i++Multiline lists and record syntax are written with leading commas,+that line up with the open and close punctuation.++ list =+ [ item1+ , item2+ , item3+ ]++ foo = DataStructure+ { name = "bar"+ , address = "baz"+ }++Module imports are separated into two blocks, one for third-party modules,+and one for modules that are part of git-annex. (Additional blocks can be used+if it makes sense.)++Using tabs for indentation makes use of `let .. in` particularly tricky.+There's no really good way to bind multiple names in a let clause with+tab indentation. Instead, a where clause is typically used. To bind a single+name in a let clause, this is sometimes used:++ foo = let x = 42+ in x + (x-1) + x++-----++If you feel that this coding style leads to excessive amounts of horizontal+or vertical whitespace around your code, making it hard to fit enough of it+on the screen, consider finding a better abstraction, so the code that+does fit on the screen is easily understandable. ;)
@@ -0,0 +1,9 @@+[[!sidebar content="""+[[!inline pages="comment_pending(*)" feedfile=pendingmoderation+description="comments pending moderation" show=-1]]+Comments in the [[!commentmoderation desc="moderation queue"]]:+[[!pagecount pages="comment_pending(*)"]]+"""]]++Recent comments posted to this site:+[[!inline pages="comment(*)" template="comment"]]
@@ -0,0 +1,11 @@+Joey Hess <joey@kitenet.net> is the author of git-annex. If you need to+talk about something privately, email me.++The [[forum]] is the best place to discuss git-annex.++For realtime chat, use the `#git-annex` channel on irc.oftc.net.+You can also watch incoming commits there.++The [VCS-home mailing list](http://lists.madduck.net/listinfo/vcs-home)+is a good mailing list for users who want to use git-annex in the context+of managing their large personal files.
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawlZQcpoRmyZBlsFQ7TMMYlZZdmBG1TxMzA"+ nickname="Felipe"+ subject="translation"+ date="2013-09-10T20:19:53Z"+ content="""+I would like to translate this content of site, the tutorials, pages, etc, to portuguese. I think that can help many users in my country. How can I build a new pages here with git-annex content in portuguese? +"""]]
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="4.154.4.51"+ subject="comment 2"+ date="2013-09-12T21:08:16Z"+ content="""+I welcome translations in theory, but I do not have any infrastructure in place to support it, so that would have to be the first step.++(Also, this page is not a general-purpose discussion forum.)+"""]]
@@ -0,0 +1,16 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawlkA6XinbeOdnEDxEGQUWyjqPGh0kdMXr4"+ nickname="Blake"+ subject="Starting git-annex assistant"+ date="2013-10-02T23:57:48Z"+ content="""+Hi Joey,++I am one of your original funders for git-annex. I think you have done a great job and I am proud to say I helped fund your endeavor.++How do I start the git-annex assistant webapp via command line? I installed the program on my Fedora 19 computer via YUM and it does not come packaged with a desktop icon as you show in your demonstration video. I try running `$ git annex assistant` but I cannot access `http://127.0.0.1:34795/` as you do in the video. Also, the quickstart page (http://git-annex.branchable.com/assistant/quickstart/) seems to have outdated information as it states you can start the webapp via `$ git annex webapp`, however when I try to run this I get the following error: `git-annex: unknown command webapp`.++Regards,+Blake++"""]]
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="108.236.230.124"+ subject="comment 4"+ date="2013-10-03T00:06:11Z"+ content="""+Your fedora build apparently does not include the webapp, since `git annex webapp` is the right command. Install the [[install/Linux_standalone]] build instead.++(Again this page is not a discussion forum. Next person to post here will waste my time since I will have to go configure the site to block comments here..)+"""]]
@@ -0,0 +1,38 @@+Annexed data is stored inside your git repository's `.git/annex` directory.+Some [[special_remotes]] can store annexed data elsewhere.++It's important that data not get lost by an ill-considered `git annex drop`+command. So, git-annex can be configured to try+to keep N copies of a file's content available across all repositories. +(Although [[untrusted_repositories|trust]] don't count toward this total.)++By default, N is 1; it is configured by annex.numcopies. This default+can be overridden on a per-file-type basis by the annex.numcopies+setting in `.gitattributes` files. The --numcopies switch allows+temporarily using a different value.++`git annex drop` attempts to check with other git remotes, to check that N+copies of the file exist. If enough repositories cannot be verified to have+it, it will retain the file content to avoid data loss. Note that+[[trusted_repositories|trust]] are not explicitly checked.++For example, consider three repositories: Server, Laptop, and USB. Both Server+and USB have a copy of a file, and N=1. If on Laptop, you `git annex get+$file`, this will transfer it from either Server or USB (depending on which+is available), and there are now 3 copies of the file.++Suppose you want to free up space on Laptop again, and you `git annex drop` the file+there. If USB is connected, or Server can be contacted, git-annex can check+that it still has a copy of the file, and the content is removed from+Laptop. But if USB is currently disconnected, and Server also cannot be+contacted, it can't verify that it is safe to drop the file, and will+refuse to do so.++With N=2, in order to drop the file content from Laptop, it would need access+to both USB and Server.++Note that different repositories can be configured with different values of+N. So just because Laptop has N=2, this does not prevent the number of+copies falling to 1, when USB and Server have N=1. To avoid this,+configure it in `.gitattributes`, which is shared between repositories+using git.
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://olivier.berger.myopenid.com/"+ nickname="obergix"+ subject="See also section on backups in walthroug"+ date="2013-08-25T05:37:04Z"+ content="""+See also [walthrough/backups](/walkthrough/backups/) for some details about copies. +"""]]
@@ -0,0 +1,8 @@+git-annex's high-level design is mostly inherent in the data that it+stores in git, and alongside git. See [[internals]] for details.++See [[encryption]] for design of encryption elements.++See [[roadmap]] for planning and scheduling of new stuff.++See [[assistant]] for the design site for the git-annex [[/assistant]].
@@ -0,0 +1,45 @@+These are the design pages for the git-annex [[/assistant]].++Parts of the design is still being fleshed out, still many ideas+and use cases to add. Feel free to chip in with comments! --[[Joey]]++See [[roadmap]] for current plans.++## initial development kickstarter year overview (2012-2013)++* Month 1 "like dropbox": [[!traillink inotify]] [[!traillink syncing]]+* Month 2 "shiny webapp": [[!traillink webapp]] [[!traillink progressbars]]+* Month 3 "easy setup": [[!traillink configurators]] [[!traillink pairing]]+* Month 4 "cloud": [[!traillink cloud]] [[!traillink transfer_control]]+* Month 5 "cloud continued": [[!traillink xmpp]] [[!traillink more_cloud_providers]]+* Month 6 "9k bonus round": [[!traillink desymlink]]+* Month 7: user-driven features and polishing;+ [presentation at LCA2013](http://mirror.linux.org.au/linux.conf.au/2013/mp4/gitannex.mp4)+* Month 8: [[!traillink Android]]+* Month 9: [[screencasts|videos]] and polishing+* Month 10: bugfixing, [[Android]] webapp+* Month 11: [[!traillink Windows]] porting, finishing touches+* Month 12: [presentation at SELF2013](http://www.southeastlinuxfest.org/), finishing touches++## porting++* [[OSX]] port is in fairly good shape, but still has some room for improvement+* [[android]] port is zooming along+* [[Windows]] port is barely getting started++## not yet on the map:++* [[rate_limiting]]+* [[partial_content]]+* [[deltas]]+* [[leftovers]]+* [[other todo items|todo]]++## polls++I post [[polls]] occasionally to make decisions. You can vote!++## blog++I'm blogging about my progress in the [[devblog]] on a semi-daily basis.+Follow along!
@@ -0,0 +1,13 @@+Misc OSX porting things:++* autostart the assistant on OSX, using launchd **done**+* icon to start webapp **done**+* use FSEvents to detect file changes (better than kqueue) **done**+* Use OSX's "network reachability functionality" to detect when on a network+ <http://developer.apple.com/library/mac/#documentation/Networking/Conceptual/SystemConfigFrameworks/SC_Intro/SC_Intro.html#//apple_ref/doc/uid/TP40001065>+* Switch from gpg to <https://gpgtools.org/>. According to a user,+ this is better because it can show a dialog window for password prompts.++Bugs:++[[!inline pages="tagged(design/assistant/OSX) and !link(bugs/done)" show=0 archive=yes]]
@@ -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,42 @@+The Android port is just about usable. Still, we have some fun todo items+to improve it.++## high-priority TODO++* [[bugs/Android_app_permission_denial_on_startup]]+* S3 doesn't work (at least to Internet Archive: + "connect: does not exist (connection refused)")+* Get app into Google Play and/or FDroid++## TODO++* Don't make app initially open terminal + webapp, but go to a page that+ allows opening the webapp or terminal. + Possibly, switch from running inside terminal app to real standalone app.+ See <https://github.com/neurocyte/android-haskell-activity>+ and <https://github.com/neurocyte/foreign-jni>.++* I have seen an assistant thread crash with an interrupted system call+ when the device went to sleep while it was running. Auto-detect and deal with+ that somehow.+* Make git stop complaining that "warning: no threads uspport, ignoring --threads"+* git does not support http remotes. To fix, need to port libcurl and+ allow git to link to it.+* getEnvironment is broken on Android <https://github.com/neurocyte/ghc-android/issues/7>+ and a few places use it. I have some horrible workarounds in place.+* Get local pairing to work. network-multicast and network-info don't+ currently install.+* Get test suite to pass. `git clone` of a local repo fails on android+ for some reason.+* Make app autostart on boot, optionally. <http://stackoverflow.com/questions/1056570/how-to-autostart-an-android-application>+* The app should be aware of power status, and avoid expensive background+ jobs when low on battery or run flat out when plugged in.+* The app should be aware of network status, and avoid expensive data+ transfers when not on wifi. This may need to be configurable.+* glacier and local pairing are not yet enabled for Android.+* The "Files" link doesn't start a file browser. Should be possible to do+ on Android via intents, I suppose?+* Adding removable drives would work, but the android app is not in the + appropriate group to write to them. `WRITE_MEDIA_STORAGE` permission+ needed. Added to AndroidManifest, but did not seem to be used.+ Googleing for it will find a workaround that needs a rooted device.
@@ -0,0 +1,11 @@+This blog was updated on a semi-daily basis by Joey during the year of work+concentrating on the git-annex assistant that was funded by his kickstarter+campaign.++Post-kickstarter work will instead appear on the [[devblog]]. However,+this page's RSS feed will continue to work, so you don't have to migrate+your RSS reader.++[[!inline pages="page(devblog/*)" show=-1 feedshow=7]]++[[!inline pages="page(design/assistant/blog/*)" show=0 feeds=no]]
@@ -0,0 +1,19 @@+Preferred content control is wired up to `--auto` and working for `get`,+`copy`, and `drop`. Note that `drop --from remote --auto` drops files that+the remote's preferred content settings indicate it doesn't want;+likewise `copy --to remote --auto` sends content that the remote does want.++Also implemented `smallerthan`, `largerthan`, and `ingroup` limits,+which should be everything needed for the scenarios described in+[[transfer_control]].++Dying to hook this up to the assistant, but a cloudy day is forcing me to+curtail further computer use.++----++Also, last night I developed a patch for the hS3 library, that should let+git-annex upload large files to S3 without buffering their whole content in+memory. I have a `s3-memory-leak` in git-annex that uses the new API I+developed. Hopefully hS3's maintainer will release a new version with that+soon.
@@ -0,0 +1,37 @@+## today++Came up with four groups of repositories that it makes sense to+define standard preferred content expressions for.++[[!format haskell """+ preferredContent :: StandardGroup -> String+ preferredContent ClientGroup = "exclude=*/archive/*"+ preferredContent TransferGroup = "not inallgroup=client and " ++ preferredContent ClientGroup+ preferredContent ArchiveGroup = "not copies=archive:1"+ preferredContent BackupGroup = "" -- all content is preferred+"""]]++[[preferred_content]] has the details about these groups, but+as I was writing those three preferred content expressions,+I realized they are some of the highest level programming I've ever done,+in a way.++Anyway, these make for a very simple repository configuration UI:++[[!img /assistant/repogroups.png alt="form with simple select box"]]++## yesterday (forgot to post this)++Got the assistant honoring preferred content settings. Although so far that+only determines what it transfers. Additional work will be needed to make+content be dropped when it stops being preferred.++----++Added a "configure" link next to each repository on the repository config+page. This will go to a form to allow setting things like repository+descriptions, groups, and preferred content settings.++----++Cut a release.
@@ -0,0 +1,25 @@+Bugfixes all day.++The most amusing bug, which I just stumbled over randomly on my own,+after someone on IRC yesterday was possibly encountering the same issue,+made `git annex webapp` go into an infinite memory-consuming loop on+startup if the repository it had been using was no longer a valid git+repository.++Then there was the place where HOME got unset, with also sometimes amusing+results.++Also fixed several build problems, including a threaded runtime hang+in the test suite. Hopefully the next release will build on all Debian+architectures again.++I'll be cutting that release tomorrow. I also updated the linux+prebuilt tarballs today.++----++Hmm, not entirely bugfixes after all. Had time (and power) to work+on the repository configuration form too, and added a check box to it that+can be unchecked to disable syncing with a repository. +Also, made that form be displayed after the webapp creates a new+repository.
@@ -0,0 +1,18 @@+Switched the OSX standalone app to use `DYLD_ROOT_PATH`.+This is the third `DYLD_*` variable I've tried; neither+of the other two worked in all situations. This one may do better.+If not, I may be stuck modifying the library names in each executable+using `install_name_tool`+([good reference for doing that](http://www.mikeash.com/pyblog/friday-qa-2009-11-06-linking-and-install-names.html)).+As far as I know, every existing dynamic library lookup system is broken+in some way other other; nothing I've seen about OSX's so far+disproves that rule.++Fixed a nasty utf-8 encoding crash that could occur when merging the+git-annex branch. I hope I'm almost done with those.++Made git-annex auto-detect when a git remote is on a sever like github+that doesn't support git-annex, and automatically set annex-ignore.++Finished the UI for pausing syncing of a remote. Making the syncing+actually stop still has some glitches to resolve.
@@ -0,0 +1,43 @@+Did a fair amount of testing and bug fixing today. ++There is still some buggy behavior around pausing syncing to a remote,+where transfers still happen to it, but I fixed the worst bug there.++Noticed that if a non-bare repo is set up on a removable drive,+its file tree will not normally be updated as syncs come in -- because the+assistant is not running on that repo, and so incoming syncs are not+merged into the local master branch. For now I made it always use bare+repos on removable drives, but I may want to revisit this.++The repository edit form now has a field for the name of the repo,+so the ugly names that the assistant comes up with for ssh remotes+can be edited as you like. `git remote rename` is a very nice thing.++Changed the preferred content expression for transfer repos to this:+"not (inallgroup=client **and copies=client:2)**". This way, when there's+just one client, files on it will be synced to transfer repos, even+though those repos have no other clients to transfer them to. Presumably,+if a transfer repo is set up, more clients are coming soon, so this avoids+a wait. Particularly useful with removable drives, as the drive will start+being filled as soon as it's added, and can then be brought to a client+elsewhere. The "2" does mean that, once another client is found,+the data on the transfer repo will be dropped, and so if it's brought+to yet another new client, it won't have data for it right away.+I can't see way to generalize this workaround to more than 2 clients;+the transfer repo has to start dropping apparently unwanted content at+some point. Still, this will avoid a potentially very confusing behavior+when getting started.++----++I need to get that dropping of non-preferred content to happen still.+Yesterday, I did some analysis of all the events that can cause previously+preferred content to no longer be preferred, so I know all the places+I have to deal with this.++The one that's giving me some trouble is checking in the transfer scan. If it+checks for content to drop at the same time as content to transfer, it could+end up doing a lot of transfers before dropping anything. It'd be nicer to+first drop as much as it can, before getting more data, so that transfer+remotes stay as small as possible. But the scan is expensive, and it'd also+be nice not to need two passes.
@@ -0,0 +1,10 @@+I was mostly working on other things today, but I did do some bug fixing.+The worst of these is a bug introduced in 3.20121009 that breaks+`git-annex-shell configlist`. That's pretty bad for using git-annex+on servers, although you mostly won't notice unless you're just getting+started using a ssh remote, since that's when it calls configlist.+I will be releasing a new version as soon as I have bandwidth (tomorrow).++Also made the standalone Linux and OSX binaries build with ssh connection+caching disabled, since they don't bundle their own ssh and need to work+with whatever ssh is installed.
@@ -0,0 +1,11 @@+More bugfixes today. The assistant now seems to have enough users that+they're turning up interesting bugs, which is good. But does keep me too+busy to add many more bugs\^Wcode.++The fun one today made it bloat to eat all memory when logging out of a+Linux desktop. I tracked that back to a bug in the Haskell DBUS library+when a session connection is open and the session goes away. Developed a+test case, and even profiled it, and sent it all of to the library's+author. Hopefully there will be a quick fix, in the meantime today's+release has DBUS turned off. Which is ok, it just makes it a little bit+slower to notice some events.
@@ -0,0 +1,33 @@+I released git-annex an unprecidented two times yesterday, because just+after the first release, I learned of a another zombie problem. Turns out+this zombie had existed for a while, but it was masked by zombie reaping+code that I removed recently, after fixing most of the other zombie+problems. This one, though, is not directly caused by git-annex. When rsync+runs ssh, it seems to run two copies, and one is left unwaited on as a+zombie. Oddly, this only happens when rsync's stdout is piped into+git-annex, for progress bar handling. I have not source-dived rsync's code+to get to the bottom of this, but I put in a workaround.++I did get to the bottom of yesterday's runaway dbus library. Got lucky and+found the cause of the memory leak in that library on the first try, which+is nice since each try involved logging out of X. I've been corresponding+with its author, and a fix will be available soon, and then git-annex will+need some changes to handle dbus reconnection.++-----++For the first time, I'm starting to use the assistant on my own personal+git-annex repo. The preferred content and group settings let me configure it+use the complex system of partial syncing I need. For example, I have this+configured for my sound files, keeping new podcasts on a server until they land+somewhere near me. And keeping any sound files that I've manually put on my+laptop, and syncing new podcasts, but not other stuff.++ # (for my server)+ preferred-content 87e06c7a-7388-11e0-ba07-03cdf300bd87 = include=podcasts/* and (not copies=nearjoey:1)+ # (for my laptop)+ preferred-content 0c443de8-e644-11df-acbf-f7cd7ca6210d = exclude=*/out/* and (in=here or (include=podcasts/*))++Found and fixed a bug in the preferred content matching code, where+if the assistant was run in a subdirectory of the repo, it failed to+match files correctly.
@@ -0,0 +1,16 @@+Got unwanted content to be dropped from the local repo, as well as remotes+when doing the expensive scan. I kept the scan a single pass for now,+need to revisit that later to drop content before transferring more.+Also, when content is downloaded or uploaded, this can result in it+needing to be dropped from somewhere, and the assistant handles that too.++There are some edge cases with hypothetical, very weird preferred+content expressions, where the assistant won't drop content right away.+(But will later in the expensive scan.) Other than those, I think I have+nearly all content dropping sorted out. The only common case I know of where+unwanted content is not dropped by the assistant right away is when a file+is renamed (eg, put in a "Trash" directory).++In other words, repositories put into the transfer group will now work as+described, only retaining content as long as is needed to distribute it to+clients. Big milestone!
@@ -0,0 +1,54 @@+A rather frustrating and long day coding went like this:++## 1-3 pm++Wrote a single function, of which all any Haskell programmer needs to know+is its type signature:++ Lsof.queryDir :: FilePath -> IO [(FilePath, LsofOpenMode, ProcessInfo)]++When I'm spending another hour or two taking a unix utility like lsof and+parsing its output, which in this case is in a rather complicated+machine-parsable output format, I often wish unix streams were strongly+typed, which would avoid this bother.++## 3-9 pm++Six hours spent making it defer annexing files until the commit thread+wakes up and is about to make a commit. Why did it take so horribly long?+Well, there were a number of complications, and some really bad bugs+involving races that were hard to reproduce reliably enough to deal with.++In other words, I was lost in the weeds for a lot of those hours...++At one point, something glorious happened, and it was always making exactly+one commit for batch mode modifications of a lot of files (like untarring+them). Unfortunately, I had to lose that gloriousness due to another+potential race, which, while unlikely, would have made the program deadlock+if it happened. ++So, it's back to making 2 or 3 commits per batch mode change. I also have a+buglet that causes sometimes a second empty commit after a file is added.+I know why (the inotify event for the symlink gets in late,+after the commit); will try to improve commit frequency later.++## 9-11 pm++Put the capstone on the day's work, by calling lsof on a directory full+of hardlinks to the files that are about to be annexed, to check if any+are still open for write.++This works great! Starting up `git annex watch` when processes have files+open is no longer a problem, and even if you're evil enough to try having+multiple processes open the same file, it will complain and not annex it+until all the writers close it.++(Well, someone really evil could turn the write bit back on after git annex+clears it, and open the file again, but then really evil people can do+that to files in `.git/annex/objects` too, and they'll get their just+deserts when `git annex fsck` runs. So, that's ok..)++----++Anyway, will beat on it more tomorrow, and if all is well, this will finally+go out to the beta testers.
@@ -0,0 +1,55 @@+Got preferred content checked when files are moved around.+So, in repositories in the default client group, if you make a+"archive" directory and move files to it, the assistant will drop+their content (when possible, ie when it's reached an archive or backup).+Move a file out of an archive directory, and the assistant will get its+content again. Magic.++Found an intractable bug, obvious in retrospect, with the git-annex branch+read cache, and had to remove that cache. I have not fully determined+if this will slow down git-annex in some use cases; might need to add more+higher-level caching. It was a very minimal cache anyway, just of one file.++Removed support for "in=" from preferred content expressions. That was+problimatic in two ways. First, it referred to a remote by name, but+preferred content expressions can be evaluated elsewhere, where that remote+doesn't exist, or a different remote has the same name. This name lookup+code could error out at runtime. Secondly, "in=" seemed pretty useless, and+indeed counterintuitive in preferred content expressions. "in=here" did not+cause content to be gotten, but it did let present content be dropped.+Other uses of "in=" are better handled by using groups.++In place of "in=here", preferred content expressions can now use "present",+which is useful if you want to disable automatic getting or dropping of+content in some part of a repository. Had to document that "not present"+is not a good thing to use -- it's unstable. Still, I find "present" handy+enough to put up with that wart.++Realized last night that the code I added to the TransferWatcher+to check preferred content once a transfer is done is subject to a race;+it will often run before the location log gets updated. Haven't found a good+solution yet, but this is something I want working now, so I did put in a+quick delay hack to avoid the race. Delays to avoid races are never a real+solution, but sometimes you have to TODO it for later.++----++Been thinking about how to make the assistant notice changes to configuration+in the git-annex branch that are merged in from elsewhere while it's running.+I'd like to avoid re-reading unchanged configuration files after each merge+of the branch.++The most efficient way would be to reorganise the git-annex branch, moving+config files into a configs directory, and logs into a logs directory. Then it+could `git ls-tree git-annex configs` and check if the sha of the configs+directory had changed, with git doing minimal work +(benchmarked at 0.011 seconds).++Less efficiently, keep the current git-annex branch layout, and +use: `git ls-tree git-annex uuid.log remote.log preferred-content.log group.log trust.log`+(benchmarked at 0.015 seconds)++Leaning toward the less efficient option, with a rate limiter so it+doesn't try more often than once every minute. Seems reasonable for it to+take a minute for config changes take effect on remote repos, even+if the assistant syncs file changes to them more quickly.
@@ -0,0 +1,18 @@+Added yet another thread, the ConfigMonitor. Since that thread needs to run+code to reload cached config values from the git-annex branch when files+there change, writing it also let me review where config files are cached,+and I found that every single config file in the git-annex branch does+get cached, with the exception of the uuid.log. So, added a cache for that,+and now I'm more sanguine about yesterday's removal of the lower-level+cache, because the only thing not being cached is location log information.++The ConfigMonitor thread seems to work, though I have not tested it+extensively. The assistant should notice and apply config changes+made locally, as well as any config changes pushed in from remotes.+So, for example, if you add a S3 repo in the webapp, and are paired with+another computer, that one's webapp will shortly include the new repo in+its list. And all the preferred content, groups, etc settings will+propigate over and be used as well.++Well ... almost. Seems nothing causes git-annex branch changes to be+pushed, until there's some file change to sync out.
@@ -0,0 +1,22 @@+Built out the XMPP push notifier; around 200 lines of code.+Haven't tested it yet, but it just might work. It's in the `xmpp` branch+for now.++I decided to send the UUID of the repo that was pushed to, otherwise+peers would have to speculatively pull from every repo. A wrinkle in this+is that not all git repos have a git-annex UUID. So it might notify that+a push was sent to an unidentified repo, and then peers need to pull from+every such repo. In the common case, there will only be one or a few such+repos, at someplace like at github that doesn't support git-annex. I could+send the URL, but there's no guarantee different clients have the same+URLs for a git remote, and also sending the URL leaks rather more data than+does a random UUID.++Had a bit of a scare where it looked like I couldn't use the haskell+`network-protocol-xmpp` package together with the `mtl` package that+git-annex already depends on. With help from #haskell I found the way+to get them co-existing, by using the PackageImports extension. Whew!++Need to add configuration of the XMPP server to use in the webapp, and+perhaps also a way to create `.git/annex/creds/notify-xmpp` from the+command line.
@@ -0,0 +1,56 @@+Had to toss out my XMPP presence hack. Turns out that, at least in Google+Talk, presence info is not sent to clients that have marked themselves+unavailable, and that means the assistant would not see notifications, as it+was nearly always marked unavailable as part of the hack.++I tried writing a test program that uses XMPP personal eventing, only+to find that Google Talk rejected my messages. I'm not 100% sure my+messages were right, but I was directly copying the example in the RFC,+and prosody accepted them. I could not seem to get a list of extensions out+of Google Talk either, so I don't know if it doesn't support personal+eventing, or perhaps only supports certian specific types of events.++So, plan C... using XMPP [presence extended content](http://xmpp.org/rfcs/rfc6121.html#presence-extended).+The assistant generates a presence message tagged "xa" (Extended Away),+which hopefully will make it not seem present to clients.+And to that presence message, I add my own XML element:++ <git-annex xmlns='git-annex' push="uuid,uuid" />++This is all entirely legal, and not at all a hack.+(Aside from this not really being presence info.) Isn't XML fun?++And plan C works, with Google Talk, and prosody. I've successfully gotten+push notifications flowing over XMPP!++----++Spent some hours dealing with an unusual probolem: git-annex started+segfaulting intermittently on startup with the new XMPP code. ++Haskell code is not supposed to segfault..++I think this was probably due to not using a bound thread for XMPP,+so if haskell's runtime system recheduled its green thread onto a different+OS thread during startup, when it's setting up TLS, it'd make gnuTLS very+unhappy.++So, fixed it to use a bound thread. Will wait and see if the crash is gone.++----++Re-enabled DBUS support, using a new version of the library that avoids the+memory leak. Will need further changes to the library to support+reconnecting to dbus.++----++Next will be a webapp configuration UI for XMPP. Various parts of the+webapp will direct the user to set up XMPP, when appropriate, especially+when the user sets up a cloud remote.++To make XMPP sufficiently easy to configure, I need to check SRV records to+find the XMPP server, which is an unexpected PITA because `getaddrinfo`+can't do that. There are several haskell DNS libraries that I could use for+SRV, or I could use the `host` command: +`host -t SRV _xmpp-client._tcp.gmail.com`
@@ -0,0 +1,17 @@+Built a SRV lookup library that can use either `host` or ADNS.++Worked on DBUS reconnection some more; found a FD leak in the dbus library,+and wrote its long-suffering author, John Millikin (also the XMPP library+author, so I've been bothering him a lot lately), who once again came+through with a quick fix.++Built a XMPP configuration form, that tests the connection to the server.+Getting the wording right on this was hard, and it's probably still not+100% right.++[[!img /assistant/xmpp.png]]+ +Pairing over XMPP is something I'm still thinking about. It's+contingent on tunneling git over XMPP (actually not too hard),+and getting a really secure XMPP connection (needs library improvements,+as the library currently accepts any SSL certificate).
@@ -0,0 +1,25 @@+Continuing to flail away at this XMPP segfault, which turned out not to be+fixed by bound threads. I managed to make a fairly self-contained and small+reproducible test case for it that does not depend on the network.+Seems the bug is gonna be either in the Haskell binding for GNUTLS,+or possibly in GNUTLS itself.++Update: John was able to fix it using my testcase! It was a GNUTLS+credentials object that went out of scope and got garbage collected.+I think I was seeing the crash only with the threaded runtime because+it has a separate garbage collection thread.++----++Arranged for the XMPP thread to restart when network connections+change, as well as when the webapp configures it.++Added an alert to nudge users to enable XMPP. It's displayed after adding a+remote in the cloud.++[[!img /assistant/xmppnudge.png]]++----++So, the first stage of XMPP is done. But so far all it does is push+notification. Much more work to do here.
@@ -0,0 +1,41 @@+Back in [[day_85__more_foundation_work]], I wrote:++> I suspect, but have not proven,+> that the assistant is able to keep repos arranged in any shape of graph in+> sync, as long as it's connected (of course) and each connection is+> bi-directional. [And each node is running the assistant.]++After today's work, many more graph topologies can be kept in sync -- the+assistant now can keep repos in sync that are not directly connected, but+must go through a central transfer point, which does not run the assistant+at all. Major milestone!++To get that working, as well as using XMPP push notifications, it turned+out to need to be more agressive about pushing out changed location log+information. And, it seems, that was the last piece that was missing.+Although I narrowly avoided going down a blind alley involving sending+transfer notifications over XMPP. Luckily, I came to my senses.++----++This month's focus was the cloud, and the month is almost done. And now+the assistant can, indeed be used to sync over the cloud! I would have+liked to have gotten on to implementing Amazon Glacier or Google Drive+support, but at least the cloud fundamentals are there.++Now that I have XMPP support, I'm tending toward going ahead and adding+XMPP pairing, and git push over XMPP. This will open up lots of excellent+use cases.++So, how to tunnel git pushes over XMPP? Well, `GIT_SHELL` can be set to+something that intercepts the output of `git-send-pack` and+`git-receive-pack`, and that data can be tunneled through XMPP to connect+them. Probably using XMPP ping.+(XEP-0047: In-Band Bytestreams would be the right way ...+but of course Google Talk doesn't support that extension.)++XMPP requires ugly encoding that will bloat the data, but the data+quantities are fairly small to sync up a few added or moved files+(of course, we'll not be sending file contents over XMPP). Pairing with+an large git repository over XMPP will need rather more bandwidth,+of course.
@@ -0,0 +1,15 @@+Spent most of the past day moving the assistant into a monad of its own+that encapsulates all the communications channels for its threads. This+involved modifiying nearly every line of code in the whole assistant.++Typical change:++[[!format haskell """+handleConnection threadname st dstatus scanremotes pushnotifier = do+ reconnectRemotes threadname st dstatus scanremotes (Just pushnotifier)+ =<< networkRemotes st++handleConnection = reconnectRemotes True =<< networkRemotes+"""]]++So, it's getting more readable..
@@ -0,0 +1,12 @@+Finished working the new assistant monad into all the assistant's code.+I've changed 1870 lines of code in the past two days. It feels like more.+While the total number of lines of code has gone up by around 100, the+actual code size has gone *down*; the monad allowed dropping 3.4 kilobytes+of manual variable threading complications. Or around 1% of a novel edited+away, in other words.++I don't seem to have broken anything, but I'm started an extensive test+of all the assistant and webapp. So far, the bugs I've found were not+introduced by my monadic changes. Fixed several bugs around adding+removable drives, and a few other minor bugs. Plan to continue testing+tomorrow.
@@ -0,0 +1,50 @@+I've been investigating how to make `git annex watch` work on+FreeBSD, and by extension, OSX.++One option is kqueue, which works on both operating systems, and allows+very basic monitoring of file changes. There's also an OSX specific+hfsevents interface.++Kqueue is far from optimal for `git annex watch`, because it provides even+less information than inotify (which didn't really provide everything I+needed, thus the lsof hack). Kqueue doesn't have events for files being+closed, only an event when a file is created. So it will be difficult for+`git annex watch` to know when a file is done being written to and can be+annexed. git annex will probably need to run lsof periodically to check when+recently added files are complete. (hsevents shares this limitation)++Kqueue also doesn't provide specific events when a file or directory is+moved. Indeed, it doesn't provide specific events about what changed at+all. All you get with kqueue is a generic "oh hey, the directory you're+watching changed in some way", and it's up to you to scan it to work out+how. So git annex will probably need to run `git ls-tree --others`+to find changes in the directory tree. This could be expensive with large+trees. (hsevents has per-file events on current versions of OSX)++Despite these warts, I want to try kqueue first, since it's more portable+than hfsevents, and will surely be easier for me to develop support for,+since I don't have direct access to OSX.++So I went to a handy Debian kFreeBSD porter box, and tried some kqueue+stuff to get a feel for it. I got a python program that does basic+directory monitoring with kqueue to work, so I know it's usable there.++Next step was getting kqueue working from Haskell. Should be easy, there's+a Haskell library already. I spent a while trying to get it to work on+Debian kFreeBSD, but ran into a+[problem](https://github.com/hesselink/kqueue/issues/1) that could be+caused by the Debian kFreeBSD being different, or just a bug in the Haskell+library. I didn't want to spend too long shaving this yak; I might install+"real" FreeBSD on a spare laptop and try to get it working there instead.++But for now, I've dropped down to C instead, and have a simple C program+that can monitor a directory with kqueue. Next I'll turn it into a simple+library, which can easily be linked into my Haskell code. The Haskell code+will pass it a set of open directory descriptors, and it'll return the+one that it gets an event on. This is necessary because kqueue doesn't+recurse into subdirectories on its own.++I've generally had good luck with this approach to adding stuff in Haskell;+rather than writing a bit-banging and structure packing low level interface+in Haskell, write it in C, with a simpler interface between C and+Haskell.
@@ -0,0 +1,2 @@+Did a lot of testing, found and fixed 4 bugs with repository setup+configurators. None of them were caused by the recent code reworking.
@@ -0,0 +1,10 @@+Got the XMPP client maintaining a list of buddies, including tracking which+clients are present and away, and which clients are recognised as other+git-annex assistant clients. This was fun, it is almost all pure+functional code, which always makes me happy.++Started building UI for XMPP pairing. So far, I have it showing a list of+buddies who are also running git-annex (or not). The list even refreshes+in real time as new buddies come online.++[[!img /assistant/buddylist.png]]
@@ -0,0 +1,29 @@+Reworked my XMPP code, which was still specific to push notification, into+a more generic XMPP client, that's based on a very generic NetMessager+class, that the rest of the assistant can access without knowing anything+about XMPP.++Got pair requests flowing via XMPP ping, over Google Talk! And when the+webapp receives a pair request, it'll pop up an alert to respond. The rest+of XMPP pairing should be easy to fill in from here.++To finish XMPP pairing, I'll need git pull over XMPP, which is nontrivial,+but I think I know basically how to do. And I'll need some way to represent+an XMPP buddy as a git remote, which is all that XMPP pairing will really+set up.++It could be a git remote using an `xmpp:user@host` URI for the git url, but+that would confuse regular git to no end (it'd think it was a ssh host),+and probably need lots of special casing in the parts of git-annex that+handle git urls too. Or it could be a git remote without an url set, and+use another config field to represent the XMPP data. But then git wouldn't+think it was a remote at all, which would prevent using "git pull+xmppremote" at all, which I'd like to be able to use when implementing git+pull over XMPP.++Aha! The trick seems to be to leave the url unset in git config,+but temporarily set it when pulling:++ GIT_SSH=git-annex git git -c remote.xmppremote.url=xmpp:client pull xmppremote++Runs git-annex with "xmpp git-upload-pack 'client'".. Just what I need.
@@ -0,0 +1,49 @@+Spent about 5 hours the other night in XMPP hell. At every turn Google Talk+exhibited behavior that may meet the letter of the XMPP spec (or not), but+varies between highly annoying and insane.++By "insane", I mean this: If a presence message is directed from one client+to another client belonging to that same user, randomly leaking that message+out to other users who are subscribed is just a security hole waiting to+happen. ++Anyway, I came out of that with a collection of hacks that worked, but I+didn't like. I was using directed presence for buddy-to-buddy pairing, and+an IQ message hack for client-to-client pairing. ++Today I got chat messages working instead, for both sorts of pairing. These+chat messages have an empty body, which *should* prevent clients from+displaying them, but they're sent directed to only git-annex clients+anyway.++----++And XMPP pairing 100% works now! Of course, it doesn't know how to git pull+over XMPP yet, but everything else works.++Here's a real `.git/config` generated by the assistant after XMPP pairing.++ [remote "joey"]+ url = + fetch = +refs/heads/*:refs/remotes/joey/*+ annex-uuid = 14f5e93e-1ed0-11e2-aa1c-f7a45e662d39+ annex-xmppaddress = joey@kitenet.net ++----++Fixed a typo that led to an infinite loop when adding a ssh git repo with the+assistant. Only occurred when an absolute directory was specified, which +is why I didn't notice it before.++----++Security fix: Added a `GIT_ANNEX_SHELL_DIRECTORY` environment variable that+locks down git-annex-shell to operating in only a single directory. The+assistant sets that in ssh `authorized_keys` lines it creates. This+prevents someone you pair with from being able to access any other git or+git-annex repositories you may have.++----++Next up, more craziness. But tomorrow is Nov 6th, so you in the US already+knew that..
@@ -0,0 +1,28 @@+Laying the groundwork for git push over XMPP. BTW, the motivation for doing+this now is that if the assistant can push git data peer-to-peer, users+who are entirely using the cloud don't need to set up a git repo in the+cloud somewhere. Instead, a single special remote in the cloud will be all+they need. So this is a keystone in the assistant's cloud support.++I'm building the following pipeline:++ git push <--> git-annex xmppgit <--> xmppPush <-------> xmpp+ |+ git receive-pack <--> xmppReceivePack <---------------> xmpp++A tricky part of this is `git-annex xmppgit`, which is run by `git push`+rather than the usual `ssh`. Rather than speak XMPP itself, that feeds the+data through the assistant daemon, using some special FDs that are set+up by the assistant when it runs `git push`, and communicated via+environment variables. I hoped to set up a pipe and not need it to do any+work on its own, but short of using the linux-specific `splice(2)`, that+doesn't seem possible. It also will receive the exit status of+`git receive-pack` and propigate it to `git push`.++Also built the IO sides of `xmppPush` and `xmppReceivePack` although these+are not tested. The XMPP sides of them come next.++----++Stuffing lots of git-annex branded USB keys into envelopes tonight, while+watching the election coverage.
@@ -0,0 +1,15 @@+I've finished building the XMMP side of git push over XMPP. Now I only+have to add code to trigger these pushes. And of course, fix all the bugs,+since none of this has been tested at all.++Had to deal with some complications, like handling multiple clients that+all want to push at the same time. Only one push is handled at a time;+messages for others are queued. Another complication I don't deal with yet+is what to do if a client stops responding in the middle of a push. It+currently will wait forever for a message from the client; instead it+should time out.++----++Jimmy got the OSX builder working again, despite my best attempts to add+dependencies and break it.
@@ -0,0 +1,52 @@+I'm stunned and stoked to have gotten git push over XMPP working today.+And am nearly out of steam, it was a wild ride..++ To xmpp::joey@kitenet.net+ * [new branch] master -> refs/xmpp/newmaster++The surprising part is how close my initial implementation came to just+working on the first try. It had around 3 bugs, which took hours of staring+at debugging output to find:++1. The git push action was run in the same thread as the XMPP+ client, which prevented the client from continuing to run and relaying+ messages.+2. The git-receive-pack side waited on the wrong thread, so didn't+ notice when the program was done.+3. I accidentially used the wrong attribute name when sending a ReceivePackDone+ message.++But all in all, it just worked.++Here's a sample of the actual data sent when one file is added to the+repository (also includes the corresponding update to the git-annex branch):++ MDA4NjhhMmNmOGZjMWE3MTlkOGVjOWVmOWZiMGZiNjVlODc2NjQ1NDAyMTAgODIwNTZjMDM4+ ZjU2YzE1ODdjYzllOWRhNzQzMzU0YjE4NzNjZWJlOSByZWZzL3htcHAvbmV3bWFzdGVyACBy+ ZXBvcnQtc3RhdHVzIHNpZGUtYmFuZC02NGswMDAw++ UEFDSwAAAAIAAAADnAx4nJXLTQ4CIQxA4T2n4AKaAqVAYoxL4y2gU+Jo5iczdeHtnSu4eMm3+ ebqJ2NwgSCLmNkTBlKFCYwwhoHOtQ+scqZCwWesms9pcPffc2dXkypCFi/TSG/RGUXIiwojg+ HZj60eey2cciX3uXfbeX18Hbe1SZRc9HV+tC9FgyJW9PgACGl2kaVeXfz/wArHQ81qMGeJwz+ NDIAAoVUI4ZZB9RW1E8NtXp5t77/fn3hw41cl2MNIbIZqTk5+Qwerw+aJX2INjsffYndtdCz+ 5mZWLDdUQV5qeVpmDtCQnx/3/6s40+Q4P/7O+Y4ShS+1Ad83AwC6CirftAt4nK3MsRGDMAwF+ 0IkcSVgSdpkidzRUmcDWBy4pSAEFl+mzRN4A77a9Tmr7vlz06e8lzoPmmb5Mz+k+mD/SkTkl+ eFHPq9eqQ+nSzFsWaDFnFmCMCEOvHgLrCrQxS7AWdvUVhv9uPwHxMbfumlvWdco1RLL4wSQF+ g0uFFOKu3Q==++Git said this push took 385 bytes; after base64 encoding to transport it over+XMPP as shown above, it needs 701 bytes, and the XMPP envelope and encryption+adds more overhead (although the XMPP connection may also be compressed?)++Not the most efficient git transport, but still a practical one!++----++Big thanks by the way to meep, who posted a comment reminding me about+`git-remote-helpers`. This was the right thing to use for XMPP over git,+it lets the git remote be configured with `url = xmpp::user@host`.++----++Next, I need to get the assistant to use this for syncing. Currently, it only+pushes a test branch.
@@ -0,0 +1,35 @@+I got full-on git-annex assistant syncing going over XMPP today!++How well does it work? Well, I'm at the cabin behind a dialup modem. I have+two repos that can only communicate over XMPP. One uses my own XMPP server,+and the other uses a Google Talk account. I make a file in one repo, and+switch windows to the other, and type `ls`, and the file (not its content+tho..) has often already shown up. So, it's about as fast as syncing over+ssh, although YMMV.++----++Refactored the git push over XMPP code rather severely. It's quite a+lot cleaner now.++----++Set XMPP presence priority to a negative value, which will hopefully+prevent git-annex clients that share a XMPP account with other clients from+intercepting chat messages. Had to change my XMPP protocol some to deal+with this.++----++Some webapp UI work. When showing the buddy list, indicate which buddies+are already paired with. ++After XMPP pairing, it now encourages setting up a shared cloud repository.++[[!img /assistant/xmpppairingend.png]]++I still need to do more with the UI after XMPP pairing, to help the paired+users configure a shared cloud transfer remote. Perhaps the thing to do is+for the ConfigMonitor to notice when a git push adds a new remote,+and pop up an alert suggesting the user enable it. Then one user+can create the repository, and the other one enable it.
@@ -0,0 +1,49 @@+I hope I'm nearly at the end of this XMPP stuff after today. Planning a new+release tomorrow.++----++Split up the local pairing and XMPP pairing UIs, and wrote a+[[/assistant/share_with_a_friend_walkthrough]].++----++Got the XMPP push code to time out if expected data doesn't arrive within+2 minutes, rather than potentially blocking other XMPP push forever if +the other end went away. ++I pulled in the Haskell+[async](http://hackage.haskell.org/package/async) library for this,+which is yes, yet another library, but one that's now in the haskell platform.+It's worth it, because of how nicely it let me implement IO actions that+time out.++[[!format haskell """+runTimeout :: Seconds -> IO a -> IO (Either SomeException a)+runTimeout secs a = do+ runner <- async a+ controller <- async $ do+ threadDelaySeconds secs+ cancel runner+ cancel controller `after` waitCatch runner+"""]]++This would have been 20-50 lines of gnarly code without async, and I'm sure+I'll find more uses for async in the future.++----++Discovered that the XMPP push code could deadlock, if both clients started+a push to the other at the same time. I decided to fix this by allowing+each client to run both one push and one receive-pack over XMPP at the same+time.++----++Prevented the transfer scanner from trying to queue transfers to XMPP remotes.++----++Made XMPP pair requests that come from the same account we've already+paired with be automatically accepted. So once you pair with one device,+you can easily add more.
@@ -0,0 +1,4 @@+Cut a new release today. It's been nearly a month since the last one, and a+large number of improvements.. Be sure to read the+[[/assistant/release_notes]] if upgrading. All the standalone builds are+updated already.
@@ -0,0 +1,23 @@+Followed my plan from yesterday, and wrote a simple C library to interface+to `kqueue`, and Haskell code to use that library. By now I think I+understand kqueue fairly well -- there are some very tricky parts to the+interface.++But... it still didn't work. After building all this, my code was+failing the same way that the+[haskell kqueue library failed](https://github.com/hesselink/kqueue/issues/1)+yesterday. I filed a [bug report with a testcase]().++Then I thought to ask on #haskell. Got sorted out in quick order! The+problem turns out to be that haskell's runtime has a periodic SIGALARM,+that is interrupting my kevent call. It can be worked around with `+RTS -V0`,+but I put in a fix to retry to kevent when it's interrupted.++And now `git-annex watch` can detect changes to directories on BSD and OSX!++Note: I said "detect", not "do something useful in response to". Getting+from the limited kqueue events to actually staging changes in the git repo+is going to be another day's work. Still, brave FreeBSD or OSX users+might want to check out the `watch` branch from git and see if +`git annex watch` will at least *say* it sees changes you make to your+repository.
@@ -0,0 +1,36 @@+Dealt with post-release feedback deluge. There are a couple weird bugs that+I don't understand yet. OSX app is still not working everywhere.++----++Got the list of repositories in the webapp to update automatically when+repositories are added, including when syncing with a remote causes+repositories to be discovered.++----++I need a plan for the rest of the month. It feels right to focus on more+cloud storage support. Particularly because all the cloud providers+supported so far are ones that, while often being best of breed, also cost+money. To finish up the cloud story, need support for some free ones.++Looking at the results of the [[polls/prioritizing_special_remotes]]+poll, I suspect that free storage is a large part of why Google Drive got+so many votes. Soo, since there is not yet a Haskell library for Google+Drive, rather than spending a large chunk of time writing one, I hope to+use a [Haskell WebDAV library](http://hackage.haskell.org/package/DAV)+that my friend Clint recently wrote. A generic+WebDAV special remote in git-annex will provide much better support for+box.com (which has 5 to 50 gb free storage), as well as all the +[OwnCloud providers](http://owncloud.org/providers/), at least one of which+provides 5 gb free storage.++If I have time left this month after doing that, I'd be inclined to do+Amazon Glacier. People have already gotten that working with git-annex, but+a proper special remote should be better/easier, and will allow integrating+support for it into the assistant, which should help deal with its long+retrieval delays. And since, if you have a lot of data+archived in Glacier, you will only want to pull out a few files at a time,+this is another place besides mobile phones where a [[partial_content]]+retrieval UI is needed. Which is on the roadmap to be worked on next+month-ish. Synergy, here I come. I hope.
@@ -0,0 +1,28 @@+Read up on WebDAV, and got the haskell library working. Several hours+were wasted by stumbling over a bug in the library, that requires a+carefully crafted XML document to prevent. Such a pity about things+like DAV (and XMPP) being designed back when people were gung-ho about+XML.. but we're stuck with them now.++Now I'm able to send and receive files to box.com using the library. Trying to+use an OwnCloud server, though, I get a most strange error message, which+looks to be coming from deep in the HTTPS library stack: "invalid IV length"++The haskell DAV library didn't have a way to delete files. I've added one+and sent off a patch.++Roughed in a skeleton of a webdav special remote. Doesn't do anything yet.+Will soon.++Factored out a Creds module from parts of the S3 special remote and XMPP+support, that all has to do with credentials storage. Using this for webdav+creds storage too.++Will also need to factor out the code that's currently in the directory+special remote, for chunking of files.++----++PS: WebDAV, for all its monstrously complicated feature set, lacks one obvious+feature: The ability to check how much free space is available to store+files. Eyeroll.
@@ -0,0 +1,22 @@+Two releases of the Haskell DAV library today. First release had my changes+from yesterday. Then I realized I'd also need support for making WebDAV+"collections" (subdirectories), and sent Clint a patch for that too, as+well as a patch for querying DAV properties, and that was 0.2.+Got it into Debian unstable as well. Should have everything I'll need now.++The webdav special remote is now working! Still todo:+Encryption support, progress bars, large file chunking, and webapp+configurators. But already, it's a lot nicer than the old approach of using+davfs2, which was really flakey and slow with large data volumes.++I did notice, though, that uploading a 100 mb file made the process use 100+mb of memory. This is a problem I've struggled with earlier with S3, the+Haskell http libraries are prevented from streaming data by several parts+of the protocol that cause the data to be accessed more than once. I guess+this won't be a problem for DAV though, since it'll probably be chunking+files anyway.++---++Mailed out all my Kickstarter USB key rewards, and ordered+the T-shirts too.
@@ -0,0 +1,31 @@+Worked on webdav special remotes all day. ++* Got encryption working,+ after fixing an amusing typo that made `initremote` for webdav throw away the+ encryption configuration and store files unencrypted.+* Factored out parts of the directory special remote that had to do with file+ chunking, and am using that for webdav. This refactoring was painful.++At this point, I feel the webdav special remote works better than the old+davfs2 + directory special remote hack. While webdav doesn't yet have+progress info for uploads, that info was pretty busted anyway with+davfs2 due to how it buffers files. So ... I've merged webdav into master!++-----++Tomorrow, webapp configurators for Box.com and any other webdav supporting+sites I can turn up and get to work..++-----++A while ago I made git-annex not store login credentials in git for special+remotes, when it's only encrypting them with a shared cipher. The+rationalle was that you don't want to give everyone who gets ahold of your+git repo (which includes the encryption key) access to your passwords,+Amazon S3 account, or whatever. I'm now considering adding a checkbox (or+command-line flag) that allows storing the login credentials in git,+if the user wants to. While using public key crypto is the real solution+(and is fully supported by git-annex (but not yet configurable in the+webapp)), this seems like a reasonable thing to do in some circumstances,+like when you have a Box.com account you really do want to share with+the people who use the git repo.
@@ -0,0 +1,8 @@+I needed an easy day, and I got one. Configurator in the webapp for Box.com+came together really quickly and easily, and worked on the first try.++Also filed a [bug](https://github.com/vincenthz/hs-cryptocipher/issues/21)+on the Haskell library that is failing on portknox.com's SSL certificate.+That site is the only OwnCloud provider currently offering free WebDAV+storage. Will hold off on adding OwnCloud to the webapp's cloud provider lists+until that's fixed.
@@ -0,0 +1,37 @@+Unexpectedly today, I got progress displays working for uploads via WebDAV.++The roadblock had been that the interface of for uploading to S3 and WebDAV+is something like `ByteString -> IO a`. Which doesn't provide any hook to+update a progress display as the ByteString is consumed.++My solution to this was to create a `hGetContentsObserved`, that's similar+to `hGetContents`, but after reading each 64kb chunk of data from the+Handle to populate the ByteString, it runs some observing action. So when+the ByteString is streamed, as each chunk is consumed, the observer+runs. I was able to get this to run in constant space, despite not having+access to some of the ByteString internals that `hGetContents` is built+with.++So, a little scary, but nice. I am curious if there's not a better way+to solve this problem hidden in a library somewhere. Perhaps it's another+thing that conduit solves somehow? Because if there's not, my solution+probably deserves to be put into a library. Any Haskell folk know?++----++Used above to do progress displays for uploads to S3. Also did progress+display to console on download from S3. Now very close to being done+with [[progressbars]]. Finally. Only bup and hook remotes need progress+work.++----++Reworked the core crypto interface, to better support streaming data through+gpg. This allowed fixing both the directory and webdav special remotes to+not buffer whole files in memory when retrieving them as chunks from the+remote.++-----++Spent some time dealing with API changes in Yesod and Conduit. Some of them+annoyingly gratuitous.
@@ -0,0 +1,14 @@+Changed how the directory and webdav special remotes store content.+The new method uses less system calls, is more robust, and leaves any+partially transferred key content in a single tmp directory, which+will make it easier to clean that out later.++Also found & fixed a cute bug in the directory special remote when the+chunksize is set to a smaller value than the ByteString chunk size, that+caused it to loop forever creating empty files.++----++Added an embedcreds=yes option when setting up special remotes. +Will put UI for it into the webapp later, but rather than work on that+tomorrow, I plan to work on glacier.
@@ -0,0 +1,30 @@+Got Amazon Glacier working as a full-fledged special remote.++(Well, I think it works... Since it takes 4 hours to get data out,+which is longer than the time it took me to sign up for Glacier and+write the special remote ... I've yet to fully test it!)++Thanks to Robie Basak for writing glacier-cli, and developing the intial+hook remote support. Also thanks to Peter Todd for pointing out that+Glacier cannot store empty files, which had to be worked around in the+special remote.++Of course the 4 hour delay on retreval makes Glacier interesting. For now,+you have to run "git annex get" twice, once to queue the retrieval, and a+second time in 4 hours to get the file(s). There is a helpful example in+[[tips/using_Amazon_Glacier]].++The real complication though, is that Glacier's inventories take a long+time to get, and can be out of date. So glacier-cli caches inventory info.+I didn't feel comfortable making git-annex trust that information,+so it'll refuse to trust that Glacier has a copy of a file when dropping+it. There's a `--trust-glacier` switch to override this default paranoid+behavior when dropping files.++----++Tomorrow ... er, tomorrow is Thanksgiving trip start.++Next weekend: Webapp configurator for glacier, and maybe something+to get the assistant to detect when jobs are complete and finish+retrievals from Glacier, automatically.
@@ -0,0 +1,25 @@+Added a configurator for Glacier repositories to the webapp. That was the last+cloud repository configurator that was listed in the webapp and wasn't+done. Indeed, just two more repository configurators remain to be filled in:+phone and NAS.++By default, Glacier repositories are put in a new "small archive" group.+This makes only files placed in "archive" directories be sent to Glacier+(as well as being dropped from clients), unlike the full archive group+which archives all files. Of course you can change this setting, but+avoiding syncing all data to Glacier seemed like a good default, especially+since some are still worried about Glacier's pricing model.++Fixed several bugs in the handling of archive directories, and +the webapp makes a toplevel archive directory when an archive remote is+created, so the user can get on with using it.++Made the assistant able to drop local files immediately after transferring+them to glacier, despite not being able to trust glacier's inventory.+This was accomplished by making the transferrer, after a successful upload,+indicate that it trusts the remote it just uploaded to has the file,+when it checks if the file should be dropped.++Only thing left to do for glacier is to make the assistant retry failed+downloads from it after 4 hours, or better, as soon as they become+available.
@@ -0,0 +1,11 @@+Got progress bars working for glacier. This needed some glacier-cli+changes, which Robie helpfully made earlier.++Spent some hours getting caught up and responding to bug reports, etc.++Spent a while trying to make git-annex commands that fail to find+any matching files to act on print a useful warning message,+rather than the current nothing. Concluded this will be surprisingly+hard to do, due to the multiple seek passes some commands perform. Update:+Thought of a non-invasive and not too ugly way to do this while on my+evening walk, and this wart is gone.
@@ -0,0 +1,34 @@+Good news! My beta testers report that the new kqueue code works on OSX.+At least "works" as well as it does on Debian kFreeBSD. My crazy+development strategy of developing on Debian kFreeBSD while targeting Mac+OSX is vindicated. ;-)++So, I've been beating the kqueue code into shape for the last 12 hours,+minus a few hours sleep.++First, I noticed it was seeming to starve the other threads. I'm using+Haskell's non-threaded runtime, which does cooperative multitasking between+threads, and my C code was never returning to let the other threads run.+Changed that around, so the C code runs until SIGALARMed, and then that+thread calls `yield` before looping back into the C code. Wow, cooperative+multitasking.. I last dealt with that when programming for Windows 3.1!+(Should try to use Haskell's -threaded runtime sometime, but git-annex+doesn't work under it, and I have not tried to figure out why not.)++Then I made a [single commit](http://source.git-annex.branchable.com/?p=source.git;a=commitdiff;h=2bfcc0b09c5dd37c5e0ab65cb089232bfcc31934),+with no testing, in which I made the kqueue code maintain a cache of what+it expects in the directory tree, and use that to determine what files+changed how when a change is detected. Serious code. It worked on the+first go. If you were wondering why I'm writing in Haskell ... yeah,+that's why.++And I've continued to hammer on the kqueue code, making lots of little+fixes, and at this point it seems *almost* able to handle the changes I+throw at it. It does have one big remaining problem; kqueue doesn't tell me+when a writer closes a file, so it will sometimes miss adding files. To fix+this, I'm going to need to make it maintain a queue of new files, and+periodically check them, with `lsof`, to see when they're done being+written to, and add them to the annex. So while a file is being written+to, `git annex watch` will have to wake up every second or so, and run+`lsof` ... and it'll take it at least 1 second to notice a file's complete.+Not ideal, but the best that can be managed with kqueue.
@@ -0,0 +1,25 @@+New release today, the main improvements in this one being WebDAV,+Box.com, and Amazon glacier support. [[/assistant/release_notes]]++Collected together all the OSX problem reports into one place+at [[/assistant/OSX]], to make it easier to get an overview of them.++Did some testing of the OSX standalone app and found that it was missing+some libraries. It seems some new libraries it's using themselves depend on+other libraries, and `otool -L` doesn't recursively resolve this. ++So I converted the simplistic shell script it was using to install+libraries into a haskell progream that recursively adds libraries until+there are no more to add. It's pulling in quite a lot more libraries now.+This may fix some of the problems that have been reported with the+standalone app; I don't really know since I can only do very limited+testing on OSX.++Still working on getting the standalone builds for this release done,+should be done by the end of today.++Also found a real stinker of a bug in `dirContentsRecursive`, which was+just completely broken, apparently since day 1. Fixing that has certianly+fixed buggy behavior of `git annex import`. It seems that the other+user of it, the transfer log code, luckily avoided the deep directory+trees that triggered the bug.
@@ -0,0 +1,6 @@+I had planned to do nothing today; I can't remember the last time I did+that. Twas not to be; instead I had to make a new release to fix+a utterly stupid typo in the rsync special remote. I'm also seeing+some slightly encouraging signs of the OSX app being closer to working+and this release has a further fix toward that end; unsetting all the+environment variables before running the system's web browser.
@@ -0,0 +1,9 @@+Just filling in a few remaining bits and pieces from this month's work.++* Made the assistant periodically check glacier-cli for archives that are+ ready, and queue downloads of them.+* The box.com configurator defaults to embedding the account info, allowing+ one-click enabling of the repository. There's a check box to control this.+* Fix some bugs with how the standalone images run git-annex.+* Included ssh in the standalone images.+* Various other bug fies.
@@ -0,0 +1,22 @@+Yesterday, I woke up and realized I didn't know what I needed to work on in+git-annex. Added a poll, [[polls/Android]] to help me decide what major+thing to work on next.++----++More flailing at the OSX monster. (A species of gelatinous cube?)+Current fun seems to involve git processes spinning if git-annex+was started without a controlling TTY. I'm befuddled by this.++----++Made the S3 and Glacier configurators have a list of regions, rather than+requiring a the region's code be entered correctly. I could not find a list of+regions, or better, an API to get a list, so I'll have to keep updating as+Amazon adds services in new regions.++----++Spent some time trying to get WebDAV to work with livedrive.com.+It doesn't like empty PROPPATCH. I've developed a change to the haskell DAV+library that will let me avoid this problem.
@@ -0,0 +1,8 @@+Made the webapp show runtime errors on a prettified page that includes version+info, a bug reporting link, etc.++Dealt with a bad interaction between required fields and the bootstrap modals+displayed when submitting some configuration forms. This was long, complex,+and had lots of blind alleys. In the end, I had to derive new password and+text fields in yesod that don't set the required attribute in the generated+html.
@@ -0,0 +1,12 @@+One problem with the current configurators for remotes is they have a lot+of notes and text to read at the top. I've worked on cut that down somewhat,+mostly by adding links and help buttons next to fields in the form.++I also made each form have a check box controlling whether encryption is+enabled. Mostly as a way to declutter the text at the top, which always had+to say encryption is enabled.++---++I have a fairly well worked out design for [[desymlink]]. Will wait a few+days to work on it to let it jell.
@@ -0,0 +1,22 @@+Biding my time while [[desymlink]] gells in my head..++Fixed a bug in the assistant's local pairing that rejected ssh keys with a+period in the comment.++Fixed a bug in the assistant that made it try to drop content from remotes+that didn't have it, and avoided a drop failure crashing a whole assistant+thread.++Made --auto behave better when preferred content is set.++Looked into making the transfer queue allow running multiple transfers at+the same time, ie, one per remote. This seems to essentially mean splitting+the queue into per remote queues. There are some complexities, and I+decided not to dive into working through it right now, since it'd be+a distraction from thinking about [[desymlink]]. Will revisit it later.++Allow specifying a port when setting up a ssh remote.++While doing that, noticed that the assistant fails to transfer files to+sync to a ssh remote that was just added. That got broken while optimising+reconnecting with a remote; fixed it.
@@ -0,0 +1,36 @@+Started laying the groundwork for [[desymlink]]'s direct mode.+I got rather far!++A git repo can be configured with `annex.direct` and all actions that+transfer objects to it will replace the symlinks with regular files.+Removing objects also works (and puts back a broken symlink),+as does checking if an object is present, which even detects if a file+has been modified.++So far, this works best when such a direct mode repository is used as a git+remote of another repository. It is also possible to run a few git-annex+commands, like "get" in a direct mode repository, though others, like+"drop" won't work because they rely on the symlink to map back to the key.++Direct mode relies on map files existing for each key in the repository, that tell+what file(s) use it. It also relies on cache files, that contain the last+known mtime, size, and inode of the file. So far, I've been setting these+files up by hand.++The main thing that's missing is support for transferring objects from+direct mode repositories. There's no single place I can modify to support+that (like I could for the stuff mentioned above), and also it's difficult+to do safely, since files could be modified at any time. ++So it'll need to quarantine files, to prevent a modified version from+getting sent out. I could either do this by copying the file, or by+temporarily `git annex lock`ing it. Unsure which choice would be less+annoying..++----++Also did some investigation with Jimmy of the OSX app git-config hang.+Seems to be some kind of imcompatability between the 10.7 autobuilder and+10.8. Next step is probably to try to build on 10.8. Might also+be worth trying <http://macdylibbundler.sourceforge.net/>, although my+own scripts do more or less the same thing to build the app.
@@ -0,0 +1,42 @@+Got object sending working in direct mode. However, I don't yet have a+reliable way to deal with files being modified while they're being+transferred. I have code that detects it on the sending side, but the+receiver is still free to move the wrong content into its annex, and record+that it has the content. So that's not acceptable, and I'll need to work+on it some more. However, at this point I can use a direct mode repository+as a remote and transfer files from and to it.++----++Automated updating of the cached mtime, etc data. Next I need to automate+generation of the key to filename mapping files. I'm thinking that I'll make+`git annex sync` do it. Then, once I get committing and +merging working in direct mode repositories (which is likely to be a+good week's worth of work), the workflow for using these repositories+will be something like this:++ git config annex.direct true+ git annex sync # pulls any changes, merges, updates maps and caches+ git annex get+ # modify files+ git annex sync # commits and pushes changes++And once I get direct mode repositories working to this degree at the+command line, I can get on with adding support to the assistant.++----++Also did some more work today on the OSX app. Am in the middle of getting+it to modify the binaries in the app to change the paths to the libraries they+depend on. This will avoid the hacky environment variable it is currently+using, and make runshell a much more usable environment. It's the right way+to do it. (I can't believe I just said RPATH was the right way to do+anything.)++In the middle of this, I discovered+<http://hackage.haskell.org/package/cabal-macosx>, which does the same+type of thing.++Anyway, I have to do some crazy hacks to work around short library name+fields in executables that I don't want to have to be specially rebuilt in+order to build the webapp. Like git.
@@ -0,0 +1,15 @@+Made `git annex sync` update the file mappings in direct mode.+To do this efficiently, it uses `git diff-tree` to find files that are+changed by the sync, and only updates those mappings. I'm rather happy+with this, as a first step to fully supporting sync in direct mode.++Finished the overhaul of the OSX app's library handling. It seems to work+well, and will fix a whole class of ways the OSX app could break.++Fixed a bug in the preferred content settings for backup repositories,+introduced by some changes I made to preferred content handling 4 days ago.++Fixed the Debian package to build with WebDAV support, which I forgot to+turn on before.++Planning a release tomorrow.
@@ -0,0 +1,23 @@+... I'm getting tired of kqueue.++But the end of the tunnel is in sight. Today I made git-annex handle files+that are still open for write after a kqueue creation event is received.+Unlike with inotify, which has a new event each time a file is closed,+kqueue only gets one event when a file is first created, and so git-annex+needs to retry adding files until there are no writers left.++Eventually I found an elegant way to do that. The committer thread already+wakes up every second as long as there's a pending change to commit. So for+adds that need to be retried, it can just push them back onto the change+queue, and the committer thread will wait one second and retry the add. One+second might be too frequent to check, but it will do for now.++This means that `git annex watch` should now be usable on OSX, FreeBSD, and+NetBSD! (It'll also work on Debian kFreeBSD once [lsof is ported to it](http://bugs.debian.org/589103).)+I've meged kqueue support to `master`.++I also think I've squashed the empty commits that were sometimes made.++Incidentally, I'm 50% through my first month, and finishing [[inotify]]+was the first half of my roadmap for this month. Seem to be right on+schedule.. Now I need to start thinking about [[syncing]].
@@ -0,0 +1,44 @@+Pondering [[syncing]] today. I will be doing syncing of the git repository+first, and working on syncing of file data later.++The former seems straightforward enough, since we just want to push all+changes to everywhere. Indeed, git-annex already has a [[sync]] command+that uses a smart technique to allow syncing between clones without a+central bare repository. (Props to Joachim Breitner for that.)++But it's not all easy. Syncing should happen as fast as possible, so+changes show up without delay. Eventually it'll need to support syncing+between nodes that cannot directly contact one-another. Syncing needs to+deal with nodes coming and going; one example of that is a USB drive being+plugged in, which should immediately be synced, but network can also come+and go, so it should periodically retry nodes it failed to sync with. To+start with, I'll be focusing on fast syncing between directly connected+nodes, but I have to keep this wider problem space in mind.++One problem with `git annex sync` is that it has to be run in both clones+in order for changes to fully propagate. This is because git doesn't allow+pushing changes into a non-bare repository; so instead it drops off a new+branch in `.git/refs/remotes/$foo/synced/master`. Then when it's run locally+it merges that new branch into `master`. ++So, how to trigger a clone to run `git annex sync` when syncing to it?+Well, I just realized I have spent two weeks developing something that can+be repurposed to do that! [[Inotify]] can watch for changes to+`.git/refs/remotes`, and the instant a change is made, the local sync+process can be started. This avoids needing to make another ssh connection+to trigger the sync, so is faster and allows the data to be transferred+over another protocol than ssh, which may come in handy later.++So, in summary, here's what will happen when a new file is created:++1. inotify event causes the file to be added to the annex, and+ immediately committed.+2. new branch is pushed to remotes (probably in parallel)+3. remotes notice new sync branch and merge it+4. (data sync, TBD later)+5. file is fully synced and available++Steps 1, 2, and 3 should all be able to be accomplished in under a second.+The speed of `git push` making a ssh connection will be the main limit+to making it fast. (Perhaps I should also reuse git-annex's existing ssh+connection caching code?)
@@ -0,0 +1,53 @@+Yesterday I cut another release. However, getting an OSX build took until+12:12 pm today because of a confusion about the location of lsof on OSX. The+OSX build is now available, and I'm looking forward to hearing if it's working!++----++Today I've been working on making `git annex sync` commit in direct mode.++For this I needed to find all new, modified, and deleted files, and I also+need the git SHA from the index for all non-new files. There's not really+an ideal git command to use to query this. For now I'm using+`git ls-files --others --stage`, which works but lists more files than I+really need to look at. It might be worth using one of the Haskell libraries+that can directly read git's index.. but for now I'll stick with `ls-files`.++It has to check all direct mode files whose content is present, which means+one stat per file (on top of the stat that git already does), as well as one+retrieval of the key per file (using the single `git cat-file` process that+git-annex talks to).++This is about as efficient as I can make it, except that unmodified+annexed files whose content is not present are listed due to --stage,+and so it has to stat those too, and currently also feeds them into `git add`.++The assistant will be able to avoid all this work, except once at startup.++Anyway, direct mode committing is working!++For now, `git annex sync` in direct mode also adds new files. This because+`git annex add` doesn't work yet in direct mode.++It's possible for a direct mode file to be changed during a commit,+which would be a problem since committing involves things like calculating+the key and caching the mtime/etc, that would be screwed up. I took+care to handle that case; it checks the mtime/etc cache before and after+generating a key for the file, and if it detects the file has changed,+avoids committing anything. It could retry, but if the file is a VM disk+image or something else that's constantly modified, commit retrying forever+would not be good.++----++For `git annex sync` to be usable in direct mode, it still needs+to handle merging. It looks like I may be able to just enhance the automatic+conflict resolution code to know about typechanged direct mode files.++The other missing piece before this can really be used is that currently+the key to file mapping is only maintained for files added locally, or+that come in via `git annex sync`. Something needs to set up that mapping+for files present when the repo is initally cloned. Maybe the thing+to do is to have a `git annex directmode` command that enables/disables+direct mode and can setup the the mapping, as well as any necessary unlocks+and setting the trust level to untrusted.
@@ -0,0 +1,59 @@+Built `git annex direct` and `git annex indirect` to toggle back and forth+between direct mode. Made `git annex status` show if the repository is in+direct mode. Now *only* merging is needed for direct mode to be basically+usable. ++I can do a little demo now. Pay attention to the "@" ls shows at the end+of symlinks.++ joey@gnu:~/tmp/bench/rdirect>ls+ myfile@ otherfile@+ joey@gnu:~/tmp/bench/rdirect>git annex find+ otherfile+ # So, two files, only one present in this repo.++ joey@gnu:~/tmp/bench/rdirect>git annex direct+ commit + # On branch master+ # Your branch is ahead of 'origin/master' by 7 commits.+ #+ nothing to commit (working directory clean)+ ok+ direct myfile ok+ direct otherfile ok+ direct ok++ joey@gnu:~/tmp/bench/rdirect>ls+ myfile@ otherfile+ # myfile is still a broken symlink because we don't have its content+ joey@gnu:~/tmp/bench/rdirect>git annex get myfile+ get myfile (from origin...) ok+ (Recording state in git...)+ joey@gnu:~/tmp/bench/rdirect>ls+ myfile otherfile++ joey@gnu:~/tmp/bench/rdirect>echo "look mom, no symlinks" >> myfile+ joey@gnu:~/tmp/bench/rdirect>git annex sync+ add myfile (checksum...) ok+ commit + (Recording state in git...)+ [master 0e8de9b] git-annex automatic sync+ ...+ ok++ joey@gnu:~/tmp/bench/rdirect>git annex indirect+ commit ok+ indirect myfile ok+ indirect otherfile ok+ indirect ok+ joey@gnu:~/tmp/bench/rdirect>ls+ myfile@ otherfile@++I'd like `git annex direct` to set the repository to untrusted, but+I didn't do it. Partly because having `git annex indirect` set it back to+semitrusted seems possibly wrong -- the user might not trust a repo even in+indirect mode. Or might fully trust it. The docs will encourage users to+set direct mode repos to untrusted -- in direct mode you're operating+without large swathes of git-annex's carefully constructed safety net.+(When the assistant later uses direct mode, it'll untrust the repository+automatically.)
@@ -0,0 +1,18 @@+Fixed a bug in the kqueue code that made the assistant not notice when a+file was renamed into a subdirectory. This turned out to be because the+symlink got broken, and it was using `stat` on the file. Switching to+`lstat` fixed that.++Improved installation of programs into standalone bundles. Now it uses+the programs detected by configure, rather than a separate hardcoded list.+Also improved handling of lsof, which is not always in PATH.++Made a OSX 10.8.2 build of the app, which is nearly my last gasp attempt+at finding a way around this crazy `git init` spinning problem with Jimmy's+daily builds are used with newer OSX versions. Try it here:+<http://downloads.kitenet.net/tmp/git-annex.dmg.bz2>++----++Mailed out the Kickstarter T-shirt rewards today, to people in the US.+Have to fill out a bunch of forms before I can mail the non-US ones.
@@ -0,0 +1,26 @@+As winter clouds set in, I have to ration my solar power and have been less+active than usual.++It seems that the OSX 10.8.2 `git init` hanging issue has indeed been+resolved, by building the app on 10.8.2. Very good news! Autobuilder setup is+in progress.++----++Finally getting stuck in to direct mode git-merge handling. It's+not possible to run `git merge` in a direct mode tree, because it'll+see typechanged files and refuse to do anything.++So the only way to use `git merge`, rather than writing my own merge engine,+is to use `--work-tree` to make it operate in a temporary work tree directory+rather than the real one.++When it's run this way, any new, modified, or renamed files will be added+to the temp dir, and will need to be moved to the real work tree.+To detect deleted files, need to use `git ls-files --others`, and+look at the old tree to see if the listed files were in it.++When a merge conflict occurs, the new version of the file will be in the temp+directory, and the old one in the work tree. The normal automatic merge+conflict resolution machinery should work, with just some tweaks to handle+direct mode.
@@ -0,0 +1,21 @@+Got merging working in direct mode!++Basically works as outlined yesterday, although slightly less clumsily.+Since there was already code that ran `git diff-tree` to update the+associated files mappings after a merge, I was able to adapt that same code+to also update the working tree.++An important invariant for direct mode merges is that they should never+cause annexed objects to be dropped. So if a file is deleted by a merge,+and was a direct mode file that was the only place in the working copy+where an object was stored, the object is moved into `.git/annex/objects`.+This avoids data loss and any need to re-transfer objects after a merge.+It also makes renames and other move complex tree manipulations always end+up with direct mode files, when their content was present.++Automatic merge conflict resoltion doesn't quite work right yet in direct+mode.++Direct mode has landed in the `master` branch, but I still consider it+experimental, and of course the assistant still needs to be updated to+support it.
@@ -0,0 +1,15 @@+Finished getting automatic merge conflict resolution working in direct+mode. Turned out I was almost there yesterday, just a bug in a filename+comparison needed to be fixed.++Fixed a bug where the assistant dropped a file after transferring it,+despite the preferred content settings saying it should keep its copy of+the file. This turned out to be due to it reading the transfer info+incorrectly, and adding a "\n" to the end of the filename, which caused the+preferred content check to think it wasn't wanted after all. (Probably+because it thought 0 copies of the file were wanted, but I didn't look into+this in detail.)++Worked on my test suite, particularly more QuickCheck tests. I need to+use QuickCheck more, particularly when I've pairs of functions, like encode+and decode, that make for easy QuickCheck properties.
@@ -0,0 +1,45 @@+Over Christmas, I'm working on making the assistant support direct+mode. I like to have a fairly detailed plan before starting this kind of+job, but in this case, I don't. (Also I have a cold so planning? Meh.)+This is a process of seeing what's broken in direct mode and fixing it.+I don't know if it'll be easy or hard. Let's find out..++* First, got direct mode adding of new files working. This was not hard, all the+ pieces I needed were there. For now, it uses the same method as in+ indirect mode to make sure nothing can modify the file while it's being+ added.++* An unexpected problem is that in its startup scan, the assistant runs+ `git add --update` to detect and stage any deletions that happened+ while it was not running. But in direct mode that also stages the full file+ contents, so can't be used. Had to switch to using git plumbing to only+ stage deleted files. Happily this also led to fixing a bug; deletions+ were not always committed at startup when using the old method; with the+ new method it can tell when there are deletions and trigger a commit.++* Next, got it to commit when direct mode files are modified. The Watcher+ thread gets a inotify event when this happens, so that was easy. (Although+ in doing that I had to disable a guard in direct mode that made annexed+ files co-exist with regular in-git files, so such mixed repositories+ probably won't work in direct mode yet.)++ However, naughty kqueue is another story, there are no kqueue events for+ file modifications. So this won't work on OSX or the BSDs yet. I tried+ setting some more kqueue flags in hope that one would make such events+ appear, but no luck. Seems I will need to find some other method to detect+ file modifications, possibly an OSX-specific API.++* Another unexpected problem: When an assistant receives new files from one+ of its remotes, in direct mode it still sets up symlinks to the content.+ This was because the Merger thread didn't use the `sync` command's direct+ mode aware merge code.. so fixed that.++* Finally there was some direct mode bookeeping the assistant has+ to get right. For example, when a file is modified, the old object has+ to be looked up, and be marked as not locally present any longer. That+ lookup relies on the already running `git cat-file --batch`, so it's+ not as fast as it could be, if I kept a local cache of the mapping+ between files and objects. But it seems fast enough for now.++At this point the assistant seems to work in direct mode on Linux!+Needs more testing..
@@ -0,0 +1,20 @@+Investigated using the OSX fsevents API to detect when files are modified,+so they can be committed when using direct mode. There's a+[haskell library](http://hackage.haskell.org/package/hfsevents-0.1.3)+and even a [sample directory watching program](http://hackage.haskell.org/package/hobbes).+Initial tests look good...++Using fsevents will avoid kqueue's problems with needing enough file+descriptors to open every subdirectory. kqueue is a rather poor match for+git-annex's needs, really. It does not seem to provide events for file+modifications at all, unless every *file* is individually opened. While I+dislike leaving the BSD's out, they need a better interface to be perfectly+supported by git-annex, and kqueue will still work for indirect mode+repositories.++----++Got the assistant to use fsevents. It seems to work well!++The only problem I know of is that it doesn't yet handle whole directory+renames. That should be easy to fix later.
@@ -0,0 +1,16 @@+Short day today, but I spent it all on testing the new FSEvents code,+getting it working with the assistant in direct mode. This included fixing+its handling of renaming, and various other bugs.++The assistant in direct mode now seems to work well on OSX. So I made+the assistant *default* to making direct mode repositories on OSX.++That'll presumably flush out any bugs. :) More importantly,+it let me close several OSX-specific bugs to do with interactions between+git-annex's symlinks and OSX programs that were apparently written under the+misprehension that it's a user-mode program's job to manually follow symlinks.++Of course, defaulting to direct mode also means users can just modify files+as they like and the assistant will commit and sync the changed files.+I'm waiting to see if direct mode becomes popular enough to make it the+default on all OS's.
@@ -0,0 +1,33 @@+Syncing works! I have two clones, and any file I create in the first+is immediately visible in the second. Delete that file from the second, and+it's immediately removed from the first.++Most of my work today felt like stitching existing limbs onto a pre-existing+monster. Took the committer thread, that waits for changes and commits them,+and refashioned it into a pusher thread, that waits for commits and pushes+them. Took the watcher thread, that watches for files being made,+and refashioned it into a merger thread, that watches for git refs being+updated. Pulled in bits of the `git annex sync` command to reanimate this.++It may be a shambling hulk, but it works.++Actually, it's not much of a shambling hulk; I refactored my code after+copying it. ;)++I think I'm up to 11 threads now in the new+`git annex assistant` command, each with its own job, and each needing+to avoid stepping on the other's toes. I did see one MVar deadlock error+today, which I have not managed to reproduce after some changes. I think+the committer thread was triggering the merger thread, which probably+then waited on the Annex state MVar the committer thread had held.++Anyway, it even pushes to remotes in parallel, and keeps track of remotes+it failed to push to, although as of yet it doesn't do any attempt at+periodically retrying.++One bug I need to deal with is that the push code assumes any change+made to the remote has already been pushed back to it. When it hasn't, +the push will fail due to not being a fast-forward. I need to make it+detect this case and pull before pushing.++(I've pushed this work out in a new `assistant branch`.)
@@ -0,0 +1,10 @@+A few final bits and pieces of direct mode. Fixed a few more bugs in the+assistant. Made all git-annex commands that don't work at+all, or only partially work in direct mode, refuse to run at all. Also,+some optimisations.++I'll surely need to revisit direct mode later and make more commands+support it; `fsck` and `add` especially.+But the only thing I'd like to deal with before I make a release with direct+mode is the problem of files being able to be modified while they're+being transferred, which can result in data loss.
@@ -0,0 +1,8 @@+Released the first git-annex with direct mode today. Notably, the assistant+enables direct mode in repositories it creates. All builds are updated to+3.20130102 now.++My plan for this month is to fix whatever things currently might be+preventing you from using the git-annex assistant. So bugfixes and+whatever other important gaps need to be filled, but no major new+feature developments.
@@ -0,0 +1,17 @@+[Installed a generator](http://joeyh.name/blog/entry/overcast/),+so I'll have more power and less hibernation.++Added UI in the webapp to shut down the daemon. Would like to also have+restart UI, but that's rather harder to do, seems it'd need to start+another copy of the webapp (and so, of the assistant), and redirect the+browser to its new url. ... But running two assistants in the same repo at+the same time isn't good. Anyway, users can now use the UI to shut it down,+and then use their native desktop UI to start it back up.++[[!img /assistant/controlmenu.png]]++Spiffed up the control menu. Had to stop listing other local repositories+in the menu, because there was no way to notice when a new one was added+(without checking a file on every page load, which is way overkill for this+minor feature). Instead added a new page that lists local repositories it+can switch to.
@@ -0,0 +1,32 @@+There was a typo in cabal file that broke building the assistant on OSX.+This didn't affect the autobuilds of the app, but several users building by+hand reported problems. I made a new minor release fixing that typo, and+also a resouce leak bug.++Got a restart UI working after all. It's a hack though. It+opens a new tab for the new assistant instance, and as most web browsers+don't allow javascript to close tabs, the old tab is left open. At some+point I need to add a proper thread manager to the assistant, which the+restart code could use to kill the watcher and committer threads, and then+I could do a clean restart, bringing up the new daemon and redirecting the+browser to it.++Found a bug in the assistant in direct mode -- the expensive transfer scan+didn't queue uploads needed to sync to other repos in direct mode, although+it did queue downloads. Fixing this laid some very useful groundwork for+making more commands support direct mode, too. Got stuck for a long time+dealing with some very strange `git-cat-file` behavior while making this+work. Ended up putting in a workaround.++After that, I found that these commands work in direct mode, without+needing any futher changes!++* `git annex find`+* `git annex whereis`+* `git annex copy`+* `git annex move`+* `git annex drop`+* `git annex log`++Enjoy! The only commands I'd like to add to this are `fsck`, `add`,+and `addurl`...
@@ -0,0 +1,17 @@+Several bugfixes from user feedback today.++Made the assistant detect misconfigured systems where git will fail to+commit because it cannot determine the user's name or email address, and+dummy up enough info to get git working. It makes sense for git and+git-annex to fail at the command line on such a misconfigured system, so+the user can fix it, but for the assistant it makes sense to plow on and just+work.++I found a big gap in direct mode -- all the special remotes expected to find+content in the indirect mode location when transferring to the remote. It+was easy to fix once I noticed the problem. This is a big enough bug that+I will be making a new release in a day or so.++Also, got fsck working in direct mode. It doesn't check as many things+as in indirect mode, because direct mode files can be modified at any time.+Still, it's usable, and useful.
@@ -0,0 +1,16 @@+(Posted a day late.) [[!meta date="Mon Jan 7 16:05:13 JEST 2013"]]++Got `git annex add` (and `addurl`) working in direct mode. This allowed me+to make `git annex sync` in direct mode no longer automatically add new+files.++It's also now safe to mix direct mode annexed files with regular files in+git, in the same repository. Might have been safe all along, but I've+tested it, and it certainly works now. You just have to be careful to not+use `git commit -a` to commit changes to such files, since that'll also +stage the entire content of direct mode files.++Made a minor release for these recent changes and bugfixes. Recommended if+you're using direct mode. Had to chase down a stupid typo I made yesterday+that caused fsck to infinite loop if it found a corrupted file. Thank+goodness for test suites.
@@ -0,0 +1,25 @@+I was up at the crack of dawn wrestling 100 pound batteries around for 3+hours and rewiring most of my battery bank, so today is a partial day...+but a day with power, which is always nice.++Did some design work on finally making transfers of files from direct mode+repositories safe, even if a file is modified as it's being uploaded.+This seems easily doable for special remotes; git to git repository+transfers are harder, but I think I see how to do it without breaking+backwards compatability. ++(An unresolved problem is that a temp file would be left behind when a+transfer failed due to a file being changed. What would really be nice to+do is to use that temp file as the rsync basis when transferring the new+version of a file. Although this really goes beyond direct mode, and into+[[deltas]] territory.)++Made fsck work better in direct mode repositories. While it's expected for+files to change at any time in direct mode, and so fsck cannot complain+every time there's a checksum mismatch, it is possible for it to detect+when a file does not *seem* to have changed, then check its checksum,+and so detect disk corruption or other data problems.++Also dealt with several bug reports. One really weird one involves `git+cat-file` failing due to some kind of gpg signed data in the git-annex+branch. I don't understand that at all yet.
@@ -0,0 +1,12 @@+Well underway on making direct mode transfers roll back when the file is+modified while it's transferred.++As expected, it was easy to do for all the special remotes ... Except for+bup, which does not allow deleting content. For bup it just removes the git+ref for the bad content, and relies on bup's use of git delta compression+to keep space use sane.++The problem is also handled by `git-annex-shell sendkey`.+But not yet for downloads from other git repositories. Bit stuck on that.++Also: A few minor bug fixes.
@@ -0,0 +1,18 @@+This month's theme is supposed to be fixing up whatever might prevent users+from using the assistant. To that end, I've posted an open-ended poll,+[[polls/what is preventing me from using git-annex assistant]]. Please go+fill it out so I can get an idea of how many people are using the+assistant, and what needs to be done to get the rest of you, and your+friends and family able to use it.++In the meantime, today I fixed several bugs that were recently reported in+the webapp and assistant. Getting it working as widely as possible, even on+strange IPv6 only systems, and with browsers that didn't like my generated+javascript code is important, and fits right into this month's theme. I'm+happy to see lots of bugs being filed, since it means more users are trying+the assistant out.++Also continued work on making direct mode transfers safe. All transfers to+local git remotes (wish I had a better phrase!) are now safe in direct mode.+Only uploading from a direct mode repository over ssh to another git+repository is still potentially unsafe.
@@ -0,0 +1,24 @@+I've finished making direct mode file transfers safe. The last piece of the+puzzle was making `git-annex-shell recv-key` check data it's received from+direct mode repositories. This is a bit expensive, but avoids adding+another round-trip to the protocol. I might revisit this later, this was+just a quick fix.++---++The [[poll|polls/what is preventing me from using git-annex assistant]] was +quite useful. Some interesting points:++* 14% have been reading this blog, and rightly don't trust direct mode to+ be safe. Which is why I went ahead with a quick fix to make it safe.+* 6% want an Ubuntu PPA. I don't anticipate doing this myself, but+ if anyone who develops for Ubuntu wants to put together a PPA with a+ newer version, I can help you pick the newer haskell packages you'll+ need from Debian, etc.+* 9% just need me to update the amd64 build in Debian sid. I forgot to+ include it in the last release, and the Debian buildds cannot currently+ autobuild git-annex due to some breakage in the versions of haskell+ libraries in unstable. Hopefully I'll remember to include an amd64 build+ in my next release.++And lots of other interesting stuff, I have a nice new TODO list now. :)
@@ -0,0 +1,44 @@+I released a version of git-annex over the weekend that includes the `git+annex watch` command. There's a minor issue installing it from cabal on+OSX, which I've fixed in my tree. Nice timing: At least the watch command+should be shipped in the next Debian release, which freezes at the end of+the month.++Jimmy found out how kqueue [[blows+up|bugs/Issue_on_OSX_with_some_system_limits]] when there are too many+directories to keep all open. I'm not surprised this happens, but it's nice+to see exactly how. Odd that it happened to him at just 512 directories;+I'd have guessed more. I have plans to fork watcher programs that each+watch 512 directories (or whatever the ulimit is), to deal with this. What+a pitiful interface is kqueue.. I have not thought yet about how the watcher+programs would communicate back to the main program.++----++Back on the assistant front, I've worked today on making git syncing more+robust. Now when a push fails, it tries a pull, and a merge, and repushes.+That ensures that the push is, almost always, a fast-forward. Unless+something else gets in a push first, anyway!++If a push still fails, there's Yet Another Thread, added today, that will+wake up after 30 minutes and retry the push. It currently keeps retrying+every 30 minutes until the push finally gets though. This will deal, to+some degree, with those situations where a remote is only sometimes+available.++I need to refine the code a bit, to avoid it keeping an ever-growing queue+of failed pushes, if a remote is just dead. And to clear old failed pushes+from the queue when a later push succeeds.++I also need to write a git merge driver that handles conflicts in the tree.+If two conflicting versions of a file `foo` are saved, this would merge+them, renaming them to `foo.X` and `foo.Y`. Probably X and Y are the+git-annex keys for the content of the files; this way all clones will+resolve the conflict in a way that leads to the same tree. It's also+possible to get a conflict by one repo deleting a file, and another+modifying it. In this case, renaming the deleted file to `foo.Y` may+be the right approach, I am not sure.++I glanced through some Haskell dbus bindings today. I belive there are dbus+events available to detect when drives are mounted, and on Linux this would+let git-annex notice and sync to usb drives, etc.
@@ -0,0 +1,8 @@+Fixed a goodly amount of bugs today.++The most interesting change was that in direct mode, files using the same+key are no longer hardlinked, as that could cause a surprising behavior if+modifying one, where the other would also change.++Made a release, which is almost entirely bug fixes. Debian amd64 build+included this time. :)
@@ -0,0 +1,23 @@+I've noticed people have some problems getting me logs when there'a a bug,+so I worked on improving the logging of the assistant.++While the assistant logged to `.git/annex/daemon.log` when started as a+daemon, when the webapp ran it didn't log there. It's somewhat tricky to+make the webapp redirect messages to the log, because it may start a web+browser that wants to write to the console. Took some file descriptor+juggling, but I made this work. Now the log is even used when the assistant+is started for the first time in a newly created repository. So, we have+total log coverage.++Next, I made a simple page in the webapp to display the accumulated logs.+It does not currently refresh as new things are logged. But it's easier+for me to tell users to click on `Current Repository -> View log` than+ask for them to look for the daemon.log file.++Finally, I made all the webapp's alerts also be written to the log.++---++Also did the requisite bug fixes.++[[!img /assistant/logs.png alt="screenshot of logs page"]]
@@ -0,0 +1,22 @@+Only one bug fix today, but it was a doozie. It seems that gpg2 has an+incompatability with the gpg 1.x that git-annex was written for, that+causes large numbers of excess passphrase prompts, when it's supposed to be+using a remote's symmetric encryption key. Adding the --batch parameter+fixed this.++I also put together a page listing [[related_software]] to git-annex.++I've also updated [[direct_mode]]'s documentation, about when it's safe to+use direct mode. The intuition I've developed about direct mode is that if+you don't need full versioning of files (with the ability to get back old+versions), direct mode is fine and safe to use. If you want full+versioning, it's best to not use direct mode. Or a reasonable compromise is+to `git annex untrust` the direct mode repository and set up a backup remote.+With this compromise, only if you edit a file twice in a row might the old+version get lost before it can be backed up.++Of course, it would be possible to make direct mode fully version+preserving, but it'd have to back up every file in the repository locally+to do so. Going back to two local copies of every file, which is part of+git that git-annex happily avoids. Hmm, it might be possible to only back+up a file locally until it reaches the backup remote..
@@ -0,0 +1,22 @@+When I wasn't dealing with the snowstorm today, I was fixing more bugs.+Rather serious bugs.++One actually involved corruption to git-annex's location tracking info, due+to a busted three-way merge. Takes an unusual set of circumstances for that+bug to be triggered, which is why it was not noticed before now. Also,+since git-annex is designed to not trust its location tracking info, and+recover from it becoming inconsistent, someone could have experienced the+bug and not really noticed it. Still it's a serious problem and I'm in debt+to user a-or-b for developing a good test case that let me reproduce it and+fix it. (Also added to the test suite.)+[[This is how to make a perfect bug report|bugs/Annex_thinks_file_exists_afer_being_dropped]]++Another bug made `git add; git commit` cause data loss in direct mode.+I was able to make that not lose data, although it still does something+that's unlikely to be desired, unless the goal is to move a file from an+annexed direct mode file to having its entire contents stored in git.++Also found a bug with sync's automatic resolution of git conflicts. It+failed when two repositories both renamed a file to different names.+I had neglected to explicitly `git rm` the old file name, which is+necessary to resolve such a conflict.
@@ -0,0 +1,25 @@+On Friday, worked on several bugs in direct mode mapping code. Fixed it+to not crash on invalid unicode in filenames. Dealt with some bugs when+mappings were updated in subdirectories of the repository.++Those bugs could result in inconsistent mapping files, so today I+made `fsck` check mapping files for consistency.++Leaving for Australia tomorrow, but I also hope to get another bugfix+release out before my flight leaves. Then will be on vacation for several+days, more or less. Then at Linux Conf Australia, where there will+be a git-annex presentation on February 1st.++----++BTW, I've lined up my Android development hardware for next month. I will+be using an [Asus Transformer](http://en.wikipedia.org/wiki/ASUS_Eee_Pad_Transformer),+kindly lent to me by Mark H. This has the advantage+of having a real keyboard, and running the (currently) second most widely used+version of Android, 4.0.x. I have already experienced frustration getting photos+off the thing and into my photo annex; the file manager is the worst I've+seen since the 80's. I understand why so many want an Android port!++Interestingly, its main user filesystem is a FUSE mount point on `/sdcard`+backed by an ext4 filesystem on `/data` that a regular user is not allowed+to access. Whatever craziness this entails does not support symlinks.
@@ -0,0 +1,15 @@+15 hours in a plane with in-seat power. Ok, time for some new features!++Added two new repository groups. ++"manual" can be used to avoid the assistant downloading any file contents+on its own. It'll still upload and otherwise sync data. To download files,+you can use `git annex get` while the assistant is running. You can also+drop files using the command line.++"source" is for repositories that are the source of new files, but don't+need to retain a copy once the file has been moved to another repository.+A camera would be a good example.++Ok, those were easy features to code; I suck at being productive on planes.+Release coming up with those, once I find enough bandwidth here in AU.
@@ -0,0 +1,13 @@+Got back to hacking today, and did something I've wanted to do for some+time. Made all the assistant's threads be managed by a thread manager. This+allows restarting threads if they crash, by clicking a button in the+webapp. It also will allow for other features later, like stopping and+starting the watcher thread, to pause the assistant adding local files.++[[!img /assistant/crashrecovery.png]]++I added the haskell async library as a dependency, which made this pretty+easy to implement. The only hitch is that async's documentation is not+clear about how it handles asyncronous exceptions. It took me quite a while+to work out why the errors I'd inserted into threads to test were crashing+the whole program rather than being caught!
@@ -0,0 +1,10 @@+Hacking on a bus to Canberra for [LCA2013](https://lca2013.linux.org.au/),+I made the webapp's UI for pausing syncing to a repository also work for+the local repository. This pauses the watcher thread. (There's also an+annex.autocommit config setting for this.)++Ironically, this didn't turn out to the use the thread manager I built+yesterday. I am not sure that a ThreadKilled exception would never be+masked in the watcher thread. (There is some overly broad exception+handling in git-annex that dates to back before I quite understood haskell+exceptions.)
@@ -0,0 +1,19 @@+Not doing significant coding here at LCA2013, but stuff is still happening:++* I'll be giving a talk and demo of git-annex and the assistant tomorrow.+ Right after a keynote by Tim Berners-Lee! There's no streaming, but+ a recording will be available later.+* I've met numerous git-annex users and git-annex curious folk from down+ under.+* I had a suggestion that direct mode rename the `.git` directory to+ something else, to prevent foot-shooting git commands being used.+ A wrapper around git could be used to run git commands, and limit+ to safe ones. Under consideration.+* I finally updated the OSX 10.8.2 build to last week's release.+ Been having some problems with the autobuilder, but it finally spat out+ a build. Hopefully this build is good, and it should fix the javascript+ issues with Safari and the webapp.+* Ulrik Sverdrup has written <https://github.com/blake2-ppc/git-remote-gcrypt>,+ which allows using gpg encrypted ssh remotes with git. The same idea+ could be expanded to other types of remotes, like S3. I'm excited+ about adding encrypted git remote support to the assistant!
@@ -0,0 +1,19 @@+Not much available time today, only a few hours.++Main thing I did was fixed up the failed push tracking to use a better data+structure. No need for a queue of failed pushes, all it needs is a map of+remotes that have an outstanding failed push, and a timestamp. Now it+won't grow in memory use forever anymore. :)++Finding the right thread mutex type for this turned out to be a bit of a+challenge. I ended up with a STM TMVar, which is left empty when there are+no pushes to retry, so the thread using it blocks until there are some. And,+it can be updated transactionally, without races.++I also fixed a bug outside the git-annex assistant code. It was possible to+crash git-annex if a local git repository was configured as a remote, and+the repository was not available on startup. git-annex now ignores such+remotes. This does impact the assistant, since it is a long running process+and git repositories will come and go. Now it ignores any that+were not available when it started up. This will need to be dealt with when+making it support removable drives.
@@ -0,0 +1,7 @@+Back from Australia. Either later today or tomorrow I'll dig into the+messages I was not able to get to while traveling, and then the plan is to+get into the Android port.++Video of my LCA2013 [git-annex talk](http://mirror.linux.org.au/linux.conf.au/2013/mp4/gitannex.mp4)+is now available. I have not watched it yet, hope it turned out ok despite+some technical difficulties!
@@ -0,0 +1,23 @@+Got fairly far along in my triage of my backlog, looking through everything+that happened after January 23rd. Still 39 or so items to look at.++There have been several reports of problems with ssh password prompts.+I'm beginning to think the assistant may need to prompt for the password+when setting up a ssh remote. This should be handled by `ssh-askpass` or+similar, but some Linux users probably don't have it installed, and there+seems to be no widely used OSX equivalent.++---++Fixed several bugs today, all involving (gasp) direct mode.++The tricky one involved renaming or deleting files in direct mode.+Currently nothing removes the old filename from the direct mode+mapping, and this could result in the renamed or deleted file+unexpectedly being put back into the tree when content is downloaded.++To deal with this, it now assumes that direct mode mappings may be out of+date compared to the tree, and does additional checks to catch+inconsistencies. While that works well enough for the assistant,+I'd also like to make the `pre-commit` hook update the mappings for files+that are changed. That's needed to handle things like `git mv`.
@@ -0,0 +1,50 @@+I need an Android development environment. I briefly looked into rooting+the Asus Transformer so I could put a Debian chroot on it and build+git-annex in there, but this quickly devolved to the typical maze of+forum posts all containing poor instructions and dead links. Not worth it.++Instead, I'm doing builds on my Sheevaplug, and once I have a static armel+binary, will see what I need to do to get it running on Android.++Fixed building with the webapp disabled, was broken by recent improvements.+I'll be building without the webapp on arm initially, because ghci/template+haskell on arm is still getting sorted out. (I tried ghc 7.6.2 and ghci is+available, but doesn't quite work.)++From there, I got a binary built pretty quickly (well, it's arm, so not *too*+quickly). Then tried to make it static by appending +`-optl-static -optl-pthread` to the ghc command line.+This failed with a bunch of errors:++<pre>+/usr/lib/gcc/arm-linux-gnueabi/4.6/../../../arm-linux-gnueabi/libxml2.a(nanohttp.o): In function `xmlNanoHTTPMethodRedir': (.text+0x2128): undefined reference to `inflateInit2_'+/usr/lib/gcc/arm-linux-gnueabi/4.6/../../../arm-linux-gnueabi/libxml2.a(xzlib.o): In function `xz_decomp': (.text+0x36c): undefined reference to `lzma_code'+...+</pre>++Disabling DBUS and (temporarily) XMPP got around that.++Result!++<pre>+joey@leech:~/git-annex>ldd tmp/git-annex + not a dynamic executable+joey@leech:~/git-annex>ls -lha tmp/git-annex +-rwxr-xr-x 1 joey joey 18M Feb 6 16:23 tmp/git-annex*+</pre>++Next: Copy binary to Android device, and watch it fail in some interesting way. +Repeat.++---++Also more bug triage this morning...++Got the pre-commit hook to update direct mode mappings.+Uses `git diff-index HEAD` to find out what's changed. The only+tricky part was detecting when `HEAD` doesn't exist yet. Git's+plumbing is deficient in this area. Anyway, the mappings get updated+much better now.++Fixed a wacky bug where `git annex uninit` behaved badly on a filesystem+that does not support hardlinks.
@@ -0,0 +1,19 @@+Have not tried to run my static binary on Android yet, but I'm already+working on a plan B in case that doesn't work. Yesterday I stumbled upon+<https://github.com/neurocyte/ghc-android>, a ghc cross-compiler for+Android that uses the Android native development kit. +It first appeared on February 4th. Good timing!++I've gotten it to build and it emits arm executables, that seem to use the+Android linker. So that's very promising indeed. ++I've also gotten cabal working with it, and have it chewing through+installing git-annex's build dependencies.++----++Also made a release today, this is another release that's mostly bugfixes,+and a few minor features. Including one bug fixed at 6 am this morning, urk.++I think I will probably split my days between working on Android porting+and other git-annex development.
@@ -0,0 +1,46 @@+Have been working on getting all the haskell libraries git-annex uses+built with the android cross compiler. Difficulties so far are+libraries that need tweaks to work with the new version of ghc, and some+that use cabal in ways that break cross compilation. Haskell's network+library was the last and most challenging of those.++At this point, I'm able to start trying to build git-annex for android.+Here's the first try!++<pre>+joey@gnu:~/src/git-annex>cabal install -w $HOME/.ghc-android-14-arm-linux-androideabi-4.7/bin/arm-unknown-linux-androideabi-ghc --with-ghc-pkg=$HOME/.ghc-android-14-arm-linux-androideabi-4.7/bin/arm-unknown-linux-androideabi-ghc-pkg --with-ld=$HOME/.ghc-android-14-arm-linux-androideabi-4.7/bin/arm-linux-androideabi-ld --flags="-Webapp -WebDAV -XMPP -S3 -Dbus"+Resolving dependencies...+Configuring git-annex-3.20130207...+Building git-annex-3.20130207...+Preprocessing executable 'git-annex' for git-annex-3.20130207...+on the commandline: Warning:+ -package-conf is deprecated: Use -package-db instead++Utility/libdiskfree.c:28:26:+ fatal error: sys/statvfs.h: No such file or directory+compilation terminated.+</pre>++Should not be far from a first android build now..++----++While I already have Android "hello world" executables to try, I have not yet+been able to run them. Can't seem to find a directory I can write to on the+Asus Transformer, with a filesystem that supports the +x bit. Do you really+have to root Android just to run simple binaries? I'm crying inside.++It seems that the blessed Android NDK way would involve making a Java app,+that pulls in a shared library that contains the native code. For haskell,+the library will need to contain a C shim that, probably, calls an entry+point to the Haskell runtime system. Once running, it can use the FFI to+communicate back to the Java side, probably. The good news is that CJ van+den Berg, who already saved my bacon once by developing ghc-android, tells+me he's hard at work on that very thing.++----++In the meantime, downloaded the Android SDK. Have gotten it to build a+`.apk` package from just javascript code, and managed to do it without+using eclipse (thank god). Will need this later, but for now want to wash+my brain out with soap after using it.
@@ -0,0 +1,20 @@+Thanks to hhm, who pointed me at [KBOX](http://kevinboone.net/kbox.html),+I have verified that I can build haskell programs that work on Android.++After hacking on it all day, I've succeeded in making an initial build of+git-annex for Android. It links! It runs!++Which is not to say it's usable yet; for one thing I need to get a port+of git before it can do anything useful. (Some of the other things git-annex+needs, like ssh and sha256sum, are helpfully provided by KBOX.)++Next step will be to find or built a git port for Android. I know there's+one in the "Terminal IDE" app. Once I can use git-annex at the command line+on Android, I'll be able to test it out some (I can also port the test+suite program and run it on Android), and get a feeling for what is needed+to get the port to a usable command-line state.++And then on to the webapp, and an Android app, I suppose. So far, the port+doesn't include the webapp, but does include the assistant. The webapp+needs ghci/template haskell for arm. A few people have been reporting they+have that working, but I don't yet.
@@ -0,0 +1,33 @@+I'm now successfully using git-annex at the command line on Android.+`git annex watch` works too.++For now, I'm using a git repository under `/data`, which is on a real,+non-cripped filesystem, so symlinks work there.++There's still the issue of running without any symlinks on `/mnt/sdcard`.+While direct mode gets most of the way, it still uses symlinks in a few+places, so some more work will be needed there. Also, git-annex uses hard+links to lock down files, which won't work on cripped filesystems.++Besides that, there's lots of minor porting, but no big show-stoppers+currently.. Some of today's porting work:++* Cross-compiled git for Android. While the Terminal IDE app has some git+ stuff, it's not complete and misses a lot of plumbing commands git-annex+ uses. My git build needs some tweaks to be relocatable without setting+ `GIT_EXEC_PATH`, but it works.++* Switched git-annex to use the Haskell glob library, rather than PCRE. This+ avoids needing libpcre, which simplifies installation on several platforms+ (including Android).++* Made git-annex's `configure` hardcode some settings when cross-compiling+ for Android, rather than probing the build system.++* Android's built-in `lsof` doesn't support the -F option to use a+ machine-readable output format. So wrote a separate lsof output parser for+ the standard lsof output format. Unfortunatly, Android's lsof does not+ provide any information about where a file is open for read or write, so+ for safety, git-annex has to assume any file that's open might be written+ to, and avoid annexing it. It might be better to provide my own lsof+ eventually.
@@ -0,0 +1,22 @@+Ported all the utilities git-annex needs to run on Android: +git, rsync, gnupg, dropbear (ssh client), busybox. Built a+Makefile that can download, patch, and cross build these from source.++While all the utilities work, dropbear doesn't allow git-annex to use ssh+connection caching, which is rather annoying especially since these systems+tend to be rather slow and take a while to start up ssh connections.+I'd sort of like to try to get openssh's client working on Android instead.+Don't know how realistic that is.++Dealt with several parts of git-annex that assumed `/bin/sh` exists,+so it instead uses `/system/bin/sh` on Android. Also adapted `runshell`+for Android.++Now I have a 8 mb compressed tarball for Android.+Uncompressed it's 25 mb. This includes a lot of git and busybox+commands that won't be used, so it could be trimmed down further.+16 mb of it is git-annex itself.++[[Instructions for using the Android tarball|install/Android]] +This is for users who are rather brave, not afraid of command line and+keyboard usage. Good first step.
@@ -0,0 +1,37 @@+There are at least three problems with using git-annex+on `/sdcard` on Android, or on a FAT filesystem, or on (to a first+approximation) Windows:++1. symlinks+2. hard links+3. unix permissions++So, I've added an `annex.crippledfilesystem` setting. `git annex init` now+probes to see if all three are supported, and if not, enables that, as well+as direct mode.++In crippled filesystem mode, all the permissions settings are skipped.+Most of them are only used to lock down content in the annex in indirect+mode anyway, so no great loss.++There are several uses of hard links, most of which can be dealt with by+making copies. The one use of permissions and hard links I absolutely+needed to deal with was that they're used to lock down a file as it's being+ingested into the annex. That can't be done on crippled filesystems, so I+made it instead check the metadata of the file before and after to detect+if it changed, the same way direct mode detects when files are modified.+This is likely better than the old method anyway.++The other reason files are hardlinked while they're being ingested is that+this allows running lsof on a single directory of files that are in the+process of being added, to detect if anything has them open for write.+I still need to adjust the lsof check to work in crippled filesystem mode.+It seems this won't make it much slower to run lsof on the whole repository.++At this point, I can use git-annex with a repository on `/sdcard` or a FAT+filesystem, and at least `git annex add` works. ++Still several things on the TODO list before crippled filesystem mode is+complete. The only one I'm scared about is making `git merge` do something+sane when it wants to merge two trees full of symlinks, and the filesystem+doesn't let it create a symlink..
@@ -0,0 +1,44 @@+Finished crippled filesystem support, except for symlink handling.+This was straightforward, just got lsof working in that mode, made+`migrate` copy key contents, and adapted the rsync special remote to+support it. Encrypted rsync special remotes have no more overhead on+crippled filesystems than normally. Un-encrypted rsync special remotes+have some added overhead, but less than encrypted remotes. Acceptable+for now.++I've now successfully run the assistant on a FAT filesystem.++----++Git handles symlinks on crippled filesystems by setting+`core.symlinks=false` and checking them out as files containing the link+text. So to finish up crippled filesystem support, git-annex needs to+do the same whenever it creates a symlink, and needs to read file contents+when it normally reads a symlink target.++There are rather a lot of calls to `createSymbolicLink`,+`readSymbolicLink`, `getSymbolicLinkStatus`, `isSymbolicLink`, and `isSymLink`+in the tree; only ones that are used in direct mode+need to be converted. This will take a while.++Checking whether something is a symlink, or where it points is especially+tricky. How to tell if a small file in a git working tree is intended to be+a symlink or not? Well, it can look at the content and see if it makes+sense as a link text pointing at a git-annex key. As long as the+possibility of false positives is ok. It might be possible, in some cases,+to query git to verify if the object stored for that file is really a+symlink, but that won't work if the file has been renamed, for example.++Converted some of the most commonly used symlink code to handle this.+Much more to do, but it basically works; I can `git annex get` and `git+annex drop` on FAT, and it works.++-----++Unfortunately, got side-tracked when I discovered that the last release+introduced a bug in direct mode. Due to the bug, "git annex get file; git annex+drop file; git annex get file" would end up with the file being an indirect+mode symlink to the content, rather than a direct mode file. No data loss,+but not right. So, spent several hours fixing that reversion, which was+caused by me stupidly fixing another bug at 5 am in the morning last week.. +and I'll probably be pushing out another release tomorrow with the fix.
@@ -0,0 +1,82 @@+Worked on automatic merge conflict resolution today. I had expected to be+able to use git's merge driver interface for this, but that interface is+not sufficient. There are two problems with it:++1. The merge program is run when git is in the middle of an operation+ that locks the index. So it cannot delete or stage files. I need to+ do both as part of my conflict resolution strategy.+2. The merge program is not run at all when the merge conflict is caused+ by one side deleting a file, and the other side modifying it. This is+ an important case to handle.++So, instead, git-annex will use a regular `git merge`, and if it fails, it+will fix up the conflicts.++That presented its own difficulty, of finding which files in the tree+conflict. `git ls-files --unmerged` is the way to do that, but its output+is a quite raw form:++ 120000 3594e94c04db171e2767224db355f514b13715c5 1 foo+ 120000 35ec3b9d7586b46c0fd3450ba21e30ef666cfcd6 3 foo+ 100644 1eabec834c255a127e2e835dadc2d7733742ed9a 2 bar+ 100644 36902d4d842a114e8b8912c02d239b2d7059c02b 3 bar++I had to stare at the rather impenetrable documentation for hours and+write a lot of parsing and processing code to get from that to these mostly+self explanatory data types:++ data Conflicting v = Conflicting+ { valUs :: Maybe v+ , valThem :: Maybe v+ } deriving (Show)++ data Unmerged = Unmerged+ { unmergedFile :: FilePath+ , unmergedBlobType :: Conflicting BlobType+ , unmergedSha :: Conflicting Sha+ } deriving (Show)++Not the first time I've whined here about time spent parsing unix command+output, is it? :)++From there, it was relatively easy to write the actual conflict cleanup+code, and make `git annex sync` use it. Here's how it looks:++ $ ls -1+ foo.png+ bar.png+ $ git annex sync+ commit + # On branch master+ nothing to commit (working directory clean)+ ok+ merge synced/master + CONFLICT (modify/delete): bar.png deleted in refs/heads/synced/master and modified in HEAD. Version HEAD of bar.png left in tree.+ Automatic merge failed; fix conflicts and then commit the result.+ bar.png: needs merge+ (Recording state in git...)+ [master 0354a67] git-annex automatic merge conflict fix+ ok+ $ ls -1+ foo.png+ bar.variant-a1fe.png+ bar.variant-93a1.png++There are very few options for ways for the conflict resolution code to+name conflicting variants of files. The conflict resolver can only use data+present in git to generate the names, because the same conflict needs to +be resolved the same everywhere.++So I had to choose between using the full key name in the filenames produced+when resolving a merge, and using a shorter checksum of the key, that would be+more user-friendly, but could theoretically collide with another key. +I chose the checksum, and weakened it horribly by only using 32 bits of it!++Surprisingly, I think this is a safe choice. The worst that can+happens if such a collision happens is another conflict, and the conflict+resolution code will work on conflicts produced by the conflict resolution+code! In such a case, it does fall back to putting the whole key in+the filename:+"bar.variant-SHA256-s2550--2c09deac21fa93607be0844fefa870b2878a304a7714684c4cc8f800fda5e16b.png"++Still need to hook this code into `git annex assistant`.
@@ -0,0 +1,28 @@+Pushed out a release yesterday mostly for a bug fix. I have to build+git-annex 5 times now when releasing. Am wondering if I could get rid of+the Linux 64 bit standalone build. The 32 bit build should run ok on 64 bit+Linux systems, since it has all its own 32 bit libraries. What I really+need to do is set up autobuilders for Linux and Android, like we have for OSX.++Today, dealt with all code that creates or looks at symlinks. Audited every+bit of it, and converted all relevant parts to use a new abstraction layer+that handles the pseudolink files git uses when core.symlinks=false.+This is untested, but I'm quite happy with how it turned out.++----++Where next for Android? I want to spend a while testing command-line+git-annex. After I'm sure it's really solid, I should try to get the webapp+working, if possible.++I've heard rumors that Ubuntu's version of ghc somehow supports template+haskell on arm, so I need to investigate that. If I am unable to get+template haskell on arm, I would need to either wait for further+developments, or try to expand yesod's template haskell to regular haskell+and then build it on arm, or I could of course switch away from hamlet+(using blaze-html instead is appealing in some ways) and+use yesod in non-template-haskell mode entirely. One of these will work,+for sure, only question is how much pain.++After getting the webapp working, there's still the issue of bundling it+all up in an Android app that regular users can install.
@@ -0,0 +1,44 @@+Felt spread thin yesterday, as I was working on multiple things+concurrently & bouncing around as compiles finished. Been working to get+openssh to build for Android, which is quite a pain, starting with getting+openssl to build and then dealing with the Cyanogenmod patches, some of+which are necessary to build on Android and some of which break builds+outside Cyanogenmod. At the same time was testing git-annex on Android.+Found and fixed several more portability bugs while doing that. And on the+back burner I was making some changes to the webapp..++(Forgot to commit my blog post yesterday too..)++Today, that all came together.++* When adding another local repository in the webapp, + it now allows you to choose whether it should be combined with+ your current repository, or kept separate. Several people had requested+ a way to add local clones with the webapp, for various reasons, like+ wanting a backup repository, or wanting to make a repository on a NFS+ server, and this allows doing that.++[[!img /assistant/combinerepos.png]]++* More porting fun. FAT filesystems and other things used on Android can+ get all new inode numbers each time mounted. Made git-annex use a+ sentinal file to detect when this has happened, since in direct mode+ it compares inodes. (As a bonus this also makes copying direct mode+ repositories between filesystems work.)++* Got openssh building for Android. Changed it to use $HOME/.ssh rather+ than trusting pwent.++* Got git-annex's ssh connection caching working on Android. That needs+ a place where it can create a socket. When the+ repository is on a crippled filesystem, it instead puts the socket+ in a temporary directory set up on the filesystem where the git-annex+ program resides.++With ssh connection caching, transferring multiple files off my Android+tablet *screams*! I was seeing 6.5 megabytes transferred per second,+sustained over a whole month's worth of photos.++Next problem: `git annex assistant` on Android is for some reason crashing+with a segfault on startup. Especially odd since `git annex watch` works.+I'm so close to snap-photo-and-it-syncs-nirvana, but still so far away...
@@ -0,0 +1,37 @@+<video controls src="http://downloads.kitenet.net/videos/git-annex-android.ogv" width="100%"></video>+<a href="http://downloads.kitenet.net/videos/git-annex-android.ogv">video</a>++Today's work:++* Fixed `git annex add` of a modified file in direct mode.+* Fixed bugs in the inode sentinal file code added yesterday.+* With some help from Kevin Boone, I now understand how KBOX works and+ how to use similar techniques to build my own standalone Android app+ that includes git-annex.++ Kevin is using a cute hack; he ships a tarball and some other stuff+ as (pseudo-)library files (`libfoo.so`), which are the only files+ the Android package manager deigns to install. Then the app runs one+ of these, which installs the programs.++ This avoids needing to write Java code that extracts the programs from+ one of its assets and writes it to an executable file, which is the+ canonical way to do this sort of thing. But I noticed it has a benefit too+ (which KBOX does not yet exploit). Since the pseudo-library file is installed+ with the X bit set, if it's really a program, such as busybox or git-annex,+ that program can be run without needing to copy it to an executable file.+ This can save a lot of disk space. So, I'm planning to include all+ the binaries needed by git-annex as these pseudo-libraries.+* Got the Android Terminal Emulator to build. I will be basing my first+ git-annex Android app on this, since a terminal is needed until there's + a webapp.+* Wasted several hours fighting with `Android.mk` files to include+ my pseudo shared library. This abuse of Makefiles by the NDK is what CDBS+ wants to grow up to be.. or is it the other way around? Anyway, it+ sucks horribly, and I finally found a way to do it without+ modifying the file at all. Ugh.+* At this point, I can build a `git-annex.apk` file containing a+ `libgit-annex.so`, and a `libbusybox.so`, that can both be directly+ run. The plan from here is to give git-annex the ability to+ auto-install itself, and the other pseudo-libraries, when it's run as+ `libgit-annex.so`.
@@ -0,0 +1,32 @@+Well, it's built. [Real Android app for git-annex](http://downloads.kitenet.net/git-annex/android/current/).++[[!img /android/appinstalled.png]]++When installed, this will open a terminal in which you have access to+git-annex and all the git commands and busybox commands as well. No webapp+yet, but command line users should feel right at home.++[[!img /android/terminal.png]]++Please test it out, at least as far as installing it, opening the terminal,+and checking that you can run `git annex`; I've only been able to test on+one Android device so far. I'm especially keen to know if it works with+newer versions of Android than 4.0.3. (I know it only supports arm based+Android, no x86 etc.) Please comment if you tried it.++----++Building this went mostly as planned, although I had about 12 builds of+the app in the middle which crashed on startup with no error message ora+logs. Still, it took only one day to put it all together,+ and I even had time to gimp up a quick icon. (Better icons welcome.)++Kevin thinks that my space-saving hack won't work on all Androiden, and he+may be right. If the `lib` directory is on a different filesystem on some+devices, it will fail. But I used it for now anyhow. Thanks to the hack,+the 7.8 mb compressed .apk file installs to use around 23 mb of disk space.++----++Tomorrow: Why does `git-annex assistant` on Android re-add all existing+files on startup?
@@ -0,0 +1,26 @@+So it seems the Android app works pretty well on a variety of systems.+Only report of 100% failure so far is on Cyanogenmod 7.2 (Android 2.3.7).++Worked today on some of the obvious bugs.++* Turns out that getEnvironment is broken on Android, returning no+ environment, which explains the weird git behavior where it complains+ that it cannot determine the username and email (because it sees no USER+ or HOST), and suggests setting them in the global git config (which it+ ignores, because it sees no HOME). Put in a work around for this+ that makes `git annex init` more pleasant, and opened a bug report on+ ghc-android.+* Made the Android app detect when it's been upgraded, and re-link all+ the commands, etc.+* Fixed the bug that made `git-annex assistant` on Android re-add all+ existing files on startup.+* Enabled a few useful things in busybox. Including vi.+* Replaced the service notification icon with one with the git-annex logo.+* Made the terminal not close immediately when the shell exits, which+ should aid in debugging of certain types of crashes.++I want to set up an autobuilder for Android, but to do that I need to+install all the haskell libraries on my server. Since getting them built+for Android involved several days of hacking the first time, this will+be an opportunity to make sure I can replicate that. Hopefully in less time.+;)
@@ -0,0 +1,36 @@+Set up an autobuilder for the linux standalone binaries.+Did not get an Android autobuilder set up yet, but I did update+the Android app with recent improvements, so [[upgrade|install/Android]].++----++Investigated further down paths to getting the webapp built for Android.++* Since recent ghc versions support ghci and thus template haskell on arm,+ at least some of the time, I wonder what's keeping the ghc-android build+ from doing so? It might be due to it being a cross compiler. I tried+ recompiling it with the stage 2, native compiler enabled. While I was+ able to use that ghc binary on Android, it refused to run --interactive,+ claiming it was not built with that enabled. Don't really understand+ the ghc build system, so might have missed something.++ Maybe I need to recompile ghc using the native ghc running on Android.+ But that would involve porting gcc and a lot of libraries and toolchain+ stuff to Android.++* [yesod-pure](http://hackage.haskell.org/package/yesod-pure) is an option,+ and I would not mind making all the code changes to use it, getting+ rid of template haskell entirely. (Probably around 1 thousand lines of+ code would need to be written, but most of it would be trivial+ conversion of hamlet templates.)+ + Question is, will yesod install at all without template haskell? Not+ easily. `vector`, `monad-logger`, `aeson`, `shakespeare`,+ `shakespeare-css`, `shakespeare-js`, `shakespeare-i18n`, `hamlet`+ all use TH at build time. Hacked them all to just remove the TH parts.++ The hack job on `yesod-core` was especially rough, involving things like+ 404 handlers. Did get it to build tho!++ Still a dozen packages before I can build yesod, and then will try + building [this yesod-pure demo](https://gist.github.com/snoyberg/3870834/raw/212f0164de36524291df3ab35788e2b72d8d1e75/fib.hs).
@@ -0,0 +1,11 @@+Wrote a C shim to get the Android app started. This avoids it relying on+the Android /system/bin/sh to run its shell script, or indeed relying on+any unix utilities from Android at all, which may help on some+systems. Pushed a new build of the Android app.++Tracked down a failure a lot of people are reporting with WebDAV support+to a backported security fix in the TLS library, and filed an upstream bug+about it.++Various other misc fixing and stuff.+My queue of bug reports and stuff only has 47 items in it now. Urk..
@@ -0,0 +1,26 @@+An Android autobuilder is now set up to run nightly. At this point+I don't see an immediate way to getting the webapp working on Android, so+it's best to wait a month or two and see how things develop in Haskell land.+So I'm moving on to other things.++Today:++* Fixed a nasty regression that made `*` not match files in subdirectories.+ That broke the preferred content handling, amoung other things. I will+ be pushing out a new release soon.+* As a last Android thing (for now), made the Android app automatically+ run `git annex assistant --autostart` , so you can manually set up+ an assistant-driven repository on Android, listing the repository in+ `.config/git-annex/autostart`+* Made the webapp display any error message from `git init` if it fails.+ This was the one remaining gap in the logging.+ One reason it could fail is if the system has a newer git in use, and+ `~/.gitconfig` is configured with some options the older git bundled+ with git-annex doesn't like.+* Bumped the major version to 4, and annex.version will be set to 4 in+ new direct mode repositories. (But version 3 is otherwise still used, to+ avoid any upgrade pain.) This is to prevent old versions that don't+ understand direct mode from getting confused. I hope direct mode is+ finally complete, too, after the work to make it work on crippled+ filesystems this month.+* Misc other bugfixes etc. Backlog down to 43.
@@ -0,0 +1,50 @@+Random improvements day..++Got the merge conflict resolution code working in `git annex assistant`.++Did some more fixes to the pushing and pulling code, covering some cases+I missed earlier. ++Git syncing seems to work well for me now; I've seen it recover+from a variety of error conditions, including merge conflicts and repos+that were temporarily unavailable.++----++There is definitely a MVar deadlock if the merger thread's inotify event+handler tries to run code in the Annex monad. Luckily, it doesn't+currently seem to need to do that, so I have put off debugging what's going+on there.++Reworked how the inotify thread runs, to avoid the two inotify threads+in the assistant now from both needing to wait for program termination,+in a possibly conflicting manner.++Hmm, that *seems* to have fixed the MVar deadlock problem.++----++Been thinking about how to fix [[bugs/watcher_commits_unlocked_files]].+Posted some thoughts there.++It's about time to move on to data [[syncing]]. While eventually that will+need to build a map of the repo network to efficiently sync data over the+fastest paths, I'm thinking that I'll first write a dumb version. So, two+more threads:++1. Uploads new data to every configured remote. Triggered by the watcher+ thread when it adds content. Easy; just use a `TSet` of Keys to send.++2. Downloads new data from the cheapest remote that has it. Could be + triggered by the+ merger thread, after it merges in a git sync. Rather hard; how does it+ work out what new keys are in the tree without scanning it all? Scan+ through the git history to find newly created files? Maybe the watcher+ triggers this thread instead, when it sees a new symlink, without data,+ appear.++Both threads will need to be able to be stopped, and restarted, as needed+to control the data transfer. And a lot of other control smarts will+eventually be needed, but my first pass will be to do a straightforward+implementation. Once it's done, the git annex assistant will be basically+usable.
@@ -0,0 +1,57 @@+First day of [Kickstarter funded work](http://www.kickstarter.com/projects/joeyh/git-annex-assistant-like-dropbox-but-with-your-own/)! ++Worked on [[inotify]] today. The `watch` branch in git now does a pretty+good job of following changes made to the directory, annexing files+as they're added and staging other changes into git. Here's a quick+transcript of it in action:++ joey@gnu:~/tmp>mkdir demo+ joey@gnu:~/tmp>cd demo+ joey@gnu:~/tmp/demo>git init+ Initialized empty Git repository in /home/joey/tmp/demo/.git/+ joey@gnu:~/tmp/demo>git annex init demo+ init demo ok+ (Recording state in git...)+ joey@gnu:~/tmp/demo>git annex watch &+ [1] 3284+ watch . (scanning...) (started)+ joey@gnu:~/tmp/demo>dd if=/dev/urandom of=bigfile bs=1M count=2+ add ./bigfile 2+0 records in+ 2+0 records out+ 2097152 bytes (2.1 MB) copied, 0.835976 s, 2.5 MB/s+ (checksum...) ok+ (Recording state in git...)+ joey@gnu:~/tmp/demo>ls -la bigfile+ lrwxrwxrwx 1 joey joey 188 Jun 4 15:36 bigfile -> .git/annex/objects/Wx/KQ/SHA256-s2097152--e5ced5836a3f9be782e6da14446794a1d22d9694f5c85f3ad7220b035a4b82ee/SHA256-s2097152--e5ced5836a3f9be782e6da14446794a1d22d9694f5c85f3ad7220b035a4b82ee+ joey@gnu:~/tmp/demo>git status -s+ A bigfile+ joey@gnu:~/tmp/demo>mkdir foo+ joey@gnu:~/tmp/demo>mv bigfile foo+ "del ./bigfile"+ joey@gnu:~/tmp/demo>git status -s+ AD bigfile+ A foo/bigfile++Due to Linux's inotify interface, this is surely some of the most subtle,+race-heavy code that I'll need to deal with while developing the git annex+assistant. But I can't start wading, need to jump off the deep end to make+progress!++The hardest problem today involved the case where a directory is moved+outside of the tree that's being watched. Inotify will still send events+for such directories, but it doesn't make sense to continue to handle them.++Ideally I'd stop inotify watching such directories, but a lot of state+would need to be maintained to know which inotify handle to stop watching.+(Seems like Haskell's inotify API makes this harder than it needs to be...)++Instead, I put in a hack that will make it detect inotify events from+directories moved away, and ignore them. This is probably acceptable,+since this is an unusual edge case.++----++The notable omission in the inotify code, which I'll work on next, is+staging deleting of files. This is tricky because adding a file to the+annex happens to cause a deletion event. I need to make sure there are no+races where that deletion event causes data loss.
@@ -0,0 +1,19 @@+As well as making a new release, I rewrote most of the Makefile, so that it+uses cabal to build git-annex. This avoids some duplication, and most+importantly, means that the Makefile can auto-detect available libraries+rather than needing to juggle build flags manually. Which was becoming a+real pain.++I had avoided doing this before because cabal is slow for me on my little+netbook. Adding ten seconds to every rebuild really does matter! But I came+up with a hack to let me do incremental development builds without the+cabal overhead, by intercepting and reusing the ghc command that cabal+runs.++There was also cabal "fun" to get the Android build working with cabal.+And more fun involving building the test suite. For various reasons, I+decided to move the test suite into the git-annex binary. So you can run+`git annex test` at any time, any place, and it self-tests. That's a neat+trick I've seen one or two other programs do, and probably the nicest thing+to come out of what was otherwise a pretty yak shaving change that involved+babysitting builds all day.
@@ -0,0 +1,38 @@+[[!meta title="day 201 real Android wrapup"]]++I got yesod-pure fully working on Android...++[[!img fib.png size=400x]]++As expected, this involved manually splicing some template haskell. I'm now+confident I can port the git-annex webapp to Android this way, and that it+will take about a week. Probably will start on that in a month or so. If+anyone has some spare Android hardware they'd like to loan me, possibly+sooner. (Returning loaner Asus Transformer tomorrow; thanks Mark.) Although+I'm inclined to let the situation develop; we may just get a ghc-android+that supports TH..++Also:++* Fixed several bugs in the Android installation process.+* Committed patches for all Haskell libraries I've modified to+ the git-annex git repo.+* Ran the test suite on Android. It found a problem; seems `git clone`+ of a local repository is broken in the Android environment.++Non-Android:++* Made the assistant check every hour if logs have grown larger than a+ megabyte, and rotate them to avoid using too much disk space.+* Avoided noise in log about typechanged objects when running+ git commit in direct mode repositories. Seems `git commit`+ has no way to shut that up, so I had to /dev/null it.+* When run with `--debug`, the assistant now logs more information+ about why it transfers or drops objects.+* Found and fixed a case where moving a file to an archive directory would+ not cause its content to be dropped.+* Working on a bug with the assistant where moving a file out of an + archive directory in direct mode sometimes ends up with a symlink+ rather than a proper direct mode file. Have not gotten to the bottom+ of it entirely, but it's a race, and I think the race is between+ the direct mode mapping being updated, and the file being transferred.
binary file changed (absent → 69535 bytes)
@@ -0,0 +1,31 @@+Seems I am not done with the Android porting just yet after all. One more+porting day..++Last night I managed to get all of Yesod to build for Android.+I even successfully expanded some Template Haskell used in yesod-form. And+am fairly confident I could manually expand all the TH in there, so it's+actually useable without TH. Most of the TH is just commented out for now.++However, programs using Yesod didn't link; lots of missing symbols. I have+been fighting to fix those all day today.++Finally, I managed to build [the yesod-pure demo server](https://gist.github.com/snoyberg/3870834/raw/212f0164de36524291df3ab35788e2b72d8d1e75/fib.hs),+and I have a working web server on Android! It listens for requests, it logs+them correctly, and it replies to requests. I did cripple yesod's routing+code in my hack-n-slash port of it, so it fails to *display* any pages,+but never has "Internal Server Error" in a web browser been such a sweet+sight. ;-)++At this point, I estimate about 1 or 2 weeks work to get to an Android+webapp. I'd need to:++1. More carefully port Yesod, manually expanding all Template Haskell+ as I went, rather than commenting it all out like I did this time.+2. Either develop a tool to automatically expand Hamlet TH splices+ (preferred; seems doable), or convert all the webapp's templates+ to not use Hamlet.++-----++I've modified 38 Haskell libraries so far to port them to Android. Mostly+small hacks, but eep this is a lot of stuff to keep straight.
@@ -0,0 +1,25 @@+Stuck on a bug or two, I instead built a new Preferences page:++[[!img /assistant/preferences.png]]++The main reason I wanted that was to allow enabling debug logging at+runtime. But I've also wanted to expose annex.diskreserve and+annex.numcopies settings to the webapp user. Might as well let them control+whether it auto-starts too.++Had some difficulty deciding where to put this. It could be considered+additional configuration for the local repository, and so go in the+local repository edit form. However, this stuff can only be configured for+local repositories, and not remotes, and that same form is used to edit +remotes, which would lead to inconsistent UI and complicate the code.+Also, it might grow to include things not tied to any repository,+like choice of key/value backends. So, I put the preferences on their own+page.++---++Also, based on some useful feedback from testing the assistant with a large+number of files, I made the assistant disable git-gc auto packing in+repositories it sets up. (Like fsck, git-gc always seems to run exactly+when you are in a hurry.) Instead, it'll pack at most once a day, and with+a rather higher threshold for the number of loose objects.
@@ -0,0 +1,62 @@+Tracked down the bug that's been eluding me for days. It was indeed a race, and+could result in a file being transferred into a direct mode repository and+ending up in indirect mode. Was easy to fix once understood, just needed to+update the direct mode mapping before starting the transfer.++While I was in there, I noticed another potential race, also in direct+mode, where the watcher could decide to rewrite a symlink to fix its+target, and at just the wrong time direct mode content could arrive in its+place, and so get deleted. Fixed that too.++Seems likely there are some other direct mode races. I spent quite a while+hammering on dealing with the indirect mode races with the assistant +originally.++-----++Next on my list is revisiting XMPP.++Verified that git push over XMPP works between multiple repositories that+are sharing the same XMPP account. It does.++Seeing the XMPP setup process with fresh eyes, I found several places+wording could be improved. Also, when the user goes in and configures +(or reconfigures) an XMPP account, the next step is to do pairing,+so it now redirects directly to there.++Next I need to make XMPP get back into sync after a network disconnection+or when the assistant is restarted. This currently doesn't happen until+a XMPP push is received due to a new change being made.++### back burner: yesod-pure++Last night I made a yesod-pure branch, and did some exploratory conversion+away from using Hamlet, of the Preferences page I built yesterday.++I was actually finding writing pure Blaze worked *better* than Hamlet,+at first. Was able to refactor several things into functions that in Hamlet+are duplicated over and over in my templates, and built some stuff that makes+rendering type safe urls in pure Blaze not particularly ungainly. For example,+this makes a submit button and a cancel button that redirects to another page:++[[!format haskell """+ buttons = toWidget $ \redir ->+ "Save Preferences" <>|<> redir ConfigurationR []+"""]]++The catch is how to deal with widgets that need to be nested inside other+html. It's not possible to do this both cleanly and maximally+efficiently, with Blaze. For max efficiency, all the html before the widget+should be emitted, and then the widget run, and then all html after it be+emitted. To use Blaze, it would have to instead generate the full html,+then split it around the widget, and then emit the parts, which is less+efficient, doesn't stream, etc.++I guess that's the core of what Hamlet does; it allows a clean+representation and due to running TH at build time, can convert this into+an efficient (but ugly) html emitter.++So, I may give up on this experiment. Or I may make the webapp less than+maximally fast at generating html and go on with it. After all, these+sorts of optimisations are mostly aimed at high-volume websites, not local+webapps.
@@ -0,0 +1,12 @@+Yesterday was all bug fixes, nothing to write about really.++Today I've been working on getting XMPP remotes to sync more reliably.+I left some big holes when I stopped work on it in November:++1. The assistant did not sync with XMPP remotes when it started up.+2. .. Or when it detected a network reconnection.+3. There was no way to trigger a full scan for transfers+ after receiving a push from an XMPP remote.++The asynchronous nature of git push over XMPP complicated doing this, but+I've solved all 3 issues today.
@@ -0,0 +1,7 @@+More XMPP fixes. The most important change is that it now stores important+messages, like push requests, and (re)sends them when a buddy's client+sends XMPP presence. This makes XMPP syncing much more robust, all the+clients do not need to already be connected when messages are initially+sent, but can come and go. Also fixed a bug preventing syncing from working+immediately after XMPP pairing. XMPP seems to be working well now; I only+know of one minor bug.
@@ -0,0 +1,17 @@+Fixed the last XMPP bug I know of. Turns out it was not specific to XMPP at+all; the assistant could forget to sync with any repository on startup+under certain conditions.++Also fixed bugs in `git annex add` and in the glob matching, and some more.++I've been working on some screencasts. More on them later.. But while doing+them I found a perfect way to reliably reproduce the webapp hang that+I've been chasing for half a year, and last saw at my presentation in+Australia. Seems the old joke about bugs only reproducible during+presentations is literally true here!++I have given this bug its [[own page|bugs/webapp_hang]] at last, and have a+tcpdump of it happening and everything. Am working on an hypotheses that it+might be caused by Warp's [slowloris](http://ha.ckers.org/slowloris/)+attack prevention code being falsely triggered by the repeated hits the web+browser makes as the webapp's display is updated.
@@ -0,0 +1,23 @@+> And so we waited. Tick-tock, blink-blink, thirty seconds stretched+> themselves out one by one, a hole in human experience. -- The Bug++I *think* I've managed to fully track down the [[webapp_hang]]. It is,+apparently, a bug in the Warp web server's code intended to protect against+the [Slowloris](http://ha.ckers.org/slowloris/) attack. It assumes,+incorrectly, that a web browser won't reuse a connection it's left idle for+30 seconds. Some bad error handling keeps a connection open with no thread+to service it, leading to the hang.+<https://github.com/yesodweb/wai/issues/146>++Have put a 30 minute timeout into place as a workaround, and, unless+a web browser sits on an idle connection for a full 30 minutes and then+tries to reuse it, this should be sufficient.++I was chasing that bug, quietly, for 6 months. Would see it now and+then, but not be able to reproduce it or get anywhere with analysis.+I had nearly given up. If you enjoy stories like that, read Ellen+Ullman's excellent book The Bug.++> To discover that between the blinks of the machine’s shuttered eye—going+> on without pause or cease; simulated, imagined, but still not caught—was+> life.
@@ -0,0 +1,22 @@+Today is a planning day. I have only a few days left before I'm off to+Nicaragua for [DebConf](http://debconf12.debconf.org/), where I'll only+have smaller chunks of time without interruptions. So it's important to get+some well-defined smallish chunks designed that I can work on later. See+bulleted action items below (now moved to [[syncing]]. Each+should be around 1-2 hours unless it turns out to be 8 hours... :)++First, worked on writing down a design, and some data types, for data transfer+tracking (see [[syncing]] page). Found that writing down these simple data+types before I started slinging code has clarified things a lot for me.++Most importantly, I realized that I will need to modify `git-annex-shell`+to record on disk what transfers it's doing, so the assistant can get that+information and use it to both avoid redundant transfers (potentially a big+problem!), and later to allow the user to control them using the web app.++While eventually the user will be able to use the web app to prioritize+transfers, stop and start, throttle, etc, it's important to get the default+behavior right. So I'm thinking about things like how to prioritize uploads+vs downloads, when it's appropriate to have multiple downloads running at+once, etc.+
@@ -0,0 +1,29 @@+Trying to record screencasts demoing the assistant is really helping me+see things that need to be fixed.++Got the version of the haskell TLS library in Debian fixed, backporting+some changes to fix a botched security fix that made it reject all+certificates. So WebDAV special remotes will work again on the next release.++Fixed some more problems around content being dropped when files are+moved to archive directories, and gotten again when files are+moved out.++Fixed some problems around USB drives. One was a real jaw-dropping+bug: "git annex drop --from usbdrive" when the drive was not+connected still updated the location log to indicate it did not have+the file anymore! (Thank goodness for fsck..)++I've noticed that moving around files in direct mode repos is inneficient,+because the assistant re-checksums the "new" file. One way to avoid+that would be to have a lookup table from (inode, size, mtime) to+key, but I don't have one, and would like to avoid adding one.++Instead, I have a cunning plan to deal with this heuristically. If the+assistant can notice a file was removed and another file added at the same+time, it can compare the (inode, size, mtime) to see if it's a rename, and+avoid the checksum overhead.++The first step to getting there was to make the assistant better at+batching together delete+add events into a single rename commit. I'm happy+to say I've accomplished that, with no perceptable delay to commits.
@@ -0,0 +1,24 @@+Got renaming fully optimised in the assistent in direct mode. I even got it+to work for whole directory renames. I can drag files around all day in the+file manager and the assistant often finishes committing the rename before+the file manager updates. So much better than checksumming every single+renamed file! Also, this means the assistant makes just 1 commit when a+whole directory is renamed.++Last night I added a feature to `git annex status`. It can now be asked to+only show the status of a single directory, rather than the whole annex.+All the regular file filtering switches work, so some neat commands+are possible. I like `git annex status . --in foo --not --in bar` to see+how much data is in one remote but not another.++This morning, an important thought about [[bugs/smarter_flood_filling]],+that will avoid unnecessary uploads to transfer remotes when all that's+needed to get the file to its destination is a transfer over the LAN.+I found an easy way to make that work, at least in simple cases.+Hoping to implement it soon.++Less fun, direct mode turns out to be somewhat buggy when files with+duplicate content are in the repository. Nothing fails, but `git annex+sync` will re-checksum files each time it's run in this situation, and the+assistant will re-checksum files in certian cases. Need to work on this+soon too.
@@ -0,0 +1,24 @@+Last night, revamped the web site, including making a [[/videos]]+page, which includes a new screencast introducing the git-annex assistant.++Worked on improving my Haskell development environment in vim.+hdevtools is an excellent but tricky thing to get working. Where before+it took around 30 seconds per compile for me to see type errors,+I now see them in under a second each time I save, and can also look up+types of any expression in the file. Since programming in Haskell is+mostly driven by reacting to type errors ;) this should speed me up a lot,+although it's not perfect. Unfortunatly, I got really caught up in tuning+my setup, and only finished doing that at 5:48 am.++Disasterously late this morning, fixed the assistant's+`~/.ssh/git-annex-shell` wrapper so it will work when the ssh key does+not force a command to be run. Also made the webapp behave better+when it's told to create a git repository that already exists.++After entirely too little sleep, I found a puzzling bug where copying files+to a local repo fails once the inode cache has been invalidated. This+turned out to involve running a check in the state monad of the wrong+repository. A failure mode I'd never encountered before.++Only thing I had brains left to do today was to record another screencast,+which is rendering now...
@@ -0,0 +1,34 @@+Got the assistant to check again, just before starting a transfer, if+the remote still wants the object. This should be all that's needed to+handle the case where there is a transfer remote on the internet somewhere,+and a locally paired client on the LAN. As long as the paired repository+has a lower cost value, it will be sent any new file first, and if that+is the only client, the file will not be sent to the transfer remote at+all.++But.. locally paired repos did not have a lower cost set, at all.+So I made their cost be set to 175 when they're created. Anyone+who already did local pairing should make sure the Repositories+list shows locally paired repositories above transfer remotes.++Which brought me to needing an easy way to reorder that list of remotes,+which I plan to do by letting the user drag and drop remotes around,+which will change their cost accordingly. Implementing that has two+pain points:++1. Often a lot of remotes will have the same default cost value.+ So how to insert a remote in between two that have cost 100?+ This would be easy if git-annex didn't have these cost numbers,+ and instead just had an ordered list of remotes.. but it doesn't.+ Instead, dragging remotes in the list will sometimes need to change+ the costs of others, to make room to insert them in. It's BASIC+ renumbering all over again. So I wrote some code to do this with as+ little bother as possible.++2. Drag and drop means javascript. I got the basics going quickly with+ jquery-ui, only to get stuck for over an hour on some CSS issue+ that made lines from the list display all weird while being dragged.+ It is always something like this with javascript..++So I've got these 2 peices working, and even have the AJAX call+firing, but it's not quite wired up just yet. Tomorrow.
@@ -0,0 +1,5 @@+Fighting with javascript all day and racing to get a release out. Unstuck+the OSX and Android autobuilders. Got drag and drop repository list+reordering working great. Tons of changes in this release!++Also put up a new podcast.
@@ -0,0 +1,25 @@+I've reworked the UI of the webapp's dashboard. Now the repository list is+included, above the transfers. I found I was spending a lot of time+switching between the dashboard and repository list, so might as well+combine them into a single screen. Yesod's type safe urls and widgets+made this quite easy to do, despite it being a thousand line commit.+Liking the result ... Even though it does make all my screencasts dated.++[[!img /assistant/dashboard.png]]++----++Rest of my time was spent on XMPP pairing UI. Using the same pages for both+pairing with a friend and for self-pairing was confusing, so now the two+options are split.++Now every time an XMPP git push is received or sent, it checks if there's+a cloud repository configured, which is needed to send the contents of+files. If not, it'll display this alert. Hopefully this+will be enough to get users fully set up.++[[!img /assistant/cloudnudge.png]]++At this point I'm finally happy enough with the XMPP pairing + cloud+repository setup process to film a screencast of it. As soon as I have+some time & bandwidth someplace quiet. Expect one by the end of the month.
@@ -0,0 +1,42 @@+A long time ago I made Remote be an instance of the Ord typeclass, with an+implementation that compared the costs of Remotes. That seemed like a good+idea at the time, as it saved typing.. But at the time I was still making+custom Read and Show instances too. I've since learned that this is *not* a+good idea, and neither is making custom Ord instances, without deep thought+about the possible sets of values in a type.++This Ord instance came around and bit me when I put Remotes into a Set,+because now remotes with the same cost appeared to be in the Set even if +they were not. Also affected putting Remotes into a Map. I noticed this+when the webapp got confused about which Remotes were paused.++Rarely does a bug go this deep. I've fixed it comprehensively, first+removing the Ord instance entirely, and fixing the places that wanted to+order remotes by cost to do it explicitly. Then adding back an Ord instance+that is much more sane. Also by checking the rest of the Ord (and Eq) +instances in the code base (which were all ok).++While doing that, I found lots of places that kept remotes in Maps and+Sets. All of it was probably subtly broken in one way or another before+this fix, but it would be hard to say exactly how the bugs would+manifest.++-----++Also fought some with Google Talk today. Seem to be missing presence+messages sometimes. Ugh. May have fixed it, but I've thought that before..++Made --debug include a sanitized dump of the XMPP protocol.++Made UI changes to encourage user to install git-annex on the server when+adding a ssh server, rather than just funneling them through to rsync.++Fixed UI glitches in XMPP username/password prompt.++Switched all forms in the webapp to use POST, to avoid sensitive+information leaking on the url bar.++----++Added an incremental backup group. Repositories in this group only want+files that have not been backed up somewhere else yet.
@@ -0,0 +1,2 @@+Is what I planned to do on git-annex today. Instead I fixed several bugs,+but I'm drawing the line at blogging. Oops.
@@ -0,0 +1,14 @@+Triaged some of the older bugs and was able to close a lot of them.++-----++Should mention that I will be in Boston this weekend, attending+[LibrePlanet 2013](http://libreplanet.org/wiki/LibrePlanet:Conference/2013).+Drop by and find me, I'll have git-annex stickers! ;)++-----++Did some UI work on the webapp. Minor stuff, but stuff that needed to be+fixed up. Like inserting zero-width spaces into filenames displayed in it+so very long filenames always get reasonably wrapped by the browser.+(Perhaps there's a better way to do that with CSS?)
@@ -0,0 +1,28 @@+Worked today on two action items from my last blog post:++* on-disk transfers in progress information files (read/write/enumerate)+* locking for the files, so redundant transfer races can be detected,+ and failed transfers noticed++That's all done, and used by the `get`, `copy`, and `move` subcommands.++Also, I made `git-annex status` use that information to display any+file transfers that are currently in progress:++ joey@gnu:~/lib/sound/misc>git annex status+ [...]+ transfers in progress: + downloading Vic-303.mp3 from leech++(Webapp, here we come!)++However... Files being sent or received by `git-annex-shell` don't yet+have this transfer info recorded. The problem is that to do so,+`git-annex-shell` will need to be run with a `--remote=` parameter. But+old versions will of course fail when run with such an unknown parameter.++This is a problem I last faced in December 2011 when adding the `--uuid=`+parameter. That time I punted and required the remote `git-annex-shell` be+updated to a new enough version to accept it. But as git-annex gets more widely+used and packaged, that's becoming less an option. I need to find a real+solution to this problem.
@@ -0,0 +1,40 @@+I've been running some large transfers with the assistant, and looking at+ways to improve performance. (I also found and fixed a zombie process+leak.)++----++One thing I noticed is that the assistant pushes changes to the git-annex+location log quite frequently during a batch transfer. If the files being+transferred are reasonably sized, it'll be pushing once per file transfer. +It would be good to reduce the number of pushes, but the pushes are+important in some network topologies to inform other nodes+when a file gets near to them, so they can get the file too.++Need to see if I can find a smart way to avoid some of the pushes.+For example, if we've just downloaded a file, and are queuing uploads+of the file to a remote, we probably don't need to push the git-annex+branch to the remote.++----++Another performance problem is that having the webapp open while transfers+are running uses significant CPU just for the browser to update the progress+bar. Unsurprising, since the webapp is sending the browser a new `<div>`+each time. Updating the DOM instead from javascript would avoid that;+the webapp just needs to send the javascript either a full `<div>` or a+changed percentage and quantity complete to update a single progress bar.++I'd prefer to wait on doing that until I'm able to use Fay to generate+Javascript from Haskell, because it would be much more pleasant.. will see.++----++Also a performance problem when performing lots of transfers, particularly+of small files, is that the assistant forks off a `git annex transferkey`+for each transfer, and that has to in turn start up several git commands.++Today I have been working to change that, so the assistant maintains a+pool of transfer processes, and dispatches each transfer it wants to make+to a process from the pool. I just got all that to build, although untested+so far, in the `transferpools` branch.
@@ -0,0 +1,28 @@+Was unsure yesterday if my transferrer pools code would just work, or+would be horribly broken and need a lot of work to get going. It was a+complex change involving both high-level STM code and low-level pipes and+fds. Well, it almost worked 100% first time, I just had a minor issue in+my fd setup to fix. Everything else seems to work perfectly.+Very happy how that went!++----++Improved support and documentation for using the OSX app and Linux+standalone tarball at the command line. Now it's sufficient to just put+their directory into `PATH`, rather than using `runshell`.++----++The webapp's form for adding a removable drive now allows specifying the+directory to use within the drive (default "annex").++When the drive's repository already exists, and it's not a repository+that git-annex knows about, it confirms that the user wants+to combine its contents into their repository.+++(Should probably implement this same check when adding a ssh remote.)++----++Off to Boston!
@@ -0,0 +1,16 @@+Back from my trip. Spent today getting caught up.++Didn't do much while I was away. Pushed out a new release on Saturday.+Made `git annex` usage display nicer.++Fixed some minor webapp bugs today. The interesting bug was a+race that sometimes caused alerts or other notifications to be+missed and not be immediately displayed if they occurred while+a page was loading. You sometimes had to hit reload to see them,+but not anymore!++Checked if the `push.default=simple` change in upcoming git release will+affect git-annex. It shouldn't affect the assistant, or `git annex sync`,+since they always list all branches to push explicitly. But if you `git push`+manually, when the default changes that won't include the git-annex branch+in the push any longer.
@@ -0,0 +1,24 @@+Went out and tried for the second time to record a screencast demoing+setting up syncing between two computers using just Jabber and a cloud+remote. I can't record this one at home, or viewers would think git-annex+was crazy slow, when it's just my dialup. ;) But once again I encountered+bugs, and so I found myself working on progress bars today, unexpectedly.++Seems there was confusion in different parts of the progress bar code+about whether an update contained the total number of bytes transferred, or+the delta of bytes transferred since the last update. One way this bug+showed up was progress bars that seemed to stick at 0% for a long time.+Happened for most special remotes, although not for rsync or git remotes.+In order to fix it comprehensively, I added a new BytesProcessed data type,+that is explicitly a total quantity of bytes, not a delta. And checked and+fixed all the places that used a delta as that type was knitted into+the code.++(Note that this doesn't necessarily fix every problem with progress bars.+Particularly, buffering can now cause progress bars to seem to run ahead+of transfers, reaching 100% when data is still being uploaded. Still,+they should be a lot better than before.)++I've just successfully run through the Jabber + Cloud remote setup process+again, and it seems to be working great now. Maybe I'll still get the+screencast recorded by the end of March.
@@ -0,0 +1,23 @@+Built a feature for power users today. `annex.largefiles` can be+configured to specify what files `git annex add` and the assistant should+put into the annex. It uses the same syntax as [[/preferred_content]],+so arbitrarily complex expressions can be built.++For example, a game written in C with some large data files could+include only 100kb or larger files, that are not C code:++ annex.largefiles = largerthan=100kb and not (include=*.c or include=*.h) ++The assistant will commit small files to git directly!+`git annex add`, being a lower level tool, skips small files+and leaves it up to you to `git add` them as desired.++It's even possible to tell the assistant that no file is too large to be+committed directly to git. `git config annex.largefiles 'exclude=*'`+The result should be much like using SparkleShare or dvcs-autosync.++-----++Also today, made the remote ssh server checking code in the webapp+deal with servers where the default shell is csh or some other non-POSIX+shell.
@@ -0,0 +1,47 @@+I've posted a poll: [[polls/goals_for_April]]++----++Today added UI to the webapp to delete repositories, which many+users have requested. It can delete the local repository,+with appropriate cautions and sanity checks:++[[!img /assistant/deleterepository.png]]++More likely, you'll use it to remove a remote, which is done with no muss+and no fuss, since that doesn't delete any data and the remote can always+be added back if you change your mind.++It also has an option to fully delete the data on a remote. This doesn't+actually delete the remote right away. All it does is marks the remote+as untrusted[1], and configures it to not want any content.+This causes all the content on it to be sucked off to whatever+other repositories can hold it.++I had to adjust the preferred content expressions to make that work. For+example, when deleting an archive drive, your local (client) repository+does not normally want to hold all the data it has in "archive"+directories. With the adjusted preferred content expressions, any data on+an untrusted or dead repository is wanted. An interesting result is that+once a client repository has moved content from an untrusted remote, it+will decide it doesn't want it anymore, and shove it out to any other+remote that will accept it. Which is just the behavior we want. All it took+to get all this behavior is adding "or (not copies=semitrusted:1)" to the+preferred content expressions!++For most special remotes, just sucking the data from them is sufficient to+pretty well delete them. You'd want to delete an Amazon bucket or glacier+once it's empty, and git repositories need to be fully deleted. Since this+would need unique code for each type of special remote, and it would be+code that a) deletes possibly large quantities of data with no real way to+sanity check it and b) doesn't get run and tested very often; it's not+something I'm thrilled about fully automating. However, I would like to+make the assistant detect when all the content has been sucked out of a+remote, and pop up at least a message prompting to finish the deletion.+Future work.++-----++[1] I really, really wanted to mark it dead, but letting puns drive code+is probably a bad idea. I had no idea I'd get here when I started+developing this feature this morning.. Honest!
@@ -0,0 +1,28 @@+Both the assistant and `git annex drop --auto` refused to drop files from+untrusted repositories. Got that fixed.++Finally recorded the xmpp pairing screencast. In one perfect take, which+somehow `recordmydesktop` lost the last 3 minutes of.+Argh! Anyway I'm editing it now, so, look for that screencast soon.++The [[polls/goals_for_April]] poll results are in. ++* There have been no votes at all for working on+ cloud remotes. Seems that git-annex supports enough cloud remotes already.+* A lot of people want the Android webapp port to be done, so I will+ probably spend some time on that this month.+* Interest in other various features is split. I am surprised how many + want git-remote-gcrypt, compared to the features that would make+ syncing use less bandwidth. Doesn't git push over xmpp cover most+ of the use cases where git-remote-gcrypt would need to be used with the+ assistant?+* Nearly as many people as want features, want me to work on bug+ fixing and polishing what's already there.+ So I should probably continue to make screencasts, since they often force+ me to look at things with fresh eyes and see and fix problems. And of course,+ continue working on bugs as they're reported.+* I'm not sure what to make of the 10% who want me to add direct mode support.+ Since direct mode is already used by default, perhaps they want+ me to take time off? :) (I certainly need to fix the+ [[bugs/Direct_mode_keeps_re-checksuming_duplicated_files]] bug, and one other+ direct mode bug I discovered yesterday.)
@@ -0,0 +1,21 @@+The [[xmpp screencast|videos/git-annex_assistant_remote_sharing]]+is at long last done!++----++Fixed a bug that could cause the assistant to unstage files+from git sometimes. This happened because of a bad optimisation; adding a+file when it's already present and unchanged was optimised to do nothing.+But if the file had just been removed, and was put back, this resulted+in the removal being staged, and the add not being staged. Ugly bug,+although the assistant's daily sanity check automatically restaged the+files.++Underlying that bug was a more important problem: git-annex does not always+update working tree files atomically. So a crash at just the wrong instant+could cause a file to be deleted from the working tree. I fixed that too;+all changes to files in the working tree should now be staged in a temp+file, which is renamed into place atomically.++Also made a bunch of improvements to the dashboard's transfer display, and+to the handling of the underlying transfer queue.
@@ -0,0 +1,27 @@+Getting back to the repository removal handling from Sunday, I made the+assistant detect when a repository that has been marked as unwanted becomes+empty, and finish the removal process.++I was able to add this to the expensive transfer scan without making it any+more expensive than it already was, since that scan already looks at the+location of all keys. Although when a remote is detected as empty, it then+does one more check, equivilant to `git annex unused`, to find any+remaining objects on the remote, and force them off.++I think this should work pretty well, but it needs some testing and+probably some UI work.++----++Andy spotted a bug in the preferred content expressions I was using to+handle untrusted remotes. So he saved me several hours dealing with an ugly+bug at some point down the line. I had misread my own preferred content+expression documentation, and `copies=semitrusted:1` was not doing what I+thought it was. Added a new syntax that does what I need,+`copies=semitrusted+:1`++----++The 64 bit linux standalone builds are back. Apparently the 32 bit builds+have stopped working on recent Fedora, for reasons that are unclear. I set+up an autobuilder to produce the 64 bit builds.
@@ -0,0 +1,17 @@+Got caught up on bug reports and made some bug fixes.++The one bug I was really worried about, a strange file corruption problem+on Android, turned out not to be a bug in git-annex. (Nor is it a bug that+will affect regular users.)++The only interesting bug fixed was a mixed case hash directory name+collision when a repository is put on a VFAT filesystem (or other+filesystem with similar semantics). I was able to fix that nicely; since+such a repository will be in crippled filesystem mode due to other+limitations of the filesystem, and so won't be using symlinks,+it doesn't need to use the mixed case hash directory names.++Last night, finished up the repository removal code, and associated UI+tweaks. It works very well.++Will probably make a release tomorrow.
@@ -0,0 +1,34 @@+Well, sometimes you just have to go for the hack. Trying to find a way+to add additional options to git-annex-shell without breaking backwards+compatibility, I noticed that it ignores all options after `--`, because+those tend to be random rsync options due to the way rsync runs it.++So, I've added a new class of options, that come in between, like+`-- opt=val opt=val ... --`++The parser for these will not choke on unknown options, unlike normal+getopt. So this let me add the additional info I needed to+pass to git-annex-shell to make it record transfer information. And+if I need to pass more info in the future, that's covered too.++It's ugly, but since only git-annex runs git-annex-shell, this is an+ugliness only I (and now you, dear reader) have to put up with.++Note to self: Command-line programs are sometimes an API, particularly+if designed to be called remotely, and so it makes sense consider+whether they are, and design expandability into them from day 1.++---++Anyway, we now have full transfer tracking in git-annex! Both sides of+a transfer know what's being transferred, and from where, and have+the info necessary to interrupt the transfer.++---++Also did some basic groundwork, adding a queue of transfers to perform,+and adding to the daemon's status information a map of currently running+transfers. ++Next up: The daemon will use inotify to notice new and deleted transfer+info files, and update its status info.
@@ -0,0 +1,35 @@+Made a release today. Releasing has sure gotten easier with all the+autobuilds to use!++I am now using git-annex to share files with my mom. Here's how the webapp+looks for our family's repository. Soon several of us will be using this+repository.++[[!img assistant/example.png]]++We're using XMPP and rsync.net, so pretty standard setup much like+shown in my last screencast.++Real-world deployments help find bugs, and I found a few:++* If you're running the webapp in `w3m` on a remote computer to set it up,+ some forms are lacking submit buttons. This must be a issue with+ Bootstrap, or HTML5, I guess. I switched to `lynx` and it offers a+ way to submit forms that lack an explicit button.++* Progress bars for downloads from encrypted rsync repos don't update+ during the actual download, but only when gpg is decrypting the+ downloaded file.++* XMPP pushes sometimes fail still. Especially when your mom's computer+ is saturating its limited outgoing network connection uploading hundreds of+ photos. I have not yet determined if this is a packet loss/corruption issue,+ or if the XMPP messages are getting out of order. My gut feeling is it's+ the latter, in which can I can fix this pretty easily by adding sequence+ numbers and some buffering for out of order packets. Or perhaps just+ make it retry failed pushes when this happens.+ + Anyway, I found it was useful to set up a regular git repository on a+ server to suppliment the git pushes over XMPP. It's helpful to have+ such a git repository anyway, so that clients can push to there when the+ other client(s) are not online to be pushed to directly over XMPP.
@@ -0,0 +1,26 @@+Finally fixed the bug causing repeated checksumming when a direct mode file+contains duplicate files. I may need to add some cleaning of stale inode+caches eventually.++Meanwhile, Guilhem made `git annex initremote` use higher quality entropy,+with `--fast` getting back to the old behavior of urandom quality entropy.+The assistant doesn't use high quality entropy since I have no way to+prompt when the user would need to generate more. I did have a fun idea to+deal with this: Make a javascript game, that the user can play while+waiting, which would generate enropy nicely. Maybe one day.. ;)++Also made a small but significant change to [[archive directory handling|todo/assistant_smarter_archive_directory_handling]].+Now the assistant syncs files that are in `archive` directories like any+other file, until they reach an archive repository. Then they get dropped+from all the clients. This way, users who don't set up archive repositories+don't need to know about this special case, and users who do want to use+them can, with no extra configuration.++After recent changes, the preferred content expression for transfer+repositories is becoming a bit unweidly, at 212 characters. Probably+time to add support for macros..++`(not (inallgroup=client and copies=client:2) and (((exclude=*/archive/* and exclude=archive/*) or (not (copies=archive:1 or copies=smallarchive:1))) or (not copies=semitrusted+:1))) or (not copies=semitrusted+:1)`++Still, it's pretty great how much this little language lets me express, so+easily.
@@ -0,0 +1,22 @@+Developed a way to run the webapp on a remote or headless computer.++The webapp can now be started on a remote or headless computer, just+specify `--listen=address` to make it listen on an address other than+localhost. It'll print out the URL to open to access it.++This doesn't use HTTPS yet, because it'd need to generate a+certificate, and even if it generated a self-signed SSL certificate,+there'd be no easy way for the browser to verify it and avoid a MITM.++So `--listen` is a less secure but easier option; using ssh to forward+the webapp's port to the remote computer is more secure.++(I do have an idea for a way to do this entirely securely, making+the webapp set up the ssh port forwarding, which I have written down+in [[webapp]].. but it would be rather complicated to implement.)++----++Made the webapp rescan for transfers after it's been used to change a+repository's group. Would have been easy, but I had to chase down a+cache invalidation bug.
@@ -0,0 +1,11 @@+Did my taxes today. Not very pretty. Planning to run them by a professional.++Reproduced a bug that prevents git-annex from authenticating to the ejabberd+server, and passed the buck upstream with a test case to the author of the+haskell XMPP library.++Added some animations to the webapp to show when it's busy doing things.++Made `git annex webapp --listen=address:port` work.++Added a `annex.web-download-command` setting.
@@ -0,0 +1,29 @@+Short day because I spent 3 hours this morning explaining free software+and kickstarter to an accountant. And was away until 3 pm, so how did I get+all this done‽++Eliot pointed out that shutting down the assistant could leave transfers+running. This happened because `git annex transferkeys` is a separate+process, and so it was left to finish up any transfer that was in+process. I've made shutdown stop all transfers that the+assistant started. (Other paired computers could still be connecting to+make transfers even when the assistant is not running, and those are not+affected.)++Added sequence numbers to the XMPP messages used for git pushes. While+these numbers are not used yet, they're available for debugging, and will+help me determine if packets are lost or come out of order. So if you have+experienced problems with XMPP syncing sometimes failing, run tonight's+build of the assistant with `--debug` (or turn on debugging in the webapp+configuration screen), and send me a log by email to+<debuglogs201204@joeyh.name>++Changed the way that autobuilds and manual builds report their version+number. It now includes the date of the last commit, and the abbreviated+commit ID, rather than being some random date after the last release.++Frederik found a bug using the assistant on a FAT filesystem. It didn't+properly handle the files that git uses to stand-in for symlinks in that+situation, and annexed those files. I've fixed this, and even moving+around symlink stand-in files on a FAT filesystem now results in correct+changes to symlinks being committed.
@@ -0,0 +1,31 @@+Felt like spending my birthday working on git-annex. Thanks again to+everyone who makes it possible for me to work on something I care about+every day.++----++Did some work on `git annex addurl` today. It had gotten broken in direct+mode (I think by an otherwise good and important bugfix). After fixing+that, I made it interoperate with the webapp. So if you have the webapp+open, it will display progress bars for downloads being run by `git annex+addurl`.++This enhancement meshes nicely with a FlashGot script Andy+contributed, which lets you queue up downloads into your annex from a web+browser. Andy described how to set it up in+[[this_tip|tips/Using_Git-annex_as_a_web_browsing_assistant]].++(I also looked briefly into ways to intercept a drag and drop of a link+into the webapp and make it lauch a download for you. It doesn't seem that+browsers allow javascript to override their standard behavior of loading+links that are dropped into them. Probably good to prevent misuse, but it+would be nice here...)++----++Also, I think I have fixed the progress bars displayed when downloading+a file from an encrypted remote. I did this by hooking up existing+download progress metering (that was only being used to display+a download percentage in the console) into the location log, so the+webapp can use it. So that was a *lot* easier than it could have been,+but still a pretty large patch (500+ lines). Haven't tested this; should work.
@@ -0,0 +1,29 @@+Spent today bulding the Evil Splicer, a program that parses `ghc -ddump-splices`+output, and uses it to expand Template Haskell splices in source code.+I hope to use this crazy hack to get the webapp working on Android.++This was a good opportunity to use the+[Parsec](http://hackage.haskell.org/package/parsec) library for parsing the+ghc output. I've never really used it before, but found it quite nice to+work with. The learning curve, if you already know monads and applicatives,+is about 5 minutes. And instead of ugly regular expressions, you can work+with nice code that's easily composable and refactorable. Even the ugly+bits come out well:++[[!format haskell """+ {- All lines of the splice result will start with the same+ - indent, which is stripped. Any other indentation is preserved. -}+ i <- lookAhead indent+ result <- unlines <$> many1 (string i >> restOfLine)+"""]]++Anyway, it works.. sorta. The parser works great! The splices that ghc+outputs are put into the right places in the source files, and formatted in+a way that ghc is able to build. Often though, they contain code that+doesn't actually build as-is. I'm working to fix up the code to get closer+to buildable.++----++Meanwhile, guilhem has made ssh connection caching work for rsync special+remotes! It's very nice to have another developer working on git-annex. :)
@@ -0,0 +1,29 @@+Fixed a bug where the locked down ssh key that the assistant sets up to+access the annex on a remote server was being used by ssh *by default* for+all logins to that server.++That should not have happened. The locked down key is written to a filename+that ssh won't use at all, by default. But, I found code in gnome-keyring+that watches for `~/.ssh/*.pub` to appear, and automatically adds all such+keys to the keyring. In at least some cases, probably when it has no other+key, it then tells ssh to go ahead and use that key. Astounding.++To avoid this, the assistant will store its keys in <s>`~/.ssh/annex/`</s>+`~/.ssh/git-annex/` instead. gnome-keyring does not look there (verified in+the source). If you use gnome-keyring and have set up a repository on a+remote server with the assistant, I'd recommend moving the keys it set up+and editing `~/.ssh/config` to point to their new location.++gnome-keyring is not the only piece of software that has a bad+interaction with git-annex. I've been working on a bug that makes git-annex+fail to authenticate to ejabberd. ejabberd 2.1.10 got support for+SCRAM-SHA-1, but its code violates the RFC, and chokes on an address+attribute that the haskell XMPP library provides. I hope to get this fixed+in ejabberd.+++Also did some more work on the Evil Splicer today, integrating it into the+build of the Android app, and making it support incremental building.+Improved its code generation, and am at the milestone where it creates+valid haskell code for the entire `Assistant/WebApp/Types.hs` file,+where Template Haskell expands 2 lines into 2300 lines of code!
@@ -0,0 +1,11 @@+Back to really working toward an Android webapp now. I have been improving+the EvilSplicer, and the build machinery, and build environment all day.+Slow but steady progress.++First milestone of the day was when I got `yesod-form` to build with all+Template Haskell automatically expanded by the EvilSplicer. (With a few+manual fixups where it's buggy.)++At this point the Android build with the webapp enabled successfully+builds several files containing Yesod code.. And I suspect I am very close+to getting a first webapp build for Android.
@@ -0,0 +1,28 @@+Several bug fixes today, and got mostly caught up on recent messages.+Still have a backlog of two known bugs that I cannot reproduce well enough+to have worked on, but I am thinking I will make a release tomorrow. There+have been a lot of changes in the 10 days since the last release.++----++I am, frustratingly, stuck building the webapp on Android with no forward+progress today (and last night) after such a productive day yesterday.++The expanded Template Haskell code of the webapp fails to compile,+whereever type safe urls are used.++<pre>+Assistant/WebApp/Types.hs:95:63:+ Couldn't match expected type `Route WebApp -> t2'+ with actual type `Text'+ The function `urender_a1qcK' is applied to three arguments,+ but its type `Route WebApp -> [(Text, Text)] -> Text' has only two+ In the expression: urender_a1qcK u_a1qcL [] LogR+ In the first argument of `toHtml', namely+ `(\ u_a1qcL -> urender_a1qcK u_a1qcL [] LogR)'+</pre>++My best guess is this is a mismatch between the versions of yesod (or other+libraries) used for the native and cross compiled ghc's. So I've been+slowly trying to get a fully matched set of versions in between working on+bugs.
@@ -0,0 +1,25 @@+Starting to travel, so limited time today.++Yet Another Thread added to the assistant, all it does is watch for changes+to transfer information files, and update the assistant's map of transfers+currently in progress. Now the assistant will know if some other repository+has connected to the local repo and is sending or receiving a file's+content.++This seemed really simple to write, it's just 78 lines of code. It worked+100% correctly the first time. :) But it's only so easy because I've got+this shiny new inotify hammer that I keep finding places to use in the+assistant.++Also, the new thread does some things that caused a similar thread (the+merger thread) to go into a MVar deadlock. Luckily, I spent much of +[day 19](day_19__random_improvements) investigating and fixing that+deadlock, even though it was not a problem at the time.++So, good.. I'm doing things right and getting to a place where rather+nontrivial features can be added easily.++--++Next up: Enough nonsense with tracking transfers... Time to start actually+transferring content around!
@@ -0,0 +1,37 @@+Late last night, I successfully built the full webapp for Android!++That was with several manual modifications to the generated code, which I+still need to automate. And I need to set up the autobuilder properly+still. And I need to find a way to make the webapp open Android's web browser+to URL. So it'll be a while yet until a package is available+to try. But what a milestone!++The point I was stuck on all day yesterday was generated code that+looked like this:++[[!format haskell """+(toHtml+ (\ u_a2ehE -> urender_a2ehD u_a2ehE []+ (CloseAlert aid)))));+"""]]++That just couldn't type check at all. Most puzzling. My best guess is that+`u_a2ehE` is the dictionary GHC passes internally to make a typeclass work,+which somehow leaked out and became visible. Although+I can't rule out that I may have messed something up in my build environment.+The EvilSplicer has a hack in it that finds such code and converts it to+something like this:++[[!format haskell """+(toHtml+ (flip urender_a2ehD []+ (CloseAlert aid)))));+"""]]++I wrote some more about the process of the Android port in my personal blog:+[Template Haskell on impossible architectures](http://joeyh.name/blog/entry/Template_Haskell_on_impossible_architectures/)++----++Release day today. The OSX builds are both not available yet for this+release, hopefully will come out soon.
@@ -0,0 +1,14 @@+Finished the last EvilSplicer tweak and other fixes to make the +Android webapp build without any hand-holding.++Currently setting up the Android autobuilder to include the webapp in its+builds. To make this work I had to set up a new chroot with all the right+stuff installed.++Investigated how to make the Android webapp open a web browser when run.+As far as I can tell (without access to an Android device right now), +`am start -a android.intent.action.VIEW -d http://localhost/etc` should do+it.++Seems that git 1.8.2 broke the assistant. I've put in a fix but have not+yet tested it.
@@ -0,0 +1,4 @@+Got WebDAV enabled in the Android build. Had to deal with some system calls+not available in Android's libc.++New poll: [[polls/Android_default_directory]]
@@ -0,0 +1,21 @@+Today was not a work day for me, but I did get a chance to install+git-annex in real life while visiting. Was happy to download the standalone+Linux tarball and see that it could be unpacked, and git-annex webapp+started just by clicking around in the GUI. And in very short order got it+set up.++I was especially pleased to see my laptop noticed this new repository+had appeared on the network via XMPP push, and started immediately+uploading files to my rsync.net transfer repository so the new+repository could get them.++Did notice that the standalone tarball neglected to install a+FDO menu file. Fixed that, and some other minor issues I noticed.+++I also got a brief chance to try the Android webapp. It fails to start;+apparently `getaddrinfo` doesn't like the flags passed to it and is+failing. As failure modes go, this isn't at all bad. I can certainly work+around it with some hardcoded port numbers, but I want to fix it the right+way. Have ordered a replacement battery for my dead phone so I can use it+for Android testing.
@@ -0,0 +1,6 @@+Ported all the C libraries needed for XMPP to Android. (gnutls,+libgcrypt, libgpg-error, nettle, xml2, gsasl, etc). Finally+got it all to link. What a pain.++Bonus: Local pairing support builds for Android now, seems recent changes to+the network library for WebDAV also fixed it.
@@ -0,0 +1,15 @@+Got the OSX autobuilder back running, and finally got a OSX build up for+the 4.20130417 release. Also fixed the OSX app build machinery to handle+rpath.++Made the assistant (and `git annex sync`) sync with git remotes that have+`annex-ignore` set. So, `annex-ignore` is only used to prevent using+the annex of a remote, not syncing with it. The benefit of this change+is that it'll make the assistant sync the local git repository with+a git remote that is on a server that does not have git-annex installed.+It can even sync to github.++Worked around more breakage on misconfigured systems that don't have GECOS+information.++... And other bug fixes and bug triage.
@@ -0,0 +1,18 @@+There seem to be a steady state of enough bug reports coming in that I can+work on them whenever I'm not working on anything else. As I did all day+today.++This doesn't bother me if the bug reports are of real bugs that I can+reproduce and fix, but I'm spending a lot of time currently following up to+messages and asking simple questions like "what version number" and "can I+please see the whole log file". And just trying to guess what a vague+problem report means and read people's minds to get to a definite bug+with a test case that I can then fix.++I've noticed the overall quality of bug reports nosedive over the past+several months. My guess is this means that git-annex has found a less+technical audience. I need to find something to do about this.++With that whining out of the way ...+I fixed a pretty ugly bug on FAT/Android today, and+I am 100% caught up on messages right now!
@@ -0,0 +1,16 @@+Working on assistant's performance when it has to add a whole lot of files+(10k to 100k). ++Improved behavior in several ways, including fixing display+of the alert in the webapp when the default inotify limit of 8192+directories is exceeded.++Created a new TList data type, a transactional DList. Much nicer+implementation than the TChan based thing it was using to keep track of the+changes, although it only improved runtime and memory usage a little bit.+The way that this is internally storing a function in STM and modifying+that function to add items to the list is way cool.++Other tuning seems to have decreased the time it would take to import 100k+files from somewhere in the range of a full day (too long to wait to see),+to around 3.5 hours. I don't know if that's good, but it's certainly better.
@@ -0,0 +1,28 @@+Very productive & long day today, spent adding a new feature to the +webapp: Internet Archive support!++[[!img /assistant/iaitem.png]]++git-annex already supported using archive.org via its S3 special remotes,+so this is just a nice UI around that.++How does it decide which files to publish on archive.org? Well,+the item has a unique name, which is based on the description+field. Any files located in a directory with that name will be uploaded+to that item. (This is done via a new preferred content expression I added.)++So, you can have one repository with multiple IA items attached, and+sort files between them however you like.+I plan to make a screencast eventually demoing that. ++Another interesting use case, once the Android webapp is done, would be add+a repository on the DCIM directory, set the archive.org repository to+prefer all content, and *bam*, you have a phone or tablet that+auto-publishes and archives every picture it takes.++Another nice little feature added today is that whenever a file is uploaded+to the Internet Archive, its public url is automatically recorded, same+as if you'd ran `git annex addurl`. So any users who can clone your+repository can download the files from archive.org, without needing any+login or password info. This makes the Internet Archive a nice way to+publish the large files associated with a public git repository.
@@ -0,0 +1,7 @@+Quiet day. Only did minor things, like adding webapp UI for changing the+directory used by Internet Archive remotes, and splitting out an+`enableremote` command from `initremote`.++My Android development environment is set up and ready to go on my Motorola+Droid. The current Android build of git-annex fails to link at run time, so+my work is cut out for me. Probably broke something while enabling XMPP?
@@ -0,0 +1,99 @@+In a series of airport layovers all day. Since I woke up at 3:45 am, +didn't feel up to doing serious new work, so instead I worked through some+OSX support backlog.++git-annex will now use Haskell's SHA library if the `sha256sum`+command is not available. That library is slow, but it's guaranteed to be+available; git-annex already depended on it to calculate HMACs.++Then I decided to see if it makes sense to use the SHA library+when adding smaller files. At some point, its slower implementation should+win over needing to fork and parse the output of `sha256sum`. This was +the first time I tried out Haskell's +[Criterion](http://hackage.haskell.org/package/criterion) benchmarker,+and I built this simple benchmark in short order.++[[!format haskell """+import Data.Digest.Pure.SHA+import Data.ByteString.Lazy as L+import Criterion.Main+import Common++testfile :: FilePath+testfile = "/tmp/bar" -- on ram disk++main = defaultMain+ [ bgroup "sha256"+ [ bench "internal" $ whnfIO internal+ , bench "external" $ whnfIO external+ ]+ ]++internal :: IO String+internal = showDigest . sha256 <$> L.readFile testfile++external :: IO String+external = pOpen ReadFromPipe "sha256sum" [testfile] $ \h ->+ fst . separate (== ' ') <$> hGetLine h+"""]]++The nice thing about benchmarking in Airports is when you're running a+benchmark locally, you don't want to do anything else with the computer,+so can alternate people watching, spacing out, and analizing results.++100 kb file:++ benchmarking sha256/internal+ mean: 15.64729 ms, lb 15.29590 ms, ub 16.10119 ms, ci 0.950+ std dev: 2.032476 ms, lb 1.638016 ms, ub 2.527089 ms, ci 0.950++ benchmarking sha256/external+ mean: 8.217700 ms, lb 7.931324 ms, ub 8.568805 ms, ci 0.950+ std dev: 1.614786 ms, lb 1.357791 ms, ub 2.009682 ms, ci 0.950++75 kb file:++ benchmarking sha256/internal+ mean: 12.16099 ms, lb 11.89566 ms, ub 12.50317 ms, ci 0.950+ std dev: 1.531108 ms, lb 1.232353 ms, ub 1.929141 ms, ci 0.950++ benchmarking sha256/external+ mean: 8.818731 ms, lb 8.425744 ms, ub 9.269550 ms, ci 0.950+ std dev: 2.158530 ms, lb 1.916067 ms, ub 2.487242 ms, ci 0.950++50 kb file:++ benchmarking sha256/internal+ mean: 7.699274 ms, lb 7.560254 ms, ub 7.876605 ms, ci 0.950+ std dev: 801.5292 us, lb 655.3344 us, ub 990.4117 us, ci 0.950++ benchmarking sha256/external+ mean: 8.715779 ms, lb 8.330540 ms, ub 9.102232 ms, ci 0.950+ std dev: 1.988089 ms, lb 1.821582 ms, ub 2.181676 ms, ci 0.950++10 kb file:++ benchmarking sha256/internal+ mean: 1.586105 ms, lb 1.574512 ms, ub 1.604922 ms, ci 0.950+ std dev: 74.07235 us, lb 51.71688 us, ub 108.1348 us, ci 0.950++ benchmarking sha256/external+ mean: 6.873742 ms, lb 6.582765 ms, ub 7.252911 ms, ci 0.950+ std dev: 1.689662 ms, lb 1.346310 ms, ub 2.640399 ms, ci 0.950++It's possible to get nice graphical reports out of Criterion, but +this is clear enough, so I stopped here. 50 kb seems a reasonable+cutoff point.++I also used this to benchmark the SHA256 in Haskell's Crypto package.+Surprisingly, it's a *lot* slower than even the Pure.SHA code.+On a 50 kb file:++ benchmarking sha256/Crypto+ collecting 100 samples, 1 iterations each, in estimated 6.073809 s+ mean: 69.89037 ms, lb 69.15831 ms, ub 70.71845 ms, ci 0.950+ std dev: 3.995397 ms, lb 3.435775 ms, ub 4.721952 ms, ci 0.950+++There's another Haskell library, [SHA2](http://hackage.haskell.org/package/SHA2),+which I should try some time.
@@ -0,0 +1,23 @@+Turns out my old Droid has such an old version of Android (2.2) that+it doesn't work with any binaries produced by my haskell cross-compiler. I+think it's using a symbol not in its version of libc. Since upgrading this+particular phone is a ugly process and the hardware is dying anyway (bad+USB power connecter), I have given up on using it, and ordered an Android+tablet instead to use for testing. Until that arrives, no Android. Bah.+Wanted to get the Android app working in April.++Instead, today I worked on making the webapp require less redundant+password entry when adding multiple repositories using the same cloud+provider. This is especially needed for the Internet Archive, since users+will often want to have quite a few repositories, for different IA items.+Implemented it for box.com, and Amazon too.++Francois Marier has built an Ubuntu PPA for git-annex, containing the+current version, with the assistant and webapp. It's targeted at Precise,+but I think will probably also work with newer releases.+<https://launchpad.net/~fmarier/+archive/ppa>++Probably while I'm waiting to work on Android again, I will try to+improve the situation with using a single XMPP account for multiple+repositories. Spent a while today thinking through ways to improve the+design, and have some ideas.
@@ -0,0 +1,34 @@+Took 2 days in a row off, because I noticed I have forgotten to do that+since February, or possibly earlier, not counting trips. Whoops!++Also, I was feeling overwhelmed with the complexity of fixing XMPP to not+be buggy when there are multiple separate repos using the same XMPP+account. Let my subconscious work on that, and last night it served up the+solution, in detail. Built it today.++It's only a partial solution, really. If you want to use the same XMPP+account for multiple separate repositories, you cannot use the "Share with+your other devices" option to pair your devices. That's because XMPP+pairing assumes all your devices are using the same XMPP account, in order+to avoid needing to confirm on every device each time you add a new device.+The UI is clear about that, and it avoids complexity, so I'm ok with that.++But, if you want to instead use "Share with a friend", you now can use the+same XMPP account for as many separate repositories as you like. The+assistant now ignores pushes from repositories it doesn't know about.+Before, it would merge them all together without warning.++----++While I was testing that, I think I found out the real reason why XMPP+pushes have seemed a little unreliable. It turns out to not be an XMPP+issue at all! Instead, the merger was simply not always+noticing when `git receive-pack` updated a ref, and not merging it into+master. That was easily fixed.++----++Adam Spiers has been getting a `.gitignore` query interface suitable for+the assistant to use into `git`, and he tells me it's landed in `next`.+I should soon check that out and get the assistant using it. But first,+Android app!
@@ -0,0 +1,6 @@+Pushed out a release today. Looking back over April, I'm happy with it as a+bug fix and stabilization month. Wish I'd finished the Android app in April,+but let's see what happens tomorrow.++Recorded part of a screencast on using Archive.org, but `recordmydesktop`+lost the second part. Grr. Will work on that later.
@@ -0,0 +1,22 @@+[[!img /android/webapp.png alt="git-annex webapp on Android"]]++I fixed what I thought was keeping the webapp from working on Android, but+then it started segfaulting every time it was started. Eventually I+determined this segfault happened whenever haskell code called+`getaddrinfo`. I don't know why. This is particularly weird since I had+a demo web server that used `getaddrinfo` working way back in+[[day_201__real_Android_wrapup]]. Anyway, I worked around it by not using+`getaddrinfo` on Android.++Then I spent 3 hours stuck, because the webapp seemed to run, but+nothing could connect to the port it was on. Was it a firewall? Was+the Haskell threaded runtime's use of `accept()` broken? I went all the way+down to the raw system calls, and back, only to finally notice I had `netstat`+available on my Android. Which showed it was not listening to the port I+thought it was!++Seems that `ntohs` and `htons` are broken somehow. To get the+screenshot, I fixed up the port manually. Have a build running that+should work around the issue.++Anyway, the webapp works on Android!
@@ -0,0 +1,35 @@+There's a new page [[/Android]] that documents using git-annex on Android+in detail.++The Android app now opens the webapp when a terminal window is opened.+This is good enough for trying it out easily, but far from ideal.++Fixed an EvilSplicer bug that corrupted newlines in +the static files served by the webapp. Now the icons in the webapp+display properly, and the javascript works.++Made the startup screen default to `/sdcard/annex` for the repository+location, and also have a button to set up a camera repository. The camera+repository is put in the "source" preferred content group, so it will only+hang onto photos and videos until they're uploaded off the Android device.++Quite a lot of other small fixes on Android. At this point I've tested the+following works:++* Starting webapp.+* Making a repository, adding files.+* All the basic webapp UI.++However, I was not able to add any remote repository using only the webapp,+due to some more problems with the network stack.++* Jabber and Webdav don't quite work ("getProtocolByname: does not exist (no+ such protocol name: tcp)").+* SSH server fails.+ ("Network/Socket/Types.hsc:(881,3)-(897,61): Non-exhaustive patterns in case")+ I suspect it will work if I disable the DNS expansion code.++So, that's the next thing that needs to be tackled.++If you'd like to play with it in its current state, I've updated the+Android builds to incorporate all my work so far.
@@ -0,0 +1,26 @@+Created a backport of the latest git-annex release for Debian 7.0 wheezy.+Needed to backport a dozen haskell dependencies, but not too bad.+This will be available in the backports repository once Debian+starts accepting new packages again. I plan to keep the backport up-to-date+as I make new releases.++The cheap Android tablet I bought to do this last Android push with came+pre-rooted from the factory. This may be why I have not seen this bug:+[[bugs/Android_app_permission_denial_on_startup]]. If you have Android+4.2.2 or a similar version, your testing would be helpful for me to know if+this is a widespread problem. I have an idea about a way to work around the+problem, but it involves writing Java code, and probably polling a file,+ugh.++Got S3 support to build for Android. Probably fails to work +due to the same network stack problems affecting WebDAV and Jabber.++Got removable media mount detection working on Android. Bionic has an+amusing stub for `getmntent` that prints out "FIX ME! implement+getmntent()". But, `/proc/mounts` is there, so I just parse it.+Also enabled the app's `WRITE_MEDIA_STORAGE` permission to allow+access to removable media. However, this didn't seem to do anything. :(++Several fixes to make the Android webapp be able to set up repositories on+remote ssh servers. However, it fails at the last hurdle with what+looks like a `git-annex-shell` communication problem. Almost there..
@@ -0,0 +1,27 @@+This seems a very auspicious day to have finally gotten the Android app+doing something useful! I've fixed the last bugs with using it to set up a+remote ssh server, which is all I need to make my Android tablet+sync photos I take with a repository on my laptop.++[[!img /android/DCIM.png alt="git-annex webapp running on Android"]]++I set this up entirely in the GUI, except for needing to switch to the+terminal twice to enter my laptop's password.++How fast is it? Even several minute long videos transfer before I can+switch from the camera app to the webapp. To get this screenshot with it in+the process of syncing, I had to take a dozen pictures in a minute. Nice+problem to have. ;)++Have fun trying this out for yourself after tonight's autobuilds. But a+warning: One of the bugs I fixed today had to be fixed in `git-annex-shell`,+as run on the ssh server that the Android connects to. So the Android app+will only work with ssh servers running a new enough version of git-annex.++----++Worked on geting git-annex into Debian testing, which is needed before+the wheezy backport can go in. Think I've worked around most of the issues+that were keeping it from building on various architectures.++Caught up on some bug reports and fixed some of them.
@@ -0,0 +1,6 @@+Put in a fix for `getprotobyname` apparently not returning anything for+"tcp" on Android. This might fix all the special remotes there, but I don't+know yet, because I have to rebuild a lot of Haskell libraries to try it.++So, I spent most of today writing a script to build all the Haskell+libraries for Android from scratch, with all my patches.
@@ -0,0 +1,24 @@+Fixed a nasty bug that affects at least some FreeBSD systems. It misparsed+the output of `sha256`, and thought every file had a SHA256 of "SHA256".+Added multiple layers of protection against checksum programs not having+the expected output format.++Lots more building and rebuilding today of Android libs than I wanted to do.+Finally have a completly clean build, which might be able to open TCP+connections. Will test tomorrow.++In the meantime, I fired up the evil twin of my development laptop.+It's identical, except it runs Windows.++I installed the Haskell Platform for Windows on it, and removed+some of the bloatware to free up disk space and memory for development.+While a rather disgusting experience, I certainly have a usable Haskell+development environment on this OS a lot faster than I did on Android!+Cabal is happily installing some stuff, and other stuff wants me to install+Cygwin.++So, the clock on my month of working on a Windows port starts now. Since+I've already done rather a lot of ground work that was necessary for a+Windows port (direct mode, crippled filesystem support), and for general+sanity and to keep everything else from screeching to a halt, I plan to+only spend half my time messing with Windows over the next 30 days.
@@ -0,0 +1,15 @@+It all came together for Android today. Went from a sort of working app+to a fully working app!++* rsync.net works.+* Box.com appears to work -- at least it's failing with the same+ timeout I get on my linux box here behind the firewall of dialup doom.+* XMPP is working too!++These all needed various little fixes. Like loading TLS certificates from+where they're stored on Android, and ensuring that totally crazy file+permissions from Android (----rwxr-x for files?!) don't leak out into rsync+repositories. Mostly though, it all just fell into place today.+Wonderful..++The Android autobuild is updated with all of today's work, so try it out.
@@ -0,0 +1,41 @@+So as not to bury the lead, I've been hard at work on my first day in+Nicaragua, and ** the git-annex assistant fully syncs files (including+their contents) between remotes now !! **++Details follow..++Made the committer thread queue Upload Transfers when new files+are added to the annex. Currently it tries to transfer the new content+to *every* remote; this inefficiency needs to be addressed later.++Made the watcher thread queue Download Transfers when new symlinks+appear that point to content we don't have. Typically, that will happen+after an automatic merge from a remote. This needs to be improved as it+currently adds Transfers from every remote, not just those that have the+content.++This was the second place that needed an ordered list of remotes+to talk to. So I cached such a list in the DaemonStatus state info.+This will also be handy later on, when the webapp is used to add new+remotes, so the assistant can know about them immediately.++Added YAT (Yet Another Thread), number 15 or so, the transferrer thread+that waits for transfers to be queued and runs them. Currently a naive+implementation, it runs one transfer at a time, and does not do anything+to recover when a transfer fails.++Actually transferring content requires YAT, so that the transfer+action can run in a copy of the Annex monad, without blocking+all the assistant's other threads from entering that monad while a transfer+is running. This is also necessary to allow multiple concurrent transfers+to run in the future.++This is a very tricky piece of code, because that thread will modify the+git-annex branch, and its parent thread has to invalidate its cache in+order to see any changes the child thread made. Hopefully that's the extent+of the complication of doing this. The only reason this was possible at all+is that git-annex already support multiple concurrent processes running+and all making independent changes to the git-annex branch, etc.++After all my groundwork this week, file content transferring is now+fully working!
@@ -0,0 +1,46 @@+Set up my Windows development environment. For future reference, I've+installed:++* haskell platform for windows+* cygwin+* gcc and a full C toolchain in cygwin+* git from upstream (probably git-annex will use this)+* git in cygwin (the other git was not visible inside cygwin)+* vim in cygwin+* vim from upstream, as the cygwin vim is not very pleasant to use+* openssh in cygwin (seems to be missing a ssh server)+* rsync in cygwin+* Everything that `cabal install git-annex` is able to install successfully. + This includes all the libraries needed to build regular git-annex,+ but not the webapp. Good start though.++Result basically feels like a linux system that can't decide which way+slashes in paths go. :P I've never used Cygwin before (I last used a+Windows machine in 2003 for that matter), and it's a fairly impressive hack.++----++Fixed up git-annex's configure program to run on Windows (or, at least, in+Cygwin), and have started getting git-annex to build.++For now, I'm mostly stubbing out functions that use unix stuff. Gotten the+first 44 of 300 source files to build this way.++Once I get it to build, if only with stubs, I'll have a good+idea about all the things I need to find Windows equivilants of.+Hopefully most of it will be provided by+<http://hackage.haskell.org/package/unix-compat-0.3.0.1>.++----++So that's the plan. There is a possible shortcut, rather than doing a full+port. It seems like it would probably not be too hard to rebuild ghc inside+Cygwin, and the resulting ghc would probably have a full POSIX emulation+layer going through cygwin. From ghc's documentation, it looks like that's+how ghc used to be built at some point in the past, so it would probably+not be too hard to build it that way. With such a cygwin ghc, git-annex+would probably build with little or no changes. However, it would be a+git-annex targeting Cygwin, and not really a native Windows port. So+it'd see Cygwin's emulated POSIX filesystem paths, etc. That+seems probably not ideal for most windows users.. but if I get really stuck+I may go back and try this method.
@@ -0,0 +1,29 @@+After working on it all day, git-annex now builds on Windows!++Even better, `git annex init` works. So does `git annex status`, and+probably more. Not `git annex add` yet, so I wasn't able to try much more.++I didn't have to add many stubs today, either. Many of the missing Windows+features were only used in code paths that made git-annex faster, but I+could fall back to a slower code path on Windows.++The things that are most problimatic so far:++* POSIX file locking. This is used in git-annex in several places to + make it safe when multiple git-annex processes are running. I put in+ really horrible dotfile type locking in the Windows code paths, but I+ don't trust it at all of course.+* There is, apparently, no way to set an environment variable in Windows+ from Haskell. It is only possible to set up a new process' environment+ before starting it. Luckily most of the really crucial environment+ variable stuff in git-annex is of this latter sort, but there were+ a few places I had to stub out code that tries to manipulate git-annex's+ own environment.++The `windows` branch has a diff of 2089 lines. It add 88 ifdefs to the code+base. Only 12 functions are stubbed out on Windows. This could be so much+worse.++Next step: Get the test suite to build. Currently ifdefed out because it+uses some stuff like `setEnv` and `changeWorkingDirectory` that I don't know+how to do in Windows yet.
@@ -0,0 +1,14 @@+It's remarkable that a bad decision made in 1982 can cause me to waste an+entire day in 2013. Yes, `/` vs `\` fun time. Even though I long ago+converted git-annex to use the haskell `</>` operator wherever it builds+up paths (which transparently handles either type of separator), I still+spent most of today dealing with it. Including some libraries I use that+get it wrong. Adding to the fun is that git uses `/` internally, even on+Windows, so Windows separated paths have to be converted when being fed+into git.++Anyway, `git annex add` now works on Windows. So does `git annex find`,+and `git annex whereis`, and probably most query stuff.++Today was very un-fun and left me with a splitting headache, so I will+certainly *not* be working on the Windows port tomorrow.
@@ -0,0 +1,11 @@+Spent some time today to get caught up on bug reports and website traffic.+Fixed a few things.++Did end up working on Windows for a while too. I got `git annex drop`+working. But nothing that moves content quite works yet..++I've run into a stumbling block with `rsync`. It thinks that+`C:\repo` is a path on a ssh server named "C". Seems I will need to translate+native windows paths to unix-style paths when running rsync.++[[!meta date="13 May 2013"]]
@@ -0,0 +1,21 @@+The Windows port can now do everything in the [[walkthrough]]. It can use+both local and remote git repositories. Some special remotes work+(directory at least; probably rsync; likely any other special remote that+can have its dependencies built). Missing features include most special+remotes, gpg encryption, and of course, the assistant.++Also built a NullSoft installer for git-annex today. This was made very+easy when I found the Haskell ncis library, which provides a DSL embedding+the language used to write NullSoft installers into Haskell. So I didn't+need to learn a new language, yay! And could pull in all my helpful+Haskell utility libraries in the program that builds the installer.++The only tricky part was: How to get git-annex onto PATH? The standard way+to do this seems to be to use a multiple-hundred line include file. Of+course, that file does not have any declared license.. Instead of that,+I used a hack. The git installer for Windows adds itself to PATH, and is+a pre-requisite for git-annex. So the git-annex installer just installs+it into the same directory as git.++So.. I'll be including this first stage Windows port, with installer in+the next release. Anyone want to run a Windows autobuilder?
@@ -0,0 +1,23 @@+Laid some groundwork for porting the test suite to Windows, and getting it+working in direct mode. That's not complete, but even starting to run the+test suite in direct mode and looking at all the failures (many of them+benign, like files not being symlinks) highlighted something+I have been meaning to look into for quite a while: Why, in direct mode,+`git-annex` doesn't operate on data staged in the index, but requires you+commit changes to files before it'll see them. That's an annoying+difference between direct and indirect modes.++It turned out that I introduced this behavior back on+[[January 5th|day_163__free_features]], working around a nasty+bug I didn't understand. Bad Joey, should have root caused the bug at the+time! But the commit says I was stuck on it for hours, and it was+presenting as if it was a bug in `git cat-file` itself, so ok. Anyway,+I quickly got to the bottom of it today, fixed the underlying bug (which +was in git-annex, not git itself), and got rid of the workaround and its+undesired consequences. Much better.++The test suite is turning up some other minor problems with direct mode.+Should have found time to port it earlier.++Also, may have fixed the issue that was preventing GTalk from working on+Android. (Missing DNS library so it didn't do SRV lookups right.)
@@ -0,0 +1,6 @@+Made a release.++I am firming up some ideas for post-kickstarter. More on that later.++In the process of setting up a Windows autobuilder, using the same+jenkins installation that is used to autobuild msysgit.
@@ -0,0 +1,9 @@+git-annex is now autobuilt for Windows on the same Jenkins farm that+builds msysgit. Thanks for Yury V. Zaytsev for providing that! Spent about+half of today setting up the build.++Got the test suite to pass in direct mode, and indeed in direct mode+on a FAT file system. Had to fix one corner case in direct mode `git annex+add`. Unfortunately it still doesn't work on Android; somehow `git clone` +of a local repository is broken there. Also got the test suite to build,+and run on Windows, though it fails pretty miserably.
@@ -0,0 +1,9 @@+Today I had to change the implementation of the Annex monad. The old one+turned out to be buggy around exception handling -- changes to state+recorded by code that ran in an exception handler were discarded when it+threw an exception. Changed from a StateT monad to a ReaderT with+a MVar. Really deep-level change, but it went off without a+hitch!++Other than that it was a bug catch up day. Almost entirely caught up once+more.
@@ -0,0 +1,14 @@+Worked on several important bug fixes today. One affects automatic merge+confict resolution, and can case data loss in direct mode, so I will be+making a release with the fix tomorrow.++Practiced TDD today, and good thing too. The new improved test suite+turned up a really subtle bug involving the git-annex branch vector+clocks-ish code, which I also fixed.++Also, fixes to the OSX autobuilds. One of them had a broken gpg, which is+now fixed. The other one is successfully building again. And, I'm switching+the Linux autobuilds to build against Debian stable, since testing has a+new version of libc now, which would make the autobuilds not work on older+systems. Getting an amd64 chroot into shape is needing rather a lot+of backporting of build dependencies, which I already did for i386.
@@ -0,0 +1,28 @@+My laptop's SSD died this morning. I had some work from yesterday+committed to the git repo on it, but not pushed as it didn't build.+Luckily I was able to get that off the SSD, which is now a read-only+drive -- even mounting it fails with fsck write errors.++Wish I'd realized the SSD was dying before the day before my trip to+Nicaragua..+Getting back to a useful laptop used most of my time and energy today.++I did manage to fix transfers to not block the rest of the assistant's+threads. Problem was that, without Haskell's threaded runtime, waiting+on something like a rsync command blocks all threads. To fix this,+transfers now are run in separate processes.++Also added code to allow multiple transfers to run at once. Each transfer+takes up a slot, with the number of free slots tracked by a `QSemN`.+This allows the transfer starting thread to block until a slot frees up,+and then run the transfer.++This needs to be extended to be aware of transfers initiated by remotes.+The transfer watcher thread should detect those starting and stopping +and update the `QSemN` accordingly. It would also be nice if transfers+initiated by remotes would be delayed when there are no free slots for them+... but I have not thought of a good way to do that.++There's a bug somewhere in the new transfer code, when two transfers are+queued close together, the second one is lost and doesn't happen.+Would debug this, but I'm spent for the day.
@@ -0,0 +1,39 @@+Got the bugfix release out.++Tobias contributed [[tips/megaannex]], which allows using mega.co.nz as a+special remote. Someone should do this with Flickr, using+[filr](https://github.com/ricardobeat/filr). I have improved the+[[special_remotes/hook]] special remote to make it easier to create+and use reusable programs like megaannex.++But, I am too busy rewriting lots of the XMPP code to join in the+special remote fun. Spent all last night staring at protocol traces and+tests, and came to the conclusion that it's working well at the basic+communication level, but there are a lot of bugs above that level. This+mostly shows up as one side refusing to push changes made to its tree,+although it will happily merge in changes sent from the other side.++The NetMessanger code, which handles routing messages to git commands and+queuing other messages, seems to be just wrong. This is code I wrote in the+fall, and have basically not touched since. And it shows. Spent 4 hours+this morning rewriting it. Went all Erlang and implemented message inboxes+using STM. I'm much more confident it won't drop messages on the+floor, which the old code certainly did do sometimes.++Added a check to avoid unnecessary pushes over XMPP. Unfortunately, this+required changing the protocol in a way that will make previous versions of+git-annex refuse to accept any pushes advertised by this version. Could not+find a way around that, but there were so many unnecessary pushes happening+(and possibly contributing to other problems) that it seemed worth the+upgrade pain.++Will be beating on XMPP a bit more. There is one problem I was seeing+last night that I cannot reproduce now. It may have been masked or even+fixed by these changes, but I need to verify that, or put in a workaround.+It seemed that sometimes this code in `runPush` would run the setup+and the action, but either the action blocked forever, or an exception+got through and caused the cleanup not to be run.++[[!format haskell """+ r <- E.bracket_ setup cleanup <~> a+"""]]
@@ -0,0 +1,31 @@+Tobias has been busy again today, creating a [[/tips/flickrannex]]+special remote! Meanwhile, I'm thinking about providing a+[[more complete interface|/todo/support_for_writing_external_special_remotes]]+so that special remote programs not written in Haskell can do some of the+things the hook special remote's simplicity doesn't allow.++Finally realized last night that the main problem with the XMPP push code+was an inversion of control. Reworked it so now there are two new threads,+XMPPSendpack and XMPPReceivePack, each with their own queue of push+initiation requests, that run the pushes. This is a lot easier to+understand, probably less buggy, and lets it apply some smarts to squash+duplicate actions and pick the best request to handle next.++Also made the XMPP client send pings to detect when it has been disconnected+from the server. Currently every 120 seconds, though that may change. Testing+showed that without this, it did not notice (for at least 20 minutes) when +it lost routing to the server. Not sure why -- I'd think the TCP connections+should break and this throw an error -- but this will also handle any idle+disconnection problems that some XMPP servers might have.++While writing that, I found myself writing this jem using+[async](http://hackage.haskell.org/package/async), which has a comment+much longer than the code, but basically we get 4 threads that are all+linked, so when any dies, all do.++[[!format haskell """+pinger `concurrently` sender `concurrently` receiver+"""]]++Anyway, I need to run some long-running XMPP push tests to see if I've+really ironed out all the bugs.
@@ -0,0 +1,37 @@+The Android app should work on some more devices now, where hard linking to+busybox didn't work. Now it installs itself using symlinks.++Pushed a point release so `cabal install git-annex` works again. And,+I'm really happy to see that the 4.20130521 release has autobuilt on all+Debian architectures, and will soon be replacing the old 3.20120629 version+in testing. (Well, once a libffi transition completes..)++TobiasTheMachine has done it again: [[tips/googledriveannex]] ++-----++I spent most of today building a fuzz tester for the assistant. `git annex+fuzztest` will (once you find the special runes to allow it to run) create+random files in the repository, move them around, delete them, move+directory trees around, etc. The plan is to use this to run some long+duration tests with eg, XMPP, to make sure the assistant keeps things+in shape after a lot of activity. It logs in machine-readable format, +so if it turns up a bug I may even be able to use it to reproduce the same+bug (fingers crossed).++I was able to use QuickCheck to generate random data for some parts of the fuzz+tester. (Though the actual file names it uses are not generated using+QuickCheck.) Liked this part:++[[!format haskell """+instance Arbitrary FuzzAction where+ arbitrary = frequency+ [ (100, FuzzAdd <$> arbitrary)+ , (10, FuzzDelete <$> arbitrary)+ , (10, FuzzMove <$> arbitrary <*> arbitrary)+ , (10, FuzzModify <$> arbitrary)+ , (10, FuzzDeleteDir <$> arbitrary)+ , (10, FuzzMoveDir <$> arbitrary <*> arbitrary)+ , (10, FuzzPause <$> arbitrary)+ ]+"""]]
@@ -0,0 +1,19 @@+Got caught up on some bug reports yesterday. The main one was odd behavior+of the assistant when the repository was in manual mode. A recent change to+the preferred content expression caused it. But the expression was not+broken. The problem was in the parser, which got the parentheses wrong+in this case. I had to mostly rewrite the parser, unfortunately. I've tested+the new one fairly extensively -- on the other hand this bug lurked in the+old parser for several years (this same code is used for matching files+with command-line parameters).++Just as I finished with that, I noticed another bug. Turns out git-cat-file+doesn't reload the index after it's started. So last week's changes to make+git-annex check the state of files in the index won't work when using the+assistant. Luckily there was an easy workaround for this.++Today I finished up some robustness fixes, and added to the test suite+checks for preferred content expressions, manual mode, etc.++I've started a stress test, syncing 2 repositories over XMPP, with the fuzz+tester running in each to create lots of changes to keep in sync.
@@ -0,0 +1,12 @@+Fuzz tester has found several interesting bugs that I've now fixed. It's+even found a bug in my fixes. Most of the problems the fuzz testing has+found have had to do with direct mode merges, and automatic merge conflict+resoltion. Turns out the second level of automatic merge conflict+resolution (where the changes made to resolve a merge conflict themselves+turn out conflict in a later merge) was buggy, for example.++So, didn't really work a lot today -- was not intending to work at all+actually -- but have still accomplished a lot.++(Also, Tobias contributed [[tips/dropboxannex]] .. I'll be curious to see+what the use case for that is, if any!)
@@ -0,0 +1,12 @@+The fuzz testing found a file descriptor leak in the XMPP git push code.+The assistant seems to hold up under fuzzing for quite a while now.++Have started trying to work around some versions of Android not letting +the `am` command be used by regular users to open a web browser on an URL.+Here is my current crazy plan: Hack the terminal emulator's title setting+code, to get a new escape sequence that requests an URL be opened. This+assumes I can just use `startActivity()` from inside the app and it will+work. This may sound a little weird, but it avoids me needing to set up a+new communications channel from the assistant to the Java app. Best of all,+I have to write very little Java code. I last wrote Java code in 1995, so+writing much more is probably a good thing to avoid.
@@ -0,0 +1,19 @@+Yeah, Java hacking today. I have something that I think should deal with+the [[bugs/Android_app_permission_denial_on_startup]] problem. Added a "Open+WebApp" item to the terminal's menu, which should behave as advertised.+This is available in the Android daily build now, if your device has that+problem.++I was not able to get the escape sequence hack to work. I had no difficulty+modifying the terminal to send an intent to open an url when it received a+custom escape sequence. But sending the intent just seemed to lock up the+terminal for a minute without doing anything. No idea why. I had to propigate a+context object in to the terminal emulator through several layers of objects.+Perhaps that doesn't really work despite what I [read on stackoverflow](http://stackoverflow.com/questions/9051849/opening-a-link-in-the-browser/9052208#9052208).++Anyway, that's all I have time to do. It would be nice if I, or some other+interested developer who is more comfortable with Java, could write a custom+Android frontend app, that embedded a web browser widget for the webapp,+rather than abusing the terminal this way. OTOH, this way does provide the+bonus of a pretty good terminal and git shell environment for Android to go+with git-annex.
@@ -0,0 +1,11 @@+Winding down work for now, as I prepare for a week at the beach starting in+2 days. That will be followed by a talk about git-annex at+[SELF2013](http://www.southeastlinuxfest.org/) in Charlotte NC on June 9th.++Bits & pieces today.++Want to get a release out RSN, but I'm waiting for the previous release+to finally reach Debian testing, which should happen on Saturday. Luckily I+hear the beach house has wifi, so I will probably end up cutting the+release from there. Only other thing I might work on next week is updating+to yesod 1.2.
@@ -0,0 +1,14 @@+Landed two final changes before the release..++First, made git-annex detect if any of the several long-running git process+it talks to have died, and, if yes, restart them. My stress test is reliably+able to get at least `git cat-file` to crash, and while I don't know why (and+obviously should follow up by getting a core dump and stack trace of it),+the assistant needs to deal with this to be robust.++Secondly, wrote rather a lot of Java code to better open the web browser+when the Android app is started. A thread listens for URLs to be written to+a FIFO. Creating a FIFO from fortran^Wjava code is .. interesting. Glad to+see the back of the `am` command; it did me no favors.++AFK
@@ -0,0 +1,31 @@+Spent most of the day making file content transfers robust. There were lots+of bugs, hopefully I've fixed most of them. It seems to work well now,+even when I throw a lot of files at it.++One of the changes also sped up transfers; it no longer roundtrips to the+remote to verify it has a file. The idea here is that when the assistant is+running, repos should typically be fairly tightly synced to their remotes+by it, so some of the extra checks that the `move` command does are+unnecessary.++Also spent some time trying to use ghc's threaded runtime, but continue to+be baffled by the random hangs when using it. This needs fixing eventually;+all the assistant's threads can potentially be blocked when it's waiting on+an external command it has run.++Also changed how transfer info files are locked. The lock file is now+separate from the info file, which allows the TransferWatcher thread to+notice when an info file is created, and thus actually track transfers+initiated by remotes.++---++I'm fairly close now to merging the `assistant` branch into `master`.+The data syncing code is very brute-force, but it will work well enough+for a first cut.++Next I can either add some repository network mapping, and use graph+analysis to reduce the number of data transfers, or I can move on to the+[[webapp]]. Not sure yet which I'll do. It's likely that since DebConf+begins tomorrow I'll put off either of those big things until after the+conference.
@@ -0,0 +1,17 @@+I didn't plan to work on git-annex much while at DebConf, because the conference+always prevents the kind of concentration I need. But I unexpectedly also had to deal+with [three dead drives](http://joeyh.name/blog/entry/I_am_become_Joey_destroyer_of_drives/)+and illness this week. ++That said, I have been trying to debug a problem with git-annex and Haskell's threaded+runtime all week. It just hangs, randomly. No luck so far isolating why, although I now+have a branch that hangs fairly reliably, and in which I am trying to whittle the entire+git-annex code base (all 18 thousand lines!) into a nice test case.++This threaded runtime problem doesn't affect the assistant yet, but if I want to use+Yesod in developing the webapp, I'll need the threaded runtime, and using the threaded+runtime in the assistant generally would make it more responsive and less hacky.++Since this is a task I can work on without much concentration, I'll probably keep beating+on it until I return home. Then I need to spend some quality thinking time on where+to go next in the assistant.
@@ -0,0 +1,7 @@+Today marks 1 year since I started working on the git-annex assistant. 280+solid days of work!++As a background task here at the beach I've been porting git-annex to yesod+1.2. Finished it today, earlier than expected, and also managed to keep it+building with older versions. Some tricks kept the number of+ifdefs reasonably low.
@@ -0,0 +1,37 @@+Slowly getting through the bugs that were opened while I was on vacation and+then I'll try to get to all the comments. 60+ messages to go.++Got git-annex working better on encfs, which does not support hard links in+paranoid mode. Now git-annex can be used in indirect mode, it doesn't force+direct mode when hard links are not supported.++Made the Android repository setup special case generate a .gitignore file+to ignore thumbnails. Which will only start working once the assistant+gets .gitignore support.++-----++Been thinking today about encrypting XMPP traffic, particularly git push+data. Of course, XMPP is already encrypted, but that doesn't hide it from+those entities who have access to the XMPP server or its encryption key.+So adding client-to-client encryption has been on the TODO list all along.++OTR would be a great way to do it. But I worry that the confirmation steps+OTR uses to authenticate the recipient would make the XMPP pairing UI harder+to get through.++Particularly when pairing your own devices over XMPP, with several devices+involved, you'd need to do a lot of cross-confirmations. It would be better+there, I think, to just use a shared secret for authentication. (The need+to enter such a secret on each of your devices before pairing them would+also provide a way to use different repositories with the same XMPP+account, so 2birds1stone.)++Maybe OTR confirmations would be ok when setting up sharing with a friend.+If OTR was not used there, and it just did a Diffie-Hellman key exchange+during the pairing process, it could be attacked by an active MITM spoofing+attack. The attacker would then know the keys, and could decrypt future+pushes. How likely is such an attack? This goes far beyond what we're+hearing about. Might be best to put in some basic encryption now, so+we don't have to worry about pushes being passively recorded on the+server. Comments appreciated.
@@ -0,0 +1,18 @@+Got caught up on my backlog yesterday.++Part of adding files in direct mode involved removing write permission from+them temporarily. That turned out to cause problems with some programs that+open a file repeatedly, and was generally against the principle that direct+mode files are always directly available. Happily, I was able to get rid of+that without sacrificing any safety.++Improved syncing to bare repositories. Normally syncing pushes to a+synced/master branch, which is good for non-bare repositories since git+does not allow pushing to the currently checked out branch. But for bare+repositories, this could leave them without a master branch, so cloning+from them wouldn't work. A funny thing is that git does not really have any+way to tell if a remote repository is bare or not. Anyway, I did put in a+fix, at the expense of pushing twice (but the git data should only be+transferred once anyway).++
@@ -0,0 +1,13 @@+Today I got to deal with bugs on Android (busted use of `cp` among other+problems), Windows (fixed a strange hang when adding several files), and+Linux (`.desktop` files suck and Wine ships a particularly nasty one).+Pretty diverse!++Did quite a lot of research and thinking on XMPP encryption yesterday, but+have not run any code yet (except for trying out a D-H exchange in `ghci`).+I have listed several options on the [[XMPP]] page.++Planning to take a look at+[[bugs/Handling_of_files_inside_and_outside_archive_directory_at_the_same_time]]+tomorrow; maybe I can come up with a workaround to avoid it behaving so+badly in that case.
@@ -0,0 +1,23 @@+Yay, I fixed the+[[bugs/Handling_of_files_inside_and_outside_archive_directory_at_the_same_time]]+bug!+At least in direct mode, which thanks to its associated files tracking+knows when a given file has another file in the repository with the same+content. Had not realized the behavior in direct mode was so bad, or the+fix so relatively easy. Pity I can't do the same for indirect mode, but+the problem is much less serious there.++That was this weekend. Today, I nearly put out a new release (been 2 weeks+since the last one..), but ran out of time in the end, and need to get the+OSX autobuilder fixed first, so have deferred it until Friday.++However, I did make some improvements today.+Added an `annex.debug` git config setting, so debugging can+be turned on persistently. People seem to expect that to happen when+checking the checkbox in the webapp, so now it does.++Fixed 3 or 4 bugs in the Windows port. Which actually, has users now, or+at least one user. It's very handy to actually get real world testing of+that port.++[[!meta date="Mon, 17 Jun 2013 17:14:04 -0400"]]
@@ -0,0 +1,19 @@+One of my Windows fixes yesterday got the test suite close to sort of+working on Windows, and I spent all day today pounding on it. Fixed+numerous bugs, and worked around some weird Windows behaviors -- like+recursively deleting a directory sometimes fails with a permission denied+error about a file in it, and leaves behind an empty directory. (What!?)+The most important bug I fixed caused CR to leak into files in the+git-annex branch from Windows, during a union merge, which was not a good+thing at all.++At the end of the day, I only have 6 remaining failing test cases on+Windows. Half of them are some problem where running `git annex sync`+from the test suite stomps on PATH somehow and prevents xargs from working.+The rest are probably real bugs in the directory (again something to do+with recursive directory deletion, hmmm..), hook, and rsync+special remotes on Windows. I'm punting on those 6 for now, they'll be+skipped on Windows.++Should be worth today's pain to know in the future when I break+something that I've oh-so-painfully gotten working on Windows.
@@ -0,0 +1,13 @@+Pushed out a release today. While I've somewhat ramped down activity this+month with the Kickstarter period over and summer trips and events ongoing,+looking over the changelog I still see a ton of improvements in the 20 days+since the last release.++Been doing some work to make the assistant daemon be more `nice`. I don't+want to nice the whole program, because that could make the web interface+unresponsive. What I am able to do, thanks to Linux violating POSIX, is to+`nice` certain expensive operations, including the startup scan and the daily+sanity check. Also, I put in a call to `ionice` (when it's available) +when `git annex assistant --autostart` is run, so the daemon's+disk IO will be prioritized below other IO. Hope this keeps it out of your+way while it does its job.
@@ -0,0 +1,32 @@+Got caught up on a big queue of messages today. Mostly I hear from people+when git-annex is not working for them, or they have a question about using+it. From time to time someone does mention that it's working for them.++> We have 4 or so machines all synching with each other via the local+> network thing. I'm always amazed when it doesn't just explode :)++Due to the nature of git-annex, a lot of people can be using it without+anyone knowing about it. Which is great. But these little success stories+can make all the difference. It motivates me to keep pounding out the+development hours, it encourages other people to try it, and it'd be a good+thing to be able to point at if I tried to raise more funding now that I'm+out of Kickstarter money.++I'm posting my own success story to my main blog:+[git annex and my mom](http://joeyh.name/blog/entry/git_annex_and_my_mom)++If you have a success story to share, why not blog about it, microblog it,+or just post a comment here, or even send me a private message. Just a+quick note is fine. Thanks!++----++Going through the bug reports and questions today, I ended up fixing+three separate bugs that could break setting up a repo on a remote ssh+server from the webapp.++Also developed a minimal test case for some gnucash behavior that prevents+the watcher from seeing files it writes out. I understand the problem,+but don't have a fix for that yet. Will have to think about it. (A year ago+today, my blog featured the+[[first_release_of_the_watcher|day_16__more_robust_syncing]].)
@@ -0,0 +1,16 @@+Came up with a fix for the gnucash hard linked file problem that makes the+assistant notice the files gnucash writes. This is not full hard link support;+hard linked files still don't cleanly sync around. But new hard links to+files are noticed and added, which is enough to support gnucash.++Spent around 4 hours on reproducing and trying to debug+[[bugs/Hanging_on_install_on_Mountain_lion]]. It seems that recent upgrades+of the OSX build machine led to this problem. And indeed, building with an+older version of Yesod and Warp seems to have worked around the problem. So+I updated the OSX build for the last release. I will have to re-install the+new Yesod on my laptop and investigate further -- is this an OSX specific+problem, or does it affect Linux? Urgh, this is the second hang I've+encountered involving Warp..++Got several nice [[success stories|day_288__success_stories]], but I don't+think I've seen *yours* yet. ;) Please post!
@@ -0,0 +1,17 @@+Spent too many hours last night tracking down a bug that caused the webapp+to hang when it got built with the new yesod 1.2 release. Much of that time+was spent figuring out that yesod 1.2 was causing the problem. It turned out to+be a stupid typo in my yesod compatability layer. `liftH = liftH` in+Haskell is an infinite loop, not the stack overflow you get in most+languages. ;)++Even though it's only been a week since the last release,+that was worth pushing a release out for, which I've just done.+This release is essentially all bug fixes (aside from the automatic +ionice and nicing of the daemon).++This website is now available over https. Perhaps more importantly, all the+links to download git-annex builds are https by default.++The [[success_stories|day_288__success_stories]] list is getting really+nice. Only way it could possibly be nicer is if you added your story! Hint. ;)
@@ -0,0 +1,32 @@+I've felt for a while that git-annex needed better support for managing+the contents of past versions of files that are stored in the annex. I know+some people get confused about whether git-annex even supports old versions+of files (it does, but you should use indirect mode; direct mode doesn't+guarantee old versions of files will be preserved).++So today I've worked on adding command-line power for managing past+versions: a new `--all` option.++So, if you want to copy every version of every file in your repository to+an archive, you can run `git annex copy --all --to archive`.+Or if you've got a repository on a drive that's dying, you can run+`git annex copy --all --to newdrive`, and then on the new drive, run `git+annex fsck --all` to check all the data.++In a bare repository, `--all` is default, so you can run `git annex get`+inside a bare repository and it will try to get every version of every file+that it can from the remotes.++The tricky thing about `--all` is that since it's operating on objects and+not files, it can't check `.gitattributes` settings, which are tied to the+file name. I worried for a long time that adding `--all` would make+annex.numcopies settings in those files not be honored, and that this would+be a Bad Thing. The solution turns out to be simple: I just didn't+implement `git annex drop --all`! Dropping is the only action that needs to+check numcopies (move can also reduce the number of copies, but explicitly+bypasses numcopies settings).++I also added an `--unused` option. So if you have a repository that has+been accumulating history, and you'd like to move all file contents not+currently in use to a central server, you can run `git annex unused; git+annex move --unused --to origin`
@@ -0,0 +1,24 @@+Actually spread out over several days..++I think I have finally comprehensively dealt with all the wacky system+misconfigurations that can make `git commit` complain and refuse to commit.+The last of these is [a system with a FQDN that doesn't have a dot in it](http://git-annex.branchable.com/bugs/view_logs_fails:_Internal_Server_Error__internal_liftAnnex/). +I personally think git should just use the hostname as-is in the email+address for commits here -- it's better to be robust. Indeed, I think it+would make more sense if `git commit` never failed, unless it ran out of+disk or the repo is corrupt. But anyway, `git-annex+init` will now detect when the commit fails because of this and put a+workaround in place.++Fixed a bug in `git annex addurl --pathdepth` when the url's path was+shorter than the amount requested to remove from it.++Tracked down a bug that prevents git-annex from working on a system with an+old linux kernel. Probably the root cause is that the kernel was built+without EVENTFD support. Found a workaround to get a usable git-annex on+such a system is to build it without the webapp, since that disables the+threaded runtime which triggered the problem.++Dealt with a lot of Windows bugs. Very happy that it's working well enough+that some users are reporting bugs on it in Windows, and with enough detail+that I have not needed to boot Windows to fix them so far. ;)
@@ -0,0 +1,32 @@+Two gpg fixes today. The OSX Mtn Lion builds were pulling in a build of gpg+that wanted a gpg-agent to be installed in /usr/local or it wouldn't work.+I had to build my own gpg on OSX to work around this. I am pondering making+the OSX dmg builds pull down the gpg source and build their own binary,+so issues on the build system can't affect it. But would really rather not,+since maintaining your own version of every dependency on every+OS is hard (pity about there still being so many OS's without sane package+management).++On Android, which I have not needed to touch for a month, gpg was built+with --enable-minimal, which turned out to not be necessary and was+limiting the encryption algorythms included, and led to+interoperability problems for some. Fixed that gpg build too.++Also fixed an ugly bug in the webapp when setting up a rsync repository.+It would configure `~/.ssh/authorized_keys` on the server to force+git-annex-shell to be run. Which doesn't work for rsync. I didn't notice+this before because it doesn't affect ssh servers that already have a ssh+setup that allows accessing them w/o a password.++Spent a while working on a bug that can occur in a non-utf8 locale+when using special characters in the directory name of a ssh remote.+I was able to reproduce it, but have not worked out how to fix it; encoding+issues like this are always tricky.++Added something to the walkthrough to help convince people that yes, you+can use tags and branches with git-annex just like with regular git. One of+those things that is so obvious to the developer writing the docs +that it's hard to realize it will be a point of concern.++Seems like there is a release worth of changes already, so I plan to push+it out tomorrow.
@@ -0,0 +1,7 @@+Got the release out, after fixing test suite and windows build breakage.+This release has all the features on the command line side (--all,+--unused, etc), but several bugfixes on the assistant side, and a lot+of Windows bug fixes.++I've spent this evening adding icons to git-annex on Linux.+Even got the Linux standalone tarball to automatically install icons.
@@ -0,0 +1,13 @@+Been keeping several non-coding balls in the air recently, two of which+landed today.++First, Rsync.net is [offering a discount to all git-annex users](http://www.rsync.net/products/git-annex-pricing.html),+at one third their normal price.+"People using git-annex are clueful and won't be a big support burden for us,+so it's a win-win."+The web app will be updated offer the discount when setting up a rsync.net+repository.++Secondly, I've recorded an interview today for the Git Minutes podcast,+about git-annex. Went well, looking forward to it going up, probably on+Monday.
@@ -0,0 +1,41 @@+Surprise! I'm running a new crowdfunding campaign, which I hope will fund+several more months of git-annex development.++<https://campaign.joeyh.name/>++Please don't feel you have to give, but if you do decide to, give+generously. ;) I'm accepting both Paypal and Bitcoin (via CoinBase.com),+and have some rewards that you might enjoy.++----++I came up with two lists of things I hope this campaign will fund.+These are by no means complete lists. First, some general features and+development things:++* Integrate better with Android.+* Get the assistant and webapp ported to Windows.+* Refine the automated stress testing tools to find and fix more problems+ before users ever see them.+* Automatic recovery. Cosmic ray flipped a bit in a file? + USB drive corrupted itself? The assistant should notice these problems,+ and fix them.+* Encourage more contributions from others. For example, improve the+ special remote plugin interface so it can do everything the native Haskell+ interface can do. Eight new cloud storage services were added this year+ as plugins, but we can do better!+* Use deltas to reduce bandwidth needed to transfer modified versions of files.++Secondly, some things to improve security:++* Add easy support for encrypted git repositories+ using [git-remote-gcrypt](https://github.com/blake2-ppc/git-remote-gcrypt),+ so you can safely push to a repository on a server you don't control.+* Add support for setting up and using GPG keys in the webapp.+* Add protection to the XMPP protocol to guard against man in the middle+ attacks if the XMPP server is compromised. Ie, Google should not be able to+ learn about your git-annex repository even if you're using their servers.+* To avoid leaking even the size of your encrypted files to+ cloud storage providers, add a mode that stores fixed size chunks.++It will also, of course, fund ongoing bugfixing, support, etc.
@@ -0,0 +1,16 @@+It looks like I'm funded for at least the next 9 months! It would still be+nice to get to a year. ;) <https://campaign.joeyh.name/>++Working to get caught up on recent bug reports..++Made `git annex uninit` not nuke anything that's left over in+`.git/annex/objects` after unannexing all the files. After all, that could+be important old versions of files or deleted file, and just because the+user wants to stop using git-annex, doesn't mean git-annex shouldn't try to+protect that data with its dying breath. So it prints out some suggestions+in this case, and leaves it up to the user to decide what to do with the+data.++Fixed the Android autobuilder, which had stopped including the webapp.++Looks like another autobuilder will be needed for OSX 10.9.
@@ -0,0 +1,21 @@+Theme today seems to be fun with exceptions. ++Fixed an uncaught exception that could crash the assistant's Watcher thread+if just the right race occurred.++Also fixed it to not throw an exception if another process is+already transferring a file. What this means is that if you run multiple +`git annex get` processes on the same files, they'll cooperate in each+picking their own files to get and download in parallel. (Also works for+copy, etc.) Especially useful when downloading from an encrypted remote,+since often one process will be decrypting a file while the other is+downloading the next file. There is still room for improvement here; +a -jN option could better handle ensuring N downloads ran concurrently, and+decouple decryption from downloading. But it would need the output layer to+be redone to avoid scrambled output. (All the other stuff to make parallel+git-annex transfers etc work was already in place for a long time.)++----++Campaign update: Now funded for nearly 10 months, and aiming for a year.+<https://campaign.joeyh.name/>
@@ -0,0 +1,8 @@+Succeeded fixing a few bugs today, and followed up on a lot of other ones..++Fixed checking when content is present in a non-bare repository accessed via+http.++My changes a few days ago turned out to make uninit leave hard links behind+in .git/annex. Luckily the test suite caught this bug, and it was easily+fixed by making uninit delete objects with 2 or more hard links at the end.
@@ -0,0 +1,45 @@+Last night I got `git annex watch` to also handle deletion of files.+This was not as tricky as feared; the key is using `git rm --ignore-unmatch`,+which avoids most problematic situations (such as a just deleted file+being added back before git is run).++Also fixed some races when `git annex watch` is doing its startup scan of+the tree, which might be changed as it's being traversed. Now only one+thread performs actions at a time, so inotify events are queued up during+the scan, and dealt with once it completes. It's worth noting that inotify+can only buffer so many events .. Which might have been a problem except+for a very nice feature of Haskell's inotify interface: It has a thread+that drains the limited inotify buffer and does its own buffering.++----++Right now, `git annex watch` is not as fast as it could be when doing+something like adding a lot of files, or deleting a lot of files.+For each file, it currently runs a git command that updates the index.+I did some work toward coalescing these into one command (which `git annex`+already does normally). It's not quite ready to be turned on yet,+because of some races involving `git add` that become much worse+if it's delayed by event coalescing.++----++And races were the theme of today. Spent most of the day really+getting to grips with all the fun races that can occur between+modification happening to files, and `git annex watch`. The [[inotify]]+page now has a long list of known races, some benign, and several,+all involving adding files, that are quite nasty.++I fixed one of those races this evening. The rest will probably involve+moving away from using `git add`, which necessarily examines the file+on disk, to directly shoving the symlink into git's index.++BTW, it turns out that `dvcs-autosync` has grappled with some of these same+races: <http://comments.gmane.org/gmane.comp.version-control.home-dir/665>+I hope that `git annex watch` will be in a better place to deal with them,+since it's only dealing with git, and with a restricted portion of it+relevant to git-annex.++It's important that `git annex watch` be rock solid. It's the foundation+of the git annex assistant. Users should not need to worry about races+when using it. Most users won't know what race conditions are. If only I+could be so lucky!
@@ -0,0 +1,36 @@+git-annex has a new nicer versions of its [[logo]], thanks to John Lawrence.++Finally tracked down a week-old bug about the watcher crashing. It turned+out to crash when it encountered a directory containing a character that's+invalid in the current locale. I've noticed that 'ü' is often the character I+get bug reports about. After reproducing the bug I quickly tracked it down+to code in the haskell hinotify library, and sent in a patch.++Also uploaded a fixed hinotify to Debian, and deployed it to all 3 of the+autobuilder chroots. That took much more time than actually fixing the bug.+Quite a lot of yak shaving went on actually. Oh well. The Linux+autobuilders are updated to use Debian unstable again, which is nice.++Fixed a bug that prevented annex.diskreserve to be honored when storing+files encrypted in a directory special remote.++Taught the webapp the difference between initializing a new special remote+and enabling an existing special remote, which fixed some bad behavior when+it got confused.++----++And then for the really fun bug of the day! A user sent me a large file+which badly breaks git annex add. Adding the file causes a symlink to be+set up, but the file's content is not stored in the annex. Indeed, it's+deleted. This is the first data loss bug since January 2012.++Turns out it was caused by the code that handles the dummy files git uses+in place of symlinks on FAT etc filesystems. Code that had no business+running when `core.symlinks=true`. Code that was prone to false positives+when looking at a tarball of a git-annex repository. So I put in multiple+fixes for this bug. I'll be making a release on Monday.++----++Today's work was sponsored by Mikhail Barabanov. Thanks, Mikhail!
@@ -0,0 +1,21 @@+No release today after all. Unexpected bandwidth failure. Maybe in a few+days..++Got unannex and uninit working in direct mode. This is one of the more+subtle parts of git-annex, and took some doing to get it right.+Surprisingly, unannex in direct mode actually turns out to be faster than+in indirect mode. In direct mode it doesn't have to immediately commit the+unannexing, it can just stage it to be committed later.++Also worked on the ssh connection caching code. The perrennial problem with+that code is that the fifo used to communicate with ssh has a small limit+on its path, somewhere around 100 characters. This had caused problems when+the hostname was rather long. I found a way to avoid needing to be able to+reverse back from the fifo name to the hostname, and this let me take the+md5sum of long hostnames, and use that shorter string for the fifo.++Also various other bug followups.++----++[Campaign](https://campaign.joeyh.name/) is almost to 1 year!
@@ -0,0 +1,6 @@+Got the release out.++I've been working on fleshing out +the [[timeline|/design/assistant]] for the next year.+Including a fairly detailed set of things I want to do around+[[/design/assistant/disaster_recovery]] in the assistant.
@@ -0,0 +1,8 @@+Seems I forgot why I was using debian stable chroots to make the+autobuilds: Lots of people still using old glibc version. Had to rebuild+the stable chroots that I had upgraded to unstable. Wasted several hours..+I was able to catch up on recent traffic in between.++Was able to reproduce a bug where `git annex initremote` hung with some+encrypted special remotes. Turns out to be a deadlock when it's not built+with the threaded GHC runtime. So I've forced that runtime to be used.
@@ -0,0 +1,28 @@+The big news: Important behavior change in `git annex dropunused`. Now it+checks, just like `git annex drop`, that it's not dropping the last copy of+the file. So to lose data, you have to use `--force`. This continues the+recent theme of making git-annex hold on more tenaciously to old data, and+AFAIK it was the last place data could be removed without `--force`.++Also a nice little fix to `git annex unused` so it doesn't identify+temporary files as unused if they're being used to download a file.+Fixing it was easy thanks to all the transfer logs and locking+infrastucture built for the assistant.++Fixed a bug in the assistant where even though syncing to a network+remote was disabled, it would still sync with it every hour, or whenever+a network connection was detected.++Working on some direct mode scalability problems when thousands of the+identical files are added. Fixing this may involvie replacing the current+simple map files with something more scalable like a sqllite database.++While tracking that down, I also found a bug with adding a ton of files+in indirect mode, that could make the assistant stall.+Turned out to be a laziness problem. (Worst kind of Haskell bug.) Fixed.++----++Today's sponsor is my sister, Anna Hess, who incidentially just put+the manuscript of her latest ebook in the family's annex prior to its+publication on Amazon this weekend.
@@ -0,0 +1,21 @@+Worked on 3 interesting bugs today. One I noticed myself while doing tests+with adding many thousands of files yesterday. Assistant was delaying+making a last commit of the batch of files, and would only wake up and+commit them after a further change was made. Turns out this bug was+introduced in April while improving commit batching when making very large+commits. I seem to remember someone mentioning this problem at some point,+but I have not been able to find a bug report to close.++Also tried to reproduce [[this_bug|bugs/utf8]]. Frustrating, because I'm+quite sure I have made changes that will avoid it happening again,+but since I still don't know what the root cause was, I can't let it go.++The last bug is+[[non-repos_in_repositories_list___40__+_other_weird_output__41___from_git_annex_status]]+and is a most strange thing. Still trying to get a handle on multiple+aspects of it.++Also various other bug triage. Down to only 10 messages in my git-annex+folder. That included merging about a dozen bugs about+local pairing, that all seem to involve git-annex-shell not being found in+path. Something is up with that..
@@ -0,0 +1,2 @@+Technically offtopic, but did a fun side project today:+<http://joeyh.name/blog/entry/git-annex_as_a_podcatcher/>
@@ -0,0 +1,31 @@+Back to bug squashing. Fixed several, including a long-standing problem on+OSX that made the app icon seem to "bounce" or not work. Followed up on a+bunch more.++The 4.20130723 git-annex release turns out to have broken support for+running on crippled filesystems (Android, Windows). `git annex sync` will+add dummy symlinks to the annex as if they were regular files, which is+not good!+[Recovery instructions](http://git-annex.branchable.com/bugs/regression_in_direct_mode_on_windows_:_weird___96__git_annex_sync__96___behavior/#comment-5d80649f9da85ac2fb505445a41207f5)+I've updated the Android and Windows builds and recommend an immediate upgrade.+Will make a formal release on Friday. ++Spent some time improving the test suite on Windows, to catch this bug,+and fix a bug that was preventing it from testing `git annex sync` on+Windows.++----++I am getting very frustrated with this "unknown UUID" problem that a dozen+people have reported. So far nobody has given me enough information to+reproduce the problem. It seems to have something to do with+`git-annex-shell` not being found on the remote system that has been either+local paired with or is being used as a ssh server, but I don't yet+understand what. I have spent hours today trying various scenarios to break+git-annex and get this problem to happen.++I certainly can improve the webapp's behavior when a repository's UUID is+not known. The easiest fix would be to simply not display such+repositories. Or there could be a UI to try to get the UUID.+But I'm more interested in fixing the core problem than putting+in a UI bandaid.
@@ -0,0 +1,16 @@+Turns out ssh-agent is the cause of the unknown UUID bug! I got a tip+about this from a user, and was quickly able to reproduce the bug that had+eluded me so long. Anyone who has run `ssh-add` and is using ssh-agent+would see the bug.++It was easy enough to fix as it turns out. Just need to set IdentitiesOnly+in .ssh/config where git-annex has set up its own IdentityFile to ensure+that its special purpose ssh key is used rather than whatever key the+ssh-agent has loaded into it. I do wonder why ssh behaves this way -- why+would I set an IdentityFile for a host if I didn't want ssh to use it?++Spent the rest of the day cleaning up after the bug. Since this affects so+many people, I automated the clean up process. The webapp will+detect repositories with this problem, and the user just has to click to+clean up. It'll then correct their .ssh/config and re-enable the+repository.
@@ -0,0 +1,17 @@+Today was a nice reminder that there are no end of bugs lurking in filename+handling code. ++First, fixed a bug that prevented git-annex from adding+filenames starting with ":", because that is a special character to git.++Second, discovered that git 1.8.4 rc0 has changed `git-cat-file --batch` in+a way that makes it impossible to operate on filenames containing spaces.+This is, IMHO, a reversion, so hopefully my+[bug report](http://bugs.debian.org/718517) will get it fixed.++Put in a workaround for that, although using the broken version of git+with a direct mode repository with lots of spaces in file or directory+names is going to really slow down git-annex, since it often has to fork a+new git cat-file process for each file.++Release day tomorrow..
@@ -0,0 +1,18 @@+Got the release out, with rather a lot of fiddling to fix broken builds on+various platforms.++Also released a backport to Debian stable. This backport has the assistant,+although without WebDAV support. Unfortunately it's an old version from+May, since ghc transitions and issues have kept newer versions out of+testing so far. Hope that will clear up soon (probably by dropping haskell+support for s390x), and I can update it to a newer version. +If nothing else it allows using direct mode with Debian stable.++Pleased that the git-cat-files bug was quickly fixed by Peff and has+already been pulled into Junio's release tree!++----++This evening, I've added an interface around the new improved +`git check-ignore` in git 1.8.4. The assistant can finally honor `.gitignore`+files!
@@ -0,0 +1,10 @@+Made two big improvements to the Windows port, in just a few hours.+First, got gpg working, and encrypted special remotes work on Windows.+Next, fixed a permissions problem that was breaking removing files+from directory special remotes on Windows.+(Also cleaned up a lot of compiler warnings on Windows.)++I think I'm almost ready to move the Windows port from alpha to beta+status. The only really bad problem that I know of with using it is that+due to a lack of locking, it's not safe to run multiple git-annex+commands at the same time in Windows.
@@ -0,0 +1,30 @@+Wow, 11 days off! I was busy with first dentistry and then DebConf.++Yesterday I [visited CERN](http://joeyh.name/blog/entry/words_fail_me/) and+got to talk with some of their IT guys about how they manage their tens of+petabytes of data. Interested to hear they also have the equivilant of a+per-subdirectory annex.numcopies setting. OTOH, they have half a billion+more files than git's index file is likely to be able to scale to support. ;)++Pushed a release out today despite not having many queued changes. +Also, I got git-annex migrated to Debian testing, and so was also+able to update the wheezy backport to a just 2 week old version.++Today is also the last day of the [campaign](https://campaign.joeyh.name/)!++----++There has been a ton of discussion about git-annex here at DebConf,+including 3 BoF sessions that mostly focused on it, amoung other git stuff.+Also, RichiH will be presenting his+"[Gitify Your Life](http://penta.debconf.org/dc13_schedule/events/1025.en.html)"+talk on Friday; you can catch it on the [live stream](http://blog.debconf.org/blog/2013/08/14#hl_dc13_recordings).++I've also had a continual stream of in-person bug and feature requests.+(Mostly features.)+These have been added to the wiki and I look forward to working on that+backlog when I get home.++As for coding, I am doing little here, but I do have a branch cooking that+adds some options to `git annex import` to control handling of duplicate+files.
@@ -0,0 +1,34 @@+Back home. I have some 170 messages of backlog to attend to. Rather than+digging into that on my first day back, I spent some time implementing some+new features.++`git annex import` has grown three options that help managing importing of+duplicate files in different ways. I started work on that last week, but+didn't have time to find a way to avoid the `--deduplicate` option+checksumming each imported file twice. Unfortunately, I have still not+found a way I'm happy with, so it works but is not as efficient as it could+be.++`git annex mirror` is a new command suggested to me by someone at DebConf+(they don't seem to have filed the requested todo). It arranges for two+repositories to contain the same set of files, as much as possible (when+numcopies allows). So for example, `git annex mirror --to otherdrive`+will make the otherdrive remote have the same files present and not present+as the local repository.++I am thinking about expanding `git annex sync` with an option to also sync+data. I know some find it confusing that it only syncs the git metadata+and not the file contents. That still seems to me to be the best and most+flexible behavior, and not one I want to change in any case since+it would be most unexpected if `git annex sync` downloaded a lot of stuff+you don't want. But I can see making `git annex sync --data` download+all the file contents it can, as well as uploading all available file+contents to each remote it syncs with. And `git annex sync --data --auto`+limit that to only the preferred content. Although perhaps+these command lines are too long to be usable?++----++With the campaign more or less over, I only have a little over a week+before it's time to dive into the first big item on the roadmap. Hope+to be through the backlog by then.
@@ -0,0 +1,27 @@+Made some good progress on the backlog today. Fixed some bugs, applied some+patches. Noticing that without me around, things still get followed up+on, to a point, for example incomplete test cases for bugs get corrected so+they work. This is a very good thing. Community!++I had to stop going through the backlog when I got to one message from+Anarcat mentioning [quvi](http://quvi.sourceforge.net/). That turns+out to be just what is needed to implement the often-requested feature+of `git-annex addurl` supporting YouTube and other similar sites. So I+spent the rest of the day making that work. For example:++<pre>+% git annex addurl --fast 'http://www.youtube.com/watch?v=1mxPFHBCfuU&list=PL4F80C7D2DC8D9B6C&index=1'+addurl Star_Wars_X_Wing__Seth_Green__Clare_Grant__and_Mike_Lamond_Join_Wil_on_TableTop_SE2E09.webm ok+</pre>++Yes, that got the video title and used it as the filename, and yes,+I can commit this file and run `git annex get` later, and it will be+able to go download the video! I can even use `git annex fsck --fast`+to make sure YouTube still has my videos. Awesome.++The great thing about quvi is it takes the url to a video webpage, and+returns an url that can be used to download the actual video file. So it+simplifies ugly flash videos as far out of existence as is possible.+However, since the direct url to the video file may not keep working for long.+addurl actually records the page's url, with an added indication that quvi+should be used to get it.
@@ -0,0 +1,12 @@+After a couple days plowing through it, my backlog is down to 30 messages+from 150. And most of what's left is legitimate bugs and todo items.++Spent a while today on an ugly file descriptor leak in the assistant's+local pairing listener. This was an upstream bug in the network-multicast+library, so while I've written a patch to fix it, the fix isn't quite +deployed yet. The file descriptor leak happens when the assistant is+running and there is no network interface that supports multicast.+I was able to reproduce it by just disconnecting from wifi.++Meanwhile, guilhem has been working on patches that promise to massively+speed up `git annex unused`! I will be reviewing them tonight.
@@ -0,0 +1,6 @@+Today was a day off, really. However, I have a job running to try to+build get a version of ghc-android that works on newer Android releases.++Also, guilhem's `git annex unused` speedup patch landed. The results are+extrordinary -- speedups on the order of 50 to 100 times faster should+not be uncommon. Best of all (for me), it still runs in constant memory!
@@ -0,0 +1,17 @@+Spent a while tracking down a bug that causes a crash on OSX when setting+up an XMPP account. I managed to find a small test case that reliably+crashes, and sent it off to the author of the haskell-gnutls bindings,+which had one similar segfault bug fixed before with a similar test case.+Fingers crossed..++Just finished tracking down a bug in the Android app that caused its+terminal to spin and consume most CPU (and presumably a lot of battery).+I introduced this bug when adding the code to open urls written to a fifo,+due to misunderstanding how java objects are created, basically. This bug+is bad enough to do a semi-immediate release for; luckily it's just about+time for a release anyway with other improvements, so in the next few+days..++Have not managed to get a recent ghc-android to build so far.++Guilhem fixed some bugs in `git annex unused`.
@@ -0,0 +1,9 @@+Managed to find a minimal, 20 line test case for at least one of the ways+git-annex was hanging with GHC's threaded runtime. Sent it off to+haskell-cafe for analysis.+[thread](http://thread.gmane.org/gmane.comp.lang.haskell.cafe/99334)++Further managed to narrow the bug down to MissingH's use of logging code,+that git-annex doesn't use. [bug report](http://bugs.debian.org/681621).+So, I can at least get around this problem with a modified version of+MissingH. Hopefully that was the only thing causing the hangs I was seeing!
@@ -0,0 +1,64 @@+Back home and laptop is fixed.. back to work.++Warmup exercises:++* Went in to make it queue transfers when a broken symlink is received,+ only to find I'd already written code to do that, and forgotten about it.+ Heh. Did check that the git-annex branch is always sent first,+ which will ensure that code always knows where to transfer a key from.+ I had probably not considered this wrinkle when first writing the code;+ it worked by accident.++* Made the assistant check that a remote is known to have a key before+ queueing a download from it.++* Fixed a bad interaction between the `git annex map` command and the+ assistant.++----++Tried using a modified version of `MissingH` that doesn't use `HSLogger`+to make git-annex work with the threaded GHC runtime. Unfortunatly,+I am still seeing hangs in at least 3 separate code paths when+running the test suite. I may have managed to fix one of the hangs,+but have not grokked what's causing the others.++----++I now have access to a Mac OSX system, thanks to Kevin M. I've fixed+some portability problems in git-annex with it before, but today I tested+the assistant on it:++* Found a problem with the kqueue code that prevents incoming pushes from+ being noticed.++ The problem was that the newly added git ref file does not trigger an add+ event. The kqueue code saw a generic change event for the refs directory,+ but since the old file was being deleted and replaced by the new file,+ the kqueue code, which already had the old file in its cache, did not notice+ the file had been replaced.++ I fixed that by making the kqueue code also track the inode of each file.+ Currently that adds the overhead of a stat of each file, which could be+ avoided if haskell exposed the inode returned by `readdir`. Room to+ optimise this later...++* Also noticed that the kqueue code was not separating out file deletions+ from directory deletions. IIRC Jimmy had once mentioned a problem with file+ deletions not being noticed by the assistant, and this could be responsible+ for that, although the directory deletion code seems to handle them ok+ normally. It was making the transfer watching thread not notice when+ any transfers finished, for sure. I fixed this oversight, looking in the+ cache to see if there used to be a file or a directory, and running the+ appropriate hook.++Even with these fixes, the assistant does not yet reliably transfer file+contents on OSX. I think the problem is that with kqueue we're not+guaranteed to get an add event, and a deletion event for a transfer+info file -- if it's created and quickly deleted, the code that+synthensizes those events doesn't run in time to know it existed.+Since the transfer code relies on deletion events to tell when transfers+are complete, it stops sending files after the first transfer, if the+transfer ran so quickly it doesn't get the expected events. ++So, will need to work on OSX support some more...
@@ -0,0 +1,66 @@+Beating my head against the threaded runtime some more. I can reproduce+one of the hangs consistently by running 1000 git annex add commands+in a loop. It hangs around 1% of the time, reading from `git cat-file`.++Interestingly, `git cat-file` is not yet running at this point -- +git-annex has forked a child process, but the child has not yet exec'd it.+Stracing the child git-annex, I see it stuck in a futex. Adding tracing,+I see the child never manages to run any code at all.++This really looks like the problem is once again in MissingH, which uses+`forkProcess`. Which happens to come with a big warning about being very+unsafe, in very subtle ways. Looking at the C code that the newer `process`+library uses when sparning a pipe to a process, it messes around with lots of+things; blocking signals, stopping a timer, etc. Hundreds of lines of C+code to safely start a child process, all doing things that MissingH omits.++That's the second time I've seemingly isolated a hang in the GHC threaded+runtime to MissingH.++And so I've started converting git-annex to use the new `process` library,+for running all its external commands. John Goerzen had mentioned `process`+to me once before when I found a nasty bug in MissingH, as the cool new+thing that would probably eliminate the `System.Cmd.Utils` part of MissingH,+but I'd not otherwise heard much about it. (It also seems to have the+benefit of supporting Windows.)++This is a big change and it's early days, but each time I see a hang, I'm+converting the code to use `process`, and so far the hangs have just gone+away when I do that.++---++Hours later... I've converted *all* of git-annex to use `process`.++In the er, process, the `--debug` switch stopped printing all the commands+it runs. I may try to restore that later.++I've not tested everything, but the test suite passes, even when+using the threaded runtime. **MILESTONE**++Looking forward to getting out of these weeds and back to useful work..++---++Hours later yet.... The `assistant` branch in git now uses the threaded+runtime. It works beautifully, using proper threads to run file transfers+in.++That should fix the problem I was seeing on OSX yesterday. Too tired to+test it now.++--++Amazingly, all the assistant's own dozen or so threads and thread+synch variables etc all work great under the threaded runtime. I had+assumed I'd see yet more concurrency problems there when switching to it,+but it all looks good. (Or whatever problems there are are subtle ones?)++I'm very relieved. The threaded logjam is broken! I had been getting+increasingly worried that not having the threaded runtime available would+make it very difficult to make the assistant perform really well, and cause+problems with the webapp, perhaps preventing me from using Yesod.++Now it looks like smooth sailing ahead. Still some hard problems, but+it feels like with inotify and kqueue and the threaded runtime all+dealt with, the really hard infrastructure-level problems are behind me.
@@ -0,0 +1,26 @@+Today I worked on the race conditions, and fixed two of them. Both+were fixed by avoiding using `git add`, which looks at the files currently+on disk. Instead, `git annex watch` injects symlinks directly into git's+index, using `git update-index`.++There is one bad race condition remaining. If multiple processes have a+file open for write, one can close it, and it will be added to the annex.+But then the other can still write to it.++----++Getting away from race conditions for a while, I made `git annex watch`+not annex `.gitignore` and `.gitattributes` files.++And, I made it handle running out of inotify descriptors. By default,+`/proc/sys/fs/inotify/max_user_watches` is 8192, and that's how many+directories inotify can watch. Now when it needs more, it will print+a nice message showing how to increase it with `sysctl`.++FWIW, DropBox also uses inotify and has the same limit. It seems to not+tell the user how to fix it when it goes over. Here's what `git annex+watch` will say:++ Too many directories to watch! (Not watching ./dir4299)+ Increase the limit by running:+ echo fs.inotify.max_user_watches=81920 | sudo tee -a /etc/sysctl.conf; sudo sysctl -p
@@ -0,0 +1,100 @@+Really productive day today, now that I'm out of the threaded runtime+tarpit!++First, brought back `--debug` logging, better than before! As part of that, I+wrote some 250 lines of code to provide a IMHO more pleasant interface to+`System.Process` (itself only 650 lines of code) that avoids all the+low-level setup, cleanup, and tuple unpacking. Now I can do things like+write to a pipe to a process, and ensure it exits nonzero, this easily:++ withHandle StdinHandle createProcessSuccess (proc "git" ["hash-object", "--stdin"]) $ \h ->+ hHutStr h objectdata++My interface also makes it easy to run nasty background processes,+reading their output lazily.++ lazystring <- withHandle StdoutHandle createBackgroundProcess (proc "find" ["/"]) hGetContents++Any true Haskellers are shuddering here, I really should be using+conduits or pipes, or something. One day..++----++The assistant needs to detect when removable drives are attached, and+sync with them. This is a reasonable thing to be working on at this point,+because it'll make the currently incomplete data transfer code fully usable+for the sneakernet use case, and firming that up will probably be a good+step toward handing other use cases involving data transfer over the+network, including cases where network remotes are transientely available.++So I've been playing with using dbus to detect mount events.+There's a very nice Haskell library to use dbus.++This simple program will detect removable drives being mounted, and+works on Xfce (as long as you have automounting enabled in its+configuration), and should also work on Gnome, and, probably, KDE:++[[!format haskell """+{-# LANGUAGE OverloadedStrings #-}++import Data.List (sort)+import DBus+import DBus.Client+import Control.Monad++main = do+ client <- connectSession+ + listen client mountadded $ \s ->+ putStrLn (show s)++ forever $ getLine -- let listener thread run forever++ where+ mountadded = matchAny+ { matchInterface = Just "org.gtk.Private.RemoteVolumeMonitor"+ , matchMember = Just "MountAdded"+ }+"""]]++(Yeah... "org.gtk.Private.RemoteVolumeMonitor". There are so+many things wrong with that string. What does gtk have to do with+mounting a drive? Why is it Private? Bleagh. Should I only match+the "MountAdded" member and not the interface? Seems everyone who does+this relies on google to find other people who have cargo-culted it,+or just runs `dbus-monitor` and picks out things.+There seems to be no canonical list of events. Bleagh.)++----++Spent a while shaving a yak of needing a `getmntent` interface in Haskell.+Found one in a hsshellscript library; since that library is not packaged+in Debian, and I don't really want to depend on it, I extracted just+the mtab and fstab parts of it into a little library in git-annex.++----++I've started putting together a MountWatcher thread. On systems without+dbus (do OSX or the BSDs have dbus?), or if dbus is not running, it polls+`/etc/mtab` every 10 seconds for new mounts. When dbus is available,+it doesn't need the polling, and should notice mounts more quickly.++Open question: Should it still poll even when dbus is available? Some of us+like to mount our own drives, by hand and may have automounting disabled. It'd+be good if the assistant supported that. This might need a+`annex.no-dbus` setting, but I'd rather avoid needing such manual+configuration.++One idea is to do polling in addition to dbus, if `/etc/fstab` contains+mount points that seem to be removable drives, on which git remotes lives.+Or it could always do polling in addition to dbus, which is just some extra+work. Or, it could try to introspect dbus to see if mount events will+be generated.++The MountWatcher so far only detects new mounts and prints out what+happened. Next up: Do something in response to them. ++This will involve manipulating the Annex state to belatedly add the Remote+on the mount point.. tricky. And then, for Git Remotes, it should pull/push+the Remote to sync git data. Finally, for all remotes, it will need to+queue Transfers of file contents from/to the newly available Remote.
@@ -0,0 +1,46 @@+I made the MountWatcher only use dbus if it sees a client connected to dbus+that it knows will send mount events, or if it can start up such a client+via dbus. (Fancy!) Otherwise it falls back to polling. This should be enough+to support users who manually mount things -- if they have gvfs+installed, it'll be used to detect their manual mounts, even when a desktop+is not running, and if they don't have gvfs, they get polling.++Also, I got the MountWatcher to work with KDE. Found a dbus event that's+emitted when KDE mounts a drive, and this is also used. If anyone with+some other desktop environment wants me to add support for it, and it uses+dbus, it should be easy: Run `dbus-monitor`, plug in a drive, get+it mounted, and send me a transcript.++Of course, it'd also be nice to support anything similar on OSX that can+provide mount event notifications. Not a priority though, since the polling+code will work.++---++Some OS X fixes today..++* Jimmy pointed out that my `getmntent` code broke the build on OSX again.+ Sorry about that.. I keep thinking Unix portability nightmares are a 80's+ thing, not a 2010's thing. Anyway, adapted a lot of hackish C code+ to emulate `getmntent` on BSD systems, and it seems to work. (I actually+ think the BSD interface to this is saner than Linux's, but I'd rather have+ either one than both, sigh..)+* Kqueue was blocking all the threads on OSX. This is fixed, and the+ assistant seems to be working on OSX again.++----++I put together a preliminary page thanking everyone who contributed to the+git-annex Kickstarter. [[/assistant/thanks]] The wall-o-names is scary crazy humbling.++----++Improved `--debug` mode for the assistant, now every thread says whenever+it's doing anything interesting, and also there are timestamps.++----++Had been meaning to get on with syncing to drives when they're mounted, but+got sidetracked with the above. Maybe tomorrow. I did think through it+in some detail as I was waking up this morning, and think I have a pretty+good handle on it.
@@ -0,0 +1,27 @@+Made the MountWatcher update state for remotes located in a drive that+gets mounted. This was tricky code. First I had to make remotes declare+when they're located in a local directory. Then it has to rescan git+configs of git remotes (because the git repo mounted at a mount point may+change), and update all the state that a newly available remote can affect.++And it works: I plug in a drive containing one of my git remotes, and the+assistant automatically notices it and syncs the git repositories.++---++But, data isn't transferred yet. When a disconnected remote becomes+connected, keys should be transferred in both directions to get back into+sync.++To that end, added Yet Another Thread; the TransferScanner thread+will scan newly available remotes to find keys, and queue low priority+transfers to get them fully in sync.++(Later, this will probably also be used for network remotes that become+available when moving between networks. I think network-manager sends+dbus events it could use..)++This new thread is missing a crucial peice, it doesn't yet have a way to+find the keys that need to be transferred. Doing that efficiently (without+scanning the whole git working copy) is Hard. I'm considering design+possibilities..
@@ -0,0 +1,37 @@+Milestone: I can run `git annex assistant`, plug in a USB drive, and it+automatically transfers files to get the USB drive and current repo back in+sync.++I decided to implement the naive scan, to find files needing to be+transferred. So it walks through `git ls-files` and checks each file+in turn. I've deferred less expensive, more sophisticated approaches to later.++I did some work on the TransferQueue, which now keeps track of the length+of the queue, and can block attempts to add Transfers to it if it gets too+long. This was a nice use of STM, which let me implement that without using+any locking.++[[!format haskell """+atomically $ do+ sz <- readTVar (queuesize q)+ if sz <= wantsz+ then enqueue schedule q t (stubInfo f remote)+ else retry -- blocks until queuesize changes+"""]]++Anyway, the point was that, as the scan finds Transfers to do,+it doesn't build up a really long TransferQueue, but instead is blocked+from running further until some of the files get transferred. The resulting+interleaving of the scan thread with transfer threads means that transfers+start fairly quickly upon a USB drive being plugged in, and kind of hides+the innefficiencies of the scanner, which will most of the time be+swamped out by the IO bound large data transfers.++---++At this point, the assistant should do a good job of keeping repositories+in sync, as long as they're all interconnected, or on removable media+like USB drives. There's lots more work to be done to handle use cases+where repositories are not well-connected, but since the assistant's+[[syncing]] now covers at least a couple of use cases, I'm ready to move+on to the next phase. [[Webapp]], here we come!
@@ -0,0 +1,83 @@+After an all-nighter, I have `git annex webapp` launching a WebApp!++It doesn't do anything useful yet, just uses Yesod to display a couple of+hyperlinked pages and a favicon, securely.++The binary size grew rather alarmingly, BTW. :) Indeed, it's been growing+for months..++ -rwxr-xr-x 1 root root 9.4M Jul 21 16:59 git-annex-no-assistant-stripped+ -rwxr-xr-x 1 joey joey 12M Jul 25 20:54 git-annex-no-webapp-stripped+ -rwxr-xr-x 1 joey joey 17M Jul 25 20:52 git-annex-with-webapp-stripped++----++Along the way, some Not Invented Here occurred:++I didn't use the yesod scaffolded site, because it's a lot of what+seems mostly to be cruft in this use case. And because I don't like+code generated from templates that people are then expected to edit. Ugh.+That's my least favorite part of Yesod. This added some pain, since+I had to do everything the hard way.++I didn't use [wai-handler-launch](http://hackage.haskell.org/package/wai-handler-launch)+because:++ * It seems broken on IPv6 capable machines (it always opens+ `http://127.0.0.1:port/` even though it apparently doesn't always+ listen there.. I think it was listening on my machine's ipv6 address+ instead. I know, I know; I should file a bug about this..)+ * It always uses port 4587, which is **insane**. What if you have two+ webapps?+ * It requires javascript in the web browser, which+ is used to ping the server, and shut it down when the web browser closes+ (which behavior is wrong for git-annex anyway, since the daemon should+ stay running across browser closes).+ * It opens the webapp on web server startup, which is wrong for git-annex; + instead the command `git annex webapp` will open the webapp,+ after `git annex assistant` started the web server.++Instead, I rolled my own WAI webapp laucher, that binds to any free port+on localhost, It does use `xdg-open` to launch the web browser, +like wai-handler-launch (or just `open` on OS X).++Also, I wrote my own WAI logger, which logs using System.Log.Logger,+instead of to stdout, like `runDebug` does.++----++The webapp only listens for connections from localhost, but that's+not sufficient "security". Instead, I added a secret token to+every url in the webapp, that only `git annex webapp` knows about.++But, if that token is passed to `xdg-open` on its command line,+it will be briefly visible to local attackers in the parameters of+`xdg-open`.. And if the web browser's not already running, it'll run+with it as a parameter, and be *very* visible.++So instead, I used a nasty hack. On startup, the assistant+will create a html file, readably only by the user, that redirects+the user to the real site url. Then `git annex webapp` will run+xdg-open on that file.++----++Making Yesod check the `auth=` parameter (to verify that the secret token+is right) is when using Yesod started to pay off. Yesod has a simple+`isAuthorized` method that can be overridden to do your own authentication+like this.++But Yesod really started to shine when I went to add the `auth=` parameter+to every url in the webapp. There's a `joinPath` method can can be used+to override the default url builder. And every type-safe url in the+application goes through there, so it's perfect for this.++I just had to be careful to make it not add `auth=` to the url for the+favicon, which is included in the "Permission Denied" error page. That'd be+an amusing security hole..++----++Next up: Doing some AJAX to get a dynamic view of the state of the daemon,+including currently running transfers, in the webapp. AKA stuff I've never+done before, and that, unlike all this heavy Haskell Yesod, scares me. :)
@@ -0,0 +1,66 @@+The webapp now displays actual progress bars, for the actual transfers+that the assistant is making! And it's seriously shiny.++[[!img full.png]]++Yes, I used Bootstrap. I can see why so many people are using it,+that the common complaint is everything looks the same. I spent a few hours+mocking up the transfer display part of the WebApp using Bootstrap, and+arrived at something that doesn't entirely suck remarkably quickly.++The really sweet thing about Bootstrap is that when I resized my browser to+the shape of a cell phone, it magically redrew the WebApp like so:++[[!img phone.png]]++---++To update the display, the WebApp uses two techniques. On noscript+browsers, it just uses a meta refresh, which is about the best I can do. I+welcome feedback; it might be better to just have an "Update" button in+this case.++With javascript enabled, it uses long polling, done over AJAX. There are+some other options I considered, including websockets, and server-sent+events. Websockets seem too new, and while there's a WAI module supporting+server-sent events, and even an example of them in the Yesod book, the+module is not packaged for Debian yet. Anyway, long polling is the most+widely supported, so a good starting place. It seems to work fine too, I+don't really anticipate needing the more sophisticated methods.++(Incidentially, this's the first time I've ever written code that uses AJAX.)++Currently the status display is rendered in html by the web server, and+just updated into place by javascript. I like this approach since it+keeps the javascript code to a minimum and the pure haskell code to a+maximum. But who knows, I may have to switch to JSON that gets rendered by+javascript, for some reason, later on.++---++I was very happy with Yesod when I managed to factor out a+general purpose widget that adds long-polling and meta-refresh to any+other widget. I was less happy with Yesod when I tried to include+jquery on my static site and it kept serving up a truncated version of it.+Eventually worked around what's seemingly a bug in the default WAI+middleware, by disabling that middleware.++----++Also yesterday I realized there were about 30 comments stuck in moderation on+this website. I thought I had a feed of those, but obviously I didn't. I've+posted them all, and also read them all.++----++Next up is probably some cleanup of bugs and minor todos. Including+figuring out why `watch` has started to segfault on OSX when it was+working fine before.++After that, I need to build a way to block the long polling request+until the DaemonStatus and/or TransferQueue change from the version+previously displayed by the WebApp. An interesting concurrency problem..++Once I have that working, I can reduce the current 3 second delay between+refreshes to a very short delay, and the WebApp will update in+near-realtime as changes come in.
binary file changed (absent → 55185 bytes)
binary file changed (absent → 41602 bytes)
@@ -0,0 +1,68 @@+Focus today was writing a notification broadcaster library. This is a way to+send a notification to a set of clients, any of which can be blocked+waiting for a new notification to arrive. A complication is that any number+of clients may be be dead, and we don't want stale notifications for those+clients to pile up and leak memory.++It took me 3 tries to find the solution, which turns out to be head-smackingly+simple: An array of SampleVars, one per client.++Using SampleVars means that clients only see the most recent notification,+but when the notification is just "the assistant's state changed somehow;+display a refreshed rendering of it", that's sufficient.++----++First use of that was to make the thread that woke up every 10 minutes+and checkpointed the daemon status to disk also wait for a notification+that it changed. So that'll be more current, and use less IO.++----++Second use, of course, was to make the WebApp block long polling clients+until there is really a change since the last time the client polled.++To do that, I made one change to my Yesod routes:++[[!format diff """+ -/status StatusR GET+ +/status/#NotificationId StatusR GET+"""]]++Now I find another reason to love Yesod, because after doing that,+I hit "make".. and fixed the type error. And hit make.. and fixed+the type error. And then it just freaking worked! Html was generated with+all urls to /status including a `NotificationId`, and the handler for+that route got it and was able to use it:++[[!format haskell """+ {- Block until there is an updated status to display. -}+ b <- liftIO $ getNotificationBroadcaster webapp+ liftIO $ waitNotification $ notificationHandleFromId b nid+"""]]++And now the WebApp is able to display transfers in realtime!+When I have both the WebApp and `git annex get` running on the same screen,+the WebApp displays files that git-annex is transferring about as fast+as the terminal updates.++The [[progressbars]] still need to be sorted out, but otherwise+the WebApp is a nice live view of file transfers.++---++I also had some fun with Software Transactional Memory. Now when the+assistant moves a transfer from its queue of transfers to do, to its map of+transfers that are currently running, it does so in an atomic transaction.+This will avoid the transfer seeming to go missing (or be listed twice) if+the webapp refreshes at just the wrong point in time. I'm really starting+to get into STM.++----++Next up, I will be making the WebApp maintain a list of notices, displayed+on its sidebar, scrolling new notices into view, and removing ones the user+closes, and ones that expire. This will be used for displaying errors, as+well as other communication with the user (such as displaying a notice+while a git sync is in progress with a remote, etc). Seems worth doing now,+so the basic UI of the WebApp is complete with no placeholders.
@@ -0,0 +1,14 @@+Some days I spend 2 hours chasing red herrings (like "perhaps my JSON ajax+calls arn't running asynchronoously?") that turn out to be a simple+one-word typo. This was one of them.++However, I did get the sidebar displaying alert messages, which can be+easily sent to the user from any part of the assistant. This includes+transient alerts of things it's doing, which disappear once the action+finishes, and long-term alerts that are displayed until the user closes+them. It even supports rendering arbitrary Yesod widgets as alerts, so+they can also be used for asking questions, etc.++Time for a screencast!++<video controls src="http://joeyh.name/screencasts/git-annex-webapp.ogg"></video>
@@ -0,0 +1,8 @@+Lots of WebApp UI improvements, mostly around the behavior when+displaying alert messages. Trying to make the alerts informative+without being intrusively annoying, think I've mostly succeeded now.++Also, added an intro display. Shown is the display with only one repo;+if there are more repos it also lists them all.++[[!img screenshot/intro.png]]
@@ -0,0 +1,39 @@+Started work on the interface displayed when the webapp is started +with no existing git-annex repository. All this needs to do is walk the user+through setting up a repository, as simply as possible.++A tricky part of this is that most of git-annex runs in the Annex monad,+which requires a git-annex repository. Luckily, much of the webapp+does not run in Annex, and it was pretty easy to work around the parts that+do. Dodged a bullet there.++There will, however, be a tricky transition from this first run webapp,+to a normally fully running git-annex assistant and webapp. I think the+first webapp will have to start up all the normal threads once it makes the+repository, and then redirect the user's web browser to the full webapp.++Anyway, the UI I've made is very simple: A single prompt, for the+directory where the repository should go. With, eventually, tab completion,+sanity checking (putting the repository in "/" is not good, and making it+all of "$HOME" is probably unwise).++[[!img screenshot/firstrun.png]]++Ideally most users will accept the default, which will be something+like `/home/username/Desktop/Annex`, and be through this step in seconds.++Suggestions for a good default directory name appreciated.. Putting it on a+folder that will appear on the desktop seems like a good idea, when there's+a Desktop directory. I'm unsure if I should name it something specific like+"GitAnnex", or something generic like "Synced".++Time for the first of probably many polls!++What should the default directory name used by the git-annex assistant be?++[[!poll open=no 19 "Annex" 7 "GitAnnex" 1 "~/git-annex/" 10 "Synced" 0 "AutoSynced" 1 "Shared" 10 "something lowercase!" 1 "CowboyNeal" 1 "Annexbox"]]++(Note: This is a wiki. You can edit this page to add your own+[[ikiwiki/directive/poll]] options!)++[[!tag polls]]
@@ -0,0 +1,47 @@+Only had a few hours to work today, but my current focus is speed, and I+have indeed sped up parts of `git annex watch`.++One thing folks don't realize about git is that despite a rep for being+fast, it can be rather slow in one area: Writing the index. You don't+notice it until you have a lot of files, and the index gets big. So I've+put a lot of effort into git-annex in the past to avoid writing the index+repeatedly, and queue up big index changes that can happen all at once. The+new `git annex watch` was not able to use that queue. Today I reworked the+queue machinery to support the types of direct index writes it needs, and+now repeated index writes are eliminated.++... Eliminated too far, it turns out, since it doesn't yet *ever* flush+that queue until shutdown! So the next step here will be to have a worker+thread that wakes up periodically, flushes the queue, and autocommits.+(This will, in fact, be the start of the [[syncing]] phase of my roadmap!)+There's lots of room here for smart behavior. Like, if a lot of changes are+being made close together, wait for them to die down before committing. Or,+if it's been idle and a single file appears, commit it immediately, since+this is probably something the user wants synced out right away. I'll start+with something stupid and then add the smarts.++(BTW, in all my years of programming, I have avoided threads like the nasty+bug-prone plague they are. Here I already have three threads, and am going to+add probably 4 or 5 more before I'm done with the git annex assistant. So+far, it's working well -- I give credit to Haskell for making it easy to+manage state in ways that make it possible to reason about how the threads+will interact.)++What about the races I've been stressing over? Well, I have an ulterior+motive in speeding up `git annex watch`, and that's to also be able to+**slow it down**. Running in slow-mo makes it easy to try things that might+cause a race and watch how it reacts. I'll be using this technique when+I circle back around to dealing with the races.++Another tricky speed problem came up today that I also need to fix. On+startup, `git annex watch` scans the whole tree to find files that have+been added or moved etc while it was not running, and take care of them.+Currently, this scan involves re-staging every symlink in the tree. That's+slow! I need to find a way to avoid re-staging symlinks; I may use `git+cat-file` to check if the currently staged symlink is correct, or I may+come up with some better and faster solution. Sleeping on this problem.++----++Oh yeah, I also found one more race bug today. It only happens at startup+and could only make it miss staging file deletions.
@@ -0,0 +1,20 @@+Based on the results of yesterday's poll, the WebApp defaults to+`~/Desktop/annex` when run in the home directory. If there's no `Desktop`+directory, it uses just `~/annex`. And if run from some other place than+the home directory, it assumes you want to use cwd. Of course, you can+change this default, but I think it's a good one for most use cases.++----++My work today has all been on making **one second** of the total lifetime+of the WebApp work. It's the very tricky second in between clicking on+"Make repository" and being redirected to a WebApp running in your new+repository. The trickiness involves threads, and MVars, and+multiple web servers, and I don't want to go into details here.+I'd rather forget. ;-)++Anyway, it works; you can run "git annex webapp" and be walked right+through to having a usable repository! Now I need to see about adding+that to the desktop menus, and making "git annex webapp", when run a second+time, remembering where your repository is. I'll use+`~/.config/git-annex/repository` for storing that.
@@ -0,0 +1,34 @@+Now installing git-annex automatically generates a freedesktop.org .desktop+file, and installs it, either system-wide (root) or locally (user). So+`Menu -> Internet -> Git Annex` will start up the web app.++(I don't entirely like putting it on the Internet menu, but the+Accessories menu is not any better (and much more crowded here), +and there's really no menu where it entirely fits.)++I generated that file by writing a generic library to deal with+freedesktop.org desktop files and locations. Which seemed like overkill at+the time, but then I found myself continuing to use that library. Funny how+that happens.++So, there's also another .desktop file that's used to autostart the+`git-annex assistant` daemon when the user logs into the desktop.++This even works when git-annex is installed to the ugly non-PATH location+`.cabal/bin/git-annex` by Cabal! To make that work, it records the path+the binary is at to a freedesktop.org data file, at install time.++---++That should all work in Gnome, KDE, XFCE, etc. Not Mac OSX I'm guessing...++---++Also today, I added a sidebar notification when the assistant notices new+files. To make that work well, I implemented merging of related sidebar+action notifications, so the effect is that there's one notification that+collectes a list of recently added files, and transient notifications that+show up if a really big file is taking a while to checksum.++I'm pleased that the notification interface is at a point where I was able+to implement all that, entirely in pure functional code.
@@ -0,0 +1,21 @@+Today I added a "Files" link in the navbar of the WebApp. It looks like a+regular hyperlink, but clicking on it opens up your desktop's native file+manager, to manage the files in the repository!++Quite fun to be able to do this kind of thing from a web page. :)++---++Made `git annex init` (and the WebApp) automatically generate a description+of the repo when none is provided.++---++Also worked on the configuration pages some. I don't want to get ahead+of myself by diving into the full configuration stage yet, but I am at+least going to add a configuration screen to clone the repo to a removable+drive.++After that, the list of transfers on the dashboard needs some love.+I'll probably start by adding UI to cancel running transfers, and then+try to get drag and drop reordering of transfers working.
@@ -0,0 +1,99 @@+Spent yesterday and today making the WebApp handle adding removable drives.++While it needs more testing, I think that it's now possible to use the WebApp+for a complete sneakernet usage scenario.++* Start up the webapp, let it make a local repo.+* Add some files, by clicking to open the file manager, and dragging them in.+* Plug in a drive, and tell the webapp to add it.+* Wait while files sync..+* Take the drive to another computer, and repeat the process there.++No command-line needed, and files will automatically be synced between+two or more computers using the drive.++Sneakernet is only one usage scenario for the git-annex assistant, but I'm+really happy to have one scenario 100% working!++Indeed, since the assistant and webapp can now actually do something+useful, I'll probably be merging them into `master` soon.++Details follow..++---++So, yesterday's part of this was building the configuration page to add+a removable drive. That needs to be as simple as possible, and it currently+consists of a list of things git-annex thinks might be mount points of+removable drives, along with how much free space they have. Pick a drive,+click the pretty button, and away it goes..++(I decided to make the page so simple it doesn't even ask where you want+to put the directory on the removable drive. It always puts it in+a "annex" directory. I might add an expert screen later, but experts can+always set this up themselves at the command line too.)++I also fought with Yesod and Bootstrap rather a lot to make the form look good.+Didn't entirely succeed, and had to file a bug on Yesod about its handling of+check boxes. (Bootstrap also has a bug, IMHO; its drop down lists are not+always sized wide enough for their contents.)++Ideally this configuration page would listen for mount events, and refresh+its list. I may add that eventually; I didn't have a handy channel it+could use to do that, so defferred it. Another idea is to have the mount+event listener detect removable drives that don't have an annex on them yet,+and pop up an alert with a link to this configuration page.++----++Making the form led to a somewhat interesting problem: How to tell if a mounted+filesystem is a removable drive, or some random thing like `/proc` or+a fuse filesystem. My answer, besides checking that the user can+write to it, was various heuristics, which seem to work ok, at least here..++[[!format haskell """+ sane Mntent { mnt_dir = dir, mnt_fsname = dev }+ {- We want real disks like /dev/foo, not+ - dummy mount points like proc or tmpfs or+ - gvfs-fuse-daemon. -}+ | not ('/' `elem` dev) = False+ {- Just in case: These mount points are surely not+ - removable disks. -}+ | dir == "/" = False+ | dir == "/tmp" = False+ | dir == "/run/shm" = False+ | dir == "/run/lock" = False+"""]]++----++Today I did all the gritty coding to make it create a git repository on the+removable drive, and tell the Annex monad about it, and ensure it gets synced.++As part of that, it detects when the removable drive's filesystem doesn't+support symlinks, and makes a bare repository in that case. Another expert+level config option that's left out for now is to always make a bare+repository, or even to make a directory special remote rather than a git+repository at all. (But directory special remotes cannot support the+sneakernet use case by themselves...)++----++Another somewhat interesting problem was what to call the git remotes+that it sets up on the removable drive and the local repository.+Again this could have an expert-level configuration, but the defaults+I chose are to use the hostname as the remote name on the removable drive,+and to use the basename of the mount point of the removable drive as the +remote name in the local annex.++----++Originally, I had thought of this as cloning the repository to the drive.+But, partly due to luck, I started out just doing a `git init` to make+the repository (I had a function lying around to do that..).++And as I worked on it some more, I realized this is not as simple as a+clone. It's a bi-directional sync/merge, and indeed the removable drive may+have all the data already in it, and the local repository have just been+created. Handling all the edge cases of that (like, the local repository+may not have a "master" branch yet..) was fun!
@@ -0,0 +1,10 @@+Nothing flashy today; I was up all night trying to download photos taken +by a robot lowered onto Mars by a skycrane.++Some work on alerts. Added an alert when a file transfer succeeds or fails.+Improved the alert combining code so it handles those alerts, and+simplified it a lot, and made it more efficient.++Also made the text of action alerts change from present to past tense when+the action finishes. To support that I wrote a fun data type, a `TenseString`+that can be rendered in either tense.
@@ -0,0 +1,8 @@+A bit under the weather, but got into building buttons to control running+and queued transfers today. The html and javascript side is done, with+each transfer now having a cancel button, as well as a pause/start button.++Canceling queued transfers works. Canceling running transfers will+need some more work, because killing a thread doesn't kill the processes+being run by that thread. So I'll have to make the assistant run separate+git-annex processes for transfers, that can be individually sent signals.
@@ -0,0 +1,40 @@+Probably won't be doing any big coding on the git-annex assistant in the+upcoming week, as I'll be traveling and/or slightly ill enough that I can't+fully get into <a href="http://en.wikipedia.org/wiki/Flow_(psychology)">flow</a>.++---++There was a new Yesod release this week, which required minor changes to+make the webapp build with it. I managed to keep the old version of Yesod+also supported, and plan to keep that working so it can be built with the+version of Yesod available in, eg, Linux distributions. TBD how much pain+that will involve going forward.++---++I'm mulling over how to support stopping/pausing transfers. The problem+is that if the assistant is running a transfer in one thread, and the+webapp is used to cancel it, killing that thread won't necessarily stop the+transfer, because, at least in Haskell's thread model, killing a thread+does not kill processes started by the thread (like rsync).++So one option is to have the transfer thread run a separate git-annex+process, which will run the actual transfer. And killing that process will+stop the transfer nicely. However, using a separate git-annex process means+a little startup overhead for each file transferred (I don't know if it'd+be enough to matter). Also, there's the problem that git-annex is sometimes+not installed in PATH (wish I understood why cabal does that), which+makes it kind of hard for it to run itself. (It can't simply fork, sadly.+See past horrible pain with forking and threads.)++The other option is to change the API for git-annex remotes, so that+their `storeKey` and `retrieveKeyFile` methods return a pid of the program+that they run. When they *do* run a program.. not all remotes do. This+seems like it'd make the code in the remotes hairier, and it is also asking+for bugs, when a remote's implementation changes. Or I could go+lower-level, and make every place in the utility libraries that forks a+process record its pid in a per-thread MVar. Still seems to be asking for+bugs.++Oh well, at least git-annex is already crash-safe, so once I figure out+how to kill a transfer process, I can kill it safely. :)
@@ -0,0 +1,26 @@+Unexpectedly managed a mostly productive day today. ++Went ahead with making the assistant run separate `git-annex` processes for+transfers. This will currently fail if git-annex is not installed in PATH.+(Deferred dealing with that.)++To stop a transfer, the webapp needs to signal not just the git-annex+process, but all its children. I'm using process groups for this, which is+working, but I'm not extremely happy with.++Anyway, the webapp's UI can now be used for stopping transfers, and it+wasn't far from there to also implementing pausing of transfers. ++Pausing a transfer is actually the same as stopping it, except a special+signal is sent to the transfer control thread, which keeps running, despite+the git-annex process having been killed, waits for a special resume+signal, and restarts the transfer. This way a paused transfer continues to+occupy a transfer slot, which prevents other queued transfers from running.+This seems to be the behavior that makes sense.++Still need to wire up the webapp's button for starting a transfer. For a+paused transfer, that will just need to resume it. I have not decided what+the button should do when used on a transfer that is queued but not running+yet. Maybe it forces it to run even if all transfer slots are already in+use? Maybe it stops one of the currently running transfers to free up a+slot?
@@ -0,0 +1,10 @@+Actually did do some work on the webapp today, just fixing a bug I noticed+in a spare moment. Also managed a bit in the plane earlier this week,+implementing resuming of paused transfers. (Still need to test that.)++But the big thing today was dinner with one of my major Kickstarter+backers, and as it turned out, "half the Haskell community of San+Francisco" (3 people). Enjoyed talking about git-annex and haskell with+them.++I'm looking forward to getting back home and back to work on Monday..
@@ -0,0 +1,57 @@+After a few days otherwise engaged, back to work today.++My focus was on adding the committing thread mentioned in [[day_4__speed]].+I got rather further than expected!++First, I implemented a really dumb thread, that woke up once per second,+checked if any changes had been made, and committed them. Of course, this+rather sucked. In the middle of a large operation like untarring a tarball,+or `rm -r` of a large directory tree, it made lots of commits and made+things slow and ugly. This was not unexpected.++So next, I added some smarts to it. First, I wanted to stop it waking up+every second when there was nothing to do, and instead blocking wait on a+change occurring. Secondly, I wanted it to know when past changes happened,+so it could detect batch mode scenarios, and avoid committing too+frequently. ++I played around with combinations of various Haskell thread communications+tools to get that information to the committer thread: `MVar`, `Chan`,+`QSem`, `QSemN`. Eventually, I realized all I needed was a simple channel+through which the timestamps of changes could be sent. However, `Chan`+wasn't quite suitable, and I had to add a dependency on +[Software Transactional Memory](http://en.wikipedia.org/wiki/Software_Transactional_Memory),+and use a `TChan`. Now I'm cooking with gas!++With that data channel available to the committer thread, it quickly got+some very nice smart behavior. Playing around with it, I find it commits+*instantly* when I'm making some random change that I'd want the+git-annex assistant to sync out instantly; and that its batch job detection+works pretty well too.++There's surely room for improvement, and I made this part of the code+be an entirely pure function, so it's really easy to change the strategy.+This part of the committer thread is so nice and clean, that here's the+current code, for your viewing pleasure:++[[!format haskell """+{- Decide if now is a good time to make a commit.+ - Note that the list of change times has an undefined order.+ -+ - Current strategy: If there have been 10 commits within the past second,+ - a batch activity is taking place, so wait for later.+ -}+shouldCommit :: UTCTime -> [UTCTime] -> Bool+shouldCommit now changetimes+ | len == 0 = False+ | len > 4096 = True -- avoid bloating queue too much+ | length (filter thisSecond changetimes) < 10 = True+ | otherwise = False -- batch activity+ where+ len = length changetimes+ thisSecond t = now `diffUTCTime` t <= 1+"""]]++Still some polishing to do to eliminate minor inefficiencies and deal+with more races, but this part of the git-annex assistant is now very usable,+and will be going out to my beta testers soon!
@@ -0,0 +1,40 @@+As I prepare to dive back into development, now is a good time to review+what I've built so far, and how well I'm keeping up with my planned+[[roadmap|assistant]].++I started working two and a half months ago, so am nearing the end of+the three months I originally asked to be funded for on Kickstarter.++I've built much of what I planned to build in the first three months --+[[inotify]] is done (and kqueue is basically working, but needs scalability+work), local [[syncing]] is done, the [[webapp]] works, and I've built some+of the first [[configurators]]. It's all functional in a narrow use case+involving syncing to removable drives. ++[[progressbars]] still need to be dealt with, and network syncing needs to+be revisited soon, so that I can start building easy configurators for+further use cases, like using the cloud, or another machine on the local+network.++I think I'm a little behind my original schedule, but not too bad,+and at the same time, I think I've built things rather more solidly than I+expected them to be at this point. I'm particularly happy with how well+the inotify code works, no matter what is thrown at it, and how nice+the UI in the webapp is shaping up to be.++----++I also need to get started on fulfilling my Kickstarter rewards, and+I was happy to spend some time in the airport working on the main+blocker toward that, a lack of a scalable git-annex logo, which is needed+for printing on swag.++Turns out that inkscape has some amazing bitmap tracing capabilities.+I was able to come up with this scalable logo in short order, it +actually took longer to add back the colors, as the tracer generated a+black and white version.++With that roadblock out of the way, I am moving toward ordering large+quantities of usb drives, etc.++[[logo.svg]]
@@ -0,0 +1,36 @@+Today, added a thread that deals with recovering when there's been a loss+of network connectivity. When the network's down, the normal immediate+syncing of changes of course doesn't work. So this thread detects when the+network comes back up, and does a pull+push to network remotes, and+triggers scanning for file content that needs to be transferred.++I used dbus again, to detect events generated by both network-manager and+wicd when they've sucessfully brought an interface up. Or, if they're not+available, it polls every 30 minutes.++When the network comes up, in addition to the git pull+push, it also+currently does a full scan of the repo to find files whose contents+need to be transferred to get fully back into sync.++I think it'll be ok for some git pulls and pushes to happen when+moving to a new network, or resuming a laptop (or every 30 minutes when+resorting to polling). But the transfer scan is currently really too heavy+to be appropriate to do every time in those situations. I have an idea for+avoiding that scan when the remote's git-annex branch has not changed. But+I need to refine it, to handle cases like this:++1. a new remote is added+2. file contents start being transferred to (or from it)+3. the network is taken down+4. all the queued transfers fail+5. the network comes back up+6. the transfer scan needs to know the remote was not all in sync+ before #3, and so should do a full scan despite the git-annex branch+ not having changed++---++Doubled the ram in my netbook, which I use for all development. Yesod needs+rather a lot of ram to compile and link, and this should make me quite a+lot more productive. I was struggling with OOM killing bits of chromium+during my last week of development.
@@ -0,0 +1,21 @@+Woke up this morning with most of the design for a smarter approach to+[[syncing]] in my head. (This is why I sometimes slip up and tell people I+work on this project 12 hours a day..)++To keep the current `assistant` branch working while I make changes+that break use cases that are working, I've started +developing in a new branch, `assistant-wip`.++In it, I've started getting rid of unnecessary expensive transfer scans.++First optimisation I've done is to detect when a remote that was+disconnected has diverged its `git-annex` branch from the local branch.+Only when that's the case does a new transfer scan need to be done, to find+out what new stuff might be available on that remote, to have caused the+change to its branch, while it was disconnected.++That broke a lot of stuff. I have a plan to fix it written down in+[[syncing]]. It'll involve keeping track of whether a transfer scan has+ever been done (if not, one should be run), and recording logs when+transfers failed, so those failed transfers can be retried when the+remote gets reconnected.
@@ -0,0 +1,26 @@+Implemented everything I planned out yesterday: Expensive scans are only+done once per remote (unless the remote changed while it was disconnected),+and failed transfers are logged so they can be retried later.++Changed the TransferScanner to prefer to scan low cost remotes first,+as a crude form of scheduling lower-cost transfers first.++A whole bunch of interesting syncing scenarios should work now. I have not+tested them all in detail, but to the best of my knowledge, all these+should work:++* Connect to the network. It starts syncing with a networked remote.+ Disconnect the network. Reconnect, and it resumes where it left off.+* Migrate between networks (ie, home to cafe to work). Any transfers+ that can only happen on one LAN are retried on each new network you+ visit, until they succeed.++One that is not working, but is soooo close:++* Plug in a removable drive. Some transfers start. Yank the plug.+ Plug it back in. All necessary transfers resume, and it ends up+ fully in sync, no matter how many times you yank that cable.++That's not working because of an infelicity in the MountWatcher.+It doesn't notice when the drive gets unmounted, so it ignores+the new mount event.
@@ -0,0 +1,33 @@+Working toward getting the data syncing to happen robustly,+so a bunch of improvements.++* Got unmount events to be noticed, so unplugging and replugging+ a removable drive will resume the syncing to it. There's really no+ good unmount event available on dbus in kde, so it uses a heuristic+ there.+* Avoid requeuing a download from a remote that no longer has a key.+* Run a full scan on startup, for multiple reasons, including dealing with+ crashes.++Ran into a strange issue: Occasionally the assistant will run `git-annex+copy` and it will not transfer the requested file. It seems that+when the copy command runs `git ls-files`, it does not see the file+it's supposed to act on in its output.++Eventually I figured out what's going on: When updating the git-annex+branch, it sets `GIT_INDEX_FILE`, and of course environment settings are+not thread-safe! So there's a race between threads that access+the git-annex branch, and the Transferrer thread, or any other thread+that might expect to look at the normal git index.++Unfortunatly, I don't have a fix for this yet.. Git's only interface for+using a different index file is `GIT_INDEX_FILE`. It seems I have a lot of+code to tear apart, to push back the setenv until after forking every git+command. :(++Before I figured out the root problem, I developed a workaround for the+symptom I was seeing. I added a `git-annex transferkey`, which is+optimised to be run by the assistant, and avoids running `git ls-files`, so+avoids the problem. While I plan to fix this environment variable problem+properly, `transferkey` turns out to be so much faster than how it was+using `copy` that I'm going to keep it.
@@ -0,0 +1,33 @@+Almost done with the data transfer code.. Today I filled in some bits and+peices.++Made the expensive transfer scan handle multiple remotes in one pass.+So on startup, it only runs once, not N times. And when reconnecting to the+network, when a remote has changed, it scans all network remotes in one+pass, rather than making M redundant passes.++Got syncing with special remotes all working. Pretty easy actually. Just+had to avoid doing any git repo push/pull with them, while still queueing+data transfers.++It'll even download anything it can from the web special remote. To support+that, I added generic support for readonly remotes; it'll only download from+those and not try to upload to them.++(Oh, and I properly fixed the nasty `GIT_INDEX_FILE` environment variable+problem I had the other day.)++I feel I'm very close to being able to merge the assistant branch into+master now. I'm reasonably confident the data transfer code will work+well now, and manage to get things in sync eventually in all circumstances.+(Unless there are bugs.) All the other core functionality of the assistant+and webapp is working. The only think I might delay because of is the+missing [[progressbars]] in the webapp .. but that's a silly thing to+block the merge on. ++Still, I might spend a day and get a dumb implementation of progress bars+for downloads working first (progress bars for uploads are probably rather+harder). I'd spend longer on progress bars, but there are so many more+exciting things I'm now ready to develop, like automatic configurators+for using your git annex with Amazon S3, rsync.net, and the computer across+the room..!
@@ -0,0 +1,19 @@+It's done! The assistant branch is merged into master.++Updated the [[assistant]] page with some screenshots and instructions for+using it.++Made some cosmetic fixes to the webapp.++Fixed the transferrer to use `~/.config/git-annex/program`+to find the path to git-annex when running it. (There are ways to find the+path of the currently running program in unux, but they all suck, so I'm+avoiding them this way.)++Read some OSX launchd documentation, and it seems it'd be pretty easy to+get the assistant to autostart on login on OSX. If someone would like to+test launchd files for me, get in touch.++-----++AKA: Procrastinating really hard on those progress bars. ;)
@@ -0,0 +1,10 @@+Got the webapp's progress bars updating for downloads. Updated+[[progressbars]] with all the options for ways to get progress info. For+downloads, it currently uses the easy, and not very expensive, approach of+periodically polling the sizes of files that are being downloaded.++For uploads, something more sophisticated will be called for..++---++The webapp really feels alive now that it has progress bars!
@@ -0,0 +1,15 @@+More work on the display and control of transfers.++* Hide redundant downloads from the transfer display. It seemed simplest+ to keep the behavior of queuing downloads from every remote that has a+ file, rather than going to some other data structure, but it's clutter+ to display those to the user, especially when you often have 7 copies+ of each file, like I do.+* When canceling a download, cancel all other queued downloads of that+ key too.+* Fixed unsettting of the paused flag when resuming a paused transfer.+* Implemented starting queued transfers by clicking on the start button.+* Spent a long time debugging why pausing, then resuming, and then pausing+ a transfer doesn't successfully pause it the second time. I see where+ the code is seemingly locking up in a `throwTo`, but I don't understand+ why that blocks forever. Urgh..
@@ -0,0 +1,7 @@+Short day today.++* Worked on fixing a number of build failures people reported.+* Solved the problem that was making transfer pause/resume not always work.+ Although there is another bug where pausing a transfer sometimes lets+ another queued transfer start running. +* Worked on getting the assistant to start on login on OSX.
@@ -0,0 +1,50 @@+Since my last blog, I've been polishing the `git annex watch` command.++First, I fixed the double commits problem. There's still some extra+committing going on in the `git-annex` branch that I don't understand. It+seems like a shutdown event is somehow being triggered whenever+a git command is run by the commit thread.++I also made `git annex watch` run as a proper daemon, with locking to+prevent multiple copies running, and a pid file, and everything.+I made `git annex watch --stop` stop it.++---++Then I managed to greatly increase its startup speed. At startup, it+generates "add" events for every symlink in the tree. This is necessary+because it doesn't really know if a symlink is already added, or was+manually added before it starter, or indeed was added while it started up.+Problem was that these events were causing a lot of work staging the+symlinks -- most of which were already correctly staged.++You'd think it could just check if the same symlink was in the index.+But it can't, because the index is in a constant state of flux. The+symlinks might have just been deleted and re-added, or changed, and+the index still have the old value.++Instead, I got creative. :) We can't trust what the index says about the+symlink, but if the index happens to contain a symlink that looks right,+we can trust that the SHA1 of its blob is the right SHA1, and reuse it+when re-staging the symlink. Wham! Massive speedup!++---++Then I started running `git annex watch` on my own real git annex repos,+and noticed some problems.. Like it turns normal files already checked into+git into symlinks. And it leaks memory scanning a big tree. Oops..++---++I put together a quick screencast demoing `git annex watch`.++<video controls src="http://joeyh.name/screencasts/git-annex-watch.ogg"></video>++While making the screencast, I noticed that `git-annex watch` was spinning+in strace, which is bad news for powertop and battery usage. This seems to+be a [GHC bug](http://bugs.debian.org/677096) also affecting Xmonad. I+tried switching to GHC's threaded runtime, which solves that problem, but+causes git-annex to hang under heavy load. Tried to debug that for quite a+while, but didn't get far. Will need to investigate this further.. +Am seeing indications that this problem only affects ghc 7.4.1; in+particular 7.4.2 does not seem to have the problem.
@@ -0,0 +1,66 @@+Today I built the UI in the webapp to set up a ssh or rsync remote.++This is the most generic type of remote, and so it's surely got the most+complex description. I've tried to word it as clearly as I can; suggestions+most appreciated. Perhaps I should put in a diagram?++[[!img /assistant/addsshserver.png]]++The idea is that this will probe the server, using ssh. If `git-annex-shell`+is available there, it'll go on to set up a full git remote. If not, it'll+fall back to setting up a rsync special remote. It'll even fall all the way+back to using `rsync://` protocol if it can't connect by ssh. So the user+can just point it at a server and let it take care of the details,+generally.++The trickiest part of this will be authentication, of course. I'm relying+on ssh using `ssh-askpass` to prompt for any passwords, etc, when there's+no controlling terminal. But beyond passwords, this has to deal with ssh+keys.++I'm planning to make it check if you have a ssh key configured already. If+you do, it doesn't touch your ssh configuration. I don't want to get in the+way of people who have a manual configuration or are using MonkeySphere.++But for a user who has never set up a ssh key, it will prompt asking if+they'd like a key to be set up. If so, it'll generate a key and configure+ssh to only use it with the server.. and as part of its ssh probe, that key+will be added to `authorized_keys`.++(Obviously, advanced users can skip this entirely; `git remote add+ssh://...` still works..)++----++Also today, fixed more UI glitches in the transfer display. I think+I have them all fixed now, except for the one that needs lots of javascript+to be written to fix it.++Amusingly, while I was working on UI glitches, it turned out that all the+fixes involved 100% pure code that has nothing to do with UI. The UI was+actually just exposing bugs.++For example, closing a running transfer+had a bug that weirdly reordered the queue. This turned out to be+due to the transfer queue actually maintaining two versions of the queue,+one in a TChan and one a list. Some unknown bugs caused these to get out of+sync. That was fixed very handily by deleting the TChan, so there's only+one copy of the data.++I had only been using that TChan because I wanted a way to block while the+queue was empty. But now that I'm more comfortable with STM, I know how+to do that easily using a list:++[[!format haskell """+ getQueuedTransfer q = atomically $ do+ sz <- readTVar (queuesize q)+ if sz < 1+ then retry -- blocks until size changes+ else ...+"""]]++Ah, the times before [STM](http://en.wikipedia.org/wiki/Software_transactional_memory)+were dark times indeed. I'm writing more and more STM code lately, building+up more and more complicated and useful transactions. If you use threads and+don't know about STM, it's a great thing to learn, to get out of the dark ages+of dealing with priority inversions, deadlocks, and races.
@@ -0,0 +1,26 @@+Got ssh probing implemented. It checks if it can connect to the server, and+probes the server to see how it should be used. ++Turned out to need two ssh probes. The first uses the system's existing ssh+configuration, but disables password prompts. If that's able to get in+without prompting for a password, then the user must have set that up,+and doesn't want to be bothered with password prompts, and it'll respect+that configuration.++Otherwise, it sets up a per-host ssh key, and configures a hostname alias+in `~/.ssh/config` to use that key, and probes using that. +Configuring ssh this way is nice because it avoids changing ssh's+behavior except when git-annex uses it, and it does not open up the server+to arbitrary commands being run without password.++--++Next up will be creating the repositories. When there's a per-host key,+this will also involve setting up `authorized_keys`, locking down the ssh+key to only allow running git-annex-shell or rsync.++I decided to keep that separate from the ssh probing, even though it means+the user will be prompted twice for their ssh password. It's cleaner and+allows the probing to do other checks -- maybe it'll later check the amount+of free disk space -- and the user should be able to decide after the probe+whether or not to proceed with making the repository.
@@ -0,0 +1,17 @@+Now finished building a special configurator for rsync.net. While+this is just a rsync remote to git-annex, there are some tricky bits to+setting up the ssh key using rsync.net's restricted shell. The configurator+automates that nicely. It took about 3 hours of work, and 49 lines of+rsync.net specific code to build this.++[[!img /assistant/rsync.net.png]]++Thanks to rsync.net who heard of my Kickstarter and gave me a really+nice free lifetime account. BTW guys, I wish your restricted shell+supported '&&' in between commands, and returned a nonzero exit status when+the command fails. This would make my error handling work better.++I've also reworked the repository management page. Nice to see those+configurators start to fill in!++[[!img /assistant/repositories.png]]
@@ -0,0 +1,7 @@+* On OSX, install a launcher plist file, to run the assistant on login,+ and a `git-annex-webapp.command` file in the desktop. This is not tested+ yet.+* Made the webapp display alerts when the inotify/kqueue layer has a+ warning message.+* Handle any crashes of each of the 15 or so named threads by displaying+ an alert. (Of course, this should never happen.)
@@ -0,0 +1,50 @@+Started reading about ZeroMQ with the hope that it could do some firewall+traversal thing, to connect mutually-unroutable nodes. Well, it could, but+it'd need a proxy to run on a server both can contact, and lots of+users won't have a server to run that on. The XMPP approach used by+dvcs-autosync is looking like the likeliest way for git-annex to handle+that use case.++However, ZeroMQ did point in promising directions to handle another use+case I need to support: Local [[pairing]]. In fairly short order, I got+ZeroMQ working over IP Multicast (PGM), with multiple publishers sending+messages that were all seen by multiple clients on the LAN (actually the+WAN; works over OpenVPN too). I had been thinking about using+Avahi/ZeroConf for discovery of systems to pair with, but ZeroMQ is rather+more portable and easy to work with.++Unfortunatly, I wasn't able to get ZeroMQ to behave reliably enough.+It seems to have some timeout issues the way I'm trying to use it,+or perhaps its haskell bindings are buggy? Anyway, it's really overkill+to use PGM when all I need for git-annex pairing discovery is lossy+UDP Multicast. Haskell has a simple `network-multicast` library for that,+and it works great.++With discovery out of the way (theoretically), the hard part about+[[pairing]] is going to be verifying that the desired repository is being+paired with, and not some imposter. My plan to deal with this involves a+shared secret, that can be communicated out of band, and HMAC. The webapp+will prompt both parties to enter the same agreed upon secret (which could+be any phrase, ideally with 64 bytes of entropy), and will then use it as+the key for HMAC on the ssh public key. The digest will be sent over the+wire, along with the ssh public key, and the other side can use the shared+secret to verifiy the key is correct.++The other hard part about [[pairing]] will be finding the best address to+use for git, etc to connect to the other host. If MDNS is available, it's+ideal, but if not the pair may have to rely on local DNS, or even+hard-coded IPs, which will be much less robust. Or, the assistant could+broadcast queries for a peer's current IP address itself, as a poor man's+MDNS.++All right then! That looks like a good week's worth of work to embark on.++---++Slight detour to package the haskell network-multicast library and upload+to Debian unstable.++Roughed out a data type that models the whole pairing conversation,+and can be serialized to implement it. And a state machine to run+that conversation. Not yet hooked up to any transport such as multicast+UDP.
@@ -0,0 +1,16 @@+About half way done with implementing [[pairing]]. The webapp's interface+to prompt for a secret and start pairing is done; the protocol is+implemented; broadcasting of pairing requests is working; added Yet Another+Thread to listen for incoming pairing traffic.++Very happy with how this came together; starting with defining the protocol+with data types let me rapidly iterate until I had designed a simple, clean,+robust protocol. The implementation works well too; it's even possible to+start pairing, and only then bring up the network interface to the machine+you intended to pair with, and it'll detect the new interface and start+sending requests to it.++Next, I need to make alerts have a button that performs a stored+IO action. So that the incoming pair request alert can have a button to+respond to the pair request. And then I need to write the code to actually+perform the pairing, including ssh key setup.
@@ -0,0 +1,21 @@+Alerts can now have buttons, that go to some url when clicked. Yay.++Implementing that was a PITA, because Yesod really only wants its type-safe+urls to be rendered from within its Handler monad. Which most things that+create alerts are not. I managed to work around Yesod's insistence on this+only by using a MVar to store the pure function that Yesod uses internally.+That function can only be obtained once the webapp is running.++----++Fixed a nasty bug where using gpg would cause hangs. I introduced this back+when I was reworking all the code in git-annex that runs processes, so it+would work with threading. In the process a place that had forked a process+to feed input to gpg was lost. Fixed it by spawning a thread to feed gpg.+Luckily I have never released a version of git-annex with that bug, but+the many users who are building from the master branch should update.++----++Made alerts be displayed while pairing is going on, with buttons to cancel+pairing or respond to a pairing request.
@@ -0,0 +1,8 @@+Worked on [[pairing]] all day. It's complicated and I was close to being in+the weeds at times. I think it probably works now, but I have not tested it+at all. Tomorrow, testing, and cleaning up known problems.++----++Also ordered 1.5 terabytes of USB keys and a thousand git-annex stickers+today.
@@ -0,0 +1,33 @@+Tons of pairing work, which culminated today in pairing fully working for+the very first time. And it works great! Type something like "my+hovercraft is full of eels" into two git annex webapps on the same LAN+and the two will find each other, automatically set up ssh keys, and sync+up, like magic. Magic based on math.++* Revert changes made to `authorized_keys` when the user cancels+ a pairing response. Which could happen if the machine that sent the+ pairing request originally is no longer on the network.+* Some fixes to handle lossy UDP better. Particularly tricky at the end+ of the conversation -- how do both sides reliably know when a+ conversation is over when it's over a lossy wire? My solution is just+ to remember some conversatons we think are over, and keep saying+ "this conversation is over" if we see messages in that conversation.+ Works.+* Added a UUID that must be the same in related pairing messages.+ This has a nice security feature: It allows detection of brute-force+ attacks to guess the shared secret, after the first wrong guess! + In which case the pairing is canceled and a warning printed.+* That led to a thorough security overview, which I've added to+ the [[pairing]] page. Added some guards against unusual attacks,+ like console poisioning attacks. I feel happy with the security+ of pairing now, with the caveats that only I have reviewed it (and+ reviewing your own security designs is never ideal), and that the+ out-of-band shared secret communication between users is only as good+ as they make it.+* Found [a bug](https://github.com/yesodweb/yesod/issues/421) + in Yesod's type safe urls. At least, I think it's a bug. Worked around it.+* Got very stuck trying to close the sockets that are opened to send+ multicast pairing messages. Nothing works, down to and including calling+ C `close()`. At the moment I have a socket leak. :(+ I need to understand the details of multicast sockets better to fix this.+ Emailed the author of the library I'm using for help.
@@ -0,0 +1,45 @@+Kickstarter is over. Yay!++Today I worked on the bug where `git annex watch` turned regular files+that were already checked into git into symlinks. So I made it check+if a file is already in git before trying to add it to the annex.++The tricky part was doing this check quickly. Unless I want to write my+own git index parser (or use one from Hackage), this check requires running+`git ls-files`, once per file to be added. That won't fly if a huge+tree of files is being moved or unpacked into the watched directory.++Instead, I made it only do the check during `git annex watch`'s initial+scan of the tree. This should be OK, because once it's running, you+won't be adding new files to git anyway, since it'll automatically annex+new files. This is good enough for now, but there are at least two problems+with it:++* Someone might `git merge` in a branch that has some regular files,+ and it would add the merged in files to the annex.+* Once `git annex watch` is running, if you modify a file that was+ checked into git as a regular file, the new version will be added+ to the annex.++I'll probably come back to this issue, and may well find myself directly+querying git's index.++---++I've started work to fix the memory leak I see when running `git annex+watch` in a large repository (40 thousand files). As always with a Haskell+memory leak, I crack open [Real World Haskell's chapter on profiling](http://book.realworldhaskell.org/read/profiling-and-optimization.html).++Eventually this yields a nice graph of the problem:++[[!img profile.png alt="memory profile"]]++So, looks like a few minor memory leaks, and one huge leak. Stared+at this for a while and trying a few things, and got a much better result:++[[!img profile2.png alt="memory profile"]]++I may come back later and try to improve this further, but it's not bad memory+usage. But, it's still rather slow to start up in such a large repository,+and its initial scan is still doing too much work. I need to optimize+more..
binary file changed (absent → 47098 bytes)
binary file changed (absent → 230937 bytes)
@@ -0,0 +1,14 @@+I've changed the default backend used by git-annex from SHA256 to SHA256E.+Including the filename extension in the key is known to make repositories+more usable on things like MP3 players, and I've recently learned it also+avoids [[forum/Weird_behavior_with_OS_X_Finder_and_Preview.app]]. ++I thought about only changing the default in repositories set up by the+assistant, but it seemed simpler to change the main default. The old+backend is really only better if you might have multiple copies of files+with the same content that have different extensions.++Fixed the socket leak in pairing that eluded me earlier.++I've made a new [[polls]] page, and posted a poll:+[[polls/prioritizing_special_remotes]]
@@ -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,26 @@+Started today doing testing of [[syncing]], and found some bugs and things+it needs to do better. But was quickly sidetracked when I noticed that+`transferkey` was making a commit to the git-annex branch for every file it+transferred, which is too slow and bloats history too much.++To fix that actually involved fixing a long-standing annoyance; that+read-only git-annex commands like `whereis` sometimes start off with+"(Recording state in git)", when the journal contains some not yet+committed changes to the git-annex branch. I had to carefully think+through the cases to avoid those commits.++As I was working on that, I found a real nasty lurking bug in the git-annex+branch handling. It's unlikely to happen unless `annex.autocommit=false` is+set, but it could occur when two git-annex processes race one another just+right too. The root of the bug is that `git cat-file --batch` does not+always show changes made to the index after it started. I think it does+in enough cases to have tricked me before, but in general it can't be+trusted to report the current state of the index, but only some past state.++I was able to fix the bug, by ensuring that changes being made to the+branch are always visible in either the journal or the branch -- never in+the index alone.++----++Hopefully something less low-level tomorrow..!
@@ -0,0 +1,73 @@+Syncing works well when the graph of repositories is strongly connected.+Now I'm working on making it work reliably with less connected graphs.++I've been focusing on and testing a doubly-connected list of repositories,+such as: `A <-> B <-> C`++----++I was seeing a lot of git-annex branch push failures occuring in+this line of repositories topology. Sometimes was is able to recover from+these, but when two repositories were trying to push to one-another at the+same time, and both failed, both would pull and merge, which actually keeps+the git-annex branch still diverged. (The two merge commits differ.)++A large part of the problem was that it pushed directly into the git-annex+branch on the remote; the same branch the remote modifies. I changed it to+push to `synced/git-annex` on the remote, which avoids most push failures.+Only when A and C are both trying to push into `B/synced/git-annex` at the+same time would one fail, and need to pull, merge, and retry.++-----++With that change, git syncing always succeeded in my tests, and without+needing any retries. But with more complex sets of repositories, or more+traffic, it could still fail.++I want to avoid repeated retries, exponential backoffs, and that kind of+thing. It'd probably be good enough, but I'm not happy with it because+it could take arbitrarily long to get git in sync.++I've settled on letting it retry once to push to the synced/git-annex+and synced/master branches. If the retry fails, it enters a fallback mode,+which is guaranteed to succeed, as long as the remote is accessible.++The problem with the fallback mode is it uses really ugly branch names.+Which is why Joachim Breitner and I originally decided on making `git annex+sync` use the single `synced/master` branch, despite the potential for+failed syncs. But in the assistant, the requirements are different,+and I'm ok with the uglier names.++It does seem to make sense to only use the uglier names as a fallback,+rather than by default. This preserves compatability with `git annex sync`,+and it allows the assistant to delete fallback sync branches after it's+merged them, so the ugliness is temporary.++---++Also worked some today on a bug that prevents C from receiving files+added to A.++The problem is that file contents and git metadata sync independantly. So C+will probably receive the git metadata from B before B has finished+downloading the file from A. C would normally queue a download of the+content when it sees the file appear, but at this point it has nowhere to+get it from.++My first stab at this was a failure. I made each download of a file result+in uploads of the file being queued to every remote that doesn't have it+yet. So rather than C downloading from B, B uploads to C. Which works fine,+but then C sees this download from B has finished, and proceeds to try to+re-upload to B. Which rejects it, but notices that this download has+finished, so re-uploads it to C...++The problem with that approach is that I don't have an event when a download+succeeds, just an event when a download ends. Of course, C could skip+uploading back to the same place it just downloaded from, but loops are+still possible with other network topologies (ie, if D is connected to both+B and C, there would be an upload loop 'B -> C -> D -> B`). So unless I can+find a better event to hook into, this idea is doomed.++I do have another idea to fix the same problem. C could certianly remember+that it saw a file and didn't know where to get the content from, and then+when it receives a git push of a git-annex branch, try again.
@@ -0,0 +1,33 @@+Implemented deferred downloads. So my example from yesterday of three+repositories in a line keep fully in sync now!++I punted on one problem while doing it. It might be possible to get a really+big list of deferred downloads in some situation. That all lives in memory.+I aim for git-annex to always have a constant upper bound on memory use,+so that's not really acceptable. I have TODOed a reminder to do something+about limiting the size of this list.++----++I also ran into a nasty crash while implementing this, where two threads+were trying to do things to git HEAD at the same time, and so one crashed,+and in a way I don't entirely understand, that crash took down another+thread with a BlockedIndefinitelyOnSTM exception. I think I've fixed+this, but it's bothersome that this is the second time that modifications+to the Merger thread have led to a concurrency related crash that I+have not fully understood. ++My guess is that STM can get confused when it's+retrying, and the thread that was preventing it from completing a+transaction crashes, because it suddenly does not see any other+references to the TVar(s) involved in the transaction. Any GHC STM gurus+out there?++---++Still work to be done on making data transfers to keep fully in sync in all+circumstances. One case I've realized needs work occurs when a USB drive is+plugged in. Files are downloaded from it to keep the repo in sync, but the+repo neglects to queue uploads of those files it just got out to other+repositories it's in contact with. Seems I still need to do something to+detecting when a successful download is done, and queue uploads.
@@ -0,0 +1,17 @@+Turns out I was able to easily avoid the potential upload loops that would+occur if each time a repo receives a download, it queues uploads to the+repos it's connected to. With that done. I suspect, but have not proven,+that the assistant is able to keep repos arranged in any shape of graph in+sync, as long as it's connected (of course) and each connection is+bi-directional. That's a good start .. or at least a nice improvement from+only strongly connected graphs being kept in sync.++Eliminated some empty commits that would be made sometimes, which is a nice+optimisation.++------++I wanted to get back to some UI work after this week's deep dive into the+internals. So I filled in a missing piece, the repository switcher in the+upper right corner. Now the webapp's UI allows setting up different+repositories for different purposes, and switching between them.
@@ -0,0 +1,33 @@+Putting together a shortlist of things I want to sort out before the beta.++* [[Progress bars|progressbars]] for file uploads.+* No mocked up parts in the webapp's UI. Think I implemented the last of+ those yesterday, although there are some unlinked repository configuration+ options.+* The basic watching functionality, should work reliably.+ There are some known scalability issues with eg,+ [[kqueue on OSX|bugs/Issue_on_OSX_with_some_system_limits]] that+ need to be dealt with, but needn't block a beta.+* Should keep any configuration of repositories that can be set up using+ the webapp in sync whenever it's possible to do so. I think that'll work+ after the past few days work.+* Should be easy to install and get running. Of course part of the point+ of the beta release is to get it out there, on Hackage, in Debian+ unstable, and in the other places that git-annex packagers put it.+ As to getting it running, the autostart files and menu items look good+ on Linux. The OSX equivilants still need work and testing.+* No howlingly bad bugs. [[This bug|bugs/pasting_into_annex_on_OSX]] is+ the one I'm most concerned with currently. OTOH, + [[bugs/watcher_commits_unlocked_files]] can be listed in the errata.++----++So I worked on progress bars for uploads today. Wrote a nice little+parser for rsync's progress output, that parses arbitrary size chunks,+returning any unparsable part. Added a ProgressCallback parameter to+all the backends' upload methods. Wrote a nasty thing that intercepts+rsync's output, currently a character at a time (horrible, but rsync+doesn't output that much, so surprisingly acceptable), and outputs it and+parses it. Hooked all this up, and got it working for uploads to+git remotes. That's 1/10th of the total ways uploads can happen that+have working progress bars. It'll take a while to fill in the rest..
@@ -0,0 +1,28 @@+Worked more on upload progress tracking. I'm fairly happy with its state+now:++* It's fully implemented for rsync special remotes.++* Git remotes also fully support it, with the+ notable exception of file uploads run by `git-annex-shell recvkey`. That+ runs `rsync --server --sender`, and in that mode, rsync refuses to output+ progress info. Not sure what to do about this case. Maybe I should+ write a parser for the rsync wire protocol that can tell what chunk of the+ file is being sent, and shim it in front of the rsync server? That's+ rather hardcore, but it seems the best of a bad grab bag of options that+ include things like `LD_PRELOAD` hacks.++* Also optimised the rsync progress bar reader to read whole+ chunks of data rather than one byte at a time.++* Also got progress bars to actually update in the webapp for uploads.++ This turned out to be tricky because kqueue cannot be used to detect when+ existing files have been modified. (One of kqueue's worst shortcomings vs+ inotify.) Currently on kqueue systems it has to poll.++I will probably upload add progress tracking to the directory special remote,+which should be very easy (it already implements its own progress bars),+and leave the other special remotes for later. I can add upload progress+tracking to each special remote when I add support for configuring it in+the webapp.
@@ -0,0 +1,18 @@+Short day today, but I again worked only on progress bars.++* Added upload progress tracking for the directory special remote.+* Some optimisations.+* Added a `git annex-shell transferkey` command. This isn't used yet,+ but the plan is to use it to feed back information about how much+ of a file has been sent when downloading it. So that the uploader+ can display a progress bar. This method avoids needing to parse the rsync+ protocol, which is approximately impossible without copying half of rsync.+ Happily, git-annex's automatic ssh connection caching will make the small+ amount of data this needs to send be efficiently pipelined over the same+ ssh connection that rsync is using.++I probably have less than 10 lines of code to write to finish up+[[progressbars]] for now. Looking forward to getting that behind me, and on+to something more interesting. Even doing mail merge to print labels to+mail out Kickstarter rewards is more interesting than progress bars at this+point. :)
@@ -0,0 +1,24 @@+Finally wrapped up progress bars; upload progress is now reported in all+situations. ++After all that, I was pleased to find a use for the progress info, beyond+displaying it to the user. Now the assistant uses it to decide whether it+makes sense to immediately retry a failed transfer. This should make it+work nicely, or at least better, with flaky network or drives.++The webapp crashed on startup when there was no `~/.gitconfig`.+Guess all of us who have tried it so far are actual git users,+but I'm glad I caught this before releasing the beta.++Jimmy Tang kindly took on making a OS X .app directory for git-annex.+So it now has an icon that will launch the webapp. +[[!img /assistant/osx-app.png]]++I'm getting lots of contributors to git-annex all of a sudden. I've had 3+patches this weekend, and 2 of them have been to Haskell code.+Justin Azoff is working on [[todo/incremental_fsck]], and Robie Basak+has [gotten Amazon Glacier working](https://github.com/basak/glacier-cli)+using the hook special remote.++Started doing some design for [[transfer_control]]. I will start+work on this after releasing the first beta.
@@ -0,0 +1,67 @@+Since last post, I've worked on speeding up `git annex watch`'s startup time+in a large repository.++The problem was that its initial scan was naively staging every symlink in+the repository, even though most of them are, presumably, staged correctly+already. This was done in case the user copied or moved some symlinks+around while `git annex watch` was not running -- we want to notice and+commit such changes at startup.++Since I already had the `stat` info for the symlink, it can look at the+`ctime` to see if the symlink was made recently, and only stage it if so.+This sped up startup in my big repo from longer than I cared to wait (10++minutes, or half an hour while profiling) to a minute or so. Of course,+inotify events are already serviced during startup, so making it scan+quickly is really only important so people don't think it's a resource hog.+First impressions are important. :)++But what does "made recently" mean exactly? Well, my answer is possibly+over engineered, but most of it is really groundwork for things I'll need+later anyway. I added a new data structure for tracking the status of the+daemon, which is periodically written to disk by another thread (thread #6!)+to `.git/annex/daemon.status` Currently it looks like this; I anticipate+adding lots more info as I move into the [[syncing]] stage:++ lastRunning:1339610482.47928s+ scanComplete:True++So, only symlinks made after the daemon was last running need to be+expensively staged on startup. Although, as RichiH pointed out,+this fails if the clock is changed. But I have been planning to have a+cleanup thread anyway, that will handle this, and other+potential problems, so I think that's ok.++Stracing its startup scan, it's fairly tight now. There are some repeated +`getcwd` syscalls that could be optimised out for a minor speedup.++----++Added the sanity check thread. Thread #7! It currently only does one sanity+check per day, but the sanity check is a fairly lightweight job,+so I may make it run more frequently. OTOH, it may never ever find a+problem, so once per day seems a good compromise. ++Currently it's only checking that all files in the tree are properly staged+in git. I might make it `git annex fsck` later, but fscking the whole tree+once per day is a bit much. Perhaps it should only fsck a few files per+day? TBD++Currently any problems found in the sanity check are just fixed and logged.+It would be good to do something about getting problems that might indicate+bugs fed back to me, in a privacy-respecting way. TBD++----++I also refactored the code, which was getting far too large to all be in+one module. ++I have been thinking about renaming `git annex watch` to `git annex assistant`,+but I think I'll leave the command name as-is. Some users might+want a simple watcher and stager, without the assistant's other features+like syncing and the webapp. So the next stage of the+[[roadmap|design/assistant]] will be a different command that also runs+`watch`.++At this point, I feel I'm done with the first phase of [[inotify]].+It has a couple known bugs, but it's ready for brave beta testers to try.+I trust it enough to be running it on my live data.
@@ -0,0 +1,16 @@+Just released git-annex 3.20120924, which includes beta versions of+the assistant and webapp. Read the [[/assistant/errata]], then give it a+try!++I've uploaded it to Haskell's cabal, and to Debian unstable, and hope my+helpers for other distributions will update them soon. (Although the+additional dependencies to build the webapp may take a while on some.)+I also hope something can be done to make a prebuilt version available on+OSX soonish.++I've decided to license the webapp under the+[AGPL](http://www.gnu.org/licenses/agpl-3.0.html). This should not impact+normal users of it, and git-annex can be built without the webapp as a pure+GPL licensed program. This is just insurance to prevent someone turning the+webapp into a propritary web-only service, by requiring that anyone who+does so provide the source of the webapp.
@@ -0,0 +1,7 @@+Mostly took a break from working on the assistant today. Instead worked+on adding incremental fsck to git-annex. Well, that will be something+that assistant will use, eventually, probably.++Jimmy and I have been working on a self-contained OSX app for using the+assistant, that doesn't depend on installing git, etc. More on that+once we have something that works.
@@ -0,0 +1,23 @@+Amazon S3 was the second most popular choice in the+[[polls/prioritizing_special_remotes]] poll, and since I'm not sure how+I want to support phone/mp3 players, I did it first.++So I added a configurator today to easily set up an Amazon S3 repository.+That was straightforward and didn't take long since git-annex already+supported S3.++The hard part, of course, is key distribution. Since the webapp so far+can only configure the shared encryption method, and not fullblown gpg keys,+I didn't feel it would be secure to store the S3 keys in the git repository.+Anyone with access to that git repo would have full access to S3 ... just not+acceptable. Instead, the webapp stores the keys in a 600 mode file locally,+and they're not distributed at all.++When the same S3 repository is enabled on another computer, it prompts for+keys then too. I did add a hint about using the IAM Management Console in+this case -- it should be possible to set up users in IAM who can only+access a single bucket, although I have not tried to set that up.++---++Also, more work on the standalone OSX app.
@@ -0,0 +1,23 @@+Various bug fixes, and work on the OSX app today:++* Avoid crashing when ssh-keygen fails due to not being able to parse+ `authorized_keys`.. seems a lot of people have crufty unparsable+ `authorized_keys` files.+* On OSX, for some reason the webapp was failing to start sometimes due+ to bind failing with EINVAL. I don't understand why, as that should+ only happen if the socket is already bound, which it should not as+ it's just been created. I was able to work around this by retrying+ with a new socket when bind fails.+* When setting up `authorized_keys` to let `git-annex-shell` be run,+ it had been inserting a perl oneliner into it. I changed that+ to instead call a `~/.ssh/git-annex-shell` wrapper script that it sets+ up. The benefits are it no longer needs perl, and it's less ugly,+ and the standalone OSX app can modify the wrapper script to point to+ wherever it's installed today (people like to move these things around I+ guess).+* Made the standalone OSX app set up autostarting when it's first run.+* Spent rather a long time collecting the licenses of all the software that+ will be bundled with the standalone OSX app. Ended up with a file+ containing 3954 lines of legalese. Happily, all the software appears+ redistributable, and free software; even the couple of OSX system libraries+ we're bundling are licensed under the APSL.
@@ -0,0 +1,34 @@+I hear that people want the git-annex assistant to be easy to install+without messing about building it from source..++## on OSX++So Jimmy and I have been working all week on making an easily installed OSX+app of the assistant. This is a .dmz file that bundles all the dependencies+(git, etc) in, so it can be installed with one click.++It seems to basically work. You can get it [[here|install/OSX]].++Unfortunatly, the [[bugs/pasting_into_annex_on_OSX]] bug resurfaced while+testing this.. So I can't really recommend using it on real data yet.++Still, any testing you can do is gonna be really helpful. I'm squashing OSX+bugs right and left.++## on Linux++First of all, the git-annex assistant is now available in Debian unstable,+and in Arch Linux's AUR. Proper packages.++For all the other Linux distributions, I have a workaround. It's+a big hack, but it seems to work.. at least on Debian stable.++I've just put up a [[install/linux_standalone]] tarball, which has **no+library dependencies** apart from glibc, and doesn't even need git to be+installed on your system.++## on FreeBSD++The FreeBSD port has been updated to include the git-annex assistant too..++[[!meta title="day 94 easy install"]]
@@ -0,0 +1,21 @@+Spent a lot of time this weekend thinking about/stuck on the [[cloud]]+notification problem. Currently IRC is looking like the best way for+repositories to notify one-another when changes are made, but I'm not sure+about using that, and not ready to start on it.++Instead, laid some groundwork for [[transfer_control]] today. Added +some simple commands to manage groups of repositories, and find files+that are present in repositories in a group. I'm not completely happy+with the syntax for that, and need to think up some good syntax to specify+files that are present in *all* repositories in a group.++The plan is to have the assistant automatically guess at groups to put new+repositories it makes in (it should be able to make good guesses),+as well as have an interface to change them, and an interface to configure+transfer control using these groups (and other ways of matching files).+And, probably, some canned transfer control recipes for common setups.++---++Collected up the past week's work and made a release today. I'm probably+back to making regular releases every week or two.
@@ -0,0 +1,24 @@+Today I revisited something from way back in [[day_7__bugfixes]].+Back then, it wasn't practical to run `git ls-files` on every+file the watcher noticed, to check if it was already in git. Revisiting+this, I found I could efficiently do that check at the same point it checks+`lsof`. When there's a lot of files being added, they're batched up at that+point, so it won't be calling `git ls-files` repeatedly.++Result: It's safe to mix use of the assistant with files stored in git+in the normal way. And it's safe to mix use of `git annex unlock` with+the assistant; it won't immediately re-lock files. Yay!++----++Also fixed a crash in the committer, and made `git annex status` display+repository groups.++----++Been thinking through where to store the [[transfer_control]] expressions.+Since repositories need to know about the transfer controls of other+remotes, storing them in `.git/config` isn't right. I thought it might be+nice to configure the expressions in `.gitattributes`, but it seems the+file format doesn't allow complicated multi-word attributes. Instead,+they'll be stored in the git-annex branch.
@@ -0,0 +1,14 @@+Not a lot of programming today; I spent most of the day stuffing hundreds+of envelopes for this Kickstarter thing you may have heard of. Some post+office is going to be very surprised with all the international mail soon.++----++That said, I did write 184 lines of code. (Actually rather a lot, but it+was mostly pure functional code, so easy to write.) That+pops up your text editor on a file with the the trust and group+configurations of repositories, that's stored in the git-annex branch.+Handy for both viewing that stuff all in one place, and changing it.++The real reason for doing that is to provide a nice interface for editing+transfer control expressions, which I'll be adding next.
@@ -0,0 +1,44 @@+Started implementing [[transfer_control]]. Although I'm currently calling+the configuration for it "preferred content expressions". (What a mouthful!)++I was mostly able to reuse the Limit code (used to handle parameters like+--not --in otherrepo), so it can already build Matchers for preferred content+expressions in my little Domain Specific Language.++Preferred content expressions can be edited with `git annex vicfg`, which+checks that they parse properly. ++The plan is that the first place to use them is not going to be inside the+assistant, but in commands that use the `--auto` parameter, which will use+them as an additional constraint, in addition to the numcopies setting+already used. Once I get it working there, I'll add it to the assistant.++Let's say a repo has a preferred content setting of+"(not copies=trusted:2) and (not in=usbdrive)"++* `git annex get --auto` will get files that have less than 2 trusted+ copies, and are not in the usb drive.+* `git annex drop --auto` will drop files that have 2 or more trusted+ copies, and are not in the usb drive (assuming numcopies allows dropping+ them of course).+* `git annex copy --auto --to thatrepo` run from another repo+ will only copy files that have less than 2 trusted copies. (And if that+ was run on the usb drive, it'd never copy anything!)++There is a complication here.. What if the repo with that preferred content+setting is itself trusted? Then when it gets a file, its number of+trusted copies increases, which will make it be dropped again. :-/++This is a nuance that the numcopies code already deals with, but it's+much harder to deal with it in these complicated expressions. I need to think+about this; the three ideas I'm working on are:++1. Leave it to whoever/whatever writes these expressions to write ones+ that avoid such problems. Which is ok if I'm the only one writing+ pre-canned ones, in practice..+2. Transform expressions into ones that avoid such problems. (For example,+ replace "not copies=trusted:2" with "not (copies=trusted:2 or (in=here and+ trusted=here and copies=trusted:3))"+3. Have some of the commands (mostly drop I think) pretend the drop+ has already happened, and check if it'd then want to get the file back+ again.
@@ -0,0 +1,70 @@+Fixed the assistant to wait on all the zombie processes that would sometimes+pile up. I didn't realize this was as bad as it was.++Zombies and git-annex have been a problem since I started developing it,+because back then I made some rather poor choices, due to barely knowing+how to write Haskell. So parts of the code that stream input from git commands+don't clean up after them properly. Not normally a problem, because+git-annex reaps the zombies after each file it processes. But this reaping+is not thread-safe; it cannot be used in the assistant.++If I were starting git-annex today, I'd use one of the new Haskell things like+Conduits, that allow for very clean control over finalization of resources.+But switching it to Conduits now would probably take weeks of work; I've not+yet felt it was worthwhile. (Also it's not clear Conduits are the last,+best thing.)++For now, it keeps track of the pids it needs to wait on, and all the code+run by the assistant is zombie-free. However, some code for fsck and unused+that I anticipate the assistant using eventually still has some lurking+zombies.++----++Solved the issue with preferred content expressions and dropping that+I mentioned yesterday. My solution was to add a parameter to specify a set+of repositories where content should be assumed not to be present. When+deciding whether to drop, it can put the current repository in, and then+if the expression fails to match, the content can be dropped.++Using yesterday's example "(not copies=trusted:2) and (not in=usbdrive)",+when the local repo is one of the 2 trusted copies, the drop check will+see only 1 trusted copy, so the expression matches, and so the content will+not be dropped.++I've not tested my solution, but it type checks. :P I'll wire it up to+`get/drop/move --auto` tomorrow and see how it performs.++----++Would preferred content expressions be more readble if they were inverted+(becoming content filtering expressions)?++1. "(not copies=trusted:2) and (not in=usbdrive)" becomes+ "copies=trusted:2 or in=usbdrive"+2. "smallerthan=10mb and include=*.mp3 and exclude=junk/*" becomes+ "largerthan=10mb or exclude=*.mp3" or include=junk/*"+3. "(not group=archival) and (not copies=archival:1)" becomes+ "group=archival or copies=archival:1"++1 and 3 are improved, but 2, less so. It's a trifle weird for "include"+to mean "include in excluded content".++The other reason not to do this is that currently the expressions+can be fed into `git annex find` on the command line, and it'll come+back with the files that would be kept.++Perhaps a middle groud is to make "dontwant" be an alias for "not".+Then we can write "dontwant (copies=trusted:2 or in=usbdrive)"++----++A user told me this:++> I can confirm that the assistant does what it is supposed to do really well. I+> just hooked up my notebook to the network and it starts syncing from notebook to+> fileserver and the assistant on the fileserver also immediately starts syncing+> to the [..] backup++That makes me happy, it's the first quite so real-world success report I've+heard.
@@ -0,0 +1,30 @@+ git merge watch_++My cursor has been mentally poised here all day, but I've been reluctant to+merge watch into master. It seems solid, but is it correct? I was able to+think up a lot of races it'd be subject to, and deal with them, but did I+find them all?++Perhaps I need to do some automated fuzz testing to reassure myself.+I looked into using [genbackupdata](http://liw.fi/genbackupdata/) to that+end. It's not quite what I need, but could be+[moved in that direction](http://bugs.debian.org/677542). Or I could write+my own fuzz tester, but it seems better to use someone else's, because +a) laziness and b) they're less likely to have the same blind spots I do.++My reluctance to merge isn't helped by the known bugs with files that are+either already open before `git annex watch` starts, or are opened by two+processes at once, and confuse it into annexing the still-open file when one+process closes it.++I've been thinking about just running `lsof` on every file as it's being+annexed to check for that, but in the end, `lsof` is too slow. Since its+check involves trawling through all of /proc, it takes it a good half a+second to check a file, and adding 25 seconds to the time it takes to+process 100 files is just not acceptable.++But an option that could work is to run `lsof` after a bunch of new files+have been annexed. It can check a lot of files nearly as fast as a single+one. In the rare case that an annexed file is indeed still open, it could+be moved back out of the annex. Then when its remaining writer finally+closes it, another inotify event would re-annex it.
@@ -0,0 +1,7 @@+To avoid leaking even the size of your encrypted files to cloud storage+providers, add a mode that stores fixed size chunks.++May be a useful starting point for [[deltas]].++May also allow for downloading different chunks of a file concurrently from+multiple remotes.
@@ -0,0 +1,45 @@+The [[syncing]] design assumes the network is connected. But it's often+not in these pre-IPV6 days, so the cloud needs to be used to bridge between+LANS.++## The cloud notification problem (**done**)++Alice and Bob have repos, and there is a cloud remote they both share.+Alice adds a file; the assistant transfers it to the cloud remote.+How does Bob find out about it?++There are two parts to this problem. Bob needs to find out that there's+been a change to Alice's git repo. Then he needs to pull from Alice's git repo,+or some other repo in the cloud she pushed to. Once both steps are done,+the assistant will transfer the file from the cloud to Bob.++* dvcs-autosync uses xmppp; all repos need to have the same xmpp account+ configured, and send self-messages. An alternative would be to have+ different accounts that join a channel or message each other. Still needs+ account configuration.+* irc could be used. With a default irc network, and an agreed-upon channel,+ no configuration should be needed. IRC might be harder to get through+ some firewalls, and is prone to netsplits, etc. IRC networks have reasons+ to be wary of bots using them. Only basic notifications could be done over+ irc, as it has little security.+* When there's a ssh server involved, code could be run on it to notify+ logged-in clients. But this is not a general solution to this problem.+* pubsubhubbub does not seem like an option; its hubs want to pull down+ a feed over http.++See [[xmpp]] for design of git-annex's use of xmpp for push notifications.++## storing git repos in the cloud **done for XMPP**++Of course, one option is to just use github etc to store the git repo.++Two things can store git repos in Amazon S3:+* <http://gabrito.com/post/storing-git-repositories-in-amazon-s3-for-high-availability>+* <http://wiki.cs.pdx.edu/oss2009/index/projects/gits3.html>++Another option is to not store the git repo in the cloud, but push/pull+peer-to-peer. When peers cannot directly talk to one-another, this could be+bounced through something like XMPP. This is **done** for [[xmpp]]!++Another option: Use <https://github.com/blake2-ppc/git-remote-gcrypt> to store+git repo encrypted on cloud storage.
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="http://www.klomp.eu/"+ ip="95.91.241.82"+ subject="Watch also possible with git?"+ date="2012-06-15T17:25:30Z"+ content="""+Hi,++it seems that you put a lot of efforts in handling race conditions. Thats great. I wonder if the watch can also be used with git (i.e. changes are commited into git and not as annex)? I know that other projects follow this idea but why using different tools if the git-annex assistant could handle both...+"""]]
@@ -0,0 +1,12 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawneJXwhacIb0YvvdYFxhlNVpz6Wpg6V7AA"+ nickname="Shayne"+ subject="comment 11"+ date="2012-08-13T00:37:35Z"+ content="""+Yeah definately go with homebrew rather than macports if possible. macports and fink, whilst great systems, have a tendency to sort of create their own alternative-dimension of files within the system that just dont always feel particularly well integrated. As a result \"brew\" has become increasingly more popular to the point its almost ubuquitous now.++Plus its brew-doctor thing is awesome. ++The best approach though thats agnostic to distro systems is to simply go for a generic installer.+"""]]
@@ -0,0 +1,13 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawlu-fdXIt_RF9ggvg4zP0yBbtjWQwHAMS4"+ nickname="Jörn"+ subject="Multiple annexes?"+ date="2012-09-20T16:10:29Z"+ content="""+Thank you for this great piece of software which is now becoming even better with the assistant.++Just one question: will one instance of the assistant be able to track multiple git annex repositories each building up their own network of annexes OR would I need to run multiple instances of the assistant?++Thanks,+Jörn+"""]]
@@ -0,0 +1,7 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ subject="comment 13"+ date="2012-09-20T16:21:11Z"+ content="""+@Jörn, two days ago I added support in the webapp for multiple independent repositories. So you can create independent repos using it, and switch between them from a menu. Under the hood there are multiple git-annex assistant daemons running, but this is an implementation detail; it's not like these use any more memory or other resources than would a single daemon that managed multiple repositories.+"""]]
@@ -0,0 +1,11 @@+[[!comment format=mdwn+ username="https://id.koumbit.net/anarcat"+ subject="you rock! & roadmap update?"+ date="2012-09-21T04:25:58Z"+ content="""+joey, you rock. I just want to push on that point - it doesn't seem like there's that many tools that do what git-annex is trying to do out there, and you seem to be doing an incredible job at doing it, so this is great, keep going!++i was wondering - i am glad to see the progress, but it is unclear to me where you actually are in the roadmap. are things going according to plan? are we at month 3? 4? or 1-4? :) just little updates on that roadmap section above would be quite useful!++thanks again!+"""]]
@@ -0,0 +1,9 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ subject="comment 15"+ date="2012-09-21T05:25:53Z"+ content="""+We're on month 4 of work, and most of months 1-3 is done well enough for a first pass. Very little of what's listed in month 4 has happened yet, due to my being maybe 2 weeks behind schedule, but bits of [[cloud]] are being planned.++I've made a small adjustment, I think it'll make sense to spend a month on user-driven features before getting into Android.+"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="https://launchpad.net/~gdr-go2"+ nickname="gdr-go2"+ subject="Maybe a DEB?2"+ date="2012-09-27T09:44:14Z"+ content="""+Month 3 was all about easy setup, so I kind of expected to download a deb package and just install it, not to download a whole bunch of haskell libraries. Is there a chance that you will release some packages?+"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="4.153.14.141"+ subject="comment 17"+ date="2012-09-27T18:44:11Z"+ content="""+@gdr A package with the assistant is available in Debian unstable.+"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawm7AuSfii_tCkLyspL6Mr0ATlO6OxLNYOo"+ nickname="Georg"+ subject="for OSX, package managers (homebrew and macports) are really second-class"+ date="2013-07-24T07:24:49Z"+ content="""+at least with regards to wide spread use. I agree with Wichert, the average OSX user won't use them. I myself would go with homebrew (because it is far less of a pain than macports), but actually static built binaries that are just dragged from a DMG to your programs folder is the way to go if you can't go osx app store. It's just how most Apple users are wired. PKG would be fine, too, since most will know them, but those are really only needed if you need to place stuff in /Library/Frameworks or things like that. If it can be done as a all-inclusive OSX .app, do it that way and just pack it up in a .DMG.+"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawlnoH5btjn_BLib3_IhES5uMhrzuOiwCYo"+ nickname="András"+ subject="windows port"+ date="2013-07-25T07:50:19Z"+ content="""+I'd love to use the Windows port of the assistant by Christmas. Keep up the good work! :)+"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawkSq2FDpK2n66QRUxtqqdbyDuwgbQmUWus"+ nickname="Jimmy"+ subject="comment 1"+ date="2012-06-02T12:06:37Z"+ content="""+Will statically linked binaries be provided for say Linux, OSX and *BSD? I think having some statically linked binaries will certainly help and appeal to a lot of users.+"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="2001:4978:f:21a::2"+ subject="comment 20"+ date="2013-07-25T18:22:51Z"+ content="""+@Georg, DMG have been built for OSX for a long time. See [[install/OSX]]+"""]]
@@ -0,0 +1,7 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ subject="comment 2"+ date="2012-06-04T19:45:00Z"+ content="""+Jimmy, I hope to make it as easy as possible to install. I've been focusing on getting it directly into popular Linux distributions, rather than shipping my own binary. The OSX binary is static, and while I lack a OSX machine, I would like to get it easier to distribute to OSX users.+"""]]
@@ -0,0 +1,9 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawkSq2FDpK2n66QRUxtqqdbyDuwgbQmUWus"+ nickname="Jimmy"+ subject="comment 3"+ date="2012-06-07T20:22:55Z"+ content="""+I'd agree getting it into the main distros is the way to go, if you need OSX binaries, I could volunteer to setup an autobuilder to generate binaries for OSX users, however it would rely on users to have macports with the correct ports installed to use it (things like coreutils etc...)++"""]]
@@ -0,0 +1,9 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ subject="comment 4"+ date="2012-06-08T01:56:52Z"+ content="""+I always appreciate your OSX work Jimmy...++Could it be put into macports?+"""]]
@@ -0,0 +1,12 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawkSq2FDpK2n66QRUxtqqdbyDuwgbQmUWus"+ nickname="Jimmy"+ subject="comment 5"+ date="2012-06-08T07:22:34Z"+ content="""+In relation to macports, I often found that haskell in macports are often behind other distros, and I'm not willing to put much effort into maintaining or updating those ports. I found that to build git-annex, installing macports manually and then installing haskell-platform from the upstream to be the best way to get the most up to date dependancies for git-annex.++fyi in macports ghc is at version 6.10.4 and haskell platform is at version 2009.2, so there are a significant number of ports to update.++I was thinking about this a bit more and I reckon it might be easier to try and build a self contained .pkg package and have all the needed binaries in a .app styled package, that would work well when the webapp comes along. I will take a look at it in a week or two (currently moving house so I dont have much time)+"""]]
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawkSq2FDpK2n66QRUxtqqdbyDuwgbQmUWus"+ nickname="Jimmy"+ subject="comment 6"+ date="2012-06-08T15:21:18Z"+ content="""+It's not much for now... but see <http://www.sgenomics.org/~jtang/gitbuilder-git-annex-x00-x86_64-apple-darwin10.8.0/> I'm ignoring the debian-stable and pristine-tar branches for now, as I am just building and testing on osx 10.7.++Hope the autobuilder will help you develop the OSX side of things without having direct access to an osx machine! I will try and get gitbuilder to spit out appropriately named tarballs of the compiled binaries in a few days when I have more time.+"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="4.153.8.126"+ subject="comment 7"+ date="2012-06-09T18:07:51Z"+ content="""+Thanks, that's already been useful to me. You might as well skip the debian-specific \"bpo\" tags too.+"""]]
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawldKnauegZulM7X6JoHJs7Gd5PnDjcgx-E"+ nickname="Matt"+ subject="Homebrew instead of MacPorts"+ date="2012-06-22T04:26:02Z"+ content="""+[Homebrew] is a much better package manager than MacPorts IMO.++[Homebrew]: http://mxcl.github.com/homebrew/+"""]]
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="http://wiggy.net/"+ nickname="Wichert"+ subject="macports"+ date="2012-06-12T13:00:34Z"+ content="""+The average OSX user has a) no idea what macports is, and b) will not be able to install it. Anything that requires a user to do anything with a commandline (or really anything other than using a GUI installer) is effectively a dealbreaker. For our use cases OSX is definitely a requirement, but it must only use standard OSX installation methods in order to be usable. Being in the appstore would be ideal, but standard dmg/pkg installers are still common enough that they are also acceptable.++FWIW this is the same reason many git GUIs were not usable for our OSX users: they required separate installation of the git commandline tools.+"""]]
@@ -0,0 +1,20 @@+Add to the [[webapp]] some configuration of git-annex.++There are some basic settings that pass through to `git config`, things+like how much disk space to leave free, how many copies to ensure are kept+of files, etc.++The meat of the configuration will be in configuration assistants that walk+through setting up common use cases.++* Create a repository (run when the web app is started without a configured+ repository too). **done**+* Clone this repo to a USB drive or other removable drive. **done**+* Make a bare repo on a remote ssh server **done**+* Clone this repo to another host. (Needs [[pairing]]) **done**+* Set up Amazon S3. **done**+* Set up encrypted rsync remote. **done**+* Rsync.net special case **done**+* Set up gpg encryption key; gpg key distribution.+* I lost my USB drive!+* etc -- many more possibilities
@@ -0,0 +1,9 @@+Speed up syncing of modified versions of existing files. ++One simple way is to find the key of the old version of a file that's+being transferred, so it can be used as the basis for rsync, or any+other similar transfer protocol.++For remotes that don't use rsync, a poor man's version could be had by+chunking each object into multiple parts. Only modified parts need be+transferred. Sort of sub-keys to the main key being stored.
@@ -0,0 +1,145 @@+While dropbox allows modifying files in the folder, git-annex freezes+them upon creation, using symlinks.++This is a core design simplification of git-annex.+But it is problematic too:++* To allow directly editing files in its folder, something like [[todo/smudge]] is+ needed, to get rid of the symlinks that stand in for the files.+* OSX seems to have a [[lot_of_problems|bugs/OSX_alias_permissions_and_versions_problem]]+ with stupid programs that follow symlinks and present the git-annex+ hash filename to the user.+* FAT sucks and doesn't support symlinks at all, so [[Android]] can't+ have regular repos on it.++One approach for this would be to hide the git repo away somewhere,+and have the git-annex assistant watch a regular directory, with+regular files.++There would have to be a mapping from files to git-annex objects.+And some intelligent way to determine when a file has been changed+and no longer corresponds to its object. (Not expensive hashing every time,+plz.)++Since this leaves every file open to modification, any such repository+probably needs to be considered untrusted by git-annex. So it doesn't+leave its only copy of a file in such a repository, but instead+syncs it to a proper git-annex repository.++The assistant would make git commits still, of symlinks. It can already do+that with without actual symlinks existing on disk. More difficult is+handling merging; git merge wants a real repository with files it can+really operate on. The assistant would need to calculate merges on its own,+and update the regular directory to reflect changes made in the merge.++Another massive problem with this idea is that it doesn't allow for+[[partial_content]]. The symlinks that everyone loves to hate on are what+make it possible for the contents of some files to not be present on+disk, while the files are still in git and can be retreived as desired.+With real files, some other standin for a missing file would be needed.+Perhaps a 0 length, unreadable, unwritable file? On systems that+support symlinks it could be a broken symlink like is used now, that+is converted to a real file when it becomes present.++## concrete design++* Enable with annex.direct+* Use .git/ for the git repo, but `.git/annex/objects` won't be used+ for object storage.+* `git status` and similar will show all files as type changed, and+ `git commit` would be a very bad idea. Just don't support users running+ git commands that affect the repository in this mode. Probably.+* However, `git status` and similar also will show deleted and new files,+ which will be helpful for the assistant to use when starting up.+* Cache the mtime, size etc of files, and use this to detect when they've been+ modified when the assistant was not running. This would only need to be+ checked at startup, probably.+* Use dangling symlinks for standins for missing content, as now.+ This allows just cloning one of these repositories normally, and then+ as the files are synced in, they become real files.+* Maintain a local mapping from keys to files in the tree. This is needed+ when sending/receiving/dropping keys to know what file to access.+ Note that a key can map to multiple files. And that when a file is+ deleted or moved, the mapping needs to be updated.+* May need a reverse mapping, from files in the tree to keys? TBD+ (Currently, getting by looking up symlinks using `git cat-file`)+ (Needed to make things like `git annex drop` that want to map from the+ file back to the key work.)+* The existing watch code detects when a file gets closed, and in this+ mode, it could be a new file, or a modified file, or an unchanged file.+ For a modified file, can compare mtime, size, etc, to see if it needs+ to be re-added.+* The inotify/kqueue interface does not tell us when a file is renamed.+ So a rename has to be treated as a delete and an add, so can have a lot+ of overhead, to re-hash the file.+* Note that this could be used without the assistant, as a git remote+ that content is transferred to and from. Without the assistant, changes+ to files in this remote would not be noticed and committed, unless+ a git-annex command were added to do so.+ Getting it basically working as a remote would be a good 1st step.+* It could also be used without the assistant as a repository that+ the user uses directly. Would need some git-annex commands+ to merge changes into the repo, update caches, and commit changes.+ This could all be done by "git annex sync".++## TODO++* kqueue does not deliver an event when an existing file is modified.+ This doesn't affect OSX, which uses FSEvents now, but it makes direct+ mode assistant not 100% on other BSD's.++## done++* `git annex sync` updates the key to files mappings for files changed,+ but needs much other work to handle direct mode:+ * Generate git commit, without running `git commit`, because it will+ want to stage the full files. **done**+ * Update location logs for any files deleted by a commit. **done**+ * Generate a git merge, without running `git merge` (or possibly running+ it in a scratch repo?), because it will stumble over the direct files.+ **done**+ * Drop contents of files deleted by a merge (including updating the+ location log), or if we cannot drop,+ move their contents to `.git/annex/objects/`. **no** .. instead, + avoid ever losing file contents in a direct mode merge. If the file is+ deleted, its content is moved back to .git/annex/objects, if necessary.+ * When a merge adds a symlink pointing at a key that is present in the+ repo, replace the symlink with the direct file (either moving out+ of `.git/annex/objects/` or hard-linking if the same key is present+ elsewhere in the tree. **done**+ * handle merge conflicts on direct mode files **done**+* support direct mode in the assistant (many little fixes)++* Deal with files changing as they're being transferred from a direct mode+ repository to another git repository. The remote repo currently will + accept the bad data and update the location log to say it has the key.++ This affects both special remotes and git remotes. ++ For special remotes,+ it seems the best that could be done is to have an error unwind action+ passed to `sendAnnex` that is called if the file is modified as it's+ transferred. That would then remove the probably corrupted file from the+ remote. (The full transfer would still run, unless there was also a way+ to cancel an in progress transfer.) **done**++ (With the above, there is some potential for the bad content being+ downloaded from the special remote into another repo. This would only+ happen if the other repo for some reason thinks the special remote + has the content. Since the location log would not be updated until the+ transfer is successful, this should not happen.)++ For local git remotes, need to check the direct mode file after it's+ copied and before it's put into place as a key's content. **done**+ (untested)++ `git-annex-shell sendkey` needs to do something if it sent bad+ data. This seems to not need protocol changes; it can just detect + the problem and exit nonzero. Would need to do something to clean up+ the temp file, which is probably corrupt. (Could in future use it as a+ basis for transferring the new key..) **done**++ For git remotes, added a flag to `git-annex-shell recvkey` (using a field+ after the "--" to remain back-compat). With this flag, after receiving+ the data, the remote fscks the data. This is not optimal, but avoids+ needing another round-trip, or a protocol change.
@@ -0,0 +1,176 @@+The assistant should help the user recover their repository when things go+wrong.++[[!toc ]]++## dangling lock files++There are a few ways a git repository can get broken that are easily fixed.+One is left over index.lck files. When a commit to a repository fails,+check that nothing else is using it, fix the problem, and redo the commit.++* **done** for .git/annex/index.lock, can be handled safely and automatically.+* **done** for .git/index.lock, only when the assistant is starting up.+* What about local remotes, eg removable drives? git-annex does attempt+ to commit to the git-annex branch of those. It will use the automatic+ fix if any are dangling. It does not commit to the master branch; indeed+ a removable drive typically has a bare repository. So I think nothing to+ do here.+* What about git-annex-shell? If the ssh remote has the assistant running,+ it can take care of it, and if not, it's a server, and perhaps the user+ should be required to fix up if it crashes during a commit. This should+ not affect the assistant anyway.+* **done** Seems that refs can also have stale lock files, for example+ '/storage/emulated/legacy/DCIM/.git/refs/remotes/flick_phonecamera/synced/git-annex.lock'+ All git lock files are now handled (except gc lock files).++## incremental fsck++Add webapp UI to enable incremental fsck **done**++Of course, incremental fsck will run as an niced (and ioniced) background+job. There will need to be a button in the webapp to stop it, in case it's+annoying. **done**++When fsck finds a damanged file, queue a download of the file from a+remote. **done**++Detect when a removable drive is connected in the Cronner, and check+and try to run its remote fsck jobs. **done** (Same mechanism will work for+network remotes becoming connected.)++TODO: If no accessible remote has a file that fsck reported missing,+prompt the user to eg, connect a drive containing it. Or perhaps this is a+special case of a general problem, and the webapp should prompt the user+when any desired file is available on a remote that's not mounted?++## git-annex-shell remote fsck++TODO: git-annex-shell fsck support, which would allow cheap fast fscks+of ssh remotes.++Would be nice; otherwise remote fsck is too expensive (downloads+everything) to have the assistant do.++Note that Remote.Git already tries to use this, but the assistant does not+call it for non-local remotes.++## git fsck and repair++Add git fsck to scheduled self fsck **done**++TODO: Add git fsck of local remotes to scheduled remote fscks.++TODO: git fsck on ssh remotes? Probably not worth the complexity..++TODO: If committing to the repository fails, after resolving any dangling+lock files (see above), it should git fsck.++If git fsck finds problems, launch git repository repair. **done**++git annex fsck --fast at end of repository repair to ensure+git-annex branch is accurate. **done**++TODO: along with displaying alert when there is a problem detected+by consistency check, send an email alert. (Using system MTA?)++## nudge user to schedule fscks++Make the webapp encourage users to schedule fscks of their+local repositories. The goal here was that it should not be obnoxious about+repeatedly pestering the user to set that up, but should still encourage+anyone who cares to set it up.++Maybe: Display a message only once per week, and only after the repository+has existed for at least one full day. But, this will require storing+quite a lot of state.++Or: Display a message whenever a removable drive is detected to have been+connected. I like this, but what about nudging the main repo? Could do it+every webapp startup, perhaps?++There should be a "No thanks" button that prevents it nudging again for a+repo.++## git repository repair++There are several ways git repositories can get damanged. ++The most common is empty files in .git/annex/objects and commits that refer+to those objects. When the objects have not yet been pushed anywhere.+I've several times recovered from this manually by+removing the bad files and resetting to before the commits that referred to+them. Then re-staging any divergence in the working tree. This could+perhaps be automated.++As long as the git repository has at least one remote, another method is to+clone the remote, sync from all other remotes, move over .git/config and+.git/annex/objects, and tar up the old broken git repo and `git annex add`+it. This should be automatable and get the user back on their feet. User+could just click a button and have this be done.++This is useful outside git-annex as well, so make it a+git-recover-repository command.++### detailed design++Run `git fsck` and parse output to find bad objects. **done** Note that+fsck may fall over and fail to print out all bad objects, when+files are corrupt. So if the fsck exits nonzero, need to collect all+bad objects it did find, and:++1. If the local repository contains packs, the packs may be corrupt.+ So, start by using `git unpack-objects` to unpack all+ packs it can handle (which may include parts of corrupt packs) + back to loose objects. And delete all packs. **done**+2. Delete all loose corrupt objects. **done**++Repeat until fsck finds no new problems. **done**++Check if there's a remote. If so, and if the bad objects are all+present on it, can simply get all bad objects from the remote,+and inject them back into .git/objects to recover:++3. Make a new (bare) clone from the remote.+ (Note: git does not seem to provide a way to fetch specific missing+ objects from the remote. Also, cannot use `--reference` against+ a repository with missing refs. So this seems unavoidably+ network-expensive.) **done**+5. Rsync objects over. (Turned out to work better than git-cat-file, + because we don't have to walk the graph to add missing objects.)+ **done**+6. If each bad object was able to be repaired this way, we're done!+ (If not, can reuse the clone for getting objects from the next remote.)+ **done**++If some missing objects cannot be recovered from remotes, find commits in each+local branch that are broken by all remaining missing objects. Some of this can+be parsed from git fsck output, but for eg blobs, the commits need to+be walked to walk the trees, to find trees that refer to the blobs. **done**++For each branch that is affected, look in the reflog and/or `git log+$branch` to find the last good commit that predates all broken commits. (If+the head commit of a branch is broken, git log is not going to show+anything useful, but the reflog can be used to find past refs for the+branch -- have to first delete the .git/HEAD file if it points to the+broken ref.) **done**++The basic idea then is to reset the branch to the last good commit+that was found for it.++* For the HEAD branch, can just reset it. (If no last good commit was found+ for the HEAD branch, reset it to a dummy empty commit.) This will+ leave git showing any changes made since then as staged in the index and+ uncommitted. Or if the index is missing/corrupt, any files in the tree will+ show as modified and uncommitted. User (or git-annex assistant) can then+ commit as appropriate. Print appropriate warning message. **done**+* Special handling for git-annex branch and index. **done**+* Remote tracking branches can just be removed, and then `git fetch`+ from the remote, which will re-download missing objects from it and+ reinstate the tracking branch. **done**+* For other branches, reset them to last good commit, or delete+ if none was found. **done**+* (Decided not to touch tags.)++The index file can still refer to objects that were missing.+Rewrite to remove them. **done**
@@ -0,0 +1,22 @@+Encrypted git remotes are now possible +using [git-remote-gcrypt](https://github.com/blake2-ppc/git-remote-gcrypt).++There are at least two use cases for this in the assistant:++* Storing an encrypted git repository on a local drive. **done**+* Or on a remote server. This could even allow using github. But more+ likely would be a shell server that has git-annex-shell on it so can+ also store file contents, and which is not trusted with unencrypted data.+ **done**++git-remote-gcrypt is already usable with git-annex. What's needed is+to make sure it's installed (ie, get it packaged into distros or embedded+into git-annex), and make it easy to set up from the webapp. **done**++Hmm, this will need gpg key creation, so would also be a good opportunity+to make the webapp allow using that for special remotes too.++One change is needed in git-annex core.. It currently does not support+storing encrypted files on git remotes, only on special remotes. Perhaps+the way to deal with this is to make it consider git-remote-grypt remotes+to be a special remote type? **done**
@@ -0,0 +1,37 @@+Currently the assistant sets up a shared encryption key, which is checked+into git, so anyone who gets the repository can decrypt files that are+stored encrypted on special remotes.++To support using gpg keys in the assistant, we need some things:++1. Help user set up a gpg key if they don't have one. This could be a+ special-purpose key dedicated to being used by git-annex. It might be+ nice to leave the user with a securely set up general purpose key,+ but that would certianly preclude prompting for its password in the+ webapp. Indeed, the password prompt is the main problem here.+ Best solution would be to get gpg agent working on all supported + platforms.++ Update: For now, git-annex only assists in generating gpg keys that are+ intended to only be used to encrypt a repo.++2. After generating a gpg key, back it up. It might be the only way+ some data is accessible.++ One way I'm considering is generating a QR code+ of the key, which could be printed to paper. Preliminary results+ are good; a 4096 bit secret key fits in a QR code (a secret key+ with many subkeys may not). Debian has command-line utilities that+ can generate and read such a QR code.++3. Help user learn the gpg keys of people they want to share their repo+ with, and give them access. If the public key was recorded in the git-annex+ branch, this could be easily determined when sharing repositories with+ friends. Or, use MonkeySphere, or Monkeysign..++-----++Another gpg key security thing is that currently git-annex stores+crypto creds in memory while it's running. Should use locked memory. See+<https://github.com/vincenthz/hs-securemem> and+<https://github.com/vincenthz/hs-securemem/issues/1>
@@ -0,0 +1,196 @@+"git annex watch" command, which runs, in the background, watching via+inotify for changes, and automatically annexing new files, etc. Now+available!++[[!toc]]++## known bugs++* Kqueue has to open every directory it watches, so too many directories+ will run it out of the max number of open files (typically 1024), and fail.+ I may need to fork off multiple watcher processes to handle this.+ See [[bug|bugs/Issue_on_OSX_with_some_system_limits]]. (Does not affect+ OSX any longer, only other BSDs).++## todo++* There needs to be a way for a new version of git-annex, when installed,+ to restart any running watch or assistant daemons. Or for the daemons+ to somehow detect it's been upgraded and restart themselves. Needed+ to allow for incompatable changes and, I suppose, for security upgrades..++## beyond Linux++I'd also like to support OSX and if possible the BSDs.++* kqueue ([haskell bindings](http://hackage.haskell.org/package/kqueue))+ is supported by FreeBSD, OSX, and other BSDs.++ In kqueue, to watch for changes to a file, you have to have an open file+ descriptor to the file. This wouldn't scale. ++ Apparently, a directory can be watched, and events are generated when+ files are added/removed from it. You then have to scan to find which+ files changed. [example](https://developer.apple.com/library/mac/#samplecode/FileNotification/Listings/Main_c.html#//apple_ref/doc/uid/DTS10003143-Main_c-DontLinkElementID_3)++ Gamin does the best it can with just kqueue, supplimented by polling.+ The source file `server/gam_kqueue.c` makes for interesting reading.+ Using gamin to do the heavy lifting is one option. + ([haskell bindings](http://hackage.haskell.org/package/hlibfam) for FAM;+ gamin shares the API)++ kqueue does not seem to provide a way to tell when a file gets closed,+ only when it's initially created. Poses problems..++ * [man page](http://www.freebsd.org/cgi/man.cgi?query=kqueue&apropos=0&sektion=0&format=html)+ * <https://github.com/gorakhargosh/watchdog/blob/master/src/watchdog/observers/kqueue.py> (good example program)++ *kqueue is now supported*++* hfsevents ([haskell bindings](http://hackage.haskell.org/package/hfsevents))+ is OSX specific.++ Originally it was only directory level, and you were only told a+ directory had changed and not which file. Based on the haskell+ binding's code, from OSX 10.7.0, file level events were added.++ This will be harder for me to develop for, since I don't have access to+ OSX machines..++ hfsevents does not seem to provide a way to tell when a file gets closed,+ only when it's initially created. Poses problems..++ * <https://developer.apple.com/library/mac/#documentation/Darwin/Conceptual/FSEvents_ProgGuide/Introduction/Introduction.html>+ * <http://pypi.python.org/pypi/MacFSEvents/0.2.8> (good example program)+ * <https://github.com/gorakhargosh/watchdog/blob/master/src/watchdog/observers/fsevents.py> (good example program)++* Windows has a Win32 ReadDirectoryChangesW, and perhaps other things.++## the races++Many races need to be dealt with by this code. Here are some of them.++* File is added and then removed before the add event starts.++ Not a problem; The add event does nothing since the file is not present.++* File is added and then removed before the add event has finished+ processing it.+ + **Minor problem**; When the add's processing of the file (checksum and so+ on) fails due to it going away, there is an ugly error message, but+ things are otherwise ok.++* File is added and then replaced with another file before the annex add+ moves its content into the annex.++ Fixed this problem; Now it hard links the file to a temp directory and+ operates on the hard link, which is also made unwritable.++* File is added and then replaced with another file before the annex add+ makes its symlink.++ **Minor problem**; The annex add will fail creating its symlink since+ the file exists. There is an ugly error message, but the second add+ event will add the new file.++* File is added and then replaced with another file before the annex add+ stages the symlink in git.++ Now fixed; `git annex watch` avoids running `git add` because of this+ race. Instead, it stages symlinks directly into the index, without+ looking at what's currently on disk.++* Link is moved, fixed link is written by fix event, but then that is+ removed by the user and replaced with a file before the event finishes.++ Now fixed; same fix as previous race above.++* File is removed and then re-added before the removal event starts.++ Not a problem; The removal event does nothing since the file exists,+ and the add event replaces it in git with the new one.++* File is removed and then re-added before the removal event finishes.++ Not a problem; The removal event removes the old file from the index, and+ the add event adds the new one.++* Symlink appears, but is then deleted before it can be processed.++ Leads to an ugly message, otherwise no problem:++ ./me: readSymbolicLink: does not exist (No such file or directory)++ Here `me` is a file that was in a conflicted merge, which got+ removed as part of the resolution. This is probably coming from the watcher+ thread, which sees the newly added symlink (created by the git merge),+ but finds it deleted (by the conflict resolver) by the time it processes it.++## done++- on startup, add any files that have appeared since last run **done**+- on startup, fix the symlinks for any renamed links **done**+- on startup, stage any files that have been deleted since last run+ (seems to require a `git commit -a` on startup, or at least a+ `git add --update`, which will notice deleted files) **done**+- notice new files, and git annex add **done**+- notice renamed files, auto-fix the symlink, and stage the new file location+ **done**+- handle cases where directories are moved outside the repo, and stop+ watching them **done**+- when a whole directory is deleted or moved, stage removal of its+ contents from the index **done**+- notice deleted files and stage the deletion+ (tricky; there's a race with add since it replaces the file with a symlink..)+ **done**+- Gracefully handle when the default limit of 8192 inotified directories+ is exceeded. This can be tuned by root, so help the user fix it.+ **done**+- periodically auto-commit staged changes (avoid autocommitting when+ lots of changes are coming in) **done**+- coleasce related add/rm events for speed and less disk IO **done**+- don't annex `.gitignore` and `.gitattributes` files **done**+- run as a daemon **done**+- A process has a file open for write, another one closes it,+ and so it's added. Then the first process modifies it.++ Or, a process has a file open for write when `git annex watch` starts+ up, it will be added to the annex. If the process later continues+ writing, it will change content in the annex.++ This changes content in the annex, and fsck will later catch+ the inconsistency.++ Possible fixes: ++ * Somehow track or detect if a file is open for write by any processes.+ `lsof` could be used, although it would be a little slow.++ Here's one way to avoid the slowdown: When a file is being added,+ set it read-only, and hard-link it into a quarantine directory,+ remembering both filenames.+ Then use the batch change mode code to detect batch adds and bundle+ them together.+ Just before committing, lsof the quarantine directory. Any files in+ it that are still open for write can just have their write bit turned+ back on and be deleted from quarantine, to be handled when their writer+ closes. Files that pass quarantine get added as usual. This avoids+ repeated lsof calls slowing down adds, but does add a constant factor+ overhead (0.25 seconds lsof call) before any add gets committed. **done**++ * Or, when possible, making a copy on write copy before adding the file+ would avoid this.+ * Or, as a last resort, make an expensive copy of the file and add that.+ * Tracking file opens and closes with inotify could tell if any other+ processes have the file open. But there are problems.. It doesn't+ seem to differentiate between files opened for read and for write.+ And there would still be a race after the last close and before it's+ injected into the annex, where it could be opened for write again.+ Would need to detect that and undo the annex injection or something.++- If a file is checked into git as a normal file and gets modified+ (or merged, etc), it will be converted into an annexed file.+ See [[blog/day_7__bugfixes]]. **done**; we always check ls-files now+- When you `git annex unlock` a file, it will immediately be re-locked.+ See [[bugs/watcher_commits_unlocked_files]]. Seems fixed now?
@@ -0,0 +1,17 @@+Things that don't fit anywhere else:++* Automatically start daemon on boot or when user logs in, using+ freedesktop autostart file. **done**+* Somehow get content that is unavailable. This is problematic with inotify,+ since we only get an event once the user has tried (and failed) to read+ from the file. This is only needed if all the files in the directory + are not kept synced, but in some situations (ie, low disk space phones),+ that is likely.+* Drop files that have not been used lately, or meet some other criteria+ (as long as there's a copy elsewhere). **done** (via preferred content;+ eg archive directories)+* Perhaps automatically dropunused files that have been deleted,+ although I cannot see a way to do that, since by the time the inotify+ deletion event arrives, the file is deleted, and we cannot see what+ its symlink pointed to! Alternatively, perhaps automatically+ do an expensive unused/dropunused cleanup process.
@@ -0,0 +1,24 @@+Git-annex already supports storing large files in +several cloud providers via [[special_remotes]].+More should be added, such as:++* Google drive (attractive because it's free, only 5 gb tho)+* Owncloud (has several [providers](http://owncloud.org/providers/);+ at least one provides 5 gb free; open DAV based API)+* OpenStack Swift (teh future)+* Box.com (it's free, and current method is hard to set up and a sorta+ shakey; a better method would be to use its API) **done**+* Dropbox? That would be ironic.. Via its API, presumably.+* [[Amazon Glacier|todo/special_remote_for_amazon_glacier]] **done**+* Internet Archive **done**+* [nimbus.io](https://nimbus.io/) Fairly low prices ($0.06/GB);+ REST API; free software+* Mediafire provides 50gb free and has a REST API.+* Flickr provides 1 tb (!!!!) to free accounts, and can store at least+ photos and videos. <https://github.com/ricardobeat/filr> is a hack+ to allow storing any type of file on Flickr.+* mega.co.nz. Already supported via [[tips/megaannex]], would just need+ webapp modifications to configure it. May want to use megaannex as-is to+ build a non-hook special remote in haskell.++See poll at [[polls/prioritizing_special_remotes]].
@@ -0,0 +1,83 @@+For git-annex to be able to clone its repo to another host, it'd be good to+have some way of pairing devices.++## security++Pairing uses its own network protocol, built on top of multicast UDP.++It's important that pairing securely verifies that the right host is being+paired with. This is accomplied by having a shared secret be entered on+both the hosts that will be paired. Hopefully that secret is communicated+securely out of band. ++(In practice, the security of that communication will vary. To guard against+interception, each pairing session pairs exactly two hosts and then forgets+the shared secret. So an attacker who tries to reuse an intercepted secret+will not succeed in pairing. This does not guard against an intercepted+secret that is used before the legitimate parties finish pairing.)++Each host can construct messages that the other host can verify using the+shared secret, and so know that, for example, the ssh public key it+received belongs to the right host and has not been altered by a man in the+middle.++The verification works like this: Take a HMAC SHA1 checksum of the message,+using the shared secret as the HMAC key. Include this checksum after the+message. The other host can then do the same calculation and verify the+checksum.++Additionally, a UUID is included in the message. Messages that are part of+the same pairing session all share a UUID. And all such messages should+be verifiable as described above. If a message has the same UUID but is+not verifiable, then someone on the network is up to no good. Perhaps+they are trying to brute-force the shared secret. When this is detected,+the pairing session is shut down. (Which would still let an attacker+DOS pairing, but that's not a very interesting attack.)++The protocol used for pairing consists of 3 messages, a PairReq, and+PairAck, and a PairDone. Let's consider what an attacker could accomplish+by replaying these:++* PairReq: This would make the webapp pop up an alert about an incoming+ pair request. If the user thought it was real and for some reason+ entered the right shared secret used in the real one earlier, the+ ssh key inside the PairReq would be added to `authorized_keys`. Which+ allows the host that originally sent the PairReq to access its git+ repository, but doesn't seem to do the attacker any good.+* PairAck: If the host that originally sent+ the PairReq is still pairing, it'll add the ssh key from the PairAck,+ and start syncing, which again does the attacker no good.+* PairDone: If the host that sent the PairAck is still syncing, it'll+ add the ssh key from the PairDone, and start syncing, and stop+ sending PairAcks. But probably, it's not syncing, because it would have+ seen the original PairDone.. and anyway, this seems to do the attacker no+ good.++So replay attacks don't seem to be a problem.++So far I've considered security from a third-party attacker, but either the+first or second parties in pairing could also be attackers. Presumably they+trust each other with access to their files as mediated by+[[git-annex-shell]]. However, one could try to get shell access to the+other's computer by sending malicious data in a pairing message. So the+pairing code always checks every data field's content, for example the ssh+public key is rejected if it looks at all unusual. Any control characters+in the pairing message cause it to be rejected, to guard against console+poisoning attacks. Furthermore, git-annex is careful not to expose data to+the shell, and the webapp uses Yesod's type safety to ensure all user input+is escaped before going to the browser.++## TODO++* pairing over IPV6 only networks does not work. Haskell's+ `network-multicast` library complains "inet_addr: Malformed address: ff02::1"+ .. seems it just doesn't support IPv6. The pairing code in git-annex+ does support ipv6, apart from this, it's just broadcasting the messages+ that fails. (Pairing over mixed networks is fine.)+* If there are three assistants on the network, and 2 pair, the third is+ left displaying a "Pair request from foo" alert, until it's close. + Or, if the user clicks the button to pair, it'll get to the + "Pairing in progress" alert, which will show forever (until canceled).++ It should be possible for third parties to tell when pairing is done,+ but it's actually rather hard since they don't necessarily share the secret.
@@ -0,0 +1,36 @@+On a regular system, a reasonable simplifying assumption is that all the+files in the folder will be synced to the system. A user might want to+disable syncing of some subdirectories, for eg, archived files. But in+general, things are simpler to understand and implement if all files sync.++But, an Android gadget probably cannot hold all a user's files. Indeed,+it's likely that old files will be aggressively dropped from the Android+after syncing to elsewhere, in order to keep enough free space on it for+new files. ++There needs to be a way for the user to browse files not on the gadget and+request they be transferred to it. This could be done as a browser in the+web app, or using a subdirectory full of placeholder files (not symlinks;+see [[Android]]) that start transfer of the real file when accessed.++----++Currently, Android uses the "source" repository type in some+configurations. This makes files be removed as soon as they are sent+somewhere else.++A compromise that avoids needing UI might be to change "source" so it+retained files for a while after they were created, even after they were+uploaded elsewhere. For example, it could hold onto them for a day. This+would allow the user time to do things with new files before they are+removed from the android device.++One way to implement that would be a new preferred content expression like+"age(1 day)". But this would need at least a daily full transfer scan to be+run. ++Another way would be to have a way to make drops of files be deferred+for a period of time. This approach would not need to be specific to the+"source" repository type. And seems easy enough to do, just have a+configuration setting for the time interval, and an ordered drop queue+and a thread that waits as needed before dropping.
@@ -0,0 +1,1 @@+[[!inline pages="(page(design/assistant/blog/*) and tagged(design/assistant/polls)) or page(design/assistant/polls/*)" show=0]]
@@ -0,0 +1,18 @@+Help me choose a goal for the month of December. The last poll showed +a lot of interest in using the git-annex assistant with phones, etc.++Background: git-annex uses symbolic links in its repositories. This makes it+hard to use with filesystems, such as FAT, that do not support symbolic links.+FAT filesystems are the main storage available on some Android devices that+have a micro-SD card. Other, newer Android devices don't have a SD card and so+avoid this problem.++I can either work on the idea described in+[[design/assistant/desymlink]], which could solve the symlink problem and+also could lead to a nicer workflow to editing files that are stored in+git-annex.++Or, I can work on [[Android_porting|design/assistant/android]], and try to+get the assistant working on Android's built-in storage.++[[!poll open=no 81 "solve the symlink problem first" 17 "port to Android first" 1 "other"]]
@@ -0,0 +1,7 @@+What directory should the Android webapp default to creating an annex in?++Same as the desktop webapp, users will be able to enter a directory they+want the first time they run it, but to save typing on android, anything+that gets enough votes will be included in a list of choices as well.++[[!poll open=yes expandable=yes 61 "/sdcard/annex" 6 "Whole /sdcard" 4 "DCIM directory (photos and videos only)" 1 "Same as for regular git-annex. ~/annex/"]]
@@ -0,0 +1,17 @@+What should I work on in April? I expect I could get perhaps two of these+features done in a month if I'm lucky. I have only 3 more funded months,+and parts of one will be spent working on porting to Windows, so choose wisely!+--[[Joey]]++[[!poll open=yes expandable=yes 4 "upload and download rate limiting" 15 "get webapp working on Android" 5 "deltas: speed up syncing modified versions of existing files" 8 "encrypted git remotes using git-remote-gcrypt" 0 "add support for more cloud storage remotes" 19 "don't work on features, work on making it easier to install and use" 2 "Handle duplicate files" 6 "direct mode (aka real files instead of symlinks) [already done --joey]" 3 "start windows port now"]]++References:++* [[rate_limiting]]+* [[Android]]+* [[deltas]] to speed up syncing modified files (at least for remotes using rsync)+* [[encrypted_git_remotes]]+* [[more_cloud_providers]] (OpenStack Swift, Owncloud, Google drive,+ Dropbox, Mediafire, nimbus.io, Mega, etc.)+* [[old poll on "what is preventing me from using git-annex assistant"|what_is_preventing_me_from_using_git-annex_assistant]]+ (many of the items on it should be fixed now, but I have plenty of bug reports to chew on still)
@@ -0,0 +1,16 @@+Background: git-annex supports storing data in various [[special remotes]].+The git-annex assistant will make it easy to configure these, and easy+configurators have already been built for a few: removable drives, rsync.net,+locally paired systems, and remote servers with rsync.++Help me prioritize my work: What special remote would you most like+to use with the git-annex assistant?++[[!poll open=yes 16 "Amazon S3 (done)" 12 "Amazon Glacier (done)" 9 "Box.com (done)" 71 "My phone (or MP3 player)" 23 "Tahoe-LAFS" 10 "OpenStack SWIFT" 31 "Google Drive"]]++This poll is ordered with the options I consider easiest to build+listed first. Mostly because git-annex already supports them and they+only need an easy configurator. The ones at the bottom are likely to need+significant work. See [[cloud]] for detailed discussion.++Have another idea? Absolutely need two or more? Post comments..
@@ -0,0 +1,43 @@+Currently, git-annex takes a very lazy approch to displaying+progress into. It just lets rsync or whatever display the progress+for it, in the terminal.++Something better is needed for the [[webapp]]. There needs to be a+way for the web app to know what the current progress is of all transfers.++This is one of those potentially hidden but time consuming problems.++## downloads++* Watch temp file as it's coming in and use its size.+ Can either poll every .5 seconds or so to check file size, or+ could use inotify. **done**+* When easily available, remotes call the MeterUpdate callback as downloads+ progress. **done**+* S3 TODO + While it has a download progress bar, `getObject` probably buffers the whole+ download in memory before returning. Leaving the progress bar to only+ display progress for writing the file out of memory. Fixing this would+ involve making hS3 stream better (also avoids it wasting memory).++## uploads++Each individual remote type needs to implement its own support for calling+the MeterUpdate callback as the upload progresses.++* git: **done**+* rsync: **done**+* directory: **done**+* web: Not applicable; does not upload +* webdav: **done**+* S3: **done**+* glacier: **done**+* bup: TODO+* hook: Would require the hook interface to somehow do this, which seems+ too complicated. So skipping.++## communication++It may be worth using a better communication channel than files on disk for+the transfer progress. Shared memory could be used, or http posts to the+webapp.
@@ -0,0 +1,57 @@+Webapp needs a simple speed control knob, especially to avoid saturating +bandwidth on uploads.++We have basic throttling support in git-annex for rsync,+but none for any special remotes. A good first step would be to expose+this in the webapp, and ensure that `git-annex-shell` also honors it when+sending/receiving data.++We actually need two speed controls, one for upload and one for download.++It is probably not necessary to throttle git push/pull operations, as the+data transfers tend to be small. Only throttling file transfers is+essential.++## possibility: trickle++Since `git-annex transferkeys` is a separate process, one easy option would+be to run it inside `trickle`. If the user changes the bandwidth limits,+it could kill the transfer and restart it with different trickle options.++Problem: Not all special remotes support resuming transfers, so this is+suboptimal. (So too are the pause/resume buttons, when using those+remotes!)++`trickle` is available for OSX as well as Linux and BSDs.+<http://hints.macworld.com/comment.php?mode=view&cid=65362>+<http://mac.softpedia.com/get/Network-Admin/Trickle.shtml>+It is probably not easily available for Android, as it uses `LD_PRELOAD`.++## possibility: built in IO limiting++A cleaner method would be to do the limiting inside git-annex. We already+have metered file IO. It should be possible to make the meter not only report+on the transfer speed, but detect when it's going too fast, and delay. This+will delay the file streaming through the special remote's transfer code,+so should work for a variety of special remotes. (Not for rsync or bup+or git-annex-shell though, so those need to be handled separately.)++Should work well for uploads at least. I don't know how well it would work+for throttling downloads; the sender may just keep sending data and the+data buffer before it gets to the IO meter. Maybe once the buffers fill the+OS would have the TCP throttled down. Needs investigation; trickle claims+to throttle downloads.++## communications channels++There would need to be a communication channel for the assistant to tell+`git annex transferkeys` when the rate limit has changed. It could for+example send it a SIGUSR1, and then leave it up to the process to reload+the git config. Inside the IO meter, we could have an MVar that contains+the current throttle value, so the IO meter could check it each time it's+called and adjust its throttling appropriately.++Ideally, the assistant could also communicate in the same way with+`git-annex-shell` to tell it when the limit has changed. Since+`git-annex-shell` uses rsync, it would need to abort the transfer, and rely+on the other side retrying to start it up with the new limit.
binary file changed (absent → 54347 bytes)
binary file changed (absent → 50730 bytes)
@@ -0,0 +1,12 @@+Currently the assistant sets up dedicated ssh keys, that can just use+git-annex. This is ok. The problem is that the initial 2 connections to the+ssh server when setting up these keys involve a password prompt, which is+done at the console unless the system happens to have a working ssh agent+that can pop up a dialog. That can be confusing.++It would be nice to have the webapp prompt for the password. Can it be done+securely?++This might come down to a simple change to the webapp to prompt for the+password, and then rather a lot of pain to make the webapp use HTTPS so we+can be pretty sure noone is sniffing the (localhost) connection.
@@ -0,0 +1,260 @@+Once files are added (or removed or moved), need to send those changes to+all the other git clones, at both the git level and the key/value level.++## efficiency++Currently after each file transfer (upload or download), a git sync is done+to all remotes. This is rather a lot of work, also it prevents collecting+presence changes to the git-annex branch into larger commits, which would+save disk space over time.++In many cases, this sync is necessary. For example, when a file is uploaded+to a transfer remote, the location change needs to be synced out so that+other clients know to grab it.++Or, when downloading a file from a drive, the sync lets other locally+paired repositories know we got it, so they can download it from us. +OTOH, this is also a case where a sync is sometimes unnecessary, since+if we're going to upload the file to them after getting it, the sync+only perhaps lets them start downloading it before our transfer queue+reaches a point where we'd upload it.++Do we need all the mapping stuff discussed below to know when we can avoid+syncs?++## TODO++* Test MountWatcher on LXDE.+* Add a hook, so when there's a change to sync, a program can be run+ and do its own signaling.+* --debug will show often unnecessary work being done. Optimise.+* Configurablity, including only enabling git syncing but not data transfer;+ only uploading new files but not downloading, and only downloading+ files in some directories and not others. See for use cases:+ [[forum/Wishlist:_options_for_syncing_meta-data_and_data]]+* speed up git syncing by using the cached ssh connection for it too+ Will need to use `GIT_SSH`, which needs to point to a command to run,+ not a shell command line. Beware that the network connection may have+ bounced and the cached ssh connection not be usable.+* Map the network of git repos, and use that map to calculate+ optimal transfers to keep the data in sync. Currently a naive flood fill+ is done instead. Maybe use XMPP as a side channel to learn about the+ network topology?+* Find a more efficient way for the TransferScanner to find the transfers+ that need to be done to sync with a remote. Currently it walks the git+ working copy and checks each file. That probably needs to be done once,+ but further calls to the TransferScanner could eg, look at the delta+ between the last scan and the current one in the git-annex branch.+* [[use multiple transfer slots|todo/Slow_transfer_for_a_lot_of_small_files.]]+* The TransferQueue's list of deferred downloads could theoretically+ grow without bounds in memory. Limit it to a given number of entries,+ and fall back to some other method -- either storing deferred downloads+ on disk, or perhaps scheduling a TransferScanner run to get back into sync.++## data syncing++There are two parts to data syncing. First, map the network and second,+decide what to sync when.++Mapping the network can reuse code in `git annex map`. Once the map is+built, we want to find paths through the network that reach all nodes+eventually, with the least cost. This is a minimum spanning tree problem,+except with a directed graph, so really a Arborescence problem.++With the map, we can determine which nodes to push new content to. Then we+need to control those data transfers, sending to the cheapest nodes first,+and with appropriate rate limiting and control facilities.++This probably will need lots of refinements to get working well.++### first pass: flood syncing++Before mapping the network, the best we can do is flood all files out to every+reachable remote. This is worth doing first, since it's the simplest way to+get the basic functionality of the assistant to work. And we'll need this+anyway.++## TransferScanner++The TransferScanner thread needs to find keys that need to be Uploaded+to a remote, or Downloaded from it.++How to find the keys to transfer? I'd like to avoid potentially+expensive traversals of the whole git working copy if I can.+(Currently, the TransferScanner does do the naive and possibly expensive+scan of the git working copy.)++One way would be to do a git diff between the (unmerged) git-annex branches+of the git repo, and its remote. Parse that for lines that add a key to+either, and queue transfers. That should work fairly efficiently when the+remote is a git repository. Indeed, git-annex already does such a diff+when it's doing a union merge of data into the git-annex branch. It+might even be possible to have the union merge and scan use the same+git diff data.++But that approach has several problems:++1. The list of keys it would generate wouldn't have associated git+ filenames, so the UI couldn't show the user what files were being+ transferred.+2. Worse, without filenames, any later features to exclude+ files/directories from being transferred wouldn't work.+3. Looking at a git diff of the git-annex branches would find keys+ that were added to either side while the two repos were disconnected.+ But if the two repos' keys were not fully in sync before they+ disconnected (which is quite possible; transfers could be incomplete),+ the diff would not show those older out of sync keys.++The remote could also be a special remote. In this case, I have to either+traverse the git working copy, or perhaps traverse the whole git-annex+branch (which would have the same problems with filesnames not being+available).++If a traversal is done, should check all remotes, not just+one. Probably worth handling the case where a remote is connected+while in the middle of such a scan, so part of the scan needs to be+redone to check it.++## done++1. Can use `git annex sync`, which already handles bidirectional syncing.+ When a change is committed, launch the part of `git annex sync` that pushes+ out changes. **done**; changes are pushed out to all remotes in parallel+1. Watch `.git/refs/remotes/` for changes (which would be pushed in from+ another node via `git annex sync`), and run the part of `git annex sync`+ that merges in received changes, and follow it by the part that pushes out+ changes (sending them to any other remotes).+ [The watching can be done with the existing inotify code! This avoids needing+ any special mechanism to notify a remote that it's been synced to.] + **done**+1. Periodically retry pushes that failed. **done** (every half an hour)+1. Also, detect if a push failed due to not being up-to-date, pull,+ and repush. **done**+2. Use a git merge driver that adds both conflicting files,+ so conflicts never break a sync. **done**++* on-disk transfers in progress information files (read/write/enumerate)+ **done**+* locking for the files, so redundant transfer races can be detected,+ and failed transfers noticed **done**+* transfer info for git-annex-shell **done**+* update files as transfers proceed. See [[progressbars]]+ (updating for downloads is easy; for uploads is hard)+* add Transfer queue TChan **done**+* add TransferInfo Map to DaemonStatus for tracking transfers in progress.+ **done**+* Poll transfer in progress info files for changes (use inotify again!+ wow! hammer, meet nail..), and update the TransferInfo Map **done**+* enqueue Transfers (Uploads) as new files are added to the annex by+ Watcher. **done**+* enqueue Tranferrs (Downloads) as new dangling symlinks are noticed by+ Watcher. **done**+ (Note: Needs git-annex branch to be merged before the tree is merged,+ so it knows where to download from. Checked and this is the case.)+* Write basic Transfer handling thread. Multiple such threads need to be+ able to be run at once. Each will need its own independant copy of the + Annex state monad. **done**+* Write transfer control thread, which decides when to launch transfers.+ **done**+* Transfer watching has a race on kqueue systems, which makes finished+ fast transfers not be noticed by the TransferWatcher. Which in turn+ prevents the transfer slot being freed and any further transfers+ from happening. So, this approach is too fragile to rely on for+ maintaining the TransferSlots. Instead, need [[todo/assistant_threaded_runtime]],+ which would allow running something for sure when a transfer thread+ finishes. **done**+* Test MountWatcher on KDE, and add whatever dbus events KDE emits when+ drives are mounted. **done**+* It would be nice if, when a USB drive is connected, + syncing starts automatically. Use dbus on Linux? **done**+* Optimisations in 5c3e14649ee7c404f86a1b82b648d896762cbbc2 temporarily+ broke content syncing in some situations, which need to be added back.+ **done**++ Now syncing a disconnected remote only starts a transfer scan if the+ remote's git-annex branch has diverged, which indicates it probably has+ new files. But that leaves open the cases where the local repo has+ new files; and where the two repos git branches are in sync, but the+ content transfers are lagging behind; and where the transfer scan has+ never been run.++ Need to track locally whether we're believed to be in sync with a remote.+ This includes:+ * All local content has been transferred to it successfully.+ * The remote has been scanned once for data to transfer from it, and all+ transfers initiated by that scan succeeded.++ Note the complication that, if it's initiated a transfer, our queued+ transfer will be thrown out as unnecessary. But if its transfer then+ fails, that needs to be noticed.++ If we're going to track failed transfers, we could just set a flag,+ and use that flag later to initiate a new transfer scan. We need a flag+ in any case, to ensure that a transfer scan is run for each new remote.+ The flag could be `.git/annex/transfer/scanned/uuid`.++ But, if failed transfers are tracked, we could also record them, in + order to retry them later, without the scan. I'm thinking about a+ directory like `.git/annex/transfer/failed/{upload,download}/uuid/`,+ which failed transfer log files could be moved to.+* A remote may lose content it had before, so when requeuing+ a failed download, check the location log to see if the remote still has+ the content, and if not, queue a download from elsewhere. (And, a remote+ may get content we were uploading from elsewhere, so check the location+ log when queuing a failed Upload too.) **done**+* Fix MountWatcher to notice umounts and remounts of drives. **done**+* Run transfer scan on startup. **done**+* Often several remotes will be queued for full TransferScanner scans,+ and the scan does the same thing for each .. so it would be better to+ combine them into one scan in such a case. **done**+* The syncing code currently doesn't run for special remotes. While+ transfering the git info about special remotes could be a complication,+ if we assume that's synced between existing git remotes, it should be+ possible for them to do file transfers to/from special remotes.+ **done**++* The transfer code doesn't always manage to transfer file contents.++ Besides reconnection events, there are two places where transfers get queued:++ 1. When the committer commits a file, it queues uploads.+ 2. When the watcher sees a broken symlink be created, it queues downloads.++ Consider a doubly-linked chain of three repositories, A B and C.+ (C and A do not directly communicate.)+ + * File is added to A.+ * A uploads its content to B.+ * At the same time, A git syncs to B.+ * Once B gets the git sync, it git syncs to C.+ * When C's watcher sees the file appear, it tries to download it. But if+ B had not finished receiving the file from A, C doesn't know B has it,+ and cannot download it from anywhere.++ Possible solution: After B receives content, it could queue uploads of it + to all remotes that it doesn't know have it yet, which would include C. + **done**+ + In practice, this had the problem that when C receives the content,+ it will queue uploads of it, which can send back to B (or to some other repo+ that already has the content) and loop, until the git-annex branches catch+ up and break the cycle.++ To avoid that problem, incoming uploads should not result in a transfer+ info file being written when the key is already present. **done**++ Possible solution: C could record a deferred download. (Similar to a failed+ download, but with an unknown source.) When C next receives a git-annex+ branch push, it could try to queue deferred downloads. **done**++ Note that this solution won't cover use cases the other does. For example,+ connect a USB drive A; B syncs files from it, and then should pass them to C.+ If the files are not new, C won't immediatly request them from B.++* Running the assistant in a fresh clone of a repository, it sometimes+ skips downloading a file, while successfully downloading all the rest.+ There does not seem to be an error message. This will sometimes reproduce+ (in a fresh clone each time) several times in a row, but then stops happening,+ which has prevented me from debugging it.+ This could possibly have been caused by the bug fixed in 750c4ac6c282d14d19f79e0711f858367da145e4.+ Provisionally closed.
@@ -0,0 +1,4 @@+This is a subset of [[/todo]] and [[/bugs]] +for items tagged for the assistant.++[[!inline pages="tagged(design/assistant) and !link(bugs/done) and !link(bugs/moreinfo)" show=0 archive=yes]]
@@ -0,0 +1,123 @@+Some remotes are too small to sync everything to them.++The case of a small remote on a gadget that the user interacts with,+such as a phone, where they may want to request it get content+it doesn't currently have, is covered by the [[partial_content]] page.++But often the remote is just a removable drive or a cloud remote,+that has a limited size. This page is about making the assistant do+something smart with such remotes.++## TODO++* The expensive scan currently makes one pass, dropping content at the same+ time more uploads and downloads are queued. It would be better to drop as+ much content as possible upfront, to keep the total annex size as small+ as possible. How to do that without making two expensive scans?+* The TransferWatcher's finishedTransfer function relies on the location+ log having been updated after a transfer. But there's a race; if the+ log is not updated in time, it will fail to drop unwanted content.+ (There's a 10 second sleep there now to avoid the race, but that's hardly+ a fix.)++### dropping no longer preferred content++When a file is renamed, it might stop being preferred, so+could be checked and dropped. (If there's multiple links to+the same content, this gets tricky. Let's assume there are not.)++### analysis of changes that can result in content no longer being preferred++1. The preferred content expression can change, or a new repo is added, or+ groups change. Generally, some change to global annex state. Only way to deal+ with this is an expensive scan. (The rest of the items below come from+ analizing the terminals used in preferred content expressions.) **done**+2. renaming of a file (ie, moved to `archive/`) **done**+ (note also that renaming a file can also make it become preferred content+ again, and should cause it to be transferred in that case) **done**+3. we get a file (`in`, `copies`) **done**+4. we sent a file (`in`, `copies`) **done**+5. some other repository drops the file (`in`, `copies` .. However, it's+ unlikely that an expression would prefer content when *more* copies+ exisited, and want to drop it when less do. That's nearly a pathological+ case.)+6. `migrate` is used to change a backend (`inbackend`; unlikely)++That's all! Of these, 1-4 are by far the most important.++## specifying what data a remote prefers to contain (**done**)++Imagine a per-remote preferred content setting, that matches things that+should be stored on the remote.++For example, a MP3 player might use:+`smallerthan(10mb) and filename(*.mp3) and (not filename(junk/*))`++Adding that as a filter to files sent to a remote should be+straightforward.++A USB drive that is carried between three laptops and used to sync data+between them might use: `not (in=laptop1 and in=laptop2 and in=laptop3)`++In this case, transferring data from the usb repo should+check if preferred content settings rejects the data, and if so, drop it+from the repo. So once all three laptops have the data, it is+pruned from the transfer drive.++## repo groups (**done**)++Seems like git-annex needs a way to know the groups of repos. Some+groups:++* enduser: The user interacts with this repo directly.+* archival: This repo accumulates stuff, and once it's in enough archives,+ it tends to get removed from other places.+* transfer: This repo is used to transfer data between enduser repos,+ it does not hold data for long periods of time, and tends to have a+ limited size.++Add a group.log that can assign repos to these or other groups. (**done**)++Some examples of using groups:++* Want to remove content from a repo, if it's not an archival repo,+ and the content has reached at least one archival repo:++ `(not group=archival) and (not copies=archival:1)`++ That would make send to configure on all repos, or even set+ a global `annex.accept` to it. **done**++* Make a cloud repo only hold data until all known clients have a copy:++ `not ingroup(enduser)`++## configuration++The above is all well and good for those who enjoy boolean algebra, but+how to configure these sorts of expressions in the webapp?++Currently, we have a simple drop down list to select between a few+predefined groups with pre-defined preferred content recipes. Is this good+enough?++I think so; useful recipes can be developed on the wiki and included in+git-annex.++## the state change problem (**done**)++Imagine that a trusted repo has setting like `not copies=trusted:2`+This means that `git annex get --auto` should get files not in 2 trusted+repos. But once it has, the file is in 3 trusted repos, and so `git annex+drop --auto` should drop it again!++How to fix? Can it even be fixed? Maybe care has to be taken when+writing expressions, to avoid this problem. One that avoids it:+`not (copies=trusted:2 or (in=here and trusted=here and copies=trusted:3))`++Or, expressions could be automatically rewritten to avoid the problem.++Or, perhaps simulation could be used to detect the problem. Before+dropping, check the expression. Then simulate that the drop has happened.+Does the expression now make it want to add it? Then don't drop it!+**done**.. effectively using this approach.
@@ -0,0 +1,65 @@+The webapp is a web server that displays a shiny interface.++## performance++Having the webapp open while transfers are+running uses significant CPU just for the browser to update the progress +bar. Unsurprising, since the webapp is sending the browser a new `<div>`+each time. Updating the DOM instead from javascript would avoid that;+the webapp just needs to send the javascript either a full `<div>` or a +changed percentage and quantity complete to update a single progress bar.++(Another reason to do this is it'll cut down on the refreshes, which +sometimes make browsers ignore clicks on UI elements like the pause button, +if the transfer display refreshes just as the click is made.)++## other features++* there could be a UI to export a file, which would make it be served up+ over http by the web app+* there could be a UI (some javascript thing) in the web browser to+ submit urls to the web app to be added to the annex and downloaded.+ See: [[todo/wishlist:_an_"assistant"_for_web-browsing_--_tracking_the_sources_of_the_downloads]]+* Display the `inotify max_user_watches` exceeded message. **done**+* Display something sane when kqueue runs out of file descriptors.+* allow removing git remotes **done**+* allow disabling syncing to here, which should temporarily disable all+ local syncing. **done**++## better headless support++`--listen` is insecure, and using HTTPS would still not make it 100% secure+as there would be no way for the browser to verify its certificate.++I do have a better idea, but it'd be hard to implement.+`git annex webapp --remote user@host:dir` could ssh to the remote host,+run the webapp there, listening only on localhost, and then send the+port the webapp chose back over the ssh connection. Then the same+ssh connection could be reused (using ssh connection caching) to set up+port forwarding from a port on the local host to the remote webapp.++This would need to handle the first run case too, which would require+forwarding a second port once the webapp made the repository and+the second webapp started up.++## first start **done**++* make git repo **done**+* generate a nice description like "joey@hostname Desktop/annex" **done**+* record repository that was made, and use it next time run **done**+* write a pid file, to prevent more than one first-start process running+ at once **done**++## security **acceptable/done**++* Listen only to localhost. **done**+* Instruct the user's web browser to open an url that contains a secret+ token. This guards against other users on the same system. **done**+ (I would like to avoid passwords or other authentication methods,+ it's your local system.)+* Don't pass the url with secret token directly to the web browser,+ as that exposes it to `ps`. Instead, write a html file only the user can read,+ that redirects to the webapp. **done**+* Alternative for Linux at least would be to write a small program using+ GTK+ Webkit, that runs the webapp, and can know what user ran it, avoiding+ needing authentication.
@@ -0,0 +1,33 @@+See [[todo/windows_support]]..++## symlinks++Apparently new versions of Windows have something very like symlinks.+(Or really, 3 or so things not entirely unlike symlinks and all different.)+Stackoverflow has some details.++NTFS supports symbolic links two different ways: an [[!wikipedia NTFS symbolic link]] and an [[!wikipedia NTFS_junction_point]]. The former seems like the closest analogue to POSIX symlinks.++The windows port will not use symlinks. It will only support direct mode.++## POSIX++Lots of ifdefs and pain to deal with POSIX calls in the code base.++Or I could try to use Cygwin.++## Deeper system integration++[NTFS Reparse Points](http://msdn.microsoft.com/en-us/library/aa365503%28v=VS.85%29.aspx) allow a program to define how the OS will interpret a file or directory in arbitrary ways. This requires writing a file system filter.++## Developement environment++Someone wrote in to say:++> For Windows Development you can easily qualify+> for Bizspark - http://www.microsoft.com/bizspark/+> +> This will get you 100% free Windows OS licenses and+> Dev tools, plus a free Azure account for cloud testing.+> (You can also now deploy Linux VMs to Azure as well)+> No money required at all.
@@ -0,0 +1,136 @@+The git-annex assistant uses XMPP to communicate between peers that+cannot directly talk to one-another. A typical scenario is two users+who share a repository, that is stored in the [[cloud]].++### TODO++* Do git-annex clients sharing an account with regular clients cause confusing+ things to happen? + See <http://git-annex.branchable.com/design/assistant/blog/day_114__xmpp/#comment-aaba579f92cb452caf26ac53071a6788>+* Support registering with XMPP provider from within the webapp, + as clients like pidgin are able to do.+* At least some XMPP servers are lossy (does XMPP guarantee delivery)?+ I have seen a log where a push's packet 1 and 3 arrived, but 2 did not.+ To deal with this, need at least a 1 packet buffer and ACK or resend+ request implemented over top of XMPP. Essentially, TCP over XMPP. :(++## design goals++1. Avoid user-visible messages. dvcs-autosync uses XMPP similarly, but+ sends user-visible messages. Avoiding user-visible messages lets+ the user configure git-annex to use his existing XMPP account+ (eg, Google Talk).++2. Send notifications to buddies. dvcs-autosync sends only self-messages,+ but that requires every node have the same XMPP account configured.+ git-annex should support that mode, but it should also send notifications+ to a user's buddies. (This will also allow for using XMPP for pairing+ in the future.)++3. Don't make account appear active. Just because git-annex is being an XMPP+ client, it doesn't mean that it wants to get chat messages, or make the+ user appear active when he's not using his chat program.++## protocol++To avoid relying on XMPP extensions, git-annex communicates+using presence messages, and chat messages (with empty body tags,+so clients don't display them).++git-annex sets a negative presence priority, to avoid any regular messages+getting eaten by its clients. It also sets itself extended away.+Note that this means that chat messages always have to be directed at+specific git-annex clients.++To the presence and chat messages, it adds its own tag as+[extended content](http://xmpp.org/rfcs/rfc6121.html#presence-extended).+The xml namespace is "git-annex" (not an URL because I hate wasting bandwidth).++To indicate it's pushed changes to a git repo with a given UUID, a message+that is sent to all buddies and other clients using the account (no+explicit pairing needed), it uses a broadcast presence message containing:++ <git-annex xmlns='git-annex' push="uuid[,uuid...]" />++Multiple UUIDs can be listed when multiple clients were pushed. If the+git repo does not have a git-annex UUID, an empty string is used.++To query if other git-annex clients are around, a presence message is used,+containing:++ <git-annex xmlns='git-annex' query="" />++For pairing, a chat message is sent to every known git-annex client,+containing:++ <git-annex xmlns='git-annex' pairing="PairReq|PairAck|PairDone myuuid" />++### git push over XMPP++To indicate that we could push over XMPP, a chat message is sent,+to each known client of each XMPP remote.++ <git-annex xmlns='git-annex' canpush="myuuid" shas="sha1 sha1" />++The shas are omitted by old clients. If present, they are the git shas of+the head and git-annex branches that are available to be pushed. This lets+the receiver check if it's already got them.++To request that a remote push to us, a chat message can be sent.++ <git-annex xmlns='git-annex' pushrequest="myuuid" />++When replying to an canpush message, this is directed at the specific+client that indicated it could push. To solicit pushes from all clients,+the message has to be sent directed individually to each client.++When a peer is ready to send a git push, it sends:++ <git-annex xmlns='git-annex' startingpush="myuuid" />++The receiver runs `git receive-pack`, and sends back its output in+one or more chat messages, directed to the client that is pushing:++ <git-annex xmlns='git-annex' rp="N">+ 007b27ca394d26a05d9b6beefa1b07da456caa2157d7 refs/heads/git-annex report-status delete-refs side-band-64k quiet ofs-delta+ </git-annex>++The sender replies with the data from `git push`, in +one or more chat messages, directed to the receiver:++ <git-annex xmlns='git-annex' sp="N">+ data+ </git-annex>++The value of rp and sp used to be empty, but now it's a sequence number.+This indicates the sequence of this packet, counting from 1. The receiver+and sender each have their own sequence numbers.++When `git receive-pack` exits, the receiver indicates its exit+status with a chat message, directed at the sender:++ <git-annex xmlns='git-annex' rpdone="0" />++### security++Data git-annex sends over XMPP will be visible to the XMPP account's+buddies, and to the XMPP server (and any attacker who has access to the+XMPP server). So it's important to consider the security exposure of using+it.++Even if git-annex sends only a single bit notification, this lets attackers+know when the user is active and changing files. Although the assistant's other+syncing activities can somewhat mask this.++As soon as git-annex does anything unlike any other client, an attacker can+see how many clients are connected for a user, and fingerprint the ones+running git-annex, and determine how many clients are running git-annex.++An attacker can observe the UUIDs used for pushes and pairing, and determine+how many different remotes are being used.++An attacker could replay push notification messages, reusing UUIDs it's+observed. This would make clients pull repeatedly, perhaps as a DOS.++The XMPP server, or an attacker with access to it can reconstruct the git +repository from data sent in pushes, in part or in whole.
@@ -0,0 +1,26 @@+Currently [[xmpp]] relies on the SSL connection to the server for security.+The server can see git repository data pushed through it. (Also, the SSL+connection is not pinned or really checked well at all.)++Add an encryption layer that does not rely on trusting the XMPP server's+security. There are a few options for how to generate the key for eg,+AES encryption:++ * Do a simple Diffie-Hellman shared key generation when starting each XMPP+ push session. Would not protect the users from active MITM by the+ XMPP server, but would prevent passive data gathering attacks from+ getting useful data. Since the key is ephemeral, would provide+ Forward Security.+ * Do D-H key generation, but at pairing, not push time. Allows for an+ optional confirmation step, using eg, BubbleBabble to compare the+ keys out of band. ("I see xebeb-dibyb-gycub-kacyb-modib-pudub-sefab-vifuc-bygoc-daguc-gohec-kuxax .. do you too?")+ * Prompt both users for a passphrase when XMPP pairing, and + use SPEKE (or similar methods like J-PAKE) to generate a shared key.+ Avoids active MITM attacks. Makes pairing harder, especially pairing+ between one's own devices, since the passphrase has to be entered on+ all devices. Also problimatic when pairing more than 2 devices,+ especially when adding a device to the set later, since there+ would then be multiple different keys in use.+ * Rely on the user's gpg key, and do gpg key verification during XMPP+ pairing. Problimatic because who wants to put their gpg key on their+ phone? Also, require the users be in the WOT and be gpg literate.
@@ -0,0 +1,126 @@+This was the design doc for [[/encryption]] and is preserved for+the curious. For an example of using git-annex with an encrypted S3 remote,+see [[tips/using_Amazon_S3]].++[[!toc]]++## encryption backends++It makes sense to support multiple encryption backends. So, there+should be a way to tell what backend is responsible for a given filename+in an encrypted remote. (And since special remotes can also store files+unencrypted, differentiate from those as well.)++The rest of this page will describe a single encryption backend using GPG.+Probably only one will be needed, but who knows? Maybe that backend will+turn out badly designed, or some other encryptor needed. Designing+with more than one encryption backend in mind helps future-proofing.++## encryption key management++[[!template id=note text="""+The basis of this scheme was originally developed by Lars Wirzenius et al+[for Obnam](http://liw.fi/obnam/encryption/).+"""]]++Data is encrypted by GnuPG, using a symmetric cipher. The cipher is+generated by GnuPG when the special remote is created. By default the+best entropy pool is used, hence the generation may take a while; One+can use `initremote` with `highRandomQuality=false` or `--fast` options+to speed up things, but at the expense of using random numbers of a+lower quality. The generated cipher is then checked into your git+repository, encrypted using one or more OpenPGP public keys. This scheme+allows new OpenPGP private keys to be given access to content that has+already been stored in the remote.++Different encrypted remotes need to be able to each use different ciphers.+Allowing multiple ciphers to be used within a single remote would add a lot+of complexity, so is not planned to be supported.+Instead, if you want a new cipher, create a new S3 bucket, or whatever.+There does not seem to be much benefit to using the same cipher for+two different encrypted remotes.++So, the encrypted cipher could just be stored with the rest of a remote's+configuration in `remotes.log` (see [[internals]]). When `git+annex intiremote` makes a remote, it can generate a random symmetric+cipher, and encrypt it with the specified gpg key. To allow another gpg+public key access, update the encrypted cipher to be encrypted to both gpg+keys.++## filename enumeration++If the names of files are encrypted or securely hashed, or whatever is+chosen, this makes it harder for git-annex (let alone untrusted third parties!)+to get a list of the files that are stored on a given enrypted remote.+But, does git-annex really ever need to do such an enumeration?++Apparently not. `git annex unused --from remote` can now check for+unused data that is stored on a remote, and it does so based only on+location log data for the remote. This assumes that the location log is+kept accurately.++What about `git annex fsck --from remote`? Such a command should be able to,+for each file in the repository, contact the encrypted remote to check+if it has the file. This can be done without enumeration, although it will+mean running gpg once per file fscked, to get the encrypted filename.++So, the files stored in the remote should be encrypted. But, it needs to+be a repeatable encryption, so they cannot just be gpg encrypted, that+would yeild a new name each time. Instead, HMAC is used. Any hash could+be used with HMAC. SHA-1 is the default, but [[other_hashes|/encryption]]+can be chosen for new remotes.++It was suggested that it might not be wise to use the same cipher for both+gpg and HMAC. Being paranoid, it's best not to tie the security of one+to the security of the other. So, the encrypted cipher described above is+actually split in two; half is used for HMAC, and half for gpg.++----++Does the HMAC cipher need to be gpg encrypted? Imagine if it were+stored in plainext in the git repository. Anyone who can access+the git repository already knows the actual filenames, and typically also+the content hashes of annexed content. Having access to the HMAC cipher+could perhaps be said to only let them verify that data they already+know.++While this seems a pretty persuasive argument, I'm not 100% convinced, and+anyway, most times that the HMAC cipher is needed, the gpg cipher is also+needed. Keeping the HMAC cipher encrypted does slow down two things:+dropping content from encrypted remotes, and checking if encrypted remotes+really have content. If it's later determined to be safe to not encrypt the+HMAC cipher, the current design allows changing that, even for existing+remotes.++## other use of the symmetric cipher++The symmetric cipher can be used to encrypt other content than the content+sent to the remote. In particular, it may make sense to encrypt whatever+access keys are used by the special remote with the cipher, and store that+in remotes.log. This way anyone whose gpg key has been given access to +the cipher can get access to whatever other credentials are needed to+use the special remote.++## risks++A risk of this scheme is that, once the symmetric cipher has been+obtained, it allows full access to all the encrypted content. Indeed+anyone owning a key that used to be granted access could already have+decrypted the cipher and stored a copy. While it is in possible to+remove a key with `keyid-=`, it is designed for a+[[completely_different_purpose|/encryption]] and does not actually revoke+access.++If git-annex stores the decrypted symmetric cipher in memory, then there+is a risk that it could be intercepted from there by an attacker. Gpg+ameliorates these type of risks by using locked memory. For git-annex, note+that an attacker with local machine access can tell at least all the+filenames and metadata of files stored in the encrypted remote anyway,+and can access whatever content is stored locally.++This design does not support obfuscating the size of files by chunking+them, as that would have added a lot of complexity, for dubious benefits.+If the untrusted party running the encrypted remote wants to know file sizes,+they could correlate chunks that are accessed together. Encrypting data+changes the original file size enough to avoid it being used as a direct+fingerprint at least.
@@ -0,0 +1,12 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U"+ nickname="Richard"+ subject="comment 1"+ date="2011-04-03T20:03:14Z"+ content="""+New encryption keys could be used for different directories/files/patterns/times/whatever. One could then encrypt this new key for the public keys of other people/machines and push them out along with the actual data. This would allow some level of access restriction or future revocation. git-annex would need to keep track of which files can be decrypted with which keys. I am undecided if that information needs to be encrypted or not.++Encrypted object files should be checksummed in encrypted form so that it's possible to verify integrity without knowing any keys. Same goes for encrypted keys, etc.++Chunking files in this context seems like needless overkill. This might make sense to store a DVD image on CDs or similar, at some point. But not for encryption, imo. Coming up with sane chunk sizes for all use cases is literally impossible and as you pointed out, correlation by the remote admin is trivial.+"""]]
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="http://joey.kitenet.net/"+ nickname="joey"+ subject="comment 2"+ date="2011-04-05T18:41:49Z"+ content="""+I see no use case for verifying encrypted object files w/o access to the encryption key. And possible use cases for not allowing anyone to verify your data.++If there are to be multiple encryption keys usable within a single encrypted remote, than they would need to be given some kind of name (a since symmetric key is used, there is no pubkey to provide a name), and the name encoded in the files stored in the remote. While certainly doable I'm not sold that adding a layer of indirection is worthwhile. It only seems it would be worthwhile if setting up a new encrypted remote was expensive to do. Perhaps that could be the case for some type of remote other than S3 buckets.+"""]]
@@ -0,0 +1,12 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U"+ nickname="Richard"+ subject="comment 3"+ date="2011-04-05T23:24:17Z"+ content="""+Assuming you're storing your encrypted annex with me and I with you, our regular cron jobs to verify all data will catch corruption in each other's annexes.++Checksums of the encrypted objects could be optional, mitigating any potential attack scenarios.++It's not only about the cost of setting up new remotes. It would also be a way to keep data in one annex while making it accessible only in a subset of them. For example, I might need some private letters at work, but I don't want my work machine to be able to access them all.+"""]]
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="http://joey.kitenet.net/"+ nickname="joey"+ subject="comment 4"+ date="2011-04-07T19:59:30Z"+ content="""+@Richard the easy way to deal with that scenario is to set up a remote that work can access, and only put in it files work should be able to see. Needing to specify which key a file should be encrypted to when putting it in a remote that supported multiple keys would add another level of complexity which that avoids.++Of course, the right approach is probably to have a separate repository for work. If you don't trust it with seeing file contents, you probably also don't trust it with the contents of your git repository.+"""]]
@@ -0,0 +1,16 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawkS6aFVrEwOrDuQBTMXxtGHtueA69NS_jo"+ nickname="Hans"+ subject="using sshfs + cryptmount is more secure"+ date="2012-08-14T13:41:47Z"+ content="""+\"For git-annex, note that an attacker with local machine access can tell at least all the filenames and metadata of files stored in the encrypted remote anyway, and can access whatever content is stored locally.\"++Better security is given by sshfs + cryptmount, which I used when I recently setup a git-annex repository on a free shell account from a provider I do not trust.++See http://code.cjb.net/free-secure-online-backup.html for what I did to get a really secure solution.++Kind regards,++Hans Ekbrand+"""]]
@@ -0,0 +1,14 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawmBUR4O9mofxVbpb8JV9mEbVfIYv670uJo"+ nickname="Justin"+ subject="comment 6"+ date="2012-08-14T14:10:40Z"+ content="""+Hans,++You are misunderstanding how git-annex encryption works. The \"untrusted host\" and the \"local machine\" are not the same machine. git-annex only transfers pre-encrypted files to the \"untrusted host\".++You should setup a git-annex encrypted remote and watch how it works so you can see for yourself that it is not insecure.++Your solution does not provide better security, it accomplishes the same thing as git-annex in a more complicated way. In addition, since you are mounting the image from the client your solution will not work with multiple clients.+"""]]
@@ -0,0 +1,14 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawkS6aFVrEwOrDuQBTMXxtGHtueA69NS_jo"+ nickname="Hans"+ subject="comment 7"+ date="2012-08-15T19:16:10Z"+ content="""+Justin,++thanks for clearing that up. It's great that git-annex has implemented mechanisms to work securely on untrusted hosts. My solution is thus only interesting for files that are impractical to manage with git-annex (e.g. data for/from applications that need rw-access to a large number of files). And, possibly, for providers that do not provide rsync.++Your remark that my solution does not work with more than one client, is not entirely accurate. No more than one client can access the repository at any given time, but as long as access is not simultaneous, any number of clients can access the repository. Still, your point is taken, it's a limitation I should mention.++It would be interesting to compare the performance of individually encrypted files to encrypted image-file. My intuition says that encrypted image-file should be faster, but that's just a guess.+"""]]
@@ -0,0 +1,8 @@+To integrate with git-remote-gcrypt, a key thing is to have a way to map+from the gcrypt-id of an encrypted repository to a git-annex repository+uuid.++To do this, we'll make a v5 UUID, feeding in the gcrypt-id.+The namespace used is itself a v5 UUID, generated using the URL+namespace and the URL of this page at the time this scheme was+developed: "http://git-annex.branchable.com/design/gcrypt/"
@@ -0,0 +1,18 @@+## roadmap++Now in the +[sustaining git-annex development](https://campaign.joeyh.name/) year+(starting September 2013).++* Month 1 [[!traillink assistant/encrypted_git_remotes]]+* **Month 2 [[!traillink assistant/disaster_recovery]]**+* Month 3 user-driven features and polishing+* Month 4 improve special remote interface & git-annex enhancement contest+* Month 5 [[!traillink assistant/xmpp_security]]+* Month 6 Windows assistant and webapp+* Month 7 user-driven features and polishing+* Month 8 [[!traillink assistant/gpgkeys]] [[!traillink assistant/sshpassword]]+* Month 9 get [[assistant/Android]] out of beta+* Month 10 user-driven features and polishing+* Month 11 [[!traillink assistant/chunks]] [[!traillink assistant/deltas]]+* Month 12 user-driven features and polishing
@@ -0,0 +1,10 @@+Work on git-annex is [crowdfunded](https://campaign.joeyh.name/).+Joey blogs about his progress here on a semi-daily basis.++[[!sidebar content="""+[[!calendar type="month" pages="page(devblog/*)"]]+[[!calendar type="month" month="-1" pages="page(devblog/*)"]]+[[!calendar type="month" month="-2" pages="page(devblog/*)"]]+"""]]++[[!inline pages="page(devblog/*)" show=0]]
@@ -0,0 +1,5 @@+Implemented `git annex forget --drop-dead`, which is finally a way to+remove all references to old repositories that you've marked as dead.++I've still not merged in the `forget` branch, because I developed this+while slightly ill, and have not tested it very well yet.
@@ -0,0 +1,29 @@+John Millikin came through and fixed that haskell-gnutls segfault+on OSX that I developed a reproducible test case for the other day.+It's a bit hard to test, since the bug doesn't always happen, but the+fix is already deployed for Mountain Lion autobuilder.++However, I then found another way to make haskell-gnutls segfault, more+reliably on OSX, and even sometimes on Linux. Just entering the wrong XMPP+password in the assistant can trigger this crash. Hopefully John will work+his magic again.++---++Meanwhile, I fixed the sync-after-forget problem. Now sync always forces+its push of the git-annex branch (as does the assistant). I considered but+rejected having sync do the kind of uuid-tagged branch push that the+assistant sometimes falls back to if it's failing to do a normal sync. It's+ugly, but worse, it wouldn't work in the workflow where multiple clients+are syncing to a central bare repository, because they'd not pull down the+hidden uuid-tagged branches, and without the assistant running on the+repository, nothing would ever merge their data into the git-annex branch.+Forcing the push of synced/git-annex was easy, once I satisfied myself+that it was always ok to do so.++Also factored out a module that knows about all the different log files+stored on the git-annex branch, which is all the support infrastructure+that will be needed to make `git annex forget --drop-dead` work. Since this+is basically a routing module, perhaps I'll get around to making it use+a nice bidirectional routing library like+[Zwaluw](http://hackage.haskell.org/package/Zwaluw) one day.
@@ -0,0 +1,80 @@+Yesterday I spent making a release, and shopping for a new laptop, since+this one is dying. (Soon I'll be able to compile git-annex fast-ish! Yay!)+And thinking about [[todo/wishlist:_dropping_git-annex_history]].++Today, I added the `git annex forget` command. It's currently been lightly+tested, seems to work, and is living in the `forget` branch until I gain+confidence with it. It should be perfectly safe to use, even if it's buggy,+because you can use `git reflog git-annex` to pull out and revert to an old+version of your git-annex branch. So if you're been wanting this feature,+please beta test!++----++I actually implemented something more generic than just forgetting git+history. There's now a whole mechanism for git-annex doing distributed+transitions of whatever sort is needed.++There were several subtleties involved in distributed transitions:++First is how to tell when a given transition has already been done on a+branch. At first I was thinking that the transition log should include the+sha of the first commit on the old branch that got rewritten. However, that+would mean that after a single transition had been done, every git-annex+branch merge would need to look up the first commit of the current branch,+to see if it's done the transition yet. That's slow! Instead, transitions+are logged with a timestamp, and as long as a branch contains a transition+with the same timestamp, it's been done.++A really tricky problem is what to do if the local repository has+transitioned, but a remote has not, and changes keep being made to the+remote. What it does so far is incorporate the changes from the remote into+the index, and re-run the transition code over the whole thing to yeild a+single new commit. This might not be very efficient (once I write the more+full-featured transition code), but it lets the local repo keep up with+what's going on in the remote, without directly merging with it (which+would revert the transition). And once the remote repository has its+git-annex upgraded to one that knows about transitions, it will finish up+the transition on its side automatically, and the two branches will once+again merge.++Related to the previous problem, we don't want to keep trying to merge+from a remote branch when it's not yet transitioned. So a blacklist is+used, of untransitioned commits that have already been integrated.++One really subtle thing is that when the user does a transition more+complicated than `git annex forget`, like the `git annex forget --dead`+that I need to implement to forget dead remotes, they're not just telling+git-annex to forget whatever dead remotes it knows right now. They're+actually telling git-annex to perform the transition one time on every+existing clone of the repository, at some point in the future. Repositories+with unfinished transitions could hang around for years, and at some future+point when git-annex runs in the repository again, it would merge in the+current state of the world, and re-do the transition. So you might tell it+to forget dead remotes today, and then the very repository you ran that in+later becomes dead, and a long-slumbering repo wakes up and forgets about+the repo that started the whole process! I hope users don't find this+massively confusing, but that's how the implementation works right now.++----++I think I have at least two more days of work to do to finish up this+feature.++* I still need to add some extra features like forgetting about dead remotes,+ and forgetting about keys that are no longer present on any remote.++* After `git annex forget`, `git annex sync`+ will fail to push the synced/annex branch to remotes, since the branch+ is no longer a fast-forward of the old one. I will probably fix this by+ making `git annex sync` do a fallback push of a unique branch in this case,+ like the assistant already does. Although I may need to adjust that code+ to handle this case, too..++* For some reason the automatic transitioning code triggers+ a "(recovery from race)" commit. This is certianly a bug somewhere,+ because you can't have a race with only 1 participant.++----++Today's work was sponsored by Richard Hartmann.
@@ -0,0 +1,23 @@+Fixed a typo that broke automatic youtube video support in `addurl`.++----++Now there's an easy way to get an overview of how close your repository+is to meeting the configured numcopies settings (or when it exceeds them).++<pre>+# time git annex status . +[...]+numcopies stats: + numcopies +0: 6686+ numcopies +1: 3793+ numcopies +3: 3156+ numcopies +2: 2743+ numcopies -1: 1242+ numcopies -4: 1098+ numcopies -3: 1009+ numcopies +4: 372+</pre>++This does make `git annex status` slow when run on a large directory tree,+so --fast disables that.
@@ -0,0 +1,12 @@+Now the webapp can set up encrypted repositories on removable drives.++[[assistant/encryptdrive.png]]++This UI needs some work, and the button to create a new key is not wired+up. Also if you have no gpg agent installed, there will be lots of password+prompts at the console.++Forked git-remote-gcrypt to fix a bug. Hopefully my patch will be merged;+for now I recommend installing my worked version.++Today's work was sponsored by Romain Lenglet.
@@ -0,0 +1,35 @@+I decided to keep gpg key generation very simple for now. So it generates a+special-purpose key that is only intended to be used by git-annex. It+hardcodes some key parameters, like RSA and 4096 bits (maximum recommended+by gpg at this time). And there is no password on the key, although you can+of course edit it and set one. This is because anyone who can access the+computer to get the key can also look at the files in your git-annex+repository. Also because I can't rely on gpg-agent being installed+everywhere. All these simplifying assumptions may be revisited later, but+are enough for now for someone who doesn't know about gpg (so doesn't +have a key already) and just wants an encrypted repo on a+removable drive.++Put together a simple UI to deal with gpg taking quite a while to+generate a key ...++[[assistant/genkey.png]]++[[assistant/repoinfo.png]]++Then I had to patch git-remote-gcrypt again, to have a per-remote+signingkey setting, so that these special-purpose keys get used for signing+their repo.++Next, need to add support for adding an existing gcrypt repo as a remote+(assuming it's encrypted to an available key). Then, gcrypt repos on ssh+servers..++----++Also dealt with build breakage caused by a new version of the Haskell DNS+library.++----++Today's work was sponsored by Joseph Liu.
@@ -0,0 +1,13 @@+Spent basically all of today getting the assistant to be able to handle+gcrypt special remotes that already exist when it's told to add a USB+drive. This was quite tricky! And I did have to skip handling gcrypt repos+that are not git-annex special remotes.++Anyway, it's now almost easy to set up an encrypted sneakernet +using a USB drive and some computers running the webapp. The only part+that the assistant doesn't help with is gpg key management.++Plan is to make a release on Friday, and then try to also add support for+encrypted git repositories on remote servers. Tomorrow I will try to get+through some of the communications backlog that has been piling up while I+was head down working on gcrypt.
@@ -0,0 +1,26 @@+Spent a few hours improving gcrypt in some minor ways, including adding a+--check option that the assistant can use to find out if a given repo is+encrypted with dgit, and also tell if the necessary gpg key is available to+decrypt it. Also merged in a fix to support subkeys, developed by a+git-annex user who is the first person I've heard from who is using gcrypt.+I don't want to maintain gcrypt, so I am glad its author has shown up+again today.++Got mostly caught up on backlog. The main bug I was able to track down+today is git-annex using a lot of memory in certian repositories. This+turns out to have happened when a really large file was committed right+intoo to the git repository (by mistake or on purpose). Some parts of+git-annex buffer file contents in memory while trying to work out if+they're git-annex keys. Fixed by making it first check if a file in git is+marked as a symlink. Which was really hard to do!++At least 4 people ran into this bug, which makes me suspect that lots of+people are messing up when using direct mode (probably due to not reading+the documentation, or having `git commit -a` hardwired into their fingers,+and forcing git to commit large files into their repos, rather than having+git-annex manage them. Implementing [[todo/direct_mode_guard]] seems more+urgent now.++----++Today's work was sponsored by Amitai Schlair.
@@ -0,0 +1,67 @@+Made a release on Friday. But I had to rebuild the OSX and Linux standalone+builds today to fix a bug in them.++Spent the past **three days** redoing the whole Android build environment.+I've been progressively moving from my first hacked up Android build env to+something more reproducible and sane. Finally I am at the point where I can+run a shell script (well, actually, 3 shell scripts) and get an Android+build chroot. It's still not immune to breaking when new versions of+haskell libs are uploaded, but this is much better, and should be+maintainable going forward. ++This is a good starting point for getting git-annex into the F-Droid app+store, or for trying to build with a newer version of the Android SDK and+NDK, to perhaps get it working on Android 4.3. (Eventually. I am so sick+of building Android stuff right now..)++Friday was all spent struggling to get ghc-android to build. I had not built+it successfully since February. I finally did,+on Saturday, and I have made my own fork of it which builds using a+known-good snapshot of the current development version of ghc. Building+this in a Debian stable chroot means that there should be no possibility+that upstream changes will break the build again.++With ghc built, I moved on to building all the haskell libs git-annex+needs. Unfortunately my build script for these also has stopped working+since I made it in April. I failed to pin every package at a defined+version, and things broke.++So, I redid the build script, and updated all the haskell libs to the+newest versions while I was at it. I have decided not to pin the library+versions (at least until I find a foolproof way to do it), so this new+script will break in the future, but it should break in a way I can fix up+easily by just refreshing a patch.++The new ghc-android build has a nice feature of at least being able to+compile Template Haskell code (though still not run it at compile time.+This made the patching needed in the Haskell libs quite a lot less. Offset+somewhat by me needing to make general fixes to lots of libs to build with+ghc head. Including some fun with `==#` changing its type from `Bool` to+`Int#`. In all, I think I removed around 2.5 thousand lines of patches!+(Only 6 thousand lines to go...)++Today I improved ghc-android some more so it cross builds several C libraries+that are needed to build several haskell libraries needed for XMPP.+I had only ever built those once, and done it by hand, and very hackishly.+Now they all build automatically too.++And, I put together a script that builds the debian stable chroot and+installs ghc-android.++And, I hacked on the EvilSplicer (which is sadly still needed) to+work with the new ghc/yesod/etc.++At this point, I have git-annex successfully building, including the APK!++----++In a bored hour waiting for a compile, I also sped up `git annex add`+on OSX by I think a factor of 10. Using cryptohash for hash calculation+now, when external hash programs are not available. It's still a few+percentage points slower than external hash programs, or I'd use it by+default.++----++This period of important drudgery was sponsored by an unknown bitcoin+user, and by Bradley Unterrheiner and Andreas Olsson.
@@ -0,0 +1,37 @@+Finished moving the Android autobuilder over to the new clean build+environment. Tested the Android app, and it still works. Whew!++There's a small chance that the issue with the Android app not working on+Android 4.3 has been fixed by this rebuild. I doubt it, but perhaps someone+can download the daily build and give it another try..++----++I have 7 days left in which I'd like to get remote gcrypt repositories+working in the assistant. I think that should be fairly easy, but a+prerequisite for it is making git-annex-shell support being run on a gcrypt+repository. That's needed so that the assistant's normal locked down ssh+key setup can also be used for gcrypt repositories.++At the same time, not all gcrypt endpoints will have git-annex-shell+installed, and it *seems* to make sense to leave in the existing support+for running raw rsync and git push commands against such a repository. So+that's going to add some complication.++It will also complicate git-annex-shell to support gcrypt repos. Basically,+everything it does in git-annex repos will need to be reimplemented in+gcrypt repositories. Generally in a more simple form; for example it+doesn't need to (and can't) update location logs in a gcrypt repo.++----++I also need to find a good UI to present the three available choices+(unencrypted git, encrypted git, encrypted rsync) when setting up a repo+on a ssh server. I don't want to just remove the encrypted rsync option,+because it's useful when using xmpp to sync the git repo, and is simpler to+set up since it uses shared encryption rather than gpg public keys.++My current thought is to offer just 2 choices, encrypted and non-encrypted.+If they choose encrypted, offer a choice of shared encryption or encrypting+to a specific key. I think I can word this so it's pretty clear what the+tradeoffs are.
@@ -0,0 +1,11 @@+I try hard to keep this devblog about git-annex development and not me.+However, it is a shame that what I wanted to be the beginning of my first+real month of work funded by the new campaign has been marred by my home's+internet connection being taken out by a lightning strike, and by illness.+Nearly back on my feet after that, and waiting for my new laptop to+finally get here.++Today's work: Finished up the `git annex forget` feature and merged it in.+Fixed the bug that was causing the commit race detection code to+incorrectly fire on the commit made by the transition code. Few other bits+and pieces.
@@ -0,0 +1,14 @@+Added support for gcrypt remotes to git-annex-shell. Now gcrypt special+remotes probe when they are set up to see if the remote system has a+suitable git-annex-shell, and if so all commands are sent to it. Kept the+direct rsync mode working as a fallback.++It turns out I made a bad decision when first adding gcrypt support to+git-annex. To make implementation marginally easier, I decided to not+put objects inside the usual `annex/objects` directory in a gcrypt remote.+But that lack of consistency would have made adding support to+git-annex-shell a lot harder. So, I decided to change this. Which +means that anyone already using gcrypt with git-annex will need to+[[manually_move_files_around|upgrades/gcrypt]].++Today's work was sponsored by Tobias Nix.
@@ -0,0 +1,5 @@+Did various bug fixes and followup today. Amazing how a day can vanish that+way. Made 4 actual improvements.++I still have 46 messages in unanswered backlog. Although only 8 of+the are from this month.
@@ -0,0 +1,20 @@+Being still a little unsure of the UI and complexity+for configuring gcrypt on ssh servers, I thought I'd start today with the+special case of gcrypt on rsync.net. Since rsync.net allows running some git+commands, gcrypt can be used to make encrypted git repositories on it.++Here's the UI I came up with. It's complicated a bit by needing to explain+the tradeoffs between the rsync and gcrypt special remotes.++[[!img /assistant/rsync.net.encryption.png]]++This works fine, but I did not get a chance to add support for enabling+existing gcrypt repos on rsync.net. Anyway, most of the changes to make+this work will also make it easier to add general support for gcrypt on ssh+servers.++Also spent a while fixing a bug in git-remote-gcrypt. Oddly +`gpg --list-keys --fast-list --fingerprint` does not show the fingerprints+of some keys.++Today's work was sponsored by Cloudier - Thomas Djärv.
@@ -0,0 +1,23 @@+Worked on making the assistant able to merge in existing encrypted+git repositories from rsync.net.++This had two parts. First, making the webapp UI where you click to enable a+known special remote work with these encrypted repos. Secondly, handling+the case where a user knows they have an encrypted repository on rsync.net,+so enters in its hostname and path, but git-annex doesn't know about that+special remote. The second case is important, for example, when the+encrypted repository is a backup and you're restoring from it. It wouldn't+do for the assistant, in that case, to make a *new* encrypted repo and+push it over top of your backup!++Handling that was a neat trick. It has to do quite a lot of probing, including+downloading the whole encrypted git repo so it can decrypt it and merge it,+to find out about the special remote configuration used for it. This all+works with just 2 ssh connections, and only 1 ssh password prompt max.++Next, on to generalizing this rsync.net specific code to work with+arbitrary ssh servers!++----++Today's work was made possible by [RMS's vision 30 years ago](http://article.olduse.net/771@mit-eddie.UUCP).
@@ -0,0 +1,23 @@+So close to being done with gcrypt support.. But still not quite there.++Today I made the UI changes to support gcrypt when setting up a repository+on a ssh server, and improved the probing and data types so it can tell+which options the server supports. Fairly happy with how that is turning+out.++Have not yet hooked up the new buttons to make gcrypt repos. While I was+testing that my changes didn't break other stuff, I found a bug in the+webapp that caused it to sometimes fail to transfer one file to/from a+remote that was just added, because the transferrer process didn't know+about the new remote yet, and crashed (and was restarted knowing about it,+so successfully sent any other files). So got sidetracked on fixing that.++Also did some work to make the gpg bundled with git-annex on OSX be+compatable with the config files written by MacGPG. At first I was going to+hack it to not crash on the options it didn't support, but it turned out+that upgrading to version 1.4.14 actually fixed the problem that was making+it build without support for DNS.++----++Today's work was sponsored by Thomas Hochstein.
@@ -0,0 +1,25 @@+Long day, but I did finally finish up with gcrypt support. More or less.++Got both creating and enabling existing gcrypt repositories on ssh servers+working in the webapp. (But I ran out of time to make it detect when the+user is manually entering a gcrypt repo that already exists. Should be easy+so maybe tomorrow.)++Fixed several bugs in git-annex's gcrypt support that turned up in testing.+Made git-annex ensure that a gcrypt repository does not have+receive.denyNonFastForwards set, because gcrypt relies on always forcing+the push of the branch it stores its manifest on. Fixed a bug in+`git-annex-shell recvkey` when it was receiving a file from an annex in+direct mode.++Also had to add a new `git annex shell gcryptsetup` command, which is+needed to make setting up a gcrypt repository work when the assistant+has set up a locked-down ssh key that can only run git-annex-shell. Painted+myself into a bit of a corner there.++And tested, tested, tested. So many possibilities and edge cases in this+part of the code..++----++Today's work was sponsored by Hendrik Müller Hofstede.
@@ -0,0 +1,17 @@+Did I say it would be easy to make the webapp detect when a gcrypt repository +already existed and enable it? Well, it wasn't exactly hard, but it took+over 300 lines of code and 3 hours..++So, gcrypt support is done for now. The glaring omission is gpg key+management for sharing gcrypt repositories between machines and/or people.+But despite that, I think it's solid, and easy to use, and covers some+great use cases.++Pushed out a release.++Now I really need to start thinking about+[[design/assistant/disaster_recovery]].++----++Today's work was sponsored by Dominik Wagenknecht.
@@ -0,0 +1,49 @@+Started the day by getting the builds updated for yesterday's release. This+included making it possible to build git-annex with Debian stable's version+of cryptohash. Also updated the Debian stable backport to the previous+release.++----++The [[design/roadmap]] has this month devoted to improving git-annex's+support for recovering from disasters, broken repos, and so on. Today I've+been working on the first thing on [[the_list|design/assistant/disaster_recovery]],+stale git index lock files.++It's unfortunate that git uses simple files for locking, and does not use+fcntl or flock to prevent the stale lock file problem. Perhaps they want+it to work on broken NFS systems? The problem with that line of thinking is+is means all non-broken systems end up broken by stale lock files. Not a+good tradeoff IMHO.++There are actually two lock files that can end up stale when using+git-annex; both `.git/index.lock` and `.git/annex/index.lock`. Today I+concentrated on the latter, because I saw a way to prevent it from ever+being a problem. All updates to that index file are done by git-annex when+committing to the git-annex branch. git-annex already uses fcntl locking+when manipulating its journal. So, that can be extended to also cover+committing to the git-annex branch, and then the git `index.lock` file+is irrelevant, and can just be removed if it exists when a commit is+started.++To ensure this makes sense, I used the type system to prove that the journal+locking was in effect everywhere I need it to be. Very happy I was able to+do that, although I am very much a novice at using the type system for+interesting proofs. But doing so made it very easily to build up to a point+where I could unlink the `.git/annex/index.lock` and be sure it was safe to do+that.++----++What about stale `.git/index.lock` files? I don't think it's appropriate+for git-annex to generally recover from those, because it would change+regular git command line behavior, and risks breaking something. However, I+do want the assistant to be able to recover if such a file exists when it+is starting up, since that would prevent it from running. Implemented that+also today, although I am less happy with the way the assistant detects+when this lock file is stale, which is somewhat heuristic (but should work+even on networked filesystems with multiple writing machines).++----++Today's work was sponsored by Torbjørn Thorsen.
@@ -0,0 +1,17 @@+Finished up the automatic recovery from stale lock files. Turns out git+has quite a few lock files; the assistant handles them all.++Improved URL and WORM keys so the filenames used for them+will always work on FAT (which has a crazy assortmeny of illegal+characters). This is a tricky thing to deal with without breaking backwards+compatability, so it's only dealt with when creating new URL or WORM keys.++-----++I think my next step in this disaster recovery themed month will be adding+periodic incremental fsck to the assistant. `git annex fsck` can already+do an incremental fsck, so this should mostly involve adding a user+interface to the webapp to configure when it should fsck. For example, you+might choose to run it for up 1 hour every night, with a goal of checking+all your files once per month. Also will need to make the assistant do+something useful when fsck finds a bad file (ie, queue a re-download).
@@ -0,0 +1,10 @@+Spent most of the day building some generic types for scheduling recurring+events. Not sure if rolling my own was a good idea, but that's what I did.++In the incrementalfsck branch, I have hooked this up in `git-annex vicfg`,+which now accepts and parses scheduled events like +"fsck self every day at any time for 60 minutes" and +"fsck self on day 1 of weeks divisible by 2 at 3:45 for 120 minutes", and+stores them in the git-annex branch. The exact syntax is of course subject+to change, but also doesn't matter a whole lot since the webapp will have+a better interface.
@@ -0,0 +1,8 @@+Now I can build git-annex twice as fast! And a typical incremental build is+down to 10 seconds, from 51 seconds.++Spent a productive evening working with Guilhem to get his encryption+patches reviewed and merged. Now there is a way to remove revoked gpg keys,+and there is a new encryption scheme available that uses public key+encryption by default rather than git-annex's usual approach. That's not+for everyone, but it is a good option to have available.
@@ -0,0 +1,17 @@+Lots of progress from yesterday's modest start of building data types for+scheduling. Last night I wrote the hairy calendar code to calculate when+next to run a scheduled event. (This is actually quite superior to `cron`,+which checks every second to see if it should run each event!) Today I+built a "Cronner" thread that handles spawning threads to handle each+scheduled event. It even notices when changes have been made to the its+schedule and stops/starts event threads appropriately.++Everything is hooked up, building, and there's a good chance it works+without too many bugs, but while I've tested all the pure code (mostly+automatically with quickcheck properties), I have not run the Cronner+thread at all. And there is some tricky stuff in there, like noticing+that the machine was asleep past when it expected to wake up, and deciding+if it should still run a scheduled event, or should wait until next time.+So tomorrow we'll see..++Today's work was sponsored by Ethan Aubin.
@@ -0,0 +1,17 @@+Some neat stuff is coming up, but today was a pretty blah day for me.+I did get the Cronner tested and working (only had a few little bugs). But+I got stuck for quite a while making the Cronner stop `git-annex fsck`+processes it was running when their jobs get removed. I had some code to do+this that worked when run standalone, but not when run from git-annex.++After considerable head-scratching, I found out this was due to+`forkProcess` masking aync exceptions, which seems to be probably+[a bug](http://ghc.haskell.org/trac/ghc/ticket/8433). Luckily was able to+work around it. Async exceptions continue to strike me as the worst part of+the worst part of Haskell (the worst part being exceptions in general).++Was more productive after that.. Got the assistant to automatically queue+re-downloads of any files that fsck throws out due to having bad contents,+and made the webapp display an alert while fscking is running, which will+go to the page to configure fsck schedules. Now all I need to do is+build the UI of that page.
@@ -0,0 +1,20 @@+Last night, built this nice user interface for configuring periodic fscks:++[[!img assistant/fsckconfig.png]]++Rather happy that that whole UI needed only 140 lines of code to build.+Though rather more work behind it, as seen in this blog..++Today I added some support to git-annex for smart fscking of remotes.+So far only git repos on local drives, but this should get extended to+git-annex-shell for ssh remotes. The assistant can also run periodic fscks+of these.++Still need to test that, and find a way to make a removable drive's fsck+job run when the drive gets plugged in. That's where picking "any time"+will be useful; it'll let you configure fscking of removable drives when+they're available, as long as they have not been fscked too recently.++----++Today's work was sponsored by Georg Bauer.
@@ -0,0 +1,9 @@+Built everything needed to run a fsck when a remote gets connected. Have+not tested it; only testing is blocking merging the incrementalfsck branch+now.++Also updated the OSX and Android builds to use a new gpg release (denial of+service security fix), and updated the Debian backport, and did a small+amount of bug fixing. I need to do several more days of bug fixing once +I get this incremental fsck feature wrapped up before moving on to recovery+of corrupt git repositories.
@@ -0,0 +1,7 @@+Fixed a lot of bugs in the assistant's fsck handling today, and merged+it into master. There are some enhancments that could be added to it, +including fscking ssh remotes via git-annex-shell and adding the ability to+schedule events to run every 30 days instead of on a specific day of the+month. But enough on this feature for now.++Today's work was sponsored by Daniel Brockman.
@@ -0,0 +1,15 @@+While I said I was done with fsck scheduling yesterday, I ended up adding+one more feature to it today: Full anacron style scheduling. So a fsck can+be scheduled to run once per week, or month, or year, and it'll run the+fsck the next time it's available after that much time has passed. The nice+thing about this is I didn't have to change Cronner *at all* to add this,+just improved the Recurrance data type and the code that calculates when+to run events.++Rest of the day I've been catching up on some bug reports. The main bug I+fixed caused git-annex on Android to hang when adding files. This turns out+to be because it's using a new (unreleased) version of git, and+`git check-attr -z` output format has changed in an incompatable way.++I am currently 70 messages behind, which includes some ugly looking bug+reports, so I will probably continue with this over the next couple days.
@@ -0,0 +1,1 @@+Productive day, but I'm wiped out. Backlog down to 51.
@@ -0,0 +1,6 @@+A long day of bugfixing. Split into two major parts. First I got back to a+bug I filed in August to do with the assistant misbehaving when run in a+subdirectory of a git repository, and did a nice type-driven fix of the+underlying problem (that also found and fixed some other related bugs that+would not normally occur). Then, spent 4 hours in Windows purgatory working+around crazy path separator issues.
@@ -0,0 +1,11 @@+Goal for the rest of the month is to build automatic recovery git+repository corruption. Spent today investigating how to do it and came up+with a fairly [[detailed_design|design/assistant/disaster_recovery]]. It+will have two parts, first to handle repository problems that can be fixed+by fetching objects from remotes, and secondly to recover from problems+where data never got sent to a remote, and has been lost.++In either case, the assistant should be able to detect the problem and+automatically recover well enough to keep running. Since this also affects+non-git-annex repositories, it will also be available in a standalone+`git-recover-repository` command.
@@ -0,0 +1,54 @@+Built a `git-recover-repository` command today. So far it only does the+detection and deletion of corrupt objects, and retrieves them from remotes+when possible. No handling yet of missing objects that cannot be recovered+from remotes.++Here's a couple of sample runs where I do bad things to the git+repository and it fixes them:++<pre>+joey@darkstar:~/tmp/git-annex>chmod 644 .git/objects/pack/*+joey@darkstar:~/tmp/git-annex>echo > .git/objects/pack/pack-a1a770c1569ac6e2746f85573adc59477b96ebc5.pack +joey@darkstar:~/tmp/git-annex>~/src/git-annex/git-recover-repository +Running git fsck ...+git fsck found a problem but no specific broken objects. Perhaps a corrupt pack file? Unpacking all pack files.+fatal: early EOF+Unpacking objects: 100% (148/148), done.+Unpacking objects: 100% (354/354), done.+Re-running git fsck to see if it finds more problems.+Re-running git fsck to see if it finds more problems.+Initialized empty Git repository in /home/joey/tmp/tmprepo.0/.git/+Trying to recover missing objects from remote origin+Successfully recovered repository!+You should run "git fsck" to make sure, but it looks like+everything was recovered ok.+</pre>++----++<pre>+joey@darkstar:~/tmp/git-annex>chmod 644 .git/objects/00/0800742987b9f9c34caea512b413e627dd718e+joey@darkstar:~/tmp/git-annex>echo > .git/objects/00/0800742987b9f9c34caea512b413e627dd718e+joey@darkstar:~/tmp/git-annex>~/src/git-annex/git-recover-repository +Running git fsck ...+error: unable to unpack 000800742987b9f9c34caea512b413e627dd718e header+error: inflateEnd: stream consistency error (no message)+error: unable to unpack 000800742987b9f9c34caea512b413e627dd718e header+error: inflateEnd: stream consistency error (no message)+git fsck found 1 broken objects. Unpacking all pack files.+removing 1 corrupt loose objects+Re-running git fsck to see if it finds more problems.+Re-running git fsck to see if it finds more problems.+Initialized empty Git repository in /home/joey/tmp/tmprepo.0/.git/+Trying to recover missing objects from remote origin+Successfully recovered repository!+You should run "git fsck" to make sure, but it looks like+everything was recovered ok.+</pre>++Works great! I need to move this and `git-union-merge` out of the git-annex+source tree sometime.++----++Today's work was sponsored by Francois Marier.
@@ -0,0 +1,63 @@+Started work on [gcrypt](https://github.com/blake2-ppc/git-remote-gcrypt)+support.++The first question is, should git-annex leave it up to gcrypt to transport+the data to the encrypted repository on a push/pull? gcrypt hooks into git+nicely to make that just work. However, if I go this route, it limits+the places the encrypted git repositores can be stored to regular git+remotes (and rsync). The alternative is to somehow use gcrypt to+generate/consume the data, but use the git-annex special remotes to store+individual files. Which would allow for a git repo stored on S3, etc.+For now, I am going with the simple option, but I have not ruled out+trying to make the latter work. It seems it would need changes to gcrypt+though.++Next question: Given a remote that uses gcrypt, how do I determine the+annex.uuid of that repository. I found a nice solutuon to this. gcrypt has+its own gcrypt-id, and I convert it to a UUID in a +[[reproducible, and even standards-compliant way|design/gcrypt]]. So+the same encrypted remote will automatically get the same annex.uuid+wherever it's used. Nice. Does mean that git-annex cannot find a uuid+until `git pull` or `git push` has been used, to let gcrypt get the+gcrypt-id. Implemented that.++The next step is actually making git-annex store data on gcrypt remotes.+And it needs to store it encrypted of course. It seems best to avoid+needing a `git annex initremote` for these gcrypt remotes, and just have+git-annex automatically encrypt data stored on them. But I don't+know. Without initializing them like a special remote is, I'm limited to+using the gpg keys that gcrypt is configured to encrypt to, and cannot use+the regular git-annex hybrid encryption scheme. Also, I need to generate+and store a nonce anyway to HMAC ecrypt keys. (Or modify gcrypt+to put enough entropy in gcrypt-id that I can use it?) ++Another concern I have is that gcrypt's own encryption scheme is simply+to use a list of public keys to encrypt to. It would be nicer if the+full set of git-annex encryption schemes could be used. Then the webapp+could use shared encryption to avoid needing to make the user set up a gpg+key, or hybrid encryption could be used to add keys later, etc.++But I see why gcrypt works the way it does. Otherwise, you can't make an+encrypted repo with a friend set as one of the particpants and have them be+able to git clone it. Both hybrid and shared encryption store a secret+inside the repo, which is not accessible if it's encrypted using that+secret. There are use cases where not being able to blindly clone a gcrypt+repo would be ok. For example, you use the assistant to pair with a friend+and then set up an encrypted repo in the cloud for both of you to use.++Anyway, for now, I will need to deal with+setting up gpg keys etc in the assistant. I don't want to tackle+full [[design/assistant/gpgkeys]] yet. Instead, I think I will start by+adding some simple stuff to the assistant:++* When adding a USB drive, offer to encrypt the repository on the drive+ so that only you can see it.+* When adding a ssh remote make a similar offer.+* Add a UI to add an arbitrary git remote with encryption.+ Let the user paste in the url to an empty remote they have,+ which could be to eg github. (In most cases this won't be used for+ annexed content..)+* When the user has no gpg key, prompt to set one up. (Securely!)+* Maybe have an interface to add another gpg key that can access the gcrypt+ repo. Note that this will need to re-encrypt and re-push the whole+ git history.
@@ -0,0 +1,15 @@+Solid day of working on repository recovery. Got `git recover-repository+--force` working, which involves fixing up branches that refer to missing+objects. Mostly straightforward traversal of git commits, trees, blobs, to+find when a branch has a problem, and identify an old version of it that+predates the missing object. (Can also find them in the reflog.) ++The main complication turned out to be that `git branch -D` and `git+show-ref` don't behave very well when the commit objects pointed to by refs+are themselves missing. And git has no low-level plumbing that avoids+falling over these problems, so I had to write it myself.++Testing has turned up one unexpected problem: Git's index can itself refer+to missing objects, and that will break future commits, etc. So I need to+find a way to validate the index, and when it's got problems,+either throw it out, or possibly recover some of the staged data from it.
@@ -0,0 +1,17 @@+I think that git-recover-repository is ready now. Made it deal with the+index file referencing corrupt objects. The best approach I could think of+for that is to just remove those objects from the index, so the user can+re-add files from their work tree after recovery.++Now to integrate this git repository repair capability into the git-annex +assistant. I decided to run `git fsck` as part of a scheduled+repository consistency check. It may also make sense for the assistant to+notice when things are going wrong, and suggest an immediate check. I've+started on the webapp UI to run a repository repair when fsck detects+problems.++[[!img /assistant/brokenrepositoryalert.png]]++[[!img /assistant/repairrepository.png]]++[[!meta title="the user interface I hope noone ever sees"]]
@@ -0,0 +1,35 @@+The webapp now fully handles repairing damage to the repository.++Along with all the git repository repair stuff already built, I added+additional repairs of the git-annex branch and git-annex's index file.+That was pretty easy actually, since git-annex already handles merging+git-annex branches that can sometimes be quite out of date. So when git repo+repair has to throw away recent changes to the git-annex branch, it just+effectively becomes out of date. Added a `git annex fsck --fast` run to+ensure that the git-annex branch reflects the current state of the+repository.++When the webapp runs a repair, it first stops the assistant from committing+new files. Once the repair is done, that's started back up, and it runs a+startup scan, which is just what is needed in this sitation; it will add+any new files, as well as any old files that the git repository damange+caused to be removed from the index.++Also made `git annex repair` run the git repository repair code, +for those with a more command-line bent. It can be used in non-git-annex+repos too!++----++So, I'm nearly ready to wrap up working on disaster recovery. Lots has been+accomplished this month. And I have put off making a release for entirely+too long!++The big missing piece is repair of git remotes located on removable drive.+I may make a release before adding that, but removable drives are probably+where git repository corruption is most likely to occur, so I certainly+need to add that.++----++Today's work was sponsored by Scott Robinson.
@@ -0,0 +1,10 @@+Woke up with a pretty solid plan for gcrypt. It will be structured as a+separate special remote, so `initremote` will be needed, with a gitrepo=+parameter (unless the remote already exists). git-annex will then set up+the git remote, including pushing to it (needed to get a gcrypt-id).++Didn't feel up to implementing that today. Instead I expectedly spent+the day doing mostly Windows work, including setting up a VM on my new+laptop for development. Including a ssh server in Windows, so I can+script local builds and tests on Windows without ever having to+touch the desktop. Much better!
@@ -0,0 +1,7 @@+About half way done with a gcrypt special remote. I can initremote it (the+hard part to get working), and can send files to it. Can't yet get files+back, or remove files, and only local repositories work so far, but this is+enough to know it's going to be pretty nice!++Did find one issue in gcrypt that I may need to develop a patch for:+<https://github.com/blake2-ppc/git-remote-gcrypt/issues/3>
@@ -0,0 +1,8 @@+gcrpyt is fully working now. *Most* of the examples in+[[tips/fully_encrypted_git_repositories_with_gcrypt]] should work.++A few known problems:++* `git annex sync` refuses to sync with gcrypt remotes. some url parsing issue.+* Swapping two drives with gcrypt repositories on the same mount point doesn't work yet.+* http urls are not supported
@@ -0,0 +1,10 @@+Got git annex sync working with gcrypt. So went ahead and made a release+today. Lots of nice new features!++Unfortunately the linux 64 bit daily build is failing, because my build+host only has 2 gb of memory and it is no longer enough. I am looking for a+new build host, ideally one that doesn't cost me $40/month for 3 gb of ram+and 15 gb of disk. (Extra special ideally one that I can run multiple builds+per day on, rather than the current situation of only building overnight to+avoid loading the machine during the day.) Until this is sorted out, no+new 64 bit linux builds..
@@ -0,0 +1,20 @@+I've been out sick. However, some things kept happening. Mesar contributed+a build host, and the linux and android builds are now happening, hourly,+there. (Thanks as well to the two other people who also offered hostng.)+And I made a minor release to fix a bug in the test suite that I was pleased+three different people reported.++Today, my main work was getting git-annex to notice when a gcrypt remote+located on some removable drive mount point is not the same gcrypt remote+that was mounted there before. I was able to finesse this so it+re-configures things to use the new gcrypt remote, as long as it's a+special remote it knows about. (Otherwise it has to ignore the remote.)+So, encrypted repos on removable drives will work just as well as+non-encrypted repos!++Also spent a while with rsync.net tech support trying to work out why+someone's git-annex apparently opened a lot of concurrent ssh connections+to rsync.net. Have not been able to reproduce the problem though.++Also, a lot of catch-up to traffic. Still 63 messages backlogged however,+and still not entirely well..
@@ -0,0 +1,21 @@+Worked to get git-remote-gcrypt included in every git-annex autobuild+bundle.+(Except Windows; running a shell script there may need some work later..)++Next I want to work on making the assistant easily able to create encrypted+git repositories on removable drives. Which will involve a UI to select+which gpg key to use, or creating (and backing up!) a gpg key.++But, I got distracted chasing down some bugs on Windows. These were+quite ugly; more direct mode mapping breakage which resulted in +files not being accessible. Also fsck on Windows failed to detect and fix+the problem. All fixed now. (If you use git-annex on Windows, you should+certianly upgrade and run `git annex fsck`.)++As with most bugs in the Windows port, the underlying cause turned out to+be stupid: `isSymlink` always returned False on Windows. Which makes sense+from the perspective of Windows not quite having anything entirely like+symlinks. But failed when that was being used to detect when files in the+git tree being merged into the repository had the symlink bit set..++Did bug triage. Backlog down to 32 (mostly messages from August).
@@ -0,0 +1,5 @@+I've started a new page for my devblog, since I'm not focusing extensively+on the assistant and so keeping the blog [[here|design/assistant/blog]]+increasingly felt wrong. Also, my new year of+[crowdfunded development](https://campaign.joeyh.name)+formally starts in September, so a new blog seemed good.
@@ -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.+"""]]
@@ -0,0 +1,85 @@+Normally, git-annex repositories consist of symlinks that are checked into+git, and in turn point at the content of large files that is stored in+`.git/annex/objects/`. Direct mode gets rid of the symlinks.++The advantage of direct mode is that you can access files directly,+including modifying them. The disadvantage is that most regular git+commands cannot safely be used, and only a subset of git-annex commands+can be used.++Normally, git-annex repositories start off in indirect mode. With some+exceptions:++* Repositories created by the [[assistant]] use direct mode by default.+* Repositories on FAT and other less than stellar filesystems+ that don't support things like symlinks will be automatically put+ into direct mode.+* Windows always uses direct mode.++## enabling (and disabling) direct mode++Any repository can be converted to use direct mode at any time, and if you+decide not to use it, you can convert back to indirect mode just as easily.+Also, you can have one clone of a repository using direct mode, and another+using indirect mode; direct mode interoperates.++To start using direct mode:++ git annex direct++To stop using direct mode:++ git annex indirect++## safety of using direct mode++With direct mode, you're operating without large swathes of git-annex's+carefully constructed safety net, which ensures that past versions of+files are preserved and can be accessed. +With direct mode, any file can be edited directly, or deleted at any time,+and there's no guarantee that the old version is backed up somewhere else.++So if you care about preserving the history of files, you're strongly+encouraged to tell git-annex that your direct mode repository cannot be+trusted to retain the content of a file. To do so:++ git annex untrust .++On the other hand, if you only care about the current versions of files,+and are using git-annex with direct mode to keep files synchronised between+computers, and manage your files, this should not be a concern for you.++## use a direct mode repository++You can use most git-annex commands as usual in a direct mode repository.+A very few commands don't work in direct mode, and will refuse to do anything.++Direct mode also works well with the git-annex assistant.++The most important command to use in a direct mode repository is `git annex+sync`. This will commit any files you have run `git annex add` on, as well+as files that were added earlier and have been modified. It will push +the changes to other repositories for `git annex sync` there to pick up,+and will pull and merge any changes made on other repositories into the+local repository.++While you generally will just use `git annex sync`, if you want to,+you can use `git commit --staged`, or plain `git commit`.+But not `git commit -a`, or `git commit <file>` ..+that'd commit whole large files into git!++## what doesn't work in direct mode++`git annex status` shows incomplete information. A few other commands,+like `git annex unlock` don't make sense in direct mode and will refuse to+run.++As for git commands, you can probably use some git working tree+manipulation commands, like `git checkout` and `git revert` in useful+ways... But beware, these commands can replace files that are present in+your repository with broken symlinks. If that file was the only copy you+had of something, it'll be lost. ++This is one more reason it's wise to make git-annex untrust your direct mode+repositories. Still, you can lose data using these sort of git commands, so+use extreme caution.
@@ -0,0 +1,12 @@+[[!comment format=mdwn+ username="http://olivier.berger.myopenid.com/"+ nickname="obergix"+ subject="How to sync changes made in another remote when in direct mode"+ date="2013-08-17T21:53:57Z"+ content="""+Re-reading @joey's reponse above, I see that merge/pull don't seem to be safe and will create dangling symlinks. That corresponds to those files I can see on cifs, I guess.++But then, how can a direct repo sync with changes made in other remotes, if there no pull/fetch available.++Can it then be only the source of changes which will propagate to indirect remotes ?+"""]]
@@ -0,0 +1,26 @@+[[!comment format=mdwn+ username="http://www.gl-como.it/author/valhalla/"+ nickname="valhalla"+ subject="Direct mode clone of an indirect repo"+ date="2013-08-18T08:47:35Z"+ content="""+I too have issues with mixing direct and indirect mode repositories.++ I have a regular, existing repository with ebooks, shared between various clones on proper :) filesystems; now I would need a copy of some of them on an ereader which only offers a FAT filesystem, so it has to be direct mode.++ mount $READER+ cd $reader+ git clone $REPO++I get a directory full of small files, the way git manages links on FAT.++ git annex init \"ebook reader\"++This detects the fact that it is working on a crippled filesystem, enables direct mode and disables ssh connection caching; up to now everything seems to be fine, but then++ git annex get $SOME_BOOK++seems to work, downloads the file somewhere, but when I try to open $SOME_BOOK it is still the fake link, and the file has been downloaded in its destination, as if the repo wasn't in direct mode.++I use version 4.20130723 on debian jessie+"""]]
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="4.154.0.63"+ subject="comment 12"+ date="2013-08-23T17:48:54Z"+ content="""+There should be no obstacles to using direct mode on one clone of a git repository, and indirect mode on another clone. The data stored in git for either mode is identical, and I do this myself for some repositories.++@valhalla, you probably need to run `git annex fsck`, and if that does not solve your problem, you need to file a bug report.+"""]]
@@ -0,0 +1,12 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="4.154.0.63"+ subject="comment 13"+ date="2013-08-23T17:50:15Z"+ content="""+@obergix asked:++> But then, how can a direct repo sync with changes made in other remotes, if there no pull/fetch available.++The answer is simple: By running `git annex sync`, which handles all that.+"""]]
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="http://olivier.berger.myopenid.com/"+ nickname="obergix"+ subject="Git annex copy needed before git annex sync"+ date="2013-08-23T19:59:35Z"+ content="""+Thanks for these details @joeyh. But AFAIU, one needs to proceed to the git annex copy before doing the git annex sync, otherwise, symlinks (or files containing the symlink path on SMB) will be created, instead of the plain \"direct\" files that are expected.++I'm still not sure whether the git annex sync needs to be issued on either of the indirect or direct remotes first, or both, then in which sequence. I think a \"walkthrough\" script would help.+"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="4.154.0.63"+ subject="comment 15"+ date="2013-08-24T15:56:47Z"+ content="""+No, you can sync before you copy, get, or whatever. git-annex will replace the symlinks with the actual files when they arrive at the repository.+"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawl2Jj8q2upJL4ZQAc2lp7ugTxJiGtcICv8"+ nickname="Michael"+ subject="comment 1"+ date="2013-02-18T23:24:11Z"+ content="""+So, just which git commands *are* safe? It seems like I'm going to have to use direct mode, so it'd be nice to know just what I'm allowed to do, and what the workflow should be.+"""]]
@@ -0,0 +1,12 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="4.152.108.183"+ subject="safe and unsafe commands"+ date="2013-02-19T02:55:13Z"+ content="""+All git commands that do not change files in the work tee (and do not stage files from the work tree), are safe. I don't have a complete list; it includes `git log`, `git show`, `git diff`, `git commit` (but not -a or with a file as a parameter), `git branch`, `git fetch`, `git push`, `git grep`, `git status`, `git tag`, `git mv` (this one is somewhat surprising, but I've tested it and it's ok)++git commands that change files in the work tree will replace your data with dangling symlinks. This includes things like `git revert`, `git checkout`, `git merge`, `git pull`, `git reset`++git commands that stage files from the work tree will commit your data to git directly. This includes `git add`, `git commit -a`, and `git commit file`+"""]]
@@ -0,0 +1,12 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawl2Jj8q2upJL4ZQAc2lp7ugTxJiGtcICv8"+ nickname="Michael"+ subject="comment 3"+ date="2013-02-19T03:03:14Z"+ content="""+So, if I edit a \"content file\" (change a music file's metadata, say), what's the workflow to record that fact and then synchronise it to other repositories?++I can't do a `git add`, so I don't understand what has to happen as a first step. (Thanks for your quick reply above, BTW.)+++"""]]
@@ -0,0 +1,13 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="4.152.108.183"+ subject="comment 4"+ date="2013-02-19T03:05:35Z"+ content="""+<pre>+git annex add $file+git commit -m changed+git annex sync+git annex copy $file --to otherrepo+</pre>+"""]]
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="mildred"+ ip="2a01:e35:2f7b:8350:225:22ff:fe40:fdfc"+ subject="What happens to object database in direct mode?"+ date="2013-07-08T13:27:21Z"+ content="""+What happens to the object database (`.git/annex/objects`) when going to direct mode? Are the objects deleted, moved to another location, kept?++If the objects are kept, does it means that the file on the repository in direct mode is duplicated in the object database? If so, would it be relevant to use `cp --reflink=auto` to populate the working directory to enable copy on write on filesystems that supports it?+"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="4.153.254.222"+ subject="comment 6"+ date="2013-07-08T16:11:32Z"+ content="""+`.git/annex/objects` does not typically contain any file contents in direct mode. The file contents are stored directly in the working tree.+"""]]
@@ -0,0 +1,12 @@+[[!comment format=mdwn+ username="http://caust1c.myopenid.com/"+ nickname="asbraithwaite"+ subject="comment 7"+ date="2013-08-12T18:06:21Z"+ content="""+Would it be safe to add largefiles to gitignore in direct mode?++Can git-annex still track large files ignored by git?++Thanks. :-)+"""]]
@@ -0,0 +1,9 @@+[[!comment format=mdwn+ username="arand"+ ip="130.243.226.21"+ subject="comment 8"+ date="2013-08-12T18:12:32Z"+ content="""+asbraithwaite:+No, as far as I know it can not.+"""]]
@@ -0,0 +1,12 @@+[[!comment format=mdwn+ username="http://olivier.berger.myopenid.com/"+ nickname="obergix"+ subject="Mixing indirect mode and direct mode on different remotes"+ date="2013-08-17T20:35:40Z"+ content="""+I'd like to have an indirect mode repo on my laptop cloned on a cifs mount point (mounted off an SMB NAS) thus in direct mode. But all I can see on the clone after merge/pull is text files of length 207 chars containg the symlink in plain text.++I guess this is what git manages internally for the symlinks... so I'm afraid git annex doesn't work in such case.++Can you confirm that indirect and direct modes can coexist on clones of the same repo ?+"""]]
@@ -0,0 +1,21 @@+In git, there can be multiple clones of a repository, each clone can +be independently modified, and clones can push or pull changes to+one-another to get back in sync.++git-annex preserves that fundamental distributed nature of git, while+dropping the requirement that, once in sync, each clone contains all the data+that was committed to each other clone. Instead of storing the content+of a file in the repository, git-annex stores a pointer to the content.++Each git-annex repository is responsible for storing some of the content,+and can copy it to or from other repositories. [[Location_tracking]]+information is committed to git, to let repositories inform other+repositories what file contents they have available.++---++The [[walkthrough]] shows how to create a distributed set of git-annex+repositories with no central repository.++Prefer a central repository like GitHub? See the+[[tips/centralized_git_repository_tutorial]].
@@ -0,0 +1,40 @@+The main git repository for git-annex is `git://git-annex.branchable.com/`++(You can push changes to this wiki from that anonymous git checkout.)++Other mirrors of the git repository:++* `git://git.kitenet.net/git-annex` [[gitweb](http://git.kitenet.net/?p=git-annex.git;a=summary)]+* [at github](https://github.com/joeyh/git-annex)++Releases of git-annex are uploaded+[to hackage](http://hackage.haskell.org/package/git-annex). Get your+tarballs there, if you need them.++Some operating systems include git-annex in easily prepackaged form and+others need some manual work. See [[install]] for details.++## git branches++The git repository has some branches:++* `ghc7.0` supports versions of ghc older than 7.4, which+ had a major change to filename encoding.+* `old-monad-control` is for systems that don't have a newer monad-control+ library.+* `no-ifelse` avoids using the IFelse library+ (merge it into master if you need it)+* `no-bloom` avoids using bloom filters. (merge it into master if you need it)+* `no-s3` avoids using the S3 library (merge it into master if you need it)+* `debian-stable` contains the latest backport of git-annex to Debian+ stable.+* `tweak-fetch` adds support for the git tweak-fetch hook, which has+ been proposed and implemented but not yet accepted into git.+* `setup` contains configuration for this website+* `pristine-tar` contains [pristine-tar](http://kitenet.net/~joey/code/pristine-tar)+ data to create tarballs of any past git-annex release.++----++Developing git-annex? Patches are very welcome.+You should read [[coding_style]].
@@ -0,0 +1,13 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawm3uJkdiJJejvqix9dULvw_Ma7DCtB-6zA"+ nickname="Ian"+ subject="git clone git://git-annex.branchable.com/ gives an error"+ date="2012-08-13T20:57:34Z"+ content="""+Thought you would want to know++error: unable to create file doc/forum/__91__Installation__93___base-3.0.3.2_requires_syb___61____61__0.1.0.2_however_syb-0.1.0.2_was_excluded_because_json-0.5_requires_syb___62____61__0.3.3.mdwn (File name too long)+fatal: cannot create directory at 'doc/forum/__91__Installation__93___base-3.0.3.2_requires_syb___61____61__0.1.0.2_however_syb-0.1.0.2_was_excluded_because_json-0.5_requires_syb___62____61__0.3.3': File name too long+++"""]]
@@ -0,0 +1,7 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ subject="comment 2"+ date="2012-08-16T23:28:30Z"+ content="""+Ok, I've renamed that long-ish filename.+"""]]
@@ -0,0 +1,99 @@+git-annex mostly does not use encryption. Anyone with access to a git+repository can see all the filenames in it, its history, and can access+any annexed file contents.++Encryption is needed when using [[special_remotes]] like Amazon S3, where+file content is sent to an untrusted party who does not have access to the+git repository.++Such an encrypted remote uses strong ([[symmetric|design/encryption]] or+asymmetric) encryption on the contents of files, as well as HMAC hashing+of the filenames. The size of the encrypted files, and access patterns+of the data, should be the only clues to what is stored in such a+remote.++You should decide whether to use encryption with a special remote before+any data is stored in it. So, `git annex initremote` requires you+to specify "encryption=none" when first setting up a remote in order+to disable encryption. To use encryption, you run +run `git-annex initremote` in one of these ways:++* `git annex initremote newremote type=... encryption=hybrid keyid=KEYID ...`+* `git annex initremote newremote type=... encryption=shared`+* `git annex initremote newremote type=... encryption=pubkey keyid=KEYID ...`++## hybrid encryption keys++The [[hybrid_key_design|design/encryption]] allows additional+encryption keys to be added on to a special remote later. Due to this+flexability, it is the default and recommended encryption scheme.+ + git annex initremote newremote type=... [encryption=hybrid] keyid=KEYID ...++Here the KEYID(s) are passed to `gpg` to find encryption keys. +Typically, you will say "keyid=2512E3C7" to use a specific gpg key.+Or, you might say "keyid=joey@kitenet.net" to search for matching keys.++To add a new key and allow it to access all the content that is stored+in the encrypted special remote, just run `git annex+enableremote` specifying the new encryption key:++ git annex enableremote myremote keyid+=788A3F4C++While a key can later be removed from the list, note that+that will **not** necessarily prevent the owner of the key+from accessing data on the remote (which is by design impossible to prevent,+short of deleting the remote). In fact the only sound use of `keyid-=` is+probably to replace a revoked key:++ git annex enableremote myremote keyid-=2512E3C7 keyid+=788A3F4C++See also [[encryption_design|design/encryption]] for other security+risks associated with encryption.++## shared encryption key++Alternatively, you can configure git-annex to use a shared cipher to+encrypt data stored in a remote. This shared cipher is stored,+**unencrypted** in the git repository. So it's shared among every+clone of the git repository. + + git annex initremote newremote type=... encryption=shared++The advantage is you don't need to set up gpg keys. The disadvantage is+that this is **insecure** unless you trust every clone of the git+repository with access to the encrypted data stored in the special remote.++## regular public key encryption++This alternative simply encrypts the files in the special remotes to one or+more public keys. It might be considered more secure due to its simplicity+and since it's exactly the way everyone else uses gpg.++ git annex initremote newremote type=.... encryption=pubkey keyid=KEYID ...++A disavantage is that is not easy to later add additional public keys+to the special remote. While the `enableremote` parameters `keyid+=` and+`keyid-=` can be used, they have **no effect** on files that are already+present on the remote. Probably the only use for these parameters is +to replace a revoked key:++ git annex enableremote myremote keyid-=2512E3C7 keyid+=788A3F4C++But even in this case, since the files are not re-encrypted, the revoked+key has to be kept around to be able to decrypt those files.+(Of course, if the reason for revocation is+that the key has been compromised, it is **insecure** to leave files+encrypted using that old key, and the user should re-encrypt everything.)++(Because filenames are MAC'ed, a cipher still needs to be+generated (and encrypted to the given key IDs).)++## MAC algorithm++The default MAC algorithm to be applied on the filenames is HMACSHA1. A+stronger one, for instance HMACSHA512, one can be chosen upon creation+of the special remote with the option `mac=HMACSHA512`. The available+MAC algorithms are HMACSHA1, HMACSHA224, HMACSHA256, HMACSHA384, and+HMACSHA512. Note that it is not possible to change algorithm for a+non-empty remote.
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="zooko"+ ip="75.220.153.232"+ subject="Tahoe-LAFS comes with encryption"+ date="2011-05-18T04:32:14Z"+ content="""+The Tahoe-LAFS special remote automatically encrypts and adds cryptography integrity checks/digital signatures. For that special remote you should not use the git-annex encryption scheme.++Tahoe-LAFS encryption generates a new independent key for each file. This means that you can share access to one of the files without thereby sharing access to all of them, and it means that individual files can be deduplicated among multiple users.+"""]]
@@ -0,0 +1,4 @@+Aggregating git-annex mentions from elsewhere on the net..++* [[!aggregate expirecount=25 name="twitter" feedurl="http://tmp.kitenet.net/git-annex-twitter.rss" url="http://search.twitter.com/search.atom?q=git-annex"]]+
@@ -0,0 +1,7 @@+### Recent [[news]]++[[!inline pages="news/* and !*/Discussion" archive=yes show=2 feeds=no]]++### [[devblog|devblog]]++[[!inline pages="devblog/* and !*/Discussion" archive=yes show=5 feeds=no]]
@@ -0,0 +1,7 @@+### Recent [[videos]]++[[!inline pages="videos/* and !*/Discussion" archive=yes show=2 feeds=no]]++### Recent [[forum posts|forum]]++[[!inline pages="forum/* and !*/Discussion" archive=yes show=5 feeds=no]]
@@ -0,0 +1,8 @@+This is a place to discuss using git-annex.+If you need help, advice, or anything, post about it here.++But, please don't post bug reports here. Put them in [[bugs]]. +And please don't make wishlist requests here. Put them in [[todo]]. +(If you post bugs/todo here, it'll just get moved.)++[[!inline pages="forum/* and !*/Discussion" archive=yes rootpage=forum postformtext="Add a new thread titled:"]]
@@ -0,0 +1,3 @@+Sorry, but all this wiki and the manpage seem to gloss over the most obvious question:++What happens when you commit conflicting edits in different repositories?
@@ -0,0 +1,11 @@+Using the assistant, I have created a repository on my laptop plus a synced repository on a USB disk. Looking into the first repository, I see my files accompanied by a .git directory. However, looking on the USB disk (e.g. /media/usb/annex), all I see is what looks like the content of a .git directory.++This means that it is difficult to retrieve any file directly from this disk -- it has to be synced to another local repository first.++Is there any way to change this ? E.g. to have a copy of the working tree, plus a .git directory, on the disk ?++My use case: I have added plenty of media files to my repository. In addition to using the USB disk as a backup/medium for transfering these files to another computer, I'd like to be able to plug the disk to e.g. a media player and read the files directly from the tree, but it does not work at the moment.++Is there anything I am missing ?++Edited: yes, there is something I was missing: the forum entry at [[forum/USB_backup_with_files_visible/]]
@@ -0,0 +1,5 @@+I have set up a remote server repository using the git-annex web assistant, accessed via ssh. The repository is a bare one according to the config file in the annex directory on the server.++I am wondering how I could access any of the files in the repository while logged in to the server - they don't have their usual file names to look for clearly. Is there a way to get a list of the files for starters? I tried using git annex find, but it never returns any files. git annex get followed by a filename of a document in the repository also doesn't work.++Thanks to help me understand better how to approach this.
@@ -0,0 +1,16 @@+Hello,++I am just starting to learn git-annex so forgive me if this is a naive question.++I have the following repositories:++1. Home (laptop)+2. Work (mac mini)+3. S3 bucket+4. USB drive, full backup, attached to Home laptop.++I want to sync files between Home and Work via the S3 bucket. It is not clear to me how to accomplish this through the git-annex assistant. Is this possible? Are there instructions online?++Thanks in advance!++Scott
@@ -0,0 +1,3 @@+While running the Git Annex App on Android, the app causes a constant cpu usage of about 50% when idling. I've seen this behavior on two devices (phone and tablet) with a CM 10.1 nightly build. The app causes this high cpu usage even when it is in the background, not performing any synchronization and managing only one repository containing just one file. Unfortunately I couldn't figure out what causes the cpu usage. The daemon.log file remains unchanged and I couldn't find any other log files.++Is this expected behavior or unusual high cpu usage?
@@ -0,0 +1,12 @@+Joey,++I have git-annex now to manage many of the repositories on my system. I have them both on my local machine, and on a very large file server, and a backup system on the Internet.++Today I went to look at a file in one of my annexes and it wasn't there. This really surprised me. But what surprised me most is that around 90% of the files in *all* of my annexes on both my local system and my file server are completely missing. Only the Internet backup system has them.++How could something like this happen, when I haven't been interacting with these annexes at all during this time? Can you think of any scenario that might lead to this? This is pretty much the absolute worst case scenario for an archival data system.++I am running on Mac OS X 10.8, using GHC 7.6.3 to build git-annex, and I keep my git-annex binary updated often.++Thanks,+ John
@@ -0,0 +1,12 @@+It seems like one of my repos dropped files by itself, my setup involved 3 distributed repos (non bare repos, not using assistant), A/B/C then one client died I've created another one in its place called D cloned from B and marked C as dead. I have now A/B/D. I have updated files in A synced it to D (central) I then tried dropping unused, it listed none (I've dropped the files from A which has full copy) at this point I thought B did not sync to it maybe thats why it did not drop them. I went home sync my laptop B (B dropped its share of unused files) but cental D still show no unused. ++A-D has full copies of the repo+B has partial.++At this point I checked out a old commit from a week ago, checked where the links for the files are pointing to, they point to no where files are not there. Repo sized reported with du -hcs show both repos are the same size (132GB) looks like D managed to drop unused files by itself. I am wondering what caused this?++My annex version is,++git-annex version: 4.20130902-g307537a++on all clients.
@@ -0,0 +1,11 @@+I have large central repositories of data. Therefore, on each client I want to save part data(to save space of disk). In command line I do ++ [...]+ git-annex webapp+ git-annex drop [DeleteContentDirectory]+ [...]++After this command Assistant performs automatic synchronization getting content of files from this directory(DeleteContentDirectory), but I don't want. I want it's was only symlink of file in this directory.++How can I configure Assistant which files have to get content on the client? It's possible?+
@@ -0,0 +1,15 @@+I have 3 remotes for an annex - one on my laptop, one on a USB drive that's plugged in 50% of the time, and an rsync special remote on a friend's machine that I can access using SSH.++I have tried various things (annex copy, numcopies=3) to make it move data to the rsync remote, but it doesn't seem to want to work. I have tried git annex sync. I added the remote repo using the webapp, and it looked as if it was copying my files for a bit then stopped. I have the remote repo setup as a backup in the webapp.++The sizes of the directorys:+ ~ $ du -sh Documents+ 126M Documents+ ~ $ du -sh /Volumes/Backup/Documents+ 227M /Volumes/Backup/Documents++and the remote+ [c0g@womb Tom]$ du -sh MacDocuments/+ 21M MacDocuments/++I'm also curious as to why the usb drive repo is so much bigger than the thing I'm copying, but I'll worry about that later.
@@ -0,0 +1,17 @@+I've been toying with the idea of auto archiving files (that is - removing them from .) based on a set of rules.++Git already provides attribute management for files and I put together a simple script that tries to achieve the following:++* Look for files with X copies (including a local one)+* Verify that the file is not recent (defined as not having been dropped or getted within X days )+* Verify that the file has an annex.archive attribute+* Archive if the above is met++Here is the script:+http://pastebin.com/53iLqyPd++You just add the annex.archive attribute to files via .gitattributes to use++The script runs in preview mode... exec with autoArchive.sh commit to drop the files.++Open to thoughts / suggestions
@@ -0,0 +1,1 @@+Not really important (who reads git annex commit messages anyways ;-)), but nice to have and maybe a nice task for someone who wants to play around with Haskell and git annex: It would be shiny if the auto-commit done by git annex sync would automatically create a sensible commmit message and description. E.g. if just one file is added, it could say „Added blubb“. If a few files are added, it could say „Added blubb, bla and n other files“, based on the file name length, and list the files in the long description. Lots of room for playing around :-)
@@ -0,0 +1,14 @@+I would like to use git annex between two locations (work and home) where essentially the two computers are never on at the same time.++I have set up a special remote (S3) to cater for file transfer between the sites, but still need some way of syncronising the git repositories between them.+I have access to a git server, but which doesn't have git-annex on it. So, I think that is all the components I need to get this working.++However, I don't want to have to manually sync my computers with the central server, so I would like the assistant to do it for me, in what is essentially the complement of the special remote.++What is the best way to accomplish this? I guess that this is a general git question, not specific to git annex.+I see some solutions [[http://stackoverflow.com/questions/3583061/automatically-mirror-a-git-repository]], but my git isn't really up to evaluating the options properly.++So, what do other people do in this situation? +++--Walter
@@ -0,0 +1,13 @@+The current behaviour of 'fsck' is a bit verbose. I have an annex'd directory of tarballs for my own build system for "science" applications, there's about ~600 or so blobs in my repo, I do occassionally like to run fsck across all my data to see what files don't meet the min num copies requirement that I have set.++Would it be better for the default behaviour of fsck when it has not been given a path to only output errors and not bother to show that a file is ok for every single file in a repo. i.e.++ git annex fsck++should show only 'errors' and maybe a simple indicator showing the status (show a spinner or dots?) and when ++ git annex fsck PATH/FILE ++it should have the current behaviour? ++Right now the current fsck behaviour might get annoying for anyone who would want to run fsck with repos with lots of big files.
@@ -0,0 +1,18 @@+I have a bunch of removable storage devices and was planning on storing my data across+all of them. I've run into an annoyance, and would like to see if anybody has any+ideas.++My goal was to have the full file tree on all the devices, but only a subset of the+annexed data. Where I have run into trouble is removing data from the system. It+seems that the "git annex unused" command checks remote branches as well as local ones+when determining whether an object is referred to.++This means that if I remove a file that is stored locally, "git annex unused" doesn't+report the corresponding object as unused until I either connect and update all+removable storage *or* remove the remote corresponding to the removable storage. I+posted a bug about this inconsistency named+[[bugs/git annex unused considers remote branches which makes it inconsistent]].++If I used the removable storage as a special remote, then I wouldn't have this issue,+but I also wouldn't be able to conveniently use the files on it and manage the repo+from it either.
@@ -0,0 +1,72 @@+I've been experiencing problems with Box.com for a few days now and I don't know what's causing them. Is anyone else experiencing anything similar?++I paste the log.++ [2013-09-02 12:27:26 CEST] TransferWatcher: transfer finishing: Transfer {transferDirection = Upload, transferUUID = UUID "72111b4c-28fe-42fd-a77b-e4cb9240a1c9", transferKey = Key {keyName = "c9e1d5421e78924c21e3d68e84f80a8d1f64f9488020107ca0eeee0c4f10e763.py", keyBackendName = "SHA256E", keySize = Just 1891, keyMtime = Nothing}}+ [2013-09-02 12:27:26 CEST] TransferScanner: queued Upload UUID "72111b4c-28fe-42fd-a77b-e4cb9240a1c9" Documentos/diveintopython-5.4/py/kgp/kant.xml Nothing : expensive scan found missing object+ [2013-09-02 12:27:26 CEST] Transferrer: Transferring: Upload UUID "72111b4c-28fe-42fd-a77b-e4cb9240a1c9" Documentos/diveintopython-5.4/py/argecho.py Nothing+ [2013-09-02 12:27:26 CEST] TransferWatcher: transfer starting: Upload UUID "72111b4c-28fe-42fd-a77b-e4cb9240a1c9" Documentos/diveintopython-5.4/py/argecho.py Nothing+ [2013-09-02 12:27:26 CEST] TransferWatcher: transfer starting: Upload UUID "72111b4c-28fe-42fd-a77b-e4cb9240a1c9" Documentos/diveintopython-5.4/py/argecho.py Nothing+ + + 100% 0.0 B/s 0s[2013-09-02 12:27:26 CEST] TransferWatcher: transfer starting: Upload UUID "72111b4c-28fe-42fd-a77b-e4cb9240a1c9" Documentos/diveintopython-5.4/py/argecho.py Just 437+ ResponseTimeout+ ResponseTimeout+ + + [2013-09-02 12:27:44 CEST] TransferWatcher: transfer finishing: Transfer {transferDirection = Upload, transferUUID = UUID "72111b4c-28fe-42fd-a77b-e4cb9240a1c9", transferKey = Key {keyName = "dd3cc45d91430c6f7d68eb807f4ac1561cd0297b11a2de77b5fe66017d125798.py", keyBackendName = "SHA256E", keySize = Just 437, keyMtime = Nothing}}+ [2013-09-02 12:27:44 CEST] TransferScanner: queued Upload UUID "72111b4c-28fe-42fd-a77b-e4cb9240a1c9" Documentos/diveintopython-5.4/py/kgp/kgp.dtd Nothing : expensive scan found missing object+ [2013-09-02 12:27:44 CEST] Transferrer: Transferring: Upload UUID "72111b4c-28fe-42fd-a77b-e4cb9240a1c9" Documentos/diveintopython-5.4/py/autosize.py Nothing+ [2013-09-02 12:27:44 CEST] TransferWatcher: transfer starting: Upload UUID "72111b4c-28fe-42fd-a77b-e4cb9240a1c9" Documentos/diveintopython-5.4/py/autosize.py Nothing+ [2013-09-02 12:27:44 CEST] TransferWatcher: transfer starting: Upload UUID "72111b4c-28fe-42fd-a77b-e4cb9240a1c9" Documentos/diveintopython-5.4/py/autosize.py Nothing+ + + 100% 0.0 B/s 0s[2013-09-02 12:27:44 CEST] TransferWatcher: transfer starting: Upload UUID "72111b4c-28fe-42fd-a77b-e4cb9240a1c9" Documentos/diveintopython-5.4/py/autosize.py Just 2861+ ResponseTimeout+ ResponseTimeout+ + + [2013-09-02 12:28:02 CEST] TransferWatcher: transfer finishing: Transfer {transferDirection = Upload, transferUUID = UUID "72111b4c-28fe-42fd-a77b-e4cb9240a1c9", transferKey = Key {keyName = "d6b7940ac68768a8e37e72f248e2d94f19fb0d47062084d9baf0ec08cebbf692.py", keyBackendName = "SHA256E", keySize = Just 2861, keyMtime = Nothing}}+ [2013-09-02 12:28:02 CEST] TransferScanner: queued Upload UUID "72111b4c-28fe-42fd-a77b-e4cb9240a1c9" Documentos/diveintopython-5.4/py/kgp/kgp.py Nothing : expensive scan found missing object+ [2013-09-02 12:28:02 CEST] Transferrer: Transferring: Upload UUID "72111b4c-28fe-42fd-a77b-e4cb9240a1c9" Documentos/diveintopython-5.4/py/builddialectexamples.py Nothing+ [2013-09-02 12:28:03 CEST] TransferWatcher: transfer starting: Upload UUID "72111b4c-28fe-42fd-a77b-e4cb9240a1c9" Documentos/diveintopython-5.4/py/builddialectexamples.py Nothing+ [2013-09-02 12:28:03 CEST] TransferWatcher: transfer starting: Upload UUID "72111b4c-28fe-42fd-a77b-e4cb9240a1c9" Documentos/diveintopython-5.4/py/builddialectexamples.py Nothing+ + + 100% 0.0 B/s 0s[2013-09-02 12:28:03 CEST] TransferWatcher: transfer starting: Upload UUID "72111b4c-28fe-42fd-a77b-e4cb9240a1c9" Documentos/diveintopython-5.4/py/builddialectexamples.py Just 1090+ ResponseTimeout+ ResponseTimeout+ + + [2013-09-02 12:28:21 CEST] TransferWatcher: transfer finishing: Transfer {transferDirection = Upload, transferUUID = UUID "72111b4c-28fe-42fd-a77b-e4cb9240a1c9", transferKey = Key {keyName = "f1492b80d05b96cc7cf2904d461c99d430fa86a4eb1d99f1b155c9147ff4420f.py", keyBackendName = "SHA256E", keySize = Just 1090, keyMtime = Nothing}}+ [2013-09-02 12:28:21 CEST] TransferScanner: queued Upload UUID "72111b4c-28fe-42fd-a77b-e4cb9240a1c9" Documentos/diveintopython-5.4/py/kgp/russiansample.xml Nothing : expensive scan found missing object+ [2013-09-02 12:28:21 CEST] Transferrer: Transferring: Upload UUID "72111b4c-28fe-42fd-a77b-e4cb9240a1c9" Documentos/diveintopython-5.4/py/colorize.py Nothing+ [2013-09-02 12:28:21 CEST] TransferWatcher: transfer starting: Upload UUID "72111b4c-28fe-42fd-a77b-e4cb9240a1c9" Documentos/diveintopython-5.4/py/colorize.py Nothing+ [2013-09-02 12:28:21 CEST] TransferWatcher: transfer starting: Upload UUID "72111b4c-28fe-42fd-a77b-e4cb9240a1c9" Documentos/diveintopython-5.4/py/colorize.py Nothing+ + + 100% 0.0 B/s 0s[2013-09-02 12:28:21 CEST] TransferWatcher: transfer starting: Upload UUID "72111b4c-28fe-42fd-a77b-e4cb9240a1c9" Documentos/diveintopython-5.4/py/colorize.py Just 4864+ ResponseTimeout+ ResponseTimeout+ + + [2013-09-02 12:28:40 CEST] TransferWatcher: transfer finishing: Transfer {transferDirection = Upload, transferUUID = UUID "72111b4c-28fe-42fd-a77b-e4cb9240a1c9", transferKey = Key {keyName = "b577eaf8b6ddbf9fef866c455cae248aec3b22e3f2e91aa2b75ece90f1801689.py", keyBackendName = "SHA256E", keySize = Just 4864, keyMtime = Nothing}}+ [2013-09-02 12:28:40 CEST] TransferScanner: queued Upload UUID "72111b4c-28fe-42fd-a77b-e4cb9240a1c9" Documentos/diveintopython-5.4/py/kgp/stderr.py Nothing : expensive scan found missing object+ [2013-09-02 12:28:40 CEST] Transferrer: Transferring: Upload UUID "72111b4c-28fe-42fd-a77b-e4cb9240a1c9" Documentos/diveintopython-5.4/py/dialect.py Nothing+ [2013-09-02 12:28:40 CEST] TransferWatcher: transfer starting: Upload UUID "72111b4c-28fe-42fd-a77b-e4cb9240a1c9" Documentos/diveintopython-5.4/py/dialect.py Nothing+ [2013-09-02 12:28:40 CEST] TransferWatcher: transfer starting: Upload UUID "72111b4c-28fe-42fd-a77b-e4cb9240a1c9" Documentos/diveintopython-5.4/py/dialect.py Nothing+ + + 100% 0.0 B/s 0s[2013-09-02 12:28:40 CEST] TransferWatcher: transfer starting: Upload UUID "72111b4c-28fe-42fd-a77b-e4cb9240a1c9" Documentos/diveintopython-5.4/py/dialect.py Just 4449+ ResponseTimeout+ ResponseTimeout+ + + [2013-09-02 12:28:58 CEST] TransferWatcher: transfer finishing: Transfer {transferDirection = Upload, transferUUID = UUID "72111b4c-28fe-42fd-a77b-e4cb9240a1c9", transferKey = Key {keyName = "c5e5d9b1bee2710c7ed05270a363d3e93270b0fb6779c4c8d59ace06c11db684.py", keyBackendName = "SHA256E", keySize = Just 4449, keyMtime = Nothing}}+ [2013-09-02 12:28:58 CEST] TransferScanner: queued Upload UUID "72111b4c-28fe-42fd-a77b-e4cb9240a1c9" Documentos/diveintopython-5.4/py/kgp/stdout.py Nothing : expensive scan found missing object+ [2013-09-02 12:28:58 CEST] Transferrer: Transferring: Upload UUID "72111b4c-28fe-42fd-a77b-e4cb9240a1c9" Documentos/diveintopython-5.4/py/fibonacci.py Nothing+ [2013-09-02 12:28:58 CEST] TransferWatcher: transfer starting: Upload UUID "72111b4c-28fe-42fd-a77b-e4cb9240a1c9" Documentos/diveintopython-5.4/py/fibonacci.py Nothing+ [2013-09-02 12:28:58 CEST] TransferWatcher: transfer starting: Upload UUID "72111b4c-28fe-42fd-a77b-e4cb9240a1c9" Documentos/diveintopython-5.4/py/fibonacci.py Nothing+++ 100% 0.0 B/s 0s[2013-09-02 12:28:58 CEST] TransferWatcher: transfer starting: Upload UUID "72111b4c-28fe-42fd-a77b-e4cb9240a1c9" Documentos/diveintopython-5.4/py/fibonacci.py Just 532
@@ -0,0 +1,27 @@+I'd like to have a Debian/Ubuntu package of the latest git-annex (f.e. to have it installed systemwide). In the source I can find the debian/ folder with all needed information to build the package. But it looks like I don't have all needed dependencies on my Ubuntu 12.10:++ user@laptop(pc) ~/src/git/git-annex (git)-[master] % debuild -us -uc+ dpkg-buildpackage -rfakeroot -D -us -uc+ dpkg-buildpackage: source package git-annex+ dpkg-buildpackage: source version 3.20130115+ dpkg-buildpackage: source changed by Joey Hess <joeyh@debian.org>+ dpkg-source --before-build git-annex+ dpkg-buildpackage: host architecture amd64+ dpkg-checkbuilddeps: Unmet build dependencies: libghc-dav-dev (>= 0.3) libghc-dbus-dev (>= 0.10.3) libghc-yesod-dev libghc-yesod-static-dev libghc-yesod-default-dev libghc-hamlet-dev libghc-clientsession-dev libghc-warp-dev libghc-wai-dev libghc-wai-logger-dev libghc-case-insensitive-dev libghc-http-types-dev libghc-blaze-builder-dev libghc-crypto-api-dev libghc-network-multicast-dev libghc-network-info-dev libghc-safesemaphore-dev libghc-network-protocol-xmpp-dev (>= 0.4.3-1+b1) libghc-gnutls-dev (>= 0.1.4) libghc-xml-types-dev+ dpkg-buildpackage: warning: build dependencies/conflicts unsatisfied; aborting+ dpkg-buildpackage: warning: (Use -d flag to override.)+ debuild: fatal error at line 1357:+ dpkg-buildpackage -rfakeroot -D -us -uc failed+ user@laptop(pc) ~/src/git/git-annex (git)-[master] % apt-get install libghc-dav-dev libghc-dbus-dev libghc-yesod-dev libghc-yesod-static-dev libghc-yesod- default-dev libghc-hamlet-dev libghc-clientsession-dev libghc-warp-dev libghc-wai-dev libghc-wai-logger-dev libghc-case-insensitive-dev libghc-http-types-dev libghc-blaze-builder-dev libghc-crypto-api-dev libghc-network-multicast-dev libghc-network-info-dev libghc-safesemaphore-dev libghc-network-protocol-xmpp-dev libghc-gnutls-dev libghc-xml-types-dev+ Reading package lists... Done+ Building dependency tree + Reading state information... Done+ E: Unable to locate package libghc-dav-dev+ E: Unable to locate package libghc-network-multicast-dev+ E: Unable to locate package libghc-network-info-dev+ E: Unable to locate package libghc-safesemaphore-dev++How can I build the package? Or would it be possible for you to build the package and add it to the "Install" page (like the prebuilt linux tarball)? That would be great!++Cheers and thanks for the hard work,+Tobias
@@ -0,0 +1,78 @@+Hi,++I have Problems building git-annex-3.20121112-19309, I rceive the following error:++...+ Loading object (static) dist/build/git-annex/git-annex-tmp/Utility/libmounts.o ... done+ final link ... done++ Assistant/Alert.hs:66:30:+ Warning: default newline style has changed, using an explicit $newline is recommended++ Assistant/Alert.hs:69:31:+ Warning: default newline style has changed, using an explicit $newline is recommended+ [157 of 279] Compiling Assistant.Types.DaemonStatus ( Assistant/Types/DaemonStatus.hs, dist/build/git-annex/git-annex-tmp/Assistant/Types/DaemonStatus.o )+ [158 of 279] Compiling Assistant.Monad ( Assistant/Monad.hs, dist/build/git-annex/git-annex-tmp/Assistant/Monad.o )++ Assistant/Monad.hs:86:16:+ Couldn't match expected type `Assistant a'+ with actual type `Reader AssistantData a'+ Expected type: (AssistantData -> a) -> Assistant a+ Actual type: (AssistantData -> a) -> Reader AssistantData a+ In the expression: reader+ In an equation for `getAssistant': getAssistant = reader++ Assistant/Monad.hs:93:15:+ Couldn't match expected type `Assistant t0'+ with actual type `Reader r0 a0'+ In the return type of a call of `reader'+ In a stmt of a 'do' block: st <- reader threadState+ In the expression:+ do { st <- reader threadState;+ liftIO $ runThreadState st a }++ Assistant/Monad.hs:99:14:+ Couldn't match expected type `Assistant t0'+ with actual type `Reader r0 a0'+ In the return type of a call of `reader'+ In a stmt of a 'do' block: d <- reader id+ In the expression:+ do { d <- reader id;+ liftIO $ io $ runAssistant d a }++ Assistant/Monad.hs:105:14:+ Couldn't match expected type `Assistant t0'+ with actual type `Reader r0 a0'+ In the return type of a call of `reader'+ In a stmt of a 'do' block: d <- reader id+ In the expression:+ do { d <- reader id;+ return $ runAssistant d a }++ Assistant/Monad.hs:110:14:+ Couldn't match expected type `Assistant t0'+ with actual type `Reader r0 a0'+ In the return type of a call of `reader'+ In a stmt of a 'do' block: d <- reader id+ In the expression:+ do { d <- reader id;+ return $ \ v -> runAssistant d $ a v }++ Assistant/Monad.hs:115:14:+ Couldn't match expected type `Assistant t0'+ with actual type `Reader r0 a0'+ In the return type of a call of `reader'+ In a stmt of a 'do' block: d <- reader id+ In the expression:+ do { d <- reader id;+ return $ \ v1 v2 -> runAssistant d (a v1 v2) }++ Assistant/Monad.hs:120:12:+ Couldn't match expected type `Assistant a0'+ with actual type `Reader r0 a1'+ In the return type of a call of `reader'+ In the first argument of `(>>=)', namely `reader v'+ In the expression: reader v >>= liftIO . io+ cabal: Error: some packages failed to install:+ git-annex-3.20121112 failed during the building phase. The exception was:+ ExitFailure 1
@@ -0,0 +1,19 @@+Hi,++I try to install git-annex master with cabal, so I cloned the git repo and run "cabal install --only-dependencies". This gives me the following error:++ Resolving dependencies...+ cabal: Could not resolve dependencies:+ trying: git-annex-3.20120826 (user goal)+ trying: git-annex-3.20120826:+oldyesod+ trying: git-annex-3.20120826:+currentyesod+ next goal: yesod-default (dependency of git-annex-3.20120826:+oldyesod)+ rejecting: yesod-default-1.1.0 (conflict: git-annex-3.20120826:oldyesod =>+ yesod-default(<=1.0.1.1))+ rejecting: yesod-default-1.0.1.1, 1.0.1, 1.0.0, 0.6.1, 0.5.0, 0.4.1, 0.4.0,+ 0.3.1 (conflict: git-annex-3.20120826:currentyesod => yesod-default(>=1.1.0))++Any idea how to fix this? (PS: I'm running Kubuntu 12.04)++Cheers,+Tobias
@@ -0,0 +1,1 @@+I threw together a pair of shell scripts for calculating the cost of a remote using ping times. I don't know how useful this is in practice, but the theory seemed sound to me. If I'm in a hotel room with my two laptops, I'd rather annex try to get a file from the other laptop than from my NAS all the way back home. I'd love to figure out how to also detect if I'm on my VerizonWireless connection at the time and multiply the cost of all connections over the Internet accordingly, but that's down the road. Latest versions of the pair of scripts will be at <https://gist.github.com/4410357>. I'm interested in feedback, so please fork the git repo on gist and send me changes/updates. Also of note is that these were written for MacOSX. If you're interested in using them on a different linux, pay attention to the format of the summary line of your ping command.
@@ -0,0 +1,41 @@+I'm trying to automate syncing of two repos A and B. My goal is to run `git annex sync` from A and have the working copy of B updated automatically. According to the manual page, `git annex merge` should to the trick. It works just fine when I run it manually in B, but not when I run it from the post-receive hook, as suggested in the manual page.++Here is a test script that illustrates the issue: <https://gist.github.com/anonymous/6197019>++The output I get:++ [...]+ file1 exists after manual git annex merge+ [...]+ file2 does not exist after git annex merge in post-receive++From the output I can see that `git annex merge` is run on the remote end, and seems to do it's thing (`file2` is added):++ remote: merge git-annex (merging synced/git-annex into git-annex...)+ remote: ok+ remote: merge synced/master Updating 6e5bfba..0dcbcfd+ remote: Fast-forward+ remote: file2 | 1 ++ remote: 1 file changed, 1 insertion(+)+ remote: create mode 120000 file2+ remote: + remote: ok++However, the working copy in B does not have the file `file2`. Even worse, `git status` in B shows the file as deleted:++ # On branch master+ # Your branch is ahead of 'origin/master' by 2 commits.+ #+ # Changes not staged for commit:+ # (use "git add/rm <file>..." to update what will be committed)+ # (use "git checkout -- <file>..." to discard changes in working directory)+ #+ # deleted: file2+ #+ no changes added to commit (use "git add" and/or "git commit -a")++So when running `git annex sync` from B now, the file will be deleted from A as well, which is not what I expected.++This is on Ubuntu 12.04, using the precompiled git-annex tarball (amd64).++What am I doing wrong?
@@ -0,0 +1,5 @@+I'm trying to pair my ~/music repositories on my two laptops (Ubuntu 10.04 and 12.04) using the Linux standalone tarball on my home WiFi network. After entering the same passphrase on both machines, nothing happens, both remain in "Pairing in progress" state.++The router I'm using is, I think, fairly standard, it's a ZyXEL P-2812HNU-F1 with factory settings.++Are others having the problem too? Any advice where I should start looking for what goes wrong?
@@ -0,0 +1,15 @@+It seems I can't initialize git annex:++ $ git annex init "files2"+ init files2 + pre-commit hook (/Volumes/project/annex/.git/hooks/pre-commit) already exists, not configuring+ + git-annex: waitToSetLock: failed (Operation not supported)+ failed+ git-annex: init: 1 failed+ $+++ `project` is a remote file server connected via `smb://`.++ Any ideas why and how to fix?
@@ -0,0 +1,36 @@+###Tried to install git-annex.app++- App hangs up+- Cpu "git" load is 100+- Had to force quite git-annex++###Install thru command line: using Brew++- Installed haskell+- updated cabal+- But when I do:++`+cabal install git-annex --bindir=$HOME/bin+`++**I get this**++ Resolving dependencies...+ Configuring gnuidn-0.2...+ cabal: The program c2hs is required but it could not be found.+ Configuring libxml-sax-0.7.3...+ cabal: The pkg-config package libxml-2.0 is required but it could not be found.+ cabal: Error: some packages failed to install:+ git-annex-3.20121127.1 depends on libxml-sax-0.7.3 which failed to install.+ gnuidn-0.2 failed during the configure step. The exception was:+ ExitFailure 1+ libxml-sax-0.7.3 failed during the configure step. The exception was:+ ExitFailure 1+ network-protocol-xmpp-0.4.4 depends on libxml-sax-0.7.3 which failed to install.++Any help would be greatly appreciated. ++Thanks,++Carlito
@@ -0,0 +1,13 @@+I'm wondering if it is possible to have remotes that don't have the *content* of git-annex tracked.++# My use case:++I have a number of projects that I am working on at any one time. They all are tracking independently by `git` and more recently I am using `git annex` to manage the large files.++However because I have so many projects I work on one (called `AAA`), move to another, delete `AAA` to save disk space, ...time passes... return to `AAA`.++Now, prior to `git-annex` I could just clone `AAA` from my central repository folder do work, commit, push, repeat and then delete and there is no indication that I had one, or many copies of `AAA` floating around. Now with `git-annex` there is some trail of me cloning, running `git annex get`, etc.++Is there some way to set a remote as `untracked`? By that I mean it is classed as `untrusted` - so I can move files around, add them, copy to trusted remotes and delete the whole repository without worrying about losing data - but it also doesn't push any of the git-annex tracking info of where a copy of a file actually is. I don't want to know if any or all of my other `untracked` repositories have a copy of a file or not. ++I don't want my `git annex whereis` polluted with many references to repositories that just don't exist any more. I guess I could set them to dead but that still keeps all of the tracking info around in all the repos, which seems unnecessary...
@@ -0,0 +1,10 @@+My server is running the precompiled tarball https://downloads.kitenet.net/git-annex/linux/current/++git-annex version: 4.20130531-g5df09b5+build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP++The tarball is untared in "/opt/git-annex.linux" and this location is added to the users path in ".profile", who can launch the webapp as usual and so on.++But when a git-annex client from another computer tries to stablish a remote server repository with the server via ssh, it will complain "/usr/bin/git-annex", "runshell" and so on are missing. And if the binaries in "/opt/git-annex.linux" are symlinked in "/usr/bin" they will start to miss the other bin and libs in the "/opt/git-annex.linux" source tree.++As you can understand, I can't put the whole "/opt/git-annex.linux" folder tree in "/usr/bin". Is there any solution to make the precompiled tarball work properly as a git-annex server?
@@ -0,0 +1,6 @@+Hi, I have installed latest version from https://launchpad.net/~rubiojr/+archive/git-annex, that is git-annex version: 3.20121017-ubuntu1ppa1~precise+When running git annex webapp I get ++git-annex: unknown command webapp++I only installed git-annex. Are there more packages to be installed to make it work?
@@ -0,0 +1,13 @@+Hi,++I'm kind of new to git-annex, I've been following it for a while and tried small task, but never used it in a real situation.+I'm now trying to sync various computers through a central server and I'm having some problems, so I think I might be doing something wrong.++I have a remote server that I want to use as central server. I use the webapp to configure client 1 to use that server as remote server and using git (so I assume it stores the files and the tree). I then create the client 2 in another computer and doing the exact same steps.+Initially everything seams to work, but after a few modifications in the clients weird things start to happen, files only in one client, some files don't get updated, etc.++I guess I'm doing something wrong (maybe I need to clone the repo in client 2 instead of creating a new one?) but I can't figure out how to solve it.++Any tip that could help me?++Thanks!
@@ -0,0 +1,1 @@+Is there a way to check if a special remote is setup to use GPG? And, if so, see the ID of keys that it is encrypting to?
@@ -0,0 +1,4 @@+Hey Joey,+ Is there a way to see when the last fsck was? I know about --incremental and the related options, but sometimes I'd like to know when the last time I fsck'd a file (or even the whole repo) was. There doesn't seem to be a command line option for it, but I know that info is saved somewhere...maybe this could be part of 'git annex status'?++$(words of gratitude and encouragement)
@@ -0,0 +1,19 @@+I recently began experimenting with direct mode on a repository where only a very limited number of commands (`git annex sync`, `git annex add .`, etc.) are being used (through desktop buttons).++Things were working well, and then on another repository in indirect mode I moved a large folder and synced that data with a bare repo, and synced the repo in direct mode with the same bare repo (to get everything in sync).++At that point, git annex seemed to hang, taking forever to complete, and from looking a processes and files it seemed like it was going nowhere, so I killed it. I wish I had done a bit more diagnostics before that, but unfortunately I didn't.++At that point, I noticed that the old directory was still there and that there were still many files in it, but the new folder had also been created and there were files there, too. So I thought the transfer was done, and for whatever reason `git annex sync` had just not cleaned up properly.++In fact, the sync was only half done and the remaining files in the old directory were the only (local) copies (on the direct mode repo). I removed them and then synced again, which actually told git to delete those symlinks.++When I updated another (indirect mode) repository I noticed this, so I reverted the commit in question and got the symlinks back, no data lost. Then I went back to the direct mode repo, switched to indirect mode because I was worried about direct mode, `git annex sync`ed, then `git annex get` to get the files again from a usb and everything was back to normal.++Except that when I tried to go back to direct mode in that original repo, I got an error saying that git could not stat a file which is in the old (deleted) folder. Searching around, I noticed that in the `.git/annex/objects` directory, there are many remaining `.map` files with lines referring to the old (deleted) directory.++Is there any way to "reset" this somehow? I would like to switch back to direct mode, and I'd prefer not to recreate the repo.++Oh and I'm using version: 4.20130501-g4a5bfb3.++Thanks!
@@ -0,0 +1,9 @@+So i am coming from git world, All documentation and posts seemed to be for media etc. I have a simple question.++Can i use git annex to manage large files , Which i think i can. But will it work with branching/tagging etc.++e.g. We currently use git have some large files in git repo.... I am planning to move the large files to use annex. But would like to maintain branches, i.e. each branch might have different version of files and maybe tagged, So i can get back some old version from a branch.++Is this possible ? I did not get any explicit answer or examples on how this works or even if its supported.++Also can i use same folder for git and git-annex ?
@@ -0,0 +1,3 @@+I tried to compile the assitant branch on Ubuntu 12.04. But i depends on the DBus libraryw hich does not compile with some glibberish errors. Is there a way to solve this?++
@@ -0,0 +1,3 @@+The "git annex add" command adds new file to the annex. However ".DS_Store" files are ignored by git-annex. Is there a list of files that are being ignored? ++Maybe sometimes it's useful to add .DS_Store extended attribute data to the annex to ensure a complete sync of Mac files...
@@ -0,0 +1,4 @@+Hi, +May I know, how can I debug git-annex code.+I am new to Haskell Platform, I would like to know which IDE can be used to debug haskell code.+Thank You.
@@ -0,0 +1,2 @@+I've had to change my default `text/html .html` handler from a text editor to a browser to support the opening sequence of `git annex webapp`. any other way around this? perhaps to have it open the page in the default browser rather than the default text/html handler?+
@@ -0,0 +1,7 @@+After moving some files (about 1G, some big and some small files) in and out the annex, I noticed that the size of the repository has grown quite a bit. My empty repository now is over 100 MB (even after "git annex dropunused ..." and "git gc").++Most of this size is not Git metadata but many small files in the git-annex branch that seem to hold information about files I deleted (even in the other known repositories).++So is there a way to get rid of these useless but space consuming information?++(Maybe there is no (elegant) way to remove the symlink versions from the Git history (is there?), but it would already be nice if those small git-annex metadata files could be removed)
@@ -0,0 +1,1 @@+I periodically move unused files to one of my servers. What I would like to do is drop any unused file that has been unused for say more than 6 months? I would like to not drop all unused files.
@@ -0,0 +1,11 @@+Does git-annex (safely) handle detached work trees?++That is, in git I can set `GIT_WORK_TREE=/dir/A` and `GIT_DIR=/dir/B` in the environment and have all my .git stuff in /dir/B and all my files in /dir/A.++I can see this coming in useful for a few situations, but in particular for difficult file systems - like SMB or old implementations of NFS.++In my particular case I have a Drobo (something like a proprietary NAS). The Drobo is linux based, but by default mounts as a samba share or if you install `unfsd` it can be mounted via NFS. Unfortunately, the nfs is v3 and doesn't allow locks, so git-annex barfs. :-(++What I'd like to be able to do is have a direct mode annex on the drobo, with the git directory sitting on one of my linux machines. That machine would be the only one that would directly access the drobo data as an annex but other systems that look at the drobo would see what looks like a normal directory structure; for example my media centre - `mythtv` naturally! - would see "normal" names for my music collection, not SHA256 hashes...++I guess there would be an issue if there were different `GIT_DIR`s pointing to the one `GIT_WORK_TREE`, but that is a caveat emptor IMHO.
@@ -0,0 +1,24 @@+I'm starting to experiment with git annex. I'd like to use it for a centralized git repo that will be checked out often, but the clones will rarely need some large binary files (used for testing). Therefore, I've set up a centralized/bare git repo and a clone of that repo using the instructions at [centralized_git_repository_tutorial](http://git-annex.branchable.com/tips/centralized_git_repository_tutorial/) and [bare_repositories](http://git-annex.branchable.com/bare_repositories/). I've added some files to the annex in the clone.++I'm struggling to understand the difference between copy, move, and get. Here's a sequence of commands:++ >> git annex add shared/1bel.maegz+ >> git commit -m "added first file"+ >> git push+ >> git annex move shared/1bel.maegz --to origin+ ## Now it no longer exists in my local repo+ >> git annex get shared/1bel.maegz+ fails.+ >> git annex get shared/1bel.maegz --from origin+ fails.+ >> git annex copy shared/1bel.maegz --from origin+ fails.+ >> git annex move shared/1bel.maegz --from origin+ succeeds! Now I have the file in my clone.++Each failure message is:++ fatal: Could not switch to '../.git/annex/objects/W8/gZ/SHA256-s99196--62874e9b58e652c9c01e796c2bf38b2234a80e0cef95c185bb7f0857d9765df2': No such file or directory+ git-annex: <file descriptor: 6>: hGetLine: end of file++How are copy, move, and get different? Which one *should* I be using to move my large data into the central (bare) repo? Will it then be available to other clones?
@@ -0,0 +1,6 @@+Is there likely to be any problem in pointing different annexes to the same special remote (i.e. rsync/box.com/etc.) ?++As the objects are stored based on their SHA256 key the expectation is that the chance of collision is is small.++The only problem I can foresee is where the same content is stored in more than one annex and it is deleted in the remote in one annex, but not the other - there won't be any protection against that, but for non-overlapping content this risk should be negligible.+
@@ -0,0 +1,26 @@+I have a NAS at home which I access both as AFP/SMB shares and thru ssh/rsync. Now, I'd like to keep on using the shares as before, i.e., browsable via AFP/SMB with conventional file names. Ideally, I'd also like to git-annex some NAS shares, preferably, in direct mode. However, it seems out of the question to install git-annex on the NAS (hopefully, I'm wrong about this in the long run).++Two **non-special remote setups** would be:++1. Mount the share and turn it into a direct mode git annex repo. Does anybody have experience with this? I'd suspect this to be very inefficient due to the use of all the files in .git over AFP/SMB. Configuration as a WORM backend seems to be advised? (Edit: Well, I just tried this and 'git annex init' failed as described in this [forum post](http://git-annex.branchable.com/forum/Can__39__t_init_git_annex/). So AFP/SMB seem to be non-starters. :-( Furthermore, AFP/SMB are immediately detected as crippled and set to direct mode automatically.)+2. Same as 1. but with a local GIT_DIR. This should work by having .git on the NAS link to the local GIT_DIR.++Alternatively, I could treat my NAS as a [**web special remote**](http://git-annex.branchable.com/tips/using_the_web_as_a_special_remote/). Some URL schemes come to mind:++* **file:** This would benefit from some wish list items ([recursive directory remote setup/addurl](http://git-annex.branchable.com/todo/wishlist:_recursive_directory_remote_setup__47__addurl/)).+* **rsync:** AFAIK not implemented (yet?) as an option for web special remotes.+* **sftp:** (Might also include ssh access.)++The problem is that the "web semantics" don't really work in my use case:++* Files might change/move on the NAS.+* I'd like changes (e.g., renamed files) in my local repo to propagate to the NAS. Currently, git-annex would use git push for this purpose IIUC, however that's not available on the NAS...+* the web semantics seem to imply that there is exactly one "web" repository (and the URL is fixed)++All of these indicate a mismatch between my use case and web special remotes.++Hence my question: **Would something like a "direct special remote" make sense?**++As a starting point I'd look at a setup similar to 2. above, i.e., a remote "working copy" with local GIT_DIR. Except that instead of a whole local .git directory a branch in an existing .git dir might be more appropriate...++--Chris
@@ -0,0 +1,1 @@+Do both friends need to be online in order for Jabber syncing to work? Or will the pushed changes be stored on the Jabber server, so that when the remote machine does come online it can pull them even if the original machine is now offline?
@@ -0,0 +1,5 @@+Hi++I am trying to understand how git-annex works. Does it version big files at all? ++thanks
@@ -0,0 +1,7 @@+Out of simple curiosity, how does 'git annex migrate' work? I'm mostly wondering how file integrity is ensured.++Let's say you want to migrate foo.txt from (say) md5 to sha256. Does git annex simply sha256sum foo.txt and rename it in the .git/objects folder to the new sum? Or does it md5sum foo.txt, verify that it's the not corrupt, then sha256sum it and rename to the new sum?++You could run into problems if you migrate without first verifying; if the file is corrupt and you simply sha256sum and rename it, then the file wouldn't seem corrupt at your next fsck.++I'm sure you've considered this during the basic design phase of git-annex, but I'd just like to be sure. I'm kind of paranoid when it comes to data integrity. =P
@@ -0,0 +1,25 @@+My Use Case:++I try basicly to use annex as a raid-like tool (at least thats the first step)++so I added some big files to it, and then I synced it to a usb-remote. So far all did go well...++No I startet annex watch daemon... because I thought it would then watch the files and checkin and out at least for the "origin" copy of the files.++Then I thought lets delete some files I dont need anymore... so... rm.... ^^++Maybe I just wanted to see what happens or if that would magicly do what I wanted him to do... ok I knew that it would not delete the file on the usb-drive (backup...) ok... but maybe at least localy...+++Now what did happen instead of that... the links are gone yes... the files it self are in the .git objects tree, so they did not get deleted, so ok not the way I wanted... have to unlock it first, would make maybe sense...++So I tried first to get the links back... tried fix, tried unused, tried get... but the links doesnt show up again...++is there a way to first bring back the links?+is it save or the right way to just git rebase HEAD~3 to bring the links back?++and then when I want to delete files from all places whats the way to do that... annex unlock -> then delete? or git drop filex --copies=0 or something?++like I said I try to use is like a more flexible raid thing, this files are to big to really back em up with history... I watch them... and then soon I will often delete them (from everywhere). but other parts stay... I dont delete them then... ^^++So maybe I missuse annex for that usecase... try to find that out ;)
@@ -0,0 +1,19 @@+I just created a new Annex by doing the following:++ 1. git init+ 2. git annex init+ 3. git annex add .+ 4. git commit -m "Added files"+ 5. git annex status++I see the following:++ local annex keys: 224+ local annex size: 41 gigabytes+ known annex keys: 235+ known annex size: 49 gigabytes+ bloom filter size: 16 mebibytes (0% full)+ backend usage: + SHA256: 459++Why is there an 8 gigabyte difference here? What/where are those files? What is a bloom filter?
@@ -0,0 +1,5 @@+Hi,++how can I handle *drop* with the assistant? There are some files in my annex that I don't need on my laptop. so i just *drop* them on the command line bevcause I have copies on my server and an external usb drive. But after a while the assistant pulls all the files back in. Can I avoid this and make the *drop* somehow "sticky" until i *get* them over cli?++Best, Michael
@@ -0,0 +1,87 @@+Hello,++I hope my understanding of the git-annex webapp is correct, and if not, please correct my wrong thought-pattern.++I have 2 VPS servers and 5 computers. On the 5 computers, I want to sync one folder (with subfolders and files). All the computers are full-disk encrypted, and it is important for me that when the data leaves my computer, it stays encrypted in one way or another. I want to use the two VPS's as an encrypted ssh full backup repository.++The computers are rarely on at the same time, some are off for two weeks, others are on more frequent. However, the VPS's are always on.++Now, is it possible to set up git-annex to support this behaviour? Using an encrypted ssh remote to make sure the folder is in sync on all computers? ++I've set git-annex up on one box, with the two servers as encrypted full backup remotes (without git-annex installed there), and configured my jabber account. That all works, and the files get synced.++Then I've set up a second computer, while the first one is still on. There I've added my jabber account, and created a local repository. Then I selected "Share with your other devices". It now shows my jabber account on both machines, and I saw a few syncing messages, but then there came errors, "Unable to download files from your other devices". I've attached the log at the bottom of this page.++It gives me the option to add a Cloud Repository. If I add the encrypted rsync full backup remote VPS there, will it work and keep my files in sync? is there something I'm doing wrong?++Note that the computers I've set up now are two OS X machines running Mountain Lion, and the servers are CentOS 6.++Log:+++ [2013-07-15 07:44:17 CEST] main: starting assistant version 4.20130709-g18e5f43++ (scanning...) [2013-07-15 07:44:17 CEST] Watcher: Performing startup scan+ (started...) [2013-07-15 07:45:08 CEST] main: starting assistant version 4.20130709-g18e5f43++ (scanning...) [2013-07-15 07:45:08 CEST] Watcher: Performing startup scan+ (started...) [2013-07-15 07:54:31 CEST] XMPPClient: Pairing with stnl in progress+ rercrrrreveeeec:ccccv vvvv:r:::: e rsrrrreoeeeesussssorooooucuuuurerrrrc cccceveeee a vnvvvvaiaaaansnnnnihiiiisesssshdhhhhe eeeed(dddd C (o((((CnCCCConoooonennnnncnnnneteeeecicccctottttiniiiio oooonrnnnn e rsrrrreeeeeestsssse eeeetbtttt y b bbbbypyyyy e peppppereeeee)eeeer+ rrrr)))))+++++ recv: resource vanished (Connection reset by peer)+ recv:r errceevcs:vo :ur rercseeos uovruacrneci esv havenadin si(hsCehoden dn( eC(coCtnoinnoennce tcriteoisnoe ntr erbseyes tep teb eybr y)p+ epeere)r+ )+ [2013-07-15 07:55:00 CEST] XMPPSendPack: Syncing with janwxmpp+ Already up-to-date.+ recv: resource vanished (Connection reset by peer)+ [2013-07-15 07:55:04 CEST] XMPPReceivePack: Syncing with janwxmpp+ To xmpp::janwxmpp@gmail.com+ * [new branch] git-annex -> refs/synced/0a41c397-09e8-4957-a6f4-2a6846a4f9d8/cmVsc3RubEBnbWFpbC5jb20=/git-annex+ * [new branch] master -> refs/synced/0a41c397-09e8-4957-a6f4-2a6846a4f9d8/cmVsc3RubEBnbWFpbC5jb20=/master+ [2013-07-15 07:55:25 CEST] XMPPSendPack: Unable to download files from your other devices.+ [2013-07-15 07:55:25 CEST] XMPPSendPack: Syncing with janwxmpp+ recv: resource vanished (Connection reset by peer)+ fatal: Could not read from remote repository.++ Please make sure you have the correct access rights+ and the repository exists.+ [2013-07-15 07:57:25 CEST] XMPPSendPack: Unable to download files from your other devices.+ recv: resource vanished (Connection reset by peer)+ recv: resource vanished (Connection reset by peer)+ recv: resource vanished (Connection reset by peer)+ recv: resource vanished (Connection reset by peer)+ recv: resource vanished (Connection reset by peer)++ (Recording state in git...)++ (scanning...) [2013-07-15 08:01:36 CEST] Watcher: Performing startup scan+ (started...) recvr:rrrrrrre eeeeeeecrcccccccvevvvvvvv:s::::::: o rurrrrrrrereeeeeeescsssssssoeooooooou uuuuuuurvrrrrrrrcaccccccceneeeeeee i vsvvvvvvvahaaaaaaanennnnnnnidiiiiiiis sssssssh(hhhhhhheCeeeeeeedoddddddd n (n(((((((CeCCCCCCCocooooooontnnnnnnnninnnnnnneoeeeeeeecnccccccct tttttttiriiiiiiioeooooooonsnnnnnnn e rtrrrrrrre eeeeeeesbssssssseyeeeeeeet ttttttt p bebbbbbbbyeyyyyyyy r p)pppppppe+ eeeeeeeeeeeeeeerrrrrrrr))))))))++++++++ [2013-07-15 08:44:42 CEST] XMPPSendPack: Syncing with janwxmpp+ recv: resource vanished (Connection reset by peer)+ recrvre:ec cvrv:e: s roreuesrsocoueur rcvceae n vivasanhnieisdsh he(edCd o (n(CnCoeoncnntneiecoctnti ioronen s reretes sebetyt bpbyey e prpe)ee+ err))++ fatal: Could not read from remote repository.++ Please make sure you have the correct access rights+ and the repository exists.+ [2013-07-15 08:46:42 CEST] XMPPSendPack: Unable to download files from your other devices.+ [2013-07-15 08:46:42 CEST] XMPPSendPack: Syncing with janwxmpp+ fatal: Could not read from remote repository.++ Please make sure you have the correct access rights+ and the repository exists.+ [2013-07-15 08:48:42 CEST] XMPPSendPack: Unable to download files from your other devices.
@@ -0,0 +1,15 @@+I'm trying to add a ssh remote in the web app, but I receive the following error:++ Internal Server Error++ ssh-keygen ["-F","router.eisenacher81.org"] exited 1++The console complains about the known_hosts file:++ /home/michael/.ssh/known_hosts is not a valid known_hosts file.+ line 44 missing key: AAAAB3NzaC1yc2EAAAABIwAAAIEAtnX75Qa8YVR...+ key_read: uudecode AAAAB3NzaC1|1|veTakKhYY3OSqCepiq7WAUK8cxQ=|suoi0YU/lgg781Vz9O7yTao5exY= ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAIEA4bTnEFFiKz4+i3S9DWHJVoV8CD1DsVRJRodWdTA86+x58S0l0rUyJgXbGwScMI+xFCrqzpd4Hgoc4ElRykj5SL+7IuB5ZAe+4ILQPeiL9ck/1Q7uoh7vWiURXr92Hz5tjuEe3QI9H iKauXj5yj5mGq1VVXLN1CdfQ99G4zSxK7c= failed+ line 73 invalid key: |1|k9vzo7Ftuxf235It5LbrX36p2f0=|rNHdygip...+ line 93: invalid hashed name: |1||1|aptgcuUg4ITWhZQLxzRHH8gUIOQ=|Qe2JAlAw++SZosE9ZhQW+fA3twE=... + line 120 missing key: AAAAB3NzaC1yc2EAAAABIwAAAQEAsHa75NfjyB1...+ /home/michael/.ssh/known_hosts is not a valid known_hosts file.
@@ -0,0 +1,1 @@+I have an external HDD which I setup as a remote manually before I started using the assistant. When I plug it in files sync fine and the git-annex branch gets synced, but the master branch doesn't; git annex sync doesn't do the job and I have to run git pull. This is annoying because it means that portable drive is useless as a backup, since it doesn't have the required metadata; I have to manually git pull to make it a useful backup. How can I make the assistant sync the metadata in--if not the master branch, at least origin/master so I could merge later without the remote available. Thanks.
@@ -0,0 +1,6 @@+hi, +i just did git annex unused in 2 repos, one with WORM and one with SHA1. +with WORM i instantly could see which file it was, with SHA1 not. ++so would it be possible to just add the first seen filename to the hashes identifier? the name could just be ignored but it would help with unused to see which file i am searching for. +thanks!
@@ -0,0 +1,19 @@+I'm sitting on a pretty fast connection, and often git-annex isn't using my entire upstream to fill the remotes.++Lets say i have an annex with 10 x 100mb files. and my git-annex has 5 special remotes that needs to be filled.++I would like to have git-annex do 5 concurrent uploads(one to each remote). Currently git-annex only uploads to one special-remote at a time (meaning the 4 remaining servers are just waiting).++It would also be nice to have a per remote number of threads. Especially if adding a directory with 1000 small files in it(say 100bytes each), having 5 transfer threads to each remote would make the sync complete much faster.+++For now i've made a shell script that i call:++# for j in `seq -w 0 10`; do echo DOING $j; for i in `curl "http://127.0.0.1:$1/?auth=$2" | grep "continue" | gawk -F\" ' { print $8 } '`; do curl "http://127.0.0.1:$1$i"; sleep 0; done; done++But it is very rough, and basically just starts all transfers on the page. Which means i currently have 315 active transfers running. whoops.++I could improve the shell script. But it really would be quite a bit niftier to have it as settings in git-annex.++Sincerely+Tobias
@@ -0,0 +1,5 @@+I'm not sure of the right place for feature requests; sorry if this is incorrect.++It occurred to me that it would be neat if running git annex copy --auto copied enough copies of the file to connected remotes that don't have it to fulfil numcopies (if possible). Further coolness could come from choosing the remotes smartly (based, for example, on availability, access cost, remote disk space, trust level... you get the idea)++Having an option like this would allow the user to use numcopies to backup files to wherever possible, if they don't really care about where those copies go.
@@ -0,0 +1,1 @@+I would like it if the webapp could support setting up [bare remotes](http://git-annex.branchable.com/tips/centralized_git_repository_tutorial/) to assist with syncing between two machines that are never online at the same time.
@@ -0,0 +1,3 @@+I've made a first attempt at a .app launcher for git-annex webapp for OSX, please see <https://github.com/jcftang/git-annex/commits/master> the icon needs to be resized and made to look nicer at somepoint, the launcher assumes that git-annex is in the run time path.++I would imagine it might be possible to fiddle with the paths and get all the needed components into the .app file for OSX users.
@@ -0,0 +1,10 @@+I was wondering how does one recover from...++<pre>+(Recording state in git...)+error: invalid object 100644 8f154c946adc039af5240cc650a0a95c840e6fa6 for '041/5a4/SHA256-s6148--7ddcf853e4b16e77ab8c3c855c46867e6ed61c7089c334edf98bbdd3fb3a89ba.log'+fatal: git-write-tree: error building trees+git-annex: failed to read sha from git write-tree+</pre>++The above was caught when i ran a "git annex fsck --fast" to check stash of files"
@@ -0,0 +1,1 @@+With numcopies it is possible to control how many copies there should be of a file overall in all of the remotes. Is it also possible, using .gitattributes or something else, to force one of the repos (e.g. a server) to contain a copy of all files, or does this have to be done manually?
@@ -0,0 +1,28 @@+I'm just getting started with git-annex and trying to wrap my head around using it with Amazon S3. I am familiar with using git, but things are a bit different as we can't init a repo at S3 directly.++I've followed http://git-annex.branchable.com/tips/using_Amazon_S3/, and performed:++`git init`<br/>+Initialized empty Git repository in /home/<br/>+`git annex init`<br/>+init ok<br/>+`git annex initremote s3 type=S3 encryption=FOOBAR bucket=foo`<br/>+initremote s3 (encryption setup with gpg key YGTVT51715TFR) (checking bucket...) (gpg) ok<br/>+`git annex describe s3 "Amazon S3"`<br/>+describe s3 ok<br/>+`git annexx add foo/`<br/>+add foo/bar.txt<br/>+add foo/bar.png<br/>+...etc<br/>+`git annex sync`<br/>+51 files changed, 51 insertions(+)<br/>+create mode 120000 foo/bar.txt<br/>+create mode 120000 foo/bar.png<br/>+...etc<br/>+++Looking at http://git-annex.branchable.com/git-annex/, I thought the files added would then be pushed to S3 by git annex sync, but that doesn't seem to be the case. I've also tried variations of got annex copy, like `git annex copy . --to s3`, without any luck.++Is there a way to push to s3?++Any help is appreciated!
@@ -0,0 +1,11 @@+Hi,++I am trying to use Git Annex Assistant on my Fedora Linux computer. I currently have a local repository that assistant monitors, but now I want to use my personal server as a git remote for the repository. I click on Configuration > Remote server and it prompts me for my server login credentials and then click the "Check this server" button. After this I am shown a screen that assistant is "Ready to add remote server" and then states:+> The server <MY IP ADDRESS HERE> can be used as is, but installing git-annex on it would make it work better, and provide more options below.+>+> If you're able to install software on the server, do so and click Retry++The information shown below this message is regarding encrypting the data (if I have git-annex installed on the server, which I don't). So my question is, what do I do now? There is no button to just add the remote from within git annex assistant? I created a bare repository on my server and added a remote manually inside the repository on my local machine, but git annex assistant doesn't notice it. I'm clueless on what git annex assistant is expecting from me at this point. I would think what I'm trying to do is one of the most common use cases for git annex, but I can't find any documentation or materials on the correct procedure for this. Any help is appreciated.++Regards,+Blake
@@ -0,0 +1,9 @@+Hi,++May I know, which processes git-annex is using to move/copy/get file content between repositories?+Is it using same processes which git uses, Like send-pack, receive-pack.+I want to use Aspera to move file contents between repositories.+Is it enough if I customize send-pack, receive-pack of git code to do Aspera file transfer or git-annex uses any other transfer mechanism.++Many Thanks,+Royal Pinto
@@ -0,0 +1,2 @@+How can I clone a git annex remote (bare repository) created with the webapp in command line ? My goal is to be able to access the files using an ssh connection.+
@@ -0,0 +1,5 @@+With Amazon EC2, it is possible to take a snapshot of the virtual machine and then bring up multiple instances based on the snapshot. ++If I configure git annex assistant to sync a folder to S3, will it work correctly if I spin up multiple instances, all identical git annex assistant configurations?++My use case is to allow users of my forums to upload attachments with their posts. The attachments are stored locally on disk, but I'm hoping that git annex assistant can help synchroise the attachments across all forum instances (I usually run only 1 instance, but their could be as many as 3 under heavy load).
@@ -0,0 +1,11 @@+Hi,+I want to download some files in git and git annex in Windows OS.+I have installed msysgit for git-scm in D:\Git directory,+Now I download git-annex assistant for Windows, and install it+in D:\Git\cmd directory.+But when I run the command "git annex" in git-bash, it says it can not+found the "git annex" command.+My question is that, how should I use git annex in Windows to download files?+For example, git annex get <filename>.+Doea anyone has any idear to help me figure it out?+Thanks in advance!
@@ -0,0 +1,21 @@+Hello++I'm trying Git annex latest builds available in Linux & Android+Here is the scenario :-++Syncing 2 peer devices running Linux & Android+Devices can access each other directly over Cisco VPN encrypted link++Currently, syncing files via rsync over webdav (over Cisco VPN)+Everything is working, manual file tracking is an issue.++Here's where Git annex steps in,+I've configures external jabber account so they can talk to each other.++But the transfers are super-slow over internet,+I'm guessing Cisco VPN adding 15-20% overhead + SSH adding another 20-30% overhead.++Since the network link is trusted, is there any way to speed things up assuming Cisco solution+remains in place?++looking to solve this issue
@@ -0,0 +1,7 @@+Hello,++A mode of operation that I find comfortable, and from various online posts it seems that so do some others, is putting whole git repositories in dropbox.++It seems that currently this mode of operations if not supported in a simple manner. (i.e. just add and let assistant do the work). Is there any workaround or possibility to do this?++Thanks!
@@ -0,0 +1,5 @@+First of all thanks for the great work. git-annex looks very nice already!++I wonder if it's possible to add Git repositories to the annex. In my current Dropbox setup I drop some small Git repositories into the Dropbox to keep them in sync on two computers. ++This is obviously not possible with git-annex, as the annex itself is a Git repository and sub-repositories (directories with .git folders) are ignored. But in some cases people might want to be able to drop "anything" into the annex, maybe even Git repositories (e.g. the "nomad" usecase)...
@@ -0,0 +1,19 @@+I am in the process of organising all of my documents (pdf/ps/etc.) and putting them into an annex. It seems like the easiest (and smartest?) way for me to manage my 15,000+ document library... (Yeah, I've not read them all!)++However, one of the issues I have run into is when I want to include something like a software manual...++I'm not even sure if git-annex is the correct way to handle these sort of document, but...++What would you do if the URL stays the same, but the file content changes over time?++For example, the administration manual for R gets updated and re-released for each release of R, but the URL stays the same.++ http://cran.r-project.org/doc/manuals/R-admin.pdf++I'm not particularly worried about whether my annex version is the most recent, just that if I want to 'annex get' it, it will pull *a* version from somewhere.++Any thoughts?++I'd bet that the SHA-hash would change between releases(!) so would a WORM backend be the best approach? It would mess up my one-file-in-multiple-directories (i.e. multiple simlinks to the one SHA-...-.....) approach.++
@@ -0,0 +1,177 @@+Hello,++i am trying to run the walkthrough on Windows 7. When i try to get the contents of a file, i only get a some git annex text string and not the real file. Both repositories are on the same ntfs filesystem. ++C:\tmp>git annex version +git-annex version: 4.20130827-g4f18612 +build flags: Pairing Testsuite S3 WebDAV DNS +local repository version: 4 +default repository version: 3 +supported repository versions: 3 4 +upgrade supported from repository versions: 2 + +C:\tmp\server>git --version +git version 1.8.3.msysgit.0 + ++# walkthrough.bat+ + doskey /history > commands.log+ mkdir laptop+ cd laptop+ git init+ git annex init laptop+ cd ..+ + git clone laptop server+ cd server+ git annex init server+ git remote add laptop c:\tmp\laptop+ + cd ..\laptop+ git remote add server c:\tmp\server+ copy ..\1.pdf .+ git annex add 1.pdf+ git commit -m add+ dir + + cd ..\server+ dir+ git fetch laptop+ git merge laptop/master+ git annex get 1.pdf+ dir+ type 1.pdf+ ++# walkthrough.log++ C:\tmp>walkthrough.bat+ + C:\tmp>doskey /history 1>commands.log+ + C:\tmp>mkdir laptop+ + C:\tmp>cd laptop+ + C:\tmp\laptop>git init+ Initialized empty Git repository in C:/tmp/laptop/.git/+ + C:\tmp\laptop>git annex init laptop+ init laptop+ Detected a crippled filesystem.+ + Enabling direct mode.+ + Detected a filesystem without fifo support.+ + Disabling ssh connection caching.+ ok+ (Recording state in git...)+ + C:\tmp\laptop>cd ..+ + C:\tmp>git clone laptop server+ Cloning into 'server'...+ done.+ warning: remote HEAD refers to nonexistent ref, unable to checkout.+ + + C:\tmp>cd server+ + C:\tmp\server>git annex init server+ init server+ Detected a crippled filesystem.+ + Enabling direct mode.+ + Detected a filesystem without fifo support.+ + Disabling ssh connection caching.+ ok+ (Recording state in git...)+ + C:\tmp\server>git remote add laptop c:\tmp\laptop+ + C:\tmp\server>cd ..\laptop+ + C:\tmp\laptop>git remote add server c:\tmp\server+ + C:\tmp\laptop>copy ..\1.pdf .+ 1 file(s) copied.+ + C:\tmp\laptop>git annex add 1.pdf+ add 1.pdf (checksum...) ok+ (Recording state in git...)+ + C:\tmp\laptop>git commit -m add+ [master (root-commit) 7ad1514] add+ 1 file changed, 1 insertion(+)+ create mode 120000 1.pdf+ + C:\tmp\laptop>dir+ Volume in drive C has no label.+ Volume Serial Number is x+ + Directory of C:\tmp\laptop+ + 09/01/2013 11:03 AM <DIR> .+ 09/01/2013 11:03 AM <DIR> ..+ 08/30/2013 12:43 PM 37,500 1.pdf+ 1 File(s) 37,500 bytes+ 2 Dir(s) 7,698,817,024 bytes free+ + C:\tmp\laptop>cd ..\server+ + C:\tmp\server>dir+ Volume in drive C has no label.+ Volume Serial Number is x+ + Directory of C:\tmp\server+ + 09/01/2013 11:03 AM <DIR> .+ 09/01/2013 11:03 AM <DIR> ..+ 0 File(s) 0 bytes+ 2 Dir(s) 7,698,817,024 bytes free+ + C:\tmp\server>git fetch laptop+ remote: Counting objects: 9, done.+ remote: Compressing objects: 100% (6/6), done.+ remote: Total 8 (delta 1), reused 0 (delta 0)+ Unpacking objects: 100% (8/8), done.+ From c:\tmp\laptop+ * [new branch] git-annex -> laptop/git-annex+ * [new branch] master -> laptop/master+ + C:\tmp\server>git merge laptop/master+ + C:\tmp\server>git annex get 1.pdf+ get 1.pdf (merging laptop/git-annex origin/git-annex into git-annex...)+ (Recording state in git...)+ (from laptop...)+ 1.pdf+ 37500 100% 4.51MB/s 0:00:00 (xfer#1, to-check=0/1)+ + sent 37573 bytes received 31 bytes 75208.00 bytes/sec+ total size is 37500 speedup is 1.00+ ok+ (Recording state in git...)+ + C:\tmp\server>dir+ Volume in drive C has no label.+ Volume Serial Number is x+ + Directory of C:\tmp\server+ + 09/01/2013 11:03 AM <DIR> .+ 09/01/2013 11:03 AM <DIR> ..+ 09/01/2013 11:03 AM 194 1.pdf+ 1 File(s) 194 bytes+ 2 Dir(s) 7,698,767,872 bytes free+ + C:\tmp\server>type 1.pdf+ .git/annex/objects/kM/0q/SHA256E-s37500--32d8190c7e189d45f48245a100e4cc981ea1bbc+ 02ac8bfa6188db73e41ce06f3.pdf/SHA256E-s37500--32d8190c7e189d45f48245a100e4cc981e+ a1bbc02ac8bfa6188db73e41ce06f3.pdfC:\tmp\server>+ C:\tmp\server>+
@@ -0,0 +1,68 @@+Hi everyone,++everyday I understand more and more how git and git-annex work but I need help with this one.+I guess I have two questions but let me describe the scenario first:++I have one local repository of mp3s (assume just one file: file1.mp3).+I clone that repository into a remote git-annex repository over ssh and "git annex get" the file contents for file1.mp3.++I unlock some mp3's locally and modify some mp3 tags. +Then I notify git-annex of these changes+with "git annex add *"+and commit them with "git commit -m 'mp3 tags changed'". +[git annex locks them again and changes the symlinks to point to the changed file in the annex, git commits the changed symlink]++At this point in time there are two objects in my git annex repository:+hash(file1.mp3) +hash(file1.mp3|with modified tags)+The symlink points now to hash(file1.mp3|with modified tags)++At this point the remote still does not now of this commit and of the new file contents.+Thus I do "git push" to send the changes to the remote.+The remote now has a BROKEN symlink because it already points to hash(file1.mp3|with modified tags)+but the remote annex's object directory only contains hash(file1.mp3).++Then I want my remote repository to also have the updated mp3 tags.+The only way I see (without scripting) to have the updated mp3 tags in the remote repository is to do an "git annex get file1.mp3" on the remote repository or an "git annex copy --to remote file1.mp3" at my local repository. However, although the binary differences between both files+file1.mp3 and file1.mp3|with modified tags are small the latter is transferred completely from the local repository to the remote repository.++This is not a problem when just changing one file, but a problem when I have 10GB's of files and when it takes 2days to upload them to the remote because of a low bandwidth. ++First question: Did I miss something? Does git-annex already provide means to only transmit the diff between the two objects? ++Second question regarding disk space.+I now have a complete history of all changes to file1.mp3 in my git-annex repository. I have the objects that represent every state of file1.mp3 and I can go back to these states when I checkout the respective commits and thereby the symlinks that link to these "old" objects. This history can take up a lot of space. What is the clean way to forget the past? AFAIK "git drop unused" only drops file contents that are not referenced in any commit? ++If one wanted to preserve the entire history but save disk space one could also only store the current content and the patches that allow to reconstruct older versions from the current one. I understand that applying several patches consecutively takes more cpu time but for me going back to an older commit with my binary files only happens rarely. ++This is the algorithm I have in mind for an optimized "git annex get file1":++On that repository where the file is missing:++1. Find the newest object that represented the contents of file1 in file1's commit history.++2. Transmit this object identification hash(object) to the remote that has the current version (the one I am getting from).++At that remote: ++If the history contains full versions of file contents:++Create a binary diff between the object identified by hash(object) and the current content of file1.++If the history contains only the current version and patches to older versions:+Collect all patches that represent the change from hash(object) to the current content of file1.++If the list of patches is bigger than the current content of file 1 transmit the current content of file1. Otherwise transmit the patch(es) ++On that repository where the file is missing:++Apply the patch(es) to the latest object to obtain the current object.++What's your opinion on this?++Marek+++++
@@ -0,0 +1,3 @@+`git annex dropunused` is simple enough.++But how do I perform the equivalent procedure on an rsync remote? I'd presume that `git annex copy --to remote` is not sufficient.
@@ -0,0 +1,4 @@+Hi Joey,+ I was wondering how you know when a file in your repo fails a fsck. I'm having trouble finding out since I can't change any of the objects (which is great!). I'd just like to know since I have thousands of files in one of my annexes, and scrolling through my term buffer is unwieldy. I'd assume it would show up when the fsck was done, or in 'git annex status'...++Thanks!
@@ -0,0 +1,3 @@+I use git annex in direct mode and I have renamed a file. What should I do to make git annex understand that the file has just been renamed and not deleted/added?++The file I renamed is quite big and I would like to avoid having to copy it again to the remotes and I would also like to avoid having to redownload it again in all the repositories.
@@ -0,0 +1,1 @@+I have a repository with an S3 remote named `cloud`. I now no longer want to use that remote. I've dropped all the data from it (`git annex drop . --from cloud`). How do I tell my repository to forget about the remote?
@@ -0,0 +1,5 @@+Hi!++When I update one repository to/from another, am I to push/pull only the master branch (and other branches I'd have created myself) or also the git-annex branch?++From what I understand, the git-annex branch is local to one repository and has no interest in being merged in another, but some examples make use of git pull --all (which merges distant git-annex branch into local).
@@ -0,0 +1,5 @@+Hi,++In normal maven release procedure, it re-clones the gitrepo from the tag to do the release from either git or local file, But as git-annex uses symlinks when the repo is clones by maven, it misses the files. Any recommendations how i can make this work ? ++Also would love some data on who is using git-annex in production environment would be good.
@@ -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,1 @@+I recently created WebDAV remote to my annex which I assumed to be just for testing purposes at the time, so I gave it a strange and long-wided name. It turned out, though, that the remote is stable, works fine, and that I'm going to keep it. Now, I would like to give it a snappier and more descriptive name than the one I originally chose. Is that possible somehow?
@@ -0,0 +1,1 @@+Somehow the symlinks have vanished from one directory of my repository. How can I restore them?
@@ -0,0 +1,5 @@+I worked out how to retroactively annex a large file that had been checked into a git repo some time ago. I thought this might be useful for others, so I am posting it here.++> This is a great tip, so I've moved it to+> [[tips|tips/How_to_retroactively_annex_a_file_already_in_a_git_repo]].+> --[[Joey]]
@@ -0,0 +1,4 @@+Hello,++I have added a few repositories for testing purpose and would like to remove them.+Is it possible to remove a repository through assistant?
@@ -0,0 +1,31 @@+Hello.++My case: I have somehow managed to get my repo, with quite much stuff inside it messed up.++There is single directory 'cities' containing quite many files (>10k) that i would rather see gone (and keep the tar.bz version of it ..). I tried doing ++ git drop --force++that works fine, but the files are still there after sync. ++git annex unused says just 'ok' so i guess it thinks they are still used somewhere. I tried to look where, but i ended up just doing git annex drop -f my_remote_here test_file_name for each of my remotes. This doesnt help. +How can i get rid of these files? Doing git annex fsck shows that +++So, try to search what is the key:++ % ls -lah cities/diskcache/config.cfg+ lrwxrwxrwx 1 XX XXX 190 Nov 29 05:52 cities/diskcache/config.cfg -> ../../../../.git/annex/objects/qm/M6/SHA256-s32--4f5ce34d1b0b8d854a315530b2fdcbfa9c3067636a2aa5433a04402db4151dce/SHA256-s32--4f5ce34d1b0b8d854a315530b2fdcbfa9c3067636a2aa5433a04402db4151dce+ sundberg@sundberg-MS-7680 ~/git-repository/ubuntu.iso/Archive/Maps+ % git log --stat --all -SSHA256-s32--4f5ce34d1b0b8d854a315530b2fdcbfa9c3067636a2aa5433a04402db4151dce/SHA256-s32--4f5ce34d1b0b8d854a315530b2fdcbfa9c3067636a2aa5433a04402db4151dce+ commit 51a57a023774ff80408210828f298f5c42a7e0be+ Author: XXXX+ Date: Sun Dec 9 13:42:40 2012 +0200+ git-annex automatic sync+ Archive/Maps/cities/diskcache/config.cfg | 1 ++ 1 file changed, 1 insertion(+)++So how can i deduce what is the remote i should try to clean up ?+++Thanks!
@@ -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 @@+Consider the following two use cases:++* I have a git-annex repo on a portable medium and carry it around between several machines. I use it on a non-important system with the most current git-annex installed, automagic upgrade happens. I am now forced to upgrade git-annex on all other machines. Bonus points if this happens in the background and I don't even notice it until it's too late.++* My system crashes and I use a rescue CD to access local data, including git-annex. The rescue CD includes a newer version of git-annex and once my system is restored, I am forced to upgrade git-annex locally.++My suggestion would be not to upgrade automatically, but to either ask the user if this is OK or to error out and request that they run git annex update by hand.++Optionally, this could be done via a local config variable which should default to error or ask, not upgrade.
@@ -0,0 +1,23 @@+Hey,++I've found that git annex works great as a way to publish websites to a web server. I can edit my website on my computer, `git annex sync` my working directory to the VPS, and then `git annex get files-I-want-to-publish`. This works great. I can maintain my normal working directory structure on the VPS and I don't have to worry about people seeing files I DIDN'T want to publish, since the dead symlinks just show up as 404s.++There's one small problem. ++Say:++ 1) I've already published a file using `git annex get file-to-update`++ 2) I update that file on my computer++ 3) I do `git annex sync`++ 4) I do `git annex get file-to-update`++Between steps 3 and 4, file-to-update goes from being an accessible web resource to being a dead symlink. It's not really a problem for me, as hardly anyone visits my site. But it would be nice if I could make `sync` leave the old symlink to the old file until I `get`ed the new one.++Is this possible?++PS: For those who might follow in my footsteps, remember that you probably don't want people reading the contents of your .git dir, so make a re-write rule for this!++Timothy
@@ -0,0 +1,7 @@+I'd like to have git-annex assistant running so I can use it to sync files, but when I downloaded and ran it the webapp was missing. ++I've recently begun using Trisquel, or rather the KDE version Triskel. The current Trisquel is built from Ubuntu Precise, 12.04, the current LTS version. Thus it seems that I'm a bit behind the current Ubuntu software, and my impression is that this relates to my problem.++In [a post](http://git-annex.branchable.com/forum/Cannot_launch_webapp_on_ubuntu_12.04_using_ppa/) on this forum I read that a version of git-annex was built without the webapp, and that this had since been corrected. It appears from my git-annex version data that I have an older version, though I downloaded it only two days ago, and it's older than the corrected version. Is this because my Ubuntu stuff is out of date? ++More importantly, is there any way I can get webapp running on my current OS, or must I wait until Trisquel gets to 13.04?
@@ -0,0 +1,27 @@+Hello,++First of all, thanks to Joey for developing git-annex, good job!++I have a small feature request: when running git annex watch, new files are automatically added to the annex. It would be nice to let this depend on an attribute: add a file to annex if an attribute is set, otherwise do a regular git add.++My use-case is the following: I have a repository containing documents I'm working on (mostly LaTeX), which I'd like to be regular files in git (no annex), and a bunch of extra documentation (pdfs) and images, which I'd like to go to the annex. I currently set a git-attribute (addtoannex), and use a shell script to selectively add files to annex as follows:++Content of .gitattributes:++ *.png addtoannex+ *.jpg addtoannex++Snippet of add script:++ git check-attr addtoannex "$FILE" | grep -q ": set$"+ if [ $? -eq 0 ]; then+ git annex add "$FILE"+ else+ git add "$FILE"+ fi++It would be great if the watcher could honour an attribute.++best regards,++Tom
@@ -0,0 +1,21 @@+I don't think it's a bug or a todo, just a request for clarification.++So, I installed git-annex first on a Mac, and created the initial repository, and started dropping stuff into it. All fine.++Created a second repository on an external (but never disconnected, also does Time Machine) drive. All fine. Everything's there.++Went across the room to my Linux desktop, installed git-annex, and tried to pair it to my Mac's git-annex repo. Hit <a href="http://git-annex.branchable.com/bugs/bad_comment_in_ssh_public_key_ssh-rsa/#comment-0ee00f307909723fdf8c73695787f067">this bug</a>, installed latest git-annex from tarball and got past that and got the pairing done. Syncing happened, all looked well...++But when I look in the annex dir on that Linux machine, I now just see symlinks to the actual files in the repo's .git/annex stuff. It kinda works, but it's a bit distracting, especially if you open such a file in any desktop app and you can see it's got the target of the link (some sha-value filename.ext) rather than the sensibly-named link. Including files created and coped into that annex on that machine. (In Nautilus they all show with symlink & lock emblems.)++Look again at some documentation, and apparently it's <a href="http://git-annex.branchable.com/how_it_works/">supposed to do this</a>++Which makes me wonder why it *isn't* doing it on the Mac I started the repository on?++Went to another mac (laptop) and installed git-annex, and set up pairing to the first mac - as far as I can tell, doing the exact same procedure as I did under Linux. TBH through the webapp there's not much scope for doing it a different way. Files sync across...++And there they are, the actual files, directly in the annex dir, not symlinks.++(I am by the way confirming this at the commandline, it's not just what Finder/Nautilus may be displaying to me graphically.)++Now, seeing the actual files in the annex directory is what I *prefer*; but I'm a: confused as to why the Macs are doing it that way but Linux isn't, and b: given the "how it works" link, why everything isn't using the links.
@@ -0,0 +1,7 @@+I have two machines (A and B ) both have a directory called "inbox"+I want to sync these two directories. So I ran git annex assistant on machine A and set up a remote to B with **ssh** and selected **client: a repository on your computer**.++The end result is that I have something that looks like a git bare repo on machine B and I have no files on A from machine B.++What am I doing wrong? What shall I do to achieve my goal?+It is kind of dropbox functionality what I want. (Which I never used for security/policy reasons.)
@@ -0,0 +1,18 @@+Not logging this in the bugs section, but poking at the new webapp feature...++<pre>+laplace:annex jtang$ git annex webapp -d+[2012-07-26 19:02:50 IST] read: git ["--git-dir=/Users/jtang/annex/.git","--work-tree=/Users/jtang/annex","show-ref","git-annex"] +[2012-07-26 19:02:50 IST] read: git ["--git-dir=/Users/jtang/annex/.git","--work-tree=/Users/jtang/annex","show-ref","--hash","refs/heads/git-annex"] +[2012-07-26 19:02:50 IST] read: git ["--git-dir=/Users/jtang/annex/.git","--work-tree=/Users/jtang/annex","log","refs/heads/git-annex..731005d121426a38b206c4544da02cdb3b974974","--oneline","-n1"] +[2012-07-26 19:02:50 IST] read: git ["--git-dir=/Users/jtang/annex/.git","--work-tree=/Users/jtang/annex","log","refs/heads/git-annex..d36d8d88847decc2320f0be22892ad94a8abe594","--oneline","-n1"] +[2012-07-26 19:02:50 IST] read: git ["--git-dir=/Users/jtang/annex/.git","--work-tree=/Users/jtang/annex","log","refs/heads/git-annex..57bcddc14d03b61028f7002e2dabcc5181d74f3d","--oneline","-n1"] +[2012-07-26 19:02:50 IST] read: git ["--git-dir=/Users/jtang/annex/.git","--work-tree=/Users/jtang/annex","log","refs/heads/git-annex..372aceaf49b60ebe31cc3fe2e52ba4fbe99c134f","--oneline","-n1"] +[2012-07-26 19:02:50 IST] chat: git ["--git-dir=/Users/jtang/annex/.git","--work-tree=/Users/jtang/annex","cat-file","--batch"] +[2012-07-26 19:02:50 IST] read: git ["config","--null","--list"] +[2012-07-26 19:02:50 IST] call: open ["file:///Users/jtang/annex/.git/annex/webapp.html"] +The file /Users/jtang/annex/.git/annex/webapp.html does not exist.+git-annex: failed to start web browser on url file:///Users/jtang/annex/.git/annex/webapp.html+</pre>++I would have expected the open command to open up http://localhost:port/ instead of a file on my machine. Anyway, its just an observation on the current state of the webapp feature, not expecting it to work enough for me to test it ;)
@@ -0,0 +1,13 @@+Hi there,++first of all, great job done on annex! I think I finally found what I was looking for to organize all my data.++My question: when I do git annex whereis Music, I get a detailed list of every single song and its remote locations. I have tens of thousands of songs, so just typing git annex whereis Music gives me way too much information. +Here is my proposition: in my case, every file of the Music folder resides in the same remote. So, wouldn't it be better to show just one line of output telling me that Music is on remote bla and blub, and then I know that all files in Music are in remotes bla and blub?++Is that possible now already or would that be a feature request? What do you think?++Cheers,+Moritz.++PS: I know that I can specify filters, e.g. git annex whereis --in bla --and --not --in blub. That is great!
@@ -0,0 +1,10 @@+With the fundraiser having met its stretch goal of $15,000, I was thinking of how to keep git-annex going beyond another year. What about selling stuff? Not just merch (though being able to buy stickers would be neat), but useful things that would complement the software, like selling hardware for a small remote that you could plug into your home network, or even set up at a friend's house to have online, but offsite.+++Something like a CubieBoard2 and an HDD for annexes preloaded with all the necessary software and a git-annex apt repo for keeping it updated. Everything would come in a nice little enclosure with a git-annex logo on it; you plug in the power, the ethernet, and boom it's ready to go, with no terminal magic (but it's there if you want it!). You could create them on-demand without having to keep much of a stock (except maybe the enclosure), so there's practically no risk.++++Aesthetically, I was thinking of something that exposed as little of the insides as possible. Basically just power, ethernet, and USB ports.++Maybe material for another Kickstarter?
@@ -0,0 +1,5 @@+http://git-annex.branchable.com/walkthrough/ says "Git wants to first stage the entire contents of the file in its index. That can be slow for big files (sorta why git-annex exists in the first place)."<br/>+What is git doing that git-annex isn't, other than copying the file to .git/objects rather than just moving it to .git/annex/objects, prepending it with "blob"+length, and compressing it? If git were changed to store the "blob"+length as part of the object filename rather than as part of the object file content, have a config option to use uncompressed objects for large files (and not try to pack them when creating pack files), and were used on a filesystem such as zfs or btrfs which does COW so the copy would be as fast as a move, then what speed advantage would git-annex still have over git? I realize git-annex has more features than just big file handling, and has the worm backend for even faster handling, but I'm just talking about the case with the default sha backend.<br/>+Have such changes been proposed for git? It seems that for anybody already familiar with the git codebase, adding the config option for uncompressed objects and moving the storage location for "blob"+length would be easy changes to make, and I see no downside to them. It wouldn't break backwards compatibility because the object filename being hash."blob".length rather than just hash would indicate that the new object format is in use, and a ".raw" filename extension could be used for uncompressed objects (or more sensibly, in the new format, no additional extension for uncompressed, and ".compressed" for compressed).<br/>+This would also eliminate the need for a git-annex object store separate from the git object store, and the complexities involved with having them separate, and the need for symlinks, and the complexities they cause. I don't think that relying on COW for speed is unreasonable once btrfs becomes the default in major Linux distros (the bsds already have zfs and hammerfs); right now part of what git-annex is doing is just working around the functional deficiency of non-COW filesystems.<br/>+P.S. I recommend a "plain" option for the page type when submitting comments on your wiki, so I don't have to put HTML line break markup at the end of my lines.
@@ -0,0 +1,13 @@+Is it possible to run more than one instance of the assistant in an account?++A particular example is that I might have two annexes:++1. for my music, and+2. for some personal documents.++I would like to have my music annex paired with my work laptop and have all the automagical power of git-annex-assistant working for me. However I don't want to put my personal documents on a work machine, hence the second annex.++(I think) An ideal world would have the assistant managing both annexes. Is this possible?+++I know my question is similar to [one annex versus many annexes?](http://git-annex.branchable.com/forum/one_annex_versus_many_annexes__63__/) but I think it is different enough to warrant a new thread...
@@ -0,0 +1,5 @@+I have the webapp setup to manage 4 different repositories.++One repository had many gigabytes to upload to a remote. As this was moving along, I wanted to check on the status of one of the other repositories. I knew that this second repository had a lot of data to download. When I switched to the second repo in the webapp, I noticed in my network monitor that the amount of upstream bandwidth I was using dropped and the amount of downstream bandwidth increased. I switched back to the first repo, and my downstream bandwidth dropped and the upstream bandwidth increased.++It looks like git-annex stopped uploading data from the first repo when I switched to the second, and stopped downloading data to the second repo when I switched to the first. Is this correct? I was under the impression that switching repositories in the webapp simply changed the view that I was looking at, but that the assistant would still be managing all the repositories I had setup -- uploading/downloading/syncing concurrently.
@@ -0,0 +1,1 @@+My current setup involves 3 computers, one desktop one laptop and a vps. In my current setup I have created annex repos on the server and cloned from it, both machines sync to the server. All three use non base repos. Now I have another annex folder on the desktop that I would like to sync between the three. Both machines are behind NAT so server can not communicate with the machines. In order to init the repo on the vps, I was thinking of setting up a temporary VPN/port forward between the desktop and the VPS then clone from the desktop finally remove the remote section in .git/config on the server so VPS becomes the master again. First of all is there an easier way to do this? if not is it safe to do this? or is it going to cause problems down the line.
@@ -0,0 +1,11 @@+Hi,++I've recently set-up a server which uses Southpaw's Tactic DAM system and I've initialised a git-annex directory using the assistant which will manage any files which Tactic puts into the git-annex. I plan to make some remote repositories to Amazon S3, friends and some local machines on my home network. The server is running Ubuntu 64-bit and so I've written an upstart job which runs 'git-annex assistant --autostart' as the user 'git-annex' as this user doesn't log-in and run the xdg autostart .desktop at all.++I saw that you can set the purpose of each repository which it will sync to and noticed 'Manual Mode.' From the description, it seems it will only work if I do explicit git-annex commands to it which would be perfect for me as I'd like to write tools which run git-annex add/get/drop/etc. manually on some remotes like ones to friends as I don't want them to sync to everything or any files that they produce, only files which they request with a special tool that I'll write and have Tactic marshal the file changes/names/etc.++I've set those remotes to manual-mode via the assistant and tried copying a file to the remote's directory, but it auto-synced the file anyway. Maybe I'm getting confused at how manual mode works but I'd like to only explicitly set which files to add to the repo by a command and not just 'any' file which gets placed into that directory. If this is more of a wishlist request I guess just move this post into there and I'll reword it as a wish request.++I don't need to use the assistant if that makes more sense, but I would like to be able to still monitor things as the webapp makes for a great GUI to check for that stuff. I can't wait for the https version of webapp too, I currently run git-annex webapp --listen=<ip>:<port> and then run the link it outputs on my desktop machine to manage it from the server.++Thanks, and this is such a great bit of software, especially as my Internet connection is really bad for 2013 standards, and having the option for friends/remote servers to sync up via an encrypted S3 or box.com account is great!
@@ -0,0 +1,15 @@+Hello,++I have a Samsung ARM Chromebook running Ubuntu with crouton (chroot in chromeos). I want to use git-annex, and add the chromebook as a second "device" to my already set up git-annex repo on my main pc. That repo is one folder set up with the assistant, and it has one encrypted ssh(rsync) remote.++I've read that the webapp is not available on ARM, and I've also found a topic with a simple script to replicate git-annex-assistant steps: http://git-annex.branchable.com/forum/Running_assistant_steps_manually/. So, I've used the `cabal` steps to install git-annex manually, which is working.++I want to use git-annex in a dropbox-like fashion, folder and file sync between these two devices (and maybe later on another encrypted ssh remote). However I'm in need of some guidance regarding the command line usage and such.++My questions are:++- How do I "add" the chromebook repo to the existing git-annex setup?+- The machines are not on at the same time. One is my main workstation and the chromebook is my "mobile friend". The encrypted ssh remote is on a VPS, that is always on.+ - How do I configure the syncing between the main machine, the chromebook and the encrypted ssh remote on the vps? If possible, bi-directional.++If it is possible, both explanation and command line examples would help a lot.
@@ -0,0 +1,44 @@+Hi,++I've said up two clients to sync locally as well as over ssh-rsync.++However, locally one client is complaining about missing `runshell` at a location where `git annex` is not installed. The log is below. On the assistent overview it just says "unfinished repository". Note that I am able to ssh into the other machine and from the other machine I'm also able to ssh into this machine.+++I'm using the latest prebuild binary package (git-annex-bin at Archlinux AUR). So my `git annex` setup contains ++ $> pacman -Ql git-annex-bin + git-annex-bin /usr/+ git-annex-bin /usr/bin/+ git-annex-bin /usr/bin/git-annex+ git-annex-bin /usr/bin/git-annex-shell++ $> pacman -Qi git-annex-bin # with chops+ Name : git-annex-bin+ Version : 4.20130909-1+ Description : Precompiled version of git-annex, webapp and assistant+ included.+ Architecture : x86_64++Here is a log of one event where it fails to transfer. ++ [2013-09-28 18:06:38 CEST] TransferScanner: queued Upload NoUUID config/emacs.d/ac-l-dict/amsmath-c-a-* Nothing : expensive scan found missing object+ [2013-09-28 18:06:38 CEST] Transferrer: Transferring: Upload NoUUID config/dotfiles/stardict/dic/stardict-oxford-2.4.2/oxford.ifo Nothing+ [2013-09-28 18:06:38 CEST] call: git-annex ["transferkeys","--readfd","96","--writefd","94"]+ [2013-09-28 18:06:38 CEST] read: git ["--git-dir=/home/rasmus/annex/.git","--work-tree=/home/rasmus/annex","show-ref","git-annex"]+ [2013-09-28 18:06:38 CEST] read: git ["--git-dir=/home/rasmus/annex/.git","--work-tree=/home/rasmus/annex","show-ref","--hash","refs/heads/git-annex"]+ [2013-09-28 18:06:38 CEST] read: git ["--git-dir=/home/rasmus/annex/.git","--work-tree=/home/rasmus/annex[","log2","0r1e3f-s/0h9e-ad2s8/ g1i8t-annex..90df78a0910a6f2998655e6:06:38 CEST] 127.0.0.1 GET /transfers/NotificationId%201 Mozilla/5.0 (X11; Linux x86_64; rv:26.0) Gecko/20100101 Firefox/26.0 Aurora/26.0a2+ ea47d478ea0589b54","--oneline","-n1"]+ [2013-09-28 18:06:38 CEST] read: git ["--git-dir=/home/rasmus/annex/.git","--work-tree=/home/rasmus/annex","log","refs/heads/git-annex..5f6870ed24e5ded1764765bbfef2b85aff046569","--oneline","-n1"]+ [2013-09-28 18:06:38 CEST] chat: git ["--git-dir=/home/rasmus/annex/.git","--work-tree=/home/rasmus/annex","cat-file","--batch"]+ [2013-09-28 18:06:38 CEST] read: ssh ["-S","/home/rasmus/annex/.git/annex/ssh/00b8ef4cb08290718ba625d9bd86ca0b","-o","ControlMaster=auto","-o","ControlPersist=yes","-T","rasmus@git-annex-192.168.1.107-rasmus_annex","git-annex-shell 'configlist' '/~/annex/'"]+ /home/rasmus/.ssh/git-annex-shell: line 4: /opt/git-annex.linux/runshell: No such file or directory+ [2013-09-28 18:06:38 CEST] call: git ["--git-dir=/home/rasmus/annex/.git","--work-tree=/home/rasmus/annex","fetch","--quiet","192.168.1.107_annex"]+ [2013-09-28 18:06:38 CEST] 127.0.0.1 GET /transfers/NotificationId%201 Mozilla/5.0 (X11; Linux x86_64; rv:26.0) Gecko/20100101 Firefox/26.0 Aurora/26.0a2+ [2013-09-28 18:06:38 CEST] 127.0.0.1 GET /log Mozilla/5.0 (X11; Linux x86_64; rv:26.0) Gecko/20100101 Firefox/26.0 Aurora/26.0a2+ /home/rasmus/.ssh/git-annex-shell: line 4: /opt/git-annex.linux/runshell: No such file or directory+ fatal: Could not read from remote repository.++ Please make sure you have the correct access rights+ and the repository exists.+ git-annex: Unknown UUID
@@ -0,0 +1,19 @@+Is there a way to move a large file without "git annex unlock"ing it (Which takes very long for copying and then rehashing the file)?+Using a simple "mv" or "git mv" results in broken symlinks, if the target directory is on a different hierarchy level:++Example:++Initial State:++ $ ls -Hl Pictures:+ Pictures/showImages.jpg -> ../.git/annex/objects/90/32/SHA1-s8737--a8bfb285d0ae394cb75c86f1eb9f703fb678a51e/SHA1-s8737--a8bfb285d0ae394cb++Move: ++ $ mv Pictures/showImages.jpg .++Result: ++ $ ls -H showImages.jpg+ ls: cannot access showImages.jpg: No such file or directory+
@@ -0,0 +1,5 @@+The instructions for building git-annex on [[install/Debian]] stable don't seem to be valid anymore.++1. `dpkg-checkbuilddeps` is looking for the wrong packages, e.g. libghc-missingh-dev instead of libghc6-missingh-dev.++2. Not all dependencies are available in the Squeeze repositories anymore (at least not Crypto and hS3), if I am not mistaken.
@@ -0,0 +1,31 @@+Hi, +first sorry for my poor english it's not my native language.++I have one repository on my laptop and two repository on usb disk. Made with following walkthrough (creating a repository and adding a remote).++Yesterday I have a backup of my repository on usb disk before add some file with++cd /media/usb/annex;git fetch laptop; git merge laptop/master&&git annex get .&&git annex sync++Now the repository on my usb disk is a mess.+Every file before the commit are lost. +For example : + After the sync : file Z.7z +Z.7z: broken symbolic link to `../../../../.git/annex/objects/2K/49/SHA256-s0--e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855/SHA256-s0--e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'++The file ../../../../.git/annex/objects/2K/49/SHA256-s0--e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855/SHA256-s0--e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 doesn't exist.++On the repository before the sync (inside the Backup) :+file Z.7z +Z.7z: symbolic link to `../../../../.git/annex/objects/J1/f4/SHA256-s696365035--d2dcc67bf2f05fcfc7f42723b2d415d4f057a2eeadc282b40f5bc3724534f2f4/SHA256-s696365035--d2dcc67bf2f05fcfc7f42723b2d415d4f057a2eeadc282b40f5bc3724534f2f4'++The file ../../../../.git/annex/objects/J1/f4/SHA256-s696365035--d2dcc67bf2f05fcfc7f42723b2d415d4f057a2eeadc282b40f5bc3724534f2f4/SHA256-s696365035--d2dcc67bf2f05fcfc7f42723b2d415d4f057a2eeadc282b40f5bc3724534f2f4 still exist in the repository after the sync.++3 questions, if somebody could help me :++ - what I do wrong ?+ - why the- symlink for every file had change after "cd /media/usb/annex;git fetch laptop; git merge laptop/master&&git annex get .&&git annex sync"+ - how could I fix my repository ? recover file from the backup ? how ? Copy every file to start my repository from a new clean state ?+ ++
@@ -0,0 +1,3 @@+I've started a another project to provide Emacs integration for git-annex: [[https://github.com/jwiegley/git-annex-el]]++My problem with the existing mode is that it didn't feel at all Emacsy, while my mode just piggy backs on existing paradigms, like using `C-x C-q` in a locked file to make it editable, and allowing you to browse and lock/unlock annexed files from Dired.
@@ -0,0 +1,24 @@+New user? Can't figure out the basics? Add it here - what you wanted, what you tried.++#### I wanted to keep track of some files I had all organized in a directory outside of my ~/annex:++ $ cd ~/annex+ $ git annex add /path/to/some/photos+ fatal: '/path/to/some/photos' is outside repository++ But git-annex doesn't work that way. I had to do this instead++ $ rsync -a /path/to/some/photos+ $ git annex add photos+ (Recording state in git...)+ $ git annex status+ ... lots of helpful info...++#### I just have the OS/X app, can I do commandline stuff?++yes++ $ /Applications/git-annex.app/Contents/MacOS/git-annex add photos/+ (Recording state in git...)++but perhaps there is a better way.
@@ -0,0 +1,8 @@+As far I can tell, the encryption mentioned on the wiki for S3 [1] refers to file-level encryption. That is, it encrypts files with GPG before storing them (or after retrieving them) from S3. However, even if I have GPG encryption off, I still want S3 requests to use SSL encryption. As far as I can tell, HTTPS isn't used with S3 remotes. Is there any way to enable it (if so, it should be the default)?++I am using git-annex version: 3.20120406++Cheers,+--acrefoot++[1] http://git-annex.branchable.com/special_remotes/S3/
@@ -0,0 +1,31 @@+My situation goes something like this:++I have a machine with an annex and a number of special remotes (s3, box, and an rsync'd nas). I also have a git remote that's doesn't have git annex on it, so it's just got the git branches. That machine has some problems so I start getting the annex set up on a different machine. These are the steps that I went through:++* clone from the git remote+* git annex doesn't think this is an actual annex at this point, so `git annex init` it+* Now I can start the webapp `git annex webapp`+* My rsync'd remote works and the assistant starts downloading the files from there (which is great, it's the local network one) but the box and s3 remotes are disabled (sure, not a huge deal).+* Click enable on the box remote, I have to specify that it's a full backup remote+* Things start copying from box as well, so I disable it until everything from the local network is done+* Click enable on the s3 remote and it wants my AWS creds+* Download those and add it+* Set the remote up the same way, as a full backup.++At this point, all my files have copied from the rsync remote, so I enable the other remotes.++Now I want to make sure that all the remotes are set up and working properly.++I turn off the webapp, turn off direct mode (I think it was indirect mode by default, but I'd been playing with things before then), and `git annex drop <file>` a file that I don't particularly care about. Everything drops successfully.++I'm able to `git annex get -f <rsync remote> <file>` and from `<box remote>` successfully, but when I try to get from the s3 remote, it doesn't give me any output and doesn't download the file.++Having used regular git annex without the assistant before, I try re-initing the remote `git annex initremote <s3>`. It complains that there's no type, so I `git annex initremote <s3> type=S3`, then it complains about encryption. `git annex initremote <s3> type=S3 encryption=shared`. It says it worked, but I `git annex get -f <s3> <file>` still doesn't do anything.++After more looking around, it turns out that I may have created a second remote with the same name as the original s3 remote... (figure that out). I use the webapp to rename the remotes so they're different, but neither of them will `get -f` successfully.++At this point, I turn to you and ask what the heck I did wrong. I tried editing the remote.log and uuid.log files to remove the new s3 remote (and I figured out which one was which) from the git-annex branch. I also marked the new s3 remote as dead, but I still can't get access to s3.++`git annex fsck -f <s3>` doesn't actually seem to hit s3 (I seem to recall that it used to, it calculated checksums), it just checks some git local information.++I don't mind deleting my current checkout and starting from the clone step again if you think I've made too much of a mess. At least I know I can get my files off my rsync remote and box :)
@@ -0,0 +1,3 @@+Was anyone able to run git annex on Mavericks?++Didn't have time for qualified troubleshooting, sorry
@@ -0,0 +1,12 @@+This is a tip for users who wish to use remotes which are based on OSX systems and have used macports to install some of the required utilities for git-annex to work.++The default behaviour of OSX's sshd is to have a "highly restricted" restricted environment. The defaults that it allows is++ jtang@x00:~ $ ssh x00 echo \$PATH+ /usr/bin:/bin:/usr/sbin:/sbin++One solution is to enable *PermitUserEnvironment yes* in `/etc/sshd_config` and then in your own `~/.ssh/environment` file you could add something like (the below is an example)++ PATH=/Users/jtang/bin:/opt/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/opt/X11/bin:/usr/X11/bin:/Users/jtang/.cabal/bin:/opt/local/libexec/gnubin++If the above is not done, cloning from the OSX host will fail if git is not installed in /usr/bin (which it probably won't be).
@@ -0,0 +1,17 @@+This isn't really a bug of git-annex, but a problem with haskell-platform/ghc6.12.x so this post might need to be moved to a better place (maybe tips).++OSX's haskell-platform doesn't have the dynamic libraries available, as far as I know it just isn't supported therefore git-annex will always be statically built on OSX, so wrappers like <http://tsocks.sourceforge.net/> or [[!google dsocks]] for preloading connect() calls won't work. ++<pre>+jtang@x00:~/annex $ tsocks git annex get .+dyld: could not load inserted library: /opt/local/lib/libtsocks.dylib++error: git-annex died of signal 5+</pre>++The side effect of this means that users who are behind restrictive firewalls that allow only ssh via a socks proxy, they will need to configure ssh to use something like <http://bent.latency.net/bent/git/goto-san-connect-1.85/src/connect.html>.++<pre>+host remotemyhost+ ProxyCommand connect -S proxy.mydomain:1080 -R local %h %p+</pre>
@@ -0,0 +1,5 @@+I'm trying to use git-annex for keeping my company invoices data. It seems a good idea because it's encrypted and whatnot, I'd never upload them to Dropbox. However, Libre Office refuses to work with files copied to annex-tracked folder. It's likely a flaw in LO/OOo, but maybe someone here knows a way to make the two work together.++When opening a spreadsheet, I'm getting a "Document in use - document locked by: Unknown User - Open read-only or open a copy" dialog. I tried opening a copy and saving under a different filename , but I can only save once - any subsequent saves to the same filename result in an error.++A graphic version of my story: http://f.gdr.name/annex-ooo-1.png http://f.gdr.name/annex-ooo-2.png
@@ -0,0 +1,3 @@+My collaborators and I use git annex to track various large data files (among some smaller metadata files managed by ordinary git). Some of these data files need to change completely -- the old ones were just wrong. So I do a git checkout, but don't `git annex get` because it would just be a waste of time and bandwidth. This means that my "data files" are just broken symlinks. Now, I find that by making the necessary directories under `.git/annex/objects/`, I can write to these files in the usual way. The symlinks are preserved, and the files they link to now exist and are full of my corrected data. This seems like it's a problem because the hash has presumably changed. (I'm still a little fuzzy on how exactly git-annex works.) Also, git/git-annex doesn't seem to realize that anything has changed. Is this recoverable?++Would it have been better to just `git rm` (or something) the original version of the file, commit that, and then add the new data? And if so, how should I go about this now that I've created these many very large files? If not, what would be the preferred way to do this?
@@ -0,0 +1,1 @@+I'm having trouble installing the latest git-annex. It depends on 'base >= 4.5 && base < 5', but ghc 7.0 only ships base 3.0. I've tried upgrading ghc to 7.4 but that breaks a whole bunch of other things; for example, the Crypto module fails to compile, preventing me from installing ghc. Please fix compatibility with ghc 7.0.
@@ -0,0 +1,34 @@+I've been trying to use git-annex with the following strategy.++* Download podcasts into the annex `gpodder-downloads`+* Check the podcasts into the annex using `git annex add`.+* Copy the podcasts over to my mp3 player in the annex `usb-ariaz`.+ This is a FAT-formatted mp3 player, so I have been using a bare+ repository. +* Move the podcasts to a different annex called `gpodder-on-usbdisk`+ to indicate that they have been successfully put on the mp3 player.+* `chmod` the files on the mp3 player to `0600` so that I can delete+ them from the player when I am done listening to them.+ +Then I go for a run or something and listen to a bunch of podcasts,+deleting them after I have listened to them. When I get back, I would+like to find the files that I have listened to and remove them from+the annexes that are not on the mp3 player. What I have been hoping+is that something like++ ~/gpodder-on-usbdisk $ git annex find --not --in usb-ariaz --print0 | xargs -0 git rm+ ~/gpodder-on-usbdisk $ git annex unused+ ~/gpodder-on-usbdisk $ git annex dropunused `seq X`+ +would work. However, it appears that `git-annex find` does not+actually check to see that the file contents are present, but only+looks at the `git-annex` branch of the `usb-ariaz` repository. Since+I have not changed that with my sneaky deletions, it has no way of+knowing that the files have been deleted.++Is there any way to do this properly? (And by properly, I don't mean+"don't delete the files". That is really the only way I have of+marking that I have listened to podcasts on this particular mp3 player.)++I tried setting the `usb-ariaz` repository to be untrusted, but that+did not change the behavior of `git annex find`.
@@ -0,0 +1,6 @@+I have an e-mail server configured to save my mail in ~/Maildir on an account that is available over ssh. I'd like to keep emailserver:~/Maildir in a two-way sync with laptop:~/Mail/private essentially creating a poor man's IMAP — without setting up and maintaining an actual IMAP server. **Is it an appropriate use of git-annex or would another tool be more fitting? And how do I go about doing it?** I'd like to sync the files, the content, not just information about the files or other meta-data. ++I tried setting it up with the webUI to the assistant but it only offers encrypted storage[1] on the remote server. I looked into setting it up manually but "git-annex does not notice when files are added to remote rsync repositories."[2]++[1] http://git-annex.branchable.com/bugs/Remote_repositories_have_to_be_setup_encrypted/ +[2] from comments on http://git-annex.branchable.com/special_remotes/rsync/
@@ -0,0 +1,5 @@+We're nearing the end of the year of development funded by Kickstarter. I'm curious to know what the future of the project looks like.++I assume that development will decrease from its current levels as you focus more of your energy on activities that put bread on the table, but is git-annex still something that you foresee actively working on or will it be in more of a feature-freeze-bug-fix stage?++As a backer my only regret is that during the campaign I wasn't able to donate as much as I would have liked. The project has exceeded my expectations since then. I don't know that another Kickstarter campaign is worth the effort, but if you were to ask for donations to fund another month or two or three I would gladly donate. Or perhaps implement a feature-bounty program where users could donate money toward development of a particular feature they would like to see added. Or perhaps you're sick of working for the Internet!
@@ -0,0 +1,12 @@+While trying to compile the current master I run in the following error:++ Utility/Yesod.hs:21:14:+ Couldn't match expected type `String'+ with actual type `WidgetFileSettings'+ Expected type: String -> Q Exp+ Actual type: WidgetFileSettings -> FilePath -> Q Exp+ In the expression: widgetFileNoReload+ In an equation for `widgetFile': widgetFile = widgetFileNoReload+ make: *** [git-annex] Fehler 1++I installed all dependencies from the INSTALL document. What is wrong?
@@ -0,0 +1,26 @@+I have a repository synchronized between two PCs and box.com . I chose encryption for box.com. Today on my work computer I changed files, on box.com I see that there are changed files today. When I got home, I still see files with yesterday's date.+One thing to mention is that currently the work PC is not accessible. ++1. How do I debug this problem? I have logging set to debug via web console, saved, restarted daemon, but after restart the debug checkbox is unchecked.+From logs it looks like that after failing to connect to work pc via ssh it gives up:++ [2013-05-09 21:42:52 CEST] main: Syncing with box.com+this is first and last line mentioning box today, I restarted the daemon several times around 22:14 :++ [2013-05-09 22:11:40 CEST] TransferScanner: Syncing with [work pc repo]+ Already up-to-date.+ + (scanning...) [2013-05-09 22:11:40 CEST] Watcher: Performing startup scan+ Already up-to-date.+ + (started...) ssh: connect to host [work pc] port 22: No route to host+ fatal: The remote end hung up unexpectedly+++2. where is the configuration for box.com stored? How can I check gpg key ID mentioned at http://git-annex.branchable.com/tips/using_box.com_as_a_special_remote/+3. how do I manually trigger sync with box.com? git fetch box.com neither git annex sync box.com doesn't work.+++---+Version: 4.20130501+Build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP
@@ -0,0 +1,1 @@+Are there any problems using submodules with git-annex? I have not tried it yet, I'm just asking.
@@ -0,0 +1,8 @@+I'm trying to use git-annex to archive scientific data. I'm often dealing with large numbers of files, sometimes 10k or more. When I try to git-annex add these files I get this error:+++ Stack space overflow: current size 8388608 bytes.+ Use `+RTS -Ksize' to increase it.+++This is with the latest version of git-annex and a current version of git on OS 10.6.7. After this error occurs, I am unable to un-annex the files and I'm forced to recover from a backup.
@@ -0,0 +1,3 @@+I have a backups repository with a few files in it, that at one point had some huge filesets erroneously added to it. As a result, even though there are only 23,334 annexed files, the number of non-dangling Git objects in the repository comes to 593,584.++Normally I would use `git filter-branch` to clear out the deadwood in situations like this, since it is a completely private repository. What I'm wondering is, is any such thing possible with git-annex, or is the best option just to start over, copy all the files into the new repository, and then `git-add` them all?
@@ -0,0 +1,1 @@+If I use git-annex with a centralized bare git repository as [described here](http://git-annex.branchable.com/tips/centralized_git_repository_tutorial/), will the Assistant automatically `git push` and `git pull` the master and git-annex branches? Or does it basically just do a `git annex sync`?
@@ -0,0 +1,9 @@+I want to setup my remote git repo on S3+Referred to+http://git-annex.branchable.com/tips/using_Amazon_S3/+http://git-annex.branchable.com/special_remotes/S3/++I need support for AWS.config param proxy_uri+http://docs.amazonwebservices.com/AWSRubySDK/latest/AWS.html++Can some one help?
@@ -0,0 +1,43 @@+Hi,++Whenever I do a git annex vicfg (as pasted below) the long gone repo 40da403e-6f74-4705-aae0-433aa656b55e keeps automatically being added back into the configuration. Worse in the webapp this manifests itself as a repository list item that's empty of text (and when buttons are clicked there's a complaint about missing UUIDs).++In addition to removing the lines via git-annex vicfg, I've switched my repository into indirect mode, manually checked out the the git-annex branch and deleted the offending key from the preferred content and group files (it oddly didn't appear in the uuid file). However they keep coming back :-(++Everything seems to be okay bar this rogue entry which in the web-app irrationally bothers me.++I'm running the very latest git-annex release.++Any thoughts?++Cheers,++Matt.+++ # git-annex configuration+ #+ # Changes saved to this file will be recorded in the git-annex branch.+ #+ # Lines in this file have the format:+ # setting uuid = value+ + # Repository trust configuration+ # (Valid trust levels: trusted semitrusted untrusted dead)+ # (for mattford63 (matt@descartes.rss.mhs.man.ac.uk:~/current))+ trust 88733342-45ef-420f-8f1b-9a5ed8d8e070 = semitrusted+ + # Repository groups+ # (Standard groups: client transfer backup incrementalbackup smallarchive archive source manual public unwanted)+ # (Separate group names with spaces)+ # (for )+ group 40da403e-6f74-4705-aae0-433aa656b55e = client+ # (for mattford63 (matt@descartes.rss.mhs.man.ac.uk:~/current))+ group 88733342-45ef-420f-8f1b-9a5ed8d8e070 = client++ # Repository preferred contents+ # (for )+ content 40da403e-6f74-4705-aae0-433aa656b55e = standard+ # (for mattford63 (matt@descartes.rss.mhs.man.ac.uk:~/current))+ content 88733342-45ef-420f-8f1b-9a5ed8d8e070 = standard+
@@ -0,0 +1,4 @@+With git it is easy to create one repository per project, and it almost always makes sense to do so. When using git-annex, what is the recommended setup?++Should one have a single annex containing all files, or is it recommended to create different repositories for things like 'photos', 'music', 'isos' ?+
@@ -0,0 +1,1 @@+I have around 70 GBs of data spread around 4 repositories on a Linux (Ubuntu) box. My problem is I need to reformat the drive they are on. I would like to move them to an external usb drive temporarily during reinstall then move them back to their original location. When I started with annex I did try to mv annexFolder/ toNewLoc/ which failed leaving behind a corrupt repo. What is a safe way to move an annex folder? My primary connection is a 3G modem so I am trying to avoid re downloading everything. Another thing I am trying to avoid is cloning the repos to the external drive, reinstall, clone it back to the internal drive and mark original and external repos as dead, but AFAIK those dead repos will show up in the output of whereis, so everytime I reformat I gonna have two extra dead repos.
@@ -0,0 +1,29 @@+Hi,++I've removed some large files with git remove, but seem to be unable to remove the corresponding annex content.++Example:++kheymann@corax:~/annex$ find -name "*s24576--10daa3d9007edad720dc057e4272a9c6cda930bef34a83e3bc1d93f1c55b9cac" ++./.git/annex/objects/jF/j7/SHA256-s24576--10daa3d9007edad720dc057e4272a9c6cda930bef34a83e3bc1d93f1c55b9cac++./.git/annex/objects/jF/j7/SHA256-s24576--10daa3d9007edad720dc057e4272a9c6cda930bef34a83e3bc1d93f1c55b9cac/SHA256-s24576--10daa3d9007edad720dc057e4272a9c6cda930bef34a83e3bc1d93f1c55b9cac++kheymann@corax:~/annex$ git annex dropkey -vvv --backend SHA256 s24576--10daa3d9007edad720dc057e4272a9c6cda930bef34a83e3bc1d93f1c55b9cac++No output but the files remain in the annex. Git annex fsck and git annex unused run without listing files to be removes. What can I do apart from deleting the files manually from the annex?++Some info:++ kheymann@corax:~/annex$ git annex version+ git-annex version: 3.20121017+ local repository version: 3+ default repository version: 3+ supported repository versions: 3+ upgrade supported from repository versions: 0 1 2++Any hints?++Best, +Karsten
@@ -0,0 +1,25 @@+Is there a way to restrict git-annex-shell to a specific directory?+Currently, if git-annex is paired to a remote repository, it adds this to the authorized_keys:+++ $ cat ~/.ssh/authorized_keys+ command="~/.ssh/git-annex-shell",no-agent-forwarding,no-port-forwarding,no-X11-forwarding ssh-rsa AAAAB3...++ $ cat ~/.ssh/git-annex-shell + #!/bin/sh+ set -e+ exec git-annex-shell -c "$SSH_ORIGINAL_COMMAND"++That gives whoever has the pubkey the right to access all repositories of one user.+It would be nice to have a manual way to limit the access to a specific repository like +++ $ cat ~/.ssh/git-annex-shell + #!/bin/sh+ set -e+ export GIT_ANNEX_SHELL_REPO=~/annex+ exec git-annex-shell -c "$SSH_ORIGINAL_COMMAND"+++Or maybe some chroot hackery is the way to go?+
@@ -0,0 +1,5 @@+I use the assistant with a local directory in direct mode. I have read in different places that direct mode does not ensure that past versions of files are preserved.++What precisely happens to past versions? Under which conditions are past versions kept?++How would I go about retrieving the past version of a file in direct mode?
@@ -0,0 +1,9 @@+I've recently found the following problem:++I really really want to get back my original folder structure - which includes the real files, not the symlinks. I've searched for quite a while, but I simply could not find an acceptable solution...++So I thought I would like to ask you guys here, if anybody experienced similar problems (or at least knows a solution for my problem)?++Greetings++Pethor
@@ -0,0 +1,2 @@+How can I run the assistant on a server and access the webinterface over the network from my client pc?+The use case I have in mind is that the server can automatically synchronize files, pushed over XMPP.
@@ -0,0 +1,20 @@+Unfortunately one of the machines that I am running git-annex on is too old to handle the watcher thread.++The error message is:++ Watcher crashed: Need at least OSX 10.7.0 for file-level FSEvents+++I am however interested in duplicating the assistant steps manually. I'm happy to accept that I won't have the great, auto-magic, coverage, but, how I run the steps that the assistant runs?++I'm guessing there is a:++ git annex add .+ git commit -m "[blah]"+ git annex sync++but how do I get the pushing to backup/transfer/whatever remotes to work? And what order should I do these?++What I would *like* to do is get a script that runs all of the needed annex steps and then kick it off in a cron job 2-5 times a day.++Any thoughts?
@@ -0,0 +1,17 @@+When syncing with a huge git annex repository on usb disk, my small laptop partition runs out of inodes.++Any workaround for this?++- Use bare repository?++ Some git annex command are not supported.+ This makes managing (particularly adding) files difficult.++- Use a loop file partition with tiny block size and large inode numbers?++ Operations on a huge git repository are slow.+ On a loop file partition will be slower.++- Maybe shrink the partition and make room for a specific partition for git annex repository?++Any opinions?
@@ -0,0 +1,1 @@+Is it possible to use the same jabber account for different annexes? I think I've mixed up several repositories by using the same jabber account for synchronizing...
@@ -0,0 +1,3 @@+Hi, I'd like to share files with friends, to do so we need a shared server to exchange the files. I could setup an ssh access on one of my servers but I don't want others to have a full access. I assume I can restrict this using a `command='wrapper-around-git'` prefix in `.ssh/authorized_keys`, where `wrapper-around-git` is simply a script that checks if `SSH_ORIGINAL_COMMAND` is an authorised command and runs it. This is exactly the approach used with Mercurial (hg-ssh) and presumably git also relies on this mechanism.++But to do so, I need to know what commands can be executed over ssh when using git-annex assistant. Could you document about this? Thanks!
@@ -0,0 +1,13 @@+I want to setup a rsync special remote on my server with a non-standard ssh port.++I tried the following steps:++ git annex initremote rsync-encrypted type=rsync rsyncurl=1.2.3.4:/encrypted-annex encryption=AAAAAAAAA+ git config remote.rsync-encrypted.annex-rsync-options "-e \'ssh -p 443\'"++But I just get this error:++ [2012-11-22 21:04:30 CET] read: rsync ["-e","'ssh","-p","443'","--progress","--recursive","--partial","-- partial-dir=.rsync-partial","/home/marco/annex/.git/annex/tmp/rsynctmp/15309/","1.2.3.4:/encrypted-annex"]+ Missing trailing-' in remote-shell command.++I tried some ways to escape the config but I don't have a clue. Anybody?
@@ -0,0 +1,6 @@+Hi,++When using git-annex assistant, is there a possibility to share only certain files or directories from a repository (similar to what Dropbox can do), or do we have to share whole repositories so far?+Could this be a nice wishlist item, or is there a strong reason against adding this feature to git-annex?++Thanks a lot!
@@ -0,0 +1,38 @@+I just setup git-annex across three macs, using git-annex assistant. I have one repository working fine, which successfully syncs between two of my own accounts on two different machines, via S3.++Now I'm trying to get the "share with a friend" feature to work. The problem is that only Mac Alias's / sym links are created, for example:++Machine 1:+- Copy file into ~/annex/++Machine 2:+- The file is synced as a sym-link, with a link into a file in .git that doesn't exist.++The config is:+- Version: 4.20130909-ga29f960 - Build flags: Assistant Webapp Pairing Testsuite S3 WebDAV FsEvents XMPP DNS Feeds Quvi+- Two macs+- Share with friend over Jabber+- Use Box as the cloud sync service with encryption enabled. Box is setup as a transfer repository.++I've looked through the logs in .git/annex/daemon.log* and there doesn't look to be any problems.++This is what the log looks like:++ [2013-09-14 19:55:47 PDT] Committer: Adding 20120101-..084-1.jpg+ failed+ add /Users/nick/Shared/20120101-GOPR0084-1.jpg (checksum...) ok + add /Users/nick/Shared/20120101-GOPR0084-1.jpg (checksum...) ok + add /Users/nick/Shared/20120101-GOPR0084-1.jpg (checksum...) ok + add /Users/nick/Shared/20120101-GOPR0084-1.jpg (checksum...) ok + add /Users/nick/Shared/20120101-GOPR0084-1.jpg (checksum...) [2013-09-14 19:55:47 PDT] Committer: Committing changes to git+ [2013-09-14 19:55:48 PDT] XMPPSendPack: Syncing with USER2 + Already up-to-date.+ To xmpp::USER2@gmail.com+ 7b65b15..183b91c git-annex -> refs/synced/6163ef8e-c36a-4b09-919b-9c18ade55234/bmlja2JsYWNrMUBnbWFpbC5jb20=/git-annex+ 3104275..96afa09 master -> refs/synced/6163ef8e-c36a-4b09-919b-9c18ade55234/bmlja2JsYWNrMUBnbWFpbC5jb20=/master+ [2013-09-14 19:55:49 PDT] XMPPSendPack: Syncing with USER2 + Everything up-to-date+ recv: resource vanished (Connection reset by peer)+++Any ideas what I should look at next? Thanks in advance :-)
@@ -0,0 +1,1 @@+Hi, is there any particular problem with symlinking one .git/annex to share between multiple repos?
@@ -0,0 +1,2 @@+I want to use the annex assistant instead of the command line. Which is the recommended method to check out a file that I want to edit?+
@@ -0,0 +1,18 @@+I have previously been confused by how to have a bit more manual control over where files are (as in [[bugs/git-annex_immediately_re-gets_dropped_files/]]).++I thought perhaps something like an archive directory would work, but as I might want different computers to have different content, perhaps a per-computer archive repository.++To that end, I have++<pre>walter@dionysus:~/annex$ git annex content .+(exclude=archive/dionysus/* or (not (copies=archive:1 or copies=smallarchive:1))) or (not copies=semitrusted+:1)+ok</pre>++which is a modified version of the archive [[preferred_content]], but with the intention that I change the part after `exclude` to be different for each client.+I also set the group to client for this client (dionysus).++However, it does not seem to drop files when I move them into `archive/dionysus/`, and I cannot see anything in the logs to suggest why.++What am I doing wrong here? Or, is this the wrong approach?++--Walter
@@ -0,0 +1,12 @@+Apparently, the tablet computer I'm using (Galaxy Tab 2, non-rooted) does not export the sd cards via mass storage protocol (UMS) any more. In order to be able to use a special remote for my mp3-files, I installed an ftp/ssh server on the tablet device and used curlftpfs/sshfs (fuse file systems) to mount the sd cards on my local Linux machine. In this way, it is is quite easy to setup the special remote (e.g. "git-annex initremote galaxy-tab type=directory directory=$HOME/mnt/galaxy-tab encryption=none"). ++Problems arise, when files are transferred to the special remote. From the logs of the ftp server, I can see that the actual copy operation is successful (the data is written to the file system), but the subsequent "chmod" that changes the permissions to read-only fails. The output on the console of a "git-annex copy -t galaxy-tab" is ++ copy 01 some.mp3 (to galaxy-tab...) + failed + git-annex: copy: 1 failed+++Therefore my question: is it possible to perform a file transfer to a special remote (type=directory) without the final "chmod"-operation?++Thank you.
@@ -0,0 +1,3 @@+Is there a way to store a file in an annex repo without the assistant trying to commit it? My particular issue is that git annex watch tries to add my .thunderbird folder, and I don't want it in annex. Is that a supported use case?++Also, for my better understanding, does watch keep track of what files it saw last time and only look for new things on startup? Or does it try to commit anything that's not already in git (whether symlink or not)?
@@ -0,0 +1,31 @@+Hi,++I was a bit hasty the other day and did something stupid. I+added a new folder to git annex. Something like++ git annex add my-important folder++my-important folder contains a lot of files and it took a couple+of minutes to add. When I then tried to do++ git commit -am 'added files'++per the walkthrough I got an error (9, as I recall). I thought+I'd added too many files or something so I wanted to start over+and perhaps I didn't fully understand the mechanisms of annex I+did the following++ git reset --hard .++Unfortunately, did replaced my files with a bunch of symlinks,+rather than making git annex forget and go back to the previous+stage as I had hoped.++I have managed to recover most of my files from backup, but some+of them I still can't recover. Is there any way back? It seems+I still have the files in my git folder.++Thanks,+Rasmus++PS: Sorry, I shouldn't have made this text rather than Markdown.
@@ -0,0 +1,9 @@+Hi,++It is possible to keep devices sync only using a box.com account as a transfer remote, without Jabber? I can't use Jabber because of firewall restrictions.++It would be nice to be able to use the transfer remote, in my case box.net, as the sync "provider", for example by polling a file with the needed changes in a pre-defined interval.++Regards,++Stone
@@ -0,0 +1,10 @@+Hi, ++i'm thinking to use git-annex to synchronize my virtual machine directory (Virtualbox) between 3 pc. It's quite big: more than 200GB and some of the images are 40Gb in size.++The synchronization will be over a lan (obviously). It is already in place with 2pc and unison but the configuration of the 3rd pc is cumbersome. +Does anybody have experiences with git-annex and such amount of data?++Thanks in advance++Gabriele
@@ -0,0 +1,9 @@+I've been using git-annex locally for a couple months. So far I've only used it to keep track of files on my laptop and local usb hard drives. Now I would like to add a network into the picture, and hopefully start to move away from Dropbox.++I have Dropbox on two computers: my home machine and my work machine. The home machine is only on when I'm at home and the work machine is only on when I'm at work, so the computers are never on at the same time and thus can never communicate directly. What are my options for keeping annexes on these two machines in sync?++Initially I was hoping that I could use an S3 special remote for this, but I see that special remotes only hold the actual file data, not any of the git stuff. So I can't push my changes to S3 at work and then pull those changes in at home.++From what I can tell from the documentation, the only way I can handle this problem is to have an annex sitting on a VPS or someplace that both my home and work machines can talk to. Is that correct? That would be ok, but if I'm going to put my annex out there in the cloud somewhere, I want the files to be encrypted. It looks like git-annex only supports encryption of file data with special remotes, not a full annex. Is there no way to have some sort of encrypted git-annex hub?++I backed the assistant and have been following the development blog, but I haven't tried it out yet. Am I correct in thinking that nothing in the assistant will address this particular issue?
@@ -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,3 @@+Hi!++I have a laptop A on which I setup a box.com special remote as a transfer encrypted repository. It is quite unclear to me how I should configure laptop B to use the same box.com remote and share files between the two machines.
@@ -0,0 +1,15 @@+I'm having trouble install from cabal on Debian-testing since the new beta released.++ % sudo aptitude remove --purge cabal-install+ % rm -rf $HOME/.cabal+ % sudo aptitude install cabal-install+ % cabal update+ % cabal install git-annex++The output all follows this general syntax:++ <package> depends on <anotherpackage> which failed to install++On the flip side, I upgrade my Debian to sid and it installed just fine through aptitude.++(Apologies for my English, and if this is simply a user error)
@@ -0,0 +1,1 @@+Since I'm just starting out with git-annex, I've had several false starts in getting things setup nicely between three machines. In the course of so doing, I've ended up with several repositories which no longer exist, and which I've marked dead. However, this is making the "git annex status" report a bit ugly, since these repositories no longer exist and can never exist again. Is there a way to truly purge dead repositories from my annex? I'd be fine with a command that must be ran in tandem on all annexes before doing a sync...
@@ -0,0 +1,7 @@+Quick question: I want to create a repository on my removable USB drive that will acquire all files (eg. "full backup" repository group), but where the files will be visible and usable if you load the drive on another computer.++How do I do that from within the assistant?++Thanks,++Zellyn
@@ -0,0 +1,3 @@+Is there a PPA that Ubuntu people are using to track the latest git-annex?++The [Ubuntu install page](http://git-annex.branchable.com/install/Ubuntu/) mentions [https://launchpad.net/~rubiojr/+archive/git-annex](https://launchpad.net/~rubiojr/+archive/git-annex) which hasn't been updated for a while.
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawmeki7KlfJpAAN9CUmi9EdwhwBmIhDMYuE"+ nickname="Marvin"+ subject="comment 1"+ date="2013-03-11T09:40:43Z"+ content="""+im also looking for a PPA with newer git-annex versions. mostly because of the glacier support...+"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawmVICFY2CDP08xdsPr3cgmScomy9HA-1sk"+ nickname="Andrew"+ subject="comment 2"+ date="2013-03-13T02:31:52Z"+ content="""+It's perfectly possible (though slightly messy) to install git-annex on Ubuntu via [[/install/cabal]], though you need to find and install all the required dependencies yourself (haskell, libidn, libgnutls, libgsasl etc). If you want to get crazy with this look at <http://developer.ubuntu.com/packaging/html/>+"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="fmarier"+ ip="121.98.93.240"+ subject="My PPA (Ubuntu Precise) has git-annex 4.20130417"+ date="2013-04-27T11:12:26Z"+ content="""+I just went through the pain of backporting 90+ Haskell packages from Debian unstable: https://launchpad.net/~fmarier/+archive/ppa+"""]]
@@ -0,0 +1,12 @@+[[!comment format=mdwn+ username="http://grossmeier.net/"+ nickname="greg"+ subject="All PPAs are outdated"+ date="2013-05-08T17:38:04Z"+ content="""+My work preinstalled Ubuntu machine is now on Raring, and even there the version of git-annex is only 3.20121112ubuntu3; too old to have the webapp option enabled :/ The two PPAs mentioned here aren't configured to build for Raring, so even though the one from François has a build from May 1st (7 days ago), it doesn't help me ;)++François: mind updating your PPA to support Raring? Thanks much if you do!++Either that, or I'll take the time some day to do a proper install on this machine (read: Debian). ;-)+"""]]
@@ -0,0 +1,12 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawmBUR4O9mofxVbpb8JV9mEbVfIYv670uJo"+ nickname="Justin"+ subject="comment 5"+ date="2013-05-08T23:25:37Z"+ content="""+If you are on raring you can still use++ deb http://ppa.launchpad.net/fmarier/ppa/ubuntu precise main++It's worked fine for me so far.+"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawkx5V3MTbzCXS3J7Mn9FEq8M9bPPYMkAHY"+ nickname="Pedro"+ subject="comment 6"+ date="2013-05-20T15:52:40Z"+ content="""+Be careful that the fmarier ppa includes more than just git-annex.+"""]]
@@ -0,0 +1,12 @@+[[!comment format=mdwn+ username="https://openid.fmarier.org/"+ nickname="fmarier"+ subject="New location for my git-annex PPA"+ date="2013-06-15T07:42:13Z"+ content="""+My Ubuntu Precise PPA has moved here: https://launchpad.net/~fmarier/+archive/git-annex++It contains version 20130601 of git-annex.++As Pedro suggested, it's now in a separate PPA with only git-annex and the 220 Haskell packages it depends on.+"""]]
@@ -0,0 +1,6 @@+Hi,++I am using git-annex assistant on my Fedora Linux computer. Everything seems to be working perfectly, however I have noticed that almost all of my files are now symbolic links to cryptic file names located in the .git/ directory. Oddly though it seems files inside git-annex assistant does not move/symbolic link files within git repositories inside my git-annex assist directories. My question is: how can I safely uninstall git-annex from my machine and restore all files to their non-symbolic link states? When I click on the settings drop-down for a repository inside git-annex assistant and choose disable it goes to the same page as the delete option. Any ideas?++Regards,+Blake
@@ -0,0 +1,7 @@+Hello,++I was recently evaluating git-annex as a file sync tool, but I've got my files in a state where they are a mess. The short version is that I have a local repo, and then an Encrypted S3 remote. Once I encrypted the files, they got renamed and so forth and the files are now just symbolic links to files within the .git directory somewhere. This has made some of them unusable for me and I need to revert the files back to not being symlinks any longer. How would I go about doing that?++Thanks,++Brandon
@@ -0,0 +1,5 @@+I have an annex set up with an s3 special remote. It works fine on one computer. I cloned the annex to a USB stick, plugged the stick into a second computer and cloned the annex to that machine. When I try to `git annex initremote cloud` on the second machine, I get the following error:++ git-annex: Unknown remote type S3++The second machine is running git-annex 3.20121017.
@@ -0,0 +1,13 @@+I just started using the assistant on an existing annex. I fire up the assistant like so:++ $ git annex webapp++Everything syncs and looks to be working fine. In another terminal, I then create a new file:++ $ touch testfile.txt++The assistant sees that file, immediately adds it and syncs. Ok. So now I want to edit that file.++ $ git annex unlock testfile.txt++As soon as I unlock the file, the assistant re-adds it to the annex and syncs, preventing me from editing the file. How can I edit files with the assistant running?
@@ -0,0 +1,13 @@+I'm trying to figure out if git-annex can be used for the following use case:++- 2 repos in direct mode A and B+- A is on a local filesystem, B could be a NFS mountpoint or ssh+- B contains a number of toplevel directories, A contains a subset of those+- For the subset in A all changes in those directories that happen on A or B should be synced automatically between both repos, including file removals.+- A can decide to not carry a toplevel dir any more, but it must still exist in B.+- A can copy new toplevel dirs from B and those should be synced from then on.++I've been looking at the docs and played with two test repos, but I cannot seem to make the above work. To me it looks like I would need a possibility include/exclude paths from syncing via a regex.++Thanks,+Felix
@@ -0,0 +1,3 @@+I have a question on setting up a new repo. Is it possible to initialize a new repo using files which are already local on say my laptop, instead of downloading them from a S3 remote repository? Sorry if this is unclear. But I'm trying to make use of the files that are local on my laptop so I don's have to go through the ordeal of downloading them from S3.++I should also mention that I don't have a complete set of all the files locally on the laptop vs. what's already in the S3 repository.
@@ -0,0 +1,1 @@+On BTRFS it is possible to use [reflinks / clones](https://en.wikipedia.org/wiki/Btrfs#Cloning). This is the equivalent of hardlinks except that when the file is modified, a copy is performed (copy on write). Perhaps git-annex could detect the availability of this feature and use it in case it is available (and the repository and the file are in the same filesystem).
@@ -0,0 +1,25 @@+Hello,++I want to use git-annex on a couple of machines that are not under my control (and one that is). For that I use the provided static build, but encountered several problems:++I suppose the first step for command line use is to execute runshell:++On one machine:++flindner@yoko:~> software/git-annex.linux/runshell +/bin/bash: /lib64/libc.so.6: version `GLIBC_2.11' not found (required by /home/flindner/software/git-annex.linux//lib/x86_64-linux-gnu/libreadline.so.6)++Is there anything I can do about it?++On the other machine:++flindner@bladefoam2:~$ software/git-annex.linux/runshell +bash-4.1$ ++It starts a bare, non-configured shell instance. Can I modifiy and source the script to only set the environment and not start up a new shell?++Another question: If using ssh:// remotes, how can I tell git-annex the first command to set up the environment need in order to execute command via SSH?++Thanks,++Florian
@@ -0,0 +1,9 @@+Is there a way to sync all (or a subset of) local branches, not just the currently checked out branch?++Does this make sense at all, or does this show I am missing some important point in git-annex?++I am asking because I would like to use git-annex to keep git repositories with normal git files (with versioned and branched content) in sync.++If it's not currently possible, could you provide some pointers on where to start, if I wanted to change to Haskell source?++Thnx
@@ -0,0 +1,13 @@+Hi, ++I am looking into using git-annex to sync my Music between 3 sources: desktop, laptop, backup, but I'm not sure if this will work ok.++I notice on the wiki that: "Normally, the content of files in the annex is prevented from being modified. That's a good thing, because it might be the only copy, you wouldn't want to lose it in a fumblefingered mistake."++But most music players will download artwork, and some of course will dynamically modify/rename files according to meta data. And I may be downloading and/or playing music on both the desktop and laptop. So obviously I wouldn't want to be manually unlocking individual files here. It would kinda interrupt the music listening experience. So how would this work?++I am assuming that I would always have to do a git annex add *.mp3 *.flac *.jpg before doing a git annex sync. But can I just keep everything unlocked? Any side effects here? Will this work or should I just use rsync?++Regards,++bk
@@ -0,0 +1,1 @@+I am looking to use git-annex as a library/tool to bring syncing to another application. Is there any documentation or open examples of doing something like this?
@@ -0,0 +1,3 @@+After installing the binary for Mac OS X and including some larger directories, my computer now seems quite busy (for the last days) with the import process. I see a process called git-annex causing the load, so it seems OK. As the git-annex assistant seems to hang quite a bit, I would like to see the progress using a command line interface. However, I cannot use the "git annex" command as I get the message "git: 'annex' is not a git command. See 'git --help'."++I guess this is my normal git version, installed by homebrew (the OS X version for apt-get) that does not know anything about the installed binary. Can I still use the CLI with this version? Or better, is there or will there be a way to install git-annex from source, or even better using "brew install git-annex"?
@@ -0,0 +1,12 @@+Hello,++I'm not sure about the differences and interactions between watch / assistant / webapp / direct mode. I think I figured the following out, can someone confirm this, and perhaps a few words to the documentation / man page?++- git annex watch uses inotify to find new files, and runs git annex add on them (it does not do regular git add)+- git annex assistant does the same as watch, but also runs git annex sync for each new file (does it also enable direct mode?)+- git annex webapp does the same as assistant, and also starts a webapp (in my case it immediately started sending files to origin, without asking for confirmation, which was surprising, I guess this is because I have * annex.numcopies=2 set, and there was only one copy. Still I interpreted the documentation as if it would only show me an interface, not start doing things right away.)++Do these commands do anything else than what I described above?++best regards,+Tom
@@ -0,0 +1,6 @@+Webapp on ARM?+==============++Since the webapp is apparently now available on Android (not tested yet, but I plan to do it soon ;)), I was wondering what was the status of the webapp on ARM. Does it build, does it work, and if it does would it be possible to enable it in the Debian package for the next release?++For the record, I'm using git-annex on my NAS (Synology DS413j). I'm using the Debian armel package and running it in an Arch Linux chroot (a very simple setup). It works really well, and I'm extremely satisfied with git-annex. Thanks a lot for all your work, Joey *et al.*!
@@ -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,12 @@+I am having some weird issues with git annex under OS X. I am new to git annex, and am generally familiar with git. I really like the concept of git-annex and am trying to lean how to fit it into my workflow, but Im running into problems. ++I have a folder that I would like to keep in sync across multiple computers and thumb drives. Right now this folder consists of other folders and PDF files. After initializing git and git-annex, all of the files turn into symlinks, as expected. ++Looking at this folder in OSX's finder, none of the symlinks have preview images unfortunately, as expected. Also, when trying to open the file (or symlink, and in this case PDFs) in finder, it opens the console which outputs a bunch of crap and then nothing happens. Right clicking on the symlink in finder and using Open with... the default application to open the symlink to the PDF is OSX's Preview.app, as expected, however for some reason this isn't being used when simple double clicking. If you click on the Preview.app option under the right click menu, Preview.app launches, but never opens the file. Selecting an alternative such as the Skim.app pdf viewer (if installed) successfully launches the application and opens the file. ++My questions are:+1. What is the cause of not being able to launch the file in the correct app by simply double clicking it? Do I have something mis-configued? Is it a bug with git-annex? Is git-annex simply not set up to work with finder yet?+2. How come preview can't open the file but skim can? This might be directly related to the above question, but maybe not.+3. Is it possible to get file previews for the symlinks in your annex folder? Are there plans to enable this kind of thing in the future, if even possible? ++Details about my setup. I am running on a 32-bit Core Duo Macbook pro from 2006, so enviably I have to run 10.6.8 and its the highest OS version I can reach right now. All my CLI packages are installed and up to date with Mac Homebrew. I am running git version 1.7.12. I freshly installed haskell-platform: stable 2012.2.0.0 via homebrew. From there I installed git-annex-3.20120825.
@@ -0,0 +1,7 @@+Hi,++How can I resolve the conflict when it occurs?++Suppose I have 2 branches (master, current), When I merge these branches or while doing cherry-pick, if I get conflict how can I resolve it?++Thank You
@@ -0,0 +1,1 @@+As of right now (2012-05-24 at 18:00 UTC), the [[Walkthrough]] page is basically empty. Its entire contents are "A walkthrough of the basic features of git-annex." No links (other than the autogenerated "what links to this page" list at the bottom) and no contents. Any idea what happened?
@@ -0,0 +1,1 @@+Since all the annexed (in indirect mode) files are symlinks to topdir/.git/annex/... moving files among directories at different levels is not that straightforward since symlinks would get broken. And since there is not 'annex mv' command -- what is the best way? (unlock is not the resolution since it copies the file, which might be prohibitively large and inefficient)
@@ -0,0 +1,3 @@+So Box.net and Amazon is supported, any way to get google drive in there?++thanks for cool software!
@@ -0,0 +1,5 @@+I created a test remote using the command:++ git annex initremote mybup type=bup encryption=none buprepo=/tmp/mybup++I can copy files to and from the remote just fine. However, every time I do so it makes changes inside `~/.bup`. If I delete `~/.bup` it will recreate it. Is this expected? Are the files in `~/.bup` of any consequence?
@@ -0,0 +1,7 @@+Here's my current situation:++I have a box which creates about a dozen files periodically. All files add up to about 1GB in size. The files are text and sorted. I then rsync the files to n servers. The rsync diff algorithm transfers way less than n * 1GB because the files are largely the same. However, this distribution technique is inefficient because I must run n rsync processes in parallel and the rsync diff algorithm takes a lot of CPU.++How could I use git-annex instead of rsync?++Because the box producing the new files also has the old files, then presumably git could calculate the diffs for each file once instead of n times as with the rsync solution? Then only the diffs need be distributed to the n servers... using git-annex? And finally the newly updated version of the dozen files needs to be available on each of the n servers. Ideally, the diffs would not mount up over time on either the publishing server or the n servers, thus causing out of disk problems etc. How to deploy git-annex to solve my problem?
@@ -0,0 +1,3 @@+FAT32 does not support symlinks, so I wonder if there's going to be a problem with that.++Generally speaking, I am wondering about portability of git annex on windows and on android...
@@ -0,0 +1,6 @@+Hi,++Do you have any news about Windows support?+Is this something you're currently working on?++Thanks!
@@ -0,0 +1,25 @@+Having a spot of bother in setting up for windows usage.++I'm attempting to have a windows box syncing to a server (over ssh) and a linux box also syncing against that*++So, on each machine I do++ git init+ git annex init+++On the windows and linux desktops I then do a + + git remote add server serverdetails.++Now the problem is that if I don't add files to the repos on the machines, they won't sync as there is no branch checked out; and if I do then the first one is fine but the second will fail as it doesn't allow fast-forwards. What am I doing wrong? I've tried making the server repo bare / not bare.++I'm using the latest nightly windows build, and a build from git from today (29d5bb94b4512cfe3072c9ff840cb0ce9f2af744)++++++++*Actually I'm trying to do something a little more complex than that, but this is the simplest version I can come up with.
@@ -0,0 +1,5 @@+**EDIT: Mistakenly posted this thread in the forum. I created a new post in [[todo|todo/Bittorrent-like_features]]++Do you think it would be possible to have bittorrent-like transfers between remotes, so that no one remote gets pegged too hard with transfers? It would be great if you distribute your files between multiple bandwidth-capped remotes, and want fast down speed. Obviously, this isn't a simple task, but the protocol is already there, it just needs to be adapted for the purpose (and re-written in Haskell...). Maybe some day in the future after the more important stuff gets taken care of? It could be an enticing stretch goal.++PS: still working on getting BTC, will be donating soon!
@@ -0,0 +1,3 @@+Maybe this explained somewhere else, but what is the purpose of marking files readonly. To me this is an annoyance that doesn't make sense. I want to be able to change my files, having to go through an unlock step, to do that seems like unnecessary work. Interestingly, Microsoft's Team Foundation Server source control does the same thing and I don't like it there either.++In addition why replace files with symlinks? Why not just leave the real files in place, or do the reverse and put the symlink to the file in the repository.
@@ -0,0 +1,15 @@+It would be extremely useful to have some additional ways to select files (for git annex copy/move/get and maybe others) based on the meta-information available to git-annex, rather than just by file or directory name.++An example of what I'd like to do is this:++ host1$ git annex copy --to usb-drive --missing-on host2++This would check location tracking information and copy each file from host1's annex which is not present on host2 onto the usb-drive annex -- i.e. it's what I want when I need to do a sneakernet synchronisation of host1 and host2 (for backup purposes, for example). Note that of course I could copy --to host2, assuming network connectivity, but that would take a long time.++There's probably other selectors that we can imagine; an obvious one could be --present-on <annex> -- useful for judiciously dropping only those files that you have easily available in a local annex (as you may want to keep files that are hard to make available even if --numcopies would nominally be satisfied).++Other similar ideas for file content selectors:++ * Files that have less than n, exactly n or more than n copies -- for when you need to satisfy your --numcopies policy over sneakernet.+ * Files that are present (or not present) on some trusted annex -- for making sure you have trusted copies of everything.+ * Boolean combinations of these filters -- "git annex drop --present-on lanserver1 --or --present-on lanserver2" or similar syntax, although obviously doing this in full generality may be quite fiddly.
@@ -0,0 +1,14 @@+I think it would be useful to supplement the `reinject` command with an automatic+mode which calculates the checksum of the source file and injects the file if it+is known to the repository (without the need to provide a destination filename).+In addition, this could be done recursively if the user provides a directory to+inject. All this can probably be done already with some plumbing, but a simple+`reinject --auto` (or `scour`, or `scavenge`, if you like) would be a nice addition.+Of course this would only work for the checksum backends.++Example use cases would be:++* Recovering data from lost+found easily+* Making use of old (pre-git-annex) archival volumes with useful files+ scattered among non-useful files+* Sneaker-netting files between disconnected git-annex repositories
@@ -0,0 +1,10 @@+I'm not sure if this _feature_ exists already wrapped or provided as a recipe for users or not yet. But it would be nice to be able to do a++ git annex du [PATH]++Such that the output that git annex would return is the total disk used locally in the PATH and the theoretical disk used by the PATH if it was fully populated locally. e.g.++ $ git annex du FSL0001_ANALYSIS+ $ Local: 1000kb, Annex: 2000kb++or something along the lines of that?
@@ -0,0 +1,12 @@+I have several remotes which are not always accessible. For example they can+be on hosts only accessible by LAN or on a portable hard drive which is not+plugged in. When running sync these remotes are checked as well, leading to+unnecessary error messages and possibly git-annex waiting for a few minutes+on each remote for a timeout.++In this situation it would be useful to mark some remotes as offline+(`git annex offline <remotename>`), so that git-annex would not even attempt+to contact them. Then, I could configure my system to automatically, for example,+mark a portable hard disk remote online when plugging it in, and offline when+unplugging it, and similarly marking remotes offline and online depending on+whether I have an internet connection or a connection to a specific network.
@@ -0,0 +1,13 @@+Since _transfer queueing_ and syncing of data works now in the assistant branch (been playing with it), there are times when I really don't want to sync the data, I would like to just sync meta-data and manually do a _get_ on files that I would want or selectively sync data in a subtree.++It would be nice to have the syncing/watch feature to have the option of syncing only *meta-data* or *meta-data and data*, I think this sort of option was already planned? It would also be nice to be able to automatically sync data for only a subtree.++My use case is, I have a big stash of files somewhere at home or work, and I want to keep what I am actually using on my laptop and be able to selectively just take a subtree or a set of subtree's of files. I would not always want to suck down all the data but still have the functionally to add files and push them upstream and sync meta-data.++that is...++> * Site A: big master annex in a server room with lots of disk (or machines), watches a directory and syncs both data and meta-data, it should always try and pull data from all it's child repos. That way I will always have a master copy of my data somewhere, it would be even nicer if I could have clones of the annex, where each annex is on a different machine which is configured to only sync a subtree of files so I can distribute my annex across different systems and disks.+> * Site A: machine A: syncs Folder A+> * Site A: machine B: syncs Folder B+> * and so on with selectively syncing sites and directories+> * Laptop: has a clone of the annex, and watches a directory, syncs meta-data as usual and only uploads files to a remote (all or a designated one) but it never downloads files automatically or it should only occur inside a selected subtree.
@@ -0,0 +1,15 @@+Hi,++Not sure if this is a bug or not, so posting it here rather than in the bug tracker.++Basically, I am unable to add an XMPP identity via the webapp, I continually get the error message: "Unable to connect to the Jabber server. Maybe you entered the wrong password? (Error message: AuthenticationFailure)"++I didn't enter the wrong password, I copy/pasted it from my password manager and the same account/password work fine with Pidgin. The log doesn't show anything of interest that I can see.++Using git annex version 4.20130405 from Debain Unstable. The server is ejabberd running on my VPS with a self signed certificate.++Anyone got any idea what might be going on?++Cheers,++Rob
@@ -0,0 +1,11 @@+I need some help understanding here.++We use AeroFS at work to sync the normal user files across computers. I'll quite likely be replacing that with git annex as soon as Windows port is stable enough.++How it works is that you create a repo, and share it with one or more users. Then AeroFS discovers what other repos are online and if they're on the local network, and syncs from wherever is most convenient.++This sounds a little like pairing, but with pairing you need to arrange more than 2 devices in a "star" or "chain". This is fine for my own devices, but it becomes brittle if you have lots of devices syncing from each other, which may or may not be online at any given time. The only way around it seems to be to pair each device with each other device, with the labor rising exponentially.++Is this correct? Best compromise for my use case seems to be to just do a star setup and pair everything with an always-on machine. Do you agree?++Thanks! Carlo
@@ -0,0 +1,5 @@+One reason to use git-annex is to save disk space by tossing files you don't use that often.++I can find big files in the repository with git annex find --largerthan=100M, but is there a way to find large *directories*? In an ordinary filesystem I'd use "du -h" with a maxdepth to get an idea of what parts of a directory are taking up my disk space, but obviously that won't work with git annex because all the content is in .git/annex. Any ideas?++(I can get a listing of file sizes in a directory with the handy -L flag of ls -- "ls -lL" shows me the sizes of the link targets -- but that won't summarize all the sizes of subdirectories. Unless my ls-fu is just weak.)
@@ -0,0 +1,7 @@+I found the command "git annex lock" very slow (much slower than the initial "git annex add" with SHA1), for a not so big directory, when run in a big repo.+It seems that each underlying git command is not fast, so I thought it would be better to run them once with all files as arguments.+I had to stop the lock command, and ran "git checkout ." (I did not change any file), is this a correct alternative?++Thanks a LOT for this software, one that I missed since a long time (but wasn't able to write)!++Rafaël
@@ -0,0 +1,17 @@+i'm getting errors in ``git annex fsck`` on a shared bare git repo with git-annex 3.20120418 local repo version 3:++``git-annex: ${PATH}/${MYREPO}.git/annex/objects/${HA}/${SH}/SHA1-${HASH}/SHA1-${HASH}: setFileMode: permission denied (Operation not permitted)``++the repository is shared among several users in a common group, and the repo is set up with sticky group, and with appropriate umasks, everything should work.++however, even with the file having permissions -rw-rw-r-- in the directory with permissions drwxrwsr-x, owned by someone else but by a group i'm currently in (as verified by issuing `groups`), i get said error message.++a strace reveals that the failing syscall is:++``[pid 17626] chmod("${FILENAME}", 0100555) = -1 EPERM (Operation not permitted)``++(maybe related: git annex looks for the file in another ${HA}/${SH} combination (of three digits instead of two digits each) before, i take it this is just a new feature not used by the data in my repo? also, i should add that the repository dates back to git-annex 0.13.)++as a workaround, i'm currently ``sudo chown``ing all files to me before the check.++why does fsck try to set permissions even if they are ok? is this a bug in my setup, and if yes, how is a shared repository set up correctly?
@@ -0,0 +1,5 @@+Thanks for creating git-annex.++I am confused about the advantages of the SHA* backends over WORM. The "backends" page in this wiki says that with WORM, files "can be moved around, but should never be added to or changed". But I don't see any difference to SHA* files as long as the premise of WORM that "any file with the same basename, size, and modification time has the same content" is true. Using "git annex unlock", WORM files can be modified in the same way as SHA* files.++If the storage I use is dependable (i.e. I don't need SHA checksums for detection of corruption), and I don't need to optimize for the case that the modification date of a file is changed but the contents stay the same, and if it is unlikely that several files will be identical, is there actually any advantage in using SHA*?
@@ -0,0 +1,9 @@+It would be really neat if there was a way to get just the `git-annex` binary on Android, without getting the entire APK. This can be useful when one is already using their own shell and rootfs, for example I work with <a href="https://sites.google.com/site/taldewandroid/">this</a>.++This way, one can just use parts of git-annex, without having to have a whole APK and its dependencies, and the space it takes up, etc.++So would you be able to add a download link for this?++++Thanks for the wonderful project!
@@ -0,0 +1,12 @@+First off, thanks so much for your hard work, git-annex is amazing.++I just started using the [web as a special remote](http://git-annex.branchable.com/tips/using_the_web_as_a_special_remote/) feature with the SHA256E backend, and I noticed that although the annexed file has the correct backend prefix (SHA256E) it does not have the extension of the file in the URL. The URL is `https://...IMG_1234.JPG` but the annexed file is `SHA256E-...832c99` with no extension.++This is fine for most use cases, but I actually access an S3 remote directly from another app (independent of git-annex) to render photos, and in that app I'm using the extensions to figure out file types, so not having that info is slightly inconvenient.++Is there any way to either:++1. tell git-annex to preserve the extension of a file on the web in the annexed file, or+2. alternatively, change the annexed filename (add the extension manually) without screwing anything up?++Any help would be much appreciated, thanks!
@@ -0,0 +1,36 @@+Earlier this week, I somehow lost a ton of files from my annex -- by switching on the command line from indirect to direct mode while the assistant was running, I think. I'm not sure.++Anyway, by "lost" I mean "lost the symlinks to," because git-annex defaults to keeping content around till you tell it otherwise. So I still had the content in the repos on my two backup drives. All I needed was the symlinks back.++But how to figure out exactly what I lost and get it back?++I found that out here:++http://stackoverflow.com/questions/953481/restore-a-deleted-file-in-a-git-repo++Here's a magical formula you can use to find every single file deletion in the history of your repo:++ git log --diff-filter=D --summary ++That will give you every commit that deleted things, and what was deleted.++To bring back all the files deleted in a given commit, where COMMITHASH is the commit hash, use this command:++ git checkout COMMITHASH^1 -- .++to bring back only a specific file:++ git checkout COMMITHASH^1 -- path/to/file.txt++to bring back only a subdirectory:++ git checkout COMMITHASH^1 -- sub/directory++that will bring them back into the staging area. You can see which ones just reappeared by typing:++ git status++then you can actually make the restore permanent by typing: ++ git commit -m "I just resurrected some files"+
@@ -0,0 +1,8 @@+The assistant archival walk-through describes how files get removed from local repo if moved into archive repos.+What if the files in question aren't needed immediately (and can be archived) for one user of a shared repo, but needed by someone else on their own machine?+git-annex directory arrangement propagation wouldn't work for this case, it seems. Could assistant handle this case?++It looks like having a browser of the directory tree in git-annex assistant webpage with say right-click menu with "get" and "drop" would be the most flexible.++Or maybe it could be more about integration with Linux etc file browsers (but then it's system specific, unlike with webapp).+
@@ -0,0 +1,5 @@+Debian Squeeze, git version 1.7.10.4, git-annex version 3.20121211++The machine has a clone of the annex with preferred content string: `present or include=calibre/* or include=img/* or include=mail/* or include=music/* or include=sounds/*`++This, I believe, should mean the assistant should never drop anything. However for the past two days it's been moving files to an encrypted rsync remote so that there are two copies (there is another copy on an external HDD) and then it's dropping them from the current annex. I want to keep the files here; can anyone think of any reason why they would be moved away?
@@ -0,0 +1,13 @@+"watch" is described as++> With this running as a daemon in the background, you no longer need to manually run git commands when manipulating your files.++and "assistant" is described as++> Like watch, but also automatically syncs changes to other remotes.++I would like the behaviour of assistant, without the watch part:++I have an archive of large files, which I think would be useful to manage manually using git. But I don't want to manually enforce the "numcopies=" requirement, playing with the assistant and webapp it seems really nice to have it take care of that.++Is there currently an "assistant-without-watch" option? If not, is it planned?
@@ -0,0 +1,34 @@+This is a continuation of the conversation from [[the comments|design/assistant/#comment-77e54e7ebfbd944c370173014b535c91]] section in the design of git-assistant. In summary, I've setup an auto builder which should help [[Joey]] have an easier time developing on git-annex on non-linux/debian platforms. This builder is currently running on OSX 10.7 with the 64bit version of Haskell Platform.++The builder output can be found at <http://www.sgenomics.org/~jtang/gitbuilder-git-annex-x00-x86_64-apple-darwin10.8.0/>, the CGI on this site does not work as my OSX workstation is pushing the output from another location.++The builder currently tries to build all branches except ++* debian-stable+* pristine-tar+* setup++It also does not build any of the tags as well, Joey had suggested to ignore the bpo named tags, but for now it's easier for me to not build any tags. To continue on this discussion, if anyone wants to setup a gitbuilder instance, here is the build.sh script that I am using.++<pre>+#!/bin/bash -x++# Macports+export PATH=/opt/local/bin:$PATH++# Haskell userland+export PATH=$PATH:$HOME/.cabal/bin++# Macports gnu+export PATH=/opt/local/libexec/gnubin:$PATH++make || exit 3++make -q test+if [ "$?" = 1 ]; then+ # run "make test", but give it a time limit in case a test gets stuck+ ../maxtime 1800 make test || exit 4+fi+</pre>++It's also using the branches-local script for sorting and prioritising the branches to build, this branches-local script can be found at the [autobuild-ceph](https://github.com/ceph/autobuild-ceph/blob/master/branches-local) repository. If there are other people interested in setting up their own instances of gitbuilder for git-annex, please let me know and I will setup an aggregator page to collect status of the builds. The builder runs and updates on a very regular basis.
@@ -0,0 +1,28 @@+Wouldn't it make sense to offer++ git annex pull++which would basically do++ git pull+ git annex get++and++ git annex push++which would do++ git annex commit .+ git annex put # (the proposed "send to default annex" command)+ git commit -a -m "$HOST $(date +%F-%H-%M-%S)" # or similar+ git push++Resulting in commands that are totally analogous to git push & pull: Sync all data from/to a remote.++> Update:++This is useful:++ git config [--global] alias.annex-push '!git pull && git annex add . && git annex copy . --to $REMOTE --fast --quiet && git commit -a -m "$HOST $(date +%F--%H-%M-%S-%Z)" && git push'+
@@ -0,0 +1,1 @@+I wrote more than 2 years ago a bash completion file for git-annex (did I miss an official version?) I just updated it today to match current version of git-annex, it is far from perfect, still incomplete, and probably buggy, but works for me. I tried to attach the file in case it could be useful to someone, but it seems that I can't; is it ok to paste the code directly?
@@ -0,0 +1,34 @@+When I copy my local repository with SHA* to a remote repo with SHA*, every single file is checked by itself which seems rather inefficient. When my remote is accessed via ssh, git-annex opens a new connections for every check. If you are not using a ssh key or key agent, this gets tedious...++For all locked files, either git's built-in mechanisms should be used or, if that's not possible, a few hundred checksums (assuming SHA* backend) should be transfered at once and then checked locally before deciding that to transfer.++Once all checks are done, one single transfer session should be started. Creating new sessions and waiting for TCP's slowstart to get going is a lot less than efficient.+++-- RichiH++> (Use of SHA is irrelevant here, copy does not checksum anything.)+> +> I think what you're seeing is+> that `git annex copy --to remote` is slow, going to the remote repository+> every time to see if it has the file, while `git annex copy --from remote`+> is fast, since it looks at what files are locally present.+> +> That is something I mean to improve. At least `git annex copy --fast --to remote`+> could easily do a fast copy of all files that are known to be missing from+> the remote repository. When local and remote git repos are not 100% in sync,+> relying on that data could miss some files that the remote doesn't have anymore,+> but local doesn't know it dropped. That's why it's a candidate for `--fast`.+> +> I've just implemented that.+> +> While I do hope to improve ssh usage so that it sshs once, and feeds+> `git-annex-shell` a series of commands to run, that is a much longer-term+> thing. --[[Joey]]++>> FYI, in a repo with 1228 files, all small, repos _completely in sync_.++ % git annex copy . --to foo # 1200 seconds+ % git annex copy . --to foo --fast # 20 seconds++>> RichiH
@@ -0,0 +1,10 @@+I am evaluating the best strategy to use git-annex to manage my media library. It consists of about 300.000 files totaling 1 TB of data.++My question is, wheither it would be of advantage to split the repo into several smaller ones (Like Photos, Videos, Musik, Books, ...)?++Would this affect performance of certain operations? I.e. Operations that have superlinear (O(n^a) with a > 1) complexity?++I am thinking about "git annex unused", which takes 22 minutes on my machine performed on the full repo. +++Do you have more interesting information on using git-annex in this scale?
@@ -0,0 +1,23 @@+Hey, so I am trying to compile git-annex through cabal but it fails on building uuid. It gives me this strange error:++ Resolving dependencies...+ Configuring uuid-1.3.1...+ Building uuid-1.3.1...+ Preprocessing library uuid-1.3.1...+ [ 1 of 10] Compiling Data.UUID.Builder ( Data/UUID/Builder.hs, dist/build/Data/UUID/Builder.o )+ [ 2 of 10] Compiling Data.Word.Util ( Data/Word/Util.hs, dist/build/Data/Word/Util.o )+ [ 3 of 10] Compiling Data.UUID.Internal ( Data/UUID/Internal.hs, dist/build/Data/UUID/Internal.o )+ Data/UUID/Internal.hs:394:20: Not in scope: `BL.fromStrict'+ Data/UUID/Internal.hs:399:48: Not in scope: `BL.toStrict'+ cabal: Error: some packages failed to install:+ git-annex-4.20131002 depends on uuid-1.3.1 which failed to install.+ uuid-1.3.1 failed during the building phase. The exception was:+ ExitFailure 1++Any advice on how to proceed?++System is: Debian Wheezy (CrunchBang Waldorf) 64bit++versions are:+ uuid-dev: 2.20.1-5.3+ cabal: 1.14.0
@@ -0,0 +1,27 @@+Hi,++[ sorry for the wrong bugreport in the last version of this entry ]++It seems as if I can only add my own file to the annex, even if I have group write permissions. Is that correct? Can that be circumvented other than copying/deleting the large file?++Here is some demonstration:++ > git init+ > git config user.name dtr+ > git config user.email dtrn@dtrn.com+ + > dd if/dev/zero of=test2.bin count=1000+ + > ll+ -rw-rw-r-- 1 dtr dtr 512000 Sep 16 2013 test2.bin+ + > sudo chown someone test2.bin+ > ll+ -rw-rw-r-- 1 someone dtr 512000 Sep 16 2013 test2.bin+ + > git annex init+ > git annex add test2.bin+ add test2.bin (checksum...) + git-annex: /test-git-annex/.git/annex/objects/Fq/f6/SHA256-s512000--2d4da04b861bb9dbe77c871415931785a18138d6db035f1bbcd0cf8277c6fc23/SHA256-s512000--2d4da04b861bb9dbe77c871415931785a18138d6db035f1bbcd0cf8277c6fc23: setFileMode: permission denied (Operation not permitted)+ failed+ git-annex: add: 1 failed
@@ -0,0 +1,13 @@+Hi,+a few years ago I wrote a tool called 'ddm'. The code is overengineered and the script is more complicated then it should be,+but I think it demonstrates some good use cases, and I wonder how well git-annex can fulfill the requirements for those use cases - maybe I should remove ddm and start hacking with git-annex instead.++To answer this question, you should read the section about the possible dataset types on http://dieter.plaetinck.be/ddm_a_distributed_data_manager.html, and the example at the bottom of that page. it demonstrates the idea behind the "selection" dataset to always try to keep a subset (the most appropriate, based on the output of some script) of files "checked out".+the introduction section on https://github.com/Dieterbe/ddm/raw/358f7cf92c0ba7b336dc97638351d4e324461afa/MANUAL should further clarify things, as well as give some more good use cases (as you can see it's a bit more about [semi-]automated workflows then purely tracking what's where)++So I'm not sure, maybe the way to go for me is to make git-annex my "housekeeping about which data is where" backend and make ddm into a set of policies and tools on top of git-annex.++Any input?++Thanks,+Dieter
@@ -0,0 +1,1 @@+Using webapp I cannot get rid of box.com repository, it is locked in 'cleaning out' state for more than two weeks. How can I remove the repository from the list?
@@ -0,0 +1,16 @@+git-annex can already be used to store data in several cloud services:+Amazon S3, rsync.net, Tahoe-LAFS, The Internet Archive.++I would like to support as many other cloud services as possible/reasonable.++* [[swift|todo/wishlist:_swift_backend]]+* Dropbox (I had been reluctant to go there due to it using a non-free client,+ which I have no interest in installing, but there is actually an API,+ and already a+ [haskell module to use it](http://hackage.haskell.org/package/dropbox-sdk).+ Would need to register for an API key.+ <http://www.dropbox.com/developers/start/core>.+ Annoyingly, Dropbox reviews each app before granting it production status.+ Whoops my interest level dropped by 99%.)++Post others in the comments. --[[Joey]]
@@ -0,0 +1,6 @@+Hi,++Glad to see this project appears to be doing well. I just wanted to mention that there's a similar project called cloudcmd that has many of the same use cases in spirit: https://github.com/briangu/cloudcmd++Cheers,+Brian
@@ -0,0 +1,5 @@+I'd like to commit the current workdir state in direct mode in a script. This is what git annex watch does but I can not reliably start and stop git annex watch in a cron script.++Is this already possible with the current api or could we have something like git annex watch --once?++Thank you, Thomas Koch
@@ -0,0 +1,113 @@+I'm starting out with git-annex and running into some confusion with setting up the remotes.++I have three systems I'm trying to set up (domains edited):++* psychosis: ssh://psychosis.foo.com/vid+* bacon: ssh://bucket.foo.com/vid+* bucket: ssh://bucket.bar.org/vid++And one bare repository so that I can have a single place to push/pull:++* origin: https://git.foo.com/jim/vid.git++On psychosis:++ psychosis$ git config --list | grep ^remote | sort+ remote.bacon.annex-uuid=8f1f0898-f8c1-11e0-9bf2-b387af26ee63+ remote.bacon.fetch=+refs/heads/*:refs/remotes/bacon/*+ remote.bacon.url=ssh://bucket.foo.com/vid+ remote.bucket.annex-uuid=82814942-f8e0-11e0-b053-e70a61e98e19+ remote.bucket.fetch=+refs/heads/*:refs/remotes/bucket/*+ remote.bucket.url=ssh://bucket.bar.org/vid+ remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*+ remote.origin.url=https://git.foo.com/jim/vid.git+ + psychosis$ git annex status+ supported backends: WORM SHA1 SHA256 SHA512 SHA224 SHA384 SHA1E SHA256E SHA512E SHA224E SHA384E URL+ supported remote types: git S3 bup directory rsync web hook+ known repositories: + 09c0b436-f8de-11e0-842f-b7644539d57f -- here (psychosis)+ 82814942-f8e0-11e0-b053-e70a61e98e19 -- bucket+ local annex keys: 2256+ local annex size: 449 gigabytes+ total annex keys: 2256+ total annex size: 449 gigabytes+ backend usage: + WORM: 2256++**First point of confusion**: Why doesn't "bacon" show up in "git annex status"? I can "git annex copy --to bacon filename" and it will copy it there. Is there some step of setting it up that I missed? I basically just did "git remote add bacon ssh://bucket.foo.com/vid".++Now I've started setting up the remotes on each host:++On bacon:+ + bacon$ git config --list | grep ^remote | sort+ remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*+ remote.origin.url=https://git.foo.com/jim/vid.git+ remote.psychosis.annex-uuid=09c0b436-f8de-11e0-842f-b7644539d57f+ remote.psychosis.fetch=+refs/heads/*:refs/remotes/psychosis/*+ remote.psychosis.url=ssh://psychosis.foo.com/vid+ + bacon$ git annex status+ supported backends: WORM SHA1 SHA256 SHA512 SHA224 SHA384 SHA1E SHA256E SHA512E SHA224E SHA384E URL+ supported remote types: git S3 bup directory rsync web hook+ known repositories: + 09c0b436-f8de-11e0-842f-b7644539d57f -- psychosis+ 8f1f0898-f8c1-11e0-9bf2-b387af26ee63 -- here (bacon)+ temporary directory size: 366 megabytes (clean up with git-annex unused)+ local annex keys: 1+ local annex size: 308 bytes+ total annex keys: 2256+ total annex size: 449 gigabytes+ backend usage: + WORM: 2256++On bucket:++ bucket$ git config --list | grep ^remote | sort+ remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*+ remote.origin.url=https://git.foo.com/jim/vid.git+ remote.psychosis.annex-uuid=09c0b436-f8de-11e0-842f-b7644539d57f+ remote.psychosis.fetch=+refs/heads/*:refs/remotes/psychosis/*+ remote.psychosis.url=ssh://psychosis.foo.com/vid++ bucket$ git annex status+ supported backends: WORM SHA1 SHA256 SHA512 SHA224 SHA384 SHA1E SHA256E SHA512E SHA224E SHA384E URL+ supported remote types: git S3 bup directory rsync web hook+ known repositories: + 09c0b436-f8de-11e0-842f-b7644539d57f -- psychosis+ 82814942-f8e0-11e0-b053-e70a61e98e19 -- here (bucket)+ temporary directory size: 183 megabytes (clean up with git-annex unused)+ local annex keys: 3+ local annex size: 550 megabytes+ total annex keys: 2256+ total annex size: 449 gigabytes+ backend usage: + WORM: 2256++But I'm getting weird results if I try to show the map from psychosis:++ psychosis$ git annex map+ $ git annex map+ map /vid/tv ok+ map bacon (sshing...) + ok+ map bucket (sshing...) + ok+ map origin + failed+ map psychosis (sshing...) + jim@psychosis.foo.com's password: + ok+ map psychosis (sshing...) + jim@psychosis.foo.com's password: + ok+ + running: dot -Tx11 map.dot++**Second confusion**: it's as if psychosis was considered a new remote each time?+The generated map has psychosis listed with several redundant links:++++Is this some bug or do I just need to be hit with the clue bat?
@@ -0,0 +1,25 @@+I've been syncronizing my data since long time, mainly using rsync or unison. Thus I had two 3.5Gb datasets set1 (usb drive, hfs+ partition) and set2 (hdd, ext4 ubuntu 13.04 box) which differed only in 50Mb (new on set1 ). This was double checked using diff -r before doing anything.++I created a git annex repo in direct mode for set2 from command line, and after that I let the assistant scan it.+After that created the repo for set1 and added it to the assistant. I think here comes my mistake (I think).++Instead of keeping them apart, at told assistant to sync with set2.+Why I think this was a mistake? Because set2 was indexed and set1 no, and I'm seeing a lot of file moving a copying, which in my humble opinion should not happen.+What I expected it only the difference to be transferred from set1 to set2.+What it seems to be doing is moving away all content in set1, and copying it back from set2. I think it will end correctly, but with a lot of unnecessary and risky operations.++I think I should have independently added both datasets, let them be scanned and then connect to each other.+So, now the questions:++1. Is that the correct way to proceed?+2. What if I have to identical files with different modifying times, I hope they are not synced, right?+3. Is it posssible to achieve this behaviour of copying only the 50Mb?++Thanks in advance and keep up the good work.+Best regards,+ Juan++EDIT: a couple of questions more:++4. after finishing, set2 ended with a lot of symlinks but only in one subfolder. To prevent this should I put numcopies in 2?+5. This data is composed of input datasets and output simulations. Thus, I need to change them often, but not as often as code and in a very partial way (chunks of 50Mb). For me direct mode is the best (or plain git). However, I was wondering, it is possible to drop some files (even in direct mode) and use simlinks instead?
@@ -0,0 +1,5 @@+When I was checking out disk usage on my home directory, I noticed a bunch of files stored in .git/annex/tmp under their own filenames, rather than in .git/annex/objects. Checking a couple, they seem to be redundant with stuff in .git/annex/objects.++Is there any way to clean that stuff up? Will the assistant eventually clean it up?++Thanks!
@@ -0,0 +1,8 @@+Hi,++I setup a first repository on local disk, it went fine. Next I tried setting up repo on my nas to clone the files. I installed git-annex on the NAS (it's armel arch) and created the repository via webapp, I entered the password once. Git-annex started syncing the remote repo and after few seconds password pop-up hell broke loose. I was flooded with password-prompt pop-up windows. The synchronization was continuing regardless of correctly/incorrectly entered passwords. What's more, these popups grab the keyboard and you cannot do (appropriate word) with your system.++I checked this topic: http://git-annex.branchable.com/forum/ssh_password/ and ssh config is in place on my computer and on the NAS.++What is causing this and how can I get rid of this?+
@@ -0,0 +1,14 @@+Hi,++I was trying to install git-annex, but then, I got a warning saying that I need to install base-4.5.0.0 first.++So, I did "sudo cabal install base-4.5.0.0". Everything was going well, until I got this error:++config.status: error: cannot find input file: `base.buildinfo.in'+cabal: Error: some packages failed to install:+base-4.5.0.0 failed during the configure step. The exception was:+ExitFailure 1++I tried to look for information on the internet, but I did not find anything useful.++I know that this is not totally related to git-annex, but anyone has any thoughts on this?
@@ -0,0 +1,33 @@+I found this archival drive that had been offline since October 26th 2010. Since I released git-annex 0.02 on October 27th, this must have been made using the very first release of git-annex, ever.++So, I synced it back up! :) --[[Joey]]++<pre>+commit 4151f4595fe6205d4aed653617ab23eb3335130a+Author: Joey Hess <joey@kitenet.net>+Date: Tue Oct 26 02:18:03 2010 -0400++joey> git pull+remote: Counting objects: 428782, done.+remote: Compressing objects: 100% (280714/280714), done.+remote: Total 416692 (delta 150923), reused 389593 (delta 125143)+Receiving objects: 100% (416692/416692), 44.71 MiB | 495 KiB/s, done.+Resolving deltas: 100% (150923/150923), completed with 818 local objects.+ * [new branch] git-annex -> origin/git-annex+ 1893f9c..9ebcc0e master -> origin/master+Updating 1893f9c..9ebcc0e+Checking out files: 100% (76884/76884), done.+joey> git annex version+git-annex version: 3.20110611+local repository version: unknown+default repository version: 3+supported repository versions: 3+upgrade supported from repository versions: 0 1 2+joey> git config annex.version 0+joey> git annex upgrade+upgrade . (v0 to v1...) (v1 to v2) (moving content...) (updating symlinks...) (moving location logs...) (v2 to v3) (merging origin/git-annex into git-annex...)++ git-annex branch created+ Be sure to push this branch when pushing to remotes.+ok+</pre>
@@ -0,0 +1,10 @@+I'm wanting to do essentially [[/tips/replacing_Sparkleshare_or_dvcs-autosync_with_the_assistant/]], that is prevent git-annex from annexing certain files (by extension), and rather manage them in git only.++This seems to work fine, and the assistant auto-adds them to git, and commits when I make changes, when in indirect mode.++However, in a direct mode repository, then the files are automatically annexed, and even if I create them in an indirect repo, and then change it, they are annexed.++Is this expected behaviour? Does the annex.largefiles setting only make sense in indirect mode?+++--Walter
@@ -0,0 +1,19 @@+Before turning this into a 'todo' item i'd like to discuss the possibilities...++The idea is following:++Having a Laptop with a rather small SSD or some other mobile device i'd like to move files away which are not needed anymore.+The first thing is that the --to destination should be semi-automatically choosen, including ensuring enough replicas++ git annex move --away <path..>++should pick remotes which are suitable (either by configuration and/or other rules like disk utilization on the remote side).++I am rather new to git-annex and wondering if there is currently already something which gives similar results, esp not need to hand pick the remotes where to move files.++Further on there needs to be some way to find out which files are not needed anymore. On a first thought filtering by 'atime' would be nice, but nowadays mounting with noatime/relatime is common which would make this infeasible. To accomplish this, the assistant could (optionally) manage a lazy-atime by setting inotify or fanotify watches on all annexed files in a repository (close_nowrite) and queue/batch atime updates coarsely together. Then atimes on disk are only lazily updated (after some time expires, when the queue becomes full or at shutdown of the assistant), we can afford to loose some atime updates here in case of unexpected shutdowns (i rather wonder why the kernel has no lazy-atime option).++Then the assistant (or by crontab) one can schedule some regular maintenance. There are certainly plenty of options to consider here, for example a mobile device might prefer only to send files if connected to Wlan, someone wants to move files away until a certain threshold of free disk space is reached etc...+ +While at this, the assistant could also watch (fanotify) if someone tries to open a not available (dead symlinked) file, block that request, get the file and then proceed with the request.+
@@ -0,0 +1,4 @@+Is there an easy way to export annexed files out of the repository? (e.g. to make a copy elsewhere, send a file by email...)++Thanks,+Denis.
@@ -0,0 +1,7 @@+I have a git installation on my web server (web faction hosting). It allows me to run repositories from my hosting account. ++What I want is to use git-annex as a dropbox replacement. Specifically, the central repository being my web server and then using local installations on my 2 mac laptops (primarily), access through browser on windows, and access on android as well (browser or some other method). ++I'm looking at the install instructions, walkthrough, etc. What I'm initially not clear on is whether I need to install git-annex on my (linux centOS) webserver and any machine through which I'm accessing the repo? Seems like that would be the case of course, but I wanted to validate. ++Am I going to run into issues that folks might already be able to warn me about? Anything I need to know?
@@ -0,0 +1,7 @@+flickrannex -- is it a way to upload your images to flickr by putting them in a git annex directory, and make them retrievable from it handily that way?++Or is it a hack to exploit flickr's free storage, by allowing you to somehow wrap your files in images and uploading them?++My python and knowledge of how git annex's hooks work is not good enough for me to be certain by reading the code.++Thanks
@@ -0,0 +1,6 @@+Hi,++I use git-annex 3.20120123 on a debian-testing amd-64 machine with software RAID6 and LVM2 on it. I needed to move the whole `/home` directory to another LV (the new LV is on encrypted PV, the old LV is encrypted and not properly aligned; I'm changing from encrypted `/home` only to encrypted everything except `/boot`), so I have used the `rsync -aAXH` from a `ro` mounted `/home` to a new LV mounted on `/mnt/home_2`. After the move was complete I run the `git annex fsck` on my (4TB of) data. The fsck finds some files bad, and moves them to the `..../bad` directory. So far so good, this is how it should be, right? But then- I have a file with sha1sum of all my files. So - I checked the 'bad' file against that. It was OK. Then I computed the SHA256 of the file - this is used by `git annex fsck`. It was OK, too. So how did it happen, that the file was marked as bad? Do I miss something here? Could it be related to the hardware (HDDs) and silent data corruption? Or is it the undesirable effect of rsync? Or maybe the fsck is at fault here?++Any ideas?+
@@ -0,0 +1,7 @@+Based on the thread over at <http://git-annex.branchable.com/forum/__34__du__34___equivalent_on_an_annex__63__/> I decided to finally write a du like utility for git-annex. A 0.01 version is up over at <http://git-annex.mysteryvortex.com/git-annex-utils.html>. It works, but I intend to make it smarter about handling git repos and annexed files, as well as adding more of the options available in the standard du utility.++Currently it will tally up the sizes of links that look like they are annexed files. I plan to make it actually interact with git and git-annex to verify the files are annexed and enable options like tallying files only from specific remotes, only missing files, not double counting files which are annexed multiple times but stored only once, etc...++I'll have time to work on this on the weekends, and plan to get my git repo up soon. After gadu is mostly complete I might work on some other tools.++Releases are signed with a PGP key with fingerprint 5E1A 65D7 D5E9 56F1 C239 43DF C6C8 9A0B 6003 8953 (available on the website)
@@ -0,0 +1,7 @@+is `git annex get` and `git annex copy --to somewhere` expected to work with bare repos? the [[bare repositories]] page doesn't indicate otherwise, but a `git annex get` does plain nothing in my setup.++if it's supposed not to work, there should be an error message saying that and an indication on the [[bare repositories]], otherwise, how can i trace it down?++in case it is just unimplemented for lack of use cases: my setup consists of several laptops using parts of a 200gb+ photo collection, a central trusted server that should host everything, and an external encrypted remote backup. clients *should* copy everything they add to both central locations, but i'd prefer the trusted server to sync the two of them too.++`get` and `copy` usually operate on the current directory, which in case of a bare repo does not contain any relevant files, but i tried explicitly specifying files too. `git annex` should either look them up in master, or always operate on all files (as indexed in the `git-annex` branch) unconditionally.
@@ -0,0 +1,11 @@+I'm not sure if this is my stupidity or if it's a bug, but++ git annex copy --force --to REMOTE . ++just zip's through really quickly and doesn't actually force a copy to a+remote location. This is just following up on the+[[bugs/git-annex_directory_hashing_problems_on_osx]]. I want to just do a force copy of all my data to my portable disk to really make sure that the data is really there. I would similarly would want to make sure I can force a ++ git annex copy --force --from REMOTE .++to pull down files from a remote.
@@ -0,0 +1,28 @@+Hi,++I've been experimenting with combining [ikiwiki](http://ikiwiki.info) with git-annex and it seems to work. Thought I'd post my process. I've [commented](http://ikiwiki.info/todo/git-annex_support/discussion/) on the ikiwiki website as well but perhaps it'd be of interest to git-annex folks.++I have very little understanding of any of the tools involved and have just attempted to make it work using my limited knowledge. I don't use the web interface for ikiwiki which simplifies things.++The [website in question](http://stockholm.kalleswork.net) just went online and is currently an archive of architectural photographs and the site relies heavily on the ikiwiki osm and album plugins.++### Setting things up++To start with I set up the wiki on the server and git clone to into `$wrkdir` on my laptop. I then initialize a git-annex repo in the `$srcdir` on the server. Leaving the `$gitdir` untouched. The `$scrdir` git-annex repo has to be in `direct` mode. Before doing any syncing I add `annex-ignore = true` and `annex-sync = false` to `.git/config` in the origin repo (`$gitdir`): this is to prevent polluting `$gitdir` with git-annex data. The same process is repeated in the `$wrkdir` on the laptop.++### Pushing and syncing++With this setup I can then `git add remote $srcdir`, `git add $file` and `git-push` mdwn files and other lightweight data from the laptop. While `git annex-add`, `git-annex sync` and `git-annex copy --to $srcdir` jpg's and other heavy files. All pure git commands work as expected with ikiwiki and the website recompiles etc.++### Snags++I'm frequently left with (non-dangling) symlinks in the `$srcdir` despite the annex repo being in direct mode. When this happens `git-annex fsck` sorts things out.++Uploading image files does require a bit of manual work. But as this is done less frequently it's not much of an issue for me. I'm guessing that by doing things it the correct order (whatever that might be) I could avoid some of the manual work.++The thing to keep in mind is to never `git-add` the typechanged annexed files in the $srcdir. In general I never use git commands in the $srcdir.++The main problem is the symlinks though as they demand a manual `git-annex fsck`. I have no idea what causes the symlinks in a direct mode repo.++Any comments? +
@@ -0,0 +1,30 @@+Hi everyone,++I need some suggestions on how to operate git-annex best in my setup.++I need git-annex mainly for its ability to have directories of all my data on all my nodes but not for the data redundancy it can provide.+I have one node that contains 2 filesystems that I want to merge in one git-annex repository. One filesystem (lets call it SAFE) is on top of a RAID1 between two 1TB hds. The other (BIG) is on top of a 3TB hd. SAFE holds data I do not want to loose (like digital pictures). BIG holds data that I can loose.++I do not have enough disk space on other nodes to get rid of the RAID1.++This is how I mount my filesystems:++SAFE at ~/AllData/++BIG at ~/AllData/bigfiles/++The root of the git repository is at ~/AllData/ however when I do:++git-annex add ~/AllData/bigfiles/file1+It says:+add bigfiles/file1 failed++I assume that is because of file1 being on a different filesystem.++Do I have to create two repositories: one for each filesystem or do you have any ideas on how to use git-annex best in this scenario?+Having two repositories also has the disadvantage that I need two repositories on all other nodes am I right?++Thanks for you suggestions+++
@@ -0,0 +1,14 @@+Hi,++Thanks for git-annex, really a great project.+Another related feature which would be useful to have is described by tagfs [3][] [4][], experimental implementations such as [tagfs over fuse][1], and [tagsistant][2] exist, but having a solution within the power of git-annex would really be attractive.++How hard would this be to implement within the existing infrastructure?+Thanks.++related post: [[multiple_sym_links___40__for_tagging_photos__41____63__]]++[1]: http://code.google.com/p/tagfs/+[2]: www.tagsistant.net/+[3]: http://site.xam.de/2006/01-tagfs.pdf+[4]: http://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=6&ved=0CE4QFjAF&url=http%3A%2F%2Fweb.mit.edu%2F6.033%2F2011%2Fwwwdocs%2Fwriting-samples%2Fsbezek_dp1.pdf&ei=ILQkUdqxMueR0QWgx4CwDw&usg=AFQjCNE1eWeFxmaxzOLZYVsb0tomqWNQaw&bvm=bv.42661473,d.d2k
@@ -0,0 +1,10 @@+Thought I'd ask how y'all are finding the current communication by this forum/website/git repo only.++Would there be a benefit to having an irc channel for git-annex?++Maybe a mailing list? (Any persuasive reason why it would be better than this forum?)++Are the existing RSS feeds on this site, for eg, new [[comments]] and posts to this forum, sufficient to keep up with+things?++--[[Joey]]
@@ -0,0 +1,1 @@+See [[install/OSX]].
@@ -0,0 +1,9 @@+I want to put my photos into a git-annex repository, syncing it with my girlfriends computer and our NAS.+If possible, I'd like to be able to add files to the NAS and have them synced, so I guess a special remote doesn't work here.++Unfortunately, git-annex doesn't run on my NAS directly (yet), so I thought of mounting the NAS with CIFS, and creating an annex there that syncs with the local ones.+While this seems to work fine with one computer, I wonder what will happen if I mount the Samba share on my and my girlfriend's computer at the same time.++In theory, the NAS supports Samba Unix extensions which includes POSIX locking, but a weird bug that prevents you from removing a named pipe from Samba, making git-annex init fail (sent a bug report to Synology). When I disable Unix extensions it works. It then detects a crippled file system though.++Any thoughts?
@@ -0,0 +1,12 @@+I am trying to get git-annex working on Ubuntu, specifically 13.04 and now 13.10 (I thought upgrading to a new distro. would fix the issue).++I have tried:++ * installing via apt-get install git-annex+ * installing via cabal (full-build)++Both times git-annex install successfully with no errors. I then start the webapp and create a repository (which git-annex creates successfully), I then add the folders and files I want it to sync. Git-annex finds the files and says it has began syncing them, but it never moves past the first batch of files it 'says' it had started syncing. I have waited 5+ hours at one point and nothing has changed. Also, the webapp is incredibly slow, it takes 15+ seconds to perform ANY action (such as saving options or viewing the logs). The issue definitely isn't my computer as I am using an high-end SSD, core i7, DDR3 RAM, etc... ++Also the logs produce no errors of any kind and actually show git-annex adding files, most of the log entries say add 'filedirectory/filename.txt' as an example.++I have gotten this to successfully work on Fedora, but Ubuntu (13.04/13.10) is having serious problems.
@@ -0,0 +1,20 @@+Hi!++I can't get git-annex to run on my archlinuxARM sytem. It fails with++ $ git annex test+ error: git-annex died of signal 11++ Its a RaspberryPi (model B I think) so its an ARM11 (armv6h if I'm not mistaken). I use archlinuxarm because I am familiar with the distribution and you can have a very lean system. There is a very crude package for git-annex arm and armv7 that is build like this: https://github.com/archlinuxarm/PKGBUILDs/blob/master/alarm/git-annex/PKGBUILD . Crude, because it just takes the debian package, changes the version of libraries where apropriate and packs it as archlinux package. Two problems: 1) It's not been tested on armv6. 2) The 4.20130417 version does not exist anymore on the debian mirrors.++1. The debian package is not marked as armv5 or armv7 specific and is runs on the RaspberryPi with Raspbian (but in an pretty old version if I remember correctly). So I would have imagined it runs on armv6h in general.\\+2. I just did the same magic as in the linked PKGBUILD with a more current version to build the package but it still crashes. Can I get the old version anywhere to check if it works with that? +++Cheers,+ Hannes++Background for whoever's interested :)+I tried to set up a RaspberryPi to manage my files, contacts and calendars. That shouts out loud for owncloud because of its convenience (caldav, carddav, webdav and a nice interface bundled together). However, compared to git-annex owncloud is unbearably slow (on an RaspberryPi) and lacks git-annex's easy way to keep your files sorted even if you don't have them on your local disk.++For these reasons I tried to install a hybrid git-annex/owncloud system. There, basically, the files are served by owncloud but at the same time also managed (and served) by git-annex (+ssh). As far as I can see that should not have any noticeable side effects in my use case (mostly single user). I have some external hard drives connected to the RaspberryPi of which I will just symlink the appropriate folders to the owncloud 'files' folder. This way I can also just take the drives with me and still have the same (UUID) git annex repository on them. Any comments?
@@ -0,0 +1,24 @@+Hi all,++git-annex basically renders my repository unmanageble. What is the+best and save (!) way to recover?++Here is my situation:++I have a fairly large repository with ~8000 managed files taking about+65GB of disk space.++git-annex worked well there. But some programs choke on the+symlinks. So, I converted the repository to direct mode. The+transition worked well.++Now git status reports a type change for the ~8000 files.++But as soon as I run++ git commit -m "typechange" even-only-one-of-the-files++the process `git-annex pre-commit .` eats 3.5GB of ram, where I+usually kill it, as I only have 4GB of ram....++-- Andreas
@@ -0,0 +1,5 @@+Hi,++Does git-annex (preferably assistant) have any management of users / groups or teams? Our use case is we have many users which should only have access to certain folders (repos). Is this a planned feature or any manual way to work around this for now?++Thanks!
@@ -0,0 +1,34 @@+I've been organizing my music collection deleted/replaces some files but git-annex unused does not show any unused files even though they are deleted and all repos are in sync.+++ git log --stat --all -S'SHA256E-s8034842--5c3475d7fef6f0c3545721f34e7cbfb6727a00708bdde192f0f1d53af251b444'+ commit a0fecdc02f7564f8bce9726f6b934fefc11de58b+ Date: Thu Sep 12 17:04:53 2013 +0300++ Deleted++ .../Dido - Sitting On the Roof of the World.mp3 | 1 -+ 1 file changed, 1 deletion(-)++ commit 7f216228fc0e6298f0290ee1d8646bc9b16eca10+ Date: Mon Aug 5 03:49:55 2013 +0200++ Initial Import++ .../Dido - Sitting On the Roof of the World.mp3 | 1 ++ 1 file changed, 1 insertion(+)`++even though the file is deleted its still present in annex objects,++ find .git -name '*5c3475d7fef6f0c3545721f34e7cbfb6727a00708bdde192f0f1d53af251b444*' -exec ls -al '{}' \;+ total 7856+ dr-xr-xr-x 2 user user 4096 Sep 9 01:24 .+ drwxrwxr-x 3 user user 4096 Sep 9 01:24 ..+ -r--r--r-- 1 user user 8034842 Aug 5 04:52 SHA256E-s8034842--5c3475d7fef6f0c3545721f34e7cbfb6727a00708bdde192f0f1d53af251b444.mp3+ -r--r--r-- 1 user user 8034842 Aug 5 04:52 .git/annex/objects/Jz/74/SHA256E-s8034842--5c3475d7fef6f0c3545721f34e7cbfb6727a00708bdde192f0f1d53af251b444.mp3/SHA256E-s8034842--5c3475d7fef6f0c3545721f34e7cbfb6727a00708bdde192f0f1d53af251b444.mp3++I got around 200 files that should be deleted but not showing up in unused. I though maybe one of the dead repos is causing the problem so i did a,++ git annex forget --drop-dead++and synced all repos. Still I can not get them to drop.
@@ -0,0 +1,11 @@+I've noticed that if I'm using git-assistant, it wants to pull down all my files from other repos onto my laptop, even after I've dropped them. (My laptop is set up as "client," my usb drive and an ssh server as "backup".)++I want to use git annex to save space on my laptop, but of course when I'm running the assistant, it pulls everything down there, even things I've manually dropped.++Is my "I want to save space, with a partial archive on my laptop" use case simply out of scope for the assistant? So I should just be using the command line for my needs? That's fine if that's the case.++Or maybe something like this is what I should be doing? http://git-annex.branchable.com/assistant/archival_walkthrough/ ? so instead of manually "git annex drop"-ping files in place, I should set up a directory called "archive" on my machine, from which files will magically disappear and get backed up elsewhere?++If it's the case that a directory named "archive" in your checkout has the magical property of having the assistant drop and archive its contents, that's awesome, maybe just what I need, but if that behavior is spelled out in so many words anywhere I managed to miss it.++Apologies for all these questions, just enjoying the software immensely and wanting to get to know it.
@@ -0,0 +1,1 @@+Back in January Joey [mentioned](http://git-annex.branchable.com/design/assistant/blog/day_179__brief_updates/) the [git-remote-gcrypt](https://github.com/blake2-ppc/git-remote-gcrypt) and possibly adding support for it in the Assistant. I think this would be a great addition. Now that the first big Android push is complete, is there a schedule for this feature?
@@ -0,0 +1,48 @@+Hi all,++how can I get rid of all those 'typechange' messages in `git status`+when in direct mode?++Here is an example session:++ > git init+ Initialized empty Git repository in /some/path/.git/+ > git config user.name dtrn+ > git config user.email drn@drn.com+ > git annex init+ init ok+ (Recording state in git...)+ > git annex direct+ commit+ # On branch master+ #+ # Initial commit+ #+ nothing to commit (create/copy files and use "git add" to track)+ ok+ direct ok+ > dd if=/dev/zero of=testfile.bin count=1000+ 1000+0 records in+ 1000+0 records out+ 512000 bytes (512 kB) copied, 0.00317424 s, 161 MB/s+ > git annex add testfile.bin+ add testfile.bin (checksum...) ok+ (Recording state in git...)+ > git commit -m "annexed testfile.bin"+ ok+ [master (root-commit) 281e740] annexed testfile.bin+ 1 file changed, 1 insertion(+)+ create mode 120000 testfile.bin+ > git status+ # On branch master+ # Changes not staged for commit:+ # (use "git add <file>..." to update what will be committed)+ # (use "git checkout -- <file>..." to discard changes in working directory)+ #+ # typechange: testfile.bin+ #+ no changes added to commit (use "git add" and/or "git commit -a")+++Regards,+Andreas
@@ -0,0 +1,9 @@+Hi,++I am a happy user of [git-subtree](http://github.com/apenwarr/git-subtree), and I wonder whether it integrates nicely with git-annex?++My use-case looks like this: I have two annex repositories -- one at home and one at work. The annex at work is a strict subset of the one at home, i.e. all files that I have at work ought to be part of the annex at home, but not the other way round. Now, I realize that I could have one annex and selectively copy files to the checked out copy at work, but I don't want to do that because I don't want to have (broken) symlinks for all kinds of stuff visible on my machine at work that is not supposed to be there (such as MP3 files, etc.). Instead, I would like to use git-subtree to import the work annex into a sub-directory of the one at home, so that both annex are logically separate, but still the one at home always contains everything that the one at work contains.++Is that possible?++And if not, is there maybe another way to accomplish this kind of thing?
@@ -0,0 +1,25 @@+Perhaps stupidly I added some very large bare git repos into a git-annex.++This took a very long time, used lot's of memory, and then crashed. I didn't catch the error (which is annoying) - sorry about that. IIRC it is the same error if one Ctrl-c's the addition.++I ran `git annex add .` a second time and eventually killed it (I perhaps should have waited - I now think it was working).++A `git annex unannex` fixed up some files but somehow I managed to end up with tonnes of files all sym-linked into the git annex object directory but not somehow recognised as annexed files. I'm assuming that they somehow didn't make it into git annex's meta-data layer (or equivalent).++Commands such as `git annex {fsck,whereis,unannex} weirdfile` immediately returned without error.++I've now spent a lot of manual time copying the files back. Doing the following, not the cleverest but I was a little panicky about my data...++ find . -type l -exec mv \{} \{}.link \; #Move link names out of the way+ find . -type l -exec cp \{} \{}.cp \; #Copy follows links so we can copy target back to link location+ find . -type f -name "*.link.cp" | xargs -n 1 rename 's/\.link\.cp//' #Change to original name+ find . -type l -exec rm \{} \; #Ditch the links+ git annex unused+ git annex dropunused `seq 9228`++9228 files were found to be unused, this gives an idea of the scale of the number of "lost" files for want of a better term.++A pretty poor bug report as these things go. Anyone any idea what might have happened (it didn't seem space or memory related)? Or how I might have fixed it a little more cleverly?++For reference I am using stable Debian, git annex version 3.20111011.+
@@ -0,0 +1,10 @@+I really like git-annex and am thankfull to its creator!++I especially like the high level of abstraction it provides when handling backups or syncing.++But git and my ext4 filesystem and HDD just hate the amount of files/folder/symlinks it throws at them and I am asking, what the alternatives are. I am especially looking for the numcopies and "--auto" functionallity. +++Most alternatives I checked out (eps. distributed redundant filesystems) come up with other burdens or restrictions.++Do you have any experience with different systems?
@@ -0,0 +1,3 @@+I am trying to share files between my PC at home at that at work using the walkthrough here: http://git-annex.branchable.com/assistant/remote_sharing_walkthrough/. However, I don't have the option on my machine to "Share with other devices". Any ideas why this would be missing? I am using Ubuntu 13.04 if that helps. ++Update: it now works after a software update, I guess I just had an older version of git-annex. Now, I have version 4.20130723.
@@ -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 @@+From git-annex(1), init should precede any operation of git-annex as a safety feature.++However git cloning a repo and running `git annex get` created a new uuid for that repo, which got+propagated via sync.++Is this intended behaviour?
@@ -0,0 +1,1 @@+I just started experimenting with git annex, and I found that I would like to have a way to figure out metadata (well, size. Maybe modification date) of a non-local file. I first checked if there is "git annex ls" (which could list known files in an ls-like way) and found "git annex whereis" as somewhat a replacement, but it does not give metadata information.
@@ -0,0 +1,22 @@+I've set up git annex on my laptop and on a remote server using the gitolite v3 git-annex branch.+When I 'git annex sync' from my laptop (mac OSX) to the server, and 'git annex copy . --to server' all works fine.++Later, I tried to clone the repository on another machine (linux 2.6.32). again all is well. I 'git annex init' in the new clone and then try to 'git annex sync' -- now I run into problems.++Specifically, the first request for the configlist (when I do 'git annex --debug sync' all is fine until the configlist request) somehow breaks and my ssh session shows:++muxserver_listen bind(): Input/output error++This seems to confuse the client, who now believes that git annex is not installed on the server (it is).++If I issue the same command as git annex via ssh, all seems to work ok with the caveats below:++I have a feeling it's related to the -o 'ControlPersist=yes' argument that git-annex appears to be giving ssh. If I include this option when I run via ssh, ssh dies:++>ssh git@server -o "ControlMaster=auto" -o "ControlPersist=yes" "git-annex-shell 'configlist' '/~/PRJ'"+command-line: line 0: Bad configuration option: ControlPersist+++(note that it appears to be ok to leave "ControlMaster=auto" in).++any thoughts?
@@ -0,0 +1,11 @@+I thought I'd followed the walk through when initially setting up my repos.++However I find that I have to do the following to sync my annex's.++ git pull remote master+ git checkout git-annex+ git pull remote git-annex+ git checkout master+ git annex get .++Has something gone wrong? I see no mention of syncing git-annex repos in the walk-through...
@@ -0,0 +1,1 @@+Well, the subject pretty much says it all :)
@@ -0,0 +1,1 @@+It was fast to git annex a bunch of files. But git unannex seems a lot slower. Is there a faster way to get files out of git annex? Or to replace the symlinks with real files and then I could just remove the .git directory? I shouldn't have put so many in as a test but they are there now.
@@ -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,27 @@+I'm wondering how easy the addition of hashing to the directories of the objects would be.++Currently a tree directory structure becomes a flat two level tree under the .git/annex/objects directory ([[internals]]). This, through the 555 mode on the directory prevents the accidental destruction of content, which is _good_. However file and directory numbers soon add up in there and as such any file-systems with sub directory limitations will quickly realize the limit (certainly quicker than maybe expected).++Suggestion is therefore to change from ++ `.git/annex/objects/SHA1:123456789abcdef0123456789abcdef012345678/SHA1:123456789abcdef0123456789abcdef012345678`++to ++ `.git/annex/objects/SHA1:1/2/3456789abcdef0123456789abcdef012345678/SHA1:123456789abcdef0123456789abcdef012345678`++or anything in between to a paranoid++ `.git/annex/objects/SHA1:123/456/789/abc/def/012/345/678/9ab/cde/f01/234/5678/SHA1:123456789abcdef0123456789abcdef012345678`++Also the use of a colon specifically breaks FAT32 ([[bugs/fat_support]]), must it be a colon or could an extra directory be used? i.e. `.git/annex/objects/SHA1/*/...`++`git annex init` could also create all but the last level directory on initialization. I'm thinking `SHA1/1/1, SHA1/1/2, ..., SHA256/f/f, ..., URL/f/f, ..., WORM/f/f`++> This is done now with a 2-level hash. It also hashes .git-annex/ log+> files which were the worse problem really. Scales to hundreds of millions+> of files with each dir having 1024 or fewer contents. Example:+>+> `me -> .git/annex/objects/71/9t/WORM-s3-m1300247299--me/WORM-s3-m1300247299--me`+>+> --[[Joey]]
@@ -0,0 +1,12 @@+## Question+Can git-annex run passively with an existing repo?++## Scenario+We have an existing web application with large binary assets spread throughout modules in the repo. The project is in constant development with weekly deploys to production and there are many developers working on the project.++## Goal+We need to maintain the directory structure for these assets without actually committing large binaries to the main remote (hosted on GitHub). I need a solution that has a low barrier of entry when on-boarding new developers. I was thinking maybe a script the is executed on every commit that would filter binaries files based on extensions and commit them to the git-annex remote instead. We are flexible on the type of remote storage type (SSH, S3, etc)++## Notes+I have gone through the last couple months of forum posts and done a bit of Googling but have come up empty. If anyone can point me in the right direction that would be great. +Thanks!
@@ -0,0 +1,14 @@+I have an encrypted S3 remote with which I recently ran: ++$> git annex move . --from cloud++which moved all my files to the local repo. When I looked at my S3 bucket, I saw some files left. I then ran:++$> git annex unused --from cloud++to get all the unused data. I dropped each unused data from cloud so that now I think git annex believes it has nothing on the cloud remote.++However there is still one file left on the bucket. Is this normal? (if not I'll create a bug report)+More importantly, how can I decrypt this file so I can run git log -S'KEY' to figure out what it is (I want to make sure I haven't lost any data).++To be clear, when I currently run 'git annex move . --from cloud' it moves nothing and when I run 'git annex unused --from cloud' it reports no unused data.
@@ -0,0 +1,14 @@+I am using the importfeed [1] functionality.++How am I supposed to update the feed/feeds?++I understand that running++ cd annex; git annex importfeed http://url/to/podcast++a second time will 'do the right thing'. But that is cumbersome as I have to know the url again. Is there sth like git annex updatefeeds?+++++[1] http://joeyh.name/blog/entry/git-annex_as_a_podcatcher/
@@ -0,0 +1,1 @@+Are versions 0.14 and 0.20110522 incompatible? I can't seem to copy files from a system running 0.14 to one running 20110522.
@@ -0,0 +1,1 @@+Just saw that there is now a linux standalone tarball, I've a SL5 (RHEL5) based machine which I can churn out git-annex binaries if there is interest.
@@ -0,0 +1,24 @@+I recently started experimenting with git annex, adding files that I've had+floating across several computers to repositories. During the testing I had+a few occasions where I wrecked a repository somehow, and decided to wipe it+and start anew (at this point there was no important files in them so I thought+this is the easiest way). Well, as it turns out this interacts badly with location+tracking, since now `git annex whereis` shows files residing in all those destroyed+repositories, all having same names as some existing repositories. This makes it hard+to follow whether a repo actually has a file, or was the file only seen in some dead+repo with the same name.++I planned on cleaning this up by looking up the UUIDs of the now stable, existing+repos and untrusting all the dead copies (they should effectively disappear from+git annex´s output then, right?), but I didn't find an easy way to look up the UUID+of the current repository (maybe this could be included in `git annex status`?)+I also noticed that untrust cannot remove the trust based on the UUID -- if I try+it I simply get "there is no git remote named "11908472-...", so I guess untrust+works with git remote names, which I find a bit confusing, since trust.log logs the+trust levels based on the UUID. I could just write into trust.log manually, but I'm+unsure how the changes would get propagated.++What should I do? As a related wishlist item I would ask for some additional mechanisms+for purging known-dead repositories from the location tracking database. And the ability+to look up the UUID of the current repo, and to use the UUID to specify repositories when+applicable (untrust and describe maybe).
@@ -0,0 +1,20 @@+So I got a shiny new rsync.net account, but it's not (yet) big enough for my bloated, kitchen-sink annex. How do I make the best use of it? Well, on the whole small files are more valuable to me than large. Large files are usually replaceable, like ripped DVDs. Small files are more likely to be family photos and such. So I shut down the assistant, and I've been doing a series of these:++ git annex copy --to=rsyncnet --smallerthan 10M --not --in=rsyncnet # I called my remote "rsyncnet"+ + git annex copy --to=rsyncnet --smallerthan 20M --not --in=rsyncnet+ + git annex copy --to=rsyncnet --smallerthan 40M --not --in=rsyncnet++until the repo fills up. With a few of these thrown in to check on my progress and what's ahead.+++ git annex status . --in=rsyncnet # how much have I already done?+ git annex status . --smallerthan 40M --not --in=rsyncnet # how much will this next command copy?+++It'd be possible to write a script to do all this automagically but at least this time it's easier to do by hand.++Just sharing in case anybody's in a similar situation.++(You could let the assistant do this for you if you configured a preferred content expression designating small files for the rsyncnet remote, of course.)
@@ -0,0 +1,1 @@+Is there an easy way for a noob to get the man pages, after installing the prebuilt tarball?
@@ -0,0 +1,3 @@+I tried about 2 weeks ago using the assistant to create on my netbook and my home laptop 3 repositores, for music, pictures and documents. Since I was also going to be away from home, I set up jabber pairing and box.com for a transfer repository, and then watched everything crash as I didn't know yet about jabber only really working for 1 repository at a time.++So my new idea is this: one repository at ~/annex, and changing documents, music and pictures to be symlinks to actual documents, music and pictures folders inside ~/annex, allowing me to have just 1 annex to manage. Is this the best way to put everything together if I want to just jabber pairing (and just 1 jabber account)?
@@ -0,0 +1,24 @@+Thanks Joey for the great work.++I'm using git annex for my tv-shows and movies Folder.++I have 3 USB HDD (ext.150Gb,ext.200Gb, ext.2Tb) and a USB Stick (ATV), which are traveling between 3 Devices++2 Notebooks (Lappi,Kiste) and a Nas.++First of all, I'm made a mistake and mixed the remote Locations from the tvshows folder with the movies folder and did a git annex sync, ( this happened about two weeks ago) +I think i can't undo this, only unannex will help.++I've now watched the annex status output and noticed that there are many Remotes, some of them have a timestamp as name.++see log file at http://pastebin.com/79bRVkK6++Running git annex on ubuntu 12.04++ christian@Lappi:~/Serien$ git annex version+ git-annex version: 4.20130417+ local repository version: 3+ default repository version: 3+ supported repository versions: 3 4+ upgrade supported from repository versions: 0 1 2+ build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP DNS
@@ -0,0 +1,66 @@+I have a large git repository with binary files scattered over different branches. I want to switch to git-annex mainly for performance reasons, but I don't want to loose my history.++I tried to rewrite the (cloned) repository with git-filter-branch but failed miserably for several reasons:++* --tree-filter performs its operations in a temporary directory (.git-rewrite/t/) so the symlinks point to the wrong destination (../../.git/annex/).+* annex log files are stored in .git-annex/ instead of .git-rewrite/t/.git-annex/ so the filter operation misses them++Any suggestions how to proceed?++EDIT 3/2/2010+I finally got it working for my purposes. Hardest part was preserving the branches while injecting the new `git annex setup` base commit.++#### Clone repository+ git clone original migrate+ cd migrate+ git checkout mybranch+ git checkout master+ git remote rm origin++#### Inject `git annex setup` base commit and repair branches+ git symbolic-ref HEAD refs/heads/newroot+ git rm --cached *+ git clean -f -d+ git annex init master+ echo \*.rpm annex.backend=SHA1 >> .gitattributes+ git commit -m "store rpms in git annex" .gitattributes+ git cherry-pick $(git rev-list --reverse master | head -1)+ git rebase --onto newroot newroot master+ git rebase --onto master mybranch~1 mybranch+ git branch -d newroot++#### Migrate repository+ mkdir .temp+ cp .git-annex/* .temp/+ MYWORKDIR=$(pwd) git filter-branch \+ --tag-name-filter cat \+ --tree-filter '+ mkdir -p .git-annex;+ cp ${MYWORKDIR}/.temp/* .git-annex/;+ for rpm in $(git ls-files | grep "\.rpm$"); do+ echo;+ git annex add $rpm;+ annexdest=$(readlink $rpm);+ if [ -e .git-annex/$(basename $annexdest).log ]; then+ echo "FOUND $(basename $annexdest).log";+ else+ echo "COPY $(basename $annexdest).log";+ cp ${MYWORKDIR}/.git-annex/$(basename $annexdest).log .git-annex/;+ cp ${MYWORKDIR}/.git-annex/$(basename $annexdest).log ${MYWORKDIR}/.temp/;+ fi;+ ln -sf ${annexdest#../../} $rpm;+ done;+ git reset HEAD .git-rewrite;+ :+ ' -- $(git branch | cut -c 3-)+ rm -rf .temp+ git reset --hard+++TODO:++* Find a way to repair branches automatically (detect branch points and run appropriate `git rebase` commands)++I'll be happy to try any suggestions to improve this migration script.++P.S. Is there a way to edit comments?
@@ -0,0 +1,33 @@+When migrating large file repositories to git-annex that are backuped in a way that uses an rsync-style mechanism (e.g. [dirvish](http://www.dirvish.org/)) and thus keeps incremental backups small by using hardlinks, space can be saved by manually reflecting the migration on the backup. So, instead of making a last pre-git-annex backup, migrating, and duplicating all backupped data with the next backup, I used the <del>attached</del> migrate.py file below, and it saved me roughly a day of backuping.++A note on terminology: "migrating" here means migrating from not using git-annex at all to using it, not to the ``git annex migrate`` command, for which a similar but different solution may be created.++**WARNING**: This is a quickly hacked-together script. It worked for me, but is untested apart from that. It's just a dozen lines of code, so have a look at it and make sure you understand what it does, and what migrate.sh looks like. Take special care as this tampers with your backups, and if something goes wrong, well...++First, have an up-to-date backup; then, git annex init / add etc as described in the [[walkthrough]]. In the directory in which you use git-annex, run:++ $ python migrate.py > migrate.sh++Then copy the resulting migrate.sh to the equivalent location inside your backups and run it there. It will move all files that are now symlinked on the master to their new positions according to the symlinks (inside .git/annex/objects), but not create the symlinks (you will do a backup later anyway).++After that, do a backup as usual. As rsync sees the moved files at their new locations, it will accept them and not duplicate the data.++**migrate.py**:++ #!/usr/bin/env python+ + import os+ from pipes import quote+ + print "#!/bin/sh"+ print "set -e"+ print ""+ + for (dirpath, dirnames, filenames) in os.walk("."):+ for f in filenames:+ fn = os.path.join(dirpath, f)+ if os.path.islink(fn):+ link = os.path.normpath(os.path.join(dirpath, os.readlink(fn)))+ assert link.startswith(".git/annex/objects/")+ print "mkdir -p %s"%quote(os.path.dirname(link))+ print "mv %s %s"%(quote(fn), quote(link))
@@ -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 @@+I am trying to configure the local repo to be connected with remote computer. It can either find this computer on local network using local host name, or go through public IP host where I have ssh tunnel. First confusing thing is, that when setting up remote server, it successfuly establishes connection, but then asks me if the folder should be git or rsync - I believe this step should be skipped if the git repo is already there. Also choosing repository group should be detected from the repo itself.+But the real problem is that I cannot add the public IP repo at all. Is this a known limitation?
@@ -0,0 +1,11 @@+I saw a cool page talking about "tagging" photos by using symlinks: http://www.trueelena.org/computers/articles/photo_management_with_git-annex_and_bash.html++so say I have a photo in git annex, called DSC_3285.JPG, which of course is really a symlink to ../.git/annex/objects/Zk/kj/WORM-s5296770-m1338516288--DSC_3285.JPG/WORM-s5296770-m1338516288--DSC_3285.JPG.++I want to make an additional link to that photo in a directory called tags/.++should I link to the symlink (DSC_3285.JPG), or to the annexed file? (../.git/annex/objects/Zk/kj/WORM-s5296770-m1338516288--DSC_3285.JPG/WORM-s5296770-m1338516288--DSC_3285.JPG)++I might occasionally rename DSC_3285.JPG or edit the photo itself. will the git annex commit hooks update both links, or should I prepare a script to update links in tags/ after I change DSC_3285 or the annexed data? ++thank you.
@@ -0,0 +1,26 @@+I've been doing a sort of experiment but I'm not sure if it's working or, really, how to even tell.++I have two macbooks that are both configured as clients as well as a USB HDD, an rsync endpoint on a home NAS, and a glacier endpoint.++For the purposes of this example, lets call the macbooks "chrissy" and "brodie". Chrissy's was initially configured with a remote for brodie with the url as++ ssh://Brodie.88195848.members.btmm.icloud.com./Users/akraut/Desktop/annex++This allows me to leverage the "Back To My Mac" free IPv6 roaming I get from Apple. Now, occasionally, that dns resolution fails. Since I'm frequently on the same network, I can also use the mDNS address of brodie.local. which is much more reliable.++So my brilliant/terrible idea was to put this in my git config:++ [remote "brodie"]+ url = ssh://Brodie.88195848.members.btmm.icloud.com./Users/akraut/Desktop/annex+ fetch = +refs/heads/*:refs/remotes/brodie/*+ annex-uuid = BF4BCA6D-9252-4B5B-BE12-36DD755FAF4B+ annex-cost-command = /Users/akraut/Desktop/annex/tools/annex-cost6.sh Brodie.88195848.members.btmm.icloud.com.+ [remote "brodie-local"]+ url = ssh://brodie.local./Users/akraut/Desktop/annex+ fetch = +refs/heads/*:refs/remotes/brodie/*+ annex-uuid = BF4BCA6D-9252-4B5B-BE12-36DD755FAF4B+ annex-cost-command = /Users/akraut/Desktop/annex/tools/annex-cost.sh brodie.local.++Is there any reason why I shouldn't do this? Is annex smart enough to know that it can reach the same remote through both urls? Will the cost calculations be considered and the "local" url chosen if it's cost is less than the other?++(I posted the annex-cost.sh stuff at [[forum/Calculating Annex Cost by Ping Times]].)
@@ -0,0 +1,59 @@+I'm soliciting ideas for new small features that let git-annex do things that currently have to be done manually or whatever.++Here are a few I've been considering:++---++* --numcopies would be a useful command line switch.+ > Update: Added. Also allows for things like `git annex drop --numcopies=2` when in a repo that normally needs 3 copies, if you need+ > to urgently free up space.+* A way to make `drop` and other commands temporarily trust a given remote, or possibly all remotes. ++Combined, this would allow `git annex drop --numcopies=2 --trust=repoa --trust=repob` to remove files that have been replicated out to the other 2 repositories, which could be offline. (Slightly unsafe, but in this case the files are podcasts so not really.)++> Update: done --[[Joey]] ++---++[[wishlist:_git-annex_replicate]] suggests some way for git-annex to have the smarts to copy content around on its own to ensure numcopies is satisfied. I'd be satisfied with a `git annex copy --to foo --if-needed-by-numcopies`++ > Contrary to the "basic" solution, I would love to have a git annex distribute which is smart enough to simply distribute all data according to certain rules. My ideal, personal use case during the next holidays where I will have two external disks, several SD cards with 32 GB each and a local disk with 20 GB (yes....) would be:++ cd ~/photos.annex # this repository does not have any objects!+ git annex inject --bare /path/to/SD/card # this adds softlinks, but does **not** add anything to the index. it would calculate checksums (if enabled) and have to add a temporary location list, though+ git annex distribute # this checks the config. it would see that my two external disks have a low cost whereas the two remotes have a higher cost.+ # check numcopies. it's 3+ # copy to external disk one (cost x)+ # copy to external disk two (cost x)+ # copy to remote one (cost x * 2)+ # remove file from temporary tracking list+ git annex fsck # everything ok. yay!++Come to think of it, the inject --bare thing is probably not a microfeature. Should I add a new wishlist item for that? -- RichiH++> I've thought about such things before; does not seem really micro and I'm unsure how well it would work, but it would be worth a [[todo]]. --[[Joey]]++>> Update: Done as --auto. --[[Joey]] ++---++Along similar lines, it might be nice to have a mode where git-annex tries to fill up a disk up to the `annex.diskreserve` with files, preferring files that have relatively few copies. Then as storage prices continue to fall, new large drives could just be plopped in and git-annex used to fill it up in a way that improves the overall redundancy without needing to manually pick and choose.++> Update: git annex get --auto basically does this; you can tune+> --numcopies on the fly to make it get more files than needed by the+> current numcopies setting. --[[Joey]] ++---++If a remote could send on received files to another remote, I could use my own local bandwith efficiently while still having my git-annex repos replicate data. -- RichiH++---++Really micro:++ % grep annex-push .git/config+ annex-push = !git pull && git annex add . && git annex copy . --to origin --fast --quiet && git commit -a -m "$HOST $(date +%F--%H-%M-%S-%Z)" && git push+ %++-- RichiH+--[[Joey]]
@@ -0,0 +1,18 @@+Over the last few weeks i've been working on a seperate python nntp project. But decided that it would be fun to make it usable with git-annex.++The code is almost complete. One major feature left(make it usable without a mysql/sqlite database, and without fetching headers). And of course a lot of bugfixes.++I'm wondering if there is any interest in this special remote hook.++The thought is, buy unlimited usenet account, and you can have a git-annex repository without any upper size limit. You want 100GB, well that'll be 10$ a month, want 100000GB, well that'll be 10$ a month.++Of course there are plenty of caveats(retention on server, it is doubtfull the data will stay up for more than 4 years.). Because the code is in python3 i had to use a lot of external tools (uudeview, par2, ydecode/yydecode) and parse their output. Which is a horrid horrid solution. Since the code is nearing "beta" stage i might see if i can improve on that(possibly with ctypes), if there is any interest.++Currently working on freebsd, ubuntu, debian, mac os x(10.7, not tested in 10.8)++The last feature to be done (and this is UUUUUGLY) is to make it get nzb files from a source like this: http://nzbindex.nl/search/?q=GPGHMACSHA (yes, that is my git-annex repo) instead of from a mysql database.++So, this is a call to see if anyone is interested, and if anyone proficient in *NIX want to test it out.++Sincerely+Tobias
@@ -0,0 +1,6 @@+Hi,++I wondered if it's possible to have a non-bare repo on a cloud remote. I want to have some sort of Dropbox-like workflow were I simply put stuff into a directory on my drive and it gets synced via SSH to a central VPS so I can also always access it via HTTP, for example.++Regards,+Lukas
@@ -0,0 +1,1 @@+I have 2 computers successfully exchanging files, but the contexts are incomplete. Used text files, documents, mp3s as tests. Both computers report in the webapp that they are synched and file names are there. But file sizes are wrong by 75% less and contents are unusable. Is there something in the config? Both machines on LinuxMint 13.
@@ -0,0 +1,10 @@+I'm curious how other people are using git-annex:++ * A single annex containing everything they want to keep track of (albeit with some files only available in some remotes).+ * Several annexes for different purposes.++I'm mostly asking because I don't want to get too far into using git-annex without thinking clearly about which is the most suitable choice for me. At present I have things split into two annexes, one for things I really wouldn't want to lose (and some of which are somewhat private), and another for comparatively throwaway items. However, given the possibility of setting different annex.numcopies on different file globs or directories, it seems like it might be kind of silly to make my life more complicated by having more than one annex.++Primarily, I'm curious if there are some implications of the decision that I haven't considered. It seems like an obvious point that one would want different annexes is if they're used in distinctly different security-level environments (e.g. I'm happy to copy my FLAC (music) files over to my work computer which lives at the office, but I wouldn't want to copy personal financial documents - or even the filenames - there.)++-Mike
@@ -0,0 +1,7 @@+Just a question about other peoples' annex usage. I've got one uber-annex (in ~/annex of course) where I keep ALL THE THINGS, movies, music, pictures, whatever.++It's very big, of course. And I worry about doing anything unusual with it (like trying out direct mode) because, hey, that's all my stuff.++Like, just now, I tried flipping it into direct mode, and a handful of files stayed symlinks, which weirded me out. (Maybe because I had the assistant running while I switched it, and that caused chaos?) Then I flipped it back to indirect, and a bunch of files were left un-tracked, as real files rather than links! I kind of freaked out, and did a big "git annex add" to add them all back. I haven't left a bug report because it's not something I want to try again experimentally to reproduce, I just want my repo back, you know?++Anyways, this kind of thing might not happen if I kept multiple small repos. I was wondering if anybody else worked that way, and what advantages/disadvantages you've found compared to having one super-repo.
@@ -0,0 +1,17 @@+Hi,++I just was setting um my git-annex repository and started to sync my whole stuff in it.++Background: I have choosen git-annex to sync my whole stuff (pictures, mp3s, documents, etc) between my pc, notebook and a home-server++My Problems:+1) When I'm starting the git-annex deamon, the "Performing startup scan" message occurs for hours+2) git-annex synchronizes folders from the server which already on my pc, and that every time I restart the deamon on client++My Questions:+For 1) is git-annex when running one repository suitable to manage > 100gb and > 50000 files?+For 2) do I have to wait until every tasks are completed (everything is committed) to get rid of multiple downloads of the same folders/files+3) what is the best schema to sync between >2 devices should I use a Mesh or Star Schema (where my server is in the middle)++Thank You in advance!+Regards J
@@ -0,0 +1,14 @@+Hi,++I have the following setup:+- normal git repository with website code.+- git annex repository to hold large set of binary data (pdfs, flashmovies, etc) that belongs to the site.++I use git annex so I (and other developers) don't need to copy 1.4Gb+ of binary data for every working copy. (Data that is mostly left untouched.) Using git annex copy --to=origin I can simply only add new additions to this media/binary repository, without first pulling all the data. So far so good.++When commits are pushed to a certain branch on the normal git repository, a post-receive hook exports (GIT_WORK_TREE=/data/site/ git checkout $branch -f) the updated repository to an apache documentroot. Thereby updating the staging server of the website.++My question is, how can I do the same thing for my git annex repository? Since post-receive fires on receiving the annex hashes, and not the actual files. Those are rsynced, and I cannot find a way to trigger an action after all files are copied by git annex via rsync.++Any tips?+
@@ -0,0 +1,7 @@+I have my music library in `music/` and some really old files I recently added in `reallyold/`. There are some MP3s in the really old files and some are the same as my library, so of course git annex is only keeping one copy. Now, I have an rsync remote, `ma`, which prefers content from `music/` but doesn't want anything from `reallyold/`. So while right now it is trying to drop stuff, I suspect at some point that it will try to re-add them in virtue of being in `music/`, as I've got a loop.++I want to eliminate this by using the present keyword to disable dropping for stuff in `reallyold/` and `music/`. Here is my attempt, which doesn't work--I am hoping someone can spot what's wrong.++ (present and include=music/*) or (present and include=reallyold/*) or (exclude=reallyold/* and exclude=video/* and exclude= ...)++Note that music is included by virtue of not being excluded so it should satisfy the third disjunct. Thanks.
@@ -0,0 +1,16 @@+Hi,++Use case: I would like to have a "Public" top-level directory in my annex, which gets files in there published over HTTP on a particular server.++How I see doing this:++1. Put my annex to an http server with exported-over-http `/Public/` directory.+2. Configure a `post-update` hook with the following:++ $ git annex fix++3. Push files on `/Public/` to that annex.++Does it make sense? If yes, are there any gotchas I should beware of?++Thanks.
@@ -0,0 +1,12 @@+Is there a way to pull from an encrypted remote?++Use case:++1. Have annex in an encrypted public rsync remote+2. Have USB stick with PGP keys (but not the annex repository)+3. Get to a new computer+4. Set up a new annex using the PGP keys I have.++1-3 work fine :) However, 4'th is the issue:++How would I do `git pull <remote>` for an encrypted remote? Is it possible?
@@ -0,0 +1,46 @@+I’m using git annex to manage my movie collection on various devices – my laptop, a NSLU tucked away somewhere with lots of space, some external hard drives. For this use case, I do not need the full power of git as a version control system, so having to run "git commit" and coming up with commit messages is annoying. Also, this makes sense for a version control system, but not for my media collection:++ $ git annex add Hot\ Fuzz\ -\ English.mkv + add Hot Fuzz - English.mkv (checksum...) ok+ (Recording state in git...)+ $ git commit -m 'another movie added'+ [master 851dc8a] another movie added+ 1 files changed, 1 insertions(+), 0 deletions(-)+ create mode 120000 00 Noch nicht gesehen/Hot Fuzz - English.mkv+ $ git push jeff+ Counting objects: 38, done.+ Delta compression using up to 2 threads.+ Compressing objects: 100% (20/20), done.+ Writing objects: 100% (26/26), 2.00 KiB, done.+ Total 26 (delta 11), reused 0 (delta 0)+ remote: error: refusing to update checked out branch: refs/heads/master+ remote: error: By default, updating the current branch in a non-bare repository+ remote: error: is denied, because it will make the index and work tree inconsistent+ remote: error: with what you pushed, and will require 'git reset --hard' to match+ remote: error: the work tree to HEAD.+ remote: error: + remote: error: You can set 'receive.denyCurrentBranch' configuration variable to+ remote: error: 'ignore' or 'warn' in the remote repository to allow pushing into+ remote: error: its current branch; however, this is not recommended unless you+ remote: error: arranged to update its work tree to match what you pushed in some+ remote: error: other way.+ remote: error: + remote: error: To squelch this message and still keep the default behaviour, set+ remote: error: 'receive.denyCurrentBranch' configuration variable to 'refuse'.+ To jeff:/mnt/media/Movies+ ! [rejected] git-annex -> git-annex (non-fast-forward)+ ! [remote rejected] master -> master (branch is currently checked out)+ error: failed to push some refs to 'jeff:/mnt/media/Movies'+ To prevent you from losing history, non-fast-forward updates were rejected+ Merge the remote changes (e.g. 'git pull') before pushing again. See the+ 'Note about fast-forwards' section of 'git push --help' for details.++It seems that to successfully make the new files known to the other side, I have to log into jeff and pull _from_ my current machine. ++What I would like to have is that++* git annex add does not require a commit afterwards.+* Changes to the files are automatically picked up with the next git-annex call (similar to how etckeeper works).+* Commands "git annex push" and "git annex pull" that will sync the metadata (i.e. the list of files) in both directions without further manual intervention, at least not until the two repositories have diverged in a way that is not possible to merge sensible.++Summay: git-annex is great. git is not always. Please make it possible to use git annex without having to use git.
@@ -0,0 +1,3 @@+Hi guys, as a result of some improper handling I am left with a couple of files with no copies scattered all around my repos. Now, while my data loss is unfortunate, it is not tragic. What I would like to do now is to purge all of these files without having to look for them one by one. Is there any easy way to do this? ++Cheers
@@ -0,0 +1,22 @@+I have a git-annex repository located at ~/annex which has been set up using git-annex assistant.++This repository is configured as "client".++My other repository is a huge USB drive configured as "full archive".++Now everything seems to work fine except there is one thing I don't understand:++ alip@client:~/annex> git-annex whereis ./archive/kus.png+ whereis archive/kus.png (1 copy) + e79a4cf6-4c48-4833-93de-98ba6eb625d6 -- deniz+ ok++Fine, there is only one copy according to git-annex but the file is still present+in **this** client repository:++ alip@client:> du -hs ~/annex/archive+ 20G /home/alip/annex/archive/++How do I free this space? Am I supposed to call git-annex drop manually?++git-annex version: 3.20130124
@@ -0,0 +1,66 @@+hi, ++i think of use git-annex as the backbone of a archival systems. at first point no distributed storage, just 1 node.+but now i run into the topic below ( deleted the "named" symlink of the "object" -- how to recover ?)++maybe someone can enlighten me...++thanks,+.ka++// about the version. ( debian-squeeze, bpo )++$ git-annex version+git-annex version: 3.20120629~bpo60+2+local repository version: 3+default repository version: 3+supported repository versions: 3+upgrade supported from repository versions: 0 1 2++// building up a testcase.++$ git init+Initialized empty Git repository in ...test2/.git/++$ git annex init+init ok+(Recording state in git...)++$ echo "aaa" > 1.txt++$ echo "bbb" > 2.txt++$ git-annex add .+add 1.txt (checksum...) ok+add 2.txt (checksum...) ok+(Recording state in git...)++$ git commit -a -m "added 2 files"+fatal: No HEAD commit to compare with (yet)+fatal: No HEAD commit to compare with (yet)+[master (root-commit) fc2a5d7] added 2 files+ Committer: userhere user <bla@bla>+Your name and email address were configured automatically based+on your username and hostname. Please check that they are accurate.+...+ 2 files changed, 2 insertions(+), 0 deletions(-)+ create mode 120000 1.txt+ create mode 120000 2.txt++// ok, so far standard. i have now 2 files - lets delete one.++$ rm 2.txt +$ ls -l+lrwxrwxrwx 1 xp xp 176 24. Okt 22:55 1.txt -> .git/annex/objects/Z6/7q/SHA256-s4--17e682f060b5f8e47ea04c5c4855908b0a5ad612022260fe50e11ecb0cc0ab76/SHA256-s4--17e682f060b5f8e47ea04c5c4855908b0a5ad612022260fe50e11ecb0cc0ab76++// eek, delete of 2.txt was a bad idea (it was just the symlink) -- try to recover...++$ git-annex fix+$ git-annex fsck+fsck 1.txt (checksum...) ok+$ ls+1.txt++// still not here.. how to recover the link to 2.txt ???+// i still see the content of the file in the object folder+// if I want to use git-annex as the backend of a archival system, this is important.
@@ -0,0 +1,11 @@+In my current annex config, I have 4 computers with "traditional" git annexes as well as an external drive that is a git annex, an rsync'd backup annex, and a glacier archive. Today, one of the computers got a corrupted git repo. It was complaining that a pack file was invalid. In my attempts to fix it, a commit was logged that deleted every file in the annex. I didn't find this out until I did 'git annex sync' and watched git delete everything, then send all those commits to my other 3 systems and the external drive. *facepalm*++Fortunately, I had one of those other systems in direct mode and I copied everything from the annex as a backup. Now, when I try to re-add files to the annex, I'm running into some errors. These appear to be "collisions" within the annex part of the .git folder:++ % › git annex add House.netspd + add House.netspd (checksum...) + git-annex: /Users/akraut/Desktop/annex/.git/annex/objects/31/Gw/SHA256E-s167433--41e68ea0adb5a4086a0b7b39d0556b9b86523ffb6b498d58f12f96460da315e9/SHA256E-s167433--41e68ea0adb5a4086a0b7b39d0556b9b86523ffb6b498d58f12f96460da315e9.map.tmp62699: openFile: permission denied (Permission denied)+ failed+ git-annex: add: 1 failed++Any ideas on what's going on here? Perhaps how to get things added back in or recovered? It seems all the actual file contents are here, but annex doesn't seem to know they're there anymore.
@@ -0,0 +1,7 @@+This falls into the category of "noob questions" I think.++The one piece of the git-annex assistant puzzle I've never messed with is XMPP pairing. I'm wondering how well a pair of repos can keep in sync with each other if their only connection is via XMPP. Will things go badly if changes are made to one while the other is offline? Do messages get queued up to deliver when they're both online? (Or do they get queued on the server side so they can be delivered even if one of them is online, makes changes, then goes offline, and the other one comes online later?)++If some xmpp messages don't go through for whatever reason, will the remotes be able to "catch up" with each other later on and make up for lost time?++Just hoping for a general sense of the limitations of XMPP pairing. TIA.
@@ -0,0 +1,47 @@+**<out-of-date-warning>**The main problems this is supposed to solve are addressed in a different way with [[todo/hidden files]] and the `--fast` option introduced in [[batch check on remote when using copy]], so while this is not technically obsolete, the main reasons for it are gone. --[[chrysn]]**</out-of-date-warning>**++This is a rough sketch of a modification of git-annex to rely more on git commit semantics. It might be flawed due to my lack of understanding of git-annex internals. --[[chrysn]]++Summary+=========++Currently, [[location tracking]] is only used for informational purposes unless a repository is [[trust]]ed, in which case there is no checking at all. It is proposed to use the location tracking information as a commitment to keep track of a file until another repository takes over responsibility.++git's semantics for atomic commits are proposed to be used, which makes sure that before files are actually deleted, another repository has accepted the deletion.++Modified git-annex-drop behavior+==========================++The most important (if not only) git-annex command that is affected by this is `git annex drop`. Currently, for dropping a large number of files, every file is checked with another (or multiple, if so configured) host if it's safe to delete.++The new behavior would be to++* decrement the location tracking counter for all files to be dropped,+* commit that change,+* try to push it to at least as many repositories that the numcopies constraints are met,+* revert if that fails,+* otherwise really drop the files from the backend.++Unlike explicit checking, this never looks at the remote backend if the file is really present -- otoh, git-annex already relies on the files in the backend to not be touched by anyone but git-annex itself, and git-annex would only drop them if they were derefed and committed, in which case git would not accept the push. (git by itself would accept a merged push, but even if the reverting step failed due to a power outage or similar, git-annex would, before really deleting files from the backend, check again if the numcopies restraint is still met, and revert its own delete commit as the files are still present anyway.)++Implications for trust+==============++The proposed change also changes the semantics of trust. Trust can now be controlled in a finer-grained way between untrusted and semi-trusted, as best illustrated by a use case:++> Alice takes her netbook with her on a trip through Spain, and will fill most of its disk up with pictures she takes. As she expects to meet some old friends during the first days, she wants to take older pictures with her, which are safely backed up at home, so they can be deleted on demand.+>+> She tells her netbook's repository to dereference the old images (but not other parts of the repository she has not copied anywhere yet) and pushes to the server before leaving. When she adds pictures from her camera to the repository, git-annex can now free up space as needed.++Dereferencing could be implemented as `git annex drop --no-rm` (or `move --no-rm`), freeing space is similar to `dropunused`.++A trusted repository with the new semantics would mean that the repository would not accept dropping anything, just as before.++Advantages / Disadvantages+=====================++The advantage of this proposal is that the round trips required for dropping something could be greatly reduced.++There should also be simplifications in the `git annex drop` command as it doesn't need to take care of locking any more (git should already do that between checking if HEAD is a parent of the pushed commit and replacing HEAD).++Besides being a major change in git-annex (with the requirement to track hosts' git-annex versions for migration, as the new trust system is incompatible with the old one), no disadvantages of that stragegy are known to the author (hoping for discussion below).
@@ -0,0 +1,17 @@+I've gone through most of the screen casts and lots of documentation,+but my first attempt produced an unexpected result.++I wanted to use git-annex is a Dropbox-simplistic setting - syncing+a directory between my notebook (OSX) and my desktop (OpenSUSE 12.3).+Running the assistant on OSX and adding a "Remote server" repository,+changing the repository group to client produced a bare repository+on the desktop.++Am I missing something obvious?++I've tried a few different version of git-annex, most recently++ git-annex version: 4.20130727-g9399845+ build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP++but it remains the same.
@@ -0,0 +1,2 @@+Can diskreserve be done with directory special remotes?+Where should such per directory remote setting be put?
@@ -0,0 +1,7 @@+Hi,++This might be a stupid question, but I did not find any information about it.+Can I retrieve previous versions of a file?+Let's say, I wanna do a "git annex get file", but considering a specific commit id. Is it possible? Are all the versions of the files kept inside .git/annex/objects?++Thanks!
@@ -0,0 +1,2 @@+[Walkthrough](http://git-annex.branchable.com/walkthrough/using_ssh_remotes/) says that when using ssh remotes rsync is used for transfering files. Is rsync used via ssh or unsecure?+-- Michael K.
@@ -0,0 +1,20 @@+the git-annex branch of a repository i've had running since 2010 has grown to unmanagable dimensions (5gb in a fresh clone of the git-annex branch, while the master branch has merely 40mb, part of which is due to checked-in files), resulting in git-annex-merges to take in the order of magnitude of 15 minutes. getting an initial clone of the git-annex branch (not the data) takes hours alone in the "remote: Counting objects" phase (admittedly, the origin server is limited in ram, so it spends its time swapping the git process back and forth).++is there a recommended way for how to reset the git-annex branch in a coordinated way? of course, this would have to happen on all copies of the repo at the same time.++the workflow i currently imagine is++* rename all copies of the repository (the_repo → the_repo-old, the_repo.git → the_repo-old.git)+* clone the old origin repository to a new origin with --single-branch. (this would be *the* oportunity to ``git filter-branch --prune-empty --index-filter 'git rm --cached --ignore-unmatch .git-annex -r' master`` as well, to get rid of commits of pre-whatever versions)+* ``git annex init`` on the master repository+* clone it to all the other copies and ``git annex init`` there+* set all the configuration options (untrusted repos etc) again+* either+ * ``git annex reinject`` the files that are already present on the respective machines, or+ * move the .git/annex/objects files over from the original locations, and use ``git annex fsck`` to make git-annex discover which files it already has, if that works. (i have numcopies=2, thus i'd dare to move instead of copy even when trying this out the first time. complete copies, even of partially checked out clones, will exceed the capacities of most clients)++my questions in that endeavor are:++* is there already a standard workflow for this?+* if not, will the above do the trick?+* can anything be done to avoid such problems in future?
@@ -0,0 +1,1 @@+This is just a comment on git-annex building on haskell platform 2011.2.0.0 on archlinux. It just works.
@@ -0,0 +1,10 @@+I tried ++ git annex initremote encsharedtest type=directory encryption=shared directory=/home/lee/gitannexplay++and got errors:++ initremote encsharedtest gpg: error reading key: public key not found++Looks like it thinks "shared" should be the name of a key rather than an instruction to use the shared cipher.+Am I doing something wrong?
@@ -0,0 +1,5 @@+The web app used to be unresponsive without manual refreshes. Now it's all snappy and responsive and quickly reflects what the assistant is doing.++It used to be a complete crapshoot whether the assistant actually shut down when you told it to (either on the command line or through the webapp). I used to have to manually kill leftover assistants and child processes routinely. Now... you want it gone, and it's gone instantly, every time.++Something really good happened with this last version, thank you joey!
@@ -0,0 +1,31 @@+I checked in my music collection into git annex (about 25000 files) and i'm really impressed by the performance of git annex (after i've done an git-repack). Now i'm also moving my movies into the same git-annex, but i have the following layout of my disk drives:++* small raid-1 for important stuff (music, documents), which is also backupped (aka: raid)+* big bulk data store (aka: media)++In the git-annex the following layout of files is used:++* documents/ <- on raid+* music/ <- on raid+* videos/ <- on media++Now i didn't simply clone the raid-annex to media, but did an sparse-checkout (possible since version 1.7.0)++* raid: .git-annex/, documents/ and music+* media: .git-annex/, videos/++As you can see i have to checkout the .git-annex directory with the file-logs twice which slows down git operations. Everything else works fine until now. git-annex doesn't have any problem, that only a part of the symlinks are present, which is really great. Is there a possibility to sparse checkout the .git-annex directory also? Perhaps splitting the log files in .git-annex/ into N subfolders, corresponding to the toplevel subfolders, like this?++Before:++ $ ls .git-annex+ 00 01 02....++After:++ $ ls .git-annex+ documents/ music/ videos/+ $ ls .git-annex/documents+ 00 01 02....++This would make it possible to checkout only the part of the log files which i'm interested in.
@@ -0,0 +1,44 @@+I have implemented a special remote that stores files as email messages on an imap server. You need to install three utilities that the hooks invoke to deal with the email: mutt, imaputils, and munpack. I use mutt to send the email with the file as a mime attachment; imaputils talks to the imap server to check for and retrieve the message containing the desired file; and munpack extracts and decodes the attachment to get our file back.++Several programs could be used in place of mutt, but the latter has a convenient command-line option for attaching files; mutt is of course available in the repositories of most linux distributions.++imaputils is a perl program available at http://sourceforge.net/projects/imaputils/+It has several perl library dependencies that you might need to download using the cpan tool.+What imaputils does for you is provide a command line tool for interacting with the mail server. You can search for mail with a particular subject (for example), delete mail, retrieve messages, and in general do anything that you can do with a mail client such as mutt, but from the command line rather than a curses interface. This allows you to in turn write scripts that talk to imap servers.++munpack is part of the mpack package. This is included in the Ubuntu and Debian repositories, and can probably be easily obtained for most linuxes. munpack extracts and decodes mime attachments from the command line.++I define the special remote with++ git annex initremote hogneygmail type=hook encryption=gitannex hooktype=hogneygmail++The pgp key "gitannex" is a key established just for this purpose, that has no passphrase. This allows me to use encryption transparently. You could also use encryption=shared if your version of git-annex is recent enough. I also did++ git annex untrust hogneygmail++Here are the hooks:++ hogneygmail-store-hook = mutt -n -s $ANNEX_KEY -a $ANNEX_FILE -- {email address} < /dev/null+ hogneygmail-checkpresent-hook = "(imaputils.pl --conf {imap config file} --subject $ANNEX_KEY --count | grep -q \"1 messages\" -) && echo $ANNEX_KEY"+ hogneygmail-retrieve-hook = "imaputils.pl --conf {imap config file} --subject $ANNEX_KEY --display | munpack -fq && mv $ANNEX_KEY $ANNEX_FILE; rm $ANNEX_KEY.desc"+ hogneygmail-remove-hook = "imaputils.pl --conf {imap config file} --subject $ANNEX_KEY --delete"++The bits inside of the curly brackets, for example {email address}, are what you need to specialize for your particular case (removing the brackets as well). The {imap config file} is a file that contains some configuration for imaputils. In my case it contains++ ssl+ pass {password}+ host {mail host}+ user {mail username}+ box {name of mailbox to check}++The first line tells imaputils to use ssl, and the third line is the address of the mail host. I include my username and password so I won't need to type these in repeatedly. Of course this means that you need to protect this file carefully.++++The operation of the hooks is pretty straightforward. The store-hook attaches the file to an otherwise empty email message with a subject equal to the name of the key, and mails it off. Note that if you use encryption then the keys generated by git-annex here will not be the same ones you see on your local disc. The checkpresent-hook asks the imap server how many emails have the subject equal to the key we are looking for; only if the reply contains "1 messages" are we sure the right one is there. The retrieve-hook uses the "--display" option to imaputils to stream the message, pipes it to munpack to silently extract the attachment (which is our (encrypted) file), and moves the result into the file contents. It then cleans up by deleting the .desc file that I can't prevent munpack from leaving on the disk, even when the message is blank. The remove-hook passes the "-- delete" option to imaputils to supposedly delete the target message from the mail server.++I've performed very limited testing of this, and my knowledge of git and, especially, git-annex is very primitive, so I'm sure this could be vastly improved. In my testing with gmail this seems to work fine, except that messages do not get deleted from the server - I don't know why.++I've developed this as an experiment and proof of concept, and have no knowledge of whether actually using this is in accord with the terms of service of gmail or any other mail service you might be using, nor whether it is safe or a good idea.++-- Lee
@@ -0,0 +1,5 @@+I know versions of this question have been asked before, but I'm looking for a different answer.++I would like a braindead special remote that can be used with devices such as portable music players. No symbolic links, no hashing, no rewriting of the filenames. The remote can be untrusted, file identity can be checked with just the filename and maybe the size. The "directory" special remote with the WORM backend seems to come closest, but does too much. ++Should I just try to roll it using hooks?
@@ -0,0 +1,3 @@+Currently I have my netbook running git annex and a raspberry pi as a remote storage set up as a git repository. I currently have it set up so that from the terminal i can just do 'ssh pi@mypi -p XXX -C' and it has the password saved. Currently I'm having a problem that any time I add a file to my annex folder on my netbook I have to reenter my password for ssh-askpass for it to upload the file. Once that file is uploaded, it looks to me like it closes the connection and then reopens it and asks for my password again.++I'm looking in ~/.ssh/ and I'm sure that something there needs to be edited or copied, I'm not really sure what though. Any suggestions?
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="http://a-or-b.myopenid.com/"+ ip="203.45.2.230"+ subject="comment 1"+ date="2013-05-30T00:08:52Z"+ content="""+It sounds like you don't have the ssh-agent set up properly in your environment.++Try starting the git annex agent from the command line and see if that helps. If it works then it is a problem with environment variables.+"""]]
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ nickname="joey"+ subject="comment 2"+ date="2013-05-30T15:49:27Z"+ content="""+If you set this repository up using the git-annex webapp, and choosing \"remote ssh server\", it will generate a new ssh key, stored in `~/.ssh/git-annex/`, and it will configure `~/.ssh/config` to use this key for a special made-up hostname which is used in the url for the git remote. On the server, it will set up `~/.ssh/authorized_keys` to allow this ssh key to connect without a password and run git-annex-shell.++I don't know if you used the webapp to set this up. If not, you can try to replicate this setup on your own. If you did and it's not working, you now know where all the peices it sets up are, to figure out what went wrong.+"""]]
@@ -0,0 +1,11 @@+I wanted to try out this probably great piece of software you wrote, alas I do not use a Debian distro with managed software menus (i.e. I use OpenBox), so I cannot simply open the assistant through my programs-menu. In fact, to do that I'd need the command to start the assistant so I can add it manually myself. Sadly, the man page did not gave me any advices... :(++Any chance to give me the terminal command to start the assistant?++***+edit: just to update the thread: everythings okay now. Thanks for this great program!++the commands (as posted by Paul):++ git annex assistant+ git annex webapp
@@ -0,0 +1,12 @@+so git annex migrate can switch a file from using one backend to the other.++I've done that with a bunch of files.++The old files should become "unused" right? But they don't seem to be. "git annex unused" still shows me only 2 unused files, and I've just migrated dozens of files from SHA256 to SHA256E. ++Is it possible they're still "used" by other repos? I have two other repos, one reached by SSH and one on a USB drive. Neither one of them is "bare." So maybe those files are still used by the "master" branches there, I thought... I went over and did "git annex sync" on each. Still my newly migrated files are not showing up as "unused." ++I'm worried that my repo is going to bloat with unused files with the SHA256 backend, which mysteriously do not show up as "unused" in git annex unused, if I migrate any more.++any ideas what piece of the puzzle I could be missing here?+
@@ -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,7 @@+Hi,++I synchronize home directories on a couple of machines using unison. Is there a recommended way to do the equivalent using git-annex? ++Thanks,++John
@@ -0,0 +1,46 @@+I have a bunch of directory trees with large data files scattered over various computers and disk drives - they contain photos, videos, music, and so on. In many cases I initially copied one of these trees from one machine to another just as a cheap and dirty backup, and then made small modifications to both trees in ways I no longer remember. For example, I returned from a trip with a bunch of new photos, and then might have rotated some of them 90 degrees on one machine, and edited or renamed them on another.++What I want to do now is use git-annex as a way of initially synchronising the trees, and then fully managing them on an ongoing basis. Note that the trees are *not* yet git repositories. In order to be able to detect straight-forward file renames, I believe that [[the SHA1 backend|tips/using_the_SHA1_backend]] probably makes the most sense.++I've been playing around and arrived at the following setup procedure. For the sake of discussion, I assume that we have two trees `a` and `b` which live in the same directory referred to by `$td`, and that all large files end with the `.avi` suffix.++ # Setup git in 'a'.+ cd $td/a+ git init++ # Setup git-annex in 'a'.+ echo '* annex.backend=SHA1' > .gitattributes+ git add .gitattributes+ git commit -m'use SHA1 backend'+ git annex init++ # Annex all large files.+ find -name \*.avi | xargs git annex add+ git add .+ git commit -m'Initial import'++ # Setup git in 'b'.+ cd $td/b+ git clone -n $td/a new+ mv new/.git .+ rmdir new+ git reset # reset git index to b's wd - hangover from cloning from 'a'++ # Setup git-annex in 'b'.+ # This merges a's (origin's) git-annex branch into the local git-annex branch.+ git annex init++ # Annex all large files - because we're using SHA1 backend, some+ # should hash to the same keys as in 'a'.+ find -name \*.avi | xargs git annex add+ git add .+ git commit -m'Changes in b tree'++ git remote add a $td/a++ # Now pull changes in 'b' back to 'a'.+ cd $td/a+ git remote add b $td/b+ git pull b master++This seems to work, but have I missed anything?
@@ -0,0 +1,11 @@+I try to sync my taskWarrior files .task/*.data with git-annex ... but there is two problem :++- i need to chmod 755 my files because taskWarrior doesn't recognize them, or say "problem with permission" ++- taskwarrior seems crazy with symbolic link used by git-annex, undo not work, task appear multiple times , etc.++Is there any solution ?+Any user experienced the same problem?++Thanks+Sr.
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U"+ nickname="Richard"+ subject="comment 1"+ date="2013-08-06T12:44:11Z"+ content="""+* You could try metastore (not merge friendly), git-cache-meta (pretty minimal) or metamonger (not done yet) to sync your file permissions+* Look into direct mode to avoid symlinks+* Alternatively, check your taskwarrior files into git, not git-annex, to avoid symlinks+"""]]
@@ -0,0 +1,6 @@+Tell your git-annex stories here. Feel free to give as little or as much detail+as appropriate about how you're using it. How's it working out for you?++See [[testimonials]] for some other stories.++[[!meta author=Joey]]
@@ -0,0 +1,22 @@+This is work in progress, since there is now a [[special_remotes/hook]] for users to plug in whatever they want as a remote, here's my recipe for using tahoe-lafs as a remote, this is a copy and paste the relavent section from my .git/config file++ tahoe-store-hook = tahoe put $ANNEX_FILE tahoe:$ANNEX_KEY+ tahoe-retrieve-hook = tahoe get tahoe:$ANNEX_KEY $ANNEX_FILE+ tahoe-remove-hook = tahoe rm tahoe:$ANNEX_KEY+ tahoe-checkpresent-hook = tahoe ls tahoe:$ANNEX_KEY 2>&1 || echo FAIL++Where `tahoe:` is a tahoe-lafs alias, ideally you should create a new alias (DIR-CAP or whatever the terminolgy is) to store your files, I just used the default `tahoe:` alias for testing.++The only quirk I've noticed is this...++<pre>+$ git annex whereis .+whereis frink.jar (2 copies) + 084603a8-7243-11e0-b1f5-83102bcd7953 -- here (testtest)+ 1d1bc312-7243-11e0-a9ce-5f10c0ce9b0a+ok+</pre>++1d1bc312-7243-11e0-a9ce-5f10c0ce9b0a is my [[!google tahoe-lafs]] remote, but there is no label/description on it. The checkpresent-hook was a little confusing when I was setting it up, I'm currently unsure if I am doing the right thing or not with my hook. My get and put commands are a little verbose for now, i might redirect it to /dev/null once I am happier with the overall performance/behaviour my setup.++Other than the quirks above, I am able to put and get files from my tahoe-lafs remote. The only thing that I have not figured out is how to "remove a file" on the remote to free up space on the remote.
@@ -0,0 +1,11 @@+I just briefly tried git-annex. It's an interesting concept.++My main frustration so far: I find it difficult to visualise and use the annex. Shell script contortions can obviously show you anything, but I don't have the ready knowledge to compose them. It would be nice to have some more user-friendly commands or even a GUI.++'annex whereis' is fine for one file, but unweildly for many (e.g. a directory whose contents are always together, never divided between repositories). Is it possible to treat a given directory and all its contents as a single object?++It is not clear what files are immediately available. Sometimes you don't care about annexed files that aren't stored in the current repository. Might it be nice to temporarily remove or hide symlinks for files that are not here right now? Then you could treat the repository more like a normal file heirarchy. Or how about something like 'git annex ls' to show only currently available files?++assistant and sharebox fs sound like great basic synch options, but it would be really cool to have a fuse fs somewhere between raw git-annex and assistant. Putting a file in the directory would trigger git-annex to add it and sync. rm <file> on that new file would not work by default because it's the only copy. rm --annex to get rid of the file from all repos. mv/cp <file> <remote> to transfer between repos. ls to show only the files that are here now, ls --annex to display complete information in a clear way (well-formatted, colorized). Something like that.++This has just been a random brain dump from a new user, hopefully it made some sense.
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="4.154.0.140"+ subject="comment 1"+ date="2013-07-20T19:51:19Z"+ content="""+It's pretty easy to configure ls to show broken symlinks in a different color. Run dircolors, and alias ls='ls --color==auto'. Then you can see which files are not there at a glance.++The Linux file manager's I've tried (nautilus and thunar) also shows which files are present; you get a X on the icon of annexed files that are not present.+"""]]
@@ -0,0 +1,15 @@+[[!comment format=mdwn+ username="http://mylesenglish.myopenid.com/"+ ip="217.39.94.195"+ subject="comment 2"+ date="2013-09-16T19:21:31Z"+ content="""+This shell function behaves more like ls and shows the files that are present:++ ga-ls () {+ CWD=`pwd`+ cd ${1:-.} && git annex find | cut -d / -f 1 | uniq+ cd ${CWD}+ }++"""]]
@@ -0,0 +1,9 @@+what is the work flow to get a file that is in git-annex out of there and into git? (current situation: `git-annex add`ed a bunch of pictures, later found make files in there which i'd rather have in git for proper source code control)++the most intuitive thing to do is `git unannex`, which at first seemed to do the right thing, but when committing there came the hook and everything was back to where it was before.++i could disable the hook as a workaround, but that doesn't smell like a good work flow.++the [[man page|git-annex]] does warn that `unannex` is only supposed to be used against unintentional `git annex add`s (probably meaning that it should be used before something is committed), but the alternatives it suggests (`git rm` and `git annex drop`) don't to what i want to do.++am i missing something or is there really no work flow for this? --[[chrysn]]
@@ -0,0 +1,8 @@+Hi,++when running git annex add in my direct mode repository, since a few days ago I only get:++$ git annex add+git-annex: unknown response from git cat-file (":./Archiv/Someone missing",:./Archiv/Someone Like You Cover-fCvjvEGkTu4.flv)++The :./Archiv/Someone missing part strikes me odd because it so much looks like broken shell meta-character escaping in git-annex, but I doubt that because it stopped working just suddenly.
@@ -0,0 +1,11 @@+Several times now I've done something like:++ $ git annex unlock movie.avi+ $ mv /tmp/fixed.avi movie.avi+ $ git annex lock movie.avi++Oops, I just lost my fixed.avi! That really feels like the right sequence of operations to me, so I'm always surprised when I make that mistake. I would like to see the current `lock` renamed to something like `undo-unlock`, or have the behavior changed to be the same as `add`, or maybe warn and require a `--force` when the file has been changed.++If changing current behavior is undesirable, maybe `unlock` could just print a reminder that `git annex add` is the correct next step after making changes?++Failing that, I suppose I could slowly start to learn from my mistakes.
@@ -0,0 +1,14 @@+Is it possible to let git-annex check and update the "number of copies" or "whereis" information without recalculating the checksome?++The use case is this:++I have a very large "repo1": 300.000 files 1.5 TB.++I copy it using low level tools for performance (clone the partition, netcat over network, or whatever...)++Then i do "git annex init 'repo2'". +All files exist in both repos and the simlinks are valid, but git-annex does not know about it. +The "git-annex wehereis" only shows "repo1". How can I tell him without rehashing 1.6TB?++Thx+
@@ -0,0 +1,5 @@+Hi, a new user trying out git-annex 3.20130124 here. So far looks really promising, thanks.++I setup a local annex using the assistant webapp. I then created a rsync cloud repo over ssh to my shell box in a nearby data center for it. Works ok. I already have ssh key setup inclding ssh-agent for quick logins to the server. It would be great if you could configure the assistant to use these existing keys instead of creating a new set of keys. Maybe keep the defaults as is, but provide the config for this hidden behind "trust me, I know what I'm doing" check box or something.++Thanks again, I keep researching.
@@ -0,0 +1,9 @@+after upgrading to git-annex 3, i'm stuck with diverging git-annex branches -- i didn't manage to follow this line in the directions:++> After this upgrade, you should make sure you include the git-annex branch when git pushing and pulling.++could you explain how to do that in a littel more detail? git pull seems to only merge master, although i have these ``.git/config`` settings:++ [branch "git-annex"]+ remote = origin+ merge = git-annex
@@ -0,0 +1,11 @@+I used to save movies with the srt subtitle files next to them. ++Usually vlc finds it because it's on the same directory than the movie file, however with git annex the link is located on another folder.+So after adding movies to git, the subtitles doesn't load anymore.++couldn't find a quick fix. I'm thinking a bash script, but wanted to discuss it here with all annex users.++I know It's out of annex scope, but I think a movie archive is a great scenario for git-annex.+most of my HD is filled up with movies from the camcorder, screencast, etc... +And we usually don't modify those files+
@@ -0,0 +1,9 @@+I did not recieve feedback on my comment [1], so I try to post my question again but more clearly.++Is it possible to run the assistent/the webapp without the functionality of 'git annex watch'?++I'd like to use the assistant and to have the automatic syncing but I do not want the local repository to be watched. Instead I prefer to manually add/drop my files.++I do not see the 'pause button' mentioned in my earlier question [1].++[1] http://git-annex.branchable.com/forum/webapp_and_manual_mode/
@@ -0,0 +1,7 @@+Somehow I seemingly have not understood the manual mode.++If I have a file in my repository, that is not yet in the annex (or in git), and I start the webapp, that file is automatically added to git-annex (and git).++Why is that?++And how can I use the webapp without such interference?
@@ -0,0 +1,3 @@+To start the webapp on a X-less server it's possible to use the parameter `--listen` and then connect from a client with X to it.++How can I start the webapp on all annex repos on this server like on a client with `assistant --autostart`? Would be nice to start the assistant on all configured repos which listens on a defined port, f.e. `git annex assistant --autostart --listen 0.0.0.0:8888`. It would be even nicer to have a parameter to chose a autostart configuration file, f.e. `git annex assistant --autostart --autostart-config /etc/git-annex/autostart --listen 0.0.0.0:8888`, so this could end up in a real server application, a init script would be easy to write...
@@ -0,0 +1,2 @@+Any progress on Windows port? That would be very nice to have!+Depending on the scale of it, I might be able to help.
@@ -0,0 +1,1 @@+Know what'd be a sweet feature? A file explorer in the webapp that lets you get and drop files (for a Manual local repository). Especially when the webapp becomes available on Android. I'd love to be able to select what is and isn't present on a small device by some means other than moving files around.
@@ -0,0 +1,4 @@+I'm trying to distribute a large annex to a number of smaller archive drives.++While copying to a directory special remote, the current behaviour is to continue trying copying files into a remote, even as diskspace there has been exhausted.+It would make sense for git-annex copy to actually stop instead.
@@ -0,0 +1,20 @@+Is it possible to use git-annex without having [[location tracking]] commits in the style of "got a video I want to rewatch on the plane" or "freed up space" in the main tree?++I consider these changes to be volatile, and irrelevant to the archive history. While they are unproblematic when it comes to merging, they make the commit tree rather complicated, especially with multiple users (as opposed to a single user managing his files on an external disk, a server and his laptop). Some users might even want to contribute to a shared repository without reporting on what they checked out.++As a minimal solution, I configured a repository to ``.gitignore`` ``.git-annex/*:*.log``, but even when using modes that do not require that information (``git annex copy --from`` instead of ``git annex get``), that failes when git-annex tried to git-add ignored files.++A more elaborate solution might be to keep location tracking information in a branch on its own (as suggested in [[todo/branching]]), keeping the main tree clean of such commits. A stealth user could then configure that branch to never be pushed. (Alternatively, if git-annex respects .gitignore and doesn't try to check in changes on ignored files, he could locally ``.gitignore`` ``.git-annex/*:*.log``.)++> A stealth user can simply avoid pushing, and so keep their repository +> in a forked state, that can still pull changes from origin.+> +> Beyond that, [[todo/branching]] is the best solution.+> +> I don't think that gitignoring the log files is a good plan, because+> if the files are left modified and uncommitted, git will not be able to +> merge other changes it pulls. The automerging of log files only works+> if any local changes to them have been committed.+> +> It would be possible to add a knob that+> simply blocks all local modifications to the log files. --[[Joey]]
@@ -0,0 +1,38 @@+Imagine putting a git-annex drive in a time capsule. In 20, or 50, or 100+years, you'd like its contents to be as accessible as possible to whoever+digs it up.++This is a hard problem. git-annex cannot completely solve it, but it does+its best to not contribute to the problem. Here are some aspects of the+problem:++* How are files accessed? Git-annex carefully adds minimal complexity+ to access files in a repository. Nothing needs to be done to extract+ files from the repository; they are there on disk in the usual way,+ with just some symlinks pointing at the annexed file contents.+ Neither git-annex nor git is needed to get at the file contents.+ + (Also, git-annex provides an "uninit" command that moves everything out+ of the annex, if you should ever want to stop using it.)++* What file formats are used? Will they still be readable? To deal with+ this, it's best to stick to plain text files, and the most common+ image, sound, etc formats. Consider storing the same content in multiple+ formats.++* What filesystem is used on the drive? Will that filesystem still be+ available? Whatever you choose to use, git-annex can put files on it.+ Even if you choose (ugh) FAT.++* What is the hardware interface of the drive? Will hardware still exist+ to talk to it?++* What if some of the data is damaged? git-annex facilitates storing a+ configurable number of [[copies]] of the file contents. The metadata+ about your files is stored in git, and so every clone of the repository+ means another copy of that is stored. Also, git-annex uses filenames+ for the data that encode everything needed to match it back to the+ metadata. So if a filesystem is badly corrupted and all your annexed+ files end up in `lost+found`, they can easily be lifted back out into+ another clone of the repository. Even if the filenames are lost,+ it's possible to [[tips/recover_data_from_lost+found]].
@@ -0,0 +1,120 @@+# NAME++git-annex-shell - Restricted login shell for git-annex only SSH access++# SYNOPSIS++git-annex-shell [-c] command [params ...]++# DESCRIPTION++git-annex-shell is a restricted shell, similar to git-shell, which+can be used as a login shell for SSH accounts.++Since its syntax is identical to git-shell's, it can be used as a drop-in+replacement anywhere git-shell is used. For example it can be used as a +user's restricted login shell.++# COMMANDS++Any command not listed below is passed through to git-shell.++Note that the directory parameter should be an absolute path, otherwise+it is assumed to be relative to the user's home directory. Also the+first "/~/" or "/~user/" is expanded to the specified home directory.++* configlist directory++ This outputs a subset of the git configuration, in the same form as+ `git config --list`++* inannex directory [key ...]++ This checks if all specified keys are present in the annex, + and exits zero if so.++* dropkey directory [key ...]++ This drops the annexed data for the specified keys.++* recvkey directory key++ This runs rsync in server mode to receive the content of a key,+ and stores the content in the annex.++* sendkey directory key++ This runs rsync in server mode to transfer out the content of a key.++* transferinfo directory key++ This is typically run at the same time as sendkey is sending a key+ to the remote. Using it is optional, but is used to update+ progress information for the transfer of the key.++ It reads lines from standard input, each giving the number of bytes+ that have been received so far. ++* commit directory++ This commits any staged changes to the git-annex branch.+ It also runs the annex-content hook.++* gcryptsetup gcryptid++ Sets up a repository as a gcrypt repository.++# OPTIONS++Most options are the same as in git-annex. The ones specific+to git-annex-shell are:++* --uuid=UUID++ git-annex uses this to specify the UUID of the repository it was expecting+ git-annex-shell to access, as a sanity check.++* -- fields=val fields=val.. --++ Additional fields may be specified this way, to retain compatability with+ past versions of git-annex-shell (that ignore these, but would choke+ on new dashed options).++ Currently used fields include remoteuuid=, associatedfile=,+ and direct=++# HOOK++After content is received or dropped from the repository by git-annex-shell,+it runs a hook, `.git/hooks/annex-content` (or `hooks/annex-content` on a bare+repository). The hook is not currently passed any information about what+changed.++# ENVIRONMENT++* GIT_ANNEX_SHELL_READONLY++ If set, disallows any command that could modify the repository.++* GIT_ANNEX_SHELL_LIMITED++ If set, disallows running git-shell to handle unknown commands.++* GIT_ANNEX_SHELL_DIRECTORY++ If set, git-annex-shell will refuse to run commands that do not operate+ on the specified directory.++# SEE ALSO++[[git-annex]](1)++git-shell(1)++# AUTHOR++Joey Hess <joey@kitenet.net>++<http://git-annex.branchable.com/>++Warning: Automatically converted into a man page by mdwn2man. Edit with care
@@ -0,0 +1,1359 @@+# NAME++git-annex - manage files with git, without checking their contents in++# SYNOPSIS++git annex command [params ...]++# DESCRIPTION++git-annex allows managing files with git, without checking the file+contents into git. While that may seem paradoxical, it is useful when+dealing with files larger than git can currently easily handle, whether due+to limitations in memory, checksumming time, or disk space.++Even without file content tracking, being able to manage files with git,+move files around and delete files with versioned directory trees, and use+branches and distributed clones, are all very handy reasons to use git. And+annexed files can co-exist in the same git repository with regularly+versioned files, which is convenient for maintaining documents, Makefiles,+etc that are associated with annexed files but that benefit from full+revision control.++When a file is annexed, its content is moved into a key-value store, and+a symlink is made that points to the content. These symlinks are checked into+git and versioned like regular files. You can move them around, delete +them, and so on. Pushing to another git repository will make git-annex+there aware of the annexed file, and it can be used to retrieve its+content from the key-value store.++# EXAMPLES++ # git annex get video/hackity_hack_and_kaxxt.mov+ get video/_why_hackity_hack_and_kaxxt.mov (not available)+ I was unable to access these remotes: server+ Try making some of these repositories available:+ 5863d8c0-d9a9-11df-adb2-af51e6559a49 -- my home file server+ 58d84e8a-d9ae-11df-a1aa-ab9aa8c00826 -- portable USB drive+ ca20064c-dbb5-11df-b2fe-002170d25c55 -- backup SATA drive+ failed+ # sudo mount /media/usb+ # git remote add usbdrive /media/usb+ # git annex get video/hackity_hack_and_kaxxt.mov+ get video/hackity_hack_and_kaxxt.mov (from usbdrive...) ok+ + # git annex add iso+ add iso/Debian_5.0.iso ok+ + # git annex drop iso/Debian_4.0.iso+ drop iso/Debian_4.0.iso ok+ + # git annex move iso --to=usbdrive+ move iso/Debian_5.0.iso (moving to usbdrive...) ok++# COMMONLY USED COMMANDS++Like many git commands, git-annex can be passed a path that +is either a file or a directory. In the latter case it acts on all relevant+files in the directory. When no path is specified, most git-annex commands+default to acting on all relevant files in the current directory (and+subdirectories).++* `add [path ...]`++ Adds files in the path to the annex. Files that are already checked into+ git, or that git has been configured to ignore will be silently skipped.+ (Use `--force` to add ignored files.) Dotfiles are skipped unless explicitly+ listed.++* `get [path ...]`++ Makes the content of annexed files available in this repository. This+ will involve copying them from another repository, or downloading them,+ or transferring them from some kind of key-value store.++ Normally git-annex will choose which repository to copy the content from,+ but you can override this using the `--from` option.++* `drop [path ...]`++ Drops the content of annexed files from this repository. ++ git-annex will refuse to drop content if it cannot verify it is+ safe to do so. This can be overridden with the `--force` switch.++ To drop content from a remote, specify `--from`.++* `move [path ...]`+ + When used with the `--from` option, moves the content of annexed files+ from the specified repository to the current one.++ When used with the `--to` option, moves the content of annexed files from+ the current repository to the specified one.++* `copy [path ...]`++ When used with the `--from` option, copies the content of annexed files+ from the specified repository to the current one.++ When used with the `--to` option, copies the content of annexed files from+ the current repository to the specified one.++ To avoid contacting the remote to check if it has every file, specify `--fast`++* `unlock [path ...]`++ Normally, the content of annexed files is protected from being changed.+ Unlocking a annexed file allows it to be modified. This replaces the+ symlink for each specified file with a copy of the file's content.+ You can then modify it and `git annex add` (or `git commit`) to inject+ it back into the annex.++* `edit [path ...]`++ This is an alias for the unlock command. May be easier to remember,+ if you think of this as allowing you to edit an annexed file.++* `lock [path ...]`++ Use this to undo an unlock command if you don't want to modify+ the files, or have made modifications you want to discard.++* `sync [remote ...]`++ Use this command when you want to synchronize the local repository with+ one or more of its remotes. You can specifiy the remotes to sync with;+ the default is to sync with all remotes. Or specify `--fast` to sync with+ the remotes with the lowest annex-cost value.++ The sync process involves first committing all local changes+ then fetching and merging the `synced/master` and the `git-annex` branch+ from the remote repositories and finally pushing the changes back to+ those branches on the remote repositories. You can use standard git+ commands to do each of those steps by hand, or if you don't want to+ worry about the details, you can use sync.++ Merge conflicts are automatically resolved by sync. When two conflicting+ versions of a file have been committed, both will be added to the tree,+ under different filenames. For example, file "foo" would be replaced+ with "foo.somekey" and "foo.otherkey".++ Note that syncing with a remote will not update the remote's working+ tree with changes made to the local repository. However, those changes+ are pushed to the remote, so can be merged into its working tree+ by running "git annex sync" on the remote.++ Note that sync does not transfer any file contents from or to the remote+ repositories.++* `merge`++ This performs the same merging that is done by the sync command, but+ without pushing or pulling any data.++ One way to use this is to put `git annex merge` into a repository's+ post-receive hook. Then any syncs to the repository will update its working+ copy automatically.++* `mirror [path ...]`+ + This causes a destination repository to mirror a source repository.++ To use the local repository as the source repository,+ specify mirror `--to` remote.++ To use a remote as the source repository, specify mirror `--from` remote.++ Each specified file in the source repository is mirrored to the destination+ repository. If a file's content is present in the source repository, it is+ copied to the destination repository. If a file's content is not present in+ the source repository, it will be dropped from the destination repository+ when possible. ++ Note that mirror does not sync the git repository, but only the file+ contents.++* `addurl [url ...]`++ Downloads each url to its own file, which is added to the annex.++ To avoid immediately downloading the url, specify `--fast`.++ To avoid storing the size of the url's content, and accept whatever+ is there at a future point, specify `--relaxed`. (Implies `--fast`.)++ Normally the filename is based on the full url, so will look like+ "www.example.com_dir_subdir_bigfile". For a shorter filename, specify+ `--pathdepth=N`. For example, `--pathdepth=1` will use "dir/subdir/bigfile",+ while `--pathdepth=3` will use "bigfile". It can also be negative;+ `--pathdepth=-2` will use the last two parts of the url.++ Or, to directly specify what file the url is added to, specify `--file`.+ This changes the behavior; now all the specified urls are recorded as+ alternate locations from which the file can be downloaded. In this mode,+ addurl can be used both to add new files, or to add urls to existing files.++ When quvi is installed, urls are automatically tested to see if they+ are on a video hosting site, and the video is downloaded instead.++* `rmurl file url`++ Record that the file is no longer available at the url.++* `import [path ...]`++ Moves files from somewhere outside the git working copy, and adds them to+ the annex. Individual files to import can be specified. + If a directory is specified, the entire directory is imported.++ git annex import /media/camera/DCIM/*++ By default, importing two files with the same contents from two different+ locations will result in both files being added to the repository.+ (With all checksumming backends, including the default SHA256E,+ only one copy of the data will be stored.)++ To not delete files from the import location, use the+ `--duplicate` option. This could allow importing the same files repeatedly+ to different locations in a repository. More likely, it could be used to+ import the same files to a number of different branches or separate git+ repositories.++ To only import files whose content has not been seen before by git-annex,+ use the `--deduplicate` option. Duplicate files will be deleted from the+ import location.+ + The `--clean-duplicates` option does not import any new files, but any files+ found in the import location that are duplicates of content in the annex+ are deleted.+ + (Note that using `--deduplicate` or `--clean-duplicates` with the WORM+ backend does not look at file content, but filename and mtime.)++* `importfeed [url ...]`++ Imports the contents of podcast feeds. Only downloads files whose+ urls have not already been added to the repository before, so you can+ delete, rename, etc the resulting files and repeated runs won't duplicate+ them. (Use `--force` to force downloading urls it's seen before.)++ Use `--template` to control where the files are stored.+ The default template is '${feedtitle}/${itemtitle}${extension}'+ (Other available variables: feedauthor, itemauthor, itemsummary, itemdescription, itemrights, itemid)++ The `--relaxed` and `--fast` options behave the same as they do in addurl.++* `watch`++ Watches for changes to files in the current directory and its subdirectories,+ and takes care of automatically adding new files, as well as dealing with+ deleted, copied, and moved files. With this running as a daemon in the+ background, you no longer need to manually run git commands when+ manipulating your files.++ To not daemonize, run with `--foreground` ; to stop a running daemon,+ run with `--stop`++* `assistant`++ Like watch, but also automatically syncs changes to other remotes.+ Typically started at boot, or when you log in.++ With the `--autostart` option, the assistant is started in any repositories+ it has created. These are listed in `~/.config/git-annex/autostart`++* `webapp`++ Opens a web app, that allows easy setup of a git-annex repository,+ and control of the git-annex assistant.++ By default, the webapp can only be accessed from localhost, and running+ it opens a browser window.++ With the `--listen=address[:port]` option, the webapp can be made to listen+ for connections on the specified address. This disables running a+ local web browser, and outputs the url you can use to open the webapp+ from a remote computer.+ Note that this does not yet use HTTPS for security, so use with caution!++# REPOSITORY SETUP COMMANDS++* `init [description]`++ Until a repository (or one of its remotes) has been initialized,+ git-annex will refuse to operate on it, to avoid accidentially+ using it in a repository that was not intended to have an annex.++ It's useful, but not mandatory, to initialize each new clone+ of a repository with its own description. If you don't provide one,+ one will be generated.++* `describe repository description`++ Changes the description of a repository.++ The repository to describe can be specified by git remote name or+ by uuid. To change the description of the current repository, use+ "here".++* `initremote name [param=value ...]`++ Creates a new special remote, and adds it to `.git/config`. ++ The remote's configuration is specified by the parameters. Different+ types of special remotes need different configuration values. The+ command will prompt for parameters as needed.++ All special remotes support encryption. You can either specify+ `encryption=none` to disable encryption, or specify + `encryption=hybrid keyid=$keyid ...` to specify a gpg key id (or an email+ address associated with a key.)++ There are actually three schemes that can be used for management of the+ encryption keys. When using the encryption=hybrid scheme, additional+ gpg keys can be given access to the encrypted special remote easily+ (without re-encrypting everything). When using encryption=shared,+ a shared key is generated and stored in the git repository, allowing+ anyone who can clone the git repository to access it. Finally, when using+ encryption=pubkey, content in the special remote is directly encrypted+ to the specified gpg keys, and additional ones cannot easily be given+ access.++ Note that with encryption enabled, a cryptographic key is created.+ This requires sufficient entropy. If initremote seems to hang or take+ a long time while generating the key, you may want to ctrl-c it and+ re-run with `--fast`, which causes it to use a lower-quality source of+ randomness.++ Example Amazon S3 remote:++ git annex initremote mys3 type=S3 encryption=hybrid keyid=me@example.com datacenter=EU++* `enableremote name [param=value ...]`++ Enables use of an existing special remote in the current repository,+ which may be a different repository than the one in which it was+ originally created with the initremote command. ++ The name of the remote is the same name used when origianlly + creating that remote with "initremote". Run "git annex enableremote"+ with no parameters to get a list of special remote names.++ Some special remotes may need parameters to be specified every time.+ For example, the directory special remote requires a directory= parameter.++ This command can also be used to modify the configuration of an existing+ special remote, by specifying new values for parameters that were+ originally set when using initremote. (However, some settings such as+ the as the encryption scheme cannot be changed once a special remote+ has been created.)++ The gpg keys that an encrypted special remote is encrypted to can be+ changed using the keyid+= and keyid-= parameters. These respectively+ add and remove keys from the list. However, note that removing a key+ does NOT necessarily prevent the key's owner from accessing data+ in the encrypted special remote+ (which is by design impossible, short of deleting the remote).++ One use-case of keyid-= is to replace a revoked key with+ a new key:++ git annex enableremote mys3 keyid-=revokedkey keyid+=newkey++ Also, note that for encrypted special remotes using plain public-key+ encryption (encryption=pubkey), adding or removing a key has NO effect+ on files that have already been copied to the remote. Hence using+ keyid+= and keyid-= with such remotes should be used with care, and+ make little sense except in cases like the revoked key example above.++* `trust [repository ...]`++ Records that a repository is trusted to not unexpectedly lose+ content. Use with care.++ To trust the current repository, use "here".++* `untrust [repository ...]`++ Records that a repository is not trusted and could lose content+ at any time.++* `semitrust [repository ...]`++ Returns a repository to the default semi trusted state.++* `dead [repository ...]`++ Indicates that the repository has been irretrevably lost.+ (To undo, use semitrust.)++* `group repository groupname`++ Adds a repository to a group, such as "archival", "enduser", or "transfer".+ The groupname must be a single word.++* `ungroup repository groupname`++ Removes a repository from a group.++* `content repository [expression]`++ When run with an expression, configures the content that is preferred+ to be held in the archive. See PREFERRED CONTENT below.++ For example:++ git annex content . "include=*.mp3 or include=*.ogg"++ Without an expression, displays the current preferred content setting+ of the repository.++* `schedule repository [expression]`++ When run with an expression, configures scheduled jobs to run at a+ particular time. This can be used to make the assistant periodically run+ incremental fscks. See SCHEDULED JOBS below.++* `vicfg`++ Opens EDITOR on a temp file containing most of the above configuration+ settings, and when it exits, stores any changes made back to the git-annex+ branch.++* `direct`++ Switches a repository to use direct mode, where rather than symlinks to+ files, the files are directly present in the repository.++ As part of the switch to direct mode, any changed files will be committed.++ Note that git commands that operate on the work tree are often unsafe to+ use in direct mode repositories, and can result in data loss or other+ bad behavior.++* `indirect`++ Switches a repository back from direct mode to the default, indirect mode.++ As part of the switch from direct mode, any changed files will be committed.++# REPOSITORY MAINTENANCE COMMANDS++* `fsck [path ...]`++ With no parameters, this command checks the whole annex for consistency,+ and warns about or fixes any problems found. This is a good compliment to+ `git fsck`.++ With parameters, only the specified files are checked.++ To check a remote to fsck, specify `--from`.++ To avoid expensive checksum calculations (and expensive transfers when+ fscking a remote), specify `--fast`.++ To start a new incremental fsck, specify `--incremental`. Then+ the next time you fsck, you can specify `--more` to skip over+ files that have already been checked, and continue where it left off.++ The `--incremental-schedule` option makes a new incremental fsck be+ started a configurable time after the last incremental fsck was started.+ Once the current incremental fsck has completely finished, it causes+ a new one to start.++ Maybe you'd like to run a fsck for 5 hours at night, picking up each+ night where it left off. You'd like this to continue until all files+ have been fscked. And once it's done, you'd like a new fsck pass to start,+ but no more often than once a month. Then put this in a nightly cron job:++ git annex fsck --incremental-schedule 30d --time-limit 5h++ To verify data integrity only while disregarding required number of copies,+ use `--numcopies=1`.++* `unused`++ Checks the annex for data that does not correspond to any files present+ in any tag or branch, and prints a numbered list of the data.++ To only show unused temp and bad files, specify `--fast`.++ To check for annexed data on a remote, specify `--from`.++ After running this command, you can use the `--unused` option to+ operate on all the unused data that was found. For example, to+ move all unused data to origin:++ git annex unused; git annex move --unused --to origin++* `dropunused [number|range ...]`++ Drops the data corresponding to the numbers, as listed by the last+ `git annex unused`++ You can also specify ranges of numbers, such as "1-1000".++ To drop the data from a remote, specify `--from.`++* `addunused [number|range ...]`++ Adds back files for the content corresponding to the numbers or ranges,+ as listed by the last `git annex unused`. The files will have names+ starting with "unused."++* `fix [path ...]`++ Fixes up symlinks that have become broken to again point to annexed content.+ This is useful to run if you have been moving the symlinks around,+ but is done automatically when committing a change with git too.++* `upgrade`++ Upgrades the repository to current layout.++* `forget`++ Causes the git-annex branch to be rewritten, throwing away historical+ data about past locations of files. The resulting branch will use less+ space, but `git annex log` will not be able to show where+ files used to be located.+ + To also prune references to repositories that have been marked as dead,+ specify `--drop-dead`.++ When this rewritten branch is merged into other clones of+ the repository, `git-annex` will automatically perform the same rewriting+ to their local `git-annex` branches. So the forgetfulness will automatically+ propigate out from its starting point until all repositories running+ git-annex have forgotten their old history. (You may need to force+ git to push the branch to any git repositories not running git-annex.++* `repair`++ This can repair many of the problems with git repositories that `git fsck` + detects, but does not itself fix. It's useful if a repository has become+ badly damaged. One way this can happen is if a repisitory used by git-annex+ is on a removable drive that gets unplugged at the wrong time.+ + This command can actually be used inside git repositories that do not+ use git-annex at all; when used in a repository using git-annex, it+ does additional repairs of the git-annex branch.++ It works by deleting any corrupt objects from the git repository, and+ retriving all missing objects it can from the remotes of the repository.++ If that is not sufficient to fully recover the repository, it can also+ reset branches back to commits before the corruption happened, delete+ branches that are no longer available due to the lost data, and remove any+ missing files from the index. It will only do this if run with the+ `--force` option, since that rewrites history and throws out missing data.+ Note that the `--force` option never touches tags, even if they are no+ longer usable due to missing data.++ After running this command, you will probably want to run `git fsck` to+ verify it fixed the repository. Note that fsck may still complain about+ objects referenced by the reflog, or the stash, if they were unable to be+ recovered. This command does not try to clean up either the reflog or the+ stash.++ It is also a good idea to run `git annex fsck --fast` after this command,+ to make sure that the git-annex branch reflects reality.++# QUERY COMMANDS++* `version`++ Shows the version of git-annex, as well as repository version information.++* `find [path ...]`++ Outputs a list of annexed files in the specified path. With no path,+ finds files in the current directory and its subdirectories.++ By default, only lists annexed files whose content is currently present.+ This can be changed by specifying file matching options. To list all+ annexed files, present or not, specify `--include "*"`. To list all+ annexed files whose content is not present, specify `--not --in=here`++ To output filenames terminated with nulls, for use with xargs -0,+ specify `--print0`. Or, a custom output formatting can be specified using+ `--format`. The default output format is the same as `--format='${file}\\n'`++ These variables are available for use in formats: file, key, backend,+ bytesize, humansize++* `whereis [path ...]`++ Displays a information about where the contents of files are located.++* `list [path ...]`++ Displays a table of remotes that contain the contents of the specified+ files. This is similar to whereis but a more compact display. Only+ configured remotes are shown by default; specify --allrepos to list+ all repositories.++* `log [path ...]`++ Displays the location log for the specified file or files,+ showing each repository they were added to ("+") and removed from ("-").++ To limit how far back to seach for location log changes, the options+ `--since`, `--after`, `--until`, `--before`, and `--max-count` can be specified.+ They are passed through to git log. For example, `--since "1 month ago"`++ To generate output suitable for the gource visualisation program,+ specify `--gource`.++* `status [directory ...]`++ Displays some statistics and other information, including how much data+ is in the annex and a list of all known repositories.++ To only show the data that can be gathered quickly, use `--fast`.++ When a directory is specified, shows a differently formatted status+ display for that directory. In this mode, all of the file matching+ options can be used to filter the files that will be included in+ the status.++ For example, suppose you want to run "git annex get .", but+ would first like to see how much disk space that will use.+ Then run:++ git annex status --fast . --not --in here++* `map`++ Helps you keep track of your repositories, and the connections between them,+ by going out and looking at all the ones it can get to, and generating a+ Graphviz file displaying it all. If the `dot` command is available, it is+ used to display the file to your screen (using x11 backend). (To disable+ this display, specify `--fast`)++ This command only connects to hosts that the host it's run on can+ directly connect to. It does not try to tunnel through intermediate hosts.+ So it might not show all connections between the repositories in the network.++ Also, if connecting to a host requires a password, you might have to enter+ it several times as the map is being built.++ Note that this subcommand can be used to graph any git repository; it+ is not limited to git-annex repositories.++# UTILITY COMMANDS++* `migrate [path ...]`++ Changes the specified annexed files to use the default key-value backend+ (or the one specified with `--backend`). Only files whose content+ is currently available are migrated.++ Note that the content is also still available using the old key after+ migration. Use `git annex unused` to find and remove the old key.++ Normally, nothing will be done to files already using the new backend.+ However, if a backend changes the information it uses to construct a key,+ this can also be used to migrate files to use the new key format.++* `reinject src dest`++ Moves the src file into the annex as the content of the dest file.+ This can be useful if you have obtained the content of a file from+ elsewhere and want to put it in the local annex.++ Automatically runs fsck on dest to check that the expected content was+ provided.++ Example:++ git annex reinject /tmp/foo.iso foo.iso++* `unannex [path ...]`++ Use this to undo an accidental `git annex add` command. You can use+ `git annex unannex` to move content out of the annex at any point,+ even if you've already committed it.++ This is not the command you should use if you intentionally annexed a+ file and don't want its contents any more. In that case you should use+ `git annex drop` instead, and you can also `git rm` the file.++ In `--fast` mode, this command leaves content in the annex, simply making+ a hard link to it.++* `uninit`++ Use this to stop using git annex. It will unannex every file in the+ repository, and remove all of git-annex's other data, leaving you with a+ git repository plus the previously annexed files.++# PLUMBING COMMANDS++* `pre-commit [path ...]`++ Fixes up symlinks that are staged as part of a commit, to ensure they+ point to annexed content. Also handles injecting changes to unlocked+ files into the annex.++ This is meant to be called from git's pre-commit hook. `git annex init`+ automatically creates a pre-commit hook using this.++* `fromkey key file`++ This plumbing-level command can be used to manually set up a file+ in the git repository to link to a specified key.++* `dropkey [key ...]`++ This plumbing-level command drops the annexed data for the specified+ keys from this repository.++ This can be used to drop content for arbitrary keys, which do not need+ to have a file in the git repository pointing at them.++ Example:++ git annex dropkey SHA1-s10-7da006579dd64330eb2456001fd01948430572f2++* `transferkeys`++ This plumbing-level command is used by the assistant to transfer data.++* `rekey [file key ...]`++ This plumbing-level command is similar to migrate, but you specify+ both the file, and the new key to use for it.++ With `--force`, even files whose content is not currently available will+ be rekeyed. Use with caution.++* `test`++ This runs git-annex's built-in test suite.++* `xmppgit`++ This command is used internally to perform git pulls over XMPP.++# OPTIONS++* `--force`++ Force unsafe actions, such as dropping a file's content when no other+ source of it can be verified to still exist, or adding ignored files.+ Use with care.++* `--fast`++ Enables less expensive, but also less thorough versions of some commands.+ What is avoided depends on the command.++* `--auto`++ Enables automatic mode. Commands that get, drop, or move file contents+ will only do so when needed to help satisfy the setting of annex.numcopies,+ and preferred content configuration.++* `--all`++ Operate on all data that has been stored in the git annex,+ including old versions of files. This is the default behavior when+ running git-annex in a bare repository; in a non-bare repository the+ normal behavior is to only operate on specified files in the working+ tree.++* `--unused`++ Operate on all data that has been determined to be unused by+ a previous run of `git-annex unused`.++* `--quiet`++ Avoid the default verbose display of what is done; only show errors+ and progress displays.++* `--verbose`++ Enable verbose display.++* `--json`++ Rather than the normal output, generate JSON. This is intended to be+ parsed by programs that use git-annex. Each line of output is a JSON+ object. Note that json output is only usable with some git-annex commands,+ like status and find.++* `--debug`++ Show debug messages.++* `--no-debug`++ Disable debug messages.++* `--from=repository`++ Specifies a repository that content will be retrieved from, or that+ should otherwise be acted on.++ It should be specified using the name of a configured remote.++* `--to=repository`++ Specifies a repository that content will be sent to.++ It should be specified using the name of a configured remote.++* `--numcopies=n`++ Overrides the `annex.numcopies` setting, forcing git-annex to ensure the+ specified number of copies exist. ++ Note that setting numcopies to 0 is very unsafe.++* `--time-limit=time`++ Limits how long a git-annex command runs. The time can be something+ like "5h", or "30m" or even "45s" or "10d".++ Note that git-annex may continue running a little past the specified+ time limit, in order to finish processing a file.++ Also, note that if the time limit prevents git-annex from doing all it + was asked to, it will exit with a special code, 101.++* `--trust=repository`+* `--semitrust=repository`+* `--untrust=repository`++ Overrides trust settings for a repository. May be specified more than once.++ The repository should be specified using the name of a configured remote,+ or the UUID or description of a repository.++* `--trust-glacier-inventory`++ Amazon Glacier inventories take hours to retrieve, and may not represent+ the current state of a repository. So git-annex does not trust that+ files that the inventory claims are in Glacier are really there.+ This switch can be used to allow it to trust the inventory.++ Be careful using this, especially if you or someone else might have recently+ removed a file from Glacier. If you try to drop the only other copy of the+ file, and this switch is enabled, you could lose data! ++* `--backend=name`++ Specifies which key-value backend to use. This can be used when+ adding a file to the annex, or migrating a file. Once files+ are in the annex, their backend is known and this option is not+ necessary.++* `--format=value`++ Specifies a custom output format. The value is a format string, + in which '${var}' is expanded to the value of a variable. To right-justify+ a variable with whitespace, use '${var;width}' ; to left-justify+ a variable, use '${var;-width}'; to escape unusual characters in a variable,+ use '${escaped_var}'++ Also, '\\n' is a newline, '\\000' is a NULL, etc.++* `--user-agent=value`++ Overrides the User-Agent to use when downloading files from the web.++* `-c name=value`++ Used to override git configuration settings. May be specified multiple times.++# FILE MATCHING OPTIONS++These options can all be specified multiple times, and can be combined to+limit which files git-annex acts on.++Arbitrarily complicated expressions can be built using these options.+For example:++ --exclude '*.mp3' --and --not -( --in=usbdrive --or --in=archive -)++The above example prevents git-annex from working on mp3 files whose+file contents are present at either of two repositories.++* `--exclude=glob`++ Skips files matching the glob pattern. The glob is matched relative to+ the current directory. For example:++ --exclude='*.mp3' --exclude='subdir/*'++* `--include=glob`++ Skips files not matching the glob pattern. (Same as `--not --exclude`.)+ For example, to include only mp3 and ogg files:++ --include='*.mp3' --or --include='*.ogg'++* `--in=repository`++ Matches only files that git-annex believes have their contents present+ in a repository. Note that it does not check the repository to verify+ that it still has the content.++ The repository should be specified using the name of a configured remote,+ or the UUID or description of a repository. For the current repository,+ use `--in=here`++* `--copies=number`++ Matches only files that git-annex believes to have the specified number+ of copies, or more. Note that it does not check remotes to verify that+ the copies still exist.++* `--copies=trustlevel:number`++ Matches only files that git-annex believes have the specified number of+ copies, on remotes with the specified trust level. For example,+ `--copies=trusted:2`++ To match any trust level at or higher than a given level,+ use 'trustlevel+'. For example, `--copies=semitrusted+:2`++* `--copies=groupname:number`++ Matches only files that git-annex believes have the specified number of+ copies, on remotes in the specified group. For example,+ `--copies=archive:2`++* `--inbackend=name`++ Matches only files whose content is stored using the specified key-value+ backend.++* `--inallgroup=groupname`++ Matches only files that git-annex believes are present in all repositories+ in the specified group.++* `--smallerthan=size`+* `--largerthan=size`++ Matches only files whose content is smaller than, or larger than the+ specified size.++ The size can be specified with any commonly used units, for example,+ "0.5 gb" or "100 KiloBytes"++* `--not`++ Inverts the next file matching option. For example, to only act on+ files with less than 3 copies, use `--not --copies=3`++* `--and`++ Requires that both the previous and the next file matching option matches.+ The default.++* `--or`++ Requires that either the previous, or the next file matching option matches.++* `-(`++ Opens a group of file matching options.++* `-)`++ Closes a group of file matching options.++# PREFERRED CONTENT++Each repository has a preferred content setting, which specifies content+that the repository wants to have present. These settings can be configured+using `git annex vicfg` or `git annex content`.+They are used by the `--auto` option, and by the git-annex assistant.++The preferred content settings are similar, but not identical to+the file matching options specified above, just without the dashes.+For example:++ exclude=archive/* and (include=*.mp3 or smallerthan=1mb)++The main differences are that `exclude=` and `include=` always+match relative to the top of the git repository, and that there is+no equivilant to `--in`.++When a repository is in one of the standard predefined groups, like "backup"+and "client", setting its preferred content to "standard" will use a+built-in preferred content expression ddeveloped for that group.++# SCHEDULED JOBS++The git-annex assistant daemon can be configured to run scheduled jobs.+This is similar to cron and anacron (and you can use them if you prefer),+but has the advantage of being integrated into git-annex, and so being able+to eg, fsck a repository on a removable drive when the drive gets+connected.++The scheduled jobs can be configured using `git annex vicfg` or+`git annex schedule`. ++These actions are available: "fsck self", "fsck UUID" (where UUID+is the UUID of a remote to fsck). After the action comes the duration+to allow the action to run, and finally the schedule of when to run it.++To schedule multiple jobs, separate them with "; ".++Some examples:++ fsck self 30m every day at any time+ fsck self 1h every month at 3 AM+ fsck self 1h on day 1 of every month at any time+ fsck self 1h every week divisible by 2 at any time++# CONFIGURATION VIA .git/config++Like other git commands, git-annex is configured via `.git/config`.+Here are all the supported configuration settings.++* `annex.uuid`++ A unique UUID for this repository (automatically set).++* `annex.numcopies`++ Number of copies of files to keep across all repositories. (default: 1)+ + Note that setting numcopies to 0 is very unsafe.++* `annex.backends`++ Space-separated list of names of the key-value backends to use. + The first listed is used to store new files by default. ++* `annex.diskreserve`++ Amount of disk space to reserve. Disk space is checked when transferring+ content to avoid running out, and additional free space can be reserved+ via this option, to make space for more important content (such as git+ commit logs). Can be specified with any commonly used units, for example,+ "0.5 gb" or "100 KiloBytes"++ The default reserve is 1 megabyte.++* `annex.largefiles`++ Allows configuring which files `git annex add` and the assistant consider+ to be large enough to need to be added to the annex. By default,+ all files are added to the annex.++ The value is a preferred content expression. See PREFERRED CONTENT+ for details.++ Example:++ annex.largefiles = largerthan=100kb and not (include=*.c or include=*.h)++* `annex.queuesize`++ git-annex builds a queue of git commands, in order to combine similar+ commands for speed. By default the size of the queue is limited to+ 10240 commands; this can be used to change the size. If you have plenty+ of memory and are working with very large numbers of files, increasing+ the queue size can speed it up.++* `annex.bloomcapacity`++ The `git annex unused` command uses a bloom filter to determine+ what data is no longer used. The default bloom filter is sized to handle+ up to 500000 keys. If your repository is larger than that,+ you can adjust this to avoid `git annex unused` not noticing some unused+ data files. Increasing this will make `git-annex unused` consume more memory;+ run `git annex status` for memory usage numbers.++* `annex.bloomaccuracy`++ Adjusts the accuracy of the bloom filter used by+ `git annex unused`. The default accuracy is 1000 -- + 1 unused file out of 1000 will be missed by `git annex unused`. Increasing+ the accuracy will make `git annex unused` consume more memory;+ run `git annex status` for memory usage numbers.++* `annex.sshcaching`++ By default, git-annex caches ssh connections+ (if built using a new enough ssh). To disable this, set to `false`.++* `annex.alwayscommit`++ By default, git-annex automatically commits data to the git-annex branch+ after each command is run. To disable these commits,+ set to `false`. Then data will only be committed when+ running `git annex merge` (or by automatic merges) or `git annex sync`.++* `annex.delayadd`++ Makes the watch and assistant commands delay for the specified number of+ seconds before adding a newly created file to the annex. Normally this+ is not needed, because they already wait for all writers of the file+ to close it. On Mac OSX, when not using direct mode this defaults to+ 1 second, to work around a bad interaction with software there.++* `annex.autocommit`++ Set to false to prevent the git-annex assistant from automatically+ committing changes to files in the repository.++* `annex.debug`++ Set to true to enable debug logging by default.++* `annex.version`++ Automatically maintained, and used to automate upgrades between versions.++* `annex.direct`++ Set to true when the repository is in direct mode. Should not be set+ manually; use the "git annex direct" and "git annex indirect" commands+ instead.++* `annex.crippledfilesystem`++ Set to true if the repository is on a crippled filesystem, such as FAT,+ which does not support symbolic links, or hard links, or unix permissions.+ This is automatically probed by "git annex init".++* `remote.<name>.annex-cost`++ When determining which repository to+ transfer annexed files from or to, ones with lower costs are preferred.+ The default cost is 100 for local repositories, and 200 for remote+ repositories.++* `remote.<name>.annex-cost-command`++ If set, the command is run, and the number it outputs is used as the cost.+ This allows varying the cost based on eg, the current network. The+ cost-command can be any shell command line.++* `remote.<name>.annex-start-command`++ A command to run when git-annex begins to use the remote. This can+ be used to, for example, mount the directory containing the remote.++ The command may be run repeatedly when multiple git-annex processes+ are running concurrently.++* `remote.<name>.annex-stop-command`++ A command to run when git-annex is done using the remote.++ The command will only be run once *all* running git-annex processes+ are finished using the remote.++* `remote.<name>.annex-ignore`++ If set to `true`, prevents git-annex+ from storing file contents on this remote by default.+ (You can still request it be used by the `--from` and `--to` options.)++ This is, for example, useful if the remote is located somewhere+ without git-annex-shell. (For example, if it's on GitHub).+ Or, it could be used if the network connection between two+ repositories is too slow to be used normally.++ This does not prevent git-annex sync (or the git-annex assistant) from+ syncing the git repository to the remote.++* `remote.<name>.annex-sync`++ If set to `false`, prevents git-annex sync (and the git-annex assistant)+ from syncing with this remote.++* `remote.<name>.annexUrl`++ Can be used to specify a different url than the regular `remote.<name>.url`+ for git-annex to use when talking with the remote. Similar to the `pushUrl`+ used by git-push.++* `remote.<name>.annex-uuid`++ git-annex caches UUIDs of remote repositories here.++* `remote.<name>.annex-trustlevel`++ Configures a local trust level for the remote. This overrides the value+ configured by the trust and untrust commands. The value can be any of+ "trusted", "semitrusted" or "untrusted".++* `remote.<name>.annex-ssh-options`++ Options to use when using ssh to talk to this remote.++* `remote.<name>.annex-rsync-options`++ Options to use when using rsync+ to or from this remote. For example, to force ipv6, and limit+ the bandwidth to 100Kbyte/s, set it to `-6 --bwlimit 100`++* `remote.<name>.annex-rsync-transport`++ The remote shell to use to connect to the rsync remote. Possible+ values are `ssh` (the default) and `rsh`, together with their+ arguments, for instance `ssh -p 2222 -c blowfish`; Note that the+ remote hostname should not appear there, see rsync(1) for details.+ When the transport used is `ssh`, connections are automatically cached+ unless `annex.sshcaching` is unset.++* `remote.<name>.annex-bup-split-options`++ Options to pass to bup split when storing content in this remote.+ For example, to limit the bandwidth to 100Kbyte/s, set it to `--bwlimit 100k`+ (There is no corresponding option for bup join.)++* `remote.<name>.annex-gnupg-options`++ Options to pass to GnuPG for symmetric encryption. For instance, to+ use the AES cipher with a 256 bits key and disable compression, set it+ to `--cipher-algo AES256 --compress-algo none`. (These options take+ precedence over the default GnuPG configuration, which is otherwise+ used.)++* `annex.ssh-options`, `annex.rsync-options`, `annex.bup-split-options`,+ `annex.gnupg-options`++ Default ssh, rsync, wget/curl, bup, and GnuPG options to use if a+ remote does not have specific options.++* `annex.web-options`++ Options to use when using wget or curl to download a file from the web.+ (wget is always used in preference to curl if available.)+ For example, to force ipv4 only, set it to "-4"++* `annex.quvi-options`++ Options to pass to quvi when using it to find the url to download for a+ video.++* `annex.http-headers`++ HTTP headers to send when downloading from the web. Multiple lines of+ this option can be set, one per header.++* `annex.http-headers-command`++ If set, the command is run and each line of its output is used as a HTTP+ header. This overrides annex.http-headers.++* `annex.web-download-command`++ Use to specify a command to run to download a file from the web.+ (The default is to use wget or curl.)++ In the command line, %url is replaced with the url to download,+ and %file is replaced with the file that it should be saved to.+ Note that both these values will automatically be quoted, since+ the command is run in a shell.++* `remote.<name>.rsyncurl`++ Used by rsync special remotes, this configures+ the location of the rsync repository to use. Normally this is automatically+ set up by `git annex initremote`, but you can change it if needed.++* `remote.<name>.buprepo`++ Used by bup special remotes, this configures+ the location of the bup repository to use. Normally this is automatically+ set up by `git annex initremote`, but you can change it if needed.++* `remote.<name>.directory`++ Used by directory special remotes, this configures+ the location of the directory where annexed files are stored for this+ remote. Normally this is automatically set up by `git annex initremote`,+ but you can change it if needed.++* `remote.<name>.s3`++ Used to identify Amazon S3 special remotes.+ Normally this is automatically set up by `git annex initremote`.++* `remote.<name>.glacier`++ Used to identify Amazon Glacier special remotes.+ Normally this is automatically set up by `git annex initremote`.++* `remote.<name>.webdav`++ Used to identify webdav special remotes.+ Normally this is automatically set up by `git annex initremote`.++* `remote.<name>.annex-xmppaddress`++ Used to identify the XMPP address of a Jabber buddy.+ Normally this is set up by the git-annex assistant when pairing over XMPP.++* `remote.<name>.gcrypt`++ Used to identify gcrypt special remotes.+ Normally this is automatically set up by `git annex initremote`.++ It is set to "true" if this is a gcrypt remote.+ If the gcrypt remote is accessible over ssh and has git-annex-shell+ available to manage it, it's set to "shell"++# CONFIGURATION VIA .gitattributes++The key-value backend used when adding a new file to the annex can be+configured on a per-file-type basis via `.gitattributes` files. In the file,+the `annex.backend` attribute can be set to the name of the backend to+use. For example, this here's how to use the WORM backend by default,+but the SHA256E backend for ogg files:++ * annex.backend=WORM+ *.ogg annex.backend=SHA256E++The numcopies setting can also be configured on a per-file-type basis via+the `annex.numcopies` attribute in `.gitattributes` files. This overrides+any value set using `annex.numcopies` in `.git/config`.+For example, this makes two copies be needed for wav files:++ *.wav annex.numcopies=2++Note that setting numcopies to 0 is very unsafe.++# FILES++These files are used by git-annex:++`.git/annex/objects/` in your git repository contains the annexed file+contents that are currently available. Annexed files in your git+repository symlink to that content.++`.git/annex/` in your git repository contains other run-time information+used by git-annex.++`~/.config/git-annex/autostart` is a list of git repositories+to start the git-annex assistant in.++# SEE ALSO++Most of git-annex's documentation is available on its web site, +<http://git-annex.branchable.com/>++If git-annex is installed from a package, a copy of its documentation+should be included, in, for example, `/usr/share/doc/git-annex/`++# AUTHOR++Joey Hess <joey@kitenet.net>++<http://git-annex.branchable.com/>++Warning: Automatically converted into a man page by mdwn2man. Edit with care
@@ -0,0 +1,40 @@+# NAME++git-recover-repository - Fix a broken git repository++# SYNOPSIS++git-recover-repository [--force]++# DESCRIPTION++This can fix a corrupt or broken git repository, which git fsck would+only complain has problems.++It does by deleting all corrupt objects, and retreiving all missing+objects that it can from the remotes of the repository.++If that is not sufficient to fully recover the repository, it can also+reset branches back to commits before the corruption happened, delete+branches that are no longer available due to the lost data, and remove any+missing files from the index. It will only do this if run with the+`--force` option, since that rewrites history and throws out missing data.+Note that the `--force` option never touches tags, even if they are no+longer usable due to missing data.++After running this command, you will probably want to run `git fsck` to+verify it fixed the repository. Note that fsck may still complain about+objects referenced by the reflog, or the stash, if they were unable to be+recovered. This command does not try to clean up either the reflog or the+stash.++Since this command unpacks all packs in the repository, you may want to+run `git gc` afterwards.++# AUTHOR++Joey Hess <joey@kitenet.net>++<http://git-annex.branchable.com/>++Warning: Automatically converted into a man page by mdwn2man. Edit with care
@@ -0,0 +1,38 @@+# NAME++git-union-merge - Join branches together using a union merge++# SYNOPSIS++git union-merge ref ref newref++# DESCRIPTION++Does a union merge between two refs, storing the result in the+specified newref.++The union merge will always succeed, but assumes that files can be merged+simply by concacenating together lines from all the oldrefs, in any order.+So, this is useful only for branches containing log-type data.++Note that this does not touch the checked out working copy. It operates+entirely on git refs and branches.++# EXAMPLE++ git union-merge git-annex origin/git-annex refs/heads/git-annex ++Merges the current git-annex branch, and a version from origin,+storing the result in the git-annex branch.++# BUGS++File modes are not currently merged.++# AUTHOR++Joey Hess <joey@kitenet.net>++<http://git-annex.branchable.com/>++Warning: Automatically converted into a man page by mdwn2man. Edit with care
@@ -0,0 +1,41 @@+This page gives a high-level view of git-annex. For a detailed+low-level view, see [[the_man_page|git-annex]] and [[internals]].++You do not need to read this page to get started with using git-annex. The+[[walkthrough]] provides step-by-step instructions.++Still reading? Ok. Git's man page calls it "a stupid content+tracker". With git-annex, git is instead "a stupid filename and metadata"+tracker. The contents of large files are not stored in git, only the+names of the files and some other metadata remain there.++The contents of the files are kept by git-annex in a distributed key/value+store consisting of every clone of a given git repository. That's a fancy+way to say that git-annex stores the actual file content somewhere under+`.git/annex/`. (See [[internals]] for details.)++That was the values; what about the keys? Well, a key is calculated for a+given file when it's first added into git-annex. Normally this uses a hash+of its contents, but various [[backends]] can produce different sorts of+keys. The file that gets checked into git is just a symlink to the key+under `.git/annex/`. If the content of a file is modified, that produces+a different key (and the symlink is changed).++A file's content can be [[transferred|transferring_data]] from one+repository to another by git-annex. Which repositories contain a given+value is tracked by git-annex (see [[location_tracking]]). It stores this+tracking information in a separate branch, named "git-annex". All you ever+do with the "git-annex" branch is push/pull it around between repositories,+to [[sync]] up git-annex's view of the world.++That's really all there is to it. Oh, there are [[special_remotes]] that+let values be stored other places than git repositories (anything from+Amazon S3 to a USB key), and there's a pile of commands listed in+[[the_man_page|git-annex]] to handle moving the values around and managing+them. But if you grok the description above, you can see through all that.+It's really just symlinks, keys, values, and a git-annex branch to store+additional metadata.++---++Next: [[install]] or [[walkthrough]]
@@ -0,0 +1,14 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawnaH44G3QbxBAYyDwy0PbvL0ls60XoaR3Y"+ nickname="Nigel"+ subject="minor suggestion"+ date="2013-08-10T14:31:31Z"+ content="""+The contents of large files are not stored in git, only the names of the files and some other metadata remain there.++Would this read better to the newbie as:++The contents of 'annexed' files are not stored in git, only the names of the files and some other metadata remain there.++First time for me, the note about large files made me think that maybe annex operated on files above a certain size.+"""]]
@@ -0,0 +1,45 @@+[[!inline raw=yes pages="summary"]]++[[!sidebar content="""+[[!inline feeds=no template=bare pages=sidebar]]++[[Feeds]]:++<small>+[[!inline pages="internal(feeds/*)" archive=yes show=8 feeds=no]]+</small>+"""]]++<table>+<tr>+<td width="33%" valign="top">[[!inline feeds=no template=bare pages=links/key_concepts]]</td>+<td width="33%" valign="top">[[!inline feeds=no template=bare pages=links/the_details]]</td>+<td width="33%" valign="top">[[!inline feeds=no template=bare pages=links/other_stuff]]</td>+</tr>+</table>++<table>+<tr>+<td width="50%" valign="top">[[!inline feeds=no template=bare pages=use_case/bob]]</td>+<td width="50%" valign="top">[[!inline feeds=no template=bare pages=use_case/alice]]</td>+</tr>+</table>++If that describes you, or if you're some from column A and some from column+B, then git-annex may be the tool you've been looking for to expand from+keeping all your small important files in git, to managing your large+files with git.++<table>+<tr>+<td width="50%" valign="top">[[!inline feeds=no template=bare pages=footer/column_a]]</td>+<td widtd="50%" valign="top">[[!inline feeds=no template=bare pages=footer/column_b]]</td>+</tr>+</table>++----++git-annex is [[Free Software|license]]++git-annex's wiki is powered by [Ikiwiki](http://ikiwiki.info/) and+hosted by [Branchable](http://branchable.com/).
@@ -0,0 +1,31 @@+## Pick your OS++[[!table format=dsv header=yes data="""+detailed instructions | quick install+[[OSX]] | [download git-annex.app](http://downloads.kitenet.net/git-annex/OSX/current/)+[[Android]] | [download git-annex.apk](http://downloads.kitenet.net/git-annex/android/current/) **beta**+[[Linux|linux_standalone]] | [download prebuilt linux tarball](http://downloads.kitenet.net/git-annex/linux/current/)+ [[Debian]] | `apt-get install git-annex`+ [[Ubuntu]] | `apt-get install git-annex`+ [[Fedora]] | `yum install git-annex`+ [[FreeBSD]] | `pkg_add -r hs-git-annex`+ [[ArchLinux]] | `yaourt -Sy git-annex`+ [[NixOS]] | `nix-env -i git-annex`+ [[Gentoo]] | `emerge git-annex`+ [[ScientificLinux5]] |+ [[openSUSE]] | +[[Windows]] | [download installer](http://downloads.kitenet.net/git-annex/windows/current/) **alpha**+"""]]++## Using cabal++As a haskell package, git-annex can be installed from source pretty easily+[[using cabal|cabal]].++## Installation from scratch++This is not recommended, but if you really want to, see [[fromscratch]].++## See also++[[autobuild overview|builds]]
@@ -0,0 +1,32 @@+Now git-annex can be used on Android!++[[Documentation for using git-annex on Android|/android]]++## Android app++First, ensure your Android device is configured to allow installation+of the app. Go to Setup -> Security, and enable "Unknown Sources".++[Download the git-annex.apk](http://downloads.kitenet.net/git-annex/android/current/)+onto your Android device, and open it to install.++## autobuilds++A daily build is also available, thanks to Mesar Hameed and the University+of Bath CS department.++* [download apk](http://downloads.kitenet.net/git-annex/autobuild/android/git-annex.apk) ([build logs](http://downloads.kitenet.net/git-annex/autobuild/android/))++## building it yourself++git-annex can be built from source for Android.++1. Run `standalone/android/buildchroot` as root (requires debootstrap).+ This builds a chroot with an `androidbuilder` user.+ The rest of the build will run in this chroot as that user.+2. Then run `standalone/android/install-haskell-packages`+ Note that this will break from time to time as new versions of packages+ are released, and the patches it applies have to be updated when+ this happens.+3. Finally, once the chroot is set up, you can build an Android binary+ with `make android`, and `make androidapp` will build the complete APK.
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://id.clacke.se/"+ nickname="clacke"+ subject="+1 F-Droid"+ date="2013-09-24T18:36:48Z"+ content="""+Availability in F-Droid would be really neat. I imagine the unusual build requirements would require some work though.+"""]]
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawmK0703vNSIQsP1mGf-4MAPnsBZiSc6yVo"+ nickname="Emre"+ subject="What am I missing?"+ date="2013-10-15T21:54:07Z"+ content="""+I've setup repositories on both my linux PC & android mini pc and added jabber account on both. They are both at my home network. They detected each other fine. But when it comes to syncing files, there's a message which says \"Unable to download files from your other devices\" with a button for \"add a cloud repository\". I don't need to add a cloud repository since both computers are at the same network? Or am I missing something in the architecture of git-annex that even to sync two local computers in the same LAN, annex would still need an external repo? (and if so, why would that be?)+I'm not really willing to add an external repository as I intend to add large files and I don't want that they are first uploaded using a slow connection & then re-downloaded.+What am I missing?+"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="64.134.31.139"+ subject="comment 12"+ date="2013-10-16T16:05:45Z"+ content="""+To make computers on your network directly communicate, they must be connected together using the user interface. This is normally using the local pairing interface. But local pairing does not yet work on Android. The best you can do to instead on your Android device, add the Linux PC as a ssh server. This will let the Android device send/receive files directly with it over the local network.+"""]]
@@ -0,0 +1,20 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawmK0703vNSIQsP1mGf-4MAPnsBZiSc6yVo"+ nickname="Emre"+ subject="adding ssh server"+ date="2013-10-16T16:37:10Z"+ content="""+Thanks Joey, I will try this direct mode tonight. I'm following git-annex development since your first days, but I just decided to give it a try so bear with me :)++I also have a VPS and I did try yesterday night to add it as a cloud server to make android & linux sync. It also contained git-annex. When I add it from the PC, it appeared in Android but it was not possible to use it somehow. I had to add a new cloud server with exactly the same settings like th PC, which made things complicated to understand for me as to what happens on the server side when both computers try to setup a repository. (the sync didn't work neither)+Maybe I hit a bug here so wanted to share with you.+What I expected is that, +1) Add a VPS/ssh/git-annex cloud option from PC.+2) It shall appear in the Android webapp using the XMPP control channel+3) if the password or private key can't be synced over the XMPP due to security concern, then the Android webapp shall just ask for the password to enable it, nothing more.++2nd thing, when I add this VPS/SSH/Git-annex from the PC, if I do not choose any encryption, it is marked as \"sync enabled\". IF I choose \"shared encryption\" instead, then sync gets disabled and there's nowhere any comment why the sync is disabled. So, by trial and error, I concluded that the sync is not supported in shared encryption remotes?++3rd thing: The remote cloud can be configured for example as \"full backup\" or \"transfer host\". What is not clear is that if I configure it as a \"full backup\" host, then can Android and PC still use it as a \"transfer host\" to sync between themselves? What I would expect is that once I add this cloud vps as a \"full backup\" host, then everybody syncs with it and gets a copy from it if they can't communicate directly themselves. +Hope I did not confuse things much, thanks a lot even if you don't find time to write answers.+"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://josh.easyid.net/"+ ip="208.100.171.144"+ subject="Minimum version of Android?"+ date="2013-06-18T22:05:02Z"+ content="""+Does this require 4.x?+"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="4.152.108.193"+ subject="comment 2"+ date="2013-06-25T17:58:57Z"+ content="""+I have not heard of anyone using older than 4.x with success. In particular, several people reported 2.3 doesn't work.+"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawmhfodZquCI_EEl-f3h7HkROTszlsQL6yA"+ nickname="Joe"+ subject="comment 3"+ date="2013-07-04T15:06:36Z"+ content="""+Is it safe to upgrade by installing a daily build over an existing version? Will that overwrite any settings? +"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="4.154.4.193"+ subject="comment 4"+ date="2013-07-05T00:53:00Z"+ content="""+It is safe to re-install, all your data and settings are stored in /sdcard and will not be touched, even if you delete the app!+"""]]
@@ -0,0 +1,13 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawnljkMF1zhScDfvJYMhXXubnar_DakLoas"+ nickname="Tony"+ subject="broken under 4.3?"+ date="2013-07-28T00:36:51Z"+ content="""+Things seem broken under the recently released 4.3 release for nexus devices:++>Falling back to hardcoded app location; cannot find expected files in /data/app-lib+>u0_a33@mako:/sdcard/git-annex.home $ git annex webapp+>CANNOT LINK EXECUTABLE: git-annex invalid R_ARM_COPY relocation against DT_SYMBOLIC shared library libc.so (built. with -Bsymbolic?)+>1|u0_a33@mako:/sdcard/git-annex.home $+"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="justjohn"+ ip="71.233.149.123"+ subject="Broken on 4.3 on Nexus 7"+ date="2013-07-28T16:14:18Z"+ content="""+I'm seeing the same error as the previous comment from Tony on my Nexus 7 after I updated it to the stock (albeit rooted) 4.3 release from Google.+"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U"+ nickname="Richard"+ subject="comment 7"+ date="2013-07-30T15:02:51Z"+ content="""+@Tony @justjohn: I created a proper bug for this: [[bugs/git-annex_broken_on_Android_4.3]]+"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawmrb8I1K5jjNr7ZrLSvgmkeQGjYauPeGJU"+ nickname="Martin"+ subject="comment 8"+ date="2013-08-18T16:44:02Z"+ content="""+Any chance that older versions of Android will be supported in the future?+"""]]
@@ -0,0 +1,11 @@+[[!comment format=mdwn+ username="http://openlifechallenge.wordpress.com/"+ nickname="O"+ subject="Add to F-Droid"+ date="2013-09-08T09:56:38Z"+ content="""+Hi,+Really enjoy this app for Android! Super simple to use but it would be great if you could fix a folder navigator option when choosing location for device repo, right now it does not work. ++Could you also add it to the F-Droid repository?+"""]]
@@ -0,0 +1,19 @@+There is a non-official source package for git-annex in+[AUR](https://aur.archlinux.org/packages.php?ID=44272).++You can then build it yourself or use a wrapper for AUR+such as yaourt:++<pre>+$ yaourt -Sy git-annex+</pre>++----++I'm told the AUR has some dependency problems currently.+If it doesn't work, you can just use cabal:++<pre>+pacman -S git rsync curl wget gpg openssh cabal-install+cabal install git-annex --bindir=$HOME/bin+</pre>
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawlwYMdU0H7P7MMlD0v_BcczO-ZkYHY4zuY"+ nickname="Morris"+ subject="Arch Linux"+ date="2012-10-17T13:21:24Z"+ content="""+For Arch Linux there should be the AUR package [git-annex-bin](https://aur.archlinux.org/packages.php?ID=63503) mentioned, because it's easier to install (no haskell dependencies to be installed) and is based on the prebuild linux binary tarball.+"""]]
@@ -0,0 +1,16 @@+[[!comment format=mdwn+ username="http://olivier.mehani.name/"+ nickname="olivier-mehani"+ subject="Stalling when creating repository in assistant"+ date="2013-09-13T05:09:49Z"+ content="""+I am experiencing a weird issue with any install I've had on this one (and only) ArchLinux machine: all of aur/git-annex 4.20130516-1, aur/git-annex-bin-4.20130909-1, aur/git-annex-standalone-4.20130909-1 and a Cabal install just stall when trying to create the initial Git annex repo in the webapp.++When started, it offers me to create the annex in ~/annex/ or ~/Desktop/annex/, where ~ gets turned into /home/USER when I press “Make repository”, but nothing else happens. This is regardless of if that repo exists when I try to create it or start the webapp.++If I start the webapp from an existing annex (now in ~/annex), it seems to work a bit better, but any other remote (SSH) server that I try to add fails. I just get a fleeting Bootstrap message box when I click “Check this server”, and nothing in the logs of eithr git annex webapp or the ssh logs of the server.++Any idea? Where should I look for more debug information?+.++"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="4.154.2.134"+ subject="comment 3"+ date="2013-09-13T15:35:59Z"+ content="""+Please post a [[bug report|bugs]] and start the webapp with the --debug option.+"""]]
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="http://olivier.mehani.name/"+ nickname="olivier-mehani"+ subject="comment 4"+ date="2013-09-16T01:23:58Z"+ content="""+Done [0]. Not much debug output, unfortunately...++[0] http://git-annex.branchable.com/bugs/Assistant_stalls_when_adding__47__creating_repo_on_ArchLinux/?updated+"""]]
@@ -0,0 +1,16 @@+## Debian testing or unstable++ sudo apt-get install git-annex++## Debian 7.0 "wheezy":++ sudo apt-get install git-annex++Note: This version does not include support for the [[assistant]].+A backport is available with the assistant and other new features.++## Debian 6.0 "squeeze"++Follow the instructions to [enable backports](http://backports.debian.org/Instructions/).++ sudo apt-get -t squeeze-backports install git-annex
@@ -0,0 +1,12 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ nickname="joey"+ subject="comment 10"+ date="2013-05-30T19:42:05Z"+ content="""+As of today, I have backported everything except for haskell-lens, haskell-dav, and haskell-network-protocol-xmpp. The last is the only real blocker (I can build a backport without webdav support..). ++The haskell-network-protocol-xmpp in stable is actually ok, except it needs to be rebuilt against the haskell-gnutls I uploaded today. This fixes a bad segfault bug. I don't know how to handle this situation in backports TBH, and so am stuck waiting for a newer version of haskell-network-protocol-xmpp to reach testing, to get around backport's requirements that the backport version be in testing.++In other words, it'll happen in 2 to 5 weeks, probably..+"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://hands.com/~phil/"+ nickname="hands"+ subject="comment 11"+ date="2013-05-30T19:56:07Z"+ content="""+Fair enough -- that's more positive than I was expecting TBH -- Thanks Joey :-)+"""]]
@@ -0,0 +1,13 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawmF3Klaj8Q0Czfh1F3jaLF6issqeAhmru4"+ nickname="Keith"+ subject="Wheezy Support"+ date="2013-07-05T21:21:39Z"+ content="""+Joey,++What's the status on the wheezy backport. I'm itching to try the assistant.++thanks,+Keith+"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="4.153.254.222"+ subject="comment 13"+ date="2013-07-07T17:21:10Z"+ content="""+I remain stuck where I was stuck previously on the backport. In the meantime, use [[Linux_standalone]] :(+"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="Miles"+ ip="88.175.62.104"+ subject="installed git-annex on debian but cannot find it"+ date="2013-08-19T23:29:24Z"+ content="""+I am an absolute beginner when it comes to linux in debian in particular. I installed git-annex via the root terminal, but now I do not know where to find it. I searched for in the file system but could not locate it. Any help is appreciated.+"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawk_GWOEjK4Sn4hUB6ofFlE3CNeC7tO56J8"+ nickname="John"+ subject="Re: installed git-annex on debian but cannot find it "+ date="2013-08-20T00:50:28Z"+ content="""+@Miles - The command is git annex webapp to bring up the web interface.+"""]]
@@ -0,0 +1,9 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawla7u6eLKNYZ09Z7xwBffqLaXquMQC07fU"+ nickname="Matthias"+ subject="squeeze-backports update?"+ date="2011-08-17T12:34:46Z"+ content="""+Is there going to be an update of git-annex in debian squeeze-backports to a version that supports repository version 3?+Thx+"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://joey.kitenet.net/"+ nickname="joey"+ subject="Re: squeeze-backports update?"+ date="2011-08-17T15:34:29Z"+ content="""+Yes, I uploaded it last night.+"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawkstq9oH1vHXY_VP0nYO9Gg3eKnKerDGRI"+ nickname="Hadi"+ subject="ARM"+ date="2012-07-31T15:13:06Z"+ content="""+is there any package for Debian armhf? I'd love to install git-annex on my raspberry pi+"""]]
@@ -0,0 +1,9 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ subject="comment 4"+ date="2012-07-31T15:41:43Z"+ content="""+Yes, git-annex is available for every Debian architecture which supports Haskell, including all arm ports:++<pre>git-annex | 3.20120629 | wheezy | source, amd64, armel, armhf, i386, kfreebsd-amd64, kfreebsd-i386, mips, mipsel, powerpc, s390, s390x, sparc</pre>+"""]]
@@ -0,0 +1,18 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawk3eiQwrpDGJ3MJb9NWB84m4tzQ6XjVZnY"+ nickname="Allard"+ subject="wheezy support"+ date="2012-11-23T20:47:58Z"+ content="""+Hey Joey,++As a backer, I'd like to see a backport of git annex assistant to wheezy.++It is currently impossible to get this assistant in wheezy without compiling it with cabal.++It would be nice to see it in backports or something :)++Best,++Allard+"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://svend.ciffer.net/"+ ip="2001:4978:f:52e::2"+ subject="comment 6"+ date="2012-11-23T21:38:29Z"+ content="""+The git-annex packages in unstable install on testing (wheezy).+"""]]
@@ -0,0 +1,12 @@+[[!comment format=mdwn+ username="http://mey.vn/"+ ip="46.65.14.106"+ subject="libc6 dep version on amd64"+ date="2013-05-28T15:28:47Z"+ content="""+hi Joey,++i see from the release notes of the 4.20130521 release that the Debian package should now be built with libc6 2.13, which appears to be the case except for the amd64 arch (hence the amd64 package won't install as is on Wheezy on amd64) - is this a build glitch or is 2.14 needed on amd64 (i imagine as a dependency of one of git-annex's deps on that arch)?++thanks!+"""]]
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ nickname="joey"+ subject="comment 8"+ date="2013-05-29T16:23:10Z"+ content="""+@mey.vn, Debian packages of git-annex, as uploaded to the Debian repositories, are built with whatever libc version the Debian autobuilder is running. You cannot, in general, install packages from Debian unstable into stable without upgrading your libc6.++The release notes were not talking about the Debian packages, but about the [[Linux_standalone]] tarballs. Those are built with libc 2.13.+"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://hands.com/~phil/"+ nickname="hands"+ subject="any chance of a wheezy-backports upload?"+ date="2013-05-30T18:43:52Z"+ content="""+I note that the instructions at the top of the page suggest that one can install the unstable version into wheezy, but as mentioned by [mey.vn](#comment-f9811cbd46471d4159d09d814ac9cf15) this is not the case with 4.20130521 (on amd64 at least) because of the libc6 version dependency. That being the case, it would be really nice to see this in wheezy-backports as well, or would that require backporting a huge pile of haskell as well? (in which case I can see why you're not keen).+"""]]
@@ -0,0 +1,39 @@+git-annex is available in recent versions of Fedora. Although it is+not currently a very recent version, it should work ok.+[status](http://koji.fedoraproject.org/koji/packageinfo?packageID=14145)++Should be as simple as: `yum install git-annex`++----++To install the latest version of git-annex on Fedora 18 and later, you can use `cabal`:++<pre>+# Install dependencies+sudo yum install libxml2-devel gnutls-devel libgsasl-devel ghc cabal-install happy alex libidn-devel+# Update the cabal list+cabal update+# Install c2hs, required by dependencies of git-annex, but not automatically installed+cabal install --bindir=$HOME/bin c2hs+# Install git-annex+cabal install --bindir=$HOME/bin git-annex+</pre>++----++Older version? Here's an installation recipe for Fedora 14 through 15.++<pre>+sudo yum install ghc cabal-install+git clone git://git-annex.branchable.com/ git-annex+cd git-annex+git checkout ghc7.0+cabal update+cabal install --only-dependencies+cabal configure+cabal build+cabal install --bindir=$HOME/bin+</pre>++Note: You can't just use `cabal install git-annex`, because Fedora does+not yet ship ghc 7.4.
@@ -0,0 +1,16 @@+[[!comment format=mdwn+ username="http://mebus.myopenid.com/"+ ip="2a01:198:3eb:0:4a5b:39ff:fea4:55b3"+ subject="RPM of version 4.2"+ date="2013-07-30T01:09:54Z"+ content="""+Hi!++Isn't there an rpm package of version 4.2 available for Fedora 17 or 18?++Thanks!++Mebus+++"""]]
@@ -0,0 +1,25 @@+[[!comment format=mdwn+ username="http://mebus.pip.verisignlabs.com/"+ nickname="Bussard"+ subject="comment 2"+ date="2013-07-30T20:41:07Z"+ content="""+When I try to build in from source on Fedora 17, I get this error:++[ 77 of 163] Compiling Utility.DiskFree ( Utility/DiskFree.hs, dist/build/git-annex/git-annex-tmp/Utility/DiskFree.o )+[ 78 of 163] Compiling Utility.Url ( Utility/Url.hs, dist/build/git-annex/git-annex-tmp/Utility/Url.o )++Utility/Url.hs:111:88:+ Couldn't match expected type `Maybe URI' with actual type `URI'+ In the second argument of `fromMaybe', namely+ `(newURI `relativeTo` u)'+ In the expression: fromMaybe newURI (newURI `relativeTo` u)+ In an equation for `newURI_abs':+ newURI_abs = fromMaybe newURI (newURI `relativeTo` u)++Any help?++Mebus+++"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="4.154.0.21"+ subject="comment 3"+ date="2013-07-30T21:25:32Z"+ content="""+Edit Utility/Url.hs and play around with the version in the `MIN_VERSION_network` define. It seems to me that your system needs to build with the #else branch of the #ifdef, despite having a version of the haskell network package older than 2.4.0. It's possible that the haskell network package has been modified by Fedora.+"""]]
@@ -0,0 +1,16 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawkJafmCf-sg9_OM0pynFYM3AO4WCgJiaMI"+ nickname="Michele"+ subject="installing on fc19"+ date="2013-10-18T21:05:56Z"+ content="""+i share my experience in installing from source on fc19, I must admit these are useful only for haskell novices:+should cabal complain about missing libffi.so.5 (as it happened to me), do ++ yum install compat-libffi++and you'll get the missing library (the shipping version with fc19 is libffi.so.6)+also: in order for the git annex to be picked up globally or better to end up in the default path i had to:++ cabal install --global +"""]]
@@ -0,0 +1,15 @@+[[!comment format=mdwn+ username="http://mebus.myopenid.com/"+ ip="2a01:198:3eb:0:4a5b:39ff:fea4:55b3"+ subject="Error on Fedora 19"+ date="2013-10-19T14:57:12Z"+ content="""+On Fedora 19, I am getting this error:++http://pastebin.com/raw.php?i=c9SNjbXV++Mebus++++"""]]
@@ -0,0 +1,12 @@+[[!comment format=mdwn+ username="http://mebus.myopenid.com/"+ ip="2a01:198:3eb:0:4a5b:39ff:fea4:55b3"+ subject="comment 6"+ date="2013-10-19T15:09:34Z"+ content="""+Worked! I forgot to install c2hs.++Mebus+++"""]]
@@ -0,0 +1,2 @@+git-annex is in FreeBSD ports in+[devel/git-annex](http://www.freshports.org/devel/hs-git-annex/)
@@ -0,0 +1,3 @@+Gentoo users can: `emerge git-annex`++A possibly more up-to-date version is in the haskell portage overlay.
@@ -0,0 +1,34 @@+If your Linux distribution does not have git-annex packaged up for you,+you can either build it [[fromscratch]], or you can use a handy+prebuilt tarball of the most recent release.++This tarball should work on most Linux systems. It does not depend+on anything except for glibc.++[download tarball](https://downloads.kitenet.net/git-annex/linux/current/)++To use, just unpack the tarball, `cd git-annex.linux` and run `./runshell`+-- this sets up an environment where you can use `git annex`, as well+as everything else included in the bundle.++Alternatively, you can unpack the tarball, and add the directory to your+`PATH`. This lets you use `git annex`, without overriding your system's+own versions of git, etc.++Warning: This is a last resort. Most Linux users should instead+[[install]] git-annex from their distribution of choice.++## autobuilds++A daily build is also available, thanks to Mesar Hameed and the University+of Bath CS department.++* i386: [download tarball](https://downloads.kitenet.net/git-annex/autobuild/i386/git-annex-standalone-i386.tar.gz) ([build logs](https://downloads.kitenet.net/git-annex/autobuild/i386/))+* amd64: [download tarball](https://downloads.kitenet.net/git-annex/autobuild/amd64/git-annex-standalone-amd64.tar.gz) ([build logs](https://downloads.kitenet.net/git-annex/autobuild/amd64/))++## gitannex-install++Eskild Hustvedt has contributed a+[gitannex-install](https://github.com/zerodogg/scriptbucket/blob/master/gitannex-install)+script to manage keeping up to date with new releases using the standalone+build.
@@ -0,0 +1,6 @@+Users of the [Nix package manager](http://nixos.org/) can install it by running:++ nix-env -i git-annex++The build status of the package within Nix can be seen on the [Hydra Build+Farm](http://hydra.nixos.org/job/nixpkgs/trunk/gitAndTools.gitAnnex).
@@ -0,0 +1,73 @@+## git-annex.app++[[!img /assistant/osx-app.png align=right link=/assistant]]+For easy installation, use the+[beta release of git-annex.app](https://downloads.kitenet.net/git-annex/OSX/current/).++Be sure to select the build matching your version of OSX.++If you want to run the [[git-annex_assistant|/assistant]], just+install the app, look for the icon, and start it up. ++To use git-annex at the command line, you can add+`git-annex.app/Contents/MacOS` to your `PATH`++Alternatively, from the command line you can run+`git-annex.app/Contents/MacOS/runshell`, which makes your shell use all the+programs bundled inside the app, including not just git-annex, but git, and+several more. Handy if you don't otherwise have git installed.++This is still a work in progress. See [[/bugs/OSX_app_issues]] for problem+reports.++## autobuilds++[Jimmy Tang](http://www.sgenomics.org/~jtang/) autobuilds+the app for OSX Lion.++* [autobuild of git-annex.app](http://www.sgenomics.org/~jtang/gitbuilder-git-annex-x00-x86_64-apple-darwin10.8.0-binary/ref/master/git-annex.dmg.bz2) ([build logs](http://www.sgenomics.org/~jtang/gitbuilder-git-annex-x00-x86_64-apple-darwin10.8.0-binary/))+ * [past builds](http://www.sgenomics.org/~jtang/gitbuilder-git-annex-x00-x86_64-apple-darwin10.8.0-binary/sha1/) -- directories are named from the commitid's++[[Joey]] autobuilds the app for Mountain Lion.++* [autobuild of git-annex.app](https://downloads.kitenet.net/git-annex/autobuild/x86_64-apple-mountain-lion/git-annex.dmg.bz2) ([build logs](https://downloads.kitenet.net/git-annex/autobuild/x86_64-apple-mountain-lion/))++## using Brew++<pre>+brew update+brew install haskell-platform git ossp-uuid md5sha1sum coreutils libgsasl gnutls libidn libgsasl pkg-config libxml2+brew link libxml2 --force+cabal update+mkdir $HOME/bin+PATH=$HOME/bin:$PATH+PATH=$HOME/.cabal/bin:$PATH+cabal install c2hs --bindir=$HOME/bin+cabal install gnuidn+cabal install git-annex --bindir=$HOME/bin+</pre>++## using MacPorts++Install the Haskell Platform from [[http://hackage.haskell.org/platform/mac.html]].+The version provided by Macports is too old to work with current versions of git-annex.+Then execute++<pre>+sudo port install git-core ossp-uuid md5sha1sum coreutils gnutls libxml2 libgsasl pkgconfig+sudo cabal update+PATH=$HOME/bin:$PATH+cabal install c2hs git-annex --bindir=$HOME/bin+</pre>++## PATH setup++Do not forget to add to your PATH variable your ~/bin folder. In your .bashrc, for example:+<pre>+PATH=$HOME/bin:$PATH+</pre>++See also:++* [[forum/OSX__39__s_haskell-platform_statically_links_things]]+* [[forum/OSX__39__s_default_sshd_behaviour_has_limited_paths_set]]
@@ -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,8 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawnEgT3Gxm4AAK4zu3ft5-PsUmY6dr1F-gE"+ nickname="David"+ subject="OSX app bundle"+ date="2013-06-05T17:35:49Z"+ content="""+I'm using the annex assistant from the annex bundle for the convenience, but sometimes I use git-annex directly from the command line. I have /Applications/git-annex.app/Contents/MacOS/ in my path, but is there any way you could build the app bundle with the manpage in there so I could add it to my MANPATH? +"""]]
@@ -0,0 +1,11 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawmJdzisfT6DhorwRz0kKJ_9-zQbccCopu4"+ nickname="Alejandro"+ subject="Macports _iconv"+ date="2013-07-18T14:23:02Z"+ content="""+If you get an error like `undefined symbol _iconv for x86_64`, you're most likely using libiconv installed by macports. You can fix this by running++ cabal install c2hs git-annex --bindir=$HOME/bin --extra-lib-dirs=/usr/lib++"""]]
@@ -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,24 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawnyMzZZLS1xGW1raqc_9Md6Ksdkvx5rUJU"+ nickname="Michael"+ subject="confusion with bundled programs"+ date="2013-10-02T21:39:11Z"+ content="""+I have fiddled with the fresh (as of Oct 2nd) build of assistant on OS X 10.8.5, and there has been a lot of problems with bundled software++bundled git is an old 1.7.x version which keeps saying in the daemon logs it is too old to honor .gitignores etc+at the same time I have git 1.8.4 installed through homebrew which works very nicely throughout my system++I also have homebrew-installed gpg2:++$ gpg2 --version+gpg (GnuPG) 2.0.21+libgcrypt 1.5.3++(and have briefly experimented with using GPGSuite from gpgtools.org, which kept bailing with invalid autolocate directive in gpg.conf)++however there is some unidentifiable gpg binary bundled with the assistant, which cannot connect to gpg-agent from gpg2, and doesn't work with GPGSuite (see above)++is there a way to completely forgo usage of bundled software and have the webapp use whatever is already available on the system?++"""]]
@@ -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/"+ subject="comment 2"+ date="2012-07-24T15:09:29Z"+ content="""+I've moved some outdated comments about installing on OSX to [[old_comments]].+And also moved away some comments that helped build the instructions above.+"""]]
@@ -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 certianly 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,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,18 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawnaYy6kTuKAHmsa4BtGls2oqa42Jo2w2v0"+ nickname="Pere"+ subject="Snow Leopard"+ date="2013-01-18T15:51:48Z"+ content="""+Hi,++Are there plans to provide a git-annex.app that works on Snow Leopard? ++Currently there are only installers for the Lions.++http://downloads.kitenet.net/git-annex/OSX/current/++Thanks :-)+++"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawkSq2FDpK2n66QRUxtqqdbyDuwgbQmUWus"+ nickname="Jimmy"+ subject="comment 4"+ date="2012-12-10T17:00:43Z"+ content="""+For those that care, I've updated my autobuilder to the latest version of haskell-platform 2012.4.0.0 and it appears to be building correctly.+"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="4.154.3.194"+ subject="comment 5"+ date="2013-01-18T17:25:36Z"+ content="""+What we need to provide a Snow Leopard or other version build, is access to a box running that version of OSX, or someone with a box that doesn't mind compiling stuff and setting up the autobuilder (not very hard).+"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawnaYy6kTuKAHmsa4BtGls2oqa42Jo2w2v0"+ nickname="Pere"+ subject="Snow Leopard"+ date="2013-01-18T17:57:40Z"+ content="""+If the process is very automatic I might contribute. I mean, if you tell me, install this and that package and run this script once a week, I might be able to help. I have a MacBook from 2007 with Snow Leopard. I also have macports installed, but I'm not a programmer.+"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="4.154.3.194"+ subject="comment 7"+ date="2013-01-18T20:16:52Z"+ content="""+If you can get it to build using the instructions for Brew (or MacPorts) on this page, it's easy to get from there to a distributable app.+"""]]
@@ -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.+"""]]
@@ -0,0 +1,1 @@+Moved a bunch of outdated comments here, AFAIK all these issues are fixed.
@@ -0,0 +1,62 @@+For SL6/CentOS6 install the EPEL repo and yum install git-annex. ++I was waiting for my backups to be done hence this article, as I was using+_git-annex_ to manage my files and I decided I needed to have+git-annex on a SL5 based machine. SL5 is just an opensource+clone/recompile of RHEL5.++I haven't tried to install the newer versions of Haskell Platform and+GHC in a while on SL5 to install git-annex. But the last time I checked+when GHC7 was out, it was a pain to install GHC on SL5.++However I have discovered that someone has gone through the trouble of+packaging up GHC and Haskell Platform for RHEL based distros.++* <http://justhub.org/download> - Packaged GHC and Haskell Platform+ RPM's for RHEL based systems.++I'm primarily interested in installing _git-annex_ on SL5 based+systems. The installation process goes as such...++First install GHC and Haskell Platform (you need root for these+following steps)++ $ wget http://sherkin.justhub.org/el5/RPMS/x86_64/justhub-release-2.0-4.0.el5.x86_64.rpm+ $ rpm -ivh justhub-release-2.0-4.0.el5.x86_64.rpm+ $ yum install haskell++The RPM's don't place the files in /usr/bin, so you must add the+following to your .bashrc (from here on you don't need root if you+don't want things to be system wide)++ $ export PATH=/usr/hs/bin:$PATH++Once the packages are installed and are in your execution path, using+cabal to configure and build git-annex just makes life easier, it+should install all the needed dependancies.++ $ cabal update+ $ git clone git://git.kitenet.net/git-annex+ $ cd git-annex+ $ make git-annex.1+ $ cabal configure+ $ cabal build+ $ cabal install++Or if you want to install it globallly for everyone (otherwise it will+get installed into $HOME/.cabal/bin)++ $ cabal install --global++The above will take a while to compile and install the needed+dependancies. I would suggest any user who does should run the tests+that comes with git-annex to make sure everything is functioning as+expected.++I haven't had a chance or need to install git-annex on a SL6 based+system yet, but I would assume something similar to the above steps+would be required to do so.++The above is almost a cut and paste of <http://jcftang.github.com/2012/06/15/installing-git-annex-on-sl5/>, the above could probably be refined, it was what worked for me on SL5. Please feel free to re-edit and chop out or add useless bits of text in the above!++Note: from the minor testing, it appears the compiled binaries from SL5 will work on SL6.
@@ -0,0 +1,29 @@+## Saucy, Raring++ sudo apt-get install git-annex++## Precise++ sudo apt-get install git-annex++Note: This version is too old to include the [[assistant]] or its WebApp,+but is otherwise usable.++## Precise PPA++<https://launchpad.net/~fmarier/+archive/git-annex>++A newer version of git-annex, including the [[assistant]] and WebApp.+(Maintained by François Marier)++ sudo add-apt-repository ppa:fmarier/git-annex+ sudo apt-get update+ sudo apt-get install git-annex++## Oneiric++ sudo apt-get install git-annex++Warning: The version of git-annex shipped in Ubuntu Oneiric+had [a bug that prevents upgrades from v1 git-annex repositories](https://bugs.launchpad.net/ubuntu/+source/git-annex/+bug/875958).+If you need to upgrade such a repository, get a newer version of git-annex.
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawkdiXn5s1wX2Zncy1S7_h-yPTv2gt0bmmY"+ nickname="Jacob"+ subject="comment 10"+ date="2013-10-16T11:43:36Z"+ content="""+would be great to get the PPA updated with the latest git-annex; i'm finding synchronisation bugs (ie. updates made to word documents aren't replicated), and discovered its rather old now.+"""]]
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="fmarier"+ ip="207.134.53.206"+ subject="Re: comment 10"+ date="2013-10-16T13:43:37Z"+ content="""+Jacob: make sure you have the right URL for the PPA: https://launchpad.net/~fmarier/+archive/git-annex++It used to be in my main PPA, now it's in a separate PPA by itself. The package was removed from the original PPA (hence it won't update) but is fully up to date in the new one.+"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawkx5V3MTbzCXS3J7Mn9FEq8M9bPPYMkAHY"+ nickname="Pedro"+ subject="comment 1"+ date="2013-05-20T15:53:25Z"+ content="""+Note that the fmarier ppa includes more than just git-annex. I've asked the author if he could segregate git-annex into a separate ppa.+"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawlQ7ZdQxAps4v0cl5J3wKGWD8243Gy8-m0"+ nickname="Phil"+ subject="PPA Package Pinning"+ date="2013-05-23T21:18:14Z"+ content="""+@Pedro, see <http://askubuntu.com/a/170265> for blocking all packages except git-annex from François's repo.+"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="https://openid.fmarier.org/"+ nickname="fmarier"+ subject="New PPA only contains git-annex"+ date="2013-06-15T07:45:13Z"+ content="""+As Pedro suggested, I've moved my git-annex backport to a separate PPA with only git-annex and the 220 Haskell packages it depends on.+"""]]
@@ -0,0 +1,12 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawmhGq_ii5HaDkp9nx2m9qIMe-xxI4HV5wo"+ nickname="Jeff"+ subject="Packages way out of date"+ date="2013-07-27T19:02:38Z"+ content="""+I'm setting up git-annex for myself (wanting to use the assistant to build myself a replacement for dropbox/box/ownCloud, etc.) and I installed the ubuntu package. Unfortunately, it is way out of date (3.20120406: amd64 i386). I didn't think to check the version. It's deceiving as the UI's are all the same, but it doesn't seem to work at all (syncing fails to remote servers, odd things happen with symlinking files to git object files, changing file permissions). ++It gives a bad first intro into git-annex on ubuntu (*nix?) machines. It might be best just to point people at the cabal install for now so we get the lastest and greatest.++Anyway, thanks for the great tool, I'm looking forward to using it.+"""]]
@@ -0,0 +1,11 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="4.152.246.110"+ subject="comment 5"+ date="2013-07-27T20:12:33Z"+ content="""+Jeff, AFAIK the 3.20120406 in precise does not include the assistant at all. The Precise PPA is well up-to-date. +I don't think git-annex has anyone in Ubuntu updating the package, so it's whatever version is synced periodically from Debian.++(AFAICS, all the problems Jeff had were due to manually creating an indirect mode repository when he expected direct mode.)+"""]]
@@ -0,0 +1,14 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawmhGq_ii5HaDkp9nx2m9qIMe-xxI4HV5wo"+ nickname="Jeff"+ subject="comment 6"+ date="2013-07-27T21:51:11Z"+ content="""+Ah, does it only have the webapp? I was able to boot the webapp and see messages, and it looked mostly the same, I assumed it was broken since no syncing was happening, but that would be due to the assistant not being there.++I guess it's hard as a new user that goes straight for the easy/out-of-the box solution, via the assistant, after watching your video on it. I just assumed things were broken since I was seeing slightly different things. I didn't understand that the assistant was separate from the webapp (and was missing).++Maybe mentioning the minimum required version on the assistant page to at least prompt users to check the version they're getting? I assumed following the link to the install guide, and installing the package for Ubuntu, would give me what I needed.+++"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawmhGq_ii5HaDkp9nx2m9qIMe-xxI4HV5wo"+ nickname="Jeff"+ subject="comment 7"+ date="2013-07-27T21:53:45Z"+ content="""+I see how I missed this page too. I just saw the `apt-get install git-annex` and didn't even register Ubuntu as a link with more information.+"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="4.152.246.110"+ subject="comment 8"+ date="2013-07-27T21:53:57Z"+ content="""+The webapp is part of the assistant. I was told Precise didn't have it, but IIRC they were working on fixing that build, and perhaps that has happened now.+"""]]
@@ -0,0 +1,11 @@+[[!comment format=mdwn+ username="https://openid.stackexchange.com/user/2eeca722-8d1c-41fe-8fda-13af7eaff6ae"+ nickname="Diggory"+ subject="Outdated in 13.04"+ date="2013-10-08T16:36:10Z"+ content="""+13.04 Raring also has fairly outdated packages: 3.20121112ubuntu4+Is there a PPA or some such for this? I suppose since Saucy will be out soon this is less critical, but would still be useful.++These don't have direct mode, which (I think; I haven't tested it yet) is the feature I've been waiting for.+"""]]
@@ -0,0 +1,34 @@+git-annex has recently been ported to Windows!++* First, [install git](http://git-scm.com/downloads)+* Then, [install git-annex](https://downloads.kitenet.net/git-annex/windows/current/)++This port is in an early state. While it works well enough to use+git-annex, many things will not work. See [[todo/windows_support]] for+current status. Note especially that git-annex always uses [[direct_mode]]+on Windows.++The autobuilder is not currently able to run the test suite, so+testing git-annex on Windows is up to you! To check that the build of+git-annex works in your Windows system, you are encouraged to run the test+suite before using git-annex on real data. After installation, run `git+annex test`. There will be a lot of output; the important thing is that it+should end with "All tests ok".++## autobuilds++A daily build is also available, thanks to Yury V. Zaytsev and+[NEST](http://nest-initiative.org/).++* [download](https://qa.nest-initiative.org/view/msysGit/job/msysgit-git-annex-assistant-test/lastSuccessfulBuild/artifact/git-annex/git-annex-installer.exe) ([build logs](https://qa.nest-initiative.org/view/msysGit/job/msysgit-git-annex-assistant-test/))++## building it yourself++To build git-annex from source on Windows, you need to install+the Haskell Platform, Mingw, and Cygwin. Use Cygwin to install+gcc, rsync, git, wget, ssh, and gnupg. To build the git-annex installer,+you also need to install the NulSoft installer system.++There is a shell script `standalone/windows/build.sh` that can be+used to build git-annex. Note that this shell script cannot be run+in Cygwin; run it with the Mingw sh.
@@ -0,0 +1,52 @@+As a haskell package, git-annex can be installed using cabal. ++This involves building a lot of haskell packages from source, and so it has+a lot of moving parts, and it's not uncommon for it to be broken from time+to time.++If you are not comfortable tracking down and dealing with library build+problems, installing git-annex with cabal is probably not the right choice+for you!++## prerequisites++Start by installing the [Haskell Platform][]. In Debian, this is as+simple as:++ sudo apt-get install haskell-platform++ [Haskell Platform]: http://hackage.haskell.org/platform/++## minimal build++This builds git-annex without some features that require C libraries, that+can be harder to get installed. This is plenty to get started using it,+although it does not include the assistant or webapp.++ cabal update+ PATH=$HOME/bin:$PATH+ cabal install git-annex --bindir=$HOME/bin -f"-assistant -webapp -webdav -pairing -xmpp -dns"++## full build++To build with all features enabled, including the assistant and webapp,+you will need to install several C libraries and their headers,+including libgnutls, libgsasl, libxml2, and zlib. Then run:++ cabal update+ PATH=$HOME/bin:$PATH+ cabal install c2hs --bindir=$HOME/bin+ cabal install git-annex --bindir=$HOME/bin++## building from git checkout++But maybe you want something newer (or older). Then [[download]] the version+you want, and use cabal as follows inside its source tree:++ cabal update+ PATH=$HOME/bin:$PATH+ cabal install c2hs --bindir=$HOME/bin+ cabal install --only-dependencies+ cabal configure+ cabal build+ cabal install --bindir=$HOME/bin
@@ -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,18 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawlJemqsekZTC5dvc-MAByUWaBvsYE-mFUo"+ nickname="Gábor"+ subject="Cabal dependencies"+ date="2013-05-12T12:52:20Z"+ content="""+After finishing the installation the cabal way, here are the packages I installed. It is possible that there are other packages I installed previously as dependency for other packages.++ $ lsb_release -a+ No LSB modules are available.+ Distributor ID: Ubuntu+ Description: Ubuntu 12.04.2 LTS+ Release: 12.04+ Codename: precise+ + $ apt-get install cabal-install libgnutls28-dev libgsasl7-dev c2hs libghc-libxml-sax-dev zlib1g-dev libghc-zlib-dev+ $ cabal install git-annex --bindir=$HOME/bin+"""]]
@@ -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,17 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawnaH44G3QbxBAYyDwy0PbvL0ls60XoaR3Y"+ nickname="Nigel"+ subject="E: Unable to locate package libghc-libxml-sax-dev"+ date="2013-05-30T15:05:47Z"+ content="""+I get an error from the command as above:+$ sudo apt-get install cabal-install libgnutls28-dev libgsasl7-dev c2hs libghc libxml-sax-dev zlib1g-dev libghc-zlib-dev++$ lsb_release -a+No LSB modules are available.+Distributor ID: Ubuntu+Description: Ubuntu 12.04.2 LTS+Release: 12.04+Codename: precise++"""]]
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ nickname="joey"+ subject="comment 3"+ date="2013-05-30T15:25:29Z"+ content="""+If you're installing git-annex with cabal, there is no need to install any haskell library packages with apt-get. That includes libghc-libxml-sax-dev and libghc-zlib-dev. Without those, the apt-get line may work to install the C libraries needed for cabal to install the haskell libraries. ++However, see the the [[Ubuntu]] page for much easier ways to get git-annex installed.+"""]]
@@ -0,0 +1,14 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawnaH44G3QbxBAYyDwy0PbvL0ls60XoaR3Y"+ nickname="Nigel"+ subject="Re: Comment 3"+ date="2013-05-30T15:48:44Z"+ content="""+@Joey Many thanks.+I am new to Haskell (vaguely looked at it with DARCS) and git-annex.+After installing with apt-get on Ubuntu 12.04 LTS I found webapp was missing, hence have come here.+I am going through the correct steps now, it should be awesome when done.++This seems to be a long build process (still going on my old laptop, much longer than apt-get).+Ubuntu git-annex packages from 13.10 Saucy I think are updated to include webapp.+"""]]
@@ -0,0 +1,24 @@+[[!comment format=txt+ username="https://www.google.com/accounts/o8/id?id=AItOawnaH44G3QbxBAYyDwy0PbvL0ls60XoaR3Y"+ nickname="Nigel"+ subject="Re: Comment 3"+ date="2013-05-30T16:29:12Z"+ content="""+At the end of the build I got these errors:+Registering yesod-static-1.1.2.3...+Installing library in /home/nrb/.cabal/lib/yesod-static-1.1.2.3/ghc-7.4.1+Registering yesod-static-1.1.2.3...+cabal: Error: some packages failed to install:+c2hs-0.16.4 depends on language-c-0.3.2.1 which failed to install.+dbus-0.10.4 depends on libxml-sax-0.7.4 which failed to install.+git-annex-4.20130521.2 depends on libxml-sax-0.7.4 which failed to install.+language-c-0.3.2.1 failed during the configure step. The exception was:+ExitFailure 1+libxml-sax-0.7.4 failed during the configure step. The exception was:+ExitFailure 1+network-protocol-xmpp-0.4.5 depends on libxml-sax-0.7.4 which failed to+install.++One way I could fix this myself is to put together a VM with 13.10 or Debian in it and work inside that.+Or if I can get help to fix my issues here that would be great ;)+"""]]
@@ -0,0 +1,21 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawnaH44G3QbxBAYyDwy0PbvL0ls60XoaR3Y"+ nickname="Nigel"+ subject="Some errors after the build"+ date="2013-05-30T16:38:37Z"+ content="""+ Registering yesod-static-1.1.2.3...+ Installing library in /home/nrb/.cabal/lib/yesod-static-1.1.2.3/ghc-7.4.1+ Registering yesod-static-1.1.2.3...+ cabal: Error: some packages failed to install:+ c2hs-0.16.4 depends on language-c-0.3.2.1 which failed to install.+ dbus-0.10.4 depends on libxml-sax-0.7.4 which failed to install.+ git-annex-4.20130521.2 depends on libxml-sax-0.7.4 which failed to install.+ language-c-0.3.2.1 failed during the configure step. The exception was:+ ExitFailure 1+ libxml-sax-0.7.4 failed during the configure step. The exception was:+ ExitFailure 1+ network-protocol-xmpp-0.4.5 depends on libxml-sax-0.7.4 which failed to+ install.++"""]]
@@ -0,0 +1,22 @@+[[!comment format=mdwn+ username="krig"+ ip="46.194.28.123"+ subject="Could not resolve dependencies for yesod"+ date="2013-06-25T06:14:18Z"+ content="""+I'm having problems installing from cabal, and it seems related to yesod. I found an older discussion on something similar, where a constraint to require a newer version of yesod had been added, but I haven't figured out what was done to solve it.++The problem seems to be that git-annex requires yesod < 1.2, but cabal is unable to install an older version.++ $ cabal install git-annex --bindir=$HOME/bin+ Resolving dependencies...+ cabal: Could not resolve dependencies:+ trying: git-annex-4.20130601+ trying: git-annex-4.20130601:+webapp+ rejecting: yesod-1.2.1.1, 1.2.1, 1.2.0.1, 1.2.0 (conflict:+ git-annex-4.20130601:webapp => yesod(<1.2))+ trying: yesod-1.1.9.3+ $++From what I can tell, the problem is fixed in github master since yesod >= 1.2 is supported again.+"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="4.152.108.193"+ subject="comment 8"+ date="2013-06-25T17:16:46Z"+ content="""+git-annex 4.20130621 once again builds with the current version of yesod.+"""]]
@@ -0,0 +1,12 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawl7dGdYtCHb7xleEOp6n8yaUQ4UtaiAEEs"+ nickname="Henning"+ subject="libxml-sax Error on OS X fresh install"+ date="2013-07-27T13:11:23Z"+ content="""+I had - maybe the same problem as Nigel - with ExitFailure 1 libxml-sax-0.7.4 .++I could fix this by forcing the link of libxml2 package with \"brew link libxml2 --force\". Maybe you should update your guide. I had this problem on 2 different machines running both the current versions of OS X.++After this the build finished successfull. Maybe this helps.+"""]]
@@ -0,0 +1,72 @@+To install git-annex from scratch, you need a lot of stuff. Really+quite a lot.++* Haskell stuff+ * [The Haskell Platform](http://haskell.org/platform/) (GHC 7.4 or newer)+ * [mtl](http://hackage.haskell.org.package/mtl) (2.1.1 or newer)+ * [MissingH](http://github.com/jgoerzen/missingh/wiki)+ * [utf8-string](http://hackage.haskell.org/package/utf8-string)+ * [SHA](http://hackage.haskell.org/package/SHA)+ * [cryptohash](http://hackage.haskell.org/package/cryptohash) (optional but recommended)+ * [dataenc](http://hackage.haskell.org/package/dataenc)+ * [monad-control](http://hackage.haskell.org/package/monad-control)+ * [QuickCheck 2](http://hackage.haskell.org/package/QuickCheck)+ * [json](http://hackage.haskell.org/package/json)+ * [aeson](http://hackage.haskell.org/package/aeson)+ * [IfElse](http://hackage.haskell.org/package/IfElse)+ * [dlist](http://hackage.haskell.org/package/dlist)+ * [bloomfilter](http://hackage.haskell.org/package/bloomfilter)+ * [edit-distance](http://hackage.haskell.org/package/edit-distance)+ * [hS3](http://hackage.haskell.org/package/hS3) (optional)+ * [DAV](http://hackage.haskell.org/package/DAV) (optional)+ * [SafeSemaphore](http://hackage.haskell.org/package/SafeSemaphore)+ * [UUID](http://hackage.haskell.org/package/uuid)+ * [regex-tdfa](http://hackage.haskell.org/package/regex-tdfa)+ * [extensible-exceptions](http://hackage.haskell.org/package/extensible-exceptions)+ * [feed](http://hackage.haskell.org/package/feed)+* Optional haskell stuff, used by the [[assistant]] and its webapp+ * [stm](http://hackage.haskell.org/package/stm)+ (version 2.3 or newer)+ * [hinotify](http://hackage.haskell.org/package/hinotify)+ (Linux only)+ * [dbus](http://hackage.haskell.org/package/dbus)+ * [yesod](http://hackage.haskell.org/package/yesod)+ * [yesod-static](http://hackage.haskell.org/package/yesod-static)+ * [yesod-default](http://hackage.haskell.org/package/yesod-default)+ * [data-default](http://hackage.haskell.org/package/data-default)+ * [case-insensitive](http://hackage.haskell.org/package/case-insensitive)+ * [http-types](http://hackage.haskell.org/package/http-types)+ * [wai](http://hackage.haskell.org/package/wai)+ * [wai-logger](http://hackage.haskell.org/package/wai-logger)+ * [warp](http://hackage.haskell.org/package/warp)+ * [blaze-builder](http://hackage.haskell.org/package/blaze-builder)+ * [crypto-api](http://hackage.haskell.org/package/crypto-api)+ * [hamlet](http://hackage.haskell.org/package/hamlet)+ * [clientsession](http://hackage.haskell.org/package/clientsession)+ * [network-multicast](http://hackage.haskell.org/package/network-multicast)+ * [network-info](http://hackage.haskell.org/package/network-info)+ * [network-protocol-xmpp](http://hackage.haskell.org/package/network-protocol-xmpp)+ * [dns](http://hackage.haskell.org/package/dns)+ * [xml-types](http://hackage.haskell.org/package/xml-types)+ * [async](http://hackage.haskell.org/package/async)+ * [HTTP](http://hackage.haskell.org/package/HTTP)+ * [unix-compat](http://hackage.haskell.org/package/unix-compat)+ * [MonadCatchIO-transformers](http://hackage.haskell.org/package/MonadCatchIO-transformers)+* Shell commands+ * [git](http://git-scm.com/)+ * [xargs](http://savannah.gnu.org/projects/findutils/)+ * [rsync](http://rsync.samba.org/)+ * [curl](http://http://curl.haxx.se/) (optional, but recommended)+ * [wget](http://www.gnu.org/software/wget/) (optional)+ * [sha1sum](ftp://ftp.gnu.org/gnu/coreutils/) (optional, but recommended;+ a sha1 command will also do)+ * [gpg](http://gnupg.org/) (optional; needed for encryption)+ * [lsof](ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/)+ (optional; recommended for watch mode)+ * [gcrypt](https://github.com/joeyh/git-remote-gcrypt)+ (optional)+ * multicast DNS support, provided on linux by [nss-mdns](http://www.0pointer.de/lennart/projects/nss-mdns/)+ (optional; recommended for the assistant to support pairing well)+ * [ikiwiki](http://ikiwiki.info) (optional; used to build the docs)++Then just [[download]] git-annex and run: `make; make install`
@@ -0,0 +1,3 @@+Haskell Platform is now [officially available for openSUSE](http://software.opensuse.org/package/haskell-platform) via 1-Click Install. ++At the time of writing, there are [unofficial packages of git-annex](http://software.opensuse.org/package/git-annex) available for openSUSE. It should also be possible to build it via cabal or from source as described on the [[install]] page.
@@ -0,0 +1,132 @@+In the world of git, we're not scared about internal implementation+details, and sometimes we like to dive in and tweak things by hand. Here's+some documentation to that end.++## `.git/annex/objects/aa/bb/*/*`++This is where locally available file contents are actually stored.+Files added to the annex get a symlink checked into git that points+to the file content.++First there are two levels of directories used for hashing, to prevent+too many things ending up in any one directory.+See [[hashing]] for details.++Each subdirectory has the [[name_of_a_key|key_format]] in one of the+[[key-value_backends|backends]]. The file inside also has the name of the key.+This two-level structure is used because it allows the write bit to be removed+from the subdirectories as well as from the files. That prevents accidentially+deleting or changing the file contents.++In [[direct_mode]], file contents are not stored in here, and instead+are stored directly in the file. However, the same symlinks are still+committed to git, internally.++Also in [[direct_mode]], some additional data is stored in these directories.+`.cache` files contain cached file stats used in detecting when a file has+changed, and `.map` files contain a list of file(s) in the work directory+that contain the key.++## The git-annex branch++This branch is managed by git-annex, with the contents listed below.++The file `.git/annex/index` is a separate git index file it uses+to accumulate changes for the git-annex branch.+Also, `.git/annex/journal/` is used to record changes before they+are added to git.++This branch operates on objects exclusively. No file names will ever+be stored in this branch.++### `uuid.log`++Records the UUIDs of known repositories, and associates them with a+description of the repository. This allows git-annex to display something+more useful than a UUID when it refers to a repository that does not have+a configured git remote pointing at it.++The file format is simply one line per repository, with the uuid followed by a+space and then the description, followed by a timestamp. Example:++ e605dca6-446a-11e0-8b2a-002170d25c55 laptop timestamp=1317929189.157237s+ 26339d22-446b-11e0-9101-002170d25c55 usb disk timestamp=1317929330.769997s++If there are multiple lines for the same uuid, the one with the most recent+timestamp wins. git-annex union merges this and other files.++## `remote.log`++Holds persistent configuration settings for [[special_remotes]] such as+Amazon S3.++The file format is one line per remote, starting with the uuid of the+remote, followed by a space, and then a series of var=value pairs,+each separated by whitespace, and finally a timestamp.++Encrypted special remotes store their encryption key here,+in the "cipher" value. It is base64 encoded, and unless shared [[encryption]]+is used, is encrypted to one or more gpg keys. The first 256 bytes of+the cipher is used as the HMAC SHA1 encryption key, to encrypt filenames+stored on the special remote. The remainder of the cipher is used as a gpg+symmetric encryption key, to encrypt the content of files stored on the special+remote.++## `trust.log`++Records the [[trust]] information for repositories. Does not exist unless+[[trust]] values are configured.++The file format is one line per repository, with the uuid followed by a+space, and then either `1` (trusted), `0` (untrusted), `?` (semi-trusted),+`X` (dead) and finally a timestamp.++Example:++ e605dca6-446a-11e0-8b2a-002170d25c55 1 timestamp=1317929189.157237s+ 26339d22-446b-11e0-9101-002170d25c55 ? timestamp=1317929330.769997s++Repositories not listed are semi-trusted.++## `group.log`++Used to group repositories together.++The file format is one line per repository, with the uuid followed by a space,+and then a space-separated list of groups this repository is part of,+and finally a timestamp.++## `preferred-content.log`++Used to indicate which repositories prefer to contain which file contents.++The file format is one line per repository, with the uuid followed by a space,+then a boolean expression, and finally a timestamp.++Files matching the expression are preferred to be retained in the+repository, while files not matching it are preferred to be stored+somewhere else.++## `aaa/bbb/*.log`++These log files record [[location_tracking]] information+for file contents. Again these are placed in two levels of subdirectories+for hashing. See [[hashing]] for details.++The name of the key is the filename, and the content+consists of a timestamp, either 1 (present) or 0 (not present), and+the UUID of the repository that has or lacks the file content.++Example:++ 1287290776.765152s 1 e605dca6-446a-11e0-8b2a-002170d25c55+ 1287290767.478634s 0 26339d22-446b-11e0-9101-002170d25c55++These files are designed to be auto-merged using git's [[union merge driver|git-union-merge]].+The timestamps allow the most recent information to be identified.++## `aaa/bbb/*.log.web`++These log files record urls used by the+[[web_special_remote|special_remotes/web]]. Their format is similar+to the location tracking files, but with urls rather than UUIDs.
@@ -0,0 +1,30 @@+In both the .git/annex directory and the git-annex branch, two levels of+hash directories are used, to avoid issues with too many files in one+directory.++Two separate hash methods are used. One, the old hash format, is only used+for non-bare git repositories. The other, the new hash format, is used for+bare git repositories, the git-annex branch, and on special remotes as+well.++## new hash format++This uses two directories, each with a three-letter name, such as "f87/4d5"++The directory names come from the md5sum of the [[key|key_format]].++For example:++ echo -n "SHA256E-s0--e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" | md5sum++## old hash format++This uses two directories, each with a two-letter name, such as "pX/1J"++It takes the md5sum of the key, but rather than a string, represents it as 4+32bit words. Only the first word is used. It is converted into a string by the+same mechanism that would be used to encode a normal md5sum value into a+string, but where that would normally encode the bits using the 16 characters+0-9a-f, this instead uses the 32 characters "0123456789zqjxkmvwgpfZQJXKMVWGPF".+The first 2 letters of the resulting string are the first directory, and the+second 2 are the second directory.
@@ -0,0 +1,20 @@+A git-annex key has this format:++ BACKEND-sNNNN-mNNNN--NAME++For example:++ SHA256E-s31390--f50d7ac4c6b9031379986bc362fcefb65f1e52621ce1708d537e740fefc59cc0.mp3++* The backend is one of the [[key-value_backends|backends]], which+ are always upper-cased.+* The name field at the end has a format dependent on the backend. It is+ always the last field, and is prefixed with "--". Unlike other fields,+ it may contain "-" in its content. It should not contain newline characters;+ otherwise nearly anything goes.+* The "-s" field is optional, and is the size of the content in bytes.+* The "-m" field is optional, and is the mtime of the file when it was+ added to git-annex, expressed as seconds from the epoch.+ This is currently only used by the WORM backend.+* Other fields could be added in the future, if needed.+* Fields may appear, in any order (though always before the name field).
@@ -0,0 +1,14 @@+git-annex is Free Software.++The majority of git-annex is licensed under the [[GPL]], version 3 or+higher.++The git-annex webapp is licensed under the [[AGPL]], version 3 or higher.+Note that builds of git-annex that include the webapp may be licensed+under the AGPL as a whole. git-annex built without the webapp does+not include this code, so remains GPLed.++git-annex contains a variety of other code, artwork, etc copyright by+others, under a variety of licences, including the [[LGPL]], BSD,+MIT, and Apache 2.0 licenses. For details, see+[this file](http://source.git-annex.branchable.com/?p=source.git;a=blob_plain;f=debian/copyright;hb=HEAD).
@@ -0,0 +1,7 @@+### key concepts++* [[git-annex man page|git-annex]]+* [[how_it_works]]+* [[special_remotes]]+* [[sync]]+* [[direct_mode]]
@@ -0,0 +1,7 @@+### other stuff++* [[testimonials]]+* [[privacy]]+* [[what git annex is not|not]]+* [[related_software]]+* [[sitemap]]
@@ -0,0 +1,8 @@+### the details++* [[encryption]]+* [[key-value backends|backends]]+* [[bare_repositories]]+* [[internals]]+* [[scalability]]+* [[design]]
@@ -0,0 +1,30 @@+git-annex keeps track of in which repositories it last saw a file's content.+This location tracking information is stored in the git-annex branch.+Repositories record their UUID and the date when they get or drop +a file's content.++This location tracking information is useful if you have multiple+repositories, and not all are always accessible. For example, perhaps one+is on a home file server, and you are away from home. Then git-annex can+tell you what git remote it needs access to in order to get a file:++ # git annex get myfile + get myfile (not available)+ I was unable to access these remotes: home++Another way the location tracking comes in handy is if you put repositories+on removable USB drives, that might be archived away offline in a safe+place. In this sort of case, you probably don't have a git remotes+configured for every USB drive. So git-annex may have to resort to talking+about repository UUIDs. If you have previously used "git annex init"+to attach descriptions to those repositories, it will include their+descriptions to help you with finding them:++ # git annex get myfile+ get myfile (not available)+ Try making some of these repositories available:+ c0a28e06-d7ef-11df-885c-775af44f8882 -- USB archive drive 1+ e1938fee-d95b-11df-96cc-002170d25c55++In certain cases you may want to configure git-annex to [[trust]]+that location tracking information is always correct for a repository.
@@ -0,0 +1,13 @@+Variants of the git-annex logo.++[[logo_small.png]]++[[logo.svg]]++[[logo-old.png]]++[[logo-old_small.png]]++[[logo-old.svg]]++[[logo-old-bw.svg]]
@@ -0,0 +1,5 @@+This wiki contains [[!pagecount pages="*"]] pages.++Broken links:++[[!brokenlinks ]]
@@ -0,0 +1,11 @@+[[!if test="news/*" then="""+This is where announcements of new releases, features, and other news is+posted. git-annex users are recommended to subscribe to this page's RSS+feed.++[[!inline pages="./news/* and !./news/*/* and !*/Discussion" rootpage="news" show="30"]]++"""+else="""+(Please see the changelog.)+"""]]
@@ -0,0 +1,2 @@+[Linux Weekly News](http://lwn.net/) has a nice+[article on git-annex](http://lwn.net/Articles/418337/) in it this week.
@@ -0,0 +1,4 @@+git-annex will be briefly presented at FOSDEM, on Sunday February 4th at 15:40.+[Details](http://fosdem.org/2012/schedule/event/gitannex).++Thanks to Richard Hartmann for making this presentation.
@@ -0,0 +1,27 @@+Thanks to my recent successful git-annex+[crowdfunding campaign](http://campaign.joeyh.name/), $1000 has been set+aside to award others for their contributions to git-annex by+the end of 2013. This is not a lot of money, but I hope that the+reward and recognition will encourage some more people to work on git-annex.++You don't need to know Haskell! You could contribute some interesting and+useful special remote hooks, or write better documentation.++On the other hand, if you have learned Haskell, this might be your first+chance to make some money with it! Some ideas for things to work on that+would be particularly award-worthy:++* Port git-annex to IOS, using [ghc-ios](https://github.com/ghc-ios).+ I don't plan to ever do this myself, but you could make it happen.+* Get the git-annex assistant working in Windows, building on the existing+ port to Windows. Otherwise, this is on my roadmap for February.+* Solve existing [[bugs]] or [[todo]] items. There are more than I can+ keep up with.++The amount of the awards will vary depending on the size of the+contribution. Since this is getting started later than is ideal,+I reserve the right to extend it past the end of the year if I don't get+enough participants.++If you'd like to participate in this program, just email me at+<id@joeyh.name>. --[[Joey]]
@@ -0,0 +1,19 @@+[[!meta title="sharebox: a FUSE filesystem for git-annex"]]++Christophe-Marie Duquesne has just announced +[Sharebox](https://github.com/chmduquesne/sharebox-fs), a FUSE filesystem+relying on git-annex:++<blockquote>+<pre>+What are your goals? +Seamless synchronization "à la dropbox". +Ability to use with big binary files such as mp3/movies. +Entirely decentralized. +Don't use unnecessary space +Keep it simple: avoid special VCS commands and keep a filesystem +interface as much as possible.+</pre>+</blockquote>++While still alpha, this is promising. --[[Joey]]
@@ -0,0 +1,27 @@+git-annex 4.20130827 released with [[!toggle text="these changes"]]+[[!toggleable text="""+ * Youtube support! (And 53 other video hosts). When quvi is installed,+ git-annex addurl automatically uses it to detect when an page is+ a video, and downloads the video file.+ * web special remote: Also support using quvi, for getting files,+ or checking if files exist in the web.+ * unused: Is now a minimum of 30 times faster, and typically many+ more times than that (when a repository has several branches).+ (Thanks, guilhem for the patch.)+ * unused: Fix bugs in two edge cases involving manually staged changes.+ (Thanks, guilhem for the patch.)+ * Android: Fix bug in terminal app that caused it to spin using much+ CPU and battery. This problem was introduced in version 4.20130601.+ * sync, merge: Bug fix: Don't try to merge into master when in a bare repo.+ * import: Add options to control handling of duplicate files:+ --duplicate, --deduplicate, and --clean-duplicates+ * mirror: New command, makes two repositories contain the same set of files.+ * Set --clobber when running wget to ensure resuming works properly.+ * Unescape characters in 'file://...' URIs. (Thanks, guilhem for the patch.)+ * Better error message when trying to use a git remote that has annex.ignore+ set.+ * Fix bug that caused typechanged symlinks to be assumed to be unlocked+ files, so they were added to the annex by the pre-commit hook.+ * Debian: Run the builtin test suite as an autopkgtest.+ * Debian: Recommend ssh-askpass, which ssh will use when the assistant+ is run w/o a tty. Closes: #[719832](http://bugs.debian.org/719832)"""]]
@@ -0,0 +1,36 @@+git-annex 4.20130909 released with [[!toggle text="these changes"]]+[[!toggleable text="""+ * initremote: Syntax change when setting up an encrypted special remote.+ Now use keyid=$KEYID rather than the old encryption=$KEYID+ * forget: New command, causes git-annex branch history to be forgotten+ in a way that will spread to other clones of the repository.+ (As long as they're running this version or newer of git-annex.)+ * forget --drop-dead: Completely removes mentions of repositories that+ have been marked as dead from the git-annex branch.+ * sync, assistant: Force push of the git-annex branch. Necessary+ to ensure it gets pushed to remotes after being rewritten by forget.+ * Added gcrypt support. This combines a fully encrypted git+ repository (using git-remote-gcrypt) with an encrypted git-annex special+ remote.+ * sync: Support syncing with gcrypt remotes.+ * importfeed: Also ignore transient problems with downloading content+ from feeds.+ * Honor core.sharedrepository when receiving and adding files in direct+ mode.+ * enableremote: gpg keys can be removed from those a remote encrypts+ to by passing "keyid-=$KEYID". keyid+= is also provided.+ (Thanks, guilhem for the patch.)+ * Added encryption=pubkey scheme, which encrypts to public keys directly+ rather than the hybrid approach. See documentation for advantages+ and disadvantages, but encryption=hybrid is the recommended scheme still.+ (Thanks, guilhem for the patch.)+ * Fix Feeds display in build flags.+ * Remind user when annex-ignore is set for some remotes, if unable to+ get or drop a file, possibly because it's on an ignored remote.+ * gpg: Force --no-textmode in case the user has it turned on in config.+ * webapp: Improve javascript's handling of longpolling connection+ failures, by reloading the current page in this case.+ Works around chromium behavior where ajax connections to urls+ that were already accessed are denied after navigating back to+ a previous page.+ * Allow building without quvi support."""]]
@@ -0,0 +1,42 @@+News for git-annex 4.20131002:++ The layout of gcrypt repositories has changed, and+ if you created one you must manually upgrade it.+ See /usr/share/doc/git-annex/html/upgrades/gcrypt.html++git-annex 4.20131002 released with [[!toggle text="these changes"]]+[[!toggleable text="""+ * Note that the layout of gcrypt repositories has changed, and+ if you created one you must manually upgrade it.+ See http://git-annex.branchable.com/upgrades/gcrypt/+ * webapp: Support setting up and using encrypted git repositories on+ any ssh server, as well as on rsync.net.+ * git-annex-shell: Added support for operating inside gcrypt repositories.+ * Disable receive.denyNonFastForwards when setting up a gcrypt special+ remote, since gcrypt needs to be able to fast-forward the master branch.+ * import: Preserve top-level directory structure.+ * Use cryptohash rather than SHA for hashing when no external hash program+ is available. This is a significant speedup for SHA256 on OSX, for+ example.+ * Added SKEIN256 and SKEIN512 backends.+ * Android build redone from scratch, many dependencies updated,+ and entire build can now be done using provided scripts.+ * assistant: Clear the list of failed transfers when doing a full transfer+ scan. This prevents repeated retries to download files that are not+ available, or are not referenced by the current git tree.+ * indirect, direct: Better behavior when a file is not owned by+ the user running the conversion.+ * add, import, assistant: Better preserve the mtime of symlinks,+ when when adding content that gets deduplicated.+ * Send a git-annex user-agent when downloading urls.+ Overridable with --user-agent option.+ (Not yet done for S3 or WebDAV due to limitations of libraries used.)+ * webapp: Fixed a bug where when a new remote is added, one file+ may fail to sync to or from it due to the transferrer process not+ yet knowing about the new remote.+ * OSX: Bundled gpg upgraded, now compatible with config files+ written by MacGPG.+ * assistant: More robust inotify handling; avoid crashing if a directory+ cannot be read.+ * Moved list of backends and remote types from status to version+ command."""]]
@@ -0,0 +1,43 @@+git-annex 4.20131024 released with [[!toggle text="these changes"]]+[[!toggleable text="""+ * webapp: Fix bug when adding a remote and git-remote-gcrypt+ is not installed.+ * The assitant can now run scheduled incremental fsck jobs on the local+ repository and remotes. These can be configured using vicfg or with the+ webapp.+ * repair: New command, which can repair damaged git repositories+ (even ones not using git-annex).+ * webapp: When git repository damange is detected, repairs can be+ done using the webapp UI.+ * Automatically and safely detect and recover from dangling+ .git/annex/index.lock files, which would prevent git from+ committing to the git-annex branch, eg after a crash.+ * assistant: Detect stale git lock files at startup time, and remove them.+ * addurl: Better sanitization of generated filenames.+ * Better sanitization of problem characters when generating URL and WORM+ keys.+ * The control socket path passed to ssh needs to be 17 characters+ shorter than the maximum unix domain socket length, because ssh+ appends stuff to it to make a temporary filename. Closes: #[725512](http://bugs.debian.org/725512)+ * status: Fix space leak in local mode, introduced in version 4.20130920.+ * import: Skip .git directories.+ * Remove bogus runshell loop check.+ * addurl: Improve message when adding url with wrong size to existing file.+ * Fixed handling of URL keys that have no recorded size.+ * status: Fix a crash if a temp file went away while its size was+ being checked for status.+ * Deal with git check-attr -z output format change in git 1.8.5.+ * Work around sed output difference that led to version containing a newline+ on OSX.+ * sync: Fix automatic resolution of merge conflicts where one side is an+ annexed file, and the other side is a non-annexed file, or a directory.+ * S3: Try to ensure bucket name is valid for archive.org.+ * assistant: Bug fix: When run in a subdirectory, files from incoming merges+ were wrongly added to that subdirectory, and removed from their original+ locations.+ * Windows: Deal with strange msysgit 1.8.4 behavior of not understanding+ DOS formatted paths for --git-dir and --work-tree.+ * Removed workaround for bug in git 1.8.4r0.+ * Added git-recover-repository command to git-annex source+ (not built by default; this needs to move to someplace else).+ * webapp: Move sidebar to the right hand side of the screen."""]]
@@ -0,0 +1,55 @@+[[!meta title="what git-annex is not"]]++* git-annex is not a backup system. It may be a useful component of an+ [[archival|use_case/bob]] system, or a way to deliver files to a backup+ system. For a backup system that uses git and that git-annex supports+ storing data in, see [[special_remotes/bup]].++* git-annex is not a filesystem or DropBox clone. However, the git-annex+ [[assistant]] is addressing some of the same needs in its own unique ways.+ (There is also a FUSE filesystem built on top of git-annex, called + [ShareBox](https://github.com/chmduquesne/sharebox-fs).)++* git-annex is not unison, but if you're finding unison's checksumming+ too slow, or its strict mirroring of everything to both places too+ limiting, then git-annex could be a useful alternative.++* git-annex is more than just a workaround for git scalability + limitations that might eventually be fixed by efforts like+ [git-bigfiles](http://caca.zoy.org/wiki/git-bigfiles). In particular,+ git-annex's [[location_tracking]] allows having many repositories+ with a partial set of files, that are copied around as desired.++* git-annex is not some flaky script that was quickly thrown together.+ I wrote it in Haskell because I wanted it to be solid and to compile+ down to a binary. And it has a fairly extensive test suite. (Don't be+ fooled by "make test" only showing a few dozen test cases; each test+ involves checking dozens to hundreds of assertions.)++* git-annex is not [git-media](https://github.com/schacon/git-media),+ although they both approach the same problem from a similar direction.+ I only learned of git-media after writing git-annex, but I probably+ would have still written git-annex instead of using it. Currently,+ git-media has the advantage of using git smudge filters rather than+ git-annex's pile of symlinks, and it may be a tighter fit for certain+ situations. It lacks git-annex's support for widely distributed storage,+ using only a single backend data store. It also does not support+ partial checkouts of file contents, like git-annex does.++* git-annex is similarly not [git-fat](https://github.com/jedbrown/git-fat),+ which also uses git smudge filters, and also lacks git-annex' widely+ distributed storage and partial checkouts.++* git-annex is also not [boar](http://code.google.com/p/boar/),+ although it shares many of its goals and characteristics. Boar implements+ its own version control system, rather than simply embracing and+ extending git. And while boar supports distributed clones of a repository,+ it does not support keeping different files in different clones of the+ same repository, which git-annex does, and is an important feature for+ large-scale archiving.++* git-annex is not the [Mercurial largefiles extension](http://mercurial.selenic.com/wiki/LargefilesExtension).+ Although mercurial and git have some of the same problems around large+ files, and both try to solve them in similar ways (standin files using+ mostly hashes of the real content).+
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://bergey.dreamwidth.org/"+ ip="66.80.90.109"+ subject="git-media"+ date="2012-07-14T15:42:05Z"+ content="""+I haven't used git-media, but from the README it looks as though they now support several backends. Might want to update the (very helpful!) comparison.+"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawkurjhi0CRJvgm7QNaZDWS9hitBtavqIpc"+ nickname="Bret"+ subject="Sparkleshare"+ date="2012-09-06T08:09:17Z"+ content="""+How does [sparkleshare](http://sparkleshare.org/) and git-annex (and git-annex assistant) compare? +"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="4.152.108.236"+ subject="comment 3"+ date="2012-09-06T14:50:43Z"+ content="""+My understanding of sparkleshare (I've not used it) is that it uses a regular git repository, so has git's problems with large files and will not support partial checkouts. However, you might want to try it out and see if it works for you.+"""]]
@@ -0,0 +1,51 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawn4bbuawnh-nSo9pAh8irYAcV4MQCcfdHo"+ nickname="Stefan"+ subject="Sparkleshare"+ date="2012-09-15T01:28:05Z"+ content="""+Hi,++I used sparkleshare lately in a project involving 3 computers and 2 people. and for ascii texts and even a few smaller binary things it works ok.++But it does \"to much\" for media. at least at the moment, it just uses git for saving the data. That has a possitive and a negative aspect.++possitive:++1. you have a full history, if you delete a file its not gone for ever, so if you change it, the older version is still recoverable.+2. if you would as example use it from a laptop in a train without internet and you use a git server in the internet for the central server, and would change some files, then you or somebody else would write on the same txt file as example (html or something... latex...) you would be able to merge this files.+3. its not totaly bad for backup, because you can restore old files even if you delete it localy, because it will hold all history+++negative:++1. for bigger data its cracy. if you use it for movies as example, you would in git annex delete some stuff you want not to see anytime again, so you would delete it everywhere. and its really away, not beeing still there in the history+2. git as it is has issues with saving/transfairing very big files, and its slow on even mid-sized files lets say 100 5mb big files it would be slow. because at the moment sparkleshare uses git all this disatvantages are there.+3. as many clients you use lets say a projekt with 10 people, each of them have all files and all the history of this projekt/directory on their pc.+4. you need a central data-store git folder you can use a seperate pc for that or save it on a client, if you use a client for that you have to save the data double on this pc.++(so you see for big files even if git would handle them faster you would waste massivly hard disk space) but again for pdfs a few pictures text files even some office files and stuff <100mb its great and easy to do.+++I try it in a few words, sparkleshare is like dropbox but with file history ( I think dropbox dont have that???) but because git is not designed (yet) for big files it works somewhat ok for < 100mb stuff if you go very much higher > 1GB it will not be optimal.++git annex dont saves the data itself in git but only the locations and the checksums. so its more like a adress book of your data. its a abstraction layer to your data, you can see on as many devises as you want even without no netzwerk internet connection active and only a very small hd see all your 5 Terrabyte of Data you might have, and move around directories sort around them... delete stuff you dont want if you can deside that by the name... and then when you come back to the connection you sync your actions and it does it to the files.++And one big feature like joey said is that you cannot partialy load files from the repos to your device if it has as example only enough space for 1/10 of it.++There is another thing, but because it is \"only\" a abstraction layer, it is theoreticaly easy to implement extentions to save your data on anything not only git repositories...++Sparkleshare will switch to something else than git, maybe but then it will switch to this single protocol and stick to that. because it does not abstract stuff so hard.++btw there is a alternative out there it forces you not to use git as vcs but you have to use a vcs (like git) and you dont have to use the client written in mono but only a smaller python script:++http://www.mayrhofer.eu.org/dvcs-autosync++but the idea behind it is the same except this 2 points ;)+++but many free software developers dont like mono, so the change that it gets more love from more people is not totaly unlikely.+++So way to long post but hope that helps somebody ;)+"""]]
@@ -0,0 +1,14 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawn4bbuawnh-nSo9pAh8irYAcV4MQCcfdHo"+ nickname="Stefan"+ subject="comment 5"+ date="2012-09-15T01:35:06Z"+ content="""+or to make it more simple ;)++sparkleshare is for proejects and maybe backup your documents folder++annex is for managing big binary files that not get modified most of the time and only added/synced or deleted.++hope thats on the point, try to start using it also now, but am a bit blowen away what it all can do and what not... and how to get a good use case, and mixing media-management with backup of home and thinking on solving that all with annex without having it used ever ;)+"""]]
@@ -0,0 +1,13 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawlatTbI0K-qydpeYHl37iseqPNvERcdIMk"+ nickname="Tiago"+ subject="comment 6"+ date="2012-09-27T10:17:18Z"+ content="""+Stefan: \"annex is for managing big binary files that not get modified most of the time and only added/synced or deleted.\"++While this is true, the kickstarter title for assistant was \"Like dropbox\", and dropbox makes it transparent to edit files and they work with the filesystem.+So with assistant, lock/unlock should be automated and transparent to the user. Otherwise it's confusing and not simple at all to use, and at least OSX keeps giving errors because of the way it handles aliases.+So something like sharebox is essential to be included in assistant in my opinion.++"""]]
@@ -0,0 +1,16 @@+[[!comment format=mdwn+ username="l3iggs"+ ip="24.130.145.126"+ subject="comment 7"+ date="2013-02-03T03:57:05Z"+ content="""+hi joey,++i'm excited by your project here but also confused by its direction. the kickstarter page has the header: \"git-annex assistant: Like DropBox, but with your own cloud.\" this page says \"git-annex is not a ... DropBox clone.\" these seem to be in direct opposition.++i'm looking for what is described by the header on your kickstarter page. i assume your backers are looking for the the same thing (a self hosted DropBox). for my use, dropbox is perfect, except for the fact that i have to pay a monthly fee to store my data on someone else's server when i would like to buy my own storage medium and run some open source dropbox clone on my own server.++can you explain more clearly what dropbox features your project lacks (/will lack)? and why where is a difference between your fundraising page and this one?++maybe i'm just confused by the difference between git-annex and git-annex assistant. does git-annex assistant truely aim to be a dropbox clone?+"""]]
@@ -0,0 +1,24 @@+[[!comment format=mdwn+ username="http://edheil.wordpress.com/"+ ip="99.54.57.201"+ subject="comment 8"+ date="2013-02-04T03:17:06Z"+ content="""+It's pretty much exactly what he said:++> git-annex is not a filesystem or DropBox clone. However, the git-annex assistant is addressing some of the same needs in its own unique ways. ++The git-annex assistant is not exactly like DropBox; it's not a drop-in replacement that works exactly the way dropbox works. But as it stands, right now, it can (like Dropbox) run in the background and make sure that all of your files in a special directory are mirrored to another place (a USB drive, or a server to which you have SSH access, or another computer on your home network, or another computer somewhere else which has access to the same USB drive from time to time, or has accesss to the same SSH server or S3 repository or....++It works as is but is still under heavy development and features are being added rapidly. For example, up until a month or two ago, the files in your annex were replaced with softlinks whose content resided in a hidden directory. This caused some problems esp. on OS X where native programs don't handle softlinked files very gracefully. So Joey added an entirely new way of operating called \"direct mode\" which uses ordinary files, much like Dropbox does.++So -- what you should expect from git-annex assistant is a program which solves many of the same problems Dropbox does (keeping a set of files magically in sync across computers) but does it in its own way, which won't be *exactly* like Dropbox; it will be more flexible but might require a little learning to figure out exactly how to use it the way you want. It's possible to get a very Dropbox-like system out of the box, especially now that you don't need to use softlinks, if you've got a place on the network you can use as a central remote repository for your files, or if you only want to synchronize two or more computers on the same local network.++\"git-annex\" itself is the plumbing used by git-annex assistant, or to put it another way, the engine that the assistant has under the hood. Git-annex itself is extremely simple and stable but should only be used by people already familiar with the command line, perhaps even people already familiar with git.++That's my point of view as an enthusiastic user. Joey may have his own perspective to share. :)+++++"""]]
@@ -0,0 +1,197 @@+git-annex tries to ensure that the configured number of [[copies]] of your+data always exist, and leaves it up to you to use commands like `git annex+get` and `git annex drop` to move the content to the repositories you want+to contain it. But sometimes, it can be good to have more fine-grained+control over which repositories prefer to have which content. Configuring+this allows `git annex get --auto`, `git annex drop --auto`, etc to do+smarter things.++Preferred content settings can be edited using `git+annex vicfg`, or viewed and set at the command line with `git annex content`.+Each repository can have its own settings, and other repositories may also+try to honor those settings. So there's no local `.git/config` setting it.++The idea is that you write an expression that files are matched against.+If a file matches, it's preferred to have its content stored in the+repository. If it doesn't, it's preferred to drop its content from+the repository (if there are enough copies elsewhere).++The expressions are very similar to the file matching options documented+on the [[git-annex]] man page. At the command line, you can use those+options in commands like this:++ git annex get --include='*.mp3' --and -'(' --not --largerthan=100mb -')'++The equivilant preferred content expression looks like this:++ include=*.mp3 and (not largerthan=100mb)++So, just remove the dashes, basically. However, there are some differences+from the command line options to keep in mind:++### difference: file matching++While --include and --exclude match files relative to the current+directory, preferred content expressions always match files relative to the+top of the git repository. Perhaps you put files into `archive` directories+when you're done with them. Then you could configure your laptop to prefer+to not retain those files, like this:++ exclude=*/archive/*++### difference: no "in="++Preferred content expressions have no direct equivilant to `--in`.++Often, it's best to add repositories to groups, and match against+the groups in a preferred content expression. So rather than+`--in=usbdrive`, put all the USB drives into a "transfer" group,+and use "copies=transfer:1"++### difference: dropping++To decide if content should be dropped, git-annex evaluates the preferred+content expression under the assumption that the content has *already* been+dropped. If the content would not be preferred then, the drop can be done.+So, for example, `copies=2` in a preferred content expression lets+content be dropped only when there are currently 3 copies of it, including+the repo it's being dropped from. This is different than running `git annex+drop --copies=2`, which will drop files that currently have 2 copies.++### difference: "present"++There's a special "present" keyword you can use in a preferred content+expression. This means that content is preferred if it's present,+and not otherwise. This leaves it up to you to use git-annex manually+to move content around. You can use this to avoid preferred content+settings from affecting a subdirectory. For example:++ auto/* or (include=ad-hoc/* and present)++Note that `not present` is a very bad thing to put in a preferred content +expression. It'll make it prefer to get content that's not present, and+drop content that is present! Don't go there..++### difference: "inpreferreddir"++There's a special "inpreferreddir" keyword you can use in a+preferred content expression of a special remote. This means that the+content is preferred if it's in a directory (located anywhere in the tree)+with a special name.++The name of the directory can be configured using +`git annex enableremote $remote preferreddir=$dirname`++(If no directory name is configured, it uses "public" by default.)++## standard expressions++git-annex comes with some standard preferred content expressions, that can+be used with repositories that are in some pre-defined groups. To make a+repository use one of these, just set its preferred content expression+to "standard", and put it in one of these groups.++(Note that most of these standard expressions also make the repository+prefer any content that is only currently available on untrusted and+dead repositories. So if an untrusted repository gets connected,+any repository that can will back it up.)++### client++All content is preferred, unless it's for a file in a "archive" directory,+which has reached an archive repository.++`((exclude=*/archive/* and exclude=archive/*) or (not (copies=archive:1 or copies=smallarchive:1))) or (not copies=semitrusted+:1)`++### transfer++Use for repositories that are used to transfer data between other+repositories, but do not need to retain data themselves. For+example, a repository on a server, or in the cloud, or a small+USB drive used in a sneakernet.++The preferred content expression for these causes them to get and retain+data until all clients have a copy.++`(not (inallgroup=client and copies=client:2) and ($client)`++The "copies=client:2" part of the above handles the case where+there is only one client repository. It makes a transfer repository+speculatively prefer content in this case, even though it as of yet+has nowhere to transfer it to. Presumably, another client repository+will be added later.++### backup++All content is preferred.++`include=*`++### incremental backup++Only prefers content that's not already backed up to another backup+or incremental backup repository.++`(include=* and (not copies=backup:1) and (not copies=incrementalbackup:1)) or (not copies=semitrusted+:1)`++### small archive++Only prefers content that's located in an "archive" directory, and+only if it's not already been archived somewhere else.++`((include=*/archive/* or include=archive/*) and not (copies=archive:1 or copies=smallarchive:1)) or (not copies=semitrusted+:1)`++### full archive++All content is preferred, unless it's already been archived somewhere else.++`(not (copies=archive:1 or copies=smallarchive:1)) or (not copies=semitrusted+:1)`++Note that if you want to archive multiple copies (not a bad idea!),+you should instead configure all your archive repositories with a+version of the above preferred content expression with a larger+number of copies.++### source++Use for repositories where files are often added, but that do not need to+retain files for local use. For example, a repository on a camera, where+it's desirable to remove photos as soon as they're transferred elsewhere.++The preferred content expression for these causes them to only retain+data until a copy has been sent to some other repository.++`not (copies=1)`++### manual++This gives you nearly full manual control over what content is stored in the+repository. This allows using the [[assistant]] without it trying to keep a+local copy of every file. Instead, you can manually run `git annex get`,+`git annex drop`, etc to manage content. Only content that is present+is preferred.++The exception to this manual control is that content that a client+repository would not want is not preferred. So, files in archive+directories are not preferred once their content has +reached an archive repository.++`present and ($client)`++### public++This is used for publishing information to a repository that can be+publically accessed. Only files in a directory with a particular name+will be published. (The directory can be located anywhere in the+repository.)++The name of the directory can be configured using+`git annex enableremote $remote preferreddir=$dirname`++### unwanted++Use for repositories that you don't want to exist. This will result+in any content on them being moved away to other repositories. (Works+best when the unwanted repository is also marked as untrusted or dead.)++`exclude=*`
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="4.154.4.22"+ subject="comment 10"+ date="2013-10-11T17:12:00Z"+ content="""+Georg, `drop --auto` will only drop files that are not preferred content. I'd need to know what preferred content expression you're using to say more.+"""]]
@@ -0,0 +1,19 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawlgyVag95OnpvSzQofjyX0WjW__MOMKsl0"+ nickname="Sehr"+ subject="Interplay with numcopies"+ date="2012-12-05T20:41:26Z"+ content="""+How does the preferred content settings interfere with the numcopies setting?++I could not get behind it. E.g. a case I do not unterstand:++I have a preferred setting evaluating to true and still ++ git annex get --auto++does nothing, if the number of copies produced would surpass the numcopies setting.+++Thx+"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="4.153.253.113"+ subject="comment 2"+ date="2012-12-06T17:24:29Z"+ content="""+Yeah, that didn't make sense. I've fixed it, so it gets files if needed for either numcopies or preferred content.+"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="4.153.8.117"+ subject="comment 4"+ date="2012-12-10T19:46:01Z"+ content="""+It was a bug in the backup group's preferred content pagespec, introduced by the changes I made to fix the previous problem. Now fixed.+"""]]
@@ -0,0 +1,18 @@+[[!comment format=mdwn+ username="http://edheil.wordpress.com/"+ ip="173.162.44.162"+ subject="comment 4"+ date="2012-12-07T20:24:18Z"+ content="""+Built a new copy of git-annex yesterday. I have a \"client\" on my macbook, and two \"backup\"s, one on an external HD, one on an ssh git remote.++git annex get --auto works beautifully!++It doesn't seem to work for copying content *to* a place where it's needed, though.++If I drop a file from my \"backup\" USB drive, and then go back to my macbook and do a \"git annex sync\" and \"git annex copy --to=usbdrive --auto\" it does not send the file out to the USB drive, even though by preferred content settings, the USB drive should \"want\" the file because it's a backup drive and it wants all content.++Similarly, if I add a new file on my macbook and then do a \"git annex copy --to=usbdrive auto\" it does not get copied to the USB drive.++Is this missing functionality, or should the preferred content setting for remotes only affect the assistant?+"""]]
@@ -0,0 +1,9 @@+[[!comment format=mdwn+ username="http://edheil.wordpress.com/"+ ip="173.162.44.162"+ subject="comment 5"+ date="2012-12-11T16:03:04Z"+ content="""+thanks!++"""]]
@@ -0,0 +1,12 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawmRFKwny4rArBaz-36xTcsJYqKIgdDaw5Q"+ nickname="Andrew"+ subject="comment 6"+ date="2013-01-10T03:00:52Z"+ content="""+Is there a way to change these definitions for a given annex?++ie: in this repo make \"client\" mean++ present and exclude=*/archive/* and exclude=archive/*+"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="4.154.7.238"+ subject="comment 7"+ date="2013-01-10T03:51:38Z"+ content="""+Sorry, there's not. The expressions used for \"standard\" are built in.+"""]]
@@ -0,0 +1,27 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawmRFKwny4rArBaz-36xTcsJYqKIgdDaw5Q"+ nickname="Andrew"+ subject="comment 8"+ date="2013-01-10T10:24:28Z"+ content="""+By way of a feature request: Maybe the way to do this is to have an additional keyword like \"config\" or \"repo\" that allows you to use vicfg and/or git config to set alternative rules and even additional group names.++In git config:++ annex.groups.<groupname> = present and exclude=*/archive/* and exclude=archive/*++in vicfg:++ # (for passport)+ #trust A0637025-ED47-4F95-A887-346121F1B4A0 = semitrusted+ + # (for passport)+ group A0637025-ED47-4F95-A887-346121F1B4A0 = transfer+ + # (for passport)+ preferred-content A0637025-ED47-4F95-A887-346121F1B4A0 = repo+ + # (for transfer)+ group-content transfer = present and exclude=*/archive/* and exclude=archive/*++"""]]
@@ -0,0 +1,13 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawkC0W3ZQERUaTkHoks6k68Tsp1tz510nGo"+ nickname="Georg"+ subject="drop only files located in archive"+ date="2013-10-08T17:53:08Z"+ content="""+Is there a way to drop only the files that are located in an \"archive\" directory?+I want to drop all files when calling++ git annex drop --auto++if I move them to the archive. But I want to keep the files that are outside of the archive, even if they are already present in other repos. As far as I have seen and tested, as soon as I have the files in an other repo all files get dropped, also the ones outside the archive directory. Or do I have to increase \"numcopies\" in order to circumvent the \"(not copies=semitrusted+:1)\" case?+"""]]
@@ -0,0 +1,47 @@+git-annex users entrust it with data that is often intensively private.+Here's some things to know about how to maintain your privacy while using+git-annex.++## browsing this web site++This website supports https. [Use it.](https://git-annex.branchable.com/privacy/)++## repository contents++In general, anyone who can clone a git repository gets the ability to see+all current and past filenames in the repository, and their contents.+It's best to assume this also holds true for git-annex, as a general rule.++There are some obvious exceptions: If you `git annex dropunused` old+content from all your repositories, then it's *gone*. If you `git annex+move` files to a offline drive then only those with physical access can see+their content. (The names of the files are still visible to anyone with a+clone of the repository.)++git-annex can encrypt data stored in special remotes. This allows you to+store files in the cloud without exposing their file names, or their+contents. See [[design/encryption]] for details.++When using the shared enctyption method, the encryption key gets stored+in git, and so anyone who has a clone of your repository can decrypt files+from the encrypted special remote.++When using encryption with a GPG key or keys, only those with access to the+GPG key can decrypt the content of files stored in an encrypted special+remote.++## bug reporting++When you file a [[bug]] report on git-annex, you may need to provide+debugging output or details about your repository. In general, git-annex+does not sanitize `--debug` output at all, so it may include the names of+files or other repository details. You should review any debug or other+output you post, and feel free to remove identifying information.++Note that the git-annex assistant *does* sanitize XMPP protocol information+logged when debugging is enabled.++If you prefer not to post information publically, you can send a GPG+encrypted mail to Joey Hess <id@joeyh.name> (gpg key ID 2512E3C7).+Or you can post a public bug report, and send a followup email with private+details.
@@ -0,0 +1,12 @@+Some folks have built other software on top of git-annex, or that is+designed to interoperate with it.++* The [[git-annex assistant|assistant]] is included in git-annex,+ and extends its use cases into new territory.+* [git-annex-watcher](https://github.com/rubiojr/git-annex-watcher)+ is a status icon for your desktop.+* [[forum/gadu_-_git-annex_disk_usage]] is a du like utility that+ is git-annex aware.+* [sizes](http://hackage.haskell.org/package/sizes) is another du-like+ utility, with a `-A` switch that enables git-annex support.+* Emacs Org mode can auto-commit attached files to git-annex.
@@ -0,0 +1,44 @@+git-annex is designed for scalability. The key points are:++* Arbitrarily large files can be managed. The only constraint+ on file size are how large a file your filesystem can hold.++ While git-annex does checksum files by default, there+ is a [[WORM_backend|backends]] available that avoids the checksumming+ overhead, so you can add new, enormous files, very fast. This also+ allows it to be used on systems with very slow disk IO.++* Memory usage should be constant. This is a "should", because there+ can sometimes be leaks (and this is one of haskell's weak spots),+ but git-annex is designed so that it does not need to hold all+ the details about your repository in memory.++ The one exception is that [[todo/git-annex_unused_eats_memory]],+ because it *does* need to hold the whole repo state in memory. But+ that is still considered a bug, and hoped to be solved one day.+ Luckily, that command is not often used.++* Many files can be managed. The limiting factor is git's own+ limitations in scaling to repositories with a lot of files, and as git+ improves this will improve. Scaling to hundreds of thousands of files+ is not a problem, scaling beyond that and git will start to get slow.++ To some degree, git-annex works around inefficiencies in git; for+ example it batches input sent to certain git commands that are slow+ when run in an enormous repository.++* It can use as much, or as little bandwidth as is available. In+ particular, any interrupted file transfer can be resumed by git-annex.++## scalability tips++* If the files are so big that checksumming becomes a bottleneck, consider+ using the [[WORM_backend|backends]]. You can always `git annex migrate`+ files to a checksumming backend later on.++* If you're adding a huge number of files at once (hundreds of thousands),+ you'll soon notice that git-annex periodically stops and say+ "Recording state in git" while it runs a `git add` command that+ becomes increasingly expensive. Consider adjusting the `annex.queuesize`+ to a higher value, at the expense of it using more memory.+
@@ -0,0 +1,15 @@+[[!img logo_small.png link=no]]++* [[install]]+* [[assistant]]+* [[walkthrough]]+* [[tips]]+* [[bugs]]+* [[todo]]+* [[forum]]+* [[comments]]+* [[contact]]++[crowdfunding campaign underway!](https://campaign.joeyh.name/)++<!-- * <a href="http://flattr.com/thing/84843/git-annex"><img src="https://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" /></a> -->
@@ -0,0 +1,4 @@+[[!map pages="page(*) and !*/discussion and !recentchanges+and !bugs/* and !examples/*/* and !news/* and !tips/* and !videos/*+and !design/assistant/blog/*+and !forum/* and !todo/* and !users/* and !ikiwiki/*"]]
@@ -0,0 +1,63 @@+git-annex can transfer data to and from configured git remotes.+Normally those remotes are normal git repositories (bare and non-bare;+local and remote), that store the file contents in their own git-annex+directory.++But, git-annex also extends git's concept of remotes, with these special+types of remotes. These can be used just like any normal remote by git-annex.+They cannot be used by other git commands though.++* [[S3]] (Amazon S3, and other compatible services)+* [[Amazon_Glacier|glacier]]+* [[bup]]+* [[gcrypt]] (encrypted git repositories!)+* [[directory]]+* [[rsync]]+* [[webdav]]+* [[web]]+* [[xmpp]]+* [[hook]]++The above special remotes can be used to tie git-annex +into many cloud services. ++There are many use cases for a special remote. You could use it as a backup. You could use it to archive files offline in a drive with encryption enabled so if the drive is stolen your data is not. You could git annex move --to specialremote large files when your local drive is getting full, and then git annex move the files back when free space is again available. You could have one repository copy files to a special remote, and then git annex get them on another repository, to transfer the files between computers that do not communicate directly. ++The git-annex assistant makes it easy to set up rsync remotes using this last scenario, which is referred to as a transfer repository, and arranges to drop files from the transfer repository once they have been transferred to all known clients.++None of these use cases are particular to particular special remote types. Most special remotes can all be used in these and other ways. It largely doesn't matter for your use what underlying transport the special remote uses.++Here are specific instructions+for using git-annex with various services:++* [[Amazon_S3|tips/using_Amazon_S3]]+* [[Amazon_Glacier|tips/using_Amazon_Glacier]]+* [[tips/Internet_Archive_via_S3]]+* [[tahoe-lafs|forum/tips:_special__95__remotes__47__hook_with_tahoe-lafs]]+* [[Box.com|tips/using_box.com_as_a_special_remote]]+* [[Google drive|tips/googledriveannex]]+* [[Google Cloud Storage|tips/using_Google_Cloud_Storage]]+* [[Mega.co.nz|tips/megaannex]]+* [[SkyDrive|tips/skydriveannex]]+* [[OwnCloud|tips/owncloudannex]]+* [[Flickr|tips/flickrannex]]+* [[IMAP|forum/special_remote_for_IMAP]]+* [[Usenet|forum/nntp__47__usenet special remote]]+* [chef-vault](https://github.com/3ofcoins/knife-annex/)++## Unused content on special remotes++Over time, special remotes can accumulate file content that is no longer+referred to by files in git. Normally, unused content in the current+repository is found by running `git annex unused`. To detect unused content+on special remotes, instead use `git annex unused --from`. Example:++ $ git annex unused --from mys3+ unused mys3 (checking for unused data...) + Some annexed data on mys3 is not used by any files in this repository.+ NUMBER KEY+ 1 WORM-s3-m1301674316--foo+ (To see where data was previously used, try: git log --stat -S'KEY')+ (To remove unwanted data: git-annex dropunused --from mys3 NUMBER)+ $ git annex dropunused --from mys3 1+ dropunused 12948 (from mys3...) ok
@@ -0,0 +1,53 @@+This special remote type stores file contents in a bucket in Amazon S3+or a similar service.++See [[tips/using_Amazon_S3]] and+[[tips/Internet_Archive_via_S3]] for usage examples.++## configuration++The standard environment variables `AWS_ACCESS_KEY_ID` and +`AWS_SECRET_ACCESS_KEY` are used to supply login credentials+for Amazon. You need to set these only when running+`git annex initremote`, as they will be cached in a file only you+can read inside the local git repository.++A number of parameters can be passed to `git annex initremote` to configure+the S3 remote.++* `encryption` - One of "none", "hybrid", "shared", or "pubkey".+ See [[encryption]].++* `keyid` - Specifies the gpg key to use for [[encryption]].++* `embedcreds` - Optional. Set to "yes" embed the login credentials inside+ the git repository, which allows other clones to also access them. This is+ the default when gpg encryption is enabled; the credentials are stored+ encrypted and only those with the repository's keys can access them.++ It is not the default when using shared encryption, or no encryption.+ Think carefully about who can access your repository before using+ embedcreds without gpg encryption.++* `datacenter` - Defaults to "US". Other values include "EU",+ "us-west-1", and "ap-southeast-1".++* `storageclass` - Default is "STANDARD". If you have configured git-annex+ to preserve multiple [[copies]], consider setting this to "REDUCED_REDUNDANCY"+ to save money.++* `host` and `port` - Specify in order to use a different, S3 compatable+ service.++* `bucket` - S3 requires that buckets have a globally unique name, + so by default, a bucket name is chosen based on the remote name+ and UUID. This can be specified to pick a bucket name.++* `fileprefix` - By default, git-annex places files in a tree rooted at the+ top of the S3 bucket. When this is set, it's prefixed to the filenames+ used. For example, you could set it to "foo/" in one special remote,+ and to "bar/" in another special remote, and both special remotes could+ then use the same bucket.++* `x-amz-*` are passed through as http headers when storing keys+ in S3.
@@ -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,8 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawnoUOqs_lbuWyZBqyU6unHgUduJwDDgiKY"+ nickname="Matt"+ subject="environment variables"+ date="2012-05-29T12:40:25Z"+ content="""+Just noting that the environment variables `ANNEX_S3_ACCESS_KEY_ID` and `ANNEX_S3_SECRET_ACCESS_KEY` seem to have been changed to `AWS_ACCESS_KEY_ID` and `AWS_SECRET_ACCESS_KEY`+"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="4.153.81.112"+ subject="comment 2"+ date="2012-05-29T19:10:46Z"+ content="""+Thanks, I've fixed that. (You could have too.. this is a wiki ;)+"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawnoUOqs_lbuWyZBqyU6unHgUduJwDDgiKY"+ nickname="Matt"+ subject="comment 3"+ date="2012-05-30T00:26:33Z"+ content="""+Thanks! Being new here, I didn't want to overstep my boundaries. I've gone ahead and made a small edit and will do so elsewhere as needed.+"""]]
@@ -0,0 +1,12 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawmX5gPNK35Dub-HzR0Yb3KXllbqc0rYRYs"+ nickname="Eduardo"+ subject="bucket/folder s3 remotes"+ date="2012-08-09T10:52:07Z"+ content="""+it'd be really nice being able to configure a S3 remote of the form `<bucket>/<folder>` (not really a folder, of course, just the usual prefix trick used to simulate folders at S3). The remote = bucket architecture is not scalable at all, in terms of number of repositories.++how hard would it be to support this?++thanks, this is the only thing that's holding us back from using git-annex, nice tool!+"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ subject="comment 5"+ date="2012-08-09T18:01:06Z"+ content="""+I guess this could be useful if you have a *lot* of buckets already in use at S3, or if you want to be able to have a lot of distinct S3 special remotes. Implemented the `fileprefix` setting. Note that I have not tested it, beyond checking it builds, since I let my S3 account expire. Your testing would be appreciated.++"""]]
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawnY9ObrNrQuRp8Xs0XvdtJJssm5cp4NMZA"+ nickname="alan"+ subject="Rackspace Cloud Files support?"+ date="2012-08-23T21:00:11Z"+ content="""+Any chance I could bribe you to setup Rackspace Cloud Files support? We are using them and would hate to have a S3 bucket only for this.++https://github.com/rackspace/python-cloudfiles+"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawmyFvkaewo432ELwtCoecUGou4v3jCP0Pc"+ nickname="Eric"+ subject="S3 Remote Future Proof?"+ date="2013-01-20T09:21:50Z"+ content="""+Joey, I'm curious to understand how future proof an S3 remote is. Can I restore my files without git-annex?+"""]]
@@ -0,0 +1,12 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="68.119.100.5"+ subject="comment 8"+ date="2013-01-20T20:37:09Z"+ content="""+If encryption is not used, the files are stored in S3 as-is, and can be accessed directly. They are stored in a hashed directory structure with the names of their key used, rather than the original filename. To get back to the original filename, a copy of the git repo would also be needed.++With encryption, you need the gpg key used in the encryption, or, for shared encryption, a symmetric key which is stored in the git repo.++See [[future proofing]] for non-S3 specific discussion of this topic.+"""]]
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="basak"+ ip="2001:8b0:1c8::2"+ subject="Recovering from a clone"+ date="2013-05-22T18:32:05Z"+ content="""+How do I recover a special remote from a clone, please? I see that `remote.log` has most of the details, but my remote is not configured on my clone and I see no obvious way to do it. And I used `embedcreds`, but the only credentials I can see are stored in .git/annex/creds/ so did not survive a clone. I'm confused because the documentation here for `embedcreds` says that clones should have access.++As a workaround, it looks like copying the remote over from `.git/config` as well as the credentials from `.git/annex/creds/` seems to work. Is there some other way I'm supposed to do this, or is this the intended way?+"""]]
@@ -0,0 +1,39 @@+This special remote type stores file contents in a +[bup](http://github.com/bup/bup) repository. By using git-annex+in the front-end, and bup as a remote, you get an easy git-style+interface to large files, and easy backups of the file contents using git.++This is particularly well suited to collaboration on projects involving+large files, since both the git-annex and bup repositories can be+accessed like any other git repository.++See [[walkthrough/using_bup]] for usage examples.++Each individual key is stored in a bup remote using `bup split`, with+a git branch named the same as the key name. Content is retrieved from+bup using `bup join`. All other bup operations are up to you -- consider+running `bup fsck --generate` in a cron job to generate recovery blocks,+for example; or clone bup's git repository to further back it up.++## configuration++These parameters can be passed to `git annex initremote` to configure bup:++* `encryption` - One of "none", "hybrid", "shared", or "pubkey".+ See [[encryption]].++* `keyid` - Specifies the gpg key to use for [[encryption]].++* `buprepo` - Required. This is passed to `bup` as the `--remote`+ to use to store data. To create the repository,`bup init` will be run.+ Example: "buprepo=example.com:/big/mybup" or "buprepo=/big/mybup"+ (To use the default `~/.bup` repository on the local host, specify "buprepo=")++Options to pass to `bup split` when sending content to bup can also+be specified, by using `git config annex.bup-split-options`. This+can be used to, for example, limit its bandwidth.++## notes++[[git-annex-shell]] does not support bup, due to the wacky way that bup+starts its server. So, to use bup, you need full shell access to the server.
@@ -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,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,8 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawkQqKSVY98PVGDIaYZdK9CodJdbh7cFfhY"+ nickname="Ashwin"+ subject="Rackspace Cloud Files support"+ date="2013-03-22T08:20:40Z"+ content="""+It'd be really cool to have Rackspace cloud files support. Like the guy above me said, I would submit a patch but not if I have to learn Haskell first :)+"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="andy"+ ip="99.48.75.171"+ subject="Re: Webhook special remote"+ date="2013-04-12T08:54:47Z"+ content="""+@Alex: You might see if the newly-added [[todo/wishlist: allow configuration of downloader for addurl]] could be made to do what you need... I've not played around with it yet, but perhaps you could set the downloader to be something that can sort out the various URLs and send them to the correct downloading tool?+"""]]
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="http://yarikoptic.myopenid.com/"+ nickname="site-myopenid"+ subject="How to establish local preference for (special) remotes"+ date="2013-05-22T14:06:48Z"+ content="""+Sorry if it is RTFM... If I have multiple original (reachable) remotes, how could I establish my preference for which one to be used in any given location?++usecase: if I clone a repository within amazon cloud instance -- I would now prefer if this (or all -- user-wide configuration somehow?) repository 'get's load from URLs originating in the cloud of this zone (e.g. having us-east-1.s3.amazonaws.com/ in their URLs).+"""]]
@@ -0,0 +1,12 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawmkBwMWvNKZZCge_YqobCSILPMeK6xbFw8"+ nickname="develop"+ subject="Remote costs"+ date="2013-05-22T14:15:03Z"+ content="""+This should be implemented with costs++I refer you too: http://git-annex.branchable.com/design/assistant/blog/day_213__costs/++This has been implemented in the assistant, so if you use that, changing priority should be as simple as changing the order of the remotes on the web interface. Whichever remote is highest on the list, is the one your client will fetch from.+"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ nickname="joey"+ subject="comment 14"+ date="2013-05-22T14:30:00Z"+ content="""+You do not need to use the assistant to configure the costs of remotes. Just set `remote.<name>.annex-cost` to appropriate values. See also the documentation for the `remote.<name>.annex-cost-command` which allows your own code to calculate costs.+"""]]
@@ -0,0 +1,11 @@+[[!comment format=mdwn+ username="http://yarikoptic.myopenid.com/"+ nickname="site-myopenid"+ subject="remotes costs"+ date="2013-05-22T18:33:11Z"+ content="""+Thank you -- that is nice!++Could costs be presented in 'whereis' and 'status' commands? e.g. like we know APT repositories priorities from apt-cache policy -- now I do not see them (at least in 4.20130501... updating to sid's 0521 now)++"""]]
@@ -0,0 +1,12 @@+[[!comment format=mdwn+ username="http://yarikoptic.myopenid.com/"+ nickname="site-myopenid"+ subject="compression -- storage and transfer"+ date="2013-05-22T18:48:59Z"+ content="""+Is there any remote which would not only compress during transfer (I believe rsync does that, right?) but also store objects compressed?++I thought bup would do both -- but it seems that git annex receives data uncompressed from a bup remote, and bup remote requires ssh access.++In my case I want to make publicly available files which are binary blobs which could be compressed very well. It would be a pity if I waste storage on my end and also incur significant traffic, which could be avoided if data load was transferred compressed. May be HTTP compression (http://en.wikipedia.org/wiki/HTTP_compression) could somehow be used efficiently for this purpose (not sure if load then originally could already reside in a compressed form to avoid server time to re-compress it)?+"""]]
@@ -0,0 +1,12 @@+[[!comment format=mdwn+ username="http://yarikoptic.myopenid.com/"+ nickname="site-myopenid"+ subject="Re: compression -- storage and transfer"+ date="2013-05-22T19:17:33Z"+ content="""+ha -- apparently it is trivial to configure apache to serve pre-compressed files (e.g. see http://stackoverflow.com/questions/75482/how-can-i-pre-compress-files-with-mod-deflate-in-apache-2-x) and they arrive compressed to client with++Content-Encoding: gzip++but unfortunately git-annex doesn't like those (fails to \"verify\") -- do you think it could be implemented for web \"special remotes\"? that would be really nice -- then I could store such load on another website, and addurl links to the compressed content+"""]]
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ nickname="joey"+ subject="comment 18"+ date="2013-05-23T23:25:02Z"+ content="""+All special remotes store files compressed when you enable encryption. Not otherwise, though.++As far as the web special remote and pre-compressed files, files are downloaded from the web using `wget` or (of wget is not available) `curl`. So if you can make it work with those commands, it should work.+"""]]
@@ -0,0 +1,9 @@+[[!comment format=mdwn+ username="http://yarikoptic.myopenid.com/"+ nickname="site-myopenid"+ subject="compressed storage/transfer -- gzip Content-Type"+ date="2013-05-25T06:41:37Z"+ content="""+FWIW -- eh -- unfortunately it seems not that transparent. wget seems to not support decompression at all, curl can do with explicit --compressed, BUT it doesn't distinguish url to a \"natively\" .gz file and pre-compressed content. And I am not sure if it is possible to anyhow reliably distinguish the two urls. In the case of obtaining pre-compressed file from my sample apache server the only difference in the http response header is that it gets \"compound\" ETag:+compare ETag: \"3acb0e-17b38-4dd5343744660\" (for directly asking zeros100.gz) vs \"3acb0e-17b38-4dd5343744660;4dd5344e1537e\" (requesting zeros100) where portion past \";\" I guess signals the caching tag for gzipping, but not exactly sure on that since it seems to be not a part of standard. Also for zeros100 I am getting \"TCN: choice\"... once again not sure if that is any how reliably indicative for my purpose. So I guess there is no good way ATM via Content-Type request.+"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawk9nck8WX8-ADF3Fdh5vFo4Qrw1I_bJcR8"+ nickname="Jon Ander"+ subject="MediaFire"+ date="2013-01-17T12:17:54Z"+ content="""+MediaFire offers 50GB of free storage (max size 200MB). It would be great to support it as a new special remote.+"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="4.154.7.238"+ subject="comment 2"+ date="2013-01-17T16:44:25Z"+ content="""+Mediafire does not appear to offer any kind of API for its storage.+"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawk9nck8WX8-ADF3Fdh5vFo4Qrw1I_bJcR8"+ nickname="Jon Ander"+ subject="MediaFire REST API"+ date="2013-01-17T16:53:41Z"+ content="""+Wouldn't this be enough? http://developers.mediafire.com/index.php/REST_API+"""]]
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawmRFKwny4rArBaz-36xTcsJYqKIgdDaw5Q"+ nickname="Andrew"+ subject="JABOF special remote"+ date="2013-01-19T08:34:32Z"+ content="""+Similar to a JABOD, this would be Just A Bunch Of Files. I already have a NAS with a file structure conducive to serving media to my TV. However, it's not capable (currently) of running git-annex locally. It would be great to be able to tell annex the path to a file there as a remote much like a web remote from \"git annex addurl\". That way I can safely drop all the files I took with me on my trip, while annex still verifies and counts the file on the NAS as a location.++There are some interesting things to figure out for this to be efficient. For example, SHAs of the files. Maybe store that in a metadata file in the directory of the files? Or perhaps use the WORM backend by default?+"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="4.154.3.194"+ subject="comment 5"+ date="2013-01-19T16:05:13Z"+ content="""+The web special remote is recently able to use file:// URL's, so you can just point to files on some arbitrary storage if you want to.+"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawlBia1J9-PoXgZYj2LASf7Bs__IqK3T8qQ"+ nickname="Greg"+ subject="Rackspace US/UK"+ date="2013-01-30T11:33:12Z"+ content="""+It'd be awesome to be able to use Rackspace as remote storage as an alternative to S3, I would submit a patch, but know 0 Haskell :D+"""]]
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawn-UoTjMBsVh6q4HNViGwJi-5FNaCVQB7E"+ nickname="Nico"+ subject="Rapidshare"+ date="2013-02-02T16:49:58Z"+ content="""+Would it be possible to support Rapidshare as a new special remote?+They offer unlimited storage for 6-10€ per month. It would be great for larger backups.+Their API can be found here: http://images.rapidshare.com/apidoc.txt+"""]]
@@ -0,0 +1,13 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawlRThEwuPnr8_bcuuCTQ0rQd3w6AfeMiLY"+ nickname="Alex"+ subject="'webhook' special remote?"+ date="2013-02-24T15:05:27Z"+ content="""+Is there any chance a special remote that functions like a hybrid of 'web' and 'hook'? At least in theory, it should be relatively simple, since it would only support 'get' and the only meaningful parameters to pass would be the URL and the output file name.++Maybe make it something like git config annex.myprogram-webhook 'myprogram $ANNEX_URL $ANNEX_FILE', and fetching could work by adding a --handler or --type parameter to addurl.++The use case here is anywhere that simple 'fetch the file over HTTP/FTP/etc' isn't workable - maybe it's on rapidshare and you need to use plowshare to download it; maybe it's a youtube video and you want to use youtube-dl, maybe it's a chapter of a manga and you want to turn it into a CBZ file when you fetch it.++"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawlRThEwuPnr8_bcuuCTQ0rQd3w6AfeMiLY"+ nickname="Alex"+ subject="comment 9"+ date="2013-02-24T15:13:16Z"+ content="""+A *ridiculously* cool possibility would be to allow them to match against URLs and then handle those (youtube-dl for youtube video URLs, for instance), but that would be additional work on your end and isn't really necessary.+"""]]
@@ -0,0 +1,33 @@+This special remote type stores file contents in directory.++One use case for this would be if you have a removable drive that+you want to use it to sneakernet files between systems (possibly with+[[encrypted|encryption]] contents). Just set up both systems to use+the drive's mountpoint as a directory remote.++If you just want two copies of your repository with the files "visible"+in the tree in both, the directory special remote is not what you want.+Instead, you should use a regular `git clone` of your git-annex repository.++## configuration++These parameters can be passed to `git annex initremote` to configure the+remote:++* `encryption` - One of "none", "hybrid", "shared", or "pubkey".+ See [[encryption]].++* `keyid` - Specifies the gpg key to use for [[encryption]].++* `chunksize` - Avoid storing files larger than the specified size in the+ directory. For use on directories on mount points that have file size+ limitations. The default is to never chunk files. + The value can use specified using any commonly used units.+ Example: `chunksize=100 megabytes` + Note that enabling chunking on an existing remote with non-chunked+ files is not recommended.++Setup example:++ # git annex initremote usbdrive type=directory directory=/media/usbdrive/ encryption=none+ # git annex describe usbdrive "usb drive on /media/usbdrive/"
@@ -0,0 +1,16 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="4.153.2.25"+ subject="comment 2"+ date="2013-07-19T13:54:10Z"+ content="""+@Laura the directory special remote requires files to+be in a particular directory structure with special names+git-annex comes up with. So you can't use it on an existing+tree of files like that.++What you can do is use the [[web_special_remote|web]],+with a `file://` url to point to the files wherever+they are stored. So for example,+`git annex addurl file:///media/dvd/file`+"""]]
@@ -0,0 +1,45 @@+[git-remote-gcrypt](https://github.com/blake2-ppc/git-remote-gcrypt/)+adds support for encrypted remotes to git. The git-annex gcrypt special+remote allows git-annex to also store its files in such repositories.+Naturally, git-annex encrypts the files it stores too, so everything+stored on the remote is encrypted.++See [[tips/fully_encrypted_git_repositories_with_gcrypt]] for some examples+of using gcrypt.++## configuration++These parameters can be passed to `git annex initremote` to configure+gcrypt:++* `encryption` - One of "none", "hybrid", "shared", or "pubkey".+ See [[encryption]].++* `keyid` - Specifies the gpg key to use for encryption of both the files+ git-annex stores in the repository, as well as to encrypt the git+ repository itself. May be repeated when multiple participants+ should have access to the repository.++* `gitrepo` - Required. The path or url to the git repository+ for gcrypt to use. This repository should be either empty, or an existing+ gcrypt repositry.++* `shellescape` - See [[rsync]] for the details of this option.++## notes++For git-annex to store files in a repository on a remote server, you need+shell access, and `rsync` must be installed. Those are the minimum+requirements, but it's also recommended to install git-annex on the remote+server, so that [[git-annex-shell]] can be used.++While you can use git-remote-gcrypt with servers like github, git-annex+can't store files on them. In such a case, you can just use+git-remote-gcrypt directly.++If you use encryption=hybrid, you can add more gpg keys that can access+the files git-annex stored in the gcrypt repository. However, due to the+way git-remote-gcrypt encrypts the git repository, you will need to somehow+force it to re-push everything again, so that the encrypted repository can+be decrypted by the added keys. Probably this can be done by setting+`GCRYPT_FULL_REPACK` and doing a forced push of branches.
@@ -0,0 +1,47 @@+This special remote type stores file contents in Amazon Glacier.++To use it, you need to have [glacier-cli](http://github.com/basak/glacier-cli)+installed.++The unusual thing about Amazon Glacier is the multiple-hour delay it takes+to retrieve information out of Glacier. To deal with this, commands like+"git-annex get" request Glacier start the retrieval process, and will fail+due to the data not yet being available. You can then wait appriximately +four hours, re-run the same command, and this time, it will actually+download the data.++## configuration++The standard environment variables `AWS_ACCESS_KEY_ID` and +`AWS_SECRET_ACCESS_KEY` are used to supply login credentials+for Amazon. You need to set these only when running+`git annex initremote`, as they will be cached in a file only you+can read inside the local git repository.++A number of parameters can be passed to `git annex initremote` to configure+the Glacier remote.++* `encryption` - One of "none", "hybrid", "shared", or "pubkey".+ See [[encryption]].++* `keyid` - Specifies the gpg key to use for [[encryption]].++* `embedcreds` - Optional. Set to "yes" embed the login credentials inside+ the git repository, which allows other clones to also access them. This is+ the default when gpg encryption is enabled; the credentials are stored+ encrypted and only those with the repository's keys can access them.++ It is not the default when using shared encryption, or no encryption.+ Think carefully about who can access your repository before using+ embedcreds without gpg encryption.++* `datacenter` - Defaults to "us-east-1".++* `vault` - By default, a vault name is chosen based on the remote name+ and UUID. This can be specified to pick a vault name.++* `fileprefix` - By default, git-annex places files in a tree rooted at the+ top of the Glacier vault. When this is set, it's prefixed to the filenames+ used. For example, you could set it to "foo/" in one special remote,+ and to "bar/" in another special remote, and both special remotes could+ then use the same vault.
@@ -0,0 +1,103 @@+This special remote type lets you store content in a remote of your own+devising.++It's not recommended to use this remote type when another like [[rsync]]+or [[directory]] will do. If your hooks are not carefully written, data+could be lost.++## example++Here's a simple example that stores content on clay tablets. If you+implement this example in the real world, I'd appreciate a tour+next Apert! :) --[[Joey]]++ # git config annex.cuneiform-store-hook 'tocuneiform < "$ANNEX_FILE" | tablet-writer --implement=stylus --title="$ANNEX_KEY" | tablet-proofreader | librarian --shelve --floor=$ANNEX_HASH_1 --shelf=$ANNEX_HASH_2'+ # git config annex.cuneiform-retrieve-hook 'librarian --get --floor=$ANNEX_HASH_1 --shelf=$ANNEX_HASH_2 --title="$ANNEX_KEY" | tablet-reader --implement=coffee --implement=glasses --force-monastic-dedication | fromcuneiform > "$ANNEX_FILE"'+ # git config annex.cuneiform-remove-hook 'librarian --get --floor=$ANNEX_HASH_1 --shelf=$ANNEX_HASH_2 --title="$ANNEX_KEY" | goon --hit-with-hammer'+ # git config annex.cuneiform-checkpresent-hook 'librarian --find --force-distrust-catalog --floor=$ANNEX_HASH_1 --shelf=$ANNEX_HASH_2 --title="$ANNEX_KEY" --shout-title'+ # git annex initremote library type=hook hooktype=cuneiform encryption=none+ # git annex describe library "the reborn Library of Alexandria (upgrade to bronze plates pending)"++Can you spot the potential data loss bugs in the above simple example?+(Hint: What happens when the `tablet-proofreader` exits nonzero?)++## configuration++These parameters can be passed to `git annex initremote`:++* `hooktype` - Required. This specifies a collection of hooks to use for+ this remote.++* `encryption` - One of "none", "hybrid", "shared", or "pubkey".+ See [[encryption]].++* `keyid` - Specifies the gpg key to use for [[encryption]].++## hooks++Each type of hook remote is specified by a collection of hook commands.+Each hook command is run as a shell command line, and should return nonzero+on failure, and zero on success.++These environment variables are used to communicate with the hook commands:++* `ANNEX_KEY` - name of a key to store, retrieve, remove, or check.+* `ANNEX_FILE` - a file containing the key's content+* `ANNEX_HASH_1` - short stable value, based on the key, can be used for hashing+ into 1024 buckets.+* `ANNEX_HASH_2` - another hash value, can be used for a second level of hashing++The settings to use in git config for the hook commands are as follows:++* `annex.$hooktype-store-hook` - Command run to store a key in the special remote.+ `ANNEX_FILE` contains the content to be stored.++* `annex.$hooktype-retrieve-hook` - Command run to retrieve a key from the special remote.+ `ANNEX_FILE` is a file that the retrieved content should be written to.+ The file may already exist with a partial+ copy of the content (or possibly just garbage), to allow for resuming+ of partial transfers.++* `annex.$hooktype-remove-hook` - Command to remove a key from the special remote.++* `annex.$hooktype-checkpresent-hook` - Command to check if a key is present+ in the special remote. Should output the key name to stdout, on its own line,+ if and only if the key has been actively verified to be present in the+ special remote (caching presence information is a very bad idea);+ all other output to stdout will be ignored.++## combined hook program++Rather than setting all of the above hooks, you can write a single+program that handles everything, and set a single hook to make it be used.++ # git config annex.demo-hook /usr/local/bin/annexdemo+ # git annex initremote mydemorepo type=hook hooktype=demo encryption=none++The program just needs to look at the `ANNEX_ACTION` environment variable+to see what it's being asked to do For example:++[[!format sh """+#!/bin/sh+set -e+case "$ANNEX_ACTION" in+ store)+ demo-upload "$ANNEX_HASH_1/$ANNEX_HASH_2/$ANNEX_KEY" < "$ANNEX_FILE"+ ;;+ retrieve)+ demo-download "$ANNEX_HASH_1/$ANNEX_HASH_2/$ANNEX_KEY" > "$ANNEX_FILE"+ ;;+ remove)+ demo-nuke "$ANNEX_HASH_1/$ANNEX_HASH_2/$ANNEX_KEY"+ ;;+ checkpresent)+ if demo-exists "$ANNEX_HASH_1/$ANNEX_HASH_2/$ANNEX_KEY"; then+ echo "$ANNEX_KEY"+ fi+ ;;+ *)+ echo "unknown ANNEX_ACTION: $ANNEX_ACTION" >&2+ exit 1+ ;;+esac+"""]]
@@ -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,56 @@+This special remote type rsyncs file contents to somewhere else.++Setup example:++ # git annex initremote myrsync type=rsync rsyncurl=rsync://rsync.example.com/myrsync keyid=joey@kitenet.net+ # git annex describe myrsync "rsync server"++Or for using rsync over SSH++ # git annex initremote myrsync type=rsync rsyncurl=ssh.example.com:/myrsync keyid=joey@kitenet.net+ # git annex describe myrsync "rsync server"++## configuration++These parameters can be passed to `git annex initremote` to configure rsync:++* `encryption` - One of "none", "hybrid", "shared", or "pubkey".+ See [[encryption]].++* `keyid` - Specifies the gpg key to use for [[encryption]].++* `rsyncurl` - Required. This is the url or `hostname:/directory` to + pass to rsync to tell it where to store content.++* `shellescape` - Optional. Set to "no" to avoid shell escaping normally+ done when using rsync over ssh. That escaping is needed with typical+ setups, but not with some hosting providers that do not expose rsynced+ filenames to the shell. You'll know you need this option if `git annex get`+ from the special remote fails with an error message containing a single+ quote (`'`) character. If that happens, you can run enableremote+ setting shellescape=no.++The `annex-rsync-options` git configuration setting can be used to pass+parameters to rsync.++## annex-rsync-transport++You can use the `annex-rsync-transport` git configuration setting to choose+whether we run rsync over ssh or rsh. This setting is also used to specify+parameters that git annex will pass to ssh/rsh.++ssh is the default transport; if you'd like to run rsync over rsh, modify your+.git/config to include++ annex-rsync-transport = rsh++under the appropriate remote.++To pass parameters to ssh/rsh, include the parameters after "rsh" or+"ssh". For example, to configure ssh to use the private key at+`/path/to/private/key`, specify++ annex-rsync-transport = ssh -i /path/to/private/key++Note that environment variables aren't expanded here, so for example, you+cannot specify `-i $HOME/.ssh/private_key`.
@@ -0,0 +1,11 @@+git-annex can use the WWW as a special remote, downloading urls to files.+See [[tips/using_the_web_as_a_special_remote]] for usage examples.++## notes++Currently git-annex only supports downloading content from the web; +it cannot upload to it or remove content.++This special remote uses arbitrary urls on the web as the source for content.+git-annex can also download content from a normal git remote, accessible by+http.
@@ -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,42 @@+This special remote type stores file contents in a WebDAV server.++## configuration++The environment variables `WEBDAV_USERNAME` and `WEBDAV_PASSWORD` are used+to supply login credentials. You need to set these only when running+`git annex initremote`, as they will be cached in a file only you +can read inside the local git repository.++A number of parameters can be passed to `git annex initremote` to configure+the webdav remote.++* `encryption` - One of "none", "hybrid", "shared", or "pubkey".+ See [[encryption]].++* `keyid` - Specifies the gpg key to use for [[encryption]].++* `embedcreds` - Optional. Set to "yes" embed the login credentials inside+ the git repository, which allows other clones to also access them. This is+ the default when gpg encryption is enabled; the credentials are stored+ encrypted and only those with the repository's keys can access them.++ It is not the default when using shared encryption, or no encryption.+ Think carefully about who can access your repository before using+ embedcreds without gpg encryption.++* `url` - Required. The URL to the WebDAV directory where files will be+ stored. This can be a subdirectory of a larger WebDAV repository, and will+ be created as needed. Use of a https URL is strongly+ encouraged, since HTTP basic authentication is used.++* `chunksize` - Avoid storing files larger than the specified size in+ WebDAV. For use when the WebDAV server has file size+ limitations. The default is to never chunk files. + The value can use specified using any commonly used units.+ Example: `chunksize=75 megabytes` + Note that enabling chunking on an existing remote with non-chunked+ files is not recommended.++Setup example:++ # WEBDAV_USERNAME=joey@kitenet.net WEBDAV_PASSWORD=xxxxxxx git annex initremote box.com type=webdav url=https://www.box.com/dav/git-annex chunksize=75mb keyid=joey@kitenet.net
@@ -0,0 +1,39 @@+XMPP (Jabber) is used by the [[assistant]] as a git remote. This is,+technically not a git-annex special remote (large files are not transferred+over XMPP; only git commits are sent).++Typically XMPP will be set up using the web app, but here's how a manual+set up could be accomplished:++1. xmpp login credentials need to be stored in `.git/annex/creds/xmpp`.+ Obviously this file should be mode 600. An example file:++ XMPPCreds {xmppUsername = "joeyhess", xmppPassword = "xxxx", xmppHostname = "xmpp.l.google.com.", xmppPort = 5222, xmppJID = "joeyhess@gmail.com"}++2. A git remote is created using a special url, of the form `xmpp::user@host`+ For the above example, it would be `url = xmpp::joeyhess@gmail.com`++3. The uuid of one of the other clients using XMPP should be configured+ using the `annex.uuid` setting, the same as is set up for other remotes.++With the above configuration, the [[assistant]] will use xmpp remotes much as+any other git remote. Since XMPP requires a client that is continually running+to see incoming pushes, the XMPP remote cannot be used with git at the+command line.++## XMPP server support status+[[!table data="""+Provider|Status|Type|Notes+[[Gmail|http://gmail.com]]|Working|?|Google apps users will have to configure `.git/annex/creds/xmpp` manually+[[Coderollers|http://www.coderollers.com/xmpp-server/]]|Working|[[Openfire|http://www.igniterealtime.org/projects/openfire/]]+[[jabber.me|http://jabber.me/]]|Working|[[Tigase|http://www.tigase.org/]]+[[xmpp.ru.net|https://www.xmpp.ru.net]]|Working|[[jabberd2|http://jabberd2.org/]]+[[jabber.org|http://jabber.org]]|Working|[[Isode M-Link|http://www.isode.com/products/m-link.html]]+-|Working|[[Prosody|http://prosody.im/]]|No providers tested.+-|Working|[[Metronome|http://www.lightwitch.org/]]|No providers tested.+-|[[Failing|http://git-annex.branchable.com/forum/XMPP_authentication_failure/]]|ejabberd|[[Authentication bug|https://support.process-one.net/browse/EJAB-1632]]: Fixed in debian unstable with version 2.1.10-5+-|[[Failing|http://git-annex.branchable.com/forum/XMPP_authentication_failure/#comment-4ce5aeabd12ca3016290b3d8255f6ef1]]|jabberd14|No further information+"""]]+List of providers: [[http://xmpp.net/]]++See also: [[xmpp_protocol_design_notes|design/assistant/xmpp]]
@@ -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,11 @@+git-annex allows managing files with git, without checking the file+contents into git. While that may seem paradoxical, it is useful when+dealing with files larger than git can currently easily handle, whether due+to limitations in memory, time, or disk space.++[[!img assistant/thumbnail.png link=assistant align=right]]+git-annex is designed for git users who love the command line.+For everyone else, the [[git-annex assistant|assistant]] turns+git-annex into an easy to use folder synchroniser.++To get a feel for git-annex, see the [[walkthrough]].
@@ -0,0 +1,38 @@+The `git annex sync` command provides an easy way to keep several+repositories in sync. ++Often git is used in a centralized fashion with a central bare repository+which changes are pulled and pushed to using normal git commands.+That works fine, if you don't mind having a central repository.++But it can be harder to use git in a fully decentralized fashion, with no+central repository and still keep repositories in sync with one another.+You have to remember to pull from each remote, and merge the appopriate+branch after pulling. It's difficult to *push* to a remote, since git does+not allow pushes into the currently checked out branch.++`git annex sync` makes it easier using a scheme devised by Joachim+Breitner. The idea is to have a branch `synced/master` (actually,+`synced/$currentbranch`), that is never directly checked out, and serves+as a drop-point for other repositories to use to push changes.++When you run `git annex sync`, it merges the `synced/master` branch+into `master`, receiving anything that's been pushed to it. (If there is a+conflict in this merge, [[automatic_conflict_resolution]] is used to+resolve it). Then it fetches from each remote, and merges in any changes that+have been made to the remotes too. Finally, it updates `synced/master`+to reflect the new state of `master`, and pushes it out to each of the remotes.++This way, changes propagate around between repositories as `git annex sync`+is run on each of them. Every repository does not need to be able to talk+to every other repository; as long as the graph of repositories is+connected, and `git annex sync` is run from time to time on each, a given+change, made anywhere, will eventually reach every other repository.++The workflow for using `git annex sync` is simple:++* Make some changes to files in the repository, using `git-annex`,+ or anything else.+* Run `git annex sync` to save the changes.+* Next time you're working on a different clone of that repository,+ run `git annex sync` to update it.
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://adamspiers.myopenid.com/"+ nickname="Adam"+ subject="very nice"+ date="2012-02-25T15:02:18Z"+ content="""+Here's a way to get from a starting point of two or more peer directory trees *not* tracked by git or git-annex, to the point where they can be synced in the manner described above: [[forum/syncing_non-git_trees_with_git-annex/]]+"""]]
@@ -0,0 +1,11 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawlDDW-g2WLLsLpcnCm4LykAquFY_nwbIrU"+ nickname="Daniel"+ subject="Its just grand"+ date="2013-01-04T14:45:35Z"+ content="""+I cam upon git-annex a few months ago. I saw immidiately how it could help with some frustrations I've been having. One in particlar is keeping my vimrc in sync accross multiple locations and platforms. I finally took the time to give it a try after I finally hit my boiling point this morning. I went through the [walkthrough](http://git-annex.branchable.com/walkthrough/) and now I have an annax everywhere I need it. `git annex sync` and my vimrc is up-to-date, simply grand!++Thanks so much for making git-annex, +[Daniel Wozniak](http://woz.io)+"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawnVX_teMpJeQkyheivad_1XSCFSjpiWgx8"+ nickname="Diggory"+ subject="synchronising stored files with a bare repository"+ date="2013-01-11T16:52:38Z"+ content="""+Good for syncing indexes, but if I want to synchronise all data files too (specifically pushing to a remote bare repository), how do I do that?+"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="4.154.7.238"+ subject="comment 4"+ date="2013-01-11T18:18:07Z"+ content="""+Yes, sync only syncs the git branches, not git-annex data. To sync the date, you can run a command such as `git annex copy --to bareremote`. You could run that in cron. Or, the [[assistant]] can be run as a daemon, and automatically syncs git-annex data.+"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://elmimmo.myopenid.com/"+ nickname="chocolate.camera"+ subject="How to sync content with git-annex, not assistant"+ date="2013-10-11T09:58:12Z"+ content="""+Sure assistant can sync git-annex data across remotes. But how do I tell a repo to sync git-annex data, but not so manually as to having to know what exactly needs to be copied from/to where?+"""]]
@@ -0,0 +1,18 @@+### Please describe the problem.+++### What steps will reproduce the problem?+++### What version of git-annex are you using? On what operating system?+++### Please provide any additional information below.++[[!format sh """+# If you can, paste a complete transcript of the problem occurring here.+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log+++# End of transcript or log.+"""]]
@@ -0,0 +1,34 @@+<div>+<blockquote class="twitter-tweet"><p>Git annex. Brilliant. Powerful. <a href="http://t.co/AM9B6peM" title="http://git-annex.branchable.com/">git-annex.branchable.com</a></p>— Gert van Dijk (@gertvdijk) <a href="https://twitter.com/gertvdijk/status/186456474246053888" data-datetime="2012-04-01T14:14:22+00:00">April 1, 2012</a></blockquote>+<script src="//platform.twitter.com/widgets.js" charset="utf-8"></script>+<blockquote class="twitter-tweet"><p>git-annex is like dropbox without the chrome. <a href="http://t.co/qcENNt3g" title="http://git-annex.branchable.com/">git-annex.branchable.com</a></p>— Wil Chung (@iamwil) <a href="https://twitter.com/iamwil/status/185997581229367296" data-datetime="2012-03-31T07:50:53+00:00">March 31, 2012</a></blockquote>+<script src="//platform.twitter.com/widgets.js" charset="utf-8"></script>+<blockquote class="twitter-tweet"><p>blender 2.62 + ffmpeg + dnxhd + git-annex = who needs final cut?</p>— cdotwright (@cdotwright) <a href="https://twitter.com/cdotwright/status/187645142864375808" data-datetime="2012-04-04T20:57:42+00:00">April 4, 2012</a></blockquote>+<script src="//platform.twitter.com/widgets.js" charset="utf-8"></script>+<blockquote class="twitter-tweet"><p>I want <a href="https://twitter.com/search/%2523git">#git</a>-annex whereis for all the stuff (not) in my room.</p>— topr (@derwelle) <a href="https://twitter.com/derwelle/status/172356564072673280" data-datetime="2012-02-22T16:26:21+00:00">February 22, 2012</a></blockquote>+<script src="//platform.twitter.com/widgets.js" charset="utf-8"></script>+<blockquote class="twitter-tweet"><p>Git-annex now auto-syncing photos from my android phone to a Tor hidden SSH service I control (via <a href="https://twitter.com/guardianproject">@guardianproject</a>'s Orbot) <a href="https://twitter.com/search?q=%23prismbreak&src=hash">#prismbreak</a></p>— Richard King (@graphiclunarkid) <a href="https://twitter.com/graphiclunarkid/statuses/347658443479449601">June 20, 2013</a></blockquote>+<script src="//platform.twitter.com/widgets.js" charset="utf-8"></script>+</div>++<blockquote>+What excites me about GIT ANNEX is how it fundamentally tracks the+backup and availability of any data you own, and allows you to share+data with a large or small audience, ensuring that the data survives.+</blockquote>+-- Jason Scott <http://ascii.textfiles.com/archives/3625>++Seen on IRC:+<pre>+oh my god, git-annex is amazing+this is the revolution in fucking with gigantic piles of files that I've been waiting for+</pre>++And then my own story: I have a ton of drives. I have a lot of servers. I+live in a cabin on **dialup** and often have 1 hour on broadband in a week+to get everything I need. Without git-annex, managing all this would not be+possible. It works perfectly for me, not a surprise since I wrote it, but+still, it's a different level of "perfect" than anything I could put+together before. --[[Joey]]++See also: [[design/assistant/blog/day_288__success_stories]]
@@ -0,0 +1,4 @@+This page is a place to document tips and techniques for using git-annex.++[[!inline pages="tips/* and !tips/*/*" archive="yes"+rootpage="tips" postformtext="Add a new tip about:" show=0]]
@@ -0,0 +1,59 @@+If you're anything like me¹, you have a copy of your annex on a computer running at home², set up so you can access it from anywhere like this:++ ssh myhome.no-ip.org++This is totally great! Except, there is no way for your home computer to pull your changes, because there is no *on-the-go.no-ip.org*. You can get clunky and use a *bare git repository and git push*, but there is a better way.++First, install *openssh-server* on your *on-the-go* computer++ sudo apt-get install openssh-server # Adjust to your flavor of unix++Then, log into your *home* computer, with *port forwarding*:++ ssh me@myhome.no-ip.org -R 2201:localhost:22++Your *home* computer can now ssh into your *on-the-go* computer, as long as you keep the above shell running.++You can now add your *on-the-go* computer as a remote on your *home* computer. Use the port forwarding shell you just connected with the command above, if you like. ++ ssh-keygen -t rsa+ ssh-copy-id "me@localhost -p 2201"+ cd ~/annex+ git remote add on-the-go ssh://me@localhost:2201/home/myuser/annex++Now you can run normal annex operations, as long as the port forwarding shell is running³.++ git annex sync+ git annex get on-the-go some/big/file+ git annex status++You can add more computers by repeating with a different port, e.g. 2202 or 2203 (or any other).++If you're security paranoid (like me), read on. If you're not, that's it! Thanks for reading!++---+Paranoid Area++Note you're granting passwordless access to your on-the-go computer to your home computer. I believe that's all right, as long as:++* Your home computer is really in your home, and not at a friend's house or some datacenter+* Your home computer can be accessed only by ssh, and not HTTP or Samba or NTP or (shoot me now!) FTP+* Only you (and perhaps trustworthy family) have access to your home computer+* You have reasonably strong passwords or key-only logins on both your home and on-the-go computers.+* You regularly install security updates on both computers (sudo apt-get update && sudo apt-get upgrade)++In any case, the setup is much, much, much more secure than Dropbox. With Dropbox, you have exactly the same setup, but:++* Your data is stored in some datacenter. It's supposed to be encrypted. It might not be.+* Lot's of people have routine access to your files, and plausible reason to. Bored employees might regularly be doing some 'maintenance work' involving your pictures.+* The dropbox software can do anything it likes on your computer, and it's closed source so you don't know if it does. A disgruntled employee could put a trojan into it.+* Dropbox might have a backdoor for employee access to any file on your computer. This might be done with the best of intentions, but a mal-intentioned or careless employee might still erase things or send sensitive files from your computer by email.+* A truly huge amount of eyes connected to incredibly smart brains have looked at openssh and found it secure. Everybody trusts openssh. With dropbox, there is, well, dropbox. Whoever that is.++-----++¹ Me=Carlo, not Joey. I'm pretty sure doing what I wrote here is a good idea, but in case it turns out to be catastrophically dumb, it's my fault, not his.++² My always-on computer at home is a raspberry pi with a 32GB USB stick. Best self-hosted dropbox you could imagine.++³ You can just forward the port, but not open a shell, by adding the -N command. This could be useful for connecting on startup, e.g. in /etc/rc.local. I prefer to open the shell to forward the ports, maybe use it, and close it to stop it.
@@ -0,0 +1,13 @@+# Problem+I noticed that after installing git-annex assistant, my start up times greatly increased because the assistant does a startup scan while everything else is loading.+# Solution (for people using Gnome)+The solution I came up with is to delay the assistant's startup, as well as setting its IO priority as idle. To do this in Gnome 3, run:++ gnome-session-properties+Find the "Git Annex Assistant" entry in the Startup Programs tab, then click edit. Change this:++ /usr/local/bin/git-annex assistant --autostart (your location of git-annex may be different)+to this:++ bash -c "sleep 30; ionice -c3 /usr/local/bin/git-annex assistant --autostart" (replace /usr/local/bin to wherever git-annex is installed)+The "sleep 30" command delays the startup of the assistant by 30 seconds, and "ionice -c3" sets git-annex's IO priority to "idle," the lowest level.
@@ -0,0 +1,118 @@+The problem+===========++[Calibre](http://calibre-ebook.com/) is a ebook manager that is+available in [debian](http://packages.debian.org/sid/calibre). I use+it to maintain my library, but also to dowload every day an epub+version of a French newspaper and then put it on my kobo.++Configuring git annex for this+==============================++I wanted to use git-annex, so++ $ git init+ $ git annex init "some useful name"++But I don't want every thing in annex, because Calibre use some text+file to save some metadata, so I used:++ $ git config annex.largefiles "include=* exclude=*.opf exclude=*.json"++then lets add everything++ $ git annex add *+ $ git add *+ $ git commit -m "first commit"++Calibre need read and write access on the its database, so let unlock it:++ $ git annex unlock metadata.db++On my other computer I only need to do++ $ git clone $user@$host:Calibre\ library+ $ cd Calibre\ library+ $ git annex init "another useful name"+ $ git annex get .+ $ git annex unlock metadata.db++The problem is that every time you will `git annex sync`, git annex+will lock again the metadata.db, so lets unlock it automatically. I+use git hooks, in `.git/hooks/post-commit` I have++ #!/bin/bash++ git annex edit metadata.db++don't forget to make this file executable++ $ chmod a+x .git/hooks/post-commit++Day to day operation+====================++ $ git annex add .++Will put new file into the annex++ $ git add .++Will take care of the files that should no go into annex++ $ git annex sync++Will make the repositories exchange informations about all this, and+make remote change local++ $ git annex get .++Will make remote book locally available++Merge conflict+--------------+You should not run calibre on the two computer simultaneously, or+without syncing before it. If you do, you will have a conflict that+git-annex will automatically *solve* by rename both of the file.++You can then either:++ - Choose one. If no books have been changed or added on one of the+ computer, to use the other `metadata.db` will not make you loose+ any information+ - rebuild it. `calibredb restore_database` won't do it, but will tell+ you how to do it.++Checking the library+--------------------+You can use `calibredb check_library` to check you library is+correct. If you use git for it, it will always tell you that it is not+correct: there is this author ".git" it doesn't know about. Just don't+care about it.++Maybe this can be solved by using `vcsh` but apparently+`vcsh`+`git annex` it not well tested yet.++Automatic stuff+---------------+I use `mr` to automatically run all this, but some config could be+done (I believe) to have `git annex copy --auto` do what it should.++There are also the git annex assistant for this kind of automatic+synchronizations of contents, but I don't know if my automatic+unlocking of one file will break this.++It might be interesting to find someway to unlock and lock the library+only when running calibre, a simple script to launch calibre will do+that. Note that each time you will lock and unlock, you will have a+new commit in git.++Another solution+===================+You could also use direct mode in place of the auto unlock feature++ git annex indirect++The remove the `post-commit` git hook (or do not add it). Its a+simpler solution, but remember that interaction between git annex direct+repositories and plain git are complex
@@ -0,0 +1,19 @@+I worked out how to retroactively annex a large file that had been checked into a git repo some time ago. I thought this might be useful for others, so I am posting it here.++Suppose you have a git repo where somebody had checked in a large file you would like to have annexed, but there are a bunch of commits after it and you don't want to loose history, but you also don't want everybody to have to retrieve the large file when they clone the repo. This will re-write history as if the file had been annexed when it was originally added.++This command works for me, it relies on the current behavior of git which is to use a directory named .git-rewrite/t/ at the top of the git tree for the extracted tree. This will not be fast and it will rewrite history, so be sure that everybody who has a copy of your repo is OK with accepting the new history. If the behavior of git changes, you can specify the directory to use with the -d option. Currently, the t/ directory is created inside the directory you specify, so "-d ./.git-rewrite/" should be roughly equivalent to the default.++Enough with the explanation, on to the command:+<pre>+git filter-branch --tree-filter 'for FILE in file1 file2 file3;do if [ -f "$FILE" ] && [ ! -L "$FILE" ];then git rm --cached "$FILE";git annex add "$FILE";ln -sf `readlink "$FILE"|sed -e "s:^../../::"` "$FILE";fi;done' --tag-name-filter cat -- --all+</pre>++replace file1 file2 file3... with whatever paths you want retroactively annexed. If you wanted bigfile1.bin in the top dir and subdir1/bigfile2.bin to be retroactively annexed try:+<pre>+git filter-branch --tree-filter 'for FILE in bigfile1.bin subdir1/bigfile2.bin;do if [ -f "$FILE" ] && [ ! -L "$FILE" ];then git rm --cached "$FILE";git annex add "$FILE";ln -sf `readlink "$FILE"|sed -e "s:^../../::"` "$FILE";fi;done' --tag-name-filter cat -- --all+</pre>++**If your repo has tags** then you should take a look at the git-filter-branch man page about the --tag-name-filter option and decide what you want to do. By default this will re-write the tags "nearly properly".++You'll probably also want to look at the git-filter-branch man page's section titled "CHECKLIST FOR SHRINKING A REPOSITORY" if you want to free up the space in the existing repo that you just changed history on.
@@ -0,0 +1,58 @@+[The Internet Archive](http://www.archive.org/) allows members to upload+collections using an Amazon S3 +[compatible API](http://www.archive.org/help/abouts3.txt), and this can+be used with git-annex's [[special_remotes/S3]] support. ++So, you can locally archive things with git-annex, define remotes that+correspond to "items" at the Internet Archive, and use git-annex to upload+your files to there. Of course, your use of the Internet Archive must+comply with their [terms of service](http://www.archive.org/about/terms.php).++A nice added feature is that whenever git-annex sends a file to the+Internet Archive, it records its url, the same as if you'd run `git annex+addurl`. So any users who can clone your repository can download the files+from archive.org, without needing any login or password info. This makes+the Internet Archive a nice way to publish the large files associated with+a public git repository.++----++Sign up for an account, and get your access keys here:+<http://www.archive.org/account/s3.php>+ + # export AWS_ACCESS_KEY_ID=blahblah+ # export AWS_SECRET_ACCESS_KEY=xxxxxxx++Specify `host=s3.us.archive.org` when doing `initremote` to set up+a remote at the Archive. This will enable a special Internet Archive mode:+Encryption is not allowed; you are required to specify a bucket name+rather than having git-annex pick a random one; and you can optionally+specify `x-archive-meta*` headers to add metadata as explained in their+[documentation](http://www.archive.org/help/abouts3.txt).++ # git annex initremote archive-panama type=S3 \+ host=s3.us.archive.org bucket=panama-canal-lock-blueprints \+ x-archive-meta-mediatype=texts x-archive-meta-language=eng \+ x-archive-meta-title="original Panama Canal lock design blueprints"+ initremote archive-panama (Internet Archive mode) ok+ # git annex describe archive-panama "a man, a plan, a canal: panama"+ describe archive-panama ok++Then you can annex files and copy them to the remote as usual:++ # git annex add photo1.jpeg --backend=SHA1E+ add photo1.jpeg (checksum...) ok+ # git annex copy photo1.jpeg --fast --to archive-panama+ copy (to archive-panama...) ok++Once a file has been stored on archive.org, it cannot be (easily) removed+from it. Also, git-annex whereis will tell you a public url for the file+on archive.org. (It may take a while for archive.org to make the file+publically visibile.)++Note the use of the SHA1E [[backend|backends]] when adding files. That is+the default backend used by git-annex, but even if you don't normally use+it, it makes most sense to use the WORM or SHA1E backend for files that+will be stored in the Internet Archive, since the key name will be exposed+as the filename there, and since the Archive does special processing of+files based on their extension.
@@ -0,0 +1,46 @@+[[todo/wishlist: an "assistant" for web-browsing -- tracking the sources of the downloads]] suggests using git-annex as a tool to store downloads tied+to their URLs. This also enables people to have their files stored offline,+while being able to git annex drop them at any time and redownload them+with git annex get. Additionally, a clone of the repo can be used to+download whatever files are desired from online.++This tip explains how to implement a similar system to the one described in+the linked wishlist with existing software and features of git-annex.++The first step is to install the Firefox plugin+[FlashGot](http://flashgot.net/). We will use it to provide the Firefox+shortcuts to add things to our annex.++We also need a normal download manager, if we want to get status updates as+the download is done. We'll need to configure git-annex to use it by+setting `annex.web-download-command` as Joey describes in his comment on+[[todo/wishlist: allow configuration of downloader for addurl]]. See the+manpage [[git-annex]] for more information on setting configuration.++Once we have installed all that, we need a script that has an interface+which FlashGot can treat as a downloader, but which calls git-annex to do+the actual downloading. Such a script is available from+<https://gist.github.com/andyg0808/5342434>. Download it and store it+somewhere it can live, or cut and paste:++[[!format sh """+#!/bin/bash+# $1=folder to cd to (must be a git annex repo)+# $2=URL to download++cd "$1"+git-annex addurl "$2"+"""]]++Finally, we need to configure FlashGot to use the script as a downloader.+Go to Tools > Add-ons in Firefox. Click "Preferences" on FlashGot. Click+the Add button next to the list of download managers. Enter a name for the+git-annex downloader. Choose the script that was downloaded from the+"Locate executable file" dialog that appears. Now set the command line+arguments template to be "[FOLDER] [URL]" (you can find more substitution+expressions in the Placeholders dropdown above the Command line arguments+template field). You're done!++Go ahead and test it by trying to download a file using FlashGot. It should+offer as one of its available download managers the new manager you created+just above. Select it and have fun!
@@ -0,0 +1,31 @@+[[!meta title="using assume-unstages to speed up git with large trees of annexed files"]]++Git update-index's assume-unstaged feature can be used to speed+up `git status` and stuff by not statting the whole tree looking for changed+files.++This feature works quite well with git-annex. Especially because git+annex's files are immutable, so aren't going to change out from under it,+this is a nice fit. If you have a very large tree and `git status` is+annoyingly slow, you can turn it on:++ git config core.ignoreStat true++When `git mv` and `git rm` are used, those changes *do* get noticed, even+on assume-unchanged files. When new files are added, eg by `git annex add`,+they are also noticed.++There are two gotchas. Both occur because `git add` does not stage+assume-unchanged files.++1. When an annexed file is moved to a different directory, it updates+ the symlink, and runs `git add` on it. So the file will move,+ but the changed symlink will not be noticed by git and it will commit a+ dangling symlink.+2. When using `git annex migrate`, it changes the symlink and `git adds`+ it. Again this won't be committed.++These can be worked around by running `git update-index --really-refresh`+after performing such operations. I hope that `git add` will be changed+to stage changes to assume-unchanged files, which would remove this+only complication. --[[Joey]]
@@ -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,15 @@+Normally git-annex does not retrieve file contents when checking out a+tree. In some use cases, it makes sense to always have the contents of+files available after a `git checkout` or `git update`. This can be+accomplished by installing the following as `.git/hooks/post-checkout`++ #!/bin/sh+ # Uses git-annex to get all files in the specified directories+ # (relative to the top of the repository) on checkout.+ dirs=.+ top="$(git rev-parse --show-toplevel)"+ for dir in "$dirs"; do git annex get $top/$dir"; done++By default, all files in the whole repository will be made available. The+`dirs` setting can be configured if you only want to get files in certian+directories.
@@ -0,0 +1,2 @@+When git annex does fsck on (for example) a GPG-encrypted special directory remote, it first transfers the whole file into .git/annex/tmp directory.+If your annex is on an SSD, it's a good idea to make .git/annex/tmp a symlink to say /var/tmp so SSD isn't worn down. This actually may be a better default.
@@ -0,0 +1,75 @@+If you are starting from nothing (no existing `git` or `git-annex` repository) and want to use a server as a centralised repository, try the following steps.++On the server where you'll hold the "master" repository:++ server$ cd /one/git+ server$ mkdir m+ server$ cd m+ server$ git init --bare+ Initialized empty Git repository in /one/git/m/+ server$ git annex init origin+ init origin ok+ server$ ++Clone that to the laptop:++ laptop$ cd /other+ laptop$ git clone ssh://server//one/git/m+ Cloning into 'm'...+ Warning: No xauth data; using fake authentication data for X11 forwarding.+ remote: Counting objects: 5, done. + remote: Compressing objects: 100% (3/3), done. + remote: Total 5 (delta 0), reused 0 (delta 0) + Receiving objects: 100% (5/5), done.+ warning: remote HEAD refers to nonexistent ref, unable to checkout.++ laptop$ cd m+ laptop$ git annex init laptop+ init laptop ok+ laptop$ ++Merge the `git-annex` repository (this is the bit that is often+overlooked!):++ laptop$ git annex merge + merge . (merging "origin/git-annex" into git-annex...)+ ok+ laptop$ ++Add some content:++ laptop$ git annex addurl http://kitenet.net/~joey/screencasts/git-annex_coding_in_haskell.ogg+ "kitenet.net_~joey_screencasts_git-annex_coding_in_haskell.ogg"+ addurl kitenet.net_~joey_screencasts_git-annex_coding_in_haskell.ogg (downloading http://kitenet.net/~joey/screencasts/git-annex_coding_in_haskell.ogg ...) --2011-12-15 08:13:10-- http://kitenet.net/~joey/screencasts/git-annex_coding_in_haskell.ogg+ Resolving kitenet.net (kitenet.net)... 2001:41c8:125:49::10, 80.68.85.49+ Connecting to kitenet.net (kitenet.net)|2001:41c8:125:49::10|:80... connected.+ HTTP request sent, awaiting response... 200 OK+ Length: 39362757 (38M) [audio/ogg]+ Saving to: `/other/m/.git/annex/tmp/URL--http&c%%kitenet.net%~joey%screencasts%git-annex_coding_in_haskell.ogg'++ 100%[======================================>] 39,362,757 2.31M/s in 17s ++ 2011-12-15 08:13:27 (2.21 MB/s) - `/other/m/.git/annex/tmp/URL--http&c%%kitenet.net%~joey%screencasts%git-annex_coding_in_haskell.ogg' saved [39362757/39362757]++ (checksum...) ok+ (Recording state in git...)+ laptop$ git commit -m 'See Joey play.'+ [master (root-commit) 106e923] See Joey play.+ 1 files changed, 1 insertions(+), 0 deletions(-)+ create mode 120000 kitenet.net_~joey_screencasts_git-annex_coding_in_haskell.ogg+ laptop$ ++All fine, now push it back to the centralised master:++ laptop$ git push+ Counting objects: 20, done.+ Delta compression using up to 4 threads.+ Compressing objects: 100% (11/11), done.+ Writing objects: 100% (18/18), 1.50 KiB, done.+ Total 18 (delta 1), reused 1 (delta 0)+ To ssh://server//one/git/m+ 3ba1386..ad3bc9e git-annex -> git-annex+ laptop$ ++You can add more "client" repositories by following the `laptop`+sequence of operations.
@@ -0,0 +1,140 @@+The [[walkthrough]] builds up a decentralized git repository setup, but+git-annex can also be used with a centralized bare repository, just like+git can. This tutorial shows how to set up a centralized repository hosted on+GitHub.++## set up the repository, and make a checkout++I've created a repository for technical talk videos, which you can+[fork on Github](https://github.com/joeyh/techtalks).+Or make your own repository on GitHub (or elsewhere) now.++On your laptop, [[install]] git-annex, and clone the repository:++ # git clone git@github.com:joeyh/techtalks.git+ # cd techtalks++Tell git-annex to use the repository, and describe where this clone is+located:++ # git annex init 'my laptop'+ init my laptop ok++Let's tell git-annex that GitHub doesn't support running git-annex-shell there.+This means you can't store annexed file *contents* on GitHub; it would+really be better to host the bare repository on your own server, which+would not have this limitation. (If you want to do that, check out+[[using_gitolite_with_git-annex]].)++ # git config remote.origin.annex-ignore true++## add files to the repository++Add some files, obtained however.++ # youtube-dl -t 'http://www.youtube.com/watch?v=b9FagOVqxmI'+ # git annex add *.mp4+ add Haskell_Amuse_Bouche-b9FagOVqxmI.mp4 (checksum) ok+ (Recording state in git...)+ # git commit -m "added a video. I have not watched it yet but it sounds interesting"++This file is available directly from the web; so git-annex can download it:++ # git annex addurl http://kitenet.net/~joey/screencasts/git-annex_coding_in_haskell.ogg+ addurl kitenet.net_~joey_screencasts_git-annex_coding_in_haskell.ogg+ (downloading http://kitenet.net/~joey/screencasts/git-annex_coding_in_haskell.ogg ...)+ (checksum...) ok+ (Recording state in git...)+ # git commit -a -m 'added a screencast I made'++Feel free the rename the files, etc, using normal git commands:++ # git mv Haskell_Amuse_Bouche-b9FagOVqxmI.mp4 Haskell_Amuse_Bouche.mp4+ # git mv kitenet.net_~joey_screencasts_git-annex_coding_in_haskell.ogg git-annex_coding_in_haskell.ogg+ # git commit -m 'better filenames'++Now push your changes back to the central repository. This first time,+remember to push the git-annex branch, which is used to track the file+contents.++ # git push origin master git-annex+ To git@github.com:joeyh/techtalks.git+ * [new branch] master -> master+ * [new branch] git-annex -> git-annex++That push went fast, because it didn't upload large videos to GitHub.+To check this, you can ask git-annex where the contents of the videos are:++ # git annex whereis+ whereis Haskell_Amuse_Bouche.mp4 (1 copy) + 767e8558-0955-11e1-be83-cbbeaab7fff8 -- here+ ok+ whereis git-annex_coding_in_haskell.ogg (2 copies) + 00000000-0000-0000-0000-000000000001 -- web+ 767e8558-0955-11e1-be83-cbbeaab7fff8 -- here+ ok++## make more checkouts++So far you have a central repository, and a checkout on a laptop.+Let's make another checkout that's used as a backup. You can put it anywhere+you like, just make it be somewhere your laptop can access. A few options:++* Put it on a USB drive that you can plug into the laptop.+* Put it on a desktop.+* Put it on some server in the local network.+* Put it on a remote VPS.++I'll use the VPS option, but these instructions should work for+any of the above.++ # ssh server+ server# sudo apt-get install git-annex++Clone the central repository as before. (If the clone fails, you need+to add your server's ssh public key to github -- see+[this page](http://help.github.com/ssh-issues/).)++ server# git clone git@github.com:joeyh/techtalks.git+ server# cd techtalks+ server# git config remote.origin.annex-ignore true+ server# git annex init 'backup'+ init backup (merging origin/git-annex into git-annex...) ok++Notice that the server does not have the contents of any of the files yet.+If you run `ls`, you'll see broken symlinks. We want to populate this+backup with the file contents, by copying them from your laptop.++Back on your laptop, you need to configure a git remote for the backup.+Adjust the ssh url as needed to point to wherever the backup is. (If it+was on a local USB drive, you'd use the path to the repository instead.)++ # git remote add backup ssh://server/~/techtalks++Now git-annex on your laptop knows how to reach the backup repository,+and can do things like copy files to it:++ # git annex copy --to backup git-annex_coding_in_haskell.ogg+ copy git-annex_coding_in_haskell.ogg (checking backup...)+ 12877824 2% 255.11kB/s 00:00+ ok++You can also `git annex move` files to it, to free up space on your laptop.+And then you can `git annex get` files back to your laptop later on, as+desired.++After you use git-annex to move files around, remember to push, +which will broadcast its updated location information.++ # git push++## take it farther++Of course you can create as many checkouts as you desire. If you have a+desktop machine too, you can make a checkout there, and use `git remote+add` to also let your desktop access the backup repository. ++You can add remotes for each direct connection between machines you find you+need -- so make the laptop have the desktop as a remote, and the desktop+have the laptop as a remote, and then on either machine git-annex can+access files stored on the other.
@@ -0,0 +1,63 @@+You can use git-annex as a podcatcher, to download podcast contents.+No additional software is required, but your git-annex must be built+with the Feeds feature (run `git annex version` to check).++All you need to do is put something like this in a cron job:++`cd somerepo && git annex importfeed http://url/to/podcast http://other/podcast/url`++This downloads the urls, and parses them as RSS, Atom, or RDF feeds.+All enclosures are downloaded and added to the repository, the same as if you+had manually run `git annex addurl` on each of them.++git-annex will avoid downloading a file from a feed if its url has already+been stored in the repository before. So once a file is downloaded,+you can move it around, delete it, `git annex drop` its content, etc,+and it will not be downloaded again by repeated runs of+`git annex importfeed`. Just how a podcatcher should behave.++## templates++To control the filenames used for items downloaded from a feed,+there's a --template option. The default is+`--template='${feedtitle}/${itemtitle}${extension}'`++Other available template variables: +feedauthor, itemauthor, itemsummary, itemdescription, itemrights, itemid++## catching up++To catch up on a feed without downloading its contents,+use `git annex importfeed --relaxed`, and delete the symlinks it creates.+Next time you run `git annex addurl` it will only fetch any new items.++## fast mode++To add a feed without downloading its contents right now,+use `git annex importfeed --fast`. Then you can use `git annex get` as+usual to download the content of an item.++## storing the podcast list in git++You can check the list of podcast urls into git right next to the+files it downloads. Just make a file named feeds and add one podcast url+per line.++Then you can run git-annex on all the feeds:++`xargs git-annex importfeed < feeds`++## distributed podcatching++A nice benefit of using git-annex as a podcatcher is that you can+run `git annex importfeed` on the same url in different clones+of a repository, and `git annex sync` will sync it all up.++## centralized podcatching++You can also have a designated machine which always fetches all podcstas+to local disk and stores them. That way, you can archive podcasts with+time-delayed deletion of upstream content. You can also work around slow+downloads upstream by podcatching to a server with ample bandwidth or work+around a slow local Internet connection by podcatching to your home server+and transferring to your laptop on demand.
@@ -0,0 +1,28 @@+dropboxannex+=========++Hook program for gitannex to use dropbox as backend++# Requirements:++ python2++Credit for the Dropbox api interface goes to Dropbox.++# Install+Clone the git repository in your home folder.++ git clone git://github.com/TobiasTheViking/dropboxannex.git ++This should make a ~/dropboxannex folder++# Setup+Run the program once to set it up.++ cd ~/dropboxannex; python2 dropboxannex.py++# Commands for gitannex:++ git config annex.dropbox-hook '/usr/bin/python2 ~/dropboxannex/dropboxannex.py'+ git annex initremote dropbox type=hook hooktype=dropbox encryption=shared+ git annex describe dropbox "the dropbox library"
@@ -0,0 +1,20 @@+bergey has developed an emacs mode for browsing git-annex repositories,+dired style.++<https://gitorious.org/emacs-contrib/annex-mode>++Locally available files are colored differently, and pressing g runs+`git annex get` on the file at point.++----++John Wiegley has developed a brand new git-annex interaction mode for+Emacs, which aims to integrate with the standard facilities+(C-x C-q, M-x dired, etc) rather than invent its own interface.++<https://github.com/jwiegley/git-annex-el>++He has also added support to org-attach; if+`org-attach-git-annex-cutoff' is non-nil and smaller than the size+ of the file you're attaching then org-attach will `git annex add the+file`; otherwise it will "git add" it.
@@ -0,0 +1,21 @@+Maybe you had a lot of files scattered around on different drives, and you+added them all into a single git-annex repository. Some of the files are+surely duplicates of others.++While git-annex stores the file contents efficiently, it would still+help in cleaning up this mess if you could find, and perhaps remove+the duplicate files.++Here's a command line that will show duplicate sets of files grouped together:++ git annex find --include '*' --format='${file} ${escaped_key}\n' | \+ sort -k2 | uniq --all-repeated=separate -f1 | \+ sed 's/ [^ ]*$//'++Here's a command line that will remove one of each duplicate set of files:++ git annex find --include '*' --format='${file} ${escaped_key}\n' | \+ sort -k2 | uniq --repeated -f1 | sed 's/ [^ ]*$//' | \+ xargs -d '\n' git rm++--[[Joey]]
@@ -0,0 +1,39 @@+[[!comment format=mdwn+ username="mhameed"+ ip="82.32.202.53"+ subject="problems with spaces in filenames"+ date="Wed Sep 5 09:38:56 BST 2012"+ content="""++Spaces, and other special chars can make filename handeling ugly.+If you don't have a restriction on keeping the exact filenames, then +it might be easiest just to get rid of the problematic chars.++ #!/bin/bash++ function process() {+ dir="$1"+ echo "processing $dir"+ pushd $dir >/dev/null 2>&1++ for fileOrDir in *; do+ nfileOrDir=`echo "$fileOrDir" | sed -e 's/\[//g' -e 's/\]//g' -e 's/ /_/g' -e "s/'//g" `+ if [ "$fileOrDir" != "$nfileOrDir" ]; then+ echo renaming $fileOrDir to $nfileOrDir+ git mv "$fileOrDir" "$nfileOrDir"+ else+ echo "skipping $fileOrDir, no need to rename."+ fi+ done++ find ./ -mindepth 1 -maxdepth 1 -type d | while read d; do+ process "$d"+ done+ popd >/dev/null 2>&1+ }++ process .++Maybe you can run something like this before checking for duplicates.++"""]]
@@ -0,0 +1,62 @@+# Latest version 0.1.10+Hook program for gitannex to use flickr as backend.++This allows storing any type of file on flickr, not only images and movies.++# Requirements:++ python2++Credit for the flickr api interface goes to: <http://stuvel.eu/flickrapi> +Credit for the png library goes to: <https://github.com/drj11/pypng> +Credit for the png tEXt patch goes to: <https://code.google.com/p/pypng/issues/detail?id=65>++# Install++Clone the git repository in your home folder.++ git clone git://github.com/TobiasTheViking/flickrannex.git ++This should make a ~/flickrannex folder++# Setup++Run the program once to set it up. ++ cd ~/flickrannex; python2 flickrannex.py++After the setup has finished, it will print the git-annex configure lines.++# Configuring git-annex++ git config annex.flickr-hook '/usr/bin/python2 ~/flickrannex/flickrannex.py'+ git annex initremote flickr type=hook hooktype=flickr encryption=shared+ git annex describe flickr "the flickr library"++# Notes++## Unencrypted mode+The photo name on flickr is currently the GPGHMACSHA1 version.++Run the following command in your annex directory+ git annex content flickr uuid include=*.jpg or include=*.jpeg or include=*.gif or include=*.png++## Encrypted mode+The current version base64 encodes all the data, which results in ~35% larger filesize.++I might look into yyenc instead. I'm not sure if it will work in the tEXt field.++Run the following command in your annex directory+ git annex content flickr exclude=largerthan=30mb++## Including directories as tags+Get get each of the directories below the top level git directory added as tags to uploads:++ git config annex.flickr-hook 'GIT_TOP_LEVEL=`git rev-parse --show-toplevel` /usr/bin/python2 %s/flickrannex.py'++In this case the image:+ /home/me/annex-photos/holidays/2013/Greenland/img001.jpg+would get the following tags: "holidays" "2013" "Greenland"+(assuming "/home/me/annex-photos" is the top level in the annex...)++Caveat Emptor - Tags will *always* be NULL for indirect repos - we don't (easily) know the human-readable file name.
@@ -0,0 +1,13 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawmkBwMWvNKZZCge_YqobCSILPMeK6xbFw8"+ nickname="develop"+ subject="comment 10"+ date="2013-06-07T09:39:59Z"+ content="""+I'm not even sure if chunksize is exposed to the hooks at all.++As it is, the hook will check the filesize, and if the filesize is more than 30mbyte it will exit 1.++Chunking may be implemented down the road. I do believe joeyh might have some plans that will touch this issue, so I'd rather wait. Than re-invent the wheel yet again.++"""]]
@@ -0,0 +1,46 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawnaH44G3QbxBAYyDwy0PbvL0ls60XoaR3Y"+ nickname="Nigel"+ subject="git annex get failed"+ date="2013-08-02T14:29:30Z"+ content="""+Hi, I am coming back to this and testing Flickr as a repository for moving files about and have run into what may be my very basic misunderstanding with vanilla annex.++I copied one file to Flickr and dropped it elsewhere (--force). I assumed that the file was on Flickr ok but that the numcopies setting required the force because of the semi-trust level of the Flickr remote.++Then I find I can't get the file back, even though there is a record of it from whereis.++Can you help enlighten me as to what am I missing? I assumed whereis would only report files that exist and can be copied back. If not my error, I can raise bug or search for logs. Thanks in advance for any help.++[[!format perl \"\"\"+++nrb@nrb-ThinkPad-T61:~/tmp$ git annex whereis+whereis libpeerconnection.log (3 copies) + 31124688-0792-4214-9e00-7ed115aa6b8e -- flickr (the flickr library)+ 3e3d40d7-de8f-4591-a4ab-747d74a3b278 -- origin (my laptop)+ ec2d64fc-30d6-48b4-99bf-7b1bc22d420d -- portable USB drive+ok+whereis test.cgi (1 copy) + 31124688-0792-4214-9e00-7ed115aa6b8e -- flickr (the flickr library)+ok+whereis walkthrough.sh (3 copies) + 31124688-0792-4214-9e00-7ed115aa6b8e -- flickr (the flickr library)+ 3e3d40d7-de8f-4591-a4ab-747d74a3b278 -- origin (my laptop)+ ec2d64fc-30d6-48b4-99bf-7b1bc22d420d -- portable USB drive+ok+whereis walkthrough.sh~ (3 copies) + 31124688-0792-4214-9e00-7ed115aa6b8e -- flickr (the flickr library)+ 3e3d40d7-de8f-4591-a4ab-747d74a3b278 -- origin (my laptop)+ ec2d64fc-30d6-48b4-99bf-7b1bc22d420d -- portable USB drive+ok+nrb@nrb-ThinkPad-T61:~/tmp$ git annex get test.cgi+get test.cgi (from flickr...) ++git-annex: /home/nrb/tmp/.git/annex/tmp/SHA256E-s48--a01eedbee949120aeda41e566f9ae8faef1c2bacaa6d7bb8e45050fb8df6d09d.cgi: rename: does not exist (No such file or directory)+failed+git-annex: get: 1 failed+nrb@nrb-ThinkPad-T61:~/tmp$ ++\"\"\"]]+"""]]
@@ -0,0 +1,58 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawnaH44G3QbxBAYyDwy0PbvL0ls60XoaR3Y"+ nickname="Nigel"+ subject="re: git annex get failed"+ date="2013-08-02T15:02:14Z"+ content="""+Another try - this time a slightly simpler setup using my version of the walkthrough commands++[[!format bash \"\"\"++nrb@nrb-ThinkPad-T61:~/repos/annex/laptop-annex$ git annex drop walkthrough.sh --from usbdrive+drop usbdrive walkthrough.sh ok+(Recording state in git...)+nrb@nrb-ThinkPad-T61:~/repos/annex/laptop-annex$ git annex move walkthrough.sh --to flickr+move walkthrough.sh (gpg) (checking flickr...) (to flickr...) +/home/nrb/repos/gits/flickrannex/flickrannex.py:92: FutureWarning: The behavior of this method will change in future versions. Use specific 'len(elem)' or 'elem is not None' test instead.+ if res:+/home/nrb/repos/gits/flickrannex/flickrannex.py:100: FutureWarning: The behavior of this method will change in future versions. Use specific 'len(elem)' or 'elem is not None' test instead.+ if res:+ok+(Recording state in git...)+nrb@nrb-ThinkPad-T61:~/repos/annex/laptop-annex$ git annex whereis+whereis walkthrough.sh (1 copy) + 161b7af0-2075-4314-9767-308a49b86018 -- flickr (the flickr library)+ok+whereis walkthrough.sh~ (3 copies) + 161b7af0-2075-4314-9767-308a49b86018 -- flickr (the flickr library)+ 7803d853-d231-4bb4-b696-f12a950fb96b -- here (my laptop)+ d60d75f9-d878-4214-af20-fa055134ae77 -- usbdrive (portable USB drive)+ok+nrb@nrb-ThinkPad-T61:~/repos/annex/laptop-annex$ git annex get walkthrough.sh+get walkthrough.sh (from flickr...) (gpg) +git-annex: /home/nrb/repos/annex/laptop-annex/.git/annex/tmp/GPGHMACSHA1--02f600d7e8b071d2945270fd5e7fc26dd066ff31: openBinaryFile: does not exist (No such file or directory)+gpg: decrypt_message failed: eof++ Unable to access these remotes: flickr++ Try making some of these repositories available:+ 161b7af0-2075-4314-9767-308a49b86018 -- flickr (the flickr library)+failed+git-annex: get: 1 failed+nrb@nrb-ThinkPad-T61:~/repos/annex/laptop-annex$ git annex fsck --from flickr+fsck walkthrough.sh (gpg) (checking flickr...) (fixing location log) + ** Based on the location log, walkthrough.sh+ ** was expected to be present, but its content is missing.++ ** No known copies exist of walkthrough.sh+failed+fsck walkthrough.sh~ (checking flickr...) (fixing location log) + ** Based on the location log, walkthrough.sh~+ ** was expected to be present, but its content is missing.+failed+(Recording state in git...)+git-annex: fsck: 2 failed+nrb@nrb-ThinkPad-T61:~/repos/annex/laptop-annex$ ++\"\"\" ]]+"""]]
@@ -0,0 +1,12 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawmkBwMWvNKZZCge_YqobCSILPMeK6xbFw8"+ nickname="develop"+ subject="Version 0.1.10 pushed"+ date="2013-09-11T20:31:25Z"+ content="""+Since the initial release of this hook a lot of issues have been fixed, and a few features added.++I would highly suggest that everyone who is using this hook update to the latest version as i would consider one of the bugs to be fairly major.+++"""]]
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawmkBwMWvNKZZCge_YqobCSILPMeK6xbFw8"+ nickname="develop"+ subject="comment 2"+ date="2013-06-05T21:33:42Z"+ content="""+Get the statically linked version from here http://git-annex.branchable.com/install/Linux_standalone/++I believe the new hook format was introduced in version 4.20130521+"""]]
@@ -0,0 +1,30 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawnaH44G3QbxBAYyDwy0PbvL0ls60XoaR3Y"+ nickname="Nigel"+ subject="missing configuration for flickr-checkpresent-hook"+ date="2013-06-05T20:44:25Z"+ content="""+<https://github.com/TobiasTheViking/flickrannex/issues/3>++9 days ago: [the annex] \"hook format a few versions ago, and this is using the new hook format\".++Looks very handy. I am just starting with this, but can't seem to get it working as a remote after following the simple walkthrough. All goes well until:++ $ git annex copy . --to flickr+ copy walkthrough.sh (checking flickr...) + missing configuration for flickr-checkpresent-hook+ git-annex: checkpresent hook misconfigured++my Ubuntu 12.04:++ $ git annex version+ git-annex version: 4.20130516.1+ build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP+ local repository version: 3+ default repository version: 3+ supported repository versions: 3 4+ upgrade supported from repository versions: 0 1 2++I guess my \"git-annex version is still too old\"? Any idea what version is needed? Even better if I can figure out which Linux distribution/release has the most up to date version of annex.++"""]]
@@ -0,0 +1,14 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawmkBwMWvNKZZCge_YqobCSILPMeK6xbFw8"+ nickname="develop"+ subject="comment 4"+ date="2013-06-05T22:02:29Z"+ content="""+The path for the binary \"/usr/bin/python2\" is wrong.++It could be any of /usr/bin/python /usr/bin/python2.6 /usr/bin/python2.7++Or maybe in /usr/local/bin++you can try running \"which python\" or \"which python2\" to get the real path.+"""]]
@@ -0,0 +1,24 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawnaH44G3QbxBAYyDwy0PbvL0ls60XoaR3Y"+ nickname="Nigel"+ subject="missing configuration for flickr-checkpresent-hook"+ date="2013-06-05T22:00:48Z"+ content="""+Many thanks.++I used gitannex-install and was left with a slight anomaly:++ Installing...........done+ git-annex version 4.20130601 has been installed+ $ git-annex version+ git-annex version: 4.20130531-g5df09b5++But I guess this includes the new hook format. I get a bit further:++ $ git annex copy . --to flickr+ copy walkthrough.sh (checking flickr...) (user error (sh [\"-c\",\"/usr/bin/python2 /home/nrb/repos/gits/flickrannex/flickrannex.py\"] exited 1)) failed+ copy walkthrough.sh~ (checking flickr...) (user error (sh [\"-c\",\"/usr/bin/python2 /home/nrb/repos/gits/flickrannex/flickrannex.py\"] exited 1)) failed+ git-annex: copy: 2 failed+++"""]]
@@ -0,0 +1,17 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawnaH44G3QbxBAYyDwy0PbvL0ls60XoaR3Y"+ nickname="Nigel"+ subject="comment 5"+ date="2013-06-05T22:11:14Z"+ content="""+Thanks, but on my machine I get:++ $ which python2+ /usr/bin/python2++I have scripted all my walkthrough commands, blowing away the test repositories and flickr settings first each time. This re-runs the flickr scripts and git config annex.flickr-hook etc.++I can't spot anything here.+++"""]]
@@ -0,0 +1,12 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawmWg4VvDTer9f49Y3z-R0AH16P4d1ygotA"+ nickname="Tobias"+ subject="comment 6"+ date="2013-06-06T09:44:11Z"+ content="""+That's weird...++You could try adding \"--dbglevel 1 --stderr\" arguments to the hook command and give me the output. But the way i read the log it seems like it doesn't even launch the python intrepreter. I might be wrong though.+++"""]]
@@ -0,0 +1,12 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawnaH44G3QbxBAYyDwy0PbvL0ls60XoaR3Y"+ nickname="Nigel"+ subject="Unencrypted flickr can only accept picture and video files"+ date="2013-06-06T10:24:58Z"+ content="""+Thanks and sorry to trouble you, it is my error, I picked unencrypted option (thinking it would be less of an issue) and am using a text file for test, gave an error line:++ 10:53:07 [flickrannex-0.1.5] main : 'Unencrypted flickr can only accept picture and video files'++I've not looked through your code yet, but could that message be printed when not in debug mode?+"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawmWg4VvDTer9f49Y3z-R0AH16P4d1ygotA"+ nickname="Tobias"+ subject="comment 8"+ date="2013-06-06T10:51:39Z"+ content="""+I'll make it so, in the next version i push.+"""]]
@@ -0,0 +1,9 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawleVyKk2kQsB_HgEdS7w1s0BmgRGy1aay0"+ nickname="Milan"+ subject="chunksize"+ date="2013-06-07T09:09:56Z"+ content="""+Hi! Does this backend support chunksize option? If yes, is it possible to set it after the remote has been added to the repository?+Thanks, Milan.+"""]]
@@ -0,0 +1,112 @@+[git-remote-gcrypt](https://github.com/blake2-ppc/git-remote-gcrypt/)+adds support for encrypted remotes to git. The git-annex +[[gcrypt special remote|special_remotes/gcrypt]] allows git-annex to+also store its files in such repositories. Naturally, git-annex encrypts+the files it stores too, so everything stored on the remote is encrypted.++Here are some ways you can use this awesome stuff..++[[!toc ]]++This page will show how to set it up at the command line, but the git-annex+[[assistant]] can also be used to help you set up encrypted git+repositories.++## prerequisites++* Install+[git-remote-gcrypt](https://github.com/joeyh/git-remote-gcrypt/)+* Install git-annex version 4.20130909 or newer.++## encrypted backup drive++Let's make a USB drive into an encrypted backup repository. It will contain+both the full contents of your git repository, and all the files you+instruct git-annex to store on it, and everything will be encrypted so that+only you can see it.++First, you need to set up a gpg key. You might consider generating a+special purpose key just for this use case, since you may end up wanting to+put the key on multiple machines that you would not trust with your+main gpg key. You need to tell git-annex the keyid of the key.++ git init --bare /mnt/encryptedbackup+ git annex initremote encryptedbackup type=gcrypt gitrepo=/mnt/encryptedbackup keyid=$mykey+ git annex sync encryptedbackup+ git annex copy --to encryptedbackup ...++Note that if you lose your gpg key, it will be *impossible* to get the+data out of your encrypted backup. You need to find a secure way to store a+backup of your gpg key. Printing it out and storing it in a safe deposit box,+for example.++You can actually specifiy keyid= as many times as you like to allow any one+of a set of gpg keys to access this repository. So you could add a friend's+key, or another gpg key you have.++To restore from the backup, just plug the drive into any machine that has+the gpg key used to encrypt it, and then:++ git clone gcrypt::/mnt/encryptedbackup restored+ cd restored+ git annex enableremote encryptedbackup gitrepo=/mnt/encryptedbackup+ git annex get --from encryptedbackup++## encrypted git-annex repository on a ssh server++If you have a ssh server that has rsync installed, you can set up an+encrypted repository there. Works just like the encrypted drive except+without the cable.++First, on the server, run:++ git init --bare encryptedrepo++(Also, install git-annex on the server if it's possible & easy to do so.+While this will work without git-annex being installed on the server, it+is recommended to have it installed.)++Now, in your existing git-annex repository:++ git annex initremote encryptedrepo type=gcrypt gitrepo=ssh://my.server/home/me/encryptedrepo keyid=$mykey+ git annex sync encryptedrepo+ git annex copy --to encryptedrepo ...++If you're going to be sharing this repository with others, be sure to also+include their keyids, by specifying keyid= repeatedly.++Now that the repo is set up, anyone who has access to it and has one of the keys+used to encrypt it can check it out:++ git clone gcrypt::ssh://my.server/home/me/encryptedrepo myrepo+ cd myrepo+ git annex enableremote encryptedrepo gitrepo=ssh://my.server/home/me/encryptedrepo+ git annex get --from encryptedrepo++## private encrypted git remote on hosting site++You can use gcrypt to store your git repository in encrypted form on any+hosting site that supports git. Only you can decrypt its contents.+Using it this way, git-annex does not store large files on the hosting site; it's+only used to store your git repository itself.++ git remote add encrypted gcrypt::ssh://hostingsite/myrepo.git+ git config git push encrypted master git-annex++Now you can carry on using git-annex with your new repository. For example,+`git annex sync` will sync with it.++To check out the repository from the hosting site, use the same gcrypt::+url you used when setting it up:++ git clone gcrypt::ssh://hostingsite/myrepo.git++## multiuser encrypted git remote on hosting site++Suppose two users want to share an encrypted git remote. Both of you+need to set up the remote, and configure gcrypt to encrypt it so that both+of you can see it.+ + git remote add sharedencrypted gcrypt::ssh://hostingsite/myrepo.git+ git config remote.sharedencrypted.gcryt-participants "$mykey $friendkey"+ git config git push sharedencrypted master git-annex
@@ -0,0 +1,28 @@+googledriveannex+=========++Hook program for gitannex to use Google Drive as backend++# Requirements:++ python2++Credit for the googledrive api interface goes to google++## Install+Clone the git repository in your home folder.++ git clone git://github.com/TobiasTheViking/googledriveannex.git ++This should make a ~/googledriveannex folder++## Setup+Run the program once to make an empty config file++ cd ~/googledriveannex; python2 googledriveannex.py++## Commands for gitannex:++ git config annex.googledrive-hook '/usr/bin/python2 ~/googledriveannex/googledriveannex.py'+ git annex initremote googledrive type=hook hooktype=googledrive encryption=shared+ git annex describe googledrive "the googledrive library"
@@ -0,0 +1,27 @@+imapannex+=========++Hook program for gitannex to use imap as backend++# Requirements:++ python2++# Install+Clone the git repository in your home folder.++ git clone git://github.com/TobiasTheViking/imapannex.git ++This should make a ~/imapannex folder++# Setup+Run the program once to set it up.++ cd ~/imapannex; python2 imapannex.py++# Commands for gitannex:++ git config annex.imap-hook '/usr/bin/python2 ~/imapannex/imapannex.py'+ git annex initremote imap type=hook hooktype=imap encryption=shared+ git annex describe imap "the imap library"+ git annex content imap exclude=largerthan=30mb
@@ -0,0 +1,41 @@+[Megaannex](https://github.com/TobiasTheViking/megaannex)+is a hook program for git-annex to use mega.co.nz as backend++# Requirements:++ python2+ requests>=0.10+ pycrypto++Credit for the mega api interface goes to:+<https://github.com/richardasaurus/mega.py>++## Install++Clone the git repository in your home folder.++ git clone git://github.com/TobiasTheViking/megaannex.git ++This should make a ~/megannex folder++## Setup++Run the program once to make an empty config file.++ cd ~/megaannex; python2 megaannex.py++Edit the megaannex.conf file. Add your mega.co.nz username, password, and folder name.++## Configuring git-annex++ git config annex.mega-hook '/usr/bin/python2 ~/megaannex/megaannex.py'++ git annex initremote mega type=hook hooktype=mega encryption=shared+ git annex describe mega "the mega.co.nz library"++## Notes++You may need to use a different command than "python2", depending+on your python installation.++-- Tobias
@@ -0,0 +1,16 @@+Maybe you started out using the WORM backend, and have now configured+git-annex to use SHA1. But files you added to the annex before still+use the WORM backend. There is a simple command that can migrate that+data:++ # git annex migrate my_cool_big_file+ migrate my_cool_big_file (checksum...) ok++You can only migrate files whose content is currently available. Other+files will be skipped.++After migrating a file to a new backend, the old content in the old backend+will still be present. That is necessary because multiple files+can point to the same content. The `git annex unused` subcommand can be+used to clear up that detritus later. Note that hard links are used,+to avoid wasting disk space.
@@ -0,0 +1,77 @@+Scenario+--------++You are a new git-annex user. You have already files spread around many computers and wish to migrate those into git-annex, without having to recopy all files all over the place.++Let's say, for example, you have a server, named `marcos` and a workstation named `angela`. You have your audio collection stored in `/srv/mp3` in `marcos` and `~/mp3` on `angela`, but only `marcos` has all the files, and `angela` only has a subset.++We also assume that `marcos` has an SSH server.++How do you add all this stuff to git-annex?++Create the biggest git-annex repository+---------------------------------------++Start with `marcos`, with the complete directory:++ cd /srv/mp3+ git init+ git annex init+ git annex add .+ git commit -m"git annex yay"++This will checksum all files and add them to the `git-annex` branch of the git repository. Wait for this process to complete.++Create the smaller repo and synchronise+---------------------------------------++On `angela`, we want to synchronise the git annex metadata with `marcos`. We need to initialize a git repo with `marcos` as a remote:++ cd ~/mp3+ git init+ git remote add marcos marcos.example.com:/srv/mp3+ git fetch marcos+ git annex status # this should display the two repos+ git annex add .++This will, again, checksum all files and add them to git annex. Once that is done, you can verify that the files are really the same as marcos with `whereis`:++ git annex whereis++This should display something like:++ whereis Orange Seeds/I remember.wav (2 copies)+ b7802161-c984-4c9f-8d05-787a29c41cfe -- marcos (anarcat@marcos:/srv/mp3)+ c2ca4a13-9a5f-461b-a44b-53255ed3e2f9 -- here (anarcat@angela)+ ok++Once you are sure things went on okay, you can synchronise this with `marcos`:++ git annex sync++This will push the metadata information to marcos, so it knows which files are available on `angela`. From there on, you can freely get and move files between the two repos!++Importing files from a third directory+--------------------------------------++Say that some files on `angela` are actually spread out outside of the `~/mp3` directory. You can use the `git annex import` command to add those extra directories:++ cd ~/mp3+ git annex import ~/music/++(!) Be careful that `~/music` is not a git-annex repository, or this will [[destroy it!|bugs/git annex import destroys a fellow git annex repository]].++Deleting deleted files+----------------------++It is quite possible some files were removed (or renamed!) on `marcos` but not on `angela`, since it was synchronised only some time ago. A good way to find out about those files is to use the `--not --in` argument, for example, on `angela`:++ git annex whereis --in here --not --in marcos++This will show files that are on `angela` and not on `marcos`. They could be new files that were only added on `angela`, so be careful! A manual analysis is necessary, but let's say you are certain those files are not relevant anymore, you can delete them from `angela`:++ git annex drop <file>++If the file is a renamed or modified version from the original, you may need to use `--force`, but be careful! If you delete the wrong file, it will be lost forever!++> (!) Maybe this wouldn't happen with [[direct mode]] and an fsck? --[[anarcat]]
@@ -0,0 +1,69 @@+After you've used git-annex for a while, you will have data in your repository+that you don't want to keep in the limited disk space of a laptop or a server,+but that you don't want to entirely delete.++This is where git-annex's support for offline archive drives shines.+You can move old files to an archive drive, which can be kept offline if+it's not practical to keep it spinning. Better, you can move old files to+two or more archive drives, in case one of them later fails to spin up. +(One consideration when [[future_proofing]] your archive.)++To set up an archive drive, you can take any removable drive, format+it with a filesystem you'll be able to read some years later, and then follow+the [[walkthrough]] to set up a repository on it that is a git remote of +the repository in your computer you want to archive. In short:++ cd /media/archive+ git clone ~/annex+ cd ~/annex+ git remote add archivedrive /media/archive/annex+ git annex sync archivedrive++Don't forget to tell git-annex this is an archive drive (or perhaps a backup+drive). Also, give the drive a description that matches something you write on+its label, so you can find it later:++ git annex group archivedrive archive+ git annex content archivedrive standard+ git annex describe archivedrive "my first archive drive (SATA)"++Or you can use the assistant to set up the drive for you. +(Nice video tutorial here: [[videos/git-annex_assistant_archiving]])++(Keeping the archive drive in an offsite location? Consider encrypting+it! See [[fully_encrypted_git_repositories_with_gcrypt]].)++Then, when the archive drive is plugged in, you can easily copy files to+it:++ cd ~/annex+ git-annex copy --auto --to archivedrive++Or, if you're using the assistant, it will automatically notice when the drive+gets plugged in and copy files that need to be archived.++When you want to get rid of the local file, leaving only the copy on the+archive, you can just:++ git annex drop file++The archive drive has to be plugged in for this to work, so git-annex+can verify it still has the file. If you had configured git-annex to+always store 2 [[copies]], it will need 2 archive drives plugged in.+You may find it useful to configure a [[trust]] setting for the drive to+avoid needing to haul it out of storage to drop a file.++Now the really nice thing. When your archive drive gets filled up, you+can simply remove it, store it somewhere safe, and replace it with a new+drive, which can be mounted at the same location for simplicity. Set up+the new drive the same way described above, and use it to archive even more+files.++Finally, when you want to access one of the files you archived, you can+just ask for it:++ git annex get file++If necessary git-annex will tell you which archive drive you need to+pull out of storage to get the file back. This is where the description+you entered earlier comes in handy.
@@ -0,0 +1,28 @@+owncloudannex+=========++Hook program for gitannex to use owncloud as backend++# Requirements:++ python2++Credit for the Owncloud api interface goes to me.++# Install+Clone the git repository in your home folder.++ git clone git://github.com/TobiasTheViking/owncloudannex.git ++This should make a ~/owncloudannex folder++# Setup+Run the program once to set it up.++ cd ~/owncloudannex; python2 owncloudannex.py++# Commands for gitannex:++ git config annex.owncloud-hook '/usr/bin/python2 ~/owncloudannex/owncloudannex.py'+ git annex initremote owncloud type=hook hooktype=owncloud encryption=shared+ git annex describe owncloud "the owncloud library"
@@ -0,0 +1,40 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawkQvRLq7nMMEGoEKuYx9oaf67IC0nZfmVI"+ nickname="chung yan"+ subject="owncloud hook exited nonzero"+ date="2013-07-10T05:03:47Z"+ content="""+hi ++I got the above message, and cannot sync to my owncloud. Here is the log file i had: ++>[2013-07-10 12:30:31 HKT] main: starting assistant version 4.20130627+(scanning...) [2013-07-10 12:30:31 HKT] Watcher: Performing startup scan+(started...) git-annex: Daemon is already running.+git-annex: Daemon is already running.+[2013-07-10 12:44:04 HKT] Committer: Adding sync2Servers.sh++>add syncByRsync/sync2Servers.sh (checksum...) [2013-07-10 12:44:04 HKT] Committer: Committing changes to git+(gpg) ++>owncloud hook exited nonzero!+>git-annex: Daemon is already running.+[2013-07-10 12:51:07 HKT] main: Syncing with owncloud ++>owncloud hook exited nonzero!+>[2013-07-10 12:53:10 HKT] Committer: Adding 2 files+ok+(Recording state in git...)+(Recording state in git...)+add syncByRsync/DSCN1810.JPG (checksum...) ok+add syncByRsync/DSCN1810.JPG (checksum...) [2013-07-10 12:53:10 HKT] Committer: Committing changes to git++>owncloud hook exited nonzero!+[2013-07-10 12:53:50 HKT] main: Syncing with owncloud + owncloud hook exited nonzero!+ owncloud hook exited nonzero!++thanks++yan+"""]]
@@ -0,0 +1,15 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawmLB39PC89rfGaA8SwrsnB6tbumezj-aC0"+ nickname="Tobias"+ subject="comment 2"+ date="2013-07-10T08:21:39Z"+ content="""+Personally i've only seen that when the server ran out of space. But lets see what is going on.++Please run this command++git config annex.owncloud-hook '/usr/bin/python2 ~/owncloudannex/owncloudannex.py --dbglevel 1 --stderr'++And then replicate the error. It should give me some debug information to work with.++"""]]
@@ -0,0 +1,87 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawkQvRLq7nMMEGoEKuYx9oaf67IC0nZfmVI"+ nickname="chung yan"+ subject="comment 3"+ date="2013-07-10T08:46:27Z"+ content="""+hi Tobias ++Thanks your suggestion for list of my error log, here it is: ++[2013-07-10 16:27:58 HKT] main: starting assistant version 4.20130627+(scanning...) [2013-07-10 16:27:58 HKT] Watcher: Performing startup scan+(started...) [2013-07-10 16:28:14 HKT] Committer: Adding 2 files++add syncByRsync/sync2Servers.sh (checksum...) ok+add syncByRsync/sync2Servers.sh (checksum...) [2013-07-10 16:28:14 HKT] Committer: Committing changes to git+[2013-07-10 16:31:12 HKT] Watcher: add direct DSCN1810.JPG+[2013-07-10 16:31:12 HKT] read: lsof [\"-F0can\",\"+d\",\"/home/yan/annex_testing/.git/annex/tmp/\"]+[2013-07-10 16:31:12 HKT] Committer: Adding DSCN1810.JPG+ok+(Recording state in git...)+(Recording state in git...)+add DSCN1810.JPG [2013-07-10 16:31:12 HKT](checksum...) Watcher: add direct DSCN1810.JPG+[2013-07-10 16:31:12 HKT] read: sha256sum [\"/home/yan/annex_testing/.git/annex/tmp/DSCN181012023.JPG\"]++ DSCN1810.JPG changed while it was being added+[2013-07-10 16:31:12 HKT] Committer: delaying commit of 1 changes+[2013-07-10 16:31:13 HKT] read: lsof [\"-F0can\",\"+d\",\"/home/yan/annex_testing/.git/annex/tmp/\"]+[2013-07-10 16:31:13 HKT] Committer: Adding 2 files+failed+add DSCN1810.JPG (checksum...) [2013-07-10 16:31:13 HKT] read: sha256sum [\"/home/yan/annex_testing/.git/annex/tmp/DSCN181012023.JPG\"]+[2013-07-10 16:31:13 HKT] chat: git [\"--git-dir=/home/yan/annex_testing/.git\",\"--work-tree=/home/yan/annex_testing\",\"hash-object\",\"-t\",\"blob\",\"-w\",\"--stdin\",\"--no-filters\"]+ok+add DSCN1810.JPG (checksum...) [2013-07-10 16:31:13 HKT] read: sha256sum [\"/home/yan/annex_testing/.git/annex/tmp/DSCN181012024.JPG\"]+[2013-07-10 16:31:13 HKT] chat: git [\"--git-dir=/home/yan/annex_testing/.git\",\"--work-tree=/home/yan/annex_testing\",\"hash-object\",\"-t\",\"blob\",\"-w\",\"--stdin\",\"--no-filters\"]+[2013-07-10 16:31:13 HKT] Committer: committing 2 changes+[2013-07-10 16:31:13 HKT] Committer: Committing changes to git+[2013-07-10 16:31:13 HKT] feed: git [\"--git-dir=/home/yan/annex_testing/.git\",\"--work-tree=/home/yan/annex_testing\",\"update-index\",\"-z\",\"--index-info\"]+[2013-07-10 16:31:13 HKT] read: git [\"--git-dir=/home/yan/annex_testing/.git\",\"--work-tree=/home/yan/annex_testing\",\"commit\",\"--allow-empty-message\",\"--no-edit\",\"-m\",\"\",\"--quiet\",\"--no-verify\"]+[2013-07-10 16:31:13 HKT] Committer: queued Upload UUID \"df02d32a-7e3a-4e12-a417-7f1d1a1cf1a6\" DSCN1810.JPG Nothing : new file created+[2013-07-10 16:31:13 HKT] chat: git [\"--git-dir=/home/yan/annex_testing/.git\",\"--work-tree=/home/yan/annex_testing\",\"hash-object\",\"-w\",\"--stdin-paths\",\"--no-filters\"]+[2013-07-10 16:31:13 HKT] feed: git [\"--git-dir=/home/yan/annex_testing/.git\",\"--work-tree=/home/yan/annex_testing\",\"update-index\",\"-z\",\"--index-info\"]+[2013-07-10 16:31:13 HKT] read: git [\"--git-dir=/home/yan/annex_testing/.git\",\"--work-tree=/home/yan/annex_testing\",\"show-ref\",\"--hash\",\"refs/heads/git-annex\"]+[2013-07-10 16:31:13 HKT] read: git [\"--git-dir=/home/yan/annex_testing/.git\",\"--work-tree=/home/yan/annex_testing\",\"write-tree\"]+[2013-07-10 16:31:13 HKT] chat: git [\"--git-dir=/home/yan/annex_testing/.git\",\"--work-tree=/home/yan/annex_testing\",\"commit-tree\",\"a8337a989b58b29eee5fd2fa7a4c0b8ec45d5e59\",\"-p\",\"refs/heads/git-annex\"]+[2013-07-10 16:31:13 HKT] call: git [\"--git-dir=/home/yan/annex_testing/.git\",\"--work-tree=/home/yan/annex_testing\",\"update-ref\",\"refs/heads/git-annex\",\"267bf35da4d9abe5ed7fe82ea5df8a8df2ddf940\"]+[2013-07-10 16:31:13 HKT] read: git [\"--git-dir=/home/yan/annex_testing/.git\",\"--work-tree=/home/yan/annex_testing\",\"symbolic-ref\",\"HEAD\"]+[2013-07-10 16:31:13 HKT] read: git [\"--git-dir=/home/yan/annex_testing/.git\",\"--work-tree=/home/yan/annex_testing\",\"show-ref\",\"refs/heads/master\"]+[2013-07-10 16:31:13 HKT] Transferrer: Transferring: Upload UUID \"df02d32a-7e3a-4e12-a417-7f1d1a1cf1a6\" DSCN1810.JPG Nothing+[2013-07-10 16:31:13 HKT] read: git [\"--git-dir=/home/yan/annex_testing/.git\",\"--work-tree=/home/yan/annex_testing\",\"show-ref\",\"git-annex\"]+[2013-07-10 16:31:13 HKT] call: git-annex [\"transferkeys\",\"--readfd\",\"46\",\"--writefd\",\"36\"]+[2013-07-10 16:31:13 HKT] read: git [\"--git-dir=/home/yan/annex_testing/.git\",\"--work-tree=/home/yan/annex_testing\",\"show-ref\",\"--hash\",\"refs/heads/git-annex\"]+[2013-07-10 16:31:13 HKT] read: git [\"--git-dir=/home/yan/annex_testing/.git\",\"--work-tree=/home/yan/annex_testing\",\"log\",\"refs/heads/git-annex..267bf35da4d9abe5ed7fe82ea5df8a8df2ddf940\",\"--oneline\",\"-n1\"]+[2013-07-10 16:31:13 HKT] read: git [\"--git-dir=/home/yan/annex_testing/.git\",\"--work-tree=/home/yan/annex_testing\",\"show-ref\",\"git-annex\"]+[2013-07-10 16:31:13 HKT] read:[2013-07-10 16:31:13 HKT] read: git [\"--git-dir=/home/yan/annex_testing/.git\",\"--work-tree=/home/yan/annex_testing\",\"ls-tree\",\"-z\",\"--\",\"refs/heads/git-annex\",\"uuid.log\",\"remote.log\",\"trust.log\",\"group.log\",\"preferred-content.log\"]+ git [\"--git-dir=/home/yan/annex_testing/.git\",\"--work-tree=/home/yan/annex_testing\",\"show-ref\",\"--hash\",\"refs/heads/git-annex\"]+[2013-07-10 16:31:13 HKT] read: git [\"--git-dir=/home/yan/annex_testing/.git\",\"--work-tree=/home/yan/annex_testing\",\"log\",\"refs/heads/git-annex..267bf35da4d9abe5ed7fe82ea5df8a8df2ddf940\",\"--oneline\",\"-n1\"]+[2013-07-10 16:31:13 HKT] chat: git [\"--git-dir=/home/yan/annex_testing/.git\",\"--work-tree=/home/yan/annex_testing\",\"cat-file\",\"--batch\"]+(gpg) [2013-07-10 16:31:13 HKT] TransferWatcher: transfer starting: Upload UUID \"df02d32a-7e3a-4e12-a417-7f1d1a1cf1a6\" DSCN1810.JPG Nothing+[2013-07-10 16:31:13 HKT] chat: gpg [\"--batch\",\"--no-tty\",\"--use-agent\",\"--quiet\",\"--trust-model\",\"always\",\"--batch\",\"--passphrase-fd\",\"48\",\"--symmetric\",\"--force-mdc\"]+[2013-07-10 16:31:14 HKT] call: sh [\"-c\",\"/usr/bin/python2 /home/yan/annex/SocialBusiness/Resources/Infrastructure/Computer_Tools/Records/AsusU24/owncloudannex/owncloudannex.py --dbglevel 1 --stderr\"]++ 16:31:16 [owncloudannex-0.1.1] <module> : 'START'+ 16:31:16 [owncloudannex-0.1.1] main : 'ARGS: 'ANNEX_ACTION=store ANNEX_KEY=GPGHMACSHA1--0179fbbf559d5c25cf69b4e92025ff1f007d4f1f ANNEX_HASH_1=fp ANNEX_HASH_2=23 ANNEX_FILE=/home/yan/annex_testing/.git/annex/tmp/GPGHMACSHA1--0179fbbf559d5c25cf69b4e92025ff1f007d4f1f /home/yan/annex/SocialBusiness/Resources/Infrastructure/Computer_Tools/Records/AsusU24/owncloudannex/owncloudannex.py --dbglevel 1 --stderr''+ 16:31:16 [owncloudannex-0.1.1] readFile : ''/home/yan/annex/SocialBusiness/Resources/Infrastructure/Computer_Tools/Records/AsusU24/owncloudannex/owncloudannex.conf' - 'r''+ 16:31:16 [owncloudannex-0.1.1] readFile : 'Done'+ 16:31:16 [owncloudannex-0.1.1] login : ''+ 16:31:16 [owncloudannex-0.1.1] login : 'Using base: wingyan.no-ip.org - {'Authorization': 'Basic Y2h1bmd5YW41QGdtYWlsLmNvbTp5YW5fd2lraQ=='}'+ 16:31:16 [owncloudannex-0.1.1] login : 'res: <davlib.DAV instance at 0x12915f0>'+ 16:31:16 [owncloudannex-0.1.1] findInFolder : 'u'gitannex'(<type 'unicode'>) - '/'(<type 'str'>)'+ 16:31:17 [owncloudannex-0.1.1] findInFolder : 'propfind: /owncloud/remote.php/webdav - '<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<d:error xmlns:d=\"DAV:\" xmlns:s=\"http://sabredav.org/ns\">\n <s:exception>Sabre_DAV_Exception_NotAuthenticated</s:exception>\n <s:message>Username or password does not match</s:message>\n <s:sabredav-version>1.7.6</s:sabredav-version>\n</d:error>\n''+ 16:31:17 [owncloudannex-0.1.1] findInFolder : 'Failure'+ 16:31:17 [owncloudannex-0.1.1] createFolder : '/gitannex'+ 16:31:18 [owncloudannex-0.1.1] createFolder : 'Failure: 401 - '<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<d:error xmlns:d=\"DAV:\" xmlns:s=\"http://sabredav.org/ns\">\n <s:exception>Sabre_DAV_Exception_NotAuthenticated</s:exception>\n <s:message>Username or password does not match</s:message>\n <s:sabredav-version>1.7.6</s:sabredav-version>\n</d:error>\n''+++ owncloud hook exited nonzero!+[2013-07-10 16:31:18 HKT] TransferWatcher: transfer finishing: Transfer {transferDirection = Upload, transferUUID = UUID \"df02d32a-7e3a-4e12-a417-7f1d1a1cf1a6\", transferKey = Key {keyName = \"911ba6148fbcbe4afe53772f1216b8204f403ed4ee06cb90c3c3ac25e56d9402.JPG\", keyBackendName = \"SHA256E\", keySize = Just 1893431, keyMtime = Nothing}}++I figured out it is a *Username or password does not match*, and i saw the content of owncloudannex.conf as \"uname\": \"myGmail@gmail.com\", but i quickly saw my WebDAV login to owncloud as my user name, not gmail address, so i changed this \"uname\": \"my_normal_user_name_not_gmail_acc\" inside owncloudannex.conf. Finally, i got it work. So, i think, user name should not be a gmail address, should be owncloud login user name. ++Another issue, i had a look into /WebDAV.../gitannex/, it is git repos. file, for my user opinion, it is better that it is a real file content that we can see the file(such as photos) by owncloud web client directly, rather that owncloud is a file server to keep git repos only. ++Thanks++yan+"""]]
@@ -0,0 +1,17 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawmLB39PC89rfGaA8SwrsnB6tbumezj-aC0"+ nickname="Tobias"+ subject="comment 4"+ date="2013-07-10T08:54:13Z"+ content="""+Hm, an error like that it really should print without the need of debug information. I'll look into it.++And if you want the real file content, not encrypted, just change \"shared\" to \"none\" in the line:++git annex initremote owncloud type=hook hooktype=owncloud encryption=shared++I'm not sure if you can change this after you initialized the remote though. And also, the folder structure and filenames will be as you see them now on the owncloud. I'd need some more data from gitannex to make it show the real directory structure. But that doesn't seem feasible.++Why would you even want the data unencrypted on owncloud anyways? i mean on flickr, or googledocs, i kinda get it. but for owncloud?++"""]]
@@ -0,0 +1,16 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawkQvRLq7nMMEGoEKuYx9oaf67IC0nZfmVI"+ nickname="chung yan"+ subject="comment 5"+ date="2013-07-10T09:43:55Z"+ content="""+hi Tobias++thanks your sharing, i am still in have a trial of git-annex, so i do not yet have real data on the server, so i just del. all and re-create both client and server repos in owncloud, i can got what you said, and see my photo. ++Actually, i am studying git-annex. 1) It can syncs the data from my client computer to server. 2) i would like that other and anywhere computers through browser can view my server data which do not need to download all data into a new client. So my original goal is i can have a web to display the content of my files, and see owncloud have a nice web. ++Regarding to GDoc, flickr, etc. they have space limitation, so i install owncloud as my own computer. I also see the <http://git-annex.branchable.com/design/assistant/partial_content/>, but it is not yet at roadmap. ++thanks+"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawmLB39PC89rfGaA8SwrsnB6tbumezj-aC0"+ nickname="Tobias"+ subject="comment 6"+ date="2013-07-10T09:50:14Z"+ content="""+A 1 terabyte limit(for flickr) should be enough for most people. No?+"""]]
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawkQvRLq7nMMEGoEKuYx9oaf67IC0nZfmVI"+ nickname="chung yan"+ subject="comment 7"+ date="2013-07-10T09:56:54Z"+ content="""+i have not got this 1 terabyte limit from flick before. I will have a look. I still consider some my own data, it is better to keep at my own server. +"""]]
@@ -0,0 +1,36 @@+git-annex has a powerful syntax for making it act on only certain files.++The simplest thing is to exclude some files, using wild cards:++ git annex get --exclude '*.mp3' --exclude '*.ogg'++But you can also exclude files that git-annex's [[location_tracking]]+information indicates are present in a given repository. For example,+if you want to populate newarchive with files, but not those already+on oldarchive, you could do it like this:++ git annex copy --not --in oldarchive --to newarchive++Without the --not, --in makes it act on files that *are* in the specified+repository. So, to remove files that are on oldarchive:++ git annex drop --in oldarchive++Or maybe you're curious which files have a lot of copies, and then+also want to know which files have only one copy:++ git annex find --copies 7+ git annex find --not --copies 2++The above are the simple examples of specifying what files git-annex+should act on. But you can specify anything you can dream up by combining+the things above, with --and --or -( and -). Those last two strange-looking+options are parentheses, for grouping other options. You will probably+have to escape them from your shell.++Here are the mp3 files that are in either of two repositories, but have+less than 3 copies:++ git annex find --not --exclude '*.mp3' --and \+ -\( --in usbdrive --or --in archive -\) --and \+ --not --copies 3
@@ -0,0 +1,19 @@+Suppose something goes wrong, and fsck puts all the files in lost+found.+It's actually very easy to recover from this disaster.++First, check out the git repository again. Then, in the new checkout:++ $ mkdir recovered-content+ $ sudo mv ../lost+found/* recovered-content+ $ sudo chown you:you recovered-content+ $ chmod -R u+w recovered-content+ $ git annex add recovered-content+ $ git rm recovered-content+ $ git commit -m "recovered some content"+ $ git annex fsck++The way that works is that when git-annex adds the same content that was in+the repository before, all the old links to that content start working+again. This works particularly well if the SHA* backends are used, but even+with the default backend it will work pretty well, as long as fsck+preserved the modification time of the files.
@@ -0,0 +1,41 @@+Sparkleshare and dvcs-autosync are tools to automatically commit your+changes to git and keep them in sync with other repositories. Unlike+git-annex, they don't store the file content on the side, but directly in+the git repository. Great for small files, less good for big files.++Here's how to use the [[git-annex assistant|/assistant]] to do the same+thing, but even better!++----++First, get git-annex version 4.20130329 or newer.++----++Let's suppose you're delveloping a video game, written in C. You have+source code, and some large game assets. You want to ensure the source+code is stored in git -- that's what git's for! And you want to store+the game assets in the git annex -- to avod bloating your git repos with+possibly enormous files, but still version control them.++All you need to do is configure git-annex to treat your C files+as small files. And treat any file larger than, say, 100kb as a large+file that is stored in the annex.++ git config annex.largefiles "largerthan=100kb and not (include=*.c or include=*.h)"++Now if you run `git annex add`, it will only add the large files to the+annex. You can `git add` the small files directly to git.++Better, if you run `git annex assistant`, it will *automatically*+add the large files to the annex, and store the small files in git.+It'll notice every time you modify a file, and immediately commit it,+too. And sync it out to other repositories you configure using `git annex+webapp`.++----++It's also possible to disable the use of the annex entirely, and just+have the assistant *always* put every file into git, no matter its size:++ git config annex.largefiles "exclude=*"
@@ -0,0 +1,55 @@+Let's say you want to distribute some big files to the whole world.+You can of course, just drop them onto a website. But perhaps you'd like to+use git-annex to manage those files. And as an added bonus, why not let+anyone in the world clone your site and use `git-annex get`!++My site like this is [downloads.kitenet.net](https://downloads.kitenet.net).+Here's how I set it up. --[[Joey]]++1. Set up a web site. I used Apache, and configured it to follow symlinks.+ `Options FollowSymLinks`+2. Put some files on the website. Make sure it works.+3. `git init; git annex init`+4. `git config core.sharedrepository world` (Makes sure files+ are always added with permissions that allow everyone to read them.)+5. We want users to be able to clone the git repository over http, because+ git-annex can download files from it over http as well. For this to+ work, `git update-server-info` needs to get run after commits. The+ git `post-update` hook will take care of this, you just need to enable+ the hook. `chmod +x .git/hooks/post-update`+6. `git annex add; git commit -m added`+7. Make sure users can still download files from the site directly.+8. Instruct advanced users to clone a http url that ends with the "/.git/"+ directory. For example, for downloads.kitenet.net, the clone url+ is `https://downloads.kitenet.net/.git/`+9. Set up a git `post-receive` hook to update the repository's working tree+ when changes are pushed to it. See below for details.++When users clone over http, and run git-annex, it will+automatically learn all about your repository and be able to download files+right out of it, also using http. ++## post-receive hook++If you have git-annex 4.20130703, the post-receive hook mentioned above+in step 8 just needs to run `git annex merge`.++With older versions of git-annex, you can instead use `git annex sync`.++There are two gotchas with some versions of git to be aware of when writing+this post-receive hook.++1. The hook may be run with the current directory set to the `.git`+ directory, and not the top of your work tree. So you need to `cd ..` or+ similar in the hook.+2. `GIT_DIR` may be set to `.`, which will not be right after changing+ directory. So you will probably want to unset it.++Here's a post-receive hook that takes these problems into account:++<pre>+#!/bin/sh+unset GIT_DIR+cd ..+git annex merge+</pre>
@@ -0,0 +1,39 @@+Scenario+========++You have a server where you want to welcome other people to push files, say for a family photo album. People have their own user account, so by default they will not be able to read/write from each other's repositories, due to git-annex strict restrictions.++Solution+========++Setup a shared git repository:++ git init shared ; cd shared # you can also do this on an existing git annex repo+ git config core.sharedrepository group+ chmod g+rwX -R .+ chown -R :media .++The idea here is to use the new (since [[news/version 4.20130909]]) support for git's `sharedRepository` configuration and restrict access to a specific group (instead of the default, a single user). You can also this to make the files accessible to all users on the system:++ git config core.sharedrepository world+ chmod a+rwX -R .++This will make sure that you anyone can operate that git annex repository remotely.++Third party applications+------------------------++Now if another application that is not aware of git's `sharedRepository` configuration (say a [[bittorrent]] daemon) writes files there, you may want to make sure that the files created are also writable by everyone. This is more tricky, but one way of doing this is with the [[!wikipedia setgid]] bit:++ find -type d -exec chmod g+s {} \;++You will also need to start the process with a proper [[!wikipedia umask]] (`002` instead of `022`).++(!) I haven't actually tested this part. --[[anarcat]]++See also+========++ * [[tips/setup a public repository on a web site]]+ * [[news/version 4.20130909]]+ * [[bugs/acl not honoured in rsync remote]]: why this does not work on encrypted remotes
@@ -0,0 +1,29 @@+skydriveannex+=========++Hook program for gitannex to use [skydrive](http://en.wikipedia.org/wiki/SkyDrive) (previously *Windows Live SkyDrive* and *Windows Live Folders*) as backend++# Requirements:++ python2+ python-yaml++Credit for the Skydrive api interface goes to https://github.com/mk-fg/python-skydrive++# Install+Clone the git repository in your home folder.++ git clone git://github.com/TobiasTheViking/skydriveannex.git ++This should make a ~/skydriveannex folder++# Setup+Run the program once to set it up.++ cd ~/skydriveannex; python2 skydriveannex.py++# Commands for gitannex:++ git config annex.skydrive-hook '/usr/bin/python2 ~/skydriveannex/skydriveannex.py'+ git annex initremote skydrive type=hook hooktype=skydrive encryption=shared+ git annex describe skydrive "the skydrive library"
@@ -0,0 +1,28 @@+Suppose you have a USB thumb drive and are using it as a git annex+repository. You don't trust the drive, because you could lose it, or+accidentally run it through the laundry. Or, maybe you have a drive that+you know is dying, and you'd like to be warned if there are any files+on it not backed up somewhere else. Maybe the drive has already died+or been lost.++You can let git-annex know that you don't trust a repository, and it will+adjust its behavior to avoid relying on that repositories's continued+availability.+ + # git annex untrust usbdrive+ untrust usbdrive ok++Now when you do a fsck, you'll be warned appropriately:++ # git annex fsck .+ fsck my_big_file+ Only these untrusted locations may have copies of this file!+ 05e296c4-2989-11e0-bf40-bad1535567fe -- portable USB drive+ Back it up to trusted locations with git-annex copy.+ failed++Also, git-annex will refuse to drop a file from elsewhere just because+it can see a copy on the untrusted repository.++It's also possible to tell git-annex that you have an unusually high+level of trust for a repository. See [[trust]] for details.
@@ -0,0 +1,75 @@+Amazon Glacier provides low-cost storage, well suited for archiving and+backup. But it takes around 4 hours to get content out of Glacier.++Recent versions of git-annex support Glacier. To use it, you need to have+[glacier-cli](http://github.com/basak/glacier-cli) installed.++First, export your Amazon AWS credentials:++ # export AWS_ACCESS_KEY_ID="08TJMT99S3511WOZEP91"+ # export AWS_SECRET_ACCESS_KEY="s3kr1t"++Now, create a gpg key, if you don't already have one. This will be used+to encrypt everything stored in Glacier, for your privacy. Once you have+a gpg key, run `gpg --list-secret-keys` to look up its key id, something+like "2512E3C7"++Next, create the Glacier remote.++ # git annex initremote glacier type=glacier keyid=2512E3C7+ initremote glacier (encryption setup with gpg key C910D9222512E3C7) (gpg) ok++The configuration for the Glacier remote is stored in git. So to make another+repository use the same Glacier remote is easy:++ # cd /media/usb/annex+ # git pull laptop+ # git annex initremote glacier+ initremote glacier (gpg) ok++Now the remote can be used like any other remote.++ # git annex move my_cool_big_file --to glacier+ copy my_cool_big_file (gpg) (checking glacier...) (to glacier...) ok++But, when you try to get a file out of Glacier, it'll queue a retrieval+job:++ # git annex get my_cool_big_file+ get my_cool_big_file (from glacier...) (gpg)+ glacier: queued retrieval job for archive 'GPGHMACSHA1--862afd4e67e3946587a9ef7fa5beb4e8f1aeb6b8'+ Recommend you wait up to 4 hours, and then run this command again.+ failed++Like it says, you'll need to run the command again later. Let's remember to+do that:++ # at now + 4 hours+ at> git annex get my_cool_big_file++Another oddity of Glacier is that git-annex is never entirely sure+if a file is still in Glacier. Glacier inventories take hours to retrieve,+and even when retrieved do not necessarily represent the current state.++So, git-annex plays it safe, and avoids trusting the inventory:++ # git annex copy important_file --to glacier+ copy important_file (gpg) (checking glacier...) (to glacier...) ok+ # git annex drop important_file+ drop important_file (gpg) (checking glacier...)+ Glacier's inventory says it has a copy.+ However, the inventory could be out of date, if it was recently removed.+ (Use --trust-glacier if you're sure it's still in Glacier.)+ + (unsafe) + Could only verify the existence of 0 out of 1 necessary copies++Like it says, you can use `--trust-glacier` if you're sure+Glacier's inventory is correct and up-to-date.++A final potential gotcha with Glacier is that glacier-cli keeps a local+mapping of file names to Glacier archives. If this cache is lost, or+you want to retrieve files on a different box than the one that put them in+glacier, you'll need to use `glacier vault sync` to rebuild this cache.++See [[special_remotes/Glacier]] for details.
@@ -0,0 +1,37 @@+git-annex extends git's usual remotes with some [[special_remotes]], that+are not git repositories. This way you can set up a remote using say,+Amazon S3, and use git-annex to transfer files into the cloud.++First, export your Amazon AWS credentials:++ # export AWS_ACCESS_KEY_ID="08TJMT99S3511WOZEP91"+ # export AWS_SECRET_ACCESS_KEY="s3kr1t"++Now, create a gpg key, if you don't already have one. This will be used+to encrypt everything stored in S3, for your privacy. Once you have+a gpg key, run `gpg --list-secret-keys` to look up its key id, something+like "2512E3C7"++Next, create the S3 remote, and describe it. ++ # git annex initremote cloud type=S3 keyid=2512E3C7+ initremote cloud (encryption setup with gpg key C910D9222512E3C7) (checking bucket) (creating bucket in US) (gpg) ok+ # git annex describe cloud "at Amazon's US datacenter"+ describe cloud ok++The configuration for the S3 remote is stored in git. So to make another+repository use the same S3 remote is easy:++ # cd /media/usb/annex+ # git pull laptop+ # git annex initremote cloud+ initremote cloud (gpg) (checking bucket) ok++Now the remote can be used like any other remote.++ # git annex copy my_cool_big_file --to cloud+ copy my_cool_big_file (gpg) (checking cloud...) (to cloud...) ok+ # git annex move video/hackity_hack_and_kaxxt.mov --to cloud+ move video/hackity_hack_and_kaxxt.mov (checking cloud...) (to cloud...) ok++See [[special_remotes/S3]] for details.
@@ -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,9 @@+[Google Cloud Storage](https://cloud.google.com/products/cloud-storage)+supports the same API as Amazon S3, so the+[[S3 special remote|special_remotes/S3]] can be used with it.+Here is a configuration example:++ git annex initremote cloud type=S3 encryption=none host=storage.googleapis.com port=80++Thanks to jterrance for the [original tip](https://gist.github.com/4576324).+--[[Joey]]
@@ -0,0 +1,71 @@+[Box.com](http://box.com/) is a file storage service, currently notable +for providing 50 gb of free storage if you sign up with its Android client.+(Or a few gb free otherwise.)++git-annex can use Box as a [[special remote|special_remotes]].+Recent versions of git-annex make this very easy to set up:++ WEBDAV_USERNAME=you@example.com WEBDAV_PASSWORD=xxxxxxx git annex initremote box.com type=webdav url=https://www.box.com/dav/git-annex chunksize=75mb encryption=shared++Note the use of chunksize; Box has a 100 mb maximum file size, and this+breaks up large files into chunks before that limit is reached.++# old davfs2 method++This method is deprecated, but still documented here just in case.+Note that the files stored using this method cannot reliably be retreived+using the webdav special remote.++## davfs2 setup++* First, install+ the [davfs2](http://savannah.nongnu.org/projects/davfs2) program,+ which can mount Box using WebDAV. On Debian, just `sudo apt-get install davfs2`+* Allow users to mount davfs filesystems, by ensuring that+ `/sbin/mount.davfs` is setuid root. On Debian, just `sudo dpkg-reconfigure davfs2`+* Add yourself to the davfs2 group.++ sudo adduser $(whoami) davfs2++* Edit `/etc/fstab`, and add a line to mount Box using davfs.++ sudo mkdir -p /media/box.com+ echo "https://www.box.com/dav/ /media/box.com davfs noauto,user 0 0" | sudo tee -a /etc/fstab++* Create `~/.davfs2/davfs2.conf` with some important settings:++ mkdir ~/.davfs2/+ echo use_locks 0 > ~/.davfs2/davfs2.conf+ echo cache_size 1 >> ~/.davfs2/davfs2.conf+ echo delay_upload 0 >> ~/.davfs2/davfs2.conf++* Create `~/.davfs2/secrets`. This file contains your Box.com login and password.+ Your login is probably the email address you signed up with.++ echo "/media/box.com joey@kitenet.net mypassword" > ~/.davfs2/secrets+ chmod 600 ~/.davfs2/secrets++* Now you should be able to mount Box, as a non-root user:++ mount /media/box.com++## git-annex setup++You need git-annex version 3.20120303 or newer, which adds support for chunking+files larger than Box's 100 mb limit.++Create the special remote, in your git-annex repository.+** This example is non-encrypted; fill in your gpg key ID for a securely+encrypted special remote! **++ git annex initremote box.com type=directory directory=/media/box.com chunksize=2mb encryption=none++Now git-annex can copy files to box.com, get files from it, etc, just like+with any other special remote.++ % git annex copy bigfile --to box.com+ bigfile (to box.com...) ok+ % git annex drop bigfile+ bigfile (checking box.com...) ok+ % git annex get bigfile+ bigfile (from box.com...) ok
@@ -0,0 +1,59 @@+## Intro++This tip is based on my (Matt Ford) experience of using `git annex` with my out-and-about netbook which hits many different wifi networks and has no fixed home or address.++I'm not using a bare repository that allows pushing (an alternative solution) nor do I fancy allowing `git push` to run against my desktop checked out repository (perhaps I worry over nothing?)++None of this is really `git annex` specific but I think it is useful to know...++## Dealing with no fixed hostname++Essentially set up two repos as per the [[walkthrough]].++Desktop as follows:++ cd ~/annex+ git init+ git annex init "desktop"++And the laptop like this++ git clone ssh://desktop/annex+ git init+ git annex init "laptop"++Now we want to add the the repos as remotes of each other. ++For the laptop it is easy:++ git remote add desktop ssh://desktop/~/annex ++However for the desktop to add an ever changing laptops hostname it's a little tricky. We make use of remote SSH tunnels to do this. Essentially we have the laptop (which always knows it's own name and address and knows the address of the desktop) create a tunnel starting on an arbitrary port at the desktop and heads back to the laptop on it's own SSH server port (22).++To do this make part of your laptop's SSH config look like this:++ Host desktop+ User matt+ HostName desktop.example.org+ RemoteForward 2222 localhost:22++Now on the desktop to connect over the tunnel to the laptop's SSH port you need this:++ Host laptop+ User matt+ HostName localhost+ port 2222++So to add the desktop's remote:++a) From the laptop ensure the tunnel is up++ ssh desktop++b) From the desktop add the remote++ git remote add laptop ssh://laptop/~/annex++So now you can work on the train, pop on the wifi at work upon arrival, and sync up with a `git pull && git annex get`.++An alternative solution may be to use direct tunnels over Openvpn.
@@ -0,0 +1,89 @@+[Gitolite](https://github.com/sitaramc/gitolite) is a git repository+manager. Here's how to add git-annex support to gitolite, so you can+`git annex copy` files to a gitolite repository, and `git annex get`+files from it.++Warning : The method described here works with gitolite version g2, avaible in the g2 branch on github. There is an experimental support for g3 in the git-annex branch, if you tested it please add some feedback.++A nice feature of using gitolite with git-annex is that users can be given+read-only access to a repository, and this allows them to `git annex get`+file contents, but not change anything.++First, you need new enough versions:++* gitolite 2.2 is needed -- this version contains a git-annex-shell ADC+ and supports "ua" ADCs.+* git-annex 3.20111016 or newer needs to be installed on the gitolite+ server. Don't install an older version, it wouldn't be secure!++And here's how to set it up. The examples are for gitolite as installed+on Debian with apt-get, but the changes described can be made to any+gitolite installation, just with different paths.++Set `$GL_ADC_PATH` in `.gitolite.rc`, if you have not already done so.++<pre>+echo '$GL_ADC_PATH = "/usr/local/lib/gitolite/adc/";' >>~gitolite/.gitolite.rc+</pre>++Make the ADC directory, and a "ua" subdirectory.++<pre> +mkdir -p /usr/local/lib/gitolite/adc/ua+</pre>++Install the git-annex-shell ADC into the "ua" subdirectory from the gitolie repository.++<pre> +cd /usr/local/lib/gitolite/adc/ua/+cp gitolite/contrib/adc/git-annex-shell .+</pre>++Now all gitolite repositories can be used with git-annex just as any+ssh remote normally would be used. For example:++<pre>+# git clone gitolite@localhost:testing+Cloning into testing...+Receiving objects: 100% (18/18), done.+# cd testing+# git annex init+init ok+# cp /etc/passwd my-cool-big-file+# git annex add my-cool-big-file+add my-cool-big-file ok+(Recording state in git...)+# git commit -m added+[master d36c8b4] added+ 1 files changed, 1 insertions(+), 0 deletions(-)+ create mode 120000 my-cool-big-file+# git push --all+Counting objects: 17, done.+Delta compression using up to 2 threads.+Compressing objects: 100% (12/12), done.+Writing objects: 100% (14/14), 1.39 KiB, done.+Total 14 (delta 0), reused 1 (delta 0)+To gitolite@localhost:testing+ c552a38..db4653e git-annex -> git-annex+ 29cd204..d36c8b4 master -> master+# git annex copy --to origin+copy my-cool-big-file (checking origin...) (to origin...) +WORM-s2502-m1318875140--my-cool-big-file+ 2502 100% 0.00kB/s 0:00:00 (xfer#1, to-check=0/1)++sent 2606 bytes received 31 bytes 1758.00 bytes/sec+total size is 2502 speedup is 0.95+ok+</pre>+++### Troubleshooting++I got an error like this when setting up gitolite *after* setting up a local git repo and git annex:++<pre>+git-annex-shell: First run: git-annex init+Command ssh ["git@git.example.com","git-annex-shell 'configlist' '/~/myrepo.git'"] failed; exit code 1+</pre>++because I forgot to "git push --all" after adding the new gitolite remote.
@@ -0,0 +1,11 @@+A handy alternative to the default [[backend|backends]] is the+SHA1 backend. This backend provides more git-style assurance that your data+has not been damaged. And the checksum means that when you add the same+content to the annex twice, only one copy need be stored in the backend.++The only reason it's not the default is that it needs to checksum+files when they're added to the annex, and this can slow things down+significantly for really big files. To make SHA1 the default, just+add something like this to `.gitattributes`:++ * annex.backend=SHA1
@@ -0,0 +1,101 @@+The web can be used as a [[special_remote|special_remotes]] too.++ # git annex addurl http://example.com/video.mpeg+ addurl example.com_video.mpeg (downloading http://example.com/video.mpeg)+ ########################################################## 100.0%+ ok++Now the file is downloaded, and has been added to the annex like any other+file. So it can be renamed, copied to other repositories, and so on.++To add a lot of urls at once, just list them all as parameters to+`git annex addurl`.++## trust issues++Note that git-annex assumes that, if the web site does not 404, and has the+right file size, the file is still present on the web, and this counts as+one [[copy|copies]] of the file. If the file still seems to be present +on the web, it will let you remove your last copy, trusting it can be+downloaded again:++ # git annex drop example.com_video.mpeg+ drop example.com_video.mpeg (checking http://example.com/video.mpeg) ok++If you don't [[trust]] the web to this degree, just let git-annex know:++ # git annex untrust web+ untrust web ok++With the result that it will hang onto files:++ # git annex drop example.com_video.mpeg+ drop example.com_video.mpeg (unsafe) + Could only verify the existence of 0 out of 1 necessary copies+ Also these untrusted repositories may contain the file:+ 00000000-0000-0000-0000-000000000001 -- web+ (Use --force to override this check, or adjust annex.numcopies.)+ failed++## attaching urls to existing files++You can also attach urls to any file already in the annex:++ # git annex addurl --file my_cool_big_file http://example.com/cool_big_file+ addurl my_cool_big_file ok+ # git annex whereis my_cool_big_file+ whereis my_cool_big_file (2 copies) + 00000000-0000-0000-0000-000000000001 -- web+ 27a9510c-760a-11e1-b9a0-c731d2b77df9 -- here++## configuring filenames++By default, `addurl` will generate a filename for you. You can use+`--file=` to specify the filename to use.++If you're adding a bunch of related files to a directory, or just don't+like the default filenames generated by `addurl`, you can use `--pathdepth`+to specify how many parts of the url are put in the filename.+A positive number drops that many paths from the beginning, while a negative+number takes that many paths from the end.+ + # git annex addurl http://example.com/videos/2012/01/video.mpeg+ addurl example.com_videos_2012_01_video.mpeg (downloading http://example.com/videos/2012/01/video.mpeg)+ # git annex addurl http://example.com/videos/2012/01/video.mpeg --pathdepth=2+ addurl 2012_01_video.mpeg (downloading http://example.com/videos/2012/01/video.mpeg)+ # git annex addurl http://example.com/videos/2012/01/video.mpeg --pathdepth=-2+ addurl 01_video.mpeg (downloading http://example.com/videos/2012/01/video.mpeg)++## videos++<a name=quvi></a>++There's support for downloading videos from sites like YouTube, Vimeo,+and many more. This relies on [quvi](http://quvi.sourceforge.net/) to find+urls to the actual videos files.++When you have quvi installed, you can just +`git annex addurl http://youtube.com/foo` and it will detect that+it is a video and download the video content for offline viewing.++Later, in another clone of the repository, you can run `git annex get` on+the file and it will also be downloaded with the help of quvi. This works+even if the video host has transcoded or otherwise changed the video+in the meantime; the assumption is that these video files are equivilant.++There is an `annex.quvi-options` configuration setting that can be used+to pass parameters to quvi. For example, you could set `git config+annex.quvi-options "--format low"` to configure it to download low+quality videos from YouTube.++Note that for performance reasons, the url is not checked for redirects,+so some shortened urls will not be detected. You can+either load the short url in a browser to get the full url, or you+can force use of quvi with redirect detection, by prepending "quvi:" to the+url.++Downloading whole YouTube playlists is not currently supported by quvi.++## podcasts++This is done using `git annex importfeed`. See [[downloading podcasts]].
@@ -0,0 +1,22 @@+[Gource](http://code.google.com/p/gource/) is an amazing animated+visualisation of a git repository.++Normally, gource shows files being added, removed, and changed in+the repository, and the user(s) making the changes. Of course it can be+used in this way in a repository using git-annex too; just run `gource`.++The other way to use gource with git-annex is to visualise the movement of+annexed file contents between repositories. In this view, the "users" are+repositories, and they move around the file contents that are being added+or removed from them with git-annex.++[[!img screenshot.jpg]]++To use gource this way, first go into the directory you want to visualize,+and use `git annex log` to make an input file for `gource`:++ git annex log --gource | tee gource.log+ sort gource.log | gource --log-format custom -++The `git annex log` can take a while, to speed it up you can use something+like `--after "4 months ago"` to limit how far back it goes.
binary file changed (absent → 78509 bytes)
@@ -0,0 +1,22 @@+A git-annex repository on a removable USB drive is great, until the cable+falls out at the wrong time and git's repository gets trashed. The way+git checksums everything and the poor quality of USB media makes this+perhaps more likely than you would expect. If this happens to you,+here's a way to recover that makes the most of whatever data is left+on the drive.++* First, run `git fsck`. If it does not report any problems, your data+ is fine, and you don't need to proceed further.+* So `git fsck` says the git repository is corrupted. But probably the data+ git-annex stored is fine. Your first step is to clone another copy+ of the git repository from somewhere else. Let's call this clone+ "$good", and the corrupted repository "$bad".+* Preserve your git configuration changes, and the `annex.uuid` setting:+ `mv $bad/.git/config $good/.git/config`+* Move annexed data into the new repository: `mkdir $good/.git/annex; mv+ $bad/.git/annex/objects $good/.git/annex/objects`+* Reinitalize git-annex: `cd $good; git annex init`+* Check for any problems with the annexed data: `cd $good; git annex fsck`+* Now you can remove the corrupted repository, the new one is ready to use.++--[[Joey]]
@@ -0,0 +1,19 @@+So you lost a thumb drive containing a git-annex repository. Or a hard+drive died or some other misfortune has befallen your data.++Unless you configured backups, git-annex can't get your data back. But it+can help you deal with the loss.++Go somewhere that knows about the lost repository, and mark it as+dead:++ git annex dead usbdrive++This retains the [[location_tracking]] information for the repository,+but avoids trying to access it, or list it as a location where files+are present.++If you later found the drive, you could let git-annex know it's found+like so:++ git annex semitrust usbdrive
@@ -0,0 +1,9 @@+Here's the annex-du script that I use:++#!/bin/sh+git annex find "$@" --include '*' --format='${bytesize}\n' |awk '{ sum += $1; nfiles++; } END { printf "%d files, %.3f MB\n", nfiles, sum/1000000 } '++This one can be slow on a large number of files, but it has an advantage of being able to use all of the filtering available in git annex find.+For example, to figure out how much is stored in remote X, do++annex-du --in=X
@@ -0,0 +1,4 @@+This is git-annex's todo list. Link items to [[todo/done]] when done.++[[!inline pages="./todo/* and !./todo/done and !link(done) +and !*/Discussion" actions=yes postform=yes show=0 archive=yes]]
@@ -0,0 +1,7 @@+I like the way btsync search for the peer. So if I need to sync my laptop and other family laptop both with a total different and changing network setup the two device found each other do NAT traversal if needed use relays but the end the two folders are synced. But its closed-source :( I like git and git-annex looks really great. I'm learning it now.++First I thought with xmpp I can sync files without ssh/rsync or other remote access to my devices just with two jabber account. Now I know I can't. :(++It would be just great to have some means to sync files without cloud just the two device. Without the ssh / rsync jut share some secret and the devices do the rest. :-o++Anyway thanks for hearing. I'm looking forward to know more about git-annex. Thank you for that sw. =-<>-=
@@ -0,0 +1,45 @@+There are two different possible ways git-annex could use bittorrent:++Let's describe those one by one.++[[!toc]]++Downloading files from multiple git-annex sources simultaneously+================================================================++Having your remotes (optionally!) act like a swarm would be an awesome feature to have because you bring in a lot of new features that optimize storage, bandwidth, and overall traffic usage. This would be made a lot easier if parts of it were implemented in small steps that added a nifty feature. The best part is, each of these could be implemented by themselves, and they're all features that would be really useful.++ 1. Concurrent downloads of a file from remotes.++ This would make sense to have, it saves upload traffic on your remotes, and you also get faster DL speeds on the receiving end.++ 2. Implementing part of the super-seeding capabilities.++ You upload pieces of a file to different remotes from your laptop, and on your desktop you can download all those pieces and put them together again to get a complete file. If you really wanted to get fancy, you could build in redundancy (ala RAID) so if a remote or two gets lost, you don't lose the entire file. This would be a very efficient use of storage if you have a bunch of free cloud storage accounts (~1GB each) and some big files you want to back up.++ 3. Setting it up so that those remotes could talk to one another and share those pieces.++ This is where it gets more like bittorrent. Useful because you upload 1 copy and in a few hours, have say, 5 complete copies on 5 different remotes. You could add or remove remotes from a swarm locally, and push those changes to those remotes, which then adapt themselves to suit the new rules and share those with other remotes in the swarm (rules should be GPG-signed as a safety precaution). Also, if/when deltas get implemented, you could push that delta to the swarm and have all the remotes adopt it. This is cooler than regular bittorrent because the shared file can be updated. As a safety precaution, the delta could be GPG signed so a corrupt file doesn't contaminate the entire swarm. Each remote could have bandwidth/storage limits set in a dotfile.++This is a high-level idea of how it might work, and it's also a HUGE set of features to add, but if implemented, you'd be saving a ton of resources, adding new use cases, and making git-annex more flexible.++Obviously, Step 3 would only work on remotes that you have control of processes on, but if given login credentials to cloud storage remotes (potentially dangerous!) they could read/write to something like dropbox or rsync.++Another thing, this would be completely trackerless. You just use remote groups (or create swarm definitions) and share those with your remotes. **It's completely decentralized!**++This was originally posted [[as a forum post|forum/Wishlist:_Bittorrent-like_transfers]] by [[users/GLITTAH]].++Using an external client (addurl torrent support)+=================================================++The alternative to this would be to add `addurl` support for bittorrent files. The same way we can now add Youtube videos to a git-annex repository thanks to [[quvi]], we could also simply do:++ git annex addtorrent debian-live-7.0.0-amd64-standard.iso.torrent++or even better:++ git annex addurl http://cdimage.debian.org/debian-cd/current-live/amd64/bt-hybrid/debian-live-7.0.0-amd64-standard.iso.torrent++This way, a torrent would just become another source for a specific file. When we `get` the file, it fires up `$YOUR_FAVORITE_TORRENT_CLIENT` to download the file.++That way we avoid the implementation complexity of shoving a complete bittorrent client within the assistant. The `get` operation would block until the torrent is downloaded, i guess... --[[anarcat]]
@@ -0,0 +1,1 @@+It would be wonderful if a pre-built package would be available for Synology NAS. Basically, this is an ARM-based Linux. It has most of the required shell commands either out of the box or easily available (through ipkg). But I think it would be difficult to install the Haskell compiler and all the required modules, so it would probably be better to cross-compile targeting ARM.
@@ -0,0 +1,7 @@+### 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]]
@@ -0,0 +1,7 @@+A failure during "make test" should be signalled to the caller by means of+a non-zero exit code. Without that signal, it's very hard to run the+regression test suite in an automated fashion.++> git-annex used to have a Makefile that ignored make test exit status,+> but that was fixed in commit dab5bddc64ab4ad479a1104748c15d194e138847,+> in October 6th. [[done]] --[[Joey]]
@@ -0,0 +1,9 @@+Git-annex doesn't compile with the latest version of monad-control. Would it be hard to support that new version?++> I have been waiting for it to land in Debian before trying to +> deal with its changes.+> +> There is now a branch in git called `new-monad-control` that will build+> with the new monad-control. --[[Joey]]++>> Now merged to master. [[done]] --[[Joey]]
@@ -0,0 +1,24 @@+Support Amazon S3 as a file storage backend.++There's a haskell library that looks good. Not yet in Debian.++Multiple ways of using S3 are possible. Currently implemented as +a special type of git remote.++Before this can be close, I need to fix:++## encryption++TODO++## unused checking++One problem is `git annex unused`. Currently it only looks at the local+repository, not remotes. But if something is dropped from the local repo,+and you forget to drop it from S3, cruft can build up there.++This could be fixed by adding a hook to list all keys present in a remote.+Then unused could scan remotes for keys, and if they were not used locally,+offer the possibility to drop them from the remote.++[[done]]
@@ -0,0 +1,20 @@+What steps will reproduce the problem?+Sync a lot of small files.++What is the expected output? What do you see instead?+The expected output is hopefully a fast transfer.++But currently it seems like git-annex is only using one thread to transfer(per host or total?)++An option to select number of transfer threads to use(possibly per host) would be very nice.++> Opening a lot of connections to a single host is probably not desirable.+> +> I do want to do something to allow slow hosts to not hold up transfers to+> other hosts, which might involve running multiple queued transfers at+> once. The webapp already allows the user to force a given transfer to+> happen immediately. --[[Joey]] ++And maybe also an option to limit how long a queue the browser should show, it can become quite resource intensive with a long queue.++> The queue is limited to 20 items for this reason. --[[Joey]]
@@ -0,0 +1,7 @@+Currently if photos or videos are copied into the Camera/DCIM directory on an Android device, or deleted the Gallery doesn't notice the changes.++It is necessary to call MediaScannerConnection - http://developer.android.com/reference/android/media/MediaScannerConnection.html - to notify the system of the change.++More info, and some sample Java code: http://stackoverflow.com/questions/13270789/how-to-run-media-scanner-in-android++It'd be awesome if the assistant did this on files it has changed. Possibly just under Camera/DCIM, but perhaps it should be configurable. MediaScannerConnection is also used to notify and index new music files.
@@ -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,14 @@+It would be nice if a couple of additional environment variables to be set for hook uses.++In particular:++ GIT_ANNEX_DIRECT=`git config annex.direct`++and++ GIT_TOP_LEVEL=`git rev-parse --show-toplevel`+++I've made some changes to flickrannex to allow the sub-directories above the uploaded image to be added as tags. This change has been merged into trunk: [[https://github.com/TobiasTheViking/flickrannex]]++What I needed was both the environment variables mentioned above. One is set as part of the annex-hook and the other I guestimate from the file path. If it was set in git-annex it would be much cleaner (and accurate). So...I think this info would be useful for other hook.
@@ -0,0 +1,7 @@+In certain situations different client annexes might get the same remote repository added, but before being synced.++Once the two clients sync they will both have two remotes with the same name. But only one UUID will have any content(Assuming only one client pushed).++It would be nice to have some (automatic?) way to resolve this conflict.++Not sure if anything sane can be done if both clients have pushed?
@@ -0,0 +1,4 @@+Seems pretty self-explanatory.++> This was already implemented, the --exclude option can be used+> for find as well as most any other subcommand. --[[Joey]] [[done]]
@@ -0,0 +1,22 @@+`--all` would make git-annex operate on either every key with content+present (or in some cases like `get` and `copy --from` on +every keys with content not present).++This would be useful when a repository has a history with deleted files+whose content you want to keep (so you're not using `dropunused`).+Or when you have a lot of branches and just want to be able to fsck+every file referenced in any branch (or indeed, any file referenced in any+ref). It could also be useful (or even a+good default) in a bare repository.++A problem with the idea is that `.gitattributes` values for keys not+currently in the tree would not be available (without horrific anounts of+grubbing thru history to find where/when the key used to exist). So+`numcopies` set via `.gitattributes` would not work. This would be a+particular problem for `drop` and for `--auto`.++--[[Joey]]++> [[done]]. The .gitattributes problem was solved simply by not+> supporting `drop --all`. `--auto` also cannot be mixed with --all for+> similar reasons. --[[Joey]]
@@ -0,0 +1,18 @@+There should be a backend where the file content is stored.. in a git+repository!++This way, you know your annexed content is safe & versioned, but you only+have to deal with the pain of git with large files in one place, and can+use all of git-annex's features everywhere else.++> Speaking as a future user, do very, very much want. -- RichiH++>> Might also be interesting to use `bup` in the git backend, to work+>> around git's big file issues there. So git-annex would pull data out+>> of the git backend using bup. --[[Joey]] ++>>> Very much so. Generally speaking, having one or more versioned storage back-ends with current data in the local annexes sounds incredibly useful. Still being able to get at old data in via the back-end and/or making offline backups of the full history are excellent use cases. -- RichiH++[[done]], the bup special remote type is written! --[[Joey]] ++> Yay! -- RichiH
@@ -0,0 +1,1 @@+Maybe add the icon /usr/share/doc/git-annex/html/logo.svg to the .desktp file.
@@ -0,0 +1,5 @@+I would like to attach metadata to annexed files (objects) without cluttering the workdir with files containing this metadata. A common use case would be to add titles to my photo collection that could than end up in a generated photo album.++Depending on the implementation it might also be possible to use the metadata facility for a threaded commenting system.++The first question is whether the metadata is attached to the objects and thus shared by all paths pointing to the same data object or to paths in the worktree. I've no preference here at this point.
@@ -0,0 +1,10 @@+When the [[design/assistant]] is running on a pair of remotes, I've seen+them get out of sync, such that every pull and merge results in a conflict,+that then has to be auto-resolved. ++This seems similar to the laddering problem described in this old bug:+[[bugs/making_annex-merge_try_a_fast-forward]]++--[[Joey]]++Think I've fixed this. [[done]] --[[Joey]]
@@ -0,0 +1,31 @@+Client repos do not want files in archive directories. This can turn+out to be confusing to users who are using archive directories for their+own purposes and not aware of this special case in the assistant. It can+seem like the assistant is failing to sync their files.++I thought, first, that it should have a checkbox to enable the archive+directory behavior.++However, I think I have a better idea. Change the preferred content+expression for clients, so they want files in archive directories, *until*+those files land in an archive.++This way, only users who set up an archive repo get this behavior. And they+asked for it by setting up that repo!++Also, the new behavior will mean that files in archive directories still+propigate around to clients. Consider this topology:++ client A ---- client B ---- archive++If a file is created in client A, and moved to an archive directory before+it syncs to B, it will never get to the archive, and will continue wasting+space on A. With the new behavior, A and B serve as effectively, transfer+repositories for archived content.++Something vaguely like this should work as the preferred content+expression for the clients:++ exclude=archive/* or (include=archive/* and (not (copies=archive:1 or copies=smallarchive:1)))++> [[done]] --[[Joey]]
@@ -0,0 +1,40 @@+The [[design/assistant]] would be better if git-annex used ghc's threaded+runtime (`ghc -threaded`).++Currently, whenever the assistant code runs some external command, all+threads are blocked waiting for it to finish.++For transfers, the assistant works around this problem by forking separate+upload processes, and not waiting on them until it sees an indication that+they have finished the transfer. While this works, it's messy.. threaded+would be better.++When pulling, pushing, and merging, the assistant runs external git+commands, and this does block all other threads. The threaded runtime would+really help here.++[[done]]; the assistant now builds with the threaded runtime.+Some work still remains to run certian long-running external git commands+in their own threads to prevent them blocking things, but that is easy to+do, now. --[[Joey]] ++---++Currently, git-annex seems unstable when built with the threaded runtime.+The test suite tends to hang when testing add. `git-annex` occasionally+hangs, apparently in a futex lock. This is not the assistant hanging, and+git-annex does not otherwise use threads, so this is surprising. --[[Joey]]++> I've spent a lot of time debugging this, and trying to fix it, in the+> "threaded" branch. There are still deadlocks. --[[Joey]]++>> Fixed, by switching from `System.Cmd.Utils` to `System.Process`+>> --[[Joey]] ++---++It would be possible to not use the threaded runtime. Instead, we could+have a child process pool, with associated continuations to run after a+child process finishes. Then periodically do a nonblocking waitpid on each+process in the pool in turn (waiting for any child could break anything not+using the pool!). This is probably a last resort...
@@ -0,0 +1,29 @@+It should be possible for clones to learn about how to contact+each other without remotes needing to always be explicitly set+up. Say that `.git-annex/remote.log` is maintained by git-annex+to contain:++ UUID hostname URI++The URI comes from configured remotes and maybe from +`file://$(pwd)`, or even `ssh://$(hostname -f)`+for the current repo. This format will merge without+conflicts or data loss.++Then when content is belived to be in a UUID, and no+configured remote has it, the remote.log can be consulted and+URIs that look likely tried. (file:// ones if the hostname+is the same (or maybe always -- a removable drive might tend+to be mounted at the same location on different hosts),+otherwise ssh:// ones.)++Question: When should git-annex update the remote.log? +(If not just on init.) Whenever it reads in a repo's remotes?++> This sounds useful and the log should be updated every time any remote is being accessed. A counter or timestamp (yes, distributed times may be wrong/different) could be used to auto-prune old entries via a global and per-remote config setting. -- RichiH++---++I no longer think I'd use this myself, I find that my repositories quickly+grow the paths I actually use, somewhat organically. Unofficial paths+across university quads come to mind. [[done]] --[[Joey]]
@@ -0,0 +1,7 @@+Remotes log should probably be stored in ".git/annex/remote.log"+instead of ".git-annex/remote.log" to prevent leaking credentials.++> The idea is to distribute the info between repositories, which is+> why it'd go in `.git-annex`. Of course that does mean that repository+> location information would be included, and if that'd not desirable+> this feature would need to be turned off. --[[Joey]]
@@ -0,0 +1,15 @@+A "git annex watch" command would help make git-annex usable by users who+don't know how to use git, or don't want to bother typing the git commands. +It would run, in the background, watching via inotify for changes, and+automatically annexing new files, etc.++The blue sky goal would be something automated like dropbox, except fully+distributed. All files put into the repository would propagate out+to all the other clones of it, as network links allow. Note that while+dropbox allows modifying files, git-annex freezes them upon creation,+so this would not be 100% equivalent to dropbox. --[[Joey]]++This is a big project with its own [[design pages|design/assistant]].++> [[done]].. at least, we have a watch command an an assistant, which+> is still being developed. --[[Joey]]
@@ -0,0 +1,20 @@+Some commands cause a union merge unnecessarily. For example, `git annex add`+modifies the location log, which first requires reading the current log (if+any), which triggers a merge.++Would be good to avoid these unnecessary union merges. First because it's+faster and second because it avoids a possible delay when a user might+ctrl-c and leave the repo in an inconsistent state. In the case of an add,+the file will be in the annex, but no location log will exist for it (fsck+fixes that).++It may be that all that's needed is to modify Annex.Branch.change+to read the current value, without merging. Then commands like `get`, that+query the branch, will still cause merges, and commands like `add` that+only modify it, will not. Note that for a command like `get`, the merge+occurs before it has done anything, so ctrl-c should not be a problem+there.++This is a delicate change, I need to take care.. --[[Joey]]++> [[done]] (assuming I didn't miss any cases where this is not safe!) --[[Joey]]
@@ -0,0 +1,7 @@+This backend is not finished.++In particular, while files can be added using it, git-annex will not notice+when their content changes, and will not create a new key for the new sha1+of the net content.++[[done]]; use unlock subcommand and commit changes with git
@@ -0,0 +1,159 @@+[[done]] !!!++The use of `.git-annex` to store logs means that if a repo has branches +and the user switched between them, git-annex will see different logs in+the different branches, and so may miss info about what remotes have which+files (though it can re-learn). ++An alternative would be to store the log data directly in the git repo+as `pristine-tar` does. Problem with that approach is that git won't merge+conflicting changes to log files if they are not in the currently checked+out branch.++It would be possible to use a branch with a tree like this, to avoid+conflicts:++key/uuid/time/status++As long as new files are only added, and old timestamped files deleted,+there would be no conflicts.++A related problem though is the size of the tree objects git needs to+commit. Having the logs in a separate branch doesn't help with that.+As more keys are added, the tree object size will increase, and git will+take longer and longer to commit, and use more space. One way to deal with+this is simply by splitting the logs amoung subdirectories. Git then can+reuse trees for most directories. (Check: Does it still have to build+dup trees in memory?)++Another approach would be to have git-annex *delete* old logs. Keep logs+for the currently available files, or something like that. If other log+info is needed, look back through history to find the first occurance of a+log. Maybe even look at other branches -- so if the logs were on master,+a new empty branch could be made and git-annex would still know where to+get keys in that branch. ++Would have to be careful about conflicts when deleting and bringing back+files with the same name. And would need to avoid expensive searching thru+all history to try to find an old log file.++## fleshed out proposal++Let's use one branch per uuid, named git-annex/$UUID.++- I came to realize this would be a good idea when thinking about how+ to upgrade. Each individual annex will be upgraded independantly,+ so each will want to make a branch, and if the branches aren't distinct,+ they will merge conflict for sure.+- TODO: What will need to be done to git to make it push/pull these new+ branches?+- A given repo only ever writes to its UUID branch. So no conflicts.+ - **problem**: git annex move needs to update log info for other repos!+ (possibly solvable by having git-annex-shell update the log info+ when content is moved using it)+- (BTW, UUIDs probably don't compress well, and this reduces the bloat of having+ them repeated lots of times in the tree.)+- Per UUID branches mean that if it wants to find a file's location+ amoung configured remotes, it can examine only their branches, if+ desired.+- It's important that the per-repo branches propigate beyond immediate+ remotes. If there is a central bare repo, that means push --all. Without+ one, it means that when repo B pulls from A, and then C pulls from B,+ C needs to get A's branch -- which means that B should have a tracking+ branch for A's branch.++In the branch, only one file is needed. Call it locationlog. git-annex+can cache location log changes and write them all to locationlog in+a single git operation on shutdown.++- TODO: what if it's ctrl-c'd with changes pending? Perhaps it should+ collect them to .git/annex/locationlog, and inject that file on shutdown?+- This will be less overhead than the current staging of all the log files.++The log is not appended to, so in git we have a series of commits each of+which replaces the log's entire contens.++To find locations of a key, all (or all relevant) branches need to be+examined, looking backward through the history of each until a log+with a indication of the presense/absense of the key is found.++- This will be less expensive for files that have recently been added+ or transfered.+- It could get pretty slow when digging deeper.+- Only 3 places in git-annex will be affected by any slowdown: move --from,+ get and drop. (Update: Now also unused, whereis, fsck) ++## alternate++As above, but use a single git-annex branch, and keep the per-UUID+info in their own log files. Hope that git can auto-merge as long as+each observing repo only writes to its own files. (Well, it can, but for+non-fast-forward merges, the git-annex branch would need to be checked out,+which is problimatic.)++Use filenames like:++ <observing uuid>/<location uuid>++That allows one repo to record another's state when doing a+`move`.++## outside the box approach++If the problem is limited to only that the `.git-annex/` files make+branching difficult (and not to the related problem that commits to them+and having them in the tree are sorta annoying), then a simple approach+would be to have git-annex look in other branches for location log info+too.++The problem would then be that any locationlog lookup would need to look in+all other branches (any branch could have more current info after all),+which could get expensive.++## way outside the box approach++Another approach I have been mulling over is keeping the log file+branch checked out in .git/annex/logs/ -- this would be a checkout of a git+repository inside a git repository, using "git fake bare" techniques. This+would solve the merge problem, since git auto merge could be used. It would+still mean all the log files are on-disk, which annoys some. It would+require some tighter integration with git, so that after a pull, the log+repo is updated with the data pulled. --[[Joey]] ++> Seems I can't use git fake bare exactly. Instead, the best option+> seems to be `git clone --shared` to make a clone that uses+> `.git/annex/logs/.git` to hold its index etc, but (mostly) uses+> objects from the main repo. There would be some bloat,+> as commits to the logs made in there would not be shared with the main+> repo. Using `GIT_OBJECT_DIRECTORY` might be a way to avoid that bloat.++## notes++Another approach could be to use git-notes. It supports merging branches+of notes, with union merge strategy (a hook would have to do this after+a pull, it's not done automatically). ++Problem: Notes are usually attached to git+objects, and there are no git objects corresponding to git-annex keys.++Problem: Notes are not normally copied when cloning.++------++## elminating the merge problem++Most of the above options are complicated by the problem of how to merge+changes from remotes. It should be possible to deal with the merge+problem generically. Something like this:++* We have a local branch `B`.+* For remotes, there are also `origin/B`, `otherremote/B`, etc.+* To merge two branches `B` and `foo/B`, construct a merge commit that+ makes each file have all lines that were in either version of the file,+ with duplicates removed (probably). Do this without checking out a tree.+ -- now implemented as git-union-merge+* As a `post-merge` hook, merge `*/B` into `B`. This will ensure `B`+ is always up-to-date after a pull from a remote.+* When pushing to a remote, nothing need to be done, except ensure+ `B` is either successfully pushed, or the push fails (and a pull needs to+ be done to get the remote's changes merged into `B`).
@@ -0,0 +1,37 @@+Most of git-annex is designed to be fast no matter how many other files are+in the annex. Things like add/get/drop/move/fsck have good locality;+they will only operate on as many files as you need them to. ++(git commit can get a little slow with a great deal of files,+but that's out of scope -- and recent git-annex versions use queuing+to save git add from piling up too much in the index.)++But currently two git-annex commands are quite slow when annexes become large+in quantity of files. These are unused and status.+(Both have --fast versions that don't do as much).+> (Update: status has become acceptably fast; most of its slowdown was due to using a bad data structure; scanning the tree is not particularly slow and it no longer looks at the git-annex branch.)++unused is slow because it needs two pieces of information that are not+quick to look up, and require examining the whole repo, very seekily:++1. The keys present in the annex. Found by looking thru .git/annex/objects+2. The keys referenced by files in git. Found by finding every file+ in git, and looking at its symlink.++Of these, the first is less expensive (typically, an annex does not have every+key in it). It could be optimized fairly simply, by adding a database+of keys present in the annex that is optimised to list them all. The+database would be updated by the few functions that move content in and+out.++The second is harder to optimise, because the user can delete, revert,+copy, add, etc files in git at will, and git-annex does not have a good way+to watch that and maintain a database of what keys are being referenced.++It could use a post-commit hook and examine files changed by commits, etc.+But then staged files would be left out. It might be sufficient to +make --fast trust the database... except unused will suggest *deleting*+data if nothing references it. Or maybe it could be required to have a+clean tree with nothing staged before running git-annex unused.++Anyway, this is a semi-longterm item for me. --[[Joey]]
@@ -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,23 @@+The checkout subcommand replaces the symlink that normally points at a+file's content, with a copy of the file. Once you've checked a file out,+you can edit it, and `git commit` it. On commit, git-annex will detect+if the file has been changed, and if it has, `add` its content to the+annex.++> Internally, this will need to store the original symlink to the file, in +> `.git/annex/checkedout/$filename`.+> +> * git-annex uncheckout moves that back+> * git-annex pre-commit hook checks each file being committed to see if+> it has a symlink there, and if so, removes the symlink and adds the new+> content to the annex. +> +> And it seems the file content should be copied, not moved or hard linked:+> +> * Makes sure other annexes can find it if transferring it from+> this annex.+> * Ensures it's always available for uncheckout.+> * Avoids the last copy of a file's content being lost when+> the checked out file is modified.++[[done]]
@@ -0,0 +1,7 @@+Since most file transfers, particularly to/from encrypted special remotes involve git-annex streaming through the contents of the file anyway, it should be possible to add a verification of the checksum nearly for free. The main thing needed is probably a faster haskell checksum library than Data.Digest.Pure.Sha, which is probably slow enough to be annoying.++I have not verified if an upload could be aborted before sending the data to the remote if a checksum failure is detected. It may be dependent on the individual special remote implementations. Some probably stream the encrypted data directly out the wire, while others need to set up a temp file to run a command on. It would certianly be possible to at least make the upload abort and fail if a bad checksum was detected.++Doing the same for downloads is less useful, because the data is there locally to be fscked. The real advantage would be doing the check for uploads, to ensure that hard-to-detect corrupted files don't reach special remotes.++--[[Joey]]
@@ -0,0 +1,22 @@+Currently [[/direct_mode]] allows the user to point many normally safe+git commands at his foot and pull the trigger. At LCA2013, a git-annex+user suggested modifying direct mode to make this impossible.++One way to do it would be to move the .git directory. Instead, make there+be a .git-annex directory in direct mode repositories. git-annex would know+how to use it, and would be extended to support all known safe git+commands, passing parameters through, and in some cases verifying them.++So, for example, `git annex commit` would run `git commit --git-dir=.git-annex`++However, `git annex commit -a` would refuse to run, or even do something+intelligent that does not involve staging every direct mode file.++----++One source of problems here is that there is some overlap between git-annex+and git commands. Ie, `git annex add` cannot be a passthrough for `git+add`. The git wrapper could instead be another program, or it could be+something like `git annex git add`++--[[Joey]]
@@ -0,0 +1,4 @@+recently fixed [[todo]] items.++[[!inline pages="./* and link(./done) and !*/Discussion" sort=mtime show=10+archive=yes]]
@@ -0,0 +1,18 @@+Say I have some files on remote A. But I'm away from it, and transferring+files from B to C. I'd like to avoid transferring any files I already have+on A. ++Something like:++ git annex copy --to C --exclude-on A++This would not contact A, just use its cached location log info.++I suppose I might also sometime want to only act on files that are+thought/known to be on A.++ git annex drop --only-on A++--[[Joey]] ++[[done]]
@@ -0,0 +1,9 @@+Apparently newer gnupg has support for hardware-accelerated AES-NI. It+would be good to have an option to use that. I also wonder if using the+same symmetric key for many files presents a security issues (and whether+using GPG keys directly would be more secure).++> [[done]]; you can now use encryption=pubkey when setting up a special+> remote to use pure public keys without the hybrid symmetric key scheme.+> Which you choose is up to you. Also, annex.gnupg-options can configure+> the ciphers used. --[[Joey]]
@@ -0,0 +1,4 @@+Using an rsync remote is currently very slow when there are a lot of files, since rsync appears to be called for each file copied. It would be awesome if each call to rsync was amortized to copy many files; rsync is very good at copying many small files quickly.++> [[done]]; bug submitter was apparently not using a version +> with rsync connection caching. --[[Joey]]
@@ -0,0 +1,5 @@+Find a way to copy a file with a progress bar, while still preserving+stat. Easiest way might be to use pv and fix up the permissions etc+after?++[[done]]
@@ -0,0 +1,4 @@+Should be possible to configure an annex.diskreserve setting for local+special remotes, such as a directory special remote or possibly a bup+special remote. (Although bup's deltas will make storing some versions of+files take less space than git-annex would have to assume it would take.)
@@ -0,0 +1,11 @@+add a git annex fsck that finds keys that have no referring file++(done)++* Need per-backend fsck support. sha1 can checksum all files in the annex.+ WORM can check filesize.++* Both can check that annex.numcopies is satisfied. Probably only+ querying the locationlog, not doing an online verification.++[[done]]
@@ -0,0 +1,13 @@+`git annex fsck --from remote`++Basically, this needs to receive each file in turn from the remote, to a+temp file, and then run the existing fsck code on it. Could be quite+expensive, but sometimes you really want to check.++An unencrypted directory special remote could be optimised, by not actually+copying the file, just dropping a symlink, etc.++The WORM backend doesn't care about file content, so it would be nice to+avoid transferring the content at all, and only send the size.++> [[done]] --[[Joey]]
@@ -0,0 +1,15 @@+[[done]]++I've been considering adding a `git-annex-shell` command. This would+be similar to `git-shell` (and in fact would pass unknown commands off to+`git-shell`).++## Reasons++* Allows locking down an account to only be able to use git-annex (and+ git).+* Avoids needing to construct complex shell commands to run on the remote+ system. (Mostly already avoided by the plumbing level commands.)+* Could possibly allow multiple things to be done with one ssh connection+ in future.+* Allows expanding `~` and `~user` in repopath on the remote system.
@@ -0,0 +1,32 @@+`git-annex unused` has to compare large sets of data+(all keys with content present in the repository,+with all keys used by files in the repository), and so+uses more memory than git-annex typically needs.++It used to be a lot worse (hundreds of megabytes).++Now it only needs enough memory to store a Set of all Keys that currently+have content in the annex. On a lightly populated repository, it runs in+quite low memory use (like 8 mb) even if the git repo has 100 thousand+files. On a repository with lots of file contents, it will use more.++Still, I would like to reduce this to a purely constant memory use,+as running in constant memory no matter the repo size is a git-annex design+goal.++One idea is to use a bloom filter. +For example, construct a bloom filter of all keys used by files in+the repository. Then for each key with content present, check if it's+in the bloom filter. Since there can be false positives, this might+miss finding some unused keys. The probability/size of filter+could be tunable.++> Fixed in `bloom` branch in git. --[[Joey]] +>> [[done]]! --[[Joey]] ++Another way might be to scan the git log for files that got removed+or changed what key they pointed to. Correlate with keys with content+currently present in the repository (possibly using a bloom filter again),+and that would yield a shortlist of keys that are probably not used. +Then scan thru all files in the repo to make sure that none point to keys+on the shortlist.
@@ -0,0 +1,39 @@+gitosis and gitolite should support git-annex being used to send/receive+files from the repositories they manage. Users with read-only access+could only get files, while users with write access could also put and drop+files.++Doing this right requires modifying both programs, to add [[git-annex-shell]]+to the list of things they can run, and only allow through appropriate+git-annex-shell subcommands to read-only users.++I have posted an RFC for modifying gitolite to the+[gitolite mailing list](http://groups.google.com/group/gitolite?lnk=srg).++> I have not developed a patch yet, but all that git-annex needs is a way+> to ssh to the server and run the git-annex-shell command there.+> git-annex-shell is very similar to git-shell. So, one way to enable+> it is simply to set GL_ADC_PATH to a directory containing git-annex-shell.+> +> But, that's not optimal, since git-annex-shell will send off receive-pack+> commands to git, which would bypass gitolite's permissions checking.+> Also, it makes sense to limit readonly users to only download, not+> upload/delete files from git-annex. Instead, I suggest adding something+> like this to gitolite's config:+ + # If set, users with W access can write file contents into the git-annex,+ # and users with R access can read file contents from the git-annex.+ $GL_GIT_ANNEX = 0;++> If this makes sense, I'm sure I can put a patch together for your+> review. It would involve modifying gl-auth-command so it knows how+> to run git-annex-shell, and how to parse out the "verb" from a+> git-annex-shell command line, and modifying R_COMMANDS and W_COMMANDS.++As I don't write python, someone else is needed to work on gitosis.+--[[Joey]] ++> [[done]]; support for gitolite is in its `pu` branch, and some changes+> made to git-annefor gitolite is in its `pu` branch, and some changes+> made to git-annex. Word is gitosis is not being maintained so I won't+> worry about try to support it. --[[Joey]]
@@ -0,0 +1,5 @@+how to handle git rm file? (should try to drop keys that have no+referring file, if it seems safe..)++[[done]] -- I think that git annex unused and dropunused are the best+solution to this.
@@ -0,0 +1,30 @@+Add a `git annex hide $file` that behaves like drop, checking counter info+and updating location log to say the current repo no longer has a file --+but does not actually remove the content.++Then `git annex unused` can be used to clean it up later. And in the+meantime, it's still locally accessible. This can be useful if you're+planning to need to free up space later, but want to hold onto the content+for a while. Possibly you'll be disconnected later, so it's easier to push+out that intent now.++--++TODO:++* Make 100% sure this is safe. Drop, etc should never check content files+ are present on other repos if the location log doesn't say the repo+ has the content.++* What will `git annex get` do if it's asked to get a file that has been+ hidden?++> Unless I am missing something: Make sure the data is correct (for SHA1 or other tracking) and restore locally. If that's not the case, delete and restore from remote. -- RichiH++----++Is 'unused' a good name? 'clean' and 'autoclean' would make more sense, imo. 'clean' deletes everything, whereas an optional 'autoclean' could try to be smart based on disk usage and/or SHA1, etc. -- RichiH++> Nah, `git annex unused/dropunused` already exist. --[[Joey]] ++>> OK, in that case forget what I said. No idea about your internal policy, but feel free to delete this part of the page, then. -- RichiH
@@ -0,0 +1,16 @@+A repository like http://annex.debconf.org/debconf-share/ has a git repo+published via http. When getting files from such a repo, git-annex tries+two urls. One url would be used by a bare repo, and the other by a non-bare+repo. (This is due to the directory hashing change.) Result is every file+download from a non-bare http repo starts with a 404 and then it retries+with the right url.++Since git-annex already downloads the .git/config to find the uuid of the+http repo, it could also look at it to see if the repo is bare. If not,+set a flag, and try the two urls in reverse order, which would almost+always avoid this 404 problem.++(The real solution is probably to flag day and get rid of the old-style+directory hashing, but that's been discussed elsewhere.)++--[[Joey]]
@@ -0,0 +1,8 @@+The IA would find it useful to be able to control the http headers+git-annex get, addurl, etc uses. This will allow setting cookies, for+example.++* annex-web-headers=blah +* Perhaps also annex-web-headers-command=blah++[[done]]
@@ -0,0 +1,8 @@+> josh: Do you do anything in git-annex to try to make the files immutable?+> For instance, removing write permission, or even chattr?+> joey: I don't, but that's a very good idea+> josh: Oh, I just thought of another slightly crazy but handy idea.+> josh: I'd hate to run into a program which somehow followed the symlink and then did an unlink to replace the file.+> josh: To break that, you could create a new directory under annex's internal directory for each file, and make the directory have no write permission.++[[done]] and done --[[Joey]]
@@ -0,0 +1,5 @@+It would be great to be able to use the pubDate of the entries with the --template option of importfeed.++Text.Feed.Query has a getItemPublishDate (and a getFeedPubDate, if we want some kind of ${feeddate}).++The best would be to allow a reformating of the date(s) with (for example) %Y-%m-%D
@@ -0,0 +1,24 @@+Justin Azoff realized git-annex should have an incremental fsck.++This requires storing the last fsck time of each object.++I would not be strongly opposed to sqlite, but I think there are other+places the data could be stored. One possible place is the mode or mtime+of the .git/annex/objects/xx/yy/$key directories (the parent directories+of where the content is stored). Perhaps the sticky bit could be used to+indicate the content has been fsked, and the mtime indicate the time+of last fsck. Anything that dropped or put in content would need to+clear the sticky bit. --[[Joey]] ++> Basic incremental fsck is done now.+> +> Some enhancements would include:+> +> * --max-age=30d Once the incremental fsck completes and was started 30 days ago,+> start a new one.+> * --time-limit --size-limit --file-limit: Limit how long the fsck runs.++>> Calling this [[done]]. The `--incremental-schedule` option+>> allows scheduling time between incremental fscks. `--time-limit` is+>> done. I implemented `--smallerthan` independently. Not clear what+>> `--file-limit` would be. --[[Joey]]
@@ -0,0 +1,8 @@+I don't want files that I dropped to immediately disappear from my local or all of my remotes repos on the next sync. Especially in situations where changes to the git-annex repo get automatically and immediately replicated to remote repos, I want a configurable "grace" period before files in .git/annex/objects get really deleted.++This has similarities to the "trash" on a desktop. It might also be nice to++* configure a maximum amount of space of the "trash"+* have a way to see the contents of the trash to easily recover deleted files++Maybe it would make sense to just move dropped files to the desktops trash? "git annex trash" as an alternative to drop?
@@ -0,0 +1,52 @@+I have two repos, using SHA1 backend and both using git.+The first one is a laptop, the second one is a usb drive.++When I drop a file on the laptop repo, the file is not available on that repo until I run *git annex get*+But when the usb drive is plugged in the file is actually available.++How about adding a feature to link some/all files to the remote repo?++e.g. +We have *railscasts/196-nested-model-form-part-1.mp4* file added to git, and only available on the usb drive:++ $ git annex whereis 196-nested-model-form-part-1.mp4 + whereis 196-nested-model-form-part-1.mp4 (1 copy) + a7b7d7a4-2a8a-11e1-aebc-d3c589296e81 -- origin (Portable usb drive)++I can see the link with:++ $ cd railscasts+ $ ls -ls 196*+ 8 lrwxr-xr-x 1 framallo staff 193 Dec 20 05:49 196-nested-model-form-part-1.mp4 -> ../.git/annex/objects/Wz/6P/SHA256-s16898930--43679c67cd968243f58f8f7fb30690b5f3f067574e318d609a01613a2a14351e/SHA256-s16898930--43679c67cd968243f58f8f7fb30690b5f3f067574e318d609a01613a2a14351e++I save this in a variable just to make the example more clear:++ ID=".git/annex/objects/Wz/6P/SHA256-s16898930--43679c67cd968243f58f8f7fb30690b5f3f067574e318d609a01613a2a14351e/SHA256-s16898930--43679c67cd968243f58f8f7fb30690b5f3f067574e318d609a01613a2a14351e"++The file doesn't exist on the local repo:++ $ ls ../$ID+ ls: ../$ID: No such file or directory++however I can create a link to access that file on the remote repo.+First I create a needed dir:++ $ mkdir ../.git/annex/objects/Wz/6P/SHA256-s16898930--43679c67cd968243f58f8f7fb30690b5f3f067574e318d609a01613a2a14351e/++Then I link to the remote file:++ $ ln -s /mnt/usb_drive/repo_folder/$ID ../$ID++now I can open the file in the laptop repo.+++I think it could be easy to implement. Maybe It's a naive approach, but looks apealing.+Checking if it's a real file or a link shouldn't impact on performance.+The limitation is that it would work only with remote repos on local dirs++Also allows you to have one directory structure like AFS or other distributed FS. If the file is not local I go to the remote server. +Which is great for apps like Picasa, Itunes, and friends that depends on the file location.++> This is a duplicate of [[union_mounting]]. So closing it: [[done]]. +> +> It's a good idea, but making sure git-annex correctly handles these links in all cases is a subtle problem that has not yet been tackled. --[[Joey]]
@@ -0,0 +1,25 @@+The `Makefile` should respect a `PREFIX` passed on the commandline so git-annex can be installed in (say) `$HOME`.++Simple patch:++[[!format diff """+diff --git a/Makefile b/Makefile+index b8995b2..5b1a6d4 100644+--- a/Makefile++++ b/Makefile+@@ -3,7 +3,7 @@ all=git-annex $(mans) docs++ GHC?=ghc+ GHCMAKE=$(GHC) $(GHCFLAGS) --make+-PREFIX=/usr++PREFIX?=/usr+ CABAL?=cabal # set to "./Setup" if you lack a cabal program++ # Am I typing :make in vim? Do a fast build.+"""]]++--[[anarcat]]++> [[done]] --[[Joey]]++> > [[thanks]]! ;) --[[anarcat]]
@@ -0,0 +1,22 @@+The traditionnal way of marking commandline flags in a manpage is with a `.B` (for Bold, I guess). It doesn't seem to be used by mdwn2man, which makes the manpage look a little more dull than it could.++The following patch makes those options come out more obviously:++[[!format diff """+diff --git a/Build/mdwn2man b/Build/mdwn2man+index ba5919b..7f819ad 100755+--- a/Build/mdwn2man++++ b/Build/mdwn2man+@@ -8,6 +8,7 @@ print ".TH $prog $section\n";++ while (<>) {+ s{(\\?)\[\[([^\s\|\]]+)(\|[^\s\]]+)?\]\]}{$1 ? "[[$2]]" : $2}eg;++ s/\`([^\`]*)\`/\\fB$1\\fP/g;+ s/\`//g;+ s/^\s*\./\\&./g;+ if (/^#\s/) {+"""]]++I tested it against the git-annex manpage and it seems to work well. --[[anarcat]]++> [[done]], thanks --[[Joey]]
@@ -0,0 +1,5 @@+Support for remote git repositories (ssh:// specifically can be made to+work, although the other end probably needs to have git-annex+installed..)++[[done]], at least get and put work..
@@ -0,0 +1,100 @@+We had some informal discussions on IRC about improving the output of the `whereis` command.++[[!toc levels=2]]++First version: columns+======================++[[mastensg]] started by implementing a [simple formatter](https://gist.github.com/mastensg/6500982) that would display things in columns [screenshot](http://www.ping.uio.no/~mastensg/whereis.png)++Second version: Xs+==================++After some suggestions from [[joey]], [[mastensg]] changed the format slightly ([screenshot](http://www.ping.uio.no/~mastensg/whereis2.png)):++[[!format txt """+17:01:34 <joeyh> foo+17:01:34 <joeyh> |bar+17:01:34 <joeyh> ||baz (untrusted)+17:01:34 <joeyh> |||+17:01:34 <joeyh> XXx 3? img.png+17:01:36 <joeyh> _X_ 1! bigfile+17:01:37 <joeyh> XX_ 2 zort+17:01:39 <joeyh> __x 1?! maybemissing+17:02:09 * joeyh does a s/\?/+/ in the above+17:02:24 <joeyh> and decrements the counters for untrusted+17:03:37 <joeyh> __x 0+! maybemissing+"""]]++Third version: incremental+==========================++Finally, [[anarcat]] worked on making it run faster on large repositories, in a [fork](https://gist.github.com/anarcat/6502988) of that first gist. Then paging was added (so headers are repeated). ++Fourth version: tuning and blocked+==================================++[[TobiasTheViking]] provided some bugfixes, and the next step was to implement the trusted/untrusted detection, and have a counter.++This required more advanced parsing of the remotes, and instead of starting to do some JSON parsing, [[anarcat]] figured it was time to learn some Haskell instead.++Current status: needs merge+===========================++So right now, the most recent version of the python script is in [anarcat's gist](https://gist.github.com/anarcat/6502988) and works reasonably well. However, it doesn't distinguish between trusted and untrusted repos and so on.++Furthermore, we'd like to see this factored into the `whereis` command directly. A [raw.hs](http://codepad.org/miVJb5oK) file has been programmed by `mastensg`, and is now available in the above gist. It fits the desired output and prototypes, and has been `haskellized` thanks to [[guilhem]].++Now we just need to merge those marvelous functions in `Whereis.hs` - but I can't quite figure out where to throw that code, so I'll leave it to someone more familiar with the internals of git-annex. The most recent version is still in [anarcat's gist](https://gist.github.com/anarcat/6502988). --[[anarcat]]++Desired output+--------------++The output we're aiming for is:++ foo+ |bar+ ||baz (untrusted)+ |||+ XXx 2+ img.png+ _X_ 1! bigfile+ XX_ 2 zort+ __x 0+! maybemissing++Legend:++ * `_` - file missing from repo+ * `x` - file may be present in untrusted repo+ * `X` - file is present in trusted repo+ * `[0-9]` - number of copies present in trusted repos+ * `+` - indicates there may be more copies present+ * `!` - indicates only one copy is left++Implementation notes+--------------------++[[!format txt """+20:48:18 <joeyh> if someone writes me a headerWhereis :: [(RemoteName, TrustLevel)] -> String and a formatWhereis :: [(RemoteName, TrustLevel, UUID)] -> [UUD] -> FileName -> String , I can do the rest ;)+20:49:22 <joeyh> make that second one formatWhereis :: [(RemoteName, TrueLevel, Bool)] -> FileName -> String+20:49:37 <joeyh> gah, typos+20:49:45 <joeyh> suppose you don't need the RemoteName either+"""]]++> So, I incorporated this, in a new remotes command.+> Showing all known repositories seemed a bit much+> (I have 30-some known repositories in some cases),+> so just showing configured remotes seems a good simplification.+> [[done]]+> --[[Joey]]++> > I would have prefered this to be optional since I don't explicitely configure all remotes in git, especially if I can't reach them all the time (e.g. my laptop). It seems to me this should at least be an option, but I am confused as to why `Remote.List.remoteList` doesn't list all remotes the same way `Remote.remote_list` does... Also, it's unfortunate that the +/!/count flags have been dropped, it would have been useful... Thanks for the merge anyways! --[[done]]+> > +> > The more I look at this, the more i think there are a few things wrong with the new `remotes` command.+> > +> > 1. the name is confusing: being a git addict, I would expect the `git annex remote` command to behave like the `git remote` command: list remotes, add remotes, remove remotes and so on. it would actually be useful to have such a command (which would replace `initremote`, I guess). i recommend replacing the current `whereis` command, even if enabled through a special flag+> > +> > 2. its behavior is inconsistent with other git annex commands: `git annex status`, for example, lists information about all remotes, regardless of whether they are configured in git. `remotes` (whatever it's called), should do the same, or at least provide an option to allow the user to list files on all remotes. The way things stand, there is no way to list files on non-git remotes, even if they are added explicitely as a remote, if the remote is not actually reachable: the files are just marked as absent (even thought `whereis` actually finds them). i recommend showing all remotes regardless, either opt-in or opt-out using a flag.+> > +> > 3. having the `!` flag, at least, would be useful because it would allow users to intuitively grep for problematic files without having to learn extra syntax. same with + and having an explicit count.+> > +> > thanks. --[[anarcat]]
@@ -0,0 +1,25 @@+Several things suggest now would be a good time to reorgaize the object+directory. This would be annex.version=2. It will be slightly painful for+all users, so this should be the *last* reorg in the forseeable future.++1. Remove colons from filenames, for [[bugs/fat_support]]++2. Add hashing, since some filesystems do suck (like er, fat at least :)+ [[forum/hashing_objects_directories]]+ (Also, may as well hash .git-annex/* while at it -- that's what+ really gets big.)++3. Add filesize metadata for [[bugs/free_space_checking]]. (Currently only+ present in WORM, and in an ad-hoc way.)++4. Perhaps use a generic format that will allow further metadata to be+ added later. For example,+ "bSHA1,s101111,kf3101c30bb23467deaec5d78c6daa71d395d1879"++ (Probably everything after ",k" should be part of the key, even if it+ contains the "," separator character. Otherwise an escaping mechanism+ would be needed.)++[[done]] now! ++Although [[bugs/free_space_checking]] is not quite there --[[Joey]]
@@ -0,0 +1,23 @@+Typically `git-annex merge` is fast, but it could still be sped up.++`git-annex merge` runs `git-hash-object` once per file that needs to be+merged. Elsewhere in git-annex, `git-hash-object` is used in a faster mode,+reading files from disk via `--stdin-paths`. But here, the data is not+in raw files on disk, and I doubt writing them is the best approach.+Instead, I'd like a way to stream multiple objects into git using stdin.+Sometime, should look at either extending git-hash-object to support that,+or possibly look at using git-fast-import instead.++--- ++`git-annex merge` also runs `git show` once per file that needs to be+merged. This could be reduced to a single call to `git-cat-file --batch`,+There is already a Git.CatFile library that can do this easily. --[[Joey]]++> This is now done, part above remains todo. --[[Joey]] ++---++Merging used to use memory proportional to the size of the diff. It now+streams data, running in constant space. This probably sped it up a lot,+as there's much less allocation and GC action. --[[Joey]]
@@ -0,0 +1,6 @@+I have a git-annex repository on a NSLU 2, and transfers are much slower over ssh compared to unencrypted transfers (no wonder at that CPU speed). For the files that I am transferring, no encryption would be necessary. Unfortunately, ssh in Debian does not support "-c none" to disable encryption.++It would be nice if git-annex would have a way of conveniently transferring files in another way than SSH. I’m not sure what a good way would be – maybe launching a one-shot HTTP-server on the sending end? Haskell libraries for that would be available... Of course it is not always the case that the host reachable with "ssh foo" is also reachable via TCP at "foo:1234"... And there are surely more problem. But still, it would be nice :-)++> Setting `remote.name.annex-rsync-transport = rsh` will now+> make rsync special remotes use rsh instead of ssh. [[done]]
@@ -0,0 +1,13 @@+One of my reasons for using haskell was that it provides the possibility of+some parallell processing. Although since git-annex hits the filesystem+heavily and mostly runs other git commands, maybe not a whole lot.++Anyway, each git-annex command is broken down into a series of independant +actions, which has some potential for parallelism.++Each action has 3 distinct phases, basically "check", "perform", and+"cleanup". The perform actions are probably parellizable; the cleanup may be+(but not if it has to run git commands to stage state; it can queue+commands though); the check should be easily parallelizable, although they+may access the disk or run minor git query commands, so would probably not+want to run too many of them at once.
@@ -0,0 +1,4 @@+--push/--pull should take a reponame and files, and push those files+ to that repo; dropping them from the current repo++[[done]] (move --from/--to)
@@ -0,0 +1,23 @@+Currently, `git annex status` only shows the size of 1 copy of each file.+If numcopies is being used for redundancy, much more disk can actually be+in use than status shows.++One idea:++ known annex size: 2 terabytes (plus 4 terabytes of redundant copies)++But, to get that number, it would have to walk every location log, +counting how many copies currently exist of each file. That would make+status a lot slower than it is.++One option is to just put it at the end of the status:++ redundancy: 300% (4 terabytes of copies)++And ctrl-c if it's taking too long.++Hmm, fsck looks at that same info. Maybe it could cache the redundancy+level it discovers? Since fsck can be run incrementally, it would be tricky+to get an overall number. And the number would tend to be stale, but+then again it might also be nice if status shows how long ago the last fsck+was.
@@ -0,0 +1,22 @@+Resuming interrupted uploads to encrypted special remotes is not currently+possible, because gpg does not produce consistent output. Special remotes+that could support resuming include rsync and glacier.++Without consistent output, git-annex would need to locally cache the encrypted+file, and reuse that cache when resuming an upload. This would make+encrypted uploads more expensive in terms of both file IO and disk space+used. ++[It would be possible to write to the cache at the same time the special+remote is being fed data, and if the special remote upload fails, continue+writing the rest of the file. That would avoid half the overhead, since+the file would not need to be read from, just written to. (Although OS+caching may accomplish the same thing.)]++Also, `git annex unused` would need to show temp files for uploads,+the same as it currently shows temp files for downloads, and users would+sometimes need to manually dropunused old uploads, that never completed.++The question, then, is whether resuming uploads is useful enough to add+this overhead and user-visible complexity.+--[[Joey]]
@@ -0,0 +1,4 @@+Transferring a file from a ssh:// remote should use rsync to allow resuming+of a prior transfer.++[[done]]
@@ -0,0 +1,162 @@+git-annex should use smudge/clean filters.++----++Update: Currently, this does not look likely to work. In particular,+the clean filter needs to consume all stdin from git, which consists of the+entire content of the file. It cannot optimise by directly accessing+the file in the repository, because git may be cleaning a different+version of the file during a merge. ++So every `git status` would need to read the entire content of all+available files, and checksum them, which is too expensive.++> Update from GitTogether: Peff thinks a new interface could be added to+> git to handle this sort of case in an efficient way.. just needs someone+> to do the work. --[[Joey]] ++----++The clean filter is run when files are staged for commit. So a user could copy+any file into the annex, git add it, and git-annex's clean filter causes+the file's key to be staged, while its value is added to the annex.++The smudge filter is run when files are checked out. Since git annex+repos have partial content, this would not git annex get the file content.+Instead, if the content is not currently available, it would need to do+something like return empty file content. (Sadly, it cannot create a+symlink, as git still wants to write the file afterwards.)++So the nice current behavior of unavailable files being clearly missing due+to dangling symlinks, would be lost when using smudge/clean filters.+(Contact git developers to get an interface to do this?)++Instead, we get the nice behavior of not having to remeber to `git annex+add` files, and just being able to use `git add` or `git commit -a`,+and have it use git-annex when .gitattributes says to. Also, annexed+files can be directly modified without having to `git annex unlock`.++### design++In .gitattributes, the user would put something like "* filter=git-annex".+This way they could control which files are annexed vs added normally.++(git-annex could have further controls to allow eg, passing small files+through to regular processing. At least .gitattributes is a special case,+it should never be annexed...)++For files not configured this way, git-annex could continue to use+its symlink method -- this would preserve backwards compatability,+and even allow mixing the two methods in a repo as desired.++To find files in the repository that are annexed, git-annex would do+`ls-files` as now, but would check if found files have the appropriate+filter, rather than the current symlink checks. To determine the key+of a file, rather than reading its symlink, git-annex would need to+look up the git blob associated with the file -- this can be done+efficiently using the existing code in `Branch.catFile`.++The clean filter would inject the file's content into the annex, and hard+link from the annex to the file. Avoiding duplication of data.++The smudge filter can't do that, so to avoid duplication of data, it+might always create an empty file. To get the content, `git annex get`+could be used (which would hard link it). A `post-checkout` hook might+be used to set up hard links for all currently available content.++#### clean++The trick is doing it efficiently. Since git a2b665d, v1.7.4.1,+something like this works to provide a filename to the clean script:++ git config --global filter.huge.clean huge-clean %f++This could avoid it needing to read all the current file content from stdin+when doing eg, a git status or git commit. Instead it is passed the+filename that git is operating on, in the working directory.+(Update: No, doesn't work; git may be cleaning a different file content+than is currently on disk, and git requires all stdin be consumed too.)++So, WORM could just look at that file and easily tell if it is one+it already knows (same mtime and size). If so, it can short-circuit and+do nothing, file content is already cached.++SHA1 has a harder job. Would not want to re-sha1 the file every time,+probably. So it'd need a local cache of file stat info, mapped to known+objects.++But: Even with %f, git actually passes the full file content to the clean+filter, and if it fails to consume it all, it will crash (may only happen+if the file is larger than some chunk size; tried with 500 mb file and +saw a SIGPIPE.) This means unnecessary works needs to be done, +and it slows down *everything*, from `git status` to `git commit`.+**showstopper** I have sent a patch to the git mailing list to address+this. <http://marc.info/?l=git&m=131465033512157&w=2> (Update: apparently+can't be fixed.)++#### smudge++The smudge script can also be provided a filename with %f, but it+cannot directly write to the file or git gets unhappy.++### dealing with partial content availability++The smudge filter cannot be allowed to fail, that leaves the tree and+index in a weird state. So if a file's content is requested by calling+the smudge filter, the trick is to instead provide dummy content,+indicating it is not available (and perhaps saying to run "git-annex get").++Then, in the clean filter, it has to detect that it's cleaning a file+with that dummy content, and make sure to provide the same identifier as+it would if the file content was there. ++I've a demo implementation of this technique in the scripts below.++----++### test files++huge-smudge:++<pre>+#!/bin/sh+read f+file="$1"+echo "smudging $f" >&2+if [ -e ~/$f ]; then+ cat ~/$f # possibly expensive copy here+else+ echo "$f not available"+fi+</pre>++huge-clean:++<pre>+#!/bin/sh+file="$1"+cat >/tmp/file+# in real life, this should be done more efficiently, not trying to read+# the whole file content!+if grep -q 'not available' /tmp/file; then+ awk '{print $1}' /tmp/file # provide what we would if the content were avail!+ exit 0+fi+echo "cleaning $file" >&2+# XXX store file content here+echo $file+</pre>++.gitattributes:++<pre>+*.huge filter=huge+</pre>++in .git/config:++<pre>+[filter "huge"]+ clean = huge-clean %f+ smudge = huge-smudge %f+<pre>
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://christian.amsuess.com/chrysn"+ nickname="chrysn"+ subject="git-add instead of git-annex-add"+ date="2011-02-26T21:43:21Z"+ content="""+would, with these modifications in place, there still be a way to *really* git-add a file? (my main repository contains both normal git and git-annex files.)+"""]]
@@ -0,0 +1,12 @@+[[!comment format=mdwn+ username="http://dieter-be.myopenid.com/"+ nickname="dieter"+ subject="symlinks"+ date="2011-04-03T20:30:21Z"+ content="""+> (Sadly, it cannot create a symlink, as git still wants to write the file afterwards.+> So the nice current behavior of unavailable files being clearly missing due to dangling symlinks, would be lost when using smudge/clean filters. (Contact git developers to get an interface to do this?)++Have you checked what the smudge filter sees when the input is a symlink? Because git supports tracking symlinks, so it should also support pushing symlinks through a smudge filter, right?+Either way: yes, contact the git devs, one can only ask and hope. And if you can demonstrate the awesomeness of git-annex they might get more 1interested :)+"""]]
@@ -0,0 +1,30 @@+Amazon's new glacier service would be a nice special remote to support for+long-term archival.++The main difficulty is that glacier is organized into vaults, and accessing+a file in a vault takes ~4 hours. A naive implementation would make `git+annex get` wait for 4 hours, which is certianly not reasonable.++One approach I am pondering is to make each glacier vault a separate+special remote. You could then request git-annex to spin up a remote, and+come back later, and be able to access the data stored in it (need to check+if glacier would also allow adding new data to it then). This is+conceptually similar to using git-annex with offline removable drives,+except with glacier, you have a controllable robot to get them plugged in. :)++Ideally, git-annex would arrange for glacier to send it a message when the+vault becomes available, and the user could queue a list of commands to+run, or files to transfer, at that point.++--[[Joey]]++> [[done]]! --[[Joey]]++-----++> In the coming months, Amazon S3 will introduce an option that will allow customers to seamlessly move data between Amazon S3 and Amazon Glacier based on data lifecycle policies.++-- <http://aws.amazon.com/glacier/faqs/#How_should_I_choose_between_Amazon_Glacier_and_Amazon_S3>++>> They did, but it's IMHO not very useful for git-annex. It's rather+>> intended to allow aging S3 storage out to Glacier. --[[Joey]]
@@ -0,0 +1,40 @@+moving to the git-annex branch has slowed down fsck worse than most+commands. Actually, some commands have sped up, while others like get+are slightly slower but are swamped by the normal runtime. ++For fsck though, it has to pull each file's location log info out of git.+And, it's typically run on the entire tree.++Another slow one in `git annex copy --from`.++It would be possible to run a single `git cat-file --batch` and pass it+sha1s of location logs for file that is going to be fsked (gotten via+`read-tree`). Then just read its output until the next requested sha1 to+chunk it, and pass this in to fsck in a closure.++The difficulty, besides writing that is that everything that works with+location logs now reads them out of git, would need to find a way to+provide the info on a side channel of some sort.++If this is implemented, the same infrastructure could be used for other+commands like whereis and add. --[[Joey]]++> Updated plan:+> +> Run `git ls-file --batch`, and cache its stdin and out handles in Branch+> state.+> +> To see a git-annex branch file, send it something like+> "git-annex:uuid.log", and read the content fron stdout handle.+> +> To detect the end of content, send "TOKEN\n", and look for +> "TOKEN missing" in its output. A good choice for TOKEN is anything+> that will never exist in the repo; 40 0's would be a fairly good choice,+> but even better seems to be something completely invalid and impossible+> to have as a sha1 or filename or ref: "".+> +> Hmm, except that's actually an error message sent to stderr. Unless+> stderr is connected to stdout, it might be better to look for a known,+> empty object. Could just add a git-annex:empty file to that end.++[[done]] --[[Joey]]
@@ -0,0 +1,23 @@+I am just asking myself, is it stupid to think that streaming in git annex would be a good idea and wouldnt it be totaly easy to implement?++Ok just tried to link to files over ssh, it creates a link but you cant open with it its content ^^++But at least the files you have access over some filesystem as example samba/sshfs or just a other directory or usb-drive you could stream instead of "get"++you could add another mode like direct and indirect, like symbolic-links or something like that?++Sadly linux is to stupid to allow direct ssh links ( thats maybe one of the biggest features hurd has over linux ) but you could mount with sshfs readonly (checking first if sshfs is installed) to mount the files there and then map the links there.++ok I am not so shure how hard it would be and how much bug potentials it creates, but it would be great I guess.++git annex is a bit like a telephone book, where you get a list of where the targets are. So using it to call the persons so that they drive to you to talk with you is nice. But I think the better feature would be if you just talk with the guy over the telephone directly bevore he comes to you (streaming)++I mean you did one great thing, you did make cloudy thing peer to peer, like git is targeted too but for smaller files, yes there are may use cases without this feature, but I would be really glad if it could do that too, if I give annex 5 locations on other pcs usb-sticks etc, I find it stupid to additionaly do setup all this sources again a second time for streaming, and then I have maybe even 2 different file names because you map stuff in git.++So sorry its late here, I am a bit tired so I maybe dont know what I am talking right now, my english isnt the best, too, but I think it would be a great feature.++I mean on your setup, with slow internet, you maybe always make a get command, but here, if I link to youtube, I have no problem to stream it, or even on internal network between my pcs I have gb-lan, I start directly movies streaming, I would only use get, in rare cases where I need them on a train, the normal thing is to stream stuff.++So I have to go sleep now ++bye
@@ -0,0 +1,26 @@+Currenty, git-annex forces output, particularly of filenames, in a utf-8+locale.++Note that this does not mean it cannot be used with filenames in other+encodings. git-annex is entirely encoding agnostic when it comes to +manipulating filenames. It just *displays* their names always converted to+utf-8, which may not look right when you have a non-utf8 locale.++This had to be done to work around some bugs with haskell's handling+of filename encodings. In particular,++* [[bugs/unhappy_without_UTF8_locale]]: haskell crashes when told to output + a string with characters > 255 in a non-utf8 locale.+* [[bugs/problems_with_utf8_names]]: On many OSs, haskell expects+ non-decoded raw char8 in FilePaths. In order to display a filename,+ though, it needs to first be decoded, and git-annex currently assumes+ it was encoded as utf8.++git-annex's behavior is unlikely to improve much until haskell's+support for utf8 filenames improves. --[[Joey]]++> [[done]] -- I just turned off all encoding handling on stdout and stderr,+> which avoids these problems nicely. Git-annex now displays just what it+> input, at least on platforms where haskell does not decode unicode in+> FilePaths. This will later be a problem when it gets localized, but for+> now works great. --[[Joey]]
@@ -0,0 +1,14 @@+Did not know of this when I wrote S3 support. Ability to resume large+uploads would be good.++<http://aws.typepad.com/aws/2010/11/amazon-s3-multipart-upload.html>++Also allows supporting files > 5 gb, a S3 limit I was not aware of.++NB: It would work just as well to split the object and upload the N parts+to S3, but not bother with S3's paperwork to rejoin them into one object. +Only reasons not to do that are a) backwards compatability with +the existing S3 remote and b) this would not allow accessing the content+in S3 w/o using git-annex, which could be useful in some scenarios.++--[[Joey]]
@@ -0,0 +1,11 @@+I'm curious if there's a possibility to support lossy remotes. It may be handy to support syncing to special remotes that do lossy compression on the files (e.g., videos and images). For example, one could imagine having a YouTube special remote that only syncs video files. The original files wouldn't be available for download due to the transcoding and compression that YouTube does, so they wouldn't count towards the number of copies. In this YouTube example, the user gains:++1. an online place that their videos are available from+2. a worst-case scenario "backup"+3. a remote that they could download smaller video files++> [[done]]; lossy remotes are supported as seen with `git annex addurl+> --fast` and also with the new addurl support for using quvi to get+> videos fro youtube. Just make a key with a URL or something in it, and +> no size or checksum, and any content will be assumed to be the right+> content. --[[Joey]]
@@ -0,0 +1,25 @@+It would be good to have something in between the hook special remote and+the built-in special remotes. The hook is easy to set up, but its simple+interface misses some features that a more full-features interface could+provide to a third-party program that wants to provide the best possible+special remote it can w/o being written in haskell:++* No way to send progress updates when uploading, so no progress bars for uploads from hook special remotes in the webapp.+* No way to verify the `initremote` parameters include all needed configuration, and do any initalization needed.+* No way to query and/or set the remote.log while it's running. (Well, technically, `git annex enableremote` can set values..)+* No way to store per-key information to the git-annex branch.+* No (easy) way to split files into chunks.++Some of these features could be added to git-annex as subcommands. Which would+improve the general programmability and flexability of git-annex. OTOH,+running `git-annex upload-progress` repeatedly is pretty ugly. Or the+interface could provide a channel for the program and git-annex to+communicate back and forth on. Maybe a mix of the two?++A final feature such an interface should provide is the ability to drop a+program into PATH and have it just work, without the user needing to do any+configuration beyond `initremote`. So, `git annex initremote foo type=$bar`+should look for `git-annex-remote-$bar` in PATH if that's not a built-in+special remote name.++--[[Joey]]
@@ -0,0 +1,17 @@+What is says on the tin:++ 22:56:54 < RichiH> joeyh_: by the way, i have been thinking about fsck on bare repos+ 22:57:37 < RichiH> joeyh_: the best i could come with is to have a bare and a non-bare access the same repo store+ 22:58:00 < RichiH> joeyh_: alternatively, with the SHA* backend, you have all the information to verify that the local data is correct+ 22:58:41 < RichiH> and verifying that would already be a plus. if there really _is_ a problem, having the SHA is enough to track issues down+ 23:09:50 < joeyh_> oh, I think I have code that fsck could use on bare repos already.. just a matter of wiring it up+ 23:10:42 < joeyh_> feel free to reopen a bug or whatever so I remember.. the unused command's branch content enumeration could be used in a bare repo+ 23:14:51 < joeyh_> unused/dropunused could work in bare repos too btw++> Also `status`'s total annex keys/size could be handled for bare repos. --[[Joey]] ++>> Fsck is done. Rest not done yet. --[[Joey]]++>>> all [[done]]! --[[Joey]] ++[[!meta title="support unused, dropunused in bare repos"]]
@@ -0,0 +1,14 @@+TODO: implement below++git-annex does use a lot of symlinks. Specicially, relative symlinks,+that are checked into git. To allow you to move those around without+annoyance, git-annex can run as a post-commit hook. This way, you can `git mv`+a symlink to an annexed file, and as soon as you commit, it will be fixed+up.++`git annex init` tries to set up a post-commit hook that is itself a symlink+back to git-annex. If you want to have your own shell script in the post-commit+hook, just make it call `git annex` with no parameters. git-annex will detect+when it's run from a git hook and do the necessary fixups.++[[done]]
@@ -0,0 +1,6 @@+As discussed on debconf, I have the following use case:++* I have a dump remote, a folder on my webserver where files are uploaded through the web app. I don't have git on the webserver, just a plain folder.+* I have git-annex repo on a development server. The development server polls the webserver (ssh/ftp) once in an hour and synchronizes the state of the local git-annex repo with the state found on the webserver and commits that.+* This is not meant to be backup facility. I just want to be able to have a state on my development machine that is very likely to the state on the webserver.+
@@ -0,0 +1,21 @@+[[forum/tips:_special__95__remotes__47__hook_with_tahoe-lafs]] is a good+start, but Zooko points out that using Tahoe's directory translation layer+incurs O(N^2) overhead as the number of objects grows. Also, making+hash subdirectories in Tahoe is expensive. Instead it would be good to use+it as a key/value store directly. The catch is that doing so involves+sending the content to Tahoe, and getting back a key identifier.++This would be fairly easy to do as a [[backend|backends]], which can assign its+own key names (although typically done before data is stored in it),+but a tahoe-lafs special remote would be more flexible.++To support a special remote, a mapping is needed from git-annex keys to+Tahoe keys.++The best place to store this mapping is perhaps as a new field in the+location log:++ date present repo-uuid newfields++This way, each remote can store its own key-specfic data in the same place+as other key-specific data, with minimal overhead.
@@ -0,0 +1,10 @@+It should be possible to union mount annexes. So if multiple drives have+content, an annex mounting them both would have available all the +content from all the drives.++This could be done by just making .git/annex/KEY link to the actual content+on the mounted annex.++(Need to make sure the [[copy_tracking|copies]] code does not+confused and think the symlink is a copy of the content.. Also need to make+sure that code that writes to .git/annex does not follow symlinks.))
@@ -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,9 @@+Seems that a fairly common desire in some use cases is to be able to make a+clone of a repository and be able to get files, without updating the+location tracking information. (And without even recording a uuid in the+remote.log.) Use cases include wanting to have temporary+clones without cluttering history, and centralized development where the+developers don't care to know about one-another's systems.++It seems that such an untracked repository would need to automatically+consider itself untrusted. Is that enough to avoid losing data?
@@ -0,0 +1,7 @@+The unlock command needs to copy a file, and it would be great to use this:+ cp --reflink=auto src dst++O(1) overhead on BTRFS. Needs coreutils 7.6; and remember that git-annex+may be used on systems without coreutils..++[[done]]
@@ -0,0 +1,11 @@+There is no way to `git annex add` a file using the URL [[backend|backends]].++For now, we have to manually make the symlink. Something like this:++ ln -s .git/annex/URL:http:%%www.example.com%foo.tar.gz++Note the escaping of slashes.++A `git annex register <url>` command could do this..++[[done]]
@@ -0,0 +1,15 @@+The git-annex Windows port is not ready for prime time. But it does exist+now! --[[Joey]] ++## status++* Does not work with Cygwin's build of git (that git does not consistently+ support use of DOS style paths, which git-annex uses on Windows). + Must use the upstream build of git for Windows.+* rsync special remotes are known buggy.+* Bad file locking, it's probably not safe to run more than one git-annex+ process at the same time on Windows.+* No support for the assistant or webapp.+* Ssh connection caching does not work on Windows, so `git annex get`+ has to connect twice to the remote system over ssh per file, which+ is much slower than on systems supporting connection caching.
@@ -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,9 @@+If possible a frequently updated daily build in separate package for those more adventurous of us.++It would make installing and testing much easier and no need to change configuration settings to allow untrusted source.++> While it's vaid to wish that someone might put the apk into Google Play,+> I a) don't feel it's ready b) don't know if I want to go through+> the rigamarole required to use that service and c) don't feel this+> bug tracker is an appropriate place to track what is effectively a+> nontechnical request. [[done]] --[[Joey]]
@@ -0,0 +1,7 @@+It would be very nice with an "advanced settings" for jabber and webdav support.++Currently XMPP fails if you use a google apps account. Since the domain provided in the email is not the same as the XMPP server.++Same goes for webdav support. If i have my own webdav server somewhere on the internet there is no way to set it up in the assistant.++[[!tag /design/assistant]]
@@ -0,0 +1,4 @@+Cleaning out a repository is presently a fairly manual process. Am I missing a UI trick? "dropunsed" with no arguments prints nothing at all; I think in that case it should display the list of what could be dropped.++> [[done]]; comments seem satisfactory and I see no reason to complicate+> dropunused to output something unused already outputs. --[[Joey]]
@@ -0,0 +1,3 @@+I'm currently integrating git-annex support into a filesystem synchronization tool that I use, and I have a use case where I'd like to run "git annex sync' on a local directory, and then automatically ssh over to remote hosts and run "git annex sync" in the related annex on that remote host. However, while I can easily "cd" on the local, there is no really easy way to "cd" on the remote without a hack.++If I could say: git annex --annex-dir=PATH sync, where PATH is the annex directory, it would solve all my problems, and would also provide a nice correlation to the --git-dir option used by most Git commands. The basic idea is that I shouldn't have to be IN the directory to run git-annex commands, I should be able to tell git-annex which directory to apply its commands to.
@@ -0,0 +1,1 @@+As suggested during the first Gitify BoF during DebConf13: Adding a way to have on-demand dropping of content in a given remote would allow a user to quickly free up disk space on demand while still heeding numcopies etc.
@@ -0,0 +1,16 @@+[Maybe I should have extented [[wishlist:_simpler_gpg_usage/]], but I thought I'd make my own since it's perhaps too old.]++I second Justin and [[his idea|wishlist:_simpler_gpg_usage/#comment-e120f8ede0d4cffce17cbf84564211c1]] of having per-remote GnuPG options. I'd even go one step further, and propose the option in the <tt>.gitattributes</tt> file. Indeed by default GnuPG compresses the data before encryption, which doesn't make a lot of sense for git-annex (in my use-case at least); My work-around to save this waste of CPU cycles was to customize my <tt>gpg.conf</tt>, but it's somewhat dirty since I do want to use compression in general.++Here is how I envision the <tt>.git/config</tt>:+<pre> <code>[annex]+ gnupg-options = --s2k-cipher-algo AES256 --s2k-digest-algo SHA512 --s2k-count 8388608 --cipher-algo AES256 --compress-algo none+</code></pre>++And compression could be enabled on say, text files, with a suitable wildcard in the <tt>.gitattributes</tt> file.+<pre> <code>*.txt annex.gnupg-options="--s2k-cipher-algo AES256 --s2k-digest-algo SHA512 --s2k-count 8388608 --cipher-algo AES256 --compress-algo zlib"+</code></pre>++This is something I could probably hack on if you think it'd be a worthwhile option ;-)++> Done, and [[done]]! --[[Joey]]
@@ -0,0 +1,10 @@+When using SSH remote repository, git-annex uses rsync to download or upload files one at a time. I would like to have a preview of the overall transfer size so that I can estimate the transfer duration.++This could be done as an option of get, move or copy, or as a separated command.++If part of get, move or copy, git-annex could print how much has been done or how much left between every files.++Thanks.++> [[done]]; `git-annex status .` seems to cover the requested use case.+> --[[Joey]]
@@ -0,0 +1,3 @@+A big part of my online use is done via a low-speed connection over my mobile phone, this is limited to 16KB/sec because I always use up my 500MB quota the very first day of the month. `;-/` So when I need to download big files, I first download them to my online server, then transfer the files to my laptop with git-annex. If I'm connected via GSM, this occupies all the bandwidth and everything else moves like a heavily sedated slug. So if I want to work via VNC or SSH, I have to terminate ongoing transfers with Ctrl-C and then hopefully remember to restart it when I work locally. I know git-annex is robust enough to handle this gracefully, but it would be really nice to have a continuous connection going on in the background, limited to a value I choose.++rsync(1) has a `--bwlimit` (bandwidth limit) where you can specify max download/upload speed in kilobytes/sec. It would be great if a similar option was integrated into git-annex. Thanks in advance.
@@ -0,0 +1,45 @@+Simple, when performing various git annex command over ssh, in particular a multi-file get, and using password authentication, git annex will prompt more than once for a user password. This makes batch updates very inconvenient.++> I'd suggest using ssh-agent, or a passwordless ssh key. Possibly in+> combination with [[git-annex-shell]] if you want to lock down a+> particular ssh key to only being able to use git-annex and git-daemon.+> +> Combining multiple operations into a single ssh is on the todo list, but+> very far down it. --[[Joey]]++>> OTOH, automatically running ssh in ControlMaster mode (and stopping it+>> at exit) would be useful and not hard thing for git-annex to do.+>> +>> It'd just need to set the appropriate config options, setting+>> ControlPath to a per-remote socket location that includes git-annex's+>> pid. Then at shutdown, run `ssh -O exit` on each such socket.+>> +>> Complicated slightly by not doing this if the user has already set up+>> more broad ssh connection caching.+>> +>> [[done]]! --[[Joey]]++---++Slightly more elaborate design for using ssh connection caching:++* Per-uuid ssh socket in `.git/annex/ssh/user@host.socket`+* Can be shared amoung concurrent git-annex processes as well as ssh+ invocations inside the current git-annex.+* Also a lock file, `.git/annex/ssh/user@host.lock`.+ Open and take shared lock before running ssh; store lock in lock pool.+ (Not locking socket directly, because ssh might want to.)+* Run ssh like: `ssh -S .git/annex/ssh/user@host.socket -o ControlMaster=auto -o ControlPersist=yes user@host`+* At shutdown, enumerate all existing sockets, and on each:+ 1. Drop any shared lock.+ 2. Attempt to take an exclusive lock (non-blocking).+ 3. `ssh -q -S .git/annex/ssh/user@host.socket -o ControlMaster=auto -o ControlPersist=yes -O stop user@host`+ (Will exit nonzero if ssh is not running on that socket.)+ 4. And then remove the socket and the lock file.+* Do same *at startup*. Why? In case an old git-annex was interrupted+ and left behind a ssh. May have moved to a different network+ in the meantime, etc, and be stalled waiting for a response from the+ network, or talking to the wrong interface or something.+ (Ie, the reason why I don't use ssh connection caching by default.)+* User should be able to override this, to use their own preferred+ connection caching setup. `annex.sshcaching=false`
@@ -0,0 +1,7 @@+I would like to use the automated AWS lifecycle rules to move the git annex files store on S3 to Glacier after a bit of time. Git annex need must support this kind of S3 files explicitly in order for it to work.++This is different from the adding a Glacier remote to git annex because of the reasons explained in <http://aws.typepad.com/aws/2012/11/archive-s3-to-glacier.html>.++Basically, the files moved by AWS from S3 to Glacier are not available under the normal Glacier API. In fact, the moved S3 files are listed as available but under the `GLACIER` storage class and need a RESTORE request before they can be GET like other S3 files. Trying to GET an S3 file that has been moved to Glacier will not restore it from Glacier and will result in an 403 error.++I suppose DELETE needs special care as well.
@@ -0,0 +1,10 @@+Hello,++i'm in the process of managing my music collection with git-annex. The initial "git annex add" using the sha1 banckend is quite long an i was wondering that it could be nice to launch multiple "sha1sum" processes in parallel to speed up things.++Anyway, thanks for this wonderful piece of software.++Jean-Baptiste++> closing as dup of [[parallel possibilities]] (also see comments below)+> [[done]] --[[Joey]]
@@ -0,0 +1,14 @@+We're using git-annex to manage large files as part of a team.++We have a central repository of large files that everyone grabs from.++We would like to be able to get the files without updating the `git-annex` branch. This way it doesn't pollute the history with essentially always unreachable locations.++I think the easiest way would be to just add an option to not update the `git-annex` branch when `annex get` is executed.++Thoughts?++> See [[untracked_remotes]] for a todo item that will probably+> be useful in this sitation. Since that describes better what+> this bug report seems to be asking for, I am closing this one.+> [[closed|done]] --[[Joey]]
@@ -0,0 +1,30 @@+During the campaign adding a chunking feature to obscure filesize for encrypted files was added to the roadmap. But there is still one potentially valuable set* of data that git-annex can help obscure: when you access your remotes.++This data can be used to determine when a user is actively using a remote, but if a remote is always accessed at the same time that data becomes less useful. Somebody could still monitor total traffic over a long period and figure out that a remote was more active in a given week or month, but scheduling reduces the resolution of your access times and their data. Maybe this isn't the most important feature to add, but it would be nice to have, and could possibly be built on top of the existing git-annex scheduler. It could work by queuing inter-remote transactions ('get', 'copy', 'sync', etc.), so that jobs start at the same time every day, or even the same time and day every week.++Possible syntax examples:+###Setting up the schedule:+git annex queue schedule Monday:1730 (starts every monday at 5:30PM)++git annex queue schedule 1400 (starts every day at 2PM)++###Queuing git-annex commands:+git annex queue prepend sync (pretends 'sync' to the very front of the queue)++git annex queue append get file.ISO (appends to queue file.ISO for retrieval from a repo)++###Viewing/editing queue:+git annex queue view (view the current queue, jobs displayed with corresponding numbers)++git annex queue rm 20 (removes job 20 from queue)+++\*The four I can think of are:++* File contents (solved by crypto)++* File size (solved on the remote by chunking, but total traffic usage can't be helped)++* User IP/Remote IP (solved by VPN - outside scope of git-annex, unless someone writes a plugin)++* Access times (obscured by a queue and scheduling)
@@ -0,0 +1,4 @@+I've looked for this feature in the webapp but can't find it...++I mainly use the webapp and have been wondering 'how many copies of file X are there' and 'where are the copies of file Y'?+This is available in the commandline interface but it would be nice to have this in the webapp too.
@@ -0,0 +1,5 @@+Also suggested during the first Gitify BoF during DebConf13:++`git annex drop` deletes immediately. In some situations a mechanism to tell git-annex "I would like to hold onto this data if possible, but if you need the space, please delete it" could be nice.++An obvious question would be how to do cleanups. With the assistant, that's easy. On CLI, at the very least `git annex fsck` should list, and optionally delete, that data.
@@ -0,0 +1,10 @@+Similar to how++ git commit -m 'foo'++works, if I run ++ git annex sync -m 'my hovercraft is full of eels'++git annex should use that commit message instead of the default ones. That way, I could use [[sync]] directly and not be forced to commit prior to syncing just to make sure I have a useful commit message.+
@@ -0,0 +1,11 @@+It would be nice if "git annex addurl" allowed https: urls, rather than just http:.+To give an example, here is a PDF file:++ https://www.fbo.gov/utils/view?id=59ba4c8aa59101a09827ab7b9a787b05++If you switch the https: to http: it redirects you back to https:.++As more sites provide https: for non-secret traffic, this becomes more of an issue.++> I've gotten rid of the use of the HTTP library, now it just uses curl.+> [[done]] --[[Joey]]
@@ -0,0 +1,3 @@+It would be neat if Git annex addurl allowed a configuration option for a download manager command to do the actual download in place of wget/curl with a placeholder for the file name to save to & URL to get from (if that's all annex needs). That would allow the user to choose a graphical download manager if desired to make progress easier to monitor. The specific circumstance I'm seeing is with [[wishlist:_an___34__assistant__34___for_web-browsing_--_tracking_the_sources_of_the_downloads]]. I found that the existing Firefox addon [FlashGot](http://flashgot.net/) can run any command with arbitrary arguments including placeholders. Right now I've got a [script](https://gist.github.com/andyg0808/5342434) that changes to a user-selected directory and then runs git-annex addurl in it with the provided url. It works fine as a download manager for FlashGot. The issue is that there is no progress information for large file downloads. If git-annex could start a separate download manager to do the actual download, then the user would be able to check status at any time, even though the git-annex command was run from a GUI and not a terminal.++> [[done]], you can use `annex.web-download-command` now. --[[Joey]]
@@ -0,0 +1,1 @@+It would be nice to have mimetype support on the `annex.largefiles` configuration directive. F.e. `git config annex.largefiles "not mimetype=text/plain"`
@@ -0,0 +1,1 @@+An interesting feature, when an archived file cannot be removed from all clients because of the minimum number of copies required, would be to remove it from the repositories with the smallest amount of free space available.
@@ -0,0 +1,17 @@+Some suggestions for changes to command options:++ * --verbose:+ * add alternate: -v++ * --from:+ * replace with: -s $SOURCE || --source=$SOURCE++ * --to:+ * replace with: -d $DESTINATION || --destination=$DESTINATION++ * --force:+ * add alternate: -F+ * "-f" was removed in v0.20110417+ * since it forces unsafe operations, should be capitalized to reduce chance of accidental usage.++[[done]], see comments
@@ -0,0 +1,18 @@+I would like to be able to name a few remotes that must retain *all* annexed+files. `git-annex fsck` should warn me if any files are missing from those+remotes, even if `annex.numcopies` has been satisfied by other remotes.++I imagine this could also be useful for bup remotes, but I haven't actually+looked at those yet.++Based on existing output, this is what a warning message could look like:++ fsck FILE+ 3 of 3 trustworthy copies of FILE exist.+ FILE is, however, still missing from these required remotes:+ UUID -- Backup Drive 1+ UUID -- Backup Drive 2+ Back it up with git-annex copy.+ Warning++What do you think?
@@ -0,0 +1,36 @@+When using the [[/assistant]] on some of my repositories, I would like to+retain manual control over the granularity and contents of the commit+history. Some motivating reasons:++* manually specified commit messages makes the history easier to follow+* make a series of minor changes to a file over a period of a few hours would result in a single commit rather than capturing intermediate incomplete edits++* manual choice of which files to annex (based on predicted usage) could be useful, e.g. a repo might contain a 4MB PDF which you want available in *every* remote even without `git annex get`, and also some 2MB images which are only required in some remotes++> This particular case is now catered to by the "manual" repository group+> in preferred content settings. --[[Joey]]++Obviously this needs to be configurable at least per repository, and+ideally perhaps even per remote, since usage habits can vary from machine+to machine (e.g. I could choose to commit manually from my desktop machine+which has a nice comfy keyboard and large screen, but this would be too+much pain to do from my tiny netbook).++In fact, this is vaguely related to [[design/assistant/partial_content]],+since the usefulness of the commit history depends on the context of the+data being manipulated, which in turn depends on which subdirectories are+being touched. So any mechanism for disabling sync per directory could+potentially be reused for disabling auto-commit per directory.++According to Joey, it should be easy to arrange for the watcher thread not+to run, but would need some more work for the assistant to notice manual+commits in order to sync them; however the assistant already does some+crazy inotify watching of git refs, in order to detect incoming pushes, so+detecting manual commits wouldn't be a stretch.++[[!tag design/assistant]]++> You can do this now by pausing committing via the webapp,+> or setting `annex.autocommit=false`.+> +> The assustant probably doesn't push such commits yet.
@@ -0,0 +1,1 @@+It would be nice to have an indication of the status of the remotes in the webapp, for example with a field showing "In Sync", "Syncing", or the date of the last successful synchronization for unreachable remotes.
@@ -0,0 +1,5 @@+Given that git/config will have information on remotes and maybe costs, it might be a good idea to do a simple round robin selection of remotes to download files where the costs are the same.++This of course assumes that we like the idea of "parallel" launching and running of curl/rsync processes...++This wish item is probably only useful for the paranoid people who store more than 1 copy of their data.
@@ -0,0 +1,28 @@+In real life discussions with git-annex users at DebConf, the idea was proposed to have a way to drop the history of the git-annex branch, and replace it with a new branch with just the current state of the repository. ++The only thing that breaks when this is done, in theory, is `git annex log`, which can't show the location history +of files.++The crucial thing is that this operation would only need to be done in one repository, and it would then record some information in its (new) git-annex branch, so when it was pushed to other repositories, git-annex there could notice that history had been dropped, and do the same. So, even if you have rarely used offline archive repositories, the history dropping would eventually reach them, without needing to remember to do it.++There was speculation that it would be enough to record eg, the SHA of the top commit on the old branch. That may not be good enough, because another remote may have not gotten that SHA into its branch yet, or may have commits on top of that SHA. ++Maybe instead we want to record the SHA of the *first* commit to the old git-annex branch. This way, we can tell if the branch that got deleted is the one we're currently using. And if it is, we create a new branch with the current state of *our* branch, and then union merge the other branch into it.++Hmm, another wrinkle is that, when this indication propigates from remote A to remote B, remote B may also have some git-annex branches available for remotes C and D, which have not transitioned, and E, which has transitioned already. It seems B should first union merge C and D into B, and then flatten B to B', and then union merge A and E into B'.++I think that'd work!++--[[Joey]]++Will also allow dropping dead remotes from history. Just remove all+references to them when rewriting the branch. May or may not be desirable;+I sometimes care about dead remotes that I hope to one day recuscitate.+(OTOH, I can always run git annex fsck in them to get their location+tracking back, if I do manage to get them back.)++--[[Joey]] ++See also : [[forum/safely_dropping_git-annex_history]]++> [[done]] --[[Joey]]
@@ -0,0 +1,17 @@+### Current setup++ATM git-annex has++remote.<name>.annex-cost+remote.<name>.annex-cost-command # command is not provided cmdline options by annex++to set the cost for a given remote. That requires setting up one of those variables per each host, and possibly hardcoding options for the annex-cost-command providing e.g. the remote name.++### Suggestion++wouldn't it be more general and thus more flexible to have a repository-wide++annex.cost-command++which could take options %remote, %file and assessed accordingly per each file upon '--get' request to allow maximal flexibility: e.g. some files might better be fetched from remotes supporting transfer compression, some from the web, etc. Also it might be worth providing %remote_kind ("special" vs "git") to disambiguate %remote's?+
@@ -0,0 +1,12 @@+I'd like to be able to do something like the following:++ * Create encrypted git-annex remotes on a couple of semi-trusted machines - ones that have good connectivity, but non-redundant hardware+ * set numcopies=3+ * run `git-annex replicate` and have git-annex run the appropriate copy commands to make sure every file is on at least 3 machines++There would also likely be a `git annex rebalance` command which could be used if remotes were added or removed. If possible, it should copy files between servers directly, rather than proxy through a potentially slow client.++There might be the need to have a 'replication_priority' option for each remote that configures which machines would be preferred. That way you could set your local server to a high priority to ensure that it is always 1 of the 3 machines used and files are distributed across 2 of the remaining remotes. Other than priority, other options that might help:++ * maxspace - A self imposed quota per remote machine. git-annex replicate should try to replicate files first to machines with more free space. maxspace would change the free space calculation to be `min(actual_free_space, maxspace - space_used_by_git_annex)+ * bandwidth - when replication files, copies should be done between machines with the highest available bandwidth. ( I think this option could be useful for git-annex get in general)
@@ -0,0 +1,9 @@+git diff is not very helpful for annexed files.++How about a git annex diff command that allows to compare two versions of an annexed file?++Should be relatively simple, only there would have to be a way to deal with the situation where not both versions are present in the repository. Either abort with a message showing the command you need to run to get the missing version(s). Or even interactively volunteer to get it automatically, asking the user for confirmation.++Of course you wouldn't want to diff two large files, but with git annex assistant, all files are annexed by default (right?), so this would be useful.++There might already be a way to easily diff two versions of an annexed file which I'm missing -- in that case please point me to it! :)
@@ -0,0 +1,17 @@+I am running centralized git-annex exclusively.++Similar to++ git annex get++I'd like to have a++ git annex put++which would put all files on the default remote(s).++My main reason for not wanting to use copy --to is that I need to specify the remote's name in this case which makes writing a wrapper unnecessarily hard. Also, this would allow++ mr push++to do the right thing all by itself.
@@ -0,0 +1,21 @@+Ideally, it would look similar to this. And yes, I put "put" in there ;)++ non-annex % git annex status+ git annex status: error: not a git annex repository+ annex % git annex status+ annex object storage version: A+ annex backend engine: {WORM,SHA512,...}+ Estimated local annex size: B MiB+ Estimated total annex size: C MiB+ Files without file size information in local annex: D+ Files without file size information in total annex: E+ Last fsck: datetime+ Last git pull: datetime - $annex_name+ Last git push: datetime - $annex_name+ Last git annex get: datetime - $annex_name+ Last git annex put: datetime - $annex_name+ annex %++Datetime could be ISO's YYYY-MM-DDThh:mm:ss or, personal preference, YYYY-MM-DD--hh-mm-ss. I prefer the latter as it's DNS-, tag- and filename-safe which is why I am using it for everything. In a perfect world, ISO would standardize YYYY-MM-DD-T-hh-mm-ss-Z[-SSSSSSSS][--$timezone], but meh.++[[done]]
@@ -0,0 +1,9 @@+Preamble: Obviously, the core feature of git-annex is the ability to keep a subset of files in a local repo. The main trade-off is that you don't get version tracking.++Use case: On my laptop, I might not have enough disk space to store everything. Not so for my main box nor my backup server. And I would _really_ like to have proper version tracking for many of my files. Thus...++Wish: ...why not use git as a version backend? That way, I could just push all my stuff to the central instance(s) and have the best of both worlds. Depending on what backend is used in the local repos, it might make sense to define a list of supported client backends with pre-computed keys.++-- RichiH++[[done]] (bup)
@@ -0,0 +1,8 @@+Hi,++I would love to have a page of "history" or "events" in the webapp. Similar to how Dropbox or Box show it.+I've been using git-annex for my personal files for a few months now, and I feel like this is the only feature missing to start using it in a production multi-user environment.++Thanks++[[!tag design/assistant]]
@@ -0,0 +1,18 @@+### Please describe the problem.++`git annex reinject` refuses to work while in direct mode.++When in direct mode git annex reinject could simply perform `rm $symlink; mv $file_copy .; git annex add $file`. I prefer having git annex doing that so I am sure I am not messing up (mistakenly adding new files for instance) and everything is properly managed.++### What version of git-annex are you using? On what operating system?++git-annex 4.20130516.1++~~~~+$ lsb_release -a+No LSB modules are available.+Distributor ID: Ubuntu+Description: Ubuntu 12.04.2 LTS+Release: 12.04+Codename: precise+~~~~
@@ -0,0 +1,18 @@+Imagine this situation:+You have a laptop and a NAS.+On your laptop you want to consume a large media file located on the NAS.+So you type:++ git annex get --from nas mediafile++But now you have to wait for the download to complete, unless either ++* rsync is pointed directly to the file in the object storage ("--inplace")+or+* the symlink temporarily points to the partial file during a transfer++which would allow you instantaneous consumption of your media.+It might make sense to make this behavior configurable, because not everyone might agree with having partial content (that mismatches its key) around.+++So what do you say?
@@ -0,0 +1,39 @@+as of git-annex version 3.20110719, all git-annex commits only contain the word "update" as a commit message. given that the contents of the commit are pretty non-descriptive (SHA1 hashes for file names, uuids for repository names), i suggest to have more descriptive commit messages, as shown here:++ /mnt/usb_disk/photos/2011$ git annex get+ /mnt/usb_disk/photos/2011$ git show git-annex+ [...]+ usb-disk-photos: get 2011+ + * 10 files retrieved from 2 sources (9 from local-harddisk, 1 from my-server)+ * 120 files were already present+ * 2 files could not be retrieved+ /mnt/usb_disk/photos/2011$ cd ~/photos/2011/07+ ~/photos/2011/07$ git copy --to my-server+ ~/photos/2011/07$ git show git-annex+ [...]+ local-harddisk: copy 2011/07 to my-server+ + * 20 files pushed+ ~/photos/2011/07$++in my opinion, the messages should at least contain++* what command was used+* in which repository they were executed+* which files or directories they affected (not necessarily all files, but what was given on command line or implicitly from the working directory)++--[[chrysn]]++> The implementation of the git-annex branch precludes more descriptive+> commit messages, since a single commit can include changes that were+> previously staged to the branch's index file, or spooled to its journal+> by other git-annex commands (either concurrently running or+> interrupted commands, or even changes needed to automatically merge+> other git-annex branches).+> +> It would be possible to make it *less* verbose, with an empty commit+> message. :) --[[Joey]] ++>> Closing as this is literally impossible to do without making+>> git-annex worse. [[done]] --[[Joey]]
@@ -0,0 +1,9 @@+I'm testing out an idea of using filter-branch on a git repository to both retroactively annex and AND record a weburl for all relevant files.++c.f. [http://git-annex.branchable.com/tips/How_to_retroactively_annex_a_file_already_in_a_git_repo/](http://git-annex.branchable.com/tips/How_to_retroactively_annex_a_file_already_in_a_git_repo/)++The bottleneck I'm hitting here seems to be the fact that `git annex addurl` diligently checks each url to see that it is accessible, which adds up quickly if many files are to be processed.++It would be great if addurl had an option to disable checking the url, in order to speed up large batch jobs like this.++> --relaxed added [[done]] --[[Joey]]
@@ -0,0 +1,37 @@+It would be nice if the 'unused' command could optionally display info about the actual files behind its cryptic keys.++I created a (very rough) bash script that simply splices in some info from git log -S'KEY' --numstat into the unused list, like so:++ arand@mas:~/annex(master)$ bash ~/utv/scripts/annex-vunused + unused . (checking for unused data...) (checking master...) (checking synced/master...) (checking origin/HEAD...) (checking seagate/master...)+ Some annexed data is no longer used by any files:+ NUMBER KEY+ 1 SHA256E-s1073741824--49bc20df15e412a64472421e13fe86ff1c5165e18b2afccf160d4dc19fe68a14.img+ 8f479a4 Sat Feb 23 16:14:12 2013 +0100 remove bigfile+ 0 1 dummy_bigfile.img+ 2988d18 Sat Feb 23 16:13:48 2013 +0100 dummy file+ 1 0 dummy_bigfile.img+ (To see where data was previously used, try: git log --stat -S'KEY')To remove unwanted data: git-annex dropunused NUMBER+ ok+The script:++ #!/bin/bash+ + pipe="$(mktemp -u)"+ mkfifo "$pipe"+ + git annex unused >"$pipe" || exit 1 &+ + while read -r line+ do+ key="$(echo "$line" | sed 's/^[^-]*-\([^-]*\)-.*/\1/')"+ echo -n "$line"+ test -n "$key" && \+ echo && \+ git log --format="%h %cd %s" --numstat -S"$key" | \+ sed '/^$/d;/git-annex automatic sync/,/^ /d;s/^/\t\t/'+ + done < "$pipe"+ rm "$pipe"++It would be nice if something like this was available as an option, since it's good way to get a quick overview of what the content is, and if it's safe to drop it.
@@ -0,0 +1,39 @@+Currently, when `fsck`'ing a remote, files are first downloaded to a temporary +file locally, decrypted if needed, and finally digested; the temporary file is+then either thrown away, or quarantined, depending on the value of that digest.++Whereas this approach works with any kind of remote, in the particular case +where the user is granted execution rights on the digest command, one could+avoid cluttering the network and digest the file remotely. I propose the+addition of a per-remote git option `annex-remote-fsck` to switch between the+two behaviors.+++There is an issue with encrypted specialremotes, though. As hinted at +[[here|tips/beware_of_SSD_wear_when_doing_fsck_on_large_special_remotes/#comment-70055f166f7eeca976021d24a736b471]],+since the digest of a ciphertext can't be deduced from that of a plaintext in +general one would needs, before sending an encrypted file to such a remote, to+digest it and store that digest somewhere (together with the cipher's size and+perhaps other meta-information).++The usual directory structure (`.../.../{backend}-s{size}--{digest}.log`) seems+perfectly suitable to store these informations. Lines there would look like+`{timestamp}s {numcopy} {UUID} {remote digest}`. Of course, it implies that+remote digest commands are trustworthy (are doing the right thing), and that+the digest output are not tampered by others who have access to the git repo.+But that's outside the current threat model, I guess.++Actually, since git-annex always includes a MDC in the ciphertexts, we could do+something clever and even avoid running a digest algorithm. According to the+[[OpenPGP standard|https://tools.ietf.org/html/rfc4880#section-5.14]] the MDC+is essentially a SHA-1 hash of the plaintext. I'm still investigating if it's+even possible, but in theory it would be enough (with non-chained ciphers at+least) to download a few bytes from the encrypted remote, decrypt those bytes+to retrieve the hash, and compare that hash with the known value. Of course+there is a downside here, namely that files tampered anywhere but on the MDC+packets would not be detected by `fsck` (but gpg will warn when decrypting the+file).+++My 2 cents :-) Is there something I missed? I suppose there was a reason to +perform `fsck` locally at the first place...
@@ -0,0 +1,6 @@+Based on an irc conversation earlier today:++19:50 < warp> joeyh: what is the best way to figure out the (remote) filename for a file stored in an rsync remote?++20:43 < joeyh> warp: re your other question, probably the best thing would be to make the whereis command print out locations for each remote, as it always does for the web special remotes+
@@ -0,0 +1,4 @@+It would be helpful to have a way to query things like a repository's description and trust level, without having to poke in the git-annex branch. For example, "git annex describe ." currently clears the description but could print the current one instead.++> `git annex status` now breaks down the repository list by type. [[done]]+> --[[Joey]]
@@ -0,0 +1,7 @@+I think it would be interesting to have a way to recursively import a local directory without actually moving files around. And to be able to checksum these files as well (without moving them into the annex).++This would work somewhat similar to looping over a directory and adding file:// remotes for each file.++A use case is importing optical media (read-only), whilst keeping that media as a remote, and being able to calculate checksums directly without moving any files around.++For single files, it would also be interesting if addurl had a "--localchecksum" option that would only work for file:// urls, and make it checksum files directly from their source location?)
@@ -0,0 +1,36 @@+### Please describe the problem.++The environment is os/x with chrome as the browser.++Let's say I close the tab with the webapp running in it. The 'git-annex webapp' process is still running, according to 'ps'.++So I open a new tab, but then what do I type into the browser url bar to get the app back? What is usually there is a loopback address and an authorisation hash.++* Should I double-click on the git-annex icon in the dock (or Applications directory)?+* I figured out from observing the startup that if I give the url ://localhost/Users/me/annex/.git/annex/webapp.html I will get redirected to the right place.+Should I set up a bookmark for that?++### What steps will reproduce the problem?++see above.++### What version of git-annex are you using? On what operating system?++Version: 4.20130723-ge023649 +Build flags: Assistant Webapp Pairing Testsuite S3 WebDAV FsEvents XMPP DNS+os: os/x 10.8.4++### Please provide any additional information below.++I notice that in the webapp ui, all the items at the top of the page highlight when one hovers over them and have useful URLs attached,+with the exception of the 'git-annex' item at the far left.What if that had the entry point url attached to it (so one could bookmark that)?++> The git-annex assistant is designed to stay running in the background whether you have the web browser open or not. You can open the web display at any time by +> using the git-annex menu item (on linux) or running the git-annex-webapp+> program (which is in the DMG on OSX).+> +> If the file:// url were exposed to users, it would not work if +> the assistant had not already been started. This is why there is a program+> to open the webapp, not an url.+> +> Not a bug; [[done]] --[[Joey]]
@@ -0,0 +1,12 @@+This is my current understanding on how one must use gpg with git-annex:++ * Generate(or copy around) a gpg key on every machine that needs to access the encrypted remote.+ * git annex initremote myremote encryption=KEY for each key that you generated++What I'm trying to figure out is if I can generate a no-passphrase gpg key and commit it to the repository, and have git-annex use that. That way any new clones of the annex automatically have access to any encrypted remotes, without having to do any key management.++I think I can generate a no-passphrase key, but then I still have to manually copy it around to each machine.++I'm not a huge gpg user so part of this is me wanting to avoid having to manage and keeping track of the keys. This would probably be a non-issue if I used gpg on more machines and was more comfortable with it.++[[done]]
@@ -0,0 +1,1 @@+Special remote support for [Ubuntu One](http://one.ubuntu.com) would be nice. They're [using propietary but open protocol](https://wiki.ubuntu.com/UbuntuOne/TechnicalDetails#ubuntuone-storageprotocol) based on [Google Protocol Buffers](http://code.google.com/p/protobuf/). There's [protobuf for Haskell](http://code.google.com/p/protobuf-haskell/) so it should be possible to compile [the protocol file](http://bazaar.launchpad.net/~ubuntuone-control-tower/ubuntuone-storage-protocol/trunk/view/head:/ubuntuone/storageprotocol/protocol.proto) to Haskell code and then use that to implement the native Ubuntu special remote.
@@ -0,0 +1,28 @@+i think it would be useful to have a fourth kind of [[special_remotes]]+that connects to a dumb storage using sftp or rsync. this can be emulated+by using sshfs, but that means lots of round-trips through the system and+is limited to platforms where sshfs is available.++typical use cases are backups to storate shared between a group of people+where each user only has limited access (sftp or rsync), when using+[[special_remotes/bup]] is not an option.++an alternative to implementing yet another special remote would be to have+some kind of plugin system by which external programs can provide an+interface to key-value stores (i'd implement the sftp backend myself, but+haven't learned haskell yet).++> Ask and ye [[shall receive|special_remotes/rsync]].+> +> Sometimes I almost think that a generic configurable special remote that+> just uses configured shell commands would be useful.. But there's really+> no comparison with sitting down and writing code tuned to work with+> a given transport like rsync, when it comes to reliability and taking+> advantage of its abilities (like resuming). --[[Joey]]++>> big thanks, and bonus points for identical formats, so converting from+>> directory to rsync is just a matter of changing ``type`` from ``directory``+>> to ``rsync`` in ``.git-annex/remote.log`` and replacing the directory info+>> with ``annex-rsyncurl = <host>:<dir>`` in ``.git/config``. --[[chrysn]]++[[done]]
@@ -0,0 +1,3 @@+mega.co.nz has 50gb for free accounts. They also have an API, so I guess it wouldn't be too hard to use it as a special remote.++[[done]], see [[tips/megaannex]].
@@ -0,0 +1,29 @@+I'd like to be able to:++ git annex copy --from=x --to=y .++Use case (true story) follows:++My desktop hard drive was filling up. I dropped some large files which are also stored (via git-annex) on my backup drive. While these aren't irreplaceable files, I'd prefer to have at least two copies of everything I've decided I care enough about to archive. Later, I get a 2nd external drive, and I:++ git annex copy --to=new-external-drive .++Fantastic! Now I've got everything that was important/useful enough to keep on my desktop backed up a 2nd time onto my new drive.++But my new drive doesn't have a copy of any of the files I dropped from my desktop. I would like to be able to:++ git annex copy --from=old-external-drive --to=new-external-drive .++on my desktop, and then my new drive would have a copy of everything, and my desktop drive would still have plenty of space (ie the files I'd dropped to make space would still not be stored on the desktop).++The git repos on these external drives are both bare (as in ``git init --bare``) because they are used only for backups. Thus I operate on them only as remotes from my main (desktop) repo.++> I have now implemented the --all option, and it's the default when+> running `git annex get` inside a bare repo.+> +> So, the solution is to `cd` to the repository on old-external-drive,+> and `git remote add newdrive /path/to/new/drive/repo`. Then run `git+> annex copy --all --to newdrive` and it'll move everything.+> +> Calling this [[done]] unless there are other use cases where the double+> copy method is really needed? --[[Joey]]
@@ -0,0 +1,18 @@+Currently there is no way to drop files, or list what files are available, on a special remote.+It would be good if "git annex drop" and "git annex find" supported the --from argument.++> I agree, drop should support --from.+>> [[done]] --[[Joey]] +> +> To find files *believed* to be present in a given remote, use+> `git annex find --in remote`+> Note that it might show out of date info, since it does not actually go+> check the current contents of the remote. The only reason to support+> `find --from` would be to always check, but I don't think that's needed.+> --[[Joey]] ++For commands that don't support the --from argument, it would also be nice to print an error.+Currently running "git annex drop --from usbdrive" doesn't behave as hoped and instead drops+all content from the local annex.++> This is done now. --[[Joey]]
@@ -0,0 +1,22 @@+git-annex does not seem to support all kinds of urls that git does.++Specifically, if I have ~/bar set up on host foo:++ [remote "foo"]+ ## this one is not recognized as ssh url at all+ # url = foo:bar+ ## this one makes git-annex try to access '/~/bar' literally+ # url = ssh://foo/~/bar+ ## this one works+ url = ssh://foo/home/tv/bar++> scp-style is now supported.++> `~` expansions (for the user's home, or other users)+> are somewhat tricky to support as they require running+> code on the remote to lookup homedirs. If git-annex grows a+> `git annex shell` that is run on the remote side+> (something I am [[considering|todo/git-annex-shell]] for other reasons), it+> could handle the expansions there. --[[Joey]]++> Update: Now `~` expansions are supported. [[done]]
@@ -0,0 +1,5 @@+[swift](http://swift.openstack.org/) is the object storage of Openstack. Think S3, but fully open source. As it's backed by rackspace.com, NASA, Dell and several other major players, adoption rates will explode.++I can provide a test account soonish if need be, else rackspace.com if offering swift storage. Their API gateway lives at https://auth.api.rackspacecloud.com/v1.0++Richard
@@ -0,0 +1,3 @@+As git annex keeps logs about file transfers anyway, it should be relatively easy to add traffic accounting to a repo. That would allow me to monitor how much traffic a given repo generates. As I might end up hosting git-annex repos for a few personal friends, I need/want a way to track the heavy hitters. -- RichiH++PS: If you ever plan to host git-annex similar branchable, this would probably be of interest to you, as well :)
@@ -0,0 +1,20 @@+In regular repos, objects are stored in files of the form: .git/annex/objects/xY/z1/SHA1-.../SHA1-.... (scheme 1)++On (some) special remotes, the corresponding file is stored at: .../abc/def/SHA1-... (scheme 2)++I'm not sure why the same scheme as in .git/objects isn't used, but it would be useful that the two-directory prefix were the same for all objects stores.++My use case is: I synchronize a git repo, say containing photos, to a server on which I can't install git-annex. I want the server to store all annexed files. For the photos to be viewed online, the annex store must use the scheme 1 (because the symlinks point to files with scheme 1). So I need to rsync .git/annex/objects manually from my desktop, because a git-annex rsync remote uses scheme 2. On the other hand, the repo on this server is not known by git-annex (like it would if I used a rsync remote).++At least it would be valuable (to get around above problem) to have a plumbing command giving the 2-directory prefix from a given key, for example:++$ git annex prefix-dir SHA1-s2--3f786850e387550fdab836ed7e6dc881++7w/88++f18/122+++Even if the 2 schemes were unified, this prefix-dir command would still be useful when hacking around git-annex (for now I need to maintain a dictionary structure).++Thanks a lot.
@@ -0,0 +1,9 @@+as far as I know, if you `git clone` locally a git-annex enabled repository, it will not have all the files available. you would need to use `git annex get` and all files would be copied over, wasting a significant amount of space.++`git-clone` has this `--local` flags which hardlinks objects in `.git/objects`, but also, maybe more interestingly, has a `--shared` option to simply tell git to look in another repo for objects. it seems to me git-annex could leverage those functionalities to avoid file duplication when using local repositories.++this would be especially useful for [ikiwiki](http://ikiwiki.info/forum/ikiwiki_and_big_files).++This is a [[wishlist]], but I would also welcome implementation pointers to do this myself, thanks! --[[anarcat]]++> [[dup|done]]
@@ -0,0 +1,16 @@+git annex vicfg should display valid repository group names++For trust levels the possible values are displayed:++ # Repository trust configuration+ # (Valid trust levels: trusted semitrusted untrusted dead)+ ...++The same is not currently done for repository groups+ + # Repository groups+ # (Separate group names with spaces)++Thanks.++> [[done]] --[[Joey]]
@@ -0,0 +1,1 @@+To implement things like my custom `git annex-push` without the dash, i.e. `git annex push`, an alias system for git-annex would be nice.
@@ -0,0 +1,19 @@+git-annex can transfer data to or from any of a repository's git remotes.+Depending on where the remote is, the data transfer is done using rsync+(over ssh or locally), or plain cp (with copy-on-write+optimisations on supported filesystems), or using curl (for repositories+on the web). Some [[special_remotes]] are also supported that are not+traditional git remotes.++If a data transfer is interrupted, git-annex retains the partial transfer+to allow it to be automatically resumed later.++It's equally easy to transfer a single file to or from a repository,+or to launch a retrievel of a massive pile of files from whatever+repositories they are scattered amongst.++git-annex automatically uses whatever remotes are currently accessible,+preferring ones that are less expensive to talk to.++[[!img repomap.png caption="A real-world repository interconnection map+(generated by git-annex map)"]]
@@ -0,0 +1,59 @@+Git-annex supports several levels of trust of a repository:++* semitrusted (default)+* untrusted+* trusted+* dead++## semitrusted++Normally, git-annex does not fully trust its stored [[location_tracking]]+information. When removing content, it will directly check+that other repositories have enough [[copies]].++Generally that explicit checking is a good idea. Consider that the current+[[location_tracking]] information for a remote may not yet have propagated+out. Or, a remote may have suffered a catastrophic loss of data, or itself+been lost.++There is still some trust involved here. A semitrusted repository is+depended on to retain a copy of the file content; possibly the only+[[copy|copies]].++(Being semitrusted is the default. The `git annex semitrust` command+restores a repository to this default, when it has been overridden.+The `--semitrust` option can temporarily restore a repository to this+default.)++## untrusted++An untrusted repository is not trusted to retain data at all. Git-annex+will retain sufficient [[copies]] of data elsewhere.++This is a good choice for eg, portable drives that could get lost. Or,+if a disk is known to be dying, you can set it to untrusted and let+`git annex fsck` warn about data that needs to be copied off it.++To configure a repository as untrusted, use the `git annex untrust`+command.++## trusted++Sometimes, you may have reasons to fully trust the location tracking+information for a repository. For example, it may be an offline+archival drive, from which you rarely or never remove content. Deciding+when it makes sense to trust the tracking info is up to you.++One way to handle this is just to use `--force` when a command cannot+access a remote you trust. Or to use `--trust` to specify a repisitory to+trust temporarily.++To configure a repository as fully and permanently trusted,+use the `git annex trust` command.++## dead++This is used to indicate that you have no trust that the repository+exists at all. It's appropriate to use when a drive has been lost,+or a directory irretrevably deleted. It will make git-annex avoid+even showing the repository as a place where data might still reside.
@@ -0,0 +1,98 @@+Occasionally improvments are made to how git-annex stores its data,+that require an upgrade process to convert repositories made with an older+version to be used by a newer version. It's annoying, it should happen+rarely, but sometimes, it's worth it.++There's a committment that git-annex will always support upgrades from all+past versions. After all, you may have offline drives from an earlier+git-annex, and might want to use them with a newer git-annex.++git-annex will notice if it is run in a repository that+needs an upgrade, and refuse to do anything. To upgrade,+use the "git annex upgrade" command.++The upgrade process is guaranteed to be conflict-free. Unless you+already have git conflicts in your repository or between repositories.+Upgrading a repository with conflicts is not recommended; resolve the+conflicts first before upgrading git-annex.++## Upgrade events, so far++### v3 -> v4 (git-annex version 4.x)++v4 is only used for [[direct_mode]], and no upgrade needs to be done from+existing v3 repositories, they will continue to work.++### v2 -> v3 (git-annex version 3.x)++Involved moving the .git-annex/ directory into a separate git-annex branch.++After this upgrade, you should make sure you include the git-annex branch+when git pushing and pulling.++### tips for this upgrade++This upgrade is easier (and faster!) than the previous upgrades.+You don't need to upgrade every repository at once; it's sufficient+to upgrade each repository only when you next use it.+ +Example upgrade process:++ cd localrepo+ git pull+ git annex upgrade+ git commit -m "upgrade v2 to v3"+ git gc++### v1 -> v2 (git-annex version 0.20110316)++Involved adding hashing to .git/annex/ and changing the names of all keys.+Symlinks changed.++Also, hashing was added to location log files in .git-annex/.+And .gitattributes needed to have another line added to it.++Previously, files added to the SHA [[backends]] did not have their file+size tracked, while files added to the WORM backend did. Files added to+the SHA backends after the conversion will have their file size tracked,+and that information will be used by git-annex for disk free space checking.+To ensure that information is available for all your annexed files, see+[[upgrades/SHA_size]].++### tips for this upgrade++This upgrade can tend to take a while, if you have a lot of files.++Each clone of a repository should be individually upgraded.+Until a repository's remotes have been upgraded, git-annex+will refuse to communicate with them.++Start by upgrading one repository, and then you can commit+the changes git-annex staged during upgrade, and push them out to other+repositories. And then upgrade those other repositories. Doing it this+way avoids git-annex doing some duplicate work during the upgrade.++Example upgrade process:++ cd localrepo+ git pull+ git annex upgrade+ git commit -m "upgrade v1 to v2"+ git push++ ssh remote+ cd remoterepo+ git pull+ git annex upgrade+ ...++### v0 -> v1 (git-annex version 0.04)++Involved a reorganisation of the layout of .git/annex/. Symlinks changed.++Handled more or less transparently, although git-annex was just 2 weeks+old at the time, and had few users other than Joey.++Before doing this upgrade, set annex.version:++ git config annex.version 0
@@ -0,0 +1,20 @@+Before version 2 of the git-annex repository, files added to the SHA+[[backends]] did not have their file size tracked, while files added to the+WORM backend did. The file size information is used for disk free space+checking.++Files added to the SHA backends after the conversion will have their file+size tracked automatically. This disk free space checking is an optional+feature and since you're more likely to be using more recently added files,+you're unlikely to see any bad effect if you do nothing.++That said, if you have old files added to SHA backends that lack file size+tracking info, here's how you can add that info. After [[upgrading|upgrades]]+to repository version 2, in each repository run:++ git annex migrate+ git commit -m 'migrated keys for v2'++The usual caveats about [[tips/migrating_data_to_a_new_backend]]+apply; you will end up with unused keys that you can later clean up with+`git annex unused`.
@@ -0,0 +1,12 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawkjvjLHW9Omza7x1VEzIFQ8Z5honhRB90I"+ nickname="Asheesh"+ subject="The fact that the keys changed causes merge conflicts"+ date="2012-06-25T00:28:59Z"+ content="""+FYI, I have run into a problem where if you 'git annex sync' between various 'git annex v3' repositories, if the different repositories are using different encodings of the SHA1 information (one including size, one not), then the 'git merge' will declare that they conflict.++There's no indication that 'git annex migrate' is the right tool to run, except from perusing the 'git annex' man page. In my opinion this is a major user interface problem.++-- Asheesh.+"""]]
@@ -0,0 +1,25 @@+Unfortunately the initial gcrypt repository layout had to be changed+after git-annex version 4.20130920. If you have an encrypted git repository+created using version 4.20130920 or 4.20130909, you need to manually+upgrade it.++If you look at the contents of your gcrypt repository, you will+see a bare git repository, with a few three-letter subdirectories,+which are where git-annex stores its encrypted file contents:++<pre>+27f/ branches/ description hooks/ objects/+HEAD config f37/ info/ refs/+</pre>++In the example above, the subdirectories are `27f` and `f37`.++All you need to do to transition is move those subdirectories+into an `annex/objects` directory.++ mkdir annex ; mkdir annex/objects ; mv 27f f37 annex/objects++Probably those are the only 3 letter things inside your git repository,+so this will probably work:++ mkdir annex ; mkdir annex/objects ; mv ??? annex/objects
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawmj3kEGlCiy_Y-wb6AIBBnJ0B_SiPHV5Bo"+ nickname="Thomas"+ subject="small omission"+ date="2013-09-25T04:59:03Z"+ content="""+In your second example, `mv ??? annex` has to be `mv ??? annex/objects`, I think.+"""]]
@@ -0,0 +1,24 @@+### use case: The Nomad++Alice is always on the move, often with her trusty netbook and a small+handheld terabyte USB drive, or a smaller USB keydrive. She has a server+out there on the net. She stores data, encrypted in the Cloud.++All these things can have different files on them, but Alice no longer+has to deal with the tedious process of keeping them manually in sync,+or remembering where she put a file. git-annex manages all these data+sources as if they were git remotes. +<small>[[more about special remotes|special_remotes]]</small>++When she has 1 bar on her cell, Alice queues up interesting files on her+server for later. At a coffee shop, she has git-annex download them to her+USB drive. High in the sky or in a remote cabin, she catches up on+podcasts, videos, and games, first letting git-annex copy them from+her USB drive to the netbook (this saves battery power). +<small>[[more about transferring data|transferring_data]]</small>++When she's done, she tells git-annex which to keep and which to remove.+They're all removed from her netbook to save space, and Alice knows+that next time she syncs up to the net, her changes will be synced back +to her server. +<small>[[more about distributed version control|distributed_version_control]]</small>
@@ -0,0 +1,25 @@+### use case: The Archivist++Bob has many drives to archive his data, most of them +[[kept offline|tips/offline_archive_drives]], in a safe place.++With git-annex, Bob has a single directory tree that includes all+his files, even if their content is being stored offline. He can+reorganize his files using that tree, committing new versions to git,+without worry about accidentally deleting anything. ++When Bob needs access to some files, git-annex can tell him which drive(s)+they're on, and easily make them available. Indeed, every drive knows what+is on every other drive. +<small>[[more about location tracking|location_tracking]]</small>++Bob thinks long-term, and so he appreciates that git-annex uses a simple+repository format. He knows his files will be accessible in the future+even if the world has forgotten about git-annex and git. +<small>[[more about future-proofing|future_proofing]]</small>++Run in a cron job, git-annex adds new files to archival drives at night. It+also helps Bob keep track of intentional, and unintentional copies of+files, and logs information he can use to decide when it's time to duplicate+the content of old drives. +<small>[[more about backup copies|copies]]</small>
@@ -0,0 +1,9 @@+Users of this wiki, feel free to create a subpage of this one and talk+about yourself on it, within reason. You can link to it to sign your+comments.++List of users+=============+[[!inline pages="users/* and !users/*/* and !*/Discussion" +feeds=no archive=yes sort=title template=titlepage+rootpage="users" postformtext="Add yourself as an git-annex user:"]]
@@ -0,0 +1,41 @@+I use git-annex to manage huge files, mostly video and audio attached to other git repositories (such as presentations), but I also use git-annex to manage my music collection across multiple devices. I also use it to manage the `ISO` images I download, podcasts, and youtube videos.++See <http://anarc.at/>.++[[!toc]]++My tips+=======++... or the ones I commented it, to be more precise.++[[!inline pages="tips/* and and link(users/anarcat) and !bugs/*/*" sort=mtime feeds=no actions=yes archive=yes show=0]]+++My todos+========++... same.++[[!inline pages="todo/* and !todo/done and !link(todo/done) and+link(users/anarcat) and !todo/*/*" sort=mtime feeds=no actions=yes archive=yes show=0]]++Done+----++[[!inline pages="todo/* and !todo/done and link(todo/done) and+link(users/anarcat) and !todo/*/*" feeds=no actions=yes archive=yes show=0]]++My bugs+=======++... same.++[[!inline pages="bugs/* and !bugs/done and !link(bugs/done) and+link(users/anarcat) and !bugs/*/*" sort=mtime feeds=no actions=yes archive=yes show=0]]++Fixed+-----++[[!inline pages="bugs/* and !bugs/done and link(bugs/done) and+link(users/anarcat) and !bugs/*/*" feeds=no actions=yes archive=yes show=0]]
@@ -0,0 +1,11 @@+* **name**: chrysn+* **website**: <http://christian.amsuess.com/>+* **uses git-annex for** managing the family's photos (and possibly videos and music in the future).+* **likes git-annex because** it adds a layer of commit semantics over a regular file system without keeping everything in duplicate locally.+* **would like git-annex not to** be required any more at all when+ * git itself learns to use cow filesystems to avoid abundant disk usage, and+ * git gets better with shallow clones.++ git-annex might then still be a simpler tool that watches over what can be safely dropped from a particular shallow clone++ (the issues with shallow clones seem to relate primarily to shallow history; i haven't read anything about what would happen if all commits were checked out, but not all trees and blobs)
@@ -0,0 +1,6 @@+# François Marier++Free Software and Debian Developer. Lead developer of [Libravatar](https://www.libravatar.org)++* [Blog](http://feeding.cloud.geek.nz) and [homepage](http://fmarier.org)+* [Identica](http://identi.ca/fmarier) / [Twitter](https://twitter.com/fmarier)
@@ -0,0 +1,1 @@+Michael Gebetsroither <michael@mgeb.org>
@@ -0,0 +1,2 @@+Joey Hess <joey@kitenet.net> +<http://kitenet.net/~joey/>
@@ -0,0 +1,20 @@+Tobias Ussing++See:++[[https://github.com/TobiasTheViking/flickrannex/]]++[[https://github.com/TobiasTheViking/imapannex]]++[[https://github.com/TobiasTheViking/dropboxannex]]++[[https://github.com/TobiasTheViking/skydriveannex]]++[[https://github.com/TobiasTheViking/googledriveannex]]++[[https://github.com/TobiasTheViking/owncloudannex]]++[[https://github.com/TobiasTheViking/megaannex]]++[[http://git-annex.branchable.com/forum/nntp__47__usenet_special_remote/]]+
@@ -0,0 +1,8 @@+Talks and screencasts about git-annex.++These videos are also available in a public git-annex repository+`git clone http://downloads.kitenet.net/.git/`++[[!inline pages="./videos/* and !./videos/*/* and !*/Discussion" show="2"]]++[[!inline pages="./videos/* and !./videos/*/* and !*/Discussion" show="0" archive=yes skip=2 feeds=no]]
@@ -0,0 +1,7 @@+<video controls+src="http://video.fosdem.org/2012/lightningtalks/git_annex___manage_files_with_git,_without_checking_their_contents_into_git.webm"></video><br>+A <a href="http://video.fosdem.org/2012/lightningtalks/git_annex___manage_files_with_git,_without_checking_their_contents_into_git.webm">15 minute introduction to git-annex</a>,+presented by Richard Hartmann at FOSDEM 2012.++[[!meta date="1 Jan 2012"]]+[[!meta title="git-annex presentation by Richard Hartmann at FOSDEM 2012"]]
@@ -0,0 +1,8 @@+<video controls>+<source type="video/mp4" src="http://mirror.linux.org.au/linux.conf.au/2013/mp4/gitannex.mp4">+<source type="video/ogg" src="http://mirror.linux.org.au/linux.conf.au/2013/ogv/gitannex.ogv">+</video><br>+A <a href="http://mirror.linux.org.au/linux.conf.au/2013/mp4/gitannex.mp4">45 minute talk and demo of git-annex and the assistant</a>), presented by Joey Hess at LCA 2013.++[[!meta date="1 Feb 2013"]]+[[!meta title="git-annex presentation by Joey Hess at Linux.Conf.Au 2013"]]
@@ -0,0 +1,5 @@+<video controls width=400>+<source src="https://downloads.kitenet.net/videos/git-annex/git-annex-assistant-archiving.ogv">+</video><br>+A <a href="https://downloads.kitenet.net/videos/git-annex/git-annex-assistant-archiving.ogv">9 minute screencast</a>+covering archiving your files with the [[git-annex assistant|/assistant]]</a>.
@@ -0,0 +1,5 @@+<video controls width=400>+<source src="https://downloads.kitenet.net/videos/git-annex/git-annex-assistant-intro.ogv">+</video><br>+A <a href="https://downloads.kitenet.net/videos/git-annex/git-annex-assistant-intro.ogv">8 minute screencast</a>+introducing the [[git-annex assistant|/assistant]]</a>.
@@ -0,0 +1,6 @@+<video controls width=400>+<source src="https://downloads.kitenet.net/videos/git-annex/git-annex-xmpp-pairing.ogv">+</video><br>+A <a href="https://downloads.kitenet.net/videos/git-annex/git-annex-xmpp-pairing.ogv">6 minute screencast</a>+showing how to share files between your computers in different locations,+such as home and work.
@@ -0,0 +1,8 @@+A screencast demoing the git-annex assistant syncing between Nicaragua+and the United Kingdom for the first time.++<video controls src="http://joeyh.name/screencasts/git-annex-assistant.ogg"></video>++[video](http://joeyh.name/screencasts/git-annex-assistant.ogg)++[[!meta date="Thu Jul 5 16:36:06 2012 -0600"]]
@@ -0,0 +1,7 @@+A quick screencast demoing the `git annex watch` daemon.++<video controls src="http://joeyh.name/screencasts/git-annex-watch.ogg"></video>++[video](http://joeyh.name/screencasts/git-annex-watch.ogg)++[[!meta date="Mon Jun 11 16:02:14 2012 -0400"]]
@@ -0,0 +1,8 @@+A quick screencast demoing the early `git annex webapp` and+automatic USB drive mount detection and syncing.++<video controls src="http://joeyh.name/screencasts/git-annex-webapp.ogg"></video>++[video](http://joeyh.name/screencasts/git-annex-webapp.ogg)++[[!meta date="Sun Jul 29 14:41:41 2012 -0400"]]
@@ -0,0 +1,25 @@+A walkthrough of the basic features of git-annex.++[[!toc]]++[[!inline feeds=no trail=yes show=0 template=walkthrough pagenames="""+ walkthrough/creating_a_repository+ walkthrough/adding_a_remote+ walkthrough/adding_files+ walkthrough/renaming_files+ walkthrough/getting_file_content+ walkthrough/syncing+ walkthrough/transferring_files:_When_things_go_wrong+ walkthrough/removing_files+ walkthrough/removing_files:_When_things_go_wrong+ walkthrough/modifying_annexed_files+ walkthrough/using_ssh_remotes+ walkthrough/moving_file_content_between_repositories+ walkthrough/using_tags_and_branches+ walkthrough/unused_data+ walkthrough/fsck:_verifying_your_data+ walkthrough/fsck:_when_things_go_wrong+ walkthrough/backups+ walkthrough/automatically_managing_content+ walkthrough/more+"""]]
@@ -0,0 +1,19 @@+Like any other git repository, git-annex repositories have remotes.+Let's start by adding a USB drive as a remote.++ # sudo mount /media/usb+ # cd /media/usb+ # git clone ~/annex+ # cd annex+ # git annex init "portable USB drive"+ # git remote add laptop ~/annex+ # cd ~/annex+ # git remote add usbdrive /media/usb/annex++This is all standard ad-hoc distributed git repository setup.+The only git-annex specific part is telling it the name+of the new repository created on the USB drive.++Notice that both repos are set up as remotes of one another. This lets+either get annexed files from the other. You'll want to do that even+if you are using git in a more centralized fashion.
@@ -0,0 +1,11 @@+ # cd ~/annex+ # cp /tmp/big_file .+ # cp /tmp/debian.iso .+ # git annex add .+ add big_file (checksum...) ok+ add debian.iso (checksum...) ok+ # git commit -a -m added++When you add a file to the annex and commit it, only a symlink to+the annexed content is committed. The content itself is stored in+git-annex's backend.
@@ -0,0 +1,45 @@+Once you have multiple repositories, and have perhaps configured numcopies,+any given file can have many more copies than is needed, or perhaps fewer+than you would like. How to manage this?++The whereis subcommand can be used to see how many copies of a file are known,+but then you have to decide what to get or drop. In this example, there+are perhaps not enough copies of the first file, and too many of the second+file.++ # cd /media/usbdrive+ # git annex whereis+ whereis my_cool_big_file (1 copy)+ 0c443de8-e644-11df-acbf-f7cd7ca6210d -- laptop+ whereis other_file (3 copies)+ 0c443de8-e644-11df-acbf-f7cd7ca6210d -- laptop+ 62b39bbe-4149-11e0-af01-bb89245a1e61 -- here (usb drive)+ 7570b02e-15e9-11e0-adf0-9f3f94cb2eaa -- backup drive++What would be handy is some automated versions of get and drop, that only+gets a file if there are not yet enough copies of it, or only drops a file+if there are too many copies. Well, these exist, just use the --auto option.++ # git annex get --auto --numcopies=2+ get my_cool_big_file (from laptop...) ok+ # git annex drop --auto --numcopies=2+ drop other_file ok++With two quick commands, git-annex was able to decide for you how to+work toward having two copies of your files.++ # git annex whereis+ whereis my_cool_big_file (2 copies)+ 0c443de8-e644-11df-acbf-f7cd7ca6210d -- laptop+ 62b39bbe-4149-11e0-af01-bb89245a1e61 -- here (usb drive)+ whereis other_file (2 copies)+ 0c443de8-e644-11df-acbf-f7cd7ca6210d -- laptop+ 7570b02e-15e9-11e0-adf0-9f3f94cb2eaa -- backup drive++The --auto option can also be used with the copy command,+again this lets git-annex decide whether to actually copy content.++The above shows how to use --auto to manage content based on the number+of copies. It's also possible to configure, on a per-repository basis,+which content is desired. Then --auto also takes that into account+see [[preferred_content]] for details.
@@ -0,0 +1,25 @@+git-annex can be configured to require more than one copy of a file exists,+as a simple backup for your data. This is controlled by the "annex.numcopies"+setting, which defaults to 1 copy. Let's change that to require 2 copies,+and send a copy of every file to a USB drive.++ # echo "* annex.numcopies=2" >> .gitattributes+ # git annex copy . --to usbdrive++Now when we try to `git annex drop` a file, it will verify that it+knows of 2 other repositories that have a copy before removing its+content from the current repository.++You can also vary the number of copies needed, depending on the file name.+So, if you want 3 copies of all your flac files, but only 1 copy of oggs:++ # echo "*.ogg annex.numcopies=1" >> .gitattributes+ # echo "*.flac annex.numcopies=3" >> .gitattributes++Or, you might want to make a directory for important stuff, and configure+it so anything put in there is backed up more thoroughly:++ # mkdir important_stuff+ # echo "* annex.numcopies=3" > important_stuff/.gitattributes++For more details about the numcopies setting, see [[copies]].
@@ -0,0 +1,6 @@+This is very straightforward. Just tell it a description of the repository.++ # mkdir ~/annex+ # cd ~/annex+ # git init+ # git annex init "my laptop"
@@ -0,0 +1,16 @@+You can use the fsck subcommand to check for problems in your data. What+can be checked depends on the key-value [[backend|backends]] you've used+for the data. For example, when you use the SHA1 backend, fsck will verify+that the checksums of your files are good. Fsck also checks that the+annex.numcopies setting is satisfied for all files.++ # git annex fsck+ fsck some_file (checksum...) ok+ fsck my_cool_big_file (checksum...) ok+ ...++You can also specify the files to check. This is particularly useful if +you're using sha1 and don't want to spend a long time checksumming everything.++ # git annex fsck my_cool_big_file+ fsck my_cool_big_file (checksum...) ok
@@ -0,0 +1,13 @@+Fsck never deletes possibly bad data; instead it will be moved to+`.git/annex/bad/` for you to recover. Here is a sample of what fsck+might say about a badly messed up annex:++ # git annex fsck+ fsck my_cool_big_file (checksum...)+ git-annex: Bad file content; moved to .git/annex/bad/SHA1:7da006579dd64330eb2456001fd01948430572f2+ git-annex: ** No known copies exist of my_cool_big_file+ failed+ fsck important_file+ git-annex: Only 1 of 2 copies exist. Run git annex get somewhere else to back it up.+ failed+ git-annex: 2 failed
@@ -0,0 +1,12 @@+A repository does not always have all annexed file contents available.+When you need the content of a file, you can use "git annex get" to+make it available.++We can use this to copy everything in the laptop's annex to the+USB drive.++ # cd /media/usb/annex+ # git annex sync laptop+ # git annex get .+ get my_cool_big_file (from laptop...) ok+ get iso/debian.iso (from laptop...) ok
@@ -0,0 +1,44 @@+Normally, the content of files in the annex is prevented from being modified.+(Unless your repository is using [[direct_mode]].)++That's a good thing, because it might be the only copy, you wouldn't+want to lose it in a fumblefingered mistake.++ # echo oops > my_cool_big_file+ bash: my_cool_big_file: Permission denied++In order to modify a file, it should first be unlocked.++ # git annex unlock my_cool_big_file+ unlock my_cool_big_file (copying...) ok++That replaces the symlink that normally points at its content with a copy+of the content. You can then modify the file like any regular file. Because+it is a regular file.++(If you decide you don't need to modify the file after all, or want to discard+modifications, just use `git annex lock`.)++When you `git commit`, git-annex's pre-commit hook will automatically+notice that you are committing an unlocked file, and add its new content+to the annex. The file will be replaced with a symlink to the new content,+and this symlink is what gets committed to git in the end.++ # echo "now smaller, but even cooler" > my_cool_big_file+ # git commit my_cool_big_file -m "changed an annexed file"+ add my_cool_big_file ok+ [master 64cda67] changed an annexed file+ 1 files changed, 1 insertions(+), 1 deletions(-)++There is one problem with using `git commit` like this: Git wants to first+stage the entire contents of the file in its index. That can be slow for+big files (sorta why git-annex exists in the first place). So, the+automatic handling on commit is a nice safety feature, since it prevents+the file content being accidentally committed into git. But when working with+big files, it's faster to explicitly add them to the annex yourself+before committing.++ # echo "now smaller, but even cooler yet" > my_cool_big_file+ # git annex add my_cool_big_file+ add my_cool_big_file ok+ # git commit my_cool_big_file -m "changed an annexed file"
@@ -0,0 +1,3 @@+So ends the walkthrough. By now you should be able to use git-annex.++Want more? See [[tips]] for lots more features and advice.
@@ -0,0 +1,13 @@+Often you will want to move some file contents from a repository to some+other one. For example, your laptop's disk is getting full; time to move+some files to an external disk before moving another file from a file+server to your laptop. Doing that by hand (by using `git annex get` and+`git annex drop`) is possible, but a bit of a pain. `git annex move`+makes it very easy.++ # git annex move my_cool_big_file --to usbdrive+ move my_cool_big_file (to usbdrive...) ok+ # git annex move video/hackity_hack_and_kaxxt.mov --from fileserver+ move video/hackity_hack_and_kaxxt.mov (from fileserver...)+ SHA256-s86050597--6ae2688bc533437766a48aa19f2c06be14d1bab9c70b468af445d4f07b65f41e 100% 82MB 199.1KB/s 07:02+ ok
@@ -0,0 +1,17 @@+When you're using git-annex you can `git rm` a file just like you usually+would with git. Just like with git, this removes the file from your work+tree, but it does not remove the file's content from the git repository.+If you check the file back out, or revert the removal, you can get it back.++Git-annex adds the ability to remove the content of a file from your local+repository to save space. This is called "dropping" the file. ++You can always drop files safely. Git-annex checks that some other+repository still has the file before removing it.++ # git annex drop iso/debian.iso+ drop iso/Debian_5.0.iso ok++Once dropped, the file will still appear in your work tree as a broken symlink.+You can use `git annex get` to as usual to get this file back to your local+repository.
@@ -0,0 +1,24 @@+Before dropping a file, git-annex wants to be able to look at other+remotes, and verify that they still have a file. After all, it could+have been dropped from them too. If the remotes are not mounted/available,+you'll see something like this.++ # git annex drop important_file other.iso+ drop important_file (unsafe)+ Could only verify the existence of 0 out of 1 necessary copies+ Unable to access these remotes: usbdrive+ Try making some of these repositories available:+ 58d84e8a-d9ae-11df-a1aa-ab9aa8c00826 -- portable USB drive+ ca20064c-dbb5-11df-b2fe-002170d25c55 -- backup SATA drive+ (Use --force to override this check, or adjust annex.numcopies.)+ failed+ drop other.iso (unsafe)+ Could only verify the existence of 0 out of 1 necessary copies+ No other repository is known to contain the file.+ (Use --force to override this check, or adjust annex.numcopies.)+ failed++Here you might --force it to drop `important_file` if you [[trust]] your backup.+But `other.iso` looks to have never been copied to anywhere else, so if+it's something you want to hold onto, you'd need to transfer it to+some other repository before dropping it.
@@ -0,0 +1,13 @@+ # cd ~/annex+ # git mv big_file my_cool_big_file+ # mkdir iso+ # git mv debian.iso iso/+ # git commit -m moved++You can use any normal git operations to move files around, or even+make copies or delete them.++Notice that, since annexed files are represented by symlinks,+the symlink will break when the file is moved into a subdirectory.+But, git-annex will fix this up for you when you commit --+it has a pre-commit hook that watches for and corrects broken symlinks.
@@ -0,0 +1,27 @@+Notice that in the [[previous example|getting_file_content]], `git annex+sync` was used. This lets git-annex know what has changed in the other+repositories like the laptop, and so it knows about the files present there and can+get them.++Let's look at what the sync command does in more detail:++ # cd /media/usb/annex+ # git annex sync+ commit+ nothing to commit (working directory clean)+ ok+ pull laptop+ ok+ push laptop+ ok++After you run sync, the repository will be updated with all changes made to+its remotes, and any changes in the repository will be pushed out to its+remotes, where a sync will get them. This is especially useful when using+git in a distributed fashion, without a +[[central bare repository|tips/centralized_git_repository_tutorial]]. See+[[sync]] for details.++Note that syncing only syncs the metadata about your files that is stored+in git. It does not sync the contents of files, that are managed by+git-annex.
@@ -0,0 +1,17 @@+After a while, you'll have several annexes, with different file contents.+You don't have to try to keep all that straight; git-annex does +[[location_tracking]] for you. If you ask it to get a file and the drive+or file server is not accessible, it will let you know what it needs to get+it:++ # git annex get video/hackity_hack_and_kaxxt.mov+ get video/_why_hackity_hack_and_kaxxt.mov (not available)+ Unable to access these remotes: usbdrive, server+ Try making some of these repositories available:+ 5863d8c0-d9a9-11df-adb2-af51e6559a49 -- my home file server+ 58d84e8a-d9ae-11df-a1aa-ab9aa8c00826 -- portable USB drive+ ca20064c-dbb5-11df-b2fe-002170d25c55 -- backup SATA drive+ failed+ # sudo mount /media/usb+ # git annex get video/hackity_hack_and_kaxxt.mov+ get video/hackity_hack_and_kaxxt.mov (from usbdrive...) ok
@@ -0,0 +1,35 @@+It's possible for data to accumulate in the annex that no files in any+branch point to anymore. One way it can happen is if you `git rm` a file+without first calling `git annex drop`. And, when you modify an annexed+file, the old content of the file remains in the annex. Another way is when+migrating between key-value [[backends]].++This might be historical data you want to preserve, so git-annex defaults to+preserving it. So from time to time, you may want to check for such data:++ # git annex unused+ unused . (checking for unused data...) + Some annexed data is no longer used by any files in the repository.+ NUMBER KEY+ 1 SHA256-s86050597--6ae2688bc533437766a48aa19f2c06be14d1bab9c70b468af445d4f07b65f41e+ 2 SHA1-s14--f1358ec1873d57350e3dc62054dc232bc93c2bd1+ (To see where data was previously used, try: git log --stat -S'KEY')+ (To remove unwanted data: git-annex dropunused NUMBER)+ ok++After running `git annex unused`, you can follow the instructions to examine+the history of files that used the data, and if you decide you don't need that+data anymore, you can easily remove it from your local repository.++ # git annex dropunused 1+ dropunused 1 ok++Hint: To drop a lot of unused data, use a command like this:++ # git annex dropunused 1-1000++Rather than removing the data, you can instead send it to other+repositories:++ # git annex copy --unused --to backup+ # git annex move --unused --to archive
@@ -0,0 +1,37 @@+Another [[special_remote|special_remotes]] that git-annex can use is+a [[special_remotes/bup]] repository. Bup stores large file contents+in a git repository of its own, with deduplication. Combined with+git-annex, you can have git on both the frontend and the backend.++Here's how to create a bup remote, and describe it.++[[!template id=note text="""+Instead of specifying a remote system, you could choose to make a bup+remote that is only accessible on the current system, by passing+"buprepo=/big/mybup".+"""]]++ # git annex initremote mybup type=bup encryption=none buprepo=example.com:/big/mybup+ initremote bup (bup init)+ Initialized empty Git repository in /big/mybup/+ ok+ # git annex describe mybup "my bup repository at example.com"+ describe mybup ok++Now the remote can be used like any other remote.++ # git annex move my_cool_big_file --to mybup+ move my_cool_big_file (to mybup...)+ Receiving index from server: 1100/1100, done.+ ok++Note that, unlike other remotes, bup does not really support removing+content from its git repositories. This is a feature. :)++ # git annex move my_cool_big_file --from mybup+ move my_cool_big_file (from mybup...)+ content cannot be removed from bup remote+ failed+ git-annex: 1 failed++See [[special_remotes/bup]] for details.
@@ -0,0 +1,33 @@+So far in this walkthrough, git-annex has been used with a remote+repository on a USB drive. But it can also be used with a git remote+that is truly remote, a host accessed by ssh.++Say you have a desktop on the same network as your laptop and want+to clone the laptop's annex to it:++ # git clone ssh://mylaptop/home/me/annex ~/annex+ # cd ~/annex+ # git annex init "my desktop"++Now you can get files and they will be transferred (using `rsync` via `ssh`):++ # git annex get my_cool_big_file+ get my_cool_big_file (getting UUID for origin...) (from origin...)+ SHA256-s86050597--6ae2688bc533437766a48aa19f2c06be14d1bab9c70b468af445d4f07b65f41e 100% 2159 2.1KB/s 00:00+ ok++When you drop files, git-annex will ssh over to the remote and make+sure the file's content is still there before removing it locally:++ # git annex drop my_cool_big_file+ drop my_cool_big_file (checking origin..) ok++Note that normally git-annex prefers to use non-ssh remotes, like+a USB drive, before ssh remotes. They are assumed to be faster/cheaper to+access, if available. There is a annex-cost setting you can configure in+`.git/config` to adjust which repositories it prefers. See+[[the_man_page|git-annex]] for details.++Also, note that you need full shell access for this to work -- +git-annex needs to be able to ssh in and run commands. Or at least,+your shell needs to be able to run the [[git-annex-shell]] command.
@@ -0,0 +1,14 @@+Like git, git-annex hangs on to every old version of a file (by default),+so you can make tags and branches, and can check them out later to look at+the old files.++ # git tag 1.0+ # rm -f my_cool_big_file+ # git commit -m deleted+ # git checkout 1.0+ # cat my_cool_big_file+ yay! old version still here++Of course, when you `git checkout` an old branch, some old versions of+files may not be locally available, and may be stored in some other+repository. You can use `git annex get` to get them as usual.
@@ -377,6 +377,11 @@ Without an expression, displays the current preferred content setting of the repository. .IP+.IP "\fBschedule repository [expression]\fP"+When run with an expression, configures scheduled jobs to run at a+particular time. This can be used to make the assistant periodically run+incremental fscks. See SCHEDULED JOBS below.+.IP .IP "\fBvicfg\fP" Opens EDITOR on a temp file containing most of the above configuration settings, and when it exits, stores any changes made back to the git\-annex@@ -401,7 +406,8 @@ .IP "\fBfsck [path ...]\fP" .IP With no parameters, this command checks the whole annex for consistency,-and warns about or fixes any problems found.+and warns about or fixes any problems found. This is a good compliment to+\fBgit fsck\fP. .IP With parameters, only the specified files are checked. .IP@@ -480,6 +486,36 @@ git\-annex have forgotten their old history. (You may need to force git to push the branch to any git repositories not running git\-annex. .IP+.IP "\fBrepair\fP"+This can repair many of the problems with git repositories that \fBgit fsck\fP +detects, but does not itself fix. It's useful if a repository has become+badly damaged. One way this can happen is if a repisitory used by git\-annex+is on a removable drive that gets unplugged at the wrong time.+.IP+This command can actually be used inside git repositories that do not+use git\-annex at all; when used in a repository using git\-annex, it+does additional repairs of the git\-annex branch.+.IP+It works by deleting any corrupt objects from the git repository, and+retriving all missing objects it can from the remotes of the repository.+.IP+If that is not sufficient to fully recover the repository, it can also+reset branches back to commits before the corruption happened, delete+branches that are no longer available due to the lost data, and remove any+missing files from the index. It will only do this if run with the+\fB\-\-force\fP option, since that rewrites history and throws out missing data.+Note that the \fB\-\-force\fP option never touches tags, even if they are no+longer usable due to missing data.+.IP+After running this command, you will probably want to run \fBgit fsck\fP to+verify it fixed the repository. Note that fsck may still complain about+objects referenced by the reflog, or the stash, if they were unable to be+recovered. This command does not try to clean up either the reflog or the+stash.+.IP+It is also a good idea to run \fBgit annex fsck \-\-fast\fP after this command,+to make sure that the git\-annex branch reflects reality.+.IP .SH QUERY COMMANDS .IP "\fBversion\fP" .IP@@ -838,8 +874,8 @@ .SH PREFERRED CONTENT Each repository has a preferred content setting, which specifies content that the repository wants to have present. These settings can be configured-using \fBgit annex vicfg\fP. They are used by the \fB\-\-auto\fP option, and-by the git\-annex assistant.+using \fBgit annex vicfg\fP or \fBgit annex content\fP.+They are used by the \fB\-\-auto\fP option, and by the git\-annex assistant. .PP The preferred content settings are similar, but not identical to the file matching options specified above, just without the dashes.@@ -851,7 +887,34 @@ match relative to the top of the git repository, and that there is no equivilant to \fB\-\-in\fP. .PP-.SH CONFIGURATION+When a repository is in one of the standard predefined groups, like "backup"+and "client", setting its preferred content to "standard" will use a+built\-in preferred content expression ddeveloped for that group.+.PP+.SH SCHEDULED JOBS+The git\-annex assistant daemon can be configured to run scheduled jobs.+This is similar to cron and anacron (and you can use them if you prefer),+but has the advantage of being integrated into git\-annex, and so being able+to eg, fsck a repository on a removable drive when the drive gets+connected.+.PP+The scheduled jobs can be configured using \fBgit annex vicfg\fP or+\fBgit annex schedule\fP. +.PP+These actions are available: "fsck self", "fsck UUID" (where UUID+is the UUID of a remote to fsck). After the action comes the duration+to allow the action to run, and finally the schedule of when to run it.+.PP+To schedule multiple jobs, separate them with "; ".+.PP+Some examples:+.PP+ fsck self 30m every day at any time+ fsck self 1h every month at 3 AM+ fsck self 1h on day 1 of every month at any time+ fsck self 1h every week divisible by 2 at any time+.PP+.SH CONFIGURATION VIA .git/config Like other git commands, git\-annex is configured via \fB.git/config\fP. Here are all the supported configuration settings. .PP
@@ -1,5 +1,5 @@ Name: git-annex-Version: 4.20131002+Version: 4.20131024 Cabal-Version: >= 1.8 License: GPL-3 Maintainer: Joey Hess <joey@kitenet.net>@@ -71,13 +71,16 @@ Flag Quvi Description: Enable use of quvi to download videos +Flag CryptoHash+ Description: Enable use of cryptohash for checksumming+ Executable git-annex Main-Is: git-annex.hs Build-Depends: MissingH, hslogger, directory, filepath, containers, utf8-string, network (>= 2.0), mtl (>= 2), bytestring, old-locale, time, HTTP,- extensible-exceptions, dataenc, SHA, cryptohash, process, json,- base (>= 4.5 && < 4.8), monad-control, MonadCatchIO-transformers,+ extensible-exceptions, dataenc, SHA, process, json,+ base (>= 4.5 && < 4.9), monad-control, MonadCatchIO-transformers, IfElse, text, QuickCheck >= 2.1, bloomfilter, edit-distance, process, SafeSemaphore, uuid, random, dlist, unix-compat -- Need to list these because they're generated from .hsc files.@@ -94,9 +97,7 @@ if flag(Production) GHC-Options: -O2 - if os(windows)- CPP-Options: -D__WINDOWS__- else+ if (! os(windows)) Build-Depends: unix if flag(TestSuite)@@ -106,6 +107,10 @@ if flag(TDFA) Build-Depends: regex-tdfa CPP-Options: -DWITH_TDFA+ + if flag(CryptoHash)+ Build-Depends: cryptohash (>= 0.10.0)+ CPP-Options: -DWITH_CRYPTOHASH if flag(S3) Build-Depends: hS3@@ -144,7 +149,7 @@ Build-Depends: dbus (>= 0.10.3) CPP-Options: -DWITH_DBUS - if flag(Webapp)+ if flag(Webapp) && (! os(windows)) Build-Depends: yesod, yesod-default, yesod-static, yesod-form, yesod-core, case-insensitive, http-types, transformers, wai, wai-logger, warp,@@ -156,7 +161,7 @@ Build-Depends: network-multicast, network-info CPP-Options: -DWITH_PAIRING - if flag(XMPP)+ if flag(XMPP) && (! os(windows)) Build-Depends: network-protocol-xmpp, gnutls (>= 0.1.4), xml-types CPP-Options: -DWITH_XMPP
@@ -0,0 +1,42 @@+{- git-recover-repository program+ -+ - Copyright 2013 Joey Hess <joey@kitenet.net>+ -+ - Licensed under the GNU GPL version 3 or higher.+ -}++import System.Environment+import qualified Data.Set as S+import Data.Tuple.Utils++import Common+import qualified Git+import qualified Git.CurrentRepo+import qualified Git.Fsck+import qualified Git.Repair+import qualified Git.Config+import qualified Git.Branch++header :: String+header = "Usage: git-recover-repository"++usage :: a+usage = error $ "bad parameters\n\n" ++ header++parseArgs :: IO Bool+parseArgs = do+ args <- getArgs+ return $ or $ map parse args+ where+ parse "--force" = True+ parse _ = usage++main :: IO ()+main = do+ forced <- parseArgs+ + g <- Git.Config.read =<< Git.CurrentRepo.get+ ifM (fst3 <$> Git.Repair.runRepair forced g)+ ( exitSuccess+ , exitFailure+ )
@@ -114,7 +114,7 @@ touch $@ $(GIT_ANNEX_ANDROID_SOURCETREE)/gnupg/build-stamp:- cd $(GIT_ANNEX_ANDROID_SOURCETREE)/gnupg && git checkout gnupg-1.4.13+ cd $(GIT_ANNEX_ANDROID_SOURCETREE)/gnupg && git checkout gnupg-1.4.15 cd $(GIT_ANNEX_ANDROID_SOURCETREE)/gnupg && ./autogen.sh cd $(GIT_ANNEX_ANDROID_SOURCETREE)/gnupg && ./configure --host=arm-linux-androideabi --disable-gnupg-iconv --disable-card-support --disable-agent-support --disable-photo-viewers --disable-keyserver-helpers --disable-nls cd $(GIT_ANNEX_ANDROID_SOURCETREE)/gnupg; $(MAKE) || true # expected failure in doc build
@@ -16,7 +16,7 @@ apt-get -y install ca-certificates curl file m4 autoconf zlib1g-dev apt-get -y install libgnutls-dev libxml2-dev libgsasl7-dev pkg-config c2hs apt-get -y install ant default-jdk rsync wget gnupg lsof-apt-get -y install gettext unzip+apt-get -y install gettext unzip python apt-get clean wget http://snapshot.debian.org/archive/debian/20130903T155330Z/pool/main/a/automake-1.14/automake_1.14-1_all.deb dpkg -i automake*.deb
@@ -1,6 +1,6 @@-From 2cb43c46d345341d1aa77c4b2a88514c056d3122 Mon Sep 17 00:00:00 2001-From: foo <foo@bar>-Date: Sat, 21 Sep 2013 22:25:18 +0000+From 589c6a87ec62e35942c9a86ea8d91b443c80da99 Mon Sep 17 00:00:00 2001+From: dummy <dummy@example.com>+Date: Fri, 18 Oct 2013 23:07:02 +0000 Subject: [PATCH] cross build ---@@ -8,18 +8,18 @@ 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/comonad.cabal b/comonad.cabal-index e01f1a7..e807e05 100644+index 5d34b13..756ed92 100644 --- a/comonad.cabal +++ b/comonad.cabal @@ -13,7 +13,7 @@ copyright: Copyright (C) 2008-2013 Edward A. Kmett, Copyright (C) 2004-2008 Dave Menendez- synopsis: Haskell 98 compatible comonads- description: Haskell 98 compatible comonads+ synopsis: Comonads+ description: Comonads -build-type: Custom +build-type: Simple extra-source-files:+ .ghci .gitignore- .travis.yml -- 1.7.10.4
@@ -1,6 +1,6 @@-From 35c6718205e9d7f5e5fc44578ea6a9971beac151 Mon Sep 17 00:00:00 2001-From: foo <foo@bar>-Date: Sat, 21 Sep 2013 23:32:18 +0000+From 10da50b5eea1e615af1d3b242f422ad278c9f268 Mon Sep 17 00:00:00 2001+From: dummy <dummy@example.com>+Date: Fri, 18 Oct 2013 23:16:41 +0000 Subject: [PATCH] cross build ---@@ -8,18 +8,18 @@ 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/entropy.cabal b/entropy.cabal-index 45e4705..17553d8 100644+index e69dec4..4fa3774 100644 --- a/entropy.cabal +++ b/entropy.cabal @@ -14,7 +14,7 @@ category: Data, Cryptography homepage: https://github.com/TomMD/entropy bug-reports: https://github.com/TomMD/entropy/issues stability: stable--build-type: Custom-+build-type: Simple- cabal-version: >= 1.6- tested-with: GHC == 6.12.1- data-files:+-build-type: Custom++build-type: Simple+ cabal-version: >=1.10+ tested-with: GHC == 7.6.3+ -- data-files: -- 1.7.10.4
@@ -1,25 +0,0 @@-From fdbd29ce6e8ff11f721f9e74cac1f4ca14e6773d Mon Sep 17 00:00:00 2001-From: foo <foo@bar>-Date: Sun, 22 Sep 2013 07:06:33 +0000-Subject: [PATCH] export TH symbols------ Data/FileEmbed.hs | 2 ++- 1 file changed, 2 insertions(+)--diff --git a/Data/FileEmbed.hs b/Data/FileEmbed.hs-index c17f082..6654f60 100644---- a/Data/FileEmbed.hs-+++ b/Data/FileEmbed.hs-@@ -26,6 +26,8 @@ module Data.FileEmbed- #endif- , inject- , injectFile-+ -- used by TH (pointlessly)-+ , stringToBs- ) where- - import Language.Haskell.TH.Syntax--- -1.7.10.4-
@@ -1,28 +0,0 @@-From 9819f4b387679c889f1259f9fd969513aa2efcf2 Mon Sep 17 00:00:00 2001-From: foo <foo@bar>-Date: Sun, 22 Sep 2013 03:51:06 +0000-Subject: [PATCH] export TH splice stuff------ Text/Hamlet.hs | 5 +++++- 1 file changed, 5 insertions(+)--diff --git a/Text/Hamlet.hs b/Text/Hamlet.hs-index 6568d6c..687dec4 100644---- a/Text/Hamlet.hs-+++ b/Text/Hamlet.hs-@@ -40,6 +40,11 @@ module Text.Hamlet- , ihamletRules- , htmlRules- , CloseStyle (..)-+ -- referred to by TH splices-+ , asHtmlUrl-+ , maybeH-+ , condH-+ , attrsToHtml- ) where- - import Text.Shakespeare.Base--- -1.7.10.4-
@@ -1,7 +1,7 @@-From 3141355f14d6acb9382bebcf8723c411be5aa62f Mon Sep 17 00:00:00 2001-From: foo <foo@bar>-Date: Sun, 22 Sep 2013 00:31:39 +0000-Subject: [PATCH] various hacking to cross build+From 41706061810410cc38f602ccc9a4c9560502251f Mon Sep 17 00:00:00 2001+From: dummy <dummy@example.com>+Date: Sat, 19 Oct 2013 01:44:52 +0000+Subject: [PATCH] hackity --- lens.cabal | 12 +-----------@@ -24,7 +24,7 @@ 17 files changed, 20 insertions(+), 74 deletions(-) diff --git a/lens.cabal b/lens.cabal-index 2a94e1e..1f9a4b7 100644+index b25adf4..3e5c30c 100644 --- a/lens.cabal +++ b/lens.cabal @@ -10,7 +10,7 @@ stability: provisional@@ -33,10 +33,10 @@ copyright: Copyright (C) 2012-2013 Edward A. Kmett -build-type: Custom +build-type: Simple- tested-with: GHC == 7.0.4, GHC == 7.4.1, GHC == 7.4.2, GHC == 7.6.1, GHC == 7.7.20121213, GHC == 7.7.20130117+ tested-with: GHC == 7.6.3 synopsis: Lenses, Folds and Traversals description:-@@ -238,14 +238,12 @@ library+@@ -235,14 +235,12 @@ library Control.Lens.Review Control.Lens.Setter Control.Lens.Simple@@ -51,7 +51,7 @@ Control.Parallel.Strategies.Lens Control.Seq.Lens Data.Array.Lens-@@ -269,12 +267,8 @@ library+@@ -266,12 +264,8 @@ library Data.Typeable.Lens Data.Vector.Lens Data.Vector.Generic.Lens@@ -64,7 +64,7 @@ Numeric.Lens if flag(safe)-@@ -373,7 +367,6 @@ test-suite doctests+@@ -370,7 +364,6 @@ test-suite doctests deepseq, doctest >= 0.9.1, filepath,@@ -72,7 +72,7 @@ mtl, nats, parallel,-@@ -399,7 +392,6 @@ benchmark plated+@@ -396,7 +389,6 @@ benchmark plated comonad, criterion, deepseq,@@ -80,7 +80,7 @@ lens, transformers -@@ -434,7 +426,6 @@ benchmark unsafe+@@ -431,7 +423,6 @@ benchmark unsafe comonads-fd, criterion, deepseq,@@ -88,7 +88,7 @@ lens, transformers -@@ -451,6 +442,5 @@ benchmark zipper+@@ -448,6 +439,5 @@ benchmark zipper comonads-fd, criterion, deepseq,@@ -96,7 +96,7 @@ lens, transformers diff --git a/src/Control/Exception/Lens.hs b/src/Control/Exception/Lens.hs-index 4bc3926..28f55be 100644+index 0619335..c97ad9b 100644 --- a/src/Control/Exception/Lens.hs +++ b/src/Control/Exception/Lens.hs @@ -112,7 +112,7 @@ import Prelude
@@ -1,96 +0,0 @@-From 2b1ee45058b0d6db90f77e4859d01d1e8434906c Mon Sep 17 00:00:00 2001-From: foo <foo@bar>-Date: Sat, 21 Sep 2013 23:11:51 +0000-Subject: [PATCH] fix build with new ghc------ Data/Primitive/Array.hs | 2 +-- Data/Primitive/ByteArray.hs | 2 +-- Data/Primitive/MutVar.hs | 4 ++--- Data/Primitive/Types.hs | 13 +++++++------- 4 files changed, 11 insertions(+), 10 deletions(-)--diff --git a/Data/Primitive/Array.hs b/Data/Primitive/Array.hs-index b82dcac..b28abea 100644---- a/Data/Primitive/Array.hs-+++ b/Data/Primitive/Array.hs-@@ -106,7 +106,7 @@ unsafeThawArray (Array arr#)- sameMutableArray :: MutableArray s a -> MutableArray s a -> Bool- {-# INLINE sameMutableArray #-}- sameMutableArray (MutableArray arr#) (MutableArray brr#)-- = sameMutableArray# arr# brr#-+ = tagToEnum# (sameMutableArray# arr# brr#)- - -- | Copy a slice of an immutable array to a mutable array.- copyArray :: PrimMonad m-diff --git a/Data/Primitive/ByteArray.hs b/Data/Primitive/ByteArray.hs-index 2a47254..3a1ed6e 100644---- a/Data/Primitive/ByteArray.hs-+++ b/Data/Primitive/ByteArray.hs-@@ -99,7 +99,7 @@ mutableByteArrayContents (MutableByteArray arr#)- sameMutableByteArray :: MutableByteArray s -> MutableByteArray s -> Bool- {-# INLINE sameMutableByteArray #-}- sameMutableByteArray (MutableByteArray arr#) (MutableByteArray brr#)-- = sameMutableByteArray# arr# brr#-+ = tagToEnum# (sameMutableByteArray# arr# brr#)- - -- | Convert a mutable byte array to an immutable one without copying. The- -- array should not be modified after the conversion.-diff --git a/Data/Primitive/MutVar.hs b/Data/Primitive/MutVar.hs-index 9745ec7..eb654c9 100644---- a/Data/Primitive/MutVar.hs-+++ b/Data/Primitive/MutVar.hs-@@ -23,7 +23,7 @@ module Data.Primitive.MutVar (- ) where- - import Control.Monad.Primitive ( PrimMonad(..), primitive_ )--import GHC.Prim ( MutVar#, sameMutVar#, newMutVar#,-+import GHC.Prim ( MutVar#, sameMutVar#, newMutVar#, tagToEnum#,- readMutVar#, writeMutVar#, atomicModifyMutVar# )- import Data.Typeable ( Typeable )- -@@ -33,7 +33,7 @@ data MutVar s a = MutVar (MutVar# s a)- deriving ( Typeable )- - instance Eq (MutVar s a) where-- MutVar mva# == MutVar mvb# = sameMutVar# mva# mvb#-+ MutVar mva# == MutVar mvb# = tagToEnum# (sameMutVar# mva# mvb#)- - -- | Create a new 'MutVar' with the specified initial value- newMutVar :: PrimMonad m => a -> m (MutVar (PrimState m) a)-diff --git a/Data/Primitive/Types.hs b/Data/Primitive/Types.hs-index 7568f0c..d961e97 100644---- a/Data/Primitive/Types.hs-+++ b/Data/Primitive/Types.hs-@@ -20,6 +20,7 @@ module Data.Primitive.Types (- import Control.Monad.Primitive- import Data.Primitive.MachDeps- import Data.Primitive.Internal.Operations-+import GHC.Prim (tagToEnum#)- - import GHC.Base (- unsafeCoerce#,-@@ -48,14 +49,14 @@ import Data.Primitive.Internal.Compat ( mkNoRepType )- data Addr = Addr Addr# deriving ( Typeable )- - instance Eq Addr where-- Addr a# == Addr b# = eqAddr# a# b#-- Addr a# /= Addr b# = neAddr# a# b#-+ Addr a# == Addr b# = tagToEnum# (eqAddr# a# b#)-+ Addr a# /= Addr b# = tagToEnum# (neAddr# a# b#)- - instance Ord Addr where-- Addr a# > Addr b# = gtAddr# a# b#-- Addr a# >= Addr b# = geAddr# a# b#-- Addr a# < Addr b# = ltAddr# a# b#-- Addr a# <= Addr b# = leAddr# a# b#-+ Addr a# > Addr b# = tagToEnum# (gtAddr# a# b#)-+ Addr a# >= Addr b# = tagToEnum# (geAddr# a# b#)-+ Addr a# < Addr b# = tagToEnum# (ltAddr# a# b#)-+ Addr a# <= Addr b# = tagToEnum# (leAddr# a# b#)- - instance Data Addr where- toConstr _ = error "toConstr"--- -1.7.10.4-
@@ -1,25 +0,0 @@-From 40182bfb77ba16beab0da95b664d2c052d5fcad6 Mon Sep 17 00:00:00 2001-From: foo <foo@bar>-Date: Sun, 22 Sep 2013 04:53:30 +0000-Subject: [PATCH] TH exports------ Text/Julius.hs | 2 ++- 1 file changed, 2 insertions(+)--diff --git a/Text/Julius.hs b/Text/Julius.hs-index 3a9f83e..2b98f30 100644---- a/Text/Julius.hs-+++ b/Text/Julius.hs-@@ -40,6 +40,8 @@ module Text.Julius- , javascriptSettings- -- ** internal- , juliusUsedIdentifiers-+ -- used by TH-+ , asJavascriptUrl- ) where- - import Language.Haskell.TH.Quote (QuasiQuoter (..))--- -1.7.10.4-
@@ -0,0 +1,25 @@+From c1b166ad1dbed80f7eed7b9c1b2dc5c668eeb8fc Mon Sep 17 00:00:00 2001+From: androidbuilder <androidbuilder@example.com>+Date: Fri, 18 Oct 2013 23:28:56 +0000+Subject: [PATCH] cross build++---+ stm-chans.cabal | 2 +-+ 1 file changed, 1 insertion(+), 1 deletion(-)++diff --git a/stm-chans.cabal b/stm-chans.cabal+index 89d4780..2119a74 100644+--- a/stm-chans.cabal++++ b/stm-chans.cabal+@@ -6,7 +6,7 @@+ -- and source-repository:.+ Cabal-Version: >= 1.6+ -- We need a custom build in order to define __HADDOCK__+-Build-Type: Custom++Build-Type: Simple+ + Name: stm-chans+ Version: 3.0.0+-- +1.7.10.4+
@@ -1,12 +1,43 @@-From eff7034f0c9f80fd30c9d8952b3fd0a343adccc8 Mon Sep 17 00:00:00 2001-From: foo <bar>-Date: Mon, 23 Sep 2013 00:12:35 +0000-Subject: [PATCH] hack for Bionic+From e6d5c141186dbdbe97c698294485ffc4dcd3a843 Mon Sep 17 00:00:00 2001+From: dummy <dummy@example.com>+Date: Fri, 18 Oct 2013 16:45:50 +0000+Subject: [PATCH] hack for bionic + cross build ---- cbits/conv.c | 2 +-- 1 file changed, 1 insertion(+), 1 deletion(-)+ Data/UnixTime/Types.hsc | 12 ------------+ cbits/conv.c | 2 +-+ 2 files changed, 1 insertion(+), 13 deletions(-) +diff --git a/Data/UnixTime/Types.hsc b/Data/UnixTime/Types.hsc+index d30f39b..ec7ca4c 100644+--- a/Data/UnixTime/Types.hsc++++ b/Data/UnixTime/Types.hsc+@@ -9,8 +9,6 @@ import Foreign.Storable+ + #include <sys/time.h>+ +-#let alignment t = "%lu", (unsigned long)offsetof(struct {char x__; t (y__); }, y__)+-+ -- |+ -- Data structure for Unix time.+ data UnixTime = UnixTime {+@@ -20,16 +18,6 @@ data UnixTime = UnixTime {+ , utMicroSeconds :: {-# UNPACK #-} !Int32+ } deriving (Eq,Ord,Show)+ +-instance Storable UnixTime where+- sizeOf _ = (#size struct timeval)+- alignment _ = (#alignment struct timeval)+- peek ptr = UnixTime+- <$> (#peek struct timeval, tv_sec) ptr+- <*> (#peek struct timeval, tv_usec) ptr+- poke ptr ut = do+- (#poke struct timeval, tv_sec) ptr (utSeconds ut)+- (#poke struct timeval, tv_usec) ptr (utMicroSeconds ut)+-+ -- |+ -- Format of the strptime()/strftime() style.+ type Format = ByteString diff --git a/cbits/conv.c b/cbits/conv.c index 7ff7b87..2e4c870 100644 --- a/cbits/conv.c
@@ -1,29 +1,12 @@-From af259b521574b734a7a0b1b3e9e6868df33ebdb9 Mon Sep 17 00:00:00 2001-From: foo <foo@bar>-Date: Sat, 21 Sep 2013 23:47:47 +0000-Subject: [PATCH] hack to build with new ghc+From b0a79f4f98188ba5d43b7e3912b36d34d099ab65 Mon Sep 17 00:00:00 2001+From: dummy <dummy@example.com>+Date: Fri, 18 Oct 2013 23:20:35 +0000+Subject: [PATCH] cross build ---- Data/Vector.hs | 1 - Data/Vector/Fusion/Stream/Monadic.hs | 1 -- Data/Vector/Generic.hs | 10 ++--------- Data/Vector/Primitive.hs | 1 -- Data/Vector/Storable.hs | 1 -- Data/Vector/Unboxed/Base.hs | 15 +--------------- 6 files changed, 3 insertions(+), 26 deletions(-)+ 1 file changed, 1 deletion(-) -diff --git a/Data/Vector.hs b/Data/Vector.hs-index 138b2db..92c4387 100644---- a/Data/Vector.hs-+++ b/Data/Vector.hs-@@ -215,7 +215,6 @@ instance Data a => Data (Vector a) where- toConstr _ = error "toConstr"- gunfold _ _ = error "gunfold"- dataTypeOf _ = G.mkType "Data.Vector.Vector"-- dataCast1 = G.dataCast- - type instance G.Mutable Vector = MVector- diff --git a/Data/Vector/Fusion/Stream/Monadic.hs b/Data/Vector/Fusion/Stream/Monadic.hs index 51fec75..b089b3d 100644 --- a/Data/Vector/Fusion/Stream/Monadic.hs@@ -36,95 +19,6 @@ #endif emptyStream :: String-diff --git a/Data/Vector/Generic.hs b/Data/Vector/Generic.hs-index 78f7260..f4ea80a 100644---- a/Data/Vector/Generic.hs-+++ b/Data/Vector/Generic.hs-@@ -157,7 +157,7 @@ module Data.Vector.Generic (- showsPrec, readPrec,- - -- ** @Data@ and @Typeable@-- gfoldl, dataCast, mkType-+ gfoldl, mkType- ) where- - import Data.Vector.Generic.Base-@@ -194,7 +194,7 @@ import Prelude hiding ( length, null,- showsPrec )- - import qualified Text.Read as Read--import Data.Typeable ( Typeable1, gcast1 )-+import Data.Typeable ( gcast1 )- - #include "vector.h"- -@@ -2019,9 +2019,3 @@ gfoldl f z v = z fromList `f` toList v- mkType :: String -> DataType- {-# INLINE mkType #-}- mkType = mkNoRepType----dataCast :: (Vector v a, Data a, Typeable1 v, Typeable1 t)-- => (forall d. Data d => c (t d)) -> Maybe (c (v a))--{-# INLINE dataCast #-}--dataCast f = gcast1 f---diff --git a/Data/Vector/Primitive.hs b/Data/Vector/Primitive.hs-index 5f59bae..06e84c3 100644---- a/Data/Vector/Primitive.hs-+++ b/Data/Vector/Primitive.hs-@@ -188,7 +188,6 @@ instance (Data a, Prim a) => Data (Vector a) where- toConstr _ = error "toConstr"- gunfold _ _ = error "gunfold"- dataTypeOf _ = G.mkType "Data.Vector.Primitive.Vector"-- dataCast1 = G.dataCast- - - type instance G.Mutable Vector = MVector-diff --git a/Data/Vector/Storable.hs b/Data/Vector/Storable.hs-index f9928e4..a17e3d6 100644---- a/Data/Vector/Storable.hs-+++ b/Data/Vector/Storable.hs-@@ -194,7 +194,6 @@ instance (Data a, Storable a) => Data (Vector a) where- toConstr _ = error "toConstr"- gunfold _ _ = error "gunfold"- dataTypeOf _ = G.mkType "Data.Vector.Storable.Vector"-- dataCast1 = G.dataCast- - type instance G.Mutable Vector = MVector- -diff --git a/Data/Vector/Unboxed/Base.hs b/Data/Vector/Unboxed/Base.hs-index 00350cb..c13ea20 100644---- a/Data/Vector/Unboxed/Base.hs-+++ b/Data/Vector/Unboxed/Base.hs-@@ -31,7 +31,7 @@ import Data.Word ( Word, Word8, Word16, Word32, Word64 )- import Data.Int ( Int8, Int16, Int32, Int64 )- import Data.Complex- --import Data.Typeable ( Typeable1(..), Typeable2(..), mkTyConApp,-+import Data.Typeable ( mkTyConApp,- #if MIN_VERSION_base(4,4,0)- mkTyCon3- #else-@@ -65,19 +65,6 @@ vectorTyCon = mkTyCon3 "vector"- vectorTyCon m s = mkTyCon $ m ++ "." ++ s- #endif- --instance Typeable1 Vector where-- typeOf1 _ = mkTyConApp (vectorTyCon "Data.Vector.Unboxed" "Vector") []----instance Typeable2 MVector where-- typeOf2 _ = mkTyConApp (vectorTyCon "Data.Vector.Unboxed.Mutable" "MVector") []----instance (Data a, Unbox a) => Data (Vector a) where-- gfoldl = G.gfoldl-- toConstr _ = error "toConstr"-- gunfold _ _ = error "gunfold"-- dataTypeOf _ = G.mkType "Data.Vector.Unboxed.Vector"-- dataCast1 = G.dataCast--- -- ----- -- Unit- -- ---- -- 1.7.10.4
@@ -1,18 +1,15 @@-From 9e15d4af1f53c76a402ec1782e0306a4bee7eec7 Mon Sep 17 00:00:00 2001-From: foo <foo@bar>-Date: Sun, 22 Sep 2013 04:03:56 +0000-Subject: [PATCH] expad TH+From 7583457fb410d07f480a2aa7d6c2f174324b3592 Mon Sep 17 00:00:00 2001+From: dummy <dummy@example.com>+Date: Sat, 19 Oct 2013 02:03:18 +0000+Subject: [PATCH] hackity -used EvilSplicer-Has to remove some logger TH splices which didn't come out. --- Yesod/Core.hs | 2 - Yesod/Core/Class/Yesod.hs | 247 ++++++++++++++++++++++++++++++-------------- Yesod/Core/Dispatch.hs | 7 -- Yesod/Core/Handler.hs | 24 ++--- Yesod/Core/Internal/Run.hs | 2 -- Yesod/Core/Widget.hs | 2 +- 6 files changed, 181 insertions(+), 103 deletions(-)+ 5 files changed, 179 insertions(+), 103 deletions(-) diff --git a/Yesod/Core.hs b/Yesod/Core.hs index 12e59d5..f1ff21c 100644@@ -409,19 +406,6 @@ return $ YRPlain H.status500 []-diff --git a/Yesod/Core/Widget.hs b/Yesod/Core/Widget.hs-index be97764..874f018 100644---- a/Yesod/Core/Widget.hs-+++ b/Yesod/Core/Widget.hs-@@ -47,6 +47,8 @@ module Yesod.Core.Widget- , handlerToWidget- -- * Internal- , whamletFileWithSettings-+ -- used by TH-+ , asWidgetT- ) where- - import Data.Monoid -- 1.7.10.4
@@ -1,23 +1,37 @@-From 3a17bd1223fcd7a750bc0e5e94ec5b97ad2e573b Mon Sep 17 00:00:00 2001-From: foo <foo@bar>-Date: Sun, 22 Sep 2013 05:14:21 +0000+From c5b0db193fd6e9fd6be22891ae988babbfac3ff0 Mon Sep 17 00:00:00 2001+From: dummy <dummy@example.com>+Date: Sat, 19 Oct 2013 02:14:38 +0000 Subject: [PATCH] spliced TH Used EvilSplicer. Needed a few syntax fixes, and a lot of added imports.++Removed some things I don't need, rather than re-splicing to handle a new version. ---- Yesod/Form/Fields.hs | 747 ++++++++++++++++++++++++++++++++++++-----------+ Yesod/Form/Fields.hs | 771 +++++++++++++++++++++++++++++++++++------------ Yesod/Form/Functions.hs | 237 ++++++++++++--- Yesod/Form/Jquery.hs | 125 ++++++--- Yesod/Form/MassInput.hs | 233 ++++++++++++---+ Yesod/Form/MassInput.hs | 233 +++++++++++--- Yesod/Form/Nic.hs | 61 +++- yesod-form.cabal | 1 +- 6 files changed, 1123 insertions(+), 281 deletions(-)+ 6 files changed, 1123 insertions(+), 305 deletions(-) diff --git a/Yesod/Form/Fields.hs b/Yesod/Form/Fields.hs-index 5c16d7e..edd9715 100644+index b8109df..9bde340 100644 --- a/Yesod/Form/Fields.hs +++ b/Yesod/Form/Fields.hs-@@ -41,8 +41,6 @@ module Yesod.Form.Fields+@@ -1,4 +1,3 @@+-{-# LANGUAGE QuasiQuotes #-}+ {-# LANGUAGE TypeFamilies #-}+ {-# LANGUAGE OverloadedStrings #-}+ {-# LANGUAGE GeneralizedNewtypeDeriving #-}+@@ -36,15 +35,11 @@ module Yesod.Form.Fields+ , selectFieldList+ , radioField+ , radioFieldList+- , checkboxesFieldList+- , checkboxesField+ , multiSelectField+ , multiSelectFieldList , Option (..) , OptionList (..) , mkOptionList@@ -26,7 +40,7 @@ , optionsPairs , optionsEnum ) where-@@ -68,6 +66,15 @@ import Text.HTML.SanitizeXSS (sanitizeBalance)+@@ -70,6 +65,15 @@ import Text.HTML.SanitizeXSS (sanitizeBalance) import Control.Monad (when, unless) import Data.Maybe (listToMaybe, fromMaybe) @@ -42,7 +56,7 @@ import qualified Blaze.ByteString.Builder.Html.Utf8 as B import Blaze.ByteString.Builder (writeByteString, toLazyByteString) import Blaze.ByteString.Builder.Internal.Write (fromWriteList)-@@ -80,14 +87,12 @@ import Data.Text (Text, unpack, pack)+@@ -82,14 +86,12 @@ import Data.Text (Text, unpack, pack) import qualified Data.Text.Read import qualified Data.Map as Map@@ -57,7 +71,7 @@ defaultFormMessage :: FormMessage -> Text defaultFormMessage = englishFormMessage-@@ -100,10 +105,24 @@ intField = Field+@@ -102,10 +104,24 @@ intField = Field Right (a, "") -> Right a _ -> Left $ MsgInvalidInteger s @@ -86,7 +100,7 @@ , fieldEnctype = UrlEncoded } where-@@ -117,10 +136,24 @@ doubleField = Field+@@ -119,10 +135,24 @@ doubleField = Field Right (a, "") -> Right a _ -> Left $ MsgInvalidNumber s @@ -115,7 +129,7 @@ , fieldEnctype = UrlEncoded } where showVal = either id (pack . show)-@@ -128,10 +161,24 @@ $newline never+@@ -130,10 +160,24 @@ $newline never dayField :: Monad m => RenderMessage (HandlerSite m) FormMessage => Field m Day dayField = Field { fieldParse = parseHelper $ parseDate . unpack@@ -144,7 +158,7 @@ , fieldEnctype = UrlEncoded } where showVal = either id (pack . show)-@@ -139,10 +186,23 @@ $newline never+@@ -141,10 +185,23 @@ $newline never timeField :: Monad m => RenderMessage (HandlerSite m) FormMessage => Field m TimeOfDay timeField = Field { fieldParse = parseHelper parseTime@@ -172,7 +186,7 @@ , fieldEnctype = UrlEncoded } where-@@ -155,10 +215,18 @@ $newline never+@@ -157,10 +214,18 @@ $newline never htmlField :: Monad m => RenderMessage (HandlerSite m) FormMessage => Field m Html htmlField = Field { fieldParse = parseHelper $ Right . preEscapedText . sanitizeBalance@@ -195,7 +209,7 @@ , fieldEnctype = UrlEncoded } where showVal = either id (pack . renderHtml)-@@ -166,7 +234,7 @@ $newline never+@@ -168,7 +233,7 @@ $newline never -- | A newtype wrapper around a 'Text' that converts newlines to HTML -- br-tags. newtype Textarea = Textarea { unTextarea :: Text }@@ -204,7 +218,7 @@ instance ToHtml Textarea where toHtml = unsafeByteString-@@ -184,10 +252,18 @@ instance ToHtml Textarea where+@@ -186,10 +251,18 @@ instance ToHtml Textarea where textareaField :: Monad m => RenderMessage (HandlerSite m) FormMessage => Field m Textarea textareaField = Field { fieldParse = parseHelper $ Right . Textarea@@ -227,7 +241,7 @@ , fieldEnctype = UrlEncoded } -@@ -195,10 +271,19 @@ hiddenField :: (Monad m, PathPiece p, RenderMessage (HandlerSite m) FormMessage)+@@ -197,10 +270,19 @@ hiddenField :: (Monad m, PathPiece p, RenderMessage (HandlerSite m) FormMessage) => Field m p hiddenField = Field { fieldParse = parseHelper $ maybe (Left MsgValueRequired) Right . fromPathPiece@@ -251,7 +265,7 @@ , fieldEnctype = UrlEncoded } -@@ -206,20 +291,55 @@ textField :: Monad m => RenderMessage (HandlerSite m) FormMessage => Field m Tex+@@ -208,20 +290,55 @@ textField :: Monad m => RenderMessage (HandlerSite m) FormMessage => Field m Tex textField = Field { fieldParse = parseHelper $ Right , fieldView = \theId name attrs val isReq ->@@ -315,7 +329,7 @@ , fieldEnctype = UrlEncoded } -@@ -291,10 +411,24 @@ emailField = Field+@@ -293,10 +410,24 @@ emailField = Field case Email.canonicalizeEmail $ encodeUtf8 s of Just e -> Right $ decodeUtf8With lenientDecode e Nothing -> Left $ MsgInvalidEmail s@@ -344,7 +358,7 @@ , fieldEnctype = UrlEncoded } -@@ -303,20 +437,78 @@ searchField :: Monad m => RenderMessage (HandlerSite m) FormMessage => AutoFocus+@@ -305,20 +436,78 @@ searchField :: Monad m => RenderMessage (HandlerSite m) FormMessage => AutoFocus searchField autoFocus = Field { fieldParse = parseHelper Right , fieldView = \theId name attrs val isReq -> do@@ -435,7 +449,7 @@ , fieldEnctype = UrlEncoded } -@@ -327,7 +519,30 @@ urlField = Field+@@ -329,7 +518,30 @@ urlField = Field Nothing -> Left $ MsgInvalidUrl s Just _ -> Right s , fieldView = \theId name attrs val isReq ->@@ -467,7 +481,7 @@ , fieldEnctype = UrlEncoded } -@@ -340,18 +555,56 @@ selectField :: (Eq a, RenderMessage site FormMessage)+@@ -342,18 +554,56 @@ selectField :: (Eq a, RenderMessage site FormMessage) => HandlerT site IO (OptionList a) -> Field (HandlerT site IO) a selectField = selectFieldHelper@@ -536,7 +550,7 @@ multiSelectFieldList :: (Eq a, RenderMessage site FormMessage, RenderMessage site msg) => [(msg, a)]-@@ -374,11 +627,48 @@ multiSelectField ioptlist =+@@ -376,11 +626,48 @@ multiSelectField ioptlist = view theId name attrs val isReq = do opts <- fmap olOptions $ handlerToWidget ioptlist let selOpts = map (id &&& (optselected val)) opts@@ -590,7 +604,33 @@ where optselected (Left _) _ = False optselected (Right vals) opt = (optionInternalValue opt) `elem` vals-@@ -392,41 +682,167 @@ radioField :: (Eq a, RenderMessage site FormMessage)+@@ -390,67 +677,172 @@ radioFieldList :: (Eq a, RenderMessage site FormMessage, RenderMessage site msg)+ -> Field (HandlerT site IO) a+ radioFieldList = radioField . optionsPairs+ +-checkboxesFieldList :: (Eq a, RenderMessage site FormMessage, RenderMessage site msg) => [(msg, a)]+- -> Field (HandlerT site IO) [a]+-checkboxesFieldList = checkboxesField . optionsPairs+-+-checkboxesField :: (Eq a, RenderMessage site FormMessage)+- => HandlerT site IO (OptionList a)+- -> Field (HandlerT site IO) [a]+-checkboxesField ioptlist = (multiSelectField ioptlist)+- { fieldView =+- \theId name attrs val isReq -> do+- opts <- fmap olOptions $ handlerToWidget ioptlist+- let optselected (Left _) _ = False+- optselected (Right vals) opt = (optionInternalValue opt) `elem` vals+- [whamlet|+- <span ##{theId}>+- $forall opt <- opts+- <label>+- <input type=checkbox name=#{name} value=#{optionExternalValue opt} *{attrs} :optselected val opt:checked>+- #{optionDisplay opt}+- |]+- }+ + radioField :: (Eq a, RenderMessage site FormMessage) => HandlerT site IO (OptionList a) -> Field (HandlerT site IO) a radioField = selectFieldHelper@@ -695,10 +735,6 @@ - $if not isReq - <input id=#{theId}-none *{attrs} type=radio name=#{name} value=none checked> - <label for=#{theId}-none>_{MsgSelectNone}------<input id=#{theId}-yes *{attrs} type=radio name=#{name} value=yes :showVal id val:checked>--<label for=#{theId}-yes>_{MsgBoolYes} + , fieldView = \theId name attrs val isReq -> do { Text.Hamlet.condH + [(not isReq, + do { (Yesod.Core.Widget.asWidgetT . toWidget)@@ -782,13 +818,17 @@ + (Yesod.Core.Widget.asWidgetT . toWidget) + ((Text.Blaze.Internal.preEscapedText . pack) "</label>") } +-+-<input id=#{theId}-yes *{attrs} type=radio name=#{name} value=yes :showVal id val:checked>+-<label for=#{theId}-yes>_{MsgBoolYes}+- -<input id=#{theId}-no *{attrs} type=radio name=#{name} value=no :showVal not val:checked> -<label for=#{theId}-no>_{MsgBoolNo} -|] , fieldEnctype = UrlEncoded } where-@@ -452,10 +868,25 @@ $newline never+@@ -476,10 +868,25 @@ $newline never checkBoxField :: Monad m => RenderMessage (HandlerSite m) FormMessage => Field m Bool checkBoxField = Field { fieldParse = \e _ -> return $ checkBoxParser e@@ -818,7 +858,7 @@ , fieldEnctype = UrlEncoded } -@@ -499,49 +930,7 @@ optionsPairs opts = do+@@ -523,49 +930,7 @@ optionsPairs opts = do optionsEnum :: (MonadHandler m, Show a, Enum a, Bounded a) => m (OptionList a) optionsEnum = optionsPairs $ map (\x -> (pack $ show x, x)) [minBound..maxBound] @@ -869,7 +909,7 @@ selectFieldHelper :: (Eq a, RenderMessage site FormMessage)-@@ -585,9 +974,21 @@ fileField = Field+@@ -609,9 +974,21 @@ fileField = Field case files of [] -> Right Nothing file:_ -> Right $ Just file@@ -894,7 +934,7 @@ , fieldEnctype = Multipart } -@@ -614,10 +1015,20 @@ fileAFormReq fs = AForm $ \(site, langs) menvs ints -> do+@@ -638,10 +1015,20 @@ fileAFormReq fs = AForm $ \(site, langs) menvs ints -> do { fvLabel = toHtml $ renderMessage site langs $ fsLabel fs , fvTooltip = fmap (toHtml . renderMessage site langs) $ fsTooltip fs , fvId = id'@@ -919,7 +959,7 @@ , fvErrors = errs , fvRequired = True }-@@ -646,10 +1057,20 @@ fileAFormOpt fs = AForm $ \(master, langs) menvs ints -> do+@@ -670,10 +1057,20 @@ fileAFormOpt fs = AForm $ \(master, langs) menvs ints -> do { fvLabel = toHtml $ renderMessage master langs $ fsLabel fs , fvTooltip = fmap (toHtml . renderMessage master langs) $ fsTooltip fs , fvId = id'@@ -1730,7 +1770,7 @@ } where diff --git a/yesod-form.cabal b/yesod-form.cabal-index f6ebbe0..46e3dd7 100644+index afd2de5..49fd684 100644 --- a/yesod-form.cabal +++ b/yesod-form.cabal @@ -19,6 +19,7 @@ library
@@ -68,27 +68,24 @@ patched MissingH patched bloomfilter patched SafeSemaphore- patched unordered-containers+ patched distributive patched comonad patched HTTP patched MonadCatchIO-transformers- patched distributive patched iproute patched primitive patched socks patched entropy patched vector+ patched stm-chans patched persistent patched profunctors patched skein patched lens patched persistent-template- patched file-embed patched wai-app-static patched shakespeare- patched hamlet patched shakespeare-css- patched shakespeare-js patched yesod-routes patched yesod-core patched yesod-persistent
@@ -19,9 +19,6 @@ echo "** base directory $base does not contain bin/git" >&2 exit 1 fi-if [ -n "$GIT_ANNEX_STANDLONE_ENV" ]; then- echo "** runshell loop detected!" >&2-fi # Get absolute path to base, to avoid breakage when things change directories. orig="$(pwd)"
@@ -21,9 +21,6 @@ echo "** bundle directory $bundle does not contain git" >&2 exit 1 fi-if [ -n "$GIT_ANNEX_STANDLONE_ENV" ]; then- echo "** runshell loop detected!" >&2-fi # Get absolute path to base, to avoid breakage when things change directories. orig="$(pwd)"
@@ -0,0 +1,4 @@+input[type=number]+ width: 5em+select+ width: 10em
@@ -0,0 +1,21 @@+<div .span9 .hero-unit>+ <h2>+ Consistency checks+ <p>+ Checking the contents of a repository periodically will ensure that #+ your data is in good shape. Any problems that are detected will #+ be automatically fixed.+ <p>+ Running the consistency check involves reading all the files in the #+ repository, which can take a long time if it's large. Running just a #+ little at a time will eventually check the whole repository.+ $if (not (null checks))+ <p>+ Currently scheduled checks:+ $forall c <- checks+ ^{showFsckForm False c}+ <div style="margin-left: 5em">+ ^{showFsckStatus c}+ <p>+ Add a check:+ ^{showFsckForm True defaultFsck}
@@ -0,0 +1,2 @@+<form method="post" .form-inline enctype=#{enctype} action="@{action}">+ ^{form}
@@ -0,0 +1,15 @@+#{msg}+<p>+ <div .input-prepend .input-append>+ Check ^{fvInput reposView} for #+ ^{fvInput durationView} minutes #+ ^{fvInput recurranceView} #+ starting at ^{fvInput timeView} #+ $if new+ <button type=submit .btn .btn-primary>+ Add+ $else+ <button type=submit .btn>+ Save+ <a .btn href="@{RemoveActivityR u activity}">+ Remove
@@ -0,0 +1,5 @@+<i>+ $maybe t <- lastrun+ (last run: #{show t})+ $nothing+ (not yet run)
@@ -13,6 +13,7 @@ <p> Tune the behavior of git-annex, including how many copies # to retain of each file, and how much disk space it can use.+ <div .row-fluid> <div .span4> $if xmppconfigured <h3>@@ -28,3 +29,10 @@ <p> Keep in touch with remote devices, and with your friends, # by configuring a jabber account.+ <div .span4>+ <h3>+ <a href="@{ConfigFsckR}">+ Configure consistency checks+ <p>+ Set up periodic checks of your data to detect and recover from #+ disk problems.
@@ -0,0 +1,25 @@+<div .span9 .hero-unit>+ <p>+ A #+ <a href="@{ConfigFsckR}">+ consistency check #+ found corrupt data in the git repository #{repodesc}.+ <p>+ While this is not good, this problem can be automatically repaired,+ often without data loss.+ <p>+ When possible, the corrupt data will be recovered from other #+ repositories. You should make sure any other repositories that might #+ have this data are available before continuing. So, plug in any #+ removable drive that contains a repository, or make sure your network #+ connection to other repositories is active.+ <p>+ <a .btn .btn-primary href="@{RepairRepositoryRunR u}" onclick="$('#workingmodal').modal('show');">+ Start Repair Process+<div .modal .fade #workingmodal>+ <div .modal-header>+ <h3>+ Repairing #{repodesc} ...+ <div .modal-body>+ <p>+ This may take some time.
@@ -0,0 +1,13 @@+<div .span9 .hero-unit>+ <p>+ Good news: Your repository has successfully been repaired!+ <p>+ This problem could have had a variety of causes. If your computer #+ lost power, or the drive containing this repository #+ was disconnected, it would explain this type of problem.+ <p>+ On the other hand, it's possible that you have a hardware problem.+ <p>+ Remember: Lots of copies keep stuff safe! The more repositories you #+ have, the less likely you are to lose data no matter what goes wrong.+ ^{repolist}