public function validateUninstallDependencies(array $uninstallPackages, \PEAR2\MultiErrors $errs) { $ret = true; foreach ($uninstallPackages as $package) { foreach ($this->reg->getDependentPackages($package) as $deppackage) { $dep = new \Pyrus\Dependency\Validator(array('channel' => $deppackage->channel, 'package' => $deppackage->name), \Pyrus\Validate::UNINSTALLING, $errs); foreach ($uninstallPackages as $test) { if ($deppackage->isEqual($test)) { // we are uninstalling both the package that is depended upon // and the parent package, so all dependencies are nulled continue 2; } } foreach (array('package', 'subpackage') as $packaged) { $deps = $deppackage->dependencies['required']->{$packaged}; if (isset($deps[$package->channel . '/' . $package->name])) { $ret = $ret && $dep->validatePackageUninstall($deps[$package->channel . '/' . $package->name], $package); } $deps = $deppackage->dependencies['optional']->{$packaged}; if (isset($deps[$package->channel . '/' . $package->name])) { $ret = $ret && $dep->validatePackageUninstall($deps[$package->channel . '/' . $package->name], $package); } } } } return $ret; }
/** * validate a downloaded package against installed packages * * @param $pkg downloaded package package.xml object * @param array $params full list of packages to install * @return bool */ function validateDownloadedPackage(\Pyrus\PackageFileInterface $pkg, $params = array()) { $me = $pkg->channel . '/' . $pkg->name; $reg = Config::current()->registry; $deppackages = $reg->getDependentPackages($pkg); $fail = false; if ($deppackages) { $actual = array(); // first, remove packages that will be installed foreach ($deppackages as $package) { foreach ($params as $packd) { if (strtolower($packd->name) == strtolower($package->name) && $packd->channel == $package->channel) { \Pyrus\Logger::log(3, 'skipping installed package check of "' . Config::parsedPackageNameToString(array('channel' => $package->channel, 'package' => $package->name), true) . '", version "' . $packd->version['release'] . '" will be ' . 'downloaded and installed'); continue 2; } } $actual[] = $package; } foreach ($actual as $package) { $checker = new \Pyrus\Dependency\Validator(array('channel' => $package->channel, 'package' => $package->name), $this->_state, $this->errs); foreach ($params as $packd) { $deps = $package->dependencies['required']->package; if (isset($deps[$me])) { $ret = $checker->_validatePackageDownload($deps[$me], array($pkg, $package)); } $deps = $package->dependencies['required']->subpackage; if (isset($deps[$me])) { $ret = $checker->_validatePackageDownload($deps[$me], array($pkg)); } $deps = $package->dependencies['optional']->package; if (isset($deps[$me])) { $ret = $checker->_validatePackageDownload($deps[$me], array($pkg, $package)); } $deps = $package->dependencies['optional']->subpackage; if (isset($deps[$me])) { $ret = $checker->_validatePackageDownload($deps[$me], array($pkg)); } } } } if (count($this->errs->E_ERROR)) { return $this->raiseError('%s cannot be installed, conflicts with installed packages'); } return true; }
/** * validate dependencies against the local registry, packages to be installed, * and environment (php version, OS, architecture, enabled extensions) * * @param array $toInstall an array of \Pyrus\Package objects * @param \PEAR2\MultiErrors $errs */ function validateDependencies(array $toInstall, \PEAR2\MultiErrors $errs) { $dep = new \Pyrus\Dependency\Validator($this->packageInfo['channel'] . '/' . $this->packageInfo['name'], \Pyrus\Validate::DOWNLOADING, $errs); $dep->validatePhpDependency($this->dependencies['required']->php); $dep->validatePearinstallerDependency($this->dependencies['required']->pearinstaller); foreach (array('required', 'optional') as $required) { foreach ($this->dependencies[$required]->package as $d) { $dep->validatePackageDependency($d, $toInstall); } foreach ($this->dependencies[$required]->subpackage as $d) { $dep->validateSubpackageDependency($d, $toInstall); } foreach ($this->dependencies[$required]->extension as $d) { $dep->validateExtensionDependency($d); } } foreach ($this->dependencies['required']->arch as $d) { $dep->validateArchDependency($d); } foreach ($this->dependencies['required']->os as $d) { $dep->validateOsDependency($d); } }