summaryrefslogtreecommitdiff
path: root/apt-pkg/pkgcachegen.cc
diff options
context:
space:
mode:
authorJulian Andres Klode <jak@debian.org>2025-10-25 18:42:24 +0000
committerJulian Andres Klode <jak@debian.org>2025-10-25 18:42:24 +0000
commit2698c1e186accebefa320ebacde7ec3c40c66c29 (patch)
tree100d5321f364b389100928e927639e852c52ff48 /apt-pkg/pkgcachegen.cc
parenta92a5ecc465055027d9fbb899f359ec7eab110bd (diff)
parent9d62eef571ffd1fd2df8b97884d3689fced27fb1 (diff)
Merge branch 'variants-submit' into 'main'
Merge Architecture variants from Ubuntu See merge request apt-team/apt!526
Diffstat (limited to 'apt-pkg/pkgcachegen.cc')
-rw-r--r--apt-pkg/pkgcachegen.cc29
1 files changed, 28 insertions, 1 deletions
diff --git a/apt-pkg/pkgcachegen.cc b/apt-pkg/pkgcachegen.cc
index 3358441ee..f3c3c10a0 100644
--- a/apt-pkg/pkgcachegen.cc
+++ b/apt-pkg/pkgcachegen.cc
@@ -104,12 +104,23 @@ bool pkgCacheGenerator::Start()
map_stringitem_t idxArchitectures;
std::vector<std::string> archs = APT::Configuration::getArchitectures();
- if (archs.size() > 1)
+ auto const &variants = APT::Configuration::getArchitectureVariants(true);
+ if (archs.size() > 1 || not variants.empty())
{
std::vector<std::string>::const_iterator a = archs.begin();
std::string list = *a;
for (++a; a != archs.end(); ++a)
list.append(",").append(*a);
+ if (not variants.empty())
+ {
+ list.append(";");
+ for (auto const &variant : variants)
+ {
+ if (list.back() != ';')
+ list.append(",");
+ list.append(variant.name);
+ }
+ }
idxArchitectures = WriteStringInMap(list);
if (unlikely(idxArchitectures == 0))
return false;
@@ -383,11 +394,20 @@ bool pkgCacheGenerator::MergeListVersion(ListParser &List, pkgCache::PkgIterator
auto Hash = List.VersionHash();
std::string_view ListSHA256;
+ std::string_view ListArchVariant;
bool const Debug = _config->FindB("Debug::pkgCacheGen", false);
auto DebList = dynamic_cast<debListParser *>(&List);
if (DebList != nullptr)
ListSHA256 = DebList->SHA256();
+ if (DebList != nullptr)
+ ListArchVariant = DebList->ArchVariant();
+
+ auto variants = _config->FindVector("APT::Architecture-Variants");
+ // Always add "no variant" at the back of the list. If it's already configured earlier, that wins
+ if (variants.empty() || variants.back() != "")
+ variants.push_back("");
+
if (Ver.end() == false)
{
/* We know the list is sorted so we use that fact in the search.
@@ -426,6 +446,13 @@ bool pkgCacheGenerator::MergeListVersion(ListParser &List, pkgCache::PkgIterator
if (VF.end() == true)
break;
}
+
+ // Variants are ordered by their index in the variant list.
+ if (std::find(variants.begin(), variants.end(), Ver.ArchVariant()) > std::find(variants.begin(), variants.end(), ListArchVariant))
+ {
+ Res = 1;
+ break;
+ }
}
// proceed with the next till we have either the right
// or we found another version (which will be lower)