App-Gitc
view release on metacpan or search on metacpan
lib/App/Gitc/Its/RT.pm view on Meta::CPAN
package App::Gitc::Its::RT;
use strict;
use warnings;
# ABSTRACT: Support for RT ITS (Issue Tracking System)
our $VERSION = '0.60'; # VERSION
use App::Gitc::Util qw( project_config );
sub label_service { 'RT' }
sub label_issue { 'RT' }
sub issue_number { shift->{ changeset } }
sub its_for_changeset {
my ( $class, $changeset ) = @_;
my $project_config = project_config();
# Removes non-digits.
$changeset =~ tr/0-9//cd;
my $self = {
rt_url => $project_config->{ rt_url },
rt_user => $project_config->{ rt_user },
rt_password => $project_config->{ rt_password },
changeset => $changeset,
};
bless $self, $class;
return $self;
}
sub run_rt {
my ( $self, @params ) = @_;
open my $fh, '-|', '/usr/bin/rt', @params;
chomp( my @output = <$fh> );
close $fh;
if ( $? >> 8 ) {
die "/usr/bin/rt " . join( q{ }, @params ) . " failed.\n";
}
return join qq{\n}, @output;
}
sub transition_state {
my ( $self, $params ) = @_;
my $command = $params->{ command };
my $config = project_config();
my $command_config = $config->{ rt_statuses }->{ $command };
if ( $params->{ command } eq 'promote' ) {
$command_config = $command_config->{ $params->{ target } };
}
die "Invalid command for RT: $command.\n" if !$command_config;
my $qr = qr/$command_config->{ from }/;
my $current_status = $self->issue_state();
if ( $current_status !~ $qr ) {
warn "Ticket is currently in status $current_status. Not changing.\n";
}
$self->run_rt(
'comment', $self->{ changeset },
'-m', $params->{ message }
);
$self->run_rt(
qw( edit -t ticket ), $self->{ changeset },
'set', "status=$command_config->{ to }",
);
}
( run in 2.119 seconds using v1.01-cache-2.11-cpan-99c4e6809bf )