~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/rules.py

  • Committer: Tarmac
  • Author(s): Vincent Ladeuil
  • Date: 2017-01-30 14:42:05 UTC
  • mfrom: (6620.1.1 trunk)
  • Revision ID: tarmac-20170130144205-r8fh2xpmiuxyozpv
Merge  2.7 into trunk including fix for bug #1657238 [r=vila]

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2008 Canonical Ltd
 
1
# Copyright (C) 2008, 2009, 2010 Canonical Ltd
2
2
#
3
3
# This program is free software; you can redistribute it and/or modify
4
4
# it under the terms of the GNU General Public License as published by
12
12
#
13
13
# You should have received a copy of the GNU General Public License
14
14
# along with this program; if not, write to the Free Software
15
 
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
16
16
 
17
17
"""Rule-based definition of preferences for selected files in selected branches.
18
18
 
19
19
See ``bzr help rules`` for details.
20
20
"""
21
21
 
 
22
from __future__ import absolute_import
 
23
 
22
24
from bzrlib import (
23
25
    config,
 
26
    cmdline,
24
27
    errors,
25
28
    globbing,
26
29
    osutils,
35
38
FILE_PREFS_PREFIX = 'name '
36
39
FILE_PREFS_PREFIX_LEN = len(FILE_PREFS_PREFIX)
37
40
 
 
41
# The object providing default rules
 
42
_per_user_searcher = None
 
43
 
38
44
 
39
45
class _RulesSearcher(object):
40
46
    """An object that provides rule-based preferences."""
60
66
        """
61
67
        raise NotImplementedError(self.get_selected_items)
62
68
 
 
69
    def get_single_value(self, path, preference_name):
 
70
        """Get a single preference for a single file.
 
71
        
 
72
        :returns: The string preference value, or None.
 
73
        """
 
74
        for key, value in self.get_selected_items(path, [preference_name]):
 
75
            return value
 
76
        return None
 
77
 
63
78
 
64
79
class _IniBasedRulesSearcher(_RulesSearcher):
65
80
 
70
85
 
71
86
        :param inifile: the name of the file or a sequence of lines.
72
87
        """
73
 
        options = {'encoding': 'utf-8'}
74
 
        self._cfg = configobj.ConfigObj(inifile, options=options)
 
88
        self._cfg = configobj.ConfigObj(inifile, encoding='utf-8')
75
89
        sections = self._cfg.keys()
76
 
        patterns = [s[FILE_PREFS_PREFIX_LEN:] for s in sections
77
 
            if s.startswith(FILE_PREFS_PREFIX)]
 
90
        patterns = []
 
91
        self.pattern_to_section = {}
 
92
        for s in sections:
 
93
            if s.startswith(FILE_PREFS_PREFIX):
 
94
                file_patterns = cmdline.split(s[FILE_PREFS_PREFIX_LEN:])
 
95
                patterns.extend(file_patterns)
 
96
                for fp in file_patterns:
 
97
                    self.pattern_to_section[fp] = s
78
98
        if len(patterns) < len(sections):
79
99
            unknowns = [s for s in sections
80
100
                if not s.startswith(FILE_PREFS_PREFIX)]
92
112
        if pat is None:
93
113
            return ()
94
114
        else:
95
 
            all = self._cfg[FILE_PREFS_PREFIX + pat]
 
115
            all = self._cfg[self.pattern_to_section[pat]]
96
116
            return tuple(all.items())
97
117
 
98
118
    def get_selected_items(self, path, names):
103
123
        if pat is None:
104
124
            return ()
105
125
        else:
106
 
            all = self._cfg[FILE_PREFS_PREFIX + pat]
 
126
            all = self._cfg[self.pattern_to_section[pat]]
107
127
            return tuple((k, all.get(k)) for k in names)
108
128
 
109
129
 
138
158
    return osutils.pathjoin(config.config_dir(), 'rules')
139
159
 
140
160
 
141
 
# The object providing default rules
142
 
_per_user_searcher = _IniBasedRulesSearcher(rules_filename())
 
161
def reset_rules():
 
162
    global _per_user_searcher
 
163
    _per_user_searcher = _IniBasedRulesSearcher(rules_filename())
 
164
 
 
165
reset_rules()