#!/usr/bin/env python
import os
from os.path import walk, splitext, exists, basename, dirname
import sys

import output
from output import *
import portage
import xpak
import string
from string import strip, find, replace, split
import commands
import shutil
import re
import time

#number of ebuilds merged
merged=0
# there can only be one action specified; the default action is to merge
# specified packages, not update.
actions=["help",
	"rebuild",
	"search",
	"update",
	"clean",
	"zap",
	"rsync"]
# emerge (prints help)
# emerge help (prints help)
# emerge help config (prints config file management help)

# emerge rsync

# the default behavior of emerge is to satisfy dependencies specified by merging packages.
# emerge system (satisfy deps for "system" package class)
# emerge world (equivalent to emerge system since "world" doesn't offer any new deps)
# emerge <depstring> (satisfy dep by merging most recent version of app available that satisfies dep)
# NOTE: this will cause something to be merged again if the dep happens to be already satisfied
# "unslotted" is invalid for a package class here because it only applies to already-installed ebuilds.
# pkgclass support: "system", "world", <depstring>, <pkgname>, <ebuild>, <tbz2>

# no changes here except we use "update" rather than "--update"
# emerge update <pkgclass/depstring/pkgname>
# emerge update (defaults to "world")
# "emerge update <ebuild/tbz2> doesn't make too much sense.  
# But it should do the same thing are "emerge <ebuild/tbz2>".

# rebuild is like "update" except that all packages will be rebuilt even if they currently are installed.
# emerge rebuild (defaults to "world")
# emerge rebuild <pkgclass/depstring/pkgname/ebuild>
# "emerge rebuild <ebuild/tbz2> doesn't make too much sense.  
# But it should do the same thing are "emerge <ebuild/tbz2>".

# emerge search (invalid)
# emerge search <regex>

# clean does "cleaning" only; it does not do anything that would generally be considered dangerous
# emerge clean (defaults to "world"; apply default AUTOCLEAN behavior defined in make.conf)
# emerge --rev clean (defaults to "world", cleans out old revisions)
# emerge --slot clean (defaults to "world", cleans out old stuff from slots)
# emerge [--rev/--slot] clean <pkgclass>
# AUTOCLEAN var can be set to "slot", "rev", or "none/off/etc".

# zap flat out removes stuff.  No holds barred.  Can be dangerous.
# emerge zap <pkgclass> (only "unslotted" is valid, which is still dangerous.  Or a dep "=foo/bar")
# NOTE: of course, "emerge zap" alone is invalid and will *not* default to a "world" package class

pkgclass=["world","system","unslotted"]
helpclass=["config"]

# These next options are the only long options for Portage 1.8.9 except for "--help" (equiv. to "help")

options=["--autoclean",
	"--buildpkg",
	"--debug",
	"--fetchonly",
	"--noreplace",
	"--onlydeps",
	"--pretend",
	"--usepkg",
	"--verbose",
	"--emptytree",
	"--rev",
	"--slot",
	"--help"]

# Here are the currently supported short mappings.

shortmapping={"a":"--autoclean",
	"b":"--buildpkg",
	"d":"--debug",
	"f":"--fetchonly",
	"h":"--help",
	"k":"--usepkg",
	"n":"--noreplace",
	"o":"--onlydeps",
	"p":"--pretend",
	"v":"--verbose" }

# end of spec

myaction=None
myopts=[]
mymode=[]
myfiles=[]
edebug=0

# process short actions and options
for x in sys.argv[1:]:
	if x[0:1]=="-"and not x[1:2]=="-":
		for y in x[1:]:
			if shortmapping.has_key(y):
				sys.argv.append(shortmapping[y])
			else:
				print y
				print "!!! Error: -"+y+" is an invalid short action or option."
		sys.argv.remove(x)

# process the command arguments
for x in sys.argv[1:]:
	if x=="update" or x=="--unmerge" or x=="--world":
		print
		if x=="update":
			print " "+red("* WARNING:"),green("emerge update"),"has been deprecated, use",green("emerge --update"),"instead."
		elif x=="--unmerge":
			print " "+red("* WARNING:"),green("emerge --unmerge"),"has been deprecated, use",green("emerge --zap"),"instead."
		elif x=="--world":
			print " "+red("* WARNING:"),green("emerge --world"),"has been deprecated, use",green("emerge world"),"instead."
		print " "+red("*"),"Read",green("emerge --help"),"to get a complete overview of the interface changes."
		print
		sys.exit(1)

	if len(x)>=2:
		if x[0:1]=="-":
			if x[1:2]=="-":
				if x in actions:
					if myaction:
						print "!!! Error: more than one action specified on command-line."
						print "!!! Available actions:",actions
						sys.exit(1)
					else:
						myaction=x
				elif x in options:
					myopts.append(x)
				else:
					print "!!! Error:",x,"is an invalid action or option."
					sys.exit(1)
			else:
				for y in x[1:]:
					if shortmapping.has_key(y):
						myopts.append(shortmapping[y])
					else:
						print y
						print "!!! Error: -"+y+" is an invalid short action or option."
		elif x in modes:
			if len(mymode)>=1:
				print "!!! Error: more than one mode specified on command-line."
				print "!!! Available modes:",modes
				sys.exit(1)
			else:
				mymode.append(x)
		else:	
				# this little conditional helps tab completion
				if x[-1]=="/":
					myfiles.append(x[:-1])
				else:
					myfiles.append(x)

# check if root user is the current user for the actions where emerge needs this
if os.getuid()!=0 and "--help"!=myaction and "--search"!=myaction:
	print "!!! to be able to perform the requested action, emerge must be run by root."
	sys.exit(1)

