equal
deleted
inserted
replaced
67 if section not in self: |
67 if section not in self: |
68 self._data[section] = sortdict() |
68 self._data[section] = sortdict() |
69 self._data[section][item] = value |
69 self._data[section][item] = value |
70 self._source[(section, item)] = source |
70 self._source[(section, item)] = source |
71 |
71 |
72 def read(self, path, fp=None, sections=None): |
72 def parse(self, src, data, sections=None, remap=None, include=None): |
73 sectionre = re.compile(r'\[([^\[]+)\]') |
73 sectionre = re.compile(r'\[([^\[]+)\]') |
74 itemre = re.compile(r'([^=\s][^=]*?)\s*=\s*(.*\S|)') |
74 itemre = re.compile(r'([^=\s][^=]*?)\s*=\s*(.*\S|)') |
75 contre = re.compile(r'\s+(\S.*\S)') |
75 contre = re.compile(r'\s+(\S.*\S)') |
76 emptyre = re.compile(r'(;|#|\s*$)') |
76 emptyre = re.compile(r'(;|#|\s*$)') |
77 unsetre = re.compile(r'%unset\s+(\S+)') |
77 unsetre = re.compile(r'%unset\s+(\S+)') |
79 section = "" |
79 section = "" |
80 item = None |
80 item = None |
81 line = 0 |
81 line = 0 |
82 cont = 0 |
82 cont = 0 |
83 |
83 |
84 if not fp: |
84 for l in data.splitlines(1): |
85 fp = open(path) |
|
86 |
|
87 for l in fp: |
|
88 line += 1 |
85 line += 1 |
89 if cont: |
86 if cont: |
90 m = contre.match(l) |
87 m = contre.match(l) |
91 if m: |
88 if m: |
92 if sections and section not in sections: |
89 if sections and section not in sections: |
93 continue |
90 continue |
94 v = self.get(section, item) + "\n" + m.group(1) |
91 v = self.get(section, item) + "\n" + m.group(1) |
95 self.set(section, item, v, "%s:%d" % (path, line)) |
92 self.set(section, item, v, "%s:%d" % (src, line)) |
96 continue |
93 continue |
97 item = None |
94 item = None |
98 m = includere.match(l) |
95 m = includere.match(l) |
99 if m: |
96 if m: |
100 inc = m.group(1) |
97 inc = m.group(1) |
101 base = os.path.dirname(path) |
98 base = os.path.dirname(src) |
102 inc = os.path.normpath(os.path.join(base, inc)) |
99 inc = os.path.normpath(os.path.join(base, inc)) |
103 incfp = open(inc) |
100 if include: |
104 self.read(inc, incfp) |
101 include(inc, remap=remap, sections=sections) |
105 continue |
102 continue |
106 if emptyre.match(l): |
103 if emptyre.match(l): |
107 continue |
104 continue |
108 m = sectionre.match(l) |
105 m = sectionre.match(l) |
109 if m: |
106 if m: |
115 if m: |
112 if m: |
116 item = m.group(1) |
113 item = m.group(1) |
117 cont = 1 |
114 cont = 1 |
118 if sections and section not in sections: |
115 if sections and section not in sections: |
119 continue |
116 continue |
120 self.set(section, item, m.group(2), "%s:%d" % (path, line)) |
117 self.set(section, item, m.group(2), "%s:%d" % (src, line)) |
121 continue |
118 continue |
122 m = unsetre.match(l) |
119 m = unsetre.match(l) |
123 if m: |
120 if m: |
124 name = m.group(1) |
121 name = m.group(1) |
125 if sections and section not in sections: |
122 if sections and section not in sections: |
127 if self.get(section, name) != None: |
124 if self.get(section, name) != None: |
128 del self._data[section][name] |
125 del self._data[section][name] |
129 continue |
126 continue |
130 |
127 |
131 raise error.ConfigError(_('config error at %s:%d: \'%s\'') |
128 raise error.ConfigError(_('config error at %s:%d: \'%s\'') |
132 % (path, line, l.rstrip())) |
129 % (src, line, l.rstrip())) |
|
130 |
|
131 def read(self, path, fp=None, sections=None, remap=None): |
|
132 if not fp: |
|
133 fp = open(path) |
|
134 self.parse(path, fp.read(), sections, remap, self.read) |