X-Git-Url: http://www.project-moonshot.org/gitweb/?p=moonshot.git;a=blobdiff_plain;f=rpm-builder;h=d98328dc139b59dcf5e015a75f321085b3503d4a;hp=c202688602758155d8e2794be1cd2448c6042e7e;hb=60450f58765da6ab187477a5cbfcb8fbd6c3b485;hpb=8d3e32d63f6d877f24aa0ec850f539a92cf30616 diff --git a/rpm-builder b/rpm-builder index c202688..d98328d 100755 --- a/rpm-builder +++ b/rpm-builder @@ -7,6 +7,7 @@ from contextlib import contextmanager import os, subprocess, exceptions import re import sys +import string from optparse import OptionParser from shutil import copy @@ -20,13 +21,63 @@ tar_file = None class CommandError(exceptions.StandardError): pass -def is_tarball(name): - return re.match('^.*\\.tar\\.gz', name) - -def trim_tarball(t): - match = re.match('([^/-]*/)?([^-/]+)', t) - return match.group(2) +# Centos 6.5 does not have collections.OrderedDict +# This implementation provides the minimal functionality of OrderedDict that we need +# It works here, but should not be counted on for anything else. +class OrderedDict(dict): + + def __setitem__(self,k, v): + if k not in self: + self.keylist.append(k) + return super(OrderedDict,self).__setitem__(k,v) + + def __init__(self, *args, **kwargs): + super(OrderedDict,self).__init__(*args, **kwargs) + self.keylist = [] + + def values(self): + return map( lambda(elt): self[elt], self.keylist) + + def iteritems(self): + for k in self.keylist: + yield (k, self[k]) + +builder_by_type = { + '.tar.gz': lambda(t): run_cmd([ 'rpmbuild', '-ta', t]), + '.tar.bz2': lambda(t): run_cmd([ 'rpmbuild', '-ta', t]), + '.spec': + lambda(s): run_cmd(['rpmbuild', '--define', '_sourcedir '+os.getcwd(), + '-ba', s]), + } + + +def find_type(name): + match = re.match('^.*(\\.tar\\.gz|\\.tar\\.bz2|\\.spec)$', name) + if match: + return match.group(1) + else: return None + + +# The following regexp is not quite right. +# One place is the rpm_packages file. +# The other is the directory listing. +# The rpm_packages file might have entries like shibboleth/xmltooling +# Where as the distributions directory might have xmltooling-1.5.tar.gz +# Two requirements for correct operation: +# trim_target produces unique results for everything in rpm_packages +# trim_target correctly trims what's in the packages file to the same +# thing it trims the tar file or spec file to. +# +def trim_target(t): + # first lose any suffix (like -1.5.tar.gz) + name_parts=t.split('-') + if name_parts[-1][0] in string.digits: + name_parts=name_parts[:-1] + name="-".join(name_parts) # in case it had dash-separated parts + name="-".join(name.split("/")) # replace / with - + return name + @contextmanager def current_directory(dir): "Change the current directory as a context manager; when the context exits, return." @@ -50,7 +101,7 @@ def command_output(args) : return output.strip() def build(package): - run_cmd(['rpmbuild', '-ta', package]) + return builder_by_type[find_type(package)](package) @@ -86,25 +137,33 @@ if len(args) == 0: exit(1) dist_dir = args[0] packages = args[1:] - if len(packages) == 0: packages = read_packages() -package_order = {} -count = 0 -tarballs = filter(is_tarball, os.listdir(dist_dir)) +package_order = OrderedDict() for t in packages: - package_order[trim_tarball(t)] = count - count += 1 - + package_order[trim_target(t)] = None + +for t in os.listdir(dist_dir): + target_type = find_type(t) + if target_type is None: continue + trimmed = trim_target(t) + if target_type == ".spec": + package_order[trimmed] = t + else: + # Replace None but nothing else + if not package_order.get(trimmed): package_order[trimmed] = t os.umask(022) try: - run_cmd([ 'rm' '-rf', + run_cmd([ 'rm', '-rf', os.path.expanduser("~/rpmbuild")]) - rum_cmd([ 'rpmdev-setuptree']) + run_cmd([ 'rpmdev-setuptree']) + for f in os.listdir("rpm-sources"): + copy("rpm-sources/" + f, dist_dir) + with current_directory(dist_dir): - tarballs.sort (key = lambda x: package_order[trim_tarball(x)]) - for t in tarballs: + for t in package_order.values(): + if t is None: continue build(t) if tar_file is not None: with current_directory(os.path.expanduser("~/rpmbuild")):