Rev 1994: Merge new subvertpy. in file:///data/jelmer/bzr-svn/0.5/
Jelmer Vernooij
jelmer at samba.org
Mon Nov 17 01:08:10 GMT 2008
At file:///data/jelmer/bzr-svn/0.5/
------------------------------------------------------------
revno: 1994
revision-id: jelmer at samba.org-20081117010808-871e83qqymohfwxr
parent: jelmer at samba.org-20081117004807-c66y2bb0f8rta066
parent: jelmer at samba.org-20081117010748-qyofdqkslzm14z0f
committer: Jelmer Vernooij <jelmer at samba.org>
branch nick: 0.5
timestamp: Mon 2008-11-17 02:08:08 +0100
message:
Merge new subvertpy.
modified:
subvertpy/subvertpy/ra_svn.py ra_svn.py-20081116165419-qplciag3b7ikc6ms-1
------------------------------------------------------------
revno: 1925.2.30
revision-id: jelmer at samba.org-20081117010748-qyofdqkslzm14z0f
parent: jelmer at samba.org-20081117004142-gsaizxd9fuj0eyi3
committer: Jelmer Vernooij <jelmer at samba.org>
branch nick: trunk
timestamp: Mon 2008-11-17 02:07:48 +0100
message:
Use same signature for SSH connections as bzr.
modified:
subvertpy/ra_svn.py ra_svn.py-20081116165419-qplciag3b7ikc6ms-1
=== modified file 'subvertpy/subvertpy/ra_svn.py'
--- a/subvertpy/subvertpy/ra_svn.py 2008-11-17 00:41:42 +0000
+++ b/subvertpy/subvertpy/ra_svn.py 2008-11-17 01:07:48 +0000
@@ -30,6 +30,64 @@
from subvertpy.ra import DIRENT_KIND, DIRENT_TIME, DIRENT_HAS_PROPS, DIRENT_SIZE, DIRENT_CREATED_REV, DIRENT_LAST_AUTHOR
from subvertpy.server import generate_random_id
+class SSHSubprocess(object):
+ """A socket-like object that talks to an ssh subprocess via pipes."""
+
+ def __init__(self, proc):
+ self.proc = proc
+
+ def send(self, data):
+ return os.write(self.proc.stdin.fileno(), data)
+
+ def recv(self, count):
+ return os.read(self.proc.stdout.fileno(), count)
+
+ def close(self):
+ self.proc.stdin.close()
+ self.proc.stdout.close()
+ self.proc.wait()
+
+
+class SSHVendor(object):
+
+ def connect_ssh(self, username, password, host, port, command):
+ args = ['ssh', '-x']
+ if port is not None:
+ args.extend(['-p', str(port)])
+ if username is not None:
+ host = "%s@%s" % (username, host)
+ args.append(host)
+ proc = subprocess.Popen(args + command,
+ stdin=subprocess.PIPE,
+ stdout=subprocess.PIPE)
+ return SSHSubprocess(proc)
+
+
+# Can be overridden by users
+get_ssh_vendor = SSHVendor
+
+
+class SSHSubprocess(object):
+ """A socket-like object that talks to an ssh subprocess via pipes."""
+
+ def __init__(self, proc):
+ self.proc = proc
+
+ def send(self, data):
+ return os.write(self.proc.stdin.fileno(), data)
+
+ def recv(self, count):
+ return os.read(self.proc.stdout.fileno(), count)
+
+ def close(self):
+ self.proc.stdin.close()
+ self.proc.stdout.close()
+ self.proc.wait()
+
+ def get_filelike_channels(self):
+ return (self.proc.stdout, self.proc.stdin)
+
+
class SVNConnection(object):
def __init__(self, recv_fn, send_fn):
@@ -402,10 +460,14 @@
return (self._socket.recv, self._socket.send)
def _connect_ssh(self, host):
- # FIXME: Support paramiko as well?
- self._tunnel = subprocess.Popen(["ssh", host, "svnserve", "-t"], stdin=subprocess.PIPE,
- stdout=subprocess.PIPE)
- return (lambda x: os.read(self._tunnel.stdout.fileno(), x), self._tunnel.stdin.write)
+ (user, host) = urllib.splituser(host)
+ if user is not None:
+ (user, password) = urllib.splitpassword(user)
+ else:
+ password = None
+ (host, port) = urllib.splitnport(host, 22)
+ self._tunnel = get_ssh_vendor().connect_ssh(user, password, host, port, ["svnserve", "-t"])
+ return (self._tunnel.recv, self._tunnel.send)
def get_file_revs(self, path, start, end, file_rev_handler):
raise NotImplementedError(self.get_file_revs)
More information about the bazaar-commits
mailing list