@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
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}