# search functionality
class search:
	
	#
	# class constants
	#
	VERSION_SHORT=1
	VERSION_RELEASE=2
	
	#
	# public interface
	#
	def __init__(self,searchkey=""):
		"""Searches the available and installed packages for the supplied search key.
		The list of available and installed packages is created at object instantiation.
		This makes successive searches faster."""
		self.searchkey = searchkey
		self.treecache = portage.portagetree()
		self.treecache.populate()
		self.installcache = portage.vartree()
		self.installcache.populate()
		self.re_portagedir = re.compile('/usr/portage/')
		self.re_description = re.compile('DESCRIPTION="')
		self.initResults()
		
	def setKey(self,searchkey):
		"""changes the search key"""
		self.searchkey = searchkey
		self.initResults()
	
	def execute(self):
		"""Performs the saerch for the supplied search key"""
		if self.searchkey:
			self.initResults()
			for package in self.treecache.getallnodes():
				package_parts=package.split("/")
				if package_parts:
					if self.searchkey != "*":
						if re.search(self.searchkey.lower(), package_parts[1].lower()):
							self.packagematches.append(package)
					else:
						self.packagematches.append(package)

	def output(self):
		"""Outputs the results of the search."""
		print "[ Results for search key : "+white(self.searchkey)+" ]"
		print "[ Applications found : "+white(str(len(self.packagematches)))+" ]"
		print " "
		for match in self.packagematches:
			full_package = strip(self.treecache.dep_bestmatch(match))
			if len(full_package) > 1:
				print green("*")+"  "+white(match)
				print "     ", "Latest version Available:",self.getVersion(full_package, search.VERSION_RELEASE)
				print "     ", self.getInstallationStatus(match)
				print "     ", "Description:",self.getDescription(self.getFullPath(match, full_package),self.getVersion(full_package, search.VERSION_SHORT))
				print " "
			else:
				print green("*")+"  "+white(match)+" "+red("[ Masked ]")
				print " "
		
	#
	# private interface
	#
	def initResults(self):
		self.packagematches = []
	
	def getInstallationStatus(self,package):
		installed_package = self.installcache.dep_bestmatch(package)
		result = ""
		version = self.getVersion(installed_package,search.VERSION_RELEASE)
		if len(version) > 1:
			result = "Latest version Installed: "+version
		else:
			result = "Latest version Installed: [ Not Installed ]"
		return result

	def getDescription(self,ebuildPath,packageVersion): ## Gets description from latest ebuild ##
		file = open(ebuildPath)
		result = "";
		indescription=0
		while 1:
			data = file.readline()
			if data:
				if self.re_description.match(data.upper()):
					indescription=1
					p = self.re_description.split(data)
					p = p[1].split('"')
					result = p[0].strip()
					if len(p)>1:
						break
				elif indescription==1:
					if '"' in data:
						p = data.split('"')
						result = result+" "+p[0].strip()
						indescription = 0
					else:
						result = result+" "+data.strip()
			else:
				break;
		result = replace(result, "${PV}", packageVersion)
		result = replace(result, "${pv}", packageVersion)
		result = replace(result, "${description}", "KDE "  + packageVersion + " ")
		result = replace(result, "\n", "")
		file.close()
		# format and wrap the description text nicely
		wraplength=60
		formatted_result=""
		while len(result)>wraplength:
			lineposition=0
			position=wraplength
			while result[lineposition+position]!=' ' and position != 0:
				position = position-1
			if position==0:
				position=wraplength
			if len(formatted_result)==0:
				formatted_result=result[:position]
			else:
				formatted_result=formatted_result+"\n      "+result[:position]
			result=result[position+1:]
			if wraplength==60:
				wraplength=73
		formatted_result=formatted_result+"\n      "+result
		return formatted_result

	def getFullPath(self,packageShortName,packageFullName):  ## Returns the full path of the ebuild ##
		absolute_path = '/usr/portage/' + strip(packageShortName)
		package_parts = packageFullName.split("/")
		result = absolute_path + "/" + package_parts[1] + ".ebuild"
		return result

	def getVersion(self,full_package,detail):
		if len(full_package) > 1:
			package_parts = portage.catpkgsplit(full_package)
			if detail == search.VERSION_RELEASE and package_parts[3] != 'r0':
				result = package_parts[2]+ "-" + package_parts[3]
			else:
				result = package_parts[2]
		else:
			result = ""
		return result

#build our package digraph
def getsyslist():
	if os.path.exists(portage.profiledir+"/packages"):
		pfile=portage.profiledir+"/packages"
	else:
		print "!!! Couldn't find",portage.profiledir+"/packages;"
		print "\"system\" mode unavailable."
		sys.exit(1)
	myfile=open(pfile,"r")
	mylines=myfile.readlines()
	myfile.close()
	
	mynewlines=[]
	for x in mylines:
		myline=string.join(string.split(x))
		if not len(myline):
			continue
		elif myline[0]=="#":
			continue
		elif myline[0]!="*":
			continue
		myline=myline[1:]
		mynewlines.append(myline.strip())

	return mynewlines

