extdiff: quote user-supplied options passed to shell

$ hg extdiff -p cmd -o "name <user@example.com>"
resulted in a shell redirection error (due to the less-than sign),
rather than passing the single option to cmd. This was due to options
not being quoted for passing to the shell, via util.system(). Apply
util.shellquote() to each of the user-specified options (-o) to the
comparison program before they are concatenated and passed to
util.system(). The requested external diff command (-p) and the
files/directories being compared are already quoted correctly.

The discussion at the time of changeset 6654fcb57d92 correctly noted
that this course of action breaks whitespace-separated options specified
for external diff commands in the configuration. The lower part of the
patch corrects this by lexing options read from the configuration file
into separate options rather than reading them all into the first
option.

Update test to cover these conditions.

Related changesets (reverse-chronological):
- 6654fcb57d92 (fix reverted to make configuration file options work)
- c64ec6e8ffa2 (issue fixed but without fix for configuration file)
This commit is contained in:
Michael Fyles 2012-07-26 11:38:13 +01:00
parent 9db6205062
commit 001d1e7cb7
2 changed files with 14 additions and 3 deletions

View File

@ -121,7 +121,7 @@ def dodiff(ui, repo, diffcmd, diffopts, pats, opts):
revs = opts.get('rev')
change = opts.get('change')
args = ' '.join(diffopts)
args = ' '.join(map(util.shellquote, diffopts))
do3way = '$parent2' in args
if revs and change:
@ -280,8 +280,7 @@ def uisetup(ui):
cmd = cmd[4:]
if not path:
path = cmd
diffopts = ui.config('extdiff', 'opts.' + cmd, '')
diffopts = diffopts and [diffopts] or []
diffopts = shlex.split(ui.config('extdiff', 'opts.' + cmd, ''))
elif cmd.startswith('opts.'):
continue
else:

View File

@ -19,6 +19,8 @@ Should diff cloned directories:
$ echo "[extdiff]" >> $HGRCPATH
$ echo "cmd.falabala=echo" >> $HGRCPATH
$ echo "opts.falabala=diffing" >> $HGRCPATH
$ echo "cmd.edspace=echo" >> $HGRCPATH
$ echo 'opts.edspace="name <user@example.com>"' >> $HGRCPATH
$ hg falabala
diffing a.000000000000 a
@ -168,6 +170,16 @@ Test extdiff with --option:
diffing this */extdiff.*/a.8a5febb7f867/a a.34eed99112ab/a (glob)
[1]
Test extdiff's handling of options with spaces in them:
$ hg edspace -c 1
name <user@example.com> */extdiff.*/a.8a5febb7f867/a a.34eed99112ab/a (glob)
[1]
$ hg extdiff -p echo -o "name <user@example.com>" -c 1
name <user@example.com> */extdiff.*/a.8a5febb7f867/a a.34eed99112ab/a (glob)
[1]
Test with revsets:
$ hg extdif -p echo -c "rev(1)"