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