mercurial/configitems.py
author Pierre-Yves David <pierre-yves.david@octobus.net>
Wed, 23 Nov 2022 19:08:27 +0100
changeset 49773 523cacdfd324
parent 49772 f5f113f1b011
child 49778 45d7b8c380d7
permissions -rw-r--r--
delta-find: set the default candidate chunk size to 10 I ran performance and storage tests on repositories of various sizes and shapes for the following values of the config : 5, 10, 20, 50, 100, no-chunking The performance tests do not show any statistical impact on computation times for large pushes and pulls. For searching for an individual delta, this can provide a significant performance improvement with a minor degradation of space-quality on the result. (see data at the end of the commit). For overall store size, the change : - does not have any impact on many small repositories, - has an observable, but very negligible impact on most larger repositories. - One private repository we use for testing sees a small increase in size (1%) in the narrower version. We will try to get more numbers on a larger version of that repository to make sure nothing pathological happens. We pick "10" as the limit as "5" seems a bit more risky. There are room to improve the current code, by using more aggressive filtering and better (i.e any) sorting of the candidates. However this is already a large improvement for pathological cases, with little impact in the common situations. The initial motivation for this change is to fix performance of delta computation for a file where the previous code ended up testing 20 000 possible candidate-bases in one go, which is… slow. This affected about ½ of the file revisions leading to atrocious performance, especially during some push/pull operations. Details about individual delta finding timing: ---------------------------------------------- The vast majority of benchmark cases are unchanged but the three below. The first two do not see any impact on the final delta. The last one sees a change in delta-size that is negligible compared to the full text size. ### data-env-vars.name = mozilla-try-2019-02-18-zstd-sparse-revlog # benchmark.name = perf-delta-find # benchmark.variants.rev = manifest-snapshot-many-tries-a (revision 756096) ∞: 5.844783 5: 4.473523 (-23.46%) 10: 4.970053 (-14.97%) 20: 5.770386 (-1.27%) 50 5.821358 100: 5.834887 MANIFESTLOG: rev = 756096: (no-limit) delta-base = 301840 search-rounds = 6 try-count = 60 delta-type = snapshot snap-depth = 7 delta-size = 179 MANIFESTLOG: rev=756096: (limit = 10) delta-base=301840 search-rounds=9 try-count=51 delta-type=snapshot snap-depth=7 delta-size=179 ### data-env-vars.name = mozilla-try-2019-02-18-zstd-sparse-revlog # benchmark.name = perf-delta-find # benchmark.variants.rev = manifest-snapshot-many-tries-d (revision 754060) ∞: 5.017663 5: 3.655931 (-27.14%) 10: 4.095436 (-18.38%) 20: 4.828949 (-3.76%) 50 4.987574 100: 4.994889 MANIFESTLOG: rev=754060: (no limit) delta-base=301840 search-rounds=5 try-count=53 delta-type=snapshot snap-depth=7 delta-size = 179 MANIFESTLOG: rev=754060: (limite = 10) delta-base=301840 search-rounds=8 try-count=45 delta-type=snapshot snap-depth=7 delta-size = 179 ### data-env-vars.name = mozilla-try-2019-02-18-zstd-sparse-revlog # benchmark.name = perf-delta-find # bin-env-vars.hg.flavor = rust # benchmark.variants.rev = manifest-snapshot-many-tries-e (revision 693368) ∞: 4.869282 5: 2.039732 (-58.11%) 10: 2.413537 (-50.43%) 20: 4.449639 (-8.62%) 50 4.865863 100: 4.882649 MANIFESTLOG: rev=693368: delta-base=693336 search-rounds=6 try-count=53 delta-type=snapshot snap-depth=6 full-test-size=131065 delta-size=199 MANIFESTLOG: rev=693368: delta-base=278023 search-rounds=5 try-count=21 delta-type=snapshot snap-depth=4 full-test-size=131065 delta-size=278 Raw data for store size (in bytes) for various chunk size value below: ---------------------------------------------------------------------- 440 134 384 5 pypy/.hg/store/ 440 134 384 10 pypy/.hg/store/ 440 134 384 20 pypy/.hg/store/ 440 134 384 50 pypy/.hg/store/ 440 134 384 100 pypy/.hg/store/ 440 134 384 ... pypy/.hg/store/ 666 987 471 5 netbsd-xsrc-2022-11-15/.hg/store/ 666 987 471 10 netbsd-xsrc-2022-11-15/.hg/store/ 666 987 471 20 netbsd-xsrc-2022-11-15/.hg/store/ 666 987 471 50 netbsd-xsrc-2022-11-15/.hg/store/ 666 987 471 100 netbsd-xsrc-2022-11-15/.hg/store/ 666 987 471 ... netbsd-xsrc-2022-11-15/.hg/store/ 852 844 884 5 netbsd-pkgsrc-2022-11-15/.hg/store/ 852 844 884 10 netbsd-pkgsrc-2022-11-15/.hg/store/ 852 844 884 20 netbsd-pkgsrc-2022-11-15/.hg/store/ 852 844 884 50 netbsd-pkgsrc-2022-11-15/.hg/store/ 852 844 884 100 netbsd-pkgsrc-2022-11-15/.hg/store/ 852 844 884 ... netbsd-pkgsrc-2022-11-15/.hg/store/ 1 504 227 981 5 netbeans-2018-08-01-sparse-zstd/.hg/store/ 1 504 227 871 10 netbeans-2018-08-01-sparse-zstd/.hg/store/ 1 504 227 813 20 netbeans-2018-08-01-sparse-zstd/.hg/store/ 1 504 227 813 50 netbeans-2018-08-01-sparse-zstd/.hg/store/ 1 504 227 813 100 netbeans-2018-08-01-sparse-zstd/.hg/store/ 1 504 227 813 ... netbeans-2018-08-01-sparse-zstd/.hg/store/ 3 875 801 068 5 netbsd-src-2022-11-15/.hg/store/ 3 875 696 767 10 netbsd-src-2022-11-15/.hg/store/ 3 875 696 757 20 netbsd-src-2022-11-15/.hg/store/ 3 875 696 653 50 netbsd-src-2022-11-15/.hg/store/ 3 875 696 653 100 netbsd-src-2022-11-15/.hg/store/ 3 875 696 653 ... netbsd-src-2022-11-15/.hg/store/ 4 531 441 314 5 mozilla-central/.hg/store/ 4 531 435 157 10 mozilla-central/.hg/store/ 4 531 432 045 20 mozilla-central/.hg/store/ 4 531 429 119 50 mozilla-central/.hg/store/ 4 531 429 119 100 mozilla-central/.hg/store/ 4 531 429 119 ... mozilla-central/.hg/store/ 4 875 861 390 5 mozilla-unified/.hg/store/ 4 875 855 155 10 mozilla-unified/.hg/store/ 4 875 852 027 20 mozilla-unified/.hg/store/ 4 875 848 851 50 mozilla-unified/.hg/store/ 4 875 848 851 100 mozilla-unified/.hg/store/ 4 875 848 851 ... mozilla-unified/.hg/store/ 11 498 764 601 5 mozilla-try/.hg/store/ 11 497 968 858 10 mozilla-try/.hg/store/ 11 497 958 730 20 mozilla-try/.hg/store/ 11 497 927 156 50 mozilla-try/.hg/store/ 11 497 925 963 100 mozilla-try/.hg/store/ 11 497 923 428 ... mozilla-try/.hg/store/ 10 047 914 031 5 private-repo 9 969 132 101 10 private-repo 9 944 745 015 20 private-repo 9 939 756 703 50 private-repo 9 939 833 016 100 private-repo 9 939 822 035 ... private-repo

# configitems.py - centralized declaration of configuration option
#
#  Copyright 2017 Pierre-Yves David <pierre-yves.david@octobus.net>
#
# This software may be used and distributed according to the terms of the
# GNU General Public License version 2 or any later version.


import functools
import re

from . import (
    encoding,
    error,
)


