diff options
author | Joey Hess <joeyh@joeyh.name> | 2017-06-01 12:46:36 -0400 |
---|---|---|
committer | Joey Hess <joeyh@joeyh.name> | 2017-06-01 12:51:01 -0400 |
commit | de8f6959d3cd4af348e7a72c45e6e1d6d3cd4cfa (patch) | |
tree | f63493430204d764d84a44a909f68b778b719716 /Command | |
parent | 5c058d99a26da3639afcbf855eb7b6ca3d628fb3 (diff) |
configuration to disable automatic merge conflict resolution
* Added annex.resolvemerge configuration, which can be set to false to
disable the usual automatic merge conflict resolution done by git-annex
sync and the assistant.
* sync: Added --no-resolvemerge option.
Note that disabling merge conflict resolution is probably not a good idea
in a direct mode repo or adjusted branch. Since updates to both are done
outside the usual work tree, if it fails the tree is not left in a
conflicted state, and it would be hard to manually resolve the conflict.
Still, made annex.resolvemerge be supported in those cases for consistency.
This commit was sponsored by Riku Voipio.
Diffstat (limited to 'Command')
-rw-r--r-- | Command/Merge.hs | 2 | ||||
-rw-r--r-- | Command/PostReceive.hs | 2 | ||||
-rw-r--r-- | Command/Sync.hs | 41 |
3 files changed, 29 insertions, 16 deletions
diff --git a/Command/Merge.hs b/Command/Merge.hs index 80a8227d1..4f99093ab 100644 --- a/Command/Merge.hs +++ b/Command/Merge.hs @@ -33,4 +33,4 @@ mergeBranch = do mergeSynced :: CommandStart mergeSynced = do prepMerge - mergeLocal mergeConfig =<< join getCurrBranch + mergeLocal mergeConfig def =<< join getCurrBranch diff --git a/Command/PostReceive.hs b/Command/PostReceive.hs index ffb5516a2..4db775214 100644 --- a/Command/PostReceive.hs +++ b/Command/PostReceive.hs @@ -48,4 +48,4 @@ fixPostReceiveHookEnv = do updateInsteadEmulation :: CommandStart updateInsteadEmulation = do prepMerge - mergeLocal mergeConfig =<< join getCurrBranch + mergeLocal mergeConfig def =<< join getCurrBranch diff --git a/Command/Sync.hs b/Command/Sync.hs index 332daca73..9ecb98620 100644 --- a/Command/Sync.hs +++ b/Command/Sync.hs @@ -76,8 +76,14 @@ data SyncOptions = SyncOptions , noContentOption :: Bool , contentOfOption :: [FilePath] , keyOptions :: Maybe KeyOptions + , resolveMergeOverride :: ResolveMergeOverride } +newtype ResolveMergeOverride = ResolveMergeOverride Bool + +instance Default ResolveMergeOverride where + def = ResolveMergeOverride False + optParser :: CmdParamsDesc -> Parser SyncOptions optParser desc = SyncOptions <$> (many $ argument str @@ -117,6 +123,9 @@ optParser desc = SyncOptions <> metavar paramPath )) <*> optional parseAllOption + <*> (ResolveMergeOverride <$> invertableSwitch "resolvemerge" True + ( help "do not automatically resolve merge conflicts" + )) -- Since prepMerge changes the working directory, FilePath options -- have to be adjusted. @@ -132,6 +141,7 @@ instance DeferredParseClass SyncOptions where <*> pure (noContentOption v) <*> liftIO (mapM absPath (contentOfOption v)) <*> pure (keyOptions v) + <*> pure (resolveMergeOverride v) seek :: SyncOptions -> CommandSeek seek o = allowConcurrentOutput $ do @@ -150,7 +160,7 @@ seek o = allowConcurrentOutput $ do -- These actions cannot be run concurrently. mapM_ includeCommandAction $ concat [ [ commit o ] - , [ withbranch (mergeLocal mergeConfig) ] + , [ withbranch (mergeLocal mergeConfig (resolveMergeOverride o)) ] , map (withbranch . pullRemote o mergeConfig) gitremotes , [ mergeAnnex ] ] @@ -219,11 +229,14 @@ mergeConfig = , Git.Merge.MergeUnrelatedHistories ] -merge :: CurrBranch -> [Git.Merge.MergeConfig] -> Git.Branch.CommitMode -> Git.Branch -> Annex Bool -merge (Just b, Just adj) mergeconfig commitmode tomerge = - updateAdjustedBranch tomerge (b, adj) mergeconfig commitmode -merge (b, _) mergeconfig commitmode tomerge = - autoMergeFrom tomerge b mergeconfig commitmode +merge :: CurrBranch -> [Git.Merge.MergeConfig] -> ResolveMergeOverride -> Git.Branch.CommitMode -> Git.Branch -> Annex Bool +merge currbranch mergeconfig resolvemergeoverride commitmode tomerge = case currbranch of + (Just b, Just adj) -> updateAdjustedBranch tomerge (b, adj) mergeconfig canresolvemerge commitmode + (b, _) -> autoMergeFrom tomerge b mergeconfig canresolvemerge commitmode + where + canresolvemerge = case resolvemergeoverride of + ResolveMergeOverride True -> getGitConfigVal annexResolveMerge + ResolveMergeOverride False -> return False syncBranch :: Git.Branch -> Git.Branch syncBranch = Git.Ref.underBase "refs/heads/synced" . fromDirectBranch . fromAdjustedBranch @@ -296,15 +309,15 @@ commitStaged commitmode commitmessage = do void $ inRepo $ Git.Branch.commit commitmode False commitmessage branch parents return True -mergeLocal :: [Git.Merge.MergeConfig] -> CurrBranch -> CommandStart -mergeLocal mergeconfig currbranch@(Just _, _) = +mergeLocal :: [Git.Merge.MergeConfig] -> ResolveMergeOverride -> CurrBranch -> CommandStart +mergeLocal mergeconfig resolvemergeoverride currbranch@(Just _, _) = go =<< needMerge currbranch where go Nothing = stop go (Just syncbranch) = do showStart "merge" $ Git.Ref.describe syncbranch - next $ next $ merge currbranch mergeconfig Git.Branch.ManualCommit syncbranch -mergeLocal _ (Nothing, madj) = do + next $ next $ merge currbranch mergeconfig resolvemergeoverride Git.Branch.ManualCommit syncbranch +mergeLocal _ _ (Nothing, madj) = do b <- inRepo Git.Branch.currentUnsafe ifM (isJust <$> needMerge (b, madj)) ( do @@ -365,7 +378,7 @@ pullRemote o mergeconfig remote branch = stopUnless (pure $ pullOption o && want next $ do showOutput stopUnless fetch $ - next $ mergeRemote remote branch mergeconfig + next $ mergeRemote remote branch mergeconfig (resolveMergeOverride o) where fetch = inRepoWithSshOptionsTo (Remote.repo remote) (Remote.gitconfig remote) $ Git.Command.runBool @@ -377,8 +390,8 @@ pullRemote o mergeconfig remote branch = stopUnless (pure $ pullOption o && want - were committed (or pushed changes, if this is a bare remote), - while the synced/master may have changes that some - other remote synced to this remote. So, merge them both. -} -mergeRemote :: Remote -> CurrBranch -> [Git.Merge.MergeConfig] -> CommandCleanup -mergeRemote remote currbranch mergeconfig = ifM isBareRepo +mergeRemote :: Remote -> CurrBranch -> [Git.Merge.MergeConfig] -> ResolveMergeOverride -> CommandCleanup +mergeRemote remote currbranch mergeconfig resolvemergeoverride = ifM isBareRepo ( return True , case currbranch of (Nothing, _) -> do @@ -390,7 +403,7 @@ mergeRemote remote currbranch mergeconfig = ifM isBareRepo ) where mergelisted getlist = and <$> - (mapM (merge currbranch mergeconfig Git.Branch.ManualCommit . remoteBranch remote) =<< getlist) + (mapM (merge currbranch mergeconfig resolvemergeoverride Git.Branch.ManualCommit . remoteBranch remote) =<< getlist) tomerge = filterM (changed remote) branchlist Nothing = [] branchlist (Just branch) = [branch, syncBranch branch] |