|
@@ -3,7 +3,8 @@
|
|
|
|
|
|
module Config
|
|
|
( ConfigFile
|
|
|
-, fetchConfig
|
|
|
+, readConfig
|
|
|
+, readProjectConfig
|
|
|
, Ini.iniValueL
|
|
|
) where
|
|
|
|
|
@@ -13,22 +14,27 @@ import qualified Data.Ini.Config.Bidir as Ini
|
|
|
import qualified Data.Text as T
|
|
|
import qualified Data.Text.IO as T
|
|
|
import Data.Monoid ((<>))
|
|
|
+import qualified Distribution.ParseUtils as Cabal
|
|
|
import qualified System.Directory as Sys
|
|
|
import System.FilePath ((</>))
|
|
|
+import qualified System.FilePath as Sys
|
|
|
import qualified System.Exit as Sys
|
|
|
import qualified System.Environment.XDG.BaseDir as Sys
|
|
|
import Text.Read (readMaybe)
|
|
|
|
|
|
import Types
|
|
|
+import Util
|
|
|
|
|
|
type ConfigFile = Ini.Ini Config
|
|
|
|
|
|
+
|
|
|
defaultConfig :: IO Config
|
|
|
defaultConfig = do
|
|
|
_configInstallPath <- Sys.getUserDataDir ("hatch" </> "install")
|
|
|
let _configCurrentCompiler = Nothing
|
|
|
return Config { .. }
|
|
|
|
|
|
+
|
|
|
configSpec :: Ini.IniSpec Config ()
|
|
|
configSpec = do
|
|
|
Ini.section "hatch" $ do
|
|
@@ -36,6 +42,7 @@ configSpec = do
|
|
|
& Ini.optional
|
|
|
configCurrentCompiler .=? Ini.field "current" versionField
|
|
|
|
|
|
+
|
|
|
versionField :: Ini.FieldValue Compiler
|
|
|
versionField = Ini.FieldValue { .. }
|
|
|
where
|
|
@@ -49,6 +56,7 @@ versionField = Ini.FieldValue { .. }
|
|
|
| otherwise = Left ("Bad GHC version: " ++ show t)
|
|
|
fvEmit = T.pack . compilerString
|
|
|
|
|
|
+
|
|
|
locateConfig :: FilePath -> IO (Maybe FilePath)
|
|
|
locateConfig filename = do
|
|
|
xdgLocs <- Sys.getAllConfigFiles "hatch" filename
|
|
@@ -60,8 +68,23 @@ locateConfig filename = do
|
|
|
[] -> return Nothing
|
|
|
((fp, _):_) -> return (Just fp)
|
|
|
|
|
|
-fetchConfig :: IO (Ini.Ini Config)
|
|
|
-fetchConfig = do
|
|
|
+
|
|
|
+readProjectConfig :: IO ([Cabal.Field])
|
|
|
+readProjectConfig = Sys.getCurrentDirectory >>= go
|
|
|
+ where go "/" = return []
|
|
|
+ go path = do
|
|
|
+ exists <- Sys.doesFileExist (path </> ".hatch")
|
|
|
+ if exists
|
|
|
+ then do
|
|
|
+ content <- readFile (path </> ".hatch")
|
|
|
+ case Cabal.readFields content of
|
|
|
+ Cabal.ParseOk _ rs -> return rs
|
|
|
+ _ -> return []
|
|
|
+ else go (Sys.takeDirectory path)
|
|
|
+
|
|
|
+
|
|
|
+readConfig :: IO (Ini.Ini Config)
|
|
|
+readConfig = do
|
|
|
def <- defaultConfig
|
|
|
let ini = Ini.ini def configSpec
|
|
|
confLocation <- locateConfig "config.ini"
|
|
@@ -72,5 +95,6 @@ fetchConfig = do
|
|
|
content <- T.readFile fp
|
|
|
case Ini.parseIni content ini of
|
|
|
Left err -> do
|
|
|
+ printErr err
|
|
|
Sys.die err
|
|
|
Right x -> return x
|