From 2cb0f735e2df618caf93ed2d1ea47957047d846d Mon Sep 17 00:00:00 2001 From: Matthew Flaschen Date: Thu, 11 Jun 2015 23:31:32 -0400 Subject: [PATCH] Also support skin.json for updating JSON AutoloadClasses Bug: T88194 Change-Id: Ib56680e6e0e983184e31c336dcac174922a86551 --- includes/utils/AutoloadGenerator.php | 155 ++++++++++++++++----------- 1 file changed, 92 insertions(+), 63 deletions(-) diff --git a/includes/utils/AutoloadGenerator.php b/includes/utils/AutoloadGenerator.php index dd1a38a84a..7d6315631e 100644 --- a/includes/utils/AutoloadGenerator.php +++ b/includes/utils/AutoloadGenerator.php @@ -119,85 +119,88 @@ class AutoloadGenerator { } /** - * Write out all known classes to autoload.php in - * the provided basedir + * Updates the AutoloadClasses field at the given + * filename. * - * @param string $commandName Value used in file comment to direct - * developers towards the appropriate way to update the autoload. + * @param {string} $filename Filename of JSON + * extension/skin registration file */ - public function generateAutoload( $commandName = 'AutoloadGenerator' ) { - - // 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 ) { + protected function generateJsonAutoload( $filename ) { + require_once __DIR__ . '/../../includes/json/FormatJson.php'; + $key = 'AutoloadClasses'; + $json = FormatJson::decode( file_get_contents( $filename ), 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 ) { - // Sorting the list of autoload classes. - ksort( $json[$key] ); + // Using substr to remove the leading '/' + $json[$key][$fqcn] = substr( $path, 1 ); + } - // 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 - ); - } - } + // Sorting the list of autoload classes. + ksort( $json[$key] ); - foreach ( $this->overrides as $fqcn => $path ) { + // Update file, using constants for the required + // formatting. + file_put_contents( $filename, + FormatJson::encode( $json, true ) . "\n" ); + } + + /** + * Generates a PHP file setting up autoload information. + * + * @param {string} $commandName Command name to include in comment + * @param {string} $filename of PHP file to put autoload information in. + */ + protected function generatePHPAutoload( $commandName, $filename ) { + // No existing JSON file found; update/generate PHP file + $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 ), - var_export( $path, true ) + $exportedPath ); } + } - // sort for stable output - ksort( $content ); + foreach ( $this->overrides as $fqcn => $path ) { + $content[$fqcn] = sprintf( + $format, + var_export( $fqcn, true ), + var_export( $path, true ) + ); + } - // extensions using this generator are appending to the existing - // autoload. - if ( $this->variableName === 'wgAutoloadClasses' ) { - $op = '+='; - } else { - $op = '='; - } + // sort for stable output + ksort( $content ); + + // 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', - <<variableName}; ); EOD - ); + ); + + } + + /** + * Write out all known classes to autoload.php, extension.json, or skin.json in + * the provided basedir + * + * @param string $commandName Value used in file comment to direct + * developers towards the appropriate way to update the autoload. + */ + public function generateAutoload( $commandName = 'AutoloadGenerator' ) { + + // We need to check whether an extenson.json or skin.json exists or not, and + // incase it doesn't, update the autoload.php file. + + $jsonFilename = null; + if ( file_exists( $this->basepath . "/extension.json" ) ) { + $jsonFilename = $this->basepath . "/extension.json"; + } elseif ( file_exists( $this->basepath . "/skin.json" ) ) { + $jsonFilename = $this->basepath . "/skin.json"; + } + + if ( $jsonFilename !== null ) { + $this->generateJsonAutoload( $jsonFilename ); + } else { + $this->generatePHPAutoload( $commandName, $this->basepath . '/autoload.php' ); } } /** -- 2.20.1