~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/transport/chroot.py

Fix ChrootTransportDecorator's clone to pass less surprising offsets to the decorated transport's clone.

Show diffs side-by-side

added added

removed removed

Lines of Context:
20
20
from urlparse import urlparse
21
21
 
22
22
from bzrlib import errors, urlutils
23
 
from bzrlib.osutils import pathjoin
24
23
from bzrlib.transport.decorator import TransportDecorator, DecoratorServer
25
24
 
26
25
 
28
27
    """A decorator that can convert any transport to be chrooted.
29
28
 
30
29
    This is requested via the 'chroot+' prefix to get_transport().
 
30
 
 
31
    :ivar chroot_url: the root of this chroot
 
32
    :ivar chroot_relative: this transport's location relative to the chroot
 
33
        root.  e.g. A chroot_relative of '/' means this location is the same as
 
34
        chroot_url.
31
35
    """
32
36
 
33
37
    def __init__(self, url, _decorated=None, chroot=None):
65
69
        # the new URL we want to clone to is
66
70
        # self.chroot_url + an adjusted self.chroot_relative, with the leading
67
71
        # / removed.
68
 
        newrelative = pathjoin(self.chroot_relative, offset)
69
 
        newabs = self.chroot_url + newrelative[1:]
70
 
        # now split to get a abspath without scheme
71
 
        parsed = urlparse(newabs)
72
 
        decorated_clone = self._decorated.clone(parsed[2])
73
 
        return ChrootTransportDecorator(self._get_url_prefix() + newabs,
 
72
        new_relpath = urlutils.joinpath(self.chroot_relative, offset)
 
73
        assert new_relpath.startswith('/')
 
74
        new_url = self.chroot_url + new_relpath[1:]
 
75
        # Clone the decorated transport according to this new path.
 
76
        assert new_url.startswith(self.chroot_url), (
 
77
            'new_url (%r) does not start with %r'
 
78
            % (new_url, self._decorated.base))
 
79
        path = urlutils.relative_url(self._decorated.base, new_url)
 
80
        decorated_clone = self._decorated.clone(path)
 
81
        return ChrootTransportDecorator(self._get_url_prefix() + new_url,
74
82
            decorated_clone, self.chroot_url)
75
83
 
76
84
    def delete(self, relpath):