# HG changeset patch # User Mads Kiilerich # Date 2009-01-25 20:20:11 # Node ID 737f274d1915a47ff79e25ab56bb4c06661ae755 # Parent 5fb312ba29a811e0a9b3652757c4bc66a8cdfbcc test-merge-tools Some tests of merge-tools configuration and selection, mostly excercising filemerge.py diff --git a/tests/test-merge-tools b/tests/test-merge-tools new file mode 100755 --- /dev/null +++ b/tests/test-merge-tools @@ -0,0 +1,150 @@ +#!/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" -d "1000000 0" + +echo "# revision 1" +echo "revision 1" > f +echo "space" >> f +hg commit -Am "revision 1" -d "1000000 0" + +hg update 0 > /dev/null +echo "# revision 2" +echo "revision 2" > f +echo "space" >> f +hg commit -Am "revision 2" -d "1000000 0" + +hg update 0 > /dev/null +echo "# revision 3 - simple to merge" +echo "revision 3" >> f +hg commit -Am "revision 3" -d "1000000 0" + + +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:" +domerge -r 2 + +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=/bin/nonexistingmergetool + +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=/bin/cat + + +echo +echo Tool selection and merge-patterns +echo + +echo "# merge-patterns specifies new tool tac:" +domerge -r 2 --config merge-patterns.f=tac + +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=/bin/nonexistingmergetool + + +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 +echo Merge post-processing +echo + +echo "# cat is a bad merge-tool and doesn't change:" +domerge -r 2 --config merge-tools.true.checkchanged=1 diff --git a/tests/test-merge-tools.out b/tests/test-merge-tools.out new file mode 100644 --- /dev/null +++ b/tests/test-merge-tools.out @@ -0,0 +1,400 @@ +# 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 +# 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 +# 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 +# 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 +# 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 +# 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=/bin/nonexistingmergetool +sh: /bin/nonexistingmergetool: No such file or directory +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 +# 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=/bin/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 tac: +[merge-tools] +false.whatever= +true.priority=1 +true.executable=cat +# hg update -C 1 +# hg merge -r 2 --config merge-patterns.f=tac +space +revision 1 +space +revision 0 +space +revision 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 + +# 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 +# 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=/bin/nonexistingmergetool +sh: /bin/nonexistingmergetool: No such file or directory +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 +# 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 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 -r 2 --config merge-tools.true.checkchanged=1 +revision 1 +space +revision 0 +space +revision 2 +space +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 +# cat f +revision 1 +space +# hg stat +M f +? f.orig +