/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
47
    def test_merge_reprocess(self):
48
        d = BzrDir.create_standalone_workingtree('.')
49
        d.commit('h')
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
50
        self.run_bzr('merge . --reprocess --merge-type weave')
1551.6.16 by Aaron Bentley
Merge from bzr.dev
51
52
    def test_merge(self):
53
        from bzrlib.branch import Branch
2664.12.1 by Daniel Watkins
tests.blackbox.test_merge now uses internals where appropriate.
54
55
        a_tree = self.example_branch('a')
2738.3.2 by Daniel Watkins
Modified as per abentley's comments.
56
        ancestor = a_tree.branch.revno()
2664.12.1 by Daniel Watkins
tests.blackbox.test_merge now uses internals where appropriate.
57
        b_tree = a_tree.bzrdir.sprout('b').open_workingtree()
58
        self.build_tree_contents([('b/goodbye', 'quux')])
59
        b_tree.commit(message="more u's are always good")
60
61
        self.build_tree_contents([('a/hello', 'quuux')])
1551.6.16 by Aaron Bentley
Merge from bzr.dev
62
        # 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.
63
        os.chdir('a')
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
64
        self.run_bzr('merge ../b', retcode=3)
1908.6.11 by Robert Collins
Remove usage of tree.pending_merges().
65
        a = WorkingTree.open('.')
66
        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
67
        self.run_bzr('merge ../b -r last:1..last:1 --merge-type blooof',
1551.6.16 by Aaron Bentley
Merge from bzr.dev
68
                    retcode=3)
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
69
        self.run_bzr('merge ../b -r last:1..last:1 --merge-type merge3')
2664.12.1 by Daniel Watkins
tests.blackbox.test_merge now uses internals where appropriate.
70
        a_tree.revert([], backups=False)
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
71
        self.run_bzr('merge ../b -r last:1..last:1 --merge-type weave')
2664.12.1 by Daniel Watkins
tests.blackbox.test_merge now uses internals where appropriate.
72
        a_tree.revert([], backups=False)
2665.2.1 by Michael Hudson
test and fix for a NameError in merge --weave --show-base
73
        self.run_bzr_error(['Show-base is not supported for this merge type'],
74
                           'merge ../b -r last:1..last:1 --merge-type weave'
75
                           ' --show-base')
2738.3.1 by Daniel Watkins
tests.blackbox.test_merge now uses internals where appropriate.
76
        a_tree.revert([], backups=False)
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
77
        self.run_bzr('merge ../b -r last:1..last:1 --reprocess')
2664.12.1 by Daniel Watkins
tests.blackbox.test_merge now uses internals where appropriate.
78
        a_tree.revert([], backups=False)
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
79
        self.run_bzr('merge ../b -r last:1')
1551.6.16 by Aaron Bentley
Merge from bzr.dev
80
        self.check_file_contents('goodbye', 'quux')
81
        # Merging a branch pulls its revision into the tree
82
        b = Branch.open('../b')
1908.6.11 by Robert Collins
Remove usage of tree.pending_merges().
83
        b_tip = b.last_revision()
84
        self.failUnless(a.branch.repository.has_revision(b_tip))
85
        self.assertEqual([a_tip, b_tip], a.get_parent_ids())
2664.12.1 by Daniel Watkins
tests.blackbox.test_merge now uses internals where appropriate.
86
        a_tree.revert([], backups=False)
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
87
        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.
88
        self.assertTrue("Not a branch" in err)
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
89
        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.
90
                    %(ancestor,b.revno()))
1551.8.25 by Aaron Bentley
Fix deprecated use of pending_merges
91
        self.assertEquals(a.get_parent_ids(), 
92
                          [a.branch.last_revision(), b.last_revision()])
1907.4.12 by Matthieu Moy
Made merge work with two revisions in different branches.
93
        self.check_file_contents('goodbye', 'quux')
