[kernel] r4965 - in people/waldi/linux-2.6/debian: bin lib/python/debian_linux

Bastian Blank waldi at costa.debian.org
Sun Dec 4 11:36:20 UTC 2005


Author: waldi
Date: Sun Dec  4 11:36:20 2005
New Revision: 4965

Modified:
   people/waldi/linux-2.6/debian/bin/gencontrol.py
   people/waldi/linux-2.6/debian/lib/python/debian_linux/config.py
   people/waldi/linux-2.6/debian/lib/python/debian_linux/gencontrol.py
Log:
Rewrite config reader to support more than one section per (arch, subarch, flavour).

* debian/bin/gencontrol.py, debian/lib/python/debian_linux/gencontrol.py:
  Explicitely Use base entries.
* debian/lib/python/debian_linux/config.py
  - Rewrite.
  - Loose support for entry merging for now.


Modified: people/waldi/linux-2.6/debian/bin/gencontrol.py
==============================================================================
--- people/waldi/linux-2.6/debian/bin/gencontrol.py	(original)
+++ people/waldi/linux-2.6/debian/bin/gencontrol.py	Sun Dec  4 11:36:20 2005
@@ -33,17 +33,17 @@
         makefile.append(("setup-%s-real:" % arch, cmds_setup))
 
     def do_arch_packages_post(self, packages, makefile, arch, vars, makeflags, extra):
-        config_entry = self.config[arch,]
+        config_entry = self.config['base', arch]
         makeflags_string = ' '.join(["%s='%s'" % i for i in makeflags.iteritems()])
 
         # Append this here so it only occurs on the install-headers-all line
-        makeflags_string += " FLAVOURS='%s' " % ' '.join(['%s' % i for i in config_entry['flavours']])
+#        makeflags_string += " FLAVOURS='%s' " % ' '.join(['%s' % i for i in config_entry['flavours']])
         cmds_binary_arch = []
         cmds_binary_arch.append(("$(MAKE) -f debian/rules.real install-headers-all GENCONTROL_ARGS='\"-Vkernel:Depends=%s\"' %s" % (', '.join(extra['headers_arch_depends']), makeflags_string),))
         makefile.append(("binary-arch-%s-real:" % arch, cmds_binary_arch))
 
     def do_subarch_makeflags(self, makeflags, arch, subarch):
-        config_entry = self.config[arch, subarch]
+        config_entry = self.config['base', arch, subarch]
         for i in ('kernel-header-dirs', 'KERNEL_HEADER_DIRS'),:
             if config_entry.has_key(i[0]):
                 makeflags[i[1]] = config_entry[i[0]]
@@ -71,7 +71,7 @@
         makefile.append(("setup-%s-%s-real:" % (arch, subarch), cmds_setup))
 
     def do_flavour_makeflags(self, makeflags, arch, subarch, flavour):
