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

Bastian Blank waldi at costa.debian.org
Sun Nov 13 14:45:12 UTC 2005


Author: waldi
Date: Sun Nov 13 14:45:12 2005
New Revision: 4797

Added:
   people/waldi/linux-2.6/debian/lib/python/debian_linux/debian.py
   people/waldi/linux-2.6/debian/lib/python/debian_linux/gencontrol.py
   people/waldi/linux-2.6/debian/lib/python/debian_linux/utils.py
Modified:
   people/waldi/linux-2.6/debian/bin/gencontrol.py
   people/waldi/linux-2.6/debian/lib/python/debian_linux/__init__.py
   people/waldi/linux-2.6/debian/lib/python/debian_linux/config.py
Log:
* debian/bin/gencontrol.py: Move code away. For now only use imported code.
* debian/lib/python/debian_linux/__init__.py: Remove utils.
* debian/lib/python/debian_linux/config.py: Update.
* debian/lib/python/debian_linux/debian.py: Add debian packaging specific code.
* debian/lib/python/debian_linux/gencontrol.py: Add code.
* debian/lib/python/debian_linux/utils.py: Add utils.


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 Nov 13 14:45:12 2005
@@ -1,446 +1,10 @@
-#!/usr/bin/env python
+#!/usr/bin/env python2.4
 import os, os.path, re, sys, textwrap, ConfigParser
 sys.path.append("debian/lib/python")
