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 @@ -370,6 +370,7 @@ 'ArcanistPlusOperatorOnStringsXHPASTLinterRuleTestCase' => 'lint/linter/xhpast/rules/__tests__/ArcanistPlusOperatorOnStringsXHPASTLinterRuleTestCase.php', 'ArcanistProjectConfigurationSource' => 'config/source/ArcanistProjectConfigurationSource.php', 'ArcanistPrompt' => 'toolset/ArcanistPrompt.php', + 'ArcanistPromptsWorkflow' => 'toolset/workflow/ArcanistPromptsWorkflow.php', 'ArcanistPublicPropertyXHPASTLinterRule' => 'lint/linter/xhpast/rules/ArcanistPublicPropertyXHPASTLinterRule.php', 'ArcanistPublicPropertyXHPASTLinterRuleTestCase' => 'lint/linter/xhpast/rules/__tests__/ArcanistPublicPropertyXHPASTLinterRuleTestCase.php', 'ArcanistPuppetLintLinter' => 'lint/linter/ArcanistPuppetLintLinter.php', @@ -1330,6 +1331,7 @@ 'ArcanistPlusOperatorOnStringsXHPASTLinterRuleTestCase' => 'ArcanistXHPASTLinterRuleTestCase', 'ArcanistProjectConfigurationSource' => 'ArcanistWorkingCopyConfigurationSource', 'ArcanistPrompt' => 'Phobject', + 'ArcanistPromptsWorkflow' => 'ArcanistWorkflow', 'ArcanistPublicPropertyXHPASTLinterRule' => 'ArcanistXHPASTLinterRule', 'ArcanistPublicPropertyXHPASTLinterRuleTestCase' => 'ArcanistXHPASTLinterRuleTestCase', 'ArcanistPuppetLintLinter' => 'ArcanistExternalLinter', diff --git a/src/toolset/workflow/ArcanistPromptsWorkflow.php b/src/toolset/workflow/ArcanistPromptsWorkflow.php new file mode 100644 --- /dev/null +++ b/src/toolset/workflow/ArcanistPromptsWorkflow.php @@ -0,0 +1,80 @@ + +EOTEXT +); + + return $this->newWorkflowInformation() + ->addExample(pht('**prompts** __workflow__')) + ->setHelp($help); + } + + public function getWorkflowArguments() { + return array( + $this->newWorkflowArgument('argv') + ->setWildcard(true), + ); + } + + public function runWorkflow() { + $argv = $this->getArgument('argv'); + + if (!$argv) { + throw new PhutilArgumentUsageException( + pht('Provide a workflow to list prompts for.')); + } + + $runtime = $this->getRuntime(); + $workflows = $runtime->getWorkflows(); + + $workflow_key = array_shift($argv); + $workflow = idx($workflows, $workflow_key); + + if (!$workflow) { + throw new PhutilArgumentUsageException( + pht( + 'Workflow "%s" is unknown. Supported workflows are: %s.', + $workflow_key, + implode(', ', array_keys($workflows)))); + } + + $prompts = $workflow->getPromptMap(); + if (!$prompts) { + echo tsprintf( + "%s\n", + pht('This workflow does not have any prompts.')); + return 0; + } + + foreach ($prompts as $prompt) { + echo tsprintf( + "**%s**\n", + $prompt->getKey()); + echo tsprintf( + "%s\n", + $prompt->getDescription()); + } + + return 0; + } + +} diff --git a/src/toolset/workflow/ArcanistShellCompleteWorkflow.php b/src/toolset/workflow/ArcanistShellCompleteWorkflow.php --- a/src/toolset/workflow/ArcanistShellCompleteWorkflow.php +++ b/src/toolset/workflow/ArcanistShellCompleteWorkflow.php @@ -226,7 +226,10 @@ $log->writeSuccess( pht('INSTALL'), - pht('Installing shell completion support for "%s".', $shell)); + pht( + 'Installing shell completion support for "%s" into "%s".', + $shell, + $file_display)); if ($replace) { $replace_pos = $matches[0][1]; diff --git a/src/workflow/ArcanistWorkflow.php b/src/workflow/ArcanistWorkflow.php --- a/src/workflow/ArcanistWorkflow.php +++ b/src/workflow/ArcanistWorkflow.php @@ -77,6 +77,7 @@ private $configurationSourceList; private $hardpointEngine; + private $promptMap; final public function setToolset(ArcanistToolset $toolset) { $this->toolset = $toolset; @@ -2333,4 +2334,63 @@ return $engine; } + protected function newPrompts() { + return array(); + } + + protected function newPrompt($key) { + return id(new ArcanistPrompt()) + ->setWorkflow($this) + ->setKey($key); + } + + public function hasPrompt($key) { + $map = $this->getPromptMap(); + return isset($map[$key]); + } + + public function getPromptMap() { + if ($this->promptMap === null) { + $prompts = $this->newPrompts(); + assert_instances_of($prompts, 'ArcanistPrompt'); + + $map = array(); + foreach ($prompts as $prompt) { + $key = $prompt->getKey(); + + if (isset($map[$key])) { + throw new Exception( + pht( + 'Workflow ("%s") generates two prompts with the same '. + 'key ("%s"). Each prompt a workflow generates must have a '. + 'unique key.', + get_class($this), + $key)); + } + + $map[$key] = $prompt; + } + + $this->promptMap = $map; + } + + return $this->promptMap; + } + + protected function getPrompt($key) { + $map = $this->getPromptMap(); + + $prompt = idx($map, $key); + if (!$prompt) { + throw new Exception( + pht( + 'Workflow ("%s") is requesting a prompt ("%s") but it did not '. + 'generate any prompt with that name in "newPrompts()".', + get_class($this), + $key)); + } + + return clone $prompt; + } + } diff --git a/support/shell/hooks/bash-completion.sh b/support/shell/hooks/bash-completion.sh --- a/support/shell/hooks/bash-completion.sh +++ b/support/shell/hooks/bash-completion.sh @@ -1,9 +1,10 @@ SCRIPTDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" > /dev/null && pwd )" +GENERATED_RULES_FILE="${SCRIPTDIR}/../rules/bash-rules.sh" # Try to generate the shell completion rules if they do not yet exist. -if [ ! -f "${SCRIPTDIR}/bash-rules.sh" ]; then +if [ ! -f "${GENERATED_RULES_FILE}" ]; then arc shell-complete --generate >/dev/null 2>/dev/null fi; # Source the shell completion rules. -source "${SCRIPTDIR}/../rules/bash-rules.sh" +source "${GENERATED_RULES_FILE}"