summaryrefslogtreecommitdiff
path: root/src/Run.hs
diff options
context:
space:
mode:
authorRoman Smrž <roman.smrz@seznam.cz>2026-10-17 11:10:40 +0200
committerRoman Smrž <roman.smrz@seznam.cz>2026-10-20 20:21:44 +0200
commit5f892bc3cd212f362b0a8f29528b783b142da8e8 (patch)
treea345cab6908eb72632684be751caf0ea1c793f1c /src/Run.hs
parentdb6cd2706417d38b670438475c30a657ce2e5ed4 (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.hs22
1 files changed, 20 insertions, 2 deletions
diff --git a/src/Run.hs b/src/Run.hs
index 1d637d3..a1184c4 100644
--- a/src/Run.hs
+++ b/src/Run.hs
@@ -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