packages feed

ddc-war-0.2.1.1: DDC/War/Job/Shell.hs

module DDC.War.Job.Shell
	( Spec     (..)
        , Result   (..)
        , resultSuccess
        , build)
where
import BuildBox.Command.File
import BuildBox.Command.System
import BuildBox.Build.Benchmark
import BuildBox.Data.Physical
import BuildBox.Pretty
import BuildBox


-- | Run a shell script.
data Spec
        = Spec
        { -- | Shell script to run
          specShellSource        :: FilePath

          -- | Source dir that the script is in.
        , specSourceDir          :: FilePath

          -- | Scratch dir that the script can write files to.
        , specScratchDir         :: FilePath

          -- | Put what DDC says to stdout here.
        , specShellStdout        :: FilePath
                
          -- | Put what DDC says to stderr here.
        , specShellStderr        :: FilePath 

          -- | True if the compile is expected to succeed, else not.
        , specShouldSucceed      :: Bool }
        deriving Show


data Result
        = ResultSuccess Seconds
        | ResultUnexpectedSuccess
        | ResultUnexpectedFailure
        deriving Show


resultSuccess :: Result -> Bool
resultSuccess result
 = case result of
        ResultSuccess{} -> True
        _               -> False


instance Pretty Result where
 ppr result 
  = case result of
        ResultSuccess seconds   -> text "success" <+> parens (ppr seconds)
        ResultUnexpectedFailure -> text "failed"
        ResultUnexpectedSuccess -> text "unexpected"


-- | Run a binary
build :: Spec -> Build Result
build   (Spec   mainSH sourceDir scratchDir
		mainRunOut mainRunErr
		shouldSucceed)
 = do	
        needs mainSH
	ensureDir scratchDir
	
	-- Run the binary.
	(time, (code, strOut, strErr))
	 <- timeBuild
	 $  systemTee False 
		("sh " ++ mainSH ++ " " ++ sourceDir ++ " " ++ scratchDir) 
		""
		
	-- Write its output to files.
	atomicWriteFile mainRunOut strOut
	atomicWriteFile mainRunErr strErr
		
        case code of
         ExitSuccess
          | shouldSucceed       -> return $ ResultSuccess time
          | otherwise           -> return ResultUnexpectedSuccess

         ExitFailure _
          | shouldSucceed       -> return ResultUnexpectedFailure
          | otherwise           -> return $ ResultSuccess time