Browse Source

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

"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
maint
Junio C Hamano 7 years ago
parent
commit
ff19620f81
  1. 17
      merge-recursive.c
  2. 32
      t/t6037-merge-ours-theirs.sh

17
merge-recursive.c

@ -1026,10 +1026,19 @@ static int merge_file_1(struct merge_options *o, @@ -1026,10 +1026,19 @@ static int merge_file_1(struct merge_options *o,
&b->oid,
!o->call_depth);
} else if (S_ISLNK(a->mode)) {
oidcpy(&result->oid, &a->oid);

if (!oid_eq(&a->oid, &b->oid))
result->clean = 0;
switch (o->recursive_variant) {
case MERGE_RECURSIVE_NORMAL:
oidcpy(&result->oid, &a->oid);
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
die("BUG: unsupported object type in the tree");
}

32
t/t6037-merge-ours-theirs.sh

@ -73,4 +73,36 @@ test_expect_success 'pull passes -X to underlying merge' ' @@ -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
'

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

Loading…
Cancel
Save