~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/transport/sftp.py

  • Committer: Andrew Bennetts
  • Date: 2007-08-30 08:11:54 UTC
  • mfrom: (2766 +trunk)
  • mto: (2535.3.55 repo-refactor)
  • mto: This revision was merged to the branch mainline in revision 2772.
  • Revision ID: andrew.bennetts@canonical.com-20070830081154-16hebp2xwr15x2hc
Merge from bzr.dev.

Show diffs side-by-side

added added

removed removed

Lines of Context:
34
34
import time
35
35
import urllib
36
36
import urlparse
 
37
import warnings
37
38
 
38
39
from bzrlib import (
39
40
    errors,
53
54
        )
54
55
from bzrlib.trace import mutter, warning
55
56
from bzrlib.transport import (
 
57
    FileFileStream,
 
58
    _file_streams,
56
59
    local,
57
60
    register_urlparse_netloc_protocol,
58
61
    Server,
60
63
    ConnectedTransport,
61
64
    )
62
65
 
 
66
# Disable one particular warning that comes from paramiko in Python2.5; if
 
67
# this is emitted at the wrong time it tends to cause spurious test failures
 
68
# or at least noise in the test case::
 
69
#
 
70
# [1770/7639 in 86s, 1 known failures, 50 skipped, 2 missing features]
 
71
# test_permissions.TestSftpPermissions.test_new_files
 
72
# /var/lib/python-support/python2.5/paramiko/message.py:226: DeprecationWarning: integer argument expected, got float
 
73
#  self.packet.write(struct.pack('>I', n))
 
74
warnings.filterwarnings('ignore',
 
75
        'integer argument expected, got float',
 
76
        category=DeprecationWarning,
 
77
        module='paramiko.message')
 
78
 
63
79
try:
64
80
    import paramiko
65
81
except ImportError, e:
205
221
            self._set_connection(connection, credentials)
206
222
        return connection
207
223
 
208
 
 
209
 
    def should_cache(self):
210
 
        """
211
 
        Return True if the data pulled across should be cached locally.
212
 
        """
213
 
        return True
214
 
 
215
224
    def has(self, relpath):
216
225
        """
217
226
        Does the target location exist?
257
266
        except (IOError, paramiko.SSHException), e:
258
267
            self._translate_io_exception(e, path, ': error retrieving')
259
268
 
 
269
    def recommended_page_size(self):
 
270
        """See Transport.recommended_page_size().
 
271
 
 
272
        For SFTP we suggest a large page size to reduce the overhead
 
273
        introduced by latency.
 
274
        """
 
275
        return 64 * 1024
 
276
 
260
277
    def _sftp_readv(self, fp, offsets, relpath='<unknown>'):
261
278
        """Use the readv() member of fp to do async readv.
262
279
 
525
542
        """Create a directory at the given path."""
526
543
        self._mkdir(self._remote_path(relpath), mode=mode)
527
544
 
 
545
    def open_write_stream(self, relpath, mode=None):
 
546
        """See Transport.open_write_stream."""
 
547
        # initialise the file to zero-length
 
548
        # this is three round trips, but we don't use this 
 
549
        # api more than once per write_group at the moment so 
 
550
        # it is a tolerable overhead. Better would be to truncate
 
551
        # the file after opening. RBC 20070805
 
552
        self.put_bytes_non_atomic(relpath, "", mode)
 
553
        abspath = self._remote_path(relpath)
 
554
        # TODO: jam 20060816 paramiko doesn't publicly expose a way to
 
555
        #       set the file mode at create time. If it does, use it.
 
556
        #       But for now, we just chmod later anyway.
 
557
        handle = None
 
558
        try:
 
559
            handle = self._get_sftp().file(abspath, mode='wb')
 
560
            handle.set_pipelined(True)
 
561
        except (paramiko.SSHException, IOError), e:
 
562
            self._translate_io_exception(e, abspath,
 
563
                                         ': unable to open')
 
564
        _file_streams[self.abspath(relpath)] = handle
 
565
        return FileFileStream(self, relpath, handle)
 
566
 
528
567
    def _translate_io_exception(self, e, path, more_info='',
529
568
                                failure_exc=PathError):
530
569
        """Translate a paramiko or IOError into a friendlier exception.