class depgraph:

	def __init__(self,mymode,myaction,myopts):
		self.mymode=mymode
		self.myaction=myaction
		self.myopts=myopts
		virts=portage.getvirtuals("/")
		self.db={}
		self.db["/"]={"virtuals":virts,"vartree":portage.vartree("/",virts),"porttree":portage.portagetree("/",virts),"bintree":portage.binarytree("/",virts)}
		if portage.root!="/":
			pr=portage.root
			virts=portage.getvirtuals(pr)
			self.db[pr]={"virtuals":virts,"vartree":portage.vartree(pr,virts),"porttree":portage.portagetree(pr,virts),"bintree":portage.binarytree(pr,virts)}
		self.digraph=portage.digraph()
		self.orderedkeys=[]
		#the following is so we have an empty vartree (used in emerge update calculations)
		self.emptytree=portage.vartree("/",virts,self.db["/"]["vartree"])
		self.emptytree.tree={}
		if "--emptytree" in myopts:
			print "Running in empty tree mode"
			self.db["/"]["vartree"].tree=self.emptytree.tree
			self.db["/"]["vartree"].populated=1
			self.db["/"]["vartree"].inject("virtual/glibc-1.0")
		self.outdatedpackages=[]
	def create(self,mybigkey,myparent=None,addme=1):
		"""creates the actual digraph of packages to merge.  return 1 on success, 0 on failure
		mybigkey = specification of package to merge; myparent = parent package (one depending on me);
		addme = should I be added to the tree? (for the --onlydeps mode)"""
		if mybigkey==None:
			return
		sys.stdout.write(".")	
		sys.stdout.flush()
		if self.digraph.hasnode(mybigkey):
			#if we've already hit this node before, we're already recursing on the dependencies.
			#no need to recurse again.
			if addme:
				if myparent:
					self.digraph.addnode(mybigkey,myparent)
			return 1
		mytype,myroot,mykey=string.split(mybigkey)
		if "--noreplace" in self.myopts:
			if self.db[myroot]["vartree"].exists_specific(mykey):
				print "\n>>>",mykey,"already merged in",myroot+", skipping...\n"
				return 1
		if mytype=="binary":
			if not self.db[portage.root]["bintree"].exists_specific(mykey):
				print "\n\n!!!",mytype,mykey,"not found (possibly blocked by package.mask)\n"
				sys.exit(1)
			mypkgparts=portage.catpkgsplit(mykey)
			mytbz2=xpak.tbz2(self.db[portage.root]["bintree"].getname(mykey))
			edepend=["",string.join(mytbz2.getelements("RDEPEND")," "),mytbz2.getfile("SLOT",mypkgparts[2])]
		elif mytype=="ebuild":
			if not self.db[myroot]["porttree"].exists_specific(mykey):
				print "\n\n!!!",mytype,mykey,"not found (possibly blocked by package.mask)\n"
				sys.exit(1)
				mydep={}
			myebuild=self.db[myroot]["porttree"].getname(mykey)
			edepend=portage.doebuild(myebuild,"depend",myroot,1,edebug)
			if edepend==1:
				print "!!! emerge aborting."
				sys.exit(1)
		elif mytype=="blocks":
			edepend=None
			parenttype,parentroot,parentkey=string.split(myparent)
			mykeyparts=portage.catpkgsplit(mykey)
			parentkeyparts=portage.catpkgsplit(parentkey)
			# only add blocking deps that aren't from the same package that is installing
			if mykeyparts[0]!=parentkeyparts[0] or mykeyparts[1]!=parentkeyparts[1]:
				self.digraph.addnode(mybigkey,myparent)
		
		if edepend:
			mydep={}	
			if myroot=="/":
				mydep["/"]=edepend[0]+" "+edepend[1]
			else:
				mydep["/"],mydep[myroot]=edepend
			if addme:
				self.digraph.addnode(mybigkey,myparent)
			for dep in mydep.keys():
				if "--update"==self.myaction:
					mycheck=self.emptytree.depcheck(mydep[dep])
				else:
					mycheck=self.db[dep]["vartree"].depcheck(mydep[dep])
				if mycheck[0]==0:
					print "!!! depgraph.create() error: string format:",mydep
					return 0
				for x in mycheck[1]:
					mynew=self.match(x,dep,mykey)
					if not self.digraph.hasnode(mynew):
						if addme:
							if not self.create(mynew,mybigkey):
								return 0
						else:
							if not self.create(mynew,None):
								return 0
					else:
						self.digraph.addnode(mynew,mybigkey)

		return 1
	
	def altlist(self):
		mygraph=self.digraph.copy()
		dolist=["/"]
		retlist=[]
		for x in self.db.keys():
			self.db[x]["merge"]=[]
			if x not in dolist:
				dolist.append(x)
		while (not mygraph.empty()):
			mycurkey=mygraph.firstzero()
			if not mycurkey:
				print "!!! Error: circular dependencies"
				sys.exit(1)
			splitski=string.split(mycurkey)
			if "--update"==self.myaction:
				if not self.db["/"]["vartree"].exists_specific(splitski[2]):
					self.db["/"]["merge"].append(splitski)
			else:
				self.db[splitski[1]]["merge"].append(splitski)	
			mygraph.delnode(mycurkey)
		for x in dolist:
			for y in self.db[x]["merge"]:
				retlist.append(y)
		return retlist

	def syscreate(self,mylines=[]):
		for myline in mylines:	
			if "--update"==self.myaction or "--rebuild"==self.myaction:
				self.create(self.match(myline,mykey="update (likely old /var/db/pkg entry)"))
			else:
				mycheck=self.db[portage.root]["vartree"].depcheck(myline)
				if mycheck[0]==0:
					print "\n!!! Warning:",myline,"has an invalid depstring\n"
					continue
				if mycheck[1]==None:
					continue
				for x in mycheck[1]:
					self.create(self.match(myline,mykey="syscreate1"))
	
	def match(self,mydep,myroot=portage.root,mykey=None):
		# support mutual exclusive deps
		mydep2=mydep
		if mydep2[0]=="!":
			mydep2=mydep[1:]

		if self.myaction=="--rebuild":
			myeb=self.db[portage.root]["vartree"].dep_bestmatch(mydep2)
			if not self.db[portage.root]["porttree"].exists_specific(myeb):
				self.outdatedpackages.append(myeb)
				return None
		else:
			myeb=self.db[portage.root]["porttree"].dep_bestmatch(mydep2)
			if not myeb:
				if not mykey:
					print "\n!!! Warning: couldn't find match for",mydep
				else:
					print "\n!!! Warning: couldn't find match for",mydep,"in",mykey
				return None

		# handle filtering of virtual deps for the rebuild action
		if self.myaction=="--rebuild" and myeb[0:len("virtual")]=="virtual":
			return None
		
		# handle filtering of non slot packages
		if "noslot" in mymode and self.db[portage.root]["vartree"].slotted(myeb)==1:
			return None
		
		if mydep[0]=="!":
			myk="blocks "+myroot+" "+myeb
		else:
			if "--usepkg" in self.myopts:
				mypk=self.db[portage.root]["bintree"].dep_bestmatch(mydep)
				if myeb==mypk:
					myk="binary "+portage.root+" "+mypk
				else:
					myk="ebuild "+myroot+" "+myeb
			else:
				myk="ebuild "+myroot+" "+myeb

		return myk	
	
	def display(self,mylist):
		for x in mylist:
			if x[0]=="blocks":
				addl=""+red("B")+"    "
				print "["+x[0]+" "+addl+"]",red(x[2])
			else:
				if self.db[x[1]]["vartree"].exists_specific(x[2]):
					addl="  "+yellow("R")+"  "
				elif self.db[x[1]]["vartree"].exists_specific_cat(x[2]):
					addl="   "+turquoise("U")+" "
				else:
					addl=" "+green("N")+"   "
				print "["+x[0]+" "+addl+"]",x[2],"to",x[1]

	def outdated(self):
		return self.outdatedpackages
				
	def merge(self,mylist):
		returnme=0
		#check for blocking dependencies
		for x in mylist:
			if x[0]=="blocks":
				print "\n!!! Error: the "+x[2]+" package conflicts with this package and both can't be installed on the same system together."
				sys.exit(1)

		#above line used by --fetchonly
		for x in mylist:
			myroot=x[1]
			print ">>> emerge",x[2],"to",x[1]
			#the last argument in the portage.doebuild() tells doebuild to *not* do dep checking
			#(emerge is already handling that)
			y=self.db[myroot]["porttree"].getname(x[2])
			if x[0]=="ebuild":
				if "--fetchonly" in self.myopts:
					retval=portage.doebuild(y,"fetch",myroot,0,edebug)
					if retval:
						print
						print "!!! Fetch for",y,"failed, continuing..."
						print	
						returnme=1
				elif "--buildpkg" in self.myopts:
					#create pkg, then merge pkg
					retval=portage.doebuild(y,"clean",myroot,0,edebug)
					if retval:
						print "!!! emerge aborting on ",y,"."
						sys.exit(1)
					retval=portage.doebuild(y,"package",myroot,0,edebug)
					if retval:
						print "!!! emerge aborting on ",y,"."
						sys.exit(1)
					#dynamically update our database	
					self.db[portage.root]["bintree"].inject(x[2])
					mytbz2=self.db[portage.root]["bintree"].getname(x[2])
					retval=portage.pkgmerge(mytbz2,myroot)
					if retval==None:
						print "!!! emerge aborting on ",y,"."
						sys.exit(1)
				else:
					retval=portage.doebuild(y,"clean",myroot,0,edebug)
					if retval:
						print "!!! emerge aborting on ",y,"."
						sys.exit(1)
					retval=portage.doebuild(y,"merge",myroot,0,edebug)
					if retval:
						print "!!! emerge aborting on ",y,"."
						sys.exit(1)
					#dynamically update our database	
			elif x[0]=="binary":
				#merge the tbz2
				mytbz2=self.db[portage.root]["bintree"].getname(x[2])
				retval=portage.pkgmerge(mytbz2,x[1])
				if retval==None:
					print "!!! emerge aborting on ",y,"."
					sys.exit(1)
				#need to check for errors
			self.db[x[1]]["vartree"].inject(x[2])
			if "--autoclean" in self.myopts:
				retval=portage.doebuild(y,"clean",myroot,0,edebug)
				if retval:
					print "!!! emerge aborting on ",y,"."
					sys.exit(1)
		#my doing an exit this way, --fetchonly can continue to try to
		#fetch everything even if a particular download fails.
		if "--fetchonly" in self.myopts:
			if returnme:
				print "\n\n!!! Some fetch errors were encountered.  Please see above for details.\n\n"
				sys.exit(returnme)
			else:
				sys.exit(0)

