~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/transport/__init__.py

[merge] john

Show diffs side-by-side

added added

removed removed

Lines of Context:
20
20
"""
21
21
 
22
22
from bzrlib.trace import mutter
23
 
from bzrlib.errors import (BzrError, 
24
 
    TransportError, TransportNotPossible, NonRelativePath,
25
 
    NoSuchFile, FileExists, PermissionDenied,
26
 
    ConnectionReset)
 
23
import bzrlib.errors as errors
 
24
import errno
27
25
 
28
26
_protocol_handlers = {
29
27
}
57
55
        super(Transport, self).__init__()
58
56
        self.base = base
59
57
 
 
58
    def _translate_error(self, e, path, raise_generic=True):
 
59
        """Translate an IOError or OSError into an appropriate bzr error.
 
60
 
 
61
        This handles things like ENOENT, ENOTDIR, EEXIST, and EACCESS
 
62
        """
 
63
        if hasattr(e, 'errno'):
 
64
            if e.errno in (errno.ENOENT, errno.ENOTDIR):
 
65
                raise errors.NoSuchFile(path, extra=e)
 
66
            if e.errno == errno.EEXIST:
 
67
                raise errors.FileExists(path, extra=e)
 
68
            if e.errno == errno.EACCES:
 
69
                raise errors.PermissionDenied(path, extra=e)
 
70
        if raise_generic:
 
71
            raise errors.TransportError(orig_error=e)
 
72
 
60
73
    def clone(self, offset=None):
61
74
        """Return a new Transport object, cloned from the current location,
62
75
        using a subdirectory or parent directory. This allows connections 
137
150
        start with our base, but still be a relpath once aliasing is 
138
151
        resolved.
139
152
        """
 
153
        # TODO: This might want to use bzrlib.osutils.relpath
 
154
        #       but we have to watch out because of the prefix issues
140
155
        if not abspath.startswith(self.base):
141
 
            raise NonRelativePath('path %r is not under base URL %r'
142
 
                           % (abspath, self.base))
 
156
            raise errors.PathNotChild(abspath, self.base)
143
157
        pl = len(self.base)
144
158
        return abspath[pl:].lstrip('/')
145
159
 
332
346
        WARNING: many transports do not support this, so trying avoid using
333
347
        it if at all possible.
334
348
        """
335
 
        raise TransportNotPossible("This transport has not "
336
 
                                   "implemented list_dir.")
 
349
        raise errors.TransportNotPossible("This transport has not "
 
350
                                          "implemented list_dir.")
337
351
 
338
352
    def lock_read(self, relpath):
339
353
        """Lock the given file for shared (read) access.