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