def post_emerge(retval=0):
	auxpat=re.compile('^([^-]*)(-\d+)?\.info(-\d+)?(\.gz)?')	
	global myopts
	print
	if "--pretend" in myopts:
		sys.exit(retval)
	root=portage.root
	if not os.path.isdir(root+"usr/share/info"):
		print "    "+root+"usr/share/info doesn't exist, skipping info regeneration."
	elif not os.path.exists("/usr/bin/install-info"):
		print "    /usr/bin/install-info doesn't exist; skipping info regeneration."
	else:
		print " "+green("*")+" Regenerating GNU info directory index..."
		if os.path.exists(root+"usr/share/info/dir"):
			os.rename(root+"usr/share/info/dir",root+"usr/share/info/dir.old")
		icount=0
		badcount=0
		for x in os.listdir(root+"usr/share/info"):
			aux=auxpat.search(x)
			if not aux:
				continue
			auxgroups=aux.groups()	
			if not (auxgroups[1] or auxgroups[2]):
				myso=commands.getstatusoutput("/usr/bin/install-info --dir-file="+root+"usr/share/info/dir "+root+"usr/share/info/"+x)[1]
				if myso!="":
					print auxgroups	
					badcount=badcount+1
					if "--verbose" in myopts:
						print myso
				icount=icount+1
		if badcount:
			if "--verbose" not in myopts:
				print " "+yellow("*")+" Processed",icount,"info files:",badcount,"errors; type "+green("emerge --verbose")+" to view errors."
			else:
				print " "+yellow("*")+" Processed",icount,"info files;",badcount,"errors."

		else:
			print " "+green("*")+" Processed",icount,"info files."
	if portage.settings["CONFIG_PROTECT"]:
		#number of directories with some protect files in them
		procount=0
		for x in string.split(portage.settings["CONFIG_PROTECT"]):
			if os.path.isdir(x):
				a=commands.getstatusoutput("cd "+x+"; find -iname '._cfg????_*'")
				if a[0]!=0:
					print " "+red("*")+" error scanning",x
				else:
					files=string.split(a[1])
					if files:
						procount=procount+1
						print " "+yellow("* IMPORTANT:")+"",len(files),"config files in",x,"need updating."
		if procount:
			print " "+yellow("*")+" Type "+green("emerge --help config")+" to learn how to update config files."
		print
	sys.exit(retval)

