Rev 3362: Fix incompatibility with recent Paramiko versions. (Andrew Bennetts) in file:///home/pqm/archives/thelove/bzr/%2Btrunk/

Canonical.com Patch Queue Manager pqm at pqm.ubuntu.com
Fri Apr 11 10:14:42 BST 2008


At file:///home/pqm/archives/thelove/bzr/%2Btrunk/

------------------------------------------------------------
revno: 3362
revision-id:pqm at pqm.ubuntu.com-20080411091434-wh7q1yc2k8cua4nv
parent: pqm at pqm.ubuntu.com-20080411070305-2yg29trk4rzvgb1u
parent: andrew.bennetts at canonical.com-20080410091639-6hwphp6m3c0rg44t
committer: Canonical.com Patch Queue Manager <pqm at pqm.ubuntu.com>
branch nick: +trunk
timestamp: Fri 2008-04-11 10:14:34 +0100
message:
  Fix incompatibility with recent Paramiko versions. (Andrew Bennetts)
modified:
  NEWS                           NEWS-20050323055033-4e00b5db738777ff
  bzrlib/transport/sftp.py       sftp.py-20051019050329-ab48ce71b7e32dfe
  bzrlib/transport/ssh.py        ssh.py-20060824042150-0s9787kng6zv1nwq-1
    ------------------------------------------------------------
    revno: 3353.1.3
    revision-id:andrew.bennetts at canonical.com-20080410091639-6hwphp6m3c0rg44t
    parent: andrew.bennetts at canonical.com-20080410084732-nmi86n9sb4vo1h9j
    committer: Andrew Bennetts <andrew.bennetts at canonical.com>
    branch nick: paramiko-1.7.2-compat
    timestamp: Thu 2008-04-10 19:16:39 +1000
    message:
      Always adapt sockets to look like paramiko Channels before passing them to paramiko's SFTPClient.
    modified:
      NEWS                           NEWS-20050323055033-4e00b5db738777ff
      bzrlib/transport/sftp.py       sftp.py-20051019050329-ab48ce71b7e32dfe
      bzrlib/transport/ssh.py        ssh.py-20060824042150-0s9787kng6zv1nwq-1
    ------------------------------------------------------------
    revno: 3353.1.2
    revision-id:andrew.bennetts at canonical.com-20080410084732-nmi86n9sb4vo1h9j
    parent: andrew.bennetts at canonical.com-20080410084123-a33oq0q3lonb10ej
    committer: Andrew Bennetts <andrew.bennetts at canonical.com>
    branch nick: paramiko-1.7.2-compat
    timestamp: Thu 2008-04-10 18:47:32 +1000
    message:
      Add get_name to LoopbackSFTP.  Makes the current tests pass with current paramiko.
    modified:
      bzrlib/transport/sftp.py       sftp.py-20051019050329-ab48ce71b7e32dfe
      bzrlib/transport/ssh.py        ssh.py-20060824042150-0s9787kng6zv1nwq-1
    ------------------------------------------------------------
    revno: 3353.1.1
    revision-id:andrew.bennetts at canonical.com-20080410084123-a33oq0q3lonb10ej
    parent: pqm at pqm.ubuntu.com-20080410073653-vq10gbuoes5o2c0q
    committer: Andrew Bennetts <andrew.bennetts at canonical.com>
    branch nick: paramiko-1.7.2-compat
    timestamp: Thu 2008-04-10 18:41:23 +1000
    message:
      Stop the test suite hanging with current paramiko.  (It doesn't pass yet, though.)
    modified:
      bzrlib/transport/sftp.py       sftp.py-20051019050329-ab48ce71b7e32dfe
=== modified file 'NEWS'
--- a/NEWS	2008-04-11 07:03:05 +0000
+++ b/NEWS	2008-04-11 09:14:34 +0000
@@ -126,6 +126,9 @@
 
     * Implement handling of basename parameter for DefaultMail.  (James Westby)
 
+    * Incompatibility with Paramiko versions newer than 1.7.2 was fixed.
+      (Andrew Bennetts, #213425)
+
     * Launchpad locations (lp: URLs) can be pulled.  (Aaron Bentley, #181945)
 
     * Merges that add files to deleted root directories complete.  They
@@ -159,6 +162,9 @@
       show_merge_revno methods. The latter had been deprecated since the 0.17
       release. (James Westby)
 
+    * ``LoopbackSFTP`` is now called ``SocketAsChannelAdapter``.
+      (Andrew Bennetts)
+
     * ``osutils.backup_file`` is removed. (Alexander Belchenko)
 
     * ``Repository.get_revision_graph`` is deprecated, with no replacement

=== modified file 'bzrlib/transport/sftp.py'
--- a/bzrlib/transport/sftp.py	2007-10-24 18:19:51 +0000
+++ b/bzrlib/transport/sftp.py	2008-04-10 09:16:39 +0000
@@ -1019,10 +1019,12 @@
             def close(self):
                 pass
 
-        server = paramiko.SFTPServer(FakeChannel(), 'sftp', StubServer(self), StubSFTPServer,
-                                     root=self._root, home=self._server_homedir)
+        server = paramiko.SFTPServer(
+            FakeChannel(), 'sftp', StubServer(self), StubSFTPServer,
+            root=self._root, home=self._server_homedir)
         try:
-            server.start_subsystem('sftp', None, sock)
+            server.start_subsystem(
+                'sftp', None, ssh.SocketAsChannelAdapter(sock))
         except socket.error, e:
             if (len(e.args) > 0) and (e.args[0] == errno.EPIPE):
                 # it's okay for the client to disconnect abruptly

=== modified file 'bzrlib/transport/ssh.py'
--- a/bzrlib/transport/ssh.py	2008-02-08 18:36:35 +0000
+++ b/bzrlib/transport/ssh.py	2008-04-10 09:16:39 +0000
@@ -172,19 +172,34 @@
     signal.signal(signal.SIGINT, signal.SIG_IGN)
 
 
-class LoopbackSFTP(object):
+class SocketAsChannelAdapter(object):
     """Simple wrapper for a socket that pretends to be a paramiko Channel."""
 
     def __init__(self, sock):
         self.__socket = sock
 
+    def get_name(self):
+        return "bzr SocketAsChannelAdapter"
+    
     def send(self, data):
         return self.__socket.send(data)
 
     def recv(self, n):
-        return self.__socket.recv(n)
+        try:
+            return self.__socket.recv(n)
+        except socket.error, e:
+            if e.args[0] in (errno.EPIPE, errno.ECONNRESET, errno.ECONNABORTED,
+                             errno.EBADF):
+                # Connection has closed.  Paramiko expects an empty string in
+                # this case, not an exception.
+                return ''
+            raise
 
     def recv_ready(self):
+        # TODO: jam 20051215 this function is necessary to support the
+        # pipelined() function. In reality, it probably should use
+        # poll() or select() to actually return if there is data
+        # available, otherwise we probably don't get any benefit
         return True
 
     def close(self):
@@ -237,7 +252,7 @@
             sock.connect((host, port))
         except socket.error, e:
             self._raise_connection_error(host, port=port, orig_error=e)
-        return SFTPClient(LoopbackSFTP(sock))
+        return SFTPClient(SocketAsChannelAdapter(sock))
 
 register_ssh_vendor('loopback', LoopbackVendor())
 
@@ -347,7 +362,7 @@
             argv = self._get_vendor_specific_argv(username, host, port,
                                                   subsystem='sftp')
             sock = self._connect(argv)
-            return SFTPClient(sock)
+            return SFTPClient(SocketAsChannelAdapter(sock))
         except _sftp_connection_errors, e:
             self._raise_connection_error(host, port=port, orig_error=e)
         except (OSError, IOError), e:
@@ -601,13 +616,6 @@
     def send(self, data):
         return os.write(self.proc.stdin.fileno(), data)
 
-    def recv_ready(self):
-        # TODO: jam 20051215 this function is necessary to support the
-        # pipelined() function. In reality, it probably should use
-        # poll() or select() to actually return if there is data
-        # available, otherwise we probably don't get any benefit
-        return True
-
     def recv(self, count):
         return os.read(self.proc.stdout.fileno(), count)
 




More information about the bazaar-commits mailing list