[commit: Cabal] master: Partial fix for handling multiple installed instances of same package version (8e824e6)
Ian Lynagh
igloo at earth.li
Fri Jun 24 02:07:57 CEST 2011
Repository : ssh://darcs.haskell.org//srv/darcs/packages/Cabal
On branch : master
http://hackage.haskell.org/trac/ghc/changeset/8e824e6f037991b28313e1b14ea34343c0423c88
>---------------------------------------------------------------
commit 8e824e6f037991b28313e1b14ea34343c0423c88
Author: Duncan Coutts <duncan at haskell.org>
Date: Sun Feb 27 12:50:08 2011 +0000
Partial fix for handling multiple installed instances of same package version
Previously when multiple instances of the same package are installed,
e.g. in global and user dbs, we would often end up selecting the wrong
instance. Now we select the user one consistently which will solve the
problem in most (but not all) cases.
>---------------------------------------------------------------
cabal-install/Distribution/Client/IndexUtils.hs | 22 +++++++++++++---------
1 files changed, 13 insertions(+), 9 deletions(-)
diff --git a/cabal-install/Distribution/Client/IndexUtils.hs b/cabal-install/Distribution/Client/IndexUtils.hs
index c2cec77..4088ade 100644
--- a/cabal-install/Distribution/Client/IndexUtils.hs
+++ b/cabal-install/Distribution/Client/IndexUtils.hs
@@ -22,7 +22,8 @@ import qualified Distribution.Client.Tar as Tar
import Distribution.Client.Types
import Distribution.Package
- ( PackageId, PackageIdentifier(..), PackageName(..), Package(..)
+ ( PackageId, PackageIdentifier(..), PackageName(..)
+ , Package(..), packageVersion
, Dependency(Dependency), InstalledPackageId(..) )
import Distribution.Client.PackageIndex (PackageIndex)
import qualified Distribution.Client.PackageIndex as PackageIndex
@@ -47,10 +48,10 @@ import Distribution.Text
import Distribution.Verbosity
( Verbosity, lessVerbose )
import Distribution.Simple.Utils
- ( warn, info, fromUTF8 )
+ ( warn, info, fromUTF8, equating )
import Data.Maybe (catMaybes, fromMaybe)
-import Data.List (isPrefixOf)
+import Data.List (isPrefixOf, groupBy)
import Data.Monoid (Monoid(..))
import qualified Data.Map as Map
import Control.Monad (MonadPlus(mplus), when)
@@ -79,13 +80,16 @@ getInstalledPackages verbosity comp packageDbs conf =
verbosity' = lessVerbose verbosity
convert :: InstalledPackageIndex.PackageIndex -> PackageIndex InstalledPackage
- convert index = PackageIndex.fromList $
- reverse -- because later ones mask earlier ones, but
- -- InstalledPackageIndex.allPackages gives us the most preferred
- -- instances first, when packages share a package id, like when
- -- the same package is installed in the global & user dbs.
+ convert index = PackageIndex.fromList
+ -- There can be multiple installed instances of each package version,
+ -- like when the same package is installed in the global & user dbs.
+ -- InstalledPackageIndex.allPackagesByName gives us the installed
+ -- packages with the most preferred instances first, so by picking the
+ -- first we should get the user one. This is almost but not quite the
+ -- same as what ghc does.
[ InstalledPackage ipkg (sourceDeps index ipkg)
- | ipkg <- InstalledPackageIndex.allPackages index ]
+ | ipkgs <- InstalledPackageIndex.allPackagesByName index
+ , (ipkg:_) <- groupBy (equating packageVersion) ipkgs ]
-- The InstalledPackageInfo only lists dependencies by the
-- InstalledPackageId, which means we do not directly know the corresponding
More information about the Cvs-libraries
mailing list