convertExtensionToRegistration: Detect if composer autoloader is needed
authorFlorian <florian.schmidt.stargatewissen@gmail.com>
Wed, 30 Dec 2015 15:11:38 +0000 (16:11 +0100)
committerLegoktm <legoktm.wikipedia@gmail.com>
Thu, 7 Jan 2016 17:23:34 +0000 (17:23 +0000)
If an extension specifies a require section in its composer.json, which contains
some dependencies, we can assume that this extension needs to load the composer
autoloader.

The maintenance script convertExtensionToRegistration.php will now check if the
extension has such a composer.json and, if so, adds the load_composer_autoloader
property in extension.json, which will try to load the autoloader of composer
is it is present.

Also add a check for existence of a require section in ComposerJson library
(ComposerJson::getRequiredDependencies()).

Bug: T119766
Change-Id: Icdbc37abc44e642afee2aab4c0e9298d3471124d

includes/libs/composer/ComposerJson.php
maintenance/convertExtensionToRegistration.php

index 796acb5..bb55ac6 100644 (file)
@@ -27,9 +27,11 @@ class ComposerJson {
         */
        public function getRequiredDependencies() {
                $deps = array();
-               foreach ( $this->contents['require'] as $package => $version ) {
-                       if ( $package !== "php" && strpos( $package, 'ext-' ) !== 0 ) {
-                               $deps[$package] = self::normalizeVersion( $version );
+               if ( isset( $this->contents['require'] ) ) {
+                       foreach ( $this->contents['require'] as $package => $version ) {
+                               if ( $package !== "php" && strpos( $package, 'ext-' ) !== 0 ) {
+                                       $deps[$package] = self::normalizeVersion( $version );
+                               }
                        }
                }
 
index 608605c..2de2e22 100644 (file)
@@ -116,6 +116,13 @@ class ConvertExtensionToRegistration extends Maintenance {
                        }
                }
 
+               // check, if the extension requires composer libraries
+               if ( $this->needsComposerAutoloader( dirname( $this->getArg( 0 ) ) ) ) {
+                       // set the load composer autoloader automatically property
+                       $this->output( "Detected composer dependencies, setting 'load_composer_autoloader' to true.\n" );
+                       $this->json['load_composer_autoloader'] = true;
+               }
+
                // Move some keys to the top
                $out = array();
                foreach ( $this->promote as $key ) {
@@ -246,6 +253,19 @@ class ConvertExtensionToRegistration extends Maintenance {
                        $this->json['ResourceFileModulePaths'] = $defaults;
                }
        }
+
+       protected function needsComposerAutoloader( $path ) {
+               $path .= '/composer.json';
+               if ( file_exists( $path ) ) {
+                       // assume, that the composer.json file is in the root of the extension path
+                       $composerJson = new ComposerJson( $path );
+                       // check, if there are some dependencies in the require section
+                       if ( $composerJson->getRequiredDependencies() ) {
+                               return true;
+                       }
+               }
+               return false;
+       }
 }
 
 $maintClass = 'ConvertExtensionToRegistration';