From 65502bbe88c4686bdefbc5d646b9b681e1c49743 Mon Sep 17 00:00:00 2001 From: Ingo Weinhold Date: Wed, 3 Apr 2013 18:42:20 +0200 Subject: [PATCH] BSolver: Add VerifyInstallation() ... and implement it in LibsolvSolver. --- headers/os/package/solver/Solver.h | 1 + src/kits/package/solver/LibsolvSolver.cpp | 83 +++++++++++++++++------ src/kits/package/solver/LibsolvSolver.h | 4 ++ 3 files changed, 66 insertions(+), 22 deletions(-) diff --git a/headers/os/package/solver/Solver.h b/headers/os/package/solver/Solver.h index 97cee58a15..2f1160b871 100644 --- a/headers/os/package/solver/Solver.h +++ b/headers/os/package/solver/Solver.h @@ -32,6 +32,7 @@ public: virtual status_t Install( const BSolverPackageSpecifierList& packages) = 0; + virtual status_t VerifyInstallation() = 0; bool HasProblems() const { return CountProblems() > 0; } diff --git a/src/kits/package/solver/LibsolvSolver.cpp b/src/kits/package/solver/LibsolvSolver.cpp index 19aa15b3b4..c12e8456f6 100644 --- a/src/kits/package/solver/LibsolvSolver.cpp +++ b/src/kits/package/solver/LibsolvSolver.cpp @@ -220,32 +220,35 @@ LibsolvSolver::Install(const BSolverPackageSpecifierList& packages) queue_push(&jobs, matchingPackages.elements[j]); } - // add solver mode to job queue elements - int solverMode = SOLVER_INSTALL; - for (int i = 0; i < jobs.count; i += 2) { - jobs.elements[i] |= solverMode; -// if (cleandeps) -// jobs.elements[i] |= SOLVER_CLEANDEPS; -// if (forcebest) -// jobs.elements[i] |= SOLVER_FORCEBEST; - } + // set jobs' solver mode and solve + _SetJobsSolverMode(jobs, SOLVER_INSTALL); - // create the solver and solve - fSolver = solver_create(fPool); - solver_set_flag(fSolver, SOLVER_FLAG_SPLITPROVIDES, 1); - solver_set_flag(fSolver, SOLVER_FLAG_BEST_OBEY_POLICY, 1); + return _Solve(jobs); +} - // get the problems (if any) - fProblems.MakeEmpty(); - int problemCount = solver_solve(fSolver, &jobs); - for (Id problemId = 1; problemId <= problemCount; problemId++) { - error = _AddProblem(problemId); - if (error != B_OK) - return error; - } +status_t +LibsolvSolver::VerifyInstallation() +{ + if (fInstalledRepository == NULL) + return B_BAD_VALUE; - return B_OK; + // add repositories to pool + status_t error = _AddRepositories(); + if (error != B_OK) + return error; + + // prepare pool for solving + pool_createwhatprovides(fPool); + + // add the verify job to the job queue + SolvQueue jobs; + queue_push2(&jobs, SOLVER_SOLVABLE_ALL, 0); + + // set jobs' solver mode and solve + _SetJobsSolverMode(jobs, SOLVER_VERIFY); + + return _Solve(jobs); } @@ -617,3 +620,39 @@ LibsolvSolver::_GetResolvableExpression(Id id, _expression.SetTo(name, op, version); return B_OK; } + + +status_t +LibsolvSolver::_Solve(Queue& jobs) +{ + // create the solver and solve + fSolver = solver_create(fPool); + solver_set_flag(fSolver, SOLVER_FLAG_SPLITPROVIDES, 1); + solver_set_flag(fSolver, SOLVER_FLAG_BEST_OBEY_POLICY, 1); + + int problemCount = solver_solve(fSolver, &jobs); + + // get the problems (if any) + fProblems.MakeEmpty(); + + for (Id problemId = 1; problemId <= problemCount; problemId++) { + status_t error = _AddProblem(problemId); + if (error != B_OK) + return error; + } + + return B_OK; +} + + +void +LibsolvSolver::_SetJobsSolverMode(Queue& jobs, int solverMode) +{ + for (int i = 0; i < jobs.count; i += 2) { + jobs.elements[i] |= solverMode; +// if (cleandeps) +// jobs.elements[i] |= SOLVER_CLEANDEPS; +// if (forcebest) +// jobs.elements[i] |= SOLVER_FORCEBEST; + } +} diff --git a/src/kits/package/solver/LibsolvSolver.h b/src/kits/package/solver/LibsolvSolver.h index 1f4c30198e..e31eeadca2 100644 --- a/src/kits/package/solver/LibsolvSolver.h +++ b/src/kits/package/solver/LibsolvSolver.h @@ -36,6 +36,7 @@ public: virtual status_t Install( const BSolverPackageSpecifierList& packages); + virtual status_t VerifyInstallation(); virtual int32 CountProblems() const; virtual BSolverProblem* ProblemAt(int32 index) const; @@ -64,6 +65,9 @@ private: BPackageResolvableExpression& _expression) const; + status_t _Solve(Queue& jobs); + void _SetJobsSolverMode(Queue& jobs, int solverMode); + private: Pool* fPool; Solver* fSolver;