From 21762297a4072b5a25f2d528d5839633fa396133 Mon Sep 17 00:00:00 2001 From: Profpatsch Date: Fri, 21 Sep 2018 22:03:41 +0200 Subject: More execline experiments & testing MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Improves the “execline experience” and adds some basic tests. The idea is that the final result doesn’t use coreutils and provides a feasible alternative to bash-based tooling. --- pkgs/profpatsch/execline/run-execline-tests.nix | 86 +++++++++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100644 pkgs/profpatsch/execline/run-execline-tests.nix (limited to 'pkgs/profpatsch/execline/run-execline-tests.nix') diff --git a/pkgs/profpatsch/execline/run-execline-tests.nix b/pkgs/profpatsch/execline/run-execline-tests.nix new file mode 100644 index 00000000..c2c4c23e --- /dev/null +++ b/pkgs/profpatsch/execline/run-execline-tests.nix @@ -0,0 +1,86 @@ +{ stdenv, drvSeqL, runExecline +, ifCommand, redirfdCommand, s6GrepCommand +, importasCommand, s6TouchCommand, s6CatCommand +, execlinebCommand, s6TestCommand, s6ChmodCommand +# https://www.mail-archive.com/skaware@list.skarnet.org/msg01256.html +, coreutils }: + +# TODO: run all of these locally! runExeclineLocal + +let + + # lol + writeScript = name: script: runExecline { + inherit name; + derivationArgs = { + inherit script; + passAsFile = [ "script" ]; + }; + execline = '' + importas -ui s scriptPath + importas -ui out out + foreground { + ${coreutils}/bin/mv $s $out + } + ${s6ChmodCommand} 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 = "file-${file.name}-has-line"; + inherit (stdenv) system; + builder = ifCommand; + args = + (block [ + redirfdCommand "-r" "0" file # read file to stdin + s6GrepCommand "-F" "-q" line # and grep for the line + ]) + ++ [ + # if the block succeeded, touch $out + importasCommand "-ui" "out" "out" + s6TouchCommand "$out" + ]; + }; + + # basic test that touches out + basic = runExecline { + name = "basic"; + execline = '' + importas -ui out out + ${s6TouchCommand} $out + ''; + }; + + # whether the stdin argument works as intended + stdin = fileHasLine "foo" (runExecline { + name = "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 ${s6CatCommand} + ''; + }); + + wrapWithVar = runExecline { + name = "wrap-with-var"; + builderWrapper = writeScript "var-wrapper" '' + #!${execlinebCommand} -S0 + export myvar myvalue $@ + ''; + execline = '' + importas -ui v myvar + if { ${s6TestCommand} myvalue = $v } + importas out out + ${s6TouchCommand} $out + ''; + }; + +in args: drvSeqL [ basic stdin wrapWithVar ] (runExecline args) -- cgit 1.4.1