]>
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 | ||
11 | packages = collections.OrderedDict([ | |
1127c34e JR |
12 | ('crash', ['head', '4.9', '4.4', '4.1']), |
13 | ('dahdi-linux', ['head', '4.9', '4.4', '4.1']), | |
14 | ('ipset', ['head', '4.9', '4.4', '4.1']), | |
15 | ('lin_tape', ['head', '4.9', '4.4', '4.1']), | |
16 | ('linux-gpib', ['head', '4.9', '4.4', '4.1']), | |
17 | ('lttng-modules', ['head', '4.9', '4.4', '4.1']), | |
18 | ('r8168', ['head', '4.9', '4.4', '4.1']), | |
19 | ('rtl8812au', ['head', '4.9', '4.4', '4.1']), | |
20 | ('spl', ['head', '4.9', '4.4', '4.1']), | |
21 | ('sysdig', ['head', '4.9', '4.4', '4.1']), | |
22 | ('tpm_emulator', ['head', '4.9', '4.4', '4.1']), | |
23 | ('VirtualBox', ['head', '4.9', '4.4', '4.1']), | |
24 | ('vpb-driver', ['head', '4.9', '4.4', '4.1']), | |
25 | ('wl', ['head', '4.9', '4.4', '4.1']), | |
26 | ('xorg-driver-video-nvidia', ['head', '4.9', '4.4', '4.1']), | |
27 | ('xorg-driver-video-nvidia-legacy-304xx', ['head', '4.9', '4.4', '4.1']), | |
28 | ('xorg-driver-video-nvidia-legacy-340xx', ['head', '4.9', '4.4', '4.1']), | |
29 | ('xtables-addons', ['head', '4.9', '4.4', '4.1']), | |
30 | ('zfs', ['head', '4.9', '4.4', '4.1']), | |
31 | ('igb', ['4.4', '4.1']), | |
32 | ('ixgbe', ['4.4', '4.1']), | |
33 | ('nvidiabl', ['4.4', '4.1']), | |
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): | |
57 | gitproc = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, bufsize=-1) | |
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 | ||
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) | |
93 | if not os.path.exists("%s/%d" % (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 | def kernel_cmp(x, y): | |
114 | x = x.split('.') | |
115 | y = y.split('.') | |
116 | try: | |
117 | int(x[0]) | |
118 | except ValueError: | |
119 | return 1 | |
120 | try: | |
121 | int(y[0]) | |
122 | except ValueError: | |
123 | return -1 | |
124 | majdiff = int(x[0]) - int(y[0]) | |
125 | if majdiff: | |
126 | return majdiff | |
127 | mindiff = int(x[1]) - int(y[1]) | |
128 | return mindiff | |
129 | ||
130 | def main(): | |
131 | parser = argparse.ArgumentParser(description='Rebuild kernel modules.') | |
132 | parser.add_argument('-d', '--dist', | |
133 | default='th', | |
134 | help='Dist name for getting auto-tags (default: %(default)s)') | |
135 | parser.add_argument('-m', '--make-request', | |
136 | default="make-request", | |
137 | metavar='SCRIPT', | |
138 | help='Name / path of the make-request script (default: %(default)s)') | |
fc433b8b JR |
139 | parser.add_argument('-ni', '--noinstall', |
140 | action='store_true', | |
141 | help='skip installing new kernel packages on src builder (default: %(default)s)') | |
17e4ceb7 JR |
142 | parser.add_argument('-n', '--nopae', |
143 | action='store_true', | |
144 | help='Build packages for nopae kernel for i686 (default: %(default)s)') | |
145 | parser.add_argument('-p', '--packages', | |
146 | type=csv_list, | |
147 | default=packages.keys(), | |
148 | metavar='PKG1[,PKG2...]', | |
149 | help='Package names to build (default: all)') | |
150 | parser.add_argument('-s', '--skip', | |
151 | type=csv_list, | |
152 | metavar='VER1[,VER2...]', | |
153 | help='Don\'t build modules specific to these kernels (default: %(default)s)') | |
154 | parser.add_argument('-t', '--test-build', | |
155 | action='store_true', | |
156 | help='Perform a test-builds') | |
157 | parser.add_argument('-v', '--verbose', | |
158 | action='store_true', | |
159 | help='Be verbose when running commands (default: %(default)s)') | |
160 | args = parser.parse_args() | |
161 | ||
162 | build_mode = '-r' | |
163 | if args.test_build: | |
8a2c0d44 | 164 | build_mode = '-t' |
17e4ceb7 JR |
165 | |
166 | if not args.skip: | |
167 | args.skip = [] | |
168 | ||
169 | if not args.make_request.startswith('/'): | |
170 | for path in os.defpath.split(os.pathsep): | |
171 | if os.path.isfile('/'.join([path, args.make_request])): | |
172 | args.make_request = '/'.join([path, args.make_request]) | |
173 | break | |
174 | ||
fc433b8b JR |
175 | if not args.noinstall: |
176 | source_packages = [] | |
88000c64 | 177 | for ver in ['-','-nopae-','-4.9-','-4.4-','-4.1-']: |
fc433b8b | 178 | source_packages.extend(['kernel%sheaders' % ver, 'kernel%smodule-build' % ver]) |
c856373d | 179 | command = (('%(make_request)s -p 1 -b %(dist)s-src -t -c ' |
fc433b8b JR |
180 | '"poldek -n %(dist)s -n %(dist)s-ready -n %(dist)s-test --up ; ' |
181 | 'poldek -uGv %(source_packages)s"') % | |
182 | {'make_request': args.make_request, | |
183 | 'dist': args.dist, | |
184 | 'source_packages': ' '.join(source_packages)}) | |
185 | run_command(shlex.split(command), verbose=args.verbose, quiet=False) | |
186 | raw_input('\nPress Enter after src builder updates kernel packages...') | |
17e4ceb7 JR |
187 | |
188 | print '\nCurrent kernels versions:' | |
189 | all_kernels = set() | |
190 | for kernel_list in packages.values(): | |
191 | all_kernels.update(kernel_list) | |
192 | all_kernels = list(all_kernels) | |
193 | all_kernels.sort(cmp=kernel_cmp, reverse=True) | |
194 | for kernel in all_kernels: | |
195 | branch = 'master' | |
196 | if kernel != 'head': | |
197 | branch = 'LINUX_%s' % kernel.replace('.','_') | |
8a2c0d44 | 198 | print '%s: %s' % (kernel, get_last_tag('kernel', 'kernel.spec', branch, dist=args.dist, kernel=kernel, verbose=args.verbose)) |
17e4ceb7 JR |
199 | |
200 | for pkg, kernels in packages.iteritems(): | |
8a2c0d44 JR |
201 | try: |
202 | name, spec, branch = clean_pkgname(pkg) | |
203 | except NameError: | |
204 | continue | |
17e4ceb7 JR |
205 | if not pkg in args.packages: |
206 | continue | |
207 | if not set(kernels).symmetric_difference(args.skip): | |
208 | continue | |
fc433b8b | 209 | if args.test_build: |
c856373d | 210 | command = ("%s -p 1 -nd %s -d %s --define 'build_kernels %s' --without userspace %s" % |
fc433b8b JR |
211 | (args.make_request, build_mode, args.dist, ','.join(kernels), spec)) |
212 | else: | |
213 | tag = get_last_tag(name, spec, branch, dist=args.dist, verbose=args.verbose) | |
214 | if not tag: | |
215 | print "Failed getching last autotag for %s!" % pkg | |
216 | continue | |
c856373d | 217 | command = ("%s -p 1 -nd %s -d %s --define 'build_kernels %s' --without userspace %s:%s" % |
fc433b8b | 218 | (args.make_request, build_mode, args.dist, ','.join(kernels), spec, tag)) |
17e4ceb7 JR |
219 | run_command(shlex.split(command), verbose=args.verbose, quiet=False) |
220 | ||
221 | if args.nopae: | |
222 | for pkg, kernels in packages.iteritems(): | |
8a2c0d44 JR |
223 | try: |
224 | name, spec, branch = clean_pkgname(pkg) | |
225 | except NameError: | |
226 | continue | |
17e4ceb7 JR |
227 | if not pkg in args.packages: |
228 | continue | |
229 | if not 'head' in kernels: | |
230 | continue | |
fc433b8b | 231 | if args.test_build: |
c856373d | 232 | command = ("%s -p 1 -nd %s -d %s -b th-i686 --define 'build_kernels nopae' --kernel nopae --without userspace %s" % |
fc433b8b JR |
233 | (args.make_request, build_mode, args.dist, spec)) |
234 | else: | |
235 | tag = get_last_tag(name, spec, branch, dist=args.dist, verbose=args.verbose) | |
236 | if not tag: | |
237 | print "Failed getching last autotag for %s!" % pkg | |
238 | continue | |
c856373d | 239 | command = ("%s -p 1 -nd %s -d %s -b th-i686 --define 'build_kernels nopae' --kernel nopae --without userspace %s:%s" % |
fc433b8b | 240 | (args.make_request, build_mode, args.dist, spec, tag)) |
17e4ceb7 JR |
241 | run_command(shlex.split(command), verbose=args.verbose, quiet=False) |
242 | ||
243 | if __name__ == "__main__": | |
244 | main() | |
245 | ||
246 | # vi: encoding=utf-8 ts=8 sts=4 sw=4 et |