From 40795fca99c72b0b43124cdfffb40e8fa3c4d952 Mon Sep 17 00:00:00 2001 From: David Kalnischkies Date: Fri, 1 Apr 2011 13:21:38 +0200 Subject: [PATCH] parse also the action flags Upgrade, Dist-Upgrade and alike from the request --- apt-pkg/edsp.cc | 44 +++++++++++++++++++++++++++++++++++++------- apt-pkg/edsp.h | 10 ++++++---- 2 files changed, 43 insertions(+), 11 deletions(-) diff --git a/apt-pkg/edsp.cc b/apt-pkg/edsp.cc index 6f084ce04..d93b05411 100644 --- a/apt-pkg/edsp.cc +++ b/apt-pkg/edsp.cc @@ -166,10 +166,31 @@ bool EDSP::ReadLine(int const input, std::string &line) { return false; } /*}}}*/ +// EDSP::StringToBool - convert yes/no to bool /*{{{*/ +// --------------------------------------------------------------------- +/* we are not as lazy as we are in the global StringToBool as we really + only accept yes/no here - but we will ignore leading spaces */ +bool EDSP::StringToBool(char const *answer, bool const defValue) { + for (; isspace(*answer) != 0; ++answer); + if (strncasecmp(answer, "yes", 3) == 0) + return true; + else if (strncasecmp(answer, "no", 2) == 0) + return false; + else + _error->Warning("Value '%s' is not a boolean 'yes' or 'no'!", answer); + return defValue; +} + /*}}}*/ // EDSP::ReadRequest - first stanza from the given file descriptor /*{{{*/ bool EDSP::ReadRequest(int const input, std::list &install, - std::list &remove) + std::list &remove, bool &upgrade, + bool &distUpgrade, bool &autoRemove) { + install.clear(); + remove.clear(); + upgrade = false; + distUpgrade = false; + autoRemove = false; std::string line; while (ReadLine(input, line) == true) { @@ -177,7 +198,7 @@ bool EDSP::ReadRequest(int const input, std::list &install, if (line.empty() == true) continue; // The first Tag must be a request, so search for it - if (line.compare(0,8, "Request:") != 0) + if (line.compare(0, 8, "Request:") != 0) continue; while (ReadLine(input, line) == true) @@ -187,16 +208,25 @@ bool EDSP::ReadRequest(int const input, std::list &install, return true; std::list *request = NULL; - if (line.compare(0,8, "Install:") == 0) + if (line.compare(0, 8, "Install:") == 0) { - line.erase(0,8); + line.erase(0, 8); request = &install; } - if (line.compare(0,7, "Remove:") == 0) + else if (line.compare(0, 7, "Remove:") == 0) { - line.erase(0,7); + line.erase(0, 7); request = &remove; } + else if (line.compare(0, 8, "Upgrade:") == 0) + upgrade = EDSP::StringToBool(line.c_str() + 9, false); + else if (line.compare(0, 13, "Dist-Upgrade:") == 0) + distUpgrade = EDSP::StringToBool(line.c_str() + 14, false); + else if (line.compare(0, 11, "Autoremove:") == 0) + autoRemove = EDSP::StringToBool(line.c_str() + 12, false); + else + _error->Warning("Unknown line in EDSP Request stanza: %s", line.c_str()); + if (request == NULL) continue; size_t end = line.length(); @@ -204,7 +234,7 @@ bool EDSP::ReadRequest(int const input, std::list &install, size_t begin = line.rfind(' '); if (begin == std::string::npos) { - request->push_back(line.substr(0,end)); + request->push_back(line.substr(0, end)); break; } else if (begin < end) diff --git a/apt-pkg/edsp.h b/apt-pkg/edsp.h index 742d89b43..75733c2d2 100644 --- a/apt-pkg/edsp.h +++ b/apt-pkg/edsp.h @@ -14,18 +14,20 @@ class EDSP /*{{{*/ { bool static ReadLine(int const input, std::string &line); + bool static StringToBool(char const *answer, bool const defValue); public: bool static WriteRequest(pkgDepCache &Cache, FILE* output, - bool const Upgrade = false, - bool const DistUpgrade = false, - bool const AutoRemove = false); + bool const upgrade = false, + bool const distUpgrade = false, + bool const autoRemove = false); bool static WriteScenario(pkgDepCache &Cache, FILE* output); bool static ReadResponse(FILE* input, pkgDepCache &Cache); // ReadScenario is provided by the listparser infrastructure bool static ReadRequest(int const input, std::list &install, - std::list &remove); + std::list &remove, bool &upgrade, + bool &distUpgrade, bool &autoRemove); bool static ApplyRequest(std::list const &install, std::list const &remove, pkgDepCache &Cache); -- 2.45.2