Mercurial > public > mercurial-scm > hg-stable
diff mercurial/ui.py @ 8144:fca54469480e
ui: introduce new config parser
author | Matt Mackall <mpm@selenic.com> |
---|---|
date | Thu, 23 Apr 2009 15:40:10 -0500 |
parents | 507c49e297e1 |
children | c8cb471fc9c2 |
line wrap: on
line diff
--- a/mercurial/ui.py Thu Apr 23 15:40:10 2009 -0500 +++ b/mercurial/ui.py Thu Apr 23 15:40:10 2009 -0500 @@ -7,27 +7,19 @@ from i18n import _ import errno, getpass, os, re, socket, sys, tempfile -import ConfigParser, traceback, util +import config, traceback, util, error -def updateconfig(source, dest, sections=None): - if not sections: - sections = source.sections() - for section in sections: - if not dest.has_section(section): - dest.add_section(section) - if not source.has_section(section): - continue - for name, value in source.items(section, raw=True): - dest.set(section, name, value) +_booleans = {'1':True, 'yes':True, 'true':True, 'on':True, + '0':False, 'no':False, 'false':False, 'off':False} class ui(object): def __init__(self, parentui=None): self.buffers = [] self.quiet = self.verbose = self.debugflag = self.traceback = False self.interactive = self.report_untrusted = True - self.overlay = util.configparser() - self.cdata = util.configparser() - self.ucdata = util.configparser() + self.overlay = config.config() + self.cdata = config.config() + self.ucdata = config.config() self.parentui = None self.trusted_users = {} self.trusted_groups = {} @@ -35,10 +27,10 @@ if parentui: # parentui may point to an ui object which is already a child self.parentui = parentui.parentui or parentui - updateconfig(self.parentui.cdata, self.cdata) - updateconfig(self.parentui.ucdata, self.ucdata) + self.cdata.update(self.parentui.cdata) + self.ucdata.update(self.parentui.ucdata) # we want the overlay from the parent, not the root - updateconfig(parentui.overlay, self.overlay) + self.overlay.update(parentui.overlay) self.buffers = parentui.buffers self.trusted_users = parentui.trusted_users.copy() self.trusted_groups = parentui.trusted_groups.copy() @@ -89,22 +81,21 @@ return raise - cdata = util.configparser() + cdata = config.config() trusted = sections or assumetrusted or self._is_trusted(fp, filename) try: - cdata.readfp(fp, filename) - except ConfigParser.ParsingError, inst: - msg = _("Failed to parse %s\n%s") % (filename, inst) + cdata.read(filename, fp) + except error.ConfigError, inst: if trusted: - raise util.Abort(msg) - self.warn(_("Ignored: %s\n") % msg) + raise + self.warn(_("Ignored: %s\n") % str(inst)) if trusted: - updateconfig(cdata, self.cdata, sections) - updateconfig(self.overlay, self.cdata, sections) - updateconfig(cdata, self.ucdata, sections) - updateconfig(self.overlay, self.ucdata, sections) + self.cdata.update(cdata, sections) + self.cdata.update(self.overlay, sections) + self.ucdata.update(cdata, sections) + self.ucdata.update(self.overlay, sections) if root is None: root = os.path.expanduser('~') @@ -117,7 +108,7 @@ root = os.getcwd() items = section and [(name, value)] or [] for cdata in self.cdata, self.ucdata, self.overlay: - if not items and cdata.has_section('paths'): + if not items and 'paths' in cdata: pathsitems = cdata.items('paths') else: pathsitems = items @@ -149,8 +140,6 @@ def setconfig(self, section, name, value): for cdata in (self.overlay, self.cdata, self.ucdata): - if not cdata.has_section(section): - cdata.add_section(section) cdata.set(section, name, value) self.fixconfig(section, name, value) @@ -159,37 +148,23 @@ return self.ucdata return self.cdata - def _config(self, section, name, default, funcname, untrusted, abort): - cdata = self._get_cdata(untrusted) - if cdata.has_option(section, name): - try: - func = getattr(cdata, funcname) - return func(section, name) - except (ConfigParser.InterpolationError, ValueError), inst: - msg = _("Error in configuration section [%s] " - "parameter '%s':\n%s") % (section, name, inst) - if abort: - raise util.Abort(msg) - self.warn(_("Ignored: %s\n") % msg) - return default - - def _configcommon(self, section, name, default, funcname, untrusted): - value = self._config(section, name, default, funcname, - untrusted, abort=True) + def config(self, section, name, default=None, untrusted=False): + value = self._get_cdata(untrusted).get(section, name, default) if self.debugflag and not untrusted: - uvalue = self._config(section, name, None, funcname, - untrusted=True, abort=False) + uvalue = self.ucdata.get(section, name) if uvalue is not None and uvalue != value: self.warn(_("Ignoring untrusted configuration option " "%s.%s = %s\n") % (section, name, uvalue)) return value - def config(self, section, name, default=None, untrusted=False): - return self._configcommon(section, name, default, 'get', untrusted) - def configbool(self, section, name, default=False, untrusted=False): - return self._configcommon(section, name, default, 'getboolean', - untrusted) + v = self.config(section, name, None, untrusted) + if v == None: + return default + if v.lower() not in _booleans: + raise error.ConfigError(_("%s.%s not a boolean ('%s')") + % (section, name, v)) + return _booleans[v.lower()] def configlist(self, section, name, default=None, untrusted=False): """Return a list of comma/space separated strings""" @@ -202,38 +177,20 @@ def has_section(self, section, untrusted=False): '''tell whether section exists in config.''' - cdata = self._get_cdata(untrusted) - return cdata.has_section(section) - - def _configitems(self, section, untrusted, abort): - items = {} - cdata = self._get_cdata(untrusted) - if cdata.has_section(section): - try: - items.update(dict(cdata.items(section))) - except ConfigParser.InterpolationError, inst: - msg = _("Error in configuration section [%s]:\n" - "%s") % (section, inst) - if abort: - raise util.Abort(msg) - self.warn(_("Ignored: %s\n") % msg) - return items + return section in self._get_cdata(untrusted) def configitems(self, section, untrusted=False): - items = self._configitems(section, untrusted=untrusted, abort=True) + items = self._get_cdata(untrusted).items(section) if self.debugflag and not untrusted: - uitems = self._configitems(section, untrusted=True, abort=False) - for k in util.sort(uitems): - if uitems[k] != items.get(k): + for k,v in self.ucdata.items(section): + if self.cdata.get(section, k) != v: self.warn(_("Ignoring untrusted configuration option " - "%s.%s = %s\n") % (section, k, uitems[k])) - return util.sort(items.items()) + "%s.%s = %s\n") % (section, k, v)) + return items def walkconfig(self, untrusted=False): cdata = self._get_cdata(untrusted) - sections = cdata.sections() - sections.sort() - for section in sections: + for section in cdata.sections(): for name, value in self.configitems(section, untrusted): yield section, name, str(value).replace('\n', '\\n')