From 1ae06b4f3e85868e118ff46a393eb73de09bf34f Mon Sep 17 00:00:00 2001 From: Andrew H Date: Wed, 30 Dec 2015 20:43:10 +0000 Subject: [PATCH] Add loadWithArgv() to Maintenance class Very useful for passing in arguments to test Maintenance scripts. Also, add a comment clarifying when $orderedOptions is available. Change-Id: Ib25b3b36816bdf566c427b67646554a31a9fef0f --- maintenance/Maintenance.php | 85 +++++++++++-------- tests/phpunit/maintenance/MaintenanceTest.php | 14 +-- 2 files changed, 51 insertions(+), 48 deletions(-) diff --git a/maintenance/Maintenance.php b/maintenance/Maintenance.php index 3dd7ee8893..e90812d28e 100644 --- a/maintenance/Maintenance.php +++ b/maintenance/Maintenance.php @@ -123,12 +123,13 @@ abstract class Maintenance { private $config; /** - * Used to read the options in the order - * they were passed. Useful for option - * chaining. (Ex. dumpBackup.php) + * Used to read the options in the order they were passed. + * Useful for option chaining (Ex. dumpBackup.php). It will + * be an empty array if the options are passed in through + * loadParamsAndArgs( $self, $opts, $args ). * * This is an array of arrays where - * 0 => the option and 1 => parameter value + * 0 => the option and 1 => parameter value. * * @var array */ @@ -654,41 +655,13 @@ abstract class Maintenance { } /** - * Process command line arguments - * $mOptions becomes an array with keys set to the option names - * $mArgs becomes a zero-based array containing the non-option arguments + * Load params and arguments from a given array + * of command-line arguments * - * @param string $self The name of the script, if any - * @param array $opts An array of options, in form of key=>value - * @param array $args An array of command line arguments + * @since 1.27 + * @param array $argv */ - public function loadParamsAndArgs( $self = null, $opts = null, $args = null ) { - # If we were given opts or args, set those and return early - if ( $self ) { - $this->mSelf = $self; - $this->mInputLoaded = true; - } - if ( $opts ) { - $this->mOptions = $opts; - $this->mInputLoaded = true; - } - if ( $args ) { - $this->mArgs = $args; - $this->mInputLoaded = true; - } - - # If we've already loaded input (either by user values or from $argv) - # skip on loading it again. The array_shift() will corrupt values if - # it's run again and again - if ( $this->mInputLoaded ) { - $this->loadSpecialVars(); - - return; - } - - global $argv; - $this->mSelf = array_shift( $argv ); - + public function loadWithArgv( $argv ) { $options = array(); $args = array(); $this->orderedOptions = array(); @@ -790,6 +763,44 @@ abstract class Maintenance { } } + /** + * Process command line arguments + * $mOptions becomes an array with keys set to the option names + * $mArgs becomes a zero-based array containing the non-option arguments + * + * @param string $self The name of the script, if any + * @param array $opts An array of options, in form of key=>value + * @param array $args An array of command line arguments + */ + public function loadParamsAndArgs( $self = null, $opts = null, $args = null ) { + # If we were given opts or args, set those and return early + if ( $self ) { + $this->mSelf = $self; + $this->mInputLoaded = true; + } + if ( $opts ) { + $this->mOptions = $opts; + $this->mInputLoaded = true; + } + if ( $args ) { + $this->mArgs = $args; + $this->mInputLoaded = true; + } + + # If we've already loaded input (either by user values or from $argv) + # skip on loading it again. The array_shift() will corrupt values if + # it's run again and again + if ( $this->mInputLoaded ) { + $this->loadSpecialVars(); + + return; + } + + global $argv; + $this->mSelf = $argv[0]; + $this->loadWithArgv( array_slice( $argv, 1 ) ); + } + /** * Run some validation checks on the params, etc */ diff --git a/tests/phpunit/maintenance/MaintenanceTest.php b/tests/phpunit/maintenance/MaintenanceTest.php index 7b84dfa84e..245a97af17 100644 --- a/tests/phpunit/maintenance/MaintenanceTest.php +++ b/tests/phpunit/maintenance/MaintenanceTest.php @@ -841,14 +841,10 @@ class MaintenanceTest extends MediaWikiTestCase { } function testParseArgs() { - global $argv; - $oldArgv = $argv; - - $argv = array( '', '--multi', 'this1', '--multi', 'this2' ); $m2 = new MaintenanceFixup( $this ); // Create an option with an argument allowed to be specified multiple times $m2->addOption( 'multi', 'This option does stuff', false, true, false, true ); - $m2->loadParamsAndArgs(); + $m2->loadWithArgv( array( '--multi', 'this1', '--multi', 'this2' ) ); $this->assertEquals( array( 'this1', 'this2' ), $m2->getOption( 'multi' ) ); $this->assertEquals( array( array( 'multi', 'this1' ), array( 'multi', 'this2' ) ), @@ -856,28 +852,24 @@ class MaintenanceTest extends MediaWikiTestCase { $m2->simulateShutdown(); - $argv = array( '', '--multi', '--multi' ); $m2 = new MaintenanceFixup( $this ); $m2->addOption( 'multi', 'This option does stuff', false, false, false, true ); - $m2->loadParamsAndArgs(); + $m2->loadWithArgv( array( '--multi', '--multi' ) ); $this->assertEquals( array( 1, 1 ), $m2->getOption( 'multi' ) ); $this->assertEquals( array( array( 'multi', 1 ), array( 'multi', 1 ) ), $m2->orderedOptions ); $m2->simulateShutdown(); - $argv = array( '', '--multi=yo' ); $m2 = new MaintenanceFixup( $this ); // Create an option with an argument allowed to be specified multiple times $m2->addOption( 'multi', 'This option doesn\'t actually support multiple occurrences' ); - $m2->loadParamsAndArgs(); + $m2->loadWithArgv( array( '--multi=yo' ) ); $this->assertEquals( 'yo', $m2->getOption( 'multi' ) ); $this->assertEquals( array( array( 'multi', 'yo' ) ), $m2->orderedOptions ); $m2->simulateShutdown(); - - $argv = $oldArgv; } } -- 2.20.1