public inbox for gentoo-commits@lists.gentoo.org
 help / color / mirror / Atom feed
From: "Zac Medico" <zmedico@gentoo.org>
To: gentoo-commits@lists.gentoo.org
Subject: [gentoo-commits] proj/portage:master commit in: pym/_emerge/
Date: Tue, 16 Oct 2012 08:34:09 +0000 (UTC)	[thread overview]
Message-ID: <1350376434.65e69242814553b826b9277495a5f62b79569269.zmedico@gentoo> (raw)

commit:     65e69242814553b826b9277495a5f62b79569269
Author:     Zac Medico <zmedico <AT> gentoo <DOT> org>
AuthorDate: Tue Oct 16 08:33:54 2012 +0000
Commit:     Zac Medico <zmedico <AT> gentoo <DOT> org>
CommitDate: Tue Oct 16 08:33:54 2012 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=65e69242

emerge_main: split out run_action

Also move post_emerge and chk_updated_cfg_files to separate files.

---
 pym/_emerge/actions.py               |  777 ++++++++++++++++++++++++++++--
 pym/_emerge/chk_updated_cfg_files.py |   42 ++
 pym/_emerge/main.py                  |  881 +---------------------------------
 pym/_emerge/post_emerge.py           |  165 +++++++
 4 files changed, 949 insertions(+), 916 deletions(-)

diff --git a/pym/_emerge/actions.py b/pym/_emerge/actions.py
index 3003afc..3336e9f 100644
--- a/pym/_emerge/actions.py
+++ b/pym/_emerge/actions.py
@@ -22,13 +22,18 @@ from itertools import chain
 
 import portage
 portage.proxy.lazyimport.lazyimport(globals(),
+	'portage.debug',
 	'portage.news:count_unread_news,display_news_notifications',
+	'_emerge.chk_updated_cfg_files:chk_updated_cfg_files',
+	'_emerge.help:help@emerge_help',
+	'_emerge.post_emerge:display_news_notification,post_emerge',
+	'_emerge.stdout_spinner:stdout_spinner',
 )
 
 from portage.localization import _
 from portage import os
 from portage import shutil
-from portage import eapi_is_supported, _unicode_decode
+from portage import eapi_is_supported, _encodings, _unicode_decode
 from portage.cache.cache_errors import CacheError
 from portage.const import GLOBAL_CONFIG_PATH
 from portage.const import _DEPCLEAN_LIB_CHECK_DEFAULT
@@ -38,7 +43,7 @@ from portage.dep import Atom
 from portage.eclass_cache import hashed_path
 from portage.exception import InvalidAtom, InvalidData
 from portage.output import blue, bold, colorize, create_color_func, darkgreen, \
-	red, yellow
+	red, xtermTitle, xtermTitleReset, yellow
 good = create_color_func("GOOD")
 bad = create_color_func("BAD")
 warn = create_color_func("WARN")
@@ -46,7 +51,7 @@ from portage.package.ebuild._ipc.QueryCommand import QueryCommand
 from portage.package.ebuild.doebuild import _check_temp_dir
 from portage._sets import load_default_config, SETPREFIX
 from portage._sets.base import InternalPackageSet
-from portage.util import cmp_sort_key, writemsg, \
+from portage.util import cmp_sort_key, writemsg, varexpand, \
 	writemsg_level, writemsg_stdout
 from portage.util.digraph import digraph
 from portage.util._async.SchedulerInterface import SchedulerInterface
@@ -82,6 +87,21 @@ if sys.hexversion >= 0x3000000:
 else:
 	_unicode = unicode
 
+COWSAY_MOO = """
+
+  Larry loves Gentoo (%s)
+
+ _______________________
+< Have you mooed today? >
+ -----------------------
+        \   ^__^
+         \  (oo)\_______
+            (__)\       )\/\ 
+                ||----w |
+                ||     ||
+
+"""
+
 def action_build(settings, trees, mtimedb,
 	myopts, myaction, myfiles, spinner):
 
@@ -3057,42 +3077,6 @@ def load_emerge_config(trees=None):
 	QueryCommand._db = trees
 	return settings, trees, mtimedb
 
