~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/transport/sftp.py

  • Committer: Andrew Bennetts
  • Date: 2009-07-27 05:35:00 UTC
  • mfrom: (4570 +trunk)
  • mto: (4634.6.29 2.0)
  • mto: This revision was merged to the branch mainline in revision 4680.
  • Revision ID: andrew.bennetts@canonical.com-20090727053500-q76zsn2dx33jhmj5
Merge bzr.dev.

Show diffs side-by-side

added added

removed removed

Lines of Context:
12
12
#
13
13
# You should have received a copy of the GNU General Public License
14
14
# along with this program; if not, write to the Free Software
15
 
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
16
16
 
17
17
"""Implementation of Transport over SFTP, using paramiko."""
18
18
 
406
406
        """
407
407
        try:
408
408
            self._get_sftp().stat(self._remote_path(relpath))
 
409
            # stat result is about 20 bytes, let's say
 
410
            self._report_activity(20, 'read')
409
411
            return True
410
412
        except IOError:
411
413
            return False
416
418
        :param relpath: The relative path to the file
417
419
        """
418
420
        try:
 
421
            # FIXME: by returning the file directly, we don't pass this
 
422
            # through to report_activity.  We could try wrapping the object
 
423
            # before it's returned.  For readv and get_bytes it's handled in
 
424
            # the higher-level function.
 
425
            # -- mbp 20090126
419
426
            path = self._remote_path(relpath)
420
427
            f = self._get_sftp().file(path, mode='rb')
421
428
            if self._do_prefetch and (getattr(f, 'prefetch', None) is not None):
612
619
 
613
620
    def iter_files_recursive(self):
614
621
        """Walk the relative paths of all files in this transport."""
 
622
        # progress is handled by list_dir
615
623
        queue = list(self.list_dir('.'))
616
624
        while queue:
617
625
            relpath = queue.pop(0)
628
636
        else:
629
637
            local_mode = mode
630
638
        try:
 
639
            self._report_activity(len(abspath), 'write')
631
640
            self._get_sftp().mkdir(abspath, local_mode)
 
641
            self._report_activity(1, 'read')
632
642
            if mode is not None:
633
643
                # chmod a dir through sftp will erase any sgid bit set
634
644
                # on the server side.  So, if the bit mode are already
701
711
            # strange but true, for the paramiko server.
702
712
            if (e.args == ('Failure',)):
703
713
                raise failure_exc(path, str(e) + more_info)
 
714
            # Can be something like args = ('Directory not empty:
 
715
            # '/srv/bazaar.launchpad.net/blah...: '
 
716
            # [Errno 39] Directory not empty',)
 
717
            if (e.args[0].startswith('Directory not empty: ')
 
718
                or getattr(e, 'errno', None) == errno.ENOTEMPTY):
 
719
                raise errors.DirectoryNotEmpty(path, str(e))
704
720
            mutter('Raising exception with args %s', e.args)
705
721
        if getattr(e, 'errno', None) is not None:
706
722
            mutter('Raising exception with errno %s', e.errno)
779
795
        path = self._remote_path(relpath)
780
796
        try:
781
797
            entries = self._get_sftp().listdir(path)
 
798
            self._report_activity(sum(map(len, entries)), 'read')
782
799
        except (IOError, paramiko.SSHException), e:
783
800
            self._translate_io_exception(e, path, ': failed to list_dir')
784
801
        return [urlutils.escape(entry) for entry in entries]