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()
next 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