diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php --- a/src/__phutil_library_map__.php +++ b/src/__phutil_library_map__.php @@ -511,6 +511,7 @@ 'DifferentialRevisionAuthorHeraldField' => 'applications/differential/herald/DifferentialRevisionAuthorHeraldField.php', 'DifferentialRevisionAuthorProjectsHeraldField' => 'applications/differential/herald/DifferentialRevisionAuthorProjectsHeraldField.php', 'DifferentialRevisionCloseDetailsController' => 'applications/differential/controller/DifferentialRevisionCloseDetailsController.php', + 'DifferentialRevisionCloseTransaction' => 'applications/differential/xaction/DifferentialRevisionCloseTransaction.php', 'DifferentialRevisionContentAddedHeraldField' => 'applications/differential/herald/DifferentialRevisionContentAddedHeraldField.php', 'DifferentialRevisionContentHeraldField' => 'applications/differential/herald/DifferentialRevisionContentHeraldField.php', 'DifferentialRevisionContentRemovedHeraldField' => 'applications/differential/herald/DifferentialRevisionContentRemovedHeraldField.php', @@ -544,6 +545,7 @@ 'DifferentialRevisionReclaimTransaction' => 'applications/differential/xaction/DifferentialRevisionReclaimTransaction.php', 'DifferentialRevisionRelationship' => 'applications/differential/relationships/DifferentialRevisionRelationship.php', 'DifferentialRevisionRelationshipSource' => 'applications/search/relationship/DifferentialRevisionRelationshipSource.php', + 'DifferentialRevisionReopenTransaction' => 'applications/differential/xaction/DifferentialRevisionReopenTransaction.php', 'DifferentialRevisionRepositoryHeraldField' => 'applications/differential/herald/DifferentialRevisionRepositoryHeraldField.php', 'DifferentialRevisionRepositoryProjectsHeraldField' => 'applications/differential/herald/DifferentialRevisionRepositoryProjectsHeraldField.php', 'DifferentialRevisionRepositoryTransaction' => 'applications/differential/xaction/DifferentialRevisionRepositoryTransaction.php', @@ -5180,6 +5182,7 @@ 'DifferentialRevisionAuthorHeraldField' => 'DifferentialRevisionHeraldField', 'DifferentialRevisionAuthorProjectsHeraldField' => 'DifferentialRevisionHeraldField', 'DifferentialRevisionCloseDetailsController' => 'DifferentialController', + 'DifferentialRevisionCloseTransaction' => 'DifferentialRevisionActionTransaction', 'DifferentialRevisionContentAddedHeraldField' => 'DifferentialRevisionHeraldField', 'DifferentialRevisionContentHeraldField' => 'DifferentialRevisionHeraldField', 'DifferentialRevisionContentRemovedHeraldField' => 'DifferentialRevisionHeraldField', @@ -5213,6 +5216,7 @@ 'DifferentialRevisionReclaimTransaction' => 'DifferentialRevisionActionTransaction', 'DifferentialRevisionRelationship' => 'PhabricatorObjectRelationship', 'DifferentialRevisionRelationshipSource' => 'PhabricatorObjectRelationshipSource', + 'DifferentialRevisionReopenTransaction' => 'DifferentialRevisionActionTransaction', 'DifferentialRevisionRepositoryHeraldField' => 'DifferentialRevisionHeraldField', 'DifferentialRevisionRepositoryProjectsHeraldField' => 'DifferentialRevisionHeraldField', 'DifferentialRevisionRepositoryTransaction' => 'DifferentialRevisionTransactionType', diff --git a/src/applications/differential/xaction/DifferentialRevisionAbandonTransaction.php b/src/applications/differential/xaction/DifferentialRevisionAbandonTransaction.php --- a/src/applications/differential/xaction/DifferentialRevisionAbandonTransaction.php +++ b/src/applications/differential/xaction/DifferentialRevisionAbandonTransaction.php @@ -45,7 +45,7 @@ pht( 'You can not abandon this revision because you are not the '. 'author. You can only abandon revisions you own. You can change '. - 'this behavior by adjusting the "%s" setting in Config', + 'this behavior by adjusting the "%s" setting in Config.', $config_key)); } } diff --git a/src/applications/differential/xaction/DifferentialRevisionCloseTransaction.php b/src/applications/differential/xaction/DifferentialRevisionCloseTransaction.php new file mode 100644 --- /dev/null +++ b/src/applications/differential/xaction/DifferentialRevisionCloseTransaction.php @@ -0,0 +1,78 @@ +isClosed(); + } + + public function applyInternalEffects($object, $value) { + $status_closed = ArcanistDifferentialRevisionStatus::CLOSED; + $status_accepted = ArcanistDifferentialRevisionStatus::ACCEPTED; + + $old_status = $object->getStatus(); + + $object->setStatus($status_closed); + + $was_accepted = ($old_status == $status_accepted); + + $object->setProperty( + DifferentialRevision::PROPERTY_CLOSED_FROM_ACCEPTED, + $was_accepted); + } + + protected function validateAction($object, PhabricatorUser $viewer) { + if ($object->isClosed()) { + throw new Exception( + pht( + 'You can not close this revision because it has already been '. + 'closed. Only open revisions can be closed.')); + } + + $config_key = 'differential.always-allow-close'; + if (!PhabricatorEnv::getEnvConfig($config_key)) { + if (!$this->isViewerRevisionAuthor($object, $viewer)) { + throw new Exception( + pht( + 'You can not close this revision because you are not the '. + 'author. You can only close revisions you own. You can change '. + 'this behavior by adjusting the "%s" setting in Config.', + $config_key)); + } + } + } + + public function getTitle() { + return pht( + '%s closed this revision.', + $this->renderAuthor()); + } + + public function getTitleForFeed() { + return pht( + '%s closed %s.', + $this->renderAuthor(), + $this->renderObject()); + } + +} diff --git a/src/applications/differential/xaction/DifferentialRevisionReopenTransaction.php b/src/applications/differential/xaction/DifferentialRevisionReopenTransaction.php new file mode 100644 --- /dev/null +++ b/src/applications/differential/xaction/DifferentialRevisionReopenTransaction.php @@ -0,0 +1,68 @@ +isClosed(); + } + + public function applyInternalEffects($object, $value) { + $object->setStatus(ArcanistDifferentialRevisionStatus::NEEDS_REVIEW); + } + + protected function validateAction($object, PhabricatorUser $viewer) { + // Note that we're testing for "Closed", exactly, not just any closed + // status. + $status_closed = ArcanistDifferentialRevisionStatus::CLOSED; + if ($object->getStatus() != $status_closed) { + throw new Exception( + pht( + 'You can not reopen this revision because it is not closed. '. + 'Only closed revisions can be reopened.')); + } + + $config_key = 'differential.allow-reopen'; + if (!PhabricatorEnv::getEnvConfig($config_key)) { + throw new Exception( + pht( + 'You can not reopen this revision because configuration prevents '. + 'any revision from being reopened. You can change this behavior '. + 'by adjusting the "%s" setting in Config.', + $config_key)); + } + } + + public function getTitle() { + return pht( + '%s reopened this revision.', + $this->renderAuthor()); + } + + public function getTitleForFeed() { + return pht( + '%s reopened %s.', + $this->renderAuthor(), + $this->renderObject()); + } + +}