7fe744e83457bd245ec5b6efb9b59395a95a2dff
[git.git] / t / t6001-rev-list-merge-order.sh
1 #!/bin/sh
2 #
3 # Copyright (c) 2005 Jon Seymour
4 #
5
6 test_description='Tests git-rev-list --merge-order functionality'
7
8 . ./test-lib.sh
9 . ../t6000lib.sh # t6xxx specific functions
10
11 if git-rev-list --merge-order 2>&1 | grep 'OpenSSL not linked' >/dev/null
12 then
13     test_expect_success 'skipping merge-order test' :
14     test_done
15     exit
16 fi    
17
18 # test-case specific test function
19 check_adjacency()
20 {
21     read previous
22     echo "= $previous"
23     while read next
24     do
25         if ! (git-cat-file commit $previous | grep "^parent $next" >/dev/null)
26         then
27             echo "^ $next"
28         else
29             echo "| $next"
30         fi
31         previous=$next
32     done
33 }
34
35 list_duplicates()
36 {
37     "$@" | sort | uniq -d
38 }
39
40 grep_stderr()
41 {
42     args=$1
43     shift 1
44     "$@" 2>&1 | grep "$args"
45 }
46
47 date >path0
48 git-update-cache --add path0
49 save_tag tree git-write-tree
50 on_committer_date "1971-08-16 00:00:00" hide_error save_tag root unique_commit root tree
51 on_committer_date "1971-08-16 00:00:01" save_tag l0 unique_commit l0 tree -p root
52 on_committer_date "1971-08-16 00:00:02" save_tag l1 unique_commit l1 tree -p l0
53 on_committer_date "1971-08-16 00:00:03" save_tag l2 unique_commit l2 tree -p l1
54 on_committer_date "1971-08-16 00:00:04" save_tag a0 unique_commit a0 tree -p l2
55 on_committer_date "1971-08-16 00:00:05" save_tag a1 unique_commit a1 tree -p a0
56 on_committer_date "1971-08-16 00:00:06" save_tag b1 unique_commit b1 tree -p a0
57 on_committer_date "1971-08-16 00:00:07" save_tag c1 unique_commit c1 tree -p b1
58 on_committer_date "1971-08-16 00:00:08" as_author foobar@example.com save_tag b2 unique_commit b2 tree -p b1
59 on_committer_date "1971-08-16 00:00:09" save_tag b3 unique_commit b2 tree -p b2
60 on_committer_date "1971-08-16 00:00:10" save_tag c2 unique_commit c2 tree -p c1 -p b2
61 on_committer_date "1971-08-16 00:00:11" save_tag c3 unique_commit c3 tree -p c2
62 on_committer_date "1971-08-16 00:00:12" save_tag a2 unique_commit a2 tree -p a1
63 on_committer_date "1971-08-16 00:00:13" save_tag a3 unique_commit a3 tree -p a2
64 on_committer_date "1971-08-16 00:00:14" save_tag b4 unique_commit b4 tree -p b3 -p a3
65 on_committer_date "1971-08-16 00:00:15" save_tag a4 unique_commit a4 tree -p a3 -p b4 -p c3
66 on_committer_date "1971-08-16 00:00:16" save_tag l3 unique_commit l3 tree -p a4
67 on_committer_date "1971-08-16 00:00:17" save_tag l4 unique_commit l4 tree -p l3
68 on_committer_date "1971-08-16 00:00:18" save_tag l5 unique_commit l5 tree -p l4
69 on_committer_date "1971-08-16 00:00:19" save_tag m1 unique_commit m1 tree -p a4 -p c3
70 on_committer_date "1971-08-16 00:00:20" save_tag m2 unique_commit m2 tree -p c3 -p a4
71 on_committer_date "1971-08-16 00:00:21" hide_error save_tag alt_root unique_commit alt_root tree
72 on_committer_date "1971-08-16 00:00:22" save_tag r0 unique_commit r0 tree -p alt_root
73 on_committer_date "1971-08-16 00:00:23" save_tag r1 unique_commit r1 tree -p r0
74 on_committer_date "1971-08-16 00:00:24" save_tag l5r1 unique_commit l5r1 tree -p l5 -p r1
75 on_committer_date "1971-08-16 00:00:25" save_tag r1l5 unique_commit r1l5 tree -p r1 -p l5
76
77
78 #
79 # note: as of 20/6, it isn't possible to create duplicate parents, so this
80 # can't be tested.
81 #
82 #on_committer_date "1971-08-16 00:00:20" save_tag m3 unique_commit m3 tree -p c3 -p a4 -p c3
83 hide_error save_tag e1 as_author e@example.com unique_commit e1 tree
84 save_tag e2 as_author e@example.com unique_commit e2 tree -p e1
85 save_tag f1 as_author f@example.com unique_commit f1 tree -p e1
86 save_tag e3 as_author e@example.com unique_commit e3 tree -p e2
87 save_tag f2 as_author f@example.com unique_commit f2 tree -p f1
88 save_tag e4 as_author e@example.com unique_commit e4 tree -p e3 -p f2
89 save_tag e5 as_author e@example.com unique_commit e5 tree -p e4
90 save_tag f3 as_author f@example.com unique_commit f3 tree -p f2
91 save_tag f4 as_author f@example.com unique_commit f4 tree -p f3
92 save_tag e6 as_author e@example.com unique_commit e6 tree -p e5 -p f4
93 save_tag f5 as_author f@example.com unique_commit f5 tree -p f4
94 save_tag f6 as_author f@example.com unique_commit f6 tree -p f5 -p e6
95 save_tag e7 as_author e@example.com unique_commit e7 tree -p e6
96 save_tag e8 as_author e@example.com unique_commit e8 tree -p e7
97 save_tag e9 as_author e@example.com unique_commit e9 tree -p e8
98 save_tag f7 as_author f@example.com unique_commit f7 tree -p f6
99 save_tag f8 as_author f@example.com unique_commit f8 tree -p f7
100 save_tag f9 as_author f@example.com unique_commit f9 tree -p f8
101 save_tag e10 as_author e@example.com unique_commit e1 tree -p e9 -p f8
102
103 hide_error save_tag g0 unique_commit g0 tree
104 save_tag g1 unique_commit g1 tree -p g0
105 save_tag h1 unique_commit g2 tree -p g0
106 save_tag g2 unique_commit g3 tree -p g1 -p h1
107 save_tag h2 unique_commit g4 tree -p g2
108 save_tag g3 unique_commit g5 tree -p g2
109 save_tag g4 unique_commit g6 tree -p g3 -p h2
110
111 tag l5 > .git/HEAD
112
113 test_expect_success 'rev-list has correct number of entries' 'git-rev-list HEAD | wc -l | tr -s " "' <<EOF
114 19
115 EOF
116
117 normal_adjacency_count=$(git-rev-list HEAD | check_adjacency | grep -c "\^" | tr -d ' ')
118 merge_order_adjacency_count=$(git-rev-list --merge-order HEAD | check_adjacency | grep -c "\^" | tr -d ' ')
119 test_expect_success '--merge-order produces as many or fewer discontinuities' '[ $merge_order_adjacency_count -le $normal_adjacency_count ]'
120 test_output_expect_success 'simple merge order' 'git-rev-list --merge-order --show-breaks HEAD' <<EOF
121 = l5
122 | l4
123 | l3
124 = a4
125 | c3
126 | c2
127 | c1
128 ^ b4
129 | b3
130 | b2
131 | b1
132 ^ a3
133 | a2
134 | a1
135 = a0
136 | l2
137 | l1
138 | l0
139 = root
140 EOF
141
142 test_output_expect_success 'two diamonds merge order (g6)' 'git-rev-list --merge-order --show-breaks g4' <<EOF
143 = g4
144 | h2
145 ^ g3
146 = g2
147 | h1
148 ^ g1
149 = g0
150 EOF
151
152 test_output_expect_success 'multiple heads' 'git-rev-list --merge-order a3 b3 c3' <<EOF
153 c3
154 c2
155 c1
156 b3
157 b2
158 b1
159 a3
160 a2
161 a1
162 a0
163 l2
164 l1
165 l0
166 root
167 EOF
168
169 test_output_expect_success 'multiple heads, prune at a1' 'git-rev-list --merge-order a3 b3 c3 ^a1' <<EOF
170 c3
171 c2
172 c1
173 b3
174 b2
175 b1
176 a3
177 a2
178 EOF
179
180 test_output_expect_success 'multiple heads, prune at l1' 'git-rev-list --merge-order a3 b3 c3 ^l1' <<EOF
181 c3
182 c2
183 c1
184 b3
185 b2
186 b1
187 a3
188 a2
189 a1
190 a0
191 l2
192 EOF
193
194 test_output_expect_success 'cross-epoch, head at l5, prune at l1' 'git-rev-list --merge-order l5 ^l1' <<EOF
195 l5
196 l4
197 l3
198 a4
199 c3
200 c2
201 c1
202 b4
203 b3
204 b2
205 b1
206 a3
207 a2
208 a1
209 a0
210 l2
211 EOF
212
213 test_output_expect_success 'duplicated head arguments' 'git-rev-list --merge-order l5 l5 ^l1' <<EOF
214 l5
215 l4
216 l3
217 a4
218 c3
219 c2
220 c1
221 b4
222 b3
223 b2
224 b1
225 a3
226 a2
227 a1
228 a0
229 l2
230 EOF
231
232 test_output_expect_success 'prune near merge' 'git-rev-list --merge-order a4 ^c3' <<EOF
233 a4
234 b4
235 b3
236 a3
237 a2
238 a1
239 EOF
240
241 test_output_expect_success "head has no parent" 'git-rev-list --merge-order --show-breaks root' <<EOF
242 = root
243 EOF
244
245 test_output_expect_success "two nodes - one head, one base" 'git-rev-list --merge-order --show-breaks l0' <<EOF
246 = l0
247 = root
248 EOF
249
250 test_output_expect_success "three nodes one head, one internal, one base" 'git-rev-list --merge-order --show-breaks l1' <<EOF
251 = l1
252 | l0
253 = root
254 EOF
255
256 test_output_expect_success "linear prune l2 ^root" 'git-rev-list --merge-order --show-breaks l2 ^root' <<EOF
257 ^ l2
258 | l1
259 | l0
260 EOF
261
262 test_output_expect_success "linear prune l2 ^l0" 'git-rev-list --merge-order --show-breaks l2 ^l0' <<EOF
263 ^ l2
264 | l1
265 EOF
266
267 test_output_expect_success "linear prune l2 ^l1" 'git-rev-list --merge-order --show-breaks l2 ^l1' <<EOF
268 ^ l2
269 EOF
270
271 test_output_expect_success "linear prune l5 ^a4" 'git-rev-list --merge-order --show-breaks l5 ^a4' <<EOF
272 ^ l5
273 | l4
274 | l3
275 EOF
276
277 test_output_expect_success "linear prune l5 ^l3" 'git-rev-list --merge-order --show-breaks l5 ^l3' <<EOF
278 ^ l5
279 | l4
280 EOF
281
282 test_output_expect_success "linear prune l5 ^l4" 'git-rev-list --merge-order --show-breaks l5 ^l4' <<EOF
283 ^ l5
284 EOF
285
286 test_output_expect_success "max-count 10 - merge order" 'git-rev-list --merge-order --show-breaks --max-count=10 l5' <<EOF
287 = l5
288 | l4
289 | l3
290 = a4
291 | c3
292 | c2
293 | c1
294 ^ b4
295 | b3
296 | b2
297 EOF
298
299 test_output_expect_success "max-count 10 - non merge order" 'git-rev-list --max-count=10 l5' <<EOF
300 l5
301 l4
302 l3
303 a4
304 b4
305 a3
306 a2
307 c3
308 c2
309 b3
310 EOF
311
312 test_output_expect_success '--max-age=c3, no --merge-order' "git-rev-list --max-age=$(commit_date c3) l5" <<EOF
313 l5
314 l4
315 l3
316 a4
317 b4
318 a3
319 a2
320 c3
321 EOF
322
323 test_output_expect_success '--max-age=c3, --merge-order' "git-rev-list --merge-order --max-age=$(commit_date c3) l5" <<EOF
324 l5
325 l4
326 l3
327 a4
328 c3
329 b4
330 a3
331 a2
332 EOF
333
334 test_output_expect_success 'one specified head reachable from another a4, c3, --merge-order' "list_duplicates git-rev-list --merge-order a4 c3" <<EOF
335 EOF
336
337 test_output_expect_success 'one specified head reachable from another c3, a4, --merge-order' "list_duplicates git-rev-list --merge-order c3 a4" <<EOF
338 EOF
339
340 test_output_expect_success 'one specified head reachable from another a4, c3, no --merge-order' "list_duplicates git-rev-list a4 c3" <<EOF
341 EOF
342
343 test_output_expect_success 'one specified head reachable from another c3, a4, no --merge-order' "list_duplicates git-rev-list c3 a4" <<EOF
344 EOF
345
346 test_output_expect_success 'graph with c3 and a4 parents of head' "list_duplicates git-rev-list m1" <<EOF
347 EOF
348
349 test_output_expect_success 'graph with a4 and c3 parents of head' "list_duplicates git-rev-list m2" <<EOF
350 EOF
351
352 test_expect_success "head ^head --merge-order" 'git-rev-list --merge-order --show-breaks a3 ^a3' <<EOF
353 EOF
354
355 #
356 # can't test this now - duplicate parents can't be created
357 #
358 #test_output_expect_success 'duplicate parents' 'git-rev-list --parents --merge-order --show-breaks m3' <<EOF
359 #= m3 c3 a4 c3
360 #| a4 c3 b4 a3
361 #| b4 a3 b3
362 #| b3 b2
363 #^ a3 a2
364 #| a2 a1
365 #| a1 a0
366 #^ c3 c2
367 #| c2 b2 c1
368 #| b2 b1
369 #^ c1 b1
370 #| b1 a0
371 #= a0 l2
372 #| l2 l1
373 #| l1 l0
374 #| l0 root
375 #= root
376 #EOF
377
378 test_expect_success "head ^head no --merge-order" 'git-rev-list a3 ^a3' <<EOF
379 EOF
380
381 test_output_expect_success 'simple merge order (l5r1)' 'git-rev-list --merge-order --show-breaks l5r1' <<EOF
382 = l5r1
383 | r1
384 | r0
385 | alt_root
386 ^ l5
387 | l4
388 | l3
389 | a4
390 | c3
391 | c2
392 | c1
393 ^ b4
394 | b3
395 | b2
396 | b1
397 ^ a3
398 | a2
399 | a1
400 | a0
401 | l2
402 | l1
403 | l0
404 = root
405 EOF
406
407 test_output_expect_success 'simple merge order (r1l5)' 'git-rev-list --merge-order --show-breaks r1l5' <<EOF
408 = r1l5
409 | l5
410 | l4
411 | l3
412 | a4
413 | c3
414 | c2
415 | c1
416 ^ b4
417 | b3
418 | b2
419 | b1
420 ^ a3
421 | a2
422 | a1
423 | a0
424 | l2
425 | l1
426 | l0
427 | root
428 ^ r1
429 | r0
430 = alt_root
431 EOF
432
433 test_output_expect_success "don't print things unreachable from one branch" "git-rev-list a3 ^b3 --merge-order" <<EOF
434 a3
435 a2
436 a1
437 EOF
438
439 test_output_expect_success "--merge-order a4 l3" "git-rev-list --merge-order a4 l3" <<EOF
440 l3
441 a4
442 c3
443 c2
444 c1
445 b4
446 b3
447 b2
448 b1
449 a3
450 a2
451 a1
452 a0
453 l2
454 l1
455 l0
456 root
457 EOF
458
459 #
460 #
461
462 test_done