summaryrefslogtreecommitdiff
path: root/Git/Merge.hs
diff options
context:
space:
mode:
Diffstat (limited to 'Git/Merge.hs')
-rw-r--r--Git/Merge.hs47
1 files changed, 34 insertions, 13 deletions
diff --git a/Git/Merge.hs b/Git/Merge.hs
index 21eeaf181..c783521df 100644
--- a/Git/Merge.hs
+++ b/Git/Merge.hs
@@ -1,36 +1,51 @@
{- git merging
-
- - Copyright 2012, 2014 Joey Hess <id@joeyh.name>
+ - Copyright 2012-2016 Joey Hess <id@joeyh.name>
-
- Licensed under the GNU GPL version 3 or higher.
-}
-module Git.Merge where
+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
-{- Avoids recent git's interactive merge. -}
-mergeNonInteractive :: Ref -> CommitMode -> Repo -> IO Bool
-mergeNonInteractive = mergeNonInteractive' []
+data MergeConfig
+ = MergeNonInteractive
+ -- ^ avoids recent git's interactive merge
+ | MergeUnrelatedHistories
+ -- ^ avoids recent git's prevention of merging unrelated histories
+ deriving (Eq)
-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]
+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
- merge ps = runBool $ sp ++ [Param "merge"] ++ ps ++ extraparams
+ 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 -> Repo -> IO Bool
-stageMerge branch = runBool
+stageMerge :: Ref -> [MergeConfig] -> Repo -> IO Bool
+stageMerge branch mergeconfig r = runBool
[ Param "merge"
, Param "--quiet"
, Param "--no-commit"
@@ -38,4 +53,10 @@ stageMerge branch = runBool
-- 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