13
13
# You should have received a copy of the GNU General Public License
14
14
# along with this program; if not, write to the Free Software
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18
18
from StringIO import StringIO
35
35
from bzrlib.merge import transform_tree, merge_inner, _PlanMerge
36
36
from bzrlib.osutils import pathjoin, file_kind
37
37
from bzrlib.tests import TestCaseWithTransport, TestCaseWithMemoryTransport
38
from bzrlib.trace import (enable_test_log, disable_test_log)
39
38
from bzrlib.workingtree import WorkingTree
89
88
self.failIfExists('bar')
90
89
wt2 = WorkingTree.open('.') # opens branch2
91
90
self.assertEqual([tip], wt2.get_parent_ids())
93
92
def test_pending_with_null(self):
94
93
"""When base is forced to revno 0, parent_ids are set"""
95
94
wt2 = self.test_unrelated()
96
95
wt1 = WorkingTree.open('.')
98
97
br1.fetch(wt2.branch)
99
# merge all of branch 2 into branch 1 even though they
98
# merge all of branch 2 into branch 1 even though they
100
99
# are not related.
101
100
wt1.merge_from_branch(wt2.branch, wt2.last_revision(), 'null:')
102
101
self.assertEqual([br1.last_revision(), wt2.branch.last_revision()],
150
149
self.addCleanup(tree_b.unlock)
151
150
tree_a.commit(message="hello again")
153
merge_inner(tree_b.branch, tree_a, tree_b.basis_tree(),
152
merge_inner(tree_b.branch, tree_a, tree_b.basis_tree(),
154
153
this_tree=tree_b, ignore_zero=True)
155
154
log = self._get_log(keep_log_file=True)
156
155
self.failUnless('All changes applied successfully.\n' not in log)
158
merge_inner(tree_b.branch, tree_a, tree_b.basis_tree(),
157
merge_inner(tree_b.branch, tree_a, tree_b.basis_tree(),
159
158
this_tree=tree_b, ignore_zero=False)
160
159
log = self._get_log(keep_log_file=True)
161
160
self.failUnless('All changes applied successfully.\n' in log)
248
247
self.assertEqual(tree_b.conflicts(),
249
248
[conflicts.ContentsConflict('file',
250
249
file_id='file-id')])
252
251
def test_merge_type_registry(self):
253
252
merge_type_option = option.Option.OPTIONS['merge-type']
254
self.assertFalse('merge4' in [x[0] for x in
253
self.assertFalse('merge4' in [x[0] for x in
255
254
merge_type_option.iter_switches()])
256
255
registry = _mod_merge.get_merge_type_registry()
257
256
registry.register_lazy('merge4', 'bzrlib.merge', 'Merge4Merger',
258
257
'time-travelling merge')
259
self.assertTrue('merge4' in [x[0] for x in
258
self.assertTrue('merge4' in [x[0] for x in
260
259
merge_type_option.iter_switches()])
261
260
registry.remove('merge4')
262
self.assertFalse('merge4' in [x[0] for x in
261
self.assertFalse('merge4' in [x[0] for x in
263
262
merge_type_option.iter_switches()])
265
264
def test_merge_other_moves_we_deleted(self):
313
312
merger.do_merge()
314
313
self.assertEqual(tree_a.get_parent_ids(), [tree_b.last_revision()])
315
def test_Merger_defaults_to_DummyProgress(self):
316
branch = self.make_branch('branch')
317
merger = _mod_merge.Merger(branch, pb=None)
318
self.assertIsInstance(merger._pb, progress.DummyProgress)
316
320
def prepare_cherrypick(self):
317
321
"""Prepare a pair of trees for cherrypicking tests.
719
723
def test_plan_merge_insert_order(self):
720
724
"""Weave merges are sensitive to the order of insertion.
722
726
Specifically for overlapping regions, it effects which region gets put
723
727
'first'. And when a user resolves an overlapping merge, if they use the
724
728
same ordering, then the lines match the parents, if they don't only
1091
1095
'>>>>>>> MERGE-SOURCE\n'
1092
1096
'line 4\n', 'this/file1')
1098
def test_modify_conflicts_with_delete(self):
1099
# If one side deletes a line, and the other modifies that line, then
1100
# the modification should be considered a conflict
1101
builder = self.make_branch_builder('test')
1102
builder.start_series()
1103
builder.build_snapshot('BASE-id', None,
1104
[('add', ('', None, 'directory', None)),
1105
('add', ('foo', 'foo-id', 'file', 'a\nb\nc\nd\ne\n')),
1108
builder.build_snapshot('OTHER-id', ['BASE-id'],
1109
[('modify', ('foo-id', 'a\nc\nd\ne\n'))])
1110
# Modify 'b\n', add 'X\n'
1111
builder.build_snapshot('THIS-id', ['BASE-id'],
1112
[('modify', ('foo-id', 'a\nb2\nc\nd\nX\ne\n'))])
1113
builder.finish_series()
1114
branch = builder.get_branch()
1115
this_tree = branch.bzrdir.create_workingtree()
1116
this_tree.lock_write()
1117
self.addCleanup(this_tree.unlock)
1118
other_tree = this_tree.bzrdir.sprout('other', 'OTHER-id').open_workingtree()
1119
self.do_merge(this_tree, other_tree)
1120
if self.merge_type is _mod_merge.LCAMerger:
1121
self.expectFailure("lca merge doesn't track deleted lines",
1122
self.assertFileEqual,
1127
'>>>>>>> MERGE-SOURCE\n'
1133
self.assertFileEqual(
1138
'>>>>>>> MERGE-SOURCE\n'
1095
1145
class TestMerge3Merge(TestCaseWithTransport, TestMergeImplementation):