6587.2.4
by Vincent Ladeuil
Allow hyphens in option names to unbreak compatibility. |
1 |
# Copyright (C) 2005-2014, 2016 Canonical Ltd
|
1442.1.1
by Robert Collins
move config_dir into bzrlib.config |
2 |
# Authors: Robert Collins <robert.collins@canonical.com>
|
2323.6.2
by Martin Pool
Move responsibility for suggesting upgrades to ui object |
3 |
# and others
|
1442.1.1
by Robert Collins
move config_dir into bzrlib.config |
4 |
#
|
5 |
# This program is free software; you can redistribute it and/or modify
|
|
6 |
# it under the terms of the GNU General Public License as published by
|
|
7 |
# the Free Software Foundation; either version 2 of the License, or
|
|
8 |
# (at your option) any later version.
|
|
9 |
#
|
|
10 |
# This program is distributed in the hope that it will be useful,
|
|
11 |
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
12 |
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
13 |
# GNU General Public License for more details.
|
|
14 |
#
|
|
15 |
# You should have received a copy of the GNU General Public License
|
|
16 |
# along with this program; if not, write to the Free Software
|
|
4183.7.1
by Sabin Iacob
update FSF mailing address |
17 |
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
1442.1.1
by Robert Collins
move config_dir into bzrlib.config |
18 |
|
1442.1.20
by Robert Collins
add some documentation on options |
19 |
"""Configuration that affects the behaviour of Bazaar.
|
20 |
||
21 |
Currently this configuration resides in ~/.bazaar/bazaar.conf
|
|
1770.2.2
by Aaron Bentley
Rename branches.conf to locations.conf |
22 |
and ~/.bazaar/locations.conf, which is written to by bzr.
|
1442.1.20
by Robert Collins
add some documentation on options |
23 |
|
1461
by Robert Collins
Typo in config.py (Thanks Fabbione) |
24 |
In bazaar.conf the following options may be set:
|
1442.1.20
by Robert Collins
add some documentation on options |
25 |
[DEFAULT]
|
26 |
editor=name-of-program
|
|
27 |
email=Your Name <your@email.address>
|
|
28 |
check_signatures=require|ignore|check-available(default)
|
|
29 |
create_signatures=always|never|when-required(default)
|
|
1442.1.56
by Robert Collins
gpg_signing_command configuration item |
30 |
gpg_signing_command=name-of-program
|
1553.2.9
by Erik Bågfors
log_formatter => log_format for "named" formatters |
31 |
log_format=name-of-format
|
5971.1.55
by Jonathan Riddell
add a config option to validate signatures |
32 |
validate_signatures_in_log=true|false(default)
|
5971.1.56
by Jonathan Riddell
add an option for acceptable_keys in config, also make config docs match reality for signature options |
33 |
acceptable_keys=pattern1,pattern2
|
6012.2.11
by Jonathan Riddell
rename config option signing_key to gpg_signing_key |
34 |
gpg_signing_key=amy@example.com
|
1442.1.20
by Robert Collins
add some documentation on options |
35 |
|
1770.2.2
by Aaron Bentley
Rename branches.conf to locations.conf |
36 |
in locations.conf, you specify the url of a branch and options for it.
|
1442.1.20
by Robert Collins
add some documentation on options |
37 |
Wildcards may be used - * and ? as normal in shell completion. Options
|
1770.2.2
by Aaron Bentley
Rename branches.conf to locations.conf |
38 |
set in both bazaar.conf and locations.conf are overridden by the locations.conf
|
1442.1.20
by Robert Collins
add some documentation on options |
39 |
setting.
|
40 |
[/home/robertc/source]
|
|
41 |
recurse=False|True(default)
|
|
42 |
email= as above
|
|
3943.8.1
by Marius Kruger
remove all trailing whitespace from bzr source |
43 |
check_signatures= as above
|
1442.1.20
by Robert Collins
add some documentation on options |
44 |
create_signatures= as above.
|
5971.1.55
by Jonathan Riddell
add a config option to validate signatures |
45 |
validate_signatures_in_log=as above
|
5971.1.56
by Jonathan Riddell
add an option for acceptable_keys in config, also make config docs match reality for signature options |
46 |
acceptable_keys=as above
|
1442.1.20
by Robert Collins
add some documentation on options |
47 |
|
48 |
explanation of options
|
|
49 |
----------------------
|
|
50 |
editor - this option sets the pop up editor to use during commits.
|
|
51 |
email - this option sets the user id bzr will use when committing.
|
|
5971.1.56
by Jonathan Riddell
add an option for acceptable_keys in config, also make config docs match reality for signature options |
52 |
check_signatures - this option will control whether bzr will require good gpg
|
3943.8.1
by Marius Kruger
remove all trailing whitespace from bzr source |
53 |
signatures, ignore them, or check them if they are
|
5971.1.56
by Jonathan Riddell
add an option for acceptable_keys in config, also make config docs match reality for signature options |
54 |
present. Currently it is unused except that check_signatures
|
55 |
turns on create_signatures.
|
|
3943.8.1
by Marius Kruger
remove all trailing whitespace from bzr source |
56 |
create_signatures - this option controls whether bzr will always create
|
5971.1.56
by Jonathan Riddell
add an option for acceptable_keys in config, also make config docs match reality for signature options |
57 |
gpg signatures or not on commits. There is an unused
|
6449.6.7
by Jelmer Vernooij
Fix tests. |
58 |
option which in future is expected to work if
|
5971.1.56
by Jonathan Riddell
add an option for acceptable_keys in config, also make config docs match reality for signature options |
59 |
branch settings require signatures.
|
1887.2.1
by Adeodato Simó
Fix some typos and grammar issues. |
60 |
log_format - this option sets the default log format. Possible values are
|
61 |
long, short, line, or a plugin can register new formats.
|
|
5971.1.55
by Jonathan Riddell
add a config option to validate signatures |
62 |
validate_signatures_in_log - show GPG signature validity in log output
|
5971.1.56
by Jonathan Riddell
add an option for acceptable_keys in config, also make config docs match reality for signature options |
63 |
acceptable_keys - comma separated list of key patterns acceptable for
|
64 |
verify-signatures command
|
|
1553.6.2
by Erik Bågfors
documentation and NEWS |
65 |
|
66 |
In bazaar.conf you can also define aliases in the ALIASES sections, example
|
|
67 |
||
68 |
[ALIASES]
|
|
69 |
lastlog=log --line -r-10..-1
|
|
70 |
ll=log --line -r-10..-1
|
|
71 |
h=help
|
|
72 |
up=pull
|
|
1442.1.20
by Robert Collins
add some documentation on options |
73 |
"""
|
1442.1.1
by Robert Collins
move config_dir into bzrlib.config |
74 |
|
6379.6.7
by Jelmer Vernooij
Move importing from future until after doc string, otherwise the doc string will disappear. |
75 |
from __future__ import absolute_import |
5609.61.1
by Jelmer Vernooij
Unconditionally import cStringIO in bzrlib.config. |
76 |
from cStringIO import StringIO |
1996.3.31
by John Arbash Meinel
Make bzrlib.config use lazy importing |
77 |
import os |
78 |
import sys |
|
5743.8.6
by Vincent Ladeuil
Add hooks for config stacks. |
79 |
|
6161.1.1
by Vincent Ladeuil
Allow config options to be overridden from the command line |
80 |
import bzrlib |
5345.5.4
by Vincent Ladeuil
Start implementing config files locking. |
81 |
from bzrlib.decorators import needs_write_lock |
1996.3.31
by John Arbash Meinel
Make bzrlib.config use lazy importing |
82 |
from bzrlib.lazy_import import lazy_import |
83 |
lazy_import(globals(), """ |
|
5912.5.7
by Martin
Minor cleanups and note about error case |
84 |
import base64
|
5447.4.1
by Vincent Ladeuil
Implement config.get_options_matching_regexp. |
85 |
import fnmatch
|
1770.2.1
by Aaron Bentley
Use create_signature for signing policy, deprecate check_signatures for this |
86 |
import re
|
1442.1.2
by Robert Collins
create a config module - there is enough config logic to make this worthwhile, and start testing config processing. |
87 |
|
1996.3.31
by John Arbash Meinel
Make bzrlib.config use lazy importing |
88 |
from bzrlib import (
|
4797.59.2
by Vincent Ladeuil
Use AtomicFile and avoid all unicode/encoding issues around transport (thanks jam). |
89 |
atomicfile,
|
6207.3.3
by jelmer at samba
Fix tests and the like. |
90 |
controldir,
|
2900.2.10
by Vincent Ladeuil
Add -Dauth handling. |
91 |
debug,
|
6437.66.1
by Wouter van Heyst
Dereference directory services in cmd_config. |
92 |
directory_service,
|
1996.3.31
by John Arbash Meinel
Make bzrlib.config use lazy importing |
93 |
errors,
|
5967.9.3
by Martin Pool
Explicitly use lazy_regexp where we count on its error reporting behaviour |
94 |
lazy_regex,
|
6161.1.7
by Vincent Ladeuil
Emit a warning when bzrlib.intialize) has not been called |
95 |
library_state,
|
5345.5.4
by Vincent Ladeuil
Start implementing config files locking. |
96 |
lockdir,
|
5321.1.88
by Gordon Tyler
Moved mergetools config functions into bzrlib.config.Config. |
97 |
mergetools,
|
1996.3.31
by John Arbash Meinel
Make bzrlib.config use lazy importing |
98 |
osutils,
|
2120.6.9
by James Henstridge
Fixes for issues brought up in John's review |
99 |
symbol_versioning,
|
1551.15.35
by Aaron Bentley
Warn when setting config values that will be masked (#122286) |
100 |
trace,
|
5345.5.4
by Vincent Ladeuil
Start implementing config files locking. |
101 |
transport,
|
2900.2.12
by Vincent Ladeuil
Since all schemes query AuthenticationConfig then prompt user, make that |
102 |
ui,
|
1996.3.31
by John Arbash Meinel
Make bzrlib.config use lazy importing |
103 |
urlutils,
|
2245.4.3
by Alexander Belchenko
config.py: changing _auto_user_id() and config_dir() to use functions from win32utils |
104 |
win32utils,
|
1996.3.31
by John Arbash Meinel
Make bzrlib.config use lazy importing |
105 |
)
|
6161.1.1
by Vincent Ladeuil
Allow config options to be overridden from the command line |
106 |
from bzrlib.i18n import gettext
|
2991.2.4
by Vincent Ladeuil
Various fixes following local testing environment rebuild. |
107 |
from bzrlib.util.configobj import configobj
|
1996.3.31
by John Arbash Meinel
Make bzrlib.config use lazy importing |
108 |
""") |
5904.1.2
by Martin Pool
Various pyflakes import fixes. |
109 |
from bzrlib import ( |
5743.8.6
by Vincent Ladeuil
Add hooks for config stacks. |
110 |
commands, |
111 |
hooks, |
|
6082.5.10
by Vincent Ladeuil
Tweaks suggested by jam during review. |
112 |
lazy_regex, |
5904.1.2
by Martin Pool
Various pyflakes import fixes. |
113 |
registry, |
114 |
)
|
|
5743.13.1
by Vincent Ladeuil
Deprecate _get_editor to identify its usages. |
115 |
from bzrlib.symbol_versioning import ( |
116 |
deprecated_in, |
|
117 |
deprecated_method, |
|
118 |
)
|
|
1996.3.31
by John Arbash Meinel
Make bzrlib.config use lazy importing |
119 |
|
1442.1.6
by Robert Collins
first stage major overhaul of configs, giving use BranchConfigs, LocationConfigs and GlobalConfigs |
120 |
|
1442.1.14
by Robert Collins
Create a default signature checking policy of CHECK_IF_POSSIBLE |
121 |
CHECK_IF_POSSIBLE=0 |
122 |
CHECK_ALWAYS=1 |
|
123 |
CHECK_NEVER=2 |
|
124 |
||
125 |
||
1770.2.1
by Aaron Bentley
Use create_signature for signing policy, deprecate check_signatures for this |
126 |
SIGN_WHEN_REQUIRED=0 |
127 |
SIGN_ALWAYS=1 |
|
128 |
SIGN_NEVER=2 |
|
129 |
||
130 |
||
2120.6.1
by James Henstridge
add support for norecurse and appendpath policies when reading configuration files |
131 |
POLICY_NONE = 0 |
132 |
POLICY_NORECURSE = 1 |
|
133 |
POLICY_APPENDPATH = 2 |
|
134 |
||
2120.6.8
by James Henstridge
Change syntax for setting config option policies. Rather than |
135 |
_policy_name = { |
136 |
POLICY_NONE: None, |
|
137 |
POLICY_NORECURSE: 'norecurse', |
|
138 |
POLICY_APPENDPATH: 'appendpath', |
|
139 |
}
|
|
140 |
_policy_value = { |
|
141 |
None: POLICY_NONE, |
|
142 |
'none': POLICY_NONE, |
|
143 |
'norecurse': POLICY_NORECURSE, |
|
144 |
'appendpath': POLICY_APPENDPATH, |
|
145 |
}
|
|
2120.6.4
by James Henstridge
add support for specifying policy when storing options |
146 |
|
147 |
||
148 |
STORE_LOCATION = POLICY_NONE |
|
149 |
STORE_LOCATION_NORECURSE = POLICY_NORECURSE |
|
150 |
STORE_LOCATION_APPENDPATH = POLICY_APPENDPATH |
|
151 |
STORE_BRANCH = 3 |
|
152 |
STORE_GLOBAL = 4 |
|
153 |
||
5676.1.4
by Jelmer Vernooij
merge bzr.dev. |
154 |
|
6351.3.2
by Jelmer Vernooij
Convert some gpg options to config stacks. |
155 |
def signature_policy_from_unicode(signature_string): |
156 |
"""Convert a string to a signing policy."""
|
|
157 |
if signature_string.lower() == 'check-available': |
|
158 |
return CHECK_IF_POSSIBLE |
|
159 |
if signature_string.lower() == 'ignore': |
|
160 |
return CHECK_NEVER |
|
161 |
if signature_string.lower() == 'require': |
|
162 |
return CHECK_ALWAYS |
|
163 |
raise ValueError("Invalid signatures policy '%s'" |
|
164 |
% signature_string) |
|
165 |
||
166 |
||
167 |
def signing_policy_from_unicode(signature_string): |
|
168 |
"""Convert a string to a signing policy."""
|
|
169 |
if signature_string.lower() == 'when-required': |
|
170 |
return SIGN_WHEN_REQUIRED |
|
171 |
if signature_string.lower() == 'never': |
|
172 |
return SIGN_NEVER |
|
173 |
if signature_string.lower() == 'always': |
|
174 |
return SIGN_ALWAYS |
|
175 |
raise ValueError("Invalid signing policy '%s'" |
|
176 |
% signature_string) |
|
177 |
||
178 |
||
5676.1.4
by Jelmer Vernooij
merge bzr.dev. |
179 |
class ConfigObj(configobj.ConfigObj): |
180 |
||
181 |
def __init__(self, infile=None, **kwargs): |
|
182 |
# We define our own interpolation mechanism calling it option expansion
|
|
183 |
super(ConfigObj, self).__init__(infile=infile, |
|
184 |
interpolation=False, |
|
185 |
**kwargs) |
|
186 |
||
187 |
def get_bool(self, section, key): |
|
188 |
return self[section].as_bool(key) |
|
189 |
||
190 |
def get_value(self, section, name): |
|
191 |
# Try [] for the old DEFAULT section.
|
|
192 |
if section == "DEFAULT": |
|
193 |
try: |
|
194 |
return self[name] |
|
195 |
except KeyError: |
|
196 |
pass
|
|
197 |
return self[section][name] |
|
198 |
||
199 |
||
5549.1.19
by Vincent Ladeuil
Push down interpolation at the config level (make tests slightly less |
200 |
class Config(object): |
201 |
"""A configuration policy - what username, editor, gpg needs etc."""
|
|
202 |
||
203 |
def __init__(self): |
|
204 |
super(Config, self).__init__() |
|
205 |
||
206 |
def config_id(self): |
|
207 |
"""Returns a unique ID for the config."""
|
|
208 |
raise NotImplementedError(self.config_id) |
|
209 |
||
210 |
def get_change_editor(self, old_tree, new_tree): |
|
211 |
from bzrlib import diff |
|
212 |
cmd = self._get_change_editor() |
|
213 |
if cmd is None: |
|
214 |
return None |
|
215 |
return diff.DiffFromTool.from_string(cmd, old_tree, new_tree, |
|
216 |
sys.stdout) |
|
217 |
||
218 |
def _get_signature_checking(self): |
|
219 |
"""Template method to override signature checking policy."""
|
|
220 |
||
221 |
def _get_signing_policy(self): |
|
222 |
"""Template method to override signature creation policy."""
|
|
223 |
||
5676.1.4
by Jelmer Vernooij
merge bzr.dev. |
224 |
option_ref_re = None |
225 |
||
226 |
def expand_options(self, string, env=None): |
|
227 |
"""Expand option references in the string in the configuration context.
|
|
228 |
||
229 |
:param string: The string containing option to expand.
|
|
230 |
||
231 |
:param env: An option dict defining additional configuration options or
|
|
232 |
overriding existing ones.
|
|
233 |
||
234 |
:returns: The expanded string.
|
|
235 |
"""
|
|
236 |
return self._expand_options_in_string(string, env) |
|
237 |
||
238 |
def _expand_options_in_list(self, slist, env=None, _ref_stack=None): |
|
239 |
"""Expand options in a list of strings in the configuration context.
|
|
240 |
||
241 |
:param slist: A list of strings.
|
|
242 |
||
243 |
:param env: An option dict defining additional configuration options or
|
|
244 |
overriding existing ones.
|
|
245 |
||
246 |
:param _ref_stack: Private list containing the options being
|
|
247 |
expanded to detect loops.
|
|
248 |
||
249 |
:returns: The flatten list of expanded strings.
|
|
250 |
"""
|
|
251 |
# expand options in each value separately flattening lists
|
|
252 |
result = [] |
|
253 |
for s in slist: |
|
254 |
value = self._expand_options_in_string(s, env, _ref_stack) |
|
255 |
if isinstance(value, list): |
|
256 |
result.extend(value) |
|
257 |
else: |
|
258 |
result.append(value) |
|
259 |
return result |
|
260 |
||
261 |
def _expand_options_in_string(self, string, env=None, _ref_stack=None): |
|
262 |
"""Expand options in the string in the configuration context.
|
|
263 |
||
264 |
:param string: The string to be expanded.
|
|
265 |
||
266 |
:param env: An option dict defining additional configuration options or
|
|
267 |
overriding existing ones.
|
|
268 |
||
269 |
:param _ref_stack: Private list containing the options being
|
|
270 |
expanded to detect loops.
|
|
271 |
||
272 |
:returns: The expanded string.
|
|
273 |
"""
|
|
274 |
if string is None: |
|
275 |
# Not much to expand there
|
|
276 |
return None |
|
277 |
if _ref_stack is None: |
|
278 |
# What references are currently resolved (to detect loops)
|
|
279 |
_ref_stack = [] |
|
280 |
if self.option_ref_re is None: |
|
281 |
# We want to match the most embedded reference first (i.e. for
|
|
282 |
# '{{foo}}' we will get '{foo}',
|
|
283 |
# for '{bar{baz}}' we will get '{baz}'
|
|
284 |
self.option_ref_re = re.compile('({[^{}]+})') |
|
285 |
result = string |
|
286 |
# We need to iterate until no more refs appear ({{foo}} will need two
|
|
287 |
# iterations for example).
|
|
288 |
while True: |
|
5745.1.1
by Vincent Ladeuil
Remove debug code |
289 |
raw_chunks = self.option_ref_re.split(result) |
5676.1.4
by Jelmer Vernooij
merge bzr.dev. |
290 |
if len(raw_chunks) == 1: |
291 |
# Shorcut the trivial case: no refs
|
|
292 |
return result |
|
293 |
chunks = [] |
|
294 |
list_value = False |
|
295 |
# Split will isolate refs so that every other chunk is a ref
|
|
296 |
chunk_is_ref = False |
|
297 |
for chunk in raw_chunks: |
|
298 |
if not chunk_is_ref: |
|
299 |
if chunk: |
|
300 |
# Keep only non-empty strings (or we get bogus empty
|
|
301 |
# slots when a list value is involved).
|
|
302 |
chunks.append(chunk) |
|
303 |
chunk_is_ref = True |
|
304 |
else: |
|
305 |
name = chunk[1:-1] |
|
306 |
if name in _ref_stack: |
|
307 |
raise errors.OptionExpansionLoop(string, _ref_stack) |
|
308 |
_ref_stack.append(name) |
|
309 |
value = self._expand_option(name, env, _ref_stack) |
|
310 |
if value is None: |
|
311 |
raise errors.ExpandingUnknownOption(name, string) |
|
312 |
if isinstance(value, list): |
|
313 |
list_value = True |
|
314 |
chunks.extend(value) |
|
315 |
else: |
|
316 |
chunks.append(value) |
|
317 |
_ref_stack.pop() |
|
318 |
chunk_is_ref = False |
|
319 |
if list_value: |
|
320 |
# Once a list appears as the result of an expansion, all
|
|
321 |
# callers will get a list result. This allows a consistent
|
|
322 |
# behavior even when some options in the expansion chain
|
|
323 |
# defined as strings (no comma in their value) but their
|
|
324 |
# expanded value is a list.
|
|
325 |
return self._expand_options_in_list(chunks, env, _ref_stack) |
|
326 |
else: |
|
327 |
result = ''.join(chunks) |
|
328 |
return result |
|
329 |
||
330 |
def _expand_option(self, name, env, _ref_stack): |
|
331 |
if env is not None and name in env: |
|
332 |
# Special case, values provided in env takes precedence over
|
|
333 |
# anything else
|
|
334 |
value = env[name] |
|
335 |
else: |
|
336 |
# FIXME: This is a limited implementation, what we really need is a
|
|
337 |
# way to query the bzr config for the value of an option,
|
|
338 |
# respecting the scope rules (That is, once we implement fallback
|
|
339 |
# configs, getting the option value should restart from the top
|
|
340 |
# config, not the current one) -- vila 20101222
|
|
341 |
value = self.get_user_option(name, expand=False) |
|
342 |
if isinstance(value, list): |
|
343 |
value = self._expand_options_in_list(value, env, _ref_stack) |
|
344 |
else: |
|
345 |
value = self._expand_options_in_string(value, env, _ref_stack) |
|
346 |
return value |
|
347 |
||
1993.3.6
by James Henstridge
get rid of the recurse argument to get_user_option() |
348 |
def _get_user_option(self, option_name): |
1442.1.69
by Robert Collins
config.Config has a 'get_user_option' call that accepts an option name. |
349 |
"""Template method to provide a user option."""
|
350 |
return None |
|
351 |
||
6468.5.1
by Vincent Ladeuil
Change default for ``bzr.config.expand`` to True |
352 |
def get_user_option(self, option_name, expand=True): |
5676.1.4
by Jelmer Vernooij
merge bzr.dev. |
353 |
"""Get a generic option - no special process, no default.
|
354 |
||
355 |
:param option_name: The queried option.
|
|
356 |
||
357 |
:param expand: Whether options references should be expanded.
|
|
358 |
||
359 |
:returns: The value of the option.
|
|
360 |
"""
|
|
361 |
value = self._get_user_option(option_name) |
|
362 |
if expand: |
|
363 |
if isinstance(value, list): |
|
364 |
value = self._expand_options_in_list(value) |
|
365 |
elif isinstance(value, dict): |
|
366 |
trace.warning('Cannot expand "%s":' |
|
367 |
' Dicts do not support option expansion'
|
|
368 |
% (option_name,)) |
|
369 |
else: |
|
370 |
value = self._expand_options_in_string(value) |
|
5743.8.24
by Vincent Ladeuil
Clearly seaparate both sets of hooks for the old and new config implementations. |
371 |
for hook in OldConfigHooks['get']: |
5743.8.25
by Vincent Ladeuil
Fix spurious spaces. |
372 |
hook(self, option_name, value) |
5676.1.4
by Jelmer Vernooij
merge bzr.dev. |
373 |
return value |
374 |
||
5425.4.14
by Martin Pool
Allow get_user_option_as_bool to take a default |
375 |
def get_user_option_as_bool(self, option_name, expand=None, default=None): |
376 |
"""Get a generic option as a boolean.
|
|
4503.2.2
by Vincent Ladeuil
Get a bool or none from a config file. |
377 |
|
5425.4.14
by Martin Pool
Allow get_user_option_as_bool to take a default |
378 |
:param expand: Allow expanding references to other config values.
|
379 |
:param default: Default value if nothing is configured
|
|
4503.2.2
by Vincent Ladeuil
Get a bool or none from a config file. |
380 |
:return None if the option doesn't exist or its value can't be
|
4840.2.4
by Vincent Ladeuil
Implement config.get_user_option_as_list. |
381 |
interpreted as a boolean. Returns True or False otherwise.
|
4503.2.2
by Vincent Ladeuil
Get a bool or none from a config file. |
382 |
"""
|
5676.1.4
by Jelmer Vernooij
merge bzr.dev. |
383 |
s = self.get_user_option(option_name, expand=expand) |
4989.2.12
by Vincent Ladeuil
Display a warning if an option value is not boolean. |
384 |
if s is None: |
385 |
# The option doesn't exist
|
|
5425.4.14
by Martin Pool
Allow get_user_option_as_bool to take a default |
386 |
return default |
4989.2.15
by Vincent Ladeuil
Fixed as per Andrew's review. |
387 |
val = ui.bool_from_string(s) |
4989.2.12
by Vincent Ladeuil
Display a warning if an option value is not boolean. |
388 |
if val is None: |
389 |
# The value can't be interpreted as a boolean
|
|
390 |
trace.warning('Value "%s" is not a boolean for "%s"', |
|
391 |
s, option_name) |
|
392 |
return val |
|
4503.2.2
by Vincent Ladeuil
Get a bool or none from a config file. |
393 |
|
5676.1.4
by Jelmer Vernooij
merge bzr.dev. |
394 |
def get_user_option_as_list(self, option_name, expand=None): |
4840.2.4
by Vincent Ladeuil
Implement config.get_user_option_as_list. |
395 |
"""Get a generic option as a list - no special process, no default.
|
396 |
||
397 |
:return None if the option doesn't exist. Returns the value as a list
|
|
398 |
otherwise.
|
|
399 |
"""
|
|
5676.1.4
by Jelmer Vernooij
merge bzr.dev. |
400 |
l = self.get_user_option(option_name, expand=expand) |
4840.2.4
by Vincent Ladeuil
Implement config.get_user_option_as_list. |
401 |
if isinstance(l, (str, unicode)): |
5676.1.4
by Jelmer Vernooij
merge bzr.dev. |
402 |
# A single value, most probably the user forgot (or didn't care to
|
403 |
# add) the final ','
|
|
4840.2.4
by Vincent Ladeuil
Implement config.get_user_option_as_list. |
404 |
l = [l] |
405 |
return l |
|
6371.1.1
by Jelmer Vernooij
Fix some whitespace in bzrlib.config. |
406 |
|
6378.1.2
by Vincent Ladeuil
Migrate add.maximum_file_size to the new config scheme |
407 |
@deprecated_method(deprecated_in((2, 5, 0))) |
6351.3.3
by Jelmer Vernooij
Convert more stuff to use config stacks. |
408 |
def get_user_option_as_int_from_SI(self, option_name, default=None): |
6046.2.3
by Shannon Weyrick
Add get_user_option_as_int_from_SI, for retrieving an integer |
409 |
"""Get a generic option from a human readable size in SI units, e.g 10MB
|
6371.1.1
by Jelmer Vernooij
Fix some whitespace in bzrlib.config. |
410 |
|
6046.2.3
by Shannon Weyrick
Add get_user_option_as_int_from_SI, for retrieving an integer |
411 |
Accepted suffixes are K,M,G. It is case-insensitive and may be followed
|
412 |
by a trailing b (i.e. Kb, MB). This is intended to be practical and not
|
|
413 |
pedantic.
|
|
6371.1.1
by Jelmer Vernooij
Fix some whitespace in bzrlib.config. |
414 |
|
6046.2.3
by Shannon Weyrick
Add get_user_option_as_int_from_SI, for retrieving an integer |
415 |
:return Integer, expanded to its base-10 value if a proper SI unit is
|
416 |
found. If the option doesn't exist, or isn't a value in
|
|
417 |
SI units, return default (which defaults to None)
|
|
418 |
"""
|
|
419 |
val = self.get_user_option(option_name) |
|
420 |
if isinstance(val, list): |
|
421 |
val = val[0] |
|
422 |
if val is None: |
|
423 |
val = default |
|
424 |
else: |
|
425 |
p = re.compile("^(\d+)([kmg])*b*$", re.IGNORECASE) |
|
426 |
try: |
|
427 |
m = p.match(val) |
|
428 |
if m is not None: |
|
429 |
val = int(m.group(1)) |
|
430 |
if m.group(2) is not None: |
|
431 |
if m.group(2).lower() == 'k': |
|
432 |
val *= 10**3 |
|
433 |
elif m.group(2).lower() == 'm': |
|
434 |
val *= 10**6 |
|
435 |
elif m.group(2).lower() == 'g': |
|
436 |
val *= 10**9 |
|
437 |
else: |
|
6138.3.10
by Jonathan Riddell
gettext() show_warning usage |
438 |
ui.ui_factory.show_warning(gettext('Invalid config value for "{0}" ' |
439 |
' value {1!r} is not an SI unit.').format( |
|
440 |
option_name, val)) |
|
6046.2.3
by Shannon Weyrick
Add get_user_option_as_int_from_SI, for retrieving an integer |
441 |
val = default |
6046.2.8
by Shannon Weyrick
Minor cleanup |
442 |
except TypeError: |
6046.2.3
by Shannon Weyrick
Add get_user_option_as_int_from_SI, for retrieving an integer |
443 |
val = default |
444 |
return val |
|
4840.2.4
by Vincent Ladeuil
Implement config.get_user_option_as_list. |
445 |
|
6351.3.1
by Jelmer Vernooij
Add gpg_signing_command option to registry. |
446 |
@deprecated_method(deprecated_in((2, 5, 0))) |
1442.1.56
by Robert Collins
gpg_signing_command configuration item |
447 |
def gpg_signing_command(self): |
448 |
"""What program should be used to sign signatures?"""
|
|
1442.1.59
by Robert Collins
Add re-sign command to generate a digital signature on a single revision. |
449 |
result = self._gpg_signing_command() |
450 |
if result is None: |
|
451 |
result = "gpg" |
|
452 |
return result |
|
453 |
||
454 |
def _gpg_signing_command(self): |
|
455 |
"""See gpg_signing_command()."""
|
|
456 |
return None |
|
1442.1.56
by Robert Collins
gpg_signing_command configuration item |
457 |
|
6378.1.3
by Vincent Ladeuil
log_format has been migrated but the old config method needs to be deprecated. |
458 |
@deprecated_method(deprecated_in((2, 5, 0))) |
1553.2.9
by Erik Bågfors
log_formatter => log_format for "named" formatters |
459 |
def log_format(self): |
460 |
"""What log format should be used"""
|
|
461 |
result = self._log_format() |
|
1553.2.4
by Erik Bågfors
Support for setting the default log format at a configuration option |
462 |
if result is None: |
463 |
result = "long" |
|
464 |
return result |
|
465 |
||
1553.2.9
by Erik Bågfors
log_formatter => log_format for "named" formatters |
466 |
def _log_format(self): |
467 |
"""See log_format()."""
|
|
1553.2.4
by Erik Bågfors
Support for setting the default log format at a configuration option |
468 |
return None |
469 |
||
5971.1.55
by Jonathan Riddell
add a config option to validate signatures |
470 |
def validate_signatures_in_log(self): |
471 |
"""Show GPG signature validity in log"""
|
|
472 |
result = self._validate_signatures_in_log() |
|
473 |
if result == "true": |
|
474 |
result = True |
|
475 |
else: |
|
476 |
result = False |
|
477 |
return result |
|
478 |
||
479 |
def _validate_signatures_in_log(self): |
|
480 |
"""See validate_signatures_in_log()."""
|
|
481 |
return None |
|
482 |
||
6351.3.2
by Jelmer Vernooij
Convert some gpg options to config stacks. |
483 |
@deprecated_method(deprecated_in((2, 5, 0))) |
5971.1.56
by Jonathan Riddell
add an option for acceptable_keys in config, also make config docs match reality for signature options |
484 |
def acceptable_keys(self): |
485 |
"""Comma separated list of key patterns acceptable to
|
|
486 |
verify-signatures command"""
|
|
487 |
result = self._acceptable_keys() |
|
488 |
return result |
|
489 |
||
490 |
def _acceptable_keys(self): |
|
491 |
"""See acceptable_keys()."""
|
|
492 |
return None |
|
493 |
||
6351.4.3
by Jelmer Vernooij
Review feedback from Vila. |
494 |
@deprecated_method(deprecated_in((2, 5, 0))) |
1472
by Robert Collins
post commit hook, first pass implementation |
495 |
def post_commit(self): |
496 |
"""An ordered list of python functions to call.
|
|
497 |
||
498 |
Each function takes branch, rev_id as parameters.
|
|
499 |
"""
|
|
500 |
return self._post_commit() |
|
501 |
||
502 |
def _post_commit(self): |
|
503 |
"""See Config.post_commit."""
|
|
504 |
return None |
|
505 |
||
1442.1.6
by Robert Collins
first stage major overhaul of configs, giving use BranchConfigs, LocationConfigs and GlobalConfigs |
506 |
def user_email(self): |
507 |
"""Return just the email component of a username."""
|
|
1185.33.31
by Martin Pool
Make annotate cope better with revisions committed without a valid |
508 |
return extract_email_address(self.username()) |
1442.1.6
by Robert Collins
first stage major overhaul of configs, giving use BranchConfigs, LocationConfigs and GlobalConfigs |
509 |
|
510 |
def username(self): |
|
511 |
"""Return email-style username.
|
|
3943.8.1
by Marius Kruger
remove all trailing whitespace from bzr source |
512 |
|
1442.1.6
by Robert Collins
first stage major overhaul of configs, giving use BranchConfigs, LocationConfigs and GlobalConfigs |
513 |
Something similar to 'Martin Pool <mbp@sourcefrog.net>'
|
3943.8.1
by Marius Kruger
remove all trailing whitespace from bzr source |
514 |
|
5187.2.1
by Parth Malwankar
removed comment about deprecated BZREMAIL. |
515 |
$BZR_EMAIL can be set to override this, then
|
1442.1.6
by Robert Collins
first stage major overhaul of configs, giving use BranchConfigs, LocationConfigs and GlobalConfigs |
516 |
the concrete policy type is checked, and finally
|
1185.37.2
by Jamie Wilkinson
Fix a typo and grammar in Config.username() docstring. |
517 |
$EMAIL is examined.
|
5187.2.12
by Parth Malwankar
trivial clarification in docstring. |
518 |
If no username can be found, errors.NoWhoami exception is raised.
|
1442.1.6
by Robert Collins
first stage major overhaul of configs, giving use BranchConfigs, LocationConfigs and GlobalConfigs |
519 |
"""
|
1861.4.1
by Matthieu Moy
BZREMAIL renamed to BZR_EMAIL. |
520 |
v = os.environ.get('BZR_EMAIL') |
521 |
if v: |
|
3224.5.4
by Andrew Bennetts
Fix test suite, mainly weeding out uses of bzrlib.user_encoding. |
522 |
return v.decode(osutils.get_user_encoding()) |
1442.1.6
by Robert Collins
first stage major overhaul of configs, giving use BranchConfigs, LocationConfigs and GlobalConfigs |
523 |
v = self._get_user_id() |
524 |
if v: |
|
525 |
return v |
|
6351.4.3
by Jelmer Vernooij
Review feedback from Vila. |
526 |
return default_email() |
5187.2.3
by Parth Malwankar
init and init-repo now fail before creating dir if username is not set. |
527 |
|
528 |
def ensure_username(self): |
|
5187.2.11
by Parth Malwankar
documentation updates |
529 |
"""Raise errors.NoWhoami if username is not set.
|
5187.2.3
by Parth Malwankar
init and init-repo now fail before creating dir if username is not set. |
530 |
|
531 |
This method relies on the username() function raising the error.
|
|
532 |
"""
|
|
533 |
self.username() |
|
1442.1.6
by Robert Collins
first stage major overhaul of configs, giving use BranchConfigs, LocationConfigs and GlobalConfigs |
534 |
|
6351.3.2
by Jelmer Vernooij
Convert some gpg options to config stacks. |
535 |
@deprecated_method(deprecated_in((2, 5, 0))) |
1442.1.14
by Robert Collins
Create a default signature checking policy of CHECK_IF_POSSIBLE |
536 |
def signature_checking(self): |
537 |
"""What is the current policy for signature checking?."""
|
|
1442.1.15
by Robert Collins
make getting the signature checking policy a template method |
538 |
policy = self._get_signature_checking() |
539 |
if policy is not None: |
|
540 |
return policy |
|
1442.1.14
by Robert Collins
Create a default signature checking policy of CHECK_IF_POSSIBLE |
541 |
return CHECK_IF_POSSIBLE |
1442.1.6
by Robert Collins
first stage major overhaul of configs, giving use BranchConfigs, LocationConfigs and GlobalConfigs |
542 |
|
6351.3.2
by Jelmer Vernooij
Convert some gpg options to config stacks. |
543 |
@deprecated_method(deprecated_in((2, 5, 0))) |
1770.2.1
by Aaron Bentley
Use create_signature for signing policy, deprecate check_signatures for this |
544 |
def signing_policy(self): |
545 |
"""What is the current policy for signature checking?."""
|
|
546 |
policy = self._get_signing_policy() |
|
547 |
if policy is not None: |
|
548 |
return policy |
|
549 |
return SIGN_WHEN_REQUIRED |
|
550 |
||
6351.3.2
by Jelmer Vernooij
Convert some gpg options to config stacks. |
551 |
@deprecated_method(deprecated_in((2, 5, 0))) |
1442.1.21
by Robert Collins
create signature_needed() call for commit to trigger creating signatures |
552 |
def signature_needed(self): |
553 |
"""Is a signature needed when committing ?."""
|
|
1770.2.1
by Aaron Bentley
Use create_signature for signing policy, deprecate check_signatures for this |
554 |
policy = self._get_signing_policy() |
555 |
if policy is None: |
|
556 |
policy = self._get_signature_checking() |
|
557 |
if policy is not None: |
|
5967.3.2
by Jonathan Riddell
do not treat 'check_signatures = require' as if it were 'create_signatures = always', this is confusing and wrong |
558 |
#this warning should go away once check_signatures is
|
559 |
#implemented (if not before)
|
|
2900.2.10
by Vincent Ladeuil
Add -Dauth handling. |
560 |
trace.warning("Please use create_signatures," |
561 |
" not check_signatures to set signing policy.") |
|
1770.2.1
by Aaron Bentley
Use create_signature for signing policy, deprecate check_signatures for this |
562 |
elif policy == SIGN_ALWAYS: |
1442.1.21
by Robert Collins
create signature_needed() call for commit to trigger creating signatures |
563 |
return True |
564 |
return False |
|
565 |
||
6351.3.2
by Jelmer Vernooij
Convert some gpg options to config stacks. |
566 |
@deprecated_method(deprecated_in((2, 5, 0))) |
6012.2.11
by Jonathan Riddell
rename config option signing_key to gpg_signing_key |
567 |
def gpg_signing_key(self): |
6012.2.3
by Jonathan Riddell
add config option for signing key |
568 |
"""GPG user-id to sign commits"""
|
6012.2.12
by Jonathan Riddell
use get_user_option so you don't have to define special methods |
569 |
key = self.get_user_option('gpg_signing_key') |
6012.2.4
by Jonathan Riddell
set default for signing_key to user_email |
570 |
if key == "default" or key == None: |
571 |
return self.user_email() |
|
6012.2.3
by Jonathan Riddell
add config option for signing key |
572 |
else: |
573 |
return key |
|
574 |
||
1553.6.12
by Erik Bågfors
remove AliasConfig, based on input from abentley |
575 |
def get_alias(self, value): |
576 |
return self._get_alias(value) |
|
577 |
||
578 |
def _get_alias(self, value): |
|
579 |
pass
|
|
580 |
||
1770.2.7
by Aaron Bentley
Set/get nickname using BranchConfig |
581 |
def get_nickname(self): |
582 |
return self._get_nickname() |
|
583 |
||
584 |
def _get_nickname(self): |
|
585 |
return None |
|
586 |
||
1551.18.17
by Aaron Bentley
Introduce bzr_remote_path configuration variable |
587 |
def get_bzr_remote_path(self): |
588 |
try: |
|
589 |
return os.environ['BZR_REMOTE_PATH'] |
|
590 |
except KeyError: |
|
591 |
path = self.get_user_option("bzr_remote_path") |
|
592 |
if path is None: |
|
593 |
path = 'bzr' |
|
594 |
return path |
|
595 |
||
4840.2.6
by Vincent Ladeuil
Implement config.suppress_warning. |
596 |
def suppress_warning(self, warning): |
597 |
"""Should the warning be suppressed or emitted.
|
|
598 |
||
599 |
:param warning: The name of the warning being tested.
|
|
600 |
||
601 |
:returns: True if the warning should be suppressed, False otherwise.
|
|
602 |
"""
|
|
603 |
warnings = self.get_user_option_as_list('suppress_warnings') |
|
604 |
if warnings is None or warning not in warnings: |
|
605 |
return False |
|
606 |
else: |
|
607 |
return True |
|
608 |
||
5321.1.88
by Gordon Tyler
Moved mergetools config functions into bzrlib.config.Config. |
609 |
def get_merge_tools(self): |
5321.1.108
by Gordon Tyler
Changed known merge tools into a default set of merge tools that are always defined but can be overridden by user-defined merge tools. |
610 |
tools = {} |
5321.1.99
by Gordon Tyler
Fixes for changes to Config._get_options(). |
611 |
for (oname, value, section, conf_id, parser) in self._get_options(): |
5321.2.3
by Vincent Ladeuil
Prefix mergetools option names with 'bzr.'. |
612 |
if oname.startswith('bzr.mergetool.'): |
5321.1.108
by Gordon Tyler
Changed known merge tools into a default set of merge tools that are always defined but can be overridden by user-defined merge tools. |
613 |
tool_name = oname[len('bzr.mergetool.'):] |
6468.5.1
by Vincent Ladeuil
Change default for ``bzr.config.expand`` to True |
614 |
tools[tool_name] = self.get_user_option(oname, False) |
5321.1.88
by Gordon Tyler
Moved mergetools config functions into bzrlib.config.Config. |
615 |
trace.mutter('loaded merge tools: %r' % tools) |
5321.1.116
by Gordon Tyler
Simplified mergetools module down to functions which deal with command lines -- no MergeTool class. |
616 |
return tools |
5321.1.88
by Gordon Tyler
Moved mergetools config functions into bzrlib.config.Config. |
617 |
|
5321.1.103
by Gordon Tyler
Renamed _find_merge_tool back to find_merge_tool since it must be public for UI code to lookup merge tools by name, and added tests for it. |
618 |
def find_merge_tool(self, name): |
5967.3.6
by Jonathan Riddell
use example.com for e-mails, make bzrlib/config.py pep8 happy |
619 |
# We fake a defaults mechanism here by checking if the given name can
|
5321.1.111
by Gordon Tyler
Remove predefined merge tools from list returned by get_merge_tools. |
620 |
# be found in the known_merge_tools if it's not found in the config.
|
621 |
# This should be done through the proposed config defaults mechanism
|
|
622 |
# when it becomes available in the future.
|
|
5676.1.4
by Jelmer Vernooij
merge bzr.dev. |
623 |
command_line = (self.get_user_option('bzr.mergetool.%s' % name, |
624 |
expand=False) |
|
625 |
or mergetools.known_merge_tools.get(name, None)) |
|
5321.1.116
by Gordon Tyler
Simplified mergetools module down to functions which deal with command lines -- no MergeTool class. |
626 |
return command_line |
5321.1.88
by Gordon Tyler
Moved mergetools config functions into bzrlib.config.Config. |
627 |
|
1442.1.15
by Robert Collins
make getting the signature checking policy a template method |
628 |
|
5743.8.10
by Vincent Ladeuil
We don't need (nor want) to tie the config hooks to a particular class. Especially when we want to use the same hooks on both implementations. |
629 |
class _ConfigHooks(hooks.Hooks): |
630 |
"""A dict mapping hook names and a list of callables for configs.
|
|
631 |
"""
|
|
632 |
||
633 |
def __init__(self): |
|
634 |
"""Create the default hooks.
|
|
635 |
||
636 |
These are all empty initially, because by default nothing should get
|
|
637 |
notified.
|
|
638 |
"""
|
|
639 |
super(_ConfigHooks, self).__init__('bzrlib.config', 'ConfigHooks') |
|
640 |
self.add_hook('load', |
|
641 |
'Invoked when a config store is loaded.'
|
|
642 |
' The signature is (store).', |
|
643 |
(2, 4)) |
|
644 |
self.add_hook('save', |
|
645 |
'Invoked when a config store is saved.'
|
|
646 |
' The signature is (store).', |
|
647 |
(2, 4)) |
|
648 |
# The hooks for config options
|
|
649 |
self.add_hook('get', |
|
650 |
'Invoked when a config option is read.'
|
|
651 |
' The signature is (stack, name, value).', |
|
652 |
(2, 4)) |
|
653 |
self.add_hook('set', |
|
654 |
'Invoked when a config option is set.'
|
|
655 |
' The signature is (stack, name, value).', |
|
656 |
(2, 4)) |
|
657 |
self.add_hook('remove', |
|
658 |
'Invoked when a config option is removed.'
|
|
659 |
' The signature is (stack, name).', |
|
660 |
(2, 4)) |
|
5743.8.24
by Vincent Ladeuil
Clearly seaparate both sets of hooks for the old and new config implementations. |
661 |
ConfigHooks = _ConfigHooks() |
662 |
||
663 |
||
664 |
class _OldConfigHooks(hooks.Hooks): |
|
665 |
"""A dict mapping hook names and a list of callables for configs.
|
|
666 |
"""
|
|
667 |
||
668 |
def __init__(self): |
|
669 |
"""Create the default hooks.
|
|
670 |
||
671 |
These are all empty initially, because by default nothing should get
|
|
672 |
notified.
|
|
673 |
"""
|
|
674 |
super(_OldConfigHooks, self).__init__('bzrlib.config', 'OldConfigHooks') |
|
675 |
self.add_hook('load', |
|
5743.8.14
by Vincent Ladeuil
Separate the hooks for old and new config implementations instead of cheating like crazy. |
676 |
'Invoked when a config store is loaded.'
|
677 |
' The signature is (config).', |
|
678 |
(2, 4)) |
|
5743.8.24
by Vincent Ladeuil
Clearly seaparate both sets of hooks for the old and new config implementations. |
679 |
self.add_hook('save', |
5743.8.14
by Vincent Ladeuil
Separate the hooks for old and new config implementations instead of cheating like crazy. |
680 |
'Invoked when a config store is saved.'
|
681 |
' The signature is (config).', |
|
682 |
(2, 4)) |
|
683 |
# The hooks for config options
|
|
5743.8.24
by Vincent Ladeuil
Clearly seaparate both sets of hooks for the old and new config implementations. |
684 |
self.add_hook('get', |
5743.8.14
by Vincent Ladeuil
Separate the hooks for old and new config implementations instead of cheating like crazy. |
685 |
'Invoked when a config option is read.'
|
686 |
' The signature is (config, name, value).', |
|
687 |
(2, 4)) |
|
5743.8.24
by Vincent Ladeuil
Clearly seaparate both sets of hooks for the old and new config implementations. |
688 |
self.add_hook('set', |
5743.8.14
by Vincent Ladeuil
Separate the hooks for old and new config implementations instead of cheating like crazy. |
689 |
'Invoked when a config option is set.'
|
690 |
' The signature is (config, name, value).', |
|
691 |
(2, 4)) |
|
5743.8.24
by Vincent Ladeuil
Clearly seaparate both sets of hooks for the old and new config implementations. |
692 |
self.add_hook('remove', |
5743.8.14
by Vincent Ladeuil
Separate the hooks for old and new config implementations instead of cheating like crazy. |
693 |
'Invoked when a config option is removed.'
|
694 |
' The signature is (config, name).', |
|
695 |
(2, 4)) |
|
5743.8.24
by Vincent Ladeuil
Clearly seaparate both sets of hooks for the old and new config implementations. |
696 |
OldConfigHooks = _OldConfigHooks() |
5743.8.10
by Vincent Ladeuil
We don't need (nor want) to tie the config hooks to a particular class. Especially when we want to use the same hooks on both implementations. |
697 |
|
698 |
||
1442.1.18
by Robert Collins
permit per branch location overriding of signature checking policy |
699 |
class IniBasedConfig(Config): |
700 |
"""A configuration policy that draws from ini files."""
|
|
1442.1.6
by Robert Collins
first stage major overhaul of configs, giving use BranchConfigs, LocationConfigs and GlobalConfigs |
701 |
|
5345.1.1
by Vincent Ladeuil
Deprecate the get_filename parameter in IniBasedConfig. |
702 |
def __init__(self, get_filename=symbol_versioning.DEPRECATED_PARAMETER, |
5345.2.8
by Vincent Ladeuil
Introduce a 'from_bytes' constructor for config objects. |
703 |
file_name=None): |
5345.2.5
by Vincent Ladeuil
Add docstring. |
704 |
"""Base class for configuration files using an ini-like syntax.
|
705 |
||
706 |
:param file_name: The configuration file path.
|
|
707 |
"""
|
|
4503.2.2
by Vincent Ladeuil
Get a bool or none from a config file. |
708 |
super(IniBasedConfig, self).__init__() |
5345.1.8
by Vincent Ladeuil
Make the test_listen_to_the_last_speaker pass and fix fallouts. |
709 |
self.file_name = file_name |
5345.1.1
by Vincent Ladeuil
Deprecate the get_filename parameter in IniBasedConfig. |
710 |
if symbol_versioning.deprecated_passed(get_filename): |
711 |
symbol_versioning.warn( |
|
712 |
'IniBasedConfig.__init__(get_filename) was deprecated in 2.3.'
|
|
713 |
' Use file_name instead.', |
|
714 |
DeprecationWarning, |
|
715 |
stacklevel=2) |
|
5345.1.8
by Vincent Ladeuil
Make the test_listen_to_the_last_speaker pass and fix fallouts. |
716 |
if get_filename is not None: |
5345.1.1
by Vincent Ladeuil
Deprecate the get_filename parameter in IniBasedConfig. |
717 |
self.file_name = get_filename() |
718 |
else: |
|
719 |
self.file_name = file_name |
|
5345.2.8
by Vincent Ladeuil
Introduce a 'from_bytes' constructor for config objects. |
720 |
self._content = None |
4503.2.2
by Vincent Ladeuil
Get a bool or none from a config file. |
721 |
self._parser = None |
722 |
||
5345.2.8
by Vincent Ladeuil
Introduce a 'from_bytes' constructor for config objects. |
723 |
@classmethod
|
5345.1.26
by Vincent Ladeuil
Merge lockable-config-files into remove-gratuitous-ensure-config-dir-exist-calls resolving conflicts |
724 |
def from_string(cls, str_or_unicode, file_name=None, save=False): |
5345.5.13
by Vincent Ladeuil
Merge simplify-test-config-building into lockable-config-files resolving conflicts |
725 |
"""Create a config object from a string.
|
5345.2.8
by Vincent Ladeuil
Introduce a 'from_bytes' constructor for config objects. |
726 |
|
5345.2.9
by Vincent Ladeuil
Rename IniBaseConfig.from_bytes to from_string. |
727 |
:param str_or_unicode: A string representing the file content. This will
|
5345.2.8
by Vincent Ladeuil
Introduce a 'from_bytes' constructor for config objects. |
728 |
be utf-8 encoded.
|
5345.1.25
by Vincent Ladeuil
Move the '_save' parameter from '__init__' to 'from_bytes', fix fallouts. |
729 |
|
730 |
:param file_name: The configuration file path.
|
|
731 |
||
732 |
:param _save: Whether the file should be saved upon creation.
|
|
5345.2.8
by Vincent Ladeuil
Introduce a 'from_bytes' constructor for config objects. |
733 |
"""
|
5345.1.25
by Vincent Ladeuil
Move the '_save' parameter from '__init__' to 'from_bytes', fix fallouts. |
734 |
conf = cls(file_name=file_name) |
5345.1.26
by Vincent Ladeuil
Merge lockable-config-files into remove-gratuitous-ensure-config-dir-exist-calls resolving conflicts |
735 |
conf._create_from_string(str_or_unicode, save) |
5345.2.8
by Vincent Ladeuil
Introduce a 'from_bytes' constructor for config objects. |
736 |
return conf |
737 |
||
5345.1.26
by Vincent Ladeuil
Merge lockable-config-files into remove-gratuitous-ensure-config-dir-exist-calls resolving conflicts |
738 |
def _create_from_string(self, str_or_unicode, save): |
5345.5.13
by Vincent Ladeuil
Merge simplify-test-config-building into lockable-config-files resolving conflicts |
739 |
self._content = StringIO(str_or_unicode.encode('utf-8')) |
5345.1.16
by Vincent Ladeuil
Allows tests to save the config file at build time. |
740 |
# Some tests use in-memory configs, some other always need the config
|
741 |
# file to exist on disk.
|
|
5345.1.25
by Vincent Ladeuil
Move the '_save' parameter from '__init__' to 'from_bytes', fix fallouts. |
742 |
if save: |
5345.1.16
by Vincent Ladeuil
Allows tests to save the config file at build time. |
743 |
self._write_config_file() |
5345.5.12
by Vincent Ladeuil
Fix fallouts from replacing '_content' by 'from_bytes' for config files. |
744 |
|
5345.1.4
by Vincent Ladeuil
Deprecate the ``file`` parameter of the ``config._get_parser()`` method. |
745 |
def _get_parser(self, file=symbol_versioning.DEPRECATED_PARAMETER): |
1185.12.51
by Aaron Bentley
Allowed second call of _get_parser() to not require a file |
746 |
if self._parser is not None: |
747 |
return self._parser |
|
5345.1.4
by Vincent Ladeuil
Deprecate the ``file`` parameter of the ``config._get_parser()`` method. |
748 |
if symbol_versioning.deprecated_passed(file): |
749 |
symbol_versioning.warn( |
|
750 |
'IniBasedConfig._get_parser(file=xxx) was deprecated in 2.3.'
|
|
5345.1.5
by Vincent Ladeuil
Fix fallouts by slightly editing the tests. More refactoring avoided to keep the review light. |
751 |
' Use IniBasedConfig(_content=xxx) instead.', |
5345.1.4
by Vincent Ladeuil
Deprecate the ``file`` parameter of the ``config._get_parser()`` method. |
752 |
DeprecationWarning, |
753 |
stacklevel=2) |
|
754 |
if self._content is not None: |
|
755 |
co_input = self._content |
|
756 |
elif self.file_name is None: |
|
757 |
raise AssertionError('We have no content to create the config') |
|
1442.1.6
by Robert Collins
first stage major overhaul of configs, giving use BranchConfigs, LocationConfigs and GlobalConfigs |
758 |
else: |
5345.1.4
by Vincent Ladeuil
Deprecate the ``file`` parameter of the ``config._get_parser()`` method. |
759 |
co_input = self.file_name |
1185.12.51
by Aaron Bentley
Allowed second call of _get_parser() to not require a file |
760 |
try: |
5345.1.4
by Vincent Ladeuil
Deprecate the ``file`` parameter of the ``config._get_parser()`` method. |
761 |
self._parser = ConfigObj(co_input, encoding='utf-8') |
1474
by Robert Collins
Merge from Aaron Bentley. |
762 |
except configobj.ConfigObjError, e: |
1185.12.51
by Aaron Bentley
Allowed second call of _get_parser() to not require a file |
763 |
raise errors.ParseConfigError(e.errors, e.config.filename) |
5987.1.4
by Vincent Ladeuil
Proper error messages for config files with content in non-utf encoding or that cannot be parsed |
764 |
except UnicodeDecodeError: |
765 |
raise errors.ConfigContentError(self.file_name) |
|
5345.5.1
by Vincent Ladeuil
Implement config.reload and make sure we have a file name when using it. |
766 |
# Make sure self.reload() will use the right file name
|
5345.1.8
by Vincent Ladeuil
Make the test_listen_to_the_last_speaker pass and fix fallouts. |
767 |
self._parser.filename = self.file_name |
5743.8.24
by Vincent Ladeuil
Clearly seaparate both sets of hooks for the old and new config implementations. |
768 |
for hook in OldConfigHooks['load']: |
5743.8.12
by Vincent Ladeuil
Fire config hooks for the actual implementation even if these calls should be deleted in the end. This will help the transition by providing *some* measurements. |
769 |
hook(self) |
1185.12.49
by Aaron Bentley
Switched to ConfigObj |
770 |
return self._parser |
1442.1.6
by Robert Collins
first stage major overhaul of configs, giving use BranchConfigs, LocationConfigs and GlobalConfigs |
771 |
|
5345.5.1
by Vincent Ladeuil
Implement config.reload and make sure we have a file name when using it. |
772 |
def reload(self): |
773 |
"""Reload the config file from disk."""
|
|
774 |
if self.file_name is None: |
|
775 |
raise AssertionError('We need a file name to reload the config') |
|
776 |
if self._parser is not None: |
|
777 |
self._parser.reload() |
|
5743.8.24
by Vincent Ladeuil
Clearly seaparate both sets of hooks for the old and new config implementations. |
778 |
for hook in ConfigHooks['load']: |
5743.8.12
by Vincent Ladeuil
Fire config hooks for the actual implementation even if these calls should be deleted in the end. This will help the transition by providing *some* measurements. |
779 |
hook(self) |
5345.5.1
by Vincent Ladeuil
Implement config.reload and make sure we have a file name when using it. |
780 |
|
1993.3.3
by James Henstridge
make _get_matching_sections() return (section, extra_path) tuples, and adjust other code to match |
781 |
def _get_matching_sections(self): |
782 |
"""Return an ordered list of (section_name, extra_path) pairs.
|
|
783 |
||
784 |
If the section contains inherited configuration, extra_path is
|
|
785 |
a string containing the additional path components.
|
|
786 |
"""
|
|
787 |
section = self._get_section() |
|
788 |
if section is not None: |
|
789 |
return [(section, '')] |
|
790 |
else: |
|
791 |
return [] |
|
792 |
||
1442.1.18
by Robert Collins
permit per branch location overriding of signature checking policy |
793 |
def _get_section(self): |
794 |
"""Override this to define the section used by the config."""
|
|
795 |
return "DEFAULT" |
|
796 |
||
5447.4.12
by Vincent Ladeuil
Turn get_options() and get_sections() into private methods because section handling is too messy and needs to be discussed and settled. |
797 |
def _get_sections(self, name=None): |
5447.4.4
by Vincent Ladeuil
Implement config.get_sections() to clarify how sections can be used. |
798 |
"""Returns an iterator of the sections specified by ``name``.
|
799 |
||
800 |
:param name: The section name. If None is supplied, the default
|
|
801 |
configurations are yielded.
|
|
802 |
||
5447.4.11
by Vincent Ladeuil
Implement ``bzr config --remove <option>``. |
803 |
:return: A tuple (name, section, config_id) for all sections that will
|
804 |
be walked by user_get_option() in the 'right' order. The first one
|
|
805 |
is where set_user_option() will update the value.
|
|
5447.4.4
by Vincent Ladeuil
Implement config.get_sections() to clarify how sections can be used. |
806 |
"""
|
807 |
parser = self._get_parser() |
|
808 |
if name is not None: |
|
5447.4.16
by Vincent Ladeuil
Use config_id instead of id as suggested by poolie. |
809 |
yield (name, parser[name], self.config_id()) |
5447.4.4
by Vincent Ladeuil
Implement config.get_sections() to clarify how sections can be used. |
810 |
else: |
811 |
# No section name has been given so we fallback to the configobj
|
|
812 |
# itself which holds the variables defined outside of any section.
|
|
5447.4.16
by Vincent Ladeuil
Use config_id instead of id as suggested by poolie. |
813 |
yield (None, parser, self.config_id()) |
5447.4.4
by Vincent Ladeuil
Implement config.get_sections() to clarify how sections can be used. |
814 |
|
5447.4.12
by Vincent Ladeuil
Turn get_options() and get_sections() into private methods because section handling is too messy and needs to be discussed and settled. |
815 |
def _get_options(self, sections=None): |
5447.4.3
by Vincent Ladeuil
Simplify code and design by only defining get_options() where relevant. |
816 |
"""Return an ordered list of (name, value, section, config_id) tuples.
|
817 |
||
818 |
All options are returned with their associated value and the section
|
|
819 |
they appeared in. ``config_id`` is a unique identifier for the
|
|
820 |
configuration file the option is defined in.
|
|
5447.4.1
by Vincent Ladeuil
Implement config.get_options_matching_regexp. |
821 |
|
822 |
:param sections: Default to ``_get_matching_sections`` if not
|
|
823 |
specified. This gives a better control to daughter classes about
|
|
5447.4.3
by Vincent Ladeuil
Simplify code and design by only defining get_options() where relevant. |
824 |
which sections should be searched. This is a list of (name,
|
825 |
configobj) tuples.
|
|
5447.4.1
by Vincent Ladeuil
Implement config.get_options_matching_regexp. |
826 |
"""
|
5447.4.3
by Vincent Ladeuil
Simplify code and design by only defining get_options() where relevant. |
827 |
opts = [] |
5447.4.1
by Vincent Ladeuil
Implement config.get_options_matching_regexp. |
828 |
if sections is None: |
829 |
parser = self._get_parser() |
|
830 |
sections = [] |
|
831 |
for (section_name, _) in self._get_matching_sections(): |
|
832 |
try: |
|
833 |
section = parser[section_name] |
|
834 |
except KeyError: |
|
835 |
# This could happen for an empty file for which we define a
|
|
836 |
# DEFAULT section. FIXME: Force callers to provide sections
|
|
837 |
# instead ? -- vila 20100930
|
|
838 |
continue
|
|
839 |
sections.append((section_name, section)) |
|
5447.4.16
by Vincent Ladeuil
Use config_id instead of id as suggested by poolie. |
840 |
config_id = self.config_id() |
5447.4.1
by Vincent Ladeuil
Implement config.get_options_matching_regexp. |
841 |
for (section_name, section) in sections: |
842 |
for (name, value) in section.iteritems(): |
|
5533.2.1
by Vincent Ladeuil
``bzr config`` properly displays list values |
843 |
yield (name, parser._quote(value), section_name, |
844 |
config_id, parser) |
|
5447.4.1
by Vincent Ladeuil
Implement config.get_options_matching_regexp. |
845 |
|
2120.6.1
by James Henstridge
add support for norecurse and appendpath policies when reading configuration files |
846 |
def _get_option_policy(self, section, option_name): |
847 |
"""Return the policy for the given (section, option_name) pair."""
|
|
848 |
return POLICY_NONE |
|
849 |
||
4603.1.10
by Aaron Bentley
Provide change editor via config. |
850 |
def _get_change_editor(self): |
851 |
return self.get_user_option('change_editor') |
|
852 |
||
1442.1.16
by Robert Collins
allow global overriding of signature policy to never check |
853 |
def _get_signature_checking(self): |
854 |
"""See Config._get_signature_checking."""
|
|
1474
by Robert Collins
Merge from Aaron Bentley. |
855 |
policy = self._get_user_option('check_signatures') |
856 |
if policy: |
|
6351.3.2
by Jelmer Vernooij
Convert some gpg options to config stacks. |
857 |
return signature_policy_from_unicode(policy) |
1442.1.18
by Robert Collins
permit per branch location overriding of signature checking policy |
858 |
|
1770.2.1
by Aaron Bentley
Use create_signature for signing policy, deprecate check_signatures for this |
859 |
def _get_signing_policy(self): |
1773.4.3
by Martin Pool
[merge] bzr.dev |
860 |
"""See Config._get_signing_policy"""
|
1770.2.1
by Aaron Bentley
Use create_signature for signing policy, deprecate check_signatures for this |
861 |
policy = self._get_user_option('create_signatures') |
862 |
if policy: |
|
6351.3.2
by Jelmer Vernooij
Convert some gpg options to config stacks. |
863 |
return signing_policy_from_unicode(policy) |
1770.2.1
by Aaron Bentley
Use create_signature for signing policy, deprecate check_signatures for this |
864 |
|
1442.1.18
by Robert Collins
permit per branch location overriding of signature checking policy |
865 |
def _get_user_id(self): |
866 |
"""Get the user id from the 'email' key in the current section."""
|
|
1474
by Robert Collins
Merge from Aaron Bentley. |
867 |
return self._get_user_option('email') |
1442.1.18
by Robert Collins
permit per branch location overriding of signature checking policy |
868 |
|
1993.3.6
by James Henstridge
get rid of the recurse argument to get_user_option() |
869 |
def _get_user_option(self, option_name): |
1442.1.69
by Robert Collins
config.Config has a 'get_user_option' call that accepts an option name. |
870 |
"""See Config._get_user_option."""
|
1993.3.3
by James Henstridge
make _get_matching_sections() return (section, extra_path) tuples, and adjust other code to match |
871 |
for (section, extra_path) in self._get_matching_sections(): |
872 |
try: |
|
2120.6.1
by James Henstridge
add support for norecurse and appendpath policies when reading configuration files |
873 |
value = self._get_parser().get_value(section, option_name) |
1993.3.3
by James Henstridge
make _get_matching_sections() return (section, extra_path) tuples, and adjust other code to match |
874 |
except KeyError: |
2120.6.1
by James Henstridge
add support for norecurse and appendpath policies when reading configuration files |
875 |
continue
|
876 |
policy = self._get_option_policy(section, option_name) |
|
877 |
if policy == POLICY_NONE: |
|
878 |
return value |
|
879 |
elif policy == POLICY_NORECURSE: |
|
880 |
# norecurse items only apply to the exact path
|
|
881 |
if extra_path: |
|
882 |
continue
|
|
883 |
else: |
|
884 |
return value |
|
885 |
elif policy == POLICY_APPENDPATH: |
|
2120.6.3
by James Henstridge
add some more tests for getting policy options, and behaviour of get_user_option in the presence of config policies |
886 |
if extra_path: |
887 |
value = urlutils.join(value, extra_path) |
|
888 |
return value |
|
2120.6.6
by James Henstridge
fix test_set_push_location test |
889 |
else: |
890 |
raise AssertionError('Unexpected config policy %r' % policy) |
|
1993.3.3
by James Henstridge
make _get_matching_sections() return (section, extra_path) tuples, and adjust other code to match |
891 |
else: |
1993.3.1
by James Henstridge
first go at making location config lookup recursive |
892 |
return None |
1442.1.69
by Robert Collins
config.Config has a 'get_user_option' call that accepts an option name. |
893 |
|
1442.1.59
by Robert Collins
Add re-sign command to generate a digital signature on a single revision. |
894 |
def _gpg_signing_command(self): |
1442.1.56
by Robert Collins
gpg_signing_command configuration item |
895 |
"""See Config.gpg_signing_command."""
|
1472
by Robert Collins
post commit hook, first pass implementation |
896 |
return self._get_user_option('gpg_signing_command') |
1442.1.56
by Robert Collins
gpg_signing_command configuration item |
897 |
|
1553.2.9
by Erik Bågfors
log_formatter => log_format for "named" formatters |
898 |
def _log_format(self): |
899 |
"""See Config.log_format."""
|
|
900 |
return self._get_user_option('log_format') |
|
1553.2.4
by Erik Bågfors
Support for setting the default log format at a configuration option |
901 |
|
5971.1.55
by Jonathan Riddell
add a config option to validate signatures |
902 |
def _validate_signatures_in_log(self): |
5971.1.56
by Jonathan Riddell
add an option for acceptable_keys in config, also make config docs match reality for signature options |
903 |
"""See Config.validate_signatures_in_log."""
|
5971.1.55
by Jonathan Riddell
add a config option to validate signatures |
904 |
return self._get_user_option('validate_signatures_in_log') |
905 |
||
5971.1.56
by Jonathan Riddell
add an option for acceptable_keys in config, also make config docs match reality for signature options |
906 |
def _acceptable_keys(self): |
907 |
"""See Config.acceptable_keys."""
|
|
908 |
return self._get_user_option('acceptable_keys') |
|
909 |
||
1472
by Robert Collins
post commit hook, first pass implementation |
910 |
def _post_commit(self): |
911 |
"""See Config.post_commit."""
|
|
912 |
return self._get_user_option('post_commit') |
|
1442.1.6
by Robert Collins
first stage major overhaul of configs, giving use BranchConfigs, LocationConfigs and GlobalConfigs |
913 |
|
1553.6.12
by Erik Bågfors
remove AliasConfig, based on input from abentley |
914 |
def _get_alias(self, value): |
915 |
try: |
|
3943.8.1
by Marius Kruger
remove all trailing whitespace from bzr source |
916 |
return self._get_parser().get_value("ALIASES", |
1553.6.12
by Erik Bågfors
remove AliasConfig, based on input from abentley |
917 |
value) |
918 |
except KeyError: |
|
919 |
pass
|
|
920 |
||
1770.2.7
by Aaron Bentley
Set/get nickname using BranchConfig |
921 |
def _get_nickname(self): |
922 |
return self.get_user_option('nickname') |
|
923 |
||
5447.4.11
by Vincent Ladeuil
Implement ``bzr config --remove <option>``. |
924 |
def remove_user_option(self, option_name, section_name=None): |
925 |
"""Remove a user option and save the configuration file.
|
|
926 |
||
927 |
:param option_name: The option to be removed.
|
|
928 |
||
929 |
:param section_name: The section the option is defined in, default to
|
|
930 |
the default section.
|
|
931 |
"""
|
|
932 |
self.reload() |
|
933 |
parser = self._get_parser() |
|
934 |
if section_name is None: |
|
935 |
section = parser |
|
936 |
else: |
|
937 |
section = parser[section_name] |
|
938 |
try: |
|
939 |
del section[option_name] |
|
940 |
except KeyError: |
|
941 |
raise errors.NoSuchConfigOption(option_name) |
|
942 |
self._write_config_file() |
|
5743.8.24
by Vincent Ladeuil
Clearly seaparate both sets of hooks for the old and new config implementations. |
943 |
for hook in OldConfigHooks['remove']: |
5743.8.13
by Vincent Ladeuil
Fix config calls for the actual implementation, including typos in parameters and TransportConfig support. |
944 |
hook(self, option_name) |
5447.4.11
by Vincent Ladeuil
Implement ``bzr config --remove <option>``. |
945 |
|
4708.2.1
by Martin
Ensure all files opened by bazaar proper are explicitly closed |
946 |
def _write_config_file(self): |
5345.1.1
by Vincent Ladeuil
Deprecate the get_filename parameter in IniBasedConfig. |
947 |
if self.file_name is None: |
948 |
raise AssertionError('We cannot save, self.file_name is None') |
|
5345.1.9
by Vincent Ladeuil
Refactor config dir check. |
949 |
conf_dir = os.path.dirname(self.file_name) |
950 |
ensure_config_dir_exists(conf_dir) |
|
5345.1.1
by Vincent Ladeuil
Deprecate the get_filename parameter in IniBasedConfig. |
951 |
atomic_file = atomicfile.AtomicFile(self.file_name) |
5050.6.1
by Vincent Ladeuil
Merge 2.1 into 2.2 including fixes for bug #525571 and bug #494221 |
952 |
self._get_parser().write(atomic_file) |
953 |
atomic_file.commit() |
|
954 |
atomic_file.close() |
|
5345.3.3
by Vincent Ladeuil
Merge bzr.dev into deprecate-get-filename resolving conflicts |
955 |
osutils.copy_ownership_from_path(self.file_name) |
5743.8.24
by Vincent Ladeuil
Clearly seaparate both sets of hooks for the old and new config implementations. |
956 |
for hook in OldConfigHooks['save']: |
5743.8.13
by Vincent Ladeuil
Fix config calls for the actual implementation, including typos in parameters and TransportConfig support. |
957 |
hook(self) |
4708.2.1
by Martin
Ensure all files opened by bazaar proper are explicitly closed |
958 |
|
1442.1.18
by Robert Collins
permit per branch location overriding of signature checking policy |
959 |
|
5345.5.4
by Vincent Ladeuil
Start implementing config files locking. |
960 |
class LockableConfig(IniBasedConfig): |
961 |
"""A configuration needing explicit locking for access.
|
|
962 |
||
963 |
If several processes try to write the config file, the accesses need to be
|
|
964 |
serialized.
|
|
5345.5.8
by Vincent Ladeuil
More doc and ensure that the config is locked when _write_config_file is called. |
965 |
|
966 |
Daughter classes should decorate all methods that update a config with the
|
|
967 |
``@needs_write_lock`` decorator (they call, directly or indirectly, the
|
|
968 |
``_write_config_file()`` method. These methods (typically ``set_option()``
|
|
969 |
and variants must reload the config file from disk before calling
|
|
970 |
``_write_config_file()``), this can be achieved by calling the
|
|
971 |
``self.reload()`` method. Note that the lock scope should cover both the
|
|
972 |
reading and the writing of the config file which is why the decorator can't
|
|
973 |
be applied to ``_write_config_file()`` only.
|
|
974 |
||
975 |
This should be enough to implement the following logic:
|
|
976 |
- lock for exclusive write access,
|
|
977 |
- reload the config file from disk,
|
|
978 |
- set the new value
|
|
979 |
- unlock
|
|
980 |
||
981 |
This logic guarantees that a writer can update a value without erasing an
|
|
982 |
update made by another writer.
|
|
5345.5.4
by Vincent Ladeuil
Start implementing config files locking. |
983 |
"""
|
984 |
||
5345.5.5
by Vincent Ladeuil
Make bb.test_version.TestVersionUnicodeOutput.test_unicode_bzr_home pass. |
985 |
lock_name = 'lock' |
986 |
||
5345.1.25
by Vincent Ladeuil
Move the '_save' parameter from '__init__' to 'from_bytes', fix fallouts. |
987 |
def __init__(self, file_name): |
988 |
super(LockableConfig, self).__init__(file_name=file_name) |
|
5345.5.5
by Vincent Ladeuil
Make bb.test_version.TestVersionUnicodeOutput.test_unicode_bzr_home pass. |
989 |
self.dir = osutils.dirname(osutils.safe_unicode(self.file_name)) |
5676.1.4
by Jelmer Vernooij
merge bzr.dev. |
990 |
# FIXME: It doesn't matter that we don't provide possible_transports
|
991 |
# below since this is currently used only for local config files ;
|
|
992 |
# local transports are not shared. But if/when we start using
|
|
993 |
# LockableConfig for other kind of transports, we will need to reuse
|
|
994 |
# whatever connection is already established -- vila 20100929
|
|
6083.1.1
by Jelmer Vernooij
Use get_transport_from_{url,path} in more places. |
995 |
self.transport = transport.get_transport_from_path(self.dir) |
5743.4.9
by Vincent Ladeuil
Implement a LockableConfigObjStore to be able to mimick the actual behaviour. |
996 |
self._lock = lockdir.LockDir(self.transport, self.lock_name) |
5345.5.4
by Vincent Ladeuil
Start implementing config files locking. |
997 |
|
5345.1.26
by Vincent Ladeuil
Merge lockable-config-files into remove-gratuitous-ensure-config-dir-exist-calls resolving conflicts |
998 |
def _create_from_string(self, unicode_bytes, save): |
999 |
super(LockableConfig, self)._create_from_string(unicode_bytes, False) |
|
5345.1.25
by Vincent Ladeuil
Move the '_save' parameter from '__init__' to 'from_bytes', fix fallouts. |
1000 |
if save: |
5345.1.24
by Vincent Ladeuil
Implement _save for LockableConfig too. |
1001 |
# We need to handle the saving here (as opposed to IniBasedConfig)
|
1002 |
# to be able to lock
|
|
1003 |
self.lock_write() |
|
1004 |
self._write_config_file() |
|
1005 |
self.unlock() |
|
5345.5.4
by Vincent Ladeuil
Start implementing config files locking. |
1006 |
|
1007 |
def lock_write(self, token=None): |
|
5345.5.8
by Vincent Ladeuil
More doc and ensure that the config is locked when _write_config_file is called. |
1008 |
"""Takes a write lock in the directory containing the config file.
|
1009 |
||
1010 |
If the directory doesn't exist it is created.
|
|
1011 |
"""
|
|
5345.5.5
by Vincent Ladeuil
Make bb.test_version.TestVersionUnicodeOutput.test_unicode_bzr_home pass. |
1012 |
ensure_config_dir_exists(self.dir) |
5345.5.4
by Vincent Ladeuil
Start implementing config files locking. |
1013 |
return self._lock.lock_write(token) |
1014 |
||
1015 |
def unlock(self): |
|
1016 |
self._lock.unlock() |
|
1017 |
||
5345.5.9
by Vincent Ladeuil
Implements 'bzr lock --config <file>'. |
1018 |
def break_lock(self): |
1019 |
self._lock.break_lock() |
|
1020 |
||
5447.4.11
by Vincent Ladeuil
Implement ``bzr config --remove <option>``. |
1021 |
@needs_write_lock
|
1022 |
def remove_user_option(self, option_name, section_name=None): |
|
1023 |
super(LockableConfig, self).remove_user_option(option_name, |
|
1024 |
section_name) |
|
1025 |
||
5345.5.8
by Vincent Ladeuil
More doc and ensure that the config is locked when _write_config_file is called. |
1026 |
def _write_config_file(self): |
1027 |
if self._lock is None or not self._lock.is_held: |
|
1028 |
# NB: if the following exception is raised it probably means a
|
|
1029 |
# missing @needs_write_lock decorator on one of the callers.
|
|
1030 |
raise errors.ObjectNotLocked(self) |
|
1031 |
super(LockableConfig, self)._write_config_file() |
|
1032 |
||
5345.5.4
by Vincent Ladeuil
Start implementing config files locking. |
1033 |
|
1034 |
class GlobalConfig(LockableConfig): |
|
1442.1.18
by Robert Collins
permit per branch location overriding of signature checking policy |
1035 |
"""The configuration that should be used for a specific location."""
|
1036 |
||
5345.2.8
by Vincent Ladeuil
Introduce a 'from_bytes' constructor for config objects. |
1037 |
def __init__(self): |
1038 |
super(GlobalConfig, self).__init__(file_name=config_filename()) |
|
5345.1.1
by Vincent Ladeuil
Deprecate the get_filename parameter in IniBasedConfig. |
1039 |
|
5447.4.16
by Vincent Ladeuil
Use config_id instead of id as suggested by poolie. |
1040 |
def config_id(self): |
5447.4.3
by Vincent Ladeuil
Simplify code and design by only defining get_options() where relevant. |
1041 |
return 'bazaar' |
1042 |
||
5345.1.25
by Vincent Ladeuil
Move the '_save' parameter from '__init__' to 'from_bytes', fix fallouts. |
1043 |
@classmethod
|
5345.1.26
by Vincent Ladeuil
Merge lockable-config-files into remove-gratuitous-ensure-config-dir-exist-calls resolving conflicts |
1044 |
def from_string(cls, str_or_unicode, save=False): |
5345.5.13
by Vincent Ladeuil
Merge simplify-test-config-building into lockable-config-files resolving conflicts |
1045 |
"""Create a config object from a string.
|
5345.1.25
by Vincent Ladeuil
Move the '_save' parameter from '__init__' to 'from_bytes', fix fallouts. |
1046 |
|
5345.5.13
by Vincent Ladeuil
Merge simplify-test-config-building into lockable-config-files resolving conflicts |
1047 |
:param str_or_unicode: A string representing the file content. This
|
1048 |
will be utf-8 encoded.
|
|
5345.1.25
by Vincent Ladeuil
Move the '_save' parameter from '__init__' to 'from_bytes', fix fallouts. |
1049 |
|
1050 |
:param save: Whether the file should be saved upon creation.
|
|
1051 |
"""
|
|
1052 |
conf = cls() |
|
5345.1.26
by Vincent Ladeuil
Merge lockable-config-files into remove-gratuitous-ensure-config-dir-exist-calls resolving conflicts |
1053 |
conf._create_from_string(str_or_unicode, save) |
5345.1.25
by Vincent Ladeuil
Move the '_save' parameter from '__init__' to 'from_bytes', fix fallouts. |
1054 |
return conf |
5345.5.12
by Vincent Ladeuil
Fix fallouts from replacing '_content' by 'from_bytes' for config files. |
1055 |
|
5345.5.4
by Vincent Ladeuil
Start implementing config files locking. |
1056 |
@needs_write_lock
|
1816.2.1
by Robey Pointer
add set_user_option to GlobalConfig, and make /etc/passwd username lookup try harder with encodings |
1057 |
def set_user_option(self, option, value): |
1058 |
"""Save option and its value in the configuration."""
|
|
2900.3.2
by Tim Penhey
A working alias command. |
1059 |
self._set_option(option, value, 'DEFAULT') |
1060 |
||
1061 |
def get_aliases(self): |
|
1062 |
"""Return the aliases section."""
|
|
1063 |
if 'ALIASES' in self._get_parser(): |
|
1064 |
return self._get_parser()['ALIASES'] |
|
1065 |
else: |
|
1066 |
return {} |
|
1067 |
||
5345.5.8
by Vincent Ladeuil
More doc and ensure that the config is locked when _write_config_file is called. |
1068 |
@needs_write_lock
|
2900.3.2
by Tim Penhey
A working alias command. |
1069 |
def set_alias(self, alias_name, alias_command): |
1070 |
"""Save the alias in the configuration."""
|
|
1071 |
self._set_option(alias_name, alias_command, 'ALIASES') |
|
1072 |
||
5345.5.8
by Vincent Ladeuil
More doc and ensure that the config is locked when _write_config_file is called. |
1073 |
@needs_write_lock
|
2900.3.2
by Tim Penhey
A working alias command. |
1074 |
def unset_alias(self, alias_name): |
1075 |
"""Unset an existing alias."""
|
|
5345.5.10
by Vincent Ladeuil
Add a missing config.reload(). |
1076 |
self.reload() |
2900.3.2
by Tim Penhey
A working alias command. |
1077 |
aliases = self._get_parser().get('ALIASES') |
2900.3.7
by Tim Penhey
Updates from Aaron's review. |
1078 |
if not aliases or alias_name not in aliases: |
1079 |
raise errors.NoSuchAlias(alias_name) |
|
2900.3.2
by Tim Penhey
A working alias command. |
1080 |
del aliases[alias_name] |
2900.3.12
by Tim Penhey
Final review comments. |
1081 |
self._write_config_file() |
2900.3.2
by Tim Penhey
A working alias command. |
1082 |
|
1083 |
def _set_option(self, option, value, section): |
|
5345.5.1
by Vincent Ladeuil
Implement config.reload and make sure we have a file name when using it. |
1084 |
self.reload() |
2900.3.7
by Tim Penhey
Updates from Aaron's review. |
1085 |
self._get_parser().setdefault(section, {})[option] = value |
2900.3.12
by Tim Penhey
Final review comments. |
1086 |
self._write_config_file() |
5743.8.24
by Vincent Ladeuil
Clearly seaparate both sets of hooks for the old and new config implementations. |
1087 |
for hook in OldConfigHooks['set']: |
5743.8.13
by Vincent Ladeuil
Fix config calls for the actual implementation, including typos in parameters and TransportConfig support. |
1088 |
hook(self, option, value) |
1442.1.18
by Robert Collins
permit per branch location overriding of signature checking policy |
1089 |
|
5447.4.12
by Vincent Ladeuil
Turn get_options() and get_sections() into private methods because section handling is too messy and needs to be discussed and settled. |
1090 |
def _get_sections(self, name=None): |
1091 |
"""See IniBasedConfig._get_sections()."""
|
|
5447.4.4
by Vincent Ladeuil
Implement config.get_sections() to clarify how sections can be used. |
1092 |
parser = self._get_parser() |
1093 |
# We don't give access to options defined outside of any section, we
|
|
1094 |
# used the DEFAULT section by... default.
|
|
1095 |
if name in (None, 'DEFAULT'): |
|
1096 |
# This could happen for an empty file where the DEFAULT section
|
|
1097 |
# doesn't exist yet. So we force DEFAULT when yielding
|
|
1098 |
name = 'DEFAULT' |
|
5447.4.11
by Vincent Ladeuil
Implement ``bzr config --remove <option>``. |
1099 |
if 'DEFAULT' not in parser: |
1100 |
parser['DEFAULT']= {} |
|
5447.4.16
by Vincent Ladeuil
Use config_id instead of id as suggested by poolie. |
1101 |
yield (name, parser[name], self.config_id()) |
5447.4.11
by Vincent Ladeuil
Implement ``bzr config --remove <option>``. |
1102 |
|
1103 |
@needs_write_lock
|
|
1104 |
def remove_user_option(self, option_name, section_name=None): |
|
1105 |
if section_name is None: |
|
1106 |
# We need to force the default section.
|
|
1107 |
section_name = 'DEFAULT' |
|
1108 |
# We need to avoid the LockableConfig implementation or we'll lock
|
|
1109 |
# twice
|
|
1110 |
super(LockableConfig, self).remove_user_option(option_name, |
|
1111 |
section_name) |
|
5447.4.4
by Vincent Ladeuil
Implement config.get_sections() to clarify how sections can be used. |
1112 |
|
5764.1.4
by Vincent Ladeuil
Using iterators is even clearer. |
1113 |
def _iter_for_location_by_parts(sections, location): |
5764.1.3
by Vincent Ladeuil
Add a doctrsing and address the location being split for all iterations by making letting the function iterate over all sections. |
1114 |
"""Keep only the sessions matching the specified location.
|
1115 |
||
1116 |
:param sections: An iterable of section names.
|
|
1117 |
||
1118 |
:param location: An url or a local path to match against.
|
|
1119 |
||
5764.1.4
by Vincent Ladeuil
Using iterators is even clearer. |
1120 |
:returns: An iterator of (section, extra_path, nb_parts) where nb is the
|
1121 |
number of path components in the section name, section is the section
|
|
1122 |
name and extra_path is the difference between location and the section
|
|
1123 |
name.
|
|
5743.6.19
by Vincent Ladeuil
Clarify comments about section names for Location-related objects (also fix LocationMatcher and add tests). |
1124 |
|
1125 |
``location`` will always be a local path and never a 'file://' url but the
|
|
1126 |
section names themselves can be in either form.
|
|
5764.1.3
by Vincent Ladeuil
Add a doctrsing and address the location being split for all iterations by making letting the function iterate over all sections. |
1127 |
"""
|
5764.1.2
by Vincent Ladeuil
This put a common processing into the loop to avoid bad inputs. The |
1128 |
location_parts = location.rstrip('/').split('/') |
1129 |
||
5764.1.3
by Vincent Ladeuil
Add a doctrsing and address the location being split for all iterations by making letting the function iterate over all sections. |
1130 |
for section in sections: |
5743.6.19
by Vincent Ladeuil
Clarify comments about section names for Location-related objects (also fix LocationMatcher and add tests). |
1131 |
# location is a local path if possible, so we need to convert 'file://'
|
1132 |
# urls in section names to local paths if necessary.
|
|
5764.1.3
by Vincent Ladeuil
Add a doctrsing and address the location being split for all iterations by making letting the function iterate over all sections. |
1133 |
|
1134 |
# This also avoids having file:///path be a more exact
|
|
1135 |
# match than '/path'.
|
|
1136 |
||
5743.6.19
by Vincent Ladeuil
Clarify comments about section names for Location-related objects (also fix LocationMatcher and add tests). |
1137 |
# FIXME: This still raises an issue if a user defines both file:///path
|
1138 |
# *and* /path. Should we raise an error in this case -- vila 20110505
|
|
1139 |
||
5764.1.3
by Vincent Ladeuil
Add a doctrsing and address the location being split for all iterations by making letting the function iterate over all sections. |
1140 |
if section.startswith('file://'): |
1141 |
section_path = urlutils.local_path_from_url(section) |
|
1142 |
else: |
|
1143 |
section_path = section |
|
1144 |
section_parts = section_path.rstrip('/').split('/') |
|
1145 |
||
1146 |
matched = True |
|
1147 |
if len(section_parts) > len(location_parts): |
|
1148 |
# More path components in the section, they can't match
|
|
1149 |
matched = False |
|
1150 |
else: |
|
1151 |
# Rely on zip truncating in length to the length of the shortest
|
|
1152 |
# argument sequence.
|
|
1153 |
names = zip(location_parts, section_parts) |
|
1154 |
for name in names: |
|
1155 |
if not fnmatch.fnmatch(name[0], name[1]): |
|
1156 |
matched = False |
|
1157 |
break
|
|
1158 |
if not matched: |
|
1159 |
continue
|
|
5764.1.1
by Vincent Ladeuil
Extract _match_section_by_parts from LocationConfig._get_matching_sections and more comments to explain the behavior. |
1160 |
# build the path difference between the section and the location
|
5764.1.3
by Vincent Ladeuil
Add a doctrsing and address the location being split for all iterations by making letting the function iterate over all sections. |
1161 |
extra_path = '/'.join(location_parts[len(section_parts):]) |
5764.1.4
by Vincent Ladeuil
Using iterators is even clearer. |
1162 |
yield section, extra_path, len(section_parts) |
5764.1.1
by Vincent Ladeuil
Extract _match_section_by_parts from LocationConfig._get_matching_sections and more comments to explain the behavior. |
1163 |
|
5447.4.4
by Vincent Ladeuil
Implement config.get_sections() to clarify how sections can be used. |
1164 |
|
5345.5.7
by Vincent Ladeuil
Make LocationConfig use a lock too. |
1165 |
class LocationConfig(LockableConfig): |
1442.1.6
by Robert Collins
first stage major overhaul of configs, giving use BranchConfigs, LocationConfigs and GlobalConfigs |
1166 |
"""A configuration object that gives the policy for a location."""
|
1167 |
||
5345.2.8
by Vincent Ladeuil
Introduce a 'from_bytes' constructor for config objects. |
1168 |
def __init__(self, location): |
5345.1.2
by Vincent Ladeuil
Get rid of 'branches.conf' references. |
1169 |
super(LocationConfig, self).__init__( |
5345.2.8
by Vincent Ladeuil
Introduce a 'from_bytes' constructor for config objects. |
1170 |
file_name=locations_config_filename()) |
1878.1.1
by John Arbash Meinel
Entries in locations.conf should prefer local paths if available (bug #53653) |
1171 |
# local file locations are looked up by local path, rather than
|
1172 |
# by file url. This is because the config file is a user
|
|
1173 |
# file, and we would rather not expose the user to file urls.
|
|
1174 |
if location.startswith('file://'): |
|
1175 |
location = urlutils.local_path_from_url(location) |
|
1442.1.6
by Robert Collins
first stage major overhaul of configs, giving use BranchConfigs, LocationConfigs and GlobalConfigs |
1176 |
self.location = location |
1177 |
||
5447.4.16
by Vincent Ladeuil
Use config_id instead of id as suggested by poolie. |
1178 |
def config_id(self): |
5447.4.3
by Vincent Ladeuil
Simplify code and design by only defining get_options() where relevant. |
1179 |
return 'locations' |
1180 |
||
5345.2.8
by Vincent Ladeuil
Introduce a 'from_bytes' constructor for config objects. |
1181 |
@classmethod
|
5345.1.26
by Vincent Ladeuil
Merge lockable-config-files into remove-gratuitous-ensure-config-dir-exist-calls resolving conflicts |
1182 |
def from_string(cls, str_or_unicode, location, save=False): |
1183 |
"""Create a config object from a string.
|
|
5345.2.8
by Vincent Ladeuil
Introduce a 'from_bytes' constructor for config objects. |
1184 |
|
5345.2.9
by Vincent Ladeuil
Rename IniBaseConfig.from_bytes to from_string. |
1185 |
:param str_or_unicode: A string representing the file content. This will
|
5345.2.8
by Vincent Ladeuil
Introduce a 'from_bytes' constructor for config objects. |
1186 |
be utf-8 encoded.
|
1187 |
||
1188 |
:param location: The location url to filter the configuration.
|
|
5345.1.25
by Vincent Ladeuil
Move the '_save' parameter from '__init__' to 'from_bytes', fix fallouts. |
1189 |
|
1190 |
:param save: Whether the file should be saved upon creation.
|
|
5345.2.8
by Vincent Ladeuil
Introduce a 'from_bytes' constructor for config objects. |
1191 |
"""
|
1192 |
conf = cls(location) |
|
5345.1.26
by Vincent Ladeuil
Merge lockable-config-files into remove-gratuitous-ensure-config-dir-exist-calls resolving conflicts |
1193 |
conf._create_from_string(str_or_unicode, save) |
5345.2.8
by Vincent Ladeuil
Introduce a 'from_bytes' constructor for config objects. |
1194 |
return conf |
1195 |
||
1993.3.1
by James Henstridge
first go at making location config lookup recursive |
1196 |
def _get_matching_sections(self): |
1197 |
"""Return an ordered list of section names matching this location."""
|
|
5764.1.4
by Vincent Ladeuil
Using iterators is even clearer. |
1198 |
matches = list(_iter_for_location_by_parts(self._get_parser(), |
1199 |
self.location)) |
|
5447.4.1
by Vincent Ladeuil
Implement config.get_options_matching_regexp. |
1200 |
# put the longest (aka more specific) locations first
|
5764.1.4
by Vincent Ladeuil
Using iterators is even clearer. |
1201 |
matches.sort( |
1202 |
key=lambda (section, extra_path, length): (length, section), |
|
1203 |
reverse=True) |
|
1204 |
for (section, extra_path, length) in matches: |
|
1205 |
yield section, extra_path |
|
1993.3.3
by James Henstridge
make _get_matching_sections() return (section, extra_path) tuples, and adjust other code to match |
1206 |
# should we stop looking for parent configs here?
|
1993.3.1
by James Henstridge
first go at making location config lookup recursive |
1207 |
try: |
1993.3.3
by James Henstridge
make _get_matching_sections() return (section, extra_path) tuples, and adjust other code to match |
1208 |
if self._get_parser()[section].as_bool('ignore_parents'): |
1209 |
break
|
|
1993.3.1
by James Henstridge
first go at making location config lookup recursive |
1210 |
except KeyError: |
1211 |
pass
|
|
1442.1.9
by Robert Collins
exact section test passes |
1212 |
|
5447.4.12
by Vincent Ladeuil
Turn get_options() and get_sections() into private methods because section handling is too messy and needs to be discussed and settled. |
1213 |
def _get_sections(self, name=None): |
1214 |
"""See IniBasedConfig._get_sections()."""
|
|
5447.4.4
by Vincent Ladeuil
Implement config.get_sections() to clarify how sections can be used. |
1215 |
# We ignore the name here as the only sections handled are named with
|
1216 |
# the location path and we don't expose embedded sections either.
|
|
1217 |
parser = self._get_parser() |
|
1218 |
for name, extra_path in self._get_matching_sections(): |
|
5447.4.16
by Vincent Ladeuil
Use config_id instead of id as suggested by poolie. |
1219 |
yield (name, parser[name], self.config_id()) |
5447.4.4
by Vincent Ladeuil
Implement config.get_sections() to clarify how sections can be used. |
1220 |
|
2120.6.1
by James Henstridge
add support for norecurse and appendpath policies when reading configuration files |
1221 |
def _get_option_policy(self, section, option_name): |
1222 |
"""Return the policy for the given (section, option_name) pair."""
|
|
1223 |
# check for the old 'recurse=False' flag
|
|
1224 |
try: |
|
1225 |
recurse = self._get_parser()[section].as_bool('recurse') |
|
1226 |
except KeyError: |
|
1227 |
recurse = True |
|
1228 |
if not recurse: |
|
1229 |
return POLICY_NORECURSE |
|
1230 |
||
2120.6.10
by James Henstridge
Catch another deprecation warning, and more cleanup |
1231 |
policy_key = option_name + ':policy' |
2120.6.8
by James Henstridge
Change syntax for setting config option policies. Rather than |
1232 |
try: |
1233 |
policy_name = self._get_parser()[section][policy_key] |
|
1234 |
except KeyError: |
|
1235 |
policy_name = None |
|
2120.6.1
by James Henstridge
add support for norecurse and appendpath policies when reading configuration files |
1236 |
|
2120.6.8
by James Henstridge
Change syntax for setting config option policies. Rather than |
1237 |
return _policy_value[policy_name] |
2120.6.1
by James Henstridge
add support for norecurse and appendpath policies when reading configuration files |
1238 |
|
2120.6.4
by James Henstridge
add support for specifying policy when storing options |
1239 |
def _set_option_policy(self, section, option_name, option_policy): |
1240 |
"""Set the policy for the given option name in the given section."""
|
|
1241 |
# The old recurse=False option affects all options in the
|
|
1242 |
# section. To handle multiple policies in the section, we
|
|
1243 |
# need to convert it to a policy_norecurse key.
|
|
1244 |
try: |
|
1245 |
recurse = self._get_parser()[section].as_bool('recurse') |
|
1246 |
except KeyError: |
|
1247 |
pass
|
|
1248 |
else: |
|
2120.6.9
by James Henstridge
Fixes for issues brought up in John's review |
1249 |
symbol_versioning.warn( |
2120.6.11
by James Henstridge
s/0.13/0.14/ in deprecation warning |
1250 |
'The recurse option is deprecated as of 0.14. '
|
2120.6.9
by James Henstridge
Fixes for issues brought up in John's review |
1251 |
'The section "%s" has been converted to use policies.' |
1252 |
% section, |
|
1253 |
DeprecationWarning) |
|
2120.6.4
by James Henstridge
add support for specifying policy when storing options |
1254 |
del self._get_parser()[section]['recurse'] |
2120.6.9
by James Henstridge
Fixes for issues brought up in John's review |
1255 |
if not recurse: |
1256 |
for key in self._get_parser()[section].keys(): |
|
1257 |
if not key.endswith(':policy'): |
|
1258 |
self._get_parser()[section][key + |
|
1259 |
':policy'] = 'norecurse' |
|
2120.6.4
by James Henstridge
add support for specifying policy when storing options |
1260 |
|
2120.6.9
by James Henstridge
Fixes for issues brought up in John's review |
1261 |
policy_key = option_name + ':policy' |
2120.6.8
by James Henstridge
Change syntax for setting config option policies. Rather than |
1262 |
policy_name = _policy_name[option_policy] |
1263 |
if policy_name is not None: |
|
1264 |
self._get_parser()[section][policy_key] = policy_name |
|
1265 |
else: |
|
1266 |
if policy_key in self._get_parser()[section]: |
|
1267 |
del self._get_parser()[section][policy_key] |
|
2120.6.4
by James Henstridge
add support for specifying policy when storing options |
1268 |
|
5345.5.7
by Vincent Ladeuil
Make LocationConfig use a lock too. |
1269 |
@needs_write_lock
|
2120.6.4
by James Henstridge
add support for specifying policy when storing options |
1270 |
def set_user_option(self, option, value, store=STORE_LOCATION): |
1490
by Robert Collins
Implement a 'bzr push' command, with saved locations; update diff to return 1. |
1271 |
"""Save option and its value in the configuration."""
|
3376.2.4
by Martin Pool
Remove every assert statement from bzrlib! |
1272 |
if store not in [STORE_LOCATION, |
2120.6.4
by James Henstridge
add support for specifying policy when storing options |
1273 |
STORE_LOCATION_NORECURSE, |
3376.2.4
by Martin Pool
Remove every assert statement from bzrlib! |
1274 |
STORE_LOCATION_APPENDPATH]: |
1275 |
raise ValueError('bad storage policy %r for %r' % |
|
1276 |
(store, option)) |
|
5345.5.1
by Vincent Ladeuil
Implement config.reload and make sure we have a file name when using it. |
1277 |
self.reload() |
1490
by Robert Collins
Implement a 'bzr push' command, with saved locations; update diff to return 1. |
1278 |
location = self.location |
1279 |
if location.endswith('/'): |
|
1280 |
location = location[:-1] |
|
5345.1.24
by Vincent Ladeuil
Implement _save for LockableConfig too. |
1281 |
parser = self._get_parser() |
5345.1.21
by Vincent Ladeuil
Slight rewrite to make the method more readable. |
1282 |
if not location in parser and not location + '/' in parser: |
1283 |
parser[location] = {} |
|
1284 |
elif location + '/' in parser: |
|
1490
by Robert Collins
Implement a 'bzr push' command, with saved locations; update diff to return 1. |
1285 |
location = location + '/' |
5345.1.21
by Vincent Ladeuil
Slight rewrite to make the method more readable. |
1286 |
parser[location][option]=value |
2120.6.4
by James Henstridge
add support for specifying policy when storing options |
1287 |
# the allowed values of store match the config policies
|
1288 |
self._set_option_policy(location, option, store) |
|
4708.2.1
by Martin
Ensure all files opened by bazaar proper are explicitly closed |
1289 |
self._write_config_file() |
5743.8.24
by Vincent Ladeuil
Clearly seaparate both sets of hooks for the old and new config implementations. |
1290 |
for hook in OldConfigHooks['set']: |
5743.8.13
by Vincent Ladeuil
Fix config calls for the actual implementation, including typos in parameters and TransportConfig support. |
1291 |
hook(self, option, value) |
1490
by Robert Collins
Implement a 'bzr push' command, with saved locations; update diff to return 1. |
1292 |
|
1442.1.6
by Robert Collins
first stage major overhaul of configs, giving use BranchConfigs, LocationConfigs and GlobalConfigs |
1293 |
|
1294 |
class BranchConfig(Config): |
|
1295 |
"""A configuration object giving the policy for a branch."""
|
|
1296 |
||
5345.1.3
by Vincent Ladeuil
Make __init__ the first method in the BranchConfig class. |
1297 |
def __init__(self, branch): |
1298 |
super(BranchConfig, self).__init__() |
|
1299 |
self._location_config = None |
|
1300 |
self._branch_data_config = None |
|
1301 |
self._global_config = None |
|
1302 |
self.branch = branch |
|
1303 |
self.option_sources = (self._get_location_config, |
|
1304 |
self._get_branch_data_config, |
|
1305 |
self._get_global_config) |
|
1306 |
||
5447.4.16
by Vincent Ladeuil
Use config_id instead of id as suggested by poolie. |
1307 |
def config_id(self): |
5447.4.3
by Vincent Ladeuil
Simplify code and design by only defining get_options() where relevant. |
1308 |
return 'branch' |
1309 |
||
1770.2.5
by Aaron Bentley
Integrate branch.conf into BranchConfig |
1310 |
def _get_branch_data_config(self): |
1311 |
if self._branch_data_config is None: |
|
1312 |
self._branch_data_config = TreeConfig(self.branch) |
|
5447.4.16
by Vincent Ladeuil
Use config_id instead of id as suggested by poolie. |
1313 |
self._branch_data_config.config_id = self.config_id |
1770.2.5
by Aaron Bentley
Integrate branch.conf into BranchConfig |
1314 |
return self._branch_data_config |
1315 |
||
1442.1.6
by Robert Collins
first stage major overhaul of configs, giving use BranchConfigs, LocationConfigs and GlobalConfigs |
1316 |
def _get_location_config(self): |
1317 |
if self._location_config is None: |
|
1318 |
self._location_config = LocationConfig(self.branch.base) |
|
1319 |
return self._location_config |
|
1320 |
||
1770.2.5
by Aaron Bentley
Integrate branch.conf into BranchConfig |
1321 |
def _get_global_config(self): |
1322 |
if self._global_config is None: |
|
1323 |
self._global_config = GlobalConfig() |
|
1324 |
return self._global_config |
|
1325 |
||
1326 |
def _get_best_value(self, option_name): |
|
1327 |
"""This returns a user option from local, tree or global config.
|
|
1328 |
||
1329 |
They are tried in that order. Use get_safe_value if trusted values
|
|
1330 |
are necessary.
|
|
1331 |
"""
|
|
1332 |
for source in self.option_sources: |
|
1333 |
value = getattr(source(), option_name)() |
|
1334 |
if value is not None: |
|
1335 |
return value |
|
1336 |
return None |
|
1337 |
||
1338 |
def _get_safe_value(self, option_name): |
|
1339 |
"""This variant of get_best_value never returns untrusted values.
|
|
3943.8.1
by Marius Kruger
remove all trailing whitespace from bzr source |
1340 |
|
1770.2.5
by Aaron Bentley
Integrate branch.conf into BranchConfig |
1341 |
It does not return values from the branch data, because the branch may
|
1342 |
not be controlled by the user.
|
|
1343 |
||
1344 |
We may wish to allow locations.conf to control whether branches are
|
|
1345 |
trusted in the future.
|
|
1346 |
"""
|
|
1347 |
for source in (self._get_location_config, self._get_global_config): |
|
1348 |
value = getattr(source(), option_name)() |
|
1349 |
if value is not None: |
|
1350 |
return value |
|
1351 |
return None |
|
1352 |
||
1442.1.6
by Robert Collins
first stage major overhaul of configs, giving use BranchConfigs, LocationConfigs and GlobalConfigs |
1353 |
def _get_user_id(self): |
1354 |
"""Return the full user id for the branch.
|
|
3943.8.1
by Marius Kruger
remove all trailing whitespace from bzr source |
1355 |
|
3407.2.14
by Martin Pool
Remove more cases of getting transport via control_files |
1356 |
e.g. "John Hacker <jhacker@example.com>"
|
1442.1.6
by Robert Collins
first stage major overhaul of configs, giving use BranchConfigs, LocationConfigs and GlobalConfigs |
1357 |
This is looked up in the email controlfile for the branch.
|
1358 |
"""
|
|
1770.2.5
by Aaron Bentley
Integrate branch.conf into BranchConfig |
1359 |
return self._get_best_value('_get_user_id') |
1442.1.6
by Robert Collins
first stage major overhaul of configs, giving use BranchConfigs, LocationConfigs and GlobalConfigs |
1360 |
|
4603.1.10
by Aaron Bentley
Provide change editor via config. |
1361 |
def _get_change_editor(self): |
1362 |
return self._get_best_value('_get_change_editor') |
|
1363 |
||
1442.1.19
by Robert Collins
BranchConfigs inherit signature_checking policy from their LocationConfig. |
1364 |
def _get_signature_checking(self): |
1365 |
"""See Config._get_signature_checking."""
|
|
1770.2.5
by Aaron Bentley
Integrate branch.conf into BranchConfig |
1366 |
return self._get_best_value('_get_signature_checking') |
1442.1.19
by Robert Collins
BranchConfigs inherit signature_checking policy from their LocationConfig. |
1367 |
|
1770.2.1
by Aaron Bentley
Use create_signature for signing policy, deprecate check_signatures for this |
1368 |
def _get_signing_policy(self): |
1369 |
"""See Config._get_signing_policy."""
|
|
1770.2.5
by Aaron Bentley
Integrate branch.conf into BranchConfig |
1370 |
return self._get_best_value('_get_signing_policy') |
1770.2.1
by Aaron Bentley
Use create_signature for signing policy, deprecate check_signatures for this |
1371 |
|
1993.3.6
by James Henstridge
get rid of the recurse argument to get_user_option() |
1372 |
def _get_user_option(self, option_name): |
1442.1.69
by Robert Collins
config.Config has a 'get_user_option' call that accepts an option name. |
1373 |
"""See Config._get_user_option."""
|
1770.2.5
by Aaron Bentley
Integrate branch.conf into BranchConfig |
1374 |
for source in self.option_sources: |
1993.3.6
by James Henstridge
get rid of the recurse argument to get_user_option() |
1375 |
value = source()._get_user_option(option_name) |
1770.2.5
by Aaron Bentley
Integrate branch.conf into BranchConfig |
1376 |
if value is not None: |
1377 |
return value |
|
1378 |
return None |
|
1379 |
||
5447.4.12
by Vincent Ladeuil
Turn get_options() and get_sections() into private methods because section handling is too messy and needs to be discussed and settled. |
1380 |
def _get_sections(self, name=None): |
5447.4.4
by Vincent Ladeuil
Implement config.get_sections() to clarify how sections can be used. |
1381 |
"""See IniBasedConfig.get_sections()."""
|
1382 |
for source in self.option_sources: |
|
5447.4.12
by Vincent Ladeuil
Turn get_options() and get_sections() into private methods because section handling is too messy and needs to be discussed and settled. |
1383 |
for section in source()._get_sections(name): |
5447.4.4
by Vincent Ladeuil
Implement config.get_sections() to clarify how sections can be used. |
1384 |
yield section |
1385 |
||
5447.4.12
by Vincent Ladeuil
Turn get_options() and get_sections() into private methods because section handling is too messy and needs to be discussed and settled. |
1386 |
def _get_options(self, sections=None): |
5447.4.3
by Vincent Ladeuil
Simplify code and design by only defining get_options() where relevant. |
1387 |
opts = [] |
1388 |
# First the locations options
|
|
5447.4.12
by Vincent Ladeuil
Turn get_options() and get_sections() into private methods because section handling is too messy and needs to be discussed and settled. |
1389 |
for option in self._get_location_config()._get_options(): |
5447.4.3
by Vincent Ladeuil
Simplify code and design by only defining get_options() where relevant. |
1390 |
yield option |
1391 |
# Then the branch options
|
|
5447.4.1
by Vincent Ladeuil
Implement config.get_options_matching_regexp. |
1392 |
branch_config = self._get_branch_data_config() |
1393 |
if sections is None: |
|
1394 |
sections = [('DEFAULT', branch_config._get_parser())] |
|
5447.4.3
by Vincent Ladeuil
Simplify code and design by only defining get_options() where relevant. |
1395 |
# FIXME: We shouldn't have to duplicate the code in IniBasedConfig but
|
1396 |
# Config itself has no notion of sections :( -- vila 20101001
|
|
5447.4.16
by Vincent Ladeuil
Use config_id instead of id as suggested by poolie. |
1397 |
config_id = self.config_id() |
5447.4.3
by Vincent Ladeuil
Simplify code and design by only defining get_options() where relevant. |
1398 |
for (section_name, section) in sections: |
1399 |
for (name, value) in section.iteritems(): |
|
5533.2.1
by Vincent Ladeuil
``bzr config`` properly displays list values |
1400 |
yield (name, value, section_name, |
1401 |
config_id, branch_config._get_parser()) |
|
5447.4.3
by Vincent Ladeuil
Simplify code and design by only defining get_options() where relevant. |
1402 |
# Then the global options
|
5447.4.12
by Vincent Ladeuil
Turn get_options() and get_sections() into private methods because section handling is too messy and needs to be discussed and settled. |
1403 |
for option in self._get_global_config()._get_options(): |
5447.4.3
by Vincent Ladeuil
Simplify code and design by only defining get_options() where relevant. |
1404 |
yield option |
5447.4.1
by Vincent Ladeuil
Implement config.get_options_matching_regexp. |
1405 |
|
1551.15.35
by Aaron Bentley
Warn when setting config values that will be masked (#122286) |
1406 |
def set_user_option(self, name, value, store=STORE_BRANCH, |
1407 |
warn_masked=False): |
|
2120.6.4
by James Henstridge
add support for specifying policy when storing options |
1408 |
if store == STORE_BRANCH: |
1770.2.6
by Aaron Bentley
Ensure branch.conf works properly |
1409 |
self._get_branch_data_config().set_option(value, name) |
2120.6.4
by James Henstridge
add support for specifying policy when storing options |
1410 |
elif store == STORE_GLOBAL: |
2120.6.7
by James Henstridge
Fix GlobalConfig.set_user_option() call |
1411 |
self._get_global_config().set_user_option(name, value) |
2120.6.4
by James Henstridge
add support for specifying policy when storing options |
1412 |
else: |
1413 |
self._get_location_config().set_user_option(name, value, store) |
|
1551.15.35
by Aaron Bentley
Warn when setting config values that will be masked (#122286) |
1414 |
if not warn_masked: |
1415 |
return
|
|
1416 |
if store in (STORE_GLOBAL, STORE_BRANCH): |
|
1417 |
mask_value = self._get_location_config().get_user_option(name) |
|
1418 |
if mask_value is not None: |
|
1419 |
trace.warning('Value "%s" is masked by "%s" from' |
|
1420 |
' locations.conf', value, mask_value) |
|
1421 |
else: |
|
1422 |
if store == STORE_GLOBAL: |
|
1423 |
branch_config = self._get_branch_data_config() |
|
1424 |
mask_value = branch_config.get_user_option(name) |
|
1425 |
if mask_value is not None: |
|
1426 |
trace.warning('Value "%s" is masked by "%s" from' |
|
1551.15.37
by Aaron Bentley
Don't treat a format string as a normal string |
1427 |
' branch.conf', value, mask_value) |
1551.15.35
by Aaron Bentley
Warn when setting config values that will be masked (#122286) |
1428 |
|
5447.4.11
by Vincent Ladeuil
Implement ``bzr config --remove <option>``. |
1429 |
def remove_user_option(self, option_name, section_name=None): |
1430 |
self._get_branch_data_config().remove_option(option_name, section_name) |
|
1431 |
||
1442.1.59
by Robert Collins
Add re-sign command to generate a digital signature on a single revision. |
1432 |
def _gpg_signing_command(self): |
1442.1.56
by Robert Collins
gpg_signing_command configuration item |
1433 |
"""See Config.gpg_signing_command."""
|
1770.2.5
by Aaron Bentley
Integrate branch.conf into BranchConfig |
1434 |
return self._get_safe_value('_gpg_signing_command') |
3943.8.1
by Marius Kruger
remove all trailing whitespace from bzr source |
1435 |
|
1472
by Robert Collins
post commit hook, first pass implementation |
1436 |
def _post_commit(self): |
1437 |
"""See Config.post_commit."""
|
|
1770.2.5
by Aaron Bentley
Integrate branch.conf into BranchConfig |
1438 |
return self._get_safe_value('_post_commit') |
1472
by Robert Collins
post commit hook, first pass implementation |
1439 |
|
1770.2.7
by Aaron Bentley
Set/get nickname using BranchConfig |
1440 |
def _get_nickname(self): |
1824.1.1
by Robert Collins
Add BranchConfig.has_explicit_nickname call. |
1441 |
value = self._get_explicit_nickname() |
1770.2.7
by Aaron Bentley
Set/get nickname using BranchConfig |
1442 |
if value is not None: |
1443 |
return value |
|
6437.32.1
by Aaron Bentley
Use colocated branch names as nicknames. |
1444 |
if self.branch.name: |
1445 |
return self.branch.name |
|
2120.5.2
by Alexander Belchenko
(jam) Fix for bug #66857 |
1446 |
return urlutils.unescape(self.branch.base.split('/')[-2]) |
1770.2.7
by Aaron Bentley
Set/get nickname using BranchConfig |
1447 |
|
1824.1.1
by Robert Collins
Add BranchConfig.has_explicit_nickname call. |
1448 |
def has_explicit_nickname(self): |
1449 |
"""Return true if a nickname has been explicitly assigned."""
|
|
1450 |
return self._get_explicit_nickname() is not None |
|
1451 |
||
1452 |
def _get_explicit_nickname(self): |
|
1453 |
return self._get_best_value('_get_nickname') |
|
1454 |
||
1553.2.9
by Erik Bågfors
log_formatter => log_format for "named" formatters |
1455 |
def _log_format(self): |
1456 |
"""See Config.log_format."""
|
|
1770.2.5
by Aaron Bentley
Integrate branch.conf into BranchConfig |
1457 |
return self._get_best_value('_log_format') |
1442.1.1
by Robert Collins
move config_dir into bzrlib.config |
1458 |
|
5971.1.55
by Jonathan Riddell
add a config option to validate signatures |
1459 |
def _validate_signatures_in_log(self): |
1460 |
"""See Config.validate_signatures_in_log."""
|
|
1461 |
return self._get_best_value('_validate_signatures_in_log') |
|
1462 |
||
5971.1.56
by Jonathan Riddell
add an option for acceptable_keys in config, also make config docs match reality for signature options |
1463 |
def _acceptable_keys(self): |
1464 |
"""See Config.acceptable_keys."""
|
|
1465 |
return self._get_best_value('_acceptable_keys') |
|
1466 |
||
1553.6.12
by Erik Bågfors
remove AliasConfig, based on input from abentley |
1467 |
|
1185.31.43
by John Arbash Meinel
Reintroduced ensure_config_dir_exists() for sftp |
1468 |
def ensure_config_dir_exists(path=None): |
5519.4.4
by Neil Martinsen-Burrell
restore ensure_config_dir since XDG_CONFIG_HOME is optional |
1469 |
"""Make sure a configuration directory exists.
|
1470 |
This makes sure that the directory exists.
|
|
1471 |
On windows, since configuration directories are 2 levels deep,
|
|
1472 |
it makes sure both the directory and the parent directory exists.
|
|
1185.31.43
by John Arbash Meinel
Reintroduced ensure_config_dir_exists() for sftp |
1473 |
"""
|
1474 |
if path is None: |
|
1475 |
path = config_dir() |
|
1476 |
if not os.path.isdir(path): |
|
5519.4.4
by Neil Martinsen-Burrell
restore ensure_config_dir since XDG_CONFIG_HOME is optional |
1477 |
if sys.platform == 'win32': |
1478 |
parent_dir = os.path.dirname(path) |
|
1479 |
if not os.path.isdir(parent_dir): |
|
1480 |
trace.mutter('creating config parent directory: %r', parent_dir) |
|
1481 |
os.mkdir(parent_dir) |
|
2900.2.10
by Vincent Ladeuil
Add -Dauth handling. |
1482 |
trace.mutter('creating config directory: %r', path) |
5116.2.4
by Parth Malwankar
removed mkdir_with_ownership as its probably cleaner to just use copy_ownership |
1483 |
os.mkdir(path) |
5116.2.6
by Parth Malwankar
renamed copy_ownership to copy_ownership_from_path. |
1484 |
osutils.copy_ownership_from_path(path) |
1185.31.43
by John Arbash Meinel
Reintroduced ensure_config_dir_exists() for sftp |
1485 |
|
1532
by Robert Collins
Merge in John Meinels integration branch. |
1486 |
|
1442.1.1
by Robert Collins
move config_dir into bzrlib.config |
1487 |
def config_dir(): |
6437.27.5
by Martin Packman
Document and test that config_dir now always returns unicode |
1488 |
"""Return per-user configuration directory as unicode string
|
1442.1.1
by Robert Collins
move config_dir into bzrlib.config |
1489 |
|
5519.4.1
by Neil Martinsen-Burrell
spec and first implementation, next tests |
1490 |
By default this is %APPDATA%/bazaar/2.0 on Windows, ~/.bazaar on Mac OS X
|
6591.2.1
by Fabien Meghazi
Also honor $XDG_CONFIG_HOME specification on Mac OS X platform |
1491 |
and Linux. On Mac OS X and Linux, if there is a $XDG_CONFIG_HOME/bazaar directory,
|
5519.4.3
by Neil Martinsen-Burrell
be permissive about using $XDG_CONFIG_HOME/bazaar, but dont complain |
1492 |
that will be used instead.
|
3943.8.1
by Marius Kruger
remove all trailing whitespace from bzr source |
1493 |
|
1442.1.1
by Robert Collins
move config_dir into bzrlib.config |
1494 |
TODO: Global option --config-dir to override this.
|
1495 |
"""
|
|
6437.27.1
by Martin Packman
Use new osutils functions over manual decoding in config_dir |
1496 |
base = osutils.path_from_environ('BZR_HOME') |
1185.38.1
by John Arbash Meinel
Adding my win32 patch for moving the home directory. |
1497 |
if sys.platform == 'win32': |
1498 |
if base is None: |
|
6437.27.2
by Martin Packman
Avoid deprecated get_appdata_location_unicode name and use more robust home location fallback for win32 |
1499 |
base = win32utils.get_appdata_location() |
1500 |
if base is None: |
|
1501 |
base = win32utils.get_home_location() |
|
6437.27.4
by Martin Packman
Add notes about known issues |
1502 |
# GZ 2012-02-01: Really the two level subdirs only make sense inside
|
1503 |
# APPDATA, but hard to move. See bug 348640 for more.
|
|
1996.3.31
by John Arbash Meinel
Make bzrlib.config use lazy importing |
1504 |
return osutils.pathjoin(base, 'bazaar', '2.0') |
6437.27.3
by Martin Packman
Rearrange conditionals to avoid some duplication on the not-win32 branch |
1505 |
if base is None: |
6591.2.1
by Fabien Meghazi
Also honor $XDG_CONFIG_HOME specification on Mac OS X platform |
1506 |
xdg_dir = osutils.path_from_environ('XDG_CONFIG_HOME') |
1507 |
if xdg_dir is None: |
|
1508 |
xdg_dir = osutils.pathjoin(osutils._get_home_dir(), ".config") |
|
1509 |
xdg_dir = osutils.pathjoin(xdg_dir, 'bazaar') |
|
1510 |
if osutils.isdir(xdg_dir): |
|
1511 |
trace.mutter( |
|
1512 |
"Using configuration in XDG directory %s." % xdg_dir) |
|
1513 |
return xdg_dir |
|
6437.27.3
by Martin Packman
Rearrange conditionals to avoid some duplication on the not-win32 branch |
1514 |
base = osutils._get_home_dir() |
1515 |
return osutils.pathjoin(base, ".bazaar") |
|
1185.31.32
by John Arbash Meinel
Updated the bzr sourcecode to use bzrlib.osutils.pathjoin rather than os.path.join to enforce internal use of / instead of \ |
1516 |
|
1517 |
||
1442.1.2
by Robert Collins
create a config module - there is enough config logic to make this worthwhile, and start testing config processing. |
1518 |
def config_filename(): |
1519 |
"""Return per-user configuration ini file filename."""
|
|
1996.3.31
by John Arbash Meinel
Make bzrlib.config use lazy importing |
1520 |
return osutils.pathjoin(config_dir(), 'bazaar.conf') |
1442.1.2
by Robert Collins
create a config module - there is enough config logic to make this worthwhile, and start testing config processing. |
1521 |
|
1522 |
||
1770.2.2
by Aaron Bentley
Rename branches.conf to locations.conf |
1523 |
def locations_config_filename(): |
1524 |
"""Return per-user configuration ini file filename."""
|
|
1996.3.31
by John Arbash Meinel
Make bzrlib.config use lazy importing |
1525 |
return osutils.pathjoin(config_dir(), 'locations.conf') |
1770.2.2
by Aaron Bentley
Rename branches.conf to locations.conf |
1526 |
|
1442.1.2
by Robert Collins
create a config module - there is enough config logic to make this worthwhile, and start testing config processing. |
1527 |
|
2900.2.3
by Vincent Ladeuil
Credentials matching implementation. |
1528 |
def authentication_config_filename(): |
1529 |
"""Return per-user authentication ini file filename."""
|
|
1530 |
return osutils.pathjoin(config_dir(), 'authentication.conf') |
|
1531 |
||
1532 |
||
1836.1.6
by John Arbash Meinel
Creating a helper function for getting the user ignore filename |
1533 |
def user_ignore_config_filename(): |
1534 |
"""Return the user default ignore filename"""
|
|
1996.3.31
by John Arbash Meinel
Make bzrlib.config use lazy importing |
1535 |
return osutils.pathjoin(config_dir(), 'ignore') |
1836.1.6
by John Arbash Meinel
Creating a helper function for getting the user ignore filename |
1536 |
|
1537 |
||
4584.3.4
by Martin Pool
Add crash_dir and xdg_cache_dir functions |
1538 |
def crash_dir(): |
1539 |
"""Return the directory name to store crash files.
|
|
1540 |
||
1541 |
This doesn't implicitly create it.
|
|
1542 |
||
4634.128.2
by Martin Pool
Write crash files into /var/crash where apport can see them. |
1543 |
On Windows it's in the config directory; elsewhere it's /var/crash
|
4634.128.18
by Martin Pool
Update apport crash tests |
1544 |
which may be monitored by apport. It can be overridden by
|
1545 |
$APPORT_CRASH_DIR.
|
|
4584.3.4
by Martin Pool
Add crash_dir and xdg_cache_dir functions |
1546 |
"""
|
1547 |
if sys.platform == 'win32': |
|
1548 |
return osutils.pathjoin(config_dir(), 'Crash') |
|
1549 |
else: |
|
4634.128.2
by Martin Pool
Write crash files into /var/crash where apport can see them. |
1550 |
# XXX: hardcoded in apport_python_hook.py; therefore here too -- mbp
|
1551 |
# 2010-01-31
|
|
4634.128.18
by Martin Pool
Update apport crash tests |
1552 |
return os.environ.get('APPORT_CRASH_DIR', '/var/crash') |
4584.3.4
by Martin Pool
Add crash_dir and xdg_cache_dir functions |
1553 |
|
1554 |
||
1555 |
def xdg_cache_dir(): |
|
4584.3.23
by Martin Pool
Correction to xdg_cache_dir and add a simple test |
1556 |
# See http://standards.freedesktop.org/basedir-spec/latest/ar01s03.html
|
1557 |
# Possibly this should be different on Windows?
|
|
6589.2.1
by Andrew Starr-Bochicchio
The XDG Base Directory Specification uses the XDG_CACHE_HOME XDG_CACHE_HOME, not XDG_CACHE_DIR. |
1558 |
e = os.environ.get('XDG_CACHE_HOME', None) |
4584.3.23
by Martin Pool
Correction to xdg_cache_dir and add a simple test |
1559 |
if e: |
1560 |
return e |
|
1561 |
else: |
|
1562 |
return os.path.expanduser('~/.cache') |
|
4584.3.4
by Martin Pool
Add crash_dir and xdg_cache_dir functions |
1563 |
|
1564 |
||
6538.4.2
by Haw Loeung (hloeung)
[hloeung] Also added missing unit tests. |
1565 |
def _get_default_mail_domain(mailname_file='/etc/mailname'): |
5050.72.1
by Martin Pool
Set email address from /etc/mailname if possible |
1566 |
"""If possible, return the assumed default email domain.
|
1567 |
||
1568 |
:returns: string mail domain, or None.
|
|
1569 |
"""
|
|
1570 |
if sys.platform == 'win32': |
|
1571 |
# No implementation yet; patches welcome
|
|
1572 |
return None |
|
1573 |
try: |
|
6538.4.2
by Haw Loeung (hloeung)
[hloeung] Also added missing unit tests. |
1574 |
f = open(mailname_file) |
5050.72.1
by Martin Pool
Set email address from /etc/mailname if possible |
1575 |
except (IOError, OSError), e: |
1576 |
return None |
|
1577 |
try: |
|
6538.4.1
by Haw Loeung (hloeung)
[hloeung] Only read the first line from /etc/mailname - LP bug #932515. |
1578 |
domain = f.readline().strip() |
5050.72.1
by Martin Pool
Set email address from /etc/mailname if possible |
1579 |
return domain |
1580 |
finally: |
|
1581 |
f.close() |
|
1582 |
||
1583 |
||
6351.3.15
by Vincent Ladeuil
BZR_EMAIL should override all config settings, no matter how surprising it may seem. |
1584 |
def default_email(): |
6374.1.1
by Jelmer Vernooij
Fix default BZR_EMAIL use. |
1585 |
v = os.environ.get('BZR_EMAIL') |
6374.1.3
by Jelmer Vernooij
Add tests for default_email behaviour. |
1586 |
if v: |
6374.1.1
by Jelmer Vernooij
Fix default BZR_EMAIL use. |
1587 |
return v.decode(osutils.get_user_encoding()) |
6351.3.15
by Vincent Ladeuil
BZR_EMAIL should override all config settings, no matter how surprising it may seem. |
1588 |
v = os.environ.get('EMAIL') |
1589 |
if v: |
|
1590 |
return v.decode(osutils.get_user_encoding()) |
|
1591 |
name, email = _auto_user_id() |
|
1592 |
if name and email: |
|
1593 |
return u'%s <%s>' % (name, email) |
|
1594 |
elif email: |
|
1595 |
return email |
|
1596 |
raise errors.NoWhoami() |
|
1597 |
||
1598 |
||
5050.72.1
by Martin Pool
Set email address from /etc/mailname if possible |
1599 |
def _auto_user_id(): |
1600 |
"""Calculate automatic user identification.
|
|
1601 |
||
1602 |
:returns: (realname, email), either of which may be None if they can't be
|
|
1603 |
determined.
|
|
1604 |
||
1605 |
Only used when none is set in the environment or the id file.
|
|
1606 |
||
1607 |
This only returns an email address if we can be fairly sure the
|
|
1608 |
address is reasonable, ie if /etc/mailname is set on unix.
|
|
1609 |
||
1610 |
This doesn't use the FQDN as the default domain because that may be
|
|
1611 |
slow, and it doesn't use the hostname alone because that's not normally
|
|
1612 |
a reasonable address.
|
|
1613 |
"""
|
|
1614 |
if sys.platform == 'win32': |
|
1615 |
# No implementation to reliably determine Windows default mail
|
|
1616 |
# address; please add one.
|
|
1617 |
return None, None |
|
1618 |
||
1619 |
default_mail_domain = _get_default_mail_domain() |
|
1620 |
if not default_mail_domain: |
|
1621 |
return None, None |
|
1622 |
||
1623 |
import pwd |
|
1624 |
uid = os.getuid() |
|
1625 |
try: |
|
1626 |
w = pwd.getpwuid(uid) |
|
1627 |
except KeyError: |
|
5904.1.2
by Martin Pool
Various pyflakes import fixes. |
1628 |
trace.mutter('no passwd entry for uid %d?' % uid) |
5050.72.1
by Martin Pool
Set email address from /etc/mailname if possible |
1629 |
return None, None |
1630 |
||
1631 |
# we try utf-8 first, because on many variants (like Linux),
|
|
1632 |
# /etc/passwd "should" be in utf-8, and because it's unlikely to give
|
|
1633 |
# false positives. (many users will have their user encoding set to
|
|
1634 |
# latin-1, which cannot raise UnicodeError.)
|
|
1635 |
try: |
|
1636 |
gecos = w.pw_gecos.decode('utf-8') |
|
1637 |
encoding = 'utf-8' |
|
1638 |
except UnicodeError: |
|
1639 |
try: |
|
1640 |
encoding = osutils.get_user_encoding() |
|
1641 |
gecos = w.pw_gecos.decode(encoding) |
|
1642 |
except UnicodeError, e: |
|
5904.1.2
by Martin Pool
Various pyflakes import fixes. |
1643 |
trace.mutter("cannot decode passwd entry %s" % w) |
5050.72.1
by Martin Pool
Set email address from /etc/mailname if possible |
1644 |
return None, None |
1645 |
try: |
|
1646 |
username = w.pw_name.decode(encoding) |
|
1647 |
except UnicodeError, e: |
|
5904.1.2
by Martin Pool
Various pyflakes import fixes. |
1648 |
trace.mutter("cannot decode passwd entry %s" % w) |
5050.72.1
by Martin Pool
Set email address from /etc/mailname if possible |
1649 |
return None, None |
1650 |
||
1651 |
comma = gecos.find(',') |
|
1652 |
if comma == -1: |
|
1653 |
realname = gecos |
|
1654 |
else: |
|
1655 |
realname = gecos[:comma] |
|
1656 |
||
1657 |
return realname, (username + '@' + default_mail_domain) |
|
1658 |
||
1659 |
||
3063.3.2
by Lukáš Lalinský
Move the name and e-mail address extraction logic to config.parse_username. |
1660 |
def parse_username(username): |
1661 |
"""Parse e-mail username and return a (name, address) tuple."""
|
|
1662 |
match = re.match(r'(.*?)\s*<?([\w+.-]+@[\w+.-]+)>?', username) |
|
1663 |
if match is None: |
|
1664 |
return (username, '') |
|
1665 |
else: |
|
1666 |
return (match.group(1), match.group(2)) |
|
1667 |
||
1668 |
||
1185.16.52
by Martin Pool
- add extract_email_address |
1669 |
def extract_email_address(e): |
1670 |
"""Return just the address part of an email string.
|
|
3063.3.2
by Lukáš Lalinský
Move the name and e-mail address extraction logic to config.parse_username. |
1671 |
|
3943.8.1
by Marius Kruger
remove all trailing whitespace from bzr source |
1672 |
That is just the user@domain part, nothing else.
|
1185.16.52
by Martin Pool
- add extract_email_address |
1673 |
This part is required to contain only ascii characters.
|
1674 |
If it can't be extracted, raises an error.
|
|
3063.3.2
by Lukáš Lalinský
Move the name and e-mail address extraction logic to config.parse_username. |
1675 |
|
1185.16.52
by Martin Pool
- add extract_email_address |
1676 |
>>> extract_email_address('Jane Tester <jane@test.com>')
|
1677 |
"jane@test.com"
|
|
1678 |
"""
|
|
3063.3.2
by Lukáš Lalinský
Move the name and e-mail address extraction logic to config.parse_username. |
1679 |
name, email = parse_username(e) |
1680 |
if not email: |
|
2055.2.2
by John Arbash Meinel
Switch extract_email_address() to use a more specific exception |
1681 |
raise errors.NoEmailInUsername(e) |
3063.3.2
by Lukáš Lalinský
Move the name and e-mail address extraction logic to config.parse_username. |
1682 |
return email |
1185.35.11
by Aaron Bentley
Added support for branch nicks |
1683 |
|
1185.85.30
by John Arbash Meinel
Fixing 'bzr push' exposed that IniBasedConfig didn't handle unicode. |
1684 |
|
1770.2.5
by Aaron Bentley
Integrate branch.conf into BranchConfig |
1685 |
class TreeConfig(IniBasedConfig): |
1185.35.11
by Aaron Bentley
Added support for branch nicks |
1686 |
"""Branch configuration data associated with its contents, not location"""
|
2900.2.3
by Vincent Ladeuil
Credentials matching implementation. |
1687 |
|
3408.3.1
by Martin Pool
Remove erroneous handling of branch.conf for RemoteBranch |
1688 |
# XXX: Really needs a better name, as this is not part of the tree! -- mbp 20080507
|
1689 |
||
1185.35.11
by Aaron Bentley
Added support for branch nicks |
1690 |
def __init__(self, branch): |
4226.1.5
by Robert Collins
Reinstate the use of the Branch.get_config_file verb. |
1691 |
self._config = branch._get_config() |
1185.35.11
by Aaron Bentley
Added support for branch nicks |
1692 |
self.branch = branch |
1693 |
||
1770.2.5
by Aaron Bentley
Integrate branch.conf into BranchConfig |
1694 |
def _get_parser(self, file=None): |
1695 |
if file is not None: |
|
1696 |
return IniBasedConfig._get_parser(file) |
|
3242.1.2
by Aaron Bentley
Turn BzrDirConfig into TransportConfig, reduce code duplication |
1697 |
return self._config._get_configobj() |
1185.35.11
by Aaron Bentley
Added support for branch nicks |
1698 |
|
1699 |
def get_option(self, name, section=None, default=None): |
|
1700 |
self.branch.lock_read() |
|
1701 |
try: |
|
3242.1.2
by Aaron Bentley
Turn BzrDirConfig into TransportConfig, reduce code duplication |
1702 |
return self._config.get_option(name, section, default) |
1185.35.11
by Aaron Bentley
Added support for branch nicks |
1703 |
finally: |
1704 |
self.branch.unlock() |
|
1705 |
||
1706 |
def set_option(self, value, name, section=None): |
|
1707 |
"""Set a per-branch configuration option"""
|
|
5447.4.11
by Vincent Ladeuil
Implement ``bzr config --remove <option>``. |
1708 |
# FIXME: We shouldn't need to lock explicitly here but rather rely on
|
1709 |
# higher levels providing the right lock -- vila 20101004
|
|
1185.35.11
by Aaron Bentley
Added support for branch nicks |
1710 |
self.branch.lock_write() |
1711 |
try: |
|
3242.1.2
by Aaron Bentley
Turn BzrDirConfig into TransportConfig, reduce code duplication |
1712 |
self._config.set_option(value, name, section) |
1185.35.11
by Aaron Bentley
Added support for branch nicks |
1713 |
finally: |
1714 |
self.branch.unlock() |
|
2900.2.3
by Vincent Ladeuil
Credentials matching implementation. |
1715 |
|
5447.4.11
by Vincent Ladeuil
Implement ``bzr config --remove <option>``. |
1716 |
def remove_option(self, option_name, section_name=None): |
1717 |
# FIXME: We shouldn't need to lock explicitly here but rather rely on
|
|
1718 |
# higher levels providing the right lock -- vila 20101004
|
|
1719 |
self.branch.lock_write() |
|
1720 |
try: |
|
1721 |
self._config.remove_option(option_name, section_name) |
|
1722 |
finally: |
|
1723 |
self.branch.unlock() |
|
1724 |
||
2900.2.3
by Vincent Ladeuil
Credentials matching implementation. |
1725 |
|
1726 |
class AuthenticationConfig(object): |
|
1727 |
"""The authentication configuration file based on a ini file.
|
|
1728 |
||
1729 |
Implements the authentication.conf file described in
|
|
1730 |
doc/developers/authentication-ring.txt.
|
|
1731 |
"""
|
|
1732 |
||
1733 |
def __init__(self, _file=None): |
|
2900.2.4
by Vincent Ladeuil
Cosmetic changes. |
1734 |
self._config = None # The ConfigObj |
2900.2.3
by Vincent Ladeuil
Credentials matching implementation. |
1735 |
if _file is None: |
2900.2.24
by Vincent Ladeuil
Review feedback. |
1736 |
self._filename = authentication_config_filename() |
1737 |
self._input = self._filename = authentication_config_filename() |
|
2900.2.3
by Vincent Ladeuil
Credentials matching implementation. |
1738 |
else: |
2900.2.24
by Vincent Ladeuil
Review feedback. |
1739 |
# Tests can provide a string as _file
|
1740 |
self._filename = None |
|
2900.2.3
by Vincent Ladeuil
Credentials matching implementation. |
1741 |
self._input = _file |
1742 |
||
1743 |
def _get_config(self): |
|
1744 |
if self._config is not None: |
|
1745 |
return self._config |
|
1746 |
try: |
|
2900.2.22
by Vincent Ladeuil
Polishing. |
1747 |
# FIXME: Should we validate something here ? Includes: empty
|
1748 |
# sections are useless, at least one of
|
|
1749 |
# user/password/password_encoding should be defined, etc.
|
|
2900.2.4
by Vincent Ladeuil
Cosmetic changes. |
1750 |
|
1751 |
# Note: the encoding below declares that the file itself is utf-8
|
|
1752 |
# encoded, but the values in the ConfigObj are always Unicode.
|
|
2900.2.3
by Vincent Ladeuil
Credentials matching implementation. |
1753 |
self._config = ConfigObj(self._input, encoding='utf-8') |
1754 |
except configobj.ConfigObjError, e: |
|
1755 |
raise errors.ParseConfigError(e.errors, e.config.filename) |
|
5987.1.4
by Vincent Ladeuil
Proper error messages for config files with content in non-utf encoding or that cannot be parsed |
1756 |
except UnicodeError: |
5987.1.3
by Vincent Ladeuil
Proper message when authentication.conf has non-utf8 content |
1757 |
raise errors.ConfigContentError(self._filename) |
2900.2.3
by Vincent Ladeuil
Credentials matching implementation. |
1758 |
return self._config |
1759 |
||
2900.2.5
by Vincent Ladeuil
ake ftp aware of authentication config. |
1760 |
def _save(self): |
1761 |
"""Save the config file, only tests should use it for now."""
|
|
2900.2.26
by Vincent Ladeuil
Fix forgotten reference to _get_filename and duplicated code. |
1762 |
conf_dir = os.path.dirname(self._filename) |
2900.2.5
by Vincent Ladeuil
ake ftp aware of authentication config. |
1763 |
ensure_config_dir_exists(conf_dir) |
4708.2.2
by Martin
Workingtree changes sitting around since November, more explict closing of files in bzrlib |
1764 |
f = file(self._filename, 'wb') |
1765 |
try: |
|
1766 |
self._get_config().write(f) |
|
1767 |
finally: |
|
1768 |
f.close() |
|
2900.2.5
by Vincent Ladeuil
ake ftp aware of authentication config. |
1769 |
|
1770 |
def _set_option(self, section_name, option_name, value): |
|
1771 |
"""Set an authentication configuration option"""
|
|
1772 |
conf = self._get_config() |
|
1773 |
section = conf.get(section_name) |
|
1774 |
if section is None: |
|
1775 |
conf[section] = {} |
|
1776 |
section = conf[section] |
|
1777 |
section[option_name] = value |
|
1778 |
self._save() |
|
1779 |
||
5743.8.25
by Vincent Ladeuil
Fix spurious spaces. |
1780 |
def get_credentials(self, scheme, host, port=None, user=None, path=None, |
4081.1.1
by Jean-Francois Roy
A 'realm' optional argument was added to the get_credentials and set_credentials |
1781 |
realm=None): |
2900.2.4
by Vincent Ladeuil
Cosmetic changes. |
1782 |
"""Returns the matching credentials from authentication.conf file.
|
1783 |
||
1784 |
:param scheme: protocol
|
|
1785 |
||
1786 |
:param host: the server address
|
|
1787 |
||
1788 |
:param port: the associated port (optional)
|
|
1789 |
||
1790 |
:param user: login (optional)
|
|
1791 |
||
1792 |
:param path: the absolute path on the server (optional)
|
|
6371.1.1
by Jelmer Vernooij
Fix some whitespace in bzrlib.config. |
1793 |
|
4081.1.1
by Jean-Francois Roy
A 'realm' optional argument was added to the get_credentials and set_credentials |
1794 |
:param realm: the http authentication realm (optional)
|
2900.2.4
by Vincent Ladeuil
Cosmetic changes. |
1795 |
|
2900.2.15
by Vincent Ladeuil
AuthenticationConfig can be queried for logins too (first step). |
1796 |
:return: A dict containing the matching credentials or None.
|
2900.2.4
by Vincent Ladeuil
Cosmetic changes. |
1797 |
This includes:
|
1798 |
- name: the section name of the credentials in the
|
|
1799 |
authentication.conf file,
|
|
4081.1.1
by Jean-Francois Roy
A 'realm' optional argument was added to the get_credentials and set_credentials |
1800 |
- user: can't be different from the provided user if any,
|
4107.1.7
by Jean-Francois Roy
No longer deleting the extra credentials keys in get_credentials. |
1801 |
- scheme: the server protocol,
|
1802 |
- host: the server address,
|
|
1803 |
- port: the server port (can be None),
|
|
1804 |
- path: the absolute server path (can be None),
|
|
1805 |
- realm: the http specific authentication realm (can be None),
|
|
2900.2.15
by Vincent Ladeuil
AuthenticationConfig can be queried for logins too (first step). |
1806 |
- password: the decoded password, could be None if the credential
|
1807 |
defines only the user
|
|
2900.2.4
by Vincent Ladeuil
Cosmetic changes. |
1808 |
- verify_certificates: https specific, True if the server
|
1809 |
certificate should be verified, False otherwise.
|
|
1810 |
"""
|
|
2900.2.3
by Vincent Ladeuil
Credentials matching implementation. |
1811 |
credentials = None |
1812 |
for auth_def_name, auth_def in self._get_config().items(): |
|
3418.2.1
by Vincent Ladeuil
Fix #217650 by catching declarations outside sections. |
1813 |
if type(auth_def) is not configobj.Section: |
1814 |
raise ValueError("%s defined outside a section" % auth_def_name) |
|
1815 |
||
2900.2.5
by Vincent Ladeuil
ake ftp aware of authentication config. |
1816 |
a_scheme, a_host, a_user, a_path = map( |
1817 |
auth_def.get, ['scheme', 'host', 'user', 'path']) |
|
2900.2.4
by Vincent Ladeuil
Cosmetic changes. |
1818 |
|
2900.2.5
by Vincent Ladeuil
ake ftp aware of authentication config. |
1819 |
try: |
1820 |
a_port = auth_def.as_int('port') |
|
1821 |
except KeyError: |
|
1822 |
a_port = None |
|
2900.2.22
by Vincent Ladeuil
Polishing. |
1823 |
except ValueError: |
1824 |
raise ValueError("'port' not numeric in %s" % auth_def_name) |
|
2900.2.4
by Vincent Ladeuil
Cosmetic changes. |
1825 |
try: |
1826 |
a_verify_certificates = auth_def.as_bool('verify_certificates') |
|
1827 |
except KeyError: |
|
1828 |
a_verify_certificates = True |
|
2900.2.22
by Vincent Ladeuil
Polishing. |
1829 |
except ValueError: |
1830 |
raise ValueError( |
|
1831 |
"'verify_certificates' not boolean in %s" % auth_def_name) |
|
2900.2.4
by Vincent Ladeuil
Cosmetic changes. |
1832 |
|
1833 |
# Attempt matching
|
|
2900.2.3
by Vincent Ladeuil
Credentials matching implementation. |
1834 |
if a_scheme is not None and scheme != a_scheme: |
1835 |
continue
|
|
1836 |
if a_host is not None: |
|
1837 |
if not (host == a_host |
|
1838 |
or (a_host.startswith('.') and host.endswith(a_host))): |
|
1839 |
continue
|
|
2900.2.4
by Vincent Ladeuil
Cosmetic changes. |
1840 |
if a_port is not None and port != a_port: |
2900.2.3
by Vincent Ladeuil
Credentials matching implementation. |
1841 |
continue
|
1842 |
if (a_path is not None and path is not None |
|
1843 |
and not path.startswith(a_path)): |
|
1844 |
continue
|
|
1845 |
if (a_user is not None and user is not None |
|
1846 |
and a_user != user): |
|
2900.2.10
by Vincent Ladeuil
Add -Dauth handling. |
1847 |
# Never contradict the caller about the user to be used
|
2900.2.3
by Vincent Ladeuil
Credentials matching implementation. |
1848 |
continue
|
2900.2.15
by Vincent Ladeuil
AuthenticationConfig can be queried for logins too (first step). |
1849 |
if a_user is None: |
2900.2.3
by Vincent Ladeuil
Credentials matching implementation. |
1850 |
# Can't find a user
|
1851 |
continue
|
|
4081.1.1
by Jean-Francois Roy
A 'realm' optional argument was added to the get_credentials and set_credentials |
1852 |
# Prepare a credentials dictionary with additional keys
|
1853 |
# for the credential providers
|
|
2900.2.24
by Vincent Ladeuil
Review feedback. |
1854 |
credentials = dict(name=auth_def_name, |
3418.4.2
by Vincent Ladeuil
Fix bug #199440 by taking into account that a section may not |
1855 |
user=a_user, |
4081.1.1
by Jean-Francois Roy
A 'realm' optional argument was added to the get_credentials and set_credentials |
1856 |
scheme=a_scheme, |
1857 |
host=host, |
|
1858 |
port=port, |
|
1859 |
path=path, |
|
1860 |
realm=realm, |
|
3418.4.2
by Vincent Ladeuil
Fix bug #199440 by taking into account that a section may not |
1861 |
password=auth_def.get('password', None), |
2900.2.24
by Vincent Ladeuil
Review feedback. |
1862 |
verify_certificates=a_verify_certificates) |
4081.1.1
by Jean-Francois Roy
A 'realm' optional argument was added to the get_credentials and set_credentials |
1863 |
# Decode the password in the credentials (or get one)
|
2900.2.22
by Vincent Ladeuil
Polishing. |
1864 |
self.decode_password(credentials, |
1865 |
auth_def.get('password_encoding', None)) |
|
2900.2.10
by Vincent Ladeuil
Add -Dauth handling. |
1866 |
if 'auth' in debug.debug_flags: |
1867 |
trace.mutter("Using authentication section: %r", auth_def_name) |
|
2900.2.3
by Vincent Ladeuil
Credentials matching implementation. |
1868 |
break
|
1869 |
||
4283.1.1
by Jelmer Vernooij
Support fallback credential stores. |
1870 |
if credentials is None: |
1871 |
# No credentials were found in authentication.conf, try the fallback
|
|
1872 |
# credentials stores.
|
|
1873 |
credentials = credential_store_registry.get_fallback_credentials( |
|
1874 |
scheme, host, port, user, path, realm) |
|
1875 |
||
2900.2.3
by Vincent Ladeuil
Credentials matching implementation. |
1876 |
return credentials |
1877 |
||
3777.3.2
by Aaron Bentley
Reverse order of scheme and password |
1878 |
def set_credentials(self, name, host, user, scheme=None, password=None, |
4081.1.1
by Jean-Francois Roy
A 'realm' optional argument was added to the get_credentials and set_credentials |
1879 |
port=None, path=None, verify_certificates=None, |
1880 |
realm=None): |
|
3777.3.1
by Aaron Bentley
Update docs |
1881 |
"""Set authentication credentials for a host.
|
1882 |
||
1883 |
Any existing credentials with matching scheme, host, port and path
|
|
1884 |
will be deleted, regardless of name.
|
|
1885 |
||
1886 |
:param name: An arbitrary name to describe this set of credentials.
|
|
1887 |
:param host: Name of the host that accepts these credentials.
|
|
1888 |
:param user: The username portion of these credentials.
|
|
1889 |
:param scheme: The URL scheme (e.g. ssh, http) the credentials apply
|
|
1890 |
to.
|
|
3777.3.2
by Aaron Bentley
Reverse order of scheme and password |
1891 |
:param password: Password portion of these credentials.
|
3777.3.1
by Aaron Bentley
Update docs |
1892 |
:param port: The IP port on the host that these credentials apply to.
|
1893 |
:param path: A filesystem path on the host that these credentials
|
|
1894 |
apply to.
|
|
1895 |
:param verify_certificates: On https, verify server certificates if
|
|
1896 |
True.
|
|
4081.1.1
by Jean-Francois Roy
A 'realm' optional argument was added to the get_credentials and set_credentials |
1897 |
:param realm: The http authentication realm (optional).
|
3777.3.1
by Aaron Bentley
Update docs |
1898 |
"""
|
3777.1.8
by Aaron Bentley
Commit work-in-progress |
1899 |
values = {'host': host, 'user': user} |
1900 |
if password is not None: |
|
1901 |
values['password'] = password |
|
1902 |
if scheme is not None: |
|
1903 |
values['scheme'] = scheme |
|
1904 |
if port is not None: |
|
1905 |
values['port'] = '%d' % port |
|
1906 |
if path is not None: |
|
1907 |
values['path'] = path |
|
3777.1.10
by Aaron Bentley
Ensure credentials are stored |
1908 |
if verify_certificates is not None: |
1909 |
values['verify_certificates'] = str(verify_certificates) |
|
4081.1.1
by Jean-Francois Roy
A 'realm' optional argument was added to the get_credentials and set_credentials |
1910 |
if realm is not None: |
1911 |
values['realm'] = realm |
|
3777.1.11
by Aaron Bentley
Ensure changed-name updates clear old values |
1912 |
config = self._get_config() |
1913 |
for_deletion = [] |
|
1914 |
for section, existing_values in config.items(): |
|
4081.1.1
by Jean-Francois Roy
A 'realm' optional argument was added to the get_credentials and set_credentials |
1915 |
for key in ('scheme', 'host', 'port', 'path', 'realm'): |
3777.1.11
by Aaron Bentley
Ensure changed-name updates clear old values |
1916 |
if existing_values.get(key) != values.get(key): |
1917 |
break
|
|
1918 |
else: |
|
1919 |
del config[section] |
|
1920 |
config.update({name: values}) |
|
3777.1.10
by Aaron Bentley
Ensure credentials are stored |
1921 |
self._save() |
3777.1.8
by Aaron Bentley
Commit work-in-progress |
1922 |
|
4304.2.1
by Vincent Ladeuil
Fix bug #367726 by reverting some default user handling introduced |
1923 |
def get_user(self, scheme, host, port=None, realm=None, path=None, |
4222.3.10
by Jelmer Vernooij
Avoid using the default username in the case of SMTP. |
1924 |
prompt=None, ask=False, default=None): |
2900.2.15
by Vincent Ladeuil
AuthenticationConfig can be queried for logins too (first step). |
1925 |
"""Get a user from authentication file.
|
1926 |
||
1927 |
:param scheme: protocol
|
|
1928 |
||
1929 |
:param host: the server address
|
|
1930 |
||
1931 |
:param port: the associated port (optional)
|
|
1932 |
||
1933 |
:param realm: the realm sent by the server (optional)
|
|
1934 |
||
1935 |
:param path: the absolute path on the server (optional)
|
|
1936 |
||
4222.3.4
by Jelmer Vernooij
Default to getpass.getuser() in AuthenticationConfig.get_user(), but allow |
1937 |
:param ask: Ask the user if there is no explicitly configured username
|
1938 |
(optional)
|
|
1939 |
||
4304.2.1
by Vincent Ladeuil
Fix bug #367726 by reverting some default user handling introduced |
1940 |
:param default: The username returned if none is defined (optional).
|
1941 |
||
2900.2.15
by Vincent Ladeuil
AuthenticationConfig can be queried for logins too (first step). |
1942 |
:return: The found user.
|
1943 |
"""
|
|
2900.2.16
by Vincent Ladeuil
Make hhtp proxy aware of AuthenticationConfig (for password). |
1944 |
credentials = self.get_credentials(scheme, host, port, user=None, |
4081.1.1
by Jean-Francois Roy
A 'realm' optional argument was added to the get_credentials and set_credentials |
1945 |
path=path, realm=realm) |
2900.2.15
by Vincent Ladeuil
AuthenticationConfig can be queried for logins too (first step). |
1946 |
if credentials is not None: |
1947 |
user = credentials['user'] |
|
1948 |
else: |
|
1949 |
user = None |
|
4222.3.2
by Jelmer Vernooij
Prompt for user names if they are not in the configuration. |
1950 |
if user is None: |
4222.3.4
by Jelmer Vernooij
Default to getpass.getuser() in AuthenticationConfig.get_user(), but allow |
1951 |
if ask: |
1952 |
if prompt is None: |
|
1953 |
# Create a default prompt suitable for most cases
|
|
5923.1.3
by Vincent Ladeuil
Even more unicode prompts fixes revealed by pqm. |
1954 |
prompt = u'%s' % (scheme.upper(),) + u' %(host)s username' |
4222.3.4
by Jelmer Vernooij
Default to getpass.getuser() in AuthenticationConfig.get_user(), but allow |
1955 |
# Special handling for optional fields in the prompt
|
1956 |
if port is not None: |
|
1957 |
prompt_host = '%s:%d' % (host, port) |
|
1958 |
else: |
|
1959 |
prompt_host = host |
|
1960 |
user = ui.ui_factory.get_username(prompt, host=prompt_host) |
|
4222.3.2
by Jelmer Vernooij
Prompt for user names if they are not in the configuration. |
1961 |
else: |
4222.3.10
by Jelmer Vernooij
Avoid using the default username in the case of SMTP. |
1962 |
user = default |
2900.2.15
by Vincent Ladeuil
AuthenticationConfig can be queried for logins too (first step). |
1963 |
return user |
1964 |
||
2900.2.12
by Vincent Ladeuil
Since all schemes query AuthenticationConfig then prompt user, make that |
1965 |
def get_password(self, scheme, host, user, port=None, |
1966 |
realm=None, path=None, prompt=None): |
|
1967 |
"""Get a password from authentication file or prompt the user for one.
|
|
1968 |
||
1969 |
:param scheme: protocol
|
|
1970 |
||
1971 |
:param host: the server address
|
|
1972 |
||
1973 |
:param port: the associated port (optional)
|
|
1974 |
||
1975 |
:param user: login
|
|
1976 |
||
1977 |
:param realm: the realm sent by the server (optional)
|
|
1978 |
||
1979 |
:param path: the absolute path on the server (optional)
|
|
1980 |
||
1981 |
:return: The found password or the one entered by the user.
|
|
1982 |
"""
|
|
4081.1.1
by Jean-Francois Roy
A 'realm' optional argument was added to the get_credentials and set_credentials |
1983 |
credentials = self.get_credentials(scheme, host, port, user, path, |
1984 |
realm) |
|
2900.2.12
by Vincent Ladeuil
Since all schemes query AuthenticationConfig then prompt user, make that |
1985 |
if credentials is not None: |
1986 |
password = credentials['password'] |
|
3420.1.3
by Vincent Ladeuil
John's review feedback. |
1987 |
if password is not None and scheme is 'ssh': |
3420.1.2
by Vincent Ladeuil
Fix bug #203186 by ignoring passwords for ssh and warning user. |
1988 |
trace.warning('password ignored in section [%s],' |
1989 |
' use an ssh agent instead'
|
|
1990 |
% credentials['name']) |
|
1991 |
password = None |
|
2900.2.16
by Vincent Ladeuil
Make hhtp proxy aware of AuthenticationConfig (for password). |
1992 |
else: |
1993 |
password = None |
|
2900.2.19
by Vincent Ladeuil
Mention proxy and https in the password prompts, with tests. |
1994 |
# Prompt user only if we could't find a password
|
2900.2.15
by Vincent Ladeuil
AuthenticationConfig can be queried for logins too (first step). |
1995 |
if password is None: |
2900.2.12
by Vincent Ladeuil
Since all schemes query AuthenticationConfig then prompt user, make that |
1996 |
if prompt is None: |
3420.1.2
by Vincent Ladeuil
Fix bug #203186 by ignoring passwords for ssh and warning user. |
1997 |
# Create a default prompt suitable for most cases
|
5923.1.3
by Vincent Ladeuil
Even more unicode prompts fixes revealed by pqm. |
1998 |
prompt = u'%s' % scheme.upper() + u' %(user)s@%(host)s password' |
2900.2.12
by Vincent Ladeuil
Since all schemes query AuthenticationConfig then prompt user, make that |
1999 |
# Special handling for optional fields in the prompt
|
2000 |
if port is not None: |
|
2001 |
prompt_host = '%s:%d' % (host, port) |
|
2002 |
else: |
|
2003 |
prompt_host = host |
|
2900.2.19
by Vincent Ladeuil
Mention proxy and https in the password prompts, with tests. |
2004 |
password = ui.ui_factory.get_password(prompt, |
2005 |
host=prompt_host, user=user) |
|
2900.2.12
by Vincent Ladeuil
Since all schemes query AuthenticationConfig then prompt user, make that |
2006 |
return password |
2007 |
||
2900.2.22
by Vincent Ladeuil
Polishing. |
2008 |
def decode_password(self, credentials, encoding): |
3757.3.1
by Vincent Ladeuil
Add credential stores plugging. |
2009 |
try: |
2010 |
cs = credential_store_registry.get_credential_store(encoding) |
|
2011 |
except KeyError: |
|
2012 |
raise ValueError('%r is not a known password_encoding' % encoding) |
|
2013 |
credentials['password'] = cs.decode_password(credentials) |
|
2900.2.22
by Vincent Ladeuil
Polishing. |
2014 |
return credentials |
3242.1.1
by Aaron Bentley
Implement BzrDir configuration |
2015 |
|
3242.3.17
by Aaron Bentley
Whitespace cleanup |
2016 |
|
3757.3.1
by Vincent Ladeuil
Add credential stores plugging. |
2017 |
class CredentialStoreRegistry(registry.Registry): |
2018 |
"""A class that registers credential stores.
|
|
2019 |
||
2020 |
A credential store provides access to credentials via the password_encoding
|
|
2021 |
field in authentication.conf sections.
|
|
2022 |
||
4283.1.1
by Jelmer Vernooij
Support fallback credential stores. |
2023 |
Except for stores provided by bzr itself, most stores are expected to be
|
3757.3.1
by Vincent Ladeuil
Add credential stores plugging. |
2024 |
provided by plugins that will therefore use
|
2025 |
register_lazy(password_encoding, module_name, member_name, help=help,
|
|
4283.1.1
by Jelmer Vernooij
Support fallback credential stores. |
2026 |
fallback=fallback) to install themselves.
|
4283.2.1
by Vincent Ladeuil
Add a test and cleanup some PEP8 issues. |
2027 |
|
2028 |
A fallback credential store is one that is queried if no credentials can be
|
|
2029 |
found via authentication.conf.
|
|
3757.3.1
by Vincent Ladeuil
Add credential stores plugging. |
2030 |
"""
|
2031 |
||
2032 |
def get_credential_store(self, encoding=None): |
|
2033 |
cs = self.get(encoding) |
|
2034 |
if callable(cs): |
|
2035 |
cs = cs() |
|
2036 |
return cs |
|
2037 |
||
4283.1.2
by Jelmer Vernooij
Add tests, NEWS item. |
2038 |
def is_fallback(self, name): |
4283.2.1
by Vincent Ladeuil
Add a test and cleanup some PEP8 issues. |
2039 |
"""Check if the named credentials store should be used as fallback."""
|
4283.1.2
by Jelmer Vernooij
Add tests, NEWS item. |
2040 |
return self.get_info(name) |
2041 |
||
4283.1.1
by Jelmer Vernooij
Support fallback credential stores. |
2042 |
def get_fallback_credentials(self, scheme, host, port=None, user=None, |
4283.1.2
by Jelmer Vernooij
Add tests, NEWS item. |
2043 |
path=None, realm=None): |
2044 |
"""Request credentials from all fallback credentials stores.
|
|
4283.2.1
by Vincent Ladeuil
Add a test and cleanup some PEP8 issues. |
2045 |
|
2046 |
The first credentials store that can provide credentials wins.
|
|
4283.1.2
by Jelmer Vernooij
Add tests, NEWS item. |
2047 |
"""
|
4283.2.1
by Vincent Ladeuil
Add a test and cleanup some PEP8 issues. |
2048 |
credentials = None |
4283.1.1
by Jelmer Vernooij
Support fallback credential stores. |
2049 |
for name in self.keys(): |
4283.1.2
by Jelmer Vernooij
Add tests, NEWS item. |
2050 |
if not self.is_fallback(name): |
4283.1.1
by Jelmer Vernooij
Support fallback credential stores. |
2051 |
continue
|
2052 |
cs = self.get_credential_store(name) |
|
4283.2.1
by Vincent Ladeuil
Add a test and cleanup some PEP8 issues. |
2053 |
credentials = cs.get_credentials(scheme, host, port, user, |
2054 |
path, realm) |
|
4283.1.1
by Jelmer Vernooij
Support fallback credential stores. |
2055 |
if credentials is not None: |
4283.2.1
by Vincent Ladeuil
Add a test and cleanup some PEP8 issues. |
2056 |
# We found some credentials
|
2057 |
break
|
|
2058 |
return credentials |
|
4283.1.1
by Jelmer Vernooij
Support fallback credential stores. |
2059 |
|
2060 |
def register(self, key, obj, help=None, override_existing=False, |
|
4283.2.1
by Vincent Ladeuil
Add a test and cleanup some PEP8 issues. |
2061 |
fallback=False): |
4283.1.1
by Jelmer Vernooij
Support fallback credential stores. |
2062 |
"""Register a new object to a name.
|
2063 |
||
2064 |
:param key: This is the key to use to request the object later.
|
|
2065 |
:param obj: The object to register.
|
|
2066 |
:param help: Help text for this entry. This may be a string or
|
|
2067 |
a callable. If it is a callable, it should take two
|
|
2068 |
parameters (registry, key): this registry and the key that
|
|
2069 |
the help was registered under.
|
|
2070 |
:param override_existing: Raise KeyErorr if False and something has
|
|
2071 |
already been registered for that key. If True, ignore if there
|
|
2072 |
is an existing key (always register the new value).
|
|
2073 |
:param fallback: Whether this credential store should be
|
|
2074 |
used as fallback.
|
|
2075 |
"""
|
|
4283.2.1
by Vincent Ladeuil
Add a test and cleanup some PEP8 issues. |
2076 |
return super(CredentialStoreRegistry, |
2077 |
self).register(key, obj, help, info=fallback, |
|
2078 |
override_existing=override_existing) |
|
4283.1.1
by Jelmer Vernooij
Support fallback credential stores. |
2079 |
|
2080 |
def register_lazy(self, key, module_name, member_name, |
|
4283.2.1
by Vincent Ladeuil
Add a test and cleanup some PEP8 issues. |
2081 |
help=None, override_existing=False, |
4283.1.1
by Jelmer Vernooij
Support fallback credential stores. |
2082 |
fallback=False): |
2083 |
"""Register a new credential store to be loaded on request.
|
|
2084 |
||
2085 |
:param module_name: The python path to the module. Such as 'os.path'.
|
|
2086 |
:param member_name: The member of the module to return. If empty or
|
|
2087 |
None, get() will return the module itself.
|
|
2088 |
:param help: Help text for this entry. This may be a string or
|
|
2089 |
a callable.
|
|
2090 |
:param override_existing: If True, replace the existing object
|
|
2091 |
with the new one. If False, if there is already something
|
|
2092 |
registered with the same key, raise a KeyError
|
|
2093 |
:param fallback: Whether this credential store should be
|
|
2094 |
used as fallback.
|
|
2095 |
"""
|
|
2096 |
return super(CredentialStoreRegistry, self).register_lazy( |
|
2097 |
key, module_name, member_name, help, |
|
2098 |
info=fallback, override_existing=override_existing) |
|
2099 |
||
3757.3.1
by Vincent Ladeuil
Add credential stores plugging. |
2100 |
|
2101 |
credential_store_registry = CredentialStoreRegistry() |
|
2102 |
||
2103 |
||
2104 |
class CredentialStore(object): |
|
2105 |
"""An abstract class to implement storage for credentials"""
|
|
2106 |
||
2107 |
def decode_password(self, credentials): |
|
4283.2.1
by Vincent Ladeuil
Add a test and cleanup some PEP8 issues. |
2108 |
"""Returns a clear text password for the provided credentials."""
|
3757.3.1
by Vincent Ladeuil
Add credential stores plugging. |
2109 |
raise NotImplementedError(self.decode_password) |
2110 |
||
4283.2.1
by Vincent Ladeuil
Add a test and cleanup some PEP8 issues. |
2111 |
def get_credentials(self, scheme, host, port=None, user=None, path=None, |
4283.1.1
by Jelmer Vernooij
Support fallback credential stores. |
2112 |
realm=None): |
2113 |
"""Return the matching credentials from this credential store.
|
|
2114 |
||
2115 |
This method is only called on fallback credential stores.
|
|
2116 |
"""
|
|
2117 |
raise NotImplementedError(self.get_credentials) |
|
2118 |
||
2119 |
||
3757.3.1
by Vincent Ladeuil
Add credential stores plugging. |
2120 |
|
2121 |
class PlainTextCredentialStore(CredentialStore): |
|
5131.2.1
by Martin
Permit bzrlib to run under python -OO by explictly assigning to __doc__ for user-visible docstrings |
2122 |
__doc__ = """Plain text credential store for the authentication.conf file""" |
3757.3.1
by Vincent Ladeuil
Add credential stores plugging. |
2123 |
|
2124 |
def decode_password(self, credentials): |
|
2125 |
"""See CredentialStore.decode_password."""
|
|
2126 |
return credentials['password'] |
|
2127 |
||
2128 |
||
2129 |
credential_store_registry.register('plain', PlainTextCredentialStore, |
|
2130 |
help=PlainTextCredentialStore.__doc__) |
|
2131 |
credential_store_registry.default_key = 'plain' |
|
2132 |
||
5912.5.5
by Florian Dorn
re-added blanks |
2133 |
|
5912.5.6
by Martin
Revert to implementation in config rather than a plugin |
2134 |
class Base64CredentialStore(CredentialStore): |
2135 |
__doc__ = """Base64 credential store for the authentication.conf file""" |
|
6561.2.1
by Vincent Ladeuil
Add a ``progress_bar`` config option. |
2136 |
|
5912.5.6
by Martin
Revert to implementation in config rather than a plugin |
2137 |
def decode_password(self, credentials): |
2138 |
"""See CredentialStore.decode_password."""
|
|
5912.5.7
by Martin
Minor cleanups and note about error case |
2139 |
# GZ 2012-07-28: Will raise binascii.Error if password is not base64,
|
2140 |
# should probably propogate as something more useful.
|
|
5912.5.6
by Martin
Revert to implementation in config rather than a plugin |
2141 |
return base64.decodestring(credentials['password']) |
2142 |
||
2143 |
credential_store_registry.register('base64', Base64CredentialStore, |
|
2144 |
help=Base64CredentialStore.__doc__) |
|
2145 |
||
2146 |
||
3242.3.14
by Aaron Bentley
Make BzrDirConfig use TransportConfig |
2147 |
class BzrDirConfig(object): |
2148 |
||
4288.1.1
by Robert Collins
Add support for a RemoteBzrDirConfig to support optimising push operations which need to look for default stacking locations. |
2149 |
def __init__(self, bzrdir): |
2150 |
self._bzrdir = bzrdir |
|
2151 |
self._config = bzrdir._get_config() |
|
3242.1.1
by Aaron Bentley
Implement BzrDir configuration |
2152 |
|
3242.3.11
by Aaron Bentley
Clean up BzrDirConfig usage |
2153 |
def set_default_stack_on(self, value): |
2154 |
"""Set the default stacking location.
|
|
2155 |
||
2156 |
It may be set to a location, or None.
|
|
2157 |
||
6472.2.3
by Jelmer Vernooij
More control dir. |
2158 |
This policy affects all branches contained by this control dir, except
|
2159 |
for those under repositories.
|
|
3242.3.11
by Aaron Bentley
Clean up BzrDirConfig usage |
2160 |
"""
|
4288.1.1
by Robert Collins
Add support for a RemoteBzrDirConfig to support optimising push operations which need to look for default stacking locations. |
2161 |
if self._config is None: |
6561.2.1
by Vincent Ladeuil
Add a ``progress_bar`` config option. |
2162 |
raise errors.BzrError("Cannot set configuration in %s" |
2163 |
% self._bzrdir) |
|
3242.3.11
by Aaron Bentley
Clean up BzrDirConfig usage |
2164 |
if value is None: |
3242.3.14
by Aaron Bentley
Make BzrDirConfig use TransportConfig |
2165 |
self._config.set_option('', 'default_stack_on') |
3242.3.11
by Aaron Bentley
Clean up BzrDirConfig usage |
2166 |
else: |
3242.3.14
by Aaron Bentley
Make BzrDirConfig use TransportConfig |
2167 |
self._config.set_option(value, 'default_stack_on') |
3242.3.11
by Aaron Bentley
Clean up BzrDirConfig usage |
2168 |
|
2169 |
def get_default_stack_on(self): |
|
2170 |
"""Return the default stacking location.
|
|
2171 |
||
2172 |
This will either be a location, or None.
|
|
2173 |
||
6472.2.3
by Jelmer Vernooij
More control dir. |
2174 |
This policy affects all branches contained by this control dir, except
|
2175 |
for those under repositories.
|
|
3242.3.11
by Aaron Bentley
Clean up BzrDirConfig usage |
2176 |
"""
|
4288.1.1
by Robert Collins
Add support for a RemoteBzrDirConfig to support optimising push operations which need to look for default stacking locations. |
2177 |
if self._config is None: |
2178 |
return None |
|
3242.3.14
by Aaron Bentley
Make BzrDirConfig use TransportConfig |
2179 |
value = self._config.get_option('default_stack_on') |
3242.3.11
by Aaron Bentley
Clean up BzrDirConfig usage |
2180 |
if value == '': |
2181 |
value = None |
|
2182 |
return value |
|
2183 |
||
3242.3.14
by Aaron Bentley
Make BzrDirConfig use TransportConfig |
2184 |
|
2185 |
class TransportConfig(object): |
|
3242.1.5
by Aaron Bentley
Update per review comments |
2186 |
"""A Config that reads/writes a config file on a Transport.
|
3242.1.4
by Aaron Bentley
Clean-up |
2187 |
|
2188 |
It is a low-level object that considers config data to be name/value pairs
|
|
5447.4.4
by Vincent Ladeuil
Implement config.get_sections() to clarify how sections can be used. |
2189 |
that may be associated with a section. Assigning meaning to these values
|
2190 |
is done at higher levels like TreeConfig.
|
|
3242.1.4
by Aaron Bentley
Clean-up |
2191 |
"""
|
3242.3.14
by Aaron Bentley
Make BzrDirConfig use TransportConfig |
2192 |
|
2193 |
def __init__(self, transport, filename): |
|
2194 |
self._transport = transport |
|
2195 |
self._filename = filename |
|
2196 |
||
3242.1.1
by Aaron Bentley
Implement BzrDir configuration |
2197 |
def get_option(self, name, section=None, default=None): |
2198 |
"""Return the value associated with a named option.
|
|
2199 |
||
2200 |
:param name: The name of the value
|
|
2201 |
:param section: The section the option is in (if any)
|
|
2202 |
:param default: The value to return if the value is not set
|
|
2203 |
:return: The value or default value
|
|
2204 |
"""
|
|
2205 |
configobj = self._get_configobj() |
|
2206 |
if section is None: |
|
2207 |
section_obj = configobj |
|
2208 |
else: |
|
2209 |
try: |
|
2210 |
section_obj = configobj[section] |
|
2211 |
except KeyError: |
|
2212 |
return default |
|
5743.8.13
by Vincent Ladeuil
Fix config calls for the actual implementation, including typos in parameters and TransportConfig support. |
2213 |
value = section_obj.get(name, default) |
5743.8.24
by Vincent Ladeuil
Clearly seaparate both sets of hooks for the old and new config implementations. |
2214 |
for hook in OldConfigHooks['get']: |
5743.8.25
by Vincent Ladeuil
Fix spurious spaces. |
2215 |
hook(self, name, value) |
5743.8.13
by Vincent Ladeuil
Fix config calls for the actual implementation, including typos in parameters and TransportConfig support. |
2216 |
return value |
3242.1.1
by Aaron Bentley
Implement BzrDir configuration |
2217 |
|
2218 |
def set_option(self, value, name, section=None): |
|
2219 |
"""Set the value associated with a named option.
|
|
2220 |
||
2221 |
:param value: The value to set
|
|
2222 |
:param name: The name of the value to set
|
|
2223 |
:param section: The section the option is in (if any)
|
|
2224 |
"""
|
|
2225 |
configobj = self._get_configobj() |
|
2226 |
if section is None: |
|
2227 |
configobj[name] = value |
|
2228 |
else: |
|
2229 |
configobj.setdefault(section, {})[name] = value |
|
5743.8.24
by Vincent Ladeuil
Clearly seaparate both sets of hooks for the old and new config implementations. |
2230 |
for hook in OldConfigHooks['set']: |
5743.8.13
by Vincent Ladeuil
Fix config calls for the actual implementation, including typos in parameters and TransportConfig support. |
2231 |
hook(self, name, value) |
3242.1.1
by Aaron Bentley
Implement BzrDir configuration |
2232 |
self._set_configobj(configobj) |
2233 |
||
5447.4.11
by Vincent Ladeuil
Implement ``bzr config --remove <option>``. |
2234 |
def remove_option(self, option_name, section_name=None): |
2235 |
configobj = self._get_configobj() |
|
2236 |
if section_name is None: |
|
2237 |
del configobj[option_name] |
|
2238 |
else: |
|
2239 |
del configobj[section_name][option_name] |
|
5743.8.24
by Vincent Ladeuil
Clearly seaparate both sets of hooks for the old and new config implementations. |
2240 |
for hook in OldConfigHooks['remove']: |
5743.8.15
by Vincent Ladeuil
Add tests for old config hooks covering bazaar.conf, locations.conf and branch.conf. |
2241 |
hook(self, option_name) |
5447.4.11
by Vincent Ladeuil
Implement ``bzr config --remove <option>``. |
2242 |
self._set_configobj(configobj) |
2243 |
||
4288.1.2
by Robert Collins
Create a server verb for doing BzrDir.get_config() |
2244 |
def _get_config_file(self): |
2245 |
try: |
|
5743.8.13
by Vincent Ladeuil
Fix config calls for the actual implementation, including typos in parameters and TransportConfig support. |
2246 |
f = StringIO(self._transport.get_bytes(self._filename)) |
5743.8.24
by Vincent Ladeuil
Clearly seaparate both sets of hooks for the old and new config implementations. |
2247 |
for hook in OldConfigHooks['load']: |
5743.8.13
by Vincent Ladeuil
Fix config calls for the actual implementation, including typos in parameters and TransportConfig support. |
2248 |
hook(self) |
2249 |
return f |
|
4288.1.2
by Robert Collins
Create a server verb for doing BzrDir.get_config() |
2250 |
except errors.NoSuchFile: |
2251 |
return StringIO() |
|
6110.5.1
by Jelmer Vernooij
Warn when a configuration file can not be opened. |
2252 |
except errors.PermissionDenied, e: |
2253 |
trace.warning("Permission denied while trying to open " |
|
2254 |
"configuration file %s.", urlutils.unescape_for_display( |
|
2255 |
urlutils.join(self._transport.base, self._filename), "utf-8")) |
|
2256 |
return StringIO() |
|
4288.1.2
by Robert Collins
Create a server verb for doing BzrDir.get_config() |
2257 |
|
5987.1.4
by Vincent Ladeuil
Proper error messages for config files with content in non-utf encoding or that cannot be parsed |
2258 |
def _external_url(self): |
2259 |
return urlutils.join(self._transport.external_url(), self._filename) |
|
2260 |
||
3242.1.1
by Aaron Bentley
Implement BzrDir configuration |
2261 |
def _get_configobj(self): |
4708.2.1
by Martin
Ensure all files opened by bazaar proper are explicitly closed |
2262 |
f = self._get_config_file() |
2263 |
try: |
|
5987.1.4
by Vincent Ladeuil
Proper error messages for config files with content in non-utf encoding or that cannot be parsed |
2264 |
try: |
2265 |
conf = ConfigObj(f, encoding='utf-8') |
|
2266 |
except configobj.ConfigObjError, e: |
|
2267 |
raise errors.ParseConfigError(e.errors, self._external_url()) |
|
2268 |
except UnicodeDecodeError: |
|
2269 |
raise errors.ConfigContentError(self._external_url()) |
|
4708.2.1
by Martin
Ensure all files opened by bazaar proper are explicitly closed |
2270 |
finally: |
2271 |
f.close() |
|
5987.1.4
by Vincent Ladeuil
Proper error messages for config files with content in non-utf encoding or that cannot be parsed |
2272 |
return conf |
3242.1.1
by Aaron Bentley
Implement BzrDir configuration |
2273 |
|
2274 |
def _set_configobj(self, configobj): |
|
2275 |
out_file = StringIO() |
|
2276 |
configobj.write(out_file) |
|
2277 |
out_file.seek(0) |
|
2278 |
self._transport.put_file(self._filename, out_file) |
|
5743.8.24
by Vincent Ladeuil
Clearly seaparate both sets of hooks for the old and new config implementations. |
2279 |
for hook in OldConfigHooks['save']: |
5743.8.13
by Vincent Ladeuil
Fix config calls for the actual implementation, including typos in parameters and TransportConfig support. |
2280 |
hook(self) |
5447.4.2
by Vincent Ladeuil
Implement the 'brz config' command. Read-only. |
2281 |
|
2282 |
||
5743.12.2
by Vincent Ladeuil
Basic registry for options. |
2283 |
class Option(object): |
5743.12.10
by Vincent Ladeuil
Add documentation. |
2284 |
"""An option definition.
|
2285 |
||
2286 |
The option *values* are stored in config files and found in sections.
|
|
2287 |
||
2288 |
Here we define various properties about the option itself, its default
|
|
6059.1.4
by Vincent Ladeuil
Add a doc string for the Option constructor. |
2289 |
value, how to convert it from stores, what to do when invalid values are
|
2290 |
encoutered, in which config files it can be stored.
|
|
5743.12.10
by Vincent Ladeuil
Add documentation. |
2291 |
"""
|
5743.12.2
by Vincent Ladeuil
Basic registry for options. |
2292 |
|
6393.3.1
by Vincent Ladeuil
Configuration option value can be overridden by os environ variables |
2293 |
def __init__(self, name, override_from_env=None, |
2294 |
default=None, default_from_env=None, |
|
6393.3.2
by Vincent Ladeuil
Merge trunk resolving conflicts |
2295 |
help=None, from_unicode=None, invalid=None, unquote=True): |
6059.1.4
by Vincent Ladeuil
Add a doc string for the Option constructor. |
2296 |
"""Build an option definition.
|
2297 |
||
2298 |
:param name: the name used to refer to the option.
|
|
2299 |
||
6393.3.1
by Vincent Ladeuil
Configuration option value can be overridden by os environ variables |
2300 |
:param override_from_env: A list of environment variables which can
|
2301 |
provide override any configuration setting.
|
|
2302 |
||
6059.1.4
by Vincent Ladeuil
Add a doc string for the Option constructor. |
2303 |
:param default: the default value to use when none exist in the config
|
6091.3.6
by Vincent Ladeuil
Replace ugly default value declarations with ad-hoc and limited conversion to unicode strings. |
2304 |
stores. This is either a string that ``from_unicode`` will convert
|
6349.3.1
by Vincent Ladeuil
Allow config option default value to be a python callable |
2305 |
into the proper type, a callable returning a unicode string so that
|
2306 |
``from_unicode`` can be used on the return value, or a python
|
|
2307 |
object that can be stringified (so only the empty list is supported
|
|
2308 |
for example).
|
|
6059.1.4
by Vincent Ladeuil
Add a doc string for the Option constructor. |
2309 |
|
6082.2.1
by Vincent Ladeuil
Implement default values from environment for config options |
2310 |
:param default_from_env: A list of environment variables which can
|
2311 |
provide a default value. 'default' will be used only if none of the
|
|
2312 |
variables specified here are set in the environment.
|
|
2313 |
||
6059.1.4
by Vincent Ladeuil
Add a doc string for the Option constructor. |
2314 |
:param help: a doc string to explain the option to the user.
|
2315 |
||
2316 |
:param from_unicode: a callable to convert the unicode string
|
|
6586.1.1
by Vincent Ladeuil
Fix various typos in docstrings. Rename 'buffer' to 'buf' since it's now a python builtin function. |
2317 |
representing the option value in a store or its default value.
|
6059.1.5
by Vincent Ladeuil
Handle invalid config option values. |
2318 |
|
2319 |
:param invalid: the action to be taken when an invalid value is
|
|
2320 |
encountered in a store. This is called only when from_unicode is
|
|
6059.1.7
by Vincent Ladeuil
Catch TypeError when a list value is encountered while attempting to |
2321 |
invoked to convert a string and returns None or raise ValueError or
|
2322 |
TypeError. Accepted values are: None (ignore invalid values),
|
|
2323 |
'warning' (emit a warning), 'error' (emit an error message and
|
|
2324 |
terminates).
|
|
6385.1.1
by Vincent Ladeuil
Stores allow Stacks to control when values are quoted/unquoted |
2325 |
|
2326 |
:param unquote: should the unicode value be unquoted before conversion.
|
|
2327 |
This should be used only when the store providing the values cannot
|
|
2328 |
safely unquote them (see http://pad.lv/906897). It is provided so
|
|
2329 |
daughter classes can handle the quoting themselves.
|
|
6059.1.4
by Vincent Ladeuil
Add a doc string for the Option constructor. |
2330 |
"""
|
6393.3.1
by Vincent Ladeuil
Configuration option value can be overridden by os environ variables |
2331 |
if override_from_env is None: |
2332 |
override_from_env = [] |
|
6082.2.1
by Vincent Ladeuil
Implement default values from environment for config options |
2333 |
if default_from_env is None: |
2334 |
default_from_env = [] |
|
5743.12.2
by Vincent Ladeuil
Basic registry for options. |
2335 |
self.name = name |
6393.3.1
by Vincent Ladeuil
Configuration option value can be overridden by os environ variables |
2336 |
self.override_from_env = override_from_env |
6091.3.6
by Vincent Ladeuil
Replace ugly default value declarations with ad-hoc and limited conversion to unicode strings. |
2337 |
# Convert the default value to a unicode string so all values are
|
2338 |
# strings internally before conversion (via from_unicode) is attempted.
|
|
2339 |
if default is None: |
|
2340 |
self.default = None |
|
2341 |
elif isinstance(default, list): |
|
2342 |
# Only the empty list is supported
|
|
2343 |
if default: |
|
2344 |
raise AssertionError( |
|
2345 |
'Only empty lists are supported as default values') |
|
2346 |
self.default = u',' |
|
6133.4.35
by John Arbash Meinel
Change int_from_store into float_from_store, which allows us to set the time under 1.0s. |
2347 |
elif isinstance(default, (str, unicode, bool, int, float)): |
6091.3.6
by Vincent Ladeuil
Replace ugly default value declarations with ad-hoc and limited conversion to unicode strings. |
2348 |
# Rely on python to convert strings, booleans and integers
|
2349 |
self.default = u'%s' % (default,) |
|
6351.3.3
by Jelmer Vernooij
Convert more stuff to use config stacks. |
2350 |
elif callable(default): |
2351 |
self.default = default |
|
6091.3.6
by Vincent Ladeuil
Replace ugly default value declarations with ad-hoc and limited conversion to unicode strings. |
2352 |
else: |
2353 |
# other python objects are not expected
|
|
2354 |
raise AssertionError('%r is not supported as a default value' |
|
2355 |
% (default,)) |
|
6082.2.1
by Vincent Ladeuil
Implement default values from environment for config options |
2356 |
self.default_from_env = default_from_env |
6449.2.2
by Jelmer Vernooij
Moar tests. |
2357 |
self._help = help |
6059.1.1
by Vincent Ladeuil
Implement from_unicode to convert config option values from store. |
2358 |
self.from_unicode = from_unicode |
6385.1.1
by Vincent Ladeuil
Stores allow Stacks to control when values are quoted/unquoted |
2359 |
self.unquote = unquote |
6059.1.5
by Vincent Ladeuil
Handle invalid config option values. |
2360 |
if invalid and invalid not in ('warning', 'error'): |
2361 |
raise AssertionError("%s not supported for 'invalid'" % (invalid,)) |
|
2362 |
self.invalid = invalid |
|
5743.12.4
by Vincent Ladeuil
An option can provide a default value. |
2363 |
|
6449.2.2
by Jelmer Vernooij
Moar tests. |
2364 |
@property
|
2365 |
def help(self): |
|
2366 |
return self._help |
|
2367 |
||
6385.1.1
by Vincent Ladeuil
Stores allow Stacks to control when values are quoted/unquoted |
2368 |
def convert_from_unicode(self, store, unicode_value): |
2369 |
if self.unquote and store is not None and unicode_value is not None: |
|
2370 |
unicode_value = store.unquote(unicode_value) |
|
6091.3.1
by Vincent Ladeuil
Add convert_from_unicode to Option and rewrite the tests to need only an |
2371 |
if self.from_unicode is None or unicode_value is None: |
6091.3.3
by Vincent Ladeuil
Update registered option default values and also convert the default value if the first conversion fails. |
2372 |
# Don't convert or nothing to convert
|
6091.3.1
by Vincent Ladeuil
Add convert_from_unicode to Option and rewrite the tests to need only an |
2373 |
return unicode_value |
2374 |
try: |
|
2375 |
converted = self.from_unicode(unicode_value) |
|
2376 |
except (ValueError, TypeError): |
|
2377 |
# Invalid values are ignored
|
|
2378 |
converted = None |
|
2379 |
if converted is None and self.invalid is not None: |
|
2380 |
# The conversion failed
|
|
2381 |
if self.invalid == 'warning': |
|
2382 |
trace.warning('Value "%s" is not valid for "%s"', |
|
2383 |
unicode_value, self.name) |
|
2384 |
elif self.invalid == 'error': |
|
2385 |
raise errors.ConfigOptionValueError(self.name, unicode_value) |
|
2386 |
return converted |
|
2387 |
||
6393.3.1
by Vincent Ladeuil
Configuration option value can be overridden by os environ variables |
2388 |
def get_override(self): |
2389 |
value = None |
|
2390 |
for var in self.override_from_env: |
|
2391 |
try: |
|
2392 |
# If the env variable is defined, its value takes precedence
|
|
2393 |
value = os.environ[var].decode(osutils.get_user_encoding()) |
|
2394 |
break
|
|
2395 |
except KeyError: |
|
2396 |
continue
|
|
2397 |
return value |
|
2398 |
||
5743.12.4
by Vincent Ladeuil
An option can provide a default value. |
2399 |
def get_default(self): |
6091.3.4
by Vincent Ladeuil
Clarify get_default. |
2400 |
value = None |
6082.2.1
by Vincent Ladeuil
Implement default values from environment for config options |
2401 |
for var in self.default_from_env: |
2402 |
try: |
|
6091.3.4
by Vincent Ladeuil
Clarify get_default. |
2403 |
# If the env variable is defined, its value is the default one
|
6351.3.6
by Jelmer Vernooij
More fixes for unicode handling. |
2404 |
value = os.environ[var].decode(osutils.get_user_encoding()) |
6091.3.4
by Vincent Ladeuil
Clarify get_default. |
2405 |
break
|
6082.2.1
by Vincent Ladeuil
Implement default values from environment for config options |
2406 |
except KeyError: |
2407 |
continue
|
|
6091.3.4
by Vincent Ladeuil
Clarify get_default. |
2408 |
if value is None: |
2409 |
# Otherwise, fallback to the value defined at registration
|
|
6351.3.3
by Jelmer Vernooij
Convert more stuff to use config stacks. |
2410 |
if callable(self.default): |
2411 |
value = self.default() |
|
6349.3.1
by Vincent Ladeuil
Allow config option default value to be a python callable |
2412 |
if not isinstance(value, unicode): |
2413 |
raise AssertionError( |
|
6523.1.1
by Vincent Ladeuil
Fix some test issues raised by mgz. |
2414 |
"Callable default value for '%s' should be unicode" |
2415 |
% (self.name)) |
|
6351.3.3
by Jelmer Vernooij
Convert more stuff to use config stacks. |
2416 |
else: |
2417 |
value = self.default |
|
6091.3.4
by Vincent Ladeuil
Clarify get_default. |
2418 |
return value |
5743.12.4
by Vincent Ladeuil
An option can provide a default value. |
2419 |
|
6437.42.1
by Jelmer Vernooij
Make sure help options can provide their own help topic. |
2420 |
def get_help_topic(self): |
2421 |
return self.name |
|
2422 |
||
6059.3.1
by Vincent Ladeuil
Provide per-config option help |
2423 |
def get_help_text(self, additional_see_also=None, plain=True): |
2424 |
result = self.help |
|
2425 |
from bzrlib import help_topics |
|
2426 |
result += help_topics._format_see_also(additional_see_also) |
|
2427 |
if plain: |
|
2428 |
result = help_topics.help_as_plain_text(result) |
|
2429 |
return result |
|
2430 |
||
5743.12.2
by Vincent Ladeuil
Basic registry for options. |
2431 |
|
6059.1.2
by Vincent Ladeuil
Define a proper converter to avoid lazy import issues. |
2432 |
# Predefined converters to get proper values from store
|
2433 |
||
2434 |
def bool_from_store(unicode_str): |
|
2435 |
return ui.bool_from_string(unicode_str) |
|
2436 |
||
6015.25.1
by Vincent Ladeuil
Minimal backport to fix fdatasync options handling |
2437 |
|
6059.1.6
by Vincent Ladeuil
Implement integer config options. |
2438 |
def int_from_store(unicode_str): |
2439 |
return int(unicode_str) |
|
2440 |
||
2441 |
||
6385.1.7
by Vincent Ladeuil
Feedback from review and minor tweaks. |
2442 |
_unit_suffixes = dict(K=10**3, M=10**6, G=10**9) |
6378.1.1
by Vincent Ladeuil
Add int_SI_from_store as a config option helper |
2443 |
|
2444 |
def int_SI_from_store(unicode_str): |
|
6378.1.2
by Vincent Ladeuil
Migrate add.maximum_file_size to the new config scheme |
2445 |
"""Convert a human readable size in SI units, e.g 10MB into an integer.
|
2446 |
||
2447 |
Accepted suffixes are K,M,G. It is case-insensitive and may be followed
|
|
2448 |
by a trailing b (i.e. Kb, MB). This is intended to be practical and not
|
|
2449 |
pedantic.
|
|
2450 |
||
2451 |
:return Integer, expanded to its base-10 value if a proper SI unit is
|
|
2452 |
found, None otherwise.
|
|
2453 |
"""
|
|
6385.1.7
by Vincent Ladeuil
Feedback from review and minor tweaks. |
2454 |
regexp = "^(\d+)(([" + ''.join(_unit_suffixes) + "])b?)?$" |
6378.1.1
by Vincent Ladeuil
Add int_SI_from_store as a config option helper |
2455 |
p = re.compile(regexp, re.IGNORECASE) |
2456 |
m = p.match(unicode_str) |
|
2457 |
val = None |
|
2458 |
if m is not None: |
|
2459 |
val, _, unit = m.groups() |
|
2460 |
val = int(val) |
|
2461 |
if unit: |
|
2462 |
try: |
|
6385.1.7
by Vincent Ladeuil
Feedback from review and minor tweaks. |
2463 |
coeff = _unit_suffixes[unit.upper()] |
6378.1.1
by Vincent Ladeuil
Add int_SI_from_store as a config option helper |
2464 |
except KeyError: |
2465 |
raise ValueError(gettext('{0} is not an SI unit.').format(unit)) |
|
2466 |
val *= coeff |
|
2467 |
return val |
|
2468 |
||
2469 |
||
6133.4.35
by John Arbash Meinel
Change int_from_store into float_from_store, which allows us to set the time under 1.0s. |
2470 |
def float_from_store(unicode_str): |
2471 |
return float(unicode_str) |
|
2472 |
||
2473 |
||
6561.2.1
by Vincent Ladeuil
Add a ``progress_bar`` config option. |
2474 |
# Use an empty dict to initialize an empty configobj avoiding all parsing and
|
2475 |
# encoding checks
|
|
6082.5.15
by Vincent Ladeuil
Use explicit kwargs for the list converter. |
2476 |
_list_converter_config = configobj.ConfigObj( |
2477 |
{}, encoding='utf-8', list_values=True, interpolation=False) |
|
2478 |
||
6082.5.14
by Vincent Ladeuil
Create a single configobj for list conversions and just reset() it when needed. |
2479 |
|
6385.1.1
by Vincent Ladeuil
Stores allow Stacks to control when values are quoted/unquoted |
2480 |
class ListOption(Option): |
2481 |
||
2482 |
def __init__(self, name, default=None, default_from_env=None, |
|
2483 |
help=None, invalid=None): |
|
2484 |
"""A list Option definition.
|
|
2485 |
||
2486 |
This overrides the base class so the conversion from a unicode string
|
|
2487 |
can take quoting into account.
|
|
2488 |
"""
|
|
2489 |
super(ListOption, self).__init__( |
|
2490 |
name, default=default, default_from_env=default_from_env, |
|
2491 |
from_unicode=self.from_unicode, help=help, |
|
2492 |
invalid=invalid, unquote=False) |
|
2493 |
||
6385.1.7
by Vincent Ladeuil
Feedback from review and minor tweaks. |
2494 |
def from_unicode(self, unicode_str): |
2495 |
if not isinstance(unicode_str, basestring): |
|
6385.1.1
by Vincent Ladeuil
Stores allow Stacks to control when values are quoted/unquoted |
2496 |
raise TypeError |
2497 |
# Now inject our string directly as unicode. All callers got their
|
|
2498 |
# value from configobj, so values that need to be quoted are already
|
|
2499 |
# properly quoted.
|
|
2500 |
_list_converter_config.reset() |
|
6385.1.7
by Vincent Ladeuil
Feedback from review and minor tweaks. |
2501 |
_list_converter_config._parse([u"list=%s" % (unicode_str,)]) |
6385.1.1
by Vincent Ladeuil
Stores allow Stacks to control when values are quoted/unquoted |
2502 |
maybe_list = _list_converter_config['list'] |
2503 |
if isinstance(maybe_list, basestring): |
|
2504 |
if maybe_list: |
|
2505 |
# A single value, most probably the user forgot (or didn't care
|
|
2506 |
# to add) the final ','
|
|
2507 |
l = [maybe_list] |
|
2508 |
else: |
|
2509 |
# The empty string, convert to empty list
|
|
2510 |
l = [] |
|
6059.2.1
by Vincent Ladeuil
Implement list config options. |
2511 |
else: |
6385.1.1
by Vincent Ladeuil
Stores allow Stacks to control when values are quoted/unquoted |
2512 |
# We rely on ConfigObj providing us with a list already
|
2513 |
l = maybe_list |
|
2514 |
return l |
|
6059.2.1
by Vincent Ladeuil
Implement list config options. |
2515 |
|
2516 |
||
6449.2.1
by Jelmer Vernooij
Add bzrlib.config.RegistryOption. |
2517 |
class RegistryOption(Option): |
2518 |
"""Option for a choice from a registry."""
|
|
2519 |
||
6449.3.1
by Jelmer Vernooij
convert bzr.transform.orphan_policy over to using config stacks. |
2520 |
def __init__(self, name, registry, default_from_env=None, |
6449.2.1
by Jelmer Vernooij
Add bzrlib.config.RegistryOption. |
2521 |
help=None, invalid=None): |
2522 |
"""A registry based Option definition.
|
|
2523 |
||
2524 |
This overrides the base class so the conversion from a unicode string
|
|
2525 |
can take quoting into account.
|
|
2526 |
"""
|
|
2527 |
super(RegistryOption, self).__init__( |
|
6449.3.1
by Jelmer Vernooij
convert bzr.transform.orphan_policy over to using config stacks. |
2528 |
name, default=lambda: unicode(registry.default_key), |
2529 |
default_from_env=default_from_env, |
|
6449.2.2
by Jelmer Vernooij
Moar tests. |
2530 |
from_unicode=self.from_unicode, help=help, |
6449.2.1
by Jelmer Vernooij
Add bzrlib.config.RegistryOption. |
2531 |
invalid=invalid, unquote=False) |
2532 |
self.registry = registry |
|
2533 |
||
2534 |
def from_unicode(self, unicode_str): |
|
2535 |
if not isinstance(unicode_str, basestring): |
|
2536 |
raise TypeError |
|
2537 |
try: |
|
2538 |
return self.registry.get(unicode_str) |
|
2539 |
except KeyError: |
|
2540 |
raise ValueError( |
|
2541 |
"Invalid value %s for %s." |
|
2542 |
"See help for a list of possible values." % (unicode_str, |
|
2543 |
self.name)) |
|
2544 |
||
6449.2.2
by Jelmer Vernooij
Moar tests. |
2545 |
@property
|
2546 |
def help(self): |
|
2547 |
ret = [self._help, "\n\nThe following values are supported:\n"] |
|
6449.2.1
by Jelmer Vernooij
Add bzrlib.config.RegistryOption. |
2548 |
for key in self.registry.keys(): |
2549 |
ret.append(" %s - %s\n" % (key, self.registry.get_help(key))) |
|
2550 |
return "".join(ret) |
|
2551 |
||
2552 |
||
6587.2.4
by Vincent Ladeuil
Allow hyphens in option names to unbreak compatibility. |
2553 |
_option_ref_re = lazy_regex.lazy_compile('({[^\d\W](?:\.\w|-\w|\w)*})') |
6587.2.2
by Vincent Ladeuil
Stricter checks on configuration option names |
2554 |
"""Describes an expandable option reference.
|
2555 |
||
2556 |
We want to match the most embedded reference first.
|
|
2557 |
||
2558 |
I.e. for '{{foo}}' we will get '{foo}',
|
|
2559 |
for '{bar{baz}}' we will get '{baz}'
|
|
2560 |
"""
|
|
2561 |
||
2562 |
def iter_option_refs(string): |
|
2563 |
# Split isolate refs so every other chunk is a ref
|
|
2564 |
is_ref = False |
|
2565 |
for chunk in _option_ref_re.split(string): |
|
2566 |
yield is_ref, chunk |
|
2567 |
is_ref = not is_ref |
|
2568 |
||
2569 |
||
6056.2.4
by Vincent Ladeuil
Option help is now part of the object itself. |
2570 |
class OptionRegistry(registry.Registry): |
2571 |
"""Register config options by their name.
|
|
2572 |
||
2573 |
This overrides ``registry.Registry`` to simplify registration by acquiring
|
|
6056.2.5
by Vincent Ladeuil
Fix typos caught by jelmer. |
2574 |
some information from the option object itself.
|
6056.2.4
by Vincent Ladeuil
Option help is now part of the object itself. |
2575 |
"""
|
2576 |
||
6587.2.2
by Vincent Ladeuil
Stricter checks on configuration option names |
2577 |
def _check_option_name(self, option_name): |
2578 |
"""Ensures an option name is valid.
|
|
2579 |
||
2580 |
:param option_name: The name to validate.
|
|
2581 |
"""
|
|
2582 |
if _option_ref_re.match('{%s}' % option_name) is None: |
|
2583 |
raise errors.IllegalOptionName(option_name) |
|
2584 |
||
6056.2.4
by Vincent Ladeuil
Option help is now part of the object itself. |
2585 |
def register(self, option): |
2586 |
"""Register a new option to its name.
|
|
2587 |
||
2588 |
:param option: The option to register. Its name is used as the key.
|
|
2589 |
"""
|
|
6587.2.2
by Vincent Ladeuil
Stricter checks on configuration option names |
2590 |
self._check_option_name(option.name) |
6056.2.4
by Vincent Ladeuil
Option help is now part of the object itself. |
2591 |
super(OptionRegistry, self).register(option.name, option, |
2592 |
help=option.help) |
|
2593 |
||
2594 |
def register_lazy(self, key, module_name, member_name): |
|
2595 |
"""Register a new option to be loaded on request.
|
|
2596 |
||
6059.3.1
by Vincent Ladeuil
Provide per-config option help |
2597 |
:param key: the key to request the option later. Since the registration
|
2598 |
is lazy, it should be provided and match the option name.
|
|
2599 |
||
2600 |
:param module_name: the python path to the module. Such as 'os.path'.
|
|
2601 |
||
2602 |
:param member_name: the member of the module to return. If empty or
|
|
6056.2.4
by Vincent Ladeuil
Option help is now part of the object itself. |
2603 |
None, get() will return the module itself.
|
2604 |
"""
|
|
6587.2.2
by Vincent Ladeuil
Stricter checks on configuration option names |
2605 |
self._check_option_name(key) |
6056.2.4
by Vincent Ladeuil
Option help is now part of the object itself. |
2606 |
super(OptionRegistry, self).register_lazy(key, |
2607 |
module_name, member_name) |
|
2608 |
||
2609 |
def get_help(self, key=None): |
|
2610 |
"""Get the help text associated with the given key"""
|
|
2611 |
option = self.get(key) |
|
2612 |
the_help = option.help |
|
2613 |
if callable(the_help): |
|
2614 |
return the_help(self, key) |
|
2615 |
return the_help |
|
2616 |
||
2617 |
||
2618 |
option_registry = OptionRegistry() |
|
5743.12.2
by Vincent Ladeuil
Basic registry for options. |
2619 |
|
5743.12.3
by Vincent Ladeuil
More basic tests for options. Start tests for all registered options. |
2620 |
|
6056.2.1
by Vincent Ladeuil
Migrate output_encoding. |
2621 |
# Registered options in lexicographical order
|
2622 |
||
2623 |
option_registry.register( |
|
6372.4.1
by Jelmer Vernooij
Convert 'append_revisions_only' over to config stacks. |
2624 |
Option('append_revisions_only', |
6372.4.2
by Jelmer Vernooij
Fix remaining tests. |
2625 |
default=None, from_unicode=bool_from_store, invalid='warning', |
6372.4.1
by Jelmer Vernooij
Convert 'append_revisions_only' over to config stacks. |
2626 |
help='''\ |
2627 |
Whether to only append revisions to the mainline.
|
|
2628 |
||
2629 |
If this is set to true, then it is not possible to change the
|
|
2630 |
existing mainline of the branch.
|
|
2631 |
''')) |
|
2632 |
option_registry.register( |
|
6385.1.1
by Vincent Ladeuil
Stores allow Stacks to control when values are quoted/unquoted |
2633 |
ListOption('acceptable_keys', |
2634 |
default=None, |
|
6351.3.2
by Jelmer Vernooij
Convert some gpg options to config stacks. |
2635 |
help="""\ |
2636 |
List of GPG key patterns which are acceptable for verification.
|
|
2637 |
""")) |
|
2638 |
option_registry.register( |
|
6378.1.2
by Vincent Ladeuil
Migrate add.maximum_file_size to the new config scheme |
2639 |
Option('add.maximum_file_size', |
2640 |
default=u'20MB', from_unicode=int_SI_from_store, |
|
6378.1.3
by Vincent Ladeuil
log_format has been migrated but the old config method needs to be deprecated. |
2641 |
help="""\ |
2642 |
Size above which files should be added manually.
|
|
6378.1.2
by Vincent Ladeuil
Migrate add.maximum_file_size to the new config scheme |
2643 |
|
2644 |
Files below this size are added automatically when using ``bzr add`` without
|
|
2645 |
arguments.
|
|
2646 |
||
2647 |
A negative value means disable the size check.
|
|
2648 |
""")) |
|
2649 |
option_registry.register( |
|
6379.11.1
by Vincent Ladeuil
Migrate location options to config stacks. |
2650 |
Option('bound', |
2651 |
default=None, from_unicode=bool_from_store, |
|
2652 |
help="""\ |
|
2653 |
Is the branch bound to ``bound_location``.
|
|
2654 |
||
2655 |
If set to "True", the branch should act as a checkout, and push each commit to
|
|
2656 |
the bound_location. This option is normally set by ``bind``/``unbind``.
|
|
2657 |
||
2658 |
See also: bound_location.
|
|
2659 |
""")) |
|
2660 |
option_registry.register( |
|
2661 |
Option('bound_location', |
|
2662 |
default=None, |
|
2663 |
help="""\ |
|
2664 |
The location that commits should go to when acting as a checkout.
|
|
2665 |
||
2666 |
This option is normally set by ``bind``.
|
|
2667 |
||
2668 |
See also: bound.
|
|
2669 |
""")) |
|
2670 |
option_registry.register( |
|
6404.1.1
by Vincent Ladeuil
Migrate branch.fetch_tags |
2671 |
Option('branch.fetch_tags', default=False, from_unicode=bool_from_store, |
2672 |
help="""\ |
|
2673 |
Whether revisions associated with tags should be fetched.
|
|
2674 |
""")) |
|
6449.6.7
by Jelmer Vernooij
Fix tests. |
2675 |
option_registry.register_lazy( |
2676 |
'bzr.transform.orphan_policy', 'bzrlib.transform', 'opt_transform_orphan') |
|
6404.1.1
by Vincent Ladeuil
Migrate branch.fetch_tags |
2677 |
option_registry.register( |
6082.5.9
by Vincent Ladeuil
Cleanup criss-cross merge confusion |
2678 |
Option('bzr.workingtree.worth_saving_limit', default=10, |
6059.4.4
by Vincent Ladeuil
Migrate bzr.workingtree.worth_saving_limit to stack-based config. |
2679 |
from_unicode=int_from_store, invalid='warning', |
2680 |
help='''\ |
|
2681 |
How many changes before saving the dirstate.
|
|
2682 |
||
6059.4.6
by Vincent Ladeuil
Fix the help strings as proposed by jam. |
2683 |
-1 means that we will never rewrite the dirstate file for only
|
2684 |
stat-cache changes. Regardless of this setting, we will always rewrite
|
|
2685 |
the dirstate file if a file is added/removed/renamed/etc. This flag only
|
|
2686 |
affects the behavior of updating the dirstate file after we notice that
|
|
2687 |
a file has been touched.
|
|
6059.4.4
by Vincent Ladeuil
Migrate bzr.workingtree.worth_saving_limit to stack-based config. |
2688 |
''')) |
2689 |
option_registry.register( |
|
6463.1.1
by Jelmer Vernooij
Migrate 'bugtracker' setting to config stacks. |
2690 |
Option('bugtracker', default=None, |
2691 |
help='''\ |
|
2692 |
Default bug tracker to use.
|
|
2693 |
||
2694 |
This bug tracker will be used for example when marking bugs
|
|
2695 |
as fixed using ``bzr commit --fixes``, if no explicit
|
|
2696 |
bug tracker was specified.
|
|
2697 |
''')) |
|
2698 |
option_registry.register( |
|
6351.3.2
by Jelmer Vernooij
Convert some gpg options to config stacks. |
2699 |
Option('check_signatures', default=CHECK_IF_POSSIBLE, |
2700 |
from_unicode=signature_policy_from_unicode, |
|
2701 |
help='''\ |
|
2702 |
GPG checking policy.
|
|
2703 |
||
2704 |
Possible values: require, ignore, check-available (default)
|
|
2705 |
||
2706 |
this option will control whether bzr will require good gpg
|
|
2707 |
signatures, ignore them, or check them if they are
|
|
2708 |
present.
|
|
2709 |
''')) |
|
2710 |
option_registry.register( |
|
6421.3.1
by Vincent Ladeuil
Migrate more branch options to config stacks. |
2711 |
Option('child_submit_format', |
2712 |
help='''The preferred format of submissions to this branch.''')) |
|
2713 |
option_registry.register( |
|
2714 |
Option('child_submit_to', |
|
2715 |
help='''Where submissions to this branch are mailed to.''')) |
|
2716 |
option_registry.register( |
|
6351.3.2
by Jelmer Vernooij
Convert some gpg options to config stacks. |
2717 |
Option('create_signatures', default=SIGN_WHEN_REQUIRED, |
2718 |
from_unicode=signing_policy_from_unicode, |
|
2719 |
help='''\ |
|
2720 |
GPG Signing policy.
|
|
2721 |
||
2722 |
Possible values: always, never, when-required (default)
|
|
2723 |
||
2724 |
This option controls whether bzr will always create
|
|
2725 |
gpg signatures or not on commits.
|
|
2726 |
''')) |
|
2727 |
option_registry.register( |
|
6082.5.9
by Vincent Ladeuil
Cleanup criss-cross merge confusion |
2728 |
Option('dirstate.fdatasync', default=True, |
6059.4.4
by Vincent Ladeuil
Migrate bzr.workingtree.worth_saving_limit to stack-based config. |
2729 |
from_unicode=bool_from_store, |
6059.3.1
by Vincent Ladeuil
Provide per-config option help |
2730 |
help='''\ |
6056.2.4
by Vincent Ladeuil
Option help is now part of the object itself. |
2731 |
Flush dirstate changes onto physical disk?
|
2732 |
||
2733 |
If true (default), working tree metadata changes are flushed through the
|
|
2734 |
OS buffers to physical disk. This is somewhat slower, but means data
|
|
2735 |
should not be lost if the machine crashes. See also repository.fdatasync.
|
|
2736 |
''')) |
|
2737 |
option_registry.register( |
|
6385.1.1
by Vincent Ladeuil
Stores allow Stacks to control when values are quoted/unquoted |
2738 |
ListOption('debug_flags', default=[], |
6059.4.5
by Vincent Ladeuil
Migrate debug_flags to stack-based config. |
2739 |
help='Debug flags to activate.')) |
2740 |
option_registry.register( |
|
6082.5.9
by Vincent Ladeuil
Cleanup criss-cross merge confusion |
2741 |
Option('default_format', default='2a', |
6056.2.4
by Vincent Ladeuil
Option help is now part of the object itself. |
2742 |
help='Format used when creating branches.')) |
2743 |
option_registry.register( |
|
6155.2.1
by Vincent Ladeuil
Migrate dpush_strict, push_strict and send_strict options to the stack based config design, introducing get_config_stack for branches. |
2744 |
Option('dpush_strict', default=None, |
2745 |
from_unicode=bool_from_store, |
|
2746 |
help='''\ |
|
2747 |
The default value for ``dpush --strict``.
|
|
2748 |
||
2749 |
If present, defines the ``--strict`` option default value for checking
|
|
2750 |
uncommitted changes before pushing into a different VCS without any
|
|
2751 |
custom bzr metadata.
|
|
2752 |
''')) |
|
2753 |
option_registry.register( |
|
6056.2.4
by Vincent Ladeuil
Option help is now part of the object itself. |
2754 |
Option('editor', |
2755 |
help='The command called to launch an editor to enter a message.')) |
|
6351.3.3
by Jelmer Vernooij
Convert more stuff to use config stacks. |
2756 |
option_registry.register( |
6393.3.3
by Vincent Ladeuil
Add Option.override_from_env allowing environ variables to override config settings |
2757 |
Option('email', override_from_env=['BZR_EMAIL'], default=default_email, |
6351.3.3
by Jelmer Vernooij
Convert more stuff to use config stacks. |
2758 |
help='The users identity')) |
6056.2.4
by Vincent Ladeuil
Option help is now part of the object itself. |
2759 |
option_registry.register( |
6351.3.1
by Jelmer Vernooij
Add gpg_signing_command option to registry. |
2760 |
Option('gpg_signing_command', |
2761 |
default='gpg', |
|
6351.3.2
by Jelmer Vernooij
Convert some gpg options to config stacks. |
2762 |
help="""\ |
2763 |
Program to use use for creating signatures.
|
|
2764 |
||
2765 |
This should support at least the -u and --clearsign options.
|
|
2766 |
""")) |
|
2767 |
option_registry.register( |
|
2768 |
Option('gpg_signing_key', |
|
2769 |
default=None, |
|
2770 |
help="""\ |
|
2771 |
GPG key to use for signing.
|
|
2772 |
||
2773 |
This defaults to the first key associated with the users email.
|
|
2774 |
""")) |
|
6351.3.1
by Jelmer Vernooij
Add gpg_signing_command option to registry. |
2775 |
option_registry.register( |
6082.5.9
by Vincent Ladeuil
Cleanup criss-cross merge confusion |
2776 |
Option('ignore_missing_extensions', default=False, |
6059.4.2
by Vincent Ladeuil
Migrate ignore_missing_extensions to stack-based config. |
2777 |
from_unicode=bool_from_store, |
2778 |
help='''\ |
|
2779 |
Control the missing extensions warning display.
|
|
2780 |
||
2781 |
The warning will not be emitted if set to True.
|
|
2782 |
''')) |
|
2783 |
option_registry.register( |
|
6056.2.4
by Vincent Ladeuil
Option help is now part of the object itself. |
2784 |
Option('language', |
2785 |
help='Language to translate messages into.')) |
|
2786 |
option_registry.register( |
|
6082.5.9
by Vincent Ladeuil
Cleanup criss-cross merge confusion |
2787 |
Option('locks.steal_dead', default=False, from_unicode=bool_from_store, |
6059.4.1
by Vincent Ladeuil
Migrate locks.steal_dead to stack-based config. |
2788 |
help='''\ |
2789 |
Steal locks that appears to be dead.
|
|
2790 |
||
6059.4.6
by Vincent Ladeuil
Fix the help strings as proposed by jam. |
2791 |
If set to True, bzr will check if a lock is supposed to be held by an
|
2792 |
active process from the same user on the same machine. If the user and
|
|
2793 |
machine match, but no process with the given PID is active, then bzr
|
|
2794 |
will automatically break the stale lock, and create a new lock for
|
|
2795 |
this process.
|
|
2796 |
Otherwise, bzr will prompt as normal to break the lock.
|
|
6059.4.1
by Vincent Ladeuil
Migrate locks.steal_dead to stack-based config. |
2797 |
''')) |
2798 |
option_registry.register( |
|
6175.2.1
by Vincent Ladeuil
Migrate log_format to the config stacks. |
2799 |
Option('log_format', default='long', |
2800 |
help= '''\ |
|
2801 |
Log format to use when displaying revisions.
|
|
2802 |
||
2803 |
Standard log formats are ``long``, ``short`` and ``line``. Additional formats
|
|
2804 |
may be provided by plugins.
|
|
2805 |
''')) |
|
6449.5.1
by Jelmer Vernooij
Migrate mail_client to config stacks. |
2806 |
option_registry.register_lazy('mail_client', 'bzrlib.mail_client', |
2807 |
'opt_mail_client') |
|
6175.2.1
by Vincent Ladeuil
Migrate log_format to the config stacks. |
2808 |
option_registry.register( |
6056.2.4
by Vincent Ladeuil
Option help is now part of the object itself. |
2809 |
Option('output_encoding', |
2810 |
help= 'Unicode encoding for output' |
|
2811 |
' (terminal encoding if not specified).')) |
|
2812 |
option_registry.register( |
|
6379.11.1
by Vincent Ladeuil
Migrate location options to config stacks. |
2813 |
Option('parent_location', |
2814 |
default=None, |
|
2815 |
help="""\ |
|
2816 |
The location of the default branch for pull or merge.
|
|
2817 |
||
2818 |
This option is normally set when creating a branch, the first ``pull`` or by
|
|
2819 |
``pull --remember``.
|
|
2820 |
""")) |
|
2821 |
option_registry.register( |
|
6351.3.5
by Jelmer Vernooij
Add post_commit. |
2822 |
Option('post_commit', default=None, |
2823 |
help='''\ |
|
2824 |
Post commit functions.
|
|
2825 |
||
6351.3.14
by Jelmer Vernooij
merge lp:~jelmer/bzr/commit-uses-config-stacks |
2826 |
An ordered list of python functions to call, separated by spaces.
|
6351.3.5
by Jelmer Vernooij
Add post_commit. |
2827 |
|
2828 |
Each function takes branch, rev_id as parameters.
|
|
2829 |
''')) |
|
6561.2.1
by Vincent Ladeuil
Add a ``progress_bar`` config option. |
2830 |
option_registry.register_lazy('progress_bar', 'bzrlib.ui.text', |
2831 |
'opt_progress_bar') |
|
6351.3.5
by Jelmer Vernooij
Add post_commit. |
2832 |
option_registry.register( |
6379.11.1
by Vincent Ladeuil
Migrate location options to config stacks. |
2833 |
Option('public_branch', |
2834 |
default=None, |
|
2835 |
help="""\ |
|
2836 |
A publically-accessible version of this branch.
|
|
2837 |
||
2838 |
This implies that the branch setting this option is not publically-accessible.
|
|
2839 |
Used and set by ``bzr send``.
|
|
2840 |
""")) |
|
2841 |
option_registry.register( |
|
2842 |
Option('push_location', |
|
2843 |
default=None, |
|
2844 |
help="""\ |
|
2845 |
The location of the default branch for push.
|
|
2846 |
||
2847 |
This option is normally set by the first ``push`` or ``push --remember``.
|
|
2848 |
""")) |
|
2849 |
option_registry.register( |
|
6155.2.1
by Vincent Ladeuil
Migrate dpush_strict, push_strict and send_strict options to the stack based config design, introducing get_config_stack for branches. |
2850 |
Option('push_strict', default=None, |
2851 |
from_unicode=bool_from_store, |
|
2852 |
help='''\ |
|
2853 |
The default value for ``push --strict``.
|
|
2854 |
||
2855 |
If present, defines the ``--strict`` option default value for checking
|
|
2856 |
uncommitted changes before sending a merge directive.
|
|
2857 |
''')) |
|
2858 |
option_registry.register( |
|
6091.3.6
by Vincent Ladeuil
Replace ugly default value declarations with ad-hoc and limited conversion to unicode strings. |
2859 |
Option('repository.fdatasync', default=True, |
6091.3.5
by Vincent Ladeuil
Use unicode strings to make it clear default values must comply to Store API. |
2860 |
from_unicode=bool_from_store, |
6056.2.4
by Vincent Ladeuil
Option help is now part of the object itself. |
2861 |
help='''\ |
2862 |
Flush repository changes onto physical disk?
|
|
2863 |
||
2864 |
If true (default), repository changes are flushed through the OS buffers
|
|
2865 |
to physical disk. This is somewhat slower, but means data should not be
|
|
2866 |
lost if the machine crashes. See also dirstate.fdatasync.
|
|
2867 |
''')) |
|
6379.8.1
by Jelmer Vernooij
Register smtp options in bzrlib.config, and use config stacks in bzrlib.smtp_conection. |
2868 |
option_registry.register_lazy('smtp_server', |
2869 |
'bzrlib.smtp_connection', 'smtp_server') |
|
2870 |
option_registry.register_lazy('smtp_password', |
|
2871 |
'bzrlib.smtp_connection', 'smtp_password') |
|
2872 |
option_registry.register_lazy('smtp_username', |
|
2873 |
'bzrlib.smtp_connection', 'smtp_username') |
|
6319.1.1
by Martin Pool
Add selftest.timeout option, defaulting to 600 |
2874 |
option_registry.register( |
2875 |
Option('selftest.timeout', |
|
2876 |
default='600', |
|
2877 |
from_unicode=int_from_store, |
|
2878 |
help='Abort selftest if one test takes longer than this many seconds', |
|
2879 |
))
|
|
2880 |
||
6155.2.1
by Vincent Ladeuil
Migrate dpush_strict, push_strict and send_strict options to the stack based config design, introducing get_config_stack for branches. |
2881 |
option_registry.register( |
2882 |
Option('send_strict', default=None, |
|
2883 |
from_unicode=bool_from_store, |
|
2884 |
help='''\ |
|
2885 |
The default value for ``send --strict``.
|
|
2886 |
||
2887 |
If present, defines the ``--strict`` option default value for checking
|
|
6379.11.1
by Vincent Ladeuil
Migrate location options to config stacks. |
2888 |
uncommitted changes before sending a bundle.
|
6155.2.1
by Vincent Ladeuil
Migrate dpush_strict, push_strict and send_strict options to the stack based config design, introducing get_config_stack for branches. |
2889 |
''')) |
6006.4.9
by Martin Pool
Add repository.fdatasync option |
2890 |
|
6133.4.15
by John Arbash Meinel
Start working on exposing timeout as a configuration item. |
2891 |
option_registry.register( |
2892 |
Option('serve.client_timeout', |
|
6133.4.35
by John Arbash Meinel
Change int_from_store into float_from_store, which allows us to set the time under 1.0s. |
2893 |
default=300.0, from_unicode=float_from_store, |
6133.4.15
by John Arbash Meinel
Start working on exposing timeout as a configuration item. |
2894 |
help="If we wait for a new request from a client for more than" |
2895 |
" X seconds, consider the client idle, and hangup.")) |
|
6379.11.1
by Vincent Ladeuil
Migrate location options to config stacks. |
2896 |
option_registry.register( |
2897 |
Option('stacked_on_location', |
|
2898 |
default=None, |
|
2899 |
help="""The location where this branch is stacked on.""")) |
|
2900 |
option_registry.register( |
|
2901 |
Option('submit_branch', |
|
2902 |
default=None, |
|
2903 |
help="""\ |
|
2904 |
The branch you intend to submit your current work to.
|
|
2905 |
||
2906 |
This is automatically set by ``bzr send`` and ``bzr merge``, and is also used
|
|
2907 |
by the ``submit:`` revision spec.
|
|
2908 |
""")) |
|
6421.3.1
by Vincent Ladeuil
Migrate more branch options to config stacks. |
2909 |
option_registry.register( |
2910 |
Option('submit_to', |
|
2911 |
help='''Where submissions from this branch are mailed to.''')) |
|
6449.1.1
by Jelmer Vernooij
Convert 'suppress_warnings' option to config stacks. |
2912 |
option_registry.register( |
2913 |
ListOption('suppress_warnings', |
|
2914 |
default=[], |
|
2915 |
help="List of warning classes to suppress.")) |
|
6455.1.1
by Jelmer Vernooij
Convert validate_signatures_in_log to config stacks. |
2916 |
option_registry.register( |
2917 |
Option('validate_signatures_in_log', default=False, |
|
2918 |
from_unicode=bool_from_store, invalid='warning', |
|
2919 |
help='''Whether to validate signatures in bzr log.''')) |
|
6238.2.8
by Jelmer Vernooij
Move options to bzrlib/transport/http/_urllib2_wrappers.py |
2920 |
option_registry.register_lazy('ssl.ca_certs', |
2921 |
'bzrlib.transport.http._urllib2_wrappers', 'opt_ssl_ca_certs') |
|
2922 |
||
2923 |
option_registry.register_lazy('ssl.cert_reqs', |
|
2924 |
'bzrlib.transport.http._urllib2_wrappers', 'opt_ssl_cert_reqs') |
|
6238.2.7
by Jelmer Vernooij
Add ssl.cert_reqs. |
2925 |
|
2926 |
||
5743.3.11
by Vincent Ladeuil
Config sections only implement read access. |
2927 |
class Section(object): |
5743.12.2
by Vincent Ladeuil
Basic registry for options. |
2928 |
"""A section defines a dict of option name => value.
|
5743.2.1
by Vincent Ladeuil
Basic tests and implementations for read-only and mutable sections. |
2929 |
|
2930 |
This is merely a read-only dict which can add some knowledge about the
|
|
5743.3.10
by Vincent Ladeuil
Fix typos mentioned in reviews. |
2931 |
options. It is *not* a python dict object though and doesn't try to mimic
|
2932 |
its API.
|
|
5743.2.1
by Vincent Ladeuil
Basic tests and implementations for read-only and mutable sections. |
2933 |
"""
|
2934 |
||
2935 |
def __init__(self, section_id, options): |
|
2936 |
self.id = section_id |
|
2937 |
# We re-use the dict-like object received
|
|
2938 |
self.options = options |
|
2939 |
||
6260.3.1
by Vincent Ladeuil
Switch ``bzr config`` to the new config implementation |
2940 |
def get(self, name, default=None, expand=True): |
5743.2.1
by Vincent Ladeuil
Basic tests and implementations for read-only and mutable sections. |
2941 |
return self.options.get(name, default) |
2942 |
||
6260.3.1
by Vincent Ladeuil
Switch ``bzr config`` to the new config implementation |
2943 |
def iter_option_names(self): |
2944 |
for k in self.options.iterkeys(): |
|
2945 |
yield k |
|
2946 |
||
5743.3.12
by Vincent Ladeuil
Add an ad-hoc __repr__. |
2947 |
def __repr__(self): |
2948 |
# Mostly for debugging use
|
|
5743.4.25
by Vincent Ladeuil
Address review comments by jelmer and poolie. |
2949 |
return "<config.%s id=%s>" % (self.__class__.__name__, self.id) |
5743.3.12
by Vincent Ladeuil
Add an ad-hoc __repr__. |
2950 |
|
5743.2.3
by Vincent Ladeuil
The option is either new or has an existing value. |
2951 |
|
5743.3.6
by Vincent Ladeuil
Use a name less likely to be reused. |
2952 |
_NewlyCreatedOption = object() |
5743.2.2
by Vincent Ladeuil
Add tests for remove. |
2953 |
"""Was the option created during the MutableSection lifetime"""
|
6404.5.5
by Vincent Ladeuil
Refine implementations and add more precise tests. More tests can be added for more scenarios if it doesn't seem worth it until we encounter them in real life (which is unlikely so far) |
2954 |
_DeletedOption = object() |
2955 |
"""Was the option deleted during the MutableSection lifetime"""
|
|
5743.2.1
by Vincent Ladeuil
Basic tests and implementations for read-only and mutable sections. |
2956 |
|
5743.2.3
by Vincent Ladeuil
The option is either new or has an existing value. |
2957 |
|
5743.3.11
by Vincent Ladeuil
Config sections only implement read access. |
2958 |
class MutableSection(Section): |
5743.3.1
by Vincent Ladeuil
Add a docstring and dates to FIXMEs. |
2959 |
"""A section allowing changes and keeping track of the original values."""
|
5743.2.1
by Vincent Ladeuil
Basic tests and implementations for read-only and mutable sections. |
2960 |
|
2961 |
def __init__(self, section_id, options): |
|
2962 |
super(MutableSection, self).__init__(section_id, options) |
|
6404.5.4
by Vincent Ladeuil
Saving changes is incremental and brings back updates from concurrent users |
2963 |
self.reset_changes() |
2964 |
||
5743.2.1
by Vincent Ladeuil
Basic tests and implementations for read-only and mutable sections. |
2965 |
def set(self, name, value): |
5743.2.2
by Vincent Ladeuil
Add tests for remove. |
2966 |
if name not in self.options: |
5743.2.3
by Vincent Ladeuil
The option is either new or has an existing value. |
2967 |
# This is a new option
|
5743.3.6
by Vincent Ladeuil
Use a name less likely to be reused. |
2968 |
self.orig[name] = _NewlyCreatedOption |
5743.2.3
by Vincent Ladeuil
The option is either new or has an existing value. |
2969 |
elif name not in self.orig: |
5743.2.1
by Vincent Ladeuil
Basic tests and implementations for read-only and mutable sections. |
2970 |
self.orig[name] = self.get(name, None) |
2971 |
self.options[name] = value |
|
2972 |
||
2973 |
def remove(self, name): |
|
6554.1.1
by Vincent Ladeuil
Don't record an option deletion if there is no deletion to record. |
2974 |
if name not in self.orig and name in self.options: |
5743.2.1
by Vincent Ladeuil
Basic tests and implementations for read-only and mutable sections. |
2975 |
self.orig[name] = self.get(name, None) |
2976 |
del self.options[name] |
|
2977 |
||
6404.5.5
by Vincent Ladeuil
Refine implementations and add more precise tests. More tests can be added for more scenarios if it doesn't seem worth it until we encounter them in real life (which is unlikely so far) |
2978 |
def reset_changes(self): |
2979 |
self.orig = {} |
|
2980 |
||
2981 |
def apply_changes(self, dirty, store): |
|
2982 |
"""Apply option value changes.
|
|
2983 |
||
2984 |
``self`` has been reloaded from the persistent storage. ``dirty``
|
|
2985 |
contains the changes made since the previous loading.
|
|
2986 |
||
2987 |
:param dirty: the mutable section containing the changes.
|
|
2988 |
||
2989 |
:param store: the store containing the section
|
|
2990 |
"""
|
|
2991 |
for k, expected in dirty.orig.iteritems(): |
|
2992 |
actual = dirty.get(k, _DeletedOption) |
|
2993 |
reloaded = self.get(k, _NewlyCreatedOption) |
|
2994 |
if actual is _DeletedOption: |
|
2995 |
if k in self.options: |
|
2996 |
self.remove(k) |
|
2997 |
else: |
|
2998 |
self.set(k, actual) |
|
6404.5.6
by Vincent Ladeuil
Add some doc. |
2999 |
# Report concurrent updates in an ad-hoc way. This should only
|
3000 |
# occurs when different processes try to update the same option
|
|
3001 |
# which is not supported (as in: the config framework is not meant
|
|
6499.2.1
by Vincent Ladeuil
Save branch config options only during the final unlock |
3002 |
# to be used as a sharing mechanism).
|
6404.5.5
by Vincent Ladeuil
Refine implementations and add more precise tests. More tests can be added for more scenarios if it doesn't seem worth it until we encounter them in real life (which is unlikely so far) |
3003 |
if expected != reloaded: |
3004 |
if actual is _DeletedOption: |
|
3005 |
actual = '<DELETED>' |
|
3006 |
if reloaded is _NewlyCreatedOption: |
|
3007 |
reloaded = '<CREATED>' |
|
3008 |
if expected is _NewlyCreatedOption: |
|
3009 |
expected = '<CREATED>' |
|
3010 |
# Someone changed the value since we get it from the persistent
|
|
3011 |
# storage.
|
|
6404.5.9
by Vincent Ladeuil
Don't forget to use gettext. |
3012 |
trace.warning(gettext( |
3013 |
"Option {0} in section {1} of {2} was changed" |
|
3014 |
" from {3} to {4}. The {5} value will be saved.".format( |
|
3015 |
k, self.id, store.external_url(), expected, |
|
3016 |
reloaded, actual))) |
|
6404.5.5
by Vincent Ladeuil
Refine implementations and add more precise tests. More tests can be added for more scenarios if it doesn't seem worth it until we encounter them in real life (which is unlikely so far) |
3017 |
# No need to keep track of these changes
|
3018 |
self.reset_changes() |
|
3019 |
||
5743.2.13
by Vincent Ladeuil
Trivial implementations for stores with smoke tests. |
3020 |
|
5743.2.7
by Vincent Ladeuil
Implement loading a config store from a string or a file. |
3021 |
class Store(object): |
3022 |
"""Abstract interface to persistent storage for configuration options."""
|
|
3023 |
||
5743.4.25
by Vincent Ladeuil
Address review comments by jelmer and poolie. |
3024 |
readonly_section_class = Section |
5743.4.22
by Vincent Ladeuil
Allow daughter classes to use different Section classes if/when needed. |
3025 |
mutable_section_class = MutableSection |
5743.4.21
by Vincent Ladeuil
All stores should provide _load_from_string to reuse the existing tests. |
3026 |
|
6404.5.2
by Vincent Ladeuil
All Stores should handle dirty sections even if the actual tests are only exercising IniFileStore inplementations so far |
3027 |
def __init__(self): |
6499.2.3
by Vincent Ladeuil
Clarify the dict usage to share dirty sections. |
3028 |
# Which sections need to be saved (by section id). We use a dict here
|
3029 |
# so the dirty sections can be shared by multiple callers.
|
|
6499.2.1
by Vincent Ladeuil
Save branch config options only during the final unlock |
3030 |
self.dirty_sections = {} |
6404.5.2
by Vincent Ladeuil
All Stores should handle dirty sections even if the actual tests are only exercising IniFileStore inplementations so far |
3031 |
|
5743.4.25
by Vincent Ladeuil
Address review comments by jelmer and poolie. |
3032 |
def is_loaded(self): |
3033 |
"""Returns True if the Store has been loaded.
|
|
3034 |
||
3035 |
This is used to implement lazy loading and ensure the persistent
|
|
3036 |
storage is queried only when needed.
|
|
3037 |
"""
|
|
3038 |
raise NotImplementedError(self.is_loaded) |
|
5743.2.7
by Vincent Ladeuil
Implement loading a config store from a string or a file. |
3039 |
|
3040 |
def load(self): |
|
5743.4.25
by Vincent Ladeuil
Address review comments by jelmer and poolie. |
3041 |
"""Loads the Store from persistent storage."""
|
5743.2.7
by Vincent Ladeuil
Implement loading a config store from a string or a file. |
3042 |
raise NotImplementedError(self.load) |
3043 |
||
5987.1.5
by Vincent Ladeuil
Those are just bytes. |
3044 |
def _load_from_string(self, bytes): |
5743.4.21
by Vincent Ladeuil
All stores should provide _load_from_string to reuse the existing tests. |
3045 |
"""Create a store from a string in configobj syntax.
|
3046 |
||
5987.1.5
by Vincent Ladeuil
Those are just bytes. |
3047 |
:param bytes: A string representing the file content.
|
5743.4.21
by Vincent Ladeuil
All stores should provide _load_from_string to reuse the existing tests. |
3048 |
"""
|
3049 |
raise NotImplementedError(self._load_from_string) |
|
3050 |
||
5743.10.2
by Vincent Ladeuil
Make sure RemoteBranch are supported as well, relying on the vfs API. |
3051 |
def unload(self): |
3052 |
"""Unloads the Store.
|
|
3053 |
||
3054 |
This should make is_loaded() return False. This is used when the caller
|
|
3055 |
knows that the persistent storage has changed or may have change since
|
|
3056 |
the last load.
|
|
3057 |
"""
|
|
3058 |
raise NotImplementedError(self.unload) |
|
3059 |
||
6385.1.1
by Vincent Ladeuil
Stores allow Stacks to control when values are quoted/unquoted |
3060 |
def quote(self, value): |
3061 |
"""Quote a configuration option value for storing purposes.
|
|
3062 |
||
3063 |
This allows Stacks to present values as they will be stored.
|
|
3064 |
"""
|
|
3065 |
return value |
|
3066 |
||
3067 |
def unquote(self, value): |
|
3068 |
"""Unquote a configuration option value into unicode.
|
|
3069 |
||
3070 |
The received value is quoted as stored.
|
|
3071 |
"""
|
|
3072 |
return value |
|
3073 |
||
5743.2.10
by Vincent Ladeuil
Implement store.get_sections() as an iterator and provides the configobj implementation. |
3074 |
def save(self): |
5743.4.25
by Vincent Ladeuil
Address review comments by jelmer and poolie. |
3075 |
"""Saves the Store to persistent storage."""
|
5743.4.10
by Vincent Ladeuil
Fix copy/paste, bad. |
3076 |
raise NotImplementedError(self.save) |
5743.2.10
by Vincent Ladeuil
Implement store.get_sections() as an iterator and provides the configobj implementation. |
3077 |
|
6404.5.5
by Vincent Ladeuil
Refine implementations and add more precise tests. More tests can be added for more scenarios if it doesn't seem worth it until we encounter them in real life (which is unlikely so far) |
3078 |
def _need_saving(self): |
6499.2.1
by Vincent Ladeuil
Save branch config options only during the final unlock |
3079 |
for s in self.dirty_sections.values(): |
6404.5.5
by Vincent Ladeuil
Refine implementations and add more precise tests. More tests can be added for more scenarios if it doesn't seem worth it until we encounter them in real life (which is unlikely so far) |
3080 |
if s.orig: |
3081 |
# At least one dirty section contains a modification
|
|
3082 |
return True |
|
3083 |
return False |
|
3084 |
||
3085 |
def apply_changes(self, dirty_sections): |
|
3086 |
"""Apply changes from dirty sections while checking for coherency.
|
|
3087 |
||
3088 |
The Store content is discarded and reloaded from persistent storage to
|
|
3089 |
acquire up-to-date values.
|
|
3090 |
||
3091 |
Dirty sections are MutableSection which kept track of the value they
|
|
3092 |
are expected to update.
|
|
3093 |
"""
|
|
6404.5.7
by Vincent Ladeuil
Store load is lazy and will happen when needed |
3094 |
# We need an up-to-date version from the persistent storage, unload the
|
3095 |
# store. The reload will occur when needed (triggered by the first
|
|
3096 |
# get_mutable_section() call below.
|
|
6404.5.5
by Vincent Ladeuil
Refine implementations and add more precise tests. More tests can be added for more scenarios if it doesn't seem worth it until we encounter them in real life (which is unlikely so far) |
3097 |
self.unload() |
3098 |
# Apply the changes from the preserved dirty sections
|
|
6499.2.1
by Vincent Ladeuil
Save branch config options only during the final unlock |
3099 |
for section_id, dirty in dirty_sections.iteritems(): |
3100 |
clean = self.get_mutable_section(section_id) |
|
6404.5.5
by Vincent Ladeuil
Refine implementations and add more precise tests. More tests can be added for more scenarios if it doesn't seem worth it until we encounter them in real life (which is unlikely so far) |
3101 |
clean.apply_changes(dirty, self) |
3102 |
# Everything is clean now
|
|
6499.2.1
by Vincent Ladeuil
Save branch config options only during the final unlock |
3103 |
self.dirty_sections = {} |
6404.5.5
by Vincent Ladeuil
Refine implementations and add more precise tests. More tests can be added for more scenarios if it doesn't seem worth it until we encounter them in real life (which is unlikely so far) |
3104 |
|
6404.5.4
by Vincent Ladeuil
Saving changes is incremental and brings back updates from concurrent users |
3105 |
def save_changes(self): |
3106 |
"""Saves the Store to persistent storage if changes occurred.
|
|
3107 |
||
3108 |
Apply the changes recorded in the mutable sections to a store content
|
|
3109 |
refreshed from persistent storage.
|
|
3110 |
"""
|
|
3111 |
raise NotImplementedError(self.save_changes) |
|
3112 |
||
5743.5.10
by Vincent Ladeuil
Parametrize the generic tests against the concrete stores. |
3113 |
def external_url(self): |
3114 |
raise NotImplementedError(self.external_url) |
|
3115 |
||
5743.2.10
by Vincent Ladeuil
Implement store.get_sections() as an iterator and provides the configobj implementation. |
3116 |
def get_sections(self): |
3117 |
"""Returns an ordered iterable of existing sections.
|
|
3118 |
||
6260.3.1
by Vincent Ladeuil
Switch ``bzr config`` to the new config implementation |
3119 |
:returns: An iterable of (store, section).
|
5743.2.10
by Vincent Ladeuil
Implement store.get_sections() as an iterator and provides the configobj implementation. |
3120 |
"""
|
3121 |
raise NotImplementedError(self.get_sections) |
|
3122 |
||
6260.3.1
by Vincent Ladeuil
Switch ``bzr config`` to the new config implementation |
3123 |
def get_mutable_section(self, section_id=None): |
5743.4.2
by Vincent Ladeuil
Stores don't implement set_option, they just provide a mutable section. |
3124 |
"""Returns the specified mutable section.
|
3125 |
||
6260.3.1
by Vincent Ladeuil
Switch ``bzr config`` to the new config implementation |
3126 |
:param section_id: The section identifier
|
5743.4.2
by Vincent Ladeuil
Stores don't implement set_option, they just provide a mutable section. |
3127 |
"""
|
3128 |
raise NotImplementedError(self.get_mutable_section) |
|
5743.2.12
by Vincent Ladeuil
Rename store.set to store.set_option as it's clearer in this context and will act as a safe-guard against unintended uses (set() will be used for stacks). |
3129 |
|
5743.4.25
by Vincent Ladeuil
Address review comments by jelmer and poolie. |
3130 |
def __repr__(self): |
3131 |
# Mostly for debugging use
|
|
5743.5.17
by Vincent Ladeuil
Use external_url to identify stores. |
3132 |
return "<config.%s(%s)>" % (self.__class__.__name__, |
5743.5.18
by Vincent Ladeuil
Fix typo. |
3133 |
self.external_url()) |
5743.4.25
by Vincent Ladeuil
Address review comments by jelmer and poolie. |
3134 |
|
3135 |
||
6260.3.1
by Vincent Ladeuil
Switch ``bzr config`` to the new config implementation |
3136 |
class CommandLineStore(Store): |
3137 |
"A store to carry command line overrides for the config options."""
|
|
3138 |
||
3139 |
def __init__(self, opts=None): |
|
3140 |
super(CommandLineStore, self).__init__() |
|
3141 |
if opts is None: |
|
3142 |
opts = {} |
|
3143 |
self.options = {} |
|
6404.4.1
by Vincent Ladeuil
Properly support config.CommandLineStore in ``bzr config`` |
3144 |
self.id = 'cmdline' |
6260.3.1
by Vincent Ladeuil
Switch ``bzr config`` to the new config implementation |
3145 |
|
3146 |
def _reset(self): |
|
3147 |
# The dict should be cleared but not replaced so it can be shared.
|
|
3148 |
self.options.clear() |
|
3149 |
||
3150 |
def _from_cmdline(self, overrides): |
|
3151 |
# Reset before accepting new definitions
|
|
3152 |
self._reset() |
|
3153 |
for over in overrides: |
|
3154 |
try: |
|
3155 |
name, value = over.split('=', 1) |
|
3156 |
except ValueError: |
|
3157 |
raise errors.BzrCommandError( |
|
3158 |
gettext("Invalid '%s', should be of the form 'name=value'") |
|
3159 |
% (over,)) |
|
3160 |
self.options[name] = value |
|
3161 |
||
3162 |
def external_url(self): |
|
6325.1.1
by Vincent Ladeuil
Fix various typos |
3163 |
# Not an url but it makes debugging easier and is never needed
|
6260.3.1
by Vincent Ladeuil
Switch ``bzr config`` to the new config implementation |
3164 |
# otherwise
|
3165 |
return 'cmdline' |
|
3166 |
||
3167 |
def get_sections(self): |
|
6404.4.1
by Vincent Ladeuil
Properly support config.CommandLineStore in ``bzr config`` |
3168 |
yield self, self.readonly_section_class(None, self.options) |
6260.3.1
by Vincent Ladeuil
Switch ``bzr config`` to the new config implementation |
3169 |
|
3170 |
||
5743.4.25
by Vincent Ladeuil
Address review comments by jelmer and poolie. |
3171 |
class IniFileStore(Store): |
3172 |
"""A config Store using ConfigObj for storage.
|
|
3173 |
||
3174 |
:ivar _config_obj: Private member to hold the ConfigObj instance used to
|
|
3175 |
serialize/deserialize the config file.
|
|
3176 |
"""
|
|
5743.2.7
by Vincent Ladeuil
Implement loading a config store from a string or a file. |
3177 |
|
6270.1.5
by Jelmer Vernooij
Add TransportIniFileStore. |
3178 |
def __init__(self): |
5743.2.7
by Vincent Ladeuil
Implement loading a config store from a string or a file. |
3179 |
"""A config Store using ConfigObj for storage.
|
3180 |
"""
|
|
5743.4.25
by Vincent Ladeuil
Address review comments by jelmer and poolie. |
3181 |
super(IniFileStore, self).__init__() |
5743.4.18
by Vincent Ladeuil
Replace class.from_string with self._load_from_string to all stores can use it. |
3182 |
self._config_obj = None |
3183 |
||
5743.4.25
by Vincent Ladeuil
Address review comments by jelmer and poolie. |
3184 |
def is_loaded(self): |
5743.4.18
by Vincent Ladeuil
Replace class.from_string with self._load_from_string to all stores can use it. |
3185 |
return self._config_obj != None |
5743.2.7
by Vincent Ladeuil
Implement loading a config store from a string or a file. |
3186 |
|
5743.10.2
by Vincent Ladeuil
Make sure RemoteBranch are supported as well, relying on the vfs API. |
3187 |
def unload(self): |
3188 |
self._config_obj = None |
|
6499.2.1
by Vincent Ladeuil
Save branch config options only during the final unlock |
3189 |
self.dirty_sections = {} |
5743.10.2
by Vincent Ladeuil
Make sure RemoteBranch are supported as well, relying on the vfs API. |
3190 |
|
6270.1.5
by Jelmer Vernooij
Add TransportIniFileStore. |
3191 |
def _load_content(self): |
3192 |
"""Load the config file bytes.
|
|
3193 |
||
3194 |
This should be provided by subclasses
|
|
3195 |
||
3196 |
:return: Byte string
|
|
3197 |
"""
|
|
3198 |
raise NotImplementedError(self._load_content) |
|
3199 |
||
3200 |
def _save_content(self, content): |
|
3201 |
"""Save the config file bytes.
|
|
3202 |
||
3203 |
This should be provided by subclasses
|
|
3204 |
||
3205 |
:param content: Config file bytes to write
|
|
3206 |
"""
|
|
3207 |
raise NotImplementedError(self._save_content) |
|
3208 |
||
5743.4.19
by Vincent Ladeuil
Clarify that only Store.get_mutable_section() can accept an empty file. |
3209 |
def load(self): |
3210 |
"""Load the store from the associated file."""
|
|
5743.4.25
by Vincent Ladeuil
Address review comments by jelmer and poolie. |
3211 |
if self.is_loaded(): |
5743.2.7
by Vincent Ladeuil
Implement loading a config store from a string or a file. |
3212 |
return
|
6270.1.5
by Jelmer Vernooij
Add TransportIniFileStore. |
3213 |
content = self._load_content() |
6110.5.5
by Vincent Ladeuil
Warn when loading, fail if saving will occur later |
3214 |
self._load_from_string(content) |
3215 |
for hook in ConfigHooks['load']: |
|
3216 |
hook(self) |
|
5743.4.18
by Vincent Ladeuil
Replace class.from_string with self._load_from_string to all stores can use it. |
3217 |
|
5987.1.5
by Vincent Ladeuil
Those are just bytes. |
3218 |
def _load_from_string(self, bytes): |
5743.4.18
by Vincent Ladeuil
Replace class.from_string with self._load_from_string to all stores can use it. |
3219 |
"""Create a config store from a string.
|
3220 |
||
5987.1.5
by Vincent Ladeuil
Those are just bytes. |
3221 |
:param bytes: A string representing the file content.
|
5743.4.18
by Vincent Ladeuil
Replace class.from_string with self._load_from_string to all stores can use it. |
3222 |
"""
|
5743.4.25
by Vincent Ladeuil
Address review comments by jelmer and poolie. |
3223 |
if self.is_loaded(): |
5743.4.18
by Vincent Ladeuil
Replace class.from_string with self._load_from_string to all stores can use it. |
3224 |
raise AssertionError('Already loaded: %r' % (self._config_obj,)) |
5987.1.5
by Vincent Ladeuil
Those are just bytes. |
3225 |
co_input = StringIO(bytes) |
5743.4.3
by Vincent Ladeuil
Implement get_mutable_section. |
3226 |
try: |
5743.2.7
by Vincent Ladeuil
Implement loading a config store from a string or a file. |
3227 |
# The config files are always stored utf8-encoded
|
6082.5.11
by Vincent Ladeuil
Disable list_values for config.Store, using a dedicated configobj object to trigger the string -> list conversion on-demand (via the option registration) only. |
3228 |
self._config_obj = ConfigObj(co_input, encoding='utf-8', |
3229 |
list_values=False) |
|
5743.2.7
by Vincent Ladeuil
Implement loading a config store from a string or a file. |
3230 |
except configobj.ConfigObjError, e: |
5743.4.18
by Vincent Ladeuil
Replace class.from_string with self._load_from_string to all stores can use it. |
3231 |
self._config_obj = None |
5743.5.10
by Vincent Ladeuil
Parametrize the generic tests against the concrete stores. |
3232 |
raise errors.ParseConfigError(e.errors, self.external_url()) |
5987.1.4
by Vincent Ladeuil
Proper error messages for config files with content in non-utf encoding or that cannot be parsed |
3233 |
except UnicodeDecodeError: |
3234 |
raise errors.ConfigContentError(self.external_url()) |
|
5743.2.7
by Vincent Ladeuil
Implement loading a config store from a string or a file. |
3235 |
|
6404.5.4
by Vincent Ladeuil
Saving changes is incremental and brings back updates from concurrent users |
3236 |
def save_changes(self): |
3237 |
if not self.is_loaded(): |
|
3238 |
# Nothing to save
|
|
3239 |
return
|
|
3240 |
if not self._need_saving(): |
|
3241 |
return
|
|
3242 |
# Preserve the current version
|
|
6499.2.1
by Vincent Ladeuil
Save branch config options only during the final unlock |
3243 |
dirty_sections = dict(self.dirty_sections.items()) |
6404.5.5
by Vincent Ladeuil
Refine implementations and add more precise tests. More tests can be added for more scenarios if it doesn't seem worth it until we encounter them in real life (which is unlikely so far) |
3244 |
self.apply_changes(dirty_sections) |
6404.5.4
by Vincent Ladeuil
Saving changes is incremental and brings back updates from concurrent users |
3245 |
# Save to the persistent storage
|
3246 |
self.save() |
|
3247 |
||
5743.2.9
by Vincent Ladeuil
Implement and test store.save() and remove the 'save' parameter from store.from_string() as this won't scale well when adding class specific parameters. |
3248 |
def save(self): |
5743.4.25
by Vincent Ladeuil
Address review comments by jelmer and poolie. |
3249 |
if not self.is_loaded(): |
5743.4.19
by Vincent Ladeuil
Clarify that only Store.get_mutable_section() can accept an empty file. |
3250 |
# Nothing to save
|
3251 |
return
|
|
5743.2.9
by Vincent Ladeuil
Implement and test store.save() and remove the 'save' parameter from store.from_string() as this won't scale well when adding class specific parameters. |
3252 |
out = StringIO() |
3253 |
self._config_obj.write(out) |
|
6270.1.5
by Jelmer Vernooij
Add TransportIniFileStore. |
3254 |
self._save_content(out.getvalue()) |
5743.8.10
by Vincent Ladeuil
We don't need (nor want) to tie the config hooks to a particular class. Especially when we want to use the same hooks on both implementations. |
3255 |
for hook in ConfigHooks['save']: |
5743.8.7
by Vincent Ladeuil
Add hooks for config stores (but the load one is not in the right place). |
3256 |
hook(self) |
5743.5.10
by Vincent Ladeuil
Parametrize the generic tests against the concrete stores. |
3257 |
|
5743.2.10
by Vincent Ladeuil
Implement store.get_sections() as an iterator and provides the configobj implementation. |
3258 |
def get_sections(self): |
3259 |
"""Get the configobj section in the file order.
|
|
3260 |
||
6260.3.1
by Vincent Ladeuil
Switch ``bzr config`` to the new config implementation |
3261 |
:returns: An iterable of (store, section).
|
5743.2.10
by Vincent Ladeuil
Implement store.get_sections() as an iterator and provides the configobj implementation. |
3262 |
"""
|
3263 |
# We need a loaded store
|
|
5743.6.14
by Vincent Ladeuil
Parametrize the Stack tests. |
3264 |
try: |
3265 |
self.load() |
|
6110.5.5
by Vincent Ladeuil
Warn when loading, fail if saving will occur later |
3266 |
except (errors.NoSuchFile, errors.PermissionDenied): |
3267 |
# If the file can't be read, there is no sections
|
|
5743.6.14
by Vincent Ladeuil
Parametrize the Stack tests. |
3268 |
return
|
5743.2.10
by Vincent Ladeuil
Implement store.get_sections() as an iterator and provides the configobj implementation. |
3269 |
cobj = self._config_obj |
3270 |
if cobj.scalars: |
|
6260.3.1
by Vincent Ladeuil
Switch ``bzr config`` to the new config implementation |
3271 |
yield self, self.readonly_section_class(None, cobj) |
5743.2.10
by Vincent Ladeuil
Implement store.get_sections() as an iterator and provides the configobj implementation. |
3272 |
for section_name in cobj.sections: |
6260.3.1
by Vincent Ladeuil
Switch ``bzr config`` to the new config implementation |
3273 |
yield (self, |
3274 |
self.readonly_section_class(section_name, |
|
3275 |
cobj[section_name])) |
|
5743.2.10
by Vincent Ladeuil
Implement store.get_sections() as an iterator and provides the configobj implementation. |
3276 |
|
6260.3.1
by Vincent Ladeuil
Switch ``bzr config`` to the new config implementation |
3277 |
def get_mutable_section(self, section_id=None): |
5743.2.11
by Vincent Ladeuil
Basic store.set implementation. |
3278 |
# We need a loaded store
|
5743.4.19
by Vincent Ladeuil
Clarify that only Store.get_mutable_section() can accept an empty file. |
3279 |
try: |
3280 |
self.load() |
|
3281 |
except errors.NoSuchFile: |
|
3282 |
# The file doesn't exist, let's pretend it was empty
|
|
3283 |
self._load_from_string('') |
|
6499.2.1
by Vincent Ladeuil
Save branch config options only during the final unlock |
3284 |
if section_id in self.dirty_sections: |
3285 |
# We already created a mutable section for this id
|
|
3286 |
return self.dirty_sections[section_id] |
|
6260.3.1
by Vincent Ladeuil
Switch ``bzr config`` to the new config implementation |
3287 |
if section_id is None: |
5743.2.11
by Vincent Ladeuil
Basic store.set implementation. |
3288 |
section = self._config_obj |
3289 |
else: |
|
6260.3.1
by Vincent Ladeuil
Switch ``bzr config`` to the new config implementation |
3290 |
section = self._config_obj.setdefault(section_id, {}) |
6404.5.1
by Vincent Ladeuil
Setting or removing an option records the section as dirty |
3291 |
mutable_section = self.mutable_section_class(section_id, section) |
3292 |
# All mutable sections can become dirty
|
|
6499.2.1
by Vincent Ladeuil
Save branch config options only during the final unlock |
3293 |
self.dirty_sections[section_id] = mutable_section |
6404.5.1
by Vincent Ladeuil
Setting or removing an option records the section as dirty |
3294 |
return mutable_section |
5743.2.11
by Vincent Ladeuil
Basic store.set implementation. |
3295 |
|
6385.1.1
by Vincent Ladeuil
Stores allow Stacks to control when values are quoted/unquoted |
3296 |
def quote(self, value): |
3297 |
try: |
|
3298 |
# configobj conflates automagical list values and quoting
|
|
3299 |
self._config_obj.list_values = True |
|
3300 |
return self._config_obj._quote(value) |
|
3301 |
finally: |
|
3302 |
self._config_obj.list_values = False |
|
3303 |
||
3304 |
def unquote(self, value): |
|
6404.3.1
by Vincent Ladeuil
Robustly unquote configuration values (workaround configobj presenting a section as a dict in weird edge cases) |
3305 |
if value and isinstance(value, basestring): |
3306 |
# _unquote doesn't handle None nor empty strings nor anything that
|
|
3307 |
# is not a string, really.
|
|
6385.1.1
by Vincent Ladeuil
Stores allow Stacks to control when values are quoted/unquoted |
3308 |
value = self._config_obj._unquote(value) |
3309 |
return value |
|
3310 |
||
6402.2.3
by Vincent Ladeuil
More tests, a real implementation and some tweaks. |
3311 |
def external_url(self): |
3312 |
# Since an IniFileStore can be used without a file (at least in tests),
|
|
3313 |
# it's better to provide something than raising a NotImplementedError.
|
|
3314 |
# All daughter classes are supposed to provide an implementation
|
|
3315 |
# anyway.
|
|
3316 |
return 'In-Process Store, no URL' |
|
5743.2.1
by Vincent Ladeuil
Basic tests and implementations for read-only and mutable sections. |
3317 |
|
6499.3.3
by Vincent Ladeuil
Stop using _CompatibleStack now that local config files can be |
3318 |
|
6270.1.5
by Jelmer Vernooij
Add TransportIniFileStore. |
3319 |
class TransportIniFileStore(IniFileStore): |
3320 |
"""IniFileStore that loads files from a transport.
|
|
6402.2.3
by Vincent Ladeuil
More tests, a real implementation and some tweaks. |
3321 |
|
3322 |
:ivar transport: The transport object where the config file is located.
|
|
3323 |
||
3324 |
:ivar file_name: The config file basename in the transport directory.
|
|
6270.1.5
by Jelmer Vernooij
Add TransportIniFileStore. |
3325 |
"""
|
3326 |
||
3327 |
def __init__(self, transport, file_name): |
|
3328 |
"""A Store using a ini file on a Transport
|
|
3329 |
||
3330 |
:param transport: The transport object where the config file is located.
|
|
3331 |
:param file_name: The config file basename in the transport directory.
|
|
3332 |
"""
|
|
3333 |
super(TransportIniFileStore, self).__init__() |
|
3334 |
self.transport = transport |
|
3335 |
self.file_name = file_name |
|
3336 |
||
3337 |
def _load_content(self): |
|
3338 |
try: |
|
3339 |
return self.transport.get_bytes(self.file_name) |
|
3340 |
except errors.PermissionDenied: |
|
3341 |
trace.warning("Permission denied while trying to load " |
|
3342 |
"configuration store %s.", self.external_url()) |
|
3343 |
raise
|
|
3344 |
||
3345 |
def _save_content(self, content): |
|
3346 |
self.transport.put_bytes(self.file_name, content) |
|
3347 |
||
6270.1.6
by Jelmer Vernooij
Provide RemoteControlStore and RemoteBranchStore. |
3348 |
def external_url(self): |
3349 |
# FIXME: external_url should really accepts an optional relpath
|
|
3350 |
# parameter (bug #750169) :-/ -- vila 2011-04-04
|
|
3351 |
# The following will do in the interim but maybe we don't want to
|
|
3352 |
# expose a path here but rather a config ID and its associated
|
|
3353 |
# object </hand wawe>.
|
|
3354 |
return urlutils.join(self.transport.external_url(), self.file_name) |
|
3355 |
||
6270.1.5
by Jelmer Vernooij
Add TransportIniFileStore. |
3356 |
|
5743.4.16
by Vincent Ladeuil
Some doc for the stores. |
3357 |
# Note that LockableConfigObjStore inherits from ConfigObjStore because we need
|
3358 |
# unlockable stores for use with objects that can already ensure the locking
|
|
3359 |
# (think branches). If different stores (not based on ConfigObj) are created,
|
|
3360 |
# they may face the same issue.
|
|
3361 |
||
3362 |
||
6270.1.5
by Jelmer Vernooij
Add TransportIniFileStore. |
3363 |
class LockableIniFileStore(TransportIniFileStore): |
5743.4.9
by Vincent Ladeuil
Implement a LockableConfigObjStore to be able to mimick the actual behaviour. |
3364 |
"""A ConfigObjStore using locks on save to ensure store integrity."""
|
3365 |
||
3366 |
def __init__(self, transport, file_name, lock_dir_name=None): |
|
3367 |
"""A config Store using ConfigObj for storage.
|
|
3368 |
||
3369 |
:param transport: The transport object where the config file is located.
|
|
3370 |
||
3371 |
:param file_name: The config file basename in the transport directory.
|
|
3372 |
"""
|
|
3373 |
if lock_dir_name is None: |
|
3374 |
lock_dir_name = 'lock' |
|
3375 |
self.lock_dir_name = lock_dir_name |
|
5743.4.25
by Vincent Ladeuil
Address review comments by jelmer and poolie. |
3376 |
super(LockableIniFileStore, self).__init__(transport, file_name) |
5743.4.9
by Vincent Ladeuil
Implement a LockableConfigObjStore to be able to mimick the actual behaviour. |
3377 |
self._lock = lockdir.LockDir(self.transport, self.lock_dir_name) |
3378 |
||
3379 |
def lock_write(self, token=None): |
|
3380 |
"""Takes a write lock in the directory containing the config file.
|
|
3381 |
||
3382 |
If the directory doesn't exist it is created.
|
|
3383 |
"""
|
|
3384 |
# FIXME: This doesn't check the ownership of the created directories as
|
|
3385 |
# ensure_config_dir_exists does. It should if the transport is local
|
|
3386 |
# -- vila 2011-04-06
|
|
3387 |
self.transport.create_prefix() |
|
3388 |
return self._lock.lock_write(token) |
|
3389 |
||
3390 |
def unlock(self): |
|
3391 |
self._lock.unlock() |
|
3392 |
||
3393 |
def break_lock(self): |
|
3394 |
self._lock.break_lock() |
|
3395 |
||
3396 |
@needs_write_lock
|
|
3397 |
def save(self): |
|
5743.6.25
by Vincent Ladeuil
Last test rewritten. |
3398 |
# We need to be able to override the undecorated implementation
|
5743.6.32
by Vincent Ladeuil
Address poolie's review comments. |
3399 |
self.save_without_locking() |
5743.6.24
by Vincent Ladeuil
One more test with a ugly hack to allow the test to stop in the right place. |
3400 |
|
5743.6.32
by Vincent Ladeuil
Address poolie's review comments. |
3401 |
def save_without_locking(self): |
5743.4.25
by Vincent Ladeuil
Address review comments by jelmer and poolie. |
3402 |
super(LockableIniFileStore, self).save() |
5743.4.9
by Vincent Ladeuil
Implement a LockableConfigObjStore to be able to mimick the actual behaviour. |
3403 |
|
3404 |
||
5743.2.13
by Vincent Ladeuil
Trivial implementations for stores with smoke tests. |
3405 |
# FIXME: global, bazaar, shouldn't that be 'user' instead or even
|
3406 |
# 'user_defaults' as opposed to 'user_overrides', 'system_defaults'
|
|
3407 |
# (/etc/bzr/bazaar.conf) and 'system_overrides' ? -- vila 2011-04-05
|
|
5743.5.15
by Vincent Ladeuil
Mention poolie's point about focusing tests. |
3408 |
|
3409 |
# FIXME: Moreover, we shouldn't need classes for these stores either, factory
|
|
3410 |
# functions or a registry will make it easier and clearer for tests, focusing
|
|
3411 |
# on the relevant parts of the API that needs testing -- vila 20110503 (based
|
|
3412 |
# on a poolie's remark)
|
|
5743.5.13
by Vincent Ladeuil
Merge config-abstract-store into config-concrete-stores resolving conflicts |
3413 |
class GlobalStore(LockableIniFileStore): |
6499.3.13
by Vincent Ladeuil
Fix typo. |
3414 |
"""A config store for global options.
|
6499.3.12
by Vincent Ladeuil
Add a reminder in the docstring that local config stores are unique by process. |
3415 |
|
3416 |
There is a single GlobalStore for a given process.
|
|
3417 |
"""
|
|
5743.2.13
by Vincent Ladeuil
Trivial implementations for stores with smoke tests. |
3418 |
|
3419 |
def __init__(self, possible_transports=None): |
|
6055.1.2
by Vincent Ladeuil
Use _fs_enc instead of utf8. |
3420 |
t = transport.get_transport_from_path( |
3421 |
config_dir(), possible_transports=possible_transports) |
|
5743.2.13
by Vincent Ladeuil
Trivial implementations for stores with smoke tests. |
3422 |
super(GlobalStore, self).__init__(t, 'bazaar.conf') |
6260.3.1
by Vincent Ladeuil
Switch ``bzr config`` to the new config implementation |
3423 |
self.id = 'bazaar' |
5743.2.13
by Vincent Ladeuil
Trivial implementations for stores with smoke tests. |
3424 |
|
3425 |
||
5743.5.13
by Vincent Ladeuil
Merge config-abstract-store into config-concrete-stores resolving conflicts |
3426 |
class LocationStore(LockableIniFileStore): |
6586.1.1
by Vincent Ladeuil
Fix various typos in docstrings. Rename 'buffer' to 'buf' since it's now a python builtin function. |
3427 |
"""A config store for options specific to a location.
|
6499.3.12
by Vincent Ladeuil
Add a reminder in the docstring that local config stores are unique by process. |
3428 |
|
6586.1.1
by Vincent Ladeuil
Fix various typos in docstrings. Rename 'buffer' to 'buf' since it's now a python builtin function. |
3429 |
There is a single LocationStore for a given process.
|
6499.3.12
by Vincent Ladeuil
Add a reminder in the docstring that local config stores are unique by process. |
3430 |
"""
|
5743.2.13
by Vincent Ladeuil
Trivial implementations for stores with smoke tests. |
3431 |
|
3432 |
def __init__(self, possible_transports=None): |
|
6055.1.2
by Vincent Ladeuil
Use _fs_enc instead of utf8. |
3433 |
t = transport.get_transport_from_path( |
3434 |
config_dir(), possible_transports=possible_transports) |
|
5743.5.10
by Vincent Ladeuil
Parametrize the generic tests against the concrete stores. |
3435 |
super(LocationStore, self).__init__(t, 'locations.conf') |
6260.3.1
by Vincent Ladeuil
Switch ``bzr config`` to the new config implementation |
3436 |
self.id = 'locations' |
5743.2.13
by Vincent Ladeuil
Trivial implementations for stores with smoke tests. |
3437 |
|
3438 |
||
6270.1.5
by Jelmer Vernooij
Add TransportIniFileStore. |
3439 |
class BranchStore(TransportIniFileStore): |
6499.3.13
by Vincent Ladeuil
Fix typo. |
3440 |
"""A config store for branch options.
|
6499.3.12
by Vincent Ladeuil
Add a reminder in the docstring that local config stores are unique by process. |
3441 |
|
3442 |
There is a single BranchStore for a given branch.
|
|
3443 |
"""
|
|
5743.2.13
by Vincent Ladeuil
Trivial implementations for stores with smoke tests. |
3444 |
|
3445 |
def __init__(self, branch): |
|
3446 |
super(BranchStore, self).__init__(branch.control_transport, |
|
3447 |
'branch.conf') |
|
5743.6.34
by Vincent Ladeuil
Forget weakref for branch <-> config. |
3448 |
self.branch = branch |
6260.3.1
by Vincent Ladeuil
Switch ``bzr config`` to the new config implementation |
3449 |
self.id = 'branch' |
5743.10.5
by Vincent Ladeuil
Give up. |
3450 |
|
5743.2.13
by Vincent Ladeuil
Trivial implementations for stores with smoke tests. |
3451 |
|
6076.1.1
by Vincent Ladeuil
Add the missing config stacks and store |
3452 |
class ControlStore(LockableIniFileStore): |
3453 |
||
3454 |
def __init__(self, bzrdir): |
|
3455 |
super(ControlStore, self).__init__(bzrdir.transport, |
|
3456 |
'control.conf', |
|
3457 |
lock_dir_name='branch_lock') |
|
6404.4.1
by Vincent Ladeuil
Properly support config.CommandLineStore in ``bzr config`` |
3458 |
self.id = 'control' |
6076.1.1
by Vincent Ladeuil
Add the missing config stacks and store |
3459 |
|
3460 |
||
5743.2.22
by Vincent Ladeuil
Some minimal SectionMatcher implementation to setup the test infrastucture. |
3461 |
class SectionMatcher(object): |
3462 |
"""Select sections into a given Store.
|
|
3463 |
||
6123.7.1
by Vincent Ladeuil
Provide config.IdMatcher for config files defining secion names as unique ids |
3464 |
This is intended to be used to postpone getting an iterable of sections
|
3465 |
from a store.
|
|
5743.2.22
by Vincent Ladeuil
Some minimal SectionMatcher implementation to setup the test infrastucture. |
3466 |
"""
|
3467 |
||
3468 |
def __init__(self, store): |
|
3469 |
self.store = store |
|
3470 |
||
3471 |
def get_sections(self): |
|
5743.2.29
by Vincent Ladeuil
Add doc for the section matchers. |
3472 |
# This is where we require loading the store so we can see all defined
|
5743.2.22
by Vincent Ladeuil
Some minimal SectionMatcher implementation to setup the test infrastucture. |
3473 |
# sections.
|
3474 |
sections = self.store.get_sections() |
|
6260.3.2
by Vincent Ladeuil
Only the DEFAULT section is searched for the normal uses of bazaar.conf |
3475 |
# Walk the revisions in the order provided
|
6260.3.1
by Vincent Ladeuil
Switch ``bzr config`` to the new config implementation |
3476 |
for store, s in sections: |
5743.2.22
by Vincent Ladeuil
Some minimal SectionMatcher implementation to setup the test infrastucture. |
3477 |
if self.match(s): |
6260.3.1
by Vincent Ladeuil
Switch ``bzr config`` to the new config implementation |
3478 |
yield store, s |
5743.2.22
by Vincent Ladeuil
Some minimal SectionMatcher implementation to setup the test infrastucture. |
3479 |
|
6123.7.1
by Vincent Ladeuil
Provide config.IdMatcher for config files defining secion names as unique ids |
3480 |
def match(self, section): |
3481 |
"""Does the proposed section match.
|
|
3482 |
||
3483 |
:param section: A Section object.
|
|
3484 |
||
3485 |
:returns: True if the section matches, False otherwise.
|
|
3486 |
"""
|
|
5743.2.22
by Vincent Ladeuil
Some minimal SectionMatcher implementation to setup the test infrastucture. |
3487 |
raise NotImplementedError(self.match) |
3488 |
||
3489 |
||
6123.7.2
by Vincent Ladeuil
Rename IdMatcher to NameMatcher. |
3490 |
class NameMatcher(SectionMatcher): |
6123.7.1
by Vincent Ladeuil
Provide config.IdMatcher for config files defining secion names as unique ids |
3491 |
|
3492 |
def __init__(self, store, section_id): |
|
6123.7.2
by Vincent Ladeuil
Rename IdMatcher to NameMatcher. |
3493 |
super(NameMatcher, self).__init__(store) |
6123.7.1
by Vincent Ladeuil
Provide config.IdMatcher for config files defining secion names as unique ids |
3494 |
self.section_id = section_id |
3495 |
||
3496 |
def match(self, section): |
|
3497 |
return section.id == self.section_id |
|
3498 |
||
3499 |
||
5743.2.37
by Vincent Ladeuil
Merge config-concrete-stores into config-section-matchers resolving conflicts |
3500 |
class LocationSection(Section): |
5743.2.24
by Vincent Ladeuil
Complete location config helpers with basic tests. |
3501 |
|
6524.2.1
by Aaron Bentley
Implement branchname support in config files. |
3502 |
def __init__(self, section, extra_path, branch_name=None): |
5743.2.24
by Vincent Ladeuil
Complete location config helpers with basic tests. |
3503 |
super(LocationSection, self).__init__(section.id, section.options) |
3504 |
self.extra_path = extra_path |
|
6524.2.2
by Aaron Bentley
Test branchname config var. |
3505 |
if branch_name is None: |
3506 |
branch_name = '' |
|
6082.5.25
by Vincent Ladeuil
Add ``basename`` as a section local option |
3507 |
self.locals = {'relpath': extra_path, |
6524.2.1
by Aaron Bentley
Implement branchname support in config files. |
3508 |
'basename': urlutils.basename(extra_path), |
3509 |
'branchname': branch_name} |
|
5743.2.24
by Vincent Ladeuil
Complete location config helpers with basic tests. |
3510 |
|
6260.3.1
by Vincent Ladeuil
Switch ``bzr config`` to the new config implementation |
3511 |
def get(self, name, default=None, expand=True): |
5743.2.24
by Vincent Ladeuil
Complete location config helpers with basic tests. |
3512 |
value = super(LocationSection, self).get(name, default) |
6260.3.1
by Vincent Ladeuil
Switch ``bzr config`` to the new config implementation |
3513 |
if value is not None and expand: |
5743.2.24
by Vincent Ladeuil
Complete location config helpers with basic tests. |
3514 |
policy_name = self.get(name + ':policy', None) |
3515 |
policy = _policy_value.get(policy_name, POLICY_NONE) |
|
3516 |
if policy == POLICY_APPENDPATH: |
|
3517 |
value = urlutils.join(value, self.extra_path) |
|
6082.5.21
by Vincent Ladeuil
Implement 'relpath' as a section locally expanded option. |
3518 |
# expand section local options right now (since POLICY_APPENDPATH
|
3519 |
# will never add options references, it's ok to expand after it).
|
|
3520 |
chunks = [] |
|
3521 |
for is_ref, chunk in iter_option_refs(value): |
|
3522 |
if not is_ref: |
|
3523 |
chunks.append(chunk) |
|
3524 |
else: |
|
3525 |
ref = chunk[1:-1] |
|
3526 |
if ref in self.locals: |
|
3527 |
chunks.append(self.locals[ref]) |
|
3528 |
else: |
|
3529 |
chunks.append(chunk) |
|
3530 |
value = ''.join(chunks) |
|
5743.2.24
by Vincent Ladeuil
Complete location config helpers with basic tests. |
3531 |
return value |
3532 |
||
3533 |
||
6402.2.6
by Vincent Ladeuil
Fix {relpath} support, realizing that when a section ends with a glob, it's not obivous to decide what should be done. |
3534 |
class StartingPathMatcher(SectionMatcher): |
6402.2.2
by Vincent Ladeuil
Bogus implementation passing smoke test |
3535 |
"""Select sections for a given location respecting the Store order."""
|
3536 |
||
6402.2.8
by Vincent Ladeuil
Feedback from review. |
3537 |
# FIXME: Both local paths and urls can be used for section names as well as
|
3538 |
# ``location`` to stay consistent with ``LocationMatcher`` which itself
|
|
3539 |
# inherited the fuzziness from the previous ``LocationConfig``
|
|
3540 |
# implementation. We probably need to revisit which encoding is allowed for
|
|
3541 |
# both ``location`` and section names and how we normalize
|
|
3542 |
# them. http://pad.lv/85479, http://pad.lv/437009 and http://359320 are
|
|
3543 |
# related too. -- vila 2012-01-04
|
|
3544 |
||
6402.2.2
by Vincent Ladeuil
Bogus implementation passing smoke test |
3545 |
def __init__(self, store, location): |
6402.2.6
by Vincent Ladeuil
Fix {relpath} support, realizing that when a section ends with a glob, it's not obivous to decide what should be done. |
3546 |
super(StartingPathMatcher, self).__init__(store) |
6402.2.2
by Vincent Ladeuil
Bogus implementation passing smoke test |
3547 |
if location.startswith('file://'): |
3548 |
location = urlutils.local_path_from_url(location) |
|
3549 |
self.location = location |
|
3550 |
||
3551 |
def get_sections(self): |
|
6402.2.5
by Vincent Ladeuil
Always return the no-name section if present. |
3552 |
"""Get all sections matching ``location`` in the store.
|
3553 |
||
3554 |
The most generic sections are described first in the store, then more
|
|
3555 |
specific ones can be provided for reduced scopes.
|
|
3556 |
||
3557 |
The returned section are therefore returned in the reversed order so
|
|
3558 |
the most specific ones can be found first.
|
|
3559 |
"""
|
|
6402.2.6
by Vincent Ladeuil
Fix {relpath} support, realizing that when a section ends with a glob, it's not obivous to decide what should be done. |
3560 |
location_parts = self.location.rstrip('/').split('/') |
6402.2.2
by Vincent Ladeuil
Bogus implementation passing smoke test |
3561 |
store = self.store |
6402.2.3
by Vincent Ladeuil
More tests, a real implementation and some tweaks. |
3562 |
# Later sections are more specific, they should be returned first
|
3563 |
for _, section in reversed(list(store.get_sections())): |
|
6402.2.5
by Vincent Ladeuil
Always return the no-name section if present. |
3564 |
if section.id is None: |
3565 |
# The no-name section is always included if present
|
|
3566 |
yield store, LocationSection(section, self.location) |
|
3567 |
continue
|
|
6402.2.3
by Vincent Ladeuil
More tests, a real implementation and some tweaks. |
3568 |
section_path = section.id |
3569 |
if section_path.startswith('file://'): |
|
6402.2.6
by Vincent Ladeuil
Fix {relpath} support, realizing that when a section ends with a glob, it's not obivous to decide what should be done. |
3570 |
# the location is already a local path or URL, convert the
|
6402.2.7
by Vincent Ladeuil
Cleanup a bit and make sure we use at least one file:// url in the tests. |
3571 |
# section id to the same format
|
3572 |
section_path = urlutils.local_path_from_url(section_path) |
|
6402.2.3
by Vincent Ladeuil
More tests, a real implementation and some tweaks. |
3573 |
if (self.location.startswith(section_path) |
3574 |
or fnmatch.fnmatch(self.location, section_path)): |
|
6402.2.6
by Vincent Ladeuil
Fix {relpath} support, realizing that when a section ends with a glob, it's not obivous to decide what should be done. |
3575 |
section_parts = section_path.rstrip('/').split('/') |
3576 |
extra_path = '/'.join(location_parts[len(section_parts):]) |
|
3577 |
yield store, LocationSection(section, extra_path) |
|
6402.2.2
by Vincent Ladeuil
Bogus implementation passing smoke test |
3578 |
|
3579 |
||
5743.2.22
by Vincent Ladeuil
Some minimal SectionMatcher implementation to setup the test infrastucture. |
3580 |
class LocationMatcher(SectionMatcher): |
3581 |
||
5743.2.24
by Vincent Ladeuil
Complete location config helpers with basic tests. |
3582 |
def __init__(self, store, location): |
5743.2.22
by Vincent Ladeuil
Some minimal SectionMatcher implementation to setup the test infrastucture. |
3583 |
super(LocationMatcher, self).__init__(store) |
6524.2.1
by Aaron Bentley
Implement branchname support in config files. |
3584 |
url, params = urlutils.split_segment_parameters(location) |
5743.6.19
by Vincent Ladeuil
Clarify comments about section names for Location-related objects (also fix LocationMatcher and add tests). |
3585 |
if location.startswith('file://'): |
3586 |
location = urlutils.local_path_from_url(location) |
|
5743.2.22
by Vincent Ladeuil
Some minimal SectionMatcher implementation to setup the test infrastucture. |
3587 |
self.location = location |
6524.2.4
by Aaron Bentley
branchname falls back to basename. |
3588 |
branch_name = params.get('branch') |
3589 |
if branch_name is None: |
|
3590 |
self.branch_name = urlutils.basename(self.location) |
|
3591 |
else: |
|
3592 |
self.branch_name = urlutils.unescape(branch_name) |
|
5743.2.22
by Vincent Ladeuil
Some minimal SectionMatcher implementation to setup the test infrastucture. |
3593 |
|
5743.6.15
by Vincent Ladeuil
Don't pollute _iter_for_location_by_parts. |
3594 |
def _get_matching_sections(self): |
3595 |
"""Get all sections matching ``location``."""
|
|
3596 |
# We slightly diverge from LocalConfig here by allowing the no-name
|
|
3597 |
# section as the most generic one and the lower priority.
|
|
3598 |
no_name_section = None |
|
6015.22.1
by Vincent Ladeuil
config.LocationMatcher properly excludes unrelated sections |
3599 |
all_sections = [] |
5743.6.15
by Vincent Ladeuil
Don't pollute _iter_for_location_by_parts. |
3600 |
# Filter out the no_name_section so _iter_for_location_by_parts can be
|
3601 |
# used (it assumes all sections have a name).
|
|
6260.3.1
by Vincent Ladeuil
Switch ``bzr config`` to the new config implementation |
3602 |
for _, section in self.store.get_sections(): |
5743.6.15
by Vincent Ladeuil
Don't pollute _iter_for_location_by_parts. |
3603 |
if section.id is None: |
3604 |
no_name_section = section |
|
3605 |
else: |
|
6015.22.1
by Vincent Ladeuil
config.LocationMatcher properly excludes unrelated sections |
3606 |
all_sections.append(section) |
5743.6.15
by Vincent Ladeuil
Don't pollute _iter_for_location_by_parts. |
3607 |
# Unfortunately _iter_for_location_by_parts deals with section names so
|
3608 |
# we have to resync.
|
|
5743.2.31
by Vincent Ladeuil
Both the length and the section id should be used to sort. |
3609 |
filtered_sections = _iter_for_location_by_parts( |
6015.22.1
by Vincent Ladeuil
config.LocationMatcher properly excludes unrelated sections |
3610 |
[s.id for s in all_sections], self.location) |
3611 |
iter_all_sections = iter(all_sections) |
|
5743.2.27
by Vincent Ladeuil
Merge the use of _filter_for_location_by_parts, uglier, but better for |
3612 |
matching_sections = [] |
5743.6.15
by Vincent Ladeuil
Don't pollute _iter_for_location_by_parts. |
3613 |
if no_name_section is not None: |
3614 |
matching_sections.append( |
|
6402.2.1
by Vincent Ladeuil
Get rid of LocationSection.length as its not needed in the general case. |
3615 |
(0, LocationSection(no_name_section, self.location))) |
5743.2.31
by Vincent Ladeuil
Both the length and the section id should be used to sort. |
3616 |
for section_id, extra_path, length in filtered_sections: |
6015.22.1
by Vincent Ladeuil
config.LocationMatcher properly excludes unrelated sections |
3617 |
# a section id is unique for a given store so it's safe to take the
|
3618 |
# first matching section while iterating. Also, all filtered
|
|
3619 |
# sections are part of 'all_sections' and will always be found
|
|
3620 |
# there.
|
|
3621 |
while True: |
|
3622 |
section = iter_all_sections.next() |
|
3623 |
if section_id == section.id: |
|
6524.2.1
by Aaron Bentley
Implement branchname support in config files. |
3624 |
section = LocationSection(section, extra_path, |
3625 |
self.branch_name) |
|
3626 |
matching_sections.append((length, section)) |
|
6015.22.1
by Vincent Ladeuil
config.LocationMatcher properly excludes unrelated sections |
3627 |
break
|
5743.6.15
by Vincent Ladeuil
Don't pollute _iter_for_location_by_parts. |
3628 |
return matching_sections |
3629 |
||
3630 |
def get_sections(self): |
|
3631 |
# Override the default implementation as we want to change the order
|
|
3632 |
matching_sections = self._get_matching_sections() |
|
5743.2.24
by Vincent Ladeuil
Complete location config helpers with basic tests. |
3633 |
# We want the longest (aka more specific) locations first
|
5743.2.31
by Vincent Ladeuil
Both the length and the section id should be used to sort. |
3634 |
sections = sorted(matching_sections, |
6402.2.1
by Vincent Ladeuil
Get rid of LocationSection.length as its not needed in the general case. |
3635 |
key=lambda (length, section): (length, section.id), |
5743.2.24
by Vincent Ladeuil
Complete location config helpers with basic tests. |
3636 |
reverse=True) |
3637 |
# Sections mentioning 'ignore_parents' restrict the selection
|
|
6402.2.1
by Vincent Ladeuil
Get rid of LocationSection.length as its not needed in the general case. |
3638 |
for _, section in sections: |
5743.2.24
by Vincent Ladeuil
Complete location config helpers with basic tests. |
3639 |
# FIXME: We really want to use as_bool below -- vila 2011-04-07
|
3640 |
ignore = section.get('ignore_parents', None) |
|
3641 |
if ignore is not None: |
|
3642 |
ignore = ui.bool_from_string(ignore) |
|
3643 |
if ignore: |
|
3644 |
break
|
|
3645 |
# Finally, we have a valid section
|
|
6260.3.1
by Vincent Ladeuil
Switch ``bzr config`` to the new config implementation |
3646 |
yield self.store, section |
5743.2.22
by Vincent Ladeuil
Some minimal SectionMatcher implementation to setup the test infrastucture. |
3647 |
|
5743.2.13
by Vincent Ladeuil
Trivial implementations for stores with smoke tests. |
3648 |
|
6499.3.10
by Vincent Ladeuil
Add news entry and cleanup |
3649 |
# FIXME: _shared_stores should be an attribute of a library state once a
|
3650 |
# library_state object is always available.
|
|
3651 |
_shared_stores = {} |
|
3652 |
_shared_stores_at_exit_installed = False |
|
6082.5.20
by Vincent Ladeuil
Refactor iter_option_refs out of Stack so it can be reused. |
3653 |
|
5743.1.34
by Vincent Ladeuil
Merge config-section-matchers into config-stack resolving conflicts |
3654 |
class Stack(object): |
5743.1.1
by Vincent Ladeuil
Start implementing a config stack. |
3655 |
"""A stack of configurations where an option can be defined"""
|
3656 |
||
6260.3.1
by Vincent Ladeuil
Switch ``bzr config`` to the new config implementation |
3657 |
def __init__(self, sections_def, store=None, mutable_section_id=None): |
5743.1.11
by Vincent Ladeuil
Properly use MutableSection for write operations. |
3658 |
"""Creates a stack of sections with an optional store for changes.
|
3659 |
||
5743.1.36
by Vincent Ladeuil
Clarify that constructor parameters are here to *define* the stack and as such can be re-used. Also make the sections_def parameter mandatory. |
3660 |
:param sections_def: A list of Section or callables that returns an
|
3661 |
iterable of Section. This defines the Sections for the Stack and
|
|
3662 |
can be called repeatedly if needed.
|
|
5743.1.11
by Vincent Ladeuil
Properly use MutableSection for write operations. |
3663 |
|
5743.1.37
by Vincent Ladeuil
Change the way Stacks are built: requires a Store and a mutable section name instead of a callable returning the mutable section. |
3664 |
:param store: The optional Store where modifications will be
|
3665 |
recorded. If none is specified, no modifications can be done.
|
|
3666 |
||
6260.3.1
by Vincent Ladeuil
Switch ``bzr config`` to the new config implementation |
3667 |
:param mutable_section_id: The id of the MutableSection where changes
|
3668 |
are recorded. This requires the ``store`` parameter to be
|
|
5743.1.37
by Vincent Ladeuil
Change the way Stacks are built: requires a Store and a mutable section name instead of a callable returning the mutable section. |
3669 |
specified.
|
5743.1.11
by Vincent Ladeuil
Properly use MutableSection for write operations. |
3670 |
"""
|
5743.1.36
by Vincent Ladeuil
Clarify that constructor parameters are here to *define* the stack and as such can be re-used. Also make the sections_def parameter mandatory. |
3671 |
self.sections_def = sections_def |
5743.1.37
by Vincent Ladeuil
Change the way Stacks are built: requires a Store and a mutable section name instead of a callable returning the mutable section. |
3672 |
self.store = store |
6260.3.1
by Vincent Ladeuil
Switch ``bzr config`` to the new config implementation |
3673 |
self.mutable_section_id = mutable_section_id |
5743.1.1
by Vincent Ladeuil
Start implementing a config stack. |
3674 |
|
6466.1.1
by Vincent Ladeuil
Fix RegistryOption display in bzr config output |
3675 |
def iter_sections(self): |
3676 |
"""Iterate all the defined sections."""
|
|
3677 |
# Ensuring lazy loading is achieved by delaying section matching (which
|
|
3678 |
# implies querying the persistent storage) until it can't be avoided
|
|
3679 |
# anymore by using callables to describe (possibly empty) section
|
|
3680 |
# lists.
|
|
3681 |
for sections in self.sections_def: |
|
3682 |
for store, section in sections(): |
|
3683 |
yield store, section |
|
3684 |
||
6468.5.2
by Vincent Ladeuil
Merge bzr.dev resolving conflicts |
3685 |
def get(self, name, expand=True, convert=True): |
5743.1.16
by Vincent Ladeuil
Allows empty sections and empty section callables. |
3686 |
"""Return the *first* option value found in the sections.
|
5743.1.13
by Vincent Ladeuil
Better explain lazy loading and make sure the mutable section respect the design. |
3687 |
|
5743.1.16
by Vincent Ladeuil
Allows empty sections and empty section callables. |
3688 |
This is where we guarantee that sections coming from Store are loaded
|
3689 |
lazily: the loading is delayed until we need to either check that an
|
|
5743.1.13
by Vincent Ladeuil
Better explain lazy loading and make sure the mutable section respect the design. |
3690 |
option exists or get its value, which in turn may require to discover
|
3691 |
in which sections it can be defined. Both of these (section and option
|
|
3692 |
existence) require loading the store (even partially).
|
|
6082.5.2
by Vincent Ladeuil
Cargo-cult the config option expansion implementation with tweaks from the old to the new config design. |
3693 |
|
3694 |
:param name: The queried option.
|
|
3695 |
||
3696 |
:param expand: Whether options references should be expanded.
|
|
3697 |
||
6466.1.1
by Vincent Ladeuil
Fix RegistryOption display in bzr config output |
3698 |
:param convert: Whether the option value should be converted from
|
3699 |
unicode (do nothing for non-registered options).
|
|
3700 |
||
6082.5.2
by Vincent Ladeuil
Cargo-cult the config option expansion implementation with tweaks from the old to the new config design. |
3701 |
:returns: The value of the option.
|
5743.1.13
by Vincent Ladeuil
Better explain lazy loading and make sure the mutable section respect the design. |
3702 |
"""
|
5743.1.36
by Vincent Ladeuil
Clarify that constructor parameters are here to *define* the stack and as such can be re-used. Also make the sections_def parameter mandatory. |
3703 |
# FIXME: No caching of options nor sections yet -- vila 20110503
|
5743.12.6
by Vincent Ladeuil
Stack.get() provides the registered option default value. |
3704 |
value = None |
6385.1.1
by Vincent Ladeuil
Stores allow Stacks to control when values are quoted/unquoted |
3705 |
found_store = None # Where the option value has been found |
6059.1.1
by Vincent Ladeuil
Implement from_unicode to convert config option values from store. |
3706 |
# If the option is registered, it may provide additional info about
|
3707 |
# value handling
|
|
3708 |
try: |
|
3709 |
opt = option_registry.get(name) |
|
3710 |
except KeyError: |
|
3711 |
# Not registered
|
|
3712 |
opt = None |
|
6393.3.1
by Vincent Ladeuil
Configuration option value can be overridden by os environ variables |
3713 |
|
6082.5.12
by Vincent Ladeuil
Remove duplication in stack.get() and useless code now that list conversion is explicit and delayed. |
3714 |
def expand_and_convert(val): |
6393.3.2
by Vincent Ladeuil
Merge trunk resolving conflicts |
3715 |
# This may need to be called in different contexts if the value is
|
3716 |
# None or ends up being None during expansion or conversion.
|
|
6082.5.12
by Vincent Ladeuil
Remove duplication in stack.get() and useless code now that list conversion is explicit and delayed. |
3717 |
if val is not None: |
3718 |
if expand: |
|
3719 |
if isinstance(val, basestring): |
|
3720 |
val = self._expand_options_in_string(val) |
|
3721 |
else: |
|
3722 |
trace.warning('Cannot expand "%s":' |
|
3723 |
' %s does not support option expansion' |
|
3724 |
% (name, type(val))) |
|
6385.1.1
by Vincent Ladeuil
Stores allow Stacks to control when values are quoted/unquoted |
3725 |
if opt is None: |
3726 |
val = found_store.unquote(val) |
|
6466.1.1
by Vincent Ladeuil
Fix RegistryOption display in bzr config output |
3727 |
elif convert: |
6385.1.1
by Vincent Ladeuil
Stores allow Stacks to control when values are quoted/unquoted |
3728 |
val = opt.convert_from_unicode(found_store, val) |
6082.5.12
by Vincent Ladeuil
Remove duplication in stack.get() and useless code now that list conversion is explicit and delayed. |
3729 |
return val |
6393.3.1
by Vincent Ladeuil
Configuration option value can be overridden by os environ variables |
3730 |
|
3731 |
# First of all, check if the environment can override the configuration
|
|
3732 |
# value
|
|
3733 |
if opt is not None and opt.override_from_env: |
|
3734 |
value = opt.get_override() |
|
3735 |
value = expand_and_convert(value) |
|
3736 |
if value is None: |
|
6466.1.1
by Vincent Ladeuil
Fix RegistryOption display in bzr config output |
3737 |
for store, section in self.iter_sections(): |
3738 |
value = section.get(name) |
|
6393.3.1
by Vincent Ladeuil
Configuration option value can be overridden by os environ variables |
3739 |
if value is not None: |
6466.1.1
by Vincent Ladeuil
Fix RegistryOption display in bzr config output |
3740 |
found_store = store |
6393.3.1
by Vincent Ladeuil
Configuration option value can be overridden by os environ variables |
3741 |
break
|
3742 |
value = expand_and_convert(value) |
|
3743 |
if opt is not None and value is None: |
|
3744 |
# If the option is registered, it may provide a default value
|
|
3745 |
value = opt.get_default() |
|
3746 |
value = expand_and_convert(value) |
|
6082.5.3
by Vincent Ladeuil
Fix the hook call. |
3747 |
for hook in ConfigHooks['get']: |
3748 |
hook(self, name, value) |
|
6082.5.2
by Vincent Ladeuil
Cargo-cult the config option expansion implementation with tweaks from the old to the new config design. |
3749 |
return value |
3750 |
||
3751 |
def expand_options(self, string, env=None): |
|
3752 |
"""Expand option references in the string in the configuration context.
|
|
3753 |
||
3754 |
:param string: The string containing option(s) to expand.
|
|
3755 |
||
3756 |
:param env: An option dict defining additional configuration options or
|
|
3757 |
overriding existing ones.
|
|
3758 |
||
3759 |
:returns: The expanded string.
|
|
3760 |
"""
|
|
3761 |
return self._expand_options_in_string(string, env) |
|
3762 |
||
3763 |
def _expand_options_in_string(self, string, env=None, _refs=None): |
|
3764 |
"""Expand options in the string in the configuration context.
|
|
3765 |
||
3766 |
:param string: The string to be expanded.
|
|
3767 |
||
3768 |
:param env: An option dict defining additional configuration options or
|
|
3769 |
overriding existing ones.
|
|
3770 |
||
3771 |
:param _refs: Private list (FIFO) containing the options being expanded
|
|
3772 |
to detect loops.
|
|
3773 |
||
3774 |
:returns: The expanded string.
|
|
3775 |
"""
|
|
3776 |
if string is None: |
|
3777 |
# Not much to expand there
|
|
3778 |
return None |
|
3779 |
if _refs is None: |
|
3780 |
# What references are currently resolved (to detect loops)
|
|
3781 |
_refs = [] |
|
3782 |
result = string |
|
3783 |
# We need to iterate until no more refs appear ({{foo}} will need two
|
|
3784 |
# iterations for example).
|
|
6082.5.20
by Vincent Ladeuil
Refactor iter_option_refs out of Stack so it can be reused. |
3785 |
expanded = True |
3786 |
while expanded: |
|
3787 |
expanded = False |
|
6082.5.2
by Vincent Ladeuil
Cargo-cult the config option expansion implementation with tweaks from the old to the new config design. |
3788 |
chunks = [] |
6082.5.20
by Vincent Ladeuil
Refactor iter_option_refs out of Stack so it can be reused. |
3789 |
for is_ref, chunk in iter_option_refs(result): |
3790 |
if not is_ref: |
|
6082.5.12
by Vincent Ladeuil
Remove duplication in stack.get() and useless code now that list conversion is explicit and delayed. |
3791 |
chunks.append(chunk) |
6082.5.2
by Vincent Ladeuil
Cargo-cult the config option expansion implementation with tweaks from the old to the new config design. |
3792 |
else: |
6082.5.20
by Vincent Ladeuil
Refactor iter_option_refs out of Stack so it can be reused. |
3793 |
expanded = True |
6082.5.2
by Vincent Ladeuil
Cargo-cult the config option expansion implementation with tweaks from the old to the new config design. |
3794 |
name = chunk[1:-1] |
3795 |
if name in _refs: |
|
3796 |
raise errors.OptionExpansionLoop(string, _refs) |
|
3797 |
_refs.append(name) |
|
3798 |
value = self._expand_option(name, env, _refs) |
|
3799 |
if value is None: |
|
3800 |
raise errors.ExpandingUnknownOption(name, string) |
|
6082.5.12
by Vincent Ladeuil
Remove duplication in stack.get() and useless code now that list conversion is explicit and delayed. |
3801 |
chunks.append(value) |
6082.5.2
by Vincent Ladeuil
Cargo-cult the config option expansion implementation with tweaks from the old to the new config design. |
3802 |
_refs.pop() |
6082.5.12
by Vincent Ladeuil
Remove duplication in stack.get() and useless code now that list conversion is explicit and delayed. |
3803 |
result = ''.join(chunks) |
6082.5.2
by Vincent Ladeuil
Cargo-cult the config option expansion implementation with tweaks from the old to the new config design. |
3804 |
return result |
3805 |
||
3806 |
def _expand_option(self, name, env, _refs): |
|
3807 |
if env is not None and name in env: |
|
3808 |
# Special case, values provided in env takes precedence over
|
|
3809 |
# anything else
|
|
3810 |
value = env[name] |
|
3811 |
else: |
|
6466.1.3
by Vincent Ladeuil
Values should never be converted during expansion. |
3812 |
value = self.get(name, expand=False, convert=False) |
6082.5.12
by Vincent Ladeuil
Remove duplication in stack.get() and useless code now that list conversion is explicit and delayed. |
3813 |
value = self._expand_options_in_string(value, env, _refs) |
5743.12.6
by Vincent Ladeuil
Stack.get() provides the registered option default value. |
3814 |
return value |
5743.1.1
by Vincent Ladeuil
Start implementing a config stack. |
3815 |
|
5743.1.37
by Vincent Ladeuil
Change the way Stacks are built: requires a Store and a mutable section name instead of a callable returning the mutable section. |
3816 |
def _get_mutable_section(self): |
3817 |
"""Get the MutableSection for the Stack.
|
|
5743.1.13
by Vincent Ladeuil
Better explain lazy loading and make sure the mutable section respect the design. |
3818 |
|
5743.1.15
by Vincent Ladeuil
Test and implement ConfigStack.remove. |
3819 |
This is where we guarantee that the mutable section is lazily loaded:
|
5743.1.37
by Vincent Ladeuil
Change the way Stacks are built: requires a Store and a mutable section name instead of a callable returning the mutable section. |
3820 |
this means we won't load the corresponding store before setting a value
|
3821 |
or deleting an option. In practice the store will often be loaded but
|
|
6260.3.1
by Vincent Ladeuil
Switch ``bzr config`` to the new config implementation |
3822 |
this helps catching some programming errors.
|
5743.1.13
by Vincent Ladeuil
Better explain lazy loading and make sure the mutable section respect the design. |
3823 |
"""
|
6385.1.1
by Vincent Ladeuil
Stores allow Stacks to control when values are quoted/unquoted |
3824 |
store = self.store |
3825 |
section = store.get_mutable_section(self.mutable_section_id) |
|
3826 |
return store, section |
|
5743.1.37
by Vincent Ladeuil
Change the way Stacks are built: requires a Store and a mutable section name instead of a callable returning the mutable section. |
3827 |
|
3828 |
def set(self, name, value): |
|
3829 |
"""Set a new value for the option."""
|
|
6385.1.1
by Vincent Ladeuil
Stores allow Stacks to control when values are quoted/unquoted |
3830 |
store, section = self._get_mutable_section() |
3831 |
section.set(name, store.quote(value)) |
|
5743.8.10
by Vincent Ladeuil
We don't need (nor want) to tie the config hooks to a particular class. Especially when we want to use the same hooks on both implementations. |
3832 |
for hook in ConfigHooks['set']: |
5743.8.6
by Vincent Ladeuil
Add hooks for config stacks. |
3833 |
hook(self, name, value) |
5743.1.7
by Vincent Ladeuil
Simple set implementation. |
3834 |
|
5743.1.15
by Vincent Ladeuil
Test and implement ConfigStack.remove. |
3835 |
def remove(self, name): |
5743.1.37
by Vincent Ladeuil
Change the way Stacks are built: requires a Store and a mutable section name instead of a callable returning the mutable section. |
3836 |
"""Remove an existing option."""
|
6385.1.1
by Vincent Ladeuil
Stores allow Stacks to control when values are quoted/unquoted |
3837 |
_, section = self._get_mutable_section() |
5743.1.15
by Vincent Ladeuil
Test and implement ConfigStack.remove. |
3838 |
section.remove(name) |
5743.8.10
by Vincent Ladeuil
We don't need (nor want) to tie the config hooks to a particular class. Especially when we want to use the same hooks on both implementations. |
3839 |
for hook in ConfigHooks['remove']: |
5743.8.6
by Vincent Ladeuil
Add hooks for config stacks. |
3840 |
hook(self, name) |
5743.1.15
by Vincent Ladeuil
Test and implement ConfigStack.remove. |
3841 |
|
5743.1.34
by Vincent Ladeuil
Merge config-section-matchers into config-stack resolving conflicts |
3842 |
def __repr__(self): |
3843 |
# Mostly for debugging use
|
|
3844 |
return "<config.%s(%s)>" % (self.__class__.__name__, id(self)) |
|
3845 |
||
6161.1.7
by Vincent Ladeuil
Emit a warning when bzrlib.intialize) has not been called |
3846 |
def _get_overrides(self): |
6499.3.3
by Vincent Ladeuil
Stop using _CompatibleStack now that local config files can be |
3847 |
# FIXME: Hack around library_state.initialize never called
|
6161.1.7
by Vincent Ladeuil
Emit a warning when bzrlib.intialize) has not been called |
3848 |
if bzrlib.global_state is not None: |
6260.3.1
by Vincent Ladeuil
Switch ``bzr config`` to the new config implementation |
3849 |
return bzrlib.global_state.cmdline_overrides.get_sections() |
6161.1.7
by Vincent Ladeuil
Emit a warning when bzrlib.intialize) has not been called |
3850 |
return [] |
3851 |
||
6499.3.10
by Vincent Ladeuil
Add news entry and cleanup |
3852 |
def get_shared_store(self, store, state=None): |
3853 |
"""Get a known shared store.
|
|
3854 |
||
3855 |
Store urls uniquely identify them and are used to ensure a single copy
|
|
3856 |
is shared across all users.
|
|
3857 |
||
3858 |
:param store: The store known to the caller.
|
|
3859 |
||
3860 |
:param state: The library state where the known stores are kept.
|
|
3861 |
||
3862 |
:returns: The store received if it's not a known one, an already known
|
|
3863 |
otherwise.
|
|
3864 |
"""
|
|
3865 |
if state is None: |
|
3866 |
state = bzrlib.global_state |
|
3867 |
if state is None: |
|
3868 |
global _shared_stores_at_exit_installed |
|
3869 |
stores = _shared_stores |
|
3870 |
def save_config_changes(): |
|
3871 |
for k, store in stores.iteritems(): |
|
3872 |
store.save_changes() |
|
3873 |
if not _shared_stores_at_exit_installed: |
|
3874 |
# FIXME: Ugly hack waiting for library_state to always be
|
|
3875 |
# available. -- vila 20120731
|
|
3876 |
import atexit |
|
3877 |
atexit.register(save_config_changes) |
|
3878 |
_shared_stores_at_exit_installed = True |
|
3879 |
else: |
|
3880 |
stores = state.config_stores |
|
3881 |
url = store.external_url() |
|
3882 |
try: |
|
3883 |
return stores[url] |
|
3884 |
except KeyError: |
|
3885 |
stores[url] = store |
|
3886 |
return store |
|
3887 |
||
5743.1.1
by Vincent Ladeuil
Start implementing a config stack. |
3888 |
|
6393.1.1
by Vincent Ladeuil
Provides MemoryStack to simplify configuration setup in tests |
3889 |
class MemoryStack(Stack): |
3890 |
"""A configuration stack defined from a string.
|
|
3891 |
||
3892 |
This is mainly intended for tests and requires no disk resources.
|
|
3893 |
"""
|
|
3894 |
||
3895 |
def __init__(self, content=None): |
|
3896 |
"""Create an in-memory stack from a given content.
|
|
3897 |
||
3898 |
It uses a single store based on configobj and support reading and
|
|
3899 |
writing options.
|
|
3900 |
||
3901 |
:param content: The initial content of the store. If None, the store is
|
|
3902 |
not loaded and ``_load_from_string`` can and should be used if
|
|
3903 |
needed.
|
|
3904 |
"""
|
|
3905 |
store = IniFileStore() |
|
3906 |
if content is not None: |
|
3907 |
store._load_from_string(content) |
|
3908 |
super(MemoryStack, self).__init__( |
|
3909 |
[store.get_sections], store) |
|
3910 |
||
3911 |
||
5743.6.23
by Vincent Ladeuil
More config concurrent updates tests. |
3912 |
class _CompatibleStack(Stack): |
5743.6.26
by Vincent Ladeuil
Clarify _CompatibleStack aims. |
3913 |
"""Place holder for compatibility with previous design.
|
3914 |
||
5743.10.2
by Vincent Ladeuil
Make sure RemoteBranch are supported as well, relying on the vfs API. |
3915 |
This is intended to ease the transition from the Config-based design to the
|
5743.6.26
by Vincent Ladeuil
Clarify _CompatibleStack aims. |
3916 |
Stack-based design and should not be used nor relied upon by plugins.
|
3917 |
||
3918 |
One assumption made here is that the daughter classes will all use Stores
|
|
3919 |
derived from LockableIniFileStore).
|
|
5743.6.32
by Vincent Ladeuil
Address poolie's review comments. |
3920 |
|
6260.3.1
by Vincent Ladeuil
Switch ``bzr config`` to the new config implementation |
3921 |
It implements set() and remove () by re-loading the store before applying
|
3922 |
the modification and saving it.
|
|
5743.6.32
by Vincent Ladeuil
Address poolie's review comments. |
3923 |
|
3924 |
The long term plan being to implement a single write by store to save
|
|
3925 |
all modifications, this class should not be used in the interim.
|
|
5743.6.26
by Vincent Ladeuil
Clarify _CompatibleStack aims. |
3926 |
"""
|
5743.6.23
by Vincent Ladeuil
More config concurrent updates tests. |
3927 |
|
3928 |
def set(self, name, value): |
|
5743.10.2
by Vincent Ladeuil
Make sure RemoteBranch are supported as well, relying on the vfs API. |
3929 |
# Force a reload
|
3930 |
self.store.unload() |
|
5743.6.23
by Vincent Ladeuil
More config concurrent updates tests. |
3931 |
super(_CompatibleStack, self).set(name, value) |
3932 |
# Force a write to persistent storage
|
|
3933 |
self.store.save() |
|
3934 |
||
6260.3.1
by Vincent Ladeuil
Switch ``bzr config`` to the new config implementation |
3935 |
def remove(self, name): |
3936 |
# Force a reload
|
|
3937 |
self.store.unload() |
|
3938 |
super(_CompatibleStack, self).remove(name) |
|
3939 |
# Force a write to persistent storage
|
|
3940 |
self.store.save() |
|
3941 |
||
5743.6.23
by Vincent Ladeuil
More config concurrent updates tests. |
3942 |
|
6499.3.3
by Vincent Ladeuil
Stop using _CompatibleStack now that local config files can be |
3943 |
class GlobalStack(Stack): |
6362.3.1
by Vincent Ladeuil
Config doc refresh, clarifying the sections used in the implemented stacks. |
3944 |
"""Global options only stack.
|
3945 |
||
3946 |
The following sections are queried:
|
|
3947 |
||
3948 |
* command-line overrides,
|
|
3949 |
||
3950 |
* the 'DEFAULT' section in bazaar.conf
|
|
3951 |
||
3952 |
This stack will use the ``DEFAULT`` section in bazaar.conf as its
|
|
3953 |
MutableSection.
|
|
3954 |
"""
|
|
5743.6.1
by Vincent Ladeuil
Outline concrete stacks and basic smoke tests. |
3955 |
|
3956 |
def __init__(self): |
|
6499.3.10
by Vincent Ladeuil
Add news entry and cleanup |
3957 |
gstore = self.get_shared_store(GlobalStore()) |
6161.1.1
by Vincent Ladeuil
Allow config options to be overridden from the command line |
3958 |
super(GlobalStack, self).__init__( |
6362.3.1
by Vincent Ladeuil
Config doc refresh, clarifying the sections used in the implemented stacks. |
3959 |
[self._get_overrides, |
3960 |
NameMatcher(gstore, 'DEFAULT').get_sections], |
|
6260.3.1
by Vincent Ladeuil
Switch ``bzr config`` to the new config implementation |
3961 |
gstore, mutable_section_id='DEFAULT') |
5743.6.1
by Vincent Ladeuil
Outline concrete stacks and basic smoke tests. |
3962 |
|
3963 |
||
6499.3.3
by Vincent Ladeuil
Stop using _CompatibleStack now that local config files can be |
3964 |
class LocationStack(Stack): |
6362.3.1
by Vincent Ladeuil
Config doc refresh, clarifying the sections used in the implemented stacks. |
3965 |
"""Per-location options falling back to global options stack.
|
3966 |
||
3967 |
||
3968 |
The following sections are queried:
|
|
3969 |
||
3970 |
* command-line overrides,
|
|
3971 |
||
3972 |
* the sections matching ``location`` in ``locations.conf``, the order being
|
|
3973 |
defined by the number of path components in the section glob, higher
|
|
3974 |
numbers first (from most specific section to most generic).
|
|
3975 |
||
3976 |
* the 'DEFAULT' section in bazaar.conf
|
|
3977 |
||
3978 |
This stack will use the ``location`` section in locations.conf as its
|
|
3979 |
MutableSection.
|
|
3980 |
"""
|
|
5743.6.1
by Vincent Ladeuil
Outline concrete stacks and basic smoke tests. |
3981 |
|
3982 |
def __init__(self, location): |
|
6006.4.7
by Martin Pool
fdatasync on dirstate can be disabled |
3983 |
"""Make a new stack for a location and global configuration.
|
6371.1.1
by Jelmer Vernooij
Fix some whitespace in bzrlib.config. |
3984 |
|
6006.4.7
by Martin Pool
fdatasync on dirstate can be disabled |
3985 |
:param location: A URL prefix to """
|
6499.3.10
by Vincent Ladeuil
Add news entry and cleanup |
3986 |
lstore = self.get_shared_store(LocationStore()) |
6288.1.1
by Vincent Ladeuil
Fix windows test regressions about locations.conf handling |
3987 |
if location.startswith('file://'): |
3988 |
location = urlutils.local_path_from_url(location) |
|
6499.3.10
by Vincent Ladeuil
Add news entry and cleanup |
3989 |
gstore = self.get_shared_store(GlobalStore()) |
5743.6.1
by Vincent Ladeuil
Outline concrete stacks and basic smoke tests. |
3990 |
super(LocationStack, self).__init__( |
6161.1.7
by Vincent Ladeuil
Emit a warning when bzrlib.intialize) has not been called |
3991 |
[self._get_overrides, |
6362.3.1
by Vincent Ladeuil
Config doc refresh, clarifying the sections used in the implemented stacks. |
3992 |
LocationMatcher(lstore, location).get_sections, |
3993 |
NameMatcher(gstore, 'DEFAULT').get_sections], |
|
6260.3.1
by Vincent Ladeuil
Switch ``bzr config`` to the new config implementation |
3994 |
lstore, mutable_section_id=location) |
5743.6.1
by Vincent Ladeuil
Outline concrete stacks and basic smoke tests. |
3995 |
|
6076.1.1
by Vincent Ladeuil
Add the missing config stacks and store |
3996 |
|
6404.6.1
by Vincent Ladeuil
Tests passing for a first rough version of a cached branch config store. The changes here are too invasive and several parallel proposals have been made. |
3997 |
class BranchStack(Stack): |
6362.3.1
by Vincent Ladeuil
Config doc refresh, clarifying the sections used in the implemented stacks. |
3998 |
"""Per-location options falling back to branch then global options stack.
|
3999 |
||
4000 |
The following sections are queried:
|
|
4001 |
||
4002 |
* command-line overrides,
|
|
4003 |
||
4004 |
* the sections matching ``location`` in ``locations.conf``, the order being
|
|
4005 |
defined by the number of path components in the section glob, higher
|
|
4006 |
numbers first (from most specific section to most generic),
|
|
4007 |
||
4008 |
* the no-name section in branch.conf,
|
|
4009 |
||
4010 |
* the ``DEFAULT`` section in ``bazaar.conf``.
|
|
4011 |
||
4012 |
This stack will use the no-name section in ``branch.conf`` as its
|
|
6362.3.2
by Vincent Ladeuil
Fix as per jelmer's review. |
4013 |
MutableSection.
|
6362.3.1
by Vincent Ladeuil
Config doc refresh, clarifying the sections used in the implemented stacks. |
4014 |
"""
|
5743.6.1
by Vincent Ladeuil
Outline concrete stacks and basic smoke tests. |
4015 |
|
4016 |
def __init__(self, branch): |
|
6499.3.10
by Vincent Ladeuil
Add news entry and cleanup |
4017 |
lstore = self.get_shared_store(LocationStore()) |
6270.1.19
by Jelmer Vernooij
Some changes discussed with vila on IRC. |
4018 |
bstore = branch._get_config_store() |
6499.3.10
by Vincent Ladeuil
Add news entry and cleanup |
4019 |
gstore = self.get_shared_store(GlobalStore()) |
5743.6.1
by Vincent Ladeuil
Outline concrete stacks and basic smoke tests. |
4020 |
super(BranchStack, self).__init__( |
6161.1.7
by Vincent Ladeuil
Emit a warning when bzrlib.intialize) has not been called |
4021 |
[self._get_overrides, |
6362.3.1
by Vincent Ladeuil
Config doc refresh, clarifying the sections used in the implemented stacks. |
4022 |
LocationMatcher(lstore, branch.base).get_sections, |
4023 |
NameMatcher(bstore, None).get_sections, |
|
6260.3.2
by Vincent Ladeuil
Only the DEFAULT section is searched for the normal uses of bazaar.conf |
4024 |
NameMatcher(gstore, 'DEFAULT').get_sections], |
5743.6.14
by Vincent Ladeuil
Parametrize the Stack tests. |
4025 |
bstore) |
5743.10.2
by Vincent Ladeuil
Make sure RemoteBranch are supported as well, relying on the vfs API. |
4026 |
self.branch = branch |
5743.6.1
by Vincent Ladeuil
Outline concrete stacks and basic smoke tests. |
4027 |
|
6404.6.7
by Vincent Ladeuil
Change set/remove to require a lock for the branch config files. |
4028 |
def lock_write(self, token=None): |
4029 |
return self.branch.lock_write(token) |
|
4030 |
||
4031 |
def unlock(self): |
|
4032 |
return self.branch.unlock() |
|
4033 |
||
4034 |
@needs_write_lock
|
|
4035 |
def set(self, name, value): |
|
4036 |
super(BranchStack, self).set(name, value) |
|
6404.6.9
by Vincent Ladeuil
Hmpf, branch.unlock() will call store.save_changes(), this should be called explicitly or no IOs are saved. |
4037 |
# Unlocking the branch will trigger a store.save_changes() so the last
|
4038 |
# unlock saves all the changes.
|
|
6404.6.7
by Vincent Ladeuil
Change set/remove to require a lock for the branch config files. |
4039 |
|
4040 |
@needs_write_lock
|
|
4041 |
def remove(self, name): |
|
4042 |
super(BranchStack, self).remove(name) |
|
6404.6.9
by Vincent Ladeuil
Hmpf, branch.unlock() will call store.save_changes(), this should be called explicitly or no IOs are saved. |
4043 |
# Unlocking the branch will trigger a store.save_changes() so the last
|
4044 |
# unlock saves all the changes.
|
|
6404.6.7
by Vincent Ladeuil
Change set/remove to require a lock for the branch config files. |
4045 |
|
5743.6.1
by Vincent Ladeuil
Outline concrete stacks and basic smoke tests. |
4046 |
|
6499.3.3
by Vincent Ladeuil
Stop using _CompatibleStack now that local config files can be |
4047 |
class RemoteControlStack(Stack): |
6270.1.20
by Jelmer Vernooij
Revert RemoteBranchStack / RemoteControlStack changes. |
4048 |
"""Remote control-only options stack."""
|
4049 |
||
6270.1.23
by Jelmer Vernooij
Add notes about Remote{Control,Branch}Store. |
4050 |
# FIXME 2011-11-22 JRV This should probably be renamed to avoid confusion
|
4051 |
# with the stack used for remote bzr dirs. RemoteControlStack only uses
|
|
4052 |
# control.conf and is used only for stack options.
|
|
4053 |
||
6270.1.20
by Jelmer Vernooij
Revert RemoteBranchStack / RemoteControlStack changes. |
4054 |
def __init__(self, bzrdir): |
6270.1.21
by Jelmer Vernooij
Use _get_config_store in Remote*Stack |
4055 |
cstore = bzrdir._get_config_store() |
6270.1.20
by Jelmer Vernooij
Revert RemoteBranchStack / RemoteControlStack changes. |
4056 |
super(RemoteControlStack, self).__init__( |
6362.3.1
by Vincent Ladeuil
Config doc refresh, clarifying the sections used in the implemented stacks. |
4057 |
[NameMatcher(cstore, None).get_sections], |
6270.1.20
by Jelmer Vernooij
Revert RemoteBranchStack / RemoteControlStack changes. |
4058 |
cstore) |
4059 |
self.bzrdir = bzrdir |
|
4060 |
||
4061 |
||
6404.6.1
by Vincent Ladeuil
Tests passing for a first rough version of a cached branch config store. The changes here are too invasive and several parallel proposals have been made. |
4062 |
class BranchOnlyStack(Stack): |
6379.11.1
by Vincent Ladeuil
Migrate location options to config stacks. |
4063 |
"""Branch-only options stack."""
|
6270.1.20
by Jelmer Vernooij
Revert RemoteBranchStack / RemoteControlStack changes. |
4064 |
|
6379.11.1
by Vincent Ladeuil
Migrate location options to config stacks. |
4065 |
# FIXME: _BranchOnlyStack only uses branch.conf and is used only for the
|
4066 |
# stacked_on_location options waiting for http://pad.lv/832042 to be fixed.
|
|
4067 |
# -- vila 2011-12-16
|
|
6270.1.23
by Jelmer Vernooij
Add notes about Remote{Control,Branch}Store. |
4068 |
|
6270.1.20
by Jelmer Vernooij
Revert RemoteBranchStack / RemoteControlStack changes. |
4069 |
def __init__(self, branch): |
6270.1.21
by Jelmer Vernooij
Use _get_config_store in Remote*Stack |
4070 |
bstore = branch._get_config_store() |
6379.11.2
by Vincent Ladeuil
No matter how weird BranchOnlyStack is, it's public, the FIXMEs should be enough for devs to notice. |
4071 |
super(BranchOnlyStack, self).__init__( |
6362.3.1
by Vincent Ladeuil
Config doc refresh, clarifying the sections used in the implemented stacks. |
4072 |
[NameMatcher(bstore, None).get_sections], |
6270.1.20
by Jelmer Vernooij
Revert RemoteBranchStack / RemoteControlStack changes. |
4073 |
bstore) |
4074 |
self.branch = branch |
|
4075 |
||
6404.6.7
by Vincent Ladeuil
Change set/remove to require a lock for the branch config files. |
4076 |
def lock_write(self, token=None): |
4077 |
return self.branch.lock_write(token) |
|
4078 |
||
4079 |
def unlock(self): |
|
4080 |
return self.branch.unlock() |
|
4081 |
||
4082 |
@needs_write_lock
|
|
4083 |
def set(self, name, value): |
|
4084 |
super(BranchOnlyStack, self).set(name, value) |
|
4085 |
# Force a write to persistent storage
|
|
4086 |
self.store.save_changes() |
|
4087 |
||
4088 |
@needs_write_lock
|
|
4089 |
def remove(self, name): |
|
4090 |
super(BranchOnlyStack, self).remove(name) |
|
4091 |
# Force a write to persistent storage
|
|
4092 |
self.store.save_changes() |
|
4093 |
||
6379.11.1
by Vincent Ladeuil
Migrate location options to config stacks. |
4094 |
|
5447.4.2
by Vincent Ladeuil
Implement the 'brz config' command. Read-only. |
4095 |
class cmd_config(commands.Command): |
5447.4.19
by Vincent Ladeuil
Add some more documentation. |
4096 |
__doc__ = """Display, set or remove a configuration option. |
4097 |
||
6561.1.1
by Vincent Ladeuil
Clarify option references expansion for `bzr config`. |
4098 |
Display the active value for option NAME.
|
5506.2.3
by Vincent Ladeuil
Take review comments into account and drive-by fix bug #670251 |
4099 |
|
4100 |
If --all is specified, NAME is interpreted as a regular expression and all
|
|
6561.1.1
by Vincent Ladeuil
Clarify option references expansion for `bzr config`. |
4101 |
matching options are displayed mentioning their scope and without resolving
|
4102 |
option references in the value). The active value that bzr will take into
|
|
4103 |
account is the first one displayed for each option.
|
|
4104 |
||
4105 |
If NAME is not given, --all .* is implied (all options are displayed for the
|
|
4106 |
current scope).
|
|
4107 |
||
4108 |
Setting a value is achieved by using NAME=value without spaces. The value
|
|
5447.4.19
by Vincent Ladeuil
Add some more documentation. |
4109 |
is set in the most relevant scope and can be checked by displaying the
|
4110 |
option again.
|
|
6561.1.1
by Vincent Ladeuil
Clarify option references expansion for `bzr config`. |
4111 |
|
4112 |
Removing a value is achieved by using --remove NAME.
|
|
5447.4.2
by Vincent Ladeuil
Implement the 'brz config' command. Read-only. |
4113 |
"""
|
4114 |
||
5506.2.3
by Vincent Ladeuil
Take review comments into account and drive-by fix bug #670251 |
4115 |
takes_args = ['name?'] |
5447.4.2
by Vincent Ladeuil
Implement the 'brz config' command. Read-only. |
4116 |
|
4117 |
takes_options = [ |
|
4118 |
'directory', |
|
5447.4.5
by Vincent Ladeuil
Implement ``bzr config option=value``. |
4119 |
# FIXME: This should be a registry option so that plugins can register
|
6260.3.1
by Vincent Ladeuil
Switch ``bzr config`` to the new config implementation |
4120 |
# their own config files (or not) and will also address
|
4121 |
# http://pad.lv/788991 -- vila 20101115
|
|
5447.4.17
by Vincent Ladeuil
Rename config --force to config --scope. |
4122 |
commands.Option('scope', help='Reduce the scope to the specified' |
6259.2.5
by Martin Packman
Add full stops to various option help text so test_option_grammar passes |
4123 |
' configuration file.', |
5447.4.17
by Vincent Ladeuil
Rename config --force to config --scope. |
4124 |
type=unicode), |
5506.2.3
by Vincent Ladeuil
Take review comments into account and drive-by fix bug #670251 |
4125 |
commands.Option('all', |
4126 |
help='Display all the defined values for the matching options.', |
|
5506.2.1
by Vincent Ladeuil
Implements ``bzr config --active option`` displaying only the value. |
4127 |
),
|
5447.4.8
by Vincent Ladeuil
Make the test properly fail and provide a fake implementation for ``bzr config --remove opt_name``. |
4128 |
commands.Option('remove', help='Remove the option from' |
6259.2.5
by Martin Packman
Add full stops to various option help text so test_option_grammar passes |
4129 |
' the configuration file.'), |
5447.4.2
by Vincent Ladeuil
Implement the 'brz config' command. Read-only. |
4130 |
]
|
4131 |
||
5425.4.24
by Martin Pool
Mention 'configuration' help topic from 'bzr help config' |
4132 |
_see_also = ['configuration'] |
4133 |
||
5447.4.2
by Vincent Ladeuil
Implement the 'brz config' command. Read-only. |
4134 |
@commands.display_command |
5506.2.3
by Vincent Ladeuil
Take review comments into account and drive-by fix bug #670251 |
4135 |
def run(self, name=None, all=False, directory=None, scope=None, |
4136 |
remove=False): |
|
5447.4.5
by Vincent Ladeuil
Implement ``bzr config option=value``. |
4137 |
if directory is None: |
4138 |
directory = '.' |
|
6437.66.1
by Wouter van Heyst
Dereference directory services in cmd_config. |
4139 |
directory = directory_service.directories.dereference(directory) |
5447.4.5
by Vincent Ladeuil
Implement ``bzr config option=value``. |
4140 |
directory = urlutils.normalize_url(directory) |
5506.2.3
by Vincent Ladeuil
Take review comments into account and drive-by fix bug #670251 |
4141 |
if remove and all: |
5506.2.1
by Vincent Ladeuil
Implements ``bzr config --active option`` displaying only the value. |
4142 |
raise errors.BzrError( |
5506.2.3
by Vincent Ladeuil
Take review comments into account and drive-by fix bug #670251 |
4143 |
'--all and --remove are mutually exclusive.') |
5506.2.1
by Vincent Ladeuil
Implements ``bzr config --active option`` displaying only the value. |
4144 |
elif remove: |
4145 |
# Delete the option in the given scope
|
|
5506.2.3
by Vincent Ladeuil
Take review comments into account and drive-by fix bug #670251 |
4146 |
self._remove_config_option(name, directory, scope) |
4147 |
elif name is None: |
|
4148 |
# Defaults to all options
|
|
4149 |
self._show_matching_options('.*', directory, scope) |
|
5447.4.5
by Vincent Ladeuil
Implement ``bzr config option=value``. |
4150 |
else: |
5506.2.1
by Vincent Ladeuil
Implements ``bzr config --active option`` displaying only the value. |
4151 |
try: |
5506.2.3
by Vincent Ladeuil
Take review comments into account and drive-by fix bug #670251 |
4152 |
name, value = name.split('=', 1) |
5506.2.1
by Vincent Ladeuil
Implements ``bzr config --active option`` displaying only the value. |
4153 |
except ValueError: |
4154 |
# Display the option(s) value(s)
|
|
5506.2.3
by Vincent Ladeuil
Take review comments into account and drive-by fix bug #670251 |
4155 |
if all: |
4156 |
self._show_matching_options(name, directory, scope) |
|
4157 |
else: |
|
4158 |
self._show_value(name, directory, scope) |
|
5447.4.5
by Vincent Ladeuil
Implement ``bzr config option=value``. |
4159 |
else: |
5506.2.3
by Vincent Ladeuil
Take review comments into account and drive-by fix bug #670251 |
4160 |
if all: |
4161 |
raise errors.BzrError( |
|
4162 |
'Only one option can be set.') |
|
5506.2.1
by Vincent Ladeuil
Implements ``bzr config --active option`` displaying only the value. |
4163 |
# Set the option value
|
4164 |
self._set_config_option(name, value, directory, scope) |
|
5447.4.5
by Vincent Ladeuil
Implement ``bzr config option=value``. |
4165 |
|
6404.6.1
by Vincent Ladeuil
Tests passing for a first rough version of a cached branch config store. The changes here are too invasive and several parallel proposals have been made. |
4166 |
def _get_stack(self, directory, scope=None, write_access=False): |
6260.3.1
by Vincent Ladeuil
Switch ``bzr config`` to the new config implementation |
4167 |
"""Get the configuration stack specified by ``directory`` and ``scope``.
|
5447.4.9
by Vincent Ladeuil
Refactor under tests umbrella. |
4168 |
|
4169 |
:param directory: Where the configurations are derived from.
|
|
4170 |
||
5447.4.17
by Vincent Ladeuil
Rename config --force to config --scope. |
4171 |
:param scope: A specific config to start from.
|
6404.6.1
by Vincent Ladeuil
Tests passing for a first rough version of a cached branch config store. The changes here are too invasive and several parallel proposals have been made. |
4172 |
|
4173 |
:param write_access: Whether a write access to the stack will be
|
|
4174 |
attempted.
|
|
5447.4.9
by Vincent Ladeuil
Refactor under tests umbrella. |
4175 |
"""
|
6260.3.1
by Vincent Ladeuil
Switch ``bzr config`` to the new config implementation |
4176 |
# FIXME: scope should allow access to plugin-specific stacks (even
|
4177 |
# reduced to the plugin-specific store), related to
|
|
4178 |
# http://pad.lv/788991 -- vila 2011-11-15
|
|
5447.4.17
by Vincent Ladeuil
Rename config --force to config --scope. |
4179 |
if scope is not None: |
4180 |
if scope == 'bazaar': |
|
6260.3.1
by Vincent Ladeuil
Switch ``bzr config`` to the new config implementation |
4181 |
return GlobalStack() |
5447.4.17
by Vincent Ladeuil
Rename config --force to config --scope. |
4182 |
elif scope == 'locations': |
6260.3.1
by Vincent Ladeuil
Switch ``bzr config`` to the new config implementation |
4183 |
return LocationStack(directory) |
5447.4.17
by Vincent Ladeuil
Rename config --force to config --scope. |
4184 |
elif scope == 'branch': |
6207.3.3
by jelmer at samba
Fix tests and the like. |
4185 |
(_, br, _) = ( |
4186 |
controldir.ControlDir.open_containing_tree_or_branch( |
|
4187 |
directory)) |
|
6404.6.1
by Vincent Ladeuil
Tests passing for a first rough version of a cached branch config store. The changes here are too invasive and several parallel proposals have been made. |
4188 |
if write_access: |
4189 |
self.add_cleanup(br.lock_write().unlock) |
|
6260.3.1
by Vincent Ladeuil
Switch ``bzr config`` to the new config implementation |
4190 |
return br.get_config_stack() |
4191 |
raise errors.NoSuchConfig(scope) |
|
5447.4.9
by Vincent Ladeuil
Refactor under tests umbrella. |
4192 |
else: |
4193 |
try: |
|
6207.3.3
by jelmer at samba
Fix tests and the like. |
4194 |
(_, br, _) = ( |
4195 |
controldir.ControlDir.open_containing_tree_or_branch( |
|
4196 |
directory)) |
|
6404.6.1
by Vincent Ladeuil
Tests passing for a first rough version of a cached branch config store. The changes here are too invasive and several parallel proposals have been made. |
4197 |
if write_access: |
4198 |
self.add_cleanup(br.lock_write().unlock) |
|
6260.3.1
by Vincent Ladeuil
Switch ``bzr config`` to the new config implementation |
4199 |
return br.get_config_stack() |
5447.4.9
by Vincent Ladeuil
Refactor under tests umbrella. |
4200 |
except errors.NotBranchError: |
6260.3.1
by Vincent Ladeuil
Switch ``bzr config`` to the new config implementation |
4201 |
return LocationStack(directory) |
5447.4.9
by Vincent Ladeuil
Refactor under tests umbrella. |
4202 |
|
6466.1.1
by Vincent Ladeuil
Fix RegistryOption display in bzr config output |
4203 |
def _quote_multiline(self, value): |
4204 |
if '\n' in value: |
|
4205 |
value = '"""' + value + '"""' |
|
4206 |
return value |
|
4207 |
||
5506.2.3
by Vincent Ladeuil
Take review comments into account and drive-by fix bug #670251 |
4208 |
def _show_value(self, name, directory, scope): |
6260.3.1
by Vincent Ladeuil
Switch ``bzr config`` to the new config implementation |
4209 |
conf = self._get_stack(directory, scope) |
6466.1.1
by Vincent Ladeuil
Fix RegistryOption display in bzr config output |
4210 |
value = conf.get(name, expand=True, convert=False) |
6260.3.1
by Vincent Ladeuil
Switch ``bzr config`` to the new config implementation |
4211 |
if value is not None: |
4212 |
# Quote the value appropriately
|
|
6466.1.1
by Vincent Ladeuil
Fix RegistryOption display in bzr config output |
4213 |
value = self._quote_multiline(value) |
6260.3.1
by Vincent Ladeuil
Switch ``bzr config`` to the new config implementation |
4214 |
self.outf.write('%s\n' % (value,)) |
4215 |
else: |
|
5506.2.3
by Vincent Ladeuil
Take review comments into account and drive-by fix bug #670251 |
4216 |
raise errors.NoSuchConfigOption(name) |
4217 |
||
4218 |
def _show_matching_options(self, name, directory, scope): |
|
5967.9.3
by Martin Pool
Explicitly use lazy_regexp where we count on its error reporting behaviour |
4219 |
name = lazy_regex.lazy_compile(name) |
5506.2.3
by Vincent Ladeuil
Take review comments into account and drive-by fix bug #670251 |
4220 |
# We want any error in the regexp to be raised *now* so we need to
|
5967.9.3
by Martin Pool
Explicitly use lazy_regexp where we count on its error reporting behaviour |
4221 |
# avoid the delay introduced by the lazy regexp. But, we still do
|
4222 |
# want the nicer errors raised by lazy_regex.
|
|
4223 |
name._compile_and_collapse() |
|
6260.3.1
by Vincent Ladeuil
Switch ``bzr config`` to the new config implementation |
4224 |
cur_store_id = None |
5533.1.1
by Vincent Ladeuil
Fix ``bzr config`` to respect policies when displaying values and also display sections when appropriate. |
4225 |
cur_section = None |
6260.3.1
by Vincent Ladeuil
Switch ``bzr config`` to the new config implementation |
4226 |
conf = self._get_stack(directory, scope) |
6466.1.1
by Vincent Ladeuil
Fix RegistryOption display in bzr config output |
4227 |
for store, section in conf.iter_sections(): |
4228 |
for oname in section.iter_option_names(): |
|
4229 |
if name.search(oname): |
|
4230 |
if cur_store_id != store.id: |
|
4231 |
# Explain where the options are defined
|
|
4232 |
self.outf.write('%s:\n' % (store.id,)) |
|
4233 |
cur_store_id = store.id |
|
4234 |
cur_section = None |
|
4235 |
if (section.id is not None and cur_section != section.id): |
|
4236 |
# Display the section id as it appears in the store
|
|
4237 |
# (None doesn't appear by definition)
|
|
4238 |
self.outf.write(' [%s]\n' % (section.id,)) |
|
4239 |
cur_section = section.id |
|
4240 |
value = section.get(oname, expand=False) |
|
4241 |
# Quote the value appropriately
|
|
4242 |
value = self._quote_multiline(value) |
|
4243 |
self.outf.write(' %s = %s\n' % (oname, value)) |
|
5447.4.2
by Vincent Ladeuil
Implement the 'brz config' command. Read-only. |
4244 |
|
5447.4.17
by Vincent Ladeuil
Rename config --force to config --scope. |
4245 |
def _set_config_option(self, name, value, directory, scope): |
6404.6.1
by Vincent Ladeuil
Tests passing for a first rough version of a cached branch config store. The changes here are too invasive and several parallel proposals have been made. |
4246 |
conf = self._get_stack(directory, scope, write_access=True) |
6260.3.1
by Vincent Ladeuil
Switch ``bzr config`` to the new config implementation |
4247 |
conf.set(name, value) |
6597.1.1
by Vincent Ladeuil
Bzr config should save the changes explicitly when needed |
4248 |
# Explicitly save the changes
|
4249 |
conf.store.save_changes() |
|
5447.4.5
by Vincent Ladeuil
Implement ``bzr config option=value``. |
4250 |
|
5447.4.17
by Vincent Ladeuil
Rename config --force to config --scope. |
4251 |
def _remove_config_option(self, name, directory, scope): |
5506.2.1
by Vincent Ladeuil
Implements ``bzr config --active option`` displaying only the value. |
4252 |
if name is None: |
4253 |
raise errors.BzrCommandError( |
|
4254 |
'--remove expects an option to remove.') |
|
6404.6.1
by Vincent Ladeuil
Tests passing for a first rough version of a cached branch config store. The changes here are too invasive and several parallel proposals have been made. |
4255 |
conf = self._get_stack(directory, scope, write_access=True) |
6260.3.1
by Vincent Ladeuil
Switch ``bzr config`` to the new config implementation |
4256 |
try: |
4257 |
conf.remove(name) |
|
6597.1.1
by Vincent Ladeuil
Bzr config should save the changes explicitly when needed |
4258 |
# Explicitly save the changes
|
4259 |
conf.store.save_changes() |
|
6260.3.1
by Vincent Ladeuil
Switch ``bzr config`` to the new config implementation |
4260 |
except KeyError: |
5447.4.11
by Vincent Ladeuil
Implement ``bzr config --remove <option>``. |
4261 |
raise errors.NoSuchConfigOption(name) |
5743.6.27
by Vincent Ladeuil
Move the test registries to bzrlib.config so plugins will be able to use |
4262 |
|
6260.3.1
by Vincent Ladeuil
Switch ``bzr config`` to the new config implementation |
4263 |
|
5743.6.27
by Vincent Ladeuil
Move the test registries to bzrlib.config so plugins will be able to use |
4264 |
# Test registries
|
5743.6.29
by Vincent Ladeuil
For jam. |
4265 |
#
|
5743.6.27
by Vincent Ladeuil
Move the test registries to bzrlib.config so plugins will be able to use |
4266 |
# We need adapters that can build a Store or a Stack in a test context. Test
|
4267 |
# classes, based on TestCaseWithTransport, can use the registry to parametrize
|
|
4268 |
# themselves. The builder will receive a test instance and should return a
|
|
5743.6.29
by Vincent Ladeuil
For jam. |
4269 |
# ready-to-use store or stack. Plugins that define new store/stacks can also
|
5743.6.27
by Vincent Ladeuil
Move the test registries to bzrlib.config so plugins will be able to use |
4270 |
# register themselves here to be tested against the tests defined in
|
5743.11.1
by Vincent Ladeuil
Add a note about config store builders being called several times by some tests. |
4271 |
# bzrlib.tests.test_config. Note that the builder can be called multiple times
|
6325.1.1
by Vincent Ladeuil
Fix various typos |
4272 |
# for the same test.
|
5743.6.27
by Vincent Ladeuil
Move the test registries to bzrlib.config so plugins will be able to use |
4273 |
|
4274 |
# The registered object should be a callable receiving a test instance
|
|
4275 |
# parameter (inheriting from tests.TestCaseWithTransport) and returning a Store
|
|
4276 |
# object.
|
|
4277 |
test_store_builder_registry = registry.Registry() |
|
4278 |
||
5743.10.1
by Vincent Ladeuil
Derefence the ref to use it. |
4279 |
# The registered object should be a callable receiving a test instance
|
5743.6.27
by Vincent Ladeuil
Move the test registries to bzrlib.config so plugins will be able to use |
4280 |
# parameter (inheriting from tests.TestCaseWithTransport) and returning a Stack
|
4281 |
# object.
|
|
4282 |
test_stack_builder_registry = registry.Registry() |