First draft of script to set deadline past last correspondence.
This commit is contained in:
parent
b301b2a86e
commit
950d3d374f
1 changed files with 97 additions and 0 deletions
97
scripts/rt-set-deadline-from-last-correspondence.plx
Normal file
97
scripts/rt-set-deadline-from-last-correspondence.plx
Normal file
|
@ -0,0 +1,97 @@
|
|||
#!/usr/bin/perl
|
||||
# Copyright © 2018, Bradley M. Kuhn
|
||||
# License: AGPL-3.0-or-later
|
||||
|
||||
# This script finds the most recent correspondence from the requestor, and
|
||||
# sets the Due date out from that, based on the CLI input using Date::Manip
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
|
||||
use autodie qw(:all);
|
||||
|
||||
use Getopt::Long;
|
||||
use File::Spec;
|
||||
use Date::Manip qw(ParseDate UnixDate);
|
||||
|
||||
my($VERBOSE, $INTERACTIVE, $RT_CMD, $SVN_CMD, $DUE_ADD, $DUE_DATE_FROM, $TICKET);
|
||||
###############################################################################
|
||||
sub FindDateOfMostRecentEmailBy ($@) {
|
||||
my($ticketSpec, @emails) = @_;
|
||||
my $ownSpecialEpoch = '1973-01-01';
|
||||
$ticketSpec =~ s%^\s*ticket\s*/\s*%%;
|
||||
open(my $rtShowFH, "-|", "$RT_CMD", "show", $ticketSpec);
|
||||
my $latestDate = $ownSpecialEpoch;
|
||||
foreach my $email (@emails) {
|
||||
while (my $showLine = <$rtShowFH>) {
|
||||
print STDERR "rt show line for $ticketSpec: $showLine" if ($VERBOSE >= 10);
|
||||
if ($showLine =~ /^.+\s+by\s+$email\s+on\s+(.+)$/) {
|
||||
my($fullDate) = $1;
|
||||
my $curDate = ParseDate($fullDate);
|
||||
die "'rt show' line, \"$showLine\" matches as if it were a comment/correspondence line but has an unprocessable date of \"$fullDate\""
|
||||
unless defined $curDate;
|
||||
$latestDate = $curDate if ($latestDate lt $curDate);
|
||||
}
|
||||
}
|
||||
}
|
||||
close $rtShowFH;
|
||||
die("No correspondence/comment of any kind found for \"" . join(", ", @emails) .
|
||||
"\" in \"$ticketSpec\"")
|
||||
if $latestDate eq $ownSpecialEpoch;
|
||||
return $latestDate;
|
||||
}
|
||||
###############################################################################
|
||||
sub RequestorsForTicket ($) {
|
||||
my($ticketSpec) = @_;
|
||||
$ticketSpec =~ s%^\s*ticket\s*/\s*%%;
|
||||
my @requestors;
|
||||
open(my $rtShowFH, "-|", "$RT_CMD", "show", '-s', $ticketSpec);
|
||||
while (my $showLine = <$rtShowFH>) {
|
||||
print STDERR "rt show line for $ticketSpec: $showLine" if ($VERBOSE >= 10);
|
||||
if ($showLine =~ /^\s*Requestors\s*:\s+(.+)$/) {
|
||||
my $emails = $1;
|
||||
@requestors = split(/\s*,\s*/, $emails);
|
||||
last;
|
||||
}
|
||||
}
|
||||
close $rtShowFH;
|
||||
return @requestors;
|
||||
}
|
||||
###############################################################################
|
||||
|
||||
GetOptions("verbose=i" => \$VERBOSE, "interactive" => \$INTERACTIVE,
|
||||
"rtCommand=s" => \$RT_CMD, "svnCommand=s" => \$SVN_CMD,
|
||||
"dueAdd=s" => \$DUE_ADD, "dueDateFrom" => \$DUE_DATE_FROM,
|
||||
"ticket=i" => \$TICKET);
|
||||
|
||||
$RT_CMD = '/usr/bin/rt' unless defined $RT_CMD;
|
||||
$SVN_CMD = '/usr/bin/svn' unless defined $SVN_CMD;
|
||||
|
||||
$INTERACTIVE = 0 if not defined $INTERACTIVE;
|
||||
|
||||
unless (defined $TICKET) {
|
||||
print STDERR "--ticket <ID> where <ID> is a valid ticket is required\n";
|
||||
exit 1;
|
||||
|
||||
}
|
||||
unless (defined $DUE_ADD) {
|
||||
print STDERR "--dueAdd <STRING> where <STRING> is a valid datetime is required\n";
|
||||
exit 1;
|
||||
}
|
||||
|
||||
my(@requestors) = RequestorsForTicket($TICKET);
|
||||
|
||||
if (@requestors <= 0) {
|
||||
print STDERR "No requestors found for $TICKET, giving up.\n";
|
||||
exit 1;
|
||||
}
|
||||
my $lastDate = FindDateOfMostRecentEmailBy($TICKET, @requestors);
|
||||
my $forwardDate = DateCalc($lastDate, $DUE_ADD);
|
||||
print UnixDate($forwardDate, "%Y-%m-%d %H:%M %z");
|
||||
|
||||
###############################################################################
|
||||
#
|
||||
# Local variables:
|
||||
# compile-command: "perl -c rt-set-deadline-from-last-correspondence.plx"
|
||||
# perl-indent-level: 2
|
||||
# End:
|
Loading…
Reference in a new issue