~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/transport/sftp.py

  • Committer: John Arbash Meinel
  • Date: 2006-11-10 15:38:16 UTC
  • mto: This revision was merged to the branch mainline in revision 2129.
  • Revision ID: john@arbash-meinel.com-20061110153816-46acf76fc86a512b
use try/finally to clean up a nested progress bar during weave fetching

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
# Copyright (C) 2005 Robey Pointer <robey@lag.net>
2
 
# Copyright (C) 2005, 2006, 2007 Canonical Ltd
 
2
# Copyright (C) 2005, 2006 Canonical Ltd
3
3
#
4
4
# This program is free software; you can redistribute it and/or modify
5
5
# it under the terms of the GNU General Public License as published by
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,
393
392
                f.prefetch()
394
393
            return f
395
394
        except (IOError, paramiko.SSHException), e:
396
 
            self._translate_io_exception(e, path, ': error retrieving',
397
 
                failure_exc=errors.ReadError)
 
395
            self._translate_io_exception(e, path, ': error retrieving')
398
396
 
399
397
    def readv(self, relpath, offsets):
400
398
        """See Transport.readv()"""
683
681
        """Create a directory at the given path."""
684
682
        self._mkdir(self._remote_path(relpath), mode=mode)
685
683
 
686
 
    def _translate_io_exception(self, e, path, more_info='',
 
684
    def _translate_io_exception(self, e, path, more_info='', 
687
685
                                failure_exc=PathError):
688
686
        """Translate a paramiko or IOError into a friendlier exception.
689
687
 
764
762
        except (IOError, paramiko.SSHException), e:
765
763
            self._translate_io_exception(e, path, ': unable to delete')
766
764
            
767
 
    def external_url(self):
768
 
        """See bzrlib.transport.Transport.external_url."""
769
 
        # the external path for SFTP is the base
770
 
        return self.base
771
 
 
772
765
    def listable(self):
773
766
        """Return True if this store supports listing."""
774
767
        return True
1075
1068
        ssh_server.start_server(event, server)
1076
1069
        event.wait(5.0)
1077
1070
    
1078
 
    def setUp(self, backing_server=None):
1079
 
        # XXX: TODO: make sftpserver back onto backing_server rather than local
1080
 
        # disk.
1081
 
        assert (backing_server is None or
1082
 
                isinstance(backing_server, local.LocalURLServer)), (
1083
 
            "backing_server should not be %r, because this can only serve the "
1084
 
            "local current working directory." % (backing_server,))
1085
 
        self._original_vendor = ssh._ssh_vendor_manager._cached_ssh_vendor
1086
 
        ssh._ssh_vendor_manager._cached_ssh_vendor = self._vendor
 
1071
    def setUp(self):
 
1072
        self._original_vendor = ssh._ssh_vendor
 
1073
        ssh._ssh_vendor = self._vendor
1087
1074
        if sys.platform == 'win32':
1088
1075
            # Win32 needs to use the UNICODE api
1089
1076
            self._homedir = getcwd()
1102
1089
    def tearDown(self):
1103
1090
        """See bzrlib.transport.Server.tearDown."""
1104
1091
        self._listener.stop()
1105
 
        ssh._ssh_vendor_manager._cached_ssh_vendor = self._original_vendor
 
1092
        ssh._ssh_vendor = self._original_vendor
1106
1093
 
1107
1094
    def get_bogus_url(self):
1108
1095
        """See bzrlib.transport.Server.get_bogus_url."""
1119
1106
 
1120
1107
    def get_url(self):
1121
1108
        """See bzrlib.transport.Server.get_url."""
1122
 
        homedir = self._homedir
1123
 
        if sys.platform != 'win32':
1124
 
            # Remove the initial '/' on all platforms but win32
1125
 
            homedir = homedir[1:]
1126
 
        return self._get_sftp_url(urlutils.escape(homedir))
 
1109
        return self._get_sftp_url(urlutils.escape(self._homedir[1:]))
1127
1110
 
1128
1111
 
1129
1112
class SFTPServerWithoutSSH(SFTPServer):
1161
1144
            else:
1162
1145
                raise
1163
1146
        except Exception, e:
1164
 
            # This typically seems to happen during interpreter shutdown, so
1165
 
            # most of the useful ways to report this error are won't work.
1166
 
            # Writing the exception type, and then the text of the exception,
1167
 
            # seems to be the best we can do.
1168
 
            import sys
1169
 
            sys.stderr.write('\nEXCEPTION %r: ' % (e.__class__,))
1170
 
            sys.stderr.write('%s\n\n' % (e,))
 
1147
            import sys; sys.stderr.write('\nEXCEPTION %r\n\n' % e.__class__)
1171
1148
        server.finish_subsystem()
1172
1149
 
1173
1150
 
1176
1153
 
1177
1154
    def get_url(self):
1178
1155
        """See bzrlib.transport.Server.get_url."""
1179
 
        homedir = self._homedir
1180
 
        if sys.platform != 'win32':
1181
 
            # Remove the initial '/' on all platforms but win32
1182
 
            homedir = homedir[1:]
1183
 
        return self._get_sftp_url(urlutils.escape(homedir))
 
1156
        if sys.platform == 'win32':
 
1157
            return self._get_sftp_url(urlutils.escape(self._homedir))
 
1158
        else:
 
1159
            return self._get_sftp_url(urlutils.escape(self._homedir[1:]))
1184
1160
 
1185
1161
 
1186
1162
class SFTPHomeDirServer(SFTPServerWithoutSSH):
1192
1168
 
1193
1169
 
1194
1170
class SFTPSiblingAbsoluteServer(SFTPAbsoluteServer):
1195
 
    """A test server for sftp transports where only absolute paths will work.
1196
 
 
1197
 
    It does this by serving from a deeply-nested directory that doesn't exist.
1198
 
    """
1199
 
 
1200
 
    def setUp(self, backing_server=None):
 
1171
    """A test servere for sftp transports, using absolute urls to non-home."""
 
1172
 
 
1173
    def setUp(self):
1201
1174
        self._server_homedir = '/dev/noone/runs/tests/here'
1202
 
        super(SFTPSiblingAbsoluteServer, self).setUp(backing_server)
 
1175
        super(SFTPSiblingAbsoluteServer, self).setUp()
1203
1176
 
1204
1177
 
1205
1178
def _sftp_connect(host, port, username, password):