#!/usr/bin/env python

try:
	import pacman
except ImportError:
	import alpm
	pacman = alpm
import os, tempfile, shutil, sys

def pacman_pkg_getgroups(pkg):
	i = pacman.void_to_PM_LIST(pacman.pkg_getinfo(pkg, pacman.PKG_GROUPS))
	ret = []
	while i:
		ret.append(pacman.void_to_char(pacman.list_getdata(i)))
		i = pacman.list_next(i)
	return ret

def any_in(needle, haystack):
	"""return true if any of the needle list is found in haystack"""
	for i in needle:
		if i in haystack:
			return True
	return False

if len(sys.argv) > 1 and sys.argv[1] == "--help":
	print("COREPKGS (core, chroot-core, devel-core) packages which depend on packages outsite COREPKGS (->COREPKGS is needed)")
	sys.exit(0)

basecats = ['core', 'chroot-core', 'devel-core']

root = tempfile.mkdtemp()
pacman.initialize(root)
if os.getcwd().split('/')[-2] == "frugalware-current":
	treename = "frugalware-current"
else:
	treename = "frugalware"
db = pacman.db_register(treename)
pacman.db_setserver(db, "file://" + os.getcwd() + "/../frugalware-%s" % sys.argv[1])
pacman.db_update(1, db)

i = pacman.db_getpkgcache(db)
while i:
	pkg = pacman.void_to_PM_PKG(pacman.list_getdata(i))
	pkgname = pacman.void_to_char(pacman.pkg_getinfo(pkg, pacman.PKG_NAME))
	groups = pacman_pkg_getgroups(pkg)

	if not any_in(basecats, groups):
		i = pacman.list_next(i)
		continue
	j = pacman.void_to_PM_LIST(pacman.pkg_getinfo(pkg, pacman.PKG_DEPENDS))
	while j:
		found = False
		dep = pacman.void_to_char(pacman.list_getdata(j)).split("<")[0].split(">")[0].split("=")[0]
		k = pacman.db_getpkgcache(db)
		while not found and k:
			p = pacman.void_to_PM_PKG(pacman.list_getdata(k))
			if pacman.void_to_char(pacman.pkg_getinfo(p, pacman.PKG_NAME)) == dep:
				if any_in(basecats, pacman_pkg_getgroups(p)):
					found = True
			else:
				l = pacman.void_to_PM_LIST(pacman.pkg_getinfo(p, pacman.PKG_PROVIDES))
				while not found and l:
					pr = pacman.void_to_PM_PKG(pacman.list_getdata(l))
					if pacman.void_to_char(pacman.pkg_getinfo(pr, pacman.PKG_NAME)) == dep:
						found = True
					l = pacman.list_next(l)
			k = pacman.list_next(k)
		if not found:
			try:
				socket = open("../source/%s/%s/FrugalBuild" % (groups[0], pkgname))
				while True:
					line = socket.readline()
					if not line:
						break
					if line[:14] != "# Maintainer: ":
						continue
					maintainer = line[14:].strip()
					break
				socket.close()
			except IOError:
				maintainer = "Unknown"
			print("%s should be moved out from COREPKGS (%s is not in COREPKGS; %s)" % (pkgname, pacman.void_to_char(pacman.list_getdata(j)), maintainer))
		j = pacman.list_next(j)
	i = pacman.list_next(i)
shutil.rmtree(root)
