get, copy, move: Display an error message when an identical transfer is already in progress, rather than failing with no indication why.
This commit is contained in:
parent
bb284cd980
commit
e9048ecec8
4 changed files with 25 additions and 10 deletions
|
@ -113,20 +113,25 @@ runTransfer t file shouldretry a = do
|
|||
info <- liftIO $ startTransferInfo file
|
||||
(meter, tfile, metervar) <- mkProgressUpdater t info
|
||||
mode <- annexFileMode
|
||||
fd <- liftIO $ prep tfile mode info
|
||||
ok <- retry info metervar $
|
||||
bracketIO (prep tfile mode info) (cleanup tfile) (a meter)
|
||||
bracketIO (return fd) (cleanup tfile) (a meter)
|
||||
unless ok $ recordFailedTransfer t info
|
||||
return ok
|
||||
where
|
||||
prep tfile mode info = catchMaybeIO $ do
|
||||
fd <- openFd (transferLockFile tfile) ReadWrite (Just mode)
|
||||
defaultFileFlags { trunc = True }
|
||||
locked <- catchMaybeIO $
|
||||
setLock fd (WriteLock, AbsoluteSeek, 0, 0)
|
||||
when (locked == Nothing) $
|
||||
error $ "transfer already in progress"
|
||||
writeTransferInfoFile info tfile
|
||||
return fd
|
||||
prep tfile mode info = do
|
||||
mfd <- catchMaybeIO $
|
||||
openFd (transferLockFile tfile) ReadWrite (Just mode)
|
||||
defaultFileFlags { trunc = True }
|
||||
case mfd of
|
||||
Nothing -> return mfd
|
||||
Just fd -> do
|
||||
locked <- catchMaybeIO $
|
||||
setLock fd (WriteLock, AbsoluteSeek, 0, 0)
|
||||
when (locked == Nothing) $
|
||||
error $ "transfer already in progress"
|
||||
void $ tryIO $ writeTransferInfoFile info tfile
|
||||
return mfd
|
||||
cleanup _ Nothing = noop
|
||||
cleanup tfile (Just fd) = do
|
||||
void $ tryIO $ removeFile tfile
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue