]> git.ipfire.org Git - thirdparty/git.git/blame - t/t3030-merge-recursive.sh
revert: free msg in format_todo()
[thirdparty/git.git] / t / t3030-merge-recursive.sh
CommitLineData
885b9810
JH
1#!/bin/sh
2
3test_description='merge-recursive backend test'
4
5. ./test-lib.sh
6
7test_expect_success 'setup 1' '
8
9 echo hello >a &&
10 o0=$(git hash-object a) &&
11 cp a b &&
744747ef 12 cp a c &&
885b9810
JH
13 mkdir d &&
14 cp a d/e &&
15
16 test_tick &&
744747ef 17 git add a b c d/e &&
885b9810
JH
18 git commit -m initial &&
19 c0=$(git rev-parse --verify HEAD) &&
20 git branch side &&
21 git branch df-1 &&
22 git branch df-2 &&
23 git branch df-3 &&
24 git branch remove &&
7d82b06d 25 git branch submod &&
d5af5105
SK
26 git branch copy &&
27 git branch rename &&
8a1c0d32
SK
28 if test_have_prereq SYMLINKS
29 then
30 git branch rename-ln
31 fi &&
885b9810
JH
32
33 echo hello >>a &&
34 cp a d/e &&
35 o1=$(git hash-object a) &&
36
37 git add a d/e &&
38
39 test_tick &&
40 git commit -m "master modifies a and d/e" &&
41 c1=$(git rev-parse --verify HEAD) &&
42 ( git ls-tree -r HEAD ; git ls-files -s ) >actual &&
43 (
885b9810
JH
44 echo "100644 blob $o1 a"
45 echo "100644 blob $o0 b"
744747ef 46 echo "100644 blob $o0 c"
885b9810 47 echo "100644 blob $o1 d/e"
885b9810
JH
48 echo "100644 $o1 0 a"
49 echo "100644 $o0 0 b"
744747ef 50 echo "100644 $o0 0 c"
885b9810
JH
51 echo "100644 $o1 0 d/e"
52 ) >expected &&
3af82863 53 test_cmp expected actual
885b9810
JH
54'
55
56test_expect_success 'setup 2' '
57
744747ef 58 rm -rf [abcd] &&
885b9810
JH
59 git checkout side &&
60 ( git ls-tree -r HEAD ; git ls-files -s ) >actual &&
61 (
885b9810
JH
62 echo "100644 blob $o0 a"
63 echo "100644 blob $o0 b"
744747ef 64 echo "100644 blob $o0 c"
885b9810 65 echo "100644 blob $o0 d/e"
885b9810
JH
66 echo "100644 $o0 0 a"
67 echo "100644 $o0 0 b"
744747ef 68 echo "100644 $o0 0 c"
885b9810
JH
69 echo "100644 $o0 0 d/e"
70 ) >expected &&
3af82863 71 test_cmp expected actual &&
885b9810
JH
72
73 echo goodbye >>a &&
74 o2=$(git hash-object a) &&
75
76 git add a &&
77
78 test_tick &&
79 git commit -m "side modifies a" &&
80 c2=$(git rev-parse --verify HEAD) &&
81 ( git ls-tree -r HEAD ; git ls-files -s ) >actual &&
82 (
885b9810
JH
83 echo "100644 blob $o2 a"
84 echo "100644 blob $o0 b"
744747ef 85 echo "100644 blob $o0 c"
885b9810 86 echo "100644 blob $o0 d/e"
885b9810
JH
87 echo "100644 $o2 0 a"
88 echo "100644 $o0 0 b"
744747ef 89 echo "100644 $o0 0 c"
885b9810
JH
90 echo "100644 $o0 0 d/e"
91 ) >expected &&
3af82863 92 test_cmp expected actual
885b9810
JH
93'
94
95test_expect_success 'setup 3' '
96
744747ef 97 rm -rf [abcd] &&
885b9810
JH
98 git checkout df-1 &&
99 ( git ls-tree -r HEAD ; git ls-files -s ) >actual &&
100 (
885b9810
JH
101 echo "100644 blob $o0 a"
102 echo "100644 blob $o0 b"
744747ef 103 echo "100644 blob $o0 c"
885b9810 104 echo "100644 blob $o0 d/e"
885b9810
JH
105 echo "100644 $o0 0 a"
106 echo "100644 $o0 0 b"
744747ef 107 echo "100644 $o0 0 c"
885b9810
JH
108 echo "100644 $o0 0 d/e"
109 ) >expected &&
3af82863 110 test_cmp expected actual &&
885b9810
JH
111
112 rm -f b && mkdir b && echo df-1 >b/c && git add b/c &&
113 o3=$(git hash-object b/c) &&
114
115 test_tick &&
116 git commit -m "df-1 makes b/c" &&
117 c3=$(git rev-parse --verify HEAD) &&
118 ( git ls-tree -r HEAD ; git ls-files -s ) >actual &&
119 (
885b9810
JH
120 echo "100644 blob $o0 a"
121 echo "100644 blob $o3 b/c"
744747ef 122 echo "100644 blob $o0 c"
885b9810 123 echo "100644 blob $o0 d/e"
885b9810
JH
124 echo "100644 $o0 0 a"
125 echo "100644 $o3 0 b/c"
744747ef 126 echo "100644 $o0 0 c"
885b9810
JH
127 echo "100644 $o0 0 d/e"
128 ) >expected &&
3af82863 129 test_cmp expected actual
885b9810
JH
130'
131
132test_expect_success 'setup 4' '
133
744747ef 134 rm -rf [abcd] &&
885b9810
JH
135 git checkout df-2 &&
136 ( git ls-tree -r HEAD ; git ls-files -s ) >actual &&
137 (
885b9810
JH
138 echo "100644 blob $o0 a"
139 echo "100644 blob $o0 b"
744747ef 140 echo "100644 blob $o0 c"
885b9810 141 echo "100644 blob $o0 d/e"
885b9810
JH
142 echo "100644 $o0 0 a"
143 echo "100644 $o0 0 b"
744747ef 144 echo "100644 $o0 0 c"
885b9810
JH
145 echo "100644 $o0 0 d/e"
146 ) >expected &&
3af82863 147 test_cmp expected actual &&
885b9810
JH
148
149 rm -f a && mkdir a && echo df-2 >a/c && git add a/c &&
150 o4=$(git hash-object a/c) &&
151
152 test_tick &&
153 git commit -m "df-2 makes a/c" &&
154 c4=$(git rev-parse --verify HEAD) &&
155 ( git ls-tree -r HEAD ; git ls-files -s ) >actual &&
156 (
885b9810
JH
157 echo "100644 blob $o4 a/c"
158 echo "100644 blob $o0 b"
744747ef 159 echo "100644 blob $o0 c"
885b9810 160 echo "100644 blob $o0 d/e"
885b9810
JH
161 echo "100644 $o4 0 a/c"
162 echo "100644 $o0 0 b"
744747ef 163 echo "100644 $o0 0 c"
885b9810
JH
164 echo "100644 $o0 0 d/e"
165 ) >expected &&
3af82863 166 test_cmp expected actual
885b9810
JH
167'
168
169test_expect_success 'setup 5' '
170
744747ef 171 rm -rf [abcd] &&
885b9810
JH
172 git checkout remove &&
173 ( git ls-tree -r HEAD ; git ls-files -s ) >actual &&
174 (
885b9810
JH
175 echo "100644 blob $o0 a"
176 echo "100644 blob $o0 b"
744747ef 177 echo "100644 blob $o0 c"
885b9810 178 echo "100644 blob $o0 d/e"
885b9810
JH
179 echo "100644 $o0 0 a"
180 echo "100644 $o0 0 b"
744747ef 181 echo "100644 $o0 0 c"
885b9810
JH
182 echo "100644 $o0 0 d/e"
183 ) >expected &&
3af82863 184 test_cmp expected actual &&
885b9810
JH
185
186 rm -f b &&
187 echo remove-conflict >a &&
188
189 git add a &&
190 git rm b &&
191 o5=$(git hash-object a) &&
192
193 test_tick &&
194 git commit -m "remove removes b and modifies a" &&
195 c5=$(git rev-parse --verify HEAD) &&
196 ( git ls-tree -r HEAD ; git ls-files -s ) >actual &&
197 (
885b9810 198 echo "100644 blob $o5 a"
744747ef 199 echo "100644 blob $o0 c"
885b9810 200 echo "100644 blob $o0 d/e"
885b9810 201 echo "100644 $o5 0 a"
744747ef 202 echo "100644 $o0 0 c"
885b9810
JH
203 echo "100644 $o0 0 d/e"
204 ) >expected &&
3af82863 205 test_cmp expected actual
885b9810
JH
206
207'
208
209test_expect_success 'setup 6' '
210
744747ef 211 rm -rf [abcd] &&
885b9810
JH
212 git checkout df-3 &&
213 ( git ls-tree -r HEAD ; git ls-files -s ) >actual &&
214 (
885b9810
JH
215 echo "100644 blob $o0 a"
216 echo "100644 blob $o0 b"
744747ef 217 echo "100644 blob $o0 c"
885b9810 218 echo "100644 blob $o0 d/e"
885b9810
JH
219 echo "100644 $o0 0 a"
220 echo "100644 $o0 0 b"
744747ef 221 echo "100644 $o0 0 c"
885b9810
JH
222 echo "100644 $o0 0 d/e"
223 ) >expected &&
3af82863 224 test_cmp expected actual &&
885b9810
JH
225
226 rm -fr d && echo df-3 >d && git add d &&
227 o6=$(git hash-object d) &&
228
229 test_tick &&
230 git commit -m "df-3 makes d" &&
231 c6=$(git rev-parse --verify HEAD) &&
232 ( git ls-tree -r HEAD ; git ls-files -s ) >actual &&
233 (
885b9810
JH
234 echo "100644 blob $o0 a"
235 echo "100644 blob $o0 b"
744747ef 236 echo "100644 blob $o0 c"
885b9810 237 echo "100644 blob $o6 d"
885b9810
JH
238 echo "100644 $o0 0 a"
239 echo "100644 $o0 0 b"
744747ef 240 echo "100644 $o0 0 c"
885b9810
JH
241 echo "100644 $o6 0 d"
242 ) >expected &&
3af82863 243 test_cmp expected actual
885b9810
JH
244'
245
7d82b06d
JS
246test_expect_success 'setup 7' '
247
248 git checkout submod &&
249 git rm d/e &&
250 test_tick &&
251 git commit -m "remove d/e" &&
252 git update-index --add --cacheinfo 160000 $c1 d &&
253 test_tick &&
254 git commit -m "make d/ a submodule"
255'
256
d5af5105
SK
257test_expect_success 'setup 8' '
258 git checkout rename &&
259 git mv a e &&
260 git add e &&
261 test_tick &&
8a1c0d32
SK
262 git commit -m "rename a->e" &&
263 if test_have_prereq SYMLINKS
264 then
265 git checkout rename-ln &&
266 git mv a e &&
267 ln -s e a &&
268 git add a e &&
269 test_tick &&
814f7d90
JK
270 git commit -m "rename a->e, symlink a->e" &&
271 oln=`printf e | git hash-object --stdin`
8a1c0d32 272 fi
d5af5105
SK
273'
274
275test_expect_success 'setup 9' '
276 git checkout copy &&
277 cp a e &&
278 git add e &&
279 test_tick &&
280 git commit -m "copy a->e"
281'
282
885b9810
JH
283test_expect_success 'merge-recursive simple' '
284
744747ef 285 rm -fr [abcd] &&
885b9810
JH
286 git checkout -f "$c2" &&
287
0cb0e143 288 git merge-recursive "$c0" -- "$c2" "$c1"
885b9810
JH
289 status=$?
290 case "$status" in
291 1)
292 : happy
293 ;;
294 *)
295 echo >&2 "why status $status!!!"
296 false
297 ;;
298 esac
299'
300
301test_expect_success 'merge-recursive result' '
302
303 git ls-files -s >actual &&
304 (
885b9810
JH
305 echo "100644 $o0 1 a"
306 echo "100644 $o2 2 a"
307 echo "100644 $o1 3 a"
308 echo "100644 $o0 0 b"
744747ef 309 echo "100644 $o0 0 c"
885b9810
JH
310 echo "100644 $o1 0 d/e"
311 ) >expected &&
3af82863 312 test_cmp expected actual
885b9810
JH
313
314'
315
f2c8c800 316test_expect_success 'fail if the index has unresolved entries' '
446247db
JH
317
318 rm -fr [abcd] &&
319 git checkout -f "$c1" &&
320
321 test_must_fail git merge "$c5" &&
322 test_must_fail git merge "$c5" 2> out &&
f2c8c800 323 test_i18ngrep "not possible because you have unmerged files" out &&
d38a30df
MM
324 git add -u &&
325 test_must_fail git merge "$c5" 2> out &&
f2c8c800 326 test_i18ngrep "You have not concluded your merge" out &&
c8c562a2
CB
327 rm -f .git/MERGE_HEAD &&
328 test_must_fail git merge "$c5" 2> out &&
f2c8c800 329 test_i18ngrep "Your local changes to the following files would be overwritten by merge:" out
446247db
JH
330'
331
885b9810
JH
332test_expect_success 'merge-recursive remove conflict' '
333
744747ef 334 rm -fr [abcd] &&
885b9810
JH
335 git checkout -f "$c1" &&
336
0cb0e143 337 git merge-recursive "$c0" -- "$c1" "$c5"
885b9810
JH
338 status=$?
339 case "$status" in
340 1)
341 : happy
342 ;;
343 *)
344 echo >&2 "why status $status!!!"
345 false
346 ;;
347 esac
348'
349
350test_expect_success 'merge-recursive remove conflict' '
351
352 git ls-files -s >actual &&
353 (
885b9810
JH
354 echo "100644 $o0 1 a"
355 echo "100644 $o1 2 a"
356 echo "100644 $o5 3 a"
744747ef 357 echo "100644 $o0 0 c"
885b9810
JH
358 echo "100644 $o1 0 d/e"
359 ) >expected &&
3af82863 360 test_cmp expected actual
885b9810
JH
361
362'
363
364test_expect_success 'merge-recursive d/f simple' '
744747ef 365 rm -fr [abcd] &&
885b9810
JH
366 git reset --hard &&
367 git checkout -f "$c1" &&
368
0cb0e143 369 git merge-recursive "$c0" -- "$c1" "$c3"
885b9810
JH
370'
371
372test_expect_success 'merge-recursive result' '
373
374 git ls-files -s >actual &&
375 (
885b9810
JH
376 echo "100644 $o1 0 a"
377 echo "100644 $o3 0 b/c"
744747ef 378 echo "100644 $o0 0 c"
885b9810
JH
379 echo "100644 $o1 0 d/e"
380 ) >expected &&
3af82863 381 test_cmp expected actual
885b9810
JH
382
383'
384
385test_expect_success 'merge-recursive d/f conflict' '
386
744747ef 387 rm -fr [abcd] &&
885b9810
JH
388 git reset --hard &&
389 git checkout -f "$c1" &&
390
0cb0e143 391 git merge-recursive "$c0" -- "$c1" "$c4"
885b9810
JH
392 status=$?
393 case "$status" in
394 1)
395 : happy
396 ;;
397 *)
398 echo >&2 "why status $status!!!"
399 false
400 ;;
401 esac
402'
403
404test_expect_success 'merge-recursive d/f conflict result' '
405
406 git ls-files -s >actual &&
407 (
885b9810
JH
408 echo "100644 $o0 1 a"
409 echo "100644 $o1 2 a"
410 echo "100644 $o4 0 a/c"
411 echo "100644 $o0 0 b"
744747ef 412 echo "100644 $o0 0 c"
885b9810
JH
413 echo "100644 $o1 0 d/e"
414 ) >expected &&
3af82863 415 test_cmp expected actual
885b9810
JH
416
417'
418
419test_expect_success 'merge-recursive d/f conflict the other way' '
420
744747ef 421 rm -fr [abcd] &&
885b9810
JH
422 git reset --hard &&
423 git checkout -f "$c4" &&
424
0cb0e143 425 git merge-recursive "$c0" -- "$c4" "$c1"
885b9810
JH
426 status=$?
427 case "$status" in
428 1)
429 : happy
430 ;;
431 *)
432 echo >&2 "why status $status!!!"
433 false
434 ;;
435 esac
436'
437
438test_expect_success 'merge-recursive d/f conflict result the other way' '
439
440 git ls-files -s >actual &&
441 (
885b9810
JH
442 echo "100644 $o0 1 a"
443 echo "100644 $o1 3 a"
444 echo "100644 $o4 0 a/c"
445 echo "100644 $o0 0 b"
744747ef 446 echo "100644 $o0 0 c"
885b9810
JH
447 echo "100644 $o1 0 d/e"
448 ) >expected &&
3af82863 449 test_cmp expected actual
885b9810
JH
450
451'
452
453test_expect_success 'merge-recursive d/f conflict' '
454
744747ef 455 rm -fr [abcd] &&
885b9810
JH
456 git reset --hard &&
457 git checkout -f "$c1" &&
458
0cb0e143 459 git merge-recursive "$c0" -- "$c1" "$c6"
885b9810
JH
460 status=$?
461 case "$status" in
462 1)
463 : happy
464 ;;
465 *)
466 echo >&2 "why status $status!!!"
467 false
468 ;;
469 esac
470'
471
472test_expect_success 'merge-recursive d/f conflict result' '
473
474 git ls-files -s >actual &&
475 (
885b9810
JH
476 echo "100644 $o1 0 a"
477 echo "100644 $o0 0 b"
744747ef 478 echo "100644 $o0 0 c"
885b9810
JH
479 echo "100644 $o6 3 d"
480 echo "100644 $o0 1 d/e"
481 echo "100644 $o1 2 d/e"
482 ) >expected &&
3af82863 483 test_cmp expected actual
885b9810
JH
484
485'
486
487test_expect_success 'merge-recursive d/f conflict' '
488
744747ef 489 rm -fr [abcd] &&
885b9810
JH
490 git reset --hard &&
491 git checkout -f "$c6" &&
492
0cb0e143 493 git merge-recursive "$c0" -- "$c6" "$c1"
885b9810
JH
494 status=$?
495 case "$status" in
496 1)
497 : happy
498 ;;
499 *)
500 echo >&2 "why status $status!!!"
501 false
502 ;;
503 esac
504'
505
506test_expect_success 'merge-recursive d/f conflict result' '
507
508 git ls-files -s >actual &&
509 (
885b9810
JH
510 echo "100644 $o1 0 a"
511 echo "100644 $o0 0 b"
744747ef 512 echo "100644 $o0 0 c"
885b9810
JH
513 echo "100644 $o6 2 d"
514 echo "100644 $o0 1 d/e"
515 echo "100644 $o1 3 d/e"
516 ) >expected &&
3af82863 517 test_cmp expected actual
885b9810
JH
518
519'
520
521test_expect_success 'reset and 3-way merge' '
522
523 git reset --hard "$c2" &&
524 git read-tree -m "$c0" "$c2" "$c1"
525
526'
527
528test_expect_success 'reset and bind merge' '
529
530 git reset --hard master &&
531 git read-tree --prefix=M/ master &&
532 git ls-files -s >actual &&
533 (
885b9810
JH
534 echo "100644 $o1 0 M/a"
535 echo "100644 $o0 0 M/b"
744747ef 536 echo "100644 $o0 0 M/c"
885b9810
JH
537 echo "100644 $o1 0 M/d/e"
538 echo "100644 $o1 0 a"
539 echo "100644 $o0 0 b"
744747ef 540 echo "100644 $o0 0 c"
885b9810
JH
541 echo "100644 $o1 0 d/e"
542 ) >expected &&
3af82863 543 test_cmp expected actual &&
885b9810
JH
544
545 git read-tree --prefix=a1/ master &&
546 git ls-files -s >actual &&
547 (
885b9810
JH
548 echo "100644 $o1 0 M/a"
549 echo "100644 $o0 0 M/b"
744747ef 550 echo "100644 $o0 0 M/c"
885b9810
JH
551 echo "100644 $o1 0 M/d/e"
552 echo "100644 $o1 0 a"
885b9810
JH
553 echo "100644 $o1 0 a1/a"
554 echo "100644 $o0 0 a1/b"
744747ef 555 echo "100644 $o0 0 a1/c"
885b9810
JH
556 echo "100644 $o1 0 a1/d/e"
557 echo "100644 $o0 0 b"
744747ef 558 echo "100644 $o0 0 c"
885b9810
JH
559 echo "100644 $o1 0 d/e"
560 ) >expected &&
a48fcd83 561 test_cmp expected actual &&
885b9810
JH
562
563 git read-tree --prefix=z/ master &&
564 git ls-files -s >actual &&
565 (
885b9810
JH
566 echo "100644 $o1 0 M/a"
567 echo "100644 $o0 0 M/b"
744747ef 568 echo "100644 $o0 0 M/c"
885b9810
JH
569 echo "100644 $o1 0 M/d/e"
570 echo "100644 $o1 0 a"
885b9810
JH
571 echo "100644 $o1 0 a1/a"
572 echo "100644 $o0 0 a1/b"
744747ef 573 echo "100644 $o0 0 a1/c"
885b9810
JH
574 echo "100644 $o1 0 a1/d/e"
575 echo "100644 $o0 0 b"
744747ef 576 echo "100644 $o0 0 c"
885b9810 577 echo "100644 $o1 0 d/e"
885b9810
JH
578 echo "100644 $o1 0 z/a"
579 echo "100644 $o0 0 z/b"
744747ef 580 echo "100644 $o0 0 z/c"
885b9810
JH
581 echo "100644 $o1 0 z/d/e"
582 ) >expected &&
3af82863 583 test_cmp expected actual
885b9810
JH
584
585'
586
41f13af5
AR
587test_expect_success 'merge removes empty directories' '
588
589 git reset --hard master &&
590 git checkout -b rm &&
591 git rm d/e &&
592 git commit -mremoved-d/e &&
593 git checkout master &&
594 git merge -s recursive rm &&
595 test_must_fail test -d d
596'
597
7d82b06d
JS
598test_expect_failure 'merge-recursive simple w/submodule' '
599
600 git checkout submod &&
601 git merge remove
602'
603
604test_expect_failure 'merge-recursive simple w/submodule result' '
605
606 git ls-files -s >actual &&
607 (
608 echo "100644 $o5 0 a"
609 echo "100644 $o0 0 c"
610 echo "160000 $c1 0 d"
611 ) >expected &&
612 test_cmp expected actual
613'
614
d5af5105
SK
615test_expect_success 'merge-recursive copy vs. rename' '
616 git checkout -f copy &&
617 git merge rename &&
618 ( git ls-tree -r HEAD && git ls-files -s ) >actual &&
619 (
620 echo "100644 blob $o0 b"
621 echo "100644 blob $o0 c"
622 echo "100644 blob $o0 d/e"
623 echo "100644 blob $o0 e"
624 echo "100644 $o0 0 b"
625 echo "100644 $o0 0 c"
626 echo "100644 $o0 0 d/e"
627 echo "100644 $o0 0 e"
628 ) >expected &&
629 test_cmp expected actual
630'
631
8a1c0d32
SK
632if test_have_prereq SYMLINKS
633then
814f7d90 634 test_expect_failure 'merge-recursive rename vs. rename/symlink' '
8a1c0d32
SK
635
636 git checkout -f rename &&
637 git merge rename-ln &&
638 ( git ls-tree -r HEAD ; git ls-files -s ) >actual &&
639 (
814f7d90 640 echo "120000 blob $oln a"
8a1c0d32
SK
641 echo "100644 blob $o0 b"
642 echo "100644 blob $o0 c"
643 echo "100644 blob $o0 d/e"
644 echo "100644 blob $o0 e"
814f7d90 645 echo "120000 $oln 0 a"
8a1c0d32
SK
646 echo "100644 $o0 0 b"
647 echo "100644 $o0 0 c"
648 echo "100644 $o0 0 d/e"
649 echo "100644 $o0 0 e"
650 ) >expected &&
651 test_cmp expected actual
652 '
653fi
654
655
885b9810 656test_done