~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/config.py

  • Committer: Vincent Ladeuil
  • Date: 2010-10-15 11:30:54 UTC
  • mfrom: (5499 +trunk)
  • mto: This revision was merged to the branch mainline in revision 5501.
  • Revision ID: v.ladeuil+lp@free.fr-20101015113054-a3nd1xnb3ro8c44c
Merge bzr.dev

Show diffs side-by-side

added added

removed removed

Lines of Context:
65
65
import os
66
66
import sys
67
67
 
 
68
from bzrlib import commands
68
69
from bzrlib.decorators import needs_write_lock
69
70
from bzrlib.lazy_import import lazy_import
70
71
lazy_import(globals(), """
71
72
import errno
72
 
from fnmatch import fnmatch
 
73
import fnmatch
73
74
import re
74
75
from cStringIO import StringIO
75
76
 
76
77
import bzrlib
77
78
from bzrlib import (
78
79
    atomicfile,
 
80
    bzrdir,
79
81
    debug,
80
82
    errors,
81
83
    lockdir,
153
155
    def __init__(self):
154
156
        super(Config, self).__init__()
155
157
 
 
158
    def config_id(self):
 
159
        """Returns a unique ID for the config."""
 
160
        raise NotImplementedError(self.config_id)
 
161
 
156
162
    def get_editor(self):
157
163
        """Get the users pop up editor."""
158
164
        raise NotImplementedError
444
450
        """Override this to define the section used by the config."""
445
451
        return "DEFAULT"
446
452
 
 
453
    def _get_sections(self, name=None):
 
454
        """Returns an iterator of the sections specified by ``name``.
 
455
 
 
456
        :param name: The section name. If None is supplied, the default
 
457
            configurations are yielded.
 
458
 
 
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.
 
462
        """
 
463
        parser = self._get_parser()
 
464
        if name is not None:
 
465
            yield (name, parser[name], self.config_id())
 
466
        else:
 
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())
 
470
 
 
471
    def _get_options(self, sections=None):
 
472
        """Return an ordered list of (name, value, section, config_id) tuples.
 
473
 
 
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.
 
477
 
 
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,
 
481
            configobj) tuples.
 
482
        """
 
483
        opts = []
 
484
        if sections is None:
 
485
            parser = self._get_parser()
 
486
            sections = []
 
487
            for (section_name, _) in self._get_matching_sections():
 
488
                try:
 
489
                    section = parser[section_name]
 
490
                except KeyError:
 
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
 
494
                    continue
 
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)
 
500
 
447
501
    def _get_option_policy(self, section, option_name):
448
502
        """Return the policy for the given (section, option_name) pair."""
449
503
        return POLICY_NONE
536
590
    def _get_nickname(self):
537
591
        return self.get_user_option('nickname')
538
592
 
 
593
    def remove_user_option(self, option_name, section_name=None):
 
594
        """Remove a user option and save the configuration file.
 
595
 
 
596
        :param option_name: The option to be removed.
 
597
 
 
598
        :param section_name: The section the option is defined in, default to
 
599
            the default section.
 
600
        """
 
601
        self.reload()
 
602
        parser = self._get_parser()
 
603
        if section_name is None:
 
604
            section = parser
 
605
        else:
 
606
            section = parser[section_name]
 
607
        try:
 
608
            del section[option_name]
 
609
        except KeyError:
 
610
            raise errors.NoSuchConfigOption(option_name)
 
611
        self._write_config_file()
 
612
 
539
613
    def _write_config_file(self):
540
614
        if self.file_name is None:
541
615
            raise AssertionError('We cannot save, self.file_name is None')
604
678
    def break_lock(self):
605
679
        self._lock.break_lock()
606
680
 
 
681
    @needs_write_lock
 
682
    def remove_user_option(self, option_name, section_name=None):
 
683
        super(LockableConfig, self).remove_user_option(option_name,
 
684
                                                       section_name)
 
685
 
607
686
    def _write_config_file(self):
608
687
        if self._lock is None or not self._lock.is_held:
609
688
            # NB: if the following exception is raised it probably means a
618
697
    def __init__(self):
619
698
        super(GlobalConfig, self).__init__(file_name=config_filename())
620
699
 
 
700
    def config_id(self):
 
701
        return 'bazaar'
 
702
 
621
703
    @classmethod
622
704
    def from_string(cls, str_or_unicode, save=False):
623
705
        """Create a config object from a string.
667
749
        self._write_config_file()
668
750
 
669
751
 
 
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
 
760
            name = 'DEFAULT'
 
761
            if 'DEFAULT' not in parser:
 
762
               parser['DEFAULT']= {}
 
763
        yield (name, parser[name], self.config_id())
 
764
 
 
765
    @needs_write_lock
 
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
 
771
        # twice
 
772
        super(LockableConfig, self).remove_user_option(option_name,
 
773
                                                       section_name)
 
774
 
 
775
 
670
776
class LocationConfig(LockableConfig):
671
777
    """A configuration object that gives the policy for a location."""
672
778
 
680
786
            location = urlutils.local_path_from_url(location)
