diff --git a/includes/utils/AutoloadGenerator.php b/includes/utils/AutoloadGenerator.php index 9cf8cab5db7..dd1a38a84a7 100644 --- a/includes/utils/AutoloadGenerator.php +++ b/includes/utils/AutoloadGenerator.php @@ -126,45 +126,78 @@ class AutoloadGenerator { * developers towards the appropriate way to update the autoload. */ public function generateAutoload( $commandName = 'AutoloadGenerator' ) { - $content = array(); - // We need to generate a line each rather than exporting the - // full array so __DIR__ can be prepended to all the paths - $format = "%s => __DIR__ . %s,"; - foreach ( $this->classes as $path => $contained ) { - $exportedPath = var_export( $path, true ); - foreach ( $contained as $fqcn ) { + // We need to check whether an extenson.json exists or not, and + // incase it doesn't, update the autoload.php file. + + if ( file_exists( $this->basepath . '/extension.json' ) ) { + require_once __DIR__ . '/../../includes/json/FormatJson.php'; + $key = 'AutoloadClasses'; + $json = FormatJson::decode( file_get_contents( $this->basepath + . '/extension.json' ), true ); + unset( $json[$key] ); + // Inverting the key-value pairs so that they become of the + // format class-name : path when they get converted into json. + foreach ( $this->classes as $path => $contained ) { + foreach ( $contained as $fqcn ) { + + // Using substr to remove the leading '/' + $json[$key][$fqcn] = substr( $path, 1 ); + } + } + foreach ( $this->overrides as $path => $fqcn ) { + + // Using substr to remove the leading '/' + $json[$key][$fqcn] = substr( $path, 1 ); + } + + // Sorting the list of autoload classes. + ksort( $json[$key] ); + + // Update extension.json, using constants for the required + // formatting. + file_put_contents( $this->basepath . '/extension.json', + FormatJson::encode( $json, true ) . "\n" ); + } else { + $content = array(); + + // We need to generate a line each rather than exporting the + // full array so __DIR__ can be prepended to all the paths + $format = "%s => __DIR__ . %s,"; + foreach ( $this->classes as $path => $contained ) { + $exportedPath = var_export( $path, true ); + foreach ( $contained as $fqcn ) { + $content[$fqcn] = sprintf( + $format, + var_export( $fqcn, true ), + $exportedPath + ); + } + } + + foreach ( $this->overrides as $fqcn => $path ) { $content[$fqcn] = sprintf( $format, var_export( $fqcn, true ), - $exportedPath + var_export( $path, true ) ); } - } - foreach ( $this->overrides as $fqcn => $path ) { - $content[$fqcn] = sprintf( - $format, - var_export( $fqcn, true ), - var_export( $path, true ) - ); - } + // sort for stable output + ksort( $content ); - // sort for stable output - ksort( $content ); + // extensions using this generator are appending to the existing + // autoload. + if ( $this->variableName === 'wgAutoloadClasses' ) { + $op = '+='; + } else { + $op = '='; + } - // extensions using this generator are appending to the existing - // autoload. - if ( $this->variableName === 'wgAutoloadClasses' ) { - $op = '+='; - } else { - $op = '='; - } - - $output = implode( "\n\t", $content ); - file_put_contents( - $this->basepath . '/autoload.php', - <<basepath . '/autoload.php', + <<variableName}; ); EOD - ); + ); + } } - /** * Ensure that Unix-style path separators ("/") are used in the path. *