Rev 5320: (lifeless) Teach BzrDir.find_bzrdirs to handle PermissionDenied errors. in file:///home/pqm/archives/thelove/bzr/%2Btrunk/

Canonical.com Patch Queue Manager pqm at pqm.ubuntu.com
Fri Jun 25 05:24:14 BST 2010


At file:///home/pqm/archives/thelove/bzr/%2Btrunk/

------------------------------------------------------------
revno: 5320 [merge]
revision-id: pqm at pqm.ubuntu.com-20100625042410-r2zawge1wxx9ma9p
parent: pqm at pqm.ubuntu.com-20100625014717-87uomuhwxiuths2j
parent: robertc at robertcollins.net-20100625014949-0eiur8mbvb1d2mp6
committer: Canonical.com Patch Queue Manager <pqm at pqm.ubuntu.com>
branch nick: +trunk
timestamp: Fri 2010-06-25 05:24:10 +0100
message:
  (lifeless) Teach BzrDir.find_bzrdirs to handle PermissionDenied errors.
   (Marius Kruger) (Robert Collins)
modified:
  NEWS                           NEWS-20050323055033-4e00b5db738777ff
  bzrlib/bzrdir.py               bzrdir.py-20060131065624-156dfea39c4387cb
  bzrlib/tests/__init__.py       selftest.py-20050531073622-8d0e3c8845c97a64
  bzrlib/tests/test_bzrdir.py    test_bzrdir.py-20060131065654-deba40eef51cf220
=== modified file 'NEWS'
--- a/NEWS	2010-06-25 01:47:17 +0000
+++ b/NEWS	2010-06-25 04:24:10 +0000
@@ -58,6 +58,9 @@
   or pull location in locations.conf or branch.conf.
   (Gordon Tyler, #534787)
 
+* ``BzrDir.find_bzrdirs`` should ignore dirs that raises PermissionDenied.
+  (Marius Kruger, Robert Collins)
+
 * Ensure that wrong path specifications in ``BZR_PLUGINS_AT`` display
   proper error messages. (Vincent Ladeuil, #591215)
 

=== modified file 'bzrlib/bzrdir.py'
--- a/bzrlib/bzrdir.py	2010-06-24 06:29:40 +0000
+++ b/bzrlib/bzrdir.py	2010-06-25 04:24:10 +0000
@@ -375,14 +375,14 @@
             recurse = True
             try:
                 bzrdir = BzrDir.open_from_transport(current_transport)
-            except errors.NotBranchError:
+            except (errors.NotBranchError, errors.PermissionDenied):
                 pass
             else:
                 recurse, value = evaluate(bzrdir)
                 yield value
             try:
                 subdirs = list_current(current_transport)
-            except errors.NoSuchFile:
+            except (errors.NoSuchFile, errors.PermissionDenied):
                 continue
             if recurse:
                 for subdir in sorted(subdirs, reverse=True):
@@ -1959,7 +1959,6 @@
             format_string = transport.get_bytes(".bzr/branch-format")
         except errors.NoSuchFile:
             raise errors.NotBranchError(path=transport.base)
-
         try:
             return klass._formats[format_string]
         except KeyError:

=== modified file 'bzrlib/tests/__init__.py'
--- a/bzrlib/tests/__init__.py	2010-06-21 22:29:38 +0000
+++ b/bzrlib/tests/__init__.py	2010-06-25 01:49:49 +0000
@@ -2408,9 +2408,11 @@
         made_control = self.make_bzrdir(relpath, format=format)
         return made_control.create_repository(shared=shared)
 
-    def make_smart_server(self, path):
+    def make_smart_server(self, path, backing_server=None):
+        if backing_server is None:
+            backing_server = self.get_server()
         smart_server = test_server.SmartTCPServer_for_testing()
-        self.start_server(smart_server, self.get_server())
+        self.start_server(smart_server, backing_server)
         remote_transport = get_transport(smart_server.get_url()).clone(path)
         return remote_transport
 

=== modified file 'bzrlib/tests/test_bzrdir.py'
--- a/bzrlib/tests/test_bzrdir.py	2010-03-25 14:22:41 +0000
+++ b/bzrlib/tests/test_bzrdir.py	2010-06-25 01:49:49 +0000
@@ -54,6 +54,7 @@
 from bzrlib.transport import (
     get_transport,
     memory,
+    pathfilter,
     )
 from bzrlib.transport.http._urllib import HttpTransport_urllib
 from bzrlib.transport.nosmart import NoSmartTransportDecorator
@@ -807,6 +808,38 @@
         self.assertEqualBzrdirs([baz, foo, bar],
                                 bzrdir.BzrDir.find_bzrdirs(transport))
 
+    def make_fake_permission_denied_transport(self, transport, paths):
+        """Create a transport that raises PermissionDenied for some paths."""
+        def filter(path):
+            if path in paths:
+                raise errors.PermissionDenied(path)
+            return path
+        path_filter_server = pathfilter.PathFilteringServer(transport, filter)
+        path_filter_server.start_server()
+        self.addCleanup(path_filter_server.stop_server)
+        path_filter_transport = pathfilter.PathFilteringTransport(
+            path_filter_server, '.')
+        return (path_filter_server, path_filter_transport)
+
+    def assertBranchUrlsEndWith(self, expect_url_suffix, actual_bzrdirs):
+        """Check that each branch url ends with the given suffix."""
+        for actual_bzrdir in actual_bzrdirs:
+            self.assertEndsWith(actual_bzrdir.user_url, expect_url_suffix)
+
+    def test_find_bzrdirs_permission_denied(self):
+        foo, bar, baz = self.make_foo_bar_baz()
+        transport = get_transport(self.get_url())
+        path_filter_server, path_filter_transport = \
+            self.make_fake_permission_denied_transport(transport, ['foo'])
+        # local transport
+        self.assertBranchUrlsEndWith('/baz/',
+            bzrdir.BzrDir.find_bzrdirs(path_filter_transport))
+        # smart server
+        smart_transport = self.make_smart_server('.',
+            backing_server=path_filter_server)
+        self.assertBranchUrlsEndWith('/baz/',
+            bzrdir.BzrDir.find_bzrdirs(smart_transport))
+
     def test_find_bzrdirs_list_current(self):
         def list_current(transport):
             return [s for s in transport.list_dir('') if s != 'baz']
@@ -817,7 +850,6 @@
                                 bzrdir.BzrDir.find_bzrdirs(transport,
                                     list_current=list_current))
 
-
     def test_find_bzrdirs_evaluate(self):
         def evaluate(bzrdir):
             try:




More information about the bazaar-commits mailing list