]>
Commit | Line | Data |
---|---|---|
a85d1b69 LH |
1 | #!/bin/sh |
2 | # | |
3 | # Copyright (c) 2007 Lars Hjemli | |
4 | # | |
5 | ||
47a528ad | 6 | test_description='git merge |
a85d1b69 LH |
7 | |
8 | Testing basic merge operations/option parsing.' | |
9 | ||
10 | . ./test-lib.sh | |
11 | ||
12 | cat >file <<EOF | |
13 | 1 | |
14 | 2 | |
15 | 3 | |
16 | 4 | |
17 | 5 | |
18 | 6 | |
19 | 7 | |
20 | 8 | |
21 | 9 | |
22 | EOF | |
23 | ||
24 | cat >file.1 <<EOF | |
25 | 1 X | |
26 | 2 | |
27 | 3 | |
28 | 4 | |
29 | 5 | |
30 | 6 | |
31 | 7 | |
32 | 8 | |
33 | 9 | |
34 | EOF | |
35 | ||
36 | cat >file.5 <<EOF | |
37 | 1 | |
38 | 2 | |
39 | 3 | |
40 | 4 | |
41 | 5 X | |
42 | 6 | |
43 | 7 | |
44 | 8 | |
45 | 9 | |
46 | EOF | |
47 | ||
48 | cat >file.9 <<EOF | |
49 | 1 | |
50 | 2 | |
51 | 3 | |
52 | 4 | |
53 | 5 | |
54 | 6 | |
55 | 7 | |
56 | 8 | |
57 | 9 X | |
58 | EOF | |
59 | ||
60 | cat >result.1 <<EOF | |
61 | 1 X | |
62 | 2 | |
63 | 3 | |
64 | 4 | |
65 | 5 | |
66 | 6 | |
67 | 7 | |
68 | 8 | |
69 | 9 | |
70 | EOF | |
71 | ||
72 | cat >result.1-5 <<EOF | |
73 | 1 X | |
74 | 2 | |
75 | 3 | |
76 | 4 | |
77 | 5 X | |
78 | 6 | |
79 | 7 | |
80 | 8 | |
81 | 9 | |
82 | EOF | |
83 | ||
84 | cat >result.1-5-9 <<EOF | |
85 | 1 X | |
86 | 2 | |
87 | 3 | |
88 | 4 | |
89 | 5 X | |
90 | 6 | |
91 | 7 | |
92 | 8 | |
93 | 9 X | |
94 | EOF | |
95 | ||
96 | create_merge_msgs() { | |
97 | echo "Merge commit 'c2'" >msg.1-5 && | |
98 | echo "Merge commit 'c2'; commit 'c3'" >msg.1-5-9 && | |
99 | echo "Squashed commit of the following:" >squash.1 && | |
100 | echo >>squash.1 && | |
101 | git log --no-merges ^HEAD c1 >>squash.1 && | |
102 | echo "Squashed commit of the following:" >squash.1-5 && | |
103 | echo >>squash.1-5 && | |
104 | git log --no-merges ^HEAD c2 >>squash.1-5 && | |
105 | echo "Squashed commit of the following:" >squash.1-5-9 && | |
106 | echo >>squash.1-5-9 && | |
efb779f8 SG |
107 | git log --no-merges ^HEAD c2 c3 >>squash.1-5-9 && |
108 | echo > msg.nolog && | |
109 | echo "* commit 'c3':" >msg.log && | |
110 | echo " commit 3" >>msg.log && | |
111 | echo >>msg.log | |
a85d1b69 LH |
112 | } |
113 | ||
114 | verify_diff() { | |
82ebb0b6 | 115 | if ! test_cmp "$1" "$2" |
a85d1b69 LH |
116 | then |
117 | echo "$3" | |
118 | false | |
119 | fi | |
120 | } | |
121 | ||
122 | verify_merge() { | |
123 | verify_diff "$2" "$1" "[OOPS] bad merge result" && | |
124 | if test $(git ls-files -u | wc -l) -gt 0 | |
125 | then | |
126 | echo "[OOPS] unmerged files" | |
127 | false | |
128 | fi && | |
d492b31c | 129 | if test_must_fail git diff --exit-code |
a85d1b69 LH |
130 | then |
131 | echo "[OOPS] working tree != index" | |
132 | false | |
133 | fi && | |
134 | if test -n "$3" | |
135 | then | |
136 | git show -s --pretty=format:%s HEAD >msg.act && | |
137 | verify_diff "$3" msg.act "[OOPS] bad merge message" | |
138 | fi | |
139 | } | |
140 | ||
141 | verify_head() { | |
142 | if test "$1" != "$(git rev-parse HEAD)" | |
143 | then | |
144 | echo "[OOPS] HEAD != $1" | |
145 | false | |
146 | fi | |
147 | } | |
148 | ||
149 | verify_parents() { | |
150 | i=1 | |
151 | while test $# -gt 0 | |
152 | do | |
153 | if test "$1" != "$(git rev-parse HEAD^$i)" | |
154 | then | |
155 | echo "[OOPS] HEAD^$i != $1" | |
156 | return 1 | |
157 | fi | |
158 | i=$(expr $i + 1) | |
159 | shift | |
160 | done | |
161 | } | |
162 | ||
163 | verify_mergeheads() { | |
164 | i=1 | |
165 | if ! test -f .git/MERGE_HEAD | |
166 | then | |
167 | echo "[OOPS] MERGE_HEAD is missing" | |
168 | false | |
169 | fi && | |
170 | while test $# -gt 0 | |
171 | do | |
b4ce54fc | 172 | head=$(head -n $i .git/MERGE_HEAD | sed -ne \$p) |
a85d1b69 LH |
173 | if test "$1" != "$head" |
174 | then | |
175 | echo "[OOPS] MERGE_HEAD $i != $1" | |
176 | return 1 | |
177 | fi | |
178 | i=$(expr $i + 1) | |
179 | shift | |
180 | done | |
181 | } | |
182 | ||
183 | verify_no_mergehead() { | |
184 | if test -f .git/MERGE_HEAD | |
185 | then | |
186 | echo "[OOPS] MERGE_HEAD exists" | |
187 | false | |
188 | fi | |
189 | } | |
190 | ||
191 | ||
192 | test_expect_success 'setup' ' | |
193 | git add file && | |
194 | test_tick && | |
195 | git commit -m "commit 0" && | |
196 | git tag c0 && | |
197 | c0=$(git rev-parse HEAD) && | |
198 | cp file.1 file && | |
199 | git add file && | |
200 | test_tick && | |
201 | git commit -m "commit 1" && | |
202 | git tag c1 && | |
203 | c1=$(git rev-parse HEAD) && | |
204 | git reset --hard "$c0" && | |
205 | cp file.5 file && | |
206 | git add file && | |
207 | test_tick && | |
208 | git commit -m "commit 2" && | |
209 | git tag c2 && | |
210 | c2=$(git rev-parse HEAD) && | |
211 | git reset --hard "$c0" && | |
212 | cp file.9 file && | |
213 | git add file && | |
214 | test_tick && | |
215 | git commit -m "commit 3" && | |
216 | git tag c3 && | |
217 | c3=$(git rev-parse HEAD) | |
218 | git reset --hard "$c0" && | |
219 | create_merge_msgs | |
220 | ' | |
221 | ||
222 | test_debug 'gitk --all' | |
223 | ||
74f5b7fb | 224 | test_expect_success 'test option parsing' ' |
01941bd5 JS |
225 | test_must_fail git merge -$ c1 && |
226 | test_must_fail git merge --no-such c1 && | |
227 | test_must_fail git merge -s foobar c1 && | |
228 | test_must_fail git merge -s=foobar c1 && | |
229 | test_must_fail git merge -m && | |
230 | test_must_fail git merge | |
a85d1b69 LH |
231 | ' |
232 | ||
dce61e72 MV |
233 | test_expect_success 'reject non-strategy with a git-merge-foo name' ' |
234 | test_must_fail git merge -s index c1 | |
235 | ' | |
236 | ||
a85d1b69 LH |
237 | test_expect_success 'merge c0 with c1' ' |
238 | git reset --hard c0 && | |
239 | git merge c1 && | |
240 | verify_merge file result.1 && | |
241 | verify_head "$c1" | |
242 | ' | |
243 | ||
244 | test_debug 'gitk --all' | |
245 | ||
13474835 BG |
246 | test_expect_success 'merge c0 with c1 with --ff-only' ' |
247 | git reset --hard c0 && | |
248 | git merge --ff-only c1 && | |
249 | git merge --ff-only HEAD c0 c1 && | |
250 | verify_merge file result.1 && | |
251 | verify_head "$c1" | |
252 | ' | |
253 | ||
254 | test_debug 'gitk --all' | |
255 | ||
a85d1b69 LH |
256 | test_expect_success 'merge c1 with c2' ' |
257 | git reset --hard c1 && | |
258 | test_tick && | |
259 | git merge c2 && | |
260 | verify_merge file result.1-5 msg.1-5 && | |
261 | verify_parents $c1 $c2 | |
262 | ' | |
263 | ||
264 | test_debug 'gitk --all' | |
265 | ||
266 | test_expect_success 'merge c1 with c2 and c3' ' | |
267 | git reset --hard c1 && | |
268 | test_tick && | |
269 | git merge c2 c3 && | |
270 | verify_merge file result.1-5-9 msg.1-5-9 && | |
271 | verify_parents $c1 $c2 $c3 | |
272 | ' | |
273 | ||
274 | test_debug 'gitk --all' | |
275 | ||
13474835 BG |
276 | test_expect_success 'failing merges with --ff-only' ' |
277 | git reset --hard c1 && | |
278 | test_tick && | |
279 | test_must_fail git merge --ff-only c2 && | |
280 | test_must_fail git merge --ff-only c3 && | |
281 | test_must_fail git merge --ff-only c2 c3 | |
282 | ' | |
283 | ||
a85d1b69 LH |
284 | test_expect_success 'merge c0 with c1 (no-commit)' ' |
285 | git reset --hard c0 && | |
286 | git merge --no-commit c1 && | |
287 | verify_merge file result.1 && | |
288 | verify_head $c1 | |
289 | ' | |
290 | ||
291 | test_debug 'gitk --all' | |
292 | ||
293 | test_expect_success 'merge c1 with c2 (no-commit)' ' | |
294 | git reset --hard c1 && | |
295 | git merge --no-commit c2 && | |
296 | verify_merge file result.1-5 && | |
297 | verify_head $c1 && | |
298 | verify_mergeheads $c2 | |
299 | ' | |
300 | ||
301 | test_debug 'gitk --all' | |
302 | ||
303 | test_expect_success 'merge c1 with c2 and c3 (no-commit)' ' | |
304 | git reset --hard c1 && | |
305 | git merge --no-commit c2 c3 && | |
306 | verify_merge file result.1-5-9 && | |
307 | verify_head $c1 && | |
308 | verify_mergeheads $c2 $c3 | |
309 | ' | |
310 | ||
311 | test_debug 'gitk --all' | |
312 | ||
313 | test_expect_success 'merge c0 with c1 (squash)' ' | |
314 | git reset --hard c0 && | |
315 | git merge --squash c1 && | |
316 | verify_merge file result.1 && | |
317 | verify_head $c0 && | |
318 | verify_no_mergehead && | |
319 | verify_diff squash.1 .git/SQUASH_MSG "[OOPS] bad squash message" | |
320 | ' | |
321 | ||
322 | test_debug 'gitk --all' | |
323 | ||
13474835 BG |
324 | test_expect_success 'merge c0 with c1 (squash, ff-only)' ' |
325 | git reset --hard c0 && | |
326 | git merge --squash --ff-only c1 && | |
327 | verify_merge file result.1 && | |
328 | verify_head $c0 && | |
329 | verify_no_mergehead && | |
330 | verify_diff squash.1 .git/SQUASH_MSG "[OOPS] bad squash message" | |
331 | ' | |
332 | ||
333 | test_debug 'gitk --all' | |
334 | ||
a85d1b69 LH |
335 | test_expect_success 'merge c1 with c2 (squash)' ' |
336 | git reset --hard c1 && | |
337 | git merge --squash c2 && | |
338 | verify_merge file result.1-5 && | |
339 | verify_head $c1 && | |
340 | verify_no_mergehead && | |
341 | verify_diff squash.1-5 .git/SQUASH_MSG "[OOPS] bad squash message" | |
342 | ' | |
343 | ||
344 | test_debug 'gitk --all' | |
345 | ||
13474835 BG |
346 | test_expect_success 'unsuccesful merge of c1 with c2 (squash, ff-only)' ' |
347 | git reset --hard c1 && | |
348 | test_must_fail git merge --squash --ff-only c2 | |
349 | ' | |
350 | ||
351 | test_debug 'gitk --all' | |
352 | ||
a85d1b69 LH |
353 | test_expect_success 'merge c1 with c2 and c3 (squash)' ' |
354 | git reset --hard c1 && | |
355 | git merge --squash c2 c3 && | |
356 | verify_merge file result.1-5-9 && | |
357 | verify_head $c1 && | |
358 | verify_no_mergehead && | |
359 | verify_diff squash.1-5-9 .git/SQUASH_MSG "[OOPS] bad squash message" | |
360 | ' | |
361 | ||
362 | test_debug 'gitk --all' | |
363 | ||
aec7b362 LH |
364 | test_expect_success 'merge c1 with c2 (no-commit in config)' ' |
365 | git reset --hard c1 && | |
366 | git config branch.master.mergeoptions "--no-commit" && | |
367 | git merge c2 && | |
368 | verify_merge file result.1-5 && | |
369 | verify_head $c1 && | |
370 | verify_mergeheads $c2 | |
371 | ' | |
372 | ||
373 | test_debug 'gitk --all' | |
374 | ||
375 | test_expect_success 'merge c1 with c2 (squash in config)' ' | |
376 | git reset --hard c1 && | |
377 | git config branch.master.mergeoptions "--squash" && | |
378 | git merge c2 && | |
379 | verify_merge file result.1-5 && | |
380 | verify_head $c1 && | |
381 | verify_no_mergehead && | |
382 | verify_diff squash.1-5 .git/SQUASH_MSG "[OOPS] bad squash message" | |
383 | ' | |
384 | ||
385 | test_debug 'gitk --all' | |
386 | ||
d8abe148 | 387 | test_expect_success 'override config option -n with --summary' ' |
aec7b362 LH |
388 | git reset --hard c1 && |
389 | git config branch.master.mergeoptions "-n" && | |
390 | test_tick && | |
391 | git merge --summary c2 >diffstat.txt && | |
392 | verify_merge file result.1-5 msg.1-5 && | |
393 | verify_parents $c1 $c2 && | |
aadbe44f | 394 | if ! grep "^ file | *2 +-$" diffstat.txt |
aec7b362 | 395 | then |
d8abe148 SG |
396 | echo "[OOPS] diffstat was not generated with --summary" |
397 | false | |
398 | fi | |
399 | ' | |
400 | ||
401 | test_expect_success 'override config option -n with --stat' ' | |
402 | git reset --hard c1 && | |
403 | git config branch.master.mergeoptions "-n" && | |
404 | test_tick && | |
405 | git merge --stat c2 >diffstat.txt && | |
406 | verify_merge file result.1-5 msg.1-5 && | |
407 | verify_parents $c1 $c2 && | |
408 | if ! grep "^ file | *2 +-$" diffstat.txt | |
409 | then | |
410 | echo "[OOPS] diffstat was not generated with --stat" | |
411 | false | |
aec7b362 LH |
412 | fi |
413 | ' | |
414 | ||
415 | test_debug 'gitk --all' | |
416 | ||
d8abe148 | 417 | test_expect_success 'override config option --stat' ' |
aec7b362 | 418 | git reset --hard c1 && |
d8abe148 | 419 | git config branch.master.mergeoptions "--stat" && |
aec7b362 LH |
420 | test_tick && |
421 | git merge -n c2 >diffstat.txt && | |
422 | verify_merge file result.1-5 msg.1-5 && | |
423 | verify_parents $c1 $c2 && | |
aadbe44f | 424 | if grep "^ file | *2 +-$" diffstat.txt |
aec7b362 LH |
425 | then |
426 | echo "[OOPS] diffstat was generated" | |
427 | false | |
428 | fi | |
429 | ' | |
430 | ||
431 | test_debug 'gitk --all' | |
432 | ||
d08af0ad LH |
433 | test_expect_success 'merge c1 with c2 (override --no-commit)' ' |
434 | git reset --hard c1 && | |
435 | git config branch.master.mergeoptions "--no-commit" && | |
436 | test_tick && | |
437 | git merge --commit c2 && | |
438 | verify_merge file result.1-5 msg.1-5 && | |
439 | verify_parents $c1 $c2 | |
440 | ' | |
441 | ||
442 | test_debug 'gitk --all' | |
443 | ||
444 | test_expect_success 'merge c1 with c2 (override --squash)' ' | |
445 | git reset --hard c1 && | |
446 | git config branch.master.mergeoptions "--squash" && | |
447 | test_tick && | |
448 | git merge --no-squash c2 && | |
449 | verify_merge file result.1-5 msg.1-5 && | |
450 | verify_parents $c1 $c2 | |
451 | ' | |
452 | ||
453 | test_debug 'gitk --all' | |
454 | ||
d66424c4 LH |
455 | test_expect_success 'merge c0 with c1 (no-ff)' ' |
456 | git reset --hard c0 && | |
e6d1f76c | 457 | git config branch.master.mergeoptions "" && |
d66424c4 LH |
458 | test_tick && |
459 | git merge --no-ff c1 && | |
460 | verify_merge file result.1 && | |
461 | verify_parents $c0 $c1 | |
462 | ' | |
463 | ||
464 | test_debug 'gitk --all' | |
465 | ||
e6d1f76c GP |
466 | test_expect_success 'combining --squash and --no-ff is refused' ' |
467 | test_must_fail git merge --squash --no-ff c1 && | |
468 | test_must_fail git merge --no-ff --squash c1 | |
469 | ' | |
470 | ||
13474835 BG |
471 | test_expect_success 'combining --ff-only and --no-ff is refused' ' |
472 | test_must_fail git merge --ff-only --no-ff c1 && | |
473 | test_must_fail git merge --no-ff --ff-only c1 | |
474 | ' | |
475 | ||
d66424c4 LH |
476 | test_expect_success 'merge c0 with c1 (ff overrides no-ff)' ' |
477 | git reset --hard c0 && | |
478 | git config branch.master.mergeoptions "--no-ff" && | |
479 | git merge --ff c1 && | |
480 | verify_merge file result.1 && | |
481 | verify_head $c1 | |
482 | ' | |
483 | ||
efb779f8 SG |
484 | test_expect_success 'merge log message' ' |
485 | git reset --hard c0 && | |
486 | git merge --no-log c2 && | |
487 | git show -s --pretty=format:%b HEAD >msg.act && | |
488 | verify_diff msg.nolog msg.act "[OOPS] bad merge log message" && | |
4393c237 | 489 | |
efb779f8 SG |
490 | git merge --log c3 && |
491 | git show -s --pretty=format:%b HEAD >msg.act && | |
4393c237 JH |
492 | verify_diff msg.log msg.act "[OOPS] bad merge log message" && |
493 | ||
494 | git reset --hard HEAD^ && | |
495 | git config merge.log yes && | |
496 | git merge c3 && | |
497 | git show -s --pretty=format:%b HEAD >msg.act && | |
efb779f8 SG |
498 | verify_diff msg.log msg.act "[OOPS] bad merge log message" |
499 | ' | |
500 | ||
d66424c4 LH |
501 | test_debug 'gitk --all' |
502 | ||
3d1dd472 SHJ |
503 | test_expect_success 'merge c1 with c0, c2, c0, and c1' ' |
504 | git reset --hard c1 && | |
505 | git config branch.master.mergeoptions "" && | |
506 | test_tick && | |
507 | git merge c0 c2 c0 c1 && | |
508 | verify_merge file result.1-5 && | |
509 | verify_parents $c1 $c2 | |
510 | ' | |
511 | ||
512 | test_debug 'gitk --all' | |
513 | ||
711f6b29 JH |
514 | test_expect_success 'merge c1 with c0, c2, c0, and c1' ' |
515 | git reset --hard c1 && | |
516 | git config branch.master.mergeoptions "" && | |
517 | test_tick && | |
518 | git merge c0 c2 c0 c1 && | |
519 | verify_merge file result.1-5 && | |
520 | verify_parents $c1 $c2 | |
521 | ' | |
522 | ||
523 | test_debug 'gitk --all' | |
524 | ||
525 | test_expect_success 'merge c1 with c1 and c2' ' | |
526 | git reset --hard c1 && | |
527 | git config branch.master.mergeoptions "" && | |
528 | test_tick && | |
529 | git merge c1 c2 && | |
530 | verify_merge file result.1-5 && | |
531 | verify_parents $c1 $c2 | |
532 | ' | |
533 | ||
534 | test_debug 'gitk --all' | |
535 | ||
9ca8f607 JH |
536 | test_expect_success 'merge fast-forward in a dirty tree' ' |
537 | git reset --hard c0 && | |
538 | mv file file1 && | |
539 | cat file1 >file && | |
540 | rm -f file1 && | |
541 | git merge c2 | |
542 | ' | |
543 | ||
544 | test_debug 'gitk --all' | |
545 | ||
446247db JH |
546 | test_expect_success 'in-index merge' ' |
547 | git reset --hard c0 && | |
548 | git merge --no-ff -s resolve c1 > out && | |
549 | grep "Wonderful." out && | |
550 | verify_parents $c0 $c1 | |
551 | ' | |
552 | ||
553 | test_debug 'gitk --all' | |
554 | ||
668f26ff MV |
555 | test_expect_success 'refresh the index before merging' ' |
556 | git reset --hard c1 && | |
016e5ff2 | 557 | cp file file.n && mv -f file.n file && |
668f26ff MV |
558 | git merge c3 |
559 | ' | |
560 | ||
4e6d4bc0 MV |
561 | cat >expected <<EOF |
562 | Merge branch 'c5' (early part) | |
563 | EOF | |
564 | ||
565 | test_expect_success 'merge early part of c2' ' | |
566 | git reset --hard c3 && | |
567 | echo c4 > c4.c && | |
568 | git add c4.c && | |
569 | git commit -m c4 && | |
570 | git tag c4 && | |
571 | echo c5 > c5.c && | |
572 | git add c5.c && | |
573 | git commit -m c5 && | |
574 | git tag c5 && | |
575 | git reset --hard c3 && | |
576 | echo c6 > c6.c && | |
577 | git add c6.c && | |
578 | git commit -m c6 && | |
579 | git tag c6 && | |
580 | git merge c5~1 && | |
581 | git show -s --pretty=format:%s HEAD > actual && | |
582 | test_cmp actual expected | |
583 | ' | |
584 | ||
668f26ff MV |
585 | test_debug 'gitk --all' |
586 | ||
cf10f9fd MV |
587 | test_expect_success 'merge --no-ff --no-commit && commit' ' |
588 | git reset --hard c0 && | |
589 | git merge --no-ff --no-commit c1 && | |
590 | EDITOR=: git commit && | |
591 | verify_parents $c0 $c1 | |
592 | ' | |
593 | ||
594 | test_debug 'gitk --all' | |
595 | ||
596 | test_expect_success 'amending no-ff merge commit' ' | |
597 | EDITOR=: git commit --amend && | |
598 | verify_parents $c0 $c1 | |
599 | ' | |
600 | ||
601 | test_debug 'gitk --all' | |
602 | ||
a85d1b69 | 603 | test_done |