| #! /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 author in authormap: author = authormap[author] |
| tfields = list(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() |
| print('\t' + word, end=' ') |
| col = -1 |
| else: |
| print(word, end=' ') |
| col = col + 1 + len(word) |
| print() |
| print() |
| |
| 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() |