test-merge-tools.t
1223 lines
| 25.9 KiB
| text/troff
|
Tads3Lexer
/ tests / test-merge-tools.t
|
r12460 | 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 | ||||
|
r22029 | |||
revision 4 - hard to merge | ||||
$ hg update 0 > /dev/null | ||||
$ echo "revision 4" > f | ||||
$ hg commit -Am "revision 4" | ||||
created new head | ||||
|
r12460 | $ echo "[merge-tools]" > .hg/hgrc | ||
|
r15243 | |||
|
r12460 | $ 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 | ||||
|
r26897 | > echo "# hg resolve --list" | ||
> hg resolve --list | ||||
|
r12460 | > rm -f f.orig | ||
> } | ||||
Tool selection | ||||
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 | ||||
|
r26168 | $ PATH="$BINDIR:/usr/sbin" $PYTHON "$BINDIR"/hg merge -r 2 | ||
|
r12460 | merging f | ||
|
r26614 | warning: conflicts while merging f! (edit, then use 'hg resolve --mark') | ||
|
r12460 | 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 | ||||
|
r30460 | <<<<<<< working copy: ef83787e2614 - test: revision 1 | ||
|
r12460 | revision 1 | ||
======= | ||||
revision 2 | ||||
|
r30460 | >>>>>>> merge rev: 0185f4e0cf02 - test: revision 2 | ||
|
r12460 | space | ||
# hg stat | ||||
M f | ||||
? f.orig | ||||
|
r26897 | # hg resolve --list | ||
U f | ||||
|
r12460 | |||
simplest hgrc using false for merge: | ||||
$ echo "false.whatever=" >> .hg/hgrc | ||||
|
r16961 | $ beforemerge | ||
|
r12460 | [merge-tools] | ||
false.whatever= | ||||
# hg update -C 1 | ||||
|
r16961 | $ hg merge -r 2 | ||
|
r12460 | 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 | ||||
|
r16961 | [1] | ||
$ aftermerge | ||||
|
r12460 | # cat f | ||
revision 1 | ||||
space | ||||
# hg stat | ||||
M f | ||||
? f.orig | ||||
|
r26897 | # hg resolve --list | ||
U f | ||||
|
r12460 | |||
|
r24809 | #if unix-permissions | ||
|
r15545 | unexecutable file in $PATH shouldn't be found: | ||
|
r24809 | $ echo "echo fail" > false | ||
|
r15545 | $ hg up -qC 1 | ||
|
r26168 | $ PATH="`pwd`:$BINDIR:/usr/sbin" $PYTHON "$BINDIR"/hg merge -r 2 | ||
|
r15545 | merging f | ||
|
r26614 | warning: conflicts while merging f! (edit, then use 'hg resolve --mark') | ||
|
r15545 | 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] | ||||
$ rm false | ||||
|
r24809 | #endif | ||
|
r15545 | executable directory in $PATH shouldn't be found: | ||
$ mkdir false | ||||
$ hg up -qC 1 | ||||
|
r26168 | $ PATH="`pwd`:$BINDIR:/usr/sbin" $PYTHON "$BINDIR"/hg merge -r 2 | ||
|
r15545 | merging f | ||
|
r26614 | warning: conflicts while merging f! (edit, then use 'hg resolve --mark') | ||
|
r15545 | 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] | ||||
$ rmdir false | ||||
|
r12460 | true with higher .priority gets precedence: | ||
$ echo "true.priority=1" >> .hg/hgrc | ||||
|
r16961 | $ beforemerge | ||
|
r12460 | [merge-tools] | ||
false.whatever= | ||||
true.priority=1 | ||||
# hg update -C 1 | ||||
|
r16961 | $ hg merge -r 2 | ||
|
r12460 | merging f | ||
0 files updated, 1 files merged, 0 files removed, 0 files unresolved | ||||
(branch merge, don't forget to commit) | ||||
|
r16961 | $ aftermerge | ||
|
r12460 | # cat f | ||
revision 1 | ||||
space | ||||
# hg stat | ||||
M f | ||||
|
r26897 | # hg resolve --list | ||
R f | ||||
|
r12460 | |||
unless lowered on command line: | ||||
|
r16961 | $ beforemerge | ||
|
r12460 | [merge-tools] | ||
false.whatever= | ||||
true.priority=1 | ||||
# hg update -C 1 | ||||
|
r16961 | $ hg merge -r 2 --config merge-tools.true.priority=-7 | ||
|
r12460 | 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 | ||||
|
r16961 | [1] | ||
$ aftermerge | ||||
|
r12460 | # cat f | ||
revision 1 | ||||
space | ||||
# hg stat | ||||
M f | ||||
? f.orig | ||||
|
r26897 | # hg resolve --list | ||
U f | ||||
|
r12460 | |||
or false set higher on command line: | ||||
|
r16961 | $ beforemerge | ||
|
r12460 | [merge-tools] | ||
false.whatever= | ||||
true.priority=1 | ||||
# hg update -C 1 | ||||
|
r16961 | $ hg merge -r 2 --config merge-tools.false.priority=117 | ||
|
r12460 | 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 | ||||
|
r16961 | [1] | ||
$ aftermerge | ||||
|
r12460 | # cat f | ||
revision 1 | ||||
space | ||||
# hg stat | ||||
M f | ||||
? f.orig | ||||
|
r26897 | # hg resolve --list | ||
U f | ||||
|
r12460 | |||
|
r26730 | or true set to disabled: | ||
$ beforemerge | ||||
[merge-tools] | ||||
false.whatever= | ||||
true.priority=1 | ||||
# hg update -C 1 | ||||
$ hg merge -r 2 --config merge-tools.true.disabled=yes | ||||
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 | ||||
[1] | ||||
$ aftermerge | ||||
# cat f | ||||
revision 1 | ||||
space | ||||
# hg stat | ||||
M f | ||||
? f.orig | ||||
|
r26897 | # hg resolve --list | ||
U f | ||||
|
r26730 | |||
|
r12460 | or true.executable not found in PATH: | ||
|
r16961 | $ beforemerge | ||
|
r12460 | [merge-tools] | ||
false.whatever= | ||||
true.priority=1 | ||||
# hg update -C 1 | ||||
|
r17492 | $ hg merge -r 2 --config merge-tools.true.executable=nonexistentmergetool | ||
|
r12460 | 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 | ||||
|
r16961 | [1] | ||
$ aftermerge | ||||
|
r12460 | # cat f | ||
revision 1 | ||||
space | ||||
# hg stat | ||||
M f | ||||
? f.orig | ||||
|
r26897 | # hg resolve --list | ||
U f | ||||
|
r12460 | |||
or true.executable with bogus path: | ||||
|
r16961 | $ beforemerge | ||
|
r12460 | [merge-tools] | ||
false.whatever= | ||||
true.priority=1 | ||||
# hg update -C 1 | ||||
|
r17492 | $ hg merge -r 2 --config merge-tools.true.executable=/nonexistent/mergetool | ||
|
r12460 | 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 | ||||
|
r16961 | [1] | ||
$ aftermerge | ||||
|
r12460 | # cat f | ||
revision 1 | ||||
space | ||||
# hg stat | ||||
M f | ||||
? f.orig | ||||
|
r26897 | # hg resolve --list | ||
U f | ||||
|
r12460 | |||
but true.executable set to cat found in PATH works: | ||||
$ echo "true.executable=cat" >> .hg/hgrc | ||||
|
r16961 | $ beforemerge | ||
|
r12460 | [merge-tools] | ||
false.whatever= | ||||
true.priority=1 | ||||
true.executable=cat | ||||
# hg update -C 1 | ||||
|
r16961 | $ hg merge -r 2 | ||
|
r13439 | merging f | ||
|
r12460 | revision 1 | ||
space | ||||
revision 0 | ||||
space | ||||
revision 2 | ||||
space | ||||
0 files updated, 1 files merged, 0 files removed, 0 files unresolved | ||||
(branch merge, don't forget to commit) | ||||
|
r16961 | $ aftermerge | ||
|
r12460 | # cat f | ||
revision 1 | ||||
space | ||||
# hg stat | ||||
M f | ||||
|
r26897 | # hg resolve --list | ||
R f | ||||
|
r12460 | |||
and true.executable set to cat with path works: | ||||
|
r16961 | $ beforemerge | ||
|
r12460 | [merge-tools] | ||
false.whatever= | ||||
true.priority=1 | ||||
true.executable=cat | ||||
# hg update -C 1 | ||||
|
r16961 | $ hg merge -r 2 --config merge-tools.true.executable=cat | ||
|
r13439 | merging f | ||
|
r12460 | revision 1 | ||
space | ||||
revision 0 | ||||
space | ||||
revision 2 | ||||
space | ||||
0 files updated, 1 files merged, 0 files removed, 0 files unresolved | ||||
(branch merge, don't forget to commit) | ||||
|
r16961 | $ aftermerge | ||
|
r12460 | # cat f | ||
revision 1 | ||||
space | ||||
# hg stat | ||||
M f | ||||
|
r26897 | # hg resolve --list | ||
R f | ||||
|
r12460 | |||
|
r16972 | #if unix-permissions | ||
|
r15264 | environment variables in true.executable are handled: | ||
|
r19264 | $ echo 'echo "custom merge tool"' > .hg/merge.sh | ||
|
r16961 | $ beforemerge | ||
|
r15264 | [merge-tools] | ||
false.whatever= | ||||
true.priority=1 | ||||
true.executable=cat | ||||
# hg update -C 1 | ||||
|
r16967 | $ hg --config merge-tools.true.executable='sh' \ | ||
|
r19264 | > --config merge-tools.true.args=.hg/merge.sh \ | ||
|
r16967 | > merge -r 2 | ||
|
r15264 | merging f | ||
custom merge tool | ||||
0 files updated, 1 files merged, 0 files removed, 0 files unresolved | ||||
(branch merge, don't forget to commit) | ||||
|
r16961 | $ aftermerge | ||
|
r15264 | # cat f | ||
revision 1 | ||||
space | ||||
# hg stat | ||||
M f | ||||
|
r26897 | # hg resolve --list | ||
R f | ||||
|
r15264 | |||
|
r16972 | #endif | ||
|
r12460 | Tool selection and merge-patterns | ||
merge-patterns specifies new tool false: | ||||
|
r16961 | $ beforemerge | ||
|
r12460 | [merge-tools] | ||
false.whatever= | ||||
true.priority=1 | ||||
true.executable=cat | ||||
# hg update -C 1 | ||||
|
r16961 | $ hg merge -r 2 --config merge-patterns.f=false | ||
|
r12460 | 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 | ||||
|
r16961 | [1] | ||
$ aftermerge | ||||
|
r12460 | # cat f | ||
revision 1 | ||||
space | ||||
# hg stat | ||||
M f | ||||
? f.orig | ||||
|
r26897 | # hg resolve --list | ||
U f | ||||
|
r12460 | |||
merge-patterns specifies executable not found in PATH and gets warning: | ||||
|
r16961 | $ beforemerge | ||
|
r12460 | [merge-tools] | ||
false.whatever= | ||||
true.priority=1 | ||||
true.executable=cat | ||||
# hg update -C 1 | ||||
|
r17492 | $ hg merge -r 2 --config merge-patterns.f=true --config merge-tools.true.executable=nonexistentmergetool | ||
|
r12460 | couldn't find merge tool true specified for f | ||
merging f | ||||
|
r26611 | couldn't find merge tool true specified for f | ||
|
r12460 | 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 | ||||
|
r16961 | [1] | ||
$ aftermerge | ||||
|
r12460 | # cat f | ||
revision 1 | ||||
space | ||||
# hg stat | ||||
M f | ||||
? f.orig | ||||
|
r26897 | # hg resolve --list | ||
U f | ||||
|
r12460 | |||
merge-patterns specifies executable with bogus path and gets warning: | ||||
|
r16961 | $ beforemerge | ||
|
r12460 | [merge-tools] | ||
false.whatever= | ||||
true.priority=1 | ||||
true.executable=cat | ||||
# hg update -C 1 | ||||
|
r17492 | $ hg merge -r 2 --config merge-patterns.f=true --config merge-tools.true.executable=/nonexistent/mergetool | ||
|
r12460 | couldn't find merge tool true specified for f | ||
merging f | ||||
|
r26611 | couldn't find merge tool true specified for f | ||
|
r12460 | 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 | ||||
|
r16961 | [1] | ||
$ aftermerge | ||||
|
r12460 | # cat f | ||
revision 1 | ||||
space | ||||
# hg stat | ||||
M f | ||||
? f.orig | ||||
|
r26897 | # hg resolve --list | ||
U f | ||||
|
r12460 | |||
ui.merge overrules priority | ||||
ui.merge specifies false: | ||||
|
r16961 | $ beforemerge | ||
|
r12460 | [merge-tools] | ||
false.whatever= | ||||
true.priority=1 | ||||
true.executable=cat | ||||
# hg update -C 1 | ||||
|
r16961 | $ hg merge -r 2 --config ui.merge=false | ||
|
r12460 | 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 | ||||
|
r16961 | [1] | ||
$ aftermerge | ||||
|
r12460 | # cat f | ||
revision 1 | ||||
space | ||||
# hg stat | ||||
M f | ||||
? f.orig | ||||
|
r26897 | # hg resolve --list | ||
U f | ||||
|
r12460 | |||
ui.merge specifies internal:fail: | ||||
|
r16961 | $ beforemerge | ||
|
r12460 | [merge-tools] | ||
false.whatever= | ||||
true.priority=1 | ||||
true.executable=cat | ||||
# hg update -C 1 | ||||
|
r16961 | $ hg merge -r 2 --config ui.merge=internal:fail | ||
|
r12460 | 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 | ||||
|
r16961 | [1] | ||
$ aftermerge | ||||
|
r12460 | # cat f | ||
revision 1 | ||||
space | ||||
# hg stat | ||||
M f | ||||
|
r26897 | # hg resolve --list | ||
U f | ||||
|
r12460 | |||
|
r22706 | ui.merge specifies :local (without internal prefix): | ||
|
r12460 | |||
|
r16961 | $ beforemerge | ||
|
r12460 | [merge-tools] | ||
false.whatever= | ||||
true.priority=1 | ||||
true.executable=cat | ||||
# hg update -C 1 | ||||
|
r22706 | $ hg merge -r 2 --config ui.merge=:local | ||
|
r12460 | 0 files updated, 1 files merged, 0 files removed, 0 files unresolved | ||
(branch merge, don't forget to commit) | ||||
|
r16961 | $ aftermerge | ||
|
r12460 | # cat f | ||
revision 1 | ||||
space | ||||
# hg stat | ||||
M f | ||||
|
r26897 | # hg resolve --list | ||
R f | ||||
|
r12460 | |||
ui.merge specifies internal:other: | ||||
|
r16961 | $ beforemerge | ||
|
r12460 | [merge-tools] | ||
false.whatever= | ||||
true.priority=1 | ||||
true.executable=cat | ||||
# hg update -C 1 | ||||
|
r16961 | $ hg merge -r 2 --config ui.merge=internal:other | ||
|
r12460 | 0 files updated, 1 files merged, 0 files removed, 0 files unresolved | ||
(branch merge, don't forget to commit) | ||||
|
r16961 | $ aftermerge | ||
|
r12460 | # cat f | ||
revision 2 | ||||
space | ||||
# hg stat | ||||
M f | ||||
|
r26897 | # hg resolve --list | ||
R f | ||||
|
r12460 | |||
ui.merge specifies internal:prompt: | ||||
|
r16961 | $ beforemerge | ||
|
r12460 | [merge-tools] | ||
false.whatever= | ||||
true.priority=1 | ||||
true.executable=cat | ||||
# hg update -C 1 | ||||
|
r16961 | $ hg merge -r 2 --config ui.merge=internal:prompt | ||
|
r26967 | no tool found to merge f | ||
|
r30062 | keep (l)ocal [working copy], take (o)ther [merge rev], or leave (u)nresolved? u | ||
|
r27164 | 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] | ||||
|
r16961 | $ aftermerge | ||
|
r12460 | # cat f | ||
revision 1 | ||||
space | ||||
# hg stat | ||||
M f | ||||
|
r26897 | # hg resolve --list | ||
|
r27164 | U f | ||
|
r12460 | |||
|
r27162 | ui.merge specifies :prompt, with 'leave unresolved' chosen | ||
$ beforemerge | ||||
[merge-tools] | ||||
false.whatever= | ||||
true.priority=1 | ||||
true.executable=cat | ||||
# hg update -C 1 | ||||
$ hg merge -r 2 --config ui.merge=:prompt --config ui.interactive=True << EOF | ||||
> u | ||||
> EOF | ||||
no tool found to merge f | ||||
|
r30062 | keep (l)ocal [working copy], take (o)ther [merge rev], or leave (u)nresolved? u | ||
|
r27162 | 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 | ||||
revision 1 | ||||
space | ||||
# hg stat | ||||
M f | ||||
# hg resolve --list | ||||
U f | ||||
|
r26898 | prompt with EOF | ||
$ beforemerge | ||||
[merge-tools] | ||||
false.whatever= | ||||
true.priority=1 | ||||
true.executable=cat | ||||
# hg update -C 1 | ||||
$ hg merge -r 2 --config ui.merge=internal:prompt --config ui.interactive=true | ||||
|
r26967 | no tool found to merge f | ||
|
r30062 | keep (l)ocal [working copy], take (o)ther [merge rev], or leave (u)nresolved? | ||
|
r26898 | 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 | ||||
revision 1 | ||||
space | ||||
# hg stat | ||||
M f | ||||
# hg resolve --list | ||||
U f | ||||
$ hg resolve --all --config ui.merge=internal:prompt --config ui.interactive=true | ||||
|
r26967 | no tool found to merge f | ||
|
r30062 | keep (l)ocal [working copy], take (o)ther [merge rev], or leave (u)nresolved? | ||
|
r26898 | [1] | ||
$ aftermerge | ||||
# cat f | ||||
revision 1 | ||||
space | ||||
# hg stat | ||||
M f | ||||
? f.orig | ||||
# hg resolve --list | ||||
U f | ||||
|
r26899 | $ rm f | ||
$ hg resolve --all --config ui.merge=internal:prompt --config ui.interactive=true | ||||
|
r26967 | no tool found to merge f | ||
|
r30062 | keep (l)ocal [working copy], take (o)ther [merge rev], or leave (u)nresolved? | ||
|
r26899 | [1] | ||
$ aftermerge | ||||
# cat f | ||||
revision 1 | ||||
space | ||||
# hg stat | ||||
M f | ||||
# hg resolve --list | ||||
U f | ||||
$ hg resolve --all --config ui.merge=internal:prompt | ||||
|
r26967 | no tool found to merge f | ||
|
r30062 | keep (l)ocal [working copy], take (o)ther [merge rev], or leave (u)nresolved? u | ||
|
r27164 | [1] | ||
|
r26899 | $ aftermerge | ||
# cat f | ||||
revision 1 | ||||
space | ||||
# hg stat | ||||
M f | ||||
? f.orig | ||||
# hg resolve --list | ||||
|
r27164 | U f | ||
|
r26899 | |||
|
r12460 | ui.merge specifies internal:dump: | ||
|
r16961 | $ beforemerge | ||
|
r12460 | [merge-tools] | ||
false.whatever= | ||||
true.priority=1 | ||||
true.executable=cat | ||||
# hg update -C 1 | ||||
|
r16961 | $ hg merge -r 2 --config ui.merge=internal:dump | ||
|
r12460 | 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 | ||||
|
r16961 | [1] | ||
$ aftermerge | ||||
|
r12460 | # cat f | ||
revision 1 | ||||
space | ||||
# hg stat | ||||
M f | ||||
? f.base | ||||
? f.local | ||||
? f.orig | ||||
? f.other | ||||
|
r26897 | # hg resolve --list | ||
U f | ||||
|
r12460 | |||
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 | ||||
ui.merge specifies internal:other but is overruled by pattern for false: | ||||
|
r16961 | $ beforemerge | ||
|
r12460 | [merge-tools] | ||
false.whatever= | ||||
true.priority=1 | ||||
true.executable=cat | ||||
# hg update -C 1 | ||||
|
r16961 | $ hg merge -r 2 --config ui.merge=internal:other --config merge-patterns.f=false | ||
|
r12460 | 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 | ||||
|
r16961 | [1] | ||
$ aftermerge | ||||
|
r12460 | # cat f | ||
revision 1 | ||||
space | ||||
# hg stat | ||||
M f | ||||
? f.orig | ||||
|
r26897 | # hg resolve --list | ||
U f | ||||
|
r12460 | |||
Premerge | ||||
|
r12788 | ui.merge specifies internal:other but is overruled by --tool=false | ||
|
r16961 | $ beforemerge | ||
|
r12788 | [merge-tools] | ||
false.whatever= | ||||
true.priority=1 | ||||
true.executable=cat | ||||
# hg update -C 1 | ||||
|
r16961 | $ hg merge -r 2 --config ui.merge=internal:other --tool=false | ||
|
r12788 | 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 | ||||
|
r16961 | [1] | ||
$ aftermerge | ||||
|
r12788 | # cat f | ||
revision 1 | ||||
space | ||||
# hg stat | ||||
M f | ||||
? f.orig | ||||
|
r26897 | # hg resolve --list | ||
U f | ||||
|
r15243 | |||
|
r12788 | HGMERGE specifies internal:other but is overruled by --tool=false | ||
$ HGMERGE=internal:other ; export HGMERGE | ||||
|
r16961 | $ beforemerge | ||
|
r12788 | [merge-tools] | ||
false.whatever= | ||||
true.priority=1 | ||||
true.executable=cat | ||||
# hg update -C 1 | ||||
|
r16961 | $ hg merge -r 2 --tool=false | ||
|
r12788 | 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 | ||||
|
r16961 | [1] | ||
$ aftermerge | ||||
|
r12788 | # cat f | ||
revision 1 | ||||
space | ||||
# hg stat | ||||
M f | ||||
? f.orig | ||||
|
r26897 | # hg resolve --list | ||
U f | ||||
|
r15243 | |||
|
r12788 | $ unset HGMERGE # make sure HGMERGE doesn't interfere with remaining tests | ||
|
r21552 | update is a merge ... | ||
|
r25753 | (this also tests that files reverted with '--rev REV' are treated as | ||
"modified", even if none of mode, size and timestamp of them isn't | ||||
changed on the filesystem (see also issue4583)) | ||||
$ cat >> $HGRCPATH <<EOF | ||||
> [fakedirstatewritetime] | ||||
> # emulate invoking dirstate.write() via repo.status() | ||||
> # at 2000-01-01 00:00 | ||||
> fakenow = 200001010000 | ||||
> EOF | ||||
|
r21552 | $ beforemerge | ||
[merge-tools] | ||||
false.whatever= | ||||
true.priority=1 | ||||
true.executable=cat | ||||
# hg update -C 1 | ||||
|
r24121 | $ hg update -q 0 | ||
|
r24843 | $ f -s f | ||
f: size=17 | ||||
$ touch -t 200001010000 f | ||||
|
r25753 | $ hg debugrebuildstate | ||
$ cat >> $HGRCPATH <<EOF | ||||
> [extensions] | ||||
> fakedirstatewritetime = $TESTDIR/fakedirstatewritetime.py | ||||
> EOF | ||||
|
r24121 | $ hg revert -q -r 1 . | ||
|
r25753 | $ cat >> $HGRCPATH <<EOF | ||
> [extensions] | ||||
> fakedirstatewritetime = ! | ||||
> EOF | ||||
|
r24843 | $ f -s f | ||
f: size=17 | ||||
$ touch -t 200001010000 f | ||||
$ hg status f | ||||
M f | ||||
|
r21552 | $ hg update -r 2 | ||
merging f | ||||
revision 1 | ||||
space | ||||
revision 0 | ||||
space | ||||
revision 2 | ||||
space | ||||
0 files updated, 1 files merged, 0 files removed, 0 files unresolved | ||||
$ aftermerge | ||||
# cat f | ||||
revision 1 | ||||
space | ||||
# hg stat | ||||
M f | ||||
|
r26897 | # hg resolve --list | ||
R f | ||||
|
r21552 | |||
update should also have --tool | ||||
$ beforemerge | ||||
[merge-tools] | ||||
false.whatever= | ||||
true.priority=1 | ||||
true.executable=cat | ||||
# hg update -C 1 | ||||
|
r24121 | $ hg update -q 0 | ||
|
r24843 | $ f -s f | ||
f: size=17 | ||||
$ touch -t 200001010000 f | ||||
|
r25753 | $ hg debugrebuildstate | ||
$ cat >> $HGRCPATH <<EOF | ||||
> [extensions] | ||||
> fakedirstatewritetime = $TESTDIR/fakedirstatewritetime.py | ||||
> EOF | ||||
|
r24121 | $ hg revert -q -r 1 . | ||
|
r25753 | $ cat >> $HGRCPATH <<EOF | ||
> [extensions] | ||||
> fakedirstatewritetime = ! | ||||
> EOF | ||||
|
r24843 | $ f -s f | ||
f: size=17 | ||||
$ touch -t 200001010000 f | ||||
$ hg status f | ||||
M f | ||||
|
r21552 | $ hg update -r 2 --tool 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 | ||||
[1] | ||||
$ aftermerge | ||||
# cat f | ||||
revision 1 | ||||
space | ||||
# hg stat | ||||
M f | ||||
? f.orig | ||||
|
r26897 | # hg resolve --list | ||
U f | ||||
|
r21552 | |||
|
r12460 | Default is silent simplemerge: | ||
|
r16961 | $ beforemerge | ||
|
r12460 | [merge-tools] | ||
false.whatever= | ||||
true.priority=1 | ||||
true.executable=cat | ||||
# hg update -C 1 | ||||
|
r16961 | $ hg merge -r 3 | ||
|
r12460 | merging f | ||
0 files updated, 1 files merged, 0 files removed, 0 files unresolved | ||||
(branch merge, don't forget to commit) | ||||
|
r16961 | $ aftermerge | ||
|
r12460 | # cat f | ||
revision 1 | ||||
space | ||||
revision 3 | ||||
# hg stat | ||||
M f | ||||
|
r26897 | # hg resolve --list | ||
R f | ||||
|
r12460 | |||
.premerge=True is same: | ||||
|
r16961 | $ beforemerge | ||
|
r12460 | [merge-tools] | ||
false.whatever= | ||||
true.priority=1 | ||||
true.executable=cat | ||||
# hg update -C 1 | ||||
|
r16961 | $ hg merge -r 3 --config merge-tools.true.premerge=True | ||
|
r12460 | merging f | ||
0 files updated, 1 files merged, 0 files removed, 0 files unresolved | ||||
(branch merge, don't forget to commit) | ||||
|
r16961 | $ aftermerge | ||
|
r12460 | # cat f | ||
revision 1 | ||||
space | ||||
revision 3 | ||||
# hg stat | ||||
M f | ||||
|
r26897 | # hg resolve --list | ||
R f | ||||
|
r12460 | |||
.premerge=False executes merge-tool: | ||||
|
r16961 | $ beforemerge | ||
|
r12460 | [merge-tools] | ||
false.whatever= | ||||
true.priority=1 | ||||
true.executable=cat | ||||
# hg update -C 1 | ||||
|
r16961 | $ hg merge -r 3 --config merge-tools.true.premerge=False | ||
|
r13439 | merging f | ||
|
r12460 | revision 1 | ||
space | ||||
revision 0 | ||||
space | ||||
revision 0 | ||||
space | ||||
revision 3 | ||||
0 files updated, 1 files merged, 0 files removed, 0 files unresolved | ||||
(branch merge, don't forget to commit) | ||||
|
r16961 | $ aftermerge | ||
|
r12460 | # cat f | ||
revision 1 | ||||
space | ||||
# hg stat | ||||
M f | ||||
|
r26897 | # hg resolve --list | ||
R f | ||||
|
r12460 | |||
|
r22030 | premerge=keep keeps conflict markers in: | ||
$ beforemerge | ||||
[merge-tools] | ||||
false.whatever= | ||||
true.priority=1 | ||||
true.executable=cat | ||||
# hg update -C 1 | ||||
$ hg merge -r 4 --config merge-tools.true.premerge=keep | ||||
merging f | ||||
|
r30460 | <<<<<<< working copy: ef83787e2614 - test: revision 1 | ||
|
r22030 | revision 1 | ||
space | ||||
======= | ||||
revision 4 | ||||
|
r30062 | >>>>>>> merge rev: 81448d39c9a0 - test: revision 4 | ||
|
r22030 | revision 0 | ||
space | ||||
revision 4 | ||||
0 files updated, 1 files merged, 0 files removed, 0 files unresolved | ||||
(branch merge, don't forget to commit) | ||||
$ aftermerge | ||||
# cat f | ||||
|
r30460 | <<<<<<< working copy: ef83787e2614 - test: revision 1 | ||
|
r22030 | revision 1 | ||
space | ||||
======= | ||||
revision 4 | ||||
|
r30062 | >>>>>>> merge rev: 81448d39c9a0 - test: revision 4 | ||
|
r22030 | # hg stat | ||
M f | ||||
|
r26897 | # hg resolve --list | ||
R f | ||||
|
r22030 | |||
|
r22032 | premerge=keep-merge3 keeps conflict markers with base content: | ||
$ beforemerge | ||||
[merge-tools] | ||||
false.whatever= | ||||
true.priority=1 | ||||
true.executable=cat | ||||
# hg update -C 1 | ||||
$ hg merge -r 4 --config merge-tools.true.premerge=keep-merge3 | ||||
merging f | ||||
|
r30460 | <<<<<<< working copy: ef83787e2614 - test: revision 1 | ||
|
r22032 | revision 1 | ||
space | ||||
||||||| base | ||||
revision 0 | ||||
space | ||||
======= | ||||
revision 4 | ||||
|
r30062 | >>>>>>> merge rev: 81448d39c9a0 - test: revision 4 | ||
|
r22032 | revision 0 | ||
space | ||||
revision 4 | ||||
0 files updated, 1 files merged, 0 files removed, 0 files unresolved | ||||
(branch merge, don't forget to commit) | ||||
$ aftermerge | ||||
# cat f | ||||
|
r30460 | <<<<<<< working copy: ef83787e2614 - test: revision 1 | ||
|
r22032 | revision 1 | ||
space | ||||
||||||| base | ||||
revision 0 | ||||
space | ||||
======= | ||||
revision 4 | ||||
|
r30062 | >>>>>>> merge rev: 81448d39c9a0 - test: revision 4 | ||
|
r22032 | # hg stat | ||
M f | ||||
|
r26897 | # hg resolve --list | ||
R f | ||||
|
r22032 | |||
|
r22030 | |||
|
r12460 | Tool execution | ||
|
r15243 | set tools.args explicit to include $base $local $other $output: | ||
|
r12460 | $ 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' | ||||
|
r13439 | merging f | ||
|
r12460 | ==> ... <== | ||
revision 0 | ||||
space | ||||
==> ... <== | ||||
revision 1 | ||||
space | ||||
==> ... <== | ||||
revision 2 | ||||
space | ||||
==> ... <== | ||||
revision 1 | ||||
space | ||||
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 | ||||
|
r26897 | # hg resolve --list | ||
R f | ||||
|
r15243 | |||
Merge with "echo mergeresult > $local": | ||||
|
r12460 | $ 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 | ||||
|
r26897 | # hg resolve --list | ||
R f | ||||
|
r15243 | |||
- and $local is the file f: | ||||
|
r12460 | $ 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 | ||||
|
r26897 | # hg resolve --list | ||
R f | ||||
|
r15243 | |||
Merge with "echo mergeresult > $output" - the variable is a bit magic: | ||||
|
r12460 | $ 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 | ||||
|
r26897 | # hg resolve --list | ||
R f | ||||
|
r12460 | |||
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 <<EOF > 'my merge tool' | ||||
> cat "\$1" "\$2" "\$3" > "\$4" | ||||
> EOF | ||||
|
r16967 | $ hg --config merge-tools.true.executable='sh' \ | ||
> --config merge-tools.true.args='"./my merge tool" $base $local $other $output' \ | ||||
> merge -r 2 | ||||
|
r12460 | 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 | ||||
|
r26897 | # hg resolve --list | ||
R f | ||||
|
r12460 | |||
|
r17885 | Issue3581: Merging a filename that needs to be quoted | ||
|
r17902 | (This test doesn't work on Windows filesystems even on Linux, so check | ||
for Unix-like permission) | ||||
|
r17885 | |||
|
r17902 | #if unix-permissions | ||
|
r17885 | $ beforemerge | ||
[merge-tools] | ||||
false.whatever= | ||||
true.priority=1 | ||||
true.executable=cat | ||||
# hg update -C 1 | ||||
$ echo "revision 5" > '"; exit 1; echo "' | ||||
$ hg commit -Am "revision 5" | ||||
adding "; exit 1; echo " | ||||
warning: filename contains '"', which is reserved on Windows: '"; exit 1; echo "' | ||||
|
r22029 | $ hg update -C 1 > /dev/null | ||
$ echo "revision 6" > '"; exit 1; echo "' | ||||
$ hg commit -Am "revision 6" | ||||
adding "; exit 1; echo " | ||||
warning: filename contains '"', which is reserved on Windows: '"; exit 1; echo "' | ||||
|
r17885 | created new head | ||
|
r22029 | $ hg merge --config merge-tools.true.executable="true" -r 5 | ||
|
r17885 | merging "; exit 1; echo " | ||
0 files updated, 1 files merged, 0 files removed, 0 files unresolved | ||||
(branch merge, don't forget to commit) | ||||
$ hg update -C 1 > /dev/null | ||||
|
r17901 | #endif | ||
|
r17885 | |||
|
r12460 | Merge post-processing | ||
cat is a bad merge-tool and doesn't change: | ||||
|
r16961 | $ beforemerge | ||
|
r12460 | [merge-tools] | ||
false.whatever= | ||||
true.priority=1 | ||||
true.executable=cat | ||||
# hg update -C 1 | ||||
|
r16961 | $ hg merge -y -r 2 --config merge-tools.true.checkchanged=1 | ||
|
r13439 | merging f | ||
|
r12460 | revision 1 | ||
space | ||||
revision 0 | ||||
space | ||||
revision 2 | ||||
space | ||||
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 | ||||
|
r16961 | [1] | ||
$ aftermerge | ||||
|
r12460 | # cat f | ||
revision 1 | ||||
space | ||||
# hg stat | ||||
M f | ||||
? f.orig | ||||
|
r26897 | # hg resolve --list | ||
U f | ||||
|
r18256 | |||
#if symlink | ||||
internal merge cannot handle symlinks and shouldn't try: | ||||
$ hg update -q -C 1 | ||||
$ rm f | ||||
$ ln -s symlink f | ||||
$ hg commit -qm 'f is symlink' | ||||
$ hg merge -r 2 --tool internal:merge | ||||
merging f | ||||
|
r22707 | warning: internal :merge cannot merge symlinks for f | ||
|
r26614 | warning: conflicts while merging f! (edit, then use 'hg resolve --mark') | ||
|
r18256 | 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] | ||||
#endif | ||||
|
r30538 | |||
Verify naming of temporary files and that extension is preserved: | ||||
$ hg update -q -C 1 | ||||
$ hg mv f f.txt | ||||
$ hg ci -qm "f.txt" | ||||
$ hg update -q -C 2 | ||||
$ hg merge -y -r tip --tool echo --config merge-tools.echo.args='$base $local $other $output' | ||||
merging f and f.txt to f.txt | ||||
*/f~base.?????? $TESTTMP/f.txt.orig */f~other.??????.txt $TESTTMP/f.txt (glob) | ||||
0 files updated, 1 files merged, 0 files removed, 0 files unresolved | ||||
(branch merge, don't forget to commit) | ||||