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

On branch  : master

http://hackage.haskell.org/trac/ghc/changeset/6a5c355600555c29d30ffb07c58b47c1bc82b238

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

commit 6a5c355600555c29d30ffb07c58b47c1bc82b238
Author: Duncan Coutts <[email protected]>
Date:   Fri May 30 17:03:06 2008 +0000

    Rearrange and tidy bits of the topdown resolver

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

 cabal-install/Hackage/Dependency/TopDown.hs |   49 ++++++++++++++++----------
 1 files changed, 30 insertions(+), 19 deletions(-)

diff --git a/cabal-install/Hackage/Dependency/TopDown.hs 
b/cabal-install/Hackage/Dependency/TopDown.hs
index 0deab70..e5517e8 100644
--- a/cabal-install/Hackage/Dependency/TopDown.hs
+++ b/cabal-install/Hackage/Dependency/TopDown.hs
@@ -115,17 +115,18 @@ searchSpace configure constraints selected next =
       Left missing -> Failure $ ConfigureFailed pkg
                         [ (dep, Constraints.conflicting constraints dep)
                         | dep <- missing ]
-      Right pkg' -> case constrainDeps pkg' (packageConstraints pkg') 
constraints of
-        Left failure       -> Failure failure
-        Right constraints' -> searchSpace configure constraints'' selected' 
next'
-          where
-            selected' = PackageIndex.insert pkg' selected
-            next'     = Set.delete name $ foldr Set.insert next new
-            new       = [ name'
+      Right pkg' ->
+        let selected' = PackageIndex.insert pkg' selected
+            newPkgs   = [ name'
                         | dep <- packageConstraints pkg'
                         , let (Dependency name' _) = untagDependency dep
                         , null (PackageIndex.lookupPackageName selected' 
name') ]
-            Satisfiable constraints'' = addPackageSelectConstraint (packageId 
pkg) constraints'
+            newDeps   = packageConstraints pkg'
+            next'     = Set.delete name $ foldr Set.insert next newPkgs
+         in case constrainDeps pkg' newDeps constraints of
+              Left failure       -> Failure failure
+              Right constraints' -> searchSpace configure
+                                      constraints' selected' next'
 
 packageConstraints :: SelectedPackage -> [TaggedDependency]
 packageConstraints = either installedConstraints availableConstraints
@@ -142,7 +143,10 @@ packageConstraints = either installedConstraints 
availableConstraints
 
 constrainDeps :: SelectedPackage -> [TaggedDependency] -> Constraints
               -> Either Failure Constraints
-constrainDeps _   []         cs = Right cs
+constrainDeps pkg []         cs =
+  case addPackageSelectConstraint (packageId pkg) cs of
+    Satisfiable cs' -> Right cs'
+    _               -> impossible
 constrainDeps pkg (dep:deps) cs =
   case addPackageDependencyConstraint (packageId pkg) dep cs of
     Satisfiable cs' -> constrainDeps pkg deps cs'
@@ -189,15 +193,8 @@ topDownResolver' os arch comp installed available deps =
 
   where
     --TODO add actual constraints using addTopLevelDependencyConstraint
-    constraints = Constraints.empty installed' available
-
-    installed' = PackageIndex.fromList
-                   [ InstalledPackage pkg (transitiveDepends pkg)
-                   | pkg <- PackageIndex.allPackages installed ]   
-    transitiveDepends :: InstalledPackageInfo -> [PackageIdentifier]
-    transitiveDepends = map toPkgid . tail . Graph.reachable graph
-                      . fromJust . toVertex . packageId
-    (graph, toPkgid, toVertex) = PackageIndex.dependencyGraph installed
+    constraints = Constraints.empty (annotateInstalledPackages installed)
+                                    available
 
     initialDeps     = [ dep  | UnresolvedDependency dep _ <- deps ]
     initialPkgNames = Set.fromList [ name | Dependency name _ <- initialDeps ]
@@ -215,6 +212,20 @@ configurePackage os arch comp available spkg = case spkg of
       Right (pkg, flags) -> Right $
         SemiConfiguredPackage apkg flags (buildDepends pkg)
 
+-- | Annotate each installed packages with its set of transative dependencies.
+--
+annotateInstalledPackages :: PackageIndex InstalledPackageInfo
+                          -> PackageIndex InstalledPackage
+annotateInstalledPackages installed =
+  PackageIndex.fromList
+    [ InstalledPackage pkg (transitiveDepends pkg)
+    | pkg <- PackageIndex.allPackages installed ]
+  where
+    transitiveDepends :: InstalledPackageInfo -> [PackageIdentifier]
+    transitiveDepends = map toPkgid . tail . Graph.reachable graph
+                      . fromJust . toVertex . packageId
+    (graph, toPkgid, toVertex) = PackageIndex.dependencyGraph installed
+
 finaliseSelectedPackages :: SelectedPackages
                          -> Constraints
                          -> [InstallPlan.PlanPackage a]
@@ -246,7 +257,7 @@ finaliseSelectedPackages selected constraints =
 -- ------------------------------------------------------------
 
 addPackageSelectConstraint :: PackageIdentifier -> Constraints
-                    -> Satisfiable Constraints ExclusionReason
+                           -> Satisfiable Constraints ExclusionReason
 addPackageSelectConstraint pkgid constraints =
   Constraints.constrain dep reason constraints
   where



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

Reply via email to