From: David Kalnischkies Date: Tue, 19 Jan 2016 23:09:36 +0000 (+0100) Subject: always create pkg at the time pkg:arch is created X-Git-Tag: 1.2.2~35 X-Git-Url: https://git.saurik.com/apt.git/commitdiff_plain/530302ef25d14bd7577f18cf98c2fa868c3c1dd3 always create pkg at the time pkg:arch is created To resolve dependencies like "pkg:arch" we create a package with the name "pkg:arch" and the architecture "any". We create these packages only if a dependency needs it as these kind of dependencies aren't that common. This commit ensured that in the even this architecture specific dependency is the only relation this package has we still create the underlying package to have them available in provides resolution. --- 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 DynArchA(ArchA); + StringView NameA = Name.substr(0, found); + pkgCache::PkgIterator PkgA = Cache.FindPkg(NameA, ArchA); Dynamic 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 DynNameA(NameA); + if (NewPackage(PkgA, NameA, ArchA) == false) return false; } - pkgCache::VerIterator V = PkgA.VersionList(); - Dynamic 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 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: + Replaces: -' aptcache depends foo --recurse --implicit + +' 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: +' 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: + Replaces: ' aptcache depends bar --implicit testsuccessequal 'specific Depends: 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