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

On branch  : master

http://hackage.haskell.org/trac/ghc/changeset/85af264568164e310cdc6b9da3bde1deaecbc9d8

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

commit 85af264568164e310cdc6b9da3bde1deaecbc9d8
Author: Duncan Coutts <[email protected]>
Date:   Thu Dec 18 20:49:17 2008 +0000

    Generalise the way preferences are specified to the resolver
    We still provide a default global policy, but now we give a
    list of per-package preferences which can be on the version
    or installed state. Later preferences override earlier ones.

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

 cabal-install/Distribution/Client/Dependency.hs |   65 ++++++++++++----------
 cabal-install/Distribution/Client/Fetch.hs      |    2 +-
 cabal-install/Distribution/Client/Install.hs    |    8 ++--
 3 files changed, 40 insertions(+), 35 deletions(-)

diff --git a/cabal-install/Distribution/Client/Dependency.hs 
b/cabal-install/Distribution/Client/Dependency.hs
index 5a13fb1..10c3947 100644
--- a/cabal-install/Distribution/Client/Dependency.hs
+++ b/cabal-install/Distribution/Client/Dependency.hs
@@ -22,8 +22,8 @@ module Distribution.Client.Dependency (
 
     PackagesPreference(..),
     packagesPreference,
-    PackagesVersionPreference,
-    PackagesInstalledPreference(..),
+    PackagesPreferenceDefault(..),
+    PackagePreference(..),
 
     upgradableDependencies,
   ) where
@@ -68,22 +68,15 @@ defaultResolver = topDownResolver
 -- | Global policy for the versions of all packages.
 --
 data PackagesPreference = PackagesPreference
-       PackagesInstalledPreference
-       PackagesVersionPreference
+       PackagesPreferenceDefault
+       [PackagePreference]
 
-packagesPreference :: PackagesInstalledPreference
+packagesPreference :: PackagesPreferenceDefault
                    -> Map PackageName VersionRange
                    -> PackagesPreference
-packagesPreference installedPref versionPrefs =
-  PackagesPreference installedPref versionPrefs'
-  where
-    versionPrefs' :: PackageName -> VersionRange
-    versionPrefs' pkgname =
-      fromMaybe AnyVersion (Map.lookup pkgname versionPrefs)
-
--- | An optional suggested version for each package.

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

-type PackagesVersionPreference = PackageName -> VersionRange
+packagesPreference defaultPref versionPrefs =
+  PackagesPreference defaultPref [ PackageVersionPreference name ver
+                                 | (name, ver) <- Map.toList versionPrefs ]
 
 dependencyConstraints :: [UnresolvedDependency] -> [PackageConstraint]
 dependencyConstraints deps =
@@ -102,7 +95,7 @@ dependencyTargets deps =
 -- | Global policy for all packages to say if we prefer package versions that
 -- are already installed locally or if we just prefer the latest available.
 --
-data PackagesInstalledPreference =
+data PackagesPreferenceDefault =
 
      -- | Always prefer the latest version irrespective of any existing
      -- installed version.
@@ -123,6 +116,10 @@ data PackagesInstalledPreference =
      --
    | PreferLatestForSelected
 
+data PackagePreference
+   = PackageVersionPreference   PackageName VersionRange
+   | PackageInstalledPreference PackageName InstalledPreference
+
 resolveDependencies :: Platform
                     -> CompilerId
                     -> Maybe (PackageIndex InstalledPackageInfo)
@@ -208,21 +205,29 @@ dependencyResolver resolver platform comp installed 
available
 interpretPackagesPreference :: Set PackageName
                             -> PackagesPreference
                             -> (PackageName -> PackagePreferences)
-interpretPackagesPreference selected
-  (PackagesPreference installPref versionPref) = case installPref of
+interpretPackagesPreference selected (PackagesPreference defaultPref prefs) =
+  \pkgname -> PackagePreferences (versionPref pkgname) (installPref pkgname)
 
