From 5b1ea5fe5af25cd88c45a87d3bbe36ea7eed7145 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Mon, 16 Jun 2014 11:32:13 -0400 Subject: assistant: Fix one-way assistant->assistant sync in direct mode. When in direct mode, update the master branch after committing to the annex/direct/master branch. Also, update the synced/master branch. This fixes a topology A->B where both A and B are in direct mode and running the assistant, and a change is made to B. Before this fix, A pulled the changes from B, but since they were only on the annex/direct/master branch, it did not merge them. Note that I considered making the assistant merge the remotes/B/annex/direct/master, but decided to keep it simple and only merge the sync branches as before. --- Assistant/Sync.hs | 3 +-- Assistant/Threads/Committer.hs | 7 ++++++- Command/Sync.hs | 10 +++++++--- debian/changelog | 6 ++++++ doc/bugs/failed_sync_with_direct_mode_repo.mdwn | 2 ++ 5 files changed, 22 insertions(+), 6 deletions(-) diff --git a/Assistant/Sync.hs b/Assistant/Sync.hs index c748f6e1a..4bc63241c 100644 --- a/Assistant/Sync.hs +++ b/Assistant/Sync.hs @@ -96,7 +96,7 @@ reconnectRemotes notifypushes rs = void $ do =<< fromMaybe [] . M.lookup (Remote.uuid r) . connectRemoteNotifiers <$> getDaemonStatus -{- Updates the local sync branch, then pushes it to all remotes, in +{- Pushes the local sync branch to all remotes, in - parallel, along with the git-annex branch. This is the same - as "git annex sync", except in parallel, and will co-exist with use of - "git annex sync". @@ -148,7 +148,6 @@ pushToRemotes' now notifypushes remotes = do go _ _ _ _ [] = return [] -- no remotes, so nothing to do go shouldretry (Just branch) g u rs = do debug ["pushing to", show rs] - liftIO $ Command.Sync.updateBranch (Command.Sync.syncBranch branch) g (succeeded, failed) <- liftIO $ inParallel (push g branch) rs updatemap succeeded [] if null failed diff --git a/Assistant/Threads/Committer.hs b/Assistant/Threads/Committer.hs index 275586343..2b60e42f3 100644 --- a/Assistant/Threads/Committer.hs +++ b/Assistant/Threads/Committer.hs @@ -35,6 +35,7 @@ import qualified Annex import Utility.InodeCache import Annex.Content.Direct import qualified Command.Sync +import qualified Git.Branch import Data.Time.Clock import Data.Tuple.Utils @@ -219,7 +220,11 @@ commitStaged = do v <- tryAnnex Annex.Queue.flush case v of Left _ -> return False - Right _ -> Command.Sync.commitStaged "" + Right _ -> do + ok <- Command.Sync.commitStaged "" + when ok $ + Command.Sync.updateSyncBranch =<< inRepo Git.Branch.current + return ok {- OSX needs a short delay after a file is added before locking it down, - when using a non-direct mode repository, as pasting a file seems to diff --git a/Command/Sync.hs b/Command/Sync.hs index a5d6d46f1..983689118 100644 --- a/Command/Sync.hs +++ b/Command/Sync.hs @@ -172,8 +172,13 @@ mergeLocal (Just branch) = go =<< needmerge next $ next $ autoMergeFrom syncbranch (Just branch) pushLocal :: Maybe Git.Ref -> CommandStart -pushLocal Nothing = stop -pushLocal (Just branch) = do +pushLocal b = do + updateSyncBranch b + stop + +updateSyncBranch :: Maybe Git.Ref -> Annex () +updateSyncBranch Nothing = noop +updateSyncBranch (Just branch) = do -- Update the sync branch to match the new state of the branch inRepo $ updateBranch $ syncBranch branch -- In direct mode, we're operating on some special direct mode @@ -181,7 +186,6 @@ pushLocal (Just branch) = do -- branch. whenM isDirect $ inRepo $ updateBranch $ fromDirectBranch branch - stop updateBranch :: Git.Ref -> Git.Repo -> IO () updateBranch syncbranch g = diff --git a/debian/changelog b/debian/changelog index 7a4f9d71e..931694fc3 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,9 @@ +git-annex (5.20140614) UNRELEASED; urgency=medium + + * assistant: Fix one-way assistant->assistant sync in direct mode. + + -- Joey Hess Mon, 16 Jun 2014 11:28:42 -0400 + git-annex (5.20140613) unstable; urgency=medium * Ignore setsid failures. diff --git a/doc/bugs/failed_sync_with_direct_mode_repo.mdwn b/doc/bugs/failed_sync_with_direct_mode_repo.mdwn index 970aa60ef..879146deb 100644 --- a/doc/bugs/failed_sync_with_direct_mode_repo.mdwn +++ b/doc/bugs/failed_sync_with_direct_mode_repo.mdwn @@ -5,3 +5,5 @@ When a change is made on A, the assistant commits it to annex/direct/master. But B notices there is a change, pulls from A. Gets annex/direct/master, but does not merge it into its local branch at all. [[!tag confirmed]] + +> [[fixed|done]] --[[Joey]] -- cgit v1.2.3