git-annex 4.20130723 → 4.20130802
raw patch · 261 files changed
+2989/−559 lines, 261 filesdep +feedbinary-added
Dependencies added: feed
Files
- Annex/Branch.hs +1/−0
- Annex/Content.hs +3/−3
- Annex/Direct.hs +1/−1
- Annex/Environment.hs +1/−1
- Annex/Journal.hs +2/−2
- Annex/Link.hs +2/−2
- Annex/LockPool.hs +2/−2
- Annex/ReplaceFile.hs +1/−2
- Annex/Ssh.hs +1/−1
- Annex/Version.hs +1/−1
- Assistant/Install/AutoStart.o binary
- Assistant/Install/Menu.o binary
- Assistant/Ssh.hs +37/−2
- Assistant/Threads/Committer.hs +25/−17
- Assistant/Threads/NetWatcher.hs +4/−4
- Assistant/WebApp/Configurators/Local.hs +4/−0
- Assistant/WebApp/Control.hs +1/−1
- Assistant/WebApp/RepoList.hs +31/−0
- Assistant/WebApp/routes +2/−0
- Assistant/XMPP.hs +8/−2
- Backend/URL.hs +14/−12
- Build/BundledPrograms.o binary
- Build/Configure.o binary
- Build/DesktopFile.o binary
- Build/InstallDesktopFile.o binary
- Build/Standalone.o binary
- Build/SysConfig.o binary
- Build/TestConfig.o binary
- CHANGELOG +48/−1
- CmdLine.hs +3/−0
- Command.hs +7/−1
- Command/Add.hs +3/−1
- Command/AddUrl.hs +41/−31
- Command/DropUnused.hs +2/−3
- Command/Find.hs +1/−1
- Command/Fsck.hs +3/−3
- Command/ImportFeed.hs +173/−0
- Command/Indirect.hs +1/−1
- Command/Unannex.hs +1/−1
- Command/Unused.hs +11/−5
- Config/Files.o binary
- Git/CatFile.hs +41/−10
- Git/Construct.hs +4/−4
- Git/CurrentRepo.hs +1/−1
- Git/FilePath.hs +2/−2
- Git/LsFiles.hs +15/−6
- Git/Queue.hs +3/−3
- GitAnnex.hs +6/−0
- Logs/Transfer.hs +3/−3
- Logs/Web.hs +45/−2
- Makefile +1/−1
- Remote/Directory.hs +1/−1
- Remote/Git.hs +3/−3
- Remote/Rsync.hs +2/−2
- Setup.o binary
- Test.hs +8/−10
- Types/Command.hs +1/−0
- Utility/CoProcess.hs +1/−1
- Utility/CopyFile.hs +1/−1
- Utility/Daemon.hs +5/−5
- Utility/Directory.o binary
- Utility/Exception.o binary
- Utility/ExternalSHA.o binary
- Utility/FileMode.hs +4/−4
- Utility/FileSystemEncoding.hs +18/−2
- Utility/FileSystemEncoding.o binary
- Utility/FreeDesktop.o binary
- Utility/Gpg.hs +2/−2
- Utility/LogFile.hs +3/−3
- Utility/Misc.o binary
- Utility/Monad.o binary
- Utility/OSX.o binary
- Utility/Path.hs +23/−4
- Utility/Path.o binary
- Utility/Process.hs +5/−1
- Utility/Process.o binary
- Utility/SafeCommand.hs +13/−5
- Utility/SafeCommand.o binary
- Utility/ThreadScheduler.hs +2/−2
- Utility/Tmp.hs +17/−0
- Utility/Tmp.o binary
- Utility/Url.hs +3/−0
- Utility/UserInfo.hs +2/−2
- debian/.changelog.swp binary
- debian/changelog +48/−1
- debian/control +1/−0
- doc/Android.mdwn +1/−1
- doc/Android/comment_10_20e3d513b8b97496d76aca4619026cd6._comment +0/−16
- doc/Android/comment_11_c96b8f1cc1583a74eb2483f48357f023._comment +0/−15
- doc/Android/comment_12_6551f5fa081494b079c10a33c9b0d8ad._comment +0/−10
- doc/Android/comment_13_7c633d245651ec08f63194fe1fc194ae._comment +0/−8
- doc/Android/comment_14_60c2403140085f9caf48a33b59a36ab4._comment +0/−8
- doc/Android/comment_16_9af73451be09f03cfff81fdf9481ffc4._comment +0/−27
- doc/Android/comment_17_f76561a654b534df3a807b1c045710b2._comment +0/−8
- doc/Android/comment_18_1b46cdf154ddadfe17e4b6e4054dc619._comment +0/−17
- doc/Android/comment_1_cc9caa5dd22dd67e5c1d22d697096dd2._comment +0/−15
- doc/Android/comment_21_5903f6a4a81a6534fa8cfafb3b6c37bb._comment +0/−8
- doc/Android/comment_22_36afd354f9669a154d7b6b2c4d43ded9._comment +0/−8
- doc/Android/comment_23_de98154792e8611a134429f06d82bcb1._comment +0/−8
- doc/Android/comment_24_7ab509c25243009bfbffd796ec64e77b._comment +0/−10
- doc/Android/comment_25_026d1a01d5753d71ac3dfc002f2a5eec._comment +0/−10
- doc/Android/comment_26_f0a044fb649d43e32c96b08edbc336c3._comment +0/−12
- doc/Android/comment_29_37aa87a451d4390ed367402eec740855._comment +12/−0
- doc/Android/comment_2_c2422b7dd9d526b3616e49f48cf178c2._comment +0/−10
- doc/Android/comment_3_0e4980c27b13dbc28477c02a82898248._comment +0/−14
- doc/Android/comment_4_86f7b5444e2eaea7f8f7b9160f671a1d._comment +0/−10
- doc/Android/comment_5_9d78009435736a178d5a3f5a9bc0ed6a._comment +0/−8
- doc/Android/comment_6_7b9523ddb20dc4a929e556c3ed0c7406._comment +0/−18
- doc/Android/comment_7_a56628a622da752806c42c5b8b54ceef._comment +0/−8
- doc/Android/comment_8_19656ec99b8f6aa64c1d01a3c9ae9bd0._comment +0/−8
- doc/Android/comment_9_55e703ae105d0c0ee9ac50df8cc59dfb._comment +0/−10
- 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/assistant/.release_notes.mdwn.swp binary
- doc/assistant/archival_walkthrough.mdwn +1/−1
- doc/assistant/release_notes.mdwn +10/−0
- doc/assistant/remote_sharing_walkthrough.mdwn +1/−1
- doc/assistant/repogroup.png binary
- doc/assistant/repogroups.png binary
- doc/backends.mdwn +3/−2
- doc/backends/comment_3_fdcbf8727fdefb9942a54689234b9698._comment +12/−0
- doc/bugs/Complete_failure_trying_to_unannex_a_large_annex.mdwn +3/−0
- doc/bugs/Every_new_file_gets_symlinked_to_a_git_object.mdwn +78/−0
- doc/bugs/Internal_Server_Error:_Unknown_UUID.mdwn +12/−0
- doc/bugs/Internal_Server_Error_unknown_UUID__59___cannot_modify.mdwn +2/−0
- doc/bugs/Missing_repo_uuid_after_local_pairing_with_older_annex.mdwn +5/−0
- doc/bugs/OS_X_10.8:_Can__39__t_reopen_webapp.mdwn +31/−0
- doc/bugs/Test_failure_on_debian_dropunused.mdwn +31/−0
- doc/bugs/__34__Adding_4923_files__34___is_really_slow.mdwn +2/−0
- doc/bugs/__96__git_annex_fix__96___run_on_non-annexed_files_is_no-op.mdwn +3/−0
- doc/bugs/__96__git_annex_import__96___clobbers_mtime.mdwn +60/−0
- doc/bugs/assistant_syncs_with_remotes_even_when_all_remotes_disabled.mdwn +4/−0
- doc/bugs/failure_to_return_to_indirect_mode_on_usb.mdwn +2/−0
- doc/bugs/git-annex:_fd:14:_hGetLine:_end_of_file.mdwn +49/−0
- doc/bugs/git-annex_broken_on_Android_4.3.mdwn +3/−0
- doc/bugs/googlemail.mdwn +2/−1
- doc/bugs/gpg_hangs_on_glacier_remote_creation.mdwn +2/−0
- doc/bugs/hGetContents:_user_error.mdwn +1/−1
- doc/bugs/unannex_removes_object_even_if_referred_to_by_others.mdwn +2/−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_9_b7c084be01ce985be51e48503fcba468._comment +8/−0
- doc/bugs/wishlist:_simple_url_for_webapp.mdwn +36/−0
- doc/design/assistant.mdwn +17/−2
- doc/design/assistant/android.mdwn +1/−1
- 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 +12/−0
- doc/design/assistant/chunks.mdwn +7/−0
- doc/design/assistant/comment_18_53137b2df4913496c0afb2d895aa4ee2._comment +8/−0
- doc/design/assistant/comment_19_ff1b0ba57e22ed757ec3fc5400b5e43e._comment +8/−0
- doc/design/assistant/comment_20_099da245e3276fa84f5e14312d186621._comment +8/−0
- doc/design/assistant/disaster_recovery.mdwn +53/−0
- doc/design/assistant/gpgkeys.mdwn +24/−0
- doc/design/assistant/partial_content.mdwn +1/−1
- doc/design/assistant/sshpassword.mdwn +12/−0
- doc/design/assistant/xmpp.mdwn +0/−22
- doc/design/assistant/xmpp_security.mdwn +26/−0
- doc/direct_mode.mdwn +1/−1
- doc/feeds.mdwn +1/−2
- doc/forum/Git_repos_in_git_annex__63__.mdwn +7/−0
- doc/forum/How_to_make_Maven_releases_work_with_git_annex___63__.mdwn +5/−0
- doc/forum/Making_git-annex_a_self-funded_project__63__.mdwn +10/−0
- doc/forum/Undo_Git_Annex_Changes_To_Linked_Files.mdwn +7/−0
- doc/forum/archival_and_multiple_users.mdwn +8/−0
- doc/forum/central_non-bare_and_git_push.txt +9/−0
- doc/forum/commit_current_workdir_state_in_direct_mode.mdwn +5/−0
- doc/forum/expire_files__44___move_to_other_hosts.mdwn +19/−0
- doc/forum/git_annex_get_creates_a_new_uuid.mdwn +6/−0
- doc/forum/how_to_decrypt_file_from_encrypted_special_remote__63__.mdwn +14/−0
- doc/forum/making_good_use_of_my_shiny_new_rsync.net_account.mdwn +20/−0
- doc/forum/remote_server_client_repositories_are_bare__33____63__.mdwn +17/−0
- doc/git-annex.mdwn +13/−0
- doc/index.mdwn +10/−0
- doc/install/Android.mdwn +2/−2
- 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/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/OSX.mdwn +1/−1
- doc/install/OSX/comment_22_6b5f44a98f9d37a1c6ecfe19a60fe6c5._comment +12/−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/Windows.mdwn +7/−0
- doc/install/cabal.mdwn +6/−1
- doc/install/cabal/comment_10_7ebe353b05d4df29897dc9a4f45c8a91._comment +8/−0
- doc/install/cabal/comment_9_5ddbba419d96a7411f7edddaa4d7b739._comment +12/−0
- doc/install/fromscratch.mdwn +1/−0
- doc/news/version_4.20130601.mdwn +0/−25
- doc/news/version_4.20130802.mdwn +44/−0
- doc/special_remotes/hook.mdwn +1/−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/tips/beware_of_SSD_wear_when_doing_fsck_on_large_special_remotes.mdwn +2/−0
- doc/tips/downloading_podcasts.mdwn +63/−0
- doc/tips/flickrannex/comment_11_ab5bcb025381b3da4d7c6dfd0c7310dd._comment +46/−0
- doc/tips/flickrannex/comment_12_90a331275d888221bc695003c8acbe46._comment +58/−0
- doc/tips/flickrannex/comment_13_cf9dad91ee7d334c720adb3310aa0003._comment +130/−0
- doc/todo/faster_gnupg_cipher.mdwn +1/−0
- doc/todo/faster_rsync_remotes.mdwn +1/−0
- doc/todo/windows_support/comment_9_259a0b1a6f4d8d1944173380adc5e7c8._comment +8/−0
- doc/todo/wishlist:___39__whereis__39___support_in_the_webapp.mdwn +4/−0
- doc/todo/wishlist:_annex.largefiles_support_for_mimetypes.mdwn +1/−0
- doc/todo/wishlist:_git_annex_diff.mdwn +9/−0
- doc/walkthrough/unused_data.mdwn +1/−1
- git-annex.1 +12/−0
- git-annex.cabal +10/−2
- standalone/linux/git-annex +1/−1
- standalone/linux/git-annex-shell +1/−1
- standalone/linux/git-annex-webapp +1/−1
- standalone/osx/git-annex.app/Contents/MacOS/git-annex +1/−1
- standalone/osx/git-annex.app/Contents/MacOS/git-annex-shell +1/−1
- standalone/osx/git-annex.app/Contents/MacOS/git-annex-webapp +2/−1
- templates/configurators/checkunfinished.hamlet +16/−0
- templates/configurators/pairing/local/prompt.hamlet +3/−3
- templates/repolist.hamlet +45/−34
- test too large to diff
@@ -21,6 +21,7 @@ change, commit, files,+ withIndex, ) where import qualified Data.ByteString.Lazy.Char8 as L
@@ -92,14 +92,14 @@ where go f = liftIO $ openforlock f >>= check openforlock f = catchMaybeIO $-#ifndef __WINDOWS__+#ifndef mingw32_HOST_OS openFd f ReadOnly Nothing defaultFileFlags #else return () #endif check Nothing = return is_missing check (Just h) = do-#ifndef __WINDOWS__+#ifndef mingw32_HOST_OS v <- getLock h (ReadLock, AbsoluteSeek, 0, 0) closeFd h return $ case v of@@ -116,7 +116,7 @@ - it. (If the content is not present, no locking is done.) -} lockContent :: Key -> Annex a -> Annex a lockContent key a = do-#ifdef __WINDOWS__+#ifdef mingw32_HOST_OS a #else file <- calcRepo $ gitAnnexLocation key
@@ -35,7 +35,7 @@ stageDirect = do Annex.Queue.flush top <- fromRepo Git.repoPath- (l, cleanup) <- inRepo $ Git.LsFiles.stagedDetails [top]+ (l, cleanup) <- inRepo $ Git.LsFiles.stagedOthersDetails [top] forM_ l go void $ liftIO cleanup staged <- Annex.Queue.size
@@ -34,7 +34,7 @@ checkEnvironmentIO :: IO () checkEnvironmentIO =-#ifdef __WINDOWS__+#ifdef mingw32_HOST_OS noop #else whenM (null <$> myUserGecos) $ do
@@ -87,7 +87,7 @@ bracketIO (lock lockfile mode) unlock (const a) where lock lockfile mode = do-#ifndef __WINDOWS__+#ifndef mingw32_HOST_OS l <- noUmask mode $ createFile lockfile mode waitToSetLock l (WriteLock, AbsoluteSeek, 0, 0) return l@@ -95,7 +95,7 @@ writeFile lockfile "" return lockfile #endif-#ifndef __WINDOWS__+#ifndef mingw32_HOST_OS unlock = closeFd #else unlock = removeFile
@@ -37,10 +37,10 @@ getAnnexLinkTarget :: FilePath -> Annex (Maybe LinkTarget) getAnnexLinkTarget file = ifM (coreSymlinks <$> Annex.getGitConfig) ( check readSymbolicLink $+ return Nothing+ , check readSymbolicLink $ check probefilecontent $ return Nothing- , check readSymbolicLink $- return Nothing ) where check getlinktarget fallback = do
@@ -22,7 +22,7 @@ where go (Just _) = noop -- already locked go Nothing = do-#ifndef __WINDOWS__+#ifndef mingw32_HOST_OS mode <- annexFileMode fd <- liftIO $ noUmask mode $ openFd file ReadOnly (Just mode) defaultFileFlags@@ -37,7 +37,7 @@ unlockFile file = maybe noop go =<< fromPool file where go fd = do-#ifndef __WINDOWS__+#ifndef mingw32_HOST_OS liftIO $ closeFd fd #endif changePool $ M.delete file
@@ -31,8 +31,7 @@ liftIO $ catchIO (rename tmpfile file) (fallback tmpfile) where setup tmpdir = do- (tmpfile, h) <- openTempFileWithDefaultPermissions tmpdir $- takeFileName file+ (tmpfile, h) <- openTempFileWithDefaultPermissions tmpdir "tmp" hClose h return tmpfile fallback tmpfile _ = do
@@ -98,7 +98,7 @@ liftIO (catchDefaultIO [] $ dirContents dir) forM_ sockets cleanup cleanup socketfile = do-#ifndef __WINDOWS__+#ifndef mingw32_HOST_OS -- Drop any shared lock we have, and take an -- exclusive lock, without blocking. If the lock -- succeeds, nothing is using this ssh, and it can
@@ -25,7 +25,7 @@ supportedVersions = [defaultVersion, directModeVersion] upgradableVersions :: [Version]-#ifndef __WINDOWS__+#ifndef mingw32_HOST_OS upgradableVersions = ["0", "1", "2"] #else upgradableVersions = ["2"]
binary file changed (3428 → 3428 bytes)
binary file changed (9360 → 9360 bytes)
@@ -169,9 +169,12 @@ - - Note that the key files are put in ~/.ssh/git-annex/, rather than directly - in ssh because of an **INSANE** behavior of gnome-keyring: It loads- - ~/.ssh/*.pub, and uses them indiscriminately. But using this key+ - ~/.ssh/ANYTHING.pub, and uses them indiscriminately. But using this key - for a normal login to the server will force git-annex-shell to run, - and locks the user out. Luckily, it does not recurse into subdirectories.+ -+ - Similarly, IdentitiesOnly is set in the ssh config to prevent the+ - ssh-agent from forcing use of a different key. -} setupSshKeyPair :: SshKeyPair -> SshData -> IO SshData setupSshKeyPair sshkeypair sshdata = do@@ -188,10 +191,42 @@ writeFile (sshdir </> sshpubkeyfile) (sshPubKey sshkeypair) setSshConfig sshdata- [ ("IdentityFile", "~/.ssh/" ++ sshprivkeyfile) ]+ [ ("IdentityFile", "~/.ssh/" ++ sshprivkeyfile)+ , ("IdentitiesOnly", "yes")+ ] where sshprivkeyfile = "git-annex" </> "key." ++ mangleSshHostName sshdata sshpubkeyfile = sshprivkeyfile ++ ".pub"++{- Fixes git-annex ssh key pairs configured in .ssh/config + - by old versions to set IdentitiesOnly. -}+fixSshKeyPair :: IO ()+fixSshKeyPair = do+ sshdir <- sshDir+ let configfile = sshdir </> "config"+ whenM (doesFileExist configfile) $ do+ ls <- lines <$> readFileStrict configfile+ let ls' = fixSshKeyPair' ls+ when (ls /= ls') $+ viaTmp writeFile configfile $ unlines ls'++{- Strategy: Search for IdentityFile lines in for files with key.git-annex+ - in their names. These are for git-annex ssh key pairs.+ - Add the IdentitiesOnly line immediately after them, if not already+ - present. -}+fixSshKeyPair' :: [String] -> [String]+fixSshKeyPair' = go []+ where+ go c [] = reverse c+ go c (l:[])+ | all (`isInfixOf` l) indicators = go (fixedline l:l:c) []+ | otherwise = go (l:c) []+ go c (l:next:rest)+ | all (`isInfixOf` l) indicators && not ("IdentitiesOnly" `isInfixOf` next) = + go (fixedline l:l:c) (next:rest)+ | otherwise = go (l:c) (next:rest)+ indicators = ["IdentityFile", "key.git-annex"]+ fixedline tmpl = takeWhile isSpace tmpl ++ "IdentitiesOnly yes" {- Setups up a ssh config with a mangled hostname. - Returns a modified SshData containing the mangled hostname. -}
@@ -5,7 +5,7 @@ - Licensed under the GNU GPL version 3 or higher. -} -{-# LANGUAGE CPP, BangPatterns #-}+{-# LANGUAGE CPP #-} module Assistant.Threads.Committer where @@ -75,33 +75,38 @@ debug ["delaying commit of", show (length cs), "changes"] refillChanges cs -{- Wait for one or more changes to arrive to be committed. -}+{- Wait for one or more changes to arrive to be committed, and then+ - runs an action to commit them. If more changes arrive while this is+ - going on, they're handled intelligently, batching up changes into+ - large commits where possible, doing rename detection, and+ - commiting immediately otherwise. -} waitChangeTime :: (([Change], UTCTime) -> Assistant Int) -> Assistant ()-waitChangeTime a = go [] 0+waitChangeTime a = waitchanges 0 where- go unhandled lastcommitsize = do+ waitchanges lastcommitsize = do -- Wait one one second as a simple rate limiter. liftIO $ threadDelaySeconds (Seconds 1) -- Now, wait until at least one change is available for -- processing. cs <- getChanges- let changes = unhandled ++ cs+ handlechanges cs lastcommitsize+ handlechanges changes lastcommitsize = do let len = length changes -- See if now's a good time to commit. now <- liftIO getCurrentTime case (lastcommitsize >= maxCommitSize, shouldCommit now len changes, possiblyrename changes) of (True, True, _) | len > maxCommitSize -> - go [] =<< a (changes, now)+ waitchanges =<< a (changes, now) | otherwise -> aftermaxcommit changes (_, True, False) ->- go [] =<< a (changes, now)+ waitchanges =<< a (changes, now) (_, True, True) -> do morechanges <- getrelatedchanges changes- go [] =<< a (changes ++ morechanges, now)+ waitchanges =<< a (changes ++ morechanges, now) _ -> do refill changes- go [] lastcommitsize+ waitchanges lastcommitsize {- Did we perhaps only get one of the AddChange and RmChange pair - that make up a file rename? Or some of the pairs that make up @@ -158,14 +163,17 @@ -} aftermaxcommit oldchanges = loop (30 :: Int) where- loop 0 = go oldchanges 0+ loop 0 = continue oldchanges loop n = do liftAnnex noop -- ensure Annex state is free liftIO $ threadDelaySeconds (Seconds 1) changes <- getAnyChanges if null changes then loop (n - 1)- else go (oldchanges ++ changes) 0+ else continue (oldchanges ++ changes)+ continue cs+ | null cs = waitchanges 0+ | otherwise = handlechanges cs 0 isRmChange :: Change -> Bool isRmChange (Change { changeInfo = i }) | i == RmChange = True@@ -273,10 +281,11 @@ handleAdds delayadd cs = returnWhen (null incomplete) $ do let (pending, inprocess) = partition isPendingAddChange incomplete direct <- liftAnnex isDirect- pending' <- if direct- then return pending+ (pending', cleanup) <- if direct+ then return (pending, noop) else findnew pending (postponed, toadd) <- partitionEithers <$> safeToAdd delayadd pending' inprocess+ cleanup unless (null postponed) $ refillChanges postponed@@ -294,14 +303,13 @@ where (incomplete, otherchanges) = partition (\c -> isPendingAddChange c || isInProcessAddChange c) cs - findnew [] = return []+ findnew [] = return ([], noop) findnew pending@(exemplar:_) = do- (!newfiles, cleanup) <- liftAnnex $+ (newfiles, cleanup) <- liftAnnex $ inRepo (Git.LsFiles.notInRepo False $ map changeFile pending)- void $ liftIO cleanup -- note: timestamp info is lost here let ts = changeTime exemplar- return $ map (PendingAddChange ts) newfiles+ return (map (PendingAddChange ts) newfiles, void $ liftIO $ cleanup) returnWhen c a | c = return otherchanges
@@ -13,8 +13,8 @@ import Assistant.Common import Assistant.Sync import Utility.ThreadScheduler-import Remote.List import qualified Types.Remote as Remote+import Assistant.DaemonStatus #if WITH_DBUS import Utility.DBus@@ -125,7 +125,7 @@ handleConnection :: Assistant () handleConnection = reconnectRemotes True =<< networkRemotes -{- Finds network remotes. -}+{- Network remotes to sync with. -} networkRemotes :: Assistant [Remote]-networkRemotes = liftAnnex $- filter (isNothing . Remote.localpath) <$> remoteList+networkRemotes = filter (isNothing . Remote.localpath) . syncRemotes+ <$> getDaemonStatus
@@ -268,6 +268,10 @@ liftIO $ createDirectoryIfMissing True dir isnew <- liftIO $ makeRepo dir True u <- liftIO $ initRepo isnew False dir $ Just remotename+ {- Removable drives are not reliable media, so enable fsync. -}+ liftIO $ inDir dir $+ setConfig (ConfigKey "core.fsyncobjectfiles")+ (Git.Config.boolConfig True) r <- combineRepos dir remotename liftAnnex $ setStandardGroup u TransferGroup liftAssistant $ syncRemote r
@@ -54,7 +54,7 @@ error "restart failed" $(widgetFile "control/restarting") where- restartcommand program = program ++ " assistant --stop; " +++ restartcommand program = program ++ " assistant --stop; exec " ++ program ++ " webapp" getRestartThreadR :: ThreadName -> Handler ()
@@ -13,6 +13,7 @@ import Assistant.DaemonStatus import Assistant.WebApp.Notifications import Assistant.WebApp.Utility+import Assistant.Ssh import qualified Annex import qualified Remote import qualified Types.Remote as Remote@@ -22,6 +23,8 @@ import Logs.Trust import Logs.Group import Config+import Git.Config+import Assistant.Sync import Config.Cost import qualified Git #ifdef WITH_XMPP@@ -117,6 +120,7 @@ $(widgetFile "repolist") where ident = "repolist"+ unfinished uuid = uuid == NoUUID type RepoList = [(String, UUID, Actions)] @@ -222,3 +226,30 @@ rs' = filter (\r -> Remote.uuid r /= Remote.uuid remote) rs costs = map Remote.cost rs' rs'' = (\(x, y) -> x ++ [remote] ++ y) $ splitAt (i + 1) rs'++{- Checks to see if any repositories with NoUUID have annex-ignore set.+ - That could happen if there's a problem contacting a ssh remote+ - soon after it was added. -}+getCheckUnfinishedRepositoriesR :: Handler Html+getCheckUnfinishedRepositoriesR = page "Unfinished repositories" (Just Configuration) $ do+ stalled <- liftAnnex findStalled+ $(widgetFile "configurators/checkunfinished")++findStalled :: Annex [Remote]+findStalled = filter isstalled <$> remoteListRefresh+ where+ isstalled r = Remote.uuid r == NoUUID+ && remoteAnnexIgnore (Remote.gitconfig r)++getRetryUnfinishedRepositoriesR :: Handler ()+getRetryUnfinishedRepositoriesR = do+ liftAssistant $ mapM_ unstall =<< liftAnnex findStalled+ redirect DashboardR+ where+ unstall r = do+ liftIO $ fixSshKeyPair+ liftAnnex $ setConfig + (remoteConfig (Remote.repo r) "ignore")+ (boolConfig False)+ syncRemote r+ liftAnnex $ void remoteListRefresh
@@ -32,6 +32,8 @@ /config/repository/edit/new/cloud/#UUID EditNewCloudRepositoryR GET POST /config/repository/sync/disable/#UUID DisableSyncR GET /config/repository/sync/enable/#UUID EnableSyncR GET+/config/repository/unfinished/check CheckUnfinishedRepositoriesR GET+/config/repository/unfinished/retry RetryUnfinishedRepositoriesR GET /config/repository/add/drive AddDriveR GET POST /config/repository/add/drive/confirm/#RemovableDrive ConfirmAddDriveR GET
@@ -75,9 +75,15 @@ <*> pure tag _ -> Nothing -{- A presence with a git-annex tag in it. -}+{- A presence with a git-annex tag in it.+ - Also includes a status tag, which may be visible in XMPP clients. -} gitAnnexPresence :: Element -> Presence-gitAnnexPresence = insertGitAnnexTag $ emptyPresence PresenceAvailable+gitAnnexPresence = insertGitAnnexTag $ addStatusTag $ emptyPresence PresenceAvailable+ where+ addStatusTag p = p+ { presencePayloads = status : presencePayloads p }+ status = Element "status" [] [statusMessage]+ statusMessage = NodeContent $ ContentText $ T.pack "git-annex" {- A presence with an empty git-annex tag in it, used for letting other - clients know we're around and are a git-annex client. -}
@@ -27,16 +27,18 @@ , canUpgradeKey = Nothing } -fromUrl :: String -> Maybe Integer -> Key-fromUrl url size = stubKey- { keyName = key- , keyBackendName = "URL"- , keySize = size+{- 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. -}+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)+ return $ stubKey+ { keyName = key+ , keyBackendName = "URL"+ , keySize = size }- where- {- when it's not too long, use the url as the key name- - 256 is the absolute filename max, but use a shorter- - length because this is not the entire key filename. -}- key- | length url < 128 = url- | otherwise = take 128 url ++ "-" ++ md5s (Str url)
binary file changed (7308 → 7308 bytes)
binary file changed (54624 → 54624 bytes)
binary file changed (14364 → 14364 bytes)
binary file changed (2536 → 2536 bytes)
binary file changed (9988 → 9988 bytes)
binary file changed (5236 → 5236 bytes)
binary file changed (33088 → 33088 bytes)
@@ -1,3 +1,50 @@+git-annex (4.20130802) unstable; urgency=low++ * dropunused behavior change: Now refuses to drop the last copy of a+ file, unless you use the --force.+ This was the last place in git-annex that could remove data referred+ to by the git history, without being forced.+ Like drop, dropunused checks remotes, and honors the global+ annex.numcopies setting. (However, .gitattributes settings cannot+ apply to unused files.) + * Fix inverted logic in last release's fix for data loss bug,+ that caused git-annex sync on FAT or other crippled filesystems to add+ symlink standin files to the annex.+ * importfeed can be used to import files from podcast feeds.+ * webapp: When setting up a dedicated ssh key to access the annex+ on a host, set IdentitiesOnly to prevent the ssh-agent from forcing+ use of a different ssh key. That could result in unncessary password+ prompts, or prevent git-annex-shell from being run on the remote host.+ * webapp: Improve handling of remotes whose setup has stalled.+ * Add status message to XMPP presence tag, to identify to others that+ the client is a git-annex client. Closes: #717652+ * webapp: When creating a repository on a removable drive, set+ core.fsyncobjectfiles, to help prevent data loss when the drive is yanked.+ * Always build with -threaded, to avoid a deadlock when communicating with+ gpg.+ * unused: No longer shows as unused tmp files that are actively being+ transferred.+ * assistant: Fix NetWatcher to not sync with remotes that have+ remote.<name>.annex-sync set to false.+ * assistant: Fix deadlock that could occur when adding a lot of files+ at once in indirect mode.+ * assistant: Fix bug that caused it to stall when adding a very large+ number of files at once (around 5 thousand).+ * OSX: Make git-annex-webapp run in the background, so that the app icon+ can be clicked on the open a new webapp when the assistant is already+ running.+ * Improve test suite on Windows; now tests git annex sync.+ * Fix a few bugs involving filenames that are at or near the filesystem's+ maximum filename length limit.+ * find: Avoid polluting stdout with progress messages. Closes: #718186+ * Escape ':' in file/directory names to avoid it being treated+ as a pathspec by some git commands. Closes: #718185+ * Slow and ugly work around for bug #718517 in git 1.8.4~rc0, which broke+ git-cat-file --batch for filenames containing spaces.+ (Will be reverted after next git pre-release fixes the problem.)++ -- Joey Hess <joeyh@debian.org> Fri, 02 Aug 2013 11:35:16 -0400+ git-annex (4.20130723) unstable; urgency=low * Fix data loss bug when adding an (uncompressed) tarball of a@@ -43,7 +90,7 @@ in the git annex, including old versions of files. Supported by fsck, get, move, copy. * --unused: New switch that makes git-annex operate on all data found- by the last run of git annex unused. Supported by fsck, get, move, copy.+ by the last run of git annex unused. Supported by fsck, move, copy. * get, move, copy: Can now be run in a bare repository, like fsck already could. --all is enabled automatically in this case. * merge: Now also merges synced/master or similar branches, which
@@ -30,6 +30,7 @@ import Annex.Ssh import Annex.Environment import Command+import Types.Messages type Params = [String] type Flags = [Annex ()]@@ -47,6 +48,8 @@ checkEnvironment checkfuzzy forM_ fields $ uncurry Annex.setField+ when (cmdnomessages cmd) $ + Annex.setOutput QuietOutput sequence_ flags whenM (annexDebug <$> Annex.getGitConfig) $ liftIO enableDebugOutput
@@ -9,6 +9,7 @@ command, noRepo, noCommit,+ noMessages, withOptions, next, stop,@@ -40,12 +41,17 @@ {- Generates a normal command -} command :: String -> String -> [CommandSeek] -> CommandSection -> String -> Command-command = Command [] Nothing commonChecks False+command = Command [] Nothing commonChecks False False {- Indicates that a command doesn't need to commit any changes to - the git-annex branch. -} noCommit :: Command -> Command noCommit c = c { cmdnocommit = True }++{- Indicates that a command should not output anything other than what+ - it directly sends to stdout. (--json can override this). -}+noMessages :: Command -> Command+noMessages c = c { cmdnomessages = True } {- Adds a fallback action to a command, that will be run if it's used - outside a git repository. -}
@@ -31,6 +31,7 @@ import Utility.InodeCache import Annex.FileMatcher import Annex.ReplaceFile+import Utility.Tmp def :: [Command] def = [notBareRepo $ command "add" paramPaths seek SectionCommon@@ -105,7 +106,8 @@ unlessM (isDirect) $ liftIO $ void $ tryIO $ preventWrite file liftIO $ catchMaybeIO $ do- (tmpfile, h) <- openTempFile tmp (takeFileName file)+ (tmpfile, h) <- openTempFile tmp $+ relatedTemplate $ takeFileName file hClose h nukeFile tmpfile withhardlink tmpfile `catchIO` const nohardlink
@@ -1,6 +1,6 @@ {- git-annex command -- - Copyright 2011 Joey Hess <joey@kitenet.net>+ - Copyright 2011-2013 Joey Hess <joey@kitenet.net> - - Licensed under the GNU GPL version 3 or higher. -}@@ -54,17 +54,15 @@ bad = fromMaybe (error $ "bad url " ++ s) $ parseURI $ escapeURIString isUnescapedInURI s go url = do- let file = fromMaybe (url2file url pathdepth) optfile+ pathmax <- liftIO $ fileNameLengthLimit "."+ let file = fromMaybe (url2file url pathdepth pathmax) optfile showStart "addurl" file next $ perform relaxed s file perform :: Bool -> String -> FilePath -> CommandPerform perform relaxed url file = ifAnnexed file addurl geturl where- geturl = do- liftIO $ createDirectoryIfMissing True (parentDir file)- ifM (Annex.getState Annex.fast <||> pure relaxed)- ( nodownload relaxed url file , download url file )+ geturl = next $ addUrlFile relaxed url file addurl (key, _backend) | relaxed = do setUrlPresent key url@@ -76,26 +74,39 @@ setUrlPresent key url next $ return True , do- warning $ "failed to verify url: " ++ url+ warning $ "failed to verify url exists: " ++ url stop ) -download :: String -> FilePath -> CommandPerform+addUrlFile :: Bool -> String -> FilePath -> Annex Bool+addUrlFile relaxed url file = do+ liftIO $ createDirectoryIfMissing True (parentDir file)+ ifM (Annex.getState Annex.fast <||> pure relaxed)+ ( nodownload relaxed url file+ , do+ showAction $ "downloading " ++ url ++ " "+ download url file+ )++download :: String -> FilePath -> Annex Bool download url file = do- showAction $ "downloading " ++ url ++ " " dummykey <- genkey tmp <- fromRepo $ gitAnnexTmpLocation dummykey- stopUnless (runtransfer dummykey tmp) $ do- backend <- chooseBackend file- let source = KeySource- { keyFilename = file- , contentLocation = tmp- , inodeCache = Nothing- }- k <- genKey source backend- case k of- Nothing -> stop- Just (key, _) -> next $ cleanup url file key (Just tmp)+ showOutput+ ifM (runtransfer dummykey tmp)+ ( do+ backend <- chooseBackend file+ let source = KeySource+ { keyFilename = file+ , contentLocation = tmp+ , inodeCache = Nothing+ }+ k <- genKey source backend+ case k of+ Nothing -> return False+ Just (key, _) -> cleanup url file key (Just tmp)+ , return False+ ) where {- Generate a dummy key to use for this download, before we can - examine the file and find its real key. This allows resuming@@ -112,14 +123,14 @@ liftIO $ snd <$> Url.exists url headers , return Nothing )- return $ Backend.URL.fromUrl url size+ Backend.URL.fromUrl url size runtransfer dummykey tmp = Transfer.download webUUID dummykey (Just file) Transfer.forwardRetry $ const $ do liftIO $ createDirectoryIfMissing True (parentDir tmp) downloadUrl [url] tmp -cleanup :: String -> FilePath -> Key -> Maybe FilePath -> CommandCleanup+cleanup :: String -> FilePath -> Key -> Maybe FilePath -> Annex Bool cleanup url file key mtmp = do when (isJust mtmp) $ logStatus key InfoPresent@@ -133,7 +144,7 @@ maybe noop (moveAnnex key) mtmp return True -nodownload :: Bool -> String -> FilePath -> CommandPerform+nodownload :: Bool -> String -> FilePath -> Annex Bool nodownload relaxed url file = do headers <- getHttpHeaders (exists, size) <- if relaxed@@ -141,15 +152,15 @@ else liftIO $ Url.exists url headers if exists then do- let key = Backend.URL.fromUrl url size- next $ cleanup url file key Nothing+ key <- Backend.URL.fromUrl url size+ cleanup url file key Nothing else do warning $ "unable to access url: " ++ url- stop+ return False -url2file :: URI -> Maybe Int -> FilePath-url2file url pathdepth = case pathdepth of- Nothing -> filesize $ escape fullurl+url2file :: URI -> Maybe Int -> Int -> FilePath+url2file url pathdepth pathmax = case pathdepth of+ Nothing -> truncateFilePath pathmax $ escape fullurl Just depth | depth >= length urlbits -> frombits id | depth > 0 -> frombits $ drop depth@@ -158,7 +169,6 @@ where fullurl = uriRegName auth ++ uriPath url ++ uriQuery url frombits a = intercalate "/" $ a urlbits- urlbits = map (filesize . escape) $ filter (not . null) $ split "/" fullurl+ urlbits = map (truncateFilePath pathmax . escape) $ filter (not . null) $ split "/" fullurl auth = fromMaybe (error $ "bad url " ++ show url) $ uriAuthority url- filesize = take 255 escape = replace "/" "_" . replace "?" "_"
@@ -32,9 +32,8 @@ where dropremote r = do showAction $ "from " ++ Remote.name r- ok <- Remote.removeKey r key- next $ Command.Drop.cleanupRemote key r ok- droplocal = Command.Drop.performLocal key (Just 0) Nothing -- force drop+ Command.Drop.performRemote key Nothing r+ droplocal = Command.Drop.performLocal key Nothing Nothing from = Annex.getField $ Option.name Command.Drop.fromOption performOther :: (Key -> Git.Repo -> FilePath) -> Key -> CommandPerform
@@ -20,7 +20,7 @@ import qualified Option def :: [Command]-def = [noCommit $ withOptions [formatOption, print0Option] $+def = [noCommit $ noMessages $ withOptions [formatOption, print0Option] $ command "find" paramPaths seek SectionQuery "lists available files"] formatOption :: Option
@@ -35,7 +35,7 @@ import Git.FilePath import GitAnnex.Options -#ifndef __WINDOWS__+#ifndef mingw32_HOST_OS import System.Posix.Process (getProcessID) #else import System.Random (getStdRandom, random)@@ -151,7 +151,7 @@ , checkKeyNumCopies key file numcopies ] withtmp a = do-#ifndef __WINDOWS__+#ifndef mingw32_HOST_OS v <- liftIO getProcessID #else v <- liftIO (getStdRandom random :: IO Int)@@ -458,7 +458,7 @@ parent <- parentDir <$> calcRepo (gitAnnexLocation key) liftIO $ void $ tryIO $ do touchFile parent-#ifndef __WINDOWS__+#ifndef mingw32_HOST_OS setSticky parent #endif
@@ -0,0 +1,173 @@+{- git-annex command+ -+ - Copyright 2013 Joey Hess <joey@kitenet.net>+ -+ - Licensed under the GNU GPL version 3 or higher.+ -}++module Command.ImportFeed where++import Text.Feed.Import+import Text.Feed.Query+import Text.Feed.Types+import qualified Data.Set as S+import qualified Data.Map as M+import Data.Char++import Common.Annex+import qualified Annex+import Command+import qualified Utility.Url as Url+import Logs.Web+import qualified Option+import qualified Utility.Format+import Utility.Tmp+import Command.AddUrl (addUrlFile, relaxedOption)++def :: [Command]+def = [notBareRepo $ withOptions [templateOption, relaxedOption] $+ command "importfeed" (paramRepeating paramUrl) seek+ SectionCommon "import files from podcast feeds"]++templateOption :: Option+templateOption = Option.field [] "template" paramFormat "template for filenames"++seek :: [CommandSeek]+seek = [withField templateOption return $ \tmpl ->+ withFlag relaxedOption $ \relaxed ->+ withValue (getCache tmpl) $ \cache ->+ withStrings $ start relaxed cache]++start :: Bool -> Cache -> URLString -> CommandStart+start relaxed cache url = do+ showStart "importfeed" url+ next $ perform relaxed cache url++perform :: Bool -> Cache -> URLString -> CommandPerform+perform relaxed cache url = do+ v <- findEnclosures url+ case v of+ Just l | not (null l) -> do+ mapM_ (downloadEnclosure relaxed cache) l+ next $ return True+ _ -> stop++data ToDownload = ToDownload+ { feed :: Feed+ , item :: Item+ , location :: URLString+ }++mkToDownload :: Feed -> Item -> Maybe ToDownload+mkToDownload f i = case getItemEnclosure i of+ Nothing -> Nothing+ Just (enclosureurl, _, _) -> Just $ ToDownload f i enclosureurl++data Cache = Cache+ { knownurls :: S.Set URLString+ , template :: Utility.Format.Format+ }++getCache :: Maybe String -> Annex Cache+getCache opttemplate = ifM (Annex.getState Annex.force)+ ( ret S.empty+ , do+ showSideAction "checking known urls"+ ret =<< S.fromList <$> knownUrls+ )+ where+ tmpl = Utility.Format.gen $ fromMaybe defaultTemplate opttemplate+ ret s = return $ Cache s tmpl++findEnclosures :: URLString -> Annex (Maybe [ToDownload])+findEnclosures url = go =<< downloadFeed url+ where+ go Nothing = do+ warning $ "failed to parse feed " ++ url+ return Nothing+ go (Just f) = return $ Just $+ mapMaybe (mkToDownload f) (feedItems f)++{- Feeds change, so a feed download cannot be resumed. -}+downloadFeed :: URLString -> Annex (Maybe Feed)+downloadFeed url = do+ showOutput+ liftIO $ withTmpFile "feed" $ \f h -> do+ fileEncoding h+ ifM (Url.download url [] [] f)+ ( parseFeedString <$> hGetContentsStrict h+ , return Nothing+ )++{- Avoids downloading any urls that are already known to be associated+ - with a file in the annex, unless forced. -}+downloadEnclosure :: Bool -> Cache -> ToDownload -> Annex ()+downloadEnclosure relaxed cache enclosure+ | S.member url (knownurls cache) =+ whenM forced go+ | otherwise = go+ where+ forced = Annex.getState Annex.force+ url = location enclosure+ go = do+ dest <- makeunique (1 :: Integer) $ feedFile (template cache) enclosure+ case dest of+ Nothing -> noop+ Just f -> do+ showStart "addurl" f+ ifM (addUrlFile relaxed url f)+ ( showEndOk+ , showEndFail+ )+ {- Find a unique filename to save the url to.+ - If the file exists, prefixes it with a number.+ - When forced, the file may already exist and have the same+ - url, in which case Nothing is returned as it does not need+ - to be re-downloaded. -}+ makeunique n file = ifM alreadyexists+ ( ifM forced+ ( ifAnnexed f checksameurl tryanother+ , tryanother+ )+ , return $ Just f+ )+ where+ f = if n < 2+ then file+ else+ let (d, base) = splitFileName file+ in d </> show n ++ "_" ++ base+ tryanother = makeunique (n + 1) file+ alreadyexists = liftIO $ isJust <$> catchMaybeIO (getSymbolicLinkStatus f)+ checksameurl (k, _) = ifM (elem url <$> getUrls k)+ ( return Nothing+ , tryanother+ )+ +defaultTemplate :: String+defaultTemplate = "${feedtitle}/${itemtitle}${extension}"++{- Generates a filename to use for a feed item by filling out the template.+ - The filename may not be unique. -}+feedFile :: Utility.Format.Format -> ToDownload -> FilePath+feedFile tmpl i = Utility.Format.format tmpl $ M.fromList+ [ field "feedtitle" $ getFeedTitle $ feed i+ , fieldMaybe "itemtitle" $ getItemTitle $ item i+ , fieldMaybe "feedauthor" $ getFeedAuthor $ feed i+ , fieldMaybe "itemauthor" $ getItemAuthor $ item i+ , fieldMaybe "itemsummary" $ getItemSummary $ item i+ , fieldMaybe "itemdescription" $ getItemDescription $ item i+ , fieldMaybe "itemrights" $ getItemRights $ item i+ , fieldMaybe "itemid" $ snd <$> getItemId (item i)+ , ("extension", map sanitize $ takeExtension $ location i)+ ]+ where+ field k v = + let s = map sanitize v in+ if null s then (k, "none") else (k, s)+ fieldMaybe k Nothing = (k, "none")+ fieldMaybe k (Just v) = field k v++ sanitize c+ | isSpace c || isPunctuation c || c == '/' = '_'+ | otherwise = c
@@ -59,7 +59,7 @@ setDirect False top <- fromRepo Git.repoPath- (l, clean) <- inRepo $ Git.LsFiles.stagedDetails [top]+ (l, clean) <- inRepo $ Git.LsFiles.stagedOthersDetails [top] forM_ l go void $ liftIO clean next cleanup
@@ -66,7 +66,7 @@ ) return True where-#ifdef __WINDOWS__+#ifdef mingw32_HOST_OS goFast = go #else goFast = do
@@ -23,6 +23,7 @@ import Annex.Content import Utility.FileMode import Logs.Location+import Logs.Transfer import qualified Annex import qualified Git import qualified Git.Command@@ -61,8 +62,8 @@ checkUnused :: CommandPerform checkUnused = chain 0 [ check "" unusedMsg $ findunused =<< Annex.getState Annex.fast- , check "bad" staleBadMsg $ staleKeysPrune gitAnnexBadDir- , check "tmp" staleTmpMsg $ staleKeysPrune gitAnnexTmpDir+ , check "bad" staleBadMsg $ staleKeysPrune gitAnnexBadDir False+ , check "tmp" staleTmpMsg $ staleKeysPrune gitAnnexTmpDir True ] where findunused True = do@@ -289,8 +290,8 @@ - - Also, stale keys that can be proven to have no value are deleted. -}-staleKeysPrune :: (Git.Repo -> FilePath) -> Annex [Key]-staleKeysPrune dirspec = do+staleKeysPrune :: (Git.Repo -> FilePath) -> Bool -> Annex [Key]+staleKeysPrune dirspec nottransferred = do contents <- staleKeys dirspec dups <- filterM inAnnex contents@@ -299,7 +300,12 @@ dir <- fromRepo dirspec liftIO $ forM_ dups $ \t -> removeFile $ dir </> keyFile t - return stale+ if nottransferred+ then do+ inprogress <- S.fromList . map (transferKey . fst)+ <$> getTransfers+ return $ filter (`S.notMember` inprogress) stale+ else return stale staleKeys :: (Git.Repo -> FilePath) -> Annex [Key] staleKeys dirspec = do
binary file changed (15108 → 15108 bytes)
@@ -1,6 +1,6 @@ {- git cat-file interface -- - Copyright 2011 Joey Hess <joey@kitenet.net>+ - Copyright 2011, 2013 Joey Hess <joey@kitenet.net> - - Licensed under the GNU GPL version 3 or higher. -}@@ -17,6 +17,9 @@ import System.IO import qualified Data.ByteString as S import qualified Data.ByteString.Lazy as L+import Data.Digest.Pure.SHA+import Data.Char+import System.Process (std_out, std_err) import Common import Git@@ -26,16 +29,18 @@ import Git.FilePath import qualified Utility.CoProcess as CoProcess -type CatFileHandle = CoProcess.CoProcessHandle+data CatFileHandle = CatFileHandle CoProcess.CoProcessHandle Repo catFileStart :: Repo -> IO CatFileHandle-catFileStart = CoProcess.rawMode <=< gitCoProcessStart True- [ Param "cat-file"- , Param "--batch"- ]+catFileStart repo = do+ coprocess <- CoProcess.rawMode =<< gitCoProcessStart True+ [ Param "cat-file"+ , Param "--batch"+ ] repo+ return $ CatFileHandle coprocess repo catFileStop :: CatFileHandle -> IO ()-catFileStop = CoProcess.stop+catFileStop (CatFileHandle p _) = CoProcess.stop p {- Reads a file from a specified branch. -} catFile :: CatFileHandle -> Branch -> FilePath -> IO L.ByteString@@ -49,9 +54,10 @@ {- Gets both the content of an object, and its Sha. -} catObjectDetails :: CatFileHandle -> Ref -> IO (Maybe (L.ByteString, Sha))-catObjectDetails h object = CoProcess.query h send receive+catObjectDetails (CatFileHandle hdl repo) object = CoProcess.query hdl send receive where- send to = hPutStrLn to $ show object+ query = show object+ send to = hPutStrLn to query receive from = do header <- hGetLine from case words header of@@ -64,7 +70,10 @@ | otherwise -> dne _ | header == show object ++ " missing" -> dne- | otherwise -> error $ "unknown response from git cat-file " ++ show (header, object)+ | otherwise -> + if any isSpace query+ then fallback+ else error $ "unknown response from git cat-file " ++ show (header, object) readcontent bytes from sha = do content <- S.hGet from bytes eatchar '\n' from@@ -74,3 +83,25 @@ 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 $ \null -> + createProcess p+ { std_out = CreatePipe+ , std_err = UseHandle null+ }+ fileEncoding h+ content <- L.hGetContents h+ let sha = (\s -> length s `seq` s) (showDigest $ sha1 content)+ ok <- checkSuccessProcess pid+ return $ if ok+ then Just (content, Ref sha)+ else Nothing
@@ -25,7 +25,7 @@ {-# LANGUAGE CPP #-} -#ifndef __WINDOWS__+#ifndef mingw32_HOST_OS import System.Posix.User #else import Git.FilePath@@ -146,7 +146,7 @@ fromRemoteLocation s repo = gen $ calcloc s where gen v -#ifdef __WINDOWS__+#ifdef mingw32_HOST_OS | dosstyle v = fromRemotePath (dospath v) repo #endif | scpstyle v = fromUrl $ scptourl v@@ -182,7 +182,7 @@ | "/" `isPrefixOf` d = d | "~" `isPrefixOf` d = '/':d | otherwise = "/~/" ++ d-#ifdef __WINDOWS__+#ifdef mingw32_HOST_OS -- git on Windows will write a path to .git/config with "drive:", -- which is not to be confused with a "host:" dosstyle = hasDrive@@ -208,7 +208,7 @@ return $ h </> d' expandTilde :: FilePath -> IO FilePath-#ifdef __WINDOWS__+#ifdef mingw32_HOST_OS expandTilde = return #else expandTilde = expandt True
@@ -41,7 +41,7 @@ return $ addworktree wt r where pathenv s = do-#ifndef __WINDOWS__+#ifndef mingw32_HOST_OS v <- getEnv s case v of Just d -> do
@@ -44,14 +44,14 @@ type InternalGitPath = String toInternalGitPath :: FilePath -> InternalGitPath-#ifndef __WINDOWS__+#ifndef mingw32_HOST_OS toInternalGitPath = id #else toInternalGitPath = replace "\\" "/" #endif fromInternalGitPath :: InternalGitPath -> FilePath-#ifndef __WINDOWS__+#ifndef mingw32_HOST_OS fromInternalGitPath = id #else fromInternalGitPath = replace "/" "\\"
@@ -12,6 +12,7 @@ modified, staged, stagedNotDeleted,+ stagedOthersDetails, stagedDetails, typeChanged, typeChangedStaged,@@ -69,16 +70,24 @@ prefix = [Params "diff --cached --name-only -z"] suffix = Param "--" : map File l -{- Returns details about files that are staged in the index- - (including the Sha of their staged contents),- - as well as files not yet in git. -}+{- 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)], 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)], IO Bool)-stagedDetails l repo = do+stagedDetails = stagedDetails' []++{- Gets details about staged files, including the Sha of their staged+ - contents. -}+stagedDetails' :: [CommandParam] -> [FilePath] -> Repo -> IO ([(FilePath, Maybe Sha)], IO Bool)+stagedDetails' ps l repo = do (ls, cleanup) <- pipeNullSplit params repo return (map parse ls, cleanup) where- params = [Params "ls-files --others --exclude-standard --stage -z --"] ++- map File l+ params = Params "ls-files --stage -z" : ps ++ + Param "--" : map File l parse s | null file = (s, Nothing) | otherwise = (file, extractSha $ take shaSize $ drop 7 metadata)
@@ -40,7 +40,7 @@ | CommandAction { getSubcommand :: String , getParams :: [CommandParam]- , getFiles :: [FilePath]+ , getFiles :: [CommandParam] } {- A key that can uniquely represent an action in a Map. -}@@ -92,7 +92,7 @@ , getParams = params , getFiles = newfiles }- newfiles = files ++ maybe [] getFiles (M.lookup key $ items q)+ newfiles = map File files ++ maybe [] getFiles (M.lookup key $ items q) different (CommandAction { getSubcommand = s }) = s /= subcommand different _ = True@@ -150,7 +150,7 @@ runAction repo action@(CommandAction {}) = withHandle StdinHandle createProcessSuccess p $ \h -> do fileEncoding h- hPutStr h $ intercalate "\0" $ getFiles action+ hPutStr h $ intercalate "\0" $ toCommand $ getFiles action hClose h where p = (proc "xargs" params) { env = gitEnv repo }
@@ -57,6 +57,9 @@ import qualified Command.Vicfg import qualified Command.Sync import qualified Command.AddUrl+#ifdef WITH_FEED+import qualified Command.ImportFeed+#endif import qualified Command.RmUrl import qualified Command.Import import qualified Command.Map@@ -91,6 +94,9 @@ , Command.Lock.def , Command.Sync.def , Command.AddUrl.def+#ifdef WITH_FEED+ , Command.ImportFeed.def+#endif , Command.RmUrl.def , Command.Import.def , Command.Init.def
@@ -130,7 +130,7 @@ return ok where prep tfile mode info = do-#ifndef __WINDOWS__+#ifndef mingw32_HOST_OS mfd <- catchMaybeIO $ openFd (transferLockFile tfile) ReadWrite (Just mode) defaultFileFlags { trunc = True }@@ -154,7 +154,7 @@ cleanup tfile (Just fd) = do void $ tryIO $ removeFile tfile void $ tryIO $ removeFile $ transferLockFile tfile-#ifndef __WINDOWS__+#ifndef mingw32_HOST_OS closeFd fd #endif retry oldinfo metervar run = do@@ -214,7 +214,7 @@ checkTransfer :: Transfer -> Annex (Maybe TransferInfo) checkTransfer t = do tfile <- fromRepo $ transferFile t-#ifndef __WINDOWS__+#ifndef mingw32_HOST_OS mode <- annexFileMode mfd <- liftIO $ catchMaybeIO $ openFd (transferLockFile tfile) ReadOnly (Just mode) defaultFileFlags
@@ -1,6 +1,6 @@ {- Web url logs. -- - Copyright 2011 Joey Hess <joey@kitenet.net>+ - Copyright 2011, 2013 Joey Hess <joey@kitenet.net> - - Licensed under the GNU GPL version 3 or higher. -}@@ -11,12 +11,21 @@ getUrls, setUrlPresent, setUrlMissing,+ urlLog,+ urlLogKey,+ knownUrls ) where +import qualified Data.ByteString.Lazy.Char8 as L+ import Common.Annex import Logs.Presence import Logs.Location import Types.Key+import qualified Annex.Branch+import Annex.CatFile+import qualified Git+import qualified Git.LsFiles type URLString = String @@ -24,9 +33,25 @@ webUUID :: UUID webUUID = UUID "00000000-0000-0000-0000-000000000001" +urlLogExt :: String+urlLogExt = ".log.web"+ urlLog :: Key -> FilePath-urlLog key = hashDirLower key </> keyFile key ++ ".log.web"+urlLog key = hashDirLower key </> keyFile key ++ urlLogExt +{- Converts a url log file into a key.+ - (Does not work on oldurlLogs.) -}+urlLogKey :: FilePath -> Maybe Key+urlLogKey file+ | ext == urlLogExt = fileKey base+ | otherwise = Nothing+ where+ (base, ext) = splitAt (length file - extlen) file+ extlen = length urlLogExt++isUrlLog :: FilePath -> Bool+isUrlLog file = urlLogExt `isSuffixOf` file+ {- Used to store the urls elsewhere. -} oldurlLogs :: Key -> [FilePath] oldurlLogs key = @@ -58,3 +83,21 @@ addLog (urlLog key) =<< logNow InfoMissing url whenM (null <$> getUrls key) $ logChange key webUUID InfoMissing++{- Finds all known urls. -}+knownUrls :: Annex [URLString]+knownUrls = do+ {- Ensure the git-annex branch's index file is up-to-date and+ - any journaled changes are reflected in it, since we're going+ - to query its index directly. -}+ Annex.Branch.update+ Annex.Branch.commit "update"+ Annex.Branch.withIndex $ do+ top <- fromRepo Git.repoPath+ (l, cleanup) <- inRepo $ Git.LsFiles.stagedDetails [top]+ r <- mapM (geturls . snd) $ filter (isUrlLog . fst) l+ void $ liftIO cleanup+ return $ concat r+ where+ geturls Nothing = return []+ geturls (Just logsha) = getLog . L.unpack <$> catObject logsha
@@ -211,6 +211,6 @@ # TODO should be possible to derive this from caballog. hdevtools: 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+ 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
@@ -219,7 +219,7 @@ retrieveCheap :: FilePath -> ChunkSize -> Key -> FilePath -> Annex Bool retrieveCheap _ (Just _) _ _ = return False -- no cheap retrieval for chunks-#ifndef __WINDOWS__+#ifndef mingw32_HOST_OS retrieveCheap d _ k f = liftIO $ withStoredFiles Nothing d k go where go [file] = catchBoolIO $ createSymbolicLink file f >> return True
@@ -267,7 +267,7 @@ keyUrls r key = map tourl locs where tourl l = Git.repoLocation r ++ "/" ++ l-#ifndef __WINDOWS__+#ifndef mingw32_HOST_OS locs = annexLocations key #else locs = map (replace "\\" "/") (annexLocations key)@@ -361,7 +361,7 @@ copyFromRemoteCheap :: Remote -> Key -> FilePath -> Annex Bool copyFromRemoteCheap r key file-#ifndef __WINDOWS__+#ifndef mingw32_HOST_OS | not $ Git.repoIsUrl (repo r) = guardUsable (repo r) False $ do loc <- liftIO $ gitAnnexLocation key (repo r) $ fromJust $ remoteGitConfig $ gitconfig r@@ -418,7 +418,7 @@ - filesystem. Then cp could be faster. -} rsyncOrCopyFile :: [CommandParam] -> FilePath -> FilePath -> MeterUpdate -> Annex Bool rsyncOrCopyFile rsyncparams src dest p =-#ifdef __WINDOWS__+#ifdef mingw32_HOST_OS dorsync where #else
@@ -11,7 +11,7 @@ import qualified Data.ByteString.Lazy as L import qualified Data.Map as M-#ifndef __WINDOWS__+#ifndef mingw32_HOST_OS import System.Posix.Process (getProcessID) #else import System.Random (getStdRandom, random)@@ -221,7 +221,7 @@ - up trees for rsync. -} withRsyncScratchDir :: (FilePath -> Annex Bool) -> Annex Bool withRsyncScratchDir a = do-#ifndef __WINDOWS__+#ifndef mingw32_HOST_OS v <- liftIO getProcessID #else v <- liftIO (getStdRandom random :: IO Int)
binary file changed (10440 → 10440 bytes)
@@ -582,9 +582,10 @@ @? "dropkey failed" checkunused [sha1annexedfilekey] ("after dropkey --force " ++ Types.Key.key2file annexedfilekey) - git_annex env "dropunused" ["1"] @? "dropunused failed"+ not <$> git_annex env "dropunused" ["1"] @? "dropunused failed to fail without --force"+ git_annex env "dropunused" ["--force", "1"] @? "dropunused failed" checkunused [] "after dropunused"- not <$> git_annex env "dropunused" ["10", "501"] @? "dropunused failed to fail on bogus numbers"+ not <$> git_annex env "dropunused" ["--force", "10", "501"] @? "dropunused failed to fail on bogus numbers" where checkunused expectedkeys desc = do@@ -642,14 +643,11 @@ test_sync :: TestEnv -> Test test_sync env = "git-annex sync" ~: intmpclonerepo env $ do-{- For unknown reasons, running sync in the test suite on Windows- - fails with what looks like PATH errors. sync works outside- - the test suite though. TODO -}-#ifndef __WINDOWS__ git_annex env "sync" [] @? "sync failed"-#else- noop-#endif+ {- Regression test for bug fixed in + - 7b0970b340d7faeb745c666146c7f701ec71808f, where in direct mode+ - sync committed the symlink standin file to the annex. -}+ git_annex_expectoutput env "find" ["--in", "."] [] {- Regression test for union merge bug fixed in - 0214e0fb175a608a49b812d81b4632c081f63027 -}@@ -1112,7 +1110,7 @@ let env = -- Ensure that the just-built git annex is used.- [ ("PATH", cwd ++ ":" ++ p)+ [ ("PATH", cwd ++ [searchPathSeparator] ++ p) , ("TOPDIR", cwd) -- Avoid git complaining if it cannot determine the user's -- email address, or exploding if it doesn't know the user's
@@ -39,6 +39,7 @@ , cmdnorepo :: Maybe (IO ()) -- an action to run when not in a repo , cmdcheck :: [CommandCheck] -- check stage , cmdnocommit :: Bool -- don't commit journalled state changes+ , cmdnomessages :: Bool -- don't output normal messages , cmdname :: String , cmdparamdesc :: String -- description of params for usage , cmdseek :: [CommandSeek] -- seek stage
@@ -88,6 +88,6 @@ where raw h = do fileEncoding h-#ifdef __WINDOWS__+#ifdef mingw32_HOST_OS hSetNewlineMode h noNewlineTranslation #endif
@@ -36,7 +36,7 @@ {- Create a hard link if the filesystem allows it, and fall back to copying - the file. -} createLinkOrCopy :: FilePath -> FilePath -> IO Bool-#ifndef __WINDOWS__+#ifndef mingw32_HOST_OS createLinkOrCopy src dest = go `catchIO` const fallback where go = do
@@ -12,7 +12,7 @@ import Common import Utility.LogFile -#ifndef __WINDOWS__+#ifndef mingw32_HOST_OS import System.Posix #else import System.PosixCompat@@ -26,7 +26,7 @@ - - When successful, does not return. -} daemonize :: Fd -> Maybe FilePath -> Bool -> IO () -> IO ()-#ifndef __WINDOWS__+#ifndef mingw32_HOST_OS daemonize logfd pidfile changedirectory a = do maybe noop checkalreadyrunning pidfile _ <- forkProcess child1@@ -58,7 +58,7 @@ lockPidFile :: FilePath -> IO () lockPidFile file = do createDirectoryIfMissing True (parentDir file)-#ifndef __WINDOWS__+#ifndef mingw32_HOST_OS fd <- openFd file ReadWrite (Just stdFileMode) defaultFileFlags locked <- catchMaybeIO $ setLock fd (WriteLock, AbsoluteSeek, 0, 0) fd' <- openFd newfile ReadWrite (Just stdFileMode) defaultFileFlags@@ -85,7 +85,7 @@ - - If it's running, returns its pid. -} checkDaemon :: FilePath -> IO (Maybe ProcessID)-#ifndef __WINDOWS__+#ifndef mingw32_HOST_OS checkDaemon pidfile = do v <- catchMaybeIO $ openFd pidfile ReadOnly (Just stdFileMode) defaultFileFlags@@ -110,7 +110,7 @@ {- Stops the daemon, safely. -} stopDaemon :: FilePath -> IO ()-#ifndef __WINDOWS__+#ifndef mingw32_HOST_OS stopDaemon pidfile = go =<< checkDaemon pidfile where go Nothing = noop
binary file changed (15500 → 15500 bytes)
binary file changed (8648 → 8648 bytes)
binary file changed (11664 → 11664 bytes)
@@ -13,7 +13,7 @@ import Control.Exception (bracket) import System.PosixCompat.Types-#ifndef __WINDOWS__+#ifndef mingw32_HOST_OS import System.Posix.Files #endif import Foreign (complement)@@ -76,7 +76,7 @@ {- Checks if a file mode indicates it's a symlink. -} isSymLink :: FileMode -> Bool-#ifdef __WINDOWS__+#ifdef mingw32_HOST_OS isSymLink _ = False #else isSymLink = checkMode symbolicLinkMode@@ -89,7 +89,7 @@ {- Runs an action without that pesky umask influencing it, unless the - passed FileMode is the standard one. -} noUmask :: FileMode -> IO a -> IO a-#ifndef __WINDOWS__+#ifndef mingw32_HOST_OS noUmask mode a | mode == stdFileMode = a | otherwise = bracket setup cleanup go@@ -107,7 +107,7 @@ combineModes (m:ms) = foldl unionFileModes m ms isSticky :: FileMode -> Bool-#ifdef __WINDOWS__+#ifdef mingw32_HOST_OS isSticky _ = False #else isSticky = checkMode stickyMode
@@ -1,6 +1,6 @@ {- GHC File system encoding handling. -- - Copyright 2012 Joey Hess <joey@kitenet.net>+ - Copyright 2012-2013 Joey Hess <joey@kitenet.net> - - Licensed under the GNU GPL version 3 or higher. -}@@ -10,7 +10,8 @@ withFilePath, md5FilePath, decodeW8,- encodeW8 + encodeW8,+ truncateFilePath, ) where import qualified GHC.Foreign as GHC@@ -75,3 +76,18 @@ - represent the FilePath on disk. -} decodeW8 :: FilePath -> [Word8] decodeW8 = s2w8 . _encodeFilePath++{- Truncates a FilePath to the given number of bytes (or less),+ - as represented on disk.+ -+ - Avoids returning an invalid part of a unicode byte sequence, at the+ - cost of efficiency when running on a large FilePath.+ -}+truncateFilePath :: Int -> FilePath -> FilePath+truncateFilePath n = go . reverse+ where+ go f =+ let bytes = decodeW8 f+ in if length bytes <= n+ then reverse f+ else go (drop 1 f)
binary file changed (5672 → 7068 bytes)
binary file changed (23532 → 23532 bytes)
@@ -29,7 +29,7 @@ stdParams :: [CommandParam] -> IO [String] stdParams params = do-#ifndef __WINDOWS__+#ifndef mingw32_HOST_OS -- Enable batch mode if GPG_AGENT_INFO is set, to avoid extraneous -- gpg output about password prompts. GPG_BATCH is set by the test -- suite for a similar reason.@@ -77,7 +77,7 @@ - Note that to avoid deadlock with the cleanup stage, - the reader must fully consume gpg's input before returning. -} feedRead :: [CommandParam] -> String -> (Handle -> IO ()) -> (Handle -> IO a) -> IO a-#ifndef __WINDOWS__+#ifndef mingw32_HOST_OS feedRead params passphrase feeder reader = do -- pipe the passphrase into gpg on a fd (frompipe, topipe) <- createPipe
@@ -14,7 +14,7 @@ import System.Posix.Types openLog :: FilePath -> IO Fd-#ifndef __WINDOWS__+#ifndef mingw32_HOST_OS openLog logfile = do rotateLog logfile openFd logfile WriteOnly (Just stdFileMode)@@ -50,7 +50,7 @@ maxLogs = 9 redirLog :: Fd -> IO ()-#ifndef __WINDOWS__+#ifndef mingw32_HOST_OS redirLog logfd = do mapM_ (redir logfd) [stdOutput, stdError] closeFd logfd@@ -58,7 +58,7 @@ redirLog _ = error "redirLog TODO" #endif -#ifndef __WINDOWS__+#ifndef mingw32_HOST_OS redir :: Fd -> Fd -> IO () redir newh h = do closeFd h
binary file changed (19232 → 19232 bytes)
binary file changed (8204 → 8204 bytes)
binary file changed (8808 → 8808 bytes)
@@ -16,11 +16,12 @@ import Data.Maybe import Control.Applicative -#ifdef __WINDOWS__+#ifdef mingw32_HOST_OS import Data.Char import qualified System.FilePath.Posix as Posix #else import qualified "MissingH" System.Path as MissingH+import System.Posix.Files #endif import Utility.Monad@@ -37,7 +38,7 @@ - no normalization is done. -} absNormPath :: FilePath -> FilePath -> Maybe FilePath-#ifndef __WINDOWS__+#ifndef mingw32_HOST_OS absNormPath dir path = MissingH.absNormPath dir path #else absNormPath dir path = Just $ combine dir path@@ -182,7 +183,7 @@ where indir d = check $ d </> command check f = firstM doesFileExist-#ifdef __WINDOWS__+#ifdef mingw32_HOST_OS [f, f ++ ".exe"] #else [f]@@ -202,7 +203,7 @@ {- Converts a DOS style path to a Cygwin style path. Only on Windows. - Any trailing '\' is preserved as a trailing '/' -} toCygPath :: FilePath -> FilePath-#ifndef __WINDOWS__+#ifndef mingw32_HOST_OS toCygPath = id #else toCygPath p@@ -216,4 +217,22 @@ fixtrailing s | hasTrailingPathSeparator p = Posix.addTrailingPathSeparator s | otherwise = s+#endif++{- Maximum size to use for a file in a specified directory.+ -+ - Many systems have a 255 byte limit to the name of a file, + - so that's taken as the max if the system has a larger limit, or has no+ - limit.+ -}+fileNameLengthLimit :: FilePath -> IO Int+#ifdef mingw32_HOST_OS+fileNameLengthLimit _ = return 255+#else+fileNameLengthLimit dir = do+ l <- fromIntegral <$> getPathVar dir FileNameLimit+ if l <= 0+ then return 255+ else return $ minimum [l, 255]+ where #endif
binary file changed (28996 → 31160 bytes)
@@ -25,6 +25,7 @@ withHandle, withBothHandles, withQuietOutput,+ withNullHandle, createProcess, startInteractiveProcess, stdinHandle,@@ -241,12 +242,15 @@ :: CreateProcessRunner -> CreateProcess -> IO ()-withQuietOutput creator p = withFile devnull WriteMode $ \nullh -> do+withQuietOutput creator p = withNullHandle $ \nullh -> do let p' = p { std_out = UseHandle nullh , std_err = UseHandle nullh } creator p' $ const $ return ()++withNullHandle :: (Handle -> IO a) -> IO a+withNullHandle = withFile devnull WriteMode where #ifndef mingw32_HOST_OS devnull = "/dev/null"
binary file changed (43108 → 43324 bytes)
@@ -1,6 +1,6 @@ {- safely running shell 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. -}@@ -12,6 +12,8 @@ import System.Process (env) import Data.String.Utils import Control.Applicative+import System.FilePath+import Data.Char {- A type for parameters passed to a shell command. A command can - be passed either some Params (multiple parameters can be included,@@ -24,14 +26,20 @@ {- Used to pass a list of CommandParams to a function that runs - a command and expects Strings. -} toCommand :: [CommandParam] -> [String]-toCommand = (>>= unwrap)+toCommand = concatMap unwrap where unwrap (Param s) = [s] unwrap (Params s) = filter (not . null) (split " " s)- -- Files that start with a dash are modified to avoid- -- the command interpreting them as options.- unwrap (File s@('-':_)) = ["./" ++ s]+ -- Files that start with a non-alphanumeric that is not a path+ -- separator are modified to avoid the command interpreting them as+ -- options or other special constructs.+ unwrap (File s@(h:_))+ | isAlphaNum h || h `elem` pathseps = [s]+ | otherwise = ["./" ++ s] unwrap (File s) = [s]+ -- '/' is explicitly included because it's an alternative+ -- path separator on Windows.+ pathseps = pathSeparator:"./" {- Run a system command, and returns True or False - if it succeeded or failed.
binary file changed (28164 → 29280 bytes)
@@ -13,7 +13,7 @@ import Common import Control.Concurrent-#ifndef __WINDOWS__+#ifndef mingw32_HOST_OS import System.Posix.Signals #ifndef __ANDROID__ import System.Posix.Terminal@@ -54,7 +54,7 @@ waitForTermination :: IO () waitForTermination = do lock <- newEmptyMVar-#ifndef __WINDOWS__+#ifndef mingw32_HOST_OS let check sig = void $ installHandler sig (CatchOnce $ putMVar lock ()) Nothing check softwareTermination
@@ -14,6 +14,7 @@ import Utility.Exception import System.FilePath+import Utility.FileSystemEncoding type Template = String @@ -69,3 +70,19 @@ let dir = t ++ "." ++ show n either (const $ makenewdir t $ n + 1) (const $ return dir) =<< tryIO (createDirectory dir)++{- It's not safe to use a FilePath of an existing file as the template+ - for openTempFile, because if the FilePath is really long, the tmpfile+ - will be longer, and may exceed the maximum filename length.+ -+ - This generates a template that is never too long.+ - (Well, it allocates 20 characters for use in making a unique temp file,+ - anyway, which is enough for the current implementation and any+ - likely implementation.)+ -}+relatedTemplate :: FilePath -> FilePath+relatedTemplate f+ | len > 20 = truncateFilePath (len - 20) f+ | otherwise = f+ where+ len = length f
binary file changed (12272 → 13404 bytes)
@@ -130,6 +130,9 @@ - - This does its own redirect following because Browser's is buggy for HEAD - requests.+ -+ - Unfortunately, does not handle https, so should only be used+ - when curl is not available. -} request :: URI -> Headers -> RequestMethod -> IO (Response String) request url headers requesttype = go 5 url
@@ -24,7 +24,7 @@ myHomeDir :: IO FilePath myHomeDir = myVal env homeDirectory where-#ifndef __WINDOWS__+#ifndef mingw32_HOST_OS env = ["HOME"] #else env = ["USERPROFILE", "HOME"] -- HOME is used in Cygwin@@ -34,7 +34,7 @@ myUserName :: IO String myUserName = myVal env userName where-#ifndef __WINDOWS__+#ifndef mingw32_HOST_OS env = ["USER", "LOGNAME"] #else env = ["USERNAME", "USER", "LOGNAME"]
binary file changed (absent → 16384 bytes)
@@ -1,3 +1,50 @@+git-annex (4.20130802) unstable; urgency=low++ * dropunused behavior change: Now refuses to drop the last copy of a+ file, unless you use the --force.+ This was the last place in git-annex that could remove data referred+ to by the git history, without being forced.+ Like drop, dropunused checks remotes, and honors the global+ annex.numcopies setting. (However, .gitattributes settings cannot+ apply to unused files.) + * Fix inverted logic in last release's fix for data loss bug,+ that caused git-annex sync on FAT or other crippled filesystems to add+ symlink standin files to the annex.+ * importfeed can be used to import files from podcast feeds.+ * webapp: When setting up a dedicated ssh key to access the annex+ on a host, set IdentitiesOnly to prevent the ssh-agent from forcing+ use of a different ssh key. That could result in unncessary password+ prompts, or prevent git-annex-shell from being run on the remote host.+ * webapp: Improve handling of remotes whose setup has stalled.+ * Add status message to XMPP presence tag, to identify to others that+ the client is a git-annex client. Closes: #717652+ * webapp: When creating a repository on a removable drive, set+ core.fsyncobjectfiles, to help prevent data loss when the drive is yanked.+ * Always build with -threaded, to avoid a deadlock when communicating with+ gpg.+ * unused: No longer shows as unused tmp files that are actively being+ transferred.+ * assistant: Fix NetWatcher to not sync with remotes that have+ remote.<name>.annex-sync set to false.+ * assistant: Fix deadlock that could occur when adding a lot of files+ at once in indirect mode.+ * assistant: Fix bug that caused it to stall when adding a very large+ number of files at once (around 5 thousand).+ * OSX: Make git-annex-webapp run in the background, so that the app icon+ can be clicked on the open a new webapp when the assistant is already+ running.+ * Improve test suite on Windows; now tests git annex sync.+ * Fix a few bugs involving filenames that are at or near the filesystem's+ maximum filename length limit.+ * find: Avoid polluting stdout with progress messages. Closes: #718186+ * Escape ':' in file/directory names to avoid it being treated+ as a pathspec by some git commands. Closes: #718185+ * Slow and ugly work around for bug #718517 in git 1.8.4~rc0, which broke+ git-cat-file --batch for filenames containing spaces.+ (Will be reverted after next git pre-release fixes the problem.)++ -- Joey Hess <joeyh@debian.org> Fri, 02 Aug 2013 11:35:16 -0400+ git-annex (4.20130723) unstable; urgency=low * Fix data loss bug when adding an (uncompressed) tarball of a@@ -43,7 +90,7 @@ in the git annex, including old versions of files. Supported by fsck, get, move, copy. * --unused: New switch that makes git-annex operate on all data found- by the last run of git annex unused. Supported by fsck, get, move, copy.+ by the last run of git annex unused. Supported by fsck, move, copy. * get, move, copy: Can now be run in a bare repository, like fsck already could. --all is enabled automatically in this case. * merge: Now also merges synced/master or similar branches, which
@@ -48,6 +48,7 @@ libghc-xml-types-dev, libghc-async-dev, libghc-http-dev,+ libghc-feed-dev, ikiwiki, perlmagick, git,
@@ -1,6 +1,6 @@ git-annex is now available for Android. This includes the [[git-annex assistant|/assistant]], for easy syncing between your Android-and other devices.+and other devices. You do not need to root your Android to use git-annex. [[Android installation instructions|/install/android]]
@@ -1,16 +0,0 @@-[[!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,-"""]]
@@ -1,15 +0,0 @@-[[!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)-"""]]
@@ -1,10 +0,0 @@-[[!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.-"""]]
@@ -1,8 +0,0 @@-[[!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.-"""]]
@@ -1,8 +0,0 @@-[[!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 ;)-"""]]
@@ -1,27 +0,0 @@-[[!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--"""]]
@@ -1,8 +0,0 @@-[[!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...-"""]]
@@ -1,17 +0,0 @@-[[!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/-"""]]
@@ -1,15 +0,0 @@-[[!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--"""]]
@@ -1,8 +0,0 @@-[[!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?-"""]]
@@ -1,8 +0,0 @@-[[!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.-"""]]
@@ -1,8 +0,0 @@-[[!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 :)-"""]]
@@ -1,10 +0,0 @@-[[!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)-"""]]
@@ -1,10 +0,0 @@-[[!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?-"""]]
@@ -1,12 +0,0 @@-[[!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,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.+"""]]
@@ -1,10 +0,0 @@-[[!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.-"""]]
@@ -1,14 +0,0 @@-[[!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?---"""]]
@@ -1,10 +0,0 @@-[[!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.-"""]]
@@ -1,8 +0,0 @@-[[!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]]-"""]]
@@ -1,18 +0,0 @@-[[!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.-"""]]
@@ -1,8 +0,0 @@-[[!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.-"""]]
@@ -1,8 +0,0 @@-[[!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)-"""]]
@@ -1,10 +0,0 @@-[[!comment format=mdwn- username="http://joeyh.name/"- nickname="joey"- subject="comment 9"- date="2013-05-23T18:44:46Z"- content="""-@yarikoptic you said before the error was \"Read-only file system\". Now you're saying it's \"Cross-device link\". I'm slightly confused.--I've reworked the android app to not need any hard links. Try the current autobuild: <http://downloads.kitenet.net/git-annex/autobuild/android/git-annex.apk>-"""]]
@@ -0,0 +1,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 → 20480 bytes)
@@ -12,7 +12,7 @@ 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 repogroup.png]]+[[!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
@@ -1,3 +1,13 @@+## 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.
@@ -3,7 +3,7 @@ [[!inline feeds=no template=bare pages=videos/git-annex_assistant_remote_sharing]] -You can add even more computers using the same method show here.+You can add even more computers using the same method shown here. ----
binary file changed (10986 → absent bytes)
binary file changed (18490 → 15636 bytes)
@@ -5,12 +5,13 @@ 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. This allows+* `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.+ 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 the least expensive backend, recommended for really large
@@ -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!+"""]]
@@ -51,3 +51,6 @@ 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,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]]
@@ -23,3 +23,15 @@ ### 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]]
@@ -22,3 +22,5 @@ # End of transcript or log. """]]++> [[dup|done]] of [[Internal_Server_Error:_Unknown_UUID]] --[[Joey]]
@@ -24,3 +24,8 @@ # 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,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,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]]
@@ -96,3 +96,5 @@ # End of transcript or log. """]]++[[!meta title="direct mode mappings scale badly with thousands of identical files"]]
@@ -10,3 +10,6 @@ ### 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,60 @@+### 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
@@ -27,3 +27,7 @@ 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]]
@@ -15,3 +15,5 @@ failed git-annex: indirect: 1 failed """]]++[[!tag moreinfo]]
@@ -0,0 +1,49 @@+### 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,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.
@@ -12,4 +12,5 @@ Build flags: Assistant Webapp Pairing Testsuite S3 WebDAV FsEvents XMPP DNS -+[[!meta title="xmpp fails to work with googlemail domain"]]+[[!tag design/assistant]]
@@ -74,3 +74,5 @@ # End of transcript or log. """]]++> [[done]]; see comments --[[Joey]]
@@ -35,4 +35,4 @@ [[!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). --[[Joey]]+> a git-annex that will work with this kernel (see comments). [[done]] --[[Joey]]
@@ -16,3 +16,5 @@ From commit: 70b7555eaf9ac5f88bb137985d93bed8d5a434e8 On Debian Sid++> [[done]]; duplicate bug report
@@ -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,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 @@+### 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]]
@@ -5,6 +5,8 @@ ## roadmap +kickstarter year+ * Month 1 "like dropbox": [[!traillink inotify]] [[!traillink syncing]] * Month 2 "shiny webapp": [[!traillink webapp]] [[!traillink progressbars]] * Month 3 "easy setup": [[!traillink configurators]] [[!traillink pairing]]@@ -19,8 +21,22 @@ * Month 11: [[!traillink Windows]] porting, finishing touches * Month 12: [presentation at SELF2013](http://www.southeastlinuxfest.org/), finishing touches -... Now what? :)+[sustaining git-annex development](https://campaign.joeyh.name/) year+(starts September 2013). +* Month 1 [[!traillink encrypted_git_remotes]]+* Month 2 [[!traillink disaster_recovery]]+* Month 3 user-driven features and polishing+* Month 4 improve special remote interface & git-annex enhancement contest+* Month 5 [[!traillink xmpp_security]]+* Month 6 Windows assistant and webapp+* Month 7 user-driven features and polishing+* Month 8 [[!traillink gpgkeys]] [[!traillink sshpassword]]+* Month 9 get [[Android]] out of beta+* Month 10 user-driven features and polishing+* Month 11 [[!traillink chunks]] [[!traillink deltas]]+* Month 12 user-driven features and polishing+ ## porting * [[OSX]] port is in fairly good shape, but still has some room for improvement@@ -31,7 +47,6 @@ * [[rate_limiting]] * [[partial_content]]-* [[encrypted_git_remotes]] * [[deltas]] * [[leftovers]] * [[other todo items|todo]]
@@ -6,7 +6,7 @@ * [[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 Goole Play and/or FDroid+* Get app into Google Play and/or FDroid ## TODO
@@ -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,12 @@+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!
@@ -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,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="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,53 @@+The assistant should help the user recover their repository when things go+wrong.++## 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.++This should be done on both the current repository and any local+repositories. Maybe also make git-annex-shell be able to do it remotely?++## incremental fsck++Add webapp UI to enable incremental fsck, and choose when to start and how+long to run each day.++When fsck finds a damanged file, queue a download of the file from a+remote. If no accessible remote has the file, prompt the user to eg, connect+a drive containing it.++## git-annex-shell remote fsck++Would be nice; otherwise remote fsck is too expensive (downloads+everything) to have the assistant do. (remote fsck --fast might be worth+having the assistant do)++## git fsck++Have the sanity checker run git fsck periodically (it's fairly inexpensive,+but still not too often, and should be ioniced and niced). ++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.++## 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.
@@ -0,0 +1,24 @@+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 two 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.+2. 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..++-----++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>
@@ -25,7 +25,7 @@ would allow the user time to do things with new files before they are removed from the android device. -Once way to implement that would be a new preferred content expression like+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.
@@ -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.
@@ -13,28 +13,6 @@ 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. :(-* Add an encryption layer that does not rely on trusting the XMPP server's- security (currently it's encrypted only to the server, not end-to-end).- 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. ## design goals
@@ -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.
@@ -35,7 +35,7 @@ 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 (until you dropunused them). +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.
@@ -1,5 +1,4 @@ Aggregating git-annex mentions from elsewhere on the net.. -* [[!aggregate expirecount=25 name="identica" feedurl="http://identi.ca/api/statusnet/tags/timeline/gitannex.rss" url="http://identi.ca/tag/gitannex"]]-* [[!aggregate expirecount=25 name="twitter" feedurl="http://search.twitter.com/search.atom?q=git-annex" url="http://twitter.com/"]]+* [[!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 @@+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 @@+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,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,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,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,9 @@+hi,++i have a usecase that i think many people have. a cental server which should be non-bare to be able to browse the files also via webdav.+multiple clients behind nat so only pushes via xmpp are possible.++i set everything up without xmpp, it works but if files are updated, none of the clients gets a git push of course because ssh works only unidirectional.+i couldnt figure out how to set up xmpp push and have a non-bare central repo at the same time because i have to choose between ssh and xmpp git remote on the clients to the server.++thanks!
@@ -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,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,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,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,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,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.
@@ -190,6 +190,19 @@ git annex import /media/camera/DCIM/ +* 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,
@@ -1,5 +1,15 @@ [[!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>
@@ -7,14 +7,14 @@ 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](https://downloads.kitenet.net/git-annex/android/current/)+[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. -* [download apk](https://downloads.kitenet.net/git-annex/autobuild/android/git-annex.apk) ([build logs](https://downloads.kitenet.net/git-annex/autobuild/android/))+* [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
@@ -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,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.+"""]]
@@ -37,7 +37,7 @@ <pre> brew update brew install haskell-platform git ossp-uuid md5sha1sum coreutils libgsasl gnutls libidn libgsasl pkg-config libxml2-brew link libxml2+brew link libxml2 --force cabal update mkdir $HOME/bin PATH=$HOME/bin:$PATH
@@ -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,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.+"""]]
@@ -8,6 +8,13 @@ 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
@@ -1,6 +1,11 @@ As a haskell package, git-annex can be installed using cabal. -Start by installing the [Haskell Platform](http://hackage.haskell.org/platform/).+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
@@ -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,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.+"""]]
@@ -21,6 +21,7 @@ * [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)
@@ -1,25 +0,0 @@-git-annex 4.20130601 released with [[!toggle text="these changes"]]-[[!toggleable text="""- * XMPP: Git push over xmpp made much more robust.- * XMPP: Avoid redundant and unncessary pushes. Note that this breaks- compatibility with previous versions of git-annex, which will refuse- to accept any XMPP pushes from this version.- * XMPP: Send pings and use them to detect when contact with the server- is lost.- * hook special remote: Added combined hook program support.- * Android app: Avoid using hard links to app's lib directory, which- is sometimes on a different filesystem than the data directory.- * Fix bug in parsing of parens in some preferred content expressions.- This fixes the behavior of the manual mode group.- * assistant: Work around git-cat-file's not reloading the index after files- are staged.- * Improve error handling when getting uuid of http remotes to auto-ignore,- like with ssh remotes.- * content: New command line way to view and configure a repository's- preferred content settings.- * sync: Fix double merge conflict resolution handling.- * XMPP: Fix a file descriptor leak.- * Android: Added an "Open WebApp" item to the terminal's menu.- * Android: Work around Android devices where the `am` command doesn't work.- * Can now restart certain long-running git processes if they crash, and- continue working."""]]
@@ -0,0 +1,44 @@+git-annex 4.20130802 released with [[!toggle text="these changes"]]+[[!toggleable text="""+ * dropunused behavior change: Now refuses to drop the last copy of a+ file, unless you use the --force.+ This was the last place in git-annex that could remove data referred+ to by the git history, without being forced.+ Like drop, dropunused checks remotes, and honors the global+ annex.numcopies setting. (However, .gitattributes settings cannot+ apply to unused files.)+ * Fix inverted logic in last release's fix for data loss bug,+ that caused git-annex sync on FAT or other crippled filesystems to add+ symlink standin files to the annex.+ * importfeed can be used to import files from podcast feeds.+ * webapp: When setting up a dedicated ssh key to access the annex+ on a host, set IdentitiesOnly to prevent the ssh-agent from forcing+ use of a different ssh key. That could result in unncessary password+ prompts, or prevent git-annex-shell from being run on the remote host.+ * webapp: Improve handling of remotes whose setup has stalled.+ * Add status message to XMPP presence tag, to identify to others that+ the client is a git-annex client. Closes: #[717652](http://bugs.debian.org/717652)+ * webapp: When creating a repository on a removable drive, set+ core.fsyncobjectfiles, to help prevent data loss when the drive is yanked.+ * Always build with -threaded, to avoid a deadlock when communicating with+ gpg.+ * unused: No longer shows as unused tmp files that are actively being+ transferred.+ * assistant: Fix NetWatcher to not sync with remotes that have+ remote.<name>.annex-sync set to false.+ * assistant: Fix deadlock that could occur when adding a lot of files+ at once in indirect mode.+ * assistant: Fix bug that caused it to stall when adding a very large+ number of files at once (around 5 thousand).+ * OSX: Make git-annex-webapp run in the background, so that the app icon+ can be clicked on the open a new webapp when the assistant is already+ running.+ * Improve test suite on Windows; now tests git annex sync.+ * Fix a few bugs involving filenames that are at or near the filesystem's+ maximum filename length limit.+ * find: Avoid polluting stdout with progress messages. Closes: #[718186](http://bugs.debian.org/718186)+ * Escape ':' in file/directory names to avoid it being treated+ as a pathspec by some git commands. Closes: #[718185](http://bugs.debian.org/718185)+ * Slow and ugly work around for bug #718517 in git 1.8.4~rc0, which broke+ git-cat-file --batch for filenames containing spaces.+ (Will be reverted after next git pre-release fixes the problem.)"""]]
@@ -97,6 +97,7 @@ 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
@@ -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,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,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,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,130 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawnaH44G3QbxBAYyDwy0PbvL0ls60XoaR3Y"+ nickname="Nigel"+ subject="re: git annex get failed -- debug"+ date="2013-08-02T15:28:41Z"+ content="""+With debug turned on.++[[!format bash \"\"\"++initremote flickr (encryption setup) (shared cipher) ok+(Recording state in git...)+describe flickr ok+(Recording state in git...)+/home/nrb/repos/annex/laptop-annex+fsck walkthrough.sh (checksum...) ok+fsck walkthrough.sh~ (checksum...) ok+/home/nrb/repos/annex/laptop-annex+copy walkthrough.sh (gpg) (checking flickr...) 16:18:52 [flickrannex-0.1.5] <module> : 'START'+16:18:52 [flickrannex-0.1.5] main : 'ARGS: 'ANNEX_ACTION=checkpresent ANNEX_KEY=GPGHMACSHA1--280dd2d5003ad3962b1ecaa52ba45fdd44381fd0 ANNEX_HASH_1=kQ ANNEX_HASH_2=0P /home/nrb/repos/gits/flickrannex/flickrannex.py --dbglevel 1 --stderr''+16:18:52 [flickrannex-0.1.5] readFile : ''/home/nrb/repos/gits/flickrannex/flickrannex.conf' - 'r''+16:18:52 [flickrannex-0.1.5] readFile : 'Done'+16:18:52 [flickrannex-0.1.5] login : 'nrbray@yahoo.com'+16:18:54 [flickrannex-0.1.5] login : 'Done: '72157633920418017-5c0274bd421d7bb1' - None - '8086216@N08''+16:18:54 [flickrannex-0.1.5] main : 'Trying page: 1'+16:18:55 [flickrannex-0.1.5] main : 'Error. found nothing:{'pages': '1', 'cancreate': '1', 'total': '0', 'page': '1', 'perpage': '0'}'+16:18:55 [flickrannex-0.1.5] checkFile : 'GPGHMACSHA1--280dd2d5003ad3962b1ecaa52ba45fdd44381fd0 - u'gitannex' - '8086216@N08''+16:18:55 [flickrannex-0.1.5] checkFile : 'No set exists, thus no files exists'+16:18:55 [flickrannex-0.1.5] <module> : 'STOP: 2s'+(to flickr...) +16:18:55 [flickrannex-0.1.5] <module> : 'START'+16:18:55 [flickrannex-0.1.5] main : 'ARGS: 'ANNEX_ACTION=store ANNEX_KEY=GPGHMACSHA1--280dd2d5003ad3962b1ecaa52ba45fdd44381fd0 ANNEX_HASH_1=kQ ANNEX_HASH_2=0P ANNEX_FILE=/home/nrb/repos/annex/laptop-annex/.git/annex/tmp/GPGHMACSHA1--280dd2d5003ad3962b1ecaa52ba45fdd44381fd0 /home/nrb/repos/gits/flickrannex/flickrannex.py --dbglevel 1 --stderr''+16:18:55 [flickrannex-0.1.5] readFile : ''/home/nrb/repos/gits/flickrannex/flickrannex.conf' - 'r''+16:18:55 [flickrannex-0.1.5] readFile : 'Done'+16:18:55 [flickrannex-0.1.5] login : 'nrbray@yahoo.com'+16:18:57 [flickrannex-0.1.5] login : 'Done: '72157633920418017-5c0274bd421d7bb1' - None - '8086216@N08''+16:18:58 [flickrannex-0.1.5] main : 'Trying page: 1'+16:18:58 [flickrannex-0.1.5] main : 'Error. found nothing:{'pages': '1', 'cancreate': '1', 'total': '0', 'page': '1', 'perpage': '0'}'+16:18:58 [flickrannex-0.1.5] postFile : '/home/nrb/repos/annex/laptop-annex/.git/annex/tmp/GPGHMACSHA1--280dd2d5003ad3962b1ecaa52ba45fdd44381fd0 to u'gitannex' - GPGHMACSHA1--280dd2d5003ad3962b1ecaa52ba45fdd44381fd0'+16:18:58 [flickrannex-0.1.5] postFile : 'pre /home/nrb/repos/annex/laptop-annex/.git/annex/tmp/GPGHMACSHA1--280dd2d5003ad3962b1ecaa52ba45fdd44381fd0 size: 1047 more than 40234050.'+16:18:58 [flickrannex-0.1.5] readFile : ''/home/nrb/repos/annex/laptop-annex/.git/annex/tmp/GPGHMACSHA1--280dd2d5003ad3962b1ecaa52ba45fdd44381fd0' - 'rb''+16:18:58 [flickrannex-0.1.5] readFile : 'Done'+16:18:58 [flickrannex-0.1.5] postFile : 'Uploading: /home/nrb/repos/gits/flickrannex/temp/encoded-GPGHMACSHA1--280dd2d5003ad3962b1ecaa52ba45fdd44381fd0'+/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:+16:19:01 [flickrannex-0.1.5] postFile : 'Done: <Element 'rsp' at 0x8726b0c>'+16:19:01 [flickrannex-0.1.5] <module> : 'STOP: 5s'+ok+copy walkthrough.sh~ (checking flickr...) 16:19:01 [flickrannex-0.1.5] <module> : 'START'+16:19:01 [flickrannex-0.1.5] main : 'ARGS: 'ANNEX_ACTION=checkpresent ANNEX_KEY=GPGHMACSHA1--131f95d3bc932d23ef6af47cf49db3c04be4f0f9 ANNEX_HASH_1=m5 ANNEX_HASH_2=kz /home/nrb/repos/gits/flickrannex/flickrannex.py --dbglevel 1 --stderr''+16:19:01 [flickrannex-0.1.5] readFile : ''/home/nrb/repos/gits/flickrannex/flickrannex.conf' - 'r''+16:19:01 [flickrannex-0.1.5] readFile : 'Done'+16:19:01 [flickrannex-0.1.5] login : 'nrbray@yahoo.com'+16:19:03 [flickrannex-0.1.5] login : 'Done: '72157633920418017-5c0274bd421d7bb1' - None - '8086216@N08''+16:19:03 [flickrannex-0.1.5] main : 'Photoset gitannex found: <Element 'photoset' at 0x98264ec>'+16:19:03 [flickrannex-0.1.5] main : 'Trying page: 1'+16:19:03 [flickrannex-0.1.5] checkFile : 'GPGHMACSHA1--131f95d3bc932d23ef6af47cf49db3c04be4f0f9 - 72157634897264995L - '8086216@N08''+16:19:03 [flickrannex-0.1.5] checkFile : 'No set exists, thus no files exists'+16:19:03 [flickrannex-0.1.5] <module> : 'STOP: 1s'+(to flickr...) +16:19:03 [flickrannex-0.1.5] <module> : 'START'+16:19:03 [flickrannex-0.1.5] main : 'ARGS: 'ANNEX_ACTION=store ANNEX_KEY=GPGHMACSHA1--131f95d3bc932d23ef6af47cf49db3c04be4f0f9 ANNEX_HASH_1=m5 ANNEX_HASH_2=kz ANNEX_FILE=/home/nrb/repos/annex/laptop-annex/.git/annex/tmp/GPGHMACSHA1--131f95d3bc932d23ef6af47cf49db3c04be4f0f9 /home/nrb/repos/gits/flickrannex/flickrannex.py --dbglevel 1 --stderr''+16:19:03 [flickrannex-0.1.5] readFile : ''/home/nrb/repos/gits/flickrannex/flickrannex.conf' - 'r''+16:19:03 [flickrannex-0.1.5] readFile : 'Done'+16:19:03 [flickrannex-0.1.5] login : 'nrbray@yahoo.com'+16:19:05 [flickrannex-0.1.5] login : 'Done: '72157633920418017-5c0274bd421d7bb1' - None - '8086216@N08''+16:19:05 [flickrannex-0.1.5] main : 'Photoset gitannex found: <Element 'photoset' at 0x913a54c>'+16:19:05 [flickrannex-0.1.5] main : 'Trying page: 1'+16:19:05 [flickrannex-0.1.5] postFile : '/home/nrb/repos/annex/laptop-annex/.git/annex/tmp/GPGHMACSHA1--131f95d3bc932d23ef6af47cf49db3c04be4f0f9 to 72157634897264995L - GPGHMACSHA1--131f95d3bc932d23ef6af47cf49db3c04be4f0f9'+16:19:05 [flickrannex-0.1.5] postFile : 'pre /home/nrb/repos/annex/laptop-annex/.git/annex/tmp/GPGHMACSHA1--131f95d3bc932d23ef6af47cf49db3c04be4f0f9 size: 1044 more than 40234050.'+16:19:05 [flickrannex-0.1.5] readFile : ''/home/nrb/repos/annex/laptop-annex/.git/annex/tmp/GPGHMACSHA1--131f95d3bc932d23ef6af47cf49db3c04be4f0f9' - 'rb''+16:19:05 [flickrannex-0.1.5] readFile : 'Done'+16:19:05 [flickrannex-0.1.5] postFile : 'Uploading: /home/nrb/repos/gits/flickrannex/temp/encoded-GPGHMACSHA1--131f95d3bc932d23ef6af47cf49db3c04be4f0f9'+/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:+16:19:08 [flickrannex-0.1.5] postFile : 'Done: <Element 'rsp' at 0x913f0cc>'+16:19:08 [flickrannex-0.1.5] <module> : 'STOP: 4s'+ok+(Recording state in git...)+nrb@nrb-ThinkPad-T61:~/repos/annex/laptop-annex$ git annex whereis+whereis walkthrough.sh (3 copies) + 86491ded-899c-425d-9470-bf446cb06db1 -- flickr (the flickr library)+ 8e766014-7154-4f4f-a04b-9d1b3d333db1 -- here (my laptop)+ eed7055b-743b-4ab6-a390-29cfd326005d -- usbdrive (portable USB drive)+ok+whereis walkthrough.sh~ (3 copies) + 86491ded-899c-425d-9470-bf446cb06db1 -- flickr (the flickr library)+ 8e766014-7154-4f4f-a04b-9d1b3d333db1 -- here (my laptop)+ eed7055b-743b-4ab6-a390-29cfd326005d -- usbdrive (portable USB drive)+ok+nrb@nrb-ThinkPad-T61:~/repos/annex/laptop-annex$ git annex fsck --from flickr+fsck walkthrough.sh (gpg) (checking flickr...) 16:22:57 [flickrannex-0.1.5] <module> : 'START'+16:22:57 [flickrannex-0.1.5] main : 'ARGS: 'ANNEX_ACTION=checkpresent ANNEX_KEY=GPGHMACSHA1--280dd2d5003ad3962b1ecaa52ba45fdd44381fd0 ANNEX_HASH_1=kQ ANNEX_HASH_2=0P /home/nrb/repos/gits/flickrannex/flickrannex.py --dbglevel 1 --stderr''+16:22:57 [flickrannex-0.1.5] readFile : ''/home/nrb/repos/gits/flickrannex/flickrannex.conf' - 'r''+16:22:57 [flickrannex-0.1.5] readFile : 'Done'+16:22:57 [flickrannex-0.1.5] login : 'nrbray@yahoo.com'+16:22:58 [flickrannex-0.1.5] login : 'Done: '72157633920418017-5c0274bd421d7bb1' - None - '8086216@N08''+16:22:59 [flickrannex-0.1.5] main : 'Photoset gitannex found: <Element 'photoset' at 0x896d92c>'+16:22:59 [flickrannex-0.1.5] main : 'Trying page: 1'+16:22:59 [flickrannex-0.1.5] checkFile : 'GPGHMACSHA1--280dd2d5003ad3962b1ecaa52ba45fdd44381fd0 - 72157634897264995L - '8086216@N08''+16:22:59 [flickrannex-0.1.5] checkFile : 'No set exists, thus no files exists'+16:22:59 [flickrannex-0.1.5] <module> : 'STOP: 2s'+(fixing location log) + ** Based on the location log, walkthrough.sh+ ** was expected to be present, but its content is missing.+failed+fsck walkthrough.sh~ (checking flickr...) 16:22:59 [flickrannex-0.1.5] <module> : 'START'+16:22:59 [flickrannex-0.1.5] main : 'ARGS: 'ANNEX_ACTION=checkpresent ANNEX_KEY=GPGHMACSHA1--131f95d3bc932d23ef6af47cf49db3c04be4f0f9 ANNEX_HASH_1=m5 ANNEX_HASH_2=kz /home/nrb/repos/gits/flickrannex/flickrannex.py --dbglevel 1 --stderr''+16:22:59 [flickrannex-0.1.5] readFile : ''/home/nrb/repos/gits/flickrannex/flickrannex.conf' - 'r''+16:22:59 [flickrannex-0.1.5] readFile : 'Done'+16:22:59 [flickrannex-0.1.5] login : 'nrbray@yahoo.com'+16:23:01 [flickrannex-0.1.5] login : 'Done: '72157633920418017-5c0274bd421d7bb1' - None - '8086216@N08''+16:23:01 [flickrannex-0.1.5] main : 'Photoset gitannex found: <Element 'photoset' at 0x869992c>'+16:23:01 [flickrannex-0.1.5] main : 'Trying page: 1'+16:23:01 [flickrannex-0.1.5] checkFile : 'GPGHMACSHA1--131f95d3bc932d23ef6af47cf49db3c04be4f0f9 - 72157634897264995L - '8086216@N08''+16:23:01 [flickrannex-0.1.5] checkFile : 'No set exists, thus no files exists'+16:23:01 [flickrannex-0.1.5] <module> : 'STOP: 1s'+(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++\"\"\" ]]+"""]]
@@ -0,0 +1,1 @@+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).
@@ -0,0 +1,1 @@+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.
@@ -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,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,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,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! :)
@@ -19,7 +19,7 @@ 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:+data anymore, you can easily remove it from your local repository. # git annex dropunused 1 dropunused 1 ok
@@ -173,6 +173,18 @@ .IP git annex import /media/camera/DCIM/ .IP+.IP "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.)+.IP+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)+.IP+The \-\-relaxed and \-\-fast options behave the same as they do in addurl.+.IP .IP "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
@@ -1,5 +1,5 @@ Name: git-annex-Version: 4.20130723+Version: 4.20130802 Cabal-Version: >= 1.8 License: GPL-3 Maintainer: Joey Hess <joey@kitenet.net>@@ -65,6 +65,9 @@ Flag TDFA Description: Use regex-tdfa for wildcards +Flag Feed+ Description: Enable podcast feed support+ Executable git-annex Main-Is: git-annex.hs Build-Depends: MissingH, hslogger, directory, filepath,@@ -82,6 +85,8 @@ GHC-Options: -Wall CPP-Options: -DWITH_CLIBS Extensions: PackageImports+ -- Some things don't work with the non-threaded RTS.+ GHC-Options: -threaded if flag(Production) GHC-Options: -O2@@ -139,7 +144,6 @@ blaze-builder, crypto-api, hamlet, clientsession, aeson, template-haskell, data-default CPP-Options: -DWITH_WEBAPP- GHC-Options: -threaded if flag(Pairing) Build-Depends: network-multicast, network-info@@ -152,6 +156,10 @@ if flag(DNS) Build-Depends: dns CPP-Options: -DWITH_DNS++ if flag(Feed)+ Build-Depends: feed+ CPP-Options: -DWITH_FEED source-repository head type: git
@@ -22,4 +22,4 @@ export GIT_ANNEX_APP_BASE fi -"$base/runshell" git-annex "$@"+exec "$base/runshell" git-annex "$@"
@@ -22,4 +22,4 @@ export GIT_ANNEX_APP_BASE fi -"$base/runshell" git-annex-shell "$@"+exec "$base/runshell" git-annex-shell "$@"
@@ -22,4 +22,4 @@ export GIT_ANNEX_APP_BASE fi -"$base/runshell" git-annex webapp "$@"+exec "$base/runshell" git-annex webapp "$@"
@@ -22,4 +22,4 @@ export GIT_ANNEX_APP_BASE fi -"$base/runshell" git-annex "$@"+exec "$base/runshell" git-annex "$@"
@@ -22,4 +22,4 @@ export GIT_ANNEX_APP_BASE fi -"$base/runshell" git-annex-shell "$@"+exec "$base/runshell" git-annex-shell "$@"
@@ -22,4 +22,5 @@ export GIT_ANNEX_APP_BASE fi -"$base/runshell" git-annex webapp "$@"+# OSX wants this to run in the background.+exec "$base/runshell" git-annex webapp "$@" &
@@ -0,0 +1,16 @@+<div .span9 .hero-unit>+ $if null stalled+ <h2>+ The repository is still not finished being set up. Patience..+ <p>+ If you suspect something is wrong, you might want to take a look #+ at the + <a href="@{LogR}">+ Log+ $else+ <h2>+ Setting up this repository seems to have stalled!+ <p>+ Make sure the remote system is available and+ <a .btn .btn-primary href="@{RetryUnfinishedRepositoriesR}">+ Retry
@@ -11,9 +11,9 @@ repositories into one, allowing you to share files. <p> $if start- For security, enter a secret phrase. This same secret phrase will #- also need to be entered on the computer you're pairing with. #- It will be used to verify you're pairing with the right computer.+ For security, enter a secret phrase. To verify that you're pairing #+ with the right computer, its git-annex webapp will then prompt for the #+ same secret phrase. That's all this secret phrase will be used for. $else $if sameusername For security, you need to enter the same secret phrase that was #
@@ -12,41 +12,52 @@ <table .table .table-condensed> <tbody #costsortable> $forall (name, uuid, actions) <- repolist- <tr .repoline ##{fromUUID uuid}>- <td .handle>- <a .btn .btn-mini .disabled>- <i .icon-resize-vertical></i>- #{name}- <td .draghide>- $if needsEnabled actions- <a href="@{setupRepoLink actions}">- <i .icon-warning-sign></i> not enabled- $else- $if notWanted actions- <i .icon-trash></i> cleaning out..+ $if unfinished uuid+ <tr .repoline>+ <td>+ <a .btn .btn-mini .disabled>+ <i .icon-time></i>+ unfinished repository+ <td>+ <a href="@{CheckUnfinishedRepositoriesR}">+ <i .icon-question-sign></i> check status+ <td>+ $else+ <tr .repoline ##{fromUUID uuid}>+ <td .handle>+ <a .btn .btn-mini .disabled>+ <i .icon-resize-vertical></i>+ #{name}+ <td .draghide>+ $if needsEnabled actions+ <a href="@{setupRepoLink actions}">+ <i .icon-warning-sign></i> not enabled $else- <a href="@{syncToggleLink actions}">- $if notSyncing actions- <i .icon-ban-circle></i> syncing disabled- $else- <i .icon-refresh></i> syncing enabled- <td .draghide>- $if needsEnabled actions- <a href="@{setupRepoLink actions}">- enable- $else- <span .dropdown #menu-#{fromUUID uuid}>- <a .dropdown-toggle data-toggle="dropdown" href="#menu-#{fromUUID uuid}">- <i .icon-cog></i> settings- <b .caret></b>- <ul .dropdown-menu>- <li>- <a href="@{setupRepoLink actions}">- <i .icon-pencil></i> Edit- <a href="@{DisableRepositoryR uuid}">- <i .icon-minus></i> Disable- <a href="@{DeleteRepositoryR uuid}">- <i .icon-trash></i> Delete+ $if notWanted actions+ <i .icon-trash></i> cleaning out..+ $else+ <a href="@{syncToggleLink actions}">+ $if notSyncing actions+ <i .icon-ban-circle></i> syncing disabled+ $else+ <i .icon-refresh></i> syncing enabled+ <td .draghide>+ $if needsEnabled actions+ <a href="@{setupRepoLink actions}">+ enable+ $else+ <span .dropdown #menu-#{fromUUID uuid}>+ <a .dropdown-toggle data-toggle="dropdown" href="#menu-#{fromUUID uuid}">+ <i .icon-cog></i> settings+ <b .caret></b>+ <ul .dropdown-menu>+ <li>+ <a href="@{setupRepoLink actions}">+ <i .icon-pencil></i> Edit+ <a href="@{DisableRepositoryR uuid}">+ <i .icon-minus></i> Disable+ <a href="@{DeleteRepositoryR uuid}">+ <i .icon-trash></i> Delete $if addmore <tr> <td colspan="3">
file too large to diff