mercurial/config.py
author Martin von Zweigbergk <martinvonz@google.com>
Fri, 20 Nov 2020 14:43:21 -0800
changeset 45909 9dc1351d0b5f
parent 45800 0883413e09bc
child 45957 89a2afe31e82
permissions -rw-r--r--
errors: raise ConfigError on failure to parse config file This replaces two raises of `ParseError` by `ConfigError`, which makes it so we get the desired exit code when `ui.detailed-exit-code` is enabled. Because the exceptions include a location, I had to add that to `ConfigError` as well. I considered making `ConfigError` a subclass of `ParseError`, but it doesn't feel like it quite passes the "is-a" test. I used "config error: " as prefix for these errors instead of the previous "hg: parse error: ", which seems a little less accurate now (and, as I've said before, I don't know what the "hg: " part is supposed to signify anyway). I can easily be convinced to change the prefix to something else (including "abort: "). Some of the exceptions raised here mean that we fail to even load the `ui` object in the `dispatch` module. When that happens, we don't know to use detailed exit codes, so some tests (e.g. `test-hgrc.t`) still see exit code 255. I'll try to get back to that later. It should be possible to give detailed exit codes if at least part of the config can be read (e.g. when the system-wide one enables detailed exit codes and the user's config fails to parse). Differential Revision: https://phab.mercurial-scm.org/D9355
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
8229
ddf3d6656e7c config: add copyright and license header
Martin Geisler <mg@lazybytes.net>
parents: 8222
diff changeset
     1
# config.py - configuration parsing for Mercurial
ddf3d6656e7c config: add copyright and license header
Martin Geisler <mg@lazybytes.net>
parents: 8222
diff changeset
     2
#
ddf3d6656e7c config: add copyright and license header
Martin Geisler <mg@lazybytes.net>
parents: 8222
diff changeset
     3
#  Copyright 2009 Matt Mackall <mpm@selenic.com> and others
ddf3d6656e7c config: add copyright and license header
Martin Geisler <mg@lazybytes.net>
parents: 8222
diff changeset
     4
#
ddf3d6656e7c config: add copyright and license header
Martin Geisler <mg@lazybytes.net>
parents: 8222
diff changeset
     5
# This software may be used and distributed according to the terms of the
10263
25e572394f5c Update license to GPLv2+
Matt Mackall <mpm@selenic.com>
parents: 10042
diff changeset
     6
# GNU General Public License version 2 or any later version.
8229
ddf3d6656e7c config: add copyright and license header
Martin Geisler <mg@lazybytes.net>
parents: 8222
diff changeset
     7
25923
a027a0813b44 config: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
     8
from __future__ import absolute_import
a027a0813b44 config: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
     9
a027a0813b44 config: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
    10
import errno
a027a0813b44 config: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
    11
import os
a027a0813b44 config: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
    12
a027a0813b44 config: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
    13
from .i18n import _
43089
c59eb1560c44 py3: manually import getattr where it is needed
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43077
diff changeset
    14
from .pycompat import getattr
25923
a027a0813b44 config: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
    15
from . import (
43276
d201a637c971 py3: encode underlying error message during parse error of %include
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 43106
diff changeset
    16
    encoding,
25923
a027a0813b44 config: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
    17
    error,
31315
c920efa9d34b config: guard against setconfig specifying unicode values on py3
Augie Fackler <raf@durin42.com>
parents: 31186
diff changeset
    18
    pycompat,
25923
a027a0813b44 config: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
    19
    util,
a027a0813b44 config: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
    20
)
8144
fca54469480e ui: introduce new config parser
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    21
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41342
diff changeset
    22
8186
6a0018cdb2fe config: add some helper methods
Matt Mackall <mpm@selenic.com>
parents: 8185
diff changeset
    23
class config(object):
45278
3f54242781e9 config: remove now-unused support for "includepaths"
Martin von Zweigbergk <martinvonz@google.com>
parents: 45244
diff changeset
    24
    def __init__(self, data=None):
8144
fca54469480e ui: introduce new config parser
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    25
        self._data = {}
19087
7d82ad4b3727 config: discard "%unset" values defined in the other files read in previously
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 17537
diff changeset
    26
        self._unset = []
8144
fca54469480e ui: introduce new config parser
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    27
        if data:
fca54469480e ui: introduce new config parser
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    28
            for k in data._data:
fca54469480e ui: introduce new config parser
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    29
                self._data[k] = data[k].copy()
8185
dc10a7a3f1d4 config: split source data out into separate map
Matt Mackall <mpm@selenic.com>
parents: 8184
diff changeset
    30
            self._source = data._source.copy()
34358
c41444a39de2 config: use copy-on-write to improve copy performance
Jun Wu <quark@fb.com>
parents: 34146
diff changeset
    31
        else:
c41444a39de2 config: use copy-on-write to improve copy performance
Jun Wu <quark@fb.com>
parents: 34146
diff changeset
    32
            self._source = util.cowdict()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41342
diff changeset
    33
8144
fca54469480e ui: introduce new config parser
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    34
    def copy(self):
fca54469480e ui: introduce new config parser
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    35
        return config(self)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41342
diff changeset
    36
8144
fca54469480e ui: introduce new config parser
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    37
    def __contains__(self, section):
