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:
parent
b55c918f57
commit
d5ed97cd18
|
@ -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;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue