#!/usr/bin/env python # # Copyright 2004 Sven Wegener # # $Id: eversionpurge,v 1.5 2004/09/19 17:57:47 sven Exp $ # import portage,os,sys,string def myvercmp(x, y): return int(portage.pkgcmp(portage.pkgsplit(y), portage.pkgsplit(x))) maskdict = portage.settings.pmaskdict unmaskdict = portage.settings.punmaskdict porttree = portage.db["/"]["porttree"] allpackages = porttree.dbapi.cp_all() packages = [] if len(sys.argv) > 1: for arg in sys.argv[1:]: if arg in portage.settings.categories: for cp in allpackages: if cp.split("/")[0] == arg: packages.append(cp) elif arg in allpackages: packages.append(arg) else: print "No valid category or package: " + arg else: packages = allpackages if len(packages) == 0: print "No packages to check" sys.exit(1) for cp in packages: PACKAGE = {} for cpvr in porttree.dbapi.xmatch("match-all", cp): masked = 0 if maskdict.has_key(cp): for x in maskdict[cp]: if cpvr in porttree.dbapi.xmatch("match-all", x): masked = 1 if unmaskdict.has_key(cp): for z in unmaskdict[cp]: if cpvr in porttree.dbapi.xmatch("match-all", z): masked = 0 if masked == 1: continue c, PF = cpvr.split("/") keywords, slot = porttree.dbapi.aux_get(cpvr, ["KEYWORDS", "SLOT"]) if not PACKAGE.has_key(slot): PACKAGE[slot] = {} PACKAGE[slot][PF] = {} PACKAGE[slot][PF]['T'] = [] PACKAGE[slot][PF]['S'] = [] for keyword in keywords.split(): if keyword == "-*": PACKAGE[slot][PF]['S']=[] PACKAGE[slot][PF]['T']=[] elif keyword[0] == "~": PACKAGE[slot][PF]['T'].append(keyword[1:]) elif keyword[0] == "-": if keyword[1:] in PACKAGE[slot][PF]['S']: PACKAGE[slot][PF]['S'].remove(keyword[1:]) if keyword[1:] in PACKAGE[slot][PF]['T']: PACKAGE[slot][PF]['T'].remove(keyword[1:]) else: PACKAGE[slot][PF]['S'].append(keyword) for slot in PACKAGE: versions = PACKAGE[slot].keys() if len(versions) < 2: continue versions.sort(myvercmp) KEYWORDS_S = PACKAGE[slot][versions[0]]['S'] KEYWORDS_T = PACKAGE[slot][versions[0]]['T'] for version in versions[1:]: purge = 1 for keyword in PACKAGE[slot][version]['S']: if keyword not in KEYWORDS_S: KEYWORDS_S.append(keyword) purge = 0 if keyword not in KEYWORDS_T: KEYWORDS_T.append(keyword) purge = 0 for keyword in PACKAGE[slot][version]['T']: if keyword not in KEYWORDS_T: KEYWORDS_T.append(keyword) purge = 0 if purge == 1: print c + "/" + version + " in SLOT " + slot