git-annex/Git/Merge.hs
Joey Hess 46e3319995
assistant: Deal with upcoming git's refusal to merge unrelated histories by default
git 2.8.1 (or perhaps 2.9.0) is going to prevent git merge from merging in
unrelated branches. Since the webapp's pairing etc features often combine
together repositories with unrelated histories, work around this behavior
change by setting GIT_MERGE_ALLOW_UNRELATED_HISTORIES when the assistant
merges.

Note though that this is not done for git annex sync's merges, so
it will follow git's default or configured behavior.
2016-04-22 14:26:44 -04:00

62 lines
1.6 KiB
Haskell

{- git merging
-
- Copyright 2012-2016 Joey Hess <id@joeyh.name>
-
- Licensed under the GNU GPL version 3 or higher.
-}
module Git.Merge (
MergeConfig(..),
CommitMode(..),
merge,
merge',
stageMerge,
) where
import Common
import Git
import Git.Command
import Git.BuildVersion
import Git.Branch (CommitMode(..))
import Git.Env
data MergeConfig
= MergeNonInteractive
-- ^ avoids recent git's interactive merge
| MergeUnrelatedHistories
-- ^ avoids recent git's prevention of merging unrelated histories
deriving (Eq)
merge :: Ref -> [MergeConfig] -> CommitMode -> Repo -> IO Bool
merge = merge' []
merge' :: [CommandParam] -> Ref -> [MergeConfig] -> CommitMode -> Repo -> IO Bool
merge' extraparams branch mergeconfig commitmode r
| MergeNonInteractive `notElem` mergeconfig || older "1.7.7.6" =
go [Param $ fromRef branch]
| otherwise = go [Param "--no-edit", Param $ fromRef branch]
where
go ps = runBool (sp ++ [Param "merge"] ++ ps ++ extraparams)
=<< cfgRepo mergeconfig r
sp
| commitmode == AutomaticCommit =
[Param "-c", Param "commit.gpgsign=false"]
| otherwise = []
{- Stage the merge into the index, but do not commit it.-}
stageMerge :: Ref -> [MergeConfig] -> Repo -> IO Bool
stageMerge branch mergeconfig r = runBool
[ Param "merge"
, Param "--quiet"
, Param "--no-commit"
-- Without this, a fast-forward merge is done, since it involves no
-- commit.
, Param "--no-ff"
, Param $ fromRef branch
] =<< cfgRepo mergeconfig r
cfgRepo :: [MergeConfig] -> Repo -> IO Repo
cfgRepo mergeconfig r
| MergeUnrelatedHistories `elem` mergeconfig =
addGitEnv r "GIT_MERGE_ALLOW_UNRELATED_HISTORIES" "1"
| otherwise = return r