]>
Commit | Line | Data |
---|---|---|
17e4ceb7 JR |
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 | ||
0a954ea4 | 11 | supported_kernels = ['head', '5.4', '4.14', '4.9'] |
9c1e8c84 | 12 | |
17e4ceb7 | 13 | packages = 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 | ||
35 | def get_rpmdir(): | |
36 | return rpm.expandMacro("%_topdir") | |
37 | ||
38 | def 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 | ||
55 | def 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 | 71 | def 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 | ||
77 | def 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 | ||
86 | def 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 | ||
109 | def csv_list(string): | |
110 | return string.split(',') | |
111 | ||
112 | def 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 | ||
129 | def 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 |
228 | if __name__ == "__main__": |
229 | main() | |
230 | ||
231 | # vi: encoding=utf-8 ts=8 sts=4 sw=4 et |