# general options that should be taken into account before any action
if not portage.settings.has_key("MAINTAINER_noclean"):
	if not "--autoclean" in myopts:
		myopts.append("--autoclean")
if "--debug" in myopts:
	edebug=1

# process modes that aren't in the universal emerge interface format first
# this format is 'emerge --action --option --option [packageset]'
if "rsync" in mymode and not myaction:
	if not os.path.exists("/usr/bin/rsync"):
		print "!!! /usr/bin/rsync does not exist, so rsync support is disabled."
		sys.exit(1)
	rclean=0
	myportdir=portage.settings["PORTDIR"]
	if myportdir[-1]=="/":
		myportdir=myportdir[:-1]
	if not os.path.exists(myportdir):
		print ">>>",myportdir,"not found, creating it."
		os.makedirs(myportdir,0755)	
	if "--clean" in myopts:
		#we'll --delete files when we rsync
		rclean=1
	mycommand="/usr/bin/rsync -rlptDv --stats --progress "
	if rclean:
		mycommand=mycommand+"--delete --exclude='distfiles/*' --exclude='packages/*' "
	mycommand=mycommand+"rsync://cvs.gentoo.org/gentoo-x86-portage/* "+myportdir
	print ">>> starting rsync with cvs.gentoo.org..."
	#protect users that did not set a default umask
	os.umask(022)
	sys.exit(os.system(mycommand))	

