dyre-0.8.11: Config/Dyre/Paths.hs
module Config.Dyre.Paths where
import System.Info (os, arch)
import System.FilePath ( (</>), (<.>), takeExtension )
import System.Directory (getCurrentDirectory, doesFileExist, getModificationTime)
import System.Environment.XDG.BaseDir (getUserCacheDir, getUserConfigDir)
import System.Environment.Executable (getExecutablePath)
import Data.Time
import Config.Dyre.Params
import Config.Dyre.Options
-- | Return the paths to, respectively, the current binary, the custom
-- binary, the config file, and the cache directory.
getPaths :: Params c -> IO (FilePath, FilePath, FilePath, FilePath, FilePath)
getPaths params@Params{projectName = pName} = do
thisBinary <- getExecutablePath
debugMode <- getDebug
cwd <- getCurrentDirectory
cacheDir <- case (debugMode, cacheDir params) of
(True, _ ) -> return $ cwd </> "cache"
(False, Nothing) -> getUserCacheDir pName
(False, Just cd) -> cd
configDir <- case (debugMode, configDir params) of
(True, _ ) -> return cwd
(False, Nothing) -> getUserConfigDir pName
(False, Just cd) -> cd
let tempBinary = cacheDir </> pName ++ "-" ++ os ++ "-" ++ arch
<.> takeExtension thisBinary
let configFile = configDir </> pName ++ ".hs"
let libsDir = configDir </> "lib"
return (thisBinary, tempBinary, configFile, cacheDir, libsDir)
-- | Check if a file exists. If it exists, return Just the modification
-- time. If it doesn't exist, return Nothing.
maybeModTime path = do
fileExists <- doesFileExist path
if fileExists
then fmap Just $ getModificationTime path
else return Nothing
-- Removed type signature because it can't satisfy GHC 7.4 and 7.6 at once
-- maybeModTime :: FilePath -> IO (Maybe UTCTime)