-def chk_updated_cfg_files(eroot, config_protect):
-	target_root = eroot
-	result = list(
-		portage.util.find_updated_config_files(target_root, config_protect))
-
-	for x in result:
-		writemsg_level("\n %s " % (colorize("WARN", "* " + _("IMPORTANT:"))),
-			level=logging.INFO, noiselevel=-1)
-		if not x[1]: # it's a protected file
-			writemsg_level( _("config file '%s' needs updating.\n") % x[0],
-				level=logging.INFO, noiselevel=-1)
-		else: # it's a protected dir
-			if len(x[1]) == 1:
-				head, tail = os.path.split(x[1][0])
-				tail = tail[len("._cfg0000_"):]
-				fpath = os.path.join(head, tail)
-				writemsg_level(_("config file '%s' needs updating.\n") % fpath,
-					level=logging.INFO, noiselevel=-1)
-			else:
-				writemsg_level( _("%d config files in '%s' need updating.\n") % \
-					(len(x[1]), x[0]), level=logging.INFO, noiselevel=-1)
-
-	if result:
-		print(" "+yellow("*")+ " See the "+colorize("INFORM", _("CONFIGURATION FILES"))\
-				+ " " + _("section of the") + " " + bold("emerge"))
-		print(" "+yellow("*")+ " " + _("man page to learn how to update config files."))
-
-
-def display_news_notification(root_config, myopts):
-	if "news" not in root_config.settings.features:
-		return
-	portdb = root_config.trees["porttree"].dbapi
-	vardb = root_config.trees["vartree"].dbapi
-	news_counts = count_unread_news(portdb, vardb)
-	display_news_notifications(news_counts)
-
 def getgccversion(chost):
 	"""
 	rtype: C{str}
@@ -3147,3 +3131,718 @@ def getgccversion(chost):
 
 	portage.writemsg(gcc_not_found_error, noiselevel=-1)
 	return "[unavailable]"
+
+# Warn about features that may confuse users and
+# lead them to report invalid bugs.
+_emerge_features_warn = frozenset(['keeptemp', 'keepwork'])
+
+def validate_ebuild_environment(trees):
+	features_warn = set()
+	for myroot in trees:
+		settings = trees[myroot]["vartree"].settings
+		settings.validate()
+		features_warn.update(
+			_emerge_features_warn.intersection(settings.features))
+
+	if features_warn:
+		msg = "WARNING: The FEATURES variable contains one " + \
+			"or more values that should be disabled under " + \
+			"normal circumstances: %s" % " ".join(features_warn)
+		out = portage.output.EOutput()
+		for line in textwrap.wrap(msg, 65):
+			out.ewarn(line)
+
+def check_procfs():
+	procfs_path = '/proc'
+	if platform.system() not in ("Linux",) or \
+		os.path.ismount(procfs_path):
+		return os.EX_OK
+	msg = "It seems that %s is not mounted. You have been warned." % procfs_path
+	writemsg_level("".join("!!! %s\n" % l for l in textwrap.wrap(msg, 70)),
+		level=logging.ERROR, noiselevel=-1)
+	return 1
+
+def config_protect_check(trees):
+	for root, root_trees in trees.items():
+		settings = root_trees["root_config"].settings
+		if not settings.get("CONFIG_PROTECT"):
+			msg = "!!! CONFIG_PROTECT is empty"
+			if settings["ROOT"] != "/":
+				msg += " for '%s'" % root
+			msg += "\n"
+			writemsg_level(msg, level=logging.WARN, noiselevel=-1)
+
+def apply_priorities(settings):
+	ionice(settings)
+	nice(settings)
+
+def nice(settings):
+	try:
+		os.nice(int(settings.get("PORTAGE_NICENESS", "0")))
+	except (OSError, ValueError) as e:
+		out = portage.output.EOutput()
+		out.eerror("Failed to change nice value to '%s'" % \
+			settings["PORTAGE_NICENESS"])
+		out.eerror("%s\n" % str(e))
+
+def ionice(settings):
+
+	ionice_cmd = settings.get("PORTAGE_IONICE_COMMAND")
+	if ionice_cmd:
+		ionice_cmd = portage.util.shlex_split(ionice_cmd)
+	if not ionice_cmd:
+		return
+
+	variables = {"PID" : str(os.getpid())}
+	cmd = [varexpand(x, mydict=variables) for x in ionice_cmd]
+
+	try:
+		rval = portage.process.spawn(cmd, env=os.environ)
+	except portage.exception.CommandNotFound:
+		# The OS kernel probably doesn't support ionice,
+		# so return silently.
+		return
+
+	if rval != os.EX_OK:
+		out = portage.output.EOutput()
+		out.eerror("PORTAGE_IONICE_COMMAND returned %d" % (rval,))
+		out.eerror("See the make.conf(5) man page for PORTAGE_IONICE_COMMAND usage instructions.")
+
+def setconfig_fallback(root_config):
+	setconfig = root_config.setconfig
+	setconfig._create_default_config()
+	setconfig._parse(update=True)
+	root_config.sets = setconfig.getSets()
+
+def get_missing_sets(root_config):
+	# emerge requires existence of "world", "selected", and "system"
+	missing_sets = []
+
+	for s in ("selected", "system", "world",):
+		if s not in root_config.sets:
+			missing_sets.append(s)
+
+	return missing_sets
+
+def missing_sets_warning(root_config, missing_sets):
+	if len(missing_sets) > 2:
+		missing_sets_str = ", ".join('"%s"' % s for s in missing_sets[:-1])
+		missing_sets_str += ', and "%s"' % missing_sets[-1]
+	elif len(missing_sets) == 2:
+		missing_sets_str = '"%s" and "%s"' % tuple(missing_sets)
+	else:
+		missing_sets_str = '"%s"' % missing_sets[-1]
+	msg = ["emerge: incomplete set configuration, " + \
+		"missing set(s): %s" % missing_sets_str]
+	if root_config.sets:
+		msg.append("        sets defined: %s" % ", ".join(root_config.sets))
+	global_config_path = portage.const.GLOBAL_CONFIG_PATH
+	if root_config.settings['EPREFIX']:
+		global_config_path = os.path.join(root_config.settings['EPREFIX'],
+				portage.const.GLOBAL_CONFIG_PATH.lstrip(os.sep))
+	msg.append("        This usually means that '%s'" % \
+		(os.path.join(global_config_path, "sets/portage.conf"),))
+	msg.append("        is missing or corrupt.")
+	msg.append("        Falling back to default world and system set configuration!!!")
+	for line in msg:
+		writemsg_level(line + "\n", level=logging.ERROR, noiselevel=-1)
+
+def ensure_required_sets(trees):
+	warning_shown = False
+	for root_trees in trees.values():
+		missing_sets = get_missing_sets(root_trees["root_config"])
+		if missing_sets and not warning_shown:
+			warning_shown = True
+			missing_sets_warning(root_trees["root_config"], missing_sets)
+		if missing_sets:
+			setconfig_fallback(root_trees["root_config"])
+
+def expand_set_arguments(myfiles, myaction, root_config):
+	retval = os.EX_OK
+	setconfig = root_config.setconfig
+
+	sets = setconfig.getSets()
+
+	# In order to know exactly which atoms/sets should be added to the
+	# world file, the depgraph performs set expansion later. It will get
+	# confused about where the atoms came from if it's not allowed to
+	# expand them itself.
+	do_not_expand = (None, )
+	newargs = []
+	for a in myfiles:
+		if a in ("system", "world"):
+			newargs.append(SETPREFIX+a)
+		else:
+			newargs.append(a)
+	myfiles = newargs
+	del newargs
+	newargs = []
+
+	# separators for set arguments
+	ARG_START = "{"
+	ARG_END = "}"
+
+	for i in range(0, len(myfiles)):
+		if myfiles[i].startswith(SETPREFIX):
+			start = 0
+			end = 0
+			x = myfiles[i][len(SETPREFIX):]
+			newset = ""
+			while x:
+				start = x.find(ARG_START)
+				end = x.find(ARG_END)
+				if start > 0 and start < end:
+					namepart = x[:start]
+					argpart = x[start+1:end]
+
+					# TODO: implement proper quoting
+					args = argpart.split(",")
+					options = {}
+					for a in args:
+						if "=" in a:
+							k, v  = a.split("=", 1)
+							options[k] = v
+						else:
+							options[a] = "True"
+					setconfig.update(namepart, options)
+					newset += (x[:start-len(namepart)]+namepart)
+					x = x[end+len(ARG_END):]
+				else:
+					newset += x
+					x = ""
+			myfiles[i] = SETPREFIX+newset
+
+	sets = setconfig.getSets()
+
+	# display errors that occurred while loading the SetConfig instance
+	for e in setconfig.errors:
+		print(colorize("BAD", "Error during set creation: %s" % e))
+
+	unmerge_actions = ("unmerge", "prune", "clean", "depclean")
+
+	for a in myfiles:
+		if a.startswith(SETPREFIX):		
+				s = a[len(SETPREFIX):]
+				if s not in sets:
+					display_missing_pkg_set(root_config, s)
+					return (None, 1)
+				if s == "installed":
+					msg = ("The @installed set is deprecated and will soon be "
+					"removed. Please refer to bug #387059 for details.")
+					out = portage.output.EOutput()
+					for line in textwrap.wrap(msg, 50):
+						out.ewarn(line)
+				setconfig.active.append(s)
+				try:
+					set_atoms = setconfig.getSetAtoms(s)
+				except portage.exception.PackageSetNotFound as e:
+					writemsg_level(("emerge: the given set '%s' " + \
+						"contains a non-existent set named '%s'.\n") % \
+						(s, e), level=logging.ERROR, noiselevel=-1)
+					if s in ('world', 'selected') and \
+						SETPREFIX + e.value in sets['selected']:
+						writemsg_level(("Use `emerge --deselect %s%s` to "
+							"remove this set from world_sets.\n") %
+							(SETPREFIX, e,), level=logging.ERROR,
+							noiselevel=-1)
+					return (None, 1)
+				if myaction in unmerge_actions and \
+						not sets[s].supportsOperation("unmerge"):
+					sys.stderr.write("emerge: the given set '%s' does " % s + \
+						"not support unmerge operations\n")
+					retval = 1
+				elif not set_atoms:
+					print("emerge: '%s' is an empty set" % s)
+				elif myaction not in do_not_expand:
+					newargs.extend(set_atoms)
+				else:
+					newargs.append(SETPREFIX+s)
+				for e in sets[s].errors:
+					print(e)
+		else:
+			newargs.append(a)
+	return (newargs, retval)
+
+def repo_name_check(trees):
+	missing_repo_names = set()
+	for root_trees in trees.values():
+		porttree = root_trees.get("porttree")
+		if porttree:
+			portdb = porttree.dbapi
+			missing_repo_names.update(portdb.getMissingRepoNames())
+			if portdb.porttree_root in missing_repo_names and \
+				not os.path.exists(os.path.join(
+				portdb.porttree_root, "profiles")):
+				# This is normal if $PORTDIR happens to be empty,
+				# so don't warn about it.
+				missing_repo_names.remove(portdb.porttree_root)
+
+	if missing_repo_names:
+		msg = []
+		msg.append("WARNING: One or more repositories " + \
+			"have missing repo_name entries:")
+		msg.append("")
+		for p in missing_repo_names:
+			msg.append("\t%s/profiles/repo_name" % (p,))
+		msg.append("")
+		msg.extend(textwrap.wrap("NOTE: Each repo_name entry " + \
+			"should be a plain text file containing a unique " + \
+			"name for the repository on the first line.", 70))
+		msg.append("\n")
+		writemsg_level("".join("%s\n" % l for l in msg),
+			level=logging.WARNING, noiselevel=-1)
+
+	return bool(missing_repo_names)
+
+def repo_name_duplicate_check(trees):
+	ignored_repos = {}
+	for root, root_trees in trees.items():
+		if 'porttree' in root_trees:
+			portdb = root_trees['porttree'].dbapi
+			if portdb.settings.get('PORTAGE_REPO_DUPLICATE_WARN') != '0':
+				for repo_name, paths in portdb.getIgnoredRepos():
+					k = (root, repo_name, portdb.getRepositoryPath(repo_name))
+					ignored_repos.setdefault(k, []).extend(paths)
+
+	if ignored_repos:
+		msg = []
+		msg.append('WARNING: One or more repositories ' + \
+			'have been ignored due to duplicate')
+		msg.append('  profiles/repo_name entries:')
+		msg.append('')
+		for k in sorted(ignored_repos):
+			msg.append('  %s overrides' % ", ".join(k))
+			for path in ignored_repos[k]:
+				msg.append('    %s' % (path,))
+			msg.append('')
+		msg.extend('  ' + x for x in textwrap.wrap(
+			"All profiles/repo_name entries must be unique in order " + \
+			"to avoid having duplicates ignored. " + \
+			"Set PORTAGE_REPO_DUPLICATE_WARN=\"0\" in " + \
+			"/etc/make.conf if you would like to disable this warning."))
+		msg.append("\n")
+		writemsg_level(''.join('%s\n' % l for l in msg),
+			level=logging.WARNING, noiselevel=-1)
+
+	return bool(ignored_repos)
+
+def run_action(settings, trees, mtimedb, myaction, myopts, myfiles):
+
+	# 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)
+
+	xterm_titles = "notitles" not in settings.features
+	if xterm_titles:
+		xtermTitle("emerge")
+
+	if "--digest" in myopts:
+		os.environ["FEATURES"] = os.environ.get("FEATURES","") + " digest"
+		# 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)
+
+	# 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
+
+	if "getbinpkg" in settings.features:
+		myopts["--getbinpkg"] = True
+
+	if "--getbinpkgonly" in myopts:
+		myopts["--getbinpkg"] = True
+
+	if "--getbinpkgonly" in myopts:
+		myopts["--usepkgonly"] = True
+
+	if "--getbinpkg" in myopts:
+		myopts["--usepkg"] = True
+
+	if "--usepkgonly" in myopts:
+		myopts["--usepkg"] = True
+
+	if "--buildpkgonly" in myopts:
+		# --buildpkgonly will not merge anything, so
+		# it cancels all binary package options.
+		for opt in ("--getbinpkg", "--getbinpkgonly",
+			"--usepkg", "--usepkgonly"):
+			myopts.pop(opt, None)
+
+	adjust_configs(myopts, trees)
+	apply_priorities(settings)
+
+	if myaction == 'version':
+		writemsg_stdout(getportageversion(
+			settings["PORTDIR"], None,
+			settings.profile_path, settings["CHOST"],
+			trees[settings['EROOT']]['vartree'].dbapi) + '\n', noiselevel=-1)
+		return 0
+	elif myaction == 'help':
+		emerge_help()
+		return 0
+
+	spinner = stdout_spinner()
+	if "candy" in settings.features:
+		spinner.update = spinner.update_scroll
+
+	if "--quiet" not in myopts:
+		portage.deprecated_profile_check(settings=settings)
+		if portage.const._ENABLE_REPO_NAME_WARN:
+			# Bug #248603 - Disable warnings about missing
+			# repo_name entries for stable branch.
+			repo_name_check(trees)
+		repo_name_duplicate_check(trees)
+		config_protect_check(trees)
+	check_procfs()
+
+	for mytrees in trees.values():
+		mydb = mytrees["porttree"].dbapi
+		# Freeze the portdbapi for performance (memoize all xmatch results).
+		mydb.freeze()
+
+		if myaction in ('search', None) and \
+			"--usepkg" in myopts:
+			# Populate the bintree with current --getbinpkg setting.
+			# This needs to happen before expand_set_arguments(), in case
+			# any sets use the bintree.
+			mytrees["bintree"].populate(
+				getbinpkgs="--getbinpkg" in myopts)
+
+	del mytrees, mydb
+
+	if "moo" in myfiles:
+		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]
+		if (ext == ".ebuild" or ext == ".tbz2") and \
+			os.path.exists(os.path.abspath(x)):
+			print(colorize("BAD", "\n*** emerging by path is broken "
+				"and may not always work!!!\n"))
+			break
+
+	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)
+
+	# only expand sets for actions taking package arguments
+	oldargs = myfiles[:]
+	if myaction in ("clean", "config", "depclean",
+		"info", "prune", "unmerge", None):
+		myfiles, retval = expand_set_arguments(myfiles, myaction, root_config)
+		if retval != os.EX_OK:
+			return retval
+
+		# Need to handle empty sets specially, otherwise emerge will react 
+		# with the help message for empty argument lists
+		if oldargs and not myfiles:
+			print("emerge: no targets left after set expansion")
+			return 0
+
+	if ("--tree" in myopts) and ("--columns" in myopts):
+		print("emerge: can't specify both of \"--tree\" and \"--columns\".")
+		return 1
+
+	if '--emptytree' in myopts and '--noreplace' in myopts:
+		writemsg_level("emerge: can't specify both of " + \
+			"\"--emptytree\" and \"--noreplace\".\n",
+			level=logging.ERROR, noiselevel=-1)
+		return 1
+
+	if ("--quiet" in myopts):
+		spinner.update = spinner.update_quiet
+		portage.util.noiselimit = -1
+
+	if "--fetch-all-uri" in myopts:
+		myopts["--fetchonly"] = True
+
+	if "--skipfirst" in myopts and "--resume" not in myopts:
+		myopts["--resume"] = True
+
+	# Allow -p to remove --ask
+	if "--pretend" in myopts:
+		myopts.pop("--ask", None)
+
+	# 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",
+			noiselevel=-1)
+		return 1
+
+	if settings.get("PORTAGE_DEBUG", "") == "1":
+		spinner.update = spinner.update_quiet
+		portage.util.noiselimit = 0
+		if "python-trace" in settings.features:
+			portage.debug.set_trace(True)
+
+	if not ("--quiet" in myopts):
+		if '--nospinner' in myopts or \
+			settings.get('TERM') == 'dumb' or \
+			not sys.stdout.isatty():
+			spinner.update = spinner.update_basic
+
+	if "--debug" in myopts:
+		print("myaction", myaction)
+		print("myopts", myopts)
+
+	if not myaction and not myfiles and "--resume" not in myopts:
+		emerge_help()
+		return 1
+
+	pretend = "--pretend" in myopts
+	fetchonly = "--fetchonly" in myopts or "--fetch-all-uri" in myopts
+	buildpkgonly = "--buildpkgonly" in myopts
+
+	# check if root user is the current user for the actions where emerge needs this
+	if portage.data.secpass < 2:
+		# We've already allowed "--version" and "--help" above.
+		if "--pretend" not in myopts and myaction not in ("search","info"):
+			need_superuser = myaction in ('clean', 'depclean', 'deselect',
+				'prune', 'unmerge') or not \
+				(fetchonly or \
+				(buildpkgonly and portage.data.secpass >= 1) or \
+				myaction in ("metadata", "regen", "sync"))
+			if portage.data.secpass < 1 or \
+				need_superuser:
+				if need_superuser:
+					access_desc = "superuser"
+				else:
+					access_desc = "portage group"
+				# Always show portage_group_warning() when only portage group
+				# access is required but the user is not in the portage group.
+				if "--ask" in myopts:
+					writemsg_stdout("This action requires %s access...\n" % \
+						(access_desc,), noiselevel=-1)
+					if portage.data.secpass < 1 and not need_superuser:
+						portage.data.portage_group_warning()
+					if userquery("Would you like to add --pretend to options?",
+						"--ask-enter-invalid" in myopts) == "No":
+						return 128 + signal.SIGINT
+					myopts["--pretend"] = True
+					myopts.pop("--ask")
+				else:
+					sys.stderr.write(("emerge: %s access is required\n") \
+						% access_desc)
+					if portage.data.secpass < 1 and not need_superuser:
+						portage.data.portage_group_warning()
+					return 1
+
+	# Disable emergelog for everything except build or unmerge operations.
+	# This helps minimize parallel emerge.log entries that can confuse log
+	# parsers like genlop.
+	disable_emergelog = False
+	for x in ("--pretend", "--fetchonly", "--fetch-all-uri"):
+		if x in myopts:
+			disable_emergelog = True
+			break
+	if disable_emergelog:
+		pass
+	elif myaction in ("search", "info"):
+		disable_emergelog = True
+	elif portage.data.secpass < 1:
+		disable_emergelog = True
+
+	import _emerge.emergelog
+	_emerge.emergelog._disable = disable_emergelog
+
+	if not disable_emergelog:
+		if 'EMERGE_LOG_DIR' in settings:
+			try:
+				# At least the parent needs to exist for the lock file.
+				portage.util.ensure_dirs(settings['EMERGE_LOG_DIR'])
+			except portage.exception.PortageException as e:
+				writemsg_level("!!! Error creating directory for " + \
+					"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: "+\
+			_unicode_decode(
+				time.strftime("%b %d, %Y %H:%M:%S", time.localtime()),
+				encoding=_encodings['content'], errors='replace'))
+		myelogstr=""
+		if 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
+		if myfiles:
+			myelogstr += " " + " ".join(oldargs)
+		emergelog(xterm_titles, " *** emerge " + myelogstr)
+
+	oldargs = None
+
+	def emergeexitsig(signum, frame):
+		signal.signal(signal.SIGTERM, signal.SIG_IGN)
+		portage.util.writemsg(
+			"\n\nExiting on signal %(signal)s\n" % {"signal":signum})
+		sys.exit(128 + signum)
+
+	signal.signal(signal.SIGTERM, emergeexitsig)
+
+	def emergeexit():
+		"""This gets out final log message in before we quit."""
+		if "--pretend" not in myopts:
+			emergelog(xterm_titles, " *** terminating.")
+		if xterm_titles:
+			xtermTitleReset()
+	portage.atexit_register(emergeexit)
+
+	if myaction in ("config", "metadata", "regen", "sync"):
+		if "--pretend" in myopts:
+			sys.stderr.write(("emerge: The '%s' action does " + \
+				"not support '--pretend'.\n") % myaction)
+			return 1
+
+	if "sync" == myaction:
+		return action_sync(settings, trees, mtimedb, myopts, myaction)
+	elif "metadata" == myaction:
+		action_metadata(settings,
+			trees[settings['EROOT']]['porttree'].dbapi, myopts)
+	elif myaction=="regen":
+		validate_ebuild_environment(trees)
+		return action_regen(settings,
+			trees[settings['EROOT']]['porttree'].dbapi, myopts.get("--jobs"),
+			myopts.get("--load-average"))
+	# HELP action
+	elif "config"==myaction:
+		validate_ebuild_environment(trees)
+		action_config(settings, trees, myopts, myfiles)
+
+	# SEARCH action
+	elif "search"==myaction:
+		validate_ebuild_environment(trees)
+		action_search(trees[settings['EROOT']]['root_config'],
+			myopts, myfiles, spinner)
+
+	elif myaction in ('clean', 'depclean', 'deselect', 'prune', 'unmerge'):
+		validate_ebuild_environment(trees)
+		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['EROOT'],
+				trees, mtimedb, rval)
+		return rval
+
+	elif myaction == 'info':
+
+		# Ensure atoms are valid before calling unmerge().
+		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, 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
+					#on non-installed packages
+					valid_atom = dep_expand(x, mydb=vardb, settings=settings)
+					if valid_atom.cp.split("/")[0] == "null":
+						valid_atom = dep_expand(x,
+							mydb=portdb, settings=settings)
+
+					if valid_atom.cp.split("/")[0] == "null" and \
+						"--usepkg" in myopts:
+						valid_atom = dep_expand(x,
+							mydb=bindb, settings=settings)
+
+					valid_atoms.append(valid_atom)
+
+				except portage.exception.AmbiguousPackageName as e:
+					msg = "The short ebuild name \"" + x + \
+						"\" is ambiguous.  Please specify " + \
+						"one of the following " + \
+						"fully-qualified ebuild names instead:"
+					for line in textwrap.wrap(msg, 70):
+						writemsg_level("!!! %s\n" % (line,),
+							level=logging.ERROR, noiselevel=-1)
+					for i in e.args[0]:
+						writemsg_level("    %s\n" % colorize("INFORM", i),
+							level=logging.ERROR, noiselevel=-1)
+					writemsg_level("\n", level=logging.ERROR, noiselevel=-1)
+					return 1
+				continue
+			msg = []
+			msg.append("'%s' is not a valid package atom." % (x,))
+			msg.append("Please check ebuild(5) for full details.")
+			writemsg_level("".join("!!! %s\n" % line for line in msg),
+				level=logging.ERROR, noiselevel=-1)
+			return 1
+
+		return action_info(settings, trees, myopts, valid_atoms)
+
+	# "update", "system", or just process files:
+	else:
+		validate_ebuild_environment(trees)
+
+		for x in myfiles:
+			if x.startswith(SETPREFIX) or \
+				is_valid_package_atom(x, allow_repo=True):
+				continue
+			if x[:1] == os.sep:
+				continue
+			try:
+				os.lstat(x)
+				continue
+			except OSError:
+				pass
+			msg = []
+			msg.append("'%s' is not a valid package atom." % (x,))
+			msg.append("Please check ebuild(5) for full details.")
+			writemsg_level("".join("!!! %s\n" % line for line in msg),
+				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['EROOT'],
+			trees, mtimedb, retval)
+
+		return retval

diff --git a/pym/_emerge/chk_updated_cfg_files.py b/pym/_emerge/chk_updated_cfg_files.py
new file mode 100644
index 0000000..9f2ab6f
--- /dev/null
+++ b/pym/_emerge/chk_updated_cfg_files.py
@@ -0,0 +1,42 @@
+# Copyright 1999-2012 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+
+from __future__ import print_function
+
+import logging
+
+import portage
+from portage import os
+from portage.localization import _
+from portage.output import bold, colorize, yellow
+from portage.util import writemsg_level
+
+def chk_updated_cfg_files(eroot, config_protect):
+	target_root = eroot
+	result = list(
+		portage.util.find_updated_config_files(target_root, config_protect))
+
+	for x in result:
+		writemsg_level("\n %s " % (colorize("WARN", "* " + _("IMPORTANT:"))),
+			level=logging.INFO, noiselevel=-1)
+		if not x[1]: # it's a protected file
+			writemsg_level( _("config file '%s' needs updating.\n") % x[0],
+				level=logging.INFO, noiselevel=-1)
+		else: # it's a protected dir
+			if len(x[1]) == 1:
+				head, tail = os.path.split(x[1][0])
+				tail = tail[len("._cfg0000_"):]
+				fpath = os.path.join(head, tail)
+				writemsg_level(_("config file '%s' needs updating.\n") % fpath,
+					level=logging.INFO, noiselevel=-1)
+			else:
+				writemsg_level(
+					_("%d config files in '%s' need updating.\n") % \
+					(len(x[1]), x[0]), level=logging.INFO, noiselevel=-1)
+
+	if result:
+		print(" " + yellow("*") + " See the " +
+			colorize("INFORM", _("CONFIGURATION FILES")) +
+			" " + _("section of the") + " " + bold("emerge"))
+		print(" " + yellow("*") + " " +
+			_("man page to learn how to update config files."))

diff --git a/pym/_emerge/main.py b/pym/_emerge/main.py
index eed3999..fd1fd06 100644
--- a/pym/_emerge/main.py
+++ b/pym/_emerge/main.py
@@ -3,40 +3,18 @@
 
 from __future__ import print_function
 
-import platform
-import signal
 import sys
 
 import portage
 portage.proxy.lazyimport.lazyimport(globals(),
 	'logging',
-	'portage.debug',
-	'portage.dbapi.dep_expand:dep_expand',
-	'portage.news:count_unread_news,display_news_notifications',
-	'portage.emaint.modules.logs.logs:CleanLogs',
-	'portage.output:colorize,xtermTitle,xtermTitleReset',
-	'portage._global_updates:_global_updates',
-	'portage._sets:SETPREFIX',
-	'portage.util:shlex_split,varexpand,writemsg_level,writemsg_stdout',
-	'portage.util._dyn_libs.display_preserved_libs:display_preserved_libs',
-	'portage.util._info_files:chk_updated_info_files',
+	'portage.util:writemsg_level',
 	'textwrap',
-	'time',
-	'_emerge.actions:action_build,action_config,action_info,' + \
-		'action_metadata,action_regen,action_search,action_sync,' + \
-		'action_uninstall,adjust_configs,chk_updated_cfg_files,'+ \
-		'display_missing_pkg_set,display_news_notification,' + \
-		'getportageversion,load_emerge_config',
-	'_emerge.emergelog:emergelog',
+	'_emerge.actions:load_emerge_config,run_action,' + \
+		'validate_ebuild_environment',
 	'_emerge.help:help@emerge_help',
-	'_emerge.is_valid_package_atom:is_valid_package_atom',
-	'_emerge.stdout_spinner:stdout_spinner',
-	'_emerge.userquery:userquery',
-	'_emerge._flush_elog_mod_echo:_flush_elog_mod_echo',
 )
 from portage import os
-from portage import _encodings
-from portage import _unicode_decode
 
 if sys.hexversion >= 0x3000000:
 	long = int
@@ -89,141 +67,6 @@ shortmapping={
 "v":"--verbose",   "V":"--version"
 }
 
-COWSAY_MOO = """
-
-  Larry loves Gentoo (%s)
-
- _______________________
-< Have you mooed today? >
- -----------------------
-        \   ^__^
-         \  (oo)\_______
-            (__)\       )\/\ 
-                ||----w |
-                ||     ||
-
-"""
-
-def post_emerge(myaction, myopts, myfiles,
-	target_root, trees, mtimedb, retval):
-	"""
-	Misc. things to run at the end of a merge session.
-
-	Update Info Files
-	Update Config Files
-	Update News Items
-	Commit mtimeDB
-	Display preserved libs warnings
-
-	@param myaction: The action returned from parse_opts()
-	@type myaction: String
-	@param myopts: emerge options
-	@type myopts: dict
-	@param myfiles: emerge arguments
-	@type myfiles: list
-	@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
-	@param mtimedb: The mtimeDB to store data needed across merge invocations
-	@type mtimedb: MtimeDB class instance
-	@param retval: Emerge's return value
-	@type retval: Int
-	"""
-
-	root_config = trees[target_root]["root_config"]
-	vardbapi = trees[target_root]['vartree'].dbapi
-	settings = vardbapi.settings
-	info_mtimes = mtimedb["info"]
-
-	# Load the most current variables from ${ROOT}/etc/profile.env
-	settings.unlock()
-	settings.reload()
-	settings.regenerate()
-	settings.lock()
-
-	config_protect = shlex_split(settings.get("CONFIG_PROTECT", ""))
-	infodirs = settings.get("INFOPATH","").split(":") + \
-		settings.get("INFODIR","").split(":")
-
-	os.chdir("/")
-
-	if retval == os.EX_OK:
-		exit_msg = " *** exiting successfully."
-	else:
-		exit_msg = " *** exiting unsuccessfully with status '%s'." % retval
-	emergelog("notitles" not in settings.features, exit_msg)
-
-	_flush_elog_mod_echo()
-
-	if not vardbapi._pkgs_changed:
-		# 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
-
-	vdb_path = os.path.join(root_config.settings['EROOT'], portage.VDB_PATH)
-	portage.util.ensure_dirs(vdb_path)
-	vdb_lock = None
-	if os.access(vdb_path, os.W_OK) and not "--pretend" in myopts:
-		vardbapi.lock()
-		vdb_lock = True
-
-	if vdb_lock:
-		try:
-			if "noinfo" not in settings.features:
-				chk_updated_info_files(target_root,
-					infodirs, info_mtimes)
-			mtimedb.commit()
-		finally:
-			if vdb_lock:
-				vardbapi.unlock()
-
-	# Explicitly load and prune the PreservedLibsRegistry in order
-	# to ensure that we do not display stale data.
-	vardbapi._plib_registry.load()
-
-	if vardbapi._plib_registry.hasEntries():
-		if "--quiet" in myopts:
-			print()
-			print(colorize("WARN", "!!!") + " existing preserved libs found")
-		else:
-			print()
-			print(colorize("WARN", "!!!") + " existing preserved libs:")
-			display_preserved_libs(vardbapi)
-			print("Use " + colorize("GOOD", "emerge @preserved-rebuild") +
-				" to rebuild packages using these libraries")
-
-	chk_updated_cfg_files(settings['EROOT'], config_protect)
-
-	display_news_notification(root_config, myopts)
-
-	postemerge = os.path.join(settings["PORTAGE_CONFIGROOT"],
-		portage.USER_CONFIG_PATH, "bin", "post_emerge")
-	if os.access(postemerge, os.X_OK):
-		hook_retval = portage.process.spawn(
-						[postemerge], env=settings.environ())
-		if hook_retval != os.EX_OK:
-			writemsg_level(
-				" %s spawn failed of %s\n" %
-				(colorize("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()
-
-def show_depclean_suggestion():
-	out = portage.output.EOutput()
-	msg = "After world updates, it is important to remove " + \
-		"obsolete packages with emerge --depclean. Refer " + \
-		"to `man emerge` for more information."
-	for line in textwrap.wrap(msg, 72):
-		out.ewarn(line)
-
 def multiple_actions(action1, action2):
 	sys.stderr.write("\n!!! Multiple actions requested... Please choose one only.\n")
 	sys.stderr.write("!!! '%s' or '%s'\n\n" % (action1, action2))
@@ -1090,306 +933,6 @@ def parse_opts(tmpcmdline, silent=False):
 
 	return myaction, myopts, myfiles
 
-# Warn about features that may confuse users and
-# lead them to report invalid bugs.
-_emerge_features_warn = frozenset(['keeptemp', 'keepwork'])
-
-def validate_ebuild_environment(trees):
-	features_warn = set()
-	for myroot in trees:
-		settings = trees[myroot]["vartree"].settings
-		settings.validate()
-		features_warn.update(
-			_emerge_features_warn.intersection(settings.features))
-
-	if features_warn:
-		msg = "WARNING: The FEATURES variable contains one " + \
-			"or more values that should be disabled under " + \
-			"normal circumstances: %s" % " ".join(features_warn)
-		out = portage.output.EOutput()
-		for line in textwrap.wrap(msg, 65):
-			out.ewarn(line)
-
-def apply_priorities(settings):
-	ionice(settings)
-	nice(settings)
-
-def nice(settings):
-	try:
-		os.nice(int(settings.get("PORTAGE_NICENESS", "0")))
-	except (OSError, ValueError) as e:
-		out = portage.output.EOutput()
-		out.eerror("Failed to change nice value to '%s'" % \
-			settings["PORTAGE_NICENESS"])
-		out.eerror("%s\n" % str(e))
-
-def ionice(settings):
-
-	ionice_cmd = settings.get("PORTAGE_IONICE_COMMAND")
-	if ionice_cmd:
-		ionice_cmd = portage.util.shlex_split(ionice_cmd)
-	if not ionice_cmd:
-		return
-
-	variables = {"PID" : str(os.getpid())}
-	cmd = [varexpand(x, mydict=variables) for x in ionice_cmd]
-
-	try:
-		rval = portage.process.spawn(cmd, env=os.environ)
-	except portage.exception.CommandNotFound:
-		# The OS kernel probably doesn't support ionice,
-		# so return silently.
-		return
-
-	if rval != os.EX_OK:
-		out = portage.output.EOutput()
-		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
-
-	logdir = settings.get("PORT_LOGDIR")
-	if logdir is None or not os.path.isdir(logdir):
-		return
-
-	cleanlogs = CleanLogs()
-	errors = cleanlogs.clean(settings=settings)
-	if errors:
-		out = portage.output.EOutput()
-		for msg in errors:
-			out.eerror(msg)
-
-def setconfig_fallback(root_config):
-	setconfig = root_config.setconfig
-	setconfig._create_default_config()
-	setconfig._parse(update=True)
-	root_config.sets = setconfig.getSets()
-
-def get_missing_sets(root_config):
-	# emerge requires existence of "world", "selected", and "system"
-	missing_sets = []
-
-	for s in ("selected", "system", "world",):
-		if s not in root_config.sets:
-			missing_sets.append(s)
-
-	return missing_sets
-
-def missing_sets_warning(root_config, missing_sets):
-	if len(missing_sets) > 2:
-		missing_sets_str = ", ".join('"%s"' % s for s in missing_sets[:-1])
-		missing_sets_str += ', and "%s"' % missing_sets[-1]
-	elif len(missing_sets) == 2:
-		missing_sets_str = '"%s" and "%s"' % tuple(missing_sets)
-	else:
-		missing_sets_str = '"%s"' % missing_sets[-1]
-	msg = ["emerge: incomplete set configuration, " + \
-		"missing set(s): %s" % missing_sets_str]
-	if root_config.sets:
-		msg.append("        sets defined: %s" % ", ".join(root_config.sets))
-	global_config_path = portage.const.GLOBAL_CONFIG_PATH
-	if root_config.settings['EPREFIX']:
-		global_config_path = os.path.join(root_config.settings['EPREFIX'],
-				portage.const.GLOBAL_CONFIG_PATH.lstrip(os.sep))
-	msg.append("        This usually means that '%s'" % \
-		(os.path.join(global_config_path, "sets/portage.conf"),))
-	msg.append("        is missing or corrupt.")
-	msg.append("        Falling back to default world and system set configuration!!!")
-	for line in msg:
-		writemsg_level(line + "\n", level=logging.ERROR, noiselevel=-1)
-
-def ensure_required_sets(trees):
-	warning_shown = False
-	for root_trees in trees.values():
-		missing_sets = get_missing_sets(root_trees["root_config"])
-		if missing_sets and not warning_shown:
-			warning_shown = True
-			missing_sets_warning(root_trees["root_config"], missing_sets)
-		if missing_sets:
-			setconfig_fallback(root_trees["root_config"])
-
-def expand_set_arguments(myfiles, myaction, root_config):
-	retval = os.EX_OK
-	setconfig = root_config.setconfig
-
-	sets = setconfig.getSets()
-
-	# In order to know exactly which atoms/sets should be added to the
-	# world file, the depgraph performs set expansion later. It will get
-	# confused about where the atoms came from if it's not allowed to
-	# expand them itself.
-	do_not_expand = (None, )
-	newargs = []
-	for a in myfiles:
-		if a in ("system", "world"):
-			newargs.append(SETPREFIX+a)
-		else:
-			newargs.append(a)
-	myfiles = newargs
-	del newargs
-	newargs = []
-
-	# separators for set arguments
-	ARG_START = "{"
-	ARG_END = "}"
-
-	for i in range(0, len(myfiles)):
-		if myfiles[i].startswith(SETPREFIX):
-			start = 0
-			end = 0
-			x = myfiles[i][len(SETPREFIX):]
-			newset = ""
-			while x:
-				start = x.find(ARG_START)
-				end = x.find(ARG_END)
-				if start > 0 and start < end:
-					namepart = x[:start]
-					argpart = x[start+1:end]
-
-					# TODO: implement proper quoting
-					args = argpart.split(",")
-					options = {}
-					for a in args:
-						if "=" in a:
-							k, v  = a.split("=", 1)
-							options[k] = v
-						else:
-							options[a] = "True"
-					setconfig.update(namepart, options)
-					newset += (x[:start-len(namepart)]+namepart)
-					x = x[end+len(ARG_END):]
-				else:
-					newset += x
-					x = ""
-			myfiles[i] = SETPREFIX+newset
-
-	sets = setconfig.getSets()
-
-	# display errors that occurred while loading the SetConfig instance
-	for e in setconfig.errors:
-		print(colorize("BAD", "Error during set creation: %s" % e))
-
-	unmerge_actions = ("unmerge", "prune", "clean", "depclean")
-
-	for a in myfiles:
-		if a.startswith(SETPREFIX):		
-				s = a[len(SETPREFIX):]
-				if s not in sets:
-					display_missing_pkg_set(root_config, s)
-					return (None, 1)
-				if s == "installed":
-					msg = ("The @installed set is deprecated and will soon be "
-					"removed. Please refer to bug #387059 for details.")
-					out = portage.output.EOutput()
-					for line in textwrap.wrap(msg, 50):
-						out.ewarn(line)
-				setconfig.active.append(s)
-				try:
-					set_atoms = setconfig.getSetAtoms(s)
-				except portage.exception.PackageSetNotFound as e:
-					writemsg_level(("emerge: the given set '%s' " + \
-						"contains a non-existent set named '%s'.\n") % \
-						(s, e), level=logging.ERROR, noiselevel=-1)
-					if s in ('world', 'selected') and \
-						SETPREFIX + e.value in sets['selected']:
-						writemsg_level(("Use `emerge --deselect %s%s` to "
-							"remove this set from world_sets.\n") %
-							(SETPREFIX, e,), level=logging.ERROR,
-							noiselevel=-1)
-					return (None, 1)
-				if myaction in unmerge_actions and \
-						not sets[s].supportsOperation("unmerge"):
-					sys.stderr.write("emerge: the given set '%s' does " % s + \
-						"not support unmerge operations\n")
-					retval = 1
-				elif not set_atoms:
-					print("emerge: '%s' is an empty set" % s)
-				elif myaction not in do_not_expand:
-					newargs.extend(set_atoms)
-				else:
-					newargs.append(SETPREFIX+s)
-				for e in sets[s].errors:
-					print(e)
-		else:
-			newargs.append(a)
-	return (newargs, retval)
-
-def repo_name_check(trees):
-	missing_repo_names = set()
-	for root_trees in trees.values():
-		porttree = root_trees.get("porttree")
-		if porttree:
-			portdb = porttree.dbapi
-			missing_repo_names.update(portdb.getMissingRepoNames())
-			if portdb.porttree_root in missing_repo_names and \
-				not os.path.exists(os.path.join(
-				portdb.porttree_root, "profiles")):
-				# This is normal if $PORTDIR happens to be empty,
-				# so don't warn about it.
-				missing_repo_names.remove(portdb.porttree_root)
-
-	if missing_repo_names:
-		msg = []
-		msg.append("WARNING: One or more repositories " + \
-			"have missing repo_name entries:")
-		msg.append("")
-		for p in missing_repo_names:
-			msg.append("\t%s/profiles/repo_name" % (p,))
-		msg.append("")
-		msg.extend(textwrap.wrap("NOTE: Each repo_name entry " + \
-			"should be a plain text file containing a unique " + \
-			"name for the repository on the first line.", 70))
-		msg.append("\n")
-		writemsg_level("".join("%s\n" % l for l in msg),
-			level=logging.WARNING, noiselevel=-1)
-
-	return bool(missing_repo_names)
-
-def repo_name_duplicate_check(trees):
-	ignored_repos = {}
-	for root, root_trees in trees.items():
-		if 'porttree' in root_trees:
-			portdb = root_trees['porttree'].dbapi
-			if portdb.settings.get('PORTAGE_REPO_DUPLICATE_WARN') != '0':
-				for repo_name, paths in portdb.getIgnoredRepos():
-					k = (root, repo_name, portdb.getRepositoryPath(repo_name))
-					ignored_repos.setdefault(k, []).extend(paths)
-
-	if ignored_repos:
-		msg = []
-		msg.append('WARNING: One or more repositories ' + \
-			'have been ignored due to duplicate')
-		msg.append('  profiles/repo_name entries:')
-		msg.append('')
-		for k in sorted(ignored_repos):
-			msg.append('  %s overrides' % ", ".join(k))
-			for path in ignored_repos[k]:
-				msg.append('    %s' % (path,))
-			msg.append('')
-		msg.extend('  ' + x for x in textwrap.wrap(
-			"All profiles/repo_name entries must be unique in order " + \
-			"to avoid having duplicates ignored. " + \
-			"Set PORTAGE_REPO_DUPLICATE_WARN=\"0\" in " + \
-			"/etc/make.conf if you would like to disable this warning."))
-		msg.append("\n")
-		writemsg_level(''.join('%s\n' % l for l in msg),
-			level=logging.WARNING, noiselevel=-1)
-
-	return bool(ignored_repos)
-
-def config_protect_check(trees):
-	for root, root_trees in trees.items():
-		settings = root_trees["root_config"].settings
-		if not settings.get("CONFIG_PROTECT"):
-			msg = "!!! CONFIG_PROTECT is empty"
-			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", "search", "sync", "version"):
 		return os.EX_OK
@@ -1407,16 +950,6 @@ def profile_check(trees, myaction):
 		return 1
 	return os.EX_OK
 
-def check_procfs():
-	procfs_path = '/proc'
-	if platform.system() not in ("Linux",) or \
-		os.path.ismount(procfs_path):
-		return os.EX_OK
-	msg = "It seems that %s is not mounted. You have been warned." % procfs_path
-	writemsg_level("".join("!!! %s\n" % l for l in textwrap.wrap(msg, 70)),
-		level=logging.ERROR, noiselevel=-1)
-	return 1
-
 def emerge_main(args=None):
 	"""
 	@param args: command arguments (default: sys.argv[1:])
