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