this stuff was supposed to be dead for ages
authorMarius Mauch <genone@gentoo.org>
Sun, 19 Feb 2006 05:42:25 +0000 (05:42 -0000)
committerMarius Mauch <genone@gentoo.org>
Sun, 19 Feb 2006 05:42:25 +0000 (05:42 -0000)
svn path=/main/trunk/; revision=2744

spec/emerge.syntax [deleted file]

diff --git a/spec/emerge.syntax b/spec/emerge.syntax
deleted file mode 100755 (executable)
index 17b8131..0000000
+++ /dev/null
@@ -1,1149 +0,0 @@
-#!/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()
-