aboutsummaryrefslogtreecommitdiff
path: root/Utility/RsyncFile.hs
diff options
context:
space:
mode:
Diffstat (limited to 'Utility/RsyncFile.hs')
-rw-r--r--Utility/RsyncFile.hs16
1 files changed, 16 insertions, 0 deletions
diff --git a/Utility/RsyncFile.hs b/Utility/RsyncFile.hs
index c5006a30f..a691d0a0e 100644
--- a/Utility/RsyncFile.hs
+++ b/Utility/RsyncFile.hs
@@ -8,6 +8,7 @@
module Utility.RsyncFile where
import Data.String.Utils
+import Data.List
import Utility.SafeCommand
@@ -48,3 +49,18 @@ rsync = boolSystem "rsync"
rsyncExec :: [CommandParam] -> IO ()
rsyncExec params = executeFile "rsync" True (toCommand params) Nothing
+
+{- Checks if an rsync url involves the remote shell (ssh or rsh).
+ - Use of such urls with rsync or rsyncExec requires additional shell
+ - escaping. -}
+rsyncUrlIsShell :: String -> Bool
+rsyncUrlIsShell s
+ | "rsync://" `isPrefixOf` s = False
+ | otherwise = go s
+ where
+ -- host:dir is rsync protocol, while host:dir is ssh/rsh
+ go [] = False
+ go (c:cs)
+ | c == '/' = False -- got to directory with no colon
+ | c == ':' = not $ ":" `isPrefixOf` cs
+ | otherwise = go cs