commit:     226b398c0549d5815f81921ba35fe8ff9d02052d
Author:     Zac Medico <zmedico <AT> gentoo <DOT> org>
AuthorDate: Fri Nov 28 13:11:18 2014 +0000
Commit:     Zac Medico <zmedico <AT> gentoo <DOT> org>
CommitDate: Sat Nov 29 18:45:05 2014 +0000
URL:        
http://sources.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=226b398c

emerge --info: show /bin/sh provider (527996)

Searching contents for the /bin/sh provider is somewhat slow.
Therefore, use the basename of the symlink target to locate the
package. If this fails, then only the basename of the symlink target
will be displayed. So, typical output is something like
"sh bash 4.2_p53". Since realpath is used to resolve symlinks
recursively, this approach is also able to handle multiple levels of
symlinks such as /bin/sh -> bb -> busybox. Note that we do not parse
the output of "/bin/sh --version" because many shells do not have
a --version option.

The relevant section of the emerge --info output will now look
something like this:

Timestamp of tree: Fri, 28 Nov 2014 00:45:01 +0000
sh bash 4.2_p53
ld GNU ld (Gentoo 2.23.2 p1.0) 2.23.2

X-Gentoo-Bug: 527996
X-Gentoo-Url: https://bugs.gentoo.org/show_bug.cgi?id=527996
Acked-by: Brian Dolbec <dolsen <AT> gentoo.org>

---
 pym/_emerge/actions.py | 41 +++++++++++++++++++++++++++++++++++++++++
 1 file changed, 41 insertions(+)

diff --git a/pym/_emerge/actions.py b/pym/_emerge/actions.py
index d9c45c1..048e337 100644
--- a/pym/_emerge/actions.py
+++ b/pym/_emerge/actions.py
@@ -1556,6 +1556,47 @@ def action_info(settings, trees, myopts, myfiles):
                lastSync = "Unknown"
        append("Timestamp of tree: %s" % (lastSync,))
 
+       # Searching contents for the /bin/sh provider is somewhat
+       # slow. Therefore, use the basename of the symlink target
+       # to locate the package. If this fails, then only the
+       # basename of the symlink target will be displayed. So,
+       # typical output is something like "sh bash 4.2_p53". Since
+       # realpath is used to resolve symlinks recursively, this
+       # approach is also able to handle multiple levels of symlinks
+       # such as /bin/sh -> bb -> busybox. Note that we do not parse
+       # the output of "/bin/sh --version" because many shells
+       # do not have a --version option.
+       basename = os.path.basename(os.path.realpath(os.path.join(
+               os.sep, portage.const.EPREFIX, "bin", "sh")))
+       try:
+               Atom("null/%s" % basename)
+       except InvalidAtom:
+               matches = None
+       else:
+               try:
+                       # Try a match against the basename, which should work 
for
+                       # busybox and most shells.
+                       matches = (trees[trees._running_eroot]["vartree"].dbapi.
+                               match(basename))
+               except portage.exception.AmbiguousPackageName:
+                       # If the name is ambiguous, then restrict our match
+                       # to the app-shells category.
+                       matches = (trees[trees._running_eroot]["vartree"].dbapi.
+                               match("app-shells/%s" % basename))
+
+       if matches:
+               pkg = matches[-1]
+               name = pkg.cp
+               version = pkg.version
+               # Omit app-shells category from the output.
+               if name.startswith("app-shells/"):
+                       name = name[len("app-shells/"):]
+               sh_str = "%s %s" % (name, version)
+       else:
+               sh_str = basename
+
+       append("sh %s" % sh_str)
+
        ld_names = []
        if chost:
                ld_names.append(chost + "-ld")

Reply via email to