4 sys.path.append(sys.path[0] + "/../lib/python")
6 import optparse, os, shutil, tempfile, urllib2
7 from debian_linux.abi import Symbols
8 from debian_linux.config import *
9 from debian_linux.debian import *
11 default_url_base = "http://ftp.de.debian.org/debian/"
12 default_url_base_incoming = "http://incoming.debian.org/"
14 class url_debian_flat(object):
15 def __init__(self, base):
18 def __call__(self, source, filename):
19 return self.base + filename
21 class url_debian_pool(object):
22 def __init__(self, base):
25 def __call__(self, source, filename):
26 return self.base + "pool/main/" + source[0] + "/" + source + "/" + filename
31 def __init__(self, url, url_config = None, arch = None, featureset = None, flavour = None):
32 self.log = sys.stdout.write
34 self.url = self.url_config = url
35 if url_config is not None:
36 self.url_config = url_config
37 self.override_arch = arch
38 self.override_featureset = featureset
39 self.override_flavour = flavour
41 changelog = Changelog(version = VersionLinux)
42 while changelog[0].distribution == 'UNRELEASED':
44 changelog = changelog[0]
46 self.source = changelog.source
47 self.version = changelog.version.linux_version
48 self.version_source = changelog.version.complete
50 local_config = ConfigCoreDump(fp = file("debian/config.defines.dump"))
52 self.version_abi = self.version + '-' + local_config['abi',]['abiname']
55 self.dir = tempfile.mkdtemp(prefix = 'abiupdate')
57 self.log("Retreive config\n")
58 config = self.get_config()
59 if self.override_arch:
60 arches = [self.override_arch]
62 arches = config[('base',)]['arches']
64 self.update_arch(config, arch)
66 shutil.rmtree(self.dir)
68 def extract_package(self, filename, base):
69 base_out = self.dir + "/" + base
71 os.system("dpkg-deb --extract %s %s" % (filename, base_out))
74 def get_abi(self, arch, prefix):
75 filename = "linux-headers-%s-%s_%s_%s.deb" % (self.version_abi, prefix, self.version_source, arch)
76 f = self.retrieve_package(self.url, filename)
77 d = self.extract_package(f, "linux-headers-%s_%s" % (prefix, arch))
78 f1 = d + "/usr/src/linux-headers-%s-%s/Module.symvers" % (self.version_abi, prefix)
84 filename = "linux-support-%s_%s_all.deb" % (self.version_abi, self.version_source)
85 f = self.retrieve_package(self.url_config, filename)
86 d = self.extract_package(f, "linux-support")
87 c = d + "/usr/src/linux-support-" + self.version_abi + "/config.defines.dump"
88 config = ConfigCoreDump(fp = file(c))
92 def retrieve_package(self, url, filename):
93 u = url(self.source, filename)
94 filename_out = self.dir + "/" + filename
96 f_in = urllib2.urlopen(u)
97 f_out = file(filename_out, 'w')
105 def save_abi(self, symbols, arch, featureset, flavour):
106 dir = "debian/abi/%s" % self.version_abi
107 if not os.path.exists(dir):
109 out = "%s/%s_%s_%s" % (dir, arch, featureset, flavour)
110 symbols.write(open(out, 'w'))
112 def update_arch(self, config, arch):
113 if self.override_featureset:
114 featuresets = [self.override_featureset]
116 featuresets = config[('base', arch)]['featuresets']
117 for featureset in featuresets:
118 self.update_featureset(config, arch, featureset)
120 def update_featureset(self, config, arch, featureset):
121 config_base = config.merge('base', arch, featureset)
123 if not config_base.get('enabled', True):
126 if self.override_flavour:
127 flavours = [self.override_flavour]
129 flavours = config_base['flavours']
130 for flavour in flavours:
131 self.update_flavour(config, arch, featureset, flavour)
133 def update_flavour(self, config, arch, featureset, flavour):
134 config_base = config.merge('base', arch, featureset, flavour)
136 if not config_base.get('modules', True):
139 self.log("Updating ABI for arch %s, featureset %s, flavour %s: " % (arch, featureset, flavour))
141 if featureset == 'none':
142 localversion = flavour
144 localversion = featureset + '-' + flavour
146 abi = self.get_abi(arch, localversion)
147 self.save_abi(abi, arch, featureset, flavour)
149 except urllib2.HTTPError, e:
150 self.log("Failed to retrieve %s: %s\n" % (e.filename, e))
151 except StandardError, e:
152 self.log("FAILED!\n")
154 traceback.print_exc(None, sys.stdout)
156 if __name__ == '__main__':
157 options = optparse.OptionParser()
158 options.add_option("-i", "--incoming", action = "store_true", dest = "incoming")
159 options.add_option("--incoming-config", action = "store_true", dest = "incoming_config")
160 options.add_option("-u", "--url-base", dest = "url_base", default = default_url_base)
161 options.add_option("--url-base-incoming", dest = "url_base_incoming", default = default_url_base_incoming)
163 opts, args = options.parse_args()
169 kw['featureset'] =args[1]
171 kw['flavour'] =args[2]
173 url_base = url_debian_pool(opts.url_base)
174 url_base_incoming = url_debian_flat(opts.url_base_incoming)
175 if opts.incoming_config:
176 url = url_config = url_base_incoming
178 url_config = url_base
180 url = url_base_incoming
184 main(url, url_config, **kw)()