#!/usr/bin/env python """ Given a list of package names, provide the description for each of the packages. Why is this missing from Gentoo? """ __version__ = "Revision: 1.6 " __author__ = "Martin Blais " # stdlib imports import sys, os, re from os.path import * portage_tree = '/usr/portage' def portage_dirs(root): "Generate a 2-level list of directories." listdir = os.listdir for d1 in filter(isdir, [join(root, x) for x in listdir(root)]): for d2 in filter(isdir, [join(d1, x) for x in listdir(d1)]): yield d2 ## FIXME: TODO -- support overlays def get_portage_map(root): "Create a map of the simple package names to their complete names." m = {} for dn in portage_dirs(root): fullname = join(basename(dirname(dn)), basename(dn)) el = (fullname, dn) m.setdefault(basename(dn), []).append(el) m.setdefault(fullname, []).append(el) return m def main(): import optparse parser = optparse.OptionParser(__doc__.strip()) opts, args = parser.parse_args() portage_map = get_portage_map(portage_tree) errwrite = sys.stderr.write descs = [] for arg in args: arg = arg.strip('/') # Ignore all files with an extension, for ignoring metadata.xml files. if splitext(arg)[1]: continue try: packages = portage_map[arg] except KeyError: errwrite("Warning: package '%s' not found.\n" % arg) continue for packname, packdir in packages: files = filter(lambda x: x.endswith('.ebuild'), os.listdir(packdir)) if not files: errwrite("Warning: no ebuild found for '%s'.\n" % packname) continue files.sort() files.reverse() # Start with the latest desc = None for fn in files: ebuild = join(packdir, fn) f = open(ebuild, 'r') mo = re.search('DESCRIPTION="(.*?)"', f.read(), re.DOTALL) if mo: description = mo.group(1).replace('\n', ' ') desc = (packname, description) break if not desc: errwrite("Warning: no description found for '%s'.\n" % packname) continue descs.append(desc) if descs: fmt = '%%-%ds : %%s' % max(len(x[0]) for x in descs) for name, desc in descs: print fmt % (name, desc) if __name__ == '__main__': main()