diff options
Diffstat (limited to 'MLEB/Translate/scripts/createCheckIndex.php')
-rw-r--r-- | MLEB/Translate/scripts/createCheckIndex.php | 110 |
1 files changed, 66 insertions, 44 deletions
diff --git a/MLEB/Translate/scripts/createCheckIndex.php b/MLEB/Translate/scripts/createCheckIndex.php index 6b6f4296..24e2ae4a 100644 --- a/MLEB/Translate/scripts/createCheckIndex.php +++ b/MLEB/Translate/scripts/createCheckIndex.php @@ -10,6 +10,8 @@ */ // Standard boilerplate to define $IP +use MediaWiki\MediaWikiServices; + if ( getenv( 'MW_INSTALL_PATH' ) !== false ) { $IP = getenv( 'MW_INSTALL_PATH' ); } else { @@ -21,19 +23,26 @@ require_once "$IP/maintenance/Maintenance.php"; class CreateCheckIndex extends Maintenance { public function __construct() { parent::__construct(); - $this->mDescription = 'Creates serialised database of messages that need ' . - 'checking for problems.'; + $this->addDescription( 'Creates serialised database of messages that need ' . + 'checking for problems.' ); $this->addOption( 'group', - '(optional) Comma separated list of group IDs to process (can use * as wildcard). ' . - 'Default: "*"', - false, /*required*/ + 'Comma separated list of group IDs to process (can use * as wildcard).', + true, /*required*/ true /*has arg*/ ); + + $this->addOption( + 'verbose', + '(optional) Enable verbose logging. Default: off', + false, /*required*/ + false /*has arg*/ + ); + $this->requireExtension( 'Translate' ); } public function execute() { - $codes = Language::fetchLanguageNames( false ); + $codes = Language::fetchLanguageNames( null, Language::ALL ); // Exclude the documentation language code global $wgTranslateDocumentationLanguageCode; @@ -41,41 +50,42 @@ class CreateCheckIndex extends Maintenance { unset( $codes[$wgTranslateDocumentationLanguageCode] ); } - $reqGroups = $this->getOption( 'group' ); - if ( $reqGroups ) { - $reqGroups = explode( ',', $reqGroups ); - $reqGroups = array_map( 'trim', $reqGroups ); - $reqGroups = MessageGroups::expandWildcards( $reqGroups ); - } + $reqGroupsPattern = $this->getOption( 'group' ); + $reqGroups = explode( ',', $reqGroupsPattern ); + $reqGroups = array_map( 'trim', $reqGroups ); + $reqGroups = MessageGroups::expandWildcards( $reqGroups ); - $verbose = isset( $options['verbose'] ); + $verbose = $this->hasOption( 'verbose' ); + + if ( !$reqGroups ) { + $this->fatalError( "Pattern '$reqGroupsPattern' did not match any groups" ); + } $groups = MessageGroups::singleton()->getGroups(); + $contLang = MediaWikiServices::getInstance()->getContentLanguage(); - /** @var $g MessageGroup */ - foreach ( $groups as $g ) { + /** @var MessageGroup $g */ + foreach ( $reqGroups as $id ) { + $g = MessageGroups::getGroup( $id ); + // Aliases may have changed the id $id = $g->getId(); $sourceLanguage = $g->getSourceLanguage(); - // Skip groups that are not requested - if ( $reqGroups && !in_array( $id, $reqGroups ) ) { - unset( $g ); - continue; - } - - $checker = $g->getChecker(); - if ( !$checker ) { + $validator = $g->getValidator(); + if ( !$validator ) { unset( $g ); + $this->output( "Skipping group $id due to lack of validators" ); continue; } // Initialise messages, using unique definitions if appropriate + // @phan-suppress-next-line PhanParamTooMany MessageGroupOld takes two args $collection = $g->initCollection( $sourceLanguage, true ); if ( !count( $collection ) ) { continue; } - $this->output( "Working with $id: ", $id ); + $this->output( "Processing group $id: ", $id ); // Skip source language code $langCodes = $codes; @@ -91,20 +101,21 @@ class CreateCheckIndex extends Maintenance { $collection->resetForNewLanguage( $code ); $collection->loadTranslations(); - - global $wgContLang; + $collection->filter( 'ignored' ); + $collection->filter( 'fuzzy' ); + $collection->filter( 'translated', false ); foreach ( $collection as $key => $message ) { - $prob = $checker->checkMessageFast( $message, $code ); - if ( $prob ) { + $result = $validator->quickValidate( $message, $code ); + if ( $result->hasIssues() ) { if ( $verbose ) { // Print it - $nsText = $wgContLang->getNsText( $g->namespaces[0] ); + $nsText = $contLang->getNsText( $g->getNamespace() ); $this->output( "# [[$nsText:$key/$code]]\n" ); } // Add it to the array - $problematic[] = [ $g->namespaces[0], "$key/$code" ]; + $problematic[] = [ $g->getNamespace(), "$key/$code" ]; } } @@ -113,28 +124,39 @@ class CreateCheckIndex extends Maintenance { } } - public static function tagFuzzy( $problematic ) { - if ( !count( $problematic ) ) { + public static function tagFuzzy( array $problematic ): void { + if ( $problematic === [] ) { return; } + $titleConditions = []; $dbw = wfGetDB( DB_MASTER ); + foreach ( $problematic as $p ) { + // Normalize page key $title = Title::makeTitleSafe( $p[0], $p[1] ); $titleText = $title->getDBkey(); - $res = $dbw->select( 'page', [ 'page_id', 'page_latest' ], - [ 'page_namespace' => $p[0], 'page_title' => $titleText ], __METHOD__ ); - - $inserts = []; - foreach ( $res as $r ) { - $inserts = [ - 'rt_page' => $r->page_id, - 'rt_revision' => $r->page_latest, - 'rt_type' => RevTag::getType( 'fuzzy' ) - ]; - } - $dbw->replace( 'revtag', 'rt_type_page_revision', $inserts, __METHOD__ ); + $titleConditions[] = $dbw->makeList( + [ + 'page_namespace' => $p[0], + 'page_title' => $titleText + ], + LIST_AND + ); + } + + $conds = $dbw->makeList( $titleConditions, LIST_OR ); + + $res = $dbw->select( 'page', [ 'page_id', 'page_latest' ], $conds, __METHOD__ ); + $inserts = []; + foreach ( $res as $row ) { + $inserts[] = [ + 'rt_page' => $row->page_id, + 'rt_revision' => $row->page_latest, + 'rt_type' => RevTag::getType( 'fuzzy' ) + ]; } + $dbw->replace( 'revtag', 'rt_type_page_revision', $inserts, __METHOD__ ); } } |