registration: Don't ignore empty array config settings when converting
authorKunal Mehta <legoktm@gmail.com>
Tue, 12 May 2015 16:26:24 +0000 (09:26 -0700)
committerKunal Mehta <legoktm@gmail.com>
Thu, 21 May 2015 17:22:05 +0000 (10:22 -0700)
Remember which settings we set to an empty array and then only skip
those settings.
The weird variable name "$__settings" is used to avoid any conflicts
similar to what eval.php does.

Bug: T98739
Change-Id: Iefbf8a98fd433cfbe0087aca6821d90c2786b0cb

maintenance/convertExtensionToRegistration.php

index 06370e9..e978ae2 100644 (file)
@@ -61,7 +61,10 @@ class ConvertExtensionToRegistration extends Maintenance {
        public function execute() {
                // Extensions will do stuff like $wgResourceModules += array(...) which is a
                // fatal unless an array is already set. So set an empty value.
-               foreach ( array_merge( $this->getAllGlobals(), array_keys( $this->custom ) ) as $var ) {
+               // And use the weird $__settings name to avoid any conflicts
+               // with real poorly named settings.
+               $__settings = array_merge( $this->getAllGlobals(), array_keys( $this->custom ) );
+               foreach ( $__settings as $var ) {
                        $var = 'wg' . $var;
                        $$var = array();
                }
@@ -70,15 +73,18 @@ class ConvertExtensionToRegistration extends Maintenance {
                // Try not to create any local variables before this line
                $vars = get_defined_vars();
                unset( $vars['this'] );
+               unset( $vars['__settings'] );
                $this->dir = dirname( realpath( $this->getArg( 0 ) ) );
                $this->json = array();
                $globalSettings = $this->getAllGlobals();
                foreach ( $vars as $name => $value ) {
-                       // If an empty array, assume it's the default we set, so skip it
-                       if ( is_array( $value ) && count( $value ) === 0 ) {
+                       $realName = substr( $name, 2 ); // Strip 'wg'
+
+                       // If it's an empty array that we likely set, skip it
+                       if ( is_array( $value ) && count( $value ) === 0 && in_array( $realName, $__settings ) ) {
                                continue;
                        }
-                       $realName = substr( $name, 2 ); // Strip 'wg'
+
                        if ( isset( $this->custom[$realName] ) ) {
                                call_user_func_array( array( $this, $this->custom[$realName] ), array( $realName, $value, $vars ) );
                        } elseif ( in_array( $realName, $globalSettings ) ) {