11 packages = collections.OrderedDict([
12 ('crash', ['head', '4.4', '4.1', '3.18']),
13 ('dahdi-linux', ['head', '4.4', '4.1', '3.18']),
14 ('igb', ['head', '4.4', '4.1', '3.18']),
15 ('ipset', ['head', '4.4', '4.1', '3.18']),
16 ('ixgbe', ['head', '4.4', '4.1', '3.18']),
17 ('lin_tape', ['head', '4.4', '4.1', '3.18']),
18 ('linux-fusion', ['head', '4.4', '4.1', '3.18']),
19 ('lttng-modules', ['head', '4.4', '4.1', '3.18']),
20 ('nvidiabl', ['head', '4.4', '4.1', '3.18']),
21 ('r8168', ['head', '4.4', '4.1', '3.18']),
22 ('rtl8812au', ['head', '4.4', '4.1', '3.18']),
23 ('spl', ['head', '4.4', '4.1', '3.18']),
24 ('tpm_emulator', ['head', '4.4', '4.1', '3.18']),
25 ('VirtualBox', ['head', '4.4', '4.1', '3.18']),
26 ('vpb-driver', ['head', '4.4', '4.1', '3.18']),
27 ('wl', ['head', '4.4', '4.1', '3.18']),
28 ('xorg-driver-video-fglrx', ['head', '4.4', '4.1', '3.18']),
29 ('xorg-driver-video-nvidia', ['head', '4.4', '4.1', '3.18']),
30 ('xorg-driver-video-nvidia-legacy-304xx', ['head', '4.4', '4.1', '3.18']),
31 ('xorg-driver-video-nvidia-legacy-340xx', ['head', '4.4', '4.1', '3.18']),
32 ('zfs', ['head', '4.4', '4.1', '3.18']),
33 ('xtables-addons', ['head', '4.4', '4.1', '3.18']),
35 ('open-vm-tools', ['3.18']),
39 return rpm.expandMacro("%_topdir")
41 def clean_pkgname(package):
42 pkg = package.split(":")
46 # ensure package ends with .spec
47 if not spec.endswith(".spec"):
50 # and pkg without subdir
51 name = name[name.rfind("/")+1:]
56 return [name, spec, branch]
58 def run_command(command, verbose=False, quiet=True):
59 gitproc = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, bufsize=-1)
61 out = gitproc.stdout.read().strip("\n'")
63 print ' '.join(command)
66 if gitproc.returncode != 0:
69 print '\nError running command: \n'
70 print ' '.join(command)
74 def get_last_tag(name, spec, branch, dist="th", kernel=None, verbose=False):
75 fetch_package(name, spec, branch, verbose=verbose)
76 if os.path.exists("%s/%s/%s" % (get_rpmdir(), name, spec)):
77 tag = get_autotag(name, spec, branch, dist=dist, kernel=kernel, verbose=verbose)
80 def get_autotag(name, spec, branch, dist="th", kernel=None, verbose=False):
81 if not kernel or kernel == "head" or kernel == "master":
82 ref = "auto/%s/%s-[0-9]*" % (dist, name)
84 ref = "auto/%s/%s-%s-[0-9]*" % (dist, name, kernel)
85 gitdir = "%s/%s" % (get_rpmdir(), name)
86 tag = run_command(["/usr/bin/git", "-C", gitdir, "describe", "--tags", "--match", ref, "--abbrev=0", branch], verbose=verbose)
89 def fetch_package(name, spec, branch, verbose=False):
90 gitdir = "%s/%s" % (get_rpmdir(), name)
91 if os.path.exists("%s/.git" % gitdir):
92 run_command(["/usr/bin/git", "-C", gitdir, "fetch", "origin"], verbose=verbose)
94 run_command(["/usr/bin/git", "clone", "-o", "origin", "git://git.pld-linux.org/packages/" + name + ".git", gitdir], verbose=verbose)
95 if not os.path.exists("%s/%d" % (gitdir, spec)):
97 run_command(["/usr/bin/git", "-C", gitdir, "config", "--local", "--add", "remote.origin.fetch", "refs/notes/*:refs/notes/*"], verbose=verbose)
98 run_command(["/usr/bin/git", "-C", gitdir, "remote", "set-url", "--push", "origin", "ssh://git@git.pld-linux.org/packages/" + name], verbose=verbose)
99 run_command(["/usr/bin/git", "-C", gitdir, "fetch", "origin", "refs/notes/*:refs/notes/*"], verbose=verbose)
101 if run_command(["/usr/bin/git", "-C", gitdir, "rev-parse", "--verify", "-q", branch], verbose=verbose):
102 run_command(["/usr/bin/git", "-C", gitdir, "checkout", branch, "--"], verbose=verbose)
103 elif run_command(["/usr/bin/git", "-C", gitdir, "rev-parse", "--verify", "-q", "refs/remotes/origin/" + branch], verbose=verbose):
104 run_command(["/usr/bin/git", "-C", gitdir, "checkout", "-t", "refs/remotes/origin/" + branch], verbose=verbose)
105 rev_branch = run_command(["/usr/bin/git", "-C", gitdir, "rev-parse", branch], verbose=verbose)
106 rev_head = run_command(["/usr/bin/git", "-C", gitdir, "rev-parse", "HEAD"], verbose=verbose)
107 if rev_branch[1] != rev_head[1]:
108 print "Error: cannot checkout " + name
110 run_command(["/usr/bin/git", "-C", gitdir, "merge", "--ff-only", "@{upstream}"], verbose=verbose)
112 def csv_list(string):
113 return string.split(',')
115 def kernel_cmp(x, y):
126 majdiff = int(x[0]) - int(y[0])
129 mindiff = int(x[1]) - int(y[1])
133 parser = argparse.ArgumentParser(description='Rebuild kernel modules.')
134 parser.add_argument('-d', '--dist',
136 help='Dist name for getting auto-tags (default: %(default)s)')
137 parser.add_argument('-m', '--make-request',
138 default="make-request",
140 help='Name / path of the make-request script (default: %(default)s)')
141 parser.add_argument('-ni', '--noinstall',
143 help='skip installing new kernel packages on src builder (default: %(default)s)')
144 parser.add_argument('-n', '--nopae',
146 help='Build packages for nopae kernel for i686 (default: %(default)s)')
147 parser.add_argument('-p', '--packages',
149 default=packages.keys(),
150 metavar='PKG1[,PKG2...]',
151 help='Package names to build (default: all)')
152 parser.add_argument('-s', '--skip',
154 metavar='VER1[,VER2...]',
155 help='Don\'t build modules specific to these kernels (default: %(default)s)')
156 parser.add_argument('-t', '--test-build',
158 help='Perform a test-builds')
159 parser.add_argument('-v', '--verbose',
161 help='Be verbose when running commands (default: %(default)s)')
162 args = parser.parse_args()
171 if not args.make_request.startswith('/'):
172 for path in os.defpath.split(os.pathsep):
173 if os.path.isfile('/'.join([path, args.make_request])):
174 args.make_request = '/'.join([path, args.make_request])
177 if not args.noinstall:
179 for ver in ['-','-nopae-','-4.4-','-4.1-','-3.18-']:
180 source_packages.extend(['kernel%sheaders' % ver, 'kernel%smodule-build' % ver])
181 command = (('%(make_request)s -b %(dist)s-src -t -c '
182 '"poldek -n %(dist)s -n %(dist)s-ready -n %(dist)s-test --up ; '
183 'poldek -uGv %(source_packages)s"') %
184 {'make_request': args.make_request,
186 'source_packages': ' '.join(source_packages)})
187 run_command(shlex.split(command), verbose=args.verbose, quiet=False)
188 raw_input('\nPress Enter after src builder updates kernel packages...')
190 print '\nCurrent kernels versions:'
192 for kernel_list in packages.values():
193 all_kernels.update(kernel_list)
194 all_kernels = list(all_kernels)
195 all_kernels.sort(cmp=kernel_cmp, reverse=True)
196 for kernel in all_kernels:
199 branch = 'LINUX_%s' % kernel.replace('.','_')
200 print '%s: %s' % (kernel, get_last_tag('kernel', 'kernel.spec', branch, dist=args.dist, kernel=kernel, verbose=args.verbose))
202 for pkg, kernels in packages.iteritems():
204 name, spec, branch = clean_pkgname(pkg)
207 if not pkg in args.packages:
209 if not set(kernels).symmetric_difference(args.skip):
212 command = ("%s -nd %s -d %s --define 'build_kernels %s' --without userspace %s" %
213 (args.make_request, build_mode, args.dist, ','.join(kernels), spec))
215 tag = get_last_tag(name, spec, branch, dist=args.dist, verbose=args.verbose)
217 print "Failed getching last autotag for %s!" % pkg
219 command = ("%s -nd %s -d %s --define 'build_kernels %s' --without userspace %s:%s" %
220 (args.make_request, build_mode, args.dist, ','.join(kernels), spec, tag))
221 run_command(shlex.split(command), verbose=args.verbose, quiet=False)
224 for pkg, kernels in packages.iteritems():
226 name, spec, branch = clean_pkgname(pkg)
229 if not pkg in args.packages:
231 if not 'head' in kernels:
234 command = ("%s -nd %s -d %s -b th-i686 --define 'build_kernels nopae' --kernel nopae --without userspace %s" %
235 (args.make_request, build_mode, args.dist, spec))
237 tag = get_last_tag(name, spec, branch, dist=args.dist, verbose=args.verbose)
239 print "Failed getching last autotag for %s!" % pkg
241 command = ("%s -nd %s -d %s -b th-i686 --define 'build_kernels nopae' --kernel nopae --without userspace %s:%s" %
242 (args.make_request, build_mode, args.dist, spec, tag))
243 run_command(shlex.split(command), verbose=args.verbose, quiet=False)
245 if __name__ == "__main__":
248 # vi: encoding=utf-8 ts=8 sts=4 sw=4 et