App-SD
view release on metacpan or search on metacpan
lib/App/SD/Replica/gcode/PullEncoder.pm view on Meta::CPAN
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();
return unless $last_pull;
my $before = App::SD::Util::string_to_datetime($last_pull);
$self->log_debug( "Failed to parse '" . $self->sync_source->upstream_last_modified_date() . "' as a timestamp. That means we have to sync ALL history") unless ($before);
return $before;
}
sub translate_ticket_state {
my $self = shift;
my $ticket = shift;
my $transactions = shift;
my $final_state = $self->_translate_final_ticket_state($ticket);
my %earlier_state = %{$final_state};
my $pre_txn;
for my $txn ( sort { $b->{'serial'} <=> $a->{'serial'} } @$transactions ) {
$txn->{post_state} = {%earlier_state};
if ( $txn->{serial} == 0 ) {
$txn->{pre_state} = {};
last;
}
my $updates = $txn->{object}->updates;
for my $prop (qw(owner status summary)) {
next unless exists $updates->{$prop};
my $value = delete $updates->{$prop};
$value = '' if ($value eq '----');
if ( my $sub = $self->can( 'translate_prop_' . $prop ) ) {
$value = $sub->( $self, $value );
}
$earlier_state{ $PROP_MAP{$prop} } =
$self->warp_list_to_old_value( $earlier_state{ $PROP_MAP{$prop} },
$value, undef );
$txn->{post_state}{ $PROP_MAP{$prop} } = $value;
}
if ( $updates->{cc} ) {
my $value = delete $updates->{cc};
my $is_delete;
my @cc = split /\s+/, $value;
for my $value (@cc) {
if ( $value =~ /^-(.*)$/ ) {
$is_delete = 1;
$value = $1;
}
( run in 0.931 second using v1.01-cache-2.11-cpan-39bf76dae61 )