# HELP action
elif "--help"==myaction:
	if len(mymode)==0:
		print
		print bold("Usage: ")+turquoise("emerge")+" [ "+green("action")+" ] [ "+green("options")+" ] [ "+turquoise("ebuildfile")+" | "+turquoise("tbz2file")+" | "+turquoise("dependency")+" ] ..."
		print "       "+turquoise("emerge")+" [ "+green("action")+" ] [ "+green("options")+" ] [ "+turquoise("system")+" | "+turquoise("world")+" | "+turquoise("noslot")+" ]"
		print "       "+turquoise("emerge")+" [ "+green("--clean")+" "+green("-c")+" ] "+turquoise("rsync")
		print "       "+turquoise("emerge")+" "+green("--help")+" "" "+green("-h")+" [ "+turquoise("rsync")+" | "+turquoise("system")+" | "+turquoise("world")+" | "+turquoise("noslot")+" | "+turquoise("config")+" ] "
		print
		print turquoise("Actions:")
		print "       "+green("--help")+" "+green("-h")
		print "              displays this help, an additional mode specifier provides"
		print "              detailed help about that mode instead"
		print 
		print "       "+green("--update")+" "+green("-u")
		print "              updates installed packages, this is typically used with",bold("world")
		print "              and",bold("system")
		print 
		print "       "+green("--zap")+" "+green("-z")
		print "              removes an installed package. the arguments can be in two"
		print "              different formats : /var/db/pkg/category/package-version"
		print "              or category/package."
		print
		print "       "+green("--rebuild")+" "+green("-r")
		print "              forcably rebuild installed packages, this is typically used with"
		print "              "+bold("world"),"and",bold("system")
		print
		print "       "+green("--search")+" "+green("-s")
		print "              searches for matches of the supplied string in the current local"
		print "              portage tree. The search string is a regular expression."
		print "              A few examples: "
		print "              "+bold("emerge --search \"^kde\"")
		print "                  list all packages starting with kde"
		print "              "+bold("emerge --search \"gcc$\"")
		print "                  list all packages ending with gcc"
		print "              "+bold("emerge --search \"\"")+" or"
		print "              "+bold("emerge --search \"*\"")
		print "                  list all available packages "
		print
		print turquoise("Options:")
		print "       "+green("--autoclean")+" "+green("-a")
		print "              emerge normally cleans out the package-specific temporary"
		print "              build directory before it starts the building a package.  With"
		print "              --autoclean, it will also clean the directory *after* the"
		print "              build completes.  This option is automatically enabled for"
		print "              normal users, but maintainers can use this option to enable"
		print "              autocleaning."
		print
		print "       "+green("--buildpkg")+" "+green("-b")
		print "              tell emerge to build binary packages for all ebuilds processed"
		print "              (in addition to actually merging the packages.  Useful for"
		print "              maintainers or if you administrate multiple Gentoo Linux"
		print "              systems (build once, emerge tbz2s everywhere)."
		print
		print "       "+green("--debug")+" "+green("-d")
		print "              Tell emerge to run the ebuild command in --debug mode. In this"
		print "              mode, the bash build environment will run with the -x option,"
		print "              causing it to output verbose debug information print to stdout."
		print "              --debug is great for finding bash syntax errors."
		print
		print "       "+green("--fetchonly")+" "+green("-f")
		print "              Instead of doing any package building, just perform fetches for"
		print "              all packages (main package as well as all dependencies.)"
		print
		print "       "+green("--onlydeps")+" "+green("-o")
		print "              Only merge (or pretend to merge) the dependencies of the"
		print "              specified packages, not the packages themselves."
		print
		print "       "+green("--pretend")+" "+green("-p")
		print "              instead of actually performing the merge, simply display what"
		print "              ebuilds and tbz2s *would* have been installed if --pretend"
		print "              weren't used.  Using --pretend is strongly recommended before"
		print "              installing an unfamiliar package.  In the printout, N = new,"
		print "              U = upgrading, R = replacing"
		print
		print "       "+green("--noreplace")+" "+green("-n")
		print "              Skip the packages specified on the command-line that have"
		print "              already been installed.  Without this option, any packages,"
		print "              ebuilds, or deps you specify on on the command-line *will* cause"
		print "              Portage to remerge the package, even if it is already installed."
		print "              Note that Portage will never remerge dependencies automatically."
		print
		print "       "+green("--usepkg")+" "+green("-k")
		print "              tell emerge to use binary packages (from $PKGDIR) if they are"
		print "              available, thus possibly avoiding some time-consuming compiles."
		print "              This option is useful for CD installs; you can export"
		print "              PKGDIR=/mnt/cdrom/packages and then use this option to have"
		print "              emerge \"pull\" binary packages from the CD in order to satisfy" 
		print "              dependencies."
		print
		print "       "+green("--verbose")+" "+green("-v")
		print "              Tell emerge to run in verbose mode.  Currently, this causes"
		print "              emerge to print out GNU info errors, if any."
		print 
	elif "rsync" in mymode:
		print
		print bold("Usage: ")+turquoise("emerge")+" [ "+green("--clean")+" "+green("-c")+" ] "+turquoise("rsync")
		print
		print "       \"emerge rsync\" initiates an rsync update with cvs.gentoo.org,"
		print "       updating your Portage tree (typically in /usr/portage).  This option"
		print "       will erase any changes that you have made to existing Portage files"
		print "       so be careful.  \"emerge --clean rsync\" does the same thing as \"emerge"
		print "       rsync\", but files that no longer exist on our server are removed."
		print
	elif "system" in mymode:
		print
		print bold("Usage: ")+turquoise("emerge")+" [ "+green("action")+" ] "+" [ "+green("options")+" ] "+turquoise("system")
		print
		print "       \"emerge system\" is the Portage system update command.  When run, it"
		print "       will scan the etc/make.profile/packages file and determine what"
		print "       packages need to be installed so that your system meets the minimum"
		print "       requirements of your current system profile.  Note that this doesn't"
		print "       necessarily bring your system up-to-date at all; instead, it just"
		print "       ensures that you have no missing parts.  For example, if your system"
		print "       profile specifies that you should have sys-apps/iptables installed"
		print "       and you don't, then \"emerge system\" will install it (the most"
		print "       recent version that matches the profile spec) for you.  It's always a"
		print "       good idea to do an \"emerge --pretend system\" before an \"emerge"
		print "       system\", just so you know what emerge is planning to do."
		print
	elif "world" in mymode:
		print
		print bold("Usage: ")+turquoise("emerge")+" [ "+green("action")+" ] "+" [ "+green("options")+" ] "+turquoise("world")
		print
	elif "noslot" in mymode:
		print
		print bold("Usage: ")+turquoise("emerge")+" [ "+green("action")+" ] "+" [ "+green("options")+" ] "+turquoise("noslot")
		print
	elif "config" in mymode:
		outstuff=green("Config file management support (preliminary)")+"""

Portage has a special feature called "config file protection".  The purpose of
this feature is to prevent new package installs from clobbering existig
configuration files.  By default, config file protection is turned on for /etc
and the KDE configuration dirs; more may be added in the future.

When Portage installs a file into a protected directory tree like /etc, any
existing files will not be overwritten.  If a file of the same name already
exists, Portage will change the name of the to-be- installed file from 'foo' to
'._cfg0000_foo'.  If '._cfg0000_foo' already exists, this name becomes
'._cfg0001_foo', etc.  In this way, existing files are not overwritten,
allowing the administrator to manually merge the new config files and avoid any
unexpected changes.

In addition to protecting overwritten files, Portage will not delete any files
from a protected directory when a package is unmerged.  While this may be a
little bit untidy, it does prevent potentially valuable config files from being
deleted, which is of paramount importance.

Protected directories are set using the CONFIG_PROTECT variable, normally
defined in /etc/make.globals.  Directory exceptions to the CONFIG_PROTECTed
directories can be specified using the CONFIG_PROTECT_MASK variable.  To find
files that need to be updated in /etc, type:

# find /etc -iname '._cfg????_*'

You can disable this feature by setting CONFIG_PROTECT="" in /etc/make.conf.
Then, Portage will mercilessly auto-update your config files.  Alternatively,
you can leave Config File Protection on but tell Portage that it can overwrite
files in certain specific /etc subdirectories.  For example, if you wanted
Portage to automatically update your rc scripts and your wget configuration,
but didn't want any other changes made without your explicit approval, you'd
add this to /etc/make.conf:

CONFIG_PROTECT_MASK="/etc/wget /etc/rc.d"

"""
		print outstuff

