]> git.pld-linux.org Git - projects/pld-builder.new.git/blame - client/rebuild-kernel-packages.py
rebuild-kernel-packages.py: fix building packages from specific branch
[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
11packages = 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
43def get_rpmdir():
44 return rpm.expandMacro("%_topdir")
45
46def 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
63def 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 79def 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
85def 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
94def 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
117def csv_list(string):
118 return string.split(',')
119
120def 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
137def 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
238if __name__ == "__main__":
239 main()
240
241# vi: encoding=utf-8 ts=8 sts=4 sw=4 et
This page took 0.137674 seconds and 4 git commands to generate.