/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
1442.1.20 by Robert Collins
add some documentation on options
32
1770.2.2 by Aaron Bentley
Rename branches.conf to locations.conf
33
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
34
Wildcards may be used - * and ? as normal in shell completion. Options
1770.2.2 by Aaron Bentley
Rename branches.conf to locations.conf
35
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
36
setting.
37
[/home/robertc/source]
38
recurse=False|True(default)
39
email= as above
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
40
check_signatures= as above
1442.1.20 by Robert Collins
add some documentation on options
41
create_signatures= as above.
42
43
explanation of options
44
----------------------
45
editor - this option sets the pop up editor to use during commits.
46
email - this option sets the user id bzr will use when committing.
47
check_signatures - this option controls whether bzr will require good gpg
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
48
                   signatures, ignore them, or check them if they are
1442.1.20 by Robert Collins
add some documentation on options
49
                   present.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
50
create_signatures - this option controls whether bzr will always create
1442.1.20 by Robert Collins
add some documentation on options
51
                    gpg signatures, never create them, or create them if the
52
                    branch is configured to require them.
1887.2.1 by Adeodato Simó
Fix some typos and grammar issues.
53
log_format - this option sets the default log format.  Possible values are
54
             long, short, line, or a plugin can register new formats.
1553.6.2 by Erik Bågfors
documentation and NEWS
55
56
In bazaar.conf you can also define aliases in the ALIASES sections, example
57
58
[ALIASES]
59
lastlog=log --line -r-10..-1
60
ll=log --line -r-10..-1
61
h=help
62
up=pull
1442.1.20 by Robert Collins
add some documentation on options
63
"""
1442.1.1 by Robert Collins
move config_dir into bzrlib.config
64
1996.3.31 by John Arbash Meinel
Make bzrlib.config use lazy importing
65
import os
5050.72.1 by Martin Pool
Set email address from /etc/mailname if possible
66
import string
1996.3.31 by John Arbash Meinel
Make bzrlib.config use lazy importing
67
import sys
1474 by Robert Collins
Merge from Aaron Bentley.
68
5447.4.2 by Vincent Ladeuil
Implement the 'brz config' command. Read-only.
69
from bzrlib import commands
5345.5.4 by Vincent Ladeuil
Start implementing config files locking.
70
from bzrlib.decorators import needs_write_lock
1996.3.31 by John Arbash Meinel
Make bzrlib.config use lazy importing
71
from bzrlib.lazy_import import lazy_import
72
lazy_import(globals(), """
5447.4.1 by Vincent Ladeuil
Implement config.get_options_matching_regexp.
73
import fnmatch
1770.2.1 by Aaron Bentley
Use create_signature for signing policy, deprecate check_signatures for this
74
import re
2900.2.22 by Vincent Ladeuil
Polishing.
75
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.
76
77
import bzrlib
1996.3.31 by John Arbash Meinel
Make bzrlib.config use lazy importing
78
from bzrlib import (
4797.59.2 by Vincent Ladeuil
Use AtomicFile and avoid all unicode/encoding issues around transport (thanks jam).
79
    atomicfile,
5447.4.2 by Vincent Ladeuil
Implement the 'brz config' command. Read-only.
80
    bzrdir,
2900.2.10 by Vincent Ladeuil
Add -Dauth handling.
81
    debug,
1996.3.31 by John Arbash Meinel
Make bzrlib.config use lazy importing
82
    errors,
5345.5.4 by Vincent Ladeuil
Start implementing config files locking.
83
    lockdir,
2681.1.8 by Aaron Bentley
Add Thunderbird support to bzr send
84
    mail_client,
5321.1.88 by Gordon Tyler
Moved mergetools config functions into bzrlib.config.Config.
85
    mergetools,
1996.3.31 by John Arbash Meinel
Make bzrlib.config use lazy importing
86
    osutils,
2120.6.9 by James Henstridge
Fixes for issues brought up in John's review
87
    symbol_versioning,
1551.15.35 by Aaron Bentley
Warn when setting config values that will be masked (#122286)
88
    trace,
5345.5.4 by Vincent Ladeuil
Start implementing config files locking.
89
    transport,
2900.2.12 by Vincent Ladeuil
Since all schemes query AuthenticationConfig then prompt user, make that
90
    ui,
1996.3.31 by John Arbash Meinel
Make bzrlib.config use lazy importing
91
    urlutils,
2245.4.3 by Alexander Belchenko
config.py: changing _auto_user_id() and config_dir() to use functions from win32utils
92
    win32utils,
1996.3.31 by John Arbash Meinel
Make bzrlib.config use lazy importing
93
    )
2991.2.4 by Vincent Ladeuil
Various fixes following local testing environment rebuild.
94
from bzrlib.util.configobj import configobj
1996.3.31 by John Arbash Meinel
Make bzrlib.config use lazy importing
95
""")
5904.1.2 by Martin Pool
Various pyflakes import fixes.
96
from bzrlib import (
97
    registry,
98
    )
1996.3.31 by John Arbash Meinel
Make bzrlib.config use lazy importing
99
1442.1.6 by Robert Collins
first stage major overhaul of configs, giving use BranchConfigs, LocationConfigs and GlobalConfigs
100
1442.1.14 by Robert Collins
Create a default signature checking policy of CHECK_IF_POSSIBLE
101
CHECK_IF_POSSIBLE=0
102
CHECK_ALWAYS=1
103
CHECK_NEVER=2
104
105
1770.2.1 by Aaron Bentley
Use create_signature for signing policy, deprecate check_signatures for this
106
SIGN_WHEN_REQUIRED=0
107
SIGN_ALWAYS=1
108
SIGN_NEVER=2
109
110
2120.6.1 by James Henstridge
add support for norecurse and appendpath policies when reading configuration files
111
POLICY_NONE = 0
112
POLICY_NORECURSE = 1
113
POLICY_APPENDPATH = 2
114
2120.6.8 by James Henstridge
Change syntax for setting config option policies. Rather than
115
_policy_name = {
116
    POLICY_NONE: None,
117
    POLICY_NORECURSE: 'norecurse',
118
    POLICY_APPENDPATH: 'appendpath',
119
    }
120
_policy_value = {
121
    None: POLICY_NONE,
122
    'none': POLICY_NONE,
123
    'norecurse': POLICY_NORECURSE,
124
    'appendpath': POLICY_APPENDPATH,
125
    }
2120.6.4 by James Henstridge
add support for specifying policy when storing options
126
127
128
STORE_LOCATION = POLICY_NONE
129
STORE_LOCATION_NORECURSE = POLICY_NORECURSE
130
STORE_LOCATION_APPENDPATH = POLICY_APPENDPATH
131
STORE_BRANCH = 3
132
STORE_GLOBAL = 4
133
5676.1.4 by Jelmer Vernooij
merge bzr.dev.
134
135
class ConfigObj(configobj.ConfigObj):
136
137
    def __init__(self, infile=None, **kwargs):
138
        # We define our own interpolation mechanism calling it option expansion
139
        super(ConfigObj, self).__init__(infile=infile,
140
                                        interpolation=False,
141
                                        **kwargs)
142
143
144
    def get_bool(self, section, key):
145
        return self[section].as_bool(key)
146
147
    def get_value(self, section, name):
148
        # Try [] for the old DEFAULT section.
149
        if section == "DEFAULT":
150
            try:
151
                return self[name]
152
            except KeyError:
153
                pass
154
        return self[section][name]
155
156
157
# FIXME: Until we can guarantee that each config file is loaded once and and
158
# only once for a given bzrlib session, we don't want to re-read the file every
159
# time we query for an option so we cache the value (bad ! watch out for tests
160
# needing to restore the proper value).This shouldn't be part of 2.4.0 final,
161
# yell at mgz^W vila and the RM if this is still present at that time
162
# -- vila 20110219
163
_expand_default_value = None
164
def _get_expand_default_value():
165
    global _expand_default_value
166
    if _expand_default_value is not None:
167
        return _expand_default_value
168
    conf = GlobalConfig()
169
    # Note that we must not use None for the expand value below or we'll run
170
    # into infinite recursion. Using False really would be quite silly ;)
171
    expand = conf.get_user_option_as_bool('bzr.config.expand', expand=True)
172
    if expand is None:
173
        # This is an opt-in feature, you *really* need to clearly say you want
174
        # to activate it !
175
        expand = False
176
    _expand_default_value = expand
177
    return expand
5549.1.31 by Vincent Ladeuil
Implement a default value for config option expansion (what ? No tests ?).
178
5549.1.19 by Vincent Ladeuil
Push down interpolation at the config level (make tests slightly less
179
180
class Config(object):
181
    """A configuration policy - what username, editor, gpg needs etc."""
182
183
    def __init__(self):
184
        super(Config, self).__init__()
185
186
    def config_id(self):
187
        """Returns a unique ID for the config."""
188
        raise NotImplementedError(self.config_id)
189
190
    def get_editor(self):
191
        """Get the users pop up editor."""
192
        raise NotImplementedError
193
194
    def get_change_editor(self, old_tree, new_tree):
195
        from bzrlib import diff
196
        cmd = self._get_change_editor()
197
        if cmd is None:
198
            return None
199
        return diff.DiffFromTool.from_string(cmd, old_tree, new_tree,
200
                                             sys.stdout)
201
202
203
    def get_mail_client(self):
204
        """Get a mail client to use"""
205
        selected_client = self.get_user_option('mail_client')
206
        _registry = mail_client.mail_client_registry
207
        try:
208
            mail_client_class = _registry.get(selected_client)
209
        except KeyError:
210
            raise errors.UnknownMailClient(selected_client)
211
        return mail_client_class(self)
212
213
    def _get_signature_checking(self):
214
        """Template method to override signature checking policy."""
215
216
    def _get_signing_policy(self):
217
        """Template method to override signature creation policy."""
218
5676.1.4 by Jelmer Vernooij
merge bzr.dev.
219
    option_ref_re = None
220
221
    def expand_options(self, string, env=None):
222
        """Expand option references in the string in the configuration context.
223
224
        :param string: The string containing option to expand.
225
226
        :param env: An option dict defining additional configuration options or
227
            overriding existing ones.
228
229
        :returns: The expanded string.
230
        """
231
        return self._expand_options_in_string(string, env)
232
233
    def _expand_options_in_list(self, slist, env=None, _ref_stack=None):
234
        """Expand options in  a list of strings in the configuration context.
235
236
        :param slist: A list of strings.
237
238
        :param env: An option dict defining additional configuration options or
239
            overriding existing ones.
240
241
        :param _ref_stack: Private list containing the options being
242
            expanded to detect loops.
243
244
        :returns: The flatten list of expanded strings.
245
        """
246
        # expand options in each value separately flattening lists
247
        result = []
248
        for s in slist:
249
            value = self._expand_options_in_string(s, env, _ref_stack)
250
            if isinstance(value, list):
251
                result.extend(value)
252
            else:
253
                result.append(value)
254
        return result
255
256
    def _expand_options_in_string(self, string, env=None, _ref_stack=None):
257
        """Expand options in the string in the configuration context.
258
259
        :param string: The string to be expanded.
260
261
        :param env: An option dict defining additional configuration options or
262
            overriding existing ones.
263
264
        :param _ref_stack: Private list containing the options being
265
            expanded to detect loops.
266
267
        :returns: The expanded string.
268
        """
269
        if string is None:
270
            # Not much to expand there
271
            return None
272
        if _ref_stack is None:
273
            # What references are currently resolved (to detect loops)
274
            _ref_stack = []
275
        if self.option_ref_re is None:
276
            # We want to match the most embedded reference first (i.e. for
277
            # '{{foo}}' we will get '{foo}',
278
            # for '{bar{baz}}' we will get '{baz}'
279
            self.option_ref_re = re.compile('({[^{}]+})')
280
        result = string
281
        # We need to iterate until no more refs appear ({{foo}} will need two
282
        # iterations for example).
283
        while True:
5745.1.1 by Vincent Ladeuil
Remove debug code
284
            raw_chunks = self.option_ref_re.split(result)
5676.1.4 by Jelmer Vernooij
merge bzr.dev.
285
            if len(raw_chunks) == 1:
286
                # Shorcut the trivial case: no refs
287
                return result
288
            chunks = []
289
            list_value = False
290
            # Split will isolate refs so that every other chunk is a ref
291
            chunk_is_ref = False
292
            for chunk in raw_chunks:
293
                if not chunk_is_ref:
294
                    if chunk:
295
                        # Keep only non-empty strings (or we get bogus empty
296
                        # slots when a list value is involved).
297
                        chunks.append(chunk)
298
                    chunk_is_ref = True
299
                else:
300
                    name = chunk[1:-1]
301
                    if name in _ref_stack:
302
                        raise errors.OptionExpansionLoop(string, _ref_stack)
303
                    _ref_stack.append(name)
304
                    value = self._expand_option(name, env, _ref_stack)
305
                    if value is None:
306
                        raise errors.ExpandingUnknownOption(name, string)
307
                    if isinstance(value, list):
308
                        list_value = True
309
                        chunks.extend(value)
310
                    else:
311
                        chunks.append(value)
312
                    _ref_stack.pop()
313
                    chunk_is_ref = False
314
            if list_value:
315
                # Once a list appears as the result of an expansion, all
316
                # callers will get a list result. This allows a consistent
317
                # behavior even when some options in the expansion chain
318
                # defined as strings (no comma in their value) but their
319
                # expanded value is a list.
320
                return self._expand_options_in_list(chunks, env, _ref_stack)
321
            else:
322
                result = ''.join(chunks)
323
        return result
324
325
    def _expand_option(self, name, env, _ref_stack):
326
        if env is not None and name in env:
327
            # Special case, values provided in env takes precedence over
328
            # anything else
329
            value = env[name]
330
        else:
331
            # FIXME: This is a limited implementation, what we really need is a
332
            # way to query the bzr config for the value of an option,
333
            # respecting the scope rules (That is, once we implement fallback
334
            # configs, getting the option value should restart from the top
335
            # config, not the current one) -- vila 20101222
336
            value = self.get_user_option(name, expand=False)
337
            if isinstance(value, list):
338
                value = self._expand_options_in_list(value, env, _ref_stack)
339
            else:
340
                value = self._expand_options_in_string(value, env, _ref_stack)
341
        return value
342
1993.3.6 by James Henstridge
get rid of the recurse argument to get_user_option()
343
    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.
344
        """Template method to provide a user option."""
345
        return None
346
5676.1.4 by Jelmer Vernooij
merge bzr.dev.
347
    def get_user_option(self, option_name, expand=None):
348
        """Get a generic option - no special process, no default.
349
350
        :param option_name: The queried option.
351
352
        :param expand: Whether options references should be expanded.
353
354
        :returns: The value of the option.
355
        """
356
        if expand is None:
357
            expand = _get_expand_default_value()
358
        value = self._get_user_option(option_name)
359
        if expand:
360
            if isinstance(value, list):
361
                value = self._expand_options_in_list(value)
362
            elif isinstance(value, dict):
363
                trace.warning('Cannot expand "%s":'
364
                              ' Dicts do not support option expansion'
365
                              % (option_name,))
366
            else:
367
                value = self._expand_options_in_string(value)
368
        return value
369
370
    def get_user_option_as_bool(self, option_name, expand=None):
4503.2.2 by Vincent Ladeuil
Get a bool or none from a config file.
371
        """Get a generic option as a boolean - no special process, no default.
372
373
        :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.
374
            interpreted as a boolean. Returns True or False otherwise.
4503.2.2 by Vincent Ladeuil
Get a bool or none from a config file.
375
        """
5676.1.4 by Jelmer Vernooij
merge bzr.dev.
376
        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.
377
        if s is None:
378
            # The option doesn't exist
379
            return None
4989.2.15 by Vincent Ladeuil
Fixed as per Andrew's review.
380
        val = ui.bool_from_string(s)
4989.2.12 by Vincent Ladeuil
Display a warning if an option value is not boolean.
381
        if val is None:
382
            # The value can't be interpreted as a boolean
383
            trace.warning('Value "%s" is not a boolean for "%s"',
384
                          s, option_name)
385
        return val
4503.2.2 by Vincent Ladeuil
Get a bool or none from a config file.
386
5676.1.4 by Jelmer Vernooij
merge bzr.dev.
387
    def get_user_option_as_list(self, option_name, expand=None):
4840.2.4 by Vincent Ladeuil
Implement config.get_user_option_as_list.
388
        """Get a generic option as a list - no special process, no default.
389
390
        :return None if the option doesn't exist. Returns the value as a list
391
            otherwise.
392
        """
5676.1.4 by Jelmer Vernooij
merge bzr.dev.
393
        l = self.get_user_option(option_name, expand=expand)
4840.2.4 by Vincent Ladeuil
Implement config.get_user_option_as_list.
394
        if isinstance(l, (str, unicode)):
5676.1.4 by Jelmer Vernooij
merge bzr.dev.
395
            # A single value, most probably the user forgot (or didn't care to
396
            # add) the final ','
4840.2.4 by Vincent Ladeuil
Implement config.get_user_option_as_list.
397
            l = [l]
398
        return l
399
1442.1.56 by Robert Collins
gpg_signing_command configuration item
400
    def gpg_signing_command(self):
401
        """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.
402
        result = self._gpg_signing_command()
403
        if result is None:
404
            result = "gpg"
405
        return result
406
407
    def _gpg_signing_command(self):
408
        """See gpg_signing_command()."""
409
        return None
1442.1.56 by Robert Collins
gpg_signing_command configuration item
410
1553.2.9 by Erik Bågfors
log_formatter => log_format for "named" formatters
411
    def log_format(self):
412
        """What log format should be used"""
413
        result = self._log_format()
1553.2.4 by Erik Bågfors
Support for setting the default log format at a configuration option
414
        if result is None:
415
            result = "long"
416
        return result
417
1553.2.9 by Erik Bågfors
log_formatter => log_format for "named" formatters
418
    def _log_format(self):
419
        """See log_format()."""
1553.2.4 by Erik Bågfors
Support for setting the default log format at a configuration option
420
        return None
421
1472 by Robert Collins
post commit hook, first pass implementation
422
    def post_commit(self):
423
        """An ordered list of python functions to call.
424
425
        Each function takes branch, rev_id as parameters.
426
        """
427
        return self._post_commit()
428
429
    def _post_commit(self):
430
        """See Config.post_commit."""
431
        return None
432
1442.1.6 by Robert Collins
first stage major overhaul of configs, giving use BranchConfigs, LocationConfigs and GlobalConfigs
433
    def user_email(self):
434
        """Return just the email component of a username."""
1185.33.31 by Martin Pool
Make annotate cope better with revisions committed without a valid
435
        return extract_email_address(self.username())
1442.1.6 by Robert Collins
first stage major overhaul of configs, giving use BranchConfigs, LocationConfigs and GlobalConfigs
436
437
    def username(self):
438
        """Return email-style username.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
439
1442.1.6 by Robert Collins
first stage major overhaul of configs, giving use BranchConfigs, LocationConfigs and GlobalConfigs
440
        Something similar to 'Martin Pool <mbp@sourcefrog.net>'
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
441
5187.2.1 by Parth Malwankar
removed comment about deprecated BZREMAIL.
442
        $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
443
        the concrete policy type is checked, and finally
1185.37.2 by Jamie Wilkinson
Fix a typo and grammar in Config.username() docstring.
444
        $EMAIL is examined.
5187.2.12 by Parth Malwankar
trivial clarification in docstring.
445
        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
446
        """
1861.4.1 by Matthieu Moy
BZREMAIL renamed to BZR_EMAIL.
447
        v = os.environ.get('BZR_EMAIL')
448
        if v:
3224.5.4 by Andrew Bennetts
Fix test suite, mainly weeding out uses of bzrlib.user_encoding.
449
            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
450
        v = self._get_user_id()
451
        if v:
452
            return v
453
        v = os.environ.get('EMAIL')
454
        if v:
3224.5.4 by Andrew Bennetts
Fix test suite, mainly weeding out uses of bzrlib.user_encoding.
455
            return v.decode(osutils.get_user_encoding())
5050.72.1 by Martin Pool
Set email address from /etc/mailname if possible
456
        name, email = _auto_user_id()
457
        if name and email:
458
            return '%s <%s>' % (name, email)
459
        elif email:
460
            return email
5187.2.6 by Parth Malwankar
lockdir no long mandates whoami but uses unicode version of getuser
461
        raise errors.NoWhoami()
5187.2.3 by Parth Malwankar
init and init-repo now fail before creating dir if username is not set.
462
463
    def ensure_username(self):
5187.2.11 by Parth Malwankar
documentation updates
464
        """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.
465
466
        This method relies on the username() function raising the error.
467
        """
468
        self.username()
1442.1.6 by Robert Collins
first stage major overhaul of configs, giving use BranchConfigs, LocationConfigs and GlobalConfigs
469
1442.1.14 by Robert Collins
Create a default signature checking policy of CHECK_IF_POSSIBLE
470
    def signature_checking(self):
471
        """What is the current policy for signature checking?."""
1442.1.15 by Robert Collins
make getting the signature checking policy a template method
472
        policy = self._get_signature_checking()
473
        if policy is not None:
474
            return policy
1442.1.14 by Robert Collins
Create a default signature checking policy of CHECK_IF_POSSIBLE
475
        return CHECK_IF_POSSIBLE
1442.1.6 by Robert Collins
first stage major overhaul of configs, giving use BranchConfigs, LocationConfigs and GlobalConfigs
476
1770.2.1 by Aaron Bentley
Use create_signature for signing policy, deprecate check_signatures for this
477
    def signing_policy(self):
478
        """What is the current policy for signature checking?."""
479
        policy = self._get_signing_policy()
480
        if policy is not None:
481
            return policy
482
        return SIGN_WHEN_REQUIRED
483
1442.1.21 by Robert Collins
create signature_needed() call for commit to trigger creating signatures
484
    def signature_needed(self):
485
        """Is a signature needed when committing ?."""
1770.2.1 by Aaron Bentley
Use create_signature for signing policy, deprecate check_signatures for this
486
        policy = self._get_signing_policy()
487
        if policy is None:
488
            policy = self._get_signature_checking()
489
            if policy is not None:
2900.2.10 by Vincent Ladeuil
Add -Dauth handling.
490
                trace.warning("Please use create_signatures,"
491
                              " not check_signatures to set signing policy.")
1770.2.1 by Aaron Bentley
Use create_signature for signing policy, deprecate check_signatures for this
492
            if policy == CHECK_ALWAYS:
493
                return True
494
        elif policy == SIGN_ALWAYS:
1442.1.21 by Robert Collins
create signature_needed() call for commit to trigger creating signatures
495
            return True
496
        return False
497
1553.6.12 by Erik Bågfors
remove AliasConfig, based on input from abentley
498
    def get_alias(self, value):
499
        return self._get_alias(value)
500
501
    def _get_alias(self, value):
502
        pass
503
1770.2.7 by Aaron Bentley
Set/get nickname using BranchConfig
504
    def get_nickname(self):
505
        return self._get_nickname()
506
507
    def _get_nickname(self):
508
        return None
509
1551.18.17 by Aaron Bentley
Introduce bzr_remote_path configuration variable
510
    def get_bzr_remote_path(self):
511
        try:
512
            return os.environ['BZR_REMOTE_PATH']
513
        except KeyError:
514
            path = self.get_user_option("bzr_remote_path")
515
            if path is None:
516
                path = 'bzr'
517
            return path
518
4840.2.6 by Vincent Ladeuil
Implement config.suppress_warning.
519
    def suppress_warning(self, warning):
520
        """Should the warning be suppressed or emitted.
521
522
        :param warning: The name of the warning being tested.
523
524
        :returns: True if the warning should be suppressed, False otherwise.
525
        """
526
        warnings = self.get_user_option_as_list('suppress_warnings')
527
        if warnings is None or warning not in warnings:
528
            return False
529
        else:
530
            return True
531
5321.1.88 by Gordon Tyler
Moved mergetools config functions into bzrlib.config.Config.
532
    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.
533
        tools = {}
5321.1.99 by Gordon Tyler
Fixes for changes to Config._get_options().
534
        for (oname, value, section, conf_id, parser) in self._get_options():
5321.2.3 by Vincent Ladeuil
Prefix mergetools option names with 'bzr.'.
535
            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.
536
                tool_name = oname[len('bzr.mergetool.'):]
5321.1.116 by Gordon Tyler
Simplified mergetools module down to functions which deal with command lines -- no MergeTool class.
537
                tools[tool_name] = value
5321.1.88 by Gordon Tyler
Moved mergetools config functions into bzrlib.config.Config.
538
        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.
539
        return tools
5321.1.88 by Gordon Tyler
Moved mergetools config functions into bzrlib.config.Config.
540
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.
541
    def find_merge_tool(self, name):
5321.1.111 by Gordon Tyler
Remove predefined merge tools from list returned by get_merge_tools.
542
        # We fake a defaults mechanism here by checking if the given name can 
543
        # be found in the known_merge_tools if it's not found in the config.
544
        # This should be done through the proposed config defaults mechanism
545
        # when it becomes available in the future.
5676.1.4 by Jelmer Vernooij
merge bzr.dev.
546
        command_line = (self.get_user_option('bzr.mergetool.%s' % name,
547
                                             expand=False)
548
                        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.
549
        return command_line
5321.1.88 by Gordon Tyler
Moved mergetools config functions into bzrlib.config.Config.
550
1442.1.15 by Robert Collins
make getting the signature checking policy a template method
551
1442.1.18 by Robert Collins
permit per branch location overriding of signature checking policy
552
class IniBasedConfig(Config):
553
    """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
554
5345.1.1 by Vincent Ladeuil
Deprecate the get_filename parameter in IniBasedConfig.
555
    def __init__(self, get_filename=symbol_versioning.DEPRECATED_PARAMETER,
5345.2.8 by Vincent Ladeuil
Introduce a 'from_bytes' constructor for config objects.
556
                 file_name=None):
5345.2.5 by Vincent Ladeuil
Add docstring.
557
        """Base class for configuration files using an ini-like syntax.
558
559
        :param file_name: The configuration file path.
560
        """
4503.2.2 by Vincent Ladeuil
Get a bool or none from a config file.
561
        super(IniBasedConfig, self).__init__()
5345.1.8 by Vincent Ladeuil
Make the test_listen_to_the_last_speaker pass and fix fallouts.
562
        self.file_name = file_name
5345.1.1 by Vincent Ladeuil
Deprecate the get_filename parameter in IniBasedConfig.
563
        if symbol_versioning.deprecated_passed(get_filename):
564
            symbol_versioning.warn(
565
                'IniBasedConfig.__init__(get_filename) was deprecated in 2.3.'
566
                ' Use file_name instead.',
567
                DeprecationWarning,
568
                stacklevel=2)
5345.1.8 by Vincent Ladeuil
Make the test_listen_to_the_last_speaker pass and fix fallouts.
569
            if get_filename is not None:
5345.1.1 by Vincent Ladeuil
Deprecate the get_filename parameter in IniBasedConfig.
570
                self.file_name = get_filename()
571
        else:
572
            self.file_name = file_name
5345.2.8 by Vincent Ladeuil
Introduce a 'from_bytes' constructor for config objects.
573
        self._content = None
4503.2.2 by Vincent Ladeuil
Get a bool or none from a config file.
574
        self._parser = None
575
5345.2.8 by Vincent Ladeuil
Introduce a 'from_bytes' constructor for config objects.
576
    @classmethod
5345.1.26 by Vincent Ladeuil
Merge lockable-config-files into remove-gratuitous-ensure-config-dir-exist-calls resolving conflicts
577
    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
578
        """Create a config object from a string.
5345.2.8 by Vincent Ladeuil
Introduce a 'from_bytes' constructor for config objects.
579
5345.2.9 by Vincent Ladeuil
Rename IniBaseConfig.from_bytes to from_string.
580
        :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.
581
            be utf-8 encoded.
5345.1.25 by Vincent Ladeuil
Move the '_save' parameter from '__init__' to 'from_bytes', fix fallouts.
582
583
        :param file_name: The configuration file path.
584
585
        :param _save: Whether the file should be saved upon creation.
5345.2.8 by Vincent Ladeuil
Introduce a 'from_bytes' constructor for config objects.
586
        """
5345.1.25 by Vincent Ladeuil
Move the '_save' parameter from '__init__' to 'from_bytes', fix fallouts.
587
        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
588
        conf._create_from_string(str_or_unicode, save)
5345.2.8 by Vincent Ladeuil
Introduce a 'from_bytes' constructor for config objects.
589
        return conf
590
5345.1.26 by Vincent Ladeuil
Merge lockable-config-files into remove-gratuitous-ensure-config-dir-exist-calls resolving conflicts
591
    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
592
        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.
593
        # Some tests use in-memory configs, some other always need the config
594
        # file to exist on disk.
5345.1.25 by Vincent Ladeuil
Move the '_save' parameter from '__init__' to 'from_bytes', fix fallouts.
595
        if save:
5345.1.16 by Vincent Ladeuil
Allows tests to save the config file at build time.
596
            self._write_config_file()
5345.5.12 by Vincent Ladeuil
Fix fallouts from replacing '_content' by 'from_bytes' for config files.
597
5345.1.4 by Vincent Ladeuil
Deprecate the ``file`` parameter of the ``config._get_parser()`` method.
598
    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
599
        if self._parser is not None:
600
            return self._parser
5345.1.4 by Vincent Ladeuil
Deprecate the ``file`` parameter of the ``config._get_parser()`` method.
601
        if symbol_versioning.deprecated_passed(file):
602
            symbol_versioning.warn(
603
                '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.
604
                ' Use IniBasedConfig(_content=xxx) instead.',
5345.1.4 by Vincent Ladeuil
Deprecate the ``file`` parameter of the ``config._get_parser()`` method.
605
                DeprecationWarning,
606
                stacklevel=2)
607
        if self._content is not None:
608
            co_input = self._content
609
        elif self.file_name is None:
610
            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
611
        else:
5345.1.4 by Vincent Ladeuil
Deprecate the ``file`` parameter of the ``config._get_parser()`` method.
612
            co_input = self.file_name
1185.12.51 by Aaron Bentley
Allowed second call of _get_parser() to not require a file
613
        try:
5345.1.4 by Vincent Ladeuil
Deprecate the ``file`` parameter of the ``config._get_parser()`` method.
614
            self._parser = ConfigObj(co_input, encoding='utf-8')
1474 by Robert Collins
Merge from Aaron Bentley.
615
        except configobj.ConfigObjError, e:
1185.12.51 by Aaron Bentley
Allowed second call of _get_parser() to not require a file
616
            raise errors.ParseConfigError(e.errors, e.config.filename)
5345.5.1 by Vincent Ladeuil
Implement config.reload and make sure we have a file name when using it.
617
        # 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.
618
        self._parser.filename = self.file_name
1185.12.49 by Aaron Bentley
Switched to ConfigObj
619
        return self._parser
1442.1.6 by Robert Collins
first stage major overhaul of configs, giving use BranchConfigs, LocationConfigs and GlobalConfigs
620
5345.5.1 by Vincent Ladeuil
Implement config.reload and make sure we have a file name when using it.
621
    def reload(self):
622
        """Reload the config file from disk."""
623
        if self.file_name is None:
624
            raise AssertionError('We need a file name to reload the config')
625
        if self._parser is not None:
626
            self._parser.reload()
627
1993.3.3 by James Henstridge
make _get_matching_sections() return (section, extra_path) tuples, and adjust other code to match
628
    def _get_matching_sections(self):
629
        """Return an ordered list of (section_name, extra_path) pairs.
630
631
        If the section contains inherited configuration, extra_path is
632
        a string containing the additional path components.
633
        """
634
        section = self._get_section()
635
        if section is not None:
636
            return [(section, '')]
637
        else:
638
            return []
639
1442.1.18 by Robert Collins
permit per branch location overriding of signature checking policy
640
    def _get_section(self):
641
        """Override this to define the section used by the config."""
642
        return "DEFAULT"
643
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.
644
    def _get_sections(self, name=None):
5447.4.4 by Vincent Ladeuil
Implement config.get_sections() to clarify how sections can be used.
645
        """Returns an iterator of the sections specified by ``name``.
646
647
        :param name: The section name. If None is supplied, the default
648
            configurations are yielded.
649
5447.4.11 by Vincent Ladeuil
Implement ``bzr config --remove <option>``.
650
        :return: A tuple (name, section, config_id) for all sections that will
651
            be walked by user_get_option() in the 'right' order. The first one
652
            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.
653
        """
654
        parser = self._get_parser()
655
        if name is not None:
5447.4.16 by Vincent Ladeuil
Use config_id instead of id as suggested by poolie.
656
            yield (name, parser[name], self.config_id())
5447.4.4 by Vincent Ladeuil
Implement config.get_sections() to clarify how sections can be used.
657
        else:
658
            # No section name has been given so we fallback to the configobj
659
            # 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.
660
            yield (None, parser, self.config_id())
5447.4.4 by Vincent Ladeuil
Implement config.get_sections() to clarify how sections can be used.
661
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.
662
    def _get_options(self, sections=None):
5447.4.3 by Vincent Ladeuil
Simplify code and design by only defining get_options() where relevant.
663
        """Return an ordered list of (name, value, section, config_id) tuples.
664
665
        All options are returned with their associated value and the section
666
        they appeared in. ``config_id`` is a unique identifier for the
667
        configuration file the option is defined in.
5447.4.1 by Vincent Ladeuil
Implement config.get_options_matching_regexp.
668
669
        :param sections: Default to ``_get_matching_sections`` if not
670
            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.
671
            which sections should be searched. This is a list of (name,
672
            configobj) tuples.
5447.4.1 by Vincent Ladeuil
Implement config.get_options_matching_regexp.
673
        """
5447.4.3 by Vincent Ladeuil
Simplify code and design by only defining get_options() where relevant.
674
        opts = []
5447.4.1 by Vincent Ladeuil
Implement config.get_options_matching_regexp.
675
        if sections is None:
676
            parser = self._get_parser()
677
            sections = []
678
            for (section_name, _) in self._get_matching_sections():
679
                try:
680
                    section = parser[section_name]
681
                except KeyError:
682
                    # This could happen for an empty file for which we define a
683
                    # DEFAULT section. FIXME: Force callers to provide sections
684
                    # instead ? -- vila 20100930
685
                    continue
686
                sections.append((section_name, section))
5447.4.16 by Vincent Ladeuil
Use config_id instead of id as suggested by poolie.
687
        config_id = self.config_id()
5447.4.1 by Vincent Ladeuil
Implement config.get_options_matching_regexp.
688
        for (section_name, section) in sections:
689
            for (name, value) in section.iteritems():
5533.2.1 by Vincent Ladeuil
``bzr config`` properly displays list values
690
                yield (name, parser._quote(value), section_name,
691
                       config_id, parser)
5447.4.1 by Vincent Ladeuil
Implement config.get_options_matching_regexp.
692
2120.6.1 by James Henstridge
add support for norecurse and appendpath policies when reading configuration files
693
    def _get_option_policy(self, section, option_name):
694
        """Return the policy for the given (section, option_name) pair."""
695
        return POLICY_NONE
696
4603.1.10 by Aaron Bentley
Provide change editor via config.
697
    def _get_change_editor(self):
698
        return self.get_user_option('change_editor')
699
1442.1.16 by Robert Collins
allow global overriding of signature policy to never check
700
    def _get_signature_checking(self):
701
        """See Config._get_signature_checking."""
1474 by Robert Collins
Merge from Aaron Bentley.
702
        policy = self._get_user_option('check_signatures')
703
        if policy:
704
            return self._string_to_signature_policy(policy)
1442.1.18 by Robert Collins
permit per branch location overriding of signature checking policy
705
1770.2.1 by Aaron Bentley
Use create_signature for signing policy, deprecate check_signatures for this
706
    def _get_signing_policy(self):
1773.4.3 by Martin Pool
[merge] bzr.dev
707
        """See Config._get_signing_policy"""
1770.2.1 by Aaron Bentley
Use create_signature for signing policy, deprecate check_signatures for this
708
        policy = self._get_user_option('create_signatures')
709
        if policy:
710
            return self._string_to_signing_policy(policy)
711
1442.1.18 by Robert Collins
permit per branch location overriding of signature checking policy
712
    def _get_user_id(self):
713
        """Get the user id from the 'email' key in the current section."""
1474 by Robert Collins
Merge from Aaron Bentley.
714
        return self._get_user_option('email')
1442.1.18 by Robert Collins
permit per branch location overriding of signature checking policy
715
1993.3.6 by James Henstridge
get rid of the recurse argument to get_user_option()
716
    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.
717
        """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
718
        for (section, extra_path) in self._get_matching_sections():
719
            try:
2120.6.1 by James Henstridge
add support for norecurse and appendpath policies when reading configuration files
720
                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
721
            except KeyError:
2120.6.1 by James Henstridge
add support for norecurse and appendpath policies when reading configuration files
722
                continue
723
            policy = self._get_option_policy(section, option_name)
724
            if policy == POLICY_NONE:
725
                return value
726
            elif policy == POLICY_NORECURSE:
727
                # norecurse items only apply to the exact path
728
                if extra_path:
729
                    continue
730
                else:
731
                    return value
732
            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
733
                if extra_path:
734
                    value = urlutils.join(value, extra_path)
735
                return value
2120.6.6 by James Henstridge
fix test_set_push_location test
736
            else:
737
                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
738
        else:
1993.3.1 by James Henstridge
first go at making location config lookup recursive
739
            return None
1442.1.69 by Robert Collins
config.Config has a 'get_user_option' call that accepts an option name.
740
1442.1.59 by Robert Collins
Add re-sign command to generate a digital signature on a single revision.
741
    def _gpg_signing_command(self):
1442.1.56 by Robert Collins
gpg_signing_command configuration item
742
        """See Config.gpg_signing_command."""
1472 by Robert Collins
post commit hook, first pass implementation
743
        return self._get_user_option('gpg_signing_command')
1442.1.56 by Robert Collins
gpg_signing_command configuration item
744
1553.2.9 by Erik Bågfors
log_formatter => log_format for "named" formatters
745
    def _log_format(self):
746
        """See Config.log_format."""
747
        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
748
1472 by Robert Collins
post commit hook, first pass implementation
749
    def _post_commit(self):
750
        """See Config.post_commit."""
751
        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
752
1442.1.16 by Robert Collins
allow global overriding of signature policy to never check
753
    def _string_to_signature_policy(self, signature_string):
754
        """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
755
        if signature_string.lower() == 'check-available':
756
            return CHECK_IF_POSSIBLE
1442.1.16 by Robert Collins
allow global overriding of signature policy to never check
757
        if signature_string.lower() == 'ignore':
758
            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
759
        if signature_string.lower() == 'require':
760
            return CHECK_ALWAYS
1442.1.16 by Robert Collins
allow global overriding of signature policy to never check
761
        raise errors.BzrError("Invalid signatures policy '%s'"
762
                              % signature_string)
1442.1.6 by Robert Collins
first stage major overhaul of configs, giving use BranchConfigs, LocationConfigs and GlobalConfigs
763
1770.2.1 by Aaron Bentley
Use create_signature for signing policy, deprecate check_signatures for this
764
    def _string_to_signing_policy(self, signature_string):
765
        """Convert a string to a signing policy."""
766
        if signature_string.lower() == 'when-required':
767
            return SIGN_WHEN_REQUIRED
768
        if signature_string.lower() == 'never':
769
            return SIGN_NEVER
770
        if signature_string.lower() == 'always':
771
            return SIGN_ALWAYS
772
        raise errors.BzrError("Invalid signing policy '%s'"
773
                              % signature_string)
774
1553.6.12 by Erik Bågfors
remove AliasConfig, based on input from abentley
775
    def _get_alias(self, value):
776
        try:
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
777
            return self._get_parser().get_value("ALIASES",
1553.6.12 by Erik Bågfors
remove AliasConfig, based on input from abentley
778
                                                value)
779
        except KeyError:
780
            pass
781
1770.2.7 by Aaron Bentley
Set/get nickname using BranchConfig
782
    def _get_nickname(self):
783
        return self.get_user_option('nickname')
784
5447.4.11 by Vincent Ladeuil
Implement ``bzr config --remove <option>``.
785
    def remove_user_option(self, option_name, section_name=None):
786
        """Remove a user option and save the configuration file.
787
788
        :param option_name: The option to be removed.
789
790
        :param section_name: The section the option is defined in, default to
791
            the default section.
792
        """
793
        self.reload()
794
        parser = self._get_parser()
795
        if section_name is None:
796
            section = parser
797
        else:
798
            section = parser[section_name]
799
        try:
800
            del section[option_name]
801
        except KeyError:
802
            raise errors.NoSuchConfigOption(option_name)
803
        self._write_config_file()
804
4708.2.1 by Martin
Ensure all files opened by bazaar proper are explicitly closed
805
    def _write_config_file(self):
5345.1.1 by Vincent Ladeuil
Deprecate the get_filename parameter in IniBasedConfig.
806
        if self.file_name is None:
807
            raise AssertionError('We cannot save, self.file_name is None')
5345.1.9 by Vincent Ladeuil
Refactor config dir check.
808
        conf_dir = os.path.dirname(self.file_name)
809
        ensure_config_dir_exists(conf_dir)
5345.1.1 by Vincent Ladeuil
Deprecate the get_filename parameter in IniBasedConfig.
810
        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
811
        self._get_parser().write(atomic_file)
812
        atomic_file.commit()
813
        atomic_file.close()
5345.3.3 by Vincent Ladeuil
Merge bzr.dev into deprecate-get-filename resolving conflicts
814
        osutils.copy_ownership_from_path(self.file_name)
4708.2.1 by Martin
Ensure all files opened by bazaar proper are explicitly closed
815
1442.1.18 by Robert Collins
permit per branch location overriding of signature checking policy
816
5345.5.4 by Vincent Ladeuil
Start implementing config files locking.
817
class LockableConfig(IniBasedConfig):
818
    """A configuration needing explicit locking for access.
819
820
    If several processes try to write the config file, the accesses need to be
821
    serialized.
5345.5.8 by Vincent Ladeuil
More doc and ensure that the config is locked when _write_config_file is called.
822
823
    Daughter classes should decorate all methods that update a config with the
824
    ``@needs_write_lock`` decorator (they call, directly or indirectly, the
825
    ``_write_config_file()`` method. These methods (typically ``set_option()``
826
    and variants must reload the config file from disk before calling
827
    ``_write_config_file()``), this can be achieved by calling the
828
    ``self.reload()`` method. Note that the lock scope should cover both the
829
    reading and the writing of the config file which is why the decorator can't
830
    be applied to ``_write_config_file()`` only.
831
832
    This should be enough to implement the following logic:
833
    - lock for exclusive write access,
834
    - reload the config file from disk,
835
    - set the new value
836
    - unlock
837
838
    This logic guarantees that a writer can update a value without erasing an
839
    update made by another writer.
5345.5.4 by Vincent Ladeuil
Start implementing config files locking.
840
    """
841
5345.5.5 by Vincent Ladeuil
Make bb.test_version.TestVersionUnicodeOutput.test_unicode_bzr_home pass.
842
    lock_name = 'lock'
843
5345.1.25 by Vincent Ladeuil
Move the '_save' parameter from '__init__' to 'from_bytes', fix fallouts.
844
    def __init__(self, file_name):
845
        super(LockableConfig, self).__init__(file_name=file_name)
5345.5.5 by Vincent Ladeuil
Make bb.test_version.TestVersionUnicodeOutput.test_unicode_bzr_home pass.
846
        self.dir = osutils.dirname(osutils.safe_unicode(self.file_name))
5676.1.4 by Jelmer Vernooij
merge bzr.dev.
847
        # FIXME: It doesn't matter that we don't provide possible_transports
848
        # below since this is currently used only for local config files ;
849
        # local transports are not shared. But if/when we start using
850
        # LockableConfig for other kind of transports, we will need to reuse
851
        # whatever connection is already established -- vila 20100929
5345.5.5 by Vincent Ladeuil
Make bb.test_version.TestVersionUnicodeOutput.test_unicode_bzr_home pass.
852
        self.transport = transport.get_transport(self.dir)
5743.4.9 by Vincent Ladeuil
Implement a LockableConfigObjStore to be able to mimick the actual behaviour.
853
        self._lock = lockdir.LockDir(self.transport, self.lock_name)
5345.5.4 by Vincent Ladeuil
Start implementing config files locking.
854
5345.1.26 by Vincent Ladeuil
Merge lockable-config-files into remove-gratuitous-ensure-config-dir-exist-calls resolving conflicts
855
    def _create_from_string(self, unicode_bytes, save):
856
        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.
857
        if save:
5345.1.24 by Vincent Ladeuil
Implement _save for LockableConfig too.
858
            # We need to handle the saving here (as opposed to IniBasedConfig)
859
            # to be able to lock
860
            self.lock_write()
861
            self._write_config_file()
862
            self.unlock()
5345.5.4 by Vincent Ladeuil
Start implementing config files locking.
863
864
    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.
865
        """Takes a write lock in the directory containing the config file.
866
867
        If the directory doesn't exist it is created.
868
        """
5345.5.5 by Vincent Ladeuil
Make bb.test_version.TestVersionUnicodeOutput.test_unicode_bzr_home pass.
869
        ensure_config_dir_exists(self.dir)
5345.5.4 by Vincent Ladeuil
Start implementing config files locking.
870
        return self._lock.lock_write(token)
871
872
    def unlock(self):
873
        self._lock.unlock()
874
5345.5.9 by Vincent Ladeuil
Implements 'bzr lock --config <file>'.
875
    def break_lock(self):
876
        self._lock.break_lock()
877
5447.4.11 by Vincent Ladeuil
Implement ``bzr config --remove <option>``.
878
    @needs_write_lock
879
    def remove_user_option(self, option_name, section_name=None):
880
        super(LockableConfig, self).remove_user_option(option_name,
881
                                                       section_name)
882
5345.5.8 by Vincent Ladeuil
More doc and ensure that the config is locked when _write_config_file is called.
883
    def _write_config_file(self):
884
        if self._lock is None or not self._lock.is_held:
885
            # NB: if the following exception is raised it probably means a
886
            # missing @needs_write_lock decorator on one of the callers.
887
            raise errors.ObjectNotLocked(self)
888
        super(LockableConfig, self)._write_config_file()
889
5345.5.4 by Vincent Ladeuil
Start implementing config files locking.
890
891
class GlobalConfig(LockableConfig):
1442.1.18 by Robert Collins
permit per branch location overriding of signature checking policy
892
    """The configuration that should be used for a specific location."""
893
5345.2.8 by Vincent Ladeuil
Introduce a 'from_bytes' constructor for config objects.
894
    def __init__(self):
895
        super(GlobalConfig, self).__init__(file_name=config_filename())
5345.1.1 by Vincent Ladeuil
Deprecate the get_filename parameter in IniBasedConfig.
896
5447.4.16 by Vincent Ladeuil
Use config_id instead of id as suggested by poolie.
897
    def config_id(self):
5447.4.3 by Vincent Ladeuil
Simplify code and design by only defining get_options() where relevant.
898
        return 'bazaar'
899
5345.1.25 by Vincent Ladeuil
Move the '_save' parameter from '__init__' to 'from_bytes', fix fallouts.
900
    @classmethod
5345.1.26 by Vincent Ladeuil
Merge lockable-config-files into remove-gratuitous-ensure-config-dir-exist-calls resolving conflicts
901
    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
902
        """Create a config object from a string.
5345.1.25 by Vincent Ladeuil
Move the '_save' parameter from '__init__' to 'from_bytes', fix fallouts.
903
5345.5.13 by Vincent Ladeuil
Merge simplify-test-config-building into lockable-config-files resolving conflicts
904
        :param str_or_unicode: A string representing the file content. This
905
            will be utf-8 encoded.
5345.1.25 by Vincent Ladeuil
Move the '_save' parameter from '__init__' to 'from_bytes', fix fallouts.
906
907
        :param save: Whether the file should be saved upon creation.
908
        """
909
        conf = cls()
5345.1.26 by Vincent Ladeuil
Merge lockable-config-files into remove-gratuitous-ensure-config-dir-exist-calls resolving conflicts
910
        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.
911
        return conf
5345.5.12 by Vincent Ladeuil
Fix fallouts from replacing '_content' by 'from_bytes' for config files.
912
1442.1.18 by Robert Collins
permit per branch location overriding of signature checking policy
913
    def get_editor(self):
1474 by Robert Collins
Merge from Aaron Bentley.
914
        return self._get_user_option('editor')
1442.1.18 by Robert Collins
permit per branch location overriding of signature checking policy
915
5345.5.4 by Vincent Ladeuil
Start implementing config files locking.
916
    @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
917
    def set_user_option(self, option, value):
918
        """Save option and its value in the configuration."""
2900.3.2 by Tim Penhey
A working alias command.
919
        self._set_option(option, value, 'DEFAULT')
920
921
    def get_aliases(self):
922
        """Return the aliases section."""
923
        if 'ALIASES' in self._get_parser():
924
            return self._get_parser()['ALIASES']
925
        else:
926
            return {}
927
5345.5.8 by Vincent Ladeuil
More doc and ensure that the config is locked when _write_config_file is called.
928
    @needs_write_lock
2900.3.2 by Tim Penhey
A working alias command.
929
    def set_alias(self, alias_name, alias_command):
930
        """Save the alias in the configuration."""
931
        self._set_option(alias_name, alias_command, 'ALIASES')
932
5345.5.8 by Vincent Ladeuil
More doc and ensure that the config is locked when _write_config_file is called.
933
    @needs_write_lock
2900.3.2 by Tim Penhey
A working alias command.
934
    def unset_alias(self, alias_name):
935
        """Unset an existing alias."""
5345.5.10 by Vincent Ladeuil
Add a missing config.reload().
936
        self.reload()
2900.3.2 by Tim Penhey
A working alias command.
937
        aliases = self._get_parser().get('ALIASES')
2900.3.7 by Tim Penhey
Updates from Aaron's review.
938
        if not aliases or alias_name not in aliases:
939
            raise errors.NoSuchAlias(alias_name)
2900.3.2 by Tim Penhey
A working alias command.
940
        del aliases[alias_name]
2900.3.12 by Tim Penhey
Final review comments.
941
        self._write_config_file()
2900.3.2 by Tim Penhey
A working alias command.
942
943
    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.
944
        self.reload()
2900.3.7 by Tim Penhey
Updates from Aaron's review.
945
        self._get_parser().setdefault(section, {})[option] = value
2900.3.12 by Tim Penhey
Final review comments.
946
        self._write_config_file()
2900.3.2 by Tim Penhey
A working alias command.
947
1442.1.18 by Robert Collins
permit per branch location overriding of signature checking policy
948
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.
949
    def _get_sections(self, name=None):
950
        """See IniBasedConfig._get_sections()."""
5447.4.4 by Vincent Ladeuil
Implement config.get_sections() to clarify how sections can be used.
951
        parser = self._get_parser()
952
        # We don't give access to options defined outside of any section, we
953
        # used the DEFAULT section by... default.
954
        if name in (None, 'DEFAULT'):
955
            # This could happen for an empty file where the DEFAULT section
956
            # doesn't exist yet. So we force DEFAULT when yielding
957
            name = 'DEFAULT'
5447.4.11 by Vincent Ladeuil
Implement ``bzr config --remove <option>``.
958
            if 'DEFAULT' not in parser:
959
               parser['DEFAULT']= {}
5447.4.16 by Vincent Ladeuil
Use config_id instead of id as suggested by poolie.
960
        yield (name, parser[name], self.config_id())
5447.4.11 by Vincent Ladeuil
Implement ``bzr config --remove <option>``.
961
962
    @needs_write_lock
963
    def remove_user_option(self, option_name, section_name=None):
964
        if section_name is None:
965
            # We need to force the default section.
966
            section_name = 'DEFAULT'
967
        # We need to avoid the LockableConfig implementation or we'll lock
968
        # twice
969
        super(LockableConfig, self).remove_user_option(option_name,
970
                                                       section_name)
5447.4.4 by Vincent Ladeuil
Implement config.get_sections() to clarify how sections can be used.
971
5764.1.4 by Vincent Ladeuil
Using iterators is even clearer.
972
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.
973
    """Keep only the sessions matching the specified location.
974
975
    :param sections: An iterable of section names.
976
977
    :param location: An url or a local path to match against.
978
5764.1.4 by Vincent Ladeuil
Using iterators is even clearer.
979
    :returns: An iterator of (section, extra_path, nb_parts) where nb is the
980
        number of path components in the section name, section is the section
981
        name and extra_path is the difference between location and the section
982
        name.
5743.6.19 by Vincent Ladeuil
Clarify comments about section names for Location-related objects (also fix LocationMatcher and add tests).
983
984
    ``location`` will always be a local path and never a 'file://' url but the
985
    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.
986
    """
5764.1.2 by Vincent Ladeuil
This put a common processing into the loop to avoid bad inputs. The
987
    location_parts = location.rstrip('/').split('/')
988
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.
989
    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).
990
        # location is a local path if possible, so we need to convert 'file://'
991
        # 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.
992
993
        # This also avoids having file:///path be a more exact
994
        # match than '/path'.
995
5743.6.19 by Vincent Ladeuil
Clarify comments about section names for Location-related objects (also fix LocationMatcher and add tests).
996
        # FIXME: This still raises an issue if a user defines both file:///path
997
        # *and* /path. Should we raise an error in this case -- vila 20110505
998
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.
999
        if section.startswith('file://'):
1000
            section_path = urlutils.local_path_from_url(section)
1001
        else:
1002
            section_path = section
1003
        section_parts = section_path.rstrip('/').split('/')
1004
1005
        matched = True
1006
        if len(section_parts) > len(location_parts):
1007
            # More path components in the section, they can't match
1008
            matched = False
1009
        else:
1010
            # Rely on zip truncating in length to the length of the shortest
1011
            # argument sequence.
1012
            names = zip(location_parts, section_parts)
1013
            for name in names:
1014
                if not fnmatch.fnmatch(name[0], name[1]):
1015
                    matched = False
1016
                    break
1017
        if not matched:
1018
            continue
5764.1.1 by Vincent Ladeuil
Extract _match_section_by_parts from LocationConfig._get_matching_sections and more comments to explain the behavior.
1019
        # 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.
1020
        extra_path = '/'.join(location_parts[len(section_parts):])
5764.1.4 by Vincent Ladeuil
Using iterators is even clearer.
1021
        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.
1022
5447.4.4 by Vincent Ladeuil
Implement config.get_sections() to clarify how sections can be used.
1023
5345.5.7 by Vincent Ladeuil
Make LocationConfig use a lock too.
1024
class LocationConfig(LockableConfig):
1442.1.6 by Robert Collins
first stage major overhaul of configs, giving use BranchConfigs, LocationConfigs and GlobalConfigs
1025
    """A configuration object that gives the policy for a location."""
1026
5345.2.8 by Vincent Ladeuil
Introduce a 'from_bytes' constructor for config objects.
1027
    def __init__(self, location):
5345.1.2 by Vincent Ladeuil
Get rid of 'branches.conf' references.
1028
        super(LocationConfig, self).__init__(
5345.2.8 by Vincent Ladeuil
Introduce a 'from_bytes' constructor for config objects.
1029
            file_name=locations_config_filename())
1878.1.1 by John Arbash Meinel
Entries in locations.conf should prefer local paths if available (bug #53653)
1030
        # local file locations are looked up by local path, rather than
1031
        # by file url. This is because the config file is a user
1032
        # file, and we would rather not expose the user to file urls.
1033
        if location.startswith('file://'):
1034
            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
1035
        self.location = location
1036
5447.4.16 by Vincent Ladeuil
Use config_id instead of id as suggested by poolie.
1037
    def config_id(self):
5447.4.3 by Vincent Ladeuil
Simplify code and design by only defining get_options() where relevant.
1038
        return 'locations'
1039
5345.2.8 by Vincent Ladeuil
Introduce a 'from_bytes' constructor for config objects.
1040
    @classmethod
5345.1.26 by Vincent Ladeuil
Merge lockable-config-files into remove-gratuitous-ensure-config-dir-exist-calls resolving conflicts
1041
    def from_string(cls, str_or_unicode, location, save=False):
1042
        """Create a config object from a string.
5345.2.8 by Vincent Ladeuil
Introduce a 'from_bytes' constructor for config objects.
1043
5345.2.9 by Vincent Ladeuil
Rename IniBaseConfig.from_bytes to from_string.
1044
        :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.
1045
            be utf-8 encoded.
1046
1047
        :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.
1048
1049
        :param save: Whether the file should be saved upon creation.
5345.2.8 by Vincent Ladeuil
Introduce a 'from_bytes' constructor for config objects.
1050
        """
1051
        conf = cls(location)
5345.1.26 by Vincent Ladeuil
Merge lockable-config-files into remove-gratuitous-ensure-config-dir-exist-calls resolving conflicts
1052
        conf._create_from_string(str_or_unicode, save)
5345.2.8 by Vincent Ladeuil
Introduce a 'from_bytes' constructor for config objects.
1053
        return conf
1054
1993.3.1 by James Henstridge
first go at making location config lookup recursive
1055
    def _get_matching_sections(self):
1056
        """Return an ordered list of section names matching this location."""
5764.1.4 by Vincent Ladeuil
Using iterators is even clearer.
1057
        matches = list(_iter_for_location_by_parts(self._get_parser(),
1058
                                                   self.location))
5447.4.1 by Vincent Ladeuil
Implement config.get_options_matching_regexp.
1059
        # put the longest (aka more specific) locations first
5764.1.4 by Vincent Ladeuil
Using iterators is even clearer.
1060
        matches.sort(
1061
            key=lambda (section, extra_path, length): (length, section),
1062
            reverse=True)
1063
        for (section, extra_path, length) in matches:
1064
            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
1065
            # should we stop looking for parent configs here?
1993.3.1 by James Henstridge
first go at making location config lookup recursive
1066
            try:
1993.3.3 by James Henstridge
make _get_matching_sections() return (section, extra_path) tuples, and adjust other code to match
1067
                if self._get_parser()[section].as_bool('ignore_parents'):
1068
                    break
1993.3.1 by James Henstridge
first go at making location config lookup recursive
1069
            except KeyError:
1070
                pass
1442.1.9 by Robert Collins
exact section test passes
1071
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.
1072
    def _get_sections(self, name=None):
1073
        """See IniBasedConfig._get_sections()."""
5447.4.4 by Vincent Ladeuil
Implement config.get_sections() to clarify how sections can be used.
1074
        # We ignore the name here as the only sections handled are named with
1075
        # the location path and we don't expose embedded sections either.
1076
        parser = self._get_parser()
1077
        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.
1078
            yield (name, parser[name], self.config_id())
5447.4.4 by Vincent Ladeuil
Implement config.get_sections() to clarify how sections can be used.
1079
2120.6.1 by James Henstridge
add support for norecurse and appendpath policies when reading configuration files
1080
    def _get_option_policy(self, section, option_name):
1081
        """Return the policy for the given (section, option_name) pair."""
1082
        # check for the old 'recurse=False' flag
1083
        try:
1084
            recurse = self._get_parser()[section].as_bool('recurse')
1085
        except KeyError:
1086
            recurse = True
1087
        if not recurse:
1088
            return POLICY_NORECURSE
1089
2120.6.10 by James Henstridge
Catch another deprecation warning, and more cleanup
1090
        policy_key = option_name + ':policy'
2120.6.8 by James Henstridge
Change syntax for setting config option policies. Rather than
1091
        try:
1092
            policy_name = self._get_parser()[section][policy_key]
1093
        except KeyError:
1094
            policy_name = None
2120.6.1 by James Henstridge
add support for norecurse and appendpath policies when reading configuration files
1095
2120.6.8 by James Henstridge
Change syntax for setting config option policies. Rather than
1096
        return _policy_value[policy_name]
2120.6.1 by James Henstridge
add support for norecurse and appendpath policies when reading configuration files
1097
2120.6.4 by James Henstridge
add support for specifying policy when storing options
1098
    def _set_option_policy(self, section, option_name, option_policy):
1099
        """Set the policy for the given option name in the given section."""
1100
        # The old recurse=False option affects all options in the
1101
        # section.  To handle multiple policies in the section, we
1102
        # need to convert it to a policy_norecurse key.
1103
        try:
1104
            recurse = self._get_parser()[section].as_bool('recurse')
1105
        except KeyError:
1106
            pass
1107
        else:
2120.6.9 by James Henstridge
Fixes for issues brought up in John's review
1108
            symbol_versioning.warn(
2120.6.11 by James Henstridge
s/0.13/0.14/ in deprecation warning
1109
                'The recurse option is deprecated as of 0.14.  '
2120.6.9 by James Henstridge
Fixes for issues brought up in John's review
1110
                'The section "%s" has been converted to use policies.'
1111
                % section,
1112
                DeprecationWarning)
2120.6.4 by James Henstridge
add support for specifying policy when storing options
1113
            del self._get_parser()[section]['recurse']
2120.6.9 by James Henstridge
Fixes for issues brought up in John's review
1114
            if not recurse:
1115
                for key in self._get_parser()[section].keys():
1116
                    if not key.endswith(':policy'):
1117
                        self._get_parser()[section][key +
1118
                                                    ':policy'] = 'norecurse'
2120.6.4 by James Henstridge
add support for specifying policy when storing options
1119
2120.6.9 by James Henstridge
Fixes for issues brought up in John's review
1120
        policy_key = option_name + ':policy'
2120.6.8 by James Henstridge
Change syntax for setting config option policies. Rather than
1121
        policy_name = _policy_name[option_policy]
1122
        if policy_name is not None:
1123
            self._get_parser()[section][policy_key] = policy_name
1124
        else:
1125
            if policy_key in self._get_parser()[section]:
1126
                del self._get_parser()[section][policy_key]
2120.6.4 by James Henstridge
add support for specifying policy when storing options
1127
5345.5.7 by Vincent Ladeuil
Make LocationConfig use a lock too.
1128
    @needs_write_lock
2120.6.4 by James Henstridge
add support for specifying policy when storing options
1129
    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.
1130
        """Save option and its value in the configuration."""
3376.2.4 by Martin Pool
Remove every assert statement from bzrlib!
1131
        if store not in [STORE_LOCATION,
2120.6.4 by James Henstridge
add support for specifying policy when storing options
1132
                         STORE_LOCATION_NORECURSE,
3376.2.4 by Martin Pool
Remove every assert statement from bzrlib!
1133
                         STORE_LOCATION_APPENDPATH]:
1134
            raise ValueError('bad storage policy %r for %r' %
1135
                (store, option))
5345.5.1 by Vincent Ladeuil
Implement config.reload and make sure we have a file name when using it.
1136
        self.reload()
1490 by Robert Collins
Implement a 'bzr push' command, with saved locations; update diff to return 1.
1137
        location = self.location
1138
        if location.endswith('/'):
1139
            location = location[:-1]
5345.1.24 by Vincent Ladeuil
Implement _save for LockableConfig too.
1140
        parser = self._get_parser()
5345.1.21 by Vincent Ladeuil
Slight rewrite to make the method more readable.
1141
        if not location in parser and not location + '/' in parser:
1142
            parser[location] = {}
1143
        elif location + '/' in parser:
1490 by Robert Collins
Implement a 'bzr push' command, with saved locations; update diff to return 1.
1144
            location = location + '/'
5345.1.21 by Vincent Ladeuil
Slight rewrite to make the method more readable.
1145
        parser[location][option]=value
2120.6.4 by James Henstridge
add support for specifying policy when storing options
1146
        # the allowed values of store match the config policies
1147
        self._set_option_policy(location, option, store)
4708.2.1 by Martin
Ensure all files opened by bazaar proper are explicitly closed
1148
        self._write_config_file()
1490 by Robert Collins
Implement a 'bzr push' command, with saved locations; update diff to return 1.
1149
1442.1.6 by Robert Collins
first stage major overhaul of configs, giving use BranchConfigs, LocationConfigs and GlobalConfigs
1150
1151
class BranchConfig(Config):
1152
    """A configuration object giving the policy for a branch."""
1153
5345.1.3 by Vincent Ladeuil
Make __init__ the first method in the BranchConfig class.
1154
    def __init__(self, branch):
1155
        super(BranchConfig, self).__init__()
1156
        self._location_config = None
1157
        self._branch_data_config = None
1158
        self._global_config = None
1159
        self.branch = branch
1160
        self.option_sources = (self._get_location_config,
1161
                               self._get_branch_data_config,
1162
                               self._get_global_config)
1163
5447.4.16 by Vincent Ladeuil
Use config_id instead of id as suggested by poolie.
1164
    def config_id(self):
5447.4.3 by Vincent Ladeuil
Simplify code and design by only defining get_options() where relevant.
1165
        return 'branch'
1166
1770.2.5 by Aaron Bentley
Integrate branch.conf into BranchConfig
1167
    def _get_branch_data_config(self):
1168
        if self._branch_data_config is None:
1169
            self._branch_data_config = TreeConfig(self.branch)
5447.4.16 by Vincent Ladeuil
Use config_id instead of id as suggested by poolie.
1170
            self._branch_data_config.config_id = self.config_id
1770.2.5 by Aaron Bentley
Integrate branch.conf into BranchConfig
1171
        return self._branch_data_config
1172
1442.1.6 by Robert Collins
first stage major overhaul of configs, giving use BranchConfigs, LocationConfigs and GlobalConfigs
1173
    def _get_location_config(self):
1174
        if self._location_config is None:
1175
            self._location_config = LocationConfig(self.branch.base)
1176
        return self._location_config
1177
1770.2.5 by Aaron Bentley
Integrate branch.conf into BranchConfig
1178
    def _get_global_config(self):
1179
        if self._global_config is None:
1180
            self._global_config = GlobalConfig()
1181
        return self._global_config
1182
1183
    def _get_best_value(self, option_name):
1184
        """This returns a user option from local, tree or global config.
1185
1186
        They are tried in that order.  Use get_safe_value if trusted values
1187
        are necessary.
1188
        """
1189
        for source in self.option_sources:
1190
            value = getattr(source(), option_name)()
1191
            if value is not None:
1192
                return value
1193
        return None
1194
1195
    def _get_safe_value(self, option_name):
1196
        """This variant of get_best_value never returns untrusted values.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
1197
1770.2.5 by Aaron Bentley
Integrate branch.conf into BranchConfig
1198
        It does not return values from the branch data, because the branch may
1199
        not be controlled by the user.
1200
1201
        We may wish to allow locations.conf to control whether branches are
1202
        trusted in the future.
1203
        """
1204
        for source in (self._get_location_config, self._get_global_config):
1205
            value = getattr(source(), option_name)()
1206
            if value is not None:
1207
                return value
1208
        return None
1209
1442.1.6 by Robert Collins
first stage major overhaul of configs, giving use BranchConfigs, LocationConfigs and GlobalConfigs
1210
    def _get_user_id(self):
1211
        """Return the full user id for the branch.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
1212
3407.2.14 by Martin Pool
Remove more cases of getting transport via control_files
1213
        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
1214
        This is looked up in the email controlfile for the branch.
1215
        """
1216
        try:
3407.2.16 by Martin Pool
Remove RemoteBranch reliance on control_files._transport
1217
            return (self.branch._transport.get_bytes("email")
3224.5.4 by Andrew Bennetts
Fix test suite, mainly weeding out uses of bzrlib.user_encoding.
1218
                    .decode(osutils.get_user_encoding())
1442.1.6 by Robert Collins
first stage major overhaul of configs, giving use BranchConfigs, LocationConfigs and GlobalConfigs
1219
                    .rstrip("\r\n"))
1220
        except errors.NoSuchFile, e:
1221
            pass
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
1222
1770.2.5 by Aaron Bentley
Integrate branch.conf into BranchConfig
1223
        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
1224
4603.1.10 by Aaron Bentley
Provide change editor via config.
1225
    def _get_change_editor(self):
1226
        return self._get_best_value('_get_change_editor')
1227
1442.1.19 by Robert Collins
BranchConfigs inherit signature_checking policy from their LocationConfig.
1228
    def _get_signature_checking(self):
1229
        """See Config._get_signature_checking."""
1770.2.5 by Aaron Bentley
Integrate branch.conf into BranchConfig
1230
        return self._get_best_value('_get_signature_checking')
1442.1.19 by Robert Collins
BranchConfigs inherit signature_checking policy from their LocationConfig.
1231
1770.2.1 by Aaron Bentley
Use create_signature for signing policy, deprecate check_signatures for this
1232
    def _get_signing_policy(self):
1233
        """See Config._get_signing_policy."""
1770.2.5 by Aaron Bentley
Integrate branch.conf into BranchConfig
1234
        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
1235
1993.3.6 by James Henstridge
get rid of the recurse argument to get_user_option()
1236
    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.
1237
        """See Config._get_user_option."""
1770.2.5 by Aaron Bentley
Integrate branch.conf into BranchConfig
1238
        for source in self.option_sources:
1993.3.6 by James Henstridge
get rid of the recurse argument to get_user_option()
1239
            value = source()._get_user_option(option_name)
1770.2.5 by Aaron Bentley
Integrate branch.conf into BranchConfig
1240
            if value is not None:
1241
                return value
1242
        return None
1243
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.
1244
    def _get_sections(self, name=None):
5447.4.4 by Vincent Ladeuil
Implement config.get_sections() to clarify how sections can be used.
1245
        """See IniBasedConfig.get_sections()."""
1246
        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.
1247
            for section in source()._get_sections(name):
5447.4.4 by Vincent Ladeuil
Implement config.get_sections() to clarify how sections can be used.
1248
                yield section
1249
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.
1250
    def _get_options(self, sections=None):
5447.4.3 by Vincent Ladeuil
Simplify code and design by only defining get_options() where relevant.
1251
        opts = []
1252
        # 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.
1253
        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.
1254
            yield option
1255
        # Then the branch options
5447.4.1 by Vincent Ladeuil
Implement config.get_options_matching_regexp.
1256
        branch_config = self._get_branch_data_config()
1257
        if sections is None:
1258
            sections = [('DEFAULT', branch_config._get_parser())]
5447.4.3 by Vincent Ladeuil
Simplify code and design by only defining get_options() where relevant.
1259
        # FIXME: We shouldn't have to duplicate the code in IniBasedConfig but
1260
        # 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.
1261
        config_id = self.config_id()
5447.4.3 by Vincent Ladeuil
Simplify code and design by only defining get_options() where relevant.
1262
        for (section_name, section) in sections:
1263
            for (name, value) in section.iteritems():
5533.2.1 by Vincent Ladeuil
``bzr config`` properly displays list values
1264
                yield (name, value, section_name,
1265
                       config_id, branch_config._get_parser())
5447.4.3 by Vincent Ladeuil
Simplify code and design by only defining get_options() where relevant.
1266
        # 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.
1267
        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.
1268
            yield option
5447.4.1 by Vincent Ladeuil
Implement config.get_options_matching_regexp.
1269
1551.15.35 by Aaron Bentley
Warn when setting config values that will be masked (#122286)
1270
    def set_user_option(self, name, value, store=STORE_BRANCH,
1271
        warn_masked=False):
2120.6.4 by James Henstridge
add support for specifying policy when storing options
1272
        if store == STORE_BRANCH:
1770.2.6 by Aaron Bentley
Ensure branch.conf works properly
1273
            self._get_branch_data_config().set_option(value, name)
2120.6.4 by James Henstridge
add support for specifying policy when storing options
1274
        elif store == STORE_GLOBAL:
2120.6.7 by James Henstridge
Fix GlobalConfig.set_user_option() call
1275
            self._get_global_config().set_user_option(name, value)
2120.6.4 by James Henstridge
add support for specifying policy when storing options
1276
        else:
1277
            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)
1278
        if not warn_masked:
1279
            return
1280
        if store in (STORE_GLOBAL, STORE_BRANCH):
1281
            mask_value = self._get_location_config().get_user_option(name)
1282
            if mask_value is not None:
1283
                trace.warning('Value "%s" is masked by "%s" from'
1284
                              ' locations.conf', value, mask_value)
1285
            else:
1286
                if store == STORE_GLOBAL:
1287
                    branch_config = self._get_branch_data_config()
1288
                    mask_value = branch_config.get_user_option(name)
1289
                    if mask_value is not None:
1290
                        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
1291
                                      ' branch.conf', value, mask_value)
1551.15.35 by Aaron Bentley
Warn when setting config values that will be masked (#122286)
1292
5447.4.11 by Vincent Ladeuil
Implement ``bzr config --remove <option>``.
1293
    def remove_user_option(self, option_name, section_name=None):
1294
        self._get_branch_data_config().remove_option(option_name, section_name)
1295
1442.1.59 by Robert Collins
Add re-sign command to generate a digital signature on a single revision.
1296
    def _gpg_signing_command(self):
1442.1.56 by Robert Collins
gpg_signing_command configuration item
1297
        """See Config.gpg_signing_command."""
1770.2.5 by Aaron Bentley
Integrate branch.conf into BranchConfig
1298
        return self._get_safe_value('_gpg_signing_command')
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
1299
1472 by Robert Collins
post commit hook, first pass implementation
1300
    def _post_commit(self):
1301
        """See Config.post_commit."""
1770.2.5 by Aaron Bentley
Integrate branch.conf into BranchConfig
1302
        return self._get_safe_value('_post_commit')
1472 by Robert Collins
post commit hook, first pass implementation
1303
1770.2.7 by Aaron Bentley
Set/get nickname using BranchConfig
1304
    def _get_nickname(self):
1824.1.1 by Robert Collins
Add BranchConfig.has_explicit_nickname call.
1305
        value = self._get_explicit_nickname()
1770.2.7 by Aaron Bentley
Set/get nickname using BranchConfig
1306
        if value is not None:
1307
            return value
2120.5.2 by Alexander Belchenko
(jam) Fix for bug #66857
1308
        return urlutils.unescape(self.branch.base.split('/')[-2])
1770.2.7 by Aaron Bentley
Set/get nickname using BranchConfig
1309
1824.1.1 by Robert Collins
Add BranchConfig.has_explicit_nickname call.
1310
    def has_explicit_nickname(self):
1311
        """Return true if a nickname has been explicitly assigned."""
1312
        return self._get_explicit_nickname() is not None
1313
1314
    def _get_explicit_nickname(self):
1315
        return self._get_best_value('_get_nickname')
1316
1553.2.9 by Erik Bågfors
log_formatter => log_format for "named" formatters
1317
    def _log_format(self):
1318
        """See Config.log_format."""
1770.2.5 by Aaron Bentley
Integrate branch.conf into BranchConfig
1319
        return self._get_best_value('_log_format')
1442.1.1 by Robert Collins
move config_dir into bzrlib.config
1320
1553.6.12 by Erik Bågfors
remove AliasConfig, based on input from abentley
1321
1185.31.43 by John Arbash Meinel
Reintroduced ensure_config_dir_exists() for sftp
1322
def ensure_config_dir_exists(path=None):
5519.4.4 by Neil Martinsen-Burrell
restore ensure_config_dir since XDG_CONFIG_HOME is optional
1323
    """Make sure a configuration directory exists.
1324
    This makes sure that the directory exists.
1325
    On windows, since configuration directories are 2 levels deep,
1326
    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
1327
    """
1328
    if path is None:
1329
        path = config_dir()
1330
    if not os.path.isdir(path):
5519.4.4 by Neil Martinsen-Burrell
restore ensure_config_dir since XDG_CONFIG_HOME is optional
1331
        if sys.platform == 'win32':
1332
            parent_dir = os.path.dirname(path)
1333
            if not os.path.isdir(parent_dir):
1334
                trace.mutter('creating config parent directory: %r', parent_dir)
1335
                os.mkdir(parent_dir)
2900.2.10 by Vincent Ladeuil
Add -Dauth handling.
1336
        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
1337
        os.mkdir(path)
5116.2.6 by Parth Malwankar
renamed copy_ownership to copy_ownership_from_path.
1338
        osutils.copy_ownership_from_path(path)
1185.31.43 by John Arbash Meinel
Reintroduced ensure_config_dir_exists() for sftp
1339
1532 by Robert Collins
Merge in John Meinels integration branch.
1340
1442.1.1 by Robert Collins
move config_dir into bzrlib.config
1341
def config_dir():
1342
    """Return per-user configuration directory.
1343
5519.4.1 by Neil Martinsen-Burrell
spec and first implementation, next tests
1344
    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
1345
    and Linux.  On Linux, if there is a $XDG_CONFIG_HOME/bazaar directory,
1346
    that will be used instead.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
1347
1442.1.1 by Robert Collins
move config_dir into bzrlib.config
1348
    TODO: Global option --config-dir to override this.
1349
    """
1185.38.1 by John Arbash Meinel
Adding my win32 patch for moving the home directory.
1350
    base = os.environ.get('BZR_HOME', None)
1351
    if sys.platform == 'win32':
5598.2.2 by John Arbash Meinel
Change the comment slightly
1352
        # environ variables on Windows are in user encoding/mbcs. So decode
1353
        # 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.
1354
        if base is not None:
1355
            base = base.decode('mbcs')
1185.38.1 by John Arbash Meinel
Adding my win32 patch for moving the home directory.
1356
        if base is None:
2245.4.3 by Alexander Belchenko
config.py: changing _auto_user_id() and config_dir() to use functions from win32utils
1357
            base = win32utils.get_appdata_location_unicode()
1185.38.1 by John Arbash Meinel
Adding my win32 patch for moving the home directory.
1358
        if base is None:
1359
            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.
1360
            if base is not None:
1361
                base = base.decode('mbcs')
1185.38.1 by John Arbash Meinel
Adding my win32 patch for moving the home directory.
1362
        if base is None:
2991.2.2 by Vincent Ladeuil
No tests worth adding after upgrading to configobj-4.4.0.
1363
            raise errors.BzrError('You must have one of BZR_HOME, APPDATA,'
1364
                                  ' or HOME set')
1996.3.31 by John Arbash Meinel
Make bzrlib.config use lazy importing
1365
        return osutils.pathjoin(base, 'bazaar', '2.0')
5519.4.1 by Neil Martinsen-Burrell
spec and first implementation, next tests
1366
    elif sys.platform == 'darwin':
1185.38.1 by John Arbash Meinel
Adding my win32 patch for moving the home directory.
1367
        if base is None:
5519.4.1 by Neil Martinsen-Burrell
spec and first implementation, next tests
1368
            # this takes into account $HOME
1185.38.1 by John Arbash Meinel
Adding my win32 patch for moving the home directory.
1369
            base = os.path.expanduser("~")
5519.4.1 by Neil Martinsen-Burrell
spec and first implementation, next tests
1370
        return osutils.pathjoin(base, '.bazaar')
1371
    else:
1372
        if base is None:
5519.4.3 by Neil Martinsen-Burrell
be permissive about using $XDG_CONFIG_HOME/bazaar, but dont complain
1373
1374
            xdg_dir = os.environ.get('XDG_CONFIG_HOME', None)
1375
            if xdg_dir is None:
1376
                xdg_dir = osutils.pathjoin(os.path.expanduser("~"), ".config")
1377
            xdg_dir = osutils.pathjoin(xdg_dir, 'bazaar')
1378
            if osutils.isdir(xdg_dir):
1379
                trace.mutter(
1380
                    "Using configuration in XDG directory %s." % xdg_dir)
1381
                return xdg_dir
1382
1383
            base = os.path.expanduser("~")
5519.4.4 by Neil Martinsen-Burrell
restore ensure_config_dir since XDG_CONFIG_HOME is optional
1384
        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 \
1385
1386
1442.1.2 by Robert Collins
create a config module - there is enough config logic to make this worthwhile, and start testing config processing.
1387
def config_filename():
1388
    """Return per-user configuration ini file filename."""
1996.3.31 by John Arbash Meinel
Make bzrlib.config use lazy importing
1389
    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.
1390
1391
1770.2.2 by Aaron Bentley
Rename branches.conf to locations.conf
1392
def locations_config_filename():
1393
    """Return per-user configuration ini file filename."""
1996.3.31 by John Arbash Meinel
Make bzrlib.config use lazy importing
1394
    return osutils.pathjoin(config_dir(), 'locations.conf')
1770.2.2 by Aaron Bentley
Rename branches.conf to locations.conf
1395
1442.1.2 by Robert Collins
create a config module - there is enough config logic to make this worthwhile, and start testing config processing.
1396
2900.2.3 by Vincent Ladeuil
Credentials matching implementation.
1397
def authentication_config_filename():
1398
    """Return per-user authentication ini file filename."""
1399
    return osutils.pathjoin(config_dir(), 'authentication.conf')
1400
1401
1836.1.6 by John Arbash Meinel
Creating a helper function for getting the user ignore filename
1402
def user_ignore_config_filename():
1403
    """Return the user default ignore filename"""
1996.3.31 by John Arbash Meinel
Make bzrlib.config use lazy importing
1404
    return osutils.pathjoin(config_dir(), 'ignore')
1836.1.6 by John Arbash Meinel
Creating a helper function for getting the user ignore filename
1405
1406
4584.3.4 by Martin Pool
Add crash_dir and xdg_cache_dir functions
1407
def crash_dir():
1408
    """Return the directory name to store crash files.
1409
1410
    This doesn't implicitly create it.
1411
4634.128.2 by Martin Pool
Write crash files into /var/crash where apport can see them.
1412
    On Windows it's in the config directory; elsewhere it's /var/crash
4634.128.18 by Martin Pool
Update apport crash tests
1413
    which may be monitored by apport.  It can be overridden by
1414
    $APPORT_CRASH_DIR.
4584.3.4 by Martin Pool
Add crash_dir and xdg_cache_dir functions
1415
    """
1416
    if sys.platform == 'win32':
1417
        return osutils.pathjoin(config_dir(), 'Crash')
1418
    else:
4634.128.2 by Martin Pool
Write crash files into /var/crash where apport can see them.
1419
        # XXX: hardcoded in apport_python_hook.py; therefore here too -- mbp
1420
        # 2010-01-31
4634.128.18 by Martin Pool
Update apport crash tests
1421
        return os.environ.get('APPORT_CRASH_DIR', '/var/crash')
4584.3.4 by Martin Pool
Add crash_dir and xdg_cache_dir functions
1422
1423
1424
def xdg_cache_dir():
4584.3.23 by Martin Pool
Correction to xdg_cache_dir and add a simple test
1425
    # See http://standards.freedesktop.org/basedir-spec/latest/ar01s03.html
1426
    # Possibly this should be different on Windows?
1427
    e = os.environ.get('XDG_CACHE_DIR', None)
1428
    if e:
1429
        return e
1430
    else:
1431
        return os.path.expanduser('~/.cache')
4584.3.4 by Martin Pool
Add crash_dir and xdg_cache_dir functions
1432
1433
5050.72.1 by Martin Pool
Set email address from /etc/mailname if possible
1434
def _get_default_mail_domain():
1435
    """If possible, return the assumed default email domain.
1436
1437
    :returns: string mail domain, or None.
1438
    """
1439
    if sys.platform == 'win32':
1440
        # No implementation yet; patches welcome
1441
        return None
1442
    try:
1443
        f = open('/etc/mailname')
1444
    except (IOError, OSError), e:
1445
        return None
1446
    try:
1447
        domain = f.read().strip()
1448
        return domain
1449
    finally:
1450
        f.close()
1451
1452
1453
def _auto_user_id():
1454
    """Calculate automatic user identification.
1455
1456
    :returns: (realname, email), either of which may be None if they can't be
1457
    determined.
1458
1459
    Only used when none is set in the environment or the id file.
1460
1461
    This only returns an email address if we can be fairly sure the 
1462
    address is reasonable, ie if /etc/mailname is set on unix.
1463
1464
    This doesn't use the FQDN as the default domain because that may be 
1465
    slow, and it doesn't use the hostname alone because that's not normally 
1466
    a reasonable address.
1467
    """
1468
    if sys.platform == 'win32':
1469
        # No implementation to reliably determine Windows default mail
1470
        # address; please add one.
1471
        return None, None
1472
1473
    default_mail_domain = _get_default_mail_domain()
1474
    if not default_mail_domain:
1475
        return None, None
1476
1477
    import pwd
1478
    uid = os.getuid()
1479
    try:
1480
        w = pwd.getpwuid(uid)
1481
    except KeyError:
5904.1.2 by Martin Pool
Various pyflakes import fixes.
1482
        trace.mutter('no passwd entry for uid %d?' % uid)
5050.72.1 by Martin Pool
Set email address from /etc/mailname if possible
1483
        return None, None
1484
1485
    # we try utf-8 first, because on many variants (like Linux),
1486
    # /etc/passwd "should" be in utf-8, and because it's unlikely to give
1487
    # false positives.  (many users will have their user encoding set to
1488
    # latin-1, which cannot raise UnicodeError.)
1489
    try:
1490
        gecos = w.pw_gecos.decode('utf-8')
1491
        encoding = 'utf-8'
1492
    except UnicodeError:
1493
        try:
1494
            encoding = osutils.get_user_encoding()
1495
            gecos = w.pw_gecos.decode(encoding)
1496
        except UnicodeError, e:
5904.1.2 by Martin Pool
Various pyflakes import fixes.
1497
            trace.mutter("cannot decode passwd entry %s" % w)
5050.72.1 by Martin Pool
Set email address from /etc/mailname if possible
1498
            return None, None
1499
    try:
1500
        username = w.pw_name.decode(encoding)
1501
    except UnicodeError, e:
5904.1.2 by Martin Pool
Various pyflakes import fixes.
1502
        trace.mutter("cannot decode passwd entry %s" % w)
5050.72.1 by Martin Pool
Set email address from /etc/mailname if possible
1503
        return None, None
1504
1505
    comma = gecos.find(',')
1506
    if comma == -1:
1507
        realname = gecos
1508
    else:
1509
        realname = gecos[:comma]
1510
1511
    return realname, (username + '@' + default_mail_domain)
1512
1513
3063.3.2 by Lukáš Lalinský
Move the name and e-mail address extraction logic to config.parse_username.
1514
def parse_username(username):
1515
    """Parse e-mail username and return a (name, address) tuple."""
1516
    match = re.match(r'(.*?)\s*<?([\w+.-]+@[\w+.-]+)>?', username)
1517
    if match is None:
1518
        return (username, '')
1519
    else:
1520
        return (match.group(1), match.group(2))
1521
1522
1185.16.52 by Martin Pool
- add extract_email_address
1523
def extract_email_address(e):
1524
    """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.
1525
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
1526
    That is just the user@domain part, nothing else.
1185.16.52 by Martin Pool
- add extract_email_address
1527
    This part is required to contain only ascii characters.
1528
    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.
1529
1185.16.52 by Martin Pool
- add extract_email_address
1530
    >>> extract_email_address('Jane Tester <jane@test.com>')
1531
    "jane@test.com"
1532
    """
3063.3.2 by Lukáš Lalinský
Move the name and e-mail address extraction logic to config.parse_username.
1533
    name, email = parse_username(e)
1534
    if not email:
2055.2.2 by John Arbash Meinel
Switch extract_email_address() to use a more specific exception
1535
        raise errors.NoEmailInUsername(e)
3063.3.2 by Lukáš Lalinský
Move the name and e-mail address extraction logic to config.parse_username.
1536
    return email
1185.35.11 by Aaron Bentley
Added support for branch nicks
1537
1185.85.30 by John Arbash Meinel
Fixing 'bzr push' exposed that IniBasedConfig didn't handle unicode.
1538
1770.2.5 by Aaron Bentley
Integrate branch.conf into BranchConfig
1539
class TreeConfig(IniBasedConfig):
1185.35.11 by Aaron Bentley
Added support for branch nicks
1540
    """Branch configuration data associated with its contents, not location"""
2900.2.3 by Vincent Ladeuil
Credentials matching implementation.
1541
3408.3.1 by Martin Pool
Remove erroneous handling of branch.conf for RemoteBranch
1542
    # XXX: Really needs a better name, as this is not part of the tree! -- mbp 20080507
1543
1185.35.11 by Aaron Bentley
Added support for branch nicks
1544
    def __init__(self, branch):
4226.1.5 by Robert Collins
Reinstate the use of the Branch.get_config_file verb.
1545
        self._config = branch._get_config()
1185.35.11 by Aaron Bentley
Added support for branch nicks
1546
        self.branch = branch
1547
1770.2.5 by Aaron Bentley
Integrate branch.conf into BranchConfig
1548
    def _get_parser(self, file=None):
1549
        if file is not None:
1550
            return IniBasedConfig._get_parser(file)
3242.1.2 by Aaron Bentley
Turn BzrDirConfig into TransportConfig, reduce code duplication
1551
        return self._config._get_configobj()
1185.35.11 by Aaron Bentley
Added support for branch nicks
1552
1553
    def get_option(self, name, section=None, default=None):
1554
        self.branch.lock_read()
1555
        try:
3242.1.2 by Aaron Bentley
Turn BzrDirConfig into TransportConfig, reduce code duplication
1556
            return self._config.get_option(name, section, default)
1185.35.11 by Aaron Bentley
Added support for branch nicks
1557
        finally:
1558
            self.branch.unlock()
1559
1560
    def set_option(self, value, name, section=None):
1561
        """Set a per-branch configuration option"""
5447.4.11 by Vincent Ladeuil
Implement ``bzr config --remove <option>``.
1562
        # FIXME: We shouldn't need to lock explicitly here but rather rely on
1563
        # higher levels providing the right lock -- vila 20101004
1185.35.11 by Aaron Bentley
Added support for branch nicks
1564
        self.branch.lock_write()
1565
        try:
3242.1.2 by Aaron Bentley
Turn BzrDirConfig into TransportConfig, reduce code duplication
1566
            self._config.set_option(value, name, section)
1185.35.11 by Aaron Bentley
Added support for branch nicks
1567
        finally:
1568
            self.branch.unlock()
2900.2.3 by Vincent Ladeuil
Credentials matching implementation.
1569
5447.4.11 by Vincent Ladeuil
Implement ``bzr config --remove <option>``.
1570
    def remove_option(self, option_name, section_name=None):
1571
        # FIXME: We shouldn't need to lock explicitly here but rather rely on
1572
        # higher levels providing the right lock -- vila 20101004
1573
        self.branch.lock_write()
1574
        try:
1575
            self._config.remove_option(option_name, section_name)
1576
        finally:
1577
            self.branch.unlock()
1578
2900.2.3 by Vincent Ladeuil
Credentials matching implementation.
1579
1580
class AuthenticationConfig(object):
1581
    """The authentication configuration file based on a ini file.
1582
1583
    Implements the authentication.conf file described in
1584
    doc/developers/authentication-ring.txt.
1585
    """
1586
1587
    def __init__(self, _file=None):
2900.2.4 by Vincent Ladeuil
Cosmetic changes.
1588
        self._config = None # The ConfigObj
2900.2.3 by Vincent Ladeuil
Credentials matching implementation.
1589
        if _file is None:
2900.2.24 by Vincent Ladeuil
Review feedback.
1590
            self._filename = authentication_config_filename()
1591
            self._input = self._filename = authentication_config_filename()
2900.2.3 by Vincent Ladeuil
Credentials matching implementation.
1592
        else:
2900.2.24 by Vincent Ladeuil
Review feedback.
1593
            # Tests can provide a string as _file
1594
            self._filename = None
2900.2.3 by Vincent Ladeuil
Credentials matching implementation.
1595
            self._input = _file
1596
1597
    def _get_config(self):
1598
        if self._config is not None:
1599
            return self._config
1600
        try:
2900.2.22 by Vincent Ladeuil
Polishing.
1601
            # FIXME: Should we validate something here ? Includes: empty
1602
            # sections are useless, at least one of
1603
            # user/password/password_encoding should be defined, etc.
2900.2.4 by Vincent Ladeuil
Cosmetic changes.
1604
1605
            # Note: the encoding below declares that the file itself is utf-8
1606
            # encoded, but the values in the ConfigObj are always Unicode.
2900.2.3 by Vincent Ladeuil
Credentials matching implementation.
1607
            self._config = ConfigObj(self._input, encoding='utf-8')
1608
        except configobj.ConfigObjError, e:
1609
            raise errors.ParseConfigError(e.errors, e.config.filename)
1610
        return self._config
1611
2900.2.5 by Vincent Ladeuil
ake ftp aware of authentication config.
1612
    def _save(self):
1613
        """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.
1614
        conf_dir = os.path.dirname(self._filename)
2900.2.5 by Vincent Ladeuil
ake ftp aware of authentication config.
1615
        ensure_config_dir_exists(conf_dir)
4708.2.2 by Martin
Workingtree changes sitting around since November, more explict closing of files in bzrlib
1616
        f = file(self._filename, 'wb')
1617
        try:
1618
            self._get_config().write(f)
1619
        finally:
1620
            f.close()
2900.2.5 by Vincent Ladeuil
ake ftp aware of authentication config.
1621
1622
    def _set_option(self, section_name, option_name, value):
1623
        """Set an authentication configuration option"""
1624
        conf = self._get_config()
1625
        section = conf.get(section_name)
1626
        if section is None:
1627
            conf[section] = {}
1628
            section = conf[section]
1629
        section[option_name] = value
1630
        self._save()
1631
4081.1.1 by Jean-Francois Roy
A 'realm' optional argument was added to the get_credentials and set_credentials
1632
    def get_credentials(self, scheme, host, port=None, user=None, path=None, 
1633
                        realm=None):
2900.2.4 by Vincent Ladeuil
Cosmetic changes.
1634
        """Returns the matching credentials from authentication.conf file.
1635
1636
        :param scheme: protocol
1637
1638
        :param host: the server address
1639
1640
        :param port: the associated port (optional)
1641
1642
        :param user: login (optional)
1643
1644
        :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
1645
        
1646
        :param realm: the http authentication realm (optional)
2900.2.4 by Vincent Ladeuil
Cosmetic changes.
1647
2900.2.15 by Vincent Ladeuil
AuthenticationConfig can be queried for logins too (first step).
1648
        :return: A dict containing the matching credentials or None.
2900.2.4 by Vincent Ladeuil
Cosmetic changes.
1649
           This includes:
1650
           - name: the section name of the credentials in the
1651
             authentication.conf file,
4081.1.1 by Jean-Francois Roy
A 'realm' optional argument was added to the get_credentials and set_credentials
1652
           - 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.
1653
           - scheme: the server protocol,
1654
           - host: the server address,
1655
           - port: the server port (can be None),
1656
           - path: the absolute server path (can be None),
1657
           - realm: the http specific authentication realm (can be None),
2900.2.15 by Vincent Ladeuil
AuthenticationConfig can be queried for logins too (first step).
1658
           - password: the decoded password, could be None if the credential
1659
             defines only the user
2900.2.4 by Vincent Ladeuil
Cosmetic changes.
1660
           - verify_certificates: https specific, True if the server
1661
             certificate should be verified, False otherwise.
1662
        """
2900.2.3 by Vincent Ladeuil
Credentials matching implementation.
1663
        credentials = None
1664
        for auth_def_name, auth_def in self._get_config().items():
3418.2.1 by Vincent Ladeuil
Fix #217650 by catching declarations outside sections.
1665
            if type(auth_def) is not configobj.Section:
1666
                raise ValueError("%s defined outside a section" % auth_def_name)
1667
2900.2.5 by Vincent Ladeuil
ake ftp aware of authentication config.
1668
            a_scheme, a_host, a_user, a_path = map(
1669
                auth_def.get, ['scheme', 'host', 'user', 'path'])
2900.2.4 by Vincent Ladeuil
Cosmetic changes.
1670
2900.2.5 by Vincent Ladeuil
ake ftp aware of authentication config.
1671
            try:
1672
                a_port = auth_def.as_int('port')
1673
            except KeyError:
1674
                a_port = None
2900.2.22 by Vincent Ladeuil
Polishing.
1675
            except ValueError:
1676
                raise ValueError("'port' not numeric in %s" % auth_def_name)
2900.2.4 by Vincent Ladeuil
Cosmetic changes.
1677
            try:
1678
                a_verify_certificates = auth_def.as_bool('verify_certificates')
1679
            except KeyError:
1680
                a_verify_certificates = True
2900.2.22 by Vincent Ladeuil
Polishing.
1681
            except ValueError:
1682
                raise ValueError(
1683
                    "'verify_certificates' not boolean in %s" % auth_def_name)
2900.2.4 by Vincent Ladeuil
Cosmetic changes.
1684
1685
            # Attempt matching
2900.2.3 by Vincent Ladeuil
Credentials matching implementation.
1686
            if a_scheme is not None and scheme != a_scheme:
1687
                continue
1688
            if a_host is not None:
1689
                if not (host == a_host
1690
                        or (a_host.startswith('.') and host.endswith(a_host))):
1691
                    continue
2900.2.4 by Vincent Ladeuil
Cosmetic changes.
1692
            if a_port is not None and port != a_port:
2900.2.3 by Vincent Ladeuil
Credentials matching implementation.
1693
                continue
1694
            if (a_path is not None and path is not None
1695
                and not path.startswith(a_path)):
1696
                continue
1697
            if (a_user is not None and user is not None
1698
                and a_user != user):
2900.2.10 by Vincent Ladeuil
Add -Dauth handling.
1699
                # Never contradict the caller about the user to be used
2900.2.3 by Vincent Ladeuil
Credentials matching implementation.
1700
                continue
2900.2.15 by Vincent Ladeuil
AuthenticationConfig can be queried for logins too (first step).
1701
            if a_user is None:
2900.2.3 by Vincent Ladeuil
Credentials matching implementation.
1702
                # Can't find a user
1703
                continue
4081.1.1 by Jean-Francois Roy
A 'realm' optional argument was added to the get_credentials and set_credentials
1704
            # Prepare a credentials dictionary with additional keys
1705
            # for the credential providers
2900.2.24 by Vincent Ladeuil
Review feedback.
1706
            credentials = dict(name=auth_def_name,
3418.4.2 by Vincent Ladeuil
Fix bug #199440 by taking into account that a section may not
1707
                               user=a_user,
4081.1.1 by Jean-Francois Roy
A 'realm' optional argument was added to the get_credentials and set_credentials
1708
                               scheme=a_scheme,
1709
                               host=host,
1710
                               port=port,
1711
                               path=path,
1712
                               realm=realm,
3418.4.2 by Vincent Ladeuil
Fix bug #199440 by taking into account that a section may not
1713
                               password=auth_def.get('password', None),
2900.2.24 by Vincent Ladeuil
Review feedback.
1714
                               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
1715
            # Decode the password in the credentials (or get one)
2900.2.22 by Vincent Ladeuil
Polishing.
1716
            self.decode_password(credentials,
1717
                                 auth_def.get('password_encoding', None))
2900.2.10 by Vincent Ladeuil
Add -Dauth handling.
1718
            if 'auth' in debug.debug_flags:
1719
                trace.mutter("Using authentication section: %r", auth_def_name)
2900.2.3 by Vincent Ladeuil
Credentials matching implementation.
1720
            break
1721
4283.1.1 by Jelmer Vernooij
Support fallback credential stores.
1722
        if credentials is None:
1723
            # No credentials were found in authentication.conf, try the fallback
1724
            # credentials stores.
1725
            credentials = credential_store_registry.get_fallback_credentials(
1726
                scheme, host, port, user, path, realm)
1727
2900.2.3 by Vincent Ladeuil
Credentials matching implementation.
1728
        return credentials
1729
3777.3.2 by Aaron Bentley
Reverse order of scheme and password
1730
    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
1731
                        port=None, path=None, verify_certificates=None,
1732
                        realm=None):
3777.3.1 by Aaron Bentley
Update docs
1733
        """Set authentication credentials for a host.
1734
1735
        Any existing credentials with matching scheme, host, port and path
1736
        will be deleted, regardless of name.
1737
1738
        :param name: An arbitrary name to describe this set of credentials.
1739
        :param host: Name of the host that accepts these credentials.
1740
        :param user: The username portion of these credentials.
1741
        :param scheme: The URL scheme (e.g. ssh, http) the credentials apply
1742
            to.
3777.3.2 by Aaron Bentley
Reverse order of scheme and password
1743
        :param password: Password portion of these credentials.
3777.3.1 by Aaron Bentley
Update docs
1744
        :param port: The IP port on the host that these credentials apply to.
1745
        :param path: A filesystem path on the host that these credentials
1746
            apply to.
1747
        :param verify_certificates: On https, verify server certificates if
1748
            True.
4081.1.1 by Jean-Francois Roy
A 'realm' optional argument was added to the get_credentials and set_credentials
1749
        :param realm: The http authentication realm (optional).
3777.3.1 by Aaron Bentley
Update docs
1750
        """
3777.1.8 by Aaron Bentley
Commit work-in-progress
1751
        values = {'host': host, 'user': user}
1752
        if password is not None:
1753
            values['password'] = password
1754
        if scheme is not None:
1755
            values['scheme'] = scheme
1756
        if port is not None:
1757
            values['port'] = '%d' % port
1758
        if path is not None:
1759
            values['path'] = path
3777.1.10 by Aaron Bentley
Ensure credentials are stored
1760
        if verify_certificates is not None:
1761
            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
1762
        if realm is not None:
1763
            values['realm'] = realm
3777.1.11 by Aaron Bentley
Ensure changed-name updates clear old values
1764
        config = self._get_config()
1765
        for_deletion = []
1766
        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
1767
            for key in ('scheme', 'host', 'port', 'path', 'realm'):
3777.1.11 by Aaron Bentley
Ensure changed-name updates clear old values
1768
                if existing_values.get(key) != values.get(key):
1769
                    break
1770
            else:
1771
                del config[section]
1772
        config.update({name: values})
3777.1.10 by Aaron Bentley
Ensure credentials are stored
1773
        self._save()
3777.1.8 by Aaron Bentley
Commit work-in-progress
1774
4304.2.1 by Vincent Ladeuil
Fix bug #367726 by reverting some default user handling introduced
1775
    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.
1776
                 prompt=None, ask=False, default=None):
2900.2.15 by Vincent Ladeuil
AuthenticationConfig can be queried for logins too (first step).
1777
        """Get a user from authentication file.
1778
1779
        :param scheme: protocol
1780
1781
        :param host: the server address
1782
1783
        :param port: the associated port (optional)
1784
1785
        :param realm: the realm sent by the server (optional)
1786
1787
        :param path: the absolute path on the server (optional)
1788
4222.3.4 by Jelmer Vernooij
Default to getpass.getuser() in AuthenticationConfig.get_user(), but allow
1789
        :param ask: Ask the user if there is no explicitly configured username 
1790
                    (optional)
1791
4304.2.1 by Vincent Ladeuil
Fix bug #367726 by reverting some default user handling introduced
1792
        :param default: The username returned if none is defined (optional).
1793
2900.2.15 by Vincent Ladeuil
AuthenticationConfig can be queried for logins too (first step).
1794
        :return: The found user.
1795
        """
2900.2.16 by Vincent Ladeuil
Make hhtp proxy aware of AuthenticationConfig (for password).
1796
        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
1797
                                           path=path, realm=realm)
2900.2.15 by Vincent Ladeuil
AuthenticationConfig can be queried for logins too (first step).
1798
        if credentials is not None:
1799
            user = credentials['user']
1800
        else:
1801
            user = None
4222.3.2 by Jelmer Vernooij
Prompt for user names if they are not in the configuration.
1802
        if user is None:
4222.3.4 by Jelmer Vernooij
Default to getpass.getuser() in AuthenticationConfig.get_user(), but allow
1803
            if ask:
1804
                if prompt is None:
1805
                    # Create a default prompt suitable for most cases
5923.1.3 by Vincent Ladeuil
Even more unicode prompts fixes revealed by pqm.
1806
                    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
1807
                # Special handling for optional fields in the prompt
1808
                if port is not None:
1809
                    prompt_host = '%s:%d' % (host, port)
1810
                else:
1811
                    prompt_host = host
1812
                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.
1813
            else:
4222.3.10 by Jelmer Vernooij
Avoid using the default username in the case of SMTP.
1814
                user = default
2900.2.15 by Vincent Ladeuil
AuthenticationConfig can be queried for logins too (first step).
1815
        return user
1816
2900.2.12 by Vincent Ladeuil
Since all schemes query AuthenticationConfig then prompt user, make that
1817
    def get_password(self, scheme, host, user, port=None,
1818
                     realm=None, path=None, prompt=None):
1819
        """Get a password from authentication file or prompt the user for one.
1820
1821
        :param scheme: protocol
1822
1823
        :param host: the server address
1824
1825
        :param port: the associated port (optional)
1826
1827
        :param user: login
1828
1829
        :param realm: the realm sent by the server (optional)
1830
1831
        :param path: the absolute path on the server (optional)
1832
1833
        :return: The found password or the one entered by the user.
1834
        """
4081.1.1 by Jean-Francois Roy
A 'realm' optional argument was added to the get_credentials and set_credentials
1835
        credentials = self.get_credentials(scheme, host, port, user, path,
1836
                                           realm)
2900.2.12 by Vincent Ladeuil
Since all schemes query AuthenticationConfig then prompt user, make that
1837
        if credentials is not None:
1838
            password = credentials['password']
3420.1.3 by Vincent Ladeuil
John's review feedback.
1839
            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.
1840
                trace.warning('password ignored in section [%s],'
1841
                              ' use an ssh agent instead'
1842
                              % credentials['name'])
1843
                password = None
2900.2.16 by Vincent Ladeuil
Make hhtp proxy aware of AuthenticationConfig (for password).
1844
        else:
1845
            password = None
2900.2.19 by Vincent Ladeuil
Mention proxy and https in the password prompts, with tests.
1846
        # 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).
1847
        if password is None:
2900.2.12 by Vincent Ladeuil
Since all schemes query AuthenticationConfig then prompt user, make that
1848
            if prompt is None:
3420.1.2 by Vincent Ladeuil
Fix bug #203186 by ignoring passwords for ssh and warning user.
1849
                # Create a default prompt suitable for most cases
5923.1.3 by Vincent Ladeuil
Even more unicode prompts fixes revealed by pqm.
1850
                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
1851
            # Special handling for optional fields in the prompt
1852
            if port is not None:
1853
                prompt_host = '%s:%d' % (host, port)
1854
            else:
1855
                prompt_host = host
2900.2.19 by Vincent Ladeuil
Mention proxy and https in the password prompts, with tests.
1856
            password = ui.ui_factory.get_password(prompt,
1857
                                                  host=prompt_host, user=user)
2900.2.12 by Vincent Ladeuil
Since all schemes query AuthenticationConfig then prompt user, make that
1858
        return password
1859
2900.2.22 by Vincent Ladeuil
Polishing.
1860
    def decode_password(self, credentials, encoding):
3757.3.1 by Vincent Ladeuil
Add credential stores plugging.
1861
        try:
1862
            cs = credential_store_registry.get_credential_store(encoding)
1863
        except KeyError:
1864
            raise ValueError('%r is not a known password_encoding' % encoding)
1865
        credentials['password'] = cs.decode_password(credentials)
2900.2.22 by Vincent Ladeuil
Polishing.
1866
        return credentials
3242.1.1 by Aaron Bentley
Implement BzrDir configuration
1867
3242.3.17 by Aaron Bentley
Whitespace cleanup
1868
3757.3.1 by Vincent Ladeuil
Add credential stores plugging.
1869
class CredentialStoreRegistry(registry.Registry):
1870
    """A class that registers credential stores.
1871
1872
    A credential store provides access to credentials via the password_encoding
1873
    field in authentication.conf sections.
1874
4283.1.1 by Jelmer Vernooij
Support fallback credential stores.
1875
    Except for stores provided by bzr itself, most stores are expected to be
3757.3.1 by Vincent Ladeuil
Add credential stores plugging.
1876
    provided by plugins that will therefore use
1877
    register_lazy(password_encoding, module_name, member_name, help=help,
4283.1.1 by Jelmer Vernooij
Support fallback credential stores.
1878
    fallback=fallback) to install themselves.
4283.2.1 by Vincent Ladeuil
Add a test and cleanup some PEP8 issues.
1879
1880
    A fallback credential store is one that is queried if no credentials can be
1881
    found via authentication.conf.
3757.3.1 by Vincent Ladeuil
Add credential stores plugging.
1882
    """
1883
1884
    def get_credential_store(self, encoding=None):
1885
        cs = self.get(encoding)
1886
        if callable(cs):
1887
            cs = cs()
1888
        return cs
1889
4283.1.2 by Jelmer Vernooij
Add tests, NEWS item.
1890
    def is_fallback(self, name):
4283.2.1 by Vincent Ladeuil
Add a test and cleanup some PEP8 issues.
1891
        """Check if the named credentials store should be used as fallback."""
4283.1.2 by Jelmer Vernooij
Add tests, NEWS item.
1892
        return self.get_info(name)
1893
4283.1.1 by Jelmer Vernooij
Support fallback credential stores.
1894
    def get_fallback_credentials(self, scheme, host, port=None, user=None,
4283.1.2 by Jelmer Vernooij
Add tests, NEWS item.
1895
                                 path=None, realm=None):
1896
        """Request credentials from all fallback credentials stores.
4283.2.1 by Vincent Ladeuil
Add a test and cleanup some PEP8 issues.
1897
1898
        The first credentials store that can provide credentials wins.
4283.1.2 by Jelmer Vernooij
Add tests, NEWS item.
1899
        """
4283.2.1 by Vincent Ladeuil
Add a test and cleanup some PEP8 issues.
1900
        credentials = None
4283.1.1 by Jelmer Vernooij
Support fallback credential stores.
1901
        for name in self.keys():
4283.1.2 by Jelmer Vernooij
Add tests, NEWS item.
1902
            if not self.is_fallback(name):
4283.1.1 by Jelmer Vernooij
Support fallback credential stores.
1903
                continue
1904
            cs = self.get_credential_store(name)
4283.2.1 by Vincent Ladeuil
Add a test and cleanup some PEP8 issues.
1905
            credentials = cs.get_credentials(scheme, host, port, user,
1906
                                             path, realm)
4283.1.1 by Jelmer Vernooij
Support fallback credential stores.
1907
            if credentials is not None:
4283.2.1 by Vincent Ladeuil
Add a test and cleanup some PEP8 issues.
1908
                # We found some credentials
1909
                break
1910
        return credentials
4283.1.1 by Jelmer Vernooij
Support fallback credential stores.
1911
1912
    def register(self, key, obj, help=None, override_existing=False,
4283.2.1 by Vincent Ladeuil
Add a test and cleanup some PEP8 issues.
1913
                 fallback=False):
4283.1.1 by Jelmer Vernooij
Support fallback credential stores.
1914
        """Register a new object to a name.
1915
1916
        :param key: This is the key to use to request the object later.
1917
        :param obj: The object to register.
1918
        :param help: Help text for this entry. This may be a string or
1919
                a callable. If it is a callable, it should take two
1920
                parameters (registry, key): this registry and the key that
1921
                the help was registered under.
1922
        :param override_existing: Raise KeyErorr if False and something has
1923
                already been registered for that key. If True, ignore if there
1924
                is an existing key (always register the new value).
1925
        :param fallback: Whether this credential store should be 
1926
                used as fallback.
1927
        """
4283.2.1 by Vincent Ladeuil
Add a test and cleanup some PEP8 issues.
1928
        return super(CredentialStoreRegistry,
1929
                     self).register(key, obj, help, info=fallback,
1930
                                    override_existing=override_existing)
4283.1.1 by Jelmer Vernooij
Support fallback credential stores.
1931
1932
    def register_lazy(self, key, module_name, member_name,
4283.2.1 by Vincent Ladeuil
Add a test and cleanup some PEP8 issues.
1933
                      help=None, override_existing=False,
4283.1.1 by Jelmer Vernooij
Support fallback credential stores.
1934
                      fallback=False):
1935
        """Register a new credential store to be loaded on request.
1936
1937
        :param module_name: The python path to the module. Such as 'os.path'.
1938
        :param member_name: The member of the module to return.  If empty or
1939
                None, get() will return the module itself.
1940
        :param help: Help text for this entry. This may be a string or
1941
                a callable.
1942
        :param override_existing: If True, replace the existing object
1943
                with the new one. If False, if there is already something
1944
                registered with the same key, raise a KeyError
1945
        :param fallback: Whether this credential store should be 
1946
                used as fallback.
1947
        """
1948
        return super(CredentialStoreRegistry, self).register_lazy(
1949
            key, module_name, member_name, help,
1950
            info=fallback, override_existing=override_existing)
1951
3757.3.1 by Vincent Ladeuil
Add credential stores plugging.
1952
1953
credential_store_registry = CredentialStoreRegistry()
1954
1955
1956
class CredentialStore(object):
1957
    """An abstract class to implement storage for credentials"""
1958
1959
    def decode_password(self, credentials):
4283.2.1 by Vincent Ladeuil
Add a test and cleanup some PEP8 issues.
1960
        """Returns a clear text password for the provided credentials."""
3757.3.1 by Vincent Ladeuil
Add credential stores plugging.
1961
        raise NotImplementedError(self.decode_password)
1962
4283.2.1 by Vincent Ladeuil
Add a test and cleanup some PEP8 issues.
1963
    def get_credentials(self, scheme, host, port=None, user=None, path=None,
4283.1.1 by Jelmer Vernooij
Support fallback credential stores.
1964
                        realm=None):
1965
        """Return the matching credentials from this credential store.
1966
1967
        This method is only called on fallback credential stores.
1968
        """
1969
        raise NotImplementedError(self.get_credentials)
1970
1971
3757.3.1 by Vincent Ladeuil
Add credential stores plugging.
1972
1973
class PlainTextCredentialStore(CredentialStore):
5131.2.1 by Martin
Permit bzrlib to run under python -OO by explictly assigning to __doc__ for user-visible docstrings
1974
    __doc__ = """Plain text credential store for the authentication.conf file"""
3757.3.1 by Vincent Ladeuil
Add credential stores plugging.
1975
1976
    def decode_password(self, credentials):
1977
        """See CredentialStore.decode_password."""
1978
        return credentials['password']
1979
1980
1981
credential_store_registry.register('plain', PlainTextCredentialStore,
1982
                                   help=PlainTextCredentialStore.__doc__)
1983
credential_store_registry.default_key = 'plain'
1984
1985
3242.3.14 by Aaron Bentley
Make BzrDirConfig use TransportConfig
1986
class BzrDirConfig(object):
1987
4288.1.1 by Robert Collins
Add support for a RemoteBzrDirConfig to support optimising push operations which need to look for default stacking locations.
1988
    def __init__(self, bzrdir):
1989
        self._bzrdir = bzrdir
1990
        self._config = bzrdir._get_config()
3242.1.1 by Aaron Bentley
Implement BzrDir configuration
1991
3242.3.11 by Aaron Bentley
Clean up BzrDirConfig usage
1992
    def set_default_stack_on(self, value):
1993
        """Set the default stacking location.
1994
1995
        It may be set to a location, or None.
1996
1997
        This policy affects all branches contained by this bzrdir, except for
1998
        those under repositories.
1999
        """
4288.1.1 by Robert Collins
Add support for a RemoteBzrDirConfig to support optimising push operations which need to look for default stacking locations.
2000
        if self._config is None:
2001
            raise errors.BzrError("Cannot set configuration in %s" % self._bzrdir)
3242.3.11 by Aaron Bentley
Clean up BzrDirConfig usage
2002
        if value is None:
3242.3.14 by Aaron Bentley
Make BzrDirConfig use TransportConfig
2003
            self._config.set_option('', 'default_stack_on')
3242.3.11 by Aaron Bentley
Clean up BzrDirConfig usage
2004
        else:
3242.3.14 by Aaron Bentley
Make BzrDirConfig use TransportConfig
2005
            self._config.set_option(value, 'default_stack_on')
3242.3.11 by Aaron Bentley
Clean up BzrDirConfig usage
2006
2007
    def get_default_stack_on(self):
2008
        """Return the default stacking location.
2009
2010
        This will either be a location, or None.
2011
2012
        This policy affects all branches contained by this bzrdir, except for
2013
        those under repositories.
2014
        """
4288.1.1 by Robert Collins
Add support for a RemoteBzrDirConfig to support optimising push operations which need to look for default stacking locations.
2015
        if self._config is None:
2016
            return None
3242.3.14 by Aaron Bentley
Make BzrDirConfig use TransportConfig
2017
        value = self._config.get_option('default_stack_on')
3242.3.11 by Aaron Bentley
Clean up BzrDirConfig usage
2018
        if value == '':
2019
            value = None
2020
        return value
2021
3242.3.14 by Aaron Bentley
Make BzrDirConfig use TransportConfig
2022
2023
class TransportConfig(object):
3242.1.5 by Aaron Bentley
Update per review comments
2024
    """A Config that reads/writes a config file on a Transport.
3242.1.4 by Aaron Bentley
Clean-up
2025
2026
    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.
2027
    that may be associated with a section.  Assigning meaning to these values
2028
    is done at higher levels like TreeConfig.
3242.1.4 by Aaron Bentley
Clean-up
2029
    """
3242.3.14 by Aaron Bentley
Make BzrDirConfig use TransportConfig
2030
2031
    def __init__(self, transport, filename):
2032
        self._transport = transport
2033
        self._filename = filename
2034
3242.1.1 by Aaron Bentley
Implement BzrDir configuration
2035
    def get_option(self, name, section=None, default=None):
2036
        """Return the value associated with a named option.
2037
2038
        :param name: The name of the value
2039
        :param section: The section the option is in (if any)
2040
        :param default: The value to return if the value is not set
2041
        :return: The value or default value
2042
        """
2043
        configobj = self._get_configobj()
2044
        if section is None:
2045
            section_obj = configobj
2046
        else:
2047
            try:
2048
                section_obj = configobj[section]
2049
            except KeyError:
2050
                return default
2051
        return section_obj.get(name, default)
2052
2053
    def set_option(self, value, name, section=None):
2054
        """Set the value associated with a named option.
2055
2056
        :param value: The value to set
2057
        :param name: The name of the value to set
2058
        :param section: The section the option is in (if any)
2059
        """
2060
        configobj = self._get_configobj()
2061
        if section is None:
2062
            configobj[name] = value
2063
        else:
2064
            configobj.setdefault(section, {})[name] = value
2065
        self._set_configobj(configobj)
2066
5447.4.11 by Vincent Ladeuil
Implement ``bzr config --remove <option>``.
2067
    def remove_option(self, option_name, section_name=None):
2068
        configobj = self._get_configobj()
2069
        if section_name is None:
2070
            del configobj[option_name]
2071
        else:
2072
            del configobj[section_name][option_name]
2073
        self._set_configobj(configobj)
2074
4288.1.2 by Robert Collins
Create a server verb for doing BzrDir.get_config()
2075
    def _get_config_file(self):
2076
        try:
4852.1.10 by John Arbash Meinel
Use a StringIO instead, otherwise we get failures with smart server requests.
2077
            return StringIO(self._transport.get_bytes(self._filename))
4288.1.2 by Robert Collins
Create a server verb for doing BzrDir.get_config()
2078
        except errors.NoSuchFile:
2079
            return StringIO()
2080
3242.1.1 by Aaron Bentley
Implement BzrDir configuration
2081
    def _get_configobj(self):
4708.2.1 by Martin
Ensure all files opened by bazaar proper are explicitly closed
2082
        f = self._get_config_file()
2083
        try:
2084
            return ConfigObj(f, encoding='utf-8')
2085
        finally:
2086
            f.close()
3242.1.1 by Aaron Bentley
Implement BzrDir configuration
2087
2088
    def _set_configobj(self, configobj):
2089
        out_file = StringIO()
2090
        configobj.write(out_file)
2091
        out_file.seek(0)
2092
        self._transport.put_file(self._filename, out_file)
5447.4.2 by Vincent Ladeuil
Implement the 'brz config' command. Read-only.
2093
2094
5743.3.11 by Vincent Ladeuil
Config sections only implement read access.
2095
class Section(object):
5743.2.1 by Vincent Ladeuil
Basic tests and implementations for read-only and mutable sections.
2096
    """A section defines a dict of options.
2097
2098
    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.
2099
    options. It is *not* a python dict object though and doesn't try to mimic
2100
    its API.
5743.2.1 by Vincent Ladeuil
Basic tests and implementations for read-only and mutable sections.
2101
    """
2102
2103
    def __init__(self, section_id, options):
2104
        self.id = section_id
2105
        # We re-use the dict-like object received
2106
        self.options = options
2107
2108
    def get(self, name, default=None):
2109
        return self.options.get(name, default)
2110
5743.3.12 by Vincent Ladeuil
Add an ad-hoc __repr__.
2111
    def __repr__(self):
2112
        # Mostly for debugging use
5743.4.25 by Vincent Ladeuil
Address review comments by jelmer and poolie.
2113
        return "<config.%s id=%s>" % (self.__class__.__name__, self.id)
5743.3.12 by Vincent Ladeuil
Add an ad-hoc __repr__.
2114
5743.2.3 by Vincent Ladeuil
The option is either new or has an existing value.
2115
5743.3.6 by Vincent Ladeuil
Use a name less likely to be reused.
2116
_NewlyCreatedOption = object()
5743.2.2 by Vincent Ladeuil
Add tests for remove.
2117
"""Was the option created during the MutableSection lifetime"""
5743.2.1 by Vincent Ladeuil
Basic tests and implementations for read-only and mutable sections.
2118
5743.2.3 by Vincent Ladeuil
The option is either new or has an existing value.
2119
5743.3.11 by Vincent Ladeuil
Config sections only implement read access.
2120
class MutableSection(Section):
5743.3.1 by Vincent Ladeuil
Add a docstring and dates to FIXMEs.
2121
    """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.
2122
2123
    def __init__(self, section_id, options):
2124
        super(MutableSection, self).__init__(section_id, options)
2125
        self.orig = {}
2126
2127
    def set(self, name, value):
5743.2.2 by Vincent Ladeuil
Add tests for remove.
2128
        if name not in self.options:
5743.2.3 by Vincent Ladeuil
The option is either new or has an existing value.
2129
            # This is a new option
5743.3.6 by Vincent Ladeuil
Use a name less likely to be reused.
2130
            self.orig[name] = _NewlyCreatedOption
5743.2.3 by Vincent Ladeuil
The option is either new or has an existing value.
2131
        elif name not in self.orig:
5743.2.1 by Vincent Ladeuil
Basic tests and implementations for read-only and mutable sections.
2132
            self.orig[name] = self.get(name, None)
2133
        self.options[name] = value
2134
2135
    def remove(self, name):
2136
        if name not in self.orig:
2137
            self.orig[name] = self.get(name, None)
2138
        del self.options[name]
2139
5743.2.13 by Vincent Ladeuil
Trivial implementations for stores with smoke tests.
2140
5743.2.7 by Vincent Ladeuil
Implement loading a config store from a string or a file.
2141
class Store(object):
2142
    """Abstract interface to persistent storage for configuration options."""
2143
5743.4.25 by Vincent Ladeuil
Address review comments by jelmer and poolie.
2144
    readonly_section_class = Section
5743.4.22 by Vincent Ladeuil
Allow daughter classes to use different Section classes if/when needed.
2145
    mutable_section_class = MutableSection
5743.4.21 by Vincent Ladeuil
All stores should provide _load_from_string to reuse the existing tests.
2146
5743.4.25 by Vincent Ladeuil
Address review comments by jelmer and poolie.
2147
    def is_loaded(self):
2148
        """Returns True if the Store has been loaded.
2149
2150
        This is used to implement lazy loading and ensure the persistent
2151
        storage is queried only when needed.
2152
        """
2153
        raise NotImplementedError(self.is_loaded)
5743.2.7 by Vincent Ladeuil
Implement loading a config store from a string or a file.
2154
2155
    def load(self):
5743.4.25 by Vincent Ladeuil
Address review comments by jelmer and poolie.
2156
        """Loads the Store from persistent storage."""
5743.2.7 by Vincent Ladeuil
Implement loading a config store from a string or a file.
2157
        raise NotImplementedError(self.load)
2158
5743.4.21 by Vincent Ladeuil
All stores should provide _load_from_string to reuse the existing tests.
2159
    def _load_from_string(self, str_or_unicode):
2160
        """Create a store from a string in configobj syntax.
2161
2162
        :param str_or_unicode: A string representing the file content. This will
2163
            be encoded to suit store needs internally.
2164
2165
        This is for tests and should not be used in production unless a
2166
        convincing use case can be demonstrated :)
