3 , defaultSelectSettings
6import Data.Either (partitionEithers)
7import qualified Data.Map as Map
8import Data.Maybe (mapMaybe)
10import qualified Data.Set as Set
11import Prelude hiding (pi)
13import Stackage.InstallInfo
17defaultSelectSettings :: SelectSettings
18defaultSelectSettings = SelectSettings
19 { extraCore = defaultExtraCore
20 , expectedFailuresSelect = defaultExpectedFailures
21 , stablePackages = defaultStablePackages
22 , haskellPlatformCabal = "haskell-platform/haskell-platform.cabal"
23 , requireHaskellPlatform = True
24 , excludedPackages = empty
25 , flags = Set.fromList $ words "blaze_html_0_5"
26 , allowedPackage = const $ Right ()
29select :: SelectSettings -> IO BuildPlan
31 ii <- getInstallInfo settings'
34 case iiBuildTools ii of
35 Left s -> error $ "Could not topologically sort build tools: " ++ s
40 , bpPackages = iiPackages ii
41 , bpOptionalCore = iiOptionalCore ii
45-- | Get all of the build tools required.
46iiBuildTools :: InstallInfo -> Either String [String]
47iiBuildTools InstallInfo { iiPackageDB = PackageDB m, iiPackages = packages } =
48 fmap (map packageVersionString)
51 $ filter (flip Set.notMember coreTools . fst)
54 $ mapMaybe (flip Map.lookup buildToolMap)
59 $ Map.filterWithKey isSelected m
61 isSelected name _ = name `Set.member` selected
62 selected = Set.fromList $ Map.keys packages
64 -- Build tools shipped with GHC which we should not attempt to build
66 coreTools = Set.fromList $ map PackageName $ words "hsc2hs"
68 -- The map from build tool name to the package it comes from.
69 buildToolMap :: Map Executable (PackageName, Version)
70 buildToolMap = Map.unions $ map toBuildToolMap $ Map.toList m
72 toBuildToolMap :: (PackageName, PackageInfo) -> Map Executable (PackageName, Version)
73 toBuildToolMap (pn, pi) = Map.unions
74 $ map (flip Map.singleton (pn, piVersion pi))
78 addDependencies :: (PackageName, Version) -> ((PackageName, Version), Set (PackageName, Version))
79 addDependencies (pn, pv) =
83 case Map.lookup pn m of
85 Just pi -> Set.fromList
86 $ mapMaybe (flip Map.lookup buildToolMap)
90topSort :: (Show a, Ord a) => [(a, Set a)] -> Either String [a]
92 uncurry go . partitionEithers . map (splitter . limitDeps) $ orig
96 | otherwise = Right (x, y)
99 go [] y = Left $ "The following form a cycle: " ++ show (map fst y)
101 let (xs', ys') = partitionEithers $ map (splitter . dropDep x) ys
102 rest <- go (xs ++ xs') ys'
105 dropDep x (y, z) = (y, Set.delete x z)
107 allVertices = Set.fromList $ map fst orig
108 limitDeps (x, y) = (x, Set.intersection allVertices y)
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