1module Stackage.InstallInfo
6import Control.Arrow ((&&&))
7import Control.Monad (forM_)
8import qualified Data.Map as Map
9import qualified Data.Set as Set
10import Data.Version (showVersion)
11import qualified Distribution.Text
12import Distribution.Version (withinRange, simplifyVersionRange)
13import Stackage.HaskellPlatform
14import Stackage.LoadDatabase
15import Stackage.NarrowDatabase
19dropExcluded :: BuildSettings
20 -> Map PackageName (VersionRange, Maintainer)
21 -> Map PackageName (VersionRange, Maintainer)
23 Set.foldl' (flip Map.delete) m0 (excludedPackages bs)
25getInstallInfo :: BuildSettings -> IO InstallInfo
26getInstallInfo settings = do
27 putStrLn "Loading Haskell Platform"
28 hp <- loadHaskellPlatform settings
30 | requireHaskellPlatform settings = Map.union (stablePackages settings) $ identsToRanges (hplibs hp)
31 | otherwise = stablePackages settings
32 allPackages = dropExcluded settings allPackages'
33 let totalCore = extraCore settings `Set.union` Set.map (\(PackageIdentifier p _) -> p) (hpcore hp)
35 putStrLn "Loading package database"
36 pdb <- loadPackageDB settings totalCore allPackages
38 putStrLn "Narrowing package database"
39 final <- narrowPackageDB settings pdb $ Set.fromList $ Map.toList $ Map.map snd $ allPackages
41 putStrLn "Printing build plan to build-plan.log"
42 writeFile "build-plan.log" $ unlines $ map showDep $ Map.toList final
44 case checkBadVersions settings final of
46 | Map.null badVersions -> return ()
48 forM_ (Map.toList badVersions) $ \(user, badDeps) -> do
49 putStrLn $ user ++ " cannot use: "
50 forM_ (Map.toList badDeps) $ \(name, (version, range)) -> do
53 , packageVersionString (name, version)
55 , Distribution.Text.display $ simplifyVersionRange range
59 error "Conflicting build plan, exiting"
63 , iiPackages = Map.map (biVersion &&& biMaintainer) final
64 , iiOptionalCore = Map.fromList $ map (\(PackageIdentifier p v) -> (p, v)) $ Set.toList $ hplibs hp
68showDep :: (PackageName, BuildInfo) -> String
69showDep (PackageName name, (BuildInfo version deps (Maintainer m) _)) =
78 , unwords $ map unP deps
81 unP (PackageName p) = p
83iiPackageList :: InstallInfo -> [String]
84iiPackageList = map packageVersionString . Map.toList . Map.map fst . iiPackages
86-- | Check for internal mismatches in required and actual package versions.
87checkBadVersions :: BuildSettings
88 -> Map PackageName BuildInfo
89 -> Map String (Map PackageName (Version, VersionRange))
90checkBadVersions settings buildPlan =
91 Map.unions $ map getBadVersions $ Map.toList $ Map.filterWithKey unexpectedFailure buildPlan
93 unexpectedFailure name _ = name `Set.notMember` expectedFailures settings
95 getBadVersions :: (PackageName, BuildInfo) -> Map String (Map PackageName (Version, VersionRange))
96 getBadVersions (name, bi)
97 | Map.null badVersions = Map.empty
98 | otherwise = Map.singleton display badVersions
100 badVersions = Map.unions $ map (uncurry checkPackage) $ Map.toList $ biDeps bi
102 [ packageVersionString (name, biVersion bi)
104 , unMaintainer $ biMaintainer bi
108 checkPackage :: PackageName -> VersionRange -> Map PackageName (Version, VersionRange)
109 checkPackage name vr =
110 case Map.lookup name buildPlan of
111 -- Can't find the dependency. Could be part of core, so just ignore
115 | biVersion bi `withinRange` vr -> Map.empty
116 | 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