module Main (main) where
import System.IO ( hSetBinaryMode)
import System.IO ( stdin, stdout )
import System.Exit ( exitWith, ExitCode(..) )
import System.Environment ( getArgs )
import Control.Exception ( Exception( AssertionFailed ), handleJust, catchDyn )
import Darcs.RunCommand ( run_the_command )
import Darcs.Flags ( DarcsFlag(Verbose) )
import Darcs.Commands.Help ( helpCmd, listAvailableCommands, printVersion )
import Darcs.SignalHandler ( withSignalsHandled )
import Version ( version, context )
import Darcs.Global ( with_atexit )
import Preproc( preproc_main )
import Exec ( ExecException(..) )
#include "impossible.h"
assertions :: Control.Exception.Exception -> Maybe String
assertions (AssertionFailed s) = Just s
assertions _ = Nothing
execExceptionHandler :: ExecException -> IO a
execExceptionHandler (ExecException cmd args redirects reason) =
do putStrLn $ "Failed to execute external command: " ++ unwords (cmd:args) ++ "\n"
++ "Lowlevel error: " ++ reason ++ "\n"
++ "Redirects: " ++ show redirects ++"\n"
exitWith $ ExitFailure 3
main :: IO ()
main = with_atexit $ withSignalsHandled $
flip catchDyn execExceptionHandler $
handleJust assertions bug $ do
argv <- getArgs
case argv of
[] -> printVersion >> helpCmd [] []
["-h"] -> helpCmd [] []
["--help"] -> helpCmd [] []
["--overview"] -> helpCmd [Verbose] []
["--commands"] -> listAvailableCommands
["-v"] -> putStrLn version
["--version"] -> putStrLn version
["--exact-version"] -> do
putStrLn $ "darcs compiled on "++__DATE__++", at "++__TIME__
putStrLn context
("--preprocess-manual":rest) -> preproc_main rest
_ -> do
hSetBinaryMode stdin True
hSetBinaryMode stdout True
run_the_command (head argv) (tail argv)