factor out Annex exception handling module
This commit is contained in:
parent
1a96d4ab35
commit
ff21fd4a65
3 changed files with 34 additions and 14 deletions
27
Annex/Exception.hs
Normal file
27
Annex/Exception.hs
Normal file
|
@ -0,0 +1,27 @@
|
|||
{- exception handling in the git-annex monad
|
||||
-
|
||||
- Copyright 2011 Joey Hess <joey@kitenet.net>
|
||||
-
|
||||
- Licensed under the GNU GPL version 3 or higher.
|
||||
-}
|
||||
|
||||
module Annex.Exception (
|
||||
bracketIO,
|
||||
handle,
|
||||
throw,
|
||||
) where
|
||||
|
||||
import Control.Exception.Control (handle)
|
||||
import Control.Monad.IO.Control (liftIOOp)
|
||||
import Control.Exception hiding (handle, throw)
|
||||
|
||||
import AnnexCommon
|
||||
|
||||
{- Runs an Annex action, with setup and cleanup both in the IO monad. -}
|
||||
bracketIO :: IO c -> (c -> IO b) -> Annex a -> Annex a
|
||||
bracketIO setup cleanup go =
|
||||
liftIOOp (Control.Exception.bracket setup cleanup) (const go)
|
||||
|
||||
{- Throws an exception in the Annex monad. -}
|
||||
throw :: Control.Exception.Exception e => e -> Annex a
|
||||
throw = liftIO . throwIO
|
15
Branch.hs
15
Branch.hs
|
@ -21,10 +21,9 @@ module Branch (
|
|||
import System.IO.Binary
|
||||
import System.Exit
|
||||
import qualified Data.ByteString.Lazy.Char8 as L
|
||||
import Control.Monad.IO.Control (liftIOOp)
|
||||
import qualified Control.Exception
|
||||
|
||||
import AnnexCommon
|
||||
import Annex.Exception
|
||||
import Types.BranchState
|
||||
import qualified Git
|
||||
import qualified Git.UnionMerge
|
||||
|
@ -66,7 +65,7 @@ withIndex' bootstrapping a = do
|
|||
g <- gitRepo
|
||||
let f = index g
|
||||
|
||||
bracket (Git.useIndex f) id $ do
|
||||
bracketIO (Git.useIndex f) id $ do
|
||||
unlessM (liftIO $ doesFileExist f) $ do
|
||||
unless bootstrapping create
|
||||
liftIO $ createDirectoryIfMissing True $ takeDirectory f
|
||||
|
@ -93,9 +92,9 @@ invalidateCache = do
|
|||
setState state { cachedFile = Nothing, cachedContent = "" }
|
||||
|
||||
getCache :: FilePath -> Annex (Maybe String)
|
||||
getCache file = getState >>= handle
|
||||
getCache file = getState >>= go
|
||||
where
|
||||
handle state
|
||||
go state
|
||||
| cachedFile state == Just file =
|
||||
return $ Just $ cachedContent state
|
||||
| otherwise = return Nothing
|
||||
|
@ -328,14 +327,10 @@ lockJournal :: Annex a -> Annex a
|
|||
lockJournal a = do
|
||||
g <- gitRepo
|
||||
let file = gitAnnexJournalLock g
|
||||
bracket (lock file) unlock a
|
||||
bracketIO (lock file) unlock a
|
||||
where
|
||||
lock file = do
|
||||
l <- createFile file stdFileMode
|
||||
waitToSetLock l (WriteLock, AbsoluteSeek, 0, 0)
|
||||
return l
|
||||
unlock = closeFd
|
||||
|
||||
bracket :: IO c -> (c -> IO b) -> Annex a -> Annex a
|
||||
bracket start cleanup go =
|
||||
liftIOOp (Control.Exception.bracket start cleanup) (const go)
|
||||
|
|
|
@ -7,10 +7,8 @@
|
|||
|
||||
module Command.Add where
|
||||
|
||||
import Control.Exception.Control (handle)
|
||||
import Control.Exception.Base (throwIO)
|
||||
|
||||
import AnnexCommon
|
||||
import Annex.Exception
|
||||
import Command
|
||||
import qualified Annex
|
||||
import qualified AnnexQueue
|
||||
|
@ -58,7 +56,7 @@ undo file key e = do
|
|||
logStatus key InfoMissing
|
||||
rethrow
|
||||
where
|
||||
rethrow = liftIO $ throwIO e
|
||||
rethrow = throw e
|
||||
|
||||
-- fromAnnex could fail if the file ownership is weird
|
||||
tryharder :: IOException -> Annex ()
|
||||
|
|
Loading…
Reference in a new issue