#!/usr/bin/perl -w
# -*- perl -*-
use P4CGI ;
use strict ;
#
#################################################################
# CONFIGURATION INFORMATION
# All config info should be in P4CGI.pm
#
#################################################################
#
# P4 change browser
# View list of jobs
#
#################################################################
#######
# Parameters:
#
# LIST
# If defined, show a list, if not, show select dialogue
#
# JOBVIEW
# If defined, used as jobview
#
# FLDnnn
# These parameters for this script depends on the fileds defined in the
# jobspec. The parameters are named:
# FLDnnn
# Where nnn is the field number as defined in the jobspec
#
# MATCHTYPE
# Used with FLDnnn parameters and defines if all or any should match
#
######
###
### Get and parse jobspec
###
my %jobspec ;
&P4CGI::p4readform("jobspec -o",\%jobspec) ;
#
# Make a 2000.2 jobspec compatible with 2000.1 and earlier
#
if(exists $jobspec{"Values"}) {
foreach (split("\n",$jobspec{"Values"})) {
my ($fld,$value) = split(/\s+/,$_) ;
$jobspec{"Values-$fld"} = $value ;
} ;
}
#
# Get jpbspec fields
#
my %fields ; # Store name, type, len, and options by field number
{
my @tmp = split("\n",$jobspec{"Fields"}) ;
my $s ;
foreach $s (@tmp) {
my ($code,$name,$type,$len,$option) = split(/\s+/,$s) ;
$fields{$code} = [ $name, $type, $len, $option ] ;
}
}
# File spec argument
my $FSPC = &P4CGI::cgi()->param("FSPC") ;
$FSPC = "" unless defined $FSPC ;
$FSPC = "" if $FSPC eq "//..." ;
$FSPC=&P4CGI::htmlEncode($FSPC) ;
###
### Build a selection forms for job list
###
sub buildSelection() {
## Get list of users (for later use for "user" field)
my %userData = &P4CGI::p4users() ;
my @listOfUsers = sort { uc($a) cmp uc ($b) } (keys %userData) ;
my %userCvt ;
&P4CGI::p4user2name(\%userCvt );
my $ulistSize = @listOfUsers ;
$ulistSize= 15 if $ulistSize > 15 ;
my @fieldPrompt ; # Prompt for each field
my @field ; # form entry for each field
if(exists $fields{"102"}) { # Check that we have a status field (code 102)
my @statusButtons ;
my $name = $ { $fields{"102"}}[0] ;
if(exists $jobspec{"Values-$name"}) { # Check that we have the values
my @values = split('/',$jobspec{"Values-$name"}) ;
my $v ;
foreach $v (@values) {
push @statusButtons,&P4CGI::buttonLink("jobList.cgi",
"List jobs with $name $v",
"FLD102=$v",
"LIST=Y",
"<b>$v</b>") ;
}
}
push @fieldPrompt,"List all jobs with status" ;
push @field, join(" ",@statusButtons) ;
}
push @fieldPrompt,"File spec" ;
push @field, &P4CGI::cgi()->textfield(-name => "FSPC",
-default => $FSPC ,
-override => 1,
-size => 60,
-maxlength => 256) ;
my $code ; ## Loop over all fields (sorted by id)
foreach $code (sort keys %fields)
{
my ($name,$type,$len,$option) = @{$fields{$code}} ;
# Handle "Select" type field
if($type eq "select") {
my @set = split("/",$jobspec{"Values-$name"}) ;
my $size = scalar @set ;
if($size > 5) { $size = 5 } ;
push @field, &P4CGI::cgi()->scrolling_list(-name => "FLD".$code,
-values => \@set,
-size => $size,
-multiple => 'true') ;
push @fieldPrompt,"$name is one of" ;
next ;
}
# Date type field
if($type eq "date") {
my %values = (
1 => " One Day old",
2 => " Two Days old",
3 => "Three Days old",
4 => " Four Days old",
5 => " Five Days old",
6 => " Six Days old",
7 => " One Week old",
7*2 => " Two Weeks old",
7*2 => "Three Weeks old",
7*4 => " Four Weeks old",
7*5 => " Five Weeks old",
7*6 => " Six Weeks old",
7*7 => "Seven Weeks old",
7*8 => "Eight Weeks old",
7*9 => " Nine Weeks old",
7*10 => " 10 Weeks old",
7*11 => " 11 Weeks old",
7*12 => " 12 Weeks old",
7*16 => " 16 Weeks old",
7*20 => " 20 Weeks old",
7*26 => " 26 Weeks old",
7*40 => " 40 Weeks old",
7*52 => " 52 Weeks old") ;
my @values = sort { $a <=> $b } keys %values ;
push @field, join("\n",
(&P4CGI::cgi()->popup_menu(-name => "FLD".$code."cmp",
-default => 0,
-values => ["-",">",">=","<=","<"] ,
-labels => { "-"=>"- Ignore -",
">"=>"Less than",
">="=>"Less than or exactly",
"<="=>"More than or exactly",
"<"=>"More than" }),
&P4CGI::cgi()->popup_menu(-name => "FLD".$code,
-default => 0,
-values => \@values,
-labels => \%values))
) ;
push @fieldPrompt,"$name is" ;
next ;
}
# Type must be word, line or text. Compute some lengths for
# text field
$len = 256 if $len == 0 ;
my $displen = $len ;
$displen = 40 if $displen > 40 ;
my $textfield = &P4CGI::cgi()->textfield(-name => "FLD".$code,
-size => $displen,
-maxlength => $len) ;
# Field type word
if($type eq "word") {
if($code == 101) {
# Reserved field Job
push @fieldPrompt,"Job name is" ;
push @field, $textfield ;
next ;
}
else {
if($code == 103) {
# Rserved field User
push @fieldPrompt,"User is one of" ;
push @field, &P4CGI::cgi()->scrolling_list(-name => "FLD$code",
-values => \@listOfUsers,
-size => $ulistSize,
-multiple => 'true',
-labels => \%userCvt) ;
next ;
}
push @fieldPrompt,"$name is" ;
push @field, $textfield ;
next ;
}
}
# Field type line or text
if($type eq "line" or $type eq "text") {
push @fieldPrompt,"$name contains<br>one of the words" ;
push @field, $textfield ;
next ;
}
} # end loop over fields
# Add field for match for "any" or "all" fields
push @fieldPrompt,"Select type of match" ;
push @field, &P4CGI::cgi()->popup_menu(-name => "MATCHTYPE",
-default => 0,
-values => ["all","any"] ,
-labels => { "all"=>"Match all fields above",
"any" =>"Match any field above"}) ; #
# Create table contents from fields
my @tmp ;
while(@field > 0) {
my $pr = shift @fieldPrompt ;
my $fld = shift @field ;
push @tmp,("<tr>",
"<td class=\"Prompt\">".$pr.":</td>",
"<td>",
$fld,
"</td></tr>") ;
} ;
push @tmp , &P4CGI::table_row(" ",
{-align=>"left",
-valign=>"bottom",
-text => join(" ",
&P4CGI::cgi()->hidden(-name=>"DP",
-value=>&P4CGI::CURR_DEPOT_NO()),
&P4CGI::cgi()->submit(-name => "LIST",
-value => "Go")
)}) ;
# Return table and form
return
join("\n",
(
&P4CGI::cgi()->startform(-action => "jobList.cgi",
-method => "GET"),
&P4CGI::start_framedTable("Select jobs"),
@tmp,
&P4CGI::end_framedTable(),
&P4CGI::cgi()->endform())) ;
} # end buildSelection()
unless(defined &P4CGI::cgi()->param("LIST"))
{
my $selection = &buildSelection() ;
my @buttons ;
push @buttons,&P4CGI::buttonCell("jobList.cgi",
"List all jobs",
"LIST=Y",
"List all jobs") ;
my $title = "View job list" ;
if($FSPC ne "") {
$title .= "<br>for $FSPC" ;
} ;
print
&P4CGI::start_page("List jobs",@buttons),
$selection ;
}
else {
# Do we have "JOBVIEW"?
my $jobview = &P4CGI::cgi()->param("JOBVIEW") ;
my $jobviewDesc ;
if(defined $jobview) {
$jobviewDesc = "Where jobview is: <TT>$jobview</TT>" ;
}
# If not, build a job view
if(! defined $jobview) {
$jobview = "" ;
$jobviewDesc="" ;
# Get field parameters
my @selectParams = grep { /^FLD/ ; } P4CGI::cgi()->param ;
my %params ;
foreach (@selectParams) {
my $v = $_ ;
s/^FLD// ;
my @pars = &P4CGI::cgi()->param($v) ;
$params{$_} = \@pars ;
}
# Set match all/any
my $MATCHTYPE = &P4CGI::cgi()->param("MATCHTYPE") ;
$MATCHTYPE="all" unless defined $MATCHTYPE ;
my $matchtype = "|" ;
my $matchtypeDesc = "or" ;
if($MATCHTYPE eq "all") {
$matchtype = "" ;
$matchtypeDesc = "and" ;
} ;
# Loop over field parameters
my $id ;
foreach $id (grep {/^\d+$/} keys %params) {
my $desc ;
next unless exists $fields{$id} ;
my ($name,$type,$len,$option) = @{$fields{$id}} ;
my @p = @{ $params{$id}} ;
if($type eq "text" or
$type eq "line") {
my @tmp = map { split ; } @p ;
@p = @tmp ;
} ;
if(@p > 0 and length($p[0]) > 0) {
my $thisItem ;
if($type eq "date") {
my @cmp = @{ $params{"${id}cmp"}} ;
my $cmp = shift @cmp ;
next if $cmp eq "-" ;
my $time = time()-(24*3600*$p[0]) ;
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($time);
$year = 1900+$year ;
$thisItem = sprintf("$name$cmp$year/%02.2d/%02.2d",$mon+1,$mday) ;
$desc .= "$thisItem" ;
}
else {
if(@p == 1) {
$thisItem = "$name=$p[0]" ;
$desc .= "$name is \"$p[0]\"" if $type eq "select" ;
$desc .= "$name contains \"$p[0]\""
if $type =~ /^(word|line|text)/ ;
}
else {
$thisItem = "($name=" . join("|$name=",@p) . ")" ;
$desc .= "$name is" if $type eq "select" ;
$desc .= "$name contains" if $type =~ /^(word|line|text)/ ;
$desc .= " one of" if @p > 2 ;
my $last = pop @p ;
$desc .= " \"". join('","',@p) . "\" or \"$last\"" ;
}
}
if(length($jobview) > 0) {
$jobview .= " $matchtype $thisItem" ;
$jobviewDesc .= "<br><font>$matchtypeDesc</font><br>\n$desc" ;
}
else {
$jobview = "$thisItem" ;
$jobviewDesc = $desc ;
}
}
} ;
} ;
&P4CGI::cgi()->delete("LIST") ;
my @buttons = (&P4CGI::buttonCell("jobList.cgi",
"Make a new selection of jobs",
"New selection")) ;
my $title = "View job list" ;
if($FSPC ne "") {
$title .= "<br>for $FSPC" ;
} ;
if($jobviewDesc) {
$title .= "<br>$jobviewDesc" ;
} ;
print &P4CGI::start_page("",@buttons) ;
&P4CGI::ERRLOG("jobView:\"$jobview\"") ;
my @tmp ;
my $ejobview = "" ;
$ejobview = "-e \"$jobview\"" if length($jobview) > 0 ;
&P4CGI::p4call(\@tmp, "jobs -l $ejobview $FSPC" );
if(@tmp == 0) {
print
"No matching jobs found for: $jobview $FSPC",
&buildSelection() ;
}
else {
print
&P4CGI::start_framedTable("Jobs: $jobview $FSPC"),
&P4CGI::start_table(),
&P4CGI::table_header("Job","","Date","User","Status") ;
while (@tmp > 0) {
my $l = shift @tmp ;
$l =~ /^(\S+) on (\S+) by (\S+) \*(.*)\*/ and do {
my ($job,$date,$user,$status) = ($1,$2,$3,$4) ;
shift @tmp ;
my $desc ;
while(@tmp) {
$_ = shift @tmp ;
s/^\t// or last ;
if($desc) {
$desc .= "\n$_" ;
}
else {
$desc .= "$_" ;
}
}
$job = &P4CGI::ahref("-url" => "jobView.cgi",
"JOB=$job",
"HELP=View job info",
"<tt>$job</tt>") ;
$user = &P4CGI::ahref("-url" => "userView.cgi",
"USER=$user",
"HELP=View user info",
$user) ;
$desc = &P4CGI::formatDescription($desc) ;
print &P4CGI::table_row(undef,
$job,
$date,
$user,
$status) ;
print &P4CGI::table_row({-text=>"",
-style=>"width: 30pt"},
undef,
undef,
undef,
{ -class=>"Description",
-text => $desc }) ;
}
}
print
&P4CGI::end_table(),
&P4CGI::end_framedTable("Jobs: $jobview $FSPC") ;
}
} ;
print &P4CGI::end_page() ;
#
# That's all folks
#
| # | Change | User | Description | Committed | |
|---|---|---|---|---|---|
| #10 | 4998 | Fredric Fredricson |
P4DB: cleaned up some code. Added p4users(), p4client() and p4user2name() to P4CGI.pm and modified all cgi:s to use these, |
||
| #9 | 4973 | Fredric Fredricson |
P4DB: Worked around some IE CSS-bugs. Improved page layout for branch, client and job lists. |
||
| #8 | 4313 | Fredric Fredricson |
P4DB: - Removed some error messages (that clobbers the error log for the web server) - Added a CSS file that works for people with color vision deficiency - Fixed minor bug in the scripts that creates the tarball and zip-file |
||
| #7 | 4306 | Fredric Fredricson |
P4DB: Hardened P4DB against malicious parameters (cross site scripting), performed some cleanup and increased version to 3.1.1. |
||
| #6 | 4300 | Fredric Fredricson |
P4DB. Some cleanup of old html-code |
||
| #5 | 4152 | Fredric Fredricson | P4DB: Some more work on tha way to version 3.1.... | ||
| #4 | 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....... |
||
| #3 | 2875 | Fredric Fredricson | P4DB 3.0 first beta... | ||
| #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. |
||
| #1 | 1638 | Fredric Fredricson | P4DB: Added all (I think) files for P4DB |