2019-12-10 02:24:31 +03:00
|
|
|
#chg-compatible
|
|
|
|
|
2020-01-20 13:42:49 +03:00
|
|
|
$ enable extdiff
|
2010-09-15 18:27:39 +04:00
|
|
|
|
|
|
|
$ hg init a
|
|
|
|
$ cd a
|
|
|
|
$ echo a > a
|
|
|
|
$ echo b > b
|
|
|
|
$ hg add
|
|
|
|
adding a
|
|
|
|
adding b
|
|
|
|
|
|
|
|
Should diff cloned directories:
|
|
|
|
|
|
|
|
$ hg extdiff -o -r $opt
|
|
|
|
Only in a: a
|
|
|
|
Only in a: b
|
2010-09-17 02:51:32 +04:00
|
|
|
[1]
|
2010-09-15 18:27:39 +04:00
|
|
|
|
2014-11-04 17:41:46 +03:00
|
|
|
$ cat <<EOF >> $HGRCPATH
|
|
|
|
> [extdiff]
|
|
|
|
> cmd.falabala = echo
|
|
|
|
> opts.falabala = diffing
|
|
|
|
> cmd.edspace = echo
|
|
|
|
> opts.edspace = "name <user@example.com>"
|
|
|
|
> EOF
|
2010-09-15 18:27:39 +04:00
|
|
|
|
|
|
|
$ hg falabala
|
|
|
|
diffing a.000000000000 a
|
2010-09-17 02:51:32 +04:00
|
|
|
[1]
|
2010-09-15 18:27:39 +04:00
|
|
|
|
|
|
|
$ hg help falabala
|
|
|
|
hg falabala [OPTION]... [FILE]...
|
|
|
|
|
2016-07-27 15:44:49 +03:00
|
|
|
use external program to diff repository (or selected files)
|
2010-09-15 18:27:39 +04:00
|
|
|
|
|
|
|
Show differences between revisions for the specified files, using the
|
2016-07-27 15:44:49 +03:00
|
|
|
following program:
|
|
|
|
|
|
|
|
'echo'
|
2010-09-15 18:27:39 +04:00
|
|
|
|
|
|
|
When two revision arguments are given, then changes are shown between
|
|
|
|
those revisions. If only one revision is specified then that revision is
|
|
|
|
compared to the working directory, and, when no revisions are specified,
|
|
|
|
the working directory files are compared to its parent.
|
|
|
|
|
2018-10-15 19:35:15 +03:00
|
|
|
Options ([+] can be repeated):
|
2010-09-15 18:27:39 +04:00
|
|
|
|
2011-09-21 22:00:48 +04:00
|
|
|
-o --option OPT [+] pass option to comparison program
|
|
|
|
-r --rev REV [+] revision
|
|
|
|
-c --change REV change made by revision
|
help: backout 6f89f03ad369 (mark boolean flags with [no-] in help) for now
The ability to negate any boolean flags itself is great, but I think we are not
ready to expose the help side of it yet.
First, while there exist a handful of such flags whose default value can be
changed (eg: git diff, patchwork confirmation), there is only a few of them. The
users who benefit the most from this change are alias users and large
installation that can deploy extension to change behavior (eg: facebook
tweakdefault). So the majority of user who will be affected by a large change
to command help that is not yet relevant to them. (I expect this to become
relevant when ui.progressive start to exists).
Below is an example of the impact of the new help on 'hg help diff':
-r --rev REV [+] revision
-c --change REV change made by revision
-a --[no-]text treat all files as text
-g --[no-]git use git extended diff format
--[no-]nodates omit dates from diff headers
--[no-]noprefix omit a/ and b/ prefixes from filenames
-p --[no-]show-function show which function each change is in
--[no-]reverse produce a diff that undoes the changes
-w --[no-]ignore-all-space ignore white space when comparing lines
-b --[no-]ignore-space-change ignore changes in the amount of white space
-B --[no-]ignore-blank-lines ignore changes whose lines are all blank
-U --unified NUM number of lines of context to show
--[no-]stat output diffstat-style summary of changes
--root DIR produce diffs relative to subdirectory
-I --include PATTERN [+] include names matching the given patterns
-X --exclude PATTERN [+] exclude names matching the given patterns
-S --[no-]subrepos recurse into subrepositories
Another issue with the current state of help, the default value for the
flag is not conveyed to the user. For example in the 'backout' help, there is
no real distinction between "--[no-]backup" (default to True) and "--[no-]keep"
(default) to False:
--[no-]backup no backups
--[no-]keep do not modify working directory during strip
In addition, I've discussed with Augie Fackler and the last batch of the work on
this have burned him out quite some. Therefore he is not intending to perform
any more work on this topic. Quoting him, he would rather see the help part
backed out than spending more time on it.
I do not think we are ready to expose this to users in 4.0 (freeze in a week),
especially because we cannot expect quick improvement on these aspect as this
topic no longer have an owner. We should be able to reintroduce that change in
the future when someone get back on it and the main issues are solves:
* Introduction of ui.progressive makes it relevant for a majority of user,
* Current default value are efficiently conveyed to the user.
(In addition, the excerpt from diff help show that we still have some issue with
some negative option like '--nodates' so further improvement are probably
welcome there.)
2016-10-09 04:11:18 +03:00
|
|
|
--patch compare patches for two revisions
|
2011-09-21 22:00:48 +04:00
|
|
|
-I --include PATTERN [+] include names matching the given patterns
|
|
|
|
-X --exclude PATTERN [+] exclude names matching the given patterns
|
2010-09-15 18:27:39 +04:00
|
|
|
|
2014-08-12 12:01:37 +04:00
|
|
|
(some details hidden, use --verbose to show complete help)
|
2010-09-15 18:27:39 +04:00
|
|
|
|
|
|
|
$ hg ci -d '0 0' -mtest1
|
|
|
|
|
|
|
|
$ echo b >> a
|
|
|
|
$ hg ci -d '1 0' -mtest2
|
|
|
|
|
|
|
|
Should diff cloned files directly:
|
|
|
|
|
2015-04-30 04:14:59 +03:00
|
|
|
$ hg falabala -r 0:1
|
2017-05-06 21:36:26 +03:00
|
|
|
diffing "*\\extdiff.*\\a.8a5febb7f867\\a" "a.34eed99112ab\\a" (glob) (windows !)
|
|
|
|
diffing */extdiff.*/a.8a5febb7f867/a a.34eed99112ab/a (glob) (no-windows !)
|
2015-04-30 04:14:59 +03:00
|
|
|
[1]
|
2010-09-15 18:27:39 +04:00
|
|
|
|
2015-11-01 04:45:46 +03:00
|
|
|
Specifying an empty revision should abort.
|
|
|
|
|
2016-02-10 20:15:45 +03:00
|
|
|
$ hg extdiff -p diff --patch --rev 'ancestor()' --rev 1
|
2015-11-01 04:45:46 +03:00
|
|
|
abort: empty revision on one side of range
|
|
|
|
[255]
|
|
|
|
|
2010-09-15 18:27:39 +04:00
|
|
|
Test diff during merge:
|
|
|
|
|
|
|
|
$ hg update -C 0
|
|
|
|
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
|
|
|
|
$ echo c >> c
|
|
|
|
$ hg add c
|
|
|
|
$ hg ci -m "new branch" -d '1 0'
|
|
|
|
$ hg merge 1
|
|
|
|
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
|
|
|
|
(branch merge, don't forget to commit)
|
|
|
|
|
|
|
|
Should diff cloned file against wc file:
|
|
|
|
|
2010-09-30 11:49:40 +04:00
|
|
|
$ hg falabala
|
2017-05-06 21:36:26 +03:00
|
|
|
diffing "*\\extdiff.*\\a.2a13a4d2da36\\a" "*\\a\\a" (glob) (windows !)
|
|
|
|
diffing */extdiff.*/a.2a13a4d2da36/a */a/a (glob) (no-windows !)
|
2010-09-17 02:51:32 +04:00
|
|
|
[1]
|
2010-09-15 18:27:39 +04:00
|
|
|
|
|
|
|
|
|
|
|
Test --change option:
|
|
|
|
|
|
|
|
$ hg ci -d '2 0' -mtest3
|
2017-05-06 21:36:26 +03:00
|
|
|
|
2010-09-15 18:27:39 +04:00
|
|
|
$ hg falabala -c 1
|
2017-05-06 21:36:26 +03:00
|
|
|
diffing "*\\extdiff.*\\a.8a5febb7f867\\a" "a.34eed99112ab\\a" (glob) (windows !)
|
|
|
|
diffing */extdiff.*/a.8a5febb7f867/a a.34eed99112ab/a (glob) (no-windows !)
|
2010-09-17 02:51:32 +04:00
|
|
|
[1]
|
2010-09-15 18:27:39 +04:00
|
|
|
|
|
|
|
Check diff are made from the first parent:
|
|
|
|
|
|
|
|
$ hg falabala -c 3 || echo "diff-like tools yield a non-zero exit code"
|
2017-05-06 21:36:26 +03:00
|
|
|
diffing "*\\extdiff.*\\a.2a13a4d2da36\\a" "a.46c0e4daeb72\\a" (glob) (windows !)
|
|
|
|
diffing */extdiff.*/a.2a13a4d2da36/a a.46c0e4daeb72/a (glob) (no-windows !)
|
2010-09-15 18:27:39 +04:00
|
|
|
diff-like tools yield a non-zero exit code
|
|
|
|
|
extdiff: avoid unexpected quoting arguments for external tools (issue4463)
Before this patch, all command line arguments for external tools are
quoted by the combination of "shlex.split" and "util.shellquote". But
this causes some problems.
- some problematic commands can't work correctly with quoted arguments
For example, 'WinMerge /r ....' is OK, but 'WinMerge "/r" ....' is
NG. See also below for detail about this problem.
https://bitbucket.org/tortoisehg/thg/issue/3978/
- quoting itself may change semantics of arguments
For example, when the environment variable CONCAT="foo bar baz':
- mydiff $CONCAT => mydiff foo bar baz (taking 3 arguments)
- mydiff "$CONCAT" => mydiff "foo bar baz" (taking only 1 argument)
For another example, single quoting (= "util.shellquote") on POSIX
environment prevents shells from expanding environment variables,
tilde, and so on:
- mydiff "$HOME" => mydiff /home/foobar
- mydiff '$HOME' => mydiff $HOME
- "shlex.split" can't handle some special characters correctly
It just splits specified command line by whitespaces.
For example, "echo foo;echo bar" is split into ["echo",
"foo;echo", "bar"].
On the other hand, if quoting itself is omitted, users can't specify
options including space characters with "--option" at runtime.
The root cause of this issue is that "shlex.split + util.shellquote"
combination loses whether users really want to quote each command line
elements or not, even though these can be quoted arbitrarily in
configurations.
To resolve this problem, this patch does:
- prevent configurations from being processed by "shlex.split" and
"util.shellquote"
only (possibly) "findexe"-ed or "findexternaltool"-ed command path
is "util.shellquote", because it may contain whitespaces.
- quote options specified by "--option" via command line at runtime
This patch also makes "dodiff()" take only one "args" argument instead
of "diffcmd" and "diffopts. It also omits applying "util.shellquote"
on "args", because "args" should be already stringified in "extdiff()"
and "mydiff()".
The last hunk for "test-extdiff.t" replaces two whitespaces by single
whitespace, because change of "' '.join()" logic causes omitting
redundant whitespaces.
2014-12-25 17:33:26 +03:00
|
|
|
issue4463: usage of command line configuration without additional quoting
|
|
|
|
|
|
|
|
$ cat <<EOF >> $HGRCPATH
|
|
|
|
> [extdiff]
|
|
|
|
> cmd.4463a = echo
|
|
|
|
> opts.4463a = a-naked 'single quoted' "double quoted"
|
|
|
|
> 4463b = echo b-naked 'single quoted' "double quoted"
|
|
|
|
> echo =
|
|
|
|
> EOF
|
|
|
|
$ hg update -q -C 0
|
|
|
|
$ echo a >> a
|
2017-05-06 21:36:26 +03:00
|
|
|
|
extdiff: avoid unexpected quoting arguments for external tools (issue4463)
Before this patch, all command line arguments for external tools are
quoted by the combination of "shlex.split" and "util.shellquote". But
this causes some problems.
- some problematic commands can't work correctly with quoted arguments
For example, 'WinMerge /r ....' is OK, but 'WinMerge "/r" ....' is
NG. See also below for detail about this problem.
https://bitbucket.org/tortoisehg/thg/issue/3978/
- quoting itself may change semantics of arguments
For example, when the environment variable CONCAT="foo bar baz':
- mydiff $CONCAT => mydiff foo bar baz (taking 3 arguments)
- mydiff "$CONCAT" => mydiff "foo bar baz" (taking only 1 argument)
For another example, single quoting (= "util.shellquote") on POSIX
environment prevents shells from expanding environment variables,
tilde, and so on:
- mydiff "$HOME" => mydiff /home/foobar
- mydiff '$HOME' => mydiff $HOME
- "shlex.split" can't handle some special characters correctly
It just splits specified command line by whitespaces.
For example, "echo foo;echo bar" is split into ["echo",
"foo;echo", "bar"].
On the other hand, if quoting itself is omitted, users can't specify
options including space characters with "--option" at runtime.
The root cause of this issue is that "shlex.split + util.shellquote"
combination loses whether users really want to quote each command line
elements or not, even though these can be quoted arbitrarily in
configurations.
To resolve this problem, this patch does:
- prevent configurations from being processed by "shlex.split" and
"util.shellquote"
only (possibly) "findexe"-ed or "findexternaltool"-ed command path
is "util.shellquote", because it may contain whitespaces.
- quote options specified by "--option" via command line at runtime
This patch also makes "dodiff()" take only one "args" argument instead
of "diffcmd" and "diffopts. It also omits applying "util.shellquote"
on "args", because "args" should be already stringified in "extdiff()"
and "mydiff()".
The last hunk for "test-extdiff.t" replaces two whitespaces by single
whitespace, because change of "' '.join()" logic causes omitting
redundant whitespaces.
2014-12-25 17:33:26 +03:00
|
|
|
$ hg --debug 4463a | grep '^running'
|
2017-05-06 21:36:26 +03:00
|
|
|
running 'echo a-naked \'single quoted\' "double quoted" "*\\a" "*\\a"' in */extdiff.* (glob) (windows !)
|
|
|
|
running 'echo a-naked \'single quoted\' "double quoted" */a $TESTTMP/a/a' in */extdiff.* (glob) (no-windows !)
|
extdiff: avoid unexpected quoting arguments for external tools (issue4463)
Before this patch, all command line arguments for external tools are
quoted by the combination of "shlex.split" and "util.shellquote". But
this causes some problems.
- some problematic commands can't work correctly with quoted arguments
For example, 'WinMerge /r ....' is OK, but 'WinMerge "/r" ....' is
NG. See also below for detail about this problem.
https://bitbucket.org/tortoisehg/thg/issue/3978/
- quoting itself may change semantics of arguments
For example, when the environment variable CONCAT="foo bar baz':
- mydiff $CONCAT => mydiff foo bar baz (taking 3 arguments)
- mydiff "$CONCAT" => mydiff "foo bar baz" (taking only 1 argument)
For another example, single quoting (= "util.shellquote") on POSIX
environment prevents shells from expanding environment variables,
tilde, and so on:
- mydiff "$HOME" => mydiff /home/foobar
- mydiff '$HOME' => mydiff $HOME
- "shlex.split" can't handle some special characters correctly
It just splits specified command line by whitespaces.
For example, "echo foo;echo bar" is split into ["echo",
"foo;echo", "bar"].
On the other hand, if quoting itself is omitted, users can't specify
options including space characters with "--option" at runtime.
The root cause of this issue is that "shlex.split + util.shellquote"
combination loses whether users really want to quote each command line
elements or not, even though these can be quoted arbitrarily in
configurations.
To resolve this problem, this patch does:
- prevent configurations from being processed by "shlex.split" and
"util.shellquote"
only (possibly) "findexe"-ed or "findexternaltool"-ed command path
is "util.shellquote", because it may contain whitespaces.
- quote options specified by "--option" via command line at runtime
This patch also makes "dodiff()" take only one "args" argument instead
of "diffcmd" and "diffopts. It also omits applying "util.shellquote"
on "args", because "args" should be already stringified in "extdiff()"
and "mydiff()".
The last hunk for "test-extdiff.t" replaces two whitespaces by single
whitespace, because change of "' '.join()" logic causes omitting
redundant whitespaces.
2014-12-25 17:33:26 +03:00
|
|
|
$ hg --debug 4463b | grep '^running'
|
2017-05-06 21:36:26 +03:00
|
|
|
running 'echo b-naked \'single quoted\' "double quoted" "*\\a" "*\\a"' in */extdiff.* (glob) (windows !)
|
|
|
|
running 'echo b-naked \'single quoted\' "double quoted" */a $TESTTMP/a/a' in */extdiff.* (glob) (no-windows !)
|
extdiff: avoid unexpected quoting arguments for external tools (issue4463)
Before this patch, all command line arguments for external tools are
quoted by the combination of "shlex.split" and "util.shellquote". But
this causes some problems.
- some problematic commands can't work correctly with quoted arguments
For example, 'WinMerge /r ....' is OK, but 'WinMerge "/r" ....' is
NG. See also below for detail about this problem.
https://bitbucket.org/tortoisehg/thg/issue/3978/
- quoting itself may change semantics of arguments
For example, when the environment variable CONCAT="foo bar baz':
- mydiff $CONCAT => mydiff foo bar baz (taking 3 arguments)
- mydiff "$CONCAT" => mydiff "foo bar baz" (taking only 1 argument)
For another example, single quoting (= "util.shellquote") on POSIX
environment prevents shells from expanding environment variables,
tilde, and so on:
- mydiff "$HOME" => mydiff /home/foobar
- mydiff '$HOME' => mydiff $HOME
- "shlex.split" can't handle some special characters correctly
It just splits specified command line by whitespaces.
For example, "echo foo;echo bar" is split into ["echo",
"foo;echo", "bar"].
On the other hand, if quoting itself is omitted, users can't specify
options including space characters with "--option" at runtime.
The root cause of this issue is that "shlex.split + util.shellquote"
combination loses whether users really want to quote each command line
elements or not, even though these can be quoted arbitrarily in
configurations.
To resolve this problem, this patch does:
- prevent configurations from being processed by "shlex.split" and
"util.shellquote"
only (possibly) "findexe"-ed or "findexternaltool"-ed command path
is "util.shellquote", because it may contain whitespaces.
- quote options specified by "--option" via command line at runtime
This patch also makes "dodiff()" take only one "args" argument instead
of "diffcmd" and "diffopts. It also omits applying "util.shellquote"
on "args", because "args" should be already stringified in "extdiff()"
and "mydiff()".
The last hunk for "test-extdiff.t" replaces two whitespaces by single
whitespace, because change of "' '.join()" logic causes omitting
redundant whitespaces.
2014-12-25 17:33:26 +03:00
|
|
|
$ hg --debug echo | grep '^running'
|
2017-05-06 21:36:26 +03:00
|
|
|
running '*echo* "*\\a" "*\\a"' in */extdiff.* (glob) (windows !)
|
|
|
|
running '*echo */a $TESTTMP/a/a' in */extdiff.* (glob) (no-windows !)
|
extdiff: avoid unexpected quoting arguments for external tools (issue4463)
Before this patch, all command line arguments for external tools are
quoted by the combination of "shlex.split" and "util.shellquote". But
this causes some problems.
- some problematic commands can't work correctly with quoted arguments
For example, 'WinMerge /r ....' is OK, but 'WinMerge "/r" ....' is
NG. See also below for detail about this problem.
https://bitbucket.org/tortoisehg/thg/issue/3978/
- quoting itself may change semantics of arguments
For example, when the environment variable CONCAT="foo bar baz':
- mydiff $CONCAT => mydiff foo bar baz (taking 3 arguments)
- mydiff "$CONCAT" => mydiff "foo bar baz" (taking only 1 argument)
For another example, single quoting (= "util.shellquote") on POSIX
environment prevents shells from expanding environment variables,
tilde, and so on:
- mydiff "$HOME" => mydiff /home/foobar
- mydiff '$HOME' => mydiff $HOME
- "shlex.split" can't handle some special characters correctly
It just splits specified command line by whitespaces.
For example, "echo foo;echo bar" is split into ["echo",
"foo;echo", "bar"].
On the other hand, if quoting itself is omitted, users can't specify
options including space characters with "--option" at runtime.
The root cause of this issue is that "shlex.split + util.shellquote"
combination loses whether users really want to quote each command line
elements or not, even though these can be quoted arbitrarily in
configurations.
To resolve this problem, this patch does:
- prevent configurations from being processed by "shlex.split" and
"util.shellquote"
only (possibly) "findexe"-ed or "findexternaltool"-ed command path
is "util.shellquote", because it may contain whitespaces.
- quote options specified by "--option" via command line at runtime
This patch also makes "dodiff()" take only one "args" argument instead
of "diffcmd" and "diffopts. It also omits applying "util.shellquote"
on "args", because "args" should be already stringified in "extdiff()"
and "mydiff()".
The last hunk for "test-extdiff.t" replaces two whitespaces by single
whitespace, because change of "' '.join()" logic causes omitting
redundant whitespaces.
2014-12-25 17:33:26 +03:00
|
|
|
|
|
|
|
(getting options from other than extdiff section)
|
|
|
|
|
|
|
|
$ cat <<EOF >> $HGRCPATH
|
|
|
|
> [extdiff]
|
|
|
|
> # using diff-tools diffargs
|
|
|
|
> 4463b2 = echo
|
|
|
|
> # using merge-tools diffargs
|
|
|
|
> 4463b3 = echo
|
|
|
|
> # no diffargs
|
|
|
|
> 4463b4 = echo
|
|
|
|
> [diff-tools]
|
|
|
|
> 4463b2.diffargs = b2-naked 'single quoted' "double quoted"
|
|
|
|
> [merge-tools]
|
|
|
|
> 4463b3.diffargs = b3-naked 'single quoted' "double quoted"
|
|
|
|
> EOF
|
2017-05-06 21:36:26 +03:00
|
|
|
|
extdiff: avoid unexpected quoting arguments for external tools (issue4463)
Before this patch, all command line arguments for external tools are
quoted by the combination of "shlex.split" and "util.shellquote". But
this causes some problems.
- some problematic commands can't work correctly with quoted arguments
For example, 'WinMerge /r ....' is OK, but 'WinMerge "/r" ....' is
NG. See also below for detail about this problem.
https://bitbucket.org/tortoisehg/thg/issue/3978/
- quoting itself may change semantics of arguments
For example, when the environment variable CONCAT="foo bar baz':
- mydiff $CONCAT => mydiff foo bar baz (taking 3 arguments)
- mydiff "$CONCAT" => mydiff "foo bar baz" (taking only 1 argument)
For another example, single quoting (= "util.shellquote") on POSIX
environment prevents shells from expanding environment variables,
tilde, and so on:
- mydiff "$HOME" => mydiff /home/foobar
- mydiff '$HOME' => mydiff $HOME
- "shlex.split" can't handle some special characters correctly
It just splits specified command line by whitespaces.
For example, "echo foo;echo bar" is split into ["echo",
"foo;echo", "bar"].
On the other hand, if quoting itself is omitted, users can't specify
options including space characters with "--option" at runtime.
The root cause of this issue is that "shlex.split + util.shellquote"
combination loses whether users really want to quote each command line
elements or not, even though these can be quoted arbitrarily in
configurations.
To resolve this problem, this patch does:
- prevent configurations from being processed by "shlex.split" and
"util.shellquote"
only (possibly) "findexe"-ed or "findexternaltool"-ed command path
is "util.shellquote", because it may contain whitespaces.
- quote options specified by "--option" via command line at runtime
This patch also makes "dodiff()" take only one "args" argument instead
of "diffcmd" and "diffopts. It also omits applying "util.shellquote"
on "args", because "args" should be already stringified in "extdiff()"
and "mydiff()".
The last hunk for "test-extdiff.t" replaces two whitespaces by single
whitespace, because change of "' '.join()" logic causes omitting
redundant whitespaces.
2014-12-25 17:33:26 +03:00
|
|
|
$ hg --debug 4463b2 | grep '^running'
|
2017-05-06 21:36:26 +03:00
|
|
|
running 'echo b2-naked \'single quoted\' "double quoted" "*\\a" "*\\a"' in */extdiff.* (glob) (windows !)
|
|
|
|
running 'echo b2-naked \'single quoted\' "double quoted" */a $TESTTMP/a/a' in */extdiff.* (glob) (no-windows !)
|
extdiff: avoid unexpected quoting arguments for external tools (issue4463)
Before this patch, all command line arguments for external tools are
quoted by the combination of "shlex.split" and "util.shellquote". But
this causes some problems.
- some problematic commands can't work correctly with quoted arguments
For example, 'WinMerge /r ....' is OK, but 'WinMerge "/r" ....' is
NG. See also below for detail about this problem.
https://bitbucket.org/tortoisehg/thg/issue/3978/
- quoting itself may change semantics of arguments
For example, when the environment variable CONCAT="foo bar baz':
- mydiff $CONCAT => mydiff foo bar baz (taking 3 arguments)
- mydiff "$CONCAT" => mydiff "foo bar baz" (taking only 1 argument)
For another example, single quoting (= "util.shellquote") on POSIX
environment prevents shells from expanding environment variables,
tilde, and so on:
- mydiff "$HOME" => mydiff /home/foobar
- mydiff '$HOME' => mydiff $HOME
- "shlex.split" can't handle some special characters correctly
It just splits specified command line by whitespaces.
For example, "echo foo;echo bar" is split into ["echo",
"foo;echo", "bar"].
On the other hand, if quoting itself is omitted, users can't specify
options including space characters with "--option" at runtime.
The root cause of this issue is that "shlex.split + util.shellquote"
combination loses whether users really want to quote each command line
elements or not, even though these can be quoted arbitrarily in
configurations.
To resolve this problem, this patch does:
- prevent configurations from being processed by "shlex.split" and
"util.shellquote"
only (possibly) "findexe"-ed or "findexternaltool"-ed command path
is "util.shellquote", because it may contain whitespaces.
- quote options specified by "--option" via command line at runtime
This patch also makes "dodiff()" take only one "args" argument instead
of "diffcmd" and "diffopts. It also omits applying "util.shellquote"
on "args", because "args" should be already stringified in "extdiff()"
and "mydiff()".
The last hunk for "test-extdiff.t" replaces two whitespaces by single
whitespace, because change of "' '.join()" logic causes omitting
redundant whitespaces.
2014-12-25 17:33:26 +03:00
|
|
|
$ hg --debug 4463b3 | grep '^running'
|
2017-05-06 21:36:26 +03:00
|
|
|
running 'echo b3-naked \'single quoted\' "double quoted" "*\\a" "*\\a"' in */extdiff.* (glob) (windows !)
|
|
|
|
running 'echo b3-naked \'single quoted\' "double quoted" */a $TESTTMP/a/a' in */extdiff.* (glob) (no-windows !)
|
extdiff: avoid unexpected quoting arguments for external tools (issue4463)
Before this patch, all command line arguments for external tools are
quoted by the combination of "shlex.split" and "util.shellquote". But
this causes some problems.
- some problematic commands can't work correctly with quoted arguments
For example, 'WinMerge /r ....' is OK, but 'WinMerge "/r" ....' is
NG. See also below for detail about this problem.
https://bitbucket.org/tortoisehg/thg/issue/3978/
- quoting itself may change semantics of arguments
For example, when the environment variable CONCAT="foo bar baz':
- mydiff $CONCAT => mydiff foo bar baz (taking 3 arguments)
- mydiff "$CONCAT" => mydiff "foo bar baz" (taking only 1 argument)
For another example, single quoting (= "util.shellquote") on POSIX
environment prevents shells from expanding environment variables,
tilde, and so on:
- mydiff "$HOME" => mydiff /home/foobar
- mydiff '$HOME' => mydiff $HOME
- "shlex.split" can't handle some special characters correctly
It just splits specified command line by whitespaces.
For example, "echo foo;echo bar" is split into ["echo",
"foo;echo", "bar"].
On the other hand, if quoting itself is omitted, users can't specify
options including space characters with "--option" at runtime.
The root cause of this issue is that "shlex.split + util.shellquote"
combination loses whether users really want to quote each command line
elements or not, even though these can be quoted arbitrarily in
configurations.
To resolve this problem, this patch does:
- prevent configurations from being processed by "shlex.split" and
"util.shellquote"
only (possibly) "findexe"-ed or "findexternaltool"-ed command path
is "util.shellquote", because it may contain whitespaces.
- quote options specified by "--option" via command line at runtime
This patch also makes "dodiff()" take only one "args" argument instead
of "diffcmd" and "diffopts. It also omits applying "util.shellquote"
on "args", because "args" should be already stringified in "extdiff()"
and "mydiff()".
The last hunk for "test-extdiff.t" replaces two whitespaces by single
whitespace, because change of "' '.join()" logic causes omitting
redundant whitespaces.
2014-12-25 17:33:26 +03:00
|
|
|
$ hg --debug 4463b4 | grep '^running'
|
2017-05-06 21:36:26 +03:00
|
|
|
running 'echo "*\\a" "*\\a"' in */extdiff.* (glob) (windows !)
|
|
|
|
running 'echo */a $TESTTMP/a/a' in */extdiff.* (glob) (no-windows !)
|
2014-12-25 17:33:26 +03:00
|
|
|
$ hg --debug 4463b4 --option b4-naked --option 'being quoted' | grep '^running'
|
2017-05-06 21:36:26 +03:00
|
|
|
running 'echo b4-naked "being quoted" "*\\a" "*\\a"' in */extdiff.* (glob) (windows !)
|
|
|
|
running "echo b4-naked 'being quoted' */a $TESTTMP/a/a" in */extdiff.* (glob) (no-windows !)
|
2014-12-25 17:33:26 +03:00
|
|
|
$ hg --debug extdiff -p echo --option echo-naked --option 'being quoted' | grep '^running'
|
2017-05-06 21:36:26 +03:00
|
|
|
running 'echo echo-naked "being quoted" "*\\a" "*\\a"' in */extdiff.* (glob) (windows !)
|
|
|
|
running "echo echo-naked 'being quoted' */a $TESTTMP/a/a" in */extdiff.* (glob) (no-windows !)
|
extdiff: avoid unexpected quoting arguments for external tools (issue4463)
Before this patch, all command line arguments for external tools are
quoted by the combination of "shlex.split" and "util.shellquote". But
this causes some problems.
- some problematic commands can't work correctly with quoted arguments
For example, 'WinMerge /r ....' is OK, but 'WinMerge "/r" ....' is
NG. See also below for detail about this problem.
https://bitbucket.org/tortoisehg/thg/issue/3978/
- quoting itself may change semantics of arguments
For example, when the environment variable CONCAT="foo bar baz':
- mydiff $CONCAT => mydiff foo bar baz (taking 3 arguments)
- mydiff "$CONCAT" => mydiff "foo bar baz" (taking only 1 argument)
For another example, single quoting (= "util.shellquote") on POSIX
environment prevents shells from expanding environment variables,
tilde, and so on:
- mydiff "$HOME" => mydiff /home/foobar
- mydiff '$HOME' => mydiff $HOME
- "shlex.split" can't handle some special characters correctly
It just splits specified command line by whitespaces.
For example, "echo foo;echo bar" is split into ["echo",
"foo;echo", "bar"].
On the other hand, if quoting itself is omitted, users can't specify
options including space characters with "--option" at runtime.
The root cause of this issue is that "shlex.split + util.shellquote"
combination loses whether users really want to quote each command line
elements or not, even though these can be quoted arbitrarily in
configurations.
To resolve this problem, this patch does:
- prevent configurations from being processed by "shlex.split" and
"util.shellquote"
only (possibly) "findexe"-ed or "findexternaltool"-ed command path
is "util.shellquote", because it may contain whitespaces.
- quote options specified by "--option" via command line at runtime
This patch also makes "dodiff()" take only one "args" argument instead
of "diffcmd" and "diffopts. It also omits applying "util.shellquote"
on "args", because "args" should be already stringified in "extdiff()"
and "mydiff()".
The last hunk for "test-extdiff.t" replaces two whitespaces by single
whitespace, because change of "' '.join()" logic causes omitting
redundant whitespaces.
2014-12-25 17:33:26 +03:00
|
|
|
|
2015-01-28 04:28:39 +03:00
|
|
|
$ touch 'sp ace'
|
|
|
|
$ hg add 'sp ace'
|
|
|
|
$ hg ci -m 'sp ace'
|
|
|
|
$ echo > 'sp ace'
|
|
|
|
|
|
|
|
Test pre-72a89cf86fcd backward compatibility with half-baked manual quoting
|
|
|
|
|
|
|
|
$ cat <<EOF >> $HGRCPATH
|
|
|
|
> [extdiff]
|
|
|
|
> odd =
|
|
|
|
> [merge-tools]
|
|
|
|
> odd.diffargs = --foo='\$clabel' '\$clabel' "--bar=\$clabel" "\$clabel"
|
|
|
|
> odd.executable = echo
|
|
|
|
> EOF
|
2017-05-06 21:36:26 +03:00
|
|
|
|
2015-01-28 04:28:39 +03:00
|
|
|
$ hg --debug odd | grep '^running'
|
2017-05-06 21:36:26 +03:00
|
|
|
running '"*\\echo.exe" --foo="sp ace" "sp ace" --bar="sp ace" "sp ace"' in * (glob) (windows !)
|
|
|
|
running "*/echo --foo='sp ace' 'sp ace' --bar='sp ace' 'sp ace'" in * (glob) (no-windows !)
|
2015-01-28 04:28:39 +03:00
|
|
|
|
2015-02-11 13:57:07 +03:00
|
|
|
Empty argument must be quoted
|
|
|
|
|
|
|
|
$ cat <<EOF >> $HGRCPATH
|
|
|
|
> [extdiff]
|
|
|
|
> kdiff3 = echo
|
|
|
|
> [merge-tools]
|
|
|
|
> kdiff3.diffargs=--L1 \$plabel1 --L2 \$clabel \$parent \$child
|
|
|
|
> EOF
|
2017-05-06 21:36:26 +03:00
|
|
|
|
2015-02-11 13:57:07 +03:00
|
|
|
$ hg --debug kdiff3 -r0 | grep '^running'
|
2017-05-06 21:36:26 +03:00
|
|
|
running 'echo --L1 "@0" --L2 "" a.8a5febb7f867 a' in * (glob) (windows !)
|
|
|
|
running "echo --L1 '@0' --L2 '' a.8a5febb7f867 a" in * (glob) (no-windows !)
|
2015-02-11 13:57:07 +03:00
|
|
|
|
2012-06-10 16:14:05 +04:00
|
|
|
|
2010-09-15 18:27:39 +04:00
|
|
|
Test extdiff of multiple files in tmp dir:
|
|
|
|
|
|
|
|
$ hg update -C 0 > /dev/null
|
|
|
|
$ echo changed > a
|
|
|
|
$ echo changed > b
|
2017-05-07 02:11:59 +03:00
|
|
|
#if execbit
|
2010-09-15 18:27:39 +04:00
|
|
|
$ chmod +x b
|
2017-05-07 02:11:59 +03:00
|
|
|
#endif
|
2010-09-15 18:27:39 +04:00
|
|
|
|
|
|
|
Diff in working directory, before:
|
|
|
|
|
|
|
|
$ hg diff --git
|
|
|
|
diff --git a/a b/a
|
|
|
|
--- a/a
|
|
|
|
+++ b/a
|
|
|
|
@@ -1,1 +1,1 @@
|
|
|
|
-a
|
|
|
|
+changed
|
|
|
|
diff --git a/b b/b
|
2017-05-07 02:11:59 +03:00
|
|
|
old mode 100644 (execbit !)
|
|
|
|
new mode 100755 (execbit !)
|
2010-09-15 18:27:39 +04:00
|
|
|
--- a/b
|
|
|
|
+++ b/b
|
|
|
|
@@ -1,1 +1,1 @@
|
|
|
|
-b
|
|
|
|
+changed
|
|
|
|
|
|
|
|
|
|
|
|
Edit with extdiff -p:
|
|
|
|
|
|
|
|
Prepare custom diff/edit tool:
|
|
|
|
|
|
|
|
$ cat > 'diff tool.py' << EOT
|
2017-06-15 21:27:52 +03:00
|
|
|
> #!$PYTHON
|
2010-09-15 18:27:39 +04:00
|
|
|
> import time
|
|
|
|
> time.sleep(1) # avoid unchanged-timestamp problems
|
2020-01-29 03:40:32 +03:00
|
|
|
> open('a/a', 'ab').write(b'edited\n')
|
|
|
|
> open('a/b', 'ab').write(b'edited\n')
|
2010-09-15 18:27:39 +04:00
|
|
|
> EOT
|
|
|
|
|
2017-05-07 02:11:59 +03:00
|
|
|
#if execbit
|
2010-09-15 18:27:39 +04:00
|
|
|
$ chmod +x 'diff tool.py'
|
2017-05-07 02:11:59 +03:00
|
|
|
#endif
|
2010-09-15 18:27:39 +04:00
|
|
|
|
2010-09-18 02:03:08 +04:00
|
|
|
will change to /tmp/extdiff.TMP and populate directories a.TMP and a
|
|
|
|
and start tool
|
|
|
|
|
2017-07-31 19:27:32 +03:00
|
|
|
#if windows
|
|
|
|
$ cat > 'diff tool.bat' << EOF
|
|
|
|
> @$PYTHON "`pwd`/diff tool.py"
|
|
|
|
> EOF
|
|
|
|
$ hg extdiff -p "`pwd`/diff tool.bat"
|
|
|
|
[1]
|
|
|
|
#else
|
2010-09-15 18:27:39 +04:00
|
|
|
$ hg extdiff -p "`pwd`/diff tool.py"
|
2010-09-17 02:51:32 +04:00
|
|
|
[1]
|
2017-07-31 19:27:32 +03:00
|
|
|
#endif
|
2010-09-15 18:27:39 +04:00
|
|
|
|
|
|
|
Diff in working directory, after:
|
|
|
|
|
|
|
|
$ hg diff --git
|
|
|
|
diff --git a/a b/a
|
|
|
|
--- a/a
|
|
|
|
+++ b/a
|
|
|
|
@@ -1,1 +1,2 @@
|
|
|
|
-a
|
|
|
|
+changed
|
|
|
|
+edited
|
|
|
|
diff --git a/b b/b
|
2017-05-07 02:11:59 +03:00
|
|
|
old mode 100644 (execbit !)
|
|
|
|
new mode 100755 (execbit !)
|
2010-09-15 18:27:39 +04:00
|
|
|
--- a/b
|
|
|
|
+++ b/b
|
|
|
|
@@ -1,1 +1,2 @@
|
|
|
|
-b
|
|
|
|
+changed
|
|
|
|
+edited
|
|
|
|
|
|
|
|
Test extdiff with --option:
|
|
|
|
|
|
|
|
$ hg extdiff -p echo -o this -c 1
|
2017-05-07 02:11:59 +03:00
|
|
|
this "*\\a.8a5febb7f867\\a" "a.34eed99112ab\\a" (glob) (windows !)
|
|
|
|
this */extdiff.*/a.8a5febb7f867/a a.34eed99112ab/a (glob) (no-windows !)
|
2010-09-17 02:51:32 +04:00
|
|
|
[1]
|
2010-09-15 18:27:39 +04:00
|
|
|
|
|
|
|
$ hg falabala -o this -c 1
|
2017-05-07 02:11:59 +03:00
|
|
|
diffing this "*\\a.8a5febb7f867\\a" "a.34eed99112ab\\a" (glob) (windows !)
|
|
|
|
diffing this */extdiff.*/a.8a5febb7f867/a a.34eed99112ab/a (glob) (no-windows !)
|
2010-09-17 02:51:32 +04:00
|
|
|
[1]
|
2010-09-15 18:27:39 +04:00
|
|
|
|
2012-07-26 14:38:13 +04:00
|
|
|
Test extdiff's handling of options with spaces in them:
|
|
|
|
|
|
|
|
$ hg edspace -c 1
|
2017-05-07 02:11:59 +03:00
|
|
|
"name <user@example.com>" "*\\a.8a5febb7f867\\a" "a.34eed99112ab\\a" (glob) (windows !)
|
|
|
|
name <user@example.com> */extdiff.*/a.8a5febb7f867/a a.34eed99112ab/a (glob) (no-windows !)
|
2012-07-26 14:38:13 +04:00
|
|
|
[1]
|
|
|
|
|
|
|
|
$ hg extdiff -p echo -o "name <user@example.com>" -c 1
|
2017-05-07 02:11:59 +03:00
|
|
|
"name <user@example.com>" "*\\a.8a5febb7f867\\a" "a.34eed99112ab\\a" (glob) (windows !)
|
|
|
|
name <user@example.com> */extdiff.*/a.8a5febb7f867/a a.34eed99112ab/a (glob) (no-windows !)
|
2012-07-26 14:38:13 +04:00
|
|
|
[1]
|
|
|
|
|
2011-03-16 00:50:02 +03:00
|
|
|
Test with revsets:
|
|
|
|
|
|
|
|
$ hg extdif -p echo -c "rev(1)"
|
2017-05-07 02:11:59 +03:00
|
|
|
"*\\a.8a5febb7f867\\a" "a.34eed99112ab\\a" (glob) (windows !)
|
|
|
|
*/extdiff.*/a.8a5febb7f867/a a.34eed99112ab/a (glob) (no-windows !)
|
2011-03-16 00:50:02 +03:00
|
|
|
[1]
|
|
|
|
|
|
|
|
$ hg extdif -p echo -r "0::1"
|
2017-05-07 02:11:59 +03:00
|
|
|
"*\\a.8a5febb7f867\\a" "a.34eed99112ab\\a" (glob) (windows !)
|
|
|
|
*/extdiff.*/a.8a5febb7f867/a a.34eed99112ab/a (glob) (no-windows !)
|
2011-03-16 00:50:02 +03:00
|
|
|
[1]
|
2011-04-29 13:10:11 +04:00
|
|
|
|
2014-11-01 04:34:55 +03:00
|
|
|
Fallback to merge-tools.tool.executable|regkey
|
|
|
|
$ mkdir dir
|
extdiff: copy back files to the working directory if the size changed
In theory, it should be enough to pay attention only to the modification time
when detecting if a snapshotted working directory file changed. In practice,
BeyondCompare preserves all file attributes when syncing files at the directory
level. (If you open the file and sync individual hunks, then mtime does change,
and everything was being copied back as desired.) I'm not sure how many other
synchronization tools would trigger this issue, but it's annoyingly inconsistent
(if a single file is diffed, it isn't snapshotted, so the same BeyondCompare
file sync operation _is_ visible, because wdir() is updated in place.
I filed a bug with them, and they stated it is on their wish list, but won't be
fixed in the near term. This isn't a complete fix (there is still the case of
the size not changing), but this seems like a trivial enough change to fix most
of the problem. I suppose we could fool around with making files in the other
snapshot readonly, and copy back if we see the readonly bit copied. That seems
pretty hacky though, and only works if the external tool copies all attributes.
2017-05-07 06:00:57 +03:00
|
|
|
$ cat > 'dir/tool.sh' << 'EOF'
|
2014-11-01 04:34:55 +03:00
|
|
|
> #!/bin/sh
|
extdiff: copy back files to the working directory if the size changed
In theory, it should be enough to pay attention only to the modification time
when detecting if a snapshotted working directory file changed. In practice,
BeyondCompare preserves all file attributes when syncing files at the directory
level. (If you open the file and sync individual hunks, then mtime does change,
and everything was being copied back as desired.) I'm not sure how many other
synchronization tools would trigger this issue, but it's annoyingly inconsistent
(if a single file is diffed, it isn't snapshotted, so the same BeyondCompare
file sync operation _is_ visible, because wdir() is updated in place.
I filed a bug with them, and they stated it is on their wish list, but won't be
fixed in the near term. This isn't a complete fix (there is still the case of
the size not changing), but this seems like a trivial enough change to fix most
of the problem. I suppose we could fool around with making files in the other
snapshot readonly, and copy back if we see the readonly bit copied. That seems
pretty hacky though, and only works if the external tool copies all attributes.
2017-05-07 06:00:57 +03:00
|
|
|
> # Mimic a tool that syncs all attrs, including mtime
|
|
|
|
> cp $1/a $2/a
|
|
|
|
> touch -r $1/a $2/a
|
2017-05-12 05:33:45 +03:00
|
|
|
> chmod +x $2/a
|
2014-11-01 04:34:55 +03:00
|
|
|
> echo "** custom diff **"
|
|
|
|
> EOF
|
2017-05-07 02:11:59 +03:00
|
|
|
#if execbit
|
2014-11-01 04:34:55 +03:00
|
|
|
$ chmod +x dir/tool.sh
|
2017-05-07 02:11:59 +03:00
|
|
|
#endif
|
2017-05-07 05:48:06 +03:00
|
|
|
|
|
|
|
Windows can't run *.sh directly, so create a shim executable that can be.
|
|
|
|
Without something executable, the next hg command will try to run `tl` instead
|
|
|
|
of $tool (and fail).
|
|
|
|
#if windows
|
|
|
|
$ cat > dir/tool.bat <<EOF
|
|
|
|
> @sh -c "`pwd`/dir/tool.sh %1 %2"
|
|
|
|
> EOF
|
|
|
|
$ tool=`pwd`/dir/tool.bat
|
|
|
|
#else
|
2014-11-01 04:34:55 +03:00
|
|
|
$ tool=`pwd`/dir/tool.sh
|
2017-05-07 05:48:06 +03:00
|
|
|
#endif
|
2017-05-07 02:11:59 +03:00
|
|
|
|
extdiff: copy back files to the working directory if the size changed
In theory, it should be enough to pay attention only to the modification time
when detecting if a snapshotted working directory file changed. In practice,
BeyondCompare preserves all file attributes when syncing files at the directory
level. (If you open the file and sync individual hunks, then mtime does change,
and everything was being copied back as desired.) I'm not sure how many other
synchronization tools would trigger this issue, but it's annoyingly inconsistent
(if a single file is diffed, it isn't snapshotted, so the same BeyondCompare
file sync operation _is_ visible, because wdir() is updated in place.
I filed a bug with them, and they stated it is on their wish list, but won't be
fixed in the near term. This isn't a complete fix (there is still the case of
the size not changing), but this seems like a trivial enough change to fix most
of the problem. I suppose we could fool around with making files in the other
snapshot readonly, and copy back if we see the readonly bit copied. That seems
pretty hacky though, and only works if the external tool copies all attributes.
2017-05-07 06:00:57 +03:00
|
|
|
$ cat a
|
|
|
|
changed
|
|
|
|
edited
|
2014-11-01 04:34:55 +03:00
|
|
|
$ hg --debug tl --config extdiff.tl= --config merge-tools.tl.executable=$tool
|
|
|
|
making snapshot of 2 files from rev * (glob)
|
|
|
|
a
|
|
|
|
b
|
|
|
|
making snapshot of 2 files from working directory
|
|
|
|
a
|
|
|
|
b
|
2017-05-07 05:48:06 +03:00
|
|
|
running '$TESTTMP/a/dir/tool.bat a.* a' in */extdiff.* (glob) (windows !)
|
|
|
|
running '$TESTTMP/a/dir/tool.sh a.* a' in */extdiff.* (glob) (no-windows !)
|
2014-11-01 04:34:55 +03:00
|
|
|
** custom diff **
|
extdiff: copy back files to the working directory if the size changed
In theory, it should be enough to pay attention only to the modification time
when detecting if a snapshotted working directory file changed. In practice,
BeyondCompare preserves all file attributes when syncing files at the directory
level. (If you open the file and sync individual hunks, then mtime does change,
and everything was being copied back as desired.) I'm not sure how many other
synchronization tools would trigger this issue, but it's annoyingly inconsistent
(if a single file is diffed, it isn't snapshotted, so the same BeyondCompare
file sync operation _is_ visible, because wdir() is updated in place.
I filed a bug with them, and they stated it is on their wish list, but won't be
fixed in the near term. This isn't a complete fix (there is still the case of
the size not changing), but this seems like a trivial enough change to fix most
of the problem. I suppose we could fool around with making files in the other
snapshot readonly, and copy back if we see the readonly bit copied. That seems
pretty hacky though, and only works if the external tool copies all attributes.
2017-05-07 06:00:57 +03:00
|
|
|
file changed while diffing. Overwriting: $TESTTMP/a/a (src: */extdiff.*/a/a) (glob)
|
2014-11-01 04:34:55 +03:00
|
|
|
cleaning up temp directory
|
|
|
|
[1]
|
extdiff: copy back files to the working directory if the size changed
In theory, it should be enough to pay attention only to the modification time
when detecting if a snapshotted working directory file changed. In practice,
BeyondCompare preserves all file attributes when syncing files at the directory
level. (If you open the file and sync individual hunks, then mtime does change,
and everything was being copied back as desired.) I'm not sure how many other
synchronization tools would trigger this issue, but it's annoyingly inconsistent
(if a single file is diffed, it isn't snapshotted, so the same BeyondCompare
file sync operation _is_ visible, because wdir() is updated in place.
I filed a bug with them, and they stated it is on their wish list, but won't be
fixed in the near term. This isn't a complete fix (there is still the case of
the size not changing), but this seems like a trivial enough change to fix most
of the problem. I suppose we could fool around with making files in the other
snapshot readonly, and copy back if we see the readonly bit copied. That seems
pretty hacky though, and only works if the external tool copies all attributes.
2017-05-07 06:00:57 +03:00
|
|
|
$ cat a
|
|
|
|
a
|
2014-11-01 04:34:55 +03:00
|
|
|
|
2017-05-12 05:33:45 +03:00
|
|
|
#if execbit
|
|
|
|
$ [ -x a ]
|
|
|
|
|
|
|
|
$ cat > 'dir/tool.sh' << 'EOF'
|
|
|
|
> #!/bin/sh
|
|
|
|
> chmod -x $2/a
|
|
|
|
> echo "** custom diff **"
|
|
|
|
> EOF
|
|
|
|
|
|
|
|
$ hg --debug tl --config extdiff.tl= --config merge-tools.tl.executable=$tool
|
|
|
|
making snapshot of 2 files from rev * (glob)
|
|
|
|
a
|
|
|
|
b
|
|
|
|
making snapshot of 2 files from working directory
|
|
|
|
a
|
|
|
|
b
|
|
|
|
running '$TESTTMP/a/dir/tool.sh a.* a' in */extdiff.* (glob)
|
|
|
|
** custom diff **
|
|
|
|
file changed while diffing. Overwriting: $TESTTMP/a/a (src: */extdiff.*/a/a) (glob)
|
|
|
|
cleaning up temp directory
|
|
|
|
[1]
|
|
|
|
|
|
|
|
$ [ -x a ]
|
|
|
|
[1]
|
|
|
|
#endif
|
|
|
|
|
2011-04-29 10:04:46 +04:00
|
|
|
$ cd ..
|
|
|
|
|
2012-06-10 16:14:05 +04:00
|
|
|
#if symlink
|
|
|
|
|
2011-04-29 13:10:11 +04:00
|
|
|
Test symlinks handling (issue1909)
|
|
|
|
|
2011-04-29 10:04:46 +04:00
|
|
|
$ hg init testsymlinks
|
|
|
|
$ cd testsymlinks
|
|
|
|
$ echo a > a
|
|
|
|
$ hg ci -Am adda
|
|
|
|
adding a
|
|
|
|
$ echo a >> a
|
|
|
|
$ ln -s missing linka
|
|
|
|
$ hg add linka
|
|
|
|
$ hg falabala -r 0 --traceback
|
|
|
|
diffing testsymlinks.07f494440405 testsymlinks
|
|
|
|
[1]
|
|
|
|
$ cd ..
|
2012-06-10 16:14:05 +04:00
|
|
|
|
|
|
|
#endif
|
2016-07-19 00:25:35 +03:00
|
|
|
|
|
|
|
Test handling of non-ASCII paths in generated docstrings (issue5301)
|
|
|
|
|
|
|
|
>>> open("u", "w").write("\xa5\xa5")
|
|
|
|
$ U=`cat u`
|
|
|
|
|
|
|
|
$ HGPLAIN=1 hg --config hgext.extdiff= --config extdiff.cmd.td=hi help -k xyzzy
|
|
|
|
abort: no matches
|
2016-09-21 02:47:46 +03:00
|
|
|
(try 'hg help' for a list of topics)
|
2016-07-19 00:25:35 +03:00
|
|
|
[255]
|
|
|
|
|
|
|
|
$ HGPLAIN=1 hg --config hgext.extdiff= --config extdiff.cmd.td=hi help td > /dev/null
|