# 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) """ cmd, root, atom = argv try: atom = Atom(atom, eapi=self.settings.get('EAPI')) except InvalidAtom: return ('', 'invalid atom: %s\n' % atom, 2) use = self.settings.get('PORTAGE_BUILT_USE') if use is None: use = self.settings['PORTAGE_USE'] 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)