mirror of
https://github.com/git/git
synced 2024-08-24 18:26:02 +00:00
![Ævar Arnfjörð Bjarmason](/assets/img/avatar_default.png)
Fix an edge case that was missed when the dir_clear() call was added ineceba53214
(dir: fix problematic API to avoid memory leaks, 2020-08-18), we need to also clean up when we're about to exit with non-zero. That commit says, on the topic of the dir_clear() API and UNLEAK(): [...]two of them clearly thought about leaks since they had an UNLEAK(dir) directive, which to me suggests that the method to free the data was too unclear. I think that0e5bba53af
(add UNLEAK annotation for reducing leak false positives, 2017-09-08) which added the UNLEAK() makes it clear that that wasn't the case, rather it was the desire to avoid the complexity of freeing the memory at the end of the program. This does add a bit of complexity, but I think it's worth it to just fix these leaks when it's easy in built-ins. It allows them to serve as canaries for underlying APIs that shouldn't be leaking, it encourages us to make those freeing APIs nicer for all their users, and it prevents other leaking regressions by being able to mark the entire test as TEST_PASSES_SANITIZE_LEAK=true. Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
70 lines
1.5 KiB
Bash
Executable file
70 lines
1.5 KiB
Bash
Executable file
#!/bin/sh
|
|
|
|
test_description='ls-files tests with relative paths
|
|
|
|
This test runs git ls-files with various relative path arguments.
|
|
'
|
|
|
|
TEST_PASSES_SANITIZE_LEAK=true
|
|
. ./test-lib.sh
|
|
|
|
test_expect_success 'prepare' '
|
|
: >never-mind-me &&
|
|
git add never-mind-me &&
|
|
mkdir top &&
|
|
(
|
|
cd top &&
|
|
mkdir sub &&
|
|
x="x xa xbc xdef xghij xklmno" &&
|
|
y=$(echo "$x" | tr x y) &&
|
|
touch $x &&
|
|
touch $y &&
|
|
cd sub &&
|
|
git add ../x*
|
|
)
|
|
'
|
|
|
|
test_expect_success 'ls-files with mixed levels' '
|
|
(
|
|
cd top/sub &&
|
|
cat >expect <<-EOF &&
|
|
../../never-mind-me
|
|
../x
|
|
EOF
|
|
git ls-files $(cat expect) >actual &&
|
|
test_cmp expect actual
|
|
)
|
|
'
|
|
|
|
test_expect_success 'ls-files -c' '
|
|
(
|
|
cd top/sub &&
|
|
for f in ../y*
|
|
do
|
|
echo "error: pathspec $SQ$f$SQ did not match any file(s) known to git"
|
|
done >expect.err &&
|
|
echo "Did you forget to ${SQ}git add${SQ}?" >>expect.err &&
|
|
ls ../x* >expect.out &&
|
|
test_must_fail git ls-files -c --error-unmatch ../[xy]* >actual.out 2>actual.err &&
|
|
test_cmp expect.out actual.out &&
|
|
test_cmp expect.err actual.err
|
|
)
|
|
'
|
|
|
|
test_expect_success 'ls-files -o' '
|
|
(
|
|
cd top/sub &&
|
|
for f in ../x*
|
|
do
|
|
echo "error: pathspec $SQ$f$SQ did not match any file(s) known to git"
|
|
done >expect.err &&
|
|
echo "Did you forget to ${SQ}git add${SQ}?" >>expect.err &&
|
|
ls ../y* >expect.out &&
|
|
test_must_fail git ls-files -o --error-unmatch ../[xy]* >actual.out 2>actual.err &&
|
|
test_cmp expect.out actual.out &&
|
|
test_cmp expect.err actual.err
|
|
)
|
|
'
|
|
|
|
test_done
|