1{-# LANGUAGE RecordWildCards #-}
2module Stackage.InstallInfo
7import Control.Monad (forM_, unless)
8import qualified Data.Map as Map
9import qualified Data.Set as Set
10import Data.Version (showVersion)
11import qualified Distribution.Text
12import Distribution.Version (simplifyVersionRange, withinRange)
14import Stackage.HaskellPlatform
15import Stackage.LoadDatabase
16import Stackage.NarrowDatabase
19import System.Exit (exitFailure)
21dropExcluded :: SelectSettings
22 -> Map PackageName (VersionRange, Maintainer)
23 -> Map PackageName (VersionRange, Maintainer)
25 Set.foldl' (flip Map.delete) m0 (excludedPackages bs)
27getInstallInfo :: SelectSettings -> IO InstallInfo
28getInstallInfo settings = do
29 putStrLn "Loading Haskell Platform"
30 mhp <- loadHaskellPlatform settings
34 Just hp | not (useGlobalDatabase settings) -> return $ hpcore hp
36 putStrLn "Loading core packages from global database"
37 getGlobalPackages $ selectGhcVersion settings
38 let coreMap = Map.unions
39 $ map (\(PackageIdentifier k v) -> Map.singleton k v)
44 Just hp | requireHaskellPlatform settings ->
45 Map.union (stablePackages settings) $ identsToRanges (hplibs hp)
46 _ -> stablePackages settings
47 allPackages = dropExcluded settings allPackages'
48 let totalCore = extraCore settings `Set.union` Set.map (\(PackageIdentifier p _) -> p) core
50 putStrLn "Loading package database"
51 pdb <- loadPackageDB settings coreMap totalCore allPackages
53 putStrLn "Narrowing package database"
54 (final, errs) <- narrowPackageDB settings totalCore pdb $ Set.fromList $ Map.toList $ Map.map snd $ allPackages
56 putStrLn "Printing build plan to build-plan.log"
57 writeFile "build-plan.log" $ unlines $ map showDep $ Map.toList final
59 unless (Set.null errs) $ do
60 putStrLn "Build plan requires some disallowed packages"
61 mapM_ putStrLn $ Set.toList errs
64 putStrLn "Checking for bad versions"
65 case checkBadVersions settings coreMap pdb final of
67 | Map.null badVersions -> return ()
69 forM_ (Map.toList badVersions) $ \(user, badDeps) -> do
70 putStrLn $ user ++ " cannot use: "
71 forM_ (Map.toList badDeps) $ \(name, (version, range)) -> do
74 , packageVersionString (name, version)
76 , Distribution.Text.display $ simplifyVersionRange range
80 error "Conflicting build plan, exiting"
84 , iiPackages = Map.map biToSPI final
85 , iiOptionalCore = maybe
87 (Map.fromList . map (\(PackageIdentifier p v) -> (p, v)) . Set.toList . hplibs)
92biToSPI :: BuildInfo -> SelectedPackageInfo
93biToSPI BuildInfo {..} = SelectedPackageInfo
94 { spiVersion = biVersion
95 , spiMaintainer = biMaintainer
96 , spiGithubUser = biGithubUser
97 , spiHasTests = biHasTests
100showDep :: (PackageName, BuildInfo) -> String
101showDep (PackageName name, BuildInfo {..}) =
105 , showVersion biVersion
107 , unMaintainer biMaintainer
108 , case biGithubUser of
113 , unwords $ map unP biUsers
116 unP (PackageName p) = p
118bpPackageList :: BuildPlan -> [String]
119bpPackageList = map packageVersionString . Map.toList . Map.map spiVersion . bpPackages
121-- | Check for internal mismatches in required and actual package versions.
122checkBadVersions :: SelectSettings
123 -> Map PackageName Version -- ^ core
125 -> Map PackageName BuildInfo
126 -> Map String (Map PackageName (Version, VersionRange))
127checkBadVersions settings core (PackageDB pdb) buildPlan =
128 Map.unions $ map getBadVersions $ Map.toList $ Map.filterWithKey unexpectedFailure buildPlan
130 unexpectedFailure name _ = name `Set.notMember` expectedFailuresSelect settings
132 getBadVersions :: (PackageName, BuildInfo) -> Map String (Map PackageName (Version, VersionRange))
133 getBadVersions (name, bi)
134 | Map.null badVersions = Map.empty
135 | otherwise = Map.singleton display badVersions
137 badVersions = Map.unions $ map (uncurry checkPackage) $ Map.toList $ biDeps bi
139 [ packageVersionString (name, biVersion bi)
141 , unMaintainer $ biMaintainer bi
142 , case Map.lookup name pdb of
143 Just PackageInfo { piGithubUser = Just gu } -> " @" ++ gu
148 checkPackage :: PackageName -> VersionRange -> Map PackageName (Version, VersionRange)
149 checkPackage name vr =
150 case Map.lookup name buildPlan of
152 case Map.lookup name core of
153 -- Might be part of extra-core
156 | version `withinRange` vr -> Map.empty
157 | otherwise -> Map.singleton name (version, vr)
159 | biVersion bi `withinRange` vr -> Map.empty
160 | otherwise -> Map.singleton name (biVersion bi, vr)
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list