jobList.cgi #7

  • //
  • guest/
  • fredric_fredricson/
  • P4DB/
  • main/
  • jobList.cgi
  • View
  • Commits
  • Open Download .zip Download (12 KB)
#!/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 @users ;
    &P4CGI::p4call(\@users, "users" );
    my @listOfUsers = sort { uc($a) cmp uc ($b) } map { /^(\S+).*> \((.+)\) .*$/ ; $1 ; } @users ;
    my %userCvt =  map { /^(\S+).*> \((.+)\) .*$/ ; ($1,$2) ; } @users ;
    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 = "-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($job,
					$date,
					$user,
					$status) ;
		print &P4CGI::table_row("",
					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