]>
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 && | |
279 | grep "You are in the middle of a conflicted merge" out | |
280 | ||
281 | ' | |
282 | ||
885b9810 JH |
283 | test_expect_success 'merge-recursive remove conflict' ' |
284 | ||
744747ef | 285 | rm -fr [abcd] && |
885b9810 JH |
286 | git checkout -f "$c1" && |
287 | ||
0cb0e143 | 288 | git merge-recursive "$c0" -- "$c1" "$c5" |
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 | ||
301 | test_expect_success 'merge-recursive remove conflict' ' | |
302 | ||
303 | git ls-files -s >actual && | |
304 | ( | |
885b9810 JH |
305 | echo "100644 $o0 1 a" |
306 | echo "100644 $o1 2 a" | |
307 | echo "100644 $o5 3 a" | |
744747ef | 308 | echo "100644 $o0 0 c" |
885b9810 JH |
309 | echo "100644 $o1 0 d/e" |
310 | ) >expected && | |
3af82863 | 311 | test_cmp expected actual |
885b9810 JH |
312 | |
313 | ' | |
314 | ||
315 | test_expect_success 'merge-recursive d/f simple' ' | |
744747ef | 316 | rm -fr [abcd] && |
885b9810 JH |
317 | git reset --hard && |
318 | git checkout -f "$c1" && | |
319 | ||
0cb0e143 | 320 | git merge-recursive "$c0" -- "$c1" "$c3" |
885b9810 JH |
321 | ' |
322 | ||
323 | test_expect_success 'merge-recursive result' ' | |
324 | ||
325 | git ls-files -s >actual && | |
326 | ( | |
885b9810 JH |
327 | echo "100644 $o1 0 a" |
328 | echo "100644 $o3 0 b/c" | |
744747ef | 329 | echo "100644 $o0 0 c" |
885b9810 JH |
330 | echo "100644 $o1 0 d/e" |
331 | ) >expected && | |
3af82863 | 332 | test_cmp expected actual |
885b9810 JH |
333 | |
334 | ' | |
335 | ||
336 | test_expect_success 'merge-recursive d/f conflict' ' | |
337 | ||
744747ef | 338 | rm -fr [abcd] && |
885b9810 JH |
339 | git reset --hard && |
340 | git checkout -f "$c1" && | |
341 | ||
0cb0e143 | 342 | git merge-recursive "$c0" -- "$c1" "$c4" |
885b9810 JH |
343 | status=$? |
344 | case "$status" in | |
345 | 1) | |
346 | : happy | |
347 | ;; | |
348 | *) | |
349 | echo >&2 "why status $status!!!" | |
350 | false | |
351 | ;; | |
352 | esac | |
353 | ' | |
354 | ||
355 | test_expect_success 'merge-recursive d/f conflict result' ' | |
356 | ||
357 | git ls-files -s >actual && | |
358 | ( | |
885b9810 JH |
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" | |
744747ef | 363 | echo "100644 $o0 0 c" |
885b9810 JH |
364 | echo "100644 $o1 0 d/e" |
365 | ) >expected && | |
3af82863 | 366 | test_cmp expected actual |
885b9810 JH |
367 | |
368 | ' | |
369 | ||
370 | test_expect_success 'merge-recursive d/f conflict the other way' ' | |
371 | ||
744747ef | 372 | rm -fr [abcd] && |
885b9810 JH |
373 | git reset --hard && |
374 | git checkout -f "$c4" && | |
375 | ||
0cb0e143 | 376 | git merge-recursive "$c0" -- "$c4" "$c1" |
885b9810 JH |
377 | status=$? |
378 | case "$status" in | |
379 | 1) | |
380 | : happy | |
381 | ;; | |
382 | *) | |
383 | echo >&2 "why status $status!!!" | |
384 | false | |
385 | ;; | |
386 | esac | |
387 | ' | |
388 | ||
389 | test_expect_success 'merge-recursive d/f conflict result the other way' ' | |
390 | ||
391 | git ls-files -s >actual && | |
392 | ( | |
885b9810 JH |
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" | |
744747ef | 397 | echo "100644 $o0 0 c" |
885b9810 JH |
398 | echo "100644 $o1 0 d/e" |
399 | ) >expected && | |
3af82863 | 400 | test_cmp expected actual |
885b9810 JH |
401 | |
402 | ' | |
403 | ||
404 | test_expect_success 'merge-recursive d/f conflict' ' | |
405 | ||
744747ef | 406 | rm -fr [abcd] && |
885b9810 JH |
407 | git reset --hard && |
408 | git checkout -f "$c1" && | |
409 | ||
0cb0e143 | 410 | git merge-recursive "$c0" -- "$c1" "$c6" |
885b9810 JH |
411 | status=$? |
412 | case "$status" in | |
413 | 1) | |
414 | : happy | |
415 | ;; | |
416 | *) | |
417 | echo >&2 "why status $status!!!" | |
418 | false | |
419 | ;; | |
420 | esac | |
421 | ' | |
422 | ||
423 | test_expect_success 'merge-recursive d/f conflict result' ' | |
424 | ||
425 | git ls-files -s >actual && | |
426 | ( | |
885b9810 JH |
427 | echo "100644 $o1 0 a" |
428 | echo "100644 $o0 0 b" | |
744747ef | 429 | echo "100644 $o0 0 c" |
885b9810 JH |
430 | echo "100644 $o6 3 d" |
431 | echo "100644 $o0 1 d/e" | |
432 | echo "100644 $o1 2 d/e" | |
433 | ) >expected && | |
3af82863 | 434 | test_cmp expected actual |
885b9810 JH |
435 | |
436 | ' | |
437 | ||
438 | test_expect_success 'merge-recursive d/f conflict' ' | |
439 | ||
744747ef | 440 | rm -fr [abcd] && |
885b9810 JH |
441 | git reset --hard && |
442 | git checkout -f "$c6" && | |
443 | ||
0cb0e143 | 444 | git merge-recursive "$c0" -- "$c6" "$c1" |
885b9810 JH |
445 | status=$? |
446 | case "$status" in | |
447 | 1) | |
448 | : happy | |
449 | ;; | |
450 | *) | |
451 | echo >&2 "why status $status!!!" | |
452 | false | |
453 | ;; | |
454 | esac | |
455 | ' | |
456 | ||
457 | test_expect_success 'merge-recursive d/f conflict result' ' | |
458 | ||
459 | git ls-files -s >actual && | |
460 | ( | |
885b9810 JH |
461 | echo "100644 $o1 0 a" |
462 | echo "100644 $o0 0 b" | |
744747ef | 463 | echo "100644 $o0 0 c" |
885b9810 JH |
464 | echo "100644 $o6 2 d" |
465 | echo "100644 $o0 1 d/e" | |
466 | echo "100644 $o1 3 d/e" | |
467 | ) >expected && | |
3af82863 | 468 | test_cmp expected actual |
885b9810 JH |
469 | |
470 | ' | |
471 | ||
472 | test_expect_success 'reset and 3-way merge' ' | |
473 | ||
474 | git reset --hard "$c2" && | |
475 | git read-tree -m "$c0" "$c2" "$c1" | |
476 | ||
477 | ' | |
478 | ||
479 | test_expect_success 'reset and bind merge' ' | |
480 | ||
481 | git reset --hard master && | |
482 | git read-tree --prefix=M/ master && | |
483 | git ls-files -s >actual && | |
484 | ( | |
885b9810 JH |
485 | echo "100644 $o1 0 M/a" |
486 | echo "100644 $o0 0 M/b" | |
744747ef | 487 | echo "100644 $o0 0 M/c" |
885b9810 JH |
488 | echo "100644 $o1 0 M/d/e" |
489 | echo "100644 $o1 0 a" | |
490 | echo "100644 $o0 0 b" | |
744747ef | 491 | echo "100644 $o0 0 c" |
885b9810 JH |
492 | echo "100644 $o1 0 d/e" |
493 | ) >expected && | |
3af82863 | 494 | test_cmp expected actual && |
885b9810 JH |
495 | |
496 | git read-tree --prefix=a1/ master && | |
497 | git ls-files -s >actual && | |
498 | ( | |
885b9810 JH |
499 | echo "100644 $o1 0 M/a" |
500 | echo "100644 $o0 0 M/b" | |
744747ef | 501 | echo "100644 $o0 0 M/c" |
885b9810 JH |
502 | echo "100644 $o1 0 M/d/e" |
503 | echo "100644 $o1 0 a" | |
885b9810 JH |
504 | echo "100644 $o1 0 a1/a" |
505 | echo "100644 $o0 0 a1/b" | |
744747ef | 506 | echo "100644 $o0 0 a1/c" |
885b9810 JH |
507 | echo "100644 $o1 0 a1/d/e" |
508 | echo "100644 $o0 0 b" | |
744747ef | 509 | echo "100644 $o0 0 c" |
885b9810 JH |
510 | echo "100644 $o1 0 d/e" |
511 | ) >expected && | |
3af82863 | 512 | test_cmp expected actual |
885b9810 JH |
513 | |
514 | git read-tree --prefix=z/ master && | |
515 | git ls-files -s >actual && | |
516 | ( | |
885b9810 JH |
517 | echo "100644 $o1 0 M/a" |
518 | echo "100644 $o0 0 M/b" | |
744747ef | 519 | echo "100644 $o0 0 M/c" |
885b9810 JH |
520 | echo "100644 $o1 0 M/d/e" |
521 | echo "100644 $o1 0 a" | |
885b9810 JH |
522 | echo "100644 $o1 0 a1/a" |
523 | echo "100644 $o0 0 a1/b" | |
744747ef | 524 | echo "100644 $o0 0 a1/c" |
885b9810 JH |
525 | echo "100644 $o1 0 a1/d/e" |
526 | echo "100644 $o0 0 b" | |
744747ef | 527 | echo "100644 $o0 0 c" |
885b9810 | 528 | echo "100644 $o1 0 d/e" |
885b9810 JH |
529 | echo "100644 $o1 0 z/a" |
530 | echo "100644 $o0 0 z/b" | |
744747ef | 531 | echo "100644 $o0 0 z/c" |
885b9810 JH |
532 | echo "100644 $o1 0 z/d/e" |
533 | ) >expected && | |
3af82863 | 534 | test_cmp expected actual |
885b9810 JH |
535 | |
536 | ' | |
537 | ||
41f13af5 AR |
538 | test_expect_success 'merge removes empty directories' ' |
539 | ||
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 | |
547 | ' | |
548 | ||
885b9810 | 549 | test_done |