blob: 76f18105da0254c41fe842f07472f3b09a23aa6b (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
|
{ stdenv, drvSeqL, runExecline, bin
# https://www.mail-archive.com/skaware@list.skarnet.org/msg01256.html
, coreutils }:
let
# lol
writeScript = name: script: runExecline {
inherit name;
derivationArgs = {
inherit script;
passAsFile = [ "script" ];
preferLocalBuild = true;
allowSubstitutes = false;
};
execline = ''
importas -ui s scriptPath
importas -ui out out
foreground {
${coreutils}/bin/mv $s $out
}
${bin.s6-chmod} 0755 $out
'';
};
# execline block of depth 1
block = args: builtins.map (arg: " ${arg}") args ++ [ "" ];
# derivation that tests whether a given line exists
# in the given file. Does not use runExecline, because
# that should be tested after all.
fileHasLine = line: file: derivation {
name = "run-execline-test-file-${file.name}-has-line";
inherit (stdenv) system;
builder = bin.execlineIf;
args =
(block [
bin.redirfd "-r" "0" file # read file to stdin
bin.s6-grep "-F" "-q" line # and grep for the line
])
++ [
# if the block succeeded, touch $out
bin.importas "-ui" "out" "out"
bin.s6-touch "$out"
];
};
# basic test that touches out
basic = runExecline {
name = "run-execline-test-basic";
execline = ''
importas -ui out out
${bin.s6-touch} $out
'';
derivationArgs = {
preferLocalBuild = true;
allowSubstitutes = false;
};
};
# whether the stdin argument works as intended
stdin = fileHasLine "foo" (runExecline {
name = "run-execline-test-stdin";
stdin = "foo\nbar\nfoo";
execline = ''
importas -ui out out
# this pipes stdout of s6-cat to $out
# and s6-cat redirects from stdin to stdout
redirfd -w 1 $out ${bin.s6-cat}
'';
derivationArgs = {
preferLocalBuild = true;
allowSubstitutes = false;
};
});
wrapWithVar = runExecline {
name = "run-execline-test-wrap-with-var";
builderWrapper = writeScript "var-wrapper" ''
#!${bin.execlineb} -S0
export myvar myvalue $@
'';
execline = ''
importas -ui v myvar
if { ${bin.s6-test} myvalue = $v }
importas out out
${bin.s6-touch} $out
'';
derivationArgs = {
preferLocalBuild = true;
allowSubstitutes = false;
};
};
in [ basic stdin wrapWithVar ]
|