[PATCH 01 of 10] config: explicitly track the use of the standard default value

Gregory Szorc gregory.szorc at gmail.com
Tue Jun 20 23:22:29 EDT 2017


On Sun, Jun 18, 2017 at 11:55 AM, Pierre-Yves David <
pierre-yves.david at ens-lyon.org> wrote:

> # HG changeset patch
> # User Pierre-Yves David <pierre-yves.david at octobus.net>
> # Date 1497696671 -7200
> #      Sat Jun 17 12:51:11 2017 +0200
> # Node ID 5e988d4f834b981d8aaf9d77019550d3800687d5
> # Parent  29558247b00eff8c95c7604032b59cfbab34010d
> # EXP-Topic config.register
> # Available At https://www.mercurial-scm.org/
> repo/users/marmoute/mercurial/
> #              hg pull https://www.mercurial-scm.org/
> repo/users/marmoute/mercurial/ -r 5e988d4f834b
> config: explicitly track the use of the standard default value
>

Queued this series because it seems like a strict improvement in default
value detection.

FWIW I think it is a bit weird to be returning None and then checking "is
None" in callers. I think it would be slightly better to factor the
low-level config retrieval logic into a function that returns a 2-tuple of
(value, is_set) and then call that instead of ui.config(). But this series
gets essentially the same result. So meh.

I haven't looked at the unpublished changesets yet. But I like the idea of
a registry. Even though it seems like over-engineering, it solves a lot of
problems around documentation, type checking, registering default values,
registering values for different "profiles," associating command arguments
with config options, etc. Basically it makes a lot of problems we talked
about at the 4.2 Sprint w.r.t. config management feel a lot easier when you
can hang additional metadata off config options, which is what a registry
will provide.


>
> We introduce a small object used to detect that no specific default value
> has
> been passed to 'ui.config'. We need this explicit special value since
> "None" is
> a valid and common default value.
>
> The end goal here is to make progress on a centralised and explicit
> declaration
> of the available config option. A first good usecase for this are "default"
> value.  Before starting looking further down this alley we needs to rework
> the
> handling of default value in the 'ui' object to have all configxyz methods
> going
> through the same logic. This is the first changeset on this trek.
>
> diff --git a/mercurial/ui.py b/mercurial/ui.py
> --- a/mercurial/ui.py
> +++ b/mercurial/ui.py
> @@ -140,6 +140,10 @@ class httppasswordmgrdbproxy(object):
>  def _catchterm(*args):
>      raise error.SignalInterrupt
>
> +# unique object used to detect no default value has been provided when
> +# retrieving configuration value.
> +_unset = object()
> +
>  class ui(object):
>      def __init__(self, src=None):
>          """Create a fresh new ui object if no src given
> @@ -394,7 +398,9 @@ class ui(object):
>      def configsource(self, section, name, untrusted=False):
>          return self._data(untrusted).source(section, name)
>
> -    def config(self, section, name, default=None, untrusted=False):
> +    def config(self, section, name, default=_unset, untrusted=False):
> +        if default is _unset:
> +            default = None
>          if isinstance(name, list):
>              alternates = name
>          else:
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.mercurial-scm.org/pipermail/mercurial-devel/attachments/20170620/31a385f3/attachment.html>


More information about the Mercurial-devel mailing list