@@ -3,24 +3,31 @@ import Stackage.Types
3import Stackage.Build (build, defaultBuildSettings)
3import Stackage.Build (build, defaultBuildSettings)
4import Stackage.Init (stackageInit)
4import Stackage.Init (stackageInit)
5import Stackage.Util (allowPermissive)
5import Stackage.Util (allowPermissive)
6+import Stackage.Select (defaultSelectSettings, select)
7+import Stackage.CheckPlan (checkPlan)
6import System.Environment (getArgs, getProgName)
8import System.Environment (getArgs, getProgName)
7import Data.Set (fromList)
9import Data.Set (fromList)
8import System.IO (hFlush, stdout)
10import System.IO (hFlush, stdout)
11+import Stackage.BuildPlan (readBuildPlan, writeBuildPlan)
12+import Stackage.Test (runTestSuites)
13+import Stackage.Tarballs (makeTarballs)
10−data BuildArgs = BuildArgs
15+data SelectArgs = SelectArgs
11 { excluded :: [String]
16 { excluded :: [String]
12 , noPlatform :: Bool
17 , noPlatform :: Bool
13 , onlyPermissive :: Bool
18 , onlyPermissive :: Bool
14 , allowed :: [String]
19 , allowed :: [String]
20+ , buildPlanDest :: FilePath
17−parseBuildArgs :: [String] -> IO BuildArgs
23+parseSelectArgs :: [String] -> IO SelectArgs
18−parseBuildArgs =
24+parseSelectArgs =
19− loop BuildArgs
25+ loop SelectArgs
20 { excluded = []
26 { excluded = []
21 , noPlatform = False
27 , noPlatform = False
22 , onlyPermissive = False
28 , onlyPermissive = False
23 , allowed = []
29 , allowed = []
30+ , buildPlanDest = defaultBuildPlan
26 loop x [] = return x
33 loop x [] = return x
@@ -28,22 +35,35 @@ parseBuildArgs =
28 loop x ("--no-platform":rest) = loop x { noPlatform = True } rest
35 loop x ("--no-platform":rest) = loop x { noPlatform = True } rest
29 loop x ("--only-permissive":rest) = loop x { onlyPermissive = True } rest
36 loop x ("--only-permissive":rest) = loop x { onlyPermissive = True } rest
30 loop x ("--allow":y:rest) = loop x { allowed = y : allowed x } rest
37 loop x ("--allow":y:rest) = loop x { allowed = y : allowed x } rest
38+ loop x ("--build-plan":y:rest) = loop x { buildPlanDest = y } rest
31 loop _ (y:_) = error $ "Did not understand argument: " ++ y
39 loop _ (y:_) = error $ "Did not understand argument: " ++ y
41+defaultBuildPlan :: FilePath
42+defaultBuildPlan = "build-plan.txt"
33main :: IO ()
44main :: IO ()
35 args <- getArgs
46 args <- getArgs
36 case args of
47 case args of
37− "build":rest -> do
48+ "select":rest -> do
38− BuildArgs {..} <- parseBuildArgs rest
49+ SelectArgs {..} <- parseSelectArgs rest
39− build defaultBuildSettings
50+ bp <- select
51+ defaultSelectSettings
40− { excludedPackages = fromList $ map PackageName excluded
52+ { excludedPackages = fromList $ map PackageName excluded
41− , requireHaskellPlatform = not noPlatform
53+ , requireHaskellPlatform = not noPlatform
42− , allowedPackage =
54+ , allowedPackage =
43− if onlyPermissive
55+ if onlyPermissive
44− then allowPermissive allowed
56+ then allowPermissive allowed
45− else const $ Right ()
57+ else const $ Right ()
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
47 ["init"] -> do
67 ["init"] -> do
48 putStrLn "Note: init isn't really ready for prime time use."
68 putStrLn "Note: init isn't really ready for prime time use."
49 putStrLn "Using it may make it impossible to build stackage."
69 putStrLn "Using it may make it impossible to build stackage."
@@ -58,7 +78,14 @@ main = do
58 pn <- getProgName
78 pn <- getProgName
59 putStrLn $ "Usage: " ++ pn ++ " <command>"
79 putStrLn $ "Usage: " ++ pn ++ " <command>"
60 putStrLn "Available commands:"
80 putStrLn "Available commands:"
61− putStrLn " update Download updated Stackage databases. Automatically calls init."
81+ --putStrLn " update Download updated Stackage databases. Automatically calls init."
62− putStrLn " init Initialize your cabal file to use Stackage"
82+ --putStrLn " init Initialize your cabal file to use Stackage"
63− putStrLn " build [--no-clean] [--no-platform] [--exclude package...] [--only-permissive] [--allow package]"
83+ putStrLn " select [--no-clean] [--no-platform] [--exclude package...] [--only-permissive] [--allow package] [--build-plan file]"
64− putStrLn " Build the package databases (maintainers only)"
84+ putStrLn " check [build plan file]"
85+ putStrLn " build [build plan file]"
86+ putStrLn " test [build plan file]"
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