@@ -9,12 +9,14 @@ import qualified Data.Map as Map
9import qualified Data.Set as Set
9import qualified Data.Set as Set
10import Data.Version (showVersion)
10import Data.Version (showVersion)
11import qualified Distribution.Text
11import qualified Distribution.Text
12+import Distribution.Text (display)
12import Distribution.Version (simplifyVersionRange, withinRange)
13import Distribution.Version (simplifyVersionRange, withinRange)
13import Stackage.HaskellPlatform
14import Stackage.HaskellPlatform
14import Stackage.LoadDatabase
15import Stackage.LoadDatabase
15import Stackage.NarrowDatabase
16import Stackage.NarrowDatabase
16import Stackage.Types
17import Stackage.Types
17import Stackage.Util
18import Stackage.Util
19+import Stackage.GhcPkg
19dropExcluded :: SelectSettings
21dropExcluded :: SelectSettings
20 -> Map PackageName (VersionRange, Maintainer)
22 -> Map PackageName (VersionRange, Maintainer)
@@ -26,22 +28,34 @@ getInstallInfo :: SelectSettings -> IO InstallInfo
26getInstallInfo settings = do
28getInstallInfo settings = do
27 putStrLn "Loading Haskell Platform"
29 putStrLn "Loading Haskell Platform"
28 hp <- loadHaskellPlatform settings
30 hp <- loadHaskellPlatform settings
33+ if useGlobalDatabase settings
35+ putStrLn "Loading core packages from global database"
37+ else return $ hpcore hp
38+ let coreMap = Map.unions
39+ $ map (\(PackageIdentifier k v) -> Map.singleton k v)
29 let allPackages'
42 let allPackages'
30 | requireHaskellPlatform settings = Map.union (stablePackages settings) $ identsToRanges (hplibs hp)
43 | requireHaskellPlatform settings = Map.union (stablePackages settings) $ identsToRanges (hplibs hp)
31 | otherwise = stablePackages settings
44 | otherwise = stablePackages settings
32 allPackages = dropExcluded settings allPackages'
45 allPackages = dropExcluded settings allPackages'
33− let totalCore = extraCore settings `Set.union` Set.map (\(PackageIdentifier p _) -> p) (hpcore hp)
46+ let totalCore = extraCore settings `Set.union` Set.map (\(PackageIdentifier p _) -> p) core
35 putStrLn "Loading package database"
48 putStrLn "Loading package database"
36 pdb <- loadPackageDB settings totalCore allPackages
49 pdb <- loadPackageDB settings totalCore allPackages
38 putStrLn "Narrowing package database"
51 putStrLn "Narrowing package database"
39− final <- narrowPackageDB settings pdb $ Set.fromList $ Map.toList $ Map.map snd $ allPackages
52+ final <- narrowPackageDB settings totalCore pdb $ Set.fromList $ Map.toList $ Map.map snd $ allPackages
41 putStrLn "Printing build plan to build-plan.log"
54 putStrLn "Printing build plan to build-plan.log"
42 writeFile "build-plan.log" $ unlines $ map showDep $ Map.toList final
55 writeFile "build-plan.log" $ unlines $ map showDep $ Map.toList final
57+ putStrLn "Checking for bad versions"
44− case checkBadVersions settings pdb final of
58+ case checkBadVersions settings coreMap pdb final of
45 badVersions
59 badVersions
46 | Map.null badVersions -> return ()
60 | Map.null badVersions -> return ()
47 | otherwise -> do
61 | otherwise -> do
@@ -96,10 +110,11 @@ bpPackageList = map packageVersionString . Map.toList . Map.map spiVersion . bpP
97-- | Check for internal mismatches in required and actual package versions.
111-- | Check for internal mismatches in required and actual package versions.
98checkBadVersions :: SelectSettings
112checkBadVersions :: SelectSettings
113+ -> Map PackageName Version -- ^ core
99 -> PackageDB
114 -> PackageDB
100 -> Map PackageName BuildInfo
115 -> Map PackageName BuildInfo
101 -> Map String (Map PackageName (Version, VersionRange))
116 -> Map String (Map PackageName (Version, VersionRange))
102−checkBadVersions settings (PackageDB pdb) buildPlan =
117+checkBadVersions settings core (PackageDB pdb) buildPlan =
103 Map.unions $ map getBadVersions $ Map.toList $ Map.filterWithKey unexpectedFailure buildPlan
118 Map.unions $ map getBadVersions $ Map.toList $ Map.filterWithKey unexpectedFailure buildPlan
105 unexpectedFailure name _ = name `Set.notMember` expectedFailuresSelect settings
120 unexpectedFailure name _ = name `Set.notMember` expectedFailuresSelect settings
@@ -123,9 +138,13 @@ checkBadVersions settings (PackageDB pdb) buildPlan =
123 checkPackage :: PackageName -> VersionRange -> Map PackageName (Version, VersionRange)
138 checkPackage :: PackageName -> VersionRange -> Map PackageName (Version, VersionRange)
124 checkPackage name vr =
139 checkPackage name vr =
125 case Map.lookup name buildPlan of
140 case Map.lookup name buildPlan of
126− -- Can't find the dependency. Could be part of core, so just ignore
141+ Nothing ->
127− -- it.
142+ case Map.lookup name core of
128− Nothing -> Map.empty
143+ -- Might be part of extra-core
144+ Nothing -> Map.empty
146+ | version `withinRange` vr -> Map.empty
147+ | otherwise -> Map.singleton name (version, vr)
130 | biVersion bi `withinRange` vr -> Map.empty
149 | biVersion bi `withinRange` vr -> Map.empty
131 | otherwise -> Map.singleton name (biVersion bi, vr)
150 | otherwise -> Map.singleton name (biVersion bi, vr)