Skip to content

Commit ddfdb89

Browse files
committed
remote: add GCRoot type, serializer, prop
1 parent 774590e commit ddfdb89

File tree

7 files changed

+41
-4
lines changed

7 files changed

+41
-4
lines changed

hnix-store-remote/hnix-store-remote.cabal

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,7 @@ library
131131
, mtl
132132
, QuickCheck
133133
, unordered-containers
134+
, unix >= 2.7
134135
, vector
135136
hs-source-dirs: src
136137
ghc-options: -Wall

hnix-store-remote/src/System/Nix/Store/Remote/Arbitrary.hs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,5 +126,8 @@ instance Arbitrary (Some StoreRequest) where
126126
deriving via GenericArbitrary GCResult
127127
instance Arbitrary GCResult
128128

129+
deriving via GenericArbitrary GCRoot
130+
instance Arbitrary GCRoot
131+
129132
deriving via GenericArbitrary Missing
130133
instance Arbitrary Missing

hnix-store-remote/src/System/Nix/Store/Remote/Serializer.hs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,8 @@ module System.Nix.Store.Remote.Serializer
9393
, buildResult
9494
-- *** GCResult
9595
, gcResult
96+
-- *** GCResult
97+
, gcRoot
9698
-- *** Missing
9799
, missing
98100
-- *** Maybe (Metadata StorePath)
@@ -126,6 +128,7 @@ import qualified Control.Monad.Reader
126128
import qualified Data.Attoparsec.Text
127129
import qualified Data.Bits
128130
import qualified Data.ByteString
131+
import qualified Data.ByteString.Char8
129132
import qualified Data.ByteString.Lazy
130133
import qualified Data.HashSet
131134
import qualified Data.Map.Strict
@@ -1463,6 +1466,8 @@ buildResult = Serializer
14631466
t0 :: UTCTime
14641467
t0 = Data.Time.Clock.POSIX.posixSecondsToUTCTime 0
14651468

1469+
-- *** GCResult
1470+
14661471
gcResult
14671472
:: HasStoreDir r
14681473
=> NixSerializer r ReplySError GCResult
@@ -1478,6 +1483,22 @@ gcResult = mapErrorS ReplySError_GCResult $ Serializer
14781483
putS (int @Word64) 0 -- obsolete
14791484
}
14801485

1486+
-- *** GCRoot
1487+
1488+
gcRoot :: NixSerializer r ReplySError GCRoot
1489+
gcRoot = Serializer
1490+
{ getS = mapGetER $ do
1491+
getS byteString >>= \case
1492+
p | p == censored -> pure GCRoot_Censored
1493+
p -> pure (GCRoot_Path p)
1494+
, putS = mapPutER . putS byteString . \case
1495+
GCRoot_Censored -> censored
1496+
GCRoot_Path p -> p
1497+
}
1498+
where censored = Data.ByteString.Char8.pack "{censored}"
1499+
1500+
-- *** Missing
1501+
14811502
missing
14821503
:: HasStoreDir r
14831504
=> NixSerializer r ReplySError Missing

hnix-store-remote/src/System/Nix/Store/Remote/Types/GC.hs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,14 @@ module System.Nix.Store.Remote.Types.GC (
66
GCAction(..)
77
, GCOptions(..)
88
, GCResult(..)
9+
, GCRoot(..)
910
) where
1011

1112
import Data.HashSet (HashSet)
1213
import Data.Word (Word64)
1314
import GHC.Generics (Generic)
1415
import System.Nix.StorePath (StorePath)
16+
import System.Posix.ByteString (RawFilePath)
1517

1618
-- | Garbage collection action
1719
data GCAction
@@ -45,3 +47,9 @@ data GCResult = GCResult
4547
-- - @GCAction_DeleteSpecific@
4648
, gcResultBytesFreed :: Word64
4749
} deriving (Eq, Generic, Ord, Show)
50+
51+
-- | Used as a part of the result of @FindRoots@ operation
52+
data GCRoot
53+
= GCRoot_Censored -- ^ Source path is censored since the user is not trusted
54+
| GCRoot_Path RawFilePath -- ^ Raw source path
55+
deriving (Eq, Generic, Ord, Show)

hnix-store-remote/src/System/Nix/Store/Remote/Types/StoreReply.hs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,12 @@ module System.Nix.Store.Remote.Types.StoreReply
33
) where
44

55
import Data.HashSet (HashSet)
6+
import Data.Map (Map)
67
import System.Nix.Build (BuildResult)
78
import System.Nix.StorePath (HasStoreDir(..), StorePath, StorePathName)
89
import System.Nix.StorePath.Metadata (Metadata)
910
import System.Nix.Store.Remote.Serializer
10-
import System.Nix.Store.Remote.Types.GC (GCResult)
11+
import System.Nix.Store.Remote.Types.GC (GCResult, GCRoot)
1112
import System.Nix.Store.Remote.Types.Query.Missing (Missing)
1213
import System.Nix.Store.Remote.Types.ProtoVersion (HasProtoVersion)
1314

@@ -35,6 +36,9 @@ instance StoreReply BuildResult where
3536
instance StoreReply GCResult where
3637
getReplyS = gcResult
3738

39+
instance StoreReply (Map GCRoot StorePath) where
40+
getReplyS = mapS gcRoot (mapPrimE storePath)
41+
3842
instance StoreReply Missing where
3943
getReplyS = missing
4044

hnix-store-remote/src/System/Nix/Store/Remote/Types/StoreRequest.hs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ module System.Nix.Store.Remote.Types.StoreRequest
66
( StoreRequest(..)
77
) where
88

9-
import Data.ByteString (ByteString)
109
import Data.GADT.Compare.TH (deriveGEq, deriveGCompare)
1110
import Data.GADT.Show.TH (deriveGShow)
1211
import Data.HashSet (HashSet)
@@ -24,7 +23,7 @@ import System.Nix.Signature (Signature)
2423
import System.Nix.Store.Types (FileIngestionMethod, RepairMode)
2524
import System.Nix.StorePath (StorePath, StorePathName, StorePathHashPart)
2625
import System.Nix.StorePath.Metadata (Metadata)
27-
import System.Nix.Store.Remote.Types.GC (GCOptions, GCResult)
26+
import System.Nix.Store.Remote.Types.GC (GCOptions, GCResult, GCRoot)
2827
import System.Nix.Store.Remote.Types.CheckMode (CheckMode)
2928
import System.Nix.Store.Remote.Types.Query.Missing (Missing)
3029
import System.Nix.Store.Remote.Types.StoreText (StoreText)
@@ -89,7 +88,7 @@ data StoreRequest :: Type -> Type where
8988

9089
-- | Find garbage collector roots.
9190
FindRoots
92-
:: StoreRequest (Map ByteString StorePath)
91+
:: StoreRequest (Map GCRoot StorePath)
9392

9493
IsValidPath
9594
:: StorePath

hnix-store-remote/tests/NixSerializerSpec.hs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,7 @@ spec = parallel $ do
152152
describe "StoreReply" $ do
153153
prop "()" $ roundtripS opSuccess
154154
prop "GCResult" $ roundtripSReader @StoreDir gcResult
155+
prop "GCRoot" $ roundtripS gcRoot
155156
prop "Missing" $ roundtripSReader @StoreDir missing
156157
prop "Maybe (Metadata StorePath)" $ roundtripSReader @StoreDir maybePathMetadata
157158

0 commit comments

Comments
 (0)