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