packages feed

hercules-ci-cnix-store 0.3.5.1 → 0.3.6.0

raw patch · 7 files changed

+369/−92 lines, 7 filesPVP: major bump suggested

API removals or changes: PVP suggests a major version bump

API changes (from Hackage documentation)

- Hercules.CNix.Store: inline_c_ffi_6989586621679082901 :: Ptr NixStorePath -> Ptr NixStorePath -> IO CInt
- Hercules.CNix.Store: inline_c_ffi_6989586621679082911 :: Ptr NixStorePath -> IO (Ptr CChar)
- Hercules.CNix.Store: inline_c_ffi_6989586621679082979 :: Ptr (Ptr ()) -> IO (Ptr (Ref NixStore))
- Hercules.CNix.Store: inline_c_ffi_6989586621679082988 :: Ptr (Ref NixStore) -> IO ()
- Hercules.CNix.Store: inline_c_ffi_6989586621679083007 :: Ptr (Ptr ()) -> Ptr CChar -> IO (Ptr (Ref NixStore))
- Hercules.CNix.Store: inline_c_ffi_6989586621679083016 :: Ptr (Ref NixStore) -> IO ()
- Hercules.CNix.Store: inline_c_ffi_6989586621679083025 :: Ptr (Ref NixStore) -> IO (Ptr CChar)
- Hercules.CNix.Store: inline_c_ffi_6989586621679083034 :: Ptr (Ref NixStore) -> IO (Ptr CChar)
- Hercules.CNix.Store: inline_c_ffi_6989586621679083046 :: Ptr (Ptr ()) -> Ptr (Ref NixStore) -> IO CInt
- Hercules.CNix.Store: inline_c_ffi_6989586621679083055 :: Ptr (Ptr ()) -> IO CInt
- Hercules.CNix.Store: inline_c_ffi_6989586621679083061 :: IO (FunPtr (Ptr NixStorePath -> IO ()))
- Hercules.CNix.Store: inline_c_ffi_6989586621679083077 :: Ptr (Ptr ()) -> Ptr CChar -> CLong -> IO (Ptr NixStorePath)
- Hercules.CNix.Store: inline_c_ffi_6989586621679083095 :: Ptr (Ptr ()) -> Ptr (Ref NixStore) -> Ptr CChar -> CLong -> IO (Ptr NixStorePath)
- Hercules.CNix.Store: inline_c_ffi_6989586621679083103 :: Ptr NixStorePath -> IO (Ptr CChar)
- Hercules.CNix.Store: inline_c_ffi_6989586621679083111 :: Ptr NixStorePath -> IO (Ptr CChar)
- Hercules.CNix.Store: inline_c_ffi_6989586621679083122 :: Ptr (Ref NixStore) -> Ptr NixStorePath -> IO (Ptr CChar)
- Hercules.CNix.Store: inline_c_ffi_6989586621679083136 :: Ptr (Ptr ()) -> Ptr (Ref NixStore) -> Ptr NixStorePath -> IO ()
- Hercules.CNix.Store: inline_c_ffi_6989586621679083150 :: Ptr (Ptr ()) -> Ptr (Ref NixStore) -> Ptr NixStorePath -> IO ()
- Hercules.CNix.Store: inline_c_ffi_6989586621679083162 :: Ptr (Ptr ()) -> Ptr (Ref NixStore) -> IO ()
- Hercules.CNix.Store: inline_c_ffi_6989586621679083171 :: Ptr (Ptr ()) -> IO ()
- Hercules.CNix.Store: inline_c_ffi_6989586621679083177 :: IO (FunPtr (Ptr NixStorePathWithOutputs -> IO ()))
- Hercules.CNix.Store: inline_c_ffi_6989586621679083189 :: Ptr NixStorePath -> Ptr (CStdSet CStdString) -> IO (Ptr NixStorePathWithOutputs)
- Hercules.CNix.Store: inline_c_ffi_6989586621679083197 :: Ptr NixStorePathWithOutputs -> IO (Ptr NixStorePath)
- Hercules.CNix.Store: inline_c_ffi_6989586621679083208 :: Ptr (Ptr ()) -> Ptr NixStorePathWithOutputs -> IO (Ptr (CStdVector CStdString))
- Hercules.CNix.Store: inline_c_ffi_6989586621679083222 :: Ptr (Ptr ()) -> Ptr (Ref NixStore) -> Ptr (CStdVector NixStorePathWithOutputs) -> IO ()
- Hercules.CNix.Store: inline_c_ffi_6989586621679083230 :: IO (FunPtr (Ptr Derivation -> IO ()))
- Hercules.CNix.Store: inline_c_ffi_6989586621679083244 :: Ptr (Ptr ()) -> Ptr (Ref NixStore) -> Ptr NixStorePath -> IO (Ptr Derivation)
- Hercules.CNix.Store: inline_c_ffi_6989586621679083268 :: Ptr (Ptr ()) -> Ptr (Ref NixStore) -> Ptr CChar -> CLong -> Ptr CChar -> CLong -> IO (Ptr Derivation)
- Hercules.CNix.Store: inline_c_ffi_6989586621679083279 :: Ptr (Ptr ()) -> Ptr NixStorePath -> IO (Ptr CChar)
- Hercules.CNix.Store: inline_c_ffi_6989586621679083289 :: Ptr Derivation -> IO (Ptr DerivationOutputsIterator)
- Hercules.CNix.Store: inline_c_ffi_6989586621679083300 :: Ptr DerivationOutputsIterator -> Ptr Derivation -> IO CBool
- Hercules.CNix.Store: inline_c_ffi_6989586621679083341 :: Ptr (Ptr ()) -> Ptr (Ref NixStore) -> Ptr CChar -> CLong -> Ptr DerivationOutputsIterator -> Ptr (Ptr CChar) -> Ptr CInt -> Ptr (Ptr NixStorePath) -> Ptr CInt -> Ptr CInt -> Ptr (Ptr CChar) -> Ptr CInt -> Ptr Derivation -> IO ()
- Hercules.CNix.Store: inline_c_ffi_6989586621679083395 :: Ptr DerivationOutputsIterator -> IO ()
- Hercules.CNix.Store: inline_c_ffi_6989586621679083403 :: Ptr Derivation -> IO (Ptr CChar)
- Hercules.CNix.Store: inline_c_ffi_6989586621679083411 :: Ptr Derivation -> IO (Ptr CChar)
- Hercules.CNix.Store: inline_c_ffi_6989586621679083422 :: Ptr (Ptr ()) -> Ptr Derivation -> IO (Ptr Strings)
- Hercules.CNix.Store: inline_c_ffi_6989586621679083433 :: Ptr (Ptr ()) -> Ptr Derivation -> IO (Ptr (CStdVector (Ptr NixStorePath)))
- Hercules.CNix.Store: inline_c_ffi_6989586621679083442 :: Ptr Derivation -> IO (Ptr DerivationInputsIterator)
- Hercules.CNix.Store: inline_c_ffi_6989586621679083453 :: Ptr DerivationInputsIterator -> Ptr Derivation -> IO CBool
- Hercules.CNix.Store: inline_c_ffi_6989586621679083465 :: Ptr (Ptr ()) -> Ptr DerivationInputsIterator -> IO (Ptr NixStorePath)
- Hercules.CNix.Store: inline_c_ffi_6989586621679083474 :: Ptr DerivationInputsIterator -> IO (Ptr Strings)
- Hercules.CNix.Store: inline_c_ffi_6989586621679083483 :: Ptr DerivationInputsIterator -> IO ()
- Hercules.CNix.Store: inline_c_ffi_6989586621679083492 :: Ptr DerivationInputsIterator -> IO ()
- Hercules.CNix.Store: inline_c_ffi_6989586621679083500 :: Ptr Derivation -> IO (Ptr StringPairs)
- Hercules.CNix.Store: inline_c_ffi_6989586621679083511 :: Ptr (Ptr ()) -> Ptr Derivation -> IO (Ptr Strings)
- Hercules.CNix.Store: inline_c_ffi_6989586621679083520 :: Ptr StringPairs -> IO ()
- Hercules.CNix.Store: inline_c_ffi_6989586621679083529 :: Ptr Strings -> IO ()
- Hercules.CNix.Store: inline_c_ffi_6989586621679083535 :: IO (FunPtr (Ptr Strings -> IO ()))
- Hercules.CNix.Store: inline_c_ffi_6989586621679083544 :: Ptr Strings -> IO CSize
- Hercules.CNix.Store: inline_c_ffi_6989586621679083553 :: Ptr Strings -> IO (Ptr StringsIterator)
- Hercules.CNix.Store: inline_c_ffi_6989586621679083565 :: Ptr StringsIterator -> Ptr Strings -> IO CBool
- Hercules.CNix.Store: inline_c_ffi_6989586621679083574 :: Ptr StringsIterator -> IO (Ptr CChar)
- Hercules.CNix.Store: inline_c_ffi_6989586621679083584 :: Ptr StringsIterator -> IO ()
- Hercules.CNix.Store: inline_c_ffi_6989586621679083593 :: Ptr StringPairs -> IO (Ptr StringPairsIterator)
- Hercules.CNix.Store: inline_c_ffi_6989586621679083605 :: Ptr StringPairsIterator -> Ptr StringPairs -> IO CBool
- Hercules.CNix.Store: inline_c_ffi_6989586621679083614 :: Ptr StringPairsIterator -> IO (Ptr CChar)
- Hercules.CNix.Store: inline_c_ffi_6989586621679083623 :: Ptr StringPairsIterator -> IO (Ptr CChar)
- Hercules.CNix.Store: inline_c_ffi_6989586621679083634 :: Ptr StringPairsIterator -> IO ()
- Hercules.CNix.Store: inline_c_ffi_6989586621679083640 :: IO (Ptr Strings)
- Hercules.CNix.Store: inline_c_ffi_6989586621679083649 :: Ptr Strings -> IO ()
- Hercules.CNix.Store: inline_c_ffi_6989586621679083665 :: Ptr Strings -> Ptr CChar -> IO ()
- Hercules.CNix.Store: inline_c_ffi_6989586621679083686 :: Ptr (Ptr ()) -> Ptr (Ref NixStore) -> Ptr (Ref NixStore) -> Ptr (CStdVector (Ptr NixStorePath)) -> IO ()
- Hercules.CNix.Store: inline_c_ffi_6989586621679083700 :: Ptr (Ptr ()) -> Ptr CChar -> IO (Ptr SecretKey)
- Hercules.CNix.Store: inline_c_ffi_6989586621679083706 :: IO (FunPtr (Ptr SecretKey -> IO ()))
- Hercules.CNix.Store: inline_c_ffi_6989586621679083723 :: Ptr (Ptr ()) -> Ptr (Ref NixStore) -> Ptr NixStorePath -> Ptr SecretKey -> IO CInt
- Hercules.CNix.Store: inline_c_ffi_6989586621679083741 :: Ptr (Ptr ()) -> Ptr (Ref NixStore) -> Ptr CChar -> CLong -> IO (Ptr NixStorePath)
- Hercules.CNix.Store: inline_c_ffi_6989586621679083755 :: Ptr (Ptr ()) -> Ptr (Ref NixStore) -> Ptr NixStorePath -> IO CBool
- Hercules.CNix.Store: inline_c_ffi_6989586621679083769 :: Ptr (Ptr ()) -> Ptr (Ref NixStore) -> Ptr NixStorePath -> IO (Ptr (Ref ValidPathInfo))
- Hercules.CNix.Store: inline_c_ffi_6989586621679083787 :: Ptr (Ptr ()) -> Ptr (Ref NixStore) -> Ptr NixStorePath -> Ptr CBool -> IO (Ptr (Ref ValidPathInfo))
- Hercules.CNix.Store: inline_c_ffi_6989586621679083795 :: IO (FunPtr (Ptr (Ref ValidPathInfo) -> IO ()))
- Hercules.CNix.Store: inline_c_ffi_6989586621679083803 :: Ptr (Ref ValidPathInfo) -> IO CLong
- Hercules.CNix.Store: inline_c_ffi_6989586621679083811 :: Ptr (Ref ValidPathInfo) -> IO (Ptr CChar)
- Hercules.CNix.Store: inline_c_ffi_6989586621679083822 :: Ptr (Ptr ()) -> Ptr (Ref ValidPathInfo) -> IO (Ptr NixStorePath)
- Hercules.CNix.Store: inline_c_ffi_6989586621679083833 :: Ptr (Ptr ()) -> Ptr (Ref ValidPathInfo) -> IO (Ptr (CStdVector (Ptr NixStorePath)))
- Hercules.CNix.Store: inline_c_ffi_6989586621679083863 :: Ptr (Ptr ()) -> Ptr (Ref NixStore) -> Ptr (CStdSet NixStorePath) -> Ptr (CStdSet NixStorePath) -> CInt -> CInt -> CInt -> IO ()
+ Hercules.CNix.Memory: class Delete a
+ Hercules.CNix.Memory: class Finalizer a
+ Hercules.CNix.Memory: delete :: Delete a => Ptr a -> IO ()
+ Hercules.CNix.Memory: finalizer :: Finalizer a => FinalizerPtr a
+ Hercules.CNix.Memory: forNonNull :: Applicative m => Ptr a -> (Ptr a -> m b) -> m (Maybe b)
+ Hercules.CNix.Memory: toForeignPtr :: Finalizer a => Ptr a -> IO (ForeignPtr a)
+ Hercules.CNix.Memory: traverseNonNull :: Applicative m => (Ptr a -> m b) -> Ptr a -> m (Maybe b)
+ Hercules.CNix.Memory: withDelete :: Delete a => IO (Ptr a) -> (Ptr a -> IO b) -> IO b
+ Hercules.CNix.Std.String: instance Hercules.CNix.Memory.Delete Hercules.CNix.Std.String.Context.CStdString
+ Hercules.CNix.Std.String: instance Hercules.CNix.Memory.Finalizer Hercules.CNix.Std.String.Context.CStdString
+ Hercules.CNix.Store: instance Hercules.CNix.Memory.Delete (Hercules.CNix.Store.Context.Ref Hercules.CNix.Store.Context.NixStore)
+ Hercules.CNix.Store: instance Hercules.CNix.Memory.Delete Hercules.CNix.Store.Context.DerivationInputsIterator
+ Hercules.CNix.Store: instance Hercules.CNix.Memory.Delete Hercules.CNix.Store.Context.DerivationOutputsIterator
+ Hercules.CNix.Store: instance Hercules.CNix.Memory.Delete Hercules.CNix.Store.Context.StringPairs
+ Hercules.CNix.Store: instance Hercules.CNix.Memory.Delete Hercules.CNix.Store.Context.StringPairsIterator
+ Hercules.CNix.Store: instance Hercules.CNix.Memory.Delete Hercules.CNix.Store.Context.Strings
+ Hercules.CNix.Store: instance Hercules.CNix.Memory.Finalizer (Hercules.CNix.Store.Context.Ref Hercules.CNix.Store.Context.ValidPathInfo)
+ Hercules.CNix.Store: instance Hercules.CNix.Memory.Finalizer Hercules.CNix.Store.Context.Derivation
+ Hercules.CNix.Store: instance Hercules.CNix.Memory.Finalizer Hercules.CNix.Store.Context.NixStorePath
+ Hercules.CNix.Store: instance Hercules.CNix.Memory.Finalizer Hercules.CNix.Store.Context.NixStorePathWithOutputs
+ Hercules.CNix.Store: instance Hercules.CNix.Memory.Finalizer Hercules.CNix.Store.Context.SecretKey
+ Hercules.CNix.Store: instance Hercules.CNix.Memory.Finalizer Hercules.CNix.Store.Context.Strings
- Hercules.CNix.Encapsulation: moveToForeignPtrWrapper :: HasEncapsulation a b => Ptr a -> IO b
+ Hercules.CNix.Encapsulation: moveToForeignPtrWrapper :: (HasEncapsulation a b, Finalizer a, Coercible b (ForeignPtr a)) => Ptr a -> IO b
- Hercules.CNix.Std.String: delete :: Ptr CStdString -> IO ()
+ Hercules.CNix.Std.String: delete :: Delete a => Ptr a -> IO ()
- Hercules.CNix.Store: forNonNull :: Applicative m => Ptr a -> (Ptr a -> m b) -> m (Maybe b)
+ Hercules.CNix.Store: forNonNull :: Ptr a -> (Ptr a -> IO b) -> IO (Maybe b)
- Hercules.CNix.Store: traverseNonNull :: Applicative m => (Ptr a -> m b) -> Ptr a -> m (Maybe b)
+ Hercules.CNix.Store: traverseNonNull :: (Ptr a -> IO b) -> Ptr a -> IO (Maybe b)

