#!/usr/bin/env python import os, sys def check_dist_hashes(required_hash_types=None): os.environ["PORTDIR_OVERLAY"] = "" import portage from portage import Manifest, FetchlistDict from portage_const import MANIFEST2_HASH_FUNCTIONS trees = portage.db settings = portage.settings myroot = settings["ROOT"] portdb = trees[myroot]["porttree"].dbapi portdir = settings["PORTDIR"] if not required_hash_types: required_hash_types = set() required_hash_types.add("size") manifest2_hash_types = set(MANIFEST2_HASH_FUNCTIONS) for cp in portdb.cp_all(): missing_data = False pkgdir = os.path.join(portdir, cp) fetchlist_dict = FetchlistDict(pkgdir, settings, portdb) mf = Manifest(pkgdir, settings["DISTDIR"], fetchlist_dict=fetchlist_dict) dist_hashes = mf.fhashdict.get("DIST", {}) distfiles_set = set() for myfiles in fetchlist_dict.itervalues(): distfiles_set.update(myfiles) for myfile in distfiles_set: myhashes = dist_hashes.get(myfile) if not myhashes: missing_data = True yield cp break if required_hash_types.difference(myhashes): yield cp break if not manifest2_hash_types.intersection(myhashes): yield cp break if __name__ == "__main__": for cp in check_dist_hashes(set(sys.argv[1:])): print cp