/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
2279.3.1 by mbp at sourcefrog
Add a -d option to push, pull, merge (ported from tags branch)
1
# Copyright (C) 2006, 2007 Canonical Ltd
1551.6.16 by Aaron Bentley
Merge from bzr.dev
2
#
1614.2.5 by Olaf Conradi
Added testcase for bzr merge --remember.
3
# This program is free software; you can redistribute it and/or modify
4
# it under the terms of the GNU General Public License as published by
5
# the Free Software Foundation; either version 2 of the License, or
6
# (at your option) any later version.
1551.6.16 by Aaron Bentley
Merge from bzr.dev
7
#
1614.2.5 by Olaf Conradi
Added testcase for bzr merge --remember.
8
# This program is distributed in the hope that it will be useful,
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11
# GNU General Public License for more details.
1551.6.16 by Aaron Bentley
Merge from bzr.dev
12
#
1614.2.5 by Olaf Conradi
Added testcase for bzr merge --remember.
13
# You should have received a copy of the GNU General Public License
14
# along with this program; if not, write to the Free Software
4183.7.1 by Sabin Iacob
update FSF mailing address
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
1551.6.16 by Aaron Bentley
Merge from bzr.dev
16
#
17
# Author: Aaron Bentley <aaron.bentley@utoronto.ca>
1614.2.5 by Olaf Conradi
Added testcase for bzr merge --remember.
18
19
"""Black-box tests for bzr merge.
20
"""
21
22
import os
23
4672.3.1 by Vincent Ladeuil
Cleanup imports in blackbox/test_merge.py.
24
from bzrlib import (
25
    branch,
26
    bzrdir,
27
    conflicts,
4672.3.2 by Vincent Ladeuil
Don't allow merge on top of pending merges without --force.
28
    errors,
4672.3.1 by Vincent Ladeuil
Cleanup imports in blackbox/test_merge.py.
29
    merge_directive,
30
    osutils,
31
    tests,
32
    urlutils,
33
    workingtree,
34
    )
35
36
37
class TestMerge(tests.TestCaseWithTransport):
1614.2.5 by Olaf Conradi
Added testcase for bzr merge --remember.
38
2664.12.1 by Daniel Watkins
tests.blackbox.test_merge now uses internals where appropriate.
39
    def example_branch(self, path='.'):
40
        tree = self.make_branch_and_tree(path)
41
        self.build_tree_contents([
4672.3.1 by Vincent Ladeuil
Cleanup imports in blackbox/test_merge.py.
42
            (osutils.pathjoin(path, 'hello'), 'foo'),
43
            (osutils.pathjoin(path, 'goodbye'), 'baz')])
2664.12.1 by Daniel Watkins
tests.blackbox.test_merge now uses internals where appropriate.
44
        tree.add('hello')
45
        tree.commit(message='setup')
46
        tree.add('goodbye')
47
        tree.commit(message='setup')
48
        return tree
1551.6.16 by Aaron Bentley
Merge from bzr.dev
49
3744.2.1 by John Arbash Meinel
Change 'bzr merge' so that it uses --reprocess as long as --show-base is not given.
50
    def create_conflicting_branches(self):
51
        """Create two branches which have overlapping modifications.
52
53
        :return: (tree, other_branch) Where merging other_branch causes a file
54
            conflict.
55
        """
56
        builder = self.make_branch_builder('branch')
57
        builder.build_snapshot('rev1', None,
58
            [('add', ('', 'root-id', 'directory', None)),
59
             ('add', ('fname', 'f-id', 'file', 'a\nb\nc\n'))])
60
        builder.build_snapshot('rev2other', ['rev1'],
61
            [('modify', ('f-id', 'a\nB\nD\n'))])
62
        other = builder.get_branch().bzrdir.sprout('other').open_branch()
63
        builder.build_snapshot('rev2this', ['rev1'],
64
            [('modify', ('f-id', 'a\nB\nC\n'))])
65
        tree = builder.get_branch().create_checkout('tree', lightweight=True)
66
        return tree, other
67
1551.6.16 by Aaron Bentley
Merge from bzr.dev
68
    def test_merge_reprocess(self):
4672.3.1 by Vincent Ladeuil
Cleanup imports in blackbox/test_merge.py.
69
        d = bzrdir.BzrDir.create_standalone_workingtree('.')
1551.6.16 by Aaron Bentley
Merge from bzr.dev
70
        d.commit('h')
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
71
        self.run_bzr('merge . --reprocess --merge-type weave')
1551.6.16 by Aaron Bentley
Merge from bzr.dev
72
73
    def test_merge(self):
2664.12.1 by Daniel Watkins
tests.blackbox.test_merge now uses internals where appropriate.
74
        a_tree = self.example_branch('a')
2738.3.2 by Daniel Watkins
Modified as per abentley's comments.
75
        ancestor = a_tree.branch.revno()
2664.12.1 by Daniel Watkins
tests.blackbox.test_merge now uses internals where appropriate.
76
        b_tree = a_tree.bzrdir.sprout('b').open_workingtree()
77
        self.build_tree_contents([('b/goodbye', 'quux')])
78
        b_tree.commit(message="more u's are always good")
79
80
        self.build_tree_contents([('a/hello', 'quuux')])
1551.6.16 by Aaron Bentley
Merge from bzr.dev
81
        # We can't merge when there are in-tree changes
2664.12.1 by Daniel Watkins
tests.blackbox.test_merge now uses internals where appropriate.
82
        os.chdir('a')
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
83
        self.run_bzr('merge ../b', retcode=3)
4672.3.1 by Vincent Ladeuil
Cleanup imports in blackbox/test_merge.py.
84
        a = workingtree.WorkingTree.open('.')
