From fd5042a1c4c6d2276f5c8b712f32b4ddd27eaf43 Mon Sep 17 00:00:00 2001 From: Chris Johns Date: Sat, 20 Apr 2013 21:42:39 +1000 Subject: [PATCH] Support multiple read maps. A build could require more than one map to be active at once. This change allows more than one map to be set. An example is gcc and newlib. Having separate maps allows a user to control which part they test. --- source-builder/sb/macros.py | 61 ++++++++++++++++++++----------------- 1 file changed, 33 insertions(+), 28 deletions(-) diff --git a/source-builder/sb/macros.py b/source-builder/sb/macros.py index 3474bb6..f1dd43f 100644 --- a/source-builder/sb/macros.py +++ b/source-builder/sb/macros.py @@ -56,11 +56,11 @@ class macros: self.macro_filter = re.compile(r'%{[^}]+}') if original is None: self.macros = {} - self.read_map = 'global' + self.read_maps = [] self.write_map = 'global' - self.macros[self.read_map] = {} - self.macros[self.read_map]['_cwd'] = ('dir', 'required', path.shell(os.getcwd())) - self.macros[self.read_map]['_sbdir'] = ('dir', 'required', path.shell(sbdir)) + self.macros['global'] = {} + self.macros['global']['_cwd'] = ('dir', 'required', path.shell(os.getcwd())) + self.macros['global']['_sbdir'] = ('dir', 'required', path.shell(sbdir)) else: self.macros = {} for m in original.macros: @@ -68,7 +68,7 @@ class macros: self.macros[m] = {} for k in original.macros[m]: self.macros[m][k] = original.macros[m][k] - self.read_map = original.read_map + self.read_maps = sorted(original.read_maps) self.write_map = original.write_map if name is not None: self.load(name) @@ -157,24 +157,14 @@ class macros: return len(self.keys()) def keys(self): - - def _map_keys(_map): - u = [] - k = [] - for mk in _map: - if _map[mk][1] == 'undefine': - u += [mk] + keys = self.macros['global'].keys() + for rm in self.get_read_maps(): + for mk in self.macros[rm]: + if self.macros[rm][mk][1] == 'undefine': + if mk in keys: + keys.remove(mk) else: - k += [mk] - return k, u - - keys, undefined = _map_keys(self.macros[self.read_map]) - if map is not 'global': - gk, u = _map_keys(self.macros['global']) - undefined = set(undefined + u) - for k in gk: - if k not in undefined: - keys += [k] + keys.append(mk) return sorted(set(keys)) def has_key(self, key): @@ -187,6 +177,9 @@ class macros: def maps(self): return self.macros.keys() + def get_read_maps(self): + return [rm[5:] for rm in self.read_maps] + def key_filter(self, key): if key.startswith('%{') and key[-1] is '}': key = key[2:-1] @@ -310,8 +303,9 @@ class macros: if type(key) is not str: raise TypeError('bad key type: %s' % (type(key))) key = self.key_filter(key) - if self.read_map is not 'global'and key in self.macros[self.read_map]: - return self.macros[self.read_map][key] + for rm in self.get_read_maps(): + if key in self.macros[rm]: + return self.macros[rm][key] if key in self.macros['global']: return self.macros['global'][key] return None @@ -367,9 +361,19 @@ class macros: keys += [key] return keys - def set_read_map(self, map): - if map in self.macros: - self.read_map = map + def set_read_map(self, _map): + if _map in self.macros: + if _map not in self.get_read_maps(): + rm = '%04d_%s' % (len(self.read_maps), _map) + self.read_maps = sorted(self.read_maps + [rm]) + return True + return False + + def unset_read_map(self, _map): + if _map in self.get_read_maps(): + for i in range(0, len(self.read_maps)): + if '%04d_%s' % (i, _map) == self.read_maps[i]: + self.read_maps.pop(i) return True return False @@ -391,12 +395,13 @@ if __name__ == "__main__": m.parse("[test]\n" \ "test1: none, undefine, ''\n" \ "name: none, override, 'pink'\n") - m.set_read_map('test') + print 'set test:', m.set_read_map('test') if m['name'] != 'pink': print 'error: override failed. name is %s' % (m['name']) sys.exit(1) if m.has_key('test1'): print 'error: map undefine failed.' sys.exit(1) + print 'unset test:', m.unset_read_map('test') print m print m.keys()