Browse Source

merge-recursive: mark rename/delete conflict as unmerged

When a file was renamed in one branch, but deleted in the other, one
should expect the index to contain an unmerged entry, namely the
target of the rename.  Make it so.

Noticed by Constantine Plotnikov.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
maint
Johannes Schindelin 16 years ago committed by Junio C Hamano
parent
commit
36e3b5eafe
  1. 5
      merge-recursive.c
  2. 23
      t/t6024-recursive-merge.sh

5
merge-recursive.c

@ -902,6 +902,11 @@ static int process_renames(struct merge_options *o, @@ -902,6 +902,11 @@ static int process_renames(struct merge_options *o,
ren1_src, ren1_dst, branch1,
branch2);
update_file(o, 0, ren1->pair->two->sha1, ren1->pair->two->mode, ren1_dst);
update_stages(ren1_dst, NULL,
branch1 == o->branch1 ?
ren1->pair->two : NULL,
branch1 == o->branch1 ?
NULL : ren1->pair->two, 1);
} else if (!sha_eq(dst_other.sha1, null_sha1)) {
const char *new_path;
clean_merge = 0;

23
t/t6024-recursive-merge.sh

@ -97,4 +97,27 @@ test_expect_success 'refuse to merge binary files' ' @@ -97,4 +97,27 @@ test_expect_success 'refuse to merge binary files' '
merge.err
'

test_expect_success 'mark rename/delete as unmerged' '

git reset --hard &&
git checkout -b delete &&
git rm a1 &&
test_tick &&
git commit -m delete &&
git checkout -b rename HEAD^ &&
git mv a1 a2
test_tick &&
git commit -m rename &&
test_must_fail git merge delete &&
test 1 = $(git ls-files --unmerged | wc -l) &&
git rev-parse --verify :2:a2 &&
test_must_fail git rev-parse --verify :3:a2 &&
git checkout -f delete &&
test_must_fail git merge rename &&
test 1 = $(git ls-files --unmerged | wc -l) &&
test_must_fail git rev-parse --verify :2:a2 &&
git rev-parse --verify :3:a2

'

test_done

Loading…
Cancel
Save