@@ -26,15 +26,12 @@ import Control.Monad.Catch (MonadThrow, throwM)
2626import Control.Monad.IO.Class (MonadIO ,liftIO )
2727import Control.Monad.Logger (MonadLogger ,logError ,logInfo ,logWarn )
2828import Control.Monad.Writer (execWriter ,runWriter ,tell )
29- import Control.Monad.Trans.Control (MonadBaseControl , liftBaseWith )
29+ import Control.Monad.Trans.Control (MonadBaseControl )
3030import Data.Aeson.Extended (FromJSON (.. ),(.:) ,(.:?) ,(.!=) ,eitherDecode )
3131import Data.ByteString.Builder (stringUtf8 ,charUtf8 ,toLazyByteString )
3232import qualified Data.ByteString.Char8 as BS
3333import qualified Data.ByteString.Lazy.Char8 as LBS
3434import 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
3835import Data.List (dropWhileEnd ,find ,intercalate ,intersperse ,isPrefixOf ,isInfixOf ,foldl' ,sortBy )
3936import Data.Map.Strict (Map )
4037import qualified Data.Map.Strict as Map
@@ -280,7 +277,7 @@ cleanup :: (MonadLogger m,MonadIO m,MonadThrow m,MonadBaseControl IO m)
280277cleanup 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)
514511inspects _ [] = return Map. empty
515512inspects 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
559556checkDockerVersion 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.
619626sandboxedHomeSubdirectories :: [Path Rel Dir ]
620627sandboxedHomeSubdirectories =
@@ -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