/** * @param IModule $module * @param Problem $problem * @throws InvalidArgumentException */ public function testUpgrade(IModule $module, Problem $problem = NULL) { $installedModules =& $this->installedModules; $modules =& $this->modules; foreach ($module->getRequire() as $name => $require) { $requires = VersionHelpers::normalizeRequire($require); if (!isset($installedModules[$name])) { if ($problem && isset($modules[$name])) { try { $solver = $this->createSolver(); $solver->testInstall($modules[$name], $problem); } catch (InvalidArgumentException $e) { throw new InvalidArgumentException("Module '{$module->getName()}' depend on '{$name}' which is not installed."); } $job = new Job(Job::ACTION_INSTALL, $modules[$name]); if (!$problem->hasSolution($job)) { $problem->addSolution($job); } $installedModules[$name] = $modules[$name]; $tr = array($this->libsDir => '%libsDir%', $this->modulesDir => '%modulesDir%'); $this->modulesConfig[$name] = array(ModuleManager::MODULE_STATUS => ModuleManager::STATUS_INSTALLED, ModuleManager::MODULE_ACTION => ModuleManager::ACTION_NONE, ModuleManager::MODULE_CLASS => $module->getClassName(), ModuleManager::MODULE_VERSION => $module->getVersion(), ModuleManager::MODULE_PATH => str_replace(array_keys($tr), array_merge($tr), $module->getPath()), ModuleManager::MODULE_AUTOLOAD => str_replace(array_keys($tr), array_merge($tr), $module->getAutoload()), ModuleManager::MODULE_REQUIRE => $module->getRequire()); } else { throw new InvalidArgumentException("Module '{$module->getName()}' depend on '{$name}' which is not installed."); } } foreach ($requires as $items) { foreach ($items as $operator => $version) { $dVersion = $this->modulesConfig[$name][ModuleManager::MODULE_VERSION]; if (!version_compare($dVersion, $version, $operator)) { if (!version_compare($installedModules[$name]->getVersion(), $version, $operator)) { throw new InvalidArgumentException("Module '{$module->getName()}' depend on '{$name}' with version '{$require}'. Current version is '{$dVersion}'."); } // dependency must be upgraded if ($problem && isset($modules[$name])) { try { $solver = $this->createSolver(); $solver->testUpgrade($modules[$name], $problem); } catch (InvalidArgumentException $e) { throw new InvalidArgumentException("Module '{$module->getName()}' depend on '{$name}' with version '{$require}'. Current version is '{$dVersion}'."); } $job = new Job(Job::ACTION_UPGRADE, $modules[$name]); if (!$problem->hasSolution($job)) { $problem->addSolution($job); } $this->modulesConfig[$name][ModuleManager::MODULE_VERSION] = $modules[$name]->getVersion(); } else { throw new InvalidArgumentException("Module '{$module->getName()}' depend on '{$name}' with version '{$require}'. Current version is '{$dVersion}'."); } } } } } }