diff options
Diffstat (limited to 'apt-pkg/pkgcachegen.cc')
-rw-r--r-- | apt-pkg/pkgcachegen.cc | 45 |
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; + } } } } |