Provide --exclude option (#7)

This commit is contained in:
Michael Snoyman 2012-12-03 10:57:12 +02:00
parent a549ecbdc2
commit e453fed90c
5 changed files with 40 additions and 5 deletions

View File

@ -19,6 +19,7 @@ import System.Process (runProcess, waitForProcess, rawSystem, re
import System.Directory (createDirectoryIfMissing, canonicalizePath, doesDirectoryExist) import System.Directory (createDirectoryIfMissing, canonicalizePath, doesDirectoryExist)
import Distribution.Version (thisVersion, withinRange) import Distribution.Version (thisVersion, withinRange)
import Control.Exception (assert) import Control.Exception (assert)
import Data.Set (empty)
defaultBuildSettings :: BuildSettings defaultBuildSettings :: BuildSettings
defaultBuildSettings = BuildSettings defaultBuildSettings = BuildSettings
@ -31,6 +32,7 @@ defaultBuildSettings = BuildSettings
, haskellPlatformCabal = "haskell-platform/haskell-platform.cabal" , haskellPlatformCabal = "haskell-platform/haskell-platform.cabal"
, requireHaskellPlatform = True , requireHaskellPlatform = True
, cleanBeforeBuild = True , cleanBeforeBuild = True
, excludedPackages = empty
} }
build :: BuildSettings -> IO () build :: BuildSettings -> IO ()

View File

@ -13,12 +13,19 @@ import Stackage.Types
import Stackage.Util import Stackage.Util
import Data.Version (showVersion) import Data.Version (showVersion)
dropExcluded :: BuildSettings
-> Map PackageName (VersionRange, Maintainer)
-> Map PackageName (VersionRange, Maintainer)
dropExcluded bs m0 =
Set.foldl' (flip Map.delete) m0 (excludedPackages bs)
getInstallInfo :: BuildSettings -> IO InstallInfo getInstallInfo :: BuildSettings -> IO InstallInfo
getInstallInfo settings = do getInstallInfo settings = do
hp <- loadHaskellPlatform settings hp <- loadHaskellPlatform settings
let allPackages let allPackages'
| requireHaskellPlatform settings = Map.union (stablePackages settings) $ identsToRanges (hplibs hp) | requireHaskellPlatform settings = Map.union (stablePackages settings) $ identsToRanges (hplibs hp)
| otherwise = stablePackages settings | otherwise = stablePackages settings
allPackages = dropExcluded settings allPackages'
let totalCore = extraCore settings `Set.union` Set.map (\(PackageIdentifier p _) -> p) (hpcore hp) let totalCore = extraCore settings `Set.union` Set.map (\(PackageIdentifier p _) -> p) (hpcore hp)
pdb <- loadPackageDB totalCore allPackages pdb <- loadPackageDB totalCore allPackages
final <- narrowPackageDB pdb $ Set.fromList $ Map.toList $ Map.map snd $ allPackages final <- narrowPackageDB pdb $ Set.fromList $ Map.toList $ Map.map snd $ allPackages

View File

@ -64,4 +64,8 @@ data BuildSettings = BuildSettings
, haskellPlatformCabal :: FilePath , haskellPlatformCabal :: FilePath
, requireHaskellPlatform :: Bool , requireHaskellPlatform :: Bool
, cleanBeforeBuild :: Bool , cleanBeforeBuild :: Bool
, excludedPackages :: Set PackageName
-- ^ Packages which should be dropped from the list of stable packages,
-- even if present via the Haskell Platform or @stablePackages@. If these
-- packages are dependencies of others, they will still be included.
} }

View File

@ -1,14 +1,34 @@
import Stackage.Types (BuildSettings(..)) {-# LANGUAGE RecordWildCards #-}
import Stackage.Types
import Stackage.Build (build, defaultBuildSettings) import Stackage.Build (build, defaultBuildSettings)
import Stackage.Init (stackageInit) import Stackage.Init (stackageInit)
import System.Environment (getArgs, getProgName) import System.Environment (getArgs, getProgName)
import Data.Set (fromList)
data BuildArgs = BuildArgs
{ noClean :: Bool
, excluded :: [String]
}
parseBuildArgs :: [String] -> IO BuildArgs
parseBuildArgs =
loop $ BuildArgs False []
where
loop x [] = return x
loop x ("--no-clean":rest) = loop x { noClean = True } rest
loop x ("--exclude":y:rest) = loop x { excluded = y : excluded x } rest
loop _ (y:_) = error $ "Did not understand argument: " ++ y
main :: IO () main :: IO ()
main = do main = do
args <- getArgs args <- getArgs
case args of case args of
["build"] -> build defaultBuildSettings "build":rest -> do
["build", "--no-clean"] -> build (defaultBuildSettings { cleanBeforeBuild = False }) BuildArgs {..} <- parseBuildArgs rest
build defaultBuildSettings
{ cleanBeforeBuild = not noClean
, excludedPackages = fromList $ map PackageName excluded
}
["init"] -> stackageInit ["init"] -> stackageInit
["update"] -> stackageInit >> error "FIXME update" ["update"] -> stackageInit >> error "FIXME update"
_ -> do _ -> do
@ -17,4 +37,5 @@ main = do
putStrLn "Available commands:" putStrLn "Available commands:"
putStrLn " update Download updated Stackage databases. Automatically calls init." putStrLn " update Download updated Stackage databases. Automatically calls init."
putStrLn " init Initialize your cabal file to use Stackage" putStrLn " init Initialize your cabal file to use Stackage"
putStrLn " build [--no-clean] Build the package databases (maintainers only)" putStrLn " build [--no-clean] [--exclude package...]"
putStrLn " Build the package databases (maintainers only)"

View File

@ -39,6 +39,7 @@ executable stackage
main-is: stackage.hs main-is: stackage.hs
build-depends: base build-depends: base
, stackage , stackage
, containers
source-repository head source-repository head
type: git type: git