- usual cleanup. However, first check if something else is
- running the transfer, to avoid removing active transfers.
-}
- go remote transferrer = ifM (liftAnnex $ performTransfer transferrer t info)
+ go remote transferrer = ifM (performTransfer transferrer t info)
( do
case associatedFile info of
AssociatedFile Nothing -> noop
{- Requests that a Transferrer perform a Transfer, and waits for it to
- finish. -}
-performTransfer :: Transferrer -> Transfer -> TransferInfo -> Annex Bool
+performTransfer :: Transferrer -> Transfer -> TransferInfo -> Assistant Bool
performTransfer transferrer t info = catchBoolIO $ do
(liftIO $ T.sendRequest t info (transferrerWrite transferrer))
- T.readResponse (transferrerRead transferrer)
+ readresponse
+ where
+ readresponse =
+ liftIO (T.readResponse (transferrerRead transferrer)) >>= \case
+ Right r -> return r
+ Left so -> do
+ liftAnnex $ emitSerializedOutput so
+ readresponse
{- Starts a new git-annex transferkeys process, setting up handles
- that will be used to communicate with it. -}
import Annex.BranchState
import Types.Messages
import Types.Key
-import Messages.Internal
import Text.Read (readMaybe)
hPutStrLn writeh $ show $ TransferResult b
hFlush writeh
+-- FIXME this is bad when used with inAnnex
sendRequest :: Transfer -> TransferInfo -> Handle -> IO ()
sendRequest t tinfo h = hPutStrLn h $ show $ TransferRequest
(transferDirection t)
-- | Read a response from this command.
--
--- Each TransferOutput line that is read before the final TransferResult
--- will be output.
-readResponse :: Handle -> Annex Bool
+-- Before the final response, this will return whatever SerializedOutput
+-- should be displayed as the transfer is performed.
+readResponse :: Handle -> IO (Either SerializedOutput Bool)
readResponse h = do
l <- liftIO $ hGetLine h
case readMaybe l of
- Just (TransferOutput so) -> do
- emitSerializedOutput so
- readResponse h
- Just (TransferResult r) -> return r
+ Just (TransferOutput so) -> return (Left so)
+ Just (TransferResult r) -> return (Right r)
Nothing -> protocolError l
protocolError :: String -> a