1908.6.11 by Robert Collins
Remove usage of tree.pending_merges().
85
        a_tip = a.commit("Like an epidemic of u's")
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
86
        self.run_bzr('merge ../b -r last:1..last:1 --merge-type blooof',
1551.6.16 by Aaron Bentley
Merge from bzr.dev
87
                    retcode=3)
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
88
        self.run_bzr('merge ../b -r last:1..last:1 --merge-type merge3')
2796.1.4 by Aaron Bentley
Fix up various test cases
89
        a_tree.revert(backups=False)
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
90
        self.run_bzr('merge ../b -r last:1..last:1 --merge-type weave')
2796.1.4 by Aaron Bentley
Fix up various test cases
91
        a_tree.revert(backups=False)
3144.3.1 by Aaron Bentley
Implement LCA merge, with problematic conflict markers
92
        self.run_bzr('merge ../b -r last:1..last:1 --merge-type lca')
93
        a_tree.revert(backups=False)
2665.2.1 by Michael Hudson
test and fix for a NameError in merge --weave --show-base
94
        self.run_bzr_error(['Show-base is not supported for this merge type'],
95
                           'merge ../b -r last:1..last:1 --merge-type weave'
96
                           ' --show-base')
2796.1.4 by Aaron Bentley
Fix up various test cases
97
        a_tree.revert(backups=False)
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
98
        self.run_bzr('merge ../b -r last:1..last:1 --reprocess')
2796.1.4 by Aaron Bentley
Fix up various test cases
99
        a_tree.revert(backups=False)
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
100
        self.run_bzr('merge ../b -r last:1')
1551.6.16 by Aaron Bentley
Merge from bzr.dev
101
        self.check_file_contents('goodbye', 'quux')
102
        # Merging a branch pulls its revision into the tree
4672.3.1 by Vincent Ladeuil
Cleanup imports in blackbox/test_merge.py.
103
        b = branch.Branch.open('../b')
1908.6.11 by Robert Collins
Remove usage of tree.pending_merges().
104
        b_tip = b.last_revision()
105
        self.failUnless(a.branch.repository.has_revision(b_tip))
106
        self.assertEqual([a_tip, b_tip], a.get_parent_ids())
2796.1.4 by Aaron Bentley
Fix up various test cases
107
        a_tree.revert(backups=False)
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
108
        out, err = self.run_bzr('merge -r revno:1:./hello', retcode=3)
1907.4.13 by Matthieu Moy
Better testcase for revno:N:branch/path error.
109
        self.assertTrue("Not a branch" in err)
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
110
        self.run_bzr('merge -r revno:%d:./..revno:%d:../b'
1907.4.12 by Matthieu Moy
Made merge work with two revisions in different branches.
111
                    %(ancestor,b.revno()))
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
112
        self.assertEquals(a.get_parent_ids(),
1551.8.25 by Aaron Bentley
Fix deprecated use of pending_merges
113
                          [a.branch.last_revision(), b.last_revision()])
1907.4.12 by Matthieu Moy
Made merge work with two revisions in different branches.
114
        self.check_file_contents('goodbye', 'quux')
2796.1.4 by Aaron Bentley
Fix up various test cases
115
        a_tree.revert(backups=False)
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
116
        self.run_bzr('merge -r revno:%d:../b'%b.revno())
1551.8.25 by Aaron Bentley
Fix deprecated use of pending_merges
117
        self.assertEquals(a.get_parent_ids(),
118
                          [a.branch.last_revision(), b.last_revision()])
1908.6.11 by Robert Collins
Remove usage of tree.pending_merges().
119
        a_tip = a.commit('merged')
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
120
        self.run_bzr('merge ../b -r last:1')
1908.6.11 by Robert Collins
Remove usage of tree.pending_merges().
121
        self.assertEqual([a_tip], a.get_parent_ids())
1551.6.16 by Aaron Bentley
Merge from bzr.dev
122
3744.2.1 by John Arbash Meinel
Change 'bzr merge' so that it uses --reprocess as long as --show-base is not given.
123
    def test_merge_defaults_to_reprocess(self):
124
        tree, other = self.create_conflicting_branches()
125
        # The default merge algorithm should enable 'reprocess' because
126
        # 'show-base' is not set
3744.2.2 by John Arbash Meinel
Merge returns code 1 to indicate there were conflicts.
127
        self.run_bzr('merge ../other', working_dir='tree',
128
                     retcode=1)
3744.2.1 by John Arbash Meinel
Change 'bzr merge' so that it uses --reprocess as long as --show-base is not given.
129
        self.assertEqualDiff('a\n'
130
                             'B\n'
131
                             '<<<<<<< TREE\n'
132
                             'C\n'
133
                             '=======\n'
134
                             'D\n'
135
                             '>>>>>>> MERGE-SOURCE\n',
136
                             tree.get_file_text('f-id'))
137
138
    def test_merge_explicit_reprocess_show_base(self):
139
        tree, other = self.create_conflicting_branches()
140
        # Explicitly setting --reprocess, and --show-base is an error
141
        self.run_bzr_error(['Cannot do conflict reduction and show base'],
142
                           'merge ../other --reprocess --show-base',
143
                           working_dir='tree')
144
145
    def test_merge_override_reprocess(self):
146
        tree, other = self.create_conflicting_branches()
147
        # Explicitly disable reprocess
3744.2.2 by John Arbash Meinel
Merge returns code 1 to indicate there were conflicts.
148
        self.run_bzr('merge ../other --no-reprocess', working_dir='tree',
149
                     retcode=1)
3744.2.1 by John Arbash Meinel
Change 'bzr merge' so that it uses --reprocess as long as --show-base is not given.
150
        self.assertEqualDiff('a\n'
151
                             '<<<<<<< TREE\n'
152
                             'B\n'
153
                             'C\n'
154
                             '=======\n'
155
                             'B\n'
156
                             'D\n'
157
                             '>>>>>>> MERGE-SOURCE\n',
158
                             tree.get_file_text('f-id'))
159
160
    def test_merge_override_show_base(self):
