changeView.cgi #11

  • //
  • guest/
  • fredric_fredricson/
  • P4DB/
  • main/
  • changeView.cgi
  • View
  • Commits
  • Open Download .zip Download (6 KB)
#!/usr/bin/perl -w
# -*- perl -*-
use P4CGI ;
use strict ;
#
#################################################################
#  CONFIGURATION INFORMATION 
#  All config info should be in P4CGI.pm
#
#################################################################
#
#  P4 change viewer
#  View a change by number
#
#################################################################

# Get file spec argument
my $change = P4CGI::cgi()->param("CH") ;
&P4CGI::bail("No change number specified") unless defined $change ;
$change =~ /^\d+$/ or  &P4CGI::bail("\"$change\" is not a positive number");
my @desc ;
my $currlev = &P4CGI::CURRENT_CHANGE_LEVEL() ;
if($change > $currlev or $change < 1) {
    &P4CGI::signalError("\"$change\" is not a valid change number (0 < change <= $currlev)");
} ;

my $filespec =  &P4CGI::cgi()->param("FSPC") ;
$filespec = "//..." unless defined $filespec ;
$filespec = &P4CGI::htmlEncode($filespec) ;
my $nextChange ;
my $prevChange ;
{
    my $max = $currlev - $change + 3 ;
    my %chs ;
    local *F ;
    &P4CGI::p4call(*F, "changes -m $max $filespec" );
    while(<F>) {
	/Change (\d+)/ and do {
	    $chs{$1} = 1 ;
	}
    }
    close *F ;
    my $p ;
    my @c = sort { $b <=> $a } keys %chs ;
    while(@c) {
	my $n = shift @c ;
	if($n == $change) {
	    $nextChange = $p ;
	    $n = shift @c and do { 
		$prevChange = $n ;
	    } ;
	    last ;
	}
	$p = $n ;
    }
} ;

my @legendList ; 
if($nextChange) {
    push @legendList,
    &P4CGI::buttonCell("changeView.cgi",
		       "View next change for $filespec",
		       "FSPC=$filespec",
		       "CH=$nextChange",
		       "Next change ($nextChange)") ;    
}
if($prevChange) {
    push @legendList,
    &P4CGI::buttonCell("changeView.cgi",
		       "View previous change for $filespec",
		       "FSPC=$filespec",
		       "CH=$prevChange",
		       "Previous change ($prevChange)") ;    
}

my %values ;
my @fields = &P4CGI::p4readform("change -o $change",\%values) ;

				# Fix user field
{
    # Get real user names...
    my %userCvt ;
    {
	my @users ;
	&P4CGI::p4call(\@users, "users" );
	%userCvt =  map { /^(\S+).*> \((.+)\) .*$/ ; ($1,$2) ; } @users ;
    }
    if (exists $values{"User"}) {
	my $u = $values{"User"} ;
	if(exists $userCvt{$u}) {
	    $values{"User"} = &P4CGI::ahref(-url=>"userView.cgi",
					    "USER=$u",
					    "HELP=View user info",
					    "$u") . " (" . $userCvt{$u} . ")" ; 
	}
	else {
	    $values{"User"} = "$u (Unknown user)" ;
	}
    }
}
				# fix client field
if(exists $values{"Client"}) {
    $values{"Client"} = &P4CGI::ahref(-url=>"clientView.cgi",
				      "CLIENT=$values{Client}",
				      "HELP=View client info",
				      $values{"Client"}) ;
}
				# Fix description field
if(exists $values{"Description"}) {
    my @referenced ;
    $values{"Description"} = &P4CGI::formatDescription($values{"Description"},
						       \@referenced) ;    
    while(@referenced) {
	my $c = shift @referenced ;
	next if $c >= $change ;
	if(!exists $values{"References in Desc."}) { 
	    $values{"References in Desc."} = "" ;
	    push @fields,"Referenced" ;
	} ;
	my %data ;
	&P4CGI::p4readform("change -o $c",\%data) ;
	if(exists $data{"Description"}) {
	    my $d = &P4CGI::formatDescription($data{"Description"}) ;
	    $c = &P4CGI::ahref("-url" => "changeView.cgi",
			       "-class" => "Title",
			       "CH=$c",
			       "HELP=View change",
			       "Change $c") ;
	    $values{"Referenced"} .= 
		join("\n",
		     ("<span>$c:</span>",
		      "<table class=\"Titled2\"><tr>",
		      "<td class=\"Description\">$d</td>",
		      "</tr></table>")) ;
	}
    }
}


