From ce9228369ff5f9c96eb845eea5898405ef255116 Mon Sep 17 00:00:00 2001 From: Tim Starling Date: Fri, 4 Sep 2009 08:02:00 +0000 Subject: [PATCH] * Rewrote commandLine.inc to be a simple wrapper around Maintenance.php * Don't show help if the first argument is "help", only show it if there is a "--help" option. That makes more sense for the scripts that accept filenames as parameters and is the backwards-compatible behaviour. * Renamed spawnChild() to runChild(), spawn implies creating a new process to run simultaneously with the old one * Removed error_reporting override, that's a matter for local policy * s/private/protected --- maintenance/Maintenance.php | 28 ++-- maintenance/commandLine.inc | 272 +++------------------------------- maintenance/doMaintenance.php | 2 - maintenance/nukeNS.php | 2 +- maintenance/rebuildall.php | 6 +- 5 files changed, 37 insertions(+), 273 deletions(-) diff --git a/maintenance/Maintenance.php b/maintenance/Maintenance.php index 5855011315..107e66ab96 100644 --- a/maintenance/Maintenance.php +++ b/maintenance/Maintenance.php @@ -51,13 +51,13 @@ abstract class Maintenance { const STDIN_ALL = 'all'; // This is the desired params - private $mParams = array(); + protected $mParams = array(); // Array of desired args - private $mArgList = array(); + protected $mArgList = array(); // This is the list of options that were actually passed - private $mOptions = array(); + protected $mOptions = array(); // This is the list of arguments that were actually passed protected $mArgs = array(); @@ -66,14 +66,14 @@ abstract class Maintenance { protected $mSelf; // Special vars for params that are always used - private $mQuiet = false; - private $mDbUser, $mDbPass; + protected $mQuiet = false; + protected $mDbUser, $mDbPass; // A description of the script, children should change this protected $mDescription = ''; // Have we already loaded our user input? - private $mInputLoaded = false; + protected $mInputLoaded = false; // Batch size. If a script supports this, they should set // a default with setBatchSize() @@ -248,7 +248,7 @@ abstract class Maintenance { /** * Add the default parameters to the scripts */ - private function addDefaultParams() { + protected function addDefaultParams() { $this->addOption( 'help', "Display this help message" ); $this->addOption( 'quiet', "Whether to supress non-error output" ); $this->addOption( 'conf', "Location of LocalSettings.php, if not default", false, true ); @@ -267,13 +267,13 @@ abstract class Maintenance { } /** - * Spawn a child maintenance script. Pass all of the current arguments + * Run a child maintenance script. Pass all of the current arguments * to it. * @param $maintClass String A name of a child maintenance class * @param $classFile String Full path of where the child is * @return Maintenance child */ - protected function spawnChild( $maintClass, $classFile = null ) { + protected function runChild( $maintClass, $classFile = null ) { // If we haven't already specified, kill setup procedures // for child scripts, we've already got a sane environment self::disableSetup(); @@ -469,7 +469,7 @@ abstract class Maintenance { /** * Run some validation checks on the params, etc */ - private function validateParamsAndArgs() { + protected function validateParamsAndArgs() { $die = false; # Check to make sure we've got all the required options foreach( $this->mParams as $opt => $info ) { @@ -492,7 +492,7 @@ abstract class Maintenance { /** * Handle the special variables that are global to all scripts */ - private function loadSpecialVars() { + protected function loadSpecialVars() { if( $this->hasOption( 'dbuser' ) ) $this->mDbUser = $this->getOption( 'dbuser' ); if( $this->hasOption( 'dbpass' ) ) @@ -507,9 +507,9 @@ abstract class Maintenance { * Maybe show the help. * @param $force boolean Whether to force the help to show, default false */ - private function maybeHelp( $force = false ) { + protected function maybeHelp( $force = false ) { ksort( $this->mParams ); - if( $this->hasOption( 'help' ) || in_array( 'help', $this->mArgs ) || $force ) { + if( $this->hasOption( 'help' ) || $force ) { $this->mQuiet = false; if( $this->mDescription ) { $this->output( "\n" . $this->mDescription . "\n" ); @@ -754,7 +754,7 @@ abstract class Maintenance { * Return all of the core maintenance scripts * @return array */ - private static function getCoreScripts() { + protected static function getCoreScripts() { if( !self::$mCoreScripts ) { self::disableSetup(); $paths = array( diff --git a/maintenance/commandLine.inc b/maintenance/commandLine.inc index 15a37c8857..e241d5e931 100644 --- a/maintenance/commandLine.inc +++ b/maintenance/commandLine.inc @@ -1,264 +1,30 @@ 1 ) { - $option = $bits[0]; - $param = $bits[1]; - } else { - $param = 1; - } - $options[$option] = $param; - } - } elseif ( substr( $arg, 0, 1 ) == '-' ) { - # Short options - for ( $p=1; $paddOption( $name, '', false, true ); } - list( $site, $lang ) = $wgConf->siteFromDB( $db ); - # If not, work out the language and site the old way - if ( is_null( $site ) || is_null( $lang ) ) { - if ( !$db ) { - $lang = 'aa'; - } else { - $lang = $db; - } - if ( isset( $args[0] ) ) { - $site = array_shift( $args ); - } else { - $site = 'wikipedia'; - } - } - } else { - $lang = 'aa'; - $site = 'wikipedia'; - } - - # This is for the IRC scripts, which now run as the apache user - # The apache user doesn't have access to the wikiadmin_pass command - if ( $_ENV['USER'] == 'apache' ) { - #if ( posix_geteuid() == 48 ) { - $wgUseNormalUser = true; - } - - putenv( 'wikilang='.$lang); - - $DP = $IP; - ini_set( 'include_path', ".:$IP:$IP/includes:$IP/languages:$IP/maintenance" ); - - if ( $lang == 'test' && $site == 'wikipedia' ) { - define( 'TESTWIKI', 1 ); + # No help, it would just be misleading since it misses custom options + unset( $this->mParams['help'] ); } - - #require_once( $IP.'/includes/ProfilerStub.php' ); - require( $IP.'/includes/Defines.php' ); - require( $IP.'/CommonSettings.php' ); - if ( !$wgUseNormalUser && is_readable( "$IP/AdminSettings.php" ) ) { - require( "$IP/AdminSettings.php" ); - } -} else { - $wgWikiFarm = false; - if ( isset( $options['conf'] ) ) { - $settingsFile = $options['conf']; - } else { - $settingsFile = "$IP/LocalSettings.php"; - } - if ( isset( $options['wiki'] ) ) { - $bits = explode( '-', $options['wiki'] ); - if ( count( $bits ) == 1 ) { - $bits[] = ''; - } - define( 'MW_DB', $bits[0] ); - define( 'MW_PREFIX', $bits[1] ); - } - - if ( ! is_readable( $settingsFile ) ) { - print "A copy of your installation's LocalSettings.php\n" . - "must exist and be readable in the source directory.\n"; - exit( 1 ); - } - $wgCommandLineMode = true; - $DP = $IP; - require_once( "$IP/includes/AutoLoader.php" ); - require_once( "$IP/includes/Defines.php" ); - require_once( $settingsFile ); - /* ini_set( 'include_path', ".$sep$IP$sep$IP/includes$sep$IP/languages$sep$IP/maintenance" ); */ - - $adminSettings = isset( $options['aconf'] ) - ? $options['aconf'] - : "{$IP}/AdminSettings.php"; - if( is_readable( $adminSettings ) ) - require_once( $adminSettings ); - -} - -# Turn off output buffering again, it might have been turned on in the settings files -if( ob_get_level() ) { - ob_end_flush(); -} -# Same with these -$wgCommandLineMode = true; - -if ( empty( $wgUseNormalUser ) && isset( $wgDBadminuser ) ) { - $wgDBuser = $wgDBadminuser; - $wgDBpassword = $wgDBadminpassword; - - if( $wgDBservers ) { - foreach ( $wgDBservers as $i => $server ) { - $wgDBservers[$i]['user'] = $wgDBuser; - $wgDBservers[$i]['password'] = $wgDBpassword; - } - } - if( isset( $wgLBFactoryConf['serverTemplate'] ) ) { - $wgLBFactoryConf['serverTemplate']['user'] = $wgDBuser; - $wgLBFactoryConf['serverTemplate']['password'] = $wgDBpassword; - } -} - -if ( defined( 'MW_CMDLINE_CALLBACK' ) ) { - $fn = MW_CMDLINE_CALLBACK; - $fn(); -} - -ini_set( 'memory_limit', -1 ); -if( version_compare( phpversion(), '5.2.4' ) >= 0 ) { - // Send PHP warnings and errors to stderr instead of stdout. - // This aids in diagnosing problems, while keeping messages - // out of redirected output. - if( ini_get( 'display_errors' ) ) { - ini_set( 'display_errors', 'stderr' ); + public function execute() { + global $args, $options; + $args = $this->mArgs; + $options = $this->mOptions; } - - // Don't touch the setting on earlier versions of PHP, - // as setting it would disable output if you'd wanted it. - - // Note that exceptions are also sent to stderr when - // command-line mode is on, regardless of PHP version. } -$wgShowSQLErrors = true; -require_once( "$IP/includes/Setup.php" ); -require_once( "$IP/maintenance/install-utils.inc" ); -$wgTitle = null; # Much much faster startup than creating a title object -@set_time_limit(0); +$maintClass = 'CommandLineInc'; +require( DO_MAINTENANCE ); -$wgProfiling = false; // only for Profiler.php mode; avoids OOM errors diff --git a/maintenance/doMaintenance.php b/maintenance/doMaintenance.php index 57e34fe526..3453a5f241 100644 --- a/maintenance/doMaintenance.php +++ b/maintenance/doMaintenance.php @@ -31,8 +31,6 @@ if ( !defined( 'DO_MAINTENANCE' ) ) { exit( 1 ); } -error_reporting( E_ALL | E_STRICT ); - if( !$maintClass || !class_exists( $maintClass ) ) { echo "\$maintClass is not set or is set to a non-existent class."; exit( 1 ); diff --git a/maintenance/nukeNS.php b/maintenance/nukeNS.php index 81545b1447..21e921fecc 100644 --- a/maintenance/nukeNS.php +++ b/maintenance/nukeNS.php @@ -80,7 +80,7 @@ class NukeNS extends Maintenance { $dbw->query( "DELETE FROM $tbl_pag WHERE page_id = $id" ); $dbw->commit(); // Delete revisions as appropriate - $child = $this->spawnChild( 'NukePage', 'NukePage.php' ); + $child = $this->runChild( 'NukePage', 'NukePage.php' ); $child->deleteRevisions( $revs ); $this->purgeRedundantText( true ); $n_deleted ++; diff --git a/maintenance/rebuildall.php b/maintenance/rebuildall.php index a27eca68c8..6b3c333e54 100644 --- a/maintenance/rebuildall.php +++ b/maintenance/rebuildall.php @@ -34,18 +34,18 @@ class RebuildAll extends Maintenance { // Rebuild the text index if ( $wgDBtype == 'mysql' ) { $this->output( "** Rebuilding fulltext search index (if you abort this will break searching; run this script again to fix):\n" ); - $rebuildText = $this->spawnChild( 'RebuildTextIndex', 'rebuildtextindex.php' ); + $rebuildText = $this->runChild( 'RebuildTextIndex', 'rebuildtextindex.php' ); $rebuildText->execute(); } // Rebuild RC $this->output( "\n\n** Rebuilding recentchanges table:\n" ); - $rebuildRC = $this->spawnChild( 'RebuildRecentchanges', 'rebuildrecentchanges.php' ); + $rebuildRC = $this->runChild( 'RebuildRecentchanges', 'rebuildrecentchanges.php' ); $rebuildRC->execute(); // Rebuild link tables $this->output( "\n\n** Rebuilding links tables -- this can take a long time. It should be safe to abort via ctrl+C if you get bored.\n" ); - $rebuildLinks = $this->spawnChild( 'RefreshLinks', 'refreshLinks.php' ); + $rebuildLinks = $this->runChild( 'RefreshLinks', 'refreshLinks.php' ); $rebuildLinks->execute(); $this->output( "Done.\n" ); -- 2.20.1