- #!/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 ;
- $| = 1 ;
- # 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.
- #
- # return number of digits in an integer
- sub digits($) {
- my $n = shift;
- return int(log($n)/log(10))+1 ;
- }
- # Get file spec argument
- my $file = &P4CGI::cgi()->param("FSPC") ;
- &P4CGI::bail("No file specified") unless defined $file ;
- $file = &P4CGI::htmlEncode($file) ;
- my $showdeleted = &P4CGI::cgi()->param("SHOWDEL") ;
- my $showhelp = &P4CGI::cgi()->param("HELP") ;
- $showhelp="N" unless defined $showhelp ;
- my $revision = P4CGI::cgi()->param("REV") ;
- my $force = P4CGI::cgi()->param("FORCE") ;
- my $fileExtension = $file ;
- $fileExtension =~ s/^.*\.// ;
- $fileExtension = uc($fileExtension) ;
- $revision = "\#$revision" if defined $revision ;
- $revision = "" unless defined $revision ;
- my @legend ;
- my $filetype = "UNKNOWN" ;
- my $filesize = "UNKNOWN" ;
- local *P4 ;
- &P4CGI::p4call(*P4,"fstat -l -s \"$file$revision\"") ;
- while(<P4>) {
- /... headType (\S+)/ and do {
- $filetype = $1 ;
- next ;
- } ;
- /... fileSize (\d+)/ and do {
- $filesize = $1 ;
- next ;
- }
- }
- my %revToChange ;
- &P4CGI::p4call(*P4,"filelog \"$file$revision\"") ;
- while(<P4>) {
- /... \#(\d+) change (\d+)/ and do {
- $revToChange{$1} = $2 ;
- }
- } ;
- close P4 ;
- my @fileContents ;
- &P4CGI::p4call(\@fileContents,"print \"$file$revision\"") ;
- my $info = shift @fileContents;
- &P4CGI::bail("Failed to read file $file$revision") unless defined $info ;
- $info =~ /\#(\d+) - / or &P4CGI::bail("Failed to parse first line from \"p4 print/annotate -a $file$revision\" command") ;
- my $rev = $1 ;
- {
- my $buttontext ;
- my $helptext ;
- if($rev > 1) {
- if(defined $showdeleted) {
- &P4CGI::cgi()->delete("SHOWDEL") ;
- $buttontext = "Hide deleted lines" ;
- $helptext = "Hide the deleted lines and revisions" ;
- }
- else {
- &P4CGI::cgi()->param("SHOWDEL","Y") ;
- $buttontext = "Show deleted lines" ;
- $helptext = "Show all deleted lines and the revision where they where deleted" ;
- } ;
- } ;
- push @legend, &P4CGI::buttonCell(&P4CGI::cgi()->url(-relative => 1,
- -query => 1),
- "$helptext",
- "$buttontext");
- };
- if(exists $viewConfig::ExtensionToType{$fileExtension}) {
- my $type = $viewConfig::ExtensionToType{$fileExtension} ;
- my ($url,$desc,$content,$about) = @{$viewConfig::TypeData{$type}} ;
- push @legend, &P4CGI::buttonCell($url,
- "View file $file",
- "TYPE=$type",
- "FSPC=$file",
- "TARGET=_blank",
- "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") ;
- {
- &P4CGI::cgi()->delete("HELP") ;
- my $buttontext ;
- my $helptext ;
- if($showhelp ne "Y") {
- &P4CGI::cgi()->param("HELP","Y") ;
- $buttontext = "Show help" ;
- $helptext = "Show a help text that describes this page" ;
- }
- else {
- &P4CGI::cgi()->param("HELP","N") ;
- $buttontext = "Hide help" ;
- $helptext = "Hide help" ;
- } ;
- push @legend, "<td> </td>",&P4CGI::buttonCell(&P4CGI::cgi()->url(-relative => 1,
- -query => 1),
- $helptext,,
- $buttontext) ;
- &P4CGI::cgi()->delete("HELP") ;
- };
- &P4CGI::start_page("File <tt>$file</tt>\#$rev",@legend) ;
- if($showhelp eq "Y") {
- &P4CGI::start_framedTable("Page help") ;
- my $key ;
- $key = ":Hide" unless defined $showdeleted ;
- $key = ":Show" if defined $showdeleted ;
- while(<DATA>) {
- /^$key/ and do {
- while(<DATA>) {
- last if /^:/ ;
- print ;
- }
- last ;
- }
- }
- &P4CGI::end_framedTable(), "<br>" ;
- }
- &P4CGI::start_framedTable("File info"),
- &P4CGI::start_table(),
- &P4CGI::table_row({-class => "Prompt",
- -text => "File type:"},
- $filetype),
- &P4CGI::table_row({-class => "Prompt",
- -text => "File size:"},
- "$filesize Bytes"),
- &P4CGI::end_table(),
- &P4CGI::end_framedTable() ;
- unless($force or $filetype =~ /text/ or $filetype =~ /unicode/) {
- print "File type is \"$filetype\" and not text<br>" ;
- &P4CGI::cgi()->param("FORCE"=>"Y") ;
- &P4CGI::buttonLink(&P4CGI::cgi()->url(-query=>1),
- "View file even if not text type",
- "View anyway"),
- &P4CGI::end_page() ;
- exit 0 ;
- }
- map { my $x = &P4CGI::htmlEncode($_) ; $_ = $x ; } @fileContents ;
- if(&P4CGI::VIEW_WITH_COLORS()) {
- my $tmp = join("\n",@fileContents) ;
- &colorView::color($file,\$tmp) ;
- @fileContents = split("\n",$tmp) unless $@ ;
- } ;
- my $lines = scalar @fileContents ;
- &P4CGI::start_framedTable("File ($lines lines)") ;
- print "<table class=\"fileViewer\">\n" ;
- print "<tr>" ;
- print "<th class=\"fileViewerHeader\">Added in rev./ch.</th>" ;
- print "<th class=\"fileViewerHeader\">Deleted to rev./ch.</th>" if $showdeleted ;
- print "<th class=\"fileViewerHeader\">Line</th> ";
- print "<th class=\"fileViewerHeader\">File<br>content</th> ";
- print "</tr>\n" ;
- my $lastRevStr = "" ;
- my $lineNo = 0 ;
- my @dataC ;
- my $p4_depot=&P4CGI::CURR_DEPOT_NO() ;
- &P4CGI::p4call(*P4,"annotate -a \"$file$revision\"") ;
- my $firstline = <P4> ;
- while(<P4>) {
- chomp ;
- s/^(\d+)-(\d+): // and do {
- my ($firstrev,$lastrev,$line) = ($1,$2,&P4CGI::rmTabs($_)) ;
- next if ($lastrev < $rev) and ! $showdeleted ;
- $firstrev =
- "<a class=\"normal\" title=\"Line(s) added by change $revToChange{$firstrev}. Click to view change.\" ".
- " href=\"changeView.cgi?CH=$revToChange{$firstrev};DP=$p4_depot\">$firstrev/$revToChange{$firstrev}</a>" ;
- if($lastrev < $rev) {
- my $r = $lastrev + 1 ;
- if($showdeleted) {
- $lastrev =
- "<a class=\"normal\" title=\"Line(s) deleted by change $revToChange{$r}. Click to view change.\" ".
- " href=\"changeView.cgi?CH=$revToChange{$r};DP=$p4_depot\">$r/$revToChange{$r}</a>" ;
- }
- else {
- $lastrev = "" ;
- } ;
- }
- else {
- $lastrev = "" ;
- }
- my $cclass = "" ;
- my $revStr = "XX" ;
- my $lineNoStr = "" ;
- if($lastrev ne "") {
- $revStr = "A:$firstrev D:$lastrev" ;
- $cclass= "class=\"deleted\"" ;
- $line = &P4CGI::htmlEncode($line) ;
- }
- else {
- $line = shift @fileContents ;
- $revStr = "A:$firstrev " ;
- $lineNo++ ;
- if($lineNo == 1 or $lineNo % 5 == 0) {
- $lineNoStr="<a name=\"L$lineNo\">$lineNo</a>" ;
- }
- else {
- $lineNoStr="<a name=\"L$lineNo\"> </a>" ;
- }
- }
- my $revclass ;
- if($lastRevStr eq $revStr) {
- $revStr = "" ;
- $firstrev = "" ;
- $lastrev = "" ;
- $revclass="fileViewerRevEmpty" ;
- }
- else {
- $lastRevStr = $revStr ;
- $revclass="fileViewerRev" ;
- } ;
- $line = "" unless defined $line ;
- while($line =~ s/(<[^>]*) ([^>]*>)/$1===SPACE===HERE===$2/g) {} ;
- $line =~ s/ / /g ;
- $line =~ s/===SPACE===HERE===/ /g ;
- print "<tr><th class=\"$revclass\">$firstrev</th>" ;
- print "<th class=\"$revclass\">$lastrev</th>" if $showdeleted ;
- print "<th class=\"fileViewerLineNo\">$lineNoStr</th><td><span $cclass>$line</span> </td></tr>\n" ;
- }
- } ;
- print "</table>" ;
- close P4 ;
- &P4CGI::end_framedTable(),
- &P4CGI::end_page() ;
- #
- # That's all folks
- #
- __END__
- :Hide deleted
- This page show contents of a specific revision of a file as text.<br>
- The contents may be colorized for some file types (html, perl and c source).<br>
- The contents is displayed in a table with three columns:
- <ol>
- <li> The first column show revision and change where line was added or modified.
- <li> The second column shows source line numbers..
- <li> The third column shows the file content.
- </ol>
- :Show deleted
- This page show all lines that ever has been in the file for a specific revision of it.<br>
- The contents may be colorized for some file types (html, perl and c source).<br>
- The contents is displayed in a table with four columns:
- <ol>
- <li> The "Added in rev." column contain the revision and change where the line was added.
- <li> The "Deleted in rev." column contain the revision and change where the line was deleted. This column is
- empty if the line is not deleted.
- <li> The third column shows source line numbers (in the current revision)
- <li> The fourth column shows the file content. Deleted will be marked as:<br>
- <span class="deleted">This is a deleted line</span><br>
- </ol>
# | Change | User | Description | Committed | |
---|---|---|---|---|---|
#11 | 4916 | Fredric Fredricson | P4DB: Improved file viewer (and simplified the code) | 20 years ago | |
#10 | 4306 | Fredric Fredricson | P4DB: Hardened P4DB against malicious parameters (cross site scripting), performed some c...leanup and increased version to 3.1.1. « |
21 years ago | |
#9 | 4237 | Fredric Fredricson | P4DB: Maybe the final submit for P4DB 3.1.0 | 21 years ago | |
#8 | 4216 | Fredric Fredricson | P4DB: Another partial submit on my way to P4DB 3.1... | 21 years ago | |
#7 | 4176 | Fredric Fredricson | P4DB: Still working my way to P4DB 3.1... | 21 years ago | |
#6 | 4152 | Fredric Fredricson | P4DB: Some more work on tha way to version 3.1.... | 21 years ago | |
#5 | 4069 | Fredric Fredricson | P4DB: More changes on the way to 3.1 | 21 years ago | |
#4 | 4048 | Fredric Fredricson | P4DB: Updated for Explorer. * Updated Style Sheet to work for Explorer as well as Netscape... * Improved alternate header * Some other small fixes.... « |
21 years ago | |
#3 | 2875 | Fredric Fredricson | P4DB 3.0 first beta... | 22 years ago | |
#2 | 1920 | Fredric Fredricson | P4DB: Mainly some user interface fixes: * Added a small arrow that points to selection in... list of options * Added tooltip help * Added user prefereces to turn the above off (or on) * Some other user interface fixes And fixed a bug in jobList.cgi and some minor bugs in label and branch viewers. « |
23 years ago | |
#1 | 1638 | Fredric Fredricson | P4DB: Added all (I think) files for P4DB | 23 years ago |