2167
        """
2168
        raise NotImplementedError(self._load_from_string)
2169
5743.2.10 by Vincent Ladeuil
Implement store.get_sections() as an iterator and provides the configobj implementation.
2170
    def save(self):
5743.4.25 by Vincent Ladeuil
Address review comments by jelmer and poolie.
2171
        """Saves the Store to persistent storage."""
5743.4.10 by Vincent Ladeuil
Fix copy/paste, bad.
2172
        raise NotImplementedError(self.save)
5743.2.10 by Vincent Ladeuil
Implement store.get_sections() as an iterator and provides the configobj implementation.
2173
5743.5.10 by Vincent Ladeuil
Parametrize the generic tests against the concrete stores.
2174
    def external_url(self):
2175
        raise NotImplementedError(self.external_url)
2176
5743.2.10 by Vincent Ladeuil
Implement store.get_sections() as an iterator and provides the configobj implementation.
2177
    def get_sections(self):
2178
        """Returns an ordered iterable of existing sections.
2179
2180
        :returns: An iterable of (name, dict).
2181
        """
2182
        raise NotImplementedError(self.get_sections)
2183
5743.4.2 by Vincent Ladeuil
Stores don't implement set_option, they just provide a mutable section.
2184
    def get_mutable_section(self, section_name=None):
2185
        """Returns the specified mutable section.
