#!/usr/bin/python -O
# Copyright 1999-2004 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Header: /var/cvsroot/gentoo-src/portage/bin/ebuild,v 1.18.2.3 2005/05/07 04:32:59 ferringb Exp $

import getopt, os, sys

if len(sys.argv)<=2:
	print "expecting two arguments."
	sys.exit(1)


(opts, pargs) = getopt.getopt(sys.argv[1:], '', ['debug'])
debug = ("--debug",'') in opts


if "merge" in pargs:
	print "Disabling noauto in features... merge disables it. (qmerge doesn't)"
	os.environ["FEATURES"] = os.environ.get("FEATURES", "") + " -noauto"

os.environ["PORTAGE_CALLER"]="ebuild"
sys.path = ["/usr/lib/portage/pym"]+sys.path

import portage, portage_util, portage_const

ebuild = os.path.realpath(pargs.pop(0))

if not os.path.exists(ebuild):
	print "'%s' does not exist." % ebuild
	sys.exit(1)

ebuild_split = ebuild.split("/")
del ebuild_split[-2]
cpv = "/".join(ebuild_split[-2:])[:-7]

if ebuild.startswith(portage.root + portage_const.VDB_PATH):
	mytree = "vartree"

	portage_ebuild = portage.db[portage.root][mytree].dbapi.findname(cpv)

	if os.path.realpath(portage_ebuild) != ebuild:
		print "!!! Portage seems to think that %s is at %s" % (cpv, portage_ebuild)
		sys.exit(1)

else:
	mytree = "porttree"

	portage_ebuild = portage.portdb.findname(cpv)

	if not portage_ebuild or os.path.realpath(portage_ebuild) != ebuild:
		overlay = "/".join(ebuild_split[:-2])
		os.environ["PORTDIR_OVERLAY"] = os.environ.get("PORTDIR_OVERLAY","") + " " + overlay
		print "Appending %s to PORTDIR_OVERLAY..." % overlay

		reload(portage)
		portage_ebuild = portage.portdb.findname(cpv)

		if not portage_ebuild or os.path.realpath(portage_ebuild) != ebuild:
			print "!!! %s does not seem to have a valid PORTDIR structure." % overlay
			sys.exit(1)


if len(pargs) > 1 and "config" in pargs:
	print "config must be called on it's own, not combined with any other phase"
	sys.exit(1)


for arg in pargs:
	try:
		tmpsettings = portage.config(clone=portage.settings)
		a = portage.doebuild(ebuild, arg, portage.root, tmpsettings, debug=debug, cleanup=("noauto" not in portage.features), tree=mytree)
	except KeyboardInterrupt:
		print "Interrupted."
		a = 1
	if a == None:
		print "Could not run the required binary?"
		a = 127
	if a:
		sys.exit(a)
