diff --git a/src/applications/differential/customfield/DifferentialReviewersField.php b/src/applications/differential/customfield/DifferentialReviewersField.php --- a/src/applications/differential/customfield/DifferentialReviewersField.php +++ b/src/applications/differential/customfield/DifferentialReviewersField.php @@ -7,10 +7,6 @@ return 'differential:reviewers'; } - public function getFieldKeyForConduit() { - return 'reviewerPHIDs'; - } - public function getFieldName() { return pht('Reviewers'); } @@ -24,108 +20,6 @@ return $revision->getReviewerStatus(); } - public function getNewValueForApplicationTransactions() { - $specs = array(); - foreach ($this->getValue() as $reviewer) { - $specs[$reviewer->getReviewerPHID()] = array( - 'data' => $reviewer->getEdgeData(), - ); - } - - return array('=' => $specs); - } - - public function readValueFromRequest(AphrontRequest $request) { - $datasource = id(new DifferentialBlockingReviewerDatasource()) - ->setViewer($request->getViewer()); - - $new_phids = $request->getArr($this->getFieldKey()); - $new_phids = $datasource->evaluateTokens($new_phids); - - $reviewers = array(); - foreach ($new_phids as $spec) { - if (!is_array($spec)) { - $reviewers[$spec] = DifferentialReviewerStatus::STATUS_ADDED; - } else { - $reviewers[$spec['phid']] = $spec['type']; - } - } - - $this->updateReviewers($this->getValue(), $reviewers); - } - - private function updateReviewers(array $old_reviewers, array $new_map) { - // Compute a new set of reviewer objects. We're going to respect the new - // reviewer order, add or remove any new or missing reviewers, and respect - // any blocking or unblocking changes. For reviewers who were there before - // and are still there, we're going to keep the old value because it - // may be something like "Accept", "Reject", etc. - - $old_map = mpull($old_reviewers, 'getStatus', 'getReviewerPHID'); - $status_blocking = DifferentialReviewerStatus::STATUS_BLOCKING; - - $new_reviewers = array(); - foreach ($new_map as $phid => $new) { - $old = idx($old_map, $phid); - - // If we have an old status and this didn't make the reviewer blocking - // or nonblocking, just retain the old status. This makes sure we don't - // throw away rejects, accepts, etc. - if ($old) { - $is_block = ($old !== $status_blocking && $new === $status_blocking); - $is_unblock = ($old === $status_blocking && $new !== $status_blocking); - if (!$is_block && !$is_unblock) { - $new_reviewers[$phid] = $old; - continue; - } - } - - $new_reviewers[$phid] = $new; - } - - foreach ($new_reviewers as $phid => $status) { - $new_reviewers[$phid] = new DifferentialReviewerProxy( - $phid, - array( - 'status' => $status, - )); - } - - $this->setValue($new_reviewers); - } - - public function renderEditControl(array $handles) { - $status_blocking = DifferentialReviewerStatus::STATUS_BLOCKING; - - $value = array(); - foreach ($this->getValue() as $reviewer) { - $phid = $reviewer->getReviewerPHID(); - if ($reviewer->getStatus() == $status_blocking) { - $value[] = 'blocking('.$phid.')'; - } else { - $value[] = $phid; - } - } - - return id(new AphrontFormTokenizerControl()) - ->setUser($this->getViewer()) - ->setName($this->getFieldKey()) - ->setDatasource(new DifferentialReviewerDatasource()) - ->setValue($value) - ->setError($this->getFieldError()) - ->setLabel($this->getFieldName()); - } - - public function getApplicationTransactionType() { - return PhabricatorTransactions::TYPE_EDGE; - } - - public function getApplicationTransactionMetadata() { - return array( - 'edge:type' => DifferentialRevisionHasReviewerEdgeType::EDGECONST, - ); - } - public function shouldAppearInPropertyView() { return true; } @@ -164,99 +58,6 @@ return $reviewers; } - public function shouldAppearInCommitMessage() { - return true; - } - - public function shouldAppearInCommitMessageTemplate() { - return true; - } - - public function getCommitMessageLabels() { - return array( - 'Reviewer', - 'Reviewers', - ); - } - - public function parseValueFromCommitMessage($value) { - $results = $this->parseObjectList( - $value, - array( - PhabricatorPeopleUserPHIDType::TYPECONST, - PhabricatorProjectProjectPHIDType::TYPECONST, - PhabricatorOwnersPackagePHIDType::TYPECONST, - ), - false, - array('!')); - - return $this->flattenReviewers($results); - } - - public function getRequiredHandlePHIDsForCommitMessage() { - return mpull($this->getValue(), 'getReviewerPHID'); - } - - public function readValueFromCommitMessage($value) { - $value = $this->inflateReviewers($value); - - $reviewers = array(); - foreach ($value as $spec) { - $phid = $spec['phid']; - - $is_blocking = isset($spec['suffixes']['!']); - if ($is_blocking) { - $status = DifferentialReviewerStatus::STATUS_BLOCKING; - } else { - $status = DifferentialReviewerStatus::STATUS_ADDED; - } - - $reviewers[$phid] = $status; - } - - $this->updateReviewers( - $this->getObject()->getReviewerStatus(), - $reviewers); - - return $this; - } - - public function renderCommitMessageValue(array $handles) { - $suffixes = array(); - - $status_blocking = DifferentialReviewerStatus::STATUS_BLOCKING; - - foreach ($this->getValue() as $reviewer) { - if ($reviewer->getStatus() == $status_blocking) { - $phid = $reviewer->getReviewerPHID(); - $suffixes[$phid] = '!'; - } - } - - return $this->renderObjectList($handles, $suffixes); - } - - public function validateCommitMessageValue($value) { - if (!$value) { - return; - } - - $author_phid = $this->getObject()->getAuthorPHID(); - - $config_self_accept_key = 'differential.allow-self-accept'; - $allow_self_accept = PhabricatorEnv::getEnvConfig($config_self_accept_key); - - $value = $this->inflateReviewers($value); - foreach ($value as $spec) { - $phid = $spec['phid']; - - if (($phid == $author_phid) && !$allow_self_accept) { - throw new DifferentialFieldValidationException( - pht('The author of a revision can not be a reviewer.')); - } - } - } - public function getRequiredHandlePHIDsForRevisionHeaderWarnings() { return mpull($this->getValue(), 'getReviewerPHID'); } @@ -288,44 +89,4 @@ return $warnings; } - public function getProTips() { - return array( - pht( - 'You can mark a reviewer as blocking by adding an exclamation '. - 'mark ("!") after their name.'), - ); - } - - private function flattenReviewers(array $values) { - // NOTE: For now, `arc` relies on this field returning only scalars, so we - // need to reduce the results into scalars. See T10981. - $result = array(); - - foreach ($values as $value) { - $result[] = $value['phid'].implode('', array_keys($value['suffixes'])); - } - - return $result; - } - - private function inflateReviewers(array $values) { - $result = array(); - - foreach ($values as $value) { - if (substr($value, -1) == '!') { - $value = substr($value, 0, -1); - $suffixes = array('!' => '!'); - } else { - $suffixes = array(); - } - - $result[] = array( - 'phid' => $value, - 'suffixes' => $suffixes, - ); - } - - return $result; - } - } diff --git a/src/applications/differential/storage/DifferentialTransaction.php b/src/applications/differential/storage/DifferentialTransaction.php --- a/src/applications/differential/storage/DifferentialTransaction.php +++ b/src/applications/differential/storage/DifferentialTransaction.php @@ -27,6 +27,9 @@ // without doing a migration. At some point, we should do a migration and // throw this away. + // NOTE: Old reviewer edits are raw edge transactions. They could be + // migrated to modular transactions when the rest of this migrates. + $xaction_type = $this->getTransactionType(); if ($xaction_type == PhabricatorTransactions::TYPE_CUSTOMFIELD) { switch ($this->getMetadataValue('customfield:key')) { diff --git a/src/applications/transactions/storage/PhabricatorApplicationTransaction.php b/src/applications/transactions/storage/PhabricatorApplicationTransaction.php --- a/src/applications/transactions/storage/PhabricatorApplicationTransaction.php +++ b/src/applications/transactions/storage/PhabricatorApplicationTransaction.php @@ -960,9 +960,18 @@ if ($field) { return $field->getApplicationTransactionTitle($this); } else { - return pht( - '%s edited a custom field.', - $this->renderHandleLink($author_phid)); + $developer_mode = 'phabricator.developer-mode'; + $is_developer = PhabricatorEnv::getEnvConfig($developer_mode); + if ($is_developer) { + return pht( + '%s edited a custom field (with key "%s").', + $this->renderHandleLink($author_phid), + $this->getMetadata('customfield:key')); + } else { + return pht( + '%s edited a custom field.', + $this->renderHandleLink($author_phid)); + } } case PhabricatorTransactions::TYPE_TOKEN: