2016-12-03 18:06:46 +00:00
|
|
|
<?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;
|
|
|
|
|
|
registration: Allow specifying extension dependencies
There are some extensoins that depend upon another extension or skin,
usually in different ways:
* A constant that is added in the dependency extension, and the
existence of is checked for. This is problematic because it requires a
specific load order.
* Checking whether a specific class exists. This is problematic because
it is extremely fragile, and breaks whenever the class is renamed.
* Checking ExtensionRegistry::isLoaded(). This is mostly there, but it
only checks at runtime, and doesn't provide any machine readable data.
Furthermore, developers implement each one differently, with very little
standardization.
With this, extensions may now specify what other extensions they depend
on. This is for explicit *hard* dependencies that must be installed.
For example:
"requires": {
"MediaWiki": ">= 1.25.0",
"extensions": {
"FakeExtension": "*"
},
"skins": {
"FakeSkin": "*"
}
}
This would add a minimum requirement on MediaWiki 1.25.0+ (already
implemented), as well as the requirement that the FakeExtension extension
needs to be installed, as well as the FakeSkin skin. A wildcard (*) is
used instead of an explicit version requirement as many extensions do
not actually version themselves, and there is no consistent versioning
scheme yet.
Bug: T117277
Change-Id: If1cccee1a16a867a71bb0285691c400443d8a30a
2016-12-03 18:19:25 +00:00
|
|
|
/**
|
|
|
|
|
* @var array Loaded extensions
|
|
|
|
|
*/
|
|
|
|
|
private $loaded = [];
|
|
|
|
|
|
2016-12-03 18:06:46 +00:00
|
|
|
/**
|
|
|
|
|
* @var VersionParser
|
|
|
|
|
*/
|
|
|
|
|
private $versionParser;
|
|
|
|
|
|
2016-12-15 23:09:26 +00:00
|
|
|
/**
|
|
|
|
|
* @param string $coreVersion Current version of core
|
|
|
|
|
*/
|
|
|
|
|
public function __construct( $coreVersion ) {
|
2016-12-03 18:06:46 +00:00
|
|
|
$this->versionParser = new VersionParser();
|
2016-12-15 23:09:26 +00:00
|
|
|
$this->setCoreVersion( $coreVersion );
|
2016-12-03 18:06:46 +00:00
|
|
|
}
|
|
|
|
|
|
registration: Allow specifying extension dependencies
There are some extensoins that depend upon another extension or skin,
usually in different ways:
* A constant that is added in the dependency extension, and the
existence of is checked for. This is problematic because it requires a
specific load order.
* Checking whether a specific class exists. This is problematic because
it is extremely fragile, and breaks whenever the class is renamed.
* Checking ExtensionRegistry::isLoaded(). This is mostly there, but it
only checks at runtime, and doesn't provide any machine readable data.
Furthermore, developers implement each one differently, with very little
standardization.
With this, extensions may now specify what other extensions they depend
on. This is for explicit *hard* dependencies that must be installed.
For example:
"requires": {
"MediaWiki": ">= 1.25.0",
"extensions": {
"FakeExtension": "*"
},
"skins": {
"FakeSkin": "*"
}
}
This would add a minimum requirement on MediaWiki 1.25.0+ (already
implemented), as well as the requirement that the FakeExtension extension
needs to be installed, as well as the FakeSkin skin. A wildcard (*) is
used instead of an explicit version requirement as many extensions do
not actually version themselves, and there is no consistent versioning
scheme yet.
Bug: T117277
Change-Id: If1cccee1a16a867a71bb0285691c400443d8a30a
2016-12-03 18:19:25 +00:00
|
|
|
/**
|
|
|
|
|
* Set an array with credits of all loaded extensions and skins.
|
|
|
|
|
*
|
|
|
|
|
* @param array $credits An array of installed extensions with credits of them
|
|
|
|
|
* @return VersionChecker $this
|
|
|
|
|
*/
|
|
|
|
|
public function setLoadedExtensionsAndSkins( array $credits ) {
|
|
|
|
|
$this->loaded = $credits;
|
|
|
|
|
|
|
|
|
|
return $this;
|
|
|
|
|
}
|
|
|
|
|
|
2016-12-03 18:06:46 +00:00
|
|
|
/**
|
|
|
|
|
* Set MediaWiki core version.
|
|
|
|
|
*
|
|
|
|
|
* @param string $coreVersion Current version of core
|
|
|
|
|
*/
|
2016-12-15 23:09:26 +00:00
|
|
|
private function setCoreVersion( $coreVersion ) {
|
2016-12-03 18:06:46 +00:00
|
|
|
try {
|
|
|
|
|
$this->coreVersion = new Constraint(
|
|
|
|
|
'==',
|
|
|
|
|
$this->versionParser->normalize( $coreVersion )
|
|
|
|
|
);
|
|
|
|
|
$this->coreVersion->setPrettyString( $coreVersion );
|
|
|
|
|
} catch ( UnexpectedValueException $e ) {
|
|
|
|
|
// Non-parsable version, don't fatal.
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Check all given dependencies if they are compatible with the named
|
|
|
|
|
* installed extensions in the $credits array.
|
|
|
|
|
*
|
|
|
|
|
* Example $extDependencies:
|
2017-02-25 21:53:36 +00:00
|
|
|
* {
|
|
|
|
|
* 'FooBar' => {
|
|
|
|
|
* 'MediaWiki' => '>= 1.25.0',
|
|
|
|
|
* 'extensions' => {
|
|
|
|
|
* 'FooBaz' => '>= 1.25.0'
|
|
|
|
|
* },
|
|
|
|
|
* 'skins' => {
|
|
|
|
|
* 'BazBar' => '>= 1.0.0'
|
|
|
|
|
* }
|
|
|
|
|
* }
|
|
|
|
|
* }
|
2016-12-03 18:06:46 +00:00
|
|
|
*
|
|
|
|
|
* @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:
|
2016-12-15 23:09:26 +00:00
|
|
|
$mwError = $this->handleMediaWikiDependency( $values, $extension );
|
|
|
|
|
if ( $mwError !== false ) {
|
2018-04-08 23:26:01 +00:00
|
|
|
$errors[] = [
|
|
|
|
|
'msg' => $mwError,
|
|
|
|
|
'type' => 'incompatible-core',
|
|
|
|
|
];
|
2016-12-15 23:09:26 +00:00
|
|
|
}
|
2016-12-03 18:06:46 +00:00
|
|
|
break;
|
registration: Allow specifying extension dependencies
There are some extensoins that depend upon another extension or skin,
usually in different ways:
* A constant that is added in the dependency extension, and the
existence of is checked for. This is problematic because it requires a
specific load order.
* Checking whether a specific class exists. This is problematic because
it is extremely fragile, and breaks whenever the class is renamed.
* Checking ExtensionRegistry::isLoaded(). This is mostly there, but it
only checks at runtime, and doesn't provide any machine readable data.
Furthermore, developers implement each one differently, with very little
standardization.
With this, extensions may now specify what other extensions they depend
on. This is for explicit *hard* dependencies that must be installed.
For example:
"requires": {
"MediaWiki": ">= 1.25.0",
"extensions": {
"FakeExtension": "*"
},
"skins": {
"FakeSkin": "*"
}
}
This would add a minimum requirement on MediaWiki 1.25.0+ (already
implemented), as well as the requirement that the FakeExtension extension
needs to be installed, as well as the FakeSkin skin. A wildcard (*) is
used instead of an explicit version requirement as many extensions do
not actually version themselves, and there is no consistent versioning
scheme yet.
Bug: T117277
Change-Id: If1cccee1a16a867a71bb0285691c400443d8a30a
2016-12-03 18:19:25 +00:00
|
|
|
case 'extensions':
|
|
|
|
|
case 'skin':
|
|
|
|
|
foreach ( $values as $dependency => $constraint ) {
|
2018-04-08 23:26:01 +00:00
|
|
|
$extError = $this->handleExtensionDependency(
|
|
|
|
|
$dependency, $constraint, $extension, $dependencyType
|
|
|
|
|
);
|
2016-12-15 23:09:26 +00:00
|
|
|
if ( $extError !== false ) {
|
|
|
|
|
$errors[] = $extError;
|
|
|
|
|
}
|
registration: Allow specifying extension dependencies
There are some extensoins that depend upon another extension or skin,
usually in different ways:
* A constant that is added in the dependency extension, and the
existence of is checked for. This is problematic because it requires a
specific load order.
* Checking whether a specific class exists. This is problematic because
it is extremely fragile, and breaks whenever the class is renamed.
* Checking ExtensionRegistry::isLoaded(). This is mostly there, but it
only checks at runtime, and doesn't provide any machine readable data.
Furthermore, developers implement each one differently, with very little
standardization.
With this, extensions may now specify what other extensions they depend
on. This is for explicit *hard* dependencies that must be installed.
For example:
"requires": {
"MediaWiki": ">= 1.25.0",
"extensions": {
"FakeExtension": "*"
},
"skins": {
"FakeSkin": "*"
}
}
This would add a minimum requirement on MediaWiki 1.25.0+ (already
implemented), as well as the requirement that the FakeExtension extension
needs to be installed, as well as the FakeSkin skin. A wildcard (*) is
used instead of an explicit version requirement as many extensions do
not actually version themselves, and there is no consistent versioning
scheme yet.
Bug: T117277
Change-Id: If1cccee1a16a867a71bb0285691c400443d8a30a
2016-12-03 18:19:25 +00:00
|
|
|
}
|
|
|
|
|
break;
|
2016-12-03 18:06:46 +00:00
|
|
|
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
|
2016-12-15 23:09:26 +00:00
|
|
|
* @return bool|string false if no error, or a string with the message
|
2016-12-03 18:06:46 +00:00
|
|
|
*/
|
|
|
|
|
private function handleMediaWikiDependency( $constraint, $checkedExt ) {
|
|
|
|
|
if ( $this->coreVersion === false ) {
|
|
|
|
|
// Couldn't parse the core version, so we can't check anything
|
2016-12-15 23:09:26 +00:00
|
|
|
return false;
|
2016-12-03 18:06:46 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// if the installed and required version are compatible, return an empty array
|
|
|
|
|
if ( $this->versionParser->parseConstraints( $constraint )
|
|
|
|
|
->matches( $this->coreVersion ) ) {
|
2016-12-15 23:09:26 +00:00
|
|
|
return false;
|
2016-12-03 18:06:46 +00:00
|
|
|
}
|
|
|
|
|
// otherwise mark this as incompatible.
|
2016-12-15 23:09:26 +00:00
|
|
|
return "{$checkedExt} is not compatible with the current "
|
|
|
|
|
. "MediaWiki core (version {$this->coreVersion->getPrettyString()}), it requires: "
|
|
|
|
|
. "$constraint.";
|
2016-12-03 18:06:46 +00:00
|
|
|
}
|
registration: Allow specifying extension dependencies
There are some extensoins that depend upon another extension or skin,
usually in different ways:
* A constant that is added in the dependency extension, and the
existence of is checked for. This is problematic because it requires a
specific load order.
* Checking whether a specific class exists. This is problematic because
it is extremely fragile, and breaks whenever the class is renamed.
* Checking ExtensionRegistry::isLoaded(). This is mostly there, but it
only checks at runtime, and doesn't provide any machine readable data.
Furthermore, developers implement each one differently, with very little
standardization.
With this, extensions may now specify what other extensions they depend
on. This is for explicit *hard* dependencies that must be installed.
For example:
"requires": {
"MediaWiki": ">= 1.25.0",
"extensions": {
"FakeExtension": "*"
},
"skins": {
"FakeSkin": "*"
}
}
This would add a minimum requirement on MediaWiki 1.25.0+ (already
implemented), as well as the requirement that the FakeExtension extension
needs to be installed, as well as the FakeSkin skin. A wildcard (*) is
used instead of an explicit version requirement as many extensions do
not actually version themselves, and there is no consistent versioning
scheme yet.
Bug: T117277
Change-Id: If1cccee1a16a867a71bb0285691c400443d8a30a
2016-12-03 18:19:25 +00:00
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Handle a dependency to another extension.
|
|
|
|
|
*
|
|
|
|
|
* @param string $dependencyName The name of the dependency
|
|
|
|
|
* @param string $constraint The required version constraint for this dependency
|
|
|
|
|
* @param string $checkedExt The Extension, which depends on this dependency
|
2018-04-08 23:26:01 +00:00
|
|
|
* @param string $type Either 'extension' or 'skin'
|
|
|
|
|
* @return bool|array false for no errors, or an array of info
|
registration: Allow specifying extension dependencies
There are some extensoins that depend upon another extension or skin,
usually in different ways:
* A constant that is added in the dependency extension, and the
existence of is checked for. This is problematic because it requires a
specific load order.
* Checking whether a specific class exists. This is problematic because
it is extremely fragile, and breaks whenever the class is renamed.
* Checking ExtensionRegistry::isLoaded(). This is mostly there, but it
only checks at runtime, and doesn't provide any machine readable data.
Furthermore, developers implement each one differently, with very little
standardization.
With this, extensions may now specify what other extensions they depend
on. This is for explicit *hard* dependencies that must be installed.
For example:
"requires": {
"MediaWiki": ">= 1.25.0",
"extensions": {
"FakeExtension": "*"
},
"skins": {
"FakeSkin": "*"
}
}
This would add a minimum requirement on MediaWiki 1.25.0+ (already
implemented), as well as the requirement that the FakeExtension extension
needs to be installed, as well as the FakeSkin skin. A wildcard (*) is
used instead of an explicit version requirement as many extensions do
not actually version themselves, and there is no consistent versioning
scheme yet.
Bug: T117277
Change-Id: If1cccee1a16a867a71bb0285691c400443d8a30a
2016-12-03 18:19:25 +00:00
|
|
|
*/
|
2018-04-08 23:26:01 +00:00
|
|
|
private function handleExtensionDependency( $dependencyName, $constraint, $checkedExt,
|
|
|
|
|
$type
|
|
|
|
|
) {
|
registration: Allow specifying extension dependencies
There are some extensoins that depend upon another extension or skin,
usually in different ways:
* A constant that is added in the dependency extension, and the
existence of is checked for. This is problematic because it requires a
specific load order.
* Checking whether a specific class exists. This is problematic because
it is extremely fragile, and breaks whenever the class is renamed.
* Checking ExtensionRegistry::isLoaded(). This is mostly there, but it
only checks at runtime, and doesn't provide any machine readable data.
Furthermore, developers implement each one differently, with very little
standardization.
With this, extensions may now specify what other extensions they depend
on. This is for explicit *hard* dependencies that must be installed.
For example:
"requires": {
"MediaWiki": ">= 1.25.0",
"extensions": {
"FakeExtension": "*"
},
"skins": {
"FakeSkin": "*"
}
}
This would add a minimum requirement on MediaWiki 1.25.0+ (already
implemented), as well as the requirement that the FakeExtension extension
needs to be installed, as well as the FakeSkin skin. A wildcard (*) is
used instead of an explicit version requirement as many extensions do
not actually version themselves, and there is no consistent versioning
scheme yet.
Bug: T117277
Change-Id: If1cccee1a16a867a71bb0285691c400443d8a30a
2016-12-03 18:19:25 +00:00
|
|
|
// Check if the dependency is even installed
|
|
|
|
|
if ( !isset( $this->loaded[$dependencyName] ) ) {
|
2018-04-08 23:26:01 +00:00
|
|
|
return [
|
|
|
|
|
'msg' => "{$checkedExt} requires {$dependencyName} to be installed.",
|
|
|
|
|
'type' => "missing-$type",
|
|
|
|
|
'missing' => $dependencyName,
|
|
|
|
|
];
|
registration: Allow specifying extension dependencies
There are some extensoins that depend upon another extension or skin,
usually in different ways:
* A constant that is added in the dependency extension, and the
existence of is checked for. This is problematic because it requires a
specific load order.
* Checking whether a specific class exists. This is problematic because
it is extremely fragile, and breaks whenever the class is renamed.
* Checking ExtensionRegistry::isLoaded(). This is mostly there, but it
only checks at runtime, and doesn't provide any machine readable data.
Furthermore, developers implement each one differently, with very little
standardization.
With this, extensions may now specify what other extensions they depend
on. This is for explicit *hard* dependencies that must be installed.
For example:
"requires": {
"MediaWiki": ">= 1.25.0",
"extensions": {
"FakeExtension": "*"
},
"skins": {
"FakeSkin": "*"
}
}
This would add a minimum requirement on MediaWiki 1.25.0+ (already
implemented), as well as the requirement that the FakeExtension extension
needs to be installed, as well as the FakeSkin skin. A wildcard (*) is
used instead of an explicit version requirement as many extensions do
not actually version themselves, and there is no consistent versioning
scheme yet.
Bug: T117277
Change-Id: If1cccee1a16a867a71bb0285691c400443d8a30a
2016-12-03 18:19:25 +00:00
|
|
|
}
|
|
|
|
|
// Check if the dependency has specified a version
|
|
|
|
|
if ( !isset( $this->loaded[$dependencyName]['version'] ) ) {
|
|
|
|
|
// If we depend upon any version, and none is set, that's fine.
|
|
|
|
|
if ( $constraint === '*' ) {
|
2018-02-10 07:14:07 +00:00
|
|
|
wfDebug( "{$dependencyName} does not expose its version, but {$checkedExt}"
|
|
|
|
|
. " mentions it with constraint '*'. Assume it's ok so." );
|
2016-12-15 23:09:26 +00:00
|
|
|
return false;
|
registration: Allow specifying extension dependencies
There are some extensoins that depend upon another extension or skin,
usually in different ways:
* A constant that is added in the dependency extension, and the
existence of is checked for. This is problematic because it requires a
specific load order.
* Checking whether a specific class exists. This is problematic because
it is extremely fragile, and breaks whenever the class is renamed.
* Checking ExtensionRegistry::isLoaded(). This is mostly there, but it
only checks at runtime, and doesn't provide any machine readable data.
Furthermore, developers implement each one differently, with very little
standardization.
With this, extensions may now specify what other extensions they depend
on. This is for explicit *hard* dependencies that must be installed.
For example:
"requires": {
"MediaWiki": ">= 1.25.0",
"extensions": {
"FakeExtension": "*"
},
"skins": {
"FakeSkin": "*"
}
}
This would add a minimum requirement on MediaWiki 1.25.0+ (already
implemented), as well as the requirement that the FakeExtension extension
needs to be installed, as well as the FakeSkin skin. A wildcard (*) is
used instead of an explicit version requirement as many extensions do
not actually version themselves, and there is no consistent versioning
scheme yet.
Bug: T117277
Change-Id: If1cccee1a16a867a71bb0285691c400443d8a30a
2016-12-03 18:19:25 +00:00
|
|
|
} else {
|
|
|
|
|
// Otherwise, mark it as incompatible.
|
2018-04-08 23:26:01 +00:00
|
|
|
$msg = "{$dependencyName} does not expose its version, but {$checkedExt}"
|
2018-02-10 07:14:07 +00:00
|
|
|
. " requires: {$constraint}.";
|
2018-04-08 23:26:01 +00:00
|
|
|
return [
|
|
|
|
|
'msg' => $msg,
|
|
|
|
|
'type' => "incompatible-$type",
|
|
|
|
|
'incompatible' => $checkedExt,
|
|
|
|
|
];
|
registration: Allow specifying extension dependencies
There are some extensoins that depend upon another extension or skin,
usually in different ways:
* A constant that is added in the dependency extension, and the
existence of is checked for. This is problematic because it requires a
specific load order.
* Checking whether a specific class exists. This is problematic because
it is extremely fragile, and breaks whenever the class is renamed.
* Checking ExtensionRegistry::isLoaded(). This is mostly there, but it
only checks at runtime, and doesn't provide any machine readable data.
Furthermore, developers implement each one differently, with very little
standardization.
With this, extensions may now specify what other extensions they depend
on. This is for explicit *hard* dependencies that must be installed.
For example:
"requires": {
"MediaWiki": ">= 1.25.0",
"extensions": {
"FakeExtension": "*"
},
"skins": {
"FakeSkin": "*"
}
}
This would add a minimum requirement on MediaWiki 1.25.0+ (already
implemented), as well as the requirement that the FakeExtension extension
needs to be installed, as well as the FakeSkin skin. A wildcard (*) is
used instead of an explicit version requirement as many extensions do
not actually version themselves, and there is no consistent versioning
scheme yet.
Bug: T117277
Change-Id: If1cccee1a16a867a71bb0285691c400443d8a30a
2016-12-03 18:19:25 +00:00
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
// Try to get a constraint for the dependency version
|
|
|
|
|
try {
|
|
|
|
|
$installedVersion = new Constraint(
|
|
|
|
|
'==',
|
|
|
|
|
$this->versionParser->normalize( $this->loaded[$dependencyName]['version'] )
|
|
|
|
|
);
|
|
|
|
|
} catch ( UnexpectedValueException $e ) {
|
2016-12-15 23:09:26 +00:00
|
|
|
// Non-parsable version, output an error message that the version
|
registration: Allow specifying extension dependencies
There are some extensoins that depend upon another extension or skin,
usually in different ways:
* A constant that is added in the dependency extension, and the
existence of is checked for. This is problematic because it requires a
specific load order.
* Checking whether a specific class exists. This is problematic because
it is extremely fragile, and breaks whenever the class is renamed.
* Checking ExtensionRegistry::isLoaded(). This is mostly there, but it
only checks at runtime, and doesn't provide any machine readable data.
Furthermore, developers implement each one differently, with very little
standardization.
With this, extensions may now specify what other extensions they depend
on. This is for explicit *hard* dependencies that must be installed.
For example:
"requires": {
"MediaWiki": ">= 1.25.0",
"extensions": {
"FakeExtension": "*"
},
"skins": {
"FakeSkin": "*"
}
}
This would add a minimum requirement on MediaWiki 1.25.0+ (already
implemented), as well as the requirement that the FakeExtension extension
needs to be installed, as well as the FakeSkin skin. A wildcard (*) is
used instead of an explicit version requirement as many extensions do
not actually version themselves, and there is no consistent versioning
scheme yet.
Bug: T117277
Change-Id: If1cccee1a16a867a71bb0285691c400443d8a30a
2016-12-03 18:19:25 +00:00
|
|
|
// string is invalid
|
2018-04-08 23:26:01 +00:00
|
|
|
return [
|
|
|
|
|
'msg' => "$dependencyName does not have a valid version string.",
|
|
|
|
|
'type' => 'invalid-version',
|
|
|
|
|
];
|
registration: Allow specifying extension dependencies
There are some extensoins that depend upon another extension or skin,
usually in different ways:
* A constant that is added in the dependency extension, and the
existence of is checked for. This is problematic because it requires a
specific load order.
* Checking whether a specific class exists. This is problematic because
it is extremely fragile, and breaks whenever the class is renamed.
* Checking ExtensionRegistry::isLoaded(). This is mostly there, but it
only checks at runtime, and doesn't provide any machine readable data.
Furthermore, developers implement each one differently, with very little
standardization.
With this, extensions may now specify what other extensions they depend
on. This is for explicit *hard* dependencies that must be installed.
For example:
"requires": {
"MediaWiki": ">= 1.25.0",
"extensions": {
"FakeExtension": "*"
},
"skins": {
"FakeSkin": "*"
}
}
This would add a minimum requirement on MediaWiki 1.25.0+ (already
implemented), as well as the requirement that the FakeExtension extension
needs to be installed, as well as the FakeSkin skin. A wildcard (*) is
used instead of an explicit version requirement as many extensions do
not actually version themselves, and there is no consistent versioning
scheme yet.
Bug: T117277
Change-Id: If1cccee1a16a867a71bb0285691c400443d8a30a
2016-12-03 18:19:25 +00:00
|
|
|
}
|
|
|
|
|
// Check if the constraint actually matches...
|
|
|
|
|
if (
|
|
|
|
|
!$this->versionParser->parseConstraints( $constraint )->matches( $installedVersion )
|
|
|
|
|
) {
|
2018-04-08 23:26:01 +00:00
|
|
|
$msg = "{$checkedExt} is not compatible with the current "
|
registration: Allow specifying extension dependencies
There are some extensoins that depend upon another extension or skin,
usually in different ways:
* A constant that is added in the dependency extension, and the
existence of is checked for. This is problematic because it requires a
specific load order.
* Checking whether a specific class exists. This is problematic because
it is extremely fragile, and breaks whenever the class is renamed.
* Checking ExtensionRegistry::isLoaded(). This is mostly there, but it
only checks at runtime, and doesn't provide any machine readable data.
Furthermore, developers implement each one differently, with very little
standardization.
With this, extensions may now specify what other extensions they depend
on. This is for explicit *hard* dependencies that must be installed.
For example:
"requires": {
"MediaWiki": ">= 1.25.0",
"extensions": {
"FakeExtension": "*"
},
"skins": {
"FakeSkin": "*"
}
}
This would add a minimum requirement on MediaWiki 1.25.0+ (already
implemented), as well as the requirement that the FakeExtension extension
needs to be installed, as well as the FakeSkin skin. A wildcard (*) is
used instead of an explicit version requirement as many extensions do
not actually version themselves, and there is no consistent versioning
scheme yet.
Bug: T117277
Change-Id: If1cccee1a16a867a71bb0285691c400443d8a30a
2016-12-03 18:19:25 +00:00
|
|
|
. "installed version of {$dependencyName} "
|
|
|
|
|
. "({$this->loaded[$dependencyName]['version']}), "
|
|
|
|
|
. "it requires: " . $constraint . '.';
|
2018-04-08 23:26:01 +00:00
|
|
|
return [
|
|
|
|
|
'msg' => $msg,
|
|
|
|
|
'type' => "incompatible-$type",
|
|
|
|
|
'incompatible' => $checkedExt,
|
|
|
|
|
];
|
registration: Allow specifying extension dependencies
There are some extensoins that depend upon another extension or skin,
usually in different ways:
* A constant that is added in the dependency extension, and the
existence of is checked for. This is problematic because it requires a
specific load order.
* Checking whether a specific class exists. This is problematic because
it is extremely fragile, and breaks whenever the class is renamed.
* Checking ExtensionRegistry::isLoaded(). This is mostly there, but it
only checks at runtime, and doesn't provide any machine readable data.
Furthermore, developers implement each one differently, with very little
standardization.
With this, extensions may now specify what other extensions they depend
on. This is for explicit *hard* dependencies that must be installed.
For example:
"requires": {
"MediaWiki": ">= 1.25.0",
"extensions": {
"FakeExtension": "*"
},
"skins": {
"FakeSkin": "*"
}
}
This would add a minimum requirement on MediaWiki 1.25.0+ (already
implemented), as well as the requirement that the FakeExtension extension
needs to be installed, as well as the FakeSkin skin. A wildcard (*) is
used instead of an explicit version requirement as many extensions do
not actually version themselves, and there is no consistent versioning
scheme yet.
Bug: T117277
Change-Id: If1cccee1a16a867a71bb0285691c400443d8a30a
2016-12-03 18:19:25 +00:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2016-12-15 23:09:26 +00:00
|
|
|
return false;
|
registration: Allow specifying extension dependencies
There are some extensoins that depend upon another extension or skin,
usually in different ways:
* A constant that is added in the dependency extension, and the
existence of is checked for. This is problematic because it requires a
specific load order.
* Checking whether a specific class exists. This is problematic because
it is extremely fragile, and breaks whenever the class is renamed.
* Checking ExtensionRegistry::isLoaded(). This is mostly there, but it
only checks at runtime, and doesn't provide any machine readable data.
Furthermore, developers implement each one differently, with very little
standardization.
With this, extensions may now specify what other extensions they depend
on. This is for explicit *hard* dependencies that must be installed.
For example:
"requires": {
"MediaWiki": ">= 1.25.0",
"extensions": {
"FakeExtension": "*"
},
"skins": {
"FakeSkin": "*"
}
}
This would add a minimum requirement on MediaWiki 1.25.0+ (already
implemented), as well as the requirement that the FakeExtension extension
needs to be installed, as well as the FakeSkin skin. A wildcard (*) is
used instead of an explicit version requirement as many extensions do
not actually version themselves, and there is no consistent versioning
scheme yet.
Bug: T117277
Change-Id: If1cccee1a16a867a71bb0285691c400443d8a30a
2016-12-03 18:19:25 +00:00
|
|
|
}
|
2016-12-03 18:06:46 +00:00
|
|
|
}
|