# SEARCH action
elif "--search"==myaction:
	if not myfiles:
		print
		print "No search terms provided."
		print
	else:
		searchinstance = search()
		for mysearch in myfiles:
			searchinstance.setKey(mysearch)
			searchinstance.execute()
			searchinstance.output()

# ZAP action
elif "--zap"==myaction:
	if not myfiles and not "noslot" in mymode:
		print
		print "No packages to unmerge have been provided."
		print
	else:
		full_paths={}
		full_ebuild_paths={}
		full_package_paths={}
		non_slot_packages=[]
		
		var_path=portage.root+"var/db/pkg"
		if "noslot" in mymode:
			localtree=portage.vartree(portage.root)	
			for x in localtree.getallnodes():
				if localtree.slotted(x)==0:
					mymatches=localtree.dep_match(x)
					for package in mymatches:
						myfullpaths=localtree.getebuildpaths(package)
						for full_path in myfullpaths :
							if not os.path.exists(full_path):
								print "The ebuild '"+full_path+"' couldn't be found."
								print "Your portage installation tree seems to be corrupted."
							else:
								full_package_paths[full_path]=package
		else:
			# process all arguments, verify if they can be resolved to an installed
			# ebuild file and add the absolute paths of these ebuild to a list
			for x in myfiles:
	
				# an absolute path has been given
				if (x[0]=='/'):
					path_parts=split(x, '/')
					if len(path_parts) != 6:
						print "When providing an absolute path it should be"
						print "in the following format : "+var_path+"/category/package"
						print "The path '"+x+"' doesn't respect this."
						sys.exit(1)
					elif not os.path.exists(x):
						print "The path '"+x+"' doesn't exist."
						sys.exit(1)
					elif -1 == find(x, var_path):
						print "The path '"+x+"' didn't commence with '"+var_path+"'."
						sys.exit(1)
					else:
						# check if the SLOT file is present, and get the package version
						# from the PF file in that case
						package_slot_path=strip(x)+"/SLOT"
						package_pf_path=strip(x)+"/PF"
						if os.path.exists(package_pf_path):
							package_pf_file=open(package_pf_path)
							package_pf=package_pf_file.readline().strip()
							package_pf_file.close()
						else:
							package_pf=path_parts[5]
						full_path=strip(x)+"/"+package_pf+".ebuild"
						if not os.path.exists(full_path):
							print "The ebuild '"+full_path+"' couldn't be found."
							print "Your portage installation tree seems to be corrupted."
						else:
							path_parts=split(full_path, "/")
							full_ebuild_paths[full_path]=path_parts[4]+"/"+package_pf
	
				# a category and package name have been given
				else:
					localtree=portage.vartree(portage.root)	
					mymatches=localtree.dep_match(x)
					# if no matches were found, try again by adding a '=' dep symbol if no
					# dep symbols are already present
					if not mymatches and x[0] not in ('<','>','=','~'):
						mymatches=localtree.dep_match("="+x)
	
					# only loops over the matches if they were found
					if mymatches:
						for package in mymatches:
							myfullpaths=localtree.getebuildpaths(package)
							for full_path in myfullpaths :
								if not os.path.exists(full_path):
									print "The ebuild '"+full_path+"' couldn't be found."
									print "Your portage installation tree seems to be corrupted."
								else:
									full_package_paths[full_path]=package
	
			# determine what the non slot packages are
			if len(full_package_paths) > 0:
				# determine the latest installed packages of each cat/pkg key
				full_paths_keys=full_package_paths.keys()
				# sort the ebuild paths
				full_paths_keys.sort()
				previous_package_set=None
				for full_path in full_paths_keys:
					# construct the key that will be used to determine when a new package set
					# is being processed, the package slot is taken into account for this
					package_parts=portage.pkgsplit(full_package_paths[full_path])
					slot_path=dirname(full_path)+"/SLOT"
					if not os.path.exists(slot_path):
						package_slot=package_parts[1]
						non_slot_packages.append(package_parts[0]+"-"+package_parts[1])

		full_paths=full_ebuild_paths.keys()
		full_paths.extend(full_package_paths.keys())
		
		if len(full_paths)==0:
			print "Couldn't find any matching installed packages."
			sys.exit(1)
		else:
			if "--pretend" in myopts:
				print
				print "The are the packages that I would unmerge :"
				print
			else:
				print
				print "The following packages are going to be unmerged :"
				print
			# this makes revisions come before slot versions
			# and therefor unmerges the older packages first
			full_paths.sort()
			for full_path in full_paths:
				path_parts=split(full_path, "/")
				print "    "+path_parts[4]+"/"+path_parts[5]

			if len(non_slot_packages)>0:
				print
				if "--verbose" not in myopts:
					print " "+yellow("* IMPORTANT:"),len(non_slot_packages),"non slot packages; use "+green("--verbose")+" to view details."
				else:
					print " "+yellow("* IMPORTANT:"),len(non_slot_packages),"non slot packages"
					print " "+yellow("*")+" These packages have been merged with an old version of portage that didn't"
					print " "+yellow("*")+" support binary compatibility slots. This means that each package with a"
					print " "+yellow("*")+" different version number will be considered different and only older versions"
					print " "+yellow("*")+" of different releases will be unmerged automatically."
					print " "+yellow("*")+" To get rid of all non slot packages, you can rebuild your system with"
					print " "+yellow("*")+" "+green("emerge --noslot rebuild")+"."
					print
					for non_slot_package in non_slot_packages:
						print "    "+non_slot_package
			
			if "--pretend" in myopts:
				print
			else:
				secs=string.atoi(portage.settings["UNMERGE_DELAY"])
				if secs > 0:
					print
					print "Waiting",secs,"seconds to make sure that you want these"
					print "packages to be removed ..."
					while secs > 0:
						sys.stdout.write(str(secs)+" ")	
						sys.stdout.flush()
						time.sleep(1)
						secs = secs-1
					print secs
				for full_path in full_paths:
					print "Unmerging "+os.path.basename(full_path)+" ..."
					retval=portage.doebuild(full_path,"unmerge",portage.root,0,edebug)
	post_emerge()

