{-# OPTIONS_GHC -Wno-unused-imports #-}
{-# LANGUAGE QuasiQuotes #-}
module Dhall.Docs.Store (getDocsHomeDirectory, makeHashForDirectory) where
import Dhall.Crypto (SHA256Digest (..), sha256Hash)
import Path (Abs, Dir, Path, Rel)
import Path.IO (XdgDirectory (..))
import qualified Codec.Archive.Tar as Tar
import qualified Codec.Archive.Tar.Entry as Tar.Entry
import qualified Data.ByteString.Lazy
import qualified Data.List
import qualified Path
import qualified Path.IO
getDocsHomeDirectory :: IO (Path Abs Dir)
getDocsHomeDirectory = do
dir <- Path.IO.getXdgDir Path.IO.XdgData $ Just $ [Path.reldir|dhall-docs|]
Path.IO.ensureDir dir
return dir
makeHashForDirectory :: Path Abs Dir -> IO SHA256Digest
makeHashForDirectory dir = do
files <- Data.List.sort . map Path.fromRelFile . snd
<$> Path.IO.listDirRecurRel dir
let setTimeToZero entry = entry{Tar.Entry.entryTime = 0}
inMemoryTarBytes <- Data.ByteString.Lazy.toStrict . Tar.write . map setTimeToZero
<$> Tar.pack (Path.fromAbsDir dir) files
return $ sha256Hash inMemoryTarBytes