git/t/t6004-rev-list-path-optim.sh
Patrick Steinhardt fa016423c7 revision: fix leaking parents when simplifying commits
When simplifying commits, e.g. because they are treesame with their
parents, we unset the commit's parent pointers but never free them. Plug
the resulting memory leaks.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2024-09-27 08:25:37 -07:00

101 lines
2.3 KiB
Bash
Executable File

#!/bin/sh
test_description='git rev-list trivial path optimization test
d/z1
b0 b1
o------------------------*----o main
/ /
o---------o----o----o----o side
a0 c0 c1 a1 c2
d/f0 d/f1
d/z0
'
GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
TEST_PASSES_SANITIZE_LEAK=true
. ./test-lib.sh
test_expect_success setup '
echo Hello >a &&
mkdir d &&
echo World >d/f &&
echo World >d/z &&
git add a d &&
test_tick &&
git commit -m "Initial commit" &&
git rev-parse --verify HEAD &&
git tag initial
'
test_expect_success path-optimization '
test_tick &&
commit=$(echo "Unchanged tree" | git commit-tree "HEAD^{tree}" -p HEAD) &&
test $(git rev-list $commit | wc -l) = 2 &&
test $(git rev-list $commit -- . | wc -l) = 1
'
test_expect_success 'further setup' '
git checkout -b side &&
echo Irrelevant >c &&
echo Irrelevant >d/f &&
git add c d/f &&
test_tick &&
git commit -m "Side makes an irrelevant commit" &&
git tag side_c0 &&
echo "More Irrelevancy" >c &&
git add c &&
test_tick &&
git commit -m "Side makes another irrelevant commit" &&
echo Bye >a &&
git add a &&
test_tick &&
git commit -m "Side touches a" &&
git tag side_a1 &&
echo "Yet more Irrelevancy" >c &&
git add c &&
test_tick &&
git commit -m "Side makes yet another irrelevant commit" &&
git checkout main &&
echo Another >b &&
echo Munged >d/z &&
git add b d/z &&
test_tick &&
git commit -m "Main touches b" &&
git tag main_b0 &&
git merge side &&
echo Touched >b &&
git add b &&
test_tick &&
git commit -m "Main touches b again"
'
test_expect_success 'path optimization 2' '
git rev-parse side_a1 initial >expected &&
git rev-list HEAD -- a >actual &&
test_cmp expected actual
'
test_expect_success 'pathspec with leading path' '
git rev-parse main^ main_b0 side_c0 initial >expected &&
git rev-list HEAD -- d >actual &&
test_cmp expected actual
'
test_expect_success 'pathspec with glob (1)' '
git rev-parse main^ main_b0 side_c0 initial >expected &&
git rev-list HEAD -- "d/*" >actual &&
test_cmp expected actual
'
test_expect_success 'pathspec with glob (2)' '
git rev-parse side_c0 initial >expected &&
git rev-list HEAD -- "d/[a-m]*" >actual &&
test_cmp expected actual
'
test_done