~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/transport/sftp.py

Merge bzr.dev

Show diffs side-by-side

added added

removed removed

Lines of Context:
493
493
        except (IOError, paramiko.SSHException), e:
494
494
            self._translate_io_exception(e, relpath, ': unable to append')
495
495
 
496
 
    def copy(self, rel_from, rel_to):
497
 
        """Copy the item at rel_from to the location at rel_to"""
498
 
        path_from = self._remote_path(rel_from)
499
 
        path_to = self._remote_path(rel_to)
500
 
        self._copy_abspaths(path_from, path_to)
501
 
 
502
 
    def _copy_abspaths(self, path_from, path_to, mode=None):
503
 
        """Copy files given an absolute path
504
 
 
505
 
        :param path_from: Path on remote server to read
506
 
        :param path_to: Path on remote server to write
507
 
        :return: None
508
 
 
509
 
        TODO: Should the destination location be atomically created?
510
 
              This has not been specified
511
 
        TODO: This should use some sort of remote copy, rather than
512
 
              pulling the data locally, and then writing it remotely
513
 
        """
514
 
        try:
515
 
            fin = self._sftp.file(path_from, 'rb')
516
 
            try:
517
 
                self._put(path_to, fin, mode=mode)
518
 
            finally:
519
 
                fin.close()
520
 
        except (IOError, paramiko.SSHException), e:
521
 
            self._translate_io_exception(e, path_from, ': unable copy to: %r' % path_to)
522
 
 
523
 
    def copy_to(self, relpaths, other, mode=None, pb=None):
524
 
        """Copy a set of entries from self into another Transport.
525
 
 
526
 
        :param relpaths: A list/generator of entries to be copied.
527
 
        """
528
 
        if isinstance(other, SFTPTransport) and other._sftp is self._sftp:
529
 
            # Both from & to are on the same remote filesystem
530
 
            # We can use a remote copy, instead of pulling locally, and pushing
531
 
 
532
 
            total = self._get_total(relpaths)
533
 
            count = 0
534
 
            for path in relpaths:
535
 
                path_from = self._remote_path(relpath)
536
 
                path_to = other._remote_path(relpath)
537
 
                self._update_pb(pb, 'copy-to', count, total)
538
 
                self._copy_abspaths(path_from, path_to, mode=mode)
539
 
                count += 1
540
 
            return count
541
 
        else:
542
 
            return super(SFTPTransport, self).copy_to(relpaths, other, mode=mode, pb=pb)
543
 
 
544
496
    def _rename(self, abs_from, abs_to):
545
497
        """Do a fancy rename on the remote server.
546
498
        
582
534
        except (IOError, paramiko.SSHException), e:
583
535
            self._translate_io_exception(e, path, ': failed to list_dir')
584
536
 
 
537
    def rmdir(self, relpath):
 
538
        """See Transport.rmdir."""
 
539
        path = self._remote_path(relpath)
 
540
        try:
 
541
            return self._sftp.rmdir(path)
 
542
        except (IOError, paramiko.SSHException), e:
 
543
            self._translate_io_exception(e, path, ': failed to rmdir')
 
544
 
585
545
    def stat(self, relpath):
586
546
        """Return the stat information for a file."""
587
547
        path = self._remote_path(relpath)