The modification to orderlist.cc is from a patch DonKult (David) gave me, The modific...
authorChristopher Baines <cbaines8@gmail.com>
Sat, 2 Jul 2011 14:33:25 +0000 (15:33 +0100)
committerChristopher Baines <cbaines8@gmail.com>
Sat, 2 Jul 2011 14:33:25 +0000 (15:33 +0100)
apt-pkg/orderlist.cc
apt-pkg/packagemanager.cc

index ba43bc7..6dd4940 100644 (file)
@@ -1073,6 +1073,12 @@ bool pkgOrderList::CheckDep(DepIterator D)
          just needs one */
       if (D.IsNegative() == false)
       {
+        // ignore provides by older versions of this package
+        if (((D.Reverse() == false && Pkg == D.ParentPkg()) ||
+             (D.Reverse() == true && Pkg == D.TargetPkg())) &&
+            Cache[Pkg].InstallVer != *I)
+           continue;
+      
         /* Try to find something that does not have the after flag set
            if at all possible */
         if (IsFlag(Pkg,After) == true)
index f49df83..2219f87 100644 (file)
@@ -575,6 +575,9 @@ bool pkgPackageManager::SmartUnPack(PkgIterator Pkg)
 }
 bool pkgPackageManager::SmartUnPack(PkgIterator Pkg, bool const Immediate)
 {
+   if (Debug == true)
+      clog << "SmartUnPack " << Pkg.Name() << endl;
+
    // Check if it is already unpacked
    if (Pkg.State() == pkgCache::PkgIterator::NeedsConfigure &&
        Cache[Pkg].Keep() == true)
@@ -674,6 +677,20 @@ bool pkgPackageManager::SmartUnPack(PkgIterator Pkg, bool const Immediate)
            }
         }
       }
+      
+      // Check for breaks
+      if (End->Type == pkgCache::Dep::DpkgBreaks) {
+         SPtrArray<Version *> VList = End.AllTargets();
+        for (Version **I = VList; *I != 0; I++)
+        {
+           VerIterator Ver(Cache,*I);
+           PkgIterator Pkg = Ver.ParentPkg();
+           // Found a break, so unpack the package
+           if (List->IsNow(Pkg)) {
+             SmartUnPack(Pkg, false);
+           }
+        }
+      }
    }
 
    // Check for reverse conflicts.