[ Index ] |
PHP Cross Reference of Phabricator |
[Summary view] [Print] [Text view]
1 <?php 2 3 final class DifferentialReviewersField 4 extends DifferentialCoreCustomField { 5 6 public function getFieldKey() { 7 return 'differential:reviewers'; 8 } 9 10 public function getFieldKeyForConduit() { 11 return 'reviewerPHIDs'; 12 } 13 14 public function getFieldName() { 15 return pht('Reviewers'); 16 } 17 18 public function getFieldDescription() { 19 return pht('Manage reviewers.'); 20 } 21 22 protected function readValueFromRevision( 23 DifferentialRevision $revision) { 24 return $revision->getReviewerStatus(); 25 } 26 27 public function getNewValueForApplicationTransactions() { 28 $specs = array(); 29 foreach ($this->getValue() as $reviewer) { 30 $specs[$reviewer->getReviewerPHID()] = array( 31 'data' => $reviewer->getEdgeData(), 32 ); 33 } 34 35 return array('=' => $specs); 36 } 37 38 public function readValueFromRequest(AphrontRequest $request) { 39 // Compute a new set of reviewer objects. For reviewers who haven't been 40 // added or removed, retain their existing status. Also, respect the new 41 // order. 42 43 $old_status = $this->getValue(); 44 $old_status = mpull($old_status, null, 'getReviewerPHID'); 45 46 $new_phids = $request->getArr($this->getFieldKey()); 47 $new_phids = array_fuse($new_phids); 48 49 $new_status = array(); 50 foreach ($new_phids as $new_phid) { 51 if (empty($old_status[$new_phid])) { 52 $new_status[$new_phid] = new DifferentialReviewer( 53 $new_phid, 54 array( 55 'status' => DifferentialReviewerStatus::STATUS_ADDED, 56 )); 57 } else { 58 $new_status[$new_phid] = $old_status[$new_phid]; 59 } 60 } 61 62 $this->setValue($new_status); 63 } 64 65 public function getRequiredHandlePHIDsForEdit() { 66 $phids = array(); 67 if ($this->getValue()) { 68 $phids = mpull($this->getValue(), 'getReviewerPHID'); 69 } 70 return $phids; 71 } 72 73 public function renderEditControl(array $handles) { 74 return id(new AphrontFormTokenizerControl()) 75 ->setName($this->getFieldKey()) 76 ->setDatasource(new PhabricatorProjectOrUserDatasource()) 77 ->setValue($handles) 78 ->setError($this->getFieldError()) 79 ->setLabel($this->getFieldName()); 80 } 81 82 public function getApplicationTransactionType() { 83 return PhabricatorTransactions::TYPE_EDGE; 84 } 85 86 public function getApplicationTransactionMetadata() { 87 return array( 88 'edge:type' => PhabricatorEdgeConfig::TYPE_DREV_HAS_REVIEWER, 89 ); 90 } 91 92 public function shouldAppearInPropertyView() { 93 return true; 94 } 95 96 public function renderPropertyViewLabel() { 97 return $this->getFieldName(); 98 } 99 100 public function getRequiredHandlePHIDsForPropertyView() { 101 return mpull($this->getUserReviewers(), 'getReviewerPHID'); 102 } 103 104 public function renderPropertyViewValue(array $handles) { 105 $reviewers = $this->getUserReviewers(); 106 if (!$reviewers) { 107 return phutil_tag('em', array(), pht('None')); 108 } 109 110 $view = id(new DifferentialReviewersView()) 111 ->setUser($this->getViewer()) 112 ->setReviewers($reviewers) 113 ->setHandles($handles); 114 115 // TODO: Active diff stuff. 116 117 return $view; 118 } 119 120 private function getUserReviewers() { 121 $reviewers = array(); 122 foreach ($this->getObject()->getReviewerStatus() as $reviewer) { 123 if ($reviewer->isUser()) { 124 $reviewers[] = $reviewer; 125 } 126 } 127 return $reviewers; 128 } 129 130 public function shouldAppearInCommitMessage() { 131 return true; 132 } 133 134 public function shouldAppearInCommitMessageTemplate() { 135 return true; 136 } 137 138 public function getCommitMessageLabels() { 139 return array( 140 'Reviewer', 141 'Reviewers', 142 ); 143 } 144 145 public function parseValueFromCommitMessage($value) { 146 return $this->parseObjectList( 147 $value, 148 array( 149 PhabricatorPeopleUserPHIDType::TYPECONST, 150 PhabricatorProjectProjectPHIDType::TYPECONST, 151 )); 152 } 153 154 public function getRequiredHandlePHIDsForCommitMessage() { 155 return mpull($this->getValue(), 'getReviewerPHID'); 156 } 157 158 public function readValueFromCommitMessage($value) { 159 $current_reviewers = $this->getObject()->getReviewerStatus(); 160 $current_reviewers = mpull($current_reviewers, null, 'getReviewerPHID'); 161 162 $reviewers = array(); 163 foreach ($value as $phid) { 164 $reviewer = idx($current_reviewers, $phid); 165 if ($reviewer) { 166 $reviewers[] = $reviewer; 167 } else { 168 $data = array( 169 'status' => DifferentialReviewerStatus::STATUS_ADDED, 170 ); 171 $reviewers[] = new DifferentialReviewer($phid, $data); 172 } 173 } 174 175 $this->setValue($reviewers); 176 177 return $this; 178 } 179 180 public function renderCommitMessageValue(array $handles) { 181 return $this->renderObjectList($handles); 182 } 183 184 public function validateCommitMessageValue($value) { 185 $author_phid = $this->getObject()->getAuthorPHID(); 186 187 $config_self_accept_key = 'differential.allow-self-accept'; 188 $allow_self_accept = PhabricatorEnv::getEnvConfig($config_self_accept_key); 189 190 foreach ($value as $phid) { 191 if (($phid == $author_phid) && !$allow_self_accept) { 192 throw new DifferentialFieldValidationException( 193 pht('The author of a revision can not be a reviewer.')); 194 } 195 } 196 } 197 198 public function getRequiredHandlePHIDsForRevisionHeaderWarnings() { 199 return mpull($this->getValue(), 'getReviewerPHID'); 200 } 201 202 public function getWarningsForRevisionHeader(array $handles) { 203 $revision = $this->getObject(); 204 205 $status_needs_review = ArcanistDifferentialRevisionStatus::NEEDS_REVIEW; 206 if ($revision->getStatus() != $status_needs_review) { 207 return array(); 208 } 209 210 foreach ($this->getValue() as $reviewer) { 211 if (!$handles[$reviewer->getReviewerPHID()]->isDisabled()) { 212 return array(); 213 } 214 } 215 216 $warnings = array(); 217 if ($this->getValue()) { 218 $warnings[] = pht( 219 'This revision needs review, but all specified reviewers are '. 220 'disabled or inactive.'); 221 } else { 222 $warnings[] = pht( 223 'This revision needs review, but there are no reviewers specified.'); 224 } 225 226 return $warnings; 227 } 228 229 }
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
Generated: Sun Nov 30 09:20:46 2014 | Cross-referenced by PHPXref 0.7.1 |