3 test_description
='git log for a path with Bloom filters'
6 GIT_TEST_COMMIT_GRAPH
=0
7 GIT_TEST_COMMIT_GRAPH_CHANGED_PATHS
=0
9 test_expect_success
'setup test - repo, commits, commit graph, log outputs' '
12 test_commit c1 A/file1 &&
13 test_commit c2 A/B/file2 &&
14 test_commit c3 A/B/C/file3 &&
15 test_commit c4 A/file1 &&
16 test_commit c5 A/B/file2 &&
17 test_commit c6 A/B/C/file3 &&
18 test_commit c7 A/file1 &&
19 test_commit c8 A/B/file2 &&
20 test_commit c9 A/B/C/file3 &&
21 test_commit c10 file_to_be_deleted &&
22 git checkout -b side HEAD~4 &&
23 test_commit side-1 file4 &&
24 git checkout master &&
26 test_commit c11 file5 &&
27 mv file5 file5_renamed &&
28 git add file5_renamed &&
29 git commit -m "rename" &&
30 rm file_to_be_deleted &&
32 git commit -m "file removed" &&
33 git commit-graph write --reachable --changed-paths
35 graph_read_expect
() {
38 header: 43475048 1 1 $NUM_CHUNKS 0
40 chunks: oid_fanout oid_lookup commit_metadata bloom_indexes bloom_data
42 test-tool read-graph
>actual
&&
43 test_cmp expect actual
46 test_expect_success
'commit-graph write wrote out the bloom chunks' '
50 # Turn off any inherited trace2 settings for this test.
51 sane_unset GIT_TRACE2 GIT_TRACE2_PERF GIT_TRACE2_EVENT
52 sane_unset GIT_TRACE2_PERF_BRIEF
53 sane_unset GIT_TRACE2_CONFIG_PARAMS
56 rm "$TRASH_DIRECTORY/trace.perf"
57 git
-c core.commitGraph
=false log
--pretty="format:%s" $1 >log_wo_bloom
&&
58 GIT_TRACE2_PERF
="$TRASH_DIRECTORY/trace.perf" git
-c core.commitGraph
=true log
--pretty="format:%s" $1 >log_w_bloom
61 test_bloom_filters_used
() {
63 bloom_trace_prefix
="statistics:{\"filter_not_present\":0,\"zero_length_filter\":0,\"maybe\""
65 grep -q "$bloom_trace_prefix" "$TRASH_DIRECTORY/trace.perf" &&
66 test_cmp log_wo_bloom log_w_bloom
&&
67 test_path_is_file
"$TRASH_DIRECTORY/trace.perf"
70 test_bloom_filters_not_used
() {
73 ! grep -q "statistics:{\"filter_not_present\":" "$TRASH_DIRECTORY/trace.perf" &&
74 test_cmp log_wo_bloom log_w_bloom
77 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
82 "--full-history --simplify-merges" \
84 "--simplify-by-decoration" \
89 "--author-date-order" \
90 "--ancestry-path side..master"
92 test_expect_success
"git log option: $option for path: $path" '
93 test_bloom_filters_used "$option -- $path"
98 test_expect_success
'git log -- folder works with and without the trailing slash' '
99 test_bloom_filters_used "-- A" &&
100 test_bloom_filters_used "-- A/"
103 test_expect_success
'git log for path that does not exist. ' '
104 test_bloom_filters_used "-- path_does_not_exist"
107 test_expect_success
'git log with --walk-reflogs does not use Bloom filters' '
108 test_bloom_filters_not_used "--walk-reflogs -- A"
111 test_expect_success
'git log -- multiple path specs does not use Bloom filters' '
112 test_bloom_filters_not_used "-- file4 A/file1"
115 test_expect_success
'git log with wildcard that resolves to a single path uses Bloom filters' '
116 test_bloom_filters_used "-- *4" &&
117 test_bloom_filters_used "-- *renamed"
120 test_expect_success
'git log with wildcard that resolves to a multiple paths does not uses Bloom filters' '
121 test_bloom_filters_not_used "-- *" &&
122 test_bloom_filters_not_used "-- file*"
125 test_expect_success
'setup - add commit-graph to the chain without Bloom filters' '
126 test_commit c14 A/anotherFile2 &&
127 test_commit c15 A/B/anotherFile2 &&
128 test_commit c16 A/B/C/anotherFile2 &&
129 GIT_TEST_COMMIT_GRAPH_CHANGED_PATHS=0 git commit-graph write --reachable --split &&
130 test_line_count = 2 .git/objects/info/commit-graphs/commit-graph-chain
133 test_expect_success
'Do not use Bloom filters if the latest graph does not have Bloom filters.' '
134 test_bloom_filters_not_used "-- A/B"
137 test_expect_success
'setup - add commit-graph to the chain with Bloom filters' '
138 test_commit c17 A/anotherFile3 &&
139 git commit-graph write --reachable --changed-paths --split &&
140 test_line_count = 3 .git/objects/info/commit-graphs/commit-graph-chain
143 test_bloom_filters_used_when_some_filters_are_missing
() {
145 bloom_trace_prefix
="statistics:{\"filter_not_present\":3,\"zero_length_filter\":0,\"maybe\":8,\"definitely_not\":6"
147 grep -q "$bloom_trace_prefix" "$TRASH_DIRECTORY/trace.perf" &&
148 test_cmp log_wo_bloom log_w_bloom
151 test_expect_success
'Use Bloom filters if they exist in the latest but not all commit graphs in the chain.' '
152 test_bloom_filters_used_when_some_filters_are_missing "-- A/B"