added an _explicitly_requested in QueueItemConflict ( as already in
authorStefan Schubert <schubi@suse.de>
Thu, 16 Aug 2007 09:16:09 +0000 (09:16 +0000)
committerStefan Schubert <schubi@suse.de>
Thu, 16 Aug 2007 09:16:09 +0000 (09:16 +0000)
QueueItemEstablish, QueueItemInstall, QueueItemUninstall ) in order to
remove the conflicting item without an error message. Bug 299819

zypp/solver/detail/QueueItemConflict.cc
zypp/solver/detail/QueueItemConflict.h
zypp/solver/detail/QueueItemUninstall.cc
zypp/solver/detail/ResolverQueue.cc

index d39f15d..63a98be 100644 (file)
@@ -71,6 +71,7 @@ QueueItemConflict::dumpOn( std::ostream & os ) const
     os << ", Triggered by ";
     os << _conflicting_item;
     if (_actually_an_obsolete) os << ", Obsolete !";
+    if (_explicitly_requested) os << ", Explicit";    
     os << "]";
     return os;
 }
@@ -83,6 +84,7 @@ QueueItemConflict::QueueItemConflict (const ResPool & pool, const Capability & c
     , _conflicting_item (item)
     , _soft (soft)
     , _actually_an_obsolete (false)
+    , _explicitly_requested (false)    
 {
     _XDEBUG("QueueItemConflict::QueueItemConflict(" << cap << ", " << item << (soft?", soft":"") << ")");
 }
@@ -150,14 +152,17 @@ struct ConflictProcess
     ResolverContext_Ptr context;
     QueueItemList & new_items;
     bool actually_an_obsolete;
+    bool explicitly_requested;
 
-    ConflictProcess (const ResPool & pl, PoolItem_Ref ci, const Capability & cc, ResolverContext_Ptr ct, QueueItemList & ni, bool ao)
+    ConflictProcess (const ResPool & pl, PoolItem_Ref ci, const Capability & cc, ResolverContext_Ptr ct, QueueItemList & ni, bool ao,
+                    bool er)
        : pool (pl)
        , conflict_issuer (ci)
        , conflict_capability (cc)
        , context (ct)
        , new_items (ni)
        , actually_an_obsolete (ao)
+       , explicitly_requested (er)
     { }
 
     bool operator()( const CapAndItem & cai )
@@ -239,6 +244,8 @@ struct ConflictProcess
 
            QueueItemUninstall_Ptr uninstall = new QueueItemUninstall (pool, provider, actually_an_obsolete ? QueueItemUninstall::OBSOLETE : QueueItemUninstall::CONFLICT);
            uninstall->setCapability (conflict_capability);
+           if (explicitly_requested)
+               uninstall->setExplicitlyRequested();
 
            if (actually_an_obsolete) {
                uninstall->setDueToObsolete (conflict_issuer);
@@ -335,7 +342,7 @@ QueueItemConflict::process (ResolverContext_Ptr context, QueueItemList & new_ite
        }
     }
 
-    ConflictProcess info (pool(), _conflicting_item, _capability, context, new_items, _actually_an_obsolete);
+    ConflictProcess info (pool(), _conflicting_item, _capability, context, new_items, _actually_an_obsolete, _explicitly_requested);
 
     // world()->foreachProvidingPoolItem (_capability, conflict_process_cb, (void *)&info);
 
@@ -358,6 +365,7 @@ QueueItemConflict::copy (void) const
     new_conflict->QueueItem::copy(this);
 
     // _actually_an_obsolete is not being copied !
+    new_conflict->_explicitly_requested      = _explicitly_requested;    
 
     return new_conflict;
 }
index 3061805..ce737a7 100644 (file)
@@ -54,6 +54,7 @@ class QueueItemConflict : public QueueItem {
     bool _soft;
 
     bool _actually_an_obsolete;
+    bool _explicitly_requested;    
 
   public:
 
@@ -73,6 +74,7 @@ class QueueItemConflict : public QueueItem {
     bool isSoft (void) const { return _soft; }
     bool actuallyAnObsolete (void) const { return _actually_an_obsolete; }
     void setActuallyAnObsolete (void) { _actually_an_obsolete = true; }
+    void setExplicitlyRequested (void) { _explicitly_requested = true; }    
 
     // ---------------------------------- methods
 
index 5ab1869..4e853e4 100644 (file)
@@ -382,7 +382,7 @@ QueueItemUninstall::process (ResolverContext_Ptr context, QueueItemList & qil)
     
     this->logInfo (context);
     
-    context->uninstall (_item, _upgraded_to /*bool*/, _due_to_obsolete, _unlink);
+    context->uninstall (_item, _upgraded_to /*bool*/, _due_to_obsolete, _unlink||_explicitly_requested);
     if (status.staysInstalled()) {
        if (! _explicitly_requested
            && _item.status().isLocked()) {
index 4934e9c..0eae05e 100644 (file)
@@ -163,6 +163,7 @@ void
 ResolverQueue::addExtraConflict (const Capability & dep)
 {
     QueueItemConflict_Ptr qitem = new QueueItemConflict (_context->pool(), dep, PoolItem_Ref());
+    qitem->setExplicitlyRequested();
     addItem (qitem);
 }