on master help sign in
Upload as a Hackage distribution
24d0c3bMichael Snoyman
Stackage/BuildPlan.hs+24
@@ -4,6 +4,7 @@
4module Stackage.BuildPlan
4module Stackage.BuildPlan
5 ( readBuildPlan
5 ( readBuildPlan
6 , writeBuildPlan
6 , writeBuildPlan
7+ , writeBuildPlanCsv
7 ) where
8 ) where
8
9
9import qualified Data.Map as Map
10import qualified Data.Map as Map
@@ -155,3 +156,26 @@ getSection title orig =
155 if null z
156 if null z
156 then return y
157 then return y
157 else Left $ "Unconsumed input on line: " ++ x
158 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 @@
1{-# LANGUAGE RecordWildCards #-}
1{-# LANGUAGE RecordWildCards #-}
2import Data.Set (fromList)
2import Data.Set (fromList)
3import Stackage.Build (build, defaultBuildSettings)
3import Stackage.Build (build, defaultBuildSettings)
4−import Stackage.BuildPlan (readBuildPlan, writeBuildPlan)
4+import Stackage.BuildPlan (readBuildPlan, writeBuildPlan, writeBuildPlanCsv)
5import Stackage.CheckPlan (checkPlan)
5import Stackage.CheckPlan (checkPlan)
6import Stackage.GhcPkg (getGhcVersion)
6import Stackage.GhcPkg (getGhcVersion)
7import Stackage.Init (stackageInit)
7import Stackage.Init (stackageInit)
@@ -20,6 +20,7 @@ data SelectArgs = SelectArgs
20 , onlyPermissive :: Bool
20 , onlyPermissive :: Bool
21 , allowed :: [String]
21 , allowed :: [String]
22 , buildPlanDest :: FilePath
22 , buildPlanDest :: FilePath
23+ , buildPlanCsvDest :: FilePath
23 , globalDB :: Bool
24 , globalDB :: Bool
24 }
25 }
25
26
@@ -32,6 +33,7 @@ parseSelectArgs =
32 , onlyPermissive = False
33 , onlyPermissive = False
33 , allowed = []
34 , allowed = []
34 , buildPlanDest = defaultBuildPlan
35 , buildPlanDest = defaultBuildPlan
36+ , buildPlanCsvDest = defaultBuildPlanCsv
35 , globalDB = False
37 , globalDB = False
36 }
38 }
37 where
39 where
@@ -43,6 +45,7 @@ parseSelectArgs =
43 loop x ("--only-permissive":rest) = loop x { onlyPermissive = True } rest
45 loop x ("--only-permissive":rest) = loop x { onlyPermissive = True } rest
44 loop x ("--allow":y:rest) = loop x { allowed = y : allowed x } rest
46 loop x ("--allow":y:rest) = loop x { allowed = y : allowed x } rest
45 loop x ("--build-plan":y:rest) = loop x { buildPlanDest = y } rest
47 loop x ("--build-plan":y:rest) = loop x { buildPlanDest = y } rest
48+ loop x ("--build-plan-csv":y:rest) = loop x { buildPlanCsvDest = y } rest
46 loop x ("--use-global-db":rest) = loop x { globalDB = True } rest
49 loop x ("--use-global-db":rest) = loop x { globalDB = True } rest
47 loop _ (y:_) = error $ "Did not understand argument: " ++ y
50 loop _ (y:_) = error $ "Did not understand argument: " ++ y
48
51
@@ -78,6 +81,9 @@ parseBuildArgs version =
78defaultBuildPlan :: FilePath
81defaultBuildPlan :: FilePath
79defaultBuildPlan = "build-plan.txt"
82defaultBuildPlan = "build-plan.txt"
80
83
84+defaultBuildPlanCsv :: FilePath
85+defaultBuildPlanCsv = "build-plan.csv"
86+
81withBuildSettings :: [String] -> (BuildSettings -> BuildPlan -> IO a) -> IO a
87withBuildSettings :: [String] -> (BuildSettings -> BuildPlan -> IO a) -> IO a
82withBuildSettings args f = do
88withBuildSettings args f = do
83 version <- getGhcVersion
89 version <- getGhcVersion
@@ -114,6 +120,7 @@ main = do
114 , useGlobalDatabase = globalDB
120 , useGlobalDatabase = globalDB
115 }
121 }
116 writeBuildPlan buildPlanDest bp
122 writeBuildPlan buildPlanDest bp
123+ writeBuildPlanCsv buildPlanCsvDest bp
117 ("check":rest) -> withBuildSettings rest checkPlan
124 ("check":rest) -> withBuildSettings rest checkPlan
118 ("build":rest) -> withBuildSettings rest build
125 ("build":rest) -> withBuildSettings rest build
119 ("test":rest) -> withBuildSettings rest runTestSuites
126 ("test":rest) -> withBuildSettings rest runTestSuites
stackage-upload.hs+11
@@ -1,6 +1,7 @@
1{-# LANGUAGE OverloadedStrings #-}
1{-# LANGUAGE OverloadedStrings #-}
2import Control.Monad (filterM, when)
2import Control.Monad (filterM, when)
3import qualified Data.ByteString.Char8 as S8
3import qualified Data.ByteString.Char8 as S8
4+import qualified Data.ByteString.Lazy as L
4import Data.List (isInfixOf, isPrefixOf,
5import Data.List (isInfixOf, isPrefixOf,
5 sort)
6 sort)
6import Network.HTTP.Client
7import Network.HTTP.Client
@@ -32,6 +33,7 @@ main = withManager defaultManagerSettings $ \m -> do
32 exitFailure
33 exitFailure
33
34
34 let uploadDocs = "exclusive" `isInfixOf` alias
35 let uploadDocs = "exclusive" `isInfixOf` alias
36+ uploadHackageDistro = alias == "unstable-ghc78-exclusive"
35
37
36 putStrLn $ concat
38 putStrLn $ concat
37 [ "Uploading "
39 [ "Uploading "
@@ -103,6 +105,15 @@ main = withManager defaultManagerSettings $ \m -> do
103 }
105 }
104 httpLbs req3 m >>= print
106 httpLbs req3 m >>= print
105
107
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+
106mkIndex :: String -> [String] -> String
117mkIndex :: String -> [String] -> String
107mkIndex snapid dirs = concat
118mkIndex snapid dirs = concat
108 [ "<!DOCTYPE html>\n<html lang='en'><head><title>Haddocks index</title>"
119 [ "<!DOCTYPE html>\n<html lang='en'><head><title>Haddocks index</title>"