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 )