view mercurial/configitems.py @ 38603:44f5acfb9ad2

aggressivemergedeltas: enabled the option by default The option has been around for a while (August 2015) but was never turned on by default. In-depth testing shows large wins for having that on with no significant drawbacks. When enabled, revlog consider delta against both p1 and p2 at the same time when storing a revision. Selecting a delta against "p2" can produce better deltas and chain. This raise large benefit for all repositories, especially if they have a lot of merges. Comparison of `.hg/store/` size: mercurial (6.74% merges): before: 54,225,348 bytes after: 47,279,959 bytes -13% pypy (8.30% merges): before: 459,041,759 bytes after: 346,090,067 bytes -25% netbeans (34.21% merges): before: 2,468,041,333 bytes after: 1,364,077,645 bytes -45% mozilla-central (4.84% merges): before: 2,731,799,546 bytes after: 2,157,718,019 bytes -21% Comparison of `00manifest.d` size: mercurial (6.74% merges): before: 11,682,516 bytes after: 6,143,044 bytes -47% pypy (8.30% merges): before: 156,447,163 bytes after: 52,941,780 bytes -66% netbeans (34.21% merges): before: 1,250,363,851 bytes after: 130,088,982 bytes -90% mozilla-central (4.84% merges): before: 468,202,733 bytes after: 215,096,339 bytes -54% In addition, the better deltas help with the performance of multiple core operations. However, better chains mean longer chains, which can affect performance negatively (mostly manifest revision retrieval time). Chains length is a deeper problem that also affects linear repository too. Overall we think the benefits of using p2 as a diff target are bigger than the downsizes. In addition, we are also working on ways to improve the performance impact of chain length, so theses downsizes get fixed in the future. Below are interesting items from the full benchmark run: bundling 100 revisions from pypy: before: 670ms after: 480ms -28% bundle 10000 revisions from pypy: before: 1.38s after: 1.10s -54% bundle 10000 revisions from pypy: before: 16.1s after: 7.81s -52% bundle 10000 revisions from netbeans: before: 19.3s after: 15.5s -19% unbundle 1000 revisions to pypy: before: 641ms after: 315ms - 51% clone mercurial (http): before: 26.0s after: 22.6s -23% pulling 1000 revisions from pypy (shh): before: 2.07s after: 1.36s -44% pushing 1000 revision through http (pypy repository) before: 2.18s after: 1.35s -48% diff time in mozilla-central: before: 1.420s after: 0.983s -31% status time in mozilla-central: before: 1.260s after: 0.828s -34% Impact in other cases seems minimal (within a couple of percent in worse cases) and can be seen in both direction: Timing for a simple `hg commit`: mozilla-central: before: 3.37s after: 3.22s -4% pypy: before: 194ms after: 197ms +2% Timing for status (from tip to parent of tip): mercurial: before: 52.4ms after: 52.4ms (same) pypy: before: 55.2 after: 56.9 +3% Timing for `hg update` mozilla-central, across 10 revisions: before: 4.82s after: 4.59s -5% mozilla-central, across 10000 revisions: before: 49.1s after: 49.9s +2% pypy, across 10 revisions: before: 213ms after: 216ms +1% pypy, across 10000 revisions: before: 5.31ms after: 5.24ms -1% The negative consequences are related to manifest fetch time: (timing for the tip revision tested by the benchmark) pypy-2018: before: 2.60ms after: 3.88ms +50% mozilla-central-2018: before: 565ms after: 652ms +15% (~+100ms) netbeans-2018: before: 101ms after: 250ms +48% (~+150ms) This shows up as a fixed overhead on some command we benchmarked: no-op push of mozilla-central: before: 945ms after: 1040ms +10% (~+100ms) pushing 10 changeset in netbeabs over ssh: before: 557ms after: 712ms +28% (+155ms) pushing 100 changeset in netbeabs over ssh: before: 592ms after: 771ms +30% (+179ms)
author Paul Morelle <paul.morelle@octobus.net>
date Fri, 22 Jun 2018 01:42:38 +0200
parents a936d1368fc5
children eb8504715071
line wrap: on
line source

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

from __future__ import absolute_import

import functools
import re

from . import (
    encoding,
    error,
)

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

        knownitems.update(items)