161
        tree, other = self.create_conflicting_branches()
162
        # Setting '--show-base' will auto-disable '--reprocess'
3744.2.2 by John Arbash Meinel
Merge returns code 1 to indicate there were conflicts.
163
        self.run_bzr('merge ../other --show-base', working_dir='tree',
164
                     retcode=1)
3744.2.1 by John Arbash Meinel
Change 'bzr merge' so that it uses --reprocess as long as --show-base is not given.
165
        self.assertEqualDiff('a\n'
166
                             '<<<<<<< TREE\n'
167
                             'B\n'
168
                             'C\n'
169
                             '||||||| BASE-REVISION\n'
170
                             'b\n'
171
                             'c\n'
172
                             '=======\n'
173
                             'B\n'
174
                             'D\n'
175
                             '>>>>>>> MERGE-SOURCE\n',
176
                             tree.get_file_text('f-id'))
177
1551.6.16 by Aaron Bentley
Merge from bzr.dev
178
    def test_merge_with_missing_file(self):
179
        """Merge handles missing file conflicts"""
2664.12.1 by Daniel Watkins
tests.blackbox.test_merge now uses internals where appropriate.
180
        self.build_tree_contents([
2738.3.4 by Daniel Watkins
Fixed tuple spacing.
181
            ('a/',),
182
            ('a/sub/',),
2664.12.1 by Daniel Watkins
tests.blackbox.test_merge now uses internals where appropriate.
183
            ('a/sub/a.txt', 'hello\n'),
2738.3.3 by Daniel Watkins
Minor reformatting per abentley's mailing list comments.
184
            ('a/b.txt', 'hello\n'),
2664.12.1 by Daniel Watkins
tests.blackbox.test_merge now uses internals where appropriate.
185
            ('a/sub/c.txt', 'hello\n')])
186
        a_tree = self.make_branch_and_tree('a')
187
        a_tree.add(['sub', 'b.txt', 'sub/c.txt', 'sub/a.txt'])
188
        a_tree.commit(message='added a')
189
        b_tree = a_tree.bzrdir.sprout('b').open_workingtree()
190
        self.build_tree_contents([
191
            ('a/sub/a.txt', 'hello\nthere\n'),
2738.3.3 by Daniel Watkins
Minor reformatting per abentley's mailing list comments.
192
            ('a/b.txt', 'hello\nthere\n'),
2664.12.1 by Daniel Watkins
tests.blackbox.test_merge now uses internals where appropriate.
193
            ('a/sub/c.txt', 'hello\nthere\n')])
194
        a_tree.commit(message='Added there')
195
        os.remove('a/sub/a.txt')
196
        os.remove('a/sub/c.txt')
197
        os.rmdir('a/sub')
198
        os.remove('a/b.txt')
199
        a_tree.commit(message='Removed a.txt')
200
        self.build_tree_contents([
201
            ('b/sub/a.txt', 'hello\nsomething\n'),
2738.3.3 by Daniel Watkins
Minor reformatting per abentley's mailing list comments.
202
            ('b/b.txt', 'hello\nsomething\n'),
2664.12.1 by Daniel Watkins
tests.blackbox.test_merge now uses internals where appropriate.
203
            ('b/sub/c.txt', 'hello\nsomething\n')])
204
        b_tree.commit(message='Modified a.txt')
205
        os.chdir('b')
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
206
        self.run_bzr('merge ../a/', retcode=1)
2738.3.2 by Daniel Watkins
Modified as per abentley's comments.
207
        self.failUnlessExists('sub/a.txt.THIS')
208
        self.failUnlessExists('sub/a.txt.BASE')
1551.6.16 by Aaron Bentley
Merge from bzr.dev
209
        os.chdir('../a')
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
210
        self.run_bzr('merge ../b/', retcode=1)
2738.3.2 by Daniel Watkins
Modified as per abentley's comments.
211
        self.failUnlessExists('sub/a.txt.OTHER')
212
        self.failUnlessExists('sub/a.txt.BASE')
1551.6.16 by Aaron Bentley
Merge from bzr.dev
213
1614.2.5 by Olaf Conradi
Added testcase for bzr merge --remember.
214
    def test_merge_remember(self):
1551.20.2 by Aaron Bentley
Merge prefers submit branch, but falls back to parent branch
215
        """Merge changes from one branch to another, test submit location."""
1614.2.16 by Olaf Conradi
Modified blackbox test cases to use bzrlib API.
216
        tree_a = self.make_branch_and_tree('branch_a')
217
        branch_a = tree_a.branch
218
        self.build_tree(['branch_a/a'])
219
        tree_a.add('a')
220
        tree_a.commit('commit a')
221
        branch_b = branch_a.bzrdir.sprout('branch_b').open_branch()
222
        tree_b = branch_b.bzrdir.open_workingtree()
223
        branch_c = branch_a.bzrdir.sprout('branch_c').open_branch()
224
        tree_c = branch_c.bzrdir.open_workingtree()
225
        self.build_tree(['branch_a/b'])
226
        tree_a.add('b')
227
        tree_a.commit('commit b')
228
        self.build_tree(['branch_c/c'])
229
        tree_c.add('c')
230
        tree_c.commit('commit c')
1614.2.6 by Olaf Conradi
Add testcase for --remember when merge fails. It should still remember
231
        # reset parent
1614.2.16 by Olaf Conradi
Modified blackbox test cases to use bzrlib API.
232
        parent = branch_b.get_parent()
233
        branch_b.set_parent(None)
234
        self.assertEqual(None, branch_b.get_parent())
1614.2.6 by Olaf Conradi
Add testcase for --remember when merge fails. It should still remember
235
        # test merge for failure without parent set
1614.2.16 by Olaf Conradi
Modified blackbox test cases to use bzrlib API.
236
        os.chdir('branch_b')
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
237
        out = self.run_bzr('merge', retcode=3)