681
787
        self.location = location
682
788
 
 
789
    def config_id(self):
 
790
        return 'locations'
 
791
 
683
792
    @classmethod
684
793
    def from_string(cls, str_or_unicode, location, save=False):
685
794
        """Create a config object from a string.
717
826
            names = zip(location_names, section_names)
718
827
            matched = True
719
828
            for name in names:
720
 
                if not fnmatch(name[0], name[1]):
 
829
                if not fnmatch.fnmatch(name[0], name[1]):
721
830
                    matched = False
722
831
                    break
723
832
            if not matched:
728
837
                continue
729
838
            matches.append((len(section_names), section,
730
839
                            '/'.join(location_names[len(section_names):])))
 
840
        # put the longest (aka more specific) locations first
731
841
        matches.sort(reverse=True)
732
842
        sections = []
733
843
        for (length, section, extra_path) in matches:
740
850
                pass
741
851
        return sections
742
852
 
 
853
    def _get_sections(self, name=None):
 
854
        """See IniBasedConfig._get_sections()."""
 
855
        # We ignore the name here as the only sections handled are named with
 
856
        # the location path and we don't expose embedded sections either.
 
857
        parser = self._get_parser()
 
858
        for name, extra_path in self._get_matching_sections():
 
859
            yield (name, parser[name], self.config_id())
 
860
 
743
861
    def _get_option_policy(self, section, option_name):
744
862
        """Return the policy for the given (section, option_name) pair."""
745
863
        # check for the old 'recurse=False' flag
824
942
                               self._get_branch_data_config,
825
943
                               self._get_global_config)
826
944
 
 
945
    def config_id(self):
 
946
        return 'branch'
 
947
 
827
948
    def _get_branch_data_config(self):
828
949
        if self._branch_data_config is None:
829
950
            self._branch_data_config = TreeConfig(self.branch)
 
951
            self._branch_data_config.config_id = self.config_id
830
952
        return self._branch_data_config
831
953
 
832
954
    def _get_location_config(self):
900
1022
                return value
901
1023
        return None
902
1024
 
 
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):
 
1029
                yield section
 
1030
 
 
1031
    def _get_options(self, sections=None):
 
1032
        opts = []
 
1033
        # First the locations options
 
1034
        for option in self._get_location_config()._get_options():
 
1035
            yield option
 
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():
 
1048
            yield option
 
1049
 
903
1050
    def set_user_option(self, name, value, store=STORE_BRANCH,
904
1051
        warn_masked=False):
905
1052
        if store == STORE_BRANCH:
923
1070
                        trace.warning('Value "%s" is masked by "%s" from'
924
1071
                                      ' branch.conf', value, mask_value)
925
1072
 
 
1073
    def remove_user_option(self, option_name, section_name=None):
 
1074
        self._get_branch_data_config().remove_option(option_name, section_name)
 
1075
 
926
1076
    def _gpg_signing_command(self):
927
1077
        """See Config.gpg_signing_command."""
928
1078
        return self._get_safe_value('_gpg_signing_command')
1086
1236
 
1087
1237
    def set_option(self, value, name, section=None):
1088
1238
        """Set a per-branch configuration option"""
 
1239
        # FIXME: We shouldn't need to lock explicitly here but rather rely on
 
1240
        # higher levels providing the right lock -- vila 20101004
1089
1241
        self.branch.lock_write()
1090
1242
        try:
1091
1243
            self._config.set_option(value, name, section)
1092
1244
        finally:
1093
1245
            self.branch.unlock()
1094
1246
 
 
1247
    def remove_option(self, option_name, section_name=None):
 
1248
        # FIXME: We shouldn't need to lock explicitly here but rather rely on
 
1249
        # higher levels providing the right lock -- vila 20101004
 
1250
        self.branch.lock_write()
 
1251
        try:
 
1252
            self._config.remove_option(option_name, section_name)
 
1253
        finally:
 
1254
            self.branch.unlock()
 
1255
 
1095
1256
 
1096
1257
class AuthenticationConfig(object):
1097
1258
    """The authentication configuration file based on a ini file.
1540
1701
    """A Config that reads/writes a config file on a Transport.
1541
1702
 
1542
1703
    It is a low-level object that considers config data to be name/value pairs
1543
 
    that may be associated with a section.  Assigning meaning to the these
1544
 
    values is done at higher levels like TreeConfig.
 
1704
    that may be associated with a section.  Assigning meaning to these values
 
1705
    is done at higher levels like TreeConfig.
1545
1706
    """
1546
1707
 
1547
1708
    def __init__(self, transport, filename):
1580
1741
            configobj.setdefault(section, {})[name] = value
1581
1742
        self._set_configobj(configobj)
1582
1743
 
 
1744
    def remove_option(self, option_name, section_name=None):
 
1745
        configobj = self._get_configobj()
 
1746
        if section_name is None:
 
1747
            del configobj[option_name]
 
1748
        else:
 
1749
            del configobj[section_name][option_name]
 
1750
        self._set_configobj(configobj)
 
1751
 
1583
1752
    def _get_config_file(self):
