From 88a52816d7626326f94c17a3a8fcde08817b7f2b Mon Sep 17 00:00:00 2001
From: David Kalnischkies <kalnischkies@gmail.com>
Date: Wed, 11 Jan 2012 18:05:15 +0100
Subject: [PATCH] * apt-pkg/depcache.cc:   - implicit conflicts (for multiarch)
 are supposed to conflict     only with real packages, not with virtual
 providers

---
 apt-pkg/depcache.cc                           | 16 +++++---
 debian/changelog                              |  9 +++++
 .../test-implicit-conflicts-real-not-virtual  | 40 +++++++++++++++++++
 3 files changed, 60 insertions(+), 5 deletions(-)
 create mode 100755 test/integration/test-implicit-conflicts-real-not-virtual

diff --git a/apt-pkg/depcache.cc b/apt-pkg/depcache.cc
index 031fca5c0..3c6dc4325 100644
--- a/apt-pkg/depcache.cc
+++ b/apt-pkg/depcache.cc
@@ -374,11 +374,17 @@ bool pkgDepCache::CheckDep(DepIterator Dep,int Type,PkgIterator &Res)
    PkgIterator Pkg = Dep.ParentPkg();
    for (; P.end() != true; ++P)
    {
-      /* Provides may never be applied against the same package (or group)
-         if it is a conflicts. See the comment above. */
-      if (P.OwnerPkg()->Group == Pkg->Group && Dep.IsNegative() == true)
-	 continue;
-      
+      if (Dep.IsNegative() == true)
+      {
+	 /* Provides may never be applied against the same package (or group)
+	    if it is a conflicts. See the comment above. */
+	 if (P.OwnerPkg()->Group == Pkg->Group)
+	    continue;
+	 // Implicit group-conflicts should not be applied on providers of other groups
+	 if (Pkg->Group == Dep.TargetPkg()->Group && P.OwnerPkg()->Group != Pkg->Group)
+	    continue;
+      }
+
       // Check if the provides is a hit
       if (Type == NowVersion)
       {
diff --git a/debian/changelog b/debian/changelog
index a1b93a981..83704caeb 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,12 @@
+apt (0.8.16~exp10) UNRELEASED; urgency=low
+
+  [ David Kalnischkies ]
+  * apt-pkg/depcache.cc:
+    - implicit conflicts (for multiarch) are supposed to conflict
+      only with real packages, not with virtual providers
+
+ -- David Kalnischkies <kalnischkies@gmail.com>  Wed, 11 Jan 2012 17:59:33 +0100
+
 apt (0.8.16~exp9) experimental; urgency=low
 
   [ Julian Andres Klode ]
diff --git a/test/integration/test-implicit-conflicts-real-not-virtual b/test/integration/test-implicit-conflicts-real-not-virtual
new file mode 100755
index 000000000..9d13e1709
--- /dev/null
+++ b/test/integration/test-implicit-conflicts-real-not-virtual
@@ -0,0 +1,40 @@
+#!/bin/sh
+set -e
+
+TESTDIR=$(readlink -f $(dirname $0))
+. $TESTDIR/framework
+setupenvironment
+configarchitecture 'amd64' 'i386'
+
+insertpackage 'unstable-mp' 'crda' 'i386,amd64' '1.1.1-1ubuntu4mp' 'Provides: wireless-crda
+Multi-Arch: foreign'
+insertpackage 'unstable-m' 'crda' 'i386,amd64' '1.1.1-1ubuntu4m' 'Multi-Arch: foreign'
+insertpackage 'unstable-p' 'crda' 'i386,amd64' '1.1.1-1ubuntu4p' 'Provides: wireless-crda'
+
+insertinstalledpackage 'wireless-crda' 'amd64' '1.14'
+
+setupaptarchive
+
+testequal 'Reading package lists...
+Building dependency tree...
+The following NEW packages will be installed:
+  crda
+0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
+Inst crda (1.1.1-1ubuntu4m unstable-m [amd64])
+Conf crda (1.1.1-1ubuntu4m unstable-m [amd64])' aptget install crda -s -t unstable-m
+
+testequal 'Reading package lists...
+Building dependency tree...
+The following NEW packages will be installed:
+  crda
+0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
+Inst crda (1.1.1-1ubuntu4p unstable-p [amd64])
+Conf crda (1.1.1-1ubuntu4p unstable-p [amd64])' aptget install crda -s -t unstable-p
+
+testequal 'Reading package lists...
+Building dependency tree...
+The following NEW packages will be installed:
+  crda
+0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
+Inst crda (1.1.1-1ubuntu4mp unstable-mp [amd64])
+Conf crda (1.1.1-1ubuntu4mp unstable-mp [amd64])' aptget install crda -s -t unstable-mp
-- 
2.47.2