#!/usr/bin/perl # Process `cvs log' output to get a resonable changelog # (c) 2003--2004 Martin Mares use Digest::MD5; use POSIX; my %names= ( 'mj' => 'Martin Mares ', 'feela' => 'Ondrej Filip ', 'pavel' => 'Pavel Machek ' ); while () { chomp; /^$/ && next; /^[?]/ && next; /^RCS file: / || die; $_ = ; chomp; my ($file) = /^Working file: (.*)$/ or die; #print "$file\n"; do { $_ = or die; } while (!/^description:/); $_ = ; for(;;) { /^======/ && last; if (/^------/) { $_ = ; next; } /^revision / || die; $_ = ; my ($author) = /;\s*author:\s*([^;]+)/ or die; my ($yy,$mm,$dd,$HH,$MM,$SS) = /^date: (....)\/(..)\/(..) (..):(..):(..);/ or die; my $t = POSIX::mktime($SS,$MM,$HH,$dd,$mm-1,$yy-1900) or die; my $T = sprintf("%06d", int(($t + 1800)/3600)); $d = ""; while ($_ = ) { /^(-----|=====)/ && last; $d .= " $_"; } my $id = "$T:" . Digest::MD5::md5_hex($d); if (!defined $msg{$id}) { $date{$id} = "$yy-$mm-$dd $HH:$MM:$SS"; $msg{$id} = $d; $files{$id} = ""; $author{$id} = $author; } $files{$id} .= " * $file\n"; #print "\t$id\n"; } } foreach $id (sort keys %date) { if (!exists ($names{$author{$id}})) { die "Unknown commiter $author{$id}"; } print "### ", $date{$id}, " ", $names{$author{$id}}, "\n\n"; print $files{$id}, "\n"; print $msg{$id}, "\n"; }