#!/usr/bin/python # cvssvnlog by Miroslav Novak # Filter changing cvs log output to svn log style. import sys import re def mystrip(s): s = s.replace('\r','') s = s.replace('\n','') return s showfiles = 0 for arg in sys.argv[1:]: if arg=='-v': showfiles = 1 elif arg=='-h': print "Usage: cvs log | cvssvnlog.py [-v]" print "Filter changing cvs log output to svn log style." sys.exit() else: print "cvssvnlog.py: Unknown option. Try -h for help." sys.exit() patWrkf = re.compile('^Working file: (.+)$') patRev = re.compile('^revision (.+)$') patRevA = re.compile('^date: ([^;]+); author: ([^;]+); state: ([^;]+);( lines: ([^;]+);?)?( commitid: ([^;]+);)?$'); patSep = re.compile('^(-{20,}|={20,})$'); file = '*empty*' db = {} while 1: lin = sys.stdin.readline() if not(lin): break lin = mystrip(lin) m = patWrkf.match(lin) if m: file = m.group(1) m = patRev.match(lin) if m: rev = m.group(1) lin = sys.stdin.readline() lin = mystrip(lin) m = patRevA.match(lin) date = m.group(1) author = m.group(2) state = m.group(3) lines = m.group(5) commitid = (m.group(7) or (author+'-'+date)) #sometimes is commitid missing msg='' while 1: lin = sys.stdin.readline() lin = mystrip(lin) if patSep.match(lin): break msg = msg + lin + "\n" if not db.has_key(commitid): db[commitid]={'author': author, 'date': date, 'msg': msg, 'files':[]} db[commitid]['files'].append({'file': file, 'rev': rev, 'state': state, 'lines':lines}) items = [[v[1]['date'],v[1]] for v in db.items()] items.sort(reverse=True) for zzz, rec in items: print '-------------------------------------------------------------------------------' print rec['author'], "|", rec['date'] if showfiles: print 'Changed paths:' for frec in rec['files']: if frec['state']=='dead': type='D' elif frec['lines']: type='M' else: type='A' print ' ',type,frec['file'], "\t", frec['rev'] #, (frec['lines'] or '') print print rec['msg'] print '-------------------------------------------------------------------------------'