-from debian_linux import *
-
-class packages_list(sorted_dict):
-    def append(self, package):
-        self[package['Package']] = package
-
-    def extend(self, packages):
-        for package in packages:
-            self[package['Package']] = package
-
-def read_changelog():
-    r = re.compile(r"""
-^
-(
-(?P<header>
-    (?P<header_source>
-        \w[-+0-9a-z.]+
-    )
-    \ 
-    \(
-    (?P<header_version>
-        [^\(\)\ \t]+
-    )
-    \)
-    \s+
-    (?P<header_distribution>
-        [-0-9a-zA-Z]+
-    )
-    \;
-)
-)
-""", re.VERBOSE)
-    f = file("debian/changelog")
-    entries = []
-    act_upstream = None
-    while True:
-        line = f.readline()
-        if not line:
-            break
-        line = line.strip('\n')
-        match = r.match(line)
-        if not match:
-            continue
-        if match.group('header'):
-            e = entry()
-            e['Distribution'] = match.group('header_distribution')
-            e['Source'] = match.group('header_source')
-            version = parse_version(match.group('header_version'))
-            e['Version'] = version
-            if act_upstream is None:
-                act_upstream = version['upstream']
-            elif version['upstream'] != act_upstream:
-                break
-            entries.append(e)
-    return entries
-
-def parse_version(version):
-    version_re = ur"""
-^
-(?P<source>
-    (?P<parent>
-        \d+\.\d+\.\d+\+
-    )?
-    (?P<upstream>
-        (?P<version>
-            (?P<major>\d+\.\d+)
-            \.
-            \d+
-        )
-        (?:
-            -
-            (?P<modifier>
-                .+?
-            )
-        )?
-    )
-    -
-    (?P<debian>[^-]+)
-)
-$
-"""
-    match = re.match(version_re, version, re.X)
-    ret = match.groupdict()
-    if ret['parent'] is not None:
-        ret['source_upstream'] = ret['parent'] + ret['upstream']
-    else:
-        ret['source_upstream'] = ret['upstream']
-    return ret
-
-def process_changelog(in_vars, config, changelog):
-    ret = [None, None, None, None]
-    ret[0] = version = changelog[0]['Version']
-    vars = in_vars.copy()
-    if version['modifier'] is not None:
-        ret[1] = vars['abiname'] = version['modifier']
-        ret[2] = ""
-    else:
-        ret[1] = vars['abiname'] = config['base']['abiname']
-        ret[2] = "-%s" % vars['abiname']
-    vars['version'] = version['version']
-    vars['major'] = version['major']
-    ret[3] = vars
-    return ret
-
-def process_depends(key, e, in_e, vars):
-    in_dep = in_e[key].split(',')
-    dep = []
-    for d in in_dep:
-        d = d.strip()
-        d = substitute(d, vars)
-        if d:
-            dep.append(d)
-    if dep:
-        t = ', '.join(dep)
-        e[key] = t
-
-def process_description(e, in_e, vars):
-    desc = in_e['Description']
-    desc_short, desc_long = desc.split ("\n", 1)
-    desc_pars = [substitute(i, vars) for i in desc_long.split ("\n.\n")]
-    desc_pars_wrapped = []
-    w = wrap(width = 74, fix_sentence_endings = True)
-    for i in desc_pars:
-        desc_pars_wrapped.append(w.fill(i))
-    e['Description'] = "%s\n%s" % (substitute(desc_short, vars), '\n.\n'.join(desc_pars_wrapped))
-
-def process_package(in_entry, vars):
-    e = entry()
-    for i in in_entry.iterkeys():
-        if i in (('Depends', 'Provides', 'Suggests', 'Recommends', 'Conflicts')):
-            process_depends(i, e, in_entry, vars)
-        elif i == 'Description':
-            process_description(e, in_entry, vars)
-        elif i[:2] == 'X-':
-            pass
-        else:
-            e[i] = substitute(in_entry[i], vars)
-    return e
-
-def process_packages(in_entries, vars):
-    entries = []
-    for i in in_entries:
-        entries.append(process_package(i, vars))
-    return entries
-
-def process_real_image(in_entry, vars):
-    in_entry = in_entry.copy()
-    if vars.has_key('desc'):
-        in_entry['Description'] += "\n.\n" + vars['desc']
-    entry = process_package(in_entry, vars)
-    for i in (('Depends', 'Provides', 'Suggests', 'Recommends', 'Conflicts')):
-        value = []
-        tmp = entry.get(i, None)
-        if tmp:
-            tmp = tmp.split(',')
-            for t in tmp:
-                value.append(t.strip())
-        if i == 'Depends':
-            t = vars.get('depends', None)
-            if t is not None:
-                value.append(t)
-        elif i == 'Provides':
-            t = vars.get('provides', None)
-            if t is not None:
-                value.append(t)
-        elif i == 'Suggests':
-            t = vars.get('suggests', None)
-            if t is not None:
-                value.append(t)
-        elif i == 'Recommends':
-            t = vars.get('recommends', None)
-            if t is not None:
-                value.append(t)
-        elif i == 'Conflicts':
-            t = vars.get('conflicts', None)
-            if t is not None:
-                value.append(t)
-        entry[i] = ', '.join(value)
-    return entry
-
-def process_real_tree(in_entry, changelog, vars):
-    entry = process_package(in_entry, vars)
-    tmp = changelog[0]['Version']['upstream']
-    versions = []
-    for i in changelog:
-        if i['Version']['upstream'] != tmp:
-            break
-        versions.insert(0, i['Version'])
-    for i in (('Depends', 'Provides')):
-        value = []
-        tmp = entry.get(i, None)
-        if tmp:
-            value.extend([j.strip() for j in tmp.split(',')])
-        if i == 'Depends':
-            value.append("linux-patch-debian-%(version)s (= %(source)s)" % changelog[0]['Version'])
-            value.append(' | '.join(["linux-source-%(version)s (= %(source)s)" % v for v in versions]))
-        elif i == 'Provides':
-            value.extend(["linux-tree-%(source)s" % v for v in versions])
-        entry[i] = ', '.join(value)
-    return entry
-
-def substitute(s, vars):
-    def subst(match):
-        return vars[match.group(1)]
-    return re.sub(r'@([a-z_]+)@', subst, s)
-
-def write_control(list):
-    write_rfc822(file("debian/control", 'w'), list)
-
-def write_makefile(list):
-    f = file("debian/rules.gen", 'w')
-    for i in list:
-        f.write("%s\n" % i[0])
-        if i[1] is not None:
-            list = i[1]
-            if isinstance(list, basestring):
-                list = list.split('\n')
-            for j in list:
-                f.write("\t%s\n" % j)
-
-def write_rfc822(f, list):
-    for entry in list:
-        for key, value in entry.iteritems():
-            f.write("%s:" % key)
-            if isinstance(value, tuple):
-                value = value[0].join(value[1])
-            for k in value.split('\n'):
-              f.write(" %s\n" % k)
-        f.write('\n')
-
-def process_real_arch(packages, makefile, config, templates, arch, vars, makeflags):
-    config_entry = config[arch,]
-    vars.update(config_entry)
-
-    if not config_entry.get('available', True):
-        for i in ('binary-arch', 'build', 'setup'):
-            makefile.append(("%s-%s:" % (i, arch), ["@echo Architecture %s is not available!" % arch, "@exit 1"]))
-        return
-
-    headers_arch = templates["control.headers.arch"]
-    package_headers_arch = process_package(headers_arch[0], vars)
-    package_headers_arch_depends = []
-
-    name = package_headers_arch['Package']
-    if packages.has_key(name):
-        package_headers_arch = packages.get(name)
-        package_headers_arch['Architecture'][1].append(arch)
-    else:
-        package_headers_arch['Architecture'] = (' ', [arch])
-        packages.append(package_headers_arch)
-
-    for i in (('binary-arch', 'setup',)):
-        makefile.append(("%s-%s:: %s-%s-real" % (i, arch, i, arch), None))
-
-    makeflags['ARCH'] = arch
-    makeflags_string = ' '.join(["%s='%s'" % i for i in makeflags.iteritems()])
-
-    cmds_setup = []
-    cmds_setup.append(("$(MAKE) -f debian/rules.real setup-arch %s" % makeflags_string,))
-    makefile.append(("setup-%s-real:" % arch, cmds_setup))
-
-    for subarch in config_entry['subarches']:
-        process_real_subarch(packages, makefile, config, templates, arch, subarch, vars.copy(), makeflags.copy(), package_headers_arch_depends)
-
-    # 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']])
-    cmds_binary_arch = []
-    cmds_binary_arch.append(("$(MAKE) -f debian/rules.real install-headers-all GENCONTROL_ARGS='\"-Vkernel:Depends=%s\"' %s" % (', '.join(package_headers_arch_depends), makeflags_string),))
-    makefile.append(("binary-arch-%s-real:" % arch, cmds_binary_arch))
-
-def process_real_flavour(packages, makefile, config, templates, arch, subarch, flavour, vars, makeflags, package_headers_arch_depends):
-    config_entry = config[arch, subarch, flavour]
-    vars.update(config_entry)
-
-    vars['flavour'] = flavour
-    if not vars.has_key('class'):
-        vars['class'] = '%s-class' % flavour
-    if not vars.has_key('longclass'):
-        vars['longclass'] = vars['class']
-
-    image = templates["control.image"]
-    headers = templates["control.headers"]
-    image_latest = templates["control.image.latest"]
-    headers_latest = templates["control.headers.latest"]
-
-    packages_own = []
-    packages_dummy = []
-    packages_own.append(process_real_image(image[0], vars))
-    packages_own.append(process_package(headers[0], vars))
-    packages_dummy.extend(process_packages(image_latest, vars))
-    packages_dummy.append(process_package(headers_latest[0], vars))
-
-    for package in packages_own + packages_dummy:
-        name = package['Package']
-        if packages.has_key(name):
-            package = packages.get(name)
-            package['Architecture'][1].append(arch)
-        else:
-            package['Architecture'] = (' ', [arch])
-            packages.append(package)
-
-    package_headers_arch_depends.append(packages_own[1]['Package'])
-
-    for i in ('binary-arch', 'build', 'setup'):
-        makefile.append(("%s-%s-%s:: %s-%s-%s-%s" % (i, arch, subarch, i, arch, subarch, flavour), None))
-        makefile.append(("%s-%s-%s-%s:: %s-%s-%s-%s-real" % (i, arch, subarch, flavour, i, arch, subarch, flavour), None))
-
-    makeflags['FLAVOUR'] = flavour
-    makeflags['TYPE'] = 'kernel-package'
-    for i in (
-        ('compiler', 'COMPILER'),
-        ('kernel-header-dirs', 'KERNEL_HEADER_DIRS'),
-        ('kpkg-subarch', 'KPKG_SUBARCH'),
-        ('type', 'TYPE'),
-    ):
-        if config_entry.has_key(i[0]):
-            makeflags[i[1]] = config_entry[i[0]]
-    makeflags_string = ' '.join(["%s='%s'" % i for i in makeflags.iteritems()])
-
-    cmds_binary_arch = []
-    cmds_binary_arch.append(("$(MAKE) -f debian/rules.real binary-arch-flavour %s" % makeflags_string,))
-    cmds_binary_arch.append(("$(MAKE) -f debian/rules.real install-dummy DH_OPTIONS='%s'" % ' '.join(["-p%s" % i['Package'] for i in packages_dummy]),))
-    cmds_build = []
-    cmds_build.append(("$(MAKE) -f debian/rules.real build %s" % makeflags_string,))
-    cmds_setup = []
-    cmds_setup.append(("$(MAKE) -f debian/rules.real setup-flavour %s" % makeflags_string,))
-    makefile.append(("binary-arch-%s-%s-%s-real:" % (arch, subarch, flavour), cmds_binary_arch))
-    makefile.append(("build-%s-%s-%s-real:" % (arch, subarch, flavour), cmds_build))
-    makefile.append(("setup-%s-%s-%s-real:" % (arch, subarch, flavour), cmds_setup))
-
-def process_real_main(packages, makefile, config, templates, version, abiname, kpkg_abiname, changelog, vars):
-    source = templates["control.source"]
-    packages['source'] = process_package(source[0], vars)
-
-    main = templates["control.main"]
-    packages.extend(process_packages(main, vars))
-
-    tree = templates["control.tree"]
-    packages.append(process_real_tree(tree[0], changelog, vars))
-
-    makeflags = {
-        'VERSION': version['version'],
-        'SOURCE_UPSTREAM': version['source_upstream'],
-        'SOURCE_VERSION': version['source'],
-        'UPSTREAM_VERSION': version['upstream'],
-        'ABINAME': abiname,
-        'KPKG_ABINAME': kpkg_abiname,
-        'REVISIONS': ' '.join([i['Version']['debian'] for i in changelog[::-1]]),
-    }
-    makeflags_string = ' '.join(["%s='%s'" % i for i in makeflags.iteritems()])
-
-    cmds_binary_indep = []
-    cmds_binary_indep.append(("$(MAKE) -f debian/rules.real binary-indep %s" % makeflags_string,))
-    makefile.append(("binary-indep:", cmds_binary_indep))
-
-    for arch in iter(config['base']['arches']):
-        process_real_arch(packages, makefile, config, templates, arch, vars.copy(), makeflags.copy())
-
-    extra = templates["control.extra"]
-    packages.extend(process_packages(extra, vars))
-    extra_pn = {}
-    for i in extra:
-        arches = i['Architecture'].split(' ')
-        for arch in arches:
-            pn = extra_pn.get(arch, [])
-            pn.append(i)
-            extra_pn[arch] = pn
-    archs = extra_pn.keys()
-    archs.sort()
-    for arch in archs:
-        arch_vars = vars.copy()
-        arch_vars.update(config[arch])
-
-        cmds = []
-        for i in extra_pn[arch]:
-            tmp = []
-            if i.has_key('X-Version-Overwrite-Epoch'):
-                    tmp.append("-v1:%s" % version['source'])
-            cmds.append("$(MAKE) -f debian/rules.real install-dummy DH_OPTIONS='-p%s' GENCONTROL_ARGS='%s'" % (i['Package'], ' '.join(tmp)))
-        makefile.append(("binary-arch-%s:: binary-arch-%s-extra" % (arch, arch), None))
-        makefile.append(("binary-arch-%s-extra:" % arch, cmds))
-
-def process_real_subarch(packages, makefile, config, templates, arch, subarch, vars, makeflags, package_headers_arch_depends):
-    if subarch == 'none':
-        vars['subarch'] = ''
-    else:
-        vars['subarch'] = '%s-' % subarch
-    config_entry = config[arch, subarch]
-    vars.update(config_entry)
-
-    headers_subarch = templates["control.headers.subarch"]
-
-    package_headers = process_package(headers_subarch[0], vars)
-
-    name = package_headers['Package']
-    if packages.has_key(name):
-        package_headers = packages.get(name)
-        package_headers['Architecture'][1].append(arch)
-    else:
-        package_headers['Architecture'] = (' ', [arch])
-        packages.append(package_headers)
-
-    for i in ('binary-arch', 'build', 'setup'):
-        makefile.append(("%s-%s:: %s-%s-%s" % (i, arch, i, arch, subarch), None))
-        makefile.append(("%s-%s-%s::" % (i, arch, subarch), None))
-    for i in ('binary-arch', 'setup'):
-        makefile.append(("%s-%s-%s:: %s-%s-%s-real" % (i, arch, subarch, i, arch, subarch), None))
-
-    makeflags['SUBARCH'] = subarch
-    for i in ('kernel-header-dirs', 'KERNEL_HEADER_DIRS'),:
-        if config_entry.has_key(i[0]):
-            makeflags[i[1]] = config_entry[i[0]]
-    makeflags_string = ' '.join(["%s='%s'" % i for i in makeflags.iteritems()])
-
-    cmds_binary_arch = []
-    cmds_binary_arch.append(("$(MAKE) -f debian/rules.real binary-arch-subarch %s" % makeflags_string,))
-    cmds_setup = []
-    cmds_setup.append(("$(MAKE) -f debian/rules.real setup-subarch %s" % makeflags_string,))
-    makefile.append(("binary-arch-%s-%s-real:" % (arch, subarch), cmds_binary_arch))
-    makefile.append(("setup-%s-%s-real:" % (arch, subarch), cmds_setup))
-
-    for flavour in config_entry['flavours']:
-        process_real_flavour(packages, makefile, config, templates, arch, subarch, flavour, vars.copy(), makeflags.copy(), package_headers_arch_depends)
-
-def main():
-    changelog = read_changelog()
-
-    c = config_reader()
-    t = templates()
-
-    version, abiname, kpkg_abiname, vars = process_changelog({}, c, changelog)
-
-    packages = packages_list()
-    makefile = []
-
-    process_real_main(packages, makefile, c, t, version, abiname, kpkg_abiname, changelog, vars)
-
-    write_control(packages.itervalues())
-    write_makefile(makefile)
+import debian_linux.gencontrol
 
