comparison tests/test-merge-tools.t @ 12460:09168638b313

tests: unify test-merge-tools
author Matt Mackall <mpm@selenic.com>
date Sun, 26 Sep 2010 13:43:21 -0500
parents tests/test-merge-tools@4c94b6d0fb1c
children de793925862e
comparison
equal deleted inserted replaced
12459:15f07e8e4742 12460:09168638b313
1 test merge-tools configuration - mostly exercising filemerge.py
2
3 $ unset HGMERGE # make sure HGMERGE doesn't interfere with the test
4 $ hg init
5
6 revision 0
7
8 $ echo "revision 0" > f
9 $ echo "space" >> f
10 $ hg commit -Am "revision 0"
11 adding f
12
13 revision 1
14
15 $ echo "revision 1" > f
16 $ echo "space" >> f
17 $ hg commit -Am "revision 1"
18 $ hg update 0 > /dev/null
19
20 revision 2
21
22 $ echo "revision 2" > f
23 $ echo "space" >> f
24 $ hg commit -Am "revision 2"
25 created new head
26 $ hg update 0 > /dev/null
27
28 revision 3 - simple to merge
29
30 $ echo "revision 3" >> f
31 $ hg commit -Am "revision 3"
32 created new head
33 $ echo "[merge-tools]" > .hg/hgrc
34 $ echo
35
36 $ beforemerge() {
37 > cat .hg/hgrc
38 > echo "# hg update -C 1"
39 > hg update -C 1 > /dev/null
40 > }
41 $ aftermerge() {
42 > echo "# cat f"
43 > cat f
44 > echo "# hg stat"
45 > hg stat
46 > rm -f f.orig
47 > echo
48 > }
49 $ domerge() {
50 > beforemerge
51 > echo "# hg merge $*"
52 > hg merge $*
53 > aftermerge
54 > }
55 $ echo
56
57
58 Tool selection
59
60 $ echo
61
62
63 default is internal merge:
64
65 $ beforemerge
66 [merge-tools]
67 # hg update -C 1
68
69 hg merge -r 2
70 override $PATH to ensure hgmerge not visible; use $PYTHON in case we're
71 running from a devel copy, not a temp installation
72
73 $ PATH="$BINDIR" $PYTHON "$BINDIR"/hg merge -r 2
74 merging f
75 warning: conflicts during merge.
76 merging f failed!
77 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
78 use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
79 [1]
80 $ aftermerge
81 # cat f
82 <<<<<<< local
83 revision 1
84 =======
85 revision 2
86 >>>>>>> other
87 space
88 # hg stat
89 M f
90 ? f.orig
91
92
93 simplest hgrc using false for merge:
94
95 $ echo "false.whatever=" >> .hg/hgrc
96 $ domerge -r 2
97 [merge-tools]
98 false.whatever=
99 # hg update -C 1
100 # hg merge -r 2
101 merging f
102 merging f failed!
103 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
104 use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
105 # cat f
106 revision 1
107 space
108 # hg stat
109 M f
110 ? f.orig
111
112
113 true with higher .priority gets precedence:
114
115 $ echo "true.priority=1" >> .hg/hgrc
116 $ domerge -r 2
117 [merge-tools]
118 false.whatever=
119 true.priority=1
120 # hg update -C 1
121 # hg merge -r 2
122 merging f
123 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
124 (branch merge, don't forget to commit)
125 # cat f
126 revision 1
127 space
128 # hg stat
129 M f
130
131
132 unless lowered on command line:
133
134 $ domerge -r 2 --config merge-tools.true.priority=-7
135 [merge-tools]
136 false.whatever=
137 true.priority=1
138 # hg update -C 1
139 # hg merge -r 2 --config merge-tools.true.priority=-7
140 merging f
141 merging f failed!
142 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
143 use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
144 # cat f
145 revision 1
146 space
147 # hg stat
148 M f
149 ? f.orig
150
151
152 or false set higher on command line:
153
154 $ domerge -r 2 --config merge-tools.false.priority=117
155 [merge-tools]
156 false.whatever=
157 true.priority=1
158 # hg update -C 1
159 # hg merge -r 2 --config merge-tools.false.priority=117
160 merging f
161 merging f failed!
162 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
163 use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
164 # cat f
165 revision 1
166 space
167 # hg stat
168 M f
169 ? f.orig
170
171
172 or true.executable not found in PATH:
173
174 $ domerge -r 2 --config merge-tools.true.executable=nonexistingmergetool
175 [merge-tools]
176 false.whatever=
177 true.priority=1
178 # hg update -C 1
179 # hg merge -r 2 --config merge-tools.true.executable=nonexistingmergetool
180 merging f
181 merging f failed!
182 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
183 use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
184 # cat f
185 revision 1
186 space
187 # hg stat
188 M f
189 ? f.orig
190
191
192 or true.executable with bogus path:
193
194 $ domerge -r 2 --config merge-tools.true.executable=/nonexisting/mergetool
195 [merge-tools]
196 false.whatever=
197 true.priority=1
198 # hg update -C 1
199 # hg merge -r 2 --config merge-tools.true.executable=/nonexisting/mergetool
200 merging f
201 merging f failed!
202 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
203 use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
204 # cat f
205 revision 1
206 space
207 # hg stat
208 M f
209 ? f.orig
210
211
212 but true.executable set to cat found in PATH works:
213
214 $ echo "true.executable=cat" >> .hg/hgrc
215 $ domerge -r 2
216 [merge-tools]
217 false.whatever=
218 true.priority=1
219 true.executable=cat
220 # hg update -C 1
221 # hg merge -r 2
222 revision 1
223 space
224 revision 0
225 space
226 revision 2
227 space
228 merging f
229 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
230 (branch merge, don't forget to commit)
231 # cat f
232 revision 1
233 space
234 # hg stat
235 M f
236
237
238 and true.executable set to cat with path works:
239
240 $ domerge -r 2 --config merge-tools.true.executable=cat
241 [merge-tools]
242 false.whatever=
243 true.priority=1
244 true.executable=cat
245 # hg update -C 1
246 # hg merge -r 2 --config merge-tools.true.executable=cat
247 revision 1
248 space
249 revision 0
250 space
251 revision 2
252 space
253 merging f
254 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
255 (branch merge, don't forget to commit)
256 # cat f
257 revision 1
258 space
259 # hg stat
260 M f
261
262 $ echo
263
264
265 Tool selection and merge-patterns
266
267 $ echo
268
269
270 merge-patterns specifies new tool false:
271
272 $ domerge -r 2 --config merge-patterns.f=false
273 [merge-tools]
274 false.whatever=
275 true.priority=1
276 true.executable=cat
277 # hg update -C 1
278 # hg merge -r 2 --config merge-patterns.f=false
279 merging f
280 merging f failed!
281 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
282 use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
283 # cat f
284 revision 1
285 space
286 # hg stat
287 M f
288 ? f.orig
289
290
291 merge-patterns specifies executable not found in PATH and gets warning:
292
293 $ domerge -r 2 --config merge-patterns.f=true --config merge-tools.true.executable=nonexistingmergetool
294 [merge-tools]
295 false.whatever=
296 true.priority=1
297 true.executable=cat
298 # hg update -C 1
299 # hg merge -r 2 --config merge-patterns.f=true --config merge-tools.true.executable=nonexistingmergetool
300 couldn't find merge tool true specified for f
301 merging f
302 merging f failed!
303 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
304 use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
305 # cat f
306 revision 1
307 space
308 # hg stat
309 M f
310 ? f.orig
311
312
313 merge-patterns specifies executable with bogus path and gets warning:
314
315 $ domerge -r 2 --config merge-patterns.f=true --config merge-tools.true.executable=/nonexisting/mergetool
316 [merge-tools]
317 false.whatever=
318 true.priority=1
319 true.executable=cat
320 # hg update -C 1
321 # hg merge -r 2 --config merge-patterns.f=true --config merge-tools.true.executable=/nonexisting/mergetool
322 couldn't find merge tool true specified for f
323 merging f
324 merging f failed!
325 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
326 use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
327 # cat f
328 revision 1
329 space
330 # hg stat
331 M f
332 ? f.orig
333
334 $ echo
335
336
337 ui.merge overrules priority
338
339 $ echo
340
341
342 ui.merge specifies false:
343
344 $ domerge -r 2 --config ui.merge=false
345 [merge-tools]
346 false.whatever=
347 true.priority=1
348 true.executable=cat
349 # hg update -C 1
350 # hg merge -r 2 --config ui.merge=false
351 merging f
352 merging f failed!
353 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
354 use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
355 # cat f
356 revision 1
357 space
358 # hg stat
359 M f
360 ? f.orig
361
362
363 ui.merge specifies internal:fail:
364
365 $ domerge -r 2 --config ui.merge=internal:fail
366 [merge-tools]
367 false.whatever=
368 true.priority=1
369 true.executable=cat
370 # hg update -C 1
371 # hg merge -r 2 --config ui.merge=internal:fail
372 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
373 use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
374 # cat f
375 revision 1
376 space
377 # hg stat
378 M f
379
380
381 ui.merge specifies internal:local:
382
383 $ domerge -r 2 --config ui.merge=internal:local
384 [merge-tools]
385 false.whatever=
386 true.priority=1
387 true.executable=cat
388 # hg update -C 1
389 # hg merge -r 2 --config ui.merge=internal:local
390 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
391 (branch merge, don't forget to commit)
392 # cat f
393 revision 1
394 space
395 # hg stat
396 M f
397
398
399 ui.merge specifies internal:other:
400
401 $ domerge -r 2 --config ui.merge=internal:other
402 [merge-tools]
403 false.whatever=
404 true.priority=1
405 true.executable=cat
406 # hg update -C 1
407 # hg merge -r 2 --config ui.merge=internal:other
408 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
409 (branch merge, don't forget to commit)
410 # cat f
411 revision 2
412 space
413 # hg stat
414 M f
415
416
417 ui.merge specifies internal:prompt:
418
419 $ domerge -r 2 --config ui.merge=internal:prompt
420 [merge-tools]
421 false.whatever=
422 true.priority=1
423 true.executable=cat
424 # hg update -C 1
425 # hg merge -r 2 --config ui.merge=internal:prompt
426 no tool found to merge f
427 keep (l)ocal or take (o)ther? l
428 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
429 (branch merge, don't forget to commit)
430 # cat f
431 revision 1
432 space
433 # hg stat
434 M f
435
436
437 ui.merge specifies internal:dump:
438
439 $ domerge -r 2 --config ui.merge=internal:dump
440 [merge-tools]
441 false.whatever=
442 true.priority=1
443 true.executable=cat
444 # hg update -C 1
445 # hg merge -r 2 --config ui.merge=internal:dump
446 merging f
447 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
448 use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
449 # cat f
450 revision 1
451 space
452 # hg stat
453 M f
454 ? f.base
455 ? f.local
456 ? f.orig
457 ? f.other
458
459
460 f.base:
461
462 $ cat f.base
463 revision 0
464 space
465
466 f.local:
467
468 $ cat f.local
469 revision 1
470 space
471
472 f.other:
473
474 $ cat f.other
475 revision 2
476 space
477 $ rm f.base f.local f.other
478 $ echo
479
480
481 ui.merge specifies internal:other but is overruled by pattern for false:
482
483 $ domerge -r 2 --config ui.merge=internal:other --config merge-patterns.f=false
484 [merge-tools]
485 false.whatever=
486 true.priority=1
487 true.executable=cat
488 # hg update -C 1
489 # hg merge -r 2 --config ui.merge=internal:other --config merge-patterns.f=false
490 merging f
491 merging f failed!
492 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
493 use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
494 # cat f
495 revision 1
496 space
497 # hg stat
498 M f
499 ? f.orig
500
501 $ echo
502
503
504 Premerge
505
506 $ echo
507
508
509 Default is silent simplemerge:
510
511 $ domerge -r 3
512 [merge-tools]
513 false.whatever=
514 true.priority=1
515 true.executable=cat
516 # hg update -C 1
517 # hg merge -r 3
518 merging f
519 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
520 (branch merge, don't forget to commit)
521 # cat f
522 revision 1
523 space
524 revision 3
525 # hg stat
526 M f
527
528
529 .premerge=True is same:
530
531 $ domerge -r 3 --config merge-tools.true.premerge=True
532 [merge-tools]
533 false.whatever=
534 true.priority=1
535 true.executable=cat
536 # hg update -C 1
537 # hg merge -r 3 --config merge-tools.true.premerge=True
538 merging f
539 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
540 (branch merge, don't forget to commit)
541 # cat f
542 revision 1
543 space
544 revision 3
545 # hg stat
546 M f
547
548
549 .premerge=False executes merge-tool:
550
551 $ domerge -r 3 --config merge-tools.true.premerge=False
552 [merge-tools]
553 false.whatever=
554 true.priority=1
555 true.executable=cat
556 # hg update -C 1
557 # hg merge -r 3 --config merge-tools.true.premerge=False
558 revision 1
559 space
560 revision 0
561 space
562 revision 0
563 space
564 revision 3
565 merging f
566 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
567 (branch merge, don't forget to commit)
568 # cat f
569 revision 1
570 space
571 # hg stat
572 M f
573
574 $ echo
575
576
577 Tool execution
578
579 $ echo
580
581 $ echo '# set tools.args explicit to include $base $local $other $output:' # default '$local $base $other'
582 # set tools.args explicit to include $base $local $other $output:
583 $ beforemerge
584 [merge-tools]
585 false.whatever=
586 true.priority=1
587 true.executable=cat
588 # hg update -C 1
589 $ hg merge -r 2 --config merge-tools.true.executable=head --config merge-tools.true.args='$base $local $other $output' \
590 > | sed 's,==> .* <==,==> ... <==,g'
591 ==> ... <==
592 revision 0
593 space
594
595 ==> ... <==
596 revision 1
597 space
598
599 ==> ... <==
600 revision 2
601 space
602
603 ==> ... <==
604 revision 1
605 space
606 merging f
607 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
608 (branch merge, don't forget to commit)
609 $ aftermerge
610 # cat f
611 revision 1
612 space
613 # hg stat
614 M f
615
616 $ echo '# Merge with "echo mergeresult > $local":'
617 # Merge with "echo mergeresult > $local":
618 $ beforemerge
619 [merge-tools]
620 false.whatever=
621 true.priority=1
622 true.executable=cat
623 # hg update -C 1
624 $ hg merge -r 2 --config merge-tools.true.executable=echo --config merge-tools.true.args='mergeresult > $local'
625 merging f
626 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
627 (branch merge, don't forget to commit)
628 $ aftermerge
629 # cat f
630 mergeresult
631 # hg stat
632 M f
633
634 $ echo '# - and $local is the file f:'
635 # - and $local is the file f:
636 $ beforemerge
637 [merge-tools]
638 false.whatever=
639 true.priority=1
640 true.executable=cat
641 # hg update -C 1
642 $ hg merge -r 2 --config merge-tools.true.executable=echo --config merge-tools.true.args='mergeresult > f'
643 merging f
644 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
645 (branch merge, don't forget to commit)
646 $ aftermerge
647 # cat f
648 mergeresult
649 # hg stat
650 M f
651
652 $ echo '# Merge with "echo mergeresult > $output" - the variable is a bit magic:'
653 # Merge with "echo mergeresult > $output" - the variable is a bit magic:
654 $ beforemerge
655 [merge-tools]
656 false.whatever=
657 true.priority=1
658 true.executable=cat
659 # hg update -C 1
660 $ hg merge -r 2 --config merge-tools.true.executable=echo --config merge-tools.true.args='mergeresult > $output'
661 merging f
662 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
663 (branch merge, don't forget to commit)
664 $ aftermerge
665 # cat f
666 mergeresult
667 # hg stat
668 M f
669
670
671 Merge using tool with a path that must be quoted:
672
673 $ beforemerge
674 [merge-tools]
675 false.whatever=
676 true.priority=1
677 true.executable=cat
678 # hg update -C 1
679 $ cat <<EOF > 'my merge tool'
680 > #!/bin/sh
681 > cat "\$1" "\$2" "\$3" > "\$4"
682 > EOF
683 $ chmod +x 'my merge tool'
684 $ hg merge -r 2 --config merge-tools.true.executable='./my merge tool' --config merge-tools.true.args='$base $local $other $output'
685 merging f
686 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
687 (branch merge, don't forget to commit)
688 $ rm -f 'my merge tool'
689 $ aftermerge
690 # cat f
691 revision 0
692 space
693 revision 1
694 space
695 revision 2
696 space
697 # hg stat
698 M f
699
700 $ echo
701
702
703 Merge post-processing
704
705 $ echo
706
707
708 cat is a bad merge-tool and doesn't change:
709
710 $ domerge -y -r 2 --config merge-tools.true.checkchanged=1
711 [merge-tools]
712 false.whatever=
713 true.priority=1
714 true.executable=cat
715 # hg update -C 1
716 # hg merge -y -r 2 --config merge-tools.true.checkchanged=1
717 revision 1
718 space
719 revision 0
720 space
721 revision 2
722 space
723 merging f
724 output file f appears unchanged
725 was merge successful (yn)? n
726 merging f failed!
727 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
728 use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
729 # cat f
730 revision 1
731 space
732 # hg stat
733 M f
734 ? f.orig
735