. ./test-lib.sh
for_each_ref__exclude () {
- test-tool ref-store main for-each-ref--exclude "$@" >actual.raw
+ GIT_TRACE2_PERF=1 test-tool ref-store main \
+ for-each-ref--exclude "$@" >actual.raw
cut -d ' ' -f 2 actual.raw
}
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)" &&
'
test_expect_success 'excluded region in middle' '
- for_each_ref__exclude refs/heads refs/heads/foo >actual &&
+ 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
+ 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 &&
+ 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
+ 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 &&
+ 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
+ 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 &&
+ 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
+ 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 &&
+ 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
+ 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 &&
+ 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
+ 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 &&
+ refs/heads/bar refs/heads/baz refs/heads/foo >actual 2>perf &&
for_each_ref refs/heads/quux >expect &&
- test_cmp expect actual
+ 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 &&
+ for_each_ref__exclude refs/heads refs/heads/does/not/exist >actual 2>perf &&
for_each_ref >expect &&
- test_cmp expect actual
+ 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 &&
+ for_each_ref__exclude refs/heads "refs/heads/ba*" >actual 2>perf &&
for_each_ref >expect &&
- test_cmp expect actual
+ test_cmp expect actual &&
+ assert_no_jumps perf
'
test_done