2186
2187
        :param section_name: The section identifier
2188
        """
2189
        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).
2190
5743.4.25 by Vincent Ladeuil
Address review comments by jelmer and poolie.
2191
    def __repr__(self):
2192
        # Mostly for debugging use
5743.5.17 by Vincent Ladeuil
Use external_url to identify stores.
2193
        return "<config.%s(%s)>" % (self.__class__.__name__,
5743.5.18 by Vincent Ladeuil
Fix typo.
2194
                                    self.external_url())
5743.4.25 by Vincent Ladeuil
Address review comments by jelmer and poolie.
2195
2196
2197
class IniFileStore(Store):
2198
    """A config Store using ConfigObj for storage.
2199
2200
    :ivar transport: The transport object where the config file is located.
2201
2202
    :ivar file_name: The config file basename in the transport directory.
2203
2204
    :ivar _config_obj: Private member to hold the ConfigObj instance used to
2205
        serialize/deserialize the config file.
2206
    """
5743.2.7 by Vincent Ladeuil
Implement loading a config store from a string or a file.
2207
2208
    def __init__(self, transport, file_name):
2209
        """A config Store using ConfigObj for storage.
2210
2211
        :param transport: The transport object where the config file is located.
2212
2213
        :param file_name: The config file basename in the transport directory.
