Skip to content

Commit 3608451

Browse files
committed
add Serialize for Derivation, add getPathOrFail
1 parent c53c107 commit 3608451

File tree

4 files changed

+82
-2
lines changed

4 files changed

+82
-2
lines changed

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@ library
9393
, unordered-containers
9494
, hnix-store-core >= 0.7 && <0.8
9595
, transformers
96+
, vector
9697
hs-source-dirs: src
9798
ghc-options: -Wall
9899

@@ -117,6 +118,7 @@ test-suite remote
117118
build-depends:
118119
hnix-store-core
119120
, hnix-store-remote
121+
, nix-derivation
120122
, bytestring
121123
, cereal
122124
, text

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

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,19 @@ Maintainer : srk <[email protected]>
66
module System.Nix.Store.Remote.Serialize where
77

88
import Data.Serialize (Serialize(..))
9+
import Data.Serialize.Get (Get)
10+
import Data.Serialize.Put (Putter)
911
import Data.Text (Text)
1012

1113
import qualified Data.Bool
14+
import qualified Data.Map
15+
import qualified Data.Set
1216
import qualified Data.Text
17+
import qualified Data.Vector
1318

19+
import Nix.Derivation (Derivation(..), DerivationOutput(..))
1420
import System.Nix.Build (BuildMode(..), BuildStatus(..), BuildResult(..))
21+
import System.Nix.StorePath (StoreDir, StorePath)
1522
import System.Nix.Store.Remote.Serialize.Prim
1623

1724
instance Serialize Text where
@@ -47,3 +54,53 @@ instance Serialize BuildResult where
4754
putBool isNonDeterministic
4855
putTime startTime
4956
putTime stopTime
57+
58+
getDerivation
59+
:: StoreDir
60+
-> Get (Derivation StorePath Text)
61+
getDerivation storeDir = do
62+
outputs <-
63+
Data.Map.fromList
64+
<$> (getMany $ do
65+
outputName <- get
66+
path <- getPathOrFail storeDir
67+
hashAlgo <- get
68+
hash <- get
69+
pure (outputName, DerivationOutput{..})
70+
)
71+
72+
-- Our type is Derivation, but in Nix
73+
-- the type sent over the wire is BasicDerivation
74+
-- which omits inputDrvs
75+
inputDrvs <- pure mempty
76+
inputSrcs <-
77+
Data.Set.fromList
78+
<$> getMany (getPathOrFail storeDir)
79+
80+
platform <- get
81+
builder <- get
82+
args <-
83+
Data.Vector.fromList
84+
<$> getMany get
85+
86+
env <-
87+
Data.Map.fromList
88+
<$> getMany ((,) <$> get <*> get)
89+
pure Derivation{..}
90+
91+
putDerivation :: StoreDir -> Putter (Derivation StorePath Text)
92+
putDerivation storeDir Derivation{..} = do
93+
flip putMany (Data.Map.toList outputs)
94+
$ \(outputName, DerivationOutput{..}) -> do
95+
putText outputName
96+
putPath storeDir path
97+
putText hashAlgo
98+
putText hash
99+
100+
putMany (putPath storeDir) inputSrcs
101+
putText platform
102+
putText builder
103+
putMany putText args
104+
105+
flip putMany (Data.Map.toList env)
106+
$ \(a1, a2) -> putText a1 *> putText a2

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,15 @@ getPath :: StoreDir -> Get (Either InvalidPathError StorePath)
157157
getPath sd =
158158
System.Nix.StorePath.parsePath sd <$> getByteString
159159

160+
-- | Deserialize @StorePath@, checking
161+
-- that @StoreDir@ matches expected value
162+
getPathOrFail :: StoreDir -> Get StorePath
163+
getPathOrFail sd =
164+
getPath sd
165+
>>= either
166+
(fail . show)
167+
pure
168+
160169
-- | Serialize @StorePath@ with its associated @StoreDir@
161170
putPath :: StoreDir -> Putter StorePath
162171
putPath storeDir =

hnix-store-remote/tests/SerializeSpec.hs

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,11 @@ import qualified Data.HashSet
1818
import qualified Data.Time.Clock.POSIX
1919
import qualified System.Nix.Build
2020

21-
import System.Nix.Build (BuildMode, BuildStatus, BuildResult)
21+
import Nix.Derivation (Derivation(..))
22+
import System.Nix.Build (BuildMode, BuildStatus)
23+
import System.Nix.Derivation ()
2224
import System.Nix.StorePath (StoreDir, StorePath)
23-
import System.Nix.Store.Remote.Serialize ()
25+
import System.Nix.Store.Remote.Serialize (getDerivation, putDerivation)
2426
import System.Nix.Store.Remote.Serialize.Prim
2527

2628
roundTrip :: (Eq a, Show a) => Putter a -> Get a -> a -> Property
@@ -145,3 +147,13 @@ spec_buildEnums =
145147
it' "NotDeterministic" System.Nix.Build.NotDeterministic 12
146148
it' "ResolvesToAlreadyValid" System.Nix.Build.ResolvesToAlreadyValid 13
147149
it' "NoSubstituters" System.Nix.Build.NoSubstituters 14
150+
151+
-- ** Derivation
152+
153+
prop_derivation :: StoreDir -> Derivation StorePath Text -> Property
154+
prop_derivation sd drv =
155+
roundTrip
156+
(putDerivation sd)
157+
(getDerivation sd)
158+
-- inputDrvs is not used in remote protocol serialization
159+
(drv { inputDrvs = mempty })

0 commit comments

Comments
 (0)