bugfix for Bug156439
authorStefan Schubert <schubi@suse.de>
Tue, 14 Mar 2006 13:35:25 +0000 (13:35 +0000)
committerStefan Schubert <schubi@suse.de>
Tue, 14 Mar 2006 13:35:25 +0000 (13:35 +0000)
zypp/solver/detail/QueueItemUninstall.cc
zypp/solver/detail/Resolver.cc
zypp/solver/detail/ResolverUpgrade.cc

index b76f15b..e6d143c 100644 (file)
@@ -346,39 +346,34 @@ QueueItemUninstall::process (ResolverContext_Ptr context, QueueItemList & qil)
        // we're uninstalling an installed item
        //   loop over all its provides and check if any installed item requires
        //   one of these provides
-        //   We assuming that the dependencies are satified by the new updated items
-        //   Testcase exercise-bug150844-test.xml
-        if (!context->upgradeMode())
-        {
-           CapSet provides = _item->dep(Dep::PROVIDES);
+       CapSet provides = _item->dep(Dep::PROVIDES);
 
-           for (CapSet::const_iterator iter = provides.begin(); iter != provides.end(); iter++) {
-               UninstallProcess info ( pool(), context, _item, _upgraded_to, qil, _remove_only, _soft);
+       for (CapSet::const_iterator iter = provides.begin(); iter != provides.end(); iter++) {
+           UninstallProcess info ( pool(), context, _item, _upgraded_to, qil, _remove_only, _soft);
 
-               //world()->foreachRequiringPoolItem (*iter, uninstall_process_cb, &info);
-               Dep dep( Dep::REQUIRES );
+           //world()->foreachRequiringPoolItem (*iter, uninstall_process_cb, &info);
+           Dep dep( Dep::REQUIRES );
 
-               invokeOnEach( pool().byCapabilityIndexBegin( iter->index(), dep ),
-                             pool().byCapabilityIndexEnd( iter->index(), dep ),
-                             resfilter::ByCapMatch( *iter ),
-                             functor::functorRef<bool,CapAndItem>(info) );
+           invokeOnEach( pool().byCapabilityIndexBegin( iter->index(), dep ),
+                         pool().byCapabilityIndexEnd( iter->index(), dep ),
+                         resfilter::ByCapMatch( *iter ),
+                         functor::functorRef<bool,CapAndItem>(info) );
 
-               // re-establish all which supplement or freshen a provides of the just uninstalled item
+           // re-establish all which supplement or freshen a provides of the just uninstalled item
 
-               EstablishItem establish( pool(), qil, _soft );
+           EstablishItem establish( pool(), qil, _soft );
 
-               dep = Dep::SUPPLEMENTS;
-               invokeOnEach( pool().byCapabilityIndexBegin( iter->index(), dep ),
-                             pool().byCapabilityIndexEnd( iter->index(), dep ),
-                             resfilter::ByCapMatch( *iter ),
-                             functor::functorRef<bool,CapAndItem>( establish ) );
+           dep = Dep::SUPPLEMENTS;
+           invokeOnEach( pool().byCapabilityIndexBegin( iter->index(), dep ),
+                         pool().byCapabilityIndexEnd( iter->index(), dep ),
+                         resfilter::ByCapMatch( *iter ),
+                         functor::functorRef<bool,CapAndItem>( establish ) );
 
-               dep = Dep::FRESHENS;
-               invokeOnEach( pool().byCapabilityIndexBegin( iter->index(), dep ),
-                             pool().byCapabilityIndexEnd( iter->index(), dep ),
-                             resfilter::ByCapMatch( *iter ),
-                             functor::functorRef<bool,CapAndItem>( establish ) );
-           }
+           dep = Dep::FRESHENS;
+           invokeOnEach( pool().byCapabilityIndexBegin( iter->index(), dep ),
+                         pool().byCapabilityIndexEnd( iter->index(), dep ),
+                         resfilter::ByCapMatch( *iter ),
+                         functor::functorRef<bool,CapAndItem>( establish ) );
        }
     }
 
index 4d13d5c..5d16b00 100644 (file)
@@ -531,7 +531,15 @@ Resolver::resolveDependencies (const ResolverContext_Ptr context)
     }
 
     for (PoolItemList::const_iterator iter = _items_to_remove.begin(); iter != _items_to_remove.end(); iter++) {
-       initial_queue->addPoolItemToRemove (*iter, true /* remove-only mode */);
+       if (!_upgradeMode)
+           initial_queue->addPoolItemToRemove (*iter, true /* remove-only mode */);
+       else
+           //   Checking old dependencies for packages which will be updated.
+           //   E.g. foo provides a dependecy which foo-new does not provides anymore.
+           //   So check, if there is a packages installed which requires foo.
+           //   Testcase exercise-bug150844-test.xml
+           //   Testcase Bug156439-test.xml
+           initial_queue->addPoolItemToRemove (*iter, false /* no remove-only mode */);
     }
 
     for (PoolItemList::const_iterator iter = _items_to_verify.begin(); iter != _items_to_verify.end(); iter++) {
index 04a9c9a..a248c57 100644 (file)
@@ -637,7 +637,7 @@ MIL << "split matched !" << endl;
   MIL << opt_stats_r << endl;
 
   // Setting Resolver to upgrade mode
-//  _upgradeMode = true;
+  _upgradeMode = true;
 }
 
 ///////////////////////////////////////////////////////////////////