2214
        """
5743.4.25 by Vincent Ladeuil
Address review comments by jelmer and poolie.
2215
        super(IniFileStore, self).__init__()
5743.2.7 by Vincent Ladeuil
Implement loading a config store from a string or a file.
2216
        self.transport = transport
2217
        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.
2218
        self._config_obj = None
2219
5743.4.25 by Vincent Ladeuil
Address review comments by jelmer and poolie.
2220
    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.
2221
        return self._config_obj != None
5743.2.7 by Vincent Ladeuil
Implement loading a config store from a string or a file.
2222
5743.4.19 by Vincent Ladeuil
Clarify that only Store.get_mutable_section() can accept an empty file.
2223
    def load(self):
2224
        """Load the store from the associated file."""
5743.4.25 by Vincent Ladeuil
Address review comments by jelmer and poolie.
2225
        if self.is_loaded():
5743.2.7 by Vincent Ladeuil
Implement loading a config store from a string or a file.
2226
            return
5743.4.19 by Vincent Ladeuil
Clarify that only Store.get_mutable_section() can accept an empty file.
2227
        content = self.transport.get_bytes(self.file_name)
5743.4.18 by Vincent Ladeuil
Replace class.from_string with self._load_from_string to all stores can use it.
2228
        self._load_from_string(content)
2229
2230
    def _load_from_string(self, str_or_unicode):
2231
        """Create a config store from a string.
