Create Stackage server bundles

This commit is contained in:
Michael Snoyman 2014-04-17 19:06:18 +03:00
parent 19f239d4fc
commit cce500244a
5 changed files with 88 additions and 9 deletions

3
.gitignore vendored
View File

@ -16,3 +16,6 @@ cabal-dev
build-plan.txt build-plan.txt
hackage-map.txt hackage-map.txt
module-name-conflicts.txt module-name-conflicts.txt
/hackage
/desc
*.stackage

View File

@ -8,6 +8,7 @@ import Control.Monad (forM_, unless)
import Data.List (foldl') import Data.List (foldl')
import qualified Data.Map as Map import qualified Data.Map as Map
import qualified Data.Set as Set import qualified Data.Set as Set
import Data.Time (getCurrentTime, formatTime)
import Data.Version (showVersion) import Data.Version (showVersion)
import qualified Distribution.Text import qualified Distribution.Text
import Distribution.Version (simplifyVersionRange, withinRange) import Distribution.Version (simplifyVersionRange, withinRange)
@ -15,9 +16,12 @@ import Stackage.GhcPkg
import Stackage.HaskellPlatform import Stackage.HaskellPlatform
import Stackage.LoadDatabase import Stackage.LoadDatabase
import Stackage.NarrowDatabase import Stackage.NarrowDatabase
import Stackage.ServerFiles
import Stackage.Types import Stackage.Types
import Stackage.Util import Stackage.Util
import qualified System.IO as IO
import qualified System.IO.UTF8 import qualified System.IO.UTF8
import System.Locale (defaultTimeLocale)
import System.Exit (exitFailure) import System.Exit (exitFailure)
dropExcluded :: SelectSettings dropExcluded :: SelectSettings
@ -87,15 +91,32 @@ getInstallInfo settings = do
error "Conflicting build plan, exiting" error "Conflicting build plan, exiting"
return InstallInfo let ii = InstallInfo
{ iiCore = totalCore { iiCore = totalCore
, iiPackages = Map.map biToSPI final , iiPackages = Map.map biToSPI final
, iiOptionalCore = maybe , iiOptionalCore = maybe
Map.empty Map.empty
(Map.fromList . map (\(PackageIdentifier p v) -> (p, v)) . Set.toList . hplibs) (Map.fromList . map (\(PackageIdentifier p v) -> (p, v)) . Set.toList . hplibs)
mhp mhp
, iiPackageDB = pdb , iiPackageDB = pdb
} }
putStrLn "Creating hackage file (for publishing to Stackage server)"
IO.withBinaryFile "hackage" IO.WriteMode $ createHackageFile ii
putStrLn "Creating desc file (for publishing to Stackage server)"
now <- getCurrentTime
System.IO.UTF8.writeFile "desc" $ concat
[ "Stackage build for GHC "
, let GhcMajorVersion x y = selectGhcVersion settings
in show x ++ "." ++ show y
, ", "
, formatTime defaultTimeLocale "%Y-%m-%d\n" now
, "Generated on "
, show now
]
return ii
biToSPI :: BuildInfo -> SelectedPackageInfo biToSPI :: BuildInfo -> SelectedPackageInfo
biToSPI BuildInfo {..} = SelectedPackageInfo biToSPI BuildInfo {..} = SelectedPackageInfo

51
Stackage/ServerFiles.hs Normal file
View File

@ -0,0 +1,51 @@
-- | Create the files necessary for Stackage server.
module Stackage.ServerFiles
( createHackageFile
) where
import Stackage.Util
import Stackage.Types
import qualified Data.Map as Map
import Control.Exception (throwIO)
import qualified Codec.Archive.Tar as Tar
import qualified Data.ByteString.Lazy as L
import Control.Arrow (second)
import Distribution.Text (display)
import System.IO (Handle, hPutStrLn)
createHackageFile :: InstallInfo -> Handle -> IO ()
createHackageFile ii h = do
indextargz <- getTarballName
indexLBS <- L.readFile indextargz
loop $ Tar.read indexLBS
where
selected = Map.fromList . map toStrs . Map.toList $
fmap spiVersion (iiPackages ii)
`Map.union` iiOptionalCore ii
toStrs (PackageName name, version) = (name, display version)
loop Tar.Done = return ()
loop (Tar.Fail e) = throwIO e
loop (Tar.Next e es) = go e >> loop es
go e =
case parsePair $ Tar.entryPath e of
Nothing -> return ()
Just (name, version) ->
case Map.lookup name selected of
Just version' | version /= version' -> return ()
_ -> hPutStrLn h $ concat [name, "-", version]
parsePair :: String -> Maybe (String, String)
parsePair s =
case splitOn '/' s of
[name, version, cabal] | name ++ ".cabal" == cabal -> Just (name, version)
_ -> Nothing
splitOn :: Eq a => a -> [a] -> [[a]]
splitOn _ [] = []
splitOn c x =
y : splitOn c z
where
(y, z) = second (drop 1) $ break (== c) x

View File

@ -0,0 +1,3 @@
#!/bin/bash -ex
tar czfv ghc-$(ghc --numeric-version)-$(date +%Y-%m-%d).stackage hackage desc patching/tarballs/

View File

@ -29,6 +29,7 @@ library
Stackage.CheckCabalVersion Stackage.CheckCabalVersion
Stackage.Select Stackage.Select
Stackage.GhcPkg Stackage.GhcPkg
Stackage.ServerFiles
build-depends: base >= 4 && < 5 build-depends: base >= 4 && < 5
, containers , containers
, Cabal >= 1.14 , Cabal >= 1.14