~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: 2009-01-15 07:34:16 UTC
  • mfrom: (3882.7.17 progress)
  • Revision ID: pqm@pqm.ubuntu.com-20090115073416-vnzvkab4dfesetj0
(mbp) transport-based progress bars

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2005 Robey Pointer <robey@lag.net>
2
 
# Copyright (C) 2005, 2006, 2007 Canonical Ltd
 
1
# Copyright (C) 2005, 2006, 2007, 2008, 2009 Canonical Ltd
3
2
#
4
3
# This program is free software; you can redistribute it and/or modify
5
4
# it under the terms of the GNU General Public License as published by
140
139
    # See _get_requests for an explanation.
141
140
    _max_request_size = 32768
142
141
 
143
 
    def __init__(self, original_offsets, relpath):
 
142
    def __init__(self, original_offsets, relpath, _report_activity):
144
143
        """Create a new readv helper.
145
144
 
146
145
        :param original_offsets: The original requests given by the caller of
147
146
            readv()
148
147
        :param relpath: The name of the file (if known)
 
148
        :param _report_activity: A Transport._report_activity bound method,
 
149
            to be called as data arrives.
149
150
        """
150
151
        self.original_offsets = list(original_offsets)
151
152
        self.relpath = relpath
 
153
        self._report_activity = _report_activity
152
154
 
153
155
    def _get_requests(self):
154
156
        """Break up the offsets into individual requests over sftp.
219
221
            if len(data) != length:
220
222
                raise errors.ShortReadvError(self.relpath,
221
223
                    start, length, len(data))
 
224
            self._report_activity(length, 'read')
222
225
            if last_end is None:
223
226
                # This is the first request, just buffer it
224
227
                buffered_data = [data]
405
408
            return False
406
409
 
407
410
    def get(self, relpath):
408
 
        """
409
 
        Get the file at the given relative path.
 
411
        """Get the file at the given relative path.
410
412
 
411
413
        :param relpath: The relative path to the file
412
414
        """
420
422
            self._translate_io_exception(e, path, ': error retrieving',
421
423
                failure_exc=errors.ReadError)
422
424
 
 
425
    def get_bytes(self, relpath):
 
426
        # reimplement this here so that we can report how many bytes came back
 
427
        f = self.get(relpath)
 
428
        try:
 
429
            bytes = f.read()
 
430
            self._report_activity(len(bytes), 'read')
 
431
            return bytes
 
432
        finally:
 
433
            f.close()
 
434
 
423
435
    def _readv(self, relpath, offsets):
424
436
        """See Transport.readv()"""
425
437
        # We overload the default readv() because we want to use a file
454
466
        does not support ranges > 64K, so it caps the request size, and
455
467
        just reads until it gets all the stuff it wants
456
468
        """
457
 
        helper = _SFTPReadvHelper(offsets, relpath)
 
469
        helper = _SFTPReadvHelper(offsets, relpath, self._report_activity)
458
470
        return helper.request_and_yield_offsets(fp)
459
471
 
460
472
    def put_file(self, relpath, f, mode=None):