@@ -13,25 +13,28 @@ module System.Process.Run
1313 ,runCmd'
1414 ,callProcess
1515 ,callProcess'
16+ ,createProcess'
1617 ,ProcessExitedUnsuccessfully
1718 ,Cmd (.. )
1819 )
1920 where
2021
2122import Control.Exception.Lifted
22- import Control.Monad.Trans.Control (MonadBaseControl )
2323import Control.Monad.IO.Class (MonadIO , liftIO )
2424import Control.Monad.Logger (MonadLogger , logError )
25+ import Control.Monad.Trans.Control (MonadBaseControl )
2526import Data.Conduit.Process hiding (callProcess )
2627import Data.Foldable (forM_ )
2728import Data.Text (Text )
2829import qualified Data.Text as T
30+ import Path (Dir , Abs , Path )
2931import Path (toFilePath )
3032import Prelude -- Fix AMP warning
3133import System.Exit (exitWith , ExitCode (.. ))
34+ import System.IO
3235import qualified System.Process
36+ import System.Process.Log
3337import System.Process.Read
34- import Path (Dir , Abs , Path )
3538
3639-- | Cmd holds common infos needed to running a process in most cases
3740data Cmd = Cmd
@@ -92,15 +95,32 @@ callProcess = callProcess' id
9295-- Inherits stdout and stderr.
9396callProcess' :: (MonadIO m , MonadLogger m )
9497 => (CreateProcess -> CreateProcess ) -> Cmd -> m ()
95- callProcess' modCP (Cmd wd cmd0 menv args) = do
98+ callProcess' modCP cmd = do
99+ c <- modCP <$> cmdToCreateProcess cmd
100+ $ logCreateProcess c
101+ liftIO $ do
102+ (_, _, _, p) <- System.Process. createProcess c
103+ exit_code <- waitForProcess p
104+ case exit_code of
105+ ExitSuccess -> return ()
106+ ExitFailure _ -> throwIO (ProcessExitedUnsuccessfully c exit_code)
107+
108+ -- | Like 'System.Process.Internal.createProcess_', but taking a 'Cmd'.
109+ -- Note that the 'Handle's provided by 'UseHandle' are not closed
110+ -- automatically.
111+ createProcess' :: (MonadIO m , MonadLogger m )
112+ => String
113+ -> (CreateProcess -> CreateProcess )
114+ -> Cmd
115+ -> m (Maybe Handle , Maybe Handle , Maybe Handle , ProcessHandle )
116+ createProcess' tag modCP cmd = do
117+ c <- modCP <$> cmdToCreateProcess cmd
118+ $ logCreateProcess c
119+ liftIO $ System.Process. createProcess_ tag c
120+
121+ cmdToCreateProcess :: MonadIO m => Cmd -> m CreateProcess
122+ cmdToCreateProcess (Cmd wd cmd0 menv args) = do
96123 cmd <- preProcess wd menv cmd0
97- let c = modCP $ (proc cmd args) { delegate_ctlc = True
98- , cwd = fmap toFilePath wd
99- , env = envHelper menv }
100- action (_, _, _, p) = do
101- exit_code <- waitForProcess p
102- case exit_code of
103- ExitSuccess -> return ()
104- ExitFailure _ -> throwIO (ProcessExitedUnsuccessfully c exit_code)
105- $ logProcessRun cmd args
106- liftIO (System.Process. createProcess c >>= action)
124+ return $ (proc cmd args) { delegate_ctlc = True
125+ , cwd = fmap toFilePath wd
126+ , env = envHelper menv }
0 commit comments