~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/blackbox/test_merge.py

  • Committer: Robert Collins
  • Date: 2007-07-04 08:08:13 UTC
  • mfrom: (2572 +trunk)
  • mto: This revision was merged to the branch mainline in revision 2587.
  • Revision ID: robertc@robertcollins.net-20070704080813-wzebx0r88fvwj5rq
Merge bzr.dev.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2006 Canonical Ltd
 
1
# Copyright (C) 2006, 2007 Canonical Ltd
2
2
#
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
23
23
 
24
24
from bzrlib.branch import Branch
25
25
from bzrlib.bzrdir import BzrDir
26
 
from bzrlib.conflicts import ConflictList
27
 
from bzrlib.osutils import abspath
 
26
from bzrlib.conflicts import ConflictList, ContentsConflict
 
27
from bzrlib.osutils import abspath, file_kind
28
28
from bzrlib.tests.blackbox import ExternalBase
29
29
import bzrlib.urlutils as urlutils
30
30
from bzrlib.workingtree import WorkingTree
33
33
class TestMerge(ExternalBase):
34
34
 
35
35
    def example_branch(test):
36
 
        test.runbzr('init')
 
36
        test.run_bzr('init')
37
37
        file('hello', 'wt').write('foo')
38
 
        test.runbzr('add hello')
39
 
        test.runbzr('commit -m setup hello')
 
38
        test.run_bzr('add hello')
 
39
        test.run_bzr('commit -m setup hello')
40
40
        file('goodbye', 'wt').write('baz')
41
 
        test.runbzr('add goodbye')
42
 
        test.runbzr('commit -m setup goodbye')
 
41
        test.run_bzr('add goodbye')
 
42
        test.run_bzr('commit -m setup goodbye')
43
43
 
44
44
    def test_merge_reprocess(self):
45
45
        d = BzrDir.create_standalone_workingtree('.')
54
54
        self.example_branch()
55
55
        ancestor = Branch.open('.').revno()
56
56
        os.chdir('..')
57
 
        self.runbzr('branch a b')
 
57
        self.run_bzr('branch a b')
58
58
        os.chdir('b')
59
59
        file('goodbye', 'wt').write('quux')
60
 
        self.runbzr(['commit',  '-m',  "more u's are always good"])
 
60
        self.run_bzr(['commit',  '-m',  "more u's are always good"])
61
61
 
62
62
        os.chdir('../a')
63
63
        file('hello', 'wt').write('quuux')
64
64
        # We can't merge when there are in-tree changes
65
 
        self.runbzr('merge ../b', retcode=3)
 
65
        self.run_bzr('merge ../b', retcode=3)
66
66
        a = WorkingTree.open('.')
67
67
        a_tip = a.commit("Like an epidemic of u's")
68
 
        self.runbzr('merge ../b -r last:1..last:1 --merge-type blooof',
 
68
        self.run_bzr('merge ../b -r last:1..last:1 --merge-type blooof',
69
69
                    retcode=3)
70
 
        self.runbzr('merge ../b -r last:1..last:1 --merge-type merge3')
71
 
        self.runbzr('revert --no-backup')
72
 
        self.runbzr('merge ../b -r last:1..last:1 --merge-type weave')
73
 
        self.runbzr('revert --no-backup')
74
 
        self.runbzr('merge ../b -r last:1..last:1 --reprocess')
75
 
        self.runbzr('revert --no-backup')
76
 
        self.runbzr('merge ../b -r last:1')
 
70
        self.run_bzr('merge ../b -r last:1..last:1 --merge-type merge3')
 
71
        self.run_bzr('revert --no-backup')
 
72
        self.run_bzr('merge ../b -r last:1..last:1 --merge-type weave')
 
73
        self.run_bzr('revert --no-backup')
 
74
        self.run_bzr('merge ../b -r last:1..last:1 --reprocess')
 
75
        self.run_bzr('revert --no-backup')
 
76
        self.run_bzr('merge ../b -r last:1')
77
77
        self.check_file_contents('goodbye', 'quux')
78
78
        # Merging a branch pulls its revision into the tree
79
79
        b = Branch.open('../b')
80
80
        b_tip = b.last_revision()
81
81
        self.failUnless(a.branch.repository.has_revision(b_tip))
82
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)
 
83
        self.run_bzr('revert --no-backup')
 
84
        out, err = self.run_bzr('merge -r revno:1:./hello', retcode=3)
85
85
        self.assertTrue("Not a branch" in err)
