CapSet requires = _item->dep(Dep::REQUIRES); // check requirements
Capability missing;
+ bool all_unneeded = true; // check if all are met because of unneeded
for (iter = requires.begin(); iter != requires.end(); iter++) {
missing = *iter;
- if (!context->requirementIsMet (missing)) {
+ bool unneeded;
+ if (!context->requirementIsMet (missing, false, &unneeded)) {
+ all_unneeded = false;
break;
}
+ if (!unneeded) all_unneeded = false;
}
if (iter == requires.end()) { // all are met
-#if 0 // now disabled
-
-// why do we install when requirements are met ?
-// this code should probably be removed completely.
-// if all requirements are met, the item is satisfied
-// there is no reason to install it.
-
- if (_item->kind() == ResTraits<Package>::kind
- || _item->kind() == ResTraits<Pattern>::kind
- || _item->kind() == ResTraits<Selection>::kind)
+ if (all_unneeded
+ && _item->kind() == ResTraits<Patch>::kind) // unneeded is transitive only for patches (#171590)
{
- if (status.staysUninstalled())
- {
- _DEBUG("Uninstalled " << _item << " has all requirements -> install");
- QueueItemInstall_Ptr install_item = new QueueItemInstall( pool(), _item );
- qil.push_front( install_item );
- }
+ _DEBUG("all requirements of " << _item << " unneeded -> unneeded");
+ context->unneeded( _item, _other_penalty );
}
- else {
-#endif
+ else
+ {
_DEBUG("all requirements of " << _item << " met -> satisfied");
- context->satisfy (_item, _other_penalty);
-#if 0
+ context->satisfy( _item, _other_penalty );
}
-#endif
}
else {
// If the item stays installed, blame the user
// if yes, install/requires requests are considered done
bool
-ResolverContext::isPresent (PoolItem_Ref item)
+ResolverContext::isPresent (PoolItem_Ref item, bool *unneeded)
{
ResStatus status = getStatus(item);
|| status.isUnneeded()
|| status.isSatisfied());
+ if (unneeded) *unneeded = status.isUnneeded();
+
_XDEBUG("ResolverContext::itemIsPresent(<" << status << ">" << item << ") " << (res?"Y":"N"));
return res;
ResolverContext_Ptr context;
const Capability capability;
bool flag;
+ bool unneeded;
RequirementMet (ResolverContext_Ptr ctx, const Capability & c)
: context (ctx)
, capability (c)
, flag (false)
+ , unneeded( false )
{ }
PoolItem provider( cai.item );
// capability is set for item set children. If it is set, query the
// exact version only.
+ bool my_unneeded = false;
if ((capability == Capability::noCap
|| capability == match)
- && context->isPresent (provider))
+ && context->isPresent( provider, &my_unneeded ))
{
+ unneeded = my_unneeded;
flag = true;
}
bool
-ResolverContext::requirementIsMet (const Capability & capability, bool is_child)
+ResolverContext::requirementIsMet (const Capability & capability, bool is_child, bool *unneeded)
{
RequirementMet info (this, is_child ? capability : Capability::noCap);
resfilter::ByCapMatch( capability ),
functor::functorRef<bool,CapAndItem>(info) );
_XDEBUG( "ResolverContext::requirementIsMet(" << capability << ") " << (info.flag?"Y":"N") );
+ if (unneeded) *unneeded = info.unneeded;
+
return info.flag;
}
/**
*\return \c true if \c item is \a installed or \a to-be-installed */
- bool isPresent (PoolItem_Ref item);
+ bool isPresent (PoolItem_Ref item, bool *unneeded = NULL);
/**
*\return \c true if \c item is \a uninstalled or \a to-be-uninstalled */
bool isAbsent (PoolItem_Ref item);
- bool requirementIsMet (const Capability & cap, bool is_child = false);
+ bool requirementIsMet (const Capability & cap, bool is_child = false, bool *unneeded = NULL);
bool requirementIsPossible (const Capability & cap);
bool itemIsPossible (const PoolItem_Ref item);
bool isParallelInstall (const PoolItem_Ref item) const;