diff options
author | Joey Hess <joeyh@joeyh.name> | 2016-04-06 18:40:28 -0400 |
---|---|---|
committer | Joey Hess <joeyh@joeyh.name> | 2016-04-06 18:40:28 -0400 |
commit | 9de9f5aad4ec0275e3c544fcb26588ea0e755760 (patch) | |
tree | 492124ae7448a3e287b0c1f4af855aec727c736b | |
parent | 070b1a03392ab3962eb43f60f32fde5c1b9b70d2 (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.hs | 14 | ||||
-rw-r--r-- | Annex/AutoMerge.hs | 6 | ||||
-rw-r--r-- | Annex/Direct.hs | 1 | ||||
-rw-r--r-- | Command/Sync.hs | 2 | ||||
-rw-r--r-- | Git/Merge.hs | 9 |
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 = [] |