summaryrefslogtreecommitdiffstats
path: root/pym
diff options
context:
space:
mode:
authorZac Medico <zmedico@gentoo.org>2010-10-11 12:51:26 -0700
committerZac Medico <zmedico@gentoo.org>2010-10-11 12:51:26 -0700
commit5de77e44aa10ed5ff8262c184df651c2adc868bd (patch)
tree1442534456c1e612447e2db32870a778ecfa72bc /pym
parentc78d7fd25d76e6f8f5e28215038820b70c08b2a4 (diff)
downloadportage-5de77e44aa10ed5ff8262c184df651c2adc868bd.tar.gz
portage-5de77e44aa10ed5ff8262c184df651c2adc868bd.tar.bz2
portage-5de77e44aa10ed5ff8262c184df651c2adc868bd.zip
has/best_version: eqawarn if EAPI wrong for atom
Instead of calling die as in bug #340387, just call eqawarn for the time being.
Diffstat (limited to 'pym')
-rw-r--r--pym/_emerge/AbstractEbuildProcess.py2
-rw-r--r--pym/portage/package/ebuild/_ipc/QueryCommand.py52
2 files changed, 46 insertions, 8 deletions
diff --git a/pym/_emerge/AbstractEbuildProcess.py b/pym/_emerge/AbstractEbuildProcess.py
index d711c0585..b99f1df8a 100644
--- a/pym/_emerge/AbstractEbuildProcess.py
+++ b/pym/_emerge/AbstractEbuildProcess.py
@@ -130,7 +130,7 @@ class AbstractEbuildProcess(SpawnProcess):
def _start_ipc_daemon(self):
self._exit_command = ExitCommand()
self._exit_command.reply_hook = self._exit_command_callback
- query_command = QueryCommand(self.settings)
+ query_command = QueryCommand(self.settings, self.phase)
commands = {
'best_version' : query_command,
'exit' : self._exit_command,
diff --git a/pym/portage/package/ebuild/_ipc/QueryCommand.py b/pym/portage/package/ebuild/_ipc/QueryCommand.py
index 59663b1d9..7d006acf0 100644
--- a/pym/portage/package/ebuild/_ipc/QueryCommand.py
+++ b/pym/portage/package/ebuild/_ipc/QueryCommand.py
@@ -3,7 +3,11 @@
import portage
from portage import os
+from portage import StringIO
+from portage import _encodings
+from portage import _unicode_decode
from portage.dep import Atom
+from portage.elog import messages as elog_messages
from portage.exception import InvalidAtom
from portage.package.ebuild._ipc.IpcCommand import IpcCommand
from portage.util import normalize_path
@@ -11,25 +15,32 @@ from portage.versions import best
class QueryCommand(IpcCommand):
- __slots__ = ('settings',)
+ __slots__ = ('phase', 'settings',)
_db = None
- def __init__(self, settings):
+ def __init__(self, settings, phase):
IpcCommand.__init__(self)
self.settings = settings
+ self.phase = phase
def __call__(self, argv):
"""
@returns: tuple of (stdout, stderr, returncode)
"""
- cmd, root, atom = argv
+ cmd, root, atom_str = argv
try:
- atom = Atom(atom, eapi=self.settings.get('EAPI'))
+ atom = Atom(atom_str)
except InvalidAtom:
- return ('', 'invalid atom: %s\n' % atom, 2)
+ return ('', 'invalid atom: %s\n' % atom_str, 2)
+
+ warnings = []
+ try:
+ atom = Atom(atom_str, eapi=self.settings.get('EAPI'))
+ except InvalidAtom as e:
+ warnings.append(_unicode_decode("QA Notice: %s: %s") % (cmd, e))
use = self.settings.get('PORTAGE_BUILT_USE')
if use is None:
@@ -42,6 +53,10 @@ class QueryCommand(IpcCommand):
if db is None:
db = portage.db
+ warnings_str = ''
+ if warnings:
+ warnings_str = self._elog('eqawarn', warnings)
+
root = normalize_path(root).rstrip(os.path.sep) + os.path.sep
if root not in db:
return ('', 'invalid ROOT: %s\n' % root, 2)
@@ -53,9 +68,32 @@ class QueryCommand(IpcCommand):
returncode = 0
else:
returncode = 1
- return ('', '', returncode)
+ return ('', warnings_str, returncode)
elif cmd == 'best_version':
m = best(vardb.match(atom))
- return ('%s\n' % m, '', 0)
+ return ('%s\n' % m, warnings_str, 0)
else:
return ('', 'invalid command: %s\n' % cmd, 2)
+
+ def _elog(self, elog_funcname, lines):
+ """
+ This returns a string, to be returned via ipc and displayed at the
+ appropriate place in the build output. We wouldn't want to open the
+ log here since it is already opened by AbstractEbuildProcess and we
+ don't want to corrupt it, especially if it is being written with
+ compression.
+ """
+ out = StringIO()
+ phase = self.phase
+ elog_func = getattr(elog_messages, elog_funcname)
+ global_havecolor = portage.output.havecolor
+ try:
+ portage.output.havecolor = \
+ self.settings.get('NOCOLOR', 'false').lower() in ('no', 'false')
+ for line in lines:
+ elog_func(line, phase=phase, key=self.settings.mycpv, out=out)
+ finally:
+ portage.output.havecolor = global_havecolor
+ msg = _unicode_decode(out.getvalue(),
+ encoding=_encodings['content'], errors='replace')
+ return msg