test-merge-tools.t
2088 lines
| 48.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 | ||||
|
r40501 | $ cat >> $HGRCPATH << EOF | ||
> [ui] | ||||
> merge= | ||||
> EOF | ||||
|
r38049 | $ hg init repo | ||
$ cd repo | ||||
|
r12460 | |||
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 | ||||
|
r44171 | $ PATH="/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 | ||
|
r35722 | use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon | ||
|
r12460 | [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 | ||||
|
r35722 | use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' 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 | ||
|
r44171 | $ PATH="`pwd`:/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 | ||
|
r35722 | use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon | ||
|
r15545 | [1] | ||
$ rm false | ||||
|
r24809 | #endif | ||
|
r15545 | executable directory in $PATH shouldn't be found: | ||
$ mkdir false | ||||
$ hg up -qC 1 | ||||
|
r44171 | $ PATH="`pwd`:/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 | ||
|
r35722 | use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon | ||
|
r15545 | [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 | ||||
|
r35722 | use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' 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 | ||||
|
r35722 | use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' 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 | ||||
|
r35722 | use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon | ||
|
r26730 | [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 | ||||
|
r35722 | use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' 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 | ||||
|
r35722 | use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' 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 | |||
|
r38052 | executable set to python script that succeeds: | ||
$ cat > "$TESTTMP/myworkingmerge.py" <<EOF | ||||
> def myworkingmergefn(ui, repo, args, **kwargs): | ||||
> return False | ||||
> EOF | ||||
$ beforemerge | ||||
[merge-tools] | ||||
false.whatever= | ||||
true.priority=1 | ||||
true.executable=cat | ||||
# hg update -C 1 | ||||
$ hg merge -r 2 --config merge-tools.true.executable="python:$TESTTMP/myworkingmerge.py:myworkingmergefn" | ||||
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 | ||||
# hg resolve --list | ||||
R f | ||||
executable set to python script that fails: | ||||
$ cat > "$TESTTMP/mybrokenmerge.py" <<EOF | ||||
> def mybrokenmergefn(ui, repo, args, **kwargs): | ||||
> ui.write(b"some fail message\n") | ||||
> return True | ||||
> EOF | ||||
$ beforemerge | ||||
[merge-tools] | ||||
false.whatever= | ||||
true.priority=1 | ||||
true.executable=cat | ||||
# hg update -C 1 | ||||
$ hg merge -r 2 --config merge-tools.true.executable="python:$TESTTMP/mybrokenmerge.py:mybrokenmergefn" | ||||
merging f | ||||
some fail message | ||||
abort: $TESTTMP/mybrokenmerge.py hook failed | ||||
[255] | ||||
$ aftermerge | ||||
# cat f | ||||
revision 1 | ||||
space | ||||
# hg stat | ||||
? f.orig | ||||
# hg resolve --list | ||||
U f | ||||
executable set to python script that is missing function: | ||||
$ beforemerge | ||||
[merge-tools] | ||||
false.whatever= | ||||
true.priority=1 | ||||
true.executable=cat | ||||
# hg update -C 1 | ||||
$ hg merge -r 2 --config merge-tools.true.executable="python:$TESTTMP/myworkingmerge.py:missingFunction" | ||||
merging f | ||||
abort: $TESTTMP/myworkingmerge.py does not have function: missingFunction | ||||
[255] | ||||
$ aftermerge | ||||
# cat f | ||||
revision 1 | ||||
space | ||||
# hg stat | ||||
? f.orig | ||||
# hg resolve --list | ||||
U f | ||||
executable set to missing python script: | ||||
$ beforemerge | ||||
[merge-tools] | ||||
false.whatever= | ||||
true.priority=1 | ||||
true.executable=cat | ||||
# hg update -C 1 | ||||
$ hg merge -r 2 --config merge-tools.true.executable="python:$TESTTMP/missingpythonscript.py:mergefn" | ||||
merging f | ||||
abort: loading python merge script failed: $TESTTMP/missingpythonscript.py | ||||
[255] | ||||
$ aftermerge | ||||
# cat f | ||||
revision 1 | ||||
space | ||||
# hg stat | ||||
? f.orig | ||||
# hg resolve --list | ||||
U f | ||||
executable set to python script but callable function is missing: | ||||
$ beforemerge | ||||
[merge-tools] | ||||
false.whatever= | ||||
true.priority=1 | ||||
true.executable=cat | ||||
# hg update -C 1 | ||||
$ hg merge -r 2 --config merge-tools.true.executable="python:$TESTTMP/myworkingmerge.py" | ||||
abort: invalid 'python:' syntax: python:$TESTTMP/myworkingmerge.py | ||||
[255] | ||||
$ aftermerge | ||||
# cat f | ||||
revision 1 | ||||
space | ||||
# hg stat | ||||
# hg resolve --list | ||||
U f | ||||
executable set to python script but callable function is empty string: | ||||
$ beforemerge | ||||
[merge-tools] | ||||
false.whatever= | ||||
true.priority=1 | ||||
true.executable=cat | ||||
# hg update -C 1 | ||||
$ hg merge -r 2 --config merge-tools.true.executable="python:$TESTTMP/myworkingmerge.py:" | ||||
abort: invalid 'python:' syntax: python:$TESTTMP/myworkingmerge.py: | ||||
[255] | ||||
$ aftermerge | ||||
# cat f | ||||
revision 1 | ||||
space | ||||
# hg stat | ||||
# hg resolve --list | ||||
U f | ||||
executable set to python script but callable function is missing and path contains colon: | ||||
$ beforemerge | ||||
[merge-tools] | ||||
false.whatever= | ||||
true.priority=1 | ||||
true.executable=cat | ||||
# hg update -C 1 | ||||
$ hg merge -r 2 --config merge-tools.true.executable="python:$TESTTMP/some:dir/myworkingmerge.py" | ||||
abort: invalid 'python:' syntax: python:$TESTTMP/some:dir/myworkingmerge.py | ||||
[255] | ||||
$ aftermerge | ||||
# cat f | ||||
revision 1 | ||||
space | ||||
# hg stat | ||||
# hg resolve --list | ||||
U f | ||||
executable set to python script filename that contains spaces: | ||||
$ mkdir -p "$TESTTMP/my path" | ||||
$ cat > "$TESTTMP/my path/my working merge with spaces in filename.py" <<EOF | ||||
> def myworkingmergefn(ui, repo, args, **kwargs): | ||||
> return False | ||||
> EOF | ||||
$ beforemerge | ||||
[merge-tools] | ||||
false.whatever= | ||||
true.priority=1 | ||||
true.executable=cat | ||||
# hg update -C 1 | ||||
$ hg merge -r 2 --config "merge-tools.true.executable=python:$TESTTMP/my path/my working merge with spaces in filename.py:myworkingmergefn" | ||||
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 | ||||
# hg resolve --list | ||||
R f | ||||
|
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 | ||||
|
r35722 | use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' 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 | ||
|
r32254 | couldn't find merge tool true (for pattern f) | ||
|
r12460 | merging f | ||
|
r32254 | couldn't find merge tool true (for pattern f) | ||
|
r12460 | merging f failed! | ||
0 files updated, 0 files merged, 0 files removed, 1 files unresolved | ||||
|
r35722 | use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' 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 | ||
|
r32254 | couldn't find merge tool true (for pattern f) | ||
|
r12460 | merging f | ||
|
r32254 | couldn't find merge tool true (for pattern f) | ||
|
r12460 | merging f failed! | ||
0 files updated, 0 files merged, 0 files removed, 1 files unresolved | ||||
|
r35722 | use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' 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 | ||||
|
r35722 | use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' 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 | ||
|
r35722 | use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' 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 | ||
|
r42765 | file 'f' needs to be resolved. | ||
You can keep (l)ocal [working copy], take (o)ther [merge rev], or leave (u)nresolved. | ||||
What do you want to do? u | ||||
|
r27164 | 0 files updated, 0 files merged, 0 files removed, 1 files unresolved | ||
|
r35722 | use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon | ||
|
r27164 | [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 | ||||
|
r42765 | file 'f' needs to be resolved. | ||
You can keep (l)ocal [working copy], take (o)ther [merge rev], or leave (u)nresolved. | ||||
What do you want to do? u | ||||
|
r27162 | 0 files updated, 0 files merged, 0 files removed, 1 files unresolved | ||
|
r35722 | use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon | ||
|
r27162 | [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 | ||||
|
r42765 | file 'f' needs to be resolved. | ||
You can keep (l)ocal [working copy], take (o)ther [merge rev], or leave (u)nresolved. | ||||
What do you want to do? | ||||
|
r26898 | 0 files updated, 0 files merged, 0 files removed, 1 files unresolved | ||
|
r35722 | use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon | ||
|
r26898 | [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 | ||||
|
r42765 | file 'f' needs to be resolved. | ||
You can keep (l)ocal [working copy], take (o)ther [merge rev], or leave (u)nresolved. | ||||
What do you want to do? | ||||
|
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 | ||||
|
r42765 | file 'f' needs to be resolved. | ||
You can keep (l)ocal [working copy], take (o)ther [merge rev], or leave (u)nresolved. | ||||
What do you want to do? | ||||
|
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 | ||||
|
r42765 | file 'f' needs to be resolved. | ||
You can keep (l)ocal [working copy], take (o)ther [merge rev], or leave (u)nresolved. | ||||
What do you want to do? 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 | ||||
|
r35722 | use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' 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 | ||||
|
r32255 | check that internal:dump doesn't dump files if premerge runs | ||
successfully | ||||
$ beforemerge | ||||
[merge-tools] | ||||
false.whatever= | ||||
true.priority=1 | ||||
true.executable=cat | ||||
# hg update -C 1 | ||||
$ hg merge -r 3 --config ui.merge=internal:dump | ||||
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 | ||||
revision 3 | ||||
# hg stat | ||||
M f | ||||
# hg resolve --list | ||||
R f | ||||
check that internal:forcedump dumps files, even if local and other can | ||||
be merged easily | ||||
$ beforemerge | ||||
[merge-tools] | ||||
false.whatever= | ||||
true.priority=1 | ||||
true.executable=cat | ||||
# hg update -C 1 | ||||
$ hg merge -r 3 --config ui.merge=internal:forcedump | ||||
merging f | ||||
0 files updated, 0 files merged, 0 files removed, 1 files unresolved | ||||
|
r35722 | use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon | ||
|
r32255 | [1] | ||
$ aftermerge | ||||
# cat f | ||||
revision 1 | ||||
space | ||||
# hg stat | ||||
M f | ||||
? f.base | ||||
? f.local | ||||
? f.orig | ||||
? f.other | ||||
# hg resolve --list | ||||
U f | ||||
$ cat f.base | ||||
revision 0 | ||||
space | ||||
$ cat f.local | ||||
revision 1 | ||||
space | ||||
$ cat f.other | ||||
revision 0 | ||||
space | ||||
revision 3 | ||||
$ rm -f f.base f.local f.other | ||||
|
r12460 | 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 | ||||
|
r35722 | use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' 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 | ||||
|
r35722 | use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' 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 | ||||
|
r35722 | use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' 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 | |||
|
r35925 | premerge=keep respects ui.mergemarkers=basic: | ||
$ 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 --config ui.mergemarkers=basic | ||||
merging f | ||||
<<<<<<< working copy | ||||
revision 1 | ||||
space | ||||
======= | ||||
revision 4 | ||||
>>>>>>> merge rev | ||||
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 | ||||
<<<<<<< working copy | ||||
revision 1 | ||||
space | ||||
======= | ||||
revision 4 | ||||
>>>>>>> merge rev | ||||
# hg stat | ||||
M f | ||||
# hg resolve --list | ||||
R f | ||||
premerge=keep ignores ui.mergemarkers=basic if true.mergemarkers=detailed: | ||||
$ 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 \ | ||||
> --config ui.mergemarkers=basic \ | ||||
> --config merge-tools.true.mergemarkers=detailed | ||||
merging f | ||||
<<<<<<< working copy: ef83787e2614 - test: revision 1 | ||||
revision 1 | ||||
space | ||||
======= | ||||
revision 4 | ||||
>>>>>>> merge rev: 81448d39c9a0 - test: revision 4 | ||||
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 | ||||
<<<<<<< working copy: ef83787e2614 - test: revision 1 | ||||
revision 1 | ||||
space | ||||
======= | ||||
revision 4 | ||||
>>>>>>> merge rev: 81448d39c9a0 - test: revision 4 | ||||
# hg stat | ||||
M f | ||||
# hg resolve --list | ||||
R f | ||||
premerge=keep respects ui.mergemarkertemplate instead of | ||||
true.mergemarkertemplate if true.mergemarkers=basic: | ||||
$ 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 \ | ||||
> --config ui.mergemarkertemplate='uitmpl {rev}' \ | ||||
> --config merge-tools.true.mergemarkertemplate='tooltmpl {short(node)}' | ||||
merging f | ||||
<<<<<<< working copy: uitmpl 1 | ||||
revision 1 | ||||
space | ||||
======= | ||||
revision 4 | ||||
>>>>>>> merge rev: uitmpl 4 | ||||
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 | ||||
<<<<<<< working copy: uitmpl 1 | ||||
revision 1 | ||||
space | ||||
======= | ||||
revision 4 | ||||
>>>>>>> merge rev: uitmpl 4 | ||||
# hg stat | ||||
M f | ||||
# hg resolve --list | ||||
R f | ||||
premerge=keep respects true.mergemarkertemplate instead of | ||||
true.mergemarkertemplate if true.mergemarkers=detailed: | ||||
$ 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 \ | ||||
> --config ui.mergemarkertemplate='uitmpl {rev}' \ | ||||
> --config merge-tools.true.mergemarkertemplate='tooltmpl {short(node)}' \ | ||||
> --config merge-tools.true.mergemarkers=detailed | ||||
merging f | ||||
<<<<<<< working copy: tooltmpl ef83787e2614 | ||||
revision 1 | ||||
space | ||||
======= | ||||
revision 4 | ||||
>>>>>>> merge rev: tooltmpl 81448d39c9a0 | ||||
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 | ||||
<<<<<<< working copy: tooltmpl ef83787e2614 | ||||
revision 1 | ||||
space | ||||
======= | ||||
revision 4 | ||||
>>>>>>> merge rev: tooltmpl 81448d39c9a0 | ||||
# hg stat | ||||
M f | ||||
# hg resolve --list | ||||
R f | ||||
|
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 | |||
|
r35925 | Merge using a tool that supports labellocal, labelother, and labelbase, checking | ||
that they're quoted properly as well. This is using the default 'basic' | ||||
mergemarkers even though ui.mergemarkers is 'detailed', so it's ignoring both | ||||
mergemarkertemplate settings: | ||||
$ beforemerge | ||||
[merge-tools] | ||||
false.whatever= | ||||
true.priority=1 | ||||
true.executable=cat | ||||
# hg update -C 1 | ||||
$ cat <<EOF > printargs_merge_tool | ||||
> while test \$# -gt 0; do echo arg: \"\$1\"; shift; done | ||||
> EOF | ||||
$ hg --config merge-tools.true.executable='sh' \ | ||||
> --config merge-tools.true.args='./printargs_merge_tool ll:$labellocal lo: $labelother lb:$labelbase": "$base' \ | ||||
> --config merge-tools.true.mergemarkertemplate='tooltmpl {short(node)}' \ | ||||
> --config ui.mergemarkertemplate='uitmpl {rev}' \ | ||||
> --config ui.mergemarkers=detailed \ | ||||
> merge -r 2 | ||||
merging f | ||||
arg: "ll:working copy" | ||||
arg: "lo:" | ||||
arg: "merge rev" | ||||
|
r36071 | arg: "lb:base: */f~base.*" (glob) | ||
|
r35925 | 0 files updated, 1 files merged, 0 files removed, 0 files unresolved | ||
(branch merge, don't forget to commit) | ||||
$ rm -f 'printargs_merge_tool' | ||||
|
r37017 | Same test with experimental.mergetempdirprefix set: | ||
$ beforemerge | ||||
[merge-tools] | ||||
false.whatever= | ||||
true.priority=1 | ||||
true.executable=cat | ||||
# hg update -C 1 | ||||
$ cat <<EOF > printargs_merge_tool | ||||
> while test \$# -gt 0; do echo arg: \"\$1\"; shift; done | ||||
> EOF | ||||
$ hg --config experimental.mergetempdirprefix=$TESTTMP/hgmerge. \ | ||||
> --config merge-tools.true.executable='sh' \ | ||||
> --config merge-tools.true.args='./printargs_merge_tool ll:$labellocal lo: $labelother lb:$labelbase": "$base' \ | ||||
> --config merge-tools.true.mergemarkertemplate='tooltmpl {short(node)}' \ | ||||
> --config ui.mergemarkertemplate='uitmpl {rev}' \ | ||||
> --config ui.mergemarkers=detailed \ | ||||
> merge -r 2 | ||||
merging f | ||||
arg: "ll:working copy" | ||||
arg: "lo:" | ||||
arg: "merge rev" | ||||
|
r37041 | arg: "lb:base: */hgmerge.*/f~base" (glob) | ||
|
r37017 | 0 files updated, 1 files merged, 0 files removed, 0 files unresolved | ||
(branch merge, don't forget to commit) | ||||
$ rm -f 'printargs_merge_tool' | ||||
|
r35925 | Merge using a tool that supports labellocal, labelother, and labelbase, checking | ||
that they're quoted properly as well. This is using 'detailed' mergemarkers, | ||||
even though ui.mergemarkers is 'basic', and using the tool's | ||||
mergemarkertemplate: | ||||
$ beforemerge | ||||
[merge-tools] | ||||
false.whatever= | ||||
true.priority=1 | ||||
true.executable=cat | ||||
# hg update -C 1 | ||||
$ cat <<EOF > printargs_merge_tool | ||||
> while test \$# -gt 0; do echo arg: \"\$1\"; shift; done | ||||
> EOF | ||||
$ hg --config merge-tools.true.executable='sh' \ | ||||
> --config merge-tools.true.args='./printargs_merge_tool ll:$labellocal lo: $labelother lb:$labelbase": "$base' \ | ||||
> --config merge-tools.true.mergemarkers=detailed \ | ||||
> --config merge-tools.true.mergemarkertemplate='tooltmpl {short(node)}' \ | ||||
> --config ui.mergemarkertemplate='uitmpl {rev}' \ | ||||
> --config ui.mergemarkers=basic \ | ||||
> merge -r 2 | ||||
merging f | ||||
arg: "ll:working copy: tooltmpl ef83787e2614" | ||||
arg: "lo:" | ||||
arg: "merge rev: tooltmpl 0185f4e0cf02" | ||||
|
r36071 | arg: "lb:base: */f~base.*" (glob) | ||
|
r35925 | 0 files updated, 1 files merged, 0 files removed, 0 files unresolved | ||
(branch merge, don't forget to commit) | ||||
$ rm -f 'printargs_merge_tool' | ||||
The merge tool still gets labellocal and labelother as 'basic' even when | ||||
premerge=keep is used and has 'detailed' markers: | ||||
$ beforemerge | ||||
[merge-tools] | ||||
false.whatever= | ||||
true.priority=1 | ||||
true.executable=cat | ||||
# hg update -C 1 | ||||
$ cat <<EOF > mytool | ||||
> echo labellocal: \"\$1\" | ||||
> echo labelother: \"\$2\" | ||||
> echo "output (arg)": \"\$3\" | ||||
> echo "output (contents)": | ||||
> cat "\$3" | ||||
> EOF | ||||
$ hg --config merge-tools.true.executable='sh' \ | ||||
> --config merge-tools.true.args='mytool $labellocal $labelother $output' \ | ||||
> --config merge-tools.true.premerge=keep \ | ||||
> --config merge-tools.true.mergemarkertemplate='tooltmpl {short(node)}' \ | ||||
> --config ui.mergemarkertemplate='uitmpl {rev}' \ | ||||
> --config ui.mergemarkers=detailed \ | ||||
> merge -r 2 | ||||
merging f | ||||
labellocal: "working copy" | ||||
labelother: "merge rev" | ||||
|
r38049 | output (arg): "$TESTTMP/repo/f" | ||
|
r35925 | output (contents): | ||
<<<<<<< working copy: uitmpl 1 | ||||
revision 1 | ||||
======= | ||||
revision 2 | ||||
>>>>>>> merge rev: uitmpl 2 | ||||
space | ||||
0 files updated, 1 files merged, 0 files removed, 0 files unresolved | ||||
(branch merge, don't forget to commit) | ||||
$ rm -f 'mytool' | ||||
premerge=keep uses the *tool's* mergemarkertemplate if tool's | ||||
mergemarkers=detailed; labellocal and labelother also use the tool's template | ||||
$ beforemerge | ||||
[merge-tools] | ||||
false.whatever= | ||||
true.priority=1 | ||||
true.executable=cat | ||||
# hg update -C 1 | ||||
$ cat <<EOF > mytool | ||||
> echo labellocal: \"\$1\" | ||||
> echo labelother: \"\$2\" | ||||
> echo "output (arg)": \"\$3\" | ||||
> echo "output (contents)": | ||||
> cat "\$3" | ||||
> EOF | ||||
$ hg --config merge-tools.true.executable='sh' \ | ||||
> --config merge-tools.true.args='mytool $labellocal $labelother $output' \ | ||||
> --config merge-tools.true.premerge=keep \ | ||||
> --config merge-tools.true.mergemarkers=detailed \ | ||||
> --config merge-tools.true.mergemarkertemplate='tooltmpl {short(node)}' \ | ||||
> --config ui.mergemarkertemplate='uitmpl {rev}' \ | ||||
> --config ui.mergemarkers=detailed \ | ||||
> merge -r 2 | ||||
merging f | ||||
labellocal: "working copy: tooltmpl ef83787e2614" | ||||
labelother: "merge rev: tooltmpl 0185f4e0cf02" | ||||
|
r38049 | output (arg): "$TESTTMP/repo/f" | ||
|
r35925 | output (contents): | ||
<<<<<<< working copy: tooltmpl ef83787e2614 | ||||
revision 1 | ||||
======= | ||||
revision 2 | ||||
>>>>>>> merge rev: tooltmpl 0185f4e0cf02 | ||||
space | ||||
0 files updated, 1 files merged, 0 files removed, 0 files unresolved | ||||
(branch merge, don't forget to commit) | ||||
$ rm -f 'mytool' | ||||
|
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 | ||||
|
r39219 | |||
#else | ||||
Match the non-portable filename commits above for test stability | ||||
$ hg import --bypass -q - << EOF | ||||
> # HG changeset patch | ||||
> revision 5 | ||||
> | ||||
> diff --git a/"; exit 1; echo " b/"; exit 1; echo " | ||||
> new file mode 100644 | ||||
> --- /dev/null | ||||
> +++ b/"; exit 1; echo " | ||||
> @@ -0,0 +1,1 @@ | ||||
> +revision 5 | ||||
> EOF | ||||
$ hg import --bypass -q - << EOF | ||||
> # HG changeset patch | ||||
> revision 6 | ||||
> | ||||
> diff --git a/"; exit 1; echo " b/"; exit 1; echo " | ||||
> new file mode 100644 | ||||
> --- /dev/null | ||||
> +++ b/"; exit 1; echo " | ||||
> @@ -0,0 +1,1 @@ | ||||
> +revision 6 | ||||
> EOF | ||||
|
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 | ||||
|
r35722 | use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon | ||
|
r16961 | [1] | ||
$ aftermerge | ||||
|
r12460 | # cat f | ||
revision 1 | ||||
space | ||||
# hg stat | ||||
M f | ||||
? f.orig | ||||
|
r26897 | # hg resolve --list | ||
U f | ||||
|
r18256 | |||
|
r38986 | missingbinary is a merge-tool that doesn't exist: | ||
$ echo "missingbinary.executable=doesnotexist" >> .hg/hgrc | ||||
$ beforemerge | ||||
[merge-tools] | ||||
false.whatever= | ||||
true.priority=1 | ||||
true.executable=cat | ||||
missingbinary.executable=doesnotexist | ||||
# hg update -C 1 | ||||
$ hg merge -y -r 2 --config ui.merge=missingbinary | ||||
|
r38987 | couldn't find merge tool missingbinary (for pattern f) | ||
|
r38986 | merging f | ||
|
r38987 | couldn't find merge tool missingbinary (for pattern f) | ||
|
r38986 | 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) | ||||
|
r39219 | $ hg update -q -C 1 | ||
$ rm f | ||||
|
r18256 | |||
internal merge cannot handle symlinks and shouldn't try: | ||||
|
r39219 | #if symlink | ||
|
r18256 | $ ln -s symlink f | ||
$ hg commit -qm 'f is symlink' | ||||
|
r39219 | |||
#else | ||||
$ hg import --bypass -q - << EOF | ||||
> # HG changeset patch | ||||
> f is symlink | ||||
> | ||||
> diff --git a/f b/f | ||||
> old mode 100644 | ||||
> new mode 120000 | ||||
> --- a/f | ||||
> +++ b/f | ||||
> @@ -1,2 +1,1 @@ | ||||
> -revision 1 | ||||
> -space | ||||
> +symlink | ||||
> \ No newline at end of file | ||||
> EOF | ||||
Resolve 'other [destination] changed f which local [working copy] deleted' prompt | ||||
$ hg up -q -C --config ui.interactive=True << EOF | ||||
> c | ||||
> EOF | ||||
#endif | ||||
|
r18256 | $ 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 | ||
|
r35722 | use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon | ||
|
r18256 | [1] | ||
|
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 | ||||
|
r38049 | */f~base.* */f~local.*.txt */f~other.*.txt $TESTTMP/repo/f.txt (glob) | ||
|
r30538 | 0 files updated, 1 files merged, 0 files removed, 0 files unresolved | ||
(branch merge, don't forget to commit) | ||||
|
r32256 | |||
|
r37017 | Verify naming of temporary files and that extension is preserved | ||
(experimental.mergetempdirprefix version): | ||||
$ 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' \ | ||||
> --config experimental.mergetempdirprefix=$TESTTMP/hgmerge. | ||||
merging f and f.txt to f.txt | ||||
|
r38049 | $TESTTMP/hgmerge.*/f~base $TESTTMP/hgmerge.*/f~local.txt $TESTTMP/hgmerge.*/f~other.txt $TESTTMP/repo/f.txt (glob) | ||
|
r37017 | 0 files updated, 1 files merged, 0 files removed, 0 files unresolved | ||
(branch merge, don't forget to commit) | ||||
|
r39160 | Binary files capability checking | ||
$ hg update -q -C 0 | ||||
$ python <<EOF | ||||
> with open('b', 'wb') as fp: | ||||
> fp.write(b'\x00\x01\x02\x03') | ||||
> EOF | ||||
$ hg add b | ||||
$ hg commit -qm "add binary file (#1)" | ||||
$ hg update -q -C 0 | ||||
$ python <<EOF | ||||
> with open('b', 'wb') as fp: | ||||
> fp.write(b'\x03\x02\x01\x00') | ||||
> EOF | ||||
$ hg add b | ||||
$ hg commit -qm "add binary file (#2)" | ||||
By default, binary files capability of internal merge tools is not | ||||
checked strictly. | ||||
(for merge-patterns, chosen unintentionally) | ||||
$ hg merge 9 \ | ||||
> --config merge-patterns.b=:merge-other \ | ||||
> --config merge-patterns.re:[a-z]=:other | ||||
warning: check merge-patterns configurations, if ':merge-other' for binary file 'b' is unintentional | ||||
(see 'hg help merge-tools' for binary files capability) | ||||
merging b | ||||
warning: b looks like a binary file. | ||||
0 files updated, 0 files merged, 0 files removed, 1 files unresolved | ||||
use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon | ||||
[1] | ||||
$ hg merge --abort -q | ||||
|
r39161 | (for ui.merge, ignored unintentionally) | ||
$ hg merge 9 \ | ||||
|
r39302 | > --config merge-tools.:other.binary=true \ | ||
|
r39161 | > --config ui.merge=:other | ||
tool :other (for pattern b) can't handle binary | ||||
tool true can't handle binary | ||||
|
r39302 | tool :other can't handle binary | ||
|
r39161 | tool false can't handle binary | ||
no tool found to merge b | ||||
|
r42765 | file 'b' needs to be resolved. | ||
You can keep (l)ocal [working copy], take (o)ther [merge rev], or leave (u)nresolved. | ||||
What do you want to do? u | ||||
|
r39161 | 0 files updated, 0 files merged, 0 files removed, 1 files unresolved | ||
use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon | ||||
[1] | ||||
$ hg merge --abort -q | ||||
With merge.strict-capability-check=true, binary files capability of | ||||
internal merge tools is checked strictly. | ||||
$ f --hexdump b | ||||
b: | ||||
0000: 03 02 01 00 |....| | ||||
(for merge-patterns) | ||||
$ hg merge 9 --config merge.strict-capability-check=true \ | ||||
|
r39302 | > --config merge-tools.:merge-other.binary=true \ | ||
|
r39161 | > --config merge-patterns.b=:merge-other \ | ||
> --config merge-patterns.re:[a-z]=:other | ||||
tool :merge-other (for pattern b) can't handle binary | ||||
0 files updated, 1 files merged, 0 files removed, 0 files unresolved | ||||
(branch merge, don't forget to commit) | ||||
$ f --hexdump b | ||||
b: | ||||
0000: 00 01 02 03 |....| | ||||
$ hg merge --abort -q | ||||
(for ui.merge) | ||||
$ hg merge 9 --config merge.strict-capability-check=true \ | ||||
> --config ui.merge=:other | ||||
0 files updated, 1 files merged, 0 files removed, 0 files unresolved | ||||
(branch merge, don't forget to commit) | ||||
$ f --hexdump b | ||||
b: | ||||
0000: 00 01 02 03 |....| | ||||
$ hg merge --abort -q | ||||
|
r40512 | Check that the extra information is printed correctly | ||
$ hg merge 9 \ | ||||
> --config merge-tools.testecho.executable='echo' \ | ||||
> --config merge-tools.testecho.args='merge runs here ...' \ | ||||
> --config merge-tools.testecho.binary=True \ | ||||
> --config ui.merge=testecho \ | ||||
> --config ui.pre-merge-tool-output-template='\n{label("extmerge.running_merge_tool", "Running merge tool for {path} ({toolpath}):")}\n{separate("\n", extmerge_section(local), extmerge_section(base), extmerge_section(other))}\n' \ | ||||
> --config 'templatealias.extmerge_section(sect)="- {pad("{sect.name} ({sect.label})", 20, left=True)}: {revset(sect.node)%"{rev}:{shortest(node,8)} {desc|firstline} {separate(" ", tags, bookmarks, branch)}"}"' | ||||
merging b | ||||
|
r40521 | Running merge tool for b ("*/bin/echo.exe"): (glob) (windows !) | ||
Running merge tool for b (*/bin/echo): (glob) (no-windows !) | ||||
|
r40512 | - local (working copy): 10:2d1f533d add binary file (#2) tip default | ||
- base (base): -1:00000000 default | ||||
- other (merge rev): 9:1e7ad7d7 add binary file (#1) default | ||||
merge runs here ... | ||||
0 files updated, 1 files merged, 0 files removed, 0 files unresolved | ||||
(branch merge, don't forget to commit) | ||||
|
r32256 | Check that debugpicktool examines which merge tool is chosen for | ||
specified file as expected | ||||
$ beforemerge | ||||
[merge-tools] | ||||
false.whatever= | ||||
true.priority=1 | ||||
true.executable=cat | ||||
|
r38986 | missingbinary.executable=doesnotexist | ||
|
r32256 | # hg update -C 1 | ||
(default behavior: checking files in the working parent context) | ||||
$ hg manifest | ||||
f | ||||
$ hg debugpickmergetool | ||||
f = true | ||||
(-X/-I and file patterns limmit examination targets) | ||||
$ hg debugpickmergetool -X f | ||||
$ hg debugpickmergetool unknown | ||||
unknown: no such file in rev ef83787e2614 | ||||
(--changedelete emulates merging change and delete) | ||||
$ hg debugpickmergetool --changedelete | ||||
f = :prompt | ||||
(-r REV causes checking files in specified revision) | ||||
|
r39160 | $ hg manifest -r 8 | ||
|
r32256 | f.txt | ||
|
r39160 | $ hg debugpickmergetool -r 8 | ||
|
r32256 | f.txt = true | ||
#if symlink | ||||
(symlink causes chosing :prompt) | ||||
$ hg debugpickmergetool -r 6d00b3726f6e | ||||
f = :prompt | ||||
|
r39161 | (by default, it is assumed that no internal merge tools has symlinks | ||
capability) | ||||
$ hg debugpickmergetool \ | ||||
> -r 6d00b3726f6e \ | ||||
|
r39302 | > --config merge-tools.:merge-other.symlink=true \ | ||
|
r39161 | > --config merge-patterns.f=:merge-other \ | ||
> --config merge-patterns.re:[f]=:merge-local \ | ||||
> --config merge-patterns.re:[a-z]=:other | ||||
f = :prompt | ||||
$ hg debugpickmergetool \ | ||||
> -r 6d00b3726f6e \ | ||||
|
r39302 | > --config merge-tools.:other.symlink=true \ | ||
|
r39161 | > --config ui.merge=:other | ||
f = :prompt | ||||
(with strict-capability-check=true, actual symlink capabilities are | ||||
checked striclty) | ||||
$ hg debugpickmergetool --config merge.strict-capability-check=true \ | ||||
> -r 6d00b3726f6e \ | ||||
|
r39302 | > --config merge-tools.:merge-other.symlink=true \ | ||
|
r39161 | > --config merge-patterns.f=:merge-other \ | ||
> --config merge-patterns.re:[f]=:merge-local \ | ||||
> --config merge-patterns.re:[a-z]=:other | ||||
f = :other | ||||
$ hg debugpickmergetool --config merge.strict-capability-check=true \ | ||||
> -r 6d00b3726f6e \ | ||||
> --config ui.merge=:other | ||||
f = :other | ||||
|
r39302 | $ hg debugpickmergetool --config merge.strict-capability-check=true \ | ||
> -r 6d00b3726f6e \ | ||||
> --config merge-tools.:merge-other.symlink=true \ | ||||
> --config ui.merge=:merge-other | ||||
f = :prompt | ||||
|
r32256 | #endif | ||
(--verbose shows some configurations) | ||||
$ hg debugpickmergetool --tool foobar -v | ||||
with --tool 'foobar' | ||||
f = foobar | ||||
$ HGMERGE=false hg debugpickmergetool -v | ||||
with HGMERGE='false' | ||||
f = false | ||||
$ hg debugpickmergetool --config ui.merge=false -v | ||||
with ui.merge='false' | ||||
f = false | ||||
(--debug shows errors detected intermediately) | ||||
$ hg debugpickmergetool --config merge-patterns.f=true --config merge-tools.true.executable=nonexistentmergetool --debug f | ||||
couldn't find merge tool true (for pattern f) | ||||
couldn't find merge tool true | ||||
f = false | ||||
|
r38049 | |||
$ cd .. | ||||