Excerpts from Christophe de Vienne's message of 2017-08-31 23:26:58 +0200:
> # HG changeset patch
> # User Christophe de Vienne <christo...@cdevienne.info>
> # Date 1504023891 -7200
> #      Tue Aug 29 18:24:51 2017 +0200
> # Node ID 5bbb2d585a963985a9172325f98bb5367b53e438
> # Parent  b2eb0aa445cbe7cadc8b7691c6266908adfc5057
> command options: abort on unicode defaults
> 
> If the default value of an option is a unicode string (something
> than happen easily when using a 'from __future__ import unicode_literals'),
> any value passed on the command line will be ignored because the fancyopts
> module only checks for byte strings and not unicode strings.
> 
> Changing fancyopts behavior is easy but would make assumptions on how
> the python3 port should be done, which is outside the scope of this patch.
> 
> The chosen approach is to abord when a unicode default value is detected,

"abort"

> with a hint for the developer.
> 
> diff -r b2eb0aa445cb -r 5bbb2d585a96 mercurial/dispatch.py
> --- a/mercurial/dispatch.py    Tue Aug 22 21:21:43 2017 -0400
> +++ b/mercurial/dispatch.py    Tue Aug 29 18:24:51 2017 +0200
> @@ -557,7 +557,15 @@
>          if defaults:
>              args = pycompat.maplist(
>                  util.expandpath, pycompat.shlexsplit(defaults)) + args
> -        c = list(entry[1])

Changing here means it only works for global opts. Is that intentional?

> +        for option in entry[1]:
> +            default = option[2]
> +            if not pycompat.ispy3 and isinstance(default, type(u'')):
> +                raise error.Abort(
> +                    "Cannot encode %s.%s default value to ascii" %
> +                    (cmd, option[1]),
> +                    "Try changing the %s.%s default value to a "
> +                    "non-unicode string" % (cmd, option[1]))

Maybe use error.ProgrammingError

> +        c = entry[1]
>      else:
>          cmd = None
>          c = []
> diff -r b2eb0aa445cb -r 5bbb2d585a96 tests/test-dispatch.t
> --- a/tests/test-dispatch.t    Tue Aug 22 21:21:43 2017 -0400
> +++ b/tests/test-dispatch.t    Tue Aug 29 18:24:51 2017 +0200
> @@ -60,3 +60,23 @@
>    [255]
>  
>  #endif
> +
> +Test abort on command options with unicode default value
> +
> +  $ hg init $TESTTMP/opt-unicode-default
> +
> +  $ cat > $TESTTMP/test_unicode_default_value.py << EOF
> +  > from mercurial import registrar
> +  > cmdtable = {}
> +  > command = registrar.command(cmdtable)
> +  > @command('ext', [('', 'opt', u'value', u'help')], 'ext [OPTIONS]')
> +  > def ext(*args, **opts):
> +  >     print(opts['opt'])
> +  > EOF
> +  $ cat > $TESTTMP/opt-unicode-default/.hg/hgrc << EOF
> +  > [extensions]
> +  > test_unicode_default_value = $TESTTMP/test_unicode_default_value.py
> +  > EOF
> +  $ hg -R $TESTTMP/opt-unicode-default ext
> +  abort: ('Cannot encode ext.opt default value to ascii', 'Try changing the 
> ext.opt default value to a non-unicode string')
> +  [255]
_______________________________________________
Mercurial-devel mailing list
Mercurial-devel@mercurial-scm.org
https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel

Reply via email to