diff options
author | David Kalnischkies <david@kalnischkies.de> | 2015-09-08 22:14:11 +0200 |
---|---|---|
committer | David Kalnischkies <david@kalnischkies.de> | 2015-09-14 15:22:18 +0200 |
commit | 188a6fcf4f13df1fd362a0aff27a23493ddd1ec5 (patch) | |
tree | d7d29209986acf989484cd0050601b55d5e40dba /apt-pkg/edsp | |
parent | 8fec289ad8a2c42350c24d5c97b0f104fbbea176 (diff) |
implement autobit and pinning in EDSP solver 'apt'
The parser creates a preferences as well as an extended states file
based on the EDSP scenario file, which isn't the most efficient way of
dealing with this as thes text files have to be parsed again by another
layer of the code, but it needs the least changes and works good enough
for now. The 'apt' solver is in the end just a test solver like dump.
Diffstat (limited to 'apt-pkg/edsp')
-rw-r--r-- | apt-pkg/edsp/edsplistparser.cc | 50 | ||||
-rw-r--r-- | apt-pkg/edsp/edsplistparser.h | 3 | ||||
-rw-r--r-- | apt-pkg/edsp/edspsystem.cc | 46 | ||||
-rw-r--r-- | apt-pkg/edsp/edspsystem.h | 3 |
4 files changed, 94 insertions, 8 deletions
diff --git a/apt-pkg/edsp/edsplistparser.cc b/apt-pkg/edsp/edsplistparser.cc index ff79b537e..5c90cf1fc 100644 --- a/apt-pkg/edsp/edsplistparser.cc +++ b/apt-pkg/edsp/edsplistparser.cc @@ -11,18 +11,40 @@ // Include Files /*{{{*/ #include <config.h> +#include <apt-pkg/configuration.h> #include <apt-pkg/edsplistparser.h> #include <apt-pkg/md5.h> #include <apt-pkg/deblistparser.h> #include <apt-pkg/pkgcache.h> #include <apt-pkg/cacheiterators.h> #include <apt-pkg/tagfile.h> +#include <apt-pkg/fileutl.h> /*}}}*/ +class edspListParserPrivate /*{{{*/ +{ +public: + FileFd extendedstates; + FileFd preferences; + + edspListParserPrivate() + { + std::string const states = _config->FindFile("Dir::State::extended_states"); + if (states != "/dev/null") + unlink(states.c_str()); + extendedstates.Open(states, FileFd::WriteOnly | FileFd::Create | FileFd::Exclusive, 0600); + std::string const prefs = _config->FindFile("Dir::Etc::preferences"); + if (prefs != "/dev/null") + unlink(prefs.c_str()); + preferences.Open(prefs, FileFd::WriteOnly | FileFd::Create | FileFd::Exclusive, 0600); + } +}; + /*}}}*/ // ListParser::edspListParser - Constructor /*{{{*/ -edspListParser::edspListParser(FileFd *File) : debListParser(File), d(NULL) -{} +edspListParser::edspListParser(FileFd *File) : debListParser(File), d(new edspListParserPrivate()) +{ +} /*}}}*/ // ListParser::NewVersion - Fill in the version structure /*{{{*/ bool edspListParser::NewVersion(pkgCache::VerIterator &Ver) @@ -81,6 +103,23 @@ bool edspListParser::ParseStatus(pkgCache::PkgIterator &Pkg, Pkg->CurrentVer = Ver.Index(); } + if (Section.FindB("APT-Automatic", false)) + { + std::string out; + strprintf(out, "Package: %s\nArchitecture: %s\nAuto-Installed: 1\n\n", Pkg.Name(), Pkg.Arch()); + if (d->extendedstates.Write(out.c_str(), out.length()) == false) + return false; + } + + signed short const pinvalue = Section.FindI("APT-Pin", 500); + if (pinvalue != 500) + { + std::string out; + strprintf(out, "Package: %s\nPin: version %s\nPin-Priority: %d\n\n", Pkg.FullName().c_str(), Ver.VerStr(), pinvalue); + if (d->preferences.Write(out.c_str(), out.length()) == false) + return false; + } + return true; } /*}}}*/ @@ -91,5 +130,8 @@ APT_CONST bool edspListParser::LoadReleaseInfo(pkgCache::RlsFileIterator & /*Fil return true; } /*}}}*/ - -edspListParser::~edspListParser() {} +edspListParser::~edspListParser() /*{{{*/ +{ + delete d; +} + /*}}}*/ diff --git a/apt-pkg/edsp/edsplistparser.h b/apt-pkg/edsp/edsplistparser.h index 221229302..25363e1c7 100644 --- a/apt-pkg/edsp/edsplistparser.h +++ b/apt-pkg/edsp/edsplistparser.h @@ -24,10 +24,11 @@ #endif class FileFd; +class edspListParserPrivate; class APT_HIDDEN edspListParser : public debListParser { - void * const d; + edspListParserPrivate * const d; public: virtual bool NewVersion(pkgCache::VerIterator &Ver) APT_OVERRIDE; virtual std::string Description(); diff --git a/apt-pkg/edsp/edspsystem.cc b/apt-pkg/edsp/edspsystem.cc index f577efcbd..c52d537f3 100644 --- a/apt-pkg/edsp/edspsystem.cc +++ b/apt-pkg/edsp/edspsystem.cc @@ -17,15 +17,55 @@ #include <apt-pkg/edspsystem.h> #include <apt-pkg/pkgcache.h> #include <apt-pkg/cacheiterators.h> +#include <apt-pkg/fileutl.h> #include <stddef.h> +#include <unistd.h> + #include <string> #include <vector> /*}}}*/ +class edspSystemPrivate { + std::string tempDir; + std::string tempStatesFile; + std::string tempPrefsFile; + +public: + edspSystemPrivate() {} + + void Initialize(Configuration &Cnf) + { + DeInitialize(); + Cnf.Set("Dir::State::extended_states", "/dev/null"); + Cnf.Set("Dir::Etc::preferences", "/dev/null"); + std::string const tmp = GetTempDir(); + char tmpname[100]; + snprintf(tmpname, sizeof(tmpname), "%s/apt-edsp-solver-XXXXXX", tmp.c_str()); + if (NULL == mkdtemp(tmpname)) + return; + 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); + } + + void DeInitialize() + { + if (tempDir.empty()) + return; + + unlink(tempStatesFile.c_str()); + unlink(tempPrefsFile.c_str()); + rmdir(tempDir.c_str()); + } + + ~edspSystemPrivate() { DeInitialize(); } +}; // System::edspSystem - Constructor /*{{{*/ -edspSystem::edspSystem() : pkgSystem("Debian APT solver interface", &debVS), d(NULL), StatusFile(NULL) +edspSystem::edspSystem() : pkgSystem("Debian APT solver interface", &debVS), d(new edspSystemPrivate()), StatusFile(NULL) { } /*}}}*/ @@ -33,6 +73,7 @@ edspSystem::edspSystem() : pkgSystem("Debian APT solver interface", &debVS), d(N edspSystem::~edspSystem() { delete StatusFile; + delete d; } /*}}}*/ // System::Lock - Get the lock /*{{{*/ @@ -59,7 +100,8 @@ pkgPackageManager *edspSystem::CreatePM(pkgDepCache * /*Cache*/) const // System::Initialize - Setup the configuration space.. /*{{{*/ bool edspSystem::Initialize(Configuration &Cnf) { - Cnf.Set("Dir::State::extended_states", "/dev/null"); + d->Initialize(Cnf); + Cnf.Set("Dir::Etc::preferencesparts", "/dev/null"); Cnf.Set("Dir::State::status","/dev/null"); Cnf.Set("Dir::State::lists","/dev/null"); diff --git a/apt-pkg/edsp/edspsystem.h b/apt-pkg/edsp/edspsystem.h index ec42bef75..aa4298f01 100644 --- a/apt-pkg/edsp/edspsystem.h +++ b/apt-pkg/edsp/edspsystem.h @@ -24,10 +24,11 @@ class pkgIndexFile; class pkgPackageManager; class edspIndex; +class edspSystemPrivate; class APT_HIDDEN edspSystem : public pkgSystem { /** \brief dpointer placeholder (for later in case we need it) */ - void * const d; + edspSystemPrivate * const d; edspIndex *StatusFile; |