9081a421a6
The "checkout" command is one of the main sources of leaks in the test
suite, let's fix the common ones by not leaking from the "struct
branch_info".
Doing this is rather straightforward, albeit verbose, we need to
xstrdup() constant strings going into the struct, and free() the ones
we clobber as we go along.
This also means that we can delete previous partial leak fixes in this
area, i.e. the "path_to_free" accounting added by 96ec7b1e70
(Convert
resolve_ref+xstrdup to new resolve_refdup function, 2011-12-13).
There was some discussion about whether "we should retain the "const
char *" here and cast at free() time, or have it be a "char *". Since
this is not a public API with any sort of API boundary let's use
"char *", as is already being done for the "refname" member of the
same struct.
The tests to mark as passing were found with:
rm .prove; GIT_SKIP_TESTS=t0027 prove -j8 --state=save t[0-9]*.sh :: --immediate
# apply & compile this change
prove -j8 --state=failed :: --immediate
I.e. the ones that were newly passing when the --state=failed command
was run. I left out "t3040-subprojects-basic.sh" and
"t4131-apply-fake-ancestor.sh" to to optimization-level related
differences similar to the ones noted in[1], except that these would
be something the current 'linux-leaks' job would run into.
1. https://lore.kernel.org/git/cover-v3-0.6-00000000000-20211022T175227Z-avarab@gmail.com/
Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
100 lines
2.3 KiB
Bash
Executable File
100 lines
2.3 KiB
Bash
Executable File
#!/bin/sh
|
|
|
|
test_description='test submodule ref store api'
|
|
|
|
GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
|
|
export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
|
|
|
|
TEST_PASSES_SANITIZE_LEAK=true
|
|
. ./test-lib.sh
|
|
|
|
RUN="test-tool ref-store submodule:sub"
|
|
|
|
test_expect_success 'setup' '
|
|
git init sub &&
|
|
(
|
|
cd sub &&
|
|
test_commit first &&
|
|
git checkout -b new-main &&
|
|
git tag -a -m new-tag new-tag HEAD
|
|
)
|
|
'
|
|
|
|
test_expect_success 'pack_refs() not allowed' '
|
|
test_must_fail $RUN pack-refs 3
|
|
'
|
|
|
|
test_expect_success 'create_symref() not allowed' '
|
|
test_must_fail $RUN create-symref FOO refs/heads/main nothing
|
|
'
|
|
|
|
test_expect_success 'delete_refs() not allowed' '
|
|
test_must_fail $RUN delete-refs 0 nothing FOO refs/tags/new-tag
|
|
'
|
|
|
|
test_expect_success 'rename_refs() not allowed' '
|
|
test_must_fail $RUN rename-ref refs/heads/main refs/heads/new-main
|
|
'
|
|
|
|
test_expect_success 'for_each_ref(refs/heads/)' '
|
|
$RUN for-each-ref refs/heads/ | cut -d" " -f 2- >actual &&
|
|
cat >expected <<-\EOF &&
|
|
main 0x0
|
|
new-main 0x0
|
|
EOF
|
|
test_cmp expected actual
|
|
'
|
|
|
|
test_expect_success 'for_each_ref() is sorted' '
|
|
$RUN for-each-ref refs/heads/ | cut -d" " -f 2- >actual &&
|
|
sort actual > expected &&
|
|
test_cmp expected actual
|
|
'
|
|
|
|
test_expect_success 'resolve_ref(main)' '
|
|
SHA1=`git -C sub rev-parse main` &&
|
|
echo "$SHA1 refs/heads/main 0x0" >expected &&
|
|
$RUN resolve-ref refs/heads/main 0 >actual &&
|
|
test_cmp expected actual
|
|
'
|
|
|
|
test_expect_success 'verify_ref(new-main)' '
|
|
$RUN verify-ref refs/heads/new-main
|
|
'
|
|
|
|
test_expect_success 'for_each_reflog()' '
|
|
$RUN for-each-reflog | sort | cut -d" " -f 2- >actual &&
|
|
cat >expected <<-\EOF &&
|
|
HEAD 0x1
|
|
refs/heads/main 0x0
|
|
refs/heads/new-main 0x0
|
|
EOF
|
|
test_cmp expected actual
|
|
'
|
|
|
|
test_expect_success 'for_each_reflog_ent()' '
|
|
$RUN for-each-reflog-ent HEAD >actual &&
|
|
head -n1 actual | grep first &&
|
|
tail -n2 actual | head -n1 | grep main.to.new
|
|
'
|
|
|
|
test_expect_success 'for_each_reflog_ent_reverse()' '
|
|
$RUN for-each-reflog-ent-reverse HEAD >actual &&
|
|
head -n1 actual | grep main.to.new &&
|
|
tail -n2 actual | head -n1 | grep first
|
|
'
|
|
|
|
test_expect_success 'reflog_exists(HEAD)' '
|
|
$RUN reflog-exists HEAD
|
|
'
|
|
|
|
test_expect_success 'delete_reflog() not allowed' '
|
|
test_must_fail $RUN delete-reflog HEAD
|
|
'
|
|
|
|
test_expect_success 'create-reflog() not allowed' '
|
|
test_must_fail $RUN create-reflog HEAD 1
|
|
'
|
|
|
|
test_done
|