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