[PATCH 5 of 6 V3] config: give it a searchpaths option, for extra places for config files

Jordi GutiƩrrez Hermoso jordigh at octave.org
Sun May 10 13:44:45 CDT 2015


# HG changeset patch
# User Jordi GutiƩrrez Hermoso <jordigh at octave.org>
# Date 1431281253 14400
#      Sun May 10 14:07:33 2015 -0400
# Node ID f23483529388f9dcb66e4eaceb10b2e6a5c0f0fb
# Parent  c793b56f22127b01564b42d43f018c24f18b84fc
config: give it a searchpaths option, for extra places for config files

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 add more search paths
for config files.

diff --git a/mercurial/config.py b/mercurial/config.py
--- a/mercurial/config.py
+++ b/mercurial/config.py
@@ -10,10 +10,11 @@ import error, util
 import os, errno
 
 class config(object):
-    def __init__(self, data=None):
+    def __init__(self, data=None, searchpaths=[]):
         self._data = {}
         self._source = {}
         self._unset = []
+        self._searchpaths = searchpaths
         if data:
             for k in data._data:
                 self._data[k] = data[k].copy()
@@ -110,18 +111,28 @@ 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))
+                searchpaths = [os.path.dirname(src)] + self._searchpaths
+
+                for base in searchpaths:
+                    inc = os.path.normpath(os.path.join(base, expanded))
+
+                    if includefile(inc):
+                        break
+
                 continue
             if emptyre.match(l):
                 continue


More information about the Mercurial-devel mailing list