/** * Проверяет условия указанные в теге 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); }