upload tizen1.0 source
[kernel/linux-2.6.36.git] / debian / bin / abiupdate.py
1 #!/usr/bin/env python
2
3 import sys
4 sys.path.append(sys.path[0] + "/../lib/python")
5
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 *
10
11 default_url_base = "http://ftp.de.debian.org/debian/"
12 default_url_base_incoming = "http://incoming.debian.org/"
13
14 class url_debian_flat(object):
15     def __init__(self, base):
16         self.base = base
17
18     def __call__(self, source, filename):
19         return self.base + filename
20
21 class url_debian_pool(object):
22     def __init__(self, base):
23         self.base = base
24
25     def __call__(self, source, filename):
26         return self.base + "pool/main/" + source[0] + "/" + source + "/" + filename
27
28 class main(object):
29     dir = None
30
31     def __init__(self, url, url_config = None, arch = None, featureset = None, flavour = None):
32         self.log = sys.stdout.write
33
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
40
41         changelog = Changelog(version = VersionLinux)
42         while changelog[0].distribution == 'UNRELEASED':
43             changelog.pop(0)
44         changelog = changelog[0]
45
46         self.source = changelog.source
47         self.version = changelog.version.linux_version
48         self.version_source = changelog.version.complete
49
50         local_config = ConfigCoreDump(fp = file("debian/config.defines.dump"))
51
52         self.version_abi = self.version + '-' + local_config['abi',]['abiname']
53
54     def __call__(self):
55         self.dir = tempfile.mkdtemp(prefix = 'abiupdate')
56         try:
57             self.log("Retreive config\n")
58             config = self.get_config()
59             if self.override_arch:
60                 arches = [self.override_arch]
61             else:
62                 arches = config[('base',)]['arches']
63             for arch in arches:
64                 self.update_arch(config, arch)
65         finally:
66             shutil.rmtree(self.dir)
67
68     def extract_package(self, filename, base):
69         base_out = self.dir + "/" + base
70         os.mkdir(base_out)
71         os.system("dpkg-deb --extract %s %s" % (filename, base_out))
72         return base_out
73
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)
79         s = Symbols(open(f1))
80         shutil.rmtree(d)
81         return s
82
83     def get_config(self):
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))
89         shutil.rmtree(d)
90         return config
91
92     def retrieve_package(self, url, filename):
93         u = url(self.source, filename)
94         filename_out = self.dir + "/" + filename
95
96         f_in = urllib2.urlopen(u)
97         f_out = file(filename_out, 'w')
98         while 1:
99             r = f_in.read()
100             if not r:
101                 break
102             f_out.write(r)
103         return filename_out
104
105     def save_abi(self, symbols, arch, featureset, flavour):
106         dir = "debian/abi/%s" % self.version_abi
107         if not os.path.exists(dir):
108             os.makedirs(dir)
109         out = "%s/%s_%s_%s" % (dir, arch, featureset, flavour)
110         symbols.write(open(out, 'w'))
111
112     def update_arch(self, config, arch):
113         if self.override_featureset:
114             featuresets = [self.override_featureset]
115         else:
116             featuresets = config[('base', arch)]['featuresets']
117         for featureset in featuresets:
118             self.update_featureset(config, arch, featureset)
119
120     def update_featureset(self, config, arch, featureset):
121         config_base = config.merge('base', arch, featureset)
122
123         if not config_base.get('enabled', True):
124             return
125
126         if self.override_flavour:
127             flavours = [self.override_flavour]
128         else:
129             flavours = config_base['flavours']
130         for flavour in flavours:
131             self.update_flavour(config, arch, featureset, flavour)
132
133     def update_flavour(self, config, arch, featureset, flavour):
134         config_base = config.merge('base', arch, featureset, flavour)
135
136         if not config_base.get('modules', True):
137             return
138
139         self.log("Updating ABI for arch %s, featureset %s, flavour %s: " % (arch, featureset, flavour))
140         try:
141             if featureset == 'none':
142                 localversion = flavour
143             else:
144                 localversion = featureset + '-' + flavour
145
146             abi = self.get_abi(arch, localversion)
147             self.save_abi(abi, arch, featureset, flavour)
148             self.log("Ok.\n")
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")
153             import traceback
154             traceback.print_exc(None, sys.stdout)
155
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)
162
163     opts, args = options.parse_args()
164
165     kw = {}
166     if len(args) >= 1:
167         kw['arch'] =args[0]
168     if len(args) >= 2:
169         kw['featureset'] =args[1]
170     if len(args) >= 3:
171         kw['flavour'] =args[2]
172
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
177     else:
178         url_config = url_base
179         if opts.incoming:
180             url = url_base_incoming
181         else:
182             url = url_base
183
184     main(url, url_config, **kw)()