Skip to content

Commit 7d3eba7

Browse files
committed
Stack.Docker: use readProcessStdoutLogStderr
1 parent eddfdc2 commit 7d3eba7

File tree

1 file changed

+16
-25
lines changed

1 file changed

+16
-25
lines changed

src/Stack/Docker.hs

Lines changed: 16 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -26,15 +26,12 @@ import Control.Monad.Catch (MonadThrow, throwM)
2626
import Control.Monad.IO.Class (MonadIO,liftIO)
2727
import Control.Monad.Logger (MonadLogger,logError,logInfo,logWarn)
2828
import Control.Monad.Writer (execWriter,runWriter,tell)
29-
import Control.Monad.Trans.Control (MonadBaseControl,liftBaseWith)
29+
import Control.Monad.Trans.Control (MonadBaseControl)
3030
import Data.Aeson.Extended (FromJSON(..),(.:),(.:?),(.!=),eitherDecode)
3131
import Data.ByteString.Builder (stringUtf8,charUtf8,toLazyByteString)
3232
import qualified Data.ByteString.Char8 as BS
3333
import qualified Data.ByteString.Lazy.Char8 as LBS
3434
import Data.Char (isSpace,toUpper,isAscii)
35-
import Data.Conduit ((=$=))
36-
import qualified Data.Conduit.List as CL
37-
import qualified Data.Conduit.Combinators as CC
3835
import Data.List (dropWhileEnd,find,intercalate,intersperse,isPrefixOf,isInfixOf,foldl',sortBy)
3936
import Data.Map.Strict (Map)
4037
import qualified Data.Map.Strict as Map
@@ -280,7 +277,7 @@ cleanup :: (MonadLogger m,MonadIO m,MonadThrow m,MonadBaseControl IO m)
280277
cleanup config opts =
281278
do envOverride <- getEnvOverride (configPlatform config)
282279
checkDockerVersion envOverride
283-
let runDocker = readProcessStdoutLogStderr Nothing envOverride "docker"
280+
let runDocker = readDockerProcess envOverride
284281
imagesOut <- runDocker ["images","--no-trunc","-f","dangling=false"]
285282
danglingImagesOut <- runDocker ["images","--no-trunc","-f","dangling=true"]
286283
runningContainersOut <- runDocker ["ps","-a","--no-trunc","-f","status=running"]
@@ -339,11 +336,11 @@ cleanup config opts =
339336
do $logInfo (concatT ["Removing container: '",v,"'"])
340337
return ["rm","-f",v]
341338
| otherwise -> throwM (InvalidCleanupCommandException line)
342-
e <- liftIO (try (callProcess Nothing envOverride "docker" args))
339+
e <- try (readDockerProcess envOverride args)
343340
case e of
344341
Left (ProcessExitedUnsuccessfully _ _) ->
345342
$logError (concatT ["Could not remove: '",v,"'"])
346-
Right () -> return ()
343+
Right _ -> return ()
347344
_ -> throwM (InvalidCleanupCommandException line)
348345
parseImagesOut = Map.fromListWith (++) . map parseImageRepo . drop 1 . lines . decodeUtf8
349346
where parseImageRepo :: String -> (String, [String])
@@ -514,7 +511,7 @@ inspects :: (MonadIO m,MonadThrow m,MonadLogger m,MonadBaseControl IO m)
514511
inspects _ [] = return Map.empty
515512
inspects envOverride images =
516513
do maybeInspectOut <-
517-
try (readProcessStdoutLogStderr Nothing envOverride "docker" ("inspect" : images))
514+
try (readDockerProcess envOverride ("inspect" : images))
518515
case maybeInspectOut of
519516
Right inspectOut ->
520517
-- filtering with 'isAscii' to workaround @docker inspect@ output containing invalid UTF-8
@@ -559,7 +556,7 @@ checkDockerVersion :: (MonadIO m,MonadThrow m,MonadLogger m,MonadBaseControl IO
559556
checkDockerVersion envOverride =
560557
do dockerExists <- doesExecutableExist envOverride "docker"
561558
unless dockerExists (throwM DockerNotInstalledException)
562-
dockerVersionOut <- readProcessStdoutLogStderr Nothing envOverride "docker" ["--version"]
559+
dockerVersionOut <- readDockerProcess envOverride ["--version"]
563560
case words (decodeUtf8 dockerVersionOut) of
564561
(_:_:v:_) ->
565562
case parseVersionFromString (dropWhileEnd (== ',') v) of
@@ -615,6 +612,16 @@ removeDirectoryContents path excludeDirs excludeFiles =
615612
(\f -> unless (filename f `elem` excludeFiles)
616613
(removeFile (toFilePath f))))
617614

615+
-- | Produce a strict 'S.ByteString' from the stdout of a
616+
-- process. Throws a 'ProcessExitedUnsuccessfully' exception if the
617+
-- process fails. Logs process's stderr using @$logError@.
618+
readDockerProcess :: (MonadIO m,MonadLogger m,MonadBaseControl IO m)
619+
=> EnvOverride
620+
-> [String]
621+
-> m BS.ByteString
622+
readDockerProcess envOverride args =
623+
readProcessStdoutLogStderr "docker: " Nothing envOverride "docker" args
624+
618625
-- | Subdirectories of the home directory to sandbox between GHC/Stackage versions.
619626
sandboxedHomeSubdirectories :: [Path Rel Dir]
620627
sandboxedHomeSubdirectories =
@@ -929,19 +936,3 @@ instance Show StackDockerException where
929936
"Cannot find 'docker' in PATH. Is Docker installed?"
930937
show (InvalidDatabasePathException ex) =
931938
concat ["Invalid database path: ",show ex]
932-
933-
-- | Produce a strict 'S.ByteString' from the stdout of a
934-
-- process. Throws a 'ProcessExitedUnsuccessfully' exception if the
935-
-- process fails. Logs process's stderr using @$logError@.
936-
readProcessStdoutLogStderr :: (MonadIO m,MonadLogger m,MonadBaseControl IO m)
937-
=> Maybe (Path Abs Dir)
938-
-> EnvOverride
939-
-> String
940-
-> [String]
941-
-> m BS.ByteString
942-
readProcessStdoutLogStderr wd menv name args = do
943-
runInBase <- liftBaseWith $ \run -> return (void . run)
944-
let sinkStderr = CC.decodeUtf8 =$= CC.line logSink
945-
logSink = CC.mapM_ (liftIO . runInBase . $logError)
946-
(_,out) <- sinkProcessStderrStdout wd menv name args sinkStderr CL.consume
947-
liftIO (evaluate (BS.concat out))

0 commit comments

Comments
 (0)