]> git.pld-linux.org Git - projects/pld-builder.new.git/blob - client/rebuild-kernel-packages.py
- added 4.1 kernel
[projects/pld-builder.new.git] / client / rebuild-kernel-packages.py
1 #!/usr/bin/python
2
3 import argparse
4 import collections
5 import os
6 import rpm
7 import shlex
8 import subprocess
9 import sys
10
11 packages = collections.OrderedDict([
12     ('crash',                                 ['head', '4.1', '3.18', '3.14', '3.10', '3.4']),
13     ('dahdi-linux',                           ['head', '4.1', '3.18', '3.14', '3.10', '3.4']),
14     ('igb',                                   ['head', '4.1', '3.18', '3.14', '3.10', '3.4']),
15     ('ipset',                                 ['head', '4.1', '3.18', '3.14', '3.10', '3.4']),
16     ('ixgbe',                                 ['head', '4.1', '3.18', '3.14', '3.10', '3.4']),
17     ('lin_tape',                              ['head', '4.1', '3.18', '3.14', '3.10', '3.4']),
18     ('linux-fusion',                          ['head', '4.1', '3.18', '3.14', '3.10', '3.4']),
19     ('lttng-modules',                         ['head', '4.1', '3.18', '3.14', '3.10', '3.4']),
20     ('nvidiabl',                              ['head', '4.1', '3.18', '3.14', '3.10', '3.4']),
21     ('r8168',                                 ['head', '4.1', '3.18', '3.14', '3.10', '3.4']),
22     ('rtl8812au',                             ['head', '4.1', '3.18', '3.14', '3.10', '3.4']),
23     ('spl',                                   ['head', '4.1', '3.18', '3.14', '3.10', '3.4']),
24     ('sysdig',                                ['head', '4.1', '3.18', '3.14', '3.10', '3.4']),
25     ('tpm_emulator',                          ['head', '4.1', '3.18', '3.14', '3.10', '3.4']),
26     ('VirtualBox',                            ['head', '4.1', '3.18', '3.14', '3.10', '3.4']),
27     ('vpb-driver',                            ['head', '4.1', '3.18', '3.14', '3.10', '3.4']),
28     ('wl',                                    ['head', '4.1', '3.18', '3.14', '3.10', '3.4']),
29     ('xorg-driver-video-fglrx',               ['head', '4.1', '3.18', '3.14', '3.10', '3.4']),
30     ('xorg-driver-video-nvidia',              ['head', '4.1', '3.18', '3.14', '3.10', '3.4']),
31     ('xorg-driver-video-nvidia-legacy-304xx', ['head', '4.1', '3.18', '3.14', '3.10', '3.4']),
32     ('xorg-driver-video-nvidia-legacy-340xx', ['head', '4.1', '3.18', '3.14', '3.10', '3.4']),
33     ('zfs',                                   ['head', '4.1', '3.18', '3.14', '3.10', '3.4']),
34     ('xtables-addons:master',                 ['head', '4.1', '3.18', '3.14', '3.10']),
35     ('e1000e',                                ['3.18', '3.14', '3.10', '3.4']),
36     ('open-vm-tools',                         ['3.18', '3.14', '3.10', '3.4']),
37     ('linuxrdac',                             ['3.4']),
38     ('lirc',                                  ['3.4']),
39     ('madwifi-ng',                            ['3.4']),
40     ('xtables-addons:XTADDONS_1',             ['3.4'])
41 ])
42
43 def get_rpmdir():
44     return rpm.expandMacro("%_topdir")
45
46 def clean_pkgname(package):
47     pkg = package.split(":")
48     if not pkg:
49         raise NameError
50     spec = pkg[0]
51     # ensure package ends with .spec
52     if not spec.endswith(".spec"):
53         spec += ".spec"
54     name = spec[:-5]
55     # and pkg without subdir
56     name = name[name.rfind("/")+1:]
57     try:
58         branch = pkg[1]
59     except IndexError:
60         branch = "master"
61     return [name, spec, branch]
62
63 def run_command(command, verbose=False, quiet=True):
64     gitproc = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, bufsize=-1)
65     gitproc.wait()
66     out = gitproc.stdout.read().strip("\n'")
67     if verbose:
68         print ' '.join(command)
69     if not quiet:
70         print out
71     if gitproc.returncode != 0:
72         if quiet:
73             print out
74         print '\nError running command: \n'
75         print ' '.join(command)
76         return (False, None)
77     return (True, out)
78
79 def get_last_tag(name, spec, branch, dist="th", kernel=None, verbose=False):
80     fetch_package(name, spec, branch, verbose=verbose)
81     if os.path.exists("%s/%s/%s" % (get_rpmdir(), name, spec)):
82         tag = get_autotag(name, spec, branch, dist=dist, kernel=kernel, verbose=verbose)
83     return tag
84
85 def get_autotag(name, spec, branch, dist="th", kernel=None, verbose=False):
86     if not kernel or kernel == "head" or kernel == "master":
87         ref = "auto/%s/%s-[0-9]*" % (dist, name)
88     else:
89         ref = "auto/%s/%s-%s-[0-9]*" % (dist, name, kernel)
90     gitdir = "%s/%s" % (get_rpmdir(), name)
91     tag = run_command(["/usr/bin/git", "-C", gitdir, "describe", "--tags", "--match", ref, "--abbrev=0", branch], verbose=verbose)
92     return tag[1]
93
94 def fetch_package(name, spec, branch, verbose=False):
95     gitdir = "%s/%s" % (get_rpmdir(), name)
96     if os.path.exists("%s/.git" % gitdir):
97         run_command(["/usr/bin/git", "-C", gitdir, "fetch", "origin"], verbose=verbose)
98     else:
99         run_command(["/usr/bin/git", "clone", "-o", "origin", "git://git.pld-linux.org/packages/" + name + ".git", gitdir], verbose=verbose)
100         if not os.path.exists("%s/%d" % (gitdir, spec)):
101             return None
102         run_command(["/usr/bin/git", "-C", gitdir, "config", "--local", "--add", "remote.origin.fetch", "refs/notes/*:refs/notes/*"], verbose=verbose)
103         run_command(["/usr/bin/git", "-C", gitdir, "remote", "set-url", "--push", "origin", "ssh://git@git.pld-linux.org/packages/" + name], verbose=verbose)
104     run_command(["/usr/bin/git", "-C", gitdir, "fetch", "origin", "refs/notes/*:refs/notes/*"], verbose=verbose)
105     if branch:
106         if run_command(["/usr/bin/git", "-C", gitdir, "rev-parse", "--verify", "-q", branch], verbose=verbose):
107             run_command(["/usr/bin/git", "-C", gitdir, "checkout", branch, "--"], verbose=verbose)
108         elif run_command(["/usr/bin/git", "-C", gitdir, "rev-parse", "--verify", "-q", "refs/remotes/origin/" + branch], verbose=verbose):
109             run_command(["/usr/bin/git", "-C", gitdir, "checkout", "-t", "refs/remotes/origin/" + branch], verbose=verbose)
110         rev_branch = run_command(["/usr/bin/git", "-C", gitdir, "rev-parse", branch], verbose=verbose)
111         rev_head = run_command(["/usr/bin/git", "-C", gitdir, "rev-parse", "HEAD"], verbose=verbose)
112         if rev_branch[1] != rev_head[1]:
113             print "Error: cannot checkout " + name
114             return None
115         run_command(["/usr/bin/git", "-C", gitdir, "merge", "--ff-only", "@{upstream}"], verbose=verbose)
116
117 def csv_list(string):
118     return string.split(',')
119
120 def kernel_cmp(x, y):
121     x = x.split('.')
122     y = y.split('.')
123     try:
124         int(x[0])
125     except ValueError:
126         return 1
127     try:
128         int(y[0])
129     except ValueError:
130         return -1
131     majdiff = int(x[0]) - int(y[0])
132     if majdiff:
133         return majdiff
134     mindiff = int(x[1]) - int(y[1])
135     return mindiff
136
137 def main():
138     parser = argparse.ArgumentParser(description='Rebuild kernel modules.')
139     parser.add_argument('-d', '--dist',
140             default='th',
141             help='Dist name for getting auto-tags (default: %(default)s)')
142     parser.add_argument('-m', '--make-request',
143             default="make-request",
144             metavar='SCRIPT',
145             help='Name / path of the make-request script (default: %(default)s)')
146     parser.add_argument('-ni', '--noinstall',
147             action='store_true',
148             help='skip installing new kernel packages on src builder (default: %(default)s)')
149     parser.add_argument('-n', '--nopae',
150             action='store_true',
151             help='Build packages for nopae kernel for i686 (default: %(default)s)')
152     parser.add_argument('-p', '--packages',
153             type=csv_list,
154             default=packages.keys(),
155             metavar='PKG1[,PKG2...]',
156             help='Package names to build (default: all)')
157     parser.add_argument('-s', '--skip',
158             type=csv_list,
159             metavar='VER1[,VER2...]',
160             help='Don\'t build modules specific to these kernels (default: %(default)s)')
161     parser.add_argument('-t', '--test-build',
162             action='store_true',
163             help='Perform a test-builds')
164     parser.add_argument('-v', '--verbose',
165             action='store_true',
166             help='Be verbose when running commands (default: %(default)s)')
167     args = parser.parse_args()
168
169     build_mode = '-r'
170     if args.test_build:
171         build_mode = '-t'
172
173     if not args.skip:
174         args.skip = []
175
176     if not args.make_request.startswith('/'):
177         for path in os.defpath.split(os.pathsep):
178             if os.path.isfile('/'.join([path, args.make_request])):
179                 args.make_request = '/'.join([path, args.make_request])
180                 break
181
182     if not args.noinstall:
183         source_packages = []
184         for ver in ['-','-nopae-','-3.18-','-3.14-','-3.10-','-3.4-']:
185             source_packages.extend(['kernel%sheaders' % ver, 'kernel%smodule-build' % ver])
186         command = (('%(make_request)s -b %(dist)s-src -t -c '
187                 '"poldek -n %(dist)s -n %(dist)s-ready -n %(dist)s-test --up ; '
188                 'poldek -uGv %(source_packages)s"') %
189                 {'make_request': args.make_request,
190                     'dist': args.dist,
191                     'source_packages': ' '.join(source_packages)})
192         run_command(shlex.split(command), verbose=args.verbose, quiet=False)
193         raw_input('\nPress Enter after src builder updates kernel packages...')
194
195     print '\nCurrent kernels versions:'
196     all_kernels = set()
197     for kernel_list in packages.values():
198         all_kernels.update(kernel_list)
199     all_kernels = list(all_kernels)
200     all_kernels.sort(cmp=kernel_cmp, reverse=True)
201     for kernel in all_kernels:
202         branch = 'master'
203         if kernel != 'head':
204             branch = 'LINUX_%s' % kernel.replace('.','_')
205         print '%s: %s' % (kernel, get_last_tag('kernel', 'kernel.spec', branch, dist=args.dist, kernel=kernel, verbose=args.verbose))
206
207     for pkg, kernels in packages.iteritems():
208         try:
209             name, spec, branch = clean_pkgname(pkg)
210         except NameError:
211             continue
212         if not pkg in args.packages:
213             continue
214         if not set(kernels).symmetric_difference(args.skip):
215             continue
216         if args.test_build:
217             command = ("%s -nd %s -d %s --define 'build_kernels %s' --without userspace %s" %
218                     (args.make_request, build_mode, args.dist, ','.join(kernels), spec))
219         else:
220             tag = get_last_tag(name, spec, branch, dist=args.dist, verbose=args.verbose)
221             if not tag:
222                 print "Failed getching last autotag for %s!" % pkg
223                 continue
224             command = ("%s -nd %s -d %s --define 'build_kernels %s' --without userspace %s:%s" %
225                     (args.make_request, build_mode, args.dist, ','.join(kernels), spec, tag))
226         run_command(shlex.split(command), verbose=args.verbose, quiet=False)
227
228     if args.nopae:
229         for pkg, kernels in packages.iteritems():
230             try:
231                 name, spec, branch = clean_pkgname(pkg)
232             except NameError:
233                 continue
234             if not pkg in args.packages:
235                 continue
236             if not 'head' in kernels:
237                 continue
238             if args.test_build:
239                 command = ("%s -nd %s -d %s -b th-i686 --define 'build_kernels nopae' --kernel nopae --without userspace %s" %
240                         (args.make_request, build_mode, args.dist, spec))
241             else:
242                 tag = get_last_tag(name, spec, branch, dist=args.dist, verbose=args.verbose)
243                 if not tag:
244                     print "Failed getching last autotag for %s!" % pkg
245                     continue
246                 command = ("%s -nd %s -d %s -b th-i686 --define 'build_kernels nopae' --kernel nopae --without userspace %s:%s" %
247                         (args.make_request, build_mode, args.dist, spec, tag))
248             run_command(shlex.split(command), verbose=args.verbose, quiet=False)
249
250 if __name__ == "__main__":
251     main()
252
253 # vi: encoding=utf-8 ts=8 sts=4 sw=4 et
This page took 0.095734 seconds and 4 git commands to generate.