##// END OF EJS Templates
config: add copyright and license header
Martin Geisler -
r8229:ddf3d665 default
parent child Browse files
Show More
@@ -1,125 +1,132 b''
1 # config.py - configuration parsing for Mercurial
2 #
3 # Copyright 2009 Matt Mackall <mpm@selenic.com> and others
4 #
5 # This software may be used and distributed according to the terms of the
6 # GNU General Public License version 2, incorporated herein by reference.
7
1 8 from i18n import _
2 9 import re, error, os
3 10
4 11 class sortdict(dict):
5 12 'a simple sorted dictionary'
6 13 def __init__(self, data=None):
7 14 self._list = []
8 15 if data:
9 16 self.update(data)
10 17 def copy(self):
11 18 return sortdict(self)
12 19 def __setitem__(self, key, val):
13 20 if key in self:
14 21 self._list.remove(key)
15 22 self._list.append(key)
16 23 dict.__setitem__(self, key, val)
17 24 def __iter__(self):
18 25 return self._list.__iter__()
19 26 def update(self, src):
20 27 for k in src:
21 28 self[k] = src[k]
22 29 def items(self):
23 30 return [(k, self[k]) for k in self._list]
24 31 def __delitem__(self, key):
25 32 dict.__delitem__(self, key)
26 33 self._list.remove(key)
27 34
28 35 class config(object):
29 36 def __init__(self, data=None):
30 37 self._data = {}
31 38 self._source = {}
32 39 if data:
33 40 for k in data._data:
34 41 self._data[k] = data[k].copy()
35 42 self._source = data._source.copy()
36 43 def copy(self):
37 44 return config(self)
38 45 def __contains__(self, section):
39 46 return section in self._data
40 47 def __getitem__(self, section):
41 48 return self._data.get(section, {})
42 49 def __iter__(self):
43 50 for d in self.sections():
44 51 yield d
45 52 def update(self, src):
46 53 for s in src:
47 54 if s not in self:
48 55 self._data[s] = sortdict()
49 56 self._data[s].update(src._data[s])
50 57 self._source.update(src._source)
51 58 def get(self, section, item, default=None):
52 59 return self._data.get(section, {}).get(item, default)
53 60 def source(self, section, item):
54 61 return self._source.get((section, item), "")
55 62 def sections(self):
56 63 return sorted(self._data.keys())
57 64 def items(self, section):
58 65 return self._data.get(section, {}).items()
59 66 def set(self, section, item, value, source=""):
60 67 if section not in self:
61 68 self._data[section] = sortdict()
62 69 self._data[section][item] = value
63 70 self._source[(section, item)] = source
64 71
65 72 def read(self, path, fp=None, sections=None):
66 73 sectionre = re.compile(r'\[([^\[]+)\]')
67 74 itemre = re.compile(r'([^=\s]+)\s*=\s*(.*\S|)')
68 75 contre = re.compile(r'\s+(\S.*\S)')
69 76 emptyre = re.compile(r'(;|#|\s*$)')
70 77 unsetre = re.compile(r'%unset\s+(\S+)')
71 78 includere = re.compile(r'%include\s+(\S.*\S)')
72 79 section = ""
73 80 item = None
74 81 line = 0
75 82 cont = 0
76 83
77 84 if not fp:
78 85 fp = open(path)
79 86
80 87 for l in fp:
81 88 line += 1
82 89 if cont:
83 90 m = contre.match(l)
84 91 if m:
85 92 if sections and section not in sections:
86 93 continue
87 94 v = self.get(section, item) + "\n" + m.group(1)
88 95 self.set(section, item, v, "%s:%d" % (path, line))
89 96 continue
90 97 item = None
91 98 m = includere.match(l)
92 99 if m:
93 100 inc = m.group(1)
94 101 base = os.path.dirname(path)
95 102 inc = os.path.normpath(os.path.join(base, inc))
96 103 incfp = open(inc)
97 104 self.read(inc, incfp)
98 105 continue
99 106 if emptyre.match(l):
100 107 continue
101 108 m = sectionre.match(l)
102 109 if m:
103 110 section = m.group(1)
104 111 if section not in self:
105 112 self._data[section] = sortdict()
106 113 continue
107 114 m = itemre.match(l)
108 115 if m:
109 116 item = m.group(1)
110 117 cont = 1
111 118 if sections and section not in sections:
112 119 continue
113 120 self.set(section, item, m.group(2), "%s:%d" % (path, line))
114 121 continue
115 122 m = unsetre.match(l)
116 123 if m:
117 124 name = m.group(1)
118 125 if sections and section not in sections:
119 126 continue
120 127 if self.get(section, name) != None:
121 128 del self._data[section][name]
122 129 continue
123 130
124 131 raise error.ConfigError(_('config error at %s:%d: \'%s\'')
125 132 % (path, line, l.rstrip()))
General Comments 0
You need to be logged in to leave comments. Login now