Skip to content

Commit 5f33d97

Browse files
committed
remote: add buildDerivation and test
Closes #20.
1 parent 1076926 commit 5f33d97

File tree

6 files changed

+122
-8
lines changed

6 files changed

+122
-8
lines changed

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

Lines changed: 5 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,10 +71,12 @@ test-suite hnix-store-remote-tests
7071
, tasty-quickcheck
7172
, linux-namespaces
7273
, mtl
74+
, nix-derivation
7375
, temporary
7476
, text
7577
, time
7678
, unix
7779
, unordered-containers
7880
, vector
81+
, which
7982
default-language: Haskell2010

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: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
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.Nix.Derivation
24+
import qualified System.Nix.StorePath
25+
import qualified System.Which
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+
mfp <- liftIO $ System.Which.which "bash"
40+
case mfp of
41+
Nothing -> error "No bash executable found"
42+
Just fp -> do
43+
let Right n = System.Nix.StorePath.makeStorePathName "bash"
44+
path <- addToStore @SHA256 n fp False (pure True) False
45+
action path
46+
47+
withBuildScript action = do
48+
path <- addTextToStore
49+
"buildScript"
50+
(Data.Text.concat [ "declare -xp", "export > $out" ])
51+
mempty
52+
False
53+
54+
action path
55+
56+
withDerivation action = withBuildScript $ \buildScript -> withBash $ \bash -> do
57+
outputPath <- addTextToStore "wannabe-output" "" mempty False
58+
59+
let d = drvSample bash buildScript outputPath
60+
61+
path <- addTextToStore
62+
"hnix-store-derivation"
63+
(Data.Text.Lazy.toStrict
64+
$ Data.Text.Lazy.Builder.toLazyText
65+
$ System.Nix.Derivation.buildDerivation d
66+
)
67+
mempty
68+
False
69+
70+
liftIO $ print d
71+
action path d
72+

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)