Skip to content

Commit d718b4d

Browse files
committed
remote: add buildDerivation and test
1 parent 6504df7 commit d718b4d

File tree

5 files changed

+118
-2
lines changed

5 files changed

+118
-2
lines changed

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ library
3030
, text
3131
, unix
3232
, network
33+
, nix-derivation
3334
, mtl
3435
, unordered-containers
3536
, filepath
@@ -44,8 +45,8 @@ test-suite hnix-store-remote-tests
4445
ghc-options: -rtsopts -fprof-auto
4546
type: exitcode-stdio-1.0
4647
main-is: Driver.hs
47-
other-modules:
48-
NixDaemon
48+
other-modules: Derivation
49+
, NixDaemon
4950
hs-source-dirs: tests
5051
build-depends:
5152
attoparsec
@@ -67,6 +68,7 @@ test-suite hnix-store-remote-tests
6768
, tasty-quickcheck
6869
, linux-namespaces
6970
, mtl
71+
, nix-derivation
7072
, temporary
7173
, text
7274
, 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
@@ -47,6 +48,7 @@ import qualified Data.Set
4748
import Data.Proxy (Proxy)
4849
import Data.Text (Text)
4950

51+
import Nix.Derivation (Derivation)
5052

5153
import System.Nix.Build (BuildMode, BuildResult)
5254
import System.Nix.Hash (Digest, ValidAlgo)
@@ -156,6 +158,23 @@ buildPaths ps bm = do
156158
putPaths ps
157159
putInt $ fromEnum bm
158160

161+
buildDerivation :: StorePath
162+
-> Derivation StorePath Text
163+
-> BuildMode
164+
-> MonadStore BuildResult
165+
buildDerivation p drv buildMode = do
166+
runOpArgs BuildDerivation $ do
167+
putPath p
168+
putDerivation drv
169+
putEnum buildMode
170+
-- XXX: reason for this is unknown
171+
-- but without it protocol just hangs waiting for
172+
-- more data. Needs investigation
173+
putInt 0
174+
175+
res <- getSocketIncremental $ getBuildResult
176+
return res
177+
159178
ensurePath :: StorePath -> MonadStore ()
160179
ensurePath pn = do
161180
void $ simpleOpArgs EnsurePath $ putPath pn

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
@@ -141,3 +143,20 @@ getBuildResult = BuildResult
141143
<*> getBool
142144
<*> getTime
143145
<*> getTime
146+
147+
putDerivation :: Derivation StorePath Text -> Put
148+
putDerivation Derivation{..} = do
149+
flip putMany (Data.Map.toList outputs)
150+
$ \(outputName, DerivationOutput{..}) -> do
151+
putText outputName
152+
putPath path
153+
putText hashAlgo
154+
putText hash
155+
156+
putMany putPath inputSrcs
157+
putText platform
158+
putText builder
159+
putMany putText args
160+
161+
flip putMany (Data.Map.toList env)
162+
$ \(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
@@ -53,6 +53,7 @@ import System.Nix.Store.Remote.Types
5353
import System.Nix.Store.Remote.Protocol
5454
import System.Nix.Store.Remote.Util
5555

56+
import Derivation
5657

5758
createProcessEnv :: FilePath -> String -> [String] -> IO P.ProcessHandle
5859
createProcessEnv fp proc args =do
@@ -288,3 +289,9 @@ spec_protocol = Hspec.around withNixDaemon $ do
288289
path <- dummy
289290
liftIO $ putStrLn $ show path
290291
(isValidPathUncached path) `shouldReturn` True
292+
293+
context "derivation" $ do
294+
itRights "build derivation" $ do
295+
withDerivation $ \path drv -> do
296+
result <- buildDerivation path drv Normal
297+
result `shouldSatisfy` ((==AlreadyValid) . status)

0 commit comments

Comments
 (0)