Mercurial > hg
comparison mercurial/config.py @ 8265:52c5be55af82
config: add parse interface
author | Matt Mackall <mpm@selenic.com> |
---|---|
date | Thu, 30 Apr 2009 19:22:06 -0500 |
parents | 41031699550a |
children | 9542f4c3fa1b |
comparison
equal
deleted
inserted
replaced
8264:63ea850b3312 | 8265:52c5be55af82 |
---|---|
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) |