on master help sign in
Create Stackage server bundles
cce5002Michael Snoyman
.gitignore+3
@@ -16,3 +16,6 @@ cabal-dev
16build-plan.txt
16build-plan.txt
17hackage-map.txt
17hackage-map.txt
18module-name-conflicts.txt
18module-name-conflicts.txt
19+/hackage
20+/desc
21+*.stackage
Stackage/InstallInfo.hs+30−9
@@ -8,6 +8,7 @@ import Control.Monad (forM_, unless)
8import Data.List (foldl')
8import Data.List (foldl')
9import qualified Data.Map as Map
9import qualified Data.Map as Map
10import qualified Data.Set as Set
10import qualified Data.Set as Set
11+import Data.Time (getCurrentTime, formatTime)
11import Data.Version (showVersion)
12import Data.Version (showVersion)
12import qualified Distribution.Text
13import qualified Distribution.Text
13import Distribution.Version (simplifyVersionRange, withinRange)
14import Distribution.Version (simplifyVersionRange, withinRange)
@@ -15,9 +16,12 @@ import Stackage.GhcPkg
15import Stackage.HaskellPlatform
16import Stackage.HaskellPlatform
16import Stackage.LoadDatabase
17import Stackage.LoadDatabase
17import Stackage.NarrowDatabase
18import Stackage.NarrowDatabase
19+import Stackage.ServerFiles
18import Stackage.Types
20import Stackage.Types
19import Stackage.Util
21import Stackage.Util
22+import qualified System.IO as IO
20import qualified System.IO.UTF8
23import qualified System.IO.UTF8
24+import System.Locale (defaultTimeLocale)
21import System.Exit (exitFailure)
25import System.Exit (exitFailure)
22
26
23dropExcluded :: SelectSettings
27dropExcluded :: SelectSettings
@@ -87,15 +91,32 @@ getInstallInfo settings = do
87
91
88 error "Conflicting build plan, exiting"
92 error "Conflicting build plan, exiting"
89
93
90− return InstallInfo
94+ let ii = InstallInfo
91− { iiCore = totalCore
95+ { iiCore = totalCore
92− , iiPackages = Map.map biToSPI final
96+ , iiPackages = Map.map biToSPI final
93− , iiOptionalCore = maybe
97+ , iiOptionalCore = maybe
94− Map.empty
98+ Map.empty
95− (Map.fromList . map (\(PackageIdentifier p v) -> (p, v)) . Set.toList . hplibs)
99+ (Map.fromList . map (\(PackageIdentifier p v) -> (p, v)) . Set.toList . hplibs)
96− mhp
100+ mhp
97− , iiPackageDB = pdb
101+ , iiPackageDB = pdb
98− }
102+ }
103+
104+ putStrLn "Creating hackage file (for publishing to Stackage server)"
105+ IO.withBinaryFile "hackage" IO.WriteMode $ createHackageFile ii
106+
107+ putStrLn "Creating desc file (for publishing to Stackage server)"
108+ now <- getCurrentTime
109+ System.IO.UTF8.writeFile "desc" $ concat
110+ [ "Stackage build for GHC "
111+ , let GhcMajorVersion x y = selectGhcVersion settings
112+ in show x ++ "." ++ show y
113+ , ", "
114+ , formatTime defaultTimeLocale "%Y-%m-%d\n" now
115+ , "Generated on "
116+ , show now
117+ ]
118+
119+ return ii
99
120
100biToSPI :: BuildInfo -> SelectedPackageInfo
121biToSPI :: BuildInfo -> SelectedPackageInfo
101biToSPI BuildInfo {..} = SelectedPackageInfo
122biToSPI BuildInfo {..} = SelectedPackageInfo
Stackage/ServerFiles.hsnew file+51
@@ -0,0 +1,51 @@
1+-- | Create the files necessary for Stackage server.
2+module Stackage.ServerFiles
3+ ( createHackageFile
4+ ) where
5+
6+import Stackage.Util
7+import Stackage.Types
8+import qualified Data.Map as Map
9+import Control.Exception (throwIO)
10+import qualified Codec.Archive.Tar as Tar
11+import qualified Data.ByteString.Lazy as L
12+import Control.Arrow (second)
13+import Distribution.Text (display)
14+import System.IO (Handle, hPutStrLn)
15+
16+createHackageFile :: InstallInfo -> Handle -> IO ()
17+createHackageFile ii h = do
18+ indextargz <- getTarballName
19+ indexLBS <- L.readFile indextargz
20+ loop $ Tar.read indexLBS
21+ where
22+ selected = Map.fromList . map toStrs . Map.toList $
23+ fmap spiVersion (iiPackages ii)
24+ `Map.union` iiOptionalCore ii
25+
26+ toStrs (PackageName name, version) = (name, display version)
27+
28+ loop Tar.Done = return ()
29+ loop (Tar.Fail e) = throwIO e
30+ loop (Tar.Next e es) = go e >> loop es
31+
32+ go e =
33+ case parsePair $ Tar.entryPath e of
34+ Nothing -> return ()
35+ Just (name, version) ->
36+ case Map.lookup name selected of
37+ Just version' | version /= version' -> return ()
38+ _ -> hPutStrLn h $ concat [name, "-", version]
39+
40+parsePair :: String -> Maybe (String, String)
41+parsePair s =
42+ case splitOn '/' s of
43+ [name, version, cabal] | name ++ ".cabal" == cabal -> Just (name, version)
44+ _ -> Nothing
45+
46+splitOn :: Eq a => a -> [a] -> [[a]]
47+splitOn _ [] = []
48+splitOn c x =
49+ y : splitOn c z
50+ where
51+ (y, z) = second (drop 1) $ break (== c) x
create-stackage-tarball.shnew file+3
@@ -0,0 +1,3 @@
1+#!/bin/bash -ex
2+
3+tar czfv ghc-$(ghc --numeric-version)-$(date +%Y-%m-%d).stackage hackage desc patching/tarballs/
stackage.cabal+1
@@ -29,6 +29,7 @@ library
29 Stackage.CheckCabalVersion
29 Stackage.CheckCabalVersion
30 Stackage.Select
30 Stackage.Select
31 Stackage.GhcPkg
31 Stackage.GhcPkg
32+ Stackage.ServerFiles
32 build-depends: base >= 4 && < 5
33 build-depends: base >= 4 && < 5
33 , containers
34 , containers
34 , Cabal >= 1.14
35 , Cabal >= 1.14