# HG changeset patch # User Matt Mackall # Date 1285526601 18000 # Node ID 09168638b313d483df7ae0ab63cd60ddea3c49d4 # Parent 15f07e8e47429fa72b4ab4ffa680807589111e2a tests: unify test-merge-tools diff -r 15f07e8e4742 -r 09168638b313 tests/test-merge-tools --- a/tests/test-merge-tools Sun Sep 26 13:43:21 2010 -0500 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,197 +0,0 @@ -#!/bin/sh - -# test merge-tools configuration - mostly exercising filemerge.py - -unset HGMERGE # make sure HGMERGE doesn't interfere with the test - -hg init - -echo "# revision 0" -echo "revision 0" > f -echo "space" >> f -hg commit -Am "revision 0" - -echo "# revision 1" -echo "revision 1" > f -echo "space" >> f -hg commit -Am "revision 1" - -hg update 0 > /dev/null -echo "# revision 2" -echo "revision 2" > f -echo "space" >> f -hg commit -Am "revision 2" - -hg update 0 > /dev/null -echo "# revision 3 - simple to merge" -echo "revision 3" >> f -hg commit -Am "revision 3" - - -echo "[merge-tools]" > .hg/hgrc -echo - -beforemerge() { - cat .hg/hgrc - echo "# hg update -C 1" - hg update -C 1 > /dev/null -} - -aftermerge() { - echo "# cat f" - cat f - echo "# hg stat" - hg stat - rm -f f.orig - echo -} - -domerge() { - beforemerge - echo "# hg merge $*" - hg merge $* - aftermerge -} - -echo -echo Tool selection -echo - -echo "# default is internal merge:" -beforemerge -echo "# hg merge -r 2" -# override $PATH to ensure hgmerge not visible; use $PYTHON in case we're -# running from a devel copy, not a temp installation -PATH="$BINDIR" $PYTHON "$BINDIR"/hg merge -r 2 -aftermerge - -echo "# simplest hgrc using false for merge:" -echo "false.whatever=" >> .hg/hgrc -domerge -r 2 - -echo "# true with higher .priority gets precedence:" -echo "true.priority=1" >> .hg/hgrc -domerge -r 2 - -echo "# unless lowered on command line:" -domerge -r 2 --config merge-tools.true.priority=-7 - -echo "# or false set higher on command line:" -domerge -r 2 --config merge-tools.false.priority=117 - -echo "# or true.executable not found in PATH:" -domerge -r 2 --config merge-tools.true.executable=nonexistingmergetool - -echo "# or true.executable with bogus path:" -domerge -r 2 --config merge-tools.true.executable=/nonexisting/mergetool - -echo "# but true.executable set to cat found in PATH works:" -echo "true.executable=cat" >> .hg/hgrc -domerge -r 2 - -echo "# and true.executable set to cat with path works:" -domerge -r 2 --config merge-tools.true.executable=cat - -echo -echo Tool selection and merge-patterns -echo - -echo "# merge-patterns specifies new tool false:" -domerge -r 2 --config merge-patterns.f=false - -echo "# merge-patterns specifies executable not found in PATH and gets warning:" -domerge -r 2 --config merge-patterns.f=true --config merge-tools.true.executable=nonexistingmergetool - -echo "# merge-patterns specifies executable with bogus path and gets warning:" -domerge -r 2 --config merge-patterns.f=true --config merge-tools.true.executable=/nonexisting/mergetool - -echo -echo ui.merge overrules priority -echo - -echo "# ui.merge specifies false:" -domerge -r 2 --config ui.merge=false - -echo "# ui.merge specifies internal:fail:" -domerge -r 2 --config ui.merge=internal:fail - -echo "# ui.merge specifies internal:local:" -domerge -r 2 --config ui.merge=internal:local - -echo "# ui.merge specifies internal:other:" -domerge -r 2 --config ui.merge=internal:other - -echo "# ui.merge specifies internal:prompt:" -domerge -r 2 --config ui.merge=internal:prompt - -echo "# ui.merge specifies internal:dump:" -domerge -r 2 --config ui.merge=internal:dump -echo f.base: -cat f.base -echo f.local: -cat f.local -echo f.other: -cat f.other -rm f.base f.local f.other -echo - -echo "# ui.merge specifies internal:other but is overruled by pattern for false:" -domerge -r 2 --config ui.merge=internal:other --config merge-patterns.f=false - -echo -echo Premerge -echo - -echo "# Default is silent simplemerge:" -domerge -r 3 - -echo "# .premerge=True is same:" -domerge -r 3 --config merge-tools.true.premerge=True - -echo "# .premerge=False executes merge-tool:" -domerge -r 3 --config merge-tools.true.premerge=False - - -echo -echo Tool execution -echo - -echo '# set tools.args explicit to include $base $local $other $output:' # default '$local $base $other' -beforemerge -hg merge -r 2 --config merge-tools.true.executable=head --config merge-tools.true.args='$base $local $other $output' \ - | sed 's,==> .* <==,==> ... <==,g' -aftermerge - -echo '# Merge with "echo mergeresult > $local":' -beforemerge -hg merge -r 2 --config merge-tools.true.executable=echo --config merge-tools.true.args='mergeresult > $local' -aftermerge - -echo '# - and $local is the file f:' -beforemerge -hg merge -r 2 --config merge-tools.true.executable=echo --config merge-tools.true.args='mergeresult > f' -aftermerge - -echo '# Merge with "echo mergeresult > $output" - the variable is a bit magic:' -beforemerge -hg merge -r 2 --config merge-tools.true.executable=echo --config merge-tools.true.args='mergeresult > $output' -aftermerge - -echo '# Merge using tool with a path that must be quoted:' -beforemerge -cat < 'my merge tool' -#!/bin/sh -cat "\$1" "\$2" "\$3" > "\$4" -EOF -chmod +x 'my merge tool' -hg merge -r 2 --config merge-tools.true.executable='./my merge tool' --config merge-tools.true.args='$base $local $other $output' -rm -f 'my merge tool' -aftermerge - - -echo -echo Merge post-processing -echo - -echo "# cat is a bad merge-tool and doesn't change:" -domerge -y -r 2 --config merge-tools.true.checkchanged=1 diff -r 15f07e8e4742 -r 09168638b313 tests/test-merge-tools.out --- a/tests/test-merge-tools.out Sun Sep 26 13:43:21 2010 -0500 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,547 +0,0 @@ -# revision 0 -adding f -# revision 1 -# revision 2 -created new head -# revision 3 - simple to merge -created new head - - -Tool selection - -# default is internal merge: -[merge-tools] -# hg update -C 1 -# hg merge -r 2 -merging f -warning: conflicts during merge. -merging f failed! -0 files updated, 0 files merged, 0 files removed, 1 files unresolved -use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon -# cat f -<<<<<<< local -revision 1 -======= -revision 2 ->>>>>>> other -space -# hg stat -M f -? f.orig - -# simplest hgrc using false for merge: -[merge-tools] -false.whatever= -# hg update -C 1 -# hg merge -r 2 -merging f -merging f failed! -0 files updated, 0 files merged, 0 files removed, 1 files unresolved -use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon -# cat f -revision 1 -space -# hg stat -M f -? f.orig - -# true with higher .priority gets precedence: -[merge-tools] -false.whatever= -true.priority=1 -# hg update -C 1 -# hg merge -r 2 -merging f -0 files updated, 1 files merged, 0 files removed, 0 files unresolved -(branch merge, don't forget to commit) -# cat f -revision 1 -space -# hg stat -M f - -# unless lowered on command line: -[merge-tools] -false.whatever= -true.priority=1 -# hg update -C 1 -# hg merge -r 2 --config merge-tools.true.priority=-7 -merging f -merging f failed! -0 files updated, 0 files merged, 0 files removed, 1 files unresolved -use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon -# cat f -revision 1 -space -# hg stat -M f -? f.orig - -# or false set higher on command line: -[merge-tools] -false.whatever= -true.priority=1 -# hg update -C 1 -# hg merge -r 2 --config merge-tools.false.priority=117 -merging f -merging f failed! -0 files updated, 0 files merged, 0 files removed, 1 files unresolved -use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon -# cat f -revision 1 -space -# hg stat -M f -? f.orig - -# or true.executable not found in PATH: -[merge-tools] -false.whatever= -true.priority=1 -# hg update -C 1 -# hg merge -r 2 --config merge-tools.true.executable=nonexistingmergetool -merging f -merging f failed! -0 files updated, 0 files merged, 0 files removed, 1 files unresolved -use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon -# cat f -revision 1 -space -# hg stat -M f -? f.orig - -# or true.executable with bogus path: -[merge-tools] -false.whatever= -true.priority=1 -# hg update -C 1 -# hg merge -r 2 --config merge-tools.true.executable=/nonexisting/mergetool -merging f -merging f failed! -0 files updated, 0 files merged, 0 files removed, 1 files unresolved -use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon -# cat f -revision 1 -space -# hg stat -M f -? f.orig - -# but true.executable set to cat found in PATH works: -[merge-tools] -false.whatever= -true.priority=1 -true.executable=cat -# hg update -C 1 -# hg merge -r 2 -revision 1 -space -revision 0 -space -revision 2 -space -merging f -0 files updated, 1 files merged, 0 files removed, 0 files unresolved -(branch merge, don't forget to commit) -# cat f -revision 1 -space -# hg stat -M f - -# and true.executable set to cat with path works: -[merge-tools] -false.whatever= -true.priority=1 -true.executable=cat -# hg update -C 1 -# hg merge -r 2 --config merge-tools.true.executable=cat -revision 1 -space -revision 0 -space -revision 2 -space -merging f -0 files updated, 1 files merged, 0 files removed, 0 files unresolved -(branch merge, don't forget to commit) -# cat f -revision 1 -space -# hg stat -M f - - -Tool selection and merge-patterns - -# merge-patterns specifies new tool false: -[merge-tools] -false.whatever= -true.priority=1 -true.executable=cat -# hg update -C 1 -# hg merge -r 2 --config merge-patterns.f=false -merging f -merging f failed! -0 files updated, 0 files merged, 0 files removed, 1 files unresolved -use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon -# cat f -revision 1 -space -# hg stat -M f -? f.orig - -# merge-patterns specifies executable not found in PATH and gets warning: -[merge-tools] -false.whatever= -true.priority=1 -true.executable=cat -# hg update -C 1 -# hg merge -r 2 --config merge-patterns.f=true --config merge-tools.true.executable=nonexistingmergetool -couldn't find merge tool true specified for f -merging f -merging f failed! -0 files updated, 0 files merged, 0 files removed, 1 files unresolved -use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon -# cat f -revision 1 -space -# hg stat -M f -? f.orig - -# merge-patterns specifies executable with bogus path and gets warning: -[merge-tools] -false.whatever= -true.priority=1 -true.executable=cat -# hg update -C 1 -# hg merge -r 2 --config merge-patterns.f=true --config merge-tools.true.executable=/nonexisting/mergetool -couldn't find merge tool true specified for f -merging f -merging f failed! -0 files updated, 0 files merged, 0 files removed, 1 files unresolved -use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon -# cat f -revision 1 -space -# hg stat -M f -? f.orig - - -ui.merge overrules priority - -# ui.merge specifies false: -[merge-tools] -false.whatever= -true.priority=1 -true.executable=cat -# hg update -C 1 -# hg merge -r 2 --config ui.merge=false -merging f -merging f failed! -0 files updated, 0 files merged, 0 files removed, 1 files unresolved -use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon -# cat f -revision 1 -space -# hg stat -M f -? f.orig - -# ui.merge specifies internal:fail: -[merge-tools] -false.whatever= -true.priority=1 -true.executable=cat -# hg update -C 1 -# hg merge -r 2 --config ui.merge=internal:fail -0 files updated, 0 files merged, 0 files removed, 1 files unresolved -use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon -# cat f -revision 1 -space -# hg stat -M f - -# ui.merge specifies internal:local: -[merge-tools] -false.whatever= -true.priority=1 -true.executable=cat -# hg update -C 1 -# hg merge -r 2 --config ui.merge=internal:local -0 files updated, 1 files merged, 0 files removed, 0 files unresolved -(branch merge, don't forget to commit) -# cat f -revision 1 -space -# hg stat -M f - -# ui.merge specifies internal:other: -[merge-tools] -false.whatever= -true.priority=1 -true.executable=cat -# hg update -C 1 -# hg merge -r 2 --config ui.merge=internal:other -0 files updated, 1 files merged, 0 files removed, 0 files unresolved -(branch merge, don't forget to commit) -# cat f -revision 2 -space -# hg stat -M f - -# ui.merge specifies internal:prompt: -[merge-tools] -false.whatever= -true.priority=1 -true.executable=cat -# hg update -C 1 -# hg merge -r 2 --config ui.merge=internal:prompt - no tool found to merge f -keep (l)ocal or take (o)ther? l -0 files updated, 1 files merged, 0 files removed, 0 files unresolved -(branch merge, don't forget to commit) -# cat f -revision 1 -space -# hg stat -M f - -# ui.merge specifies internal:dump: -[merge-tools] -false.whatever= -true.priority=1 -true.executable=cat -# hg update -C 1 -# hg merge -r 2 --config ui.merge=internal:dump -merging f -0 files updated, 0 files merged, 0 files removed, 1 files unresolved -use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon -# cat f -revision 1 -space -# hg stat -M f -? f.base -? f.local -? f.orig -? f.other - -f.base: -revision 0 -space -f.local: -revision 1 -space -f.other: -revision 2 -space - -# ui.merge specifies internal:other but is overruled by pattern for false: -[merge-tools] -false.whatever= -true.priority=1 -true.executable=cat -# hg update -C 1 -# hg merge -r 2 --config ui.merge=internal:other --config merge-patterns.f=false -merging f -merging f failed! -0 files updated, 0 files merged, 0 files removed, 1 files unresolved -use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon -# cat f -revision 1 -space -# hg stat -M f -? f.orig - - -Premerge - -# Default is silent simplemerge: -[merge-tools] -false.whatever= -true.priority=1 -true.executable=cat -# hg update -C 1 -# hg merge -r 3 -merging f -0 files updated, 1 files merged, 0 files removed, 0 files unresolved -(branch merge, don't forget to commit) -# cat f -revision 1 -space -revision 3 -# hg stat -M f - -# .premerge=True is same: -[merge-tools] -false.whatever= -true.priority=1 -true.executable=cat -# hg update -C 1 -# hg merge -r 3 --config merge-tools.true.premerge=True -merging f -0 files updated, 1 files merged, 0 files removed, 0 files unresolved -(branch merge, don't forget to commit) -# cat f -revision 1 -space -revision 3 -# hg stat -M f - -# .premerge=False executes merge-tool: -[merge-tools] -false.whatever= -true.priority=1 -true.executable=cat -# hg update -C 1 -# hg merge -r 3 --config merge-tools.true.premerge=False -revision 1 -space -revision 0 -space -revision 0 -space -revision 3 -merging f -0 files updated, 1 files merged, 0 files removed, 0 files unresolved -(branch merge, don't forget to commit) -# cat f -revision 1 -space -# hg stat -M f - - -Tool execution - -# set tools.args explicit to include $base $local $other $output: -[merge-tools] -false.whatever= -true.priority=1 -true.executable=cat -# hg update -C 1 -==> ... <== -revision 0 -space - -==> ... <== -revision 1 -space - -==> ... <== -revision 2 -space - -==> ... <== -revision 1 -space -merging f -0 files updated, 1 files merged, 0 files removed, 0 files unresolved -(branch merge, don't forget to commit) -# cat f -revision 1 -space -# hg stat -M f - -# Merge with "echo mergeresult > $local": -[merge-tools] -false.whatever= -true.priority=1 -true.executable=cat -# hg update -C 1 -merging f -0 files updated, 1 files merged, 0 files removed, 0 files unresolved -(branch merge, don't forget to commit) -# cat f -mergeresult -# hg stat -M f - -# - and $local is the file f: -[merge-tools] -false.whatever= -true.priority=1 -true.executable=cat -# hg update -C 1 -merging f -0 files updated, 1 files merged, 0 files removed, 0 files unresolved -(branch merge, don't forget to commit) -# cat f -mergeresult -# hg stat -M f - -# Merge with "echo mergeresult > $output" - the variable is a bit magic: -[merge-tools] -false.whatever= -true.priority=1 -true.executable=cat -# hg update -C 1 -merging f -0 files updated, 1 files merged, 0 files removed, 0 files unresolved -(branch merge, don't forget to commit) -# cat f -mergeresult -# hg stat -M f - -# Merge using tool with a path that must be quoted: -[merge-tools] -false.whatever= -true.priority=1 -true.executable=cat -# hg update -C 1 -merging f -0 files updated, 1 files merged, 0 files removed, 0 files unresolved -(branch merge, don't forget to commit) -# cat f -revision 0 -space -revision 1 -space -revision 2 -space -# hg stat -M f - - -Merge post-processing - -# cat is a bad merge-tool and doesn't change: -[merge-tools] -false.whatever= -true.priority=1 -true.executable=cat -# hg update -C 1 -# hg merge -y -r 2 --config merge-tools.true.checkchanged=1 -revision 1 -space -revision 0 -space -revision 2 -space -merging f - output file f appears unchanged -was merge successful (yn)? n -merging f failed! -0 files updated, 0 files merged, 0 files removed, 1 files unresolved -use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon -# cat f -revision 1 -space -# hg stat -M f -? f.orig - diff -r 15f07e8e4742 -r 09168638b313 tests/test-merge-tools.t --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/test-merge-tools.t Sun Sep 26 13:43:21 2010 -0500 @@ -0,0 +1,735 @@ +test merge-tools configuration - mostly exercising filemerge.py + + $ unset HGMERGE # make sure HGMERGE doesn't interfere with the test + $ hg init + +revision 0 + + $ echo "revision 0" > f + $ echo "space" >> f + $ hg commit -Am "revision 0" + adding f + +revision 1 + + $ echo "revision 1" > f + $ echo "space" >> f + $ hg commit -Am "revision 1" + $ hg update 0 > /dev/null + +revision 2 + + $ echo "revision 2" > f + $ echo "space" >> f + $ hg commit -Am "revision 2" + created new head + $ hg update 0 > /dev/null + +revision 3 - simple to merge + + $ echo "revision 3" >> f + $ hg commit -Am "revision 3" + created new head + $ echo "[merge-tools]" > .hg/hgrc + $ echo + + $ beforemerge() { + > cat .hg/hgrc + > echo "# hg update -C 1" + > hg update -C 1 > /dev/null + > } + $ aftermerge() { + > echo "# cat f" + > cat f + > echo "# hg stat" + > hg stat + > rm -f f.orig + > echo + > } + $ domerge() { + > beforemerge + > echo "# hg merge $*" + > hg merge $* + > aftermerge + > } + $ echo + + +Tool selection + + $ echo + + +default is internal merge: + + $ beforemerge + [merge-tools] + # hg update -C 1 + +hg merge -r 2 +override $PATH to ensure hgmerge not visible; use $PYTHON in case we're +running from a devel copy, not a temp installation + + $ PATH="$BINDIR" $PYTHON "$BINDIR"/hg merge -r 2 + merging f + warning: conflicts during merge. + merging f failed! + 0 files updated, 0 files merged, 0 files removed, 1 files unresolved + use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon + [1] + $ aftermerge + # cat f + <<<<<<< local + revision 1 + ======= + revision 2 + >>>>>>> other + space + # hg stat + M f + ? f.orig + + +simplest hgrc using false for merge: + + $ echo "false.whatever=" >> .hg/hgrc + $ domerge -r 2 + [merge-tools] + false.whatever= + # hg update -C 1 + # hg merge -r 2 + merging f + merging f failed! + 0 files updated, 0 files merged, 0 files removed, 1 files unresolved + use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon + # cat f + revision 1 + space + # hg stat + M f + ? f.orig + + +true with higher .priority gets precedence: + + $ echo "true.priority=1" >> .hg/hgrc + $ domerge -r 2 + [merge-tools] + false.whatever= + true.priority=1 + # hg update -C 1 + # hg merge -r 2 + merging f + 0 files updated, 1 files merged, 0 files removed, 0 files unresolved + (branch merge, don't forget to commit) + # cat f + revision 1 + space + # hg stat + M f + + +unless lowered on command line: + + $ domerge -r 2 --config merge-tools.true.priority=-7 + [merge-tools] + false.whatever= + true.priority=1 + # hg update -C 1 + # hg merge -r 2 --config merge-tools.true.priority=-7 + merging f + merging f failed! + 0 files updated, 0 files merged, 0 files removed, 1 files unresolved + use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon + # cat f + revision 1 + space + # hg stat + M f + ? f.orig + + +or false set higher on command line: + + $ domerge -r 2 --config merge-tools.false.priority=117 + [merge-tools] + false.whatever= + true.priority=1 + # hg update -C 1 + # hg merge -r 2 --config merge-tools.false.priority=117 + merging f + merging f failed! + 0 files updated, 0 files merged, 0 files removed, 1 files unresolved + use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon + # cat f + revision 1 + space + # hg stat + M f + ? f.orig + + +or true.executable not found in PATH: + + $ domerge -r 2 --config merge-tools.true.executable=nonexistingmergetool + [merge-tools] + false.whatever= + true.priority=1 + # hg update -C 1 + # hg merge -r 2 --config merge-tools.true.executable=nonexistingmergetool + merging f + merging f failed! + 0 files updated, 0 files merged, 0 files removed, 1 files unresolved + use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon + # cat f + revision 1 + space + # hg stat + M f + ? f.orig + + +or true.executable with bogus path: + + $ domerge -r 2 --config merge-tools.true.executable=/nonexisting/mergetool + [merge-tools] + false.whatever= + true.priority=1 + # hg update -C 1 + # hg merge -r 2 --config merge-tools.true.executable=/nonexisting/mergetool + merging f + merging f failed! + 0 files updated, 0 files merged, 0 files removed, 1 files unresolved + use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon + # cat f + revision 1 + space + # hg stat + M f + ? f.orig + + +but true.executable set to cat found in PATH works: + + $ echo "true.executable=cat" >> .hg/hgrc + $ domerge -r 2 + [merge-tools] + false.whatever= + true.priority=1 + true.executable=cat + # hg update -C 1 + # hg merge -r 2 + revision 1 + space + revision 0 + space + revision 2 + space + merging f + 0 files updated, 1 files merged, 0 files removed, 0 files unresolved + (branch merge, don't forget to commit) + # cat f + revision 1 + space + # hg stat + M f + + +and true.executable set to cat with path works: + + $ domerge -r 2 --config merge-tools.true.executable=cat + [merge-tools] + false.whatever= + true.priority=1 + true.executable=cat + # hg update -C 1 + # hg merge -r 2 --config merge-tools.true.executable=cat + revision 1 + space + revision 0 + space + revision 2 + space + merging f + 0 files updated, 1 files merged, 0 files removed, 0 files unresolved + (branch merge, don't forget to commit) + # cat f + revision 1 + space + # hg stat + M f + + $ echo + + +Tool selection and merge-patterns + + $ echo + + +merge-patterns specifies new tool false: + + $ domerge -r 2 --config merge-patterns.f=false + [merge-tools] + false.whatever= + true.priority=1 + true.executable=cat + # hg update -C 1 + # hg merge -r 2 --config merge-patterns.f=false + merging f + merging f failed! + 0 files updated, 0 files merged, 0 files removed, 1 files unresolved + use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon + # cat f + revision 1 + space + # hg stat + M f + ? f.orig + + +merge-patterns specifies executable not found in PATH and gets warning: + + $ domerge -r 2 --config merge-patterns.f=true --config merge-tools.true.executable=nonexistingmergetool + [merge-tools] + false.whatever= + true.priority=1 + true.executable=cat + # hg update -C 1 + # hg merge -r 2 --config merge-patterns.f=true --config merge-tools.true.executable=nonexistingmergetool + couldn't find merge tool true specified for f + merging f + merging f failed! + 0 files updated, 0 files merged, 0 files removed, 1 files unresolved + use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon + # cat f + revision 1 + space + # hg stat + M f + ? f.orig + + +merge-patterns specifies executable with bogus path and gets warning: + + $ domerge -r 2 --config merge-patterns.f=true --config merge-tools.true.executable=/nonexisting/mergetool + [merge-tools] + false.whatever= + true.priority=1 + true.executable=cat + # hg update -C 1 + # hg merge -r 2 --config merge-patterns.f=true --config merge-tools.true.executable=/nonexisting/mergetool + couldn't find merge tool true specified for f + merging f + merging f failed! + 0 files updated, 0 files merged, 0 files removed, 1 files unresolved + use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon + # cat f + revision 1 + space + # hg stat + M f + ? f.orig + + $ echo + + +ui.merge overrules priority + + $ echo + + +ui.merge specifies false: + + $ domerge -r 2 --config ui.merge=false + [merge-tools] + false.whatever= + true.priority=1 + true.executable=cat + # hg update -C 1 + # hg merge -r 2 --config ui.merge=false + merging f + merging f failed! + 0 files updated, 0 files merged, 0 files removed, 1 files unresolved + use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon + # cat f + revision 1 + space + # hg stat + M f + ? f.orig + + +ui.merge specifies internal:fail: + + $ domerge -r 2 --config ui.merge=internal:fail + [merge-tools] + false.whatever= + true.priority=1 + true.executable=cat + # hg update -C 1 + # hg merge -r 2 --config ui.merge=internal:fail + 0 files updated, 0 files merged, 0 files removed, 1 files unresolved + use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon + # cat f + revision 1 + space + # hg stat + M f + + +ui.merge specifies internal:local: + + $ domerge -r 2 --config ui.merge=internal:local + [merge-tools] + false.whatever= + true.priority=1 + true.executable=cat + # hg update -C 1 + # hg merge -r 2 --config ui.merge=internal:local + 0 files updated, 1 files merged, 0 files removed, 0 files unresolved + (branch merge, don't forget to commit) + # cat f + revision 1 + space + # hg stat + M f + + +ui.merge specifies internal:other: + + $ domerge -r 2 --config ui.merge=internal:other + [merge-tools] + false.whatever= + true.priority=1 + true.executable=cat + # hg update -C 1 + # hg merge -r 2 --config ui.merge=internal:other + 0 files updated, 1 files merged, 0 files removed, 0 files unresolved + (branch merge, don't forget to commit) + # cat f + revision 2 + space + # hg stat + M f + + +ui.merge specifies internal:prompt: + + $ domerge -r 2 --config ui.merge=internal:prompt + [merge-tools] + false.whatever= + true.priority=1 + true.executable=cat + # hg update -C 1 + # hg merge -r 2 --config ui.merge=internal:prompt + no tool found to merge f + keep (l)ocal or take (o)ther? l + 0 files updated, 1 files merged, 0 files removed, 0 files unresolved + (branch merge, don't forget to commit) + # cat f + revision 1 + space + # hg stat + M f + + +ui.merge specifies internal:dump: + + $ domerge -r 2 --config ui.merge=internal:dump + [merge-tools] + false.whatever= + true.priority=1 + true.executable=cat + # hg update -C 1 + # hg merge -r 2 --config ui.merge=internal:dump + merging f + 0 files updated, 0 files merged, 0 files removed, 1 files unresolved + use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon + # cat f + revision 1 + space + # hg stat + M f + ? f.base + ? f.local + ? f.orig + ? f.other + + +f.base: + + $ cat f.base + revision 0 + space + +f.local: + + $ cat f.local + revision 1 + space + +f.other: + + $ cat f.other + revision 2 + space + $ rm f.base f.local f.other + $ echo + + +ui.merge specifies internal:other but is overruled by pattern for false: + + $ domerge -r 2 --config ui.merge=internal:other --config merge-patterns.f=false + [merge-tools] + false.whatever= + true.priority=1 + true.executable=cat + # hg update -C 1 + # hg merge -r 2 --config ui.merge=internal:other --config merge-patterns.f=false + merging f + merging f failed! + 0 files updated, 0 files merged, 0 files removed, 1 files unresolved + use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon + # cat f + revision 1 + space + # hg stat + M f + ? f.orig + + $ echo + + +Premerge + + $ echo + + +Default is silent simplemerge: + + $ domerge -r 3 + [merge-tools] + false.whatever= + true.priority=1 + true.executable=cat + # hg update -C 1 + # hg merge -r 3 + merging f + 0 files updated, 1 files merged, 0 files removed, 0 files unresolved + (branch merge, don't forget to commit) + # cat f + revision 1 + space + revision 3 + # hg stat + M f + + +.premerge=True is same: + + $ domerge -r 3 --config merge-tools.true.premerge=True + [merge-tools] + false.whatever= + true.priority=1 + true.executable=cat + # hg update -C 1 + # hg merge -r 3 --config merge-tools.true.premerge=True + merging f + 0 files updated, 1 files merged, 0 files removed, 0 files unresolved + (branch merge, don't forget to commit) + # cat f + revision 1 + space + revision 3 + # hg stat + M f + + +.premerge=False executes merge-tool: + + $ domerge -r 3 --config merge-tools.true.premerge=False + [merge-tools] + false.whatever= + true.priority=1 + true.executable=cat + # hg update -C 1 + # hg merge -r 3 --config merge-tools.true.premerge=False + revision 1 + space + revision 0 + space + revision 0 + space + revision 3 + merging f + 0 files updated, 1 files merged, 0 files removed, 0 files unresolved + (branch merge, don't forget to commit) + # cat f + revision 1 + space + # hg stat + M f + + $ echo + + +Tool execution + + $ echo + + $ echo '# set tools.args explicit to include $base $local $other $output:' # default '$local $base $other' + # set tools.args explicit to include $base $local $other $output: + $ beforemerge + [merge-tools] + false.whatever= + true.priority=1 + true.executable=cat + # hg update -C 1 + $ hg merge -r 2 --config merge-tools.true.executable=head --config merge-tools.true.args='$base $local $other $output' \ + > | sed 's,==> .* <==,==> ... <==,g' + ==> ... <== + revision 0 + space + + ==> ... <== + revision 1 + space + + ==> ... <== + revision 2 + space + + ==> ... <== + revision 1 + space + merging f + 0 files updated, 1 files merged, 0 files removed, 0 files unresolved + (branch merge, don't forget to commit) + $ aftermerge + # cat f + revision 1 + space + # hg stat + M f + + $ echo '# Merge with "echo mergeresult > $local":' + # Merge with "echo mergeresult > $local": + $ beforemerge + [merge-tools] + false.whatever= + true.priority=1 + true.executable=cat + # hg update -C 1 + $ hg merge -r 2 --config merge-tools.true.executable=echo --config merge-tools.true.args='mergeresult > $local' + merging f + 0 files updated, 1 files merged, 0 files removed, 0 files unresolved + (branch merge, don't forget to commit) + $ aftermerge + # cat f + mergeresult + # hg stat + M f + + $ echo '# - and $local is the file f:' + # - and $local is the file f: + $ beforemerge + [merge-tools] + false.whatever= + true.priority=1 + true.executable=cat + # hg update -C 1 + $ hg merge -r 2 --config merge-tools.true.executable=echo --config merge-tools.true.args='mergeresult > f' + merging f + 0 files updated, 1 files merged, 0 files removed, 0 files unresolved + (branch merge, don't forget to commit) + $ aftermerge + # cat f + mergeresult + # hg stat + M f + + $ echo '# Merge with "echo mergeresult > $output" - the variable is a bit magic:' + # Merge with "echo mergeresult > $output" - the variable is a bit magic: + $ beforemerge + [merge-tools] + false.whatever= + true.priority=1 + true.executable=cat + # hg update -C 1 + $ hg merge -r 2 --config merge-tools.true.executable=echo --config merge-tools.true.args='mergeresult > $output' + merging f + 0 files updated, 1 files merged, 0 files removed, 0 files unresolved + (branch merge, don't forget to commit) + $ aftermerge + # cat f + mergeresult + # hg stat + M f + + +Merge using tool with a path that must be quoted: + + $ beforemerge + [merge-tools] + false.whatever= + true.priority=1 + true.executable=cat + # hg update -C 1 + $ cat < 'my merge tool' + > #!/bin/sh + > cat "\$1" "\$2" "\$3" > "\$4" + > EOF + $ chmod +x 'my merge tool' + $ hg merge -r 2 --config merge-tools.true.executable='./my merge tool' --config merge-tools.true.args='$base $local $other $output' + merging f + 0 files updated, 1 files merged, 0 files removed, 0 files unresolved + (branch merge, don't forget to commit) + $ rm -f 'my merge tool' + $ aftermerge + # cat f + revision 0 + space + revision 1 + space + revision 2 + space + # hg stat + M f + + $ echo + + +Merge post-processing + + $ echo + + +cat is a bad merge-tool and doesn't change: + + $ domerge -y -r 2 --config merge-tools.true.checkchanged=1 + [merge-tools] + false.whatever= + true.priority=1 + true.executable=cat + # hg update -C 1 + # hg merge -y -r 2 --config merge-tools.true.checkchanged=1 + revision 1 + space + revision 0 + space + revision 2 + space + merging f + output file f appears unchanged + was merge successful (yn)? n + merging f failed! + 0 files updated, 0 files merged, 0 files removed, 1 files unresolved + use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon + # cat f + revision 1 + space + # hg stat + M f + ? f.orig +