X-Git-Url: http://www.project-moonshot.org/gitweb/?a=blobdiff_plain;f=rpm-builder;h=549278470111a3e3c8cd71afe6284a2e8ef15b3d;hb=665b4fc36926383778388ef74b01a2c80d30debd;hp=3f37b699845ebaa9a5ee30aa13a28aeec0359bc8;hpb=1205e2bab6122bdefcc50da7b411afbd6df854e3;p=moonshot.git diff --git a/rpm-builder b/rpm-builder index 3f37b69..5492784 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,14 +127,20 @@ 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: + if trimmed not in package_order: package_order[trimmed] = t + os.umask(022) @@ -101,10 +148,13 @@ os.umask(022) try: 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")):