/brz/remove-bazaar

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