#!/usr/bin/env python
#
# Copyright 2004 Sven Wegener <swegener@gentoo.org>
#
# $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
