Rev 3526: Extract the lca trees and the base tree when we find a criss-cross in http://bzr.arbash-meinel.com/branches/bzr/1.6-dev/merge_lca_multi
John Arbash Meinel
john at arbash-meinel.com
Tue Jul 22 03:16:05 BST 2008
At http://bzr.arbash-meinel.com/branches/bzr/1.6-dev/merge_lca_multi
------------------------------------------------------------
revno: 3526
revision-id: john at arbash-meinel.com-20080722021504-swide022hwjx7a7z
parent: john at arbash-meinel.com-20080722020529-58d4f9mtxd2p5dvm
committer: John Arbash Meinel <john at arbash-meinel.com>
branch nick: merge_lca_multi
timestamp: Mon 2008-07-21 21:15:04 -0500
message:
Extract the lca trees and the base tree when we find a criss-cross
-------------- next part --------------
=== modified file 'bzrlib/merge.py'
--- a/bzrlib/merge.py 2008-07-22 02:05:29 +0000
+++ b/bzrlib/merge.py 2008-07-22 02:15:04 +0000
@@ -95,6 +95,7 @@
self._base_is_ancestor = None
self._base_is_other_ancestor = None
self._is_criss_cross = False
+ self._lca_trees = None
@property
def revision_graph(self):
@@ -353,15 +354,30 @@
if NULL_REVISION in revisions:
self.base_rev_id = NULL_REVISION
else:
- self.base_rev_id, steps = self.revision_graph.find_unique_lca(
- revisions[0], revisions[1], count_steps=True)
+ lcas = self.revision_graph.find_lca(revisions[0], revisions[1])
+ if len(lcas) == 0:
+ self.base_rev_id = NULL_REVISION
+ elif len(lcas) == 1:
+ self.base_rev_id = list(lcas)[0]
+ else: # len(lcas) > 1
+ self.base_rev_id = self.revision_graph.find_unique_lca(
+ *lcas)
+ self._is_criss_cross = True
if self.base_rev_id == NULL_REVISION:
raise UnrelatedBranches()
- if steps > 1:
+ if self._is_criss_cross:
warning('Warning: criss-cross merge encountered. See bzr'
' help criss-cross.')
- self._is_criss_cross = True
- self.base_tree = self.revision_tree(self.base_rev_id)
+ interesting_revision_ids = [self.base_rev_id]
+ interesting_revision_ids.extend(lcas)
+ interesting_trees = dict((t.get_revision_id(), t)
+ for t in self.this_branch.repository.revision_trees(
+ interesting_revision_ids))
+ self._cached_trees.update(interesting_trees)
+ self.base_tree = interesting_trees.pop(self.base_rev_id)
+ self._lca_trees = interesting_trees
+ else:
+ self.base_tree = self.revision_tree(self.base_rev_id)
self.base_is_ancestor = True
self.base_is_other_ancestor = True
=== modified file 'bzrlib/tests/test_merge.py'
--- a/bzrlib/tests/test_merge.py 2008-07-22 02:05:29 +0000
+++ b/bzrlib/tests/test_merge.py 2008-07-22 02:15:04 +0000
@@ -731,6 +731,7 @@
tree, 'C-id')
self.assertEqual('A-id', merger.base_rev_id)
self.assertFalse(merger._is_criss_cross)
+ self.assertIs(None, merger._lca_trees)
def test_find_base_criss_cross(self):
# A
@@ -756,3 +757,4 @@
tree, 'E-id')
self.assertEqual('A-id', merger.base_rev_id)
self.assertTrue(merger._is_criss_cross)
+ self.assertEqual(['B-id', 'C-id'], sorted(merger._lca_trees.keys()))
More information about the bazaar-commits
mailing list