Merge branch 'jn/remote-helpers-doc'
[git] / t / t3030-merge-recursive.sh
1 #!/bin/sh
2
3 test_description='merge-recursive backend test'
4
5 . ./test-lib.sh
6
7 test_expect_success 'setup 1' '
8
9         echo hello >a &&
10         o0=$(git hash-object a) &&
11         cp a b &&
12         cp a c &&
13         mkdir d &&
14         cp a d/e &&
15
16         test_tick &&
17         git add a b c d/e &&
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 &&
25         git branch submod &&
26         git branch copy &&
27         git branch rename &&
28         if test_have_prereq SYMLINKS
29         then
30                 git branch rename-ln
31         fi &&
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         (
44                 echo "100644 blob $o1   a"
45                 echo "100644 blob $o0   b"
46                 echo "100644 blob $o0   c"
47                 echo "100644 blob $o1   d/e"
48                 echo "100644 $o1 0      a"
49                 echo "100644 $o0 0      b"
50                 echo "100644 $o0 0      c"
51                 echo "100644 $o1 0      d/e"
52         ) >expected &&
53         test_cmp expected actual
54 '
55
56 test_expect_success 'setup 2' '
57
58         rm -rf [abcd] &&
59         git checkout side &&
60         ( git ls-tree -r HEAD ; git ls-files -s ) >actual &&
61         (
62                 echo "100644 blob $o0   a"
63                 echo "100644 blob $o0   b"
64                 echo "100644 blob $o0   c"
65                 echo "100644 blob $o0   d/e"
66                 echo "100644 $o0 0      a"
67                 echo "100644 $o0 0      b"
68                 echo "100644 $o0 0      c"
69                 echo "100644 $o0 0      d/e"
70         ) >expected &&
71         test_cmp expected actual &&
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         (
83                 echo "100644 blob $o2   a"
84                 echo "100644 blob $o0   b"
85                 echo "100644 blob $o0   c"
86                 echo "100644 blob $o0   d/e"
87                 echo "100644 $o2 0      a"
88                 echo "100644 $o0 0      b"
89                 echo "100644 $o0 0      c"
90                 echo "100644 $o0 0      d/e"
91         ) >expected &&
92         test_cmp expected actual
93 '
94
95 test_expect_success 'setup 3' '
96
97         rm -rf [abcd] &&
98         git checkout df-1 &&
99         ( git ls-tree -r HEAD ; git ls-files -s ) >actual &&
100         (
101                 echo "100644 blob $o0   a"
102                 echo "100644 blob $o0   b"
103                 echo "100644 blob $o0   c"
104                 echo "100644 blob $o0   d/e"
105                 echo "100644 $o0 0      a"
106                 echo "100644 $o0 0      b"
107                 echo "100644 $o0 0      c"
108                 echo "100644 $o0 0      d/e"
109         ) >expected &&
110         test_cmp expected actual &&
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         (
120                 echo "100644 blob $o0   a"
121                 echo "100644 blob $o3   b/c"
122                 echo "100644 blob $o0   c"
123                 echo "100644 blob $o0   d/e"
124                 echo "100644 $o0 0      a"
125                 echo "100644 $o3 0      b/c"
126                 echo "100644 $o0 0      c"
127                 echo "100644 $o0 0      d/e"
128         ) >expected &&
129         test_cmp expected actual
130 '
131
132 test_expect_success 'setup 4' '
133
134         rm -rf [abcd] &&
135         git checkout df-2 &&
136         ( git ls-tree -r HEAD ; git ls-files -s ) >actual &&
137         (
138                 echo "100644 blob $o0   a"
139                 echo "100644 blob $o0   b"
140                 echo "100644 blob $o0   c"
141                 echo "100644 blob $o0   d/e"
142                 echo "100644 $o0 0      a"
143                 echo "100644 $o0 0      b"
144                 echo "100644 $o0 0      c"
145                 echo "100644 $o0 0      d/e"
146         ) >expected &&
147         test_cmp expected actual &&
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         (
157                 echo "100644 blob $o4   a/c"
158                 echo "100644 blob $o0   b"
159                 echo "100644 blob $o0   c"
160                 echo "100644 blob $o0   d/e"
161                 echo "100644 $o4 0      a/c"
162                 echo "100644 $o0 0      b"
163                 echo "100644 $o0 0      c"
164                 echo "100644 $o0 0      d/e"
165         ) >expected &&
166         test_cmp expected actual
167 '
168
169 test_expect_success 'setup 5' '
170
171         rm -rf [abcd] &&
172         git checkout remove &&
173         ( git ls-tree -r HEAD ; git ls-files -s ) >actual &&
174         (
175                 echo "100644 blob $o0   a"
176                 echo "100644 blob $o0   b"
177                 echo "100644 blob $o0   c"
178                 echo "100644 blob $o0   d/e"
179                 echo "100644 $o0 0      a"
180                 echo "100644 $o0 0      b"
181                 echo "100644 $o0 0      c"
182                 echo "100644 $o0 0      d/e"
183         ) >expected &&
184         test_cmp expected actual &&
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         (
198                 echo "100644 blob $o5   a"
199                 echo "100644 blob $o0   c"
200                 echo "100644 blob $o0   d/e"
201                 echo "100644 $o5 0      a"
202                 echo "100644 $o0 0      c"
203                 echo "100644 $o0 0      d/e"
204         ) >expected &&
205         test_cmp expected actual
206
207 '
208
209 test_expect_success 'setup 6' '
210
211         rm -rf [abcd] &&
212         git checkout df-3 &&
213         ( git ls-tree -r HEAD ; git ls-files -s ) >actual &&
214         (
215                 echo "100644 blob $o0   a"
216                 echo "100644 blob $o0   b"
217                 echo "100644 blob $o0   c"
218                 echo "100644 blob $o0   d/e"
219                 echo "100644 $o0 0      a"
220                 echo "100644 $o0 0      b"
221                 echo "100644 $o0 0      c"
222                 echo "100644 $o0 0      d/e"
223         ) >expected &&
224         test_cmp expected actual &&
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         (
234                 echo "100644 blob $o0   a"
235                 echo "100644 blob $o0   b"
236                 echo "100644 blob $o0   c"
237                 echo "100644 blob $o6   d"
238                 echo "100644 $o0 0      a"
239                 echo "100644 $o0 0      b"
240                 echo "100644 $o0 0      c"
241                 echo "100644 $o6 0      d"
242         ) >expected &&
243         test_cmp expected actual
244 '
245
246 test_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
257 test_expect_success 'setup 8' '
258         git checkout rename &&
259         git mv a e &&
260         git add e &&
261         test_tick &&
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 &&
270                 git commit -m "rename a->e, symlink a->e" &&
271                 oln=`printf e | git hash-object --stdin`
272         fi
273 '
274
275 test_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
283 test_expect_success 'merge-recursive simple' '
284
285         rm -fr [abcd] &&
286         git checkout -f "$c2" &&
287
288         git merge-recursive "$c0" -- "$c2" "$c1"
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
301 test_expect_success 'merge-recursive result' '
302
303         git ls-files -s >actual &&
304         (
305                 echo "100644 $o0 1      a"
306                 echo "100644 $o2 2      a"
307                 echo "100644 $o1 3      a"
308                 echo "100644 $o0 0      b"
309                 echo "100644 $o0 0      c"
310                 echo "100644 $o1 0      d/e"
311         ) >expected &&
312         test_cmp expected actual
313
314 '
315
316 test_expect_success 'fail if the index has unresolved entries' '
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 &&
323         test_i18ngrep "not possible because you have unmerged files" out &&
324         git add -u &&
325         test_must_fail git merge "$c5" 2> out &&
326         test_i18ngrep "You have not concluded your merge" out &&
327         rm -f .git/MERGE_HEAD &&
328         test_must_fail git merge "$c5" 2> out &&
329         test_i18ngrep "Your local changes to the following files would be overwritten by merge:" out
330 '
331
332 test_expect_success 'merge-recursive remove conflict' '
333
334         rm -fr [abcd] &&
335         git checkout -f "$c1" &&
336
337         git merge-recursive "$c0" -- "$c1" "$c5"
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
350 test_expect_success 'merge-recursive remove conflict' '
351
352         git ls-files -s >actual &&
353         (
354                 echo "100644 $o0 1      a"
355                 echo "100644 $o1 2      a"
356                 echo "100644 $o5 3      a"
357                 echo "100644 $o0 0      c"
358                 echo "100644 $o1 0      d/e"
359         ) >expected &&
360         test_cmp expected actual
361
362 '
363
364 test_expect_success 'merge-recursive d/f simple' '
365         rm -fr [abcd] &&
366         git reset --hard &&
367         git checkout -f "$c1" &&
368
369         git merge-recursive "$c0" -- "$c1" "$c3"
370 '
371
372 test_expect_success 'merge-recursive result' '
373
374         git ls-files -s >actual &&
375         (
376                 echo "100644 $o1 0      a"
377                 echo "100644 $o3 0      b/c"
378                 echo "100644 $o0 0      c"
379                 echo "100644 $o1 0      d/e"
380         ) >expected &&
381         test_cmp expected actual
382
383 '
384
385 test_expect_success 'merge-recursive d/f conflict' '
386
387         rm -fr [abcd] &&
388         git reset --hard &&
389         git checkout -f "$c1" &&
390
391         git merge-recursive "$c0" -- "$c1" "$c4"
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
404 test_expect_success 'merge-recursive d/f conflict result' '
405
406         git ls-files -s >actual &&
407         (
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"
412                 echo "100644 $o0 0      c"
413                 echo "100644 $o1 0      d/e"
414         ) >expected &&
415         test_cmp expected actual
416
417 '
418
419 test_expect_success 'merge-recursive d/f conflict the other way' '
420
421         rm -fr [abcd] &&
422         git reset --hard &&
423         git checkout -f "$c4" &&
424
425         git merge-recursive "$c0" -- "$c4" "$c1"
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
438 test_expect_success 'merge-recursive d/f conflict result the other way' '
439
440         git ls-files -s >actual &&
441         (
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"
446                 echo "100644 $o0 0      c"
447                 echo "100644 $o1 0      d/e"
448         ) >expected &&
449         test_cmp expected actual
450
451 '
452
453 test_expect_success 'merge-recursive d/f conflict' '
454
455         rm -fr [abcd] &&
456         git reset --hard &&
457         git checkout -f "$c1" &&
458
459         git merge-recursive "$c0" -- "$c1" "$c6"
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
472 test_expect_success 'merge-recursive d/f conflict result' '
473
474         git ls-files -s >actual &&
475         (
476                 echo "100644 $o1 0      a"
477                 echo "100644 $o0 0      b"
478                 echo "100644 $o0 0      c"
479                 echo "100644 $o6 3      d"
480                 echo "100644 $o0 1      d/e"
481                 echo "100644 $o1 2      d/e"
482         ) >expected &&
483         test_cmp expected actual
484
485 '
486
487 test_expect_success 'merge-recursive d/f conflict' '
488
489         rm -fr [abcd] &&
490         git reset --hard &&
491         git checkout -f "$c6" &&
492
493         git merge-recursive "$c0" -- "$c6" "$c1"
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
506 test_expect_success 'merge-recursive d/f conflict result' '
507
508         git ls-files -s >actual &&
509         (
510                 echo "100644 $o1 0      a"
511                 echo "100644 $o0 0      b"
512                 echo "100644 $o0 0      c"
513                 echo "100644 $o6 2      d"
514                 echo "100644 $o0 1      d/e"
515                 echo "100644 $o1 3      d/e"
516         ) >expected &&
517         test_cmp expected actual
518
519 '
520
521 test_expect_success 'reset and 3-way merge' '
522
523         git reset --hard "$c2" &&
524         git read-tree -m "$c0" "$c2" "$c1"
525
526 '
527
528 test_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         (
534                 echo "100644 $o1 0      M/a"
535                 echo "100644 $o0 0      M/b"
536                 echo "100644 $o0 0      M/c"
537                 echo "100644 $o1 0      M/d/e"
538                 echo "100644 $o1 0      a"
539                 echo "100644 $o0 0      b"
540                 echo "100644 $o0 0      c"
541                 echo "100644 $o1 0      d/e"
542         ) >expected &&
543         test_cmp expected actual &&
544
545         git read-tree --prefix=a1/ master &&
546         git ls-files -s >actual &&
547         (
548                 echo "100644 $o1 0      M/a"
549                 echo "100644 $o0 0      M/b"
550                 echo "100644 $o0 0      M/c"
551                 echo "100644 $o1 0      M/d/e"
552                 echo "100644 $o1 0      a"
553                 echo "100644 $o1 0      a1/a"
554                 echo "100644 $o0 0      a1/b"
555                 echo "100644 $o0 0      a1/c"
556                 echo "100644 $o1 0      a1/d/e"
557                 echo "100644 $o0 0      b"
558                 echo "100644 $o0 0      c"
559                 echo "100644 $o1 0      d/e"
560         ) >expected &&
561         test_cmp expected actual &&
562
563         git read-tree --prefix=z/ master &&
564         git ls-files -s >actual &&
565         (
566                 echo "100644 $o1 0      M/a"
567                 echo "100644 $o0 0      M/b"
568                 echo "100644 $o0 0      M/c"
569                 echo "100644 $o1 0      M/d/e"
570                 echo "100644 $o1 0      a"
571                 echo "100644 $o1 0      a1/a"
572                 echo "100644 $o0 0      a1/b"
573                 echo "100644 $o0 0      a1/c"
574                 echo "100644 $o1 0      a1/d/e"
575                 echo "100644 $o0 0      b"
576                 echo "100644 $o0 0      c"
577                 echo "100644 $o1 0      d/e"
578                 echo "100644 $o1 0      z/a"
579                 echo "100644 $o0 0      z/b"
580                 echo "100644 $o0 0      z/c"
581                 echo "100644 $o1 0      z/d/e"
582         ) >expected &&
583         test_cmp expected actual
584
585 '
586
587 test_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
598 test_expect_failure 'merge-recursive simple w/submodule' '
599
600         git checkout submod &&
601         git merge remove
602 '
603
604 test_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
615 test_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
632 if test_have_prereq SYMLINKS
633 then
634         test_expect_failure 'merge-recursive rename vs. rename/symlink' '
635
636                 git checkout -f rename &&
637                 git merge rename-ln &&
638                 ( git ls-tree -r HEAD ; git ls-files -s ) >actual &&
639                 (
640                         echo "120000 blob $oln  a"
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"
645                         echo "120000 $oln 0     a"
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         '
653 fi
654
655
656 test_done