t4058: explore duplicate tree entry handling in a bit more detail

While creating the last commit, I found a number of other cases where
git would segfault when faced with trees that have duplicate entries.
None of these segfaults are in the diffcore-rename code (they all occur
in cache-tree and unpack-trees).  Further, to my knowledge, no one has
ever been adversely affected by these bugs, and given that it has been
15 years and folks have fixed a few other issues with historical
duplicate entries (as noted in the last commit), I am not sure we will
ever run into anyone having problems with these.  So I am not sure these
are worth fixing, but it doesn't hurt to at least document these
failures in the same test file that is concerned with duplicate tree
entries.

Signed-off-by: Elijah Newren <newren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Elijah Newren
2020-12-11 09:08:45 +00:00
committed by Junio C Hamano
parent 5c72261c66
commit ac14de13b2

View File

@ -119,4 +119,71 @@ test_expect_success 'diff-tree FROM duplicate tree, with renames' '
test_cmp expect actual
'
test_expect_success 'create a few commits' '
git commit-tree -m "Duplicate Entries" two^{tree} >commit_id &&
git branch base $(cat commit_id) &&
git commit-tree -p $(cat commit_id) -m "Just one" three^{tree} >up &&
git branch update $(cat up) &&
git commit-tree -p $(cat up) -m "Back to weird" two^{tree} >final &&
git branch final $(cat final) &&
rm commit_id up final
'
test_expect_failure 'git read-tree does not segfault' '
test_when_finished rm .git/index.lock &&
test_might_fail git read-tree --reset base
'
test_expect_failure 'reset --hard does not segfault' '
test_when_finished rm .git/index.lock &&
git checkout base &&
test_might_fail git reset --hard
'
test_expect_failure 'git diff HEAD does not segfault' '
git checkout base &&
GIT_TEST_CHECK_CACHE_TREE=false &&
git reset --hard &&
test_might_fail git diff HEAD
'
test_expect_failure 'can switch to another branch when status is empty' '
git clean -ffdqx &&
git status --porcelain -uno >actual &&
test_must_be_empty actual &&
git checkout update
'
test_expect_success 'forcibly switch to another branch, verify status empty' '
git checkout -f update &&
git status --porcelain -uno >actual &&
test_must_be_empty actual
'
test_expect_success 'fast-forward from non-duplicate entries to duplicate' '
git merge final
'
test_expect_failure 'clean status, switch branches, status still clean' '
git status --porcelain -uno >actual &&
test_must_be_empty actual &&
git checkout base &&
git status --porcelain -uno >actual &&
test_must_be_empty actual
'
test_expect_success 'switch to base branch and force status to be clean' '
git checkout base &&
GIT_TEST_CHECK_CACHE_TREE=false git reset --hard &&
git status --porcelain -uno >actual &&
test_must_be_empty actual
'
test_expect_failure 'fast-forward from duplicate entries to non-duplicate' '
git merge update
'
test_done