From bbfaa1c511868a102b1e6f5941f4d8b116a474ca Mon Sep 17 00:00:00 2001 From: Michael Snoyman Date: Mon, 24 Jun 2019 21:17:30 +0300 Subject: [PATCH] Wait for children to exit correctly (fixes #4888) --- ChangeLog.md | 3 +++ src/Stack/Prelude.hs | 6 +++--- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index 519f53d469..06d4bb6a4e 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -29,6 +29,9 @@ Bug fixes: * Removes dependency on gnu-tar for OSX and Linux environment. The `--force-local` option was required only for windows environment. +* Properly wait for the `tar` subprocess to complete before returning, thereby + avoiding a SIGTERM screwing up GHC installation. See + [#4888](https://github.com/commercialhaskell/stack/issues/4888). ## v2.1.1.1 diff --git a/src/Stack/Prelude.hs b/src/Stack/Prelude.hs index a64664dc0a..d1aa580739 100644 --- a/src/Stack/Prelude.hs +++ b/src/Stack/Prelude.hs @@ -40,7 +40,7 @@ import System.IO.Echo (withoutInputEcho) import qualified Data.Conduit.Binary as CB import qualified Data.Conduit.List as CL import Data.Conduit.Process.Typed (withLoggedProcess_, createSource, byteStringInput) -import RIO.Process (HasProcessContext (..), ProcessContext, setStdin, closed, getStderr, getStdout, proc, withProcess_, setStdout, setStderr, ProcessConfig, readProcess_, workingDirL) +import RIO.Process (HasProcessContext (..), ProcessContext, setStdin, closed, getStderr, getStdout, proc, withProcess_, setStdout, setStderr, ProcessConfig, readProcess_, workingDirL, waitExitCode) import Data.Text.Encoding (decodeUtf8With) import Data.Text.Encoding.Error (lenientDecode) @@ -80,8 +80,8 @@ sinkProcessStderrStdout name args sinkStderr sinkStdout = $ setStdin (byteStringInput "") pc0 withProcess_ pc $ \p -> - runConduit (getStderr p .| sinkStderr) `concurrently` - runConduit (getStdout p .| sinkStdout) + (runConduit (getStderr p .| sinkStderr) `concurrently` + runConduit (getStdout p .| sinkStdout)) <* waitExitCode p -- | Consume the stdout of a process feeding strict 'ByteString's to a consumer. -- If the process fails, spits out stdout and stderr as error log