ui: add the ability to apply `defaultrc` configs from resources
authorMatt Harbison <matt_harbison@yahoo.com>
Sun, 29 Dec 2019 21:06:34 -0500
changeset 44031 1864efbe90d9
parent 44030 5ac0e6f19eb4
child 44032 2d4cad94d08a
ui: add the ability to apply `defaultrc` configs from resources We will want the ability to cat out these resources, but the same would apply to templates, so I'm going to wait for the dust to settle on that. Reading the default config directly from the filesystem is still in place for now. Differential Revision: https://phab.mercurial-scm.org/D7776
mercurial/commands.py
mercurial/rcutil.py
mercurial/ui.py
tests/test-config-env.py
--- a/mercurial/commands.py	Sun Dec 29 20:51:44 2019 -0500
+++ b/mercurial/commands.py	Sun Dec 29 21:06:34 2019 -0500
@@ -2223,6 +2223,8 @@
     for t, f in rcutil.rccomponents():
         if t == b'path':
             ui.debug(b'read config from: %s\n' % f)
+        elif t == b'resource':
+            ui.debug(b'read config from: resource:%s.%s\n' % (f[0], f[1]))
         elif t == b'items':
             # Don't print anything for 'items'.
             pass
--- a/mercurial/rcutil.py	Sun Dec 29 20:51:44 2019 -0500
+++ b/mercurial/rcutil.py	Sun Dec 29 21:06:34 2019 -0500
@@ -67,6 +67,17 @@
     return _expandrcpath(defaultpath)
 
 
+def default_rc_resources():
+    """return rc resource IDs in defaultrc"""
+    rsrcs = resourceutil.contents(b'mercurial.defaultrc')
+    return [
+        (b'mercurial.defaultrc', r)
+        for r in sorted(rsrcs)
+        if resourceutil.is_resource(b'mercurial.defaultrc', r)
+        and r.endswith(b'.rc')
+    ]
+
+
 def rccomponents():
     '''return an ordered [(type, obj)] about where to load configs.
 
@@ -75,9 +86,10 @@
 
     if a directory is provided, *.rc files under it will be used.
 
-    type could be either 'path' or 'items', if type is 'path', obj is a string,
-    and is the config file path. if type is 'items', obj is a list of (section,
-    name, value, source) that should fill the config directly.
+    type could be either 'path', 'items' or 'resource'. If type is 'path',
+    obj is a string, and is the config file path. if type is 'items', obj is a
+    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())
 
@@ -90,10 +102,12 @@
                 continue
             _rccomponents.extend((b'path', p) for p in _expandrcpath(p))
     else:
+        _rccomponents = [(b'resource', r) for r in default_rc_resources()]
+
         normpaths = lambda paths: [
             (b'path', os.path.normpath(p)) for p in paths
         ]
-        _rccomponents = normpaths(defaultrcpath() + systemrcpath())
+        _rccomponents.extend(normpaths(defaultrcpath() + systemrcpath()))
         _rccomponents.append(envrc)
         _rccomponents.extend(normpaths(userrcpath()))
     return _rccomponents
--- a/mercurial/ui.py	Sun Dec 29 20:51:44 2019 -0500
+++ b/mercurial/ui.py	Sun Dec 29 21:06:34 2019 -0500
@@ -308,6 +308,8 @@
         for t, f in rcutil.rccomponents():
             if t == b'path':
                 u.readconfig(f, trust=True)
+            elif t == b'resource':
+                u.read_resource_config(f, trust=True)
             elif t == b'items':
                 sections = set()
                 for section, name, value, source in f:
--- a/tests/test-config-env.py	Sun Dec 29 20:51:44 2019 -0500
+++ b/tests/test-config-env.py	Sun Dec 29 21:06:34 2019 -0500
@@ -37,6 +37,7 @@
 
 
 extensions.wrapfunction(rcutil, 'defaultrcpath', lambda orig: [])
+extensions.wrapfunction(rcutil, 'default_rc_resources', lambda orig: [])
 
 rcutil.systemrcpath = systemrcpath
 rcutil.userrcpath = userrcpath