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