From 2f2f58af16b3c2daf04c38630f40c0cc0364f989 Mon Sep 17 00:00:00 2001 From: Bastian Blank Date: Thu, 13 Jul 2006 10:54:20 +0000 Subject: [PATCH] debian/bin/abiupdate.py: Add. svn path=/dists/trunk/linux-2.6/; revision=6995 --- debian/bin/abiupdate.py | 145 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 145 insertions(+) create mode 100755 debian/bin/abiupdate.py diff --git a/debian/bin/abiupdate.py b/debian/bin/abiupdate.py new file mode 100755 index 000000000..18aa87c5a --- /dev/null +++ b/debian/bin/abiupdate.py @@ -0,0 +1,145 @@ +#!/usr/bin/env python2.4 + +import sys +sys.path.append(sys.path[0] + "/../lib/python") + +import os, os.path +from debian_linux.abi import * +from debian_linux.config import * +from debian_linux.debian import * + +url_base = "http://ftp.de.debian.org/debian/" + +class main(object): + dir = None + override_arch = None + override_subarch = None + override_flavour = None + + def __init__(self): + self.source = "linux-2.6" + self.version = "2.6.17" + self.abiname = "1" + self.version_abi = self.version + '-' + self.abiname + self.version_source = "2.6.17-2" + + if len(sys.argv) > 1: + self.override_arch = sys.argv[1] + if len(sys.argv) > 2: + self.override_subarch = sys.argv[2] + if len(sys.argv) > 3: + self.override_flavour = sys.argv[3] + + def __call__(self): + import tempfile + self.dir = tempfile.mkdtemp(prefix = 'abiupdate') + try: + print "Retreive config" + config = self.get_config() + if self.override_arch: + arches = [self.override_arch] + else: + arches = config[('base',)]['arches'] + for arch in arches: + self.update_arch(config, arch) + finally: + self._rmtree(self.dir) + + def _rmtree(self, dir): + import stat + for root, dirs, files in os.walk(dir, topdown=False): + for name in files: + os.remove(os.path.join(root, name)) + for name in dirs: + real = os.path.join(root, name) + mode = os.lstat(real)[stat.ST_MODE] + if stat.S_ISDIR(mode): + os.rmdir(real) + else: + os.remove(real) + os.rmdir(dir) + + def extract_package(self, filename, base = "tmp"): + base_out = self.dir + "/" + base + os.mkdir(base_out) + os.system("dpkg-deb --extract %s %s" % (filename, base_out)) + return base_out + + def get_abi(self, arch, subarch, flavour): + if subarch == 'none': + prefix = flavour + else: + prefix = subarch + '-' + flavour + filename = "linux-headers-%s-%s_%s_%s.deb" % (self.version_abi, prefix, self.version_source, arch) + f = self.retrieve_package(filename) + d = self.extract_package(f) + f1 = d + "/usr/src/linux-headers-%s-%s/Module.symvers" % (self.version_abi, prefix) + s = symbols(f1) + self._rmtree(d) + return s + + def get_config(self): + filename = "linux-support-%s_%s_all.deb" % (self.version_abi, self.version_source) + f = self.retrieve_package(filename) + d = self.extract_package(f) + dir = d + "/usr/src/linux-support-" + self.version_abi + "/arch" + config = config_reader_arch([dir]) + self._rmtree(d) + return config + + def retrieve_package(self, filename): + import urllib2 + url = url_base + "pool/main/" + self.source[0] + "/" + self.source + "/" + filename + filename_out = self.dir + "/" + filename + f_in = urllib2.urlopen(url) + f_out = file(filename_out, 'w') + while 1: + r = f_in.read() + if not r: + break + f_out.write(r) + return filename_out + + def save_abi(self, symbols, arch, subarch, flavour): + out = "debian/arch/%s" % arch + if subarch != 'none': + out += "/%s" % subarch + out += "/abi-%s.%s" % (self.abiname, flavour) + symbols.write(file(out, 'w')) + + def update_arch(self, config, arch): + if self.override_subarch: + subarches = [self.override_subarch] + else: + subarches = config[('base', arch)]['subarches'] + for subarch in subarches: + self.update_subarch(config, arch, subarch) + + def update_subarch(self, config, arch, subarch): + config_entry = config[('base', arch, subarch)] + if not config_entry.get('modules', True): + return + if self.override_flavour: + flavours = [self.override_flavour] + else: + flavours = config_entry['flavours'] + for flavour in flavours: + self.update_flavour(config, arch, subarch, flavour) + + def update_flavour(self, config, arch, subarch, flavour): + config_entry = config[('base', arch, subarch, flavour)] + if not config_entry.get('modules', True): + return + print "Updating ABI for arch %s, subarch %s, flavour %s" % (arch, subarch, flavour) + try: + abi = self.get_abi(arch, subarch, flavour) + self.save_abi(abi, arch, subarch, flavour) + print "Ok." + except KeyboardInterrupt: + raise + except Exception, e: + print "FAILED!" + print e + +if __name__ == '__main__': + main()()