Rev 3534: Test the case where BASE is missing a file that is present in THIS, OTHER and all LCAs. in http://bzr.arbash-meinel.com/branches/bzr/1.7-dev/merge_lca_multi

John Arbash Meinel john at arbash-meinel.com
Tue Jul 22 22:48:18 BST 2008


At http://bzr.arbash-meinel.com/branches/bzr/1.7-dev/merge_lca_multi

------------------------------------------------------------
revno: 3534
revision-id: john at arbash-meinel.com-20080722214713-xpdvsv1aixxq05tn
parent: john at arbash-meinel.com-20080722204243-g10pvu93lxihrpk7
committer: John Arbash Meinel <john at arbash-meinel.com>
branch nick: merge_lca_multi
timestamp: Tue 2008-07-22 16:47:13 -0500
message:
  Test the case where BASE is missing a file that is present in THIS, OTHER and all LCAs.
  Also include both the case where the file is modified, and where it isn't.
-------------- next part --------------
=== modified file 'bzrlib/merge.py'
--- a/bzrlib/merge.py	2008-07-22 19:52:53 +0000
+++ b/bzrlib/merge.py	2008-07-22 21:47:13 +0000
@@ -661,6 +661,8 @@
         walker = _mod_tree.MultiWalker(self.other_tree,
                                        self._lca_trees.values())
 
+        base_inventory = self.base_tree.inventory
+        this_inventory = self.this_tree.inventory
         for path, file_id, other_ie, lca_values in walker.iter_all():
             # Is this modified at all from any of the other trees?
             last_rev = other_ie.revision
@@ -669,16 +671,22 @@
                     break
             else: # Identical in all trees
                 continue