class configitem(object):
    """represent a known config item

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

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

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

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

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

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

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

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

        return None

coreitems = {}

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

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

# Registering actual config items

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

coreconfigitem = getitemregister(coreitems)

coreconfigitem('alias', '.*',
    default=dynamicdefault,
    generic=True,
)
coreconfigitem('annotate', 'nodates',
    default=False,
)
coreconfigitem('annotate', 'showfunc',
    default=False,
)
coreconfigitem('annotate', 'unified',
    default=None,
)
coreconfigitem('annotate', 'git',
    default=False,
)
coreconfigitem('annotate', 'ignorews',
    default=False,
)
coreconfigitem('annotate', 'ignorewsamount',
    default=False,
)
coreconfigitem('annotate', 'ignoreblanklines',
    default=False,
)
coreconfigitem('annotate', 'ignorewseol',
    default=False,
)
coreconfigitem('annotate', 'nobinary',
    default=False,
)
coreconfigitem('annotate', 'noprefix',
    default=False,
)
coreconfigitem('annotate', 'word-diff',
    default=False,
)
coreconfigitem('auth', 'cookiefile',
    default=None,
)
# bookmarks.pushing: internal hack for discovery
coreconfigitem('bookmarks', 'pushing',
    default=list,
)
# bundle.mainreporoot: internal hack for bundlerepo
coreconfigitem('bundle', 'mainreporoot',
    default='',
)
# bundle.reorder: experimental config
coreconfigitem('bundle', 'reorder',
    default='auto',
)
coreconfigitem('censor', 'policy',
    default='abort',
)
coreconfigitem('chgserver', 'idletimeout',
    default=3600,
)
coreconfigitem('chgserver', 'skiphash',
    default=False,
)
coreconfigitem('cmdserver', 'log',
    default=None,
)
coreconfigitem('color', '.*',
    default=None,
    generic=True,
)
coreconfigitem('color', 'mode',
    default='auto',
)
coreconfigitem('color', 'pagermode',
    default=dynamicdefault,
)
coreconfigitem('commands', 'show.aliasprefix',
    default=list,
)
coreconfigitem('commands', 'status.relative',
    default=False,
)
coreconfigitem('commands', 'status.skipstates',
    default=[],
)
coreconfigitem('commands', 'status.terse',
    default='',
)
coreconfigitem('commands', 'status.verbose',
    default=False,
)
coreconfigitem('commands', 'update.check',
    default=None,
)
coreconfigitem('commands', 'update.requiredest',
    default=False,
)
coreconfigitem('committemplate', '.*',
    default=None,
    generic=True,
)
coreconfigitem('convert', 'bzr.saverev',
    default=True,
)
coreconfigitem('convert', 'cvsps.cache',
    default=True,
)
coreconfigitem('convert', 'cvsps.fuzz',
    default=60,
)
coreconfigitem('convert', 'cvsps.logencoding',
    default=None,
)
coreconfigitem('convert', 'cvsps.mergefrom',
    default=None,
)
coreconfigitem('convert', 'cvsps.mergeto',
    default=None,
)
coreconfigitem('convert', 'git.committeractions',
    default=lambda: ['messagedifferent'],
)
coreconfigitem('convert', 'git.extrakeys',
    default=list,
)
coreconfigitem('convert', 'git.findcopiesharder',
    default=False,
)
coreconfigitem('convert', 'git.remoteprefix',
    default='remote',
)
coreconfigitem('convert', 'git.renamelimit',
    default=400,
)
coreconfigitem('convert', 'git.saverev',
    default=True,
)
coreconfigitem('convert', 'git.similarity',
    default=50,
)
coreconfigitem('convert', 'git.skipsubmodules',
    default=False,
)
coreconfigitem('convert', 'hg.clonebranches',
    default=False,
)
coreconfigitem('convert', 'hg.ignoreerrors',
    default=False,
)
coreconfigitem('convert', 'hg.revs',
    default=None,
)
coreconfigitem('convert', 'hg.saverev',
    default=False,
)
coreconfigitem('convert', 'hg.sourcename',
    default=None,
)
coreconfigitem('convert', 'hg.startrev',
    default=None,
)
coreconfigitem('convert', 'hg.tagsbranch',
    default='default',
)
coreconfigitem('convert', 'hg.usebranchnames',
    default=True,
)
coreconfigitem('convert', 'ignoreancestorcheck',
    default=False,
)
coreconfigitem('convert', 'localtimezone',
    default=False,
)
coreconfigitem('convert', 'p4.encoding',
    default=dynamicdefault,
)
coreconfigitem('convert', 'p4.startrev',
    default=0,
)
coreconfigitem('convert', 'skiptags',
    default=False,
)
coreconfigitem('convert', 'svn.debugsvnlog',
    default=True,
)
coreconfigitem('convert', 'svn.trunk',
    default=None,
)
coreconfigitem('convert', 'svn.tags',
    default=None,
)
coreconfigitem('convert', 'svn.branches',
    default=None,
)
coreconfigitem('convert', 'svn.startrev',
    default=0,
)
coreconfigitem('debug', 'dirstate.delaywrite',
    default=0,
)
coreconfigitem('defaults', '.*',
    default=None,
    generic=True,
)
coreconfigitem('devel', 'all-warnings',
    default=False,
)
coreconfigitem('devel', 'bundle2.debug',
    default=False,
)
coreconfigitem('devel', 'cache-vfs',
    default=None,
)
coreconfigitem('devel', 'check-locks',
    default=False,
)
coreconfigitem('devel', 'check-relroot',
    default=False,
)
coreconfigitem('devel', 'default-date',
    default=None,
)
coreconfigitem('devel', 'deprec-warn',
    default=False,
)
coreconfigitem('devel', 'disableloaddefaultcerts',
    default=False,
)
coreconfigitem('devel', 'warn-empty-changegroup',
    default=False,
)
coreconfigitem('devel', 'legacy.exchange',
    default=list,
)
coreconfigitem('devel', 'servercafile',
    default='',
)
coreconfigitem('devel', 'serverexactprotocol',
    default='',
)
coreconfigitem('devel', 'serverrequirecert',
    default=False,
)
coreconfigitem('devel', 'strip-obsmarkers',
    default=True,
)
coreconfigitem('devel', 'warn-config',
    default=None,
)
coreconfigitem('devel', 'warn-config-default',
    default=None,
)
coreconfigitem('devel', 'user.obsmarker',
    default=None,
)
coreconfigitem('devel', 'warn-config-unknown',
    default=None,
)
coreconfigitem('devel', 'debug.peer-request',
    default=False,
)
coreconfigitem('diff', 'nodates',
    default=False,
)
coreconfigitem('diff', 'showfunc',
    default=False,
)
coreconfigitem('diff', 'unified',
    default=None,
)
coreconfigitem('diff', 'git',
    default=False,
)
coreconfigitem('diff', 'ignorews',
    default=False,
)
coreconfigitem('diff', 'ignorewsamount',
    default=False,
)
coreconfigitem('diff', 'ignoreblanklines',
    default=False,
)
coreconfigitem('diff', 'ignorewseol',
    default=False,
)
coreconfigitem('diff', 'nobinary',
    default=False,
)
coreconfigitem('diff', 'noprefix',
    default=False,
)
coreconfigitem('diff', 'word-diff',
    default=False,
)
coreconfigitem('email', 'bcc',
    default=None,
)
coreconfigitem('email', 'cc',
    default=None,
)
coreconfigitem('email', 'charsets',
    default=list,
)
coreconfigitem('email', 'from',
    default=None,
)
coreconfigitem('email', 'method',
    default='smtp',
)
coreconfigitem('email', 'reply-to',
    default=None,
)
coreconfigitem('email', 'to',
    default=None,
)
coreconfigitem('experimental', 'archivemetatemplate',
    default=dynamicdefault,
)
coreconfigitem('experimental', 'bundle-phases',
    default=False,
)
coreconfigitem('experimental', 'bundle2-advertise',
    default=True,
)
coreconfigitem('experimental', 'bundle2-output-capture',
    default=False,
)
coreconfigitem('experimental', 'bundle2.pushback',
    default=False,
)
coreconfigitem('experimental', 'bundle2.stream',
    default=False,
)
coreconfigitem('experimental', 'bundle2lazylocking',
    default=False,
)
coreconfigitem('experimental', 'bundlecomplevel',
    default=None,
)
coreconfigitem('experimental', 'bundlecomplevel.bzip2',
    default=None,
)
coreconfigitem('experimental', 'bundlecomplevel.gzip',
    default=None,
)
coreconfigitem('experimental', 'bundlecomplevel.none',
    default=None,
)
coreconfigitem('experimental', 'bundlecomplevel.zstd',
    default=None,
)
coreconfigitem('experimental', 'changegroup3',
    default=False,
)
coreconfigitem('experimental', 'clientcompressionengines',
    default=list,
)
coreconfigitem('experimental', 'copytrace',
    default='on',
)
coreconfigitem('experimental', 'copytrace.movecandidateslimit',
    default=100,
)
coreconfigitem('experimental', 'copytrace.sourcecommitlimit',
    default=100,
)
coreconfigitem('experimental', 'crecordtest',
    default=None,
)
coreconfigitem('experimental', 'directaccess',
    default=False,
)
coreconfigitem('experimental', 'directaccess.revnums',
    default=False,
)
coreconfigitem('experimental', 'editortmpinhg',
    default=False,
)
coreconfigitem('experimental', 'evolution',
    default=list,
)
coreconfigitem('experimental', 'evolution.allowdivergence',
    default=False,
    alias=[('experimental', 'allowdivergence')]
)
coreconfigitem('experimental', 'evolution.allowunstable',
    default=None,
)
coreconfigitem('experimental', 'evolution.createmarkers',
    default=None,
)
coreconfigitem('experimental', 'evolution.effect-flags',
    default=True,
    alias=[('experimental', 'effect-flags')]
)
coreconfigitem('experimental', 'evolution.exchange',
    default=None,
)
coreconfigitem('experimental', 'evolution.bundle-obsmarker',
    default=False,
)
coreconfigitem('experimental', 'evolution.report-instabilities',
    default=True,
)
coreconfigitem('experimental', 'evolution.track-operation',
    default=True,
)
coreconfigitem('experimental', 'maxdeltachainspan',
    default=-1,
)
coreconfigitem('experimental', 'mergetempdirprefix',
    default=None,
)
coreconfigitem('experimental', 'mmapindexthreshold',
    default=None,
)
coreconfigitem('experimental', 'nonnormalparanoidcheck',
    default=False,
)
coreconfigitem('experimental', 'exportableenviron',
    default=list,
)
coreconfigitem('experimental', 'extendedheader.index',
    default=None,
)
coreconfigitem('experimental', 'extendedheader.similarity',
    default=False,
)
coreconfigitem('experimental', 'format.compression',
    default='zlib',
)
coreconfigitem('experimental', 'graphshorten',
    default=False,
)
coreconfigitem('experimental', 'graphstyle.parent',
    default=dynamicdefault,
)
coreconfigitem('experimental', 'graphstyle.missing',
    default=dynamicdefault,
)
coreconfigitem('experimental', 'graphstyle.grandparent',
    default=dynamicdefault,
)
coreconfigitem('experimental', 'hook-track-tags',
    default=False,
)
coreconfigitem('experimental', 'httppeer.advertise-v2',
    default=False,
)
coreconfigitem('experimental', 'httppostargs',
    default=False,
)
coreconfigitem('experimental', 'mergedriver',
    default=None,
)
coreconfigitem('experimental', 'nointerrupt', default=False)
coreconfigitem('experimental', 'nointerrupt-interactiveonly', default=True)

coreconfigitem('experimental', 'obsmarkers-exchange-debug',
    default=False,
)
coreconfigitem('experimental', 'remotenames',
    default=False,
)
coreconfigitem('experimental', 'removeemptydirs',
    default=True,
)
coreconfigitem('experimental', 'revlogv2',
    default=None,
)
coreconfigitem('experimental', 'single-head-per-branch',
    default=False,
)
coreconfigitem('experimental', 'sshserver.support-v2',
    default=False,
)
coreconfigitem('experimental', 'spacemovesdown',
    default=False,
)
coreconfigitem('experimental', 'sparse-read',
    default=False,
)
coreconfigitem('experimental', 'sparse-read.density-threshold',
    default=0.25,
)
coreconfigitem('experimental', 'sparse-read.min-gap-size',
    default='256K',
)
coreconfigitem('experimental', 'treemanifest',
    default=False,
)
coreconfigitem('experimental', 'update.atomic-file',
    default=False,
)
coreconfigitem('experimental', 'sshpeer.advertise-v2',
    default=False,
)
coreconfigitem('experimental', 'web.apiserver',
    default=False,
)
coreconfigitem('experimental', 'web.api.http-v2',
    default=False,
)
coreconfigitem('experimental', 'web.api.debugreflect',
    default=False,
)
coreconfigitem('experimental', 'xdiff',
    default=False,
)
coreconfigitem('extensions', '.*',
    default=None,
    generic=True,
)
coreconfigitem('extdata', '.*',
    default=None,
    generic=True,
)
coreconfigitem('format', 'aggressivemergedeltas',
    default=True,
)
coreconfigitem('format', 'chunkcachesize',
    default=None,
)
coreconfigitem('format', 'dotencode',
    default=True,
)
coreconfigitem('format', 'generaldelta',
    default=False,
)
coreconfigitem('format', 'manifestcachesize',
    default=None,
)
coreconfigitem('format', 'maxchainlen',
    default=None,
)
coreconfigitem('format', 'obsstore-version',
    default=None,
)
coreconfigitem('format', 'usefncache',
    default=True,
)
coreconfigitem('format', 'usegeneraldelta',
    default=True,
)
coreconfigitem('format', 'usestore',
    default=True,
)
coreconfigitem('fsmonitor', 'warn_when_unused',
    default=True,
)
coreconfigitem('fsmonitor', 'warn_update_file_count',
    default=50000,
)
coreconfigitem('hooks', '.*',
    default=dynamicdefault,
    generic=True,
)
coreconfigitem('hgweb-paths', '.*',
    default=list,
    generic=True,
)
coreconfigitem('hostfingerprints', '.*',
    default=list,
    generic=True,
)
coreconfigitem('hostsecurity', 'ciphers',
    default=None,
)
coreconfigitem('hostsecurity', 'disabletls10warning',
    default=False,
)
coreconfigitem('hostsecurity', 'minimumprotocol',
    default=dynamicdefault,
)
coreconfigitem('hostsecurity', '.*:minimumprotocol$',
    default=dynamicdefault,
    generic=True,
)
coreconfigitem('hostsecurity', '.*:ciphers$',
    default=dynamicdefault,
    generic=True,
)
coreconfigitem('hostsecurity', '.*:fingerprints$',
    default=list,
    generic=True,
)
coreconfigitem('hostsecurity', '.*:verifycertsfile$',
    default=None,
    generic=True,
)

coreconfigitem('http_proxy', 'always',
    default=False,
)
coreconfigitem('http_proxy', 'host',
    default=None,
)
coreconfigitem('http_proxy', 'no',
    default=list,
)
coreconfigitem('http_proxy', 'passwd',
    default=None,
)
coreconfigitem('http_proxy', 'user',
    default=None,
)
coreconfigitem('logtoprocess', 'commandexception',
    default=None,
)
coreconfigitem('logtoprocess', 'commandfinish',
    default=None,
)
coreconfigitem('logtoprocess', 'command',
    default=None,
)
coreconfigitem('logtoprocess', 'develwarn',
    default=None,
)
coreconfigitem('logtoprocess', 'uiblocked',
    default=None,
)
coreconfigitem('merge', 'checkunknown',
    default='abort',
)
coreconfigitem('merge', 'checkignored',
    default='abort',
)
coreconfigitem('experimental', 'merge.checkpathconflicts',
    default=False,
)
coreconfigitem('merge', 'followcopies',
    default=True,
)
coreconfigitem('merge', 'on-failure',
    default='continue',
)
coreconfigitem('merge', 'preferancestor',
        default=lambda: ['*'],
)
coreconfigitem('merge-tools', '.*',
    default=None,
    generic=True,
)
coreconfigitem('merge-tools', br'.*\.args$',
    default="$local $base $other",
    generic=True,
    priority=-1,
)
coreconfigitem('merge-tools', br'.*\.binary$',
    default=False,
    generic=True,
    priority=-1,
)
coreconfigitem('merge-tools', br'.*\.check$',
    default=list,
    generic=True,
    priority=-1,
)
coreconfigitem('merge-tools', br'.*\.checkchanged$',
    default=False,
    generic=True,
    priority=-1,
)
coreconfigitem('merge-tools', br'.*\.executable$',
    default=dynamicdefault,
    generic=True,
    priority=-1,
)
coreconfigitem('merge-tools', br'.*\.fixeol$',
    default=False,
    generic=True,
    priority=-1,
)
coreconfigitem('merge-tools', br'.*\.gui$',
    default=False,
    generic=True,
    priority=-1,
)
coreconfigitem('merge-tools', br'.*\.mergemarkers$',
    default='basic',
    generic=True,
    priority=-1,
)
coreconfigitem('merge-tools', br'.*\.mergemarkertemplate$',
    default=dynamicdefault,  # take from ui.mergemarkertemplate
    generic=True,
    priority=-1,
)
coreconfigitem('merge-tools', br'.*\.priority$',
    default=0,
    generic=True,
    priority=-1,
)
coreconfigitem('merge-tools', br'.*\.premerge$',
    default=dynamicdefault,
    generic=True,
    priority=-1,
)
coreconfigitem('merge-tools', br'.*\.symlink$',
    default=False,
    generic=True,
    priority=-1,
)
coreconfigitem('pager', 'attend-.*',
    default=dynamicdefault,
    generic=True,
)
coreconfigitem('pager', 'ignore',
    default=list,
)
coreconfigitem('pager', 'pager',
    default=dynamicdefault,
)
coreconfigitem('patch', 'eol',
    default='strict',
)
coreconfigitem('patch', 'fuzz',
    default=2,
)
coreconfigitem('paths', 'default',
    default=None,
)
coreconfigitem('paths', 'default-push',
    default=None,
)
coreconfigitem('paths', '.*',
    default=None,
    generic=True,
)
coreconfigitem('phases', 'checksubrepos',
    default='follow',
)
coreconfigitem('phases', 'new-commit',
    default='draft',
)
coreconfigitem('phases', 'publish',
    default=True,
)
coreconfigitem('profiling', 'enabled',
    default=False,
)
coreconfigitem('profiling', 'format',
    default='text',
)
coreconfigitem('profiling', 'freq',
    default=1000,
)
coreconfigitem('profiling', 'limit',
    default=30,
)
coreconfigitem('profiling', 'nested',
    default=0,
)
coreconfigitem('profiling', 'output',
    default=None,
)
coreconfigitem('profiling', 'showmax',
    default=0.999,
)
coreconfigitem('profiling', 'showmin',
    default=dynamicdefault,
)
coreconfigitem('profiling', 'sort',
    default='inlinetime',
)
coreconfigitem('profiling', 'statformat',
    default='hotpath',
)
coreconfigitem('profiling', 'time-track',
    default='cpu',
)
coreconfigitem('profiling', 'type',
    default='stat',
)
coreconfigitem('progress', 'assume-tty',
    default=False,
)
coreconfigitem('progress', 'changedelay',
    default=1,
)
coreconfigitem('progress', 'clear-complete',
    default=True,
)
coreconfigitem('progress', 'debug',
    default=False,
)
coreconfigitem('progress', 'delay',
    default=3,
)
coreconfigitem('progress', 'disable',
    default=False,
)
coreconfigitem('progress', 'estimateinterval',
    default=60.0,
)
coreconfigitem('progress', 'format',
    default=lambda: ['topic', 'bar', 'number', 'estimate'],
)
coreconfigitem('progress', 'refresh',
    default=0.1,
)
coreconfigitem('progress', 'width',
    default=dynamicdefault,
)
coreconfigitem('push', 'pushvars.server',
    default=False,
)
coreconfigitem('server', 'bookmarks-pushkey-compat',
    default=True,
)
coreconfigitem('server', 'bundle1',
    default=True,
)
coreconfigitem('server', 'bundle1gd',
    default=None,
)
coreconfigitem('server', 'bundle1.pull',
    default=None,
)
coreconfigitem('server', 'bundle1gd.pull',
    default=None,
)
coreconfigitem('server', 'bundle1.push',
    default=None,
)
coreconfigitem('server', 'bundle1gd.push',
    default=None,
)
coreconfigitem('server', 'compressionengines',
    default=list,
)
coreconfigitem('server', 'concurrent-push-mode',
    default='strict',
)
coreconfigitem('server', 'disablefullbundle',
    default=False,
)
coreconfigitem('server', 'maxhttpheaderlen',
    default=1024,
)
coreconfigitem('server', 'pullbundle',
    default=False,
)
coreconfigitem('server', 'preferuncompressed',
    default=False,
)
coreconfigitem('server', 'streamunbundle',
    default=False,
)
coreconfigitem('server', 'uncompressed',
    default=True,
)
coreconfigitem('server', 'uncompressedallowsecret',
    default=False,
)
coreconfigitem('server', 'validate',
    default=False,
)
coreconfigitem('server', 'zliblevel',
    default=-1,
)
coreconfigitem('server', 'zstdlevel',
    default=3,
)
coreconfigitem('share', 'pool',
    default=None,
)
coreconfigitem('share', 'poolnaming',
    default='identity',
)
coreconfigitem('smtp', 'host',
    default=None,
)
coreconfigitem('smtp', 'local_hostname',
    default=None,
)
coreconfigitem('smtp', 'password',
    default=None,
)
coreconfigitem('smtp', 'port',
    default=dynamicdefault,
)
coreconfigitem('smtp', 'tls',
    default='none',
)
coreconfigitem('smtp', 'username',
    default=None,
)
coreconfigitem('sparse', 'missingwarning',
    default=True,
)
coreconfigitem('subrepos', 'allowed',
    default=dynamicdefault,  # to make backporting simpler
)
coreconfigitem('subrepos', 'hg:allowed',
    default=dynamicdefault,
)
coreconfigitem('subrepos', 'git:allowed',
    default=dynamicdefault,
)
coreconfigitem('subrepos', 'svn:allowed',
    default=dynamicdefault,
)
coreconfigitem('templates', '.*',
    default=None,
    generic=True,
)
coreconfigitem('trusted', 'groups',
    default=list,
)
coreconfigitem('trusted', 'users',
    default=list,
)
coreconfigitem('ui', '_usedassubrepo',
    default=False,
)
coreconfigitem('ui', 'allowemptycommit',
    default=False,
)
coreconfigitem('ui', 'archivemeta',
    default=True,
)
coreconfigitem('ui', 'askusername',
    default=False,
)
coreconfigitem('ui', 'clonebundlefallback',
    default=False,
)
coreconfigitem('ui', 'clonebundleprefers',
    default=list,
)
coreconfigitem('ui', 'clonebundles',
    default=True,
)
coreconfigitem('ui', 'color',
    default='auto',
)
coreconfigitem('ui', 'commitsubrepos',
    default=False,
)
coreconfigitem('ui', 'debug',
    default=False,
)
coreconfigitem('ui', 'debugger',
    default=None,
)
coreconfigitem('ui', 'editor',
    default=dynamicdefault,
)
coreconfigitem('ui', 'fallbackencoding',
    default=None,
)
coreconfigitem('ui', 'forcecwd',
    default=None,
)
coreconfigitem('ui', 'forcemerge',
    default=None,
)
coreconfigitem('ui', 'formatdebug',
    default=False,
)
coreconfigitem('ui', 'formatjson',
    default=False,
)
coreconfigitem('ui', 'formatted',
    default=None,
)
coreconfigitem('ui', 'graphnodetemplate',
    default=None,
)
coreconfigitem('ui', 'interactive',
    default=None,
)
coreconfigitem('ui', 'interface',
    default=None,
)
coreconfigitem('ui', 'interface.chunkselector',
    default=None,
)
coreconfigitem('ui', 'large-file-limit',
    default=10000000,
)
coreconfigitem('ui', 'logblockedtimes',
    default=False,
)
coreconfigitem('ui', 'logtemplate',
    default=None,
)
coreconfigitem('ui', 'merge',
    default=None,
)
coreconfigitem('ui', 'mergemarkers',
    default='basic',
)
coreconfigitem('ui', 'mergemarkertemplate',
    default=('{node|short} '
            '{ifeq(tags, "tip", "", '
            'ifeq(tags, "", "", "{tags} "))}'
            '{if(bookmarks, "{bookmarks} ")}'
            '{ifeq(branch, "default", "", "{branch} ")}'
            '- {author|user}: {desc|firstline}')
)
coreconfigitem('ui', 'nontty',
    default=False,
)
coreconfigitem('ui', 'origbackuppath',
    default=None,
)
coreconfigitem('ui', 'paginate',
    default=True,
)
coreconfigitem('ui', 'patch',
    default=None,
)
coreconfigitem('ui', 'portablefilenames',
    default='warn',
)
coreconfigitem('ui', 'promptecho',
    default=False,
)
coreconfigitem('ui', 'quiet',
    default=False,
)
coreconfigitem('ui', 'quietbookmarkmove',
    default=False,
)
coreconfigitem('ui', 'remotecmd',
    default='hg',
)
coreconfigitem('ui', 'report_untrusted',
    default=True,
)
coreconfigitem('ui', 'rollback',
    default=True,
)
coreconfigitem('ui', 'signal-safe-lock',
    default=True,
)
coreconfigitem('ui', 'slash',
    default=False,
)
coreconfigitem('ui', 'ssh',
    default='ssh',
)
coreconfigitem('ui', 'ssherrorhint',
    default=None,
)
coreconfigitem('ui', 'statuscopies',
    default=False,
)
coreconfigitem('ui', 'strict',
    default=False,
)
coreconfigitem('ui', 'style',
    default='',
)
coreconfigitem('ui', 'supportcontact',
    default=None,
)
coreconfigitem('ui', 'textwidth',
    default=78,
)
coreconfigitem('ui', 'timeout',
    default='600',
)
coreconfigitem('ui', 'timeout.warn',
    default=0,
)
coreconfigitem('ui', 'traceback',
    default=False,
)
coreconfigitem('ui', 'tweakdefaults',
    default=False,
)
coreconfigitem('ui', 'username',
    alias=[('ui', 'user')]
)
coreconfigitem('ui', 'verbose',
    default=False,
)
coreconfigitem('verify', 'skipflags',
    default=None,
)
coreconfigitem('web', 'allowbz2',
    default=False,
)
coreconfigitem('web', 'allowgz',
    default=False,
)
coreconfigitem('web', 'allow-pull',
    alias=[('web', 'allowpull')],
    default=True,
)
coreconfigitem('web', 'allow-push',
    alias=[('web', 'allow_push')],
    default=list,
)
coreconfigitem('web', 'allowzip',
    default=False,
)
coreconfigitem('web', 'archivesubrepos',
    default=False,
)
coreconfigitem('web', 'cache',
    default=True,
)
coreconfigitem('web', 'contact',
    default=None,
)
coreconfigitem('web', 'deny_push',
    default=list,
)
coreconfigitem('web', 'guessmime',
    default=False,
)
coreconfigitem('web', 'hidden',
    default=False,
)
coreconfigitem('web', 'labels',
    default=list,
)
coreconfigitem('web', 'logoimg',
    default='hglogo.png',
)
coreconfigitem('web', 'logourl',
    default='https://mercurial-scm.org/',
)
coreconfigitem('web', 'accesslog',
    default='-',
)
coreconfigitem('web', 'address',
    default='',
)
coreconfigitem('web', 'allow-archive',
    alias=[('web', 'allow_archive')],
    default=list,
)
coreconfigitem('web', 'allow_read',
    default=list,
)
coreconfigitem('web', 'baseurl',
    default=None,
)
coreconfigitem('web', 'cacerts',
    default=None,
)
coreconfigitem('web', 'certificate',
    default=None,
)
coreconfigitem('web', 'collapse',
    default=False,
)
coreconfigitem('web', 'csp',
    default=None,
)
coreconfigitem('web', 'deny_read',
    default=list,
)
coreconfigitem('web', 'descend',
    default=True,
)
coreconfigitem('web', 'description',
    default="",
)
coreconfigitem('web', 'encoding',
    default=lambda: encoding.encoding,
)
coreconfigitem('web', 'errorlog',
    default='-',
)
coreconfigitem('web', 'ipv6',
    default=False,
)
coreconfigitem('web', 'maxchanges',
    default=10,
)
coreconfigitem('web', 'maxfiles',
    default=10,
)
coreconfigitem('web', 'maxshortchanges',
    default=60,
)
coreconfigitem('web', 'motd',
    default='',
)
coreconfigitem('web', 'name',
    default=dynamicdefault,
)
coreconfigitem('web', 'port',
    default=8000,
)
coreconfigitem('web', 'prefix',
    default='',
)
coreconfigitem('web', 'push_ssl',
    default=True,
)
coreconfigitem('web', 'refreshinterval',
    default=20,
)
coreconfigitem('web', 'server-header',
    default=None,
)
coreconfigitem('web', 'staticurl',
    default=None,
)
coreconfigitem('web', 'stripes',
    default=1,
)
coreconfigitem('web', 'style',
    default='paper',
)
coreconfigitem('web', 'templates',
    default=None,
)
coreconfigitem('web', 'view',
    default='served',
)
coreconfigitem('worker', 'backgroundclose',
    default=dynamicdefault,
)
# Windows defaults to a limit of 512 open files. A buffer of 128
# should give us enough headway.
coreconfigitem('worker', 'backgroundclosemaxqueue',
    default=384,
)
coreconfigitem('worker', 'backgroundcloseminfilecount',
    default=2048,
)
coreconfigitem('worker', 'backgroundclosethreadcount',
    default=4,
)
coreconfigitem('worker', 'enabled',
    default=True,
)
coreconfigitem('worker', '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('commands', 'rebase.requiredest',
            default=False,
)
coreconfigitem('experimental', 'rebaseskipobsolete',
    default=True,
)
coreconfigitem('rebase', 'singletransaction',
    default=False,
)
coreconfigitem('rebase', 'experimental.inmemory',
    default=False,
)