on master help sign in
Upload as a Hackage distribution
commit24d0c3b4d7f468cd35fafd3a8a858ae7f35adc2a authorMichael Snoyman <michael@snoyman.com> dateFri 31 Oct 2014, 12:43 (12 years ago) parentbd6c3b5
3 files changed+43−1
Stackage/BuildPlan.hs+24 app/stackage.hs+8−1 stackage-upload.hs+11
Stackage/BuildPlan.hs+24
@@ -4,6 +4,7 @@
44module Stackage.BuildPlan
55 ( readBuildPlan
66 , writeBuildPlan
7+ , writeBuildPlanCsv
78 ) where
89
910import qualified Data.Map as Map
@@ -155,3 +156,26 @@ getSection title orig =
155156 if null z
156157 then return y
157158 else Left $ "Unconsumed input on line: " ++ x
159+
160+-- | Used for Hackage distribution purposes.
161+writeBuildPlanCsv :: FilePath -> BuildPlan -> IO ()
162+writeBuildPlanCsv fp bp =
163+ -- Obviously a proper CSV library should be used... but we're minimizing
164+ -- deps
165+ System.IO.UTF8.writeFile fp $ unlines $ map toRow $ Map.toList fullMap
166+ where
167+ fullMap = Map.unions
168+ [ fmap spiVersion $ bpPackages bp
169+ , Map.mapMaybe id $ bpCore bp
170+ , bpOptionalCore bp
171+ ]
172+
173+ toRow (PackageName name, version) = concat
174+ [ "\""
175+ , name
176+ , "\",\""
177+ , display version
178+ , "\",\"http://www.stackage.org/package/"
179+ , name
180+ , "\""
181+ ]
app/stackage.hs+8−1
@@ -1,7 +1,7 @@
11{-# LANGUAGE RecordWildCards #-}
22import Data.Set (fromList)
33import Stackage.Build (build, defaultBuildSettings)
4−import Stackage.BuildPlan (readBuildPlan, writeBuildPlan)
4+import Stackage.BuildPlan (readBuildPlan, writeBuildPlan, writeBuildPlanCsv)
55import Stackage.CheckPlan (checkPlan)
66import Stackage.GhcPkg (getGhcVersion)
77import Stackage.Init (stackageInit)
@@ -20,6 +20,7 @@ data SelectArgs = SelectArgs
2020 , onlyPermissive :: Bool
2121 , allowed :: [String]
2222 , buildPlanDest :: FilePath
23+ , buildPlanCsvDest :: FilePath
2324 , globalDB :: Bool
2425 }
2526
@@ -32,6 +33,7 @@ parseSelectArgs =
3233 , onlyPermissive = False
3334 , allowed = []
3435 , buildPlanDest = defaultBuildPlan
36+ , buildPlanCsvDest = defaultBuildPlanCsv
3537 , globalDB = False
3638 }
3739 where
@@ -43,6 +45,7 @@ parseSelectArgs =
4345 loop x ("--only-permissive":rest) = loop x { onlyPermissive = True } rest
4446 loop x ("--allow":y:rest) = loop x { allowed = y : allowed x } rest
4547 loop x ("--build-plan":y:rest) = loop x { buildPlanDest = y } rest
48+ loop x ("--build-plan-csv":y:rest) = loop x { buildPlanCsvDest = y } rest
4649 loop x ("--use-global-db":rest) = loop x { globalDB = True } rest
4750 loop _ (y:_) = error $ "Did not understand argument: " ++ y
4851
@@ -78,6 +81,9 @@ parseBuildArgs version =
7881defaultBuildPlan :: FilePath
7982defaultBuildPlan = "build-plan.txt"
8083
84+defaultBuildPlanCsv :: FilePath
85+defaultBuildPlanCsv = "build-plan.csv"
86+
8187withBuildSettings :: [String] -> (BuildSettings -> BuildPlan -> IO a) -> IO a
8288withBuildSettings args f = do
8389 version <- getGhcVersion
@@ -114,6 +120,7 @@ main = do
114120 , useGlobalDatabase = globalDB
115121 }
116122 writeBuildPlan buildPlanDest bp
123+ writeBuildPlanCsv buildPlanCsvDest bp
117124 ("check":rest) -> withBuildSettings rest checkPlan
118125 ("build":rest) -> withBuildSettings rest build
119126 ("test":rest) -> withBuildSettings rest runTestSuites
stackage-upload.hs+11
@@ -1,6 +1,7 @@
11{-# LANGUAGE OverloadedStrings #-}
22import Control.Monad (filterM, when)
33import qualified Data.ByteString.Char8 as S8
4+import qualified Data.ByteString.Lazy as L
45import Data.List (isInfixOf, isPrefixOf,
56 sort)
67import Network.HTTP.Client
@@ -32,6 +33,7 @@ main = withManager defaultManagerSettings $ \m -> do
3233 exitFailure
3334
3435 let uploadDocs = "exclusive" `isInfixOf` alias
36+ uploadHackageDistro = alias == "unstable-ghc78-exclusive"
3537
3638 putStrLn $ concat
3739 [ "Uploading "
@@ -103,6 +105,15 @@ main = withManager defaultManagerSettings $ \m -> do
103105 }
104106 httpLbs req3 m >>= print
105107
108+ when uploadHackageDistro $ do
109+ lbs <- L.readFile $ takeDirectory filepath </> "build-plan.csv"
110+ let req = "http://hackage.haskell.org/distro/Stackage/packages.csv"
111+ { requestHeaders = [("Content-Type", "text/csv")]
112+ , requestBody = RequestBodyLBS lbs
113+ , checkStatus = \_ _ _ -> Nothing
114+ }
115+ httpLbs req m >>= print
116+
106117mkIndex :: String -> [String] -> String
107118mkIndex snapid dirs = concat
108119 [ "<!DOCTYPE html>\n<html lang='en'><head><title>Haddocks index</title>"