]> git.saurik.com Git - apt.git/blobdiff - apt-pkg/edsp/edspsystem.cc
edsp: optionally store a compressed copy of the last scenario
[apt.git] / apt-pkg / edsp / edspsystem.cc
index 92edb8d7715dee2745295990910bc62b588ec2c9..2a78efe58d6e0702f7919ec6f16bc80a6a5559a7 100644 (file)
 #include <apt-pkg/debversion.h>
 #include <apt-pkg/edspindexfile.h>
 #include <apt-pkg/edspsystem.h>
-#include <apt-pkg/fileutl.h>
 #include <apt-pkg/pkgcache.h>
 #include <apt-pkg/cacheiterators.h>
+#include <apt-pkg/fileutl.h>
 
 #include <stddef.h>
+#include <stdlib.h>
+#include <unistd.h>
+
 #include <string>
 #include <vector>
 
-#include <apti18n.h>
                                                                        /*}}}*/
 
-edspSystem edspSys;
-
-// System::debSystem - Constructor                                     /*{{{*/
-edspSystem::edspSystem()
+// System::System - Constructor                                                /*{{{*/
+edspLikeSystem::edspLikeSystem(char const * const Label) : pkgSystem(Label, &debVS)
 {
-   StatusFile = 0;
-
-   Label = "Debian APT solver interface";
-   VS = &debVS;
 }
-                                                                       /*}}}*/
-// System::~debSystem - Destructor                                     /*{{{*/
-edspSystem::~edspSystem()
+edspSystem::edspSystem() : edspLikeSystem("Debian APT solver interface")
 {
-   delete StatusFile;
 }
                                                                        /*}}}*/
 // System::Lock - Get the lock                                         /*{{{*/
-bool edspSystem::Lock()
+bool edspLikeSystem::Lock()
 {
    return true;
 }
                                                                        /*}}}*/
 // System::UnLock - Drop a lock                                                /*{{{*/
-bool edspSystem::UnLock(bool /*NoErrors*/)
+bool edspLikeSystem::UnLock(bool /*NoErrors*/)
 {
    return true;
 }
@@ -59,70 +52,98 @@ bool edspSystem::UnLock(bool /*NoErrors*/)
 // ---------------------------------------------------------------------
 /* we can't use edsp input as input for real installations - just a
    simulation can work, but everything else will fail bigtime */
-pkgPackageManager *edspSystem::CreatePM(pkgDepCache * /*Cache*/) const
+pkgPackageManager *edspLikeSystem::CreatePM(pkgDepCache * /*Cache*/) const
 {
-   return NULL;
+   return nullptr;
 }
                                                                        /*}}}*/
 // System::Initialize - Setup the configuration space..                        /*{{{*/
-bool edspSystem::Initialize(Configuration &Cnf)
+bool edspLikeSystem::Initialize(Configuration &Cnf)
 {
-   Cnf.Set("Dir::State::extended_states", "/dev/null");
+   Cnf.Set("Dir::Log", "/dev/null");
+   // state is included completely in the input files
+   Cnf.Set("Dir::Etc::preferences", "/dev/null");
+   Cnf.Set("Dir::Etc::preferencesparts", "/dev/null");
    Cnf.Set("Dir::State::status","/dev/null");
+   Cnf.Set("Dir::State::extended_states","/dev/null");
    Cnf.Set("Dir::State::lists","/dev/null");
-
+   // do not store an mmap cache
+   Cnf.Set("Dir::Cache::pkgcache", "");
+   Cnf.Set("Dir::Cache::srcpkgcache", "");
+   // the protocols only propose actions, not do them
    Cnf.Set("Debug::NoLocking", "true");
    Cnf.Set("APT::Get::Simulate", "true");
 
-   if (StatusFile) {
-     delete StatusFile;
-     StatusFile = 0;
-   }
+   StatusFile.reset(nullptr);
+   return true;
+}
+bool edspSystem::Initialize(Configuration &Cnf)
+{
+   if (edspLikeSystem::Initialize(Cnf) == false)
+      return false;
+   std::string const tmp = GetTempDir();
+   char tmpname[300];
+   snprintf(tmpname, sizeof(tmpname), "%s/apt-edsp-solver-XXXXXX", tmp.c_str());
+   if (nullptr == mkdtemp(tmpname))
+      return false;
+   tempDir = tmpname;
+   tempStatesFile = flCombine(tempDir, "extended_states");
+   Cnf.Set("Dir::State::extended_states", tempStatesFile);
+   tempPrefsFile = flCombine(tempDir, "apt_preferences");
+   Cnf.Set("Dir::Etc::preferences", tempPrefsFile);
    return true;
 }
                                                                        /*}}}*/
 // System::ArchiveSupported - Is a file format supported               /*{{{*/
-bool edspSystem::ArchiveSupported(const char * /*Type*/)
+bool edspLikeSystem::ArchiveSupported(const char * /*Type*/)
 {
    return false;
 }
                                                                        /*}}}*/
-// System::Score - Determine if we should use the edsp system          /*{{{*/
-signed edspSystem::Score(Configuration const &Cnf)
+// System::Score - Never use the EDSP system automatically             /*{{{*/
+signed edspLikeSystem::Score(Configuration const &)
 {
-   if (Cnf.Find("edsp::scenario", "") == "stdin")
-      return 1000;
-   if (RealFileExists(Cnf.FindFile("edsp::scenario","")) == true)
-      return 1000;
    return -1000;
 }
                                                                        /*}}}*/
-// System::AddStatusFiles - Register the status files                  /*{{{*/
-bool edspSystem::AddStatusFiles(std::vector<pkgIndexFile *> &List)
-{
-   if (StatusFile == 0)
-   {
-      if (_config->Find("edsp::scenario", "") == "stdin")
-        StatusFile = new edspIndex("stdin");
-      else
-        StatusFile = new edspIndex(_config->FindFile("edsp::scenario"));
-   }
-   List.push_back(StatusFile);
-   return true;
-}
-                                                                       /*}}}*/
 // System::FindIndex - Get an index file for status files              /*{{{*/
-bool edspSystem::FindIndex(pkgCache::PkgFileIterator File,
+bool edspLikeSystem::FindIndex(pkgCache::PkgFileIterator File,
                          pkgIndexFile *&Found) const
 {
    if (StatusFile == 0)
       return false;
    if (StatusFile->FindInCache(*File.Cache()) == File)
    {
-      Found = StatusFile;
+      Found = StatusFile.get();
       return true;
    }
 
    return false;
 }
                                                                        /*}}}*/
+bool edspSystem::AddStatusFiles(std::vector<pkgIndexFile *> &List)     /*{{{*/
+{
+   if (StatusFile == nullptr)
+   {
+      if (_config->Find("edsp::scenario", "") == "/nonexistent/stdin")
+        StatusFile.reset(new edspIndex("/nonexistent/stdin"));
+      else
+        StatusFile.reset(new edspIndex(_config->FindFile("edsp::scenario")));
+   }
+   List.push_back(StatusFile.get());
+   return true;
+}
+                                                                       /*}}}*/
+
+edspLikeSystem::~edspLikeSystem() {}
+edspSystem::~edspSystem()
+{
+   if (tempDir.empty())
+      return;
+
+   RemoveFile("~edspSystem", tempStatesFile);
+   RemoveFile("~edspSystem", tempPrefsFile);
+   rmdir(tempDir.c_str());
+}
+
+APT_HIDDEN edspSystem edspSys;