~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/transport/ftp.py

Merge from integration.

Show diffs side-by-side

added added

removed removed

Lines of Context:
26
26
 
27
27
from bzrlib.transport import Transport
28
28
 
29
 
from bzrlib.errors import (TransportNotPossible, NoSuchFile, 
30
 
                           NonRelativePath, TransportError, ConnectionError)
 
29
from bzrlib.errors import (TransportNotPossible, TransportError,
 
30
                           NoSuchFile, FileExists)
31
31
 
32
32
import os, errno
33
33
from cStringIO import StringIO
36
36
import urllib
37
37
import stat
38
38
 
39
 
from bzrlib.errors import BzrError, BzrCheckError
40
39
from bzrlib.branch import Branch
41
40
from bzrlib.trace import mutter
42
41
 
43
42
 
44
 
class FtpTransportError(TransportError):
45
 
    pass
46
 
 
47
 
 
48
43
class FtpStatResult(object):
49
44
    def __init__(self, f, relpath):
50
45
        try:
94
89
            self._FTP_instance.set_pasv(not self.is_active)
95
90
            return self._FTP_instance
96
91
        except ftplib.error_perm, e:
97
 
            raise FtpTransportError(msg="Error setting up connection: %s"
 
92
            raise TransportError(msg="Error setting up connection: %s"
98
93
                                    % str(e), orig_error=e)
99
94
 
100
95
    def should_cache(self):
182
177
            ret.seek(0)
183
178
            return ret
184
179
        except ftplib.error_perm, e:
185
 
            raise NoSuchFile(msg="Error retrieving %s: %s"
186
 
                             % (self.abspath(relpath), str(e)),
187
 
                             orig_error=e)
 
180
            raise NoSuchFile(self.abspath(relpath), extra=extra)
188
181
 
189
 
    def put(self, relpath, fp):
 
182
    def put(self, relpath, fp, mode=None):
190
183
        """Copy the file-like or string object into the location.
191
184
 
192
185
        :param relpath: Location to put the contents, relative to base.
193
186
        :param f:       File-like or string object.
 
187
        TODO: jam 20051215 This should be an atomic put, not overwritting files in place
 
188
        TODO: jam 20051215 ftp as a protocol seems to support chmod, but ftplib does not
194
189
        """
195
190
        if not hasattr(fp, 'read'):
196
191
            fp = StringIO(fp)
199
194
            f = self._get_FTP()
200
195
            f.storbinary('STOR '+self._abspath(relpath), fp, 8192)
201
196
        except ftplib.error_perm, e:
202
 
            raise FtpTransportError(orig_error=e)
 
197
            raise TransportError(orig_error=e)
203
198
 
204
 
    def mkdir(self, relpath):
 
199
    def mkdir(self, relpath, mode=None):
205
200
        """Create a directory at the given path."""
206
201
        try:
207
202
            mutter("FTP mkd: %s" % self._abspath(relpath))
211
206
            except ftplib.error_perm, e:
212
207
                s = str(e)
213
208
                if 'File exists' in s:
214
 
                    # Swallow attempts to mkdir something which is already
215
 
                    # present. Hopefully this will shush some errors.
216
 
                    return
 
209
                    raise FileExists(self.abspath(relpath), extra=s)
217
210
                else:
218
211
                    raise
219
212
        except ftplib.error_perm, e:
220
 
            raise FtpTransportError(orig_error=e)
 
213
            raise TransportError(orig_error=e)
221
214
 
222
215
    def append(self, relpath, f):
223
216
        """Append the text in the file-like object into the final
237
230
            f = self._get_FTP()
238
231
            f.rename(self._abspath(rel_from), self._abspath(rel_to))
239
232
        except ftplib.error_perm, e:
240
 
            raise FtpTransportError(orig_error=e)
 
233
            raise TransportError(orig_error=e)
241
234
 
242
235
    def delete(self, relpath):
243
236
        """Delete the item at relpath"""
246
239
            f = self._get_FTP()
247
240
            f.delete(self._abspath(relpath))
248
241
        except ftplib.error_perm, e:
249
 
            raise FtpTransportError(orig_error=e)
 
242
            raise TransportError(orig_error=e)
250
243
 
251
244
    def listable(self):
252
245
        """See Transport.listable."""
264
257
            # Remove . and .. if present, and return
265
258
            return [path for path in stripped if path not in (".", "..")]
266
259
        except ftplib.error_perm, e:
267
 
            raise FtpTransportError(orig_error=e)
 
260
            raise TransportError(orig_error=e)
268
261
 
269
262
    def iter_files_recursive(self):
270
263
        """See Transport.iter_files_recursive.
289
282
            f = self._get_FTP()
290
283
            return FtpStatResult(f, self._abspath(relpath))
291
284
        except ftplib.error_perm, e:
292
 
            raise FtpTransportError(orig_error=e)
 
285
            raise TransportError(orig_error=e)
293
286
 
294
287
    def lock_read(self, relpath):
295
288
        """Lock the given file for shared (read) access.