BSolver/LibsolvSolver: Add Update()
This commit is contained in:
@@ -55,6 +55,11 @@ public:
|
|||||||
const BSolverPackageSpecifierList& packages,
|
const BSolverPackageSpecifierList& packages,
|
||||||
const BSolverPackageSpecifier** _unmatched
|
const BSolverPackageSpecifier** _unmatched
|
||||||
= NULL) = 0;
|
= NULL) = 0;
|
||||||
|
virtual status_t Update(
|
||||||
|
const BSolverPackageSpecifierList& packages,
|
||||||
|
bool installNotYetInstalled,
|
||||||
|
const BSolverPackageSpecifier** _unmatched
|
||||||
|
= NULL) = 0;
|
||||||
virtual status_t VerifyInstallation() = 0;
|
virtual status_t VerifyInstallation() = 0;
|
||||||
|
|
||||||
bool HasProblems() const
|
bool HasProblems() const
|
||||||
|
|||||||
@@ -321,71 +321,12 @@ LibsolvSolver::Install(const BSolverPackageSpecifierList& packages,
|
|||||||
if (error != B_OK)
|
if (error != B_OK)
|
||||||
return error;
|
return error;
|
||||||
|
|
||||||
int32 packageCount = packages.CountSpecifiers();
|
error = _AddSpecifiedPackages(packages, _unmatched, 0);
|
||||||
for (int32 i = 0; i < packageCount; i++) {
|
if (error != B_OK)
|
||||||
const BSolverPackageSpecifier& specifier = *packages.SpecifierAt(i);
|
return error;
|
||||||
switch (specifier.Type()) {
|
|
||||||
case BSolverPackageSpecifier::B_UNSPECIFIED:
|
|
||||||
return B_BAD_VALUE;
|
|
||||||
|
|
||||||
case BSolverPackageSpecifier::B_PACKAGE:
|
|
||||||
{
|
|
||||||
BSolverPackage* package = specifier.Package();
|
|
||||||
Solvable* solvable;
|
|
||||||
if (package == NULL
|
|
||||||
|| (solvable = _GetSolvable(package)) == NULL) {
|
|
||||||
return B_BAD_VALUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
queue_push2(fJobs, SOLVER_SOLVABLE,
|
|
||||||
solvable - fPool->solvables);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case BSolverPackageSpecifier::B_SELECT_STRING:
|
|
||||||
{
|
|
||||||
// find matching packages
|
|
||||||
SolvQueue matchingPackages;
|
|
||||||
|
|
||||||
int flags = SELECTION_NAME | SELECTION_PROVIDES | SELECTION_GLOB
|
|
||||||
| SELECTION_CANON | SELECTION_DOTARCH | SELECTION_REL;
|
|
||||||
/*int matchFlags =*/ selection_make(fPool, &matchingPackages,
|
|
||||||
specifier.SelectString().String(), flags);
|
|
||||||
if (matchingPackages.count == 0) {
|
|
||||||
if (_unmatched != NULL)
|
|
||||||
*_unmatched = &specifier;
|
|
||||||
return B_NAME_NOT_FOUND;
|
|
||||||
}
|
|
||||||
// TODO: We might want to add support for restricting to certain repositories.
|
|
||||||
#if 0
|
|
||||||
// restrict to the matching repository
|
|
||||||
if (BSolverRepository* repository = specifier.Repository()) {
|
|
||||||
RepositoryInfo* repositoryInfo
|
|
||||||
= _GetRepositoryInfo(repository);
|
|
||||||
if (repositoryInfo == NULL)
|
|
||||||
return B_BAD_VALUE;
|
|
||||||
|
|
||||||
SolvQueue repoFilter;
|
|
||||||
queue_push2(&repoFilter,
|
|
||||||
SOLVER_SOLVABLE_REPO
|
|
||||||
/* | SOLVER_SETREPO | SOLVER_SETVENDOR*/,
|
|
||||||
repositoryInfo->SolvRepo()->repoid);
|
|
||||||
|
|
||||||
selection_filter(fPool, &matchingPackages, &repoFilter);
|
|
||||||
|
|
||||||
if (matchingPackages.count == 0)
|
|
||||||
return B_NAME_NOT_FOUND;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
for (int j = 0; j < matchingPackages.count; j++)
|
|
||||||
queue_push(fJobs, matchingPackages.elements[j]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// set jobs' solver mode and solve
|
// set jobs' solver mode and solve
|
||||||
_SetJobsSolverMode(*fJobs, SOLVER_INSTALL);
|
_SetJobsSolverMode(SOLVER_INSTALL);
|
||||||
|
|
||||||
_InitSolver();
|
_InitSolver();
|
||||||
return _Solve();
|
return _Solve();
|
||||||
@@ -412,56 +353,61 @@ LibsolvSolver::Uninstall(const BSolverPackageSpecifierList& packages,
|
|||||||
if (error != B_OK)
|
if (error != B_OK)
|
||||||
return error;
|
return error;
|
||||||
|
|
||||||
int32 packageCount = packages.CountSpecifiers();
|
error = _AddSpecifiedPackages(packages, _unmatched,
|
||||||
for (int32 i = 0; i < packageCount; i++) {
|
SELECTION_INSTALLED_ONLY);
|
||||||
const BSolverPackageSpecifier& specifier = *packages.SpecifierAt(i);
|
if (error != B_OK)
|
||||||
switch (specifier.Type()) {
|
return error;
|
||||||
case BSolverPackageSpecifier::B_UNSPECIFIED:
|
|
||||||
return B_BAD_VALUE;
|
|
||||||
|
|
||||||
case BSolverPackageSpecifier::B_PACKAGE:
|
// set jobs' solver mode and solve
|
||||||
{
|
_SetJobsSolverMode(SOLVER_ERASE);
|
||||||
BSolverPackage* package = specifier.Package();
|
|
||||||
Solvable* solvable;
|
|
||||||
if (package == NULL
|
|
||||||
|| (solvable = _GetSolvable(package)) == NULL
|
|
||||||
|| package->Repository()
|
|
||||||
!= fInstalledRepository->Repository()) {
|
|
||||||
return B_BAD_VALUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
queue_push2(fJobs, SOLVER_SOLVABLE,
|
_InitSolver();
|
||||||
solvable - fPool->solvables);
|
solver_set_flag(fSolver, SOLVER_FLAG_ALLOW_UNINSTALL, 1);
|
||||||
break;
|
return _Solve();
|
||||||
}
|
}
|
||||||
|
|
||||||
case BSolverPackageSpecifier::B_SELECT_STRING:
|
|
||||||
{
|
|
||||||
// find matching packages
|
|
||||||
SolvQueue matchingPackages;
|
|
||||||
|
|
||||||
int flags = SELECTION_NAME | SELECTION_PROVIDES | SELECTION_GLOB
|
|
||||||
| SELECTION_CANON | SELECTION_DOTARCH | SELECTION_REL
|
|
||||||
| SELECTION_INSTALLED_ONLY;
|
|
||||||
/*int matchFlags =*/ selection_make(fPool, &matchingPackages,
|
|
||||||
specifier.SelectString().String(), flags);
|
|
||||||
if (matchingPackages.count == 0) {
|
|
||||||
if (_unmatched != NULL)
|
|
||||||
*_unmatched = &specifier;
|
|
||||||
return B_NAME_NOT_FOUND;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int j = 0; j < matchingPackages.count; j++)
|
|
||||||
queue_push(fJobs, matchingPackages.elements[j]);
|
status_t
|
||||||
|
LibsolvSolver::Update(const BSolverPackageSpecifierList& packages,
|
||||||
|
bool installNotYetInstalled, const BSolverPackageSpecifier** _unmatched)
|
||||||
|
{
|
||||||
|
if (_unmatched != NULL)
|
||||||
|
*_unmatched = NULL;
|
||||||
|
|
||||||
|
// add repositories to pool
|
||||||
|
status_t error = _AddRepositories();
|
||||||
|
if (error != B_OK)
|
||||||
|
return error;
|
||||||
|
|
||||||
|
// add the packages to update to the job queue -- if none are specified,
|
||||||
|
// update all
|
||||||
|
error = _InitJobQueue();
|
||||||
|
if (error != B_OK)
|
||||||
|
return error;
|
||||||
|
|
||||||
|
if (packages.IsEmpty()) {
|
||||||
|
queue_push2(fJobs, SOLVER_SOLVABLE_ALL, 0);
|
||||||
|
} else {
|
||||||
|
error = _AddSpecifiedPackages(packages, _unmatched, 0);
|
||||||
|
if (error != B_OK)
|
||||||
|
return error;
|
||||||
|
}
|
||||||
|
|
||||||
|
// set jobs' solver mode and solve
|
||||||
|
_SetJobsSolverMode(SOLVER_UPDATE);
|
||||||
|
|
||||||
|
if (installNotYetInstalled) {
|
||||||
|
for (int i = 0; i < fJobs->count; i += 2) {
|
||||||
|
// change solver mode to SOLVER_INSTALL for empty update jobs
|
||||||
|
if (pool_isemptyupdatejob(fPool, fJobs->elements[i],
|
||||||
|
fJobs->elements[i + 1])) {
|
||||||
|
fJobs->elements[i] &= ~SOLVER_JOBMASK;
|
||||||
|
fJobs->elements[i] |= SOLVER_INSTALL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// set jobs' solver mode and solve
|
|
||||||
_SetJobsSolverMode(*fJobs, SOLVER_ERASE);
|
|
||||||
|
|
||||||
_InitSolver();
|
_InitSolver();
|
||||||
solver_set_flag(fSolver, SOLVER_FLAG_ALLOW_UNINSTALL, 1);
|
|
||||||
return _Solve();
|
return _Solve();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -485,7 +431,7 @@ LibsolvSolver::VerifyInstallation()
|
|||||||
queue_push2(fJobs, SOLVER_SOLVABLE_ALL, 0);
|
queue_push2(fJobs, SOLVER_SOLVABLE_ALL, 0);
|
||||||
|
|
||||||
// set jobs' solver mode and solve
|
// set jobs' solver mode and solve
|
||||||
_SetJobsSolverMode(*fJobs, SOLVER_VERIFY);
|
_SetJobsSolverMode(SOLVER_VERIFY);
|
||||||
|
|
||||||
_InitSolver();
|
_InitSolver();
|
||||||
return _Solve();
|
return _Solve();
|
||||||
@@ -836,6 +782,79 @@ LibsolvSolver::_GetSolvable(BSolverPackage* package) const
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
status_t
|
||||||
|
LibsolvSolver::_AddSpecifiedPackages(
|
||||||
|
const BSolverPackageSpecifierList& packages,
|
||||||
|
const BSolverPackageSpecifier** _unmatched, int additionalFlags)
|
||||||
|
{
|
||||||
|
int32 packageCount = packages.CountSpecifiers();
|
||||||
|
for (int32 i = 0; i < packageCount; i++) {
|
||||||
|
const BSolverPackageSpecifier& specifier = *packages.SpecifierAt(i);
|
||||||
|
switch (specifier.Type()) {
|
||||||
|
case BSolverPackageSpecifier::B_UNSPECIFIED:
|
||||||
|
return B_BAD_VALUE;
|
||||||
|
|
||||||
|
case BSolverPackageSpecifier::B_PACKAGE:
|
||||||
|
{
|
||||||
|
BSolverPackage* package = specifier.Package();
|
||||||
|
Solvable* solvable;
|
||||||
|
if (package == NULL
|
||||||
|
|| (solvable = _GetSolvable(package)) == NULL) {
|
||||||
|
return B_BAD_VALUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
queue_push2(fJobs, SOLVER_SOLVABLE,
|
||||||
|
solvable - fPool->solvables);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case BSolverPackageSpecifier::B_SELECT_STRING:
|
||||||
|
{
|
||||||
|
// find matching packages
|
||||||
|
SolvQueue matchingPackages;
|
||||||
|
|
||||||
|
int flags = SELECTION_NAME | SELECTION_PROVIDES | SELECTION_GLOB
|
||||||
|
| SELECTION_CANON | SELECTION_DOTARCH | SELECTION_REL
|
||||||
|
| additionalFlags;
|
||||||
|
/*int matchFlags =*/ selection_make(fPool, &matchingPackages,
|
||||||
|
specifier.SelectString().String(), flags);
|
||||||
|
if (matchingPackages.count == 0) {
|
||||||
|
if (_unmatched != NULL)
|
||||||
|
*_unmatched = &specifier;
|
||||||
|
return B_NAME_NOT_FOUND;
|
||||||
|
}
|
||||||
|
// TODO: We might want to add support for restricting to certain repositories.
|
||||||
|
#if 0
|
||||||
|
// restrict to the matching repository
|
||||||
|
if (BSolverRepository* repository = specifier.Repository()) {
|
||||||
|
RepositoryInfo* repositoryInfo
|
||||||
|
= _GetRepositoryInfo(repository);
|
||||||
|
if (repositoryInfo == NULL)
|
||||||
|
return B_BAD_VALUE;
|
||||||
|
|
||||||
|
SolvQueue repoFilter;
|
||||||
|
queue_push2(&repoFilter,
|
||||||
|
SOLVER_SOLVABLE_REPO
|
||||||
|
/* | SOLVER_SETREPO | SOLVER_SETVENDOR*/,
|
||||||
|
repositoryInfo->SolvRepo()->repoid);
|
||||||
|
|
||||||
|
selection_filter(fPool, &matchingPackages, &repoFilter);
|
||||||
|
|
||||||
|
if (matchingPackages.count == 0)
|
||||||
|
return B_NAME_NOT_FOUND;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
for (int j = 0; j < matchingPackages.count; j++)
|
||||||
|
queue_push(fJobs, matchingPackages.elements[j]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return B_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
status_t
|
status_t
|
||||||
LibsolvSolver::_AddProblem(Id problemId)
|
LibsolvSolver::_AddProblem(Id problemId)
|
||||||
{
|
{
|
||||||
@@ -1246,13 +1265,8 @@ LibsolvSolver::_Solve()
|
|||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
LibsolvSolver::_SetJobsSolverMode(Queue& jobs, int solverMode)
|
LibsolvSolver::_SetJobsSolverMode(int solverMode)
|
||||||
{
|
{
|
||||||
for (int i = 0; i < jobs.count; i += 2) {
|
for (int i = 0; i < fJobs->count; i += 2)
|
||||||
jobs.elements[i] |= solverMode;
|
fJobs->elements[i] |= solverMode;
|
||||||
// if (cleandeps)
|
|
||||||
// jobs.elements[i] |= SOLVER_CLEANDEPS;
|
|
||||||
// if (forcebest)
|
|
||||||
// jobs.elements[i] |= SOLVER_FORCEBEST;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -46,6 +46,11 @@ public:
|
|||||||
const BSolverPackageSpecifierList& packages,
|
const BSolverPackageSpecifierList& packages,
|
||||||
const BSolverPackageSpecifier** _unmatched
|
const BSolverPackageSpecifier** _unmatched
|
||||||
= NULL);
|
= NULL);
|
||||||
|
virtual status_t Update(
|
||||||
|
const BSolverPackageSpecifierList& packages,
|
||||||
|
bool installNotYetInstalled,
|
||||||
|
const BSolverPackageSpecifier** _unmatched
|
||||||
|
= NULL);
|
||||||
virtual status_t VerifyInstallation();
|
virtual status_t VerifyInstallation();
|
||||||
|
|
||||||
virtual int32 CountProblems() const;
|
virtual int32 CountProblems() const;
|
||||||
@@ -87,6 +92,11 @@ private:
|
|||||||
BSolverPackage* _GetPackage(Id solvableId) const;
|
BSolverPackage* _GetPackage(Id solvableId) const;
|
||||||
Solvable* _GetSolvable(BSolverPackage* package) const;
|
Solvable* _GetSolvable(BSolverPackage* package) const;
|
||||||
|
|
||||||
|
status_t _AddSpecifiedPackages(
|
||||||
|
const BSolverPackageSpecifierList& packages,
|
||||||
|
const BSolverPackageSpecifier** _unmatched,
|
||||||
|
int additionalFlags);
|
||||||
|
|
||||||
status_t _AddProblem(Id problemId);
|
status_t _AddProblem(Id problemId);
|
||||||
status_t _AddSolution(Problem* problem, Id solutionId);
|
status_t _AddSolution(Problem* problem, Id solutionId);
|
||||||
status_t _AddSolutionElement(Solution* solution,
|
status_t _AddSolutionElement(Solution* solution,
|
||||||
@@ -101,7 +111,7 @@ private:
|
|||||||
const;
|
const;
|
||||||
|
|
||||||
status_t _Solve();
|
status_t _Solve();
|
||||||
void _SetJobsSolverMode(Queue& jobs, int solverMode);
|
void _SetJobsSolverMode(int solverMode);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Pool* fPool;
|
Pool* fPool;
|
||||||
|
|||||||
Reference in New Issue
Block a user