24
24
from bzrlib.branch import Branch
25
25
from bzrlib.bzrdir import BzrDir
26
26
from bzrlib.conflicts import ConflictList
27
from bzrlib.delta import compare_trees
28
27
from bzrlib.osutils import abspath
29
28
from bzrlib.tests.blackbox import ExternalBase
30
29
import bzrlib.urlutils as urlutils
63
63
file('hello', 'wt').write('quuux')
64
64
# We can't merge when there are in-tree changes
65
65
self.runbzr('merge ../b', retcode=3)
66
self.runbzr(['commit', '-m', "Like an epidemic of u's"])
66
a = WorkingTree.open('.')
67
a_tip = a.commit("Like an epidemic of u's")
67
68
self.runbzr('merge ../b -r last:1..last:1 --merge-type blooof',
69
70
self.runbzr('merge ../b -r last:1..last:1 --merge-type merge3')
75
76
self.runbzr('merge ../b -r last:1')
76
77
self.check_file_contents('goodbye', 'quux')
77
78
# Merging a branch pulls its revision into the tree
78
a = WorkingTree.open('.')
79
79
b = Branch.open('../b')
80
a.branch.repository.get_revision_xml(b.last_revision())
81
self.log('pending merges: %s', a.pending_merges())
82
self.assertEquals(a.pending_merges(),
84
self.runbzr('commit -m merged')
80
b_tip = b.last_revision()
81
self.failUnless(a.branch.repository.has_revision(b_tip))
82
self.assertEqual([a_tip, b_tip], a.get_parent_ids())
83
self.runbzr('revert --no-backup')
84
out, err = self.runbzr('merge -r revno:1:./hello', retcode=3)
85
self.assertTrue("Not a branch" in err)
86
self.runbzr('merge -r revno:%d:./..revno:%d:../b'
87
%(ancestor,b.revno()))
88
self.assertEquals(a.get_parent_ids(),
89
[a.branch.last_revision(), b.last_revision()])
90
self.check_file_contents('goodbye', 'quux')
91
self.runbzr('revert --no-backup')
92
self.runbzr('merge -r revno:%d:../b'%b.revno())
93
self.assertEquals(a.get_parent_ids(),
94
[a.branch.last_revision(), b.last_revision()])
95
a_tip = a.commit('merged')
85
96
self.runbzr('merge ../b -r last:1')
86
self.assertEqual(a.pending_merges(), [])
97
self.assertEqual([a_tip], a.get_parent_ids())
88
99
def test_merge_with_missing_file(self):
89
100
"""Merge handles missing file conflicts"""
196
207
file('../bundle', 'wb').write(self.runbzr('bundle ../branch_a')[0])
197
208
os.chdir('../branch_a')
198
209
self.runbzr('merge ../bundle', retcode=1)
199
testament_a = Testament.from_revision(tree_a.branch.repository,
200
tree_b.last_revision())
210
testament_a = Testament.from_revision(tree_a.branch.repository,
211
tree_b.get_parent_ids()[0])
201
212
testament_b = Testament.from_revision(tree_b.branch.repository,
202
tree_b.last_revision())
213
tree_b.get_parent_ids()[0])
203
214
self.assertEqualDiff(testament_a.as_text(),
204
215
testament_b.as_text())
205
216
tree_a.set_conflicts(ConflictList())
207
218
# it is legal to attempt to merge an already-merged bundle
208
219
output = self.runbzr('merge ../bundle')[1]
209
220
# but it does nothing
210
self.assertFalse(compare_trees(tree_a.basis_tree(),
211
tree_a).has_changed())
221
self.assertFalse(tree_a.changes_from(tree_a.basis_tree()).has_changed())
212
222
self.assertEqual('Nothing to do.\n', output)
224
def test_merge_uncommitted(self):
225
"""Check that merge --uncommitted behaves properly"""
226
tree_a = self.make_branch_and_tree('a')
227
self.build_tree(['a/file_1', 'a/file_2'])
228
tree_a.add(['file_1', 'file_2'])
229
tree_a.commit('commit 1')
230
tree_b = tree_a.bzrdir.sprout('b').open_workingtree()
231
self.failUnlessExists('b/file_1')
232
tree_a.rename_one('file_1', 'file_i')
233
tree_a.commit('commit 2')
234
tree_a.rename_one('file_2', 'file_ii')
236
self.run_bzr('merge', '../a', '--uncommitted')
237
self.failUnlessExists('file_1')
238
self.failUnlessExists('file_ii')
240
self.run_bzr_error(('Cannot use --uncommitted and --revision',),
241
'merge', '../a', '--uncommitted', '-r1')