# HG changeset patch # User Mads Kiilerich # Date 2011-11-25 23:10:31 # Node ID d8fa35c28335a8769a50aa051ba582e29d5c45b8 # Parent 5a7733563c2e532e9a6a25fed6d3cfa68cb53875 ssh: quote remote paths (issue2983) diff --git a/mercurial/sshrepo.py b/mercurial/sshrepo.py --- a/mercurial/sshrepo.py +++ b/mercurial/sshrepo.py @@ -18,6 +18,10 @@ class remotelock(object): if self.repo: self.release() +def _serverquote(s): + '''quote a string for the remote shell ... which we assume is sh''' + return "'%s'" % s.replace("'", "'\\''") + class sshrepository(wireproto.wirerepository): def __init__(self, ui, path, create=False): self._url = path @@ -40,9 +44,9 @@ class sshrepository(wireproto.wirereposi args = util.sshargs(sshcmd, self.host, self.user, self.port) if create: - cmd = '%s %s "%s init %s"' - cmd = cmd % (sshcmd, args, remotecmd, self.path) - + cmd = '%s %s %s' % (sshcmd, args, + util.shellquote("%s init %s" % + (_serverquote(remotecmd), _serverquote(self.path)))) ui.note(_('running %s\n') % cmd) res = util.system(cmd) if res != 0: @@ -57,11 +61,11 @@ class sshrepository(wireproto.wirereposi # cleanup up previous run self.cleanup() - cmd = '%s %s "%s -R %s serve --stdio"' - cmd = cmd % (sshcmd, args, remotecmd, self.path) - + cmd = '%s %s %s' % (sshcmd, args, + util.shellquote("%s -R %s serve --stdio" % + (_serverquote(remotecmd), _serverquote(self.path)))) + ui.note(_('running %s\n') % cmd) cmd = util.quotecommand(cmd) - ui.note(_('running %s\n') % cmd) self.pipeo, self.pipei, self.pipee = util.popen3(cmd) # skip any noise generated by remote shell diff --git a/tests/test-init.t b/tests/test-init.t --- a/tests/test-init.t +++ b/tests/test-init.t @@ -105,13 +105,13 @@ clone to existing repo output of dummyssh $ cat dummylog - Got arguments 1:user@dummy 2:hg init remote2 - Got arguments 1:user@dummy 2:hg -R remote2 serve --stdio - Got arguments 1:user@dummy 2:hg -R remote2 serve --stdio - Got arguments 1:user@dummy 2:hg init remote1 - Got arguments 1:user@dummy 2:hg -R remote1 serve --stdio - Got arguments 1:user@dummy 2:hg init remote1 - Got arguments 1:user@dummy 2:hg init remote1 + Got arguments 1:user@dummy 2:'hg' init 'remote2' + Got arguments 1:user@dummy 2:'hg' -R 'remote2' serve --stdio + Got arguments 1:user@dummy 2:'hg' -R 'remote2' serve --stdio + Got arguments 1:user@dummy 2:'hg' init 'remote1' + Got arguments 1:user@dummy 2:'hg' -R 'remote1' serve --stdio + Got arguments 1:user@dummy 2:'hg' init 'remote1' + Got arguments 1:user@dummy 2:'hg' init 'remote1' comparing repositories diff --git a/tests/test-ssh.t b/tests/test-ssh.t --- a/tests/test-ssh.t +++ b/tests/test-ssh.t @@ -266,25 +266,36 @@ results here) [255] $ cd .. + +Test remote paths with spaces (issue2983): + + $ hg init --ssh "python $TESTDIR/dummyssh" "ssh://user@dummy/a repo" + $ hg -R 'a repo' tag tag + $ hg id --ssh "python $TESTDIR/dummyssh" "ssh://user@dummy/a repo" + 3fb238f49e8c + $ cat dummylog - Got arguments 1:user@dummy 2:hg -R nonexistent serve --stdio - Got arguments 1:user@dummy 2:hg -R /$TESTTMP/nonexistent serve --stdio - Got arguments 1:user@dummy 2:hg -R remote serve --stdio - Got arguments 1:user@dummy 2:hg -R remote serve --stdio - Got arguments 1:user@dummy 2:hg -R remote serve --stdio - Got arguments 1:user@dummy 2:hg -R remote serve --stdio - Got arguments 1:user@dummy 2:hg -R local serve --stdio - Got arguments 1:user@dummy 2:hg -R $TESTTMP/local serve --stdio - Got arguments 1:user@dummy 2:hg -R remote serve --stdio + Got arguments 1:user@dummy 2:'hg' -R 'nonexistent' serve --stdio + Got arguments 1:user@dummy 2:'hg' -R '/$TESTTMP/nonexistent' serve --stdio + Got arguments 1:user@dummy 2:'hg' -R 'remote' serve --stdio + Got arguments 1:user@dummy 2:'hg' -R 'remote' serve --stdio + Got arguments 1:user@dummy 2:'hg' -R 'remote' serve --stdio + Got arguments 1:user@dummy 2:'hg' -R 'remote' serve --stdio + Got arguments 1:user@dummy 2:'hg' -R 'local' serve --stdio + Got arguments 1:user@dummy 2:'hg' -R '$TESTTMP/local' serve --stdio + Got arguments 1:user@dummy 2:'hg' -R 'remote' serve --stdio changegroup-in-remote hook: HG_NODE=a28a9d1a809cab7d4e2fde4bee738a9ede948b60 HG_SOURCE=serve HG_URL=remote:ssh:127.0.0.1 - Got arguments 1:user@dummy 2:hg -R remote serve --stdio - Got arguments 1:user@dummy 2:hg -R remote serve --stdio - Got arguments 1:user@dummy 2:hg -R remote serve --stdio - Got arguments 1:user@dummy 2:hg -R remote serve --stdio - Got arguments 1:user@dummy 2:hg -R remote serve --stdio - Got arguments 1:user@dummy 2:hg -R remote serve --stdio - Got arguments 1:user@dummy 2:hg -R remote serve --stdio - Got arguments 1:user@dummy 2:hg -R remote serve --stdio - Got arguments 1:user@dummy 2:hg -R remote serve --stdio + Got arguments 1:user@dummy 2:'hg' -R 'remote' serve --stdio + Got arguments 1:user@dummy 2:'hg' -R 'remote' serve --stdio + Got arguments 1:user@dummy 2:'hg' -R 'remote' serve --stdio + Got arguments 1:user@dummy 2:'hg' -R 'remote' serve --stdio + Got arguments 1:user@dummy 2:'hg' -R 'remote' serve --stdio + Got arguments 1:user@dummy 2:'hg' -R 'remote' serve --stdio + Got arguments 1:user@dummy 2:'hg' -R 'remote' serve --stdio + Got arguments 1:user@dummy 2:'hg' -R 'remote' serve --stdio + Got arguments 1:user@dummy 2:'hg' -R 'remote' serve --stdio changegroup-in-remote hook: HG_NODE=1383141674ec756a6056f6a9097618482fe0f4a6 HG_SOURCE=serve HG_URL=remote:ssh:127.0.0.1 - Got arguments 1:user@dummy 2:hg -R remote serve --stdio + Got arguments 1:user@dummy 2:'hg' -R 'remote' serve --stdio + Got arguments 1:user@dummy 2:'hg' init 'a repo' + Got arguments 1:user@dummy 2:'hg' -R 'a repo' serve --stdio + Got arguments 1:user@dummy 2:'hg' -R 'a repo' serve --stdio diff --git a/tests/test-subrepo-relative-path.t b/tests/test-subrepo-relative-path.t --- a/tests/test-subrepo-relative-path.t +++ b/tests/test-subrepo-relative-path.t @@ -98,8 +98,8 @@ subrepo paths with ssh urls no changes found $ cat dummylog - Got arguments 1:user@dummy 2:hg -R cloned serve --stdio - Got arguments 1:user@dummy 2:hg -R sub serve --stdio - Got arguments 1:user@dummy 2:hg -R $TESTTMP/cloned serve --stdio - Got arguments 1:user@dummy 2:hg -R $TESTTMP/sub serve --stdio + Got arguments 1:user@dummy 2:'hg' -R 'cloned' serve --stdio + Got arguments 1:user@dummy 2:'hg' -R 'sub' serve --stdio + Got arguments 1:user@dummy 2:'hg' -R '$TESTTMP/cloned' serve --stdio + Got arguments 1:user@dummy 2:'hg' -R '$TESTTMP/sub' serve --stdio $ rm $BINDIR/ssh