diff options
-rw-r--r-- | extensions/PhabBugz/lib/Util.pm | 10 | ||||
-rw-r--r-- | extensions/PhabBugz/lib/WebService.pm | 5 | ||||
-rw-r--r-- | extensions/Push/lib/Connector/Phabricator.pm | 52 |
3 files changed, 54 insertions, 13 deletions
diff --git a/extensions/PhabBugz/lib/Util.pm b/extensions/PhabBugz/lib/Util.pm index cc26f4d89..cbbca7eab 100644 --- a/extensions/PhabBugz/lib/Util.pm +++ b/extensions/PhabBugz/lib/Util.pm @@ -27,20 +27,20 @@ our @EXPORT = qw( get_bug_role_phids get_members_by_bmo_id get_project_phid - get_revision_by_id + get_revisions_by_ids intersect make_revision_public request set_project_members ); -sub get_revision_by_id { - my $id = shift; +sub get_revisions_by_ids { + my ($ids) = @_; my $data = { queryKey => 'all', constraints => { - ids => [ int($id) ] + ids => $ids } }; @@ -49,7 +49,7 @@ sub get_revision_by_id { ThrowUserError('invalid_phabricator_revision_id') unless (exists $result->{result}{data} && @{ $result->{result}{data} }); - return $result->{result}{data}[0]; + return @{$result->{result}{data}}; } sub create_revision_attachment { diff --git a/extensions/PhabBugz/lib/WebService.pm b/extensions/PhabBugz/lib/WebService.pm index 0e2574582..a8312dc8e 100644 --- a/extensions/PhabBugz/lib/WebService.pm +++ b/extensions/PhabBugz/lib/WebService.pm @@ -27,7 +27,7 @@ use Bugzilla::Extension::PhabBugz::Util qw( edit_revision_policy get_bug_role_phids get_project_phid - get_revision_by_id + get_revisions_by_ids intersect make_revision_public request @@ -50,7 +50,8 @@ sub revision { # Obtain more information about the revision from Phabricator my $revision_id = $params->{revision}; - my $revision = get_revision_by_id($revision_id); + my $revisions = get_revisions_by_ids([$revision_id]); + my $revision = $revisions->[0]; my $revision_phid = $revision->{phid}; my $revision_title = $revision->{fields}{title} || 'Unknown Description'; diff --git a/extensions/Push/lib/Connector/Phabricator.pm b/extensions/Push/lib/Connector/Phabricator.pm index 5c9cabe8b..be0ea9b58 100644 --- a/extensions/Push/lib/Connector/Phabricator.pm +++ b/extensions/Push/lib/Connector/Phabricator.pm @@ -1,9 +1,9 @@ # This Source Code Form is subject to the terms of the Mozilla Public -# # License, v. 2.0. If a copy of the MPL was not distributed with this -# # file, You can obtain one at http://mozilla.org/MPL/2.0/. -# # -# # This Source Code Form is "Incompatible With Secondary Licenses", as -# # defined by the Mozilla Public License, v. 2.0. +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +# This Source Code Form is "Incompatible With Secondary Licenses", as +# defined by the Mozilla Public License, v. 2.0. package Bugzilla::Extension::Push::Connector::Phabricator; @@ -15,11 +15,14 @@ use base 'Bugzilla::Extension::Push::Connector::Base'; use Bugzilla::Bug; use Bugzilla::Constants; +use Bugzilla::Extension::PhabBugz::Util qw(intersect make_revision_public get_revisions_by_ids); use Bugzilla::Extension::Push::Constants; use Bugzilla::Extension::Push::Util; use Bugzilla::User; +use List::Util qw(any); use constant PHAB_CONTENT_TYPE => 'text/x-phabricator-request'; +use constant PHAB_ATTACHMENT_PATTERN => qr/^phabricator-D(\d+)/; sub options { return ( @@ -47,9 +50,46 @@ sub should_send { } sub send { + my ( $self, $message ) = @_; + my $logger = Bugzilla->push_ext->logger; - $logger->info('AUDIT'); + my $data = $message->payload_decoded; + my $bug_data = $self->_get_bug_data($data) || return 0; + my $bug = Bugzilla::Bug->new( { id => $bug_data->{id}, cache => 1 } ); + + if(!is_public($bug)) { + $logger->info('Bailing on send because the bug is not public'); + return PUSH_RESULT_OK; + } + + my @attachments = grep { + $_->isobsolete == 0 && + $_->contenttype eq PHAB_CONTENT_TYPE && + $_->attacher->login eq 'phab-bot@bmo.tld' + } @{ $bug->attachments() }; + + if(@attachments){ + my @rev_ids; + foreach my $attachment (@attachments) { + my ($rev_id) = ($attachment->filename =~ PHAB_ATTACHMENT_PATTERN); + next if !$rev_id; + push(@rev_ids, int($rev_id)); + } + + if(@rev_ids) { + $logger->info('Getting info for revisions: '); + $logger->info(@rev_ids); + + my @rev_details = get_revisions_by_ids(\@rev_ids); + foreach my $rev_detail (@rev_details) { + my $rev_phid = $rev_detail->{phid}; + $logger->info('Making revision $rev_phid public:'); + $logger->info($rev_phid); + make_revision_public($rev_phid); + } + } + } return PUSH_RESULT_OK; } |