From ffea02997b0e155959b8e8347ab8fd904ee69ce9 Mon Sep 17 00:00:00 2001 From: Justin Frydman Date: Mon, 9 Sep 2024 10:53:55 -0600 Subject: [PATCH] Allow arguments and options to be passed through to workflow scripts --- docs/workflows.md | 52 +++++++++++++++++++++++++++++++++++++++ src/Commands/Workflow.php | 26 ++++++++++++++------ 2 files changed, 71 insertions(+), 7 deletions(-) diff --git a/docs/workflows.md b/docs/workflows.md index acd18fe..5b5439b 100644 --- a/docs/workflows.md +++ b/docs/workflows.md @@ -37,6 +37,58 @@ pup workflow my-workflow pup do my-workflow ``` +### Pass additional arguments or options to a workflow + +You can pass through additional arguments and options to your workflow script. + +Example `test-script.sh`: +```bash +#!/usr/bin/env bash + +# Loop through all the arguments +while [[ "$#" -gt 0 ]]; do + case $1 in + --*=*) # Option in --option=value format + option="${1%%=*}" # Extract the option + value="${1#*=}" # Extract the value + echo "Option: $option, Value: $value" + shift + ;; + --*) # Option in --option format (expecting a separate value) + option=$1 + shift + if [[ "$1" && ! "$1" =~ ^-- ]]; then + value=$1 + echo "Option: $option, Value: $value" + shift + else + echo "Option: $option, No value provided" + fi + ;; + *) # Regular argument + echo "Argument: $1" + shift + ;; + esac +done +``` + +Example in `.puprc`: +```json +{ + "workflows": { + "my-test-workflow": [ + "./test-script.sh" + ] + } +} +``` + +Pass through arguments and options to `test-script.sh`: +```bash +pup workflow my-test-workflow -- arg1 arg2 otherArg --option-one=test1 --option-two=test2 +``` + ## Pseudo-workflows The `build` and `build_dev` properties within your `.puprc` file are also callable via the `workflow` command. diff --git a/src/Commands/Workflow.php b/src/Commands/Workflow.php index a0f7201..d4d33c3 100644 --- a/src/Commands/Workflow.php +++ b/src/Commands/Workflow.php @@ -19,11 +19,13 @@ class Workflow extends Command { */ protected function configure() { $this->setName( 'workflow' ) - ->setAliases( [ 'do' ] ) - ->addArgument( 'workflow', InputArgument::REQUIRED, 'The workflow you would like to run.' ) - ->addOption( 'root', null, InputOption::VALUE_REQUIRED, 'Set the root directory for running commands.' ) - ->setDescription( 'Run a command workflow.' ) - ->setHelp( 'Run a command workflow.' ); + ->setAliases( [ 'do' ] ) + ->addArgument( 'workflow', InputArgument::REQUIRED, 'The workflow you would like to run.' ) + ->addArgument( 'extra_args', InputArgument::IS_ARRAY, 'Additional arguments to pass to the workflow.' ) + ->addOption( 'root', null, InputOption::VALUE_REQUIRED, 'Set the root directory for running commands.' ) + ->addOption( 'extra_options', null, InputOption::VALUE_IS_ARRAY | InputOption::VALUE_OPTIONAL, 'Additional options to pass to the workflow.' ) + ->setDescription( 'Run a command workflow.' ) + ->setHelp( 'Run a command workflow.' ); } /** @@ -34,6 +36,8 @@ protected function execute( InputInterface $input, OutputInterface $output ) { $config = App::getConfig(); $root = $input->getOption( 'root' ); $workflow_slug = $input->getArgument( 'workflow' ); + $extra_args = $input->getArgument( 'extra_args' ); + $extra_options = $input->getOption( 'extra_options' ); $io = $this->getIO(); $application = $this->getApplication(); if ( ! $application ) { @@ -73,8 +77,16 @@ protected function execute( InputInterface $input, OutputInterface $output ) { $bail_on_failure = false; $step = substr( $step, 1 ); } - $io->section( "> {$step}" ); - system( Env::set( $step ), $result ); + + // Add extra arguments and options to the command. + $extra_args_string = implode( ' ', array_map( 'escapeshellarg', $extra_args ) ); + $extra_options_string = implode( ' ', array_map( static function ( $option ) { + return escapeshellarg( $option ); + }, $extra_options ) ); + $full_command = trim( "{$step} {$extra_args_string} {$extra_options_string}" ); + + $io->section( "> {$full_command}" ); + system( Env::set( $full_command ), $result ); $io->newLine(); if ( $result ) {