| 
									
										
										
										
											1996-11-27 19:52:01 +00:00
										 |  |  | #! /usr/bin/env python | 
					
						
							| 
									
										
										
										
											1996-07-30 19:05:41 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | """Turn a pile of RCS log output into ChangeLog file entries.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | """
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import sys | 
					
						
							|  |  |  | import string | 
					
						
							|  |  |  | import regex | 
					
						
							|  |  |  | import getopt | 
					
						
							|  |  |  | import time | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def main(): | 
					
						
							|  |  |  |     args = sys.argv[1:] | 
					
						
							|  |  |  |     opts, args = getopt.getopt(args, 'p:') | 
					
						
							|  |  |  |     prefix = '' | 
					
						
							|  |  |  |     for o, a in opts: | 
					
						
							| 
									
										
										
										
											1998-09-14 16:44:15 +00:00
										 |  |  |         if p == '-p': prefix = a | 
					
						
							| 
									
										
										
										
											1996-07-30 19:05:41 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     f = sys.stdin | 
					
						
							|  |  |  |     allrevs = [] | 
					
						
							|  |  |  |     while 1: | 
					
						
							| 
									
										
										
										
											1998-09-14 16:44:15 +00:00
										 |  |  |         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 | 
					
						
							| 
									
										
										
										
											1996-07-30 19:05:41 +00:00
										 |  |  |     allrevs.sort() | 
					
						
							|  |  |  |     allrevs.reverse() | 
					
						
							|  |  |  |     for rev in allrevs: | 
					
						
							| 
									
										
										
										
											1998-09-14 16:44:15 +00:00
										 |  |  |         formatrev(rev, prefix) | 
					
						
							| 
									
										
										
										
											1996-07-30 19:05:41 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | parsedateprog = regex.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: | 
					
						
							| 
									
										
										
										
											1998-09-14 16:44:15 +00:00
										 |  |  |         fields = parsedateprog.group(1, 2, 3, 4, 5, 6) | 
					
						
							|  |  |  |         author = parsedateprog.group(7) | 
					
						
							|  |  |  |         if authormap.has_key(author): author = authormap[author] | 
					
						
							|  |  |  |         tfields = 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, | 
					
						
							|  |  |  |                 col = -1 | 
					
						
							|  |  |  |             else: | 
					
						
							|  |  |  |                 print word, | 
					
						
							|  |  |  |             col = col + 1 + len(word) | 
					
						
							|  |  |  |         print | 
					
						
							|  |  |  |         print | 
					
						
							| 
									
										
										
										
											1996-07-30 19:05:41 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | startprog = regex.compile("^Working file: \(.*\)$") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def getnextfile(f): | 
					
						
							|  |  |  |     while 1: | 
					
						
							| 
									
										
										
										
											1998-09-14 16:44:15 +00:00
										 |  |  |         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, | 
					
						
							| 
									
										
										
										
											1996-07-30 19:05:41 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | def getnextrev(f, file): | 
					
						
							|  |  |  |     # This is called when we are positioned just after a '---' separator | 
					
						
							|  |  |  |     revline = f.readline() | 
					
						
							|  |  |  |     dateline = f.readline() | 
					
						
							|  |  |  |     log = '' | 
					
						
							|  |  |  |     while 1: | 
					
						
							| 
									
										
										
										
											1998-09-14 16:44:15 +00:00
										 |  |  |         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 | 
					
						
							| 
									
										
										
										
											1996-07-30 19:05:41 +00:00
										 |  |  |     return dateline, file, revline, log | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if __name__ == '__main__': | 
					
						
							|  |  |  |     main() |