+class gencontrol(debian_linux.gencontrol.gencontrol):
+    pass
 
 if __name__ == '__main__':
-    main()
+    gencontrol()()

Modified: people/waldi/linux-2.6/debian/lib/python/debian_linux/__init__.py
==============================================================================
--- people/waldi/linux-2.6/debian/lib/python/debian_linux/__init__.py	(original)
+++ people/waldi/linux-2.6/debian/lib/python/debian_linux/__init__.py	Sun Nov 13 14:45:12 2005
@@ -1,100 +1,6 @@
 import os, os.path, re, sys, textwrap, ConfigParser
 
 from config import config_reader
-
-class _sorted_dict(dict):
-    __slots__ = ('_list')
-
-    def __init__(self):
-        super(_sorted_dict, self).__init__()
-        self._list = []
-
-    def __delitem__(self, key):
-        super(_sorted_dict, self).__delitem__(key)
-        self._list.remove(key)
-
-    def iterkeys(self):
-        for i in iter(self._list):
-            yield i
-
-    def iteritems(self):
-        for i in iter(self._list):
-            yield (i, self[i])
-
-    def itervalues(self):
-        for i in iter(self._list):
-            yield self[i]
-
-class sorted_dict(_sorted_dict):
-    __slots__ = ()
-
-    def __setitem__(self, key, value):
-        super(sorted_dict, self).__setitem__(key, value)
-        if key not in self._list:
-            self._list.append(key)
-
-class entry(_sorted_dict):
-    __slots__ = ()
-
-    def __setitem__(self, key, value):
-        super(entry, self).__setitem__(key, value)
-        if key not in self._list:
-            if 'Description' in self._list:
-                self._list.insert(len(self._list)-1, key)
-            else:
-                self._list.append(key)
-
-class templates(dict):
-    def __init__(self, dir = None):
-        if dir is None:
-            self.dir = "debian/templates"
-        else:
-            self.dir = dir
-
-    def __getitem__(self, key):
-        try:
-            return dict.__getitem__(self, key)
-        except KeyError: pass
-        ret = self._read(key)
-        dict.__setitem__(self, key, ret)
-        return ret
-
-    def __setitem__(self, key, value):
-        raise NotImplemented()
-
-    def _read(self, filename):
-        entries = []
-
-        f = file("%s/%s.in" % (self.dir, filename))
-
-        while True:
-            e = entry()
-            while True:
-                line = f.readline()
-                if not line:
-                    break
-                line = line.strip('\n')
-                if not line:
-                    break
-                if line[0] in ' \t':
-                    if not last:
-                        raise ValueError('Continuation line seen before first header')
-                    e[last] += '\n' + line.lstrip()
-                    continue
-                i = line.find(':')
-                if i < 0:
-                    raise ValueError("Not a header, not a continuation: ``%s''" % line)
-                last = line[:i]
-                e[last] = line[i+1:].lstrip()
-            if not e:
-                break
-
-            entries.append(e)
-
-        return entries
-
-class wrap(textwrap.TextWrapper):
-    wordsep_re = re.compile(
-        r'(\s+|'                                  # any whitespace
-        r'(?<=[\w\!\"\'\&\.\,\?])-{2,}(?=\w))')   # em-dash
+from debian import *
+from utils import *
 

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 Nov 13 14:45:12 2005
@@ -1,6 +1,10 @@
 import os, os.path, re, sys, textwrap, ConfigParser
 
 class config_reader(dict):
