X-Git-Url: https://scripts.mit.edu/gitweb/autoinstalls/mediawiki.git/blobdiff_plain/036b27389fdc19af6784c101fb7e56319de98b4c..83d871ca0d985c6d586b323bf96161afb510ebf6:/maintenance/rebuildLocalisationCache.php diff --git a/maintenance/rebuildLocalisationCache.php b/maintenance/rebuildLocalisationCache.php index 0ca99610..48602de0 100644 --- a/maintenance/rebuildLocalisationCache.php +++ b/maintenance/rebuildLocalisationCache.php @@ -25,21 +25,36 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * http://www.gnu.org/copyleft/gpl.html * + * @file * @ingroup Maintenance */ -require_once( dirname( __FILE__ ) . '/Maintenance.php' ); +require_once __DIR__ . '/Maintenance.php'; +/** + * Maintenance script to rebuild the localisation cache. + * + * @ingroup Maintenance + */ class RebuildLocalisationCache extends Maintenance { public function __construct() { parent::__construct(); - $this->mDescription = "Rebuild the localisation cache"; + $this->addDescription( 'Rebuild the localisation cache' ); $this->addOption( 'force', 'Rebuild all files, even ones not out of date' ); $this->addOption( 'threads', 'Fork more than one thread', false, true ); + $this->addOption( 'outdir', 'Override the output directory (normally $wgCacheDirectory)', + false, true ); + $this->addOption( 'lang', 'Only rebuild these languages, comma separated.', + false, true ); } - public function memoryLimit() { - return '200M'; + public function finalSetup() { + # This script needs to be run to build the inital l10n cache. But if + # $wgLanguageCode is not 'en', it won't be able to run because there is + # no l10n cache. Break the cycle by forcing $wgLanguageCode = 'en'. + global $wgLanguageCode; + $wgLanguageCode = 'en'; + parent::finalSetup(); } public function execute() { @@ -65,27 +80,43 @@ class RebuildLocalisationCache extends Maintenance { if ( $force ) { $conf['forceRecache'] = true; } - $lc = new LocalisationCache_BulkLoad( $conf ); + if ( $this->hasOption( 'outdir' ) ) { + $conf['storeDirectory'] = $this->getOption( 'outdir' ); + } + $lc = new LocalisationCacheBulkLoad( $conf ); - $codes = array_keys( Language::getLanguageNames( true ) ); + $allCodes = array_keys( Language::fetchLanguageNames( null, 'mwfile' ) ); + if ( $this->hasOption( 'lang' ) ) { + # Validate requested languages + $codes = array_intersect( $allCodes, + explode( ',', $this->getOption( 'lang' ) ) ); + # Bailed out if nothing is left + if ( count( $codes ) == 0 ) { + $this->error( 'None of the languages specified exists.', 1 ); + } + } else { + # By default get all languages + $codes = $allCodes; + } sort( $codes ); // Initialise and split into chunks $numRebuilt = 0; $total = count( $codes ); $chunks = array_chunk( $codes, ceil( count( $codes ) / $threads ) ); - $pids = array(); + $pids = []; + $parentStatus = 0; foreach ( $chunks as $codes ) { // Do not fork for only one thread $pid = ( $threads > 1 ) ? pcntl_fork() : -1; if ( $pid === 0 ) { // Child, reseed because there is no bug in PHP: - // http://bugs.php.net/bug.php?id=42465 + // https://bugs.php.net/bug.php?id=42465 mt_srand( getmypid() ); - $numRebuilt = $this->doRebuild( $codes, $lc, $force ); - // Abuse the exit value for the count of rebuild languages - exit( $numRebuilt ); + + $this->doRebuild( $codes, $lc, $force ); + exit( 0 ); } elseif ( $pid === -1 ) { // Fork failed or one thread, do it serialized $numRebuilt += $this->doRebuild( $codes, $lc, $force ); @@ -98,23 +129,30 @@ class RebuildLocalisationCache extends Maintenance { foreach ( $pids as $pid ) { $status = 0; pcntl_waitpid( $pid, $status ); - // Fetch the count from the return value - $numRebuilt += pcntl_wexitstatus( $status ); + if ( pcntl_wexitstatus( $status ) ) { + // Pass a fatal error code through to the caller + $parentStatus = pcntl_wexitstatus( $status ); + } } - $this->output( "$numRebuilt languages rebuilt out of $total\n" ); - if ( $numRebuilt === 0 ) { - $this->output( "Use --force to rebuild the caches which are still fresh.\n" ); + if ( !$pids ) { + $this->output( "$numRebuilt languages rebuilt out of $total\n" ); + if ( $numRebuilt === 0 ) { + $this->output( "Use --force to rebuild the caches which are still fresh.\n" ); + } + } + if ( $parentStatus ) { + exit( $parentStatus ); } } /** * Helper function to rebuild list of languages codes. Prints the code * for each language which is rebuilt. - * @param $codes list List of language codes to rebuild. - * @param $lc object Instance of LocalisationCache_BulkLoad (?) - * @param $force bool Rebuild up-to-date languages - * @return int Number of rebuilt languages + * @param array $codes List of language codes to rebuild. + * @param LocalisationCache $lc Instance of LocalisationCacheBulkLoad (?) + * @param bool $force Rebuild up-to-date languages + * @return int Number of rebuilt languages */ private function doRebuild( $codes, $lc, $force ) { $numRebuilt = 0; @@ -125,9 +163,19 @@ class RebuildLocalisationCache extends Maintenance { $numRebuilt++; } } + return $numRebuilt; } + + /** + * Sets whether a run of this maintenance script has the force parameter set + * + * @param bool $forced + */ + public function setForce( $forced = true ) { + $this->mOptions['force'] = $forced; + } } $maintClass = "RebuildLocalisationCache"; -require_once( RUN_MAINTENANCE_IF_MAIN ); +require_once RUN_MAINTENANCE_IF_MAIN;