configitems: declare items in a TOML file
authorRaphaël Gomès <rgomes@octobus.net>
Mon, 23 Jan 2023 18:08:11 +0100
changeset 50762 c51b178b0b7e
parent 50761 2c34c9b61a4f
child 50763 f8412da86d05
configitems: declare items in a TOML file Mercurial ships with Rust code that also needs to read from the config. Having a way of presenting `configitems` to both Python and Rust is needed to prevent duplication, drift, and have the appropriate devel warnings. Abstracting away from Python means choosing a config format. No single format is perfect, and I have yet to come across a developer that doesn't hate all of them in some way. Since we have a strict no-dependencies policy for Mercurial, we either need to use whatever comes with Python, vendor a library, or implement a custom format ourselves. Python stdlib means using JSON, which doesn't support comments and isn't great for humans, or `configparser` which is an obscure, untyped format that nobody uses and doesn't have a commonplace Rust parser. Implementing a custom format is error-prone, tedious and subject to the same issues as picking an existing format. Vendoring opens us to the vast array of common config formats. The ones being picked for most modern software are YAML and TOML. YAML is older and common in the Python community, but TOML is much simpler and less error-prone. I would much rather be responsible for the <1000 lines of `tomli`, on top of TOML being the choice of the Rust community, with robust crates for reading it. The structure of `configitems.toml` is explained inline.
mercurial/configitems.py
mercurial/configitems.toml
setup.py
--- a/mercurial/configitems.py	Mon Jan 23 17:11:42 2023 +0100
+++ b/mercurial/configitems.py	Mon Jan 23 18:08:11 2023 +0100
@@ -9,11 +9,21 @@
 import functools
 import re
 
+from .utils import resourceutil
+
 from . import (
     encoding,
     error,
 )
 
+try:
+    import tomllib  # pytype: disable=import-error
+
+    tomllib.load  # trigger lazy import
+except ModuleNotFoundError:
+    # Python <3.11 compat
+    from .thirdparty import tomli as tomllib
+
 
 def loadconfigtable(ui, extname, configtable):
     """update config item known to the ui with the extension ones"""
@@ -104,6 +114,74 @@
         return None
 
 
+def sanitize_item(item):
+    """Apply the transformations that are encoded on top of the pure data"""
+
+    # Set the special defaults
+    default_type_key = "default-type"
+    default_type = item.pop(default_type_key, None)
+    if default_type == "dynamic":
+        item["default"] = dynamicdefault
+    elif default_type == "list_type":
+        item["default"] = list
+    elif default_type == "lambda":
+        assert isinstance(item["default"], list)
+        default = [e.encode() for e in item["default"]]
+        item["default"] = lambda: default
+    elif default_type == "lazy_module":
+        item["default"] = lambda: encoding.encoding
+    else:
+        if default_type is not None:
+            msg = "invalid default config type %r for '%s.%s'"
+            msg %= (default_type, item["section"], item["name"])
+            raise error.ProgrammingError(msg)
+
+    # config expects bytes
+    alias = item.get("alias")
+    if alias:
+        item["alias"] = [(k.encode(), v.encode()) for (k, v) in alias]
+    if isinstance(item.get("default"), str):
+        item["default"] = item["default"].encode()
+    item["section"] = item["section"].encode()
+    item["name"] = item["name"].encode()
+
+
+def read_configitems_file():
+    """Returns the deserialized TOML structure from the configitems file"""
+    with resourceutil.open_resource(b"mercurial", b"configitems.toml") as fp:
+        return tomllib.load(fp)
+
+
+def configitems_from_toml(items):
+    """Register the configitems from the *deserialized* toml file"""
+    for item in items["items"]:
+        sanitize_item(item)
+        coreconfigitem(**item)
+
+    templates = items["templates"]
+
+    for application in items["template-applications"]:
+        template_items = templates[application["template"]]
+
+        for template_item in template_items:
+            item = template_item.copy()
+            prefix = application.get("prefix", "")
+            item["section"] = application["section"]
+            if prefix:
+                item["name"] = f'{prefix}.{item["suffix"]}'
+            else:
+                item["name"] = item["suffix"]
+
+            sanitize_item(item)
+            item.pop("suffix", None)
+            coreconfigitem(**item)
+
+
+def import_configitems_from_file():
+    as_toml = read_configitems_file()
+    configitems_from_toml(as_toml)
+
+
 coreitems = {}
 
 
@@ -131,2844 +209,4 @@
 
 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,
