summaryrefslogtreecommitdiff
path: root/apt-pkg/pkgcachegen.cc
diff options
context:
space:
mode:
Diffstat (limited to 'apt-pkg/pkgcachegen.cc')
-rw-r--r--apt-pkg/pkgcachegen.cc45
1 files changed, 29 insertions, 16 deletions
diff --git a/apt-pkg/pkgcachegen.cc b/apt-pkg/pkgcachegen.cc
index 55d1ee89d..6e307fba9 100644
--- a/apt-pkg/pkgcachegen.cc
+++ b/apt-pkg/pkgcachegen.cc
@@ -660,31 +660,44 @@ bool pkgCacheGenerator::NewPackage(pkgCache::PkgIterator &Pkg, StringView Name,
if (Arch == "any")
{
size_t const found = Name.find(':');
- StringView const NameA = Name.substr(0, found);
StringView ArchA = Name.substr(found + 1);
- pkgCache::PkgIterator PkgA = Cache.FindPkg(NameA, ArchA);
- if (PkgA.end() == false)
+ if (ArchA != "any")
{
// ArchA is used inside the loop which might remap (NameA is not used)
Dynamic<StringView> DynArchA(ArchA);
+ StringView NameA = Name.substr(0, found);
+ pkgCache::PkgIterator PkgA = Cache.FindPkg(NameA, ArchA);
Dynamic<pkgCache::PkgIterator> DynPkgA(PkgA);
- pkgCache::PrvIterator Prv = PkgA.ProvidesList();
- for (; Prv.end() == false; ++Prv)
+ if (PkgA.end())
{
- if (Prv.IsMultiArchImplicit())
- continue;
- pkgCache::VerIterator V = Prv.OwnerVer();
- if (ArchA != V.ParentPkg().Arch())
- continue;
- if (NewProvides(V, Pkg, V->VerStr, pkgCache::Flag::MultiArchImplicit | pkgCache::Flag::ArchSpecific) == false)
+ Dynamic<StringView> DynNameA(NameA);
+ if (NewPackage(PkgA, NameA, ArchA) == false)
return false;
}
- pkgCache::VerIterator V = PkgA.VersionList();
- Dynamic<pkgCache::VerIterator> DynV(V);
- for (; V.end() == false; ++V)
+ if (unlikely(PkgA.end()))
+ return _error->Fatal("NewPackage was successful for %s:%s,"
+ "but the package doesn't exist anyhow!",
+ NameA.to_string().c_str(), ArchA.to_string().c_str());
+ else
{
- if (NewProvides(V, Pkg, V->VerStr, pkgCache::Flag::MultiArchImplicit | pkgCache::Flag::ArchSpecific) == false)
- return false;
+ pkgCache::PrvIterator Prv = PkgA.ProvidesList();
+ for (; Prv.end() == false; ++Prv)
+ {
+ if (Prv.IsMultiArchImplicit())
+ continue;
+ pkgCache::VerIterator V = Prv.OwnerVer();
+ if (ArchA != V.ParentPkg().Arch())
+ continue;
+ if (NewProvides(V, Pkg, V->VerStr, pkgCache::Flag::MultiArchImplicit | pkgCache::Flag::ArchSpecific) == false)
+ return false;
+ }
+ pkgCache::VerIterator V = PkgA.VersionList();
+ Dynamic<pkgCache::VerIterator> DynV(V);
+ for (; V.end() == false; ++V)
+ {
+ if (NewProvides(V, Pkg, V->VerStr, pkgCache::Flag::MultiArchImplicit | pkgCache::Flag::ArchSpecific) == false)
+ return false;
+ }
}
}
}