self._completed_tasks = set()
self._failed_pkgs = []
self._failed_pkgs_all = []
+ self._failed_pkgs_die_msgs = []
self._failed_fetches = []
self._parallel_fetch = False
merge_count = len([x for x in mergelist \
self._logger.log(" *** Finished. Cleaning up...")
+ background = self._max_jobs > 1
+ if self._failed_pkgs_all and background and \
+ self._failed_pkgs_die_msgs and \
+ not _flush_elog_mod_echo():
+
+ printer = portage.output.EOutput()
+ for mysettings, key, logentries in self._failed_pkgs_die_msgs:
+ root_msg = ""
+ if mysettings["ROOT"] != "/":
+ root_msg = " merged to %s" % mysettings["ROOT"]
+ print
+ printer.einfo("Error messages for package %s%s:" % \
+ (colorize("INFORM", key), root_msg))
+ print
+ for phase in portage.const.EBUILD_PHASES:
+ if phase not in logentries:
+ continue
+ for msgtype, msgcontent in logentries[phase]:
+ if isinstance(msgcontent, basestring):
+ msgcontent = [msgcontent]
+ for line in msgcontent:
+ printer.eerror(line.strip("\n"))
+
if len(self._failed_pkgs_all) > 1:
_flush_elog_mod_echo()
msg = "The following packages have " + \
return rval
+ def _elog_listener(self, mysettings, key, logentries, fulltext):
+ errors = portage.elog.filter_loglevels(logentries, ["ERROR"])
+ if errors:
+ self._failed_pkgs_die_msgs.append(
+ (mysettings, key, errors))
+
def _add_packages(self):
pkg_queue = self._pkg_queue
for pkg in self._mergelist:
self._add_packages()
pkg_queue = self._pkg_queue
failed_pkgs = self._failed_pkgs
+ portage.elog._emerge_elog_listener = self._elog_listener
rval = os.EX_OK
try:
self._main_loop()
finally:
self._main_loop_cleanup()
- # discard any failures and return the
- # exist status of the last one
+ portage.elog._emerge_elog_listener = None
if failed_pkgs:
pkg, rval = failed_pkgs[-1]
"""
Dump the mod_echo output now so that our other
notifications are shown last.
+ @rtype: bool
+ @returns: True if messages were shown, False otherwise.
"""
+ messages_shown = False
try:
from portage.elog import mod_echo
except ImportError:
pass # happens during downgrade to a version without the module
else:
+ messages_shown = bool(mod_echo._items)
mod_echo.finalize()
+ return messages_shown
def post_emerge(trees, mtimedb, retval):
"""
_elog_mod_imports[name] = m
return m
+_emerge_elog_listener = None
_elog_atexit_handlers = []
_preserve_logentries = {}
def elog_process(cpv, mysettings, phasefilter=None):
- global _elog_atexit_handlers, _preserve_logentries
+ global _elog_atexit_handlers, _emerge_elog_listener, _preserve_logentries
logsystems = mysettings.get("PORTAGE_ELOG_SYSTEM","").split()
for s in logsystems:
default_fulllog = _combine_logentries(default_logentries)
+ if _emerge_elog_listener is not None:
+ _emerge_elog_listener(mysettings, str(key),
+ default_logentries, default_fulllog)
+
# pass the processing to the individual modules
logsystems = mysettings["PORTAGE_ELOG_SYSTEM"].split()
for s in logsystems: