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
log_format - This options set the default log format. Options are long,
53
short, line, or a plugin can register new formats
52
log_format - this option sets the default log format. Possible values are
53
long, short, line, or a plugin can register new formats.
55
55
In bazaar.conf you can also define aliases in the ALIASES sections, example
67
from bzrlib.lazy_import import lazy_import
68
lazy_import(globals(), """
66
70
from fnmatch import fnmatch
70
72
from StringIO import StringIO
73
import bzrlib.errors as errors
74
from bzrlib.osutils import pathjoin
81
import bzrlib.util.configobj.configobj as configobj
75
84
from bzrlib.trace import mutter, warning
76
import bzrlib.util.configobj.configobj as configobj
79
87
CHECK_IF_POSSIBLE=0
103
POLICY_NORECURSE: 'norecurse',
104
POLICY_APPENDPATH: 'appendpath',
109
'norecurse': POLICY_NORECURSE,
110
'appendpath': POLICY_APPENDPATH,
114
STORE_LOCATION = POLICY_NONE
115
STORE_LOCATION_NORECURSE = POLICY_NORECURSE
116
STORE_LOCATION_APPENDPATH = POLICY_APPENDPATH
89
121
class ConfigObj(configobj.ConfigObj):
91
123
def get_bool(self, section, key):
250
287
raise errors.ParseConfigError(e.errors, e.config.filename)
251
288
return self._parser
290
def _get_matching_sections(self):
291
"""Return an ordered list of (section_name, extra_path) pairs.
293
If the section contains inherited configuration, extra_path is
294
a string containing the additional path components.
296
section = self._get_section()
297
if section is not None:
298
return [(section, '')]
253
302
def _get_section(self):
254
303
"""Override this to define the section used by the config."""
306
def _get_option_policy(self, section, option_name):
307
"""Return the policy for the given (section, option_name) pair."""
257
310
def _get_signature_checking(self):
258
311
"""See Config._get_signature_checking."""
259
312
policy = self._get_user_option('check_signatures')
273
326
def _get_user_option(self, option_name):
274
327
"""See Config._get_user_option."""
276
return self._get_parser().get_value(self._get_section(),
328
for (section, extra_path) in self._get_matching_sections():
330
value = self._get_parser().get_value(section, option_name)
333
policy = self._get_option_policy(section, option_name)
334
if policy == POLICY_NONE:
336
elif policy == POLICY_NORECURSE:
337
# norecurse items only apply to the exact path
342
elif policy == POLICY_APPENDPATH:
344
value = urlutils.join(value, extra_path)
347
raise AssertionError('Unexpected config policy %r' % policy)
281
351
def _gpg_signing_command(self):
282
352
"""See Config.gpg_signing_command."""
367
437
' to ~/.bazaar/locations.conf')
368
438
name_generator = branches_config_filename
369
439
super(LocationConfig, self).__init__(name_generator)
440
# local file locations are looked up by local path, rather than
441
# by file url. This is because the config file is a user
442
# file, and we would rather not expose the user to file urls.
443
if location.startswith('file://'):
444
location = urlutils.local_path_from_url(location)
370
445
self.location = location
372
def _get_section(self):
373
"""Get the section we should look in for config items.
375
Returns None if none exists.
376
TODO: perhaps return a NullSection that thunks through to the
447
def _get_matching_sections(self):
448
"""Return an ordered list of section names matching this location."""
379
449
sections = self._get_parser()
380
450
location_names = self.location.split('/')
381
451
if self.location.endswith('/'):
382
452
del location_names[-1]
384
454
for section in sections:
385
section_names = section.split('/')
455
# location is a local path if possible, so we need
456
# to convert 'file://' urls to local paths if necessary.
457
# This also avoids having file:///path be a more exact
458
# match than '/path'.
459
if section.startswith('file://'):
460
section_path = urlutils.local_path_from_url(section)
462
section_path = section
463
section_names = section_path.split('/')
386
464
if section.endswith('/'):
387
465
del section_names[-1]
388
466
names = zip(location_names, section_names)
397
475
# if section is longer, no match.
398
476
if len(section_names) > len(location_names):
400
# if path is longer, and recurse is not true, no match
401
if len(section_names) < len(location_names):
403
if not self._get_parser()[section].as_bool('recurse'):
407
matches.append((len(section_names), section))
478
matches.append((len(section_names), section,
479
'/'.join(location_names[len(section_names):])))
410
480
matches.sort(reverse=True)
413
def set_user_option(self, option, value):
482
for (length, section, extra_path) in matches:
483
sections.append((section, extra_path))
484
# should we stop looking for parent configs here?
486
if self._get_parser()[section].as_bool('ignore_parents'):
492
def _get_option_policy(self, section, option_name):
493
"""Return the policy for the given (section, option_name) pair."""
494
# check for the old 'recurse=False' flag
496
recurse = self._get_parser()[section].as_bool('recurse')
500
return POLICY_NORECURSE
502
policy_key = option_name + ':policy'
504
policy_name = self._get_parser()[section][policy_key]
508
return _policy_value[policy_name]
510
def _set_option_policy(self, section, option_name, option_policy):
511
"""Set the policy for the given option name in the given section."""
512
# The old recurse=False option affects all options in the
513
# section. To handle multiple policies in the section, we
514
# need to convert it to a policy_norecurse key.
516
recurse = self._get_parser()[section].as_bool('recurse')
520
symbol_versioning.warn(
521
'The recurse option is deprecated as of 0.14. '
522
'The section "%s" has been converted to use policies.'
525
del self._get_parser()[section]['recurse']
527
for key in self._get_parser()[section].keys():
528
if not key.endswith(':policy'):
529
self._get_parser()[section][key +
530
':policy'] = 'norecurse'
532
policy_key = option_name + ':policy'
533
policy_name = _policy_name[option_policy]
534
if policy_name is not None:
535
self._get_parser()[section][policy_key] = policy_name
537
if policy_key in self._get_parser()[section]:
538
del self._get_parser()[section][policy_key]
540
def set_user_option(self, option, value, store=STORE_LOCATION):
414
541
"""Save option and its value in the configuration."""
542
assert store in [STORE_LOCATION,
543
STORE_LOCATION_NORECURSE,
544
STORE_LOCATION_APPENDPATH], 'bad storage policy'
415
545
# FIXME: RBC 20051029 This should refresh the parser and also take a
416
546
# file lock on locations.conf.
417
547
conf_dir = os.path.dirname(self._get_filename())
508
def set_user_option(self, name, value, local=False):
510
self._get_location_config().set_user_option(name, value)
640
def set_user_option(self, name, value, store=STORE_BRANCH):
641
if store == STORE_BRANCH:
512
642
self._get_branch_data_config().set_option(value, name)
643
elif store == STORE_GLOBAL:
644
self._get_global_config().set_user_option(name, value)
646
self._get_location_config().set_user_option(name, value, store)
515
648
def _gpg_signing_command(self):
516
649
"""See Config.gpg_signing_command."""
581
714
base = os.environ.get('HOME', None)
583
716
raise errors.BzrError('You must have one of BZR_HOME, APPDATA, or HOME set')
584
return pathjoin(base, 'bazaar', '2.0')
717
return osutils.pathjoin(base, 'bazaar', '2.0')
586
719
# cygwin, linux, and darwin all have a $HOME directory
588
721
base = os.path.expanduser("~")
589
return pathjoin(base, ".bazaar")
722
return osutils.pathjoin(base, ".bazaar")
592
725
def config_filename():
593
726
"""Return per-user configuration ini file filename."""
594
return pathjoin(config_dir(), 'bazaar.conf')
727
return osutils.pathjoin(config_dir(), 'bazaar.conf')
597
730
def branches_config_filename():
598
731
"""Return per-user configuration ini file filename."""
599
return pathjoin(config_dir(), 'branches.conf')
732
return osutils.pathjoin(config_dir(), 'branches.conf')
602
735
def locations_config_filename():
603
736
"""Return per-user configuration ini file filename."""
604
return pathjoin(config_dir(), 'locations.conf')
737
return osutils.pathjoin(config_dir(), 'locations.conf')
740
def user_ignore_config_filename():
741
"""Return the user default ignore filename"""
742
return osutils.pathjoin(config_dir(), 'ignore')
607
745
def _auto_user_id():