fca54469480e ui: introduce new config parser
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    38
        return section in self._data
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41342
diff changeset
    39
27696
e70c97cc9243 config: add hasconfig method and supporting plumbing
Bryan O'Sullivan <bos@serpentine.com>
parents: 25923
diff changeset
    40
    def hasitem(self, section, item):
e70c97cc9243 config: add hasconfig method and supporting plumbing
Bryan O'Sullivan <bos@serpentine.com>
parents: 25923
diff changeset
    41
        return item in self._data.get(section, {})
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41342
diff changeset
    42
8186
6a0018cdb2fe config: add some helper methods
Matt Mackall <mpm@selenic.com>
parents: 8185
diff changeset
    43
    def __getitem__(self, section):
6a0018cdb2fe config: add some helper methods
Matt Mackall <mpm@selenic.com>
parents: 8185
diff changeset
    44
        return self._data.get(section, {})
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41342
diff changeset
    45
8186
6a0018cdb2fe config: add some helper methods
Matt Mackall <mpm@selenic.com>
parents: 8185
diff changeset
    46
    def __iter__(self):
6a0018cdb2fe config: add some helper methods
Matt Mackall <mpm@selenic.com>
parents: 8185
diff changeset
    47
        for d in self.sections():
6a0018cdb2fe config: add some helper methods
Matt Mackall <mpm@selenic.com>
parents: 8185
diff changeset
    48
            yield d
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41342
diff changeset
    49
8193
94246e90081e config: add section filter to read
Matt Mackall <mpm@selenic.com>
parents: 8192
diff changeset
    50
    def update(self, src):
34358
c41444a39de2 config: use copy-on-write to improve copy performance
Jun Wu <quark@fb.com>
parents: 34146
diff changeset
    51
        self._source = self._source.preparewrite()
19087
7d82ad4b3727 config: discard "%unset" values defined in the other files read in previously
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 17537
diff changeset
    52
        for s, n in src._unset:
34358
c41444a39de2 config: use copy-on-write to improve copy performance
Jun Wu <quark@fb.com>
parents: 34146
diff changeset
    53
            ds = self._data.get(s, None)
c41444a39de2 config: use copy-on-write to improve copy performance
Jun Wu <quark@fb.com>
parents: 34146
diff changeset
    54
            if ds is not None and n in ds:
c41444a39de2 config: use copy-on-write to improve copy performance
Jun Wu <quark@fb.com>
parents: 34146
diff changeset
    55
                self._data[s] = ds.preparewrite()
19087
7d82ad4b3727 config: discard "%unset" values defined in the other files read in previously
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 17537
diff changeset
    56
                del self._data[s][n]
7d82ad4b3727 config: discard "%unset" values defined in the other files read in previously
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 17537
diff changeset
    57
                del self._source[(s, n)]
8193
94246e90081e config: add section filter to read
Matt Mackall <mpm@selenic.com>
parents: 8192
diff changeset
    58
        for s in src:
34358
c41444a39de2 config: use copy-on-write to improve copy performance
Jun Wu <quark@fb.com>
parents: 34146
diff changeset
    59
            ds = self._data.get(s, None)
c41444a39de2 config: use copy-on-write to improve copy performance
Jun Wu <quark@fb.com>
parents: 34146
diff changeset
    60
            if ds:
c41444a39de2 config: use copy-on-write to improve copy performance
Jun Wu <quark@fb.com>
parents: 34146
diff changeset
    61
                self._data[s] = ds.preparewrite()
c41444a39de2 config: use copy-on-write to improve copy performance
Jun Wu <quark@fb.com>
parents: 34146
diff changeset
    62
            else:
c41444a39de2 config: use copy-on-write to improve copy performance
Jun Wu <quark@fb.com>
parents: 34146
diff changeset
    63
                self._data[s] = util.cowsortdict()
8193
94246e90081e config: add section filter to read
Matt Mackall <mpm@selenic.com>
parents: 8192
diff changeset
    64
            self._data[s].update(src._data[s])
94246e90081e config: add section filter to read
Matt Mackall <mpm@selenic.com>
parents: 8192
diff changeset
    65
        self._source.update(src._source)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41342
diff changeset
    66
8144
fca54469480e ui: introduce new config parser
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    67
    def get(self, section, item, default=None):
8185
dc10a7a3f1d4 config: split source data out into separate map
Matt Mackall <mpm@selenic.com>
parents: 8184
diff changeset
    68
        return self._data.get(section, {}).get(item, default)
15919
69e792cf7851 config: have a way to backup and restore value in config
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 14696
diff changeset
    69
69e792cf7851 config: have a way to backup and restore value in config
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 14696
diff changeset
    70
    def backup(self, section, item):
17527
6e11d5cf8e39 spelling: value
timeless@mozdev.org
parents: 16944
diff changeset
    71
        """return a tuple allowing restore to reinstall a previous value
15919
69e792cf7851 config: have a way to backup and restore value in config
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 14696
diff changeset
    72
17530
0dff04ffa15d grammar: it-handles
timeless@mozdev.org
parents: 17527
diff changeset
    73
        The main reason we need it is because it handles the "no data" case.
15919
69e792cf7851 config: have a way to backup and restore value in config
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 14696
diff changeset
    74
        """
