summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Joey Hess <joey@kitenet.net>2014-05-02 15:32:49 -0300
committerGravatar Joey Hess <joey@kitenet.net>2014-05-02 15:32:49 -0300
commitcff2db0f2424dd47a60ce21c0ca42017bb1b709d (patch)
treeb8de4e471e4f77f235a2d4b4fc52b6620c59be4d
parentf11dd1f77292d6a5eee3da9415a99e75c5da4e78 (diff)
parent10a3d627dcb23035bc68c9912e927288be493d8e (diff)
Merge branch 'master' into bootstrap3
Conflicts: debian/changelog
-rw-r--r--Annex/Ssh.hs15
-rw-r--r--Assistant/CredPairCache.hs53
-rw-r--r--Assistant/Monad.hs3
-rw-r--r--Assistant/Threads/MountWatcher.hs4
-rw-r--r--Assistant/Threads/NetWatcher.hs20
-rw-r--r--Assistant/Threads/SanityChecker.hs56
-rw-r--r--Assistant/Threads/Upgrader.hs18
-rw-r--r--Assistant/Types/CredPairCache.hs18
-rw-r--r--Build/Configure.hs5
-rw-r--r--CmdLine/GitAnnex.hs10
-rw-r--r--Makefile2
-rw-r--r--Remote.hs5
-rw-r--r--Types/Creds.hs4
-rw-r--r--Utility/CoProcess.hs2
-rw-r--r--Utility/DBus.hs3
-rw-r--r--Utility/Daemon.hs2
-rw-r--r--Utility/DataUnits.hs2
-rw-r--r--Utility/Directory.hs2
-rw-r--r--Utility/Exception.hs2
-rw-r--r--Utility/Gpg.hs4
-rw-r--r--Utility/HumanNumber.hs2
-rw-r--r--Utility/HumanTime.hs2
-rw-r--r--Utility/LinuxMkLibs.hs2
-rw-r--r--Utility/Lsof.hs4
-rw-r--r--Utility/Matcher.hs8
-rw-r--r--debian/changelog4
-rw-r--r--doc/assistant/comment_3_9bd3b532a5c026a1d664c898f8e335e6._comment8
-rw-r--r--doc/assistant/comment_4_c546a24459ca29025f00e424353c40d2._comment8
-rw-r--r--doc/bugs/Assistant_having_a_child_git_cat-file_--batch_do_the_same_thing_over_and_over_and_using_a_lot_of_memory/comment_10_edb2428552cf98bfb1735c2d6daf2b20._comment8
-rw-r--r--doc/bugs/annex_get_fails:___34__No_such_file_or_directory__34__/comment_1_e44ae9c19796efc8eda5432d3bf1e5a3._comment18
-rw-r--r--doc/bugs/bug_system_updates_when___34__done__34__.mdwn19
-rw-r--r--doc/bugs/git-annex_annex_repo_not_found.mdwn23
-rw-r--r--doc/bugs/git-annex_auto_upgrade_is_redundant.mdwn26
-rw-r--r--doc/bugs/git-annex_auto_upgrade_is_redundant/comment_1_67cdbedc70695d1e4be81e59ab9b87bd._comment9
-rw-r--r--doc/bugs/git-annex_auto_upgrade_is_redundant/comment_2_3a8041ce622b9288261fab57ecb87c28._comment8
-rw-r--r--doc/bugs/git-annex_auto_upgrade_is_redundant/comment_3_2597b2008557b80f4b71630c5c4a4241._comment8
-rw-r--r--doc/bugs/git-annex_auto_upgrade_is_redundant/comment_4_5dc46103994f064f5b9e120a16317dbd._comment10
-rw-r--r--doc/bugs/git-annex_auto_upgrade_is_redundant/comment_5_e26cf6fa6358c8d53c0b16206d0d0ca6._comment14
-rw-r--r--doc/bugs/git-annex_auto_upgrade_is_redundant/comment_6_c2c7c071fc5b1d3a55254d01a287c9f8._comment8
-rw-r--r--doc/bugs/git-annex_fails_to_initialize_under_Windows/comment_6_66cfbb5ce75d322f68b4c41f11bb15ae._comment59
-rw-r--r--doc/bugs/git-annex_fails_to_initialize_under_Windows/comment_7_9195b2373b0c5298ebbe309414d26ee4._comment10
-rw-r--r--doc/bugs/git-annex_fails_to_initialize_under_Windows_with_cygwin.mdwn38
-rw-r--r--doc/bugs/git-annex_fails_to_initialize_under_Windows_with_cygwin/comment_1_24d626923403b097f57bc3d3a8c5befa._comment10
-rw-r--r--doc/bugs/git-annex_fails_to_initialize_under_Windows_with_cygwin/comment_2_32a74f078f45ee069a7d386734e379e2._comment8
-rw-r--r--doc/bugs/git-annex_group_remote_allows_bad_settings_with_standard_groups.mdwn23
-rw-r--r--doc/bugs/git-annex_remotedeamon.mdwn27
-rw-r--r--doc/bugs/git-annex_remotedeamon/comment_1_bf8aa639ddc7f51ed7b2b83e31694e85._comment12
-rw-r--r--doc/bugs/git-annex_remotedeamon/comment_2_82f71852df61d12333d08ba25af9d7be._comment10
-rw-r--r--doc/bugs/git_annex_costs_not_working_as_expected_in_the_assistant.mdwn136
-rw-r--r--doc/bugs/git_annex_costs_not_working_as_expected_in_the_assistant/comment_1_ab82b880bd75a206e0717146e1b79aba._comment8
-rw-r--r--doc/bugs/git_annex_costs_not_working_as_expected_in_the_assistant/comment_2_460e78ea8603bd87203d8014bcc3eb9a._comment55
-rw-r--r--doc/bugs/git_annex_enableremote_gcrypt_failure_leaves_a_remote.mdwn31
-rw-r--r--doc/bugs/git_annex_info_listings_can_be_confusing.mdwn33
-rw-r--r--doc/bugs/git_annex_sync___40__sync_content_without_--content_flag__41__.mdwn23
-rw-r--r--doc/bugs/git_annex_sync___40__sync_content_without_--content_flag__41__/comment_1_a797542acb1f0c51dd4c75e4566558f0._comment10
-rw-r--r--doc/bugs/mac_os_x_10.7_DMG_out_of_date.mdwn16
-rw-r--r--doc/bugs/no_git-annex_cli_for_performing_upgrades_or_setting_upgrade_options.mdwn19
-rw-r--r--doc/bugs/no_git-annex_shell_on_Windows.mdwn28
-rw-r--r--doc/bugs/remote_gcrypt_based_repos_and_conflicting_uuids.mdwn23
-rw-r--r--doc/bugs/remote_gcrypt_based_repos_and_conflicting_uuids/comment_1_11af589cf646cb7552eeb5c7401934f5._comment8
-rw-r--r--doc/bugs/remote_gcrypt_based_repos_and_conflicting_uuids/comment_2_d81cb9b47dea34b639dc250bb231010a._comment16
-rw-r--r--doc/bugs/remote_gcrypt_based_repos_and_conflicting_uuids/comment_3_8df00f0ed4a26f702e0935b366521530._comment164
-rw-r--r--doc/bugs/ssh-askpass_locks_me_out_of_x_console.mdwn25
-rw-r--r--doc/bugs/ssh-askpass_locks_me_out_of_x_console/comment_1_1def05a57e25b6765b881f22bc6d82a2._comment10
-rw-r--r--doc/bugs/ssh-askpass_locks_me_out_of_x_console/comment_2_cd4869faf350c81deb1de6fa25f32876._comment10
-rw-r--r--doc/bugs/ssh_remote_sync_only_metadata___40__git-annex-shell_not_found__41__.mdwn45
-rw-r--r--doc/bugs/ssh_remote_sync_only_metadata___40__git-annex-shell_not_found__41__/comment_1_6203563196a70b8356102a48927e4ccd._comment44
-rw-r--r--doc/bugs/ssh_remote_sync_only_metadata___40__git-annex-shell_not_found__41__/comment_2_cee9428c651e6574f93effed31d83fb9._comment10
-rw-r--r--doc/bugs/ssh_remote_sync_only_metadata___40__git-annex-shell_not_found__41__/comment_3_9d8f9346b8c931815fa4967835b67560._comment21
-rw-r--r--doc/design/assistant/sshpassword.mdwn37
-rw-r--r--doc/design/assistant/sshpassword/comment_1_24399abe0a0c1de271490ee15e064760._comment8
-rw-r--r--doc/design/assistant/syncing/efficiency.mdwn21
-rw-r--r--doc/design/assistant/syncing/simroutes.hs250
-rw-r--r--doc/design/metadata/comment_6_fa51ae544b193122334dbae7960ab3d9._comment15
-rw-r--r--doc/design/roadmap.mdwn10
-rw-r--r--doc/devblog/day_156__release_day.mdwn14
-rw-r--r--doc/devblog/day_157__upgrade_checking.mdwn22
-rw-r--r--doc/devblog/day_158__enroute_to_Brazil.mdwn10
-rw-r--r--doc/devblog/day_159__tmp_file_cleanup.mdwn12
-rw-r--r--doc/devblog/day_160__.mdwn20
-rw-r--r--doc/devblog/day_161__routing_design.mdwn13
-rw-r--r--doc/forum/Checking_for_missing_files_in_S3___40__reduced_redundancy__41__.mdwn5
-rw-r--r--doc/forum/Checking_for_missing_files_in_S3___40__reduced_redundancy__41__/comment_2_793b3d9f78562f3aecf27dd926bbcf82._comment8
-rw-r--r--doc/forum/Checkout_only_some_files_with_the_assistant.mdwn14
-rw-r--r--doc/forum/Checkout_only_some_files_with_the_assistant/comment_1_23d8ab1a05e3e9d3611bd12a4ba70b0c._comment10
-rw-r--r--doc/forum/Checkout_only_some_files_with_the_assistant/comment_2_bf095ff5b5af95b062ae1f7da566a279._comment12
-rw-r--r--doc/forum/Distributing_data_to_a_set_of_drives.mdwn1
-rw-r--r--doc/forum/Encrypted_Content_Remote_Daemon_.mdwn1
-rw-r--r--doc/forum/Encrypted_Content_Remote_Daemon_/comment_1_96f63e509e23c081c48302274e21db78._comment10
-rw-r--r--doc/forum/Encrypted_Content_Remote_Daemon_/comment_2_acd0ffdc3f5079265858073c2af81557._comment8
-rw-r--r--doc/forum/OSX__39__s_default_sshd_behaviour_has_limited_paths_set/comment_1_a136ff877389f0930c066ba118edd9fd._comment10
-rw-r--r--doc/forum/Problems_using_submodules_with_git-annex__63__/comment_2_26f6581b5969eb2cb77495c40de88951._comment11
-rw-r--r--doc/forum/differenc_in_webapp_icons__63__.mdwn4
-rw-r--r--doc/forum/differenc_in_webapp_icons__63__/comment_1_c38e2692b13a1b76777bf88312a03966._comment8
-rw-r--r--doc/forum/misctmp_filling_up.mdwn11
-rw-r--r--doc/forum/misctmp_filling_up/comment_1_2739dec72fe0950dd070c8fab9fbd751._comment10
-rw-r--r--doc/forum/misctmp_filling_up/comment_2_440081b5e2b9b5b19e8cd5db3649a976._comment10
-rw-r--r--doc/forum/ssh_key_setup_woes_in_Android.mdwn15
-rw-r--r--doc/forum/sync_stages_deletions_on_remote/comment_3_9e07593228915936fadcf90373be9f4e._comment14
-rw-r--r--doc/forum/sync_stages_deletions_on_remote/comment_4_e5a3dc34c6229ec40bc999c3cab28041._comment8
-rw-r--r--doc/forum/trouble_with_multiple_remotes_syncing_to_gcrypt_based_ssh_repo_.mdwn7
-rw-r--r--doc/forum/trouble_with_multiple_remotes_syncing_to_gcrypt_based_ssh_repo_/comment_1_4ad9a6a7cf5678ac0bc6d46a54f64cd3._comment10
-rw-r--r--doc/forum/trouble_with_multiple_remotes_syncing_to_gcrypt_based_ssh_repo_/comment_2_82dc18ed14879936d04133f248879fb9._comment10
-rw-r--r--doc/install/ArchLinux.mdwn29
-rw-r--r--doc/not/comment_14_837e3699014b73e8f2bd2a668eea9eef._comment23
-rw-r--r--doc/preferred_content/standard_groups.mdwn3
-rw-r--r--doc/publicrepos.mdwn2
-rw-r--r--doc/special_remotes/comment_22_308afc586b86c66bbb3437d63864d9cb._comment16
-rw-r--r--doc/sync/comment_11_7683879f6982c0eb0aa39b66ff5a5ea9._comment10
-rw-r--r--doc/sync/comment_12_2fea14fa314ddb7ab645a5cca5a95fd9._comment14
-rw-r--r--doc/thanks.mdwn5
-rw-r--r--doc/tips/file_manager_integration.mdwn19
-rw-r--r--doc/tips/file_manager_integration/comment_1_0f82520f415b4715946358658e1799a8._comment8
-rw-r--r--doc/tips/file_manager_integration/comment_2_9cb6b7fcb8e33a75efd2f92d7e40a9c5._comment8
-rw-r--r--doc/tips/what_to_do_when_a_repository_is_corrupted/comment_1_c3543190eae2af594f3e050057e80db6._comment8
-rw-r--r--doc/todo/do_not_bug_me_about_intermediate_files.mdwn2
-rw-r--r--doc/todo/read-only_removable_drives.mdwn7
-rw-r--r--doc/todo/wishlist:_git_annex_group_remote_return_the_group.mdwn9
-rw-r--r--doc/todo/wishlist:_git_annex_info_._also_return_numcopies_setting.mdwn1
-rw-r--r--doc/todo/wishlist:_turn_a_directory_into_a_git-annex_direct_repository.mdwn26
-rw-r--r--doc/todo/wishlist:_turn_a_directory_into_a_git-annex_direct_repository/comment_1_d48a98bad77400bd8384300e324d999f._comment8
-rw-r--r--doc/todo/wishlist:_turn_a_directory_into_a_git-annex_direct_repository/comment_2_1a1d15531c74eb0cc09f81dc09d95d39._comment10
-rw-r--r--doc/todo/wishlist:_turn_a_directory_into_a_git-annex_direct_repository/comment_3_66ceb7c793a2dbbd755b9595a2199aca._comment8
-rw-r--r--doc/videos.mdwn2
-rw-r--r--doc/walkthrough/automatically_managing_content.mdwn4
-rw-r--r--standalone/android/Makefile1
-rwxr-xr-xstandalone/android/runshell1
-rw-r--r--standalone/trustedkeys.gpgbin0 -> 4979 bytes
128 files changed, 2124 insertions, 80 deletions
diff --git a/Annex/Ssh.hs b/Annex/Ssh.hs
index 159480121..21bb83e28 100644
--- a/Annex/Ssh.hs
+++ b/Annex/Ssh.hs
@@ -16,6 +16,8 @@ module Annex.Ssh (
sshCachingTo,
inRepoWithSshCachingTo,
runSshCaching,
+ sshAskPassEnv,
+ runSshAskPass
) where
import qualified Data.Map as M
@@ -230,7 +232,7 @@ sshReadPort params = (port, reverse args)
{- When this env var is set, git-annex runs ssh with parameters
- to use the socket file that the env var contains.
-
- - This is a workaround for GiT_SSH not being able to contain
+ - This is a workaround for GIT_SSH not being able to contain
- additional parameters to pass to ssh. -}
sshCachingEnv :: String
sshCachingEnv = "GIT_ANNEX_SSHCACHING"
@@ -268,8 +270,17 @@ sshCachingTo remote g
where
uncached = return g
-runSshCaching :: [String] -> String -> IO ()
+runSshCaching :: [String] -> FilePath -> IO ()
runSshCaching args sockfile = do
let args' = toCommand (sshConnectionCachingParams sockfile) ++ args
let p = proc "ssh" args'
exitWith =<< waitForProcess . processHandle =<< createProcess p
+
+{- When this env var is set, git-annex is being used as a ssh-askpass
+ - program, and should read the password from the specified location,
+ - and output it for ssh to read. -}
+sshAskPassEnv :: String
+sshAskPassEnv = "GIT_ANNEX_SSHASKPASS"
+
+runSshAskPass :: FilePath -> IO ()
+runSshAskPass passfile = putStrLn =<< readFile passfile
diff --git a/Assistant/CredPairCache.hs b/Assistant/CredPairCache.hs
new file mode 100644
index 000000000..2b8f72e7c
--- /dev/null
+++ b/Assistant/CredPairCache.hs
@@ -0,0 +1,53 @@
+{- git-annex assistant CredPair cache.
+ -
+ - Copyright 2014 Joey Hess <joey@kitenet.net>
+ -
+ - Licensed under the GNU GPL version 3 or higher.
+ -}
+
+{-# LANGUAGE BangPatterns #-}
+
+module Assistant.CredPairCache (
+ cacheCred,
+ getCachedCred,
+ expireCachedCred,
+) where
+
+import Assistant.Types.CredPairCache
+import Types.Creds
+import Assistant.Common
+import Utility.ThreadScheduler
+
+import qualified Data.Map as M
+import Control.Concurrent
+
+{- Caches a CredPair, but only for a limited time, after which it
+ - will expire.
+ -
+ - Note that repeatedly caching the same CredPair
+ - does not reset its expiry time.
+ -}
+cacheCred :: CredPair -> Seconds -> Assistant ()
+cacheCred (login, password) expireafter = do
+ cache <- getAssistant credPairCache
+ liftIO $ do
+ changeStrict cache $ M.insert login password
+ void $ forkIO $ do
+ threadDelaySeconds expireafter
+ changeStrict cache $ M.delete login
+
+getCachedCred :: Login -> Assistant (Maybe Password)
+getCachedCred login = do
+ cache <- getAssistant credPairCache
+ liftIO $ M.lookup login <$> readMVar cache
+
+expireCachedCred :: Login -> Assistant ()
+expireCachedCred login = do
+ cache <- getAssistant credPairCache
+ liftIO $ changeStrict cache $ M.delete login
+
+{- Update map strictly to avoid keeping references to old creds in memory. -}
+changeStrict :: CredPairCache -> (M.Map Login Password -> M.Map Login Password) -> IO ()
+changeStrict cache a = modifyMVar_ cache $ \m -> do
+ let !m' = a m
+ return m'
diff --git a/Assistant/Monad.hs b/Assistant/Monad.hs
index 350e3d33b..5b3f5abb4 100644
--- a/Assistant/Monad.hs
+++ b/Assistant/Monad.hs
@@ -44,6 +44,7 @@ import Assistant.Types.Buddies
import Assistant.Types.NetMessager
import Assistant.Types.ThreadName
import Assistant.Types.RemoteControl
+import Assistant.Types.CredPairCache
newtype Assistant a = Assistant { mkAssistant :: ReaderT AssistantData IO a }
deriving (
@@ -70,6 +71,7 @@ data AssistantData = AssistantData
, buddyList :: BuddyList
, netMessager :: NetMessager
, remoteControl :: RemoteControl
+ , credPairCache :: CredPairCache
}
newAssistantData :: ThreadState -> DaemonStatusHandle -> IO AssistantData
@@ -89,6 +91,7 @@ newAssistantData st dstatus = AssistantData
<*> newBuddyList
<*> newNetMessager
<*> newRemoteControl
+ <*> newCredPairCache
runAssistant :: AssistantData -> Assistant a -> IO a
runAssistant d a = runReaderT (mkAssistant a) d
diff --git a/Assistant/Threads/MountWatcher.hs b/Assistant/Threads/MountWatcher.hs
index 39ae67537..bd7aad69c 100644
--- a/Assistant/Threads/MountWatcher.hs
+++ b/Assistant/Threads/MountWatcher.hs
@@ -63,7 +63,11 @@ dbusThread urlrenderer = do
wasmounted <- liftIO $ swapMVar mvar nowmounted
handleMounts urlrenderer wasmounted nowmounted
liftIO $ forM_ mountChanged $ \matcher ->
+#if MIN_VERSION_dbus(0,10,7)
+ void $ addMatch client matcher handleevent
+#else
listen client matcher handleevent
+#endif
, do
liftAnnex $
warning "No known volume monitor available through dbus; falling back to mtab polling"
diff --git a/Assistant/Threads/NetWatcher.hs b/Assistant/Threads/NetWatcher.hs
index 9dd617822..f8c456aac 100644
--- a/Assistant/Threads/NetWatcher.hs
+++ b/Assistant/Threads/NetWatcher.hs
@@ -112,8 +112,13 @@ checkNetMonitor client = do
-}
listenNMConnections :: Client -> (Bool -> IO ()) -> IO ()
listenNMConnections client setconnected =
- listen client matcher $ \event -> mapM_ handle
- (map dictionaryItems $ mapMaybe fromVariant $ signalBody event)
+#if MIN_VERSION_dbus(0,10,7)
+ void $ addMatch client matcher
+#else
+ listen client matcher
+#endif
+ $ \event -> mapM_ handle
+ (map dictionaryItems $ mapMaybe fromVariant $ signalBody event)
where
matcher = matchAny
{ matchInterface = Just "org.freedesktop.NetworkManager"
@@ -142,10 +147,10 @@ listenNMConnections client setconnected =
-}
listenWicdConnections :: Client -> (Bool -> IO ()) -> IO ()
listenWicdConnections client setconnected = do
- listen client connmatcher $ \event ->
+ match connmatcher $ \event ->
when (any (== wicd_success) (signalBody event)) $
setconnected True
- listen client statusmatcher $ \event -> handle (signalBody event)
+ match statusmatcher $ \event -> handle (signalBody event)
where
connmatcher = matchAny
{ matchInterface = Just "org.wicd.daemon"
@@ -160,7 +165,12 @@ listenWicdConnections client setconnected = do
handle status
| any (== wicd_disconnected) status = setconnected False
| otherwise = noop
-
+ match matcher a =
+#if MIN_VERSION_dbus(0,10,7)
+ void $ addMatch client matcher a
+#else
+ listen client matcher a
+#endif
#endif
handleConnection :: Assistant ()
diff --git a/Assistant/Threads/SanityChecker.hs b/Assistant/Threads/SanityChecker.hs
index d7a71d477..ba141698d 100644
--- a/Assistant/Threads/SanityChecker.hs
+++ b/Assistant/Threads/SanityChecker.hs
@@ -46,6 +46,7 @@ import Assistant.WebApp.Types
#ifndef mingw32_HOST_OS
import Utility.LogFile
#endif
+import Types.Key (keyBackendName)
import Data.Time.Clock.POSIX
import qualified Data.Text as T
@@ -82,6 +83,10 @@ sanityCheckerStartupThread startupdelay = namedThreadUnchecked "SanityCheckerSta
{- Fix up ssh remotes set up by past versions of the assistant. -}
liftIO $ fixUpSshRemotes
+ {- Clean up old temp files. -}
+ liftAnnex cleanOldTmpMisc
+ liftAnnex cleanReallyOldTmp
+
{- If there's a startup delay, it's done here. -}
liftIO $ maybe noop (threadDelaySeconds . Seconds . fromIntegral . durationSeconds) startupdelay
@@ -258,3 +263,54 @@ checkOldUnused urlrenderer = go =<< annexExpireUnused <$> liftAnnex Annex.getGit
#else
debug [show $ renderTense Past msg]
#endif
+
+{- Files may be left in misctmp by eg, an interrupted add of files
+ - by the assistant, which hard links files to there as part of lockdown
+ - checks. Delete these files if they're more than a day old.
+ -
+ - Note that this is not safe to run after the Watcher starts up, since it
+ - will create such files, and due to hard linking they may have old
+ - mtimes. So, this should only be called from the
+ - sanityCheckerStartupThread, which runs before the Watcher starts up.
+ -
+ - Also, if a git-annex add is being run at the same time the assistant
+ - starts up, its tmp files could be deleted. However, the watcher will
+ - come along and add everything once it starts up anyway, so at worst
+ - this would make the git-annex add fail unexpectedly.
+ -}
+cleanOldTmpMisc :: Annex ()
+cleanOldTmpMisc = do
+ now <- liftIO getPOSIXTime
+ let oldenough = now - (60 * 60 * 24)
+ tmp <- fromRepo gitAnnexTmpMiscDir
+ liftIO $ mapM_ (cleanOld (<= oldenough)) =<< dirContentsRecursive tmp
+
+{- While .git/annex/tmp is now only used for storing partially transferred
+ - objects, older versions of git-annex used it for misctemp. Clean up any
+ - files that might be left from that, by looking for files whose names
+ - cannot be the key of an annexed object. Only delete files older than
+ - 1 week old.
+ -
+ - Also, some remotes such as rsync may use this temp directory for storing
+ - eg, encrypted objects that are being transferred. So, delete old
+ - objects that use a GPGHMAC backend.
+ -}
+cleanReallyOldTmp :: Annex ()
+cleanReallyOldTmp = do
+ now <- liftIO getPOSIXTime
+ let oldenough = now - (60 * 60 * 24 * 7)
+ tmp <- fromRepo gitAnnexTmpObjectDir
+ liftIO $ mapM_ (cleanjunk (<= oldenough)) =<< dirContentsRecursive tmp
+ where
+ cleanjunk check f = case fileKey (takeFileName f) of
+ Nothing -> cleanOld check f
+ Just k
+ | "GPGHMAC" `isPrefixOf` keyBackendName k ->
+ cleanOld check f
+ | otherwise -> noop
+
+cleanOld :: (POSIXTime -> Bool) -> FilePath -> IO ()
+cleanOld check f = do
+ mtime <- realToFrac . modificationTime <$> getFileStatus f
+ when (check mtime) $
+ nukeFile f
diff --git a/Assistant/Threads/Upgrader.hs b/Assistant/Threads/Upgrader.hs
index 60aeec70b..637c82a7d 100644
--- a/Assistant/Threads/Upgrader.hs
+++ b/Assistant/Threads/Upgrader.hs
@@ -18,11 +18,8 @@ import Assistant.Types.UrlRenderer
import Assistant.DaemonStatus
import Assistant.Alert
import Utility.NotificationBroadcaster
-import Utility.Tmp
import qualified Annex
import qualified Build.SysConfig
-import qualified Utility.Url as Url
-import qualified Annex.Url as Url
import qualified Git.Version
import Types.Distribution
#ifdef WITH_WEBAPP
@@ -62,7 +59,7 @@ upgraderThread urlrenderer = namedThread "Upgrader" $
checkUpgrade :: UrlRenderer -> Assistant ()
checkUpgrade urlrenderer = do
debug [ "Checking if an upgrade is available." ]
- go =<< getDistributionInfo
+ go =<< downloadDistributionInfo
where
go Nothing = debug [ "Failed to check if upgrade is available." ]
go (Just d) = do
@@ -86,16 +83,3 @@ canUpgrade urgency urlrenderer d = ifM autoUpgradeEnabled
noop
#endif
)
-
-getDistributionInfo :: Assistant (Maybe GitAnnexDistribution)
-getDistributionInfo = do
- uo <- liftAnnex Url.getUrlOptions
- liftIO $ withTmpFile "git-annex.tmp" $ \tmpfile h -> do
- hClose h
- ifM (Url.downloadQuiet distributionInfoUrl tmpfile uo)
- ( readish <$> readFileStrict tmpfile
- , return Nothing
- )
-
-distributionInfoUrl :: String
-distributionInfoUrl = fromJust Build.SysConfig.upgradelocation ++ ".info"
diff --git a/Assistant/Types/CredPairCache.hs b/Assistant/Types/CredPairCache.hs
new file mode 100644
index 000000000..a1e11c257
--- /dev/null
+++ b/Assistant/Types/CredPairCache.hs
@@ -0,0 +1,18 @@
+{- git-annex assistant CredPair cache.
+ -
+ - Copyright 2014 Joey Hess <joey@kitenet.net>
+ -
+ - Licensed under the GNU GPL version 3 or higher.
+ -}
+
+module Assistant.Types.CredPairCache where
+
+import Types.Creds
+
+import Control.Concurrent
+import qualified Data.Map as M
+
+type CredPairCache = MVar (M.Map Login Password)
+
+newCredPairCache :: IO CredPairCache
+newCredPairCache = newMVar M.empty
diff --git a/Build/Configure.hs b/Build/Configure.hs
index c5e3b9735..116a44215 100644
--- a/Build/Configure.hs
+++ b/Build/Configure.hs
@@ -7,7 +7,6 @@ import Control.Applicative
import System.Environment (getArgs)
import Control.Monad.IfElse
import Control.Monad
-import System.IO
import Build.TestConfig
import Build.Version
@@ -63,11 +62,7 @@ shaTestCases l = map make l
key = "sha" ++ show n
search [] = return Nothing
search (c:cmds) = do
- putStr $ "(" ++ c
- hFlush stdout
sha <- externalSHA c n "/dev/null"
- putStr $ ":" ++ show sha ++ ")"
- hFlush stdout
if sha == Right knowngood
then return $ Just c
else search cmds
diff --git a/CmdLine/GitAnnex.hs b/CmdLine/GitAnnex.hs
index c37e44a2d..e4dd29b67 100644
--- a/CmdLine/GitAnnex.hs
+++ b/CmdLine/GitAnnex.hs
@@ -199,5 +199,11 @@ run args = do
#ifdef WITH_EKG
_ <- forkServer "localhost" 4242
#endif
- maybe (dispatch True args cmds gitAnnexOptions [] header Git.CurrentRepo.get)
- (runSshCaching args) =<< getEnv sshCachingEnv
+ go envmodes
+ where
+ go [] = dispatch True args cmds gitAnnexOptions [] header Git.CurrentRepo.get
+ go ((v, a):rest) = maybe (go rest) a =<< getEnv v
+ envmodes =
+ [ (sshCachingEnv, runSshCaching args)
+ , (sshAskPassEnv, runSshAskPass)
+ ]
diff --git a/Makefile b/Makefile
index cbc369572..25a77be1f 100644
--- a/Makefile
+++ b/Makefile
@@ -120,6 +120,7 @@ linuxstandalone-nobuild: Build/Standalone Build/LinuxMkLibs
ln -sf git-annex "$(LINUXSTANDALONE_DEST)/bin/git-annex-shell"
zcat standalone/licences.gz > $(LINUXSTANDALONE_DEST)/LICENSE
cp doc/logo_16x16.png doc/logo.svg $(LINUXSTANDALONE_DEST)
+ cp standalone/trustedkeys.gpg $(LINUXSTANDALONE_DEST)
./Build/Standalone "$(LINUXSTANDALONE_DEST)"
@@ -150,6 +151,7 @@ osxapp: Build/Standalone Build/OSXMkLibs
ln -sf git-annex "$(OSXAPP_BASE)/git-annex-shell"
gzcat standalone/licences.gz > $(OSXAPP_BASE)/LICENSE
cp $(OSXAPP_BASE)/LICENSE tmp/build-dmg/LICENSE.txt
+ cp standalone/trustedkeys.gpg $(OSXAPP_BASE)
./Build/Standalone $(OSXAPP_BASE)
diff --git a/Remote.hs b/Remote.hs
index da33e195e..06c147506 100644
--- a/Remote.hs
+++ b/Remote.hs
@@ -87,9 +87,8 @@ uuidDescriptions = M.unionWith addName <$> uuidMap <*> remoteMap name
addName :: String -> RemoteName -> String
addName desc n
- | desc == n = desc
- | null desc = n
- | otherwise = n ++ " (" ++ desc ++ ")"
+ | desc == n || null desc = "[" ++ n ++ "]"
+ | otherwise = desc ++ " [" ++ n ++ "]"
{- When a name is specified, looks up the remote matching that name.
- (Or it can be a UUID.) -}
diff --git a/Types/Creds.hs b/Types/Creds.hs
index cb312f66d..c16e530b1 100644
--- a/Types/Creds.hs
+++ b/Types/Creds.hs
@@ -9,4 +9,6 @@ module Types.Creds where
type Creds = String -- can be any data that contains credentials
-type CredPair = (String, String) -- login, password
+type CredPair = (Login, Password)
+type Login = String
+type Password = String -- todo: use securemem
diff --git a/Utility/CoProcess.hs b/Utility/CoProcess.hs
index c1134011b..0c8e95e17 100644
--- a/Utility/CoProcess.hs
+++ b/Utility/CoProcess.hs
@@ -62,7 +62,7 @@ query ch send receive = do
s <- readMVar ch
restartable s (send $ coProcessTo s) $ const $
restartable s (hFlush $ coProcessTo s) $ const $
- restartable s (receive $ coProcessFrom s) $
+ restartable s (receive $ coProcessFrom s)
return
where
restartable s a cont
diff --git a/Utility/DBus.hs b/Utility/DBus.hs
index 3523a3aa3..bfcaa4471 100644
--- a/Utility/DBus.hs
+++ b/Utility/DBus.hs
@@ -9,6 +9,7 @@
module Utility.DBus where
+import Utility.PartialPrelude
import Utility.Exception
import DBus.Client
@@ -22,7 +23,7 @@ type ServiceName = String
listServiceNames :: Client -> IO [ServiceName]
listServiceNames client = do
reply <- callDBus client "ListNames" []
- return $ fromMaybe [] $ fromVariant (methodReturnBody reply !! 0)
+ return $ fromMaybe [] $ fromVariant =<< headMaybe (methodReturnBody reply)
callDBus :: Client -> MemberName -> [Variant] -> IO MethodReturn
callDBus client name params = call_ client $
diff --git a/Utility/Daemon.hs b/Utility/Daemon.hs
index 11aa57686..5d47be035 100644
--- a/Utility/Daemon.hs
+++ b/Utility/Daemon.hs
@@ -36,7 +36,7 @@ daemonize logfd pidfile changedirectory a = do
_ <- forkProcess child1
out
where
- checkalreadyrunning f = maybe noop (const $ alreadyRunning)
+ checkalreadyrunning f = maybe noop (const alreadyRunning)
=<< checkDaemon f
child1 = do
_ <- createSession
diff --git a/Utility/DataUnits.hs b/Utility/DataUnits.hs
index 2a936f1fd..7399809eb 100644
--- a/Utility/DataUnits.hs
+++ b/Utility/DataUnits.hs
@@ -111,7 +111,7 @@ roughSize units short i
| i < 0 = '-' : findUnit units' (negate i)
| otherwise = findUnit units' i
where
- units' = reverse $ sort units -- largest first
+ units' = sortBy (flip compare) units -- largest first
findUnit (u@(Unit s _ _):us) i'
| i' >= s = showUnit i' u
diff --git a/Utility/Directory.hs b/Utility/Directory.hs
index f1bcfada3..c2a50714c 100644
--- a/Utility/Directory.hs
+++ b/Utility/Directory.hs
@@ -43,7 +43,7 @@ dirContents d = map (d </>) . filter (not . dirCruft) <$> getDirectoryContents d
- When the directory does not exist, no exception is thrown,
- instead, [] is returned. -}
dirContentsRecursive :: FilePath -> IO [FilePath]
-dirContentsRecursive topdir = dirContentsRecursiveSkipping (const False) True topdir
+dirContentsRecursive = dirContentsRecursiveSkipping (const False) True
{- Skips directories whose basenames match the skipdir. -}
dirContentsRecursiveSkipping :: (FilePath -> Bool) -> Bool -> FilePath -> IO [FilePath]
diff --git a/Utility/Exception.hs b/Utility/Exception.hs
index cf2c615c7..6f3c059f6 100644
--- a/Utility/Exception.hs
+++ b/Utility/Exception.hs
@@ -18,7 +18,7 @@ import Utility.Data
{- Catches IO errors and returns a Bool -}
catchBoolIO :: IO Bool -> IO Bool
-catchBoolIO a = catchDefaultIO False a
+catchBoolIO = catchDefaultIO False
{- Catches IO errors and returns a Maybe -}
catchMaybeIO :: IO a -> IO (Maybe a)
diff --git a/Utility/Gpg.hs b/Utility/Gpg.hs
index 05c03d6ef..a00bf99da 100644
--- a/Utility/Gpg.hs
+++ b/Utility/Gpg.hs
@@ -145,7 +145,7 @@ findPubKeys :: String -> IO KeyIds
findPubKeys for = KeyIds . parse . lines <$> readStrict params
where
params = [Params "--with-colons --list-public-keys", Param for]
- parse = catMaybes . map (keyIdField . split ":")
+ parse = mapMaybe (keyIdField . split ":")
keyIdField ("pub":_:_:_:f:_) = Just f
keyIdField _ = Nothing
@@ -195,7 +195,7 @@ genSecretKey keytype passphrase userid keysize =
Algo n -> show n
, Just $ "Key-Length: " ++ show keysize
, Just $ "Name-Real: " ++ userid
- , Just $ "Expire-Date: 0"
+ , Just "Expire-Date: 0"
, if null passphrase
then Nothing
else Just $ "Passphrase: " ++ passphrase
diff --git a/Utility/HumanNumber.hs b/Utility/HumanNumber.hs
index 904135987..d5f647cd6 100644
--- a/Utility/HumanNumber.hs
+++ b/Utility/HumanNumber.hs
@@ -17,5 +17,5 @@ showImprecise precision n
int :: Integer
(int, frac) = properFraction n
remainder = round (frac * 10 ^ precision) :: Integer
- pad0s s = (take (precision - length s) (repeat '0')) ++ s
+ pad0s s = replicate (precision - length s) '0' ++ s
striptrailing0s = reverse . dropWhile (== '0') . reverse
diff --git a/Utility/HumanTime.hs b/Utility/HumanTime.hs
index 297b2bd97..f52fd5b1b 100644
--- a/Utility/HumanTime.hs
+++ b/Utility/HumanTime.hs
@@ -59,7 +59,7 @@ parseDuration = Duration <$$> go 0
fromDuration :: Duration -> String
fromDuration Duration { durationSeconds = d }
| d == 0 = "0s"
- | otherwise = concat $ map showunit $ go [] units d
+ | otherwise = concatMap showunit $ go [] units d
where
showunit (u, n)
| n > 0 = show n ++ [u]
diff --git a/Utility/LinuxMkLibs.hs b/Utility/LinuxMkLibs.hs
index 76e6266dd..f4744fcb2 100644
--- a/Utility/LinuxMkLibs.hs
+++ b/Utility/LinuxMkLibs.hs
@@ -49,7 +49,7 @@ inTop top f = top ++ f
- link to. Note that some of the libraries may not exist
- (eg, linux-vdso.so) -}
parseLdd :: String -> [FilePath]
-parseLdd = catMaybes . map (getlib . dropWhile isSpace) . lines
+parseLdd = mapMaybe (getlib . dropWhile isSpace) . lines
where
getlib l = headMaybe . words =<< lastMaybe (split " => " l)
diff --git a/Utility/Lsof.hs b/Utility/Lsof.hs
index 63009f723..b0d2bc53c 100644
--- a/Utility/Lsof.hs
+++ b/Utility/Lsof.hs
@@ -5,7 +5,7 @@
- Licensed under the GNU GPL version 3 or higher.
-}
-{-# LANGUAGE BangPatterns, CPP #-}
+{-# LANGUAGE CPP #-}
module Utility.Lsof where
@@ -110,7 +110,7 @@ parseFormatted s = bundle $ go [] $ lines s
{- Parses lsof's default output format. -}
parseDefault :: LsofParser
-parseDefault = catMaybes . map parseline . drop 1 . lines
+parseDefault = mapMaybe parseline . drop 1 . lines
where
parseline l = case words l of
(command : spid : _user : _fd : _type : _device : _size : _node : rest) ->
diff --git a/Utility/Matcher.hs b/Utility/Matcher.hs
index eabc585f4..5647c3e30 100644
--- a/Utility/Matcher.hs
+++ b/Utility/Matcher.hs
@@ -64,10 +64,10 @@ generate = simplify . process MAny . tokenGroups
process m [] = m
process m ts = uncurry process $ consume m ts
- consume m ((One And):rest) = term (m `MAnd`) rest
- consume m ((One Or):rest) = term (m `MOr`) rest
- consume m ((One Not):rest) = term (\p -> m `MAnd` (MNot p)) rest
- consume m ((One (Operation o)):rest) = (m `MAnd` MOp o, rest)
+ consume m (One And:rest) = term (m `MAnd`) rest
+ consume m (One Or:rest) = term (m `MOr`) rest
+ consume m (One Not:rest) = term (\p -> m `MAnd` (MNot p)) rest
+ consume m (One (Operation o):rest) = (m `MAnd` MOp o, rest)
consume m (Group g:rest) = (process m g, rest)
consume m (_:rest) = consume m rest
consume m [] = (m, [])
diff --git a/debian/changelog b/debian/changelog
index 043e9f015..9ed7d0ffd 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -2,6 +2,10 @@ git-annex (5.20140422) UNRELEASED; urgency=medium
* webapp: Switched to bootstrap 3.
Thanks, Sören Brunk.
+ * Standalone builds now check gpg signatures before upgrading.
+ * Simplified repository description line format. The remote name,
+ if any, is always in square brackets after the description.
+ * assistant: Clean up stale tmp files on startup.
-- Joey Hess <joeyh@debian.org> Fri, 02 May 2014 15:28:53 -0300
diff --git a/doc/assistant/comment_3_9bd3b532a5c026a1d664c898f8e335e6._comment b/doc/assistant/comment_3_9bd3b532a5c026a1d664c898f8e335e6._comment
new file mode 100644
index 000000000..996c6e606
--- /dev/null
+++ b/doc/assistant/comment_3_9bd3b532a5c026a1d664c898f8e335e6._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawnov5q9_Cl4Ps5NoYE08yE01NLSvBANnY8"
+ nickname="Eric"
+ subject="Does it not work in Direct Mode?"
+ date="2014-04-26T09:41:20Z"
+ content="""
+Looks great, but I got the impression that Assistant would mirror the files from my computer to my external hard drive, and I can't seem to get it to do that.
+"""]]
diff --git a/doc/assistant/comment_4_c546a24459ca29025f00e424353c40d2._comment b/doc/assistant/comment_4_c546a24459ca29025f00e424353c40d2._comment
new file mode 100644
index 000000000..82be4c193
--- /dev/null
+++ b/doc/assistant/comment_4_c546a24459ca29025f00e424353c40d2._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawlr2Bj0Mzqwzl28cbrotcQUbOFoaPB3B_Y"
+ nickname="Tomasz"
+ subject="how to disable assistant"
+ date="2014-04-28T10:21:59Z"
+ content="""
+assistant daemon now starts at boot and pushes all annexed files to other repos... I'd like to do it on my own. I can stop daemon from webapp, but it starts again on boot - how Do I disable it from autostarting ?
+"""]]
diff --git a/doc/bugs/Assistant_having_a_child_git_cat-file_--batch_do_the_same_thing_over_and_over_and_using_a_lot_of_memory/comment_10_edb2428552cf98bfb1735c2d6daf2b20._comment b/doc/bugs/Assistant_having_a_child_git_cat-file_--batch_do_the_same_thing_over_and_over_and_using_a_lot_of_memory/comment_10_edb2428552cf98bfb1735c2d6daf2b20._comment
new file mode 100644
index 000000000..d5f7ce363
--- /dev/null
+++ b/doc/bugs/Assistant_having_a_child_git_cat-file_--batch_do_the_same_thing_over_and_over_and_using_a_lot_of_memory/comment_10_edb2428552cf98bfb1735c2d6daf2b20._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="http://johan.kiviniemi.name/"
+ nickname="Johan"
+ subject="comment 10"
+ date="2014-05-01T01:33:10Z"
+ content="""
+Note to self: I experienced this bug with the standalone tarball release (5.20140421) as well, so it’s not caused by something that is different on my system wrt. git-annex’s dependencies etc.
+"""]]
diff --git a/doc/bugs/annex_get_fails:___34__No_such_file_or_directory__34__/comment_1_e44ae9c19796efc8eda5432d3bf1e5a3._comment b/doc/bugs/annex_get_fails:___34__No_such_file_or_directory__34__/comment_1_e44ae9c19796efc8eda5432d3bf1e5a3._comment
new file mode 100644
index 000000000..b2cd64f57
--- /dev/null
+++ b/doc/bugs/annex_get_fails:___34__No_such_file_or_directory__34__/comment_1_e44ae9c19796efc8eda5432d3bf1e5a3._comment
@@ -0,0 +1,18 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawmz9DnN5ESPLLRN0Q5a6fpELMFTYSkWTFs"
+ nickname="Steve"
+ subject="Stock RHEL git-annex is old & buggy"
+ date="2014-04-23T17:35:29Z"
+ content="""
+The stock git-annex bundled with Red Hat Enterprise Linux server (release 6.5) contains the old, buggy version that throws the \"No such file or directory\" error described above. The RHEL 6.5 version is:
+
+ $ git annex version
+ git-annex version: 3.20120523
+ local repository version: 3
+ default repository version: 3
+ supported repository versions: 3
+ upgrade supported from repository versions: 0 1 2
+
+Installing a more recent version (such as 5.20140411-gda795e0) solves the problem.
+
+"""]]
diff --git a/doc/bugs/bug_system_updates_when___34__done__34__.mdwn b/doc/bugs/bug_system_updates_when___34__done__34__.mdwn
new file mode 100644
index 000000000..6e6ff1c6a
--- /dev/null
+++ b/doc/bugs/bug_system_updates_when___34__done__34__.mdwn
@@ -0,0 +1,19 @@
+### Please describe the problem.
+
+In lieu of a better place to ask/report this. Is it possible to have an email sent when bugs are moved into another category? I get emails on comments but not much when the bugs are moved elsewhere - they just seem to disappear.
+
+### What steps will reproduce the problem?
+
+
+### What version of git-annex are you using? On what operating system?
+
+
+### Please provide any additional information below.
+
+[[!format sh """
+# If you can, paste a complete transcript of the problem occurring here.
+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log
+
+
+# End of transcript or log.
+"""]]
diff --git a/doc/bugs/git-annex_annex_repo_not_found.mdwn b/doc/bugs/git-annex_annex_repo_not_found.mdwn
new file mode 100644
index 000000000..1a2998f05
--- /dev/null
+++ b/doc/bugs/git-annex_annex_repo_not_found.mdwn
@@ -0,0 +1,23 @@
+### Please describe the problem.
+
+The git-annex annex repo at <https://downloads.kitenet.net/.git/> is not available. This is the address mentioned at <http://git-annex.branchable.com/publicrepos/>.
+
+### What steps will reproduce the problem?
+
+ $ git clone https://downloads.kitenet.net/.git/
+ Cloning into 'downloads.kitenet.net'...
+ fatal: repository 'https://downloads.kitenet.net/.git/' not found
+
+### Please provide any additional information below.
+
+Have tried various combinations of the URL, but nothing works. It was like this a week ago too, but I didn't report it because I thought it was a temporary error due to some server reconfiguration or something.
+
+[[!format sh """
+# If you can, paste a complete transcript of the problem occurring here.
+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log
+
+
+# End of transcript or log.
+"""]]
+
+> [[fixed|done]] --[[Joey]]
diff --git a/doc/bugs/git-annex_auto_upgrade_is_redundant.mdwn b/doc/bugs/git-annex_auto_upgrade_is_redundant.mdwn
new file mode 100644
index 000000000..3c6c25854
--- /dev/null
+++ b/doc/bugs/git-annex_auto_upgrade_is_redundant.mdwn
@@ -0,0 +1,26 @@
+### Please describe the problem.
+
+Hi,
+
+On OSX the web-app keeps notifying me of an upgrade, I choose to run it but nothing seems to happen.
+
+The debug logs show that the upgrade is skipped as it's redundant.
+
+### What steps will reproduce the problem?
+
+Have upgrades set to notify.
+
+### What version of git-annex are you using? On what operating system?
+
+Current.
+
+### Please provide any additional information below.
+
+[[!format sh """
+# If you can, paste a complete transcript of the problem occurring here.
+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log
+[2014-04-25 08:26:30 BST] Upgrader: An upgrade of git-annex is available. (version 5.20140421)
+[2014-04-25 08:27:02 BST] main: Skipping redundant upgrade
+
+# End of transcript or log.
+"""]]
diff --git a/doc/bugs/git-annex_auto_upgrade_is_redundant/comment_1_67cdbedc70695d1e4be81e59ab9b87bd._comment b/doc/bugs/git-annex_auto_upgrade_is_redundant/comment_1_67cdbedc70695d1e4be81e59ab9b87bd._comment
new file mode 100644
index 000000000..be27aa0d9
--- /dev/null
+++ b/doc/bugs/git-annex_auto_upgrade_is_redundant/comment_1_67cdbedc70695d1e4be81e59ab9b87bd._comment
@@ -0,0 +1,9 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawnXybLxkPMYpP3yw4b_I6IdC3cKTD-xEdU"
+ nickname="Matt"
+ subject="comment 1"
+ date="2014-04-25T07:36:09Z"
+ content="""
+The upgrade notifications seem to appear when switching between repositories in the web-app - are repositories treated separately? Or perhaps notifications sent per repo?
+
+"""]]
diff --git a/doc/bugs/git-annex_auto_upgrade_is_redundant/comment_2_3a8041ce622b9288261fab57ecb87c28._comment b/doc/bugs/git-annex_auto_upgrade_is_redundant/comment_2_3a8041ce622b9288261fab57ecb87c28._comment
new file mode 100644
index 000000000..1b4c0505d
--- /dev/null
+++ b/doc/bugs/git-annex_auto_upgrade_is_redundant/comment_2_3a8041ce622b9288261fab57ecb87c28._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="https://id.koumbit.net/anarcat"
+ ip="72.0.72.144"
+ subject="comment 2"
+ date="2014-04-25T13:25:43Z"
+ content="""
+i think this problem was quickly mentionned in [[devblog/day_157__upgrade_checking]], can you provide a full debug log?
+"""]]
diff --git a/doc/bugs/git-annex_auto_upgrade_is_redundant/comment_3_2597b2008557b80f4b71630c5c4a4241._comment b/doc/bugs/git-annex_auto_upgrade_is_redundant/comment_3_2597b2008557b80f4b71630c5c4a4241._comment
new file mode 100644
index 000000000..22c8986b7
--- /dev/null
+++ b/doc/bugs/git-annex_auto_upgrade_is_redundant/comment_3_2597b2008557b80f4b71630c5c4a4241._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawnXybLxkPMYpP3yw4b_I6IdC3cKTD-xEdU"
+ nickname="Matt"
+ subject="comment 3"
+ date="2014-04-26T20:26:35Z"
+ content="""
+I'm pretty sure that was the sum total of the log (even with debug on). Only the brevity of it makes me doubt myself.
+"""]]
diff --git a/doc/bugs/git-annex_auto_upgrade_is_redundant/comment_4_5dc46103994f064f5b9e120a16317dbd._comment b/doc/bugs/git-annex_auto_upgrade_is_redundant/comment_4_5dc46103994f064f5b9e120a16317dbd._comment
new file mode 100644
index 000000000..7bd1ec883
--- /dev/null
+++ b/doc/bugs/git-annex_auto_upgrade_is_redundant/comment_4_5dc46103994f064f5b9e120a16317dbd._comment
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ ip="209.250.56.114"
+ subject="comment 4"
+ date="2014-04-27T00:02:41Z"
+ content="""
+What version of git-annex do you have running?
+
+I suspect that if you look around, you will find you have a git-annex-5.20140421 directory in either your home directory or next to where you installed the DMG.
+"""]]
diff --git a/doc/bugs/git-annex_auto_upgrade_is_redundant/comment_5_e26cf6fa6358c8d53c0b16206d0d0ca6._comment b/doc/bugs/git-annex_auto_upgrade_is_redundant/comment_5_e26cf6fa6358c8d53c0b16206d0d0ca6._comment
new file mode 100644
index 000000000..65c6b05c6
--- /dev/null
+++ b/doc/bugs/git-annex_auto_upgrade_is_redundant/comment_5_e26cf6fa6358c8d53c0b16206d0d0ca6._comment
@@ -0,0 +1,14 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawnXybLxkPMYpP3yw4b_I6IdC3cKTD-xEdU"
+ nickname="Matt"
+ subject="comment 5"
+ date="2014-04-27T11:10:49Z"
+ content="""
+Hi,
+
+Yes there is a git-annex.app.5.20140421 directory in $HOME. And it looks as though I'm running git-annex.app.5.20140420 - even though I manually tried to upgrade by downloading
+
+https://downloads.kitenet.net/git-annex/OSX/current/10.9_Mavericks/git-annex.dmg
+
+Running `$HOME/git-annex.app.5.20140421/.../git-annex` gives me `5.20140420-ga25b8bb`. So the downloaded version even though labeled 5.20140421 contains 5.20140420.
+"""]]
diff --git a/doc/bugs/git-annex_auto_upgrade_is_redundant/comment_6_c2c7c071fc5b1d3a55254d01a287c9f8._comment b/doc/bugs/git-annex_auto_upgrade_is_redundant/comment_6_c2c7c071fc5b1d3a55254d01a287c9f8._comment
new file mode 100644
index 000000000..3092626e6
--- /dev/null
+++ b/doc/bugs/git-annex_auto_upgrade_is_redundant/comment_6_c2c7c071fc5b1d3a55254d01a287c9f8._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawnXybLxkPMYpP3yw4b_I6IdC3cKTD-xEdU"
+ nickname="Matt"
+ subject="comment 6"
+ date="2014-04-27T11:14:40Z"
+ content="""
+And I still think there is a slight bug in there somewhere. If due to packaging errors an upgrade doesn't apply and the logs are smart enough to notice it's redundant then there shouldn't be continued notifications of an available upgrade...
+"""]]
diff --git a/doc/bugs/git-annex_fails_to_initialize_under_Windows/comment_6_66cfbb5ce75d322f68b4c41f11bb15ae._comment b/doc/bugs/git-annex_fails_to_initialize_under_Windows/comment_6_66cfbb5ce75d322f68b4c41f11bb15ae._comment
new file mode 100644
index 000000000..4f53e02d5
--- /dev/null
+++ b/doc/bugs/git-annex_fails_to_initialize_under_Windows/comment_6_66cfbb5ce75d322f68b4c41f11bb15ae._comment
@@ -0,0 +1,59 @@
+[[!comment format=mdwn
+ username="ayutheos"
+ ip="49.124.129.253"
+ subject="comment 6"
+ date="2014-04-23T08:56:58Z"
+ content="""
+I upgraded git to 1.9.0.msysgit.0, and managed to initialise git-annex:
+
+ user@NOTEBOOK /d/pictures
+ $ git init
+ Initialized empty Git repository in D:/pictures/.git/
+
+ user@NOTEBOOK /d/pictures
+ $ git annex init \"laptop photos\"
+ init laptop photos
+ Detected a filesystem without fifo support.
+
+ Disabling ssh connection caching.
+
+ Detected a crippled filesystem.
+
+ Enabling direct mode.
+ ok
+ (Recording state in git...)
+
+But there's a message that it detected a crippled filesystem? What does that mean?
+
+Running `git status` gives:
+
+ user@NOTEBOOK /d/pictures
+ $ git st
+ fatal: This operation must be run in a work tree
+
+And then I run `git init`
+
+ user@NOTEBOOK /d/pictures
+ $ git init
+ Reinitialized existing Git repository in D:/pictures/.git/
+
+ user@NOTEBOOK /d/pictures
+ $ git st
+ On branch annex/direct/master
+
+ Initial commit
+
+ Untracked files:
+ (use \"git add <file>...\" to include in what will be committed)
+
+ 2011/
+ 2012/
+ 2013/
+ 2014/
+ dump/
+ to burn/
+
+ nothing added to commit but untracked files present (use \"git add\" to track)
+
+..and git works ok. Any suggestions what might be wrong?
+"""]]
diff --git a/doc/bugs/git-annex_fails_to_initialize_under_Windows/comment_7_9195b2373b0c5298ebbe309414d26ee4._comment b/doc/bugs/git-annex_fails_to_initialize_under_Windows/comment_7_9195b2373b0c5298ebbe309414d26ee4._comment
new file mode 100644
index 000000000..8a53a8acb
--- /dev/null
+++ b/doc/bugs/git-annex_fails_to_initialize_under_Windows/comment_7_9195b2373b0c5298ebbe309414d26ee4._comment
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ ip="108.236.230.124"
+ subject="comment 7"
+ date="2014-04-23T17:47:59Z"
+ content="""
+Ok, I am tempted to close this bug if it only happens with an older version of msysgit. It really is looking like a bug in git, or in the msysgit port.
+
+The \"crippled filesystem\" is normal on Windows. git-annex does not try to use symblic links on Windows, and so is limited to working in [[direct_mode]].
+"""]]
diff --git a/doc/bugs/git-annex_fails_to_initialize_under_Windows_with_cygwin.mdwn b/doc/bugs/git-annex_fails_to_initialize_under_Windows_with_cygwin.mdwn
new file mode 100644
index 000000000..4b3eda613
--- /dev/null
+++ b/doc/bugs/git-annex_fails_to_initialize_under_Windows_with_cygwin.mdwn
@@ -0,0 +1,38 @@
+### Please describe the problem.
+
+
+### What steps will reproduce the problem?
+
+$ git init
+Initialized empty Git repository in /cygdrive/c/Temp/.git/
+
+$ git-annex init
+init
+ Detected a filesystem without fifo support.
+
+ Disabling ssh connection caching.
+
+ Detected a crippled filesystem.
+
+ Disabling core.symlinks.
+
+ Enabling direct mode.
+fatal: You are on a branch yet to be born
+git-annex.exe: git [Param "checkout",Param "-q",Param "-B",Param "annex/direct/master"] failed
+
+$ git checkout -B annex/direct/master
+fatal: You are on a branch yet to be born
+
+### What version of git-annex are you using? On what operating system?
+
+Running under cygwin bash
+
+$ git --version
+git version 1.7.9
+
+$ git-annex version
+git-annex version: 5.20140421-g78d6aa1
+build flags: Assistant Webapp Webapp-secure Pairing Testsuite S3 WebDAV DNS Feeds Quvi TDFA CryptoHash
+key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E SHA256 SHA1 SHA512 SHA224 SHA384 SKEIN256 SKEIN512 WORM URL
+remote types: git gcrypt S3 bup directory rsync web webdav tahoe glacier hook external
+
diff --git a/doc/bugs/git-annex_fails_to_initialize_under_Windows_with_cygwin/comment_1_24d626923403b097f57bc3d3a8c5befa._comment b/doc/bugs/git-annex_fails_to_initialize_under_Windows_with_cygwin/comment_1_24d626923403b097f57bc3d3a8c5befa._comment
new file mode 100644
index 000000000..8610061d5
--- /dev/null
+++ b/doc/bugs/git-annex_fails_to_initialize_under_Windows_with_cygwin/comment_1_24d626923403b097f57bc3d3a8c5befa._comment
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ ip="209.250.56.114"
+ subject="comment 1"
+ date="2014-04-27T00:13:49Z"
+ content="""
+This looks similar to [[bugs/git-annex_fails_to_initialize_under_Windows]], which was solved by upgrading to a newer version of msysgit.
+
+git 1.7.9 is extremely old (years). Probably the empty commit that is done when switching to direct mode, precisely to avoid this problem, fails, because the pre-built git-annex for windows is targeting a modern version of git, from msysgit.
+"""]]
diff --git a/doc/bugs/git-annex_fails_to_initialize_under_Windows_with_cygwin/comment_2_32a74f078f45ee069a7d386734e379e2._comment b/doc/bugs/git-annex_fails_to_initialize_under_Windows_with_cygwin/comment_2_32a74f078f45ee069a7d386734e379e2._comment
new file mode 100644
index 000000000..bafaaa3fd
--- /dev/null
+++ b/doc/bugs/git-annex_fails_to_initialize_under_Windows_with_cygwin/comment_2_32a74f078f45ee069a7d386734e379e2._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawkYmMFDdf3GJ9Oba6NCVkzGc4JyB9WavMs"
+ nickname="Xinruo"
+ subject="comment 2"
+ date="2014-04-27T11:58:13Z"
+ content="""
+OK installing git 1.9.2 from msysgit solves the problem. I thought I have read somewhere that you used cygwin for Windows development and didn't know that git from cygwin is too old. Thanks for the help!
+"""]]
diff --git a/doc/bugs/git-annex_group_remote_allows_bad_settings_with_standard_groups.mdwn b/doc/bugs/git-annex_group_remote_allows_bad_settings_with_standard_groups.mdwn
new file mode 100644
index 000000000..922e65c59
--- /dev/null
+++ b/doc/bugs/git-annex_group_remote_allows_bad_settings_with_standard_groups.mdwn
@@ -0,0 +1,23 @@
+### Please describe the problem.
+
+Running `git annex group here manual` and `git annex group here client` results in the nonsensical group of "manual client". Should there be checking for the reserved "standard" group words?
+
+The intention from the webapp and docs reads as though these groups should be mutually exclusive.
+
+Also it would be nice if `git annex group here` returned the list of groups (I put this as a wishlist item but think it perhaps warrants a bug mention).
+
+### What steps will reproduce the problem?
+
+
+### What version of git-annex are you using? On what operating system?
+
+
+### Please provide any additional information below.
+
+[[!format sh """
+# If you can, paste a complete transcript of the problem occurring here.
+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log
+
+
+# End of transcript or log.
+"""]]
diff --git a/doc/bugs/git-annex_remotedeamon.mdwn b/doc/bugs/git-annex_remotedeamon.mdwn
new file mode 100644
index 000000000..15f728362
--- /dev/null
+++ b/doc/bugs/git-annex_remotedeamon.mdwn
@@ -0,0 +1,27 @@
+### Please describe the problem.
+
+git-annex is back on the radar now that the jabber requirement has been dropped! :-)
+
+But, it seems as though when I create a remote repo via the webapp it always makes it a bare git repo. Even when I specify the "client usage grouping".
+
+If I manually create two repos on ssh enabled servers, manually link them, and fire up the assistant they are awesomely kept in sync (with no bare repo in sight).
+
+### What steps will reproduce the problem?
+
+Use the webapp to try to create a client usage remote repo.
+
+### What version of git-annex are you using? On what operating system?
+
+Latest as of post.
+
+### Please provide any additional information below.
+
+[[!format sh """
+# If you can, paste a complete transcript of the problem occurring here.
+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log
+
+
+# End of transcript or log.
+"""]]
+
+> [[notabug|done]] --[[Joey]]
diff --git a/doc/bugs/git-annex_remotedeamon/comment_1_bf8aa639ddc7f51ed7b2b83e31694e85._comment b/doc/bugs/git-annex_remotedeamon/comment_1_bf8aa639ddc7f51ed7b2b83e31694e85._comment
new file mode 100644
index 000000000..47d85fc67
--- /dev/null
+++ b/doc/bugs/git-annex_remotedeamon/comment_1_bf8aa639ddc7f51ed7b2b83e31694e85._comment
@@ -0,0 +1,12 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ ip="209.250.56.114"
+ subject="comment 1"
+ date="2014-04-24T18:00:52Z"
+ content="""
+Please use descriptive bug titles.
+
+The webapp configures some common use cases, not every possible use case. Running git-annex assistant on a remote server to keep a directory there updated is not a relatively common use case. You can do it if you want; and if someone provided a very complelling UI markup that made sense to regular users it might be added to the webap (but this seems unlikely.
+
+As it is, the webapp set up bare git repositories on remotes, because that is by far the most common useful way to use git on a remote server. And if the webapp's local pairing interface is used, two existing non-bare client repositories will be paired, and the new remotedaemon will help keep the in sync.
+"""]]
diff --git a/doc/bugs/git-annex_remotedeamon/comment_2_82f71852df61d12333d08ba25af9d7be._comment b/doc/bugs/git-annex_remotedeamon/comment_2_82f71852df61d12333d08ba25af9d7be._comment
new file mode 100644
index 000000000..0228e2fbb
--- /dev/null
+++ b/doc/bugs/git-annex_remotedeamon/comment_2_82f71852df61d12333d08ba25af9d7be._comment
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawnXybLxkPMYpP3yw4b_I6IdC3cKTD-xEdU"
+ nickname="Matt"
+ subject="comment 2"
+ date="2014-04-24T18:43:50Z"
+ content="""
+hmmm - I think that it's arguable that if in the repository group drop down I select \"client\" then the remote repo should *not* be bare.
+
+I would predict that this new functionality will supercede the existing use-cases in terms of popularity. It's very cool that all my machines can be kept in sync with just ssh - a walkthrough showing desktop, laptop, and phone all just syncing (i.e., without the cloud transfer repo and jabber complications) makes a much simpler and compelling advert for this cool code! But it won't happen unless the GUI supports it...
+"""]]
diff --git a/doc/bugs/git_annex_costs_not_working_as_expected_in_the_assistant.mdwn b/doc/bugs/git_annex_costs_not_working_as_expected_in_the_assistant.mdwn
new file mode 100644
index 000000000..7f1175d88
--- /dev/null
+++ b/doc/bugs/git_annex_costs_not_working_as_expected_in_the_assistant.mdwn
@@ -0,0 +1,136 @@
+### Please describe the problem.
+
+Hi,
+
+I have a number of repos that I created both by hand and via the web-app. Some manual, some client and one backup groupings.
+
+When creating by hand I manually set the annex-cost to 100 (but I notice the webapp sets local costs to 175 - not 100 as per the man page).
+
+(I'm assuming the creation by hand is still just to `git add remote` on both sides).
+
+When I run `git-annex sync --content` I do seem to get the local remote (the cheapest cost) that I want.
+
+When I use the assistant I get every odd behaviour. It will quite happily choose from any of the available repos with no descernible pattern.
+
+Even more strangely sometimes it queues all the transfers to use the local connection but then at the actual transfer it switches to use the public connection (I have two remotes for one repo: when on the local network and when on the internet). This is reflected in the webapps UI.
+
+For the snippet of logs below I see the files queued as the remote "Dancingfrog" (on the internnal network) then for the transfer the web page switches to "Home" (the public network). I think the data is actually transferred over the public network as it's much slower than compared to explicit repo transfers from the cli.
+
+<pre>
+[2014-04-27 05:11:47 BST] TransferWatcher: transfer starting: Download UUID "c3cec307-367b-4373-8cb9-a3da67cee745" Dizzee Rascal/Tounge N' Cheek/03 Dance Wiv Me [Ft. Calvin Harris & Chrome].mp3 Nothing
+[2014-04-27 05:11:47 BST] TransferWatcher: transfer starting: Download UUID "c3cec307-367b-4373-8cb9-a3da67cee745" Dizzee Rascal/Tounge N' Cheek/03 Dance Wiv Me [Ft. Calvin Harris & Chrome].mp3 Nothing
+
+SHA256E-s6759929--a822e83c3448716e793fb9d1d1b1523c2492c84ba07f5c093899810fbdfe5621.mp3
+
+ 0 0% 0.00kB/s 0:00:00
+ 163,840 2% 159.20kB/s 0:00:41
+ 360,448 5% 159.56kB/s 0:00:40
+ 524,288 7% 155.01kB/s 0:00:40
+ 688,128 10% 154.59kB/s 0:00:39
+ 851,968 12% 153.18kB/s 0:00:38 [2014-04-27 05:11:54 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","ls-tree","--full-tree","-z","--","refs/heads/git-annex","uuid.log","remote.log","trust.log","group.log","numcopies.log","schedule.log","preferred-content.log","required-content.log","group-preferred-content.log"]
+
+ 1,015,808 15% 149.92kB/s 0:00:38 To gcrypt::ssh://rss/home/matt/mnt/isilon/rss/zzalsmf3/git-annex/mus
+ 617edaf..f016a03 git-annex -> synced/git-annex
+[2014-04-27 05:11:56 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","show-ref","git-annex"]
+[2014-04-27 05:11:56 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","show-ref","--hash","refs/heads/git-annex"]
+[2014-04-27 05:11:56 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","push","isilon","master"]
+[2014-04-27 05:11:56 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","log","refs/heads/git-annex..f016a03fc92aebba14b239cc3647478b1fb9f78f","--oneline","-n1"]
+[2014-04-27 05:11:56 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","log","refs/heads/git-annex..7339a1fdd007d7a528b7e2eb82c2aeedca511920","--oneline","-n1"]
+[2014-04-27 05:11:56 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","log","refs/heads/git-annex..00f5e110ca77b9b5103e1b568ea6aa9d9d9dbb81","--oneline","-n1"]
+[2014-04-27 05:11:56 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","log","refs/heads/git-annex..ab90c337053a61111060540d2f60ce20b44cc2d9","--oneline","-n1"]
+[2014-04-27 05:11:56 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","log","refs/heads/git-annex..88d99a7ef2d37d1a6180e5dd66a4559927a58eaf","--oneline","-n1"]
+
+ 1,146,880 16% 98.64kB/s 0:00:56
+ 1,507,328 22% 129.55kB/s 0:00:40
+ 1,671,168 24% 126.84kB/s 0:00:40 [2014-04-27 05:12:00 BST] Pusher: Syncing with dancingfrog, rss, isilon
+[2014-04-27 05:12:00 BST] chat: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","hash-object","-w","--stdin-paths","--no-filters"]
+[2014-04-27 05:12:00 BST] feed: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","update-index","-z","--index-info"]
+[2014-04-27 05:12:00 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","show-ref","--hash","refs/heads/git-annex"]
+(Recording state in git...)
+[2014-04-27 05:12:00 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","write-tree"]
+[2014-04-27 05:12:00 BST] chat: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","commit-tree","86e5513adfc0d1f64cabd3ca3902738d45d809ad","-p","refs/heads/git-annex"]
+[2014-04-27 05:12:00 BST] call: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","update-ref","refs/heads/git-annex","8808dc8effc3572ae1421461ff44574e900917bf"]
+[2014-04-27 05:12:00 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","symbolic-ref","HEAD"]
+[2014-04-27 05:12:00 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","show-ref","refs/heads/master"]
+[2014-04-27 05:12:00 BST] Pusher: pushing to [Remote { name ="dancingfrog" },Remote { name ="rss" },Remote { name ="isilon" }]
+[2014-04-27 05:12:00 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","show-ref","git-annex"]
+[2014-04-27 05:12:00 BST] call: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","branch","-f","synced/master"]
+[2014-04-27 05:12:00 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","show-ref","--hash","refs/heads/git-annex"]
+[2014-04-27 05:12:00 BST] call: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","push","dancingfrog","+git-annex:synced/git-annex","master:synced/master"]
+[2014-04-27 05:12:00 BST] call: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","push","rss","+git-annex:synced/git-annex","master:synced/master"]
+[2014-04-27 05:12:00 BST] call: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","push","isilon","+git-annex:synced/git-annex","master:synced/master"]
+[2014-04-27 05:12:00 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","log","refs/heads/git-annex..8808dc8effc3572ae1421461ff44574e900917bf","--oneline","-n1"]
+[2014-04-27 05:12:00 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","log","refs/heads/git-annex..7339a1fdd007d7a528b7e2eb82c2aeedca511920","--oneline","-n1"]
+[2014-04-27 05:12:00 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","log","refs/heads/git-annex..00f5e110gcrypt: Development version -- Repository format MAY CHANGE
+ca77b9b5103e1b568ea6aa9d9d9dbb81","--oneline","-n1"]
+[2014-04-27 05:12:00 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","log","refs/heads/git-annex..f016a03fc92aebba14b239cc3647478b1fb9f78f","--oneline","-n1"]
+[2014-04-27 05:12:00 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","log","refs/heads/git-annex..ab90c337053a61111060540d2f60ce20b44cc2d9","--oneline","-n1"]
+[2014-04-27 05:12:00 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","log","refs/heads/git-annex..88d99a7ef2d37d1a6180e5dd66a4559927a58eaf","--oneline","-n1"]
+To ssh://10.23.33.19/Volumes/Media/iTunes Media/Music
+ f016a03..8808dc8 git-annex -> synced/git-annex
+[2014-04-27 05:12:00 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","show-ref","git-annex"]
+[2014-04-27 05:12:00 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","push","dancingfrog","master"]
+[2014-04-27 05:12:00 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","show-ref","--hash","refs/heads/git-annex"]
+[2014-04-27 05:12:00 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","log","refs/heads/git-annex..8808dc8effc3572ae1421461ff44574e900917bf","--oneline","-n1"]
+[2014-04-27 05:12:00 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","log","refs/heads/git-annex..7339a1fdd007d7a528b7e2eb82c2aeedca511920","--oneline","-n1"]
+[2014-04-27 05:12:00 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","log","refs/heads/git-annex..00f5e110ca77b9b5103e1b568ea6aa9d9d9dbb81","--oneline","-n1"]
+[2014-04-27 05:12:00 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","log","refs/heads/git-annex..ab90c337053a61111060540d2f60ce20b44cc2d9","--oneline","-n1"]
+[2014-04-27 05:12:00 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","log","refs/heads/git-annex..f016a03fc92aebba14b239cc3647478b1fb9f78f","--oneline","-n1"]
+[2014-04-27 05:12:00 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","log","refs/heads/git-annex..88d99a7ef2d37d1a6180e5dd66a4559927a58eaf","--oneline","-n1"]
+
+ 1,835,008 27% 125.00kB/s 0:00:39 To rss:Music
+ f016a03..8808dc8 git-annex -> synced/git-annex
+[2014-04-27 05:12:01 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","show-ref","git-annex"]
+[2014-04-27 05:12:01 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","push","rss","master"]
+[2014-04-27 05:12:01 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","show-ref","--hash","refs/heads/git-annex"]
+[2014-04-27 05:12:01 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","log","refs/heads/git-annex..8808dc8effc3572ae1421461ff44574e900917bf","--oneline","-n1"]
+[2014-04-27 05:12:01 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","log","refs/heads/git-annex..7339a1fdd007d7a528b7e2eb82c2aeedca511920","--oneline","-n1"]
+[2014-04-27 05:12:01 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","log","refs/heads/git-annex..00f5e110ca77b9b5103e1b568ea6aa9d9d9dbb81","--oneline","-n1"]
+[2014-04-27 05:12:01 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","log","refs/heads/git-annex..ab90c337053a61111060540d2f60ce20b44cc2d9","--oneline","-n1"]
+[2014-04-27 05:12:01 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","log","refs/heads/git-annex..f016a03fc92aebba14b239cc3647478b1fb9f78f","--oneline","-n1"]
+[2014-04-27 05:12:01 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","log","refs/heads/git-annex..88d99a7ef2d37d1a6180e5dd66a4559927a58eaf","--oneline","-n1"]
+gcrypt: Decrypting manifest
+gpg: Signature made Sun 27 Apr 2014 05:11:41 BST using DSA key ID 29C42E01
+gpg: Good signature from "Matt Ford (Work) <matt.ford@manchester.ac.uk>"
+gpg: aka "Matt Ford <matt@dancingfrog.co.uk>"
+gcrypt: Encrypting to: -R 68D8501429C42E01
+gcrypt: Requesting manifest signature
+gpg: 68D8501429C42E01: skipped: public key already present
+
+ 1,998,848 29% 180.87kB/s 0:00:26
+ 2,162,688 31% 135.56kB/s 0:00:33 To gcrypt::ssh://rss/home/matt/mnt/isilon/rss/zzalsmf3/git-annex/mus
+ f016a03..8808dc8 git-annex -> synced/git-annex
+[2014-04-27 05:12:03 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","show-ref","git-annex"]
+[2014-04-27 05:12:03 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","show-ref","--hash","refs/heads/git-annex"]
+[2014-04-27 05:12:03 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","push","isilon","master"]
+[2014-04-27 05:12:03 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","log","refs/heads/git-annex..8808dc8effc3572ae1421461ff44574e900917bf","--oneline","-n1"]
+[2014-04-27 05:12:03 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","log","refs/heads/git-annex..7339a1fdd007d7a528b7e2eb82c2aeedca511920","--oneline","-n1"]
+[2014-04-27 05:12:03 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","log","refs/heads/git-annex..00f5e110ca77b9b5103e1b568ea6aa9d9d9dbb81","--oneline","-n1"]
+[2014-04-27 05:12:03 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","log","refs/heads/git-annex..ab90c337053a61111060540d2f60ce20b44cc2d9","--oneline","-n1"]
+[2014-04-27 05:12:03 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","log","refs/heads/git-annex..88d99a7ef2d37d1a6180e5dd66a4559927a58eaf","--oneline","-n1"]
+
+ 2,326,528 34% 139.74kB/s 0:00:31
+ 3,637,248 53% 397.83kB/s 0:00:07
+ 4,423,680 65% 556.91kB/s 0:00:04
+ 5,079,040 75% 692.27kB/s 0:00:02
+ 5,636,096 83% 781.05kB/s 0:00:01
+
+× Synced with dancingfrog, rss, isilon
+× Downloaded 11 Bad Be..viour.mp3 10 Holida..rome].mp3 09 Leisure.mp3 08 Money Money.mp3 07 Dirtee Cash.mp3 06 Chilli..n Dem.mp3 05 Can't .. More.mp3 04 Freaky..reaky.mp3 03 Dance ..rome].mp3 02 Road Rage.mp3 and 8 other files
+× Synced with rss
+× Performed startup scan
+× Synced with dancingfrog, isilon
+</pre>
+
+### What version of git-annex are you using? On what operating system?
+
+
+### Please provide any additional information below.
+
+[[!format sh """
+# If you can, paste a complete transcript of the problem occurring here.
+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log
+
+
+# End of transcript or log.
+"""]]
diff --git a/doc/bugs/git_annex_costs_not_working_as_expected_in_the_assistant/comment_1_ab82b880bd75a206e0717146e1b79aba._comment b/doc/bugs/git_annex_costs_not_working_as_expected_in_the_assistant/comment_1_ab82b880bd75a206e0717146e1b79aba._comment
new file mode 100644
index 000000000..56d77a2d2
--- /dev/null
+++ b/doc/bugs/git_annex_costs_not_working_as_expected_in_the_assistant/comment_1_ab82b880bd75a206e0717146e1b79aba._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawnXybLxkPMYpP3yw4b_I6IdC3cKTD-xEdU"
+ nickname="Matt"
+ subject="comment 1"
+ date="2014-04-27T04:25:58Z"
+ content="""
+By the way these are indirect repos if that would make a difference.
+"""]]
diff --git a/doc/bugs/git_annex_costs_not_working_as_expected_in_the_assistant/comment_2_460e78ea8603bd87203d8014bcc3eb9a._comment b/doc/bugs/git_annex_costs_not_working_as_expected_in_the_assistant/comment_2_460e78ea8603bd87203d8014bcc3eb9a._comment
new file mode 100644
index 000000000..ef70e0abd
--- /dev/null
+++ b/doc/bugs/git_annex_costs_not_working_as_expected_in_the_assistant/comment_2_460e78ea8603bd87203d8014bcc3eb9a._comment
@@ -0,0 +1,55 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawnXybLxkPMYpP3yw4b_I6IdC3cKTD-xEdU"
+ nickname="Matt"
+ subject="comment 2"
+ date="2014-04-27T11:48:18Z"
+ content="""
+Here's the `.git/config`
+
+<pre>
+[core]
+ repositoryformatversion = 0
+ filemode = true
+ bare = false
+ logallrefupdates = true
+[branch \"master\"]
+ remote = home
+ merge = refs/heads/master
+[annex]
+ uuid = 105776ba-bd78-4884-9126-aeb7c1e6da21
+ version = 5
+ diskreserve = 100 megabytes
+ autoupgrade = ask
+ debug = true
+ fscknudge = true
+[remote \"dancingfrog\"]
+ url = ssh://10.23.33.19/Volumes/Media/iTunes Media/Music
+ fetch = +refs/heads/*:refs/remotes/dancingfrog/*
+ annex-uuid = c3cec307-367b-4373-8cb9-a3da67cee745
+ annex-cost = 100
+ annex-sync = true
+[remote \"home\"]
+ url = home:/Volumes/Media/iTunes Media/Music
+ fetch = +refs/heads/*:refs/remotes/home/*
+ annex-uuid = c3cec307-367b-4373-8cb9-a3da67cee745
+ annex-sync = true
+ annex-cost = 200
+[remote \"isilon\"]
+ url = gcrypt::ssh://rss/home/matt/mnt/isilon/rss/zzalsmf3/git-annex/mus
+ fetch = +refs/heads/*:refs/remotes/isilon/*
+ gcrypt-participants = 68D8501429C42E01
+ gcrypt-signingkey = 68D8501429C42E01
+ gcrypt-id = :id:92R1j7+L9r5LuWDi2ZlW
+ annex-gcrypt = true
+ annex-uuid = 949a8fc3-6334-5f5e-887d-b1e5725ea443
+ annex-sync = true
+ annex-cost = 250
+[remote \"rss\"]
+ url = rss:Music
+ fetch = +refs/heads/*:refs/remotes/rss/*
+ annex-uuid = 79ff3c20-fab3-44dd-88f7-cc1a41eb73d6
+ annex-sync = true
+ annex-cost = 200
+
+</pre>
+"""]]
diff --git a/doc/bugs/git_annex_enableremote_gcrypt_failure_leaves_a_remote.mdwn b/doc/bugs/git_annex_enableremote_gcrypt_failure_leaves_a_remote.mdwn
new file mode 100644
index 000000000..021d782de
--- /dev/null
+++ b/doc/bugs/git_annex_enableremote_gcrypt_failure_leaves_a_remote.mdwn
@@ -0,0 +1,31 @@
+### Please describe the problem.
+
+Running `git-annex enableremote remote` without a suitable key available leaves a partially unconfigured git remote.
+
+Subsequently making the key available and running `git-annex enableremote remote` a second time fails as the remote now partially exists.
+
+Removing the remote with `git remote remove remote` and then re-running `git-annex enable remote` seems to do the trick.
+
+However, I notice that even after syncing my special remotes are missing some details in the git config file - namely the `annex-gcrypt` and `annex-uuid` (there may have been more). I fixed by adding the details from a working repo.
+
+Finally, when I initially created the gcrypt repo (by hand) I specified the remote as a local directory on the machine in question i.e. `gcrypt::/matt/mnt/isilon/rss/zzalsmf3/git-annex/mus` I then decided to make it available and changed it (via `git remote rename` to `gcrypt::ssh://rss/home/matt/mnt/isilon/rss/zzalsmf3/git-annex/mus`. Unfortunately on other machines when I `git enableremote` it recovers the original remote which obviously doesn't work - how can I update this setting?
+
+Phew!
+
+
+
+### What steps will reproduce the problem?
+
+
+### What version of git-annex are you using? On what operating system?
+
+
+### Please provide any additional information below.
+
+[[!format sh """
+# If you can, paste a complete transcript of the problem occurring here.
+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log
+
+
+# End of transcript or log.
+"""]]
diff --git a/doc/bugs/git_annex_info_listings_can_be_confusing.mdwn b/doc/bugs/git_annex_info_listings_can_be_confusing.mdwn
new file mode 100644
index 000000000..aaf2a9560
--- /dev/null
+++ b/doc/bugs/git_annex_info_listings_can_be_confusing.mdwn
@@ -0,0 +1,33 @@
+### Please describe the problem.
+
+The output of git-annex info can be confusing as the format rules change based on positioning
+
+ repository mode: indirect
+ trusted repositories: 0
+ semitrusted repositories: 5
+ 00000000-0000-0000-0000-000000000001 -- web
+ 105776ba-bd78-4884-9126-aeb7c1e6da21 -- UoM Laptop
+ 79ff3c20-fab3-44dd-88f7-cc1a41eb73d6 -- here (UoM Desktop Client)
+ 949a8fc3-6334-5f5e-887d-b1e5725ea443 -- isilon (UoM Isilon Encrypted Git Backup)
+ c3cec307-367b-4373-8cb9-a3da67cee745 -- home (Mac Mini Home Client)
+
+Here we see the description surrounded in brackets and also not in brackets. The second annex listed does not have a name (as there is no git remote configured). Always including the brackets or an additional setting I think would make things much clearer esp. when setting things up.
+
+
+### What steps will reproduce the problem?
+
+
+### What version of git-annex are you using? On what operating system?
+
+
+### Please provide any additional information below.
+
+[[!format sh """
+# If you can, paste a complete transcript of the problem occurring here.
+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log
+
+
+# End of transcript or log.
+"""]]
+
+[[done]] --[[Joey]]
diff --git a/doc/bugs/git_annex_sync___40__sync_content_without_--content_flag__41__.mdwn b/doc/bugs/git_annex_sync___40__sync_content_without_--content_flag__41__.mdwn
new file mode 100644
index 000000000..0a3cd785a
--- /dev/null
+++ b/doc/bugs/git_annex_sync___40__sync_content_without_--content_flag__41__.mdwn
@@ -0,0 +1,23 @@
+### Please describe the problem.
+
+Not sure if it's a bug, but pls explain why it sync files and how to stop it by cfg.
+
+Repos. created with Assistant - git annex sync i an indirect mode not only fetch metadata but also a files. What is the correct way to disable file sync (so only broken links are created in working tree)
+
+Desired:
+to boostrap annex infrastructure with assistant, but then some repos switch to indirect mode (while still synced by assistant/webapp) but only metadata (not files). Files to be fetched on request (like git annex get xyz/*) when needed.
+
+### What steps will reproduce the problem?
+
+1. with git annex webapp create two repos on two nodes (Alice and Bob).
+2. pair them using discovery on local lan
+3. on Bob stop assistant and fire "git annex indirect"
+4. add files to Alice repo
+5. run git annex sync on Bob repo from CLI
+
+Bob's repo not only sync metadata but also retrive files.
+The documentation says "sync" only sync metadata.
+
+### What version of git-annex are you using? On what operating system?
+
+git-annex version: 5.20140420-ga25b8bb
diff --git a/doc/bugs/git_annex_sync___40__sync_content_without_--content_flag__41__/comment_1_a797542acb1f0c51dd4c75e4566558f0._comment b/doc/bugs/git_annex_sync___40__sync_content_without_--content_flag__41__/comment_1_a797542acb1f0c51dd4c75e4566558f0._comment
new file mode 100644
index 000000000..4f35163f6
--- /dev/null
+++ b/doc/bugs/git_annex_sync___40__sync_content_without_--content_flag__41__/comment_1_a797542acb1f0c51dd4c75e4566558f0._comment
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawmBUR4O9mofxVbpb8JV9mEbVfIYv670uJo"
+ nickname="Justin"
+ subject="comment 1"
+ date="2014-04-30T20:54:05Z"
+ content="""
+On this screen: http://git-annex.branchable.com/assistant/example.png click settings next to each repo
+
+Set the type to manual: https://git-annex.branchable.com/assistant/repogroups.png
+"""]]
diff --git a/doc/bugs/mac_os_x_10.7_DMG_out_of_date.mdwn b/doc/bugs/mac_os_x_10.7_DMG_out_of_date.mdwn
new file mode 100644
index 000000000..67805af6b
--- /dev/null
+++ b/doc/bugs/mac_os_x_10.7_DMG_out_of_date.mdwn
@@ -0,0 +1,16 @@
+### Please describe the problem.
+
+This URL:
+http://downloads.kitenet.net/git-annex/OSX/current/10.7.5_Lion/git-annex.dmg
+currently points to a DMG with an .app that has ctime/mtime of Dec 29.
+
+After launching the app, the About screen says this:
+
+Version: 5.20131230-g684f2e6
+
+> Nobody is autobuilding git-annex for old versions of OSX, which
+> is why the download page says, "**warning: not being updated any longer**"
+>
+> So, not a bug, and nothing ca be done, unless someone steps up to run an
+> autobuilder. You can of course build it from source yourself. [[done]]
+> --[[Joey]]
diff --git a/doc/bugs/no_git-annex_cli_for_performing_upgrades_or_setting_upgrade_options.mdwn b/doc/bugs/no_git-annex_cli_for_performing_upgrades_or_setting_upgrade_options.mdwn
new file mode 100644
index 000000000..be1f778a1
--- /dev/null
+++ b/doc/bugs/no_git-annex_cli_for_performing_upgrades_or_setting_upgrade_options.mdwn
@@ -0,0 +1,19 @@
+### Please describe the problem.
+
+I have to run the webapp to do upgrades...it would be nice to have a CLI. I would hate for the CLI to be less featured than the webapp. Unless I've missed it in the man page?
+
+### What steps will reproduce the problem?
+
+
+### What version of git-annex are you using? On what operating system?
+
+
+### Please provide any additional information below.
+
+[[!format sh """
+# If you can, paste a complete transcript of the problem occurring here.
+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log
+
+
+# End of transcript or log.
+"""]]
diff --git a/doc/bugs/no_git-annex_shell_on_Windows.mdwn b/doc/bugs/no_git-annex_shell_on_Windows.mdwn
new file mode 100644
index 000000000..60a67eae9
--- /dev/null
+++ b/doc/bugs/no_git-annex_shell_on_Windows.mdwn
@@ -0,0 +1,28 @@
+### Please describe the problem.
+
+git annex installer on Windows only installs git-annex-licenses.txt git-annex-uninstall.exe git-annex.exe
+
+This makes git-annex unusable over ssh (Windows box runs cygwin sshd).
+
+### What steps will reproduce the problem?
+
+
+### What version of git-annex are you using? On what operating system?
+
+Windows 7 64bit
+
+git annex version
+git-annex version: 5.20140421-g78d6aa1
+build flags: Assistant Webapp Webapp-secure Pairing Testsuite S3 WebDAV DNS Feeds Quvi TDFA CryptoHash
+key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E SHA256 SHA1 SHA512 SHA224 SHA384 SKEIN256 SKEIN512 WORM URL
+remote types: git gcrypt S3 bup directory rsync web webdav tahoe glacier hook external
+
+### Please provide any additional information below.
+
+[[!format sh """
+# If you can, paste a complete transcript of the problem occurring here.
+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log
+
+
+# End of transcript or log.
+"""]]
diff --git a/doc/bugs/remote_gcrypt_based_repos_and_conflicting_uuids.mdwn b/doc/bugs/remote_gcrypt_based_repos_and_conflicting_uuids.mdwn
new file mode 100644
index 000000000..d45dcdc9c
--- /dev/null
+++ b/doc/bugs/remote_gcrypt_based_repos_and_conflicting_uuids.mdwn
@@ -0,0 +1,23 @@
+### Please describe the problem.
+
+I've setup a gcrypt based git backup repository as per the examples here:
+
+http://git-annex.branchable.com/tips/fully_encrypted_git_repositories_with_gcrypt/
+
+It all seems to work well until I try to do any kind git annex operation from the console on the gcrypted repo on the remote server. If I run a `git annex fsck` (this seems a reasonable thing to do) then it initialises the encrypted remote with a different uuid to the one in the creation step. The initial repository that created the repo seems to work okay but it's no longer possible to add further repositories without getting conflicting uuid errors.
+
+### What steps will reproduce the problem?
+
+
+### What version of git-annex are you using? On what operating system?
+
+
+### Please provide any additional information below.
+
+[[!format sh """
+# If you can, paste a complete transcript of the problem occurring here.
+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log
+
+
+# End of transcript or log.
+"""]]
diff --git a/doc/bugs/remote_gcrypt_based_repos_and_conflicting_uuids/comment_1_11af589cf646cb7552eeb5c7401934f5._comment b/doc/bugs/remote_gcrypt_based_repos_and_conflicting_uuids/comment_1_11af589cf646cb7552eeb5c7401934f5._comment
new file mode 100644
index 000000000..a8a4af4cf
--- /dev/null
+++ b/doc/bugs/remote_gcrypt_based_repos_and_conflicting_uuids/comment_1_11af589cf646cb7552eeb5c7401934f5._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawnXybLxkPMYpP3yw4b_I6IdC3cKTD-xEdU"
+ nickname="Matt"
+ subject="comment 1"
+ date="2014-04-27T15:04:09Z"
+ content="""
+Thinking about it some more perhaps it's not a reasonable thing to do if you don't want people to be able to discover info about the repo. However it would be good to somehow prevent git-annex from running a local init operation when working with a gcrypt repo.
+"""]]
diff --git a/doc/bugs/remote_gcrypt_based_repos_and_conflicting_uuids/comment_2_d81cb9b47dea34b639dc250bb231010a._comment b/doc/bugs/remote_gcrypt_based_repos_and_conflicting_uuids/comment_2_d81cb9b47dea34b639dc250bb231010a._comment
new file mode 100644
index 000000000..e3e744127
--- /dev/null
+++ b/doc/bugs/remote_gcrypt_based_repos_and_conflicting_uuids/comment_2_d81cb9b47dea34b639dc250bb231010a._comment
@@ -0,0 +1,16 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawnXybLxkPMYpP3yw4b_I6IdC3cKTD-xEdU"
+ nickname="Matt"
+ subject="comment 2"
+ date="2014-04-27T19:19:22Z"
+ content="""
+I'm having a pretty bad time with gcrypt based repos. Seemingly at random a `git-annex sync` will occasionally decide that the remote repo doesn't exist and then attempt to create a new one - it generates a new gcryptid and the repository seems lost.
+
+This sometimes happens after a good few hours of use, sometimes it happens immediately after creation (but maybe due to the fact that annexs are sullied by previous bad attempts). I've cleaned up making the repo dead, removing via `git remote` and editing the remote.log in the git-annex branch. No idea if that's enough.
+
+What do you need from me to try to sort this?
+
+Cheers,
+
+Matt.
+"""]]
diff --git a/doc/bugs/remote_gcrypt_based_repos_and_conflicting_uuids/comment_3_8df00f0ed4a26f702e0935b366521530._comment b/doc/bugs/remote_gcrypt_based_repos_and_conflicting_uuids/comment_3_8df00f0ed4a26f702e0935b366521530._comment
new file mode 100644
index 000000000..fd2e9f840
--- /dev/null
+++ b/doc/bugs/remote_gcrypt_based_repos_and_conflicting_uuids/comment_3_8df00f0ed4a26f702e0935b366521530._comment
@@ -0,0 +1,164 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawnXybLxkPMYpP3yw4b_I6IdC3cKTD-xEdU"
+ nickname="Matt"
+ subject="comment 3"
+ date="2014-04-29T03:00:59Z"
+ content="""
+Hi, I'm finally through trial and error am able to reproduce the bug...
+
+On OSX using version 5.20140420-ga25b8bb the creation of an gcrypt remote via initremote does not work properly. See the attached debug log for what happens - no errors but subsequent syncs fail and creates a new repo.
+
+Using linux and version 5.20140421-g515d251 to create the gcrypt does work without issue. Interestingly the OSX client will happily use the linux created repo without problem (at least it hasn't borked it yet). This suggests something up in the creation step. Perhaps this is fixed in the later version (see the other bug about the latest OSX upgrade having the older binary)? But I didn't see anything in the change log about it? But I did see the gcrypt script in the manifest now...
+
+<pre>~/iMovies $ git annex initremote isilon-2 type=gcrypt gitrepo=ssh://rss/home/matt/mnt/isilon/rss/zzalsmf3/git-annex/mov2 keyid=matt@dancingfrog.co.uk
+[2014-04-29 01:54:47 BST] read: git [\"--git-dir=/Volumes/Media/iTunes Media/Movies/.git\",\"--work-tree=/Volumes/Media/iTunes Media/Movies\",\"show-ref\",\"git-annex\"]
+[2014-04-29 01:54:47 BST] read: git [\"--git-dir=/Volumes/Media/iTunes Media/Movies/.git\",\"--work-tree=/Volumes/Media/iTunes Media/Movies\",\"show-ref\",\"--hash\",\"refs/heads/git-annex\"]
+[2014-04-29 01:54:47 BST] read: git [\"--git-dir=/Volumes/Media/iTunes Media/Movies/.git\",\"--work-tree=/Volumes/Media/iTunes Media/Movies\",\"log\",\"refs/heads/git-annex..3269adaaa41b42dab88399e8212d77301967f436\",\"--oneline\",\"-n1\"]
+git [2014-04-29 01:54:47 BST] read: git [\"--git-dir=/Volumes/Media/iTunes Media/Movies/.git\",\"--work-tree=/Volumes/Media/iTunes Media/Movies\",\"log\",\"refs/heads/git-annex..4dc8becdffd42c9af57e0d1007892516f2114c0e\",\"--oneline\",\"-n1\"]
+[2014-04-29 01:54:47 BST] read: git [\"--git-dir=/Volumes/Media/iTunes Media/Movies/.git\",\"--work-tree=/Volumes/Media/iTunes Media/Movies\",\"log\",\"refs/heads/git-annex..13d8993b7d9a89ea4198ec3edd63aa575745c64c\",\"--oneline\",\"-n1\"]
+[2014-04-29 01:54:47 BST] chat: git [\"--git-dir=/Volumes/Media/iTunes Media/Movies/.git\",\"--work-tree=/Volumes/Media/iTunes Media/Movies\",\"cat-file\",\"--batch\"]
+initremote isilon-2 (encryption setup) [2014-04-29 01:54:47 BST] read: gpg [\"--batch\",\"--no-tty\",\"--use-agent\",\"--quiet\",\"--trust-model\",\"always\",\"--with-colons\",\"--list-public-keys\",\"matt@dancingfrog.co.uk\"]
+[2014-04-29 01:54:47 BST] read: gpg [\"--batch\",\"--no-tty\",\"--use-agent\",\"--quiet\",\"--trust-model\",\"always\",\"--gen-random\",\"--armor\",\"2\",\"512\"]
+[2014-04-29 01:54:47 BST] chat: gpg [\"--batch\",\"--no-tty\",\"--use-agent\",\"--quiet\",\"--trust-model\",\"always\",\"--recipient\",\"68D8501429C42E01\",\"--encrypt\",\"--no-encrypt-to\",\"--no-default-recipient\",\"--force-mdc\",\"--no-textmode\"]
+(hybrid cipher with gpg key 68D8501429C42E01) [2014-04-29 01:54:47 BST] call: git [\"--git-dir=/Volumes/Media/iTunes Media/Movies/.git\",\"--work-tree=/Volumes/Media/iTunes Media/Movies\",\"remote\",\"add\",\"isilon-2\",\"gcrypt::ssh://rss/home/matt/mnt/isilon/rss/zzalsmf3/git-annex/mov2\"]
+[2014-04-29 01:54:47 BST] call: git [\"--git-dir=/Volumes/Media/iTunes Media/Movies/.git\",\"--work-tree=/Volumes/Media/iTunes Media/Movies\",\"config\",\"remote.isilon-2.gcrypt-participants\",\"68D8501429C42E01\"]
+[2014-04-29 01:54:47 BST] read: git [\"config\",\"--null\",\"--list\"]
+[2014-04-29 01:54:48 BST] read: gpg [\"--batch\",\"--no-tty\",\"--use-agent\",\"--quiet\",\"--trust-model\",\"always\",\"--with-colons\",\"--list-secret-keys\",\"--fixed-list-mode\"]
+[2014-04-29 01:54:48 BST] call: git [\"--git-dir=/Volumes/Media/iTunes Media/Movies/.git\",\"--work-tree=/Volumes/Media/iTunes Media/Movies\",\"config\",\"remote.isilon-2.gcrypt-signingkey\",\"68D8501429C42E01\"]
+[2014-04-29 01:54:48 BST] read: git [\"config\",\"--null\",\"--list\"]
+[2014-04-29 01:54:48 BST] call: git [\"--git-dir=/Volumes/Media/iTunes Media/Movies/.git\",\"--work-tree=/Volumes/Media/iTunes Media/Movies\",\"fetch\",\"isilon-2\"]
+gcrypt: Development version -- Repository format MAY CHANGE
+gcrypt: Repository not found: ssh://rss/home/matt/mnt/isilon/rss/zzalsmf3/git-annex/mov2
+[2014-04-29 01:54:49 BST] call: git [\"--git-dir=/Volumes/Media/iTunes Media/Movies/.git\",\"--work-tree=/Volumes/Media/iTunes Media/Movies\",\"push\",\"isilon-2\",\"refs/heads/git-annex\"]
+gcrypt: Development version -- Repository format MAY CHANGE
+gcrypt: Repository not found: ssh://rss/home/matt/mnt/isilon/rss/zzalsmf3/git-annex/mov2
+gcrypt: Setting up new repository
+gcrypt: Remote ID is :id:oWSdoSaFhKA19TcXRHPS
+Counting objects: 4170, done.
+Compressing objects: 100% (3113/3113), done.
+Total 4170 (delta 149), reused 146 (delta 3)
+gcrypt: Encrypting to: -R 68D8501429C42E01
+gcrypt: Requesting manifest signature
+
+You need a passphrase to unlock the secret key for
+user: \"Matt Ford (Work) <matt.ford@manchester.ac.uk>\"
+1024-bit DSA key, ID 29C42E01, created 2010-03-10
+
+gpg: 68D8501429C42E01: skipped: public key already present
+To gcrypt::ssh://rss/home/matt/mnt/isilon/rss/zzalsmf3/git-annex/mov2
+ * [new branch] git-annex -> git-annex
+[2014-04-29 01:54:52 BST] read: git [\"config\",\"--null\",\"--list\"]
+[2014-04-29 01:54:52 BST] call: ssh [\"-S\",\".git/annex/ssh/rss\",\"-o\",\"ControlMaster=auto\",\"-o\",\"ControlPersist=yes\",\"-T\",\"rss\",\"git-annex-shell 'gcryptsetup' '/home/matt/mnt/isilon/rss/zzalsmf3/git-annex/mov2' ':id:oWSdoSaFhKA19TcXRHPS'\"]
+ok
+[2014-04-29 01:54:53 BST] call: git [\"--git-dir=/Volumes/Media/iTunes Media/Movies/.git\",\"--work-tree=/Volumes/Media/iTunes Media/Movies\",\"config\",\"remote.isilon-2.annex-gcrypt\",\"shell\"]
+[2014-04-29 01:54:53 BST] call: git [\"--git-dir=/Volumes/Media/iTunes Media/Movies/.git\",\"--work-tree=/Volumes/Media/iTunes Media/Movies\",\"config\",\"remote.isilon-2.annex-uuid\",\"8fc5d933-d76f-5a61-b3a0-96b909e3f06c\"]
+ok
+[2014-04-29 01:54:53 BST] chat: git [\"--git-dir=/Volumes/Media/iTunes Media/Movies/.git\",\"--work-tree=/Volumes/Media/iTunes Media/Movies\",\"hash-object\",\"-w\",\"--stdin-paths\",\"--no-filters\"]
+[2014-04-29 01:54:53 BST] feed: git [\"--git-dir=/Volumes/Media/iTunes Media/Movies/.git\",\"--work-tree=/Volumes/Media/iTunes Media/Movies\",\"update-index\",\"-z\",\"--index-info\"]
+[2014-04-29 01:54:53 BST] read: git [\"--git-dir=/Volumes/Media/iTunes Media/Movies/.git\",\"--work-tree=/Volumes/Media/iTunes Media/Movies\",\"show-ref\",\"--hash\",\"refs/heads/git-annex\"]
+(Recording state in git...)
+[2014-04-29 01:54:53 BST] read: git [\"--git-dir=/Volumes/Media/iTunes Media/Movies/.git\",\"--work-tree=/Volumes/Media/iTunes Media/Movies\",\"write-tree\"]
+[2014-04-29 01:54:53 BST] chat: git [\"--git-dir=/Volumes/Media/iTunes Media/Movies/.git\",\"--work-tree=/Volumes/Media/iTunes Media/Movies\",\"commit-tree\",\"8c27761996045cb6daf7dc83920e15bfe0f2b2ed\",\"-p\",\"refs/heads/git-annex\"]
+[2014-04-29 01:54:53 BST] call: git [\"--git-dir=/Volumes/Media/iTunes Media/Movies/.git\",\"--work-tree=/Volumes/Media/iTunes Media/Movies\",\"update-ref\",\"refs/heads/git-annex\",\"0755de89ac06bb3babc73de294a550d9b62f39f1\"]
+[2014-04-29 01:54:53 BST] read: ssh [\"-O\",\"stop\",\"-S\",\"rss\",\"-o\",\"ControlMaster=auto\",\"-o\",\"ControlPersist=yes\",\"localhost\"]
+
+
+~/iMovies $ git annex sync
+[2014-04-29 01:57:55 BST] read: git [\"--git-dir=/Volumes/Media/iTunes Media/Movies/.git\",\"--work-tree=/Volumes/Media/iTunes Media/Movies\",\"show-ref\",\"git-annex\"]
+[2014-04-29 01:57:55 BST] read: git [\"--git-dir=/Volumes/Media/iTunes Media/Movies/.git\",\"--work-tree=/Volumes/Media/iTunes Media/Movies\",\"show-ref\",\"--hash\",\"refs/heads/git-annex\"]
+[2014-04-29 01:57:55 BST] read: git [\"--git-dir=/Volumes/Media/iTunes Media/Movies/.git\",\"--work-tree=/Volumes/Media/iTunes Media/Movies\",\"log\",\"refs/heads/git-annex..0755de89ac06bb3babc73de294a550d9b62f39f1\",\"--oneline\",\"-n1\"]
+[2014-04-29 01:57:55 BST] read: git [\"--git-dir=/Volumes/Media/iTunes Media/Movies/.git\",\"--work-tree=/Volumes/Media/iTunes Media/Movies\",\"log\",\"refs/heads/git-annex..4dc8becdffd42c9af57e0d1007892516f2114c0e\",\"--oneline\",\"-n1\"]
+[2014-04-29 01:57:55 BST] read: git [\"--git-dir=/Volumes/Media/iTunes Media/Movies/.git\",\"--work-tree=/Volumes/Media/iTunes Media/Movies\",\"log\",\"refs/heads/git-annex..3269adaaa41b42dab88399e8212d77301967f436\",\"--oneline\",\"-n1\"]
+[2014-04-29 01:57:55 BST] read: git [\"--git-dir=/Volumes/Media/iTunes Media/Movies/.git\",\"--work-tree=/Volumes/Media/iTunes Media/Movies\",\"log\",\"refs/heads/git-annex..13d8993b7d9a89ea4198ec3edd63aa575745c64c\",\"--oneline\",\"-n1\"]
+[2014-04-29 01:57:55 BST] chat: git [\"--git-dir=/Volumes/Media/iTunes Media/Movies/.git\",\"--work-tree=/Volumes/Media/iTunes Media/Movies\",\"cat-file\",\"--batch\"]
+commit [2014-04-29 01:57:55 BST] read: git [\"--git-dir=/Volumes/Media/iTunes Media/Movies/.git\",\"--work-tree=/Volumes/Media/iTunes Media/Movies\",\"commit\",\"-a\",\"-m\",\"git-annex automatic sync\"]
+ok
+[2014-04-29 01:57:55 BST] read: git [\"--git-dir=/Volumes/Media/iTunes Media/Movies/.git\",\"--work-tree=/Volumes/Media/iTunes Media/Movies\",\"symbolic-ref\",\"HEAD\"]
+[2014-04-29 01:57:55 BST] read: git [\"--git-dir=/Volumes/Media/iTunes Media/Movies/.git\",\"--work-tree=/Volumes/Media/iTunes Media/Movies\",\"show-ref\",\"refs/heads/master\"]
+[2014-04-29 01:57:55 BST] call: git [\"--git-dir=/Volumes/Media/iTunes Media/Movies/.git\",\"--work-tree=/Volumes/Media/iTunes Media/Movies\",\"show-ref\",\"--verify\",\"-q\",\"refs/heads/synced/master\"]
+[2014-04-29 01:57:55 BST] read: git [\"--git-dir=/Volumes/Media/iTunes Media/Movies/.git\",\"--work-tree=/Volumes/Media/iTunes Media/Movies\",\"log\",\"refs/heads/master..refs/heads/synced/master\",\"--oneline\",\"-n1\"]
+pull isilon
+[2014-04-29 01:57:55 BST] call: git [\"--git-dir=/Volumes/Media/iTunes Media/Movies/.git\",\"--work-tree=/Volumes/Media/iTunes Media/Movies\",\"fetch\",\"isilon\"]
+gcrypt: Development version -- Repository format MAY CHANGE
+gcrypt: Repository not found: ssh://rss/home/matt/mnt/isilon/rss/zzalsmf3/git-annex/mov
+[2014-04-29 01:57:56 BST] call: git [\"--git-dir=/Volumes/Media/iTunes Media/Movies/.git\",\"--work-tree=/Volumes/Media/iTunes Media/Movies\",\"show-ref\",\"--verify\",\"-q\",\"refs/remotes/isilon/master\"]
+[2014-04-29 01:57:56 BST] read: git [\"--git-dir=/Volumes/Media/iTunes Media/Movies/.git\",\"--work-tree=/Volumes/Media/iTunes Media/Movies\",\"log\",\"refs/heads/master..refs/remotes/isilon/master\",\"--oneline\",\"-n1\"]
+[2014-04-29 01:57:56 BST] call: git [\"--git-dir=/Volumes/Media/iTunes Media/Movies/.git\",\"--work-tree=/Volumes/Media/iTunes Media/Movies\",\"show-ref\",\"--verify\",\"-q\",\"refs/remotes/isilon/synced/master\"]
+[2014-04-29 01:57:56 BST] read: git [\"--git-dir=/Volumes/Media/iTunes Media/Movies/.git\",\"--work-tree=/Volumes/Media/iTunes Media/Movies\",\"log\",\"refs/heads/synced/master..refs/remotes/isilon/synced/master\",\"--oneline\",\"-n1\"]
+ok
+pull isilon-2
+[2014-04-29 01:57:57 BST] call: git [\"--git-dir=/Volumes/Media/iTunes Media/Movies/.git\",\"--work-tree=/Volumes/Media/iTunes Media/Movies\",\"fetch\",\"isilon-2\"]
+gcrypt: Development version -- Repository format MAY CHANGE
+gcrypt: Repository not found: ssh://rss/home/matt/mnt/isilon/rss/zzalsmf3/git-annex/mov2
+[2014-04-29 01:57:57 BST] call: git [\"--git-dir=/Volumes/Media/iTunes Media/Movies/.git\",\"--work-tree=/Volumes/Media/iTunes Media/Movies\",\"show-ref\",\"--verify\",\"-q\",\"refs/remotes/isilon-2/master\"]
+[2014-04-29 01:57:57 BST] call: git [\"--git-dir=/Volumes/Media/iTunes Media/Movies/.git\",\"--work-tree=/Volumes/Media/iTunes Media/Movies\",\"show-ref\",\"--verify\",\"-q\",\"refs/remotes/isilon-2/synced/master\"]
+ok
+[2014-04-29 01:57:57 BST] read: git [\"--git-dir=/Volumes/Media/iTunes Media/Movies/.git\",\"--work-tree=/Volumes/Media/iTunes Media/Movies\",\"show-ref\",\"git-annex\"]
+[2014-04-29 01:57:57 BST] read: git [\"--git-dir=/Volumes/Media/iTunes Media/Movies/.git\",\"--work-tree=/Volumes/Media/iTunes Media/Movies\",\"show-ref\",\"--hash\",\"refs/heads/git-annex\"]
+[2014-04-29 01:57:57 BST] read: git [\"--git-dir=/Volumes/Media/iTunes Media/Movies/.git\",\"--work-tree=/Volumes/Media/iTunes Media/Movies\",\"log\",\"refs/heads/git-annex..0755de89ac06bb3babc73de294a550d9b62f39f1\",\"--oneline\",\"-n1\"]
+[2014-04-29 01:57:58 BST] read: git [\"--git-dir=/Volumes/Media/iTunes Media/Movies/.git\",\"--work-tree=/Volumes/Media/iTunes Media/Movies\",\"log\",\"refs/heads/git-annex..4dc8becdffd42c9af57e0d1007892516f2114c0e\",\"--oneline\",\"-n1\"]
+[2014-04-29 01:57:58 BST] read: git [\"--git-dir=/Volumes/Media/iTunes Media/Movies/.git\",\"--work-tree=/Volumes/Media/iTunes Media/Movies\",\"log\",\"refs/heads/git-annex..3269adaaa41b42dab88399e8212d77301967f436\",\"--oneline\",\"-n1\"]
+[2014-04-29 01:57:58 BST] read: git [\"--git-dir=/Volumes/Media/iTunes Media/Movies/.git\",\"--work-tree=/Volumes/Media/iTunes Media/Movies\",\"log\",\"refs/heads/git-annex..13d8993b7d9a89ea4198ec3edd63aa575745c64c\",\"--oneline\",\"-n1\"]
+[2014-04-29 01:57:58 BST] call: git [\"--git-dir=/Volumes/Media/iTunes Media/Movies/.git\",\"--work-tree=/Volumes/Media/iTunes Media/Movies\",\"branch\",\"-f\",\"synced/master\"]
+[2014-04-29 01:57:58 BST] call: git [\"--git-dir=/Volumes/Media/iTunes Media/Movies/.git\",\"--work-tree=/Volumes/Media/iTunes Media/Movies\",\"show-ref\",\"--verify\",\"-q\",\"refs/remotes/isilon/synced/master\"]
+[2014-04-29 01:57:58 BST] read: git [\"--git-dir=/Volumes/Media/iTunes Media/Movies/.git\",\"--work-tree=/Volumes/Media/iTunes Media/Movies\",\"log\",\"refs/remotes/isilon/synced/master..refs/heads/synced/master\",\"--oneline\",\"-n1\"]
+[2014-04-29 01:57:58 BST] call: git [\"--git-dir=/Volumes/Media/iTunes Media/Movies/.git\",\"--work-tree=/Volumes/Media/iTunes Media/Movies\",\"show-ref\",\"--verify\",\"-q\",\"refs/remotes/isilon/git-annex\"]
+[2014-04-29 01:57:58 BST] read: git [\"--git-dir=/Volumes/Media/iTunes Media/Movies/.git\",\"--work-tree=/Volumes/Media/iTunes Media/Movies\",\"log\",\"refs/remotes/isilon/git-annex..git-annex\",\"--oneline\",\"-n1\"]
+push isilon
+[2014-04-29 01:57:58 BST] call: git [\"--git-dir=/Volumes/Media/iTunes Media/Movies/.git\",\"--work-tree=/Volumes/Media/iTunes Media/Movies\",\"push\",\"isilon\",\"+git-annex:synced/git-annex\",\"master:synced/master\"]
+gcrypt: Development version -- Repository format MAY CHANGE
+gcrypt: Repository not found: ssh://rss/home/matt/mnt/isilon/rss/zzalsmf3/git-annex/mov
+gcrypt: Setting up new repository
+gcrypt: Remote ID is :id:p4cHPeAFIRIvZTnm4UrK
+Counting objects: 5649, done.
+Compressing objects: 100% (4579/4579), done.
+Total 5649 (delta 151), reused 146 (delta 3)
+gcrypt: Encrypting to: -R 68D8501429C42E01
+gcrypt: Requesting manifest signature
+
+You need a passphrase to unlock the secret key for
+user: \"Matt Ford (Work) <matt.ford@manchester.ac.uk>\"
+1024-bit DSA key, ID 29C42E01, created 2010-03-10
+
+gpg: 68D8501429C42E01: skipped: public key already present
+To gcrypt::ssh://rss/home/matt/mnt/isilon/rss/zzalsmf3/git-annex/mov
+ * [new branch] git-annex -> synced/git-annex
+ * [new branch] master -> synced/master
+[2014-04-29 01:58:01 BST] read: git [\"--git-dir=/Volumes/Media/iTunes Media/Movies/.git\",\"--work-tree=/Volumes/Media/iTunes Media/Movies\",\"push\",\"isilon\",\"master\"]
+
+You need a passphrase to unlock the secret key for
+user: \"Matt Ford (Work) <matt.ford@manchester.ac.uk>\"
+1024-bit DSA key, ID 29C42E01, created 2010-03-10
+
+ok
+[2014-04-29 01:58:03 BST] call: git [\"--git-dir=/Volumes/Media/iTunes Media/Movies/.git\",\"--work-tree=/Volumes/Media/iTunes Media/Movies\",\"show-ref\",\"--verify\",\"-q\",\"refs/remotes/isilon-2/synced/master\"]
+push isilon-2
+[2014-04-29 01:58:03 BST] call: git [\"--git-dir=/Volumes/Media/iTunes Media/Movies/.git\",\"--work-tree=/Volumes/Media/iTunes Media/Movies\",\"push\",\"isilon-2\",\"+git-annex:synced/git-annex\",\"master:synced/master\"]
+gcrypt: Development version -- Repository format MAY CHANGE
+gcrypt: Repository not found: ssh://rss/home/matt/mnt/isilon/rss/zzalsmf3/git-annex/mov2
+gcrypt: Setting up new repository
+gcrypt: Remote ID is :id:wTHlCd+vFviIzoTDv2Xu
+Counting objects: 5649, done.
+Compressing objects: 100% (4579/4579), done.
+Total 5649 (delta 152), reused 146 (delta 3)
+gcrypt: Encrypting to: -R 68D8501429C42E01
+gcrypt: Requesting manifest signature
+
+You need a passphrase to unlock the secret key for
+user: \"Matt Ford (Work) <matt.ford@manchester.ac.uk>\"
+1024-bit DSA key, ID 29C42E01, created 2010-03-10
+
+gpg: 68D8501429C42E01: skipped: public key already present
+To gcrypt::ssh://rss/home/matt/mnt/isilon/rss/zzalsmf3/git-annex/mov2
+ * [new branch] git-annex -> synced/git-annex
+ * [new branch] master -> synced/master
+[2014-04-29 01:58:06 BST] read: git [\"--git-dir=/Volumes/Media/iTunes Media/Movies/.git\",\"--work-tree=/Volumes/Media/iTunes Media/Movies\",\"push\",\"isilon-2\",\"master\"]
+
+You need a passphrase to unlock the secret key for
+user: \"Matt Ford (Work) <matt.ford@manchester.ac.uk>\"
+1024-bit DSA key, ID 29C42E01, created 2010-03-10
+
+ok
+[2014-04-29 01:58:09 BST] read: ssh [\"-O\",\"stop\",\"-S\",\"rss\",\"-o\",\"ControlMaster=auto\",\"-o\",\"ControlPersist=yes\",\"localhost\"]
+</pre>
+"""]]
diff --git a/doc/bugs/ssh-askpass_locks_me_out_of_x_console.mdwn b/doc/bugs/ssh-askpass_locks_me_out_of_x_console.mdwn
new file mode 100644
index 000000000..ead8cc119
--- /dev/null
+++ b/doc/bugs/ssh-askpass_locks_me_out_of_x_console.mdwn
@@ -0,0 +1,25 @@
+### Please describe the problem.
+
+Can't access X console after returning to work overnight.
+
+### What steps will reproduce the problem?
+
+1. Create git-annex remote repository, with git annex assistance, connected via ssh, using ssh-agent key for authentication.
+2. "ssh-add -D" to delete the ssh key when not attending computer. Forget to kill git-annex assistant.
+3. Lock screen with xscreeensaver.
+4. Return to work. Unlock screen. Find keyboard and mouse not responding. However there are no dialog boxes on screen.
+5. Open up text console, kill the numerous ssh-askpass processes. Find more ssh-askpass processes. Kill the git-annex processes, then kill the ssh-askpass processes. Find I can access the x console again.
+
+### What version of git-annex are you using? On what operating system?
+
+Version 5.20140320~bpo70+1 in Debian backports.
+
+### Please provide any additional information below.
+
+This isn't git-annex's fault, but it is a serious problem with using git-annex assistant.
+
+Suspect ssh-askpass isn't displaying dialog properly as it conflicts with xscreensaver, which is running at the time.
+
+Not really sure what the solution is.
+
+Unfortunately, Out of time for today, will double check this report makes sense tomorrow.
diff --git a/doc/bugs/ssh-askpass_locks_me_out_of_x_console/comment_1_1def05a57e25b6765b881f22bc6d82a2._comment b/doc/bugs/ssh-askpass_locks_me_out_of_x_console/comment_1_1def05a57e25b6765b881f22bc6d82a2._comment
new file mode 100644
index 000000000..457d945d2
--- /dev/null
+++ b/doc/bugs/ssh-askpass_locks_me_out_of_x_console/comment_1_1def05a57e25b6765b881f22bc6d82a2._comment
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ ip="209.250.56.114"
+ subject="comment 1"
+ date="2014-05-01T13:56:32Z"
+ content="""
+This will be fixed by [[design/assistant/sshpassword]], assuming I make it bypass the OS's IMHO superior ssh-askpass and use its own.
+
+It would be better to file a bug on the actual program you had problems with though, which is not git-annex.
+"""]]
diff --git a/doc/bugs/ssh-askpass_locks_me_out_of_x_console/comment_2_cd4869faf350c81deb1de6fa25f32876._comment b/doc/bugs/ssh-askpass_locks_me_out_of_x_console/comment_2_cd4869faf350c81deb1de6fa25f32876._comment
new file mode 100644
index 000000000..80751a4da
--- /dev/null
+++ b/doc/bugs/ssh-askpass_locks_me_out_of_x_console/comment_2_cd4869faf350c81deb1de6fa25f32876._comment
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ ip="209.250.56.114"
+ subject="comment 2"
+ date="2014-05-01T14:04:12Z"
+ content="""
+Actually, no, that is only going to handle ssh password prompting the one time needed to set up a passwordless dedicated ssh key.
+
+It may be that it makes sense to *always* set up such a key, which would bypass the normal key handling, and so avoid this problem. Currently, the assumption is that if you have gone to the bother to already set up a login to a host, without a password being needed, it makes sense for the assistant to use that configuration.
+"""]]
diff --git a/doc/bugs/ssh_remote_sync_only_metadata___40__git-annex-shell_not_found__41__.mdwn b/doc/bugs/ssh_remote_sync_only_metadata___40__git-annex-shell_not_found__41__.mdwn
new file mode 100644
index 000000000..bc0c2d8c8
--- /dev/null
+++ b/doc/bugs/ssh_remote_sync_only_metadata___40__git-annex-shell_not_found__41__.mdwn
@@ -0,0 +1,45 @@
+### Please describe the problem.
+
+- Add remote ssh repository (from add more repositories menu)
+- Repos sync even files, but remote repo is marked (metadata only) - there is Fail on sync with this repository.
+
+The actual issue is that UUID was not found. I checked the logs and it's obvious that git-annex-shell was not found on the remote.
+
+### What steps will reproduce the problem?
+
+I have
+Linux box with (ZSH as a primary shell) where ~/.zshrc contains "export PATH=/path/to/annex:$PATH)
+MacOSX box with (ZSH as a primary shell) where ~/.zshrc and ~/.bash contains "export PATH=/path/to/annex:$PATH)
+
+The issue appears both directions.
+When I use ssh to connect remote host git-annex-shell is on PATH and works.
+
+I guess you don't have full shell context of the user.
+Worth to mention, that add remote repo (using a discovery - local computer) works well in the same repo.
+
+### What version of git-annex are you using? On what operating system?
+
+git-annex version 5.20140420-ga25b8bb
+
+### Please provide any additional information below.
+
+
+Can't find the original original log, but once repo created it contains "zsh:1: git-annex-shell not found" so it later switch repository to (metadata only) mode.
+
+This frequently repeat in the log:
+
+
+[[!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
+
+
+Please make sure you have the correct access rights
+and the repository exists.
+Permission denied, please try again.
+Permission denied, please try again.
+Permission denied (publickey,password).
+fatal: Could not read from remote repository.
+
+# End of transcript or log.
+"""]]
diff --git a/doc/bugs/ssh_remote_sync_only_metadata___40__git-annex-shell_not_found__41__/comment_1_6203563196a70b8356102a48927e4ccd._comment b/doc/bugs/ssh_remote_sync_only_metadata___40__git-annex-shell_not_found__41__/comment_1_6203563196a70b8356102a48927e4ccd._comment
new file mode 100644
index 000000000..cbfa962d0
--- /dev/null
+++ b/doc/bugs/ssh_remote_sync_only_metadata___40__git-annex-shell_not_found__41__/comment_1_6203563196a70b8356102a48927e4ccd._comment
@@ -0,0 +1,44 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawmTIL7ubr5opWM69Q5VtCxuxC2H0SSnzic"
+ nickname="Petr"
+ subject="Additional info"
+ date="2014-04-29T05:07:26Z"
+ content="""
+Not the above was done using git-annex webapp. I have also tried the same from cmdline with the same results:
+
+
+[[!format sh \"\"\"
+#Once remote added
+
+➜ test_move_bp git:(annex/direct/master) git annex enableremote macrepo
+zsh:1: command not found: git-annex-shell
+
+ Remote macrepo does not have git-annex installed; setting annex-ignore
+git-annex: Unknown special remote name.
+(No special remotes are currently known; perhaps use initremote instead?)
+
+
+#However the ssh works fine:
+
+➜ test_move_bp git:(annex/direct/master) ssh pmichalec@ape-mac-mini.local
+Last login: Tue Apr 29 06:19:29 2014
+➜ ~ which git-annex-shell
+/Applications/git-annex.app/Contents/MacOS/git-annex-shell
+➜ ~ /Applications/git-annex.app/Contents/MacOS/git-annex-shell
+git-annex-shell: bad parameters
+
+Usage: git-annex-shell [-c] command [parameters ...] [option ...]
+
+Plumbing commands:
+
+commit DIRECTORY commits any staged changes to the git-annex branch
+configlist DIRECTORY outputs relevant git configuration
+dropkey DIRECTORY KEY ... drops annexed content for specified keys
+gcryptsetup DIRECTORY VALUE sets up gcrypt repository
+inannex DIRECTORY KEY ... checks if keys are present in the annex
+notifychanges DIRECTORY sends notification when git refs are changed
+recvkey DIRECTORY KEY runs rsync in server mode to receive content
+sendkey DIRECTORY KEY runs rsync in server mode to send content
+transferinfo DIRECTORY KEY updates sender on number of bytes of content received
+\"\"\"]]
+"""]]
diff --git a/doc/bugs/ssh_remote_sync_only_metadata___40__git-annex-shell_not_found__41__/comment_2_cee9428c651e6574f93effed31d83fb9._comment b/doc/bugs/ssh_remote_sync_only_metadata___40__git-annex-shell_not_found__41__/comment_2_cee9428c651e6574f93effed31d83fb9._comment
new file mode 100644
index 000000000..b98420c83
--- /dev/null
+++ b/doc/bugs/ssh_remote_sync_only_metadata___40__git-annex-shell_not_found__41__/comment_2_cee9428c651e6574f93effed31d83fb9._comment
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ ip="209.250.56.114"
+ subject="comment 2"
+ date="2014-04-29T21:03:41Z"
+ content="""
+You need to fix your system so that git-annex-shell in in PATH automatically wheneven you ssh into it, and then it will work.
+
+I'm sorry, but I can't help you do so. I suggest you read the documentation for your login shell.
+"""]]
diff --git a/doc/bugs/ssh_remote_sync_only_metadata___40__git-annex-shell_not_found__41__/comment_3_9d8f9346b8c931815fa4967835b67560._comment b/doc/bugs/ssh_remote_sync_only_metadata___40__git-annex-shell_not_found__41__/comment_3_9d8f9346b8c931815fa4967835b67560._comment
new file mode 100644
index 000000000..03843c2a2
--- /dev/null
+++ b/doc/bugs/ssh_remote_sync_only_metadata___40__git-annex-shell_not_found__41__/comment_3_9d8f9346b8c931815fa4967835b67560._comment
@@ -0,0 +1,21 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawmTIL7ubr5opWM69Q5VtCxuxC2H0SSnzic"
+ nickname="Petr"
+ subject="SOLVED"
+ date="2014-04-29T21:42:39Z"
+ content="""
+You were right.
+When executed command over SSH it does not perform login (so .**rc files are not necessarily loaded).
+
+Zsh:
+.zprofile or rather .zshenv (is loaded, use these to set PATH)
+Note: .profile is not loaded at all (it's Bash stuff)
+
+Bash:
+.bashrc is said to be loaded but not .profile
+
+See:
+http://shreevatsa.wordpress.com/2008/03/30/zshbash-startup-files-loading-order-bashrc-zshrc-etc/
+http://superuser.com/questions/187639/zsh-not-hitting-profile
+https://wiki.archlinux.org/index.php/zsh
+"""]]
diff --git a/doc/design/assistant/sshpassword.mdwn b/doc/design/assistant/sshpassword.mdwn
index e38769867..0113144c5 100644
--- a/doc/design/assistant/sshpassword.mdwn
+++ b/doc/design/assistant/sshpassword.mdwn
@@ -10,3 +10,40 @@ 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.
+
+## ssh-askpass approach
+
+* If ssh-askpass is in PATH, or `SSH_ASKPASS` is set, do nothing.
+ (Unless webapp is run remotely.)
+* Otherwise, have the assistant set `SSH_ASKPASS` to a command that will
+ cause the webapp to read the password and forward it on. Also, set
+ DISPLAY to ensure that ssh runs the program.
+
+Looking at ssh.exe, I think this will even work on windows; it contains the
+code to run ssh-askpass.
+
+### securely handling the password
+
+* Maybe force upgrade webapp to https? Locally, the risk would be that
+ root could tcpdump and read password, so not large risk. If webapp
+ is being accessed remotely, absolutely: require https.
+* Use hs-securemem to store password.
+* Avoid storing password for long. Erase it after webapp setup of remote
+ is complete. Time out after 10 minutes and erase it.
+* Prompt using a html field name that does not trigger web browser password
+ saving if possible.
+
+### ssh-askpass shim, and password forwarding
+
+`SSH_ASKPASS` needs to be set to a program (probably git-annex)
+which gets the password from the webapp, and outputs it to stdout.
+
+Seems to call for the webapp and program to communicate over a local
+socket (locked down so only user can access) or environment.
+Environment is not as secure (easily snooped by root).
+Local socket probably won't work on Windows. Could just use a temp file.
+
+Note that the webapp can probe to see if ssh needs a password, and can
+prompt the user for it before running ssh and the ssh-askpass shim.
+This avoids some complexity, and perhaps some attack vectors,
+if the shim cannot requst an arbitrary password prompt.
diff --git a/doc/design/assistant/sshpassword/comment_1_24399abe0a0c1de271490ee15e064760._comment b/doc/design/assistant/sshpassword/comment_1_24399abe0a0c1de271490ee15e064760._comment
new file mode 100644
index 000000000..e71806fa2
--- /dev/null
+++ b/doc/design/assistant/sshpassword/comment_1_24399abe0a0c1de271490ee15e064760._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawnXybLxkPMYpP3yw4b_I6IdC3cKTD-xEdU"
+ nickname="Matt"
+ subject="comment 1"
+ date="2014-04-29T10:10:04Z"
+ content="""
+Can you do something similar for gpg-agent? Or do it instead with a ssh supported gpg-agent?
+"""]]
diff --git a/doc/design/assistant/syncing/efficiency.mdwn b/doc/design/assistant/syncing/efficiency.mdwn
index 7da721a2c..192dd6ecb 100644
--- a/doc/design/assistant/syncing/efficiency.mdwn
+++ b/doc/design/assistant/syncing/efficiency.mdwn
@@ -71,3 +71,24 @@ repositories have a non-git out of band signaling mechanism. This could,
for example, be used by laptopB to tell laptopA that it's trying to send
a file directly to laptopC. laptopA could then defer the upload to the
cloud for a while.
+
+## syncing only requested content
+
+In some situations, nodes only want particular files, and not everything.
+(Or don't have the bandwidth to get everything.) A way to handle this,
+that should work in a fully ad-hoc, offline distributed network,
+suggested by Vincenzo Tozzi:
+
+* Nodes generate a request for a specific file they want, committed
+ to git somewhere.
+* This request has a TTL (of eg 3).
+* When syncing, copy the requests that a node has, and decrease their TTL
+ by 1. Requests with a TTL of 0 have timed out and are not copied.
+ (So, requests are stored in git, but on eg, per-node branches.)
+* Only copy content to nodes that have a request for it (either one
+ originating with them, or one they copied from another node).
+* Each request indicates the requesting node, so once no nodes have an
+ active request for a particular file, it's ok to drop it from the
+ transfer nodes (honoring numcopies etc of course).
+
+A simulation of a network using this method is in [[simroutes.hs]]
diff --git a/doc/design/assistant/syncing/simroutes.hs b/doc/design/assistant/syncing/simroutes.hs
new file mode 100644
index 000000000..322ecf4fe
--- /dev/null
+++ b/doc/design/assistant/syncing/simroutes.hs
@@ -0,0 +1,250 @@
+-- Simulation of non-flood syncing of content, across a network of nodes.
+
+module Main where
+
+import System.Random
+import Control.Monad.Random
+import Control.Monad
+import Control.Applicative
+import Data.Ratio
+import Data.Ord
+import Data.List
+import qualified Data.Set as S
+
+{-
+ - Tunable values
+ -}
+
+totalFiles :: Int
+totalFiles = 10
+
+-- How likely is a given file to be wanted by any particular node?
+probabilityFilesWanted :: Probability
+probabilityFilesWanted = 0.10
+
+-- How many different locations can each transfer node move between?
+-- (Min, Max)
+transferDestinationsRange :: (Int, Int)
+transferDestinationsRange = (2, 5)
+
+-- Controls how likely transfer nodes are to move around in a given step
+-- of the simulation.
+-- (They actually move slightly less because they may start to move and
+-- pick the same location they are at.)
+-- (Min, Max)
+transferMoveFrequencyRange :: (Probability, Probability)
+transferMoveFrequencyRange = (0.10, 1.00)
+
+-- counts both immobile and transfer nodes as hops, so double Vince's
+-- theoretical TTL of 3.
+maxTTL :: TTL
+maxTTL = TTL 6
+
+minTTL :: TTL
+minTTL = TTL 1
+
+numImmobileNodes :: Int
+numImmobileNodes = 10
+
+numTransferNodes :: Int
+numTransferNodes = 20
+
+numSteps :: Int
+numSteps = 100
+
+-- IO code
+main = putStrLn . summarize =<< evalRandIO (simulate numSteps =<< genNetwork)
+-- Only pure code below :)
+
+data Network = Network [ImmobileNode] [TransferNode]
+ deriving (Show, Eq)
+
+data ImmobileNode = ImmobileNode NodeRepo
+ deriving (Show, Eq)
+
+-- Index in the Network's list of ImmobileNodes.
+type ImmobileNodeIdx = Int
+
+data TransferNode = TransferNode
+ { currentlocation :: ImmobileNodeIdx
+ , possiblelocations :: [ImmobileNodeIdx]
+ , movefrequency :: Probability
+ , transferrepo :: NodeRepo
+ }
+ deriving (Show, Eq)
+
+data NodeRepo = NodeRepo
+ { wantFiles :: [Request]
+ , haveFiles :: S.Set File
+ }
+ deriving (Show, Eq)
+
+data File = File Int
+ deriving (Show, Eq, Ord)
+
+randomFile :: (RandomGen g) => Rand g File
+randomFile = File <$> getRandomR (0, totalFiles)
+
+data Request = Request File TTL
+ deriving (Show)
+
+-- compare ignoring TTL
+instance Eq Request where
+ (Request f1 _) == (Request f2 _) = f1 == f2
+
+requestedFile :: Request -> File
+requestedFile (Request f _) = f
+
+requestTTL :: Request -> TTL
+requestTTL (Request _ ttl) = ttl
+
+data TTL = TTL Int
+ deriving (Show, Eq, Ord)
+
+incTTL :: TTL -> TTL
+incTTL (TTL t) = TTL (t + 1)
+
+decTTL :: TTL -> TTL
+decTTL (TTL t) = TTL (t - 1)
+
+staleTTL :: TTL -> Bool
+staleTTL (TTL t) = t < 1
+
+-- Origin of a request starts one higher than max, since the TTL
+-- will decrement the first time the Request is transferred to another node.
+originTTL :: TTL
+originTTL = incTTL maxTTL
+
+randomRequest :: (RandomGen g) => Rand g Request
+randomRequest = Request
+ <$> randomFile
+ <*> pure originTTL
+
+type Probability = Float
+
+randomProbability :: (RandomGen g) => Rand g Probability
+randomProbability = getRandomR (0, 1)
+
+simulate :: (RandomGen g) => Int -> Network -> Rand g Network
+simulate 0 net = return net
+simulate c net = simulate (c - 1) =<< step net
+
+-- Each step of the simulation, check if each TransferNode wants to move,
+-- and if so:
+-- 1. It and its current location exchange their Requests.
+-- 2. And they exchange any requested files.
+-- 3. Move it to a new random location.
+--
+-- Note: This implementation does not exchange requests between two
+-- TransferNodes that both arrive at the same location at the same step,
+-- and then move away in the next step.
+step :: (RandomGen g) => Network -> Rand g Network
+step (Network immobiles transfers) = go immobiles [] transfers
+ where
+ go is c [] = return (Network is c)
+ go is c (t:ts) = do
+ r <- randomProbability
+ if movefrequency t <= r
+ then do
+ let (is1, (currentloc:is2)) = splitAt (currentlocation t) is
+ let (currentloc', t') = exchangeRequestsFiles currentloc t
+ t'' <- move t'
+ go (is1 ++ currentloc' : is2) (c ++ [t'']) ts
+ else go is (c ++ [t]) ts
+
+type Exchanger = ImmobileNode -> TransferNode -> (ImmobileNode, TransferNode)
+
+exchangeRequestsFiles :: Exchanger
+exchangeRequestsFiles (ImmobileNode ir) t@(TransferNode { transferrepo = tr }) =
+ ( ImmobileNode (go ir tr)
+ , t { transferrepo = go tr ir }
+ )
+ where
+ go r1 r2 = r1
+ { wantFiles = foldr addRequest (wantFiles r1) (wantFiles r2)
+ , haveFiles = S.foldr (addFile (wantFiles r1)) (haveFiles r1) (haveFiles r2)
+ }
+
+-- Adds a file to the set, when there's a request for it.
+addFile :: [Request] -> File -> S.Set File -> S.Set File
+addFile rs f fs
+ | any (\r -> f == requestedFile r) rs = S.insert f fs
+ | otherwise = fs
+
+-- Decrements TTL, and avoids adding request with a stale TTL, or a
+-- request for an already added file with the same or a lower TTL.
+addRequest :: Request -> [Request] -> [Request]
+addRequest (Request f ttl) rs
+ | staleTTL ttl' = rs
+ | any (\r -> requestTTL r >= ttl) similar = rs
+ | otherwise = r' : other
+ where
+ ttl' = decTTL ttl
+ r' = Request f ttl'
+ (other, similar) = partition (/= r') rs
+
+move :: (RandomGen g) => TransferNode -> Rand g TransferNode
+move t = do
+ newloc <- randomfrom (possiblelocations t)
+ return $ t { currentlocation = newloc }
+
+genNetwork :: (RandomGen g) => Rand g Network
+genNetwork = do
+ immobiles <- sequence (replicate numImmobileNodes mkImmobile)
+ transfers <- sequence (replicate numTransferNodes (mkTransfer immobiles))
+ return $ Network immobiles transfers
+
+mkImmobile :: (RandomGen g) => Rand g ImmobileNode
+mkImmobile = ImmobileNode <$> genrepo
+ where
+ genrepo = NodeRepo
+ -- The files this node wants.
+ -- Currently assumes each file is equally popular.
+ <$> sequence (replicate (truncate (fromIntegral totalFiles * probabilityFilesWanted)) randomRequest)
+ -- The files this node already has.
+ --
+ -- We'll assume equal production, so split the total
+ -- number of files amoung the immobile nodes.
+ -- (This will produce some duplication of files
+ -- (consider birthday paradox), and some missing files.)
+ --
+ -- TODO: Some immobile nodes are internet connected,
+ -- and these should all share their files automatically)
+ -- (Also when running the sim.)
+ <*> (S.fromList <$> sequence (replicate (totalFiles `div` numImmobileNodes) randomFile))
+
+mkTransfer :: (RandomGen g) => [ImmobileNode] -> Rand g TransferNode
+mkTransfer immobiles = do
+ -- Transfer nodes are given random routes. May be simplistic.
+ -- Also, some immobile nodes will not be serviced by any transfer nodes.
+ numpossiblelocs <- getRandomR transferDestinationsRange
+ possiblelocs <- sequence (replicate numpossiblelocs (randomfrom indexes))
+ currentloc <- randomfrom possiblelocs
+ movefreq <- getRandomR transferMoveFrequencyRange
+ -- transfer nodes start out with no files or requests in their repo
+ let repo = (NodeRepo [] S.empty)
+ return $ TransferNode currentloc possiblelocs movefreq repo
+ where
+ indexes = [0..length immobiles - 1]
+
+randomfrom :: (RandomGen g) => [a] -> Rand g a
+randomfrom l = do
+ i <- getRandomR (1, length l)
+ return $ l !! (i - 1)
+
+summarize :: Network -> String
+summarize (Network is _ts) = unlines $ map (\(d, s) -> d ++ ": " ++ s)
+ [ ("Total wanted files",
+ show (sum (overis (length . findoriginreqs . wantFiles . repo))))
+ , ("Wanted files that were not transferred to requesting node",
+ show (sum (overis (S.size . findunsatisfied . repo))))
+ --, ("List of files not transferred", show unsatisfied)
+ , ("Immobile nodes at end", show is)
+ ]
+ where
+ findoriginreqs = filter (\r -> requestTTL r == originTTL)
+ findunsatisfied r =
+ let wantedfs = S.fromList $ map requestedFile (findoriginreqs (wantFiles r))
+ in S.difference wantedfs (haveFiles r)
+ repo (ImmobileNode r) = r
+ overis f = map f is
diff --git a/doc/design/metadata/comment_6_fa51ae544b193122334dbae7960ab3d9._comment b/doc/design/metadata/comment_6_fa51ae544b193122334dbae7960ab3d9._comment
new file mode 100644
index 000000000..7be49a6a9
--- /dev/null
+++ b/doc/design/metadata/comment_6_fa51ae544b193122334dbae7960ab3d9._comment
@@ -0,0 +1,15 @@
+[[!comment format=mdwn
+ username="tdussa"
+ ip="217.84.74.69"
+ subject="Why not automatically add the whole date?"
+ date="2014-04-30T20:41:20Z"
+ content="""
+Hi,
+
+apologies if I am missing something, but from what I understand, git-annex will automatically add the year and the month from a file's mtime to its metadata if instructed to do so.
+
+So... What about the day (or the time, for that matter?)? What is the reasoning behind the decision not to add those bits automatically? And, is there a way to get git-annex to add those bits of information automatically as well (besides the obvious way of creating a pre-commit-hook script to that effect)?
+
+THX & Cheers,
+Toby.
+"""]]
diff --git a/doc/design/roadmap.mdwn b/doc/design/roadmap.mdwn
index b7c48830d..1ae46a46f 100644
--- a/doc/design/roadmap.mdwn
+++ b/doc/design/roadmap.mdwn
@@ -6,13 +6,13 @@ Now in the
* Month 1 [[!traillink assistant/encrypted_git_remotes]]
* Month 2 [[!traillink assistant/disaster_recovery]]
-* Month 3 user-driven features and polishing [[!traillink todo/direct_mode_guard]] [[!traillink assistant/upgrading]]
+* Month 3 [[!traillink todo/direct_mode_guard]] [[!traillink assistant/upgrading]]
* Month 4 [[!traillink assistant/windows text="Windows webapp"]], Linux arm, [[!traillink todo/support_for_writing_external_special_remotes]]
* Month 5 user-driven features and polishing
* Month 6 get Windows out of beta, [[!traillink design/metadata text="metadata and views"]]
* Month 7 user-driven features and polishing
-* **Month 8 [[!traillink git-remote-daemon]] [[!traillink assistant/telehash]]**
-* Month 9 [[!traillink assistant/gpgkeys]] [[!traillink assistant/sshpassword]]
+* **Month 8 [[!traillink git-remote-daemon]]**
+* Month 9 Brazil!, [[!traillink assistant/sshpassword]]
* Month 10 get [[assistant/Android]] out of beta
-* Month 11 [[!traillink assistant/chunks]] [[!traillink assistant/deltas]]
-* Month 12 user-driven features and polishing
+* Month 11 [[!traillink assistant/chunks]], [[!traillink assistant/deltas]], [[!traillink assistant/gpgkeys]] (pick 2?)
+* Month 12 [[!traillink assistant/telehash]]
diff --git a/doc/devblog/day_156__release_day.mdwn b/doc/devblog/day_156__release_day.mdwn
new file mode 100644
index 000000000..7a312b234
--- /dev/null
+++ b/doc/devblog/day_156__release_day.mdwn
@@ -0,0 +1,14 @@
+I hope this will be a really good release. Didn't get all the way to
+[[design/assistant/telehash]] this month, but the remotedaemon is pretty sweet. Updated [[design/roadmap]]
+pushes telehash back again.
+
+The files in this release are now gpg signed, after recently moving the
+downloads site to a dedicated server, which has a dedicated gpg key.
+You can verify the detached signatures as an additional security check
+over trusting SSL. The automatic upgrade code doesn't check the gpg
+signatures yet.
+
+Sören Brunk has ported the webapp to Bootstrap 3.
+<https://github.com/brunksn/git-annex/tree/bootstrap3>
+The branch is not ready for merging yet (it would break the Debian stable
+backports), but that was a nice surprise.
diff --git a/doc/devblog/day_157__upgrade_checking.mdwn b/doc/devblog/day_157__upgrade_checking.mdwn
new file mode 100644
index 000000000..ff70b8093
--- /dev/null
+++ b/doc/devblog/day_157__upgrade_checking.mdwn
@@ -0,0 +1,22 @@
+Now git-annex's self-upgrade code will check the gpg signature of a
+new version before using it.
+
+To do this I had to include the gpg public keys into the
+git-annex distribution, and that raised the question of which public keys
+to include. Currently I have both the dedicated git-annex distribution
+signing key, and my own gpg key as a backup in case I somehow misplace the
+former.
+
+Also spent a while looking at the recent logs on the web server. There
+seem to be around 600 users of the assistant with
+upgrade checking enabled. That breaks down to 68% Linux amd64, 20% Linux
+i386, 11% OSX Mavericks, and 0.5% OSX Lion.
+
+Most are upgrading successfully, but there are a few that seem to
+repeatedly fail for some reason. (Not counting the OSX Lion, which will
+probably never find an upgrade available.) I hope that someone who is
+experiencing an upgrade failure gets in touch with some debug logs.
+
+In the same time period, around 450 unique hosts manually downloaded a
+git-anex distribution. Also compare with Debian popcon, which has 1200
+reporting git-annex users.
diff --git a/doc/devblog/day_158__enroute_to_Brazil.mdwn b/doc/devblog/day_158__enroute_to_Brazil.mdwn
new file mode 100644
index 000000000..cd9830f2e
--- /dev/null
+++ b/doc/devblog/day_158__enroute_to_Brazil.mdwn
@@ -0,0 +1,10 @@
+Next month the roadmap has me working on [[design/assistant/sshpassword]].
+That will be a nice UI improvement and I'd be very surprised if it takes
+more than a week, which is great.
+
+Getting a jump on it today, investigating using `SSH_ASKPASS`. It seems this
+will even work on Windows! Preliminary design in [[design/assistant/sshpassword]].
+
+Time to get on a plane to a plane to a plane to Brasilia!
+
+[[!meta date="Fri, 25 Apr 2014 16:32:36 -0400"]]
diff --git a/doc/devblog/day_159__tmp_file_cleanup.mdwn b/doc/devblog/day_159__tmp_file_cleanup.mdwn
new file mode 100644
index 000000000..d1ef58109
--- /dev/null
+++ b/doc/devblog/day_159__tmp_file_cleanup.mdwn
@@ -0,0 +1,12 @@
+Today was mostly spent driving across Brazil, but I had energy this evening
+for a little work on git-annex.
+
+Made the assistant delete old temporary files on startup. I've had
+scattered reports of a few users whose `.git/annex/tmp` contained many
+files, apparently put there by the assistant when it locks down a file
+prior to annexing it. That seems it could possibly be a bug -- or it could
+just be unclean shutdowns interrupting the assistant. Anyway, this will
+deal with any source of tmp cruft, and I made sure to preserve
+tmp files for partially downloaded content.
+
+[[!meta date="Sun, 27 Apr 2014 22:12:55 -0300"]]
diff --git a/doc/devblog/day_160__.mdwn b/doc/devblog/day_160__.mdwn
new file mode 100644
index 000000000..2c20d2f0d
--- /dev/null
+++ b/doc/devblog/day_160__.mdwn
@@ -0,0 +1,20 @@
+Reviewed Sören's updated bootstrap3 patch, which appeared while I was
+[traveling](http://joeyh.name/blog/entry/the_real_Brazil/). Sören
+kindly fixed it to work with Debian stable's old version of Yesod,
+which was quite a lot of work. The new new bootstrap3 UI looks nice,
+found a few minor issues, but expect to be able to merge it soon.
+
+Started on [[design/assistant/sshpassword]] groundwork. Added a simple
+password cache to the assistant, with automatic expiration, and made
+git-annex be able to be run by ssh as the `SSH_ASKPASS` program.
+
+The main difficulty will be changing the webapp's UI to prompt for the ssh
+password when one is needed. There are several code paths in ssh remote
+setup where a password might be needed. Since the cached password expires,
+it may need to be prompted for at any of those points. Since a new page is
+loading, it can't pop up a prompt on the current page; it needs to redirect
+to a password prompt page and then redirect back to the action that needed
+the password. ...At least, that's one way to do it.
+I'm going to sleep on it and hope I dream up a better way.
+
+[[!meta date="Tue, 29 Apr 2014 18:33:53 -0400"]]
diff --git a/doc/devblog/day_161__routing_design.mdwn b/doc/devblog/day_161__routing_design.mdwn
new file mode 100644
index 000000000..9c9e65d17
--- /dev/null
+++ b/doc/devblog/day_161__routing_design.mdwn
@@ -0,0 +1,13 @@
+I've moved out of implementation mode (unable to concentrate enough), and
+into high-level design mode.
+
+[[Syncing efficiency|design/assistant/syncing/efficiency]] has been an open TODO for years,
+to find a way to avoid flood filling the network, and find more efficient
+ways to ensure data only gets to the nodes that want it. Relatedly,
+Android devices often need a way to mark individual files they want to have.
+Had a [very productive discussion with Vince and Fernao](http://joeyh.name/blog/entry/who_needs_whiteboards_when_you_have_strange_seed_pods_from_the_jungle/)
+and I think we're heading toward a design that will address both these
+needs, as well as some more Brazil-specific use cases, about which more
+later.
+
+Today's work was sponsored by Casa do Boneco.
diff --git a/doc/forum/Checking_for_missing_files_in_S3___40__reduced_redundancy__41__.mdwn b/doc/forum/Checking_for_missing_files_in_S3___40__reduced_redundancy__41__.mdwn
new file mode 100644
index 000000000..97299a966
--- /dev/null
+++ b/doc/forum/Checking_for_missing_files_in_S3___40__reduced_redundancy__41__.mdwn
@@ -0,0 +1,5 @@
+I would like to use git-annex with [S3 reduced redundancy storace (RRS)](https://aws.amazon.com/s3/faqs/#rrs_anchor), a cheaper S3 service with an higher chance of seeing your files disappear overnight. This means that git-annex may think that a certain files has been copied to a S3 remote while, in fact, it is no longer there.
+
+I would like to check that the files S3 are really there and, if some files are not, record that we lost that copy. In the case of S3, either the data is there and it is complete or it is not there at all, so there is no need to check the data itself, just the presence of the files.
+
+Is there a way to check that all the files that are supposed to be in a S3 remote are still there?
diff --git a/doc/forum/Checking_for_missing_files_in_S3___40__reduced_redundancy__41__/comment_2_793b3d9f78562f3aecf27dd926bbcf82._comment b/doc/forum/Checking_for_missing_files_in_S3___40__reduced_redundancy__41__/comment_2_793b3d9f78562f3aecf27dd926bbcf82._comment
new file mode 100644
index 000000000..404ba8b87
--- /dev/null
+++ b/doc/forum/Checking_for_missing_files_in_S3___40__reduced_redundancy__41__/comment_2_793b3d9f78562f3aecf27dd926bbcf82._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ ip="209.250.56.114"
+ subject="comment 2"
+ date="2014-04-24T18:12:59Z"
+ content="""
+git annex fsck --fast --from $yours3remote
+"""]]
diff --git a/doc/forum/Checkout_only_some_files_with_the_assistant.mdwn b/doc/forum/Checkout_only_some_files_with_the_assistant.mdwn
new file mode 100644
index 000000000..7a2270d92
--- /dev/null
+++ b/doc/forum/Checkout_only_some_files_with_the_assistant.mdwn
@@ -0,0 +1,14 @@
+Hi,
+
+I really like git-annex for sharing contents with all my devices. But i have a problem with the assistant on my phone, i don't know how to git annex get some file but not all.
+For example i have this on a remote:
+
+repository:
+ - big file1
+ - big file2
+ - big file3
+
+I have this repository on my phone. I would like to be able to checkout out only "big file2" directly within the assistant.
+How can i achieve that?
+
+Thank you.
diff --git a/doc/forum/Checkout_only_some_files_with_the_assistant/comment_1_23d8ab1a05e3e9d3611bd12a4ba70b0c._comment b/doc/forum/Checkout_only_some_files_with_the_assistant/comment_1_23d8ab1a05e3e9d3611bd12a4ba70b0c._comment
new file mode 100644
index 000000000..85325c60c
--- /dev/null
+++ b/doc/forum/Checkout_only_some_files_with_the_assistant/comment_1_23d8ab1a05e3e9d3611bd12a4ba70b0c._comment
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ ip="209.250.56.114"
+ subject="comment 1"
+ date="2014-04-24T18:15:15Z"
+ content="""
+[[preferred_content]] expressions can be used to do that. Works best if all the files you want have some extension or are in a specific directory.
+
+There are some [[preferred_content/standard_groups]] that might do what you want, particularly the \"manual\" one.
+"""]]
diff --git a/doc/forum/Checkout_only_some_files_with_the_assistant/comment_2_bf095ff5b5af95b062ae1f7da566a279._comment b/doc/forum/Checkout_only_some_files_with_the_assistant/comment_2_bf095ff5b5af95b062ae1f7da566a279._comment
new file mode 100644
index 000000000..cf35f3541
--- /dev/null
+++ b/doc/forum/Checkout_only_some_files_with_the_assistant/comment_2_bf095ff5b5af95b062ae1f7da566a279._comment
@@ -0,0 +1,12 @@
+[[!comment format=mdwn
+ username="elfangor"
+ ip="176.57.244.101"
+ subject="comment 2"
+ date="2014-04-28T13:12:07Z"
+ content="""
+Thanks for your reply.
+
+The Standard group \"manual\" seems to be what i need. The last thing i'd like to now is, is there a way to do git annex get on the assistant(on the webui) on my phone? (I know i can do this on the shell opened, but it's not that easy to write from the phone.) I guess it's not implemented, and i understand that it should be a lot of work to add a file browser in the ui where you can git annex get, and git annex add from it.
+
+Thanks again for your answer, really helpfull: I have a better idea on how i will structur my git annex repositories.
+"""]]
diff --git a/doc/forum/Distributing_data_to_a_set_of_drives.mdwn b/doc/forum/Distributing_data_to_a_set_of_drives.mdwn
new file mode 100644
index 000000000..406379715
--- /dev/null
+++ b/doc/forum/Distributing_data_to_a_set_of_drives.mdwn
@@ -0,0 +1 @@
+Here is my situation, Say I have a repo that is 3 TBs (lets call this repo A has full copy of everything.) and I have 3 other drives all 1 TB each lets call them B C D, then I have partial checkouts on my laptops D E. What I would like to do is, have two copies of all files in A and BCD I would like to threat BCD as a group acting like a single repo so A distributes files evenly to drives in group BCD. I also want copies in D and E to not count towards num of files. As for the latter even though I set D and E as untrusted annex still counts copies on those repos If a get a file in D assistant drops a copy from one of the trusted repos A or BCD I have to move it back instead of just dropping it. Also How can I or is it possible to set BCD to act as a group so A distributes files among drives currently I can do this using find/get but it turns it into a math problem every time a add a file to A I have to manually check which disk has most space navigate to it check files with less copies then 2 and get them.
diff --git a/doc/forum/Encrypted_Content_Remote_Daemon_.mdwn b/doc/forum/Encrypted_Content_Remote_Daemon_.mdwn
new file mode 100644
index 000000000..614d27688
--- /dev/null
+++ b/doc/forum/Encrypted_Content_Remote_Daemon_.mdwn
@@ -0,0 +1 @@
+I am currently using rsync.net to keep my notes in sync, both git repo and the content (gpg encrypted) is stored there. Instead of creating two other repos on a server that I have which has git-annex installed where I can actually use remote daemon. Is it possible to create a repo containing both the git repo and the content encrypted from the command line?
diff --git a/doc/forum/Encrypted_Content_Remote_Daemon_/comment_1_96f63e509e23c081c48302274e21db78._comment b/doc/forum/Encrypted_Content_Remote_Daemon_/comment_1_96f63e509e23c081c48302274e21db78._comment
new file mode 100644
index 000000000..eb97c2680
--- /dev/null
+++ b/doc/forum/Encrypted_Content_Remote_Daemon_/comment_1_96f63e509e23c081c48302274e21db78._comment
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ ip="209.250.56.114"
+ subject="comment 1"
+ date="2014-04-27T00:31:18Z"
+ content="""
+Why not go all the way and encrypt the git repository stored on the remote server too? [[special_remotes/gcrypt]]
+
+When you have git-annex-shell installed on the remote server, the remote daemon should work for gcrypt repositories as well as normal non-encrypted git repositories.
+"""]]
diff --git a/doc/forum/Encrypted_Content_Remote_Daemon_/comment_2_acd0ffdc3f5079265858073c2af81557._comment b/doc/forum/Encrypted_Content_Remote_Daemon_/comment_2_acd0ffdc3f5079265858073c2af81557._comment
new file mode 100644
index 000000000..a699ad640
--- /dev/null
+++ b/doc/forum/Encrypted_Content_Remote_Daemon_/comment_2_acd0ffdc3f5079265858073c2af81557._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="https://me.yahoo.com/a/FHnTlSBo1eCGJRwueeKeB6.RCaPbGMPr5jxx8A--#ce0d8"
+ nickname="Hamza"
+ subject="comment 2"
+ date="2014-04-28T09:14:12Z"
+ content="""
+I would love to use gcrypt and I tried it but the problem is at every sync it will ask for my pass phrase even though the key used to encrypt the repo is pass phrase less it goes through the keys in my keychain and asks me to unlock all my keys one by one.
+"""]]
diff --git a/doc/forum/OSX__39__s_default_sshd_behaviour_has_limited_paths_set/comment_1_a136ff877389f0930c066ba118edd9fd._comment b/doc/forum/OSX__39__s_default_sshd_behaviour_has_limited_paths_set/comment_1_a136ff877389f0930c066ba118edd9fd._comment
new file mode 100644
index 000000000..0cbf79c8d
--- /dev/null
+++ b/doc/forum/OSX__39__s_default_sshd_behaviour_has_limited_paths_set/comment_1_a136ff877389f0930c066ba118edd9fd._comment
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ ip="209.250.56.114"
+ subject="comment 1"
+ date="2014-04-24T18:08:00Z"
+ content="""
+If you use git-annex from the OSX .dmg, it will set up a ~/.ssh/git-annex-shell, which is the only command that is needed when git-annex is using an OSX server as a remote. Since version 5.20140421, the webapp will also use ~/.ssh/git-annex-wrapper, which the .dmg also sets up, to run some commands like git.
+
+The upshot is that this should not affect git-annex when installed from the .dmg on the OSX server. If you build git-annex from source yourself, you do need to make sure that it and git end up in PATH.
+"""]]
diff --git a/doc/forum/Problems_using_submodules_with_git-annex__63__/comment_2_26f6581b5969eb2cb77495c40de88951._comment b/doc/forum/Problems_using_submodules_with_git-annex__63__/comment_2_26f6581b5969eb2cb77495c40de88951._comment
new file mode 100644
index 000000000..a9e939834
--- /dev/null
+++ b/doc/forum/Problems_using_submodules_with_git-annex__63__/comment_2_26f6581b5969eb2cb77495c40de88951._comment
@@ -0,0 +1,11 @@
+[[!comment format=mdwn
+ username="http://mildred.fr/"
+ nickname="Mildred"
+ subject="submodules with git-annex in direct mode"
+ date="2014-04-27T14:05:20Z"
+ content="""
+Does this work well even with direct mode ?
+How is this managed in direct mode ?
+
+Coming back from direct mode to indirect mode (required when I want to run git commands) I found that the .gitmodules file was an annex symlink (to .git/annex/objects/...). I just recovered from corrupt repository and may have made mistakes, but is this a risk under normal curcumstances ?
+"""]]
diff --git a/doc/forum/differenc_in_webapp_icons__63__.mdwn b/doc/forum/differenc_in_webapp_icons__63__.mdwn
new file mode 100644
index 000000000..3b4f355a1
--- /dev/null
+++ b/doc/forum/differenc_in_webapp_icons__63__.mdwn
@@ -0,0 +1,4 @@
+Hi,
+
+I'm wondering what the difference between the network signal and network sync icons are in the web-app? Nothing stands out to me why some repos have one some the other?
+
diff --git a/doc/forum/differenc_in_webapp_icons__63__/comment_1_c38e2692b13a1b76777bf88312a03966._comment b/doc/forum/differenc_in_webapp_icons__63__/comment_1_c38e2692b13a1b76777bf88312a03966._comment
new file mode 100644
index 000000000..69777eaff
--- /dev/null
+++ b/doc/forum/differenc_in_webapp_icons__63__/comment_1_c38e2692b13a1b76777bf88312a03966._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ ip="209.250.56.114"
+ subject="comment 1"
+ date="2014-04-26T23:03:46Z"
+ content="""
+The signal icon shows when there's a direct connection to another repositoriry. This leats your repository immediately learn when there is a change, triggering a sync. Without any signal icons, there's no fast syncing when changes are made, so the webapp will prompt for you to set up such a connection.
+"""]]
diff --git a/doc/forum/misctmp_filling_up.mdwn b/doc/forum/misctmp_filling_up.mdwn
new file mode 100644
index 000000000..a633760c9
--- /dev/null
+++ b/doc/forum/misctmp_filling_up.mdwn
@@ -0,0 +1,11 @@
+My directory .git/annex/misctmp is quite filled up with files like P39923, P33083, and also with 7 characters P310000 up to P331998. The beginning of these filenames may come from the annexed files, which all start with 'P3'.
+
+There is a total of 12198 of them (4.0TB... yes this repo is quite big ;)).
+
+Each of those has the content of individual annexed files (about 300-400MB targzipped files). Sometimes they are hard liked to each other, up to 8 copies.
+
+Since I have copied+dropped the whole repo content to other repos, there should be nothing left locally. I have verified several of those files (the annexed files which are identical to the misctmp/* files), are they indeed are located elsewhere, and not "here".
+
+So I was wondering if it is safe to remove them, and why are they not listed by git annex unused?
+
+Thanks for your help!!
diff --git a/doc/forum/misctmp_filling_up/comment_1_2739dec72fe0950dd070c8fab9fbd751._comment b/doc/forum/misctmp_filling_up/comment_1_2739dec72fe0950dd070c8fab9fbd751._comment
new file mode 100644
index 000000000..9d1713745
--- /dev/null
+++ b/doc/forum/misctmp_filling_up/comment_1_2739dec72fe0950dd070c8fab9fbd751._comment
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ ip="209.250.56.114"
+ subject="comment 1"
+ date="2014-04-27T00:16:49Z"
+ content="""
+You can delete them.
+
+AFAIK this should only happen if the assistant is interrupted while it's adding files. I plan to make the assistant clean up old tmp files on startup.
+"""]]
diff --git a/doc/forum/misctmp_filling_up/comment_2_440081b5e2b9b5b19e8cd5db3649a976._comment b/doc/forum/misctmp_filling_up/comment_2_440081b5e2b9b5b19e8cd5db3649a976._comment
new file mode 100644
index 000000000..5048f601e
--- /dev/null
+++ b/doc/forum/misctmp_filling_up/comment_2_440081b5e2b9b5b19e8cd5db3649a976._comment
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawmdbVIGiDH8KarAGAy8y2FHJD_F990JzXI"
+ nickname="François"
+ subject="comment 2"
+ date="2014-04-27T05:21:48Z"
+ content="""
+Indeed I had to interrupt the add a few times.
+
+Thanks!
+"""]]
diff --git a/doc/forum/ssh_key_setup_woes_in_Android.mdwn b/doc/forum/ssh_key_setup_woes_in_Android.mdwn
new file mode 100644
index 000000000..87e2dd25f
--- /dev/null
+++ b/doc/forum/ssh_key_setup_woes_in_Android.mdwn
@@ -0,0 +1,15 @@
+I'm trying to set up a ssh remote on Android using the latest 5.20140421. For some
+reason the assistant fails to set up passwordless login on the remote server. It
+adds the required line in `.ssh/authorized_keys` on the server side, but it still
+keeps asking for the password for every connection. Nothing suspicious appears in
+the assistant's log. Also, if I set up a ssh remote on a different directory on the
+same server, a new key is generated and added to `authorized_keys`, but the passwordless
+login still doesn't work.
+
+I didn't file a bug since this would make for a very lousy bug report. How could I
+look more into what's causing this? Where should the generated keys reside on the
+Android filesystem?
+
+I think it would be useful for the assistant to check that the generated ssh keys are
+working properly, and inform the user and/or try to set them up again if there is a
+problem, instead of silently falling back to asking for the login password on the console.
diff --git a/doc/forum/sync_stages_deletions_on_remote/comment_3_9e07593228915936fadcf90373be9f4e._comment b/doc/forum/sync_stages_deletions_on_remote/comment_3_9e07593228915936fadcf90373be9f4e._comment
new file mode 100644
index 000000000..fb9020252
--- /dev/null
+++ b/doc/forum/sync_stages_deletions_on_remote/comment_3_9e07593228915936fadcf90373be9f4e._comment
@@ -0,0 +1,14 @@
+[[!comment format=mdwn
+ username="http://schnouki.net/"
+ nickname="Schnouki"
+ subject="comment 3"
+ date="2014-04-22T14:59:47Z"
+ content="""
+Not running the assistant (freshly rebooted NAS, checked with `ps ax | grep annex`), not running any other git command. Still happened, until a few minutes ago: I found the cause for this issue... and it's quite frustrating.
+
+Every now and then, I interrupt a running `git annex sync` with Ctrl+C. And sometimes this causes my NAS repository to end up with `bare = true` in its `.git/config`. When this happens, I just remove the offending line and call it a day. Now I just added a `bare = false` line to that file, and that solved the problem. It seems that somehow, if you don't explicitely tell git that your repo is not bare, it considers it as a bare repository -- and the final push from `git annex sync` actually updates the `master` branch without updating the work tree.
+
+This is probably not a bug in git-annex, but rather a weird behaviour in git -- and for sure something I didn't expect to happend. But anyway it works now :) Leaving this here in case it helps other people.
+
+Joey, thanks again for your time and your help.
+"""]]
diff --git a/doc/forum/sync_stages_deletions_on_remote/comment_4_e5a3dc34c6229ec40bc999c3cab28041._comment b/doc/forum/sync_stages_deletions_on_remote/comment_4_e5a3dc34c6229ec40bc999c3cab28041._comment
new file mode 100644
index 000000000..710392daa
--- /dev/null
+++ b/doc/forum/sync_stages_deletions_on_remote/comment_4_e5a3dc34c6229ec40bc999c3cab28041._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ ip="209.250.56.114"
+ subject="comment 4"
+ date="2014-04-24T18:22:16Z"
+ content="""
+git sets bare = false in newly created non-bare repositories. Perhaps this is why? It seems likely that git has an inconsistent default if there's no configuration. Sounds worth filing a bug on git for. OTOH, messing with .git/config in nonstandard ways seems like a good way to cause yourself random pain too.
+"""]]
diff --git a/doc/forum/trouble_with_multiple_remotes_syncing_to_gcrypt_based_ssh_repo_.mdwn b/doc/forum/trouble_with_multiple_remotes_syncing_to_gcrypt_based_ssh_repo_.mdwn
new file mode 100644
index 000000000..95cfe2538
--- /dev/null
+++ b/doc/forum/trouble_with_multiple_remotes_syncing_to_gcrypt_based_ssh_repo_.mdwn
@@ -0,0 +1,7 @@
+Hi,
+
+Is anyone having difficulties with the assistant and gpg-agent? Particularly with multiple repos syncing to a crypt backup?
+
+It seems to work for a while and then according to the error logs I can't decrypt the manifest...I'm wondering if there is some sort of locking involved that only lets one repo sync to a gcrypt repo at a time? I can't think why the gpg-agent would stop providing the key.
+
+I also have a rather horrible time with gpg-agent in general: I now start each repos git annex assistant individually in the shell (from which I can confirm the gpg-agent is working) rather than launch the web-app direct.
diff --git a/doc/forum/trouble_with_multiple_remotes_syncing_to_gcrypt_based_ssh_repo_/comment_1_4ad9a6a7cf5678ac0bc6d46a54f64cd3._comment b/doc/forum/trouble_with_multiple_remotes_syncing_to_gcrypt_based_ssh_repo_/comment_1_4ad9a6a7cf5678ac0bc6d46a54f64cd3._comment
new file mode 100644
index 000000000..3ec016744
--- /dev/null
+++ b/doc/forum/trouble_with_multiple_remotes_syncing_to_gcrypt_based_ssh_repo_/comment_1_4ad9a6a7cf5678ac0bc6d46a54f64cd3._comment
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawnXybLxkPMYpP3yw4b_I6IdC3cKTD-xEdU"
+ nickname="Matt"
+ subject="comment 1"
+ date="2014-04-29T10:16:11Z"
+ content="""
+hmmm - a command line based git annex sync always works. So either the assistant has a separate locking mechanism or the assistant is somehow losing the gpg-agent environment. Does the assistant restart/respawn itself and lose access to the gpg-agent env?
+
+I'm somewhat clutching at straws here.
+"""]]
diff --git a/doc/forum/trouble_with_multiple_remotes_syncing_to_gcrypt_based_ssh_repo_/comment_2_82dc18ed14879936d04133f248879fb9._comment b/doc/forum/trouble_with_multiple_remotes_syncing_to_gcrypt_based_ssh_repo_/comment_2_82dc18ed14879936d04133f248879fb9._comment
new file mode 100644
index 000000000..30bc72f54
--- /dev/null
+++ b/doc/forum/trouble_with_multiple_remotes_syncing_to_gcrypt_based_ssh_repo_/comment_2_82dc18ed14879936d04133f248879fb9._comment
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawnXybLxkPMYpP3yw4b_I6IdC3cKTD-xEdU"
+ nickname="Matt"
+ subject="comment 2"
+ date="2014-04-30T12:25:55Z"
+ content="""
+I see in the comments here a possible explanation...
+
+https://git-annex.branchable.com/bugs/GPG_passphrase_repeated_prompt/
+"""]]
diff --git a/doc/install/ArchLinux.mdwn b/doc/install/ArchLinux.mdwn
index 807387e0b..3dd7271c4 100644
--- a/doc/install/ArchLinux.mdwn
+++ b/doc/install/ArchLinux.mdwn
@@ -1,20 +1,19 @@
-There is a non-official source package for git-annex in
-[AUR](https://aur.archlinux.org/packages.php?ID=44272).
+There are three non non-official packages for git-annex in the Archlinux User Repository. Any of these may be installed manually per [AUR guidelines](https://wiki.archlinux.org/index.php/AUR_User_Guidelines#Installing_packages) or using a wrapper such as [`yaourt`](https://wiki.archlinux.org/index.php/yaourt) shown below.
-You can then build it yourself or use a wrapper for AUR
-such as yaourt:
+1. The simplest method is to use the [git-annex-bin](https://aur.archlinux.org/packages/git-annex-bin/) package based on the [prebuilt Linux tarballs](http://downloads.kitenet.net/git-annex/linux/current/). This package includes many of the binary shims from the pre-built package. Although common Linux system utilities have been stripped in favor of normal dependencies, the pre-configured Haskell libraries included out of the box make this an easy install. The disadvantage is the resulting installation is a bit on the heavy side at nearly 100M.
-<pre>
-$ yaourt -Sy git-annex
-</pre>
+ $ yaourt -Sy git-annex-bin
-----
+2. A more traditional source package is available at [git-annex](https://aur.archlinux.org/packages/git-annex/). This depends on a large number of Haskell packages available from a third party repository or through Cabal. This has been historically a bit problematic and the package frequently sits flagged out of date. The state of dependencies also varies, so some intervention may be required to get this option to work.
-I'm told the AUR has some dependency problems currently.
-If it doesn't work, you can just use cabal:
+ $ yaourt -Sy git-annex
-<pre>
-pacman -S git rsync curl wget gnupg openssh cabal-install
-cabal update
-cabal install git-annex --bindir=$HOME/bin
-</pre>
+3. A development package is available at [git-annex-git](https://aur.archlinux.org/packages/git-annex-git/) that functions similarly to the source package but builds directly from the HEAD of the git repository rather that the last official release.
+
+ $ yaourt -Sy git-annex-git
+
+Finally you may choose to forgo the Archlinux package system and install git-annex directly through cabal.
+
+ $ pacman -S git rsync curl wget gnupg openssh cabal-install
+ $ cabal update
+ $ cabal install git-annex --bindir=$HOME/bin
diff --git a/doc/not/comment_14_837e3699014b73e8f2bd2a668eea9eef._comment b/doc/not/comment_14_837e3699014b73e8f2bd2a668eea9eef._comment
new file mode 100644
index 000000000..01eb17b86
--- /dev/null
+++ b/doc/not/comment_14_837e3699014b73e8f2bd2a668eea9eef._comment
@@ -0,0 +1,23 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawmhufs6QGCQXnUEc6qrCcQIZTomUDKNeAQ"
+ nickname="Jeff"
+ subject="Git annex in a strange direct with .git/annex/objects mode"
+ date="2014-04-21T21:03:24Z"
+ content="""
+I'm doing something perhaps unreasonable and weird, and I'm wondering if there's a better way.
+
+I'm running a wget -mbc of a particular web site. It replicates down to a tree.
+Then I'm ingesting the content into git annex via the normal 'git annex add' sequence.
+
+Later, when I'm going to update my replica of the website, I am running a 'git annex unlock' on the whole tree (90 gig in this case), and then running the 'wget -mbc ; git annex add' command sequence again.
+
+Is there any mechanism to convince git-annex to scan the file, and ingest (copy) it into objects if it is new content, while leaving the original files unlocked? This would give me the ability to avoid the 'git annex unlock' copy operation, which is lengthy.
+
+I'm aware this is inherently space inefficient.
+
+I'm sure there's some other problem with this idea that I'm missing.
+
+Thanks.
+
+
+"""]]
diff --git a/doc/preferred_content/standard_groups.mdwn b/doc/preferred_content/standard_groups.mdwn
index 2a6241669..97bc9b667 100644
--- a/doc/preferred_content/standard_groups.mdwn
+++ b/doc/preferred_content/standard_groups.mdwn
@@ -1,7 +1,8 @@
git-annex comes with some built-in [[preferred_content]] settings, that can
be used with repositories that are in special groups. To make a
repository use one of these, just set its preferred content expression
-to "standard", and put it in one of these groups.
+to "standard", and put it in one of these groups. Or in the webapp, just
+edit the repository and select the group.
(Note that most of these standard expressions also make the repository
want to get any content that is only currently available on untrusted and
diff --git a/doc/publicrepos.mdwn b/doc/publicrepos.mdwn
index 77950a62e..0850b7261 100644
--- a/doc/publicrepos.mdwn
+++ b/doc/publicrepos.mdwn
@@ -5,7 +5,7 @@ the public repositories that you can clone to try out git-annex.
`git clone https://downloads.kitenet.net/.git/`
Various downloads of things produced by Joey Hess, including git-annex
builds.
-* [debconf-share](https://downloads.kitenet.net/.git/)
+* debconf-share
`git clone http://annex.debconf.org/debconf-share/.git/`
[DebConf](http://debconf.org/) Media, photos, videos, etc.
* [conference-proceedings](https://github.com/RichiH/conference_proceedings)
diff --git a/doc/special_remotes/comment_22_308afc586b86c66bbb3437d63864d9cb._comment b/doc/special_remotes/comment_22_308afc586b86c66bbb3437d63864d9cb._comment
new file mode 100644
index 000000000..c642f3975
--- /dev/null
+++ b/doc/special_remotes/comment_22_308afc586b86c66bbb3437d63864d9cb._comment
@@ -0,0 +1,16 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawmp1ThsNNAbSn46ju-gwFELfStlhl8usJo"
+ nickname="donkeyicydragon"
+ subject="Enhancing special remotes as backup spaces"
+ date="2014-04-22T21:08:49Z"
+ content="""
+Hi Joey,
+
+I am thinking about using google drive as an encrypted backup for my important files. However, I fear that if all my git annex repositories are unrecoverable that the encrypted data on the special remote will not help me much. Assuming I have backed up my gpg key I still get a bunch of decrypted files but the folder structure is lost. Would it be possible to implement something like a safety feature that also uploads an (encrypted) tar of all symlinks (pointing to the respective encrypted files) of the (current/or master-branch) git working tree?
+
+I am almost sure this is already implementable using hooks however I could not find information on which types of hooks are available. I am looking for one that is triggered once after all copy/move operations to a special remote are finished. Can you point me in the right direction?
+
+Marek
+
+
+"""]]
diff --git a/doc/sync/comment_11_7683879f6982c0eb0aa39b66ff5a5ea9._comment b/doc/sync/comment_11_7683879f6982c0eb0aa39b66ff5a5ea9._comment
new file mode 100644
index 000000000..430322975
--- /dev/null
+++ b/doc/sync/comment_11_7683879f6982c0eb0aa39b66ff5a5ea9._comment
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawn3p4i4lk_zMilvjnJ9sS6g2nerpgz0Fjc"
+ nickname="Matthias"
+ subject="sync slow with content switch"
+ date="2014-04-22T20:37:05Z"
+ content="""
+I noticed that in a test with 2 local repositories and around 2'000 files \"git annex sync\" is still very fast, but \"git annex sync --content\" takes multiple seconds. Is this avoidable?
+
+I have a central repo and client repos. I want to copy all content to the central repo after a commit. Right now, I use \"git annex group central backup\", \"git annex wanted central standard\", and a hook that triggers \"git annex sync --content\" after each commit. Maybe there is a more efficient way to do this? Thanks for sharing thoughts.
+"""]]
diff --git a/doc/sync/comment_12_2fea14fa314ddb7ab645a5cca5a95fd9._comment b/doc/sync/comment_12_2fea14fa314ddb7ab645a5cca5a95fd9._comment
new file mode 100644
index 000000000..b7e2ea189
--- /dev/null
+++ b/doc/sync/comment_12_2fea14fa314ddb7ab645a5cca5a95fd9._comment
@@ -0,0 +1,14 @@
+[[!comment format=mdwn
+ username="http://mshri.livejournal.com/"
+ ip="129.170.212.202"
+ subject="Sync specific branch or ignore a branch during sync"
+ date="2014-04-25T15:37:53Z"
+ content="""
+
+I too feel that syncing all remotes by default is the right thing to do, but I think it should be limited to the 'master' and 'git-annex' branch. I often create branches that I want to keep local and do not want them to be synced. But I want 'master' and 'git-annex' branches to be synced with all remotes.
+
+So it would be nice to able to set an option to sync all branches or just the 'master' and 'git-annex' or to able to ignore some branches during git annex sync
+
+Shri
+
+"""]]
diff --git a/doc/thanks.mdwn b/doc/thanks.mdwn
index 8959342b5..6948e4512 100644
--- a/doc/thanks.mdwn
+++ b/doc/thanks.mdwn
@@ -124,9 +124,10 @@ Poobalasubramanian, Alexandre Garel, David Clark, Jeff Johnson,
Mica Semrick, Paul Staab, Rémi Vanicat, Martin Holtschneider, Jan Ivar
Beddari, Peter Simons, Thomas Koch, Justin Geibel, Guillaume DELVIT, Shanti
Bouchez, Oliver Brandt, François Deppierraz, Chad Walstrom, Tim Mattison,
-Jakub Antoni Tyszko, and 30 anonymous bitcoin users
+Jakub Antoni Tyszko, Casa do Boneco, and 30 anonymous bitcoin users
-With an especial thanks to the WikiMedia foundation.
+With an especial thanks to the WikiMedia foundation,
+and Rede Mocambos.
## 2012-2013
diff --git a/doc/tips/file_manager_integration.mdwn b/doc/tips/file_manager_integration.mdwn
index 3fea3e98c..6c6ac643f 100644
--- a/doc/tips/file_manager_integration.mdwn
+++ b/doc/tips/file_manager_integration.mdwn
@@ -82,6 +82,25 @@ This gives me the resulting config on disk, in `.config/Thunar/uca.xml`:
The complete instructions on how to setup actions is [in the XFCE documentation](http://docs.xfce.org/xfce/thunar/custom-actions).
+## OS X (Finder)
+
+For OS X, it is possible to get context menus in Finder. Due to how OS X deals with sym links, one needs to operate on folders if using indirect mode. Direct mode operation has not been tested.
+
+1. Open Automator and create a new Service.
+2. Using the Drop down menus in the top create the sentence "Service receives selected folders in Finder.app" to have it work on folders. For direct mode operation it is probably reasonable to select "files or folders".
+3. Add a "Run shell script" element and fill in line with the following script:
+
+ #!/usr/bin/bash
+ source ~/.bash_profile
+ for f in "$@"
+ do
+ cd "$(dirname "$f")" && git-annex get "$f"
+ done
+
+The purpose of the first line is there to get git-annex on to the path. The reason for the for loop is in case multiple files or folders are marked when running the context menu command.
+
+Finally save the the workflow under the name for which it should be listed in the context menu.
+
## your file manager here
Edit this page and add instructions!
diff --git a/doc/tips/file_manager_integration/comment_1_0f82520f415b4715946358658e1799a8._comment b/doc/tips/file_manager_integration/comment_1_0f82520f415b4715946358658e1799a8._comment
new file mode 100644
index 000000000..2dedcc884
--- /dev/null
+++ b/doc/tips/file_manager_integration/comment_1_0f82520f415b4715946358658e1799a8._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawnmF_9CAtfqdZkC4e-_dCX-rK5bqh4RWkw"
+ nickname="Carl"
+ subject="Finder added"
+ date="2014-04-23T13:19:02Z"
+ content="""
+For some reason I do not manage to get the shell script to pretty print. I can also supply a screenshot of the Automator, but do not manage to upload it to the wiki.
+"""]]
diff --git a/doc/tips/file_manager_integration/comment_2_9cb6b7fcb8e33a75efd2f92d7e40a9c5._comment b/doc/tips/file_manager_integration/comment_2_9cb6b7fcb8e33a75efd2f92d7e40a9c5._comment
new file mode 100644
index 000000000..ad3e4c0b4
--- /dev/null
+++ b/doc/tips/file_manager_integration/comment_2_9cb6b7fcb8e33a75efd2f92d7e40a9c5._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ ip="108.236.230.124"
+ subject="comment 2"
+ date="2014-04-23T17:49:09Z"
+ content="""
+@Carl, I've fixed the formatting. To add a picture, you'd need to send me a pull request adding it to the git repo.
+"""]]
diff --git a/doc/tips/what_to_do_when_a_repository_is_corrupted/comment_1_c3543190eae2af594f3e050057e80db6._comment b/doc/tips/what_to_do_when_a_repository_is_corrupted/comment_1_c3543190eae2af594f3e050057e80db6._comment
new file mode 100644
index 000000000..3954bef0d
--- /dev/null
+++ b/doc/tips/what_to_do_when_a_repository_is_corrupted/comment_1_c3543190eae2af594f3e050057e80db6._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawnq-RfkVpFN15SWvQ2lpSGAi0XpNQuLxKM"
+ nickname="Yuval"
+ subject="Automation"
+ date="2014-04-27T11:34:44Z"
+ content="""
+Could this step be automated?
+"""]]
diff --git a/doc/todo/do_not_bug_me_about_intermediate_files.mdwn b/doc/todo/do_not_bug_me_about_intermediate_files.mdwn
index 6cb71b5b5..99a8f5b19 100644
--- a/doc/todo/do_not_bug_me_about_intermediate_files.mdwn
+++ b/doc/todo/do_not_bug_me_about_intermediate_files.mdwn
@@ -2,6 +2,6 @@
so this is another UX pickyness, but it seems important to me.
-i like the new desktop notifications, but they are little too verbose. when i choose "git annex get" on the folder, if there's a lot of files, it will flood me with all the files being transfered in a mostly incomprehensible list of files being transfered.
+i like the new [[desktop notifications|tips/file_manager_integration]], but they are little too verbose. when i choose "git annex get" on the folder, if there's a lot of files, it will flood me with all the files being transfered in a mostly incomprehensible list of files being transfered.
what i would expect is more: "starting transfer of folder X", "transfer of folder X finished!", only two message per item i chose. this is especially a problem with DVD backups, which have a bunch of small files (screenshots, .nfos and so on) and large video files - so it seems the thing has finished transfering, while it's only partly done. --[[anarcat]]
diff --git a/doc/todo/read-only_removable_drives.mdwn b/doc/todo/read-only_removable_drives.mdwn
new file mode 100644
index 000000000..379074897
--- /dev/null
+++ b/doc/todo/read-only_removable_drives.mdwn
@@ -0,0 +1,7 @@
+Here's yet another weird use case. I have a ext3 external drive for storing media that i brought to the office. Naturally, all files on the drive are owned by my desktop user (uid = 1000). In the office, my userid is different (say 1001), so git-annex doesn't see the removable drive at all (which is a little confusing). But even if i try to add the repo on the drive as an external repo, it says it can't write to it (which is true).
+
+I would expect it to at least be able to leech the files off of it.
+
+Otherwise, I would welcome advice on how to fix this problem without doing a `sudo chown -R` every time i plug this drive somewhere ... --[[anarcat]]
+
+> Workaround: `sudo setfacl -R -m u:anarcat:rwx /media/foo/annex`
diff --git a/doc/todo/wishlist:_git_annex_group_remote_return_the_group.mdwn b/doc/todo/wishlist:_git_annex_group_remote_return_the_group.mdwn
new file mode 100644
index 000000000..ace9842ee
--- /dev/null
+++ b/doc/todo/wishlist:_git_annex_group_remote_return_the_group.mdwn
@@ -0,0 +1,9 @@
+Hi,
+
+It would be good if the command
+
+ git annex group repository
+
+returned the current list of groups the repository belongs to...(can it belong to more than one?)
+
+Currently the command requires an additional parameter to set the group.
diff --git a/doc/todo/wishlist:_git_annex_info_._also_return_numcopies_setting.mdwn b/doc/todo/wishlist:_git_annex_info_._also_return_numcopies_setting.mdwn
new file mode 100644
index 000000000..7ab493083
--- /dev/null
+++ b/doc/todo/wishlist:_git_annex_info_._also_return_numcopies_setting.mdwn
@@ -0,0 +1 @@
+The stats produced by `git annex info .` are nice but I often find myself separately looking up the actual numcopies set value. Can this also be included in the report please?
diff --git a/doc/todo/wishlist:_turn_a_directory_into_a_git-annex_direct_repository.mdwn b/doc/todo/wishlist:_turn_a_directory_into_a_git-annex_direct_repository.mdwn
new file mode 100644
index 000000000..c15dca727
--- /dev/null
+++ b/doc/todo/wishlist:_turn_a_directory_into_a_git-annex_direct_repository.mdwn
@@ -0,0 +1,26 @@
+It would be nice to have a simple command that can safely turn a plain directory into a git-annex direct repository.
+
+This is the use case:
+
+* I use git-annex to manage a directory full of files, including many huge files.
+* These files are also stored in an S3 repository.
+* It takes days to download those files.
+* I have another computer with a directory that contains 80% of these files.
+* I would like to turn that directory into a git-annex repository.
+* I would like to download only the 20% missing files.
+
+What I would like to have a command that turns that directory into a direct repository without dealing with the gory details I will describe later. This command could be something like
+
+ $ cd Documents
+ $ git annex setup --direct example.org:~/annex/Documents.git
+
+This command should take care of:
+
+* cloning the git repository `example.org:~/annex/Documents.git` to `.git`,
+* switching to direct mode (carefully setting up all the needed branches),
+* create symlinks _only_ for the missing files,
+* record that the existing files are present in this repository.
+
+These are just the main problems that one faces in this task; they are mostly caused by the fact that the repo is in direct mode.
+
+There are workarounds, like those sketched at <http://unix.stackexchange.com/questions/75557/init-gix-annex-additional-repo-with-existing-files>, but they are all time-consuming and fragile.
diff --git a/doc/todo/wishlist:_turn_a_directory_into_a_git-annex_direct_repository/comment_1_d48a98bad77400bd8384300e324d999f._comment b/doc/todo/wishlist:_turn_a_directory_into_a_git-annex_direct_repository/comment_1_d48a98bad77400bd8384300e324d999f._comment
new file mode 100644
index 000000000..ff173347f
--- /dev/null
+++ b/doc/todo/wishlist:_turn_a_directory_into_a_git-annex_direct_repository/comment_1_d48a98bad77400bd8384300e324d999f._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="https://id.koumbit.net/anarcat"
+ ip="72.0.72.144"
+ subject="comment 1"
+ date="2014-04-25T13:28:18Z"
+ content="""
+take a look at [[tips/migrating_two_seperate_disconnected_directories_to_git_annex]]. it's not a single command, granted, but it should be simple enough for your use case...
+"""]]
diff --git a/doc/todo/wishlist:_turn_a_directory_into_a_git-annex_direct_repository/comment_2_1a1d15531c74eb0cc09f81dc09d95d39._comment b/doc/todo/wishlist:_turn_a_directory_into_a_git-annex_direct_repository/comment_2_1a1d15531c74eb0cc09f81dc09d95d39._comment
new file mode 100644
index 000000000..c250e2d22
--- /dev/null
+++ b/doc/todo/wishlist:_turn_a_directory_into_a_git-annex_direct_repository/comment_2_1a1d15531c74eb0cc09f81dc09d95d39._comment
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="http://svario.it/gioele"
+ nickname="gioele"
+ subject="comment 2"
+ date="2014-04-25T19:01:06Z"
+ content="""
+That guide does not work for direct repositories. As soon as you switch to direct mode you cannot import the old data without jumping through hoops.
+
+The fact that these guide exist at all is a symptom that this is a widespread problem. Having a command in `git-annex` would be very handy and easy to use.
+"""]]
diff --git a/doc/todo/wishlist:_turn_a_directory_into_a_git-annex_direct_repository/comment_3_66ceb7c793a2dbbd755b9595a2199aca._comment b/doc/todo/wishlist:_turn_a_directory_into_a_git-annex_direct_repository/comment_3_66ceb7c793a2dbbd755b9595a2199aca._comment
new file mode 100644
index 000000000..fbc52c5e2
--- /dev/null
+++ b/doc/todo/wishlist:_turn_a_directory_into_a_git-annex_direct_repository/comment_3_66ceb7c793a2dbbd755b9595a2199aca._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ ip="209.250.56.114"
+ subject="comment 3"
+ date="2014-04-27T00:05:58Z"
+ content="""
+I don't see a single thing that direct mode makes harder in this situation. Every command in the linked tip will work in direct mode AFAICS.
+"""]]
diff --git a/doc/videos.mdwn b/doc/videos.mdwn
index f1adeeac4..4bfcdbc9f 100644
--- a/doc/videos.mdwn
+++ b/doc/videos.mdwn
@@ -1,7 +1,7 @@
Talks and screencasts about git-annex.
These videos are also available in a public git-annex repository
-`git clone http://downloads.kitenet.net/.git/`
+`git clone https://downloads.kitenet.net/.git/`
[[!inline pages="./videos/* and !./videos/*/* and !*/Discussion" show="2"]]
diff --git a/doc/walkthrough/automatically_managing_content.mdwn b/doc/walkthrough/automatically_managing_content.mdwn
index 0080ebcb5..ec55c1cc8 100644
--- a/doc/walkthrough/automatically_managing_content.mdwn
+++ b/doc/walkthrough/automatically_managing_content.mdwn
@@ -13,7 +13,7 @@ file.
0c443de8-e644-11df-acbf-f7cd7ca6210d -- laptop
whereis other_file (3 copies)
0c443de8-e644-11df-acbf-f7cd7ca6210d -- laptop
- 62b39bbe-4149-11e0-af01-bb89245a1e61 -- here (usb drive)
+ 62b39bbe-4149-11e0-af01-bb89245a1e61 -- usb drive [here]
7570b02e-15e9-11e0-adf0-9f3f94cb2eaa -- backup drive
What would be handy is some automated versions of get and drop, that only
@@ -31,7 +31,7 @@ work toward having two copies of your files.
# git annex whereis
whereis my_cool_big_file (2 copies)
0c443de8-e644-11df-acbf-f7cd7ca6210d -- laptop
- 62b39bbe-4149-11e0-af01-bb89245a1e61 -- here (usb drive)
+ 62b39bbe-4149-11e0-af01-bb89245a1e61 -- usb drive [here]
whereis other_file (2 copies)
0c443de8-e644-11df-acbf-f7cd7ca6210d -- laptop
7570b02e-15e9-11e0-adf0-9f3f94cb2eaa -- backup drive
diff --git a/standalone/android/Makefile b/standalone/android/Makefile
index 404841bc0..a11c0bcc1 100644
--- a/standalone/android/Makefile
+++ b/standalone/android/Makefile
@@ -76,6 +76,7 @@ build: start
cp $(GIT_ANNEX_ANDROID_SOURCETREE)/git/git.tar.gz $(GIT_ANNEX_ANDROID_SOURCETREE)/term/libs/armeabi/lib.git.tar.gz.so
git rev-parse HEAD > $(GIT_ANNEX_ANDROID_SOURCETREE)/term/libs/armeabi/lib.version.so
+ cp ../trustedkeys.gpg $(GIT_ANNEX_ANDROID_SOURCETREE)/term/libs/armeabi/lib.trustedkeys.so
mkdir -p ../../tmp/4.0 ../../tmp/4.3
diff --git a/standalone/android/runshell b/standalone/android/runshell
index ef6744494..f6a0138e9 100755
--- a/standalone/android/runshell
+++ b/standalone/android/runshell
@@ -53,6 +53,7 @@ buildtree () {
$cmd echo "exec $base/lib/lib.start.so" >> "$base/runshell"
$cmd chmod 755 runshell
+ $cmd cat "$base/lib/lib.trustedkeys.so" > "$base/bin/trustedkeys.gpg"
$cmd cat "$base/lib/lib.version.so" > "$base/installed-version"
$cmd echo "Installation complete"
}
diff --git a/standalone/trustedkeys.gpg b/standalone/trustedkeys.gpg
new file mode 100644
index 000000000..0742182ae
--- /dev/null
+++ b/standalone/trustedkeys.gpg
Binary files differ