Merge branch 'jc/merge-symlink-ours-theirs'

"git merge -Xours/-Xtheirs" learned to use our/their version when
resolving a conflicting updates to a symbolic link.

* jc/merge-symlink-ours-theirs:
  merge: teach -Xours/-Xtheirs to symbolic link merge
This commit is contained in:
Junio C Hamano 2018-01-23 13:16:37 -08:00
commit 14b9d9aa0d
2 changed files with 45 additions and 4 deletions

View File

@ -1026,10 +1026,19 @@ static int merge_file_1(struct merge_options *o,
&b->oid, &b->oid,
!o->call_depth); !o->call_depth);
} else if (S_ISLNK(a->mode)) { } else if (S_ISLNK(a->mode)) {
switch (o->recursive_variant) {
case MERGE_RECURSIVE_NORMAL:
oidcpy(&result->oid, &a->oid); oidcpy(&result->oid, &a->oid);
if (!oid_eq(&a->oid, &b->oid)) if (!oid_eq(&a->oid, &b->oid))
result->clean = 0; result->clean = 0;
break;
case MERGE_RECURSIVE_OURS:
oidcpy(&result->oid, &a->oid);
break;
case MERGE_RECURSIVE_THEIRS:
oidcpy(&result->oid, &b->oid);
break;
}
} else } else
die("BUG: unsupported object type in the tree"); die("BUG: unsupported object type in the tree");
} }

View File

@ -73,4 +73,36 @@ test_expect_success 'pull passes -X to underlying merge' '
git reset --hard master && test_must_fail git pull -s recursive -X bork . side git reset --hard master && test_must_fail git pull -s recursive -X bork . side
' '
test_expect_success SYMLINKS 'symlink with -Xours/-Xtheirs' '
git reset --hard master &&
git checkout -b two master &&
ln -s target-zero link &&
git add link &&
git commit -m "add link pointing to zero" &&
ln -f -s target-two link &&
git commit -m "add link pointing to two" link &&
git checkout -b one HEAD^ &&
ln -f -s target-one link &&
git commit -m "add link pointing to one" link &&
# we expect symbolic links not to resolve automatically, of course
git checkout one^0 &&
test_must_fail git merge -s recursive two &&
# favor theirs to resolve to target-two?
git reset --hard &&
git checkout one^0 &&
git merge -s recursive -X theirs two &&
git diff --exit-code two HEAD link &&
# favor ours to resolve to target-one?
git reset --hard &&
git checkout one^0 &&
git merge -s recursive -X ours two &&
git diff --exit-code one HEAD link
'
test_done test_done