~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_merge.py

  • Committer: Canonical.com Patch Queue Manager
  • Date: 2009-10-06 20:45:48 UTC
  • mfrom: (4728.1.2 integration)
  • Revision ID: pqm@pqm.ubuntu.com-20091006204548-bjnc3z4k256ppimz
MutableTree.has_changes() does not require a tree parameter anymore

Show diffs side-by-side

added added

removed removed

Lines of Context:
36
36
from bzrlib.osutils import pathjoin, file_kind
37
37
from bzrlib.tests import TestCaseWithTransport, TestCaseWithMemoryTransport
38
38
from bzrlib.workingtree import WorkingTree
39
 
 
 
39
from bzrlib.transform import TreeTransform
40
40
 
41
41
class TestMerge(TestCaseWithTransport):
42
42
    """Test appending more than one revision"""
218
218
        tree_a.add('file')
219
219
        tree_a.commit('commit base')
220
220
        # basis_tree() is only guaranteed to be valid as long as it is actually
221
 
        # the basis tree. This mutates the tree after grabbing basis, so go to
222
 
        # the repository.
 
221
        # the basis tree. This test commits to the tree after grabbing basis,
 
222
        # so we go to the repository.
223
223
        base_tree = tree_a.branch.repository.revision_tree(tree_a.last_revision())
224
224
        tree_b = tree_a.bzrdir.sprout('tree_b').open_workingtree()
225
225
        self.build_tree_contents([('tree_a/file', 'content_2')])
226
226
        tree_a.commit('commit other')
227
227
        other_tree = tree_a.basis_tree()
 
228
        # 'file' is now missing but isn't altered in any commit in b so no
 
229
        # change should be applied.
228
230
        os.unlink('tree_b/file')
229
231
        merge_inner(tree_b.branch, other_tree, base_tree, this_tree=tree_b)
230
232
 
1095
1097
            '>>>>>>> MERGE-SOURCE\n'
1096
1098
            'line 4\n', 'this/file1')
1097
1099
 
 
1100
    def test_modify_conflicts_with_delete(self):
 
1101
        # If one side deletes a line, and the other modifies that line, then
 
1102
        # the modification should be considered a conflict
 
1103
        builder = self.make_branch_builder('test')
 
1104
        builder.start_series()
 
1105
        builder.build_snapshot('BASE-id', None,
 
1106
            [('add', ('', None, 'directory', None)),
 
1107
             ('add', ('foo', 'foo-id', 'file', 'a\nb\nc\nd\ne\n')),
 
1108
            ])
 
1109
        # Delete 'b\n'
 
1110
        builder.build_snapshot('OTHER-id', ['BASE-id'],
 
1111
            [('modify', ('foo-id', 'a\nc\nd\ne\n'))])
 
1112
        # Modify 'b\n', add 'X\n'
 
1113
        builder.build_snapshot('THIS-id', ['BASE-id'],
 
1114
            [('modify', ('foo-id', 'a\nb2\nc\nd\nX\ne\n'))])
 
1115
        builder.finish_series()
 
1116
        branch = builder.get_branch()
 
1117
        this_tree = branch.bzrdir.create_workingtree()
 
1118
        this_tree.lock_write()
 
1119
        self.addCleanup(this_tree.unlock)
 
1120
        other_tree = this_tree.bzrdir.sprout('other', 'OTHER-id').open_workingtree()
 
1121
        self.do_merge(this_tree, other_tree)
 
1122
        if self.merge_type is _mod_merge.LCAMerger:
 
1123
            self.expectFailure("lca merge doesn't track deleted lines",
 
1124
                self.assertFileEqual,
 
1125
                    'a\n'
 
1126
                    '<<<<<<< TREE\n'
 
1127
                    'b2\n'
 
1128
                    '=======\n'
 
1129
                    '>>>>>>> MERGE-SOURCE\n'
 
1130
                    'c\n'
 
1131
                    'd\n'
 
1132
                    'X\n'
 
1133
                    'e\n', 'test/foo')
 
1134
        else:
 
1135
            self.assertFileEqual(
 
1136
                'a\n'
 
1137
                '<<<<<<< TREE\n'
 
1138
                'b2\n'
 
1139
                '=======\n'
 
1140
                '>>>>>>> MERGE-SOURCE\n'
 
1141
                'c\n'
 
1142
                'd\n'
 
1143
                'X\n'
 
1144
                'e\n', 'test/foo')
 
1145
 
 
1146
    def get_limbodir_deletiondir(self, wt):
 
1147
        transform = TreeTransform(wt)
 
1148
        limbodir = transform._limbodir
 
1149
        deletiondir = transform._deletiondir
 
1150
        transform.finalize()
 
1151
        return (limbodir, deletiondir)
 
1152
    
 
1153
    def test_merge_with_existing_limbo(self):
 
1154
        wt = self.make_branch_and_tree('this')
 
1155
        (limbodir, deletiondir) =  self.get_limbodir_deletiondir(wt)
 
1156
        os.mkdir(limbodir)
 
1157
        self.assertRaises(errors.ExistingLimbo, self.do_merge, wt, wt)
 
1158
        self.assertRaises(errors.LockError, wt.unlock)
 
1159
 
 
1160
    def test_merge_with_pending_deletion(self):
 
1161
        wt = self.make_branch_and_tree('this')
 
1162
        (limbodir, deletiondir) =  self.get_limbodir_deletiondir(wt)
 
1163
        os.mkdir(deletiondir)
 
1164
        self.assertRaises(errors.ExistingPendingDeletion, self.do_merge, wt, wt)
 
1165
        self.assertRaises(errors.LockError, wt.unlock)
 
1166
 
1098
1167
 
1099
1168
class TestMerge3Merge(TestCaseWithTransport, TestMergeImplementation):
1100
1169
 
1186
1255
 
1187
1256
class TestMergerInMemory(TestMergerBase):
1188
1257
 
 
1258
    def test_cache_trees_with_revision_ids_None(self):
 
1259
        merger = self.make_Merger(self.setup_simple_graph(), 'C-id')
 
1260
        original_cache = dict(merger._cached_trees)
 
1261
        merger.cache_trees_with_revision_ids([None])
 
1262
        self.assertEqual(original_cache, merger._cached_trees)
 
1263
 
 
1264
    def test_cache_trees_with_revision_ids_no_revision_id(self):
 
1265
        merger = self.make_Merger(self.setup_simple_graph(), 'C-id')
 
1266
        original_cache = dict(merger._cached_trees)
 
1267
        tree = self.make_branch_and_memory_tree('tree')
 
1268
        merger.cache_trees_with_revision_ids([tree])
 
1269
        self.assertEqual(original_cache, merger._cached_trees)
 
1270
 
 
1271
    def test_cache_trees_with_revision_ids_having_revision_id(self):
 
1272
        merger = self.make_Merger(self.setup_simple_graph(), 'C-id')
 
1273
        original_cache = dict(merger._cached_trees)
 
1274
        tree = merger.this_branch.repository.revision_tree('B-id')
 
1275
        original_cache['B-id'] = tree
 
1276
        merger.cache_trees_with_revision_ids([tree])
 
1277
        self.assertEqual(original_cache, merger._cached_trees)
 
1278
 
1189
1279
    def test_find_base(self):
1190
1280
        merger = self.make_Merger(self.setup_simple_graph(), 'C-id')
1191
1281
        self.assertEqual('A-id', merger.base_rev_id)