diff options
Diffstat (limited to 'www/wiki/extensions/Translate/scripts/processMessageChanges.php')
-rw-r--r-- | www/wiki/extensions/Translate/scripts/processMessageChanges.php | 164 |
1 files changed, 164 insertions, 0 deletions
diff --git a/www/wiki/extensions/Translate/scripts/processMessageChanges.php b/www/wiki/extensions/Translate/scripts/processMessageChanges.php new file mode 100644 index 00000000..cca7e8cd --- /dev/null +++ b/www/wiki/extensions/Translate/scripts/processMessageChanges.php @@ -0,0 +1,164 @@ +<?php +/** + * Script for processing message changes in file based message groups. + * + * @author Niklas Laxström + * + * @copyright Copyright © 2012-2013, Niklas Laxström + * @license GPL-2.0-or-later + * @file + */ + +// Standard boilerplate to define $IP +if ( getenv( 'MW_INSTALL_PATH' ) !== false ) { + $IP = getenv( 'MW_INSTALL_PATH' ); +} else { + $dir = __DIR__; + $IP = "$dir/../../.."; +} +require_once "$IP/maintenance/Maintenance.php"; + +/** + * Script for processing message changes in file based message groups. + * + * We used to process changes during web request, but that was too slow. With + * this command line script we can do all the work needed even if it takes + * some time. + * + * @since 2012-04-23 + */ +class ProcessMessageChanges extends Maintenance { + protected $changes = []; + + /** + * @var int + */ + protected $counter; + + public function __construct() { + parent::__construct(); + $this->mDescription = 'Script for processing message changes in file based message groups'; + $this->addOption( + 'group', + '(optional) Comma separated list of group IDs to process (can use * as wildcard). ' . + 'Default: "*"', + false, /*required*/ + true /*has arg*/ + ); + $this->addOption( + 'skipgroup', + '(optional) Comma separated list of group IDs to not process (can use * ' . + 'as wildcard). Overrides --group parameter.', + false, /*required*/ + true /*has arg*/ + ); + $this->addOption( + 'name', + '(optional) Unique name to avoid conflicts with multiple invocations of this script.', + false, /*required*/ + true /*has arg*/ + ); + $this->addOption( + 'safe-import', + '(optional) Import "safe" changes: message additions when no other kind of changes.', + false, /*required*/ + false /*has arg*/ + ); + } + + public function execute() { + $groups = $this->getGroups(); + $changes = []; + $comparator = new ExternalMessageSourceStateComparator(); + + $scripted = $this->hasOption( 'safe-import' ); + + /** @var FileBasedMessageGroup $group */ + foreach ( $groups as $id => $group ) { + if ( !$scripted ) { + $this->output( "Processing $id\n" ); + } + $changes[$id] = $comparator->processGroup( $group, $comparator::ALL_LANGUAGES ); + } + + // Remove all groups without changes + $changes = array_filter( $changes ); + + if ( $changes === [] ) { + if ( !$scripted ) { + $this->output( "No changes found\n" ); + } + + return; + } + + if ( $this->hasOption( 'safe-import' ) ) { + $importer = new ExternalMessageSourceStateImporter(); + $info = $importer->importSafe( $changes ); + $this->printChangeInfo( $info ); + + return; + } + + $name = $this->getOption( 'name', MessageChangeStorage::DEFAULT_NAME ); + if ( !MessageChangeStorage::isValidCdbName( $name ) ) { + $this->error( 'Invalid name', 1 ); + } + + $file = MessageChangeStorage::getCdbPath( $name ); + + MessageChangeStorage::writeChanges( $changes, $file ); + $url = SpecialPage::getTitleFor( 'ManageMessageGroups', $name )->getFullURL(); + $this->output( "Process changes at $url\n" ); + } + + /** + * Gets list of message groups filtered by user input. + * @return MessageGroup[] + */ + protected function getGroups() { + $groups = MessageGroups::getGroupsByType( 'FileBasedMessageGroup' ); + + // Include all if option not given + $include = $this->getOption( 'group', '*' ); + $include = explode( ',', $include ); + $include = array_map( 'trim', $include ); + $include = MessageGroups::expandWildcards( $include ); + + // Exclude nothing if option not given + $exclude = $this->getOption( 'skipgroup', '' ); + $exclude = explode( ',', $exclude ); + $exclude = array_map( 'trim', $exclude ); + $exclude = MessageGroups::expandWildcards( $exclude ); + + // Flip to allow isset + $include = array_flip( $include ); + $exclude = array_flip( $exclude ); + + $groups = array_filter( $groups, + function ( MessageGroup $group ) use ( $include, $exclude ) { + $id = $group->getId(); + + return isset( $include[$id] ) && !isset( $exclude[$id] ); + } + ); + + return $groups; + } + + protected function printChangeInfo( array $info ) { + foreach ( $info['processed'] as $group => $count ) { + $this->output( "Imported $count new messages or translations for $group.\n" ); + } + + if ( $info['skipped'] !== [] ) { + $skipped = implode( ', ', array_keys( $info['skipped'] ) ); + $this->output( "There are changes to check for groups $skipped.\n" ); + $url = SpecialPage::getTitleFor( 'ManageMessageGroups', $info['name'] )->getFullURL(); + $this->output( "You can process them at $url\n" ); + } + } +} + +$maintClass = ProcessMessageChanges::class; +require_once RUN_MAINTENANCE_IF_MAIN; |