Mercurial > public > mercurial-scm > hg-stable
annotate mercurial/config.py @ 49037:642e31cb55f0
py3: use class X: instead of class X(object):
The inheritance from object is implied in Python 3. So this should
be equivalent.
This change was generated via an automated search and replace. So there
may have been some accidental changes.
Differential Revision: https://phab.mercurial-scm.org/D12352
author | Gregory Szorc <gregory.szorc@gmail.com> |
---|---|
date | Mon, 21 Feb 2022 13:08:28 -0700 |
parents | b4ab4fd23199 |
children | 18c8c18993f0 |
rev | line source |
---|---|
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 # |
46819
d4ba4d51f85f
contributor: change mentions of mpm to olivia
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46661
diff
changeset
|
3 # Copyright 2009 Olivia Mackall <olivia@selenic.com> and others |
8229
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 | 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 |
a027a0813b44
config: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
9 import errno |
a027a0813b44
config: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
10 import os |
a027a0813b44
config: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
11 |
a027a0813b44
config: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
12 from .i18n import _ |
43089
c59eb1560c44
py3: manually import getattr where it is needed
Gregory Szorc <gregory.szorc@gmail.com>
parents:
43077
diff
changeset
|
13 from .pycompat import getattr |
25923
a027a0813b44
config: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
14 from . import ( |
43276
d201a637c971
py3: encode underlying error message during parse error of %include
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
43106
diff
changeset
|
15 encoding, |
25923
a027a0813b44
config: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
16 error, |
a027a0813b44
config: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
17 util, |
a027a0813b44
config: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
18 ) |
8144 | 19 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41342
diff
changeset
|
20 |
49037
642e31cb55f0
py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents:
49011
diff
changeset
|
21 class config: |
45278
3f54242781e9
config: remove now-unused support for "includepaths"
Martin von Zweigbergk <martinvonz@google.com>
parents:
45244
diff
changeset
|
22 def __init__(self, data=None): |
46661
a3dced4b7b04
config: track the "level" of a value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46660
diff
changeset
|
23 self._current_source_level = 0 |
8144 | 24 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
|
25 self._unset = [] |
8144 | 26 if data: |
27 for k in data._data: | |
28 self._data[k] = data[k].copy() | |
46661
a3dced4b7b04
config: track the "level" of a value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46660
diff
changeset
|
29 self._current_source_level = data._current_source_level + 1 |
a3dced4b7b04
config: track the "level" of a value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46660
diff
changeset
|
30 |
a3dced4b7b04
config: track the "level" of a value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46660
diff
changeset
|
31 def new_source(self): |
a3dced4b7b04
config: track the "level" of a value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46660
diff
changeset
|
32 """increment the source counter |
a3dced4b7b04
config: track the "level" of a value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46660
diff
changeset
|
33 |
a3dced4b7b04
config: track the "level" of a value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46660
diff
changeset
|
34 This is used to define source priority when reading""" |
a3dced4b7b04
config: track the "level" of a value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46660
diff
changeset
|
35 self._current_source_level += 1 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41342
diff
changeset
|
36 |
8144 | 37 def copy(self): |
38 return config(self) | |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41342
diff
changeset
|
39 |
8144 | 40 def __contains__(self, section): |
41 return section in self._data | |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41342
diff
changeset
|
42 |
27696
e70c97cc9243
config: add hasconfig method and supporting plumbing
Bryan O'Sullivan <bos@serpentine.com>
parents:
25923
diff
changeset
|
43 def hasitem(self, section, item): |
e70c97cc9243
config: add hasconfig method and supporting plumbing
Bryan O'Sullivan <bos@serpentine.com>
parents:
25923
diff
changeset
|
44 return item in 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 __getitem__(self, section): |
6a0018cdb2fe
config: add some helper methods
Matt Mackall <mpm@selenic.com>
parents:
8185
diff
changeset
|
47 return self._data.get(section, {}) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41342
diff
changeset
|
48 |
8186
6a0018cdb2fe
config: add some helper methods
Matt Mackall <mpm@selenic.com>
parents:
8185
diff
changeset
|
49 def __iter__(self): |
6a0018cdb2fe
config: add some helper methods
Matt Mackall <mpm@selenic.com>
parents:
8185
diff
changeset
|
50 for d in self.sections(): |
6a0018cdb2fe
config: add some helper methods
Matt Mackall <mpm@selenic.com>
parents:
8185
diff
changeset
|
51 yield d |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41342
diff
changeset
|
52 |
8193
94246e90081e
config: add section filter to read
Matt Mackall <mpm@selenic.com>
parents:
8192
diff
changeset
|
53 def update(self, src): |
46661
a3dced4b7b04
config: track the "level" of a value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46660
diff
changeset
|
54 current_level = self._current_source_level |
a3dced4b7b04
config: track the "level" of a value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46660
diff
changeset
|
55 current_level += 1 |
a3dced4b7b04
config: track the "level" of a value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46660
diff
changeset
|
56 max_level = self._current_source_level |
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
|
57 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
|
58 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
|
59 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
|
60 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
|
61 del self._data[s][n] |
8193
94246e90081e
config: add section filter to read
Matt Mackall <mpm@selenic.com>
parents:
8192
diff
changeset
|
62 for s in src: |
34358
c41444a39de2
config: use copy-on-write to improve copy performance
Jun Wu <quark@fb.com>
parents:
34146
diff
changeset
|
63 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
|
64 if ds: |
c41444a39de2
config: use copy-on-write to improve copy performance
Jun Wu <quark@fb.com>
parents:
34146
diff
changeset
|
65 self._data[s] = ds.preparewrite() |
c41444a39de2
config: use copy-on-write to improve copy performance
Jun Wu <quark@fb.com>
parents:
34146
diff
changeset
|
66 else: |
c41444a39de2
config: use copy-on-write to improve copy performance
Jun Wu <quark@fb.com>
parents:
34146
diff
changeset
|
67 self._data[s] = util.cowsortdict() |
46661
a3dced4b7b04
config: track the "level" of a value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46660
diff
changeset
|
68 for k, v in src._data[s].items(): |
a3dced4b7b04
config: track the "level" of a value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46660
diff
changeset
|
69 value, source, level = v |
a3dced4b7b04
config: track the "level" of a value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46660
diff
changeset
|
70 level += current_level |
a3dced4b7b04
config: track the "level" of a value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46660
diff
changeset
|
71 max_level = max(level, current_level) |
a3dced4b7b04
config: track the "level" of a value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46660
diff
changeset
|
72 self._data[s][k] = (value, source, level) |
a3dced4b7b04
config: track the "level" of a value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46660
diff
changeset
|
73 self._current_source_level = max_level |
46660
d3df397e7a59
config: track "source" along side value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46659
diff
changeset
|
74 |
d3df397e7a59
config: track "source" along side value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46659
diff
changeset
|
75 def _get(self, section, item): |
d3df397e7a59
config: track "source" along side value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46659
diff
changeset
|
76 return self._data.get(section, {}).get(item) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41342
diff
changeset
|
77 |
8144 | 78 def get(self, section, item, default=None): |
46660
d3df397e7a59
config: track "source" along side value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46659
diff
changeset
|
79 result = self._get(section, item) |
d3df397e7a59
config: track "source" along side value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46659
diff
changeset
|
80 if result is None: |
d3df397e7a59
config: track "source" along side value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46659
diff
changeset
|
81 return default |
d3df397e7a59
config: track "source" along side value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46659
diff
changeset
|
82 return result[0] |
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
|
83 |
46660
d3df397e7a59
config: track "source" along side value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46659
diff
changeset
|
84 def backup(self, section, key): |
17527 | 85 """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
|
86 |
17530 | 87 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
|
88 """ |
69e792cf7851
config: have a way to backup and restore value in config
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
14696
diff
changeset
|
89 try: |
46660
d3df397e7a59
config: track "source" along side value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46659
diff
changeset
|
90 item = self._data[section][key] |
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
|
91 except KeyError: |
46660
d3df397e7a59
config: track "source" along side value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46659
diff
changeset
|
92 return (section, key) |
d3df397e7a59
config: track "source" along side value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46659
diff
changeset
|
93 else: |
d3df397e7a59
config: track "source" along side value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46659
diff
changeset
|
94 return (section, key) + item |
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
|
95 |
8198
cf9accffd0b3
config: getsource -> source
Matt Mackall <mpm@selenic.com>
parents:
8193
diff
changeset
|
96 def source(self, section, item): |
46660
d3df397e7a59
config: track "source" along side value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46659
diff
changeset
|
97 result = self._get(section, item) |
d3df397e7a59
config: track "source" along side value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46659
diff
changeset
|
98 if result is None: |
d3df397e7a59
config: track "source" along side value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46659
diff
changeset
|
99 return b"" |
d3df397e7a59
config: track "source" along side value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46659
diff
changeset
|
100 return result[1] |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41342
diff
changeset
|
101 |
46661
a3dced4b7b04
config: track the "level" of a value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46660
diff
changeset
|
102 def level(self, section, item): |
a3dced4b7b04
config: track the "level" of a value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46660
diff
changeset
|
103 result = self._get(section, item) |
a3dced4b7b04
config: track the "level" of a value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46660
diff
changeset
|
104 if result is None: |
a3dced4b7b04
config: track the "level" of a value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46660
diff
changeset
|
105 return None |
a3dced4b7b04
config: track the "level" of a value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46660
diff
changeset
|
106 return result[2] |
a3dced4b7b04
config: track the "level" of a value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46660
diff
changeset
|
107 |
8144 | 108 def sections(self): |
109 return sorted(self._data.keys()) | |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41342
diff
changeset
|
110 |
8144 | 111 def items(self, section): |
49011
b4ab4fd23199
config: remove pycompat.iteritems()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
48981
diff
changeset
|
112 items = self._data.get(section, {}).items() |
46661
a3dced4b7b04
config: track the "level" of a value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46660
diff
changeset
|
113 return [(k, v[0]) for (k, v) in items] |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41342
diff
changeset
|
114 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
115 def set(self, section, item, value, source=b""): |
48981
f5127b87f160
config: remove conditional asserts
Gregory Szorc <gregory.szorc@gmail.com>
parents:
48966
diff
changeset
|
116 assert not isinstance( |
f5127b87f160
config: remove conditional asserts
Gregory Szorc <gregory.szorc@gmail.com>
parents:
48966
diff
changeset
|
117 section, str |
f5127b87f160
config: remove conditional asserts
Gregory Szorc <gregory.szorc@gmail.com>
parents:
48966
diff
changeset
|
118 ), b'config section may not be unicode strings on Python 3' |
f5127b87f160
config: remove conditional asserts
Gregory Szorc <gregory.szorc@gmail.com>
parents:
48966
diff
changeset
|
119 assert not isinstance( |
f5127b87f160
config: remove conditional asserts
Gregory Szorc <gregory.szorc@gmail.com>
parents:
48966
diff
changeset
|
120 item, str |
f5127b87f160
config: remove conditional asserts
Gregory Szorc <gregory.szorc@gmail.com>
parents:
48966
diff
changeset
|
121 ), b'config item may not be unicode strings on Python 3' |
f5127b87f160
config: remove conditional asserts
Gregory Szorc <gregory.szorc@gmail.com>
parents:
48966
diff
changeset
|
122 assert not isinstance( |
f5127b87f160
config: remove conditional asserts
Gregory Szorc <gregory.szorc@gmail.com>
parents:
48966
diff
changeset
|
123 value, str |
f5127b87f160
config: remove conditional asserts
Gregory Szorc <gregory.szorc@gmail.com>
parents:
48966
diff
changeset
|
124 ), b'config values may not be unicode strings on Python 3' |
8144 | 125 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
|
126 self._data[section] = util.cowsortdict() |
c41444a39de2
config: use copy-on-write to improve copy performance
Jun Wu <quark@fb.com>
parents:
34146
diff
changeset
|
127 else: |
c41444a39de2
config: use copy-on-write to improve copy performance
Jun Wu <quark@fb.com>
parents:
34146
diff
changeset
|
128 self._data[section] = self._data[section].preparewrite() |
46661
a3dced4b7b04
config: track the "level" of a value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46660
diff
changeset
|
129 self._data[section][item] = (value, source, self._current_source_level) |
8144 | 130 |
46659
7621ab4005bf
config: use a new `alter` method in `fixconfig`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45957
diff
changeset
|
131 def alter(self, section, key, new_value): |
7621ab4005bf
config: use a new `alter` method in `fixconfig`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45957
diff
changeset
|
132 """alter a value without altering its source or level |
7621ab4005bf
config: use a new `alter` method in `fixconfig`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45957
diff
changeset
|
133 |
7621ab4005bf
config: use a new `alter` method in `fixconfig`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45957
diff
changeset
|
134 This method is meant to be used by `ui.fixconfig` only.""" |
7621ab4005bf
config: use a new `alter` method in `fixconfig`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45957
diff
changeset
|
135 item = self._data[section][key] |
7621ab4005bf
config: use a new `alter` method in `fixconfig`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45957
diff
changeset
|
136 size = len(item) |
7621ab4005bf
config: use a new `alter` method in `fixconfig`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45957
diff
changeset
|
137 new_item = (new_value,) + item[1:] |
7621ab4005bf
config: use a new `alter` method in `fixconfig`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45957
diff
changeset
|
138 assert len(new_item) == size |
7621ab4005bf
config: use a new `alter` method in `fixconfig`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45957
diff
changeset
|
139 self._data[section][key] = new_item |
7621ab4005bf
config: use a new `alter` method in `fixconfig`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45957
diff
changeset
|
140 |
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
|
141 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
|
142 """restore data returned by self.backup""" |
46660
d3df397e7a59
config: track "source" along side value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46659
diff
changeset
|
143 if len(data) != 2: |
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
|
144 # restore old data |
46660
d3df397e7a59
config: track "source" along side value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46659
diff
changeset
|
145 section, key = data[:2] |
d3df397e7a59
config: track "source" along side value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46659
diff
changeset
|
146 item = data[2:] |
34358
c41444a39de2
config: use copy-on-write to improve copy performance
Jun Wu <quark@fb.com>
parents:
34146
diff
changeset
|
147 self._data[section] = self._data[section].preparewrite() |
46660
d3df397e7a59
config: track "source" along side value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46659
diff
changeset
|
148 self._data[section][key] = item |
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
|
149 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
|
150 # 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
|
151 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
|
152 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
|
153 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
|
154 |
8265
52c5be55af82
config: add parse interface
Matt Mackall <mpm@selenic.com>
parents:
8263
diff
changeset
|
155 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
|
156 sectionre = util.re.compile(br'\[([^\[]+)\]') |
954002426f78
config: mark parser regexes as bytes explicitly
Augie Fackler <augie@google.com>
parents:
27696
diff
changeset
|
157 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
|
158 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
|
159 emptyre = util.re.compile(br'(;|#|\s*$)') |
954002426f78
config: mark parser regexes as bytes explicitly
Augie Fackler <augie@google.com>
parents:
27696
diff
changeset
|
160 commentre = util.re.compile(br'(;|#)') |
954002426f78
config: mark parser regexes as bytes explicitly
Augie Fackler <augie@google.com>
parents:
27696
diff
changeset
|
161 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
|
162 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
|
163 section = b"" |
8144 | 164 item = None |
165 line = 0 | |
9339
9be91129c96e
config: improve code readability
Andrey <py4fun@gmail.com>
parents:
9136
diff
changeset
|
166 cont = False |
8180 | 167 |
34713
e5a2cfc524d4
config: allow remapping the default section
Yuya Nishihara <yuya@tcha.org>
parents:
34455
diff
changeset
|
168 if remap: |
e5a2cfc524d4
config: allow remapping the default section
Yuya Nishihara <yuya@tcha.org>
parents:
34455
diff
changeset
|
169 section = remap.get(section, section) |
e5a2cfc524d4
config: allow remapping the default section
Yuya Nishihara <yuya@tcha.org>
parents:
34455
diff
changeset
|
170 |
9136
31177742f54a
for calls expecting bool args, pass bool instead of int
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8312
diff
changeset
|
171 for l in data.splitlines(True): |
8144 | 172 line += 1 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
173 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
|
174 # Someone set us up the BOM |
f350021ee32e
config: discard UTF-8 BOM if found
Matt Mackall <mpm@selenic.com>
parents:
15919
diff
changeset
|
175 l = l[3:] |
8144 | 176 if cont: |
14642
fdcdb221a922
config: handle comment lines in continuations (issue2854)
Matt Mackall <mpm@selenic.com>
parents:
14486
diff
changeset
|
177 if commentre.match(l): |
fdcdb221a922
config: handle comment lines in continuations (issue2854)
Matt Mackall <mpm@selenic.com>
parents:
14486
diff
changeset
|
178 continue |
8144 | 179 m = contre.match(l) |
180 if m: | |
8193
94246e90081e
config: add section filter to read
Matt Mackall <mpm@selenic.com>
parents:
8192
diff
changeset
|
181 if sections and section not in sections: |
94246e90081e
config: add section filter to read
Matt Mackall <mpm@selenic.com>
parents:
8192
diff
changeset
|
182 continue |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
183 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
|
184 self.set(section, item, v, b"%s:%d" % (src, line)) |
8144 | 185 continue |
186 item = None | |
9469
7f0f882af23d
config: abort on indented non-continuation lines (issue1829)
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8312
diff
changeset
|
187 cont = False |
8183
2858ab754995
config: allow including other config files
Matt Mackall <mpm@selenic.com>
parents:
8180
diff
changeset
|
188 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
|
189 |
3182965b3971
config: give it an includepaths option for looking for config files
Jordi Guti?rrez Hermoso <jordigh@octave.org>
parents:
22419
diff
changeset
|
190 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
|
191 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
|
192 try: |
45281
668af67bfd18
config: remove now-unused `abs` argument from `include` callback
Martin von Zweigbergk <martinvonz@google.com>
parents:
45280
diff
changeset
|
193 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
|
194 except IOError as inst: |
3f54242781e9
config: remove now-unused support for "includepaths"
Martin von Zweigbergk <martinvonz@google.com>
parents:
45244
diff
changeset
|
195 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
|
196 raise error.ConfigError( |
45278
3f54242781e9
config: remove now-unused support for "includepaths"
Martin von Zweigbergk <martinvonz@google.com>
parents:
45244
diff
changeset
|
197 _(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
|
198 % (expanded, encoding.strtolocal(inst.strerror)), |
45278
3f54242781e9
config: remove now-unused support for "includepaths"
Martin von Zweigbergk <martinvonz@google.com>
parents:
45244
diff
changeset
|
199 b"%s:%d" % (src, line), |
3f54242781e9
config: remove now-unused support for "includepaths"
Martin von Zweigbergk <martinvonz@google.com>
parents:
45244
diff
changeset
|
200 ) |
8183
2858ab754995
config: allow including other config files
Matt Mackall <mpm@selenic.com>
parents:
8180
diff
changeset
|
201 continue |
8144 | 202 if emptyre.match(l): |
203 continue | |
204 m = sectionre.match(l) | |
205 if m: | |
206 section = m.group(1) | |
8298
9542f4c3fa1b
config: make remap actually work
Matt Mackall <mpm@selenic.com>
parents:
8265
diff
changeset
|
207 if remap: |
9542f4c3fa1b
config: make remap actually work
Matt Mackall <mpm@selenic.com>
parents:
8265
diff
changeset
|
208 section = remap.get(section, section) |
8144 | 209 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
|
210 self._data[section] = util.cowsortdict() |
8144 | 211 continue |
212 m = itemre.match(l) | |
213 if m: | |
214 item = m.group(1) | |
9339
9be91129c96e
config: improve code readability
Andrey <py4fun@gmail.com>
parents:
9136
diff
changeset
|
215 cont = True |
8193
94246e90081e
config: add section filter to read
Matt Mackall <mpm@selenic.com>
parents:
8192
diff
changeset
|
216 if sections and section not in sections: |
94246e90081e
config: add section filter to read
Matt Mackall <mpm@selenic.com>
parents:
8192
diff
changeset
|
217 continue |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
218 self.set(section, item, m.group(2), b"%s:%d" % (src, line)) |
8144 | 219 continue |
8184
9189afe1eba3
config: add %unset name support
Matt Mackall <mpm@selenic.com>
parents:
8183
diff
changeset
|
220 m = unsetre.match(l) |
9189afe1eba3
config: add %unset name support
Matt Mackall <mpm@selenic.com>
parents:
8183
diff
changeset
|
221 if m: |
9189afe1eba3
config: add %unset name support
Matt Mackall <mpm@selenic.com>
parents:
8183
diff
changeset
|
222 name = m.group(1) |
8193
94246e90081e
config: add section filter to read
Matt Mackall <mpm@selenic.com>
parents:
8192
diff
changeset
|
223 if sections and section not in sections: |
94246e90081e
config: add section filter to read
Matt Mackall <mpm@selenic.com>
parents:
8192
diff
changeset
|
224 continue |
13031
3da456d0c885
code style: prefer 'is' and 'is not' tests with singletons
Martin Geisler <mg@aragost.com>
parents:
11292
diff
changeset
|
225 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
|
226 self._data[section] = self._data[section].preparewrite() |
8184
9189afe1eba3
config: add %unset name support
Matt Mackall <mpm@selenic.com>
parents:
8183
diff
changeset
|
227 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
|
228 self._unset.append((section, name)) |
8184
9189afe1eba3
config: add %unset name support
Matt Mackall <mpm@selenic.com>
parents:
8183
diff
changeset
|
229 continue |
9189afe1eba3
config: add %unset name support
Matt Mackall <mpm@selenic.com>
parents:
8183
diff
changeset
|
230 |
45800
0883413e09bc
config: move message about leading spaces in config to config.py
Martin von Zweigbergk <martinvonz@google.com>
parents:
45281
diff
changeset
|
231 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
|
232 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
|
233 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
|
234 raise error.ConfigError(message, (b"%s:%d" % (src, line))) |
8265
52c5be55af82
config: add parse interface
Matt Mackall <mpm@selenic.com>
parents:
8263
diff
changeset
|
235 |
52c5be55af82
config: add parse interface
Matt Mackall <mpm@selenic.com>
parents:
8263
diff
changeset
|
236 def read(self, path, fp=None, sections=None, remap=None): |
46661
a3dced4b7b04
config: track the "level" of a value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46660
diff
changeset
|
237 self.new_source() |
8265
52c5be55af82
config: add parse interface
Matt Mackall <mpm@selenic.com>
parents:
8263
diff
changeset
|
238 if not fp: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
239 fp = util.posixfile(path, b'rb') |
45957
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45909
diff
changeset
|
240 assert ( |
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45909
diff
changeset
|
241 getattr(fp, 'mode', 'rb') == 'rb' |
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45909
diff
changeset
|
242 ), b'config files must be opened in binary mode, got fp=%r mode=%r' % ( |
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45909
diff
changeset
|
243 fp, |
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45909
diff
changeset
|
244 fp.mode, |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41342
diff
changeset
|
245 ) |
45244
f7f142d74df3
config: pass both relative and absolute paths to `include` callback
Martin von Zweigbergk <martinvonz@google.com>
parents:
43554
diff
changeset
|
246 |
45280
83ca8d6f3206
config: re-calculate absolute %include path in `include` callback
Martin von Zweigbergk <martinvonz@google.com>
parents:
45278
diff
changeset
|
247 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
|
248 |
45281
668af67bfd18
config: remove now-unused `abs` argument from `include` callback
Martin von Zweigbergk <martinvonz@google.com>
parents:
45280
diff
changeset
|
249 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
|
250 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
|
251 self.read(abs, remap=remap, sections=sections) |
46661
a3dced4b7b04
config: track the "level" of a value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46660
diff
changeset
|
252 # anything after the include has a higher level |
a3dced4b7b04
config: track the "level" of a value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46660
diff
changeset
|
253 self.new_source() |
45244
f7f142d74df3
config: pass both relative and absolute paths to `include` callback
Martin von Zweigbergk <martinvonz@google.com>
parents:
43554
diff
changeset
|
254 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41342
diff
changeset
|
255 self.parse( |
45244
f7f142d74df3
config: pass both relative and absolute paths to `include` callback
Martin von Zweigbergk <martinvonz@google.com>
parents:
43554
diff
changeset
|
256 path, fp.read(), sections=sections, remap=remap, include=include |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41342
diff
changeset
|
257 ) |