handle corner case in logwalker.find_latest_change correctly.
[jelmer/subvertpy.git] / tests / test_logwalker.py
index 2b51df239abb3e1e89feafe08dbd70eee6591802..0f6ca448e268f617adb2874d92d4106d11bd7cbc 100644 (file)
@@ -1,4 +1,4 @@
-# Copyright (C) 2006 Jelmer Vernooij <jelmer@samba.org>
+# Copyright (C) 2006-2007 Jelmer Vernooij <jelmer@samba.org>
 
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
-from bzrlib.bzrdir import BzrDir
+"""Log walker tests."""
+
 from bzrlib.errors import NoSuchRevision
-from bzrlib.inventory import Inventory
 
 import os
 import logwalker
-from scheme import NoBranchingScheme, TrunkBranchingScheme
 from tests import TestCaseWithSubversionRepository
 from transport import SvnRaTransport
 
@@ -32,7 +31,7 @@ class TestLogWalker(TestCaseWithSubversionRepository):
 
     def test_create(self):
         repos_url = self.make_client("a", "ac")
-        logwalker.LogWalker(NoBranchingScheme(), transport=SvnRaTransport(repos_url))
+        logwalker.LogWalker(transport=SvnRaTransport(repos_url))
 
     def test_get_branch_log(self):
         repos_url = self.make_client("a", "dc")
@@ -40,25 +39,77 @@ class TestLogWalker(TestCaseWithSubversionRepository):
         self.client_add("dc/foo")
         self.client_commit("dc", "My Message")
 
-        walker = logwalker.LogWalker(NoBranchingScheme(), 
-                                     transport=SvnRaTransport(repos_url))
+        walker = logwalker.LogWalker(transport=SvnRaTransport(repos_url))
 
-        self.assertEqual(1, len(list(walker.follow_history("", 1))))
+        self.assertEqual(2, len(list(walker.follow_path("", 1))))
 
-    def test_get_branch_invalid_revision(self):
+    def test_get_branch_follow_branch(self):
         repos_url = self.make_client("a", "dc")
-        walker = logwalker.LogWalker(NoBranchingScheme(), 
-                                     transport=SvnRaTransport(repos_url))
-        self.assertRaises(NoSuchRevision, list, 
-                          walker.follow_history("/", 20))
+        self.build_tree({'dc/trunk/foo': "data"})
+        self.client_add("dc/trunk")
+        self.client_commit("dc", "My Message")
+        self.client_update("dc")
+
+        os.mkdir("dc/branches")
+        self.client_add("dc/branches")
+        self.client_commit("dc", "Add branches")
+        self.client_update("dc")
+
+        self.client_copy("dc/trunk", "dc/branches/foo")
+        self.client_commit("dc", "Copy")
+
+        walker = logwalker.LogWalker(transport=SvnRaTransport(repos_url))
+
+        self.assertEqual(2, len(list(walker.follow_path("branches/foo", 3))))
+
+    def test_get_branch_follow_branch_changing_parent(self):
+        repos_url = self.make_client("a", "dc")
+        self.build_tree({'dc/trunk/foo': "data"})
+        self.client_add("dc/trunk")
+        self.client_commit("dc", "My Message")
+        self.client_update("dc")
+
+        os.mkdir("dc/branches")
+        self.client_add("dc/branches")
+        self.client_commit("dc", "Add branches")
+        self.client_update("dc")
+
+        self.client_copy("dc/trunk", "dc/branches/abranch")
+        self.client_commit("dc", "Copy")
 
-    def test_invalid_branch_path(self):
+        walker = logwalker.LogWalker(transport=SvnRaTransport(repos_url))
+
+        self.assertEquals([
+            ("branches/abranch/foo", {"branches/abranch": ('A', 'trunk', 2)}, 3),
+            ("trunk/foo", {"trunk/foo": ('A', None, -1), 
+                           "trunk": ('A', None, -1)}, 1)
+        ], list(walker.follow_path("branches/abranch/foo", 3)))
+
+    def test_get_revision_paths(self):
+        repos_url = self.make_client("a", "dc")
+        self.build_tree({'dc/foo': "data"})
+        self.client_add("dc/foo")
+        self.client_commit("dc", "My Message")
+        walker = logwalker.LogWalker(SvnRaTransport(repos_url))
+        self.assertEqual({"foo": ('A', None, -1)}, walker.get_revision_paths(1))
+        self.assertEqual({"foo": ('A', None, -1)}, walker.get_revision_paths(1, "foo"))
+        self.assertEqual({"": ('A', None, -1)}, walker.get_revision_paths(0, ""))
+
+    def test_get_revision_paths_zero(self):
         repos_url = self.make_client("a", "dc")
