/** * Проверяет условия указанные в теге 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 cmdInfo() { if (($package = ArgsHolder::get()->shiftCommand(false)) === false) { return IO::out('Specify package file', IO::MESSAGE_FAIL) | 1; } if (($version = ArgsHolder::get()->shiftCommand()) === false) { $version = null; } try { PackageManager::get()->startup(); $width = 20; $p = PackageManager::getInstalledPackage(trim($package, '\'"'), $version); if ($p !== false) { $r = array('Name', 'Version', 'Summary', 'Mantainer', 'Tags'); foreach ($r as $k) { $pname = strtolower($k); io::out(sprintf('%18s: %s', $k, $p->{$pname})); } // description $str = ''; if (trim($p->description) != '') { foreach (explode(PHP_EOL . PHP_EOL, trim($p->description)) as $aa) { $str .= chunk_split(implode(' ', explode(PHP_EOL, $aa))) . PHP_EOL; } $a = explode(PHP_EOL, $str); io::out(sprintf('%18s: %s', 'Description', $a[0])); for ($i = 1, $c = count($a); $i < $c; $i++) { if (trim($a[$i]) != '') { io::out(sprintf('%' . ($i ? $width : '') . 's%s', '', $a[$i])); } } } // deps $d = $p->deps; if (!is_null($php = $d['php'])) { $as = 'PHP ' . $php['rel'] . ' ' . $php['version']; } if (count($ex = $d['phpExtensions'])) { $as .= '; ' . implode(', ', $ex); } $a = isset($as) ? array($as) : array(); if (count($inis = $d['phpIniValues'])) { foreach ($inis as $i) { $a[] = 'ini.' . $i['name'] . ' ' . $i['rel'] . ' ' . $i['value']; } } if (count($pkgs = $d['packages'])) { foreach ($pkgs as $i) { $a[] = '' . $i['name'] . ' ' . $i['rel'] . ' ' . $i['version']; } } io::out(sprintf('%18s: %s', 'Dependensies', count($a) ? $a[0] : '')); for ($i = 1, $c = count($a); $i < $c; $i++) { io::out(sprintf('%' . ($i ? $width : '') . 's%s', '', $a[$i])); } } else { io::out('Given package ' . $package . (!is_null($version) ? "({$version})" : '') . ' not installed', IO::MESSAGE_FAIL); } PackageManager::get()->shutdown(); } catch (Exception $e) { PackageManager::getRollback()->stepBack(); return io::out($e->getMessage(), IO::MESSAGE_FAIL) | (is_null($e->getCode()) ? 2 : $e->getCode()); } }
/** * Инсталяция пакета * * Пакет $package может быть представлен ввиде локального фала(~/mypackage.tbz), * имени пакета (admin) или ввиде имени пакет, версии и отношения (news>=2.0-alpha) * * @throw PackageManagerException, RepositoryListException * @param string $package */ static function install($package) { // локальный файл if (($fp = realpath($package)) !== false) { if (($p = Package::isPackage(new File($fp, true))) !== false) { $package = $p; } else { throw new PackageManagerException('Given file (' . $package . ') isn\'t a well formed package.'); } } // зависимости io::out('~WHITE~Checking dependencies~~~'); $installList = Deps::calculate($package); if ($installList === false) { throw new PackageManagerException('Невозможно удовлетворить зависимости, или не найдены требуемые пакеты.'); } elseif ($installList instanceof Package) { return IO::out('Установленная версия пакета ' . $installList->name . ': ' . $installList->version) | 0; } $newPackages = array(); $updatePackages = array(); $installedPackages = array(); $list = array(); for ($i = 0, $c = count($installList); $i < $c; $i++) { $package = $installList[$i]; if ($package->status != Package::INSTALLED) { $list[] = $package; } // for information oupput if ($package->status == Package::INSTALLED) { $installedPackages[] = $package; } else { if (false === ($p = PackageManager::getInstalledPackage($package->name))) { $newPackages[] = $package; } else { $updatePackages[] = $p; } } } foreach ($newPackages as $p) { $n[] = $p->name . '(' . $p->version . ')'; } if (isset($n)) { io::out('New Packages: ' . implode(', ', $n)); } foreach ($updatePackages as $p) { $u[] = $p->name . '(' . $p->version . ')'; } if (isset($u)) { io::out('Packages to be updated: ' . implode(', ', $u)); } foreach ($installedPackages as $p) { $inst[] = $p->name . '(' . $p->version . ')'; } if (isset($inst)) { io::out('Installed Packages: ' . implode(', ', $inst)); } // доставка $deployList = array(); io::out('~WHITE~Fetching packages~~~'); $dDir = self::getDownloadDir(); foreach ($list as $package) { io::out($package->name . '_' . $package->version . ': ', false); $tFile = $dDir->getFile($package->name . '_' . $package->version . '.tbz'); //look in downloaded dir $p = Package::isPackage($tFile); if ($p instanceof Package && $p->name == $package->name && $p->version == $package->version) { io::out('Already downloaded', false); $deployList[] = $p; } else { // откат для скачанногофайла PackageManager::getRollback()->push('delete', $tFile); $deployList[] = $package->delivery($tFile); } io::done(); } try { foreach ($deployList as $p) { io::out('~WHITE~Deploying ' . $p->name . '(' . $p->version . '):~~~'); $p->deploy(); $p->file->move(PackageManager::getInstalledDir()->getFile($p->name . '_' . $p->version . '.tbz')); PackageManager::get()->packagesSequence->addPackage($p->name, $p->version); } } catch (Exception $e) { echo $e->getMessage(); PackageManager::getRollback()->stepBack(); } return; }