2664.12.1 by Daniel Watkins
tests.blackbox.test_merge now uses internals where appropriate.
94
        a_tree.revert([], backups=False)
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
95
        self.run_bzr('merge -r revno:%d:../b'%b.revno())
1551.8.25 by Aaron Bentley
Fix deprecated use of pending_merges
96
        self.assertEquals(a.get_parent_ids(),
97
                          [a.branch.last_revision(), b.last_revision()])
1908.6.11 by Robert Collins
Remove usage of tree.pending_merges().
98
        a_tip = a.commit('merged')
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')
1908.6.11 by Robert Collins
Remove usage of tree.pending_merges().
100
        self.assertEqual([a_tip], a.get_parent_ids())
1551.6.16 by Aaron Bentley
Merge from bzr.dev
101
102
    def test_merge_with_missing_file(self):
103
        """Merge handles missing file conflicts"""
2664.12.1 by Daniel Watkins
tests.blackbox.test_merge now uses internals where appropriate.
104
        self.build_tree_contents([
2738.3.4 by Daniel Watkins
Fixed tuple spacing.
105
            ('a/',),
106
            ('a/sub/',),
2664.12.1 by Daniel Watkins
tests.blackbox.test_merge now uses internals where appropriate.
107
            ('a/sub/a.txt', 'hello\n'),
2738.3.3 by Daniel Watkins
Minor reformatting per abentley's mailing list comments.
108
            ('a/b.txt', 'hello\n'),
2664.12.1 by Daniel Watkins
tests.blackbox.test_merge now uses internals where appropriate.
109
            ('a/sub/c.txt', 'hello\n')])
110
        a_tree = self.make_branch_and_tree('a')
111
        a_tree.add(['sub', 'b.txt', 'sub/c.txt', 'sub/a.txt'])
112
        a_tree.commit(message='added a')
113
        b_tree = a_tree.bzrdir.sprout('b').open_workingtree()
114
        self.build_tree_contents([
115
            ('a/sub/a.txt', 'hello\nthere\n'),
2738.3.3 by Daniel Watkins
Minor reformatting per abentley's mailing list comments.
116
            ('a/b.txt', 'hello\nthere\n'),
2664.12.1 by Daniel Watkins
tests.blackbox.test_merge now uses internals where appropriate.
117
            ('a/sub/c.txt', 'hello\nthere\n')])
118
        a_tree.commit(message='Added there')
119
        os.remove('a/sub/a.txt')
120
        os.remove('a/sub/c.txt')
121
        os.rmdir('a/sub')
122
        os.remove('a/b.txt')
123
        a_tree.commit(message='Removed a.txt')
124
        self.build_tree_contents([
125
            ('b/sub/a.txt', 'hello\nsomething\n'),
2738.3.3 by Daniel Watkins
Minor reformatting per abentley's mailing list comments.
126
            ('b/b.txt', 'hello\nsomething\n'),
2664.12.1 by Daniel Watkins
tests.blackbox.test_merge now uses internals where appropriate.
127
            ('b/sub/c.txt', 'hello\nsomething\n')])
128
        b_tree.commit(message='Modified a.txt')
129
        os.chdir('b')
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
130
        self.run_bzr('merge ../a/', retcode=1)
2738.3.2 by Daniel Watkins
Modified as per abentley's comments.
131
        self.failUnlessExists('sub/a.txt.THIS')
132
        self.failUnlessExists('sub/a.txt.BASE')
1551.6.16 by Aaron Bentley
Merge from bzr.dev
133
        os.chdir('../a')
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
134
        self.run_bzr('merge ../b/', retcode=1)
2738.3.2 by Daniel Watkins
Modified as per abentley's comments.
135
        self.failUnlessExists('sub/a.txt.OTHER')
136
        self.failUnlessExists('sub/a.txt.BASE')
