/**
* Construct list of outdated components
*
* @param string[] $componentsToCheck An array mapping component names to the latest locally available version.
* If the version is later than the currently installed version, the component
* must be upgraded.
*
* Example: `array('core' => '2.11.0')`
* @throws \Exception
* @return array array( componentName => array( oldVersion, newVersion), [...])
*/
public function getComponentsWithNewVersion($componentsToCheck)
{
$componentsToUpdate = array();
// we make sure core updates are processed before any plugin updates
if (isset($componentsToCheck['core'])) {
$coreVersions = $componentsToCheck['core'];
unset($componentsToCheck['core']);
$componentsToCheck = array_merge(array('core' => $coreVersions), $componentsToCheck);
}
$recordedCoreVersion = $this->getCurrentComponentVersion('core');
if (empty($recordedCoreVersion)) {
// This should not happen
$recordedCoreVersion = Version::VERSION;
$this->markComponentSuccessfullyUpdated('core', $recordedCoreVersion);
}
foreach ($componentsToCheck as $name => $version) {
$currentVersion = $this->getCurrentComponentVersion($name);
if (ColumnUpdater::isDimensionComponent($name)) {
$isComponentOutdated = $currentVersion !== $version;
} else {
// note: when versionCompare == 1, the version in the DB is newer, we choose to ignore
$isComponentOutdated = version_compare($currentVersion, $version) == -1;
}
if ($isComponentOutdated || $currentVersion === false) {
$componentsToUpdate[$name] = array(self::INDEX_CURRENT_VERSION => $currentVersion, self::INDEX_NEW_VERSION => $version);
}
}
return $componentsToUpdate;
}