#!/usr/local/bin/perl5 # -*- perl -*- use P4CGI ; use strict ; # ##################################################################### ## ## CONFIGURATION INFORMATION ## All config info should be in $configFile (see init() in P4CGI.pm) ## ##################################################################### ## ## CHange Browser ## ##################################################################### # Set back references my $homepage="index.cgi"; my $backtohome="Back to Home" ; # Various vars my $fspec ; my $pending ; my $status = "" ; my $type = "" ; my $user = ""; # Get file spec argument my $filespec = P4CGI::cgi()->param("FSPC") ; $filespec = "//..." unless defined $filespec ; # Get label argument my $label = P4CGI::cgi()->param("LABEL") ; if(defined $label and $label eq "-") { $label = undef ; } ; # Get spec of files to exclude from list of changes my $exfiles = P4CGI::cgi()->param("EXFSPC") ; if(defined $exfiles and $exfiles eq "-") { $exfiles = undef ; } ; # Get label to exclude my $exlabel = P4CGI::cgi()->param("EXLABEL") ; if(defined $exlabel and $exlabel eq "-") { $exlabel = undef ; } ; # Get status $status = P4CGI::cgi()->param("STATUS") ; unless(defined $status) { $status = "submitted" ; } ; # Get branch status and name my $branch = P4CGI::cgi()->param("BRANCH") ; if(defined $branch) { $fspec = P4CGI::cgi()->param("BR") ; $type = " branch" ; } # Get user my $ta ; # (throwaway) $user = P4CGI::cgi()->param("USER") ; ($user,$ta) = split / /,$user ; # Set title my $title = "Change History" ; # Get max changes to show my $maxchanges = P4CGI::cgi()->param("MAXCH") ; my $changeoffset ; my $choffstr="" ; if(defined $maxchanges && $maxchanges =~ /^\d+$/) { # Get offset of first change $changeoffset = P4CGI::cgi()->param("CHOFFSET") ; if(defined $changeoffset) { $choffstr="\@$changeoffset" ; $changeoffset = P4CGI::cgi()->param("CHOFFSETDISP") ; } else { $changeoffset = 0 ; } $maxchanges = "-m $maxchanges" ; } else { $maxchanges = "" ; } if(defined $label) { $choffstr="" ; if($filespec eq "//...") { $filespec .= "\@$label" ; } else { $filespec =~ s/ /@$label / ; $filespec .= "\@$label" ; } } # Get list of files in changes to exclude my @exclude; if(defined $exlabel) { if(defined $exfiles) { $exfiles .= "\@$exlabel" ; } else { $exfiles = "//...\@$exlabel" ; } } local *P4 ; if(defined $exfiles) { &P4CGI::p4call(*P4,"changes \"$exfiles\"") ; while(<P4>) { /^Change (\d+)/ ; push @exclude,$1 ; } close P4 ; push @exclude,0 ; } # Save an unquoted copy of the filename $fspec = $filespec unless defined $fspec ; # Make filename quoted, for passing purposes $filespec = "\"$filespec\"" ; # Set title for pending chgs if($status eq "pending") { $title = "Pending Changes" ; $filespec = "" ; } ; # Get the changes &P4CGI::p4call(*P4,"changes -l $maxchanges -s $status $filespec$choffstr") ; # Set excluded files my $nextToExclude = shift @exclude ; if(!defined $nextToExclude) { $nextToExclude = 0 ; } ; # Get users, for form my @allusers ; my @p4users ; &P4CGI::p4call(\@allusers, "users" ); while ( @allusers > 0 ) { my $usertemp = shift @allusers ; $usertemp =~ /(.*) <.* (\(.*\)) .*$/ ; my $username = "$1" . " " . "$2" ; push( @p4users, "$username" ) ; } # Print title and legend print "", &P4CGI::start_page($title, &P4CGI::ul_list("<b>Change Number:</b> to see details of change"), $homepage,$backtohome) ; # Print specify-a-user-for-{pending-changes/branch-changes}-form if ( $status eq "pending" ) { print "", &P4CGI::cgi()->startform(-action => &P4CGI::CHB_URL(), -method => "GET"), &P4CGI::cgi()->hidden("-name","FSPC", "-value","//..."), &P4CGI::cgi()->hidden("-name","STATUS", "-value","pending"), "<b><i>View pending changes only for: </i></b>", &P4CGI::cgi()->popup_menu(-name => "USER", -value => \@p4users), &P4CGI::cgi()->submit(-name => "Go", -value => "Go"), &P4CGI::cgi()->endform() ; print "<hr>" ; } elsif ( defined $branch ) { print "", &P4CGI::cgi()->startform(-action => &P4CGI::CHB_URL(), -method => "GET"), &P4CGI::cgi()->hidden("-name","FSPC", "-value","$branch"), &P4CGI::cgi()->hidden("-name","BRANCH", "-value","YES"), &P4CGI::cgi()->hidden("-name","BR", "-value","$fspec"), "<b><i>View branch changes only for: </i></b>", &P4CGI::cgi()->popup_menu(-name => "USER", -value => \@p4users), &P4CGI::cgi()->submit(-name => "Go", -value => "Go"), &P4CGI::cgi()->endform() ; print "<hr>" ; } elsif ( defined $label ) { print "", &P4CGI::cgi()->startform(-action => &P4CGI::CHB_URL(), -method => "GET"), &P4CGI::cgi()->hidden("-name","LABEL", "-value","$label"), "<b><i>View changes on label only for: </i></b>", &P4CGI::cgi()->popup_menu(-name => "USER", -value => \@p4users), &P4CGI::cgi()->submit(-name => "Go", -value => "Go"), &P4CGI::cgi()->endform() ; print "<hr>" ; } # Print page...(ridiculous, but expeditious) my $printed ; if ( $status eq "pending" ) { if ( $user ) { print "<dt>", "<b>Pending changes for:</b> <font color=green>$user</font>" ; $printed = "true" ; } else { print "", "<b>Pending changes for:</b> <font color=green>all users</font>" ; $printed = "true" ; } } else { if ( $user ) { if ( $label ) { print "", "<b>Changes for label $label for:</b> <font color=green>$user</font>" ; $printed = "true" ; } elsif ( $branch ) { print "", "<b>Changes for branch $fspec for:</b> <font color=green>$user</font>" ; $printed = "true" ; } else { print "", "<b>Changes for:</b> <font color=green>$user</font>" ; $printed = "true" ; } } else { if ( !defined $label ) { print "<dt>", "<b>Changes for", "$type:</b> <font color=green>$fspec</font>" ; $printed = "true" ; } } } if( !defined $printed ) { if( defined $label ) { print "<dt>", "<b>Changes for label:</b> <font color=green>$label</font></b>" ; } if(defined $exfiles) { print "<dt>", " (excluding changes also found in <font color=red>$exlabel</font>)" ; } if(defined $maxchanges && $maxchanges =~ /^\d+$/) { if(defined $changeoffset) { print "<dt>", "<b>Changes for", "$type:</b> <font color=green>$fspec</font> (offset:$changeoffset)" ; } } } # For change number and description my ( $change, $misc ) ; # Skip files to exclude my $skipped=0 ; my $skip; print "<dl>" ; my $displayed = 0 ; my $lastch ; while (<P4>) { $_ = &P4CGI::fixSpecChar($_) ; if(/^Change (\d+) (.*)$/) { $skip="no" ; ( $change, $misc ) = ($1,$2) ; $lastch = $change ; if ($change == $nextToExclude) { $nextToExclude = shift @exclude ; $skip="yes" ; $skipped++ ; next ; } $skipped=0 ; if ( $user ) { if ( $misc =~ / by $user/ ) { if( $status eq "pending" ) { $pending="true" ; } print "<dt>", &P4CGI::ahref("-url",P4CGI::CHV_URL(), "CH=$change", "<br>Change $change "), "$misc<dd>\n" ; $displayed++ ; } else { next ; } } else { print "<dt>", &P4CGI::ahref("-url",P4CGI::CHV_URL(), "CH=$change", "<br>Change $change "), "$misc<dd>\n" ; $displayed++ ; } } else { next if $skip eq "yes" ; chop ; next if $_ eq "" ; if ( $user) { if ( $misc =~ / by $user/ ) { if( $status eq "pending" ) { $pending="true" ; } print "", "$_" ; } else { next ; } } else { print "", "$_" ; } } print "", "<br>" ; } close P4; print "</dl>\n" ; # Check for max changes my $mc = P4CGI::cgi()->param("MAXCH") ; if(defined $mc and ($mc == $displayed)) { $lastch-- ; $changeoffset += $mc ; print "", &P4CGI::ahref("-url",P4CGI::CHB_URL(), "FSPC=".P4CGI::cgi()->param("FSPC"), "STATUS=$status", "CHOFFSET=$lastch", "CHOFFSETDISP=$changeoffset", "MAXCH=$mc", "Next $mc changes") ; } # More printing... if( ! $change && $status ne "pending" ) { $displayed = 1 ; print "", "<font color=red>No changes found for file $fspec</font>\n" ; } if ( $user ) { if ( $status eq "pending" ) { if( ! $pending ) { $displayed = 1 ; print "", " <font color=red>None</font>\n" ; } } else { if( $displayed == 0 ) { $displayed = 1 ; print "", " <font color=red>None</font>\n" ; } } } if( $displayed == 0 ) { print "", " <font color=red>None</font>\n" ; } # End the page print "", &P4CGI::end_page();
# | Change | User | Description | Committed | |
---|---|---|---|---|---|
#1 | 271 | Diane Holt |
The Perl files for P4DB. These (almost) match the files in rev 1 of the p4db.tar file -- a few files have some minor cosmetic changes in the code, and chv.cgi has a Legend item added that was missing in the one in the tar-file. These files, at rev 1 (and the files in p4db.tar at rev 1), are suitable for for running the app with release 98.2 of P4. |