use Composer\Semver\Semver;
use Wikimedia\ScopedCallback;
+use MediaWiki\Shell\Shell;
+use MediaWiki\ShellDisabledError;
/**
* ExtensionRegistry class
*/
protected $testAttributes = [];
+ /**
+ * Whether to check dev-requires
+ *
+ * @var bool
+ */
+ protected $checkDev = false;
+
/**
* @var ExtensionRegistry
*/
return self::$instance;
}
+ /**
+ * @since 1.34
+ * @param bool $check
+ */
+ public function setCheckDevRequires( $check ) {
+ $this->checkDev = $check;
+ }
+
/**
* @param string $path Absolute path to the JSON file
*/
// A few more things to vary the cache on
$versions = [
'registration' => self::CACHE_VERSION,
- 'mediawiki' => $wgVersion
+ 'mediawiki' => $wgVersion,
+ 'abilities' => $this->getAbilities(),
+ 'checkDev' => $this->checkDev,
];
// We use a try/catch because we don't want to fail here
$this->finished = true;
}
+ /**
+ * Get the list of abilities and their values
+ * @return bool[]
+ */
+ private function getAbilities() {
+ return [
+ 'shell' => !Shell::isDisabled(),
+ ];
+ }
+
+ /**
+ * Queries information about the software environment and constructs an appropiate version checker
+ *
+ * @return VersionChecker
+ */
+ private function buildVersionChecker() {
+ global $wgVersion;
+ // array to optionally specify more verbose error messages for
+ // missing abilities
+ $abilityErrors = [
+ 'shell' => ( new ShellDisabledError() )->getMessage(),
+ ];
+
+ return new VersionChecker(
+ $wgVersion,
+ PHP_MAJOR_VERSION . '.' . PHP_MINOR_VERSION . '.' . PHP_RELEASE_VERSION,
+ get_loaded_extensions(),
+ $this->getAbilities(),
+ $abilityErrors
+ );
+ }
+
/**
* Process a queue of extensions and return their extracted data
*
* @throws ExtensionDependencyError
*/
public function readFromQueue( array $queue ) {
- global $wgVersion;
$autoloadClasses = [];
$autoloadNamespaces = [];
$autoloaderPaths = [];
$processor = new ExtensionProcessor();
- $versionChecker = new VersionChecker(
- $wgVersion,
- PHP_MAJOR_VERSION . '.' . PHP_MINOR_VERSION . '.' . PHP_RELEASE_VERSION,
- get_loaded_extensions()
- );
+ $versionChecker = $this->buildVersionChecker();
$extDependencies = [];
$incompatible = [];
$warnings = false;
}
// get all requirements/dependencies for this extension
- $requires = $processor->getRequirements( $info );
+ $requires = $processor->getRequirements( $info, $this->checkDev );
// validate the information needed and add the requirements
if ( is_array( $requires ) && $requires && isset( $info['name'] ) ) {
*
* If some extensions are already queued, this will load
* those as well.
- *
+ * TODO: Remove in MediaWiki 1.35
+ * @deprecated since 1.34, use ExtensionRegistry->queue() instead
* @param string $path Absolute path to the JSON file
*/
public function load( $path ) {
+ wfDeprecated( __METHOD__, '1.34' );
$this->loadFromQueue(); // First clear the queue
$this->queue( $path );
$this->loadFromQueue();