]>
Commit | Line | Data |
---|---|---|
4e734673 JS |
1 | #!/bin/sh |
2 | # | |
3 | # Copyright (c) 2005 Jon Seymour | |
4 | # | |
5 | ||
dec5eda7 JS |
6 | test_description='Tests git-rev-list --merge-order functionality' |
7 | ||
4e734673 | 8 | . ./test-lib.sh |
77656600 | 9 | . ../t6000lib.sh # t6xxx specific functions |
dec5eda7 | 10 | |
eb3c430a JH |
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 | ||
dec5eda7 JS |
18 | # test-case specific test function |
19 | check_adjacency() | |
4e734673 JS |
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 | ||
dec5eda7 JS |
35 | list_duplicates() |
36 | { | |
37 | "$@" | sort | uniq -d | |
38 | } | |
39 | ||
40 | grep_stderr() | |
4e734673 | 41 | { |
dec5eda7 JS |
42 | args=$1 |
43 | shift 1 | |
44 | "$@" 2>&1 | grep "$args" | |
4e734673 JS |
45 | } |
46 | ||
47 | date >path0 | |
215a7ad1 | 48 | git-update-index --add path0 |
dec5eda7 JS |
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 | |
6e4c0a51 JS |
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 | ||
dec5eda7 JS |
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 | ||
0a81552e | 111 | git-update-ref HEAD $(tag l5) |
dec5eda7 | 112 | |
dec5eda7 JS |
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 | |
4e734673 JS |
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 | ||
dec5eda7 JS |
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 | |
4e734673 | 151 | |
dec5eda7 | 152 | test_output_expect_success 'multiple heads' 'git-rev-list --merge-order a3 b3 c3' <<EOF |
4e734673 JS |
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 | ||
dec5eda7 | 169 | test_output_expect_success 'multiple heads, prune at a1' 'git-rev-list --merge-order a3 b3 c3 ^a1' <<EOF |
4e734673 JS |
170 | c3 |
171 | c2 | |
172 | c1 | |
173 | b3 | |
174 | b2 | |
175 | b1 | |
176 | a3 | |
177 | a2 | |
178 | EOF | |
179 | ||
dec5eda7 | 180 | test_output_expect_success 'multiple heads, prune at l1' 'git-rev-list --merge-order a3 b3 c3 ^l1' <<EOF |
4e734673 JS |
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 | ||
dec5eda7 JS |
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 | |
4e734673 | 212 | |
dec5eda7 | 213 | test_output_expect_success 'duplicated head arguments' 'git-rev-list --merge-order l5 l5 ^l1' <<EOF |
4e734673 JS |
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 | ||
dec5eda7 JS |
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 | |
99c2bc93 | 257 | ^ l2 |
dec5eda7 JS |
258 | | l1 |
259 | | l0 | |
260 | EOF | |
4e734673 | 261 | |
dec5eda7 | 262 | test_output_expect_success "linear prune l2 ^l0" 'git-rev-list --merge-order --show-breaks l2 ^l0' <<EOF |
99c2bc93 | 263 | ^ l2 |
dec5eda7 JS |
264 | | l1 |
265 | EOF | |
4e734673 | 266 | |
dec5eda7 | 267 | test_output_expect_success "linear prune l2 ^l1" 'git-rev-list --merge-order --show-breaks l2 ^l1' <<EOF |
99c2bc93 | 268 | ^ l2 |
dec5eda7 JS |
269 | EOF |
270 | ||
271 | test_output_expect_success "linear prune l5 ^a4" 'git-rev-list --merge-order --show-breaks l5 ^a4' <<EOF | |
99c2bc93 | 272 | ^ l5 |
dec5eda7 JS |
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 | |
99c2bc93 | 278 | ^ l5 |
dec5eda7 JS |
279 | | l4 |
280 | EOF | |
281 | ||
282 | test_output_expect_success "linear prune l5 ^l4" 'git-rev-list --merge-order --show-breaks l5 ^l4' <<EOF | |
99c2bc93 | 283 | ^ l5 |
dec5eda7 JS |
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 | ||
9d89d19c JS |
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 | |
dec5eda7 | 303 | a4 |
dec5eda7 | 304 | b4 |
9d89d19c JS |
305 | a3 |
306 | a2 | |
dec5eda7 | 307 | c3 |
9d89d19c JS |
308 | c2 |
309 | b3 | |
dec5eda7 JS |
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 | |
6e4c0a51 JS |
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 | ||
da4b932a JS |
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 | |
6e4c0a51 | 438 | |
4d3a63ba JS |
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 | ||
dec5eda7 JS |
459 | # |
460 | # | |
4e734673 JS |
461 | |
462 | test_done |