summaryrefslogtreecommitdiff
path: root/apt-pkg/deb/debmetaindex.cc
diff options
context:
space:
mode:
authorDavid Kalnischkies <david@kalnischkies.de>2021-09-04 16:10:50 +0200
committerDavid Kalnischkies <david@kalnischkies.de>2021-09-04 16:20:12 +0200
commit70c669e2566d119559d2986635bb6c1d0d368073 (patch)
tree1584687e9bac78ae75bac737acb1b67a83bcdc79 /apt-pkg/deb/debmetaindex.cc
parent79a675ddf3320bf640d130e592c86fefd1a460e1 (diff)
Streamline access to barbarian architecture functionality
APT is not the place this information should be stored at, but it is a good place to experiment and see what will be (not) needed in the future for a proper implementation higher up the stack. This is why "BarbarianArchitectures" is chosen instead of a more neutral and/or sensible "VeryForeign" and isn't readily exported in the API to other clients for this PoC as a to be drawn up standard will likely require potentially incompatible changes. Having a then outdated and slightly different implementation block a "good" name would be bad. The functionality itself mostly exists (ignoring bugs) since the introduction of MultiArch as we always had the risk of encountering packages of architectures not known to dpkg (forced onto the system, potentially before MultiArch) we had to deal with somehow and other edge cases. All this commit really does is allowing what could previously only be achieved with editing sources.list and some conf options via a single config option: -o APT::BarbarianArchitectures=foo,bar
Diffstat (limited to 'apt-pkg/deb/debmetaindex.cc')
-rw-r--r--apt-pkg/deb/debmetaindex.cc20
1 files changed, 15 insertions, 5 deletions
diff --git a/apt-pkg/deb/debmetaindex.cc b/apt-pkg/deb/debmetaindex.cc
index f24a5e79e..d78cea758 100644
--- a/apt-pkg/deb/debmetaindex.cc
+++ b/apt-pkg/deb/debmetaindex.cc
@@ -18,6 +18,7 @@
#include <algorithm>
#include <map>
+#include <optional>
#include <sstream>
#include <string>
#include <utility>
@@ -966,13 +967,13 @@ pkgCache::RlsFileIterator debReleaseIndex::FindInCache(pkgCache &Cache, bool con
class APT_HIDDEN debSLTypeDebian : public pkgSourceList::Type /*{{{*/
{
- static std::vector<std::string> getDefaultSetOf(std::string const &Name,
- std::map<std::string, std::string> const &Options, std::vector<std::string> const &defaultValues)
+ static std::optional<std::vector<std::string>> getDefaultSetOf(std::string const &Name,
+ std::map<std::string, std::string> const &Options)
{
auto const val = Options.find(Name);
if (val != Options.end())
return VectorizeString(val->second, ',');
- return defaultValues;
+ return {};
}
static std::vector<std::string> applyPlusMinusOptions(std::string const &Name,
std::map<std::string, std::string> const &Options, std::vector<std::string> &&Values)
@@ -997,12 +998,21 @@ class APT_HIDDEN debSLTypeDebian : public pkgSourceList::Type /*{{{*/
static std::vector<std::string> parsePlusMinusOptions(std::string const &Name,
std::map<std::string, std::string> const &Options, std::vector<std::string> const &defaultValues)
{
- return applyPlusMinusOptions(Name, Options, getDefaultSetOf(Name, Options, defaultValues));
+ return applyPlusMinusOptions(Name, Options, getDefaultSetOf(Name, Options).value_or(defaultValues));
}
static std::vector<std::string> parsePlusMinusArchOptions(std::string const &Name,
std::map<std::string, std::string> const &Options)
{
- auto Values = getDefaultSetOf(Name, Options, APT::Configuration::getArchitectures());
+ std::vector<std::string> Values;
+ if (auto opt = getDefaultSetOf(Name, Options); opt.has_value())
+ Values = opt.value();
+ else
+ {
+ Values = APT::Configuration::getArchitectures();
+ auto veryforeign = _config->FindVector("APT::BarbarianArchitectures");
+ Values.reserve(Values.size() + veryforeign.size());
+ std::move(veryforeign.begin(), veryforeign.end(), std::back_inserter(Values));
+ }
// all is a very special architecture users shouldn't be concerned with explicitly
// but if the user does, do not override the choice
auto const val = Options.find(Name + "-");