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:
parent
8ab27235ea
commit
46e3319995
9 changed files with 90 additions and 46 deletions
47
Git/Merge.hs
47
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
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue