#!/usr/bin/perl -w
# -*- perl -*-
use P4CGI ;
use strict ;
#
#################################################################
# CONFIGURATION INFORMATION
# All config info should be in P4CGI.pm
#
#################################################################
#
# P4 depot tree browser
#
#################################################################
###
### Handle file spec argument
###
# * Get path from argument
my $fspc = P4CGI::cgi()->param("FSPC") ;
$fspc =~ s/\.\.\.$// if defined $fspc ;
# Find out if we have multiple depots
my @depots ;
my $err2null = &P4CGI::REDIRECT_ERROR_TO_NULL_DEVICE() ;
&P4CGI::p4call(\@depots,"dirs \"//*\" $err2null") ;
my $moreThanOneDepot = (@depots > 1) ;
# Set server ROOT
my $ROOT ;
if($moreThanOneDepot) {
$ROOT = "/" ;
}
else {
$ROOT = "$depots[0]/" ;
$ROOT =~ s|//|/|g ;
} ;
# canonicalize to either "/.../" or "/"
$fspc = $ROOT unless defined $fspc ;
$fspc = "/$fspc/" ;
while($fspc =~ s|//|/|) {} ;
# Find out if we are at root
my $weAreAtROOT = ($fspc eq $ROOT) ;
###
### handle "Hide deleted files" argument
###
# * Get HIDEDEL argument (Hide deleted files)
my $hidedel = P4CGI::cgi()->param("HIDEDEL") ;
$hidedel = "NO" unless defined $hidedel ;
$hidedel = "YES" unless $hidedel eq "NO" ;
my $p4DirsDOption = "" ; # Set -D option for "p4 dirs" if hide deleted
$p4DirsDOption = " -D" if $hidedel eq "NO" ;
###
### Figure out "back" buttons
###
my @back ;
my $tmp = "$fspc" ; # Copy arg
$tmp =~ s|[^/]+/$|| ; # Remove last subdir
#
while($tmp ne $ROOT) {
$tmp =~ s|([^/]+)/$|| or last ;
my $f = $1 ;
unshift @back,&P4CGI::ahref("FSPC=$tmp$f",
"HIDEDEL=$hidedel",
"/$f") ;
} ;
unless($weAreAtROOT) {
unshift @back,&P4CGI::ahref("FSPC=$ROOT",
"HIDEDEL=$hidedel",
"[ROOT]") ;
}
###
### Create link to changes for all files below
###
my $linkToAllbelow = &P4CGI::ahref(-url => "changeList.cgi",
"CMD=changes",
"FSPC=/$fspc...",
"View changes") ;
###
### Create link to view changes for a specific user below this point
###
my $linkToChangeByUser = &P4CGI::ahref(-url => "changeByUsers.cgi",
"FSPC=/$fspc...",
"View changes by user or group") ;
###
### Create link to search for pattern
###
my $linkToPatternSearch = &P4CGI::ahref(-url => "searchPattern.cgi",
"FSPC=/$fspc...",
"Search for pattern in change descriptions") ;
###
### Create link to recently modified files
###
my $recentlyModified = &P4CGI::ahref(-url => "filesChangedSince.cgi",
"FSPC=/$fspc...",
"Recently modified files") ;
###
### Create link to depot statistics
###
my $depotStatistics = &P4CGI::ahref(-url => "depotStats.cgi",
"FSPC=/$fspc...",
"Depot Statistics") ;
###
### Get subdirs
###
my @subdirs ;
&P4CGI::p4call(\@subdirs,"dirs $p4DirsDOption \"/$fspc*\" $err2null") ;
map { my $dir = $_ ;
my $dirname ;
($dirname = $dir) =~ s|^.*/|/| ;
$_ = P4CGI::ahref("FSPC=$dir",
"HIDEDEL=$hidedel",
$dirname) ;
} @subdirs ;
###
### Get files
###
my @files ;
my @tmp ;
&P4CGI::p4call(\@tmp,"files \"/$fspc*\" $err2null") ;
@files = map { /([^\#]+)\#(.*)/ ;
my $file=$1 ;
my $info=$2 ;
$file =~ s/^.*\/// ;
my ($rev,$inf) = split / - /,$info ;
my $pfile = "$file" ;
my $prev ;
if($inf =~ /^delete/) {
$prev = "$rev";
if($hidedel eq "YES") {
$pfile = undef ;
}
else {
$pfile= "$file";
}
}
else {
$prev = &P4CGI::ahref(-url => "fileViewer.cgi",
"FSPC=/$fspc$file",
"REV=$rev",
"$rev") ;
};
if($pfile) {
$pfile = &P4CGI::ahref(-url => "fileLogView.cgi",
"FSPC=/$fspc$file",
"$pfile").
" \#$prev" ;
} ;
defined $pfile?$pfile:() ;
} @tmp ;
###
### Create link for "hide/view deleted files"
###
my $toggleHide ;
if($hidedel eq "YES") {
$toggleHide = P4CGI::ahref("FSPC=/$fspc",
"HIDEDEL=NO",
"Show deleted files") ;
}
else {
$toggleHide = P4CGI::ahref("FSPC=/$fspc",
"HIDEDEL=YES",
"Hide deleted files") ;
}
###
### Set help target
###
&P4CGI::SET_HELP_TARGET("depotTreeBrowser") ;
###
### Start page printout
###
print
"",
&P4CGI::start_page("Depot Tree Browser",
&P4CGI::ul_list("Subdir -- Descend to subdir",
"File -- Show file log",
"Rev -- View current revision",
"$toggleHide")) ;
my $sarg=$weAreAtROOT?"[ROOT]":"/$fspc" ; # replace // with [ROOT]
# Print current directory
print "
Depots\n" ; if(@subdirs>0) { print makeThreeColumns(@subdirs) ; } } else { print "
Subdirs\n" ;
if(@subdirs>0) {
print makeThreeColumns(@subdirs) ;
}
else {
print "
[No more subdirectories]" ;
}
print "
Files\n" ;
if(@files>0) {
print makeThreeColumns(@files) ;
}
else {
print "
[No files in this directory]
" ;
}
} ;
print "