Skip to content

Commit ee58f66

Browse files
committed
remote: add buildDerivation and test
Closes #20.
1 parent 404a990 commit ee58f66

File tree

6 files changed

+118
-8
lines changed

6 files changed

+118
-8
lines changed

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ library
3333
, text
3434
, unix
3535
, network
36+
, nix-derivation >= 1.1.1 && <2
3637
, mtl
3738
, unordered-containers
3839
, filepath
@@ -47,8 +48,8 @@ test-suite hnix-store-remote-tests
4748
ghc-options: -rtsopts -fprof-auto
4849
type: exitcode-stdio-1.0
4950
main-is: Driver.hs
50-
other-modules:
51-
NixDaemon
51+
other-modules: Derivation
52+
, NixDaemon
5253
hs-source-dirs: tests
5354
build-depends:
5455
attoparsec
@@ -70,6 +71,7 @@ test-suite hnix-store-remote-tests
7071
, tasty-quickcheck
7172
, linux-namespaces
7273
, mtl
74+
, nix-derivation
7375
, temporary
7476
, text
7577
, time

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

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ module System.Nix.Store.Remote
1616
, addIndirectRoot
1717
, addTempRoot
1818
, buildPaths
19+
, buildDerivation
1920
, ensurePath
2021
, findRoots
2122
, isValidPathUncached
@@ -41,6 +42,7 @@ import Data.ByteString.Lazy (ByteString)
4142
import Data.Map.Strict (Map)
4243
import Data.Text (Text)
4344

45+
import Nix.Derivation (Derivation)
4446
import System.Nix.Build (BuildMode, BuildResult)
4547
import System.Nix.Hash (Digest, NamedAlgo, ValidAlgo, SomeNamedDigest(..))
4648
import System.Nix.Nar (Nar)
@@ -196,6 +198,23 @@ buildPaths ps bm = do
196198
putPaths ps
197199
putInt $ fromEnum bm
198200

201+
buildDerivation :: StorePath
202+
-> Derivation StorePath Text
203+
-> BuildMode
204+
-> MonadStore BuildResult
205+
buildDerivation p drv buildMode = do
206+
runOpArgs BuildDerivation $ do
207+
putPath p
208+
putDerivation drv
209+
putEnum buildMode
210+
-- XXX: reason for this is unknown
211+
-- but without it protocol just hangs waiting for
212+
-- more data. Needs investigation
213+
putInt 0
214+
215+
res <- getSocketIncremental $ getBuildResult
216+
return res
217+
199218
ensurePath :: StorePath -> MonadStore ()
200219
ensurePath pn = do
201220
void $ simpleOpArgs EnsurePath $ putPath pn

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

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ import System.Nix.StorePath (ContentAddressableAddress(..), NarHashMode(..))
1515
import Data.Text.Lazy.Builder (Builder)
1616
import qualified Data.Text.Lazy.Builder
1717

18-
import qualified Data.Text
1918
import qualified System.Nix.Hash
2019

2120
-- | Marshall `ContentAddressableAddress` to `Text`
@@ -35,14 +34,9 @@ contentAddressableAddressBuilder (Text digest) =
3534
contentAddressableAddressBuilder (Fixed narHashMode (SomeDigest digest)) =
3635
"fixed:"
3736
<> (Data.Text.Lazy.Builder.fromText $ System.Nix.Hash.algoName @hashAlgo)
38-
<> buildNarHashMode narHashMode
3937
<> digestBuilder digest
40-
where
41-
buildNarHashMode Recursive = "true"
42-
buildNarHashMode RegularFile = "false"
4338

4439
digestBuilder :: Digest a -> Builder
4540
digestBuilder =
4641
Data.Text.Lazy.Builder.fromText
4742
. System.Nix.Hash.encodeBase32
48-

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

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ import qualified Data.ByteString.Lazy as BSL
1919

2020
import Network.Socket.ByteString (recv, sendAll)
2121

