From 648ef0d8687ce3efc404225263aa10ca45c244a5 Mon Sep 17 00:00:00 2001 From: Kunal Mehta Date: Sun, 7 Jun 2015 17:04:07 -0700 Subject: [PATCH] Read extension.json files in the web updater 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 | 23 +++++++++++++++------ includes/registration/ExtensionRegistry.php | 18 ++++++++++++++++ 2 files changed, 35 insertions(+), 6 deletions(-) diff --git a/includes/installer/DatabaseUpdater.php b/includes/installer/DatabaseUpdater.php index 702f850c98..7070790156 100644 --- a/includes/installer/DatabaseUpdater.php +++ b/includes/installer/DatabaseUpdater.php @@ -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']; + } } /** diff --git a/includes/registration/ExtensionRegistry.php b/includes/registration/ExtensionRegistry.php index d48a1bd26e..858f3bfe2c 100644 --- a/includes/registration/ExtensionRegistry.php +++ b/includes/registration/ExtensionRegistry.php @@ -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 * -- 2.20.1