#!/usr/bin/env python
#
# Get the change records for each revision since a specified tag name.
#

__revision__ = "$Id: cvschanges,v 1.3 2002/05/08 21:41:48 nascheme Exp $"

import os
import sys
import re
import string

def main():
    if len(sys.argv) not in (2, 3):
        sys.exit("Usage: cvschanges <tagname> [<username>]")
    tag = sys.argv[1]
    if len(sys.argv) == 3:
        username = sys.argv[2]
    else:
        username = None

    _re_revision = re.compile(r"revision\s([\d.]+)")
    _re_author = re.compile(r"date:\s([^;]+);\s+author:\s([^;]+);\s+state:\s")
    _re_endlog = re.compile(r"^(-{28}|={77})\n$")

    p = os.popen('cvs log -N -r%s:: 2> /dev/null' % tag, 'r')
    is_attic = 0

    descriptions = {} # { description : [(filename, rev, date, author)*] }

    while 1:
        line = p.readline()
        if not line:
            break
        if line.startswith('RCS file:'):
            is_attic = line.find('Attic') != -1
        if line.startswith('Working file:'):
            filename = line[14:-1]
        m = _re_revision.match(line)
        if m:
            rev = m.group(1)
            line = p.readline()
            m = _re_author.match(line)
            assert m, "unexpected log format"
            date = m.group(1)
            author = m.group(2)
            description = ""
            while 1:
                line = p.readline()
                if _re_endlog.match(line):
                    break
                description += line

            if not is_attic:
                descriptions.setdefault(description, []).append((date,
                                                                 filename,
                                                                 rev,
                                                                 author))
    assert p.close() is None, "cvs command failed"

    items = [(v, k) for (k, v) in descriptions.items()]
    items.sort()
    for files, description in items:
        author = files[0][-1]
        if username is not None and author != username:
            continue
        print "-" * 78
        for date, filename, rev, author in files:
            print "%-50s %6s %s" % (filename, rev, date)
        if username is None:
            print author + ":"
        description = description.strip() # emacs weenies
        for line in description.split("\n"):
            print "  ", line

main()
