155 lines
4.8 KiB
Bash
155 lines
4.8 KiB
Bash
|
#!/bin/sh
|
||
|
|
||
|
test_description='git log for a path with Bloom filters'
|
||
|
. ./test-lib.sh
|
||
|
|
||
|
GIT_TEST_COMMIT_GRAPH=0
|
||
|
GIT_TEST_COMMIT_GRAPH_CHANGED_PATHS=0
|
||
|
|
||
|
test_expect_success 'setup test - repo, commits, commit graph, log outputs' '
|
||
|
git init &&
|
||
|
mkdir A A/B A/B/C &&
|
||
|
test_commit c1 A/file1 &&
|
||
|
test_commit c2 A/B/file2 &&
|
||
|
test_commit c3 A/B/C/file3 &&
|
||
|
test_commit c4 A/file1 &&
|
||
|
test_commit c5 A/B/file2 &&
|
||
|
test_commit c6 A/B/C/file3 &&
|
||
|
test_commit c7 A/file1 &&
|
||
|
test_commit c8 A/B/file2 &&
|
||
|
test_commit c9 A/B/C/file3 &&
|
||
|
test_commit c10 file_to_be_deleted &&
|
||
|
git checkout -b side HEAD~4 &&
|
||
|
test_commit side-1 file4 &&
|
||
|
git checkout master &&
|
||
|
git merge side &&
|
||
|
test_commit c11 file5 &&
|
||
|
mv file5 file5_renamed &&
|
||
|
git add file5_renamed &&
|
||
|
git commit -m "rename" &&
|
||
|
rm file_to_be_deleted &&
|
||
|
git add . &&
|
||
|
git commit -m "file removed" &&
|
||
|
git commit-graph write --reachable --changed-paths
|
||
|
'
|
||
|
graph_read_expect () {
|
||
|
NUM_CHUNKS=5
|
||
|
cat >expect <<- EOF
|
||
|
header: 43475048 1 1 $NUM_CHUNKS 0
|
||
|
num_commits: $1
|
||
|
chunks: oid_fanout oid_lookup commit_metadata bloom_indexes bloom_data
|
||
|
EOF
|
||
|
test-tool read-graph >actual &&
|
||
|
test_cmp expect actual
|
||
|
}
|
||
|
|
||
|
test_expect_success 'commit-graph write wrote out the bloom chunks' '
|
||
|
graph_read_expect 15
|
||
|
'
|
||
|
|
||
|
# Turn off any inherited trace2 settings for this test.
|
||
|
sane_unset GIT_TRACE2 GIT_TRACE2_PERF GIT_TRACE2_EVENT
|
||
|
sane_unset GIT_TRACE2_PERF_BRIEF
|
||
|
sane_unset GIT_TRACE2_CONFIG_PARAMS
|
||
|
|
||
|
setup () {
|
||
|
rm "$TRASH_DIRECTORY/trace.perf"
|
||
|
git -c core.commitGraph=false log --pretty="format:%s" $1 >log_wo_bloom &&
|
||
|
GIT_TRACE2_PERF="$TRASH_DIRECTORY/trace.perf" git -c core.commitGraph=true log --pretty="format:%s" $1 >log_w_bloom
|
||
|
}
|
||
|
|
||
|
test_bloom_filters_used () {
|
||
|
log_args=$1
|
||
|
bloom_trace_prefix="statistics:{\"filter_not_present\":0,\"zero_length_filter\":0,\"maybe\""
|
||
|
setup "$log_args" &&
|
||
|
grep -q "$bloom_trace_prefix" "$TRASH_DIRECTORY/trace.perf" &&
|
||
|
test_cmp log_wo_bloom log_w_bloom &&
|
||
|
test_path_is_file "$TRASH_DIRECTORY/trace.perf"
|
||
|
}
|
||
|
|
||
|
test_bloom_filters_not_used () {
|
||
|
log_args=$1
|
||
|
setup "$log_args" &&
|
||
|
!(grep -q "statistics:{\"filter_not_present\":" "$TRASH_DIRECTORY/trace.perf") &&
|
||
|
test_cmp log_wo_bloom log_w_bloom
|
||
|
}
|
||
|
|
||
|
for path in A A/B A/B/C A/file1 A/B/file2 A/B/C/file3 file4 file5 file5_renamed file_to_be_deleted
|
||
|
do
|
||
|
for option in "" \
|
||
|
"--all" \
|
||
|
"--full-history" \
|
||
|
"--full-history --simplify-merges" \
|
||
|
"--simplify-merges" \
|
||
|
"--simplify-by-decoration" \
|
||
|
"--follow" \
|
||
|
"--first-parent" \
|
||
|
"--topo-order" \
|
||
|
"--date-order" \
|
||
|
"--author-date-order" \
|
||
|
"--ancestry-path side..master"
|
||
|
do
|
||
|
test_expect_success "git log option: $option for path: $path" '
|
||
|
test_bloom_filters_used "$option -- $path"
|
||
|
'
|
||
|
done
|
||
|
done
|
||
|
|
||
|
test_expect_success 'git log -- folder works with and without the trailing slash' '
|
||
|
test_bloom_filters_used "-- A" &&
|
||
|
test_bloom_filters_used "-- A/"
|
||
|
'
|
||
|
|
||
|
test_expect_success 'git log for path that does not exist. ' '
|
||
|
test_bloom_filters_used "-- path_does_not_exist"
|
||
|
'
|
||
|
|
||
|
test_expect_success 'git log with --walk-reflogs does not use Bloom filters' '
|
||
|
test_bloom_filters_not_used "--walk-reflogs -- A"
|
||
|
'
|
||
|
|
||
|
test_expect_success 'git log -- multiple path specs does not use Bloom filters' '
|
||
|
test_bloom_filters_not_used "-- file4 A/file1"
|
||
|
'
|
||
|
|
||
|
test_expect_success 'git log with wildcard that resolves to a single path uses Bloom filters' '
|
||
|
test_bloom_filters_used "-- *4" &&
|
||
|
test_bloom_filters_used "-- *renamed"
|
||
|
'
|
||
|
|
||
|
test_expect_success 'git log with wildcard that resolves to a multiple paths does not uses Bloom filters' '
|
||
|
test_bloom_filters_not_used "-- *" &&
|
||
|
test_bloom_filters_not_used "-- file*"
|
||
|
'
|
||
|
|
||
|
test_expect_success 'setup - add commit-graph to the chain without Bloom filters' '
|
||
|
test_commit c14 A/anotherFile2 &&
|
||
|
test_commit c15 A/B/anotherFile2 &&
|
||
|
test_commit c16 A/B/C/anotherFile2 &&
|
||
|
GIT_TEST_COMMIT_GRAPH_CHANGED_PATHS=0 git commit-graph write --reachable --split &&
|
||
|
test_line_count = 2 .git/objects/info/commit-graphs/commit-graph-chain
|
||
|
'
|
||
|
|
||
|
test_expect_success 'Do not use Bloom filters if the latest graph does not have Bloom filters.' '
|
||
|
test_bloom_filters_not_used "-- A/B"
|
||
|
'
|
||
|
|
||
|
test_expect_success 'setup - add commit-graph to the chain with Bloom filters' '
|
||
|
test_commit c17 A/anotherFile3 &&
|
||
|
git commit-graph write --reachable --changed-paths --split &&
|
||
|
test_line_count = 3 .git/objects/info/commit-graphs/commit-graph-chain
|
||
|
'
|
||
|
|
||
|
test_bloom_filters_used_when_some_filters_are_missing () {
|
||
|
log_args=$1
|
||
|
bloom_trace_prefix="statistics:{\"filter_not_present\":3,\"zero_length_filter\":0,\"maybe\":8,\"definitely_not\":6"
|
||
|
setup "$log_args" &&
|
||
|
grep -q "$bloom_trace_prefix" "$TRASH_DIRECTORY/trace.perf" &&
|
||
|
test_cmp log_wo_bloom log_w_bloom
|
||
|
}
|
||
|
|
||
|
test_expect_success 'Use Bloom filters if they exist in the latest but not all commit graphs in the chain.' '
|
||
|
test_bloom_filters_used_when_some_filters_are_missing "-- A/B"
|
||
|
'
|
||
|
|
||
|
test_done
|