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