~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/errors.py

  • Committer: v.ladeuil+lp at free
  • Date: 2007-02-04 17:41:12 UTC
  • mto: (2323.7.1 redirection)
  • mto: This revision was merged to the branch mainline in revision 2390.
  • Revision ID: v.ladeuil+lp@free.fr-20070204174112-iv6gxzinnjddlaxj
Add tests for redirection. Preserve transport decorations.

* bzrlib/tests/test_http.py:
(TestRedirections): new tests.

* bzrlib/tests/HttpServer.py:
(HttpServer): Make server host and port public once the socket
have been established.

* bzrlib/tests/HTTPTestUtil.py:
(RedirectRequestHandler, HTTPServerRedirecting): New http test
server for redirections. Only a whole host can be redirected, so
far.

* bzrlib/errors.py:
(RedirectRequested.__init__): Add a 'qual_proto' oso that
transport decorations can be transmitted to redirected transport.
(RedirectRequested._requalify_url,
RedirectRequested.get_source_url,
RedirectRequested.get_target_url): New methods providing fully
decorated urls.

* bzrlib/bzrdir.py:
(BzrDir.open_from_transport): The redirection should preserve
transport decorations.
(BzrDirMetaFormat1): To be able to specialize bzr branches from
foreign branches, we need to register BzrDirMetaFormat1 as the
default control format (instead of BzrDirMetaFormat which is
abstract and can still be used by foreign branches).

Show diffs side-by-side

added added

removed removed

Lines of Context:
1180
1180
 
1181
1181
    _fmt = '%(source)s is%(permanently)s redirected to %(target)s'
1182
1182
 
1183
 
    def __init__(self, source, target, is_permament=False):
 
1183
    def __init__(self, source, target, is_permament=False, qual_proto=None):
1184
1184
        self.source = source
1185
1185
        self.target = target
1186
1186
        if is_permament:
1188
1188
        else:
1189
1189
            self.permanently = ''
1190
1190
        self.is_permament = is_permament
 
1191
        self._qualified_proto = qual_proto
1191
1192
        TransportError.__init__(self)
1192
1193
 
 
1194
    def _requalify_url(self, url):
 
1195
        """Restore the qualified proto in front of the url"""
 
1196
        # When this exception is raised, source and target are in
 
1197
        # user readable format. But some transports mau use a
 
1198
        # different proto (http+urllib:// will present http:// to
 
1199
        # the user. If a qualified proto is specified, the code
 
1200
        # trapping the exeception can get the qualified urls to
 
1201
        # properly handle the redirection themself (creating a
 
1202
        # new transport object from the target url for example).
 
1203
        if self._qualified_proto is None:
 
1204
            return url
 
1205
 
 
1206
        # The TODO related to NotBranchError mention that doing
 
1207
        # that kind of manipulation on the urls may not be the
 
1208
        # exception object job. On the other hand, this object is
 
1209
        # the interface between the code and the user so
 
1210
        # presenting the urls in different ways is indeed its
 
1211
        # job...
 
1212
        import urlparse
 
1213
        proto, netloc, path, query, fragment = urlparse.urlsplit(url)
 
1214
        return urlparse.urlunsplit((self._qualified_proto, netloc, path,
 
1215
                                   query, fragment))
 
1216
 
 
1217
    def get_source_url(self):
 
1218
        return self._requalify_url(self.source)
 
1219
 
 
1220
    def get_target_url(self):
 
1221
        return self._requalify_url(self.source)
 
1222
 
1193
1223
 
1194
1224
class UnknownHint(TransportError):
1195
1225