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

@ -50,11 +50,13 @@ perform src dest key = do
)
where
-- the file might be on a different filesystem,
-- so mv is used rather than simply calling
-- so moveFile is used rather than simply calling
-- moveToObjectDir; disk space is also
-- checked this way.
move = getViaTmp key $ \tmp ->
liftIO $ boolSystem "mv" [File src, File tmp]
liftIO $ catchBoolIO $ do
moveFile src tmp
return True
reject = const $ return "wrong file?"
cleanup :: Key -> CommandCleanup

View file

@ -31,13 +31,14 @@ mkKey = fromMaybe (error "bad key") . file2key
perform :: FilePath -> Key -> CommandPerform
perform file key = do
-- the file might be on a different filesystem, so mv is used
-- the file might be on a different filesystem, so moveFile is used
-- rather than simply calling moveAnnex; disk space is also
-- checked this way.
ok <- getViaTmp key $ \dest ->
if dest /= file
then liftIO $
boolSystem "mv" [File file, File dest]
then liftIO $ catchBoolIO $ do
moveFile file dest
return True
else return True
if ok
then next $ cleanup key

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

1
debian/changelog vendored
View file

@ -21,6 +21,7 @@ git-annex (5.20150618) UNRELEASED; urgency=medium
git init --shared=world.
* On linux, pass --as-needed to linker to avoid linking with unused
shared libraries including libyaml.
* import: Fix failure of cross-device import on Windows.
-- Joey Hess <id@joeyh.name> Thu, 02 Jul 2015 12:31:14 -0400