Rev 803: Implement optimization in find_branches() to be able to start from a in file:///data/jelmer/bzr-svn/0.4/

Jelmer Vernooij jelmer at samba.org
Thu Dec 6 17:51:41 GMT 2007


At file:///data/jelmer/bzr-svn/0.4/

------------------------------------------------------------
revno: 803
revision-id:jelmer at samba.org-20071206175113-m0ayc56h3u3wi5s5
parent: jelmer at samba.org-20071206155408-23oe0l7zjw17tlqe
committer: Jelmer Vernooij <jelmer at samba.org>
branch nick: 0.4
timestamp: Thu 2007-12-06 18:51:13 +0100
message:
  Implement optimization in find_branches() to be able to start from a 
  different revno than 0. Speeds up push significantly.
modified:
  repository.py                  repository.py-20060306123302-1f8c5069b3fe0265
  tests/test_repos.py            test_repos.py-20060508151940-ddc49a59257ca712
=== modified file 'repository.py'
--- a/repository.py	2007-12-06 15:54:08 +0000
+++ b/repository.py	2007-12-06 17:51:13 +0000
@@ -766,8 +766,9 @@
                 # check again.
                 raise e
             found = False
-            # TODO: Start at self.revmap.last_revnum_checked(str(scheme))
-            for (branch, revno, _) in self.find_branches(scheme, last_revnum):
+            for (branch, revno, _) in self.find_branches(scheme, 
+                    self.revmap.last_revnum_checked(str(scheme)),
+                    last_revnum):
                 # Look at their bzr:revision-id-vX
                 revids = []
                 try:
@@ -1030,15 +1031,15 @@
 
         return self._ancestry
 
-    def find_branches(self, scheme, revnum=None):
+    def find_branches(self, scheme, from_revnum=0, to_revnum=None):
         """Find all branches that were changed in the specified revision number.
 
         :param revnum: Revision to search for branches.
         :return: iterator that returns tuples with (path, revision number, still exists). The revision number is the revision in which the branch last existed.
         """
         assert scheme is not None
-        if revnum is None:
-            revnum = self.transport.get_latest_revnum()
+        if to_revnum is None:
+            to_revnum = self.transport.get_latest_revnum()
 
         created_branches = {}
 
@@ -1046,8 +1047,8 @@
 
         pb = ui.ui_factory.nested_progress_bar()
         try:
-            for i in range(revnum+1):
-                pb.update("finding branches", i, revnum+1)
+            for i in range(from_revnum, to_revnum+1):
+                pb.update("finding branches", i, to_revnum+1)
                 paths = self._log.get_revision_paths(i)
                 for p in sorted(paths.keys()):
                     if scheme.is_branch(p) or scheme.is_tag(p):
@@ -1088,7 +1089,7 @@
             pb.finished()
 
         for p in created_branches:
-            j = self._log.find_latest_change(p, revnum, 
+            j = self._log.find_latest_change(p, to_revnum, 
                                              include_parents=True,
                                              include_children=True)
             if j is None:

=== modified file 'tests/test_repos.py'
--- a/tests/test_repos.py	2007-11-23 13:20:17 +0000
+++ b/tests/test_repos.py	2007-12-06 17:51:13 +0000
@@ -297,7 +297,23 @@
 
         self.assertEqual([("tags/branchab", 2, True), 
                           ("tags/brancha", 2, True)], 
-                list(repos.find_branches(TrunkBranchingScheme(), 2)))
+                list(repos.find_branches(TrunkBranchingScheme(), to_revnum=2)))
+
+    def test_find_branches_start_revno(self):
+        repos_url = self.make_client("a", "dc")
+        self.build_tree({'dc/branches/brancha': None})
+        self.client_add("dc/branches")
+        self.client_commit("dc", "My Message")
+        self.build_tree({'dc/branches/branchb': None})
+        self.client_add("dc/branches/branchb")
+        self.client_commit("dc", "My Message 2")
+
+        repos = Repository.open(repos_url)
+        repos.set_branching_scheme(TrunkBranchingScheme())
+
+        self.assertEqual([("branches/branchb", 2, True)],
+                list(repos.find_branches(TrunkBranchingScheme(), from_revnum=2, 
+                    to_revnum=2)))
 
     def test_find_branches_file_moved_from_nobranch(self):
         repos_url = self.make_client("a", "dc")
@@ -345,7 +361,7 @@
 
         self.assertEqual([("t2/branches/brancha", 2, True), 
                           ("t2/branches/branchab", 2, True)], 
-                list(repos.find_branches(TrunkBranchingScheme(1), 2)))
+                list(repos.find_branches(TrunkBranchingScheme(1), to_revnum=2)))
 
     def test_find_branches_no(self):
         repos_url = self.make_client("a", "dc")
@@ -354,7 +370,7 @@
         repos.set_branching_scheme(NoBranchingScheme())
 
         self.assertEqual([("", 0, True)], 
-                list(repos.find_branches(NoBranchingScheme(), 0)))
+                list(repos.find_branches(NoBranchingScheme(), to_revnum=0)))
 
     def test_find_branches_no_later(self):
         repos_url = self.make_client("a", "dc")
@@ -363,7 +379,7 @@
         repos.set_branching_scheme(NoBranchingScheme())
 
         self.assertEqual([("", 0, True)], 
-                list(repos.find_branches(NoBranchingScheme(), 0)))
+                list(repos.find_branches(NoBranchingScheme(), to_revnum=0)))
 
     def test_find_branches_trunk_empty(self):
         repos_url = self.make_client("a", "dc")
@@ -372,7 +388,7 @@
         repos.set_branching_scheme(TrunkBranchingScheme())
 
         self.assertEqual([], 
-                list(repos.find_branches(TrunkBranchingScheme(), 0)))
+                list(repos.find_branches(TrunkBranchingScheme(), to_revnum=0)))
 
     def test_find_branches_trunk_one(self):
         repos_url = self.make_client("a", "dc")
@@ -385,7 +401,7 @@
         self.client_commit("dc", "My Message")
 
         self.assertEqual([("trunk", 1, True)], 
-                list(repos.find_branches(TrunkBranchingScheme(), 1)))
+                list(repos.find_branches(TrunkBranchingScheme(), to_revnum=1)))
 
     def test_find_branches_removed(self):
         repos_url = self.make_client("a", "dc")
@@ -401,9 +417,9 @@
         self.client_commit("dc", "remove")
 
         self.assertEqual([("trunk", 1, True)], 
-                list(repos.find_branches(TrunkBranchingScheme(), 1)))
+                list(repos.find_branches(TrunkBranchingScheme(), to_revnum=1)))
         self.assertEqual([("trunk", 1, False)], 
-                list(repos.find_branches(TrunkBranchingScheme(), 2)))
+                list(repos.find_branches(TrunkBranchingScheme(), to_revnum=2)))
 
     def test_url(self):
         """ Test repository URL is kept """




More information about the bazaar-commits mailing list