X-Git-Url: http://www.project-moonshot.org/gitweb/?a=blobdiff_plain;f=rpm-builder;h=75a3399fe872ba71e880394f94866728104fff77;hb=5b4c384abc98c9d41809bb6f41967ad2b64159f8;hp=c202688602758155d8e2794be1cd2448c6042e7e;hpb=8d3e32d63f6d877f24aa0ec850f539a92cf30616;p=moonshot.git diff --git a/rpm-builder b/rpm-builder index c202688..75a3399 100755 --- a/rpm-builder +++ b/rpm-builder @@ -20,13 +20,54 @@ tar_file = None class CommandError(exceptions.StandardError): pass -def is_tarball(name): - return re.match('^.*\\.tar\\.gz', name) - -def trim_tarball(t): +# 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) + +builder_by_type = { + '.tar.gz': 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|\\.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): match = re.match('([^/-]*/)?([^-/]+)', t) + if match is None: return "" return match.group(2) + @contextmanager def current_directory(dir): "Change the current directory as a context manager; when the context exits, return." @@ -50,7 +91,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 +127,35 @@ 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")):