1551.6.16 by Aaron Bentley
Merge from bzr.dev
137
1614.2.5 by Olaf Conradi
Added testcase for bzr merge --remember.
138
    def test_merge_remember(self):
139
        """Merge changes from one branch to another and test parent location."""
1614.2.16 by Olaf Conradi
Modified blackbox test cases to use bzrlib API.
140
        tree_a = self.make_branch_and_tree('branch_a')
141
        branch_a = tree_a.branch
142
        self.build_tree(['branch_a/a'])
143
        tree_a.add('a')
144
        tree_a.commit('commit a')
145
        branch_b = branch_a.bzrdir.sprout('branch_b').open_branch()
146
        tree_b = branch_b.bzrdir.open_workingtree()
147
        branch_c = branch_a.bzrdir.sprout('branch_c').open_branch()
148
        tree_c = branch_c.bzrdir.open_workingtree()
149
        self.build_tree(['branch_a/b'])
150
        tree_a.add('b')
151
        tree_a.commit('commit b')
152
        self.build_tree(['branch_c/c'])
153
        tree_c.add('c')
154
        tree_c.commit('commit c')
1614.2.6 by Olaf Conradi
Add testcase for --remember when merge fails. It should still remember
155
        # reset parent
1614.2.16 by Olaf Conradi
Modified blackbox test cases to use bzrlib API.
156
        parent = branch_b.get_parent()
157
        branch_b.set_parent(None)
158
        self.assertEqual(None, branch_b.get_parent())
1614.2.6 by Olaf Conradi
Add testcase for --remember when merge fails. It should still remember
159
        # test merge for failure without parent set
1614.2.16 by Olaf Conradi
Modified blackbox test cases to use bzrlib API.
160
        os.chdir('branch_b')
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
161
        out = self.run_bzr('merge', retcode=3)
