#!/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::bail("\"$change\" is not a valid change number<br>(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=" (pending change)" ;
    $pending = "yes" ;
} ;

				# Create title
print "", &P4CGI::start_page("Change $change$statstr","") ;
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, $client ) = 
	      /(\S*) fixed on (\S*) by (\S*)@(\S*)/ )
	{
	    $jobsFixed .=  &P4CGI::ahref("-url","vj.cgi...",
						 "JOB=$job", 
						 $job) . "\n<br><tt>";
	    shift @desc ;
	    while(@desc > 0){
		$_ = &P4CGI::fixSpecChar(shift @desc) ;
		last if /^\S/;
		$jobsFixed .= $_;
	    }	    
	}
	
	$jobsFixed .= "</tt>\n";

	last if /^Affected files/;
    }

    $jobsFixed .= "\n" ;
}

print
    "",
    &P4CGI::start_table(""),
    &P4CGI::table_row("-valign","top",{"-type","th", "-align","right", "-text","Author"},
		      &P4CGI::ahref(-url => &P4CGI::LU_URL(),
				    "USER=$user",
				    $user)),
    &P4CGI::table_row("-valign","top",{"-type","th", "-align","right", "-text","Client"},
		      $client),
    &P4CGI::table_row("-valign","top",{"-type","th", "-align","right", "-text","Date"},
		      "$time $date"),
    &P4CGI::table_row("-valign","top",
		      {"-type","th", "-align","right", "-text","Description"},
		      {"-text","<pre>".&P4CGI::magic($description)."</pre>","-bgcolor","white"}) ;
if ( ! defined $pending ) {
    print
	"",
	&P4CGI::table_row("-valign","top",{"-type","th", "-align","right", "-text","Jobs fixed"},
			  "$jobsFixed") ;
} ;
print
    "",
    &P4CGI::end_table(),
    "<hr>";

if(! defined $pending ) {
    print
	"<h3>Files</h3>\n",
	&P4CGI::ul_list( "<B>Filename</B> -- see the complete file history",
			"<B>Revision Number</B> -- see the file text",
			"<B>Action</B> -- see the deltas (diffs)"),
	&P4CGI::start_table("cellpadding=1 "),
	&P4CGI::table_row("-type","th",
			  "-align","left",
			  "File","Rev","Action");
# Sample:
# ... //depot/main/p4/Jamrules#71 edit


    my $allfiles ;
    my $allrevs ;
    my $allmodes ;
    my $cnt = scalar @desc ;
    
    
    while(@desc > 0) {
	$_ = &P4CGI::fixSpecChar(shift @desc) ;
	if(/^\.\.\. (\S*)#(\d*) (\S*)$/)  {
	   my( $file, $rev, $act ) = ($1,$2,$3) ;
	   if(defined $allfiles) {
	       $allfiles .= "+$file" ;
	       $allrevs .= "+$rev" ;
	       $allmodes .= "+$act" ;
	   }
	   else {
	       $allfiles = "$file" ;
	       $allrevs  = "$rev" ;
	       $allmodes = "$act" ;
	   } ;
	   print
	   "",
	   &P4CGI::table_row(&P4CGI::ahref("-url",P4CGI::FLV_URL(),
					   "FSPC=$file", "$file"),
			     &P4CGI::ahref("-url",P4CGI::FV_URL(),
					   "FSPC=$file", 
					   "REV=$rev","$rev"),
			     &P4CGI::ahref("-url",P4CGI::FDV_URL(),
					   "FSPC=$file", 
					   "REV=$rev",
					   "ACT=$act",
					   "$act")) ;
       } ;
    } ;
    
    print &P4CGI::end_table(),"<P>" ;
    
    if($cnt > 1) {
	print 
	    "",
	    &P4CGI::ahref("-url",P4CGI::FDV_URL(),
			  "FSPC=$allfiles", 
			  "REV=$allrevs",
			  "ACT=$allmodes",
			  "CH=$change",
			  "Diff for all files in change") ;
    } ;
    
} 
else {
    print
	"<h3>Files in changelist</h3>\n",
	&P4CGI::ul_list( "<B>Filename</B> -- see the complete file history"),
	&P4CGI::start_table("cellpadding=1 "),
	&P4CGI::table_row("-type","th",
			  "-align","left",
			  "File","Rev","Action");

    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(&P4CGI::ahref("-url",P4CGI::FLV_URL(),
						"FSPC=$file", "$file"),
				  shift @revs,
				  $act) ;
	}
	else {
	    print
		"",&P4CGI::table_row("$file",shift @revs,$act) ;
	} ;
    } ;
    
    print &P4CGI::end_table(),"<P>" ;

} ;

print  &P4CGI::end_page();

#
# That's it folks
#