#!/usr/bin/perl -w
# -*- perl -*-
use P4CGI ;
use strict ;
#
#################################################################
# CONFIGURATION INFORMATION
# All config info should be in P4CGI.pm
#
#################################################################
#
# View files affected by a set of changes
#
#################################################################
my $err2null = &P4CGI::REDIRECT_ERROR_TO_NULL_DEVICE() ;
####
# Parameters
# FSPC = file spec
#
# NEWER_THAN = restrict to changes newer than specified No. of hours
#
my $FSPC = P4CGI::cgi()->param("FSPC") ;
$FSPC = "//..." unless defined $FSPC ;
my @FSPC = split(/\s*\+?\s*(?=\/\/)/,$FSPC) ;
my $WEEKS = P4CGI::cgi()->param("WEEKS") ;
if(defined $WEEKS) {
&P4CGI::bail("Parameter WEEKS non-numeric") unless $WEEKS =~ /^\d+$/ ;
}
else {
$WEEKS = 0 ;
}
my $DAYS = P4CGI::cgi()->param("DAYS") ;
if(defined $DAYS) {
&P4CGI::bail("Parameter DAYS non-numeric") unless $DAYS =~ /^\d+$/ ;
}
else {
$DAYS=0 ;
}
my $HOURS = P4CGI::cgi()->param("HOURS") ;
if(defined $HOURS) {
&P4CGI::bail("Parameter HOURS non-numeric") unless $HOURS =~ /^\d+$/ ;
}
else {
$HOURS = 0 ;
}
my $seconds = 3600 * ( $HOURS + (24 * ($DAYS + (7 * $WEEKS)))) ;
if($seconds) {
#
# get time strings to compare to
#
my $time = time() ;
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($time);
my $currentTimeString = sprintf("\@%d/%02.2d/%02.2d:%02.2d:%02.2d:%02.2d",
1900+$year,$mon+1,$mday,$hour,$min,$sec) ;
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($time - $seconds);
my $afterTimeString = sprintf("\@%d/%02.2d/%02.2d:%02.2d:%02.2d:%02.2d",
1900+$year,$mon+1,$mday,$hour,$min,$sec) ;
my $niceAfterTimeString = sprintf("%d/%02.2d/%02.2d %02.2d:%02.2d",
1900+$year,$mon+1,$mday,$hour,$min) ;
&P4CGI::ERRLOG("currentTimeString: $currentTimeString") ;
&P4CGI::ERRLOG("afterTimeString: $afterTimeString") ;
#
# Start page
#
print
"",
&P4CGI::start_page("Files matching<br><TT>".
join("<br></tt>or<tt><br>\n",@FSPC).
"</TT><br> changed after $niceAfterTimeString ","") ;
#
# Get list of files changed
#
my %toRev ;
my %mode ;
foreach $FSPC (@FSPC) {
my @files ;
&P4CGI::p4call(\@files,"files \"${FSPC}${afterTimeString},${currentTimeString}\" $err2null") ;
map { s/\#(\d+) - (\S+).*$// ;
$toRev{$_}=$1 ;
$mode{$_} =$2 ; } @files ;
}
my @affectedFiles = sort keys %toRev ;
#
# Get revision at start of interval
#
my %fromRev ;
my @filesToCheck = @affectedFiles ;
while(@filesToCheck > 0) {
my $files="" ;
while(length($files) < 1000 and @filesToCheck > 0) {
$files .= " \"" . shift(@filesToCheck) . $afterTimeString . "\"" ;
}
my @res ;
&P4CGI::p4call(\@res,"files $files $err2null") ;
map { s/\#(\d+) - .*// ; $fromRev{$_}=$1 } @res ;
}
if(@affectedFiles == 0) {
print "<font size=+1 color=red>No files found</font>\n" ;
}
else {
print scalar @affectedFiles," files found<br>\n" ;
print
"",
&P4CGI::start_table(""),
&P4CGI::table_header("From/view",
"/Diff",
"To/view",
"File/View file log",
"Change(s)/View change") ;
my $f ;
foreach $f (@affectedFiles) {
my @tmp ;
my $changes ;
&P4CGI::p4call(\@tmp,"changes \"$f${afterTimeString},${currentTimeString}\"") ;
map {
/^Change (\d+).*$/ ;
my $c = &P4CGI::ahref(-url => "changeView.cgi",
"CH=$1",
$1) ;
if(defined $changes) {
$changes .= ", $c" ;
}
else {
$changes = "$c" ;
} ;
} @tmp ;
my $file = &P4CGI::ahref(-url => "fileLogView.cgi",
"FSPC=$f",
$f) ;
my $fromRev ;
my $diff ;
if(exists $fromRev{$f}) {
$fromRev = &P4CGI::ahref(-url => "fileViewer.cgi",
"FSPC=$f",
"REV=$fromRev{$f}",
$fromRev{$f}) ;
$diff = &P4CGI::ahref(-url => "fileDiffView.cgi",
"FSPC=$f",
"REV=$fromRev{$f}",
"REV2=$toRev{$f}",
"ACT=$mode{$f}",
"<font size=1>(diff)</font>") ;
}
else {
$fromRev = "" ;
$diff = "<font size=-1 color=red>New</font>" ;
} ;
my $toRev ;
if($mode{$f} eq "delete") {
$toRev = $toRev{$f} ;
$diff = "<font size=-1 color=red>Deleted</font>" ;
}
else {
$toRev = &P4CGI::ahref(-url => "fileViewer.cgi",
"FSPC=$f",
"REV=$toRev{$f}",
$toRev{$f}) ;
} ;
print &P4CGI::table_row(-align => "center",
$fromRev,
$diff,
$toRev,
{-align=>"left",
-text => $file},
{-align=>"left",
-text => $changes}) ;
} ;
} ;
print "", &P4CGI::end_table(),"<hr>" ;
}
else {
print
"",
&P4CGI::start_page("View recently changed files","") ;
} ;
print "",
&P4CGI::start_table("bgcolor=".&P4CGI::HDRFTR_BGCOLOR()." align=center cellpadding=0 cellspacing=2"),
"<tr><td>\n" ;
sub prSelection($$$$ )
{
my $cgitarget = shift @_ ;
my $desc = shift @_ ;
my $fields = shift @_ ;
my $helpTarget = shift @_ ;
print "", &P4CGI::table_row(-valign=>"center",
{-align=>"center",
-text =>
join("\n",
&P4CGI::cgi()->startform(-action => $cgitarget,
-method => "GET"),
"<font size=+1>$desc</font>")},
{-align=>"left",
-valign=>"top",
-text => $fields},
{-align=>"left",
-text => " "},
{-align=>"left",
-valign=>"bottom",
-width=>"1",
-text => &P4CGI::cgi()->submit(-name => "ignore",
-value => "GO!")
},
{ -valign=>"bottom",
-text => &P4CGI::cgi()->endform()
},
) ;
} ;
print "", &P4CGI::start_table("width=100% cellspacing=4") ;
my %dayValues = ( 0 => "Zero days",
1 => "One day",
2 => "Two days",
3 => "Three days",
4 => "Four days",
5 => "Five days",
6 => "Six days") ;
my %hourValues = ( 0 => "Zero hours",
1 => "One hour",
2 => "Two hours",
3 => "Three hours",
4 => "Four hours",
5 => "Five hours",
6 => "Six hours",
7 => "Seven hours",
8 => "Eight hours",
9 => "Nine hours") ;
{
my $n = 9 ;
while($n++ < 24) {
$hourValues{$n} = "$n hours" ;
}
}
my %weekValues = ( 0 => "Zero weeks",
1 => "One week",
2 => "Two weeks",
3 => "Three weeks",
4 => "Four weeks",
5 => "Five weeks",
6 => "Six weeks",
7 => "Seven weeks",
8 => "Eight weeks",
9 => "Nine weeks") ;
{
my $n = 9 ;
while($n++ < 24) {
$weekValues{$n} = "$n weeks" ;
}
}
my @dayValues = sort { $a <=> $b } keys %dayValues ;
my @hourValues = sort { $a <=> $b } keys %hourValues ;
my @weekValues = sort { $a <=> $b } keys %weekValues ;
prSelection("filesChangedSince.cgi",
"List recently changed files",
join("\n",(&P4CGI::start_table(),
"<tr>",
"<td align=right valign=center>File spec:</td>",
"<td align=left valign=center><font face=fixed>",
&P4CGI::cgi()->textfield(-name => "FSPC",
-default => $FSPC,
-size => 50,
-maxlength => 256),
"</font></td></tr>",
"<td align=right valign=center>Changed within:</td>",
"<td align=left valign=center><font face=fixed>",
&P4CGI::cgi()->popup_menu(-name => "WEEKS",
-default => 0,
-values => \@weekValues,
-labels => \%weekValues),
" ",
&P4CGI::cgi()->popup_menu(-name => "DAYS",
-default => 0,
-values => \@dayValues,
-labels => \%dayValues),
" and ",
&P4CGI::cgi()->popup_menu(-name => "HOURS",
-default => 0,
-values => \@hourValues,
-labels => \%hourValues),
"</font></td></tr>",
"</table>")),
"searchPatt") ;
print &P4CGI::end_table() ;
print "</tr></td>",&P4CGI::end_table() ;
print &P4CGI::end_page() ;
#
# That's all folks
#