def loadconfigtable(ui, extname, configtable):
    """update config item known to the ui with the extension ones"""
    for section, items in sorted(configtable.items()):
        knownitems = ui._knownconfig.setdefault(section, itemregister())
        knownkeys = set(knownitems)
        newkeys = set(items)
        for key in sorted(knownkeys & newkeys):
            msg = b"extension '%s' overwrite config item '%s.%s'"
            msg %= (extname, section, key)
            ui.develwarn(msg, config=b'warn-config')

        knownitems.update(items)


class configitem:
    """represent a known config item

    :section: the official config section where to find this item,
       :name: the official name within the section,
    :default: default value for this item,
    :alias: optional list of tuples as alternatives,
    :generic: this is a generic definition, match name using regular expression.
    """

    def __init__(
        self,
        section,
        name,
        default=None,
        alias=(),
        generic=False,
        priority=0,
        experimental=False,
    ):
        self.section = section
        self.name = name
        self.default = default
        self.alias = list(alias)
        self.generic = generic
        self.priority = priority
        self.experimental = experimental
        self._re = None
        if generic:
            self._re = re.compile(self.name)


class itemregister(dict):
    """A specialized dictionary that can handle wild-card selection"""

    def __init__(self):
        super(itemregister, self).__init__()
        self._generics = set()

    def update(self, other):
        super(itemregister, self).update(other)
        self._generics.update(other._generics)

    def __setitem__(self, key, item):
        super(itemregister, self).__setitem__(key, item)
        if item.generic:
            self._generics.add(item)

    def get(self, key):
        baseitem = super(itemregister, self).get(key)
        if baseitem is not None and not baseitem.generic:
            return baseitem

        # search for a matching generic item
        generics = sorted(self._generics, key=(lambda x: (x.priority, x.name)))
        for item in generics:
            # we use 'match' instead of 'search' to make the matching simpler
            # for people unfamiliar with regular expression. Having the match
            # rooted to the start of the string will produce less surprising
            # result for user writing simple regex for sub-attribute.
            #
            # For example using "color\..*" match produces an unsurprising
            # result, while using search could suddenly match apparently
            # unrelated configuration that happens to contains "color."
            # anywhere. This is a tradeoff where we favor requiring ".*" on
            # some match to avoid the need to prefix most pattern with "^".
            # The "^" seems more error prone.
            if item._re.match(key):
                return item

        return None


coreitems = {}


def _register(configtable, *args, **kwargs):
    item = configitem(*args, **kwargs)
    section = configtable.setdefault(item.section, itemregister())
    if item.name in section:
        msg = b"duplicated config item registration for '%s.%s'"
        raise error.ProgrammingError(msg % (item.section, item.name))
    section[item.name] = item


# special value for case where the default is derived from other values
dynamicdefault = object()

# Registering actual config items


def getitemregister(configtable):
    f = functools.partial(_register, configtable)
    # export pseudo enum as configitem.*
    f.dynamicdefault = dynamicdefault
    return f


coreconfigitem = getitemregister(coreitems)


def _registerdiffopts(section, configprefix=b''):
    coreconfigitem(
        section,
        configprefix + b'nodates',
        default=False,
    )
    coreconfigitem(
        section,
        configprefix + b'showfunc',
        default=False,
    )
    coreconfigitem(
        section,
        configprefix + b'unified',
        default=None,
    )
    coreconfigitem(
        section,
        configprefix + b'git',
        default=False,
    )
    coreconfigitem(
        section,
        configprefix + b'ignorews',
        default=False,
    )
    coreconfigitem(
        section,
        configprefix + b'ignorewsamount',
        default=False,
    )
    coreconfigitem(
        section,
        configprefix + b'ignoreblanklines',
        default=False,
    )
    coreconfigitem(
        section,
        configprefix + b'ignorewseol',
        default=False,
    )
    coreconfigitem(
        section,
        configprefix + b'nobinary',
        default=False,
    )
    coreconfigitem(
        section,
        configprefix + b'noprefix',
        default=False,
    )
    coreconfigitem(
        section,
        configprefix + b'word-diff',
        default=False,
    )


