summaryrefslogtreecommitdiffstats
path: root/pym/portage
diff options
context:
space:
mode:
authorZac Medico <zmedico@gentoo.org>2010-08-13 12:14:06 -0700
committerZac Medico <zmedico@gentoo.org>2010-08-13 12:14:06 -0700
commit612a8abf9995c593101b8344fda15acd8267c5e3 (patch)
tree41f74d2708d9b86dd12196baaf2975a7721880df /pym/portage
parent26744c1e52a05f7bdc9a14926eb15d7cd08cd354 (diff)
downloadportage-612a8abf9995c593101b8344fda15acd8267c5e3.tar.gz
portage-612a8abf9995c593101b8344fda15acd8267c5e3.tar.bz2
portage-612a8abf9995c593101b8344fda15acd8267c5e3.zip
Bug #315615 - Use EbuildIpcDaemon to implement has_version and best_version.
This provides performance benefits and also avoids permissions issues with FEATURES=userpriv.
Diffstat (limited to 'pym/portage')
-rw-r--r--pym/portage/package/ebuild/_ipc/QueryCommand.py55
1 files changed, 55 insertions, 0 deletions
diff --git a/pym/portage/package/ebuild/_ipc/QueryCommand.py b/pym/portage/package/ebuild/_ipc/QueryCommand.py
new file mode 100644
index 000000000..684837456
--- /dev/null
+++ b/pym/portage/package/ebuild/_ipc/QueryCommand.py
@@ -0,0 +1,55 @@
+# 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__ = ()
+
+ _db = None
+
+ def __init__(self):
+ IpcCommand.__init__(self)
+
+ def __call__(self, argv):
+ """
+ @returns: tuple of (stdout, stderr, returncode)
+ """
+ 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)