]> err.no Git - dpkg/commitdiff
Correct broken dselect logic for self-conflicting packages
authorIan Jackson <ian@davenant.greenend.org.uk>
Thu, 1 Nov 2007 19:57:26 +0000 (19:57 +0000)
committerGuillem Jover <guillem@debian.org>
Sun, 9 Mar 2008 06:39:35 +0000 (08:39 +0200)
The previous code seems to have had some confusion over the precedence
of '&&' vs ':'. The new rule is that a Conflicts is violated if the
target package is installed or to be error-preserved ie
would_like_to_install() != 0 - except that we disregard packages which
directly Conflict with themselves.

ChangeLog
debian/changelog
dselect/pkgdepcon.cc

index 680d44d8c39dcc272593fb214e0177eed03b610c..927e2e6ec7d0fc1f37c23957c6a9cb60fbfb9ca6 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2008-03-09  Ian Jackson  <ian@davenant.greenend.org.uk>
+
+       * dselect/pkgdepcon.cc (packagelist::deppossatisfied): The new rule
+       is that a Conflicts is violated if the target package is installed
+       or to be error-preserved ie would_like_to_install() != 0 - except
+       that we disregard packages which directly Conflict with themselves.
+
 2008-03-07  Raphael Hertzog  <hertzog@debian.org>
 
        * scripts/Dpkg/Fields.pm: Import Dpkg::Gettext since we use _g().
index e0d2a093292c82eaf46d1d6fdba038335b435824..49262d24618bc332037fde475553cb5be11eeaa8 100644 (file)
@@ -19,6 +19,8 @@ dpkg (1.14.17) UNRELEASED; urgency=low
     package when debsig-verify is installed. Closes: #311843
   * Fix some small memory leaks. Closes: #469520
     Thanks to Sean Finney.
+  * Correct broken dselect logic for self-conflicting packages.
+    Thanks to Ian Jackson.
 
   [ Raphael Hertzog ]
   * Add a warning displayed by dpkg-genchanges if the current version is
index 70e6bda77f62f1febdac2089e1bfbca5b20e4c38..72232bd8c6c8dfee691c2fb922266503acf661d1 100644 (file)
@@ -353,6 +353,8 @@ int packagelist::resolvedepcon(dependency *depends) {
 }
 
 int packagelist::deppossatisfied(deppossi *possi, perpackagestate **fixbyupgrade) {
+  // `satisfied' here for Conflicts and Breaks means that the
+  //  restriction is violated ie that the target package is wanted
   int would;
   pkginfo::pkgwant want= pkginfo::want_purge;
   
@@ -363,8 +365,9 @@ int packagelist::deppossatisfied(deppossi *possi, perpackagestate **fixbyupgrade
     would= 0;
   }
   
-  if (!(possi->up->type == dep_conflicts && possi->up->up == possi->ed) &&
-      possi->up->type == dep_conflicts ? (would != 0) : (would > 0)) {
+  if (possi->up->type == dep_conflicts
+      ? possi->up->up != possi->ed && would != 0
+      : would > 0) {
     // If it's to be installed or left installed, then either it's of
     // the right version, and therefore OK, or a version must have
     // been specified, in which case we don't need to look at the rest