]> git.ipfire.org Git - thirdparty/git.git/commitdiff
t4058: explore duplicate tree entry handling in a bit more detail
authorElijah Newren <newren@gmail.com>
Fri, 11 Dec 2020 09:08:45 +0000 (09:08 +0000)
committerJunio C Hamano <gitster@pobox.com>
Mon, 14 Dec 2020 17:34:50 +0000 (09:34 -0800)
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>
t/t4058-diff-duplicates.sh

index bd6850895618bb3bffc76aac0264c4ce4f396759..ad3f37d388dd112b9c7938b1de01ab584fc2813f 100755 (executable)
@@ -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