Checking the queue if an item will be deleted. If yes, the requirements
authorStefan Schubert <schubi@suse.de>
Fri, 21 Sep 2007 13:50:02 +0000 (13:50 +0000)
committerStefan Schubert <schubi@suse.de>
Fri, 21 Sep 2007 13:50:02 +0000 (13:50 +0000)
are not needed anymore. Bug 326384

17 files changed:
zypp/solver/detail/QueueItem.h
zypp/solver/detail/QueueItemBranch.cc
zypp/solver/detail/QueueItemBranch.h
zypp/solver/detail/QueueItemConflict.cc
zypp/solver/detail/QueueItemConflict.h
zypp/solver/detail/QueueItemEstablish.cc
zypp/solver/detail/QueueItemEstablish.h
zypp/solver/detail/QueueItemGroup.cc
zypp/solver/detail/QueueItemGroup.h
zypp/solver/detail/QueueItemInstall.cc
zypp/solver/detail/QueueItemInstall.h
zypp/solver/detail/QueueItemRequire.cc
zypp/solver/detail/QueueItemRequire.h
zypp/solver/detail/QueueItemUninstall.cc
zypp/solver/detail/QueueItemUninstall.h
zypp/solver/detail/ResolverContext.cc
zypp/solver/detail/ResolverQueue.cc

