Rev 3535: Handle when an entry is missing in THIS 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:57:45 BST 2008


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

------------------------------------------------------------
revno: 3535
revision-id: john at arbash-meinel.com-20080722215639-vtsdwysizs2m28k6
parent: john at arbash-meinel.com-20080722214713-xpdvsv1aixxq05tn
committer: John Arbash Meinel <john at arbash-meinel.com>
branch nick: merge_lca_multi
timestamp: Tue 2008-07-22 16:56:39 -0500
message:
  Handle when an entry is missing in THIS
-------------- next part --------------
=== modified file 'bzrlib/merge.py'
--- a/bzrlib/merge.py	2008-07-22 21:47:13 +0000
+++ b/bzrlib/merge.py	2008-07-22 21:56:39 +0000
@@ -678,17 +678,24 @@
                 base_executable = base_ie.executable
             else:
                 base_parent_id = base_name = base_executable = None
-            this_ie = self.this_tree.inventory[file_id]
+            if file_id in this_inventory:
+                this_ie = this_inventory[file_id]
+                this_parent_id = this_ie.parent_id
+                this_name = this_ie.name
+                this_executable = this_ie.executable
+            else:
+                this_parent_id = this_name = this_executable = None
+
             result.append((file_id, True,
                            ((base_parent_id,
                             [ie.parent_id for path, ie in lca_values]),
-                            other_ie.parent_id, this_ie.parent_id),
+                            other_ie.parent_id, this_parent_id),
                            ((base_name,
                             [ie.name for path, ie in lca_values]),
-                            other_ie.name, this_ie.name),
+                            other_ie.name, this_name),
                            ((base_executable,
                             [ie.executable for path, ie in lca_values]),
-                            other_ie.executable, this_ie.executable)
+                            other_ie.executable, this_executable)
                           ))
         return result
 

=== modified file 'bzrlib/tests/test_merge.py'
--- a/bzrlib/tests/test_merge.py	2008-07-22 21:47:13 +0000
+++ b/bzrlib/tests/test_merge.py	2008-07-22 21:56:39 +0000
@@ -1105,7 +1105,7 @@
         self.kwargs = kwargs
 
 
-class TestMergerInMemory(TestCaseWithMemoryTransport):
+class TestMergerBase(TestCaseWithMemoryTransport):
     """Tests for Merger that can be done without hitting disk."""
 
     def get_builder(self):
@@ -1153,6 +1153,9 @@
         merger.merge_type = _mod_merge.Merge3Merger
         return merger
 
+
+class TestMergerInMemory(TestMergerBase):
+
     def test_find_base(self):
         merger = self.make_Merger(self.setup_simple_graph(), 'C-id')
         self.assertEqual('A-id', merger.base_rev_id)
@@ -1202,7 +1205,14 @@
         self.assertIsInstance(merge_obj, UnsupportedLCATreesMerger)
         self.assertFalse('lca_trees' in merge_obj.kwargs)
 
-    def test__entries_lca_simple(self):
+
+class TestMergerEntriesLCA(TestMergerBase):
+
+    def make_merge_obj(self, builder, other_revision_id):
+        merger = self.make_Merger(builder, other_revision_id)
+        return merger.make_merger()
+        
+    def test_simple(self):
         builder = self.get_builder()
         builder.build_snapshot('A-id', None,
             [('add', (u'', 'a-root-id', 'directory', None)),
@@ -1215,10 +1225,10 @@
             [('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')
-        merge_obj = merger.make_merger()
+        merge_obj = self.make_merge_obj(builder, 'E-id')
 
         self.assertEqual(['B-id', 'C-id'], sorted(merge_obj._lca_trees.keys()))
+        self.assertEqual('A-id', merge_obj.base_tree.get_revision_id())
         entries = list(merge_obj._entries_lca())
 
         # (file_id, changed, parents, names, executable)
@@ -1234,7 +1244,7 @@
                            ((False, [False, False]), False, False)),
                          ], entries)
 
-    def test__entries_lca_not_in_base(self):
+    def test_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
@@ -1260,9 +1270,10 @@
         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()
+        merge_obj = self.make_merge_obj(builder, 'G-id')
 
+        self.assertEqual(['D-id', 'E-id'], sorted(merge_obj._lca_trees.keys()))
+        self.assertEqual('A-id', merge_obj.base_tree.get_revision_id())
         entries = list(merge_obj._entries_lca())
         # Ignore the root entry, as it looks like it is always modified when it
         # really isn't
@@ -1274,6 +1285,37 @@
                            ((None, [u'bar', u'bar']), u'bar', u'bar'),
                            ((None, [False, False]), False, False)),
                          ], entries)
+
+    def test_not_in_this(self):
+        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'))])
+        builder.build_snapshot('C-id', ['A-id'],
+            [('modify', ('a-id', 'a\nb\nC\nc\n'))])
+        builder.build_snapshot('B-id', ['A-id'],
+            [('modify', ('a-id', 'a\nB\nb\nc\n'))])
+        builder.build_snapshot('E-id', ['C-id', 'B-id'],
+            [('modify', ('a-id', 'a\nB\nb\nC\nc\nE\n'))])
+        builder.build_snapshot('D-id', ['B-id', 'C-id'],
+            [('unversion', 'a-id')])
+        merge_obj = self.make_merge_obj(builder, 'E-id')
+
+        self.assertEqual(['B-id', 'C-id'], sorted(merge_obj._lca_trees.keys()))
+        self.assertEqual('A-id', merge_obj.base_tree.get_revision_id())
+
+        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([('a-id', True,
+                           ((root_id, [root_id, root_id]), root_id, None),
+                           ((u'a', [u'a', u'a']), u'a', None),
+                           ((False, [False, False]), False, None)),
+                         ], entries)
+
     # TODO: cases to test
     #       simple criss-cross LCAS identical, BASE different
     #       x-x changed from BASE but identical for all LCAs and tips



More information about the bazaar-commits mailing list