%logmsgs = (); %fileversions = ();
$skipme = 0;
%basenames = ();
@cvsdirs=`find . -type d -name CVS -print`;
map { chomp; s,^\./,, } @cvsdirs;
foreach $d (@cvsdirs) {
if (open ENTRIES, "$d/Entries") {
local ($rootdir) = $d;
$rootdir =~ s/CVS$//;
while (<ENTRIES>) {
local ($type, $file, $version, @junk) = split /\//;
if ($type eq "") {
$basenames{"$file"} = "1";
$file = "$rootdir$file";
$fileversions{$file} = $version;
}
}
close ENTRIES;
}
}
sub compare_versions
{
my ($vw, $vl) = @_;
my (@vvl) = split /\./, $vl;
if ($vw eq "") {
if ($ return 2;
} else {
return 4;
}
}
my (@vvw) = split /\./, $vw;
if ($ return 3;
}
my ($i);
for ($i = 0; $i < $ my ($bl) = $vvl[$i];
my ($vl) = $vvl[$i + 1];
my ($bw) = $vvw[$i];
my ($vw) = $vvw[$i + 1];
if ($bw != $bl || $vw < $vl) {
return 0;
}
}
return 1;
}
while (<>) {
if (/^Working file: /) {
chomp;
($ignore, $ignore, $currentfile) = split;
while (<>) {
if (/^----------------------------$/) {
last;
}
}
next;
} elsif (/^----------------------------$/) {
next;
} elsif (/^revision /) {
($ignore, $revision) = split;
my ($currentbasefile) = $currentfile;
$currentbasefile =~ s;.*/([^/]+);\1;;
my ($check) =&compare_versions($fileversions{$currentfile}, $revision);
if (($check == 2 && (1 || (
($basenames{"$currentbasefile"} || !($currentfile =~ /\//)) &&
($currentfile =~ /\.[chly]$/)))) ||
$check == 1) {
$skipme = 0;
} else {
$skipme = 1;
}
} elsif (/^date: /) {
($ignore, $date, $time, $ignore, $author, $ignore, $state,
$ignore, $plus, $minus, $ignore) = split;
$author =~ s/;$//;
$body = "";
$firstline = 1;
while (<>) {
if (/^----------------------------$/) {
last;
} elsif (/^=============================================================================$/) {
last;
} elsif ($firstline && /^branches:([ \t]+[0-9]+(\.[0-9]+)+;)+$/) {
next;
} else {
$body .= $_;
$firstline = 0;
}
}
$junkbody = $body;
$junkbody =~ s/\s//g;
$junkbody .= "x";
$datetimeauthor = "$date $time $author $junkbody $currentfile $revision";
if ($skipme == 0) {
$logmsgs{$datetimeauthor} = $body;
if ($plus eq "") {
$plus{$datetimeauthor} = "added";
} elsif ($state eq "dead;") {
$plus{$datetimeauthor} = "removed";
} else {
$plus{$datetimeauthor} = $plus;
$minus{$datetimeauthor} = $minus;
}
}
} }
$prevmsg="";
$header="";
@fileinfo = ();
@chlog = reverse sort keys %logmsgs;
%filenames_printed = ();
foreach $_ (@chlog) {
($date, $time, $author, $junk, $file, $revision) = split;
$date =~ s,/,-,g;
$msg = $logmsgs{$_};
my $delta;
if (! $minus{$_}) {
$delta = "$plus{$_}";
} else {
$delta = "$plus{$_} $minus{$_}";
}
if ($prevmsg eq $msg && !$filenames_printed{$file}) {
push @fileinfo, "\t\t$file ($revision) ($delta)\n";
} else {
if ($prevmsg ne "" || $ print $header;
$filestuff = join "", sort @fileinfo;
$filestuff =~ s/\t/\tFiles:/;
print "$filestuff\n";
$prevmsg =~ s/^/\t/g;
$prevmsg =~ s/\n/\n\t/g;
$prevmsg =~ s/[ \t]+\n/\n/g;
$prevmsg =~ s/[ \t]+$//g;
print "$prevmsg\n";
%filenames_printed = ();
}
$header = "$date\t<$author\@sourceforge.net>\n\n";
$prevmsg = $msg;
@fileinfo = ();
push @fileinfo, "\t\t$file ($revision) ($delta)\n";
$filenames_printed{$file} = 1;
}
}
if ($prevmsg ne "" or $ print "$date\t<$author\@sourceforge.net>\n\n";
$filestuff = join "", sort @fileinfo;
$filestuff =~ s/\t/\tFiles:/;
print "$filestuff\n";
$prevmsg =~ s/^/\t/g;
$prevmsg =~ s/\n/\n\t/g;
$prevmsg =~ s/[ \t]+\n/\n/g;
$prevmsg =~ s/[ \t]+$//g;
print "$prevmsg\n";
}