mirror of
https://github.com/git/git.git
synced 2024-11-23 18:05:29 +08:00
merge: teach -Xours/-Xtheirs to symbolic link merge
The -Xours/-Xtheirs merge options were originally defined as a way
to "force" the resolution of 3way textual merge conflicts to take
one side without using your editor, hence did not even trigger in
situations where you would normally not get the <<< === >>> conflict
markers.
This was improved for binary files back in 2012 with a944af1d
("merge: teach -Xours/-Xtheirs to binary ll-merge driver",
2012-09-08).
Teach a similar trick to the codepath that deals with merging two
conflicting changes to symbolic links.
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Tested-by: Yaroslav Halchenko <yoh@onerussian.com>
Reviewed-by: Elijah Newren <newren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
94c9fd268d
commit
fd48b46474
@ -1002,10 +1002,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)) {
|
||||||
oidcpy(&result->oid, &a->oid);
|
switch (o->recursive_variant) {
|
||||||
|
case MERGE_RECURSIVE_NORMAL:
|
||||||
if (!oid_eq(&a->oid, &b->oid))
|
oidcpy(&result->oid, &a->oid);
|
||||||
result->clean = 0;
|
if (!oid_eq(&a->oid, &b->oid))
|
||||||
|
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");
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user