jenkins-bot has submitted this change and it was merged.

Change subject: registration: Improve merging of arrays
......................................................................


registration: Improve merging of arrays

Currently we use array_merge_recursive when merging any array, which is really
only needed for merging $wgHooks entries, and causes issues when trying to
merge default settings if the config is already set.

$wgHooks and $wgGroupPermissions are now special cased when merging, and all
other arrays are just +='d.

Bug: T88665
Bug: T89364
Change-Id: I773a9463d4428aa618c17f848c01b24e04610e95
---
M includes/registration/ExtensionRegistry.php
A tests/phpunit/includes/registration/ExtensionRegistryTest.php
2 files changed, 194 insertions(+), 1 deletion(-)

Approvals:
  Tim Starling: Looks good to me, approved
  Brion VIBBER: Looks good to me, but someone else must approve
  Jforrester: Looks good to me, but someone else must approve
  jenkins-bot: Verified



diff --git a/includes/registration/ExtensionRegistry.php 
b/includes/registration/ExtensionRegistry.php
index 8541e31..5b18e72 100644
--- a/includes/registration/ExtensionRegistry.php
+++ b/includes/registration/ExtensionRegistry.php
@@ -142,8 +142,21 @@
                foreach ( $info['globals'] as $key => $val ) {
                        if ( !isset( $GLOBALS[$key] ) || !$GLOBALS[$key] ) {
                                $GLOBALS[$key] = $val;
-                       } elseif ( is_array( $GLOBALS[$key] ) && is_array( $val 
) ) {
+                       } elseif ( $key === 'wgHooks' ) {
+                               // Special case $wgHooks, which requires a 
recursive merge.
+                               // Ideally it would have been taken care of in 
the first if block though.
                                $GLOBALS[$key] = array_merge_recursive( 
$GLOBALS[$key], $val );
+                       } elseif ( $key === 'wgGroupPermissions' ) {
+                               // First merge individual groups
+                               foreach ( $GLOBALS[$key] as $name => &$groupVal 
) {
+                                       if ( isset( $val[$name] ) ) {
+                                               $groupVal += $val[$name];
+                                       }
+                               }
+                               // Now merge groups that didn't exist yet
+                               $GLOBALS[$key] += $val;
+                       } elseif ( is_array( $GLOBALS[$key] ) && is_array( $val 
) ) {
+                               $GLOBALS[$key] += $val;
                        } // else case is a config setting where it has already 
been overriden, so don't set it
                }
                foreach ( $info['defines'] as $name => $val ) {
diff --git a/tests/phpunit/includes/registration/ExtensionRegistryTest.php 
b/tests/phpunit/includes/registration/ExtensionRegistryTest.php
new file mode 100644
index 0000000..421cab5
--- /dev/null
+++ b/tests/phpunit/includes/registration/ExtensionRegistryTest.php
@@ -0,0 +1,180 @@
+<?php
+
+class ExtensionRegistryTest extends MediaWikiTestCase {
+
+       /**
+        * @covers ExtensionRegistry::exportExtractedData
+        * @dataProvider provideExportExtractedDataGlobals
+        * @@backupGlobals enabled
+        */
+       public function testExportExtractedDataGlobals( $desc, $before, 
$globals, $expected ) {
+               if ( $before ) {
+                       foreach ( $before as $key => $value ) {
+                               $GLOBALS[$key] = $value;
+                       }
+               }
+               $info = array(
+                       'globals' => $globals,
+                       'callbacks' => array(),
+                       'defines' => array(),
+                       'credits' => array(),
+                       'attributes' => array(),
+               );
+               $registry = new ExtensionRegistry();
+               $class = new ReflectionClass( 'ExtensionRegistry' );
+               $method = $class->getMethod( 'exportExtractedData' );
+               $method->setAccessible( true );
+               $method->invokeArgs( $registry, array( $info ) );
+               foreach ( $expected as $name => $value ) {
+                       $this->assertArrayHasKey( $name, $GLOBALS, $desc );
+                       $this->assertEquals( $value, $GLOBALS[$name], $desc );
+               }
+       }
+
+       public static function provideExportExtractedDataGlobals() {
+               // "mwtest" prefix used instead of "$wg" to avoid potential 
conflicts
+               return array(
+                       array(
+                               'Simple non-array values',
+                               array(
+                                       'mwtestFooBarConfig' => true,
+                                       'mwtestFooBarConfig2' => 'string',
+                               ),
+                               array(
+                                       'mwtestFooBarDefault' => 1234,
+                                       'mwtestFooBarConfig' => false,
+                               ),
+                               array(
+                                       'mwtestFooBarConfig' => true,
+                                       'mwtestFooBarConfig2' => 'string',
+                                       'mwtestFooBarDefault' => 1234,
+                               ),
+                       ),
+                       array(
+                               'No global already set, simple array',
+                               null,
+                               array(
+                                       'mwtestDefaultOptions' => array(
+                                               'foobar' => true,
+                                       )
+                               ),
+                               array(
+                                       'mwtestDefaultOptions' => array(
+                                               'foobar' => true,
+                                       )
+                               ),
+                       ),
+                       array(
+                               'Global already set, simple array',
+                               array(
+                                       'mwtestDefaultOptions' => array(
+                                               'foobar' => true,
+                                               'foo' => 'string'
+                                       ),
+                               ),
+                               array(
+                                       'mwtestDefaultOptions' => array(
+                                               'barbaz' => 12345,
+                                               'foobar' => false,
+                                       ),
+                               ),
+                               array(
+                                       'mwtestDefaultOptions' => array(
+                                               'barbaz' => 12345,
+                                               'foo' => 'string',
+                                               'foobar' => true,
+                                       ),
+                               )
+                       ),
+                       array(
+                               'No global already set, $wgHooks',
+                               array(
+                                       'wgHooks' => array(),
+                               ),
+                               array(
+                                       'wgHooks' => array(
+                                               'FooBarEvent' => array(
+                                                       
'FooBarClass::onFooBarEvent'
+                                               ),
+                                       ),
+                               ),
+                               array(
+                                       'wgHooks' => array(
+                                               'FooBarEvent' => array(
+                                                       
'FooBarClass::onFooBarEvent'
+                                               ),
+                                       ),
+                               ),
+                       ),
+                       array(
+                               'Global already set, $wgHooks',
+                               array(
+                                       'wgHooks' => array(
+                                               'FooBarEvent' => array(
+                                                       
'FooBarClass::onFooBarEvent'
+                                               ),
+                                               'BazBarEvent' => array(
+                                                       
'FooBarClass::onBazBarEvent',
+                                               ),
+                                       ),
+                               ),
+                               array(
+                                       'wgHooks' => array(
+                                               'FooBarEvent' => array(
+                                                       
'BazBarClass::onFooBarEvent',
+                                               ),
+                                       ),
+                               ),
+                               array(
+                                       'wgHooks' => array(
+                                               'FooBarEvent' => array(
+                                                       
'FooBarClass::onFooBarEvent',
+                                                       
'BazBarClass::onFooBarEvent',
+                                               ),
+                                               'BazBarEvent' => array(
+                                                       
'FooBarClass::onBazBarEvent',
+                                               ),
+                                       ),
+                               ),
+                       ),
+                       array(
+                               'Global already set, $wgGroupPermissions',
+                               array(
+                                       'wgGroupPermissions' => array(
+                                               'sysop' => array(
+                                                       'something' => true,
+                                               ),
+                                               'user' => array(
+                                                       'somethingtwo' => true,
+                                               )
+                                       ),
+                               ),
+                               array(
+                                       'wgGroupPermissions' => array(
+                                               'customgroup' => array(
+                                                       'right' => true,
+                                               ),
+                                               'user' => array(
+                                                       'right' => true,
+                                                       'somethingtwo' => false,
+                                               )
+                                       ),
+                               ),
+                               array(
+                                       'wgGroupPermissions' => array(
+                                               'customgroup' => array(
+                                                       'right' => true,
+                                               ),
+                                               'sysop' => array(
+                                                       'something' => true,
+                                               ),
+                                               'user' => array(
+                                                       'somethingtwo' => true,
+                                                       'right' => true,
+                                               )
+                                       ),
+                               ),
+                       )
+               );
+       }
+}

-- 
To view, visit https://gerrit.wikimedia.org/r/190419
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: merged
Gerrit-Change-Id: I773a9463d4428aa618c17f848c01b24e04610e95
Gerrit-PatchSet: 4
Gerrit-Project: mediawiki/core
Gerrit-Branch: master
Gerrit-Owner: Legoktm <[email protected]>
Gerrit-Reviewer: Brion VIBBER <[email protected]>
Gerrit-Reviewer: Jforrester <[email protected]>
Gerrit-Reviewer: Tim Starling <[email protected]>
Gerrit-Reviewer: jenkins-bot <>

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to