+    """
+    Read configs in debian/arch and in the overlay directory.
+    """
+
     class schema_item_boolean(object):
         def __call__(self, i):
             i = i.strip().lower()

Added: people/waldi/linux-2.6/debian/lib/python/debian_linux/debian.py
==============================================================================
--- (empty file)
+++ people/waldi/linux-2.6/debian/lib/python/debian_linux/debian.py	Sun Nov 13 14:45:12 2005
@@ -0,0 +1,81 @@
+import re, utils
+
+def read_changelog():
+    r = re.compile(r"""
+^
+(
+(?P<header>
+    (?P<header_source>
+        \w[-+0-9a-z.]+
+    )
+    \ 
+    \(
+    (?P<header_version>
+        [^\(\)\ \t]+
+    )
+    \)
+    \s+
+    (?P<header_distribution>
+        [-0-9a-zA-Z]+
+    )
+    \;
+)
+)
+""", re.VERBOSE)
+    f = file("debian/changelog")
+    entries = []
+    act_upstream = None
+    while True:
+        line = f.readline()
+        if not line:
+            break
+        line = line.strip('\n')
+        match = r.match(line)
+        if not match:
+            continue
+        if match.group('header'):
+            e = utils.entry()
+            e['Distribution'] = match.group('header_distribution')
+            e['Source'] = match.group('header_source')
+            version = parse_version(match.group('header_version'))
+            e['Version'] = version
+            if act_upstream is None:
+                act_upstream = version['upstream']
+            elif version['upstream'] != act_upstream:
+                break
+            entries.append(e)
+    return entries
+
+def parse_version(version):
+    version_re = ur"""
+^
+(?P<source>
+    (?P<parent>
+        \d+\.\d+\.\d+\+
+    )?
+    (?P<upstream>
+        (?P<version>
+            (?P<major>\d+\.\d+)
+            \.
+            \d+
+        )
+        (?:
+            -
+            (?P<modifier>
+                .+?
+            )
+        )?
+    )
+    -
+    (?P<debian>[^-]+)
+)
+$
+"""
+    match = re.match(version_re, version, re.X)
+    ret = match.groupdict()
+    if ret['parent'] is not None:
+        ret['source_upstream'] = ret['parent'] + ret['upstream']
+    else:
+        ret['source_upstream'] = ret['upstream']
+    return ret
+

