1{-# LANGUAGE RecordWildCards #-}
2{-# LANGUAGE TupleSections #-}
3module Stackage.InstallInfo
8import Control.Monad (forM_, unless)
9import Data.List (foldl')
10import qualified Data.Map as Map
11import qualified Data.Set as Set
12import Data.Time (getCurrentTime, formatTime)
13import Data.Version (showVersion)
14import qualified Distribution.Text
15import Distribution.Version (simplifyVersionRange, withinRange)
17import Stackage.HaskellPlatform
18import Stackage.LoadDatabase
19import Stackage.NarrowDatabase
20import Stackage.ServerFiles
23import qualified System.IO as IO
24import qualified System.IO.UTF8
25import System.Locale (defaultTimeLocale)
26import System.Exit (exitFailure)
28dropExcluded :: SelectSettings
29 -> Map PackageName (VersionRange, Maintainer)
30 -> Map PackageName (VersionRange, Maintainer)
32 foldl' (flip Map.delete) m0 (Set.toList $ excludedPackages bs)
34getInstallInfo :: SelectSettings -> IO InstallInfo
35getInstallInfo settings = do
36 putStrLn "Loading Haskell Platform"
37 mhp <- loadHaskellPlatform settings
41 Just hp | not (useGlobalDatabase settings) -> return $ hpcore hp
43 putStrLn "Loading core packages from global database"
44 getGlobalPackages $ selectGhcVersion settings
45 let coreMap = Map.unions
46 $ map (\(PackageIdentifier k v) -> Map.singleton k v)
51 Just hp | requireHaskellPlatform settings ->
52 Map.union (stablePackages settings $ requireHaskellPlatform settings)
53 $ identsToRanges (hplibs hp)
54 _ -> stablePackages settings $ requireHaskellPlatform settings
55 allPackages = dropExcluded settings allPackages'
57 | ignoreUpgradeableCore settings =
58 Map.fromList $ map (\n -> (PackageName n, Nothing)) $ words "base containers template-haskell"
60 Map.fromList (map (\(PackageIdentifier p v) -> (p, Just v)) (Set.toList core))
61 `Map.union` Map.fromList (map (, Nothing) (Set.toList $ extraCore settings))
63 putStrLn "Loading package database"
64 pdb <- loadPackageDB settings coreMap (Map.keysSet totalCore) allPackages
66 putStrLn "Narrowing package database"
67 (final, errs) <- narrowPackageDB settings (Map.keysSet totalCore) pdb $ Set.fromList $ Map.toList $ Map.map snd $ allPackages
69 putStrLn "Printing build plan to build-plan.log"
70 System.IO.UTF8.writeFile "build-plan.log" $ unlines $ map showDep $ Map.toList final
71 System.IO.UTF8.writeFile "hackage-map.txt" $ unlines $ map showHackageMap $ Map.toList final
73 unless (Set.null errs) $ do
74 putStrLn "Build plan requires some disallowed packages"
75 mapM_ putStrLn $ Set.toList errs
78 putStrLn "Checking for bad versions"
79 case checkBadVersions settings coreMap pdb final of
81 | Map.null badVersions -> return ()
83 forM_ (Map.toList badVersions) $ \(user, badDeps) -> do
84 putStrLn $ user ++ " cannot use: "
85 forM_ (Map.toList badDeps) $ \(name, (version, range)) -> do
88 , packageVersionString (name, version)
90 , Distribution.Text.display $ simplifyVersionRange range
94 error "Conflicting build plan, exiting"
98 , iiPackages = Map.map biToSPI final
99 , iiOptionalCore = maybe
101 (Map.fromList . map (\(PackageIdentifier p v) -> (p, v)) . Set.toList . hplibs)
106 putStrLn "Creating hackage file (for publishing to Stackage server)"
107 IO.withBinaryFile "hackage" IO.WriteMode $ createHackageFile ii
109 putStrLn "Creating desc file (for publishing to Stackage server)"
110 now <- getCurrentTime
111 System.IO.UTF8.writeFile "desc" $ concat
112 [ "Stackage build for GHC "
113 , let GhcMajorVersion x y = selectGhcVersion settings
114 in show x ++ "." ++ show y
116 , formatTime defaultTimeLocale "%Y-%m-%d\n" now
123biToSPI :: BuildInfo -> SelectedPackageInfo
124biToSPI BuildInfo {..} = SelectedPackageInfo
125 { spiVersion = biVersion
126 , spiMaintainer = biMaintainer
127 , spiGithubUser = biGithubUser
128 , spiHasTests = biHasTests
131showDep :: (PackageName, BuildInfo) -> String
132showDep (PackageName name, BuildInfo {..}) =
136 , showVersion biVersion
138 , unMaintainer biMaintainer
139 , case biGithubUser of
144 , unwords $ map unP biUsers
147 unP (PackageName p) = p
149-- | Convert to format used by Hackage for displaying distribution versions.
150-- For more info, see https://github.com/fpco/stackage/issues/38.
151showHackageMap :: (PackageName, BuildInfo) -> String
152showHackageMap (PackageName name, BuildInfo {..}) =
153 show (name, showVersion biVersion, Nothing :: Maybe String)
155bpPackageList :: BuildPlan -> [String]
156bpPackageList = map packageVersionString . Map.toList . Map.map spiVersion . bpPackages
158-- | Check for internal mismatches in required and actual package versions.
159checkBadVersions :: SelectSettings
160 -> Map PackageName Version -- ^ core
162 -> Map PackageName BuildInfo
163 -> Map String (Map PackageName (Version, VersionRange))
164checkBadVersions settings core (PackageDB pdb) buildPlan =
165 Map.unions $ map getBadVersions $ Map.toList $ Map.filterWithKey unexpectedFailure buildPlan
167 unexpectedFailure name _ = name `Set.notMember` expectedFailuresSelect settings
169 getBadVersions :: (PackageName, BuildInfo) -> Map String (Map PackageName (Version, VersionRange))
170 getBadVersions (name, bi)
171 | Map.null badVersions = Map.empty
172 | otherwise = Map.singleton display badVersions
174 badVersions = Map.unions $ map (uncurry checkPackage) $ Map.toList $ biDeps bi
176 [ packageVersionString (name, biVersion bi)
178 , unMaintainer $ biMaintainer bi
179 , case Map.lookup name pdb of
180 Just PackageInfo { piGithubUser = Just gu } -> " @" ++ gu
185 checkPackage :: PackageName -> VersionRange -> Map PackageName (Version, VersionRange)
186 checkPackage name vr =
187 case Map.lookup name buildPlan of
189 case Map.lookup name core of
190 -- Might be part of extra-core
193 | version `withinRange` vr -> Map.empty
194 | otherwise -> Map.singleton name (version, vr)
196 | biVersion bi `withinRange` vr -> Map.empty
197 | 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