coreconfigitem(
    b'alias',
    b'.*',
    default=dynamicdefault,
    generic=True,
)
coreconfigitem(
    b'auth',
    b'cookiefile',
    default=None,
)
_registerdiffopts(section=b'annotate')
# bookmarks.pushing: internal hack for discovery
coreconfigitem(
    b'bookmarks',
    b'pushing',
    default=list,
)
# bundle.mainreporoot: internal hack for bundlerepo
coreconfigitem(
    b'bundle',
    b'mainreporoot',
    default=b'',
)
coreconfigitem(
    b'censor',
    b'policy',
    default=b'abort',
    experimental=True,
)
coreconfigitem(
    b'chgserver',
    b'idletimeout',
    default=3600,
)
coreconfigitem(
    b'chgserver',
    b'skiphash',
    default=False,
)
coreconfigitem(
    b'cmdserver',
    b'log',
    default=None,
)
coreconfigitem(
    b'cmdserver',
    b'max-log-files',
    default=7,
)
coreconfigitem(
    b'cmdserver',
    b'max-log-size',
    default=b'1 MB',
)
coreconfigitem(
    b'cmdserver',
    b'max-repo-cache',
    default=0,
    experimental=True,
)
coreconfigitem(
    b'cmdserver',
    b'message-encodings',
    default=list,
)
coreconfigitem(
    b'cmdserver',
    b'track-log',
    default=lambda: [b'chgserver', b'cmdserver', b'repocache'],
)
coreconfigitem(
    b'cmdserver',
    b'shutdown-on-interrupt',
    default=True,
)
coreconfigitem(
    b'color',
    b'.*',
    default=None,
    generic=True,
)
coreconfigitem(
    b'color',
    b'mode',
    default=b'auto',
)
coreconfigitem(
    b'color',
    b'pagermode',
    default=dynamicdefault,
)
coreconfigitem(
    b'command-templates',
    b'graphnode',
    default=None,
    alias=[(b'ui', b'graphnodetemplate')],
)
coreconfigitem(
    b'command-templates',
    b'log',
    default=None,
    alias=[(b'ui', b'logtemplate')],
)
coreconfigitem(
    b'command-templates',
    b'mergemarker',
    default=(
        b'{node|short} '
        b'{ifeq(tags, "tip", "", '
        b'ifeq(tags, "", "", "{tags} "))}'
        b'{if(bookmarks, "{bookmarks} ")}'
        b'{ifeq(branch, "default", "", "{branch} ")}'
        b'- {author|user}: {desc|firstline}'
    ),
    alias=[(b'ui', b'mergemarkertemplate')],
)
coreconfigitem(
    b'command-templates',
    b'pre-merge-tool-output',
    default=None,
    alias=[(b'ui', b'pre-merge-tool-output-template')],
)
coreconfigitem(
    b'command-templates',
    b'oneline-summary',
    default=None,
)
coreconfigitem(
    b'command-templates',
    b'oneline-summary.*',
    default=dynamicdefault,
    generic=True,
)
_registerdiffopts(section=b'commands', configprefix=b'commit.interactive.')
coreconfigitem(
    b'commands',
    b'commit.post-status',
    default=False,
)
coreconfigitem(
    b'commands',
    b'grep.all-files',
    default=False,
    experimental=True,
)
coreconfigitem(
    b'commands',
    b'merge.require-rev',
    default=False,
)
coreconfigitem(
    b'commands',
    b'push.require-revs',
    default=False,
)
coreconfigitem(
    b'commands',
    b'resolve.confirm',
    default=False,
)
coreconfigitem(
    b'commands',
    b'resolve.explicit-re-merge',
    default=False,
)
coreconfigitem(
    b'commands',
    b'resolve.mark-check',
    default=b'none',
)
_registerdiffopts(section=b'commands', configprefix=b'revert.interactive.')
coreconfigitem(
    b'commands',
    b'show.aliasprefix',
    default=list,
)
coreconfigitem(
    b'commands',
    b'status.relative',
    default=False,
)
coreconfigitem(
    b'commands',
    b'status.skipstates',
    default=[],
    experimental=True,
)
coreconfigitem(
    b'commands',
    b'status.terse',
    default=b'',
)
coreconfigitem(
    b'commands',
    b'status.verbose',
    default=False,
)
coreconfigitem(
    b'commands',
    b'update.check',
    default=None,
)
coreconfigitem(
    b'commands',
    b'update.requiredest',
    default=False,
)
coreconfigitem(
    b'committemplate',
    b'.*',
    default=None,
    generic=True,
)
coreconfigitem(
    b'convert',
    b'bzr.saverev',
    default=True,
)
coreconfigitem(
    b'convert',
    b'cvsps.cache',
    default=True,
)
coreconfigitem(
    b'convert',
    b'cvsps.fuzz',
    default=60,
)
coreconfigitem(
    b'convert',
    b'cvsps.logencoding',
    default=None,
)
coreconfigitem(
    b'convert',
    b'cvsps.mergefrom',
    default=None,
)
coreconfigitem(
    b'convert',
    b'cvsps.mergeto',
    default=None,
)
coreconfigitem(
    b'convert',
    b'git.committeractions',
    default=lambda: [b'messagedifferent'],
)
coreconfigitem(
    b'convert',
    b'git.extrakeys',
    default=list,
)
coreconfigitem(
    b'convert',
    b'git.findcopiesharder',
    default=False,
)
coreconfigitem(
    b'convert',
    b'git.remoteprefix',
    default=b'remote',
)
coreconfigitem(
    b'convert',
    b'git.renamelimit',
    default=400,
)
coreconfigitem(
    b'convert',
    b'git.saverev',
    default=True,
)
coreconfigitem(
    b'convert',
    b'git.similarity',
    default=50,
)
coreconfigitem(
    b'convert',
    b'git.skipsubmodules',
    default=False,
)
coreconfigitem(
    b'convert',
    b'hg.clonebranches',
    default=False,
)
coreconfigitem(
    b'convert',
    b'hg.ignoreerrors',
    default=False,
)
coreconfigitem(
    b'convert',
    b'hg.preserve-hash',
    default=False,
)
coreconfigitem(
    b'convert',
    b'hg.revs',
    default=None,
)
coreconfigitem(
    b'convert',
    b'hg.saverev',
    default=False,
)
coreconfigitem(
    b'convert',
    b'hg.sourcename',
    default=None,
)
coreconfigitem(
    b'convert',
    b'hg.startrev',
    default=None,
)
coreconfigitem(
    b'convert',
    b'hg.tagsbranch',
    default=b'default',
)
coreconfigitem(
    b'convert',
    b'hg.usebranchnames',
    default=True,
)
coreconfigitem(
    b'convert',
    b'ignoreancestorcheck',
    default=False,
    experimental=True,
)
coreconfigitem(
    b'convert',
    b'localtimezone',
    default=False,
)
coreconfigitem(
    b'convert',
    b'p4.encoding',
    default=dynamicdefault,
)
coreconfigitem(
    b'convert',
    b'p4.startrev',
    default=0,
)
coreconfigitem(
    b'convert',
    b'skiptags',
    default=False,
)
coreconfigitem(
    b'convert',
    b'svn.debugsvnlog',
    default=True,
)
coreconfigitem(
    b'convert',
    b'svn.trunk',
    default=None,
)
coreconfigitem(
    b'convert',
    b'svn.tags',
    default=None,
)
coreconfigitem(
    b'convert',
    b'svn.branches',
    default=None,
)
coreconfigitem(
    b'convert',
    b'svn.startrev',
    default=0,
)
coreconfigitem(
    b'convert',
    b'svn.dangerous-set-commit-dates',
    default=False,
)
coreconfigitem(
    b'debug',
    b'dirstate.delaywrite',
    default=0,
)
coreconfigitem(
    b'debug',
    b'revlog.verifyposition.changelog',
    default=b'',
)
coreconfigitem(
    b'debug',
    b'revlog.debug-delta',
    default=False,
)
# display extra information about the bundling process
coreconfigitem(
    b'debug',
    b'bundling-stats',
    default=False,
)
# display extra information about the unbundling process
coreconfigitem(
    b'debug',
    b'unbundling-stats',
    default=False,
)
coreconfigitem(
    b'defaults',
    b'.*',
    default=None,
    generic=True,
)
coreconfigitem(
    b'devel',
    b'all-warnings',
    default=False,
)
coreconfigitem(
    b'devel',
    b'bundle2.debug',
    default=False,
)
coreconfigitem(
    b'devel',
    b'bundle.delta',
    default=b'',
)
coreconfigitem(
    b'devel',
    b'cache-vfs',
    default=None,
)
coreconfigitem(
    b'devel',
    b'check-locks',
    default=False,
)
coreconfigitem(
    b'devel',
    b'check-relroot',
    default=False,
)
# Track copy information for all file, not just "added" one (very slow)
coreconfigitem(
    b'devel',
    b'copy-tracing.trace-all-files',
    default=False,
)
coreconfigitem(
    b'devel',
    b'default-date',
    default=None,
)
coreconfigitem(
    b'devel',
    b'deprec-warn',
    default=False,
)
coreconfigitem(
    b'devel',
    b'disableloaddefaultcerts',
    default=False,
)
coreconfigitem(
    b'devel',
    b'warn-empty-changegroup',
    default=False,
)
coreconfigitem(
    b'devel',
    b'legacy.exchange',
    default=list,
)
# When True, revlogs use a special reference version of the nodemap, that is not
# performant but is "known" to behave properly.
coreconfigitem(
    b'devel',
    b'persistent-nodemap',
    default=False,
)
coreconfigitem(
    b'devel',
    b'servercafile',
    default=b'',
)
coreconfigitem(
    b'devel',
    b'serverexactprotocol',
    default=b'',
)
coreconfigitem(
    b'devel',
    b'serverrequirecert',
    default=False,
)
coreconfigitem(
    b'devel',
    b'strip-obsmarkers',
    default=True,
)
coreconfigitem(
    b'devel',
    b'warn-config',
    default=None,
)
coreconfigitem(
    b'devel',
    b'warn-config-default',
    default=None,
)
coreconfigitem(
    b'devel',
    b'user.obsmarker',
    default=None,
)
coreconfigitem(
    b'devel',
    b'warn-config-unknown',
    default=None,
)
coreconfigitem(
    b'devel',
    b'debug.copies',
    default=False,
)
coreconfigitem(
    b'devel',
    b'copy-tracing.multi-thread',
    default=True,
)
coreconfigitem(
    b'devel',
    b'debug.extensions',
    default=False,
)
coreconfigitem(
    b'devel',
    b'debug.repo-filters',
    default=False,
)
coreconfigitem(
    b'devel',
    b'debug.peer-request',
    default=False,
)
# If discovery.exchange-heads is False, the discovery will not start with
# remote head fetching and local head querying.
coreconfigitem(
    b'devel',
    b'discovery.exchange-heads',
    default=True,
)
# If discovery.grow-sample is False, the sample size used in set discovery will
# not be increased through the process
coreconfigitem(
    b'devel',
    b'discovery.grow-sample',
    default=True,
)
# When discovery.grow-sample.dynamic is True, the default, the sample size is
# adapted to the shape of the undecided set (it is set to the max of:
# <target-size>, len(roots(undecided)), len(heads(undecided)
coreconfigitem(
    b'devel',
    b'discovery.grow-sample.dynamic',
    default=True,
)
# discovery.grow-sample.rate control the rate at which the sample grow
coreconfigitem(
    b'devel',
    b'discovery.grow-sample.rate',
    default=1.05,
)
# If discovery.randomize is False, random sampling during discovery are
# deterministic. It is meant for integration tests.
coreconfigitem(
    b'devel',
    b'discovery.randomize',
    default=True,
)
# Control the initial size of the discovery sample
coreconfigitem(
    b'devel',
    b'discovery.sample-size',
    default=200,
)
# Control the initial size of the discovery for initial change
coreconfigitem(
    b'devel',
    b'discovery.sample-size.initial',
    default=100,
)
_registerdiffopts(section=b'diff')
coreconfigitem(
    b'diff',
    b'merge',
    default=False,
    experimental=True,
)
coreconfigitem(
    b'email',
    b'bcc',
    default=None,
)
coreconfigitem(
    b'email',
    b'cc',
    default=None,
)
coreconfigitem(
    b'email',
    b'charsets',
    default=list,
)
coreconfigitem(
    b'email',
    b'from',
    default=None,
)
coreconfigitem(
    b'email',
    b'method',
    default=b'smtp',
)
coreconfigitem(
    b'email',
    b'reply-to',
    default=None,
)
coreconfigitem(
    b'email',
    b'to',
    default=None,
)
coreconfigitem(
    b'experimental',
    b'archivemetatemplate',
    default=dynamicdefault,
)
coreconfigitem(
    b'experimental',
    b'auto-publish',
    default=b'publish',
)
coreconfigitem(
    b'experimental',
    b'bundle-phases',
    default=False,
)
coreconfigitem(
    b'experimental',
    b'bundle2-advertise',
    default=True,
)
coreconfigitem(
    b'experimental',
    b'bundle2-output-capture',
    default=False,
)
coreconfigitem(
    b'experimental',
    b'bundle2.pushback',
    default=False,
)
coreconfigitem(
    b'experimental',
    b'bundle2lazylocking',
    default=False,
)
coreconfigitem(
    b'experimental',
    b'bundlecomplevel',
    default=None,
)
coreconfigitem(
    b'experimental',
    b'bundlecomplevel.bzip2',
    default=None,
)
coreconfigitem(
    b'experimental',
    b'bundlecomplevel.gzip',
    default=None,
)
coreconfigitem(
    b'experimental',
    b'bundlecomplevel.none',
    default=None,
)
coreconfigitem(
    b'experimental',
    b'bundlecomplevel.zstd',
    default=None,
)
coreconfigitem(
    b'experimental',
    b'bundlecompthreads',
    default=None,
)
coreconfigitem(
    b'experimental',
    b'bundlecompthreads.bzip2',
    default=None,
)
coreconfigitem(
    b'experimental',
    b'bundlecompthreads.gzip',
    default=None,
)
coreconfigitem(
    b'experimental',
    b'bundlecompthreads.none',
    default=None,
)
coreconfigitem(
    b'experimental',
    b'bundlecompthreads.zstd',
    default=None,
)
coreconfigitem(
    b'experimental',
    b'changegroup3',
    default=False,
)
coreconfigitem(
    b'experimental',
    b'changegroup4',
    default=False,
)
coreconfigitem(
    b'experimental',
    b'cleanup-as-archived',
    default=False,
)
coreconfigitem(
    b'experimental',
    b'clientcompressionengines',
    default=list,
)
coreconfigitem(
    b'experimental',
    b'copytrace',
    default=b'on',
)
coreconfigitem(
    b'experimental',
    b'copytrace.movecandidateslimit',
    default=100,
)
coreconfigitem(
    b'experimental',
    b'copytrace.sourcecommitlimit',
    default=100,
)
coreconfigitem(
    b'experimental',
    b'copies.read-from',
    default=b"filelog-only",
)
coreconfigitem(
    b'experimental',
    b'copies.write-to',
    default=b'filelog-only',
)
coreconfigitem(
    b'experimental',
    b'crecordtest',
    default=None,
)
coreconfigitem(
    b'experimental',
    b'directaccess',
    default=False,
)
coreconfigitem(
    b'experimental',
    b'directaccess.revnums',
    default=False,
)
coreconfigitem(
    b'experimental',
    b'editortmpinhg',
    default=False,
)
coreconfigitem(
    b'experimental',
    b'evolution',
    default=list,
)
coreconfigitem(
    b'experimental',
    b'evolution.allowdivergence',
    default=False,
    alias=[(b'experimental', b'allowdivergence')],
)
coreconfigitem(
    b'experimental',
    b'evolution.allowunstable',
    default=None,
)
coreconfigitem(
    b'experimental',
    b'evolution.createmarkers',
    default=None,
)
coreconfigitem(
    b'experimental',
    b'evolution.effect-flags',
    default=True,
    alias=[(b'experimental', b'effect-flags')],
)
coreconfigitem(
    b'experimental',
    b'evolution.exchange',
    default=None,
)
coreconfigitem(
    b'experimental',
    b'evolution.bundle-obsmarker',
    default=False,
)
coreconfigitem(
    b'experimental',
    b'evolution.bundle-obsmarker:mandatory',
    default=True,
)
coreconfigitem(
    b'experimental',
    b'log.topo',
    default=False,
)
coreconfigitem(
    b'experimental',
    b'evolution.report-instabilities',
    default=True,
)
coreconfigitem(
    b'experimental',
    b'evolution.track-operation',
    default=True,
)
# repo-level config to exclude a revset visibility
#
# The target use case is to use `share` to expose different subset of the same
# repository, especially server side. See also `server.view`.
coreconfigitem(
    b'experimental',
    b'extra-filter-revs',
    default=None,
)
coreconfigitem(
    b'experimental',
    b'maxdeltachainspan',
    default=-1,
)
# tracks files which were undeleted (merge might delete them but we explicitly
# kept/undeleted them) and creates new filenodes for them
coreconfigitem(
    b'experimental',
    b'merge-track-salvaged',
    default=False,
)
coreconfigitem(
    b'experimental',
    b'mmapindexthreshold',
    default=None,
)
coreconfigitem(
    b'experimental',
    b'narrow',
    default=False,
)
coreconfigitem(
    b'experimental',
    b'nonnormalparanoidcheck',
    default=False,
)
coreconfigitem(
    b'experimental',
    b'exportableenviron',
    default=list,
)
coreconfigitem(
    b'experimental',
    b'extendedheader.index',
    default=None,
)
coreconfigitem(
    b'experimental',
    b'extendedheader.similarity',
    default=False,
)
coreconfigitem(
    b'experimental',
    b'graphshorten',
    default=False,
)
coreconfigitem(
    b'experimental',
    b'graphstyle.parent',
    default=dynamicdefault,
)
coreconfigitem(
    b'experimental',
    b'graphstyle.missing',
    default=dynamicdefault,
)
coreconfigitem(
    b'experimental',
    b'graphstyle.grandparent',
    default=dynamicdefault,
)
coreconfigitem(
    b'experimental',
    b'hook-track-tags',
    default=False,
)
coreconfigitem(
    b'experimental',
    b'httppostargs',
    default=False,
)
coreconfigitem(b'experimental', b'nointerrupt', default=False)
coreconfigitem(b'experimental', b'nointerrupt-interactiveonly', default=True)

