From: Kunal Mehta Date: Mon, 8 Jun 2015 00:04:07 +0000 (-0700) Subject: Read extension.json files in the web updater X-Git-Tag: 1.31.0-rc.0~10637^2 X-Git-Url: https://git.cyclocoop.org/admin/?a=commitdiff_plain;h=648ef0d8687ce3efc404225263aa10ca45c244a5;p=lhc%2Fweb%2Fwiklou.git 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 --- 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 *