App-SD
view release on metacpan or search on metacpan
lib/App/SD/Replica/gcode/PullEncoder.pm view on Meta::CPAN
package App::SD::Replica::gcode::PullEncoder;
use Any::Moose;
extends 'App::SD::ForeignReplica::PullEncoder';
use Params::Validate qw(:all);
use Memoize;
use DateTime;
has sync_source => (
isa => 'App::SD::Replica::gcode',
is => 'rw',
);
my %PROP_MAP = %App::SD::Replica::gcode::PROP_MAP;
sub ticket_id {
my $self = shift;
return shift->id;
}
sub _translate_final_ticket_state {
my $self = shift;
my $ticket = shift;
my @labels = @{$ticket->labels};
my %prop;
my @tags;
for my $label (@labels) {
if ( $label =~ /(.*?)-(.*)/ ) {
$prop{lc $1} = $2;
}
else {
push @tags, $label;
}
}
my $ticket_data = {
$self->sync_source->uuid . '-id' => $ticket->id,
owner => $ticket->owner,
created => $ticket->reported->ymd . ' ' . $ticket->reported->hms,
reporter => $ticket->reporter,
status => $self->translate_prop_status( $ticket->status ),
summary => $ticket->summary,
description => $ticket->description,
tags => (join ', ', @tags),
cc => $ticket->cc,
};
for my $p ( keys %prop ) {
$ticket_data->{$p} = $prop{$p};
}
# delete undefined and empty fields
delete $ticket_data->{$_}
for grep { !defined $ticket_data->{$_} || $ticket_data->{$_} eq '' || $ticket_data->{$_} eq '----' }
keys %$ticket_data;
return $ticket_data;
}
=head2 find_matching_tickets QUERY
Returns a array of all tickets found matching your QUERY hash.
=cut
sub find_matching_tickets {
my $self = shift;
my %args = (@_);
my $query = $args{query};
my %query;
if ($query) {
if ( $query =~ /=/ ) {
%query = map { /(.+)=(.*)/; $1 => $2 }
split /&/, $query;
}
else {
$query{q} = $query;
}
}
my $last_changeset_seen_dt = $self->_only_pull_tickets_modified_after()
|| DateTime->from_epoch( epoch => 0 );
$self->sync_source->log("Searching for tickets. This can take a very long time on initial sync or if you haven't synced in a long time.");
require Net::Google::Code;
if ( $Net::Google::Code::VERSION lt '0.15' ) {
die
"query support is only for Net::Google::Code version not less than 0.15"
if $args{query};
require Net::Google::Code::Issue::Search;
my $search =
Net::Google::Code::Issue::Search->new(
project => $self->sync_source->project, );
if ( $search->updated_after($last_changeset_seen_dt) ) {
return $search->results;
}
else {
return [];
}
}
else {
my $issue = Net::Google::Code::Issue->new(
map { $_ => $self->sync_source->gcode->$_ }
grep { $self->sync_source->gcode->$_ }
qw/project email password/ );
if ( keys %query == 0 ) {
# we can use old updated_after method here if no query strings
# loading issue by checking feeds update is more effective, if
# possible
local $Net::Google::Code::Issue::USE_HYBRID = 0;
require Net::Google::Code::Issue::Search;
my $search =
Net::Google::Code::Issue::Search->new(
project => $self->sync_source->project, );
# 0 here is to not fallback to ->search method
if ( $search->updated_after( $last_changeset_seen_dt, 0 ) ) {
return $search->results;
}
}
$query{can} ||= 'all';
$query{max_results} ||= 1_000_000_000;
delete $query{q} unless defined $query{q};
my $results = $issue->list( %query,
updated_min => $query{updated_min}
&& $query{updated_min} gt "$last_changeset_seen_dt"
? $query{updated_min}
: "$last_changeset_seen_dt" );
$_->load for @$results;
return $results;
}
}
sub _only_pull_tickets_modified_after {
my $self = shift;
my $last_pull = $self->sync_source->upstream_last_modified_date();
( run in 0.531 second using v1.01-cache-2.11-cpan-39bf76dae61 )