-        walker = logwalker.LogWalker(NoBranchingScheme(), 
-                                     transport=SvnRaTransport(repos_url))
+        walker = logwalker.LogWalker(SvnRaTransport(repos_url))
+        self.assertEqual({'': ('A', None, -1)}, walker.get_revision_paths(0))
 
-        self.assertRaises(logwalker.NotSvnBranchPath, list, 
-                          walker.follow_history("foobar", 0))
+    def test_get_revision_paths_invalid(self):
+        repos_url = self.make_client("a", "dc")
+        walker = logwalker.LogWalker(SvnRaTransport(repos_url))
+        self.assertRaises(NoSuchRevision, lambda: walker.get_revision_paths(42))
+
+    def test_get_branch_invalid_revision(self):
+        repos_url = self.make_client("a", "dc")
+        walker = logwalker.LogWalker(transport=SvnRaTransport(repos_url))
+        self.assertRaises(NoSuchRevision, list, 
+                          walker.follow_path("/", 20))
 
     def test_branch_log_all(self):
         repos_url = self.make_client("a", "dc")
@@ -67,10 +118,9 @@ class TestLogWalker(TestCaseWithSubversionRepository):
         self.client_add("dc/foo")
         self.client_commit("dc", "My Message")
 
-        walker = logwalker.LogWalker(TrunkBranchingScheme(), 
-                                     transport=SvnRaTransport(repos_url))
+        walker = logwalker.LogWalker(transport=SvnRaTransport(repos_url))
 
-        self.assertEqual(1, len(list(walker.follow_history(None, 1))))
+        self.assertEqual(2, len(list(walker.follow_path("", 1))))
 
     def test_branch_log_specific(self):
         repos_url = self.make_client("a", "dc")
@@ -83,19 +133,30 @@ class TestLogWalker(TestCaseWithSubversionRepository):
         self.client_add("dc/branches")
         self.client_commit("dc", "My Message")
 
-        walker = logwalker.LogWalker(TrunkBranchingScheme(), 
-                                     transport=SvnRaTransport(repos_url))
+        walker = logwalker.LogWalker(transport=SvnRaTransport(repos_url))
 
