1
0
Fork 0
mirror of https://github.com/git/git.git synced 2024-06-02 04:46:30 +02:00

t6423: add tests of dual directory rename plus add/add conflict

This is an attempt at minimalizing a testcase reported by Glen Choo
with tensorflow where merge-ort would report an assertion failure:

    Assertion failed: (ci->filemask == 2 || ci->filemask == 4), function apply_directory_rename_modifications, file merge-ort.c, line 2410

reversing the direction of the merge provides a different error:

    error: cache entry has null sha1: ...
    fatal: unable to write .git/index

so we add testcases for both.  With these new testcases, the
recursive strategy differs in that it returns the latter error for
both merge directions.

These testcases are somehow a little different than Glen's original
tensorflow testcase in that these ones trigger a bug with the recursive
algorithm whereas his testcase didn't.  I figure that means these
testcases somehow manage to be more comprehensive.

Reported-by: Glen Choo <chooglen@google.com>
Signed-off-by: Elijah Newren <newren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Elijah Newren 2022-07-05 01:33:39 +00:00 committed by Junio C Hamano
parent dc8c8deaa6
commit 0565cee5e4

View File

@ -5199,6 +5199,111 @@ test_expect_success '12k: Directory rename with sibling causes rename-to-self' '
)
'
# Testcase 12l, Both sides rename a directory into the other side, both add
# a file which after directory renames are the same filename
# Commit O: sub1/file, sub2/other
# Commit A: sub3/file, sub2/{other, new_add_add_file_1}
# Commit B: sub1/{file, newfile}, sub1/sub2/{other, new_add_add_file_2}
#
# In words:
# A: sub1/ -> sub3/, add sub2/new_add_add_file_1
# B: sub2/ -> sub1/sub2, add sub1/newfile, add sub1/sub2/new_add_add_file_2
#
# Expected: sub3/{file, newfile, sub2/other}
# CONFLICT (add/add): sub1/sub2/new_add_add_file
#
# Note that sub1/newfile is not extraneous. Directory renames are only
# detected if they are needed, and they are only needed if the old directory
# had a new file added on the opposite side of history. So sub1/newfile
# is needed for there to be a sub1/ -> sub3/ rename.
test_setup_12l () {
test_create_repo 12l_$1 &&
(
cd 12l_$1 &&
mkdir sub1 sub2
echo file >sub1/file &&
echo other >sub2/other &&
git add sub1 sub2 &&
git commit -m "O" &&
git branch O &&
git branch A &&
git branch B &&
git checkout A &&
git mv sub1 sub3 &&
echo conflicting >sub2/new_add_add_file &&
git add sub2 &&
test_tick &&
git add -u &&
git commit -m "A" &&
git checkout B &&
echo dissimilar >sub2/new_add_add_file &&
echo brand >sub1/newfile &&
git add sub1 sub2 &&
git mv sub2 sub1 &&
test_tick &&
git commit -m "B"
)
}
test_expect_merge_algorithm failure failure '12l (B into A): Rename into each other + add/add conflict' '
test_setup_12l BintoA &&
(
cd 12l_BintoA &&
git checkout -q A^0 &&
test_must_fail git -c merge.directoryRenames=true merge -s recursive B^0 &&
test_stdout_line_count = 5 git ls-files -s &&
git rev-parse >actual \
:0:sub3/file :0:sub3/newfile :0:sub3/sub2/other \
:2:sub1/sub2/new_add_add_file \
:3:sub1/sub2/new_add_add_file &&
git rev-parse >expect \
O:sub1/file B:sub1/newfile O:sub2/other \
A:sub2/new_add_add_file \
B:sub1/sub2/new_add_add_file &&
test_cmp expect actual &&
git ls-files -o >actual &&
test_write_lines actual expect >expect &&
test_cmp expect actual
)
'
test_expect_merge_algorithm failure failure '12l (A into B): Rename into each other + add/add conflict' '
test_setup_12l AintoB &&
(
cd 12l_AintoB &&
git checkout -q B^0 &&
test_must_fail git -c merge.directoryRenames=true merge -s recursive A^0 &&
test_stdout_line_count = 5 git ls-files -s &&
git rev-parse >actual \
:0:sub3/file :0:sub3/newfile :0:sub3/sub2/other \
:2:sub1/sub2/new_add_add_file \
:3:sub1/sub2/new_add_add_file &&
git rev-parse >expect \
O:sub1/file B:sub1/newfile O:sub2/other \
B:sub1/sub2/new_add_add_file \
A:sub2/new_add_add_file &&
test_cmp expect actual &&
git ls-files -o >actual &&
test_write_lines actual expect >expect &&
test_cmp expect actual
)
'
###########################################################################
# SECTION 13: Checking informational and conflict messages
#