hix-0.9.0: lib/Hix/Managed/Handlers/StateFile/Prod.hs
module Hix.Managed.Handlers.StateFile.Prod where
import qualified Data.Text.IO as Text
import Path (Abs, Dir, File, Path, parent, toFilePath, (</>))
import Path.IO (createDirIfMissing, doesDirExist, doesFileExist)
import System.Posix (fileMode, getFileStatus, ownerWriteMode, setFileMode, unionFileModes)
import qualified Hix.Data.Monad
import Hix.Data.Monad (appRes)
import Hix.Data.NixExpr (Expr)
import qualified Hix.Managed.Data.StateFileConfig
import Hix.Managed.Data.StateFileConfig (StateFileConfig)
import Hix.Managed.Handlers.StateFile (StateFileHandlers (..))
import Hix.Maybe (fromMaybeA)
import Hix.Monad (M, tryIOM)
import Hix.NixExpr (renderRootExpr)
setDepsFileWritable ::
Path Abs File ->
M ()
setDepsFileWritable file =
tryIOM do
whenM (doesDirExist dir) do
whenM (doesFileExist file) do
fileCur <- getFileStatus fileFp
setWrite fileFp (fileMode fileCur)
where
setWrite path cur = setFileMode path (unionFileModes cur ownerWriteMode)
fileFp = toFilePath file
dir = parent file
initFile ::
StateFileConfig ->
Maybe (Path Abs Dir) ->
M (Path Abs File)
initFile conf tmpRoot = do
root <- fromMaybeA appRes.root tmpRoot
let depsFile = root </> conf.file
createDirIfMissing False (parent depsFile)
setDepsFileWritable depsFile
pure depsFile
writeFile ::
StateFileConfig ->
Maybe (Path Abs Dir) ->
Expr ->
M ()
writeFile conf tmpRoot nixExpr = do
path <- initFile conf tmpRoot
liftIO (Text.writeFile (toFilePath path) (renderRootExpr nixExpr))
handlersProd ::
StateFileConfig ->
StateFileHandlers
handlersProd conf =
StateFileHandlers {writeFile = writeFile conf}