diff --git a/src/parser/argument/PhutilArgumentParser.php b/src/parser/argument/PhutilArgumentParser.php --- a/src/parser/argument/PhutilArgumentParser.php +++ b/src/parser/argument/PhutilArgumentParser.php @@ -77,6 +77,7 @@ private $tagline; private $synopsis; private $workflows; + private $helpWorkflows; private $showHelp; private $requireArgumentTerminator = false; private $sawTerminator = false; @@ -449,11 +450,13 @@ $flow = $corrected; } else { - $this->raiseUnknownWorkflow($flow, $corrected); + if (!$this->showHelp) { + $this->raiseUnknownWorkflow($flow, $corrected); + } } } - $workflow = $this->workflows[$flow]; + $workflow = idx($this->workflows, $flow); if ($this->showHelp) { // Make "cmd flow --help" behave like "cmd help flow", not "cmd help". @@ -471,6 +474,10 @@ } } + if (!$workflow) { + $this->raiseUnknownWorkflow($flow, $corrected); + } + $this->argv = array_values($argv); if ($workflow->shouldParsePartial()) { @@ -633,6 +640,12 @@ return $this; } + public function setHelpWorkflows(array $help_workflows) { + $help_workflows = mpull($help_workflows, null, 'getName'); + $this->helpWorkflows = $help_workflows; + return $this; + } + public function getWorkflows() { return $this->workflows; } @@ -684,11 +697,16 @@ $out[] = null; } - if ($this->workflows) { + $workflows = $this->helpWorkflows; + if ($workflows === null) { + $workflows = $this->workflows; + } + + if ($workflows) { $has_help = false; $out[] = $this->format('**%s**', pht('WORKFLOWS')); $out[] = null; - $flows = $this->workflows; + $flows = $workflows; ksort($flows); foreach ($flows as $workflow) { if ($workflow->getName() == 'help') { @@ -739,7 +757,12 @@ $indent = ($show_details ? 0 : 6); - $workflow = idx($this->workflows, strtolower($workflow_name)); + $workflows = $this->helpWorkflows; + if ($workflows === null) { + $workflows = $this->workflows; + } + + $workflow = idx($workflows, strtolower($workflow_name)); if (!$workflow) { $out[] = $this->indent( $indent, diff --git a/src/parser/argument/workflow/PhutilHelpArgumentWorkflow.php b/src/parser/argument/workflow/PhutilHelpArgumentWorkflow.php --- a/src/parser/argument/workflow/PhutilHelpArgumentWorkflow.php +++ b/src/parser/argument/workflow/PhutilHelpArgumentWorkflow.php @@ -2,17 +2,6 @@ final class PhutilHelpArgumentWorkflow extends PhutilArgumentWorkflow { - private $runtime; - - public function setRuntime($runtime) { - $this->runtime = $runtime; - return $this; - } - - public function getRuntime() { - return $this->runtime; - } - protected function didConstruct() { $this->setName('help'); $this->setExamples(<<getArg('help-with-what'); - $runtime = $this->getRuntime(); - if ($runtime) { - $toolset = $runtime->getToolset(); - if ($toolset->getToolsetKey() === 'arc') { - $workflows = $args->getWorkflows(); - - $legacy = array(); - - $legacy[] = new ArcanistCloseRevisionWorkflow(); - $legacy[] = new ArcanistCommitWorkflow(); - $legacy[] = new ArcanistCoverWorkflow(); - $legacy[] = new ArcanistDiffWorkflow(); - $legacy[] = new ArcanistExportWorkflow(); - $legacy[] = new ArcanistGetConfigWorkflow(); - $legacy[] = new ArcanistSetConfigWorkflow(); - $legacy[] = new ArcanistInstallCertificateWorkflow(); - $legacy[] = new ArcanistLandWorkflow(); - $legacy[] = new ArcanistLintersWorkflow(); - $legacy[] = new ArcanistLintWorkflow(); - $legacy[] = new ArcanistListWorkflow(); - $legacy[] = new ArcanistPatchWorkflow(); - $legacy[] = new ArcanistPasteWorkflow(); - $legacy[] = new ArcanistTasksWorkflow(); - $legacy[] = new ArcanistTodoWorkflow(); - $legacy[] = new ArcanistUnitWorkflow(); - $legacy[] = new ArcanistWhichWorkflow(); - - foreach ($legacy as $workflow) { - // If this workflow has been updated but not removed from the list - // above yet, just skip it. - if ($workflow instanceof ArcanistArcWorkflow) { - continue; - } - - $workflows[] = $workflow->newLegacyPhutilWorkflow(); - } - - $args->setWorkflows($workflows); - } - } - if (!$with) { $args->printHelpAndExit(); } else { diff --git a/src/runtime/ArcanistRuntime.php b/src/runtime/ArcanistRuntime.php --- a/src/runtime/ArcanistRuntime.php +++ b/src/runtime/ArcanistRuntime.php @@ -162,6 +162,9 @@ // TOOLSETS: Some day, stop falling through to the old "arc" runtime. + $help_workflows = $this->getHelpWorkflows($phutil_workflows); + $args->setHelpWorkflows($help_workflows); + try { return $args->parseWorkflowsFull($phutil_workflows); } catch (ArcanistMissingArgumentTerminatorException $terminator_exception) { @@ -869,4 +872,41 @@ return $this->toolset; } + private function getHelpWorkflows(array $workflows) { + if ($this->getToolset()->getToolsetKey() === 'arc') { + $legacy = array(); + + $legacy[] = new ArcanistCloseRevisionWorkflow(); + $legacy[] = new ArcanistCommitWorkflow(); + $legacy[] = new ArcanistCoverWorkflow(); + $legacy[] = new ArcanistDiffWorkflow(); + $legacy[] = new ArcanistExportWorkflow(); + $legacy[] = new ArcanistGetConfigWorkflow(); + $legacy[] = new ArcanistSetConfigWorkflow(); + $legacy[] = new ArcanistInstallCertificateWorkflow(); + $legacy[] = new ArcanistLandWorkflow(); + $legacy[] = new ArcanistLintersWorkflow(); + $legacy[] = new ArcanistLintWorkflow(); + $legacy[] = new ArcanistListWorkflow(); + $legacy[] = new ArcanistPatchWorkflow(); + $legacy[] = new ArcanistPasteWorkflow(); + $legacy[] = new ArcanistTasksWorkflow(); + $legacy[] = new ArcanistTodoWorkflow(); + $legacy[] = new ArcanistUnitWorkflow(); + $legacy[] = new ArcanistWhichWorkflow(); + + foreach ($legacy as $workflow) { + // If this workflow has been updated but not removed from the list + // above yet, just skip it. + if ($workflow instanceof ArcanistArcWorkflow) { + continue; + } + + $workflows[] = $workflow->newLegacyPhutilWorkflow(); + } + } + + return $workflows; + } + } diff --git a/src/toolset/ArcanistWorkflowArgument.php b/src/toolset/ArcanistWorkflowArgument.php --- a/src/toolset/ArcanistWorkflowArgument.php +++ b/src/toolset/ArcanistWorkflowArgument.php @@ -41,6 +41,11 @@ $spec['param'] = $parameter; } + $help = $this->getHelp(); + if ($help !== null) { + $spec['help'] = $help; + } + return $spec; } diff --git a/src/toolset/workflow/ArcanistHelpWorkflow.php b/src/toolset/workflow/ArcanistHelpWorkflow.php --- a/src/toolset/workflow/ArcanistHelpWorkflow.php +++ b/src/toolset/workflow/ArcanistHelpWorkflow.php @@ -8,8 +8,7 @@ } public function newPhutilWorkflow() { - return id(new PhutilHelpArgumentWorkflow()) - ->setRuntime($this->getRuntime()); + return new PhutilHelpArgumentWorkflow(); } public function supportsToolset(ArcanistToolset $toolset) {