{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE OverloadedStrings #-}
import qualified Data.ByteString as BS
import qualified Data.List.NonEmpty as NEL
import Data.Text.Encoding (encodeUtf8)
import Distribution.Types.PackageName (mkPackageName)
import Hpack (Force (..), Options (..),
defaultOptions, hpackResult,
resultCabalFile, setTarget)
import StackageToHackage.Hackage (printFreeze, printProject,
stackToCabal)
import StackageToHackage.Stackage (localDirs, readStack)
import System.Directory (getCurrentDirectory)
import System.FilePath (takeBaseName, (</>))
main :: IO ()
main = do
dir <- getCurrentDirectory
stack <- readStack =<< BS.readFile (dir </> "stack.yaml")
let subs = NEL.toList $ (dir </>) <$> localDirs stack
hResults <- traverse runHpack subs
let ignore = (mkPackageName . takeBaseName . resultCabalFile) <$> hResults
(project, freeze) <- stackToCabal ignore dir stack
BS.writeFile (dir </> "cabal.project") (encodeUtf8 $ printProject project)
BS.writeFile (dir </> "cabal.project.freeze") (encodeUtf8 $ printFreeze freeze)
where
runHpack sub = hpackResult $ setTarget (sub </> "package.yaml")
(defaultOptions {optionsForce = Force})
-- TODO invoke cabal v2-freeze to minimise the freeze file