@@ -1456,7 +989,6 @@ def emerge_main(args=None):
 	if myaction == "sync":
 		portage._sync_disabled_warnings = True
 	settings, trees, mtimedb = load_emerge_config()
-	portdb = trees[settings['EROOT']]['porttree'].dbapi
 	rval = profile_check(trees, myaction)
 	if rval != os.EX_OK:
 		return rval
@@ -1467,409 +999,4 @@ def emerge_main(args=None):
 	tmpcmdline.extend(args)
 	myaction, myopts, myfiles = parse_opts(tmpcmdline)
 
-	# 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['EROOT']]['porttree'].dbapi
-
-	xterm_titles = "notitles" not in settings.features
-	if xterm_titles:
-		xtermTitle("emerge")
-
-	if "--digest" in myopts:
-		os.environ["FEATURES"] = os.environ.get("FEATURES","") + " digest"
-		# 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['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"], None,
-			settings.profile_path, settings["CHOST"],
-			trees[settings['EROOT']]['vartree'].dbapi) + '\n', noiselevel=-1)
-		return 0
-	elif myaction == 'help':
-		emerge_help()
-		return 0
-
-	spinner = stdout_spinner()
-	if "candy" in settings.features:
-		spinner.update = spinner.update_scroll
-
-	if "--quiet" not in myopts:
-		portage.deprecated_profile_check(settings=settings)
-		if portage.const._ENABLE_REPO_NAME_WARN:
-			# Bug #248603 - Disable warnings about missing
-			# repo_name entries for stable branch.
-			repo_name_check(trees)
-		repo_name_duplicate_check(trees)
-		config_protect_check(trees)
-	check_procfs()
-
-	if "getbinpkg" in settings.features:
-		myopts["--getbinpkg"] = True
-
-	if "--getbinpkgonly" in myopts:
-		myopts["--getbinpkg"] = True
-
-	if "--getbinpkgonly" in myopts:
-		myopts["--usepkgonly"] = True
-
-	if "--getbinpkg" in myopts:
-		myopts["--usepkg"] = True
-
-	if "--usepkgonly" in myopts:
-		myopts["--usepkg"] = True
-
-	if "--buildpkgonly" in myopts:
-		# --buildpkgonly will not merge anything, so
-		# it cancels all binary package options.
-		for opt in ("--getbinpkg", "--getbinpkgonly",
-			"--usepkg", "--usepkgonly"):
-			myopts.pop(opt, None)
-
-	for mytrees in trees.values():
-		mydb = mytrees["porttree"].dbapi
-		# Freeze the portdbapi for performance (memoize all xmatch results).
-		mydb.freeze()
-
-		if myaction in ('search', None) and \
-			"--usepkg" in myopts:
-			# Populate the bintree with current --getbinpkg setting.
-			# This needs to happen before expand_set_arguments(), in case
-			# any sets use the bintree.
-			mytrees["bintree"].populate(
-				getbinpkgs="--getbinpkg" in myopts)
-
-	del mytrees, mydb
-
-	if "moo" in myfiles:
-		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]
-		if (ext == ".ebuild" or ext == ".tbz2") and os.path.exists(os.path.abspath(x)):
-			print(colorize("BAD", "\n*** emerging by path is broken and may not always work!!!\n"))
-			break
-
-	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)
-
-	# only expand sets for actions taking package arguments
-	oldargs = myfiles[:]
-	if myaction in ("clean", "config", "depclean", "info", "prune", "unmerge", None):
-		myfiles, retval = expand_set_arguments(myfiles, myaction, root_config)
-		if retval != os.EX_OK:
-			return retval
-
-		# Need to handle empty sets specially, otherwise emerge will react 
-		# with the help message for empty argument lists
-		if oldargs and not myfiles:
-			print("emerge: no targets left after set expansion")
-			return 0
-
-	if ("--tree" in myopts) and ("--columns" in myopts):
-		print("emerge: can't specify both of \"--tree\" and \"--columns\".")
-		return 1
-
-	if '--emptytree' in myopts and '--noreplace' in myopts:
-		writemsg_level("emerge: can't specify both of " + \
-			"\"--emptytree\" and \"--noreplace\".\n",
-			level=logging.ERROR, noiselevel=-1)
-		return 1
-
-	if ("--quiet" in myopts):
-		spinner.update = spinner.update_quiet
-		portage.util.noiselimit = -1
-
-	if "--fetch-all-uri" in myopts:
-		myopts["--fetchonly"] = True
-
-	if "--skipfirst" in myopts and "--resume" not in myopts:
-		myopts["--resume"] = True
-
-	# Allow -p to remove --ask
-	if "--pretend" in myopts:
-		myopts.pop("--ask", None)
-
-	# 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",
-			noiselevel=-1)
-		return 1
-
-	if settings.get("PORTAGE_DEBUG", "") == "1":
-		spinner.update = spinner.update_quiet
-		portage.util.noiselimit = 0
-		if "python-trace" in settings.features:
-			portage.debug.set_trace(True)
-
-	if not ("--quiet" in myopts):
-		if '--nospinner' in myopts or \
-			settings.get('TERM') == 'dumb' or \
-			not sys.stdout.isatty():
-			spinner.update = spinner.update_basic
-
-	if "--debug" in myopts:
-		print("myaction", myaction)
-		print("myopts", myopts)
-
-	if not myaction and not myfiles and "--resume" not in myopts:
-		emerge_help()
-		return 1
-
-	pretend = "--pretend" in myopts
-	fetchonly = "--fetchonly" in myopts or "--fetch-all-uri" in myopts
-	buildpkgonly = "--buildpkgonly" in myopts
-
-	# check if root user is the current user for the actions where emerge needs this
-	if portage.secpass < 2:
-		# We've already allowed "--version" and "--help" above.
-		if "--pretend" not in myopts and myaction not in ("search","info"):
-			need_superuser = myaction in ('clean', 'depclean', 'deselect',
-				'prune', 'unmerge') or not \
-				(fetchonly or \
-				(buildpkgonly and portage.data.secpass >= 1) or \
-				myaction in ("metadata", "regen", "sync"))
-			if portage.secpass < 1 or \
-				need_superuser:
-				if need_superuser:
-					access_desc = "superuser"
-				else:
-					access_desc = "portage group"
-				# Always show portage_group_warning() when only portage group
-				# access is required but the user is not in the portage group.
-				if "--ask" in myopts:
-					writemsg_stdout("This action requires %s access...\n" % \
-						(access_desc,), noiselevel=-1)
-					if portage.secpass < 1 and not need_superuser:
-						portage.data.portage_group_warning()
-					if userquery("Would you like to add --pretend to options?",
-						"--ask-enter-invalid" in myopts) == "No":
-						return 128 + signal.SIGINT
-					myopts["--pretend"] = True
-					del myopts["--ask"]
-				else:
-					sys.stderr.write(("emerge: %s access is required\n") \
-						% access_desc)
-					if portage.secpass < 1 and not need_superuser:
-						portage.data.portage_group_warning()
-					return 1
-
-	# Disable emergelog for everything except build or unmerge operations.
-	# This helps minimize parallel emerge.log entries that can confuse log
-	# parsers like genlop.
-	disable_emergelog = False
-	for x in ("--pretend", "--fetchonly", "--fetch-all-uri"):
-		if x in myopts:
-			disable_emergelog = True
-			break
-	if disable_emergelog:
-		pass
-	elif myaction in ("search", "info"):
-		disable_emergelog = True
-	elif portage.data.secpass < 1:
-		disable_emergelog = True
-
-	import _emerge.emergelog
-	_emerge.emergelog._disable = disable_emergelog
-
-	if not disable_emergelog:
-		if 'EMERGE_LOG_DIR' in settings:
-			try:
-				# At least the parent needs to exist for the lock file.
-				portage.util.ensure_dirs(settings['EMERGE_LOG_DIR'])
-			except portage.exception.PortageException as e:
-				writemsg_level("!!! Error creating directory for " + \
-					"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: "+\
-			_unicode_decode(
-				time.strftime("%b %d, %Y %H:%M:%S", time.localtime()),
-				encoding=_encodings['content'], errors='replace'))
-		myelogstr=""
-		if 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
-		if myfiles:
-			myelogstr += " " + " ".join(oldargs)
-		emergelog(xterm_titles, " *** emerge " + myelogstr)
-	del oldargs
-
-	def emergeexitsig(signum, frame):
-		signal.signal(signal.SIGTERM, signal.SIG_IGN)
-		portage.util.writemsg("\n\nExiting on signal %(signal)s\n" % {"signal":signum})
-		sys.exit(128 + signum)
-
-	signal.signal(signal.SIGTERM, emergeexitsig)
-
-	def emergeexit():
-		"""This gets out final log message in before we quit."""
-		if "--pretend" not in myopts:
-			emergelog(xterm_titles, " *** terminating.")
-		if xterm_titles:
-			xtermTitleReset()
-	portage.atexit_register(emergeexit)
-
-	if myaction in ("config", "metadata", "regen", "sync"):
-		if "--pretend" in myopts:
-			sys.stderr.write(("emerge: The '%s' action does " + \
-				"not support '--pretend'.\n") % myaction)
-			return 1
-
-	if "sync" == myaction:
-		return action_sync(settings, trees, mtimedb, myopts, myaction)
-	elif "metadata" == myaction:
-		action_metadata(settings, portdb, myopts)
-	elif myaction=="regen":
-		validate_ebuild_environment(trees)
-		return action_regen(settings, portdb, myopts.get("--jobs"),
-			myopts.get("--load-average"))
-	# HELP action
-	elif "config"==myaction:
-		validate_ebuild_environment(trees)
-		action_config(settings, trees, myopts, myfiles)
-
-	# SEARCH action
-	elif "search"==myaction:
-		validate_ebuild_environment(trees)
-		action_search(trees[settings['EROOT']]['root_config'],
-			myopts, myfiles, spinner)
-
-	elif myaction in ('clean', 'depclean', 'deselect', 'prune', 'unmerge'):
-		validate_ebuild_environment(trees)
-		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['EROOT'],
-				trees, mtimedb, rval)
-		return rval
-
-	elif myaction == 'info':
-
-		# Ensure atoms are valid before calling unmerge().
-		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, 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
-					#on non-installed packages
-					valid_atom = dep_expand(x, mydb=vardb, settings=settings)
-					if valid_atom.cp.split("/")[0] == "null":
-						valid_atom = dep_expand(x, mydb=portdb, settings=settings)
-					if valid_atom.cp.split("/")[0] == "null" and "--usepkg" in myopts:
-						valid_atom = dep_expand(x, mydb=bindb, settings=settings)
-					valid_atoms.append(valid_atom)
-				except portage.exception.AmbiguousPackageName as e:
-					msg = "The short ebuild name \"" + x + \
-						"\" is ambiguous.  Please specify " + \
-						"one of the following " + \
-						"fully-qualified ebuild names instead:"
-					for line in textwrap.wrap(msg, 70):
-						writemsg_level("!!! %s\n" % (line,),
-							level=logging.ERROR, noiselevel=-1)
-					for i in e.args[0]:
-						writemsg_level("    %s\n" % colorize("INFORM", i),
-							level=logging.ERROR, noiselevel=-1)
-					writemsg_level("\n", level=logging.ERROR, noiselevel=-1)
-					return 1
-				continue
-			msg = []
-			msg.append("'%s' is not a valid package atom." % (x,))
-			msg.append("Please check ebuild(5) for full details.")
-			writemsg_level("".join("!!! %s\n" % line for line in msg),
-				level=logging.ERROR, noiselevel=-1)
-			return 1
-
-		return action_info(settings, trees, myopts, valid_atoms)
-
-	# "update", "system", or just process files:
-	else:
-		validate_ebuild_environment(trees)
-
-		for x in myfiles:
-			if x.startswith(SETPREFIX) or \
-				is_valid_package_atom(x, allow_repo=True):
-				continue
-			if x[:1] == os.sep:
-				continue
-			try:
-				os.lstat(x)
-				continue
-			except OSError:
-				pass
-			msg = []
-			msg.append("'%s' is not a valid package atom." % (x,))
-			msg.append("Please check ebuild(5) for full details.")
-			writemsg_level("".join("!!! %s\n" % line for line in msg),
-				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['EROOT'],
-			trees, mtimedb, retval)
-
-		return retval
+	return run_action(settings, trees, mtimedb, myaction, myopts, myfiles)

