#!/usr/bin/python
import sys,os,getopt
sys.path = ["/usr/lib/portage/pym"]+sys.path
import output

VERSION = "0.1"

def is_new_file(line):
	if (line.endswith("ebuild")):
		if (line.startswith("deleting")):
			return 2
		else:
			return 1
	return 0
		
def split_line(line):
	cat,app,file = line.split("/")
	appver,ebuild = file.split(".ebuild")
	if appver.split("-")[-1][0] == "r":
		splitby = -2
	else:
		splitby = -1
	version = appver.split("-")[splitby:]
	version = "-".join(version)
	name = appver.split("-")[:splitby]
	name = "-".join(name)
	return cat,app,version
	
def instpkgs():
	package = []
	for i in os.popen('qpkg -I -nc'):
		package.append(i.strip())
	return package
	
def handle_opts():
	popts = []
	try:
		opts, args = getopt.getopt(sys.argv[1:], "ihdv", ["help", "installed", "deleted", "version"])
	except getopt.GetoptError:
		usage()
		sys.exit(2)
	
	for o,a in opts:
		if o in ("-i", "--installed"):
			popts.append("installed_only")
		if o in ("-h", "--help"):
			usage()
			sys.exit(2)
		if o in ("-d", "--deleted"):
			popts.append("deleted")
		if o in ("-v", "--version"):
			version()
			sys.exit(2)
	
	if (len(args) == 0):
			usage()
			sys.exit(2)
	
	return popts,args

def usage():
	print "Usage: " + os.path.basename(sys.argv[0]) + " [OPTS] <emerge sync log(s)>\n"
	print os.path.basename(sys.argv[0]) + " scans one or several logs from the emerge --sync command."
	print "It outputs the changed ebuilds that were downloaded.\n"
	print "	-h  --help		Show this help"
	print "	-i  --installed		Show only installed packages"
	print "	-d  --deleted		Show deleted ebuilds"
	print "	-v  --version		Print version and exit"
	
def version():
	print os.path.basename(sys.argv[0]) + " v" + VERSION
	
def print_list(dictvar, buildtype):
	for category in dictvar:
		for application in dictvar[category]:
			versions = ", ".join(dictvar[category][application])
			if "installed_only" in opts:
				if not category + "/" + application in instpkgs:
					continue
			catapp = category + "/" + application
			tabs = ""
			if len(catapp) < 37:
				tabs += "\t"
			if len(catapp) < 29:
				tabs += "\t"
			if len(catapp) < 21:
				tabs += "\t"
			if len(catapp) < 13:
				tabs += "\t"
			if len(catapp) < 5:
				tabs += "\t"
			if (buildtype == "new"):
				oversions = output.green(versions)
			else:
				oversions = output.red(versions)
			print "   " + catapp + tabs + oversions	

opts,args = handle_opts()
instpkgs = instpkgs()

for logfile in args:
	try:
		syncfile = file(logfile)
	except IOError:
		print "Couldn't open file: " + logfile
		sys.exit(1)
	newbuilds = {}
	delbuilds = {}
	
	for i in syncfile:
		line = i.strip()
		line = line.split("\r")[-1]
		new_or_old = 0
		new_or_old = is_new_file(line)
		if (new_or_old > 0):
			cat,app,version = split_line(line)
			if (new_or_old == 1):
				if not newbuilds.has_key(cat):
					newbuilds[cat] = {}
				if not newbuilds[cat].has_key(app):
					newbuilds[cat][app] = []
				newbuilds[cat][app].append(version)
			elif (new_or_old == 2):
				cat = cat.replace("deleting ", "")
				if not delbuilds.has_key(cat):
					delbuilds[cat] = {}
				if not delbuilds[cat].has_key(app):
					delbuilds[cat][app] = []
				delbuilds[cat][app].append(version)
		
	print "New builds:"
	print_list(newbuilds, "new")
	if "deleted" in opts:
		print ""
		print "Deleted builds:"
		print_list(delbuilds, "del")

