Allow for comparisons of the module's versions in the expression of dependencies. For example one can now say "itop-config-mgmt/>=2.0.2" for a dependency.

SVN:2.0.1[2854]
This commit is contained in:
Denis Flaven
2013-09-23 13:22:02 +00:00
parent 7ba2cf59de
commit 7ec9022bd7

View File

@@ -173,6 +173,20 @@ class ModuleDiscovery
protected static function DependencyIsResolved($sDepString, $aOrderedModules) protected static function DependencyIsResolved($sDepString, $aOrderedModules)
{ {
$bResult = false; $bResult = false;
$aModuleVersions = array();
// Separate the module names from their version for an easier comparison later
foreach($aOrderedModules as $sModuleId)
{
if (preg_match('|^([^/]+)/(.*)$|', $sModuleId, $aMatches))
{
$aModuleVersions[$aMatches[1]] = $aMatches[2];
}
else
{
// No version number found, assume 1.0.0
$aModuleVersions[$sModuleId] = '1.0.0';
}
}
if (preg_match_all('/([^\(\)&| ]+)/', $sDepString, $aMatches)) if (preg_match_all('/([^\(\)&| ]+)/', $sDepString, $aMatches))
{ {
$aReplacements = array(); $aReplacements = array();
@@ -180,13 +194,33 @@ class ModuleDiscovery
{ {
foreach($aMatch as $sModuleId) foreach($aMatch as $sModuleId)
{ {
if (in_array($sModuleId, $aOrderedModules)) // $sModuleId in the dependency string is made of a <name>/<optional_operator><version>
// where the operator is < <= = > >= (by default >=)
if(preg_match('|^([^/]+)/(<?>?=?)([^><=]+)$|', $sModuleId, $aModuleMatches))
{
$sModuleName = $aModuleMatches[1];
$sOperator = $aModuleMatches[2];
if ($sOperator == '')
{
$sOperator = '>=';
}
$sExpectedVersion = $aModuleMatches[3];
if (array_key_exists($sModuleName, $aModuleVersions))
{
// module is present, check the version
$sCurrentVersion = $aModuleVersions[$sModuleName];
if (version_compare($sCurrentVersion, $sExpectedVersion, $sOperator))
{ {
// module is present
$aReplacements[$sModuleId] = '(true)'; // Add parentheses to protect against invalid condition causing $aReplacements[$sModuleId] = '(true)'; // Add parentheses to protect against invalid condition causing
// a function call that results in a runtime fatal error // a function call that results in a runtime fatal error
} }
else else
{
$aReplacements[$sModuleId] = '(false)'; // Add parentheses to protect against invalid condition causing
// a function call that results in a runtime fatal error
}
}
else
{ {
// module is not present // module is not present
$aReplacements[$sModuleId] = '(false)'; // Add parentheses to protect against invalid condition causing $aReplacements[$sModuleId] = '(false)'; // Add parentheses to protect against invalid condition causing
@@ -194,6 +228,7 @@ class ModuleDiscovery
} }
} }
} }
}
$sBooleanExpr = str_replace(array_keys($aReplacements), array_values($aReplacements), $sDepString); $sBooleanExpr = str_replace(array_keys($aReplacements), array_values($aReplacements), $sDepString);
$bOk = @eval('$bResult = '.$sBooleanExpr.'; return true;'); $bOk = @eval('$bResult = '.$sBooleanExpr.'; return true;');
if($bOk == false) if($bOk == false)