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.
This commit is contained in:
Joey Hess 2016-04-22 14:26:44 -04:00
parent 8ab27235ea
commit 46e3319995
Failed to extract signature
9 changed files with 90 additions and 46 deletions

View file

@ -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