From d5ed97cd185a462f5b0ad7b75bb6564c7c1c9d6e Mon Sep 17 00:00:00 2001 From: Ingo Weinhold Date: Mon, 3 Feb 2014 22:59:08 +0100 Subject: [PATCH] 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. --- src/kits/package/solver/LibsolvSolver.cpp | 66 ++++++----------------- 1 file changed, 17 insertions(+), 49 deletions(-) diff --git a/src/kits/package/solver/LibsolvSolver.cpp b/src/kits/package/solver/LibsolvSolver.cpp index 55acea62d8..d56f725dfd 100644 --- a/src/kits/package/solver/LibsolvSolver.cpp +++ b/src/kits/package/solver/LibsolvSolver.cpp @@ -546,63 +546,31 @@ LibsolvSolver::GetResult(BSolverResult& _result) if (transaction->steps.count == 0) 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); for (int i = 0; i < transaction->steps.count; i++) { Id solvableId = transaction->steps.elements[i]; - switch (transaction_type(transaction, solvableId, - SOLVER_TRANSACTION_RPM_ONLY)) { - case SOLVER_TRANSACTION_ERASE: - { - BSolverPackage* package = _GetPackage(solvableId); - if (package == NULL) - return B_ERROR; + if (fPool->installed + && fPool->solvables[solvableId].repo == fPool->installed) { + BSolverPackage* package = _GetPackage(solvableId); + if (package == NULL) + return B_ERROR; - if (!_result.AppendElement( - BSolverResultElement( - BSolverResultElement::B_TYPE_UNINSTALL, package))) { - return B_NO_MEMORY; - } - break; + if (!_result.AppendElement( + BSolverResultElement( + BSolverResultElement::B_TYPE_UNINSTALL, package))) { + return B_NO_MEMORY; } + } else { + BSolverPackage* package = _GetPackage(solvableId); + if (package == NULL) + return B_ERROR; - 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); - if (package == NULL) - return B_ERROR; - - if (!_result.AppendElement( - BSolverResultElement( - BSolverResultElement::B_TYPE_INSTALL, package))) { - return B_NO_MEMORY; - } - break; + if (!_result.AppendElement( + BSolverResultElement( + BSolverResultElement::B_TYPE_INSTALL, package))) { + return B_NO_MEMORY; } - - default: - break; } }