{-# LANGUAGE TupleSections #-} module Hpack.Convert.Run ( runConvert ) where import Prelude () import Prelude.Compat import Control.Monad import Data.List import Data.Maybe import System.Directory import System.Environment import System.Exit.Compat import System.FilePath import System.FilePath.Glob import Hpack.Config import Hpack.Convert runConvert :: IO () runConvert = do as <- getArgs (dir, cabalFileFP) <- case as of (dir:_) -> do isFile <- doesFileExist dir if takeExtension dir == ".cabal" && isFile then return (takeDirectory dir, dir) else (dir,) <$> findCabalFileFP dir _ -> do cwd <- getCurrentDirectory cabalFileFP <- findCabalFileFP cwd return (cwd, cabalFileFP) pkg <- runConvert' dir cabalFileFP writePackage (dir "package.yaml") pkg putStrLn $ "generated package.yaml based on " ++ cabalFileFP findCabalFileFP :: FilePath -> IO FilePath findCabalFileFP dir = do mcabalFileFP <- listToMaybe <$> globDir1 (compile "*.cabal") dir case mcabalFileFP of Nothing -> die "No cabal file in the current directory" Just cabalFileFP -> return cabalFileFP runConvert' :: FilePath -> FilePath -> IO Package runConvert' dir cabalFileFP = do mpackageYaml <- find (== "package.yaml") <$> getDirectoryContents dir when (isJust mpackageYaml) $ die $ (dir "package.yaml") ++ " already exists" old <- readFile cabalFileFP case fromPackageDescriptionString old of Left err -> die (show err) Right pkg -> return pkg