From aec46dbd51add71a1a3d80ada668a889659ef50e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Gr=C3=B6ber?= Date: Thu, 1 May 2014 01:48:03 +0200 Subject: [PATCH] Factor out `readProcess'` --- Language/Haskell/GhcMod/GhcPkg.hs | 13 +------------ Language/Haskell/GhcMod/Utils.hs | 15 +++++++++++++++ 2 files changed, 16 insertions(+), 12 deletions(-) diff --git a/Language/Haskell/GhcMod/GhcPkg.hs b/Language/Haskell/GhcMod/GhcPkg.hs index 178afd9..90d04c3 100644 --- a/Language/Haskell/GhcMod/GhcPkg.hs +++ b/Language/Haskell/GhcMod/GhcPkg.hs @@ -22,10 +22,7 @@ import Data.Maybe (listToMaybe, maybeToList) import Distribution.Package (InstalledPackageId(..)) import Language.Haskell.GhcMod.Types import Language.Haskell.GhcMod.Utils -import System.Exit (ExitCode(..)) import System.FilePath (()) -import System.IO (hPutStrLn,stderr) -import System.Process (readProcessWithExitCode) import Text.ParserCombinators.ReadP (ReadP, char, between, sepBy1, many1, string, choice, eof) import qualified Text.ParserCombinators.ReadP as P @@ -61,7 +58,6 @@ getPackageDbStack cdir = (getSandboxDb cdir >>= \db -> return [GlobalDb, PackageDb db]) `E.catch` \(_ :: SomeException) -> return [GlobalDb, UserDb] - -- | List packages in one or more ghc package store ghcPkgList :: [GhcPkgDb] -> IO [PackageBaseName] ghcPkgList dbs = map fst3 <$> ghcPkgListEx dbs @@ -69,14 +65,7 @@ ghcPkgList dbs = map fst3 <$> ghcPkgListEx dbs ghcPkgListEx :: [GhcPkgDb] -> IO [Package] ghcPkgListEx dbs = do - (rv,output,err) <- readProcessWithExitCode "ghc-pkg" opts "" - case rv of - ExitFailure val -> do - hPutStrLn stderr err - fail $ "ghc-pkg " ++ unwords opts ++ " (exit " ++ show val ++ ")" - ExitSuccess -> return () - - return $ parseGhcPkgOutput $ lines output + parseGhcPkgOutput .lines <$> readProcess' "ghc-pkg" opts where opts = ["list", "-v"] ++ ghcPkgDbStackOpts dbs diff --git a/Language/Haskell/GhcMod/Utils.hs b/Language/Haskell/GhcMod/Utils.hs index 33af425..33a327f 100644 --- a/Language/Haskell/GhcMod/Utils.hs +++ b/Language/Haskell/GhcMod/Utils.hs @@ -1,5 +1,20 @@ module Language.Haskell.GhcMod.Utils where +import Control.Exception (bracket) +import System.Directory (getCurrentDirectory, setCurrentDirectory) +import System.Process (readProcessWithExitCode) +import System.Exit (ExitCode(..)) +import System.IO (hPutStrLn, stderr) + -- dropWhileEnd is not provided prior to base 4.5.0.0. dropWhileEnd :: (a -> Bool) -> [a] -> [a] dropWhileEnd p = foldr (\x xs -> if p x && null xs then [] else x : xs) [] +readProcess' :: String -> [String] -> IO String +readProcess' cmd opts = do + (rv,output,err) <- readProcessWithExitCode cmd opts "" + case rv of + ExitFailure val -> do + hPutStrLn stderr err + fail $ cmd ++ " " ++ unwords opts ++ " (exit " ++ show val ++ ")" + ExitSuccess -> + return output