-        self.assertEqual(1, len(list(walker.follow_history("branches/brancha",
+        self.assertEqual(1, len(list(walker.follow_path("branches/brancha",
             1))))
 
-    def test_find_branches_no(self):
+    def test_follow_path_ignore_unchanged(self):
         repos_url = self.make_client("a", "dc")
+        self.build_tree({'dc/branches': None})
+        self.client_add("dc/branches")
+        self.build_tree({
+            'dc/branches/brancha': None,
+            'dc/branches/branchab': None,
+            'dc/branches/brancha/data': "data", 
+            "dc/branches/branchab/data":"data"})
+        self.client_add("dc/branches/brancha")
+        self.client_commit("dc", "My Message")
 
-        walker = logwalker.LogWalker(NoBranchingScheme(), 
-                                     transport=SvnRaTransport(repos_url))
+        self.client_add("dc/branches/branchab")
+        self.client_commit("dc", "My Message2")
+
+        walker = logwalker.LogWalker(transport=SvnRaTransport(repos_url))
 
-        self.assertEqual([("", 0, True)], list(walker.find_branches(0)))
+        self.assertEqual(1, len(list(walker.follow_path("branches/brancha",
+            2))))
 
     def test_find_latest_none(self):
         repos_url = self.make_client("a", "dc")
@@ -103,10 +164,78 @@ class TestLogWalker(TestCaseWithSubversionRepository):
         self.client_add("dc/branches")
         self.client_commit("dc", "My Message")
 
-        walker = logwalker.LogWalker(TrunkBranchingScheme(), 
-                                     transport=SvnRaTransport(repos_url))
+        walker = logwalker.LogWalker(transport=SvnRaTransport(repos_url))
+
+        self.assertEqual(0, walker.find_latest_change("", 1, include_parents=True))
+    
+    def test_find_latest_children_root(self):
+        repos_url = self.make_client("a", "dc")
+        self.build_tree({'dc/branches': "bla"})
+        self.client_add("dc/branches")
+        self.client_commit("dc", "My Message")
+
+        walker = logwalker.LogWalker(transport=SvnRaTransport(repos_url))
+
+        self.assertEqual(1, 
+            walker.find_latest_change("", 1, include_children=True))
+
+    def test_find_latest_parent(self):
+        repos_url = self.make_client("a", "dc")
+        self.build_tree({'dc/branches/tmp/foo': None, 'dc/tags': None})
+        self.client_add("dc/branches")
+        self.client_add("dc/tags")
+        self.client_commit("dc", "My Message")
+        self.client_copy("dc/branches/tmp", "dc/tags/tmp")
+        self.client_commit("dc", "My Message2")
+
+        walker = logwalker.LogWalker(transport=SvnRaTransport(repos_url))
+
+        self.assertEqual(2, walker.find_latest_change("tags/tmp/foo", 2, 
+                                                      include_parents=True))
+
+    def test_find_latest_parent_just_modify(self):
+        repos_url = self.make_client("a", "dc")
+        self.build_tree({'dc/branches/tmp/foo': None, 'dc/tags': None})
+        self.client_add("dc/branches")
+        self.client_add("dc/tags")
+        self.client_commit("dc", "My Message")
+        self.client_copy("dc/branches/tmp", "dc/tags/tmp")
+        self.client_commit("dc", "My Message2")
+        self.client_update("dc")
+        self.client_set_prop("dc/tags", "myprop", "mydata")
+        self.client_commit("dc", "My Message3")
 
-        self.assertEqual(0, walker.find_latest_change("", 1))
+        walker = logwalker.LogWalker(transport=SvnRaTransport(repos_url))
+        self.assertEqual(2, walker.find_latest_change("tags/tmp/foo", 3,
+                                                      include_parents=True))
+
+    def test_find_latest_parentmoved(self):
+        repos_url = self.make_client("a", "dc")
+        self.build_tree({'dc/branches/tmp': None})
+        self.client_add("dc/branches")
+        self.client_commit("dc", "My Message")
+
+        self.client_copy("dc/branches", "dc/bla")
+        self.client_commit("dc", "My Message")
+
+        walker = logwalker.LogWalker(transport=SvnRaTransport(repos_url))
+
+        self.assertIs(2, walker.find_latest_change("bla/tmp", 2, 
+                                                   include_parents=True))
+
+    def test_find_latest_nonexistant(self):
+        repos_url = self.make_client("a", "dc")
+        self.build_tree({'dc/branches/tmp': None})
+        self.client_add("dc/branches")
+        self.client_commit("dc", "My Message")
+
+        self.client_copy("dc/branches", "dc/bla")
+        self.client_commit("dc", "My Message")
+
+        walker = logwalker.LogWalker(transport=SvnRaTransport(repos_url))
+
+        self.assertIs(None, walker.find_latest_change("bloe", 2, include_parents=True))
+        self.assertIs(None, walker.find_latest_change("bloe/bla", 2, include_parents=True))
 
     def test_find_latest_change(self):
         repos_url = self.make_client("a", "dc")
@@ -114,10 +243,9 @@ class TestLogWalker(TestCaseWithSubversionRepository):
         self.client_add("dc/branches")
         self.client_commit("dc", "My Message")
 
-        walker = logwalker.LogWalker(TrunkBranchingScheme(), 
-                                     transport=SvnRaTransport(repos_url))
+        walker = logwalker.LogWalker(transport=SvnRaTransport(repos_url))
 
-        self.assertEqual(1, walker.find_latest_change("branches", 1))
+        self.assertEqual(1, walker.find_latest_change("branches", 1, include_parents=True))
 
     def test_find_latest_change_children(self):
         repos_url = self.make_client("a", "dc")
@@ -128,10 +256,9 @@ class TestLogWalker(TestCaseWithSubversionRepository):
         self.client_add("dc/branches/foo")
         self.client_commit("dc", "My Message2")
 
-        walker = logwalker.LogWalker(TrunkBranchingScheme(), 
-                                     transport=SvnRaTransport(repos_url))
+        walker = logwalker.LogWalker(transport=SvnRaTransport(repos_url))
 
-        self.assertEqual(1, walker.find_latest_change("branches", 2))
+        self.assertEqual(1, walker.find_latest_change("branches", 2, include_parents=True))
 
     def test_find_latest_change_prop(self):
         repos_url = self.make_client("a", "dc")
@@ -144,10 +271,9 @@ class TestLogWalker(TestCaseWithSubversionRepository):
         self.client_add("dc/branches/foo")
         self.client_commit("dc", "My Message2")
 
-        walker = logwalker.LogWalker(TrunkBranchingScheme(), 
-                                     transport=SvnRaTransport(repos_url))
+        walker = logwalker.LogWalker(transport=SvnRaTransport(repos_url))
 
-        self.assertEqual(2, walker.find_latest_change("branches", 3))
+        self.assertEqual(2, walker.find_latest_change("branches", 3, include_parents=True))
 
     def test_find_latest_change_file(self):
         repos_url = self.make_client("a", "dc")
@@ -160,10 +286,9 @@ class TestLogWalker(TestCaseWithSubversionRepository):
         self.build_tree({'dc/branches/foo': 'data4'})
         self.client_commit("dc", "My Message2")
 
-        walker = logwalker.LogWalker(TrunkBranchingScheme(), 
-                                     transport=SvnRaTransport(repos_url))
+        walker = logwalker.LogWalker(transport=SvnRaTransport(repos_url))
 
-        self.assertEqual(3, walker.find_latest_change("branches/foo", 3))
+        self.assertEqual(3, walker.find_latest_change("branches/foo", 3, include_parents=True))
 
     def test_find_latest_change_newer(self):
         repos_url = self.make_client("a", "dc")
@@ -176,92 +301,63 @@ class TestLogWalker(TestCaseWithSubversionRepository):
         self.build_tree({'dc/branches/foo': 'data4'})
         self.client_commit("dc", "My Message2")
 
-        walker = logwalker.LogWalker(TrunkBranchingScheme(), 
-                                     transport=SvnRaTransport(repos_url))
-
-        self.assertEqual(2, walker.find_latest_change("branches/foo", 2))
-
-    def test_find_branches_no_later(self):
-        repos_url = self.make_client("a", "dc")
-
-        walker = logwalker.LogWalker(NoBranchingScheme(), 
-                                     transport=SvnRaTransport(repos_url))
-
-        self.assertEqual([("", 0, True)], list(walker.find_branches(0)))
-
-    def test_find_branches_trunk_empty(self):
-        repos_url = self.make_client("a", "dc")
-
-        walker = logwalker.LogWalker(TrunkBranchingScheme(), 
-                                     transport=SvnRaTransport(repos_url))
+        walker = logwalker.LogWalker(transport=SvnRaTransport(repos_url))
 
-        self.assertEqual([], list(walker.find_branches(0)))
+        self.assertEqual(2, walker.find_latest_change("branches/foo", 2, include_parents=True))
 
-    def test_find_branches_trunk_one(self):
+    def test_follow_history_branch_replace(self):
         repos_url = self.make_client("a", "dc")
 
-        walker = logwalker.LogWalker(TrunkBranchingScheme(), 
-                                     transport=SvnRaTransport(repos_url))
-
-        self.build_tree({'dc/trunk/foo': "data"})
+        self.build_tree({'dc/trunk/data': "data"})
         self.client_add("dc/trunk")
-        self.client_commit("dc", "My Message")
-
-        self.assertEqual([("trunk", 1, True)], list(walker.find_branches(1)))
-
-    def test_find_branches_removed(self):
-        repos_url = self.make_client("a", "dc")
+        self.client_commit("dc", "Cm1")
 
-        walker = logwalker.LogWalker(TrunkBranchingScheme(), 
-                                     transport=SvnRaTransport(repos_url))
+        self.client_delete("dc/trunk")
+        self.client_commit("dc", "Cm1")
 
-        self.build_tree({'dc/trunk/foo': "data"})
+        self.build_tree({'dc/trunk/data': "data"})
         self.client_add("dc/trunk")
-        self.client_commit("dc", "My Message")
-
-        self.client_delete("dc/trunk")
-        self.client_commit("dc", "remove")
+        self.client_commit("dc", "Cm1")
 
-        self.assertEqual([("trunk", 1, True)], list(walker.find_branches(1)))
-        self.assertEqual([("trunk", 2, False)], list(walker.find_branches(2)))
+        walker = logwalker.LogWalker(transport=SvnRaTransport(repos_url))
+        self.assertEqual([("trunk", {"trunk/data": ('A', None, -1),
+                                     "trunk": ('A', None, -1)}, 3)], 
+                list(walker.follow_path("trunk", 3)))
 
     def test_follow_history(self):
         repos_url = self.make_client("a", "dc")
-        walker = logwalker.LogWalker(NoBranchingScheme(), 
-                                     transport=SvnRaTransport(repos_url))
+        walker = logwalker.LogWalker(transport=SvnRaTransport(repos_url))
 
         self.build_tree({'dc/foo': "data"})
         self.client_add("dc/foo")
         self.client_commit("dc", "My Message")
 
-        for (branch, paths, rev) in walker.follow_history("", 1):
-           self.assertEqual(branch, "")
-           self.assertTrue(paths.has_key("foo"))
-           self.assertEqual(rev, 1)
+        for (branch, paths, rev) in walker.follow_path("", 1):
+            self.assertEqual(branch, "")
+            self.assertTrue(rev == 0 or paths.has_key("foo"))
+            self.assertTrue(rev in (0,1))
 
     def test_follow_history_nohist(self):
         repos_url = self.make_client("a", "dc")
-        walker = logwalker.LogWalker(NoBranchingScheme(), 
-                                     transport=SvnRaTransport(repos_url))
+        walker = logwalker.LogWalker(transport=SvnRaTransport(repos_url))
 
-        self.assertEqual([], list(walker.follow_history("", 0)))
+        self.assertEqual([], list(walker.follow_path("", 0)))
 
     def test_later_update(self):
         repos_url = self.make_client("a", "dc")
 
-        walker = logwalker.LogWalker(NoBranchingScheme(), 
-                                     transport=SvnRaTransport(repos_url))
+        walker = logwalker.LogWalker(transport=SvnRaTransport(repos_url))
 
         self.build_tree({'dc/foo': "data"})
         self.client_add("dc/foo")
         self.client_commit("dc", "My Message")
 
-        for (branch, paths, rev) in walker.follow_history("", 1):
-           self.assertEqual(branch, "")
-           self.assertTrue(paths.has_key("foo"))
-           self.assertEqual(rev, 1)
+        for (branch, paths, rev) in walker.follow_path("", 1):
+            self.assertEqual(branch, "")
+            self.assertTrue(rev == 0 or paths.has_key("foo"))
+            self.assertTrue(rev in (0,1))
 
-        iter = walker.follow_history("", 2)
+        iter = walker.follow_path("", 2)
         self.assertRaises(NoSuchRevision, list, iter)
 
     def test_get_branch_log_follow(self):
@@ -274,11 +370,12 @@ class TestLogWalker(TestCaseWithSubversionRepository):
         self.client_copy("dc/trunk", "dc/branches/abranch")
         self.client_commit("dc", "Create branch")
 
-        walker = logwalker.LogWalker(TrunkBranchingScheme(), 
-                                     transport=SvnRaTransport(repos_url))
+        walker = logwalker.LogWalker(transport=SvnRaTransport(repos_url))
 
-        items = list(walker.follow_history("branches/abranch", 2))
-        self.assertEqual(2, len(items))
+        items = list(walker.follow_path("branches/abranch", 2))
+        self.assertEqual([('branches/abranch', {'branches/abranch': ('A', 'trunk', 1)}, 2), 
+                          ('trunk', {'trunk/afile': ('A', None, -1), 
+                                     'trunk': (u'A', None, -1)}, 1)], items)
 
     def test_touches_path(self):
         repos_url = self.make_client("a", "dc")
@@ -286,8 +383,7 @@ class TestLogWalker(TestCaseWithSubversionRepository):
         self.client_add("dc/trunk")
         self.client_commit("dc", "My Message")
 
-        walker = logwalker.LogWalker(TrunkBranchingScheme(), 
-                                     transport=SvnRaTransport(repos_url))
+        walker = logwalker.LogWalker(transport=SvnRaTransport(repos_url))
 
         self.assertTrue(walker.touches_path("trunk", 1))
 
@@ -297,8 +393,7 @@ class TestLogWalker(TestCaseWithSubversionRepository):
         self.client_add("dc/trunk")
         self.client_commit("dc", "My Message")
 
-        walker = logwalker.LogWalker(TrunkBranchingScheme(), 
-                                     transport=SvnRaTransport(repos_url))
+        walker = logwalker.LogWalker(transport=SvnRaTransport(repos_url))
 
         self.assertTrue(walker.touches_path("", 0))
 
@@ -308,8 +403,7 @@ class TestLogWalker(TestCaseWithSubversionRepository):
         self.client_add("dc/trunk")
         self.client_commit("dc", "My Message")
 
-        walker = logwalker.LogWalker(TrunkBranchingScheme(), 
-                                     transport=SvnRaTransport(repos_url))
+        walker = logwalker.LogWalker(transport=SvnRaTransport(repos_url))
 
         self.assertFalse(walker.touches_path("", 1))
 
@@ -321,11 +415,17 @@ class TestLogWalker(TestCaseWithSubversionRepository):
         self.build_tree({'dc/trunk/afile': "data2"})
         self.client_commit("dc", "My Message")
 
-        walker = logwalker.LogWalker(TrunkBranchingScheme(), 
-                                     transport=SvnRaTransport(repos_url))
+        walker = logwalker.LogWalker(transport=SvnRaTransport(repos_url))
 
         self.assertFalse(walker.touches_path("trunk", 2))
 
+    def test_get_previous_root(self):
+        repos_url = self.make_client("a", "dc")
+
+        walker = logwalker.LogWalker(transport=SvnRaTransport(repos_url))
+
+        self.assertEqual((None, -1), walker.get_previous("", 0))
+
     def test_get_previous_simple(self):
         repos_url = self.make_client("a", "dc")
         self.build_tree({'dc/trunk/afile': "data"})
@@ -335,11 +435,23 @@ class TestLogWalker(TestCaseWithSubversionRepository):
         self.client_set_prop("dc/trunk", "myprop", "mydata")
         self.client_commit("dc", "My Message")
 
-        walker = logwalker.LogWalker(TrunkBranchingScheme(), 
-                                     transport=SvnRaTransport(repos_url))
+        walker = logwalker.LogWalker(transport=SvnRaTransport(repos_url))
 
         self.assertEqual(("trunk", 1), walker.get_previous("trunk", 2))
 
+    def test_get_previous_added(self):
+        repos_url = self.make_client("a", "dc")
+        self.build_tree({'dc/trunk/afile': "data"})
+        self.client_add("dc/trunk")
+        self.client_commit("dc", "My Message")
+        self.build_tree({'dc/trunk/afile': "data2"})
+        self.client_set_prop("dc/trunk", "myprop", "mydata")
+        self.client_commit("dc", "My Message")
+
+        walker = logwalker.LogWalker(transport=SvnRaTransport(repos_url))
+
+        self.assertEqual((None, -1), walker.get_previous("trunk", 1))
+
     def test_get_previous_copy(self):
         repos_url = self.make_client("a", "dc")
         self.build_tree({'dc/trunk/afile': "data"})
@@ -348,22 +460,131 @@ class TestLogWalker(TestCaseWithSubversionRepository):
         self.client_copy("dc/trunk", "dc/anotherfile")
         self.client_commit("dc", "My Message")
 
-        walker = logwalker.LogWalker(TrunkBranchingScheme(), 
-                                     transport=SvnRaTransport(repos_url))
+        walker = logwalker.LogWalker(transport=SvnRaTransport(repos_url))
 
         self.assertEqual(("trunk", 1), walker.get_previous("anotherfile", 2))
 
+    def test_get_revision_info_zero(self):
+        repos_url = self.make_client("a", "dc")
+
+        walker = logwalker.LogWalker(transport=SvnRaTransport(repos_url))
+
+        info = walker.get_revision_info(0)
+
+        self.assertEqual(None, info[0])
+        self.assertEqual(None, info[1])
+        self.assertEqual(None, info[2])
+
     def test_get_revision_info(self):
         repos_url = self.make_client("a", "dc")
         self.build_tree({'dc/trunk/afile': "data"})
         self.client_add("dc/trunk")
         self.client_commit("dc", "My Message")
 
-        walker = logwalker.LogWalker(TrunkBranchingScheme(), 
-                                     transport=SvnRaTransport(repos_url))
+        walker = logwalker.LogWalker(transport=SvnRaTransport(repos_url))
 
         info = walker.get_revision_info(1)
 
         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(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(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(transport=SvnRaTransport(repos_url))
+
+        self.assertEqual(
+                set(['trunk/data', 'trunk/data/bla', 'trunk/file']), 
+                set(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(transport=SvnRaTransport(repos_url))
+
+        self.assertEqual(set(['trunk/data', 'trunk/data/bla']), 
+                set(walker.find_children("trunk", 1)))
+        self.assertEqual(set(['trunk/data', 'trunk/data/bla', 'trunk/file']), 
+                set(walker.find_children("trunk", 2)))
+
+    def test_find_children_copy(self):
+        repos_url = self.make_client("a", "dc")
+        self.build_tree({'dc/trunk/data/bla': 'foo',
+                         'dc/trunk/db/f1': 'bloe',
+                         'dc/trunk/db/f2': 'bla'})
+        self.client_add("dc/trunk")
+        self.client_commit("dc", "My Message")
+        self.client_copy("dc/trunk/db", "dc/trunk/data/fg")
+        self.client_commit("dc", "My Message")
+
+        walker = logwalker.LogWalker(transport=SvnRaTransport(repos_url))
+
+        self.assertEqual(set(['trunk/data', 'trunk/data/bla', 
+                          'trunk/data/fg', 'trunk/data/fg/f1', 
+                          'trunk/data/fg/f2', 'trunk/db',
+                          'trunk/db/f1', 'trunk/db/f2']), 
+                set(walker.find_children("trunk", 2)))
+
+    def test_find_children_copy_del(self):
+        repos_url = self.make_client("a", "dc")
+        self.build_tree({'dc/trunk/data/bla': 'foo',
+                         'dc/trunk/db/f1': 'bloe',
+                         'dc/trunk/db/f2': 'bla'})
+        self.client_add("dc/trunk")
+        self.client_commit("dc", "My Message")
+        self.client_copy("dc/trunk/db", "dc/trunk/data/fg")
+        self.client_commit("dc", "My Message")
+        self.client_delete("dc/trunk/data/fg/f2")
+        self.client_commit("dc", "My Message")
+
+        walker = logwalker.LogWalker(transport=SvnRaTransport(repos_url))
+
+        self.assertEqual(set(['trunk/data', 'trunk/data/bla', 
+                          'trunk/data/fg', 'trunk/data/fg/f1', 'trunk/db',
+                          'trunk/db/f1', 'trunk/db/f2']), 
+                set(walker.find_children("trunk", 3)))
+
+    def test_fetch_property_change_only_trunk(self):
+        repos_url = self.make_client('d', 'dc')
+        self.build_tree({'dc/trunk/bla': "data"})
+        self.client_add("dc/trunk")
+        self.client_commit("dc", "My Message")
+        self.client_set_prop("dc/trunk", "some:property", "some data\n")
+        self.client_commit("dc", "My 3")
+        self.client_set_prop("dc/trunk", "some2:property", "some data\n")
+        self.client_commit("dc", "My 2")
+        self.client_set_prop("dc/trunk", "some:property", "some data4\n")
+        self.client_commit("dc", "My 4")
+        walker = logwalker.LogWalker(transport=SvnRaTransport(repos_url))
+        self.assertEquals({'trunk': ('M', None, -1)}, walker.get_revision_paths(3))
+
+