mirror of
https://github.com/commercialhaskell/stackage.git
synced 2026-01-31 16:40:26 +01:00
Create Stackage server bundles
This commit is contained in:
parent
19f239d4fc
commit
cce500244a
3
.gitignore
vendored
3
.gitignore
vendored
@ -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
|
||||||
|
|||||||
@ -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
51
Stackage/ServerFiles.hs
Normal 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
|
||||||
3
create-stackage-tarball.sh
Normal file
3
create-stackage-tarball.sh
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
#!/bin/bash -ex
|
||||||
|
|
||||||
|
tar czfv ghc-$(ghc --numeric-version)-$(date +%Y-%m-%d).stackage hackage desc patching/tarballs/
|
||||||
@ -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
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user