Exemple #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;
     }
 }
Exemple #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);
 }
 /**
  * Информация об указанном пакете 
  */
 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());
     }
 }
Exemple #4
0
 /**
  * Инсталяция пакета
  *
  * Пакет $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;
 }