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