comparison mercurial/configuration/rcutil.py @ 52451:91f22b89ea05

config: type `rcutil` It helps to understand what is going on here and catch future errors.
author Pierre-Yves David <pierre-yves.david@octobus.net>
date Tue, 22 Oct 2024 17:23:28 +0200
parents 0a81f3ef054c
children 0b791c90280a
comparison
equal deleted inserted replaced
52450:04c3fb885fb6 52451:91f22b89ea05
6 # GNU General Public License version 2 or any later version. 6 # GNU General Public License version 2 or any later version.
7 7
8 from __future__ import annotations 8 from __future__ import annotations
9 9
10 import os 10 import os
11
12 from typing import (
13 Dict,
14 List,
15 Optional,
16 Tuple,
17 Union,
18 )
11 19
12 from .. import ( 20 from .. import (
13 encoding, 21 encoding,
14 pycompat, 22 pycompat,
15 util, 23 util,
24 32
25 fallbackpager = scmplatform.fallbackpager 33 fallbackpager = scmplatform.fallbackpager
26 systemrcpath = scmplatform.systemrcpath 34 systemrcpath = scmplatform.systemrcpath
27 userrcpath = scmplatform.userrcpath 35 userrcpath = scmplatform.userrcpath
28 36
37 ConfigItemT = Tuple[bytes, bytes, bytes, bytes]
38 ResourceIDT = Tuple[bytes, bytes]
39 FileRCT = bytes
40 ComponentT = Tuple[
41 bytes,
42 Union[
43 List[ConfigItemT],
44 FileRCT,
45 ResourceIDT,
46 ],
47 ]
29 48
30 def _expandrcpath(path): 49
50 def _expandrcpath(path: bytes) -> List[FileRCT]:
31 '''path could be a file or a directory. return a list of file paths''' 51 '''path could be a file or a directory. return a list of file paths'''
32 p = util.expandpath(path) 52 p = util.expandpath(path)
33 if os.path.isdir(p): 53 if os.path.isdir(p):
34 join = os.path.join 54 join = os.path.join
35 return sorted( 55 return sorted(
36 join(p, f) for f, k in util.listdir(p) if f.endswith(b'.rc') 56 join(p, f) for f, k in util.listdir(p) if f.endswith(b'.rc')
37 ) 57 )
38 return [p] 58 return [p]
39 59
40 60
41 def envrcitems(env=None): 61 def envrcitems(env: Optional[Dict[bytes, bytes]] = None) -> List[ConfigItemT]:
42 """Return [(section, name, value, source)] config items. 62 """Return [(section, name, value, source)] config items.
43 63
44 The config items are extracted from environment variables specified by env, 64 The config items are extracted from environment variables specified by env,
45 used to override systemrc, but not userrc. 65 used to override systemrc, but not userrc.
46 66
59 continue 79 continue
60 result.append((section, configname, env[envname], b'$%s' % envname)) 80 result.append((section, configname, env[envname], b'$%s' % envname))
61 return result 81 return result
62 82
63 83
64 def default_rc_resources(): 84 def default_rc_resources() -> List[ResourceIDT]:
65 """return rc resource IDs in defaultrc""" 85 """return rc resource IDs in defaultrc"""
66 rsrcs = resourceutil.contents(b'mercurial.defaultrc') 86 rsrcs = resourceutil.contents(b'mercurial.defaultrc')
67 return [ 87 return [
68 (b'mercurial.defaultrc', r) 88 (b'mercurial.defaultrc', r)
69 for r in sorted(rsrcs) 89 for r in sorted(rsrcs)
70 if resourceutil.is_resource(b'mercurial.defaultrc', r) 90 if resourceutil.is_resource(b'mercurial.defaultrc', r)
71 and r.endswith(b'.rc') 91 and r.endswith(b'.rc')
72 ] 92 ]
73 93
74 94
75 def rccomponents(): 95 def rccomponents() -> List[ComponentT]:
76 """return an ordered [(type, obj)] about where to load configs. 96 """return an ordered [(type, obj)] about where to load configs.
77 97
78 respect $HGRCPATH. if $HGRCPATH is empty, only .hg/hgrc of current repo is 98 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. 99 used. if $HGRCPATH is not set, the platform default will be used.
80 100
105 _rccomponents.append(envrc) 125 _rccomponents.append(envrc)
106 _rccomponents.extend(normpaths(userrcpath())) 126 _rccomponents.extend(normpaths(userrcpath()))
107 return _rccomponents 127 return _rccomponents
108 128
109 129
110 def defaultpagerenv(): 130 def defaultpagerenv() -> Dict[bytes, bytes]:
111 """return a dict of default environment variables and their values, 131 """return a dict of default environment variables and their values,
112 intended to be set before starting a pager. 132 intended to be set before starting a pager.
113 """ 133 """
114 return {b'LESS': b'FRX', b'LV': b'-c'} 134 return {b'LESS': b'FRX', b'LV': b'-c'}
115 135
116 136
117 def use_repo_hgrc(): 137 def use_repo_hgrc() -> bool:
118 """True if repositories `.hg/hgrc` config should be read""" 138 """True if repositories `.hg/hgrc` config should be read"""
119 return b'HGRCSKIPREPO' not in encoding.environ 139 return b'HGRCSKIPREPO' not in encoding.environ