Source

hg-review-mutt-test / cvslog2changelog.pl

#!/usr/bin/perl

# use Data::Dumper;

%Authors = (roessler => 'Thomas Roessler <roessler@does-not-exist.org>',
	    me => 'Michael Elkins <me@mutt.org>');

@Changes = ();
$change = {};

while (<>) {
    chomp $_;
    if ($_ =~ /^Working file: (.*)$/) {
	$workfile = $1;
	$change->{workfile} = $workfile;
	$change->{logmsg}   = '';
	$change->{author}   = '';
	$change->{revision} = '';

#	print STDERR "workfile: ", $workfile, "\n";
	
    } 
    elsif ($_ =~ /^(=======|------)/) {
	if ($change->{revision}) {
	    
	    # Some beautifications: Date, author.
	    if ($change->{author} =~ /^(.*?)\s?\<(.*)\>/) {
		$change->{author} = "$1  <$2>";
	    }
	    $change->{date} =~ s!/!-!g;
	    
	    # Record the change.
	    push @Changes, $change unless $change->{logmsg} =~ /^# /;
	    $change = {};
	    $change->{workfile} = $workfile;
	    $change->{logmsg}   = '';
	    $change->{author}   = '';
	}
    } elsif ($_ =~ /^revision ([0-9.]*)/) {
	$change->{revision} = $1;
    } elsif ($_ =~ /^date: ([^; ]*) ([^; ]*)( \+[0-9]+)?;  author: ([^;]*);/) {
	$change->{date} = $1;
	$change->{hour} = $2;
	$change->{author} = $Authors{$3} ? $Authors{$3} : $4;
	$change->{committed} = $4;
    } elsif ($_ =~ /^From: (.*)$/) {
	$change->{author} = $1;
    } elsif ($change->{revision}) {
	if ($change->{logmsg} || $_) {
	    $change->{logmsg} .= $_ . "\n";
	}
    }
}

# print Dumper @Changes;

undef $last_logmsg; undef $last_author; undef $last_date; undef $last_hour; undef $last_comm;
$files = [];

for my $k (sort {($b->{date} cmp $a->{date}) || ($b->{hour} cmp $a->{hour}) || ($a->{author} cmp $b->{author}) || ($a->{workfile} cmp $b->{workfile})} @Changes) {
    
    if (!($last_date eq $k->{date}) || !($last_author eq $k->{author}) ||
	!($last_comm eq $k->{committed})) {
	if (@$files) {
	    &print_entry ($files, $last_logmsg);
	    $files = [];
	}
	&print_header ($k->{author}, $k->{committed}, $k->{date}, $k->{hour});
    }
 
    if (@$files && !($last_logmsg eq $k->{logmsg})) {
	&print_entry ($files, $last_logmsg);
	$files = [];
    }
      
    
    $last_comm   = $k->{committed};
    $last_logmsg = $k->{logmsg};
    $last_author = $k->{author};
    $last_date   = $k->{date};
    $last_hour   = $k->{hour};
    
    push @$files, $k->{workfile};
}

if (@$files) {
    &print_entry ($files, $last_logmsg);
}

sub print_header {
    my $author = shift;
    my $committed = shift;
    my $date = shift;
    my $hour = shift;
    
    print $date, " ", $hour, "  ", $author, "  (", $committed, ")\n\n";
}

sub print_entry  {
    my $files = shift;
    my $logmsg = shift;
    

    print "\t* ";
    my $c = '';
    
    for my $f (@$files) {
	print $c, $f;
	$c = ', ' unless $c;
    }
    
    print ": ";
    
    my $t = '';
    for my $l (split ('\n', $logmsg)) {
	print $t, $l, "\n";
	$t = "\t" unless $t;
    }
    print "\n";
}