-        config_entry = self.config[arch, subarch, flavour]
+        config_entry = self.config['base', arch, subarch, flavour]
         makeflags['TYPE'] = 'kernel-package'
         for i in (
             ('compiler', 'COMPILER'),

Modified: people/waldi/linux-2.6/debian/lib/python/debian_linux/config.py
==============================================================================
--- people/waldi/linux-2.6/debian/lib/python/debian_linux/config.py	(original)
+++ people/waldi/linux-2.6/debian/lib/python/debian_linux/config.py	Sun Dec  4 11:36:20 2005
@@ -1,5 +1,9 @@
 import os, os.path, re, sys, textwrap, ConfigParser
 
+__all__ = 'config_reader',
+
+_marker = object()
+
 class config_reader(dict):
     """
     Read configs in debian/arch and in the overlay directory.
@@ -35,115 +39,157 @@
         self._read_base()
 
     def __getitem__(self, key):
-        if isinstance(key, basestring):
-            return super(config_reader, self).__getitem__(key)
-        if isinstance(key, tuple):
-            ret = {}
-            self.update(ret, 'base')
-            if len(key) >= 1:
-                # XXX: workaround
-                del ret['abiname']
-                del ret['arches']
-                self.update(ret, key[0])
-            if len(key) >= 2:
-                del ret['subarches']
-                self.update(ret, '-'.join(key[0:2]))
-            if len(key) >= 3:
-                del ret['flavours']
-                self.update(ret, '-'.join(key[0:3]))
-            return ret
-        raise NotImplemented
+        return self.get(key)
 
     def _get_files(self, name):
         ret = []
         if self._overlay_dir is not None:
             ret.append(os.path.join(self._overlay_dir, name))
-        ret.append(name)
+        ret.append(os.path.join('debian/arch', name))
         return ret
 
-    def _read_arch(self, arch, base):
-        files = self._get_files("debian/arch/%s/%s" % (arch, self.config_name))
-        c = config_parser(self.schema)
-        c.read(files)
-        t = c.items_convert('base')
-        base.update(t)
-        self[arch] = t
-        subarches = t.get('subarches', [])
+    def _read_arch(self, arch):
+        files = self._get_files("%s/%s" % (arch, self.config_name))
+        config = config_parser(self.schema, files)
+
+        subarches = config['base',].get('subarches', [])
+        flavours = config['base',].get('flavours', [])
+
+        for section in iter(config):
+            real = list(section)
+            if real[-1] in subarches:
+                real[0:0] = ['base', arch]
+            elif real[-1] in flavours:
+                real[0:0] = ['base', arch, 'none']
+            else:
+                real[0:] = [real.pop(), arch]
+            real = tuple(real)
+            s = self.get(real, {})
+            s.update(config[section])
+            self[tuple(real)] = s
+
         for subarch in subarches:
             try:
-                t2 = c.items_convert(subarch)
-                avail = t2.get('available', True)
+                avail = self['base', arch, subarch].get('available', True)
             except ConfigParser.NoSectionError:
-                t2 = {}
                 avail = True
             if avail:
-                self._read_subarch(arch, subarch, t2)
-            else:
-                self['-'.join((arch, subarch))] = t2
-        flavours = t.get('flavours', None)
+                self._read_subarch(arch, subarch)
+
         if flavours:
-            for flavour in flavours:
-                self._read_flavour(arch, 'none', flavour, c)
-                self['-'.join((arch, 'none'))] = {}
+            base = self['base', arch]
             subarches.insert(0, 'none')
-        t['subarches'] = subarches
+            base['subarches'] = subarches
+            del base['flavours']
+            self['base', arch] = base
+            self['base', arch, 'none'] = {'flavours': flavours}
+            for flavour in flavours:
+                self._read_flavour(arch, 'none', flavour)
 
     def _read_base(self):
-        files = self._get_files("debian/arch/%s" % self.config_name)
-        c = config_parser(self.schema)
-        c.read(files)
-        t1 = c.items_convert('base')
-        self['base'] = t1
-        for arch in t1['arches']:
+        files = self._get_files(self.config_name)
+        config = config_parser(self.schema, files)
+
+        arches = config['base',]['arches']
+
+        for section in iter(config):
+            real = list(section)
+            if real[-1] in arches:
+                real.insert(0, 'base')
+            else:
+                real.insert(0, real.pop())
+            self[tuple(real)] = config[section]
+
+        for arch in arches:
             try:
-                t2 = c.items_convert(arch)
-                avail = t2.get('available', True)
-            except ConfigParser.NoSectionError:
-                t2 = {}
+                avail = self['base', arch].get('available', True)
+            except KeyError:
                 avail = True
             if avail:
-                self._read_arch(arch, t2)
-            else:
-                self[arch] = t2
+                self._read_arch(arch)
 
-    def _read_flavour(self, arch, subarch, flavour, c):
-        try:
-            t = c.items_convert(flavour)
-        except ConfigParser.NoSectionError:
-            try:
-                t = c.items_convert("%s-none-%s" % (arch, flavour))
-            except ConfigParser.NoSectionError:
-                #raise RuntimeError("Don't find config for %s-none-%s!" % (arch, flavour))
-                t = {}
-        self["%s-%s-%s" % (arch, subarch, flavour)] = t
+    def _read_flavour(self, arch, subarch, flavour):
+        if not self.has_key(('base', arch, subarch, flavour)):
+            import warnings
+            warnings.warn('No config entry for flavour %s, subarch %s, arch %s' % (flavour, subarch, arch), DeprecationWarning)
+            self['base', arch, subarch, flavour] = {}
 
     def _read_subarch(self, arch, subarch, base):
-        files = self._get_files("debian/arch/%s/%s/%s" % (arch, subarch, self.config_name))
-        c = config_parser(self.schema)
-        c.read(files)
-        t = c.items_convert('base')
-        base.update(t)
-        self['-'.join((arch, subarch))] = t
-        flavours = t.get('flavours', None)
-        for flavour in flavours:
-            self._read_flavour(arch, subarch, flavour, c)
+        raise NotImplemented
 
-    def update(self, ret, inputkey):
-        for key, value in super(config_reader, self).__getitem__(inputkey).iteritems():
+    def _update(self, ret, inputkey):
+        for key, value in super(config_reader, self).get(tuple(inputkey), {}).iteritems():
             ret[key] = value
 
-class config_parser(object, ConfigParser.ConfigParser):
-    def __init__(self, schema):
-        ConfigParser.ConfigParser.__init__(self)
+    def get(self, key, default = _marker):
+        if isinstance(key, basestring):
+            key = key,
+
+        ret = super(config_reader, self).get(tuple(key), default)
+        if ret == _marker:
+            raise KeyError, key
+        return ret
+
+    def sections(self):
+        return super(config_reader, self).keys()
+
+class config_parser(object):
+    __slots__ = 'configs', 'schema'
+
+    def __init__(self, schema, files):
+        self.configs = []
         self.schema = schema
+        for file in files:
+            config = ConfigParser.ConfigParser()
+            config.read(file)
+            self.configs.append(config)
+
+    def __getitem__(self, key):
+        return self.items(key)
+
+    def __iter__(self):
+        return iter(self.sections())
 
-    def items_convert(self, section):
-        items = self.items(section)
+    def items(self, section, var = {}):
         ret = {}
-        for key, value in items:
+        section = '_'.join(section)
+        exception = None
+        for config in self.configs:
             try:
-                value = self.schema[key](value)
-            except KeyError: pass
-            ret[key] = value
+                items = config.items(section)
+            except ConfigParser.NoSectionError, e:
+                exception = e
+            else:
+                for key, value in items:
+                    try:
+                        value = self.schema[key](value)
+                    except KeyError: pass
+                    ret[key] = value
+                exception = None
+        if exception is not None:
+            raise exception
         return ret
 
+    def sections(self):
+        sections = []
+        for config in self.configs:
+            for section in config.sections():
+                section = tuple(section.split('_'))
+                if section not in sections:
+                    sections.append(section)
+        return sections
+
+if __name__ == '__main__':
+    import sys
+    config = config_reader()
+    sections = config.sections()
+    sections.sort()
+    for section in sections:
+        print "[%s]" % (section,)
+        items = config[section]
+        items_keys = items.keys()
+        items_keys.sort()
+        for item in items:
+            print "%s: %s" % (item, items[item])
+        print
+

Modified: people/waldi/linux-2.6/debian/lib/python/debian_linux/gencontrol.py
==============================================================================
--- people/waldi/linux-2.6/debian/lib/python/debian_linux/gencontrol.py	(original)
+++ people/waldi/linux-2.6/debian/lib/python/debian_linux/gencontrol.py	Sun Dec  4 11:36:20 2005
@@ -46,7 +46,7 @@
         self.do_main_packages(packages)
         self.do_main_makefile(makefile, makeflags)
 
-        for arch in iter(self.config['base']['arches']):
+        for arch in iter(self.config['base',]['arches']):
             self.do_arch(packages, makefile, arch, self.changelog_vars.copy(), makeflags.copy())
 
     def do_main_makefile(self, makefile, makeflags):
@@ -86,7 +86,7 @@
             makefile.append(("binary-arch-%s-extra:" % arch, cmds))
 
     def do_arch(self, packages, makefile, arch, vars, makeflags):
-        config_entry = self.config[arch,]
+        config_entry = self.config['base', arch]
         vars.update(config_entry)
 
         if not config_entry.get('available', True):
@@ -123,7 +123,7 @@
             vars['subarch'] = ''
         else:
             vars['subarch'] = '%s-' % subarch
-        config_entry = self.config[arch, subarch]
+        config_entry = self.config['base', arch, subarch]
         vars.update(config_entry)
 
         makeflags['SUBARCH'] = subarch
@@ -146,7 +146,7 @@
         pass
 
     def do_flavour(self, packages, makefile, arch, subarch, flavour, vars, makeflags, extra):
-        config_entry = self.config[arch, subarch, flavour]
+        config_entry = self.config['base', arch, subarch, flavour]
         vars.update(config_entry)
 
         vars['flavour'] = flavour
@@ -179,7 +179,7 @@
             ret[1] = vars['abiname'] = version['modifier']
             ret[2] = ""
         else:
-            ret[1] = vars['abiname'] = self.config['base']['abiname']
+            ret[1] = vars['abiname'] = self.config['base',]['abiname']
             ret[2] = "-%s" % vars['abiname']
         vars['version'] = version['version']
         vars['major'] = version['major']



More information about the Kernel-svn-changes mailing list