Imported Upstream version 14.42.0
[platform/upstream/libzypp.git] / zypp / ZYppCommitResult.h
index ae65611..c6e86cf 100644 (file)
 #define ZYPP_ZYPPCOMMITRESULT_H
 
 #include <iosfwd>
+#include <vector>
 #include <list>
 
 #include "zypp/PoolItem.h"
+#include "zypp/sat/Transaction.h"
+#include "zypp/base/DefaultIntegral.h"
 
 ///////////////////////////////////////////////////////////////////
 namespace zypp
 { /////////////////////////////////////////////////////////////////
 
+  namespace sat
+  {
+    class Transaction;
+  }
+
   /** Pair of \ref sat::Solvable and \ref Pathname. */
   class UpdateNotificationFile
   {
@@ -44,46 +52,125 @@ namespace zypp
   //
   /** Result returned from ZYpp::commit.
    *
+   * \note Transaction data are provided and maintained during commit.
+   * Though the interface does not inhibit manipulation of transaction
+   * data outside commit (those methods could have been made \c private:),
+   * this is not recommended as you may easily mess up things.
+   *
    * \see \ref ZYpp::commit
-   * \todo document fields.
    */
   class ZYppCommitResult
   {
     public:
+      typedef std::vector<sat::Transaction::Step> TransactionStepList;
+
+    public:
       ZYppCommitResult();
+      ZYppCommitResult( const ZYppCommitResult & lhs_r );
+      ZYppCommitResult( const Pathname & root_r );
+      ~ZYppCommitResult();
 
     public:
+      /** Remembered root directory of the target.
+       *  \Note Pathnames within this class are relative to the
+       * targets root directory.
+      */
+      const Pathname & root() const;
+
+      /** \c True if at least one attempt to actually install/remove packages was made.
+       * While this is false there should have been no serious modifications to the system.
+       * Mainly used to detect whether commit failed while preloading the caches or within
+       * the real action.
+       */
+      bool attemptToModify() const;
+
+      /** Set \ref attemptToModify */
+      void attemptToModify( bool yesno_r );
+
+      /** The full transaction list.
+       * The complete list including transaction steps that do not require
+       * any action (like obsoletes or non-package actions). Depending on
+       * \ref ZYppCommitPolicy::restrictToMedia only a subset of this
+       * transaction might have been executed.
+       * \see \ref transactionStepList.
+       */
+      const sat::Transaction & transaction() const;
+
+      /** Manipulate \ref transaction */
+      sat::Transaction & rTransaction();
+
+      /** List of \ref sat::Transaction::Step to be executed by commit.
+       * The list of transaction step commit actually tried to execute.
+       */
+      const TransactionStepList & transactionStepList() const;
+
+      /** Manipulate \ref transactionStepList. */
+      TransactionStepList & rTransactionStepList();
+
       /** List of update messages installed during this commit.
        * \Note Pathnames are relative to the targets root directory.
+       * \code
+       *   ZYppCommitResult result;
+       *   ...
+       *   if ( ! result.updateMessages().empty() )
+       *   {
+       *     MIL << "Received " << result.updateMessages().size() << " update notification(s):" << endl;
+       *     for_( it, result.updateMessages().begin(), result.updateMessages().end() )
+       *     {
+       *       MIL << "- From " << it->solvable().asString() << " in file " << Pathname::showRootIf( result.root(), it->file() ) << ":" << endl;
+       *       {
+       *         // store message files content in a string:
+       *         InputStream istr( Pathname::assertprefix( result.root(), it->file() ) );
+       *         std::ostringstream strstr;
+       *         iostr::copy( istr, strstr );
+       *         std::string message( strstr.str() ); // contains the message
+       *       }
+       *       {
+       *         // or write out the message file indented:
+       *         InputStream istr( Pathname::assertprefix( result.root(), it->file() ) );
+       *         iostr::copyIndent( istr, MIL, "> " ) << endl;
+       *       }
+       *     }
+       *   }
+       * \endcode
        */
       const UpdateNotifications & updateMessages() const;
 
-      /** Change list of update messages installed during this commit.
+      /** Manipulate \ref updateMessages
        * \Note Pathnames are relative to the targets root directory.
        */
-      UpdateNotifications & setUpdateMessages();
+      UpdateNotifications & rUpdateMessages();
 
     public:
-      /** \name Oldstlye interface to be removed asap.
+
+      /** \name Some statistics based on \ref Transaction
+       *
+       * Class \ref Transaction allows to count and iterate the action steps to
+       * get more detailed information about the transaction result. Here are just
+       * a few convenience methods for easy evaluation.
+       *
+       * \code
+       *    ZYppCommitResult result;
+       *    const sat::Transaction & trans( result.transaction() );
+       *    for_( it, trans.actionBegin(~sat::Transaction::STEP_DONE), trans.actionEnd() )
+       *    {
+       *       // process all steps not DONE (ERROR and TODO)
+       *       if ( it->satSolvable() )
+       *         std::cout << it->satSolvable() << endl;
+       *       else // deleted @System solvable: print post mortem data available
+       *         std::cout << it->ident() << endl;
+       *    }
+       * \endcode
+       * \see \ref Transaction, \ref transaction()
        */
       //@{
-      typedef std::list<PoolItem> PoolItemList;
-      /**
-       * number of committed resolvables
-       **/
-      int          _result;
-      /**
-       * list of resolvables with error
-       **/
-      PoolItemList _errors;
-      /**
-       * list of resolvables remaining (due to wrong media)
-       **/
-      PoolItemList _remaining;
-      /**
-       * list of kind:source resolvables remaining (due to wrong media)
-       **/
-      PoolItemList _srcremaining;
+       /** Whether all steps were performed successfully (none skipped or error) */
+       bool allDone() const
+       { return transaction().actionEmpty( ~sat::Transaction::STEP_DONE ); }
+
+       /** Whether an error ocurred (skipped streps are ok). */
+       bool noError() const
+       { return transaction().actionEmpty( sat::Transaction::STEP_ERROR ); }
       //@}
 
     public: