#!/usr/bin/perl -w
# -*- perl -*-
use strict ;
use HTML::Entities ;
#
# p4_filelog for Safari
# Copyright (c) 1999 by Barrie Slaymaker, rbs@telerama.com
#
# You may distribute under the terms of either the GNU General Public
# License or the Artistic License, as specified in the README file.
#
#
# Port of flv.cgi to safari.
#
#################################################################
# CONFIGURATION INFORMATION
# All config info should be in P4CGI.pm
#
#################################################################
#
# P4 file log viewer
#
#################################################################
local *P ;
# Get file argument
my $file = $ARGV[ 0 ] ;
my $listLabel = "Yes" ;
$listLabel = "No" unless defined $listLabel ;
die "No file spec" unless defined $file ;
my $up_to_project = $ENV{SAF_UP_TO_PROJECT} ;
my $up_to_rev = $ENV{SAF_UP_TO_REV} ;
my $up_to_filter = $ENV{SAF_UP_TO_FILTER} ;
my $path_filter = $ENV{SAF_PATH_FILTER} ;
# Get file data
my @filelog ;
p4call(\@filelog,"filelog $file") ;
die "No data for file \"$file\"" if @filelog == 0 ;
# Get info about opened status
p4call(*P,"opened -a $file 2>/dev/null") ;
my %opened ;
while(<P>) {
chomp ;
/\w+\#(\d+) - .* by (\w+)\@(\S+)/ or
die "Can not read info from \"p4 opened\"" ;
if(exists $opened{$1}) {
$opened{$1} .= "<br> and $2\@$3" ;
} else {
$opened{$1} = "$2\@$3" ;
} ;
} ;
close *P ;
# Get list of labels (if $listLabel is set)
my @labels ;
if($listLabel eq "Yes") {
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 ;
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" ;
}
}
}
} ;
print <<TOHERE ;
<HTML>
<HEAD>
<TITLE>File log for $file</TITLE>
</HEAD>
<BODY>
<UL>
TOHERE
print
"",
"<TABLE>\n" ,
"<TR ALIGN=\"LEFT\">",
map{ "<TH>$_</TH>" } qw( Rev Act. Date User Change Desc Labels Opened_by ),
"</TR>\n",
;
my $log ;
my @revs ;
for($log = shift @filelog ; defined $log ; $log = shift @filelog) {
$_ = $log ; #&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>" ;
my $file_path = $file ;
$file_path =~ s@^//@/@ ;
my $rev_anchor = encode_entities( "#$rev" ) ;
# qq{<A HREF="${up_to_project}_$rev/$path_filter$file_path">#$rev</A>} ;
my $change_anchor = join(
'',
qq{<A HREF="${up_to_project}\@$change/$path_filter$file_path">\@},
encode_entities( $change ),
'</A>',
) ;
if ($act eq 'branch') {
$_ = shift @filelog ; # &P4CGI::fixSpecChar(shift @filelog) ;
my ($fromname,$fromrev) = /^.*branch from (\S+?)\#(\d+).*/;
print
"",
"<TR>",
map { "<TD VALIGN=\"TOP\">$_</TD>" } (
$rev_anchor,
$act,
$date,
$user,
$change_anchor,
"<tt>$desc</tt>",
$labels,
exists $opened{$rev}?$opened{$rev}:""),
"</TR>\n",
;
}
elsif ($act eq 'delete') {
print
"",
"<TR>",
map { "<TD VALIGN=\"TOP\">$_</TD>" } (
$rev_anchor,
"<strike>delete</strike>",
"$date",
"$user",
$change_anchor,
"<tt>$desc</tt>",
$labels,
exists $opened{$rev}?$opened{$rev}:""),
"</TR>\n",
;
}
else {
print
"",
"<TR>",
map { "<TD VALIGN=\"TOP\">$_</TD>" } (
"$rev_anchor",
"$act",
"$date",
"$user",
$change_anchor,
"<tt>$desc</tt>",
$labels,
exists $opened{$rev}?$opened{$rev}:""),
"</TR>\n",
;
}
}
}
print "", "</TABLE>\n" ;
#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 <<TOHERE ;
</BODY>
</HTML>
TOHERE
#
# That's it folks
#
0 ;
sub p4call {
my ( $fh, $cmd ) = @_ ;
$cmd = "p4 $cmd |" ;
if ( ref( $fh ) eq 'ARRAY' ) {
open( CMD, $cmd ) or
die "$!: $cmd" ;
while (<CMD>) {
push( @$fh, $_ ) ;
}
close( CMD ) ;
}
else {
open( $fh, $cmd ) or
die "$!: $cmd" ;
}
}
| # | Change | User | Description | Committed | |
|---|---|---|---|---|---|
| #4 | 198 | Barrie Slaymaker |
Removed HREF anchor around rev number, fixed URL in change number anchor in file log. Made perl/cgimake.conf set SAF_PATH_... env. vars properly. |
||
| #3 | 168 | Barrie Slaymaker | Added YAPC paper, slides | ||
| #2 | 165 | Barrie Slaymaker | Applied Greg KH's license patch. | ||
| #1 | 162 | Barrie Slaymaker | First code & documentation checkin |