~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/transport/sftp.py

  • Committer: Robert Collins
  • Date: 2005-10-28 22:22:36 UTC
  • Revision ID: robertc@robertcollins.net-20051028222236-24a8086314b34613
Make the paramiko tests pass. Nice huh.

Show diffs side-by-side

added added

removed removed

Lines of Context:
16
16
 
17
17
"""Implementation of Transport over SFTP, using paramiko."""
18
18
 
 
19
import errno
19
20
import getpass
20
21
import os
21
22
import re
23
24
import sys
24
25
import urllib
25
26
 
26
 
from bzrlib.errors import TransportNotPossible, NoSuchFile, NonRelativePath, TransportError
 
27
from bzrlib.errors import (FileExists, 
 
28
                           TransportNotPossible, NoSuchFile, NonRelativePath,
 
29
                           TransportError)
27
30
from bzrlib.config import config_dir
28
31
from bzrlib.trace import mutter, warning, error
29
32
from bzrlib.transport import Transport, register_transport
206
209
        try:
207
210
            path = self._abspath(relpath)
208
211
            fout = self._sftp.file(path, 'wb')
 
212
        except IOError, e:
 
213
            self._translate_io_exception(e, relpath)
209
214
        except (IOError, paramiko.SSHException), x:
210
215
            raise SFTPTransportError('Unable to write file %r' % (path,), x)
211
216
        try:
230
235
        try:
231
236
            path = self._abspath(relpath)
232
237
            self._sftp.mkdir(path)
 
238
        except IOError, e:
 
239
            self._translate_io_exception(e, relpath)
233
240
        except (IOError, paramiko.SSHException), x:
234
241
            raise SFTPTransportError('Unable to mkdir %r' % (path,), x)
235
242
 
 
243
    def _translate_io_exception(self, e, relpath):
 
244
        # paramiko seems to generate detailless errors.
 
245
        if (e.errno == errno.ENOENT or
 
246
            e.args == ('No such file or directory',) or
 
247
            e.args == ('No such file',)):
 
248
            raise NoSuchFile(relpath)
 
249
        if (e.args == ('mkdir failed',)):
 
250
            raise FileExists(relpath)
 
251
        # strange but true, for the paramiko server.
 
252
        if (e.args == ('Failure',)):
 
253
            raise FileExists(relpath)
 
254
        raise
 
255
 
236
256
    def append(self, relpath, f):
237
257
        """
238
258
        Append the text in the file-like object into the final