aboutsummaryrefslogtreecommitdiffstats
path: root/includes/registration
diff options
context:
space:
mode:
authorFlorian Schmidt <florian.schmidt.stargatewissen@gmail.com>2016-12-03 19:06:46 +0100
committerFlorian Schmidt <florian.schmidt.stargatewissen@gmail.com>2016-12-14 19:18:09 +0100
commit5f11f7818c3e3f82245ce92aa699e08fa086b70a (patch)
tree2d92aea7eee60bb377cea7903edca8eeafd7ea62 /includes/registration
parenta3c1cb416182ad7e80cabde1b5fd42824de68610 (diff)
downloadmediawikicore-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.php68
-rw-r--r--includes/registration/ExtensionProcessor.php8
-rw-r--r--includes/registration/ExtensionRegistry.php19
-rw-r--r--includes/registration/VersionChecker.php128
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 . '.' ];
+ }
+}