sync: Automatically resolve merge conflict between and annexed file and a regular git file.

This is a new feature, it was not handled before, since it's a bit of an
edge case. However, it can be handled exactly the same as a file/dir
conflict, just leave the non-annexed item alone.

While implementing this, the core resolveMerge' function got a lot simpler
and clearer. Note especially that where before there was an asymetric call to
stagefromdirectmergedir, now graftin is called symmetrically in both cases.

And, in order to add that `graftin us`, the current branch needed to be
known (if there is no current branch, there cannot be a merge conflict).
This led to some cleanups of how autoMergeFrom behaved when there is no
current branch.

This commit was sponsored by Philippe Gauthier.
This commit is contained in:
Joey Hess 2014-03-04 17:45:11 -04:00
parent 1fcc5bef66
commit 14d1e878ab
5 changed files with 81 additions and 77 deletions

View file

@ -925,8 +925,8 @@ test_nonannexed_conflict_resolution env = do
when switchdirect $
git_annex env "direct" [] @? "failed switching to direct mode"
git_annex env "sync" [] @? "sync failed"
checkmerge "r1" r1
checkmerge "r2" r2
checkmerge ("r1" ++ show switchdirect) r1
checkmerge ("r2" ++ show switchdirect) r2
conflictor = "conflictor"
nonannexed_content = "nonannexed"
variantprefix = conflictor ++ ".variant"
@ -936,8 +936,9 @@ test_nonannexed_conflict_resolution env = do
not (null v)
@? (what ++ " conflictor variant file missing in: " ++ show l )
conflictor `elem` l @? (what ++ " conflictor file missing in: " ++ show l)
s <- readFile (d </> conflictor)
s == nonannexed_content @? (what ++ " wrong content for nonannexed file: " ++ s)
s <- catchMaybeIO (readFile (d </> conflictor))
s == Just nonannexed_content
@? (what ++ " wrong content for nonannexed file: " ++ show s)
{- Check merge conflict resolution when there is a local file,
- that is not staged or committed, that conflicts with what's being added