extdiff: allow a preconfigured merge-tool to be invoked
There are three ways to configure an extdiff tool:
1) cmd.tool = (/path/to/exe optional)
2) tool = (path/to/exe optional)
3) tool = sometool someargs
Previously, if no executable is specified in the first two forms, the named tool
must be in $PATH, or the invocation fails. Since the [merge-tools] section
already has the path to the diff executable, and/or the registry keys to find
the executable on Windows, reuse that configuration for forms 1 and 2 instead of
failing. We already fallback to [diff-tools] and then [merge-tools] for program
arguments if they aren't specified in the [extdiff] section.
Since this additional lookup only occurs if an executable is not on the $PATH
for the named tool, this is backwards compatible. For now, we assume the user
knows what he is doing if a path is provided.
This change allows a configuration file like this (assuming beyondcompare3 is
configured in merge-tools), instead of hardcoding system specific a path:
[extdiff]
beyondcompare3 =
Tests of 'hg status --rev <rev>' to make sure status between <rev> and '.' get
combined correctly with the dirstate status.
Sets up a history for a number of files where the filename describes the file's
history. The first two letters of the filename describe the first two commits;
the third letter describes the dirstate for the file. For example, a file called
'amr' was added in the first commit, modified in the second and then removed in
the dirstate.
These codes are used for commits:
x: does not exist
a: added
c: clean
m: modified
r: removed
These codes are used for dirstate:
d: in dirstate, but deleted from disk
f: removed from dirstate, but file exists (forgotten)
r: removed from dirstate and disk
q: added, but deleted from disk (q for q-rious?)
u: not in dirstate, but file exists (unknown)
$ hg init
$ touch .hgignore
$ hg add .hgignore
$ hg commit -m initial
First letter: first commit
$ echo a >acc
$ echo a >acd
$ echo a >acf
$ echo a >acm
$ echo a >acr
$ echo a >amc
$ echo a >amd
$ echo a >amf
$ echo a >amm
$ echo a >amr
$ echo a >ara
$ echo a >arq
$ echo a >aru
$ hg commit -Aqm first
Second letter: second commit
$ echo b >xad
$ echo b >xaf
$ echo b >xam
$ echo b >xar
$ echo b >amc
$ echo b >amd
$ echo b >amf
$ echo b >amm
$ echo b >amr
$ hg rm ara
$ hg rm arq
$ hg rm aru
$ hg commit -Aqm second
Third letter: dirstate
$ echo c >acm
$ echo c >amm
$ echo c >xam
$ echo c >ara && hg add ara
$ echo c >arq && hg add arq && rm arq
$ echo c >aru
$ hg rm amr
$ hg rm acr
$ hg rm xar
$ rm acd
$ rm amd
$ rm xad
$ hg forget acf
$ hg forget amf
$ hg forget xaf
$ touch xxu
Status compared to one revision back
$ hg status -A --rev 1 acc
C acc
BROKEN: file appears twice; should be '!'
$ hg status -A --rev 1 acd
! acd
C acd
$ hg status -A --rev 1 acf
R acf
$ hg status -A --rev 1 acm
M acm
$ hg status -A --rev 1 acr
R acr
$ hg status -A --rev 1 amc
M amc
BROKEN: file appears twice; should be '!'
$ hg status -A --rev 1 amd
! amd
C amd
$ hg status -A --rev 1 amf
R amf
$ hg status -A --rev 1 amm
M amm
$ hg status -A --rev 1 amr
R amr
$ hg status -A --rev 1 ara
M ara
BROKEN: file appears twice; should be '!'
$ hg status -A --rev 1 arq
R arq
! arq
$ hg status -A --rev 1 aru
R aru
$ hg status -A --rev 1 xad
! xad
$ hg status -A --rev 1 xaf
$ hg status -A --rev 1 xam
A xam
$ hg status -A --rev 1 xar
$ hg status -A --rev 1 xxu
? xxu
Status compared to two revisions back
$ hg status -A --rev 0 acc
A acc
$ hg status -A --rev 0 acd
! acd
BROKEN: file exists, so should be listed (as '?')
$ hg status -A --rev 0 acf
$ hg status -A --rev 0 acm
A acm
$ hg status -A --rev 0 acr
$ hg status -A --rev 0 amc
A amc
$ hg status -A --rev 0 amd
! amd
BROKEN: file exists, so should be listed (as '?')
$ hg status -A --rev 0 amf
$ hg status -A --rev 0 amm
A amm
$ hg status -A --rev 0 amr
$ hg status -A --rev 0 ara
A ara
$ hg status -A --rev 0 arq
! arq
$ hg status -A --rev 0 aru
? aru
$ hg status -A --rev 0 xad
! xad
BROKEN: file exists, so should be listed (as '?')
$ hg status -A --rev 0 xaf
$ hg status -A --rev 0 xam
A xam
$ hg status -A --rev 0 xar