2232
2233
        :param str_or_unicode: A string representing the file content. This will
2234
            be utf-8 encoded internally.
2235
2236
        This is for tests and should not be used in production unless a
2237
        convincing use case can be demonstrated :)
2238
        """
5743.4.25 by Vincent Ladeuil
Address review comments by jelmer and poolie.
2239
        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.
2240
            raise AssertionError('Already loaded: %r' % (self._config_obj,))
2241
        co_input = StringIO(str_or_unicode.encode('utf-8'))
5743.4.3 by Vincent Ladeuil
Implement get_mutable_section.
2242
        try:
5743.2.7 by Vincent Ladeuil
Implement loading a config store from a string or a file.
2243
            # The config files are always stored utf8-encoded
2244
            self._config_obj = ConfigObj(co_input, encoding='utf-8')
2245
        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.
2246
            self._config_obj = None
5743.5.10 by Vincent Ladeuil
Parametrize the generic tests against the concrete stores.
2247
            raise errors.ParseConfigError(e.errors, self.external_url())
5743.2.7 by Vincent Ladeuil
Implement loading a config store from a string or a file.
2248
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.
2249
    def save(self):
5743.4.25 by Vincent Ladeuil
Address review comments by jelmer and poolie.
2250
        if not self.is_loaded():
5743.4.19 by Vincent Ladeuil
Clarify that only Store.get_mutable_section() can accept an empty file.
2251
            # Nothing to save
2252
            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.
2253
        out = StringIO()
2254
        self._config_obj.write(out)
2255
        self.transport.put_bytes(self.file_name, out.getvalue())
2256
5743.5.10 by Vincent Ladeuil
Parametrize the generic tests against the concrete stores.
2257
    def external_url(self):
2258
        # FIXME: external_url should really accepts an optional relpath
2259
        # parameter (bug #750169) :-/ -- vila 2011-04-04
2260
        # The following will do in the interim but maybe we don't want to
2261
        # expose a path here but rather a config ID and its associated
2262
        # object </hand wawe>.
5743.5.13 by Vincent Ladeuil
Merge config-abstract-store into config-concrete-stores resolving conflicts
2263
        return urlutils.join(self.transport.external_url(), self.file_name)
5743.5.10 by Vincent Ladeuil
Parametrize the generic tests against the concrete stores.
2264
5743.2.10 by Vincent Ladeuil
Implement store.get_sections() as an iterator and provides the configobj implementation.
2265
    def get_sections(self):
2266
        """Get the configobj section in the file order.
