Imported Upstream version 16.3.2
[platform/upstream/libzypp.git] / zypp / zypp_detail / ZYppImpl.cc
index 6e3636b..8af290a 100644 (file)
@@ -9,16 +9,51 @@
 /** \file      zypp/zypp_detail/ZYppImpl.cc
  *
 */
+
 #include <iostream>
-//#include "zypp/base/Logger.h"
+#include "zypp/TmpPath.h"
+#include "zypp/base/Logger.h"
+#include "zypp/base/String.h"
 
 #include "zypp/zypp_detail/ZYppImpl.h"
+#include "zypp/target/TargetImpl.h"
+#include "zypp/ZYpp.h"
+#include "zypp/DiskUsageCounter.h"
+#include "zypp/ZConfig.h"
+#include "zypp/sat/Pool.h"
+#include "zypp/PoolItem.h"
+
+#include "zypp/ZYppCallbacks.h"        // JobReport::instance
 
 using std::endl;
 
 ///////////////////////////////////////////////////////////////////
 namespace zypp
 { /////////////////////////////////////////////////////////////////
+
+  ///////////////////////////////////////////////////////////////////
+  namespace media
+  {
+    ScopedDisableMediaChangeReport::ScopedDisableMediaChangeReport( bool condition_r )
+    {
+      static weak_ptr<callback::TempConnect<media::MediaChangeReport> > globalguard;
+      if ( condition_r && ! (_guard = globalguard.lock()) )
+      {
+       // aquire a new one....
+       _guard.reset( new callback::TempConnect<media::MediaChangeReport>() );
+       globalguard = _guard;
+      }
+    }
+  } // namespace media
+  ///////////////////////////////////////////////////////////////////
+
+  callback::SendReport<JobReport> & JobReport::instance()
+  {
+    static callback::SendReport<JobReport> _report;
+    return _report;
+  }
+
+
   ///////////////////////////////////////////////////////////////////
   namespace zypp_detail
   { /////////////////////////////////////////////////////////////////
@@ -29,7 +64,12 @@ namespace zypp
     // METHOD TYPE : Constructor
     //
     ZYppImpl::ZYppImpl()
+    : _target(0)
+    , _resolver( new Resolver( ResPool::instance()) )
     {
+      ZConfig::instance().about( MIL );
+      MIL << "Initializing keyring..." << std::endl;
+      _keyring = new KeyRing(tmpPath());
     }
 
     ///////////////////////////////////////////////////////////////////
@@ -38,7 +78,135 @@ namespace zypp
     // METHOD TYPE : Destructor
     //
     ZYppImpl::~ZYppImpl()
+    {}
+
+    //------------------------------------------------------------------------
+    // add/remove resolvables
+
+    DiskUsageCounter::MountPointSet ZYppImpl::diskUsage()
+    {
+      if ( ! _disk_usage )
+      {
+        setPartitions( DiskUsageCounter::detectMountPoints() );
+      }
+      return _disk_usage->disk_usage(pool());
+    }
+
+    void ZYppImpl::setPartitions(const DiskUsageCounter::MountPointSet &mp)
+    {
+      _disk_usage.reset(new DiskUsageCounter());
+      _disk_usage->setMountPoints(mp);
+    }
+
+    DiskUsageCounter::MountPointSet ZYppImpl::getPartitions() const
+    {
+      if (_disk_usage)
+        return _disk_usage->getMountPoints();
+      else
+        return DiskUsageCounter::detectMountPoints();
+    }
+
+    //------------------------------------------------------------------------
+    // target
+
+    Target_Ptr ZYppImpl::target() const
+    {
+      if (! _target)
+       ZYPP_THROW(Exception("Target not initialized."));
+      return _target;
+     }
+
+    void ZYppImpl::initializeTarget( const Pathname & root, bool doRebuild_r )
+    {
+      MIL << "initTarget( " << root << (doRebuild_r?", rebuilddb":"") << ")" << endl;
+      if (_target) {
+          if (_target->root() == root) {
+              MIL << "Repeated call to initializeTarget()" << endl;
+              return;
+          }
+
+          _target->unload();
+
+      }
+      _target = new Target( root, doRebuild_r );
+      _target->buildCache();
+    }
+
+    void ZYppImpl::finishTarget()
+    {
+      if (_target)
+          _target->unload();
+
+      _target = 0;
+    }
+
+    //------------------------------------------------------------------------
+    // commit
+
+    /** \todo Remove workflow from target, lot's of it could be done here,
+     * and target used for transact. */
+    ZYppCommitResult ZYppImpl::commit( const ZYppCommitPolicy & policy_r )
+    {
+      setenv( "ZYPP_IS_RUNNING", str::numstring(getpid()).c_str(), 1 );
+
+      if ( getenv("ZYPP_TESTSUITE_FAKE_ARCH") )
+      {
+        ZYPP_THROW( Exception("ZYPP_TESTSUITE_FAKE_ARCH set. Commit not allowed and disabled.") );
+      }
+
+      MIL << "Attempt to commit (" << policy_r << ")" << endl;
+      if (! _target)
+       ZYPP_THROW( Exception("Target not initialized.") );
+
+      ZYppCommitResult res = _target->_pimpl->commit( pool(), policy_r );
+
+      if (! policy_r.dryRun() )
+      {
+        if ( policy_r.syncPoolAfterCommit() )
+          {
+            // reload new status from target
+            DBG << "reloading " << sat::Pool::instance().systemRepoAlias() << " repo to pool" << endl;
+            _target->load();
+          }
+        else
+          {
+            DBG << "unloading " << sat::Pool::instance().systemRepoAlias() << " repo from pool" << endl;
+            _target->unload();
+          }
+      }
+
+      MIL << "Commit (" << policy_r << ") returned: "
+          << res << endl;
+      return res;
+    }
+
+    void ZYppImpl::installSrcPackage( const SrcPackage_constPtr & srcPackage_r )
+    {
+      if (! _target)
+        ZYPP_THROW( Exception("Target not initialized.") );
+      _target->_pimpl->installSrcPackage( srcPackage_r );
+    }
+
+    ManagedFile ZYppImpl::provideSrcPackage( const SrcPackage_constPtr & srcPackage_r )
+    {
+      if (! _target)
+        ZYPP_THROW( Exception("Target not initialized.") );
+      return _target->_pimpl->provideSrcPackage( srcPackage_r );
+    }
+
+    //------------------------------------------------------------------------
+    // target store path
+
+    Pathname ZYppImpl::homePath() const
+    { return _home_path.empty() ? Pathname("/var/lib/zypp") : _home_path; }
+
+    void ZYppImpl::setHomePath( const Pathname & path )
+    { _home_path = path; }
+
+    Pathname ZYppImpl::tmpPath() const
     {
+      static TmpDir zypp_tmp_dir( TmpPath::defaultLocation(), "zypp." );
+      return zypp_tmp_dir.path();
     }
 
     /******************************************************************