coreconfigitem(
    b'experimental',
    b'obsmarkers-exchange-debug',
    default=False,
)
coreconfigitem(
    b'experimental',
    b'remotenames',
    default=False,
)
coreconfigitem(
    b'experimental',
    b'removeemptydirs',
    default=True,
)
coreconfigitem(
    b'experimental',
    b'revert.interactive.select-to-keep',
    default=False,
)
coreconfigitem(
    b'experimental',
    b'revisions.prefixhexnode',
    default=False,
)
# "out of experimental" todo list.
#
# * include management of a persistent nodemap in the main docket
# * enforce a "no-truncate" policy for mmap safety
#      - for censoring operation
#      - for stripping operation
#      - for rollback operation
# * proper streaming (race free) of the docket file
# * track garbage data to evemtually allow rewriting -existing- sidedata.
# * Exchange-wise, we will also need to do something more efficient than
#   keeping references to the affected revlogs, especially memory-wise when
#   rewriting sidedata.
# * introduce a proper solution to reduce the number of filelog related files.
# * use caching for reading sidedata (similar to what we do for data).
# * no longer set offset=0 if sidedata_size=0 (simplify cutoff computation).
# * Improvement to consider
#   - avoid compression header in chunk using the default compression?
#   - forbid "inline" compression mode entirely?
#   - split the data offset and flag field (the 2 bytes save are mostly trouble)
#   - keep track of uncompressed -chunk- size (to preallocate memory better)
#   - keep track of chain base or size (probably not that useful anymore)
coreconfigitem(
    b'experimental',
    b'revlogv2',
    default=None,
)
coreconfigitem(
    b'experimental',
    b'revisions.disambiguatewithin',
    default=None,
)
coreconfigitem(
    b'experimental',
    b'rust.index',
    default=False,
)
coreconfigitem(
    b'experimental',
    b'server.filesdata.recommended-batch-size',
    default=50000,
)
coreconfigitem(
    b'experimental',
    b'server.manifestdata.recommended-batch-size',
    default=100000,
)
coreconfigitem(
    b'experimental',
    b'server.stream-narrow-clones',
    default=False,
)
coreconfigitem(
    b'experimental',
    b'single-head-per-branch',
    default=False,
)
coreconfigitem(
    b'experimental',
    b'single-head-per-branch:account-closed-heads',
    default=False,
)
coreconfigitem(
    b'experimental',
    b'single-head-per-branch:public-changes-only',
    default=False,
)
coreconfigitem(
    b'experimental',
    b'sparse-read',
    default=False,
)
coreconfigitem(
    b'experimental',
    b'sparse-read.density-threshold',
    default=0.50,
)
coreconfigitem(
    b'experimental',
    b'sparse-read.min-gap-size',
    default=b'65K',
)
coreconfigitem(
    b'experimental',
    b'treemanifest',
    default=False,
)
coreconfigitem(
    b'experimental',
    b'update.atomic-file',
    default=False,
)
coreconfigitem(
    b'experimental',
    b'web.full-garbage-collection-rate',
    default=1,  # still forcing a full collection on each request
)
coreconfigitem(
    b'experimental',
    b'worker.wdir-get-thread-safe',
    default=False,
)
coreconfigitem(
    b'experimental',
    b'worker.repository-upgrade',
    default=False,
)
coreconfigitem(
    b'experimental',
    b'xdiff',
    default=False,
)
coreconfigitem(
    b'extensions',
    b'[^:]*',
    default=None,
    generic=True,
)
coreconfigitem(
    b'extensions',
    b'[^:]*:required',
    default=False,
    generic=True,
)
coreconfigitem(
    b'extdata',
    b'.*',
    default=None,
    generic=True,
)
coreconfigitem(
    b'format',
    b'bookmarks-in-store',
    default=False,
)
coreconfigitem(
    b'format',
    b'chunkcachesize',
    default=None,
    experimental=True,
)
coreconfigitem(
    # Enable this dirstate format *when creating a new repository*.
    # Which format to use for existing repos is controlled by .hg/requires
    b'format',
    b'use-dirstate-v2',
    default=False,
    experimental=True,
    alias=[(b'format', b'exp-rc-dirstate-v2')],
)
coreconfigitem(
    b'format',
    b'use-dirstate-v2.automatic-upgrade-of-mismatching-repositories',
    default=False,
    experimental=True,
)
coreconfigitem(
    b'format',
    b'use-dirstate-v2.automatic-upgrade-of-mismatching-repositories:quiet',
    default=False,
    experimental=True,
)
coreconfigitem(
    b'format',
    b'use-dirstate-tracked-hint',
    default=False,
    experimental=True,
)
coreconfigitem(
    b'format',
    b'use-dirstate-tracked-hint.version',
    default=1,
    experimental=True,
)
coreconfigitem(
    b'format',
    b'use-dirstate-tracked-hint.automatic-upgrade-of-mismatching-repositories',
    default=False,
    experimental=True,
)
coreconfigitem(
    b'format',
    b'use-dirstate-tracked-hint.automatic-upgrade-of-mismatching-repositories:quiet',
    default=False,
    experimental=True,
)
coreconfigitem(
    b'format',
    b'dotencode',
    default=True,
)
coreconfigitem(
    b'format',
    b'generaldelta',
    default=False,
    experimental=True,
)
coreconfigitem(
    b'format',
    b'manifestcachesize',
    default=None,
    experimental=True,
)
coreconfigitem(
    b'format',
    b'maxchainlen',
    default=dynamicdefault,
    experimental=True,
)
coreconfigitem(
    b'format',
    b'obsstore-version',
    default=None,
)
coreconfigitem(
    b'format',
    b'sparse-revlog',
    default=True,
)
coreconfigitem(
    b'format',
    b'revlog-compression',
    default=lambda: [b'zstd', b'zlib'],
    alias=[(b'experimental', b'format.compression')],
)
# Experimental TODOs:
#
# * Same as for revlogv2 (but for the reduction of the number of files)
# * Actually computing the rank of changesets
# * Improvement to investigate
#   - storing .hgtags fnode
#   - storing branch related identifier

coreconfigitem(
    b'format',
    b'exp-use-changelog-v2',
    default=None,
    experimental=True,
)
coreconfigitem(
    b'format',
    b'usefncache',
    default=True,
)
coreconfigitem(
    b'format',
    b'usegeneraldelta',
    default=True,
)
coreconfigitem(
    b'format',
    b'usestore',
    default=True,
)


def _persistent_nodemap_default():
    """compute `use-persistent-nodemap` default value

    The feature is disabled unless a fast implementation is available.
    """
    from . import policy

    return policy.importrust('revlog') is not None


coreconfigitem(
    b'format',
    b'use-persistent-nodemap',
    default=_persistent_nodemap_default,
)
coreconfigitem(
    b'format',
    b'exp-use-copies-side-data-changeset',
    default=False,
    experimental=True,
)
coreconfigitem(
    b'format',
    b'use-share-safe',
    default=True,
)
coreconfigitem(
    b'format',
    b'use-share-safe.automatic-upgrade-of-mismatching-repositories',
    default=False,
    experimental=True,
)
coreconfigitem(
    b'format',
    b'use-share-safe.automatic-upgrade-of-mismatching-repositories:quiet',
    default=False,
    experimental=True,
)

# Moving this on by default means we are confident about the scaling of phases.
# This is not garanteed to be the case at the time this message is written.
coreconfigitem(
    b'format',
    b'use-internal-phase',
    default=False,
    experimental=True,
)
# The interaction between the archived phase and obsolescence markers needs to
# be sorted out before wider usage of this are to be considered.
#
# At the time this message is written, behavior when archiving obsolete
# changeset differ significantly from stripping. As part of stripping, we also
# remove the obsolescence marker associated to the stripped changesets,
# revealing the precedecessors changesets when applicable. When archiving, we
# don't touch the obsolescence markers, keeping everything hidden. This can
# result in quite confusing situation for people combining exchanging draft
# with the archived phases. As some markers needed by others may be skipped
# during exchange.
coreconfigitem(
    b'format',
    b'exp-archived-phase',
    default=False,
    experimental=True,
)
coreconfigitem(
    b'shelve',
    b'store',
    default=b'internal',
    experimental=True,
)
coreconfigitem(
    b'fsmonitor',
    b'warn_when_unused',
    default=True,
)
coreconfigitem(
    b'fsmonitor',
    b'warn_update_file_count',
    default=50000,
)
coreconfigitem(
    b'fsmonitor',
    b'warn_update_file_count_rust',
    default=400000,
)
coreconfigitem(
    b'help',
    br'hidden-command\..*',
    default=False,
    generic=True,
)
coreconfigitem(
    b'help',
    br'hidden-topic\..*',
    default=False,
    generic=True,
)
coreconfigitem(
    b'hooks',
    b'[^:]*',
    default=dynamicdefault,
    generic=True,
)
coreconfigitem(
    b'hooks',
    b'.*:run-with-plain',
    default=True,
    generic=True,
)
coreconfigitem(
    b'hgweb-paths',
    b'.*',
    default=list,
    generic=True,
)
coreconfigitem(
    b'hostfingerprints',
    b'.*',
    default=list,
    generic=True,
)
coreconfigitem(
    b'hostsecurity',
    b'ciphers',
    default=None,
)
coreconfigitem(
    b'hostsecurity',
    b'minimumprotocol',
    default=dynamicdefault,
)
coreconfigitem(
    b'hostsecurity',
    b'.*:minimumprotocol$',
    default=dynamicdefault,
    generic=True,
)
coreconfigitem(
    b'hostsecurity',
    b'.*:ciphers$',
    default=dynamicdefault,
    generic=True,
)
coreconfigitem(
    b'hostsecurity',
    b'.*:fingerprints$',
    default=list,
    generic=True,
)
coreconfigitem(
    b'hostsecurity',
    b'.*:verifycertsfile$',
    default=None,
    generic=True,
)