86
 
        self.runbzr('merge -r revno:%d:./..revno:%d:../b'
 
86
        self.run_bzr('merge -r revno:%d:./..revno:%d:../b'
87
87
                    %(ancestor,b.revno()))
88
88
        self.assertEquals(a.get_parent_ids(), 
89
89
                          [a.branch.last_revision(), b.last_revision()])
90
90
        self.check_file_contents('goodbye', 'quux')
91
 
        self.runbzr('revert --no-backup')
92
 
        self.runbzr('merge -r revno:%d:../b'%b.revno())
 
91
        self.run_bzr('revert --no-backup')
 
92
        self.run_bzr('merge -r revno:%d:../b'%b.revno())
93
93
        self.assertEquals(a.get_parent_ids(),
94
94
                          [a.branch.last_revision(), b.last_revision()])
95
95
        a_tip = a.commit('merged')
96
 
        self.runbzr('merge ../b -r last:1')
 
96
        self.run_bzr('merge ../b -r last:1')
97
97
        self.assertEqual([a_tip], a.get_parent_ids())
98
98
 
99
99
    def test_merge_with_missing_file(self):
104
104
        print >> file('sub/a.txt', 'wb'), "hello"
105
105
        print >> file('b.txt', 'wb'), "hello"
106
106
        print >> file('sub/c.txt', 'wb'), "hello"
107
 
        self.runbzr('init')
108
 
        self.runbzr('add')
109
 
        self.runbzr(('commit', '-m', 'added a'))
110
 
        self.runbzr('branch . ../b')
 
107
        self.run_bzr('init')
 
108
        self.run_bzr('add')
 
109
        self.run_bzr(['commit', '-m', 'added a'])
 
110
        self.run_bzr('branch . ../b')
111
111
        print >> file('sub/a.txt', 'ab'), "there"
112
112
        print >> file('b.txt', 'ab'), "there"
113
113
        print >> file('sub/c.txt', 'ab'), "there"
114
 
        self.runbzr(('commit', '-m', 'Added there'))
 
114
        self.run_bzr(['commit', '-m', 'Added there'])
115
115
        os.unlink('sub/a.txt')
116
116
        os.unlink('sub/c.txt')
117
117
        os.rmdir('sub')
118
118
        os.unlink('b.txt')
119
 
        self.runbzr(('commit', '-m', 'Removed a.txt'))
 
119
        self.run_bzr(['commit', '-m', 'Removed a.txt'])
120
120
        os.chdir('../b')
121
121
        print >> file('sub/a.txt', 'ab'), "something"
122
122
        print >> file('b.txt', 'ab'), "something"
123
123
        print >> file('sub/c.txt', 'ab'), "something"
124
 
        self.runbzr(('commit', '-m', 'Modified a.txt'))
125
 
        self.runbzr('merge ../a/', retcode=1)
 
124
        self.run_bzr(['commit', '-m', 'Modified a.txt'])
 
125
        self.run_bzr('merge ../a/', retcode=1)
126
126
        self.assert_(os.path.exists('sub/a.txt.THIS'))
127
127
        self.assert_(os.path.exists('sub/a.txt.BASE'))
128
128
        os.chdir('../a')
129
 
        self.runbzr('merge ../b/', retcode=1)
 
129
        self.run_bzr('merge ../b/', retcode=1)
130
130
        self.assert_(os.path.exists('sub/a.txt.OTHER'))
131
131
        self.assert_(os.path.exists('sub/a.txt.BASE'))
132
132
 
153
153
        self.assertEqual(None, branch_b.get_parent())
154
154
        # test merge for failure without parent set
155
155
        os.chdir('branch_b')
156
 
        out = self.runbzr('merge', retcode=3)
 
156
        out = self.run_bzr('merge', retcode=3)
157
157
        self.assertEquals(out,
158
158
                ('','bzr: ERROR: No location specified or remembered\n'))
159
159
        # test implicit --remember when no parent set, this merge conflicts
160
160
        self.build_tree(['d'])
161
161
        tree_b.add('d')
162
 
        out = self.runbzr('merge ../branch_a', retcode=3)
 
162
        out = self.run_bzr('merge ../branch_a', retcode=3)
163
163
        self.assertEquals(out,
164
164
                ('','bzr: ERROR: Working tree has uncommitted changes.\n'))
165
165
        self.assertEquals(abspath(branch_b.get_parent()), abspath(parent))
166
166
        # test implicit --remember after resolving conflict
167
167
        tree_b.commit('commit d')
168
 
        out, err = self.runbzr('merge')
 
168
        out, err = self.run_bzr('merge')
169
169
        
170
170
        base = urlutils.local_path_from_url(branch_a.base)
171
171
        self.assertEquals(out, 'Merging from remembered location %s\n' % (base,))
172
 
        self.assertEquals(err, 'All changes applied successfully.\n')
 
172
        self.assertEquals(err, '+N  b\nAll changes applied successfully.\n')
173
173
        self.assertEquals(abspath(branch_b.get_parent()), abspath(parent))
174
 
        # re-open tree as external runbzr modified it
 
174
        # re-open tree as external run_bzr modified it
175
175
        tree_b = branch_b.bzrdir.open_workingtree()
176
176
        tree_b.commit('merge branch_a')
177
177
        # test explicit --remember
178
 
        out, err = self.runbzr('merge ../branch_c --remember')
 
178
        out, err = self.run_bzr('merge ../branch_c --remember')
179
179
        self.assertEquals(out, '')
180
 
        self.assertEquals(err, 'All changes applied successfully.\n')
 
180
        self.assertEquals(err, '+N  c\nAll changes applied successfully.\n')
181
181
        self.assertEquals(abspath(branch_b.get_parent()),
182
182
                          abspath(branch_c.bzrdir.root_transport.base))
183
 
        # re-open tree as external runbzr modified it
 
183
        # re-open tree as external run_bzr modified it
184
184
        tree_b = branch_b.bzrdir.open_workingtree()
185
185
        tree_b.commit('merge branch_c')
186
186
 
204
204
        f.close()
205
205
        tree_b.commit('message')
206
206
        os.chdir('branch_b')
207
 
        file('../bundle', 'wb').write(self.runbzr('bundle ../branch_a')[0])
 
207
        file('../bundle', 'wb').write(self.run_bzr('bundle ../branch_a')[0])
208
208
        os.chdir('../branch_a')
209
 
        self.runbzr('merge ../bundle', retcode=1)
 
209
        self.run_bzr('merge ../bundle', retcode=1)
210
210
        testament_a = Testament.from_revision(tree_a.branch.repository,
211
211
                                              tree_b.get_parent_ids()[0])
212
212
        testament_b = Testament.from_revision(tree_b.branch.repository,
216
216
        tree_a.set_conflicts(ConflictList())
217
217
        tree_a.commit('message')
218
218
        # it is legal to attempt to merge an already-merged bundle
219
 
        output = self.runbzr('merge ../bundle')[1]
 
219
        output = self.run_bzr('merge ../bundle')[1]
220
220
        # but it does nothing
221
221
        self.assertFalse(tree_a.changes_from(tree_a.basis_tree()).has_changed())
222
222
        self.assertEqual('Nothing to do.\n', output)
232
232
        tree_a.rename_one('file_1', 'file_i')
233
233
        tree_a.commit('commit 2')
234
234
        tree_a.rename_one('file_2', 'file_ii')
 
235
        ## os.chdir('b')
 
236
        self.run_bzr('merge', 'a', '--uncommitted', '-d', 'b')
 
237
        self.failUnlessExists('b/file_1')
 
238
        self.failUnlessExists('b/file_ii')
 
239
        tree_b.revert([])
 
240
        self.run_bzr_error(('Cannot use --uncommitted and --revision',),
 
241
                           'merge', '/a', '--uncommitted', '-r1',
 
242
                           '-d', 'b')
 
243
 
 
244
    def pullable_branch(self):
 
245
        os.mkdir('a')
 
246
        os.chdir('a')
 
247
        self.example_branch()
 
248
        os.chdir('..')
 
249
        self.run_bzr('branch a b')
235
250
        os.chdir('b')
236
 
        self.run_bzr('merge', '../a', '--uncommitted')
237
 
        self.failUnlessExists('file_1')
238
 
        self.failUnlessExists('file_ii')
 
251
        file('goodbye', 'wt').write('quux')
 
252
        self.run_bzr(['commit', '-m', "mode u's are always good"])
 
253
        os.chdir('../a')
 
254
 
 
255
    def pullable_branch(self):
 
256
        tree_a = self.make_branch_and_tree('a')
 
257
        self.build_tree(['a/file'])
 
258
        tree_a.add(['file'])
 
259
        self.id1 = tree_a.commit('commit 1')
 
260
        
 
261
        tree_b = self.make_branch_and_tree('b')
 
262
        tree_b.pull(tree_a.branch)
 
263
        file('b/file', 'wb').write('foo')
 
264
        self.id2 = tree_b.commit('commit 2')
 
265
 
 
266
    def test_merge_pull(self):
 
267
        self.pullable_branch()
 
268
        os.chdir('a')
 
269
        (out, err) = self.run_bzr('merge', '--pull', '../b')
 
270
        self.assertContainsRe(err, 'Now on revision 2\\.')
 
271
        tree_a = WorkingTree.open('.')
 
272
        self.assertEqual([self.id2], tree_a.get_parent_ids())
 
273
 
 
274
    def test_merge_kind_change(self):
 
275
        tree_a = self.make_branch_and_tree('tree_a')
 
276
        self.build_tree_contents([('tree_a/file', 'content_1')])
 
277
        tree_a.add('file', 'file-id')
 
278
        tree_a.commit('added file')
 
279
        tree_b = tree_a.bzrdir.sprout('tree_b').open_workingtree()
 
280
        os.unlink('tree_a/file')
 
281
        self.build_tree(['tree_a/file/'])
 
282
        tree_a.commit('changed file to directory')
 
283
        os.chdir('tree_b')
 
284
        self.run_bzr('merge', '../tree_a')
 
285
        self.assertEqual('directory', file_kind('file'))
239
286
        tree_b.revert([])
240
 
        self.run_bzr_error(('Cannot use --uncommitted and --revision',), 
241
 
                           'merge', '../a', '--uncommitted', '-r1')
 
287
        self.assertEqual('file', file_kind('file'))
 
288
        self.build_tree_contents([('file', 'content_2')])
 
289
        tree_b.commit('content change')
 
290
        self.run_bzr('merge', '../tree_a', retcode=1)
 
291
        self.assertEqual(tree_b.conflicts(),
 
292
                         [ContentsConflict('file', file_id='file-id')])