#!/usr/bin/python -tt import sys import tempfile import rpm import subprocess import os import glob import yum def return_binary_pkgs_from_srpm(srpmfn): mydir = tempfile.mkdtemp() binary_pkgs = [] rc = subprocess.Popen(['rpm2cpio', srpmfn],stdout=subprocess.PIPE) cs = subprocess.Popen(['cpio', '--quiet', '-i', '*.spec'], cwd=mydir, stdin=rc.stdout, stdout=subprocess.PIPE, stderr=open('/dev/null', 'w')) output = cs.communicate()[0] specs = glob.glob(mydir + '/*.spec') if not specs: return binary_pkgs spkg = rpm.spec(specs[0]) for p in spkg.packages: binary_pkgs.append(p.header['name']) return binary_pkgs import yum my = yum.YumBase() my.preconf.init_plugins=False my.setCacheDir() srpms = sys.argv[1:] build_reqs = {} build_bin = {} srpms_to_pkgs = {} for i in srpms: # generate the list of binpkgs the srpms create build_bin[i] = return_binary_pkgs_from_srpm(i) # generate the list of provides in the repos we know about from those binpkgs (if any) p_names = [] for name in build_bin[i]: providers = my.pkgSack.searchNevra(name=name) if providers: p_names.extend(providers[0].provides_names) build_bin[i].extend(p_names) # setup the build_reqs build_reqs[i] = [] for i in srpms: # go through each srpm and take its buildrequires and resolve them out to one of other # srpms, if possible using the build_bin list we just generated # toss out any pkg which doesn't map back - this only does requires NAMES - not versions # so don't go getting picky about versioning here. lp = yum.packages.YumLocalPackage(filename=i) srpms_to_pkgs[i] = lp for r in lp.requires_names: for srpm in build_bin: if r in build_bin[srpm]: build_reqs[i].append(srpm) # output the results in a format tsort(1) can cope with for (pkg,reqlist) in build_reqs.items(): for req in reqlist: print '%s %s' % (pkg, req)