33namespace Combodo \iTop \Setup \ModuleDependency ;
44
55require_once (APPROOT .'/setup/runtimeenv.class.inc.php ' );
6+
67use Combodo \iTop \PhpParser \Evaluation \PhpExpressionEvaluator ;
78use ModuleFileReaderException ;
89use RunTimeEnvironment ;
@@ -38,7 +39,7 @@ public function __construct(string $sDependencyExpression)
3839 if (preg_match_all ('/([^\(\)&| ]+)/ ' , $ sDependencyExpression , $ aMatches )) {
3940 foreach ($ aMatches as $ aMatch ) {
4041 foreach ($ aMatch as $ sModuleId ) {
41- if (! array_key_exists ($ sModuleId , $ this ->aParamsPerModuleId )) {
42+ if (!array_key_exists ($ sModuleId , $ this ->aParamsPerModuleId )) {
4243 // $sModuleId in the dependency string is made of a <name>/<optional_operator><version>
4344 // where the operator is < <= = > >= (by default >=)
4445 $ aModuleMatches = [];
@@ -71,6 +72,7 @@ private static function GetPhpExpressionEvaluator(): PhpExpressionEvaluator
7172
7273 /**
7374 * Return module names potentially required by current dependency
75+ *
7476 * @return array
7577 */
7678 public function GetRemainingModuleNamesToResolve (): array
@@ -85,22 +87,25 @@ public function IsResolved(): bool
8587
8688 /**
8789 * Check if dependency is resolved with current list of module versions
88- * @param array $aModuleVersions: versions by module names dict
89- * @param array $aSelectedModules: modules names dict
90+ *
91+ * @param array $aResolvedModuleVersions : versions by module names dict
92+ * @param array $aAllModuleNames : modules names dict
9093 *
9194 * @return void
9295 */
93- public function UpdateModuleResolutionState (array $ aModuleVersions , array $ aSelectedModules ): void
96+ public function UpdateModuleResolutionState (array $ aResolvedModuleVersions , array $ aAllModuleNames ): void
9497 {
9598 if (!$ this ->bValid ) {
9699 return ;
97100 }
98101
99102 $ aReplacements = [];
103+
104+ $ bDelayEvaluation = false ;
100105 foreach ($ this ->aParamsPerModuleId as $ sModuleId => list ($ sModuleName , $ sOperator , $ sExpectedVersion )) {
101- if (array_key_exists ($ sModuleName , $ aModuleVersions )) {
102- // module is present , check the version
103- $ sCurrentVersion = $ aModuleVersions [$ sModuleName ];
106+ if (array_key_exists ($ sModuleName , $ aResolvedModuleVersions )) {
107+ // module is resolved , check the version
108+ $ sCurrentVersion = $ aResolvedModuleVersions [$ sModuleName ];
104109 if (version_compare ($ sCurrentVersion , $ sExpectedVersion , $ sOperator )) {
105110 if (array_key_exists ($ sModuleName , $ this ->aRemainingModuleNamesToResolve )) {
106111 unset($ this ->aRemainingModuleNamesToResolve [$ sModuleName ]);
@@ -112,19 +117,23 @@ public function UpdateModuleResolutionState(array $aModuleVersions, array $aSele
112117 // a function call that results in a runtime fatal error
113118 }
114119 } else {
115- // module is not present
116- $ aReplacements [$ sModuleId ] = '(false) ' ; // Add parentheses to protect against invalid condition causing
117- // a function call that results in a runtime fatal error
120+ // module is not resolved yet
121+
122+ if (array_key_exists ($ sModuleName , $ aAllModuleNames )) {
123+ //Weird piece of code that covers below usecase:
124+ //module B dependency: 'moduleA || true'
125+ // if moduleA not present on disk, whole expression can be evaluated and may be resolved
126+ // if moduleA present on disk, we need to sort moduleB after moduleA. expression cannot be resolved yet
127+ $ bDelayEvaluation = true ;
128+ } else {
129+ $ aReplacements [$ sModuleId ] = '(false) ' ; // Add parentheses to protect against invalid condition causing
130+ }
131+
118132 }
119133 }
120134
121- foreach ($ this ->aRemainingModuleNamesToResolve as $ sModuleName => $ c ) {
122- if (array_key_exists ($ sModuleName , $ aSelectedModules )) {
123- // This module is actually a prerequisite
124- if (!array_key_exists ($ sModuleName , $ aModuleVersions )) {
125- return ;
126- }
127- }
135+ if ($ bDelayEvaluation ) {
136+ return ;
128137 }
129138
130139 $ bResult = false ;
0 commit comments