/** * Список установленных пакетов, * список репозиториев */ function cmdList() { PackageManager::get()->startup(); $l = PackageManager::getPackageSequence(); if (!count($l)) { io::out('Packages not installed'); } else { io::out('~WHITE~Installed packages:~~~'); io::out(sprintf('~SILVER~%-15s %-10s %s~~~', 'Package Name', 'Version', 'Summary')); foreach ($l as $p) { io::out(sprintf('%-15s %-10s %s', $p['name'], $p['version'], PackageManager::getInstalledPackage($p['name'], $p['version'])->summary)); } } PackageManager::get()->shutdown(); }
/** * Проверять возможность удаления указанного пакета. * * Если существует пакет который зависит от данного то удаление невозможно. * * Массив пакетов для удаления. Если удаление невозможно вернет 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); }
/** * Возвращает объект установленного пакета. * * @param string name * @return Package or false if packages not installed */ static function getInstalledPackage($name, $version = null) { if (is_null($version)) { foreach (array_reverse(PackageManager::getPackageSequence()) as $p) { if ($p['name'] == $name) { $version = $p['version']; break; } } } if (is_null($version)) { return false; } $iFile = PackageManager::getInstalledDir()->getFile($name . '_' . $version . '.tbz'); return Package::isPackage($iFile); }