]> git.ipfire.org Git - thirdparty/bugzilla.git/commitdiff
Bug 1440239 - PhabBugz - Assign a secure-revision
authorPiotr Zalewa <zaloon@gmail.com>
Wed, 28 Feb 2018 22:13:43 +0000 (23:13 +0100)
committerdklawren <dklawren@users.noreply.github.com>
Wed, 28 Feb 2018 22:13:43 +0000 (17:13 -0500)
extensions/PhabBugz/lib/Feed.pm
extensions/PhabBugz/lib/Project.pm
extensions/PhabBugz/lib/Revision.pm
extensions/PhabBugz/lib/Util.pm
extensions/Push/lib/Connector/Phabricator.pm

index c7d6d0a29faece328eda10f8a2b5072bac1fa1b7..3b158d2d6fef55d4436e3bc39b00338e956d7844 100644 (file)
@@ -23,11 +23,11 @@ use Bugzilla::Extension::PhabBugz::Revision;
 use Bugzilla::Extension::PhabBugz::User;
 use Bugzilla::Extension::PhabBugz::Util qw(
     add_security_sync_comments
-    create_private_revision_policy
     create_revision_attachment
     edit_revision_policy
     get_bug_role_phids
     get_phab_bmo_ids
+    get_project_phid
     get_security_sync_groups
     is_attachment_phab_revision
     make_revision_public
@@ -183,6 +183,8 @@ sub process_revision_change {
         $self->logger->debug('Bug is public so setting view/edit public');
         $revision->set_policy('view', 'public');
         $revision->set_policy('edit', 'users');
+        my $secure_project_phid = get_project_phid('secure-revision');
+        $revision->remove_project($secure_project_phid);
     }
     # else bug is private.
     else {
@@ -225,6 +227,9 @@ sub process_revision_change {
                 $revision->set_policy('edit', $new_policy->phid);
             }
 
+            my $secure_project_phid = get_project_phid('secure-revision');
+            $revision->add_project($secure_project_phid);
+
             my $subscribers = get_bug_role_phids($bug);
             $revision->set_subscribers($subscribers);
         }
index 91dc2133d5b3f9d240c51b0cf363fd34c74d7d7d..fd09cbecffa741f93dc342f2d1dd0c2c54c346c3 100644 (file)
@@ -232,6 +232,20 @@ sub update {
         }
     }
 
+    if ($self->{add_projects}) {
+        push(@{ $data->{transactions} }, {
+            type => 'projects.add',
+            value => $self->{add_projects}
+        });
+    }
+
+    if ($self->{remove_projects}) {
+        push(@{ $data->{transactions} }, {
+            type => 'projects.remove',
+            value => $self->{remove_projects}
+        });
+    }
+
     my $result = request( 'project.edit', $data );
 
     return $result;
index a897acf313e8dd8dd2f156bc575363a6a0840a7f..c114de78ce6e17c603635621c1c533ce84bed3bd 100644 (file)
@@ -9,6 +9,7 @@ package Bugzilla::Extension::PhabBugz::Revision;
 
 use 5.10.1;
 use Moo;
+
 use Scalar::Util qw(blessed);
 use Types::Standard -all;
 use Type::Utils;
@@ -249,6 +250,20 @@ sub update {
         }
     }
 
+    if ($self->{add_projects}) {
+        push(@{ $data->{transactions} }, {
+            type => 'projects.add',
+            value => $self->{add_projects}
+        });
+    }
+
+    if ($self->{remove_projects}) {
+        push(@{ $data->{transactions} }, {
+            type => 'projects.remove',
+            value => $self->{remove_projects}
+        });
+    }
+
     my $result = request( 'differential.revision.edit', $data );
 
     return $result;
@@ -390,4 +405,20 @@ sub set_policy {
     $self->{set_policy}->{$name} = $policy;
 }
 