Files

CHANGELOG.md view
@@ -5,6 +5,21 @@  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). +## 0.3.6.0 - 2024-05-19++### Added++ - `Hercules.CNix.Memory` module, containing type classes and helpers for common memory management tasks.++### Fixed++ - Memory safety stability improvements+ - Cleaned up haddocks++### Removed++ - Certain unintentional exports have been deprecated; see haddocks+ ## 0.3.5.1 - 2024-05-03  ### Fixed
hercules-ci-cnix-store.cabal view
@@ -1,7 +1,7 @@ cabal-version: 2.4  name:           hercules-ci-cnix-store-version:        0.3.5.1+version:        0.3.6.0 synopsis:       Haskell bindings for Nix's libstore category:       Nix homepage:       https://docs.hercules-ci.com@@ -80,6 +80,7 @@       Hercules.CNix       Hercules.CNix.Encapsulation       Hercules.CNix.Exception+      Hercules.CNix.Memory       Hercules.CNix.Settings       Hercules.CNix.Std.Set       Hercules.CNix.Std.String
src/Hercules/CNix/Encapsulation.hs view
@@ -1,3 +1,4 @@+{-# LANGUAGE DefaultSignatures #-} {-# LANGUAGE FunctionalDependencies #-}  module Hercules.CNix.Encapsulation@@ -6,13 +7,17 @@   ) where -import Foreign (Ptr, nullPtr)+import Data.Coerce (Coercible, coerce)+import Foreign (ForeignPtr, Ptr, newForeignPtr, nullPtr)+import Hercules.CNix.Memory (Finalizer, finalizer) import Prelude  class HasEncapsulation a b | b -> a where   -- | Takes ownership of the pointer, freeing/finalizing the pointer when   -- collectable.   moveToForeignPtrWrapper :: Ptr a -> IO b+  default moveToForeignPtrWrapper :: (Finalizer a, Coercible b (ForeignPtr a)) => Ptr a -> IO b+  moveToForeignPtrWrapper = coerce <$> newForeignPtr finalizer  nullableMoveToForeignPtrWrapper :: (HasEncapsulation a b) => Ptr a -> IO (Maybe b) nullableMoveToForeignPtrWrapper rawPtr | rawPtr == nullPtr = pure Nothing
+ src/Hercules/CNix/Memory.hs view
@@ -0,0 +1,73 @@+-- | Memory management utilities.+module Hercules.CNix.Memory+  ( -- * Free after use+    Delete (..),+    withDelete,++    -- * Free on GC+    Finalizer (..),+    toForeignPtr,++    -- * Nullable pointers+    forNonNull,+    traverseNonNull,+  )+where++import Foreign (FinalizerPtr, ForeignPtr, newForeignPtr, nullPtr)+import Protolude++-- | Types whose memory / resources can be freed in a consistent way.+class Delete a where+  delete :: Ptr a -> IO ()++-- | Obtain a pointer to a resource and run an action with it.+withDelete :: (Delete a) => IO (Ptr a) -> (Ptr a -> IO b) -> IO b+withDelete make = bracket make delete++-- | Like 'Delete', but the design of finalizers favors that we implement it+-- by means of a function pointer instead of a Haskell function. That way, it+-- can be run during GC, without the need for a separate thread and such.+--+-- NOTE: This should always return a CAF, to avoid repeated allocation,+-- initialization, etc.+--+-- Example:+--+-- @+-- instance Finalizer CStdString where+--   finalizer = finalize+--+-- finalize :: FinalizerPtr CStdString+-- {-# NOINLINE finalize #-}+-- finalize =+--   unsafePerformIO+--     [C.exp|+--       void (*)(std::string *) {+--         [](std::string *v) {+--           delete v;+--         }+--       }+--     |]+-- @+class Finalizer a where+  finalizer :: FinalizerPtr a++-- | Construct a 'ForeignPtr' using 'finalizer'.+-- This takes ownership of the pointer, so it must only be called once per pointer.+toForeignPtr :: (Finalizer a) => Ptr a -> IO (ForeignPtr a)+toForeignPtr ptr = newForeignPtr finalizer ptr++-- Pointer utilities++-- | Turn an action on pointer into an action that returns 'Nothing' iff the pointer is 'nullPtr'.+--+-- Same as 'flip' 'forNonNull'.+traverseNonNull :: (Applicative m) => (Ptr a -> m b) -> Ptr a -> m (Maybe b)+traverseNonNull f p = if p == nullPtr then pure Nothing else Just <$> f p++-- | Run an action with a pointer, if it is not 'nullPtr'.+--+-- Same as 'flip' 'traverseNonNull'.+forNonNull :: (Applicative m) => Ptr a -> (Ptr a -> m b) -> m (Maybe b)+forNonNull = flip traverseNonNull
src/Hercules/CNix/Std/String.hs view
@@ -4,6 +4,8 @@ {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE TemplateHaskell #-} {-# LANGUAGE TypeApplications #-}+-- 'Delete' and 'Finalizer' instances are necessarily orphan instances due to TH staging restrictions.+{-# OPTIONS_GHC -Wno-orphans #-}  module Hercules.CNix.Std.String   ( -- * Context@@ -23,11 +25,12 @@   ) where -import Control.Exception (bracket, mask_)+import Control.Exception (mask_) import Data.ByteString (ByteString) import Data.ByteString.Unsafe (unsafePackMallocCStringLen) import Foreign hiding (new) import Hercules.CNix.Encapsulation+import Hercules.CNix.Memory (Delete (..), Finalizer (finalizer), withDelete) import Hercules.CNix.Std.String.Context import Hercules.CNix.Std.String.Instances () import qualified Language.C.Inline as C@@ -57,12 +60,15 @@     return new std::string($bs-ptr:bs, $bs-len:bs);   }|] -delete :: Ptr CStdString -> IO ()-delete bs = [C.block| void { delete $(std::string *bs); }|]+instance Delete CStdString where+  delete bs = [C.block| void { delete $(std::string *bs); }|]  withString :: ByteString -> (Ptr CStdString -> IO a) -> IO a-withString bs = bracket (new bs) delete+withString bs = withDelete (new bs) +instance Finalizer CStdString where+  finalizer = finalize -- must be a CAF+ finalize :: FinalizerPtr CStdString {-# NOINLINE finalize #-} finalize =@@ -77,8 +83,7 @@  newtype StdString = StdString (ForeignPtr CStdString) -instance HasEncapsulation CStdString StdString where-  moveToForeignPtrWrapper x = StdString <$> newForeignPtr finalize x+instance HasEncapsulation CStdString StdString  copyToByteString :: StdString -> IO ByteString copyToByteString (StdString s) = mask_ $ alloca \ptr -> alloca \sz -> do
src/Hercules/CNix/Store.hs view
@@ -4,13 +4,140 @@ {-# LANGUAGE QuasiQuotes #-} {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE TemplateHaskell #-}+-- 'Delete' and 'Finalizer' instances are necessarily orphan instances due to TH staging restrictions.+{-# OPTIONS_GHC -Wno-orphans #-} #ifdef __GHCIDE__ # define NIX_IS_AT_LEAST(mm,m,p) 1 #endif  module Hercules.CNix.Store-  ( module Hercules.CNix.Store,-    module Hercules.CNix.Store.Context,+  ( -- * Opening a 'Store'+    Store (..),+    openStore,+    releaseStore,+    withStore,+    withStore',+    withStoreFromURI,++    -- * Store properties+    storeUri,+    storeDir,+    getStoreProtocolVersion,+    getClientProtocolVersion,++    -- * Store paths+    StorePath (..),+    parseStorePathBaseName,+    parseStorePath,+    followLinksToStorePath,+    storePathToPath,+    getStorePathBaseName,+    getStorePathHash,++    -- * Store objects+    isValidPath,+    queryPathInfo,+    queryPathInfoFromClientCache,+    ValidPathInfo,+    validPathInfoNarSize,+    validPathInfoNarHash32,+    validPathInfoDeriver,+    validPathInfoDeriver',+    validPathInfoReferences,+    validPathInfoReferences',++    computeFSClosure,+    ClosureParams(..),+    defaultClosureParams,++    -- * Realisation+    ensurePath,+    buildPaths,+    buildPath,++    -- * Garbage collection+    addTemporaryRoot,++    -- * In-memory cache control+    clearPathInfoCache,+    clearSubstituterCaches,++    -- * Derivation references+    StorePathWithOutputs (..),+    newStorePathWithOutputs,+    getStorePath,+    getOutputs,++    -- * Derivations+    Derivation (..),+    getDerivation,+    getDerivationFromString,+    getDerivationNameFromPath,+    getDerivationPlatform,+    getDerivationBuilder,+    getDerivationArguments,+    getDerivationEnv,+    getDerivationSources,+    getDerivationSources',+    getDerivationInputs,+    getDerivationInputs',++    getDerivationOutputNames,+    DerivationOutput (..),+    DerivationOutputDetail (..),+    FixedOutputHash (..),+    FileIngestionMethod (..),+    getDerivationOutputs,++    -- * Copying+    copyClosure,++    -- * Signing+    SecretKey,+    parseSecretKey,+    signPath,++    -- * Hashes+    Hash (..),+    HashType (..),++    -- * Utilities+    --+    -- To be moved and deprecated+    Strings,+    withStrings,+    withStringsOf,+    pushString,+    getStringsLength,+    toByteStrings,+    toByteStringMap,++    -- * Deprecated+    forNonNull,+    traverseNonNull,+    deleteDerivationInputsIterator,+    deleteDerivationOutputsIterator,+    deleteStringPairs,+    deleteStrings,+    finalizeDerivation,+    finalizeRefValidPathInfo,+    finalizeSecretKey,+    finalizeStorePath,+    finalizeStorePathWithOutputs,+    finalizeStrings,+    moveStorePath,+    moveStorePathMaybe,+    unsafeMallocBS,+    withPtr',+    DerivationInputsIterator,+    DerivationOutputsIterator,+    NixStore,+    NixStorePath,+    Ref,+    StringPairs,++    -- * Re-exports+    Hercules.CNix.Store.Context.context,   ) where @@ -22,11 +149,11 @@ import qualified Data.ByteString.Unsafe as BS import Data.Coerce (coerce) import qualified Data.Map as M-import Foreign (alloca, free, nullPtr)+import Foreign (alloca, free) import Foreign.ForeignPtr import Foreign.ForeignPtr.Unsafe (unsafeForeignPtrToPtr) import Foreign.Storable (peek)-import Hercules.CNix.Encapsulation (HasEncapsulation (..))+import Hercules.CNix.Encapsulation (HasEncapsulation (..), nullableMoveToForeignPtrWrapper) import Hercules.CNix.Std.Set (StdSet, stdSetCtx) import qualified Hercules.CNix.Std.Set as Std.Set import Hercules.CNix.Std.String (stdStringCtx)@@ -47,6 +174,8 @@     unsafeMallocBS,   ) import qualified Hercules.CNix.Store.Context as C hiding (context)+import Hercules.CNix.Memory (Delete(delete), Finalizer (finalizer), withDelete, toForeignPtr)+import qualified Hercules.CNix.Memory import Hercules.CNix.Store.Instances () import qualified Language.C.Inline.Cpp as C import qualified Language.C.Inline.Cpp.Exception as C@@ -102,14 +231,19 @@  C.using "namespace hercules_ci_cnix" -forNonNull :: Applicative m => Ptr a -> (Ptr a -> m b) -> m (Maybe b)-forNonNull = flip traverseNonNull+{-# DEPRECATED forNonNull "Use 'Hercules.CNix.Memory.forNonNull' instead" #-}+forNonNull :: Ptr a -> (Ptr a -> IO b) -> IO (Maybe b)+forNonNull = Hercules.CNix.Memory.forNonNull -traverseNonNull :: Applicative m => (Ptr a -> m b) -> Ptr a -> m (Maybe b)-traverseNonNull f p = if p == nullPtr then pure Nothing else Just <$> f p+{-# DEPRECATED traverseNonNull "Use 'Hercules.CNix.Memory.traverseNonNull' instead" #-}+traverseNonNull :: (Ptr a -> IO b) -> Ptr a -> IO (Maybe b)+traverseNonNull = Hercules.CNix.Memory.traverseNonNull  newtype Store = Store (Ptr (Ref NixStore)) +instance Delete (Ref NixStore) where+  delete store = [C.exp| void { delete $(refStore* store) } |]+ openStore :: IO Store openStore =   coerce@@ -119,7 +253,7 @@     } |]  releaseStore :: Store -> IO ()-releaseStore (Store store) = [C.exp| void { delete $(refStore* store) } |]+releaseStore (Store store) = delete store  withStore :: MonadUnliftIO m => (Store -> m a) -> m a withStore m = do@@ -141,17 +275,16 @@   let storeURI = encodeUtf8 storeURIText   (UnliftIO unlift) <- askUnliftIO   liftIO $-    bracket+    withDelete       [C.throwBlock| refStore* {         refStore s = openStore($bs-cstr:storeURI);         return new refStore(s);       }|]-      (\x -> [C.exp| void { delete $(refStore* x) } |])       (unlift . f . Store)  storeUri :: MonadIO m => Store -> m ByteString-storeUri (Store store) =-  unsafeMallocBS+storeUri (Store store) = liftIO do+  BS.unsafePackMallocCString =<<     [C.block| const char* {        std::string uri = (*$(refStore* store))->getUri();        return stringdup(uri);@@ -159,8 +292,8 @@  -- | Usually @"/nix/store"@ storeDir :: MonadIO m => Store -> m ByteString-storeDir (Store store) =-  unsafeMallocBS+storeDir (Store store) = liftIO do+  BS.unsafePackMallocCString =<<     [C.block| const char* {        std::string uri = (*$(refStore* store))->storeDir;        return stringdup(uri);@@ -184,9 +317,11 @@ -- | Store-agnostic store path representation: hash and name. Does not have a storedir or subpath inside the store path. newtype StorePath = StorePath (ForeignPtr NixStorePath) -instance HasEncapsulation NixStorePath StorePath where-  moveToForeignPtrWrapper = moveStorePath+instance HasEncapsulation NixStorePath StorePath +instance Finalizer NixStorePath where+  finalizer = finalizeStorePath -- must be CAF+ finalizeStorePath :: FinalizerPtr NixStorePath {-# NOINLINE finalizeStorePath #-} finalizeStorePath =@@ -198,14 +333,17 @@         }       }     |]+{-# DEPRECATED finalizeStorePath "Use 'finalizer' instead" #-}  -- | Move ownership of a Ptr NixStorePath into 'StorePath' moveStorePath :: Ptr NixStorePath -> IO StorePath-moveStorePath x = StorePath <$> newForeignPtr finalizeStorePath x+moveStorePath = moveToForeignPtrWrapper+{-# DEPRECATED moveStorePath "Use 'moveToForeignPtrWrapper' instead" #-}  -- | Move ownership of a Ptr NixStorePath into 'StorePath' moveStorePathMaybe :: Ptr NixStorePath -> IO (Maybe StorePath)-moveStorePathMaybe = traverseNonNull $ fmap StorePath . newForeignPtr finalizeStorePath+moveStorePathMaybe = nullableMoveToForeignPtrWrapper+{-# DEPRECATED moveStorePathMaybe "Use 'nullableMoveToForeignPtrWrapper' instead" #-}  instance Prelude.Show StorePath where   show storePath = unsafePerformIO do@@ -234,7 +372,7 @@ -- Throws C++ `BadStorePath` exception when invalid. parseStorePathBaseName :: ByteString -> IO StorePath parseStorePathBaseName bs =-  moveStorePath+  moveToForeignPtrWrapper     =<< [C.throwBlock| nix::StorePath *{       return new StorePath(std::string($bs-ptr:bs, $bs-len:bs));     }|]@@ -244,7 +382,7 @@ -- Throws C++ `BadStorePath` exception when invalid. parseStorePath :: Store -> ByteString -> IO StorePath parseStorePath (Store store) bs =-  moveStorePath+  moveToForeignPtrWrapper     =<< [C.throwBlock| nix::StorePath *{       return new StorePath(std::move((*$(refStore* store))->parseStorePath(std::string($bs-ptr:bs, $bs-len:bs))));     }|]@@ -310,9 +448,11 @@  newtype StorePathWithOutputs = StorePathWithOutputs (ForeignPtr C.NixStorePathWithOutputs) -instance HasEncapsulation C.NixStorePathWithOutputs StorePathWithOutputs where-  moveToForeignPtrWrapper x = StorePathWithOutputs <$> newForeignPtr finalizeStorePathWithOutputs x+instance HasEncapsulation C.NixStorePathWithOutputs StorePathWithOutputs +instance Finalizer C.NixStorePathWithOutputs where+  finalizer = finalizeStorePathWithOutputs -- must be CAF+ finalizeStorePathWithOutputs :: FinalizerPtr C.NixStorePathWithOutputs {-# NOINLINE finalizeStorePathWithOutputs #-} finalizeStorePathWithOutputs =@@ -324,6 +464,7 @@         }       }     |]+{-# DEPRECATED finalizeStorePathWithOutputs "Use 'finalizer' instead" #-}  newStorePathWithOutputs :: StorePath -> [ByteString] -> IO StorePathWithOutputs newStorePathWithOutputs storePath outputs = do@@ -366,9 +507,11 @@  newtype Derivation = Derivation (ForeignPtr C.Derivation) -instance HasEncapsulation C.Derivation Derivation where-  moveToForeignPtrWrapper = fmap Derivation . newForeignPtr finalizeDerivation+instance HasEncapsulation C.Derivation Derivation +instance Finalizer C.Derivation where+  finalizer = finalizeDerivation -- must be CAF+ finalizeDerivation :: FinalizerPtr C.Derivation {-# NOINLINE finalizeDerivation #-} finalizeDerivation =@@ -379,6 +522,7 @@         delete v;       }     } |]+{-# DEPRECATED finalizeDerivation "Use 'finalizer' instead" #-}  getDerivation :: Store -> StorePath -> IO Derivation getDerivation (Store store) (StorePath spwo) = do@@ -446,14 +590,14 @@   deriving (Eq, Show)  getDerivationOutputs :: Store -> ByteString -> Derivation -> IO [DerivationOutput]-getDerivationOutputs (Store store) drvName (Derivation derivation) =-  bracket+getDerivationOutputs (Store store) drvName (Derivation derivationFPtr) =+  withForeignPtr derivationFPtr \derivation ->+  withDelete     [C.exp| DerivationOutputsIterator* {-      new DerivationOutputsIterator($fptr-ptr:(Derivation *derivation)->outputs.begin())-    }|]-    deleteDerivationOutputsIterator-    $ \i -> fix $ \continue -> do-      isEnd <- (0 /=) <$> [C.exp| bool { *$(DerivationOutputsIterator *i) == $fptr-ptr:(Derivation *derivation)->outputs.end() }|]+      new DerivationOutputsIterator($(Derivation *derivation)->outputs.begin())+    }|] \i ->+    fix $ \continue -> do+      isEnd <- (0 /=) <$> [C.exp| bool { *$(DerivationOutputsIterator *i) == $(Derivation *derivation)->outputs.end() }|]       if isEnd         then pure []         else@@ -483,7 +627,7 @@                       },                       [&](DerivationOutput::CAFixed dof) -> void {                         typ = 1;-                        path = new StorePath(dof.path(store, $fptr-ptr:(Derivation *derivation)->name, nameString));+                        path = new StorePath(dof.path(store, $(Derivation *derivation)->name, nameString));                         std::visit(overloaded {                           [&](nix::FileIngestionMethod fim_) -> void {                             switch (fim_) {@@ -615,7 +759,7 @@                       },                       [&](DerivationOutputCAFixed dof) -> void {                         typ = 1;-                        path = new StorePath(dof.path(store, $fptr-ptr:(Derivation *derivation)->name, nameString));+                        path = new StorePath(dof.path(store, $(Derivation *derivation)->name, nameString)); #if NIX_IS_AT_LEAST(2, 16, 0)                         std::visit(overloaded {                           [&](nix::FileIngestionMethod fim_) -> void {@@ -756,7 +900,7 @@                     i++;                   }|]                   name <- unsafePackMallocCString =<< peek nameP-                  path <- moveStorePathMaybe =<< peek pathP+                  path <- nullableMoveToForeignPtrWrapper =<< peek pathP                   typ <- peek typP                   let getFileIngestionMethod = peek fimP <&> \case 0 -> Flat; 1 -> Recursive; _ -> panic "getDerivationOutputs: unknown fim"                       getHashType =@@ -794,26 +938,30 @@           )             <*> continue +instance Delete DerivationOutputsIterator where+  delete a = [C.block| void { delete $(DerivationOutputsIterator *a); }|]+ deleteDerivationOutputsIterator :: Ptr DerivationOutputsIterator -> IO ()-deleteDerivationOutputsIterator a = [C.block| void { delete $(DerivationOutputsIterator *a); }|]+deleteDerivationOutputsIterator = delete+{-# DEPRECATED deleteDerivationOutputsIterator "Use 'delete' instead" #-}  getDerivationPlatform :: Derivation -> IO ByteString getDerivationPlatform derivation =-  unsafeMallocBS+  BS.unsafePackMallocCString =<<     [C.exp| const char* {        stringdup($fptr-ptr:(Derivation *derivation)->platform)      } |]  getDerivationBuilder :: Derivation -> IO ByteString getDerivationBuilder derivation =-  unsafeMallocBS+  BS.unsafePackMallocCString =<<     [C.exp| const char* {        stringdup($fptr-ptr:(Derivation *derivation)->builder)      } |]  getDerivationArguments :: Derivation -> IO [ByteString] getDerivationArguments derivation =-  bracket+  withDelete     [C.throwBlock| Strings* {       Strings *r = new Strings();       for (auto i : $fptr-ptr:(Derivation *derivation)->args) {@@ -821,7 +969,6 @@       }       return r;     }|]-    deleteStrings     toByteStrings  getDerivationSources :: Store -> Derivation -> IO [StorePath]@@ -837,7 +984,7 @@           r->push_back(new StorePath(s));         return r;       }|]-  traverse moveStorePath =<< Std.Vector.toList vec+  traverse moveToForeignPtrWrapper =<< Std.Vector.toList vec  getDerivationInputs :: Store -> Derivation -> IO [(StorePath, [ByteString])] getDerivationInputs _ = getDerivationInputs'@@ -845,14 +992,14 @@ -- | Get the inputs of a derivation, ignoring dependencies on outputs of outputs (RFC 92 inputs). getDerivationInputs' :: Derivation -> IO [(StorePath, [ByteString])] #if NIX_IS_AT_LEAST(2, 18, 0)-getDerivationInputs' derivation =-  bracket+getDerivationInputs' (Derivation derivationFPtr) =+  withForeignPtr derivationFPtr \derivation ->+  withDelete     [C.exp| DerivationInputsIterator* {-      new DerivationInputsIterator($fptr-ptr:(Derivation *derivation)->inputDrvs.map.begin())+      new DerivationInputsIterator($(Derivation *derivation)->inputDrvs.map.begin())     }|]-    deleteDerivationInputsIterator     $ \i -> fix $ \continue -> do-      isEnd <- (0 /=) <$> [C.exp| bool { *$(DerivationInputsIterator *i) == $fptr-ptr:(Derivation *derivation)->inputDrvs.map.end() }|]+      isEnd <- (0 /=) <$> [C.exp| bool { *$(DerivationInputsIterator *i) == $(Derivation *derivation)->inputDrvs.map.end() }|]       if isEnd         then pure []         else do@@ -860,9 +1007,9 @@             [C.throwBlock| nix::StorePath *{               return new StorePath((*$(DerivationInputsIterator *i))->first);             }|]-              >>= moveStorePath+              >>= moveToForeignPtrWrapper           outs <--            bracket+            withDelete               [C.block| Strings* {                 Strings *r = new Strings(); @@ -876,19 +1023,18 @@                  return r;               }|]-              deleteStrings               toByteStrings           [C.block| void { (*$(DerivationInputsIterator *i))++; }|]           ((name, outs) :) <$> continue #else-getDerivationInputs' derivation =-  bracket+getDerivationInputs' (Derivation derivationFPtr) =+  withForeignPtr derivationFPtr \derivation ->+  withDelete     [C.exp| DerivationInputsIterator* {-      new DerivationInputsIterator($fptr-ptr:(Derivation *derivation)->inputDrvs.begin())+      new DerivationInputsIterator($(Derivation *derivation)->inputDrvs.begin())     }|]-    deleteDerivationInputsIterator     $ \i -> fix $ \continue -> do-      isEnd <- (0 /=) <$> [C.exp| bool { *$(DerivationInputsIterator *i) == $fptr-ptr:(Derivation *derivation)->inputDrvs.end() }|]+      isEnd <- (0 /=) <$> [C.exp| bool { *$(DerivationInputsIterator *i) == $(Derivation *derivation)->inputDrvs.end() }|]       if isEnd         then pure []         else do@@ -896,9 +1042,9 @@             [C.throwBlock| nix::StorePath *{               return new StorePath((*$(DerivationInputsIterator *i))->first);             }|]-              >>= moveStorePath+              >>= moveToForeignPtrWrapper           outs <--            bracket+            withDelete               [C.block| Strings*{                  Strings *r = new Strings();                 for (auto i : (*$(DerivationInputsIterator *i))->second) {@@ -906,39 +1052,53 @@                 }                 return r;               }|]-              deleteStrings               toByteStrings           [C.block| void { (*$(DerivationInputsIterator *i))++; }|]           ((name, outs) :) <$> continue #endif +instance Delete DerivationInputsIterator where+  delete a = [C.block| void { delete $(DerivationInputsIterator *a); }|]+ deleteDerivationInputsIterator :: Ptr DerivationInputsIterator -> IO ()-deleteDerivationInputsIterator a = [C.block| void { delete $(DerivationInputsIterator *a); }|]+deleteDerivationInputsIterator = delete+{-# DEPRECATED deleteDerivationInputsIterator "Use 'delete' instead" #-}  getDerivationEnv :: Derivation -> IO (Map ByteString ByteString)-getDerivationEnv derivation =-  [C.exp| StringPairs* { &($fptr-ptr:(Derivation *derivation)->env) }|]-    >>= toByteStringMap+getDerivationEnv (Derivation fptr) =+  withForeignPtr fptr \ptr -> do+    pairs <- [C.exp| StringPairs* { &$(Derivation *ptr)->env }|]+    toByteStringMap pairs -getDerivationOutputNames :: ForeignPtr Derivation -> IO [ByteString]-getDerivationOutputNames derivation =-  bracket+getDerivationOutputNames :: ForeignPtr C.Derivation -> IO [ByteString]+getDerivationOutputNames fptr =+  withForeignPtr fptr \ptr -> withDelete     [C.throwBlock| Strings* {       Strings *r = new Strings();-      for (auto i : $fptr-ptr:(Derivation *derivation)->outputs) {+      for (auto i : $(Derivation *ptr)->outputs) {         r->push_back(i.first);       }       return r;     }|]-    deleteStrings     toByteStrings +instance Delete StringPairs where+  delete s = [C.block| void { delete $(StringPairs *s); }|]+ deleteStringPairs :: Ptr StringPairs -> IO ()-deleteStringPairs s = [C.block| void { delete $(StringPairs *s); }|]+deleteStringPairs = delete+{-# DEPRECATED deleteStringPairs "Use 'delete' instead" #-} +instance Delete Strings where+  delete s = [C.block| void { delete $(Strings *s); }|]+ deleteStrings :: Ptr Strings -> IO ()-deleteStrings s = [C.block| void { delete $(Strings *s); }|]+deleteStrings = delete+{-# DEPRECATED deleteStrings "Use 'delete' instead" #-} +instance Finalizer Strings where+  finalizer = finalizeStrings -- must be CAF+ finalizeStrings :: FinalizerPtr Strings {-# NOINLINE finalizeStrings #-} finalizeStrings =@@ -949,6 +1109,7 @@         delete v;       }     } |]+{-# DEPRECATED finalizeStrings "Use 'finalizer' instead" #-}  getStringsLength :: Ptr Strings -> IO C.CSize getStringsLength strings = [C.exp| size_t { $(Strings *strings)->size() }|]@@ -968,8 +1129,7 @@  toByteStringMap :: Ptr StringPairs -> IO (Map ByteString ByteString) toByteStringMap strings =-  M.fromList <$> do-    i <- [C.exp| StringPairsIterator *{ new StringPairsIterator($(StringPairs *strings)->begin()) } |]+  M.fromList <$> withStringPairIterator \i ->     fix $ \go -> do       isEnd <- (0 /=) <$> [C.exp| bool { *$(StringPairsIterator *i) == $(StringPairs *strings)->end() }|]       if isEnd@@ -981,12 +1141,18 @@           bv <- BS.unsafePackMallocCString v           [C.block| void { (*$(StringPairsIterator *i))++; }|]           ((bk, bv) :) <$> go+  where+    withStringPairIterator =+      withDelete+        [C.exp| StringPairsIterator *{ new StringPairsIterator($(StringPairs *strings)->begin()) }|] +instance Delete C.StringPairsIterator where+  delete i = [C.block| void { delete $(StringPairsIterator *i); }|]+ withStrings :: (Ptr Strings -> IO a) -> IO a withStrings =-  bracket+  withDelete     [C.exp| Strings *{ new Strings() }|]-    (\sp -> [C.block| void { delete $(Strings *sp); }|])  withStringsOf :: [ByteString] -> (Ptr Strings -> IO a) -> IO a withStringsOf paths f =@@ -1024,8 +1190,11 @@   [C.throwBlock| SecretKey* {     return new SecretKey($bs-cstr:bs);   }|]-    >>= newForeignPtr finalizeSecretKey+    >>= toForeignPtr +instance Finalizer SecretKey where+  finalizer = finalizeSecretKey -- must be CAF+ finalizeSecretKey :: FinalizerPtr SecretKey {-# NOINLINE finalizeSecretKey #-} finalizeSecretKey =@@ -1036,6 +1205,7 @@         delete v;       }     } |]+{-# DEPRECATED finalizeSecretKey "Use 'finalizer' instead" #-}  signPath ::   Store ->@@ -1078,7 +1248,7 @@ -- | Follow symlinks to the store and chop off the parts after the top-level store name followLinksToStorePath :: Store -> ByteString -> IO StorePath followLinksToStorePath (Store store) bs =-  moveStorePath+  moveToForeignPtrWrapper     =<< [C.throwBlock| nix::StorePath *{       ReceiveInterrupts _;       Store &store = **$(refStore* store);@@ -1103,15 +1273,16 @@   StorePath ->   -- | ValidPathInfo or exception   IO (ForeignPtr (Ref ValidPathInfo))-queryPathInfo (Store store) (StorePath path) = do+queryPathInfo (Store store) (StorePath pathFPtr) = +  withForeignPtr pathFPtr \path -> do   vpi <-     [C.throwBlock| refValidPathInfo* {       ReceiveInterrupts _;       Store &store = **$(refStore* store);-      StorePath &path = *$fptr-ptr:(nix::StorePath *path);+      StorePath &path = *$(nix::StorePath *path);       return new refValidPathInfo(store.queryPathInfo(path));     }|]-  newForeignPtr finalizeRefValidPathInfo vpi+  toForeignPtr vpi  -- | Query only the local client cache ("narinfo cache") - does not query the actual store or daemon. --@@ -1122,13 +1293,14 @@   Store ->   StorePath ->   IO (Maybe (Maybe (ForeignPtr (Ref ValidPathInfo))))-queryPathInfoFromClientCache (Store store) (StorePath path) =+queryPathInfoFromClientCache (Store store) (StorePath pathFPtr) =+  withForeignPtr pathFPtr \path -> #if NIX_IS_AT_LEAST(2, 20, 0)   alloca \isKnownP -> do     mvpi <- [C.throwBlock| refValidPathInfo* {         ReceiveInterrupts _;         Store &store = **$(refStore* store);-        StorePath &path = *$fptr-ptr:(nix::StorePath *path);+        StorePath &path = *$(nix::StorePath *path);         bool &isKnown = *$(bool* isKnownP);         std::optional<std::shared_ptr<const ValidPathInfo>> maybeVPI =             store.queryPathInfoFromClientCache(path);@@ -1147,13 +1319,13 @@       }|]     isKnown <- peek isKnownP <&> (/= 0)     for (guard isKnown) \_ -> do-      mvpi & traverseNonNull (newForeignPtr finalizeRefValidPathInfo)+      mvpi & traverseNonNull toForeignPtr #else   alloca \isKnownP -> do     mvpi <- [C.throwBlock| refValidPathInfo* {         ReceiveInterrupts _;         Store &store = **$(refStore* store);-        StorePath &path = *$fptr-ptr:(nix::StorePath *path);+        StorePath &path = *$(nix::StorePath *path);         bool &isKnown = *$(bool* isKnownP);          std::string uri = store.getUri();@@ -1180,9 +1352,12 @@       }|]     isKnown <- peek isKnownP <&> (/= 0)     for (guard isKnown) \_ -> do-      mvpi & traverseNonNull (newForeignPtr finalizeRefValidPathInfo)  +      mvpi & traverseNonNull toForeignPtr #endif +instance Finalizer (Ref ValidPathInfo) where+  finalizer = finalizeRefValidPathInfo -- must be CAF+ finalizeRefValidPathInfo :: FinalizerPtr (Ref ValidPathInfo) {-# NOINLINE finalizeRefValidPathInfo #-} finalizeRefValidPathInfo =@@ -1191,6 +1366,7 @@       void (*)(refValidPathInfo *) {         [](refValidPathInfo *v){ delete v; }       }|]+{-# DEPRECATED finalizeRefValidPathInfo "Use 'finalizer' instead" #-}  -- | The narSize field of a ValidPathInfo struct. Source: path-info.hh / store-api.hh validPathInfoNarSize :: ForeignPtr (Ref ValidPathInfo) -> Int64@@ -1222,7 +1398,7 @@  validPathInfoDeriver' :: ForeignPtr (Ref ValidPathInfo) -> IO (Maybe StorePath) validPathInfoDeriver' vpi =-  moveStorePathMaybe+  nullableMoveToForeignPtrWrapper     =<< [C.throwBlock| nix::StorePath * {       std::optional<StorePath> deriver = (*$fptr-ptr:(refValidPathInfo* vpi))->deriver;       return deriver ? new StorePath(*deriver) : nullptr;@@ -1243,7 +1419,7 @@         return sps;       }|]   l <- Std.Vector.toList sps-  for l moveStorePath+  for l moveToForeignPtrWrapper  ----- computeFSClosure ----- data ClosureParams = ClosureParams@@ -1280,3 +1456,4 @@  withPtr' :: (Coercible a' (ForeignPtr a)) => a' -> (Ptr a -> IO b) -> IO b withPtr' p = withForeignPtr (coerce p)+{-# DEPRECATED withPtr' "Use 'HasEncapsulation' instead" #-}
src/Hercules/CNix/Store/Context.hs view
@@ -68,3 +68,4 @@  unsafeMallocBS :: (MonadIO m) => IO Foreign.C.String.CString -> m ByteString unsafeMallocBS m = liftIO (unsafePackMallocCString =<< m)+{-# DEPRECATED unsafeMallocBS "Use unsafePackMallocCString" #-}