if(exists $values{"Jobs"}) {
    my @jobs = map { s/\s+\#.*$// ; $_ ; } split("\n",$values{"Jobs"}) ;
    my $jobs = "" ;
    my $j ;
    foreach $j (@jobs) {
	my %data ;
	&P4CGI::p4readform("job -o '$j'",\%data) ;
	my $desc = $data{"Description"} ;
	$desc = "" unless defined $desc ;
	$desc = &P4CGI::formatDescription($desc);
	$jobs .= "<span>" . &P4CGI::ahref(-url=>"jobView.cgi",
					  -class=>"Title",
					  "JOB=$j",
					  "HELP=View Job $j",
					  $j) . "</span>" ;
	$jobs .= 
	    "<table class=\"Titled2\"><tr><td class=\"Description\">".
	    $desc .
	    "</td></tr></table>\n" ;
    }    
    $values{"Jobs"} = $jobs ;
}


				# Start page
print
    &P4CGI::start_page("Change $change",@legendList),
    &P4CGI::start_framedTable("Change data") ;

print &P4CGI::start_table("") ;
my $fld ;
foreach $fld (@fields) {
    my $val = $values{$fld} ;
    my %xopt ;
    $xopt{"class"} = "Description" if $fld eq "Description" ;
    print &P4CGI::table_row({-class => "Prompt",
			     -text  => "$fld"},
			    {%xopt,
			     -text => $val}) ;
} ;

#
# Read p4 describe command output
#
local *F ;
&P4CGI::p4call(*F, "describe -s $change");

my @files ;
my $allfiles ;
my $allrevs ;
my $allmodes ;
my $cnt = 0 ;
while(<F>) {
    /^\.\.\. (.*)\#(\d+) (\w+)$/ and do {
	my ($file,$rev,$action) = ($1,$2,$3) ;
	if(($action ne "add") and ($action ne "delete") and ($action ne "branch")) {
	    if(defined $allfiles) {
		$allfiles .= ",$file" ;
		$allrevs .= " $rev" ;
		$allmodes .= " $action" ;
	    }
	    else {
		$allfiles = "$file" ;		   
		$allrevs = "$rev" ;
		$allmodes = "$action" ;
	    }
	    $cnt++ ;
	}
	my ($ofile,$orev,$oaction) = ($file,$rev,$action) ;
	$file = &P4CGI::ahref("-url","fileLogView.cgi",
			      "FSPC=$ofile", 
			      "HELP=View file log",
			      "$ofile") ;
	if($action ne "delete") {
	    $rev = &P4CGI::ahref("-url","fileViewer.cgi",
				 "FSPC=$ofile", 
				 "REV=$orev",
				 "HELP=View file revision $orev",
				 "$orev") ;
	    if($action ne "add") {
		$action = &P4CGI::ahref("-url","fileDiffView.cgi",
					"FSPC=$ofile", 
					"REV=$orev",
					"ACT=$oaction",
					"HELP=View diff",
					"$oaction")
	    }
	}	
	push @files,&P4CGI::table_row({-class=>"ListC",
				       -text => $action},
				      {-class=>"List",
				       -text => $file},
				      {-class=>"ListC",
				       -text => $rev}) ;
    }
}
close F ;
if($cnt > 1) {
    my $cell = &P4CGI::buttonCell("fileDiffView.cgi",
				  "View diff for all files in change",
				  "FSPC=$allfiles", 
				  "REV=$allrevs",
				  "ACT=$allmodes",
				  "CH=$change",
				  "View diff for all") ;
    push @files,&P4CGI::buttonHMenuTable($cell) ;
} ;    

print &P4CGI::table_row({-class => "Prompt",
			 -text  => "Files"},
			&P4CGI::start_table("").
			&P4CGI::table_header("Action","File","Rev") .
			join("\n",@files) .
			&P4CGI::end_table()) ;

print
    &P4CGI::end_table(),
    &P4CGI::end_framedTable(),
    &P4CGI::end_page();


#
# That's all folks
#
# Change User Description Committed
#12 4998 Fredric Fredricson P4DB: cleaned up some code.
Added p4users(), p4client() and p4user2name() to P4CGI.pm and modified
all cgi:s to use these,
#11 4306 Fredric Fredricson P4DB: Hardened P4DB against malicious parameters (cross site scripting),
performed some cleanup and increased version to 3.1.1.
#10 4240 Fredric Fredricson P4DB: Fixed small problem with job list in change view
#9 4238 Fredric Fredricson P4DB: Small bugfix in change view
#8 4237 Fredric Fredricson P4DB: Maybe the final submit for P4DB 3.1.0
#7 4152 Fredric Fredricson P4DB: Some more work on tha way to version 3.1....
#6 4071 Fredric Fredricson P4DB: Updated changeView for 3.1
#5 2942 Fredric Fredricson P4DB: Fixed bug: Can now handle spaces in label names etc....
#4 2875 Fredric Fredricson P4DB 3.0 first beta...
#3 1928 Fredric Fredricson P4DB: Fixed bug: empty lines are now correctly displayed in change
view.
#2 1920 Fredric Fredricson P4DB: Mainly some user interface fixes:
* Added a small arrow that points to selection in list of options
* Added tooltip help
* Added user prefereces to turn the above off (or on)
* Some other user interface fixes
And fixed a bug in jobList.cgi and some minor bugs in label and branch
viewers.
#1 1638 Fredric Fredricson P4DB: Added all (I think) files for P4DB