Rev 4649: Fix test_merge_missing for lock strictness. Merger was creating a new revision tree unnecessarily, so add an api to cache the revision trees more comprehensively and use it. in http://bazaar.launchpad.net/~lifeless/bzr/shelve-locks

Robert Collins robertc at robertcollins.net
Tue Aug 25 20:58:38 BST 2009


At http://bazaar.launchpad.net/~lifeless/bzr/shelve-locks

------------------------------------------------------------
revno: 4649
revision-id: robertc at robertcollins.net-20090825195832-oz7fisc4vhxw6xpz
parent: pqm at pqm.ubuntu.com-20090825113906-x2x2y605527kunf4
committer: Robert Collins <robertc at robertcollins.net>
branch nick: shelve-locks
timestamp: Wed 2009-08-26 05:58:32 +1000
message:
  Fix test_merge_missing for lock strictness. Merger was creating a new revision tree unnecessarily, so add an api to cache the revision trees more comprehensively and use it.
=== modified file 'bzrlib/merge.py'
--- a/bzrlib/merge.py	2009-08-20 03:06:50 +0000
+++ b/bzrlib/merge.py	2009-08-25 19:58:32 +0000
@@ -106,6 +106,17 @@
         self._is_criss_cross = None
         self._lca_trees = None
 
+    def cache_trees_with_revision_ids(self, trees):
+        """Cache any tree in trees if it has a revision_id."""
+        for maybe_tree in trees:
+            if maybe_tree is None:
+                continue
+            try:
+                rev_id = maybe_tree.get_revision_id()
+            except AttributeError:
+                continue
+            self._cached_trees[rev_id] = maybe_tree
+
     @property
     def revision_graph(self):
         if self._revision_graph is None:
@@ -1520,6 +1531,7 @@
     get_revision_id = getattr(base_tree, 'get_revision_id', None)
     if get_revision_id is None:
         get_revision_id = base_tree.last_revision
+    merger.cache_trees_with_revision_ids([other_tree, base_tree, this_tree])
     merger.set_base_revision(get_revision_id(), this_branch)
     return merger.do_merge()
 

=== modified file 'bzrlib/tests/test_merge.py'
--- a/bzrlib/tests/test_merge.py	2009-08-20 04:09:58 +0000
+++ b/bzrlib/tests/test_merge.py	2009-08-25 19:58:32 +0000
@@ -213,19 +213,20 @@
         self.assertFileEqual('text2', 'tree/sub-tree/file')
 
     def test_merge_with_missing(self):
-        self.thisFailsStrictLockCheck()
         tree_a = self.make_branch_and_tree('tree_a')
         self.build_tree_contents([('tree_a/file', 'content_1')])
         tree_a.add('file')
         tree_a.commit('commit base')
         # basis_tree() is only guaranteed to be valid as long as it is actually
-        # the basis tree. This mutates the tree after grabbing basis, so go to
-        # the repository.
+        # the basis tree. This test commits to the tree after grabbing basis,
+        # so we go to the repository.
         base_tree = tree_a.branch.repository.revision_tree(tree_a.last_revision())
         tree_b = tree_a.bzrdir.sprout('tree_b').open_workingtree()
         self.build_tree_contents([('tree_a/file', 'content_2')])
         tree_a.commit('commit other')
         other_tree = tree_a.basis_tree()
+        # 'file' is now missing but isn't altered in any commit in b so no
+        # change should be applied.
         os.unlink('tree_b/file')
         merge_inner(tree_b.branch, other_tree, base_tree, this_tree=tree_b)
 
@@ -1233,6 +1234,27 @@
 
 class TestMergerInMemory(TestMergerBase):
 
+    def test_cache_trees_with_revision_ids_None(self):
+        merger = self.make_Merger(self.setup_simple_graph(), 'C-id')
+        original_cache = dict(merger._cached_trees)
+        merger.cache_trees_with_revision_ids([None])
+        self.assertEqual(original_cache, merger._cached_trees)
+
+    def test_cache_trees_with_revision_ids_no_revision_id(self):
+        merger = self.make_Merger(self.setup_simple_graph(), 'C-id')
+        original_cache = dict(merger._cached_trees)
+        tree = self.make_branch_and_memory_tree('tree')
+        merger.cache_trees_with_revision_ids([tree])
+        self.assertEqual(original_cache, merger._cached_trees)
+
+    def test_cache_trees_with_revision_ids_having_revision_id(self):
+        merger = self.make_Merger(self.setup_simple_graph(), 'C-id')
+        original_cache = dict(merger._cached_trees)
+        tree = merger.this_branch.repository.revision_tree('B-id')
+        original_cache['B-id'] = tree
+        merger.cache_trees_with_revision_ids([tree])
+        self.assertEqual(original_cache, merger._cached_trees)
+
     def test_find_base(self):
         merger = self.make_Merger(self.setup_simple_graph(), 'C-id')
         self.assertEqual('A-id', merger.base_rev_id)




More information about the bazaar-commits mailing list