1{-# LANGUAGE RecordWildCards #-}
2import Data.Set (fromList)
3import Stackage.Build (build, defaultBuildSettings)
4import Stackage.BuildPlan (readBuildPlan, writeBuildPlan, writeBuildPlanCsv)
5import Stackage.CheckPlan (checkPlan)
6import Stackage.GhcPkg (getGhcVersion)
7import Stackage.Init (stackageInit)
8import Stackage.Select (defaultSelectSettings, select)
9import Stackage.Tarballs (makeTarballs)
10import Stackage.Test (runTestSuites)
12import Stackage.Util (allowPermissive)
13import System.Environment (getArgs, getProgName)
14import System.IO (hFlush, stdout)
16data SelectArgs = SelectArgs
17 { excluded :: [String]
19 , ignoreUpgradeable :: Bool
20 , onlyPermissive :: Bool
22 , buildPlanDest :: FilePath
23 , buildPlanCsvDest :: FilePath
27parseSelectArgs :: [String] -> IO SelectArgs
32 , ignoreUpgradeable = False
33 , onlyPermissive = False
35 , buildPlanDest = defaultBuildPlan
36 , buildPlanCsvDest = defaultBuildPlanCsv
41 loop x ("--exclude":y:rest) = loop x { excluded = y : excluded x } rest
42 loop x ("--no-platform":rest) = loop x { noPlatform = True } rest
43 loop x ("--platform":rest) = loop x { noPlatform = False } rest
44 loop x ("--ignore-upgradeable":rest) = loop x { ignoreUpgradeable = True } rest
45 loop x ("--only-permissive":rest) = loop x { onlyPermissive = True } rest
46 loop x ("--allow":y:rest) = loop x { allowed = y : allowed x } rest
47 loop x ("--build-plan":y:rest) = loop x { buildPlanDest = y } rest
48 loop x ("--build-plan-csv":y:rest) = loop x { buildPlanCsvDest = y } rest
49 loop x ("--use-global-db":rest) = loop x { globalDB = True } rest
50 loop _ (y:_) = error $ "Did not understand argument: " ++ y
52data BuildArgs = BuildArgs
54 , buildPlanSrc :: FilePath
55 , extraArgs' :: [String] -> [String]
57 , buildCores :: Maybe Int
58 , testThreads :: Maybe Int
61parseBuildArgs :: GhcMajorVersion -> [String] -> IO BuildArgs
62parseBuildArgs version =
64 { sandbox = sandboxRoot $ defaultBuildSettings Nothing version
65 , buildPlanSrc = defaultBuildPlan
68 , buildCores = Nothing
69 , testThreads = Nothing
73 loop x ("--sandbox":y:rest) = loop x { sandbox = y } rest
74 loop x ("--build-plan":y:rest) = loop x { buildPlanSrc = y } rest
75 loop x ("--arg":y:rest) = loop x { extraArgs' = extraArgs' x . (y:) } rest
76 loop x ("--no-docs":rest) = loop x { noDocs = True } rest
77 loop x ("-j":y:rest) = loop x { buildCores = Just $ read y } rest
78 loop x ("--test-threads":y:rest) = loop x { testThreads = Just $ read y } rest
79 loop _ (y:_) = error $ "Did not understand argument: " ++ y
81defaultBuildPlan :: FilePath
82defaultBuildPlan = "build-plan.txt"
84defaultBuildPlanCsv :: FilePath
85defaultBuildPlanCsv = "build-plan.csv"
87withBuildSettings :: [String] -> (BuildSettings -> BuildPlan -> IO a) -> IO a
88withBuildSettings args f = do
89 version <- getGhcVersion
90 BuildArgs {..} <- parseBuildArgs version args
91 bp <- readBuildPlan buildPlanSrc
92 let bs = defaultBuildSettings buildCores version
93 modTestThreads settings' =
96 Just t -> settings' { testWorkerThreads = t }
97 settings = modTestThreads bs
98 { sandboxRoot = sandbox
99 , extraArgs = extraArgs' . extraArgs bs
100 , buildDocs = not noDocs
109 SelectArgs {..} <- parseSelectArgs rest
110 ghcVersion <- getGhcVersion
112 (defaultSelectSettings ghcVersion $ not noPlatform)
113 { excludedPackages = fromList $ map PackageName excluded
114 , requireHaskellPlatform = not noPlatform
115 , ignoreUpgradeableCore = ignoreUpgradeable
118 then allowPermissive allowed
119 else const $ Right ()
120 , useGlobalDatabase = globalDB
122 writeBuildPlan buildPlanDest bp
123 writeBuildPlanCsv buildPlanCsvDest bp
124 ("check":rest) -> withBuildSettings rest checkPlan
125 ("build":rest) -> withBuildSettings rest build
126 ("test":rest) -> withBuildSettings rest runTestSuites
127 ("tarballs":rest) -> withBuildSettings rest $ const makeTarballs
129 putStrLn "Note: init isn't really ready for prime time use."
130 putStrLn "Using it may make it impossible to build stackage."
131 putStr "Are you sure you want continue (y/n)? "
135 c:_ | c `elem` "yY" -> stackageInit
136 _ -> putStrLn "Probably a good decision, exiting."
137 ["update"] -> stackageInit >> error "FIXME update"
140 putStrLn $ "Usage: " ++ pn ++ " <command>"
141 putStrLn "Available commands:"
142 --putStrLn " update Download updated Stackage databases. Automatically calls init."
143 --putStrLn " init Initialize your cabal file to use Stackage"
145 putStrLn " select [--no-clean] [--no-platform] [--exclude package...] [--only-permissive] [--allow package] [--build-plan file]"
146 putStrLn " check [--build-plan file] [--sandbox rootdir] [--arg cabal-arg]"
147 putStrLn " build [--build-plan file] [--sandbox rootdir] [--arg cabal-arg]"
148 putStrLn " test [--build-plan file] [--sandbox rootdir] [--arg cabal-arg] [--no-docs]"
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