diff options
author | Florian Schmidt <florian.schmidt.stargatewissen@gmail.com> | 2016-12-03 19:06:46 +0100 |
---|---|---|
committer | Florian Schmidt <florian.schmidt.stargatewissen@gmail.com> | 2016-12-14 19:18:09 +0100 |
commit | 5f11f7818c3e3f82245ce92aa699e08fa086b70a (patch) | |
tree | 2d92aea7eee60bb377cea7903edca8eeafd7ea62 /includes/registration | |
parent | a3c1cb416182ad7e80cabde1b5fd42824de68610 (diff) | |
download | mediawikicore-5f11f7818c3e3f82245ce92aa699e08fa086b70a.tar.gz mediawikicore-5f11f7818c3e3f82245ce92aa699e08fa086b70a.zip |
registration: Generalize CoreVersionChecker to VersionChecker
This allows us to put other requirements more easily into extension
registration, such as skins and/or extensions.
Bug: T117277
Change-Id: I3ec1b28b6af380621585cd61b38e5ebb8be9f9c7
Diffstat (limited to 'includes/registration')
-rw-r--r-- | includes/registration/CoreVersionChecker.php | 68 | ||||
-rw-r--r-- | includes/registration/ExtensionProcessor.php | 8 | ||||
-rw-r--r-- | includes/registration/ExtensionRegistry.php | 19 | ||||
-rw-r--r-- | includes/registration/VersionChecker.php | 128 |
4 files changed, 139 insertions, 84 deletions
diff --git a/includes/registration/CoreVersionChecker.php b/includes/registration/CoreVersionChecker.php deleted file mode 100644 index f64d826da0d4..000000000000 --- a/includes/registration/CoreVersionChecker.php +++ /dev/null @@ -1,68 +0,0 @@ -<?php - -/** - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * http://www.gnu.org/copyleft/gpl.html - */ - -use Composer\Semver\VersionParser; -use Composer\Semver\Constraint\Constraint; - -/** - * @since 1.26 - */ -class CoreVersionChecker { - - /** - * @var Constraint|bool representing $wgVersion - */ - private $coreVersion = false; - - /** - * @var VersionParser - */ - private $versionParser; - - /** - * @param string $coreVersion Current version of core - */ - public function __construct( $coreVersion ) { - $this->versionParser = new VersionParser(); - try { - $this->coreVersion = new Constraint( - '==', - $this->versionParser->normalize( $coreVersion ) - ); - } catch ( UnexpectedValueException $e ) { - // Non-parsable version, don't fatal. - } - } - - /** - * Check that the provided constraint is compatible with the current version of core - * - * @param string $constraint Something like ">= 1.26" - * @return bool - */ - public function check( $constraint ) { - if ( $this->coreVersion === false ) { - // Couldn't parse the core version, so we can't check anything - return true; - } - - return $this->versionParser->parseConstraints( $constraint ) - ->matches( $this->coreVersion ); - } -} diff --git a/includes/registration/ExtensionProcessor.php b/includes/registration/ExtensionProcessor.php index d9671324fef9..1212f9972cba 100644 --- a/includes/registration/ExtensionProcessor.php +++ b/includes/registration/ExtensionProcessor.php @@ -216,13 +216,7 @@ class ExtensionProcessor implements Processor { } public function getRequirements( array $info ) { - $requirements = []; - $key = ExtensionRegistry::MEDIAWIKI_CORE; - if ( isset( $info['requires'][$key] ) ) { - $requirements[$key] = $info['requires'][$key]; - } - - return $requirements; + return isset( $info['requires'] ) ? $info['requires'] : []; } protected function extractHooks( array $info ) { diff --git a/includes/registration/ExtensionRegistry.php b/includes/registration/ExtensionRegistry.php index 70dc6248f0ad..0521f3b263fd 100644 --- a/includes/registration/ExtensionRegistry.php +++ b/includes/registration/ExtensionRegistry.php @@ -204,7 +204,8 @@ class ExtensionRegistry { $autoloaderPaths = []; $processor = new ExtensionProcessor(); $incompatible = []; - $coreVersionParser = new CoreVersionChecker( $wgVersion ); + $versionParser = new VersionChecker(); + $versionParser->setCoreVersion( $wgVersion ); foreach ( $queue as $path => $mtime ) { $json = file_get_contents( $path ); if ( $json === false ) { @@ -217,14 +218,14 @@ class ExtensionRegistry { // Check any constraints against MediaWiki core $requires = $processor->getRequirements( $info ); - if ( isset( $requires[self::MEDIAWIKI_CORE] ) - && !$coreVersionParser->check( $requires[self::MEDIAWIKI_CORE] ) - ) { - // Doesn't match, mark it as incompatible. - $incompatible[] = "{$info['name']} is not compatible with the current " - . "MediaWiki core (version {$wgVersion}), it requires: " . $requires[self::MEDIAWIKI_CORE] - . '.'; - continue; + if ( $requires ) { + $versionCheck = $versionParser->checkArray( + [ $info['name'] => $requires ] + ); + $incompatible = array_merge( $incompatible, $versionCheck ); + if ( $versionCheck ) { + continue; + } } if ( !isset( $info['manifest_version'] ) ) { diff --git a/includes/registration/VersionChecker.php b/includes/registration/VersionChecker.php new file mode 100644 index 000000000000..b61a10e4b2e8 --- /dev/null +++ b/includes/registration/VersionChecker.php @@ -0,0 +1,128 @@ +<?php + +/** + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * http://www.gnu.org/copyleft/gpl.html + * + * @author Legoktm + * @author Florian Schmidt + */ + +use Composer\Semver\VersionParser; +use Composer\Semver\Constraint\Constraint; + +/** + * Provides functions to check a set of extensions with dependencies against + * a set of loaded extensions and given version information. + * + * @since 1.29 + */ +class VersionChecker { + /** + * @var Constraint|bool representing $wgVersion + */ + private $coreVersion = false; + + /** + * @var VersionParser + */ + private $versionParser; + + public function __construct() { + $this->versionParser = new VersionParser(); + } + + /** + * Set MediaWiki core version. + * + * @param string $coreVersion Current version of core + * @return VersionChecker $this + */ + public function setCoreVersion( $coreVersion ) { + try { + $this->coreVersion = new Constraint( + '==', + $this->versionParser->normalize( $coreVersion ) + ); + $this->coreVersion->setPrettyString( $coreVersion ); + } catch ( UnexpectedValueException $e ) { + // Non-parsable version, don't fatal. + } + + return $this; + } + + /** + * Check all given dependencies if they are compatible with the named + * installed extensions in the $credits array. + * + * Example $extDependencies: + * { + * 'GoogleAPIClient' => { + * 'MediaWiki' => '>= 1.25.0' + * } + * } + * + * @param array $extDependencies All extensions that depend on other ones + * @return array + */ + public function checkArray( array $extDependencies ) { + $errors = []; + foreach ( $extDependencies as $extension => $dependencies ) { + foreach ( $dependencies as $dependencyType => $values ) { + switch ( $dependencyType ) { + case ExtensionRegistry::MEDIAWIKI_CORE: + $errors = array_merge( + $errors, + $this->handleMediaWikiDependency( $values, $extension ) + ); + break; + default: + throw new UnexpectedValueException( 'Dependency type ' . $dependencyType . + ' unknown in ' . $extension ); + } + } + } + + return $errors; + } + + /** + * Handle a dependency to MediaWiki core. It will check, if a MediaWiki version constraint was + * set with self::setCoreVersion before this call (if not, it will return an empty array) and + * checks the version constraint given against it. + * + * @param string $constraint The required version constraint for this dependency + * @param string $checkedExt The Extension, which depends on this dependency + * @return array An empty array, if MediaWiki version is compatible with $constraint, an array + * with an error message, otherwise. + */ + private function handleMediaWikiDependency( $constraint, $checkedExt ) { + if ( $this->coreVersion === false ) { + // Couldn't parse the core version, so we can't check anything + return []; + } + + // if the installed and required version are compatible, return an empty array + if ( $this->versionParser->parseConstraints( $constraint ) + ->matches( $this->coreVersion ) ) { + return []; + } + // otherwise mark this as incompatible. + return [ "{$checkedExt} is not compatible with the current " + . "MediaWiki core (version {$this->coreVersion->getPrettyString()}), it requires: " + . $constraint . '.' ]; + } +} |