portageq: add new expand_virtual function
authorZac Medico <zmedico@gentoo.org>
Thu, 2 Jun 2011 12:50:54 +0000 (05:50 -0700)
committerZac Medico <zmedico@gentoo.org>
Thu, 2 Jun 2011 12:50:54 +0000 (05:50 -0700)
Something like this was requested in bug #157357. Now that Gentoo has
migrated all virtuals to GLEP 37 new-style virtuals, this kind of
function may be helpful in order to resolve the currently installed
provider of a particular virtual in scripts like bootstrap.sh.

Usage:

portageq expand_virtual <root> <atom>

Returns a \n separated list of atoms expanded from a
given virtual atom, excluding blocker atoms. Satisfied
virtual atoms are not included in the output, since
they are expanded to real atoms which are displayed.
Unsatisfied virtual atoms are displayed without
any expansion. The "match" command can be used to
resolve the returned atoms to specific installed
packages.

Example input/output:

$ portageq expand_virtual / virtual/jre
=dev-java/sun-jdk-1.6.0*

$ portageq expand_virtual / virtual/jre:1.5
dev-java/gcj-jdk

$ portageq expand_virtual / virtual/package-manager
sys-apps/portage

$ portageq expand_virtual / virtual/libc
sys-libs/glibc:2.2

$ portageq expand_virtual / virtual/os-headers
sys-kernel/linux-headers:0

bin/portageq

index 069ece238cc6411455cfd2a9360500fa9511c616..d6d9c170abacf23b694a5e3eb7b1465532cb8b44 100755 (executable)
@@ -43,6 +43,7 @@ except ImportError:
 del pym_path
 
 from portage import os
+from portage.dbapi._expand_new_virt import expand_new_virt
 from portage.util import writemsg, writemsg_stdout
 
 def eval_atom_use(atom):
@@ -492,6 +493,40 @@ def match(argv):
                print(cpv)
 match.uses_root = True
 
+def expand_virtual(argv):
+       """<root> <atom>
+       Returns a \\n separated list of atoms expanded from a
+       given virtual atom, excluding blocker atoms. Satisfied
+       virtual atoms are not included in the output, since
+       they are expanded to real atoms which are displayed.
+       Unsatisfied virtual atoms are displayed without
+       any expansion. The "match" command can be used to
+       resolve the returned atoms to specific installed
+       packages.
+       """
+       if len(argv) != 2:
+               writemsg("ERROR: expected 2 parameters, got %d!\n" % len(argv),
+                       noiselevel=-1)
+               return 2
+
+       root, atom = argv
+
+       try:
+               results = list(expand_new_virt(
+                       portage.db[root]["vartree"].dbapi, atom))
+       except portage.exception.InvalidAtom:
+               writemsg("ERROR: Invalid atom: '%s'\n" % atom,
+                       noiselevel=-1)
+               return 2
+
+       results.sort()
+       for x in results:
+               if not x.blocker:
+                       writemsg_stdout("%s\n" % (x,))
+
+       return os.EX_OK
+
+expand_virtual.uses_root = True
 
 def vdb_path(argv):
        """