~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/properties.py

  • Committer: Ian Clatworthy
  • Date: 2008-05-06 03:26:46 UTC
  • mto: (3515.1.1 ianc-integration)
  • mto: This revision was merged to the branch mainline in revision 3516.
  • Revision ID: ian.clatworthy@canonical.com-20080506032646-8xp61rm9w13pfv0p
first cut at PropertiesProvider class

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# Copyright (C) 2008 Canonical Ltd
 
2
#
 
3
# This program is free software; you can redistribute it and/or modify
 
4
# it under the terms of the GNU General Public License as published by
 
5
# the Free Software Foundation; either version 2 of the License, or
 
6
# (at your option) any later version.
 
7
#
 
8
# This program is distributed in the hope that it will be useful,
 
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
 
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
11
# GNU General Public License for more details.
 
12
#
 
13
# You should have received a copy of the GNU General Public License
 
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
 
16
 
 
17
"""Properties to associate with files based on file glob patterns.
 
18
 
 
19
Patterns and the properties for each are defined in ini file format in
 
20
BZR_HOME/.bzrproperties. For example::
 
21
 
 
22
    [*.txt]
 
23
    text = True
 
24
 
 
25
    [*.pdf]
 
26
    text = False
 
27
 
 
28
Patterns use the same conventions as .bzrignore, namely:
 
29
 
 
30
 * *.xyz match any file ending in .xyz
 
31
 * foo/ matches all files in foo directories
 
32
 * to specify the top level, start a pattern with ./
 
33
 
 
34
Patterns are ordered and searching stops as soon as one matches.
 
35
As a consequence, more explicit patterns should be placed towards
 
36
the top of the file.
 
37
"""
 
38
 
 
39
from bzrlib import (
 
40
    config,
 
41
    globbing,
 
42
    osutils,
 
43
    )
 
44
import bzrlib.util.configobj
 
45
 
 
46
 
 
47
# The object providing per-user properties
 
48
_user_properties_provider = _PropertiesProvider(properties_filename())
 
49
 
 
50
 
 
51
class _PropertiesProvider(object):
 
52
    """An object that provides properties for a file."""
 
53
 
 
54
    def __init__(self, filename):
 
55
        """Create a provider of properties.
 
56
 
 
57
        :param filename: the ini file holding the patterns and the
 
58
          properties that apply to each.
 
59
        """
 
60
        self._cfg = configobj.ConfigObj(filename)
 
61
        patterns = self._cfg.keys()
 
62
        self._globster = globbing._OrderedGlobster(patterns)
 
63
 
 
64
    def get_properties(self, path):
 
65
        """Return the dictionary of properties for a path.
 
66
 
 
67
        :param path: tree relative path
 
68
        :return: the properties or {} if none
 
69
        """
 
70
        pat =_self._globster.match(path)
 
71
        if pat is None:
 
72
            return {}
 
73
        else:
 
74
            return self._cfg[pat]
 
75
 
 
76
 
 
77
def properties_filename():
 
78
    """Return per-user properties file filename."""
 
79
    return osutils.pathjoin(config.config_dir(), '.bzrproperties')