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

On branch  : master

http://hackage.haskell.org/trac/ghc/changeset/8d9cef626ac86850c2ec85d887bd04eabb23cbae

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

commit 8d9cef626ac86850c2ec85d887bd04eabb23cbae
Author: Duncan Coutts <[email protected]>
Date:   Sat Jun 7 14:39:13 2008 +0000

    Only inspect the needed parts of the installed and available indexes
    The available package index is loaded lazily so if we can avoid
    forcing all the packages then we can save a huge amount of slow text
    parsing. So select out the maximal subset of the index that we could
    ever need based on the names of the packages we want to install. For
    the common case of installing just one or two packages this cuts
    down the number of packages we look at by a couple orders of
    magnitude. This does not help with the installed index which is read
    strictly, though most people do not (yet) have hundreds of installed
    packages, so that's less of an immediate problem.

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

 cabal-install/Hackage/Dependency/TopDown.hs |   46 ++++++++++++++++++++++++--
 1 files changed, 42 insertions(+), 4 deletions(-)

diff --git a/cabal-install/Hackage/Dependency/TopDown.hs 
b/cabal-install/Hackage/Dependency/TopDown.hs
index 45c2422..e4912c6 100644
--- a/cabal-install/Hackage/Dependency/TopDown.hs
+++ b/cabal-install/Hackage/Dependency/TopDown.hs
@@ -217,15 +217,17 @@ topDownResolver' os arch comp installed available pref 
deps =
   where
     configure   = configurePackage os arch comp
     constraints = Constraints.empty
-                    (annotateInstalledPackages topSortNumber installed)
-                    (annotateAvailablePackages topSortNumber available)
-    topSortNumber = topologicalSortNumbering installed available
+                    (annotateInstalledPackages topSortNumber installed')
+                    (annotateAvailablePackages topSortNumber available')
+    (installed', available') = selectNeededSubset installed available
+                                                  initialPkgNames
+    topSortNumber = topologicalSortNumbering installed' available'
 
     initialDeps     = [ dep  | UnresolvedDependency dep _ <- deps ]
     initialPkgNames = Set.fromList [ name | Dependency name _ <- initialDeps ]
 
     finalise selected = PackageIndex.allPackages
-                      . improvePlan installed
+                      . improvePlan installed'
                       . PackageIndex.fromList
                       . finaliseSelectedPackages selected
 
@@ -317,6 +319,42 @@ topologicalSortNumbering installed available =
                       , Dependency depName _ <-
                           buildDepends (flattenPackageDescription pkg') ] ]
 
+-- | We don't need the entire index (which is rather large and costly if we
+-- force it by examining the whole thing). So trace out the maximul subset of
+-- each index that we could possibly ever need. Do this by flattening packages
+-- and looking at the names of all possible dependencies.
+--
+selectNeededSubset :: PackageIndex InstalledPackageInfo
+                   -> PackageIndex AvailablePackage
+                   -> Set PackageName
+                   -> (PackageIndex InstalledPackageInfo
+                      ,PackageIndex AvailablePackage)
+selectNeededSubset installed available = select mempty mempty
+  where
+    select :: PackageIndex InstalledPackageInfo
+           -> PackageIndex AvailablePackage
+           -> Set PackageName
+           -> (PackageIndex InstalledPackageInfo
+              ,PackageIndex AvailablePackage)
+    select installed' available' remaining
+      | Set.null remaining = (installed', available')
+      | otherwise = select installed'' available'' remaining''
+      where
+        (next, remaining') = Set.deleteFindMin remaining
+        moreInstalled = PackageIndex.lookupPackageName installed next
+        moreAvailable = PackageIndex.lookupPackageName available next
+        moreRemaining = nub
+                      $ [ packageName dep
+                        | pkg <- moreInstalled
+                        , dep <- depends pkg ]
+                     ++ [ name
+                        | 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
+
 -- ------------------------------------------------------------
 -- * Post processing the solution
 -- ------------------------------------------------------------



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

Reply via email to