index 52f360ed896c526c38f9cdcafe136bd56cf98a71..4e7b83568341a8b9c7b8489e82a2caea22760cb6 100644 (file)
@@ -113,7 +113,7 @@ class QueueItem : public base::ReferenceCounted, private base::NonCopyable {
     bool isUninstall (void) const { return _type == QUEUE_ITEM_TYPE_UNINSTALL; }
     bool isEstablish (void) const { return _type == QUEUE_ITEM_TYPE_ESTABLISH; }
 
-    virtual bool process (ResolverContext_Ptr context, QueueItemList & qil) = 0;
+    virtual bool process (const QueueItemList & mainQueue, ResolverContext_Ptr context, QueueItemList & qil) = 0;
     virtual QueueItem_Ptr copy (void) const = 0;
     virtual int cmp (QueueItem_constPtr item) const = 0;
     int compare (QueueItem_constPtr item) const { return CMP(_type, item->_type); }
index 7de09e8542f08cace7a50d670e7b2029875998bc..e431580e742643e54d2586029269d4fc43bf6538 100644 (file)
@@ -129,7 +129,7 @@ QueueItemBranch::contains (QueueItem_Ptr possible_subbranch)
 //---------------------------------------------------------------------------
 
 bool
-QueueItemBranch::process (ResolverContext_Ptr context, QueueItemList & qil)
+QueueItemBranch::process (const QueueItemList & mainQueue, ResolverContext_Ptr context, QueueItemList & qil)
 {
     _XDEBUG("QueueItemBranch::process(" << *this << ")");
 
@@ -165,7 +165,7 @@ QueueItemBranch::process (ResolverContext_Ptr context, QueueItemList & qil)
        /* If we just have one possible item, process it. */
 
        QueueItem_Ptr item = live_branches.front();
-       did_something = item->process (context, qil);
+       did_something = item->process (mainQueue, context, qil);
 
        /* Set the item pointer to NULL inside of our original branch
           item, since our call to rc_queue_item_process is now
index 007f866e0e463972558068f9d3679a0081db615a..24b872bd7f335c7f33ba959d75efd8c2343b39db 100644 (file)
@@ -73,7 +73,7 @@ class QueueItemBranch : public QueueItem {
 
     // ---------------------------------- methods
 
-    virtual bool process (ResolverContext_Ptr context, QueueItemList & qil);
+    virtual bool process (const QueueItemList & mainQueue, ResolverContext_Ptr context, QueueItemList & qil);
     virtual QueueItem_Ptr copy (void) const;
     virtual int cmp (QueueItem_constPtr item) const;
     virtual bool isRedundant (ResolverContext_Ptr context) const { return false; }
index 63a98bedf9259d3aa052a527d66e3675dc3bbb21..306ccc9a50683b8ab656f9f79c65d32edf4d9b4a 100644 (file)
@@ -325,7 +325,7 @@ struct ConflictProcess
 
 
 bool
-QueueItemConflict::process (ResolverContext_Ptr context, QueueItemList & new_items)
+QueueItemConflict::process (const QueueItemList & mainQueue, ResolverContext_Ptr context, QueueItemList & new_items)
 {
     _XDEBUG("QueueItemConflict::process(" << *this << ")");
 
index ce737a783815404fedd5ff7afdbd445d0a6422e4..89cea526b993dc23947dcdedacf66108ccfabad1 100644 (file)
@@ -78,7 +78,7 @@ class QueueItemConflict : public QueueItem {
 
     // ---------------------------------- methods
 
-    virtual bool process (ResolverContext_Ptr context, QueueItemList & qil);
+    virtual bool process (const QueueItemList & mainQueue, ResolverContext_Ptr context, QueueItemList & qil);
     virtual QueueItem_Ptr copy (void) const;
     virtual int cmp (QueueItem_constPtr item) const;
     virtual bool isRedundant (ResolverContext_Ptr context) const { return false; }
index f9b2046dc7e6e45086aaea8d3d738de99b719e34..b52a20f8341a2d3aa43703e49b08275e54ed3651 100644 (file)
@@ -25,6 +25,7 @@
 #include "zypp/solver/detail/QueueItemInstall.h"
 #include "zypp/solver/detail/QueueItemRequire.h"
 #include "zypp/solver/detail/QueueItemConflict.h"
+#include "zypp/solver/detail/QueueItemUninstall.h"
 #include "zypp/solver/detail/QueueItem.h"
 #include "zypp/solver/detail/Helper.h"
 #include "zypp/solver/detail/ResolverContext.h"
@@ -95,7 +96,7 @@ QueueItemEstablish::isSatisfied (ResolverContext_Ptr context) const
 
 
 bool
-QueueItemEstablish::process (ResolverContext_Ptr context, QueueItemList & qil)
+QueueItemEstablish::process (const QueueItemList & mainQueue, ResolverContext_Ptr context, QueueItemList & qil)
 {
     _XDEBUG("QueueItemEstablish::process(" << *this << ")");
 
@@ -241,6 +242,30 @@ QueueItemEstablish::process (ResolverContext_Ptr context, QueueItemList & qil)
            {
                _XDEBUG("Atom/Patch/Installed/Establishing " << _item << " has unfulfilled requirement " << *iter << " -> incomplete");
                context->incomplete( _item, _other_penalty );
+
+                // if something installed goes 'incomplete' outside of the establishing call, its always an error
+                if ( status.staysInstalled()
+                     &&!context->establishing()) {
+
+                    // last check if the item will be deleted.
+                    // (check the queue, if there is a delete request)
+                    QueueItemList::const_iterator iterQueue;
+                    for (iterQueue = mainQueue.begin(); iterQueue != mainQueue.end(); iterQueue++) {
+                        QueueItem_Ptr qitem = *iterQueue;
+                        if (qitem->isUninstall()) {
+                            QueueItemUninstall_Ptr uninstall = dynamic_pointer_cast<QueueItemUninstall>(qitem);
+                            if (uninstall->deletedItem() == _item) {
+                                _DEBUG(_item << " will be uninstalled later. So, we do not have to inform the user.");
+                                break;
+                            }
+                        }
+                    }
+
+                    if (iterQueue == mainQueue.end()) {
+                        ResolverInfo_Ptr misc_info = new ResolverInfoMisc (RESOLVER_INFO_TYPE_INCOMPLETES, _item, RESOLVER_INFO_PRIORITY_VERBOSE);
+                        context->addError (misc_info);
+                    }
+                }
            }
            else {
                _XDEBUG("Transacted " << _item << " has unfulfilled requirement " << *iter << " -> leave");
index e0e6e1d009cb0cd607a6563c0ee9d6d8fec438c7..8a99955fca57caad03bcfa1cc25b4314d08e2547 100644 (file)
@@ -80,7 +80,7 @@ class QueueItemEstablish : public QueueItem {
 
     // ---------------------------------- methods
 
-    virtual bool process (ResolverContext_Ptr context, QueueItemList & qil);
+    virtual bool process (const QueueItemList & mainQueue, ResolverContext_Ptr context, QueueItemList & qil);
     virtual QueueItem_Ptr copy (void) const;
     virtual int cmp (QueueItem_constPtr item) const;
 
index a12d426fc5f5026710d6dd65594bc71a2afd23e4..f76911316197b8da69b5c7a295d02b8a20415bd7 100644 (file)
@@ -63,7 +63,7 @@ QueueItemGroup::~QueueItemGroup()
 //---------------------------------------------------------------------------
 
 bool
-QueueItemGroup::process (ResolverContext_Ptr context, QueueItemList & new_items)
+QueueItemGroup::process (const QueueItemList & mainQueue, ResolverContext_Ptr context, QueueItemList & new_items)
 {
     _DEBUG( "QueueItemGroup::process" );
 
index 9454aab86d87443033a5cb70cf90666371c5e028..94302cfb00a05df47e254134ea9a5a692239ce23 100644 (file)
@@ -65,7 +65,7 @@ class QueueItemGroup : public QueueItem {
 
     // ---------------------------------- methods
 
-    virtual bool process (ResolverContext_Ptr context, QueueItemList & qil);
+    virtual bool process (const QueueItemList & mainQueue, ResolverContext_Ptr context, QueueItemList & qil);
     virtual QueueItem_Ptr copy (void) const;
     virtual int cmp (QueueItem_constPtr item) const;
     virtual bool isRedundant (ResolverContext_Ptr context) const { return false; }
index 8753fe13dfe4e3c1aa553b06c4a17cb977376496..5e73dc2f190468a26f136f8bcfcb72bc901e42fe 100644 (file)
@@ -279,7 +279,7 @@ struct UninstallConflicting
 //---------------------------------------------------------------------------------------
 
 bool
-QueueItemInstall::process (ResolverContext_Ptr context, QueueItemList & qil)
+QueueItemInstall::process (const QueueItemList & mainQueue, ResolverContext_Ptr context, QueueItemList & qil)
 {
     ResStatus status = context->getStatus(_item);
 
index d8f6480aa8383d10c1e5994af8329936397202b3..d0eb1203bab7ad8125f26f58f3c9e2279fe1e82b 100644 (file)
@@ -89,7 +89,7 @@ class QueueItemInstall : public QueueItem {
 
     // ---------------------------------- methods
 
-    virtual bool process (ResolverContext_Ptr context, QueueItemList & qil);
+    virtual bool process (const QueueItemList & mainQueue, ResolverContext_Ptr context, QueueItemList & qil);
     virtual QueueItem_Ptr copy (void) const;
     virtual int cmp (QueueItem_constPtr item) const;
 
index 5d182d6750dc9f9ddfa3c5b0e2b19e5df5339442..2296903da95395cffc617a1a8178a6dd2c74b55d 100644 (file)
@@ -491,7 +491,8 @@ hint_match( const CapSet & cset, ResPool pool )
 //----------------------------------------------------------------------------
 
 bool
-QueueItemRequire::process (ResolverContext_Ptr context, QueueItemList & new_items)
+QueueItemRequire::process (const QueueItemList & mainQueue,
+                          ResolverContext_Ptr context, QueueItemList & new_items)
 {
     _XDEBUG("QueueItemRequire::process(" << *this << ")");
 
index 175c2e4cc648c6cedb2e252790799cf4a36e736b..fc89dc273e4e6b59d9cd3e30bffdf201421a489b 100644 (file)
@@ -87,7 +87,7 @@ class QueueItemRequire : public QueueItem {
 
     // ---------------------------------- methods
 
-    virtual bool process (ResolverContext_Ptr context, QueueItemList & qil);
+    virtual bool process (const QueueItemList & mainQueue, ResolverContext_Ptr context, QueueItemList & qil);
     virtual QueueItem_Ptr copy (void) const;
     virtual int cmp (QueueItem_constPtr item) const;
     virtual bool isRedundant (ResolverContext_Ptr context) const { return false; }
index 686218581b6e067da7c12d53ffe7edb70bf66310..1a4f333eeb60163b00fea90dd66411b253a93dbe 100644 (file)
@@ -314,7 +314,7 @@ struct UninstallItem
 
 
 bool
-QueueItemUninstall::process (ResolverContext_Ptr context, QueueItemList & qil)
+QueueItemUninstall::process (const QueueItemList & mainQueue, ResolverContext_Ptr context, QueueItemList & qil)
 {
     ResStatus status = context->getStatus(_item);
 
index 1c9e1c7ae8539998a1bc9371ac82d74ccba500fe..2b2e5b9bf24f97d0184973dcfa570e728b976aff 100644 (file)
@@ -94,10 +94,11 @@ class QueueItemUninstall : public QueueItem {
     void setDueToObsolete (const PoolItem_Ref item)
        { _due_to_obsolete = true; _obsoletes_item = item; }
     void setUnlink (void);
+    PoolItem_Ref deletedItem(void) const        { return _item; }    
 
     // ---------------------------------- methods
 
-    virtual bool process (ResolverContext_Ptr context, QueueItemList & qil);
+    virtual bool process (const QueueItemList & mainQueue, ResolverContext_Ptr context, QueueItemList & qil);
     virtual QueueItem_Ptr copy (void) const;
     virtual int cmp (QueueItem_constPtr item) const;
     virtual bool isRedundant (ResolverContext_Ptr context) const { return false; }
index e6546faff77a249ca0e02c7bf95d8c7e50389a0f..2f85e2638f5a9b7e1f690e2d1a57ed45fe7bda64 100644 (file)
@@ -672,16 +672,6 @@ ResolverContext::incomplete (PoolItem_Ref item, int other_penalty)
        else {
            setStatus (item, ResStatus::needed);
        }
-
-       return true;
-    }
-
-    // if something installed goes 'incomplete' outside of the establishing call, its always an error
-
-    if (status.staysInstalled()) {
-       ResolverInfo_Ptr misc_info = new ResolverInfoMisc (RESOLVER_INFO_TYPE_INCOMPLETES, item, RESOLVER_INFO_PRIORITY_VERBOSE);
-       addError (misc_info);
-       return false;
     }
 
     return true;
index 0eae05e10b31a508cc4544754251a7d42aca121a..1aa48c6c252f9460db77873102927bf4eeb2aff4 100644 (file)
@@ -228,7 +228,7 @@ ResolverQueue::processOnce ()
            _XDEBUG( "=====> 1st pass: [" << *qitem << "]");
            QueueItemList::iterator next = iter; ++next;
            if (qitem && qitem->priority() == max_priority) {
-               if (qitem->process (_context, new_qitems)) {
+               if (qitem->process (_qitems, _context, new_qitems)) {
                    did_something_recently = true;
                }
                _qitems.erase (iter);