]>
Commit | Line | Data |
---|---|---|
082f68f1 | 1 | #!/usr/bin/python3 |
17e4ceb7 | 2 | |
fe8cf8f9 JR |
3 | from __future__ import print_function |
4 | ||
17e4ceb7 JR |
5 | import argparse |
6 | import collections | |
74a34bba | 7 | import functools |
17e4ceb7 JR |
8 | import os |
9 | import rpm | |
10 | import shlex | |
11 | import subprocess | |
12 | import sys | |
13 | ||
bae3572e | 14 | supported_kernels = ['head', '5.10', '5.4', '4.19', '4.9'] |
9c1e8c84 | 15 | |
17e4ceb7 | 16 | packages = collections.OrderedDict([ |
bae3572e JR |
17 | ('dahdi-linux', ['head', '5.10', '5.4', '4.19', '4.9']), |
18 | ('ipset', ['head', '5.10', '5.4', '4.19', '4.9']), | |
19 | ('lin_tape', ['head', '5.10', '5.4', '4.19', '4.9']), | |
20 | ('linux-gpib', ['head', '5.10', '5.4', '4.19', '4.9']), | |
21 | ('lttng-modules', ['head', '5.10', '5.4', '4.19', '4.9']), | |
22 | ('r8168', ['head', '5.10', '5.4', '4.19', '4.9']), | |
23 | ('rtl8812au', ['head', '5.10', '5.4', '4.19', '4.9']), | |
24 | ('VirtualBox', ['head', '5.10', '5.4', '4.19', '4.9']), | |
25 | ('vpb-driver', ['head', '5.10', '5.4', '4.19', '4.9']), | |
26 | ('wl', ['head', '5.10', '5.4', '4.19', '4.9']), | |
27 | ('xorg-driver-video-nvidia', ['head', '5.10', '5.4', '4.19', '4.9']), | |
28 | ('xorg-driver-video-nvidia-legacy-390xx', ['head', '5.10', '5.4', '4.19', '4.9']), | |
29 | ('zfs', ['head', '5.10', '5.4', '4.19', '4.9']), | |
3677825f | 30 | ('xtables-addons', ['head', '5.10', '5.4', '4.19']), |
bae3572e JR |
31 | ('xtables-addons:XTADDONS_2', ['4.9']), |
32 | ('crash', ['5.4', '4.19', '4.9']), | |
33 | ('WireGuard', ['5.4', '4.19', '4.9']), | |
17e4ceb7 JR |
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): | |
74a34bba | 57 | gitproc = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, bufsize=-1, text=True) |
17e4ceb7 JR |
58 | gitproc.wait() |
59 | out = gitproc.stdout.read().strip("\n'") | |
60 | if verbose: | |
fe8cf8f9 | 61 | print(' '.join(command)) |
17e4ceb7 | 62 | if not quiet: |
fe8cf8f9 | 63 | print(out) |
17e4ceb7 JR |
64 | if gitproc.returncode != 0: |
65 | if quiet: | |
fe8cf8f9 JR |
66 | print(out) |
67 | print('\nError running command: \n') | |
68 | print(' '.join(command)) | |
17e4ceb7 JR |
69 | return (False, None) |
70 | return (True, out) | |
71 | ||
8a2c0d44 | 72 | def get_last_tag(name, spec, branch, dist="th", kernel=None, verbose=False): |
17e4ceb7 JR |
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) | |
620e0c77 | 93 | if not os.path.exists("%s/%s" % (gitdir, spec)): |
17e4ceb7 JR |
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]: | |
fe8cf8f9 | 106 | print("Error: cannot checkout " + name) |
17e4ceb7 JR |
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 | ||
74a34bba JR |
113 | # TDOD: convert this to key function |
114 | # https://docs.python.org/3/library/stdtypes.html#list.sort | |
17e4ceb7 JR |
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)') | |
fc433b8b JR |
141 | parser.add_argument('-ni', '--noinstall', |
142 | action='store_true', | |
143 | help='skip installing new kernel packages on src builder (default: %(default)s)') | |
17e4ceb7 JR |
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)') | |
9236d6a6 JR |
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)') | |
17e4ceb7 JR |
158 | parser.add_argument('-t', '--test-build', |
159 | action='store_true', | |
160 | help='Perform a test-builds') | |
1e798ef6 JR |
161 | parser.add_argument('-bh', '--head', |
162 | action='store_true', | |
163 | help='Perform build from head instead of last auto-tag') | |
17e4ceb7 JR |
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: | |
8a2c0d44 | 171 | build_mode = '-t' |
17e4ceb7 JR |
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 | ||
9236d6a6 JR |
182 | build_kernels = supported_kernels |
183 | if args.kernel: | |
184 | build_kernels = args.kernel | |
185 | ||
fc433b8b JR |
186 | if not args.noinstall: |
187 | source_packages = [] | |
9c1e8c84 JR |
188 | for kernel in supported_kernels: |
189 | if kernel == 'head': | |
190 | ver = '-' | |
191 | else: | |
192 | ver = '-%s-' % kernel | |
fc433b8b | 193 | source_packages.extend(['kernel%sheaders' % ver, 'kernel%smodule-build' % ver]) |
16e6ea5c | 194 | command = (('%(make_request)s -b %(dist)s-src -t -c ' |
fc433b8b | 195 | '"poldek -n %(dist)s -n %(dist)s-ready -n %(dist)s-test --up ; ' |
0127a8c9 | 196 | 'poldek -uvg %(source_packages)s"') % |
fc433b8b JR |
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) | |
74a34bba | 201 | input('\nPress Enter after src builder updates kernel packages...') |
17e4ceb7 | 202 | |
fe8cf8f9 | 203 | print('\nCurrent kernels versions:') |
17e4ceb7 JR |
204 | all_kernels = set() |
205 | for kernel_list in packages.values(): | |
206 | all_kernels.update(kernel_list) | |
207 | all_kernels = list(all_kernels) | |
74a34bba JR |
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) | |
17e4ceb7 JR |
211 | for kernel in all_kernels: |
212 | branch = 'master' | |
213 | if kernel != 'head': | |
214 | branch = 'LINUX_%s' % kernel.replace('.','_') | |
fe8cf8f9 | 215 | print('%s: %s' % (kernel, get_last_tag('kernel', 'kernel.spec', branch, dist=args.dist, kernel=kernel, verbose=args.verbose))) |
17e4ceb7 | 216 | |
0adcdbc2 | 217 | for pkg, kernels in packages.items(): |
8a2c0d44 JR |
218 | try: |
219 | name, spec, branch = clean_pkgname(pkg) | |
220 | except NameError: | |
221 | continue | |
17e4ceb7 JR |
222 | if not pkg in args.packages: |
223 | continue | |
224 | if not set(kernels).symmetric_difference(args.skip): | |
225 | continue | |
9236d6a6 | 226 | selected_kernels = set(kernels).intersection(build_kernels) |
10c258a1 JR |
227 | if not selected_kernels: |
228 | continue | |
fc433b8b | 229 | if args.test_build: |
7ae71f9a JR |
230 | if branch: |
231 | spec = '%s:%s' % (spec, branch) | |
16e6ea5c | 232 | command = ("%s -nd %s -d %s --define 'build_kernels %s' --without userspace %s" % |
9236d6a6 | 233 | (args.make_request, build_mode, args.dist, ','.join(selected_kernels), spec)) |
fc433b8b | 234 | else: |
1e798ef6 JR |
235 | if not args.head: |
236 | tag = get_last_tag(name, spec, branch, dist=args.dist, verbose=args.verbose) | |
237 | if not tag: | |
fe8cf8f9 | 238 | print("Failed getching last autotag for %s!" % pkg) |
1e798ef6 JR |
239 | continue |
240 | spec = '%s:%s' % (spec, tag) | |
241 | command = ("%s -nd %s -d %s --define 'build_kernels %s' --without userspace %s" % | |
9236d6a6 | 242 | (args.make_request, build_mode, args.dist, ','.join(selected_kernels), spec)) |
17e4ceb7 JR |
243 | run_command(shlex.split(command), verbose=args.verbose, quiet=False) |
244 | ||
17e4ceb7 JR |
245 | if __name__ == "__main__": |
246 | main() | |
247 | ||
248 | # vi: encoding=utf-8 ts=8 sts=4 sw=4 et |