Merge branch 'en/merge-directory-renames-fix'

Recent code restructuring of merge-recursive engine introduced a
regression dealing with rename/add conflict.

* en/merge-directory-renames-fix:
  merge-recursive: restore accidentally dropped setting of path
This commit is contained in:
Junio C Hamano 2019-06-06 14:03:36 -07:00
commit 20fbf7dd42
2 changed files with 117 additions and 0 deletions

View File

@ -1660,6 +1660,7 @@ static int handle_rename_add(struct merge_options *opt,
c->path, add_branch);
prev_path_desc = xstrfmt("version of %s from %s", path, a->path);
ci->ren1->src_entry->stages[other_stage].path = a->path;
if (merge_mode_and_contents(opt, a, c,
&ci->ren1->src_entry->stages[other_stage],
prev_path_desc,

View File

@ -411,6 +411,122 @@ test_expect_success 'disappearing dir in rename/directory conflict handled' '
)
'
# Test for basic rename/add-dest conflict, with rename needing content merge:
# Commit O: a
# Commit A: rename a->b, modifying b too
# Commit B: modify a, add different b
test_expect_success 'setup rename-with-content-merge vs. add' '
test_create_repo rename-with-content-merge-and-add &&
(
cd rename-with-content-merge-and-add &&
test_seq 1 5 >a &&
git add a &&
git commit -m O &&
git tag O &&
git checkout -b A O &&
git mv a b &&
test_seq 0 5 >b &&
git add b &&
git commit -m A &&
git checkout -b B O &&
echo 6 >>a &&
echo hello world >b &&
git add a b &&
git commit -m B
)
'
test_expect_success 'handle rename-with-content-merge vs. add' '
(
cd rename-with-content-merge-and-add &&
git checkout A^0 &&
test_must_fail git merge -s recursive B^0 >out &&
test_i18ngrep "CONFLICT (rename/add)" out &&
git ls-files -s >out &&
test_line_count = 2 out &&
git ls-files -u >out &&
test_line_count = 2 out &&
# Also, make sure both unmerged entries are for "b"
git ls-files -u b >out &&
test_line_count = 2 out &&
git ls-files -o >out &&
test_line_count = 1 out &&
test_path_is_missing a &&
test_path_is_file b &&
test_seq 0 6 >tmp &&
git hash-object tmp >expect &&
git rev-parse B:b >>expect &&
git rev-parse >actual \
:2:b :3:b &&
test_cmp expect actual &&
# Test that the two-way merge in b is as expected
git cat-file -p :2:b >>ours &&
git cat-file -p :3:b >>theirs &&
>empty &&
test_must_fail git merge-file \
-L "HEAD" \
-L "" \
-L "B^0" \
ours empty theirs &&
test_cmp ours b
)
'
test_expect_success 'handle rename-with-content-merge vs. add, merge other way' '
(
cd rename-with-content-merge-and-add &&
git reset --hard &&
git clean -fdx &&
git checkout B^0 &&
test_must_fail git merge -s recursive A^0 >out &&
test_i18ngrep "CONFLICT (rename/add)" out &&
git ls-files -s >out &&
test_line_count = 2 out &&
git ls-files -u >out &&
test_line_count = 2 out &&
# Also, make sure both unmerged entries are for "b"
git ls-files -u b >out &&
test_line_count = 2 out &&
git ls-files -o >out &&
test_line_count = 1 out &&
test_path_is_missing a &&
test_path_is_file b &&
test_seq 0 6 >tmp &&
git rev-parse B:b >expect &&
git hash-object tmp >>expect &&
git rev-parse >actual \
:2:b :3:b &&
test_cmp expect actual &&
# Test that the two-way merge in b is as expected
git cat-file -p :2:b >>ours &&
git cat-file -p :3:b >>theirs &&
>empty &&
test_must_fail git merge-file \
-L "HEAD" \
-L "" \
-L "A^0" \
ours empty theirs &&
test_cmp ours b
)
'
# Test for all kinds of things that can go wrong with rename/rename (2to1):
# Commit A: new files: a & b
# Commit B: rename a->c, modify b