2267
2268
        :returns: An iterable of (name, dict).
2269
        """
2270
        # We need a loaded store
5743.6.14 by Vincent Ladeuil
Parametrize the Stack tests.
2271
        try:
2272
            self.load()
2273
        except errors.NoSuchFile:
2274
            # If the file doesn't exist, there is no sections
2275
            return
5743.2.10 by Vincent Ladeuil
Implement store.get_sections() as an iterator and provides the configobj implementation.
2276
        cobj = self._config_obj
2277
        if cobj.scalars:
5743.4.22 by Vincent Ladeuil
Allow daughter classes to use different Section classes if/when needed.
2278
            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.
2279
        for section_name in cobj.sections:
5743.4.22 by Vincent Ladeuil
Allow daughter classes to use different Section classes if/when needed.
2280
            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.
2281
5743.4.2 by Vincent Ladeuil
Stores don't implement set_option, they just provide a mutable section.
2282
    def get_mutable_section(self, section_name=None):
5743.2.11 by Vincent Ladeuil
Basic store.set implementation.
2283
        # We need a loaded store
5743.4.19 by Vincent Ladeuil
Clarify that only Store.get_mutable_section() can accept an empty file.
2284
        try:
2285
            self.load()
2286
        except errors.NoSuchFile:
2287
            # The file doesn't exist, let's pretend it was empty
2288
            self._load_from_string('')
5743.2.11 by Vincent Ladeuil
Basic store.set implementation.
2289
        if section_name is None:
2290
            section = self._config_obj
2291
        else:
2292
            section = self._config_obj.setdefault(section_name, {})
5743.4.22 by Vincent Ladeuil
Allow daughter classes to use different Section classes if/when needed.
2293
        return self.mutable_section_class(section_name, section)
5743.2.11 by Vincent Ladeuil
Basic store.set implementation.
2294
5743.2.1 by Vincent Ladeuil
Basic tests and implementations for read-only and mutable sections.
2295
5743.4.16 by Vincent Ladeuil
Some doc for the stores.
2296
# Note that LockableConfigObjStore inherits from ConfigObjStore because we need
2297
# unlockable stores for use with objects that can already ensure the locking
2298
# (think branches). If different stores (not based on ConfigObj) are created,
2299
# they may face the same issue.
2300
2301
5743.4.25 by Vincent Ladeuil
Address review comments by jelmer and poolie.
2302
class LockableIniFileStore(IniFileStore):
5743.4.9 by Vincent Ladeuil
Implement a LockableConfigObjStore to be able to mimick the actual behaviour.
2303
    """A ConfigObjStore using locks on save to ensure store integrity."""
2304
2305
    def __init__(self, transport, file_name, lock_dir_name=None):
2306
        """A config Store using ConfigObj for storage.
