aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'portage_with_autodep/pym/_emerge/main.py')
-rw-r--r--portage_with_autodep/pym/_emerge/main.py295
1 files changed, 215 insertions, 80 deletions
diff --git a/portage_with_autodep/pym/_emerge/main.py b/portage_with_autodep/pym/_emerge/main.py
index 2830214..c52a3ea 100644
--- a/portage_with_autodep/pym/_emerge/main.py
+++ b/portage_with_autodep/pym/_emerge/main.py
@@ -1,4 +1,4 @@
-# Copyright 1999-2011 Gentoo Foundation
+# Copyright 1999-2012 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
from __future__ import print_function
@@ -6,10 +6,14 @@ from __future__ import print_function
import logging
import signal
import stat
+import subprocess
import sys
import textwrap
import platform
import portage
+portage.proxy.lazyimport.lazyimport(globals(),
+ 'portage.news:count_unread_news,display_news_notifications',
+)
from portage import os
from portage import _encodings
from portage import _unicode_decode
@@ -28,7 +32,8 @@ import portage.exception
from portage.data import secpass
from portage.dbapi.dep_expand import dep_expand
from portage.util import normalize_path as normpath
-from portage.util import shlex_split, writemsg_level, writemsg_stdout
+from portage.util import (shlex_split, varexpand,
+ writemsg_level, writemsg_stdout)
from portage._sets import SETPREFIX
from portage._global_updates import _global_updates
@@ -62,6 +67,7 @@ options=[
"--nodeps", "--noreplace",
"--nospinner", "--oneshot",
"--onlydeps", "--pretend",
+"--quiet-repo-display",
"--quiet-unmerge-warn",
"--resume",
"--searchdesc",
@@ -70,6 +76,7 @@ options=[
"--unordered-display",
"--update",
"--verbose",
+"--verbose-main-repo-display",
]
shortmapping={
@@ -92,6 +99,21 @@ shortmapping={
"v":"--verbose", "V":"--version"
}
+COWSAY_MOO = """
+
+ Larry loves Gentoo (%s)
+
+ _______________________
+< Have you mooed today? >
+ -----------------------
+ \ ^__^
+ \ (oo)\_______
+ (__)\ )\/\
+ ||----w |
+ || ||
+
+"""
+
def chk_updated_info_files(root, infodirs, prev_mtimes, retval):
if os.path.exists("/usr/bin/install-info"):
@@ -158,11 +180,21 @@ def chk_updated_info_files(root, infodirs, prev_mtimes, retval):
raise
del e
processed_count += 1
- myso = portage.subprocess_getstatusoutput(
- "LANG=C LANGUAGE=C /usr/bin/install-info " +
- "--dir-file=%s/dir %s/%s" % (inforoot, inforoot, x))[1]
+ try:
+ proc = subprocess.Popen(
+ ['/usr/bin/install-info',
+ '--dir-file=%s' % os.path.join(inforoot, "dir"),
+ os.path.join(inforoot, x)],
+ env=dict(os.environ, LANG="C", LANGUAGE="C"),
+ stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
+ except OSError:
+ myso = None
+ else:
+ myso = _unicode_decode(
+ proc.communicate()[0]).rstrip("\n")
+ proc.wait()
existsstr="already exists, for file `"
- if myso!="":
+ if myso:
if re.search(existsstr,myso):
# Already exists... Don't increment the count for this.
pass
@@ -233,7 +265,6 @@ def display_preserved_libs(vardbapi, myopts):
linkmap = vardbapi._linkmap
consumer_map = {}
owners = {}
- linkmap_broken = False
try:
linkmap.rebuild()
@@ -241,7 +272,6 @@ def display_preserved_libs(vardbapi, myopts):
writemsg_level("!!! Command Not Found: %s\n" % (e,),
level=logging.ERROR, noiselevel=-1)
del e
- linkmap_broken = True
else:
search_for_owners = set()
for cpv in plibdata:
@@ -315,7 +345,7 @@ def post_emerge(myaction, myopts, myfiles,
@type myopts: dict
@param myfiles: emerge arguments
@type myfiles: list
- @param target_root: The target ROOT for myaction
+ @param target_root: The target EROOT for myaction
@type target_root: String
@param trees: A dictionary mapping each ROOT to it's package databases
@type trees: dict
@@ -326,7 +356,7 @@ def post_emerge(myaction, myopts, myfiles,
"""
root_config = trees[target_root]["root_config"]
- vardbapi = trees[target_root]["vartree"].dbapi
+ vardbapi = trees[target_root]['vartree'].dbapi
settings = vardbapi.settings
info_mtimes = mtimedb["info"]
@@ -351,7 +381,9 @@ def post_emerge(myaction, myopts, myfiles,
_flush_elog_mod_echo()
if not vardbapi._pkgs_changed:
- display_news_notification(root_config, myopts)
+ # GLEP 42 says to display news *after* an emerge --pretend
+ if "--pretend" in myopts:
+ display_news_notification(root_config, myopts)
# If vdb state has not changed then there's nothing else to do.
return
@@ -372,11 +404,10 @@ def post_emerge(myaction, myopts, myfiles,
if vdb_lock:
vardbapi.unlock()
+ display_preserved_libs(vardbapi, myopts)
chk_updated_cfg_files(settings['EROOT'], config_protect)
display_news_notification(root_config, myopts)
- if retval in (None, os.EX_OK) or (not "--pretend" in myopts):
- display_preserved_libs(vardbapi, myopts)
postemerge = os.path.join(settings["PORTAGE_CONFIGROOT"],
portage.USER_CONFIG_PATH, "bin", "post_emerge")
@@ -388,6 +419,8 @@ def post_emerge(myaction, myopts, myfiles,
" %s spawn failed of %s\n" % (bad("*"), postemerge,),
level=logging.ERROR, noiselevel=-1)
+ clean_logs(settings)
+
if "--quiet" not in myopts and \
myaction is None and "@world" in myfiles:
show_depclean_suggestion()
@@ -428,6 +461,8 @@ def insert_optional_args(args):
default_arg_opts = {
'--ask' : y_or_n,
'--autounmask' : y_or_n,
+ '--autounmask-keep-masks': y_or_n,
+ '--autounmask-unrestricted-atoms' : y_or_n,
'--autounmask-write' : y_or_n,
'--buildpkg' : y_or_n,
'--complete-graph' : y_or_n,
@@ -551,19 +586,25 @@ def insert_optional_args(args):
return new_args
-def _find_bad_atoms(atoms):
+def _find_bad_atoms(atoms, less_strict=False):
+ """
+ Declares all atoms as invalid that have an operator,
+ a use dependency, a blocker or a repo spec.
+ It accepts atoms with wildcards.
+ In less_strict mode it accepts operators and repo specs.
+ """
bad_atoms = []
for x in ' '.join(atoms).split():
bad_atom = False
try:
- atom = portage.dep.Atom(x, allow_wildcard=True)
+ atom = portage.dep.Atom(x, allow_wildcard=True, allow_repo=less_strict)
except portage.exception.InvalidAtom:
try:
- atom = portage.dep.Atom("*/"+x, allow_wildcard=True)
+ atom = portage.dep.Atom("*/"+x, allow_wildcard=True, allow_repo=less_strict)
except portage.exception.InvalidAtom:
bad_atom = True
- if bad_atom or atom.operator or atom.blocker or atom.use:
+ if bad_atom or (atom.operator and not less_strict) or atom.blocker or atom.use:
bad_atoms.append(x)
return bad_atoms
@@ -573,16 +614,15 @@ def parse_opts(tmpcmdline, silent=False):
myopts = {}
myfiles=[]
- global options, shortmapping
-
actions = frozenset([
- "clean", "config", "depclean", "help",
- "info", "list-sets", "metadata",
+ "clean", "check-news", "config", "depclean", "help",
+ "info", "list-sets", "metadata", "moo",
"prune", "regen", "search",
"sync", "unmerge", "version",
])
longopt_aliases = {"--cols":"--columns", "--skip-first":"--skipfirst"}
+ y_or_n = ("y", "n")
true_y_or_n = ("True", "y", "n")
true_y = ("True", "y")
argument_options = {
@@ -600,6 +640,18 @@ def parse_opts(tmpcmdline, silent=False):
"choices" : true_y_or_n
},
+ "--autounmask-unrestricted-atoms": {
+ "help" : "write autounmask changes with >= atoms if possible",
+ "type" : "choice",
+ "choices" : true_y_or_n
+ },
+
+ "--autounmask-keep-masks": {
+ "help" : "don't add package.unmask entries",
+ "type" : "choice",
+ "choices" : true_y_or_n
+ },
+
"--autounmask-write": {
"help" : "write changes made by --autounmask to disk",
"type" : "choice",
@@ -626,6 +678,14 @@ def parse_opts(tmpcmdline, silent=False):
"choices" : true_y_or_n
},
+ "--buildpkg-exclude": {
+ "help" :"A space separated list of package atoms for which " + \
+ "no binary packages should be built. This option overrides all " + \
+ "possible ways to enable building of binary packages.",
+
+ "action" : "append"
+ },
+
"--config-root": {
"help":"specify the location for portage configuration files",
"action":"store"
@@ -642,6 +702,12 @@ def parse_opts(tmpcmdline, silent=False):
"choices" : true_y_or_n
},
+ "--complete-graph-if-new-ver": {
+ "help" : "trigger --complete-graph behavior if an installed package version will change (upgrade or downgrade)",
+ "type" : "choice",
+ "choices" : y_or_n
+ },
+
"--deep": {
"shortopt" : "-D",
@@ -660,6 +726,12 @@ def parse_opts(tmpcmdline, silent=False):
"choices" : true_y_or_n
},
+ "--dynamic-deps": {
+ "help": "substitute the dependencies of installed packages with the dependencies of unbuilt ebuilds",
+ "type": "choice",
+ "choices": y_or_n
+ },
+
"--exclude": {
"help" :"A space separated list of package names or slot atoms. " + \
"Emerge won't install any ebuild or binary package that " + \
@@ -784,7 +856,7 @@ def parse_opts(tmpcmdline, silent=False):
"--quiet-build": {
"help" : "redirect build output to logs",
"type" : "choice",
- "choices" : true_y_or_n
+ "choices" : true_y_or_n,
},
"--rebuild-if-new-rev": {
@@ -923,13 +995,23 @@ def parse_opts(tmpcmdline, silent=False):
if myoptions.autounmask in true_y:
myoptions.autounmask = True
+ if myoptions.autounmask_unrestricted_atoms in true_y:
+ myoptions.autounmask_unrestricted_atoms = True
+
+ if myoptions.autounmask_keep_masks in true_y:
+ myoptions.autounmask_keep_masks = True
+
if myoptions.autounmask_write in true_y:
myoptions.autounmask_write = True
if myoptions.buildpkg in true_y:
myoptions.buildpkg = True
- else:
- myoptions.buildpkg = None
+
+ if myoptions.buildpkg_exclude:
+ bad_atoms = _find_bad_atoms(myoptions.buildpkg_exclude, less_strict=True)
+ if bad_atoms and not silent:
+ parser.error("Invalid Atom(s) in --buildpkg-exclude parameter: '%s'\n" % \
+ (",".join(bad_atoms),))
if myoptions.changed_use is not False:
myoptions.reinstall = "changed-use"
@@ -938,10 +1020,11 @@ def parse_opts(tmpcmdline, silent=False):
if myoptions.deselect in true_y:
myoptions.deselect = True
- if myoptions.binpkg_respect_use in true_y:
- myoptions.binpkg_respect_use = True
- else:
- myoptions.binpkg_respect_use = None
+ if myoptions.binpkg_respect_use is not None:
+ if myoptions.binpkg_respect_use in true_y:
+ myoptions.binpkg_respect_use = 'y'
+ else:
+ myoptions.binpkg_respect_use = 'n'
if myoptions.complete_graph in true_y:
myoptions.complete_graph = True
@@ -1015,9 +1098,7 @@ def parse_opts(tmpcmdline, silent=False):
myoptions.quiet = None
if myoptions.quiet_build in true_y:
- myoptions.quiet_build = True
- else:
- myoptions.quiet_build = None
+ myoptions.quiet_build = 'y'
if myoptions.rebuild_if_new_ver in true_y:
myoptions.rebuild_if_new_ver = True
@@ -1172,8 +1253,7 @@ def parse_opts(tmpcmdline, silent=False):
if myaction is None and myoptions.deselect is True:
myaction = 'deselect'
- if myargs and sys.hexversion < 0x3000000 and \
- not isinstance(myargs[0], unicode):
+ if myargs and isinstance(myargs[0], bytes):
for i in range(len(myargs)):
myargs[i] = portage._unicode_decode(myargs[i])
@@ -1222,7 +1302,6 @@ def ionice(settings):
if not ionice_cmd:
return
- from portage.util import varexpand
variables = {"PID" : str(os.getpid())}
cmd = [varexpand(x, mydict=variables) for x in ionice_cmd]
@@ -1238,6 +1317,35 @@ def ionice(settings):
out.eerror("PORTAGE_IONICE_COMMAND returned %d" % (rval,))
out.eerror("See the make.conf(5) man page for PORTAGE_IONICE_COMMAND usage instructions.")
+def clean_logs(settings):
+
+ if "clean-logs" not in settings.features:
+ return
+
+ clean_cmd = settings.get("PORT_LOGDIR_CLEAN")
+ if clean_cmd:
+ clean_cmd = shlex_split(clean_cmd)
+ if not clean_cmd:
+ return
+
+ logdir = settings.get("PORT_LOGDIR")
+ if logdir is None or not os.path.isdir(logdir):
+ return
+
+ variables = {"PORT_LOGDIR" : logdir}
+ cmd = [varexpand(x, mydict=variables) for x in clean_cmd]
+
+ try:
+ rval = portage.process.spawn(cmd, env=os.environ)
+ except portage.exception.CommandNotFound:
+ rval = 127
+
+ if rval != os.EX_OK:
+ out = portage.output.EOutput()
+ out.eerror("PORT_LOGDIR_CLEAN returned %d" % (rval,))
+ out.eerror("See the make.conf(5) man page for "
+ "PORT_LOGDIR_CLEAN usage instructions.")
+
def setconfig_fallback(root_config):
from portage._sets.base import DummyPackageSet
from portage._sets.files import WorldSelectedSet
@@ -1451,25 +1559,26 @@ def repo_name_duplicate_check(trees):
def config_protect_check(trees):
for root, root_trees in trees.items():
- if not root_trees["root_config"].settings.get("CONFIG_PROTECT"):
+ settings = root_trees["root_config"].settings
+ if not settings.get("CONFIG_PROTECT"):
msg = "!!! CONFIG_PROTECT is empty"
- if root != "/":
+ if settings["ROOT"] != "/":
msg += " for '%s'" % root
msg += "\n"
writemsg_level(msg, level=logging.WARN, noiselevel=-1)
def profile_check(trees, myaction):
- if myaction in ("help", "info", "sync", "version"):
+ if myaction in ("help", "info", "search", "sync", "version"):
return os.EX_OK
- for root, root_trees in trees.items():
+ for root_trees in trees.values():
if root_trees["root_config"].settings.profiles:
continue
# generate some profile related warning messages
validate_ebuild_environment(trees)
- msg = "If you have just changed your profile configuration, you " + \
- "should revert back to the previous configuration. Due to " + \
- "your current profile being invalid, allowed actions are " + \
- "limited to --help, --info, --sync, and --version."
+ msg = ("Your current profile is invalid. If you have just changed "
+ "your profile configuration, you should revert back to the "
+ "previous configuration. Allowed actions are limited to "
+ "--help, --info, --search, --sync, and --version.")
writemsg_level("".join("!!! %s\n" % l for l in textwrap.wrap(msg, 70)),
level=logging.ERROR, noiselevel=-1)
return 1
@@ -1515,7 +1624,7 @@ def emerge_main(args=None):
# Portage needs to ensure a sane umask for the files it creates.
os.umask(0o22)
settings, trees, mtimedb = load_emerge_config()
- portdb = trees[settings["ROOT"]]["porttree"].dbapi
+ portdb = trees[settings['EROOT']]['porttree'].dbapi
rval = profile_check(trees, myaction)
if rval != os.EX_OK:
return rval
@@ -1526,13 +1635,14 @@ def emerge_main(args=None):
tmpcmdline.extend(args)
myaction, myopts, myfiles = parse_opts(tmpcmdline)
- if myaction not in ('help', 'info', 'version') and \
+ # skip global updates prior to sync, since it's called after sync
+ if myaction not in ('help', 'info', 'sync', 'version') and \
myopts.get('--package-moves') != 'n' and \
_global_updates(trees, mtimedb["updates"], quiet=("--quiet" in myopts)):
mtimedb.commit()
# Reload the whole config from scratch.
settings, trees, mtimedb = load_emerge_config(trees=trees)
- portdb = trees[settings["ROOT"]]["porttree"].dbapi
+ portdb = trees[settings['EROOT']]['porttree'].dbapi
xterm_titles = "notitles" not in settings.features
if xterm_titles:
@@ -1543,19 +1653,24 @@ def emerge_main(args=None):
# Reload the whole config from scratch so that the portdbapi internal
# config is updated with new FEATURES.
settings, trees, mtimedb = load_emerge_config(trees=trees)
- portdb = trees[settings["ROOT"]]["porttree"].dbapi
+ portdb = trees[settings['EROOT']]['porttree'].dbapi
+
+ # NOTE: adjust_configs() can map options to FEATURES, so any relevant
+ # options adjustments should be made prior to calling adjust_configs().
+ if "--buildpkgonly" in myopts:
+ myopts["--buildpkg"] = True
adjust_configs(myopts, trees)
apply_priorities(settings)
if myaction == 'version':
writemsg_stdout(getportageversion(
- settings["PORTDIR"], settings["ROOT"],
+ settings["PORTDIR"], None,
settings.profile_path, settings["CHOST"],
- trees[settings["ROOT"]]["vartree"].dbapi) + '\n', noiselevel=-1)
+ trees[settings['EROOT']]['vartree'].dbapi) + '\n', noiselevel=-1)
return 0
elif myaction == 'help':
- _emerge.help.help(myopts, portage.output.havecolor)
+ _emerge.help.help()
return 0
spinner = stdout_spinner()
@@ -1587,9 +1702,6 @@ def emerge_main(args=None):
if "--usepkgonly" in myopts:
myopts["--usepkg"] = True
- if "buildpkg" in settings.features or "--buildpkgonly" in myopts:
- myopts["--buildpkg"] = True
-
if "--buildpkgonly" in myopts:
# --buildpkgonly will not merge anything, so
# it cancels all binary package options.
@@ -1613,20 +1725,11 @@ def emerge_main(args=None):
del mytrees, mydb
if "moo" in myfiles:
- print("""
-
- Larry loves Gentoo (""" + platform.system() + """)
-
- _______________________
-< Have you mooed today? >
- -----------------------
- \ ^__^
- \ (oo)\_______
- (__)\ )\/\
- ||----w |
- || ||
-
-""")
+ print(COWSAY_MOO % platform.system())
+ msg = ("The above `emerge moo` display is deprecated. "
+ "Please use `emerge --moo` instead.")
+ for line in textwrap.wrap(msg, 50):
+ print(" %s %s" % (colorize("WARN", "*"), line))
for x in myfiles:
ext = os.path.splitext(x)[1]
@@ -1634,10 +1737,22 @@ def emerge_main(args=None):
print(colorize("BAD", "\n*** emerging by path is broken and may not always work!!!\n"))
break
- root_config = trees[settings["ROOT"]]["root_config"]
- if myaction == "list-sets":
+ root_config = trees[settings['EROOT']]['root_config']
+ if myaction == "moo":
+ print(COWSAY_MOO % platform.system())
+ return os.EX_OK
+ elif myaction == "list-sets":
writemsg_stdout("".join("%s\n" % s for s in sorted(root_config.sets)))
return os.EX_OK
+ elif myaction == "check-news":
+ news_counts = count_unread_news(
+ root_config.trees["porttree"].dbapi,
+ root_config.trees["vartree"].dbapi)
+ if any(news_counts.values()):
+ display_news_notifications(news_counts)
+ elif "--quiet" not in myopts:
+ print("", colorize("GOOD", "*"), "No news items were found.")
+ return os.EX_OK
ensure_required_sets(trees)
@@ -1703,7 +1818,7 @@ def emerge_main(args=None):
print("myopts", myopts)
if not myaction and not myfiles and "--resume" not in myopts:
- _emerge.help.help(myopts, portage.output.havecolor)
+ _emerge.help.help()
return 1
pretend = "--pretend" in myopts
@@ -1735,7 +1850,7 @@ def emerge_main(args=None):
portage_group_warning()
if userquery("Would you like to add --pretend to options?",
"--ask-enter-invalid" in myopts) == "No":
- return 1
+ return 128 + signal.SIGINT
myopts["--pretend"] = True
del myopts["--ask"]
else:
@@ -1753,7 +1868,11 @@ def emerge_main(args=None):
if x in myopts:
disable_emergelog = True
break
- if myaction in ("search", "info"):
+ if disable_emergelog:
+ pass
+ elif myaction in ("search", "info"):
+ disable_emergelog = True
+ elif portage.data.secpass < 1:
disable_emergelog = True
_emerge.emergelog._disable = disable_emergelog
@@ -1768,8 +1887,13 @@ def emerge_main(args=None):
"EMERGE_LOG_DIR='%s':\n!!! %s\n" % \
(settings['EMERGE_LOG_DIR'], e),
noiselevel=-1, level=logging.ERROR)
+ portage.util.ensure_dirs(_emerge.emergelog._emerge_log_dir)
else:
_emerge.emergelog._emerge_log_dir = settings["EMERGE_LOG_DIR"]
+ else:
+ _emerge.emergelog._emerge_log_dir = os.path.join(os.sep,
+ settings["EPREFIX"].lstrip(os.sep), "var", "log")
+ portage.util.ensure_dirs(_emerge.emergelog._emerge_log_dir)
if not "--pretend" in myopts:
emergelog(xterm_titles, "Started emerge on: "+\
@@ -1778,9 +1902,19 @@ def emerge_main(args=None):
encoding=_encodings['content'], errors='replace'))
myelogstr=""
if myopts:
- myelogstr=" ".join(myopts)
+ opt_list = []
+ for opt, arg in myopts.items():
+ if arg is True:
+ opt_list.append(opt)
+ elif isinstance(arg, list):
+ # arguments like --exclude that use 'append' action
+ for x in arg:
+ opt_list.append("%s=%s" % (opt, x))
+ else:
+ opt_list.append("%s=%s" % (opt, arg))
+ myelogstr=" ".join(opt_list)
if myaction:
- myelogstr+=" "+myaction
+ myelogstr += " --" + myaction
if myfiles:
myelogstr += " " + " ".join(oldargs)
emergelog(xterm_titles, " *** emerge " + myelogstr)
@@ -1824,7 +1958,7 @@ def emerge_main(args=None):
# SEARCH action
elif "search"==myaction:
validate_ebuild_environment(trees)
- action_search(trees[settings["ROOT"]]["root_config"],
+ action_search(trees[settings['EROOT']]['root_config'],
myopts, myfiles, spinner)
elif myaction in ('clean', 'depclean', 'deselect', 'prune', 'unmerge'):
@@ -1832,19 +1966,19 @@ def emerge_main(args=None):
rval = action_uninstall(settings, trees, mtimedb["ldpath"],
myopts, myaction, myfiles, spinner)
if not (myaction == 'deselect' or buildpkgonly or fetchonly or pretend):
- post_emerge(myaction, myopts, myfiles, settings["ROOT"],
+ post_emerge(myaction, myopts, myfiles, settings['EROOT'],
trees, mtimedb, rval)
return rval
elif myaction == 'info':
# Ensure atoms are valid before calling unmerge().
- vardb = trees[settings["ROOT"]]["vartree"].dbapi
- portdb = trees[settings["ROOT"]]["porttree"].dbapi
- bindb = trees[settings["ROOT"]]["bintree"].dbapi
+ vardb = trees[settings['EROOT']]['vartree'].dbapi
+ portdb = trees[settings['EROOT']]['porttree'].dbapi
+ bindb = trees[settings['EROOT']]["bintree"].dbapi
valid_atoms = []
for x in myfiles:
- if is_valid_package_atom(x):
+ if is_valid_package_atom(x, allow_repo=True):
try:
#look at the installed files first, if there is no match
#look at the ebuilds, since EAPI 4 allows running pkg_info
@@ -1900,11 +2034,12 @@ def emerge_main(args=None):
level=logging.ERROR, noiselevel=-1)
return 1
+ # GLEP 42 says to display news *after* an emerge --pretend
if "--pretend" not in myopts:
display_news_notification(root_config, myopts)
retval = action_build(settings, trees, mtimedb,
myopts, myaction, myfiles, spinner)
- post_emerge(myaction, myopts, myfiles, settings["ROOT"],
+ post_emerge(myaction, myopts, myfiles, settings['EROOT'],
trees, mtimedb, retval)
return retval