123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187 |
- // -*- mode: cpp; mode: fold -*-
- // Description /*{{{*/
- /* ######################################################################
- Package Cache Generator - Generator for the cache structure.
- This builds the cache structure from the abstract package list parser.
- ##################################################################### */
- /*}}}*/
- // 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>
- #include <apt-pkg/pkgsystem.h>
- #include <apt-pkg/string_view.h>
- #include <array>
- /*}}}*/
- // ListParser::edspListParser - Constructor /*{{{*/
- edspLikeListParser::edspLikeListParser(FileFd * const File) : debListParser(File)
- {
- }
- edspListParser::edspListParser(FileFd * const File) : edspLikeListParser(File)
- {
- std::string const states = _config->FindFile("Dir::State::extended_states");
- RemoveFile("edspListParserPrivate", states);
- extendedstates.Open(states, FileFd::WriteOnly | FileFd::Create | FileFd::Exclusive, 0600);
- std::string const prefs = _config->FindFile("Dir::Etc::preferences");
- RemoveFile("edspListParserPrivate", prefs);
- preferences.Open(prefs, FileFd::WriteOnly | FileFd::Create | FileFd::Exclusive, 0600);
- }
- /*}}}*/
- // ListParser::NewVersion - Fill in the version structure /*{{{*/
- bool edspLikeListParser::NewVersion(pkgCache::VerIterator &Ver)
- {
- _system->SetVersionMapping(Ver->ID, Section.FindI("APT-ID", Ver->ID));
- return debListParser::NewVersion(Ver);
- }
- /*}}}*/
- // ListParser::Description - Return the description string /*{{{*/
- // ---------------------------------------------------------------------
- /* Sorry, no description for the resolvers… */
- std::vector<std::string> edspLikeListParser::AvailableDescriptionLanguages()
- {
- return {};
- }
- APT::StringView edspLikeListParser::Description_md5()
- {
- return APT::StringView();
- }
- /*}}}*/
- // ListParser::VersionHash - Compute a unique hash for this version /*{{{*/
- unsigned short edspLikeListParser::VersionHash()
- {
- if (Section.Exists("APT-Hash") == true)
- return Section.FindI("APT-Hash");
- else if (Section.Exists("APT-ID") == true)
- return Section.FindI("APT-ID");
- return 0;
- }
- /*}}}*/
- // ListParser::LoadReleaseInfo - Load the release information /*{{{*/
- APT_CONST bool edspLikeListParser::LoadReleaseInfo(pkgCache::RlsFileIterator & /*FileI*/,
- FileFd & /*File*/, std::string const &/*component*/)
- {
- return true;
- }
- /*}}}*/
- // ListParser::ParseStatus - Parse the status field /*{{{*/
- // ---------------------------------------------------------------------
- /* The Status: line here is not a normal dpkg one but just one which tells
- use if the package is installed or not, where missing means not. */
- bool edspListParser::ParseStatus(pkgCache::PkgIterator &Pkg,
- pkgCache::VerIterator &Ver)
- {
- unsigned long state = 0;
- if (Section.FindFlag("Hold",state,pkgCache::State::Hold) == false)
- return false;
- if (state != 0)
- Pkg->SelectedState = pkgCache::State::Hold;
- state = 0;
- if (Section.FindFlag("Installed",state,pkgCache::State::Installed) == false)
- return false;
- if (state != 0)
- {
- Pkg->CurrentState = pkgCache::State::Installed;
- 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 (extendedstates.Write(out.c_str(), out.length()) == false)
- return false;
- }
- // FIXME: Using an overriding pin is wrong.
- if (Section.FindB("APT-Candidate", false))
- {
- std::string out;
- strprintf(out, "Package: %s\nPin: version %s\nPin-Priority: 9999\n\n", Pkg.FullName().c_str(), Ver.VerStr());
- if (preferences.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 (preferences.Write(out.c_str(), out.length()) == false)
- return false;
- }
- return true;
- }
- /*}}}*/
- // ListParser::eippListParser - Constructor /*{{{*/
- eippListParser::eippListParser(FileFd *File) : edspLikeListParser(File)
- {
- }
- /*}}}*/
- // ListParser::ParseStatus - Parse the status field /*{{{*/
- // ---------------------------------------------------------------------
- /* The Status: line here is not a normal dpkg one but just one which tells
- use if the package is installed or not, where missing means not. */
- bool eippListParser::ParseStatus(pkgCache::PkgIterator &Pkg,
- pkgCache::VerIterator &Ver)
- {
- // Process the flag field
- static std::array<WordList, 8> const statusvalues = {{
- {"not-installed",pkgCache::State::NotInstalled},
- {"config-files",pkgCache::State::ConfigFiles},
- {"half-installed",pkgCache::State::HalfInstalled},
- {"unpacked",pkgCache::State::UnPacked},
- {"half-configured",pkgCache::State::HalfConfigured},
- {"triggers-awaited",pkgCache::State::TriggersAwaited},
- {"triggers-pending",pkgCache::State::TriggersPending},
- {"installed",pkgCache::State::Installed},
- }};
- auto const status = Section.Find("Status");
- if (status.empty() == false)
- {
- for (auto && sv: statusvalues)
- {
- if (status != sv.Str)
- continue;
- Pkg->CurrentState = sv.Val;
- switch (Pkg->CurrentState)
- {
- case pkgCache::State::NotInstalled:
- case pkgCache::State::ConfigFiles:
- break;
- case pkgCache::State::HalfInstalled:
- case pkgCache::State::UnPacked:
- case pkgCache::State::HalfConfigured:
- case pkgCache::State::TriggersAwaited:
- case pkgCache::State::TriggersPending:
- case pkgCache::State::Installed:
- Pkg->CurrentVer = Ver.Index();
- break;
- }
- break;
- }
- }
- return true;
- }
- /*}}}*/
- edspLikeListParser::~edspLikeListParser() {}
- edspListParser::~edspListParser() {}
- eippListParser::~eippListParser() {}
|