#!/usr/bin/env python # Copyright 1999-2008 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 # # Zac Medico # import sys, os try: from portage.versions import pkgcmp, catpkgsplit from portage.util import grabfile except ImportError: # backward compat for <=portage-2.2 from portage_versions import pkgcmp, catpkgsplit from portage_util import grabfile def cmp_pkgs(pkg1, pkg2): return pkgcmp(catpkgsplit(pkg1[0])[1:], catpkgsplit(pkg2[0])[1:]) def list_distfiles(keyword_list, options): import portage portdb = portage.portdb portdb.porttrees = [portdb.porttree_root] if not keyword_list: keyword_list = grabfile(os.path.join( portdb.porttree_root, "profiles", "arch.list")) keyword_list = list(set(keyword_list)) keyword_list.sort() cp_all = portdb.cp_all() cp_all.sort() meta_keys = ["KEYWORDS", "RESTRICT", "SLOT"] restricts = frozenset(["fetch", "nofetch", "mirror", "nomirror"]) for cp in cp_all: cpv_list = portdb.cp_list(cp) cp_slots = {} for cpv in cpv_list: try: keywords, restrict, slot = portdb.aux_get(cpv, meta_keys) except KeyError: # corrupt ebuild or manifest continue restrict = restrict.split() if restricts.intersection(restrict): continue cp_slots.setdefault(slot, []).append((cpv, keywords.split())) for pkg_list in cp_slots.itervalues(): pkg_list.sort(cmp_pkgs, reverse=True) selected_pkgs = set() for keyword in keyword_list: for slot, pkg_list in cp_slots.iteritems(): for cpv, keywords in pkg_list: if keyword in keywords: selected_pkgs.add(cpv) if options.highest_only: break distfiles = set() for cpv in selected_pkgs: distfiles.update(portdb.getfetchlist(cpv, all=True)[1]) distfiles = list(distfiles) distfiles.sort() for f in distfiles: print f return os.EX_OK if __name__ == "__main__": description = "Show distfiles for the latest versions " + \ "of all packages with the given keywords " + \ "(all from arch.list if no keywords are given)." usage = "usage: %s [options] [keyword]..." % \ os.path.basename(sys.argv[0]) from optparse import OptionParser parser = OptionParser(description=description, usage=usage) parser.add_option("--highest-only", action="store_true", dest="highest_only", help="only include the highest version in a given package slot") options, args = parser.parse_args() retval = list_distfiles(args, options) sys.exit(retval)