coreconfigitem(
    b'http_proxy',
    b'always',
    default=False,
)
coreconfigitem(
    b'http_proxy',
    b'host',
    default=None,
)
coreconfigitem(
    b'http_proxy',
    b'no',
    default=list,
)
coreconfigitem(
    b'http_proxy',
    b'passwd',
    default=None,
)
coreconfigitem(
    b'http_proxy',
    b'user',
    default=None,
)

coreconfigitem(
    b'http',
    b'timeout',
    default=None,
)

coreconfigitem(
    b'logtoprocess',
    b'commandexception',
    default=None,
)
coreconfigitem(
    b'logtoprocess',
    b'commandfinish',
    default=None,
)
coreconfigitem(
    b'logtoprocess',
    b'command',
    default=None,
)
coreconfigitem(
    b'logtoprocess',
    b'develwarn',
    default=None,
)
coreconfigitem(
    b'logtoprocess',
    b'uiblocked',
    default=None,
)
coreconfigitem(
    b'merge',
    b'checkunknown',
    default=b'abort',
)
coreconfigitem(
    b'merge',
    b'checkignored',
    default=b'abort',
)
coreconfigitem(
    b'experimental',
    b'merge.checkpathconflicts',
    default=False,
)
coreconfigitem(
    b'merge',
    b'followcopies',
    default=True,
)
coreconfigitem(
    b'merge',
    b'on-failure',
    default=b'continue',
)
coreconfigitem(
    b'merge',
    b'preferancestor',
    default=lambda: [b'*'],
    experimental=True,
)
coreconfigitem(
    b'merge',
    b'strict-capability-check',
    default=False,
)
coreconfigitem(
    b'merge',
    b'disable-partial-tools',
    default=False,
    experimental=True,
)
coreconfigitem(
    b'partial-merge-tools',
    b'.*',
    default=None,
    generic=True,
    experimental=True,
)
coreconfigitem(
    b'partial-merge-tools',
    br'.*\.patterns',
    default=dynamicdefault,
    generic=True,
    priority=-1,
    experimental=True,
)
coreconfigitem(
    b'partial-merge-tools',
    br'.*\.executable$',
    default=dynamicdefault,
    generic=True,
    priority=-1,
    experimental=True,
)
coreconfigitem(
    b'partial-merge-tools',
    br'.*\.order',
    default=0,
    generic=True,
    priority=-1,
    experimental=True,
)
coreconfigitem(
    b'partial-merge-tools',
    br'.*\.args',
    default=b"$local $base $other",
    generic=True,
    priority=-1,
    experimental=True,
)
coreconfigitem(
    b'partial-merge-tools',
    br'.*\.disable',
    default=False,
    generic=True,
    priority=-1,
    experimental=True,
)
coreconfigitem(
    b'merge-tools',
    b'.*',
    default=None,
    generic=True,
)
coreconfigitem(
    b'merge-tools',
    br'.*\.args$',
    default=b"$local $base $other",
    generic=True,
    priority=-1,
)
coreconfigitem(
    b'merge-tools',
    br'.*\.binary$',
    default=False,
    generic=True,
    priority=-1,
)
coreconfigitem(
    b'merge-tools',
    br'.*\.check$',
    default=list,
    generic=True,
    priority=-1,
)
coreconfigitem(
    b'merge-tools',
    br'.*\.checkchanged$',
    default=False,
    generic=True,
    priority=-1,
)
coreconfigitem(
    b'merge-tools',
    br'.*\.executable$',
    default=dynamicdefault,
    generic=True,
    priority=-1,
)
coreconfigitem(
    b'merge-tools',
    br'.*\.fixeol$',
    default=False,
    generic=True,
    priority=-1,
)
coreconfigitem(
    b'merge-tools',
    br'.*\.gui$',
    default=False,
    generic=True,
    priority=-1,
)
coreconfigitem(
    b'merge-tools',
    br'.*\.mergemarkers$',
    default=b'basic',
    generic=True,
    priority=-1,
)
coreconfigitem(
    b'merge-tools',
    br'.*\.mergemarkertemplate$',
    default=dynamicdefault,  # take from command-templates.mergemarker
    generic=True,
    priority=-1,
)
coreconfigitem(
    b'merge-tools',
    br'.*\.priority$',
    default=0,
    generic=True,
    priority=-1,
)
coreconfigitem(
    b'merge-tools',
    br'.*\.premerge$',
    default=dynamicdefault,
    generic=True,
    priority=-1,
)
coreconfigitem(
    b'merge-tools',
    br'.*\.regappend$',
    default=b"",
    generic=True,
    priority=-1,
)
coreconfigitem(
    b'merge-tools',
    br'.*\.symlink$',
    default=False,
    generic=True,
    priority=-1,
)
coreconfigitem(
    b'pager',
    b'attend-.*',
    default=dynamicdefault,
    generic=True,
)
coreconfigitem(
    b'pager',
    b'ignore',
    default=list,
)
coreconfigitem(
    b'pager',
    b'pager',
    default=dynamicdefault,
)
coreconfigitem(
    b'patch',
    b'eol',
    default=b'strict',
)
coreconfigitem(
    b'patch',
    b'fuzz',
    default=2,
)
coreconfigitem(
    b'paths',
    b'default',
    default=None,
)
coreconfigitem(
    b'paths',
    b'default-push',
    default=None,
)
coreconfigitem(
    b'paths',
    b'.*',
    default=None,
    generic=True,
)
coreconfigitem(
    b'paths',
    b'.*:bookmarks.mode',
    default='default',
    generic=True,
)
coreconfigitem(
    b'paths',
    b'.*:multi-urls',
    default=False,
    generic=True,
)
coreconfigitem(
    b'paths',
    b'.*:pushrev',
    default=None,
    generic=True,
)
coreconfigitem(
    b'paths',
    b'.*:pushurl',
    default=None,
    generic=True,
)
coreconfigitem(
    b'phases',
    b'checksubrepos',
    default=b'follow',
)
coreconfigitem(
    b'phases',
    b'new-commit',
    default=b'draft',
)
coreconfigitem(
    b'phases',
    b'publish',
    default=True,
)
coreconfigitem(
    b'profiling',
    b'enabled',
    default=False,
)
coreconfigitem(
    b'profiling',
    b'format',
    default=b'text',
)
coreconfigitem(
    b'profiling',
    b'freq',
    default=1000,
)
coreconfigitem(
    b'profiling',
    b'limit',
    default=30,
)
coreconfigitem(
    b'profiling',
    b'nested',
    default=0,
)
coreconfigitem(
    b'profiling',
    b'output',
    default=None,
)
coreconfigitem(
    b'profiling',
    b'showmax',
    default=0.999,
)
coreconfigitem(
    b'profiling',
    b'showmin',
    default=dynamicdefault,
)
coreconfigitem(
    b'profiling',
    b'showtime',
    default=True,
)
coreconfigitem(
    b'profiling',
    b'sort',
    default=b'inlinetime',
)
coreconfigitem(
    b'profiling',
    b'statformat',
    default=b'hotpath',
)
coreconfigitem(
    b'profiling',
    b'time-track',
    default=dynamicdefault,
)
coreconfigitem(
    b'profiling',
    b'type',
    default=b'stat',
)
coreconfigitem(
    b'progress',
    b'assume-tty',
    default=False,
)
coreconfigitem(
    b'progress',
    b'changedelay',
    default=1,
)
coreconfigitem(
    b'progress',
    b'clear-complete',
    default=True,
)
coreconfigitem(
    b'progress',
    b'debug',
    default=False,
)
coreconfigitem(
    b'progress',
    b'delay',
    default=3,
)
coreconfigitem(
    b'progress',
    b'disable',
    default=False,
)
coreconfigitem(
    b'progress',
    b'estimateinterval',
    default=60.0,
)
coreconfigitem(
    b'progress',
    b'format',
    default=lambda: [b'topic', b'bar', b'number', b'estimate'],
)
coreconfigitem(
    b'progress',
    b'refresh',
    default=0.1,
)
coreconfigitem(
    b'progress',
    b'width',
    default=dynamicdefault,
)
coreconfigitem(
    b'pull',
    b'confirm',
    default=False,
)
coreconfigitem(
    b'push',
    b'pushvars.server',
    default=False,
)
coreconfigitem(
    b'rewrite',
    b'backup-bundle',
    default=True,
    alias=[(b'ui', b'history-editing-backup')],
)
coreconfigitem(
    b'rewrite',
    b'update-timestamp',
    default=False,
)
coreconfigitem(
    b'rewrite',
    b'empty-successor',
    default=b'skip',
    experimental=True,
)
# experimental as long as format.use-dirstate-v2 is.
coreconfigitem(
    b'storage',
    b'dirstate-v2.slow-path',
    default=b"abort",
    experimental=True,
)
coreconfigitem(
    b'storage',
    b'new-repo-backend',
    default=b'revlogv1',
    experimental=True,
)
coreconfigitem(
    b'storage',
    b'revlog.optimize-delta-parent-choice',
    default=True,
    alias=[(b'format', b'aggressivemergedeltas')],
)
coreconfigitem(
    b'storage',
    b'revlog.delta-parent-search.candidate-group-chunk-size',
    default=10,
)
coreconfigitem(
    b'storage',
    b'revlog.issue6528.fix-incoming',
    default=True,
)
# experimental as long as rust is experimental (or a C version is implemented)
coreconfigitem(
    b'storage',
    b'revlog.persistent-nodemap.mmap',
    default=True,
)
# experimental as long as format.use-persistent-nodemap is.
coreconfigitem(
    b'storage',
    b'revlog.persistent-nodemap.slow-path',
    default=b"abort",
)

