git/t/t1403-show-ref.sh

200 lines
4.8 KiB
Bash
Raw Normal View History

#!/bin/sh
test_description='show-ref'
GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
tests: mark tests relying on the current default for `init.defaultBranch` In addition to the manual adjustment to let the `linux-gcc` CI job run the test suite with `master` and then with `main`, this patch makes sure that GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME is set in all test scripts that currently rely on the initial branch name being `master by default. To determine which test scripts to mark up, the first step was to force-set the default branch name to `master` in - all test scripts that contain the keyword `master`, - t4211, which expects `t/t4211/history.export` with a hard-coded ref to initialize the default branch, - t5560 because it sources `t/t556x_common` which uses `master`, - t8002 and t8012 because both source `t/annotate-tests.sh` which also uses `master`) This trick was performed by this command: $ sed -i '/^ *\. \.\/\(test-lib\|lib-\(bash\|cvs\|git-svn\)\|gitweb-lib\)\.sh$/i\ GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=master\ export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\ ' $(git grep -l master t/t[0-9]*.sh) \ t/t4211*.sh t/t5560*.sh t/t8002*.sh t/t8012*.sh After that, careful, manual inspection revealed that some of the test scripts containing the needle `master` do not actually rely on a specific default branch name: either they mention `master` only in a comment, or they initialize that branch specificially, or they do not actually refer to the current default branch. Therefore, the aforementioned modification was undone in those test scripts thusly: $ git checkout HEAD -- \ t/t0027-auto-crlf.sh t/t0060-path-utils.sh \ t/t1011-read-tree-sparse-checkout.sh \ t/t1305-config-include.sh t/t1309-early-config.sh \ t/t1402-check-ref-format.sh t/t1450-fsck.sh \ t/t2024-checkout-dwim.sh \ t/t2106-update-index-assume-unchanged.sh \ t/t3040-subprojects-basic.sh t/t3301-notes.sh \ t/t3308-notes-merge.sh t/t3423-rebase-reword.sh \ t/t3436-rebase-more-options.sh \ t/t4015-diff-whitespace.sh t/t4257-am-interactive.sh \ t/t5323-pack-redundant.sh t/t5401-update-hooks.sh \ t/t5511-refspec.sh t/t5526-fetch-submodules.sh \ t/t5529-push-errors.sh t/t5530-upload-pack-error.sh \ t/t5548-push-porcelain.sh \ t/t5552-skipping-fetch-negotiator.sh \ t/t5572-pull-submodule.sh t/t5608-clone-2gb.sh \ t/t5614-clone-submodules-shallow.sh \ t/t7508-status.sh t/t7606-merge-custom.sh \ t/t9302-fast-import-unpack-limit.sh We excluded one set of test scripts in these commands, though: the range of `git p4` tests. The reason? `git p4` stores the (foreign) remote branch in the branch called `p4/master`, which is obviously not the default branch. Manual analysis revealed that only five of these tests actually require a specific default branch name to pass; They were modified thusly: $ sed -i '/^ *\. \.\/lib-git-p4\.sh$/i\ GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=master\ export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\ ' t/t980[0167]*.sh t/t9811*.sh Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de> Signed-off-by: Junio C Hamano <gitster@pobox.com>
2020-11-18 23:44:19 +00:00
export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
checkout: fix "branch info" memory leaks 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 96ec7b1e708 (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>
2021-11-16 18:27:38 +00:00
TEST_PASSES_SANITIZE_LEAK=true
. ./test-lib.sh
test_expect_success setup '
test_commit --annotate A &&
git checkout -b side &&
test_commit --annotate B &&
git checkout main &&
test_commit C &&
git branch B A^0
'
test_expect_success 'show-ref' '
echo $(git rev-parse refs/tags/A) refs/tags/A >expect &&
git show-ref A >actual &&
test_cmp expect actual &&
git show-ref tags/A >actual &&
test_cmp expect actual &&
git show-ref refs/tags/A >actual &&
test_cmp expect actual &&
test_must_fail git show-ref D >actual &&
test_must_be_empty actual
'
test_expect_success 'show-ref -q' '
git show-ref -q A >actual &&
test_must_be_empty actual &&
git show-ref -q tags/A >actual &&
test_must_be_empty actual &&
git show-ref -q refs/tags/A >actual &&
test_must_be_empty actual &&
test_must_fail git show-ref -q D >actual &&
test_must_be_empty actual
'
test_expect_success 'show-ref --verify' '
echo $(git rev-parse refs/tags/A) refs/tags/A >expect &&
git show-ref --verify refs/tags/A >actual &&
test_cmp expect actual &&
test_must_fail git show-ref --verify A >actual &&
test_must_be_empty actual &&
test_must_fail git show-ref --verify tags/A >actual &&
test_must_be_empty actual &&
test_must_fail git show-ref --verify D >actual &&
test_must_be_empty actual
'
test_expect_success 'show-ref --verify -q' '
git show-ref --verify -q refs/tags/A >actual &&
test_must_be_empty actual &&
test_must_fail git show-ref --verify -q A >actual &&
test_must_be_empty actual &&
test_must_fail git show-ref --verify -q tags/A >actual &&
test_must_be_empty actual &&
test_must_fail git show-ref --verify -q D >actual &&
test_must_be_empty actual
'
test_expect_success 'show-ref -d' '
{
echo $(git rev-parse refs/tags/A) refs/tags/A &&
echo $(git rev-parse refs/tags/A^0) "refs/tags/A^{}" &&
echo $(git rev-parse refs/tags/C) refs/tags/C
} >expect &&
git show-ref -d A C >actual &&
test_cmp expect actual &&
git show-ref -d tags/A tags/C >actual &&
test_cmp expect actual &&
git show-ref -d refs/tags/A refs/tags/C >actual &&
test_cmp expect actual &&
git show-ref --verify -d refs/tags/A refs/tags/C >actual &&
test_cmp expect actual &&
echo $(git rev-parse refs/heads/main) refs/heads/main >expect &&
git show-ref -d main >actual &&
test_cmp expect actual &&
git show-ref -d heads/main >actual &&
test_cmp expect actual &&
git show-ref -d refs/heads/main >actual &&
test_cmp expect actual &&
git show-ref -d --verify refs/heads/main >actual &&
test_cmp expect actual &&
test_must_fail git show-ref -d --verify main >actual &&
test_must_be_empty actual &&
test_must_fail git show-ref -d --verify heads/main >actual &&
test_must_be_empty actual &&
test_must_fail git show-ref --verify -d A C >actual &&
test_must_be_empty actual &&
test_must_fail git show-ref --verify -d tags/A tags/C >actual &&
test_must_be_empty actual
'
test_expect_success 'show-ref --heads, --tags, --head, pattern' '
for branch in B main side
do
echo $(git rev-parse refs/heads/$branch) refs/heads/$branch || return 1
done >expect.heads &&
git show-ref --heads >actual &&
test_cmp expect.heads actual &&
for tag in A B C
do
echo $(git rev-parse refs/tags/$tag) refs/tags/$tag || return 1
done >expect.tags &&
git show-ref --tags >actual &&
test_cmp expect.tags actual &&
cat expect.heads expect.tags >expect &&
git show-ref --heads --tags >actual &&
test_cmp expect actual &&
{
echo $(git rev-parse HEAD) HEAD &&
cat expect.heads expect.tags
} >expect &&
git show-ref --heads --tags --head >actual &&
test_cmp expect actual &&
{
echo $(git rev-parse HEAD) HEAD &&
echo $(git rev-parse refs/heads/B) refs/heads/B &&
echo $(git rev-parse refs/tags/B) refs/tags/B
} >expect &&
git show-ref --head B >actual &&
test_cmp expect actual &&
{
echo $(git rev-parse HEAD) HEAD &&
echo $(git rev-parse refs/heads/B) refs/heads/B &&
echo $(git rev-parse refs/tags/B) refs/tags/B &&
echo $(git rev-parse refs/tags/B^0) "refs/tags/B^{}"
} >expect &&
git show-ref --head -d B >actual &&
test_cmp expect actual
'
test_expect_success 'show-ref --verify HEAD' '
echo $(git rev-parse HEAD) HEAD >expect &&
git show-ref --verify HEAD >actual &&
test_cmp expect actual &&
git show-ref --verify -q HEAD >actual &&
test_must_be_empty actual
'
test_expect_success 'show-ref --verify with dangling ref' '
sha1_file() {
echo "$*" | sed "s#..#.git/objects/&/#"
} &&
remove_object() {
file=$(sha1_file "$*") &&
test -e "$file" &&
rm -f "$file"
} &&
test_when_finished "rm -rf dangling" &&
(
git init dangling &&
cd dangling &&
test_commit dangling &&
sha=$(git rev-parse refs/tags/dangling) &&
remove_object $sha &&
test_must_fail git show-ref --verify refs/tags/dangling
)
'
test_done