1{-# LANGUAGE RecordWildCards #-}
2module Stackage.InstallInfo
7import Control.Arrow ((&&&))
8import Control.Monad (forM_)
9import qualified Data.Map as Map
10import qualified Data.Set as Set
11import Data.Version (showVersion)
12import qualified Distribution.Text
13import Distribution.Version (withinRange, simplifyVersionRange)
14import Stackage.HaskellPlatform
15import Stackage.LoadDatabase
16import Stackage.NarrowDatabase
20dropExcluded :: SelectSettings
21 -> Map PackageName (VersionRange, Maintainer)
22 -> Map PackageName (VersionRange, Maintainer)
24 Set.foldl' (flip Map.delete) m0 (excludedPackages bs)
26getInstallInfo :: SelectSettings -> IO InstallInfo
27getInstallInfo settings = do
28 putStrLn "Loading Haskell Platform"
29 hp <- loadHaskellPlatform settings
31 | requireHaskellPlatform settings = Map.union (stablePackages settings) $ identsToRanges (hplibs hp)
32 | otherwise = stablePackages settings
33 allPackages = dropExcluded settings allPackages'
34 let totalCore = extraCore settings `Set.union` Set.map (\(PackageIdentifier p _) -> p) (hpcore hp)
36 putStrLn "Loading package database"
37 pdb <- loadPackageDB settings totalCore allPackages
39 putStrLn "Narrowing package database"
40 final <- narrowPackageDB settings pdb $ Set.fromList $ Map.toList $ Map.map snd $ allPackages
42 putStrLn "Printing build plan to build-plan.log"
43 writeFile "build-plan.log" $ unlines $ map showDep $ Map.toList final
45 case checkBadVersions settings pdb final of
47 | Map.null badVersions -> return ()
49 forM_ (Map.toList badVersions) $ \(user, badDeps) -> do
50 putStrLn $ user ++ " cannot use: "
51 forM_ (Map.toList badDeps) $ \(name, (version, range)) -> do
54 , packageVersionString (name, version)
56 , Distribution.Text.display $ simplifyVersionRange range
60 error "Conflicting build plan, exiting"
64 , iiPackages = Map.map biToSPI final
65 , iiOptionalCore = Map.fromList $ map (\(PackageIdentifier p v) -> (p, v)) $ Set.toList $ hplibs hp
69biToSPI :: BuildInfo -> SelectedPackageInfo
70biToSPI BuildInfo {..} = SelectedPackageInfo
71 { spiVersion = biVersion
72 , spiMaintainer = biMaintainer
73 , spiGithubUser = biGithubUser
74 , spiHasTests = biHasTests
77showDep :: (PackageName, BuildInfo) -> String
78showDep (PackageName name, BuildInfo {..}) =
82 , showVersion biVersion
84 , unMaintainer biMaintainer
85 , case biGithubUser of
90 , unwords $ map unP biUsers
93 unP (PackageName p) = p
95bpPackageList :: BuildPlan -> [String]
96bpPackageList = map packageVersionString . Map.toList . Map.map spiVersion . bpPackages
98-- | Check for internal mismatches in required and actual package versions.
99checkBadVersions :: SelectSettings
101 -> Map PackageName BuildInfo
102 -> Map String (Map PackageName (Version, VersionRange))
103checkBadVersions settings (PackageDB pdb) buildPlan =
104 Map.unions $ map getBadVersions $ Map.toList $ Map.filterWithKey unexpectedFailure buildPlan
106 unexpectedFailure name _ = name `Set.notMember` expectedFailuresSelect settings
108 getBadVersions :: (PackageName, BuildInfo) -> Map String (Map PackageName (Version, VersionRange))
109 getBadVersions (name, bi)
110 | Map.null badVersions = Map.empty
111 | otherwise = Map.singleton display badVersions
113 badVersions = Map.unions $ map (uncurry checkPackage) $ Map.toList $ biDeps bi
115 [ packageVersionString (name, biVersion bi)
117 , unMaintainer $ biMaintainer bi
118 , case Map.lookup name pdb of
119 Just PackageInfo { piGithubUser = Just gu } -> " @" ++ gu
124 checkPackage :: PackageName -> VersionRange -> Map PackageName (Version, VersionRange)
125 checkPackage name vr =
126 case Map.lookup name buildPlan of
127 -- Can't find the dependency. Could be part of core, so just ignore
131 | biVersion bi `withinRange` vr -> Map.empty
132 | 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