Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/phabricator
Path: blob/master/src/applications/differential/field/DifferentialReviewersCommitMessageField.php
12256 views
1
<?php
2
3
final class DifferentialReviewersCommitMessageField
4
extends DifferentialCommitMessageField {
5
6
const FIELDKEY = 'reviewerPHIDs';
7
8
public function getFieldName() {
9
return pht('Reviewers');
10
}
11
12
public function getFieldOrder() {
13
return 4000;
14
}
15
16
public function getFieldAliases() {
17
return array(
18
'Reviewer',
19
);
20
}
21
22
public function parseFieldValue($value) {
23
$results = $this->parseObjectList(
24
$value,
25
array(
26
PhabricatorPeopleUserPHIDType::TYPECONST,
27
PhabricatorProjectProjectPHIDType::TYPECONST,
28
PhabricatorOwnersPackagePHIDType::TYPECONST,
29
),
30
false,
31
array('!'));
32
33
return $this->flattenReviewers($results);
34
}
35
36
public function readFieldValueFromConduit($value) {
37
return $this->readStringListFieldValueFromConduit($value);
38
}
39
40
public function readFieldValueFromObject(DifferentialRevision $revision) {
41
if (!$revision->getPHID()) {
42
return array();
43
}
44
45
$status_blocking = DifferentialReviewerStatus::STATUS_BLOCKING;
46
47
$results = array();
48
foreach ($revision->getReviewers() as $reviewer) {
49
if ($reviewer->getReviewerStatus() == $status_blocking) {
50
$suffixes = array('!' => '!');
51
} else {
52
$suffixes = array();
53
}
54
55
$results[] = array(
56
'phid' => $reviewer->getReviewerPHID(),
57
'suffixes' => $suffixes,
58
);
59
}
60
61
return $this->flattenReviewers($results);
62
}
63
64
public function renderFieldValue($value) {
65
$value = $this->inflateReviewers($value);
66
67
$phid_list = array();
68
$suffix_map = array();
69
foreach ($value as $reviewer) {
70
$phid = $reviewer['phid'];
71
$phid_list[] = $phid;
72
if (isset($reviewer['suffixes']['!'])) {
73
$suffix_map[$phid] = '!';
74
}
75
}
76
77
return $this->renderHandleList($phid_list, $suffix_map);
78
}
79
80
public function getFieldTransactions($value) {
81
$value = $this->inflateReviewers($value);
82
83
$reviewer_list = array();
84
foreach ($value as $reviewer) {
85
$phid = $reviewer['phid'];
86
if (isset($reviewer['suffixes']['!'])) {
87
$reviewer_list[] = 'blocking('.$phid.')';
88
} else {
89
$reviewer_list[] = $phid;
90
}
91
}
92
93
$xaction_key = DifferentialRevisionReviewersTransaction::EDITKEY;
94
$xaction_type = "{$xaction_key}.set";
95
96
return array(
97
array(
98
'type' => $xaction_type,
99
'value' => $reviewer_list,
100
),
101
);
102
}
103
104
private function flattenReviewers(array $values) {
105
// NOTE: For now, `arc` relies on this field returning only scalars, so we
106
// need to reduce the results into scalars. See T10981.
107
$result = array();
108
109
foreach ($values as $value) {
110
$result[] = $value['phid'].implode('', array_keys($value['suffixes']));
111
}
112
113
return $result;
114
}
115
116
private function inflateReviewers(array $values) {
117
$result = array();
118
119
foreach ($values as $value) {
120
if (substr($value, -1) == '!') {
121
$value = substr($value, 0, -1);
122
$suffixes = array('!' => '!');
123
} else {
124
$suffixes = array();
125
}
126
127
$result[] = array(
128
'phid' => $value,
129
'suffixes' => $suffixes,
130
);
131
}
132
133
return $result;
134
}
135
136
}
137
138