[PATCH 01 of 10 RFC v2] ui: refactoring handling of trusted, user and overlay

Jun Wu quark at fb.com
Fri Mar 17 11:54:55 EDT 2017


Another issue with the "compat" layer outside "ucfg" or "tcfg" is that it
cannot handle the case where ucfg or tcfg have different ui.compat setting.

I just discovered this when writing the immutable stuff. Hopefully I can
send a V1 today.

Excerpts from David Soria Parra's message of 2017-03-12 15:40:24 -0700:
> # HG changeset patch
> # User David Soria Parra <davidsp at fb.com>
> # Date 1489349204 25200
> #      Sun Mar 12 13:06:44 2017 -0700
> # Node ID 99514a82d5b23c75bd6da38e522acfd14a618c14
> # Parent  1c3352d7eaf24533ad52d4b8a024211e9189fb0b
> ui: refactoring handling of trusted, user and overlay
> 
> We are using obscure names such as _ocfg for overlay-config in the UI. This is
> sometimes confusing and not very flexible. We are moving this into a dictionary
> now that has a specific ordering in which we would apply multiple layers of
> configuration. At the moment this is not needed as we always pick either
> user-config or trusted-config and overlay it, but it gets us a good machinery to
> add a defaults layer for ui.compat.
> 
> diff --git a/mercurial/ui.py b/mercurial/ui.py
> --- a/mercurial/ui.py
> +++ b/mercurial/ui.py
> @@ -146,9 +146,7 @@
>          self._bufferapplylabels = None
>          self.quiet = self.verbose = self.debugflag = self.tracebackflag = False
>          self._reportuntrusted = True
> -        self._ocfg = config.config() # overlay
> -        self._tcfg = config.config() # trusted
> -        self._ucfg = config.config() # untrusted
> +        self._cfg = self.cfg()
>          self._trustusers = set()
>          self._trustgroups = set()
>          self.callhooks = True
> @@ -167,10 +165,6 @@
>              self.fin = src.fin
>              self.pageractive = src.pageractive
>              self._disablepager = src._disablepager
> -
> -            self._tcfg = src._tcfg.copy()
> -            self._ucfg = src._ucfg.copy()
> -            self._ocfg = src._ocfg.copy()
>              self._trustusers = src._trustusers.copy()
>              self._trustgroups = src._trustgroups.copy()
>              self.environ = src.environ
> @@ -179,6 +173,8 @@
>              self._colormode = src._colormode
>              self._terminfoparams = src._terminfoparams.copy()
>              self._styles = src._styles.copy()
> +            for k in self._cfg.keys():
> +                self._cfg[k] = src._cfg[k].copy()
>  
>              self.fixconfig()
>  
> @@ -296,21 +292,28 @@
>                  del cfg['templatealias'][k]
>  
>          if trusted:
> -            self._tcfg.update(cfg)
> -            self._tcfg.update(self._ocfg)
> -        self._ucfg.update(cfg)
> -        self._ucfg.update(self._ocfg)
> +            self._cfg['trusted'].update(cfg)
> +            self._cfg['trusted'].update(self._cfg['overlay'])
> +        self._cfg['user'].update(cfg)
> +        self._cfg['user'].update(self._cfg['overlay'])
>  
>          if root is None:
>              root = os.path.expanduser('~')
>          self.fixconfig(root=root)
>  
> +    def cfg(self):
> +        # Ordered in ascneding order of preference.
> +        return util.sortdict(
> +            [('user', config.config()),
> +            ('trusted', config.config()),
> +            ('overlay', config.config())])
> +
>      def fixconfig(self, root=None, section=None):
>          if section in (None, 'paths'):
>              # expand vars and ~
>              # translate paths relative to root (or home) into absolute paths
>              root = root or pycompat.getcwd()
> -            for c in self._tcfg, self._ucfg, self._ocfg:
> +            for c in self._cfg.values():
>                  for n, p in c.items('paths'):
>                      # Ignore sub-options.
>                      if ':' in n:
> @@ -345,21 +348,22 @@
>              self._trustgroups.update(self.configlist('trusted', 'groups'))
>  
>      def backupconfig(self, section, item):
> -        return (self._ocfg.backup(section, item),
> -                self._tcfg.backup(section, item),
> -                self._ucfg.backup(section, item),)
> +        return {k: cfg.backup(section, item) for k, cfg in self._cfg.items()}
> +
>      def restoreconfig(self, data):
> -        self._ocfg.restore(data[0])
> -        self._tcfg.restore(data[1])
> -        self._ucfg.restore(data[2])
> +        for k, d in data.items():
> +            self._cfg[k].restore(d)
>  
>      def setconfig(self, section, name, value, source=''):
> -        for cfg in (self._ocfg, self._tcfg, self._ucfg):
> +        for cfg in self._cfg.values():
>              cfg.set(section, name, value, source)
>          self.fixconfig(section=section)
>  
>      def _data(self, untrusted):
> -        return untrusted and self._ucfg or self._tcfg
> +        if untrusted:
> +            return self._cfg['user']
> +        else:
> +            return self._cfg['trusted']
>  
>      def configsource(self, section, name, untrusted=False):
>          return self._data(untrusted).source(section, name)
> @@ -380,7 +384,7 @@
>  
>          if self.debugflag and not untrusted and self._reportuntrusted:
>              for n in alternates:
> -                uvalue = self._ucfg.get(section, n)
> +                uvalue = self._cfg['user'].get(section, n)
>                  if uvalue is not None and uvalue != value:
>                      self.debug("ignoring untrusted configuration option "
>                                 "%s.%s = %s\n" % (section, n, uvalue))
> @@ -399,7 +403,7 @@
>          data = self._data(untrusted)
>          main = data.get(section, name, default)
>          if self.debugflag and not untrusted and self._reportuntrusted:
> -            uvalue = self._ucfg.get(section, name)
> +            uvalue = self._cfg['user'].get(section, name)
>              if uvalue is not None and uvalue != main:
>                  self.debug('ignoring untrusted configuration option '
>                             '%s.%s = %s\n' % (section, name, uvalue))
> @@ -412,7 +416,7 @@
>  
>          if self.debugflag and not untrusted and self._reportuntrusted:
>              for k, v in sub.items():
> -                uvalue = self._ucfg.get(section, '%s:%s' % (name, k))
> +                uvalue = self._cfg['user'].get(section, '%s:%s' % (name, k))
>                  if uvalue is not None and uvalue != v:
>                      self.debug('ignoring untrusted configuration option '
>                                 '%s:%s.%s = %s\n' % (section, name, k, uvalue))
> @@ -658,8 +662,8 @@
>                      newitems[k] = v
>              items = newitems.items()
>          if self.debugflag and not untrusted and self._reportuntrusted:
> -            for k, v in self._ucfg.items(section):
> -                if self._tcfg.get(section, k) != v:
> +            for k, v in self._cfg['user'].items(section):
> +                if self._cfg['trusted'].get(section, k) != v:
>                      self.debug("ignoring untrusted configuration option "
>                                 "%s.%s = %s\n" % (section, k, v))
>          return items


More information about the Mercurial-devel mailing list