Repository : ssh://darcs.haskell.org//srv/darcs/packages/Cabal

On branch  : master

http://hackage.haskell.org/trac/ghc/changeset/bf2f100596d7db413c9a3a3a15abeeee8954c340

>---------------------------------------------------------------

commit bf2f100596d7db413c9a3a3a15abeeee8954c340
Author: Andrea Vezzosi <[email protected]>
Date:   Thu Sep 25 18:14:41 2008 +0000

    Fix infinite loop in the TopDown dependency resolver
    The loop occurred only if a package depended on another one
    with the same name, e.g. base-3.0.3.0 <- base-4.0.0.0

>---------------------------------------------------------------

 .../Distribution/Client/Dependency/TopDown.hs      |   13 +++++++++----
 1 files changed, 9 insertions(+), 4 deletions(-)

diff --git a/cabal-install/Distribution/Client/Dependency/TopDown.hs 
b/cabal-install/Distribution/Client/Dependency/TopDown.hs
index cc781e9..160f3f9 100644
--- a/cabal-install/Distribution/Client/Dependency/TopDown.hs
+++ b/cabal-install/Distribution/Client/Dependency/TopDown.hs
@@ -352,7 +352,10 @@ selectNeededSubset installed available = select mempty 
mempty
         (next, remaining') = Set.deleteFindMin remaining
         moreInstalled = PackageIndex.lookupPackageName installed next
         moreAvailable = PackageIndex.lookupPackageName available next
-        moreRemaining = nub
+        moreRemaining = -- we filter out packages already included in the 
indexes
+                        -- this avoids an infinite loop if a package depends 
on itself
+                        -- like base-3.0.3.0 with base-4.0.0.0
+                        filter notAlreadyIncluded
                       $ [ packageName dep
                         | pkg <- moreInstalled
                         , dep <- depends pkg ]
@@ -360,9 +363,11 @@ selectNeededSubset installed available = select mempty 
mempty
                         | AvailablePackage _ pkg _ <- moreAvailable
                         , Dependency name _ <-
                             buildDepends (flattenPackageDescription pkg) ]
-        installed''   = foldr PackageIndex.insert installed' moreInstalled
-        available''   = foldr PackageIndex.insert available' moreAvailable
-        remaining''   = foldr          Set.insert remaining' moreRemaining
+        installed''   = foldl' (flip PackageIndex.insert) installed' 
moreInstalled
+        available''   = foldl' (flip PackageIndex.insert) available' 
moreAvailable
+        remaining''   = foldl' (flip         Set.insert) remaining' 
moreRemaining
+        notAlreadyIncluded name = null (PackageIndex.lookupPackageName 
installed' name)
+                                  && null (PackageIndex.lookupPackageName 
available' name)
 
 -- ------------------------------------------------------------
 -- * Post processing the solution



_______________________________________________
Cvs-libraries mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/cvs-libraries

Reply via email to