Esempio n. 1
0
 /**
  * Проверяет условия указанные в теге 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;
     }
 }
Esempio n. 2
0
 /**
  * Проверять возможность удаления указанного пакета.
  *
  * Если существует пакет который зависит от данного то удаление невозможно.
  *
  * Массив пакетов для удаления. Если удаление невозможно вернет 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);
 }
Esempio n. 3
0
 /**
  */
 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);
 }
Esempio n. 4
0
File: deps.php Progetto: Rhoban/deps
<?php

include __DIR__ . '/src/autoload.php';
$deps = new Deps(__DIR__);
array_shift($argv);
$deps->run($argv);
Esempio n. 5
0
 /**
  * Удаление пакета
  */
 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);
         }
     }
 }