import: Fix failure of cross-device import on Windows.

As well as import, 2 other places ran "mv" manually, so changed them to use
moveFile as well.
This commit is contained in:
Joey Hess 2015-07-07 14:48:23 -04:00
parent 99a99b3f65
commit 625303226d
4 changed files with 28 additions and 13 deletions

View file

@ -107,21 +107,32 @@ moveFile src dest = tryIO (rename src dest) >>= onrename
onrename (Left e)
| isPermissionError e = rethrow
| isDoesNotExistError e = rethrow
| otherwise = do
-- copyFile is likely not as optimised as
-- the mv command, so we'll use the latter.
-- But, mv will move into a directory if
-- dest is one, which is not desired.
whenM (isdir dest) rethrow
viaTmp mv dest ""
| otherwise = viaTmp mv dest ""
where
rethrow = throwM e
mv tmp _ = do
-- copyFile is likely not as optimised as
-- the mv command, so we'll use the command.
--
-- But, while Windows has a "mv", it does not seem very
-- reliable, so use copyFile there.
#ifndef mingw32_HOST_OS
-- If dest is a directory, mv would move the file
-- into it, which is not desired.
whenM (isdir dest) rethrow
ok <- boolSystem "mv" [Param "-f", Param src, Param tmp]
let e' = e
#else
r <- tryIO $ copyFile src tmp
let (ok, e') = case r of
Left e' -> (False, e')
Right _ -> (True, e)
#endif
unless ok $ do
-- delete any partial
_ <- tryIO $ removeFile tmp
rethrow
throwM e'
isdir f = do
r <- tryIO $ getFileStatus f