mirror of
https://github.com/git/git.git
synced 2024-11-28 12:34:08 +08:00
c489f47a64
The previous commit added low-level tests to ensure that the packed-refs iterator did not enumerate excluded sections of the refspace. However, there was no guarantee that these sections weren't being visited, only that they were being suppressed from the output. To harden these tests, add a trace2 counter which tracks the number of regions skipped by the packed-refs iterator, and assert on its value. Suggested-by: Derrick Stolee <derrickstolee@github.com> Signed-off-by: Taylor Blau <me@ttaylorr.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
123 lines
3.0 KiB
Bash
Executable File
123 lines
3.0 KiB
Bash
Executable File
#!/bin/sh
|
|
|
|
test_description='test exclude_patterns functionality in main ref store'
|
|
|
|
GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
|
|
export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
|
|
|
|
TEST_PASSES_SANITIZE_LEAK=true
|
|
. ./test-lib.sh
|
|
|
|
for_each_ref__exclude () {
|
|
GIT_TRACE2_PERF=1 test-tool ref-store main \
|
|
for-each-ref--exclude "$@" >actual.raw
|
|
cut -d ' ' -f 2 actual.raw
|
|
}
|
|
|
|
for_each_ref () {
|
|
git for-each-ref --format='%(refname)' "$@"
|
|
}
|
|
|
|
assert_jumps () {
|
|
local nr="$1"
|
|
local trace="$2"
|
|
|
|
grep -q "name:jumps_made value:$nr$" $trace
|
|
}
|
|
|
|
assert_no_jumps () {
|
|
! assert_jumps ".*" "$1"
|
|
}
|
|
|
|
test_expect_success 'setup' '
|
|
test_commit --no-tag base &&
|
|
base="$(git rev-parse HEAD)" &&
|
|
|
|
for name in foo bar baz quux
|
|
do
|
|
for i in 1 2 3
|
|
do
|
|
echo "create refs/heads/$name/$i $base" || return 1
|
|
done || return 1
|
|
done >in &&
|
|
echo "delete refs/heads/main" >>in &&
|
|
|
|
git update-ref --stdin <in &&
|
|
git pack-refs --all
|
|
'
|
|
|
|
test_expect_success 'excluded region in middle' '
|
|
for_each_ref__exclude refs/heads refs/heads/foo >actual 2>perf &&
|
|
for_each_ref refs/heads/bar refs/heads/baz refs/heads/quux >expect &&
|
|
|
|
test_cmp expect actual &&
|
|
assert_jumps 1 perf
|
|
'
|
|
|
|
test_expect_success 'excluded region at beginning' '
|
|
for_each_ref__exclude refs/heads refs/heads/bar >actual 2>perf &&
|
|
for_each_ref refs/heads/baz refs/heads/foo refs/heads/quux >expect &&
|
|
|
|
test_cmp expect actual &&
|
|
assert_jumps 1 perf
|
|
'
|
|
|
|
test_expect_success 'excluded region at end' '
|
|
for_each_ref__exclude refs/heads refs/heads/quux >actual 2>perf &&
|
|
for_each_ref refs/heads/foo refs/heads/bar refs/heads/baz >expect &&
|
|
|
|
test_cmp expect actual &&
|
|
assert_jumps 1 perf
|
|
'
|
|
|
|
test_expect_success 'disjoint excluded regions' '
|
|
for_each_ref__exclude refs/heads refs/heads/bar refs/heads/quux >actual 2>perf &&
|
|
for_each_ref refs/heads/baz refs/heads/foo >expect &&
|
|
|
|
test_cmp expect actual &&
|
|
assert_jumps 2 perf
|
|
'
|
|
|
|
test_expect_success 'adjacent, non-overlapping excluded regions' '
|
|
for_each_ref__exclude refs/heads refs/heads/bar refs/heads/baz >actual 2>perf &&
|
|
for_each_ref refs/heads/foo refs/heads/quux >expect &&
|
|
|
|
test_cmp expect actual &&
|
|
assert_jumps 1 perf
|
|
'
|
|
|
|
test_expect_success 'overlapping excluded regions' '
|
|
for_each_ref__exclude refs/heads refs/heads/ba refs/heads/baz >actual 2>perf &&
|
|
for_each_ref refs/heads/foo refs/heads/quux >expect &&
|
|
|
|
test_cmp expect actual &&
|
|
assert_jumps 1 perf
|
|
'
|
|
|
|
test_expect_success 'several overlapping excluded regions' '
|
|
for_each_ref__exclude refs/heads \
|
|
refs/heads/bar refs/heads/baz refs/heads/foo >actual 2>perf &&
|
|
for_each_ref refs/heads/quux >expect &&
|
|
|
|
test_cmp expect actual &&
|
|
assert_jumps 1 perf
|
|
'
|
|
|
|
test_expect_success 'non-matching excluded section' '
|
|
for_each_ref__exclude refs/heads refs/heads/does/not/exist >actual 2>perf &&
|
|
for_each_ref >expect &&
|
|
|
|
test_cmp expect actual &&
|
|
assert_no_jumps perf
|
|
'
|
|
|
|
test_expect_success 'meta-characters are discarded' '
|
|
for_each_ref__exclude refs/heads "refs/heads/ba*" >actual 2>perf &&
|
|
for_each_ref >expect &&
|
|
|
|
test_cmp expect actual &&
|
|
assert_no_jumps perf
|
|
'
|
|
|
|
test_done
|