Implement the patience diff algorithm
[git/platforms.git] / t / t3030-merge-recursive.sh
blob0de613dc53d85c01f6d122834e094503a2736507
1 #!/bin/sh
3 test_description='merge-recursive backend test'
5 . ./test-lib.sh
7 test_expect_success 'setup 1' '
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 &&
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 &&
26 echo hello >>a &&
27 cp a d/e &&
28 o1=$(git hash-object a) &&
30 git add a d/e &&
32 test_tick &&
33 git commit -m "master modifies a and d/e" &&
34 c1=$(git rev-parse --verify HEAD) &&
35 ( git ls-tree -r HEAD ; git ls-files -s ) >actual &&
37 echo "100644 blob $o1 a"
38 echo "100644 blob $o0 b"
39 echo "100644 blob $o0 c"
40 echo "100644 blob $o1 d/e"
41 echo "100644 $o1 0 a"
42 echo "100644 $o0 0 b"
43 echo "100644 $o0 0 c"
44 echo "100644 $o1 0 d/e"
45 ) >expected &&
46 test_cmp expected actual
49 test_expect_success 'setup 2' '
51 rm -rf [abcd] &&
52 git checkout side &&
53 ( git ls-tree -r HEAD ; git ls-files -s ) >actual &&
55 echo "100644 blob $o0 a"
56 echo "100644 blob $o0 b"
57 echo "100644 blob $o0 c"
58 echo "100644 blob $o0 d/e"
59 echo "100644 $o0 0 a"
60 echo "100644 $o0 0 b"
61 echo "100644 $o0 0 c"
62 echo "100644 $o0 0 d/e"
63 ) >expected &&
64 test_cmp expected actual &&
66 echo goodbye >>a &&
67 o2=$(git hash-object a) &&
69 git add a &&
71 test_tick &&
72 git commit -m "side modifies a" &&
73 c2=$(git rev-parse --verify HEAD) &&
74 ( git ls-tree -r HEAD ; git ls-files -s ) >actual &&
76 echo "100644 blob $o2 a"
77 echo "100644 blob $o0 b"
78 echo "100644 blob $o0 c"
79 echo "100644 blob $o0 d/e"
80 echo "100644 $o2 0 a"
81 echo "100644 $o0 0 b"
82 echo "100644 $o0 0 c"
83 echo "100644 $o0 0 d/e"
84 ) >expected &&
85 test_cmp expected actual
88 test_expect_success 'setup 3' '
90 rm -rf [abcd] &&
91 git checkout df-1 &&
92 ( git ls-tree -r HEAD ; git ls-files -s ) >actual &&
94 echo "100644 blob $o0 a"
95 echo "100644 blob $o0 b"
96 echo "100644 blob $o0 c"
97 echo "100644 blob $o0 d/e"
98 echo "100644 $o0 0 a"
99 echo "100644 $o0 0 b"
100 echo "100644 $o0 0 c"
101 echo "100644 $o0 0 d/e"
102 ) >expected &&
103 test_cmp expected actual &&
105 rm -f b && mkdir b && echo df-1 >b/c && git add b/c &&
106 o3=$(git hash-object b/c) &&
108 test_tick &&
109 git commit -m "df-1 makes b/c" &&
110 c3=$(git rev-parse --verify HEAD) &&
111 ( git ls-tree -r HEAD ; git ls-files -s ) >actual &&
113 echo "100644 blob $o0 a"
114 echo "100644 blob $o3 b/c"
115 echo "100644 blob $o0 c"
116 echo "100644 blob $o0 d/e"
117 echo "100644 $o0 0 a"
118 echo "100644 $o3 0 b/c"
119 echo "100644 $o0 0 c"
120 echo "100644 $o0 0 d/e"
121 ) >expected &&
122 test_cmp expected actual
125 test_expect_success 'setup 4' '
127 rm -rf [abcd] &&
128 git checkout df-2 &&
129 ( git ls-tree -r HEAD ; git ls-files -s ) >actual &&
131 echo "100644 blob $o0 a"
132 echo "100644 blob $o0 b"
133 echo "100644 blob $o0 c"
134 echo "100644 blob $o0 d/e"
135 echo "100644 $o0 0 a"
136 echo "100644 $o0 0 b"
137 echo "100644 $o0 0 c"
138 echo "100644 $o0 0 d/e"
139 ) >expected &&
140 test_cmp expected actual &&
142 rm -f a && mkdir a && echo df-2 >a/c && git add a/c &&
143 o4=$(git hash-object a/c) &&
145 test_tick &&
146 git commit -m "df-2 makes a/c" &&
147 c4=$(git rev-parse --verify HEAD) &&
148 ( git ls-tree -r HEAD ; git ls-files -s ) >actual &&
150 echo "100644 blob $o4 a/c"
151 echo "100644 blob $o0 b"
152 echo "100644 blob $o0 c"
153 echo "100644 blob $o0 d/e"
154 echo "100644 $o4 0 a/c"
155 echo "100644 $o0 0 b"
156 echo "100644 $o0 0 c"
157 echo "100644 $o0 0 d/e"
158 ) >expected &&
159 test_cmp expected actual
162 test_expect_success 'setup 5' '
164 rm -rf [abcd] &&
165 git checkout remove &&
166 ( git ls-tree -r HEAD ; git ls-files -s ) >actual &&
168 echo "100644 blob $o0 a"
169 echo "100644 blob $o0 b"
170 echo "100644 blob $o0 c"
171 echo "100644 blob $o0 d/e"
172 echo "100644 $o0 0 a"
173 echo "100644 $o0 0 b"
174 echo "100644 $o0 0 c"
175 echo "100644 $o0 0 d/e"
176 ) >expected &&
177 test_cmp expected actual &&
179 rm -f b &&
180 echo remove-conflict >a &&
182 git add a &&
183 git rm b &&
184 o5=$(git hash-object a) &&
186 test_tick &&
187 git commit -m "remove removes b and modifies a" &&
188 c5=$(git rev-parse --verify HEAD) &&
189 ( git ls-tree -r HEAD ; git ls-files -s ) >actual &&
191 echo "100644 blob $o5 a"
192 echo "100644 blob $o0 c"
193 echo "100644 blob $o0 d/e"
194 echo "100644 $o5 0 a"
195 echo "100644 $o0 0 c"
196 echo "100644 $o0 0 d/e"
197 ) >expected &&
198 test_cmp expected actual
202 test_expect_success 'setup 6' '
204 rm -rf [abcd] &&
205 git checkout df-3 &&
206 ( git ls-tree -r HEAD ; git ls-files -s ) >actual &&
208 echo "100644 blob $o0 a"
209 echo "100644 blob $o0 b"
210 echo "100644 blob $o0 c"
211 echo "100644 blob $o0 d/e"
212 echo "100644 $o0 0 a"
213 echo "100644 $o0 0 b"
214 echo "100644 $o0 0 c"
215 echo "100644 $o0 0 d/e"
216 ) >expected &&
217 test_cmp expected actual &&
219 rm -fr d && echo df-3 >d && git add d &&
220 o6=$(git hash-object d) &&
222 test_tick &&
223 git commit -m "df-3 makes d" &&
224 c6=$(git rev-parse --verify HEAD) &&
225 ( git ls-tree -r HEAD ; git ls-files -s ) >actual &&
227 echo "100644 blob $o0 a"
228 echo "100644 blob $o0 b"
229 echo "100644 blob $o0 c"
230 echo "100644 blob $o6 d"
231 echo "100644 $o0 0 a"
232 echo "100644 $o0 0 b"
233 echo "100644 $o0 0 c"
234 echo "100644 $o6 0 d"
235 ) >expected &&
236 test_cmp expected actual
239 test_expect_success 'merge-recursive simple' '
241 rm -fr [abcd] &&
242 git checkout -f "$c2" &&
244 git merge-recursive "$c0" -- "$c2" "$c1"
245 status=$?
246 case "$status" in
248 : happy
251 echo >&2 "why status $status!!!"
252 false
254 esac
257 test_expect_success 'merge-recursive result' '
259 git ls-files -s >actual &&
261 echo "100644 $o0 1 a"
262 echo "100644 $o2 2 a"
263 echo "100644 $o1 3 a"
264 echo "100644 $o0 0 b"
265 echo "100644 $o0 0 c"
266 echo "100644 $o1 0 d/e"
267 ) >expected &&
268 test_cmp expected actual
272 test_expect_success 'fail if the index has unresolved entries' '
274 rm -fr [abcd] &&
275 git checkout -f "$c1" &&
277 test_must_fail git merge "$c5" &&
278 test_must_fail git merge "$c5" 2> out &&
279 grep "You are in the middle of a conflicted merge" out
283 test_expect_success 'merge-recursive remove conflict' '
285 rm -fr [abcd] &&
286 git checkout -f "$c1" &&
288 git merge-recursive "$c0" -- "$c1" "$c5"
289 status=$?
290 case "$status" in
292 : happy
295 echo >&2 "why status $status!!!"
296 false
298 esac
301 test_expect_success 'merge-recursive remove conflict' '
303 git ls-files -s >actual &&
305 echo "100644 $o0 1 a"
306 echo "100644 $o1 2 a"
307 echo "100644 $o5 3 a"
308 echo "100644 $o0 0 c"
309 echo "100644 $o1 0 d/e"
310 ) >expected &&
311 test_cmp expected actual
315 test_expect_success 'merge-recursive d/f simple' '
316 rm -fr [abcd] &&
317 git reset --hard &&
318 git checkout -f "$c1" &&
320 git merge-recursive "$c0" -- "$c1" "$c3"
323 test_expect_success 'merge-recursive result' '
325 git ls-files -s >actual &&
327 echo "100644 $o1 0 a"
328 echo "100644 $o3 0 b/c"
329 echo "100644 $o0 0 c"
330 echo "100644 $o1 0 d/e"
331 ) >expected &&
332 test_cmp expected actual
336 test_expect_success 'merge-recursive d/f conflict' '
338 rm -fr [abcd] &&
339 git reset --hard &&
340 git checkout -f "$c1" &&
342 git merge-recursive "$c0" -- "$c1" "$c4"
343 status=$?
344 case "$status" in
346 : happy
349 echo >&2 "why status $status!!!"
350 false
352 esac
355 test_expect_success 'merge-recursive d/f conflict result' '
357 git ls-files -s >actual &&
359 echo "100644 $o0 1 a"
360 echo "100644 $o1 2 a"
361 echo "100644 $o4 0 a/c"
362 echo "100644 $o0 0 b"
363 echo "100644 $o0 0 c"
364 echo "100644 $o1 0 d/e"
365 ) >expected &&
366 test_cmp expected actual
370 test_expect_success 'merge-recursive d/f conflict the other way' '
372 rm -fr [abcd] &&
373 git reset --hard &&
374 git checkout -f "$c4" &&
376 git merge-recursive "$c0" -- "$c4" "$c1"
377 status=$?
378 case "$status" in
380 : happy
383 echo >&2 "why status $status!!!"
384 false
386 esac
389 test_expect_success 'merge-recursive d/f conflict result the other way' '
391 git ls-files -s >actual &&
393 echo "100644 $o0 1 a"
394 echo "100644 $o1 3 a"
395 echo "100644 $o4 0 a/c"
396 echo "100644 $o0 0 b"
397 echo "100644 $o0 0 c"
398 echo "100644 $o1 0 d/e"
399 ) >expected &&
400 test_cmp expected actual
404 test_expect_success 'merge-recursive d/f conflict' '
406 rm -fr [abcd] &&
407 git reset --hard &&
408 git checkout -f "$c1" &&
410 git merge-recursive "$c0" -- "$c1" "$c6"
411 status=$?
412 case "$status" in
414 : happy
417 echo >&2 "why status $status!!!"
418 false
420 esac
423 test_expect_success 'merge-recursive d/f conflict result' '
425 git ls-files -s >actual &&
427 echo "100644 $o1 0 a"
428 echo "100644 $o0 0 b"
429 echo "100644 $o0 0 c"
430 echo "100644 $o6 3 d"
431 echo "100644 $o0 1 d/e"
432 echo "100644 $o1 2 d/e"
433 ) >expected &&
434 test_cmp expected actual
438 test_expect_success 'merge-recursive d/f conflict' '
440 rm -fr [abcd] &&
441 git reset --hard &&
442 git checkout -f "$c6" &&
444 git merge-recursive "$c0" -- "$c6" "$c1"
445 status=$?
446 case "$status" in
448 : happy
451 echo >&2 "why status $status!!!"
452 false
454 esac
457 test_expect_success 'merge-recursive d/f conflict result' '
459 git ls-files -s >actual &&
461 echo "100644 $o1 0 a"
462 echo "100644 $o0 0 b"
463 echo "100644 $o0 0 c"
464 echo "100644 $o6 2 d"
465 echo "100644 $o0 1 d/e"
466 echo "100644 $o1 3 d/e"
467 ) >expected &&
468 test_cmp expected actual
472 test_expect_success 'reset and 3-way merge' '
474 git reset --hard "$c2" &&
475 git read-tree -m "$c0" "$c2" "$c1"
479 test_expect_success 'reset and bind merge' '
481 git reset --hard master &&
482 git read-tree --prefix=M/ master &&
483 git ls-files -s >actual &&
485 echo "100644 $o1 0 M/a"
486 echo "100644 $o0 0 M/b"
487 echo "100644 $o0 0 M/c"
488 echo "100644 $o1 0 M/d/e"
489 echo "100644 $o1 0 a"
490 echo "100644 $o0 0 b"
491 echo "100644 $o0 0 c"
492 echo "100644 $o1 0 d/e"
493 ) >expected &&
494 test_cmp expected actual &&
496 git read-tree --prefix=a1/ master &&
497 git ls-files -s >actual &&
499 echo "100644 $o1 0 M/a"
500 echo "100644 $o0 0 M/b"
501 echo "100644 $o0 0 M/c"
502 echo "100644 $o1 0 M/d/e"
503 echo "100644 $o1 0 a"
504 echo "100644 $o1 0 a1/a"
505 echo "100644 $o0 0 a1/b"
506 echo "100644 $o0 0 a1/c"
507 echo "100644 $o1 0 a1/d/e"
508 echo "100644 $o0 0 b"
509 echo "100644 $o0 0 c"
510 echo "100644 $o1 0 d/e"
511 ) >expected &&
512 test_cmp expected actual
514 git read-tree --prefix=z/ master &&
515 git ls-files -s >actual &&
517 echo "100644 $o1 0 M/a"
518 echo "100644 $o0 0 M/b"
519 echo "100644 $o0 0 M/c"
520 echo "100644 $o1 0 M/d/e"
521 echo "100644 $o1 0 a"
522 echo "100644 $o1 0 a1/a"
523 echo "100644 $o0 0 a1/b"
524 echo "100644 $o0 0 a1/c"
525 echo "100644 $o1 0 a1/d/e"
526 echo "100644 $o0 0 b"
527 echo "100644 $o0 0 c"
528 echo "100644 $o1 0 d/e"
529 echo "100644 $o1 0 z/a"
530 echo "100644 $o0 0 z/b"
531 echo "100644 $o0 0 z/c"
532 echo "100644 $o1 0 z/d/e"
533 ) >expected &&
534 test_cmp expected actual
538 test_expect_success 'merge removes empty directories' '
540 git reset --hard master &&
541 git checkout -b rm &&
542 git rm d/e &&
543 git commit -mremoved-d/e &&
544 git checkout master &&
545 git merge -s recursive rm &&
546 test_must_fail test -d d
549 test_done