Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/phabricator
Path: blob/master/src/applications/differential/customfield/DifferentialReviewersField.php
12256 views
1
<?php
2
3
final class DifferentialReviewersField
4
extends DifferentialCoreCustomField {
5
6
public function getFieldKey() {
7
return 'differential:reviewers';
8
}
9
10
public function getFieldName() {
11
return pht('Reviewers');
12
}
13
14
public function getFieldDescription() {
15
return pht('Manage reviewers.');
16
}
17
18
protected function readValueFromRevision(
19
DifferentialRevision $revision) {
20
return $revision->getReviewers();
21
}
22
23
public function shouldAppearInPropertyView() {
24
return true;
25
}
26
27
public function renderPropertyViewLabel() {
28
return $this->getFieldName();
29
}
30
31
public function getRequiredHandlePHIDsForPropertyView() {
32
return mpull($this->getUserReviewers(), 'getReviewerPHID');
33
}
34
35
public function renderPropertyViewValue(array $handles) {
36
$reviewers = $this->getUserReviewers();
37
if (!$reviewers) {
38
return phutil_tag('em', array(), pht('None'));
39
}
40
41
$view = id(new DifferentialReviewersView())
42
->setUser($this->getViewer())
43
->setReviewers($reviewers)
44
->setHandles($handles);
45
46
$diff = $this->getActiveDiff();
47
if ($diff) {
48
$view->setActiveDiff($diff);
49
}
50
51
return $view;
52
}
53
54
private function getUserReviewers() {
55
$reviewers = array();
56
foreach ($this->getObject()->getReviewers() as $reviewer) {
57
if ($reviewer->isUser()) {
58
$reviewers[] = $reviewer;
59
}
60
}
61
return $reviewers;
62
}
63
64
public function getRequiredHandlePHIDsForRevisionHeaderWarnings() {
65
return mpull($this->getValue(), 'getReviewerPHID');
66
}
67
68
public function getWarningsForRevisionHeader(array $handles) {
69
$revision = $this->getObject();
70
71
if (!$revision->isNeedsReview()) {
72
return array();
73
}
74
75
$viewer = $this->getViewer();
76
77
PhabricatorPolicyFilterSet::loadHandleViewCapabilities(
78
$viewer,
79
$handles,
80
array($revision));
81
82
$all_resigned = true;
83
$all_disabled = true;
84
$any_reviewers = false;
85
$all_exiled = true;
86
87
foreach ($this->getValue() as $reviewer) {
88
$reviewer_phid = $reviewer->getReviewerPHID();
89
$handle = $handles[$reviewer_phid];
90
91
$any_reviewers = true;
92
93
if (!$handle->isDisabled()) {
94
$all_disabled = false;
95
}
96
97
if (!$reviewer->isResigned()) {
98
$all_resigned = false;
99
}
100
101
if (!$handle->hasCapabilities()) {
102
$all_exiled = false;
103
} else {
104
if ($handle->hasViewCapability($revision)) {
105
$all_exiled = false;
106
}
107
}
108
109
}
110
111
$warnings = array();
112
if (!$any_reviewers) {
113
$warnings[] = pht(
114
'This revision needs review, but there are no reviewers specified.');
115
} else if ($all_disabled) {
116
$warnings[] = pht(
117
'This revision needs review, but all specified reviewers are '.
118
'disabled or inactive.');
119
} else if ($all_resigned) {
120
$warnings[] = pht(
121
'This revision needs review, but all reviewers have resigned.');
122
} else if ($all_exiled) {
123
$warnings[] = pht(
124
'This revision needs review, but no reviewers have permission '.
125
'to view it.');
126
}
127
128
return $warnings;
129
}
130
131
}
132
133