Merge pull request #110 from paulcapron/master

Make `mv` work accross filesystems
This commit is contained in:
Gabriel Gonzalez 2015-10-07 12:10:09 -07:00
commit 0c7fc6bb86

View file

@ -236,6 +236,7 @@ import qualified Data.Text.IO as Text
import qualified Filesystem import qualified Filesystem
import Filesystem.Path.CurrentOS (FilePath, (</>)) import Filesystem.Path.CurrentOS (FilePath, (</>))
import qualified Filesystem.Path.CurrentOS as Filesystem import qualified Filesystem.Path.CurrentOS as Filesystem
import GHC.IO.Exception (IOErrorType(UnsupportedOperation))
import Network.HostName (getHostName) import Network.HostName (getHostName)
import System.Clock (Clock(..), TimeSpec(..), getTime) import System.Clock (Clock(..), TimeSpec(..), getTime)
import System.Environment ( import System.Environment (
@ -254,6 +255,7 @@ import System.Exit (ExitCode(..), exitWith)
import System.IO (Handle, hClose) import System.IO (Handle, hClose)
import qualified System.IO as IO import qualified System.IO as IO
import System.IO.Temp (withTempDirectory, withTempFile) import System.IO.Temp (withTempDirectory, withTempFile)
import System.IO.Error (catchIOError, ioeGetErrorType)
import qualified System.Process as Process import qualified System.Process as Process
#ifdef mingw32_HOST_OS #ifdef mingw32_HOST_OS
import qualified System.Win32 as Win32 import qualified System.Win32 as Win32
@ -623,9 +625,19 @@ lsif predicate path = do
else return child else return child
else return child else return child
-- | Move a file or directory {-| Move a file or directory
Works if the two paths are on the same filesystem.
If not, @mv@ will still work when dealing with a regular file,
but the operation will not be atomic
-}
mv :: MonadIO io => FilePath -> FilePath -> io () mv :: MonadIO io => FilePath -> FilePath -> io ()
mv oldPath newPath = liftIO (Filesystem.rename oldPath newPath) mv oldPath newPath = liftIO $ catchIOError (Filesystem.rename oldPath newPath)
(\ioe -> if ioeGetErrorType ioe == UnsupportedOperation -- certainly EXDEV
then do
Filesystem.copyFile oldPath newPath
Filesystem.removeFile oldPath
else ioError ioe)
{-| Create a directory {-| Create a directory