69e792cf7851 config: have a way to backup and restore value in config
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 14696
diff changeset
    75
        try:
69e792cf7851 config: have a way to backup and restore value in config
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 14696
diff changeset
    76
            value = self._data[section][item]
69e792cf7851 config: have a way to backup and restore value in config
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 14696
diff changeset
    77
            source = self.source(section, item)
69e792cf7851 config: have a way to backup and restore value in config
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 14696
diff changeset
    78
            return (section, item, value, source)
69e792cf7851 config: have a way to backup and restore value in config
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 14696
diff changeset
    79
        except KeyError:
69e792cf7851 config: have a way to backup and restore value in config
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 14696
diff changeset
    80
            return (section, item)
69e792cf7851 config: have a way to backup and restore value in config
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 14696
diff changeset
    81
8198
cf9accffd0b3 config: getsource -> source
Matt Mackall <mpm@selenic.com>
parents: 8193
diff changeset
    82
    def source(self, section, item):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    83
        return self._source.get((section, item), b"")
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41342
diff changeset
    84
8144
fca54469480e ui: introduce new config parser
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    85
    def sections(self):
fca54469480e ui: introduce new config parser
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    86
        return sorted(self._data.keys())
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41342
diff changeset
    87
8144
fca54469480e ui: introduce new config parser
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    88
    def items(self, section):
43106
d783f945a701 py3: finish porting iteritems() to pycompat and remove source transformer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43089
diff changeset
    89
        return list(pycompat.iteritems(self._data.get(section, {})))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41342
diff changeset
    90
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    91
    def set(self, section, item, value, source=b""):
31315
c920efa9d34b config: guard against setconfig specifying unicode values on py3
Augie Fackler <raf@durin42.com>
parents: 31186
diff changeset
    92
        if pycompat.ispy3:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41342
diff changeset
    93
            assert not isinstance(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41342
diff changeset
    94
                section, str
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    95
            ), b'config section may not be unicode strings on Python 3'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41342
diff changeset
    96
            assert not isinstance(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41342
diff changeset
    97
                item, str
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    98
            ), b'config item may not be unicode strings on Python 3'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41342
diff changeset
    99
            assert not isinstance(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41342
diff changeset
   100
                value, str
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   101
            ), b'config values may not be unicode strings on Python 3'
8144
fca54469480e ui: introduce new config parser
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   102
        if section not in self:
34358
c41444a39de2 config: use copy-on-write to improve copy performance
Jun Wu <quark@fb.com>
parents: 34146
diff changeset
   103
            self._data[section] = util.cowsortdict()
c41444a39de2 config: use copy-on-write to improve copy performance
Jun Wu <quark@fb.com>
parents: 34146
diff changeset
   104
        else:
c41444a39de2 config: use copy-on-write to improve copy performance
Jun Wu <quark@fb.com>
parents: 34146
diff changeset
   105
            self._data[section] = self._data[section].preparewrite()
8185
dc10a7a3f1d4 config: split source data out into separate map
Matt Mackall <mpm@selenic.com>
parents: 8184
diff changeset
   106
        self._data[section][item] = value
20789
d19c9bdbbf35 config: don't set source when no source is specified - don't overwrite with ''
Mads Kiilerich <madski@unity3d.com>
parents: 19087
diff changeset
   107
        if source:
34358
c41444a39de2 config: use copy-on-write to improve copy performance
Jun Wu <quark@fb.com>
parents: 34146
diff changeset
   108
            self._source = self._source.preparewrite()
20789
d19c9bdbbf35 config: don't set source when no source is specified - don't overwrite with ''
Mads Kiilerich <madski@unity3d.com>
parents: 19087
diff changeset
   109
            self._source[(section, item)] = source
8144
fca54469480e ui: introduce new config parser
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   110
15919
69e792cf7851 config: have a way to backup and restore value in config
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 14696
diff changeset
   111
    def restore(self, data):
69e792cf7851 config: have a way to backup and restore value in config
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 14696
diff changeset
   112
        """restore data returned by self.backup"""
34358
c41444a39de2 config: use copy-on-write to improve copy performance
Jun Wu <quark@fb.com>
parents: 34146
diff changeset
   113
        self._source = self._source.preparewrite()
15919
69e792cf7851 config: have a way to backup and restore value in config
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 14696
diff changeset
   114
        if len(data) == 4:
69e792cf7851 config: have a way to backup and restore value in config
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 14696
diff changeset
   115
            # restore old data
69e792cf7851 config: have a way to backup and restore value in config
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 14696
diff changeset
   116
            section, item, value, source = data
34358
c41444a39de2 config: use copy-on-write to improve copy performance
Jun Wu <quark@fb.com>
parents: 34146
diff changeset
   117
            self._data[section] = self._data[section].preparewrite()
15919
69e792cf7851 config: have a way to backup and restore value in config
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 14696
diff changeset
   118
            self._data[section][item] = value
69e792cf7851 config: have a way to backup and restore value in config
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 14696
diff changeset
   119
            self._source[(section, item)] = source
69e792cf7851 config: have a way to backup and restore value in config
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 14696
diff changeset
   120
        else:
69e792cf7851 config: have a way to backup and restore value in config
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 14696
diff changeset
   121
            # no data before, remove everything
