]>
Commit | Line | Data |
---|---|---|
885b9810 JH |
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 && | |
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 && | |
25 | ||
26 | echo hello >>a && | |
27 | cp a d/e && | |
28 | o1=$(git hash-object a) && | |
29 | ||
30 | git add a d/e && | |
31 | ||
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 && | |
36 | ( | |
885b9810 JH |
37 | echo "100644 blob $o1 a" |
38 | echo "100644 blob $o0 b" | |
744747ef | 39 | echo "100644 blob $o0 c" |
885b9810 | 40 | echo "100644 blob $o1 d/e" |
885b9810 JH |
41 | echo "100644 $o1 0 a" |
42 | echo "100644 $o0 0 b" | |
744747ef | 43 | echo "100644 $o0 0 c" |
885b9810 JH |
44 | echo "100644 $o1 0 d/e" |
45 | ) >expected && | |
3af82863 | 46 | test_cmp expected actual |
885b9810 JH |
47 | ' |
48 | ||
49 | test_expect_success 'setup 2' ' | |
50 | ||
744747ef | 51 | rm -rf [abcd] && |
885b9810 JH |
52 | git checkout side && |
53 | ( git ls-tree -r HEAD ; git ls-files -s ) >actual && | |
54 | ( | |
885b9810 JH |
55 | echo "100644 blob $o0 a" |
56 | echo "100644 blob $o0 b" | |
744747ef | 57 | echo "100644 blob $o0 c" |
885b9810 | 58 | echo "100644 blob $o0 d/e" |
885b9810 JH |
59 | echo "100644 $o0 0 a" |
60 | echo "100644 $o0 0 b" | |
744747ef | 61 | echo "100644 $o0 0 c" |
885b9810 JH |
62 | echo "100644 $o0 0 d/e" |
63 | ) >expected && | |
3af82863 | 64 | test_cmp expected actual && |
885b9810 JH |
65 | |
66 | echo goodbye >>a && | |
67 | o2=$(git hash-object a) && | |
68 | ||
69 | git add a && | |
70 | ||
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 && | |
75 | ( | |
885b9810 JH |
76 | echo "100644 blob $o2 a" |
77 | echo "100644 blob $o0 b" | |
744747ef | 78 | echo "100644 blob $o0 c" |
885b9810 | 79 | echo "100644 blob $o0 d/e" |
885b9810 JH |
80 | echo "100644 $o2 0 a" |
81 | echo "100644 $o0 0 b" | |
744747ef | 82 | echo "100644 $o0 0 c" |
885b9810 JH |
83 | echo "100644 $o0 0 d/e" |
84 | ) >expected && | |
3af82863 | 85 | test_cmp expected actual |
885b9810 JH |
86 | ' |
87 | ||
88 | test_expect_success 'setup 3' ' | |
89 | ||
744747ef | 90 | rm -rf [abcd] && |
885b9810 JH |
91 | git checkout df-1 && |
92 | ( git ls-tree -r HEAD ; git ls-files -s ) >actual && | |
93 | ( | |
885b9810 JH |
94 | echo "100644 blob $o0 a" |
95 | echo "100644 blob $o0 b" | |
744747ef | 96 | echo "100644 blob $o0 c" |
885b9810 | 97 | echo "100644 blob $o0 d/e" |
885b9810 JH |
98 | echo "100644 $o0 0 a" |
99 | echo "100644 $o0 0 b" | |
744747ef | 100 | echo "100644 $o0 0 c" |
885b9810 JH |
101 | echo "100644 $o0 0 d/e" |
102 | ) >expected && | |
3af82863 | 103 | test_cmp expected actual && |
885b9810 JH |
104 | |
105 | rm -f b && mkdir b && echo df-1 >b/c && git add b/c && | |
106 | o3=$(git hash-object b/c) && | |
107 | ||
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 && | |
112 | ( | |
885b9810 JH |
113 | echo "100644 blob $o0 a" |
114 | echo "100644 blob $o3 b/c" | |
744747ef | 115 | echo "100644 blob $o0 c" |
885b9810 | 116 | echo "100644 blob $o0 d/e" |
885b9810 JH |
117 | echo "100644 $o0 0 a" |
118 | echo "100644 $o3 0 b/c" | |
744747ef | 119 | echo "100644 $o0 0 c" |
885b9810 JH |
120 | echo "100644 $o0 0 d/e" |
121 | ) >expected && | |
3af82863 | 122 | test_cmp expected actual |
885b9810 JH |
123 | ' |
124 | ||
125 | test_expect_success 'setup 4' ' | |
126 | ||
744747ef | 127 | rm -rf [abcd] && |
885b9810 JH |
128 | git checkout df-2 && |
129 | ( git ls-tree -r HEAD ; git ls-files -s ) >actual && | |
130 | ( | |
885b9810 JH |
131 | echo "100644 blob $o0 a" |
132 | echo "100644 blob $o0 b" | |
744747ef | 133 | echo "100644 blob $o0 c" |
885b9810 | 134 | echo "100644 blob $o0 d/e" |
885b9810 JH |
135 | echo "100644 $o0 0 a" |
136 | echo "100644 $o0 0 b" | |
744747ef | 137 | echo "100644 $o0 0 c" |
885b9810 JH |
138 | echo "100644 $o0 0 d/e" |
139 | ) >expected && | |
3af82863 | 140 | test_cmp expected actual && |
885b9810 JH |
141 | |
142 | rm -f a && mkdir a && echo df-2 >a/c && git add a/c && | |
143 | o4=$(git hash-object a/c) && | |
144 | ||
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 && | |
149 | ( | |
885b9810 JH |
150 | echo "100644 blob $o4 a/c" |
151 | echo "100644 blob $o0 b" | |
744747ef | 152 | echo "100644 blob $o0 c" |
885b9810 | 153 | echo "100644 blob $o0 d/e" |
885b9810 JH |
154 | echo "100644 $o4 0 a/c" |
155 | echo "100644 $o0 0 b" | |
744747ef | 156 | echo "100644 $o0 0 c" |
885b9810 JH |
157 | echo "100644 $o0 0 d/e" |
158 | ) >expected && | |
3af82863 | 159 | test_cmp expected actual |
885b9810 JH |
160 | ' |
161 | ||
162 | test_expect_success 'setup 5' ' | |
163 | ||
744747ef | 164 | rm -rf [abcd] && |
885b9810 JH |
165 | git checkout remove && |
166 | ( git ls-tree -r HEAD ; git ls-files -s ) >actual && | |
167 | ( | |
885b9810 JH |
168 | echo "100644 blob $o0 a" |
169 | echo "100644 blob $o0 b" | |
744747ef | 170 | echo "100644 blob $o0 c" |
885b9810 | 171 | echo "100644 blob $o0 d/e" |
885b9810 JH |
172 | echo "100644 $o0 0 a" |
173 | echo "100644 $o0 0 b" | |
744747ef | 174 | echo "100644 $o0 0 c" |
885b9810 JH |
175 | echo "100644 $o0 0 d/e" |
176 | ) >expected && | |
3af82863 | 177 | test_cmp expected actual && |
885b9810 JH |
178 | |
179 | rm -f b && | |
180 | echo remove-conflict >a && | |
181 | ||
182 | git add a && | |
183 | git rm b && | |
184 | o5=$(git hash-object a) && | |
185 | ||
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 && | |
190 | ( | |
885b9810 | 191 | echo "100644 blob $o5 a" |
744747ef | 192 | echo "100644 blob $o0 c" |
885b9810 | 193 | echo "100644 blob $o0 d/e" |
885b9810 | 194 | echo "100644 $o5 0 a" |
744747ef | 195 | echo "100644 $o0 0 c" |
885b9810 JH |
196 | echo "100644 $o0 0 d/e" |
197 | ) >expected && | |
3af82863 | 198 | test_cmp expected actual |
885b9810 JH |
199 | |
200 | ' | |
201 | ||
202 | test_expect_success 'setup 6' ' | |
203 | ||
744747ef | 204 | rm -rf [abcd] && |
885b9810 JH |
205 | git checkout df-3 && |
206 | ( git ls-tree -r HEAD ; git ls-files -s ) >actual && | |
207 | ( | |
885b9810 JH |
208 | echo "100644 blob $o0 a" |
209 | echo "100644 blob $o0 b" | |
744747ef | 210 | echo "100644 blob $o0 c" |
885b9810 | 211 | echo "100644 blob $o0 d/e" |
885b9810 JH |
212 | echo "100644 $o0 0 a" |
213 | echo "100644 $o0 0 b" | |
744747ef | 214 | echo "100644 $o0 0 c" |
885b9810 JH |
215 | echo "100644 $o0 0 d/e" |
216 | ) >expected && | |
3af82863 | 217 | test_cmp expected actual && |
885b9810 JH |
218 | |
219 | rm -fr d && echo df-3 >d && git add d && | |
220 | o6=$(git hash-object d) && | |
221 | ||
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 && | |
226 | ( | |
885b9810 JH |
227 | echo "100644 blob $o0 a" |
228 | echo "100644 blob $o0 b" | |
744747ef | 229 | echo "100644 blob $o0 c" |
885b9810 | 230 | echo "100644 blob $o6 d" |
885b9810 JH |
231 | echo "100644 $o0 0 a" |
232 | echo "100644 $o0 0 b" | |
744747ef | 233 | echo "100644 $o0 0 c" |
885b9810 JH |
234 | echo "100644 $o6 0 d" |
235 | ) >expected && | |
3af82863 | 236 | test_cmp expected actual |
885b9810 JH |
237 | ' |
238 | ||
239 | test_expect_success 'merge-recursive simple' ' | |
240 | ||
744747ef | 241 | rm -fr [abcd] && |
885b9810 JH |
242 | git checkout -f "$c2" && |
243 | ||
0cb0e143 | 244 | git merge-recursive "$c0" -- "$c2" "$c1" |
885b9810 JH |
245 | status=$? |
246 | case "$status" in | |
247 | 1) | |
248 | : happy | |
249 | ;; | |
250 | *) | |
251 | echo >&2 "why status $status!!!" | |
252 | false | |
253 | ;; | |
254 | esac | |
255 | ' | |
256 | ||
257 | test_expect_success 'merge-recursive result' ' | |
258 | ||
259 | git ls-files -s >actual && | |
260 | ( | |
885b9810 JH |
261 | echo "100644 $o0 1 a" |
262 | echo "100644 $o2 2 a" | |
263 | echo "100644 $o1 3 a" | |
264 | echo "100644 $o0 0 b" | |
744747ef | 265 | echo "100644 $o0 0 c" |
885b9810 JH |
266 | echo "100644 $o1 0 d/e" |
267 | ) >expected && | |
3af82863 | 268 | test_cmp expected actual |
885b9810 JH |
269 | |
270 | ' | |
271 | ||
446247db JH |
272 | test_expect_success 'fail if the index has unresolved entries' ' |
273 | ||
274 | rm -fr [abcd] && | |
275 | git checkout -f "$c1" && | |
276 | ||
277 | test_must_fail git merge "$c5" && | |
278 | test_must_fail git merge "$c5" 2> out && | |
d38a30df MM |
279 | grep "not possible because you have unmerged files" out && |
280 | git add -u && | |
281 | test_must_fail git merge "$c5" 2> out && | |
c8c562a2 CB |
282 | grep "You have not concluded your merge" out && |
283 | rm -f .git/MERGE_HEAD && | |
284 | test_must_fail git merge "$c5" 2> out && | |
d38a30df | 285 | grep "Your local changes to .* would be overwritten by merge." out |
446247db JH |
286 | ' |
287 | ||
885b9810 JH |
288 | test_expect_success 'merge-recursive remove conflict' ' |
289 | ||
744747ef | 290 | rm -fr [abcd] && |
885b9810 JH |
291 | git checkout -f "$c1" && |
292 | ||
0cb0e143 | 293 | git merge-recursive "$c0" -- "$c1" "$c5" |
885b9810 JH |
294 | status=$? |
295 | case "$status" in | |
296 | 1) | |
297 | : happy | |
298 | ;; | |
299 | *) | |
300 | echo >&2 "why status $status!!!" | |
301 | false | |
302 | ;; | |
303 | esac | |
304 | ' | |
305 | ||
306 | test_expect_success 'merge-recursive remove conflict' ' | |
307 | ||
308 | git ls-files -s >actual && | |
309 | ( | |
885b9810 JH |
310 | echo "100644 $o0 1 a" |
311 | echo "100644 $o1 2 a" | |
312 | echo "100644 $o5 3 a" | |
744747ef | 313 | echo "100644 $o0 0 c" |
885b9810 JH |
314 | echo "100644 $o1 0 d/e" |
315 | ) >expected && | |
3af82863 | 316 | test_cmp expected actual |
885b9810 JH |
317 | |
318 | ' | |
319 | ||
320 | test_expect_success 'merge-recursive d/f simple' ' | |
744747ef | 321 | rm -fr [abcd] && |
885b9810 JH |
322 | git reset --hard && |
323 | git checkout -f "$c1" && | |
324 | ||
0cb0e143 | 325 | git merge-recursive "$c0" -- "$c1" "$c3" |
885b9810 JH |
326 | ' |
327 | ||
328 | test_expect_success 'merge-recursive result' ' | |
329 | ||
330 | git ls-files -s >actual && | |
331 | ( | |
885b9810 JH |
332 | echo "100644 $o1 0 a" |
333 | echo "100644 $o3 0 b/c" | |
744747ef | 334 | echo "100644 $o0 0 c" |
885b9810 JH |
335 | echo "100644 $o1 0 d/e" |
336 | ) >expected && | |
3af82863 | 337 | test_cmp expected actual |
885b9810 JH |
338 | |
339 | ' | |
340 | ||
341 | test_expect_success 'merge-recursive d/f conflict' ' | |
342 | ||
744747ef | 343 | rm -fr [abcd] && |
885b9810 JH |
344 | git reset --hard && |
345 | git checkout -f "$c1" && | |
346 | ||
0cb0e143 | 347 | git merge-recursive "$c0" -- "$c1" "$c4" |
885b9810 JH |
348 | status=$? |
349 | case "$status" in | |
350 | 1) | |
351 | : happy | |
352 | ;; | |
353 | *) | |
354 | echo >&2 "why status $status!!!" | |
355 | false | |
356 | ;; | |
357 | esac | |
358 | ' | |
359 | ||
360 | test_expect_success 'merge-recursive d/f conflict result' ' | |
361 | ||
362 | git ls-files -s >actual && | |
363 | ( | |
885b9810 JH |
364 | echo "100644 $o0 1 a" |
365 | echo "100644 $o1 2 a" | |
366 | echo "100644 $o4 0 a/c" | |
367 | echo "100644 $o0 0 b" | |
744747ef | 368 | echo "100644 $o0 0 c" |
885b9810 JH |
369 | echo "100644 $o1 0 d/e" |
370 | ) >expected && | |
3af82863 | 371 | test_cmp expected actual |
885b9810 JH |
372 | |
373 | ' | |
374 | ||
375 | test_expect_success 'merge-recursive d/f conflict the other way' ' | |
376 | ||
744747ef | 377 | rm -fr [abcd] && |
885b9810 JH |
378 | git reset --hard && |
379 | git checkout -f "$c4" && | |
380 | ||
0cb0e143 | 381 | git merge-recursive "$c0" -- "$c4" "$c1" |
885b9810 JH |
382 | status=$? |
383 | case "$status" in | |
384 | 1) | |
385 | : happy | |
386 | ;; | |
387 | *) | |
388 | echo >&2 "why status $status!!!" | |
389 | false | |
390 | ;; | |
391 | esac | |
392 | ' | |
393 | ||
394 | test_expect_success 'merge-recursive d/f conflict result the other way' ' | |
395 | ||
396 | git ls-files -s >actual && | |
397 | ( | |
885b9810 JH |
398 | echo "100644 $o0 1 a" |
399 | echo "100644 $o1 3 a" | |
400 | echo "100644 $o4 0 a/c" | |
401 | echo "100644 $o0 0 b" | |
744747ef | 402 | echo "100644 $o0 0 c" |
885b9810 JH |
403 | echo "100644 $o1 0 d/e" |
404 | ) >expected && | |
3af82863 | 405 | test_cmp expected actual |
885b9810 JH |
406 | |
407 | ' | |
408 | ||
409 | test_expect_success 'merge-recursive d/f conflict' ' | |
410 | ||
744747ef | 411 | rm -fr [abcd] && |
885b9810 JH |
412 | git reset --hard && |
413 | git checkout -f "$c1" && | |
414 | ||
0cb0e143 | 415 | git merge-recursive "$c0" -- "$c1" "$c6" |
885b9810 JH |
416 | status=$? |
417 | case "$status" in | |
418 | 1) | |
419 | : happy | |
420 | ;; | |
421 | *) | |
422 | echo >&2 "why status $status!!!" | |
423 | false | |
424 | ;; | |
425 | esac | |
426 | ' | |
427 | ||
428 | test_expect_success 'merge-recursive d/f conflict result' ' | |
429 | ||
430 | git ls-files -s >actual && | |
431 | ( | |
885b9810 JH |
432 | echo "100644 $o1 0 a" |
433 | echo "100644 $o0 0 b" | |
744747ef | 434 | echo "100644 $o0 0 c" |
885b9810 JH |
435 | echo "100644 $o6 3 d" |
436 | echo "100644 $o0 1 d/e" | |
437 | echo "100644 $o1 2 d/e" | |
438 | ) >expected && | |
3af82863 | 439 | test_cmp expected actual |
885b9810 JH |
440 | |
441 | ' | |
442 | ||
443 | test_expect_success 'merge-recursive d/f conflict' ' | |
444 | ||
744747ef | 445 | rm -fr [abcd] && |
885b9810 JH |
446 | git reset --hard && |
447 | git checkout -f "$c6" && | |
448 | ||
0cb0e143 | 449 | git merge-recursive "$c0" -- "$c6" "$c1" |
885b9810 JH |
450 | status=$? |
451 | case "$status" in | |
452 | 1) | |
453 | : happy | |
454 | ;; | |
455 | *) | |
456 | echo >&2 "why status $status!!!" | |
457 | false | |
458 | ;; | |
459 | esac | |
460 | ' | |
461 | ||
462 | test_expect_success 'merge-recursive d/f conflict result' ' | |
463 | ||
464 | git ls-files -s >actual && | |
465 | ( | |
885b9810 JH |
466 | echo "100644 $o1 0 a" |
467 | echo "100644 $o0 0 b" | |
744747ef | 468 | echo "100644 $o0 0 c" |
885b9810 JH |
469 | echo "100644 $o6 2 d" |
470 | echo "100644 $o0 1 d/e" | |
471 | echo "100644 $o1 3 d/e" | |
472 | ) >expected && | |
3af82863 | 473 | test_cmp expected actual |
885b9810 JH |
474 | |
475 | ' | |
476 | ||
477 | test_expect_success 'reset and 3-way merge' ' | |
478 | ||
479 | git reset --hard "$c2" && | |
480 | git read-tree -m "$c0" "$c2" "$c1" | |
481 | ||
482 | ' | |
483 | ||
484 | test_expect_success 'reset and bind merge' ' | |
485 | ||
486 | git reset --hard master && | |
487 | git read-tree --prefix=M/ master && | |
488 | git ls-files -s >actual && | |
489 | ( | |
885b9810 JH |
490 | echo "100644 $o1 0 M/a" |
491 | echo "100644 $o0 0 M/b" | |
744747ef | 492 | echo "100644 $o0 0 M/c" |
885b9810 JH |
493 | echo "100644 $o1 0 M/d/e" |
494 | echo "100644 $o1 0 a" | |
495 | echo "100644 $o0 0 b" | |
744747ef | 496 | echo "100644 $o0 0 c" |
885b9810 JH |
497 | echo "100644 $o1 0 d/e" |
498 | ) >expected && | |
3af82863 | 499 | test_cmp expected actual && |
885b9810 JH |
500 | |
501 | git read-tree --prefix=a1/ master && | |
502 | git ls-files -s >actual && | |
503 | ( | |
885b9810 JH |
504 | echo "100644 $o1 0 M/a" |
505 | echo "100644 $o0 0 M/b" | |
744747ef | 506 | echo "100644 $o0 0 M/c" |
885b9810 JH |
507 | echo "100644 $o1 0 M/d/e" |
508 | echo "100644 $o1 0 a" | |
885b9810 JH |
509 | echo "100644 $o1 0 a1/a" |
510 | echo "100644 $o0 0 a1/b" | |
744747ef | 511 | echo "100644 $o0 0 a1/c" |
885b9810 JH |
512 | echo "100644 $o1 0 a1/d/e" |
513 | echo "100644 $o0 0 b" | |
744747ef | 514 | echo "100644 $o0 0 c" |
885b9810 JH |
515 | echo "100644 $o1 0 d/e" |
516 | ) >expected && | |
3af82863 | 517 | test_cmp expected actual |
885b9810 JH |
518 | |
519 | git read-tree --prefix=z/ master && | |
520 | git ls-files -s >actual && | |
521 | ( | |
885b9810 JH |
522 | echo "100644 $o1 0 M/a" |
523 | echo "100644 $o0 0 M/b" | |
744747ef | 524 | echo "100644 $o0 0 M/c" |
885b9810 JH |
525 | echo "100644 $o1 0 M/d/e" |
526 | echo "100644 $o1 0 a" | |
885b9810 JH |
527 | echo "100644 $o1 0 a1/a" |
528 | echo "100644 $o0 0 a1/b" | |
744747ef | 529 | echo "100644 $o0 0 a1/c" |
885b9810 JH |
530 | echo "100644 $o1 0 a1/d/e" |
531 | echo "100644 $o0 0 b" | |
744747ef | 532 | echo "100644 $o0 0 c" |
885b9810 | 533 | echo "100644 $o1 0 d/e" |
885b9810 JH |
534 | echo "100644 $o1 0 z/a" |
535 | echo "100644 $o0 0 z/b" | |
744747ef | 536 | echo "100644 $o0 0 z/c" |
885b9810 JH |
537 | echo "100644 $o1 0 z/d/e" |
538 | ) >expected && | |
3af82863 | 539 | test_cmp expected actual |
885b9810 JH |
540 | |
541 | ' | |
542 | ||
41f13af5 AR |
543 | test_expect_success 'merge removes empty directories' ' |
544 | ||
545 | git reset --hard master && | |
546 | git checkout -b rm && | |
547 | git rm d/e && | |
548 | git commit -mremoved-d/e && | |
549 | git checkout master && | |
550 | git merge -s recursive rm && | |
551 | test_must_fail test -d d | |
552 | ' | |
553 | ||
885b9810 | 554 | test_done |