~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/transport/sftp.py

  • Committer: John Arbash Meinel
  • Date: 2009-02-23 15:29:35 UTC
  • mfrom: (3943.7.7 bzr.code_style_cleanup)
  • mto: This revision was merged to the branch mainline in revision 4033.
  • Revision ID: john@arbash-meinel.com-20090223152935-oel9m92mwcc6nb4h
Merge the removal of all trailing whitespace, and resolve conflicts.

Show diffs side-by-side

added added

removed removed

Lines of Context:
96
96
 
97
97
class SFTPLock(object):
98
98
    """This fakes a lock in a remote location.
99
 
    
 
99
 
100
100
    A present lock is indicated just by the existence of a file.  This
101
 
    doesn't work well on all transports and they are only used in 
 
101
    doesn't work well on all transports and they are only used in
102
102
    deprecated storage formats.
103
103
    """
104
 
    
 
104
 
105
105
    __slots__ = ['path', 'lock_path', 'lock_file', 'transport']
106
106
 
107
107
    def __init__(self, path, transport):
349
349
 
350
350
    def _remote_path(self, relpath):
351
351
        """Return the path to be passed along the sftp protocol for relpath.
352
 
        
 
352
 
353
353
        :param relpath: is a urlencoded string.
354
354
        """
355
355
        relative = urlutils.unescape(relpath).encode('utf-8')
502
502
            #      sticky bit. So it is probably best to stop chmodding, and
503
503
            #      just tell users that they need to set the umask correctly.
504
504
            #      The attr.st_mode = mode, in _sftp_open_exclusive
505
 
            #      will handle when the user wants the final mode to be more 
506
 
            #      restrictive. And then we avoid a round trip. Unless 
 
505
            #      will handle when the user wants the final mode to be more
 
506
            #      restrictive. And then we avoid a round trip. Unless
507
507
            #      paramiko decides to expose an async chmod()
508
508
 
509
509
            # This is designed to chmod() right before we close.
510
 
            # Because we set_pipelined() earlier, theoretically we might 
 
510
            # Because we set_pipelined() earlier, theoretically we might
511
511
            # avoid the round trip for fout.close()
512
512
            if mode is not None:
513
513
                self._get_sftp().chmod(tmp_abspath, mode)
555
555
                                                 ': unable to open')
556
556
 
557
557
                # This is designed to chmod() right before we close.
558
 
                # Because we set_pipelined() earlier, theoretically we might 
 
558
                # Because we set_pipelined() earlier, theoretically we might
559
559
                # avoid the round trip for fout.close()
560
560
                if mode is not None:
561
561
                    self._get_sftp().chmod(abspath, mode)
656
656
    def open_write_stream(self, relpath, mode=None):
657
657
        """See Transport.open_write_stream."""
658
658
        # initialise the file to zero-length
659
 
        # this is three round trips, but we don't use this 
660
 
        # api more than once per write_group at the moment so 
 
659
        # this is three round trips, but we don't use this
 
660
        # api more than once per write_group at the moment so
661
661
        # it is a tolerable overhead. Better would be to truncate
662
662
        # the file after opening. RBC 20070805
663
663
        self.put_bytes_non_atomic(relpath, "", mode)
686
686
        :param failure_exc: Paramiko has the super fun ability to raise completely
687
687
                           opaque errors that just set "e.args = ('Failure',)" with
688
688
                           no more information.
689
 
                           If this parameter is set, it defines the exception 
 
689
                           If this parameter is set, it defines the exception
690
690
                           to raise in these cases.
691
691
        """
692
692
        # paramiko seems to generate detailless errors.
733
733
 
734
734
    def _rename_and_overwrite(self, abs_from, abs_to):
735
735
        """Do a fancy rename on the remote server.
736
 
        
 
736
 
737
737
        Using the implementation provided by osutils.
738
738
        """
739
739
        try:
758
758
            self._get_sftp().remove(path)
759
759
        except (IOError, paramiko.SSHException), e:
760
760
            self._translate_io_exception(e, path, ': unable to delete')
761
 
            
 
761
 
762
762
    def external_url(self):
763
763
        """See bzrlib.transport.Transport.external_url."""
764
764
        # the external path for SFTP is the base
841
841
        """
842
842
        # TODO: jam 20060816 Paramiko >= 1.6.2 (probably earlier) supports
843
843
        #       using the 'x' flag to indicate SFTP_FLAG_EXCL.
844
 
        #       However, there is no way to set the permission mode at open 
 
844
        #       However, there is no way to set the permission mode at open
845
845
        #       time using the sftp_client.file() functionality.
846
846
        path = self._get_sftp()._adjust_cwd(abspath)
847
847
        # mutter('sftp abspath %s => %s', abspath, path)
848
848
        attr = SFTPAttributes()
849
849
        if mode is not None:
850
850
            attr.st_mode = mode
851
 
        omode = (SFTP_FLAG_WRITE | SFTP_FLAG_CREATE 
 
851
        omode = (SFTP_FLAG_WRITE | SFTP_FLAG_CREATE
852
852
                | SFTP_FLAG_TRUNC | SFTP_FLAG_EXCL)
853
853
        try:
854
854
            t, msg = self._get_sftp()._request(CMD_OPEN, path, omode, attr)
932
932
                # probably a failed test; unit test thread will log the
933
933
                # failure/error
934
934
                sys.excepthook(*sys.exc_info())
935
 
                warning('Exception from within unit test server thread: %r' % 
 
935
                warning('Exception from within unit test server thread: %r' %
936
936
                        x)
937
937
 
938
938
 
949
949
 
950
950
    Not all methods are implemented, this is deliberate as this class is not a
951
951
    replacement for the builtin sockets layer. fileno is not implemented to
952
 
    prevent the proxy being bypassed. 
 
952
    prevent the proxy being bypassed.
953
953
    """
954
954
 
955
955
    simulated_time = 0
957
957
        "close", "getpeername", "getsockname", "getsockopt", "gettimeout",
958
958
        "setblocking", "setsockopt", "settimeout", "shutdown"])
959
959
 
960
 
    def __init__(self, sock, latency, bandwidth=1.0, 
 
960
    def __init__(self, sock, latency, bandwidth=1.0,
961
961
                 really_sleep=True):
962
 
        """ 
 
962
        """
963
963
        :param bandwith: simulated bandwith (MegaBit)
964
964
        :param really_sleep: If set to false, the SocketDelay will just
965
965
        increase a counter, instead of calling time.sleep. This is useful for
968
968
        self.sock = sock
969
969
        self.latency = latency
970
970
        self.really_sleep = really_sleep
971
 
        self.time_per_byte = 1 / (bandwidth / 8.0 * 1024 * 1024) 
 
971
        self.time_per_byte = 1 / (bandwidth / 8.0 * 1024 * 1024)
972
972
        self.new_roundtrip = False
973
973
 
974
974
    def sleep(self, s):
1036
1036
 
1037
1037
    def _run_server_entry(self, sock):
1038
1038
        """Entry point for all implementations of _run_server.
1039
 
        
 
1039
 
1040
1040
        If self.add_latency is > 0.000001 then sock is given a latency adding
1041
1041
        decorator.
1042
1042
        """
1059
1059
        event = threading.Event()
1060
1060
        ssh_server.start_server(event, server)
1061
1061
        event.wait(5.0)
1062
 
    
 
1062
 
1063
1063
    def setUp(self, backing_server=None):
1064
1064
        # XXX: TODO: make sftpserver back onto backing_server rather than local
1065
1065
        # disk.