69e792cf7851 config: have a way to backup and restore value in config
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 14696
diff changeset
   122
            section, item = data
69e792cf7851 config: have a way to backup and restore value in config
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 14696
diff changeset
   123
            if section in self._data:
22037
8665c647da6e config: fix restoreconfig of non existing config
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21910
diff changeset
   124
                self._data[section].pop(item, None)
15919
69e792cf7851 config: have a way to backup and restore value in config
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 14696
diff changeset
   125
            self._source.pop((section, item), None)
69e792cf7851 config: have a way to backup and restore value in config
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 14696
diff changeset
   126
8265
52c5be55af82 config: add parse interface
Matt Mackall <mpm@selenic.com>
parents: 8263
diff changeset
   127
    def parse(self, src, data, sections=None, remap=None, include=None):
30359
954002426f78 config: mark parser regexes as bytes explicitly
Augie Fackler <augie@google.com>
parents: 27696
diff changeset
   128
        sectionre = util.re.compile(br'\[([^\[]+)\]')
954002426f78 config: mark parser regexes as bytes explicitly
Augie Fackler <augie@google.com>
parents: 27696
diff changeset
   129
        itemre = util.re.compile(br'([^=\s][^=]*?)\s*=\s*(.*\S|)')
954002426f78 config: mark parser regexes as bytes explicitly
Augie Fackler <augie@google.com>
parents: 27696
diff changeset
   130
        contre = util.re.compile(br'\s+(\S|\S.*\S)\s*$')
954002426f78 config: mark parser regexes as bytes explicitly
Augie Fackler <augie@google.com>
parents: 27696
diff changeset
   131
        emptyre = util.re.compile(br'(;|#|\s*$)')
954002426f78 config: mark parser regexes as bytes explicitly
Augie Fackler <augie@google.com>
parents: 27696
diff changeset
   132
        commentre = util.re.compile(br'(;|#)')
954002426f78 config: mark parser regexes as bytes explicitly
Augie Fackler <augie@google.com>
parents: 27696
diff changeset
   133
        unsetre = util.re.compile(br'%unset\s+(\S+)')
954002426f78 config: mark parser regexes as bytes explicitly
Augie Fackler <augie@google.com>
parents: 27696
diff changeset
   134
        includere = util.re.compile(br'%include\s+(\S|\S.*\S)\s*$')
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   135
        section = b""
8144
fca54469480e ui: introduce new config parser
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   136
        item = None
fca54469480e ui: introduce new config parser
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   137
        line = 0
9339
9be91129c96e config: improve code readability
Andrey <py4fun@gmail.com>
parents: 9136
diff changeset
   138
        cont = False
8180
6fc30fe7f3e7 hgweb: use config.config
Matt Mackall <mpm@selenic.com>
parents: 8144
diff changeset
   139
34713
e5a2cfc524d4 config: allow remapping the default section
Yuya Nishihara <yuya@tcha.org>
parents: 34455
diff changeset
   140
        if remap:
e5a2cfc524d4 config: allow remapping the default section
Yuya Nishihara <yuya@tcha.org>
parents: 34455
diff changeset
   141
            section = remap.get(section, section)
e5a2cfc524d4 config: allow remapping the default section
Yuya Nishihara <yuya@tcha.org>
parents: 34455
diff changeset
   142
9136
31177742f54a for calls expecting bool args, pass bool instead of int
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 8312
diff changeset
   143
        for l in data.splitlines(True):
8144
fca54469480e ui: introduce new config parser
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   144
            line += 1
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   145
            if line == 1 and l.startswith(b'\xef\xbb\xbf'):
16348
f350021ee32e config: discard UTF-8 BOM if found
Matt Mackall <mpm@selenic.com>
parents: 15919
diff changeset
   146
                # Someone set us up the BOM
f350021ee32e config: discard UTF-8 BOM if found
Matt Mackall <mpm@selenic.com>
parents: 15919
diff changeset
   147
                l = l[3:]
8144
fca54469480e ui: introduce new config parser
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   148
            if cont:
14642
fdcdb221a922 config: handle comment lines in continuations (issue2854)
Matt Mackall <mpm@selenic.com>
parents: 14486
diff changeset
   149
                if commentre.match(l):
fdcdb221a922 config: handle comment lines in continuations (issue2854)
Matt Mackall <mpm@selenic.com>
parents: 14486
diff changeset
   150
                    continue
8144
fca54469480e ui: introduce new config parser
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   151
                m = contre.match(l)
fca54469480e ui: introduce new config parser
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   152
                if m:
8193
94246e90081e config: add section filter to read
Matt Mackall <mpm@selenic.com>
parents: 8192
diff changeset
   153
                    if sections and section not in sections:
94246e90081e config: add section filter to read
Matt Mackall <mpm@selenic.com>
parents: 8192
diff changeset
   154
                        continue
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   155
                    v = self.get(section, item) + b"\n" + m.group(1)
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   156
                    self.set(section, item, v, b"%s:%d" % (src, line))
8144
fca54469480e ui: introduce new config parser
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   157
                    continue
fca54469480e ui: introduce new config parser
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   158
                item = None
9469
7f0f882af23d config: abort on indented non-continuation lines (issue1829)
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 8312
diff changeset
   159
                cont = False
