X-Git-Url: http://git.heureux-cyclage.org/?a=blobdiff_plain;f=includes%2Finstaller%2FInstaller.php;h=4b6e8ccd488b94ff8837a9b784e5150dfe2f5ac5;hb=20d8afb50ce65bcea43ef5ddc5b4b309bcde15e4;hp=f5e12d64775a25c9750c37978001c4a3a328ea36;hpb=5ca4a8000d3f998886b030fe6907b4ea8bb7dd9e;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/installer/Installer.php b/includes/installer/Installer.php index f5e12d6477..4b6e8ccd48 100644 --- a/includes/installer/Installer.php +++ b/includes/installer/Installer.php @@ -24,6 +24,7 @@ * @ingroup Deployment */ use MediaWiki\MediaWikiServices; +use MediaWiki\Shell\Shell; /** * This documentation group collects source code files with deployment functionality. @@ -989,18 +990,22 @@ abstract class Installer { return true; } + if ( Shell::isDisabled() ) { + return true; + } + # Get a list of available locales. - $ret = false; - $lines = wfShellExec( '/usr/bin/locale -a', $ret ); + $result = Shell::command( '/usr/bin/locale', '-a' ) + ->execute(); - if ( $ret ) { + if ( $result->getExitCode() != 0 ) { return true; } + $lines = $result->getStdout(); $lines = array_map( 'trim', explode( "\n", $lines ) ); $candidatesByLocale = []; $candidatesByLang = []; - foreach ( $lines as $line ) { if ( $line === '' ) { continue; @@ -1198,7 +1203,7 @@ abstract class Installer { $scriptTypes = [ 'php' => [ "readExtension( $fullJsonFile ); + if ( $info === false ) { + continue; + } + $exts[$file] += $info; + } } closedir( $dh ); uksort( $exts, 'strnatcasecmp' ); @@ -1318,6 +1338,82 @@ abstract class Installer { return $exts; } + /** + * @param string $fullJsonFile + * @param array $extDeps + * @param array $skinDeps + * + * @return array|bool False if this extension can't be loaded + */ + private function readExtension( $fullJsonFile, $extDeps = [], $skinDeps = [] ) { + $load = [ + $fullJsonFile => 1 + ]; + if ( $extDeps ) { + $extDir = $this->getVar( 'IP' ) . '/extensions'; + foreach ( $extDeps as $dep ) { + $fname = "$extDir/$dep/extension.json"; + if ( !file_exists( $fname ) ) { + return false; + } + $load[$fname] = 1; + } + } + if ( $skinDeps ) { + $skinDir = $this->getVar( 'IP' ) . '/skins'; + foreach ( $skinDeps as $dep ) { + $fname = "$skinDir/$dep/skin.json"; + if ( !file_exists( $fname ) ) { + return false; + } + $load[$fname] = 1; + } + } + $registry = new ExtensionRegistry(); + try { + $info = $registry->readFromQueue( $load ); + } catch ( ExtensionDependencyError $e ) { + if ( $e->incompatibleCore || $e->incompatibleSkins + || $e->incompatibleExtensions + ) { + // If something is incompatible with a dependency, we have no real + // option besides skipping it + return false; + } elseif ( $e->missingExtensions || $e->missingSkins ) { + // There's an extension missing in the dependency tree, + // so add those to the dependency list and try again + return $this->readExtension( + $fullJsonFile, + array_merge( $extDeps, $e->missingExtensions ), + array_merge( $skinDeps, $e->missingSkins ) + ); + } + // Some other kind of dependency error? + return false; + } + $ret = []; + // The order of credits will be the order of $load, + // so the first extension is the one we want to load, + // everything else is a dependency + $i = 0; + foreach ( $info['credits'] as $name => $credit ) { + $i++; + if ( $i == 1 ) { + // Extension we want to load + continue; + } + $type = basename( $credit['path'] ) === 'skin.json' ? 'skins' : 'extensions'; + $ret['requires'][$type][] = $credit['name']; + } + $credits = array_values( $info['credits'] )[0]; + if ( isset( $credits['url'] ) ) { + $ret['url'] = $credits['url']; + } + $ret['type'] = $credits['type']; + + return $ret; + } + /** * Returns a default value to be used for $wgDefaultSkin: normally the one set in DefaultSettings, * but will fall back to another if the default skin is missing and some other one is present @@ -1345,6 +1441,10 @@ abstract class Installer { $exts = $this->getVar( '_Extensions' ); $IP = $this->getVar( 'IP' ); + // Marker for DatabaseUpdater::loadExtensions so we don't + // double load extensions + define( 'MW_EXTENSIONS_LOADED', true ); + /** * We need to include DefaultSettings before including extensions to avoid * warnings about unset variables. However, the only thing we really