3 test_description='merge-recursive backend test'
7 test_expect_success 'setup 1' '
10 o0=$(git hash-object a) &&
18 git commit -m initial &&
19 c0=$(git rev-parse --verify HEAD) &&
28 if test_have_prereq SYMLINKS
35 o1=$(git hash-object a) &&
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 &&
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"
51 echo "100644 $o1 0 d/e"
53 test_cmp expected actual
56 test_expect_success 'setup 2' '
60 ( git ls-tree -r HEAD ; git ls-files -s ) >actual &&
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"
69 echo "100644 $o0 0 d/e"
71 test_cmp expected actual &&
74 o2=$(git hash-object a) &&
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 &&
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"
90 echo "100644 $o0 0 d/e"
92 test_cmp expected actual
95 test_expect_success 'setup 3' '
99 ( git ls-tree -r HEAD ; git ls-files -s ) >actual &&
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"
110 test_cmp expected actual &&
112 rm -f b && mkdir b && echo df-1 >b/c && git add b/c &&
113 o3=$(git hash-object b/c) &&
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 &&
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"
129 test_cmp expected actual
132 test_expect_success 'setup 4' '
136 ( git ls-tree -r HEAD ; git ls-files -s ) >actual &&
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"
147 test_cmp expected actual &&
149 rm -f a && mkdir a && echo df-2 >a/c && git add a/c &&
150 o4=$(git hash-object a/c) &&
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 &&
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"
166 test_cmp expected actual
169 test_expect_success 'setup 5' '
172 git checkout remove &&
173 ( git ls-tree -r HEAD ; git ls-files -s ) >actual &&
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"
184 test_cmp expected actual &&
187 echo remove-conflict >a &&
191 o5=$(git hash-object a) &&
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 &&
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"
205 test_cmp expected actual
209 test_expect_success 'setup 6' '
213 ( git ls-tree -r HEAD ; git ls-files -s ) >actual &&
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"
224 test_cmp expected actual &&
226 rm -fr d && echo df-3 >d && git add d &&
227 o6=$(git hash-object d) &&
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 &&
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"
243 test_cmp expected actual
246 test_expect_success 'setup 7' '
248 git checkout submod &&
251 git commit -m "remove d/e" &&
252 git update-index --add --cacheinfo 160000 $c1 d &&
254 git commit -m "make d/ a submodule"
257 test_expect_success 'setup 8' '
258 git checkout rename &&
262 git commit -m "rename a->e" &&
263 if test_have_prereq SYMLINKS
265 git checkout rename-ln &&
270 git commit -m "rename a->e, symlink a->e"
274 test_expect_success 'setup 9' '
279 git commit -m "copy a->e"
282 test_expect_success 'merge-recursive simple' '
285 git checkout -f "$c2" &&
287 git merge-recursive "$c0" -- "$c2" "$c1"
294 echo >&2 "why status $status!!!"
300 test_expect_success 'merge-recursive result' '
302 git ls-files -s >actual &&
304 echo "100644 $o0 1 a"
305 echo "100644 $o2 2 a"
306 echo "100644 $o1 3 a"
307 echo "100644 $o0 0 b"
308 echo "100644 $o0 0 c"
309 echo "100644 $o1 0 d/e"
311 test_cmp expected actual
315 test_expect_success 'fail if the index has unresolved entries' '
318 git checkout -f "$c1" &&
320 test_must_fail git merge "$c5" &&
321 test_must_fail git merge "$c5" 2> out &&
322 grep "not possible because you have unmerged files" out &&
324 test_must_fail git merge "$c5" 2> out &&
325 grep "You have not concluded your merge" out &&
326 rm -f .git/MERGE_HEAD &&
327 test_must_fail git merge "$c5" 2> out &&
328 grep "Your local changes to the following files would be overwritten by merge:" out
331 test_expect_success 'merge-recursive remove conflict' '
334 git checkout -f "$c1" &&
336 git merge-recursive "$c0" -- "$c1" "$c5"
343 echo >&2 "why status $status!!!"
349 test_expect_success 'merge-recursive remove conflict' '
351 git ls-files -s >actual &&
353 echo "100644 $o0 1 a"
354 echo "100644 $o1 2 a"
355 echo "100644 $o5 3 a"
356 echo "100644 $o0 0 c"
357 echo "100644 $o1 0 d/e"
359 test_cmp expected actual
363 test_expect_success 'merge-recursive d/f simple' '
366 git checkout -f "$c1" &&
368 git merge-recursive "$c0" -- "$c1" "$c3"
371 test_expect_success 'merge-recursive result' '
373 git ls-files -s >actual &&
375 echo "100644 $o1 0 a"
376 echo "100644 $o3 0 b/c"
377 echo "100644 $o0 0 c"
378 echo "100644 $o1 0 d/e"
380 test_cmp expected actual
384 test_expect_success 'merge-recursive d/f conflict' '
388 git checkout -f "$c1" &&
390 git merge-recursive "$c0" -- "$c1" "$c4"
397 echo >&2 "why status $status!!!"
403 test_expect_success 'merge-recursive d/f conflict result' '
405 git ls-files -s >actual &&
407 echo "100644 $o0 1 a"
408 echo "100644 $o1 2 a"
409 echo "100644 $o4 0 a/c"
410 echo "100644 $o0 0 b"
411 echo "100644 $o0 0 c"
412 echo "100644 $o1 0 d/e"
414 test_cmp expected actual
418 test_expect_success 'merge-recursive d/f conflict the other way' '
422 git checkout -f "$c4" &&
424 git merge-recursive "$c0" -- "$c4" "$c1"
431 echo >&2 "why status $status!!!"
437 test_expect_success 'merge-recursive d/f conflict result the other way' '
439 git ls-files -s >actual &&
441 echo "100644 $o0 1 a"
442 echo "100644 $o1 3 a"
443 echo "100644 $o4 0 a/c"
444 echo "100644 $o0 0 b"
445 echo "100644 $o0 0 c"
446 echo "100644 $o1 0 d/e"
448 test_cmp expected actual
452 test_expect_success 'merge-recursive d/f conflict' '
456 git checkout -f "$c1" &&
458 git merge-recursive "$c0" -- "$c1" "$c6"
465 echo >&2 "why status $status!!!"
471 test_expect_success 'merge-recursive d/f conflict result' '
473 git ls-files -s >actual &&
475 echo "100644 $o1 0 a"
476 echo "100644 $o0 0 b"
477 echo "100644 $o0 0 c"
478 echo "100644 $o6 3 d"
479 echo "100644 $o0 1 d/e"
480 echo "100644 $o1 2 d/e"
482 test_cmp expected actual
486 test_expect_success 'merge-recursive d/f conflict' '
490 git checkout -f "$c6" &&
492 git merge-recursive "$c0" -- "$c6" "$c1"
499 echo >&2 "why status $status!!!"
505 test_expect_success 'merge-recursive d/f conflict result' '
507 git ls-files -s >actual &&
509 echo "100644 $o1 0 a"
510 echo "100644 $o0 0 b"
511 echo "100644 $o0 0 c"
512 echo "100644 $o6 2 d"
513 echo "100644 $o0 1 d/e"
514 echo "100644 $o1 3 d/e"
516 test_cmp expected actual
520 test_expect_success 'reset and 3-way merge' '
522 git reset --hard "$c2" &&
523 git read-tree -m "$c0" "$c2" "$c1"
527 test_expect_success 'reset and bind merge' '
529 git reset --hard master &&
530 git read-tree --prefix=M/ master &&
531 git ls-files -s >actual &&
533 echo "100644 $o1 0 M/a"
534 echo "100644 $o0 0 M/b"
535 echo "100644 $o0 0 M/c"
536 echo "100644 $o1 0 M/d/e"
537 echo "100644 $o1 0 a"
538 echo "100644 $o0 0 b"
539 echo "100644 $o0 0 c"
540 echo "100644 $o1 0 d/e"
542 test_cmp expected actual &&
544 git read-tree --prefix=a1/ master &&
545 git ls-files -s >actual &&
547 echo "100644 $o1 0 M/a"
548 echo "100644 $o0 0 M/b"
549 echo "100644 $o0 0 M/c"
550 echo "100644 $o1 0 M/d/e"
551 echo "100644 $o1 0 a"
552 echo "100644 $o1 0 a1/a"
553 echo "100644 $o0 0 a1/b"
554 echo "100644 $o0 0 a1/c"
555 echo "100644 $o1 0 a1/d/e"
556 echo "100644 $o0 0 b"
557 echo "100644 $o0 0 c"
558 echo "100644 $o1 0 d/e"
560 test_cmp expected actual &&
562 git read-tree --prefix=z/ master &&
563 git ls-files -s >actual &&
565 echo "100644 $o1 0 M/a"
566 echo "100644 $o0 0 M/b"
567 echo "100644 $o0 0 M/c"
568 echo "100644 $o1 0 M/d/e"
569 echo "100644 $o1 0 a"
570 echo "100644 $o1 0 a1/a"
571 echo "100644 $o0 0 a1/b"
572 echo "100644 $o0 0 a1/c"
573 echo "100644 $o1 0 a1/d/e"
574 echo "100644 $o0 0 b"
575 echo "100644 $o0 0 c"
576 echo "100644 $o1 0 d/e"
577 echo "100644 $o1 0 z/a"
578 echo "100644 $o0 0 z/b"
579 echo "100644 $o0 0 z/c"
580 echo "100644 $o1 0 z/d/e"
582 test_cmp expected actual
586 test_expect_success 'merge removes empty directories' '
588 git reset --hard master &&
589 git checkout -b rm &&
591 git commit -mremoved-d/e &&
592 git checkout master &&
593 git merge -s recursive rm &&
594 test_must_fail test -d d
597 test_expect_failure 'merge-recursive simple w/submodule' '
599 git checkout submod &&
603 test_expect_failure 'merge-recursive simple w/submodule result' '
605 git ls-files -s >actual &&
607 echo "100644 $o5 0 a"
608 echo "100644 $o0 0 c"
609 echo "160000 $c1 0 d"
611 test_cmp expected actual
614 test_expect_success 'merge-recursive copy vs. rename' '
615 git checkout -f copy &&
617 ( git ls-tree -r HEAD && git ls-files -s ) >actual &&
619 echo "100644 blob $o0 b"
620 echo "100644 blob $o0 c"
621 echo "100644 blob $o0 d/e"
622 echo "100644 blob $o0 e"
623 echo "100644 $o0 0 b"
624 echo "100644 $o0 0 c"
625 echo "100644 $o0 0 d/e"
626 echo "100644 $o0 0 e"
628 test_cmp expected actual
631 if test_have_prereq SYMLINKS
633 test_expect_success 'merge-recursive rename vs. rename/symlink' '
635 git checkout -f rename &&
636 git merge rename-ln &&
637 ( git ls-tree -r HEAD ; git ls-files -s ) >actual &&
639 echo "100644 blob $o0 b"
640 echo "100644 blob $o0 c"
641 echo "100644 blob $o0 d/e"
642 echo "100644 blob $o0 e"
643 echo "100644 $o0 0 b"
644 echo "100644 $o0 0 c"
645 echo "100644 $o0 0 d/e"
646 echo "100644 $o0 0 e"
648 test_cmp expected actual