/** * Process a queue of extensions and return their extracted data * * @param array $queue keys are filenames, values are ignored * @return array extracted info * @throws Exception */ public function readFromQueue(array $queue) { global $wgVersion; $autoloadClasses = []; $autoloaderPaths = []; $processor = new ExtensionProcessor(); $incompatible = []; $coreVersionParser = new CoreVersionChecker($wgVersion); foreach ($queue as $path => $mtime) { $json = file_get_contents($path); if ($json === false) { throw new Exception("Unable to read {$path}, does it exist?"); } $info = json_decode($json, true); if (!is_array($info)) { throw new Exception("{$path} is not a valid JSON file."); } if (!isset($info['manifest_version'])) { // For backwards-compatability, assume a version of 1 $info['manifest_version'] = 1; } $version = $info['manifest_version']; if ($version < self::OLDEST_MANIFEST_VERSION || $version > self::MANIFEST_VERSION) { throw new Exception("{$path}: unsupported manifest_version: {$version}"); } $autoload = $this->processAutoLoader(dirname($path), $info); // Set up the autoloader now so custom processors will work $GLOBALS['wgAutoloadClasses'] += $autoload; $autoloadClasses += $autoload; // 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; } // Get extra paths for later inclusion $autoloaderPaths = array_merge($autoloaderPaths, $processor->getExtraAutoloaderPaths(dirname($path), $info)); // Compatible, read and extract info $processor->extractInfo($path, $info, $version); } if ($incompatible) { if (count($incompatible) === 1) { throw new Exception($incompatible[0]); } else { throw new Exception(implode("\n", $incompatible)); } } $data = $processor->getExtractedInfo(); // Need to set this so we can += to it later $data['globals']['wgAutoloadClasses'] = []; $data['autoload'] = $autoloadClasses; $data['autoloaderPaths'] = $autoloaderPaths; return $data; }