From 96d34162186e628a5ced0f85dff7b7a9bfe8ed8f Mon Sep 17 00:00:00 2001 From: Bob Trahan Date: Thu, 1 May 2014 16:14:03 -0700 Subject: [PATCH] Arcanst - add support for custom statuses to `arc close` workflow Summary: Fixes T4938. Now that we have customs statuses, this workflow needs to know about 'em. One fun caveat is that Conduit isn't up and running to generate the help method, so I had to add a parameter to have the statuses list out. This could maybe be omitted since entering erroneous status options does indeed tell you the correct options. Test Plan: `arc close --list-status` -- got a list of statuses `arc close T1` -- closed T1 `arc close T1` -- error T1 closed already `arc close T1 -s foobar` -- T1 status set to foobar Reviewers: epriestley Reviewed By: epriestley Subscribers: epriestley, Korvin Maniphest Tasks: T1, T4938 Differential Revision: https://secure.phabricator.com/D8938 --- src/workflow/ArcanistCloseWorkflow.php | 62 +++++++++++++++++--------- 1 file changed, 41 insertions(+), 21 deletions(-) diff --git a/src/workflow/ArcanistCloseWorkflow.php b/src/workflow/ArcanistCloseWorkflow.php index b9b10bf6..aa5ac10c 100644 --- a/src/workflow/ArcanistCloseWorkflow.php +++ b/src/workflow/ArcanistCloseWorkflow.php @@ -8,15 +8,28 @@ final class ArcanistCloseWorkflow extends ArcanistBaseWorkflow { private $tasks; - private $statusOptions = array( - "resolved" => 1, - "wontfix" => 2, - "invalid" => 3, - "duplicate" => 4, - "spite" => 5, - "open" => 0 - ); + private $statusOptions; + private $statusData; + private function loadStatusData() { + $this->statusData = $this->getConduit()->callMethodSynchronous( + 'maniphest.querystatuses', + array()); + return $this; + } + + private function getStatusOptions() { + if ($this->statusData === null) { + throw new Exception('loadStatusData first!'); + } + return idx($this->statusData, 'statusMap'); + } + private function getDefaultClosedStatus() { + if ($this->statusData === null) { + throw new Exception('loadStatusData first!'); + } + return idx($this->statusData, 'defaultClosedStatus'); + } public function getWorkflowName() { return 'close'; @@ -31,7 +44,7 @@ EOTEXT public function getCommandHelp() { return phutil_console_format(<<statusOptions); - $last = array_pop($options); return array( '*' => 'task_id', 'message' => array( 'short' => 'm', 'param' => 'comment', - 'help' => "Provide a comment with your status change.", + 'help' => pht('Provide a comment with your status change.'), ), 'status' => array( 'param' => 'status', 'short' => 's', - 'help' => "New status. Valid options are ". - implode(', ', $options).", or {$last}. Default is resolved.\n" + 'help' => pht('Specify a new status. Valid status options can be '. + 'seen with the `list-statuses` argument.'), + ), + 'list-statuses' => array( + 'help' => 'Show available status options and exit.', ), ); } public function run() { + $this->loadStatusData(); + $list_statuses = $this->getArgument('list-statuses'); + if ($list_statuses) { + echo phutil_console_format(pht( + "Valid status options are:\n". + "\t%s\n", implode($this->getStatusOptions(), ', '))); + return 0; + } $ids = $this->getArgument('task_id'); $message = $this->getArgument('message'); $status = strtolower($this->getArgument('status')); + $status_options = $this->getStatusOptions(); if (!isset($status) || $status == '') { - $status = head_key($this->statusOptions); + $status = $this->getDefaultClosedStatus(); } - if (isset($this->statusOptions[$status])) { - $status = $this->statusOptions[$status]; - } else { - $options = array_keys($this->statusOptions); + if (!isset($status_options[$status])) { + $options = array_keys($status_options); $last = array_pop($options); echo "Invalid status {$status}, valid options are ". implode(', ', $options).", or {$last}.\n"; @@ -94,7 +115,6 @@ EOTEXT } $id = ltrim($id, 'T'); $result = $this->closeTask($id, $status, $message); - $status_options = array_flip($this->statusOptions); $current_status = $status_options[$status]; if ($result) { echo "T{$id}'s status is now set to {$current_status}.\n"; @@ -105,7 +125,7 @@ EOTEXT return 0; } - private function closeTask($task_id, $status = 1, $comment = "") { + private function closeTask($task_id, $status, $comment = "") { $conduit = $this->getConduit(); $info = $conduit->callMethodSynchronous( 'maniphest.info',