Added: people/waldi/linux-2.6/debian/lib/python/debian_linux/gencontrol.py
==============================================================================
--- (empty file)
+++ people/waldi/linux-2.6/debian/lib/python/debian_linux/gencontrol.py	Sun Nov 13 14:45:12 2005
@@ -0,0 +1,366 @@
+from config import *
+from debian import *
+from utils import *
+
+class packages_list(sorted_dict):
+    def append(self, package):
+        self[package['Package']] = package
+
+    def extend(self, packages):
+        for package in packages:
+            self[package['Package']] = package
+
+class gencontrol(object):
+    def __init__(self):
+        self.changelog = read_changelog()
+        self.config = config_reader()
+        self.templates = templates()
+        self.version, self.abiname, self.kpkg_abiname, self.changelog_vars = self.process_changelog({})
+
+    def __call__(self):
+        packages = packages_list()
+        makefile = []
+
+        self.do(packages, makefile)
+
+        self.write_control(packages.itervalues())
+        self.write_makefile(makefile)
+
+    def do(self, packages, makefile):
+        vars = self.changelog_vars
+
+        source = self.templates["control.source"]
+        packages['source'] = self.process_package(source[0], vars)
+
+        main = self.templates["control.main"]
+        packages.extend(self.process_packages(main, vars))
+
+        tree = self.templates["control.tree"]
+        packages.append(self.process_real_tree(tree[0], vars))
+
+        makeflags = {
+            'VERSION': self.version['version'],
+            'SOURCE_UPSTREAM': self.version['source_upstream'],
+            'SOURCE_VERSION': self.version['source'],
+            'UPSTREAM_VERSION': self.version['upstream'],
+            'ABINAME': self.abiname,
+            'KPKG_ABINAME': self.kpkg_abiname,
+            'REVISIONS': ' '.join([i['Version']['debian'] for i in self.changelog[::-1]]),
+        }
+        makeflags_string = ' '.join(["%s='%s'" % i for i in makeflags.iteritems()])
+
+        cmds_binary_indep = []
+        cmds_binary_indep.append(("$(MAKE) -f debian/rules.real binary-indep %s" % makeflags_string,))
+        makefile.append(("binary-indep:", cmds_binary_indep))
+
+        for arch in iter(self.config['base']['arches']):
+            self.do_arch(packages, makefile, arch, vars.copy(), makeflags.copy())
+
+        extra = self.templates["control.extra"]
+        packages.extend(self.process_packages(extra, vars))
+        extra_pn = {}
+        for i in extra:
+            arches = i['Architecture'].split(' ')
+            for arch in arches:
+                pn = extra_pn.get(arch, [])
+                pn.append(i)
+                extra_pn[arch] = pn
+        archs = extra_pn.keys()
+        archs.sort()
+        for arch in archs:
+            arch_vars = vars.copy()
+            arch_vars.update(self.config[arch])
+
+            cmds = []
+            for i in extra_pn[arch]:
+                tmp = []
+                if i.has_key('X-Version-Overwrite-Epoch'):
+                        tmp.append("-v1:%s" % self.version['source'])
+                cmds.append("$(MAKE) -f debian/rules.real install-dummy DH_OPTIONS='-p%s' GENCONTROL_ARGS='%s'" % (i['Package'], ' '.join(tmp)))
+            makefile.append(("binary-arch-%s:: binary-arch-%s-extra" % (arch, arch), None))
+            makefile.append(("binary-arch-%s-extra:" % arch, cmds))
+
+    def do_arch(self, packages, makefile, arch, vars, makeflags):
+        config_entry = self.config[arch,]
+        vars.update(config_entry)
+
+        if not config_entry.get('available', True):
+            for i in ('binary-arch', 'build', 'setup'):
+                makefile.append(("%s-%s:" % (i, arch), ["@echo Architecture %s is not available!" % arch, "@exit 1"]))
+            return
+
+        headers_arch = self.templates["control.headers.arch"]
+        package_headers_arch = self.process_package(headers_arch[0], vars)
+        package_headers_arch_depends = []
+
+        name = package_headers_arch['Package']
+        if packages.has_key(name):
+            package_headers_arch = packages.get(name)
+            package_headers_arch['Architecture'][1].append(arch)
+        else:
+            package_headers_arch['Architecture'] = (' ', [arch])
+            packages.append(package_headers_arch)
+
+        for i in (('binary-arch', 'setup',)):
+            makefile.append(("%s-%s:: %s-%s-real" % (i, arch, i, arch), None))
+
+        makeflags['ARCH'] = arch
+        makeflags_string = ' '.join(["%s='%s'" % i for i in makeflags.iteritems()])
+
+        cmds_setup = []
+        cmds_setup.append(("$(MAKE) -f debian/rules.real setup-arch %s" % makeflags_string,))
+        makefile.append(("setup-%s-real:" % arch, cmds_setup))
+
+        for subarch in config_entry['subarches']:
+            self.do_subarch(packages, makefile, arch, subarch, vars.copy(), makeflags.copy(), package_headers_arch_depends)
+
+        # 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']])
+        cmds_binary_arch = []
+        cmds_binary_arch.append(("$(MAKE) -f debian/rules.real install-headers-all GENCONTROL_ARGS='\"-Vkernel:Depends=%s\"' %s" % (', '.join(package_headers_arch_depends), makeflags_string),))
+        makefile.append(("binary-arch-%s-real:" % arch, cmds_binary_arch))
+
+    def do_subarch(self, packages, makefile, arch, subarch, vars, makeflags, package_headers_arch_depends):
+        if subarch == 'none':
+            vars['subarch'] = ''
+        else:
+            vars['subarch'] = '%s-' % subarch
+        config_entry = self.config[arch, subarch]
+        vars.update(config_entry)
+
+        headers_subarch = self.templates["control.headers.subarch"]
+
+        package_headers = self.process_package(headers_subarch[0], vars)
+
+        name = package_headers['Package']
+        if packages.has_key(name):
+            package_headers = packages.get(name)
+            package_headers['Architecture'][1].append(arch)
+        else:
+            package_headers['Architecture'] = (' ', [arch])
+            packages.append(package_headers)
+
+        for i in ('binary-arch', 'build', 'setup'):
+            makefile.append(("%s-%s:: %s-%s-%s" % (i, arch, i, arch, subarch), None))
+            makefile.append(("%s-%s-%s::" % (i, arch, subarch), None))
+        for i in ('binary-arch', 'setup'):
+            makefile.append(("%s-%s-%s:: %s-%s-%s-real" % (i, arch, subarch, i, arch, subarch), None))
+
+        makeflags['SUBARCH'] = subarch
+        for i in ('kernel-header-dirs', 'KERNEL_HEADER_DIRS'),:
+            if config_entry.has_key(i[0]):
+                makeflags[i[1]] = config_entry[i[0]]
+        makeflags_string = ' '.join(["%s='%s'" % i for i in makeflags.iteritems()])
+
+        cmds_binary_arch = []
+        cmds_binary_arch.append(("$(MAKE) -f debian/rules.real binary-arch-subarch %s" % makeflags_string,))
+        cmds_setup = []
+        cmds_setup.append(("$(MAKE) -f debian/rules.real setup-subarch %s" % makeflags_string,))
+        makefile.append(("binary-arch-%s-%s-real:" % (arch, subarch), cmds_binary_arch))
+        makefile.append(("setup-%s-%s-real:" % (arch, subarch), cmds_setup))
+
+        for flavour in config_entry['flavours']:
+            self.do_flavour(packages, makefile, arch, subarch, flavour, vars.copy(), makeflags.copy(), package_headers_arch_depends)
+
+    def do_flavour(self, packages, makefile, arch, subarch, flavour, vars, makeflags, package_headers_arch_depends):
+        config_entry = self.config[arch, subarch, flavour]
+        vars.update(config_entry)
+
+        vars['flavour'] = flavour
+        if not vars.has_key('class'):
+            vars['class'] = '%s-class' % flavour
+        if not vars.has_key('longclass'):
+            vars['longclass'] = vars['class']
+
+        image = self.templates["control.image"]
+        headers = self.templates["control.headers"]
+        image_latest = self.templates["control.image.latest"]
+        headers_latest = self.templates["control.headers.latest"]
+
+        packages_own = []
+        packages_dummy = []
+        packages_own.append(self.process_real_image(image[0], vars))
+        packages_own.append(self.process_package(headers[0], vars))
+        packages_dummy.extend(self.process_packages(image_latest, vars))
+        packages_dummy.append(self.process_package(headers_latest[0], vars))
+
+        for package in packages_own + packages_dummy:
+            name = package['Package']
+            if packages.has_key(name):
+                package = packages.get(name)
+                package['Architecture'][1].append(arch)
+            else:
+                package['Architecture'] = (' ', [arch])
+                packages.append(package)
+
+        package_headers_arch_depends.append(packages_own[1]['Package'])
+
+        for i in ('binary-arch', 'build', 'setup'):
+            makefile.append(("%s-%s-%s:: %s-%s-%s-%s" % (i, arch, subarch, i, arch, subarch, flavour), None))
+            makefile.append(("%s-%s-%s-%s:: %s-%s-%s-%s-real" % (i, arch, subarch, flavour, i, arch, subarch, flavour), None))
+
+        makeflags['FLAVOUR'] = flavour
+        makeflags['TYPE'] = 'kernel-package'
+        for i in (
+            ('compiler', 'COMPILER'),
+            ('kernel-header-dirs', 'KERNEL_HEADER_DIRS'),
+            ('kpkg-subarch', 'KPKG_SUBARCH'),
+            ('type', 'TYPE'),
+        ):
+            if config_entry.has_key(i[0]):
+                makeflags[i[1]] = config_entry[i[0]]
+        makeflags_string = ' '.join(["%s='%s'" % i for i in makeflags.iteritems()])
+
+        cmds_binary_arch = []
+        cmds_binary_arch.append(("$(MAKE) -f debian/rules.real binary-arch-flavour %s" % makeflags_string,))
+        cmds_binary_arch.append(("$(MAKE) -f debian/rules.real install-dummy DH_OPTIONS='%s'" % ' '.join(["-p%s" % i['Package'] for i in packages_dummy]),))
+        cmds_build = []
+        cmds_build.append(("$(MAKE) -f debian/rules.real build %s" % makeflags_string,))
+        cmds_setup = []
+        cmds_setup.append(("$(MAKE) -f debian/rules.real setup-flavour %s" % makeflags_string,))
+        makefile.append(("binary-arch-%s-%s-%s-real:" % (arch, subarch, flavour), cmds_binary_arch))
+        makefile.append(("build-%s-%s-%s-real:" % (arch, subarch, flavour), cmds_build))
+        makefile.append(("setup-%s-%s-%s-real:" % (arch, subarch, flavour), cmds_setup))
+
+    def process_changelog(self, in_vars):
+        ret = [None, None, None, None]
+        ret[0] = version = self.changelog[0]['Version']
+        vars = in_vars.copy()
+        if version['modifier'] is not None:
+            ret[1] = vars['abiname'] = version['modifier']
+            ret[2] = ""
+        else:
+            ret[1] = vars['abiname'] = self.config['base']['abiname']
+            ret[2] = "-%s" % vars['abiname']
+        vars['version'] = version['version']
+        vars['major'] = version['major']
+        ret[3] = vars
+        return ret
+
+    def process_depends(self, key, e, in_e, vars):
+        in_dep = in_e[key].split(',')
+        dep = []
+        for d in in_dep:
+            d = d.strip()
+            d = self.substitute(d, vars)
+            if d:
+                dep.append(d)
+        if dep:
+            t = ', '.join(dep)
+            e[key] = t
+
+    def process_description(self, e, in_e, vars):
+        desc = in_e['Description']
+        desc_short, desc_long = desc.split ("\n", 1)
+        desc_pars = [self.substitute(i, vars) for i in desc_long.split ("\n.\n")]
+        desc_pars_wrapped = []
+        w = wrap(width = 74, fix_sentence_endings = True)
+        for i in desc_pars:
+            desc_pars_wrapped.append(w.fill(i))
+        e['Description'] = "%s\n%s" % (self.substitute(desc_short, vars), '\n.\n'.join(desc_pars_wrapped))
+
+    def process_package(self, in_entry, vars):
+        e = entry()
+        for i in in_entry.iterkeys():
+            if i in (('Depends', 'Provides', 'Suggests', 'Recommends', 'Conflicts')):
+                self.process_depends(i, e, in_entry, vars)
+            elif i == 'Description':
+                self.process_description(e, in_entry, vars)
+            elif i[:2] == 'X-':
+                pass
+            else:
+                e[i] = self.substitute(in_entry[i], vars)
+        return e
+
+    def process_packages(self, in_entries, vars):
+        entries = []
+        for i in in_entries:
+            entries.append(self.process_package(i, vars))
+        return entries
+
+    def process_real_image(self, in_entry, vars):
+        in_entry = in_entry.copy()
+        if vars.has_key('desc'):
+            in_entry['Description'] += "\n.\n" + vars['desc']
+        entry = self.process_package(in_entry, vars)
+        for i in (('Depends', 'Provides', 'Suggests', 'Recommends', 'Conflicts')):
+            value = []
+            tmp = entry.get(i, None)
+            if tmp:
+                tmp = tmp.split(',')
+                for t in tmp:
+                    value.append(t.strip())
+            if i == 'Depends':
+                t = vars.get('depends', None)
+                if t is not None:
+                    value.append(t)
+            elif i == 'Provides':
+                t = vars.get('provides', None)
+                if t is not None:
+                    value.append(t)
+            elif i == 'Suggests':
+                t = vars.get('suggests', None)
+                if t is not None:
+                    value.append(t)
+            elif i == 'Recommends':
+                t = vars.get('recommends', None)
+                if t is not None:
+                    value.append(t)
+            elif i == 'Conflicts':
+                t = vars.get('conflicts', None)
+                if t is not None:
+                    value.append(t)
+            entry[i] = ', '.join(value)
+        return entry
+
+    def process_real_tree(self, in_entry, vars):
+        entry = self.process_package(in_entry, vars)
+        tmp = self.changelog[0]['Version']['upstream']
+        versions = []
+        for i in self.changelog:
+            if i['Version']['upstream'] != tmp:
+                break
+            versions.insert(0, i['Version'])
+        for i in (('Depends', 'Provides')):
+            value = []
+            tmp = entry.get(i, None)
+            if tmp:
+                value.extend([j.strip() for j in tmp.split(',')])
+            if i == 'Depends':
+                value.append("linux-patch-debian-%(version)s (= %(source)s)" % self.changelog[0]['Version'])
+                value.append(' | '.join(["linux-source-%(version)s (= %(source)s)" % v for v in versions]))
+            elif i == 'Provides':
+                value.extend(["linux-tree-%(source)s" % v for v in versions])
+            entry[i] = ', '.join(value)
+        return entry
+
+    def substitute(self, s, vars):
+        def subst(match):
+            return vars[match.group(1)]
+        return re.sub(r'@([a-z_]+)@', subst, s)
+
+    def write_control(self, list):
+        self.write_rfc822(file("debian/control", 'w'), list)
+
+    def write_makefile(self, list):
+        f = file("debian/rules.gen", 'w')
+        for i in list:
+            f.write("%s\n" % i[0])
+            if i[1] is not None:
+                list = i[1]
+                if isinstance(list, basestring):
+                    list = list.split('\n')
+                for j in list:
+                    f.write("\t%s\n" % j)
+
+    def write_rfc822(self, f, list):
+        for entry in list:
+            for key, value in entry.iteritems():
+                f.write("%s:" % key)
+                if isinstance(value, tuple):
+                    value = value[0].join(value[1])
+                for k in value.split('\n'):
+                  f.write(" %s\n" % k)
+            f.write('\n')
+
+

