[PATCH 2 of 2 STABLE] dispatch: check shell alias again after loading extensions (issue4355)
Augie Fackler
raf at durin42.com
Tue Sep 9 12:47:01 CDT 2014
On Wed, Sep 10, 2014 at 01:32:37AM +0900, FUJIWARA Katsunori wrote:
> # HG changeset patch
> # User FUJIWARA Katsunori <foozy at lares.dti.ne.jp>
> # Date 1410277304 -32400
> # Wed Sep 10 00:41:44 2014 +0900
> # Branch stable
> # Node ID b87035951eca955a2961da5327e3faf15eee4827
> # Parent da54cba6a073c5cbe04e73ebbfb043c49066d215
> dispatch: check shell alias again after loading extensions (issue4355)
Thanks for the very thorough log message. Despite my general
discomfort with dispatch code, I've queued this for stable. Thanks!
>
> Before this patch, the shell alias causes failure when it takes its
> specific (= unknown for "hg") options in the command line, because
> "_parse()" can't accept them.
>
> This is the regression introduced by 03d345da0579.
>
> It fixed the issue that ambiguity between shell aliases and commands
> defined by extensions was ignored. But it also caused that ambiguous
> shell alias is handled in "_parse()" even if it takes specific options
> in the command line.
>
> To avoid such failure, this patch checks shell alias again after
> loading extensions.
>
> All aliases and commands (including ones defined by extensions) are
> completely defined before the 2nd (= newly added in this patch)
> "_checkshellalias()" invocation, and "cmdutil.findcmd(strict=False)"
> can detect ambiguity between them correctly.
>
> For efficiency, this patch does:
>
> - omit the 2nd "_checkshellalias()" invocation if "[ui] strict= True"
>
> it causes "cmdutil.findcmd(strict=True)", of which result should
> be equal to one of the 1st invocation before adding aliases
>
> - avoid removing the 1st "_checkshellalias()" invocation
>
> it causes "cmdutil.findcmd(strict=True)" invocation preventing
> shell alias execution from loading extensions uselessly
>
> diff --git a/mercurial/dispatch.py b/mercurial/dispatch.py
> --- a/mercurial/dispatch.py
> +++ b/mercurial/dispatch.py
> @@ -644,6 +644,7 @@
> return
>
> if precheck:
> + strict = True
> norepo = commands.norepo
> optionalrepo = commands.optionalrepo
> def restorecommands():
> @@ -652,13 +653,14 @@
> cmdtable = commands.table.copy()
> addaliases(lui, cmdtable)
> else:
> + strict = False
> def restorecommands():
> pass
> cmdtable = commands.table
>
> cmd = args[0]
> try:
> - aliases, entry = cmdutil.findcmd(cmd, cmdtable)
> + aliases, entry = cmdutil.findcmd(cmd, cmdtable, strict)
> except (error.AmbiguousCommand, error.UnknownCommand):
> restorecommands()
> return
> @@ -715,6 +717,14 @@
>
> addaliases(lui, commands.table)
>
> + if not lui.configbool("ui", "strict"):
> + # All aliases and commands are completely defined, now.
> + # Check abbreviation/ambiguity of shell alias again, because shell
> + # alias may cause failure of "_parse" (see issue4355)
> + shellaliasfn = _checkshellalias(lui, ui, args, precheck=False)
> + if shellaliasfn:
> + return shellaliasfn()
> +
> # check for fallback encoding
> fallback = lui.config('ui', 'fallbackencoding')
> if fallback:
> diff --git a/tests/test-alias.t b/tests/test-alias.t
> --- a/tests/test-alias.t
> +++ b/tests/test-alias.t
> @@ -353,7 +353,7 @@
> > [extensions]
> > hgext.rebase =
> > [alias]
> - > rebate = !echo this is rebate
> + > rebate = !echo this is \$HG_ARGS
> > EOF
> $ hg reba
> hg: command 'reba' is ambiguous:
> @@ -361,6 +361,8 @@
> [255]
> $ hg rebat
> this is rebate
> + $ hg rebat --foo-bar
> + this is rebate --foo-bar
>
> invalid arguments
>
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel at selenic.com
> http://selenic.com/mailman/listinfo/mercurial-devel
More information about the Mercurial-devel
mailing list