diff options
author | Joey Hess <joey@kitenet.net> | 2010-11-01 03:01:58 -0400 |
---|---|---|
committer | Joey Hess <joey@kitenet.net> | 2010-11-01 03:01:58 -0400 |
commit | 0655ae4b8a4c3b55351a37ddad03bb33a7cc9353 (patch) | |
tree | e18eb6ae9835fbccf76fa4f95087215ae1b6f827 /Core.hs | |
parent | 524125e52e8d2a392a2662ac09f8658307513a25 (diff) |
move
Diffstat (limited to 'Core.hs')
-rw-r--r-- | Core.hs | 24 |
1 files changed, 24 insertions, 0 deletions
@@ -7,6 +7,7 @@ module Core where +import IO (try) import System.IO import System.Directory import Control.Monad.State (liftIO) @@ -22,6 +23,29 @@ import qualified GitRepo as Git import qualified GitQueue import qualified Annex import Utility + +{- Runs a list of Annex actions. Catches IO errors and continues + - (but explicitly thrown errors terminate the whole command). + - 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 -> [Annex Bool] -> IO () +tryRun state actions = tryRun' state 0 actions +tryRun' :: AnnexState -> Integer -> [Annex Bool] -> IO () +tryRun' state errnum (a:as) = do + result <- try $ Annex.run state a + case (result) of + Left err -> do + Annex.eval state $ showErr err + tryRun' state (errnum + 1) as + Right (True,state') -> tryRun' state' errnum as + Right (False,state') -> tryRun' state' (errnum + 1) as +tryRun' _ errnum [] = + when (errnum > 0) $ error $ (show errnum) ++ " failed" {- Sets up a git repo for git-annex. -} startup :: Annex Bool |