Skip to content

Commit

Permalink
Allow arguments and options to be passed through to workflow scripts (#…
Browse files Browse the repository at this point in the history
…24)

### Main Changes

Allow arguments and options to be passed through to underlying workflow
commands, e.g.

```bash
composer -- pup workflow set-version -- arg1 arg2 otherArg --option-one=test1 --option-two=test2
```


![image](https://github.com/user-attachments/assets/2c923671-3e4e-4b81-8e8a-f09c2dec8a7d)
  • Loading branch information
defunctl authored Sep 9, 2024
2 parents 78e37e6 + 6073114 commit fc79b6b
Show file tree
Hide file tree
Showing 6 changed files with 138 additions and 10 deletions.
52 changes: 52 additions & 0 deletions docs/workflows.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
26 changes: 19 additions & 7 deletions src/Commands/Workflow.php
Original file line number Diff line number Diff line change
Expand Up @@ -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.' );
}

/**
Expand All @@ -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 ) {
Expand Down Expand Up @@ -73,8 +77,16 @@ protected function execute( InputInterface $input, OutputInterface $output ) {
$bail_on_failure = false;
$step = substr( $step, 1 );
}
$io->section( "> <fg=cyan>{$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( "> <fg=cyan>{$full_command}</>" );
system( Env::set( $full_command ), $result );
$io->newLine();

if ( $result ) {
Expand Down
30 changes: 30 additions & 0 deletions tests/_data/test-workflow-script.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
#!/usr/bin/env bash

# A test workflow run via the test suite

# 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
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,6 @@
Checking for TBDs...
--------------------

./src/Plugin.php
9: * @since TBD

./src/Thing/AnotherFile.php
5: _deprecated_file( __FILE__, 'TBD' );
9: * @since TBD
Expand All @@ -14,5 +11,8 @@ Checking for TBDs...
28: * @deprecated TBD
32: _deprecated_function( __METHOD__, 'TBD' );

./src/Plugin.php
9: * @since TBD


TBDs have been found!
23 changes: 23 additions & 0 deletions tests/cli/Commands/WorkflowCest.php
Original file line number Diff line number Diff line change
Expand Up @@ -170,4 +170,27 @@ public function it_should_run_build_with_custom_env_vars( CliTester $I ) {
$output = $I->grabShellOutput();
$this->assertMatchesStringSnapshot( $output );
}

/**
* @test
*/
public function it_should_pass_additional_arguments_and_options_to_workflow_script( CliTester $I ) {
$puprc = $this->get_puprc();
$puprc['workflows'] = [];
$puprc['workflows']['test-workflow'] = [];
$puprc['workflows']['test-workflow'][] = codecept_data_dir( 'test-workflow-script.sh' );
$this->write_puprc( $puprc );

chdir( codecept_data_dir( 'fake-project' ) );

$I->runShellCommand( "php {$this->pup} do test-workflow -- arg1 arg2 --option-one=one --option-two=two" );
$I->seeResultCodeIs( 0 );
$I->seeInShellOutput( 'Argument: arg1' );
$I->seeInShellOutput( 'Argument: arg2' );
$I->seeInShellOutput( 'Option: --option-one, Value: one' );
$I->seeInShellOutput( 'Option: --option-two, Value: two' );

$output = $I->grabShellOutput();
$this->assertMatchesStringSnapshot( $output );
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
Running test-workflow workflow steps...

> /var/www/html/wp-content/plugins/pup/tests/_data/test-workflow-script.sh 'arg1' 'arg2' '--option-one=one' '--option-two=two'
------------------------------------------------------------------------------------------------------------------------------

Argument: arg1
Argument: arg2
Option: --option-one, Value: one
Option: --option-two, Value: two

Workflow complete.

0 comments on commit fc79b6b

Please sign in to comment.