aboutsummaryrefslogtreecommitdiff
path: root/Assistant
diff options
context:
space:
mode:
authorGravatar Joey Hess <joeyh@joeyh.name>2017-06-07 16:16:22 -0400
committerGravatar Joey Hess <joeyh@joeyh.name>2017-06-07 16:17:46 -0400
commit007aa90a739fa754625f146001d880a9a45483a4 (patch)
treef8525f863c4a2d9219e6c6deb984dc04caf2b803 /Assistant
parent656efe58861dc621c462eaee6fe795395c0d343c (diff)
assistant: Merge changes from refs/remotes/foo/master into master.
Previously, only sync branches were merged. This makes regular git push into a repository watched by the assistant auto-merge. While this does hardcode an assumption about what the remote tracking branch is named, which some unusual git configurations won't match, git-annex sync already made the same assumption. Also, changed behavior when a tracking branch like refs/remotes/synced/not/master is received. When on the master branch, that used to get merged into it, but it's the tracking branch for not/master, so should only be merged in when on the not/master branch. This commit was sponsored by Ewen McNeill.
Diffstat (limited to 'Assistant')
-rw-r--r--Assistant/Threads/Merger.hs25
1 files changed, 14 insertions, 11 deletions
diff --git a/Assistant/Threads/Merger.hs b/Assistant/Threads/Merger.hs
index ff98cce5f..5d40edea7 100644
--- a/Assistant/Threads/Merger.hs
+++ b/Assistant/Threads/Merger.hs
@@ -1,6 +1,6 @@
{- git-annex assistant git merge thread
-
- - Copyright 2012 Joey Hess <id@joeyh.name>
+ - Copyright 2012-2017 Joey Hess <id@joeyh.name>
-
- Licensed under the GNU GPL version 3 or higher.
-}
@@ -15,6 +15,7 @@ import Utility.DirWatcher.Types
import qualified Annex.Branch
import qualified Git
import qualified Git.Branch
+import qualified Git.Ref
import qualified Command.Sync
{- This thread watches for changes to .git/refs/, and handles incoming
@@ -63,19 +64,14 @@ onChange file
diverged <- liftAnnex Annex.Branch.forceUpdate
when diverged $
queueDeferredDownloads "retrying deferred download" Later
- -- Merge only from /synced/ branches, which are pushed by git-annex
- -- sync and by remote instances of the assistant.
- -- It would be nice to merge other remote tracking branches,
- -- but it's hard to get an efficient list of them (git remote -r)
- | "/synced/" `isInfixOf` file = mergecurrent
- | otherwise = noop
+ | otherwise = mergecurrent
where
changedbranch = fileToBranch file
mergecurrent =
mergecurrent' =<< liftAnnex (join Command.Sync.getCurrBranch)
mergecurrent' currbranch@(Just b, _)
- | equivBranches changedbranch b =
+ | changedbranch `isRelatedTo` b =
whenM (liftAnnex $ inRepo $ Git.Branch.changed b changedbranch) $ do
debug
[ "merging", Git.fromRef changedbranch
@@ -88,10 +84,17 @@ onChange file
changedbranch
mergecurrent' _ = noop
-equivBranches :: Git.Ref -> Git.Ref -> Bool
-equivBranches x y = base x == base y
+{- Is the first branch a synced branch or remote tracking branch related
+ - to the second branch, which should be merged into it? -}
+isRelatedTo :: Git.Ref -> Git.Ref -> Bool
+isRelatedTo x y
+ | basex /= takeDirectory basex ++ "/" ++ basey = False
+ | "/synced/" `isInfixOf` Git.fromRef x = True
+ | "refs/remotes/" `isPrefixOf` Git.fromRef x = True
+ | otherwise = False
where
- base = takeFileName . Git.fromRef
+ basex = Git.fromRef $ Git.Ref.base x
+ basey = Git.fromRef $ Git.Ref.base y
isAnnexBranch :: FilePath -> Bool
isAnnexBranch f = n `isSuffixOf` f