]>
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([ | |
12 | ('crash', ['head', '3.18', '3.14', '3.10', '3.4']), | |
13 | ('dahdi-linux', ['head', '3.18', '3.14', '3.10', '3.4']), | |
14 | ('igb', ['head', '3.18', '3.14', '3.10', '3.4']), | |
15 | ('ipset', ['head', '3.18', '3.14', '3.10', '3.4']), | |
16 | ('ixgbe', ['head', '3.18', '3.14', '3.10', '3.4']), | |
17 | ('lin_tape', ['head', '3.18', '3.14', '3.10', '3.4']), | |
18 | ('linux-fusion', ['head', '3.18', '3.14', '3.10', '3.4']), | |
19 | ('lttng-modules', ['head', '3.18', '3.14', '3.10', '3.4']), | |
20 | ('nvidiabl', ['head', '3.18', '3.14', '3.10', '3.4']), | |
21 | ('r8168', ['head', '3.18', '3.14', '3.10', '3.4']), | |
22 | ('rtl8812au', ['head', '3.18', '3.14', '3.10', '3.4']), | |
23 | ('spl', ['head', '3.18', '3.14', '3.10', '3.4']), | |
24 | ('tpm_emulator', ['head', '3.18', '3.14', '3.10', '3.4']), | |
25 | ('VirtualBox', ['head', '3.18', '3.14', '3.10', '3.4']), | |
26 | ('vpb-driver', ['head', '3.18', '3.14', '3.10', '3.4']), | |
27 | ('wl', ['head', '3.18', '3.14', '3.10', '3.4']), | |
28 | ('xorg-driver-video-fglrx', ['head', '3.18', '3.14', '3.10', '3.4']), | |
29 | ('xorg-driver-video-nvidia', ['head', '3.18', '3.14', '3.10', '3.4']), | |
30 | ('xorg-driver-video-nvidia-legacy-304xx', ['head', '3.18', '3.14', '3.10', '3.4']), | |
31 | ('xorg-driver-video-nvidia-legacy-340xx', ['head', '3.18', '3.14', '3.10', '3.4']), | |
32 | ('zfs', ['head', '3.18', '3.14', '3.10', '3.4']), | |
33 | ('xtables-addons:master', ['head', '3.18', '3.14', '3.10']), | |
34 | ('blcr', ['3.18', '3.14', '3.10', '3.4']), | |
35 | ('e1000e', ['3.18', '3.14', '3.10', '3.4']), | |
36 | ('open-vm-tools', ['3.18', '3.14', '3.10', '3.4']), | |
37 | ('linuxrdac', ['3.4']), | |
38 | ('lirc', ['3.4']), | |
39 | ('madwifi-ng', ['3.4']), | |
40 | ('xtables-addons:XTADDONS_1', ['3.4']) | |
41 | ]) | |
42 | ||
43 | def get_rpmdir(): | |
44 | return rpm.expandMacro("%_topdir") | |
45 | ||
46 | def clean_pkgname(package): | |
47 | pkg = package.split(":") | |
48 | if not pkg: | |
49 | raise NameError | |
50 | spec = pkg[0] | |
51 | # ensure package ends with .spec | |
52 | if not spec.endswith(".spec"): | |
53 | spec += ".spec" | |
54 | name = spec[:-5] | |
55 | # and pkg without subdir | |
56 | name = name[name.rfind("/")+1:] | |
57 | try: | |
58 | branch = pkg[1] | |
59 | except IndexError: | |
60 | branch = "master" | |
61 | return [name, spec, branch] | |
62 | ||
63 | def run_command(command, verbose=False, quiet=True): | |
64 | gitproc = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, bufsize=-1) | |
65 | gitproc.wait() | |
66 | out = gitproc.stdout.read().strip("\n'") | |
67 | if verbose: | |
68 | print ' '.join(command) | |
69 | if not quiet: | |
70 | print out | |
71 | if gitproc.returncode != 0: | |
72 | if quiet: | |
73 | print out | |
74 | print '\nError running command: \n' | |
75 | print ' '.join(command) | |
76 | return (False, None) | |
77 | return (True, out) | |
78 | ||
8a2c0d44 | 79 | def get_last_tag(name, spec, branch, dist="th", kernel=None, verbose=False): |
17e4ceb7 JR |
80 | fetch_package(name, spec, branch, verbose=verbose) |
81 | if os.path.exists("%s/%s/%s" % (get_rpmdir(), name, spec)): | |
82 | tag = get_autotag(name, spec, branch, dist=dist, kernel=kernel, verbose=verbose) | |
83 | return tag | |
84 | ||
85 | def get_autotag(name, spec, branch, dist="th", kernel=None, verbose=False): | |
86 | if not kernel or kernel == "head" or kernel == "master": | |
87 | ref = "auto/%s/%s-[0-9]*" % (dist, name) | |
88 | else: | |
89 | ref = "auto/%s/%s-%s-[0-9]*" % (dist, name, kernel) | |
90 | gitdir = "%s/%s" % (get_rpmdir(), name) | |
91 | tag = run_command(["/usr/bin/git", "-C", gitdir, "describe", "--tags", "--match", ref, "--abbrev=0", branch], verbose=verbose) | |
92 | return tag[1] | |
93 | ||
94 | def fetch_package(name, spec, branch, verbose=False): | |
95 | gitdir = "%s/%s" % (get_rpmdir(), name) | |
96 | if os.path.exists("%s/.git" % gitdir): | |
97 | run_command(["/usr/bin/git", "-C", gitdir, "fetch", "origin"], verbose=verbose) | |
98 | else: | |
99 | run_command(["/usr/bin/git", "clone", "-o", "origin", "git://git.pld-linux.org/packages/" + name + ".git", gitdir], verbose=verbose) | |
100 | if not os.path.exists("%s/%d" % (gitdir, spec)): | |
101 | return None | |
102 | run_command(["/usr/bin/git", "-C", gitdir, "config", "--local", "--add", "remote.origin.fetch", "refs/notes/*:refs/notes/*"], verbose=verbose) | |
103 | run_command(["/usr/bin/git", "-C", gitdir, "remote", "set-url", "--push", "origin", "ssh://git@git.pld-linux.org/packages/" + name], verbose=verbose) | |
104 | run_command(["/usr/bin/git", "-C", gitdir, "fetch", "origin", "refs/notes/*:refs/notes/*"], verbose=verbose) | |
105 | if branch: | |
106 | if run_command(["/usr/bin/git", "-C", gitdir, "rev-parse", "--verify", "-q", branch], verbose=verbose): | |
107 | run_command(["/usr/bin/git", "-C", gitdir, "checkout", branch, "--"], verbose=verbose) | |
108 | elif run_command(["/usr/bin/git", "-C", gitdir, "rev-parse", "--verify", "-q", "refs/remotes/origin/" + branch], verbose=verbose): | |
109 | run_command(["/usr/bin/git", "-C", gitdir, "checkout", "-t", "refs/remotes/origin/" + branch], verbose=verbose) | |
110 | rev_branch = run_command(["/usr/bin/git", "-C", gitdir, "rev-parse", branch], verbose=verbose) | |
111 | rev_head = run_command(["/usr/bin/git", "-C", gitdir, "rev-parse", "HEAD"], verbose=verbose) | |
112 | if rev_branch[1] != rev_head[1]: | |
113 | print "Error: cannot checkout " + name | |
114 | return None | |
115 | run_command(["/usr/bin/git", "-C", gitdir, "merge", "--ff-only", "@{upstream}"], verbose=verbose) | |
116 | ||
117 | def csv_list(string): | |
118 | return string.split(',') | |
119 | ||
120 | def kernel_cmp(x, y): | |
121 | x = x.split('.') | |
122 | y = y.split('.') | |
123 | try: | |
124 | int(x[0]) | |
125 | except ValueError: | |
126 | return 1 | |
127 | try: | |
128 | int(y[0]) | |
129 | except ValueError: | |
130 | return -1 | |
131 | majdiff = int(x[0]) - int(y[0]) | |
132 | if majdiff: | |
133 | return majdiff | |
134 | mindiff = int(x[1]) - int(y[1]) | |
135 | return mindiff | |
136 | ||
137 | def main(): | |
138 | parser = argparse.ArgumentParser(description='Rebuild kernel modules.') | |
139 | parser.add_argument('-d', '--dist', | |
140 | default='th', | |
141 | help='Dist name for getting auto-tags (default: %(default)s)') | |
142 | parser.add_argument('-m', '--make-request', | |
143 | default="make-request", | |
144 | metavar='SCRIPT', | |
145 | help='Name / path of the make-request script (default: %(default)s)') | |
146 | parser.add_argument('-n', '--nopae', | |
147 | action='store_true', | |
148 | help='Build packages for nopae kernel for i686 (default: %(default)s)') | |
149 | parser.add_argument('-p', '--packages', | |
150 | type=csv_list, | |
151 | default=packages.keys(), | |
152 | metavar='PKG1[,PKG2...]', | |
153 | help='Package names to build (default: all)') | |
154 | parser.add_argument('-s', '--skip', | |
155 | type=csv_list, | |
156 | metavar='VER1[,VER2...]', | |
157 | help='Don\'t build modules specific to 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('-v', '--verbose', | |
162 | action='store_true', | |
163 | help='Be verbose when running commands (default: %(default)s)') | |
164 | args = parser.parse_args() | |
165 | ||
166 | build_mode = '-r' | |
167 | if args.test_build: | |
8a2c0d44 | 168 | build_mode = '-t' |
17e4ceb7 JR |
169 | |
170 | if not args.skip: | |
171 | args.skip = [] | |
172 | ||
173 | if not args.make_request.startswith('/'): | |
174 | for path in os.defpath.split(os.pathsep): | |
175 | if os.path.isfile('/'.join([path, args.make_request])): | |
176 | args.make_request = '/'.join([path, args.make_request]) | |
177 | break | |
178 | ||
179 | source_packages = [] | |
180 | for ver in ['-','-nopae-','-3.18-','-3.14-','-3.10-','-3.4-']: | |
181 | source_packages.extend(['kernel%sheaders' % ver, 'kernel%smodule-build' % ver]) | |
182 | command = (('%(make_request)s -b %(dist)s-src -t -c ' | |
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...') | |
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 | |
8a2c0d44 | 212 | tag = get_last_tag(name, spec, branch, dist=args.dist, verbose=args.verbose) |
17e4ceb7 JR |
213 | if not tag: |
214 | print "Failed getching last autotag for %s!" % pkg | |
215 | continue | |
216 | command = ("%s -nd %s -d %s --define 'build_kernels %s' --without userspace %s:%s" % | |
8a2c0d44 | 217 | (args.make_request, build_mode, args.dist, ','.join(kernels), spec, tag)) |
17e4ceb7 JR |
218 | run_command(shlex.split(command), verbose=args.verbose, quiet=False) |
219 | ||
220 | if args.nopae: | |
221 | for pkg, kernels in packages.iteritems(): | |
8a2c0d44 JR |
222 | try: |
223 | name, spec, branch = clean_pkgname(pkg) | |
224 | except NameError: | |
225 | continue | |
17e4ceb7 JR |
226 | if not pkg in args.packages: |
227 | continue | |
228 | if not 'head' in kernels: | |
229 | continue | |
8a2c0d44 | 230 | tag = get_last_tag(name, spec, branch, dist=args.dist, verbose=args.verbose) |
17e4ceb7 JR |
231 | if not tag: |
232 | print "Failed getching last autotag for %s!" % pkg | |
233 | continue | |
234 | command = ("%s -nd %s -d %s -b th-i686 --define 'build_kernels nopae' --kernel nopae --without userspace %s:%s" % | |
8a2c0d44 | 235 | (args.make_request, build_mode, args.dist, spec, tag)) |
17e4ceb7 JR |
236 | run_command(shlex.split(command), verbose=args.verbose, quiet=False) |
237 | ||
238 | if __name__ == "__main__": | |
239 | main() | |
240 | ||
241 | # vi: encoding=utf-8 ts=8 sts=4 sw=4 et |