Imported Upstream version 16.3.2
[platform/upstream/libzypp.git] / zypp / sat / detail / PoolImpl.cc
index 5f234eb..a0af21e 100644 (file)
@@ -103,21 +103,26 @@ namespace zypp
        return _val;
       }
 
-
       /////////////////////////////////////////////////////////////////
 
-      static void logSat( struct _Pool *, void *data, int type, const char *logString )
+      static void logSat( CPool *, void *data, int type, const char *logString )
       {
-         if ( type & (SOLV_FATAL|SOLV_ERROR) ) {
-           _ERR("libsolv") << logString;
-         } else if ( type & SOLV_DEBUG_STATS ) {
-           _DBG("libsolv") << logString;
-         } else {
-           _MIL("libsolv") << logString;
-         }
+       //                            "1234567890123456789012345678901234567890
+       if ( 0 == strncmp( logString, "  - no rule created", 19 ) )
+         return;
+       if ( 0 == strncmp( logString, "    next rules: 0 0", 19 ) )
+         return;
+
+       if ( type & (SOLV_FATAL|SOLV_ERROR) ) {
+         L_ERR("libsolv") << logString;
+       } else if ( type & SOLV_DEBUG_STATS ) {
+         L_DBG("libsolv") << logString;
+       } else {
+         L_MIL("libsolv") << logString;
+       }
       }
 
-      detail::IdType PoolImpl::nsCallback( struct _Pool *, void * data, detail::IdType lhs, detail::IdType rhs )
+      detail::IdType PoolImpl::nsCallback( CPool *, void * data, detail::IdType lhs, detail::IdType rhs )
       {
         // lhs:    the namespace identifier, e.g. NAMESPACE:MODALIAS
         // rhs:    the value, e.g. pci:v0000104Cd0000840[01]sv*sd*bc*sc*i*
@@ -258,9 +263,15 @@ namespace zypp
         ::pool_freewhatprovides( _pool );
       }
 
-
       void PoolImpl::prepare() const
       {
+       // additional /etc/sysconfig/storage check:
+       static WatchFile sysconfigFile( sysconfigStoragePath(), WatchFile::NO_INIT );
+       if ( sysconfigFile.hasChanged() )
+       {
+         _requiredFilesystemsPtr.reset(); // recreated on demand
+         const_cast<PoolImpl*>(this)->depSetDirty( "/etc/sysconfig/storage change" );
+       }
        if ( _watcher.remember( _serial ) )
         {
           // After repo/solvable add/remove:
@@ -281,40 +292,31 @@ namespace zypp
         }
       }
 
-      void PoolImpl::prepareForSolving() const
-      {
-       // additional /etc/sysconfig/storage check:
-       static WatchFile sysconfigFile( sysconfigStoragePath(), WatchFile::NO_INIT );
-       if ( sysconfigFile.hasChanged() )
-       {
-         _requiredFilesystemsPtr.reset(); // recreated on demand
-         const_cast<PoolImpl*>(this)->depSetDirty( "/etc/sysconfig/storage change" );
-       }
-       // finally prepare as usual:
-       prepare();
-      }
-
       ///////////////////////////////////////////////////////////////////
 
-      ::_Repo * PoolImpl::_createRepo( const std::string & name_r )
+      CRepo * PoolImpl::_createRepo( const std::string & name_r )
       {
         setDirty(__FUNCTION__, name_r.c_str() );
-        ::_Repo * ret = ::repo_create( _pool, name_r.c_str() );
+        CRepo * ret = ::repo_create( _pool, name_r.c_str() );
         if ( ret && name_r == systemRepoAlias() )
           ::pool_set_installed( _pool, ret );
         return ret;
       }
 
-      void PoolImpl::_deleteRepo( ::_Repo * repo_r )
+      void PoolImpl::_deleteRepo( CRepo * repo_r )
       {
         setDirty(__FUNCTION__, repo_r->name );
        if ( isSystemRepo( repo_r ) )
          _autoinstalled.clear();
         eraseRepoInfo( repo_r );
-        ::repo_free( repo_r, /*reuseids*/false );
+        ::repo_free( repo_r, /*resusePoolIDs*/false );
+       // If the last repo is removed clear the pool to actually reuse all IDs.
+       // NOTE: the explicit ::repo_free above asserts all solvables are memset(0)!
+       if ( !_pool->urepos )
+         ::pool_freeallrepos( _pool, /*resusePoolIDs*/true );
       }
 
