From 8b4abaac36800d21919c563ba72b5c1a8fa4f2b2 Mon Sep 17 00:00:00 2001 From: Benjamin Koch <snowball@c3pb.de> Date: Sun, 13 Dec 2020 05:40:20 +0100 Subject: [PATCH] Display exit code if non-polled script fails --- src/QBar/Blocks/Script.hs | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/src/QBar/Blocks/Script.hs b/src/QBar/Blocks/Script.hs index 5a615f7..0f2f661 100644 --- a/src/QBar/Blocks/Script.hs +++ b/src/QBar/Blocks/Script.hs @@ -16,8 +16,9 @@ import Pipes import Pipes.Safe (catchP) import System.Exit import System.IO hiding (stdin, stdout) +import System.IO.Error (isEOFError) import System.Process.Typed (Process, shell, setStdin, setStdout, - getStdin, getStdout, closed, createPipe, readProcessStdout, startProcess, stopProcess) + getStdin, getStdout, closed, createPipe, readProcessStdout, startProcess, stopProcess, getExitCode) pollScriptBlock :: Interval -> FilePath -> Block @@ -39,16 +40,23 @@ pollScriptBlock interval path = runPollBlock' interval $ forever $ yieldBlockUpd scriptBlock :: Bool -> FilePath -> Block -- The outer catchP only catches errors that occur during process creation -scriptBlock clickEvents path = catchP startScriptProcess handleError +scriptBlock clickEvents path = catchP startScriptProcess (handleError Nothing) where - handleError :: IOException -> Block - handleError e = do - pushBlockUpdate . mkErrorOutput $ T.pack (show e) - exitBlock + handleError :: Maybe ExitCode -> IOException -> Block + handleError exitCode exc = case result of + Left msg -> forever $ pushBlockUpdate $ mkErrorOutput msg + Right x -> x + where + result = case (isEOFError exc, exitCode) of + (True, Just ExitSuccess) -> Right exitBlock + (True, Just (ExitFailure nr)) -> + Left $ "exit code " <> T.pack (show nr) + _ -> Left $ T.pack (show exc) handleErrorWithProcess :: (Process i o e) -> IOException -> Block - handleErrorWithProcess process e = do + handleErrorWithProcess process exc = do + exitCode <- getExitCode process stopProcess process - handleError e + handleError exitCode exc startScriptProcess :: Block startScriptProcess = if clickEvents then startScriptProcessWithEvents -- GitLab