8183
2858ab754995 config: allow including other config files
Matt Mackall <mpm@selenic.com>
parents: 8180
diff changeset
   160
            m = includere.match(l)
25095
3182965b3971 config: give it an includepaths option for looking for config files
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 22419
diff changeset
   161
3182965b3971 config: give it an includepaths option for looking for config files
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 22419
diff changeset
   162
            if m and include:
3182965b3971 config: give it an includepaths option for looking for config files
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 22419
diff changeset
   163
                expanded = util.expandpath(m.group(1))
45278
3f54242781e9 config: remove now-unused support for "includepaths"
Martin von Zweigbergk <martinvonz@google.com>
parents: 45244
diff changeset
   164
                try:
45281
668af67bfd18 config: remove now-unused `abs` argument from `include` callback
Martin von Zweigbergk <martinvonz@google.com>
parents: 45280
diff changeset
   165
                    include(expanded, remap=remap, sections=sections)
45278
3f54242781e9 config: remove now-unused support for "includepaths"
Martin von Zweigbergk <martinvonz@google.com>
parents: 45244
diff changeset
   166
                except IOError as inst:
3f54242781e9 config: remove now-unused support for "includepaths"
Martin von Zweigbergk <martinvonz@google.com>
parents: 45244
diff changeset
   167
                    if inst.errno != errno.ENOENT:
45909
9dc1351d0b5f errors: raise ConfigError on failure to parse config file
Martin von Zweigbergk <martinvonz@google.com>
parents: 45800
diff changeset
   168
                        raise error.ConfigError(
45278
3f54242781e9 config: remove now-unused support for "includepaths"
Martin von Zweigbergk <martinvonz@google.com>
parents: 45244
diff changeset
   169
                            _(b"cannot include %s (%s)")
45281
668af67bfd18 config: remove now-unused `abs` argument from `include` callback
Martin von Zweigbergk <martinvonz@google.com>
parents: 45280
diff changeset
   170
                            % (expanded, encoding.strtolocal(inst.strerror)),
45278
3f54242781e9 config: remove now-unused support for "includepaths"
Martin von Zweigbergk <martinvonz@google.com>
parents: 45244
diff changeset
   171
                            b"%s:%d" % (src, line),
3f54242781e9 config: remove now-unused support for "includepaths"
Martin von Zweigbergk <martinvonz@google.com>
parents: 45244
diff changeset
   172
                        )
8183
2858ab754995 config: allow including other config files
Matt Mackall <mpm@selenic.com>
parents: 8180
diff changeset
   173
                continue
8144
fca54469480e ui: introduce new config parser
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   174
            if emptyre.match(l):
fca54469480e ui: introduce new config parser
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   175
                continue
fca54469480e ui: introduce new config parser
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   176
            m = sectionre.match(l)
fca54469480e ui: introduce new config parser
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   177
            if m:
fca54469480e ui: introduce new config parser
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   178
                section = m.group(1)
8298
9542f4c3fa1b config: make remap actually work
Matt Mackall <mpm@selenic.com>
parents: 8265
diff changeset
   179
                if remap:
9542f4c3fa1b config: make remap actually work
Matt Mackall <mpm@selenic.com>
parents: 8265
diff changeset
   180
                    section = remap.get(section, section)
8144
fca54469480e ui: introduce new config parser
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   181
                if section not in self:
34358
c41444a39de2 config: use copy-on-write to improve copy performance
Jun Wu <quark@fb.com>
parents: 34146
diff changeset
   182
                    self._data[section] = util.cowsortdict()
8144
fca54469480e ui: introduce new config parser
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   183
                continue
fca54469480e ui: introduce new config parser
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   184
            m = itemre.match(l)
fca54469480e ui: introduce new config parser
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   185
            if m:
fca54469480e ui: introduce new config parser
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   186
                item = m.group(1)
9339
9be91129c96e config: improve code readability
Andrey <py4fun@gmail.com>
parents: 9136
diff changeset
   187
                cont = True
8193
94246e90081e config: add section filter to read
Matt Mackall <mpm@selenic.com>
parents: 8192
diff changeset
   188
                if sections and section not in sections:
94246e90081e config: add section filter to read
Matt Mackall <mpm@selenic.com>
parents: 8192
diff changeset
   189
                    continue
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   190
                self.set(section, item, m.group(2), b"%s:%d" % (src, line))
8144
fca54469480e ui: introduce new config parser
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   191
                continue
8184
9189afe1eba3 config: add %unset name support
Matt Mackall <mpm@selenic.com>
parents: 8183
diff changeset
   192
            m = unsetre.match(l)
9189afe1eba3 config: add %unset name support
Matt Mackall <mpm@selenic.com>
parents: 8183
diff changeset
   193
            if m:
9189afe1eba3 config: add %unset name support
Matt Mackall <mpm@selenic.com>
parents: 8183
diff changeset
   194
                name = m.group(1)
8193
94246e90081e config: add section filter to read
Matt Mackall <mpm@selenic.com>
parents: 8192
diff changeset
   195
                if sections and section not in sections:
94246e90081e config: add section filter to read
Matt Mackall <mpm@selenic.com>
parents: 8192
diff changeset
   196
                    continue
