Mercurial > public > mercurial-scm > hg-stable
diff mercurial/config.py @ 8144:fca54469480e
ui: introduce new config parser
author | Matt Mackall <mpm@selenic.com> |
---|---|
date | Thu, 23 Apr 2009 15:40:10 -0500 |
parents | |
children | 6fc30fe7f3e7 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mercurial/config.py Thu Apr 23 15:40:10 2009 -0500 @@ -0,0 +1,93 @@ +from i18n import _ +import re, error + +class sortdict(dict): + 'a simple append-only sorted dictionary' + def __init__(self, data=None): + self._list = [] + if data: + if hasattr(data, '_list'): + self._list = list(data._list) + self.update(data) + def copy(self): + return sortdict(self) + def __setitem__(self, key, val): + if key in self: + self._list.remove(key) + self._list.append(key) + dict.__setitem__(self, key, val) + def __iter__(self): + return self._list.__iter__() + def update(self, src): + for k in src: + self[k] = src[k] + def items(self): + return [(k,self[k]) for k in self._list] + +class config: + def __init__(self, data=None): + self._data = {} + if data: + for k in data._data: + self._data[k] = data[k].copy() + def copy(self): + return config(self) + def __contains__(self, section): + return section in self._data + def update(self, src, sections=None): + if not sections: + sections = src.sections() + for s in sections: + if s not in src: + continue + if s not in self: + self._data[s] = sortdict() + for k in src._data[s]: + self._data[s][k] = src._data[s][k] + def get(self, section, item, default=None): + return self._data.get(section, {}).get(item, (default, ""))[0] + def getsource(self, section, item): + return self._data.get(section, {}).get(item, (None, ""))[1] + def sections(self): + return sorted(self._data.keys()) + def items(self, section): + return [(k, v[0]) for k,v in self._data.get(section, {}).items()] + def set(self, section, item, value, source=""): + if section not in self: + self._data[section] = sortdict() + self._data[section][item] = (value, source) + + def read(self, path, fp): + sectionre = re.compile(r'\[([^\[]+)\]') + itemre = re.compile(r'([^=\s]+)\s*=\s*(.*)') + contre = re.compile(r'\s+(\S.*)') + emptyre = re.compile(r'(;|#|\s*$)') + section = "" + item = None + line = 0 + cont = 0 + for l in fp: + line += 1 + if cont: + m = contre.match(l) + if m: + v = self.get(section, item) + "\n" + m.group(1) + self.set(section, item, v, "%s:%d" % (path, line)) + continue + item = None + if emptyre.match(l): + continue + m = sectionre.match(l) + if m: + section = m.group(1) + if section not in self: + self._data[section] = sortdict() + continue + m = itemre.match(l) + if m: + item = m.group(1) + self.set(section, item, m.group(2), "%s:%d" % (path, line)) + cont = 1 + continue + raise error.ConfigError(_('config error at %s:%d: \'%s\'') + % (path, line, l.rstrip()))