diff --git a/Remote/Git.hs b/Remote/Git.hs index 3f88a03343..7c75405431 100644 --- a/Remote/Git.hs +++ b/Remote/Git.hs @@ -425,7 +425,7 @@ rsyncOrCopyFile rsyncparams src dest p = _ -> watchfilesize oldsz #endif dorsync = rsyncHelper (Just p) $ - rsyncparams ++ [Param src, Param dest] + rsyncparams ++ [File src, File dest] {- Generates rsync parameters that ssh to the remote and asks it - to either receive or send the key's content. -} diff --git a/Remote/Rsync.hs b/Remote/Rsync.hs index 768c15777b..f7abbbf2a6 100644 --- a/Remote/Rsync.hs +++ b/Remote/Rsync.hs @@ -242,7 +242,7 @@ rsyncRetrieve o k dest callback = -- use inplace when retrieving to support resuming [ Param "--inplace" , Param u - , Param dest + , File dest ] rsyncRemote :: RsyncOpts -> (Maybe MeterUpdate) -> [CommandParam] -> Annex Bool @@ -292,7 +292,7 @@ rsyncSend o callback k canrename src = withRsyncScratchDir $ \tmp -> do [ Param "--recursive" , partialParams -- tmp/ to send contents of tmp dir - , Param $ addTrailingPathSeparator tmp + , File $ addTrailingPathSeparator tmp , Param $ rsyncUrl o ] else return False diff --git a/Utility/Path.hs b/Utility/Path.hs index 2c2fc35ff9..09cf739dc2 100644 --- a/Utility/Path.hs +++ b/Utility/Path.hs @@ -17,6 +17,11 @@ import Data.List import Data.Maybe import Control.Applicative +#ifdef __WINDOWS__ +import Data.Char +import System.FilePath.Posix as Posix +#endif + import Utility.Monad import Utility.UserInfo @@ -185,3 +190,22 @@ dotfile file | otherwise = "." `isPrefixOf` f || dotfile (takeDirectory file) where f = takeFileName file + +{- Converts a DOS style path to a Cygwin style path. Only on Windows. + - Any trailing '\' is preserved as a trailing '/' -} +toCygPath :: FilePath -> FilePath +#ifndef __WINDOWS__ +toCygPath = id +#else +toCygPath p + | null drive = recombine parts + | otherwise = recombine $ "/cygdrive" : driveletter drive : parts + where + (drive, p') = splitDrive p + parts = splitDirectories p' + driveletter = map toLower . takeWhile (/= ':') + recombine = fixtrailing . Posix.joinPath + fixtrailing s + | hasTrailingPathSeparator p = Posix.addTrailingPathSeparator s + | otherwise = s +#endif diff --git a/Utility/Rsync.hs b/Utility/Rsync.hs index 652da8b20b..5f322a0cb7 100644 --- a/Utility/Rsync.hs +++ b/Utility/Rsync.hs @@ -1,6 +1,6 @@ {- various rsync stuff - - - Copyright 2010-2012 Joey Hess + - Copyright 2010-2013 Joey Hess - - Licensed under the GNU GPL version 3 or higher. -} @@ -49,7 +49,16 @@ rsyncUseDestinationPermissions :: CommandParam rsyncUseDestinationPermissions = Param "--chmod=ugo=rwX" rsync :: [CommandParam] -> IO Bool -rsync = boolSystem "rsync" +rsync = boolSystem "rsync" . rsyncParamsFixup + +{- On Windows, rsync is from Cygwin, and expects to get Cygwin formatted + - paths to files. (It thinks that C:foo refers to a host named "C"). + - Fix up all Files in the Params appropriately. -} +rsyncParamsFixup :: [CommandParam] -> [CommandParam] +rsyncParamsFixup = map fixup + where + fixup (File f) = File (toCygPath f) + fixup p = p {- Runs rsync, but intercepts its progress output and updates a meter. - The progress output is also output to stdout. @@ -65,7 +74,7 @@ rsyncProgress meterupdate params = do reapZombies return r where - p = proc "rsync" (toCommand params) + p = proc "rsync" (toCommand $ rsyncParamsFixup params) feedprogress prev buf h = do s <- hGetSomeString h 80 if null s