3 test_description='basic commit reachability tests'
7 # Construct a grid-like commit graph with points (x,y)
8 # with 1 <= x <= 10, 1 <= y <= 10, where (x,y) has
9 # parents (x-1, y) and (x, y-1), keeping in mind that
10 # we drop a parent if a coordinate is nonpositive.
26 # We use branch 'commit-x-y' to refer to (x,y).
27 # This grid allows interesting reachability and
28 # non-reachability queries: (x,y) can reach (x',y')
29 # if and only if x' <= x and y' <= y.
30 test_expect_success 'setup' '
31 for i in $(test_seq 1 10)
34 git branch -f commit-1-$i &&
35 git tag -a -m "1-$i" tag-1-$i commit-1-$i
37 for j in $(test_seq 1 9)
39 git reset --hard commit-$j-1 &&
42 git branch -f commit-$x-1 &&
43 git tag -a -m "$x-1" tag-$x-1 commit-$x-1 &&
45 for i in $(test_seq 2 10)
47 git merge commit-$j-$i -m "$x-$i" &&
48 git branch -f commit-$x-$i &&
49 git tag -a -m "$x-$i" tag-$x-$i commit-$x-$i
52 git commit-graph write --reachable &&
53 mv .git/objects/info/commit-graph commit-graph-full &&
54 chmod u+w commit-graph-full &&
55 git show-ref -s commit-5-5 | git commit-graph write --stdin-commits &&
56 mv .git/objects/info/commit-graph commit-graph-half &&
57 chmod u+w commit-graph-half &&
58 git config core.commitGraph true
62 test_when_finished rm -rf .git/objects/info/commit-graph &&
63 "$@" <input >actual &&
64 test_cmp expect actual &&
65 cp commit-graph-full .git/objects/info/commit-graph &&
66 "$@" <input >actual &&
67 test_cmp expect actual &&
68 cp commit-graph-half .git/objects/info/commit-graph &&
69 "$@" <input >actual &&
70 test_cmp expect actual
74 run_three_modes test-tool reach "$@"
77 test_expect_success 'ref_newer:miss' '
82 echo "ref_newer(A,B):0" >expect &&
83 test_three_modes ref_newer
86 test_expect_success 'ref_newer:hit' '
91 echo "ref_newer(A,B):1" >expect &&
92 test_three_modes ref_newer
95 test_expect_success 'in_merge_bases:hit' '
100 echo "in_merge_bases(A,B):1" >expect &&
101 test_three_modes in_merge_bases
104 test_expect_success 'in_merge_bases:miss' '
105 cat >input <<-\EOF &&
109 echo "in_merge_bases(A,B):0" >expect &&
110 test_three_modes in_merge_bases
113 test_expect_success 'is_descendant_of:hit' '
114 cat >input <<-\EOF &&
120 echo "is_descendant_of(A,X):1" >expect &&
121 test_three_modes is_descendant_of
124 test_expect_success 'is_descendant_of:miss' '
125 cat >input <<-\EOF &&
131 echo "is_descendant_of(A,X):0" >expect &&
132 test_three_modes is_descendant_of
135 test_expect_success 'get_merge_bases_many' '
136 cat >input <<-\EOF &&
143 echo "get_merge_bases_many(A,X):" &&
144 git rev-parse commit-5-6 \
147 test_three_modes get_merge_bases_many
150 test_expect_success 'reduce_heads' '
151 cat >input <<-\EOF &&
162 echo "reduce_heads(X):" &&
163 git rev-parse commit-5-1 \
169 test_three_modes reduce_heads
172 test_expect_success 'can_all_from_reach:hit' '
173 cat >input <<-\EOF &&
191 echo "can_all_from_reach(X,Y):1" >expect &&
192 test_three_modes can_all_from_reach
195 test_expect_success 'can_all_from_reach:miss' '
196 cat >input <<-\EOF &&
213 echo "can_all_from_reach(X,Y):0" >expect &&
214 test_three_modes can_all_from_reach
217 test_expect_success 'can_all_from_reach_with_flag: tags case' '
218 cat >input <<-\EOF &&
236 echo "can_all_from_reach_with_flag(X,_,_,0,0):1" >expect &&
237 test_three_modes can_all_from_reach_with_flag
240 test_expect_success 'commit_contains:hit' '
241 cat >input <<-\EOF &&
252 echo "commit_contains(_,A,X,_):1" >expect &&
253 test_three_modes commit_contains &&
254 test_three_modes commit_contains --tag
257 test_expect_success 'commit_contains:miss' '
258 cat >input <<-\EOF &&
269 echo "commit_contains(_,A,X,_):0" >expect &&
270 test_three_modes commit_contains &&
271 test_three_modes commit_contains --tag
274 test_expect_success 'rev-list: basic topo-order' '
276 commit-6-6 commit-5-6 commit-4-6 commit-3-6 commit-2-6 commit-1-6 \
277 commit-6-5 commit-5-5 commit-4-5 commit-3-5 commit-2-5 commit-1-5 \
278 commit-6-4 commit-5-4 commit-4-4 commit-3-4 commit-2-4 commit-1-4 \
279 commit-6-3 commit-5-3 commit-4-3 commit-3-3 commit-2-3 commit-1-3 \
280 commit-6-2 commit-5-2 commit-4-2 commit-3-2 commit-2-2 commit-1-2 \
281 commit-6-1 commit-5-1 commit-4-1 commit-3-1 commit-2-1 commit-1-1 \
283 run_three_modes git rev-list --topo-order commit-6-6
286 test_expect_success 'rev-list: first-parent topo-order' '
293 commit-6-1 commit-5-1 commit-4-1 commit-3-1 commit-2-1 commit-1-1 \
295 run_three_modes git rev-list --first-parent --topo-order commit-6-6
298 test_expect_success 'rev-list: range topo-order' '
300 commit-6-6 commit-5-6 commit-4-6 commit-3-6 commit-2-6 commit-1-6 \
301 commit-6-5 commit-5-5 commit-4-5 commit-3-5 commit-2-5 commit-1-5 \
302 commit-6-4 commit-5-4 commit-4-4 commit-3-4 commit-2-4 commit-1-4 \
303 commit-6-3 commit-5-3 commit-4-3 \
304 commit-6-2 commit-5-2 commit-4-2 \
305 commit-6-1 commit-5-1 commit-4-1 \
307 run_three_modes git rev-list --topo-order commit-3-3..commit-6-6
310 test_expect_success 'rev-list: range topo-order' '
312 commit-6-6 commit-5-6 commit-4-6 \
313 commit-6-5 commit-5-5 commit-4-5 \
314 commit-6-4 commit-5-4 commit-4-4 \
315 commit-6-3 commit-5-3 commit-4-3 \
316 commit-6-2 commit-5-2 commit-4-2 \
317 commit-6-1 commit-5-1 commit-4-1 \
319 run_three_modes git rev-list --topo-order commit-3-8..commit-6-6
322 test_expect_success 'rev-list: first-parent range topo-order' '
329 commit-6-1 commit-5-1 commit-4-1 \
331 run_three_modes git rev-list --first-parent --topo-order commit-3-8..commit-6-6
334 test_expect_success 'rev-list: ancestry-path topo-order' '
336 commit-6-6 commit-5-6 commit-4-6 commit-3-6 \
337 commit-6-5 commit-5-5 commit-4-5 commit-3-5 \
338 commit-6-4 commit-5-4 commit-4-4 commit-3-4 \
339 commit-6-3 commit-5-3 commit-4-3 \
341 run_three_modes git rev-list --topo-order --ancestry-path commit-3-3..commit-6-6
344 test_expect_success 'rev-list: symmetric difference topo-order' '
346 commit-6-6 commit-5-6 commit-4-6 \
347 commit-6-5 commit-5-5 commit-4-5 \
348 commit-6-4 commit-5-4 commit-4-4 \
349 commit-6-3 commit-5-3 commit-4-3 \
350 commit-6-2 commit-5-2 commit-4-2 \
351 commit-6-1 commit-5-1 commit-4-1 \
352 commit-3-8 commit-2-8 commit-1-8 \
353 commit-3-7 commit-2-7 commit-1-7 \
355 run_three_modes git rev-list --topo-order commit-3-8...commit-6-6
358 test_expect_success 'get_reachable_subset:all' '
359 cat >input <<-\EOF &&
370 echo "get_reachable_subset(X,Y)" &&
371 git rev-parse commit-3-3 \
375 test_three_modes get_reachable_subset
378 test_expect_success 'get_reachable_subset:some' '
379 cat >input <<-\EOF &&
389 echo "get_reachable_subset(X,Y)" &&
390 git rev-parse commit-3-3 \
393 test_three_modes get_reachable_subset
396 test_expect_success 'get_reachable_subset:none' '
397 cat >input <<-\EOF &&
406 echo "get_reachable_subset(X,Y)" >expect &&
407 test_three_modes get_reachable_subset