#!/usr/bin/perl -w
# -*- perl -*-
use P4CGI ;
use strict ;
#
#################################################################
#  CONFIGURATION INFORMATION 
#  All config info should be in P4CGI.pm
#
#################################################################
#
#  P4 file  viewer
#  View a file
#
#################################################################

use viewConfig ;

# A hash containing file extensions that can be viewed with special viewers
# Data is:
#             <extension> => <semicolon separated list of:
#                             url      - Url to be used
#                             typecode - Will be sent as parameter TYPE to url
#                             text     - A text for the href to url>
# Other than the TYPE parameter mentioned above the file name (depot format) will
# be sent as FILE parameter and file revision as REV parameter.
#

# Get file spec argument

my $file = P4CGI::cgi()->param("FSPC") ;
&P4CGI::bail("No file specified") unless defined $file ;

my $ext = $file ;
$ext =~ s/^.*\.// ;

my $revision = P4CGI::cgi()->param("REV") ;
#    &P4CGI::bail("No revision specified") unless defined $revision ;
$revision = "#$revision" if defined $revision ;
$revision="" unless defined $revision ;

my $force = P4CGI::cgi()->param("FORCE") ;


				# find out if p4br.perl is available, if true set smart
local *P4 ;
my $smart;
my ( $name, $rev, $type ) ;
if(-x "p4pr.perl") {
    open(P4,"./p4pr.perl \"$file$revision\" |") or 
	&P4CGI::bail("Can't start p4pr!!!!. too bad!") ;
    # Get header line
    #  line   author/branch change  rev //main/jam/Jamfile#39 - edit change 1749 (text)
    $_ = <P4>;	
    if(/^\s+\S+\s+\S+\s+\S+\s+\S+\s+(\S+)\#(\d+) - \S+ \S+ \S+ \((\w+)\)/) {
	( $name, $rev, $type ) = ($1,$2,$3) ;
	$_ = <P4>;
	$smart="Yes";
    }
    else {
	close P4 ;
    }
}
if(!defined $smart) {
    &P4CGI::p4call( *P4, "print \"$file$revision\"" );
    $smart="No, stupid." ;
    # Get header line
    # //main/jam/Jamfile#39 - edit change 1749 (text)
    $_ = <P4>;
    /^(.+)\#(\d+) - \S+ \S+ \S+ \((\w+)\)/;	
    ( $name, $rev, $type ) = ($1,$2,$3) ;
}

my $legend = "" ;
if($smart eq "Yes") {
    $legend = 
	&P4CGI::ul_list("<b>Change number</b> -- see the change description",
			"<b>Revision number</b> -- see diff at selected revision") ;
}
$ext = uc($ext) ;

if(exists $viewConfig::ExtensionToType{$ext}) {
    my $type = $viewConfig::ExtensionToType{$ext} ;
    my ($url,$desc,$content,$about) = @{$viewConfig::TypeData{$type}} ;
    $legend .= &P4CGI::ahref(-url => $url,
			     "TYPE=$type",
			     &P4CGI::fixspaces("FSPC=$file"),
			     "REV=$rev",
			     "View $desc") ;
    $legend .= "&nbsp;&nbsp;&nbsp;<small><i>$about</i></small>" if defined $about ;
    $legend .= "<br>";
} ;
$legend .= &P4CGI::ahref(-url => "dnld.cgi",
			 &P4CGI::fixspaces("FSPC=$file"),
			 "REV=$rev",
			 "Download file") ;

print 
    "",
    &P4CGI::start_page("File<br><code>$file\#$rev</code>",$legend) ;

if(!defined $force and ($type =~ /.*binary/))
{
    print
	"<h2>Type is $type.</h2>\n",
	&P4CGI::ahref(-url => &P4CGI::cgi()->url,
		      &P4CGI::cgi()->query_string()."&FORCE=Y",
		      "View anyway!") ;

}
else
{
    print "Type: $type<br>\n<pre>\n";
    
    if(!defined $force and $smart eq "Yes"){
	my ($lineno,$authorBranch,$change,$rev,$line) ;
	print "Line<tt>   </tt>Ch.  Rev\n";
	my $oldch=-1;
	while( <P4> ) {
	    ($lineno,$authorBranch,$change,$rev,$line) =
		m/^\s+(\d+)\s+(\S+)\s+(\d+)\s+(\d+) (.*)$/ ;		
	    my $linenos = sprintf("<A Name=\"L%d\"><small><tt>%3d:</tt></small></A>",$lineno,$lineno) ;	   
	    my($chstr,$revstr)=("     ","   ");
	    if($oldch != $change){
		$chstr=
		    substr("     ",0,5-length("$change")) . 
			&P4CGI::ahref("-url",&P4CGI::CHV_URL(),
				      "CH=$change",
				      "$change") ;
		$revstr = 
		    substr("     ",0,3-length("$rev")) .
			&P4CGI::ahref("-url",&P4CGI::FDV_URL(),
				      &P4CGI::fixspaces("FSPC=$name"),
				      "REV=$rev","ACT=edit",
				      "$rev");
	    }		    
	    $oldch= $change ;
	    if(($lineno % 5) != 0) {
		while($linenos =~ s/>( *)\d/>$1 /) {} ;
		$linenos =~ s/:<\/tt>/ <\/tt>/ ;
	    } ;
	    $line = &P4CGI::fixSpecChar($line) ;
	    $line = &P4CGI::rmTabs($line) ;
	    print "$linenos $chstr$revstr <font color=red>|</font>$line\n" ;
	}	    
    }
    else {
	while( <P4> ) {
	    print
		"",
		&P4CGI::fixSpecChar($_) ;
	}	    
    }
    print "</pre>\n";
}
close P4;

print
    "",    
    &P4CGI::end_page() ;

#
# That's it folks
#