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:
{ 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(); }
#include "satsolver/evr.h"
#include "satsolver/poolvendor.h"
#include "satsolver/policy.h"
+#include "satsolver/bitmap.h"
}
/////////////////////////////////////////////////////////////////////////
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
//---------------------------------------------------------------------------
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);
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;
}
};
+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)
}
}
+ /* Write validation state back to pool */
+ SetValidate infoValidate(_solv);
+ invokeOnEach( _pool.begin(),
+ _pool.end(),
+ functor::not_c(resfilter::byKind<Package>()), // every solvable BUT packages
+ functor::functorRef<bool,PoolItem> (infoValidate) );
+
// cleanup
solver_free(_solv);
_solv = NULL;