on fb78fa2 help sign in
stackage/Stackage/Tarballs.hs
44 lines 1.7 kB history raw
1module Stackage.Tarballs
2 ( makeTarballs
3 ) where
5import qualified Codec.Archive.Tar as Tar
6import qualified Data.ByteString.Lazy as L
7import qualified Data.Map as Map
8import qualified Data.Set as Set
9import Stackage.Types
10import Stackage.Util
11import System.Directory (createDirectoryIfMissing)
12import System.FilePath (takeDirectory)
14makeTarballs :: InstallInfo -> IO ()
15makeTarballs ii = do
16 tarName <- getTarballName
17 origEntries <- fmap Tar.read $ L.readFile tarName
18 (stableEntries, extraEntries) <- loop id id origEntries
20 (stableTar, extraTar) <- getStackageTarballNames
22 createDirectoryIfMissing True $ takeDirectory stableTar
23 L.writeFile stableTar $ Tar.write stableEntries
25 createDirectoryIfMissing True $ takeDirectory extraTar
26 L.writeFile extraTar $ Tar.write extraEntries
27 where
28 -- Using "error . show" for compatibility with tar 0.3 and 0.4
29 loop _ _ (Tar.Fail err) = error $ show err
30 loop stable extra Tar.Done = return (stable [], extra [])
31 loop stable extra (Tar.Next e es) =
32 loop stable' extra' es
33 where
34 (stable', extra') =
35 case getPackageVersion e of
36 Nothing -> (stable, extra)
37 Just (package, version) ->
38 case Map.lookup package $ iiPackages ii of
39 Just (version', _maintainer)
40 | version == version' -> (stable . (e:), extra)
41 | otherwise -> (stable, extra)
42 Nothing
43 | package `Set.member` iiCore ii -> (stable, extra)
44 | otherwise -> (stable, extra . (e:))