From 9fb76c74b5d30b592bad60de5955b9efa2e6cd65 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Roman=20Smr=C5=BE?= Date: Sat, 22 Aug 2026 22:37:53 +0200 Subject: =?UTF-8?q?Shell:=20implement=20=E2=80=98!=E2=80=99=20operator?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Changelog: Implement negation using the `!` operator in the shell interpreter. --- src/Script/Shell.hs | 12 +++++++++++- test/asset/shell/logic.et | 14 ++++++++++++++ test/script/shell.et | 26 ++++++++++++++++++++++++++ 3 files changed, 51 insertions(+), 1 deletion(-) create mode 100644 test/asset/shell/logic.et diff --git a/src/Script/Shell.hs b/src/Script/Shell.hs index f070de5..dbecee3 100644 --- a/src/Script/Shell.hs +++ b/src/Script/Shell.hs @@ -158,7 +158,17 @@ executeCommand sei@ShellExecInfo {..} st pstdin pstdout pstderr scmd@ShellComman executeCommandProcess :: ShellExecInfo -> ShellState -> Handle -> Handle -> Handle -> [ Text ] -> Text -> TestRun ( TestRun ProcessStatus, ShellState ) -executeCommandProcess ShellExecInfo {..} st@ShellState {..} pstdin pstdout pstderr args = \case +executeCommandProcess sei@ShellExecInfo {..} st@ShellState {..} pstdin pstdout pstderr args = \case + "!" + | (cmd : args') <- args -> do + ( exit, st' ) <- executeCommandProcess sei st pstdin pstdout pstderr args' cmd + let exit' = exit >>= \case Exited ExitSuccess -> return (Exited (ExitFailure (-1))) + _ -> return (Exited ExitSuccess) + return ( exit', st' ) + + | [] <- args -> do + return ( return (Exited (ExitFailure (-1))), st ) + "cd" | [] <- args -> liftIO $ do hPutStrLn pstdout (nodeDir seiNode) diff --git a/test/asset/shell/logic.et b/test/asset/shell/logic.et new file mode 100644 index 0000000..d1d4b32 --- /dev/null +++ b/test/asset/shell/logic.et @@ -0,0 +1,14 @@ +test NegateFalse: + node n + shell on n as sh: + ! false + +test NegateTrue: + node n + shell on n as sh: + ! true + +test NegateNothing: + node n + shell on n as sh: + ! diff --git a/test/script/shell.et b/test/script/shell.et index e58dfea..086d3d3 100644 --- a/test/script/shell.et +++ b/test/script/shell.et @@ -154,3 +154,29 @@ test ShellExitOnError: expect /run-test-result Enabled failed/ expect /run-done/ flush + + +test ShellLogic: + spawn as p + with p: + send "load ${scripts.path}/logic.et" + local: + expect /(load-.*)/ capture done + guard (done == "load-done") + + send "run NegateFalse" + expect /run-test-result NegateFalse done/ + expect /run-done/ + flush + + send "run NegateTrue" + expect /child-fail sh failed at: .*logic.et:9:9: ! true/ + expect /run-test-result NegateTrue failed/ + expect /run-done/ + flush + + send "run NegateNothing" + expect /child-fail sh failed at: .*logic.et:14:9: !/ + expect /run-test-result NegateNothing failed/ + expect /run-done/ + flush -- cgit v1.2.3