- #!c:/perl/bin/perl -w
- ##############################################################################
- # p4rmlabels - Delete labels older than a give number of days that match a
- # given pattern. A optional preview mode is available to see
- # what labels would be deleted.
- #
- # Logic:
- #
- # 1. Get the list of labels
- # 2. Determine old labels that match the given pattern
- # 3. Delete old labels (preview only if specified)
- #
- ##############################################################################
- # Notes:
- #
- # - This uses the Date::Calc module. Please install prior to running this
- # script.
- ##############################################################################
- # Version Date Author Description
- # ------- ---------- ------------------ -----------------------------------
- #
- # 1.0 2003.03.25 ssmythe@docent.com Initial Version
- #
- ##############################################################################
- use Getopt::Std;
- use File::Path;
- use File::Basename;
- use Date::Calc qw(Delta_Days);
- ##############################################################################
- # Init
- ##############################################################################
- sub Init {
- # Function locals
- my $req_opt="";
- # Initialize globals
- our $scriptVersion="1.0";
- our $scriptName=basename($0);
- our $scriptAuthorName="Steve Smythe";
- our $scriptAuthorEmail="ssmythe\@docent.com";
- our $scriptAuthorExt="x9546";
- our %opts=();
- our $p4="p4";
- our $daysToExpire="";
- our $labelPattern="";
- our $nSwitch=0;
- our %labels=();
- our %oldLabels=();
- our $numOldLabels=0;
- our $currentYear="";
- our $currentMonth="";
- our $currentDay="";
- our $currentDate="";
- # Parse command line switches
- getopts("d:hl:nv", \%opts);
- # Display script version if need be
- if (exists($opts{"v"})) {
- Version();
- exit 0;
- }
- # Display script usage if need be
- if (exists($opts{"h"})) {
- Usage();
- exit 0;
- }
- # Check for required switches
- %req_opts=(d=>' ', l=>' ');
- foreach $req_opt (sort keys %req_opts) {
- if (!(exists($opts{$req_opt}))) {
- print "Error: $scriptName: missing required \"-$req_opt\" switch.\n";
- Usage();
- exit 0;
- }
- }
- # assign required switches to globals
- $daysToExpire=$opts{"d"};
- $labelPattern=$opts{"l"};
- # check optional switches
- if (exists($opts{"n"})) {
- $nSwitch=1;
- }
- # get datestamp
- my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime();
- $currentYear=$year + 1900;
- $currentMonth=$mon + 1;
- $currentDay=$mday;
- $currentDate=sprintf("%04d/%02d/%02d", $currentYear, $currentMonth, $currentDay);
- }
- ##############################################################################
- # Usage
- ##############################################################################
- sub Usage {
- print <<EOF;
- Usage: $scriptName [-h] [-v] -d {days} -l \"{labelpattern}\" [-n]
- -h Displays help
- -v Displays version
- -d Delete labels greater than or equal to this number of days
- -l Label pattern in Perl regexp (must be quoted)
- -n Preview labels to be deleted (optional)
- EOF
- }
- ##############################################################################
- # Version
- ##############################################################################
- sub Version {
- print <<EOF;
- $scriptName (v$scriptVersion)
- by $scriptAuthorName ($scriptAuthorEmail, $scriptAuthorExt)
- EOF
- }
- ##############################################################################
- # GetLabels
- ##############################################################################
- sub GetLabels {
- my $cmd="";
- my @F=();
- my $labelName="";
- my $labelDate="";
- $cmd="$p4 labels";
- open(CMD, "$cmd |") || die "can't open command \"$cmd\" for piped output: $!";
- while(<CMD>) {
- chomp;
- @F=split;
- $labelName=$F[1];
- $labelDate=$F[2];
- $labels{$labelName}=$labelDate;
- }
- close(CMD) || die "can't close command \"$cmd\" for piped output: $!";
- }
- ##############################################################################
- # DetermineOldLabels
- ##############################################################################
- sub DetermineOldLabels {
- my $label="";
- my $labelYear="";
- my $labelMonth="";
- my $labelDay="";
- my $deltaDays="";
- foreach $label (sort keys %labels) {
- if ($label =~ /$labelPattern/) {
- ($labelYear,$labelMonth,$labelDay)=split(/\//, $labels{$label});
- $deltaDays=Delta_Days($labelYear,$labelMonth,$labelDay,$currentYear,$currentMonth,$currentDay);
- if ($deltaDays >= $daysToExpire) {
- $oldLabels{$label}="";
- $numOldLabels++;
- }
- }
- }
- }
- ##############################################################################
- # DeleteOldLabels
- ##############################################################################
- sub DeleteOldLabels {
- my $label="";
- my $cmd="";
- if ($numOldLabels > 0) {
- foreach $label (sort keys %oldLabels) {
- if ($nSwitch == 0) {
- $cmd="$p4 label -d -f $label";
- open(CMD, "$cmd 2>&1 |") || die "can't open command \"$cmd\" for piped output: $!";
- while(<CMD>) {
- chomp;
- print "$_\n";
- }
- close(CMD) || die "can't close command \"$cmd\" for piped output: $!";
- } else {
- print "preview: Label $label deleted.\n";
- }
- }
- } else {
- print "No old labels to delete.\n";
- }
- }
- ##############################################################################
- # Process
- ##############################################################################
- sub Process {
- GetLabels();
- DetermineOldLabels();
- DeleteOldLabels();
- }
- ##############################################################################
- # MAIN MAIN MAIN MAIN MAIN MAIN MAIN MAIN MAIN MAIN MAIN MAIN MAIN MAIN MAIN #
- ##############################################################################
- Init();
- Process();
# | Change | User | Description | Committed | |
---|---|---|---|---|---|
#1 | 2991 | Steve Smythe | p4rmlabels - Delete labels older than a give number of days that match a given pattern.&n...bsp; A optional preview mode is available to see what labels would be deleted. « |
22 years ago |