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