on master help sign in
Provide --exclude option (#7)
e453fedMichael Snoyman
Stackage/Build.hs+2
@@ -19,6 +19,7 @@ import System.Process (runProcess, waitForProcess, rawSystem, re
19import System.Directory (createDirectoryIfMissing, canonicalizePath, doesDirectoryExist)
19import System.Directory (createDirectoryIfMissing, canonicalizePath, doesDirectoryExist)
20import Distribution.Version (thisVersion, withinRange)
20import Distribution.Version (thisVersion, withinRange)
21import Control.Exception (assert)
21import Control.Exception (assert)
22+import Data.Set (empty)
22
23
23defaultBuildSettings :: BuildSettings
24defaultBuildSettings :: BuildSettings
24defaultBuildSettings = BuildSettings
25defaultBuildSettings = BuildSettings
@@ -31,6 +32,7 @@ defaultBuildSettings = BuildSettings
31 , haskellPlatformCabal = "haskell-platform/haskell-platform.cabal"
32 , haskellPlatformCabal = "haskell-platform/haskell-platform.cabal"
32 , requireHaskellPlatform = True
33 , requireHaskellPlatform = True
33 , cleanBeforeBuild = True
34 , cleanBeforeBuild = True
35+ , excludedPackages = empty
34 }
36 }
35
37
36build :: BuildSettings -> IO ()
38build :: BuildSettings -> IO ()
Stackage/InstallInfo.hs+8−1
@@ -13,12 +13,19 @@ import Stackage.Types
13import Stackage.Util
13import Stackage.Util
14import Data.Version (showVersion)
14import Data.Version (showVersion)
15
15
16+dropExcluded :: BuildSettings
17+ -> Map PackageName (VersionRange, Maintainer)
18+ -> Map PackageName (VersionRange, Maintainer)
19+dropExcluded bs m0 =
20+ Set.foldl' (flip Map.delete) m0 (excludedPackages bs)
21+
16getInstallInfo :: BuildSettings -> IO InstallInfo
22getInstallInfo :: BuildSettings -> IO InstallInfo
17getInstallInfo settings = do
23getInstallInfo settings = do
18 hp <- loadHaskellPlatform settings
24 hp <- loadHaskellPlatform settings
19− let allPackages
25+ let allPackages'
20 | requireHaskellPlatform settings = Map.union (stablePackages settings) $ identsToRanges (hplibs hp)
26 | requireHaskellPlatform settings = Map.union (stablePackages settings) $ identsToRanges (hplibs hp)
21 | otherwise = stablePackages settings
27 | otherwise = stablePackages settings
28+ allPackages = dropExcluded settings allPackages'
22 let totalCore = extraCore settings `Set.union` Set.map (\(PackageIdentifier p _) -> p) (hpcore hp)
29 let totalCore = extraCore settings `Set.union` Set.map (\(PackageIdentifier p _) -> p) (hpcore hp)
23 pdb <- loadPackageDB totalCore allPackages
30 pdb <- loadPackageDB totalCore allPackages
24 final <- narrowPackageDB pdb $ Set.fromList $ Map.toList $ Map.map snd $ allPackages
31 final <- narrowPackageDB pdb $ Set.fromList $ Map.toList $ Map.map snd $ allPackages
Stackage/Types.hs+4
@@ -64,4 +64,8 @@ data BuildSettings = BuildSettings
64 , haskellPlatformCabal :: FilePath
64 , haskellPlatformCabal :: FilePath
65 , requireHaskellPlatform :: Bool
65 , requireHaskellPlatform :: Bool
66 , cleanBeforeBuild :: Bool
66 , cleanBeforeBuild :: Bool
67+ , excludedPackages :: Set PackageName
68+ -- ^ Packages which should be dropped from the list of stable packages,
69+ -- even if present via the Haskell Platform or @stablePackages@. If these
70+ -- packages are dependencies of others, they will still be included.
67 }
71 }
app/stackage.hs+25−4
@@ -1,14 +1,34 @@
1+{-# LANGUAGE RecordWildCards #-}
1−import Stackage.Types (BuildSettings(..))
2+import Stackage.Types
2import Stackage.Build (build, defaultBuildSettings)
3import Stackage.Build (build, defaultBuildSettings)
3import Stackage.Init (stackageInit)
4import Stackage.Init (stackageInit)
4import System.Environment (getArgs, getProgName)
5import System.Environment (getArgs, getProgName)
6+import Data.Set (fromList)
7+
8+data BuildArgs = BuildArgs
9+ { noClean :: Bool
10+ , excluded :: [String]
11+ }
12+
13+parseBuildArgs :: [String] -> IO BuildArgs
14+parseBuildArgs =
15+ loop $ BuildArgs False []
16+ where
17+ loop x [] = return x
18+ loop x ("--no-clean":rest) = loop x { noClean = True } rest
19+ loop x ("--exclude":y:rest) = loop x { excluded = y : excluded x } rest
20+ loop _ (y:_) = error $ "Did not understand argument: " ++ y
5
21
6main :: IO ()
22main :: IO ()
7main = do
23main = do
8 args <- getArgs
24 args <- getArgs
9 case args of
25 case args of
10− ["build"] -> build defaultBuildSettings
26+ "build":rest -> do
27+ BuildArgs {..} <- parseBuildArgs rest
11− ["build", "--no-clean"] -> build (defaultBuildSettings { cleanBeforeBuild = False })
28+ build defaultBuildSettings
29+ { cleanBeforeBuild = not noClean
30+ , excludedPackages = fromList $ map PackageName excluded
31+ }
12 ["init"] -> stackageInit
32 ["init"] -> stackageInit
13 ["update"] -> stackageInit >> error "FIXME update"
33 ["update"] -> stackageInit >> error "FIXME update"
14 _ -> do
34 _ -> do
@@ -17,4 +37,5 @@ main = do
17 putStrLn "Available commands:"
37 putStrLn "Available commands:"
18 putStrLn " update Download updated Stackage databases. Automatically calls init."
38 putStrLn " update Download updated Stackage databases. Automatically calls init."
19 putStrLn " init Initialize your cabal file to use Stackage"
39 putStrLn " init Initialize your cabal file to use Stackage"
40+ putStrLn " build [--no-clean] [--exclude package...]"
20− putStrLn " build [--no-clean] Build the package databases (maintainers only)"
41+ putStrLn " Build the package databases (maintainers only)"
stackage.cabal+1
@@ -39,6 +39,7 @@ executable stackage
39 main-is: stackage.hs
39 main-is: stackage.hs
40 build-depends: base
40 build-depends: base
41 , stackage
41 , stackage
42+ , containers
42
43
43source-repository head
44source-repository head
44 type: git
45 type: git