Mercurial > hg
annotate mercurial/configitems.py @ 50896:b2b8c25f9462
hgwebmod: use sysstr to check for attribute presence
We do not need bytes here.
author | Pierre-Yves David <pierre-yves.david@octobus.net> |
---|---|
date | Wed, 30 Aug 2023 13:28:09 +0200 |
parents | 7f8f6fe13fa9 |
children | 9c5bd485fbb6 |
rev | line source |
---|---|
32983
0d757af1ea67
configitems: add a basic class to hold config item information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
1 # configitems.py - centralized declaration of configuration option |
0d757af1ea67
configitems: add a basic class to hold config item information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
2 # |
0d757af1ea67
configitems: add a basic class to hold config item information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
3 # Copyright 2017 Pierre-Yves David <pierre-yves.david@octobus.net> |
0d757af1ea67
configitems: add a basic class to hold config item information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
4 # |
0d757af1ea67
configitems: add a basic class to hold config item information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
5 # This software may be used and distributed according to the terms of the |
0d757af1ea67
configitems: add a basic class to hold config item information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
6 # GNU General Public License version 2 or any later version. |
0d757af1ea67
configitems: add a basic class to hold config item information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
7 |
0d757af1ea67
configitems: add a basic class to hold config item information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
8 |
33131
c2ca511c4771
configitems: extract the logic to build a registrar on any configtable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33061
diff
changeset
|
9 import functools |
34662
181d913b17e6
configitems: allow for the registration of "generic" config item
Boris Feld <boris.feld@octobus.net>
parents:
34653
diff
changeset
|
10 import re |
33131
c2ca511c4771
configitems: extract the logic to build a registrar on any configtable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33061
diff
changeset
|
11 |
50762
c51b178b0b7e
configitems: declare items in a TOML file
Raphaël Gomès <rgomes@octobus.net>
parents:
50760
diff
changeset
|
12 from .utils import resourceutil |
c51b178b0b7e
configitems: declare items in a TOML file
Raphaël Gomès <rgomes@octobus.net>
parents:
50760
diff
changeset
|
13 |
32984
6d983e8af49c
configitems: introduce a central registry for config option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32983
diff
changeset
|
14 from . import ( |
34239
344fd1fe237b
configitems: register the 'web.encoding' config
Boris Feld <boris.feld@octobus.net>
parents:
34238
diff
changeset
|
15 encoding, |
32984
6d983e8af49c
configitems: introduce a central registry for config option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32983
diff
changeset
|
16 error, |
6d983e8af49c
configitems: introduce a central registry for config option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32983
diff
changeset
|
17 ) |
6d983e8af49c
configitems: introduce a central registry for config option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32983
diff
changeset
|
18 |
50762
c51b178b0b7e
configitems: declare items in a TOML file
Raphaël Gomès <rgomes@octobus.net>
parents:
50760
diff
changeset
|
19 try: |
c51b178b0b7e
configitems: declare items in a TOML file
Raphaël Gomès <rgomes@octobus.net>
parents:
50760
diff
changeset
|
20 import tomllib # pytype: disable=import-error |
c51b178b0b7e
configitems: declare items in a TOML file
Raphaël Gomès <rgomes@octobus.net>
parents:
50760
diff
changeset
|
21 |
c51b178b0b7e
configitems: declare items in a TOML file
Raphaël Gomès <rgomes@octobus.net>
parents:
50760
diff
changeset
|
22 tomllib.load # trigger lazy import |
c51b178b0b7e
configitems: declare items in a TOML file
Raphaël Gomès <rgomes@octobus.net>
parents:
50760
diff
changeset
|
23 except ModuleNotFoundError: |
c51b178b0b7e
configitems: declare items in a TOML file
Raphaël Gomès <rgomes@octobus.net>
parents:
50760
diff
changeset
|
24 # Python <3.11 compat |
c51b178b0b7e
configitems: declare items in a TOML file
Raphaël Gomès <rgomes@octobus.net>
parents:
50760
diff
changeset
|
25 from .thirdparty import tomli as tomllib |
c51b178b0b7e
configitems: declare items in a TOML file
Raphaël Gomès <rgomes@octobus.net>
parents:
50760
diff
changeset
|
26 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43030
diff
changeset
|
27 |
33132
c467d13334ee
configitems: add an official API for extensions to register config item
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33131
diff
changeset
|
28 def loadconfigtable(ui, extname, configtable): |
c467d13334ee
configitems: add an official API for extensions to register config item
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33131
diff
changeset
|
29 """update config item known to the ui with the extension ones""" |
35808
178aacdc25db
configitems: traverse sections deterministically
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35763
diff
changeset
|
30 for section, items in sorted(configtable.items()): |
34768
2b954c9c5395
configitems: fix registration of extensions config
Boris Feld <boris.feld@octobus.net>
parents:
34759
diff
changeset
|
31 knownitems = ui._knownconfig.setdefault(section, itemregister()) |
33133
bf1292c057ef
configitems: add a devel warning for extensions items overiding core one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33132
diff
changeset
|
32 knownkeys = set(knownitems) |
bf1292c057ef
configitems: add a devel warning for extensions items overiding core one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33132
diff
changeset
|
33 newkeys = set(items) |
bf1292c057ef
configitems: add a devel warning for extensions items overiding core one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33132
diff
changeset
|
34 for key in sorted(knownkeys & newkeys): |
50758
5d092194ac37
configitems: fix typo in devel warning about extension overrides
Raphaël Gomès <rgomes@octobus.net>
parents:
50524
diff
changeset
|
35 msg = b"extension '%s' overwrites config item '%s.%s'" |
33133
bf1292c057ef
configitems: add a devel warning for extensions items overiding core one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33132
diff
changeset
|
36 msg %= (extname, section, key) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
37 ui.develwarn(msg, config=b'warn-config') |
33133
bf1292c057ef
configitems: add a devel warning for extensions items overiding core one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33132
diff
changeset
|
38 |
bf1292c057ef
configitems: add a devel warning for extensions items overiding core one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33132
diff
changeset
|
39 knownitems.update(items) |
33132
c467d13334ee
configitems: add an official API for extensions to register config item
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33131
diff
changeset
|
40 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43030
diff
changeset
|
41 |
48946
642e31cb55f0
py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents:
48875
diff
changeset
|
42 class configitem: |
32983
0d757af1ea67
configitems: add a basic class to hold config item information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
43 """represent a known config item |
0d757af1ea67
configitems: add a basic class to hold config item information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
44 |
0d757af1ea67
configitems: add a basic class to hold config item information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
45 :section: the official config section where to find this item, |
0d757af1ea67
configitems: add a basic class to hold config item information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
46 :name: the official name within the section, |
0d757af1ea67
configitems: add a basic class to hold config item information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
47 :default: default value for this item, |
34662
181d913b17e6
configitems: allow for the registration of "generic" config item
Boris Feld <boris.feld@octobus.net>
parents:
34653
diff
changeset
|
48 :alias: optional list of tuples as alternatives, |
181d913b17e6
configitems: allow for the registration of "generic" config item
Boris Feld <boris.feld@octobus.net>
parents:
34653
diff
changeset
|
49 :generic: this is a generic definition, match name using regular expression. |
32983
0d757af1ea67
configitems: add a basic class to hold config item information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
50 """ |
0d757af1ea67
configitems: add a basic class to hold config item information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
51 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43030
diff
changeset
|
52 def __init__( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43030
diff
changeset
|
53 self, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43030
diff
changeset
|
54 section, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43030
diff
changeset
|
55 name, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43030
diff
changeset
|
56 default=None, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43030
diff
changeset
|
57 alias=(), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43030
diff
changeset
|
58 generic=False, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43030
diff
changeset
|
59 priority=0, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43030
diff
changeset
|
60 experimental=False, |
50760
b584dae08774
configitems: add `documentation` field
Raphaël Gomès <rgomes@octobus.net>
parents:
50759
diff
changeset
|
61 documentation="", |
50765
7f8f6fe13fa9
configitems: move blackbox's config items to the new configitems.toml
Raphaël Gomès <rgomes@octobus.net>
parents:
50762
diff
changeset
|
62 in_core_extension=None, |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43030
diff
changeset
|
63 ): |
32983
0d757af1ea67
configitems: add a basic class to hold config item information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
64 self.section = section |
0d757af1ea67
configitems: add a basic class to hold config item information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
65 self.name = name |
0d757af1ea67
configitems: add a basic class to hold config item information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
66 self.default = default |
50760
b584dae08774
configitems: add `documentation` field
Raphaël Gomès <rgomes@octobus.net>
parents:
50759
diff
changeset
|
67 self.documentation = documentation |
33329
e714159860fd
configitems: add alias support in config
David Demelier <demelier.david@gmail.com>
parents:
33250
diff
changeset
|
68 self.alias = list(alias) |
34662
181d913b17e6
configitems: allow for the registration of "generic" config item
Boris Feld <boris.feld@octobus.net>
parents:
34653
diff
changeset
|
69 self.generic = generic |
181d913b17e6
configitems: allow for the registration of "generic" config item
Boris Feld <boris.feld@octobus.net>
parents:
34653
diff
changeset
|
70 self.priority = priority |
42760
9f2189b6bf2a
config: add experimental argument to the config registrar
Navaneeth Suresh <navaneeths1998@gmail.com>
parents:
42742
diff
changeset
|
71 self.experimental = experimental |
34662
181d913b17e6
configitems: allow for the registration of "generic" config item
Boris Feld <boris.feld@octobus.net>
parents:
34653
diff
changeset
|
72 self._re = None |
50765
7f8f6fe13fa9
configitems: move blackbox's config items to the new configitems.toml
Raphaël Gomès <rgomes@octobus.net>
parents:
50762
diff
changeset
|
73 self.in_core_extension = in_core_extension |
34662
181d913b17e6
configitems: allow for the registration of "generic" config item
Boris Feld <boris.feld@octobus.net>
parents:
34653
diff
changeset
|
74 if generic: |
181d913b17e6
configitems: allow for the registration of "generic" config item
Boris Feld <boris.feld@octobus.net>
parents:
34653
diff
changeset
|
75 self._re = re.compile(self.name) |
181d913b17e6
configitems: allow for the registration of "generic" config item
Boris Feld <boris.feld@octobus.net>
parents:
34653
diff
changeset
|
76 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43030
diff
changeset
|
77 |
34662
181d913b17e6
configitems: allow for the registration of "generic" config item
Boris Feld <boris.feld@octobus.net>
parents:
34653
diff
changeset
|
78 class itemregister(dict): |
181d913b17e6
configitems: allow for the registration of "generic" config item
Boris Feld <boris.feld@octobus.net>
parents:
34653
diff
changeset
|
79 """A specialized dictionary that can handle wild-card selection""" |
181d913b17e6
configitems: allow for the registration of "generic" config item
Boris Feld <boris.feld@octobus.net>
parents:
34653
diff
changeset
|
80 |
181d913b17e6
configitems: allow for the registration of "generic" config item
Boris Feld <boris.feld@octobus.net>
parents:
34653
diff
changeset
|
81 def __init__(self): |
181d913b17e6
configitems: allow for the registration of "generic" config item
Boris Feld <boris.feld@octobus.net>
parents:
34653
diff
changeset
|
82 super(itemregister, self).__init__() |
181d913b17e6
configitems: allow for the registration of "generic" config item
Boris Feld <boris.feld@octobus.net>
parents:
34653
diff
changeset
|
83 self._generics = set() |
181d913b17e6
configitems: allow for the registration of "generic" config item
Boris Feld <boris.feld@octobus.net>
parents:
34653
diff
changeset
|
84 |
181d913b17e6
configitems: allow for the registration of "generic" config item
Boris Feld <boris.feld@octobus.net>
parents:
34653
diff
changeset
|
85 def update(self, other): |
181d913b17e6
configitems: allow for the registration of "generic" config item
Boris Feld <boris.feld@octobus.net>
parents:
34653
diff
changeset
|
86 super(itemregister, self).update(other) |
181d913b17e6
configitems: allow for the registration of "generic" config item
Boris Feld <boris.feld@octobus.net>
parents:
34653
diff
changeset
|
87 self._generics.update(other._generics) |
181d913b17e6
configitems: allow for the registration of "generic" config item
Boris Feld <boris.feld@octobus.net>
parents:
34653
diff
changeset
|
88 |
181d913b17e6
configitems: allow for the registration of "generic" config item
Boris Feld <boris.feld@octobus.net>
parents:
34653
diff
changeset
|
89 def __setitem__(self, key, item): |
181d913b17e6
configitems: allow for the registration of "generic" config item
Boris Feld <boris.feld@octobus.net>
parents:
34653
diff
changeset
|
90 super(itemregister, self).__setitem__(key, item) |
181d913b17e6
configitems: allow for the registration of "generic" config item
Boris Feld <boris.feld@octobus.net>
parents:
34653
diff
changeset
|
91 if item.generic: |
181d913b17e6
configitems: allow for the registration of "generic" config item
Boris Feld <boris.feld@octobus.net>
parents:
34653
diff
changeset
|
92 self._generics.add(item) |
181d913b17e6
configitems: allow for the registration of "generic" config item
Boris Feld <boris.feld@octobus.net>
parents:
34653
diff
changeset
|
93 |
181d913b17e6
configitems: allow for the registration of "generic" config item
Boris Feld <boris.feld@octobus.net>
parents:
34653
diff
changeset
|
94 def get(self, key): |
34874
e3fbf8e3fef2
configitems: do not directly match generic items
Boris Feld <boris.feld@octobus.net>
parents:
34872
diff
changeset
|
95 baseitem = super(itemregister, self).get(key) |
e3fbf8e3fef2
configitems: do not directly match generic items
Boris Feld <boris.feld@octobus.net>
parents:
34872
diff
changeset
|
96 if baseitem is not None and not baseitem.generic: |
e3fbf8e3fef2
configitems: do not directly match generic items
Boris Feld <boris.feld@octobus.net>
parents:
34872
diff
changeset
|
97 return baseitem |
34662
181d913b17e6
configitems: allow for the registration of "generic" config item
Boris Feld <boris.feld@octobus.net>
parents:
34653
diff
changeset
|
98 |
181d913b17e6
configitems: allow for the registration of "generic" config item
Boris Feld <boris.feld@octobus.net>
parents:
34653
diff
changeset
|
99 # search for a matching generic item |
181d913b17e6
configitems: allow for the registration of "generic" config item
Boris Feld <boris.feld@octobus.net>
parents:
34653
diff
changeset
|
100 generics = sorted(self._generics, key=(lambda x: (x.priority, x.name))) |
181d913b17e6
configitems: allow for the registration of "generic" config item
Boris Feld <boris.feld@octobus.net>
parents:
34653
diff
changeset
|
101 for item in generics: |
34875
4f0d4bc63b8a
configitems: document the choice of using 'match' instead of 'search'
Boris Feld <boris.feld@octobus.net>
parents:
34874
diff
changeset
|
102 # we use 'match' instead of 'search' to make the matching simpler |
4f0d4bc63b8a
configitems: document the choice of using 'match' instead of 'search'
Boris Feld <boris.feld@octobus.net>
parents:
34874
diff
changeset
|
103 # for people unfamiliar with regular expression. Having the match |
4f0d4bc63b8a
configitems: document the choice of using 'match' instead of 'search'
Boris Feld <boris.feld@octobus.net>
parents:
34874
diff
changeset
|
104 # rooted to the start of the string will produce less surprising |
4f0d4bc63b8a
configitems: document the choice of using 'match' instead of 'search'
Boris Feld <boris.feld@octobus.net>
parents:
34874
diff
changeset
|
105 # result for user writing simple regex for sub-attribute. |
4f0d4bc63b8a
configitems: document the choice of using 'match' instead of 'search'
Boris Feld <boris.feld@octobus.net>
parents:
34874
diff
changeset
|
106 # |
4f0d4bc63b8a
configitems: document the choice of using 'match' instead of 'search'
Boris Feld <boris.feld@octobus.net>
parents:
34874
diff
changeset
|
107 # For example using "color\..*" match produces an unsurprising |
4f0d4bc63b8a
configitems: document the choice of using 'match' instead of 'search'
Boris Feld <boris.feld@octobus.net>
parents:
34874
diff
changeset
|
108 # result, while using search could suddenly match apparently |
4f0d4bc63b8a
configitems: document the choice of using 'match' instead of 'search'
Boris Feld <boris.feld@octobus.net>
parents:
34874
diff
changeset
|
109 # unrelated configuration that happens to contains "color." |
4f0d4bc63b8a
configitems: document the choice of using 'match' instead of 'search'
Boris Feld <boris.feld@octobus.net>
parents:
34874
diff
changeset
|
110 # anywhere. This is a tradeoff where we favor requiring ".*" on |
4f0d4bc63b8a
configitems: document the choice of using 'match' instead of 'search'
Boris Feld <boris.feld@octobus.net>
parents:
34874
diff
changeset
|
111 # some match to avoid the need to prefix most pattern with "^". |
4f0d4bc63b8a
configitems: document the choice of using 'match' instead of 'search'
Boris Feld <boris.feld@octobus.net>
parents:
34874
diff
changeset
|
112 # The "^" seems more error prone. |
34662
181d913b17e6
configitems: allow for the registration of "generic" config item
Boris Feld <boris.feld@octobus.net>
parents:
34653
diff
changeset
|
113 if item._re.match(key): |
181d913b17e6
configitems: allow for the registration of "generic" config item
Boris Feld <boris.feld@octobus.net>
parents:
34653
diff
changeset
|
114 return item |
181d913b17e6
configitems: allow for the registration of "generic" config item
Boris Feld <boris.feld@octobus.net>
parents:
34653
diff
changeset
|
115 |
34874
e3fbf8e3fef2
configitems: do not directly match generic items
Boris Feld <boris.feld@octobus.net>
parents:
34872
diff
changeset
|
116 return None |
32984
6d983e8af49c
configitems: introduce a central registry for config option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32983
diff
changeset
|
117 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43030
diff
changeset
|
118 |
50762
c51b178b0b7e
configitems: declare items in a TOML file
Raphaël Gomès <rgomes@octobus.net>
parents:
50760
diff
changeset
|
119 def sanitize_item(item): |
c51b178b0b7e
configitems: declare items in a TOML file
Raphaël Gomès <rgomes@octobus.net>
parents:
50760
diff
changeset
|
120 """Apply the transformations that are encoded on top of the pure data""" |
c51b178b0b7e
configitems: declare items in a TOML file
Raphaël Gomès <rgomes@octobus.net>
parents:
50760
diff
changeset
|
121 |
c51b178b0b7e
configitems: declare items in a TOML file
Raphaël Gomès <rgomes@octobus.net>
parents:
50760
diff
changeset
|
122 # Set the special defaults |
c51b178b0b7e
configitems: declare items in a TOML file
Raphaël Gomès <rgomes@octobus.net>
parents:
50760
diff
changeset
|
123 default_type_key = "default-type" |
c51b178b0b7e
configitems: declare items in a TOML file
Raphaël Gomès <rgomes@octobus.net>
parents:
50760
diff
changeset
|
124 default_type = item.pop(default_type_key, None) |
c51b178b0b7e
configitems: declare items in a TOML file
Raphaël Gomès <rgomes@octobus.net>
parents:
50760
diff
changeset
|
125 if default_type == "dynamic": |
c51b178b0b7e
configitems: declare items in a TOML file
Raphaël Gomès <rgomes@octobus.net>
parents:
50760
diff
changeset
|
126 item["default"] = dynamicdefault |
c51b178b0b7e
configitems: declare items in a TOML file
Raphaël Gomès <rgomes@octobus.net>
parents:
50760
diff
changeset
|
127 elif default_type == "list_type": |
c51b178b0b7e
configitems: declare items in a TOML file
Raphaël Gomès <rgomes@octobus.net>
parents:
50760
diff
changeset
|
128 item["default"] = list |
c51b178b0b7e
configitems: declare items in a TOML file
Raphaël Gomès <rgomes@octobus.net>
parents:
50760
diff
changeset
|
129 elif default_type == "lambda": |
c51b178b0b7e
configitems: declare items in a TOML file
Raphaël Gomès <rgomes@octobus.net>
parents:
50760
diff
changeset
|
130 assert isinstance(item["default"], list) |
c51b178b0b7e
configitems: declare items in a TOML file
Raphaël Gomès <rgomes@octobus.net>
parents:
50760
diff
changeset
|
131 default = [e.encode() for e in item["default"]] |
c51b178b0b7e
configitems: declare items in a TOML file
Raphaël Gomès <rgomes@octobus.net>
parents:
50760
diff
changeset
|
132 item["default"] = lambda: default |
c51b178b0b7e
configitems: declare items in a TOML file
Raphaël Gomès <rgomes@octobus.net>
parents:
50760
diff
changeset
|
133 elif default_type == "lazy_module": |
c51b178b0b7e
configitems: declare items in a TOML file
Raphaël Gomès <rgomes@octobus.net>
parents:
50760
diff
changeset
|
134 item["default"] = lambda: encoding.encoding |
c51b178b0b7e
configitems: declare items in a TOML file
Raphaël Gomès <rgomes@octobus.net>
parents:
50760
diff
changeset
|
135 else: |
c51b178b0b7e
configitems: declare items in a TOML file
Raphaël Gomès <rgomes@octobus.net>
parents:
50760
diff
changeset
|
136 if default_type is not None: |
c51b178b0b7e
configitems: declare items in a TOML file
Raphaël Gomès <rgomes@octobus.net>
parents:
50760
diff
changeset
|
137 msg = "invalid default config type %r for '%s.%s'" |
c51b178b0b7e
configitems: declare items in a TOML file
Raphaël Gomès <rgomes@octobus.net>
parents:
50760
diff
changeset
|
138 msg %= (default_type, item["section"], item["name"]) |
c51b178b0b7e
configitems: declare items in a TOML file
Raphaël Gomès <rgomes@octobus.net>
parents:
50760
diff
changeset
|
139 raise error.ProgrammingError(msg) |
c51b178b0b7e
configitems: declare items in a TOML file
Raphaël Gomès <rgomes@octobus.net>
parents:
50760
diff
changeset
|
140 |
c51b178b0b7e
configitems: declare items in a TOML file
Raphaël Gomès <rgomes@octobus.net>
parents:
50760
diff
changeset
|
141 # config expects bytes |
c51b178b0b7e
configitems: declare items in a TOML file
Raphaël Gomès <rgomes@octobus.net>
parents:
50760
diff
changeset
|
142 alias = item.get("alias") |
c51b178b0b7e
configitems: declare items in a TOML file
Raphaël Gomès <rgomes@octobus.net>
parents:
50760
diff
changeset
|
143 if alias: |
c51b178b0b7e
configitems: declare items in a TOML file
Raphaël Gomès <rgomes@octobus.net>
parents:
50760
diff
changeset
|
144 item["alias"] = [(k.encode(), v.encode()) for (k, v) in alias] |
c51b178b0b7e
configitems: declare items in a TOML file
Raphaël Gomès <rgomes@octobus.net>
parents:
50760
diff
changeset
|
145 if isinstance(item.get("default"), str): |
c51b178b0b7e
configitems: declare items in a TOML file
Raphaël Gomès <rgomes@octobus.net>
parents:
50760
diff
changeset
|
146 item["default"] = item["default"].encode() |
c51b178b0b7e
configitems: declare items in a TOML file
Raphaël Gomès <rgomes@octobus.net>
parents:
50760
diff
changeset
|
147 item["section"] = item["section"].encode() |
c51b178b0b7e
configitems: declare items in a TOML file
Raphaël Gomès <rgomes@octobus.net>
parents:
50760
diff
changeset
|
148 item["name"] = item["name"].encode() |
c51b178b0b7e
configitems: declare items in a TOML file
Raphaël Gomès <rgomes@octobus.net>
parents:
50760
diff
changeset
|
149 |
c51b178b0b7e
configitems: declare items in a TOML file
Raphaël Gomès <rgomes@octobus.net>
parents:
50760
diff
changeset
|
150 |
c51b178b0b7e
configitems: declare items in a TOML file
Raphaël Gomès <rgomes@octobus.net>
parents:
50760
diff
changeset
|
151 def read_configitems_file(): |
c51b178b0b7e
configitems: declare items in a TOML file
Raphaël Gomès <rgomes@octobus.net>
parents:
50760
diff
changeset
|
152 """Returns the deserialized TOML structure from the configitems file""" |
c51b178b0b7e
configitems: declare items in a TOML file
Raphaël Gomès <rgomes@octobus.net>
parents:
50760
diff
changeset
|
153 with resourceutil.open_resource(b"mercurial", b"configitems.toml") as fp: |
c51b178b0b7e
configitems: declare items in a TOML file
Raphaël Gomès <rgomes@octobus.net>
parents:
50760
diff
changeset
|
154 return tomllib.load(fp) |
c51b178b0b7e
configitems: declare items in a TOML file
Raphaël Gomès <rgomes@octobus.net>
parents:
50760
diff
changeset
|
155 |
c51b178b0b7e
configitems: declare items in a TOML file
Raphaël Gomès <rgomes@octobus.net>
parents:
50760
diff
changeset
|
156 |
c51b178b0b7e
configitems: declare items in a TOML file
Raphaël Gomès <rgomes@octobus.net>
parents:
50760
diff
changeset
|
157 def configitems_from_toml(items): |
c51b178b0b7e
configitems: declare items in a TOML file
Raphaël Gomès <rgomes@octobus.net>
parents:
50760
diff
changeset
|
158 """Register the configitems from the *deserialized* toml file""" |
c51b178b0b7e
configitems: declare items in a TOML file
Raphaël Gomès <rgomes@octobus.net>
parents:
50760
diff
changeset
|
159 for item in items["items"]: |
c51b178b0b7e
configitems: declare items in a TOML file
Raphaël Gomès <rgomes@octobus.net>
parents:
50760
diff
changeset
|
160 sanitize_item(item) |
c51b178b0b7e
configitems: declare items in a TOML file
Raphaël Gomès <rgomes@octobus.net>
parents:
50760
diff
changeset
|
161 coreconfigitem(**item) |
c51b178b0b7e
configitems: declare items in a TOML file
Raphaël Gomès <rgomes@octobus.net>
parents:
50760
diff
changeset
|
162 |
c51b178b0b7e
configitems: declare items in a TOML file
Raphaël Gomès <rgomes@octobus.net>
parents:
50760
diff
changeset
|
163 templates = items["templates"] |
c51b178b0b7e
configitems: declare items in a TOML file
Raphaël Gomès <rgomes@octobus.net>
parents:
50760
diff
changeset
|
164 |
c51b178b0b7e
configitems: declare items in a TOML file
Raphaël Gomès <rgomes@octobus.net>
parents:
50760
diff
changeset
|
165 for application in items["template-applications"]: |
c51b178b0b7e
configitems: declare items in a TOML file
Raphaël Gomès <rgomes@octobus.net>
parents:
50760
diff
changeset
|
166 template_items = templates[application["template"]] |
c51b178b0b7e
configitems: declare items in a TOML file
Raphaël Gomès <rgomes@octobus.net>
parents:
50760
diff
changeset
|
167 |
c51b178b0b7e
configitems: declare items in a TOML file
Raphaël Gomès <rgomes@octobus.net>
parents:
50760
diff
changeset
|
168 for template_item in template_items: |
c51b178b0b7e
configitems: declare items in a TOML file
Raphaël Gomès <rgomes@octobus.net>
parents:
50760
diff
changeset
|
169 item = template_item.copy() |
c51b178b0b7e
configitems: declare items in a TOML file
Raphaël Gomès <rgomes@octobus.net>
parents:
50760
diff
changeset
|
170 prefix = application.get("prefix", "") |
c51b178b0b7e
configitems: declare items in a TOML file
Raphaël Gomès <rgomes@octobus.net>
parents:
50760
diff
changeset
|
171 item["section"] = application["section"] |
c51b178b0b7e
configitems: declare items in a TOML file
Raphaël Gomès <rgomes@octobus.net>
parents:
50760
diff
changeset
|
172 if prefix: |
c51b178b0b7e
configitems: declare items in a TOML file
Raphaël Gomès <rgomes@octobus.net>
parents:
50760
diff
changeset
|
173 item["name"] = f'{prefix}.{item["suffix"]}' |
c51b178b0b7e
configitems: declare items in a TOML file
Raphaël Gomès <rgomes@octobus.net>
parents:
50760
diff
changeset
|
174 else: |
c51b178b0b7e
configitems: declare items in a TOML file
Raphaël Gomès <rgomes@octobus.net>
parents:
50760
diff
changeset
|
175 item["name"] = item["suffix"] |
c51b178b0b7e
configitems: declare items in a TOML file
Raphaël Gomès <rgomes@octobus.net>
parents:
50760
diff
changeset
|
176 |
c51b178b0b7e
configitems: declare items in a TOML file
Raphaël Gomès <rgomes@octobus.net>
parents:
50760
diff
changeset
|
177 sanitize_item(item) |
c51b178b0b7e
configitems: declare items in a TOML file
Raphaël Gomès <rgomes@octobus.net>
parents:
50760
diff
changeset
|
178 item.pop("suffix", None) |
c51b178b0b7e
configitems: declare items in a TOML file
Raphaël Gomès <rgomes@octobus.net>
parents:
50760
diff
changeset
|
179 coreconfigitem(**item) |
c51b178b0b7e
configitems: declare items in a TOML file
Raphaël Gomès <rgomes@octobus.net>
parents:
50760
diff
changeset
|
180 |
c51b178b0b7e
configitems: declare items in a TOML file
Raphaël Gomès <rgomes@octobus.net>
parents:
50760
diff
changeset
|
181 |
c51b178b0b7e
configitems: declare items in a TOML file
Raphaël Gomès <rgomes@octobus.net>
parents:
50760
diff
changeset
|
182 def import_configitems_from_file(): |
c51b178b0b7e
configitems: declare items in a TOML file
Raphaël Gomès <rgomes@octobus.net>
parents:
50760
diff
changeset
|
183 as_toml = read_configitems_file() |
c51b178b0b7e
configitems: declare items in a TOML file
Raphaël Gomès <rgomes@octobus.net>
parents:
50760
diff
changeset
|
184 configitems_from_toml(as_toml) |
c51b178b0b7e
configitems: declare items in a TOML file
Raphaël Gomès <rgomes@octobus.net>
parents:
50760
diff
changeset
|
185 |
c51b178b0b7e
configitems: declare items in a TOML file
Raphaël Gomès <rgomes@octobus.net>
parents:
50760
diff
changeset
|
186 |
32984
6d983e8af49c
configitems: introduce a central registry for config option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32983
diff
changeset
|
187 coreitems = {} |
6d983e8af49c
configitems: introduce a central registry for config option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32983
diff
changeset
|
188 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43030
diff
changeset
|
189 |
33131
c2ca511c4771
configitems: extract the logic to build a registrar on any configtable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33061
diff
changeset
|
190 def _register(configtable, *args, **kwargs): |
32984
6d983e8af49c
configitems: introduce a central registry for config option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32983
diff
changeset
|
191 item = configitem(*args, **kwargs) |
34662
181d913b17e6
configitems: allow for the registration of "generic" config item
Boris Feld <boris.feld@octobus.net>
parents:
34653
diff
changeset
|
192 section = configtable.setdefault(item.section, itemregister()) |
32984
6d983e8af49c
configitems: introduce a central registry for config option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32983
diff
changeset
|
193 if item.name in section: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
194 msg = b"duplicated config item registration for '%s.%s'" |
32984
6d983e8af49c
configitems: introduce a central registry for config option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32983
diff
changeset
|
195 raise error.ProgrammingError(msg % (item.section, item.name)) |
6d983e8af49c
configitems: introduce a central registry for config option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32983
diff
changeset
|
196 section[item.name] = item |
32986
2529e2ae9f4c
configitems: register 'ui.quiet' as first example
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32984
diff
changeset
|
197 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43030
diff
changeset
|
198 |
33471
d74141ccfd8b
configitems: handle case were the default value is not static
Boris Feld <boris.feld@octobus.net>
parents:
33329
diff
changeset
|
199 # special value for case where the default is derived from other values |
d74141ccfd8b
configitems: handle case were the default value is not static
Boris Feld <boris.feld@octobus.net>
parents:
33329
diff
changeset
|
200 dynamicdefault = object() |
d74141ccfd8b
configitems: handle case were the default value is not static
Boris Feld <boris.feld@octobus.net>
parents:
33329
diff
changeset
|
201 |
32986
2529e2ae9f4c
configitems: register 'ui.quiet' as first example
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32984
diff
changeset
|
202 # Registering actual config items |
2529e2ae9f4c
configitems: register 'ui.quiet' as first example
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32984
diff
changeset
|
203 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43030
diff
changeset
|
204 |
33131
c2ca511c4771
configitems: extract the logic to build a registrar on any configtable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33061
diff
changeset
|
205 def getitemregister(configtable): |
34917
ee9243715c59
registrar: host "dynamicdefault" constant by configitem object
Yuya Nishihara <yuya@tcha.org>
parents:
34916
diff
changeset
|
206 f = functools.partial(_register, configtable) |
ee9243715c59
registrar: host "dynamicdefault" constant by configitem object
Yuya Nishihara <yuya@tcha.org>
parents:
34916
diff
changeset
|
207 # export pseudo enum as configitem.* |
ee9243715c59
registrar: host "dynamicdefault" constant by configitem object
Yuya Nishihara <yuya@tcha.org>
parents:
34916
diff
changeset
|
208 f.dynamicdefault = dynamicdefault |
ee9243715c59
registrar: host "dynamicdefault" constant by configitem object
Yuya Nishihara <yuya@tcha.org>
parents:
34916
diff
changeset
|
209 return f |
33131
c2ca511c4771
configitems: extract the logic to build a registrar on any configtable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33061
diff
changeset
|
210 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43030
diff
changeset
|
211 |
33131
c2ca511c4771
configitems: extract the logic to build a registrar on any configtable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33061
diff
changeset
|
212 coreconfigitem = getitemregister(coreitems) |
c2ca511c4771
configitems: extract the logic to build a registrar on any configtable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33061
diff
changeset
|
213 |
50762
c51b178b0b7e
configitems: declare items in a TOML file
Raphaël Gomès <rgomes@octobus.net>
parents:
50760
diff
changeset
|
214 import_configitems_from_file() |