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