#!/usr/bin/perl -w # -*- perl -*- use P4CGI ; use strict ; # ################################################################# # CONFIGURATION INFORMATION # All config info should be in P4CGI.pm # ################################################################# # # P4 file log viewer # ################################################################# local *P ; # Get file argument my $file = P4CGI::cgi()->param("FSPC") ; my $listLabel = P4CGI::cgi()->param("LISTLAB") ; $listLabel = "No" unless defined $listLabel ; &P4CGI::bail("No file spec") unless defined $file ; # Get file data my @filelog ; &P4CGI::p4call(\@filelog,"filelog $file") ; &P4CGI::bail("No data for file \"$file\"") if @filelog == 0 ; # Get info about opened status &P4CGI::p4call(*P,"opened -a $file 2>/dev/null") ; my %opened ; while(<P>) { chomp ; /\w+\#(\d+) - .* by (\w+)\@(\S+)/ or &P4CGI::bail("Can not read info from \"p4 opened\"") ; if(exists $opened{$1}) { $opened{$1} .= "<br> and " . &P4CGI::ahref( -url => &P4CGI::LU_URL(), "USER=$2", "$2") . "\@$3" ; } else { $opened{$1} = &P4CGI::ahref( -url => &P4CGI::LU_URL(), "USER=$2", "$2") . "\@$3" ; } ; } ; close *P ; # Get list of labels (if $listLabel is set) my @labels ; if($listLabel eq "Yes") { &P4CGI::p4call(*P,"labels") ; while(<P>) { /^Label (\S+)/ and do { push @labels,$1 ; } ; } close P ; } # Create hash containing labes by file name and version my %fileToLabels ; if(@labels > 0) { my $filelabels = "" ; foreach (@labels) { $filelabels .= " $file\@$_" ; } my @filesInLabels ; &P4CGI::p4call(\@filesInLabels,"files $filelabels 2>&1") ; foreach (@filesInLabels) { my $lab = shift @labels ; /not in label/ or do { /^(\S+)/ ; if(defined $fileToLabels{$1}) { $fileToLabels{$1} .= "<br>$lab" ; } else { $fileToLabels{$1} = "$lab" ; } } } } ; my @legendList ; push @legendList, "<b>Revision Number</b> -- see the file text", "<b>Action</b> -- see the deltas (diffs)", "<b>User</b> -- see info about user", "<b>Change</b> -- see the complete change description, including other files", &P4CGI::ahref("-url",P4CGI::CHB_URL(), "FSPC=$file", "Changes") . "-- see list of all changes for this file" ; if($listLabel ne "Yes") { push @legendList, &P4CGI::ahref("-url",P4CGI::FLV_URL(), "FSPC=$file", "LISTLAB=Yes", "List labels") . "-- list cross ref. for labels" ; } ; print "",&P4CGI::start_page("File log<br>$file",&P4CGI::ul_list(@legendList)) ; my $labelHead =""; if($listLabel eq "Yes") { $labelHead="In label(s)" ; } ; print "", &P4CGI::start_table(""), &P4CGI::table_row("-type","th", "-align","left", "Rev","Act.","Date","User","Change","Desc",$labelHead,"Opened by"); my $log ; my @revs ; for($log = shift @filelog ; defined $log ; $log = shift @filelog) { $_ = &P4CGI::fixSpecChar($log) ; if(/^\.\.\. \#(\d+) \S+ (\d+) (\S+) on (\S+) by (\S*)@(\S*) \((\S*)\) '(.*)'/ ) { my ($rev,$change,$act,$date,$user,$client,$ftype,$desc) =($1,$2,$3,$4,$5,$6,$7,$8) ; $desc = &P4CGI::magic($desc) ; push @revs,$rev ; my $labels = $fileToLabels{"$file\#$rev"} ; $labels = "" unless defined $labels ; $labels = "<b>$labels</b>" ; if ($act eq 'branch') { $_ = &P4CGI::fixSpecChar(shift @filelog) ; my ($fromname,$fromrev) = /^.*branch from (\S+?)\#(\d+).*/; print "", &P4CGI::table_row(-valign => "top", &P4CGI::ahref("-url",&P4CGI::FV_URL(), "FSPC=$file", "REV=$rev", "$rev"), &P4CGI::ahref("FSPC=$fromname", "REV=$fromrev", "$act"), "$date", &P4CGI::ahref(-url => &P4CGI::LU_URL(), "USER=$user", "$user"), &P4CGI::ahref("-url",&P4CGI::CHV_URL(), "CH=$change", "$change"), "<tt>$desc</tt>", $labels, exists $opened{$rev}?$opened{$rev}:"") ; } elsif ($act eq 'delete') { print "", &P4CGI::table_row(-valign => "top", &P4CGI::ahref("-url",&P4CGI::FV_URL(), "FSPC=$file", "REV=$rev", "$rev"), "<strike>delete</strike>", "$date", &P4CGI::ahref(-url => &P4CGI::LU_URL(), "USER=$user", "$user"), &P4CGI::ahref("-url",&P4CGI::CHV_URL(), "CH=$change", "$change"), "<tt>$desc</tt>", $labels, exists $opened{$rev}?$opened{$rev}:"") ; } else { print "", &P4CGI::table_row(-valign => "top", &P4CGI::ahref("-url",&P4CGI::FV_URL(), "FSPC=$file", "REV=$rev", "$rev"), &P4CGI::ahref("-url",&P4CGI::FDV_URL(), "FSPC=$file", "REV=$rev", "ACT=$act", "$act"), "$date", &P4CGI::ahref(-url => &P4CGI::LU_URL(), "USER=$user", "$user"), &P4CGI::ahref("-url",&P4CGI::CHV_URL(), "CH=$change", "$change"), "<tt>$desc</tt>", $labels, exists $opened{$rev}?$opened{$rev}:"") ; } } } print "", &P4CGI::end_table("") ; if(@revs > 2) { print "<hr>", &P4CGI::cgi()->startform("-action",&P4CGI::FDV_URL(), "-method","GET"), &P4CGI::cgi()->hidden("-name","FSPC", "-value","$file"), &P4CGI::cgi()->hidden("-name","ACT", "-value","edit"), "\nShow diff between revision: ", &P4CGI::cgi()->popup_menu(-name =>"REV", "-values" =>\@revs); shift @revs ; print " and ", &P4CGI::cgi()->popup_menu(-name =>"REV2", "-values" =>\@revs), " ", &P4CGI::cgi()->submit(-name =>"Go", -value =>"Go"), &P4CGI::cgi()->endform() ; } print "", &P4CGI::end_page() ; # # That's it folks #
# | Change | User | Description | Committed | |
---|---|---|---|---|---|
#1 | 2778 | Jay Han | creating guest branch per tutorial http://public.perforce.com/public/tutorial.html | ||
//guest/perforce_software/utils/p4db/P4DB_0/flv.cgi | |||||
#1 | 1885 | rmg |
For posterity: Make the old version appear in a "P4DB_0" subdirectory. (I'd have called it 0.99, but I'm not sure it really *is* 0.99!) |
||
//guest/perforce_software/utils/p4db/flv.cgi | |||||
#3 | 14 | Perforce maintenance | Fix label display in P4DB. | ||
#2 | 13 | Perforce maintenance | P4DB filelog fix for 98.2 server. | ||
#1 | 11 | Perforce maintenance | Add Fredric Fredricson's depot browser, P4DB. |