coreconfigitem(
    b'storage',
    b'revlog.reuse-external-delta',
    default=True,
)
coreconfigitem(
    b'storage',
    b'revlog.reuse-external-delta-parent',
    default=None,
)
coreconfigitem(
    b'storage',
    b'revlog.zlib.level',
    default=None,
)
coreconfigitem(
    b'storage',
    b'revlog.zstd.level',
    default=None,
)
coreconfigitem(
    b'server',
    b'bookmarks-pushkey-compat',
    default=True,
)
coreconfigitem(
    b'server',
    b'bundle1',
    default=True,
)
coreconfigitem(
    b'server',
    b'bundle1gd',
    default=None,
)
coreconfigitem(
    b'server',
    b'bundle1.pull',
    default=None,
)
coreconfigitem(
    b'server',
    b'bundle1gd.pull',
    default=None,
)
coreconfigitem(
    b'server',
    b'bundle1.push',
    default=None,
)
coreconfigitem(
    b'server',
    b'bundle1gd.push',
    default=None,
)
coreconfigitem(
    b'server',
    b'bundle2.stream',
    default=True,
    alias=[(b'experimental', b'bundle2.stream')],
)
coreconfigitem(
    b'server',
    b'compressionengines',
    default=list,
)
coreconfigitem(
    b'server',
    b'concurrent-push-mode',
    default=b'check-related',
)
coreconfigitem(
    b'server',
    b'disablefullbundle',
    default=False,
)
coreconfigitem(
    b'server',
    b'maxhttpheaderlen',
    default=1024,
)
coreconfigitem(
    b'server',
    b'pullbundle',
    default=True,
)
coreconfigitem(
    b'server',
    b'preferuncompressed',
    default=False,
)
coreconfigitem(
    b'server',
    b'streamunbundle',
    default=False,
)
coreconfigitem(
    b'server',
    b'uncompressed',
    default=True,
)
coreconfigitem(
    b'server',
    b'uncompressedallowsecret',
    default=False,
)
coreconfigitem(
    b'server',
    b'view',
    default=b'served',
)
coreconfigitem(
    b'server',
    b'validate',
    default=False,
)
coreconfigitem(
    b'server',
    b'zliblevel',
    default=-1,
)
coreconfigitem(
    b'server',
    b'zstdlevel',
    default=3,
)
coreconfigitem(
    b'share',
    b'pool',
    default=None,
)
coreconfigitem(
    b'share',
    b'poolnaming',
    default=b'identity',
)
coreconfigitem(
    b'share',
    b'safe-mismatch.source-not-safe',
    default=b'abort',
)
coreconfigitem(
    b'share',
    b'safe-mismatch.source-safe',
    default=b'abort',
)
coreconfigitem(
    b'share',
    b'safe-mismatch.source-not-safe.warn',
    default=True,
)
coreconfigitem(
    b'share',
    b'safe-mismatch.source-safe.warn',
    default=True,
)
coreconfigitem(
    b'share',
    b'safe-mismatch.source-not-safe:verbose-upgrade',
    default=True,
)
coreconfigitem(
    b'share',
    b'safe-mismatch.source-safe:verbose-upgrade',
    default=True,
)
coreconfigitem(
    b'shelve',
    b'maxbackups',
    default=10,
)
coreconfigitem(
    b'smtp',
    b'host',
    default=None,
)
coreconfigitem(
    b'smtp',
    b'local_hostname',
    default=None,
)
coreconfigitem(
    b'smtp',
    b'password',
    default=None,
)
coreconfigitem(
    b'smtp',
    b'port',
    default=dynamicdefault,
)
coreconfigitem(
    b'smtp',
    b'tls',
    default=b'none',
)
coreconfigitem(
    b'smtp',
    b'username',
    default=None,
)
coreconfigitem(
    b'sparse',
    b'missingwarning',
    default=True,
    experimental=True,
)
coreconfigitem(
    b'subrepos',
    b'allowed',
    default=dynamicdefault,  # to make backporting simpler
)
coreconfigitem(
    b'subrepos',
    b'hg:allowed',
    default=dynamicdefault,
)
coreconfigitem(
    b'subrepos',
    b'git:allowed',
    default=dynamicdefault,
)
coreconfigitem(
    b'subrepos',
    b'svn:allowed',
    default=dynamicdefault,
)
coreconfigitem(
    b'templates',
    b'.*',
    default=None,
    generic=True,
)
coreconfigitem(
    b'templateconfig',
    b'.*',
    default=dynamicdefault,
    generic=True,
)
coreconfigitem(
    b'trusted',
    b'groups',
    default=list,
)
coreconfigitem(
    b'trusted',
    b'users',
    default=list,
)
coreconfigitem(
    b'ui',
    b'_usedassubrepo',
    default=False,
)
coreconfigitem(
    b'ui',
    b'allowemptycommit',
    default=False,
)
coreconfigitem(
    b'ui',
    b'archivemeta',
    default=True,
)
coreconfigitem(
    b'ui',
    b'askusername',
    default=False,
)
coreconfigitem(
    b'ui',
    b'available-memory',
    default=None,
)