2307
2308
        :param transport: The transport object where the config file is located.
2309
2310
        :param file_name: The config file basename in the transport directory.
2311
        """
2312
        if lock_dir_name is None:
2313
            lock_dir_name = 'lock'
2314
        self.lock_dir_name = lock_dir_name
5743.4.25 by Vincent Ladeuil
Address review comments by jelmer and poolie.
2315
        super(LockableIniFileStore, self).__init__(transport, file_name)
5743.4.9 by Vincent Ladeuil
Implement a LockableConfigObjStore to be able to mimick the actual behaviour.
2316
        self._lock = lockdir.LockDir(self.transport, self.lock_dir_name)
2317
2318
    def lock_write(self, token=None):
2319
        """Takes a write lock in the directory containing the config file.
2320
2321
        If the directory doesn't exist it is created.
2322
        """
2323
        # FIXME: This doesn't check the ownership of the created directories as
2324
        # ensure_config_dir_exists does. It should if the transport is local
2325
        # -- vila 2011-04-06
2326
        self.transport.create_prefix()
2327
        return self._lock.lock_write(token)
2328
2329
    def unlock(self):
2330
        self._lock.unlock()
2331
2332
    def break_lock(self):
2333
        self._lock.break_lock()
2334
2335
    @needs_write_lock
2336
    def save(self):
5743.4.25 by Vincent Ladeuil
Address review comments by jelmer and poolie.
2337
        super(LockableIniFileStore, self).save()
5743.4.9 by Vincent Ladeuil
Implement a LockableConfigObjStore to be able to mimick the actual behaviour.
2338
2339
5743.2.13 by Vincent Ladeuil
Trivial implementations for stores with smoke tests.
2340
# FIXME: global, bazaar, shouldn't that be 'user' instead or even
2341
# 'user_defaults' as opposed to 'user_overrides', 'system_defaults'
2342
# (/etc/bzr/bazaar.conf) and 'system_overrides' ? -- vila 2011-04-05
5743.5.15 by Vincent Ladeuil
Mention poolie's point about focusing tests.
2343
2344
# FIXME: Moreover, we shouldn't need classes for these stores either, factory
2345
# functions or a registry will make it easier and clearer for tests, focusing
2346
# on the relevant parts of the API that needs testing -- vila 20110503 (based
2347
# on a poolie's remark)
5743.5.13 by Vincent Ladeuil
Merge config-abstract-store into config-concrete-stores resolving conflicts
2348
class GlobalStore(LockableIniFileStore):
5743.2.13 by Vincent Ladeuil
Trivial implementations for stores with smoke tests.
2349
2350
    def __init__(self, possible_transports=None):
2351
        t = transport.get_transport(config_dir(),
2352
                                    possible_transports=possible_transports)
2353
        super(GlobalStore, self).__init__(t, 'bazaar.conf')
2354
2355
5743.5.13 by Vincent Ladeuil
Merge config-abstract-store into config-concrete-stores resolving conflicts
2356
class LocationStore(LockableIniFileStore):
5743.2.13 by Vincent Ladeuil
Trivial implementations for stores with smoke tests.
2357
2358
    def __init__(self, possible_transports=None):
2359
        t = transport.get_transport(config_dir(),
2360
                                    possible_transports=possible_transports)
5743.5.10 by Vincent Ladeuil
Parametrize the generic tests against the concrete stores.
2361
        super(LocationStore, self).__init__(t, 'locations.conf')
5743.2.13 by Vincent Ladeuil
Trivial implementations for stores with smoke tests.
2362
2363
5743.5.13 by Vincent Ladeuil
Merge config-abstract-store into config-concrete-stores resolving conflicts
2364
class BranchStore(IniFileStore):
5743.2.13 by Vincent Ladeuil
Trivial implementations for stores with smoke tests.
2365
2366
    def __init__(self, branch):
2367
        super(BranchStore, self).__init__(branch.control_transport,
2368
                                          'branch.conf')
2369
5743.2.22 by Vincent Ladeuil
Some minimal SectionMatcher implementation to setup the test infrastucture.
2370
class SectionMatcher(object):
2371
    """Select sections into a given Store.
2372
2373
    This intended to be used to postpone getting an iterable of sections from a
2374
    store.
2375
    """
2376
2377
    def __init__(self, store):
2378
        self.store = store
2379
2380
    def get_sections(self):
5743.2.29 by Vincent Ladeuil
Add doc for the section matchers.
2381
        # 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.
2382
        # sections.
2383
        sections = self.store.get_sections()
5743.2.24 by Vincent Ladeuil
Complete location config helpers with basic tests.
2384
        # Walk the revisions in the order provided
5743.2.22 by Vincent Ladeuil
Some minimal SectionMatcher implementation to setup the test infrastucture.
2385
        for s in sections:
2386
            if self.match(s):
2387
                yield s
2388
2389
    def match(self, secion):
2390
        raise NotImplementedError(self.match)
2391
2392
5743.2.37 by Vincent Ladeuil
Merge config-concrete-stores into config-section-matchers resolving conflicts
2393
class LocationSection(Section):
5743.2.24 by Vincent Ladeuil
Complete location config helpers with basic tests.
2394
2395
    def __init__(self, section, length, extra_path):
2396
        super(LocationSection, self).__init__(section.id, section.options)
2397
        self.length = length
2398
        self.extra_path = extra_path
2399
2400
    def get(self, name, default=None):
2401
        value = super(LocationSection, self).get(name, default)
2402
        if value is not None:
2403
            policy_name = self.get(name + ':policy', None)
2404
            policy = _policy_value.get(policy_name, POLICY_NONE)
2405
            if policy == POLICY_APPENDPATH:
2406
                value = urlutils.join(value, self.extra_path)
2407
        return value
2408
2409
5743.2.22 by Vincent Ladeuil
Some minimal SectionMatcher implementation to setup the test infrastucture.
2410
class LocationMatcher(SectionMatcher):
2411
5743.2.24 by Vincent Ladeuil
Complete location config helpers with basic tests.
2412
    def __init__(self, store, location):
5743.2.22 by Vincent Ladeuil
Some minimal SectionMatcher implementation to setup the test infrastucture.
2413
        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).
2414
        if location.startswith('file://'):
2415
            location = urlutils.local_path_from_url(location)
5743.2.22 by Vincent Ladeuil
Some minimal SectionMatcher implementation to setup the test infrastucture.
2416
        self.location = location
2417
5743.6.15 by Vincent Ladeuil
Don't pollute _iter_for_location_by_parts.
2418
    def _get_matching_sections(self):
2419
        """Get all sections matching ``location``."""
2420
        # We slightly diverge from LocalConfig here by allowing the no-name
2421
        # section as the most generic one and the lower priority.
2422
        no_name_section = None
2423
        sections = []
2424
        # Filter out the no_name_section so _iter_for_location_by_parts can be
2425
        # used (it assumes all sections have a name).
2426
        for section in self.store.get_sections():
2427
            if section.id is None:
2428
                no_name_section = section
2429
            else:
2430
                sections.append(section)
2431
        # Unfortunately _iter_for_location_by_parts deals with section names so
2432
        # we have to resync.
5743.2.31 by Vincent Ladeuil
Both the length and the section id should be used to sort.
2433
        filtered_sections = _iter_for_location_by_parts(
5743.2.27 by Vincent Ladeuil
Merge the use of _filter_for_location_by_parts, uglier, but better for
2434
            [s.id for s in sections], self.location)
2435
        iter_sections = iter(sections)
2436
        matching_sections = []
5743.6.15 by Vincent Ladeuil
Don't pollute _iter_for_location_by_parts.
2437
        if no_name_section is not None:
2438
            matching_sections.append(
2439
                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.
2440
        for section_id, extra_path, length in filtered_sections:
5743.2.27 by Vincent Ladeuil
Merge the use of _filter_for_location_by_parts, uglier, but better for
2441
            # a section id is unique for a given store so it's safe to iterate
2442
            # again
2443
            section = iter_sections.next()
2444
            if section_id == section.id:
2445
                matching_sections.append(
2446
                    LocationSection(section, length, extra_path))
5743.6.15 by Vincent Ladeuil
Don't pollute _iter_for_location_by_parts.
2447
        return matching_sections
2448
2449
    def get_sections(self):
2450
        # Override the default implementation as we want to change the order
2451
        matching_sections = self._get_matching_sections()
5743.2.24 by Vincent Ladeuil
Complete location config helpers with basic tests.
2452
        # 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.
2453
        sections = sorted(matching_sections,
2454
                          key=lambda section: (section.length, section.id),
5743.2.24 by Vincent Ladeuil
Complete location config helpers with basic tests.
2455
                          reverse=True)
2456
        # Sections mentioning 'ignore_parents' restrict the selection
2457
        for section in sections:
2458
            # FIXME: We really want to use as_bool below -- vila 2011-04-07
2459
            ignore = section.get('ignore_parents', None)
2460
            if ignore is not None:
2461
                ignore = ui.bool_from_string(ignore)
2462
            if ignore:
2463
                break
2464
            # Finally, we have a valid section
2465
            yield section
5743.2.22 by Vincent Ladeuil
Some minimal SectionMatcher implementation to setup the test infrastucture.
2466
5743.2.13 by Vincent Ladeuil
Trivial implementations for stores with smoke tests.
2467
5743.1.34 by Vincent Ladeuil
Merge config-section-matchers into config-stack resolving conflicts
2468
class Stack(object):
5743.1.1 by Vincent Ladeuil
Start implementing a config stack.
2469
    """A stack of configurations where an option can be defined"""
2470
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.
2471
    def __init__(self, sections_def, store=None, mutable_section_name=None):
5743.1.11 by Vincent Ladeuil
Properly use MutableSection for write operations.
2472
        """Creates a stack of sections with an optional store for changes.
