changeset 52447:0a81f3ef054c

config: move `rcutil` module under a new `mercurial.configuration` module This new module aims at gathering configuration related code, rcutil definitely deserves to live there.
author Pierre-Yves David <pierre-yves.david@octobus.net>
date Mon, 21 Oct 2024 13:39:44 +0200
parents 4eec920bbb37
children c97e0fd26225
files hgext/zeroconf/__init__.py mercurial/commands.py mercurial/configuration/__init__.py mercurial/configuration/rcutil.py mercurial/dispatch.py mercurial/hgweb/hgwebdir_mod.py mercurial/localrepo.py mercurial/rcutil.py mercurial/ui.py setup.py tests/test-config-env.py
diffstat 10 files changed, 127 insertions(+), 128 deletions(-) [+]
line wrap: on
line diff
--- a/hgext/zeroconf/__init__.py	Thu Dec 05 18:07:55 2024 +0100
+++ b/hgext/zeroconf/__init__.py	Mon Oct 21 13:39:44 2024 +0200
@@ -36,9 +36,9 @@
     extensions,
     hg,
     pycompat,
-    rcutil,
     ui as uimod,
 )
+from mercurial.configuration import rcutil
 from mercurial.hgweb import server as servermod
 
 # Note for extension authors: ONLY specify testedwith = 'ships-with-hg-core' for
--- a/mercurial/commands.py	Thu Dec 05 18:07:55 2024 +0100
+++ b/mercurial/commands.py	Mon Oct 21 13:39:44 2024 +0200
@@ -52,7 +52,6 @@
     patch,
     phases,
     pycompat,
-    rcutil,
     registrar,
     requirements,
     revsetlang,
@@ -70,7 +69,7 @@
 )
 
 from .cmd_impls import graft as graft_impl
-
+from .configuration import rcutil
 from .utils import (
     dateutil,
     procutil,
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mercurial/configuration/rcutil.py	Mon Oct 21 13:39:44 2024 +0200
@@ -0,0 +1,119 @@
+# rcutil.py - utilities about config paths, special config sections etc.
+#
+#  Copyright Mercurial Contributors
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+from __future__ import annotations
+
+import os
+
+from .. import (
+    encoding,
+    pycompat,
+    util,
+)
+
+from ..utils import resourceutil
+
+if pycompat.iswindows:
+    from .. import scmwindows as scmplatform
+else:
+    from .. import scmposix as scmplatform
+
+fallbackpager = scmplatform.fallbackpager
+systemrcpath = scmplatform.systemrcpath
+userrcpath = scmplatform.userrcpath
+
+
+def _expandrcpath(path):
+    '''path could be a file or a directory. return a list of file paths'''
+    p = util.expandpath(path)
+    if os.path.isdir(p):
+        join = os.path.join
+        return sorted(
+            join(p, f) for f, k in util.listdir(p) if f.endswith(b'.rc')
+        )
+    return [p]
+
+
+def envrcitems(env=None):
+    """Return [(section, name, value, source)] config items.
+
+    The config items are extracted from environment variables specified by env,
+    used to override systemrc, but not userrc.
+
+    If env is not provided, encoding.environ will be used.
+    """
+    if env is None:
+        env = encoding.environ
+    checklist = [
+        (b'EDITOR', b'ui', b'editor'),
+        (b'VISUAL', b'ui', b'editor'),
+        (b'PAGER', b'pager', b'pager'),
+    ]
+    result = []
+    for envname, section, configname in checklist:
+        if envname not in env:
+            continue
+        result.append((section, configname, env[envname], b'$%s' % envname))
+    return result
+
+
+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.
+
+    respect $HGRCPATH. if $HGRCPATH is empty, only .hg/hgrc of current repo is
+    used. if $HGRCPATH is not set, the platform default will be used.
+
+    if a directory is provided, *.rc files under it will be used.
+
+    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())
+
+    if b'HGRCPATH' in encoding.environ:
+        # assume HGRCPATH is all about user configs so environments can be
+        # overridden.
+        _rccomponents = [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))
+    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.extend(normpaths(systemrcpath()))
+        _rccomponents.append(envrc)
+        _rccomponents.extend(normpaths(userrcpath()))
+    return _rccomponents
+
+
+def defaultpagerenv():
+    """return a dict of default environment variables and their values,
+    intended to be set before starting a pager.
+    """
+    return {b'LESS': b'FRX', b'LV': b'-c'}
+
+
+def use_repo_hgrc():
+    """True if repositories `.hg/hgrc` config should be read"""
+    return b'HGRCSKIPREPO' not in encoding.environ
--- a/mercurial/dispatch.py	Thu Dec 05 18:07:55 2024 +0100
+++ b/mercurial/dispatch.py	Mon Oct 21 13:39:44 2024 +0200
@@ -37,7 +37,6 @@
     localrepo,
     profiling,
     pycompat,
-    rcutil,
     registrar,
     requirements as requirementsmod,
     scmutil,
@@ -46,6 +45,7 @@
     vfs,
 )
 
+from .configuration import rcutil
 from .utils import (
     procutil,
     stringutil,
--- a/mercurial/hgweb/hgwebdir_mod.py	Thu Dec 05 18:07:55 2024 +0100
+++ b/mercurial/hgweb/hgwebdir_mod.py	Mon Oct 21 13:39:44 2024 +0200
@@ -35,7 +35,6 @@
     pathutil,
     profiling,
     pycompat,
-    rcutil,
     registrar,
     scmutil,
     templater,
@@ -50,6 +49,7 @@
     webutil,
     wsgicgi,
 )
+from ..configuration import rcutil
 from ..utils import dateutil
 
 
--- a/mercurial/localrepo.py	Thu Dec 05 18:07:55 2024 +0100
+++ b/mercurial/localrepo.py	Mon Oct 21 13:39:44 2024 +0200
@@ -59,7 +59,6 @@
     policy,
     pushkey,
     pycompat,
-    rcutil,
     repoview,
     requirements as requirementsmod,
     revlog,
@@ -80,7 +79,7 @@
 from .branching import (
     rev_cache as rev_branch_cache,
 )
-
+from .configuration import rcutil
 from .interfaces import (
     repository,
 )
--- a/mercurial/rcutil.py	Thu Dec 05 18:07:55 2024 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,119 +0,0 @@
-# rcutil.py - utilities about config paths, special config sections etc.
-#
-#  Copyright Mercurial Contributors
-#
-# This software may be used and distributed according to the terms of the
-# GNU General Public License version 2 or any later version.
-
-from __future__ import annotations
-
-import os
-
-from . import (
-    encoding,
-    pycompat,
-    util,
-)
-
-from .utils import resourceutil
-
-if pycompat.iswindows:
-    from . import scmwindows as scmplatform
-else:
-    from . import scmposix as scmplatform
-
-fallbackpager = scmplatform.fallbackpager
-systemrcpath = scmplatform.systemrcpath
-userrcpath = scmplatform.userrcpath
-
-
-def _expandrcpath(path):
-    '''path could be a file or a directory. return a list of file paths'''
-    p = util.expandpath(path)
-    if os.path.isdir(p):
-        join = os.path.join
-        return sorted(
-            join(p, f) for f, k in util.listdir(p) if f.endswith(b'.rc')
-        )
-    return [p]
-
-
-def envrcitems(env=None):
-    """Return [(section, name, value, source)] config items.
-
-    The config items are extracted from environment variables specified by env,
-    used to override systemrc, but not userrc.
-
-    If env is not provided, encoding.environ will be used.
-    """
-    if env is None:
-        env = encoding.environ
-    checklist = [
-        (b'EDITOR', b'ui', b'editor'),
-        (b'VISUAL', b'ui', b'editor'),
-        (b'PAGER', b'pager', b'pager'),
-    ]
-    result = []
-    for envname, section, configname in checklist:
-        if envname not in env:
-            continue
-        result.append((section, configname, env[envname], b'$%s' % envname))
-    return result
-
-
-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.
-
-    respect $HGRCPATH. if $HGRCPATH is empty, only .hg/hgrc of current repo is
-    used. if $HGRCPATH is not set, the platform default will be used.
-
-    if a directory is provided, *.rc files under it will be used.
-
-    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())
-
-    if b'HGRCPATH' in encoding.environ:
-        # assume HGRCPATH is all about user configs so environments can be
-        # overridden.
-        _rccomponents = [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))
-    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.extend(normpaths(systemrcpath()))
-        _rccomponents.append(envrc)
-        _rccomponents.extend(normpaths(userrcpath()))
-    return _rccomponents
-
-
-def defaultpagerenv():
-    """return a dict of default environment variables and their values,
-    intended to be set before starting a pager.
-    """
-    return {b'LESS': b'FRX', b'LV': b'-c'}
-
-
-def use_repo_hgrc():
-    """True if repositories `.hg/hgrc` config should be read"""
-    return b'HGRCSKIPREPO' not in encoding.environ
--- a/mercurial/ui.py	Thu Dec 05 18:07:55 2024 +0100
+++ b/mercurial/ui.py	Mon Oct 21 13:39:44 2024 +0200
@@ -50,10 +50,10 @@
     loggingutil,
     progress,
     pycompat,
-    rcutil,
     scmutil,
     util,
 )
+from .configuration import rcutil
 from .utils import (
     dateutil,
     procutil,
--- a/setup.py	Thu Dec 05 18:07:55 2024 +0100
+++ b/setup.py	Mon Oct 21 13:39:44 2024 +0200
@@ -1359,6 +1359,7 @@
     'mercurial.cext',
     'mercurial.cffi',
     'mercurial.cmd_impls',
+    'mercurial.configuration',
     'mercurial.branching',
     'mercurial.defaultrc',
     'mercurial.dirstateutils',
--- a/tests/test-config-env.py	Thu Dec 05 18:07:55 2024 +0100
+++ b/tests/test-config-env.py	Mon Oct 21 13:39:44 2024 +0200
@@ -6,11 +6,11 @@
 from mercurial import (
     encoding,
     extensions,
-    rcutil,
     ui as uimod,
     util,
 )
 
+from mercurial.configuration import rcutil
 from mercurial.utils import procutil
 
 testtmp = encoding.environ[b'TESTTMP']