Avoid excessive escaping for rsync special remotes that are not accessed over ssh.

This is actually tricky, 45bbf210a1 added
the escaping because it's needed for rsync that does go over ssh.
So I had to detect whether the remote's rsync url will use ssh or not,
and vary the escaping.
This commit is contained in:
Joey Hess 2011-11-18 12:53:48 -04:00
parent ed55a750d5
commit 1326bb8635
4 changed files with 27 additions and 2 deletions

View file

@ -81,13 +81,18 @@ rsyncSetup u c = do
gitConfigSpecialRemote u c' "rsyncurl" url gitConfigSpecialRemote u c' "rsyncurl" url
return c' return c'
rsyncEscape :: RsyncOpts -> String -> String
rsyncEscape o s
| rsyncUrlIsShell (rsyncUrl o) = shellEscape s
| otherwise = s
rsyncKey :: RsyncOpts -> Key -> String rsyncKey :: RsyncOpts -> Key -> String
rsyncKey o k = rsyncUrl o </> hashDirMixed k </> shellEscape (f </> f) rsyncKey o k = rsyncUrl o </> hashDirMixed k </> rsyncEscape o (f </> f)
where where
f = keyFile k f = keyFile k
rsyncKeyDir :: RsyncOpts -> Key -> String rsyncKeyDir :: RsyncOpts -> Key -> String
rsyncKeyDir o k = rsyncUrl o </> hashDirMixed k </> shellEscape (keyFile k) rsyncKeyDir o k = rsyncUrl o </> hashDirMixed k </> rsyncEscape o (keyFile k)
store :: RsyncOpts -> Key -> Annex Bool store :: RsyncOpts -> Key -> Annex Bool
store o k = rsyncSend o k =<< fromRepo (gitAnnexLocation k) store o k = rsyncSend o k =<< fromRepo (gitAnnexLocation k)

View file

@ -8,6 +8,7 @@
module Utility.RsyncFile where module Utility.RsyncFile where
import Data.String.Utils import Data.String.Utils
import Data.List
import Utility.SafeCommand import Utility.SafeCommand
@ -48,3 +49,18 @@ rsync = boolSystem "rsync"
rsyncExec :: [CommandParam] -> IO () rsyncExec :: [CommandParam] -> IO ()
rsyncExec params = executeFile "rsync" True (toCommand params) Nothing 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

2
debian/changelog vendored
View file

@ -17,6 +17,8 @@ git-annex (3.20111112) UNRELEASED; urgency=low
* When not run in a git repository, git-annex can still display a usage * When not run in a git repository, git-annex can still display a usage
message, and "git annex version" even works. message, and "git annex version" even works.
* migrate: Don't fall over a stale temp file. * migrate: Don't fall over a stale temp file.
* Avoid excessive escaping for rsync special remotes that are not accessed
over ssh.
-- Joey Hess <joeyh@debian.org> Sat, 12 Nov 2011 14:50:21 -0400 -- Joey Hess <joeyh@debian.org> Sat, 12 Nov 2011 14:50:21 -0400

View file

@ -11,3 +11,5 @@ I attached a patch for this.
> >
> Ah, you're not using rsync over ssh, but just to a local directory, > Ah, you're not using rsync over ssh, but just to a local directory,
> right? --[[Joey]] > right? --[[Joey]]
>> [[fixed|done]] --[[Joey]]