1614.2.5 by Olaf Conradi
Added testcase for bzr merge --remember.
162
        self.assertEquals(out,
1685.1.59 by Martin Pool
[broken] Fix up & refactor display of remembered urls to unescape properly
163
                ('','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
164
        # test implicit --remember when no parent set, this merge conflicts
1614.2.16 by Olaf Conradi
Modified blackbox test cases to use bzrlib API.
165
        self.build_tree(['d'])
166
        tree_b.add('d')
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
167
        out = self.run_bzr('merge ../branch_a', retcode=3)
1614.2.6 by Olaf Conradi
Add testcase for --remember when merge fails. It should still remember
168
        self.assertEquals(out,
169
                ('','bzr: ERROR: Working tree has uncommitted changes.\n'))
1614.2.16 by Olaf Conradi
Modified blackbox test cases to use bzrlib API.
170
        self.assertEquals(abspath(branch_b.get_parent()), abspath(parent))
1614.2.6 by Olaf Conradi
Add testcase for --remember when merge fails. It should still remember
171
        # test implicit --remember after resolving conflict
1614.2.16 by Olaf Conradi
Modified blackbox test cases to use bzrlib API.
172
        tree_b.commit('commit d')
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
173
        out, err = self.run_bzr('merge')
1685.1.38 by John Arbash Meinel
Fix merge_remember to use a complete path.
174
        
1685.1.45 by John Arbash Meinel
Moved url functions into bzrlib.urlutils
175
        base = urlutils.local_path_from_url(branch_a.base)
1685.1.59 by Martin Pool
[broken] Fix up & refactor display of remembered urls to unescape properly
176
        self.assertEquals(out, 'Merging from remembered location %s\n' % (base,))
1551.11.11 by Aaron Bentley
Get tests passing
177
        self.assertEquals(err, '+N  b\nAll changes applied successfully.\n')
1614.2.16 by Olaf Conradi
Modified blackbox test cases to use bzrlib API.
178
        self.assertEquals(abspath(branch_b.get_parent()), abspath(parent))
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
179
        # re-open tree as external run_bzr modified it
1614.2.16 by Olaf Conradi
Modified blackbox test cases to use bzrlib API.
180
        tree_b = branch_b.bzrdir.open_workingtree()
181
        tree_b.commit('merge branch_a')
1614.2.6 by Olaf Conradi
Add testcase for --remember when merge fails. It should still remember
182
        # test explicit --remember
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
183
        out, err = self.run_bzr('merge ../branch_c --remember')
1614.2.16 by Olaf Conradi
Modified blackbox test cases to use bzrlib API.
184
        self.assertEquals(out, '')
1551.11.11 by Aaron Bentley
Get tests passing
185
        self.assertEquals(err, '+N  c\nAll changes applied successfully.\n')
1614.2.16 by Olaf Conradi
Modified blackbox test cases to use bzrlib API.
186
        self.assertEquals(abspath(branch_b.get_parent()),
187
                          abspath(branch_c.bzrdir.root_transport.base))
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
188
        # re-open tree as external run_bzr modified it
1614.2.16 by Olaf Conradi
Modified blackbox test cases to use bzrlib API.
189
        tree_b = branch_b.bzrdir.open_workingtree()
190
        tree_b.commit('merge branch_c')
1185.82.22 by Aaron Bentley
Start getting changeset merging under test
191
1185.82.130 by Aaron Bentley
Rename changesets to revision bundles
192
    def test_merge_bundle(self):
1185.82.33 by Aaron Bentley
Strengthen tests
193
        from bzrlib.testament import Testament
1185.82.22 by Aaron Bentley
Start getting changeset merging under test
194
        tree_a = self.make_branch_and_tree('branch_a')
2664.12.1 by Daniel Watkins
tests.blackbox.test_merge now uses internals where appropriate.
195
        self.build_tree_contents([('branch_a/a', 'hello')])
1185.82.22 by Aaron Bentley
Start getting changeset merging under test
196
        tree_a.add('a')
197
        tree_a.commit('message')
198
199
        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.
200
        self.build_tree_contents([('branch_a/a', 'hey there')])
1185.82.23 by Aaron Bentley
Switch the fetcher
201
        tree_a.commit('message')
202
2664.12.1 by Daniel Watkins
tests.blackbox.test_merge now uses internals where appropriate.
203
        self.build_tree_contents([('branch_b/a', 'goodbye')])
1185.82.22 by Aaron Bentley
Start getting changeset merging under test
204
        tree_b.commit('message')
205
        os.chdir('branch_b')
2654.3.1 by Aaron Bentley
Rename submit to send, make -o required, support -o- for stdout
206
        self.run_bzr('bundle ../branch_a -o ../bundle')
1185.82.26 by Aaron Bentley
Get changeset merges closer to working
207
        os.chdir('../branch_a')
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
208
        self.run_bzr('merge ../bundle', retcode=1)
1908.7.6 by Robert Collins
Deprecate WorkingTree.last_revision.
209
        testament_a = Testament.from_revision(tree_a.branch.repository,
210
                                              tree_b.get_parent_ids()[0])
1185.82.33 by Aaron Bentley
Strengthen tests
211
        testament_b = Testament.from_revision(tree_b.branch.repository,
1908.7.6 by Robert Collins
Deprecate WorkingTree.last_revision.
212
                                              tree_b.get_parent_ids()[0])
1185.82.33 by Aaron Bentley
Strengthen tests
213
        self.assertEqualDiff(testament_a.as_text(),
214
                         testament_b.as_text())
1185.82.141 by Aaron Bentley
Ensure bzr works when you merge an already-merged bundle
215
        tree_a.set_conflicts(ConflictList())
216
        tree_a.commit('message')
217
        # 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
218
        output = self.run_bzr('merge ../bundle')[1]
1185.82.141 by Aaron Bentley
Ensure bzr works when you merge an already-merged bundle
219
        # but it does nothing
1852.10.3 by Robert Collins
Remove all uses of compare_trees and replace with Tree.changes_from throughout bzrlib.
220
        self.assertFalse(tree_a.changes_from(tree_a.basis_tree()).has_changed())
1185.82.142 by Aaron Bentley
Update for review comments
221
        self.assertEqual('Nothing to do.\n', output)
1910.1.1 by Aaron Bentley
Merge takes --uncommitted parameter
222
223
    def test_merge_uncommitted(self):
224
        """Check that merge --uncommitted behaves properly"""
225
        tree_a = self.make_branch_and_tree('a')
226
        self.build_tree(['a/file_1', 'a/file_2'])
227
        tree_a.add(['file_1', 'file_2'])
228
        tree_a.commit('commit 1')
229
        tree_b = tree_a.bzrdir.sprout('b').open_workingtree()
230
        self.failUnlessExists('b/file_1')
231
        tree_a.rename_one('file_1', 'file_i')
232
        tree_a.commit('commit 2')
233
        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)
234
        ## os.chdir('b')
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
235
        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)
