diff options
| author | Roman Smrž <roman.smrz@seznam.cz> | 2026-10-17 11:10:40 +0200 |
|---|---|---|
| committer | Roman Smrž <roman.smrz@seznam.cz> | 2026-10-20 20:21:44 +0200 |
| commit | 5f892bc3cd212f362b0a8f29528b783b142da8e8 (patch) | |
| tree | a345cab6908eb72632684be751caf0ea1c793f1c /src/Run.hs | |
| parent | db6cd2706417d38b670438475c30a657ce2e5ed4 (diff) | |
Config option to find tool path using cabal
Changelog: Added config file option to find test tool executable via cabal.
Diffstat (limited to 'src/Run.hs')
| -rw-r--r-- | src/Run.hs | 22 |
1 files changed, 20 insertions, 2 deletions
@@ -126,6 +126,22 @@ runTest out opts gdefs test = do procVar <- newMVar [] timeoutVar <- newMVar ( optTimeout opts, 0 ) + let evalTool = \case + ToolPath path -> return path + ToolCabal arg + | (name : args) <- T.words arg + -> do + readCreateProcessWithExitCode (proc "cabal" $ [ "list-bin", T.unpack name ]) "" >>= \case + ( ExitSuccess, cabalOut, _ ) -> do + let path = takeWhile (/= '\n') cabalOut + return $ T.unpack $ T.unwords (T.pack path : args) + _ -> do + ioError $ userError $ "failed to find ‘" <> T.unpack name <> "’ executable path using cabal" + | otherwise + -> return $ T.unpack arg + defaultTool <- evalTool $ optDefaultTool opts + procTools <- mapM (sequence . fmap evalTool) $ optProcTools opts + mgdb <- if optGDB opts then flip runReaderT out $ do gdb <- gdbStart $ atomically . writeTVar failedVar . Just . ProcessCrashed @@ -136,6 +152,8 @@ runTest out opts gdefs test = do { teOutput = out , teFailed = failedVar , teOptions = opts + , teDefaultTool = defaultTool + , teProcTools = procTools , teTestDir = testDir , teNextObjId = objIdVar , teNextProcId = procIdVar @@ -344,9 +362,9 @@ runStep = \case Right node -> go node where go node = do - opts <- asks $ teOptions . fst + env <- asks fst let pname = ProcName tname - tool = fromMaybe (optDefaultTool opts) (lookup pname $ optProcTools opts) + tool = fromMaybe (teDefaultTool env) (lookup pname $ teProcTools env) cmd = T.unwords $ T.pack tool : map escape args escape = ("'" <>) . (<> "'") . T.replace "'" "'\\''" outProcName OutputChildExec pname cmd |