LibsolvSolver::GetResult(): Fix package update cases

* The transaction_type(.., ..., SOLVER_TRANSACTION_RPM_ONLY)
categorization of the transaction steps is incorrect since rpm
automatically replaces an older package version when a new one is
installed and thus such package removals would be omitted. Use a
simpler check instead.
* Omit the unnecessary explicit check whether a package really has to be
installed.

Thanks to Michael Schroeder @ SUSE for his help figuring this out.
This commit is contained in:
Ingo Weinhold 2014-02-03 22:59:08 +01:00
parent b55c918f57
commit d5ed97cd18
1 changed files with 17 additions and 49 deletions

View File

@ -546,21 +546,12 @@ LibsolvSolver::GetResult(BSolverResult& _result)
if (transaction->steps.count == 0) if (transaction->steps.count == 0)
return B_OK; return B_OK;
// Get the packages that end up in the installation. The result queue
// contains newPackageCount new packages to install first, followed by the
// kept packages.
SolvQueue installedPackages;
int newPackageCount = transaction_installedresult(transaction,
&installedPackages);
transaction_order(transaction, 0); transaction_order(transaction, 0);
for (int i = 0; i < transaction->steps.count; i++) { for (int i = 0; i < transaction->steps.count; i++) {
Id solvableId = transaction->steps.elements[i]; Id solvableId = transaction->steps.elements[i];
switch (transaction_type(transaction, solvableId, if (fPool->installed
SOLVER_TRANSACTION_RPM_ONLY)) { && fPool->solvables[solvableId].repo == fPool->installed) {
case SOLVER_TRANSACTION_ERASE:
{
BSolverPackage* package = _GetPackage(solvableId); BSolverPackage* package = _GetPackage(solvableId);
if (package == NULL) if (package == NULL)
return B_ERROR; return B_ERROR;
@ -570,25 +561,7 @@ LibsolvSolver::GetResult(BSolverResult& _result)
BSolverResultElement::B_TYPE_UNINSTALL, package))) { BSolverResultElement::B_TYPE_UNINSTALL, package))) {
return B_NO_MEMORY; return B_NO_MEMORY;
} }
break; } else {
}
case SOLVER_TRANSACTION_INSTALL:
case SOLVER_TRANSACTION_MULTIINSTALL:
{
// check, if it really is a new package
// TODO: Is this check really necessary?
bool foundPackage = false;
for (int j = 0; j < newPackageCount; j++) {
if (installedPackages.elements[j] == solvableId) {
foundPackage = true;
break;
}
}
if (!foundPackage)
continue;
BSolverPackage* package = _GetPackage(solvableId); BSolverPackage* package = _GetPackage(solvableId);
if (package == NULL) if (package == NULL)
return B_ERROR; return B_ERROR;
@ -598,11 +571,6 @@ LibsolvSolver::GetResult(BSolverResult& _result)
BSolverResultElement::B_TYPE_INSTALL, package))) { BSolverResultElement::B_TYPE_INSTALL, package))) {
return B_NO_MEMORY; return B_NO_MEMORY;
} }
break;
}
default:
break;
} }
} }