13031
3da456d0c885 code style: prefer 'is' and 'is not' tests with singletons
Martin Geisler <mg@aragost.com>
parents: 11292
diff changeset
   197
                if self.get(section, name) is not None:
34455
0efdfb57b05c config: add a missing preparewrite() call
Jun Wu <quark@fb.com>
parents: 34358
diff changeset
   198
                    self._data[section] = self._data[section].preparewrite()
8184
9189afe1eba3 config: add %unset name support
Matt Mackall <mpm@selenic.com>
parents: 8183
diff changeset
   199
                    del self._data[section][name]
19087
7d82ad4b3727 config: discard "%unset" values defined in the other files read in previously
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 17537
diff changeset
   200
                self._unset.append((section, name))
8184
9189afe1eba3 config: add %unset name support
Matt Mackall <mpm@selenic.com>
parents: 8183
diff changeset
   201
                continue
9189afe1eba3 config: add %unset name support
Matt Mackall <mpm@selenic.com>
parents: 8183
diff changeset
   202
45800
0883413e09bc config: move message about leading spaces in config to config.py
Martin von Zweigbergk <martinvonz@google.com>
parents: 45281
diff changeset
   203
            message = l.rstrip()
0883413e09bc config: move message about leading spaces in config to config.py
Martin von Zweigbergk <martinvonz@google.com>
parents: 45281
diff changeset
   204
            if l.startswith(b' '):
0883413e09bc config: move message about leading spaces in config to config.py
Martin von Zweigbergk <martinvonz@google.com>
parents: 45281
diff changeset
   205
                message = b"unexpected leading whitespace: %s" % message
45909
9dc1351d0b5f errors: raise ConfigError on failure to parse config file
Martin von Zweigbergk <martinvonz@google.com>
parents: 45800
diff changeset
   206
            raise error.ConfigError(message, (b"%s:%d" % (src, line)))
8265
52c5be55af82 config: add parse interface
Matt Mackall <mpm@selenic.com>
parents: 8263
diff changeset
   207
52c5be55af82 config: add parse interface
Matt Mackall <mpm@selenic.com>
parents: 8263
diff changeset
   208
    def read(self, path, fp=None, sections=None, remap=None):
52c5be55af82 config: add parse interface
Matt Mackall <mpm@selenic.com>
parents: 8263
diff changeset
   209
        if not fp:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   210
            fp = util.posixfile(path, b'rb')
43554
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43346
diff changeset
   211
        assert getattr(fp, 'mode', 'rb') == 'rb', (
43346
6ada8a274b9c formatting: run black version 19.10b0 on the codebase
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43276
diff changeset
   212
            b'config files must be opened in binary mode, got fp=%r mode=%r'
6ada8a274b9c formatting: run black version 19.10b0 on the codebase
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43276
diff changeset
   213
            % (fp, fp.mode,)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41342
diff changeset
   214
        )
45244
f7f142d74df3 config: pass both relative and absolute paths to `include` callback
Martin von Zweigbergk <martinvonz@google.com>
parents: 43554
diff changeset
   215
45280
83ca8d6f3206 config: re-calculate absolute %include path in `include` callback
Martin von Zweigbergk <martinvonz@google.com>
parents: 45278
diff changeset
   216
        dir = os.path.dirname(path)
83ca8d6f3206 config: re-calculate absolute %include path in `include` callback
Martin von Zweigbergk <martinvonz@google.com>
parents: 45278
diff changeset
   217
45281
668af67bfd18 config: remove now-unused `abs` argument from `include` callback
Martin von Zweigbergk <martinvonz@google.com>
parents: 45280
diff changeset
   218
        def include(rel, remap, sections):
45280
83ca8d6f3206 config: re-calculate absolute %include path in `include` callback
Martin von Zweigbergk <martinvonz@google.com>
parents: 45278
diff changeset
   219
            abs = os.path.normpath(os.path.join(dir, rel))
45244
f7f142d74df3 config: pass both relative and absolute paths to `include` callback
Martin von Zweigbergk <martinvonz@google.com>
parents: 43554
diff changeset
   220
            self.read(abs, remap=remap, sections=sections)
f7f142d74df3 config: pass both relative and absolute paths to `include` callback
Martin von Zweigbergk <martinvonz@google.com>
parents: 43554
diff changeset
   221
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41342
diff changeset
   222
        self.parse(
45244
f7f142d74df3 config: pass both relative and absolute paths to `include` callback
Martin von Zweigbergk <martinvonz@google.com>
parents: 43554
diff changeset
   223
            path, fp.read(), sections=sections, remap=remap, include=include
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41342
diff changeset
   224
        )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41342
diff changeset
   225
31488
a7c687c35119 ui: move configlist parser to config.py
Jun Wu <quark@fb.com>
parents: 31383
diff changeset
   226
a7c687c35119 ui: move configlist parser to config.py
Jun Wu <quark@fb.com>
parents: 31383
diff changeset
   227
