sync, assistant: When merge.directoryRenames is not set, default it it to "false"

Works better with automatic merge conflict resolution than git's ususual
default of "conflict".

This is not done when automatic merge conflict resolution is disabled.

This commit was sponsored by Mark Reidenbach on Patreon.
This commit is contained in:
Joey Hess 2020-09-07 13:50:58 -04:00
parent f4c4b89aa3
commit d120c73302
No known key found for this signature in database
GPG key ID: DB12DB0FF05F8F38
5 changed files with 34 additions and 6 deletions

View file

@ -402,7 +402,7 @@ mergeToAdjustedBranch tomerge (origbranch, adj) mergeconfig canresolvemerge comm
-- http://thread.gmane.org/gmane.comp.version-control.git/297237 -- http://thread.gmane.org/gmane.comp.version-control.git/297237
inRepo $ Git.Command.run [Param "reset", Param "HEAD", Param "--quiet"] inRepo $ Git.Command.run [Param "reset", Param "HEAD", Param "--quiet"]
showAction $ "Merging into " ++ fromRef (Git.Ref.base origbranch) showAction $ "Merging into " ++ fromRef (Git.Ref.base origbranch)
merged <- autoMergeFrom' tomerge Nothing mergeconfig commitmode merged <- autoMergeFrom' tomerge Nothing mergeconfig commitmode True
(const $ resolveMerge (Just updatedorig) tomerge True) (const $ resolveMerge (Just updatedorig) tomerge True)
if merged if merged
then do then do

View file

@ -15,6 +15,7 @@ module Annex.AutoMerge
) where ) where
import Annex.Common import Annex.Common
import qualified Annex
import qualified Annex.Queue import qualified Annex.Queue
import Annex.CatFile import Annex.CatFile
import Annex.Link import Annex.Link
@ -46,22 +47,41 @@ import qualified Data.ByteString.Lazy as L
-} -}
autoMergeFrom :: Git.Ref -> Maybe Git.Ref -> [Git.Merge.MergeConfig] -> Git.Branch.CommitMode -> Bool -> Annex Bool autoMergeFrom :: Git.Ref -> Maybe Git.Ref -> [Git.Merge.MergeConfig] -> Git.Branch.CommitMode -> Bool -> Annex Bool
autoMergeFrom branch currbranch mergeconfig commitmode canresolvemerge = autoMergeFrom branch currbranch mergeconfig commitmode canresolvemerge =
autoMergeFrom' branch currbranch mergeconfig commitmode resolvemerge autoMergeFrom' branch currbranch mergeconfig commitmode canresolvemerge resolvemerge
where where
resolvemerge old resolvemerge old
| canresolvemerge = resolveMerge old branch False | canresolvemerge = resolveMerge old branch False
| otherwise = return False | otherwise = return False
autoMergeFrom' :: Git.Ref -> Maybe Git.Ref -> [Git.Merge.MergeConfig] -> Git.Branch.CommitMode -> (Maybe Git.Ref -> Annex Bool) -> Annex Bool autoMergeFrom' :: Git.Ref -> Maybe Git.Ref -> [Git.Merge.MergeConfig] -> Git.Branch.CommitMode -> Bool -> (Maybe Git.Ref -> Annex Bool) -> Annex Bool
autoMergeFrom' branch currbranch mergeconfig commitmode resolvemerge = do autoMergeFrom' branch currbranch mergeconfig commitmode willresolvemerge toresolvemerge = do
showOutput showOutput
case currbranch of case currbranch of
Nothing -> go Nothing Nothing -> go Nothing
Just b -> go =<< inRepo (Git.Ref.sha b) Just b -> go =<< inRepo (Git.Ref.sha b)
where where
go old = do go old = do
r <- inRepo (Git.Merge.merge branch mergeconfig commitmode) -- merge.directoryRenames=conflict plus automatic
<||> (resolvemerge old <&&> commitResolvedMerge commitmode) -- merge conflict resolution results in files in a
-- "renamed" directory getting variant names,
-- so is not a great combination. If the user has
-- explicitly set it, use it, but otherwise when
-- merge conflicts will be resolved, override
-- to merge.directoryRenames=false.
overridedirectoryrenames <- if willresolvemerge
then isNothing . mergeDirectoryRenames
<$> Annex.getGitConfig
else pure False
let f r
| overridedirectoryrenames = r
{ Git.gitGlobalOpts =
Param "-c"
: Param "merge.directoryRenames=false"
: Git.gitGlobalOpts r
}
| otherwise = r
r <- inRepo (Git.Merge.merge branch mergeconfig commitmode . f)
<||> (toresolvemerge old <&&> commitResolvedMerge commitmode)
-- Merging can cause new associated files to appear -- Merging can cause new associated files to appear
-- and the smudge filter will add them to the database. -- and the smudge filter will add them to the database.
-- To ensure that this process sees those changes, -- To ensure that this process sees those changes,

View file

@ -33,6 +33,10 @@ git-annex (8.20200815) UNRELEASED; urgency=medium
* import: Retry downloads that fail, same as is done for downloads generally. * import: Retry downloads that fail, same as is done for downloads generally.
* resolvemerge: Improve cleanup of files that were deleted by one side of * resolvemerge: Improve cleanup of files that were deleted by one side of
a conflicted merge, and modified by the other side. a conflicted merge, and modified by the other side.
* sync, assistant, merge: When merge.directoryRenames is not set,
default it it to "false", which works better with automatic merge
conflict resolution than git's ususual default of "conflict".
(This is not done when automatic merge conflict resolution is disabled.)
-- Joey Hess <id@joeyh.name> Fri, 14 Aug 2020 14:57:45 -0400 -- Joey Hess <id@joeyh.name> Fri, 14 Aug 2020 14:57:45 -0400

View file

@ -130,6 +130,7 @@ data GitConfig = GitConfig
, receiveDenyCurrentBranch :: DenyCurrentBranch , receiveDenyCurrentBranch :: DenyCurrentBranch
, gcryptId :: Maybe String , gcryptId :: Maybe String
, gpgCmd :: GpgCmd , gpgCmd :: GpgCmd
, mergeDirectoryRenames :: Maybe String
} }
extractGitConfig :: ConfigSource -> Git.Repo -> GitConfig extractGitConfig :: ConfigSource -> Git.Repo -> GitConfig
@ -223,6 +224,7 @@ extractGitConfig configsource r = GitConfig
, receiveDenyCurrentBranch = getDenyCurrentBranch r , receiveDenyCurrentBranch = getDenyCurrentBranch r
, gcryptId = getmaybe "core.gcrypt-id" , gcryptId = getmaybe "core.gcrypt-id"
, gpgCmd = mkGpgCmd (getmaybe "gpg.program") , gpgCmd = mkGpgCmd (getmaybe "gpg.program")
, mergeDirectoryRenames = getmaybe "directoryrenames"
} }
where where
getbool k d = fromMaybe d $ getmaybebool k getbool k d = fromMaybe d $ getmaybebool k

View file

@ -46,3 +46,5 @@ to detect it and handle it specially.
> git-annex sync should set merge.directoryRenames=false when > git-annex sync should set merge.directoryRenames=false when
> merge.directoryRenames is not configured, unless automatic merge conflict > merge.directoryRenames is not configured, unless automatic merge conflict
> resolution is disabled. --[[Joey]] > resolution is disabled. --[[Joey]]
>
> > [[done]] --[[Joey]]