#!perl -w # Copyright (C) 1997 Capella Computers Ltd. # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # :FILE: # List all jobs (with optional filtering by status or user). use strict; use English; use P4; # Mask of status and users to print. my %status_mask; my %user_mask; # Set mask for status. sub set_status { my $status = shift; # Status to set ('Status' for all). my $to = shift; # What to set it to. if ($status =~ /^n|new/i) { $status_mask{new} = $to; } elsif ($status =~ /^w|work/i) { $status_mask{work} = $to; } elsif ($status =~ /^r|review/i) { $status_mask{review} = $to; } elsif ($status =~ /^i|integ/i) { $status_mask{integ} = $to; } elsif ($status =~ /^f|fail/i) { $status_mask{fail} = $to; } elsif ($status =~ /^p|pass/i) { $status_mask{pass} = $to; } elsif ($status =~ /^c|clear/i) { $status_mask{clear} = $to; } elsif ($status =~ /^d|done/i) { $status_mask{done} = $to; } elsif ($status eq '_') { $status_mask{'_new'} = $to; $status_mask{'_work'} = $to; $status_mask{'_review'} = $to; $status_mask{'_integ'} = $to; $status_mask{'_fail'} = $to; $status_mask{'_pass'} = $to; $status_mask{'_clear'} = $to; $status_mask{'_done'} = $to; } elsif ($status =~ /^s|status/i) { $status_mask{new} = $to; $status_mask{work} = $to; $status_mask{review} = $to; $status_mask{integ} = $to; $status_mask{fail} = $to; $status_mask{pass} = $to; $status_mask{clear} = $to; $status_mask{done} = $to; $status_mask{'_new'} = $to; $status_mask{'_work'} = $to; $status_mask{'_review'} = $to; $status_mask{'_integ'} = $to; $status_mask{'_fail'} = $to; $status_mask{'_pass'} = $to; $status_mask{'_clear'} = $to; $status_mask{'_done'} = $to; } else { P4::crash("Specified status should be one of: Status (all), ", "_ (All), New, Work, Review, Fail, Pass, Integ, Clear or Done."); } # Be nice. return 1; } # Set mask for a user. sub set_user { my $user = shift; # User to set it to ('User' for all). my $to = shift; # What to set it to. if ($user =~ /u|user/i) { %user_mask = ( 'default' => $to ); } elsif ($user =~ /m|me/i) { $user_mask{P4::current_user()} = $to; } else { $user_mask{$user} = $to; } # Be nice. return 1; } # By default, print all. set_status('Status', 1); set_user('User', 1); # These are used to reverse the default if first option is with a '+'. my $first_status = 1; my $first_user = 1; # Command line argument specify which status jobs to print. my $opt; while ($opt = shift(@ARGV)) { # +u turns on a specific user. if ($opt eq '+u' || $opt eq '+U') { # If the first user-related command is +u, # no user will be printed by default. if ($first_user) { set_user('User', 0); $first_user = 0; } $opt = shift(@ARGV); defined($opt) || P4::crash("+u flag requires an argument."); set_user($opt, 1); # -u turns off a specific user. } elsif ($opt eq '-u' || $opt eq '-U') { $opt = shift(@ARGV); defined($opt) || P4::crash("+u flag requires an argument."); set_user($opt, 0); # -X turns off a specific status. } elsif ($opt =~ /^-(.*)/) { set_status($1, 0); # +X turns on a specific status. } elsif($opt =~ /^\+(.*)/) { # If the first status related command -s +X, # no status will be printed by default. if ($first_status) { set_status('Status', 0); $first_user = 0; } set_status($1, 1); } else { # Whoever can understand this usage probably doesn't need it :-) P4::crash("Usage: p4jl ", "[{ {+/-}{Status|New|Work|Review|Fail|Pass|Integ|Clear} | ", "{+/-}u {User|Me|} } ...]"); } } # No need to lock since this is a harmless read-only operation. # Obtain full list of jobs. my %jobs = P4::jobs(); # Print column titles. print "Job\tCreated Re\tUser\tReview\tStatus\tTitle\n"; print "---\t---------- --\t----\t------\t------\t-----\n"; # Print all jobs, sorted by reversed ID (more recent first). my $job; foreach $job (reverse(sort(keys(%jobs)))) { # Parse record. my $record = $jobs{$job}; my $user = $record->{user}; my $created = $record->{created}; my $status = $record->{status}; my $retry = $record->{retry}; my $reviewer = $record->{reviewer}; my $version = $record->{version}; my $title = $record->{title}; # Filter out undesired jobs. next if !$status_mask{$status}; if (defined($user_mask{$user})) { next if !$user_mask{$user}; } else { next if !$user_mask{default}; } # This saves a column. if ($status eq 'done') { $status = $version; } # Print it nicely. print $job, "\t"; print $created, ' '; print $retry, "\t"; print $user, "\t"; print $reviewer, "\t"; print $status, "\t"; print $title, "\n"; } # Be nice. 1;