Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/phabricator
Path: blob/master/src/applications/differential/xaction/DifferentialRevisionRequestReviewTransaction.php
12256 views
1
<?php
2
3
final class DifferentialRevisionRequestReviewTransaction
4
extends DifferentialRevisionActionTransaction {
5
6
const TRANSACTIONTYPE = 'differential.revision.request';
7
const ACTIONKEY = 'request-review';
8
9
const SOURCE_HARBORMASTER = 'harbormaster';
10
const SOURCE_AUTHOR = 'author';
11
const SOURCE_VIEWER = 'viewer';
12
13
protected function getRevisionActionLabel(
14
DifferentialRevision $revision,
15
PhabricatorUser $viewer) {
16
17
// See PHI1810. Allow non-authors to "Request Review" on draft revisions
18
// to promote them out of the draft state. This smoothes over the workflow
19
// where an author asks for review of an urgent change but has not used
20
// "Request Review" to skip builds.
21
22
if ($revision->isDraft()) {
23
if (!$this->isViewerRevisionAuthor($revision, $viewer)) {
24
return pht('Begin Review Now');
25
}
26
}
27
28
return pht('Request Review');
29
}
30
31
protected function getRevisionActionDescription(
32
DifferentialRevision $revision,
33
PhabricatorUser $viewer) {
34
if ($revision->isDraft()) {
35
if (!$this->isViewerRevisionAuthor($revision, $viewer)) {
36
return pht(
37
'This revision will be moved out of the draft state so you can '.
38
'review it immediately.');
39
} else {
40
return pht(
41
'This revision will be submitted to reviewers for feedback.');
42
}
43
} else {
44
return pht('This revision will be returned to reviewers for feedback.');
45
}
46
}
47
48
protected function getRevisionActionMetadata(
49
DifferentialRevision $revision,
50
PhabricatorUser $viewer) {
51
$map = array();
52
53
if ($revision->isDraft()) {
54
$action_source = $this->getActorSourceType(
55
$revision,
56
$viewer);
57
$map['promotion.source'] = $action_source;
58
}
59
60
return $map;
61
}
62
63
protected function getRevisionActionSubmitButtonText(
64
DifferentialRevision $revision,
65
PhabricatorUser $viewer) {
66
67
// See PHI975. When the action stack will promote the revision out of
68
// draft, change the button text from "Submit Quietly".
69
if ($revision->isDraft()) {
70
return pht('Publish Revision');
71
}
72
73
return null;
74
}
75
76
77
public function getColor() {
78
return 'sky';
79
}
80
81
protected function getRevisionActionOrder() {
82
return 200;
83
}
84
85
public function getActionName() {
86
return pht('Requested Review');
87
}
88
89
public function generateOldValue($object) {
90
return $object->isNeedsReview();
91
}
92
93
public function applyInternalEffects($object, $value) {
94
$status_review = DifferentialRevisionStatus::NEEDS_REVIEW;
95
$object
96
->setModernRevisionStatus($status_review)
97
->setShouldBroadcast(true);
98
}
99
100
protected function validateAction($object, PhabricatorUser $viewer) {
101
if ($object->isNeedsReview()) {
102
throw new Exception(
103
pht(
104
'You can not request review of this revision because this '.
105
'revision is already under review and the action would have '.
106
'no effect.'));
107
}
108
109
if ($object->isClosed()) {
110
throw new Exception(
111
pht(
112
'You can not request review of this revision because it has '.
113
'already been closed. You can only request review of open '.
114
'revisions.'));
115
}
116
117
$this->getActorSourceType($object, $viewer);
118
}
119
120
public function getTitle() {
121
$source = $this->getDraftPromotionSource();
122
123
switch ($source) {
124
case self::SOURCE_HARBORMASTER:
125
case self::SOURCE_VIEWER:
126
case self::SOURCE_AUTHOR:
127
return pht(
128
'%s published this revision for review.',
129
$this->renderAuthor());
130
default:
131
return pht(
132
'%s requested review of this revision.',
133
$this->renderAuthor());
134
}
135
}
136
137
public function getTitleForFeed() {
138
$source = $this->getDraftPromotionSource();
139
140
switch ($source) {
141
case self::SOURCE_HARBORMASTER:
142
case self::SOURCE_VIEWER:
143
case self::SOURCE_AUTHOR:
144
return pht(
145
'%s published %s for review.',
146
$this->renderAuthor(),
147
$this->renderObject());
148
default:
149
return pht(
150
'%s requested review of %s.',
151
$this->renderAuthor(),
152
$this->renderObject());
153
}
154
}
155
156
public function getTransactionTypeForConduit($xaction) {
157
return 'request-review';
158
}
159
160
public function getFieldValuesForConduit($object, $data) {
161
return array();
162
}
163
164
private function getDraftPromotionSource() {
165
return $this->getMetadataValue('promotion.source');
166
}
167
168
private function getActorSourceType(
169
DifferentialRevision $revision,
170
PhabricatorUser $viewer) {
171
172
$is_harbormaster = $viewer->isOmnipotent();
173
$is_author = $this->isViewerRevisionAuthor($revision, $viewer);
174
$is_draft = $revision->isDraft();
175
176
if ($is_harbormaster) {
177
// When revisions automatically promote out of "Draft" after builds
178
// finish, the viewer may be acting as the Harbormaster application.
179
$source = self::SOURCE_HARBORMASTER;
180
} else if ($is_author) {
181
$source = self::SOURCE_AUTHOR;
182
} else if ($is_draft) {
183
// Non-authors are allowed to "Request Review" on draft revisions, to
184
// force them into review immediately.
185
$source = self::SOURCE_VIEWER;
186
} else {
187
throw new Exception(
188
pht(
189
'You can not request review of this revision because you are not '.
190
'the author of the revision and it is not currently a draft.'));
191
}
192
193
return $source;
194
}
195
196
}
197
198