1{-# LANGUAGE RecordWildCards #-}
2import Data.Set (fromList)
3import Stackage.Build (build, defaultBuildSettings)
4import Stackage.BuildPlan (readBuildPlan, writeBuildPlan)
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.Uploads (checkUploads, printForbidden)
13import Stackage.Util (allowPermissive)
14import System.Environment (getArgs, getProgName)
15import System.IO (hFlush, stdout)
17data SelectArgs = SelectArgs
18 { excluded :: [String]
20 , onlyPermissive :: Bool
22 , buildPlanDest :: FilePath
26parseSelectArgs :: [String] -> IO SelectArgs
31 , onlyPermissive = False
33 , buildPlanDest = defaultBuildPlan
38 loop x ("--exclude":y:rest) = loop x { excluded = y : excluded x } rest
39 loop x ("--no-platform":rest) = loop x { noPlatform = True } rest
40 loop x ("--only-permissive":rest) = loop x { onlyPermissive = True } rest
41 loop x ("--allow":y:rest) = loop x { allowed = y : allowed x } rest
42 loop x ("--build-plan":y:rest) = loop x { buildPlanDest = y } rest
43 loop x ("--use-global-db":rest) = loop x { globalDB = True } rest
44 loop _ (y:_) = error $ "Did not understand argument: " ++ y
46data BuildArgs = BuildArgs
48 , buildPlanSrc :: FilePath
49 , extraArgs' :: [String] -> [String]
53parseBuildArgs :: GhcMajorVersion -> [String] -> IO BuildArgs
54parseBuildArgs version =
56 { sandbox = sandboxRoot $ defaultBuildSettings version
57 , buildPlanSrc = defaultBuildPlan
63 loop x ("--sandbox":y:rest) = loop x { sandbox = y } rest
64 loop x ("--build-plan":y:rest) = loop x { buildPlanSrc = y } rest
65 loop x ("--arg":y:rest) = loop x { extraArgs' = extraArgs' x . (y:) } rest
66 loop x ("--no-docs":rest) = loop x { noDocs = True } rest
67 loop _ (y:_) = error $ "Did not understand argument: " ++ y
69defaultBuildPlan :: FilePath
70defaultBuildPlan = "build-plan.txt"
72withBuildSettings :: [String] -> (BuildSettings -> BuildPlan -> IO a) -> IO a
73withBuildSettings args f = do
74 version <- getGhcVersion
75 BuildArgs {..} <- parseBuildArgs version args
76 bp <- readBuildPlan buildPlanSrc
77 let settings = (defaultBuildSettings version)
78 { sandboxRoot = sandbox
79 , extraArgs = extraArgs' . extraArgs (defaultBuildSettings version)
80 , buildDocs = not noDocs
88 ["uploads"] -> checkUploads "allowed.txt" "new-allowed.txt" >>= printForbidden
90 SelectArgs {..} <- parseSelectArgs rest
91 ghcVersion <- getGhcVersion
93 (defaultSelectSettings ghcVersion)
94 { excludedPackages = fromList $ map PackageName excluded
95 , requireHaskellPlatform = not noPlatform
98 then allowPermissive allowed
100 , useGlobalDatabase = globalDB
102 writeBuildPlan buildPlanDest bp
103 ("check":rest) -> withBuildSettings rest checkPlan
104 ("build":rest) -> withBuildSettings rest build
105 ("test":rest) -> withBuildSettings rest runTestSuites
106 ("tarballs":rest) -> withBuildSettings rest $ const makeTarballs
108 putStrLn "Note: init isn't really ready for prime time use."
109 putStrLn "Using it may make it impossible to build stackage."
110 putStr "Are you sure you want continue (y/n)? "
114 c:_ | c `elem` "yY" -> stackageInit
115 _ -> putStrLn "Probably a good decision, exiting."
116 ["update"] -> stackageInit >> error "FIXME update"
119 putStrLn $ "Usage: " ++ pn ++ " <command>"
120 putStrLn "Available commands:"
121 --putStrLn " update Download updated Stackage databases. Automatically calls init."
122 --putStrLn " init Initialize your cabal file to use Stackage"
124 putStrLn " select [--no-clean] [--no-platform] [--exclude package...] [--only-permissive] [--allow package] [--build-plan file]"
125 putStrLn " check [--build-plan file] [--sandbox rootdir] [--arg cabal-arg]"
126 putStrLn " build [--build-plan file] [--sandbox rootdir] [--arg cabal-arg]"
127 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