this file should've been killed long ago.
authorBrian Harring <ferringb@gentoo.org>
Tue, 30 Aug 2005 05:24:38 +0000 (05:24 -0000)
committerBrian Harring <ferringb@gentoo.org>
Tue, 30 Aug 2005 05:24:38 +0000 (05:24 -0000)
svn path=/main/branches/2.0/; revision=1952

bin/emerge.orig [deleted file]

diff --git a/bin/emerge.orig b/bin/emerge.orig
deleted file mode 100755 (executable)
index 90e559e..0000000
+++ /dev/null
@@ -1,3227 +0,0 @@
-#!/usr/bin/python -O
-# Copyright 1999-2004 Gentoo Foundation
-# Distributed under the terms of the GNU General Public License v2
-# $Id: /var/cvsroot/gentoo-src/portage/bin/emerge,v 1.345.2.33 2005/06/02 00:57:52 vapier Exp $
-
-import os,sys
-os.environ["PORTAGE_CALLER"]="emerge"
-sys.path = ["/usr/lib/portage/pym"]+sys.path
-
-import portage
-
-import emergehelp,xpak,string,re,commands,time,shutil,traceback,atexit,signal,socket,types
-from stat import *
-from output import *
-
-import portage_util
-import portage_locks
-import portage_exception
-
-
-spinner_msgs = ["Gentoo Rocks ("+os.uname()[0]+")",
-                "Thank you for using Gentoo. :)",
-                "Are you actually trying to read this?",
-                "How many times have you stared at this?",
-                "We are generating the cache right now",
-                "You are paying too much attention.",
-                "A theory is better than its explanation.",
-                "Phasers locked on target, Captain.",
-                "Thrashing is just virtual crashing.",
-                "To be is to program.",
-                "Real Users hate Real Programmers.",
-                "When all else fails, read the instructions.",
-                "Functionality breeds Contempt.",
-                "The future lies ahead.",
-                "3.1415926535897932384626433832795028841971694",
-                "Sometimes insanity is the only alternative.",
-                "Inaccuracy saves a world of explanation.",
-               ]
-
-
-def update_basic_spinner():
-       global spinner, spinpos
-       spinpos = (spinpos+1) % 500
-       if (spinpos % 100) == 0:
-               if spinpos == 0:
-                       sys.stdout.write(". ")
-               else:
-                       sys.stdout.write(".")
-       sys.stdout.flush()
-
-def update_scroll_spinner():
-       global spinner, spinpos
-       if(spinpos >= len(spinner)):
-               sys.stdout.write(darkgreen(" \b\b\b"+spinner[len(spinner)-1-(spinpos%len(spinner))]))
-       else:
-               sys.stdout.write(green("\b "+spinner[spinpos]))
-       sys.stdout.flush()
-       spinpos = (spinpos+1) % (2*len(spinner))
-
-def update_twirl_spinner():
-       global spinner, spinpos
-       spinpos = (spinpos+1) % len(spinner)
-       sys.stdout.write("\b\b "+spinner[spinpos])
-       sys.stdout.flush()
-
-spinpos = 0
-spinner = "/-\\|/-\\|/-\\|/-\\|\\-/|\\-/|\\-/|\\-/|"
-update_spinner = update_twirl_spinner
-if "candy" in portage.settings.features:
-       spinner = spinner_msgs[int(time.time()*100)%len(spinner_msgs)]
-       update_spinner = update_scroll_spinner
-if not sys.stdout.isatty() or ("--nospinner" in sys.argv):
-       update_spinner = update_basic_spinner
-
-
-if (not sys.stdout.isatty()) or (portage.settings["NOCOLOR"] in ["yes","true"]):
-       nocolor()
-
-def normpath(mystr):
-       if mystr and (mystr[0]=='/'):
-               return os.path.normpath("///"+mystr)
-       else:
-               return os.path.normpath(mystr)
-
-def userquery(prompt, responses=None, colours=None):
-       """Displays a prompt and a set of responses, then waits for a response
-       which is checked against the responses and the first to match is
-       returned.
-
-       prompt: a String.
-       responses: a List of Strings.
-       colours: a List of Functions taking and returning a String, used to
-       process the responses for display. Typically these will be functions
-       like red() but could be e.g. lambda x: "DisplayString".
-       If responses is omitted, defaults to ["Yes, "No"], [green, red].
-       If only colours is omitted, defaults to [bold, ...].
-
-       Returns a member of the List responses. (If called without optional
-       arguments, returns "Yes" or "No".)
-       KeyboardInterrupt is converted to SystemExit to avoid tracebacks being
-       printed."""
-       if responses is None:
-               responses, colours = ["Yes", "No"], [green, red]
-       elif colours is None:
-               colours=[bold]
-       colours=(colours*len(responses))[:len(responses)]
-       print bold(prompt),
-       try:
-               while True:
-                       response=raw_input("["+string.join([colours[i](responses[i]) for i in range(len(responses))],"/")+"] ")
-                       for key in responses:
-                               if response.upper()==key[:len(response)].upper():
-                                       return key
-                       print "Sorry, response '%s' not understood." % response,
-       except (EOFError, KeyboardInterrupt):
-               print "Interrupted."
-               sys.exit(1)
-
-def sorted_versions(verlist):
-       ret = []
-       for ver in verlist:
-               verparts = ver.split("-")
-               if len(verparts) == 2:
-                       verrev = int(verparts[1][1:])
-               else:
-                       verrev = 0
-               x = 0
-               while x < len(ret):
-                       retparts = ret[x].split("-")
-                       verdiff = portage.vercmp(retparts[0], verparts[0])
-                       if verdiff > 0:
-                               break
-                       elif verdiff == 0:
-                               if len(retparts) == 2:
-                                       retrev = int(retparts[1][1:])
-                               else:
-                                       retrev = 0
-                               if retrev >= verrev:
-                                       break
-                       x += 1
-               ret.insert(x, ver)
-       return ret
-
-if portage.settings.has_key("PORTAGE_NICENESS"):
-       try:
-               os.nice(int(portage.settings["PORTAGE_NICENESS"]))
-       except SystemExit, e:
-               raise # Needed else can't exit
-       except Exception,e:
-               print "!!! Failed to change nice value to '"+str(portage.settings["PORTAGE_NICENESS"])+"'"
-               print "!!!",e
-
-#Freeze the portdbapi for enhanced performance:
-portage.portdb.freeze()
-
-# Kill noauto as it will break merges otherwise.
-while 'noauto' in portage.features:
-       del portage.features[portage.features.index('noauto')]
-
-#number of ebuilds merged
-merged=0
-params=["selective", "deep", "self", "recurse", "empty"]
-actions=[
-"clean", "config", "depclean",
-"info",   "inject",   "metadata",
-"prune", "regen",  "rsync", "search",
-"sync",  "system", "unmerge",  "world",
-]
-options=[
-"--ask",
-"--buildpkg",     "--buildpkgonly",
-"--changelog",    "--columns",
-"--debug",        "--deep",
-"--digest",
-"--emptytree",
-"--fetchonly",    "--fetch-all-uri",
-"--getbinpkg",    "--getbinpkgonly",
-"--help",         "--noconfmem",
-"--newuse",       "--nocolor",
-"--nodeps",       "--noreplace",
-"--nospinner",    "--oneshot",
-"--onlydeps",     "--pretend",
-"--quiet",        "--resume",
-"--searchdesc",   "--selective",
-"--skipfirst",
-"--tree",
-"--update",       "--upgradeonly",
-"--usepkg",       "--usepkgonly",
-"--verbose",      "--version"
-]
-
-shortmapping={
-"1":"--oneshot",
-"a":"--ask",
-"b":"--buildpkg",  "B":"--buildpkgonly",
-"c":"--clean",     "C":"--unmerge",
-"d":"--debug",     "D":"--deep",
-"e":"--emptytree",
-"f":"--fetchonly", "F":"--fetch-all-uri",
-"g":"--getbinpkg", "G":"--getbinpkgonly",
-"h":"--help",
-"i":"--inject",
-"k":"--usepkg",    "K":"--usepkgonly",
-"l":"--changelog",
-"n":"--noreplace", "N":"--newuse",
-"o":"--onlydeps",  "O":"--nodeps",
-"p":"--pretend",   "P":"--prune",
-"q":"--quiet",
-"s":"--search",    "S":"--searchdesc",
-'t':"--tree",
-"u":"--update",    "U":"--upgradeonly",
-"v":"--verbose",   "V":"--version"
-}
-
-myaction=None
-myopts=[]
-myfiles=[]
-edebug=0
-
-# process short actions
-tmpcmdline=sys.argv[1:]
-#tmpcmdline.extend(portage.settings["EMERGE_OPTS"].split())
-cmdline=[]
-for x in tmpcmdline:
-       if x[0:1]=="-"and x[1:2]!="-":
-               for y in x[1:]:
-                       if shortmapping.has_key(y):
-                               if shortmapping[y] in cmdline:
-                                       print
-                                       print "*** Warning: Redundant use of",shortmapping[y]
-                               else:
-                                       cmdline.append(shortmapping[y])
-                       else:
-                               print "!!! Error: -"+y+" is an invalid short action or option."
-                               sys.exit(1)
-       else:
-               cmdline.append(x)
-
-# process the options and command arguments
-for x in cmdline:
-       if not x:
-               continue
-       if len(x)>=2 and x[0:2]=="--":
-               if x in options:
-                       myopts.append(x)
-               elif x[2:] in actions:
-                       if x[2:]=="rsync" or x=="rsync":
-                               # "emerge --rsync"
-                               print
-                               print red("*** '--rsync' has been deprecated.")
-                               print red("*** Please use '--sync' instead.")
-                               print
-                               x="--sync"
-                       if myaction:
-                               if myaction not in ["system", "world"]:
-                                       myaction="--"+myaction
-                               print
-                               print red("!!!")+green(" Multiple actions requested... Please choose one only.")
-                               print red("!!!")+" '"+darkgreen(myaction)+"' "+red("or")+" '"+darkgreen(x)+"'"
-                               print
-                               sys.exit(1)
-                       myaction=x[2:]
-               else:
-                       print "!!! Error:",x,"is an invalid option."
-                       sys.exit(1)
-       elif (not myaction) and (x in actions):
-               if x not in ["system", "world"]:
-                       #print red("*** Deprecated use of action '"+x+"'")
-                       if x=="rsync":
-                               # "emerge rsync"
-                               print
-                               print red("*** 'rsync' will now install the package rsync.")
-                               print red("*** To sync the tree, please use '--sync' instead.")
-                               print
-                               myfiles.append(x)
-                               continue
-               if myaction:
-                       print
-                       print red("!!!")+green(" Multiple actions requested... Please choose one only.")
-                       print red("!!! '")+darkgreen(myaction)+"' "+red("or")+" '"+darkgreen(x)+"'"
-                       print
-                       sys.exit(1)
-               myaction=x
-       elif x[-1]=="/":
-               # this little conditional helps tab completion
-               myfiles.append(x[:-1])
-       else:
-               myfiles.append(x)
-
-
-if "moo" in myfiles:
-       print """
-
-  Gentoo (""" + os.uname()[0] + """)
-
- _______________________
-< Have you mooed today? >
- -----------------------
-        \   ^__^
-         \  (oo)\_______
-            (__)\       )\/\ 
-                ||----w |
-                ||     ||
-
-"""
-
-if (myaction in ["world", "system"]) and myfiles:
-       print "emerge: please specify a package class (\"world\" or \"system\") or individual packages, but not both."
-       sys.exit(1)
-
-for x in myfiles:
-       if (x[-7:] == ".ebuild" or x[-5:] == ".tbz2") and os.path.exists(os.path.abspath(x)):
-               print "emerging by path implies --oneshot... adding --oneshot to options."
-               print red("\n*** emerging by path is broken and may not always work!!!\n")
-               break
-
-if ("--tree" in myopts) and ("--columns" in myopts):
-       print "emerge: can't specify both of \"--tree\" and \"--columns\"."
-       sys.exit(1)
-
-# Always create packages if FEATURES=buildpkg
-# Imply --buildpkg if --buildpkgonly
-if ("buildpkg" in portage.features) or ("--buildpkgonly" in myopts):
-       if "--buildpkg" not in myopts:
-               myopts.append("--buildpkg")
-
-# --tree only makes sense with --pretend
-if "--tree" in myopts and not (("--pretend" in myopts) or ("--ask" in myopts)):
-       print ">>> --tree implies --pretend... adding --pretend to options."
-       myopts.append("--pretend")
-
-# Also allow -S to invoke search action (-sS)
-if ("--searchdesc" in myopts):
-       if myaction and myaction != "search":
-               myfiles.append(myaction)
-       if "--search" not in myopts:
-               myopts.append("--search")
-       myaction = "search"
-
-# Always try and fetch binary packages if FEATURES=getbinpkg
-if ("getbinpkg" in portage.features):
-       myopts.append("--getbinpkg")
-
-if ("--getbinpkgonly" in myopts) and not ("--usepkgonly" in myopts):
-       myopts.append("--usepkgonly")
-
-if ("--getbinpkgonly" in myopts) and not ("--getbinpkg" in myopts):
-       myopts.append("--getbinpkg")
-
-if ("--getbinpkg" in myopts) and not ("--usepkg" in myopts):
-       myopts.append("--usepkg")
-
-# Also allow -K to apply --usepkg/-k
-if ("--usepkgonly" in myopts) and not ("--usepkg" in myopts):
-       myopts.append("--usepkg")
-
-# Print deprecation warning for -U
-if ("--upgradeonly" in myopts):
-       print
-       print red("*** Warning: --upgradeonly is a deprecated option in portage-"+portage.VERSION)
-       print red("***          and will likely be removed in a future version.")
-       print
-       # Also allow -U to apply --update/-u
-       if not ("--update" in myopts):
-               print ">>> --upgradeonly implies --update... adding --update to options."
-               myopts.append("--update")
-
-# Also allow -l to apply --pretend/-p, but if already in --ask mode
-if ("--changelog" in myopts) and not (("--pretend" in myopts) or ("--ask" in myopts)):
-       print ">>> --changelog implies --pretend... adding --pretend to options."
-       myopts.append("--pretend")
-
-# Allow -p to remove --ask
-if ("--pretend" in myopts) and ("--ask" in myopts):
-       print ">>> --pretend disables --ask... removing --ask from options."
-       myopts.remove("--ask")
-
-# forbid --ask when not in a terminal
-# note: this breaks `emerge --ask | tee logfile`, but that doesn't work anyway.
-if ("--ask" in myopts) and (not sys.stdin.isatty()):
-       portage.writemsg("!!! \"--ask\" should only be used in a terminal. Exiting.\n")
-       sys.exit(1)
-
-# Set so that configs will be merged regardless of remembered status
-if ("--noconfmem" in myopts):
-       portage.settings.unlock()
-       portage.settings["NOCONFMEM"]="1"
-       portage.settings.backup_changes("NOCONFMEM")
-       portage.settings.lock()
-
-# Set various debug markers... They should be merged somehow.
-if ("--debug" in myopts):
-       portage.settings.unlock()
-       portage.settings["PORTAGE_DEBUG"]="1"
-       portage.settings.backup_changes("PORTAGE_DEBUG")
-       portage.debug=1
-       portage.settings.lock()
-
-if ("--resume" in myopts):
-       if "--verbose" in myopts:
-               print "* --verbose is currently broken with --resume. Disabling..."
-               myopts.remove("--verbose")
-       if "--tree" in myopts:
-               print "* --tree is currently broken with --resume. Disabling..."
-               myopts.remove("--tree")
-
-# Set color output
-if ("--nocolor" in myopts) and (sys.stdout.isatty()):
-       nocolor()
-
-CLEAN_DELAY = 5
-EMERGE_WARNING_DELAY = 10
-if portage.settings["CLEAN_DELAY"]:
-       CLEAN_DELAY = string.atoi("0"+portage.settings["CLEAN_DELAY"])
-if portage.settings["EMERGE_WARNING_DELAY"]:
-       EMERGE_WARNING_DELAY = string.atoi("0"+portage.settings["EMERGE_WARNING_DELAY"])
-
-if "inject" == myaction:
-       print
-       print red("*** --inject has been deprecated.")
-       print red("*** If you manage a piece of software yourself, add it's name and")
-       print red("*** version (eg foo/bar-1.0) to /etc/portage/profile/package.provided.")
-       print red("*** If you want to prevent portage from upgrading a package, add it to")
-       print red("*** /etc/portage/package.mask prepending it with '>' (eg >foo/bar-1.0)")
-       print red("*** For more information on fine-grained portage control, please see")
-       print red("*** the portage man page.")
-       print
-
-def emergelog(mystr,short_msg=None):
-       if "notitles" not in portage.features:
-               if short_msg:
-                       xtermTitle(short_msg)
-               else:
-                       xtermTitle(mystr)
-       try:
-               #seems odd opening a file each write...
-               if not os.path.exists("/var/log/emerge.log"):
-                       mylogfile=open("/var/log/emerge.log", "w")
-                       os.chmod("/var/log/emerge.log", S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP)
-                       os.chown("/var/log/emerge.log", portage.portage_uid, portage.portage_gid)
-               else:
-                       mylogfile=open("/var/log/emerge.log", "a")
-
-               l=portage_locks.lockfile(mylogfile)
-               # seek because we may have gotten held up by the lock.
-               # if so, we may not be positioned at the end of the file.
-               mylogfile.seek(0,2)
-               mylogfile.write(str(time.time())[:10]+": "+mystr+"\n")
-               mylogfile.flush()
-               portage_locks.unlockfile(l)
-               mylogfile.close()
-       except SystemExit, e:
-               raise # Needed else can't exit
-       except Exception, e:
-               if edebug:
-                       print "emergelog():",e
-               pass
-
-def emergeexit():
-       """This gets out final log message in before we quit."""
-       if "--pretend" not in myopts:
-               emergelog(" *** terminating.")
-       if "notitles" not in portage.features:
-               xtermTitleReset()
-atexit.register(emergeexit)
-
-def emergeexitsig(signum, frame):
-       signal.signal(signal.SIGINT, signal.SIG_IGN)
-       portage.portageexit()
-       portage_util.writemsg("\n\nExiting on signal %(signal)s\n" % {"signal":signum})
-       sys.exit(100+signum)
-signal.signal(signal.SIGINT, emergeexitsig)
-
-def countdown(secs=5, doing="Starting"):
-       if secs:
-               print ">>> Waiting",secs,"seconds before starting..."
-               print ">>> (Control-C to abort)...\n"+doing+" in: ",
-               ticks=range(secs)
-               ticks.reverse()
-               for sec in ticks:
-                       sys.stdout.write(red(str(sec+1)+" "))
-                       sys.stdout.flush()
-                       time.sleep(1)
-               print
-
-# formats a size given in bytes nicely
-def format_size(mysize):
-       if type(mysize) not in [types.IntType,types.LongType]:
-               return str(mysize)
-       mystr=str(mysize/1024)
-       mycount=len(mystr)
-       while (mycount > 3):
-               mycount-=3
-               mystr=mystr[:mycount]+","+mystr[mycount:]
-       return mystr+" kB"
-
-
-def getgccversion():
-       """
-       rtype: C{str}
-       return:  the current in-use gcc version
-       """
-
-       gcc_env_dir = os.path.join('/', 'etc', 'env.d', 'gcc')
-       gcc_config_config = os.path.join(gcc_env_dir, 'config')
-       gcc_ver_command = 'gcc -dumpversion'
-       gcc_ver_prefix = 'gcc-'
-
-       gcc_not_found_error = red(
-       "!!! No gcc found. You probably need to 'source /etc/profile'\n" +
-       "!!! to update the environment of this terminal and possibly\n" +
-       "!!! other terminals also."
-       )
-
-       gcc_distcc_broken_error = green(
-       '!!! Relying on the shell to locate gcc, this may break\n' +
-       '!!! DISTCC, installing gcc-config and setting your current gcc\n' +
-       '!!! profile will fix this'
-       )
-
-       def fallback():
-
-               print >>sys.stderr, gcc_distcc_broken_error
-
-               gccout = commands.getstatusoutput(gcc_ver_command)
-
-               if gccout[0] != 0:
-                       print >>sys.stderr, gcc_not_found_error
-                       gccver = "[unavailable]"
-               else:
-                       gccver = gcc_ver_prefix + gccout[1]
-
-               return gccver
-
-       if os.path.isfile(gcc_config_config):
-               try:
-                       gccver_str = open(gcc_config_config).read().strip()
-                       gccver = gcc_ver_prefix + string.join(gccver_str.split('-')[4:], '-')
-               except IndexError:
-                       gccver = fallback()
-
-       else:
-               import glob
-               dir_l = glob.glob(os.path.join(gcc_env_dir, '*-*'))
-
-               if len(dir_l) == 1:
-                       try:
-                               gccver = gcc_ver_prefix + dir_l[0].split('-')[-1]
-                       except IndexError:
-                               gccver = fallback()
-
-               else:
-                       # There was no "config" file in /etc/env.d/gcc and there was more
-                       # than one profile in /etc/env.d/gcc so we can't actively
-                       # determine what version of gcc we are using so we fall back on the
-                       # old way that breaks distcc
-
-                       gccver = fallback()
-
-       return gccver
-
-def getportageversion():
-       try:
-               import re
-               profilever = os.path.normpath("///"+os.readlink("/etc/make.profile"))
-               basepath   = os.path.normpath("///"+portage.settings["PORTDIR"]+"/profiles")
-               if re.match(basepath,profilever):
-                       profilever = profilever[len(basepath)+1:]
-               else:
-                       profilever = "!"+profilever
-               del basepath
-       except SystemExit, e:
-               raise # Needed else can't exit
-       except:
-               profilever="unavailable"
-       libcver=[]
-       libclist  = portage.vardbapi(portage.root).match("virtual/libc")
-       libclist += portage.vardbapi(portage.root).match("virtual/glibc")
-       libclist  = portage_util.unique_array(libclist)
-       for x in libclist:
-               xs=portage.catpkgsplit(x)
-               if libcver:
-                       libcver+=","+string.join(xs[1:], "-")
-               else:
-                       libcver=string.join(xs[1:], "-")
-       if libcver==[]:
-               libcver="unavailable"
-
-       gccver = getgccversion()
-       unameout=os.uname()[2]+" "+os.uname()[4]
-
-       return "Portage " + portage.VERSION +" ("+profilever+", "+gccver+", "+libcver+", "+unameout+")"
-
-def help():
-       # Move all the help stuff out of this file.
-       emergehelp.help(myaction,myopts,havecolor)
-
-# check if root user is the current user for the actions where emerge needs this
-if ("--pretend" in myopts) or ("--fetchonly" in myopts or "--fetch-all-uri" in myopts) or (myaction=="search"):
-       if not portage.secpass:
-               if portage.wheelgid==portage.portage_gid:
-                       print "emerge: wheel group membership required for \"--pretend\" and search."
-                       print "emerge: wheel group use is being deprecated. Please update group and passwd to"
-                       print "        include the portage user as noted above, and then use group portage."
-               else:
-                       print "emerge: portage group membership required for \"--pretend\" and search."
-               sys.exit(1)
-elif "--version" in myopts:
-       print getportageversion()
-       sys.exit(0)
-elif "--help" in myopts:
-       help()
-       sys.exit(0)
-elif portage.secpass!=2:
-       if myaction in ["search", "info", "regen"]:
-               pass
-       elif (not myaction) and (not myfiles):
-               pass
-       elif ("--pretend" in myopts) and (myaction in ["world","system","clean","prune","unmerge"]):
-               pass
-       else:
-               if "--debug" in myopts:
-                       print "myaction",myaction
-                       print "myopts",myopts
-               print "emerge: root access required."
-               sys.exit(1)
-
-if not "--pretend" in myopts:
-       emergelog("Started emerge on: "+time.strftime("%b %d, %Y %H:%M:%S", time.localtime()))
-       myelogstr=""
-       if myopts:
-               myelogstr=string.join(myopts, " ")
-       if myaction:
-               myelogstr+=" "+myaction
-       if myfiles:
-               myelogstr+=" "+string.join(myfiles, " ")
-       emergelog(" *** emerge "+myelogstr)
-
-#configure emerge engine parameters
-#
-# self:      include _this_ package regardless of if it is merged.
-# selective: exclude the package if it is merged
-# recurse:   go into the dependencies
-# empty:     pretend nothing is merged
-myparams=["self","recurse"]
-add=[]
-sub=[]
-if "--update" in myopts:
-       add.extend(["selective","empty"])
-if "--emptytree" in myopts:
-       add.extend(["empty"])
-       sub.extend(["selective"])
-if "--nodeps" in myopts:
-       sub.extend(["recurse"])
-if "--noreplace" in myopts:
-       add.extend(["selective"])
-if "--deep" in myopts:
-       add.extend(["deep"])
-if "--selective" in myopts:
-       add.extend(["selective"])
-if myaction in ["world","system"]:
-       add.extend(["selective"])
-elif myaction in ["depclean"]:
-       add.extend(["empty"])
-       sub.extend(["selective"])
-for x in add:
-       if (x not in myparams) and (x not in sub):
-               myparams.append(x)
-for x in sub:
-       if x in myparams:
-               myparams.remove(x)
-
-# search functionality
-class search:
-
-       #
-       # class constants
-       #
-       VERSION_SHORT=1
-       VERSION_RELEASE=2
-
-       #
-       # public interface
-       #
-       def __init__(self):
-               """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.installcache = portage.db["/"]["vartree"]
-
-       def execute(self,searchkey):
-               """Performs the search for the supplied search key"""
-               global myopts
-               match_category = 0
-               self.searchkey=searchkey
-               self.packagematches = []
-               if "--searchdesc" in myopts:
-                       self.searchdesc=1
-                       self.matches = {"pkg":[], "desc":[]}
-               else:
-                       self.searchdesc=0
-                       self.matches = {"pkg":[]}
-               print "Searching...   ",
-
-               if self.searchkey[0] == '@':
-                       match_category = 1
-                       self.searchkey = self.searchkey[1:]
-               if self.searchkey=="*":
-                       #hack for people who aren't regular expression gurus
-                       self.searchkey==".*"
-               if re.search("\+\+", self.searchkey):
-                       #hack for people who aren't regular expression gurus
-                       self.searchkey=re.sub("\+\+","\+\+",self.searchkey)
-               self.searchre=re.compile(self.searchkey.lower(),re.I)
-               for package in portage.portdb.cp_all():
-                       update_spinner()
-
-                       if match_category:
-                               match_string  = package[:]
-                       else:
-                               match_string  = package.split("/")[-1]
-
-                       masked=0
-                       if self.searchre.search(match_string):
-                               if not portage.portdb.xmatch("match-visible",package):
-                                       masked=1
-                               self.matches["pkg"].append([package,masked])
-                       elif self.searchdesc: # DESCRIPTION searching
-                               full_package = portage.portdb.xmatch("bestmatch-visible",package)
-                               if not full_package:
-                                       #no match found; we don't want to query description
-                                       full_package=portage.best(portage.portdb.xmatch("match-all",package))
-                                       if not full_package:
-                                               continue
-                                       else:
-                                               masked=1
-                               try:
-                                       full_desc = portage.portdb.aux_get(full_package,["DESCRIPTION"])[0]
-                               except KeyError:
-                                       print "emerge: search: aux_get() failed, skipping"
-                                       continue
-                               if self.searchre.search(full_desc):
-                                       self.matches["desc"].append([full_package,masked])
-               self.mlen=0
-               for mtype in self.matches.keys():
-                       self.matches[mtype].sort()
-                       self.mlen += len(self.matches[mtype])
-
-       def output(self):
-               """Outputs the results of the search."""
-               print "\b\b  \n[ Results for search key : "+white(self.searchkey)+" ]"
-               print "[ Applications found : "+white(str(self.mlen))+" ]"
-               print " "
-               for mtype in self.matches.keys():
-                       for match,masked in self.matches[mtype]:
-                               if mtype=="pkg":
-                                       catpack=match
-                                       full_package = portage.portdb.xmatch("bestmatch-visible",match)
-                                       if not full_package:
-                                               #no match found; we don't want to query description
-                                               masked=1
-                                               full_package=portage.best(portage.portdb.xmatch("match-all",match))
-                               else:
-                                       full_package = match
-                                       match        = portage.pkgsplit(match)[0]
-
-                               if full_package:
-                                       try:
-                                               desc, homepage, license = portage.portdb.aux_get(full_package,["DESCRIPTION","HOMEPAGE","LICENSE"])
-                                       except KeyError:
-                                               print "emerge: search: aux_get() failed, skipping"
-                                               continue
-                                       if masked:
-                                               print green("*")+"  "+white(match)+" "+red("[ Masked ]")
-                                       else:
-                                               print green("*")+"  "+white(match)
-                                       myversion = self.getVersion(full_package, search.VERSION_RELEASE)
-
-                                       mysum = [0,0]
-                                       mycat = match.split("/")[0]
-                                       mypkg = match.split("/")[1]
-
-                                       mydigest = portage.db["/"]["porttree"].dbapi.finddigest(mycat+"/"+mypkg + "-" + myversion)
-
-                                       try:
-                                               myfile = open(mydigest,"r")
-                                               for line in myfile.readlines():
-                                                       mysum[0] += int(line.split(" ")[3])
-                                               myfile.close()
-                                               mystr = str(mysum[0]/1024)
-                                               mycount=len(mystr)
-                                               while (mycount > 3):
-                                                       mycount-=3
-                                                       mystr=mystr[:mycount]+","+mystr[mycount:]
-                                               mysum[0]=mystr+" kB"
-                                       except SystemExit, e:
-                                               raise # Needed else can't exit
-                                       except Exception, e:
-                                               if edebug:
-                                                       print "!!! Exception:",e
-                                               mysum[0]=" [no/bad digest]"
-
-                                       if "--quiet" not in myopts:
-                                               print "     ", darkgreen("Latest version available:"),myversion
-                                               print "     ", self.getInstallationStatus(mycat+'/'+mypkg)
-                                               print "     ", darkgreen("Size of downloaded files:"),mysum[0]
-                                               print "     ", darkgreen("Homepage:")+"   ",homepage
-                                               print "     ", darkgreen("Description:"),desc
-                                               print "     ", darkgreen("License:")+"    ",license
-                                               print
-               print
-       #
-       # private interface
-       #
-       def getInstallationStatus(self,package):
-               installed_package = self.installcache.dep_bestmatch(package)
-               result = ""
-               version = self.getVersion(installed_package,search.VERSION_RELEASE)
-               if len(version) > 0:
-                       result = darkgreen("Latest version installed:")+" "+version
-               else:
-                       result = darkgreen("Latest version installed:")+" [ Not Installed ]"
-               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 getlist(mode):
-       if mode=="system":
-               mylines=portage.settings.packages
-       elif mode=="world":
-               try:
-                       myfile=open(portage.root+portage.WORLD_FILE,"r")
-                       mylines=myfile.readlines()
-                       myfile.close()
-               except OSError:
-                       print "!!! Couldn't open "+pfile+"; exiting."
-                       sys.exit(1)
-               except IOError:
-                       #world file doesn't exist
-                       mylines=[]
-       mynewlines=[]
-       for x in mylines:
-               myline=string.join(string.split(x))
-               if not len(myline):
-                       continue
-               elif myline[0]=="#":
-                       continue
-               elif mode=="system":
-                       if myline[0]!="*":
-                               continue
-                       myline=myline[1:]
-               mynewlines.append(myline.strip())
-
-       # Remove everything that is package.provided from our list
-       for myatom in mynewlines[:]:
-               mykey = portage.dep_getkey(myatom)
-               if portage.settings.pprovideddict.has_key(mykey) and \
-                       portage.match_from_list(myatom, portage.settings.pprovideddict[mykey]):
-                               mynewlines.remove(myatom)
-
-       return mynewlines
-
-def genericdict(mylist):
-       mynewdict={}
-       for x in mylist:
-               mynewdict[portage.dep_getkey(x)]=x
-       return mynewdict
-
-olddbapi=None
-class depgraph:
-
-       def __init__(self,myaction,myopts):
-               global olddbapi
-               self.pkgsettings = portage.config(clone=portage.settings)
-               if not self.pkgsettings["ARCH"]:
-                       portage.writemsg(red("\a!!! ARCH is not set... Are you missing the /etc/make.profile symlink?\n"))
-                       portage.writemsg(red("\a!!! Is the symlink correct? Is your portage tree complete?\n\n"))
-                       sys.exit(9)
-               self.applied_useflags = {}
-
-               self.missingbins=[]
-               self.myaction=myaction
-               self.digraph=portage.digraph()
-               self.orderedkeys=[]
-               self.outdatedpackages=[]
-               self.mydbapi={}
-               self.mydbapi["/"] = portage.fakedbapi()
-               if "empty" not in myparams:
-                       for pkg in portage.db["/"]["vartree"].getallcpv():
-                               self.mydbapi["/"].cpv_inject(pkg)
-               if portage.root != "/":
-                       self.mydbapi[portage.root] = portage.fakedbapi()
-                       if "empty" not in myparams:
-                               for pkg in portage.db[portage.root]["vartree"].getallcpv():
-                                       self.mydbapi[portage.root].cpv_inject(pkg)
-
-               if "--usepkg" in myopts:
-                       portage.db["/"]["bintree"].populate(("--getbinpkg" in myopts), ("--getbinpkgonly" in myopts))
-
-       def create(self,mybigkey,myparent=None,addme=1,myuse=None):
-               """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)"""
-               #stuff to add:
-               #SLOT-aware emerge
-               #IUSE-aware emerge
-               #"no downgrade" emerge
-               #print "mybigkey:",mybigkey
-
-               jbigkey=string.join(mybigkey)
-               if self.digraph.hasnode(jbigkey+" merge") or self.digraph.hasnode(jbigkey+" nomerge"):
-                       #this conditional is needed to prevent infinite recursion on already-processed deps
-                       return 1
-
-               update_spinner()
-
-               mytype,myroot,mykey=mybigkey
-               # select the correct /var database that we'll be checking against
-               vardbapi=portage.db[myroot]["vartree"].dbapi
-
-               if addme:
-                       # if the package is already on the system, we add a "nomerge"
-                       # directive, otherwise we add a "merge" directive.
-                       if mytype=="blocks":
-                               # we've encountered a "blocks" node.  We will totally ignore this
-                               # node and not add it to our digraph if it doesn't apply to us.
-                               if "--buildpkgonly" not in myopts and myparent and (self.mydbapi[myroot].match(mykey) or vardbapi.match(mykey)):
-                                       mybigkey.append(myparent.split()[2])
-                                       self.digraph.addnode(string.join(mybigkey),myparent)
-                               return 1
-
-               if myuse == None:
-                       self.pkgsettings.setcpv(mykey)
-                       myuse=string.split(self.pkgsettings["USE"], " ")
-
-               self.applied_useflags[mykey] = myuse
-
-               merging=1
-               if addme:
-               # this is where we add the node to the list of packages to merge
-                       if not myparent:
-                               # command-line specified or part of a world list...
-                               if ("self" not in myparams) or (("selective" in myparams) and vardbapi.cpv_exists(mykey)):
-                                       # the package is on the system, so don't merge it.
-                                       merging=0
-                       elif ("selective" in myparams) and vardbapi.cpv_exists(mykey):
-                               merging=0
-
-                       if (merging==0 and mytype=="ebuild" and "--newuse" in myopts and vardbapi.cpv_exists(mykey)):
-                               iuses=string.split(portage.portdb.aux_get(mykey, ["IUSE"])[0])
-                               old_use=string.split(vardbapi.aux_get(mykey, ["USE"])[0])
-                               now_use=string.split(self.pkgsettings["USE"])
-                               for x in iuses:
-                                       if (old_use.count(x) and not now_use.count(x)) or (not old_use.count(x) and now_use.count(x)):
-                                               merging=1
-                                               break
-               else:
-                       #onlydeps mode; don't merge
-                       merging=2
-               if merging==1:
-                       mybigkey.append("merge")
-               else:
-                       mybigkey.append("nomerge")
-
-               # whatever the case, we need to add the node to our digraph so
-               # that children can depend upon it.
-               self.digraph.addnode(string.join(mybigkey),myparent)
-               if ("deep" not in myparams) and (not merging):
-                       return 1
-               elif "recurse" not in myparams:
-                       return 1
-
-               edepend={}
-               if mytype=="binary":
-                       mypkgparts=portage.catpkgsplit(mykey)
-                       tbz2name = string.split(mykey, "/")[1]+".tbz2"
-                       if tbz2name in portage.db[portage.root]["bintree"].invalids:
-                               sys.stderr.write("\nINVALID PACKAGE (is required to continue): "+str(mykey)+"\n")
-                               sys.exit(1)
-                       if portage.db[portage.root]["bintree"].isremote(mykey):
-                               edepend = portage.db[portage.root]["bintree"].remotepkgs[tbz2name]
-                               edepend["DEPEND"] =""
-                               edepend["RDEPEND"]=string.join(string.split(edepend["RDEPEND"])," ")
-                               edepend["PDEPEND"]=string.join(string.split(edepend["PDEPEND"])," ")
-                               edepend["SLOT"]   =string.strip(edepend["SLOT"])
-                               #portage.db[portage.root]["bintree"].gettbz2(mykey)
-                       else: # It's local.
-                               mytbz2=xpak.tbz2(portage.db[portage.root]["bintree"].getname(mykey))
-                               edepend["DEPEND"] =""
-                               edepend["RDEPEND"]=string.join(mytbz2.getelements("RDEPEND")," ")
-                               edepend["PDEPEND"]=string.join(mytbz2.getelements("PDEPEND")," ")
-                               edepend["SLOT"]   =mytbz2.getfile("SLOT",mypkgparts[2])
-               elif mytype=="ebuild":
-                       try:
-                               mymeta = ["DEPEND","RDEPEND","PDEPEND"]
-                               myfoo = portage.portdb.aux_get(mykey, mymeta)
-                               for index in range(0,len(mymeta)):
-                                       edepend[mymeta[index]] = myfoo[index]
-                               if "--buildpkgonly" in myopts:
-                                       edepend["RDEPEND"] = ""
-                       except (KeyError,IOError):
-                               print "emerge: create(): aux_get() error on",mykey+"; aborting..."
-                               sys.exit(1)
-               mydep={}
-               mp=string.join(mybigkey)
-
-               if myroot=="/":
-                       mydep["/"]=edepend["DEPEND"]+" "+edepend["RDEPEND"]
-                       if not self.select_dep("/",mydep["/"],myparent=mp,myuse=myuse):
-                               return 0
-               else:
-                       mydep["/"]=edepend["DEPEND"]
-                       mydep[myroot]=edepend["RDEPEND"]
-                       if not self.select_dep("/",mydep["/"],myparent=mp,myuse=myuse):
-                               return 0
-                       if not self.select_dep(myroot,mydep[myroot],myparent=mp,myuse=myuse):
-                               return 0
-
-               if edepend.has_key("PDEPEND") and edepend["PDEPEND"]:
-                       # Post Depend -- Add to the list without a parent, as it depends
-                       # on a package being present AND must be built after that package.
-                       if not self.select_dep(myroot,edepend["PDEPEND"],myuse=myuse):
-                               return 0
-
-               return 1
-
-       def select_files(self,myfiles):
-               "given a list of .tbz2s, .ebuilds and deps, create the appropriate depgraph and return a favorite list"
-               myfavorites=[]
-               for x in myfiles:
-                       if x[-5:]==".tbz2":
-                               if not os.path.exists(x):
-                                       if os.path.exists(self.pkgsettings["PKGDIR"]+"/All/"+x):
-                                               x=self.pkgsettings["PKGDIR"]+"/All/"+x
-                                       elif os.path.exists(self.pkgsettings["PKGDIR"]+"/"+x):
-                                               x=self.pkgsettings["PKGDIR"]+"/"+x
-                                       else:
-                                               print "\n\n!!! Binary package '"+str(x)+"' does not exist."
-                                               print "!!! Please ensure the tbz2 exists as specified.\n"
-                                               sys.exit(1)
-                               mytbz2=xpak.tbz2(x)
-                               mykey=mytbz2.getelements("CATEGORY")[0]+"/"+os.path.basename(x)[:-5]
-                               if os.path.realpath(portage.db["/"]["bintree"].getname(mykey)) != os.path.realpath(x):
-                                       print red("\n*** You need to adjust PKGDIR to emerge this package.\n")
-                                       sys.exit(1)
-                               if not self.create(["binary",portage.root,mykey],None,"--onlydeps" not in myopts):
-                                       return (0,myfavorites)
-                               elif not "--oneshot" in myopts:
-                                       myfavorites.append(mykey)
-                       elif x[-7:]==".ebuild":
-                               x = os.path.realpath(x)
-                               mykey=os.path.basename(os.path.normpath(x+"/../.."))+"/"+os.path.basename(x)[:-7]
-                               ebuild_path = portage.db["/"]["porttree"].dbapi.findname(mykey)
-                               if ebuild_path:
-                                       if os.path.realpath(ebuild_path) != x:
-                                               print red("\n*** You need to adjust PORTDIR or PORTDIR_OVERLAY to emerge this package.\n")
-                                               sys.exit(1)
-                                       if mykey not in portage.db["/"]["porttree"].dbapi.xmatch("match-visible", portage.dep_getkey(mykey)):
-                                               print red("\n*** You are emerging a masked package. It is MUCH better to use")
-                                               print red("*** /etc/portage/package.* to accomplish this. See portage(5) man")
-                                               print red("*** page for details.")
-                                               countdown(EMERGE_WARNING_DELAY, "Continuing...")
-                               else:
-                                       print red("\n*** "+x+" does not exist")
-                                       sys.exit(1)
-                               if not self.create(["ebuild",portage.root,mykey],None,"--onlydeps" not in myopts):
-                                       return (0,myfavorites)
-                               elif not "--oneshot" in myopts:
-                                       myfavorites.append(mykey)
-                       else:
-                               try:
-                                       mykey=portage.dep_expand(x,mydb=portage.portdb)
-                               except ValueError, errpkgs:
-                                       print "\n\n!!! The short ebuild name \"" + x + "\" is ambiguous.  Please specify"
-                                       print "!!! one of the following fully-qualified ebuild names instead:\n"
-                                       for i in errpkgs[0]:
-                                               print "    " + green(i)
-                                       print
-                                       sys.exit(1)
-
-                               # select needs to return 0 on dep_check failure
-
-                               sys.stdout.flush()
-                               sys.stderr.flush()
-
-                               try:
-                                       self.mysd = self.select_dep(portage.root,mykey,arg=x)
-                               except portage_exception.MissingSignature, e:
-                                       portage.writemsg("\n\n!!! A missing gpg signature is preventing portage from calculating the\n")
-                                       portage.writemsg("!!! required dependencies. This is a security feature enabled by the admin\n")
-                                       portage.writemsg("!!! to aid in the detection of malicious intent.\n\n")
-                                       portage.writemsg("!!! THIS IS A POSSIBLE INDICATION OF A TAMPERED FILES -- CHECK CAREFULLY.\n")
-                                       portage.writemsg("!!! Affected file: %s\n" % (e))
-                                       sys.exit(1)
-                               except portage_exception.InvalidSignature, e:
-                                       portage.writemsg("\n\n!!! An invalid gpg signature is preventing portage from calculating the\n")
-                                       portage.writemsg("!!! required dependencies. This is a security feature enabled by the admin\n")
-                                       portage.writemsg("!!! to aid in the detection of malicious intent.\n\n")
-                                       portage.writemsg("!!! THIS IS A POSSIBLE INDICATION OF A TAMPERED FILES -- CHECK CAREFULLY.\n")
-                                       portage.writemsg("!!! Affected file: %s\n" % (e))
-                                       sys.exit(1)
-                               except SystemExit, e:
-                                       raise # Needed else can't exit
-                               except Exception, e:
-                                       if "--debug" in myopts:
-                                               raise
-                                       print "\n\n!!! Problem in",mykey,"dependencies."
-                                       print "!!!",str(e),e.__module__
-                                       sys.exit(1)
-
-                               if not self.mysd:
-                                       return (0,myfavorites)
-                               elif not "--oneshot" in myopts:
-                                       myfavorites.append(mykey)
-
-               missing=0
-               if "--usepkgonly" in myopts:
-                       for x in self.digraph.dict.keys():
-                               xs=string.split(x," ")
-                               if (xs[0] != "binary") and (xs[3]=="merge"):
-                                       if missing == 0:
-                                               print
-                                       missing += 1
-                                       print "Missing binary for:",xs[2]
-
-               # We're true here unless we are missing binaries.
-               return (not missing,myfavorites)
-
-       def is_newer_ver_installed(self,myroot,pkg,pkgver):
-               "if there is a version of pkg installed newer than pkgver, return it"
-               vardbapi=portage.db[myroot]["vartree"].dbapi
-
-               matches=portage.db[myroot]["vartree"].dbapi.match(pkg)
-               if matches:
-                       myslot=portage.db["/"]["porttree"].getslot(pkgver)
-                       for match in matches:
-                               if portage.pkgcmp(portage.catpkgsplit(pkgver)[1:], portage.catpkgsplit(match)[1:]) < 0:
-                                       curslot=portage.db[myroot]["vartree"].getslot(match)
-                                       if curslot == myslot:
-                                               return match
-
-       def select_dep(self,myroot,depstring,myparent=None,arg=None,myuse=None):
-               "given a dependency string, create the appropriate depgraph and return 1 on success and 0 on failure"
-               if "--debug" in myopts:
-                       print
-                       print "Parent:   ",myparent
-                       print "Depstring:",depstring
-               if not arg:
-                       #processing dependencies
-                       mycheck=portage.dep_check(depstring,self.mydbapi[myroot],self.pkgsettings,myuse=myuse,use_binaries=("--usepkg" in myopts))
-                       #mycheck=portage.dep_check(depstring,self.mydbapi[myroot],self.pkgsettings,myuse=myuse)
-
-                       if not mycheck[0]:
-                               mymerge=[]
-                       else:
-                               mymerge=mycheck[1]
-
-               else:
-                       #we're processing a command-line argument; unconditionally merge it even if it's already merged
-                       mymerge=[depstring]
-
-               # dep_check has been run so we can now add our parent to our
-               # build state to update virtuals and other settings. This
-               # happens after the package is added to the tree so that a
-               # package can depend on a virtual which it satisfies.
-               if myparent:
-                       myp = myparent.split()
-                       if myp[3]=="merge":
-                               self.mydbapi[myroot].cpv_inject(myp[2])
-                               if myp[0]=="binary":
-                                       self.pkgsettings.setinst(myp[2],portage.db["/"]["bintree"].dbapi)
-                               else:
-                                       self.pkgsettings.setinst(myp[2],portage.db[myroot]["porttree"].dbapi)
-
-               if not mymerge:
-                       return 1
-
-               if "--debug" in myopts:
-                       print "Candidates:",mymerge
-               for x in mymerge:
-                       myk=None
-                       binpkguseflags=None
-                       if x[0]=="!":
-                               # if this package is myself, don't append it to block list.
-                               if "--debug" in myopts:
-                                       print "Myparent",myparent
-                               if (myparent):
-                                       if myparent.split()[2] in portage.portdb.xmatch("match-all", x[1:]):
-                                               # myself, so exit.
-                                               continue
-                               # adding block
-                               myk=["blocks",myroot,x[1:]]
-                       else:
-                               #We are not processing a blocker but a normal dependency
-                               myeb=None
-                               myeb_matches = portage.portdb.xmatch("match-visible",x)
-                               if ("--usepkgonly" not in myopts):
-                                       myeb=portage.best(myeb_matches)
-
-                               myeb_pkg=None
-                               if ("--usepkg" in myopts):
-                                       # The next line assumes the binarytree has been populated.
-                                       # XXX: Need to work out how we use the binary tree with roots.
-                                       myeb_pkg_matches=portage.db["/"]["bintree"].dbapi.match(x)
-                                       if ("--usepkgonly" not in myopts):
-                                               # Remove any binary package entries that are masked in the portage tree (#55871)
-                                               for idx in range(len(myeb_pkg_matches)-1,-1,-1):
-                                                       if myeb_pkg_matches[idx] not in myeb_matches:
-                                                               del myeb_pkg_matches[idx]
-                                       myeb_pkg = portage.best(myeb_pkg_matches)
-
-                               if not myeb_pkg:
-                                       myeb_pkg = None
-                               elif ("--newuse" in myopts):
-                                       iuses=string.split(portage.db["/"]["bintree"].dbapi.aux_get(myeb_pkg, ["IUSE"])[0])
-                                       old_use=string.split(portage.db["/"]["bintree"].dbapi.aux_get(myeb_pkg, ["USE"])[0])
-                                       self.pkgsettings.setcpv(myeb_pkg)
-                                       now_use=string.split(self.pkgsettings["USE"])
-                                       self.pkgsettings.reset()
-                                       for x in iuses:
-                                               if (old_use.count(x) and not now_use.count(x)) or (not old_use.count(x) and now_use.count(x)):
-                                                       myeb_pkg = None
-                                                       break
-
-                               if (not myeb) and (not myeb_pkg):
-                                       if not arg:
-                                               xinfo='"'+x+'"'
-                                       else:
-                                               xinfo='"'+arg+'"'
-                                       if myparent:
-                                               xfrom = '(dependency required by '+green('"'+myparent.split()[2]+'"')+red(' ['+myparent.split()[0]+"])")
-                                       alleb=portage.portdb.xmatch("match-all",x)
-                                       if alleb:
-                                               if "--usepkgonly" not in myopts:
-                                                       print "\n!!! "+red("All ebuilds that could satisfy ")+green(xinfo)+red(" have been masked.")
-                                                       print "!!! One of the following masked packages is required to complete your request:"
-                                                       oldcomment = ""
-                                                       for p in alleb:
-                                                               mreasons = portage.getmaskingstatus(p)
-                                                               print "- "+p+" (masked by: "+string.join(mreasons, ", ")+")"
-                                                               comment = portage.getmaskingreason(p)
-                                                               if comment and comment != oldcomment:
-                                                                       print comment
-                                                                       oldcomment = comment
-                                                       print
-                                                       print "For more information, see MASKED PACKAGES section in the emerge man page or "
-                                                       print "section 2.2 \"Software Availability\" in the Gentoo Handbook."
-                                                       if myparent:
-                                                               print     "!!!    "+red(xfrom)
-                                                       print
-                                               else:
-                                                       print "\n!!! "+red("There are no packages available to satisfy: ")+green(xinfo)
-                                                       print "!!! Either add a suitable binary package or compile from an ebuild."
-                                       else:
-                                               print "\nemerge: there are no ebuilds to satisfy "+xinfo+"."
-                                               if myparent:
-                                                       print xfrom
-                                               print
-                                       return 0
-
-                               if "--debug" in myopts:
-                                       print "ebuild:",myeb
-                                       print "binpkg:",myeb_pkg
-
-                               if myeb and myeb_pkg:
-                                       myeb_s     = portage.catpkgsplit(myeb)
-                                       myeb_s     = [myeb_s[0]+"/"+myeb_s[1], myeb_s[2], myeb_s[3]]
-                                       myeb_pkg_s = portage.catpkgsplit(myeb_pkg)
-                                       myeb_pkg_s = [myeb_pkg_s[0]+"/"+myeb_pkg_s[1], myeb_pkg_s[2], myeb_pkg_s[3]]
-
-                                       if portage.pkgcmp(myeb_s, myeb_pkg_s) == 0: # pkg is same version as ebuild
-                                               myeb = None
-                                       else:
-                                               myeb_pkg = None
-
-                               if "--upgradeonly" in myopts:
-                                       # Check that there isn't a newer version of this package already installed
-                                       cand = None
-                                       try:
-                                               # XXX: This can throw an exception if the ebuild doesn't exist
-                                               if myeb:
-                                                       cand=self.is_newer_ver_installed(myroot,x,myeb)
-                                               elif myeb_pkg:
-                                                       cand=self.is_newer_ver_installed(myroot,x,myeb_pkg)
-                                       except SystemExit, e:
-                                               raise # Needed else can't exit
-                                       except Exception, e:
-                                               print "Warning: "+str(e)
-                                       if cand:
-                                               myeb=cand
-
-                               if myeb:
-                                       myk=["ebuild",myroot,myeb]
-                               elif myeb_pkg:
-                                       binpkguseflags=portage.db[portage.root]["bintree"].get_use(myeb_pkg)
-                                       myk=["binary",myroot,myeb_pkg]
-                               else:
-                                       sys.stderr.write("!!! Confused... Don't know what I'm using for dependency info. :(\n")
-                                       sys.exit(1)
-
-                               #if "--usepkg" in myopts:
-                               #       #If we want to use packages, see if we have a pre-built one...
-                               #       mypk=portage.db["/"]["bintree"].dbapi.match(x)
-                               #       if myeb in mypk:
-                               #               #Use it only if it's exactly the version we want.
-                               #               myk=["binary",myroot,myeb]
-                               #       else:
-                               #               myk=["ebuild",myroot,myeb]
-                               #else:
-                               #       myk=["ebuild",myroot,myeb]
-                       if myparent:
-                               #we are a dependency, so we want to be unconditionally added
-                               if not self.create(myk,myparent,myuse=binpkguseflags):
-                                       return 0
-                       else:
-                               #if mysource is not set, then we are a command-line dependency and should not be added
-                               #if --onlydeps is specified.
-                               if not self.create(myk,myparent,"--onlydeps" not in myopts,myuse=binpkguseflags):
-                                       return 0
-
-               if "--debug" in myopts:
-                       print "Exiting...",myparent
-               return 1
-
-
-       def altlist(self):
-               mygraph=self.digraph.copy()
-               dolist=["/"]
-               retlist=[]
-               for x in portage.db.keys():
-                       portage.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:"
-                               print
-                               for x in mygraph.dict.keys():
-                                       for y in mygraph.dict[x][1]:
-                                               print y,"depends on",x
-                               print
-                               sys.exit(1)
-                       splitski=string.split(mycurkey)
-                       #I'm not sure of the significance of the following lines (vestigal?) so I'm commenting 'em out.
-                       #These lines remove already-merged things from our alt-list
-                       #if "--update" in myopts:
-                       #       if not portage.db["/"]["vartree"].exists_specific(splitski[2]):
-                       #               portage.db["/"]["merge"].append(splitski)
-                       #else:
-                       portage.db[splitski[1]]["merge"].append(splitski)
-                       mygraph.delnode(mycurkey)
-               for x in dolist:
-                       for y in portage.db[x]["merge"]:
-                               retlist.append(y)
-               return retlist
-
-       def xcreate(self,mode="system"):
-               global syslist
-               if mode=="system":
-                       mylist=syslist
-               else:
-                       #world mode
-                       worldlist=getlist("world")
-                       sysdict=genericdict(syslist)
-                       worlddict=genericdict(worldlist)
-                       #we're effectively upgrading sysdict to contain all new deps from worlddict
-                       for x in worlddict.keys():
-                               #only add the world node if the package is:
-                               #actually installed -- this prevents the remerging of already unmerged packages when we do a world --update;
-                               #actually available -- this prevents emerge from bombing out due to no match being found (we want a silent ignore)
-                               if "empty" in myparams:
-                                       if portage.db["/"]["vartree"].dbapi.match(x):
-                                               sysdict[x]=worlddict[x]
-                               elif portage.db[portage.root]["vartree"].dbapi.match(x):
-                                       #package is installed
-                                       sysdict[x]=worlddict[x]
-                               else:
-                                       print "\n*** Package in world file is not installed: "+x
-                       mylist = sysdict.keys()
-
-               for mydep in mylist:
-                       myeb=portage.portdb.xmatch("bestmatch-visible",mydep)
-                       if not myeb:
-                               #this is an unavailable world entry; just continue
-                               continue
-
-                       if "--upgradeonly" in myopts:
-                               cand=self.is_newer_ver_installed(portage.root,mydep,myeb)
-                               if cand:
-                                       myeb=cand
-
-                       #THIS NEXT BUNCH OF CODE NEEDS TO BE REPLACED TO SUPPORT WORLD ANTI-DEPS
-                       #if mydep2[0]=="!":, etc.
-                       binpkguseflags = None
-                       if "--usepkg" in myopts:
-                               mypk=portage.db[portage.root]["bintree"].dep_bestmatch(mydep)
-                               if myeb==mypk:
-                                       myk=["binary",portage.root,mypk]
-                                       binpkguseflags=portage.db[portage.root]["bintree"].get_use(mypk)
-                                       if ("--newuse" in myopts):
-                                               iuses=string.split(portage.db["/"]["bintree"].dbapi.aux_get(mypk, ["IUSE"])[0])
-                                               old_use=string.split(portage.db["/"]["bintree"].dbapi.aux_get(mypk, ["USE"])[0])
-                                               self.pkgsettings.setcpv(mypk)
-                                               now_use=string.split(self.pkgsettings["USE"])
-                                               self.pkgsettings.reset()
-                                               for x in iuses:
-                                                       if (old_use.count(x) and not now_use.count(x)) or (not old_use.count(x) and now_use.count(x)):
-                                                               myk=["ebuild",portage.root,myeb]
-                                                               binpkguseflags=None
-                                                               break
-                               elif "--usepkgonly" in myopts:
-                                       if not mypk:
-                                               self.missingbins += [myeb]
-                                               myk=["binary",portage.root,myeb]
-                                       else:
-                                               myk=["binary",portage.root,mypk]
-                               else:
-                                       myk=["ebuild",portage.root,myeb]
-                       else:
-                               myk=["ebuild",portage.root,myeb]
-
-                       if not self.create(myk,myuse=binpkguseflags):
-                               print
-                               print "!!! Problem with dependencies under ",myk[0],myk[2]
-                               print "!!! Possibly a DEPEND/*DEPEND problem."
-                               print
-                               return 0
-               return 1
-
-       def match(self,mydep,myroot=portage.root,mykey=None):
-               # support mutual exclusive deps
-               mydep2=mydep
-               if mydep2[0]=="!":
-                       mydep2=mydep[1:]
-
-               if mydep[0]=="!":
-                       #add our blocker; it will be ignored later if necessary (if we are remerging the same pkg, for example)
-                       myk="blocks "+myroot+" "+mydep2
-               else:
-                       myeb=portage.db[portage.root]["porttree"].dep_bestmatch(mydep2)
-                       if not myeb:
-                               if not mykey:
-                                       print "\n!!! Error: couldn't find match for",mydep
-                               else:
-                                       print "\n!!! Error: couldn't find match for",mydep,"in",mykey
-                               print
-                               sys.exit(1)
-
-                       if "--usepkg" in myopts:
-                               mypk=portage.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):
-               changelogs=[]
-               p=[]
-               totalsize=0
-
-               if "--verbose" in myopts:
-                       overlays = string.split(portage.settings['PORTDIR_OVERLAY'])
-
-               if "--tree" in myopts:
-                       mylist.reverse()
-                       mygraph=self.digraph.copy()
-
-               i = 0
-               while i < len(mylist):
-                       if mylist[i][-1]=="nomerge":
-                               if not ("--tree" in myopts):
-                                       # we don't care about this elements
-                                       mylist.pop(i)
-                                       continue
-                               if (i == (len(mylist) - 1)) \
-                                  or (mygraph.depth(string.join(mylist[i])) \
-                                      >= mygraph.depth(string.join(mylist[i+1]))):
-                                       # end of a useless branch (may be the last one)
-                                       # -> delete the element and test the previous one
-                                       mylist.pop(i)
-                                       if i > 0:
-                                               i -= 1
-                                       continue
-                       # the branch continues, or we've found a good element.
-                       # -> let's see what's next, if anything
-                       i += 1
-
-               display_overlays=False
-               # files to fetch list - avoids counting a same file twice
-               # in size display (verbose mode)
-               myfetchlist=[]
-               for x in mylist:
-                       fetch=" "
-
-                       if x[0]=="blocks":
-                               addl=""+red("B")+"  "+fetch+"  "
-                               resolved=portage.db[x[1]]["vartree"].resolve_key(x[2])
-                               print "["+x[0]+" "+addl+"]",red(resolved),
-                               if resolved!=x[2]:
-                                       if x[3]:
-                                               print red("(\""+x[2]+"\" is blocking "+x[3]+")")
-                                       else:
-                                               print red("(\""+x[2]+"\")")
-                               else:
-                                       if x[3]:
-                                               print red("(is blocking "+x[3]+")")
-                                       else:
-                                               print
-                       else:
-                               if (x[0]!="binary") and ("fetch" in string.split(portage.portdb.aux_get(x[2],["RESTRICT"])[0])):
-                                       fetch = red("F")
-                                       if portage.portdb.fetch_check(x[2], portage.settings):
-                                               fetch = green("f")
-
-                               #we need to use "--emptrytree" testing here rather than "empty" param testing because "empty"
-                               #param is used for -u, where you still *do* want to see when something is being upgraded.
-                               myoldbest=""
-                               if (not "--emptytree" in myopts) and portage.db[x[1]]["vartree"].exists_specific(x[2]):
-                                       addl="  "+yellow("R")+fetch+"  "
-                               elif (not "--emptytree" in myopts) and portage.db[x[1]]["vartree"].exists_specific_cat(x[2]):
-                                       if x[0] == "binary":
-                                               mynewslot=portage.db["/"]["bintree"].getslot(x[2])
-                                       elif x[0] == "ebuild":
-                                               mynewslot=portage.db["/"]["porttree"].getslot(x[2])
-                                       myoldlist=portage.db[x[1]]["vartree"].dbapi.match(portage.pkgsplit(x[2])[0])
-                                       myinslotlist=filter((lambda p: portage.db[portage.root]["vartree"].getslot(p)==mynewslot),myoldlist)
-                                       if myinslotlist:
-                                               myoldbest=portage.best(myinslotlist)
-                                               addl="   "+fetch
-                                               if portage.pkgcmp(portage.pkgsplit(x[2]), portage.pkgsplit(myoldbest)) < 0:
-                                                       # Downgrade in slot
-                                                       addl+=turquoise("U")+blue("D")
-                                               else:
-                                                       # Update in slot
-                                                       addl+=turquoise("U")+" "
-                                       else:
-                                               # New slot, mark it new.
-                                               addl=" "+green("NS")+fetch+"  "
-
-                                       if "--changelog" in myopts:
-                                               changelogs.extend(self.calc_changelog(
-                                                       portage.portdb.findname(x[2]),
-                                                       portage.db["/"]["vartree"].dep_bestmatch('/'.join(portage.catpkgsplit(x[2])[:2])),
-                                                       x[2]
-                                                       ))
-                               else:
-                                       addl=" "+green("N")+" "+fetch+"  "
-
-                               verboseadd=""
-                               if "--verbose" in myopts:
-                                       # iuse verbose
-                                       try:
-                                               if x[0] == "binary":
-                                                       iuse_split = string.split(portage.db["/"]["bintree"].dbapi.aux_get(x[2],["IUSE"])[0])
-                                               elif x[0] == "ebuild":
-                                                       iuse_split = string.split(portage.portdb.aux_get(x[2],["IUSE"])[0])
-                                               else:
-                                                       iuse_split = []
-                                       except SystemExit, e:
-                                               raise # Needed else can't exit
-                                       except:
-                                               portage.writemsg("!!! Error getting IUSE (report this to bugs.gentoo.org)\n")
-                                               portage.writemsg("!!! %s\n" % x)
-                                               iuse_split = []
-                                       iuse_split.sort()
-                                       old_use=None
-                                       if myoldbest:
-                                               pkg=myoldbest
-                                       else:
-                                               pkg=x[2]
-                                       if portage.db["/"]["vartree"].dbapi.cpv_exists(pkg):
-                                               try:
-                                                       old_use=string.split(portage.db["/"]["vartree"].dbapi.aux_get(pkg, ["USE"])[0])
-                                               except SystemExit, e:
-                                                       raise # Needed else can't exit
-                                               except:
-                                                       pass
-                                       iuse=""
-                                       now_use=self.applied_useflags[x[2]]
-                                       for ebuild_iuse in portage_util.unique_array(iuse_split):
-                                               usechange=""
-                                               if old_use:
-                                                       if (old_use.count(ebuild_iuse) and not now_use.count(ebuild_iuse)) or (not old_use.count(ebuild_iuse) and now_use.count(ebuild_iuse)):
-                                                               usechange="*"
-
-                                               if ebuild_iuse in self.applied_useflags[x[2]]:
-                                                       if usechange == "*":
-                                                               iuse=green("+"+ebuild_iuse)
-                                                       else:
-                                                               iuse=red("+"+ebuild_iuse)
-                                               elif ebuild_iuse in portage.settings.usemask:
-                                                       iuse=blue("(-"+ebuild_iuse+")")
-                                               else:
-                                                       iuse=blue("-"+ebuild_iuse)
-                                               verboseadd+=iuse+usechange+" "
-
-                                       # size verbose
-                                       mysize=0
-                                       if x[0] == "ebuild" and x[-1]!="nomerge":
-                                               myfilesdict=portage.portdb.getfetchsizes(x[2], useflags=self.applied_useflags[x[2]], debug=edebug)
-                                               if myfilesdict==None:
-                                                       myfilesdict="[empty/missing/bad digest]"
-                                               else:
-                                                       for myfetchfile in myfilesdict.keys():
-                                                               if myfetchfile not in myfetchlist:
-                                                                       mysize+=myfilesdict[myfetchfile]
-                                                                       myfetchlist.append(myfetchfile)
-                                                       totalsize+=mysize
-                                               verboseadd+=format_size(mysize)+" "
-
-                                       # overlay verbose
-                                       # XXX: Invalid binaries have caused tracebacks here. 'if file_name'
-                                       # x = ['binary', '/', 'sys-apps/pcmcia-cs-3.2.7.2.6', 'merge']
-                                       file_name=portage.portdb.findname(x[2])
-                                       if file_name: # It might not exist in the tree
-                                               dir_name=os.path.abspath(os.path.dirname(file_name)+"/../..")
-                                               if (overlays.count(dir_name)>0):
-                                                       verboseadd+=teal("["+str(overlays.index(os.path.normpath(dir_name))+1)+"]")+" "
-                                                       display_overlays=True
-                                       else:
-                                               verboseadd += "[No ebuild?]"
-
-                               xs=portage.pkgsplit(x[2])
-                               if xs[2]=="r0":
-                                       xs[2]=""
-                               else:
-                                       xs[2]="-"+xs[2]
-
-                               if self.pkgsettings.has_key("COLUMNWIDTH"):
-                                       mywidth=int(self.pkgsettings.settings["COLUMNWIDTH"])
-                               else:
-                                       mywidth=130
-                               oldlp=mywidth-30
-                               newlp=oldlp-30
-
-                               indent=""
-                               if ("--tree" in myopts):
-                                       indent=" "*mygraph.depth(string.join(x))
-
-                               if myoldbest:
-                                       myoldbest=portage.pkgsplit(myoldbest)[1]+"-"+portage.pkgsplit(myoldbest)[2]
-                                       if myoldbest[-3:]=="-r0":
-                                               myoldbest=myoldbest[:-3]
-                                       myoldbest=blue("["+myoldbest+"]")
-
-                               if x[1]!="/":
-                                       if "--columns" in myopts:
-                                               myprint="["+x[0]+" "+addl+"] "+indent+darkgreen(xs[0])
-                                               if (newlp-nc_len(myprint)) > 0:
-                                                       myprint=myprint+(" "*(newlp-nc_len(myprint)))
-                                               myprint=myprint+"["+darkblue(xs[1]+xs[2])+"] "
-                                               if (oldlp-nc_len(myprint)) > 0:
-                                                       myprint=myprint+" "*(oldlp-nc_len(myprint))
-                                               myprint=myprint+myoldbest
-                                               myprint=myprint+darkgreen("  to "+x[1])+" "+verboseadd
-                                       else:
-                                               myprint="["+x[0]+" "+addl+"] "+darkgreen(x[2])+" "+myoldbest+" "+darkgreen("to "+x[1])+" "+verboseadd
-                               else:
-                                       if "--columns" in myopts:
-                                               myprint="["+x[0]+" "+addl+"] "+indent+darkgreen(xs[0])
-                                               if (newlp-nc_len(myprint)) > 0:
-                                                       myprint=myprint+(" "*(newlp-nc_len(myprint)))
-                                               myprint=myprint+green(" ["+xs[1]+xs[2]+"] ")
-                                               if (oldlp-nc_len(myprint)) > 0:
-                                                       myprint=myprint+(" "*(oldlp-nc_len(myprint)))
-                                               myprint=myprint+myoldbest+"  "+verboseadd
-                                       else:
-                                               if x[3]=="nomerge":
-                                                       myprint=darkblue("[nomerge      ] "+indent+x[2]+" "+myoldbest+" ")+verboseadd
-                                               else:
-                                                       myprint="["+x[0]+" "+addl+"] "+indent+darkgreen(x[2])+" "+myoldbest+" "+verboseadd
-                               p.append(myprint)
-
-                       if ("--tree" not in myopts):
-                               mysplit=portage.pkgsplit(x[2])
-
-                               # XXX mysplit _can_ be None.... Why?
-                               if mysplit and (len(mysplit)==3):
-                                       if "--emptytree" not in myopts:
-                                               if mysplit[0]=="sys-apps/portage":
-                                                       if ((mysplit[1]+mysplit[2]) != portage.VERSION) and \
-                                                          ("livecvsportage" not in portage.settings.features):
-                                                               if mylist.index(x)<len(mylist)-1:
-                                                                       p.append(red("*** Portage will stop merging at this point and reload itself,"))
-                                                                       p.append(red("    recalculate dependencies, and complete the merge."))
-                                                                       if "--update" not in myopts:
-                                                                               p.append(darkgreen("    You may avoid the remerging of packages by updating portage on its own."))
-                                                                       print
-                                       else:
-                                               if mysplit[0]=="sys-apps/portage" and ("--emptytree" in myopts):
-                                                       if mysplit[1]+mysplit[2]!=portage.VERSION:
-                                                               p.append(red("***")+" Please update portage to the above version before proceeding.")
-                                                               p.append("    Failure to do so may result in failed or improper merges.")
-                                                               p.append("    A simple '"+green("emerge -u portage")+"' is sufficient.")
-                                                               p.append("")
-                               del mysplit
-
-               for x in p:
-                       print x
-
-               if "--verbose" in myopts:
-                       print
-                       print "Total size of downloads: "+format_size(totalsize)
-                       if overlays and display_overlays:
-                               print "Portage overlays:"
-                               y=0
-                               for x in overlays:
-                                       y=y+1
-                                       print " "+teal("["+str(y)+"]"),x
-
-               if "--changelog" in myopts:
-                       print
-                       for revision,text in changelogs:
-                               print bold('*'+revision)
-                               sys.stdout.write(text)
-
-       def calc_changelog(self,ebuildpath,current,next):
-               current = '-'.join(portage.catpkgsplit(current)[1:])
-               if current.endswith('-r0'): current = current[:-3]
-               next = '-'.join(portage.catpkgsplit(next)[1:])
-               if next.endswith('-r0'): next = next[:-3]
-               changelogpath = os.path.join(os.path.split(ebuildpath)[0],'ChangeLog')
-               try:
-                       changelog = open(changelogpath).read()
-               except SystemExit, e:
-                       raise # Needed else can't exit
-               except:
-                       return []
-               divisions = self.find_changelog_tags(changelog)
-               #print 'XX from',current,'to',next
-               #for div,text in divisions: print 'XX',div
-               # skip entries for all revisions above the one we are about to emerge
-               for i in range(len(divisions)):
-                       if divisions[i][0]==next:
-                               divisions = divisions[i:]
-                               break
-               # find out how many entries we are going to display
-               for i in range(len(divisions)):
-                       if divisions[i][0]==current:
-                               divisions = divisions[:i]
-                               break
-               else:
-                   # couldnt find the current revision in the list. display nothing
-                       return []
-               return divisions
-
-       def find_changelog_tags(self,changelog):
-               divs = []
-               release = None
-               while 1:
-                       match = re.search(r'^\*\ ?([-a-zA-Z0-9_.]*)(?:\ .*)?\n',changelog,re.M)
-                       if match is None:
-                               if release is not None:
-                                       divs.append((release,changelog))
-                               return divs
-                       if release is not None:
-                               divs.append((release,changelog[:match.start()]))
-                       changelog = changelog[match.end():]
-                       release = match.group(1)
-                       if release.endswith('.ebuild'):
-                               release = release[:-7]
-                       if release.endswith('-r0'):
-                               release = release[:-3]
-
-       def outdated(self):
-               return self.outdatedpackages
-
-       def merge(self,mylist):
-               returnme=0
-               mymergelist=[]
-
-               #check for blocking dependencies
-               if ("--fetchonly" not in myopts) and ("--buildpkgonly" not in myopts):
-                       for x in mylist:
-                               if x[0]=="blocks":
-                                       print "\n!!! Error: the "+x[2]+" package conflicts with another package."
-                                       print   "!!!        both can't be installed on the same system together."
-                                       print   "!!!        Please use 'emerge --pretend' to determine blockers."
-                                       print
-                                       if ("--pretend" not in myopts):
-                                               sys.exit(1)
-
-               #buildsyspkg: I need mysysdict also on resume (moved from the else block)
-               mysysdict=genericdict(syslist)
-               if ("--resume" in myopts):
-                       # We're resuming.
-                       print green("*** Resuming merge...")
-                       emergelog(" *** Resuming merge...")
-                       mymergelist=portage.mtimedb["resume"]["mergelist"][:]
-                       if ("--skipfirst" in myopts) and mymergelist:
-                               del portage.mtimedb["resume"]["mergelist"][0]
-                               del mymergelist[0]
-               else:
-                       myfavs=portage.grabfile(portage.root+portage.WORLD_FILE)
-                       myfavdict=genericdict(myfavs)
-                       for x in range(len(mylist)):
-                               if mylist[x][3]!="nomerge":
-                                       # Add to the mergelist
-                                       mymergelist.append(mylist[x])
-                               else:
-                                       myfavkey=portage.cpv_getkey(mylist[x][2])
-                                       if "--onlydeps" in myopts:
-                                               continue
-                                       # Add to the world file. Since we won't be able to later.
-                                       if (not "--fetchonly" in myopts) and (myfavkey in favorites):
-                                               #don't record if already in system profile or already recorded
-                                               if (not mysysdict.has_key(myfavkey)) and (not myfavdict.has_key(myfavkey)):
-                                                       #we don't have a favorites entry for this package yet; add one
-                                                       myfavdict[myfavkey]=myfavkey
-                                                       print ">>> Recording",myfavkey,"in \"world\" favorites file..."
-                       if not "--fetchonly" in myopts:
-                               portage.writedict(myfavdict,portage.root+portage.WORLD_FILE,writekey=0)
-
-                       portage.mtimedb["resume"]["mergelist"]=mymergelist[:]
-
-               # We need to yank the harmful-to-new-builds settings from features.
-               myorigfeat=self.pkgsettings["FEATURES"]
-               myfeat=myorigfeat.split()
-               while ("keeptemp" in myfeat):
-                       del myfeat[myfeat.index("keeptemp")]
-               while ("keepwork" in myfeat):
-                       del myfeat[myfeat.index("keepwork")]
-
-               self.pkgsettings["FEATURES"]=string.join(myfeat)
-
-               mergecount=0
-               if "--fetchonly" in myopts:
-                       mynewmergelist = []
-                       for x in mymergelist:
-                               if x[0] != "blocks":
-                                       mynewmergelist.append(x)
-                       mymergelist = mynewmergelist
-               for x in mymergelist:
-                       mergecount+=1
-                       myroot=x[1]
-                       pkgindex=2
-                       if x[0]=="blocks":
-                               pkgindex=3
-                       y=portage.portdb.findname(x[pkgindex])
-                       if not "--pretend" in myopts:
-                               print ">>> emerge ("+str(mergecount)+" of "+str(len(mymergelist))+")",x[pkgindex],"to",x[1]
-                               emergelog(" >>> emerge ("+str(mergecount)+" of "+str(len(mymergelist))+") "+x[pkgindex]+" to "+x[1])
-
-                       self.pkgsettings["EMERGE_FROM"] = x[0][:]
-                       self.pkgsettings.backup_changes("EMERGE_FROM")
-
-                       #buildsyspkg: Check if we need to _force_ binary package creation
-                       issyspkg = ("buildsyspkg" in myfeat) \
-                                       and x[0] != "blocks" \
-                                       and mysysdict.has_key(portage.cpv_getkey(x[2])) \
-                                       and not ("--buildpkg" in myopts)
-                       if x[0] in ["ebuild","blocks"]:
-                               if (x[0]=="blocks") and ("--fetchonly" not in myopts):
-                                       raise Exception, "Merging a blocker"
-                               elif ("--fetchonly" in myopts) or ("--fetch-all-uri" in myopts):
-                                       if x[0] == "blocks":
-                                               continue
-                                       if ("--fetch-all-uri" in myopts):
-                                               retval=portage.doebuild(y,"fetch",myroot,self.pkgsettings,edebug,("--pretend" in myopts),fetchonly=1,fetchall=1)
-                                       else:
-                                               retval=portage.doebuild(y,"fetch",myroot,self.pkgsettings,edebug,("--pretend" in myopts),fetchonly=1)
-                                       if (retval == None) or retval:
-                                               print
-                                               print "!!! Fetch for",y,"failed, continuing..."
-                                               print
-                                               returnme=1
-                                       continue
-                               elif "--buildpkg" in myopts or issyspkg:
-                                       #buildsyspkg: Sounds useful to display something, but I don't know if we should also log it
-                                       if issyspkg:
-                                               print ">>> This is a system package, let's pack a rescue tarball."
-                                               #emergelog(">>> This is a system package, let's pack a rescue tarball.")
-                                       #create pkg, then merge pkg
-                                       short_msg = "emerge: ("+str(mergecount)+" of "+str(len(mymergelist))+") "+x[pkgindex]+" Clean"
-                                       emergelog(" === ("+str(mergecount)+" of "+str(len(mymergelist))+") Cleaning ("+x[pkgindex]+"::"+y+")", short_msg=short_msg)
-                                       retval=portage.doebuild(y,"clean",myroot,self.pkgsettings,edebug,cleanup=1)
-                                       if (retval == None):
-                                               portage_util.writemsg("Unable to run required binary.\n")
-                                               sys.exit(127)
-                                       if retval:
-                                               sys.exit(retval)
-                                       short_msg = "emerge: ("+str(mergecount)+" of "+str(len(mymergelist))+") "+x[pkgindex]+" Compile"
-                                       emergelog(" === ("+str(mergecount)+" of "+str(len(mymergelist))+") Compiling/Packaging ("+x[pkgindex]+"::"+y+")", short_msg=short_msg)
-                                       retval=portage.doebuild(y,"package",myroot,self.pkgsettings,edebug)
-                                       if (retval == None):
-                                               portage_util.writemsg("Unable to run required binary.\n")
-                                               sys.exit(127)
-                                       if retval:
-                                               sys.exit(retval)
-                                       #dynamically update our database
-                                       if "--buildpkgonly" not in myopts:
-                                               portage.db[portage.root]["bintree"].inject(x[2])
-                                               mytbz2=portage.db[portage.root]["bintree"].getname(x[2])
-                                               short_msg = "emerge: ("+str(mergecount)+" of "+str(len(mymergelist))+") "+x[pkgindex]+" Merge"
-                                               emergelog(" === ("+str(mergecount)+" of "+str(len(mymergelist))+") Merging ("+x[pkgindex]+"::"+y+")", short_msg=short_msg)
-
-                                               self.pkgsettings["EMERGE_FROM"] = "binary"
-                                               self.pkgsettings.backup_changes("EMERGE_FROM")
-
-                                               retval=portage.pkgmerge(mytbz2,myroot,self.pkgsettings)
-                                               if retval==None:
-                                                       sys.exit(1)
-                               else:
-                                       short_msg = "emerge: ("+str(mergecount)+" of "+str(len(mymergelist))+") "+x[pkgindex]+" Clean"
-                                       emergelog(" === ("+str(mergecount)+" of "+str(len(mymergelist))+") Cleaning ("+x[pkgindex]+"::"+y+")", short_msg=short_msg)
-                                       retval=portage.doebuild(y,"clean",myroot,self.pkgsettings,edebug,cleanup=1)
-                                       if (retval == None):
-                                               portage_util.writemsg("Unable to run required binary.\n")
-                                               sys.exit(127)
-                                       if retval:
-                                               sys.exit(retval)
-                                       short_msg = "emerge: ("+str(mergecount)+" of "+str(len(mymergelist))+") "+x[pkgindex]+" Compile"
-                                       emergelog(" === ("+str(mergecount)+" of "+str(len(mymergelist))+") Compiling/Merging ("+x[pkgindex]+"::"+y+")", short_msg=short_msg)
-                                       retval=portage.doebuild(y,"merge",myroot,self.pkgsettings,edebug)
-                                       if (retval == None):
-                                               portage_util.writemsg("Unable to run required binary.\n")
-                                               sys.exit(127)
-                                       if retval:
-                                               sys.exit(retval)
-                                       #dynamically update our database
-                       elif x[0]=="binary":
-                               #merge the tbz2
-                               mytbz2=portage.db[portage.root]["bintree"].getname(x[2])
-                               if portage.db[portage.root]["bintree"].isremote(x[2]):
-                                       short_msg = "emerge: ("+str(mergecount)+" of "+str(len(mymergelist))+") "+x[pkgindex]+" Fetch"
-                                       emergelog(" --- ("+str(mergecount)+" of "+str(len(mymergelist))+") Fetching Binary ("+x[pkgindex]+"::"+mytbz2+")", short_msg=short_msg)
-                                       portage.db[portage.root]["bintree"].gettbz2(x[2])
-
-                               if ("--fetchonly" in myopts) or ("--fetch-all-uri" in myopts):
-                                       continue
-
-                               short_msg = "emerge: ("+str(mergecount)+" of "+str(len(mymergelist))+") "+x[pkgindex]+" Merge Binary"
-                               emergelog(" === ("+str(mergecount)+" of "+str(len(mymergelist))+") Merging Binary ("+x[pkgindex]+"::"+mytbz2+")", short_msg=short_msg)
-                               retval=portage.pkgmerge(mytbz2,x[1],self.pkgsettings)
-                               if retval==None:
-                                       sys.exit(1)
-                               #need to check for errors
-                       if "--buildpkgonly" not in myopts:
-                               portage.db[x[1]]["vartree"].inject(x[2])
-                               myfavkey=portage.cpv_getkey(x[2])
-                               if "--fetchonly" not in myopts and "--fetch-all-uri" not in myopts and myfavkey in favorites:
-                                       myfavs=portage.grabfile(myroot+portage.WORLD_FILE)
-                                       myfavdict=genericdict(myfavs)
-                                       mysysdict=genericdict(syslist)
-                                       #don't record if already in system profile or already recorded
-                                       if (not mysysdict.has_key(myfavkey)) and (not myfavdict.has_key(myfavkey)):
-                                               #we don't have a favorites entry for this package yet; add one
-                                               myfavdict[myfavkey]=myfavkey
-                                               print ">>> Recording",myfavkey,"in \"world\" favorites file..."
-                                               emergelog(" === ("+str(mergecount)+" of "+str(len(mymergelist))+") Updating world file ("+x[pkgindex]+")")
-                                               portage.writedict(myfavdict,myroot+portage.WORLD_FILE,writekey=0)
-
-                               if ("noclean" not in portage.features) and (x[0] != "binary"):
-                                       short_msg = "emerge: ("+str(mergecount)+" of "+str(len(mymergelist))+") "+x[pkgindex]+" Clean Post"
-                                       emergelog(" === ("+str(mergecount)+" of "+str(len(mymergelist))+") Post-Build Cleaning ("+x[pkgindex]+"::"+y+")", short_msg=short_msg)
-                                       retval=portage.doebuild(y,"clean",myroot,self.pkgsettings,edebug,cleanup=1)
-                                       if (retval == None):
-                                               portage_util.writemsg("Unable to run required binary.\n")
-                                               sys.exit(127)
-                                       if retval:
-                                               sys.exit(retval)
-
-                               if ("--pretend" not in myopts) and ("--fetchonly" not in myopts) and ("--fetch-all-uri" not in myopts):
-                                       # Clean the old package that we have merged over top of it.
-                                       if self.pkgsettings["AUTOCLEAN"]=="yes":
-                                               xsplit=portage.pkgsplit(x[2])
-                                               emergelog(" >>> AUTOCLEAN: "+xsplit[0])
-                                               retval=unmerge("clean", [xsplit[0]])
-                                               if not retval:
-                                                       emergelog(" --- AUTOCLEAN: Nothing unmerged.")
-
-                                       # Figure out if we need a restart.
-                                       mysplit=portage.pkgsplit(x[2])
-                                       if mysplit[0]=="sys-apps/portage":
-                                               myver=mysplit[1]+"-"+mysplit[2]
-                                               if myver[-3:]=='-r0':
-                                                       myver=myver[:-3]
-                                               if (myver != portage.VERSION) and \
-                                                  ("livecvsportage" not in portage.settings.features):
-                                                       if len(mymergelist) > mergecount:
-                                                               myargv=sys.argv
-                                                               myr=0
-                                                               for myra in range(len(myargv)):
-                                                                       if myargv[myr][0:len("portage")]=="portage":
-                                                                               del myargv[myr]
-                                                                               myr-=1
-                                                                       if myargv[myr][0:len("sys-apps/portage")]=="sys-apps/portage":
-                                                                               del myargv[myr]
-                                                                               myr-=1
-                                                                       myr+=1
-                                                               emergelog(" *** RESTARTING emerge via exec() after change of portage version.")
-                                                               portage.portageexit()
-                                                               # Remove --ask from options before restarting
-                                                               mynewargv=[]
-                                                               badlongopts = ["--ask","--tree","--changelog"]
-                                                               badshortopts = ["a","t","l"]
-                                                               for arg in myargv:
-                                                                       if arg[0:2] == "--":
-                                                                               if arg in badlongopts:
-                                                                                       continue
-                                                                               mynewargv += [arg]
-                                                                       elif arg[0] == "-":
-                                                                               myarg = "-"
-                                                                               for ch in arg[1:]:
-                                                                                       if ch in badshortopts:
-                                                                                               continue
-                                                                                       myarg += ch
-                                                                               mynewargv += [myarg]
-                                                                       else:
-                                                                               mynewargv += [arg]
-                                                               os.execv("/usr/lib/portage/bin/emerge", mynewargv)
-
-                       if ("--pretend" not in myopts) and ("--fetchonly" not in myopts) and ("--fetch-all-uri" not in myopts):
-                               emergelog(" ::: completed emerge ("+str(mergecount)+" of "+str(len(mymergelist))+") "+x[2]+" to "+x[1])
-
-                       # Unsafe for parallel merges
-                       del portage.mtimedb["resume"]["mergelist"][0]
-
-               emergelog(" *** Finished. Cleaning up...")
-
-               # We're out of the loop... We're done. Delete the resume data.
-               if portage.mtimedb.has_key("resume"):
-                       del portage.mtimedb["resume"]
-
-               if ("--pretend" not in myopts):
-                       if ("--fetchonly" not in myopts) and ("--fetch-all-uri" not in myopts):
-                               if (mergecount>0):
-                                       if retval:
-                                               portage.env_update()
-
-               #by doing an exit this way, --fetchonly can continue to try to
-               #fetch everything even if a particular download fails.
-               if "--fetchonly" in myopts or "--fetch-all-uri" in 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 unmerge(unmerge_action, unmerge_files):
-       candidate_catpkgs=[]
-       global_unmerge=0
-
-       realsyslist = getlist("system")
-       syslist = []
-       for x in realsyslist:
-               mycp = portage.dep_getkey(x)
-               if mycp in portage.settings.virtuals:
-                       syslist.extend(portage.settings.virtuals[mycp])
-               syslist.append(mycp)
-
-       global myopts
-       mysettings = portage.config(clone=portage.settings)
-
-       if not unmerge_files or "world" in unmerge_files or "system" in unmerge_files:
-               if "unmerge"==unmerge_action:
-                       print
-                       print bold("emerge unmerge")+" can only be used with specific package names, not with "+bold("world")+" or"
-                       print bold("system")+" targets."
-                       print
-                       return 0
-               else:
-                       global_unmerge=1
-
-       localtree=portage.db[portage.root]["vartree"]
-       # process all arguments and add all valid db entries to candidate_catpkgs
-       if global_unmerge:
-               if not unmerge_files or "world" in unmerge_files:
-                       candidate_catpkgs.extend(localtree.getallnodes())
-               elif "system" in unmerge_files:
-                       candidate_catpkgs.extend(getlist("system"))
-       else:
-               #we've got command-line arguments
-               if not unmerge_files:
-                       print "\nNo packages to unmerge have been provided.\n"
-                       return 0
-               for x in unmerge_files:
-                       arg_parts=x.split('/')
-                       if (x[0] not in [".","/"]) and (arg_parts[-1][-7:] != ".ebuild"):
-                               #possible cat/pkg or dep; treat as such
-                               candidate_catpkgs.append(x)
-                       elif unmerge_action in ["prune","clean"]:
-                               print "\n!!! Prune and clean do not accept individual ebuilds as arguments;\n    skipping.\n"
-                               continue
-                       else:
-                               # it appears that the user is specifying an installed ebuild and we're in "unmerge" mode, so it's
-                               # ok.
-                               if not os.path.exists(x):
-                                       print "\n!!! The path '"+x+"' doesn't exist.\n"
-                                       return 0
-
-                               absx   = os.path.abspath(x)
-                               sp_absx = absx.split("/")
-                               if sp_absx[-1][-7:] == ".ebuild":
-                                       del sp_absx[-1]
-                                       absx = string.join(sp_absx,"/")
-
-                               sp_absx_len = len(sp_absx)
-
-                               vdb_path = portage.root+portage.VDB_PATH
-                               vdb_len  = len(vdb_path)
-
-                               sp_vdb     = vdb_path.split("/")
-                               sp_vdb_len = len(sp_vdb)
-
-                               if not os.path.exists(absx+"/CONTENTS"):
-                                       print "!!! Not a valid db dir: "+str(absx)
-                                       return 0
-
-                               if sp_absx_len <= sp_vdb_len:
-                                       # The Path is shorter... so it can't be inside the vdb.
-                                       print spabsx
-                                       print absx
-                                       print "\n!!!",x,"cannot be inside "+(portage.root+portage.VDB_PATH)+"; aborting.\n"
-                                       return 0
-
-                               for idx in range(0,sp_vdb_len):
-                                       if (idx >= sp_absx_len) or (sp_vdb[idx] != sp_absx[idx]):
-                                               print sp_absx
-                                               print absx
-                                               print "\n!!!",x,"is not inside "+(portage.root+portage.VDB_PATH)+"; aborting.\n"
-                                               return 0
-
-                               print "="+string.join(sp_absx[sp_vdb_len:],"/")
-                               candidate_catpkgs.append("="+string.join(sp_absx[sp_vdb_len:],"/"))
-
-       if ("--pretend" in myopts) or ("--ask" in myopts):
-               print darkgreen("\n>>> These are the packages that I would unmerge:")
-
-       pkgmap={}
-       numselected=0
-       for x in candidate_catpkgs:
-               #cycle through all our candidate deps and determine what will and will not get unmerged
-               try:
-                       mymatch=localtree.dep_match(x)
-               except KeyError:
-                       mymatch=None
-               except ValueError, errpkgs:
-                       print "\n\n!!! The short ebuild name \"" + x + "\" is ambiguous.  Please specify"
-                       print "!!! one of the following fully-qualified ebuild names instead:\n"
-                       for i in errpkgs[0]:
-                               print "    " + green(i)
-                       print
-                       sys.exit(1)
-
-               if not mymatch and x[0] not in "<>=~":
-                       #add a "=" if missing
-                       mymatch=localtree.dep_match("="+x)
-               if not mymatch:
-                       print "\n--- Couldn't find " + white(x) + " to "+unmerge_action+"."
-                       continue
-               mykey=portage.key_expand(portage.dep_getkey(mymatch[0]),portage.db["/"]["vartree"].dbapi)
-               if not pkgmap.has_key(mykey):
-                       pkgmap[mykey]={"protected":[], "selected":[], "omitted":[] }
-               if unmerge_action=="unmerge":
-                               for y in mymatch:
-                                       if y not in pkgmap[mykey]["selected"]:
-                                               pkgmap[mykey]["selected"].append(y)
-                                               numselected=numselected+len(mymatch)
-
-               else:
-                       #unmerge_action in ["prune", clean"]
-                       slotmap={}
-                       for mypkg in mymatch:
-                               if unmerge_action=="clean":
-                                       myslot=localtree.getslot(mypkg)
-                               else:
-                                       #since we're pruning, we don't care about slots and put all the pkgs in together
-                                       myslot=0
-                               if not slotmap.has_key(myslot):
-                                       slotmap[myslot]={}
-                               slotmap[myslot][localtree.dbapi.cpv_counter(mypkg)]=mypkg
-                       for myslot in slotmap.keys():
-                               counterkeys=slotmap[myslot].keys()
-                               counterkeys.sort()
-                               if not counterkeys:
-                                       continue
-                               counterkeys.sort()
-                               pkgmap[mykey]["protected"].append(slotmap[myslot][counterkeys[-1]])
-                               del counterkeys[-1]
-                               #be pretty and get them in order of merge:
-                               for ckey in counterkeys:
-                                       pkgmap[mykey]["selected"].append(slotmap[myslot][ckey])
-                                       numselected=numselected+1
-                               #ok, now the last-merged package is protected, and the rest are selected
-       if global_unmerge and not numselected:
-               print "\n>>> No outdated packages were found on your system.\n"
-               return 0
-
-       if not numselected:
-               print "\n>>>",unmerge_action+": No packages selected for removal.\n"
-               return 0
-
-       for x in pkgmap.keys():
-               for y in localtree.dep_match(x):
-                       if y not in pkgmap[x]["omitted"] and \
-                          y not in pkgmap[x]["selected"] and \
-                          y not in pkgmap[x]["protected"]:
-                               pkgmap[x]["omitted"].append(y)
-               if global_unmerge and not pkgmap[x]["selected"]:
-                       #avoid cluttering the preview printout with stuff that isn't getting unmerged
-                       continue
-               if not (pkgmap[x]["protected"] or pkgmap[x]["omitted"]) and (x in syslist):
-                       print red("\a\n\n!!! '%s' is part of your system profile. '%s'" % (mykey))
-                       print yellow("\a!!! Unmerging it may be damaging to your system.\n")
-                       if "--pretend" not in myopts and "--ask" not in myopts:
-                               global EMERGE_WARNING_DELAY
-                               countdown(EMERGE_WARNING_DELAY,red("Press Ctrl-C to Stop"))
-               print "\n "+white(x)
-               for mytype in ["selected","protected","omitted"]:
-                       print string.rjust(mytype,12)+":",
-                       if pkgmap[x][mytype]:
-                               for mypkg in pkgmap[x][mytype]:
-                                       mysplit=portage.catpkgsplit(mypkg)
-                                       if mysplit[3]=="r0":
-                                               myversion=mysplit[2]
-                                       else:
-                                               myversion=mysplit[2]+"-"+mysplit[3]
-                                       if mytype=="selected":
-                                               print red(myversion),
-                                       else:
-                                               print green(myversion),
-                       else:
-                                       print "none",
-                       print
-
-       print "\n>>>",red("'Selected'"),"packages are slated for removal."
-       print ">>>",green("'Protected'"),"and",green("'omitted'"),"packages will not be removed.\n"
-
-       if "--pretend" in myopts:
-               #we're done... return
-               return 0
-       if "--ask" in myopts:
-               if userquery("Do you want me to unmerge these packages?")=="No":
-                       # enter pretend mode for correct formatting of results
-                       myopts+=["--pretend"]
-                       print
-                       print "Quitting."
-                       print
-                       return 0
-       #the real unmerging begins, after a short delay....
-
-       global CLEAN_DELAY
-       countdown(CLEAN_DELAY, ">>> Unmerging")
-
-       for x in pkgmap.keys():
-               for y in pkgmap[x]["selected"]:
-                       print ">>> Unmerging "+y+"..."
-                       emergelog("=== Unmerging... ("+y+")")
-                       mysplit=string.split(y,"/")
-                       #unmerge...
-                       retval=portage.unmerge(mysplit[0],mysplit[1],portage.root,mysettings,unmerge_action not in ["clean","prune"])
-                       if retval:
-                               emergelog(" !!! unmerge FAILURE: "+y)
-                       else:
-                               emergelog(" >>> unmerge success: "+y)
-       #run ldconfig, etc...
-       portage.env_update()
-       if not numselected:
-               return 0
-       else:
-               return 1
-
-
-def chk_updated_info_files(retval):
-       root=portage.root
-
-       infodirs=[]
-       infodirs.extend(string.split(portage.settings["INFOPATH"], ":"))
-       infodirs.extend(string.split(portage.settings["INFODIR"], ":"))
-
-       print
-       if os.path.exists("/usr/bin/install-info"):
-               regen_infodirs=[]
-               for z in infodirs:
-                       if z=='':
-                               continue
-                       inforoot=normpath(root+z)
-                       if os.path.isdir(inforoot):
-                               try:
-                                       infomtime=os.stat(inforoot)[ST_MTIME]
-                               except SystemExit, e:
-                                       raise # Needed else can't exit
-                               except:
-                                       infomtime=0
-
-                               if not portage.mtimedb.has_key("info"):
-                                       portage.mtimedb["info"]={}
-                               if portage.mtimedb["info"].has_key(inforoot):
-                                       if portage.mtimedb["info"][inforoot]==infomtime:
-                                               pass
-                                       else:
-                                               portage.mtimedb["info"][inforoot]=infomtime
-                                               regen_infodirs.append(inforoot)
-                               else:
-                                       regen_infodirs.append(inforoot)
-
-               if not regen_infodirs:
-                       print " "+green("*")+" GNU info directory index is up-to-date."
-               else:
-                       print " "+green("*")+" Regenerating GNU info directory index..."
-
-                       icount=0
-                       badcount=0
-                       for inforoot in regen_infodirs:
-                               if inforoot=='':
-                                       continue
-                               try:
-                                       os.rename(inforoot+"/dir",inforoot+"/dir.old")
-                               except SystemExit, e:
-                                       raise # Needed else can't exit
-                               except:
-                                       pass
-
-                               if not os.path.isdir(inforoot):
-                                       continue
-                               errmsg = ""
-                               for x in os.listdir(inforoot):
-                                       if (x[0] == ".") or (x in ["dir","dir.old"]) or (os.path.isdir(inforoot+"/"+x)):
-                                               continue
-                                       myso=commands.getstatusoutput("LANG=C LANGUAGE=C /usr/bin/install-info --dir-file="+inforoot+"/dir "+inforoot+"/"+x)[1]
-                                       existsstr="already exists, for file `"
-                                       if myso!="":
-                                               if re.search(existsstr,myso):
-                                                       # Already exists... Don't increment the count for this.
-                                                       pass
-                                               elif myso[:44]=="install-info: warning: no info dir entry in ":
-                                                       # This info file doesn't contain a DIR-header: install-info produces this
-                                                       # (harmless) warning (the --quiet switch doesn't seem to work).
-                                                       # Don't increment the count for this.
-                                                       pass
-                                               else:
-                                                       badcount=badcount+1
-                                                       errmsg += myso + "\n"
-                                       icount=icount+1
-
-                               #update mtime so we can potentially avoid regenerating.
-                               portage.mtimedb["info"][inforoot]=os.stat(inforoot)[ST_MTIME]
-
-                       if badcount:
-                               print " "+yellow("*")+" Processed",icount,"info files;",badcount,"errors."
-                               print errmsg
-                       else:
-                               print " "+green("*")+" Processed",icount,"info files."
-
-
-def post_emerge(retval=0):
-       global myopts
-       os.chdir("/")
-       if "--pretend" in myopts:
-               sys.exit(retval)
-
-       emergelog(" *** exiting successfully.")
-
-       if "noinfo" not in portage.settings.features:
-               chk_updated_info_files(retval)
-
-       chk_updated_cfg_files()
-       sys.exit(retval)
-
-
-def chk_updated_cfg_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 " "+yellow("*")+" Type "+green("emerge --help config")+" to learn how to update config files."
-               print
-
-# general options that should be taken into account before any action
-if "--debug" in myopts:
-       edebug=1
-
-if myaction in ["sync","rsync","metadata"] and (not "--help" in myopts):
-       if "--pretend" in myopts:
-               print "emerge: \"sync\" actions do not support \"--pretend.\""
-               sys.exit(1)
-
-       emergelog(" === "+str(myaction))
-       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)
-       syncuri=string.rstrip(portage.settings["SYNC"])
-       os.umask(0022)
-       if myaction == "metadata":
-               if "--ask" in myopts:
-                       if userquery("Are you sure?") == "No":
-                               sys.exit(1)
-               print "skipping sync"
-               updatecache_flg = True
-               tmpservertimestampfile = None
-       elif syncuri[:8]=="rsync://":
-               if not os.path.exists("/usr/bin/rsync"):
-                       print "!!! /usr/bin/rsync does not exist, so rsync support is disabled."
-                       print "!!! Type \"emerge net-misc/rsync\" to enable rsync support."
-                       sys.exit(1)
-               mytimeout=180
-               if portage.settings.has_key("RSYNC_TIMEOUT"):
-                       try:
-                               mytimeout=int(portage.settings["RSYNC_TIMEOUT"])
-                       except SystemExit, e:
-                               raise # Needed else can't exit
-                       except:
-                               pass
-
-               rsync_flags = [
-                       "--recursive",    # Recurse directories
-                       "--links",        # Consider symlinks
-                       "--safe-links",   # Ignore links outside of tree
-                       "--perms",        # Preserve permissions
-                       "--times",        # Preserive mod times
-                       "--compress",     # Compress the data transmitted
-                       "--force",        # Force deletion on non-empty dirs
-                       "--whole-file",   # Don't do block transfers, only entire files
-                       "--delete",       # Delete files that aren't in the master tree
-                       "--delete-after", # Delete only after everything else is done
-                       "--stats",        # Show final statistics about what was transfered
-      "--timeout="+str(mytimeout), # IO timeout if not done in X seconds
-                       "--exclude='/distfiles'",   # Exclude distfiles from consideration
-                       "--exclude='/local'",       # Exclude local     from consideration
-                       "--exclude='/packages'",    # Exclude packages  from consideration
-               ]
-
-               if "--quiet" in myopts:
-                       rsync_flags.append("--quiet")    # Shut up a lot
-               else:
-                       rsync_flags.append("--progress") # Progress meter for each file
-
-               if "--verbose" in myopts:
-                       rsync_flags.append("--verbose")  # More noise? Not really sure what
-
-               if "--debug" in myopts:
-                       rsync_flags.append("--checksum") # Force checksum on all files
-
-               if portage.settings.has_key("RSYNC_EXCLUDEFROM"):
-                       if os.path.exists(portage.settings["RSYNC_EXCLUDEFROM"]):
-                               rsync_flags.append("--exclude-from="+portage.settings["RSYNC_EXCLUDEFROM"])
-                       else:
-                               print "!!! RSYNC_EXCLUDEFROM specified, but file does not exist."
-
-               if portage.settings.has_key("RSYNC_RATELIMIT"):
-                       rsync_flags.append("--bwlimit="+portage.settings["RSYNC_RATELIMIT"])
-
-               rsynccommand = "/usr/bin/rsync " + string.join(rsync_flags, " ")
-
-               servertimestampdir  = portage.settings.depcachedir+"/"
-               servertimestampfile = portage.settings.depcachedir+"/timestamp.chk"
-               tmpservertimestampdir  = portage.settings["PORTAGE_TMPDIR"]+"/"
-               tmpservertimestampfile = portage.settings["PORTAGE_TMPDIR"]+"/timestamp.chk"
-
-               # We only use the backup if a timestamp exists in the portdir.
-               content=None
-               if os.path.exists(myportdir+"/metadata/timestamp.chk"):
-                       content=portage.grabfile(servertimestampfile)
-               if (not content):
-                       content=portage.grabfile(myportdir+"/metadata/timestamp.chk")
-
-               if (content):
-                       try:
-                               mytimestamp=time.mktime(time.strptime(content[0], "%a, %d %b %Y %H:%M:%S +0000"))
-                       except ValueError:
-                               mytimestamp=0
-               else:
-                       mytimestamp=0
-
-               if not os.path.exists(servertimestampdir):
-                       os.mkdir(servertimestampdir)
-                       os.chown(servertimestampdir, os.getuid(), portage.portage_gid)
-                       os.chmod(servertimestampdir, 02775)
-
-               #exitcode=0
-               try:
-                       maxretries=int(portage.settings["RSYNC_RETRIES"])
-               except SystemExit, e:
-                       raise # Needed else can't exit
-               except:
-                       maxretries=3 #default number of retries
-
-               retries=0
-               hostname, port=re.split("rsync://([^:/]*)(:[0-9]+)?", syncuri)[1:3];
-               if port==None:
-                       port=""
-               updatecache_flg=True
-
-               ips=[]
-               while (1):
-                       if ips:
-                               del ips[0]
-                       if ips==[]:
-                               try:
-                                       ips=socket.gethostbyname_ex(hostname)[2]
-                               except SystemExit, e:
-                                       raise # Needed else can't exit
-                               except Exception, e:
-                                       print "Notice:",str(e)
-                                       dosyncuri=syncuri
-
-                       if ips:
-                               try:
-                                       dosyncuri=string.replace(syncuri, "//"+hostname+port+"/", "//"+ips[0]+port+"/", 1)
-                               except SystemExit, e:
-                                       raise # Needed else can't exit
-                               except Exception, e:
-                                       print "Notice:",str(e)
-                                       dosyncuri=syncuri
-
-                       if (retries==0):
-                               if "--ask" in myopts:
-                                       if userquery("Do you want to sync your Portage tree with the mirror at\n" + blue(dosyncuri) + bold("?"))=="No":
-                                               print
-                                               print "Quitting."
-                                               print
-                                               sys.exit(0)
-                               emergelog(">>> starting rsync with "+dosyncuri)
-                               if "--quiet" not in myopts:
-                                       print ">>> starting rsync with "+dosyncuri+"..."
-                       else:
-                               emergelog(">>> Starting retry %d of %d with %s" % (retries,maxretries,dosyncuri))
-                               print "\n\n>>> Starting retry %d of %d with %s" % (retries,maxretries,dosyncuri)
-
-                       if "--quiet" not in myopts:
-                               print ">>> checking server timestamp ..."
-                       mycommand=rsynccommand+" "+dosyncuri+"/metadata/timestamp.chk "+tmpservertimestampdir
-                       exitcode=portage.spawn(mycommand,portage.settings,free=1)
-                       if (exitcode==0):
-                               try:
-                                       servertimestamp = time.mktime(time.strptime(portage.grabfile(tmpservertimestampfile)[0], "%a, %d %b %Y %H:%M:%S +0000"))
-                               except SystemExit, e:
-                                       raise # Needed else can't exit
-                               except:
-                                       servertimestamp = 0
-
-                               if (servertimestamp != 0) and (servertimestamp == mytimestamp):
-                                       emergelog(">>> Cancelling sync -- Already current.")
-                                       print
-                                       print ">>>"
-                                       print ">>> Timestamps on the server and in the local repository are the same."
-                                       print ">>> Cancelling all further sync action. You are already up to date."
-                                       print ">>>"
-                                       print
-                                       sys.exit(0)
-                               elif (servertimestamp != 0) and (servertimestamp < mytimestamp):
-                                       emergelog(">>> Server out of date: %s" % dosyncuri)
-                                       print
-                                       print ">>>"
-                                       print ">>> SERVER OUT OF DATE: %s" % dosyncuri
-                                       print ">>>"
-                                       print
-                               elif (servertimestamp == 0) or (servertimestamp > mytimestamp):
-                                       # actual sync
-                                       mycommand=rsynccommand+" "+dosyncuri+"/ "+myportdir
-                                       exitcode=portage.spawn(mycommand,portage.settings,free=1)
-                                       if exitcode in [0,1,2,3,4,11,14,20,21]:
-                                               break
-                       elif exitcode in [0,1,2,3,4,11,14,20,21]:
-                               break
-
-                       retries=retries+1
-
-                       if retries<=maxretries:
-                               print ">>> retry ..."
-                               time.sleep(11)
-                       else:
-                               # over retries
-                               # exit loop
-                               updatecache_flg=False
-                               break
-
-               if (exitcode==0):
-                       emergelog("=== Sync completed with %s" % dosyncuri)
-               elif (exitcode>0):
-                       print
-                       if exitcode==1:
-                               print darkred("!!!")+green(" Rsync has reported that there is a syntax error. Please ensure")
-                               print darkred("!!!")+green(" that your SYNC statement is proper.")
-                               print darkred("!!!")+green(" SYNC="+portage.settings["SYNC"])
-                       elif exitcode==11:
-                               print darkred("!!!")+green(" Rsync has reported that there is a File IO error. Normally")
-                               print darkred("!!!")+green(" this means your disk is full, but can be caused by corruption")
-                               print darkred("!!!")+green(" on the filesystem that contains PORTDIR. Please investigate")
-                               print darkred("!!!")+green(" and try again after the problem has been fixed.")
-                               print darkred("!!!")+green(" PORTDIR="+portage.settings["PORTDIR"])
-                       elif exitcode==20:
-                               print darkred("!!!")+green(" Rsync was killed before it finished.")
-                       else:
-                               print darkred("!!!")+green(" Rsync has not successfully finished. It is recommended that you keep")
-                               print darkred("!!!")+green(" trying or that you use the 'emerge-webrsync' option if you are unable")
-                               print darkred("!!!")+green(" to use rsync due to firewall or other restrictions. This should be a")
-                               print darkred("!!!")+green(" temporary problem unless complications exist with your network")
-                               print darkred("!!!")+green(" (and possibly your system's filesystem) configuration.")
-                       print
-                       sys.exit(exitcode)
-       elif syncuri[:6]=="cvs://":
-               if not os.path.exists("/usr/bin/cvs"):
-                       print "!!! /usr/bin/cvs does not exist, so rsync support is disabled."
-                       print "!!! Type \"emerge dev-util/cvs\" to enable CVS support."
-                       sys.exit(1)
-               cvsroot=syncuri[6:]
-               cvsdir=os.path.dirname(myportdir)
-               if not os.path.exists(myportdir+"/CVS"):
-                       #initial checkout
-                       print ">>> starting initial cvs checkout with "+syncuri+"..."
-                       if not portage.spawn("cd "+cvsdir+"; cvs -d "+cvsroot+" login",portage.settings,free=1):
-                               print "!!! cvs login error; exiting."
-                               sys.exit(1)
-                       if os.path.exists(cvsdir+"/gentoo-x86"):
-                               print "!!! existing",cvsdir+"/gentoo-x86 directory; exiting."
-                               sys.exit(1)
-                       if not portage.spawn("cd "+cvsdir+"; cvs -z0 -d "+cvsroot+" co -P gentoo-x86",portage.settings,free=1):
-                               print "!!! cvs checkout error; exiting."
-                               sys.exit(1)
-                       if cvsdir!=myportdir:
-                               portage.movefile(cvsdir,portage.settings["PORTDIR"])
-                       sys.exit(0)
-               else:
-                       #cvs update
-                       print ">>> starting cvs update with "+syncuri+"..."
-                       sys.exit(portage.spawn("cd "+myportdir+"; cvs -z0 -q update -dP",portage.settings,free=1))
-       else:
-               print "!!! rsync setting: ",syncuri,"not recognized; exiting."
-               sys.exit(1)
-
-       try: # Prevent users from affecting ebuild.sh.
-               os.close(sys.stdin.fileno())
-       except SystemExit, e:
-               raise # Needed else can't exit
-       except:
-               pass
-
-       if os.path.exists(myportdir+"/metadata/cache") and updatecache_flg:
-               if "--quiet" not in myopts:
-                       print "\n>>> Updating Portage cache:      ",
-               os.umask(0002)
-               cachedir = os.path.normpath(portage.settings.depcachedir)
-               if cachedir in ["/",    "/bin", "/dev",  "/etc",  "/home",
-                               "/lib", "/opt", "/proc", "/root", "/sbin",
-                               "/sys", "/tmp", "/usr",  "/var"]:
-                       print "!!! PORTAGE_CACHEDIR IS SET TO A PRIMARY ROOT DIRECTORY ON YOUR SYSTEM."
-                       print "!!! This is ALMOST CERTAINLY NOT what you want: "+str(cachedir)
-                       sys.exit(73)
-               if not os.path.exists(cachedir):
-                       os.mkdir(cachedir)
-
-               # Potentially bad
-               #if os.path.exists(cachedir+"/"+myportdir):
-               #       portage.spawn("rm -Rf "+cachedir+"/"+myportdir+"/*",portage.settings,free=1)
-
-               # save timestamp.chk for next timestamp check.
-               try:
-                       if tmpservertimestampfile != None:
-                               portage.movefile(tmpservertimestampfile, servertimestampfile)
-               except SystemExit, e:
-                       raise # Needed else can't exit
-               except Exception, e:
-                       print "!!! Failed to save current timestamp."
-                       print "!!!",e
-
-               portage.portdb.flush_cache()
-
-               try:
-                       os.umask(002)
-                       os.chown(cachedir, os.getuid(), portage.portage_gid)
-                       os.chmod(cachedir, 02775)
-               except SystemExit, e:
-                       raise # Needed else can't exit
-               except:
-                       pass
-               # we don't make overlay trees cache here.
-               backup_porttrees=portage.portdb.porttrees
-               porttree_root = portage.portdb.porttree_root
-               portage.portdb.porttrees=[porttree_root]
-               cp_list=portage.portdb.cp_all()
-               cp_list.sort()
-               pcnt=0
-               pcntstr=""
-               pcntcount=len(cp_list)/100.0
-               nextupdate=pcntcount
-               current=1
-               def cleanse_cache(cat, saves, porttree_root=porttree_root):
-                       if len(saves):
-                               d={}
-                               for v in saves:
-                                       d[portage.catsplit(v)[1]] = True
-                               for pv in portage.db["/"]["porttree"].dbapi.auxdb[porttree_root][cat].keys():
-                                       if pv not in d:
-                                               portage.db["/"]["porttree"].dbapi.auxdb[porttree_root][cat].del_key(pv)
-                       else:
-                               portage.db["/"]["porttree"].dbapi.auxdb[porttree_root][cat].clear()
-                               del portage.db["/"]["porttree"].dbapi.auxdb[porttree_root][cat]
-               savelist = []
-               catlist = []
-               oldcat = portage.catsplit(cp_list[0])[0]
-               for cp in cp_list:
-                       current += 1
-                       if current >= nextupdate:
-                               pcnt += 1
-                               nextupdate += pcntcount
-                               if "--quiet" not in myopts:
-                                       pcntstr = str(pcnt)
-                                       sys.stdout.write("\b"*(len(pcntstr)+1)+pcntstr+"%")
-                                       sys.stdout.flush()
-                       cat = portage.catsplit(cp)[0]
-                       if cat != oldcat:
-                               catlist.append(oldcat)
-                               cleanse_cache(oldcat, savelist)
-                               savelist = []
-                               oldcat = cat
-                       mymatches = portage.db["/"]["porttree"].dbapi.xmatch("match-all", cp)
-                       savelist.extend(mymatches)
-                       for cpv in mymatches:
-                               try: portage.db["/"]["porttree"].dbapi.aux_get(cpv, ["IUSE"],metacachedir=myportdir+"/metadata/cache",debug=("cachedebug" in portage.features))
-                               except SystemExit: raise
-                               except Exception, e: print "\nFailed cache update:",cpv,e
-               catlist.append(oldcat)
-               catlist.append("local")
-               cleanse_cache(oldcat, savelist)
-               filelist = portage.listdir(cachedir+"/"+myportdir)
-               for x in filelist:
-                       found = False
-                       for y in catlist:
-                               if x.startswith(y):
-                                       found = True
-                                       break
-                       if not found:
-                               portage.spawn("cd /; rm -Rf "+cachedir+"/"+myportdir+"/"+x,portage.settings,free=1,droppriv=1)
-
-
-               portage.portdb.porttrees=backup_porttrees
-               sys.stdout.write("\n\n")
-               sys.stdout.flush()
-
-       portage.portageexit()
-       reload(portage)
-       mybestpv=portage.portdb.xmatch("bestmatch-visible","sys-apps/portage")
-       mypvs=portage.best(portage.db[portage.root]["vartree"].dbapi.match("sys-apps/portage"))
-
-       chk_updated_cfg_files()
-
-       if(mybestpv != mypvs):
-               print
-               print red(" * ")+bold("An update to portage is available.")+" It is _highly_ recommended"
-               print red(" * ")+"that you update portage now, before any other packages are updated."
-               print red(" * ")+"Please do so and then update "+bold("ALL")+" of your configuration files."
-               print
-elif myaction=="regen":
-       emergelog(" === regen")
-       #regenerate cache entries
-       print "Regenerating cache entries... "
-       try:
-               os.close(sys.stdin.fileno())
-       except SystemExit, e:
-               raise # Needed else can't exit
-       except:
-               pass
-       sys.stdout.flush()
-       mynodes=portage.portdb.cp_all()
-       for x in mynodes:
-               mymatches=portage.portdb.xmatch("match-all",x)
-               if not "--quiet" in myopts:
-                       print "processing",x
-               for y in mymatches:
-                       try:
-                               foo=portage.portdb.aux_get(y,["DEPEND"],debug=1)
-                       except SystemExit, e:
-                               # sys.exit is an exception... And consequently, we can't catch it.
-                               raise
-                       except Exception, e:
-                               print "\n  error processing %(cpv)s, continuing... (%(e)s)" % {"cpv":y,"e":str(e)}
-       print "done!"
-# HELP action
-elif "config"==myaction:
-       if len(myfiles) != 1 or "system" in myfiles or "world" in myfiles:
-               print red("!!! config can only take a single package atom at this time\n")
-               sys.exit(1)
-
-       print
-       pkgs = portage.db[portage.root]["vartree"].dbapi.match(myfiles[0])
-       if len(pkgs) == 0:
-               print "No packages found.\n"
-               sys.exit(0)
-       elif len(pkgs) > 1:
-               if "--ask" in myopts:
-                       options = []
-                       print "Please select a package to configure:"
-                       idx = 0
-                       for pkg in pkgs:
-                               idx += 1
-                               options.append(str(idx))
-                               print options[-1]+") "+pkg
-                       print "X) Cancel"
-                       options.append("X")
-                       idx = userquery("Selection?", options)
-                       if idx == "X":
-                               sys.exit(0)
-                       pkg = pkgs[int(idx)-1]
-               else:
-                       print "The following packages available:"
-                       for pkg in pkgs:
-                               print "* "+pkg
-                       print "\nPlease use a specific atom or the --ask option."
-                       sys.exit(1)
-       else:
-               pkg = pkgs[0]
-
-       print
-       if "--ask" in myopts:
-               if userquery("Ready to configure "+pkg+"?") == "No":
-                       sys.exit(0)
-       else:
-               print "Configuring pkg..."
-       print
-       ebuildpath = portage.db[portage.root]["vartree"].dbapi.findname(pkg)
-       mysettings = portage.config(clone=portage.settings)
-       portage.doebuild(ebuildpath,"config",portage.root,mysettings,debug=("--debug" in myopts),cleanup=True)
-       print
-
-# INFO action
-elif "info"==myaction:
-       unameout=commands.getstatusoutput("uname -mrp")[1]
-       print getportageversion()
-       print "================================================================="
-       print "System uname: "+unameout
-       if os.path.exists("/etc/gentoo-release"):
-               os.system("cat /etc/gentoo-release")
-       else:
-               print "Unknown Host Operating System"
-
-       output=commands.getstatusoutput("distcc --version")
-       if not output[0]:
-               print str(string.split(output[1],"\n",1)[0]),
-               if "distcc" in portage.features:
-                       print "[enabled]"
-               else:
-                       print "[disabled]"
-
-       output=commands.getstatusoutput("ccache -V")
-       if not output[0]:
-               print str(string.split(output[1],"\n",1)[0]),
-               if "ccache" in portage.features:
-                       print "[enabled]"
-               else:
-                       print "[disabled]"
-
-       myvars  = ["sys-devel/autoconf", "sys-devel/automake", "virtual/os-headers",
-                  "sys-devel/binutils", "sys-devel/libtool",  "dev-lang/python"]
-       myvars += portage_util.grabfile(portage.settings["PORTDIR"]+"/profiles/info_pkgs")
-       myvars  = portage_util.unique_array(myvars)
-       myvars.sort()
-
-       for x in myvars:
-               if portage.isvalidatom(x):
-                       pkg_matches = portage.db["/"]["vartree"].dbapi.match(x)
-                       pkgs = []
-                       for y in pkg_matches:
-                               mycpv   = portage.catpkgsplit(y)
-                               if(mycpv[3] != "r0"):
-                                       pkgs += [mycpv[2] + "-" + mycpv[3]]
-                               else:
-                                       pkgs += [mycpv[2]]
-                       if not pkgs:
-                               pkgs = "[Not Present]"
-                       else:
-                               pkgs = ", ".join(sorted_versions(pkgs))
-                       print "%-20s %s" % (x+":", pkgs)
-               else:
-                       print "%-20s %s" % (x+":", "[NOT VALID]")
-
-       libtool_vers = string.join(portage.db["/"]["vartree"].dbapi.match("sys-devel/libtool"), ",")
-
-       if "--verbose" in myopts:
-               myvars=portage.settings.keys()
-       else:
-               myvars = ['GENTOO_MIRRORS', 'CONFIG_PROTECT', 'CONFIG_PROTECT_MASK',
-                         'PORTDIR', 'DISTDIR', 'PKGDIR', 'PORTAGE_TMPDIR',
-                         'PORTDIR_OVERLAY', 'USE', 'CHOST', 'CFLAGS', 'CXXFLAGS',
-                         'ACCEPT_KEYWORDS', 'SYNC', 'FEATURES']
-
-               myvars.extend(portage_util.grabfile(portage.settings["PORTDIR"]+"/profiles/info_vars"))
-
-       myvars = portage_util.unique_array(myvars)
-       unset_vars = []
-       myvars.sort()
-       for x in myvars:
-               if portage.settings.has_key(x):
-                       print x+'="'+portage.settings[x]+'"'
-               else:
-                       unset_vars.append(x)
-       if unset_vars:
-               print "Unset:  "+", ".join(unset_vars)
-       print
-
-       if "--debug" in myopts:
-               for x in dir(portage):
-                       module = getattr(portage, x)
-                       if "cvs_id_string" in dir(module):
-                               print "%s: %s" % (str(x), str(module.cvs_id_string))
-
-# SEARCH action
-elif "search"==myaction:
-       if not myfiles:
-               print "emerge: no search terms provided."
-       else:
-               searchinstance = search()
-               for mysearch in myfiles:
-                       try:
-                               searchinstance.execute(mysearch)
-                       except re.error, comment:
-                               print "\n!!! Regular expression error in \"%s\": %s" % ( mysearch, comment )
-                               sys.exit(1)
-                       searchinstance.output()
-elif "inject"==myaction:
-       if not myfiles:
-               print "emerge: please specify at least one cat/pkg-ver to inject."
-               sys.exit(1)
-       if "--pretend" in myopts:
-               print "emerge: the \"inject\" action does not support \"--pretend.\""
-               sys.exit(1)
-       for x in myfiles:
-               if x[0] in [">","<","=","!"]:
-                       print "!!! '"+x+"' is an invalid specification."
-                       print "!!! Must be 'category/package-version' with no other symbols."
-                       print
-                       continue
-               mycps=portage.catpkgsplit(x)
-               if (not mycps) or (mycps[0]=="null"):
-                       print "!!!",x,"is not a specific cat/pkg-version, skipping..."
-                       continue
-               if portage.db["/"]["vartree"].exists_specific(x):
-                       print "!!! Not injecting",x+"; Package already exists."
-               else:
-                       if "--ask" in myopts:
-                               if userquery("Do you want to inject the package %s?" % x)=="No":
-                                       print
-                                       print "Quitting."
-                                       print
-                                       sys.exit(0)
-                       portage.db["/"]["vartree"].dbapi.cpv_inject(x)
-                       print ">>> Injected",x+"."
-                       emergelog(" === inject: "+x)
-elif "unmerge"==myaction or "prune"==myaction or "clean"==myaction:
-       if 1==unmerge(myaction, myfiles):
-               post_emerge()
-
-elif "depclean"==myaction:
-       # Kill packages that aren't explicitly merged or are required as a
-       # dependency of another package. World file is explicit.
-
-       print
-       print red("*** WARNING ***")+" : DEPCLEAN CAN  SERIOUSLY  IMPAIR YOUR SYSTEM. USE CAUTION."
-       print red("*** WARNING ***")+" : (Cancel: CONTROL-C) -- ALWAYS VERIFY ALL PACKAGES IN THE"
-       print red("*** WARNING ***")+" : CANDIDATE LIST FOR  SANITY  BEFORE  ALLOWING DEPCLEAN TO"
-       print red("*** WARNING ***")+" : UNMERGE ANY PACKAGES."
-       print red("*** WARNING ***")+" :"
-       print red("*** WARNING ***")+" : USE FLAGS MAY HAVE AN EXTREME EFFECT ON THE OUTPUT."
-       print red("*** WARNING ***")+" : SOME LIBRARIES MAY BE USED BY PACKAGES BUT ARE NOT"
-       print red("*** WARNING ***")+" : CONSIDERED TO BE A DEPEND DUE TO USE FLAG SETTINGS."
-       print red("*** WARNING ***")+" : emerge --update --deep --newuse world TO VERIFY"
-       print red("*** WARNING ***")+" : SANITY IN THIS REGARD."
-       print red("*** WARNING ***")+" :"
-       print red("*** WARNING ***")+" : Packages  in the list  that are  desired  may be added"
-       print red("*** WARNING ***")+" : directly to the world file to cause them to be ignored"
-       print red("*** WARNING ***")+" : by depclean and maintained in the future. BREAKAGES DUE"
-       print red("*** WARNING ***")+" : TO UNMERGING AN  ==IN-USE LIBRARY==  MAY BE REPAIRED BY"
-       print red("*** WARNING ***")+" : MERGING  *** THE PACKAGE THAT COMPLAINS ***  ABOUT THE"
-       print red("*** WARNING ***")+" : MISSING LIBRARY."
-       print
-       if ("--pretend" not in myopts) and ("--ask" not in myopts):
-               countdown(EMERGE_WARNING_DELAY, ">>> Depclean")
-               emergelog(" >>> depclean")
-
-       mydepgraph=depgraph(myaction,myopts)
-       syslist=getlist("system")
-       worldlist=getlist("world")
-
-       print "Calculating",myaction,"dependencies  ",
-       if not mydepgraph.xcreate("world"):
-               print "\n!!! Failed to create deptree."
-               sys.exit(1)
-       print "\b\b ... done!"
-
-       if ("--usepkgonly" in myopts) and mydepgraph.missingbins:
-               sys.stderr.write(red("The following binaries are not available for merging...\n"))
-               for x in mydepgraph.missingbins:
-                       sys.stderr.write("   "+str(x)+"\n")
-               sys.stderr.write("\nThese are required by '--usepkgonly' -- Terminating.\n\n")
-               sys.exit(1)
-
-       alldeps=mydepgraph.digraph.allnodes()
-       myvarlist=portage.vardbapi(portage.root).cp_all()
-
-       if not syslist:
-               print "!!! You have no system list. Cannot determine system from world."
-       if not worldlist:
-               print "!!! You have no world file. Cannot determine explicit merges."
-       if not myvarlist:
-               print "!!! You have no installed package tree (%s). This is a problem." % portage.VDB_PATH
-       if not alldeps:
-               print "!!! You have no dependencies. Impossible. Bug."
-
-       if not (syslist and worldlist and myvarlist and alldeps):
-               print
-               sys.exit(1)
-
-       reallist=[]
-       for x in alldeps:
-               myparts=portage.catpkgsplit(string.split(x)[2])
-               if not myparts:
-                       sys.stderr.write(
-                         red("!!! There appears to be a problem with the following package:\n")+
-                               red("!!! "+str(string.split(x)[2])+"\n\n")+
-                                   "!!! Please ensure that blocking/conflicting packages are not merged."+
-                                               "!!! 'emerge -p "+str(string.split(x)[2])+"\n\n")
-                       if ("--pretend" not in myopts) and ("--ask" not in myopts):
-                               countdown(EMERGE_WARNING_DELAY, "*** Continuing")
-                       continue
-
-               catpack=myparts[0]+"/"+myparts[1]
-               if catpack not in reallist:
-                       reallist.append(catpack)
-
-       cleanlist=[]
-       for x in myvarlist:
-               if x not in reallist:
-                       if x not in cleanlist:
-                               cleanlist.append(x)
-
-       for x in syslist+worldlist:
-               myparts = portage.catpkgsplit(x)
-               if myparts:
-                       if myparts[0][0] in ('<','>','='):
-                               myparts[0] = myparts[0][1:]
-                       if myparts[0][0] in ('<','>','='):
-                               myparts[0] = myparts[0][1:]
-                       catpack=myparts[0]+"/"+myparts[1]
-               else:
-                       catpack=x
-               if catpack in cleanlist:
-                       cleanlist.remove(catpack)
-
-       #print "\n\n\nCleaning: "
-       #for x in cleanlist:
-       #       print x
-       #print
-
-       if len(cleanlist):
-               unmerge("unmerge", cleanlist)
-
-       print
-       print "Packages installed:   "+str(len(myvarlist))
-       print "Packages in world:    "+str(len(worldlist))
-       print "Packages in system:   "+str(len(syslist))
-       print "Unique package names: "+str(len(reallist))
-       print "Required packages:    "+str(len(alldeps))
-       if "--pretend" in myopts:
-               print "Number to remove:     "+str(len(cleanlist))
-       else:
-               print "Number removed:       "+str(len(cleanlist))
-               post_emerge()
-
-# "update", "system", or just process files:
-else:
-       favorites=[]
-       syslist=getlist("system")
-       if (("--pretend" in myopts) and not ("--fetchonly" in myopts or "--fetch-all-uri" in myopts)) or ("--ask" in myopts):
-               if "--tree" in myopts:
-                       print
-                       print darkgreen("These are the packages that I would merge, in reverse order:")
-                       print
-               else:
-                       print
-                       print darkgreen("These are the packages that I would merge, in order:")
-                       print
-
-       if ("--resume" in myopts) and portage.mtimedb.has_key("resume"):
-               myresumeopts=portage.mtimedb["resume"]["myopts"][:]
-
-               while "--skipfirst" in myresumeopts:
-                       myresumeopts.remove("--skipfirst")
-               while "--ask" in myresumeopts:
-                       myresumeopts.remove("--ask")
-
-               for myopt in myopts:
-                       if myopt not in myresumeopts:
-                               myresumeopts.append(myopt)
-               myopts=myresumeopts
-               mydepgraph=depgraph("resume",myopts)
-               if "--resume" not in myopts:
-                       myopts+=["--resume"]
-       else:
-               if ("--resume" in myopts):
-                       del myopts[myopts.index("--resume")]
-                       print darkgreen("emerge: It seems we have nothing to resume...")
-                       sys.exit(0)
-
-               mydepgraph=depgraph(myaction,myopts)
-               if myaction in ["system","world"]:
-                       print "Calculating",myaction,"dependencies  ",
-                       sys.stdout.flush()
-                       if not mydepgraph.xcreate(myaction):
-                               print "!!! Depgraph creation failed."
-                               sys.exit(1)
-                       print "\b\b ...done!"
-               else:
-                       if not myfiles:
-                               print "emerge: please tell me what to do."
-                               help()
-                               sys.exit(1)
-                               #we don't have any files to process; skip this step and exit
-                       print "Calculating dependencies  ",
-                       sys.stdout.flush()
-                       retval,favorites=mydepgraph.select_files(myfiles)
-                       if not retval:
-                               sys.exit(1)
-                       print "\b\b ...done!"
-
-                       if ("--usepkgonly" in myopts) and mydepgraph.missingbins:
-                               sys.stderr.write(red("The following binaries are not available for merging...\n"))
-
-               if mydepgraph.missingbins:
-                       for x in mydepgraph.missingbins:
-                               sys.stderr.write("   "+str(x)+"\n")
-                       sys.stderr.write("\nThese are required by '--usepkgonly' -- Terminating.\n\n")
-                       sys.exit(1)
-
-       if "--ask" in myopts:
-               if "--resume" in myopts:
-                       mydepgraph.display(portage.mtimedb["resume"]["mergelist"])
-                       prompt="Do you want me to resume merging these packages?"
-               else:
-                       mydepgraph.display(mydepgraph.altlist())
-                       mergecount=0
-                       hasblocks = False
-                       for x in mydepgraph.altlist():
-                               if x[3]!="nomerge":
-                                       mergecount+=1
-                               #check for blocking dependencies
-                               if x[0]=="blocks":
-                                       hasblocks = True
-                       if mergecount==0:
-                               if portage.settings["AUTOCLEAN"] and "yes"==portage.settings["AUTOCLEAN"]:
-                                       prompt="Nothing to merge; do you want me to auto-clean packages?"
-                               else:
-                                       print
-                                       print "Nothing to merge; quitting."
-                                       print
-                                       sys.exit(0)
-                       elif "--fetchonly" in myopts or "--fetch-all-uri" in myopts:
-                               prompt="Do you want me to fetch the source files for these packages?"
-                       elif hasblocks:
-                               print "\n!!! Error: The above package list contains packages which cannot be installed"
-                               print   "!!!        on the same system."
-                               print
-                               sys.exit(1)
-                       else:
-                               prompt="Do you want me to merge these packages?"
-               print
-               if userquery(prompt)=="No":
-                       print
-                       print "Quitting."
-                       print
-                       sys.exit(0)
-               # Don't ask again (e.g. when auto-cleaning packages after merge)
-               myopts.remove("--ask")
-
-       if ("--pretend" in myopts) and not ("--fetchonly" in myopts or "--fetch-all-uri" in myopts):
-               if ("--resume" in myopts):
-                       mydepgraph.display(portage.mtimedb["resume"]["mergelist"])
-               else:
-                       mydepgraph.display(mydepgraph.altlist())
-       else:
-               if ("--buildpkgonly" in myopts):
-                       if not mydepgraph.digraph.hasallzeros():
-                               print "\n!!! --buildpkgonly requires all dependencies to be merged."
-                               print "!!! Cannot merge requested packages. Merge deps and try again.\n"
-                               sys.exit(1)
-
-               if ("--resume" in myopts):
-                       favorites=portage.mtimedb["resume"]["favorites"]
-                       mydepgraph.merge(portage.mtimedb["resume"]["mergelist"])
-               else:
-                       portage.mtimedb["resume"]={}
-                       portage.mtimedb["resume"]["myopts"]=myopts
-                       portage.mtimedb["resume"]["favorites"]=favorites
-                       if ("--digest" in myopts) and not ("--fetchonly" in myopts or "--fetch-all-uri" in myopts):
-                               for pkgline in mydepgraph.altlist():
-                                       if pkgline[0]=="ebuild" and pkgline[3]=="merge":
-                                               y=portage.portdb.findname(pkgline[2])
-                                               tmpsettings = portage.config(clone=portage.settings)
-                                               retval=portage.doebuild(y,"digest",portage.root,tmpsettings,edebug,("--pretend" in myopts))
-                       mydepgraph.merge(mydepgraph.altlist())
-
-               if portage.mtimedb.has_key("resume"):
-                       del portage.mtimedb["resume"]
-               if portage.settings["AUTOCLEAN"] and "yes"==portage.settings["AUTOCLEAN"]:
-                       print ">>> Auto-cleaning packages ..."
-                       unmerge("clean", ["world"])
-       post_emerge()