Seb35 has uploaded a new change for review. ( https://gerrit.wikimedia.org/r/329223 )
Change subject: Change internal data structure for extensions ...................................................................... Change internal data structure for extensions Architecture: * Previously there were two associative arrays for extensions and skins, with $name => $loadingMechanism. Now there is only one (list) array with values array( $name, $type, $loadingMechanism, $initialOrder ), with $type == 'extension' or 'skin'. The order of this list is used to create the LocalSettings.php. This change is in preparation of Composer-managed extensions, to allow activation of some extensions before other (typically PageForms 4.0+ and SemanticFormsSelect). * The extensions+skins list can be sorted. Currently it is sorted with the following order: require_once(skins), require_once(exts), wfLoadSkin, wfLoadExtension. The sorting is stable, so that it is possible to impose some order inside each category. Code: * The previous associative array is transformed in a list of tuples because standard PHP functions do not allow to sort by key *and* value (it’s key *xor* value). The new information $initialOrder is added to allow a stable sort (standard PHP sorting is not stable). Change-Id: Idb60c537da3c99a9cdec7a80f31acaf597bcd1fa --- M src/MediaWikiFarm.php M src/main.php M tests/phpunit/ConfigurationTest.php M tests/phpunit/InstallationIndependantTest.php M tests/phpunit/LoadingTest.php 5 files changed, 121 insertions(+), 115 deletions(-) git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/MediaWikiFarm refs/changes/23/329223/1 diff --git a/src/MediaWikiFarm.php b/src/MediaWikiFarm.php index 5f5c309..7c544b5 100644 --- a/src/MediaWikiFarm.php +++ b/src/MediaWikiFarm.php @@ -73,7 +73,6 @@ protected $configuration = array( 'settings' => array(), 'arrays' => array(), - 'skins' => array(), 'extensions' => array(), 'execFiles' => array(), ); @@ -174,8 +173,7 @@ * This associative array contains four sections: * - 'settings': associative array of MediaWiki configuration (e.g. 'wgServer' => '//example.org'); * - 'arrays': associative array of MediaWiki configuration of type array (e.g. 'wgGroupPermissions' => array( 'edit' => false )); - * - 'skins': associative array of skins configuration (e.g. 'Vector' => 'wfLoadSkin' ); - * - 'extensions': associative array of extensions configuration (e.g. 'ParserFunctions' => 'wfLoadExtension' ); + * - 'extensions': list of extensions and skins (e.g. 0 => array( 'ParserFunctions', 'extension', 'wfLoadExtension' )); * - 'execFiles': list of PHP files to execute at the end. * * @mediawikifarm-const @@ -360,30 +358,31 @@ $GLOBALS[$setting] = self::arrayMerge( $GLOBALS[$setting], $value ); } - # Load skins with the wfLoadSkin mechanism - foreach( $this->configuration['skins'] as $skin => $value ) { + # Load extensions and skins with the wfLoadExtension/wfLoadSkin mechanism + $loadMediaWikiFarm = false; + foreach( $this->configuration['extensions'] as $extension ) { - if( $value == 'wfLoadSkin' ) { + if( $extension[2] == 'wfLoadExtension' ) { - wfLoadSkin( $skin ); + if( $extension[0] != 'MediaWikiFarm' || !$this->codeDir ) { + wfLoadExtension( $extension[0] ); + } else { + wfLoadExtension( 'MediaWikiFarm', $this->farmDir . '/extension.json' ); + $loadedMediaWikiFarm = true; + } } - } + elseif( $extension[2] == 'wfLoadSkin' ) { - # Load extensions with the wfLoadExtension mechanism - foreach( $this->configuration['extensions'] as $extension => $value ) { + wfLoadSkin( $extension[0] ); + } + elseif( $extension[0] == 'MediaWikiFarm' && $extension[1] == 'extension' && $extension[2] == 'require_once' ) { - if( $value == 'wfLoadExtension' && ( $extension != 'MediaWikiFarm' || !$this->codeDir ) ) { - - wfLoadExtension( $extension ); + $loadMediaWikiFarm = true; } } # Register this extension MediaWikiFarm to appear in Special:Version - if( $this->configuration['extensions']['MediaWikiFarm'] == 'wfLoadExtension' && $this->codeDir ) { - - wfLoadExtension( 'MediaWikiFarm', $this->farmDir . '/extension.json' ); - } - elseif( $this->configuration['extensions']['MediaWikiFarm'] == 'require_once' ) { + if( $loadMediaWikiFarm ) { $GLOBALS['wgExtensionCredits']['other'][] = array( 'path' => $this->farmDir . '/MediaWikiFarm.php', 'name' => 'MediaWikiFarm', @@ -875,7 +874,6 @@ * The returned array has the following format: * array( 'settings' => array( 'wgSitename' => 'Foo', ... ), * 'arrays' => array( 'wgGroupPermission' => array(), ... ), - * 'skins' => 'wfLoadSkin'|'require_once', * 'extensions' => 'wfLoadExtension'|'require_once', * ) * @@ -1161,7 +1159,7 @@ if( is_null( $loadingMechanism ) ) { $settings[$setting] = false; } else { - $this->configuration[$type.'s'][$name] = $loadingMechanism; + $this->configuration['extensions'][] = array( $name, $type, $loadingMechanism, count( $this->configuration['extensions'] ) ); $settings[preg_replace( '/[^a-zA-Z0-9_\x7f\xff]/', '', $setting )] = true; } } @@ -1174,7 +1172,7 @@ if( $value !== true ) { $loadingMechanism = $value; } - $this->configuration['extensions'][$name] = $loadingMechanism; + $this->configuration['extensions'][] = array( $name, 'extension', $loadingMechanism, count( $this->configuration['extensions'] ) ); $settings['wgUseExtension'.preg_replace( '/[^a-zA-Z0-9_\x7f\xff]/', '', $name )] = true; unset( $settings[$setting] ); } else { @@ -1183,7 +1181,7 @@ if( $value !== true ) { $loadingMechanism = $value; } - $this->configuration['skins'][$name] = $loadingMechanism; + $this->configuration['extensions'][] = array( $name, 'skin', $loadingMechanism, count( $this->configuration['extensions'] ) ); $settings['wgUseSkin'.preg_replace( '/[^a-zA-Z0-9_\x7f\xff]/', '', $name )] = true; unset( $settings[$setting] ); } @@ -1196,10 +1194,12 @@ } $settings['wgUseExtensionMediaWikiFarm'] = true; - $this->configuration['extensions']['MediaWikiFarm'] = 'require_once'; if( $this->parameters['ExtensionRegistry'] ) { - $this->configuration['extensions']['MediaWikiFarm'] = 'wfLoadExtension'; + $this->configuration['extensions'][] = array( 'MediaWikiFarm', 'extension', 'wfLoadExtension', count( $this->configuration['extensions'] ) ); + } else { + $this->configuration['extensions'][] = array( 'MediaWikiFarm', 'extension', 'require_once', count( $this->configuration['extensions'] ) ); } + usort( $this->configuration['extensions'], array( 'MediaWikiFarm', 'sortExtensions' ) ); } /** @@ -1236,6 +1236,32 @@ } /** + * Sort extensions. + * + * @param array $a First element. + * @param array $b Second element. + * @return int Relative order of the two elements. + */ + function sortExtensions( $a, $b ) { + + static $loading = array( + 'require_once' => 10, + 'composer' => 20, + 'wfLoadSkin' => 20, + 'wfLoadExtension' => 20, + ); + static $type = array( + 'skin' => 1, + 'extension' => 2, + ); + + $weight = $loading[$a[2]] + $type[$a[1]] - $loading[$b[2]] - $type[$b[1]]; + $stability = $a[3] - $b[3]; + + return $weight ? $weight : $stability; + } + + /** * Create a LocalSettings.php. * * A previous mechanism tested in this extension was to load each category of @@ -1257,28 +1283,37 @@ $localSettings .= "\n" . $preconfig; } - # Skins loaded with require_once - $require_once = false; - foreach( $configuration['skins'] as $skin => $loading ) { - if( $loading == 'require_once' ) { - if( !$require_once ) { - $require_once = true; - $localSettings .= "\n# Skins loaded with require_once\n"; - } - $localSettings .= "require_once \"\$IP/skins/$skin/$skin.php\";\n"; + # Sort extensions and skins by loading mechanism + $extensions = array( + 'extension' => array( + 'require_once' => '', + 'wfLoadExtension' => '', + ), + 'skin' => array( + 'require_once' => '', + 'wfLoadSkin' => '', + ), + ); + foreach( $configuration['extensions'] as $extension ) { + if( $extension[2] == 'require_once' ) { + $extensions[$extension[1]]['require_once'] .= "require_once \"\$IP/{$extension[1]}s/{$extension[0]}/{$extension[0]}.php\";\n"; + } elseif( $extension == array( 'MediaWikiFarm', 'extension', 'wfLoadExtension' ) && $this->codeDir ) { + $extensions['extension']['wfLoadExtension'] .= "wfLoadExtension( 'MediaWikiFarm', " . var_export( $this->farmDir . '/extension.json', true ) . " );\n"; + } elseif( $extension[2] == 'wfLoad' . ucfirst( $extension[1] ) ) { + $extensions[$extension[1]]['wfLoad' . ucfirst( $extension[1] )] .= 'wfLoad' . ucfirst( $extension[1] ) . '( ' . var_export( $extension[0], true ) . " );\n"; } } + # Skins loaded with require_once + if( $extensions['skin']['require_once'] ) { + $localSettings .= "\n# Skins loaded with require_once\n"; + $localSettings .= $extensions['skin']['require_once']; + } + # Extensions loaded with require_once - $require_once = false; - foreach( $configuration['extensions'] as $extension => $loading ) { - if( $loading == 'require_once' ) { - if( !$require_once ) { - $require_once = true; - $localSettings .= "\n# Extensions loaded with require_once\n"; - } - $localSettings .= "require_once \"\$IP/extensions/$extension/$extension.php\";\n"; - } + if( $extensions['extension']['require_once'] ) { + $localSettings .= "\n# Extensions loaded with require_once\n"; + $localSettings .= $extensions['extension']['require_once']; } # General settings @@ -1297,23 +1332,15 @@ } # Skins loaded with wfLoadSkin - $localSettings .= "\n# Skins\n"; - foreach( $configuration['skins'] as $skin => $loading ) { - if( $loading == 'wfLoadSkin' ) { - $localSettings .= "wfLoadSkin( '$skin' );\n"; - } + if( $extensions['skin']['wfLoadSkin'] ) { + $localSettings .= "\n# Skins\n"; + $localSettings .= $extensions['skin']['wfLoadSkin']; } # Extensions loaded with wfLoadExtension - $localSettings .= "\n# Extensions\n"; - foreach( $configuration['extensions'] as $extension => $loading ) { - if( $loading == 'wfLoadExtension' ) { - if( $extension != 'MediaWikiFarm' || !$this->codeDir ) { - $localSettings .= "wfLoadExtension( '$extension' );\n"; - } elseif( $extension == 'MediaWikiFarm' ) { - $localSettings .= "wfLoadExtension( 'MediaWikiFarm', " . var_export( $this->farmDir . '/extension.json', true ) . " );\n"; - } - } + if( $extensions['extension']['wfLoadExtension'] ) { + $localSettings .= "\n# Extensions\n"; + $localSettings .= $extensions['extension']['wfLoadExtension']; } # Included files diff --git a/src/main.php b/src/main.php index e1a0eea..0666f85 100644 --- a/src/main.php +++ b/src/main.php @@ -26,19 +26,11 @@ # Compile MediaWiki configuration $wgMediaWikiFarm->getMediaWikiConfig( true ); -# Load skins with the require_once mechanism -foreach( $wgMediaWikiFarm->getConfiguration( 'skins' ) as $skin => $value ) { +# Load extensions and skins with the require_once mechanism +foreach( $wgMediaWikiFarm->getConfiguration( 'extensions' ) as $extension ) { - if( $value == 'require_once' ) { - require_once "$IP/skins/$skin/$skin.php"; - } -} - -# Load extensions with the require_once mechanism -foreach( $wgMediaWikiFarm->getConfiguration( 'extensions' ) as $extension => $value ) { - - if( $value == 'require_once' ) { - require_once "$IP/extensions/$extension/$extension.php"; + if( $extension[2] == 'require_once' ) { + require_once "$IP/{$extension[1]}s/{$extension[0]}/{$extension[0]}.php"; } } diff --git a/tests/phpunit/ConfigurationTest.php b/tests/phpunit/ConfigurationTest.php index 8133726..3b5ec65 100644 --- a/tests/phpunit/ConfigurationTest.php +++ b/tests/phpunit/ConfigurationTest.php @@ -78,7 +78,6 @@ 0 => 'pdf', ), ), - 'skins' => array(), 'extensions' => array(), 'execFiles' => array( 0 => dirname( __FILE__ ) . '/data/config/LocalSettings.php', @@ -95,7 +94,6 @@ $this->assertEquals( $result['settings'], $farm->getConfiguration( 'settings' ) ); $this->assertEquals( $result['arrays'], $farm->getConfiguration( 'arrays' ) ); - $this->assertEquals( $result['skins'], $farm->getConfiguration( 'skins' ) ); $this->assertEquals( $result['extensions'], $farm->getConfiguration( 'extensions' ) ); $this->assertEquals( $result['execFiles'], $farm->getConfiguration( 'execFiles' ) ); $this->assertEquals( $result, $farm->getConfiguration() ); @@ -113,6 +111,7 @@ * @uses MediaWikiFarm::isLocalSettingsFresh * @uses MediaWikiFarm::checkExistence * @uses MediaWikiFarm::populateSettings + * @uses MediaWikiFarm::sortExtensions * @uses MediaWikiFarm::getConfiguration * @uses MediaWikiFarm::checkHostVariables * @uses MediaWikiFarm::setVersion @@ -134,12 +133,9 @@ $farm->checkExistence(); $farm->getMediaWikiConfig(); $extensions = $farm->getConfiguration( 'extensions' ); - $this->assertArrayHasKey( 'TestExtensionBiLoading', $extensions ); - $this->assertArrayHasKey( 'TestExtensionRequireOnce', $extensions ); - $this->assertEquals( 'require_once', $extensions['TestExtensionBiLoading'] ); - $this->assertEquals( 'require_once', $extensions['TestExtensionRequireOnce'] ); - // $this->assertArrayHasKey( 'MediaWikiFarm', $this->getConfiguration( 'extensions' ) ); - // $this->assertEquals( 'require_once', $this->getConfiguration( 'extensions' )['MediaWikiFarm'] ); + $this->assertContains( array( 'TestExtensionBiLoading', 'extension', 'require_once', 0 ), $extensions ); + $this->assertContains( array( 'TestExtensionRequireOnce', 'extension', 'require_once', 1 ), $extensions ); + $this->assertContains( array( 'MediaWikiFarm', 'extension', 'require_once', 6 ), $extensions ); # Now with ExtensionRegistry $farm = new MediaWikiFarm( 'a.testfarm-multiversion-test-extensions.example.org', @@ -150,12 +146,9 @@ $farm->checkExistence(); $farm->getMediaWikiConfig(); $extensions = $farm->getConfiguration( 'extensions' ); - $this->assertArrayHasKey( 'TestExtensionBiLoading', $extensions ); - $this->assertArrayHasKey( 'TestExtensionWfLoadExtension', $extensions ); - $this->assertArrayHasKey( 'MediaWikiFarm', $extensions ); - $this->assertEquals( 'wfLoadExtension', $extensions['TestExtensionBiLoading'] ); - $this->assertEquals( 'wfLoadExtension', $extensions['TestExtensionWfLoadExtension'] ); - $this->assertEquals( 'wfLoadExtension', $extensions['MediaWikiFarm'] ); + $this->assertContains( array( 'TestExtensionBiLoading', 'extension', 'wfLoadExtension', 1 ), $extensions ); + $this->assertContains( array( 'TestExtensionWfLoadExtension', 'extension', 'wfLoadExtension', 0 ), $extensions ); + $this->assertContains( array( 'MediaWikiFarm', 'extension', 'wfLoadExtension', 8 ), $extensions ); # Now with imposed loading mechanism (1) $farm = new MediaWikiFarm( 'c.testfarm-multiversion-test-extensions.example.org', @@ -168,8 +161,7 @@ $settings = $farm->getConfiguration( 'settings' ); $extensions = $farm->getConfiguration( 'extensions' ); $this->assertTrue( $settings['wgUseExtensionTestExtensionBiLoading'] ); - $this->assertArrayHasKey( 'TestExtensionBiLoading', $extensions ); - $this->assertEquals( 'require_once', $extensions['TestExtensionBiLoading'] ); + $this->assertContains( array( 'TestExtensionBiLoading', 'extension', 'require_once', 0 ), $extensions ); # Now with imposed loading mechanism (2) $farm = new MediaWikiFarm( 'd.testfarm-multiversion-test-extensions.example.org', @@ -184,10 +176,8 @@ $skins = $farm->getConfiguration( 'skins' ); $this->assertTrue( $settings['wgUseExtensionTestExtensionBiLoading'] ); $this->assertTrue( $settings['wgUseSkinTestSkinBiLoading'] ); - $this->assertArrayHasKey( 'TestExtensionBiLoading', $extensions ); - $this->assertArrayHasKey( 'TestSkinBiLoading', $skins ); - $this->assertEquals( 'require_once', $extensions['TestExtensionBiLoading'] ); - $this->assertEquals( 'require_once', $skins['TestSkinBiLoading'] ); + $this->assertContains( array( 'TestExtensionBiLoading', 'extension', 'require_once', 0 ), $extensions ); + $this->assertContains( array( 'TestSkinBiLoading', 'skin', 'require_once', 1 ), $extensions ); } /** @@ -205,6 +195,7 @@ * @uses MediaWikiFarm::selectFarm * @uses MediaWikiFarm::checkExistence * @uses MediaWikiFarm::populateSettings + * @uses MediaWikiFarm::sortExtensions * @uses MediaWikiFarm::getConfiguration * @uses MediaWikiFarm::checkHostVariables * @uses MediaWikiFarm::setVersion @@ -270,6 +261,7 @@ * @uses MediaWikiFarm::selectFarm * @uses MediaWikiFarm::checkExistence * @uses MediaWikiFarm::populateSettings + * @uses MediaWikiFarm::sortExtensions * @uses MediaWikiFarm::getConfiguration * @uses MediaWikiFarm::checkHostVariables * @uses MediaWikiFarm::setVersion diff --git a/tests/phpunit/InstallationIndependantTest.php b/tests/phpunit/InstallationIndependantTest.php index 80b130b..f5def6a 100644 --- a/tests/phpunit/InstallationIndependantTest.php +++ b/tests/phpunit/InstallationIndependantTest.php @@ -417,15 +417,13 @@ ), ), ), - 'skins' => array( - 'Vector' => 'wfLoadSkin', - 'MonoBook' => 'require_once', - ), 'extensions' => array( - 'MediaWikiFarm' => 'wfLoadExtension', - 'ParserFunctions' => 'wfLoadExtension', - 'Echo' => 'require_once', - 'SemanticMediaWiki' => 'composer', + array( 'ParserFunctions', 'extension', 'wfLoadExtension' ), + array( 'Echo', 'extension', 'require_once' ), + array( 'SemanticMediaWiki', 'extension', 'composer' ), + array( 'Vector', 'skin', 'wfLoadSkin' ), + array( 'MonoBook', 'skin', 'require_once' ), + array( 'MediaWikiFarm', 'extension', 'wfLoadExtension' ), ), 'execFiles' => array( 'freeLS.php', @@ -472,8 +470,8 @@ wfLoadSkin( 'Vector' ); # Extensions -wfLoadExtension( 'MediaWikiFarm' ); wfLoadExtension( 'ParserFunctions' ); +wfLoadExtension( 'MediaWikiFarm' ); # Included files include 'freeLS.php'; diff --git a/tests/phpunit/LoadingTest.php b/tests/phpunit/LoadingTest.php index f35099c..e1b69d7 100644 --- a/tests/phpunit/LoadingTest.php +++ b/tests/phpunit/LoadingTest.php @@ -60,6 +60,7 @@ * @uses MediaWikiFarm::replaceVariables * @uses MediaWikiFarm::getMediaWikiConfig * @uses MediaWikiFarm::populateSettings + * @uses MediaWikiFarm::sortExtensions * @uses MediaWikiFarm::isLocalSettingsFresh * @uses MediaWikiFarm::readFile * @uses MediaWikiFarm::arrayMerge @@ -97,17 +98,15 @@ ), ), 'extensions' => array( - 'TestExtensionWfLoadExtension' => 'wfLoadExtension', - 'TestExtensionBiLoading' => 'wfLoadExtension', - 'TestExtensionRequireOnce' => 'require_once', - 'TestExtensionComposer' => 'composer', - 'MediaWikiFarm' => 'wfLoadExtension', - ), - 'skins' => array( - 'TestSkinWfLoadSkin' => 'wfLoadSkin', - 'TestSkinBiLoading' => 'wfLoadSkin', - 'TestSkinRequireOnce' => 'require_once', - 'TestSkinComposer' => 'composer', + array( 'TestSkinRequireOnce', 'skin', 'require_once', 6 ), + array( 'TestExtensionRequireOnce', 'extension', 'require_once', 2 ), + array( 'TestSkinWfLoadSkin', 'skin', 'wfLoadSkin', 4 ), + array( 'TestSkinBiLoading', 'skin', 'wfLoadSkin', 5 ), + array( 'TestSkinComposer', 'skin', 'composer', 7 ), + array( 'TestExtensionWfLoadExtension', 'extension', 'wfLoadExtension', 0 ), + array( 'TestExtensionBiLoading', 'extension', 'wfLoadExtension', 1 ), + array( 'TestExtensionComposer', 'extension', 'composer', 3 ), + array( 'MediaWikiFarm', 'extension', 'wfLoadExtension', 8 ), ), ); $this->backupGlobalVariables( array_keys( $result['settings'] ) ); @@ -121,7 +120,6 @@ $this->assertEquals( $result['settings'], $wgMediaWikiFarm->getConfiguration( 'settings' ) ); $this->assertEquals( $result['arrays'], $wgMediaWikiFarm->getConfiguration( 'arrays' ) ); $this->assertEquals( $result['extensions'], $wgMediaWikiFarm->getConfiguration( 'extensions' ) ); - $this->assertEquals( $result['skins'], $wgMediaWikiFarm->getConfiguration( 'skins' ) ); $trueGlobals = array(); foreach( $GLOBALS as $key => $value ) { @@ -203,6 +201,7 @@ * @uses MediaWikiFarm::replaceVariables * @uses MediaWikiFarm::getMediaWikiConfig * @uses MediaWikiFarm::populateSettings + * @uses MediaWikiFarm::sortExtensions * @uses MediaWikiFarm::isLocalSettingsFresh * @uses MediaWikiFarm::readFile * @uses MediaWikiFarm::arrayMerge @@ -239,16 +238,15 @@ 'wgUseTestSkinEmpty' => true, ), 'extensions' => array(), - 'skins' => array(), ); if( class_exists( 'ExtensionRegistry' ) ) { $result['settings']['wgUseExtensionTestExtensionWfLoadExtension'] = true; $result['settings']['wgUseSkinTestSkinWfLoadSkin'] = true; - $result['extensions']['TestExtensionWfLoadExtension'] = 'wfLoadExtension'; - $result['extensions']['MediaWikiFarm'] = 'wfLoadExtension'; - $result['skins']['TestSkinWfLoadSkin'] = 'wfLoadSkin'; + $result['extensions'][] = array( 'TestSkinWfLoadSkin', 'skin', 'wfLoadSkin', 1 ); + $result['extensions'][] = array( 'TestExtensionWfLoadExtension', 'extension', 'wfLoadExtension', 0 ); + $result['extensions'][] = array( 'MediaWikiFarm', 'extension', 'wfLoadExtension', 2 ); } else { - $result['extensions']['MediaWikiFarm'] = 'require_once'; + $result['extensions'][] = array( 'MediaWikiFarm', 'extension', 'require_once', 0 ); } $exists = MediaWikiFarm::load( 'index.php', 'b.testfarm-multiversion-test-extensions.example.org' ); @@ -258,7 +256,6 @@ $wgMediaWikiFarm->getMediaWikiConfig(); $this->assertEquals( $result['settings'], $wgMediaWikiFarm->getConfiguration( 'settings' ) ); $this->assertEquals( $result['extensions'], $wgMediaWikiFarm->getConfiguration( 'extensions' ) ); - $this->assertEquals( $result['skins'], $wgMediaWikiFarm->getConfiguration( 'skins' ) ); } /** -- To view, visit https://gerrit.wikimedia.org/r/329223 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: newchange Gerrit-Change-Id: Idb60c537da3c99a9cdec7a80f31acaf597bcd1fa Gerrit-PatchSet: 1 Gerrit-Project: mediawiki/extensions/MediaWikiFarm Gerrit-Branch: master Gerrit-Owner: Seb35 <seb35wikipe...@gmail.com> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits