hnix-store-core-0.4.2.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
storeHash = hash s
s =
BS.intercalate ":" $
ty:fmap encodeUtf8
[ algoName @hashAlgo
, encodeInBase Base16 h
, T.pack fp
, unStorePathName nm
]
makeTextPath
:: FilePath -> StorePathName -> Digest 'SHA256 -> StorePathSet -> StorePath
makeTextPath fp nm h refs = makeStorePath fp ty h nm
where
ty =
BS.intercalate ":" ("text" : fmap storePathToRawFilePath (HS.toList refs))
makeFixedOutputPath
:: forall hashAlgo
. (ValidAlgo hashAlgo, NamedAlgo hashAlgo)
=> FilePath
-> Bool
-> Digest hashAlgo
-> StorePathName
-> StorePath
makeFixedOutputPath fp recursive h =
if recursive && (algoName @hashAlgo) == "sha256"
then makeStorePath fp "source" h
else makeStorePath fp "output:out" h'
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 = makeTextPath fp nm . hash