config: pass both relative and absolute paths to `include` callback
authorMartin von Zweigbergk <martinvonz@google.com>
Tue, 21 Jul 2020 23:50:42 -0700
changeset 45208 f7f142d74df3
parent 45207 4489e9a22763
child 45209 8ec3062b7047
config: pass both relative and absolute paths to `include` callback The `include` callback is responsible for loading configs from `%include` statements. The callback currently gets passed the absolute path [1] to the config to read. That is created by joining the dirname of the file that contains the `%include` statement. For PyOxidizer support, I'm trying to reduce dependence on paths. This patch helps with that by passing the relative path found in the `%include` statement (but with username expansion, etc.) to the `include` callback. It also turns out that the existing callers can easily adapt to using the relative path. Coming patches will clean that up and then we'll remove the absolute path from the callback. [1] The "absolute path" bit is a bit of a lie -- it's going to be an absolute path if the path that was passed into `config.parse()` was absolute. Differential Revision: https://phab.mercurial-scm.org/D8790
mercurial/config.py
mercurial/subrepoutil.py
--- a/mercurial/config.py	Wed Jul 22 22:38:42 2020 -0700
+++ b/mercurial/config.py	Tue Jul 21 23:50:42 2020 -0700
@@ -168,7 +168,7 @@
                     inc = os.path.normpath(os.path.join(base, expanded))
 
                     try:
-                        include(inc, remap=remap, sections=sections)
+                        include(expanded, inc, remap=remap, sections=sections)
                         break
                     except IOError as inst:
                         if inst.errno != errno.ENOENT:
@@ -216,8 +216,12 @@
             b'config files must be opened in binary mode, got fp=%r mode=%r'
             % (fp, fp.mode,)
         )
+
+        def include(rel, abs, remap, sections):
+            self.read(abs, remap=remap, sections=sections)
+
         self.parse(
-            path, fp.read(), sections=sections, remap=remap, include=self.read
+            path, fp.read(), sections=sections, remap=remap, include=include
         )
 
 
--- a/mercurial/subrepoutil.py	Wed Jul 22 22:38:42 2020 -0700
+++ b/mercurial/subrepoutil.py	Tue Jul 21 23:50:42 2020 -0700
@@ -36,7 +36,7 @@
     p = config.config()
     repo = ctx.repo()
 
-    def read(f, sections=None, remap=None):
+    def read(rel, f, sections=None, remap=None):
         if f in ctx:
             try:
                 data = ctx[f].data()
@@ -56,7 +56,7 @@
             )
 
     if b'.hgsub' in ctx:
-        read(b'.hgsub')
+        read(b'.hgsub', b'.hgsub')
 
     for path, src in ui.configitems(b'subpaths'):
         p.set(b'subpaths', path, src, ui.configsource(b'subpaths', path))