22+
import Nix.Derivation
23+
2224
import System.Nix.Build
2325
import System.Nix.StorePath
2426
import System.Nix.Store.Remote.Binary
@@ -142,3 +144,20 @@ getBuildResult = BuildResult
142144
<*> getBool
143145
<*> getTime
144146
<*> getTime
147+
148+
putDerivation :: Derivation StorePath Text -> Put
149+
putDerivation Derivation{..} = do
150+
flip putMany (Data.Map.toList outputs)
151+
$ \(outputName, DerivationOutput{..}) -> do
152+
putText outputName
153+
putPath path
154+
putText hashAlgo
155+
putText hash
156+
157+
putMany putPath inputSrcs
158+
putText platform
159+
putText builder
160+
putMany putText args
161+
162+
flip putMany (Data.Map.toList env)
163+
$ \(first, second) -> putText first >> putText second
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
{-# LANGUAGE OverloadedStrings #-}
2+
{-# LANGUAGE DataKinds #-}
3+
{-# LANGUAGE TypeApplications #-}
4+
5+
module Derivation where
6+
7+
import Control.Monad.IO.Class (liftIO)
8+
9+
import Data.Text (Text)
10+
import Nix.Derivation (Derivation(..), DerivationOutput(..))
11+
import System.Nix.StorePath (StorePath, storePathToText)
12+
13+
import System.Nix.Store.Remote (addToStore, addTextToStore)
14+
import System.Nix.Hash (HashAlgorithm(Truncated, SHA256))
15+
16+
import qualified Data.Map
17+
import qualified Data.Set
18+
import qualified Data.Text
19+
import qualified Data.Text.Lazy
20+
import qualified Data.Text.Lazy.Builder
21+
import qualified Data.Vector
22+
import qualified Nix.Derivation
23+
import qualified System.Process
24+
import qualified System.Nix.Derivation
25+
import qualified System.Nix.StorePath
26+
27+
drvSample :: StorePath -> StorePath -> StorePath -> Derivation StorePath Text
28+
drvSample builder buildScript out = Derivation {
29+
outputs = Data.Map.fromList [ ("out", DerivationOutput out "sha256" "test") ]
30+
, inputDrvs = Data.Map.fromList [ (builder, Data.Set.fromList [ "out" ]) ]
31+
, inputSrcs = Data.Set.fromList [ buildScript ]
32+
, platform = "x86_64-linux"
33+
, builder = storePathToText builder
34+
, args = Data.Vector.fromList ["-e", storePathToText buildScript ]
35+
, env = Data.Map.fromList [("testEnv", "true")]
36+
}
37+
38+
withBash action = do
39+
fp <- fmap init <$> liftIO $ System.Process.readProcess "which" ["bash"] ""
40+
let Right n = System.Nix.StorePath.makeStorePathName "bash"
41+
path <- addToStore @SHA256 n fp False (pure True) False
42+
action path
43+
44+
withBuildScript action = do
45+
path <- addTextToStore
46+
"buildScript"
47+
(Data.Text.concat [ "declare -xp", "export > $out" ])
48+
mempty
49+
False
50+
51+
action path
52+
53+
withDerivation action = withBuildScript $ \buildScript -> withBash $ \bash -> do
54+
outputPath <- addTextToStore "wannabe-output" "" mempty False
55+
56+
let d = drvSample bash buildScript outputPath
57+
58+
path <- addTextToStore
59+
"hnix-store-derivation"
60+
(Data.Text.Lazy.toStrict
61+
$ Data.Text.Lazy.Builder.toLazyText
62+
$ System.Nix.Derivation.buildDerivation d
63+
)
64+
mempty
65+
False
66+
--(HS.fromList []) False
67+
liftIO $ print d
68+
action path d
69+

hnix-store-remote/tests/NixDaemon.hs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ import System.Nix.Store.Remote.Types
5454
import System.Nix.Store.Remote.Protocol
5555
import System.Nix.Store.Remote.Util
5656

57+
import Derivation
5758

5859
createProcessEnv :: FilePath
5960
-> String
@@ -294,3 +295,9 @@ spec_protocol = Hspec.around withNixDaemon $ do
294295
path <- dummy
295296
liftIO $ putStrLn $ show path
296297
(isValidPathUncached path) `shouldReturn` True
298+
299+
context "derivation" $ do
300+
itRights "build derivation" $ do
301+
withDerivation $ \path drv -> do
302+
result <- buildDerivation path drv Normal
303+
result `shouldSatisfy` ((==AlreadyValid) . status)

0 commit comments

Comments
 (0)