diff --git a/Stackage/BuildPlan.hs b/Stackage/BuildPlan.hs index d9ea81b9..f888356d 100644 --- a/Stackage/BuildPlan.hs +++ b/Stackage/BuildPlan.hs @@ -4,6 +4,7 @@ module Stackage.BuildPlan ( readBuildPlan , writeBuildPlan + , writeBuildPlanCsv ) where import qualified Data.Map as Map @@ -155,3 +156,26 @@ getSection title orig = if null z then return y else Left $ "Unconsumed input on line: " ++ x + +-- | Used for Hackage distribution purposes. +writeBuildPlanCsv :: FilePath -> BuildPlan -> IO () +writeBuildPlanCsv fp bp = + -- Obviously a proper CSV library should be used... but we're minimizing + -- deps + System.IO.UTF8.writeFile fp $ unlines $ map toRow $ Map.toList fullMap + where + fullMap = Map.unions + [ fmap spiVersion $ bpPackages bp + , Map.mapMaybe id $ bpCore bp + , bpOptionalCore bp + ] + + toRow (PackageName name, version) = concat + [ "\"" + , name + , "\",\"" + , display version + , "\",\"http://www.stackage.org/package/" + , name + , "\"" + ] diff --git a/app/stackage.hs b/app/stackage.hs index 8182f67f..67f37488 100644 --- a/app/stackage.hs +++ b/app/stackage.hs @@ -1,7 +1,7 @@ {-# LANGUAGE RecordWildCards #-} import Data.Set (fromList) import Stackage.Build (build, defaultBuildSettings) -import Stackage.BuildPlan (readBuildPlan, writeBuildPlan) +import Stackage.BuildPlan (readBuildPlan, writeBuildPlan, writeBuildPlanCsv) import Stackage.CheckPlan (checkPlan) import Stackage.GhcPkg (getGhcVersion) import Stackage.Init (stackageInit) @@ -20,6 +20,7 @@ data SelectArgs = SelectArgs , onlyPermissive :: Bool , allowed :: [String] , buildPlanDest :: FilePath + , buildPlanCsvDest :: FilePath , globalDB :: Bool } @@ -32,6 +33,7 @@ parseSelectArgs = , onlyPermissive = False , allowed = [] , buildPlanDest = defaultBuildPlan + , buildPlanCsvDest = defaultBuildPlanCsv , globalDB = False } where @@ -43,6 +45,7 @@ parseSelectArgs = loop x ("--only-permissive":rest) = loop x { onlyPermissive = True } rest loop x ("--allow":y:rest) = loop x { allowed = y : allowed x } rest loop x ("--build-plan":y:rest) = loop x { buildPlanDest = y } rest + loop x ("--build-plan-csv":y:rest) = loop x { buildPlanCsvDest = y } rest loop x ("--use-global-db":rest) = loop x { globalDB = True } rest loop _ (y:_) = error $ "Did not understand argument: " ++ y @@ -78,6 +81,9 @@ parseBuildArgs version = defaultBuildPlan :: FilePath defaultBuildPlan = "build-plan.txt" +defaultBuildPlanCsv :: FilePath +defaultBuildPlanCsv = "build-plan.csv" + withBuildSettings :: [String] -> (BuildSettings -> BuildPlan -> IO a) -> IO a withBuildSettings args f = do version <- getGhcVersion @@ -114,6 +120,7 @@ main = do , useGlobalDatabase = globalDB } writeBuildPlan buildPlanDest bp + writeBuildPlanCsv buildPlanCsvDest bp ("check":rest) -> withBuildSettings rest checkPlan ("build":rest) -> withBuildSettings rest build ("test":rest) -> withBuildSettings rest runTestSuites diff --git a/stackage-upload.hs b/stackage-upload.hs index bc385f44..7833f7b3 100644 --- a/stackage-upload.hs +++ b/stackage-upload.hs @@ -1,6 +1,7 @@ {-# LANGUAGE OverloadedStrings #-} import Control.Monad (filterM, when) import qualified Data.ByteString.Char8 as S8 +import qualified Data.ByteString.Lazy as L import Data.List (isInfixOf, isPrefixOf, sort) import Network.HTTP.Client @@ -32,6 +33,7 @@ main = withManager defaultManagerSettings $ \m -> do exitFailure let uploadDocs = "exclusive" `isInfixOf` alias + uploadHackageDistro = alias == "unstable-ghc78-exclusive" putStrLn $ concat [ "Uploading " @@ -103,6 +105,15 @@ main = withManager defaultManagerSettings $ \m -> do } httpLbs req3 m >>= print + when uploadHackageDistro $ do + lbs <- L.readFile $ takeDirectory filepath > "build-plan.csv" + let req = "http://hackage.haskell.org/distro/Stackage/packages.csv" + { requestHeaders = [("Content-Type", "text/csv")] + , requestBody = RequestBodyLBS lbs + , checkStatus = \_ _ _ -> Nothing + } + httpLbs req m >>= print + mkIndex :: String -> [String] -> String mkIndex snapid dirs = concat [ "\n