From d9f6c79566a94cf4da20d55edececcaa11ffaa1b Mon Sep 17 00:00:00 2001
From: David Kalnischkies <kalnischkies@gmail.com>
Date: Mon, 31 Oct 2011 14:36:05 -0500
Subject: [PATCH] do not enter an endless loop for (essential) pre-dependency
 loops

---
 apt-pkg/packagemanager.cc | 29 +++++++++++++++++------------
 debian/changelog          |  3 ++-
 2 files changed, 19 insertions(+), 13 deletions(-)

diff --git a/apt-pkg/packagemanager.cc b/apt-pkg/packagemanager.cc
index a97ce4833..4f9762701 100644
--- a/apt-pkg/packagemanager.cc
+++ b/apt-pkg/packagemanager.cc
@@ -404,22 +404,27 @@ bool pkgPackageManager::SmartConfigure(PkgIterator Pkg, int const Depth)
 	 
 	 /* If the dependany is still not satisfied, try, if possible, unpacking a package to satisfy it */
 	 if (InstallVer != 0 && Bad) {
-	    Bad = false;
-	    if (List->IsNow(DepPkg) && !List->IsFlag(DepPkg,pkgOrderList::Loop)) {
-	       List->Flag(Pkg,pkgOrderList::Loop);
-	       if (Debug) 
-	          cout << OutputInDepth(Depth) << "Unpacking " << DepPkg.Name() << " to avoid loop" << endl;
-	       SmartUnPack(DepPkg, true, Depth + 1);
-	       List->RmFlag(Pkg,pkgOrderList::Loop);
+	    if (List->IsNow(DepPkg)) {
+	       Bad = false;
+	       if (List->IsFlag(Pkg,pkgOrderList::Loop))
+	       {
+		  if (Debug)
+		     std::clog << OutputInDepth(Depth) << "Package " << Pkg << " loops in SmartConfigure" << std::endl;
+	       }
+	       else
+	       {
+		  List->Flag(Pkg,pkgOrderList::Loop);
+		  if (Debug)
+		     cout << OutputInDepth(Depth) << "Unpacking " << DepPkg.Name() << " to avoid loop" << endl;
+		  SmartUnPack(DepPkg, true, Depth + 1);
+		  List->RmFlag(Pkg,pkgOrderList::Loop);
+	       }
 	    }
 	 }
 	 
 	 if (Start==End) {
-	    if (Bad && Debug) {
-	       if (!List->IsFlag(DepPkg,pkgOrderList::Loop)) {
-                  _error->Warning("Could not satisfy dependancies for %s",Pkg.Name());
-               } 
-	    }
+	    if (Bad && Debug && List->IsFlag(DepPkg,pkgOrderList::Loop) == false)
+		  std::clog << OutputInDepth(Depth) << "Could not satisfy dependancies for " << Pkg.Name() << std::endl;
 	    break;
 	 } else {
             Start++;
diff --git a/debian/changelog b/debian/changelog
index 03e5116a6..bb26800fe 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -4,10 +4,11 @@ apt (0.8.16~exp8) experimental; urgency=low
   * apt-pkg/packagemanager.cc:
     - do not fail on unpacked packages in SmartUnPack, just don't
       shedule them for unpack, but do all checks and configure them
+    - do not enter an endless loop for (essential) pre-dependency loops
   * apt-pkg/contrib/sha2_internal.cc:
     - use a pointer-union to peace gcc strict-aliasing warning
 
- -- David Kalnischkies <kalnischkies@gmail.com>  Sun, 30 Oct 2011 14:15:53 -0500
+ -- David Kalnischkies <kalnischkies@gmail.com>  Mon, 31 Oct 2011 14:34:48 -0500
 
 apt (0.8.16~exp7) experimental; urgency=low
 
-- 
2.47.2