/** * Проверяет условия указанные в теге condition. * * В данной момент реализована проверка установленного пакета * * @param DOMNode * @return bool */ private function checkCondition(DOMNode $node) { IO::info('Check Condition ', false); $attr = $node->attributes; $packageName = is_null($attr->getNamedItem('package')) ? null : $attr->getNamedItem('package')->nodeValue; if (!is_null($packageName)) { $version = is_null($attr->getNamedItem('version')) ? null : $attr->getNamedItem('version')->nodeValue; $rel = is_null($attr->getNamedItem('rel')) ? null : Deps::normalizeRel($attr->getNamedItem('rel')->nodeValue); if (is_null($version) && $rel != '!=') { $version = '0.0'; $rel = '>='; } elseif (is_null($rel)) { $rel = '='; } io::info($packageName . ' ' . $rel . ' ' . $version . "\t", false); $p = PackageManager::getInstalledPackage($packageName); if ($rel == '!=') { $res = $p === false; } elseif ($p !== false) { $res = version_compare($p->version, $version, $rel); } else { $res = false; } io::info('', $res ? IO::MESSAGE_OK : IO::MESSAGE_FAIL); return $res; } }
/** * Проверять возможность удаления указанного пакета. * * Если существует пакет который зависит от данного то удаление невозможно. * * Массив пакетов для удаления. Если удаление невозможно вернет false. * * @param $nvr * @param array $unstatisfied * @return array of packages | bool false */ static function isNoNeeded($nvr, &$unstatisfied) { $name = $nvr['name']; $pseq = PackageManager::getPackageSequence(); $nvr['rel'] = Deps::normalizeRel($nvr['rel']); if ($nvr['rel'] == '=') { $nvr['rel'] = '>='; } $stayedList = array(); // версии которые останцтся после уддаления $removedList = array(); // версии которые необходимо удалить $addToRemovedList = false; $checkList = array(); // пакеты которые необходимо проверить на совместимость for ($i = 0, $c = count($pseq); $i < $c; $i++) { if ($pseq[$i]['name'] != $name) { if ($addToRemovedList) { $checkList[] = $pseq[$i]; } } else { if (version_compare($pseq[$i]['version'], $nvr['version'], $nvr['rel'])) { $addToRemovedList = true; } if ($addToRemovedList) { $removedList[] = PackageManager::getInstalledPackage($pseq[$i]['name'], $pseq[$i]['version']); } else { $stayedList[] = $pseq[$i]; } } } /* io::out('Stayed list : '.$name, false); foreach($stayedList as $a) io::out($a['name'].'='.$a['version']. ' ', false); io::out(); io::out('removes list : ', false); foreach($removedList as $a) io::out($a->version. ' ', false); io::out(); io::out('CheckList : ', false); foreach($checkList as $a) io::out($a['name'].' '.$a['version'].', ', false); io::out(); */ foreach ($checkList as $pnvr) { $packageDeps = PackageManager::getInstalledPackage($pnvr['name'], $pnvr['version'])->deps['packages']; foreach ($packageDeps as $p) { if ($p['name'] == $name) { $statisfy = false; $luns = array(); // localUnstatisfied //io::out($nvr['name'].' '.$nvr['version']); //print_r($p); // Все версии пакета будут удалены, а пакет фигурирует в зависимостях if (count($stayedList) == 0) { $luns[$p['name'] . ' ' . $p['rel'] . ' ' . $p['version']] = 1; } else { foreach ($stayedList as $stayedPackage) { if (!version_compare($stayedPackage['version'], $p['version'], $p['rel'])) { $luns[$p['name'] . ' ' . $p['rel'] . ' ' . $p['version']] = 1; } else { $statisfy = true; break; } } } // если после удаления не останется ниодного пакета удовлетворяющего зависимости, // то добавляем в массив нудовлетворенных зависимостей $luns if (!$statisfy) { $unstatisfied[$pnvr['name'] . '(' . $pnvr['version'] . ')'] = $luns; } } } } return count($unstatisfied) ? false : array_reverse($removedList); }
/** */ function __get($property) { if ($property == 'deps') { if (is_null($this->deps)) { $this->deps = Deps::parsePackageXml($this->xml); } return $this->deps; } if (in_array($property, array('file', 'name', 'version', 'status', 'xml'))) { return $this->{$property}; } if (in_array($property, array('summary', 'description'))) { return $this->getProperty($property); } if ($property == 'tags') { $tags = $this->getProperty($property); return is_null($tags) ? '' : preg_replace('#\\s+#', ' ', trim($tags)); } if ($property == 'mantainer') { return $this->getProperty('mantainer/name') . (!is_null($e = $this->getProperty('mantainer/email')) ? " <{$e}>" : ''); } throw new PackageException('__get: unknown property ' . $property); }
<?php include __DIR__ . '/src/autoload.php'; $deps = new Deps(__DIR__); array_shift($argv); $deps->run($argv);
/** * Удаление пакета */ static function uninstall($package) { $nvr = PackageManager::parseNRV($package); // проверка обратных зависимостей $res = Deps::isNoNeeded($nvr, $unstatisfied); if (count($res) == 0) { return IO::out('Packages to uninstall not found', IO::MESSAGE_FAIL); } if ($res === false) { io::out('Unable uninstall package ~WHITE~' . $nvr['name'] . '~~~ because', IO::MESSAGE_FAIL); foreach ($unstatisfied as $p => $d) { io::out('Package ' . $p . ' require ' . implode(', ', array_keys($d))); } return false; } io::out('Packages to be removed: ', false); foreach ($res as $p) { io::out($p->name . '(' . $p->version . ') ', false); } io::out(); if (IO::NO == io::dialog('Continue?', IO::YES | IO::NO, IO::NO)) { return 1; } foreach ($res as $p) { io::out('~WHITE~Undeploying ' . $p->name . '(' . $p->version . '):~~~'); $r = Deployer::undeploy(Deployer::getPackageRollbackDir($p)); if ($r || IO::OK != IO::dialog('Some part of rollback failed. Remove anyway?', IO::YES | IO::NO, IO::YES)) { Deployer::getPackageRollbackDir($p)->delete(); $p->file->delete(); PackageManager::get()->packagesSequence->removePackage($p->name, $p->version); } } }