diff --git a/Annex/AdjustedBranch.hs b/Annex/AdjustedBranch.hs index a30dda8099..9944446263 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 e1662f81af..074e955d7c 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 cd0835f04d..782803e714 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. -- + 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 9ef26f19e5..69f39bb8af 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 b3a048937f..21eeaf1815 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 = []