coreconfigitem(
    b'ui',
    b'clonebundlefallback',
    default=False,
)
coreconfigitem(
    b'ui',
    b'clonebundleprefers',
    default=list,
)
coreconfigitem(
    b'ui',
    b'clonebundles',
    default=True,
)
coreconfigitem(
    b'ui',
    b'color',
    default=b'auto',
)
coreconfigitem(
    b'ui',
    b'commitsubrepos',
    default=False,
)
coreconfigitem(
    b'ui',
    b'debug',
    default=False,
)
coreconfigitem(
    b'ui',
    b'debugger',
    default=None,
)
coreconfigitem(
    b'ui',
    b'editor',
    default=dynamicdefault,
)
coreconfigitem(
    b'ui',
    b'detailed-exit-code',
    default=False,
    experimental=True,
)
coreconfigitem(
    b'ui',
    b'fallbackencoding',
    default=None,
)
coreconfigitem(
    b'ui',
    b'forcecwd',
    default=None,
)
coreconfigitem(
    b'ui',
    b'forcemerge',
    default=None,
)
coreconfigitem(
    b'ui',
    b'formatdebug',
    default=False,
)
coreconfigitem(
    b'ui',
    b'formatjson',
    default=False,
)
coreconfigitem(
    b'ui',
    b'formatted',
    default=None,
)
coreconfigitem(
    b'ui',
    b'interactive',
    default=None,
)
coreconfigitem(
    b'ui',
    b'interface',
    default=None,
)
coreconfigitem(
    b'ui',
    b'interface.chunkselector',
    default=None,
)
coreconfigitem(
    b'ui',
    b'large-file-limit',
    default=10 * (2 ** 20),
)
coreconfigitem(
    b'ui',
    b'logblockedtimes',
    default=False,
)
coreconfigitem(
    b'ui',
    b'merge',
    default=None,
)
coreconfigitem(
    b'ui',
    b'mergemarkers',
    default=b'basic',
)
coreconfigitem(
    b'ui',
    b'message-output',
    default=b'stdio',
)
coreconfigitem(
    b'ui',
    b'nontty',
    default=False,
)
coreconfigitem(
    b'ui',
    b'origbackuppath',
    default=None,
)
coreconfigitem(
    b'ui',
    b'paginate',
    default=True,
)
coreconfigitem(
    b'ui',
    b'patch',
    default=None,
)
coreconfigitem(
    b'ui',
    b'portablefilenames',
    default=b'warn',
)
coreconfigitem(
    b'ui',
    b'promptecho',
    default=False,
)
coreconfigitem(
    b'ui',
    b'quiet',
    default=False,
)
coreconfigitem(
    b'ui',
    b'quietbookmarkmove',
    default=False,
)
coreconfigitem(
    b'ui',
    b'relative-paths',
    default=b'legacy',
)
coreconfigitem(
    b'ui',
    b'remotecmd',
    default=b'hg',
)
coreconfigitem(
    b'ui',
    b'report_untrusted',
    default=True,
)
coreconfigitem(
    b'ui',
    b'rollback',
    default=True,
)
coreconfigitem(
    b'ui',
    b'signal-safe-lock',
    default=True,
)
coreconfigitem(
    b'ui',
    b'slash',
    default=False,
)
coreconfigitem(
    b'ui',
    b'ssh',
    default=b'ssh',
)
coreconfigitem(
    b'ui',
    b'ssherrorhint',
    default=None,
)
coreconfigitem(
    b'ui',
    b'statuscopies',
    default=False,
)
coreconfigitem(
    b'ui',
    b'strict',
    default=False,
)
coreconfigitem(
    b'ui',
    b'style',
    default=b'',
)
coreconfigitem(
    b'ui',
    b'supportcontact',
    default=None,
)
coreconfigitem(
    b'ui',
    b'textwidth',
    default=78,
)
coreconfigitem(
    b'ui',
    b'timeout',
    default=b'600',
)
coreconfigitem(
    b'ui',
    b'timeout.warn',
    default=0,
)
coreconfigitem(
    b'ui',
    b'timestamp-output',
    default=False,
)
coreconfigitem(
    b'ui',
    b'traceback',
    default=False,
)
coreconfigitem(
    b'ui',
    b'tweakdefaults',
    default=False,
)
coreconfigitem(b'ui', b'username', alias=[(b'ui', b'user')])
coreconfigitem(
    b'ui',
    b'verbose',
    default=False,
)
coreconfigitem(
    b'verify',
    b'skipflags',
    default=0,
)
coreconfigitem(
    b'web',
    b'allowbz2',
    default=False,
)
coreconfigitem(
    b'web',
    b'allowgz',
    default=False,
)
coreconfigitem(
    b'web',
    b'allow-pull',
    alias=[(b'web', b'allowpull')],
    default=True,
)
coreconfigitem(
    b'web',
    b'allow-push',
    alias=[(b'web', b'allow_push')],
    default=list,
)
coreconfigitem(
    b'web',
    b'allowzip',
    default=False,
)
coreconfigitem(
    b'web',
    b'archivesubrepos',
    default=False,
)
coreconfigitem(
    b'web',
    b'cache',
    default=True,
)
coreconfigitem(
    b'web',
    b'comparisoncontext',
    default=5,
)
coreconfigitem(
    b'web',
    b'contact',
    default=None,
)
coreconfigitem(
    b'web',
    b'deny_push',
    default=list,
)
coreconfigitem(
    b'web',
    b'guessmime',
    default=False,
)
coreconfigitem(
    b'web',
    b'hidden',
    default=False,
)
coreconfigitem(
    b'web',
    b'labels',
    default=list,
)
coreconfigitem(
    b'web',
    b'logoimg',
    default=b'hglogo.png',
)
coreconfigitem(
    b'web',
    b'logourl',
    default=b'https://mercurial-scm.org/',
)
coreconfigitem(
    b'web',
    b'accesslog',
    default=b'-',
)
coreconfigitem(
    b'web',
    b'address',
    default=b'',
)
coreconfigitem(
    b'web',
    b'allow-archive',
    alias=[(b'web', b'allow_archive')],
    default=list,
)
coreconfigitem(
    b'web',
    b'allow_read',
    default=list,
)
coreconfigitem(
    b'web',
    b'baseurl',
    default=None,
)
coreconfigitem(
    b'web',
    b'cacerts',
    default=None,
)
coreconfigitem(
    b'web',
    b'certificate',
    default=None,
)
coreconfigitem(
    b'web',
    b'collapse',
    default=False,
)
coreconfigitem(
    b'web',
    b'csp',
    default=None,
)
coreconfigitem(
    b'web',
    b'deny_read',
    default=list,
)
coreconfigitem(
    b'web',
    b'descend',
    default=True,
)
coreconfigitem(
    b'web',
    b'description',
    default=b"",
)
coreconfigitem(
    b'web',
    b'encoding',
    default=lambda: encoding.encoding,
)
coreconfigitem(
    b'web',
    b'errorlog',
    default=b'-',
)
coreconfigitem(
    b'web',
    b'ipv6',
    default=False,
)
coreconfigitem(
    b'web',
    b'maxchanges',
    default=10,
)
coreconfigitem(
    b'web',
    b'maxfiles',
    default=10,
)
coreconfigitem(
    b'web',
    b'maxshortchanges',
    default=60,
)
coreconfigitem(
    b'web',
    b'motd',
    default=b'',
)
coreconfigitem(
    b'web',
    b'name',
    default=dynamicdefault,
)
coreconfigitem(
    b'web',
    b'port',
    default=8000,
)
coreconfigitem(
    b'web',
    b'prefix',
    default=b'',
)
coreconfigitem(
    b'web',
    b'push_ssl',
    default=True,
)
coreconfigitem(
    b'web',
    b'refreshinterval',
    default=20,
)
coreconfigitem(
    b'web',
    b'server-header',
    default=None,
)
coreconfigitem(
    b'web',
    b'static',
    default=None,
)
coreconfigitem(
    b'web',
    b'staticurl',
    default=None,
)
coreconfigitem(
    b'web',
    b'stripes',
    default=1,
)
coreconfigitem(
    b'web',
    b'style',
    default=b'paper',
)
coreconfigitem(
    b'web',
    b'templates',
    default=None,
)
coreconfigitem(
    b'web',
    b'view',
    default=b'served',
    experimental=True,
)
coreconfigitem(
    b'worker',
    b'backgroundclose',
    default=dynamicdefault,
)
# Windows defaults to a limit of 512 open files. A buffer of 128
# should give us enough headway.
coreconfigitem(
    b'worker',
    b'backgroundclosemaxqueue',
    default=384,
)
coreconfigitem(
    b'worker',
    b'backgroundcloseminfilecount',
    default=2048,
)
coreconfigitem(
    b'worker',
    b'backgroundclosethreadcount',
    default=4,
)
coreconfigitem(
    b'worker',
    b'enabled',
    default=True,
)
coreconfigitem(
    b'worker',
    b'numcpus',
    default=None,
)

# Rebase related configuration moved to core because other extension are doing
# strange things. For example, shelve import the extensions to reuse some bit
# without formally loading it.
coreconfigitem(
    b'commands',
    b'rebase.requiredest',
    default=False,
)
coreconfigitem(
    b'experimental',
    b'rebaseskipobsolete',
    default=True,
)
coreconfigitem(
    b'rebase',
    b'singletransaction',
    default=False,
)
coreconfigitem(
    b'rebase',
    b'experimental.inmemory',
    default=False,
)

# This setting controls creation of a rebase_source extra field
# during rebase. When False, no such field is created. This is
# useful eg for incrementally converting changesets and then
# rebasing them onto an existing repo.
# WARNING: this is an advanced setting reserved for people who know
# exactly what they are doing. Misuse of this setting can easily
# result in obsmarker cycles and a vivid headache.
coreconfigitem(
    b'rebase',
    b'store-source',
    default=True,
    experimental=True,
)