-)
-# which kind of delta to put in the bundled changegroup. Possible value
-# - '': use default behavior
-# - p1: force to always use delta against p1
-# - full: force to always use full content
-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,
-)
-# possible values:
-# - auto (the default)
-# - force-append
-# - force-new
-coreconfigitem(
-    b'devel',
-    b'dirstate.v2.data_update_mode',
-    default="auto",
-)
-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'',
-)
-# This config option is intended for use in tests only. It is a giant
-# footgun to kill security. Don't define it.
-coreconfigitem(
-    b'devel',
-    b'server-insecure-exact-protocol',
-    default=b'',
-)
-coreconfigitem(
-    b'devel',
-    b'serverrequirecert',
-    default=False,
-)
-# Makes the status algorithm wait for the existence of this file
-# (or until a timeout of `devel.sync.status.pre-dirstate-write-file-timeout`
-# seconds) before taking the lock and writing the dirstate.
-# Status signals that it's ready to wait by creating a file
-# with the same name + `.waiting`.
-# Useful when testing race conditions.
-coreconfigitem(
-    b'devel',
-    b'sync.status.pre-dirstate-write-file',
-    default=None,
-)
-coreconfigitem(
-    b'devel',
-    b'sync.status.pre-dirstate-write-file-timeout',
-    default=2,
-)
-coreconfigitem(
-    b'devel',
-    b'sync.dirstate.post-docket-read-file',
-    default=None,
-)
-coreconfigitem(
-    b'devel',
-    b'sync.dirstate.post-docket-read-file-timeout',
-    default=2,
-)
-coreconfigitem(
-    b'devel',
-    b'sync.dirstate.pre-read-file',
-    default=None,
-)
-coreconfigitem(
-    b'devel',
-    b'sync.dirstate.pre-read-file-timeout',
-    default=2,
-)
-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 devel.debug.abort-update is True, then any merge with the working copy,
-# e.g. [hg update], will be aborted after figuring out what needs to be done,
-# but before spawning the parallel worker
-coreconfigitem(
-    b'devel',
-    b'debug.abort-update',
-    default=False,
-)
-# 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=True,
-)
-coreconfigitem(
-    b'experimental',
-    b'changegroup4',
-    default=False,
-)
-
-# might remove rank configuration once the computation has no impact
-coreconfigitem(
-    b'experimental',
-    b'changelog-v2.compute-rank',
-    default=True,
-)
-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.allow-hidden-access',
-    default=list,
-)
-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'stream-v3',
-    default=False,
-)
-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,
-)
-coreconfigitem(
-    b'format',
-    b'use-persistent-nodemap',
-    default=dynamicdefault,
-)
-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'paths',
-    b'.*:pulled-delta-reuse-policy',
-    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=20,
-)
-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,
-)
-# This option is True unless `format.generaldelta` is set.
-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,
-)
+import_configitems_from_file()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mercurial/configitems.toml	Mon Jan 23 18:08:11 2023 +0100
@@ -0,0 +1,2759 @@
+# configitems.toml - centralized declaration of configuration options
+#
+# This file contains declarations of the core Mercurial configuration options.
+#
+# # Structure
+#
+# items: array of config items
+# templates: mapping of template name to template declaration
+# template-applications: array of template applications
+#
+# # Elements
+#
+# ## Item
+#
+# Declares a core Mercurial option.
+#
+# - section: string (required)
+# - name: string (required)
+# - default-type: boolean, changes how `default` is read
+# - default: any
+# - generic: boolean
+# - priority: integer, only if `generic` is true
+# - alias: list of 2-tuples of strings
+# - experimental: boolean
+# - documentation: string
+#
+# ## Template
+#
+# Declares a group of options to be re-used for multiple sections.
+#
+# - all the same fields as `Item`, except `section` and `name`
+# - `suffix` (string, required)
+#
+# ## Template applications
+#
+# Uses a `Template` to instanciate its options in a given section.
+#
+# - template: string (required, must match a `Template` name)
+# - section: string (required)
+
+[[items]]
+section = "alias"
+name = ".*"
+default-type = "dynamic"
+generic = true
+
+[[items]]
+section = "auth"
+name = "cookiefile"
+
+# bookmarks.pushing: internal hack for discovery
+[[items]]
+section = "bookmarks"
+name = "pushing"
+default-type = "list_type"
+
+# bundle.mainreporoot: internal hack for bundlerepo
+[[items]]
+section = "bundle"
+name = "mainreporoot"
+default = ""
+
+[[items]]
+section = "censor"
+name = "policy"
+default = "abort"
+experimental = true
+
+[[items]]
+section = "chgserver"
+name = "idletimeout"
+default = 3600
+
+[[items]]
+section = "chgserver"
+name = "skiphash"
+default = false
+
+[[items]]
+section = "cmdserver"
+name = "log"
+
+[[items]]
+section = "cmdserver"
+name = "max-log-files"
+default = 7
+
+[[items]]
+section = "cmdserver"
+name = "max-log-size"
+default = "1 MB"
+
+[[items]]
+section = "cmdserver"
+name = "max-repo-cache"
+default = 0
+experimental = true
+
+[[items]]
+section = "cmdserver"
+name = "message-encodings"
+default-type = "list_type"
+
+[[items]]
+section = "cmdserver"
+name = "shutdown-on-interrupt"
+default = true
+
+[[items]]
+section = "cmdserver"
+name = "track-log"
+default-type = "lambda"
+default = [ "chgserver", "cmdserver", "repocache",]
+
+[[items]]
+section = "color"
+name = ".*"
+generic = true
+
+[[items]]
+section = "color"
+name = "mode"
+default = "auto"
+
+[[items]]
+section = "color"
+name = "pagermode"
+default-type = "dynamic"
+
+[[items]]
+section = "command-templates"
+name = "graphnode"
+alias = [["ui", "graphnodetemplate"]]
+
+[[items]]
+section = "command-templates"
+name = "log"
+alias = [["ui", "logtemplate"]]
+
+[[items]]
+section = "command-templates"
+name = "mergemarker"
+default = '{node|short} {ifeq(tags, "tip", "", ifeq(tags, "", "", "{tags} "))}{if(bookmarks, "{bookmarks} ")}{ifeq(branch, "default", "", "{branch} ")}- {author|user}: {desc|firstline}'
+alias = [["ui", "mergemarkertemplate"]]
+
+[[items]]
+section = "command-templates"
+name = "oneline-summary"
+
+[[items]]
+section = "command-templates"
+name = "oneline-summary.*"
+default-type = "dynamic"
+generic = true
+
+[[items]]
+section = "command-templates"
+name = "pre-merge-tool-output"
+alias = [["ui", "pre-merge-tool-output-template"]]
+
+[[items]]
+section = "commands"
+name = "commit.post-status"
+default = false
+
+[[items]]
+section = "commands"
+name = "grep.all-files"
+default = false
+experimental = true
+
+[[items]]
+section = "commands"
+name = "merge.require-rev"
+default = false
+
+[[items]]
+section = "commands"
+name = "push.require-revs"
+default = false
+
+# 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.
+[[items]]
+section = "commands"
+name = "rebase.requiredest"
+default = false
+
+[[items]]
+section = "commands"
+name = "resolve.confirm"
+default = false
+
+[[items]]
+section = "commands"
+name = "resolve.explicit-re-merge"
+default = false
+
+[[items]]
+section = "commands"
+name = "resolve.mark-check"
+default = "none"
+
+[[items]]
+section = "commands"
+name = "show.aliasprefix"
+default-type = "list_type"
+
+[[items]]
+section = "commands"
+name = "status.relative"
+default = false
+
+[[items]]
+section = "commands"
+name = "status.skipstates"
+default = []
+experimental = true
+
+[[items]]
+section = "commands"
+name = "status.terse"
+default = ""
+
+[[items]]
+section = "commands"
+name = "status.verbose"
+default = false
+
+[[items]]
+section = "commands"
+name = "update.check"
+
+[[items]]
+section = "commands"
+name = "update.requiredest"
+default = false
+
+[[items]]
+section = "committemplate"
+name = ".*"
+generic = true
+
+[[items]]
+section = "convert"
+name = "bzr.saverev"
+default = true
+
+[[items]]
+section = "convert"
+name = "cvsps.cache"
+default = true
+
+[[items]]
+section = "convert"
+name = "cvsps.fuzz"
+default = 60
+
+[[items]]
+section = "convert"
+name = "cvsps.logencoding"
+
+[[items]]
+section = "convert"
+name = "cvsps.mergefrom"
+
+[[items]]
+section = "convert"
+name = "cvsps.mergeto"
+
+[[items]]
+section = "convert"
+name = "git.committeractions"
+default-type = "lambda"
+default = [ "messagedifferent",]
+
+[[items]]
+section = "convert"
+name = "git.extrakeys"
+default-type = "list_type"
+
+[[items]]
+section = "convert"
+name = "git.findcopiesharder"
+default = false
+
+[[items]]
+section = "convert"
+name = "git.remoteprefix"
+default = "remote"
+
+[[items]]
+section = "convert"
+name = "git.renamelimit"
+default = 400
+
+[[items]]
+section = "convert"
+name = "git.saverev"
+default = true
+
+[[items]]
+section = "convert"
+name = "git.similarity"
+default = 50
+
+[[items]]
+section = "convert"
+name = "git.skipsubmodules"
+default = false
+
+[[items]]
+section = "convert"
+name = "hg.clonebranches"
+default = false
+
+[[items]]
+section = "convert"
+name = "hg.ignoreerrors"
+default = false
+
+[[items]]
+section = "convert"
+name = "hg.preserve-hash"
+default = false
+
+[[items]]
+section = "convert"
+name = "hg.revs"
+
+[[items]]
+section = "convert"
+name = "hg.saverev"
+default = false
+
+[[items]]
+section = "convert"
+name = "hg.sourcename"
+
+[[items]]
+section = "convert"
+name = "hg.startrev"
+
+[[items]]
+section = "convert"
+name = "hg.tagsbranch"
+default = "default"
+
+[[items]]
+section = "convert"
+name = "hg.usebranchnames"
+default = true
+
+[[items]]
+section = "convert"
+name = "ignoreancestorcheck"
+default = false
+experimental = true
+
+[[items]]
+section = "convert"
+name = "localtimezone"
+default = false
+
+[[items]]
+section = "convert"
+name = "p4.encoding"
+default-type = "dynamic"
+
+[[items]]
+section = "convert"
+name = "p4.startrev"
+default = 0
+
+[[items]]
+section = "convert"
+name = "skiptags"
+default = false
+
+[[items]]
+section = "convert"
+name = "svn.branches"
+
+[[items]]
+section = "convert"
+name = "svn.dangerous-set-commit-dates"
+default = false
+
+[[items]]
+section = "convert"
+name = "svn.debugsvnlog"
+default = true
+
+[[items]]
+section = "convert"
+name = "svn.startrev"
+default = 0
+
+[[items]]
+section = "convert"
+name = "svn.tags"
+
+[[items]]
+section = "convert"
+name = "svn.trunk"
+
+[[items]]
+section = "debug"
+name = "bundling-stats"
+default = false
+documentation = "Display extra information about the bundling process."
+
+[[items]]
+section = "debug"
+name = "dirstate.delaywrite"
+default = 0
+
+[[items]]
+section = "debug"
+name = "revlog.debug-delta"
+default = false
+
+[[items]]
+section = "debug"
+name = "revlog.verifyposition.changelog"
+default = ""
+
+[[items]]
+section = "debug"
+name = "unbundling-stats"
+default = false
+documentation = "Display extra information about the unbundling process."
+
+[[items]]
+section = "defaults"
+name = ".*"
+generic = true
+
+[[items]]
+section = "devel"
+name = "all-warnings"
+default = false
+
+[[items]]
+section = "devel"
+name = "bundle.delta"
+default = ""
+
+[[items]]
+section = "devel"
+name = "bundle2.debug"
+default = false
+
+[[items]]
+section = "devel"
+name = "cache-vfs"
+
+[[items]]
+section = "devel"
+name = "check-locks"
+default = false
+
+[[items]]
+section = "devel"
+name = "check-relroot"
+default = false
+
+[[items]]
+section = "devel"
+name = "copy-tracing.multi-thread"
+default = true
+
+# Track copy information for all files, not just "added" ones (very slow)
+[[items]]
+section = "devel"
+name = "copy-tracing.trace-all-files"
+default = false
+
+[[items]]
+section = "devel"
+name = "debug.abort-update"
+default = false
+documentation = """If true, then any merge with the working copy, \
+e.g. [hg update], will be aborted after figuring out what needs to be done, \
+but before spawning the parallel worker."""
+
+[[items]]
+section = "devel"
+name = "debug.copies"
+default = false
+
+[[items]]
+section = "devel"
+name = "debug.extensions"
+default = false
+
+[[items]]
+section = "devel"
+name = "debug.peer-request"
+default = false
+
+[[items]]
+section = "devel"
+name = "debug.repo-filters"
+default = false
+
+[[items]]
+section = "devel"
+name = "default-date"
+
+[[items]]
+section = "devel"
+name = "deprec-warn"
+default = false
+
+# possible values:
+# - auto (the default)
+# - force-append
+# - force-new
+[[items]]
+section = "devel"
+name = "dirstate.v2.data_update_mode"
+default = "auto"
+
+[[items]]
+section = "devel"
+name = "disableloaddefaultcerts"
+default = false
+
+[[items]]
+section = "devel"
+name = "discovery.exchange-heads"
+default = true
+documentation = """If false, the discovery will not start with remote \
+head fetching and local head querying."""
+
+[[items]]
+section = "devel"
+name = "discovery.grow-sample"
+default = true
+documentation = """If false, the sample size used in set discovery \
+will not be increased through the process."""
+
+[[items]]
+section = "devel"
+name = "discovery.grow-sample.dynamic"
+default = true
+documentation = """If 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))`"""
+
+[[items]]
+section = "devel"
+name = "discovery.grow-sample.rate"
+default = 1.05
+documentation = "Controls the rate at which the sample grows."
+
+[[items]]
+section = "devel"
+name = "discovery.randomize"
+default = true
+documentation = """If false, random samplings during discovery are deterministic. \
+It is meant for integration tests."""
+
+[[items]]
+section = "devel"
+name = "discovery.sample-size"
+default = 200
+documentation = "Controls the initial size of the discovery sample."
+
+[[items]]
+section = "devel"
+name = "discovery.sample-size.initial"
+default = 100
+documentation = "Controls the initial size of the discovery for initial change."
+
+[[items]]
+section = "devel"
+name = "legacy.exchange"
+default-type = "list_type"
+
+[[items]]
+section = "devel"
+name = "persistent-nodemap"
+default = false
+documentation = """When true, revlogs use a special reference version of the \
+nodemap, that is not performant but is "known" to behave properly."""
+
+[[items]]
+section = "devel"
+name = "server-insecure-exact-protocol"
+default = ""
+
+[[items]]
+section = "devel"
+name = "servercafile"
+default = ""
+
+[[items]]
+section = "devel"
+name = "serverexactprotocol"
+default = ""
+
+[[items]]
+section = "devel"
+name = "serverrequirecert"
+default = false
+
+[[items]]
+section = "devel"
+name = "strip-obsmarkers"
+default = true
+
+[[items]]
+section = 'devel'
+name = 'sync.status.pre-dirstate-write-file'
+documentation = """
+Makes the status algorithm wait for the existence of this file \
+(or until a timeout of `devel.sync.status.pre-dirstate-write-file-timeout` \
+seconds) before taking the lock and writing the dirstate. \
+Status signals that it's ready to wait by creating a file \
+with the same name + `.waiting`. \
+Useful when testing race conditions."""
+
+[[items]]
+section = 'devel'
+name = 'sync.status.pre-dirstate-write-file-timeout'
+default=2
+
+[[items]]
+section = 'devel'
+name = 'sync.dirstate.post-docket-read-file'
+
+[[items]]
+section = 'devel'
+name = 'sync.dirstate.post-docket-read-file-timeout'
+default=2
+
+[[items]]
+section = 'devel'
+name = 'sync.dirstate.pre-read-file'
+
+[[items]]
+section = 'devel'
+name = 'sync.dirstate.pre-read-file-timeout'
+default=2
+
+[[items]]
+section = "devel"
+name = "user.obsmarker"
+
+[[items]]
+section = "devel"
+name = "warn-config"
+
+[[items]]
+section = "devel"
+name = "warn-config-default"
+
+[[items]]
+section = "devel"
+name = "warn-config-unknown"
+
+[[items]]
+section = "devel"
+name = "warn-empty-changegroup"
+default = false
+
+[[items]]
+section = "diff"
+name = "merge"
+default = false
+experimental = true
+
+[[items]]
+section = "email"
+name = "bcc"
+
+[[items]]
+section = "email"
+name = "cc"
+
+[[items]]
+section = "email"
+name = "charsets"
+default-type = "list_type"
+
+[[items]]
+section = "email"
+name = "from"
+
+[[items]]
+section = "email"
+name = "method"
+default = "smtp"
+
+[[items]]
+section = "email"
+name = "reply-to"
+
+[[items]]
+section = "email"
+name = "to"
+
+[[items]]
+section = "experimental"
+name = "archivemetatemplate"
+default-type = "dynamic"
+
+[[items]]
+section = "experimental"
+name = "auto-publish"
+default = "publish"
+
+[[items]]
+section = "experimental"
+name = "bundle-phases"
+default = false
+
+[[items]]
+section = "experimental"
+name = "bundle2-advertise"
+default = true
+
+[[items]]
+section = "experimental"
+name = "bundle2-output-capture"
+default = false
+
+[[items]]
+section = "experimental"
+name = "bundle2.pushback"
+default = false
+
+[[items]]
+section = "experimental"
+name = "bundle2lazylocking"
+default = false
+
+[[items]]
+section = "experimental"
+name = "bundlecomplevel"
+
+[[items]]
+section = "experimental"
+name = "bundlecomplevel.bzip2"
+
+[[items]]
+section = "experimental"
+name = "bundlecomplevel.gzip"
+
+[[items]]
+section = "experimental"
+name = "bundlecomplevel.none"
+
+[[items]]
+section = "experimental"
+name = "bundlecomplevel.zstd"
+
+[[items]]
+section = "experimental"
+name = "bundlecompthreads"
+
+[[items]]
+section = "experimental"
+name = "bundlecompthreads.bzip2"
+
+[[items]]
+section = "experimental"
+name = "bundlecompthreads.gzip"
+
+[[items]]
+section = "experimental"
+name = "bundlecompthreads.none"
+
+[[items]]
+section = "experimental"
+name = "bundlecompthreads.zstd"
+
+[[items]]
+section = "experimental"
+name = "changegroup3"
+default = true
+
+[[items]]
+section = "experimental"
+name = "changegroup4"
+default = false
+
+# might remove rank configuration once the computation has no impact
+[[items]]
+section = "experimental"
+name = "changelog-v2.compute-rank"
+default = true
+
+[[items]]
+section = "experimental"
+name = "cleanup-as-archived"
+default = false
+
+[[items]]
+section = "experimental"
+name = "clientcompressionengines"
+default-type = "list_type"
+
+[[items]]
+section = "experimental"
+name = "copies.read-from"
+default = "filelog-only"
+
+[[items]]
+section = "experimental"
+name = "copies.write-to"
+default = "filelog-only"
+
+[[items]]
+section = "experimental"
+name = "copytrace"
+default = "on"
+
+[[items]]
+section = "experimental"
+name = "copytrace.movecandidateslimit"
+default = 100
+
+[[items]]
+section = "experimental"
+name = "copytrace.sourcecommitlimit"
+default = 100
+
+[[items]]
+section = "experimental"
+name = "crecordtest"
+
+[[items]]
+section = "experimental"
+name = "directaccess"
+default = false
+
+[[items]]
+section = "experimental"
+name = "directaccess.revnums"
+default = false
+
+[[items]]
+section = "experimental"
+name = "editortmpinhg"
+default = false
+
+[[items]]
+section = "experimental"
+name = "evolution"
+default-type = "list_type"
+
+[[items]]
+section = "experimental"
+name = "evolution.allowdivergence"
+default = false
+alias = [["experimental", "allowdivergence"]]
+
+[[items]]
+section = "experimental"
+name = "evolution.allowunstable"
+
+[[items]]
+section = "experimental"
+name = "evolution.bundle-obsmarker"
+default = false
+
+[[items]]
+section = "experimental"
+name = "evolution.bundle-obsmarker:mandatory"
+default = true
+
+[[items]]
+section = "experimental"
+name = "evolution.createmarkers"
+
+[[items]]
+section = "experimental"
+name = "evolution.effect-flags"
+default = true
+alias = [["experimental", "effect-flags"]]
+
+[[items]]
+section = "experimental"
+name = "evolution.exchange"
+
+[[items]]
+section = "experimental"
+name = "evolution.report-instabilities"
+default = true
+
+[[items]]
+section = "experimental"
+name = "evolution.track-operation"
+default = true
+
+[[items]]
+section = "experimental"
+name = "exportableenviron"
+default-type = "list_type"
+
+[[items]]
+section = "experimental"
+name = "extendedheader.index"
+
+[[items]]
+section = "experimental"
+name = "extendedheader.similarity"
+default = false
+
+[[items]]
+section = "experimental"
+name = "extra-filter-revs"
+documentation = """Repo-level config to prevent a revset from being visible.
+The target use case is to use `share` to expose different subsets of the same \
+repository, especially server side. See also `server.view`."""
+
+[[items]]
+section = "experimental"
+name = "graphshorten"
+default = false
+
+[[items]]
+section = "experimental"
+name = "graphstyle.grandparent"
+default-type = "dynamic"
+
+[[items]]
+section = "experimental"
+name = "graphstyle.missing"
+default-type = "dynamic"
+
+[[items]]
+section = "experimental"
+name = "graphstyle.parent"
+default-type = "dynamic"
+
+[[items]]
+section = "experimental"
+name = "hook-track-tags"
+default = false
+
+[[items]]
+section = "experimental"
+name = "httppostargs"
+default = false
+
+[[items]]
+section = "experimental"
+name = "log.topo"
+default = false
+
+[[items]]
+section = "experimental"
+name = "maxdeltachainspan"
+default = -1
+
+[[items]]
+section = "experimental"
+name = "merge-track-salvaged"
+default = false
+documentation = """Tracks files which were undeleted (merge might delete them \
+but we explicitly kept/undeleted them) and creates new filenodes for them."""
+
+[[items]]
+section = "experimental"
+name = "merge.checkpathconflicts"
+default = false
+
+[[items]]
+section = "experimental"
+name = "mmapindexthreshold"
+
+[[items]]
+section = "experimental"
+name = "narrow"
+default = false
+
+[[items]]
+section = "experimental"
+name = "nointerrupt"
+default = false
+
+[[items]]
+section = "experimental"
+name = "nointerrupt-interactiveonly"
+default = true
+
+[[items]]
+section = "experimental"
+name = "nonnormalparanoidcheck"
+default = false
+
+[[items]]
+section = "experimental"
+name = "obsmarkers-exchange-debug"
+default = false
+
+[[items]]
+section = "experimental"
+name = "rebaseskipobsolete"
+default = true
+
+[[items]]
+section = "experimental"
+name = "remotenames"
+default = false
+
+[[items]]
+section = "experimental"
+name = "removeemptydirs"
+default = true
+
+[[items]]
+section = "experimental"
+name = "revert.interactive.select-to-keep"
+default = false
+
+[[items]]
+section = "experimental"
+name = "revisions.disambiguatewithin"
+
+[[items]]
+section = "experimental"
+name = "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)
+[[items]]
+section = "experimental"
+name = "revlogv2"
+
+[[items]]
+section = "experimental"
+name = "rust.index"
+default = false
+
+[[items]]
+section = "experimental"
+name = "server.allow-hidden-access"
+default-type = "list_type"
+
+[[items]]
+section = "experimental"
+name = "server.filesdata.recommended-batch-size"
+default = 50000
+
+[[items]]
+section = "experimental"
+name = "server.manifestdata.recommended-batch-size"
+default = 100000
+
+[[items]]
+section = "experimental"
+name = "server.stream-narrow-clones"
+default = false
+
+[[items]]
+section = "experimental"
+name = "single-head-per-branch"
+default = false
+
+[[items]]
+section = "experimental"
+name = "single-head-per-branch:account-closed-heads"
+default = false
+
+[[items]]
+section = "experimental"
+name = "single-head-per-branch:public-changes-only"
+default = false
+
+[[items]]
+section = "experimental"
+name = "sparse-read"
+default = false
+
+[[items]]
+section = "experimental"
+name = "sparse-read.density-threshold"
+default = 0.5
+
+[[items]]
+section = "experimental"
+name = "sparse-read.min-gap-size"
+default = "65K"
+
+[[items]]
+section = "experimental"
+name = "stream-v3"
+default = false
+
+[[items]]
+section = "experimental"
+name = "treemanifest"
+default = false
+
+[[items]]
+section = "experimental"
+name = "update.atomic-file"
+default = false
+
+[[items]]
+section = "experimental"
+name = "web.full-garbage-collection-rate"
+default = 1  # still forcing a full collection on each request
+
+[[items]]
+section = "experimental"
+name = "worker.repository-upgrade"
+default = false
+
+[[items]]
+section = "experimental"
+name = "worker.wdir-get-thread-safe"
+default = false
+
+[[items]]
+section = "experimental"
+name = "xdiff"
+default = false
+
+[[items]]
+section = "extdata"
+name = ".*"
+generic = true
+
+[[items]]
+section = "extensions"
+name = "[^:]*"
+generic = true
+
+[[items]]
+section = "extensions"
+name = "[^:]*:required"
+default = false
+generic = true
+
+[[items]]
+section = "format"
+name = "bookmarks-in-store"
+default = false
+
+[[items]]
+section = "format"
+name = "chunkcachesize"
+experimental = true
+
+[[items]]
+section = "format"
+name = "dotencode"
+default = 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.
+[[items]]
+section = "format"
+name = "exp-archived-phase"
+default = false
+experimental = true
+
+# 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
+[[items]]
+section = "format"
+name = "exp-use-changelog-v2"
+experimental = true
+
+[[items]]
+section = "format"
+name = "exp-use-copies-side-data-changeset"
+default = false
+experimental = true
+
+[[items]]
+section = "format"
+name = "generaldelta"
+default = false
+experimental = true
+
+[[items]]
+section = "format"
+name = "manifestcachesize"
+experimental = true
+
+[[items]]
+section = "format"
+name = "maxchainlen"
+default-type = "dynamic"
+experimental = true
+
+[[items]]
+section = "format"
+name = "obsstore-version"
+
+[[items]]
+section = "format"
+name = "revlog-compression"
+default-type = "lambda"
+alias = [["experimental", "format.compression"]]
+default = [ "zstd", "zlib",]
+
+[[items]]
+section = "format"
+name = "sparse-revlog"
+default = true
+
+[[items]]
+section = "format"
+name = "use-dirstate-tracked-hint"
+default = false
+experimental = true
+
+[[items]]
+section = "format"
+name = "use-dirstate-tracked-hint.automatic-upgrade-of-mismatching-repositories"
+default = false
+experimental = true
+
+[[items]]
+section = "format"
+name = "use-dirstate-tracked-hint.automatic-upgrade-of-mismatching-repositories:quiet"
+default = false
+experimental = true
+
+[[items]]
+section = "format"
+name = "use-dirstate-tracked-hint.version"
+default = 1
+experimental = true
+
+[[items]]
+section = "format"
+name = "use-dirstate-v2"
+default = false
+alias = [["format", "exp-rc-dirstate-v2"]]
+experimental = true
+documentation = """Enables dirstate-v2 format *when creating a new repository*.
+Which format to use for existing repos is controlled by `.hg/requires`."""
+
+[[items]]
+section = "format"
+name = "use-dirstate-v2.automatic-upgrade-of-mismatching-repositories"
+default = false
+experimental = true
+
+[[items]]
+section = "format"
+name = "use-dirstate-v2.automatic-upgrade-of-mismatching-repositories:quiet"
+default = false
+experimental = true
+
+# Having 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.
+[[items]]
+section = "format"
+name = "use-internal-phase"
+default = false
+experimental = true
+
+[[items]]
+section = "format"
+name = "use-persistent-nodemap"
+default-type = "dynamic"
+
+[[items]]
+section = "format"
+name = "use-share-safe"
+default = true
+
+[[items]]
+section = "format"
+name = "use-share-safe.automatic-upgrade-of-mismatching-repositories"
+default = false
+experimental = true
+
+[[items]]
+section = "format"
+name = "use-share-safe.automatic-upgrade-of-mismatching-repositories:quiet"
+default = false
+experimental = true
+
+[[items]]
+section = "format"
+name = "usefncache"
+default = true
+
+[[items]]
+section = "format"
+name = "usegeneraldelta"
+default = true
+
+[[items]]
+section = "format"
+name = "usestore"
+default = true
+
+[[items]]
+section = "fsmonitor"
+name = "warn_update_file_count"
+default = 50000
+
+[[items]]
+section = "fsmonitor"
+name = "warn_update_file_count_rust"
+default = 400000
+
+[[items]]
+section = "fsmonitor"
+name = "warn_when_unused"
+default = true
+
+[[items]]
+section = "help"
+name = 'hidden-command\..*'
+default = false
+generic = true
+
+[[items]]
+section = "help"
+name = 'hidden-topic\..*'
+default = false
+generic = true
+
+[[items]]
+section = "hgweb-paths"
+name = ".*"
+default-type = "list_type"
+generic = true
+
+[[items]]
+section = "hooks"
+name = ".*:run-with-plain"
+default = true
+generic = true
+
+[[items]]
+section = "hooks"
+name = "[^:]*"
+default-type = "dynamic"
+generic = true
+
+[[items]]
+section = "hostfingerprints"
+name = ".*"
+default-type = "list_type"
+generic = true
+
+[[items]]
+section = "hostsecurity"
+name = ".*:ciphers$"
+default-type = "dynamic"
+generic = true
+
+[[items]]
+section = "hostsecurity"
+name = ".*:fingerprints$"
+default-type = "list_type"
+generic = true
+
+[[items]]
+section = "hostsecurity"
+name = ".*:minimumprotocol$"
+default-type = "dynamic"
+generic = true
+
+[[items]]
+section = "hostsecurity"
+name = ".*:verifycertsfile$"
+generic = true
+
+[[items]]
+section = "hostsecurity"
+name = "ciphers"
+
+[[items]]
+section = "hostsecurity"
+name = "minimumprotocol"
+default-type = "dynamic"
+
+[[items]]
+section = "http"
+name = "timeout"
+
+[[items]]
+section = "http_proxy"
+name = "always"
+default = false
+
+[[items]]
+section = "http_proxy"
+name = "host"
+
+[[items]]
+section = "http_proxy"
+name = "no"
+default-type = "list_type"
+
+[[items]]
+section = "http_proxy"
+name = "passwd"
+
+[[items]]
+section = "http_proxy"
+name = "user"
+
+[[items]]
+section = "logtoprocess"
+name = "command"
+
+[[items]]
+section = "logtoprocess"
+name = "commandexception"
+
+[[items]]
+section = "logtoprocess"
+name = "commandfinish"
+
+[[items]]
+section = "logtoprocess"
+name = "develwarn"
+
+[[items]]
+section = "logtoprocess"
+name = "uiblocked"
+
+[[items]]
+section = "merge"
+name = "checkignored"
+default = "abort"
+
+[[items]]
+section = "merge"
+name = "checkunknown"
+default = "abort"
+
+[[items]]
+section = "merge"
+name = "disable-partial-tools"
+default = false
+experimental = true
+
+[[items]]
+section = "merge"
+name = "followcopies"
+default = true
+
+[[items]]
+section = "merge"
+name = "on-failure"
+default = "continue"
+
+[[items]]
+section = "merge"
+name = "preferancestor"
+default-type = "lambda"
+default = ["*"]
+experimental = true
+
+[[items]]
+section = "merge"
+name = "strict-capability-check"
+default = false
+
+[[items]]
+section = "merge-tools"
+name = ".*"
+generic = true
+
+[[items]]
+section = "merge-tools"
+name = '.*\.args$'
+default = "$local $base $other"
+generic = true
+priority = -1
+
+[[items]]
+section = "merge-tools"
+name = '.*\.binary$'
+default = false
+generic = true
+priority = -1
+
+[[items]]
+section = "merge-tools"
+name = '.*\.check$'
+default-type = "list_type"
+generic = true
+priority = -1
+
+[[items]]
+section = "merge-tools"
+name = '.*\.checkchanged$'
+default = false
+generic = true
+priority = -1
+
+[[items]]
+section = "merge-tools"
+name = '.*\.executable$'
+default-type = "dynamic"
+generic = true
+priority = -1
+
+[[items]]
+section = "merge-tools"
+name = '.*\.fixeol$'
+default = false
+generic = true
+priority = -1
+
+[[items]]
+section = "merge-tools"
+name = '.*\.gui$'
+default = false
+generic = true
+priority = -1
+
+[[items]]
+section = "merge-tools"
+name = '.*\.mergemarkers$'
+default = "basic"
+generic = true
+priority = -1
+
+[[items]]
+section = "merge-tools"
+name = '.*\.mergemarkertemplate$'  # take from command-templates.mergemarker
+default-type = "dynamic"
+generic = true
+priority = -1
+
+[[items]]
+section = "merge-tools"
+name = '.*\.premerge$'
+default-type = "dynamic"
+generic = true
+priority = -1
+
+[[items]]
+section = "merge-tools"
+name = '.*\.priority$'
+default = 0
+generic = true
+priority = -1
+
+[[items]]
+section = "merge-tools"
+name = '.*\.regappend$'
+default = ""
+generic = true
+priority = -1
+
+[[items]]
+section = "merge-tools"
+name = '.*\.symlink$'
+default = false
+generic = true
+priority = -1
+
+[[items]]
+section = "pager"
+name = "attend-.*"
+default-type = "dynamic"
+generic = true
+
+[[items]]
+section = "pager"
+name = "ignore"
+default-type = "list_type"
+
+[[items]]
+section = "pager"
+name = "pager"
+default-type = "dynamic"
+
+[[items]]
+section = "partial-merge-tools"
+name = ".*"
+generic = true
+experimental = true
+
+[[items]]
+section = "partial-merge-tools"
+name = '.*\.args'
+default = "$local $base $other"
+generic = true
+priority = -1
+experimental = true
+
+[[items]]
+section = "partial-merge-tools"
+name = '.*\.disable'
+default = false
+generic = true
+priority = -1
+experimental = true
+
+[[items]]
+section = "partial-merge-tools"
+name = '.*\.executable$'
+default-type = "dynamic"
+generic = true
+priority = -1
+experimental = true
+
+[[items]]
+section = "partial-merge-tools"
+name = '.*\.order'
+default = 0
+generic = true
+priority = -1
+experimental = true
+
+[[items]]
+section = "partial-merge-tools"
+name = '.*\.patterns'
+default-type = "dynamic"
+generic = true
+priority = -1
+experimental = true
+
+[[items]]
+section = "patch"
+name = "eol"
+default = "strict"
+
+[[items]]
+section = "patch"
+name = "fuzz"
+default = 2
+
+[[items]]
+section = "paths"
+name = "[^:]*"
+generic = true
+
+[[items]]
+section = "paths"
+name = ".*:bookmarks.mode"
+default = "default"
+generic = true
+
+[[items]]
+section = "paths"
+name = ".*:multi-urls"
+default = false
+generic = true
+
+[[items]]
+section = "paths"
+name = ".*:pulled-delta-reuse-policy"
+generic = true
+
+[[items]]
+section = "paths"
+name = ".*:pushrev"
+generic = true
+
+[[items]]
+section = "paths"
+name = ".*:pushurl"
+generic = true
+
+[[items]]
+section = "paths"
+name = "default"
+
+[[items]]
+section = "paths"
+name = "default-push"
+
+[[items]]
+section = "phases"
+name = "checksubrepos"
+default = "follow"
+
+[[items]]
+section = "phases"
+name = "new-commit"
+default = "draft"
+
+[[items]]
+section = "phases"
+name = "publish"
+default = true
+
+[[items]]
+section = "profiling"
+name = "enabled"
+default = false
+
+[[items]]
+section = "profiling"
+name = "format"
+default = "text"
+
+[[items]]
+section = "profiling"
+name = "freq"
+default = 1000
+
+[[items]]
+section = "profiling"
+name = "limit"
+default = 30
+
+[[items]]
+section = "profiling"
+name = "nested"
+default = 0
+
+[[items]]
+section = "profiling"
+name = "output"
+
+[[items]]
+section = "profiling"
+name = "showmax"
+default = 0.999
+
+[[items]]
+section = "profiling"
+name = "showmin"
+default-type = "dynamic"
+
+[[items]]
+section = "profiling"
+name = "showtime"
+default = true
+
+[[items]]
+section = "profiling"
+name = "sort"
+default = "inlinetime"
+
+[[items]]
+section = "profiling"
+name = "statformat"
+default = "hotpath"
+
+[[items]]
+section = "profiling"
+name = "time-track"
+default-type = "dynamic"
+
+[[items]]
+section = "profiling"
+name = "type"
+default = "stat"
+
+[[items]]
+section = "progress"
+name = "assume-tty"
+default = false
+
+[[items]]
+section = "progress"
+name = "changedelay"
+default = 1
+
+[[items]]
+section = "progress"
+name = "clear-complete"
+default = true
+
+[[items]]
+section = "progress"
+name = "debug"
+default = false
+
+[[items]]
+section = "progress"
+name = "delay"
+default = 3
+
+[[items]]
+section = "progress"
+name = "disable"
+default = false
+
+[[items]]
+section = "progress"
+name = "estimateinterval"
+default = 60.0
+
+[[items]]
+section = "progress"
+name = "format"
+default-type = "lambda"
+default = [ "topic", "bar", "number", "estimate",]
+
+[[items]]
+section = "progress"
+name = "refresh"
+default = 0.1
+
+[[items]]
+section = "progress"
+name = "width"
+default-type = "dynamic"
+
+[[items]]
+section = "pull"
+name = "confirm"
+default = false
+
+[[items]]
+section = "push"
+name = "pushvars.server"
+default = false
+
+[[items]]
+section = "rebase"
+name = "experimental.inmemory"
+default = false
+
+[[items]]
+section = "rebase"
+name = "singletransaction"
+default = false
+
+[[items]]
+section = "rebase"
+name = "store-source"
+default = true
+experimental = true
+documentation = """Controls creation of a `rebase_source` extra field during rebase.
+When false, no such field is created. This is useful e.g. 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."""
+
+[[items]]
+section = "rewrite"
+name = "backup-bundle"
+default = true
+alias = [["ui", "history-editing-backup"]]
+
+[[items]]
+section = "rewrite"
+name = "empty-successor"
+default = "skip"
+experimental = true
+
+[[items]]
+section = "rewrite"
+name = "update-timestamp"
+default = false
+
+[[items]]
+section = "server"
+name = "bookmarks-pushkey-compat"
+default = true
+
+[[items]]
+section = "server"
+name = "bundle1"
+default = true
+
+[[items]]
+section = "server"
+name = "bundle1.pull"
+
+[[items]]
+section = "server"
+name = "bundle1.push"
+
+[[items]]
+section = "server"
+name = "bundle1gd"
+
+[[items]]
+section = "server"
+name = "bundle1gd.pull"
+
+[[items]]
+section = "server"
+name = "bundle1gd.push"
+
+[[items]]
+section = "server"
+name = "bundle2.stream"
+default = true
+alias = [["experimental", "bundle2.stream"]]
+
+[[items]]
+section = "server"
+name = "compressionengines"
+default-type = "list_type"
+
+[[items]]
+section = "server"
+name = "concurrent-push-mode"
+default = "check-related"
+
+[[items]]
+section = "server"
+name = "disablefullbundle"
+default = false
+
+[[items]]
+section = "server"
+name = "maxhttpheaderlen"
+default = 1024
+
+[[items]]
+section = "server"
+name = "preferuncompressed"
+default = false
+
+[[items]]
+section = "server"
+name = "pullbundle"
+default = true
+
+[[items]]
+section = "server"
+name = "streamunbundle"
+default = false
+
+[[items]]
+section = "server"
+name = "uncompressed"
+default = true
+
+[[items]]
+section = "server"
+name = "uncompressedallowsecret"
+default = false
+
+[[items]]
+section = "server"
+name = "validate"
+default = false
+
+[[items]]
+section = "server"
+name = "view"
+default = "served"
+
+[[items]]
+section = "server"
+name = "zliblevel"
+default = -1
+
+[[items]]
+section = "server"
+name = "zstdlevel"
+default = 3
+
+[[items]]
+section = "share"
+name = "pool"
+
+[[items]]
+section = "share"
+name = "poolnaming"
+default = "identity"
+
+[[items]]
+section = "share"
+name = "safe-mismatch.source-not-safe"
+default = "abort"
+
+[[items]]
+section = "share"
+name = "safe-mismatch.source-not-safe.warn"
+default = true
+
+[[items]]
+section = "share"
+name = "safe-mismatch.source-not-safe:verbose-upgrade"
+default = true
+
+[[items]]
+section = "share"
+name = "safe-mismatch.source-safe"
+default = "abort"
+
+[[items]]
+section = "share"
+name = "safe-mismatch.source-safe.warn"
+default = true
+
+[[items]]
+section = "share"
+name = "safe-mismatch.source-safe:verbose-upgrade"
+default = true
+
+[[items]]
+section = "shelve"
+name = "maxbackups"
+default = 10
+
+[[items]]
+section = "shelve"
+name = "store"
+default = "internal"
+experimental = true
+
+[[items]]
+section = "smtp"
+name = "host"
+
+[[items]]
+section = "smtp"
+name = "local_hostname"
+
+[[items]]
+section = "smtp"
+name = "password"
+
+[[items]]
+section = "smtp"
+name = "port"
+default-type = "dynamic"
+
+[[items]]
+section = "smtp"
+name = "tls"
+default = "none"
+
+[[items]]
+section = "smtp"
+name = "username"
+
+[[items]]
+section = "sparse"
+name = "missingwarning"
+default = true
+experimental = true
+
+[[items]]
+section = "storage"
+name = "dirstate-v2.slow-path"
+default = "abort"
+experimental = true  # experimental as long as format.use-dirstate-v2 is.
+
+[[items]]
+section = "storage"
+name = "new-repo-backend"
+default = "revlogv1"
+experimental = true
+
+[[items]]
+section = "storage"
+name = "revlog.delta-parent-search.candidate-group-chunk-size"
+default = 20
+
+[[items]]
+section = "storage"
+name = "revlog.issue6528.fix-incoming"
+default = true
+
+[[items]]
+section = "storage"
+name = "revlog.optimize-delta-parent-choice"
+default = true
+alias = [["format", "aggressivemergedeltas"]]
+
+[[items]]
+section = "storage"
+name = "revlog.persistent-nodemap.mmap"
+default = true
+
+[[items]]
+section = "storage"
+name = "revlog.persistent-nodemap.slow-path"
+default = "abort"
+
+[[items]]
+section = "storage"
+name = "revlog.reuse-external-delta"
+default = true
+
+[[items]]
+section = "storage"
+name = "revlog.reuse-external-delta-parent"
+documentation = """This option is true unless `format.generaldelta` is set."""
+
+[[items]]
+section = "storage"
+name = "revlog.zlib.level"
+
+[[items]]
+section = "storage"
+name = "revlog.zstd.level"
+
+[[items]]
+section = "subrepos"
+name = "allowed"
+default-type = "dynamic"  # to make backporting simpler
+
+[[items]]
+section = "subrepos"
+name = "git:allowed"
+default-type = "dynamic"
+
+[[items]]
+section = "subrepos"
+name = "hg:allowed"
+default-type = "dynamic"
+
+[[items]]
+section = "subrepos"
+name = "svn:allowed"
+default-type = "dynamic"
+
+[[items]]
+section = "templateconfig"
+name = ".*"
+default-type = "dynamic"
+generic = true
+
+[[items]]
+section = "templates"
+name = ".*"
+generic = true
+
+[[items]]
+section = "trusted"
+name = "groups"
+default-type = "list_type"
+
+[[items]]
+section = "trusted"
+name = "users"
+default-type = "list_type"
+
+[[items]]
+section = "ui"
+name = "_usedassubrepo"
+default = false
+
+[[items]]
+section = "ui"
+name = "allowemptycommit"
+default = false
+
+[[items]]
+section = "ui"
+name = "archivemeta"
+default = true
+
+[[items]]
+section = "ui"
+name = "askusername"
+default = false
+
+[[items]]
+section = "ui"
+name = "available-memory"
+
+[[items]]
+section = "ui"
+name = "clonebundlefallback"
+default = false
+
+[[items]]
+section = "ui"
+name = "clonebundleprefers"
+default-type = "list_type"
+
+[[items]]
+section = "ui"
+name = "clonebundles"
+default = true
+
+[[items]]
+section = "ui"
+name = "color"
+default = "auto"
+
+[[items]]
+section = "ui"
+name = "commitsubrepos"
+default = false
+
+[[items]]
+section = "ui"
+name = "debug"
+default = false
+
+[[items]]
+section = "ui"
+name = "debugger"
+
+[[items]]
+section = "ui"
+name = "detailed-exit-code"
+default = false
+experimental = true
+
+[[items]]
+section = "ui"
+name = "editor"
+default-type = "dynamic"
+
+[[items]]
+section = "ui"
+name = "fallbackencoding"
+
+[[items]]
+section = "ui"
+name = "forcecwd"
+
+[[items]]
+section = "ui"
+name = "forcemerge"
+
+[[items]]
+section = "ui"
+name = "formatdebug"
+default = false
+
+[[items]]
+section = "ui"
+name = "formatjson"
+default = false
+
+[[items]]
+section = "ui"
+name = "formatted"
+
+[[items]]
+section = "ui"
+name = "interactive"
+
+[[items]]
+section = "ui"
+name = "interface"
+
+[[items]]
+section = "ui"
+name = "interface.chunkselector"
+
+[[items]]
+section = "ui"
+name = "large-file-limit"
+default = 10485760
+
+[[items]]
+section = "ui"
+name = "logblockedtimes"
+default = false
+
+[[items]]
+section = "ui"
+name = "merge"
+
+[[items]]
+section = "ui"
+name = "mergemarkers"
+default = "basic"
+
+[[items]]
+section = "ui"
+name = "message-output"
+default = "stdio"
+
+[[items]]
+section = "ui"
+name = "nontty"
+default = false
+
+[[items]]
+section = "ui"
+name = "origbackuppath"
+
+[[items]]
+section = "ui"
+name = "paginate"
+default = true
+
+[[items]]
+section = "ui"
+name = "patch"
+
+[[items]]
+section = "ui"
+name = "portablefilenames"
+default = "warn"
+
+[[items]]
+section = "ui"
+name = "promptecho"
+default = false
+
+[[items]]
+section = "ui"
+name = "quiet"
+default = false
+
+[[items]]
+section = "ui"
+name = "quietbookmarkmove"
+default = false
+
+[[items]]
+section = "ui"
+name = "relative-paths"
+default = "legacy"
+
+[[items]]
+section = "ui"
+name = "remotecmd"
+default = "hg"
+
+[[items]]
+section = "ui"
+name = "report_untrusted"
+default = true
+
+[[items]]
+section = "ui"
+name = "rollback"
+default = true
+
+[[items]]
+section = "ui"
+name = "signal-safe-lock"
+default = true
+
+[[items]]
+section = "ui"
+name = "slash"
+default = false
+
+[[items]]
+section = "ui"
+name = "ssh"
+default = "ssh"
+
+[[items]]
+section = "ui"
+name = "ssherrorhint"
+
+[[items]]
+section = "ui"
+name = "statuscopies"
+default = false
+
+[[items]]
+section = "ui"
+name = "strict"
+default = false
+
+[[items]]
+section = "ui"
+name = "style"
+default = ""
+
+[[items]]
+section = "ui"
+name = "supportcontact"
+
+[[items]]
+section = "ui"
+name = "textwidth"
+default = 78
+
+[[items]]
+section = "ui"
+name = "timeout"
+default = "600"
+
+[[items]]
+section = "ui"
+name = "timeout.warn"
+default = 0
+
+[[items]]
+section = "ui"
+name = "timestamp-output"
+default = false
+
+[[items]]
+section = "ui"
+name = "traceback"
+default = false
+
+[[items]]
+section = "ui"
+name = "tweakdefaults"
+default = false
+
+[[items]]
+section = "ui"
+name = "username"
+alias = [["ui", "user"]]
+
+[[items]]
+section = "ui"
+name = "verbose"
+default = false
+
+[[items]]
+section = "verify"
+name = "skipflags"
+default = 0
+
+[[items]]
+section = "web"
+name = "accesslog"
+default = "-"
+
+[[items]]
+section = "web"
+name = "address"
+default = ""
+
+[[items]]
+section = "web"
+name = "allow-archive"
+default-type = "list_type"
+alias = [["web", "allow_archive"]]
+
+[[items]]
+section = "web"
+name = "allow-pull"
+default = true
+alias = [["web", "allowpull"]]
+
+[[items]]
+section = "web"
+name = "allow-push"
+default-type = "list_type"
+alias = [["web", "allow_push"]]
+
+[[items]]
+section = "web"
+name = "allow_read"
+default-type = "list_type"
+
+[[items]]
+section = "web"
+name = "allowbz2"
+default = false
+
+[[items]]
+section = "web"
+name = "allowgz"
+default = false
+
+[[items]]
+section = "web"
+name = "allowzip"
+default = false
+
+[[items]]
+section = "web"
+name = "archivesubrepos"
+default = false
+
+[[items]]
+section = "web"
+name = "baseurl"
+
+[[items]]
+section = "web"
+name = "cacerts"
+
+[[items]]
+section = "web"
+name = "cache"
+default = true
+
+[[items]]
+section = "web"
+name = "certificate"
+
+[[items]]
+section = "web"
+name = "collapse"
+default = false
+
+[[items]]
+section = "web"
+name = "comparisoncontext"
+default = 5
+
+[[items]]
+section = "web"
+name = "contact"
+
+[[items]]
+section = "web"
+name = "csp"
+
+[[items]]
+section = "web"
+name = "deny_push"
+default-type = "list_type"
+
+[[items]]
+section = "web"
+name = "deny_read"
+default-type = "list_type"
+
+[[items]]
+section = "web"
+name = "descend"
+default = true
+
+[[items]]
+section = "web"
+name = "description"
+default = ""
+
+[[items]]
+section = "web"
+name = "encoding"
+default-type = "lazy_module"
+default = "encoding.encoding"
+
+[[items]]
+section = "web"
+name = "errorlog"
+default = "-"
+
+[[items]]
+section = "web"
+name = "guessmime"
+default = false
+
+[[items]]
+section = "web"
+name = "hidden"
+default = false
+
+[[items]]
+section = "web"
+name = "ipv6"
+default = false
+
+[[items]]
+section = "web"
+name = "labels"
+default-type = "list_type"
+
+[[items]]
+section = "web"
+name = "logoimg"
+default = "hglogo.png"
+
+[[items]]
+section = "web"
+name = "logourl"
+default = "https://mercurial-scm.org/"
+
+[[items]]
+section = "web"
+name = "maxchanges"
+default = 10
+
+[[items]]
+section = "web"
+name = "maxfiles"
+default = 10
+
+[[items]]
+section = "web"
+name = "maxshortchanges"
+default = 60
+
+[[items]]
+section = "web"
+name = "motd"
+default = ""
+
+[[items]]
+section = "web"
+name = "name"
+default-type = "dynamic"
+
+[[items]]
+section = "web"
+name = "port"
+default = 8000
+
+[[items]]
+section = "web"
+name = "prefix"
+default = ""
+
+[[items]]
+section = "web"
+name = "push_ssl"
+default = true
+
+[[items]]
+section = "web"
+name = "refreshinterval"
+default = 20
+
+[[items]]
+section = "web"
+name = "server-header"
+
+[[items]]
+section = "web"
+name = "static"
+
+[[items]]
+section = "web"
+name = "staticurl"
+
+[[items]]
+section = "web"
+name = "stripes"
+default = 1
+
+[[items]]
+section = "web"
+name = "style"
+default = "paper"
+
+[[items]]
+section = "web"
+name = "templates"
+
+[[items]]
+section = "web"
+name = "view"
+default = "served"
+experimental = true
+
+[[items]]
+section = "worker"
+name = "backgroundclose"
+default-type = "dynamic"
+
+[[items]]
+section = "worker"
+name = "backgroundclosemaxqueue"
+# Windows defaults to a limit of 512 open files. A buffer of 128
+# should give us enough headway.
+default = 384
+
+[[items]]
+section = "worker"
+name = "backgroundcloseminfilecount"
+default = 2048
+
+[[items]]
+section = "worker"
+name = "backgroundclosethreadcount"
+default = 4
+
+[[items]]
+section = "worker"
+name = "enabled"
+default = true
+
+[[items]]
+section = "worker"
+name = "numcpus"
+
+[[template-applications]]
+template = "diff-options"
+section = "annotate"
+
+[[template-applications]]
+template = "diff-options"
+section = "commands"
+prefix = "commit.interactive"
+
+[[template-applications]]
+template = "diff-options"
+section = "commands"
+prefix = "revert.interactive"
+
+[[template-applications]]
+template = "diff-options"
+section = "diff"
+
+[templates]
+[[templates.diff-options]]
+suffix = "nodates"
+default = false
+
+[[templates.diff-options]]
+suffix = "showfunc"
+default = false
+
+[[templates.diff-options]]
+suffix = "unified"
+
+[[templates.diff-options]]
+suffix = "git"
+default = false
+
+[[templates.diff-options]]
+suffix = "ignorews"
+default = false
+
+[[templates.diff-options]]
+suffix = "ignorewsamount"
+default = false
+
+[[templates.diff-options]]
+suffix = "ignoreblanklines"
+default = false
+
+[[templates.diff-options]]
+suffix = "ignorewseol"
+default = false
+
+[[templates.diff-options]]
+suffix = "nobinary"
+default = false
+
+[[templates.diff-options]]
+suffix = "noprefix"
+default = false
+
+[[templates.diff-options]]
+suffix = "word-diff"
+default = false
+
--- a/setup.py	Mon Jan 23 17:11:42 2023 +0100
+++ b/setup.py	Mon Jan 23 18:08:11 2023 +0100
@@ -1644,6 +1644,7 @@
 
 packagedata = {
     'mercurial': [
+        'configitems.toml',
         'locale/*/LC_MESSAGES/hg.mo',
         'dummycert.pem',
     ],