blob: ec52e400f26af81f70bdaa8d17d4d4f0635c499f [file] [log] [blame]
# Copyright 2010 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
import portage
from portage import os
from portage.dep import Atom
from portage.exception import InvalidAtom
from portage.package.ebuild._ipc.IpcCommand import IpcCommand
from portage.util import normalize_path
from portage.versions import best
class QueryCommand(IpcCommand):
__slots__ = ('settings',)
_db = None
def __init__(self, settings):
IpcCommand.__init__(self)
self.settings = settings
def __call__(self, argv):
"""
@returns: tuple of (stdout, stderr, returncode)
"""
# Note that $USE is passed via IPC in order to ensure that
# we have the correct value for built/installed packages,
# since the config class doesn't currently provide a way
# to access built/installed $USE that would work in all
# possible scenarios.
cmd, root, atom, use = argv
try:
atom = Atom(atom)
except InvalidAtom:
return ('', 'invalid atom: %s\n' % atom, 2)
use = frozenset(use.split())
atom = atom.evaluate_conditionals(use)
db = self._db
if db is None:
db = portage.db
root = normalize_path(root).rstrip(os.path.sep) + os.path.sep
if root not in db:
return ('', 'invalid ROOT: %s\n' % root, 2)
vardb = db[root]["vartree"].dbapi
if cmd == 'has_version':
if vardb.match(atom):
returncode = 0
else:
returncode = 1
return ('', '', returncode)
elif cmd == 'best_version':
m = best(vardb.match(atom))
return ('%s\n' % m, '', 0)
else:
return ('', 'invalid command: %s\n' % cmd, 2)