fix failure propigation

This commit is contained in:
Joey Hess 2010-10-25 19:17:11 -04:00
parent 47892ced88
commit e87287c11b
4 changed files with 27 additions and 13 deletions

View file

@ -42,21 +42,27 @@ type SubCmdPerform = Annex (Maybe SubCmdCleanup)
type SubCmdCleanup = Annex Bool
{- Runs a subcommand through its three stages. -}
doSubCmd :: String -> SubCmdStart -> String -> Annex ()
doSubCmd :: String -> SubCmdStart -> String -> Annex Bool
doSubCmd cmdname start param = do
res <- start param :: Annex (Maybe SubCmdPerform)
case (res) of
Nothing -> return ()
Nothing -> return True
Just perform -> do
showStart cmdname param
res <- perform :: Annex (Maybe SubCmdCleanup)
case (res) of
Nothing -> showEndFail
Nothing -> do
showEndFail
return False
Just cleanup -> do
res <- cleanup
if (res)
then showEndOk
else showEndFail
then do
showEndOk
return True
else do
showEndFail
return False
{- A subcommand can broadly want one of several kinds of input parameters.
@ -159,7 +165,7 @@ findWanted Keys params _ = return params
- run in the Annex monad. The first actions configure it
- according to command line options, while the second actions
- handle subcommands. -}
parseCmd :: [String] -> AnnexState -> IO ([Annex ()], [Annex ()])
parseCmd :: [String] -> AnnexState -> IO ([Annex Bool], [Annex Bool])
parseCmd argv state = do
(flags, params) <- getopt
if (null params)
@ -169,8 +175,12 @@ parseCmd argv state = do
[Command name action want _] -> do
f <- findWanted want (drop 1 params)
(TypeInternals.repo state)
return (flags, map (doSubCmd name action) $
filter notstate f)
let actions = map (doSubCmd name action) $
filter notstate f
let configactions = map (\f -> do
f
return True) flags
return (configactions, actions)
where
-- never include files from the state directory
notstate f = stateLoc /= take (length stateLoc) f

View file

@ -18,14 +18,15 @@ import qualified Annex
import Utility
{- Sets up a git repo for git-annex. -}
startup :: Annex ()
startup :: Annex Bool
startup = do
g <- Annex.gitRepo
liftIO $ gitAttributes g
prepUUID
return True
{- When git-annex is done, it runs this. -}
shutdown :: Annex ()
shutdown :: Annex Bool
shutdown = do
g <- Annex.gitRepo
@ -38,6 +39,8 @@ shutdown = do
then liftIO $ removeDirectoryRecursive $ tmp
else return ()
return True
{- configure git to use union merge driver on state files, if it is not
- already -}
gitAttributes :: Git.Repo -> IO ()

View file

@ -1,3 +1,3 @@
If a subcommand fails w/o throwing an error, no error is propigated to the
git-annex exit code. With --quiet, this makes it look like the command
succeeded.
succeeded. [[done]]

View file

@ -27,7 +27,7 @@ main = do
- or more likely I missed an easy way to do it. So, I have to laboriously
- thread AnnexState through this function.
-}
tryRun :: AnnexState -> [Annex ()] -> IO ()
tryRun :: AnnexState -> [Annex Bool] -> IO ()
tryRun state actions = tryRun' state 0 actions
tryRun' state errnum (a:as) = do
result <- try $ Annex.run state a
@ -35,7 +35,8 @@ tryRun' state errnum (a:as) = do
Left err -> do
showErr err
tryRun' state (errnum + 1) as
Right (_,state') -> tryRun' state' errnum as
Right (True,state') -> tryRun' state' errnum as
Right (False,state') -> tryRun' state' (errnum + 1) as
tryRun' state errnum [] = do
if (errnum > 0)
then error $ (show errnum) ++ " failed"