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:
parent
99a99b3f65
commit
625303226d
4 changed files with 28 additions and 13 deletions
|
@ -50,11 +50,13 @@ perform src dest key = do
|
||||||
)
|
)
|
||||||
where
|
where
|
||||||
-- the file might be on a different filesystem,
|
-- 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
|
-- moveToObjectDir; disk space is also
|
||||||
-- checked this way.
|
-- checked this way.
|
||||||
move = getViaTmp key $ \tmp ->
|
move = getViaTmp key $ \tmp ->
|
||||||
liftIO $ boolSystem "mv" [File src, File tmp]
|
liftIO $ catchBoolIO $ do
|
||||||
|
moveFile src tmp
|
||||||
|
return True
|
||||||
reject = const $ return "wrong file?"
|
reject = const $ return "wrong file?"
|
||||||
|
|
||||||
cleanup :: Key -> CommandCleanup
|
cleanup :: Key -> CommandCleanup
|
||||||
|
|
|
@ -31,13 +31,14 @@ mkKey = fromMaybe (error "bad key") . file2key
|
||||||
|
|
||||||
perform :: FilePath -> Key -> CommandPerform
|
perform :: FilePath -> Key -> CommandPerform
|
||||||
perform file key = do
|
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
|
-- rather than simply calling moveAnnex; disk space is also
|
||||||
-- checked this way.
|
-- checked this way.
|
||||||
ok <- getViaTmp key $ \dest ->
|
ok <- getViaTmp key $ \dest ->
|
||||||
if dest /= file
|
if dest /= file
|
||||||
then liftIO $
|
then liftIO $ catchBoolIO $ do
|
||||||
boolSystem "mv" [File file, File dest]
|
moveFile file dest
|
||||||
|
return True
|
||||||
else return True
|
else return True
|
||||||
if ok
|
if ok
|
||||||
then next $ cleanup key
|
then next $ cleanup key
|
||||||
|
|
|
@ -107,21 +107,32 @@ moveFile src dest = tryIO (rename src dest) >>= onrename
|
||||||
onrename (Left e)
|
onrename (Left e)
|
||||||
| isPermissionError e = rethrow
|
| isPermissionError e = rethrow
|
||||||
| isDoesNotExistError e = rethrow
|
| isDoesNotExistError e = rethrow
|
||||||
| otherwise = do
|
| otherwise = viaTmp mv dest ""
|
||||||
-- 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 ""
|
|
||||||
where
|
where
|
||||||
rethrow = throwM e
|
rethrow = throwM e
|
||||||
|
|
||||||
mv tmp _ = do
|
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]
|
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
|
unless ok $ do
|
||||||
-- delete any partial
|
-- delete any partial
|
||||||
_ <- tryIO $ removeFile tmp
|
_ <- tryIO $ removeFile tmp
|
||||||
rethrow
|
throwM e'
|
||||||
|
|
||||||
isdir f = do
|
isdir f = do
|
||||||
r <- tryIO $ getFileStatus f
|
r <- tryIO $ getFileStatus f
|
||||||
|
|
1
debian/changelog
vendored
1
debian/changelog
vendored
|
@ -21,6 +21,7 @@ git-annex (5.20150618) UNRELEASED; urgency=medium
|
||||||
git init --shared=world.
|
git init --shared=world.
|
||||||
* On linux, pass --as-needed to linker to avoid linking with unused
|
* On linux, pass --as-needed to linker to avoid linking with unused
|
||||||
shared libraries including libyaml.
|
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
|
-- Joey Hess <id@joeyh.name> Thu, 02 Jul 2015 12:31:14 -0400
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue