[PATCH 7 of 8 v2] diffopts: notice a negated boolean flag in diffopts

Yuya Nishihara yuya at tcha.org
Thu Sep 1 15:28:25 UTC 2016


On Tue, 30 Aug 2016 16:16:20 -0400, Augie Fackler wrote:
> # HG changeset patch
> # User Augie Fackler <augie at google.com>
> # Date 1472586907 14400
> #      Tue Aug 30 15:55:07 2016 -0400
> # Node ID fd68fb86c29873eb32c4a2bd28f7ac0abe3dc172
> # Parent  6127fee6ac8208a62f718d53aca6cb814f43b742
> diffopts: notice a negated boolean flag in diffopts
> 
> This means that if you have git-diffs enabled by default (pretty
> common) and you hit the rare (but real) case where a git-diff breaks
> patch(1) or some other tool, you can easily disable it by just
> specifying --git=0 on the command line.
> 
> diff --git a/mercurial/patch.py b/mercurial/patch.py
> --- a/mercurial/patch.py
> +++ b/mercurial/patch.py
> @@ -2142,7 +2142,7 @@ def difffeatureopts(ui, opts=None, untru
>      def get(key, name=None, getter=ui.configbool, forceplain=None):
>          if opts:
>              v = opts.get(key)
> -            if v:
> +            if v or v is False:
>                  return v

Can't we have default=unset to omit the dict element instead of setting it
to None?

  # fancyopts.py
  unset = object()

  # commands.py
  unset = fancyopts.unset
  diffopts = [
      ('g', 'git', unset, _('use git extended diff format')),
  ]

  (none) => {}
  --git => {'git': True}
  --no-git => {'git': False}

I think it will avoid introducing the weirdness of tri-state booleans globally.
Many commands only need False/True. They are free to set default=True and
get False by --no-<opt>.


More information about the Mercurial-devel mailing list