diff options
-rw-r--r-- | apt-pkg/pkgcachegen.cc | 45 | ||||
-rwxr-xr-x | test/integration/test-apt-cache | 13 | ||||
-rwxr-xr-x | test/integration/test-specific-architecture-dependencies | 4 |
3 files changed, 41 insertions, 21 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; + } } } } diff --git a/test/integration/test-apt-cache b/test/integration/test-apt-cache index 48d623596..bff1667e8 100755 --- a/test/integration/test-apt-cache +++ b/test/integration/test-apt-cache @@ -120,9 +120,12 @@ bar Depends: bar Breaks: foo Replaces: foo + Breaks: <foo:i386> + Replaces: <foo:i386> <foobar> <cool> -<cooler>' aptcache depends foo --recurse --implicit +<cooler> +<foo:i386>' aptcache depends foo --recurse --implicit testsuccessequal 'foo Depends: bar bar @@ -132,7 +135,9 @@ testsuccessequal 'foo Depends: bar bar Depends: bar - Replaces: foo' aptcache depends foo --recurse --important --replaces --implicit + Replaces: foo + Replaces: <foo:i386> +<foo:i386>' aptcache depends foo --recurse --important --replaces --implicit testsuccessequal 'bar Depends: bar Breaks: foo @@ -140,7 +145,9 @@ testsuccessequal 'bar testsuccessequal 'bar Depends: bar Breaks: foo - Replaces: foo' aptcache depends bar --implicit + Replaces: foo + Breaks: <foo:i386> + Replaces: <foo:i386>' aptcache depends bar --implicit testsuccessequal 'specific Depends: <bar:i386> diff --git a/test/integration/test-specific-architecture-dependencies b/test/integration/test-specific-architecture-dependencies index 746ecb351..959555619 100755 --- a/test/integration/test-specific-architecture-dependencies +++ b/test/integration/test-specific-architecture-dependencies @@ -108,12 +108,12 @@ Conf depender-x64:i386 (1 unstable [i386])' aptget install depender-x64:i386 -s testequal 'Reading package lists... Building dependency tree... The following packages will be REMOVED: - libold libold:i386 + libold:i386 libold The following NEW packages will be installed: breaker 0 upgraded, 1 newly installed, 2 to remove and 0 not upgraded. -Remv libold [1] Remv libold:i386 [1] +Remv libold [1] Inst breaker (1 unstable [all]) Conf breaker (1 unstable [all])' aptget install breaker -s |