-      int PoolImpl::_addSolv( ::_Repo * repo_r, FILE * file_r )
+      int PoolImpl::_addSolv( CRepo * repo_r, FILE * file_r )
       {
         setDirty(__FUNCTION__, repo_r->name );
         int ret = ::repo_add_solv( repo_r, file_r, 0 );
@@ -323,7 +325,7 @@ namespace zypp
         return ret;
       }
 
-      int PoolImpl::_addHelix( ::_Repo * repo_r, FILE * file_r )
+      int PoolImpl::_addHelix( CRepo * repo_r, FILE * file_r )
       {
         setDirty(__FUNCTION__, repo_r->name );
         int ret = ::repo_add_helix( repo_r, file_r, 0 );
@@ -332,7 +334,7 @@ namespace zypp
         return 0;
       }
 
-      void PoolImpl::_postRepoAdd( ::_Repo * repo_r )
+      void PoolImpl::_postRepoAdd( CRepo * repo_r )
       {
         if ( ! isSystemRepo( repo_r ) )
         {
@@ -352,7 +354,7 @@ namespace zypp
           unsigned       blockSize  = 0;
           for ( detail::IdType i = repo_r->start; i < repo_r->end; ++i )
           {
-              ::_Solvable * s( _pool->solvables + i );
+              CSolvable * s( _pool->solvables + i );
               if ( s->repo == repo_r && sysids.find( s->arch ) == sysids.end() )
               {
                 // Remember an unwanted arch entry:
@@ -363,20 +365,20 @@ namespace zypp
               else if ( blockSize )
               {
                 // Free remembered entries
-                  ::repo_free_solvable_block( repo_r, blockBegin, blockSize, /*reuseids*/false );
+                  ::repo_free_solvable_block( repo_r, blockBegin, blockSize, /*resusePoolIDs*/false );
                   blockBegin = blockSize = 0;
               }
           }
           if ( blockSize )
           {
               // Free remembered entries
-              ::repo_free_solvable_block( repo_r, blockBegin, blockSize, /*reuseids*/false );
+              ::repo_free_solvable_block( repo_r, blockBegin, blockSize, /*resusePoolIDs*/false );
               blockBegin = blockSize = 0;
           }
         }
       }
 
-      detail::SolvableIdType PoolImpl::_addSolvables( ::_Repo * repo_r, unsigned count_r )
+      detail::SolvableIdType PoolImpl::_addSolvables( CRepo * repo_r, unsigned count_r )
       {
         setDirty(__FUNCTION__, repo_r->name );
         return ::repo_add_solvable_block( repo_r, count_r );
@@ -384,7 +386,7 @@ namespace zypp
 
       void PoolImpl::setRepoInfo( RepoIdType id_r, const RepoInfo & info_r )
       {
-        ::_Repo * repo( getRepo( id_r ) );
+        CRepo * repo( getRepo( id_r ) );
         if ( repo )
         {
           bool dirty = false;
@@ -561,6 +563,7 @@ namespace zypp
         return *_availableLocalesPtr;
       }
 
+      ///////////////////////////////////////////////////////////////////
 
       void PoolImpl::multiversionListInit() const
       {
@@ -575,8 +578,6 @@ namespace zypp
 
          for ( Solvable solv : WhatProvides( Capability( provides ? spec.c_str() + prefix.size() : spec.c_str() ) ) )
          {
-           if ( solv.isSystem() )
-             continue;
            if ( provides || solv.ident() == spec )
              multiversionList.insert( solv );
          }
@@ -587,6 +588,9 @@ namespace zypp
         }
       }
 
+      void PoolImpl::multiversionSpecChanged()
+      { _multiversionListPtr.reset(); }
+
       const PoolImpl::MultiversionList & PoolImpl::multiversionList() const
       {
        if ( ! _multiversionListPtr )
@@ -597,6 +601,7 @@ namespace zypp
       bool PoolImpl::isMultiversion( const Solvable & solv_r ) const
       { return multiversionList().contains( solv_r ); }
 
+      ///////////////////////////////////////////////////////////////////
 
       const std::set<std::string> & PoolImpl::requiredFilesystems() const
       {