summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--extensions/PhabBugz/lib/Util.pm10
-rw-r--r--extensions/PhabBugz/lib/WebService.pm5
-rw-r--r--extensions/Push/lib/Connector/Phabricator.pm52
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;
}