#!/usr/bin/python -tt # take a list of pkg names # and a repo url # for each pkg, resolve out its deps # if anything new shows up - add it to the list of things to be resolved # wash rinse repeat import yum import sys provides_cache = {} def resolve_deps(pkg, base): deps = [] for req in pkg.requires: if req in provides_cache: deps.append(provides_cache[req]) continue try: po = base.returnPackageByDep(req) except yum.Errors.YumBaseError, e: print "unresolved dep for %s of pkg %s" % (req[0], pkg.name) continue provides_cache[req] = po.name deps.append(po.name) return deps def main(): repourl = 'http://download.fedoraproject.org/pub/fedora/linux/development/$basearch/os/' start_list = ['yum', '@core', 'anaconda', 'glibc', 'kernel'] new_items = True parsed_items = [] total_items = [] total_items.extend(start_list) my = yum.YumBase() my.repos.disableRepo('*') my.add_enable_repo('myrepo', baseurls=[repourl]) cachedir = yum.misc.getCacheDir() suffix='/$basearch/$releasever' my.repos.setCacheDir(cachedir + yum.parser.varReplace(suffix, my.yumvar)) while new_items: new_items = False these_items = total_items for name in these_items: if name.startswith('@'): grpid = name[1:] group = my.comps.return_group(grpid) for pkg in group.mandatory_packages.keys() + group.default_packages.keys(): if n not in total_items: new_items = True total_items.append(n) total_items.remove(name) continue if name not in parsed_items: pkg = my.pkgSack.searchNevra(name=name)[0] deps = resolve_deps(pkg, my) for n in deps: if n not in total_items: new_items = True total_items.append(n) parsed_items.append(name) print '\n'.join(sorted(total_items)) if __name__ == '__main__': main()