@@ -3,9 +3,12 @@ module Stackage.InstallInfo
3 , iiPackageList
3 , iiPackageList
6+import Control.Arrow ((&&&))
7+import Control.Monad (forM_)
6import qualified Data.Map as Map
8import qualified Data.Map as Map
7import qualified Data.Set as Set
9import qualified Data.Set as Set
8import Data.Version (showVersion)
10import Data.Version (showVersion)
11+import Distribution.Version (withinRange)
9import Stackage.Config
12import Stackage.Config
10import Stackage.HaskellPlatform
13import Stackage.HaskellPlatform
11import Stackage.LoadDatabase
14import Stackage.LoadDatabase
@@ -32,17 +35,29 @@ getInstallInfo settings = do
33 putStrLn "Printing build plan to build-plan.log"
36 putStrLn "Printing build plan to build-plan.log"
34 writeFile "build-plan.log" $ unlines $ map showDep $ Map.toList final
37 writeFile "build-plan.log" $ unlines $ map showDep $ Map.toList final
39+ case checkBadVersions settings final of
41+ | Map.null badVersions -> return ()
43+ forM_ (Map.toList badVersions) $ \(PackageName user, badDeps) -> do
44+ putStrLn $ user ++ " cannot use: "
45+ mapM_ (putStrLn . packageVersionString) $ Map.toList badDeps
48+ error "Conflicting build plan, exiting"
35 return InstallInfo
50 return InstallInfo
36 { iiCore = totalCore
51 { iiCore = totalCore
37− , iiPackages = Map.map (\(v, _, m) -> (v, m)) final
52+ , iiPackages = Map.map (biVersion &&& biMaintainer) final
38 , iiOptionalCore = Map.fromList $ map (\(PackageIdentifier p v) -> (p, v)) $ Set.toList $ hplibs hp
53 , iiOptionalCore = Map.fromList $ map (\(PackageIdentifier p v) -> (p, v)) $ Set.toList $ hplibs hp
39 , iiPackageDB = pdb
54 , iiPackageDB = pdb
42−showDep :: (PackageName, (Version, [PackageName], Maintainer)) -> String
57+showDep :: (PackageName, BuildInfo) -> String
43−showDep (name, (version, deps, Maintainer m)) =
58+showDep (PackageName name, (BuildInfo version deps (Maintainer m) _)) =
47 , showVersion version
62 , showVersion version
@@ -56,3 +71,25 @@ showDep (name, (version, deps, Maintainer m)) =
57iiPackageList :: InstallInfo -> [String]
72iiPackageList :: InstallInfo -> [String]
58iiPackageList = map packageVersionString . Map.toList . Map.map fst . iiPackages
73iiPackageList = map packageVersionString . Map.toList . Map.map fst . iiPackages
75+-- | Check for internal mismatches in required and actual package versions.
76+checkBadVersions :: BuildSettings
77+ -> Map PackageName BuildInfo
78+ -> Map PackageName (Map PackageName Version)
79+checkBadVersions settings buildPlan =
80+ Map.filter (not . Map.null) $ Map.map getBadVersions $ Map.filterWithKey unexpectedFailure buildPlan
82+ unexpectedFailure name _ = name `Set.notMember` expectedFailures settings
84+ getBadVersions :: BuildInfo -> Map PackageName Version
85+ getBadVersions = Map.unions . map (uncurry checkPackage) . Map.toList . biDeps
87+ checkPackage :: PackageName -> VersionRange -> Map PackageName Version
88+ checkPackage name vr =
89+ case Map.lookup name buildPlan of
90+ -- Can't find the dependency. Could be part of core, so just ignore
94+ | biVersion bi `withinRange` vr -> Map.empty
95+ | otherwise -> Map.singleton name $ biVersion bi