~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/transport/sftp.py

  • Committer: Canonical.com Patch Queue Manager
  • Date: 2007-04-17 00:59:30 UTC
  • mfrom: (1551.15.4 Aaron's mergeable stuff)
  • Revision ID: pqm@pqm.ubuntu.com-20070417005930-rofskshyjsfzrahh
Fix ftp transport with servers that don't support atomic rename

Show diffs side-by-side

added added

removed removed

Lines of Context:
50
50
from bzrlib.osutils import pathjoin, fancy_rename, getcwd
51
51
from bzrlib.trace import mutter, warning
52
52
from bzrlib.transport import (
53
 
    local,
54
53
    register_urlparse_netloc_protocol,
55
54
    Server,
56
55
    split_url,
57
56
    ssh,
58
57
    Transport,
59
58
    )
 
59
from bzrlib.transport.local import LocalURLServer
60
60
 
61
61
try:
62
62
    import paramiko
393
393
                f.prefetch()
394
394
            return f
395
395
        except (IOError, paramiko.SSHException), e:
396
 
            self._translate_io_exception(e, path, ': error retrieving',
397
 
                failure_exc=errors.ReadError)
 
396
            self._translate_io_exception(e, path, ': error retrieving')
398
397
 
399
398
    def readv(self, relpath, offsets):
400
399
        """See Transport.readv()"""
683
682
        """Create a directory at the given path."""
684
683
        self._mkdir(self._remote_path(relpath), mode=mode)
685
684
 
686
 
    def _translate_io_exception(self, e, path, more_info='',
 
685
    def _translate_io_exception(self, e, path, more_info='', 
687
686
                                failure_exc=PathError):
688
687
        """Translate a paramiko or IOError into a friendlier exception.
689
688
 
1070
1069
        ssh_server.start_server(event, server)
1071
1070
        event.wait(5.0)
1072
1071
    
1073
 
    def setUp(self, backing_server=None):
1074
 
        # XXX: TODO: make sftpserver back onto backing_server rather than local
1075
 
        # disk.
1076
 
        assert (backing_server is None or
1077
 
                isinstance(backing_server, local.LocalURLServer)), (
1078
 
            "backing_server should not be %r, because this can only serve the "
1079
 
            "local current working directory." % (backing_server,))
 
1072
    def setUp(self, vfs_server=None):
 
1073
        # XXX: TODO: make sftpserver back onto vfs_server rather than local disk.
 
1074
        assert vfs_server is None or isinstance(vfs_server, LocalURLServer), \
 
1075
            "SFTPServer currently assumes local transport, got %s" % vfs_server
1080
1076
        self._original_vendor = ssh._ssh_vendor_manager._cached_ssh_vendor
1081
1077
        ssh._ssh_vendor_manager._cached_ssh_vendor = self._vendor
1082
1078
        if sys.platform == 'win32':
1156
1152
            else:
1157
1153
                raise
1158
1154
        except Exception, e:
1159
 
            # This typically seems to happen during interpreter shutdown, so
1160
 
            # most of the useful ways to report this error are won't work.
1161
 
            # Writing the exception type, and then the text of the exception,
1162
 
            # seems to be the best we can do.
1163
 
            import sys
1164
 
            sys.stderr.write('\nEXCEPTION %r: ' % (e.__class__,))
1165
 
            sys.stderr.write('%s\n\n' % (e,))
 
1155
            import sys; sys.stderr.write('\nEXCEPTION %r\n\n' % e.__class__)
1166
1156
        server.finish_subsystem()
1167
1157
 
1168
1158
 
1187
1177
 
1188
1178
 
1189
1179
class SFTPSiblingAbsoluteServer(SFTPAbsoluteServer):
1190
 
    """A test server for sftp transports where only absolute paths will work.
1191
 
 
1192
 
    It does this by serving from a deeply-nested directory that doesn't exist.
1193
 
    """
1194
 
 
1195
 
    def setUp(self, backing_server=None):
 
1180
    """A test servere for sftp transports, using absolute urls to non-home."""
 
1181
 
 
1182
    def setUp(self):
1196
1183
        self._server_homedir = '/dev/noone/runs/tests/here'
1197
 
        super(SFTPSiblingAbsoluteServer, self).setUp(backing_server)
 
1184
        super(SFTPSiblingAbsoluteServer, self).setUp()
1198
1185
 
1199
1186
 
1200
1187
def _sftp_connect(host, port, username, password):