summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Joey Hess <joeyh@joeyh.name>2016-04-06 18:40:28 -0400
committerGravatar Joey Hess <joeyh@joeyh.name>2016-04-06 18:40:28 -0400
commit9de9f5aad4ec0275e3c544fcb26588ea0e755760 (patch)
tree492124ae7448a3e287b0c1f4af855aec727c736b
parent070b1a03392ab3962eb43f60f32fde5c1b9b70d2 (diff)
run out of tree merge with --no-ff
This is how direct mode does it too, and somehow, for reasons that currently escape me, this makes git merge not care if it's run with an empty work tree.
-rw-r--r--Annex/AdjustedBranch.hs14
-rw-r--r--Annex/AutoMerge.hs6
-rw-r--r--Annex/Direct.hs1
-rw-r--r--Command/Sync.hs2
-rw-r--r--Git/Merge.hs9
5 files changed, 20 insertions, 12 deletions
diff --git a/Annex/AdjustedBranch.hs b/Annex/AdjustedBranch.hs
index a30dda809..994444626 100644
--- a/Annex/AdjustedBranch.hs
+++ b/Annex/AdjustedBranch.hs
@@ -32,6 +32,7 @@ import qualified Git.Ref
import qualified Git.Command
import qualified Git.Tree
import qualified Git.DiffTree
+import qualified Git.Merge
import Git.Tree (TreeItem(..))
import Git.Sha
import Git.Env
@@ -272,13 +273,16 @@ updateAdjustedBranch tomerge (origbranch, adj) commitmode = catchBoolIO $
withemptydir tmpwt $ withWorkTree tmpwt $ do
liftIO $ writeFile (tmpgit </> "HEAD") (fromRef updatedorig)
showAction $ "Merging into " ++ fromRef (Git.Ref.base origbranch)
- ifM (autoMergeFrom tomerge (Just origbranch) True commitmode)
- ( do
+ -- The --no-ff is important; it makes git
+ -- merge not care that the work tree is empty.
+ merged <- inRepo (Git.Merge.mergeNonInteractive' [Param "--no-ff"] tomerge commitmode)
+ <||> (resolveMerge (Just updatedorig) tomerge True <&&> commitResolvedMerge commitmode)
+ if merged
+ then do
!mergecommit <- liftIO $ extractSha <$> readFile (tmpgit </> "HEAD")
-- This is run after the commit lock is dropped.
return $ postmerge currbranch mergecommit
- , return $ return False
- )
+ else return $ return False
changestomerge Nothing _ = return $ return False
withemptydir d a = bracketIO setup cleanup (const a)
@@ -305,7 +309,7 @@ updateAdjustedBranch tomerge (origbranch, adj) commitmode = catchBoolIO $
adjmergecommit <- commitAdjustedTree' adjtree mergecommit
[mergecommit, currbranch]
showAction "Merging into adjusted branch"
- ifM (autoMergeFrom adjmergecommit (Just currbranch) False commitmode)
+ ifM (autoMergeFrom adjmergecommit (Just currbranch) commitmode)
-- The adjusted branch has a merge commit on top;
-- clean that up and propigate any changes made
-- in that merge to the origbranch.
diff --git a/Annex/AutoMerge.hs b/Annex/AutoMerge.hs
index e1662f81a..074e955d7 100644
--- a/Annex/AutoMerge.hs
+++ b/Annex/AutoMerge.hs
@@ -42,8 +42,8 @@ import qualified Data.ByteString.Lazy as L
- Callers should use Git.Branch.changed first, to make sure that
- there are changes from the current branch to the branch being merged in.
-}
-autoMergeFrom :: Git.Ref -> Maybe Git.Ref -> Bool -> Git.Branch.CommitMode -> Annex Bool
-autoMergeFrom branch currbranch inoverlay commitmode = do
+autoMergeFrom :: Git.Ref -> Maybe Git.Ref -> Git.Branch.CommitMode -> Annex Bool
+autoMergeFrom branch currbranch commitmode = do
showOutput
case currbranch of
Nothing -> go Nothing
@@ -52,7 +52,7 @@ autoMergeFrom branch currbranch inoverlay commitmode = do
go old = ifM isDirect
( mergeDirect currbranch old branch (resolveMerge old branch False) commitmode
, inRepo (Git.Merge.mergeNonInteractive branch commitmode)
- <||> (resolveMerge old branch inoverlay <&&> commitResolvedMerge commitmode)
+ <||> (resolveMerge old branch False <&&> commitResolvedMerge commitmode)
)
{- Resolves a conflicted merge. It's important that any conflicts be
diff --git a/Annex/Direct.hs b/Annex/Direct.hs
index cd0835f04..782803e71 100644
--- a/Annex/Direct.hs
+++ b/Annex/Direct.hs
@@ -204,6 +204,7 @@ stageMerge d branch commitmode = do
-- has been updated, which would leave things in an inconsistent
-- state if mergeDirectCleanup is interrupted.
-- <http://marc.info/?l=git&m=140262402204212&w=2>
+ liftIO $ print ("stagemerge in", d)
merger <- ifM (coreSymlinks <$> Annex.getGitConfig)
( return Git.Merge.stageMerge
, return $ \ref -> Git.Merge.mergeNonInteractive ref commitmode
diff --git a/Command/Sync.hs b/Command/Sync.hs
index 9ef26f19e..69f39bb8a 100644
--- a/Command/Sync.hs
+++ b/Command/Sync.hs
@@ -170,7 +170,7 @@ merge :: CurrBranch -> Git.Branch.CommitMode -> Git.Branch -> Annex Bool
merge (Just b, Just adj) commitmode tomerge =
updateAdjustedBranch tomerge (b, adj) commitmode
merge (b, _) commitmode tomerge =
- autoMergeFrom tomerge b False commitmode
+ autoMergeFrom tomerge b commitmode
syncBranch :: Git.Branch -> Git.Branch
syncBranch = Git.Ref.under "refs/heads/synced" . fromDirectBranch . fromAdjustedBranch
diff --git a/Git/Merge.hs b/Git/Merge.hs
index b3a048937..21eeaf181 100644
--- a/Git/Merge.hs
+++ b/Git/Merge.hs
@@ -15,12 +15,15 @@ import Git.Branch (CommitMode(..))
{- Avoids recent git's interactive merge. -}
mergeNonInteractive :: Ref -> CommitMode -> Repo -> IO Bool
-mergeNonInteractive branch commitmode
+mergeNonInteractive = mergeNonInteractive' []
+
+mergeNonInteractive' :: [CommandParam] -> Ref -> CommitMode -> Repo -> IO Bool
+mergeNonInteractive' extraparams branch commitmode
| older "1.7.7.6" = merge [Param $ fromRef branch]
| otherwise = merge $ [Param "--no-edit", Param $ fromRef branch]
where
- merge ps = runBool $ cp ++ [Param "merge"] ++ ps
- cp
+ merge ps = runBool $ sp ++ [Param "merge"] ++ ps ++ extraparams
+ sp
| commitmode == AutomaticCommit =
[Param "-c", Param "commit.gpgsign=false"]
| otherwise = []