~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/config.py

  • Committer: Martin Pool
  • Date: 2006-06-20 07:55:43 UTC
  • mfrom: (1798 +trunk)
  • mto: This revision was merged to the branch mainline in revision 1799.
  • Revision ID: mbp@sourcefrog.net-20060620075543-b10f6575d4a4fa32
[merge] bzr.dev

Show diffs side-by-side

added added

removed removed

Lines of Context:
18
18
"""Configuration that affects the behaviour of Bazaar.
19
19
 
20
20
Currently this configuration resides in ~/.bazaar/bazaar.conf
21
 
and ~/.bazaar/branches.conf, which is written to by bzr.
 
21
and ~/.bazaar/locations.conf, which is written to by bzr.
22
22
 
23
23
In bazaar.conf the following options may be set:
24
24
[DEFAULT]
29
29
gpg_signing_command=name-of-program
30
30
log_format=name-of-format
31
31
 
32
 
in branches.conf, you specify the url of a branch and options for it.
 
32
in locations.conf, you specify the url of a branch and options for it.
33
33
Wildcards may be used - * and ? as normal in shell completion. Options
34
 
set in both bazaar.conf and branches.conf are overriden by the branches.conf
 
34
set in both bazaar.conf and locations.conf are overridden by the locations.conf
35
35
setting.
36
36
[/home/robertc/source]
37
37
recurse=False|True(default)
38
38
email= as above
39
 
check_signatures= as abive 
 
39
check_signatures= as above 
40
40
create_signatures= as above.
41
41
 
42
42
explanation of options
49
49
create_signatures - this option controls whether bzr will always create 
50
50
                    gpg signatures, never create them, or create them if the
51
51
                    branch is configured to require them.
52
 
                    NB: This option is planned, but not implemented yet.
53
52
log_format - This options set the default log format.  Options are long, 
54
53
             short, line, or a plugin can register new formats
55
54
 
64
63
 
65
64
 
66
65
import errno
 
66
from fnmatch import fnmatch
67
67
import os
 
68
import re
68
69
import sys
69
 
from fnmatch import fnmatch
70
 
import re
 
70
from StringIO import StringIO
71
71
 
72
72
import bzrlib
73
73
import bzrlib.errors as errors
74
74
from bzrlib.osutils import pathjoin
75
 
from bzrlib.trace import mutter
 
75
from bzrlib.trace import mutter, warning
76
76
import bzrlib.util.configobj.configobj as configobj
77
 
from StringIO import StringIO
 
77
 
78
78
 
79
79
CHECK_IF_POSSIBLE=0
80
80
CHECK_ALWAYS=1
81
81
CHECK_NEVER=2
82
82
 
83
83
 
 
84
SIGN_WHEN_REQUIRED=0
 
85
SIGN_ALWAYS=1
 
86
SIGN_NEVER=2
 
87
 
 
88
 
84
89
class ConfigObj(configobj.ConfigObj):
85
90
 
86
91
    def get_bool(self, section, key):
106
111
    def _get_signature_checking(self):
107
112
        """Template method to override signature checking policy."""
108
113
 
 
114
    def _get_signing_policy(self):
 
115
        """Template method to override signature creation policy."""
 
116
 
109
117
    def _get_user_option(self, option_name):
110
118
        """Template method to provide a user option."""
111
119
        return None
192
200
            return policy
193
201
        return CHECK_IF_POSSIBLE
194
202
 
 
203
    def signing_policy(self):
 
204
        """What is the current policy for signature checking?."""
 
205
        policy = self._get_signing_policy()
 
206
        if policy is not None:
 
207
            return policy
 
208
        return SIGN_WHEN_REQUIRED
 
209
 
195
210
    def signature_needed(self):
196
211
        """Is a signature needed when committing ?."""
197
 
        policy = self._get_signature_checking()
198
 
        if policy == CHECK_ALWAYS:
 
212
        policy = self._get_signing_policy()
 
213
        if policy is None:
 
214
            policy = self._get_signature_checking()
 
215
            if policy is not None:
 
216
                warning("Please use create_signatures, not check_signatures "
 
217
                        "to set signing policy.")
 
218
            if policy == CHECK_ALWAYS:
 
219
                return True
 
220
        elif policy == SIGN_ALWAYS:
199
221
            return True
200
222
        return False
201
223
 
232
254
        if policy:
233
255
            return self._string_to_signature_policy(policy)
234
256
 
 
257
    def _get_signing_policy(self):
 
258
        """See Config._get_signing_policy"""
 
259
        policy = self._get_user_option('create_signatures')
 
260
        if policy:
 
261
            return self._string_to_signing_policy(policy)
 
262
 
235
263
    def _get_user_id(self):
236
264
        """Get the user id from the 'email' key in the current section."""
237
265
        return self._get_user_option('email')
272
300
        raise errors.BzrError("Invalid signatures policy '%s'"
273
301
                              % signature_string)
274
302
 
 
303
    def _string_to_signing_policy(self, signature_string):
 
304
        """Convert a string to a signing policy."""
 
305
        if signature_string.lower() == 'when-required':
 
306
            return SIGN_WHEN_REQUIRED
 
307
        if signature_string.lower() == 'never':
 
308
            return SIGN_NEVER
 
309
        if signature_string.lower() == 'always':
 
310
            return SIGN_ALWAYS
 
311
        raise errors.BzrError("Invalid signing policy '%s'"
 
312
                              % signature_string)
 
313
 
275
314
    def _get_alias(self, value):
276
315
        try:
277
316
            return self._get_parser().get_value("ALIASES", 
294
333
    """A configuration object that gives the policy for a location."""
295
334
 
296
335
    def __init__(self, location):
297
 
        super(LocationConfig, self).__init__(branches_config_filename)
 
336
        name_generator = locations_config_filename
 
337
        if (not os.path.exists(name_generator()) and 
 
338
                os.path.exists(branches_config_filename())):
 
339
            warning('Please rename branches.conf to locations.conf')
 
340
            name_generator = branches_config_filename
 
341
        super(LocationConfig, self).__init__(name_generator)
298
342
        self._global_config = None
299
343
        self.location = location
300
344
 
379
423
            return check
380
424
        return self._get_global_config()._get_signature_checking()
381
425
 
 
426
    def _get_signing_policy(self):
 
427
        """See Config._get_signing_policy."""
 
428
        sign = super(LocationConfig, self)._get_signing_policy()
 
429
        if sign is not None:
 
430
            return sign
 
431
        return self._get_global_config()._get_signing_policy()
 
432
 
382
433
    def _post_commit(self):
383
434
        """See Config.post_commit."""
384
435
        hook = self._get_user_option('post_commit')
389
440
    def set_user_option(self, option, value):
390
441
        """Save option and its value in the configuration."""
391
442
        # FIXME: RBC 20051029 This should refresh the parser and also take a
392
 
        # file lock on branches.conf.
 
443
        # file lock on locations.conf.
393
444
        conf_dir = os.path.dirname(self._get_filename())
394
445
        ensure_config_dir_exists(conf_dir)
395
446
        location = self.location
432
483
        """See Config._get_signature_checking."""
433
484
        return self._get_location_config()._get_signature_checking()
434
485
 
 
486
    def _get_signing_policy(self):
 
487
        """See Config._get_signing_policy."""
 
488
        return self._get_location_config()._get_signing_policy()
 
489
 
435
490
    def _get_user_option(self, option_name):
436
491
        """See Config._get_user_option."""
437
492
        return self._get_location_config()._get_user_option(option_name)
486
541
        if base is None:
487
542
            base = os.environ.get('HOME', None)
488
543
        if base is None:
489
 
            raise BzrError('You must have one of BZR_HOME, APPDATA, or HOME set')
 
544
            raise errors.BzrError('You must have one of BZR_HOME, APPDATA, or HOME set')
490
545
        return pathjoin(base, 'bazaar', '2.0')
491
546
    else:
492
547
        # cygwin, linux, and darwin all have a $HOME directory
504
559
    """Return per-user configuration ini file filename."""
505
560
    return pathjoin(config_dir(), 'branches.conf')
506
561
 
 
562
def locations_config_filename():
 
563
    """Return per-user configuration ini file filename."""
 
564
    return pathjoin(config_dir(), 'locations.conf')
 
565
 
507
566
 
508
567
def _auto_user_id():
509
568
    """Calculate automatic user identification.
568
627
                              "a reasonable email address" % e)
569
628
    return m.group(0)
570
629
 
 
630
 
571
631
class TreeConfig(object):
572
632
    """Branch configuration data associated with its contents, not location"""
573
633
    def __init__(self, branch):