git-annex/Git/Merge.hs
Joey Hess 6ec154d70c
use --allow-unrelated-histories for now
I'd prefer to use the env var, but let's use what git currently supports.
Revert this when the env var gets supported.

Note that the version checking assumes git 2.8.2 will get support for the
switch.
2016-04-22 15:57:28 -04:00

66 lines
1.7 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 qualified Git.BuildVersion
import qualified Git.Version
import Git.Branch (CommitMode(..))
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 || Git.BuildVersion.older "1.7.7.6" =
go [Param $ fromRef branch]
| otherwise = go [Param "--no-edit", Param $ fromRef branch]
where
go ps = merge'' (sp ++ [Param "merge"] ++ ps ++ extraparams) mergeconfig r
sp
| commitmode == AutomaticCommit =
[Param "-c", Param "commit.gpgsign=false"]
| otherwise = []
merge'' :: [CommandParam] -> [MergeConfig] -> Repo -> IO Bool
merge'' ps mergeconfig r
| MergeUnrelatedHistories `elem` mergeconfig =
ifM (Git.Version.older "2.8.2")
( go (ps ++ [Param "--allow-unrelated-histories"])
, go ps
)
| otherwise = go ps
where
go ps' = runBool ps' r
{- Stage the merge into the index, but do not commit it.-}
stageMerge :: Ref -> [MergeConfig] -> Repo -> IO Bool
stageMerge branch = merge''
[ 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
]