From patchwork Sat May 2 04:56:20 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Subject: [5, of, 6] config: give it a mapfile option, for parsing them specially From: =?utf-8?q?Jordi_Guti=C3=A9rrez_Hermoso?= X-Patchwork-Id: 8850 Message-Id: To: mercurial-devel@selenic.com Date: Sat, 02 May 2015 00:56:20 -0400 # HG changeset patch # User Jordi GutiƩrrez Hermoso # Date 1430344009 14400 # Wed Apr 29 17:46:49 2015 -0400 # Node ID c06e371d76b759b900b34120d8d3e90a63790660 # Parent 5adc92b85bfe045bfd527d836eccad53a5568e92 config: give it a mapfile option, for parsing them specially It is desirable to "derive" templates from the provided templates. A simple way to do this is e.g. %include map-cmdline.default in your own mapfile. Then you only have to redefine a few templates instead of copying over the whole thing. This %include mechanism already works for the built-in templates because by default it *only* looks for files that are in the same directory as the including mapfile. With this changeset, config grows an option to optionally add the templates directory to the %include path. diff --git a/mercurial/config.py b/mercurial/config.py --- a/mercurial/config.py +++ b/mercurial/config.py @@ -8,12 +8,14 @@ from i18n import _ import error, util import os, errno +import templater class config(object): - def __init__(self, data=None): + def __init__(self, data=None, mapfile=False): self._data = {} self._source = {} self._unset = [] + self._mapfile = mapfile if data: for k in data._data: self._data[k] = data[k].copy() @@ -110,18 +112,29 @@ class config(object): item = None cont = False m = includere.match(l) - if m: - inc = util.expandpath(m.group(1)) - base = os.path.dirname(src) - inc = os.path.normpath(os.path.join(base, inc)) + def includefile(inc): if include: try: include(inc, remap=remap, sections=sections) + return True except IOError, inst: if inst.errno != errno.ENOENT: raise error.ParseError(_("cannot include %s (%s)") % (inc, inst.strerror), "%s:%s" % (src, line)) + else: + return False + if m: + expanded = util.expandpath(m.group(1)) + base = os.path.dirname(src) + inc = os.path.normpath(os.path.join(base, expanded)) + + if not includefile(inc) and self._mapfile: + # For template mapfiles, try to include from the + # template directory, after looking in the current + # directory already failed. + includefile(templater.templatepath(expanded)) + continue if emptyre.match(l): continue