make 'unneeded' transitive for patches
authorKlaus Kaempf <kkaempf@suse.de>
Mon, 15 May 2006 09:14:50 +0000 (09:14 +0000)
committerKlaus Kaempf <kkaempf@suse.de>
Mon, 15 May 2006 09:14:50 +0000 (09:14 +0000)
 (if all requirements of a patch are unneeded, the patch is unneeded
 However, this is not true for non-patches, i.e. products.
 If product-patchlevel-42 has all requirements unneeded, the product is satisfied)

zypp/solver/detail/QueueItemEstablish.cc
zypp/solver/detail/ResolverContext.cc
zypp/solver/detail/ResolverContext.h

index c8269ad..405aac3 100644 (file)
@@ -175,38 +175,28 @@ QueueItemEstablish::process (ResolverContext_Ptr context, QueueItemList & qil)
 
        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
index 26c0891..0a61df2 100644 (file)
@@ -612,7 +612,7 @@ ResolverContext::incomplete (PoolItem_Ref item, int other_penalty)
 // 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);
 
@@ -621,6 +621,8 @@ ResolverContext::isPresent (PoolItem_Ref item)
                || status.isUnneeded()
                || status.isSatisfied());
 
+   if (unneeded) *unneeded = status.isUnneeded();
+
 _XDEBUG("ResolverContext::itemIsPresent(<" << status << ">" << item << ") " << (res?"Y":"N"));
 
     return res;
@@ -1398,11 +1400,13 @@ struct RequirementMet
     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 )
     { }
 
 
@@ -1412,10 +1416,12 @@ struct RequirementMet
        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;
        }
 
@@ -1428,7 +1434,7 @@ struct RequirementMet
 
 
 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);
 
@@ -1443,6 +1449,8 @@ ResolverContext::requirementIsMet (const Capability & capability, bool is_child)
                  resfilter::ByCapMatch( capability ),
                  functor::functorRef<bool,CapAndItem>(info) );
 _XDEBUG( "ResolverContext::requirementIsMet(" << capability << ") " << (info.flag?"Y":"N") );
+    if (unneeded) *unneeded = info.unneeded;
+
     return info.flag;
 }
 
index e73f8cc..1a02104 100644 (file)
@@ -207,13 +207,13 @@ class ResolverContext : public base::ReferenceCounted, private base::NonCopyable
 
     /**
      *\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;