module VCSGui.Common.Process (
exec
) where
import System.Process
import System.Exit
import System.IO (Handle, hFlush, hClose, hGetContents, hPutStr)
import Control.Concurrent
import Control.Monad.Reader
import qualified Control.Exception as Exc
import Data.Text (Text)
import qualified Data.Text as T (pack, unpack)
exec :: Maybe FilePath
-> Text
-> [Text]
-> IO Bool
exec mcwd cmd opts = do
(ec, out, err) <- readProc mcwd cmd opts
case ec of
ExitSuccess -> return $ True
ExitFailure i -> return $ False
readProc :: Maybe FilePath
-> Text --command
-> [Text]
-> IO (ExitCode, Text, Text)
readProc mcwd cmd files = do
putStrLn $ "Executing process, mcwd: "++show mcwd++"cmd: "++show cmd++",files: "++show files
(_, Just outh, Just errh, pid) <- createProcess (proc (T.unpack cmd) (map T.unpack files))
{ std_out = CreatePipe,
std_err = CreatePipe,
cwd = mcwd
}
outMVar <- newEmptyMVar
out <- hGetContents outh
_ <- forkIO $ Exc.evaluate (length out) >> putMVar outMVar ()
err <- hGetContents errh
_ <- forkIO $ Exc.evaluate (length err) >> putMVar outMVar ()
takeMVar outMVar
takeMVar outMVar
hClose outh
hClose errh
ex <- waitForProcess pid
return (ex, T.pack out, T.pack err)