1
# Copyright (C) 2005-2010 Canonical Ltd
1
# Copyright (C) 2005-2012 Canonical Ltd
3
3
# This program is free software; you can redistribute it and/or modify
4
4
# it under the terms of the GNU General Public License as published by
83
83
tip = wt1.commit('empty commit')
84
84
wt2 = self.make_branch_and_tree('branch2')
85
85
wt2.pull(wt1.branch)
86
file('branch1/foo', 'wb').write('foo')
87
file('branch1/bar', 'wb').write('bar')
86
with file('branch1/foo', 'wb') as f:
88
with file('branch1/bar', 'wb') as f:
90
92
wt1.commit('add foobar')
92
self.run_bzr('merge ../branch1/baz', retcode=3)
93
self.run_bzr('merge ../branch1/foo')
94
self.assertPathExists('foo')
95
self.assertPathDoesNotExist('bar')
96
wt2 = WorkingTree.open('.') # opens branch2
93
self.run_bzr('merge ../branch1/baz', retcode=3, working_dir='branch2')
94
self.run_bzr('merge ../branch1/foo', working_dir='branch2')
95
self.assertPathExists('branch2/foo')
96
self.assertPathDoesNotExist('branch2/bar')
97
wt2 = WorkingTree.open('branch2')
97
98
self.assertEqual([tip], wt2.get_parent_ids())
99
100
def test_pending_with_null(self):
151
152
def test_create_rename(self):
152
153
"""Rename an inventory entry while creating the file"""
153
154
tree =self.make_branch_and_tree('.')
154
file('name1', 'wb').write('Hello')
155
with file('name1', 'wb') as f: f.write('Hello')
155
156
tree.add('name1')
156
157
tree.commit(message="hello")
157
158
tree.rename_one('name1', 'name2')
164
165
os.mkdir('dirname1')
165
166
tree.add('dirname1')
166
167
filename = pathjoin('dirname1', 'name1')
167
file(filename, 'wb').write('Hello')
168
with file(filename, 'wb') as f: f.write('Hello')
168
169
tree.add(filename)
169
170
tree.commit(message="hello")
170
171
filename2 = pathjoin('dirname1', 'name2')
227
228
def test_nested_merge(self):
228
229
tree = self.make_branch_and_tree('tree',
229
format='dirstate-with-subtree')
230
format='development-subtree')
230
231
sub_tree = self.make_branch_and_tree('tree/sub-tree',
231
format='dirstate-with-subtree')
232
format='development-subtree')
232
233
sub_tree.set_root_id('sub-tree-root')
233
234
self.build_tree_contents([('tree/sub-tree/file', 'text1')])
234
235
sub_tree.add('file')
446
447
merger.merge_type = _mod_merge.Merge3Merger
447
448
tree_merger = merger.make_merger()
448
449
self.assertIs(_mod_merge.Merge3Merger, tree_merger.__class__)
449
self.assertEqual('rev2b', tree_merger.other_tree.get_revision_id())
450
self.assertEqual('rev1', tree_merger.base_tree.get_revision_id())
450
self.assertEqual('rev2b',
451
tree_merger.other_tree.get_revision_id())
452
self.assertEqual('rev1',
453
tree_merger.base_tree.get_revision_id())
454
self.assertEqual(other_tree.branch, tree_merger.other_branch)
452
456
def test_make_preview_transform(self):
453
457
this_tree = self.make_branch_and_tree('this')
2630
2634
# Tested with a real WT, because BranchBuilder/MemoryTree don't handle
2631
2635
# 'tree-reference'
2632
2636
wt = self.make_branch_and_tree('tree',
2633
format='dirstate-with-subtree')
2637
format='development-subtree')
2634
2638
wt.lock_write()
2635
2639
self.addCleanup(wt.unlock)
2636
2640
sub_tree = self.make_branch_and_tree('tree/sub-tree',
2637
format='dirstate-with-subtree')
2641
format='development-subtree')
2638
2642
wt.set_root_id('a-root-id')
2639
2643
sub_tree.set_root_id('sub-tree-root')
2640
2644
self.build_tree_contents([('tree/sub-tree/file', 'text1')])
2665
2669
# Tested with a real WT, because BranchBuilder/MemoryTree don't handle
2666
2670
# 'tree-reference'
2667
2671
wt = self.make_branch_and_tree('tree',
2668
format='dirstate-with-subtree')
2672
format='development-subtree')
2669
2673
wt.lock_write()
2670
2674
self.addCleanup(wt.unlock)
2671
2675
sub_tree = self.make_branch_and_tree('tree/sub',
2672
format='dirstate-with-subtree')
2676
format='development-subtree')
2673
2677
wt.set_root_id('a-root-id')
2674
2678
sub_tree.set_root_id('sub-tree-root')
2675
2679
self.build_tree_contents([('tree/sub/file', 'text1')])
2704
2708
# Tested with a real WT, because BranchBuilder/MemoryTree don't handle
2705
2709
# 'tree-reference'
2706
2710
wt = self.make_branch_and_tree('tree',
2707
format='dirstate-with-subtree')
2711
format='development-subtree')
2708
2712
wt.lock_write()
2709
2713
self.addCleanup(wt.unlock)
2710
2714
sub_tree = self.make_branch_and_tree('tree/sub',
2711
format='dirstate-with-subtree')
2715
format='development-subtree')
2712
2716
wt.set_root_id('a-root-id')
2713
2717
sub_tree.set_root_id('sub-tree-root')
2714
2718
self.build_tree_contents([('tree/sub/file', 'text1')])
2747
2751
# Tested with a real WT, because BranchBuilder/MemoryTree don't handle
2748
2752
# 'tree-reference'
2749
2753
wt = self.make_branch_and_tree('tree',
2750
format='dirstate-with-subtree')
2754
format='development-subtree')
2751
2755
wt.lock_write()
2752
2756
self.addCleanup(wt.unlock)
2753
2757
sub_tree = self.make_branch_and_tree('tree/sub',
2754
format='dirstate-with-subtree')
2758
format='development-subtree')
2755
2759
wt.set_root_id('a-root-id')
2756
2760
sub_tree.set_root_id('sub-tree-root')
2757
2761
self.build_tree_contents([('tree/sub/file', 'text1')])
3242
3246
# The dest tree is unmodified.
3243
3247
self.assertEqual(['r1-dest'], dest_wt.get_parent_ids())
3244
3248
self.assertTreeEntriesEqual([('', 'dest-root-id')], dest_wt)
3251
class TestMergeHooks(TestCaseWithTransport):
3254
super(TestMergeHooks, self).setUp()
3255
self.tree_a = self.make_branch_and_tree('tree_a')
3256
self.build_tree_contents([('tree_a/file', 'content_1')])
3257
self.tree_a.add('file', 'file-id')
3258
self.tree_a.commit('added file')
3260
self.tree_b = self.tree_a.bzrdir.sprout('tree_b').open_workingtree()
3261
self.build_tree_contents([('tree_b/file', 'content_2')])
3262
self.tree_b.commit('modify file')
3264
def test_pre_merge_hook_inject_different_tree(self):
3265
tree_c = self.tree_b.bzrdir.sprout('tree_c').open_workingtree()
3266
self.build_tree_contents([('tree_c/file', 'content_3')])
3267
tree_c.commit("more content")
3269
def factory(merger):
3270
self.assertIsInstance(merger, _mod_merge.Merge3Merger)
3271
merger.other_tree = tree_c
3272
calls.append(merger)
3273
_mod_merge.Merger.hooks.install_named_hook('pre_merge',
3274
factory, 'test factory')
3275
self.tree_a.merge_from_branch(self.tree_b.branch)
3277
self.assertFileEqual("content_3", 'tree_a/file')
3278
self.assertLength(1, calls)
3280
def test_post_merge_hook_called(self):
3282
def factory(merger):
3283
self.assertIsInstance(merger, _mod_merge.Merge3Merger)
3284
calls.append(merger)
3285
_mod_merge.Merger.hooks.install_named_hook('post_merge',
3286
factory, 'test factory')
3288
self.tree_a.merge_from_branch(self.tree_b.branch)
3290
self.assertFileEqual("content_2", 'tree_a/file')
3291
self.assertLength(1, calls)