Upload as a Hackage distribution

This commit is contained in:
Michael Snoyman 2014-10-31 12:43:03 +02:00
parent bd6c3b57bb
commit 24d0c3b4d7
3 changed files with 43 additions and 1 deletions

View File

@ -4,6 +4,7 @@
module Stackage.BuildPlan module Stackage.BuildPlan
( readBuildPlan ( readBuildPlan
, writeBuildPlan , writeBuildPlan
, writeBuildPlanCsv
) where ) where
import qualified Data.Map as Map import qualified Data.Map as Map
@ -155,3 +156,26 @@ getSection title orig =
if null z if null z
then return y then return y
else Left $ "Unconsumed input on line: " ++ x 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
, "\""
]

View File

@ -1,7 +1,7 @@
{-# LANGUAGE RecordWildCards #-} {-# LANGUAGE RecordWildCards #-}
import Data.Set (fromList) import Data.Set (fromList)
import Stackage.Build (build, defaultBuildSettings) import Stackage.Build (build, defaultBuildSettings)
import Stackage.BuildPlan (readBuildPlan, writeBuildPlan) import Stackage.BuildPlan (readBuildPlan, writeBuildPlan, writeBuildPlanCsv)
import Stackage.CheckPlan (checkPlan) import Stackage.CheckPlan (checkPlan)
import Stackage.GhcPkg (getGhcVersion) import Stackage.GhcPkg (getGhcVersion)
import Stackage.Init (stackageInit) import Stackage.Init (stackageInit)
@ -20,6 +20,7 @@ data SelectArgs = SelectArgs
, onlyPermissive :: Bool , onlyPermissive :: Bool
, allowed :: [String] , allowed :: [String]
, buildPlanDest :: FilePath , buildPlanDest :: FilePath
, buildPlanCsvDest :: FilePath
, globalDB :: Bool , globalDB :: Bool
} }
@ -32,6 +33,7 @@ parseSelectArgs =
, onlyPermissive = False , onlyPermissive = False
, allowed = [] , allowed = []
, buildPlanDest = defaultBuildPlan , buildPlanDest = defaultBuildPlan
, buildPlanCsvDest = defaultBuildPlanCsv
, globalDB = False , globalDB = False
} }
where where
@ -43,6 +45,7 @@ parseSelectArgs =
loop x ("--only-permissive":rest) = loop x { onlyPermissive = True } rest loop x ("--only-permissive":rest) = loop x { onlyPermissive = True } rest
loop x ("--allow":y:rest) = loop x { allowed = y : allowed x } 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":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 x ("--use-global-db":rest) = loop x { globalDB = True } rest
loop _ (y:_) = error $ "Did not understand argument: " ++ y loop _ (y:_) = error $ "Did not understand argument: " ++ y
@ -78,6 +81,9 @@ parseBuildArgs version =
defaultBuildPlan :: FilePath defaultBuildPlan :: FilePath
defaultBuildPlan = "build-plan.txt" defaultBuildPlan = "build-plan.txt"
defaultBuildPlanCsv :: FilePath
defaultBuildPlanCsv = "build-plan.csv"
withBuildSettings :: [String] -> (BuildSettings -> BuildPlan -> IO a) -> IO a withBuildSettings :: [String] -> (BuildSettings -> BuildPlan -> IO a) -> IO a
withBuildSettings args f = do withBuildSettings args f = do
version <- getGhcVersion version <- getGhcVersion
@ -114,6 +120,7 @@ main = do
, useGlobalDatabase = globalDB , useGlobalDatabase = globalDB
} }
writeBuildPlan buildPlanDest bp writeBuildPlan buildPlanDest bp
writeBuildPlanCsv buildPlanCsvDest bp
("check":rest) -> withBuildSettings rest checkPlan ("check":rest) -> withBuildSettings rest checkPlan
("build":rest) -> withBuildSettings rest build ("build":rest) -> withBuildSettings rest build
("test":rest) -> withBuildSettings rest runTestSuites ("test":rest) -> withBuildSettings rest runTestSuites

View File

@ -1,6 +1,7 @@
{-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE OverloadedStrings #-}
import Control.Monad (filterM, when) import Control.Monad (filterM, when)
import qualified Data.ByteString.Char8 as S8 import qualified Data.ByteString.Char8 as S8
import qualified Data.ByteString.Lazy as L
import Data.List (isInfixOf, isPrefixOf, import Data.List (isInfixOf, isPrefixOf,
sort) sort)
import Network.HTTP.Client import Network.HTTP.Client
@ -32,6 +33,7 @@ main = withManager defaultManagerSettings $ \m -> do
exitFailure exitFailure
let uploadDocs = "exclusive" `isInfixOf` alias let uploadDocs = "exclusive" `isInfixOf` alias
uploadHackageDistro = alias == "unstable-ghc78-exclusive"
putStrLn $ concat putStrLn $ concat
[ "Uploading " [ "Uploading "
@ -103,6 +105,15 @@ main = withManager defaultManagerSettings $ \m -> do
} }
httpLbs req3 m >>= print 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 :: String -> [String] -> String
mkIndex snapid dirs = concat mkIndex snapid dirs = concat
[ "<!DOCTYPE html>\n<html lang='en'><head><title>Haddocks index</title>" [ "<!DOCTYPE html>\n<html lang='en'><head><title>Haddocks index</title>"