#!/usr/bin/python
#
# Produce nicely formatted lists of Debian packages and developers.
#
# Input is a list of package names on the command line. Output is a list
# of the following format:
#
#       J. Random Developer <jrandom@debian.org>
#           j-random-package
#           j-random-other
#
#       Diana Hacker <diana@example.org>
#           fun-package
#           more-fun-package
# 
# Lars Wirzenius <liw@iki.fi>

import os, re, sys

def get_developer_given_package(package_name):
    developer = None
    header = "Maintainer:"
    f = os.popen("apt-cache show '%s'" % package_name, "r")
    for line in f:
        if line[:len(header)] == header:
            developer = line[len(header):].strip()
    f.close()
    return developer

pat = re.compile(r"^(?P<name>.*)\s+<.*@(?P<domain>.*)>\s*$")

def parse_developer(developer):
    m = pat.match(developer.lower())
    if m and m.group("domain") != "lists.debian.org":
        name = m.group("name").split()
        name.reverse()
        return name, developer
    elif m:
        return m.group("name").split(), developer
    else:
        return developer, developer

def sort_developers(developers):
    list = map(parse_developer, developers)
    list.sort()
    return map(lambda t: t[-1], list)

def main():
    errors = 0
    dict = {}

    for package_name in sys.argv[1:]:
        developer = get_developer_given_package(package_name)
        if developer:
            if not dict.has_key(developer):
                dict[developer] = []
            dict[developer].append(package_name)
        else:
            sys.stderr.write("E: Unknown package: " + package_name)
            errors = 1

    developers = sort_developers(dict.keys())
    for developer in developers:
        print developer
        packages = dict[developer]
        packages.sort()
        for package in packages:
            print "   ", package
        print

    sys.exit(errors)

if __name__ == "__main__":
    main()
