/** * 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 = array(); $processor = new ExtensionProcessor(); $incompatible = array(); $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; } // 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'] = array(); foreach ($data['credits'] as $credit) { $data['globals']['wgExtensionCredits'][$credit['type']][] = $credit; } $data['globals']['wgExtensionCredits'][self::MERGE_STRATEGY] = 'array_merge_recursive'; $data['autoload'] = $autoloadClasses; return $data; }
/** * @dataProvider provideCheck */ public function testCheck($coreVersion, $constraint, $expected) { $checker = new CoreVersionChecker($coreVersion); $this->assertEquals($expected, $checker->check($constraint)); }