/brz/remove-bazaar

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