Add download policies to ZYppCommitPolicy.
authorMichael Andres <ma@suse.de>
Mon, 20 Jul 2009 12:32:17 +0000 (14:32 +0200)
committerMichael Andres <ma@suse.de>
Mon, 20 Jul 2009 20:07:27 +0000 (22:07 +0200)
zypp/ZYppCommitPolicy.cc
zypp/ZYppCommitPolicy.h

index 05c2c6d..49e4721 100644 (file)
 #include "zypp/base/String.h"
 
 #include "zypp/ZConfig.h"
-
 #include "zypp/ZYppCommitPolicy.h"
 
 ///////////////////////////////////////////////////////////////////
 namespace zypp
 { /////////////////////////////////////////////////////////////////
 
+  std::ostream & operator<<( std::ostream & str, DownloadMode obj )
+  {
+    switch ( obj )
+    {
+#define OUTS(VAL) case VAL: return str << #VAL; break
+      OUTS( DownloadOnly );
+      OUTS( DownloadInAdvance );
+      OUTS( DownloadInHeaps );
+      OUTS( DownloadAsNeeded );
+#undef OUTS
+    }
+    return str << "DownloadMode(" << int(obj) << ")";
+  }
+
+  ///////////////////////////////////////////////////////////////////
+  //
+  //   CLASS NAME : ZYppCommitPolicy::Impl
+  //
+  ///////////////////////////////////////////////////////////////////
+
+  class ZYppCommitPolicy::Impl
+  {
+    public:
+      Impl()
+      : _restrictToMedia       ( 0 )
+      , _dryRun                        ( false )
+      , _downloadMode          ( DownloadAsNeeded )
+      , _rpmInstFlags          ( ZConfig::instance().rpmInstallFlags() )
+      , _syncPoolAfterCommit   ( true )
+      {}
+
+    public:
+      unsigned                 _restrictToMedia;
+      bool                     _dryRun;
+      DownloadMode             _downloadMode;
+      target::rpm::RpmInstFlags        _rpmInstFlags;
+      bool                     _syncPoolAfterCommit;
+
+    private:
+      friend Impl * rwcowClone<Impl>( const Impl * rhs );
+      /** clone for RWCOW_pointer */
+      Impl * clone() const { return new Impl( *this ); }
+  };
+
+  ///////////////////////////////////////////////////////////////////
+  //
+  //   CLASS NAME : ZYppCommitPolicy
+  //
+  ///////////////////////////////////////////////////////////////////
+
   ZYppCommitPolicy::ZYppCommitPolicy()
-      : _restrictToMedia    ( 0 )
-      , _dryRun             ( false )
-      , _rpmInstFlags       ( ZConfig::instance().rpmInstallFlags() )
-      , _syncPoolAfterCommit( true )
+  : _pimpl( new Impl )
   {}
 
+
+  ZYppCommitPolicy & ZYppCommitPolicy::restrictToMedia( unsigned mediaNr_r )
+  { _pimpl->_restrictToMedia = ( mediaNr_r == 1 ) ? 1 : 0; return *this; }
+
+  unsigned ZYppCommitPolicy::restrictToMedia() const
+  { return _pimpl->_restrictToMedia; }
+
+
+  ZYppCommitPolicy & ZYppCommitPolicy::dryRun( bool yesNo_r )
+  { _pimpl->_dryRun = yesNo_r; return *this; }
+
+  bool ZYppCommitPolicy::dryRun() const
+  { return _pimpl->_dryRun; }
+
+
+  ZYppCommitPolicy & ZYppCommitPolicy::downloadMode( DownloadMode val_r )
+  { _pimpl->_downloadMode = val_r; return *this; }
+
+  DownloadMode ZYppCommitPolicy::downloadMode() const
+  { return _pimpl->_downloadMode; }
+
+
+  ZYppCommitPolicy &  ZYppCommitPolicy::rpmInstFlags( target::rpm::RpmInstFlags newFlags_r )
+  { _pimpl->_rpmInstFlags = newFlags_r; return *this; }
+
+  ZYppCommitPolicy & ZYppCommitPolicy::rpmNoSignature( bool yesNo_r )
+  { _pimpl->_rpmInstFlags.setFlag( target::rpm::RPMINST_NOSIGNATURE, yesNo_r ); return *this; }
+
+  ZYppCommitPolicy & ZYppCommitPolicy::rpmExcludeDocs( bool yesNo_r )
+  { _pimpl->_rpmInstFlags.setFlag( target::rpm::RPMINST_EXCLUDEDOCS, yesNo_r ); return *this; }
+
+  target::rpm::RpmInstFlags ZYppCommitPolicy::rpmInstFlags() const
+  { return _pimpl->_rpmInstFlags; }
+
+  bool ZYppCommitPolicy::rpmNoSignature() const
+  { return _pimpl->_rpmInstFlags.testFlag( target::rpm::RPMINST_NOSIGNATURE ); }
+
+  bool ZYppCommitPolicy::rpmExcludeDocs() const
+  { return _pimpl->_rpmInstFlags.testFlag( target::rpm::RPMINST_EXCLUDEDOCS ); }
+
+
+  ZYppCommitPolicy & ZYppCommitPolicy::syncPoolAfterCommit( bool yesNo_r )
+  { _pimpl->_syncPoolAfterCommit = yesNo_r; return *this; }
+
+  bool ZYppCommitPolicy::syncPoolAfterCommit() const
+  { return _pimpl->_syncPoolAfterCommit; }
+
+
   std::ostream & operator<<( std::ostream & str, const ZYppCommitPolicy & obj )
   {
     str << "CommitPolicy(";
@@ -36,6 +130,7 @@ namespace zypp
       str << " restrictToMedia:" << obj.restrictToMedia();
     if ( obj.dryRun() )
       str << " dryRun";
+    str << " " << obj.downloadMode();
     if ( obj.syncPoolAfterCommit() )
       str << " syncPoolAfterCommit";
     if ( obj.rpmInstFlags() )
index 90b79d3..095469f 100644 (file)
 
 #include <iosfwd>
 
+#include "zypp/base/PtrTypes.h"
+
 #include "zypp/target/rpm/RpmFlags.h"
 
 ///////////////////////////////////////////////////////////////////
 namespace zypp
 { /////////////////////////////////////////////////////////////////
 
+  /** Supported commit download policies. */
+  enum DownloadMode
+  {
+    DownloadOnly,      //!< Just download all packages to the local cache.
+                       //!< Do not install. Implies a dry-run.
+    DownloadInAdvance, //!< First download all packages to the local cache.
+                       //!< Then start to install.
+    DownloadInHeaps,   //!< Similar to DownloadInAdvance, but try to split
+                       //!< the transaction into heaps, where at the end of
+                       //!< each heap a consistent system state is reached.
+    DownloadAsNeeded   //!< Alternating download and install. Packages are
+                       //!< cached just to avid CD/DVD hopping. This is the
+                       //!< traditional behaviour.
+  };
+
+  /** \relates DownloadMode Stream output. */
+  std::ostream & operator<<( std::ostream & str, DownloadMode obj );
+
   ///////////////////////////////////////////////////////////////////
   //
   //   CLASS NAME : ZYppCommitPolicy
@@ -27,67 +47,70 @@ namespace zypp
   /** */
   class ZYppCommitPolicy
   {
-  public:
-    ZYppCommitPolicy();
+    public:
+
+      ZYppCommitPolicy();
+
+    public:
+      /** Restrict commit to media 1.
+       * Fake outstanding YCP fix: Honour restriction to media 1
+       * at installation, but install all remaining packages if
+       * post-boot (called with <tt>mediaNr_r &gt; 1</tt>).
+       */
+      ZYppCommitPolicy & restrictToMedia( unsigned mediaNr_r );
+
+      /** Process all media (default) */
+      ZYppCommitPolicy & allMedia()
+      { return restrictToMedia( 0 ); }
+
+      unsigned restrictToMedia() const;
+
+
+      /** Set dry run (default: false).
+       * Dry-run should not change anything on the system, unless
+       * the \ref downloadMode is set to \ref DownloadOnly. In that
+       * case packages are downloaded to the local cache.
+      */
+      ZYppCommitPolicy & dryRun( bool yesNo_r );
 
-  public:
-    unsigned restrictToMedia() const
-    { return _restrictToMedia; }
+      bool dryRun() const;
 
-    bool dryRun() const
-    { return _dryRun; }
 
-    target::rpm::RpmInstFlags rpmInstFlags() const
-    { return _rpmInstFlags; }
+      /** Commit download policy to use. (default: \ref DownloadAsNeeded)
+       *  \note \ref DownloadOnly also implies a \ref dryRun.
+       */
+      ZYppCommitPolicy & downloadMode( DownloadMode val_r );
 
-    bool rpmNoSignature() const
-    { return _rpmInstFlags.testFlag( target::rpm::RPMINST_NOSIGNATURE ); }
+      DownloadMode downloadMode() const;
 
-    bool rpmExcludeDocs() const
-    { return _rpmInstFlags.testFlag( target::rpm::RPMINST_EXCLUDEDOCS ); }
 
+      /** The default \ref target::rpm::RpmInstFlags. (default: none)*/
+      ZYppCommitPolicy &  rpmInstFlags( target::rpm::RpmInstFlags newFlags_r );
 
-    bool syncPoolAfterCommit() const
-    { return _syncPoolAfterCommit; }
+      /** Use rpm option --nosignature (default: false) */
+      ZYppCommitPolicy & rpmNoSignature( bool yesNo_r );
 
-  public:
-    /** Restrict commit to media 1.
-     * Fake outstanding YCP fix: Honour restriction to media 1
-     * at installation, but install all remaining packages if
-     * post-boot (called with <tt>mediaNr_r &gt; 1</tt>).
-     */
-    ZYppCommitPolicy & restrictToMedia( unsigned mediaNr_r )
-    { _restrictToMedia = ( mediaNr_r == 1 ) ? 1 : 0; return *this; }
+      /** Use rpm option --excludedocs (default: false) */
+      ZYppCommitPolicy & rpmExcludeDocs( bool yesNo_r );
 
-    /** Process all media (default) */
-    ZYppCommitPolicy & allMedia()
-    { return restrictToMedia( 0 ); }
+      target::rpm::RpmInstFlags rpmInstFlags() const;
 
-    /** Set dry run (default: false) */
-    ZYppCommitPolicy & dryRun( bool yesNo_r )
-    { _dryRun = yesNo_r; return *this; }
+      bool rpmNoSignature() const;
 
-    /** The default \ref target::rpm::RpmInstFlags. (default: none)*/
-    ZYppCommitPolicy &  rpmInstFlags( target::rpm::RpmInstFlags newFlags_r )
-    { _rpmInstFlags = newFlags_r; return *this; }
+      bool rpmExcludeDocs() const;
 
-    /** Use rpm option --nosignature (default: false) */
-    ZYppCommitPolicy & rpmNoSignature( bool yesNo_r )
-    { _rpmInstFlags.setFlag( target::rpm::RPMINST_NOSIGNATURE, yesNo_r ); return *this; }
 
-    /** Use rpm option --excludedocs (default: false) */
-    ZYppCommitPolicy & rpmExcludeDocs( bool yesNo_r )
-    { _rpmInstFlags.setFlag( target::rpm::RPMINST_EXCLUDEDOCS, yesNo_r ); return *this; }
+      /** Kepp pool in sync with the Target databases after commit (default: true) */
+      ZYppCommitPolicy & syncPoolAfterCommit( bool yesNo_r );
 
-    /** Kepp pool in sync with the Target databases after commit (default: true) */
-    ZYppCommitPolicy & syncPoolAfterCommit( bool yesNo_r )
-    { _syncPoolAfterCommit = yesNo_r; return *this; }
+      bool syncPoolAfterCommit() const;
 
-  private:
-    unsigned                  _restrictToMedia;
-    bool                      _dryRun;
-    target::rpm::RpmInstFlags _rpmInstFlags;
-    bool                      _syncPoolAfterCommit;
+    public:
+      /** Implementation  */
+      class Impl;
+    private:
+      /** Pointer to data. */
+      RWCOW_pointer<Impl> _pimpl;
   };
   ///////////////////////////////////////////////////////////////////