#!/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 ; use colorView ; # A hash containing file extensions that can be viewed with special viewers # Data is: # => # 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 ; print STDERR "File:$file\n" ; ## DEBUG 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") ; print STDERR "Rev:$revision\n" ; ## DEBUG # 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) $_ = ; if(defined $_ and (/^\s+\S+\s+\S+\s+\S+\s+\S+\s+(\S+)\#(\d+) - \S+ \S+ \S+ \((.+)\)/)) { ( $name, $rev, $type ) = ($1,$2,$3) ; $_ = ; $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) $_ = ; if(defined $_ and (/^(.+)\#(\d+) - \S+ \S+ \S+ \((\w+)\)/)) { ( $name, $rev, $type ) = ($1,$2,$3) ; } ; } my @legend = "" ; $ext = uc($ext) ; if(exists $viewConfig::ExtensionToType{$ext}) { my $type = $viewConfig::ExtensionToType{$ext} ; my ($url,$desc,$content,$about) = @{$viewConfig::TypeData{$type}} ; push @legend, &P4CGI::buttonCell($url, "View file $file", "TYPE=$type", "FSPC=$file", "REV=$rev", "View $desc") ; } ; push @legend, &P4CGI::buttonCell("fileLogView.cgi", "View file log for $file", "FSPC=$file", "File log"); push @legend, &P4CGI::buttonCell("fileDownLoad.cgi", "Download file $file", "FSPC=$file", "REV=$rev", "Download") ; print STDERR "About to start\n" ; ## DEBUG print &P4CGI::start_page("View file $file\#$rev",@legend), "
", &P4CGI::start_framedTable("File") ; print STDERR "Started\n" ; ## DEBUG if(!defined $force and ($type =~ /.*binary/)) { print "

Type is $type.

\n", &P4CGI::buttonHMenuTable(&P4CGI::buttonCell(&P4CGI::cgi()->url, "Force view of file $file", "FSPC=$file", "REV=$rev", "FORCE=Y", "View anyway!")) ; } else { print "Type: $type
\n
\n";

    print STDERR "Type: $type
\n
\n"; ##DEBUG
    my @prompts  ;
    my @filetext ;

    if(!defined $force and $smart eq "Yes"){
	my ($lineno,$authorBranch,$change,$rev,$line) ;
	print "Line   Ch.  Rev\n";
	my $oldch=-1;
	while(  ) {
	    ($lineno,$authorBranch,$change,$rev,$line) =
		m/^\s+(\d+)\s+(\S+)\s+(\d+)\s+(\d+) (.*)$/ ;		
	    my $linenos = sprintf("%3d:",$lineno,$lineno) ;	   
	    my($chstr,$revstr)=("     ","   ");
	    if($oldch != $change){
		$chstr=
		    substr("     ",0,5-length("$change")) . 
		    &P4CGI::ahref(-url => "changeView.cgi",
				  -title => "\"View change $change\"",
				  "CH=$change",
				  "$change") ;
		$revstr = 
		    substr("     ",0,3-length("$rev")) .
		    &P4CGI::ahref("-url","fileDiffView.cgi",
				  -title => "\"View diff for change\"",
				  "FSPC=$name",
				  "REV=$rev","ACT=edit",
				  "$rev");
	    }		    
	    $oldch= $change ;
	    if(($lineno % 5) != 0) {
		while($linenos =~ s/>( *)\d/>$1 /) {} ;
		$linenos =~ s/:<\/tt>/ <\/tt>/ ;
	    } ;
	    push @filetext,&P4CGI::htmlEncode($line) ;
	    push @prompts,"$linenos $chstr$revstr |" ;
	}	    
    }
    else {
	while(  ) {
	    chomp ;
	    push @filetext,&P4CGI::htmlEncode($_) ;
	    push @prompts,"" ;
	}	    
    }
    my $FILE = join("\n",@filetext) ;
    if(&P4CGI::VIEW_WITH_COLORS()) {
	&colorView::color($file,\$FILE) ;
	@filetext = split("\n",$FILE) unless $@ ;
    } ;
	
    while(@filetext) {
	print (shift @prompts,shift @filetext,"\n") ;
    }
    print "
\n"; } close P4; print &P4CGI::end_framedTable(), &P4CGI::end_page() ; # # That's all folks #