diff --git a/hgext/extdiff.py b/hgext/extdiff.py --- a/hgext/extdiff.py +++ b/hgext/extdiff.py @@ -212,13 +212,15 @@ def dodiff(ui, repo, cmdline, pats, opts 'clabel': label2, 'child': dir2, 'root': repo.root} def quote(match): - key = match.group()[1:] + pre = match.group(2) + key = match.group(3) if not do3way and key == 'parent2': - return '' - return util.shellquote(replace[key]) + return pre + return pre + util.shellquote(replace[key]) # Match parent2 first, so 'parent1?' will match both parent1 and parent - regex = '\$(parent2|parent1?|child|plabel1|plabel2|clabel|root)' + regex = (r'''(['"]?)([^\s'"$]*)''' + r'\$(parent2|parent1?|child|plabel1|plabel2|clabel|root)\1') if not do3way and not re.search(regex, cmdline): cmdline += ' $parent1 $child' cmdline = re.sub(regex, quote, cmdline) diff --git a/tests/test-extdiff.t b/tests/test-extdiff.t --- a/tests/test-extdiff.t +++ b/tests/test-extdiff.t @@ -160,6 +160,28 @@ issue4463: usage of command line configu running "echo echo-naked 'being quoted' */a $TESTTMP/a/a" in */extdiff.* (glob) #endif + $ touch 'sp ace' + $ hg add 'sp ace' + $ hg ci -m 'sp ace' + created new head + $ echo > 'sp ace' + +Test pre-72a89cf86fcd backward compatibility with half-baked manual quoting + + $ cat <> $HGRCPATH + > [extdiff] + > odd = + > [merge-tools] + > odd.diffargs = --foo='\$clabel' '\$clabel' "--bar=\$clabel" "\$clabel" + > odd.executable = echo + > EOF +#if windows +TODO +#else + $ hg --debug odd | grep '^running' + running "/bin/echo --foo='sp ace' 'sp ace' --bar='sp ace' 'sp ace'" in * (glob) +#endif + #if execbit Test extdiff of multiple files in tmp dir: