[commit: Cabal] master: Only apply preferences to base if its version is unbounded above (851beab)
Ian Lynagh
igloo at earth.li
Fri Jun 24 02:03:33 CEST 2011
Repository : ssh://darcs.haskell.org//srv/darcs/packages/Cabal
On branch : master
http://hackage.haskell.org/trac/ghc/changeset/851beab58e0119a91d7cbbe2d7442ceed1c233cf
>---------------------------------------------------------------
commit 851beab58e0119a91d7cbbe2d7442ceed1c233cf
Author: Duncan Coutts <duncan at haskell.org>
Date: Wed Jun 3 10:16:23 2009 +0000
Only apply preferences to base if its version is unbounded above
Fixes ticket #485. This means that for constraints like:
build-depends: base >= 3 && < 5
we will pick version 4. However we will continue to apply the
version 3 preference for things like:
build-depends: base >= 3
Where there is no upper bound on the version. Note that we now
also ignore preferences for base given on the command line.
We should implement #483 to split prefs from shims.
>---------------------------------------------------------------
.../Distribution/Client/Dependency/TopDown.hs | 26 +++++++++++++++----
1 files changed, 20 insertions(+), 6 deletions(-)
diff --git a/cabal-install/Distribution/Client/Dependency/TopDown.hs b/cabal-install/Distribution/Client/Dependency/TopDown.hs
index e30182a..746c4d4 100644
--- a/cabal-install/Distribution/Client/Dependency/TopDown.hs
+++ b/cabal-install/Distribution/Client/Dependency/TopDown.hs
@@ -41,7 +41,8 @@ import Distribution.PackageDescription
import Distribution.PackageDescription.Configuration
( finalizePackageDescription, flattenPackageDescription )
import Distribution.Version
- ( VersionRange, anyVersion, withinRange, simplifyVersionRange )
+ ( VersionRange, anyVersion, withinRange, simplifyVersionRange
+ , UpperBound(..), asVersionIntervals )
import Distribution.Compiler
( CompilerId )
import Distribution.System
@@ -442,13 +443,15 @@ finaliseSelectedPackages pref selected constraints =
finaliseAvailable mipkg (SemiConfiguredPackage pkg flags deps) =
InstallPlan.Configured (ConfiguredPackage pkg flags deps')
where
- deps' = map (packageId . pickRemaining) deps
- pickRemaining dep =
+ deps' = map (packageId . pickRemaining mipkg) deps
+
+ pickRemaining mipkg dep@(Dependency _name versionRange) =
case PackageIndex.lookupDependency remainingChoices dep of
[] -> impossible
[pkg'] -> pkg'
remaining -> assert (checkIsPaired remaining)
$ maximumBy bestByPref remaining
+ where
-- We order candidate packages to pick for a dependency by these
-- three factors. The last factor is just highest version wins.
bestByPref =
@@ -459,11 +462,22 @@ finaliseSelectedPackages pref selected constraints =
isCurrent = case mipkg :: Maybe InstalledPackage of
Nothing -> \_ -> False
Just ipkg -> \p -> packageId p `elem` depends ipkg
- -- Is this package a preferred version acording to the hackage or
- -- user's suggested version constraints
- isPreferred p = packageVersion p `withinRange` preferredVersions
+ -- If there is no upper bound on the version range then we apply a
+ -- preferred version acording to the hackage or user's suggested
+ -- version constraints. TODO: distinguish hacks from prefs
+ bounded = boundedAbove versionRange
+ isPreferred p
+ | bounded = True -- any constant will do
+ | otherwise = packageVersion p `withinRange` preferredVersions
where (PackagePreferences preferredVersions _) = pref (packageName p)
+ boundedAbove :: VersionRange -> Bool
+ boundedAbove vr = case asVersionIntervals vr of
+ [] -> True -- this is the inconsistent version range.
+ intervals -> case last intervals of
+ (_, UpperBound _ _) -> True
+ (_, NoUpperBound ) -> False
+
-- We really only expect to find more than one choice remaining when
-- we're finalising a dependency on a paired package.
checkIsPaired [p1, p2] =
More information about the Cvs-libraries
mailing list