# REBUILD action
elif "--rebuild"==myaction:
	if not "system" in mymode and not "world" in mymode and not "noslot" in mymode:
		print
		print " "+red("* WARNING:"),green("emerge --rebuild"),"shouldn't be used for regular packages"
		print " "+red("*"),"it's only intended to be used with",green("system")+", "+green("world")+", and",green("noroot")
		print
	else:
		if "--pretend" in myopts:
				print
				print "These are the packages that I would rebuild, in order."
				print
	
		if "system" in mymode:
			mydepgraph=depgraph(mymode,myaction,myopts)
			print "Calculating system dependencies",
			mydepgraph.syscreate(getsyslist())
			print " done!"
		elif "world" in mymode or "noslot" in mymode:
			mydepgraph=depgraph(mymode,myaction,myopts)
			print "Calculating world dependencies",
			mydepgraph.syscreate(mydepgraph.db["/"]["vartree"].getallnodes())
			print " done!"

		if "--pretend" in myopts:
			mydepgraph.display(mydepgraph.altlist())
			
			myoutdated=mydepgraph.outdated()
			if len(myoutdated):
				if "--verbose" not in myopts:
					print
					print " "+yellow("* IMPORTANT:"),len(myoutdated),"packages aren't available anymore; use "+green("--verbose")+" for details."
				else:
					print
					print " "+yellow("* IMPORTANT:"),len(myoutdated),"packages aren't available anymore"
					print " "+yellow("*")+" Your portage tree doesn't contain the ebuilds anymore that correspond to the"
					print " "+yellow("*")+" following packages. This means that portage is unable to rebuild them."
					print " "+yellow("*")+" Instead you should upgrade to the latest versions or install possible"
					print " "+yellow("*")+" alternative packages that provide the same functionalities."
					myoutdated.sort()
					for mypackage in myoutdated:
						print "    "+mypackage
		else:
			mydepgraph.merge(mydepgraph.altlist())
		post_emerge()

# INSTALL and UPDATE action
elif "--update"==myaction or not myaction:
	if not myaction and "world" in mymode:
		print
		print " "+red("* WARNING:"),green("emerge world"),"can't be used without an action"
		print " "+red("*"),green("world"),"is only intended to be used with",green("emerge --update")
		print
	else:
		if "--pretend" in myopts:
				print
				print "These are the packages that I would merge, in order."
				print

		if "system" in mymode:
			mydepgraph=depgraph(mymode,myaction,myopts)
			print "Calculating system dependencies",
			mydepgraph.syscreate(getsyslist())
			print " done!"
		elif "world" in mymode:
			mydepgraph=depgraph(mymode,myaction,myopts)
			print "Calculating world dependencies",
			mydepgraph.syscreate(mydepgraph.db["/"]["vartree"].getallnodes())
			print " done!"
		elif "noslot" in mymode:
			mydepgraph=depgraph(mymode,myaction,myopts)
			print "Calculating noslot dependencies",
			mydepgraph.syscreate(mydepgraph.db["/"]["vartree"].getallnodes())
			print " done!"
		else:
			mydepgraph=depgraph(mymode,myaction,myopts)
			if not myfiles:
				post_emerge()
				#we don't have any files to process; skip this step and exit
			print "Calculating dependencies",
			for mypkg in myfiles:
				if mypkg[-5:]==".tbz2":
					mytype="binary"
					mytbz2=xpak.tbz2(mypkg)
					mykey=mytbz2.getelements("CATEGORY")[0]+"/"+os.path.basename(mypkg)[:-5]
				elif mypkg[-7:]==".ebuild":
					mytype="ebuild"
					mykey=os.path.basename(os.path.abspath(mypkg+"/../.."))+"/"+os.path.basename(mypkg)[:-7]
				else:
					mykey=""
					if "--usepkg" in myopts:
						mykey=mydepgraph.db[portage.root]["bintree"].dep_bestmatch(mypkg)
						mytype="binary"
					if not mykey:
						mykey=mydepgraph.db[portage.root]["porttree"].dep_bestmatch(mypkg)
						mytype="ebuild"
						if not mykey:
							print "!!! Couldn't find match for",mypkg+"; aborting."
							sys.exit(1)
			#	else:
			#		print "!!! Error:",x,"is neither an ebuild nor a .tbz2 package."
			#		sys.exit(1)
				mydepgraph.create(mytype+" "+portage.root+" "+mykey,None,"--onlydeps" not in myopts)
			print " done!"

		if "--pretend" in myopts:
			mydepgraph.display(mydepgraph.altlist())
		else:
			mydepgraph.merge(mydepgraph.altlist())
		post_emerge()

