Factor out CommitPackageCache for standalone usage. (Fate#317077)
authorMichael Andres <ma@suse.de>
Tue, 15 Apr 2014 15:02:50 +0000 (17:02 +0200)
committerMichael Andres <ma@suse.de>
Tue, 15 Apr 2014 15:02:50 +0000 (17:02 +0200)
zypp/target/CommitPackageCache.cc
zypp/target/CommitPackageCache.h
zypp/target/TargetImpl.cc

index 11425c0..6aa4dca 100644 (file)
 
 using std::endl;
 
+#include "zypp/target/rpm/librpmDb.h"
+#include "zypp/repo/PackageProvider.h"
+#include "zypp/repo/DeltaCandidates.h"
+#include "zypp/ResPool.h"
+
 ///////////////////////////////////////////////////////////////////
 namespace zypp
 { /////////////////////////////////////////////////////////////////
@@ -27,6 +32,71 @@ namespace zypp
   { /////////////////////////////////////////////////////////////////
 
     ///////////////////////////////////////////////////////////////////
+    namespace {
+      ///////////////////////////////////////////////////////////////////
+      /// \class QueryInstalledEditionHelper
+      /// \short Helper for PackageProvider queries during download.
+      ///////////////////////////////////////////////////////////////////
+      struct QueryInstalledEditionHelper
+      {
+       bool operator()( const std::string & name_r, const Edition & ed_r, const Arch & arch_r ) const
+       {
+         rpm::librpmDb::db_const_iterator it;
+         for ( it.findByName( name_r ); *it; ++it )
+         {
+           if ( arch_r == it->tag_arch()
+             && ( ed_r == Edition::noedition || ed_r == it->tag_edition() ) )
+           {
+             return true;
+           }
+         }
+         return false;
+       }
+      };
+    } // namespace
+    ///////////////////////////////////////////////////////////////////
+
+    ///////////////////////////////////////////////////////////////////
+    //
+    // class RepoProvidePackage
+    //
+    ///////////////////////////////////////////////////////////////////
+
+    struct RepoProvidePackage::Impl
+    {
+      repo::RepoMediaAccess _access;
+      std::list<Repository> _repos;
+      repo::PackageProviderPolicy _packageProviderPolicy;
+    };
+
+    RepoProvidePackage::RepoProvidePackage()
+      : _impl( new Impl )
+    {
+       const ResPool & pool( ResPool::instance() );
+      _impl->_repos.insert( _impl->_repos.begin(), pool.knownRepositoriesBegin(), pool.knownRepositoriesEnd() );
+      _impl->_packageProviderPolicy.queryInstalledCB( QueryInstalledEditionHelper() );
+    }
+
+    RepoProvidePackage::~RepoProvidePackage()
+    {}
+
+    ManagedFile RepoProvidePackage::operator()( const PoolItem & pi, bool fromCache_r )
+    {
+      Package::constPtr p = asKind<Package>(pi.resolvable());
+      if ( fromCache_r )
+      {
+       repo::PackageProvider pkgProvider( _impl->_access, p, repo::DeltaCandidates(), _impl->_packageProviderPolicy );
+       return pkgProvider.providePackageFromCache();
+      }
+      else
+      {
+       repo::DeltaCandidates deltas( _impl->_repos, p->name() );
+       repo::PackageProvider pkgProvider( _impl->_access, p, deltas, _impl->_packageProviderPolicy );
+       return pkgProvider.providePackage();
+      }
+    }
+
+    ///////////////////////////////////////////////////////////////////
     //
     // CLASS NAME : CommitPackageCache
     //
index 426f745..aac5ac6 100644 (file)
@@ -29,6 +29,27 @@ namespace zypp
   { /////////////////////////////////////////////////////////////////
 
     ///////////////////////////////////////////////////////////////////
+    /// \class RepoProvidePackage
+    /// \short Default PackageProvider for \ref CommitPackageCache
+    ///
+    /// \p pool_r \ref ResPool used to get candidates
+    /// \p pi item to be commited
+    ///////////////////////////////////////////////////////////////////
+    class RepoProvidePackage
+    {
+    public:
+      RepoProvidePackage();
+      ~RepoProvidePackage();
+
+      /** Provide package optionally fron cache only. */
+      ManagedFile operator()( const PoolItem & pi, bool fromCache_r );
+
+    private:
+      struct Impl;
+      RW_pointer<Impl> _impl;
+    };
+
+    ///////////////////////////////////////////////////////////////////
     //
     // CLASS NAME : CommitPackageCache
     //
@@ -44,7 +65,7 @@ namespace zypp
     public:
       /** Ctor */
       CommitPackageCache( const Pathname &        rootDir_r,
-                          const PackageProvider & packageProvider_r );
+                          const PackageProvider & packageProvider_r = RepoProvidePackage() );
 
       /** Dtor */
       ~CommitPackageCache();
index 28c8552..f908895 100644 (file)
@@ -51,8 +51,6 @@
 
 #include "zypp/solver/detail/Testcase.h"
 
-#include "zypp/repo/DeltaCandidates.h"
-#include "zypp/repo/PackageProvider.h"
 #include "zypp/repo/SrcPackageProvider.h"
 
 #include "zypp/sat/Pool.h"
@@ -744,59 +742,6 @@ namespace zypp
                              ZYppCommitResult & result_r )
     { RunUpdateMessages( root_r, messagesPath_r, checkPackages_r, result_r ); }
 
-    /** Helper for PackageProvider queries during commit. */
-    struct QueryInstalledEditionHelper
-    {
-      bool operator()( const std::string & name_r,
-                       const Edition &     ed_r,
-                       const Arch &        arch_r ) const
-      {
-        rpm::librpmDb::db_const_iterator it;
-        for ( it.findByName( name_r ); *it; ++it )
-          {
-            if ( arch_r == it->tag_arch()
-                 && ( ed_r == Edition::noedition || ed_r == it->tag_edition() ) )
-              {
-                return true;
-              }
-          }
-        return false;
-      }
-    };
-
-    /**
-     * \short Let the Source provide the package.
-     * \p pool_r \ref ResPool used to get candidates
-     * \p pi item to be commited
-    */
-    struct RepoProvidePackage
-    {
-      repo::RepoMediaAccess &_access;
-      std::list<Repository> _repos;
-      repo::PackageProviderPolicy _packageProviderPolicy;
-
-      RepoProvidePackage( repo::RepoMediaAccess &access, ResPool pool_r )
-      : _access(access), _repos( pool_r.knownRepositoriesBegin(), pool_r.knownRepositoriesEnd() )
-      {
-       _packageProviderPolicy.queryInstalledCB( QueryInstalledEditionHelper() );
-      }
-
-      ManagedFile operator()( const PoolItem & pi, bool fromCache_r )
-      {
-        Package::constPtr p = asKind<Package>(pi.resolvable());
-       if ( fromCache_r )
-       {
-         repo::PackageProvider pkgProvider( _access, p, repo::DeltaCandidates(), _packageProviderPolicy );
-         return pkgProvider.providePackageFromCache();
-       }
-       else
-       {
-         repo::DeltaCandidates deltas( _repos, p->name() );
-         repo::PackageProvider pkgProvider( _access, p, deltas, _packageProviderPolicy );
-         return pkgProvider.providePackage();
-       }
-      }
-    };
     ///////////////////////////////////////////////////////////////////
 
     IMPL_PTR_TYPE(TargetImpl);
@@ -1356,9 +1301,7 @@ namespace zypp
       if ( ! policy_r.dryRun() || policy_r.downloadMode() == DownloadOnly )
       {
        // Prepare the package cache. Pass all items requiring download.
-        repo::RepoMediaAccess access;
-        RepoProvidePackage repoProvidePackage( access, pool_r );
-        CommitPackageCache packageCache( root(), repoProvidePackage );
+        CommitPackageCache packageCache( root() );
        packageCache.setCommitList( steps.begin(), steps.end() );
 
         bool miss = false;