#!/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 []") 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()