#!/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: # <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(defined $_ and (/^\s+\S+\s+\S+\s+\S+\s+\S+\s+(\S+)\#(\d+) - \S+ \S+ \S+ \((.+)\)/)) { ( $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>; if(defined $_ and (/^(.+)\#(\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", "FSPC=$file", "REV=$rev", "View $desc") ; $legend .= " <small><i>$about</i></small>" if defined $about ; $legend .= "<br>"; } ; $legend .= &P4CGI::ahref(-url => "fileDownLoad.cgi", "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, "FSPC=$file", "REV=$rev", "FORCE=Y", "View anyway!") ; } else { print "Type: $type<br>\n<pre>\n"; my @prompts ; my @filetext ; if(!defined $force and $smart eq "Yes"){ my ($lineno,$authorBranch,$change,$rev,$line) ; print "<small>Line<tt> </tt>Ch. Rev</small>\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\"></A><tt>%3d:</tt>",$lineno,$lineno) ; my($chstr,$revstr)=(" "," "); if($oldch != $change){ $chstr= substr(" ",0,5-length("$change")) . &P4CGI::ahref("-url","changeView.cgi", "CH=$change", "$change") ; $revstr = substr(" ",0,3-length("$rev")) . &P4CGI::ahref("-url","fileDiffView.cgi", "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::fixSpecChar($line) ; push @prompts,"<small>$linenos $chstr$revstr </small><font color=red>|</font>" ; } } else { while( <P4> ) { chomp ; push @filetext,&P4CGI::fixSpecChar($_) ; 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 "</pre>\n"; } close P4; print "", &P4CGI::end_page() ; # # That's all folks #