updo-1.0.0: project-dhall2config/pkg-groups.hs
#!/usr/bin/env stack
-- stack script --resolver=lts-18.27 --package=base --package=dhall --package=filepath --package=text
{-# LANGUAGE DeriveAnyClass #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE ScopedTypeVariables #-}
-- | Description: Convert each package group from .dhall to .config with upgrade
-- conditionals if needed.
module Main where
import Control.Monad (forM_)
import Data.List (concat, filter, intersect, sortOn, (\\))
import qualified Data.Text as T (pack, unpack)
import qualified Data.Text.IO as T (putStrLn)
import Dhall (FromDhall, Generic, Text, ToDhall, auto, embed, inject, input)
import Dhall.Core (pretty)
import System.Environment (getArgs)
import System.FilePath ((<.>), (</>))
type UpgradeConfig = CabalRelativity -> Text -> Text -> PkgUpgrade -> Text
data PkgUpgrade = PkgUpgrade
{ pkgs :: [Text]
, done :: [Text]
, todo :: [Text]
}
deriving (Show, Generic, ToDhall, FromDhall)
data CabalRelativity = CabalProjectRelative | CabalImportRelative
deriving (Show, Generic, ToDhall, FromDhall)
groupUpgrade :: [Text] -> String -> IO PkgUpgrade
groupUpgrade remaining name = do
pkgs :: [Text] <- input auto (T.pack $ "./project-dhall/pkgs" </> name <.> "dhall")
let todo = pkgs `intersect` remaining
let done = pkgs \\ todo
return PkgUpgrade{..}
main :: IO ()
main = do
cabalRelativity : ghcVersion : ghcUpgrade : _ <- getArgs
remaining :: [Text] <- input auto "./project-dhall/pkgs-upgrade-todo.dhall"
relativity :: CabalRelativity <- input auto $ T.pack cabalRelativity
pkgUpgrade :: UpgradeConfig <- input auto "./updo/project-dhall/pkgs-upgrade.dhall"
pkgGroups :: [String] <- input auto "./project-dhall/pkg-groups.dhall"
forM_ pkgGroups $ \p -> do
up <- groupUpgrade remaining p
let config = pkgUpgrade relativity (T.pack ghcVersion) (T.pack ghcUpgrade) up
writeFile ("./project-cabal/pkgs" </> p <.> "config") (T.unpack config)