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