-            base_ie = self.base_tree.inventory[file_id]
+            if file_id in base_inventory:
+                base_ie = self.base_tree.inventory[file_id]
+                base_parent_id = base_ie.parent_id
+                base_name = base_ie.name
+                base_executable = base_ie.executable
+            else:
+                base_parent_id = base_name = base_executable = None
             this_ie = self.this_tree.inventory[file_id]
             result.append((file_id, True,
-                           ((base_ie.parent_id,
+                           ((base_parent_id,
                             [ie.parent_id for path, ie in lca_values]),
                             other_ie.parent_id, this_ie.parent_id),
-                           ((base_ie.name,
+                           ((base_name,
                             [ie.name for path, ie in lca_values]),
                             other_ie.name, this_ie.name),
-                           ((base_ie.executable,
+                           ((base_executable,
                             [ie.executable for path, ie in lca_values]),
                             other_ie.executable, this_ie.executable)
                           ))

=== modified file 'bzrlib/tests/test_merge.py'
--- a/bzrlib/tests/test_merge.py	2008-07-22 20:42:43 +0000
+++ b/bzrlib/tests/test_merge.py	2008-07-22 21:47:13 +0000
@@ -1108,6 +1108,12 @@
 class TestMergerInMemory(TestCaseWithMemoryTransport):
     """Tests for Merger that can be done without hitting disk."""
 
+    def get_builder(self):
+        builder = self.make_branch_builder('path')
+        builder.start_series()
+        self.addCleanup(builder.finish_series)
+        return builder
+
     def setup_simple_graph(self):
         """Create a simple 3-node graph.
                 A
@@ -1116,9 +1122,7 @@
 
         :return: A BranchBuilder
         """
-        builder = self.make_branch_builder('path')
-        builder.start_series()
-        self.addCleanup(builder.finish_series)
+        builder = self.get_builder()
         builder.build_snapshot('A-id', None,
             [('add', ('', None, 'directory', None))])
         builder.build_snapshot('C-id', ['A-id'], [])
@@ -1139,22 +1143,24 @@
         builder.build_snapshot('D-id', ['B-id', 'C-id'], [])
         return builder
 
-    def make_merger(self, builder, other_revision_id):
+    def make_Merger(self, builder, other_revision_id):
         """Make a Merger object from a branch builder"""
         mem_tree = memorytree.MemoryTree.create_on_branch(builder.get_branch())
         mem_tree.lock_write()
         self.addCleanup(mem_tree.unlock)
-        return _mod_merge.Merger.from_revision_ids(progress.DummyProgress(),
+        merger = _mod_merge.Merger.from_revision_ids(progress.DummyProgress(),
             mem_tree, other_revision_id)
+        merger.merge_type = _mod_merge.Merge3Merger
+        return merger
 
     def test_find_base(self):
-        merger = self.make_merger(self.setup_simple_graph(), 'C-id')
+        merger = self.make_Merger(self.setup_simple_graph(), '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):
-        merger = self.make_merger(self.setup_criss_cross_graph(), 'E-id')
+        merger = self.make_Merger(self.setup_criss_cross_graph(), '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()))
@@ -1163,14 +1169,14 @@
         class LCATreesMerger(LoggingMerger):
             supports_lca_trees = True
 
-        merger = self.make_merger(self.setup_simple_graph(), 'C-id')
+        merger = self.make_Merger(self.setup_simple_graph(), 'C-id')
         merger.merge_type = LCATreesMerger
         merge_obj = merger.make_merger()
         self.assertIsInstance(merge_obj, LCATreesMerger)
         self.assertFalse('lca_trees' in merge_obj.kwargs)
 
     def test_criss_cross_passed_to_merge_type(self):
-        merger = self.make_merger(self.setup_criss_cross_graph(), 'E-id')
+        merger = self.make_Merger(self.setup_criss_cross_graph(), 'E-id')
         merger.merge_type = _mod_merge.Merge3Merger
         merge_obj = merger.make_merger()
         self.assertEqual(['B-id', 'C-id'], sorted(merge_obj._lca_trees.keys()))
@@ -1180,7 +1186,7 @@
             # We intentionally do not define supports_lca_trees
             pass
 
-        merger = self.make_merger(self.setup_criss_cross_graph(), 'E-id')
+        merger = self.make_Merger(self.setup_criss_cross_graph(), 'E-id')
         merger.merge_type = NoLCATreesMerger
         merge_obj = merger.make_merger()
         self.assertIsInstance(merge_obj, NoLCATreesMerger)
@@ -1190,16 +1196,14 @@
         class UnsupportedLCATreesMerger(LoggingMerger):
             supports_lca_trees = False
 
-        merger = self.make_merger(self.setup_criss_cross_graph(), 'E-id')
+        merger = self.make_Merger(self.setup_criss_cross_graph(), 'E-id')
         merger.merge_type = UnsupportedLCATreesMerger
         merge_obj = merger.make_merger()
         self.assertIsInstance(merge_obj, UnsupportedLCATreesMerger)
         self.assertFalse('lca_trees' in merge_obj.kwargs)
 
     def test__entries_lca_simple(self):
-        builder = self.make_branch_builder('tree')
-        builder.start_series()
-        self.addCleanup(builder.finish_series)
+        builder = self.get_builder()
         builder.build_snapshot('A-id', None,
             [('add', (u'', 'a-root-id', 'directory', None)),
              ('add', (u'a', 'a-id', 'file', 'a\nb\nc\n'))])
@@ -1211,12 +1215,11 @@
             [('modify', ('a-id', 'a\nB\nb\nC\nc\nE\n'))])
         builder.build_snapshot('D-id', ['B-id', 'C-id'],
             [('modify', ('a-id', 'a\nB\nb\nC\nc\n'))])
-        merger = self.make_merger(builder, 'E-id')
-        merger.merge_type = _mod_merge.Merge3Merger
+        merger = self.make_Merger(builder, 'E-id')
         merge_obj = merger.make_merger()
 
+        self.assertEqual(['B-id', 'C-id'], sorted(merge_obj._lca_trees.keys()))
         entries = list(merge_obj._entries_lca())
-        self.assertEqual(['B-id', 'C-id'], sorted(merge_obj._lca_trees.keys()))
 
         # (file_id, changed, parents, names, executable)
         # BASE, lca1, lca2, OTHER, THIS
@@ -1230,11 +1233,51 @@
                            ((u'a', [u'a', u'a']), u'a', u'a'),
                            ((False, [False, False]), False, False)),
                          ], entries)
-                         
-
+
+    def test__entries_lca_not_in_base(self):
+        # LCA's all have the same last-modified revision for the file, as do
+        # the tips, but the base has something different
+        #       A    base, doesn't have the file
+        #       |\ 
+        #       B C  B introduces 'foo', C introduces 'bar'
+        #       |X|
+        #       D E  D and E now both have 'foo' and 'bar'
+        #       |X|
+        #       F G  the files are now in F, G, D and E, but not in A
+        #            G modifies 'bar'
+            
+        builder = self.get_builder()
+        builder.build_snapshot('A-id', None,
+            [('add', (u'', 'a-root-id', 'directory', None))])
+        builder.build_snapshot('B-id', ['A-id'],
+            [('add', (u'foo', 'foo-id', 'file', 'a\nb\nc\n'))])
+        builder.build_snapshot('C-id', ['A-id'],
+            [('add', (u'bar', 'bar-id', 'file', 'd\ne\nf\n'))])
+        builder.build_snapshot('D-id', ['B-id', 'C-id'],
+            [('add', (u'bar', 'bar-id', 'file', 'd\ne\nf\n'))])
+        builder.build_snapshot('E-id', ['C-id', 'B-id'],
+            [('add', (u'foo', 'foo-id', 'file', 'a\nb\nc\n'))])
+        builder.build_snapshot('G-id', ['E-id', 'D-id'],
+            [('modify', (u'bar-id', 'd\ne\nf\nG\n'))])
+        builder.build_snapshot('F-id', ['D-id', 'E-id'], [])
+        merger = self.make_Merger(builder, 'G-id')
+        merge_obj = merger.make_merger()
+
+        entries = list(merge_obj._entries_lca())
+        # Ignore the root entry, as it looks like it is always modified when it
+        # really isn't
+        root = entries.pop(0)
+        self.assertEqual('a-root-id', root[0])
+        root_id = 'a-root-id'
+        self.assertEqual([('bar-id', True,
+                           ((None, [root_id, root_id]), root_id, root_id),
+                           ((None, [u'bar', u'bar']), u'bar', u'bar'),
+                           ((None, [False, False]), False, False)),
+                         ], entries)
     # TODO: cases to test
     #       simple criss-cross LCAS identical, BASE different
     #       x-x changed from BASE but identical for all LCAs and tips
+    #               should be possible with the same trick of 'not-in-base'
     #       x-x file not in BASE
     #       x-x file not in THIS
     #       x-x OTHER deletes the file



More information about the bazaar-commits mailing list