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