def parselist(value):
a7c687c35119 ui: move configlist parser to config.py
Jun Wu <quark@fb.com>
parents: 31383
diff changeset
   228
    """parse a configuration value as a list of comma/space separated strings
a7c687c35119 ui: move configlist parser to config.py
Jun Wu <quark@fb.com>
parents: 31383
diff changeset
   229
34146
0fa781320203 doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents: 32358
diff changeset
   230
    >>> parselist(b'this,is "a small" ,test')
31488
a7c687c35119 ui: move configlist parser to config.py
Jun Wu <quark@fb.com>
parents: 31383
diff changeset
   231
    ['this', 'is', 'a small', 'test']
a7c687c35119 ui: move configlist parser to config.py
Jun Wu <quark@fb.com>
parents: 31383
diff changeset
   232
    """
a7c687c35119 ui: move configlist parser to config.py
Jun Wu <quark@fb.com>
parents: 31383
diff changeset
   233
a7c687c35119 ui: move configlist parser to config.py
Jun Wu <quark@fb.com>
parents: 31383
diff changeset
   234
    def _parse_plain(parts, s, offset):
a7c687c35119 ui: move configlist parser to config.py
Jun Wu <quark@fb.com>
parents: 31383
diff changeset
   235
        whitespace = False
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41342
diff changeset
   236
        while offset < len(s) and (
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   237
            s[offset : offset + 1].isspace() or s[offset : offset + 1] == b','
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41342
diff changeset
   238
        ):
31488
a7c687c35119 ui: move configlist parser to config.py
Jun Wu <quark@fb.com>
parents: 31383
diff changeset
   239
            whitespace = True
a7c687c35119 ui: move configlist parser to config.py
Jun Wu <quark@fb.com>
parents: 31383
diff changeset
   240
            offset += 1
a7c687c35119 ui: move configlist parser to config.py
Jun Wu <quark@fb.com>
parents: 31383
diff changeset
   241
        if offset >= len(s):
a7c687c35119 ui: move configlist parser to config.py
Jun Wu <quark@fb.com>
parents: 31383
diff changeset
   242
            return None, parts, offset
a7c687c35119 ui: move configlist parser to config.py
Jun Wu <quark@fb.com>
parents: 31383
diff changeset
   243
        if whitespace:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   244
            parts.append(b'')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   245
        if s[offset : offset + 1] == b'"' and not parts[-1]:
31488
a7c687c35119 ui: move configlist parser to config.py
Jun Wu <quark@fb.com>
parents: 31383
diff changeset
   246
            return _parse_quote, parts, offset + 1
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   247
        elif s[offset : offset + 1] == b'"' and parts[-1][-1:] == b'\\':
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41342
diff changeset
   248
            parts[-1] = parts[-1][:-1] + s[offset : offset + 1]
31488
a7c687c35119 ui: move configlist parser to config.py
Jun Wu <quark@fb.com>
parents: 31383
diff changeset
   249
            return _parse_plain, parts, offset + 1
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41342
diff changeset
   250
        parts[-1] += s[offset : offset + 1]
31488
a7c687c35119 ui: move configlist parser to config.py
Jun Wu <quark@fb.com>
parents: 31383
diff changeset
   251
        return _parse_plain, parts, offset + 1
a7c687c35119 ui: move configlist parser to config.py
Jun Wu <quark@fb.com>
parents: 31383
diff changeset
   252
a7c687c35119 ui: move configlist parser to config.py
Jun Wu <quark@fb.com>
parents: 31383
diff changeset
   253
    def _parse_quote(parts, s, offset):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   254
        if offset < len(s) and s[offset : offset + 1] == b'"':  # ""
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   255
            parts.append(b'')
31488
a7c687c35119 ui: move configlist parser to config.py
Jun Wu <quark@fb.com>
parents: 31383
diff changeset
   256
            offset += 1
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41342
diff changeset
   257
            while offset < len(s) and (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41342
diff changeset
   258
                s[offset : offset + 1].isspace()
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   259
                or s[offset : offset + 1] == b','
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41342
diff changeset
   260
            ):
31488
a7c687c35119 ui: move configlist parser to config.py
Jun Wu <quark@fb.com>
parents: 31383
diff changeset
   261
                offset += 1
a7c687c35119 ui: move configlist parser to config.py
Jun Wu <quark@fb.com>
parents: 31383
diff changeset
   262
            return _parse_plain, parts, offset
a7c687c35119 ui: move configlist parser to config.py
Jun Wu <quark@fb.com>
parents: 31383
diff changeset
   263
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   264
        while offset < len(s) and s[offset : offset + 1] != b'"':
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41342
diff changeset
   265
            if (
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   266
                s[offset : offset + 1] == b'\\'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41342
diff changeset
   267
                and offset + 1 < len(s)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   268
                and s[offset + 1 : offset + 2] == b'"'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41342
diff changeset
   269
            ):
31488
a7c687c35119 ui: move configlist parser to config.py
Jun Wu <quark@fb.com>
parents: 31383
diff changeset
   270
                offset += 1
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   271
                parts[-1] += b'"'
31488
a7c687c35119 ui: move configlist parser to config.py
Jun Wu <quark@fb.com>
parents: 31383
diff changeset
   272
            else:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41342
diff changeset
   273
                parts[-1] += s[offset : offset + 1]
31488
a7c687c35119 ui: move configlist parser to config.py
Jun Wu <quark@fb.com>
parents: 31383
diff changeset
   274
            offset += 1
a7c687c35119 ui: move configlist parser to config.py
Jun Wu <quark@fb.com>
parents: 31383
diff changeset
   275
