@recaptime-dev's working patches + fork for Phorge, a community fork of Phabricator. (Upstream dev and stable branches are at upstream/main and upstream/stable respectively.) hq.recaptime.dev/wiki/Phorge
phorge phabricator
at recaptime-dev/main 134 lines 3.3 kB view raw
1<?php 2 3abstract class DiffusionCommitAuditTransaction 4 extends DiffusionCommitActionTransaction { 5 6 protected function getCommitActionGroupKey() { 7 return DiffusionCommitEditEngine::ACTIONGROUP_AUDIT; 8 } 9 10 public function generateOldValue($object) { 11 return false; 12 } 13 14 protected function isViewerAnyAuditor( 15 PhabricatorRepositoryCommit $commit, 16 PhabricatorUser $viewer) { 17 return ($this->getViewerAuditStatus($commit, $viewer) !== null); 18 } 19 20 protected function isViewerAnyActiveAuditor( 21 PhabricatorRepositoryCommit $commit, 22 PhabricatorUser $viewer) { 23 24 // This omits inactive states; currently just "Resigned". 25 $active = array( 26 PhabricatorAuditRequestStatus::AUDIT_REQUIRED, 27 PhabricatorAuditRequestStatus::CONCERNED, 28 PhabricatorAuditRequestStatus::ACCEPTED, 29 PhabricatorAuditRequestStatus::AUDIT_REQUESTED, 30 ); 31 $active = array_fuse($active); 32 33 $viewer_status = $this->getViewerAuditStatus($commit, $viewer); 34 35 return $viewer_status !== null && isset($active[$viewer_status]); 36 } 37 38 protected function isViewerFullyAccepted( 39 PhabricatorRepositoryCommit $commit, 40 PhabricatorUser $viewer) { 41 return $this->isViewerAuditStatusFullyAmong( 42 $commit, 43 $viewer, 44 array( 45 PhabricatorAuditRequestStatus::ACCEPTED, 46 )); 47 } 48 49 protected function isViewerFullyRejected( 50 PhabricatorRepositoryCommit $commit, 51 PhabricatorUser $viewer) { 52 return $this->isViewerAuditStatusFullyAmong( 53 $commit, 54 $viewer, 55 array( 56 PhabricatorAuditRequestStatus::CONCERNED, 57 )); 58 } 59 60 protected function getViewerAuditStatus( 61 PhabricatorRepositoryCommit $commit, 62 PhabricatorUser $viewer) { 63 64 if (!$viewer->getPHID()) { 65 return null; 66 } 67 68 foreach ($commit->getAudits() as $audit) { 69 if ($audit->getAuditorPHID() != $viewer->getPHID()) { 70 continue; 71 } 72 73 return $audit->getAuditStatus(); 74 } 75 76 return null; 77 } 78 79 protected function isViewerAuditStatusFullyAmong( 80 PhabricatorRepositoryCommit $commit, 81 PhabricatorUser $viewer, 82 array $status_list) { 83 84 $status = $this->getViewerAuditStatus($commit, $viewer); 85 if ($status === null) { 86 return false; 87 } 88 89 $status_map = array_fuse($status_list); 90 foreach ($commit->getAudits() as $audit) { 91 if (!$commit->hasAuditAuthority($viewer, $audit)) { 92 continue; 93 } 94 95 $status = $audit->getAuditStatus(); 96 if (isset($status_map[$status])) { 97 continue; 98 } 99 100 return false; 101 } 102 103 return true; 104 } 105 106 protected function applyAuditorEffect( 107 PhabricatorRepositoryCommit $commit, 108 PhabricatorUser $viewer, 109 $value, 110 $status) { 111 112 $actor = $this->getActor(); 113 114 $audits = $commit->getAudits(); 115 $audits = mpull($audits, null, 'getAuditorPHID'); 116 117 $map = array(); 118 119 $with_authority = ($status != PhabricatorAuditRequestStatus::RESIGNED); 120 if ($with_authority) { 121 foreach ($audits as $audit) { 122 if ($commit->hasAuditAuthority($actor, $audit)) { 123 $map[$audit->getAuditorPHID()] = $status; 124 } 125 } 126 } 127 128 // In all cases, you affect yourself. 129 $map[$viewer->getPHID()] = $status; 130 131 $this->updateAudits($commit, $map); 132 } 133 134}