350
361
class IniBasedConfig(Config):
351
362
"""A configuration policy that draws from ini files."""
353
def __init__(self, get_filename):
364
def __init__(self, get_filename=symbol_versioning.DEPRECATED_PARAMETER,
366
"""Base class for configuration files using an ini-like syntax.
368
:param file_name: The configuration file path.
354
370
super(IniBasedConfig, self).__init__()
355
self._get_filename = get_filename
371
self.file_name = file_name
372
if symbol_versioning.deprecated_passed(get_filename):
373
symbol_versioning.warn(
374
'IniBasedConfig.__init__(get_filename) was deprecated in 2.3.'
375
' Use file_name instead.',
378
if get_filename is not None:
379
self.file_name = get_filename()
381
self.file_name = file_name
356
383
self._parser = None
358
def _get_parser(self, file=None):
386
def from_string(cls, str_or_unicode, file_name=None, save=False):
387
"""Create a config object from a string.
389
:param str_or_unicode: A string representing the file content. This will
392
:param file_name: The configuration file path.
394
:param _save: Whether the file should be saved upon creation.
396
conf = cls(file_name=file_name)
397
conf._create_from_string(str_or_unicode, save)
400
def _create_from_string(self, str_or_unicode, save):
401
self._content = StringIO(str_or_unicode.encode('utf-8'))
402
# Some tests use in-memory configs, some other always need the config
403
# file to exist on disk.
405
self._write_config_file()
407
def _get_parser(self, file=symbol_versioning.DEPRECATED_PARAMETER):
359
408
if self._parser is not None:
360
409
return self._parser
362
input = self._get_filename()
410
if symbol_versioning.deprecated_passed(file):
411
symbol_versioning.warn(
412
'IniBasedConfig._get_parser(file=xxx) was deprecated in 2.3.'
413
' Use IniBasedConfig(_content=xxx) instead.',
416
if self._content is not None:
417
co_input = self._content
418
elif self.file_name is None:
419
raise AssertionError('We have no content to create the config')
421
co_input = self.file_name
366
self._parser = ConfigObj(input, encoding='utf-8')
423
self._parser = ConfigObj(co_input, encoding='utf-8')
367
424
except configobj.ConfigObjError, e:
368
425
raise errors.ParseConfigError(e.errors, e.config.filename)
426
# Make sure self.reload() will use the right file name
427
self._parser.filename = self.file_name
369
428
return self._parser
431
"""Reload the config file from disk."""
432
if self.file_name is None:
433
raise AssertionError('We need a file name to reload the config')
434
if self._parser is not None:
435
self._parser.reload()
371
437
def _get_matching_sections(self):
372
438
"""Return an ordered list of (section_name, extra_path) pairs.
384
450
"""Override this to define the section used by the config."""
453
def _get_sections(self, name=None):
454
"""Returns an iterator of the sections specified by ``name``.
456
:param name: The section name. If None is supplied, the default
457
configurations are yielded.
459
:return: A tuple (name, section, config_id) for all sections that will
460
be walked by user_get_option() in the 'right' order. The first one
461
is where set_user_option() will update the value.
463
parser = self._get_parser()
465
yield (name, parser[name], self.config_id())
467
# No section name has been given so we fallback to the configobj
468
# itself which holds the variables defined outside of any section.
469
yield (None, parser, self.config_id())
471
def _get_options(self, sections=None):
472
"""Return an ordered list of (name, value, section, config_id) tuples.
474
All options are returned with their associated value and the section
475
they appeared in. ``config_id`` is a unique identifier for the
476
configuration file the option is defined in.
478
:param sections: Default to ``_get_matching_sections`` if not
479
specified. This gives a better control to daughter classes about
480
which sections should be searched. This is a list of (name,
485
parser = self._get_parser()
487
for (section_name, _) in self._get_matching_sections():
489
section = parser[section_name]
491
# This could happen for an empty file for which we define a
492
# DEFAULT section. FIXME: Force callers to provide sections
493
# instead ? -- vila 20100930
495
sections.append((section_name, section))
496
config_id = self.config_id()
497
for (section_name, section) in sections:
498
for (name, value) in section.iteritems():
499
yield (name, value, section_name, config_id)
387
501
def _get_option_policy(self, section, option_name):
388
502
"""Return the policy for the given (section, option_name) pair."""
389
503
return POLICY_NONE
476
590
def _get_nickname(self):
477
591
return self.get_user_option('nickname')
480
class GlobalConfig(IniBasedConfig):
593
def remove_user_option(self, option_name, section_name=None):
594
"""Remove a user option and save the configuration file.
596
:param option_name: The option to be removed.
598
:param section_name: The section the option is defined in, default to
602
parser = self._get_parser()
603
if section_name is None:
606
section = parser[section_name]
608
del section[option_name]
610
raise errors.NoSuchConfigOption(option_name)
611
self._write_config_file()
613
def _write_config_file(self):
614
if self.file_name is None:
615
raise AssertionError('We cannot save, self.file_name is None')
616
conf_dir = os.path.dirname(self.file_name)
617
ensure_config_dir_exists(conf_dir)
618
atomic_file = atomicfile.AtomicFile(self.file_name)
619
self._get_parser().write(atomic_file)
622
osutils.copy_ownership_from_path(self.file_name)
625
class LockableConfig(IniBasedConfig):
626
"""A configuration needing explicit locking for access.
628
If several processes try to write the config file, the accesses need to be
631
Daughter classes should decorate all methods that update a config with the
632
``@needs_write_lock`` decorator (they call, directly or indirectly, the
633
``_write_config_file()`` method. These methods (typically ``set_option()``
634
and variants must reload the config file from disk before calling
635
``_write_config_file()``), this can be achieved by calling the
636
``self.reload()`` method. Note that the lock scope should cover both the
637
reading and the writing of the config file which is why the decorator can't
638
be applied to ``_write_config_file()`` only.
640
This should be enough to implement the following logic:
641
- lock for exclusive write access,
642
- reload the config file from disk,
646
This logic guarantees that a writer can update a value without erasing an
647
update made by another writer.
652
def __init__(self, file_name):
653
super(LockableConfig, self).__init__(file_name=file_name)
654
self.dir = osutils.dirname(osutils.safe_unicode(self.file_name))
655
self.transport = transport.get_transport(self.dir)
656
self._lock = lockdir.LockDir(self.transport, 'lock')
658
def _create_from_string(self, unicode_bytes, save):
659
super(LockableConfig, self)._create_from_string(unicode_bytes, False)
661
# We need to handle the saving here (as opposed to IniBasedConfig)
664
self._write_config_file()
667
def lock_write(self, token=None):
668
"""Takes a write lock in the directory containing the config file.
670
If the directory doesn't exist it is created.
672
ensure_config_dir_exists(self.dir)
673
return self._lock.lock_write(token)
678
def break_lock(self):
679
self._lock.break_lock()
682
def remove_user_option(self, option_name, section_name=None):
683
super(LockableConfig, self).remove_user_option(option_name,
686
def _write_config_file(self):
687
if self._lock is None or not self._lock.is_held:
688
# NB: if the following exception is raised it probably means a
689
# missing @needs_write_lock decorator on one of the callers.
690
raise errors.ObjectNotLocked(self)
691
super(LockableConfig, self)._write_config_file()
694
class GlobalConfig(LockableConfig):
481
695
"""The configuration that should be used for a specific location."""
698
super(GlobalConfig, self).__init__(file_name=config_filename())
704
def from_string(cls, str_or_unicode, save=False):
705
"""Create a config object from a string.
707
:param str_or_unicode: A string representing the file content. This
708
will be utf-8 encoded.
710
:param save: Whether the file should be saved upon creation.
713
conf._create_from_string(str_or_unicode, save)
483
716
def get_editor(self):
484
717
return self._get_user_option('editor')
487
super(GlobalConfig, self).__init__(config_filename)
489
720
def set_user_option(self, option, value):
490
721
"""Save option and its value in the configuration."""
491
722
self._set_option(option, value, 'DEFAULT')
510
744
self._write_config_file()
512
746
def _set_option(self, option, value, section):
513
# FIXME: RBC 20051029 This should refresh the parser and also take a
514
# file lock on bazaar.conf.
515
conf_dir = os.path.dirname(self._get_filename())
516
ensure_config_dir_exists(conf_dir)
517
748
self._get_parser().setdefault(section, {})[option] = value
518
749
self._write_config_file()
520
def _write_config_file(self):
521
path = self._get_filename()
523
osutils.copy_ownership_from_path(path)
524
self._get_parser().write(f)
528
class LocationConfig(IniBasedConfig):
752
def _get_sections(self, name=None):
753
"""See IniBasedConfig._get_sections()."""
754
parser = self._get_parser()
755
# We don't give access to options defined outside of any section, we
756
# used the DEFAULT section by... default.
757
if name in (None, 'DEFAULT'):
758
# This could happen for an empty file where the DEFAULT section
759
# doesn't exist yet. So we force DEFAULT when yielding
761
if 'DEFAULT' not in parser:
762
parser['DEFAULT']= {}
763
yield (name, parser[name], self.config_id())
766
def remove_user_option(self, option_name, section_name=None):
767
if section_name is None:
768
# We need to force the default section.
769
section_name = 'DEFAULT'
770
# We need to avoid the LockableConfig implementation or we'll lock
772
super(LockableConfig, self).remove_user_option(option_name,
776
class LocationConfig(LockableConfig):
529
777
"""A configuration object that gives the policy for a location."""
531
779
def __init__(self, location):
532
name_generator = locations_config_filename
533
if (not os.path.exists(name_generator()) and
534
os.path.exists(branches_config_filename())):
535
if sys.platform == 'win32':
536
trace.warning('Please rename %s to %s'
537
% (branches_config_filename(),
538
locations_config_filename()))
540
trace.warning('Please rename ~/.bazaar/branches.conf'
541
' to ~/.bazaar/locations.conf')
542
name_generator = branches_config_filename
543
super(LocationConfig, self).__init__(name_generator)
780
super(LocationConfig, self).__init__(
781
file_name=locations_config_filename())
544
782
# local file locations are looked up by local path, rather than
545
783
# by file url. This is because the config file is a user
546
784
# file, and we would rather not expose the user to file urls.
648
914
STORE_LOCATION_APPENDPATH]:
649
915
raise ValueError('bad storage policy %r for %r' %
651
# FIXME: RBC 20051029 This should refresh the parser and also take a
652
# file lock on locations.conf.
653
conf_dir = os.path.dirname(self._get_filename())
654
ensure_config_dir_exists(conf_dir)
655
918
location = self.location
656
919
if location.endswith('/'):
657
920
location = location[:-1]
658
if (not location in self._get_parser() and
659
not location + '/' in self._get_parser()):
660
self._get_parser()[location]={}
661
elif location + '/' in self._get_parser():
921
parser = self._get_parser()
922
if not location in parser and not location + '/' in parser:
923
parser[location] = {}
924
elif location + '/' in parser:
662
925
location = location + '/'
663
self._get_parser()[location][option]=value
926
parser[location][option]=value
664
927
# the allowed values of store match the config policies
665
928
self._set_option_policy(location, option, store)
666
self._get_parser().write(file(self._get_filename(), 'wb'))
929
self._write_config_file()
669
932
class BranchConfig(Config):
670
933
"""A configuration object giving the policy for a branch."""
935
def __init__(self, branch):
936
super(BranchConfig, self).__init__()
937
self._location_config = None
938
self._branch_data_config = None
939
self._global_config = None
941
self.option_sources = (self._get_location_config,
942
self._get_branch_data_config,
943
self._get_global_config)
672
948
def _get_branch_data_config(self):
673
949
if self._branch_data_config is None:
674
950
self._branch_data_config = TreeConfig(self.branch)
951
self._branch_data_config.config_id = self.config_id
675
952
return self._branch_data_config
677
954
def _get_location_config(self):
1025
def _get_sections(self, name=None):
1026
"""See IniBasedConfig.get_sections()."""
1027
for source in self.option_sources:
1028
for section in source()._get_sections(name):
1031
def _get_options(self, sections=None):
1033
# First the locations options
1034
for option in self._get_location_config()._get_options():
1036
# Then the branch options
1037
branch_config = self._get_branch_data_config()
1038
if sections is None:
1039
sections = [('DEFAULT', branch_config._get_parser())]
1040
# FIXME: We shouldn't have to duplicate the code in IniBasedConfig but
1041
# Config itself has no notion of sections :( -- vila 20101001
1042
config_id = self.config_id()
1043
for (section_name, section) in sections:
1044
for (name, value) in section.iteritems():
1045
yield (name, value, section_name, config_id)
1046
# Then the global options
1047
for option in self._get_global_config()._get_options():
748
1050
def set_user_option(self, name, value, store=STORE_BRANCH,
749
1051
warn_masked=False):
750
1052
if store == STORE_BRANCH:
768
1070
trace.warning('Value "%s" is masked by "%s" from'
769
1071
' branch.conf', value, mask_value)
1073
def remove_user_option(self, option_name, section_name=None):
1074
self._get_branch_data_config().remove_option(option_name, section_name)
771
1076
def _gpg_signing_command(self):
772
1077
"""See Config.gpg_signing_command."""
773
1078
return self._get_safe_value('_gpg_signing_command')
775
def __init__(self, branch):
776
super(BranchConfig, self).__init__()
777
self._location_config = None
778
self._branch_data_config = None
779
self._global_config = None
781
self.option_sources = (self._get_location_config,
782
self._get_branch_data_config,
783
self._get_global_config)
785
1080
def _post_commit(self):
786
1081
"""See Config.post_commit."""
787
1082
return self._get_safe_value('_post_commit')
899
1188
return os.path.expanduser('~/.cache')
903
"""Calculate automatic user identification.
905
Returns (realname, email).
907
Only used when none is set in the environment or the id file.
909
This previously used the FQDN as the default domain, but that can
910
be very slow on machines where DNS is broken. So now we simply
915
if sys.platform == 'win32':
916
name = win32utils.get_user_name_unicode()
918
raise errors.BzrError("Cannot autodetect user name.\n"
919
"Please, set your name with command like:\n"
920
'bzr whoami "Your Name <name@domain.com>"')
921
host = win32utils.get_host_name_unicode()
923
host = socket.gethostname()
924
return name, (name + '@' + host)
930
w = pwd.getpwuid(uid)
932
raise errors.BzrCommandError('Unable to determine your name. '
933
'Please use "bzr whoami" to set it.')
935
# we try utf-8 first, because on many variants (like Linux),
936
# /etc/passwd "should" be in utf-8, and because it's unlikely to give
937
# false positives. (many users will have their user encoding set to
938
# latin-1, which cannot raise UnicodeError.)
940
gecos = w.pw_gecos.decode('utf-8')
944
encoding = osutils.get_user_encoding()
945
gecos = w.pw_gecos.decode(encoding)
947
raise errors.BzrCommandError('Unable to determine your name. '
948
'Use "bzr whoami" to set it.')
950
username = w.pw_name.decode(encoding)
952
raise errors.BzrCommandError('Unable to determine your name. '
953
'Use "bzr whoami" to set it.')
955
comma = gecos.find(',')
959
realname = gecos[:comma]
966
user_encoding = osutils.get_user_encoding()
967
realname = username = getpass.getuser().decode(user_encoding)
968
except UnicodeDecodeError:
969
raise errors.BzrError("Can't decode username as %s." % \
972
return realname, (username + '@' + socket.gethostname())
975
1191
def parse_username(username):
976
1192
"""Parse e-mail username and return a (name, address) tuple."""
977
1193
match = re.match(r'(.*?)\s*<?([\w+.-]+@[\w+.-]+)>?', username)
1517
1756
return StringIO()
1519
1758
def _get_configobj(self):
1520
return ConfigObj(self._get_config_file(), encoding='utf-8')
1759
f = self._get_config_file()
1761
return ConfigObj(f, encoding='utf-8')
1522
1765
def _set_configobj(self, configobj):
1523
1766
out_file = StringIO()
1524
1767
configobj.write(out_file)
1525
1768
out_file.seek(0)
1526
1769
self._transport.put_file(self._filename, out_file)
1772
class cmd_config(commands.Command):
1773
__doc__ = """Display, set or remove a configuration option.
1775
Display the active value for a given option.
1777
If --all is specified, NAME is interpreted as a regular expression and all
1778
matching options are displayed mentioning their scope. The active value
1779
that bzr will take into account is the first one displayed for each option.
1781
If no NAME is given, --all .* is implied.
1783
Setting a value is achieved by using name=value without spaces. The value
1784
is set in the most relevant scope and can be checked by displaying the
1788
takes_args = ['name?']
1792
# FIXME: This should be a registry option so that plugins can register
1793
# their own config files (or not) -- vila 20101002
1794
commands.Option('scope', help='Reduce the scope to the specified'
1795
' configuration file',
1797
commands.Option('all',
1798
help='Display all the defined values for the matching options.',
1800
commands.Option('remove', help='Remove the option from'
1801
' the configuration file'),
1804
@commands.display_command
1805
def run(self, name=None, all=False, directory=None, scope=None,
1807
if directory is None:
1809
directory = urlutils.normalize_url(directory)
1811
raise errors.BzrError(
1812
'--all and --remove are mutually exclusive.')
1814
# Delete the option in the given scope
1815
self._remove_config_option(name, directory, scope)
1817
# Defaults to all options
1818
self._show_matching_options('.*', directory, scope)
1821
name, value = name.split('=', 1)
1823
# Display the option(s) value(s)
1825
self._show_matching_options(name, directory, scope)
1827
self._show_value(name, directory, scope)
1830
raise errors.BzrError(
1831
'Only one option can be set.')
1832
# Set the option value
1833
self._set_config_option(name, value, directory, scope)
1835
def _get_configs(self, directory, scope=None):
1836
"""Iterate the configurations specified by ``directory`` and ``scope``.
1838
:param directory: Where the configurations are derived from.
1840
:param scope: A specific config to start from.
1842
if scope is not None:
1843
if scope == 'bazaar':
1844
yield GlobalConfig()
1845
elif scope == 'locations':
1846
yield LocationConfig(directory)
1847
elif scope == 'branch':
1848
(_, br, _) = bzrdir.BzrDir.open_containing_tree_or_branch(
1850
yield br.get_config()
1853
(_, br, _) = bzrdir.BzrDir.open_containing_tree_or_branch(
1855
yield br.get_config()
1856
except errors.NotBranchError:
1857
yield LocationConfig(directory)
1858
yield GlobalConfig()
1860
def _show_value(self, name, directory, scope):
1862
for c in self._get_configs(directory, scope):
1865
for (oname, value, section, conf_id) in c._get_options():
1867
# Display only the first value and exit
1868
self.outf.write('%s\n' % (value))
1872
raise errors.NoSuchConfigOption(name)
1874
def _show_matching_options(self, name, directory, scope):
1875
name = re.compile(name)
1876
# We want any error in the regexp to be raised *now* so we need to
1877
# avoid the delay introduced by the lazy regexp.
1878
name._compile_and_collapse()
1880
for c in self._get_configs(directory, scope):
1881
for (oname, value, section, conf_id) in c._get_options():
1882
if name.search(oname):
1883
if cur_conf_id != conf_id:
1884
# Explain where the options are defined
1885
self.outf.write('%s:\n' % (conf_id,))
1886
cur_conf_id = conf_id
1887
self.outf.write(' %s = %s\n' % (oname, value))
1889
def _set_config_option(self, name, value, directory, scope):
1890
for conf in self._get_configs(directory, scope):
1891
conf.set_user_option(name, value)
1894
raise errors.NoSuchConfig(scope)
1896
def _remove_config_option(self, name, directory, scope):
1898
raise errors.BzrCommandError(
1899
'--remove expects an option to remove.')
1901
for conf in self._get_configs(directory, scope):
1902
for (section_name, section, conf_id) in conf._get_sections():
1903
if scope is not None and conf_id != scope:
1904
# Not the right configuration file
1907
if conf_id != conf.config_id():
1908
conf = self._get_configs(directory, conf_id).next()
1909
# We use the first section in the first config where the
1910
# option is defined to remove it
1911
conf.remove_user_option(name, section_name)
1916
raise errors.NoSuchConfig(scope)
1918
raise errors.NoSuchConfigOption(name)