1614.2.5 by Olaf Conradi
Added testcase for bzr merge --remember.
238
        self.assertEquals(out,
1685.1.59 by Martin Pool
[broken] Fix up & refactor display of remembered urls to unescape properly
239
                ('','bzr: ERROR: No location specified or remembered\n'))
4037.2.5 by Roberto Aguilar
Updating tests for uncommitted changes.
240
241
        # test uncommitted changes
1614.2.16 by Olaf Conradi
Modified blackbox test cases to use bzrlib API.
242
        self.build_tree(['d'])
243
        tree_b.add('d')
2796.2.14 by Aaron Bentley
Updates from review
244
        self.run_bzr_error(['Working tree ".*" has uncommitted changes'],
4037.2.5 by Roberto Aguilar
Updating tests for uncommitted changes.
245
                           'merge')
246
247
        # merge should now pass and implicitly remember merge location
1614.2.16 by Olaf Conradi
Modified blackbox test cases to use bzrlib API.
248
        tree_b.commit('commit d')
4037.2.5 by Roberto Aguilar
Updating tests for uncommitted changes.
249
        out, err = self.run_bzr('merge ../branch_a')
250
251
        base = urlutils.local_path_from_url(branch_a.base)
252
        self.assertEndsWith(err, '+N  b\nAll changes applied successfully.\n')
4672.3.1 by Vincent Ladeuil
Cleanup imports in blackbox/test_merge.py.
253
        self.assertEquals(osutils.abspath(branch_b.get_submit_branch()),
254
                          osutils.abspath(parent))
4037.2.5 by Roberto Aguilar
Updating tests for uncommitted changes.
255
        # test implicit --remember when committing new file
256
        self.build_tree(['e'])
257
        tree_b.add('e')
258
        tree_b.commit('commit e')
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
259
        out, err = self.run_bzr('merge')
3249.2.2 by Ian Clatworthy
Fix merge redirection when remembered location used - tweak tests
260
        self.assertStartsWith(err,
3596.3.1 by James Westby
Give the user a bit more information about which saved location is being used.
261
                          'Merging from remembered submit location %s\n' % (base,))
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
262
        # re-open tree as external run_bzr modified it
1614.2.16 by Olaf Conradi
Modified blackbox test cases to use bzrlib API.
263
        tree_b = branch_b.bzrdir.open_workingtree()
264
        tree_b.commit('merge branch_a')
1614.2.6 by Olaf Conradi
Add testcase for --remember when merge fails. It should still remember
265
        # test explicit --remember
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
266
        out, err = self.run_bzr('merge ../branch_c --remember')
1614.2.16 by Olaf Conradi
Modified blackbox test cases to use bzrlib API.
267
        self.assertEquals(out, '')
1551.11.11 by Aaron Bentley
Get tests passing
268
        self.assertEquals(err, '+N  c\nAll changes applied successfully.\n')
4672.3.1 by Vincent Ladeuil
Cleanup imports in blackbox/test_merge.py.
269
        self.assertEquals(osutils.abspath(branch_b.get_submit_branch()),
270
                          osutils.abspath(branch_c.bzrdir.root_transport.base))
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
271
        # re-open tree as external run_bzr modified it
1614.2.16 by Olaf Conradi
Modified blackbox test cases to use bzrlib API.
272
        tree_b = branch_b.bzrdir.open_workingtree()
273
        tree_b.commit('merge branch_c')
1185.82.22 by Aaron Bentley
Start getting changeset merging under test
274
1185.82.130 by Aaron Bentley
Rename changesets to revision bundles
275
    def test_merge_bundle(self):
1185.82.33 by Aaron Bentley
Strengthen tests
276
        from bzrlib.testament import Testament
1185.82.22 by Aaron Bentley
Start getting changeset merging under test
277
        tree_a = self.make_branch_and_tree('branch_a')
2664.12.1 by Daniel Watkins
tests.blackbox.test_merge now uses internals where appropriate.
278
        self.build_tree_contents([('branch_a/a', 'hello')])
1185.82.22 by Aaron Bentley
Start getting changeset merging under test
279
        tree_a.add('a')
280
        tree_a.commit('message')
281
282
        tree_b = tree_a.bzrdir.sprout('branch_b').open_workingtree()
2664.12.1 by Daniel Watkins
tests.blackbox.test_merge now uses internals where appropriate.
283
        self.build_tree_contents([('branch_a/a', 'hey there')])
1185.82.23 by Aaron Bentley
Switch the fetcher
284
        tree_a.commit('message')
285
2664.12.1 by Daniel Watkins
tests.blackbox.test_merge now uses internals where appropriate.
286
        self.build_tree_contents([('branch_b/a', 'goodbye')])
1185.82.22 by Aaron Bentley
Start getting changeset merging under test
287
        tree_b.commit('message')
288
        os.chdir('branch_b')
2654.3.1 by Aaron Bentley
Rename submit to send, make -o required, support -o- for stdout
289
        self.run_bzr('bundle ../branch_a -o ../bundle')
1185.82.26 by Aaron Bentley
Get changeset merges closer to working
290
        os.chdir('../branch_a')
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
291
        self.run_bzr('merge ../bundle', retcode=1)
1908.7.6 by Robert Collins
Deprecate WorkingTree.last_revision.
292
        testament_a = Testament.from_revision(tree_a.branch.repository,
293
                                              tree_b.get_parent_ids()[0])
1185.82.33 by Aaron Bentley
Strengthen tests
294
        testament_b = Testament.from_revision(tree_b.branch.repository,
1908.7.6 by Robert Collins
Deprecate WorkingTree.last_revision.
295
                                              tree_b.get_parent_ids()[0])
1185.82.33 by Aaron Bentley
Strengthen tests
296
        self.assertEqualDiff(testament_a.as_text(),
297
                         testament_b.as_text())
4672.3.1 by Vincent Ladeuil
Cleanup imports in blackbox/test_merge.py.
298
        tree_a.set_conflicts(conflicts.ConflictList())
