From 5f707747531cd798ffdb657609d2dd9de8a7c83b Mon Sep 17 00:00:00 2001 From: Stefan Schubert Date: Fri, 11 Apr 2008 14:56:58 +0000 Subject: [PATCH] taking satisfied/broken state from ResStatus --- zypp/PoolItem.cc | 10 ++++---- zypp/ResStatus.h | 6 +++++ zypp/sat/SATResolver.cc | 63 ++++++++++++++++++++++++++++++++++++------------- 3 files changed, 58 insertions(+), 21 deletions(-) diff --git a/zypp/PoolItem.cc b/zypp/PoolItem.cc index 2d851f8..49a00bd 100644 --- a/zypp/PoolItem.cc +++ b/zypp/PoolItem.cc @@ -56,17 +56,17 @@ namespace zypp bool isRelevant() const { - return true; + return !status().isNonRelevant(); } bool isSatisfied() const { - return true; + return status().isSatisfied(); } bool isBroken() const { - return true; + return status().isBroken(); } private: @@ -195,13 +195,13 @@ namespace zypp { return _pimpl->statusReset(); } bool PoolItem::isRelevant() const - { return _pimpl->isSatisfied(); } + { return _pimpl->isRelevant(); } bool PoolItem::isSatisfied() const { return _pimpl->isSatisfied(); } bool PoolItem::isBroken() const - { return _pimpl->isSatisfied(); } + { return _pimpl->isBroken(); } void PoolItem::saveState() const { _pimpl->saveState(); } diff --git a/zypp/ResStatus.h b/zypp/ResStatus.h index 4716626..4fa75c2 100644 --- a/zypp/ResStatus.h +++ b/zypp/ResStatus.h @@ -179,6 +179,9 @@ namespace zypp bool isSuggested() const { return fieldValueIs( SUGGESTED ); } + bool resetWeak() const + { return fieldValueIs( NO_WEAK ); } + void setRecommended( bool toVal_r = true ) { if (isSuggested()) fieldValueAssign( toVal_r ? SUGGESTED_AND_RECOMMENDED : SUGGESTED ); @@ -196,6 +199,9 @@ namespace zypp bool isUndetermined() const { return fieldValueIs( UNDETERMINED ); } + ValidateValue validate() const + { return (ValidateValue)_bitfield.value(); } + bool isSatisfied() const { return fieldValueIs( SATISFIED ); } diff --git a/zypp/sat/SATResolver.cc b/zypp/sat/SATResolver.cc index f37e67b..3035202 100644 --- a/zypp/sat/SATResolver.cc +++ b/zypp/sat/SATResolver.cc @@ -42,6 +42,7 @@ extern "C" { #include "satsolver/evr.h" #include "satsolver/poolvendor.h" #include "satsolver/policy.h" +#include "satsolver/bitmap.h" } ///////////////////////////////////////////////////////////////////////// @@ -58,9 +59,6 @@ using namespace std; IMPL_PTR_TYPE(SATResolver); -static PoolItemSet triggeredSolution; // only the latest state of an item is interesting - // for the pool. Documents already inserted items. - //--------------------------------------------------------------------------- // Callbacks for SAT policies //--------------------------------------------------------------------------- @@ -267,20 +265,13 @@ SATResolver::addPoolItemToKeep (PoolItem item) static void SATSolutionToPool (PoolItem item, const ResStatus & status, const ResStatus::TransactByValue causer) { -#if 0 - if (triggeredSolution.find(item) != triggeredSolution.end()) { - _XDEBUG("SATSolutionToPool(" << item << ") is already in the pool --> skip"); - return; - } -#endif - - triggeredSolution.insert(item); - - // resetting transaction only + // resetting item.status().resetTransact (causer); + item.status().resetWeak (); bool r; + // installation/deletion if (status.isToBeInstalled()) { r = item.status().setToBeInstalled (causer); _XDEBUG("SATSolutionToPool(" << item << ", " << status << ") install !" << r); @@ -293,16 +284,17 @@ SATSolutionToPool (PoolItem item, const ResStatus & status, const ResStatus::Tra r = item.status().setToBeUninstalled (causer); _XDEBUG("SATSolutionToPool(" << item << ", " << status << ") remove !" << r); } - else if (status.isRecommended()) { + + // recommend/suggest + if (status.isRecommended()) { item.status().setRecommended(true); _XDEBUG("SATSolutionToPool(" << item << ", " << status << ") recommended !" << r); } else if (status.isSuggested()) { item.status().setSuggested(true); _XDEBUG("SATSolutionToPool(" << item << ", " << status << ") suggested !" << r); - } else { - _XDEBUG("SATSolutionToPool(" << item << ", " << status << ") unchanged !"); } + return; } @@ -423,6 +415,38 @@ class CheckIfUpdate : public resfilter::PoolItemFilterFunctor }; +class SetValidate : public resfilter::PoolItemFilterFunctor +{ + public: + Map installedmap, conflictsmap; + + SetValidate(Solver *solv) + { + solver_create_state_maps(solv, &installedmap, &conflictsmap); + } + + // set validation + + bool operator()( PoolItem item ) + { + int ret = solvable_trivial_installable_map(item.satSolvable().get(), &installedmap, &conflictsmap); + item.status().setUndetermined(); + + if (ret == -1) { + item.status().setNonRelevant(); + _XDEBUG("SATSolutionToPool(" << item << " ) nonRelevant !"); + } else if (ret == 1) { + item.status().setSatisfied(); + _XDEBUG("SATSolutionToPool(" << item << " ) satisfied !"); + } else if (ret == 0) { + item.status().setBroken(); + _XDEBUG("SATSolutionToPool(" << item << " ) broken !"); + } + return true; + } +}; + + bool SATResolver::resolvePool(const CapabilitySet & requires_caps, const CapabilitySet & conflict_caps) @@ -623,6 +647,13 @@ SATResolver::resolvePool(const CapabilitySet & requires_caps, } } + /* Write validation state back to pool */ + SetValidate infoValidate(_solv); + invokeOnEach( _pool.begin(), + _pool.end(), + functor::not_c(resfilter::byKind()), // every solvable BUT packages + functor::functorRef (infoValidate) ); + // cleanup solver_free(_solv); _solv = NULL; -- 2.7.4