-1;
\ No newline at end of file
+sub add_project {
+    my ( $self, $project ) = @_;
+    $self->{add_projects} ||= [];
+    my $project_phid = blessed $project ? $project->phid : $project;
+    return undef unless $project_phid;
+    push @{ $self->{add_projects} }, $project_phid;
+}
+
+sub remove_project {
+    my ( $self, $project ) = @_;
+    $self->{remove_projects} ||= [];
+    my $project_phid = blessed $project ? $project->phid : $project;
+    return undef unless $project_phid;
+    push @{ $self->{remove_projects} }, $project_phid;
+}
+
+1;
index 838283f97de1c4aea724bbef94133139f441dec1..5658ac9d83052a3d5c0118b8ae1e5cc1aca8ac38 100644 (file)
@@ -273,19 +273,26 @@ sub add_comment_to_revision {
 
 sub get_project_phid {
     my $project = shift;
+    my $memcache = Bugzilla->memcached;
 
-    my $data = {
-        queryKey => 'all',
-        constraints => {
-            name => $project
-        }
-    };
+    # Check memcache
+    my $project_phid = $memcache->get_config({ key => "phab_project_phid_" . $project });
+    if (!$project_phid) {
+        my $data = {
+            queryKey => 'all',
+            constraints => {
+                name => $project
+            }
+        };
 
-    my $result = request('project.search', $data);
-    return undef
-        unless (exists $result->{result}{data} && @{ $result->{result}{data} });
+        my $result = request('project.search', $data);
+        return undef
+            unless (exists $result->{result}{data} && @{ $result->{result}{data} });
 
-    return $result->{result}{data}[0]{phid};
+        $project_phid = $result->{result}{data}[0]{phid};
+        $memcache->set_config({ key => "phab_project_phid_" . $project, data => $project_phid });
+    }
+    return $project_phid;
 }
 
 sub create_project {
index 8c3b561129aa86cca882fccbba47728dbab06b2d..5da64901af322333979d96668fcc0a7cd82b40a1 100644 (file)
@@ -20,11 +20,19 @@ use Bugzilla::User;
 
 use Bugzilla::Extension::PhabBugz::Constants;
 use Bugzilla::Extension::PhabBugz::Util qw(
-  add_comment_to_revision create_private_revision_policy
-  edit_revision_policy get_attachment_revisions get_bug_role_phids
-  intersect make_revision_public
-  make_revision_private set_revision_subscribers
-  get_security_sync_groups add_security_sync_comments);
+  add_comment_to_revision
+  add_security_sync_comments
+  create_private_revision_policy
+  edit_revision_policy
+  get_attachment_revisions
+  get_bug_role_phids
+  get_project_phid
+  get_security_sync_groups
+  intersect
+  make_revision_public
+  make_revision_private
+  set_revision_subscribers
+);
 use Bugzilla::Extension::Push::Constants;
 use Bugzilla::Extension::Push::Util qw(is_public);
 
@@ -96,9 +104,14 @@ sub send {
         $subscribers = get_bug_role_phids($bug);
     }
 
+    my $secure_project_phid = get_project_phid('secure-revision');
+
     foreach my $revision (@revisions) {
         my $revision_phid = $revision->{phid};
 
+        my $rev_obj = Bugzilla::Extension::PhabBugz::Revision->new_from_query({ phids => [ $revision_phid ] });
+        my $revision_updated;
+
         if ( $is_public && $group_change ) {
             Bugzilla->audit(sprintf(
               'Making revision %s public for bug %s',
@@ -106,6 +119,8 @@ sub send {
               $bug->id
             ));
             make_revision_public($revision_phid);
+            $rev_obj->remove_project($secure_project_phid);
+            $revision_updated = 1;
         }
         elsif ( !$is_public && $group_change ) {
             Bugzilla->audit(sprintf(
@@ -115,6 +130,8 @@ sub send {
             ));
             my $policy_phid = create_private_revision_policy( $bug, \@set_groups );
             edit_revision_policy( $revision_phid, $policy_phid, $subscribers );
+            $rev_obj->add_project($secure_project_phid);
+            $revision_updated = 1;
         }
         elsif ( !$is_public && !$group_change ) {
             Bugzilla->audit(sprintf(
@@ -124,6 +141,7 @@ sub send {
             ));
             set_revision_subscribers( $revision_phid, $subscribers );
         }
+        $rev_obj->update() if $revision_updated;
     }
 
     return PUSH_RESULT_OK;