- regarding language dependencies while update correctly
authorStefan Schubert <schubi@suse.de>
Wed, 20 Feb 2008 11:40:57 +0000 (11:40 +0000)
committerStefan Schubert <schubi@suse.de>
Wed, 20 Feb 2008 11:40:57 +0000 (11:40 +0000)
- using sat::WhatProvides instaed of SATResolver::whoProvides

zypp/sat/SATResolver.cc
zypp/sat/SATResolver.h
zypp/solver/detail/InstallOrder.cc
zypp/solver/detail/ResolverUpgrade.cc

index 7dc36d7..e487d98 100644 (file)
@@ -228,22 +228,9 @@ SATSolutionToPool (PoolItem item, const ResStatus & status, const ResStatus::Tra
 
 
 //----------------------------------------------------------------------------
-// helper functions for distupgrade and installation order
+// helper functions for distupgrade 
 //----------------------------------------------------------------------------
 
-PoolItemList SATResolver::whoProvides(Capability cap) {
-    PoolItemList itemList;
-    Id p, *pp;
-    for (pp = pool_whatprovides(_SATPool, cap.id()) ; (p = *pp++) != 0; ) {
-       PoolItem item = _pool.find (sat::Solvable(p));
-       if (item) {
-           itemList.push_back (item);
-           MIL << item << " provides " << cap << endl;
-       }
-    }
-    return itemList;
-}
-
 bool SATResolver::doesObsoleteItem (PoolItem candidate, PoolItem installed) {
   Solvable *sCandidate = _SATPool->solvables + candidate.satSolvable().id();
   Repo *installedRepo = sat::Pool::instance().systemRepo().get();
index 83abbe0..8f5ea92 100644 (file)
@@ -137,7 +137,6 @@ class SATResolver : public base::ReferenceCounted, private base::NonCopyable {
     bool dosplitprovides () const {return _dosplitprovides;}
     void setDosplitprovides ( const bool dosplitprovides) { _dosplitprovides = dosplitprovides;}
 
-    PoolItemList whoProvides(Capability cap);
     bool doesObsoleteItem (PoolItem candidate, PoolItem installed);
 };
 
index 7e695d9..dcd629e 100644 (file)
@@ -228,11 +228,11 @@ InstallOrder::rdfsvisit (const PoolItem item)
        XXX << "check requirement " << requirement << " of " << ITEMNAME(item) << endl;
         SATResolver satResolver(_pool, sat::Pool::instance().get());
        PoolItemList tovisit;
-        PoolItemList possibleProviders = satResolver.whoProvides (requirement);
+        sat::WhatProvides possibleProviders(requirement);        
 
-       // first, look in _installed        
-        for (PoolItemList::const_iterator iter = possibleProviders.begin(); iter != possibleProviders.end(); iter++) {
-            PoolItem provider = *iter;
+       // first, look in _installed
+        for_( iter, possibleProviders.begin(), possibleProviders.end() ) {
+            PoolItem provider = ResPool::instance().find( *iter );        
             if ((provider.resolvable() != item.resolvable())           // resolvable could provide its own requirement
                 && (_installed.find( provider ) != _installed.end()))  // and is not installed
             {
@@ -244,8 +244,8 @@ InstallOrder::rdfsvisit (const PoolItem item)
        // if not found in _installed, look in _toinstall
 
        if (providers.empty()) {
-            for (PoolItemList::const_iterator iter = possibleProviders.begin(); iter != possibleProviders.end(); iter++) {
-                PoolItem provider = *iter;
+            for_( iter, possibleProviders.begin(), possibleProviders.end() ) {
+                PoolItem provider = ResPool::instance().find( *iter );        
                 if ((provider.resolvable() != item.resolvable())               // resolvable could provide its own requirement
                     && (_toinstall.find( provider ) != _toinstall.end()))      // and is not to be installed
                 {
index 915048f..a11e4fb 100644 (file)
@@ -430,14 +430,14 @@ Resolver::doUpgrade( UpgradeStatistics & opt_stats_r )
 
       Capability installedCap( installed->name(), Rel::EQ, installed->edition(), installed->kind());
       // find ALL providers
-      PoolItemList possibleProviders = _satResolver->whoProvides (installedCap);
+      sat::WhatProvides possibleProviders(installedCap);
 
       // find best available providers for installed name
       typedef map<string, PoolItem> FindMap;
       FindMap providersMap;            // the best providers which matched
       bool otherVendorFound = false;
-      for (PoolItemList::const_iterator iter = possibleProviders.begin(); iter != possibleProviders.end(); iter++) {
-         PoolItem provider = *iter;
+      for_( iter, possibleProviders.begin(), possibleProviders.end() ) {
+         PoolItem provider = ResPool::instance().find( *iter );
          if ( !VendorAttr::instance().equivalent(provider->vendor(), installed->vendor()) )
          {
              MIL << "Discarding '" << provider << "' from vendor '"
@@ -594,58 +594,28 @@ Resolver::doUpgrade( UpgradeStatistics & opt_stats_r )
     if ( guess ) {
        // Checking if the selected provider depends on language, if yes try to find out the
        // correct language package
-       bool requested_locale_match = false;
-       Capabilities freshens( guess->dep( Dep::FRESHENS ) );
-
-#warning THIS DOES NO LONGER WORK, CREATE SAT::sOLVABLE::WHATEVERISNEEDED (IN DOUBT ASK MA@)
-// We no longer have any 'locale()' deps in FRESHENS!
-// Providing 'bool sat::Solvable::supportsRequestedLocale()' should simplify this code.
-// Maybe an enum instead of bool ( yes, no and via fallback list )
-       // is this a language package ?
-       for (Capabilities::const_iterator cit = freshens.begin(); cit != freshens.end(); ++cit) {
-           string citName = cit->asString();
-           if (citName.length() > 7 &&  citName.compare(0, 7, "locale(") == 0) { // is a language dependency
-               requested_locale_match = true;
-               break;
-           }
-       }
-
-       if (requested_locale_match) {
-           // searching the best language
+       if (guess.satSolvable().supportsLocales()) { // is this a language package ?
+           // searching a package which provides one of the requested languages.
            PoolItemOrderSet & gset( it->second );
-           requested_locale_match = false;
-
+           MIL << "Item " << guess << " provides language support. Look for proper language items." <<  endl;
            for ( PoolItemOrderSet::iterator git = gset.begin(); git != gset.end(); ++git ) {
                PoolItem item (*git);
 
                if ( item.status().isToBeInstalled()) {
-                   MIL << " ==> (pass 2: meanwhile set to install): " << item << endl;
+                   MIL << " ==> (pass 2: meanwhile set to install): " << item << ". Ignoring preselections." << endl;
                    if ( ! doesObsoleteItem (item, it->first ) ) {
                        it->first.status().setToBeUninstalled( ResStatus::APPL_HIGH );
                    }
                    guess = PoolItem();
                    break;
                } else {
-                   freshens = item->dep( Dep::FRESHENS );
-                   const LocaleSet & requested_locales = sat::Pool::instance().getRequestedLocales();
-
-                   // try to find a match of the locale freshens with one of the requested locales
-
-                   for (Capabilities::const_iterator cit = freshens.begin(); cit != freshens.end(); ++cit) {
-                       string citName = cit->asString();
-                       if (citName.length() > 7 &&  citName.compare(0, 7, "locale(") == 0) { // is a language dependency
-                           string loc = cit->index();
-                           MIL << "Look for language fallback " << loc << ":" << item << endl;
-                           if (requested_locales.find( Locale( loc ) ) != requested_locales.end()) {
-                               MIL << "Locale '" << loc << "' is requested" << endl;
-                               requested_locale_match = true;
-                               guess = item;
-                               break;
-                           }
-                       }
+                   if (item.satSolvable().supportsRequestedLocales()) {
+                       MIL << item << " provides a requested locale --> take thatone" << endl;
+                       guess = item;
+                       // do not break here cause there could be an item in the list which has been
+                       // already set for installation.
                    }
                }
-               if (requested_locale_match) break;
            }
        }
     }