[kernel] r6297 - in people/waldi/linux-kbuild-2.6: . debian debian/bin debian/lib debian/lib/python debian/lib/python/debian_linux debian/templates

Bastian Blank waldi at costa.debian.org
Mon Mar 27 17:24:52 UTC 2006


Author: waldi
Date: Mon Mar 27 17:24:51 2006
New Revision: 6297

Added:
   people/waldi/linux-kbuild-2.6/
   people/waldi/linux-kbuild-2.6/debian/
   people/waldi/linux-kbuild-2.6/debian/bin/
   people/waldi/linux-kbuild-2.6/debian/bin/gencontrol.py   (contents, props changed)
   people/waldi/linux-kbuild-2.6/debian/changelog
   people/waldi/linux-kbuild-2.6/debian/lib/
   people/waldi/linux-kbuild-2.6/debian/lib/python/
   people/waldi/linux-kbuild-2.6/debian/lib/python/debian_linux/
   people/waldi/linux-kbuild-2.6/debian/lib/python/debian_linux/__init__.py
   people/waldi/linux-kbuild-2.6/debian/lib/python/debian_linux/debian.py
   people/waldi/linux-kbuild-2.6/debian/lib/python/debian_linux/utils.py
   people/waldi/linux-kbuild-2.6/debian/rules   (contents, props changed)
   people/waldi/linux-kbuild-2.6/debian/rules.defs
   people/waldi/linux-kbuild-2.6/debian/templates/
   people/waldi/linux-kbuild-2.6/debian/templates/control.main.in
   people/waldi/linux-kbuild-2.6/debian/templates/control.source.in
Log:
/people/waldi/linux-kbuild-2.6: Add.


Added: people/waldi/linux-kbuild-2.6/debian/bin/gencontrol.py
==============================================================================
--- (empty file)
+++ people/waldi/linux-kbuild-2.6/debian/bin/gencontrol.py	Mon Mar 27 17:24:51 2006
@@ -0,0 +1,153 @@
+#!/usr/bin/env python2.4
+import sys
+sys.path.append("debian/lib/python")
+import warnings
+from debian_linux.debian import *
+from debian_linux.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):
+    makefile_targets = ('binary-arch', 'build')
+
+    def __init__(self, underlay = None):
+        self.changelog = read_changelog()
+        self.templates = templates()
+        self.version, self.changelog_vars = self.process_changelog({})
+
+    def __call__(self):
+        packages = packages_list()
+        makefile = []
+
+        self.do_source(packages)
+        self.do_main(packages, makefile)
+
+        self.write_control(packages.itervalues())
+        self.write_makefile(makefile)
+
+    def do_source(self, packages):
+        source = self.templates["control.source"]
+        packages['source'] = self.process_package(source[0], self.changelog_vars)
+
+    def do_main(self, packages, makefile):
+        makeflags = {
+            'VERSION': self.version['version'],
+            'SOURCE_UPSTREAM': self.version['source_upstream'],
+            'SOURCEVERSION': self.version['source'],
+            'UPSTREAMVERSION': self.version['upstream'],
+        }
+
+        vars = self.changelog_vars.copy()
+
+        self.do_main_setup(vars, makeflags)
+        self.do_main_packages(packages)
+        self.do_main_makefile(makefile, makeflags)
+
+    def do_main_setup(self, vars, makeflags):
+        pass
+
+    def do_main_makefile(self, makefile, makeflags):
+        makeflags_string = ' '.join(["%s='%s'" % i for i in makeflags.iteritems()])
+
+        for i in self.makefile_targets:
+            makefile.append(("%s:" % i, ("$(MAKE) -f debian/rules.real %s %s" % (i, makeflags_string))))
+
+    def do_main_packages(self, packages):
+        vars = self.changelog_vars
+
+        main = self.templates["control.main"]
+        packages.extend(self.process_packages(main, vars))
+
+    def process_changelog(self, in_vars):
+        ret = [None, None]
+        ret[0] = version = self.changelog[0]['Version']
+        vars = in_vars.copy()
+        vars['upstreamversion'] = version['upstream']
+        vars['version'] = version['version']
+        vars['source_upstream'] = version['source_upstream']
+        vars['major'] = version['major']
+        ret[1] = vars
+        return ret
+
+    def process_relation(self, key, e, in_e, vars):
+        in_dep = in_e[key]
+        dep = package_relation_list()
+        for in_groups in in_dep:
+            groups = package_relation_group()
+            for in_item in in_groups:
+                item = package_relation()
+                item.name = self.substitute(in_item.name, vars)
+                if in_item.version is not None:
+                    item.version = self.substitute(in_item.version, vars)
+                item.arches = in_item.arches
+                groups.append(item)
+            dep.append(groups)
+        e[key] = dep
+
+    def process_description(self, e, in_e, vars):
+        in_desc = in_e['Description']
+        desc = in_desc.__class__()
+        desc.short = self.substitute(in_desc.short, vars)
+        for i in in_desc.long:
+            desc.long.append(self.substitute(i, vars))
+        e['Description'] = desc
+
+    def process_package(self, in_entry, vars):
+        e = package()
+        for key, value in in_entry.iteritems():
+            if isinstance(value, package_relation_list):
+                self.process_relation(key, e, in_entry, vars)
+            elif key == 'Description':
+                self.process_description(e, in_entry, vars)
+            elif key[:2] == 'X-':
+                pass
+            else:
+                e[key] = self.substitute(value, 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 substitute(self, s, vars):
+        if isinstance(s, (list, tuple)):
+            for i in xrange(len(s)):
+                s[i] = self.substitute(s[i], vars)
+            return s
+        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, out_list):
+        out = file("debian/rules.gen", 'w')
+        for item in out_list:
+            if isinstance(item, (list, tuple)):
+                out.write("%s\n" % item[0])
+                cmd_list = item[1]
+                if isinstance(cmd_list, basestring):
+                    cmd_list = cmd_list.split('\n')
+                for j in cmd_list:
+                    out.write("\t%s\n" % j)
+            else:
+                out.write("%s\n" % item)
+
+    def write_rfc822(self, f, list):
+        for entry in list:
+            for key, value in entry.iteritems():
+                f.write("%s: %s\n" % (key, value))
+            f.write('\n')
+
+
+if __name__ == '__main__':
+    gencontrol()()

