git/t/t7413-submodule-is-active.sh
Ævar Arnfjörð Bjarmason fe4c750fb1 submodule--helper: fix a configure_added_submodule() leak
Fix config API a memory leak added in a452128a36 (submodule--helper:
introduce add-config subcommand, 2021-08-06) by using the *_tmp()
variant of git_config_get_string().

In this case we're only checking whether
the (repo|git)_config_get_string() call is telling us that the
"submodule.active" key exists.

As with the preceding commit we'll find many other such patterns in
the codebase if we go fishing. E.g. "git gc" leaks in the code added
in 61f7a383d3 (maintenance: use 'incremental' strategy by default,
2020-10-15). Similar code in "git gc" added in
b08ff1fee0 (maintenance: add --schedule option and config,
2020-09-11) doesn't leak, but we could avoid the malloc() & free() in
that case.

A coccinelle rule to find those would find and fix some leaks, and
cases where we're doing needless malloc() + free()'s but only care
about the key existence, or are copying
the (repo|git)_config_get_string() return value right away.

But as with the preceding commit let's punt on all of that for now,
and just narrowly fix this specific case in submodule--helper.

Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Reviewed-by: Glen Choo <chooglen@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2022-09-02 09:18:13 -07:00

111 lines
4 KiB
Bash
Executable file

#!/bin/sh
test_description='Test with test-tool submodule is-active
This test verifies that `test-tool submodule is-active` correctly identifies
submodules which are "active" and interesting to the user.
This is a unit test of the submodule.c is_submodule_active() function,
which is also indirectly tested elsewhere.
'
TEST_PASSES_SANITIZE_LEAK=true
. ./test-lib.sh
test_expect_success 'setup' '
git init sub &&
test_commit -C sub initial &&
git init super &&
test_commit -C super initial &&
git -C super submodule add ../sub sub1 &&
git -C super submodule add ../sub sub2 &&
# Remove submodule.<name>.active entries in order to test in an
# environment where only URLs are present in the conifg
git -C super config --unset submodule.sub1.active &&
git -C super config --unset submodule.sub2.active &&
git -C super commit -a -m "add 2 submodules at sub{1,2}"
'
test_expect_success 'is-active works with urls' '
test-tool -C super submodule is-active sub1 &&
test-tool -C super submodule is-active sub2 &&
git -C super config --unset submodule.sub1.URL &&
test_must_fail test-tool -C super submodule is-active sub1 &&
git -C super config submodule.sub1.URL ../sub &&
test-tool -C super submodule is-active sub1
'
test_expect_success 'is-active works with submodule.<name>.active config' '
test_when_finished "git -C super config --unset submodule.sub1.active" &&
test_when_finished "git -C super config submodule.sub1.URL ../sub" &&
git -C super config --bool submodule.sub1.active "false" &&
test_must_fail test-tool -C super submodule is-active sub1 &&
git -C super config --bool submodule.sub1.active "true" &&
git -C super config --unset submodule.sub1.URL &&
test-tool -C super submodule is-active sub1
'
test_expect_success 'is-active works with basic submodule.active config' '
test_when_finished "git -C super config submodule.sub1.URL ../sub" &&
test_when_finished "git -C super config --unset-all submodule.active" &&
git -C super config --add submodule.active "." &&
git -C super config --unset submodule.sub1.URL &&
test-tool -C super submodule is-active sub1 &&
test-tool -C super submodule is-active sub2
'
test_expect_success 'is-active correctly works with paths that are not submodules' '
test_when_finished "git -C super config --unset-all submodule.active" &&
test_must_fail test-tool -C super submodule is-active not-a-submodule &&
git -C super config --add submodule.active "." &&
test_must_fail test-tool -C super submodule is-active not-a-submodule
'
test_expect_success 'is-active works with exclusions in submodule.active config' '
test_when_finished "git -C super config --unset-all submodule.active" &&
git -C super config --add submodule.active "." &&
git -C super config --add submodule.active ":(exclude)sub1" &&
test_must_fail test-tool -C super submodule is-active sub1 &&
test-tool -C super submodule is-active sub2
'
test_expect_success 'is-active with submodule.active and submodule.<name>.active' '
test_when_finished "git -C super config --unset-all submodule.active" &&
test_when_finished "git -C super config --unset submodule.sub1.active" &&
test_when_finished "git -C super config --unset submodule.sub2.active" &&
git -C super config --add submodule.active "sub1" &&
git -C super config --bool submodule.sub1.active "false" &&
git -C super config --bool submodule.sub2.active "true" &&
test_must_fail test-tool -C super submodule is-active sub1 &&
test-tool -C super submodule is-active sub2
'
test_expect_success 'is-active, submodule.active and submodule add' '
test_when_finished "rm -rf super2" &&
git init super2 &&
test_commit -C super2 initial &&
git -C super2 config --add submodule.active "sub*" &&
# submodule add should only add submodule.<name>.active
# to the config if not matched by the pathspec
git -C super2 submodule add ../sub sub1 &&
test_must_fail git -C super2 config --get submodule.sub1.active &&
git -C super2 submodule add ../sub mod &&
git -C super2 config --get submodule.mod.active
'
test_done