// Description /*{{{*/
/* ######################################################################
- This system provides the abstraction to use the universe file as the
+ This system provides the abstraction to use the scenario file as the
only source of package information to be able to feed the created file
back to APT for its own consumption (eat your own dogfood).
##################################################################### */
/*}}}*/
// Include Files /*{{{*/
-#include <apt-pkg/edspsystem.h>
+#include <config.h>
+
+#include <apt-pkg/configuration.h>
#include <apt-pkg/debversion.h>
#include <apt-pkg/edspindexfile.h>
-#include <apt-pkg/configuration.h>
-#include <apt-pkg/error.h>
+#include <apt-pkg/edspsystem.h>
+#include <apt-pkg/pkgcache.h>
+#include <apt-pkg/cacheiterators.h>
#include <apt-pkg/fileutl.h>
-#include <apti18n.h>
-#include <sys/types.h>
+
+#include <stddef.h>
+#include <stdlib.h>
#include <unistd.h>
-#include <dirent.h>
-#include <errno.h>
- /*}}}*/
-edspSystem edspSys;
+#include <string>
+#include <vector>
-// System::debSystem - Constructor /*{{{*/
-edspSystem::edspSystem()
-{
- StatusFile = 0;
+ /*}}}*/
- Label = "Debian APT solver interface";
- VS = &debVS;
+// System::System - Constructor /*{{{*/
+edspLikeSystem::edspLikeSystem(char const * const Label) : pkgSystem(Label, &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;
}
// ---------------------------------------------------------------------
/* 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");
+ // state is included completely in the input files
+ Cnf.Set("Dir::Etc::preferencesparts", "/dev/null");
Cnf.Set("Dir::State::status","/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 (FileExists(Cnf.FindFile("Dir::State::universe","")) == true)
- return 1000;
return -1000;
}
/*}}}*/
-// System::AddStatusFiles - Register the status files /*{{{*/
-bool edspSystem::AddStatusFiles(vector<pkgIndexFile *> &List)
-{
- if (StatusFile == 0)
- StatusFile = new edspIndex(_config->FindFile("Dir::State::universe"));
- 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;