1#! /usr/bin/env python 2 3"""Turn a pile of RCS log output into ChangeLog file entries. 4 5""" 6 7import sys 8import string 9import re 10import getopt 11import time 12 13def main(): 14 args = sys.argv[1:] 15 opts, args = getopt.getopt(args, 'p:') 16 prefix = '' 17 for o, a in opts: 18 if p == '-p': prefix = a 19 20 f = sys.stdin 21 allrevs = [] 22 while 1: 23 file = getnextfile(f) 24 if not file: break 25 revs = [] 26 while 1: 27 rev = getnextrev(f, file) 28 if not rev: 29 break 30 revs.append(rev) 31 if revs: 32 allrevs[len(allrevs):] = revs 33 allrevs.sort() 34 allrevs.reverse() 35 for rev in allrevs: 36 formatrev(rev, prefix) 37 38parsedateprog = re.compile( 39 '^date: ([0-9]+)/([0-9]+)/([0-9]+) ' + 40 '([0-9]+):([0-9]+):([0-9]+); author: ([^ ;]+)') 41 42authormap = { 43 'guido': 'Guido van Rossum <guido@cnri.reston.va.us>', 44 'jack': 'Jack Jansen <jack@cwi.nl>', 45 'sjoerd': 'Sjoerd Mullender <sjoerd@cwi.nl>', 46 } 47 48def formatrev(rev, prefix): 49 dateline, file, revline, log = rev 50 if parsedateprog.match(dateline) >= 0: 51 fields = parsedateprog.group(1, 2, 3, 4, 5, 6) 52 author = parsedateprog.group(7) 53 if authormap.has_key(author): author = authormap[author] 54 tfields = map(string.atoi, fields) + [0, 0, 0] 55 tfields[5] = tfields[5] - time.timezone 56 t = time.mktime(tuple(tfields)) 57 print time.ctime(t), '', author 58 words = string.split(log) 59 words[:0] = ['*', prefix + file + ':'] 60 maxcol = 72-8 61 col = maxcol 62 for word in words: 63 if col > 0 and col + len(word) >= maxcol: 64 print 65 print '\t' + word, 66 col = -1 67 else: 68 print word, 69 col = col + 1 + len(word) 70 print 71 print 72 73startprog = re.compile("^Working file: (.*)$") 74 75def getnextfile(f): 76 while 1: 77 line = f.readline() 78 if not line: return None 79 if startprog.match(line) >= 0: 80 file = startprog.group(1) 81 # Skip until first revision 82 while 1: 83 line = f.readline() 84 if not line: return None 85 if line[:10] == '='*10: return None 86 if line[:10] == '-'*10: break 87## print "Skipped", line, 88 return file 89## else: 90## print "Ignored", line, 91 92def getnextrev(f, file): 93 # This is called when we are positioned just after a '---' separator 94 revline = f.readline() 95 dateline = f.readline() 96 log = '' 97 while 1: 98 line = f.readline() 99 if not line: break 100 if line[:10] == '='*10: 101 # Ignore the *last* log entry for each file since it 102 # is the revision since which we are logging. 103 return None 104 if line[:10] == '-'*10: break 105 log = log + line 106 return dateline, file, revline, log 107 108if __name__ == '__main__': 109 main() 110