#!/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 ; $fspc = &P4CGI::htmlEncode($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) ; if($weAreAtROOT) { &P4CGI::cgi()->delete("FSPC") ; } ; ### ### handle "Hide deleted files" argument ### # * Get HIDEDEL argument (Hide deleted files) my $hidedel = P4CGI::cgi()->param("HIDEDEL") ; if(&P4CGI::HIDE_DELETED() == 0) { $hidedel = "NO" unless defined $hidedel and $hidedel eq "YES" ; } else { $hidedel = "YES" unless defined $hidedel and $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 my $lastd ; if($tmp =~ /([^\/]+\/)$/) { $lastd = $1 ; } ; $tmp =~ s|[^/]+/$|| ; # Remove last subdir my $upTarget = $tmp ; # while($tmp ne $ROOT) { $tmp =~ s|([^/]+)/$|| or last ; my $f = $1 ; unshift @back,&P4CGI::ahref("FSPC=$tmp$f", "HIDEDEL=$hidedel", "HELP=Up to /$tmp$f", "/$f") ; } ; unless($weAreAtROOT) { unshift @back,&P4CGI::ahref("FSPC=$ROOT", "HIDEDEL=$hidedel", "HELP=Up to depot root", "[ROOT]") ; } if(defined $lastd) { push @back,"/$lastd" ; } my @options ; ### ### Create link to changes for all files below ### push @options,&P4CGI::buttonLink("changeList.cgi", "View changes for /$fspc...", "CMD=changes", "FSPC=/$fspc...", "Changes") ; ### ### Create link to changes for all files below ### push @options,&P4CGI::buttonLink("changeList.cgi", "View pending changes for /$fspc...", "CMD=changes", "STATUS=pending", "FSPC=/$fspc...", "Pending") ; ### ### Create link to open files for all files below ### push @options,&P4CGI::buttonLink("fileOpen.cgi", "View currently open files for /$fspc...", "FSPC=/$fspc...", "Open files") ; ### ### Create link to view changes for a specific user below this point ### push @options,&P4CGI::buttonLink("searchPattern.cgi", "Find changes by user, description etc.", "FSPC=/$fspc...", "Find changes") ; ### ### Create link to recently modified files ### push @options,&P4CGI::buttonLink("findFiles.cgi", "Find files by name and date in /$fspc...", "FSPC=/$fspc...", "Find Files") ; ### ### Create link to depot statistics ### push @options,&P4CGI::buttonLink("depotStats.cgi", "View depot statistics for /$fspc...", "FSPC=/$fspc...", "Statistics") ; ### ### Create link to recently modified files ### push @options,&P4CGI::buttonLink("jobList.cgi", "View jobs related to files /$fspc...", "FSPC=/$fspc...", "LIST=Y", "Jobs") ; ### ### Get subdirs ### my @allSubDirsWithFiles ; &P4CGI::p4call(\@allSubDirsWithFiles,"dirs \"/$fspc*\" $err2null") ; my %nonDeleted = map { ($_,$_) ; } @allSubDirsWithFiles ; my @subdirs ; &P4CGI::p4call(\@subdirs,"dirs $p4DirsDOption \"/$fspc*\" $err2null") ; map { my $dir = $_ ; my $dirname ; ($dirname = $dir) =~ s|^.*/|/| ; my $divstart = "" ; my $divend = "" ; unless(defined $nonDeleted{$dir}) { $divstart = "<span class=\"deleted\">" ; $divend = "</span>" ; } ; $_ = $divstart. P4CGI::ahref("FSPC=$dir", "HIDEDEL=$hidedel", "HELP=Descend to subdir", $dirname) . $divend ; } @subdirs ; unless($weAreAtROOT) { unshift @subdirs,&P4CGI::ahref("FSPC=$upTarget", "HIDEDEL=$hidedel", "HELP=Up", "/..") ; } ### ### Get files ### my @files ; my $totalFiles = 0 ; my @tmp ; &P4CGI::p4call(\@tmp,"files \"/$fspc*\" $err2null") ; @files = map { /([^\#]+)\#(.*)/ ; $totalFiles++ ; my $file=$1 ; my $info=$2 ; $file =~ s/^.*\/// ; my ($rev,$inf) = split / - /,$info ; my $pfile = "$file" ; my $prev ; my $spanStart = "" ; my $spanEnd = "" ; if($inf =~ /^delete/) { $prev = "\#$rev"; $spanStart = "<span class=\"deleted\">" ; $spanEnd = "</span>" ; if($hidedel eq "YES") { $pfile = undef ; } else { $pfile= "$file"; } } else { $prev = &P4CGI::ahref(-url => "fileViewer.cgi", "FSPC=/$fspc$file", "REV=$rev", "HELP=View head revision of file", "\#$rev") ; }; if($pfile) { $pfile = join("", ($spanStart, &P4CGI::ahref(-url => "fileLogView.cgi", "FSPC=/$fspc$file", "HELP=View file log", "$pfile") , " $prev" , $spanEnd )) ; } ; defined $pfile?$pfile:() ; } @tmp ; ### ### Create link for "hide/view deleted files" ### my $toggleHide ; if($hidedel eq "YES") { $toggleHide = &P4CGI::buttonCell($ENV{SCRIPT_NAME}, "Click to show deleted files", "FSPC=/$fspc", "HIDEDEL=NO", "Show deleted") ; } else { $toggleHide = &P4CGI::buttonCell($ENV{SCRIPT_NAME}, "Click to hide deleted files", "FSPC=/$fspc", "HIDEDEL=YES", "Hide deleted") ; } ### ### Set help target ### &P4CGI::SET_HELP_TARGET("depotTreeBrowser") ; ### ### Start page printout ### print &P4CGI::start_page("Depot Tree Browser", $toggleHide) ; my $sarg=$weAreAtROOT?"[ROOT]":"/$fspc" ; # replace // with [ROOT] my $currpath ; print &P4CGI::start_framedTable("Location") ; if(@back > 0) { $currpath = join('',@back) ; } else { $currpath = "[ROOT]" ; } print " <tr>\n". " <td class=\"TreeBrowser\">$currpath</td>\n". " </tr>\n". " <tr>\n". " <td>\n" . join(" ",@options) . " </td>\n" . " </tr>\n" . &P4CGI::end_framedTable() ; ### # Make table with three columns # sub makeThreeColumns(@) { my $l = @_ ; my $len = int((@_+2)/3) ; if($l < 10) { $len = int($l/2) ; } ; if($l < 6) { $len = $l ; } ; while(@_ < ($len*3)) { push @_,"" ;} ; # To avoid error messages return join("\n",(&P4CGI::start_table(" COLS=3 class=\"TreeBrowser\""), &P4CGI::table_row({-class => "TreeBrowser", -text => join("<br>\n",@_[0..$len-1])}, {-class => ($len<$l)?"TreeBrowser":"Empty", -text => join("<br>\n",@_[$len..(2*$len)-1])}, {-class => ($len*2<$l)?"TreeBrowser":"Empty", -text => join("<br>\n",@_[(2*$len)..(3*$len)-1])}), &P4CGI::end_table())) ; } if($weAreAtROOT and $moreThanOneDepot) { print "<br>" , &P4CGI::start_framedTable("Depots") ; if(@subdirs>0) { print makeThreeColumns(@subdirs) ; } print &P4CGI::end_framedTable() ; } else { print "<br>", &P4CGI::start_framedTable("Directories") ; if(@subdirs>0) { print makeThreeColumns(@subdirs) ; } else { print "<br>[No more subdirectories]<br>" ; } ; print &P4CGI::end_framedTable() ; print "<br>", &P4CGI::start_framedTable("Files") ; print " (deleted files hidden)" if ($hidedel eq "YES" and $totalFiles > @files); print "\n"; if(@files>0) { print makeThreeColumns(@files) ; } else { print "<br>[No files in this directory]<br>" ; } print &P4CGI::end_framedTable() ; } ; print &P4CGI::end_page() ; # # That's all folks #
# | Change | User | Description | Committed | |
---|---|---|---|---|---|
#10 | 4306 | Fredric Fredricson |
P4DB: Hardened P4DB against malicious parameters (cross site scripting), performed some cleanup and increased version to 3.1.1. |
||
#9 | 4237 | Fredric Fredricson | P4DB: Maybe the final submit for P4DB 3.1.0 | ||
#8 | 4152 | Fredric Fredricson | P4DB: Some more work on tha way to version 3.1.... | ||
#7 | 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.... |
||
#6 | 4046 | Fredric Fredricson |
P4DB: First submit for 3.1. * Removed frame-stuff and some related files * Added new page header * Started update of documentation * Changed a lot of CGI:s to conform to new "look and feel" Still a lot to do: - clean up stuff (especially the javascript) - Fix the file list to use new annotate-command - Clean up and document css-file - and more....... |
||
#5 | 2875 | Fredric Fredricson | P4DB 3.0 first beta... | ||
#4 | 1931 | Fredric Fredricson | P4DB: Small user interface improvement, | ||
#3 | 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. |
||
#2 | 1647 | Fredric Fredricson |
P4DB: Made it possible to select "hide deleted" or "show deleted" as default in depot tree browser. |
||
#1 | 1638 | Fredric Fredricson | P4DB: Added all (I think) files for P4DB |