#!/usr/bin/perl -w use CGI qw/:standard/; $query=new CGI; my($period)=$query->param('period'); $period = "today" unless defined $period; my($modulelist)=$query->param('module'); my $moduleext=""; $moduleext=":$modulelist" if defined $modulelist; my($firstdate); if($period eq "days") { my($days)=$query->param('days'); $days = 1 unless defined $days; if ($days < 1) {$days = 1}; $heading = "i-scream CVS$moduleext commits in the past $days day(s)"; $days--; $firstdate = ">" . `/bin/date -v-${days}d +%Y/%m/%d`; } elsif($period eq "date") { my($date)=$query->param('date'); $date = `/bin/date +%Y/%m/%d` unless defined $date; $heading = "i-scream CVS$moduleext commits on $date"; $firstdate = "$date 00:00<$date 23:59" } elsif($period eq "since") { my($date)=$query->param('date'); $date = `/bin/date +%Y/%m/%d` unless defined $date; $heading = "i-scream CVS$moduleext commits since $date"; $firstdate = ">$date"; } elsif($period eq "thisweek") { $firstdate = ">last Sunday"; $heading = "i-scream CVS$moduleext commits this week"; } else { # default to "today only" $firstdate = ">" . `/bin/date +%Y/%m/%d`; $heading = "Today's i-scream CVS$moduleext commits"; } my($cvsroot) = "/cvs/i-scream"; $modulelist = `ls $cvsroot` unless defined $modulelist; $modulelist =~ s/[\r\n]/ /gm; my($cvs2clpath) = "/usr/local/bin/cvs2cl"; my($cvs2clargs) = "--stdout --no-wrap --no-common-dir -r -t -w -S -U $cvsroot/CVSROOT/users -l \"-d$firstdate\" -g \"-d$cvsroot\" -g \"-Q\""; my($updatecmd) = "/home/iscream/bin/fullcvsupdate.sh $modulelist"; my($logcmd) = "cd /tmp/i-scream/cvstmp && $cvs2clpath $cvs2clargs"; my ($incdir) = "../htdocs"; # Include files my ($doctype) = "$incdir/doctype.inc"; my ($style) = "$incdir/style.inc"; my ($header) = "$incdir/header.inc"; my ($footer) = "$incdir/footer.inc"; my ($menu) = "$incdir/menu-static.inc" ; # Section markers my ($secwho) = 1; my ($secfiles) = 2; my ($seclog) = 3; # This should be application/xhtml+xml print "Content-type: text/html\n\n"; &print_html($doctype); print <<"END"; i-scream CVS Commit Logs END &print_html($style); print <<"END";
END &print_html($header); print <<"END";

i-scream CVS Commit Logs

$heading

END print `$updatecmd >/dev/null 2>&1`; my(@modules) = split (/\s+/, $modulelist); foreach my $module (@modules) { my($firstentry) = 1; my($sec) = 0; print <<"END";

$module module

END my(@lines) = `$logcmd $module 2>&1`; if(@lines == 0) { print <<"END";

There have been no commits in this module during this period.

END } else { my(@log) = (); foreach my $line (@lines) { if ($line =~ /^([0-9]{4}-[0-9]{2}-[0-9]{2}.*?)\s+([^\s]+)(\s+<([^\s]+)>)?$/) { my($datetime) = escapeHTML($1); my($committer) = escapeHTML($2); my($email) = $4; if($sec != $secwho) { if($sec == $seclog) { @log = &trim_array(@log); foreach my $logline (@log) { $logline =~ s/^\t//; print escapeHTML("$logline\n"); } @log = (); print <<"END";
END } if($firstentry) { $firstentry = 0; print <<"END";
END } else { print <<"END";
END } $sec = $secwho; } print <<"END";

$datetime committed by END if(defined $email) { print <<"END"; $committer END } else { print <<"END"; $committer END } print <<"END";

END } elsif($line =~ /([^\s]+) (\([^,^\)]+(,[^\)]+)?\))([,:])/) { my ($file, $rev, $tags, $ext) = ($1, $2, $3, $4); $ext = escapeHTML($ext); if($sec != $secfiles) { $sec = $secfiles; print <<"END";

END } $file = escapeHTML($file); print <<"END"; $file END if($rev =~ /\(([^\s]+)\.(\d+)(.*)\)/) { my $start = $1; my $end = $2; my $other = $3; my $newrev = "$start.$end"; my $oldrev; if($end != 1) { my $oldminver = $end-1; $oldrev = "$start.$oldminver"; } elsif($start =~ /^((\d+\.)+)(\d+)$/) { $oldrev = $1; # take trailing . off old revision chop $oldrev; } if(defined $oldrev) { my $diff = ".diff?r1=$oldrev&r2=$newrev"; my $startend = escapeHTML("$start.$end"); $other = escapeHTML($other); chomp $other; print <<"END"; ($startend$other)$ext END } else { $rev = escapeHTML($rev); print <<"END"; $rev$ext END } } else { $rev = escapeHTML($rev); print <<"END"; $rev$ext END } if($ext !~ /:$/) { print <<"END";
END } } else { next if $sec == $secwho; # not done secfiles yet if($sec != $seclog) { $sec = $seclog; print <<"END";

END
                }
                chomp $line;
                push(@log, $line);
            }
        }
        if($sec == $seclog) {
            @log = &trim_array(@log);
            foreach my $logline (@log) {
                $logline =~ s/^\t//;
                print escapeHTML("$logline\n");
            }
            @log = ();
            print <<"END";
END } } print <<"END";
END } print <<"END";
END &print_html($footer); print <<"END";
END &print_html($menu); print <<"END";
END exit 0; # Print the contents of a file containing html sub print_html { my ($filename) = @_; open(FILE, $filename); while() { print; } close FILE; } # Trim an array (remove beginning and end emptry entries) sub trim_array { my (@array) = @_; for(my $i = 0; $i < scalar @array; $i++) { if($array[$i] ne "") { splice @array, 0, $i; last; } } for(my $i = scalar @array - 1; $i >= 0; $i--) { if($array[$i] ne "") { splice @array, $i+1; last; } } return @array; }