a7c687c35119 ui: move configlist parser to config.py
Jun Wu <quark@fb.com>
parents: 31383
diff changeset
   276
        if offset >= len(s):
a7c687c35119 ui: move configlist parser to config.py
Jun Wu <quark@fb.com>
parents: 31383
diff changeset
   277
            real_parts = _configlist(parts[-1])
a7c687c35119 ui: move configlist parser to config.py
Jun Wu <quark@fb.com>
parents: 31383
diff changeset
   278
            if not real_parts:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   279
                parts[-1] = b'"'
31488
a7c687c35119 ui: move configlist parser to config.py
Jun Wu <quark@fb.com>
parents: 31383
diff changeset
   280
            else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   281
                real_parts[0] = b'"' + real_parts[0]
31488
a7c687c35119 ui: move configlist parser to config.py
Jun Wu <quark@fb.com>
parents: 31383
diff changeset
   282
                parts = parts[:-1]
a7c687c35119 ui: move configlist parser to config.py
Jun Wu <quark@fb.com>
parents: 31383
diff changeset
   283
                parts.extend(real_parts)
a7c687c35119 ui: move configlist parser to config.py
Jun Wu <quark@fb.com>
parents: 31383
diff changeset
   284
            return None, parts, offset
a7c687c35119 ui: move configlist parser to config.py
Jun Wu <quark@fb.com>
parents: 31383
diff changeset
   285
a7c687c35119 ui: move configlist parser to config.py
Jun Wu <quark@fb.com>
parents: 31383
diff changeset
   286
        offset += 1
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   287
        while offset < len(s) and s[offset : offset + 1] in [b' ', b',']:
31488
a7c687c35119 ui: move configlist parser to config.py
Jun Wu <quark@fb.com>
parents: 31383
diff changeset
   288
            offset += 1
a7c687c35119 ui: move configlist parser to config.py
Jun Wu <quark@fb.com>
parents: 31383
diff changeset
   289
a7c687c35119 ui: move configlist parser to config.py
Jun Wu <quark@fb.com>
parents: 31383
diff changeset
   290
        if offset < len(s):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   291
            if offset + 1 == len(s) and s[offset : offset + 1] == b'"':
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   292
                parts[-1] += b'"'
31488
a7c687c35119 ui: move configlist parser to config.py
Jun Wu <quark@fb.com>
parents: 31383
diff changeset
   293
                offset += 1
a7c687c35119 ui: move configlist parser to config.py
Jun Wu <quark@fb.com>
parents: 31383
diff changeset
   294
            else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   295
                parts.append(b'')
31488
a7c687c35119 ui: move configlist parser to config.py
Jun Wu <quark@fb.com>
parents: 31383
diff changeset
   296
        else:
a7c687c35119 ui: move configlist parser to config.py
Jun Wu <quark@fb.com>
parents: 31383
diff changeset
   297
            return None, parts, offset
a7c687c35119 ui: move configlist parser to config.py
Jun Wu <quark@fb.com>
parents: 31383
diff changeset
   298
a7c687c35119 ui: move configlist parser to config.py
Jun Wu <quark@fb.com>
parents: 31383
diff changeset
   299
        return _parse_plain, parts, offset
a7c687c35119 ui: move configlist parser to config.py
Jun Wu <quark@fb.com>
parents: 31383
diff changeset
   300
a7c687c35119 ui: move configlist parser to config.py
Jun Wu <quark@fb.com>
parents: 31383
diff changeset
   301
    def _configlist(s):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   302
        s = s.rstrip(b' ,')
31488
a7c687c35119 ui: move configlist parser to config.py
Jun Wu <quark@fb.com>
parents: 31383
diff changeset
   303
        if not s:
a7c687c35119 ui: move configlist parser to config.py
Jun Wu <quark@fb.com>
parents: 31383
diff changeset
   304
            return []
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   305
        parser, parts, offset = _parse_plain, [b''], 0
31488
a7c687c35119 ui: move configlist parser to config.py
Jun Wu <quark@fb.com>
parents: 31383
diff changeset
   306
        while parser:
a7c687c35119 ui: move configlist parser to config.py
Jun Wu <quark@fb.com>
parents: 31383
diff changeset
   307
            parser, parts, offset = parser(parts, s, offset)
a7c687c35119 ui: move configlist parser to config.py
Jun Wu <quark@fb.com>
parents: 31383
diff changeset
   308
        return parts
a7c687c35119 ui: move configlist parser to config.py
Jun Wu <quark@fb.com>
parents: 31383
diff changeset
   309
a7c687c35119 ui: move configlist parser to config.py
Jun Wu <quark@fb.com>
parents: 31383
diff changeset
   310
    if value is not None and isinstance(value, bytes):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   311
        result = _configlist(value.lstrip(b' ,\n'))
31488
a7c687c35119 ui: move configlist parser to config.py
Jun Wu <quark@fb.com>
parents: 31383
diff changeset
   312
    else:
a7c687c35119 ui: move configlist parser to config.py
Jun Wu <quark@fb.com>
parents: 31383
diff changeset
   313
        result = value
a7c687c35119 ui: move configlist parser to config.py
Jun Wu <quark@fb.com>
parents: 31383
diff changeset
   314
    return result or []