| #! /usr/bin/env python | |
| """Turn a pile of RCS log output into ChangeLog file entries. | |
| """ | |
| import sys | |
| import string | |
| import re | |
| import getopt | |
| import time | |
| def main(): | |
| args = sys.argv[1:] | |
| opts, args = getopt.getopt(args, 'p:') | |
| prefix = '' | |
| for o, a in opts: | |
| if p == '-p': prefix = a | |
| f = sys.stdin | |
| allrevs = [] | |
| while 1: | |
| file = getnextfile(f) | |
| if not file: break | |
| revs = [] | |
| while 1: | |
| rev = getnextrev(f, file) | |
| if not rev: | |
| break | |
| revs.append(rev) | |
| if revs: | |
| allrevs[len(allrevs):] = revs | |
| allrevs.sort() | |
| allrevs.reverse() | |
| for rev in allrevs: | |
| formatrev(rev, prefix) | |
| parsedateprog = re.compile( | |
| '^date: ([0-9]+)/([0-9]+)/([0-9]+) ' + | |
| '([0-9]+):([0-9]+):([0-9]+); author: ([^ ;]+)') | |
| authormap = { | |
| 'guido': 'Guido van Rossum <guido@cnri.reston.va.us>', | |
| 'jack': 'Jack Jansen <jack@cwi.nl>', | |
| 'sjoerd': 'Sjoerd Mullender <sjoerd@cwi.nl>', | |
| } | |
| def formatrev(rev, prefix): | |
| dateline, file, revline, log = rev | |
| if parsedateprog.match(dateline) >= 0: | |
| fields = parsedateprog.group(1, 2, 3, 4, 5, 6) | |
| author = parsedateprog.group(7) | |
| if authormap.has_key(author): author = authormap[author] | |
| tfields = map(string.atoi, fields) + [0, 0, 0] | |
| tfields[5] = tfields[5] - time.timezone | |
| t = time.mktime(tuple(tfields)) | |
| print time.ctime(t), '', author | |
| words = string.split(log) | |
| words[:0] = ['*', prefix + file + ':'] | |
| maxcol = 72-8 | |
| col = maxcol | |
| for word in words: | |
| if col > 0 and col + len(word) >= maxcol: | |
| print '\t' + word, | |
| col = -1 | |
| else: | |
| print word, | |
| col = col + 1 + len(word) | |
| startprog = re.compile("^Working file: (.*)$") | |
| def getnextfile(f): | |
| while 1: | |
| line = f.readline() | |
| if not line: return None | |
| if startprog.match(line) >= 0: | |
| file = startprog.group(1) | |
| # Skip until first revision | |
| while 1: | |
| line = f.readline() | |
| if not line: return None | |
| if line[:10] == '='*10: return None | |
| if line[:10] == '-'*10: break | |
| ## print "Skipped", line, | |
| return file | |
| ## else: | |
| ## print "Ignored", line, | |
| def getnextrev(f, file): | |
| # This is called when we are positioned just after a '---' separator | |
| revline = f.readline() | |
| dateline = f.readline() | |
| log = '' | |
| while 1: | |
| line = f.readline() | |
| if not line: break | |
| if line[:10] == '='*10: | |
| # Ignore the *last* log entry for each file since it | |
| # is the revision since which we are logging. | |
| return None | |
| if line[:10] == '-'*10: break | |
| log = log + line | |
| return dateline, file, revline, log | |
| if __name__ == '__main__': | |
| main() |