summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Kalnischkies <kalnischkies@gmail.com>2011-08-24 00:41:30 +0200
committerDavid Kalnischkies <kalnischkies@gmail.com>2011-08-24 00:41:30 +0200
commit05b64a6f78e3bf39142808a3dae41a2c4618f6b0 (patch)
tree6bbbd9c9f5db6dd1c91fbd805ee8a81324f7766f
parent3b8d17737d840f48a60f1d4d1af3c285047ad61e (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.cc50
-rw-r--r--debian/changelog6
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