summaryrefslogtreecommitdiff
path: root/git-annex.hs
diff options
context:
space:
mode:
authorGravatar Joey Hess <joey@kitenet.net>2010-10-14 14:38:29 -0400
committerGravatar Joey Hess <joey@kitenet.net>2010-10-14 14:38:29 -0400
commit90cdc61c7c8d08590e054018c54c542c463be7e9 (patch)
treef3521b9803dd4850170c83c05f4539a08bd9ef1c /git-annex.hs
parent65e4f9cc73f4800fd4dcb5503f7a428539e1e959 (diff)
refactor
Diffstat (limited to 'git-annex.hs')
-rw-r--r--git-annex.hs34
1 files changed, 33 insertions, 1 deletions
diff --git a/git-annex.hs b/git-annex.hs
index b326b2b19..a038107e9 100644
--- a/git-annex.hs
+++ b/git-annex.hs
@@ -1,12 +1,44 @@
{- git-annex main program -}
+import Control.Exception
+import System.IO
import System.Environment
import qualified Annex
+import Types
import Core
-import CmdLine
+import Commands
main = do
args <- getArgs
(mode, params) <- argvToMode args
state <- start
tryRun state mode params
+
+{- Processes each param in the list by dispatching the handler function
+ - for the user-selection operation mode. Catches exceptions, not stopping
+ - if some error out, and propigates an overall error status at the end.
+ -
+ - This runs in the IO monad, not in the Annex monad. It seems that
+ - exceptions can only be caught in the IO monad, not in a stacked monad;
+ - or more likely I missed an easy way to do it. So, I have to laboriously
+ - thread AnnexState through this function.
+ -}
+tryRun :: AnnexState -> Mode -> [String] -> IO ()
+tryRun state mode params = tryRun' state mode 0 0 params
+tryRun' state mode errnum oknum (f:fs) = do
+ result <- try
+ (Annex.run state (dispatch mode f))::IO (Either SomeException ((), AnnexState))
+ case (result) of
+ Left err -> do
+ showErr err
+ tryRun' state mode (errnum + 1) oknum fs
+ Right (_,state') -> tryRun' state' mode errnum (oknum + 1) fs
+tryRun' state mode errnum oknum [] = do
+ if (errnum > 0)
+ then error $ (show errnum) ++ " failed ; " ++ show (oknum) ++ " ok"
+ else return ()
+
+{- Exception pretty-printing. -}
+showErr e = do
+ hPutStrLn stderr $ "git-annex: " ++ (show e)
+ return ()