236
        self.failUnlessExists('b/file_1')
237
        self.failUnlessExists('b/file_ii')
1910.1.1 by Aaron Bentley
Merge takes --uncommitted parameter
238
        tree_b.revert([])
2279.3.1 by mbp at sourcefrog
Add a -d option to push, pull, merge (ported from tags branch)
239
        self.run_bzr_error(('Cannot use --uncommitted and --revision',),
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
240
                           'merge /a --uncommitted -r1 -d b')
2149.2.1 by Jan Hudec
Option --pull for merge command.
241
242
    def pullable_branch(self):
243
        tree_a = self.make_branch_and_tree('a')
244
        self.build_tree(['a/file'])
245
        tree_a.add(['file'])
246
        self.id1 = tree_a.commit('commit 1')
2664.12.1 by Daniel Watkins
tests.blackbox.test_merge now uses internals where appropriate.
247
2149.2.1 by Jan Hudec
Option --pull for merge command.
248
        tree_b = self.make_branch_and_tree('b')
249
        tree_b.pull(tree_a.branch)
250
        file('b/file', 'wb').write('foo')
251
        self.id2 = tree_b.commit('commit 2')
252
253
    def test_merge_pull(self):
254
        self.pullable_branch()
255
        os.chdir('a')
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
256
        (out, err) = self.run_bzr('merge --pull ../b')
1551.15.67 by Aaron Bentley
Stop using _merge_helper for merging
257
        self.assertContainsRe(out, 'Now on revision 2\\.')
2149.2.1 by Jan Hudec
Option --pull for merge command.
258
        tree_a = WorkingTree.open('.')
259
        self.assertEqual([self.id2], tree_a.get_parent_ids())
1959.4.6 by Aaron Bentley
Ensure merge works across kind changes
260
261
    def test_merge_kind_change(self):
262
        tree_a = self.make_branch_and_tree('tree_a')
263
        self.build_tree_contents([('tree_a/file', 'content_1')])
264
        tree_a.add('file', 'file-id')
265
        tree_a.commit('added file')
266
        tree_b = tree_a.bzrdir.sprout('tree_b').open_workingtree()
267
        os.unlink('tree_a/file')
268
        self.build_tree(['tree_a/file/'])
269
        tree_a.commit('changed file to directory')
270
        os.chdir('tree_b')
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
271
        self.run_bzr('merge ../tree_a')
1959.4.6 by Aaron Bentley
Ensure merge works across kind changes
272
        self.assertEqual('directory', file_kind('file'))
273
        tree_b.revert([])
274
        self.assertEqual('file', file_kind('file'))
275
        self.build_tree_contents([('file', 'content_2')])
276
        tree_b.commit('content change')
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
277
        self.run_bzr('merge ../tree_a', retcode=1)
1959.4.6 by Aaron Bentley
Ensure merge works across kind changes
278
        self.assertEqual(tree_b.conflicts(),
279
                         [ContentsConflict('file', file_id='file-id')])
