Author: schubi2 Date: Tue Mar 4 16:08:58 2008 New Revision: 9002 URL: http://svn.opensuse.org/viewcvs/zypp?rev=9002&view=rev Log: improve problem solution if a requirement cannot be fulfilled. Bug #358560 Modified: trunk/libzypp/zypp/sat/SATResolver.cc trunk/libzypp/zypp/sat/SATResolver.h Modified: trunk/libzypp/zypp/sat/SATResolver.cc URL: http://svn.opensuse.org/viewcvs/zypp/trunk/libzypp/zypp/sat/SATResolver.cc?rev=9002&r1=9001&r2=9002&view=diff ============================================================================== --- trunk/libzypp/zypp/sat/SATResolver.cc (original) +++ trunk/libzypp/zypp/sat/SATResolver.cc Tue Mar 4 16:08:58 2008 @@ -18,7 +18,7 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA * 02111-1307, USA. */ - +#include <sstream> #include "zypp/solver/detail/Helper.h" #include "zypp/base/String.h" #include "zypp/Capability.h" @@ -33,6 +33,7 @@ #include "zypp/CapFilters.h" #include "zypp/sat/SATResolver.h" #include "zypp/sat/Pool.h" +#include "zypp/sat/WhatProvides.h" #include "zypp/solver/detail/ProblemSolutionCombi.h" extern "C" { @@ -69,6 +70,35 @@ return VendorAttr::instance().equivalent(id2str(pool, solvable1->vendor), id2str(pool, solvable2->vendor)) ? 0:1; } + +string +itemToString (PoolItem item, bool shortVersion) +{ + ostringstream os; + if (!item) return ""; + + if (item->kind() != ResTraitszypp::Package::kind) + os << item->kind() << ':'; + os << item->name(); + if (!shortVersion) { + os << '-' << item->edition(); + if (item->arch() != "") { + os << '.' << item->arch(); + } + Repository s = item->repository(); + if (s) { + string alias = s.info().alias(); + if (!alias.empty() + && alias != "@system") + { + os << '[' << s.info().alias() << ']'; + } + } + } + return os.str(); +} + + //--------------------------------------------------------------------------- std::ostream & @@ -506,7 +536,7 @@ }; -std::string SATResolver::SATprobleminfoString(Id problem) +string SATResolver::SATprobleminfoString(Id problem, string &detail) { string ret; Pool *pool = _solv->pool; @@ -552,7 +582,55 @@ break; case SOLVER_PROBLEM_DEP_PROVIDERS_NOT_INSTALLABLE: s = pool_id2solvable(pool, source); - ret = str::form (_("%s requires %s, but none of the providers can be installed"), solvable2str(pool, s), dep2str(pool, dep)); + Capability cap(dep); + sat::WhatProvides possibleProviders(cap); + + // check, if a provider will be deleted + typedef list<PoolItem> ProviderList; + ProviderList providerlistInstalled, providerlistUninstalled; + for_( iter1, possibleProviders.begin(), possibleProviders.end() ) { + PoolItem provider1 = ResPool::instance().find( *iter1 ); + // find pair of an installed/uninstalled item with the same NVR + bool found = false; + for_( iter2, possibleProviders.begin(), possibleProviders.end() ) { + PoolItem provider2 = ResPool::instance().find( *iter2 ); + if (compareByNVR (provider1.resolvable(),provider2.resolvable()) == 0 + && (provider1.status().isInstalled() && provider2.status().isUninstalled() + || provider2.status().isInstalled() && provider1.status().isUninstalled())) { + found = true; + break; + } + } + if (!found) { + if (provider1.status().isInstalled()) + providerlistInstalled.push_back(provider1); + else + providerlistUninstalled.push_back(provider1); + } + } + + ret = str::form (_("%s requires %s, but this requirement cannot be provided"), solvable2str(pool, s), dep2str(pool, dep)); + if (providerlistInstalled.size() > 0) { + detail += _("deleted providers: "); + for (ProviderList::const_iterator iter = providerlistInstalled.begin(); iter != providerlistInstalled.end(); iter++) { + if (iter == providerlistInstalled.begin()) + detail += itemToString (*iter, false); + else + detail += "\n " + itemToString (*iter, false); + } + } + if (providerlistUninstalled.size() > 0) { + if (detail.size() > 0) + detail += _("\nuninstallable providers: "); + else + detail = _("uninstallable providers: "); + for (ProviderList::const_iterator iter = providerlistUninstalled.begin(); iter != providerlistUninstalled.end(); iter++) { + if (iter == providerlistUninstalled.begin()) + detail += itemToString (*iter, false); + else + detail += "\n " + itemToString (*iter, false); + } + } break; } @@ -576,10 +654,11 @@ while ((problem = solver_next_problem(_solv, problem)) != 0) { MIL << "Problem " << pcnt++ << ":" << endl; MIL << "====================================" << endl; - string whatString = SATprobleminfoString(problem); + string detail; + string whatString = SATprobleminfoString (problem,detail); MIL << whatString << endl; MIL << "------------------------------------" << endl; - ResolverProblem_Ptr resolverProblem = new ResolverProblem (whatString, ""); + ResolverProblem_Ptr resolverProblem = new ResolverProblem (whatString, detail); solution = 0; while ((solution = solver_next_solution(_solv, problem, solution)) != 0) { element = 0; Modified: trunk/libzypp/zypp/sat/SATResolver.h URL: http://svn.opensuse.org/viewcvs/zypp/trunk/libzypp/zypp/sat/SATResolver.h?rev=9002&r1=9001&r2=9002&view=diff ============================================================================== --- trunk/libzypp/zypp/sat/SATResolver.h (original) +++ trunk/libzypp/zypp/sat/SATResolver.h Tue Mar 4 16:08:58 2008 @@ -80,7 +80,7 @@ bool _dosplitprovides; /* true: consider legacy split provides */ // ---------------------------------- methods - std::string SATprobleminfoString (Id problem); + std::string SATprobleminfoString (Id problem, std::string &detail); public: -- To unsubscribe, e-mail: zypp-commit+unsubscribe@opensuse.org For additional commands, e-mail: zypp-commit+help@opensuse.org