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.
--- 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']