Raw
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 test_output_expect_success '--max-age=c3, --topo-order' "git rev-list --topo-order --max-age=$(commit_date c3) l5" <<EOF
329 l5
330 l4
331 l3
332 a4
333 c3
334 b4
335 a3
336 a2
337 EOF
338
339 test_output_expect_success 'one specified head reachable from another a4, c3, --topo-order' "list_duplicates git rev-list --topo-order a4 c3" <<EOF
340 EOF
341
342 test_output_expect_success 'one specified head reachable from another c3, a4, --topo-order' "list_duplicates git rev-list --topo-order c3 a4" <<EOF
343 EOF
344
345 test_output_expect_success 'one specified head reachable from another a4, c3, no --topo-order' "list_duplicates git rev-list a4 c3" <<EOF
346 EOF
347
348 test_output_expect_success 'one specified head reachable from another c3, a4, no --topo-order' "list_duplicates git rev-list c3 a4" <<EOF
349 EOF
350
351 test_output_expect_success 'graph with c3 and a4 parents of head' "list_duplicates git rev-list m1" <<EOF
352 EOF
353
354 test_output_expect_success 'graph with a4 and c3 parents of head' "list_duplicates git rev-list m2" <<EOF
355 EOF
356
357 test_expect_success "head ^head --topo-order" 'git rev-list --topo-order a3 ^a3' <<EOF
358 EOF
359
360 test_expect_success "head ^head no --topo-order" 'git rev-list a3 ^a3' <<EOF
361 EOF
362
363 test_output_expect_success 'simple topo order (l5r1)' 'git rev-list --topo-order l5r1' <<EOF
364 l5r1
365 r1
366 r0
367 alt_root
368 l5
369 l4
370 l3
371 a4
372 c3
373 c2
374 c1
375 b4
376 a3
377 a2
378 a1
379 b3
380 b2
381 b1
382 a0
383 l2
384 l1
385 l0
386 root
387 EOF
388
389 test_output_expect_success 'simple topo order (r1l5)' 'git rev-list --topo-order r1l5' <<EOF
390 r1l5
391 l5
392 l4
393 l3
394 a4
395 c3
396 c2
397 c1
398 b4
399 a3
400 a2
401 a1
402 b3
403 b2
404 b1
405 a0
406 l2
407 l1
408 l0
409 root
410 r1
411 r0
412 alt_root
413 EOF
414
415 test_output_expect_success "don't print things unreachable from one branch" "git rev-list a3 ^b3 --topo-order" <<EOF
416 a3
417 a2
418 a1
419 EOF
420
421 test_output_expect_success "--topo-order a4 l3" "git rev-list --topo-order a4 l3" <<EOF
422 l3
423 a4
424 c3
425 c2
426 c1
427 b4
428 a3
429 a2
430 a1
431 b3
432 b2
433 b1
434 a0
435 l2
436 l1
437 l0
438 root
439 EOF
440
441 #
442 #
443
444 test_done