#!/usr/local/bin/perl5 # -*- perl -*- use P4CGI ; use strict ; # ##################################################################### ## ## CONFIGURATION INFORMATION ## All config info should be in $configFile (see init() in P4CGI.pm) ## ##################################################################### ## ## File Viewer ## ##################################################################### 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> # Filename (depot format) will be sent as FILE parameter; revision as # REV parameter. ##################################################################### # Set back references my $homepage="index.cgi"; my $backtohome="Back to Home" ; # Get file spec my $file = P4CGI::cgi()->param("FSPC") ; &P4CGI::bail("No file specified") unless defined $file ; # Get the revision number my $revision = P4CGI::cgi()->param("REV") ; $revision = "#$revision" if defined $revision ; $revision="" unless defined $revision ; # See if they want to force viewing a non-text file my $force = P4CGI::cgi()->param("FORCE") ; # See if they want a history trace my $trace = P4CGI::cgi()->param("TRACE") ; $trace = "" unless defined $trace ; # Get the user's port (to pass to p4pr) my $p4port = &P4CGI::USER_P4PORT() ; # Get list of restricted files, if any my @restrict = &P4CGI::RESTRICTED() ; my $legend ; # Disallow viewing restricted files if( @restrict ) { my $restricted ; foreach $restricted ( @restrict ) { chomp ; if ( $file =~ /\/${restricted}/ ) { $legend = "" ; print "", &P4CGI::start_page("File View",$legend,$homepage,$backtohome) ; print "", "<font color=red>Restricted file:</font> <font color=green> $file</font>", &P4CGI::end_page() ; exit 1 ; } } } # File info vars my ( $name, $rev, $type ) ; # Print a p4pr trace if( $trace eq "yes" ) { $legend = "" ; # $legend = # &P4CGI::ul_list("<b>Change number:</b> to see the change description"); # Print title and legend print "", &P4CGI::start_page("File History Trace",$legend,$homepage,$backtohome) ; # Get p4pr output if( -x "p4pr.pl" ) { open( P4, "./p4pr.pl -p \"$p4port\" \"$file$revision\" 2>&1 |" ) or &P4CGI::bail("Error returned from p4pr. Can't provide history trace."); # Get header line: # line author/branch change rev <filename>#<rev> - <action> change <num> <type> $_ = <P4>; if( /^\s+\S+\s+\S+\s+\S+\s+\S+\s+(\S+)\#(\d+) - \S+ \S+ \S+ \((\w+)\)/ ) { ( $name, $rev, $type ) = ($1,$2,$3) ; $_ = <P4> ; print "", "<b>File:</b> <font color=green>$name</font>", "<br>", "<b>Type:</b> <font color=green>$type</font>", "<br>", "<b>Rev:</b> <font color=green>$rev</font>", "<hr>" ; } else { print "", "<b><font color=red>Error:</font></b> ", "Malformed output returned from p4pr. Can't provide history trace.", "<br>" ; # exit ; } print "", "<table cellspacing=0 cellpadding=0>", "<tr align=center valign=top>", "<td width=5%>", "<b>Line</b>", "<td width=1%>", "<td width=11%>", "<b>Author/Branch</b>", "<td width=1%>", "<td width=5%>", "<b>Change</b>", "<td width=1%>", "<td width=4%>", "<b>Rev</b>", "<td width=1%>", "<td width=68%>", "<b>Text</b>", "</table>" ; # Print the file trace print "<pre>\n" ; while( <P4> ) { print "", &P4CGI::fixSpecChar($_) ; } # End the preformatted tag print "</pre>\n" ; # End the page print "", &P4CGI::end_page() ; # Close it up close P4 ; exit ; } } # Get the file extension, for "special"-file viewing my $ext = $file ; $ext =~ s/^.*\.// ; $ext = uc($ext) ; # Get the file contents and header info local *P4 ; &P4CGI::p4call( *P4, "print \"$file$revision\"" ); # Get header line: # <filename>#<rev> - <action> change <chg_no> (<type>) $_ = <P4>; /^(.+)\#(\d+) - \S+ \S+ \S+ \((\w+)\)/; ( $name, $rev, $type ) = ($1,$2,$3) ; my $filetype = $type ; # Set legend my $legend = "" ; if(exists $viewConfig::ExtensionToType{$ext}) { # See if it's a specially viewable file... my $type = $viewConfig::ExtensionToType{$ext} ; my ($url,$desc,$content,$about) = @{$viewConfig::TypeData{$type}} ; # If it's an HTML file, include "About..." option... if ( defined $about ) { $legend .= &P4CGI::ul_list("<i>$about</i>", "<hr>", &P4CGI::ahref(-url => $url, "TYPE=$type", &P4CGI::fixspaces("FSPC=$file"), "REV=$rev", "View $desc"), &P4CGI::ahref(-url => "fv.cgi", &P4CGI::fixspaces("FSPC=$file"), "REV=$rev", "TRACE=yes", "View line-by-line history trace"), &P4CGI::ahref(-url => "dnld.cgi", &P4CGI::fixspaces("FSPC=$file"), "REV=$rev", "Download file")) ; } # ...otherwise just offer viewing and downloading options (for non-binary) else { if( $filetype =~ /.*binary/ ) { $legend .= &P4CGI::ul_list(&P4CGI::ahref(-url => $url, "TYPE=$type", &P4CGI::fixspaces("FSPC=$file"), "REV=$rev", "View $desc"), &P4CGI::ahref(-url => "dnld.cgi", &P4CGI::fixspaces("FSPC=$file"), "REV=$rev", "Download file")) ; } else { $legend .= &P4CGI::ul_list(&P4CGI::ahref(-url => $url, "TYPE=$type", &P4CGI::fixspaces("FSPC=$file"), "REV=$rev", "View $desc"), &P4CGI::ahref(-url => "fv.cgi", &P4CGI::fixspaces("FSPC=$file"), "REV=$rev", "TRACE=yes", "View line-by-line history trace"), &P4CGI::ahref(-url => "dnld.cgi", &P4CGI::fixspaces("FSPC=$file"), "REV=$rev", "Download file")) ; } } } # ...otherwise, just offer the trace and download options else { $legend = &P4CGI::ul_list(&P4CGI::ahref(-url => "fv.cgi", &P4CGI::fixspaces("FSPC=$file"), "REV=$rev", "TRACE=yes", "View line-by-line history trace"), &P4CGI::ahref(-url => "dnld.cgi", &P4CGI::fixspaces("FSPC=$file"), "REV=$rev", "Download file")) ; } # Print title and legend print "", &P4CGI::start_page("File View",$legend,$homepage,$backtohome) ; # Print filename, and... print "", "<b>File:</b><font color=green> $file</font>\n", "<br>" ; # ...if filetype is binary and it's not being forced, tell&ask... if(!defined $force and ($type =~ /.*binary/)) { print "<h3>Type: <font color=red>$type</font></h3>\n", &P4CGI::ahref(-url => &P4CGI::cgi()->url, &P4CGI::cgi()->query_string()."&FORCE=Y", "View anyway?") ; } # ...otherwise, print type and rev else { my $linecount ; print "<b>Type:</b><font color=green> $type</font><br> <b>Revision:</b><font color=green> $rev</font><hr>\n<pre>\n"; # Print the contents of the file while( <P4> ) { $linecount++ ; if( ( $linecount % 5 ) == 0 ) { print "<a name=L${linecount}></a>" ; } print &P4CGI::fixSpecChar($_) ; } # End the preformatted tag print "</pre>\n"; } # Close it up close P4; # End the page print "", &P4CGI::end_page() ;
# | Change | User | Description | Committed | |
---|---|---|---|---|---|
#1 | 271 | Diane Holt |
The Perl files for P4DB. These (almost) match the files in rev 1 of the p4db.tar file -- a few files have some minor cosmetic changes in the code, and chv.cgi has a Legend item added that was missing in the one in the tar-file. These files, at rev 1 (and the files in p4db.tar at rev 1), are suitable for for running the app with release 98.2 of P4. |