diff --git a/pym/_emerge/post_emerge.py b/pym/_emerge/post_emerge.py
new file mode 100644
index 0000000..d5f1ba5
--- /dev/null
+++ b/pym/_emerge/post_emerge.py
@@ -0,0 +1,165 @@
+# Copyright 1999-2012 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+
+from __future__ import print_function
+
+import logging
+import textwrap
+
+import portage
+from portage import os
+from portage.emaint.modules.logs.logs import CleanLogs
+from portage.news import count_unread_news, display_news_notifications
+from portage.output import colorize
+from portage.util._dyn_libs.display_preserved_libs import \
+	display_preserved_libs
+from portage.util._info_files import chk_updated_info_files
+
+from .chk_updated_cfg_files import chk_updated_cfg_files
+from .emergelog import emergelog
+from ._flush_elog_mod_echo import _flush_elog_mod_echo
+
+def clean_logs(settings):
+
+	if "clean-logs" not in settings.features:
+		return
+
+	logdir = settings.get("PORT_LOGDIR")
+	if logdir is None or not os.path.isdir(logdir):
+		return
+
+	cleanlogs = CleanLogs()
+	errors = cleanlogs.clean(settings=settings)
+	if errors:
+		out = portage.output.EOutput()
+		for msg in errors:
+			out.eerror(msg)
+
+def display_news_notification(root_config, myopts):
+	if "news" not in root_config.settings.features:
+		return
+	portdb = root_config.trees["porttree"].dbapi
+	vardb = root_config.trees["vartree"].dbapi
+	news_counts = count_unread_news(portdb, vardb)
+	display_news_notifications(news_counts)
+
+def show_depclean_suggestion():
+	out = portage.output.EOutput()
+	msg = "After world updates, it is important to remove " + \
+		"obsolete packages with emerge --depclean. Refer " + \
+		"to `man emerge` for more information."
+	for line in textwrap.wrap(msg, 72):
+		out.ewarn(line)
+
+def post_emerge(myaction, myopts, myfiles,
+	target_root, trees, mtimedb, retval):
+	"""
+	Misc. things to run at the end of a merge session.
+
+	Update Info Files
+	Update Config Files
+	Update News Items
+	Commit mtimeDB
+	Display preserved libs warnings
+
+	@param myaction: The action returned from parse_opts()
+	@type myaction: String
+	@param myopts: emerge options
+	@type myopts: dict
+	@param myfiles: emerge arguments
+	@type myfiles: list
+	@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
+	@param mtimedb: The mtimeDB to store data needed across merge invocations
+	@type mtimedb: MtimeDB class instance
+	@param retval: Emerge's return value
+	@type retval: Int
+	"""
+
+	root_config = trees[target_root]["root_config"]
+	vardbapi = trees[target_root]['vartree'].dbapi
+	settings = vardbapi.settings
+	info_mtimes = mtimedb["info"]
+
+	# Load the most current variables from ${ROOT}/etc/profile.env
+	settings.unlock()
+	settings.reload()
+	settings.regenerate()
+	settings.lock()
+
+	config_protect = portage.util.shlex_split(
+		settings.get("CONFIG_PROTECT", ""))
+	infodirs = settings.get("INFOPATH","").split(":") + \
+		settings.get("INFODIR","").split(":")
+
+	os.chdir("/")
+
+	if retval == os.EX_OK:
+		exit_msg = " *** exiting successfully."
+	else:
+		exit_msg = " *** exiting unsuccessfully with status '%s'." % retval
+	emergelog("notitles" not in settings.features, exit_msg)
+
+	_flush_elog_mod_echo()
+
+	if not vardbapi._pkgs_changed:
+		# 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
+
+	vdb_path = os.path.join(root_config.settings['EROOT'], portage.VDB_PATH)
+	portage.util.ensure_dirs(vdb_path)
+	vdb_lock = None
+	if os.access(vdb_path, os.W_OK) and not "--pretend" in myopts:
+		vardbapi.lock()
+		vdb_lock = True
+
+	if vdb_lock:
+		try:
+			if "noinfo" not in settings.features:
+				chk_updated_info_files(target_root,
+					infodirs, info_mtimes)
+			mtimedb.commit()
+		finally:
+			if vdb_lock:
+				vardbapi.unlock()
+
+	# Explicitly load and prune the PreservedLibsRegistry in order
+	# to ensure that we do not display stale data.
+	vardbapi._plib_registry.load()
+
+	if vardbapi._plib_registry.hasEntries():
+		if "--quiet" in myopts:
+			print()
+			print(colorize("WARN", "!!!") + " existing preserved libs found")
+		else:
+			print()
+			print(colorize("WARN", "!!!") + " existing preserved libs:")
+			display_preserved_libs(vardbapi)
+			print("Use " + colorize("GOOD", "emerge @preserved-rebuild") +
+				" to rebuild packages using these libraries")
+
+	chk_updated_cfg_files(settings['EROOT'], config_protect)
+
+	display_news_notification(root_config, myopts)
+
+	postemerge = os.path.join(settings["PORTAGE_CONFIGROOT"],
+		portage.USER_CONFIG_PATH, "bin", "post_emerge")
+	if os.access(postemerge, os.X_OK):
+		hook_retval = portage.process.spawn(
+						[postemerge], env=settings.environ())
+		if hook_retval != os.EX_OK:
+			portage.util.writemsg_level(
+				" %s spawn failed of %s\n" %
+				(colorize("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()


             reply	other threads:[~2012-10-16  8:34 UTC|newest]

Thread overview: 804+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-10-16  8:34 Zac Medico [this message]
  -- strict thread matches above, loose matches on Subject: below --
2018-06-29  4:29 [gentoo-commits] proj/portage:master commit in: pym/_emerge/ Zac Medico
2018-06-23 22:15 Zac Medico
2018-06-06  4:32 Zac Medico
2018-06-06  3:22 Zac Medico
2018-06-05 20:49 Zac Medico
2018-05-31  8:44 Zac Medico
2018-05-27  4:49 Zac Medico
2018-05-27  4:26 Zac Medico
2018-05-27  4:10 Zac Medico
2018-05-13  5:04 Zac Medico
2018-05-04 17:00 Zac Medico
2018-05-01 16:26 Zac Medico
2018-04-30 19:28 Zac Medico
2018-04-30  6:29 Zac Medico
2018-04-30  6:29 Zac Medico
2018-04-30  6:29 Zac Medico
2018-04-30  6:29 Zac Medico
2018-04-29 22:24 Zac Medico
2018-04-29 22:24 Zac Medico
2018-04-29 21:29 Zac Medico
2018-04-29 21:29 Zac Medico
2018-04-29 21:29 Zac Medico
2018-04-29 21:29 Zac Medico
2018-04-29 21:29 Zac Medico
2018-04-29 21:29 Zac Medico
2018-04-29  4:38 Zac Medico
2018-04-29  4:02 Zac Medico
2018-04-29  3:55 Zac Medico
2018-04-29  3:47 Zac Medico
2018-04-29  2:11 Zac Medico
2018-04-29  0:49 Zac Medico
2018-04-29  0:26 Zac Medico
2018-04-28 23:52 Zac Medico
2018-04-28 23:41 Zac Medico
2018-04-28 22:26 Zac Medico
2018-04-28 20:19 Zac Medico
2018-04-27 20:56 Ulrich Müller
2018-04-26  8:46 Zac Medico
2018-04-26  8:06 Zac Medico
2018-04-26  8:06 Zac Medico
2018-04-26  7:12 Zac Medico
2018-04-26  6:20 Zac Medico
2018-04-24 19:43 Zac Medico
2018-04-24  7:42 Zac Medico
2018-04-24  6:57 Zac Medico
2018-04-23 19:48 Zac Medico
2018-04-23 19:48 Zac Medico
2018-04-23 18:58 Zac Medico
2018-04-23 18:52 Zac Medico
2018-04-23 18:52 Zac Medico
2018-04-23 18:52 Zac Medico
2018-04-23 18:52 Zac Medico
2018-04-23  2:41 Zac Medico
2018-04-22 21:52 Zac Medico
2018-04-22 21:52 Zac Medico
2018-04-22 21:52 Zac Medico
2018-04-22 21:52 Zac Medico
2018-04-22 21:52 Zac Medico
2018-04-22 18:26 Zac Medico
2018-04-22  0:56 Zac Medico
2018-04-21 20:17 Zac Medico
2018-04-21 18:43 Zac Medico
2018-04-20 16:18 Zac Medico
2018-04-20 16:18 Zac Medico
2018-04-20 16:18 Zac Medico
2018-04-20 16:18 Zac Medico
2018-04-20 16:18 Zac Medico
2018-04-20 15:45 Zac Medico
2018-03-30  3:50 Zac Medico
2018-03-28 15:24 Zac Medico
2018-03-28  9:25 Zac Medico
2018-03-21 19:25 Zac Medico
2018-03-21 19:08 Zac Medico
2018-03-21 19:05 Zac Medico
2018-02-19 19:20 Zac Medico
2018-01-26 14:59 Michał Górny
2018-01-07 11:56 Zac Medico
2018-01-05 20:36 Zac Medico
2017-12-10  8:42 Zac Medico
2017-10-04  7:09 Zac Medico
2017-10-04  1:34 Zac Medico
2017-09-29 17:24 Zac Medico
2017-09-25  2:57 Zac Medico
2017-09-25  2:04 Zac Medico
2017-07-09 17:20 Zac Medico
2017-05-30  7:22 Zac Medico
2017-04-20 19:39 Zac Medico
2017-04-20 19:39 Zac Medico
2017-04-12 16:46 Zac Medico
2017-04-04  3:20 Zac Medico
2017-03-31 20:24 Zac Medico
2017-03-27 21:41 Zac Medico
2017-03-23 21:43 Zac Medico
2017-03-16 23:25 Zac Medico
2017-02-21  1:33 Zac Medico
2017-01-26  4:19 Mike Gilbert
2017-01-18 23:05 Zac Medico
2016-12-29  9:13 Zac Medico
2016-12-05  5:14 Brian Dolbec
2016-12-05  5:10 Zac Medico
2016-08-22 16:09 Zac Medico
2016-05-18 16:33 Zac Medico
2016-03-29  8:39 Alexander Berntsen
2016-02-02  1:40 Zac Medico
2016-02-02  1:33 Zac Medico
2016-01-29 23:04 Brian Dolbec
2016-01-28 11:54 Alexander Berntsen
2016-01-29 11:17 ` Alexander Berntsen
2016-01-22 16:04 Zac Medico
2015-12-16 17:09 Zac Medico
2015-12-13 23:39 Zac Medico
2015-12-09 16:51 Zac Medico
2015-12-08 22:37 Arfrever Frehtes Taifersar Arahesis
2015-11-25 12:43 Arfrever Frehtes Taifersar Arahesis
2015-11-23 16:31 Zac Medico
2015-11-23 16:28 Zac Medico
2015-11-13 21:53 Arfrever Frehtes Taifersar Arahesis
2015-10-13 16:14 Zac Medico
2015-10-08  0:01 Brian Dolbec
2015-10-08  0:01 Brian Dolbec
2015-09-03 18:03 Mike Frysinger
2015-08-06  6:31 Zac Medico
2015-08-02  0:42 Zac Medico
2015-07-15 19:28 Zac Medico
2015-07-14 18:06 Zac Medico
2015-07-07 18:38 Zac Medico
2015-06-17  6:55 Zac Medico
2015-05-13  1:22 Zac Medico
2015-04-28 23:52 Zac Medico
2015-03-03 21:28 git@oystercatcher mirror+tproxy
2015-03-03 21:28 Zac Medico
2015-02-26 18:25 Mike Frysinger
2015-02-25  8:34 Zac Medico
2015-02-14 19:14 Zac Medico
2015-02-13 18:43 Alexander Berntsen
2015-02-13 18:43 Alexander Berntsen
2015-02-01 15:35 Michał Górny
2015-01-18 18:49 Zac Medico
2015-01-05 19:55 Zac Medico
2015-01-05 19:36 Zac Medico
2014-12-21 23:11 Arfrever Frehtes Taifersar Arahesis
2014-12-15 16:28 Arfrever Frehtes Taifersar Arahesis
2014-12-15  3:37 Zac Medico
2014-12-13 14:51 Arfrever Frehtes Taifersar Arahesis
2014-12-13  7:04 Arfrever Frehtes Taifersar Arahesis
2014-12-11  8:42 Zac Medico
2014-12-07 23:14 Zac Medico
2014-12-07 23:14 Zac Medico
2014-11-30 19:49 Arfrever Frehtes Taifersar Arahesis
2014-11-29 18:48 Zac Medico
2014-11-29 18:06 Zac Medico
2014-11-29 17:55 Zac Medico
2014-11-24  8:13 Zac Medico
2014-11-24  8:13 Zac Medico
2014-09-24 22:36 Brian Dolbec
2014-09-24 16:20 Zac Medico
2014-09-15  5:00 Brian Dolbec
2014-09-15  5:00 Brian Dolbec
2014-09-13  5:55 Brian Dolbec
2014-09-01 17:03 Zac Medico
2014-08-19  7:01 Michał Górny
2014-08-19  7:01 Michał Górny
2014-08-19  7:01 Michał Górny
2014-08-19  7:01 Michał Górny
2014-08-12 18:27 Michał Górny
2014-08-19  7:01 ` Michał Górny
2014-08-11 20:26 Alexander Berntsen
2014-08-10  0:10 Brian Dolbec
2014-08-04  1:55 Brian Dolbec
2014-08-03 15:24 [gentoo-commits] proj/portage:v2.2.11 " Brian Dolbec
2014-08-03 15:22 ` [gentoo-commits] proj/portage:master " Brian Dolbec
2014-06-14 20:58 Alexander Berntsen
2014-06-14  2:58 Zac Medico
2014-06-08 11:06 Sebastian Luther
2014-05-18  8:02 Arfrever Frehtes Taifersar Arahesis
2014-04-19  5:44 Brian Dolbec
2014-04-18 19:50 Zac Medico
2014-04-05 13:05 Alexander Berntsen
2014-04-04 23:01 Brian Dolbec
2014-04-04 23:01 Brian Dolbec
2014-03-24 18:28 Sebastian Luther
2014-03-24 18:28 Sebastian Luther
2014-03-23 16:31 Alexander Berntsen
2014-03-02  3:15 Brian Dolbec
2014-03-02  3:15 Brian Dolbec
2014-02-17 20:35 Sebastian Luther
2014-02-05 19:42 Sebastian Luther
2014-02-05 19:42 Sebastian Luther
2014-02-05 19:42 Sebastian Luther
2014-01-27  0:14 Brian Dolbec
2014-01-26  7:31 Arfrever Frehtes Taifersar Arahesis
2013-12-05 15:38 Brian Dolbec
2013-12-02  1:23 Brian Dolbec
2013-12-01 10:19 Brian Dolbec
2013-11-29 23:24 Mike Frysinger
2013-11-28  9:20 Arfrever Frehtes Taifersar Arahesis
2013-11-28  3:06 Arfrever Frehtes Taifersar Arahesis
2013-11-27  3:24 Mike Frysinger
2013-11-26 13:50 Brian Dolbec
2013-11-26 13:50 Brian Dolbec
2013-09-18 18:29 Zac Medico
2013-09-09 16:57 Zac Medico
2013-09-09 16:53 Zac Medico
2013-09-04 19:00 Zac Medico
2013-09-02 19:49 Zac Medico
2013-09-02  0:27 Zac Medico
2013-08-24 16:17 Zac Medico
2013-08-24 16:12 Zac Medico
2013-08-24 16:10 Zac Medico
2013-08-24 16:07 Zac Medico
2013-08-22  3:30 Zac Medico
2013-08-19  9:38 Zac Medico
2013-08-04 20:21 Zac Medico
2013-08-02  9:49 Zac Medico
2013-08-02  8:54 Zac Medico
2013-07-30  5:41 Zac Medico
2013-07-28 23:04 Zac Medico
2013-07-23 20:16 Zac Medico
2013-07-23 19:44 Zac Medico
2013-07-23 19:14 Zac Medico
2013-07-09 21:20 Zac Medico
2013-07-09 20:52 Zac Medico
2013-07-09 19:22 Zac Medico
2013-07-06 21:52 Zac Medico
2013-07-05  5:34 Zac Medico
2013-06-19 21:07 Zac Medico
2013-06-19 20:05 Zac Medico
2013-06-18 15:48 Zac Medico
2013-06-18 14:59 Zac Medico
2013-06-17  5:59 Zac Medico
2013-06-16  1:22 Zac Medico
2013-06-15 23:33 Zac Medico
2013-06-15  0:12 Zac Medico
2013-06-13 18:54 Zac Medico
2013-06-10  4:01 Zac Medico
2013-06-10  3:50 Zac Medico
2013-06-09  1:17 Zac Medico
2013-06-08 20:48 Zac Medico
2013-06-08 11:47 Zac Medico
2013-05-31 23:52 Zac Medico
2013-05-31 23:24 Zac Medico
2013-05-31 22:43 Zac Medico
2013-05-24 18:12 Zac Medico
2013-05-19 17:25 Zac Medico
2013-05-18 18:18 Zac Medico
2013-05-18 12:29 Zac Medico
2013-05-18 12:20 Zac Medico
2013-04-22 16:35 Zac Medico
2013-04-11 23:14 Zac Medico
2013-04-02 19:29 Zac Medico
2013-03-27  5:51 Zac Medico
2013-03-27  5:19 Zac Medico
2013-03-23 23:00 Zac Medico
2013-03-23 22:03 Zac Medico
2013-03-19 21:38 Zac Medico
2013-03-19 20:22 Zac Medico
2013-03-19 18:47 Zac Medico
2013-03-19 18:37 Zac Medico
2013-03-18 10:21 Zac Medico
2013-03-13 15:19 Zac Medico
2013-03-13 15:10 Zac Medico
2013-03-13  5:10 Zac Medico
2013-03-05  1:39 Zac Medico
2013-03-05  1:21 Zac Medico
2013-03-05  1:07 Zac Medico
2013-03-02  2:55 Zac Medico
2013-03-02  0:58 Zac Medico
2013-02-21 14:29 Zac Medico
2013-02-18  4:50 Mike Frysinger
2013-02-14  3:40 Zac Medico
2013-02-14  0:46 Zac Medico
2013-02-13  4:44 Zac Medico
2013-02-12  3:25 Zac Medico
2013-02-11 23:57 Zac Medico
2013-02-11  2:25 Zac Medico
2013-02-09 18:00 Zac Medico
2013-02-08 16:29 Zac Medico
2013-01-24  1:32 Zac Medico
2013-01-24  0:44 Zac Medico
2013-01-15 22:42 Mike Frysinger
2013-01-15 14:46 Zac Medico
2013-01-15 14:25 Zac Medico
2013-01-10 11:11 Zac Medico
2013-01-09  1:29 Zac Medico
2013-01-09  1:06 Zac Medico
2013-01-08  2:10 Zac Medico
2013-01-06  9:14 Zac Medico
2013-01-06  8:44 Zac Medico
2013-01-04  6:30 Zac Medico
2013-01-04  0:02 Zac Medico
2013-01-03  2:54 Zac Medico
2013-01-02 10:48 Zac Medico
2013-01-02  7:32 Zac Medico
2013-01-02  7:29 Zac Medico
2013-01-02  6:04 Zac Medico
2013-01-02  4:48 Zac Medico
2013-01-02  2:54 Zac Medico
2013-01-01 22:39 Zac Medico
2013-01-01 11:09 Zac Medico
2012-12-31 23:52 Zac Medico
2012-12-31 22:24 Zac Medico
2012-12-31 22:12 Zac Medico
2012-12-31  1:05 Zac Medico
2012-12-24 22:13 Zac Medico
2012-12-18  7:10 Zac Medico
2012-12-18  7:04 Zac Medico
2012-12-10  2:07 Zac Medico
2012-12-10  0:56 Zac Medico
2012-12-08  1:49 Zac Medico
2012-12-04  6:01 Zac Medico
2012-12-02 22:17 Zac Medico
2012-11-30  9:12 Zac Medico
2012-11-30  6:24 Zac Medico
2012-11-27  6:02 Zac Medico
2012-11-27  3:45 Zac Medico
2012-11-24 22:08 Zac Medico
2012-11-24 21:14 Zac Medico
2012-11-22 22:16 Arfrever Frehtes Taifersar Arahesis
2012-11-16  4:47 Arfrever Frehtes Taifersar Arahesis
2012-11-11 17:58 Zac Medico
2012-10-26 17:46 Zac Medico
2012-10-26 17:13 Zac Medico
2012-10-19  1:28 Zac Medico
2012-10-18  2:35 Zac Medico
2012-10-18  2:11 Zac Medico
2012-10-18  0:11 Zac Medico
2012-10-17  3:37 Zac Medico
2012-10-16 23:16 Zac Medico
2012-10-16 22:16 Zac Medico
2012-10-16 15:55 Zac Medico
2012-10-15 15:42 Zac Medico
2012-10-15 15:02 Zac Medico
2012-10-15  2:59 Zac Medico
2012-10-13 20:06 Zac Medico
2012-10-10 21:13 Zac Medico
2012-10-07 16:59 Zac Medico
2012-10-06 22:01 Zac Medico
2012-10-06  4:00 Zac Medico
2012-10-03  2:43 Zac Medico
2012-09-26  3:31 Zac Medico
2012-09-16 20:02 Zac Medico
2012-09-12  6:48 Zac Medico
2012-09-10 16:41 Zac Medico
2012-09-09  1:07 Zac Medico
2012-09-09  0:54 Zac Medico
2012-09-04  3:28 Zac Medico
2012-09-04  3:07 Zac Medico
2012-08-28  3:20 Zac Medico
2012-08-22 21:12 Zac Medico
2012-08-21  3:29 Zac Medico
2012-08-20 20:38 Zac Medico
2012-07-18 17:19 Zac Medico
2012-07-10 22:50 Zac Medico
2012-07-03 21:52 Zac Medico
2012-06-24  8:18 Zac Medico
2012-06-23 20:03 Zac Medico
2012-06-23  6:38 Zac Medico
2012-06-23  5:10 Zac Medico
2012-06-23  3:01 Zac Medico
2012-06-23  2:47 Zac Medico
2012-06-23  2:35 Zac Medico
2012-06-23  1:23 Zac Medico
2012-06-22  7:18 Zac Medico
2012-06-21 22:17 Zac Medico
2012-06-21 21:58 Zac Medico
2012-06-20 23:01 Zac Medico
2012-06-20  4:55 Zac Medico
2012-06-19  0:40 Zac Medico
2012-06-17 19:48 Zac Medico
2012-06-17 19:45 Zac Medico
2012-06-17 17:52 Zac Medico
2012-06-17 16:16 Zac Medico
2012-06-17  4:58 Zac Medico
2012-06-17  3:22 Zac Medico
2012-06-17  3:06 Zac Medico
2012-06-16 20:27 Zac Medico
2012-06-16 20:24 Zac Medico
2012-06-04  1:19 Zac Medico
2012-06-04  0:36 Zac Medico
2012-05-30 20:25 Zac Medico
2012-05-14 18:48 Zac Medico
2012-05-14  6:28 Zac Medico
2012-05-13 22:35 Zac Medico
2012-05-13  7:32 Zac Medico
2012-05-09 20:32 Zac Medico
2012-05-09 18:11 Zac Medico
2012-05-03  1:32 Zac Medico
2012-04-21  1:02 Zac Medico
2012-04-16  7:17 Zac Medico
2012-04-13 19:30 Zac Medico
2012-04-05 21:37 Zac Medico
2012-04-05 18:53 Zac Medico
2012-04-05 18:23 Zac Medico
2012-04-05 18:09 Zac Medico
2012-04-03 17:57 Zac Medico
2012-03-27 18:57 Zac Medico
2012-03-27 15:34 Zac Medico
2012-03-26  3:54 Zac Medico
2012-03-26  3:49 Zac Medico
2012-03-25 21:48 Zac Medico
2012-03-21  7:18 Zac Medico
2012-03-19 17:07 Zac Medico
2012-03-19 16:29 Zac Medico
2012-03-09  6:35 Zac Medico
2012-03-09  5:08 Zac Medico
2012-03-09  2:54 Zac Medico
2012-02-29 15:49 Zac Medico
2012-02-26 10:00 Zac Medico
2012-02-24 21:55 Zac Medico
2012-02-20 11:05 Zac Medico
2012-02-20 11:01 Zac Medico
2012-02-17 22:31 Zac Medico
2012-02-17 10:05 Zac Medico
2012-02-16 21:00 Zac Medico
2012-02-16  5:14 Zac Medico
2012-02-16  0:25 Zac Medico
2012-02-15  3:01 Zac Medico
2012-02-15  1:17 Zac Medico
2012-02-14 23:51 Zac Medico
2012-02-14 23:26 Zac Medico
2012-02-13  6:44 Zac Medico
2012-02-12  6:17 Zac Medico
2012-02-12  5:36 Zac Medico
2012-02-12  4:09 Zac Medico
2012-02-12  0:05 Zac Medico
2012-02-11 23:02 Zac Medico
2012-02-11 22:17 Arfrever Frehtes Taifersar Arahesis
2012-02-11 20:05 Zac Medico
2012-02-11 19:48 Zac Medico
2012-02-11  3:19 Zac Medico
2012-02-11  2:10 Zac Medico
2012-02-10 21:58 Zac Medico
2012-02-10 19:48 Zac Medico
2012-02-09  9:13 Zac Medico
2012-02-09  8:21 Zac Medico
2012-02-09  6:23 Zac Medico
2012-02-09  4:04 Zac Medico
2012-02-09  2:10 Zac Medico
2012-02-09  1:58 Zac Medico
2012-02-09  1:50 Zac Medico
2012-02-09  0:33 Zac Medico
2012-02-08 23:44 Zac Medico
2012-02-08 21:20 Zac Medico
2012-02-08 20:24 Zac Medico
2012-02-08  6:09 Zac Medico
2012-02-08  6:09 Zac Medico
2012-02-08  5:17 Zac Medico
2012-02-08  5:17 Zac Medico
2012-02-08  5:17 Zac Medico
2012-02-08  4:35 Zac Medico
2012-02-08  4:25 Zac Medico
2012-02-08  3:59 Zac Medico
2012-02-08  3:34 Zac Medico
2012-02-08  3:34 Zac Medico
2012-02-08  2:14 Zac Medico
2012-02-08  2:14 Zac Medico
2012-02-07 23:24 Zac Medico
2012-02-07 23:04 Zac Medico
2012-02-07 23:04 Zac Medico
2012-02-07 23:04 Zac Medico
2012-02-07 23:04 Zac Medico
2012-01-20 20:29 Zac Medico
2012-01-15 18:00 Zac Medico
2012-01-12 16:59 Zac Medico
2012-01-12 16:33 Zac Medico
2011-12-24 10:23 Zac Medico
2011-12-23 18:07 Zac Medico
2011-12-23 10:15 Zac Medico
2011-12-22  0:44 Zac Medico
2011-12-19  0:13 Zac Medico
2011-12-17 19:33 Zac Medico
2011-12-16 19:56 Zac Medico
2011-12-16 19:32 Zac Medico
2011-12-16 19:18 Zac Medico
2011-12-16 18:58 Zac Medico
2011-12-14  7:31 Zac Medico
2011-12-14  6:30 Zac Medico
2011-12-13 20:01 Zac Medico
2011-12-13 18:35 Zac Medico
2011-12-13 17:27 Zac Medico
2011-12-11  7:49 Zac Medico
2011-12-10 21:37 Zac Medico
2011-12-10 21:13 Zac Medico
2011-12-10  7:08 Zac Medico
2011-12-10  4:00 Zac Medico
2011-12-10  3:55 Zac Medico
2011-12-10  3:31 Zac Medico
2011-12-10  3:03 Zac Medico
2011-12-09  3:21 Zac Medico
2011-12-06 18:53 Zac Medico
2011-12-04 23:56 Zac Medico
2011-12-04 23:43 Zac Medico
2011-12-02 18:30 Zac Medico
2011-12-02  6:14 Zac Medico
2011-12-02  2:34 Zac Medico
2011-12-02  1:44 Zac Medico
2011-12-01 21:22 Zac Medico
2011-12-01 21:05 Zac Medico
2011-11-27 20:53 Zac Medico
2011-11-20 18:54 Zac Medico
2011-11-18 19:40 Zac Medico
2011-11-17 23:10 Zac Medico
2011-11-17 13:39 Zac Medico
2011-11-17  5:15 Zac Medico
2011-11-17  3:43 Zac Medico
2011-11-17  2:09 Zac Medico
2011-11-17  1:39 Zac Medico
2011-11-17  1:25 Zac Medico
2011-11-16 18:44 Zac Medico
2011-11-16 18:26 Zac Medico
2011-11-09 18:13 Zac Medico
2011-11-09  3:23 Zac Medico
2011-11-07 21:15 Arfrever Frehtes Taifersar Arahesis
2011-11-07 20:13 Arfrever Frehtes Taifersar Arahesis
2011-11-07  6:32 Zac Medico
2011-11-07  6:02 Zac Medico
2011-10-30  6:21 Zac Medico
2011-10-29 22:45 Zac Medico
2011-10-29 21:41 Zac Medico
2011-10-29 21:31 Zac Medico
2011-10-29 20:55 Zac Medico
2011-10-29 17:51 Zac Medico
2011-10-29  6:57 Zac Medico
2011-10-29  3:10 Zac Medico
2011-10-27 16:46 Zac Medico
2011-10-25  6:18 Zac Medico
2011-10-23 18:53 Zac Medico
2011-10-20 16:30 Zac Medico
2011-10-16  0:34 Zac Medico
2011-10-15 23:28 Zac Medico
2011-10-15 22:56 Zac Medico
2011-10-15 22:46 Zac Medico
2011-10-15 19:34 Zac Medico
2011-10-10 19:33 Zac Medico
2011-10-10 18:21 Zac Medico
2011-10-10 18:20 Zac Medico
2011-10-10 18:13 Zac Medico
2011-10-10  0:16 Zac Medico
2011-10-10  0:05 Zac Medico
2011-10-02 20:22 Zac Medico
2011-09-30 17:04 Zac Medico
2011-09-29  1:42 Zac Medico
2011-09-29  1:11 Zac Medico
2011-09-28  5:26 Zac Medico
2011-09-23  4:04 Arfrever Frehtes Taifersar Arahesis
2011-09-22 15:45 Zac Medico
2011-09-22  3:06 Zac Medico
2011-09-22  3:06 Zac Medico
2011-09-22  1:59 Zac Medico
2011-09-21 14:11 Zac Medico
2011-09-19 15:54 Zac Medico
2011-09-19 14:37 Zac Medico
2011-09-18 21:57 Zac Medico
2011-09-11 17:31 Zac Medico
2011-09-10 21:51 Zac Medico
2011-09-10 14:31 Zac Medico
2011-09-10  3:22 Zac Medico
2011-09-09 19:58 Zac Medico
2011-09-05  0:59 Zac Medico
2011-09-03 23:33 Zac Medico
2011-09-02  0:24 Zac Medico
2011-08-31  2:32 Zac Medico
2011-08-29  6:49 Zac Medico
2011-08-27 20:17 Arfrever Frehtes Taifersar Arahesis
2011-08-25 22:11 Zac Medico
2011-08-16  5:38 Zac Medico
2011-08-14 23:50 Zac Medico
2011-08-11  3:27 Zac Medico
2011-08-09  6:03 Zac Medico
2011-08-03  5:11 Zac Medico
2011-08-01 22:57 Zac Medico
2011-08-01 11:21 Zac Medico
2011-07-25 20:55 Zac Medico
2011-07-21 16:59 Zac Medico
2011-07-19 20:24 Zac Medico
2011-07-19 19:53 Zac Medico
2011-07-18  8:25 Zac Medico
2011-07-17 18:16 Zac Medico
2011-07-17  4:38 Arfrever Frehtes Taifersar Arahesis
2011-07-17  0:33 Zac Medico
2011-07-17  0:10 Zac Medico
2011-07-17  0:05 Zac Medico
2011-07-16 23:30 Zac Medico
2011-07-16  7:30 Zac Medico
2011-07-16  6:16 Zac Medico
2011-07-12 22:04 Zac Medico
2011-07-12 21:51 Zac Medico
2011-07-12 19:27 Zac Medico
2011-07-12 19:16 Zac Medico
2011-07-11 21:59 Zac Medico
2011-07-11 17:18 Zac Medico
2011-07-11 15:35 Zac Medico
2011-07-11 14:12 Zac Medico
2011-07-10 12:23 Zac Medico
2011-07-10  3:25 Zac Medico
2011-07-09 20:13 Zac Medico
2011-07-08 16:17 Zac Medico
2011-07-08 10:09 Zac Medico
2011-07-03 11:09 Arfrever Frehtes Taifersar Arahesis
2011-06-30 13:11 Zac Medico
2011-06-27 19:34 Arfrever Frehtes Taifersar Arahesis
2011-06-27  6:54 Zac Medico
2011-06-17 22:01 Zac Medico
2011-06-16 15:37 Zac Medico
2011-06-13 21:51 Zac Medico
2011-06-13 13:02 Zac Medico
2011-06-11 19:11 Arfrever Frehtes Taifersar Arahesis
2011-06-11 16:27 Zac Medico
2011-06-11 15:52 Zac Medico
2011-06-11  9:06 Zac Medico
2011-06-11  6:26 Zac Medico
2011-06-11  5:23 Zac Medico
2011-06-11  3:59 Zac Medico
2011-06-11  2:58 Zac Medico
2011-06-11  2:45 Zac Medico
2011-06-11  0:43 Zac Medico
2011-06-10 23:30 Zac Medico
2011-06-09 18:19 Zac Medico
2011-06-09 16:21 Zac Medico
2011-06-09 16:09 Zac Medico
2011-06-09 13:14 Zac Medico
2011-06-09 12:57 Zac Medico
2011-06-08 20:24 Zac Medico
2011-06-08 17:31 Zac Medico
2011-06-08 17:06 Zac Medico
2011-06-06  2:24 Zac Medico
2011-06-05 16:34 Zac Medico
2011-06-05 15:12 Zac Medico
2011-06-04 23:32 Zac Medico
2011-06-04  3:49 Zac Medico
2011-06-04  2:38 Zac Medico
2011-06-04  2:31 Zac Medico
2011-06-04  2:13 Zac Medico
2011-06-03 23:04 Zac Medico
2011-06-03 22:38 Zac Medico
2011-06-03  3:52 Zac Medico
2011-06-03  3:31 Zac Medico
2011-05-27 23:17 Zac Medico
2011-05-27 22:56 Zac Medico
2011-05-27  3:29 Zac Medico
2011-05-27  1:23 Zac Medico
2011-05-27  0:36 Zac Medico
2011-05-26 22:15 Zac Medico
2011-05-26 13:02 Zac Medico
2011-05-26 12:22 Zac Medico
2011-05-26 12:22 Zac Medico
2011-05-26  6:41 Zac Medico
2011-05-26  1:08 Zac Medico
2011-05-26  0:31 Zac Medico
2011-05-25  6:33 Zac Medico
2011-05-25  6:26 Zac Medico
2011-05-25  3:58 Zac Medico
2011-05-25  3:11 Zac Medico
2011-05-25  2:53 Zac Medico
2011-05-25  0:45 Zac Medico
2011-05-25  0:30 Zac Medico
2011-05-24  5:55 Zac Medico
2011-05-23 22:12 Zac Medico
2011-05-23 21:21 Zac Medico
2011-05-22 21:22 Zac Medico
2011-05-22 18:54 Zac Medico
2011-05-22  0:48 Zac Medico
2011-05-21  8:40 Zac Medico
2011-05-20 22:01 Zac Medico
2011-05-20 21:58 Zac Medico
2011-05-20 20:40 Zac Medico
2011-05-20  6:32 Zac Medico
2011-05-20  6:24 Zac Medico
2011-05-20  4:53 Zac Medico
2011-05-18  4:37 Zac Medico
2011-05-18  4:01 Zac Medico
2011-05-18  2:16 Zac Medico
2011-05-18  1:50 Zac Medico
2011-05-18  1:31 Zac Medico
2011-05-18  0:55 Zac Medico
2011-05-17 21:32 Zac Medico
2011-05-17 19:44 Zac Medico
2011-05-17  7:10 Zac Medico
2011-05-17  6:55 Zac Medico
2011-05-17  6:29 Zac Medico
2011-05-17  6:11 Zac Medico
2011-05-16 19:31 Zac Medico
2011-05-16  7:21 Zac Medico
2011-05-16  7:10 Zac Medico
2011-05-16  6:55 Zac Medico
2011-05-16  6:18 Zac Medico
2011-05-15  9:02 Zac Medico
2011-05-15  8:14 Zac Medico
2011-05-15  8:03 Zac Medico
2011-05-15  5:21 Zac Medico
2011-05-14 21:01 Zac Medico
2011-05-11 23:49 Zac Medico
2011-05-11 20:24 Zac Medico
2011-05-11  4:07 Zac Medico
2011-05-10 23:53 Zac Medico
2011-05-10 23:53 Zac Medico
2011-05-10  5:11 Zac Medico
2011-05-10  1:03 Zac Medico
2011-05-09 22:34 Zac Medico
2011-05-09  6:28 Zac Medico
2011-05-09  6:09 Zac Medico
2011-05-08 19:05 Zac Medico
2011-05-08 18:27 Zac Medico
2011-05-08  6:25 Zac Medico
2011-05-08  5:58 Zac Medico
2011-05-08  4:53 Zac Medico
2011-05-07  3:28 Zac Medico
2011-05-05 17:20 Zac Medico
2011-05-05 15:56 Zac Medico
2011-05-04 21:42 Zac Medico
2011-05-04 18:19 Zac Medico
2011-05-04 17:24 Zac Medico
2011-05-02 20:00 Zac Medico
2011-05-02 19:35 Zac Medico
2011-05-02  3:10 Zac Medico
2011-05-02  1:44 Zac Medico
2011-05-01 23:28 Zac Medico
2011-05-01 21:17 Zac Medico
2011-05-01 20:23 Zac Medico
2011-04-30 20:41 Zac Medico
2011-04-29 16:08 Zac Medico
2011-04-29 15:04 Zac Medico
2011-04-28 21:07 Zac Medico
2011-04-28 13:00 Zac Medico
2011-04-27 22:58 Zac Medico
2011-04-27 16:14 Zac Medico
2011-04-27 14:36 Zac Medico
2011-04-27 14:06 Zac Medico
2011-04-26 23:58 Zac Medico
2011-04-26 20:50 Arfrever Frehtes Taifersar Arahesis
2011-04-26 20:27 Zac Medico
2011-04-11 19:01 Zac Medico
2011-04-10 20:06 Zac Medico
2011-04-10 20:04 Zac Medico
2011-03-30 18:38 Zac Medico
2011-03-26 17:25 Zac Medico
2011-03-26 16:13 Zac Medico
2011-03-26  8:53 Zac Medico
2011-03-26  7:06 Zac Medico
2011-03-26  3:38 Zac Medico
2011-03-25 16:53 Zac Medico
2011-03-25 16:00 Zac Medico
2011-03-25  1:17 Zac Medico
2011-03-24  4:09 Zac Medico
2011-03-21  0:16 Zac Medico
2011-03-20 15:58 Zac Medico
2011-03-18 23:45 Zac Medico
2011-03-18 21:38 Zac Medico
2011-03-18 21:11 Zac Medico
2011-03-17 21:40 Zac Medico
2011-03-17 20:08 Zac Medico
2011-03-17  5:36 Zac Medico
2011-03-17  4:57 Zac Medico
2011-03-17  4:51 Zac Medico
2011-03-17  3:47 Zac Medico
2011-03-17  1:43 Zac Medico
2011-03-17  1:19 Zac Medico
2011-03-17  0:36 Zac Medico
2011-03-12 18:39 Zac Medico
2011-03-11  6:02 Zac Medico
2011-03-11  6:02 Zac Medico
2011-03-11  3:30 Zac Medico
2011-03-10  5:55 Zac Medico
2011-03-09  3:29 Zac Medico
2011-03-09  2:54 Arfrever Frehtes Taifersar Arahesis
2011-03-02 16:40 Zac Medico
2011-03-01 21:53 Zac Medico
2011-02-28 18:01 Zac Medico
2011-02-25  6:30 Zac Medico
2011-02-25  6:00 Zac Medico
2011-02-22 17:31 Zac Medico
2011-02-22  3:16 Zac Medico
2011-02-22  3:00 Zac Medico
2011-02-22  2:40 Zac Medico
2011-02-22  2:09 Zac Medico
2011-02-22  0:37 Zac Medico
2011-02-20  9:44 Zac Medico
2011-02-20  9:41 Zac Medico
2011-02-18 16:45 Zac Medico
2011-02-18 16:17 Zac Medico
2011-02-18 16:00 Zac Medico
2011-02-18 15:19 Zac Medico
2011-02-18 12:05 Zac Medico
2011-02-17 10:33 Zac Medico
2011-02-14 17:01 Zac Medico
2011-02-14 16:44 Zac Medico
2011-02-14 16:33 Zac Medico
2011-02-14 15:30 Zac Medico
2011-02-14  7:22 Zac Medico
2011-02-14  7:17 Zac Medico
2011-02-14  6:45 Zac Medico
2011-02-14  6:06 Zac Medico
2011-02-14  5:51 Zac Medico
2011-02-14  5:01 Zac Medico
2011-02-14  3:29 Zac Medico
2011-02-13 11:14 Zac Medico
2011-02-13  9:13 Zac Medico
2011-02-12  6:10 Zac Medico
2011-02-11  8:59 Zac Medico
2011-02-08 19:40 Zac Medico
2011-02-05  7:33 Zac Medico
2011-02-05  3:21 Zac Medico
2011-02-04 17:43 zmedico
2011-02-04 15:46 zmedico

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1350376434.65e69242814553b826b9277495a5f62b79569269.zmedico@gentoo \
    --to=zmedico@gentoo.org \
    --cc=gentoo-commits@lists.gentoo.org \
    --cc=gentoo-dev@lists.gentoo.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox