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