diff options
author | Joey Hess <joeyh@joeyh.name> | 2015-07-07 14:48:23 -0400 |
---|---|---|
committer | Joey Hess <joeyh@joeyh.name> | 2015-07-07 14:48:23 -0400 |
commit | d9cbdf43fe6ce971d9b5a99e60a70055f67b1ed3 (patch) | |
tree | 540a849d67b0ab43c981dc4a93432743be1054b3 /Utility | |
parent | 734d7e8360b09b80f943140186911d47dc5db735 (diff) |
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.
Diffstat (limited to 'Utility')
-rw-r--r-- | Utility/Directory.hs | 27 |
1 files changed, 19 insertions, 8 deletions
diff --git a/Utility/Directory.hs b/Utility/Directory.hs index 7322cd85f..2d9e9c40e 100644 --- a/Utility/Directory.hs +++ b/Utility/Directory.hs @@ -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 |