Rev 286: More efficient implementation of find_children(). in http://people.samba.org/bzr/jelmer/bzr-svn/bzr.dev

Jelmer Vernooij jelmer at samba.org
Mon Dec 25 00:23:12 GMT 2006


------------------------------------------------------------
revno: 286
revision-id: jelmer at samba.org-20061225002158-2c0x8r1h6i1qng7e
parent: jelmer at samba.org-20061224231954-aiot9j3k357kcdpl
committer: Jelmer Vernooij <jelmer at samba.org>
branch nick: main
timestamp: Mon 2006-12-25 01:21:58 +0100
message:
  More efficient implementation of find_children(). 
  Make sure calls to get_dir2() never start with a slash, as that 
  causes strange errors over ra_dav.
modified:
  fileids.py                     fileids.py-20060714013623-u5iiyqqnko11grcf-1
  logwalker.py                   logwalker.py-20060621215743-c13fhfnyzh1xzwh2-1
  tests/test_logwalker.py        test_logwalker.py-20060622141944-pkocc3rj8g62ukbi-1
  transport.py                   transport.py-20060406231150-b3472d06b3a0818d
=== modified file 'fileids.py'
--- a/fileids.py	2006-12-20 21:42:17 +0000
+++ b/fileids.py	2006-12-25 00:21:58 +0000
@@ -193,7 +193,9 @@
                         warn('incomplete data for %r' % p)
                     else:
                         for c in find_children(data[1], data[2]):
-                            map[c.replace(data[1], p, 1)] = generate_file_id(revid, c), revid
+                            path = c.replace(data[1], p, 1)
+                            map[path] = generate_file_id(revid, c), revid
+                            mutter('added mapping %r -> %r' % (path, map[path]))
 
             elif data[0] == 'M':
                 if p == "":

=== modified file 'logwalker.py'
--- a/logwalker.py	2006-12-24 22:23:32 +0000
+++ b/logwalker.py	2006-12-25 00:21:58 +0000
@@ -302,7 +302,8 @@
 
         try:
             (dirents, _, _) = self.transport.get_dir2(
-                "/" + path.encode('utf8'), revnum, 0)
+                path.lstrip("/").encode('utf8'), revnum, 
+                svn.core.SVN_DIRENT_KIND)
         except SubversionException, (_, num):
             if num == svn.core.SVN_ERR_FS_NOT_DIRECTORY:
                 return
@@ -310,8 +311,9 @@
 
         for p in dirents:
             yield os.path.join(path, p)
-            for c in self.find_children(os.path.join(path, p), revnum):
-                yield c
+            if dirents[p].kind == svn.core.svn_node_dir:
+                for c in self.find_children(os.path.join(path, p), revnum):
+                    yield c
 
     def get_previous(self, path, revnum):
         """Return path,revnum pair specified pair was derived from.

=== modified file 'tests/test_logwalker.py'
--- a/tests/test_logwalker.py	2006-12-24 00:25:17 +0000
+++ b/tests/test_logwalker.py	2006-12-25 00:21:58 +0000
@@ -381,3 +381,53 @@
         self.assertEqual("", info[0])
         self.assertEqual("My Message", info[1])
 
+    def test_find_children_empty(self):
+        repos_url = self.make_client("a", "dc")
+        self.build_tree({'dc/trunk': None})
+        self.client_add("dc/trunk")
+        self.client_commit("dc", "My Message")
+
+        walker = logwalker.LogWalker(TrunkBranchingScheme(), 
+                                     transport=SvnRaTransport(repos_url))
+
+        self.assertEqual([], list(walker.find_children("trunk", 1)))
+
+    def test_find_children_one(self):
+        repos_url = self.make_client("a", "dc")
+        self.build_tree({'dc/trunk/data': 'foo'})
+        self.client_add("dc/trunk")
+        self.client_commit("dc", "My Message")
+
+        walker = logwalker.LogWalker(TrunkBranchingScheme(), 
+                                     transport=SvnRaTransport(repos_url))
+
+        self.assertEqual(['trunk/data'], list(walker.find_children("trunk", 1)))
+
+    def test_find_children_nested(self):
+        repos_url = self.make_client("a", "dc")
+        self.build_tree({'dc/trunk/data/bla': 'foo', 'dc/trunk/file': 'bla'})
+        self.client_add("dc/trunk")
+        self.client_commit("dc", "My Message")
+
+        walker = logwalker.LogWalker(TrunkBranchingScheme(), 
+                                     transport=SvnRaTransport(repos_url))
+
+        self.assertEqual(['trunk/data', 'trunk/data/bla', 'trunk/file'], 
+                list(walker.find_children("trunk", 1)))
+
+    def test_find_children_later(self):
+        repos_url = self.make_client("a", "dc")
+        self.build_tree({'dc/trunk/data/bla': 'foo'})
+        self.client_add("dc/trunk")
+        self.client_commit("dc", "My Message")
+        self.build_tree({'dc/trunk/file': 'bla'})
+        self.client_add("dc/trunk/file")
+        self.client_commit("dc", "My Message")
+
+        walker = logwalker.LogWalker(TrunkBranchingScheme(), 
+                                     transport=SvnRaTransport(repos_url))
+
+        self.assertEqual(['trunk/data', 'trunk/data/bla'], 
+                list(walker.find_children("trunk", 1)))
+        self.assertEqual(['trunk/data', 'trunk/data/bla', 'trunk/file'], 
+                list(walker.find_children("trunk", 2)))

=== modified file 'transport.py'
--- a/transport.py	2006-12-24 22:23:32 +0000
+++ b/transport.py	2006-12-25 00:21:58 +0000
@@ -173,8 +173,11 @@
             self._ra = svn.client.open_ra_session(self.svn_url.encode('utf8'), 
                     self._client, self.pool)
     @need_lock
-    def get_dir2(self, *args, **kwargs):
-        return svn.ra.get_dir2(self._ra, *args, **kwargs)
+    def get_dir2(self, path, *args, **kwargs):
+        # ra_dav backends fail with strange errors if the path starts with a 
+        # slash while other backends don't.
+        assert len(path) == 0 or path[0] != "/"
+        return svn.ra.get_dir2(self._ra, path, *args, **kwargs)
 
     def list_dir(self, relpath):
         if relpath == ".":




More information about the bazaar-commits mailing list