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
