summaryrefslogtreecommitdiff
path: root/src/Run.hs
diff options
context:
space:
mode:
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