- #!/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
- #
-
-
-
-