debian/bin/abiupdate.py: Add.

svn path=/dists/trunk/linux-2.6/; revision=6995
This commit is contained in:
Bastian Blank 2006-07-13 10:54:20 +00:00
parent 52102e6544
commit 2f2f58af16
1 changed files with 145 additions and 0 deletions

145
debian/bin/abiupdate.py vendored Executable file
View File

@ -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()()