#!/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)"); } ; &P4CGI::p4call(\@desc, "describe -s $change"); $_ = &P4CGI::fixSpecChar(shift @desc) ; /^Change (\d+) by (\S+)@(\S+) on (\S+) (\d\d:\d\d:\d\d)(.*)$/ or &P4CGI::bail("Illegal syntax on line returned"); my ($chn, $user, $client, $date, $time, $status) = ($1,$2,$3,$4,$5,$6) ; my $statstr = "" ; my $pending ; if ( defined $status and $status =~ /pending/) { $statstr="<br>(pending)" ; $pending = "yes" ; } ; my $legend =&P4CGI::ul_list( "<B>User name</B> -- see user info", "<B>Client name</B> -- see client info", "<B>Filename</B> -- see the complete file history", "<B>Revision Number</B> -- see the file text", "<B>Action</B> -- see the deltas (diffs)") ; if($pending) { $legend =&P4CGI::ul_list( "<B>User name</B> -- see user info", "<B>Client name</B> -- see client info", "<B>Filename</B> -- see the complete file history") ; } # Create title print "", &P4CGI::start_page("Change $change$statstr",$legend) ; my $description="" ; my $leadDescSpace ; while(@desc > 0) { $_ = &P4CGI::fixSpecChar(shift @desc) ; chomp ; next if /^\s*$/; last if /^Jobs fixed/; last if /^Affected files/; if($_ !~ /^\s*$/) { if(defined $leadDescSpace) { s/^$leadDescSpace// ; } else { s/^(\s+)// ; $leadDescSpace = $1 ; }; $description .= "\n$_"; } } my $jobsFixed="-" ; if( /^Jobs fixed/ ) { $jobsFixed = "\n" ; shift @desc ; while (@desc > 0) { $_ = &P4CGI::fixSpecChar(shift @desc) ; my( $job, $time, $user, $client ); while( ( $job, $time, $user ) = /(\S*) on (\S*) by (\S*)/ ) { $jobsFixed .= &P4CGI::ahref("-url","jobView.cgi", "JOB=$job", $job) . "\n<br><tt>"; shift @desc ; while(@desc > 0){ $_ = &P4CGI::fixSpecChar(shift @desc) ; last if /^\S/; $jobsFixed .= $_ . "<br>"; } $jobsFixed .= "</tt>\n"; } last if /^Affected files/; } $jobsFixed .= "\n" ; } my @referenced ; my $desc = &P4CGI::magic($description,\@referenced) ; my $referenced="" ; if(@referenced > 0) { my $c ; $referenced .= "<dl>\n" ; foreach $c (@referenced) { my %data ; &P4CGI::p4readform("change -o $c",\%data) ; if(exists $data{"Description"}) { my $d = &P4CGI::fixSpecChar($data{"Description"}) ; $d =~ s/\n/<br>\n/g ; $c = &P4CGI::ahref("-url" => "changeView.cgi", "CH=$c", "Change $c") ; $referenced .= "<dt>$c description:\n<dd><tt>$d</tt>\n" ; } } $referenced .= "</dl>\n" ; } print "", &P4CGI::start_table(""), &P4CGI::table_row("-valign","top",{"-type","th", "-align","right", "-text","Author"}, &P4CGI::ahref(-url => "userView.cgi", "USER=$user", $user)), &P4CGI::table_row("-valign","top",{"-type","th", "-align","right", "-text","Client"}, &P4CGI::ahref(-url => "clientView.cgi", "CLIENT=$client", $client)), &P4CGI::table_row("-valign","top",{"-type","th", "-align","right", "-text","Date"}, "$date $time"), &P4CGI::table_row("-valign","top", {"-type","th", "-align","right", "-text","Description"}, {"-text","<pre>$desc</pre>"}) ; print "", &P4CGI::table_row(-valign => "top", "", "<small>$referenced</small>") ; if ( ! defined $pending ) { print "", &P4CGI::table_row("-valign","top",{"-type","th", "-align","right", "-text","Jobs fixed"}, "$jobsFixed") ; } ; print "", &P4CGI::end_table(); if(! defined $pending ) { print "", &P4CGI::start_table("cellpadding=1 "), &P4CGI::table_header("Action/view diff","Rev/view file","File/file log") ; # Sample: # ... //main/p4/Jamrules#71 edit my $allfiles ; my $allrevs ; my $allmodes ; my $cnt = 0 ; while(@desc > 0) { $_ = &P4CGI::fixSpecChar(shift @desc) ; if(/^\.\.\. (.*)#(\d*) (\S*)$/) { my( $file, $rev, $act ) = ($1,$2,$3) ; if($act ne "delete") { $cnt++ ; if(defined $allfiles) { $allfiles .= ",$file" ; $allrevs .= " $rev" ; $allmodes .= " $act" ; } else { $allfiles = "$file" ; $allrevs = "$rev" ; $allmodes = "$act" ; } print "", &P4CGI::table_row(&P4CGI::ahref("-url","fileDiffView.cgi", "FSPC=$file", "REV=$rev", "ACT=$act", "$act"), &P4CGI::ahref("-url","fileViewer.cgi", "FSPC=$file", "REV=$rev","$rev"), &P4CGI::ahref("-url","fileLogView.cgi", "FSPC=$file", "$file")) ; } else { print "", &P4CGI::table_row("$act", "$rev", &P4CGI::ahref("-url","fileLogView.cgi", "FSPC=$file", "$file")); } } ; } ; print &P4CGI::end_table(),"<P>" ; if($cnt > 1) { print "<B>", &P4CGI::ahref("-url","fileDiffView.cgi", "FSPC=$allfiles", "REV=$allrevs", "ACT=$allmodes", "CH=$change", "View diff for all files in change"), "</B>" ; } ; } else { print "", &P4CGI::start_table("cellpadding=1 "), &P4CGI::table_header("Action","Rev","File/file log") ; my @openfiles ; &P4CGI::p4call(\@openfiles,"opened -a") ; my @files ; my @revs ; my @actions ; foreach (@openfiles) { if(/(\S+)#(\d+) - (\w+) change $change /) { push @files,$1 ; push @revs,$2 ; push @actions,$3 ; } } while(@files > 0) { my $file = shift @files ; # my $rev = shift @revs ; my $act = shift @actions ; if($act eq "edit") { print "", &P4CGI::table_row($act, shift @revs, &P4CGI::ahref("-url","fileLogView.cgi", "FSPC=$file", "$file")) ; } else { print "",&P4CGI::table_row($act, shift @revs, $file) ; } ; } ; print &P4CGI::end_table(),"<P>" ; } ; print &P4CGI::end_page(); # # That's all folks #