changeset 52426:22129ce9f86d

config: include the component level when returning them This will be useful when modifying them.
author Pierre-Yves David <pierre-yves.david@octobus.net>
date Wed, 23 Oct 2024 01:32:33 +0200
parents 3e79ca017157
children 8c509a70b6fa
files mercurial/configuration/__init__.py mercurial/configuration/command.py mercurial/configuration/rcutil.py mercurial/dispatch.py mercurial/ui.py
diffstat 5 files changed, 42 insertions(+), 19 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial/configuration/__init__.py	Wed Oct 23 00:43:17 2024 +0200
+++ b/mercurial/configuration/__init__.py	Wed Oct 23 01:32:33 2024 +0200
@@ -10,11 +10,15 @@
 
 # keep typing simple for now
 ConfigLevelT = str
-LEVEL_USER = 'user'  # "user" is the default level and never passed explicitly
+LEVEL_BUNDLED_RESOURCE = 'RESOURCE'
+LEVEL_ENV_OVERWRITE = 'ENV-HGRCPATH'
+LEVEL_USER = 'user'
 LEVEL_LOCAL = 'local'
 LEVEL_GLOBAL = 'global'
 LEVEL_SHARED = 'shared'
 LEVEL_NON_SHARED = 'non_shared'
+# only include level that it make sense to edit
+# note: "user" is the default level and never passed explicitly
 EDIT_LEVELS = (
     LEVEL_USER,
     LEVEL_LOCAL,
@@ -27,6 +31,7 @@
 ResourceIDT = Tuple[bytes, bytes]
 FileRCT = bytes
 ComponentT = Tuple[
+    ConfigLevelT,
     bytes,
     Union[
         List[ConfigItemT],
--- a/mercurial/configuration/command.py	Wed Oct 23 00:43:17 2024 +0200
+++ b/mercurial/configuration/command.py	Wed Oct 23 01:32:33 2024 +0200
@@ -111,7 +111,7 @@
     XXX this skip over various source and ignore the repository config, so it
     XXX is probably useless old code.
     """
-    for t, f in rcutil.rccomponents():
+    for _lvl, t, f in rcutil.rccomponents():
         if t == b'path':
             ui.debug(b'read config from: %s\n' % f)
         elif t == b'resource':
--- a/mercurial/configuration/rcutil.py	Wed Oct 23 00:43:17 2024 +0200
+++ b/mercurial/configuration/rcutil.py	Wed Oct 23 01:32:33 2024 +0200
@@ -100,25 +100,29 @@
     list of (section, name, value, source) that should fill the config directly.
     If type is 'resource', obj is a tuple of (package name, resource name).
     """
-    envrc = (b'items', envrcitems())
+    envrc = (conf_mod.LEVEL_ENV_OVERWRITE, b'items', envrcitems())
+
+    _rccomponents = []
+    comp = _rccomponents.append
 
     if b'HGRCPATH' in encoding.environ:
         # assume HGRCPATH is all about user configs so environments can be
         # overridden.
-        _rccomponents = [envrc]
+        comp(envrc)
         for p in encoding.environ[b'HGRCPATH'].split(pycompat.ospathsep):
             if not p:
                 continue
-            _rccomponents.extend((b'path', p) for p in _expandrcpath(p))
+            for p in _expandrcpath(p):
+                comp((conf_mod.LEVEL_ENV_OVERWRITE, b'path', p))
     else:
-        _rccomponents = [(b'resource', r) for r in default_rc_resources()]
+        for r in default_rc_resources():
+            comp((conf_mod.LEVEL_BUNDLED_RESOURCE, b'resource', r))
 
-        normpaths = lambda paths: [
-            (b'path', os.path.normpath(p)) for p in paths
-        ]
-        _rccomponents.extend(normpaths(systemrcpath()))
-        _rccomponents.append(envrc)
-        _rccomponents.extend(normpaths(userrcpath()))
+        for p in systemrcpath():
+            comp((conf_mod.LEVEL_GLOBAL, b'path', os.path.normpath(p)))
+        comp(envrc)
+        for p in userrcpath():
+            comp((conf_mod.LEVEL_USER, b'path', os.path.normpath(p)))
     return _rccomponents
 
 
@@ -147,10 +151,24 @@
 def repo_components(repo_path: bytes) -> List[ComponentT]:
     """return the list of config file to read for a repository"""
     components = []
-    components.extend(_shared_source_component(repo_path))
-    components.append(os.path.join(repo_path, b".hg", b"hgrc"))
-    components.append(os.path.join(repo_path, b".hg", b"hgrc-not-shared"))
-    return [(b'path', c) for c in components]
+    comp = components.append
+    for p in _shared_source_component(repo_path):
+        comp((conf_mod.LEVEL_SHARED, b'path', p))
+    comp(
+        (
+            conf_mod.LEVEL_LOCAL,
+            b'path',
+            os.path.join(repo_path, b".hg", b"hgrc"),
+        )
+    )
+    comp(
+        (
+            conf_mod.LEVEL_NON_SHARED,
+            b'path',
+            os.path.join(repo_path, b".hg", b"hgrc-not-shared"),
+        )
+    )
+    return components
 
 
 def defaultpagerenv() -> Dict[bytes, bytes]:
--- a/mercurial/dispatch.py	Wed Oct 23 00:43:17 2024 +0200
+++ b/mercurial/dispatch.py	Wed Oct 23 01:32:33 2024 +0200
@@ -954,7 +954,7 @@
     else:
         lui = ui.copy()
         if rcutil.use_repo_hgrc():
-            for c_type, rc_path in rcutil.repo_components(path):
+            for __, c_type, rc_path in rcutil.repo_components(path):
                 assert c_type == b'path'
                 lui.readconfig(rc_path, root=path)
 
@@ -966,7 +966,7 @@
         path = path_obj.rawloc
         lui = ui.copy()
         if rcutil.use_repo_hgrc():
-            for c_type, rc_path in rcutil.repo_components(path):
+            for __, c_type, rc_path in rcutil.repo_components(path):
                 assert c_type == b'path'
                 lui.readconfig(rc_path, root=path)
 
--- a/mercurial/ui.py	Wed Oct 23 00:43:17 2024 +0200
+++ b/mercurial/ui.py	Wed Oct 23 01:32:33 2024 +0200
@@ -335,7 +335,7 @@
         """Create a ui and load global and user configs"""
         u = cls()
         # we always trust global config files and environment variables
-        for t, f in rcutil.rccomponents():
+        for _lvl, t, f in rcutil.rccomponents():
             if t == b'path':
                 u.readconfig(f, trust=True)
             elif t == b'resource':