Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Compat version of readProcessWithExitCode #1628

Merged
merged 1 commit into from
Dec 22, 2013
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
43 changes: 43 additions & 0 deletions cabal-install/Distribution/Client/Compat/Process.hs
Original file line number Original file line Diff line number Diff line change
@@ -0,0 +1,43 @@

-----------------------------------------------------------------------------
-- |
-- Module : Distribution.Client.Compat.Process
-- Copyright : (c) 2013 Liu Hao, Brent Yorgey
-- License : BSD-style (see the file LICENSE)
--
-- Maintainer : cabal-devel@haskell.org
-- Stability : provisional
-- Portability : portable
--
-- Cross-platform utilities for invoking processes.
--
-----------------------------------------------------------------------------

module Distribution.Client.Compat.Process (
readProcessWithExitCode
) where

import Control.Exception (catch, throw)
import System.Exit (ExitCode (ExitFailure))
import System.IO.Error (isDoesNotExistError)
import qualified System.Process as P

-- | @readProcessWithExitCode@ creates an external process, reads its
-- standard output and standard error strictly, waits until the
-- process terminates, and then returns the @ExitCode@ of the
-- process, the standard output, and the standard error.
--
-- See the documentation of the version from @System.Process@ for
-- more information.
--
-- The version from @System.Process@ behaves inconsistently across
-- platforms when an executable with the given name is not found: in
-- some cases it returns an @ExitFailure@, in others it throws an
-- exception. This variant catches \"does not exist\" exceptions and
-- turns them into @ExitFailure@s.
readProcessWithExitCode :: FilePath -> [String] -> String -> IO (ExitCode, String, String)
readProcessWithExitCode cmd args input =
P.readProcessWithExitCode cmd args input
`catch` \e -> if isDoesNotExistError e
then return (ExitFailure 127, "", "")
else throw e
4 changes: 3 additions & 1 deletion cabal-install/Distribution/Client/Get.hs
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -37,6 +37,8 @@ import Distribution.Client.FetchUtils
import qualified Distribution.Client.Tar as Tar (extractTarGzFile) import qualified Distribution.Client.Tar as Tar (extractTarGzFile)
import Distribution.Client.IndexUtils as IndexUtils import Distribution.Client.IndexUtils as IndexUtils
( getSourcePackages ) ( getSourcePackages )
import Distribution.Client.Compat.Process
( readProcessWithExitCode )
import Distribution.Compat.Exception import Distribution.Compat.Exception
( catchIO ) ( catchIO )


Expand All @@ -62,7 +64,7 @@ import System.Exit
import System.FilePath import System.FilePath
( (</>), (<.>), addTrailingPathSeparator ) ( (</>), (<.>), addTrailingPathSeparator )
import System.Process import System.Process
( rawSystem, readProcessWithExitCode ) ( rawSystem )




-- | Entry point for the 'cabal get' command. -- | Entry point for the 'cabal get' command.
Expand Down
3 changes: 2 additions & 1 deletion cabal-install/Distribution/Client/Init/Heuristics.hs
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -46,7 +46,8 @@ import System.Directory ( getDirectoryContents,
import Distribution.Compat.Environment ( getEnvironment ) import Distribution.Compat.Environment ( getEnvironment )
import System.FilePath ( takeExtension, takeBaseName, dropExtension, import System.FilePath ( takeExtension, takeBaseName, dropExtension,
(</>), (<.>), splitDirectories, makeRelative ) (</>), (<.>), splitDirectories, makeRelative )
import System.Process ( readProcessWithExitCode )
import Distribution.Client.Compat.Process ( readProcessWithExitCode )
import System.Exit ( ExitCode(..) ) import System.Exit ( ExitCode(..) )


-- |Guess the package name based on the given root directory -- |Guess the package name based on the given root directory
Expand Down
1 change: 1 addition & 0 deletions cabal-install/cabal-install.cabal
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -109,6 +109,7 @@ executable cabal
Distribution.Client.Compat.Environment Distribution.Client.Compat.Environment
Distribution.Client.Compat.ExecutablePath Distribution.Client.Compat.ExecutablePath
Distribution.Client.Compat.FilePerms Distribution.Client.Compat.FilePerms
Distribution.Client.Compat.Process
Distribution.Client.Compat.Semaphore Distribution.Client.Compat.Semaphore
Distribution.Client.Compat.Time Distribution.Client.Compat.Time
Paths_cabal_install Paths_cabal_install
Expand Down