2520.4.109 by Aaron Bentley
start work on directive cherry-picking
280
281
    def test_directive_cherrypick(self):
282
        source = self.make_branch_and_tree('source')
283
        self.build_tree(['source/a'])
284
        source.add('a')
285
        source.commit('Added a', rev_id='rev1')
286
        self.build_tree(['source/b'])
287
        source.add('b')
288
        source.commit('Added b', rev_id='rev2')
289
        target = self.make_branch_and_tree('target')
290
        target.commit('empty commit')
2520.4.111 by Aaron Bentley
Ensure that damaged preview patches produce a warning in merge
291
        self.write_directive('directive', source.branch, 'target', 'rev2',
292
                             'rev1')
2520.4.110 by Aaron Bentley
Implement cherrypick support for merge directives
293
        self.run_bzr('merge -d target directive')
294
        self.failIfExists('target/a')
295
        self.failUnlessExists('target/b')
2520.4.111 by Aaron Bentley
Ensure that damaged preview patches produce a warning in merge
296
297
    def write_directive(self, filename, source, target, revision_id,
298
                        base_revision_id=None, mangle_patch=False):
299
        md = merge_directive.MergeDirective2.from_objects(
2520.4.112 by Aaron Bentley
Make cherry-pick merge directives possible
300
            source.repository, revision_id, 0, 0, target,
301
            base_revision_id=base_revision_id)
2520.4.111 by Aaron Bentley
Ensure that damaged preview patches produce a warning in merge
302
        if mangle_patch:
303
            md.patch = 'asdf\n'
304
        self.build_tree_contents([(filename, ''.join(md.to_lines()))])
305
306
    def test_directive_verify_warning(self):
307
        source = self.make_branch_and_tree('source')
308
        self.build_tree(['source/a'])
309
        source.add('a')
310
        source.commit('Added a', rev_id='rev1')
311
        target = self.make_branch_and_tree('target')
312
        target.commit('empty commit')
313
        self.write_directive('directive', source.branch, 'target', 'rev1')
314
        err = self.run_bzr('merge -d target directive')[1]
315
        self.assertNotContainsRe(err, 'Preview patch does not match changes')
316
        target.revert([])
317
        self.write_directive('directive', source.branch, 'target', 'rev1',
318
                             mangle_patch=True)
319
        err = self.run_bzr('merge -d target directive')[1]
2520.7.1 by Aaron Bentley
Reactivate patch verification
320
        self.assertContainsRe(err, 'Preview patch does not match changes')
1551.15.66 by Aaron Bentley
Improve behavior with revision ids
321
322
    def test_merge_arbitrary(self):
323
        target = self.make_branch_and_tree('target')
324
        target.commit('empty')
325
        # We need a revision that has no integer revno
326
        branch_a = target.bzrdir.sprout('branch_a').open_workingtree()
327
        self.build_tree(['branch_a/file1'])
328
        branch_a.add('file1')
329
        branch_a.commit('added file1', rev_id='rev2a')
330
        branch_b = target.bzrdir.sprout('branch_b').open_workingtree()
331
        self.build_tree(['branch_b/file2'])
332
        branch_b.add('file2')
333
        branch_b.commit('added file2', rev_id='rev2b')
334
        branch_b.merge_from_branch(branch_a.branch)
335
        self.failUnlessExists('branch_b/file1')
336
        branch_b.commit('merged branch_a', rev_id='rev3b')
337
338
        # It works if the revid has an interger revno
339
        self.run_bzr('merge -d target -r revid:rev2a branch_a')
340
        self.failUnlessExists('target/file1')
341
        self.failIfExists('target/file2')
342
        target.revert([])
343
344
        # It should work if the revid has no integer revno
345
        self.run_bzr('merge -d target -r revid:rev2a branch_b')
346
        self.failUnlessExists('target/file1')
347
        self.failIfExists('target/file2')