From a152c42f621e9e0581c15813e1f842e362f27a26 Mon Sep 17 00:00:00 2001 From: Klaus Kaempf Date: Tue, 11 Apr 2006 08:35:15 +0000 Subject: [PATCH] Bugfix 165111: QueueItemEstablish: dont look at requires for packages, freshen/supplements is sufficient Resolver.cc: When selecting packages because of freshens/supplements, only consider best architecture and best edition. --- package/libzypp.changes | 7 ++++ zypp/solver/detail/QueueItemEstablish.cc | 6 ++++ zypp/solver/detail/Resolver.cc | 61 ++++++++++++++++++++++++++------ 3 files changed, 63 insertions(+), 11 deletions(-) diff --git a/package/libzypp.changes b/package/libzypp.changes index 17f946c..4154306 100644 --- a/package/libzypp.changes +++ b/package/libzypp.changes @@ -1,4 +1,11 @@ ------------------------------------------------------------------- +Tue Apr 11 10:31:41 CEST 2006 - kkaempf@suse.de + +- when checking for supplements, only consider best arch, best + edition for installation (#165111) +- rev 3047 + +------------------------------------------------------------------- Tue Apr 11 10:23:14 CEST 2006 - schubi@suse.de - Bug 165117: build 910: Update: Splitted packages are selected for diff --git a/zypp/solver/detail/QueueItemEstablish.cc b/zypp/solver/detail/QueueItemEstablish.cc index 5aadb74..d1f2638 100644 --- a/zypp/solver/detail/QueueItemEstablish.cc +++ b/zypp/solver/detail/QueueItemEstablish.cc @@ -161,6 +161,12 @@ QueueItemEstablish::process (ResolverContext_Ptr context, QueueItemList & qil) context->unneeded (_item, _other_penalty); return true; } + // have supplements and at least one triggers + if (_item->kind() == ResTraits::kind) { // schedule package for soft install + QueueItemInstall_Ptr install_item = new QueueItemInstall( pool(), _item, true ); + qil.push_front( install_item ); + return true; + } } diff --git a/zypp/solver/detail/Resolver.cc b/zypp/solver/detail/Resolver.cc index 3473f62..0dea686 100644 --- a/zypp/solver/detail/Resolver.cc +++ b/zypp/solver/detail/Resolver.cc @@ -478,24 +478,55 @@ Resolver::establishPool () //--------------------------------------------------------------------------- // freshen state +typedef map FreshenMap; + +// add item to itemmap +// check for item with same name and only keep +// best architecture, best version + +static void +addToFreshen( PoolItem_Ref item, FreshenMap & itemmap ) +{ + FreshenMap::iterator it = itemmap.find( item->name() ); + if (it != itemmap.end()) { // item with same name found + int cmp = it->second->arch().compare( item->arch() ); + if (cmp < 0) { // new item has better arch + it->second = item; + } + else if (cmp == 0) { // new item has equal arch + if (it->second->edition().compare( item->edition() ) < 0) { + it->second = item; // new item has better edition + } + } + } + else { + itemmap[item->name()] = item; + } + return; +} + + struct FreshenState { - Resolver & resolver; + FreshenMap itemmap; - FreshenState (Resolver & r) - : resolver (r) + FreshenState() { } bool operator()( PoolItem_Ref item) { CapSet freshens( item->dep( Dep::FRESHENS ) ); - if (!freshens.empty()) - resolver.addPoolItemToEstablish( item ); - // Also regarding supplements e.g. in order to recognize - // modalias dependencies. Bug #163140 - CapSet supplements( item->dep( Dep::SUPPLEMENTS ) ); - if (!supplements.empty()) - resolver.addPoolItemToEstablish( item ); + if (!freshens.empty()) { + addToFreshen( item, itemmap ); + } + else { // if no freshens, look at supplements + // Also regarding supplements e.g. in order to recognize + // modalias dependencies. Bug #163140 + CapSet supplements( item->dep( Dep::SUPPLEMENTS ) ); + if (!supplements.empty()) { + addToFreshen( item, itemmap ); + } + } return true; } }; @@ -518,12 +549,20 @@ Resolver::freshenState( ResolverContext_Ptr context ) context->setForceResolve( _forceResolve ); context->setUpgradeMode( _upgradeMode ); - FreshenState info( *this ); + FreshenState info; + + // collect items to be established invokeOnEach( pool().byKindBegin( ResTraits::kind ), pool().byKindEnd( ResTraits::kind ), functor::functorRef(info) ); + // schedule all collected items for establish + + for (FreshenMap::iterator it = info.itemmap.begin(); it != info.itemmap.end(); ++it) { + addPoolItemToEstablish( it->second ); + } + // process the queue resolveDependencies( context ); -- 2.7.4