1-- | Create a bundle to be uploaded to Stackage Server.
2{-# LANGUAGE NoImplicitPrelude #-}
3{-# LANGUAGE OverloadedStrings #-}
4{-# LANGUAGE RecordWildCards #-}
5module Stackage2.ServerBundle
11import qualified Codec.Archive.Tar as Tar
12import qualified Codec.Archive.Tar.Entry as Tar
13import qualified Codec.Compression.GZip as GZip
14import qualified Data.Yaml as Y
15import Foreign.C.Types (CTime (CTime))
16import Stackage2.BuildConstraints
17import Stackage2.BuildPlan
18import Stackage2.Prelude
19import qualified System.PosixCompat.Time as PC
22epochTime :: IO Tar.EpochTime
23epochTime = (\(CTime t) -> t) <$> PC.epochTime
25-- | All package/versions in a build plan, including core packages.
27-- Note that this may include packages not available on Hackage.
28bpAllPackages :: BuildPlan -> Map PackageName Version
29bpAllPackages BuildPlan {..} =
30 siCorePackages bpSystemInfo ++ map ppVersion bpPackages
32serverBundle :: Tar.EpochTime
37serverBundle time title slug bp@BuildPlan {..} = GZip.compress $ Tar.write
38 [ fe "build-plan.yaml" (fromStrict $ Y.encode bp)
39 , fe "hackage" hackage
40 , fe "slug" (fromStrict $ encodeUtf8 slug)
41 , fe "desc" (fromStrict $ encodeUtf8 title)
45 case Tar.toTarPath False name of
47 Right name' -> (Tar.fileEntry name' contents)
48 { Tar.entryTime = time
50 hackage = builderToLazy $ foldMap goPair $ mapToList packageMap
52 -- need to remove some packages that don't exist on Hackage
53 packageMap = foldr deleteMap (bpAllPackages bp) $ map PackageName
59 goPair (name, version) =
60 toBuilder (display name) ++
61 toBuilder (asText "-") ++
62 toBuilder (display version) ++
63 toBuilder (asText "\n")
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list