1+ #! /bin/sh
2+
3+ test_description=' git log for a path with Bloom filters'
4+ . ./test-lib.sh
5+
6+ GIT_TEST_COMMIT_GRAPH=0
7+ GIT_TEST_COMMIT_GRAPH_CHANGED_PATHS=0
8+
9+ test_expect_success ' setup test - repo, commits, commit graph, log outputs' '
10+ git init &&
11+ mkdir A A/B A/B/C &&
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 &&
25+ git merge side &&
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 &&
31+ git add . &&
32+ git commit -m "file removed" &&
33+ git commit-graph write --reachable --changed-paths
34+ '
35+ graph_read_expect () {
36+ NUM_CHUNKS=5
37+ cat > expect << - EOF
38+ header: 43475048 1 1 $NUM_CHUNKS 0
39+ num_commits: $1
40+ chunks: oid_fanout oid_lookup commit_metadata bloom_indexes bloom_data
41+ EOF
42+ test-tool read-graph > actual &&
43+ test_cmp expect actual
44+ }
45+
46+ test_expect_success ' commit-graph write wrote out the bloom chunks' '
47+ graph_read_expect 15
48+ '
49+
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
54+
55+ setup () {
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
59+ }
60+
61+ test_bloom_filters_used () {
62+ log_args=$1
63+ bloom_trace_prefix=" statistics:{\" filter_not_present\" :0,\" zero_length_filter\" :0,\" maybe\" "
64+ setup " $log_args " &&
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"
68+ }
69+
70+ test_bloom_filters_not_used () {
71+ log_args=$1
72+ setup " $log_args " &&
73+ ! (grep -q " statistics:{\" filter_not_present\" :" " $TRASH_DIRECTORY /trace.perf" ) &&
74+ test_cmp log_wo_bloom log_w_bloom
75+ }
76+
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
78+ do
79+ for option in " " \
80+ " --all" \
81+ " --full-history" \
82+ " --full-history --simplify-merges" \
83+ " --simplify-merges" \
84+ " --simplify-by-decoration" \
85+ " --follow" \
86+ " --first-parent" \
87+ " --topo-order" \
88+ " --date-order" \
89+ " --author-date-order" \
90+ " --ancestry-path side..master"
91+ do
92+ test_expect_success " git log option: $option for path: $path " '
93+ test_bloom_filters_used "$option -- $path"
94+ '
95+ done
96+ done
97+
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/"
101+ '
102+
103+ test_expect_success ' git log for path that does not exist. ' '
104+ test_bloom_filters_used "-- path_does_not_exist"
105+ '
106+
107+ test_expect_success ' git log with --walk-reflogs does not use Bloom filters' '
108+ test_bloom_filters_not_used "--walk-reflogs -- A"
109+ '
110+
111+ test_expect_success ' git log -- multiple path specs does not use Bloom filters' '
112+ test_bloom_filters_not_used "-- file4 A/file1"
113+ '
114+
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"
118+ '
119+
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*"
123+ '
124+
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
131+ '
132+
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"
135+ '
136+
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
141+ '
142+
143+ test_bloom_filters_used_when_some_filters_are_missing () {
144+ log_args=$1
145+ bloom_trace_prefix=" statistics:{\" filter_not_present\" :3,\" zero_length_filter\" :0,\" maybe\" :8,\" definitely_not\" :6"
146+ setup " $log_args " &&
147+ grep -q " $bloom_trace_prefix " " $TRASH_DIRECTORY /trace.perf" &&
148+ test_cmp log_wo_bloom log_w_bloom
149+ }
150+
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"
153+ '
154+
155+ test_done
0 commit comments