hnix-store-core-0.4.0.0: src/System/Nix/ReadonlyStore.hs
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE ScopedTypeVariables #-}
module System.Nix.ReadonlyStore where
import Data.ByteString (ByteString)
import qualified Data.ByteString as BS
import qualified Data.Text as T
import qualified Data.HashSet as HS
import Data.Text.Encoding
import System.Nix.Hash
import System.Nix.StorePath
makeStorePath :: forall hashAlgo . (NamedAlgo hashAlgo)
=> FilePath
-> ByteString
-> Digest hashAlgo
-> StorePathName
-> StorePath
makeStorePath fp ty h nm = StorePath storeHash nm fp
where
s = BS.intercalate ":"
[ ty
, encodeUtf8 $ algoName @hashAlgo
, encodeUtf8 $ encodeInBase Base16 h
, encodeUtf8 $ T.pack fp
, encodeUtf8 $ unStorePathName nm
]
storeHash = hash s
makeTextPath :: FilePath -> StorePathName -> Digest 'SHA256 -> StorePathSet -> StorePath
makeTextPath fp nm h refs = makeStorePath fp ty h nm
where
ty = BS.intercalate ":" ("text" : map storePathToRawFilePath (HS.toList refs))
makeFixedOutputPath :: forall hashAlgo . (ValidAlgo hashAlgo, NamedAlgo hashAlgo)
=> FilePath
-> Bool
-> Digest hashAlgo
-> StorePathName
-> StorePath
makeFixedOutputPath fp recursive h nm =
if recursive && (algoName @hashAlgo) == "sha256"
then makeStorePath fp "source" h nm
else makeStorePath fp "output:out" h' nm
where
h' = hash @'SHA256 $ "fixed:out:" <> encodeUtf8 (algoName @hashAlgo) <> (if recursive then ":r:" else ":") <> encodeUtf8 (encodeInBase Base16 h) <> ":"
computeStorePathForText :: FilePath -> StorePathName -> ByteString -> StorePathSet -> StorePath
computeStorePathForText fp nm s refs = makeTextPath fp nm (hash s) refs