Added: people/waldi/linux-2.6/debian/lib/python/debian_linux/utils.py
==============================================================================
--- (empty file)
+++ people/waldi/linux-2.6/debian/lib/python/debian_linux/utils.py	Sun Nov 13 14:45:12 2005
@@ -0,0 +1,98 @@
+import re, textwrap
+
+class _sorted_dict(dict):
+    __slots__ = ('_list')
+
+    def __init__(self):
+        super(_sorted_dict, self).__init__()
+        self._list = []
+
+    def __delitem__(self, key):
+        super(_sorted_dict, self).__delitem__(key)
+        self._list.remove(key)
+
+    def iterkeys(self):
+        for i in iter(self._list):
+            yield i
+
+    def iteritems(self):
+        for i in iter(self._list):
+            yield (i, self[i])
+
+    def itervalues(self):
+        for i in iter(self._list):
+            yield self[i]
+
+class sorted_dict(_sorted_dict):
+    __slots__ = ()
+
+    def __setitem__(self, key, value):
+        super(sorted_dict, self).__setitem__(key, value)
+        if key not in self._list:
+            self._list.append(key)
+
+class entry(_sorted_dict):
+    __slots__ = ()
+
+    def __setitem__(self, key, value):
+        super(entry, self).__setitem__(key, value)
+        if key not in self._list:
+            if 'Description' in self._list:
+                self._list.insert(len(self._list)-1, key)
+            else:
+                self._list.append(key)
+
+class templates(dict):
+    def __init__(self, dir = None):
+        if dir is None:
+            self.dir = "debian/templates"
+        else:
+            self.dir = dir
+
+    def __getitem__(self, key):
+        try:
+            return dict.__getitem__(self, key)
+        except KeyError: pass
+        ret = self._read(key)
+        dict.__setitem__(self, key, ret)
+        return ret
+
+    def __setitem__(self, key, value):
+        raise NotImplemented()
+
+    def _read(self, filename):
+        entries = []
+
+        f = file("%s/%s.in" % (self.dir, filename))
+
+        while True:
+            e = entry()
+            while True:
+                line = f.readline()
+                if not line:
+                    break
+                line = line.strip('\n')
+                if not line:
+                    break
+                if line[0] in ' \t':
+                    if not last:
+                        raise ValueError('Continuation line seen before first header')
+                    e[last] += '\n' + line.lstrip()
+                    continue
+                i = line.find(':')
+                if i < 0:
+                    raise ValueError("Not a header, not a continuation: ``%s''" % line)
+                last = line[:i]
+                e[last] = line[i+1:].lstrip()
+            if not e:
+                break
+
+            entries.append(e)
+
+        return entries
+
+class wrap(textwrap.TextWrapper):
+    wordsep_re = re.compile(
+        r'(\s+|'                                  # any whitespace
+        r'(?<=[\w\!\"\'\&\.\,\?])-{2,}(?=\w))')   # em-dash
+



More information about the Kernel-svn-changes mailing list