[MERGE][0.90][Bug 133965] PathNotChild, port mismatch with "bzr info" for bzr:// smartserver

Andrew Bennetts andrew at puzzling.org
Sun Aug 26 10:12:22 BST 2007


Andrew Bennetts wrote:
> [...]  So here's an updated
> version.

In my haste to correct my mistake, I forgot to actually attach the new bundle!
Here it is.

-Andrew.

-------------- next part --------------
# Bazaar merge directive format 2 (Bazaar 0.90)
# revision_id: andrew.bennetts at canonical.com-20070826085926-\
#   aqwpi7sprt2enh0i
# target_branch: http://bazaar-vcs.org/bzr/bzr.0.90
# testament_sha1: 4b6ac2563597426623b77299dd5aa1c38cc99934
# timestamp: 2007-08-26 18:59:30 +1000
# source_branch: http://people.ubuntu.com/~andrew/bzr/port-mismatch-\
#   bug-133965
# base_revision_id: pqm at pqm.ubuntu.com-20070822004557-ipcsdwnro02sbrpd
# 
# Begin patch
=== modified file 'NEWS'
--- NEWS	2007-08-21 20:54:11 +0000
+++ NEWS	2007-08-26 07:40:34 +0000
@@ -18,6 +18,12 @@
       from the developer document catalog back to the main one.
       (Ian Clatworthy, Sabin Iacob, Alexander Belchenko)
 
+  BUGFIXES:
+
+    * Fix ''bzr info bzr://host/'' and other operations on ''bzr://' URLs with
+      an implicit port.  We were incorrectly raising PathNotChild due to
+      inconsistent treatment of the ''_port'' attribute on the Transport object.
+      (Andrew Bennetts, #133965)
 
 bzr 0.90rc1 2007-08-14
 ======================

=== modified file 'bzrlib/tests/test_transport.py'
--- bzrlib/tests/test_transport.py	2007-07-22 15:44:59 +0000
+++ bzrlib/tests/test_transport.py	2007-08-26 07:40:34 +0000
@@ -54,6 +54,10 @@
 from bzrlib.transport.memory import MemoryTransport
 from bzrlib.transport.local import (LocalTransport,
                                     EmulatedWin32LocalTransport)
+from bzrlib.transport.remote import (
+    BZR_DEFAULT_PORT,
+    RemoteTCPTransport
+    )
 
 
 # TODO: Should possibly split transport-specific tests into their own files.
@@ -714,6 +718,50 @@
         self.assertIsNot(t1, t2)
 
 
+class TestRemoteTCPTransport(TestCase):
+    """Tests for bzr:// transport (RemoteTCPTransport)."""
+
+    def test_relpath_with_implicit_port(self):
+        """Connected transports with the same URL are the same, even if the
+        port is implicit.
+
+        So t.relpath(url) should always be '' if t.base is the same as url, or
+        if the only difference is that one explicitly specifies the default
+        port and the other doesn't specify a port.
+        """
+        t_implicit_port = RemoteTCPTransport('bzr://host.com/')
+        self.assertEquals('', t_implicit_port.relpath('bzr://host.com/'))
+        self.assertEquals('', t_implicit_port.relpath('bzr://host.com:4155/'))
+        t_explicit_port = RemoteTCPTransport('bzr://host.com:4155/')
+        self.assertEquals('', t_explicit_port.relpath('bzr://host.com/'))
+        self.assertEquals('', t_explicit_port.relpath('bzr://host.com:4155/'))
+
+    def test_construct_uses_default_port(self):
+        """If no port is specified, then RemoteTCPTransport uses
+        BZR_DEFAULT_PORT.
+        """
+        t = get_transport('bzr://host.com/')
+        self.assertEquals(BZR_DEFAULT_PORT, t._port)
+
+    def test_url_omits_default_port(self):
+        """If a RemoteTCPTransport uses the default port, then its base URL
+        will omit the port.
+
+        This is like how ":80" is omitted from "http://example.com/".
+        """
+        t = get_transport('bzr://host.com:4155/')
+        self.assertEquals('bzr://host.com/', t.base)
+
+    def test_url_includes_non_default_port(self):
+        """Non-default ports are included in the transport's URL.
+
+        Contrast this to `test_url_omits_default_port`.
+        """
+        t = get_transport('bzr://host.com:666/')
+        self.assertEquals('bzr://host.com:666/', t.base)
+
+
+
 def get_test_permutations():
     """Return transport permutations to be used in testing.
 

=== modified file 'bzrlib/transport/__init__.py'
--- bzrlib/transport/__init__.py	2007-08-09 03:23:04 +0000
+++ bzrlib/transport/__init__.py	2007-08-26 08:59:26 +0000
@@ -83,6 +83,7 @@
 def _clear_protocol_handlers():
     global transport_list_registry
     transport_list_registry = TransportListRegistry()
+    _default_ports.clear()
 
 
 def _get_transport_modules():
@@ -101,6 +102,17 @@
     return result
 
 
+_default_ports = {}
+
+def _get_default_port(scheme):
+    """Return the registered default port for this protocol scheme."""
+    try:
+        port = _default_ports.get(scheme + '://')
+    except KeyError:
+        port = None
+    return port
+
+
 class TransportListRegistry(registry.Registry):
     """A registry which simplifies tracking available Transports.
 
@@ -134,8 +146,10 @@
 transport_list_registry = TransportListRegistry( )
 
 
-def register_transport_proto(prefix, help=None, info=None):
+def register_transport_proto(prefix, help=None, info=None, default_port=None):
     transport_list_registry.register_transport(prefix, help, info)
+    if default_port is not None:
+        _default_ports[prefix] = default_port
 
 
 def register_lazy_transport(prefix, module, classname):
@@ -1222,6 +1236,10 @@
         host = urllib.unquote(host)
         path = urllib.unquote(path)
 
+        if port is None:
+            # The port isn't explicitly specified, so return the default (if
+            # there is one).
+            port = _get_default_port(scheme)
         return (scheme, user, password, host, port, path)
 
     @staticmethod
@@ -1252,7 +1270,9 @@
             # have one so that it doesn't get accidentally
             # exposed.
             netloc = '%s@%s' % (urllib.quote(user), netloc)
-        if port is not None:
+        if port is not None and port != _get_default_port(scheme):
+            # Include the port in the netloc (unless it's the same as the
+            # default, in which case we omit it as it is redundant).
             netloc = '%s:%d' % (netloc, port)
         path = urllib.quote(path)
         return urlparse.urlunparse((scheme, netloc, path, None, None, None))
@@ -1658,7 +1678,8 @@
                         'bzrlib.transport.fakevfat',
                         'FakeVFATTransportDecorator')
 register_transport_proto('bzr://',
-            help="Fast access using the Bazaar smart server.")
+            help="Fast access using the Bazaar smart server.",
+            default_port=4155)
 
 register_lazy_transport('bzr://',
                         'bzrlib.transport.remote',

=== modified file 'bzrlib/transport/remote.py'
--- bzrlib/transport/remote.py	2007-07-30 14:36:04 +0000
+++ bzrlib/transport/remote.py	2007-08-26 08:59:26 +0000
@@ -443,8 +443,6 @@
 
     def _build_medium(self):
         assert self.base.startswith('bzr://')
-        if self._port is None:
-            self._port = BZR_DEFAULT_PORT
         return medium.SmartTCPClientMedium(self._host, self._port), None
 
 

# Begin bundle
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


More information about the bazaar mailing list