stack2nix-0.1.1.0: src/Stack2nix/External/Util.hs
module Stack2nix.External.Util where
import Data.List (intercalate)
import Data.Monoid ((<>))
import System.Directory (getCurrentDirectory)
import System.Exit (ExitCode (..))
import System.Process (CreateProcess (..))
import System.Process (proc, readCreateProcessWithExitCode)
runCmdFrom :: FilePath -> String -> [String] -> IO (Either String String)
runCmdFrom dir prog args = do
(exitCode, stdout, stderr) <- readCreateProcessWithExitCode (fromDir dir (proc prog args)) ""
case exitCode of
ExitSuccess -> return $ Right stdout
_ -> return $ Left $ "Command failed: " ++ cmd ++ "\n" ++ stderr
where
fromDir :: FilePath -> CreateProcess -> CreateProcess
fromDir d procDesc = procDesc { cwd = Just d }
cmd = "cd \"" <> dir <> "\" && " <> intercalate " " (prog:args)
runCmd :: String -> [String] -> IO (Either String String)
runCmd prog args = getCurrentDirectory >>= (\d -> runCmdFrom d prog args)
failHard :: Show a => Either a b -> IO ()
failHard (Left stderr) = error $ show stderr
failHard (Right _) = mempty