Mercurial > public > mercurial-scm > hg-stable
comparison mercurial/ui.py @ 3344:d9b3d3d34749
ui.py: change the overlay from a dict to a SafeConfigParser.
This also fixes what's probably a bug - configitems was ignoring the overlay.
author | Alexis S. L. Carvalho <alexis@cecm.usp.br> |
---|---|
date | Tue, 10 Oct 2006 18:43:20 -0300 |
parents | ab406cfa1b99 |
children | a09be4317f9c |
comparison
equal
deleted
inserted
replaced
3343:ab406cfa1b99 | 3344:d9b3d3d34749 |
---|---|
8 from i18n import gettext as _ | 8 from i18n import gettext as _ |
9 from demandload import * | 9 from demandload import * |
10 demandload(globals(), "errno getpass os re socket sys tempfile") | 10 demandload(globals(), "errno getpass os re socket sys tempfile") |
11 demandload(globals(), "ConfigParser mdiff templater traceback util") | 11 demandload(globals(), "ConfigParser mdiff templater traceback util") |
12 | 12 |
13 def dupconfig(orig): | |
14 new = ConfigParser.SafeConfigParser(orig.defaults()) | |
15 updateconfig(orig, new) | |
16 return new | |
17 | |
18 def updateconfig(source, dest): | |
19 for section in source.sections(): | |
20 if not dest.has_section(section): | |
21 dest.add_section(section) | |
22 for name, value in source.items(section, raw=True): | |
23 dest.set(section, name, value) | |
24 | |
13 class ui(object): | 25 class ui(object): |
14 def __init__(self, verbose=False, debug=False, quiet=False, | 26 def __init__(self, verbose=False, debug=False, quiet=False, |
15 interactive=True, traceback=False, parentui=None): | 27 interactive=True, traceback=False, parentui=None): |
16 self.overlay = {} | 28 self.overlay = None |
17 self.header = [] | 29 self.header = [] |
18 self.prev_header = [] | 30 self.prev_header = [] |
19 if parentui is None: | 31 if parentui is None: |
20 # this is the parent of all ui children | 32 # this is the parent of all ui children |
21 self.parentui = None | 33 self.parentui = None |
32 self.updateopts(verbose, debug, quiet, interactive) | 44 self.updateopts(verbose, debug, quiet, interactive) |
33 else: | 45 else: |
34 # parentui may point to an ui object which is already a child | 46 # parentui may point to an ui object which is already a child |
35 self.parentui = parentui.parentui or parentui | 47 self.parentui = parentui.parentui or parentui |
36 self.readhooks = self.parentui.readhooks[:] | 48 self.readhooks = self.parentui.readhooks[:] |
37 parent_cdata = self.parentui.cdata | 49 self.cdata = dupconfig(self.parentui.cdata) |
38 self.cdata = ConfigParser.SafeConfigParser(parent_cdata.defaults()) | 50 if self.parentui.overlay: |
39 # make interpolation work | 51 self.overlay = dupconfig(self.parentui.overlay) |
40 for section in parent_cdata.sections(): | |
41 self.cdata.add_section(section) | |
42 for name, value in parent_cdata.items(section, raw=True): | |
43 self.cdata.set(section, name, value) | |
44 | 52 |
45 def __getattr__(self, key): | 53 def __getattr__(self, key): |
46 return getattr(self.parentui, key) | 54 return getattr(self.parentui, key) |
47 | 55 |
48 def updateopts(self, verbose=False, debug=False, quiet=False, | 56 def updateopts(self, verbose=False, debug=False, quiet=False, |
76 if root is None: | 84 if root is None: |
77 root = os.path.expanduser('~') | 85 root = os.path.expanduser('~') |
78 for name, path in self.configitems("paths"): | 86 for name, path in self.configitems("paths"): |
79 if path and "://" not in path and not os.path.isabs(path): | 87 if path and "://" not in path and not os.path.isabs(path): |
80 self.cdata.set("paths", name, os.path.join(root, path)) | 88 self.cdata.set("paths", name, os.path.join(root, path)) |
89 # override data from config files with data set with ui.setconfig | |
90 if self.overlay: | |
91 updateconfig(self.overlay, self.cdata) | |
81 for hook in self.readhooks: | 92 for hook in self.readhooks: |
82 hook(self) | 93 hook(self) |
83 | 94 |
84 def addreadhook(self, hook): | 95 def addreadhook(self, hook): |
85 self.readhooks.append(hook) | 96 self.readhooks.append(hook) |
86 | 97 |
87 def setconfig(self, section, name, val): | 98 def setconfig(self, section, name, value): |
88 self.overlay[(section, name)] = val | 99 if not self.overlay: |
100 self.overlay = ConfigParser.SafeConfigParser() | |
101 for cdata in (self.overlay, self.cdata): | |
102 if not cdata.has_section(section): | |
103 cdata.add_section(section) | |
104 cdata.set(section, name, value) | |
89 | 105 |
90 def _config(self, section, name, default, funcname): | 106 def _config(self, section, name, default, funcname): |
91 if self.overlay.has_key((section, name)): | |
92 return self.overlay[(section, name)] | |
93 if self.cdata.has_option(section, name): | 107 if self.cdata.has_option(section, name): |
94 try: | 108 try: |
95 func = getattr(self.cdata, funcname) | 109 func = getattr(self.cdata, funcname) |
96 return func(section, name) | 110 return func(section, name) |
97 except ConfigParser.InterpolationError, inst: | 111 except ConfigParser.InterpolationError, inst: |
130 x = items.items() | 144 x = items.items() |
131 x.sort() | 145 x.sort() |
132 return x | 146 return x |
133 | 147 |
134 def walkconfig(self): | 148 def walkconfig(self): |
135 seen = {} | |
136 for (section, name), value in self.overlay.iteritems(): | |
137 yield section, name, value | |
138 seen[section, name] = 1 | |
139 sections = self.cdata.sections() | 149 sections = self.cdata.sections() |
140 sections.sort() | 150 sections.sort() |
141 for section in sections: | 151 for section in sections: |
142 for name, value in self.configitems(section): | 152 for name, value in self.configitems(section): |
143 if (section, name) in seen: continue | |
144 yield section, name, value.replace('\n', '\\n') | 153 yield section, name, value.replace('\n', '\\n') |
145 seen[section, name] = 1 | |
146 | 154 |
147 def extensions(self): | 155 def extensions(self): |
148 result = self.configitems("extensions") | 156 result = self.configitems("extensions") |
149 for i, (key, value) in enumerate(result): | 157 for i, (key, value) in enumerate(result): |
150 if value: | 158 if value: |