From: aude Date: Thu, 28 Apr 2016 21:22:12 +0000 (-0400) Subject: Add populateInterwiki maintenance script X-Git-Tag: 1.31.0-rc.0~4469^2 X-Git-Url: http://git.cyclocoop.org/%40spipnet%40?a=commitdiff_plain;h=0ac10f37906756f1e3a96c983787015534dd18f4;p=lhc%2Fweb%2Fwiklou.git Add populateInterwiki maintenance script This has been in Wikibase since 2012, but is not at all specific to Wikibase, and doesn't even require Wikibase to be enabled. Having this in core will make it available to more people and without the hassle of having to clone Wikibase to use the script. Bug: T114577 Change-Id: Ib521a65e616bdc4b81206a084289cb4750f0d1f5 --- diff --git a/autoload.php b/autoload.php index 0283d3c512..0d127b7757 100644 --- a/autoload.php +++ b/autoload.php @@ -1083,6 +1083,7 @@ $wgAutoloadLocalClasses = [ 'PopulateContentModel' => __DIR__ . '/maintenance/populateContentModel.php', 'PopulateFilearchiveSha1' => __DIR__ . '/maintenance/populateFilearchiveSha1.php', 'PopulateImageSha1' => __DIR__ . '/maintenance/populateImageSha1.php', + 'PopulateInterwiki' => __DIR__ . '/maintenance/populateInterwiki.php', 'PopulateLogSearch' => __DIR__ . '/maintenance/populateLogSearch.php', 'PopulateLogUsertext' => __DIR__ . '/maintenance/populateLogUsertext.php', 'PopulateParentId' => __DIR__ . '/maintenance/populateParentId.php', diff --git a/maintenance/populateInterwiki.php b/maintenance/populateInterwiki.php new file mode 100644 index 0000000000..5d32b998bd --- /dev/null +++ b/maintenance/populateInterwiki.php @@ -0,0 +1,171 @@ + + */ + +require_once __DIR__ . '/Maintenance.php'; + +class PopulateInterwiki extends Maintenance { + + /** + * @var string + */ + private $source; + + /** + * @var BagOStuff + */ + private $cache; + + public function __construct() { + parent::__construct(); + + $this->addDescription( <<addOption( 'source', 'Source wiki for interwiki table, such as ' + . 'https://en.wikipedia.org/w/api.php (the default)', false, true ); + $this->addOption( 'force', 'Run regardless of whether the database says it has ' + . 'been run already.' ); + } + + public function execute() { + $force = $this->getOption( 'force', false ); + $this->source = $this->getOption( 'source', 'https://en.wikipedia.org/w/api.php' ); + + $this->cache = wfGetMainCache(); + + $data = $this->fetchLinks(); + + if ( $data === false ) { + $this->error( "Error during fetching data." ); + } else { + $this->doPopulate( $data, $force ); + } + } + + /** + * @return array[]|bool The 'interwikimap' sub-array or false on failure. + */ + protected function fetchLinks() { + $url = wfArrayToCgi( [ + 'action' => 'query', + 'meta' => 'siteinfo', + 'siprop' => 'interwikimap', + 'sifilteriw' => 'local', + 'format' => 'json' + ] ); + + if ( !empty( $this->source ) ) { + $url = rtrim( $this->source, '?' ) . '?' . $url; + } + + $json = Http::get( $url ); + $data = json_decode( $json, true ); + + if ( is_array( $data ) ) { + return $data['query']['interwikimap']; + } else { + return false; + } + } + + /** + * @param array[] $data + * @param bool $force + * + * @return bool + */ + protected function doPopulate( array $data, $force ) { + $dbw = wfGetDB( DB_MASTER ); + + if ( !$force ) { + $row = $dbw->selectRow( + 'updatelog', + '1', + [ 'ul_key' => 'populate interwiki' ], + __METHOD__ + ); + + if ( $row ) { + $this->output( "Interwiki table already populated. Use php " . + "maintenance/populateInterwiki.php\n--force from the command line " . + "to override.\n" ); + return true; + } + } + + foreach ( $data as $d ) { + $prefix = $d['prefix']; + + $row = $dbw->selectRow( + 'interwiki', + '1', + [ 'iw_prefix' => $prefix ], + __METHOD__ + ); + + if ( ! $row ) { + $dbw->insert( + 'interwiki', + [ + 'iw_prefix' => $prefix, + 'iw_url' => $d['url'], + 'iw_local' => 1 + ], + __METHOD__, + 'IGNORE' + ); + } + + $this->clearCacheEntry( $prefix ); + } + + $this->output( "Interwiki links are populated.\n" ); + + return true; + } + + /** + * @param string $prefix + */ + private function clearCacheEntry( $prefix ) { + $key = wfMemcKey( 'interwiki', $prefix ); + $this->cache->delete( $key ); + } + +} + +$maintClass = PopulateInterwiki::class; +require_once RUN_MAINTENANCE_IF_MAIN;