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 , disabledFlags = Set.fromList $ words "bytestring-in-base"
27 , allowedPackage = const $ Right ()
28 , useGlobalDatabase = False
31select :: SelectSettings -> IO BuildPlan
33 ii <- getInstallInfo settings'
36 case iiBuildTools ii of
37 Left s -> error $ "Could not topologically sort build tools: " ++ s
42 , bpPackages = iiPackages ii
43 , bpOptionalCore = iiOptionalCore ii
47-- | Get all of the build tools required.
48iiBuildTools :: InstallInfo -> Either String [String]
49iiBuildTools InstallInfo { iiPackageDB = PackageDB m, iiPackages = packages } =
50 fmap (map packageVersionString)
53 $ filter (flip Set.notMember coreTools . fst)
56 $ mapMaybe (flip Map.lookup buildToolMap)
61 $ Map.filterWithKey isSelected m
63 isSelected name _ = name `Set.member` selected
64 selected = Set.fromList $ Map.keys packages
66 -- Build tools shipped with GHC which we should not attempt to build
68 coreTools = Set.fromList $ map PackageName $ words "hsc2hs"
70 -- The map from build tool name to the package it comes from.
71 buildToolMap :: Map Executable (PackageName, Version)
72 buildToolMap = Map.unions $ map toBuildToolMap $ Map.toList m
74 toBuildToolMap :: (PackageName, PackageInfo) -> Map Executable (PackageName, Version)
75 toBuildToolMap (pn, pi) = Map.unions
76 $ map (flip Map.singleton (pn, piVersion pi))
80 addDependencies :: (PackageName, Version) -> ((PackageName, Version), Set (PackageName, Version))
81 addDependencies (pn, pv) =
85 case Map.lookup pn m of
87 Just pi -> Set.fromList
88 $ mapMaybe (flip Map.lookup buildToolMap)
92topSort :: (Show a, Ord a) => [(a, Set a)] -> Either String [a]
94 uncurry go . partitionEithers . map (splitter . limitDeps) $ orig
98 | otherwise = Right (x, y)
101 go [] y = Left $ "The following form a cycle: " ++ show (map fst y)
103 let (xs', ys') = partitionEithers $ map (splitter . dropDep x) ys
104 rest <- go (xs ++ xs') ys'
107 dropDep x (y, z) = (y, Set.delete x z)
109 allVertices = Set.fromList $ map fst orig
110 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