1185.82.141 by Aaron Bentley
Ensure bzr works when you merge an already-merged bundle
299
        tree_a.commit('message')
300
        # it is legal to attempt to merge an already-merged bundle
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
301
        output = self.run_bzr('merge ../bundle')[1]
1185.82.141 by Aaron Bentley
Ensure bzr works when you merge an already-merged bundle
302
        # but it does nothing
1852.10.3 by Robert Collins
Remove all uses of compare_trees and replace with Tree.changes_from throughout bzrlib.
303
        self.assertFalse(tree_a.changes_from(tree_a.basis_tree()).has_changed())
1185.82.142 by Aaron Bentley
Update for review comments
304
        self.assertEqual('Nothing to do.\n', output)
1910.1.1 by Aaron Bentley
Merge takes --uncommitted parameter
305
306
    def test_merge_uncommitted(self):
307
        """Check that merge --uncommitted behaves properly"""
308
        tree_a = self.make_branch_and_tree('a')
309
        self.build_tree(['a/file_1', 'a/file_2'])
310
        tree_a.add(['file_1', 'file_2'])
311
        tree_a.commit('commit 1')
312
        tree_b = tree_a.bzrdir.sprout('b').open_workingtree()
313
        self.failUnlessExists('b/file_1')
314
        tree_a.rename_one('file_1', 'file_i')
315
        tree_a.commit('commit 2')
316
        tree_a.rename_one('file_2', 'file_ii')
2279.3.1 by mbp at sourcefrog
Add a -d option to push, pull, merge (ported from tags branch)
317
        ## os.chdir('b')
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
318
        self.run_bzr('merge a --uncommitted -d b')
2279.3.1 by mbp at sourcefrog
Add a -d option to push, pull, merge (ported from tags branch)
319
        self.failUnlessExists('b/file_1')
320
        self.failUnlessExists('b/file_ii')
2748.3.2 by Aaron Bentley
Fix revert, remove-tree, and various tests to use None for 'no files specified'
321
        tree_b.revert()
2279.3.1 by mbp at sourcefrog
Add a -d option to push, pull, merge (ported from tags branch)
322
        self.run_bzr_error(('Cannot use --uncommitted and --revision',),
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
323
                           'merge /a --uncommitted -r1 -d b')
