@@ -3,24 +3,31 @@ import Stackage.Types
33import Stackage.Build (build, defaultBuildSettings)
44import Stackage.Init (stackageInit)
55import Stackage.Util (allowPermissive)
6+import Stackage.Select (defaultSelectSettings, select)
7+import Stackage.CheckPlan (checkPlan)
68import System.Environment (getArgs, getProgName)
79import Data.Set (fromList)
810import System.IO (hFlush, stdout)
11+import Stackage.BuildPlan (readBuildPlan, writeBuildPlan)
12+import Stackage.Test (runTestSuites)
13+import Stackage.Tarballs (makeTarballs)
914
10−data BuildArgs = BuildArgs
15+data SelectArgs = SelectArgs
1116 { excluded :: [String]
1217 , noPlatform :: Bool
1318 , onlyPermissive :: Bool
1419 , allowed :: [String]
20+ , buildPlanDest :: FilePath
1521 }
1622
17−parseBuildArgs :: [String] -> IO BuildArgs
18−parseBuildArgs =
19− loop BuildArgs
23+parseSelectArgs :: [String] -> IO SelectArgs
24+parseSelectArgs =
25+ loop SelectArgs
2026 { excluded = []
2127 , noPlatform = False
2228 , onlyPermissive = False
2329 , allowed = []
30+ , buildPlanDest = defaultBuildPlan
2431 }
2532 where
2633 loop x [] = return x
@@ -28,22 +35,35 @@ parseBuildArgs =
2835 loop x ("--no-platform":rest) = loop x { noPlatform = True } rest
2936 loop x ("--only-permissive":rest) = loop x { onlyPermissive = True } rest
3037 loop x ("--allow":y:rest) = loop x { allowed = y : allowed x } rest
38+ loop x ("--build-plan":y:rest) = loop x { buildPlanDest = y } rest
3139 loop _ (y:_) = error $ "Did not understand argument: " ++ y
3240
41+defaultBuildPlan :: FilePath
42+defaultBuildPlan = "build-plan.txt"
43+
3344main :: IO ()
3445main = do
3546 args <- getArgs
3647 case args of
37− "build":rest -> do
38− BuildArgs {..} <- parseBuildArgs rest
39− build defaultBuildSettings
40− { excludedPackages = fromList $ map PackageName excluded
41− , requireHaskellPlatform = not noPlatform
42− , allowedPackage =
43− if onlyPermissive
44− then allowPermissive allowed
45− else const $ Right ()
46− }
48+ "select":rest -> do
49+ SelectArgs {..} <- parseSelectArgs rest
50+ bp <- select
51+ defaultSelectSettings
52+ { excludedPackages = fromList $ map PackageName excluded
53+ , requireHaskellPlatform = not noPlatform
54+ , allowedPackage =
55+ if onlyPermissive
56+ then allowPermissive allowed
57+ else const $ Right ()
58+ }
59+ writeBuildPlan buildPlanDest bp
60+ ["check"] -> checkHelper defaultBuildPlan
61+ ["check", fp] -> checkHelper fp
62+ ["build"] -> buildHelper defaultBuildPlan
63+ ["build", fp] -> buildHelper fp
64+ ["test"] -> testHelper defaultBuildPlan
65+ ["test", fp] -> testHelper fp
66+ ["tarballs"] -> tbHelper defaultBuildPlan
4767 ["init"] -> do
4868 putStrLn "Note: init isn't really ready for prime time use."
4969 putStrLn "Using it may make it impossible to build stackage."
@@ -58,7 +78,14 @@ main = do
5878 pn <- getProgName
5979 putStrLn $ "Usage: " ++ pn ++ " <command>"
6080 putStrLn "Available commands:"
61− putStrLn " update Download updated Stackage databases. Automatically calls init."
62− putStrLn " init Initialize your cabal file to use Stackage"
63− putStrLn " build [--no-clean] [--no-platform] [--exclude package...] [--only-permissive] [--allow package]"
64− putStrLn " Build the package databases (maintainers only)"
81+ --putStrLn " update Download updated Stackage databases. Automatically calls init."
82+ --putStrLn " init Initialize your cabal file to use Stackage"
83+ putStrLn " select [--no-clean] [--no-platform] [--exclude package...] [--only-permissive] [--allow package] [--build-plan file]"
84+ putStrLn " check [build plan file]"
85+ putStrLn " build [build plan file]"
86+ putStrLn " test [build plan file]"
87+ where
88+ checkHelper fp = readBuildPlan fp >>= checkPlan
89+ buildHelper fp = readBuildPlan fp >>= build defaultBuildSettings
90+ testHelper fp = readBuildPlan fp >>= runTestSuites defaultBuildSettings
91+ tbHelper fp = readBuildPlan fp >>= makeTarballs