mercurial/configitems.py
author Pierre-Yves David <pierre-yves.david@octobus.net>
Mon, 25 Mar 2024 16:27:48 +0000
changeset 51538 e4eeb9fedfe3
parent 51292 9c5bd485fbb6
permissions -rw-r--r--
branching: merge stable into default
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
51292
9c5bd485fbb6 pytype: ignore some signature mismatch in configitems
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50765
diff changeset
    85
    def update(self, other):  # pytype: disable=signature-mismatch
34662
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()