From cee427aae6b557669c16cf25f4565e5db05f3d3c Mon Sep 17 00:00:00 2001 From: Chris Done <chrisdone@gmail.com> Date: Tue, 16 Jun 2015 14:14:25 +0200 Subject: [PATCH] Split off process execution into library (#130) --- src/Stack/Exec.hs | 31 +++++++++++++++++++++++++++++++ src/main/Main.hs | 23 +++++------------------ stack.cabal | 1 + 3 files changed, 37 insertions(+), 18 deletions(-) create mode 100644 src/Stack/Exec.hs diff --git a/src/Stack/Exec.hs b/src/Stack/Exec.hs new file mode 100644 index 0000000000..3a27b4ddc2 --- /dev/null +++ b/src/Stack/Exec.hs @@ -0,0 +1,31 @@ +-- | Execute commands within the properly configured Stack +-- environment. + +module Stack.Exec where + +import Control.Monad.Reader +import Path +import Stack.Types +import System.Exit +import qualified System.Process as P +import System.Process.Read + +-- | Execute a process within the Stack configured environment. +exec :: (HasConfig r, MonadReader r m, MonadIO m) + => String -> [String] -> m b +exec cmd args = do + config <- asks getConfig + liftIO $ do + menv <- configEnvOverride config + EnvSettings + { esIncludeLocals = True + , esIncludeGhcPackagePath = True + } + cmd' <- join $ System.Process.Read.findExecutable menv cmd + let cp = (P.proc (toFilePath cmd') args) + { P.env = envHelper menv + , P.delegate_ctlc = True + } + (Nothing, Nothing, Nothing, ph) <- P.createProcess cp + ec <- P.waitForProcess ph + exitWith ec diff --git a/src/main/Main.hs b/src/main/Main.hs index 8ac26d73dc..cd21fd762f 100644 --- a/src/main/Main.hs +++ b/src/main/Main.hs @@ -37,8 +37,9 @@ import Stack.Build.Types import Stack.Config import Stack.Constants import qualified Stack.Docker as Docker +import Stack.Exec import Stack.Fetch -import Stack.GhcPkg (envHelper,getCabalPkgVer) +import Stack.GhcPkg (getCabalPkgVer) import qualified Stack.PackageIndex import Stack.Path import Stack.Setup @@ -49,7 +50,6 @@ import System.Environment (getArgs, getProgName) import System.Exit import System.FilePath (searchPathSeparator) import System.IO (stderr) -import qualified System.Process as P import qualified System.Process.Read -- | Commandline dispatcher. @@ -370,23 +370,10 @@ uploadCmd args0 go = withBuildConfig go ExecStrategy $ do -- | Execute a command. execCmd :: (String, [String]) -> GlobalOpts -> IO () -execCmd (cmd, args) go@GlobalOpts{..} = withBuildConfig go ExecStrategy $ do - config <- asks getConfig - liftIO $ do - menv <- configEnvOverride config - EnvSettings - { esIncludeLocals = True - , esIncludeGhcPackagePath = True - } - cmd' <- join $ System.Process.Read.findExecutable menv cmd - let cp = (P.proc (toFilePath cmd') args) - { P.env = envHelper menv - , P.delegate_ctlc = True - } +execCmd (cmd,args) go@GlobalOpts{..} = + withBuildConfig go ExecStrategy $ + exec cmd args - (Nothing, Nothing, Nothing, ph) <- P.createProcess cp - ec <- P.waitForProcess ph - exitWith ec -- | Pull the current Docker image. dockerPullCmd :: () -> GlobalOpts -> IO () diff --git a/stack.cabal b/stack.cabal index 8193946df5..c05bfae98a 100644 --- a/stack.cabal +++ b/stack.cabal @@ -33,6 +33,7 @@ library Stack.Docker Stack.Docker.GlobalDB Stack.Fetch + Stack.Exec Stack.GhcPkg Stack.Package Stack.PackageDump