summaryrefslogtreecommitdiff
path: root/Remote/Helper/Chunked.hs
diff options
context:
space:
mode:
authorGravatar Joey Hess <joey@kitenet.net>2014-07-29 18:40:40 -0400
committerGravatar Joey Hess <joey@kitenet.net>2014-07-29 18:41:41 -0400
commita2dfbf18972339929c49cb77e76cf246ada2acdc (patch)
treeb37fa5150d4a5c7ab76b58181fbd900157d915cb /Remote/Helper/Chunked.hs
parente55bc5640997362f1f77a5423f7556b307377f61 (diff)
better type for Retriever
Putting a callback in the Retriever type allows for the callback to remove the retrieved file when it's done with it. I did not really want to make Retriever be fixed to Annex Bool, but when I tried to use Annex a, I got into some type of type mess.
Diffstat (limited to 'Remote/Helper/Chunked.hs')
-rw-r--r--Remote/Helper/Chunked.hs25
1 files changed, 15 insertions, 10 deletions
diff --git a/Remote/Helper/Chunked.hs b/Remote/Helper/Chunked.hs
index 102ced8f4..ae949abc3 100644
--- a/Remote/Helper/Chunked.hs
+++ b/Remote/Helper/Chunked.hs
@@ -249,26 +249,28 @@ retrieveChunks retriever u chunkconfig encryptor basek dest basep sink
let p = maybe basep
(offsetMeterUpdate basep . toBytesProcessed)
offset
- v <- tryNonAsyncAnnex $ retriever (encryptor k) p
- case v of
- Left e
- | null ls -> giveup e
- | otherwise -> firstavail currsize ls
- Right content -> do
+ v <- tryNonAsyncAnnex $
+ retriever (encryptor k) p $ \content ->
bracketIO (maybe opennew openresume offset) hClose $ \h -> do
tosink h p content
let sz = toBytesProcessed $
fromMaybe 0 $ keyChunkSize k
getrest p h sz sz ks
+ `catchNonAsyncAnnex` giveup
+ case v of
+ Left e
+ | null ls -> giveup e
+ | otherwise -> firstavail currsize ls
+ Right r -> return r
getrest _ _ _ _ [] = return True
getrest p h sz bytesprocessed (k:ks) = do
let p' = offsetMeterUpdate p bytesprocessed
- tosink h p' =<< retriever (encryptor k) p'
+ retriever (encryptor k) p' $ tosink h p'
getrest p h sz (addBytesProcessed bytesprocessed sz) ks
getunchunked = bracketIO opennew hClose $ \h -> do
- tosink h basep =<< retriever (encryptor basek) basep
+ retriever (encryptor basek) basep $ tosink h basep
return True
opennew = openBinaryFile dest WriteMode
@@ -288,10 +290,13 @@ retrieveChunks retriever u chunkconfig encryptor basek dest basep sink
- it is not responsible for updating progress (often it cannot).
- Instead, the sink is passed a meter to update as it consumes
- the ByteString. -}
- tosink h p (ByteContent b) = liftIO $
+ tosink h p (ByteContent b) = liftIO $ do
sink h (Just p) b
- tosink h _ (FileContent f) = liftIO $
+ return True
+ tosink h _ (FileContent f) = liftIO $ do
sink h Nothing =<< L.readFile f
+ nukeFile h
+ return True
{- Can resume when the chunk's offset is at or before the end of
- the dest file. -}