Added: people/waldi/linux-kbuild-2.6/debian/changelog
==============================================================================
--- (empty file)
+++ people/waldi/linux-kbuild-2.6/debian/changelog	Mon Mar 27 17:24:51 2006
@@ -0,0 +1,5 @@
+linux-kbuild-2.6 (2.6.16-1) UNRELEASED; urgency=low
+
+  * Initial release.
+
+ -- Bastian Blank <waldi at debian.org>  Mon, 27 Mar 2006 19:06:30 +0200

Added: people/waldi/linux-kbuild-2.6/debian/lib/python/debian_linux/__init__.py
==============================================================================
--- (empty file)
+++ people/waldi/linux-kbuild-2.6/debian/lib/python/debian_linux/__init__.py	Mon Mar 27 17:24:51 2006
@@ -0,0 +1,3 @@
+from debian import *
+from utils import *
+

Added: people/waldi/linux-kbuild-2.6/debian/lib/python/debian_linux/debian.py
==============================================================================
--- (empty file)
+++ people/waldi/linux-kbuild-2.6/debian/lib/python/debian_linux/debian.py	Mon Mar 27 17:24:51 2006
@@ -0,0 +1,231 @@
+import itertools, os.path, re, utils
+
+def read_changelog(dir = ''):
+    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(os.path.join(dir, "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 = {}
+            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)
+    if match is None:
+        raise ValueError
+    ret = match.groupdict()
+    if ret['parent'] is not None:
+        ret['source_upstream'] = ret['parent'] + ret['upstream']
+    else:
+        ret['source_upstream'] = ret['upstream']
+    return ret
+
+class package_description(object):
+    __slots__ = "short", "long"
+
+    def __init__(self, value = None):
+        if value is not None:
+            self.short, long = value.split ("\n", 1)
+            self.long = long.split ("\n.\n")
+        else:
+            self.short = None
+            self.long = []
+
+    def __str__(self):
+        ret = self.short + '\n'
+        w = utils.wrap(width = 74, fix_sentence_endings = True)
+        pars = []
+        for i in self.long:
+            pars.append('\n '.join(w.wrap(i)))
+        return self.short + '\n ' + '\n .\n '.join(pars)
+
+class package_relation(object):
+    __slots__ = "name", "version", "arches"
+
+    _re = re.compile(r'^(\S+)(?: \(([^)]+)\))?(?: \[([^]]+)\])?$')
+
+    def __init__(self, value = None):
+        if value is not None:
+            match = self._re.match(value)
+            if match is None:
+                raise RuntimeError, "Can't parse dependency %s" % value
+            match = match.groups()
+            self.name = match[0]
+            self.version = match[1]
+            if match[2] is not None:
+                self.arches = re.split('\s+', match[2])
+            else:
+                self.arches = []
+        else:
+            self.name = None
+            self.version = None
+            self.arches = []
+
+    def __str__(self):
+        ret = [self.name]
+        if self.version is not None:
+            ret.extend([' (', self.version, ')'])
+        if self.arches:
+            ret.extend([' [', ' '.join(self.arches), ']'])
+        return ''.join(ret)
+
+class package_relation_list(list):
+    def __init__(self, value = None):
+        if isinstance(value, (list, tuple)):
+            self.extend(value)
+        elif value is not None:
+            self.extend(value)
+
+    def __str__(self):
+        return ', '.join([str(i) for i in self])
+
+    def _match(self, value):
+        for i in self:
+            if i._match(value):
+                return i
+        return None
+
+    def extend(self, value):
+        if isinstance(value, basestring):
+            value = [package_relation_group(j.strip()) for j in re.split(',', value.strip())]
+        for i in value:
+            if isinstance(i, basestring):
+                i = package_relation_group(i)
+            j = self._match(i)
+            if j:
+                j._update_arches(i)
+            else:
+                self.append(i)
+
+class package_relation_group(list):
+    def __init__(self, value = None):
+        if isinstance(value, package_relation_list):
+            self.extend(value)
+        elif value is not None:
+            self._extend(value)
+
+    def __str__(self):
+        return ' | '.join([str(i) for i in self])
+
+    def _extend(self, value):
+        self.extend([package_relation(j.strip()) for j in re.split('\|', value.strip())])
+
+    def _match(self, value):
+        for i, j in itertools.izip(self, value):
+            if i.name != j.name or i.version != j.version:
+                return None
+        return self
+
+    def _update_arches(self, value):
+        for i, j in itertools.izip(self, value):
+            if i.arches:
+                for arch in j.arches:
+                    if arch not in i.arches:
+                        i.arches.append(arch)
+
+class package(dict):
+    _fields = utils.sorted_dict((
+        ('Package', str),
+        ('Source', str),
+        ('Architecture', utils.field_list),
+        ('Section', str),
+        ('Priority', str),
+        ('Maintainer', str),
+        ('Uploaders', str),
+        ('Standards-Version', str),
+        ('Build-Depends', package_relation_list),
+        ('Build-Depends-Indep', package_relation_list),
+        ('Provides', package_relation_list),
+        ('Depends', package_relation_list),
+        ('Recommends', package_relation_list),
+        ('Suggests', package_relation_list),
+        ('Replaces', package_relation_list),
+        ('Conflicts', package_relation_list),
+        ('Reverse-Depends', package_relation_list), # Some sort of hack
+        ('Description', package_description),
+    ))
+
+    def __setitem__(self, key, value):
+        try:
+            cls = self._fields[key]
+            if not isinstance(value, cls):
+                value = cls(value)
+        except KeyError: pass
+        super(package, self).__setitem__(key, value)
+
+    def iterkeys(self):
+        for i in self._fields.iterkeys():
+            if self.has_key(i) and self[i]:
+                yield i
+
+    def iteritems(self):
+        for i in self._fields.iterkeys():
+            if self.has_key(i) and self[i]:
+                yield (i, self[i])
+
+    def itervalues(self):
+        for i in self._fields.iterkeys():
+            if self.has_key(i) and self[i]:
+                yield self[i]
+

Added: people/waldi/linux-kbuild-2.6/debian/lib/python/debian_linux/utils.py
==============================================================================
--- (empty file)
+++ people/waldi/linux-kbuild-2.6/debian/lib/python/debian_linux/utils.py	Mon Mar 27 17:24:51 2006
@@ -0,0 +1,136 @@
+import debian, re, textwrap
+
+class sorted_dict(dict):
+    __slots__ = '_list',
+
+    def __init__(self, entries = None):
+        super(sorted_dict, self).__init__()
+        self._list = []
+        if entries is not None:
+            for key, value in entries:
+                self[key] = value
+
+    def __delitem__(self, key):
+        super(sorted_dict, self).__delitem__(key)
+        self._list.remove(key)
+
+    def __setitem__(self, key, value):
+        super(sorted_dict, self).__setitem__(key, value)
+        if key not in self._list:
+            self._list.append(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 field_list(list):
+    TYPE_WHITESPACE = object()
+    TYPE_COMMATA = object()
+
+    def __init__(self, value = None, type = TYPE_WHITESPACE):
+        self.type = type
+        if isinstance(value, field_list):
+            self.type = value.type
+            self.extend(value)
+        elif isinstance(value, (list, tuple)):
+            self.extend(value)
+        else:
+            self._extend(value)
+
+    def __str__(self):
+        if self.type is self.TYPE_WHITESPACE:
+            type = ' '
+        elif self.type is self.TYPE_COMMATA:
+            type = ', '
+        return type.join(self)
+
+    def _extend(self, value):
+        if self.type is self.TYPE_WHITESPACE:
+            type = '\s'
+        elif self.type is self.TYPE_COMMATA:
+            type = ','
+        if value is not None:
+            self.extend([j.strip() for j in re.split(type, value.strip())])
+
+    def extend(self, value):
+        if isinstance(value, str):
+            self._extend(value)
+        else:
+            super(field_list, self).extend(value)
+
+class field_list_commata(field_list):
+    def __init__(self, value = None):
+        super(field_list_commata, self).__init__(value, field_list.TYPE_COMMATA)
+
+class field_string(str):
+    def __str__(self):
+        return '\n '.join(self.split('\n'))
+
+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 = debian.package()
+            last = None
+            lines = []
+            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')
+                    lines.append(line.lstrip())
+                    continue
+                if last:
+                    e[last] = '\n'.join(lines)
+                i = line.find(':')
+                if i < 0:
+                    raise ValueError("Not a header, not a continuation: ``%s''" % line)
+                last = line[:i]
+                lines = [line[i+1:].lstrip()]
+            if last:
+                e[last] = '\n'.join(lines)
+            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
+

Added: people/waldi/linux-kbuild-2.6/debian/rules
==============================================================================
--- (empty file)
+++ people/waldi/linux-kbuild-2.6/debian/rules	Mon Mar 27 17:24:51 2006
@@ -0,0 +1,73 @@
+#!/usr/bin/make -f
+SHELL    := sh -e
+DEB_HOST_ARCH  := $(shell dpkg-architecture -qDEB_HOST_ARCH)
+DEB_BUILD_ARCH := $(shell dpkg-architecture -qDEB_BUILD_ARCH)
+srcver   := $(shell dpkg-parsechangelog | awk '/^Version:/ {print $$2}')
+VERSION  := $(shell echo $(srcver) | sed -e 's,-[^-]*$$,,')
+MAJOR    := $(word 1,$(subst ., ,$(VERSION))).$(word 2,$(subst ., ,$(VERSION)))
+
+include debian/rules.defs
+
+build: debian/control $(STAMPS_DIR)/build-base
+$(STAMPS_DIR)/build-base: $(BUILD_DIR) $(STAMPS_DIR) $(STAMPS_DIR)/setup-base
+	dh_testdir
+	$(MAKE) -f debian/rules.gen build-$(DEB_HOST_ARCH)
+	touch $@
+
+$(BUILD_DIR) $(STAMPS_DIR):
+	@[ -d $@ ] || mkdir $@
+
+orig: ../orig/linux-kbuild-$(MAJOR)-$(VERSION)
+	rsync --delete --exclude debian --exclude .svn --link-dest=$^/ -av $^/ .
+
+../orig/linux-kbuild-$(MAJOR)-$(VERSION):
+	if [ -f "../linux-kbuild-$(MAJOR)_$(VERSION).orig.tar.gz" ]; then \
+		mkdir -p ../orig; \
+		tar -C ../orig -xzf ../linux-kbuild-$(MAJOR)_$(VERSION).orig.tar.gz; \
+	else \
+		echo "Can't find orig tarball." >&2; \
+		exit 1; \
+	fi
+
+maintainerclean:
+	-rm debian/control debian/control.md5sum debian/rules.gen
+	rm -rf $(filter-out debian .svn, $(wildcard * .[^.]*))
+
+clean: debian/control
+	dh_testdir
+	rm -rf $(BUILD_DIR) $(STAMPS_DIR) debian/lib/python/debian_linux/*.pyc
+	dh_clean
+
+binary-indep:
+	dh_testdir
+	$(MAKE) -f debian/rules.gen binary-indep
+
+binary-arch:
+	dh_testdir
+	$(MAKE) -f debian/rules.gen binary-arch-$(DEB_HOST_ARCH)
+
+binary:	binary-indep binary-arch
+
+CONTROL_FILES = debian/changelog $(wildcard debian/templates/control.*) 
+debian/control debian/rules.gen: debian/bin/gencontrol.py $(CONTROL_FILES)
+	if [ -f debian/control.md5sum ]; then \
+		if md5sum $^ | diff - debian/control.md5sum > /dev/null; then true; else \
+			$(MAKE) -f debian/rules debian/control-real; \
+		fi \
+	else \
+		$(MAKE) -f debian/rules debian/control-real; \
+	fi
+
+debian/control-real: debian/bin/gencontrol.py $(CONTROL_FILES)
+	chmod +x $<
+	$<
+	md5sum $^ > debian/control.md5sum
+	@echo
+	@echo This target is made to fail intentionally, to make sure
+	@echo that it is NEVER run during the automated build. Please
+	@echo ignore the following error, the debian/control file has
+	@echo been generated SUCCESSFULLY.
+	@echo
+	exit 1
+
+.PHONY: clean build setup binary-indep binary-arch binary

Added: people/waldi/linux-kbuild-2.6/debian/rules.defs
==============================================================================
--- (empty file)
+++ people/waldi/linux-kbuild-2.6/debian/rules.defs	Mon Mar 27 17:24:51 2006
@@ -0,0 +1,4 @@
+BUILD_DIR = debian/build
+STAMPS_DIR = debian/stamps
+TEMPLATES_DIR = debian/templates
+

Added: people/waldi/linux-kbuild-2.6/debian/templates/control.main.in
==============================================================================
--- (empty file)
+++ people/waldi/linux-kbuild-2.6/debian/templates/control.main.in	Mon Mar 27 17:24:51 2006
@@ -0,0 +1,7 @@
+Package: linux-kbuild- at version@
+Architecture: any
+Section: devel
+Priority: optional
+Provides: linux-kbuild, linux-kbuild- at major@
+Description: Linux kernel
+ Kbuild

Added: people/waldi/linux-kbuild-2.6/debian/templates/control.source.in
==============================================================================
--- (empty file)
+++ people/waldi/linux-kbuild-2.6/debian/templates/control.source.in	Mon Mar 27 17:24:51 2006
@@ -0,0 +1,7 @@
+Source: linux-kbuild- at major@
+Section: devel
+Priority: optional
+Maintainer: Debian Kernel Team <debian-kernel at lists.debian.org>
+Uploaders: Bastian Blank <waldi at debian.org>
+Standards-Version: 3.6.2.0
+Build-Depends: debhelper (>= 4.1.0)



More information about the Kernel-svn-changes mailing list