diff options
author | David Kalnischkies <kalnischkies@gmail.com> | 2011-08-24 00:41:30 +0200 |
---|---|---|
committer | David Kalnischkies <kalnischkies@gmail.com> | 2011-08-24 00:41:30 +0200 |
commit | 05b64a6f78e3bf39142808a3dae41a2c4618f6b0 (patch) | |
tree | 6bbbd9c9f5db6dd1c91fbd805ee8a81324f7766f | |
parent | 3b8d17737d840f48a60f1d4d1af3c285047ad61e (diff) |
* apt-pkg/orderlist.cc:
- prefer visiting packages marked for deletion in VisitProvides
if we are operating on a negative dependency so that we can
deal early with the fallout of this remove
-rw-r--r-- | apt-pkg/orderlist.cc | 50 | ||||
-rw-r--r-- | debian/changelog | 6 |
2 files changed, 48 insertions, 8 deletions
diff --git a/apt-pkg/orderlist.cc b/apt-pkg/orderlist.cc index 2fc0b6927..cae5b0a48 100644 --- a/apt-pkg/orderlist.cc +++ b/apt-pkg/orderlist.cc @@ -495,33 +495,69 @@ bool pkgOrderList::VisitRProvides(DepFunc F,VerIterator Ver) /*}}}*/ // OrderList::VisitProvides - Visit all of the providing packages /*{{{*/ // --------------------------------------------------------------------- -/* This routine calls visit on all providing packages. */ +/* This routine calls visit on all providing packages. + + If the dependency is negative it first visits packages which are + intended to be removed and after that all other packages. + It does so to avoid situations in which this package is used to + satisfy a (or-group/provides) dependency of another package which + could have been satisfied also by upgrading another package - + otherwise we have more broken packages dpkg needs to auto- + deconfigure and in very complicated situations it even decides + against it! */ bool pkgOrderList::VisitProvides(DepIterator D,bool Critical) -{ +{ SPtrArray<Version *> List = D.AllTargets(); - for (Version **I = List; *I != 0; I++) + for (Version **I = List; *I != 0; ++I) { VerIterator Ver(Cache,*I); PkgIterator Pkg = Ver.ParentPkg(); + if (D.IsNegative() == true && Cache[Pkg].Delete() == false) + continue; + if (Cache[Pkg].Keep() == true && Pkg.State() == PkgIterator::NeedsNothing) continue; - + if (D.IsNegative() == false && Cache[Pkg].InstallVer != *I) continue; - + if (D.IsNegative() == true && (Version *)Pkg.CurrentVer() != *I) continue; - + + // Skip over missing files + if (Critical == false && IsMissing(D.ParentPkg()) == true) + continue; + + if (VisitNode(Pkg, "Provides-1") == false) + return false; + } + if (D.IsNegative() == false) + return true; + for (Version **I = List; *I != 0; ++I) + { + VerIterator Ver(Cache,*I); + PkgIterator Pkg = Ver.ParentPkg(); + + if (Cache[Pkg].Delete() == true) + continue; + + if (Cache[Pkg].Keep() == true && Pkg.State() == PkgIterator::NeedsNothing) + continue; + + if ((Version *)Pkg.CurrentVer() != *I) + continue; + // Skip over missing files if (Critical == false && IsMissing(D.ParentPkg()) == true) continue; - if (VisitNode(Pkg, "Provides") == false) + if (VisitNode(Pkg, "Provides-2") == false) return false; } + return true; } /*}}}*/ diff --git a/debian/changelog b/debian/changelog index 0311979af..44ad1dfcf 100644 --- a/debian/changelog +++ b/debian/changelog @@ -24,8 +24,12 @@ apt (0.8.15.7) UNRELEASED; urgency=low * cmdline/apt-key: - if command is 'add' do not error out if the specified keyring doesn't exist, it will be created by gpg + * apt-pkg/orderlist.cc: + - prefer visiting packages marked for deletion in VisitProvides + if we are operating on a negative dependency so that we can + deal early with the fallout of this remove - -- David Kalnischkies <kalnischkies@gmail.com> Tue, 23 Aug 2011 11:19:47 +0200 + -- David Kalnischkies <kalnischkies@gmail.com> Wed, 24 Aug 2011 00:41:18 +0200 apt (0.8.15.6) unstable; urgency=low |