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