Read extension.json files in the web updater
authorKunal Mehta <legoktm@gmail.com>
Mon, 8 Jun 2015 00:04:07 +0000 (17:04 -0700)
committerMarkAHershberger <mah@nichework.com>
Sat, 25 Jul 2015 22:32:27 +0000 (22:32 +0000)
The web updater reads LocalSettings.php in function scope to figure out
what extensions have been loaded. This doesn't work for extensions being
loaded through the ExtensionRegistry since they're only added to a
queue.

This adds the ability for the installer to read and get information from
the current extension load queue. LocalSettings.php is still read for
extensions that have not been converted yet.

Other uses of Installer::getExistingLocalSettings() were audited and
determined to be safe with regards to extension usage.

Extensions that register hooks using explicit globals
($GLOBALS['wgHooks']['FooBar']) are still broken.

Bug: T100414
Change-Id: Icc574a38a7947a1e3aff8622a4889e9dcfd7a4b2

includes/installer/DatabaseUpdater.php
includes/registration/ExtensionRegistry.php

index 702f850..7070790 100644 (file)
@@ -145,15 +145,26 @@ abstract class DatabaseUpdater {
                        return; // already loaded
                }
                $vars = Installer::getExistingLocalSettings();
-               if ( !$vars ) {
-                       return; // no LocalSettings found
+
+               $registry = ExtensionRegistry::getInstance();
+               $queue = $registry->getQueue();
+               // Don't accidentally load extensions in the future
+               $registry->clearQueue();
+
+               // This will automatically add "AutoloadClasses" to $wgAutoloadClasses
+               $data = $registry->readFromQueue( $queue );
+               $hooks = array( 'wgHooks' => array( 'LoadExtensionSchemaUpdates' => array() ) );
+               if ( isset( $data['globals']['wgHooks']['LoadExtensionSchemaUpdates'] ) ) {
+                       $hooks = $data['globals']['wgHooks']['LoadExtensionSchemaUpdates'];
                }
-               if ( !isset( $vars['wgHooks'] ) || !isset( $vars['wgHooks']['LoadExtensionSchemaUpdates'] ) ) {
-                       return;
+               if ( $vars && isset( $vars['wgHooks']['LoadExtensionSchemaUpdates'] ) ) {
+                       $hooks = array_merge_recursive( $hooks, $vars['wgHooks']['LoadExtensionSchemaUpdates'] );
                }
                global $wgHooks, $wgAutoloadClasses;
-               $wgHooks['LoadExtensionSchemaUpdates'] = $vars['wgHooks']['LoadExtensionSchemaUpdates'];
-               $wgAutoloadClasses = $wgAutoloadClasses + $vars['wgAutoloadClasses'];
+               $wgHooks['LoadExtensionSchemaUpdates'] = $hooks;
+               if ( $vars && isset( $vars['wgAutoloadClasses'] ) ) {
+                       $wgAutoloadClasses += $vars['wgAutoloadClasses'];
+               }
        }
 
        /**
index d48a1bd..858f3bf 100644 (file)
@@ -118,6 +118,24 @@ class ExtensionRegistry {
                $this->queued = array();
        }
 
+       /**
+        * Get the current load queue. Not intended to be used
+        * outside of the installer.
+        *
+        * @return array
+        */
+       public function getQueue() {
+               return $this->queued;
+       }
+
+       /**
+        * Clear the current load queue. Not intended to be used
+        * outside of the installer.
+        */
+       public function clearQueue() {
+               $this->queued = array();
+       }
+
        /**
         * Process a queue of extensions and return their extracted data
         *