~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/transport/ftp/__init__.py

  • Committer: Robert Collins
  • Date: 2010-04-08 04:34:03 UTC
  • mfrom: (5138 +trunk)
  • mto: This revision was merged to the branch mainline in revision 5139.
  • Revision ID: robertc@robertcollins.net-20100408043403-56z0d07vdqrx7f3t
Update bugfix for 528114 to trunk.

Show diffs side-by-side

added added

removed removed

Lines of Context:
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
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 
16
 
16
17
"""Implementation of Transport over ftp.
17
18
 
18
19
Written by Daniel Silverstone <dsilvers@digital-scurf.org> with serious
163
164
        connection, credentials = self._create_connection(credentials)
164
165
        self._set_connection(connection, credentials)
165
166
 
166
 
    def _translate_perm_error(self, err, path, extra=None,
 
167
    def _translate_ftp_error(self, err, path, extra=None,
167
168
                              unknown_exc=FtpPathError):
168
 
        """Try to translate an ftplib.error_perm exception.
 
169
        """Try to translate an ftplib exception to a bzrlib exception.
169
170
 
170
171
        :param err: The error to translate into a bzr error
171
172
        :param path: The path which had problems
173
174
        :param unknown_exc: If None, we will just raise the original exception
174
175
                    otherwise we raise unknown_exc(path, extra=extra)
175
176
        """
 
177
        # ftp error numbers are very generic, like "451: Requested action aborted,
 
178
        # local error in processing" so unfortunately we have to match by
 
179
        # strings.
176
180
        s = str(err).lower()
177
181
        if not extra:
178
182
            extra = str(err)
189
193
            or (s.startswith('550 ') and 'unable to rename to' in extra)
190
194
            ):
191
195
            raise errors.NoSuchFile(path, extra=extra)
192
 
        if ('file exists' in s):
 
196
        elif ('file exists' in s):
193
197
            raise errors.FileExists(path, extra=extra)
194
 
        if ('not a directory' in s):
 
198
        elif ('not a directory' in s):
195
199
            raise errors.PathError(path, extra=extra)
 
200
        elif 'directory not empty' in s:
 
201
            raise errors.DirectoryNotEmpty(path, extra=extra)
196
202
 
197
203
        mutter('unable to understand error for path: %s: %s', path, err)
198
204
 
318
324
                    raise e
319
325
                raise
320
326
        except ftplib.error_perm, e:
321
 
            self._translate_perm_error(e, abspath, extra='could not store',
 
327
            self._translate_ftp_error(e, abspath, extra='could not store',
322
328
                                       unknown_exc=errors.NoSuchFile)
323
329
        except ftplib.error_temp, e:
324
330
            if retries > _number_of_retries:
347
353
            f.mkd(abspath)
348
354
            self._setmode(relpath, mode)
349
355
        except ftplib.error_perm, e:
350
 
            self._translate_perm_error(e, abspath,
 
356
            self._translate_ftp_error(e, abspath,
351
357
                unknown_exc=errors.FileExists)
352
358
 
353
359
    def open_write_stream(self, relpath, mode=None):
373
379
            f = self._get_FTP()
374
380
            f.rmd(abspath)
375
381
        except ftplib.error_perm, e:
376
 
            self._translate_perm_error(e, abspath, unknown_exc=errors.PathError)
 
382
            self._translate_ftp_error(e, abspath, unknown_exc=errors.PathError)
377
383
 
378
384
    def append_file(self, relpath, f, mode=None):
379
385
        """Append the text in the file-like object into the final
419
425
                self._has_append = False
420
426
                self._fallback_append(relpath, text, mode)
421
427
            else:
422
 
                self._translate_perm_error(e, abspath, extra='error appending',
 
428
                self._translate_ftp_error(e, abspath, extra='error appending',
423
429
                    unknown_exc=errors.NoSuchFile)
424
430
        except ftplib.error_temp, e:
425
431
            if retries > _number_of_retries:
472
478
    def _rename(self, abs_from, abs_to, f):
473
479
        try:
474
480
            f.rename(abs_from, abs_to)
475
 
        except ftplib.error_perm, e:
476
 
            self._translate_perm_error(e, abs_from,
 
481
        except (ftplib.error_temp, ftplib.error_perm), e:
 
482
            self._translate_ftp_error(e, abs_from,
477
483
                ': unable to rename to %r' % (abs_to))
478
484
 
479
485
    def move(self, rel_from, rel_to):
485
491
            f = self._get_FTP()
486
492
            self._rename_and_overwrite(abs_from, abs_to, f)
487
493
        except ftplib.error_perm, e:
488
 
            self._translate_perm_error(e, abs_from,
 
494
            self._translate_ftp_error(e, abs_from,
489
495
                extra='unable to rename to %r' % (rel_to,),
490
496
                unknown_exc=errors.PathError)
491
497
 
509
515
            mutter("FTP rm: %s", abspath)
510
516
            f.delete(abspath)
511
517
        except ftplib.error_perm, e:
512
 
            self._translate_perm_error(e, abspath, 'error deleting',
 
518
            self._translate_ftp_error(e, abspath, 'error deleting',
513
519
                unknown_exc=errors.NoSuchFile)
514
520
 
515
521
    def external_url(self):
530
536
            try:
531
537
                paths = f.nlst(basepath)
532
538
            except ftplib.error_perm, e:
533
 
                self._translate_perm_error(e, relpath,
 
539
                self._translate_ftp_error(e, relpath,
534
540
                                           extra='error with list_dir')
535
541
            except ftplib.error_temp, e:
536
542
                # xs4all's ftp server raises a 450 temp error when listing an
579
585
            f = self._get_FTP()
580
586
            return FtpStatResult(f, abspath)
581
587
        except ftplib.error_perm, e:
582
 
            self._translate_perm_error(e, abspath, extra='error w/ stat')
 
588
            self._translate_ftp_error(e, abspath, extra='error w/ stat')
583
589
 
584
590
    def lock_read(self, relpath):
585
591
        """Lock the given file for shared (read) access.