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)