App-Gitc
view release on metacpan or search on metacpan
lib/App/Gitc/Its/Eventum.pm view on Meta::CPAN
# ABSTRACT: Support for Eventum ITS (Issue Tracking System)
our $VERSION = '0.60'; # VERSION
use POSIX qw( strftime );
use App::Gitc::Util qw(
project_config
command_name
current_branch
);
use List::MoreUtils qw( any );
sub label_service { return 'Eventum'; }
sub label_issue { return 'Eventum'; }
sub get_issue {
my $self = shift;
my $changeset = shift;
my %params = @_;
my $number = $self->issue_number($changeset) or return undef;
our %eventum_issue;
return $eventum_issue{$number}
if exists $eventum_issue{$number} and not $params{reload};
# to find an Eventum issue, we need a number and URI
my $uri = project_config()->{'eventum_uri'} or return;
# build and return the Issue object
our %eventum;
my $eventum = $eventum{$uri};
if ( not $eventum ) {
require GSG::Eventum;
# TODO GSG::Eventum has not been publicly released
$eventum{$uri} = $eventum = GSG::Eventum->new({
uri => $uri,
});
}
# GSG::Eventum::Issue is lazy, force an action to verify the issue
my $issue = $eventum->issue($number);
$issue = undef if not eval { $issue->summary };
return $eventum_issue{$number} = $issue;
}
sub transition_state {
my $self = shift;
my ($args) = @_;
$args ||= {};
$args->{with_time} = 1 unless exists $args->{with_time};
return "Skipping Eventum changes, as requested by GITC_NO_EVENTUM\n"
if $ENV{GITC_NO_EVENTUM};
return "Skipping Eventum changes as configured for this project\n"
if not project_config()->{'eventum_uri'};
# validate the arguments
my $command = $args->{command} || command_name();
my ($from, $to) = $self->_states( $command, $args->{target} );
my $message = $args->{message} or die "No eventum message";
my $issue = exists $args->{issue} ? $args->{issue} :
$self->get_issue(current_branch(), reload => 1);
return "NOT CHANGING Eventum status: changeset not in Eventum?\n"
if not $issue;
# update the Eventum issue
my $time_format = '%m/%d/%Y';
$time_format .= ' %I:%M %p' if $args->{with_time};
$message = (getpwuid $>)[6] # user's name
. strftime( " $time_format: $message\n", localtime );
my ( $rc, $status_exception );
eval {
return $rc = $issue->close($message) if $to and $to eq 'CLOSE';
$issue->postpone_updates;
$issue->append_internal_comments($message);
$rc = eval { $issue->transition_status($from, $to) } if $to;
$status_exception = $@ if $@;
$issue->update;
$issue->live_updates;
};
die $@ if $@; # rethrow unexpected exceptions
if ( $status_exception ) {
die $status_exception
if $status_exception !~ m/('[^']+' is not a valid status name)/;
return "NOT CHANGING Eventum status: $1\n";
}
elsif ($rc) { # success
return "Changed Eventum status to '$to'\n";
}
else {
return sprintf "NOT CHANGING Eventum status: currently '%s'\n",
$issue->status;
}
}
sub issue_state {
my $self = shift;
my $issue = shift;
return unless $issue;
return $issue->status;
}
sub issue_id {
my $self = shift;
my $issue = shift;
return $issue->number;
}
sub issue_changeset_uri {
my $self = shift;
my $issue = shift;
return unless $issue;
( run in 2.124 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )