diff --git a/src/workflow/ArcanistCloseRevisionWorkflow.php b/src/workflow/ArcanistCloseRevisionWorkflow.php --- a/src/workflow/ArcanistCloseRevisionWorkflow.php +++ b/src/workflow/ArcanistCloseRevisionWorkflow.php @@ -89,11 +89,13 @@ )); $revision = head($revisions); + $object_name = "D{$revision_id}"; + if (!$revision && !$is_finalize) { throw new ArcanistUsageException( pht( 'Revision %s does not exist.', - "D{$revision_id}")); + $object_name)); } $status_accepted = ArcanistDifferentialRevisionStatus::ACCEPTED; @@ -104,15 +106,20 @@ pht( "Revision %s can not be closed. You can only close ". "revisions which have been 'accepted'.", - "D{$revision_id}")); + $object_name)); } if ($revision) { + $revision_display = sprintf( + '%s %s', + $object_name, + $revision['title']); + if (!$is_finalize && $revision['authorPHID'] != $this->getUserPHID()) { $prompt = pht( - 'You are not the author of revision %s, '. + 'You are not the author of revision "%s", '. 'are you sure you want to close it?', - "D{$revision_id}"); + $object_name); if (!phutil_console_confirm($prompt)) { throw new ArcanistUserAbortException(); } @@ -120,24 +127,42 @@ $actually_close = true; if ($is_finalize) { - if ($this->getRepositoryPHID() || - $revision['status'] != $status_accepted) { + if ($this->getRepositoryPHID()) { + $actually_close = false; + } else if ($revision['status'] != $status_accepted) { + // See T13458. The server doesn't permit a transition to "Closed" + // over the API if the revision is not "Accepted". If we won't be + // able to close the revision, skip the attempt and print a + // message. + + $this->writeWarn( + pht('OPEN REVISION'), + pht( + 'Revision "%s" is not in state "Accepted", so it will '. + 'be left open.', + $object_name)); + $actually_close = false; } } - if ($actually_close) { - $revision_name = $revision['title']; - echo pht( - "Closing revision %s '%s'...\n", - "D{$revision_id}", - $revision_name); + if ($actually_close) { + $this->writeInfo( + pht('CLOSE'), + pht( + 'Closing revision "%s"...', + $revision_display)); $conduit->callMethodSynchronous( 'differential.close', array( 'revisionID' => $revision_id, )); + + $this->writeOkay( + pht('CLOSE'), + pht( + 'Done, closed revision.')); } }