-  PreferAllLatest         -> \pkgname ->
-    PackagePreferences (versionPref pkgname) PreferLatest
-
-  PreferAllInstalled      -> \pkgname ->
-    PackagePreferences (versionPref pkgname) PreferInstalled
-
-  PreferLatestForSelected -> \pkgname ->
-    -- When you say cabal install foo, what you really mean is, prefer the
-    -- latest version of foo, but the installed version of everything else:
-    if pkgname `Set.member` selected
-      then PackagePreferences (versionPref pkgname) PreferLatest
-      else PackagePreferences (versionPref pkgname) PreferInstalled
+  where
+    versionPref pkgname =
+      fromMaybe AnyVersion (Map.lookup pkgname versionPrefs)
+    versionPrefs = Map.fromList
+      [ (pkgname, pref)
+      | PackageVersionPreference pkgname pref <- prefs ]
+
+    installPref pkgname =
+      fromMaybe (installPrefDefault pkgname) (Map.lookup pkgname installPrefs)
+    installPrefs = Map.fromList
+      [ (pkgname, pref)
+      | PackageInstalledPreference pkgname pref <- prefs ]
+    installPrefDefault = case defaultPref of
+      PreferAllLatest         -> \_       -> PreferLatest
+      PreferAllInstalled      -> \_       -> PreferInstalled
+      PreferLatestForSelected -> \pkgname ->
+        -- When you say cabal install foo, what you really mean is, prefer the
+        -- latest version of foo, but the installed version of everything else
+        if pkgname `Set.member` selected then PreferLatest
+                                         else PreferInstalled
 
 -- | Given the list of installed packages and available packages, figure
 -- out which packages can be upgraded.
diff --git a/cabal-install/Distribution/Client/Fetch.hs 
b/cabal-install/Distribution/Client/Fetch.hs
index b8cb353..78e12c6 100644
--- a/cabal-install/Distribution/Client/Fetch.hs
+++ b/cabal-install/Distribution/Client/Fetch.hs
@@ -28,7 +28,7 @@ import Distribution.Client.Types
 import Distribution.Client.Dependency
          ( resolveDependenciesWithProgress
          , dependencyConstraints, dependencyTargets
-         , packagesPreference, PackagesInstalledPreference(..) )
+         , packagesPreference, PackagesPreferenceDefault(..) )
 import Distribution.Client.Dependency.Types
          ( foldProgress )
 import Distribution.Client.IndexUtils as IndexUtils
diff --git a/cabal-install/Distribution/Client/Install.hs 
b/cabal-install/Distribution/Client/Install.hs
index 0437a49..d50d66a 100644
--- a/cabal-install/Distribution/Client/Install.hs
+++ b/cabal-install/Distribution/Client/Install.hs
@@ -35,7 +35,7 @@ import System.IO.Error
 import Distribution.Client.Dependency
          ( resolveDependenciesWithProgress
          , PackageConstraint(..), dependencyConstraints, dependencyTargets
-         , packagesPreference, PackagesInstalledPreference(..)
+         , packagesPreference, PackagesPreferenceDefault(..)
          , upgradableDependencies
          , Progress(..), foldProgress, )
 import Distribution.Client.Fetch (fetchPackage)
@@ -295,10 +295,10 @@ planLocalPackage verbosity comp configFlags installed
 
 -- | Make an 'InstallPlan' for the given dependencies.
 --
-planRepoPackages :: PackagesInstalledPreference -> Compiler
+planRepoPackages :: PackagesPreferenceDefault -> Compiler
                  -> Cabal.ConfigFlags -> InstallFlags
                  -> [UnresolvedDependency] -> Planner
-planRepoPackages installedPref comp configFlags installFlags deps installed
+planRepoPackages defaultPref comp configFlags installFlags deps installed
   (AvailablePackageDb available versionPrefs) = do
   deps' <- IndexUtils.disambiguateDependencies available deps
   let installed'
@@ -311,7 +311,7 @@ planRepoPackages installedPref comp configFlags 
installFlags deps installed
                     | Dependency name ver <- Cabal.configConstraints 
configFlags ]
   return $ resolveDependenciesWithProgress buildPlatform (compilerId comp)
              installed' available
-             (packagesPreference installedPref versionPrefs)
+             (packagesPreference defaultPref versionPrefs)
              constraints targets
   where
     hideGivenDeps pkgs index =



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

Reply via email to