@@ -3,9 +3,12 @@ module Stackage.InstallInfo
33 , iiPackageList
44 ) where
55
6+import Control.Arrow ((&&&))
7+import Control.Monad (forM_)
68import qualified Data.Map as Map
79import qualified Data.Set as Set
810import Data.Version (showVersion)
11+import Distribution.Version (withinRange)
912import Stackage.Config
1013import Stackage.HaskellPlatform
1114import Stackage.LoadDatabase
@@ -32,17 +35,29 @@ getInstallInfo settings = do
3235
3336 putStrLn "Printing build plan to build-plan.log"
3437 writeFile "build-plan.log" $ unlines $ map showDep $ Map.toList final
38+
39+ case checkBadVersions settings final of
40+ badVersions
41+ | Map.null badVersions -> return ()
42+ | otherwise -> do
43+ forM_ (Map.toList badVersions) $ \(PackageName user, badDeps) -> do
44+ putStrLn $ user ++ " cannot use: "
45+ mapM_ (putStrLn . packageVersionString) $ Map.toList badDeps
46+ putStrLn ""
47+
48+ error "Conflicting build plan, exiting"
49+
3550 return InstallInfo
3651 { iiCore = totalCore
37− , iiPackages = Map.map (\(v, _, m) -> (v, m)) final
52+ , iiPackages = Map.map (biVersion &&& biMaintainer) final
3853 , iiOptionalCore = Map.fromList $ map (\(PackageIdentifier p v) -> (p, v)) $ Set.toList $ hplibs hp
3954 , iiPackageDB = pdb
4055 }
4156
42−showDep :: (PackageName, (Version, [PackageName], Maintainer)) -> String
43−showDep (name, (version, deps, Maintainer m)) =
57+showDep :: (PackageName, BuildInfo) -> String
58+showDep (PackageName name, (BuildInfo version deps (Maintainer m) _)) =
4459 concat
45− [ unP name
60+ [ name
4661 , "-"
4762 , showVersion version
4863 , " ("
@@ -56,3 +71,25 @@ showDep (name, (version, deps, Maintainer m)) =
5671
5772iiPackageList :: InstallInfo -> [String]
5873iiPackageList = map packageVersionString . Map.toList . Map.map fst . iiPackages
74+
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
81+ where
82+ unexpectedFailure name _ = name `Set.notMember` expectedFailures settings
83+
84+ getBadVersions :: BuildInfo -> Map PackageName Version
85+ getBadVersions = Map.unions . map (uncurry checkPackage) . Map.toList . biDeps
86+
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
91+ -- it.
92+ Nothing -> Map.empty
93+ Just bi
94+ | biVersion bi `withinRange` vr -> Map.empty
95+ | otherwise -> Map.singleton name $ biVersion bi