registration: Initialize PSR-4 namespaces at same stage as normal autoloader
authorAntoine Musso <hashar@free.fr>
Wed, 30 May 2018 19:02:46 +0000 (21:02 +0200)
committerKunal Mehta <legoktm@member.fsf.org>
Wed, 30 May 2018 20:07:42 +0000 (13:07 -0700)
readFromQueue() injects the content of AutoloadClasses to
$wgAutoloadClasses however it missed doing the same for
AutoloadNamespaces.

When using the installer with an extension having AutoloadNamespaces
set, its classes would not be found.

Make ExtensionRegistry append to AutoLoader::$psr4Namespaces, and add
a test to cover the new behavior.

Bug: T195783
Change-Id: Id61155867a4ca7d9bc4a347f8671da74b0fa490b

includes/registration/ExtensionRegistry.php
tests/phpunit/data/registration/autoload_namespaces.json [new file with mode: 0644]
tests/phpunit/includes/registration/ExtensionRegistryTest.php

index b34a123..c91d6d6 100644 (file)
@@ -247,6 +247,7 @@ class ExtensionRegistry {
                        }
                        if ( isset( $info['AutoloadNamespaces'] ) ) {
                                $autoloadNamespaces += $this->processAutoLoader( $dir, $info['AutoloadNamespaces'] );
+                               AutoLoader::$psr4Namespaces += $autoloadNamespaces;
                        }
 
                        // get all requirements/dependencies for this extension
diff --git a/tests/phpunit/data/registration/autoload_namespaces.json b/tests/phpunit/data/registration/autoload_namespaces.json
new file mode 100644 (file)
index 0000000..19c502c
--- /dev/null
@@ -0,0 +1,7 @@
+{
+       "manifest_version": 2,
+       "name": "WithAutoloadNamespaces",
+       "AutoloadNamespaces": {
+               "Test\\MediaWiki\\AutoLoader\\": "../autoloader/psr4/"
+       }
+}
index a372c8c..7120a91 100644 (file)
@@ -71,6 +71,17 @@ class ExtensionRegistryTest extends MediaWikiTestCase {
                ] );
        }
 
+       public function testReadFromQueueInitializeAutoloaderWithPsr4Namespaces() {
+               $registry = new ExtensionRegistry();
+               $registry->readFromQueue( [
+                       "{$this->dataDir}/autoload_namespaces.json" => 1
+               ] );
+               $this->assertTrue(
+                       class_exists( 'Test\\MediaWiki\\AutoLoader\\TestFooBar' ),
+                       "Registry initializes Autoloader from AutoloadNamespaces"
+               );
+       }
+
        /**
         * @dataProvider provideExportExtractedDataGlobals
         */