App-Gitc
view release on metacpan or search on metacpan
lib/App/Gitc/Its/Jira.pm view on Meta::CPAN
die "Unable to connect to JIRA SOAP API" unless $jira;
}
return $jira;
}
sub get_jira_rest_object {
my $self = shift;
# to find an JIRA issue, we need a number and URI
my $uri = project_config()->{'jira_uri'} or return;
# build and return the Issue object
our %jira_rest;
my $jira = $jira_rest{$uri};
if ( not $jira ) {
my ($jira_user, $jira_password) = $self->lookup_jira_user;
$jira_rest{$uri} = $jira = JIRA::Client::REST->new(
username => $jira_user,
password => $jira_password,
url => $uri,
);
die "Unable to connect to JIRA REST API" unless $jira;
}
return $jira;
}
sub get_issue {
my $self = shift;
my $changeset = shift;
my %params = @_;
my $number = $self->issue_number($changeset) or return undef;
our %jira_issue;
return $jira_issue{$number}
if exists $jira_issue{$number} and not $params{reload};
my $issue = eval {
my $jira = $self->get_jira_object or return;
my $issue = $jira->getIssue($number);
die "Issue $number didn't return an object" unless $issue;
return $jira_issue{$number} = $issue;
};
warn "Error accessing JIRA: $@" if $@;
return $issue;
}
sub transition_state {
my $self = shift;
my ($args) = @_;
$args ||= {};
$args->{with_time} = 1 unless exists $args->{with_time};
return "Skipping JIRA changes, as requested by GITC_NO_EVENTUM\n"
if $ENV{GITC_NO_EVENTUM};
return "Skipping JIRA changes as configured for this project\n"
if not project_config()->{'jira_uri'};
my $label = $self->label_issue;
# validate the arguments
my $command = $args->{command} || command_name();
my $state = $self->_states( $command, $args->{target} );
my $from = $state->{from};
my $to = $state->{to};
my $flag = $state->{flag};
my $message = $args->{message} or die "No message";
my $reviewer = $args->{reviewer};
my $issue = exists $args->{issue} ? $args->{issue} :
$self->get_issue(current_branch(), reload => 1);
return "NOT CHANGING JIRA $label: changeset not in JIRA?\n"
if not $issue;
my ($jira_user) = $self->lookup_jira_user;
$message = (getpwuid $>)[6] # user's name
. ": $message\n";
$message = $flag." ".$message if $flag;
my ( $rc, $status_exception );
eval {
my $jira = $self->get_jira_object or return;
$jira->addComment( $issue, $message );
my $updated_issue = $jira->progress_workflow_action_safely( $issue, $to );
my $jira_rest = $self->get_jira_rest_object or return;
$jira_rest->unwatch_issue( $issue->{id}, $jira_user )
if $jira_user eq $default_jira_user;
$rc = ( $issue->{id} == $updated_issue->{id} );
};
die $@ if $@; # rethrow unexpected exceptions
if ($reviewer) {
eval {
my $jira = $self->get_jira_object or return;
$jira->update_issue( $issue,
{ custom_fields => { customfield_10401 => $reviewer, } } );
};
warn "Unable to set reviewer: $@" if $@;
}
if ( $status_exception ) {
die $status_exception
if $status_exception !~ m/('[^']+' is not a valid status name)/;
return "NOT CHANGING JIRA $label: $1\n";
}
elsif ($rc) { # success
return "Changed JIRA $label to '$to'\n";
}
else {
return sprintf "NOT CHANGING JIRA $label: currently '%s'\n",
$self->issue_state($issue);
}
}
sub issue_state {
my $self = shift;
my $issue = shift;
return unless $issue;
my $status_lookup = $self->lookup_status_strings;
( run in 2.664 seconds using v1.01-cache-2.11-cpan-5837b0d9d2c )