Mercurial > public > mercurial-scm > hg
comparison mercurial/configuration/rcutil.py @ 52416: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 | mercurial/rcutil.py@f4733654f144 |
children | 91f22b89ea05 |
comparison
equal
deleted
inserted
replaced
52415:4eec920bbb37 | 52416:0a81f3ef054c |
---|---|
1 # rcutil.py - utilities about config paths, special config sections etc. | |
2 # | |
3 # Copyright Mercurial Contributors | |
4 # | |
5 # This software may be used and distributed according to the terms of the | |
6 # GNU General Public License version 2 or any later version. | |
7 | |
8 from __future__ import annotations | |
9 | |
10 import os | |
11 | |
12 from .. import ( | |
13 encoding, | |
14 pycompat, | |
15 util, | |
16 ) | |
17 | |
18 from ..utils import resourceutil | |
19 | |
20 if pycompat.iswindows: | |
21 from .. import scmwindows as scmplatform | |
22 else: | |
23 from .. import scmposix as scmplatform | |
24 | |
25 fallbackpager = scmplatform.fallbackpager | |
26 systemrcpath = scmplatform.systemrcpath | |
27 userrcpath = scmplatform.userrcpath | |
28 | |
29 | |
30 def _expandrcpath(path): | |
31 '''path could be a file or a directory. return a list of file paths''' | |
32 p = util.expandpath(path) | |
33 if os.path.isdir(p): | |
34 join = os.path.join | |
35 return sorted( | |
36 join(p, f) for f, k in util.listdir(p) if f.endswith(b'.rc') | |
37 ) | |
38 return [p] | |
39 | |
40 | |
41 def envrcitems(env=None): | |
42 """Return [(section, name, value, source)] config items. | |
43 | |
44 The config items are extracted from environment variables specified by env, | |
45 used to override systemrc, but not userrc. | |
46 | |
47 If env is not provided, encoding.environ will be used. | |
48 """ | |
49 if env is None: | |
50 env = encoding.environ | |
51 checklist = [ | |
52 (b'EDITOR', b'ui', b'editor'), | |
53 (b'VISUAL', b'ui', b'editor'), | |
54 (b'PAGER', b'pager', b'pager'), | |
55 ] | |
56 result = [] | |
57 for envname, section, configname in checklist: | |
58 if envname not in env: | |
59 continue | |
60 result.append((section, configname, env[envname], b'$%s' % envname)) | |
61 return result | |
62 | |
63 | |
64 def default_rc_resources(): | |
65 """return rc resource IDs in defaultrc""" | |
66 rsrcs = resourceutil.contents(b'mercurial.defaultrc') | |
67 return [ | |
68 (b'mercurial.defaultrc', r) | |
69 for r in sorted(rsrcs) | |
70 if resourceutil.is_resource(b'mercurial.defaultrc', r) | |
71 and r.endswith(b'.rc') | |
72 ] | |
73 | |
74 | |
75 def rccomponents(): | |
76 """return an ordered [(type, obj)] about where to load configs. | |
77 | |
78 respect $HGRCPATH. if $HGRCPATH is empty, only .hg/hgrc of current repo is | |
79 used. if $HGRCPATH is not set, the platform default will be used. | |
80 | |
81 if a directory is provided, *.rc files under it will be used. | |
82 | |
83 type could be either 'path', 'items' or 'resource'. If type is 'path', | |
84 obj is a string, and is the config file path. if type is 'items', obj is a | |
85 list of (section, name, value, source) that should fill the config directly. | |
86 If type is 'resource', obj is a tuple of (package name, resource name). | |
87 """ | |
88 envrc = (b'items', envrcitems()) | |
89 | |
90 if b'HGRCPATH' in encoding.environ: | |
91 # assume HGRCPATH is all about user configs so environments can be | |
92 # overridden. | |
93 _rccomponents = [envrc] | |
94 for p in encoding.environ[b'HGRCPATH'].split(pycompat.ospathsep): | |
95 if not p: | |
96 continue | |
97 _rccomponents.extend((b'path', p) for p in _expandrcpath(p)) | |
98 else: | |
99 _rccomponents = [(b'resource', r) for r in default_rc_resources()] | |
100 | |
101 normpaths = lambda paths: [ | |
102 (b'path', os.path.normpath(p)) for p in paths | |
103 ] | |
104 _rccomponents.extend(normpaths(systemrcpath())) | |
105 _rccomponents.append(envrc) | |
106 _rccomponents.extend(normpaths(userrcpath())) | |
107 return _rccomponents | |
108 | |
109 | |
110 def defaultpagerenv(): | |
111 """return a dict of default environment variables and their values, | |
112 intended to be set before starting a pager. | |
113 """ | |
114 return {b'LESS': b'FRX', b'LV': b'-c'} | |
115 | |
116 | |
117 def use_repo_hgrc(): | |
118 """True if repositories `.hg/hgrc` config should be read""" | |
119 return b'HGRCSKIPREPO' not in encoding.environ |