#!/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 <blais@furius.ca>"


# 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()