2473
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.
2474
        :param sections_def: A list of Section or callables that returns an
2475
            iterable of Section. This defines the Sections for the Stack and
2476
            can be called repeatedly if needed.
5743.1.11 by Vincent Ladeuil
Properly use MutableSection for write operations.
2477
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.
2478
        :param store: The optional Store where modifications will be
2479
            recorded. If none is specified, no modifications can be done.
2480
2481
        :param mutable_section_name: The name of the MutableSection where
2482
            changes are recorded. This requires the ``store`` parameter to be
2483
            specified.
5743.1.11 by Vincent Ladeuil
Properly use MutableSection for write operations.
2484
        """
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.
2485
        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.
2486
        self.store = store
2487
        self.mutable_section_name = mutable_section_name
5743.1.1 by Vincent Ladeuil
Start implementing a config stack.
2488
2489
    def get(self, name):
5743.1.16 by Vincent Ladeuil
Allows empty sections and empty section callables.
2490
        """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.
2491
5743.1.16 by Vincent Ladeuil
Allows empty sections and empty section callables.
2492
        This is where we guarantee that sections coming from Store are loaded
2493
        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.
2494
        option exists or get its value, which in turn may require to discover
2495
        in which sections it can be defined. Both of these (section and option
2496
        existence) require loading the store (even partially).
2497
        """
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.
2498
        # FIXME: No caching of options nor sections yet -- vila 20110503
2499
5743.6.17 by Vincent Ladeuil
Clarify comment.
2500
        # Ensuring lazy loading is achieved by delaying section matching (which
2501
        # implies querying the persistent storage) until it can't be avoided
2502
        # anymore by using callables to describe (possibly empty) section
2503
        # 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.
2504
        for section_or_callable in self.sections_def:
5743.1.12 by Vincent Ladeuil
Clarify ConfigStack.get() about lazy evaluation of sections.
2505
            # Each section can expand to multiple ones when a callable is used
2506
            if callable(section_or_callable):
2507
                sections = section_or_callable()
5743.1.9 by Vincent Ladeuil
Fix the issue by allowing delayed section acquisition.
2508
            else:
5743.1.12 by Vincent Ladeuil
Clarify ConfigStack.get() about lazy evaluation of sections.
2509
                sections = [section_or_callable]
2510
            for section in sections:
2511
                value = section.get(name)
2512
                if value is not None:
2513
                    return value
2514
        # No definition was found
2515
        return None
5743.1.1 by Vincent Ladeuil
Start implementing a config stack.
2516
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.
2517
    def _get_mutable_section(self):
2518
        """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.
2519
5743.1.15 by Vincent Ladeuil
Test and implement ConfigStack.remove.
2520
        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.
2521
        this means we won't load the corresponding store before setting a value
2522
        or deleting an option. In practice the store will often be loaded but
5743.6.14 by Vincent Ladeuil
Parametrize the Stack tests.
2523
        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.
2524
        """
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.
2525
        section = self.store.get_mutable_section(self.mutable_section_name)
2526
        return section
2527
2528
    def set(self, name, value):
2529
        """Set a new value for the option."""
2530
        section = self._get_mutable_section()
5743.1.13 by Vincent Ladeuil
Better explain lazy loading and make sure the mutable section respect the design.
2531
        section.set(name, value)
5743.1.7 by Vincent Ladeuil
Simple set implementation.
2532
5743.1.15 by Vincent Ladeuil
Test and implement ConfigStack.remove.
2533
    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.
2534
        """Remove an existing option."""
2535
        section = self._get_mutable_section()
5743.1.15 by Vincent Ladeuil
Test and implement ConfigStack.remove.
2536
        section.remove(name)
2537
5743.1.34 by Vincent Ladeuil
Merge config-section-matchers into config-stack resolving conflicts
2538
    def __repr__(self):
2539
        # Mostly for debugging use
2540
        return "<config.%s(%s)>" % (self.__class__.__name__, id(self))
2541
5743.1.1 by Vincent Ladeuil
Start implementing a config stack.
2542
5743.6.11 by Vincent Ladeuil
Start parameterizing stack tests.
2543
class GlobalStack(Stack):
5743.6.1 by Vincent Ladeuil
Outline concrete stacks and basic smoke tests.
2544
2545
    def __init__(self):
2546
        # Get a GlobalStore
2547
        gstore = GlobalStore()
5743.6.14 by Vincent Ladeuil
Parametrize the Stack tests.
2548
        super(GlobalStack, self).__init__([gstore.get_sections], gstore)
5743.6.1 by Vincent Ladeuil
Outline concrete stacks and basic smoke tests.
2549
2550
5743.6.11 by Vincent Ladeuil
Start parameterizing stack tests.
2551
class LocationStack(Stack):
5743.6.1 by Vincent Ladeuil
Outline concrete stacks and basic smoke tests.
2552
2553
    def __init__(self, location):
2554
        lstore = LocationStore()
2555
        matcher = LocationMatcher(lstore, location)
2556
        gstore = GlobalStore()
2557
        super(LocationStack, self).__init__(
5743.6.14 by Vincent Ladeuil
Parametrize the Stack tests.
2558
            [matcher.get_sections, gstore.get_sections], lstore)
5743.6.1 by Vincent Ladeuil
Outline concrete stacks and basic smoke tests.
2559
2560
5743.6.11 by Vincent Ladeuil
Start parameterizing stack tests.
2561
class BranchStack(Stack):
5743.6.1 by Vincent Ladeuil
Outline concrete stacks and basic smoke tests.
2562
2563
    def __init__(self, branch):
2564
        bstore = BranchStore(branch)
2565
        lstore = LocationStore()
2566
        matcher = LocationMatcher(lstore, branch.base)
2567
        gstore = GlobalStore()
2568
        super(BranchStack, self).__init__(
2569
            [matcher.get_sections, bstore.get_sections, gstore.get_sections],
5743.6.14 by Vincent Ladeuil
Parametrize the Stack tests.
2570
            bstore)
5743.6.1 by Vincent Ladeuil
Outline concrete stacks and basic smoke tests.
2571
2572
5447.4.2 by Vincent Ladeuil
Implement the 'brz config' command. Read-only.
2573
class cmd_config(commands.Command):
5447.4.19 by Vincent Ladeuil
Add some more documentation.
2574
    __doc__ = """Display, set or remove a configuration option.
2575
5506.2.3 by Vincent Ladeuil
Take review comments into account and drive-by fix bug #670251
2576
    Display the active value for a given option.
2577
2578
    If --all is specified, NAME is interpreted as a regular expression and all
2579
    matching options are displayed mentioning their scope. The active value
2580
    that bzr will take into account is the first one displayed for each option.
2581
2582
    If no NAME is given, --all .* is implied.
5506.2.1 by Vincent Ladeuil
Implements ``bzr config --active option`` displaying only the value.
2583
5447.4.19 by Vincent Ladeuil
Add some more documentation.
2584
    Setting a value is achieved by using name=value without spaces. The value
2585
    is set in the most relevant scope and can be checked by displaying the
2586
    option again.
5447.4.2 by Vincent Ladeuil
Implement the 'brz config' command. Read-only.
2587
    """
2588
5506.2.3 by Vincent Ladeuil
Take review comments into account and drive-by fix bug #670251
2589
    takes_args = ['name?']
5447.4.2 by Vincent Ladeuil
Implement the 'brz config' command. Read-only.
2590
2591
    takes_options = [
2592
        'directory',
5447.4.5 by Vincent Ladeuil
Implement ``bzr config option=value``.
2593
        # FIXME: This should be a registry option so that plugins can register
2594
        # their own config files (or not) -- vila 20101002
5447.4.17 by Vincent Ladeuil
Rename config --force to config --scope.
2595
        commands.Option('scope', help='Reduce the scope to the specified'
2596
                        ' configuration file',
2597
                        type=unicode),
5506.2.3 by Vincent Ladeuil
Take review comments into account and drive-by fix bug #670251
2598
        commands.Option('all',
2599
            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.
2600
            ),
5447.4.8 by Vincent Ladeuil
Make the test properly fail and provide a fake implementation for ``bzr config --remove opt_name``.
2601
        commands.Option('remove', help='Remove the option from'
2602
                        ' the configuration file'),
5447.4.2 by Vincent Ladeuil
Implement the 'brz config' command. Read-only.
2603
        ]
2604
2605
    @commands.display_command
5506.2.3 by Vincent Ladeuil
Take review comments into account and drive-by fix bug #670251
2606
    def run(self, name=None, all=False, directory=None, scope=None,
2607
            remove=False):
5447.4.5 by Vincent Ladeuil
Implement ``bzr config option=value``.
2608
        if directory is None:
2609
            directory = '.'
2610
        directory = urlutils.normalize_url(directory)
5506.2.3 by Vincent Ladeuil
Take review comments into account and drive-by fix bug #670251
2611
        if remove and all:
5506.2.1 by Vincent Ladeuil
Implements ``bzr config --active option`` displaying only the value.
2612
            raise errors.BzrError(
5506.2.3 by Vincent Ladeuil
Take review comments into account and drive-by fix bug #670251
2613
                '--all and --remove are mutually exclusive.')
5506.2.1 by Vincent Ladeuil
Implements ``bzr config --active option`` displaying only the value.
2614
        elif remove:
2615
            # Delete the option in the given scope
5506.2.3 by Vincent Ladeuil
Take review comments into account and drive-by fix bug #670251
2616
            self._remove_config_option(name, directory, scope)
2617
        elif name is None:
2618
            # Defaults to all options
2619
            self._show_matching_options('.*', directory, scope)
5447.4.5 by Vincent Ladeuil
Implement ``bzr config option=value``.
2620
        else:
5506.2.1 by Vincent Ladeuil
Implements ``bzr config --active option`` displaying only the value.
2621
            try:
5506.2.3 by Vincent Ladeuil
Take review comments into account and drive-by fix bug #670251
2622
                name, value = name.split('=', 1)
5506.2.1 by Vincent Ladeuil
Implements ``bzr config --active option`` displaying only the value.
2623
            except ValueError:
2624
                # Display the option(s) value(s)
5506.2.3 by Vincent Ladeuil
Take review comments into account and drive-by fix bug #670251
2625
                if all:
2626
                    self._show_matching_options(name, directory, scope)
2627
                else:
2628
                    self._show_value(name, directory, scope)
5447.4.5 by Vincent Ladeuil
Implement ``bzr config option=value``.
2629
            else:
5506.2.3 by Vincent Ladeuil
Take review comments into account and drive-by fix bug #670251
2630
                if all:
2631
                    raise errors.BzrError(
2632
                        'Only one option can be set.')
5506.2.1 by Vincent Ladeuil
Implements ``bzr config --active option`` displaying only the value.
2633
                # Set the option value
2634
                self._set_config_option(name, value, directory, scope)
5447.4.5 by Vincent Ladeuil
Implement ``bzr config option=value``.
2635
5447.4.17 by Vincent Ladeuil
Rename config --force to config --scope.
2636
    def _get_configs(self, directory, scope=None):
2637
        """Iterate the configurations specified by ``directory`` and ``scope``.
5447.4.9 by Vincent Ladeuil
Refactor under tests umbrella.
2638
2639
        :param directory: Where the configurations are derived from.
2640
5447.4.17 by Vincent Ladeuil
Rename config --force to config --scope.
2641
        :param scope: A specific config to start from.
5447.4.9 by Vincent Ladeuil
Refactor under tests umbrella.
2642
        """
5447.4.17 by Vincent Ladeuil
Rename config --force to config --scope.
2643
        if scope is not None:
2644
            if scope == 'bazaar':
5447.4.9 by Vincent Ladeuil
Refactor under tests umbrella.
2645
                yield GlobalConfig()
5447.4.17 by Vincent Ladeuil
Rename config --force to config --scope.
2646
            elif scope == 'locations':
5447.4.9 by Vincent Ladeuil
Refactor under tests umbrella.
2647
                yield LocationConfig(directory)
5447.4.17 by Vincent Ladeuil
Rename config --force to config --scope.
2648
            elif scope == 'branch':
5447.4.9 by Vincent Ladeuil
Refactor under tests umbrella.
2649
                (_, br, _) = bzrdir.BzrDir.open_containing_tree_or_branch(
2650
                    directory)
2651
                yield br.get_config()
2652
        else:
2653
            try:
2654
                (_, br, _) = bzrdir.BzrDir.open_containing_tree_or_branch(
2655
                    directory)
2656
                yield br.get_config()
2657
            except errors.NotBranchError:
2658
                yield LocationConfig(directory)
2659
                yield GlobalConfig()
2660
5506.2.3 by Vincent Ladeuil
Take review comments into account and drive-by fix bug #670251
2661
    def _show_value(self, name, directory, scope):
5506.2.1 by Vincent Ladeuil
Implements ``bzr config --active option`` displaying only the value.
2662
        displayed = False
2663
        for c in self._get_configs(directory, scope):
2664
            if displayed:
2665
                break
5533.2.1 by Vincent Ladeuil
``bzr config`` properly displays list values
2666
            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
2667
                if name == oname:
5533.1.3 by Vincent Ladeuil
Tweak comment as per poolie's suggestion.
2668
                    # 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
2669
5533.1.3 by Vincent Ladeuil
Tweak comment as per poolie's suggestion.
2670
                    # FIXME: We need to use get_user_option to take policies
2671
                    # 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
2672
                    # too (hence the two for loops), this needs a better API
2673
                    # -- vila 20101117
5533.2.1 by Vincent Ladeuil
``bzr config`` properly displays list values
2674
                    value = c.get_user_option(name)
2675
                    # Quote the value appropriately
2676
                    value = parser._quote(value)
2677
                    self.outf.write('%s\n' % (value,))
5506.2.3 by Vincent Ladeuil
Take review comments into account and drive-by fix bug #670251
2678
                    displayed = True
2679
                    break
2680
        if not displayed:
2681
            raise errors.NoSuchConfigOption(name)
2682
2683
    def _show_matching_options(self, name, directory, scope):
2684
        name = re.compile(name)
2685
        # We want any error in the regexp to be raised *now* so we need to
2686
        # avoid the delay introduced by the lazy regexp.
2687
        name._compile_and_collapse()
2688
        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.
2689
        cur_section = None
5506.2.3 by Vincent Ladeuil
Take review comments into account and drive-by fix bug #670251
2690
        for c in self._get_configs(directory, scope):
5533.2.1 by Vincent Ladeuil
``bzr config`` properly displays list values
2691
            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
2692
                if name.search(oname):
2693
                    if cur_conf_id != conf_id:
5506.2.1 by Vincent Ladeuil
Implements ``bzr config --active option`` displaying only the value.
2694
                        # Explain where the options are defined
5447.4.3 by Vincent Ladeuil
Simplify code and design by only defining get_options() where relevant.
2695
                        self.outf.write('%s:\n' % (conf_id,))
2696
                        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.
2697
                        cur_section = None
2698
                    if (section not in (None, 'DEFAULT')
2699
                        and cur_section != section):
2700
                        # Display the section if it's not the default (or only)
2701
                        # one.
5533.2.1 by Vincent Ladeuil
``bzr config`` properly displays list values
2702
                        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.
2703
                        cur_section = section
5506.2.3 by Vincent Ladeuil
Take review comments into account and drive-by fix bug #670251
2704
                    self.outf.write('  %s = %s\n' % (oname, value))
5447.4.2 by Vincent Ladeuil
Implement the 'brz config' command. Read-only.
2705
5447.4.17 by Vincent Ladeuil
Rename config --force to config --scope.
2706
    def _set_config_option(self, name, value, directory, scope):
2707
        for conf in self._get_configs(directory, scope):
5447.4.9 by Vincent Ladeuil
Refactor under tests umbrella.
2708
            conf.set_user_option(name, value)
2709
            break
5447.4.5 by Vincent Ladeuil
Implement ``bzr config option=value``.
2710
        else:
5447.4.17 by Vincent Ladeuil
Rename config --force to config --scope.
2711
            raise errors.NoSuchConfig(scope)
5447.4.5 by Vincent Ladeuil
Implement ``bzr config option=value``.
2712
5447.4.17 by Vincent Ladeuil
Rename config --force to config --scope.
2713
    def _remove_config_option(self, name, directory, scope):
5506.2.1 by Vincent Ladeuil
Implements ``bzr config --active option`` displaying only the value.
2714
        if name is None:
2715
            raise errors.BzrCommandError(
2716
                '--remove expects an option to remove.')
5447.4.9 by Vincent Ladeuil
Refactor under tests umbrella.
2717
        removed = False
5447.4.17 by Vincent Ladeuil
Rename config --force to config --scope.
2718
        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.
2719
            for (section_name, section, conf_id) in conf._get_sections():
5447.4.17 by Vincent Ladeuil
Rename config --force to config --scope.
2720
                if scope is not None and conf_id != scope:
5447.4.11 by Vincent Ladeuil
Implement ``bzr config --remove <option>``.
2721
                    # Not the right configuration file
2722
                    continue
2723
                if name in section:
5447.4.16 by Vincent Ladeuil
Use config_id instead of id as suggested by poolie.
2724
                    if conf_id != conf.config_id():
5447.4.11 by Vincent Ladeuil
Implement ``bzr config --remove <option>``.
2725
                        conf = self._get_configs(directory, conf_id).next()
2726
                    # We use the first section in the first config where the
2727
                    # option is defined to remove it
2728
                    conf.remove_user_option(name, section_name)
2729
                    removed = True
2730
                    break
2731
            break
2732
        else:
5447.4.17 by Vincent Ladeuil
Rename config --force to config --scope.
2733
            raise errors.NoSuchConfig(scope)
5447.4.11 by Vincent Ladeuil
Implement ``bzr config --remove <option>``.
2734
        if not removed:
2735
            raise errors.NoSuchConfigOption(name)