diff --git a/src/applications/differential/field/specification/DifferentialReviewersFieldSpecification.php b/src/applications/differential/field/specification/DifferentialReviewersFieldSpecification.php index 280fb5c8a8..47783a9d43 100644 --- a/src/applications/differential/field/specification/DifferentialReviewersFieldSpecification.php +++ b/src/applications/differential/field/specification/DifferentialReviewersFieldSpecification.php @@ -1,195 +1,198 @@ getReviewerPHIDs(); } public function renderLabelForRevisionView() { return 'Reviewers:'; } public function renderValueForRevisionView() { return $this->renderUserList($this->getReviewerPHIDs()); } private function getReviewerPHIDs() { $revision = $this->getRevision(); return $revision->getReviewers(); } public function shouldAppearOnEdit() { return true; } protected function didSetRevision() { $this->reviewers = $this->getReviewerPHIDs(); } public function getRequiredHandlePHIDsForRevisionEdit() { return $this->reviewers; } public function setValueFromRequest(AphrontRequest $request) { $this->reviewers = $request->getArr('reviewers'); return $this; } public function validateField() { - if (in_array($this->getUser()->getPHID(), $this->reviewers)) { + $allow_self_accept = PhabricatorEnv::getEnvConfig( + 'differential.allow-self-accept', false); + if (!$allow_self_accept + && in_array($this->getUser()->getPHID(), $this->reviewers)) { $this->error = 'Invalid'; throw new DifferentialFieldValidationException( "You may not review your own revision!"); } } public function renderEditControl() { $reviewer_map = array(); foreach ($this->reviewers as $phid) { $reviewer_map[$phid] = $this->getHandle($phid)->getFullName(); } return id(new AphrontFormTokenizerControl()) ->setLabel('Reviewers') ->setName('reviewers') ->setUser($this->getUser()) ->setDatasource('/typeahead/common/users/') ->setValue($reviewer_map) ->setError($this->error); } public function willWriteRevision(DifferentialRevisionEditor $editor) { $editor->setReviewers($this->reviewers); } public function shouldAppearOnCommitMessage() { return true; } public function getCommitMessageKey() { return 'reviewerPHIDs'; } public function setValueFromParsedCommitMessage($value) { $this->reviewers = nonempty($value, array()); return $this; } public function renderLabelForCommitMessage() { return 'Reviewers'; } public function getRequiredHandlePHIDsForCommitMessage() { return $this->reviewers; } public function renderValueForCommitMessage($is_edit) { if (!$this->reviewers) { return null; } $names = array(); foreach ($this->reviewers as $phid) { $names[] = $this->getHandle($phid)->getName(); } return implode(', ', $names); } public function getSupportedCommitMessageLabels() { return array( 'Reviewer', 'Reviewers', ); } public function parseValueFromCommitMessage($value) { return $this->parseCommitMessageUserList($value); } public function shouldAppearOnRevisionList() { return true; } public function renderHeaderForRevisionList() { return 'Reviewers'; } public function renderValueForRevisionList(DifferentialRevision $revision) { $primary_reviewer = $revision->getPrimaryReviewer(); if ($primary_reviewer) { $other_reviewers = array_flip($revision->getReviewers()); unset($other_reviewers[$primary_reviewer]); if ($other_reviewers) { $names = array(); foreach ($other_reviewers as $reviewer => $_) { $names[] = phutil_escape_html( $this->getHandle($reviewer)->getLinkName()); } $suffix = ' '.javelin_render_tag( 'abbr', array( 'sigil' => 'has-tooltip', 'meta' => array( 'tip' => implode(', ', $names), 'align' => 'E', ), ), '(+'.(count($names)).')'); } else { $suffix = null; } return $this->getHandle($primary_reviewer)->renderLink().$suffix; } else { return 'None'; } } public function getRequiredHandlePHIDsForRevisionList( DifferentialRevision $revision) { return $revision->getReviewers(); } public function renderValueForMail($phase) { if ($phase == DifferentialMailPhase::COMMENT) { return null; } if (!$this->reviewers) { return null; } $handles = id(new PhabricatorObjectHandleData($this->reviewers)) ->loadHandles(); $handles = array_select_keys( $handles, array($this->getRevision()->getPrimaryReviewer())) + $handles; $names = mpull($handles, 'getName'); return 'Reviewers: '.implode(', ', $names); } }