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 )