# HG changeset patch
# User Martin von Zweigbergk <martinvonz@google.com>
# Date 1595400642 25200
#      Tue Jul 21 23:50:42 2020 -0700
# Node ID f7f142d74df3f0a04b2c1d0da2a64b7b6df8c8c2
# Parent  4489e9a2276345ea3786cdb15c7129f7b53a687f
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

diff --git a/mercurial/config.py b/mercurial/config.py
--- a/mercurial/config.py
+++ b/mercurial/config.py
@@ -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
         )
 
 
diff --git a/mercurial/subrepoutil.py b/mercurial/subrepoutil.py
--- a/mercurial/subrepoutil.py
+++ b/mercurial/subrepoutil.py
@@ -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))