1584
1753
        try:
1585
1754
            return StringIO(self._transport.get_bytes(self._filename))
1598
1767
        configobj.write(out_file)
1599
1768
        out_file.seek(0)
1600
1769
        self._transport.put_file(self._filename, out_file)
 
1770
 
 
1771
 
 
1772
class cmd_config(commands.Command):
 
1773
    __doc__ = """Display, set or remove a configuration option.
 
1774
 
 
1775
    Display the MATCHING configuration options mentioning their scope (the
 
1776
    configuration file they are defined in). The active value that bzr will
 
1777
    take into account is the first one displayed.
 
1778
 
 
1779
    Setting a value is achieved by using name=value without spaces. The value
 
1780
    is set in the most relevant scope and can be checked by displaying the
 
1781
    option again.
 
1782
    """
 
1783
 
 
1784
    aliases = ['conf']
 
1785
    takes_args = ['matching?']
 
1786
 
 
1787
    takes_options = [
 
1788
        'directory',
 
1789
        # FIXME: This should be a registry option so that plugins can register
 
1790
        # their own config files (or not) -- vila 20101002
 
1791
        commands.Option('scope', help='Reduce the scope to the specified'
 
1792
                        ' configuration file',
 
1793
                        type=unicode),
 
1794
        commands.Option('remove', help='Remove the option from'
 
1795
                        ' the configuration file'),
 
1796
        ]
 
1797
 
 
1798
    @commands.display_command
 
1799
    def run(self, matching=None, directory=None, scope=None, remove=False):
 
1800
        if directory is None:
 
1801
            directory = '.'
 
1802
        directory = urlutils.normalize_url(directory)
 
1803
        if matching is None:
 
1804
            self._show_config('*', directory)
 
1805
        else:
 
1806
            if remove:
 
1807
                self._remove_config_option(matching, directory, scope)
 
1808
            else:
 
1809
                pos = matching.find('=')
 
1810
                if pos == -1:
 
1811
                    self._show_config(matching, directory)
 
1812
                else:
 
1813
                    self._set_config_option(matching[:pos], matching[pos+1:],
 
1814
                                            directory, scope)
 
1815
 
 
1816
    def _get_configs(self, directory, scope=None):
 
1817
        """Iterate the configurations specified by ``directory`` and ``scope``.
 
1818
 
 
1819
        :param directory: Where the configurations are derived from.
 
1820
 
 
1821
        :param scope: A specific config to start from.
 
1822
        """
 
1823
        if scope is not None:
 
1824
            if scope == 'bazaar':
 
1825
                yield GlobalConfig()
 
1826
            elif scope == 'locations':
 
1827
                yield LocationConfig(directory)
 
1828
            elif scope == 'branch':
 
1829
                (_, br, _) = bzrdir.BzrDir.open_containing_tree_or_branch(
 
1830
                    directory)
 
1831
                yield br.get_config()
 
1832
        else:
 
1833
            try:
 
1834
                (_, br, _) = bzrdir.BzrDir.open_containing_tree_or_branch(
 
1835
                    directory)
 
1836
                yield br.get_config()
 
1837
            except errors.NotBranchError:
 
1838
                yield LocationConfig(directory)
 
1839
                yield GlobalConfig()
 
1840
 
 
1841
    def _show_config(self, matching, directory):
 
1842
        # Turn the glob into a regexp
 
1843
        matching_re = re.compile(fnmatch.translate(matching))
 
1844
        cur_conf_id = None
 
1845
        for c in self._get_configs(directory):
 
1846
            for (name, value, section, conf_id) in c._get_options():
 
1847
                if matching_re.search(name):
 
1848
                    if cur_conf_id != conf_id:
 
1849
                        self.outf.write('%s:\n' % (conf_id,))
 
1850
                        cur_conf_id = conf_id
 
1851
                    self.outf.write('  %s = %s\n' % (name, value))
 
1852
 
 
1853
    def _set_config_option(self, name, value, directory, scope):
 
1854
        for conf in self._get_configs(directory, scope):
 
1855
            conf.set_user_option(name, value)
 
1856
            break
 
1857
        else:
 
1858
            raise errors.NoSuchConfig(scope)
 
1859
 
 
1860
    def _remove_config_option(self, name, directory, scope):
 
1861
        removed = False
 
1862
        for conf in self._get_configs(directory, scope):
 
1863
            for (section_name, section, conf_id) in conf._get_sections():
 
1864
                if scope is not None and conf_id != scope:
 
1865
                    # Not the right configuration file
 
1866
                    continue
 
1867
                if name in section:
 
1868
                    if conf_id != conf.config_id():
 
1869
                        conf = self._get_configs(directory, conf_id).next()
 
1870
                    # We use the first section in the first config where the
 
1871
                    # option is defined to remove it
 
1872
                    conf.remove_user_option(name, section_name)
 
1873
                    removed = True
 
1874
                    break
 
1875
            break
 
1876
        else:
 
1877
            raise errors.NoSuchConfig(scope)
 
1878
        if not removed:
 
1879
            raise errors.NoSuchConfigOption(name)