PageRenderTime 52ms CodeModel.GetById 20ms app.highlight 10ms RepoModel.GetById 20ms app.codeStats 0ms

/Demo/pdist/makechangelog.py

http://unladen-swallow.googlecode.com/
Python | 109 lines | 102 code | 3 blank | 4 comment | 0 complexity | 19ee44f886988b7ac0274ed2df3e8925 MD5 | raw file
  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()