2149.2.1 by Jan Hudec
Option --pull for merge command.
324
3017.3.1 by Aaron Bentley
merge --uncommit can now specify single files (#136890)
325
    def test_merge_uncommitted_file(self):
326
        """It should be possible to merge changes from a single file."""
327
        tree_a = self.make_branch_and_tree('tree_a')
328
        tree_a.commit('initial commit')
329
        tree_a.bzrdir.sprout('tree_b')
330
        self.build_tree(['tree_a/file1', 'tree_a/file2'])
331
        tree_a.add(['file1', 'file2'])
332
        os.chdir('tree_b')
333
        self.run_bzr(['merge', '--uncommitted', '../tree_a/file1'])
334
        self.failUnlessExists('file1')
335
        self.failIfExists('file2')
336
2149.2.1 by Jan Hudec
Option --pull for merge command.
337
    def pullable_branch(self):
338
        tree_a = self.make_branch_and_tree('a')
339
        self.build_tree(['a/file'])
340
        tree_a.add(['file'])
341
        self.id1 = tree_a.commit('commit 1')
2664.12.1 by Daniel Watkins
tests.blackbox.test_merge now uses internals where appropriate.
342
2149.2.1 by Jan Hudec
Option --pull for merge command.
343
        tree_b = self.make_branch_and_tree('b')
344
        tree_b.pull(tree_a.branch)
345
        file('b/file', 'wb').write('foo')
346
        self.id2 = tree_b.commit('commit 2')
347
348
    def test_merge_pull(self):
349
        self.pullable_branch()
350
        os.chdir('a')
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
351
        (out, err) = self.run_bzr('merge --pull ../b')
1551.15.67 by Aaron Bentley
Stop using _merge_helper for merging
352
        self.assertContainsRe(out, 'Now on revision 2\\.')
4672.3.1 by Vincent Ladeuil
Cleanup imports in blackbox/test_merge.py.
353
        tree_a = workingtree.WorkingTree.open('.')
2149.2.1 by Jan Hudec
Option --pull for merge command.
354
        self.assertEqual([self.id2], tree_a.get_parent_ids())
1959.4.6 by Aaron Bentley
Ensure merge works across kind changes
355
356
    def test_merge_kind_change(self):
357
        tree_a = self.make_branch_and_tree('tree_a')
358
        self.build_tree_contents([('tree_a/file', 'content_1')])
359
        tree_a.add('file', 'file-id')
360
        tree_a.commit('added file')
361
        tree_b = tree_a.bzrdir.sprout('tree_b').open_workingtree()
362
        os.unlink('tree_a/file')
363
        self.build_tree(['tree_a/file/'])
364
        tree_a.commit('changed file to directory')
365
        os.chdir('tree_b')
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
366
        self.run_bzr('merge ../tree_a')
4672.3.1 by Vincent Ladeuil
Cleanup imports in blackbox/test_merge.py.
367
        self.assertEqual('directory', osutils.file_kind('file'))
2748.3.2 by Aaron Bentley
Fix revert, remove-tree, and various tests to use None for 'no files specified'
368
        tree_b.revert()
4672.3.1 by Vincent Ladeuil
Cleanup imports in blackbox/test_merge.py.
369
        self.assertEqual('file', osutils.file_kind('file'))
1959.4.6 by Aaron Bentley
Ensure merge works across kind changes
370
        self.build_tree_contents([('file', 'content_2')])
371
        tree_b.commit('content change')
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
372
        self.run_bzr('merge ../tree_a', retcode=1)
1959.4.6 by Aaron Bentley
Ensure merge works across kind changes
373
        self.assertEqual(tree_b.conflicts(),
4672.3.1 by Vincent Ladeuil
Cleanup imports in blackbox/test_merge.py.
374
                         [conflicts.ContentsConflict('file',
375
                                                     file_id='file-id')])
2520.4.109 by Aaron Bentley
start work on directive cherry-picking
376
377
    def test_directive_cherrypick(self):
378
        source = self.make_branch_and_tree('source')
4593.1.1 by Martin Pool
Merge directive tests must use trees with the same root id.
379
        source.commit("nothing")
380
        # see https://bugs.edge.launchpad.net/bzr/+bug/409688 - trying to
381
        # cherrypick from one branch into another unrelated branch with a
382
        # different root id will give shape conflicts.  as a workaround we
383
        # make sure they share the same root id.
384
        target = source.bzrdir.sprout('target').open_workingtree()
2520.4.109 by Aaron Bentley
start work on directive cherry-picking
385
        self.build_tree(['source/a'])
386
        source.add('a')
387
        source.commit('Added a', rev_id='rev1')
388
        self.build_tree(['source/b'])
389
        source.add('b')
390
        source.commit('Added b', rev_id='rev2')
391
        target.commit('empty commit')
2520.4.111 by Aaron Bentley
Ensure that damaged preview patches produce a warning in merge
392
        self.write_directive('directive', source.branch, 'target', 'rev2',
393
                             'rev1')
1551.19.22 by Aaron Bentley
Add warning when merge directives cause cherrypicks
394
        out, err = self.run_bzr('merge -d target directive')
2520.4.110 by Aaron Bentley
Implement cherrypick support for merge directives
395
        self.failIfExists('target/a')
396
        self.failUnlessExists('target/b')
1551.19.22 by Aaron Bentley
Add warning when merge directives cause cherrypicks
397
        self.assertContainsRe(err, 'Performing cherrypick')
2520.4.111 by Aaron Bentley
Ensure that damaged preview patches produce a warning in merge
398
399
    def write_directive(self, filename, source, target, revision_id,
400
                        base_revision_id=None, mangle_patch=False):
401
        md = merge_directive.MergeDirective2.from_objects(
2520.4.112 by Aaron Bentley
Make cherry-pick merge directives possible
402
            source.repository, revision_id, 0, 0, target,
403
            base_revision_id=base_revision_id)
2520.4.111 by Aaron Bentley
Ensure that damaged preview patches produce a warning in merge
404
        if mangle_patch:
405
            md.patch = 'asdf\n'
406
        self.build_tree_contents([(filename, ''.join(md.to_lines()))])
407
408
    def test_directive_verify_warning(self):
409
        source = self.make_branch_and_tree('source')
410
        self.build_tree(['source/a'])
411
        source.add('a')
412
        source.commit('Added a', rev_id='rev1')
413
        target = self.make_branch_and_tree('target')
414
        target.commit('empty commit')
415
        self.write_directive('directive', source.branch, 'target', 'rev1')
416
        err = self.run_bzr('merge -d target directive')[1]
417
        self.assertNotContainsRe(err, 'Preview patch does not match changes')
2748.3.2 by Aaron Bentley
Fix revert, remove-tree, and various tests to use None for 'no files specified'
418
        target.revert()
2520.4.111 by Aaron Bentley
Ensure that damaged preview patches produce a warning in merge
419
        self.write_directive('directive', source.branch, 'target', 'rev1',
420
                             mangle_patch=True)
421
        err = self.run_bzr('merge -d target directive')[1]
2520.7.1 by Aaron Bentley
Reactivate patch verification
422
        self.assertContainsRe(err, 'Preview patch does not match changes')
1551.15.66 by Aaron Bentley
Improve behavior with revision ids
423
424
    def test_merge_arbitrary(self):
425
        target = self.make_branch_and_tree('target')
426
        target.commit('empty')
427
        # We need a revision that has no integer revno
428
        branch_a = target.bzrdir.sprout('branch_a').open_workingtree()
429
        self.build_tree(['branch_a/file1'])
430
        branch_a.add('file1')
431
        branch_a.commit('added file1', rev_id='rev2a')
432
        branch_b = target.bzrdir.sprout('branch_b').open_workingtree()
433
        self.build_tree(['branch_b/file2'])
434
        branch_b.add('file2')
435
        branch_b.commit('added file2', rev_id='rev2b')
436
        branch_b.merge_from_branch(branch_a.branch)
437
        self.failUnlessExists('branch_b/file1')
438
        branch_b.commit('merged branch_a', rev_id='rev3b')
439
440
        # It works if the revid has an interger revno
441
        self.run_bzr('merge -d target -r revid:rev2a branch_a')
442
        self.failUnlessExists('target/file1')
443
        self.failIfExists('target/file2')
2748.3.2 by Aaron Bentley
Fix revert, remove-tree, and various tests to use None for 'no files specified'
444
        target.revert()
1551.15.66 by Aaron Bentley
Improve behavior with revision ids
445
446
        # It should work if the revid has no integer revno
447
        self.run_bzr('merge -d target -r revid:rev2a branch_b')
448
        self.failUnlessExists('target/file1')
449
        self.failIfExists('target/file2')
2839.5.1 by Alexander Belchenko
add -c option to merge command
450
451
    def assertDirectoryContent(self, directory, entries, message=''):
2839.5.2 by Alexander Belchenko
tweaks suggested by Ian
452
        """Assert whether entries (file or directories) exist in a directory.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
453
2839.5.2 by Alexander Belchenko
tweaks suggested by Ian
454
        It also checks that there are no extra entries.
2839.5.1 by Alexander Belchenko
add -c option to merge command
455
        """
2839.5.2 by Alexander Belchenko
tweaks suggested by Ian
456
        ondisk = os.listdir(directory)
2839.5.1 by Alexander Belchenko
add -c option to merge command
457
        if set(ondisk) == set(entries):
458
            return
459
        if message:
460
            message += '\n'
461
        raise AssertionError(
462
            '%s"%s" directory content is different:\na = %s\nb = %s\n'
2839.5.2 by Alexander Belchenko
tweaks suggested by Ian
463
            % (message, directory, sorted(entries), sorted(ondisk)))
2839.5.1 by Alexander Belchenko
add -c option to merge command
464
465
    def test_cherrypicking_merge(self):
466
        # make source branch
467
        source = self.make_branch_and_tree('source')
468
        for f in ('a', 'b', 'c', 'd'):
469
            self.build_tree(['source/'+f])
470
            source.add(f)
471
            source.commit('added '+f, rev_id='rev_'+f)
472
        # target branch
473
        target = source.bzrdir.sprout('target', 'rev_a').open_workingtree()
474
        self.assertDirectoryContent('target', ['.bzr', 'a'])
475
        # pick 1 revision
476
        self.run_bzr('merge -d target -r revid:rev_b..revid:rev_c source')
477
        self.assertDirectoryContent('target', ['.bzr', 'a', 'c'])
478
        target.revert()
479
        # pick 2 revisions
480
        self.run_bzr('merge -d target -r revid:rev_b..revid:rev_d source')
481
        self.assertDirectoryContent('target', ['.bzr', 'a', 'c', 'd'])
482
        target.revert()
483
        # pick 1 revision with option --changes
484
        self.run_bzr('merge -d target -c revid:rev_d source')
485
        self.assertDirectoryContent('target', ['.bzr', 'a', 'd'])
1551.19.10 by Aaron Bentley
Merge now warns when it encounters a criss-cross
486
487
    def test_merge_criss_cross(self):
488
        tree_a = self.make_branch_and_tree('a')
489
        tree_a.commit('', rev_id='rev1')
490
        tree_b = tree_a.bzrdir.sprout('b').open_workingtree()
491
        tree_a.commit('', rev_id='rev2a')
492
        tree_b.commit('', rev_id='rev2b')
493
        tree_a.merge_from_branch(tree_b.branch)
494
        tree_b.merge_from_branch(tree_a.branch)
495
        tree_a.commit('', rev_id='rev3a')
496
        tree_b.commit('', rev_id='rev3b')
497
        graph = tree_a.branch.repository.get_graph(tree_b.branch.repository)
498
        out, err = self.run_bzr(['merge', '-d', 'a', 'b'])
499
        self.assertContainsRe(err, 'Warning: criss-cross merge encountered.')
3062.2.5 by Aaron Bentley
Merge bzr.dev
500
1551.20.2 by Aaron Bentley
Merge prefers submit branch, but falls back to parent branch
501
    def test_merge_from_submit(self):
502
        tree_a = self.make_branch_and_tree('a')
503
        tree_b = tree_a.bzrdir.sprout('b').open_workingtree()
504
        tree_c = tree_a.bzrdir.sprout('c').open_workingtree()
505
        out, err = self.run_bzr(['merge', '-d', 'c'])
3596.3.1 by James Westby
Give the user a bit more information about which saved location is being used.
506
        self.assertContainsRe(err, 'Merging from remembered parent location .*a\/')
1551.20.2 by Aaron Bentley
Merge prefers submit branch, but falls back to parent branch
507
        tree_c.branch.set_submit_branch(tree_b.bzrdir.root_transport.base)
508
        out, err = self.run_bzr(['merge', '-d', 'c'])
3596.3.1 by James Westby
Give the user a bit more information about which saved location is being used.
509
        self.assertContainsRe(err, 'Merging from remembered submit location .*b\/')
1551.20.2 by Aaron Bentley
Merge prefers submit branch, but falls back to parent branch
510
511
    def test_remember_sets_submit(self):
512
        tree_a = self.make_branch_and_tree('a')
513
        tree_b = tree_a.bzrdir.sprout('b').open_workingtree()
514
        self.assertIs(tree_b.branch.get_submit_branch(), None)
515
516
        # Remember should not happen if using default from parent
517
        out, err = self.run_bzr(['merge', '-d', 'b'])
518
        self.assertIs(tree_b.branch.get_submit_branch(), None)
519
520
        # Remember should happen if user supplies location
521
        out, err = self.run_bzr(['merge', '-d', 'b', 'a'])
522
        self.assertEqual(tree_b.branch.get_submit_branch(),
523
                         tree_a.bzrdir.root_transport.base)
1551.19.25 by Aaron Bentley
Merge bzr.dev
524
3062.2.4 by Aaron Bentley
Start supporting merge-with-base
525
    def test_weave_cherrypick(self):
526
        this_tree = self.make_branch_and_tree('this')
527
        self.build_tree_contents([('this/file', "a\n")])
528
        this_tree.add('file')
529
        this_tree.commit('rev1')
530
        other_tree = this_tree.bzrdir.sprout('other').open_workingtree()
531
        self.build_tree_contents([('other/file', "a\nb\n")])
532
        other_tree.commit('rev2b')
533
        self.build_tree_contents([('other/file', "c\na\nb\n")])
534
        other_tree.commit('rev3b')
3062.2.6 by Aaron Bentley
Get cherrypick-on-weave working
535
        self.run_bzr('merge --weave -d this other -r -2..-1')
3062.2.4 by Aaron Bentley
Start supporting merge-with-base
536
        self.assertFileEqual('c\na\n', 'this/file')
3008.1.24 by Aaron Bentley
Add merge --preview to show diff
537
3144.3.1 by Aaron Bentley
Implement LCA merge, with problematic conflict markers
538
    def test_lca_merge_criss_cross(self):
539
        tree_a = self.make_branch_and_tree('a')
540
        self.build_tree_contents([('a/file', 'base-contents\n')])
541
        tree_a.add('file')
542
        tree_a.commit('', rev_id='rev1')
543
        tree_b = tree_a.bzrdir.sprout('b').open_workingtree()
544
        self.build_tree_contents([('a/file',
545
                                   'base-contents\nthis-contents\n')])
546
        tree_a.commit('', rev_id='rev2a')
547
        self.build_tree_contents([('b/file',
548
                                   'base-contents\nother-contents\n')])
549
        tree_b.commit('', rev_id='rev2b')
550
        tree_a.merge_from_branch(tree_b.branch)
551
        self.build_tree_contents([('a/file',
552
                                   'base-contents\nthis-contents\n')])
4672.3.1 by Vincent Ladeuil
Cleanup imports in blackbox/test_merge.py.
553
        tree_a.set_conflicts(conflicts.ConflictList())
3144.3.1 by Aaron Bentley
Implement LCA merge, with problematic conflict markers
554
        tree_b.merge_from_branch(tree_a.branch)
555
        self.build_tree_contents([('b/file',
556
                                   'base-contents\nother-contents\n')])
4672.3.1 by Vincent Ladeuil
Cleanup imports in blackbox/test_merge.py.
557
        tree_b.set_conflicts(conflicts.ConflictList())
3144.3.1 by Aaron Bentley
Implement LCA merge, with problematic conflict markers
558
        tree_a.commit('', rev_id='rev3a')
559
        tree_b.commit('', rev_id='rev3b')
560
        out, err = self.run_bzr(['merge', '-d', 'a', 'b', '--lca'], retcode=1)
561
        self.assertFileEqual('base-contents\n<<<<<<< TREE\nthis-contents\n'
3144.3.2 by Aaron Bentley
Get conflict handling working
562
                             '=======\nother-contents\n>>>>>>> MERGE-SOURCE\n',
3144.3.1 by Aaron Bentley
Implement LCA merge, with problematic conflict markers
563
                             'a/file')
3008.1.27 by Aaron Bentley
Merge bzr.dev
564
3008.1.24 by Aaron Bentley
Add merge --preview to show diff
565
    def test_merge_preview(self):
566
        this_tree = self.make_branch_and_tree('this')
567
        this_tree.commit('rev1')
568
        other_tree = this_tree.bzrdir.sprout('other').open_workingtree()
569
        self.build_tree_contents([('other/file', 'new line')])
570
        other_tree.add('file')
571
        other_tree.commit('rev2a')
572
        this_tree.commit('rev2b')
573
        out, err = self.run_bzr(['merge', '-d', 'this', 'other', '--preview'])
574
        self.assertContainsRe(out, '\+new line')
575
        self.assertNotContainsRe(err, '\+N  file\n')
576
        this_tree.lock_read()
577
        self.addCleanup(this_tree.unlock)
578
        self.assertEqual([],
3254.1.1 by Aaron Bentley
Make Tree.iter_changes a public method
579
                         list(this_tree.iter_changes(this_tree.basis_tree())))
4435.1.1 by Aaron Bentley
Correctly fall back to basis when no second revision specified.
580
581
    def test_merge_missing_second_revision_spec(self):
4435.1.4 by Aaron Bentley
Fix tabs.
582
        """Merge uses branch basis when the second revision is unspecified."""
583
        this = self.make_branch_and_tree('this')
584
        this.commit('rev1')
585
        other = self.make_branch_and_tree('other')
586
        self.build_tree(['other/other_file'])
587
        other.add('other_file')
588
        other.commit('rev1b')
589
        self.run_bzr('merge -d this other -r0..')
590
        self.failUnlessExists('this/other_file')
4672.3.1 by Vincent Ladeuil
Cleanup imports in blackbox/test_merge.py.
591
592
4672.3.2 by Vincent Ladeuil
Don't allow merge on top of pending merges without --force.
593
class TestMergeForce(tests.TestCaseWithTransport):
4672.3.1 by Vincent Ladeuil
Cleanup imports in blackbox/test_merge.py.
594
4672.3.2 by Vincent Ladeuil
Don't allow merge on top of pending merges without --force.
595
    def setUp(self):
596
        super(TestMergeForce, self).setUp()
597
        self.tree_a = self.make_branch_and_tree('a')
4672.3.1 by Vincent Ladeuil
Cleanup imports in blackbox/test_merge.py.
598
        self.build_tree(['a/foo'])
4672.3.2 by Vincent Ladeuil
Don't allow merge on top of pending merges without --force.
599
        self.tree_a.add(['foo'])
600
        self.tree_a.commit('add file')
601
        self.tree_b = self.tree_a.bzrdir.sprout('b').open_workingtree()
4672.3.1 by Vincent Ladeuil
Cleanup imports in blackbox/test_merge.py.
602
        self.build_tree_contents([('a/foo', 'change 1')])
4672.3.2 by Vincent Ladeuil
Don't allow merge on top of pending merges without --force.
603
        self.tree_a.commit('change file')
604
        self.tree_b.merge_from_branch(self.tree_a.branch)
605
606
    def test_merge_force(self):
607
        self.tree_a.commit('empty change to allow merge to run')
4721.3.2 by Vincent Ladeuil
Simplify mutable_tree.has_changes() and update call sites.
608
        # Second merge on top of the uncommitted one
4672.3.1 by Vincent Ladeuil
Cleanup imports in blackbox/test_merge.py.
609
        self.run_bzr(['merge', '../a', '--force'], working_dir='b')
610
611
4672.3.2 by Vincent Ladeuil
Don't allow merge on top of pending merges without --force.
612
    def test_merge_with_uncommitted_changes(self):
613
        self.run_bzr_error(['Working tree .* has uncommitted changes'],
614
                           ['merge', '../a'], working_dir='b')
615
616
    def test_merge_with_pending_merges(self):
617
        # Revert the changes keeping the pending merge
618
        self.run_bzr(['revert', 'b'])
619
        self.run_bzr_error(['Working tree .* has uncommitted changes'],
620
                           ['merge', '../a'], working_dir='b')