#!/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 '-------------------------------------------------------------------------------'

	
		
		
		

		




