~bzr-pqm/bzr/bzr.dev

4763.2.4 by John Arbash Meinel
merge bzr.2.1 in preparation for NEWS entry.
1
# Copyright (C) 2005-2010 Canonical Ltd
1887.1.1 by Adeodato Simó
Do not separate paragraphs in the copyright statement with blank lines,
2
#
1185.50.5 by John Arbash Meinel
pull --overwrite should always overwrite, not just if diverged. (Test case from Robey Pointer)
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.
1887.1.1 by Adeodato Simó
Do not separate paragraphs in the copyright statement with blank lines,
7
#
1185.50.5 by John Arbash Meinel
pull --overwrite should always overwrite, not just if diverged. (Test case from Robey Pointer)
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.
1887.1.1 by Adeodato Simó
Do not separate paragraphs in the copyright statement with blank lines,
12
#
1185.50.5 by John Arbash Meinel
pull --overwrite should always overwrite, not just if diverged. (Test case from Robey Pointer)
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
1185.50.5 by John Arbash Meinel
pull --overwrite should always overwrite, not just if diverged. (Test case from Robey Pointer)
16
17
1666.1.5 by Robert Collins
Merge bound branch test performance improvements.
18
"""Black-box tests for bzr pull."""
1185.50.5 by John Arbash Meinel
pull --overwrite should always overwrite, not just if diverged. (Test case from Robey Pointer)
19
20
import os
21
import sys
22
4634.124.3 by Martin Pool
Give a warning from pulling across the network from a different format
23
from bzrlib import (
24
    debug,
25
    remote,
26
    urlutils,
27
    )
28
1185.50.5 by John Arbash Meinel
pull --overwrite should always overwrite, not just if diverged. (Test case from Robey Pointer)
29
from bzrlib.branch import Branch
3251.4.10 by Aaron Bentley
Pull of launchpad locations works (abentley, #181945)
30
from bzrlib.directory_service import directories
2738.2.5 by Daniel Watkins
Now use pathjoin in test_pull.
31
from bzrlib.osutils import pathjoin
5651.5.3 by Andrew Bennetts
Use new fixture in more tests.
32
from bzrlib.tests import (
33
    fixtures,
34
    TestCaseWithTransport,
35
    )
1614.2.16 by Olaf Conradi
Modified blackbox test cases to use bzrlib API.
36
from bzrlib.uncommit import uncommit
2664.11.2 by Daniel Watkins
tests.blackbox.test_pull now uses internals where appropriate.
37
from bzrlib.workingtree import WorkingTree
1614.2.8 by Olaf Conradi
Added testcases for using pull with --remember. Moved remember code to
38
1185.50.5 by John Arbash Meinel
pull --overwrite should always overwrite, not just if diverged. (Test case from Robey Pointer)
39
5283.4.5 by Martin Pool
Update remaining subclasses of ExternalBase
40
class TestPull(TestCaseWithTransport):
1185.50.7 by John Arbash Meinel
Fix broken test from refactoring blackbox/test_pull
41
2664.11.2 by Daniel Watkins
tests.blackbox.test_pull now uses internals where appropriate.
42
    def example_branch(self, path='.'):
43
        tree = self.make_branch_and_tree(path)
44
        self.build_tree_contents([
2738.2.5 by Daniel Watkins
Now use pathjoin in test_pull.
45
            (pathjoin(path, 'hello'),   'foo'),
46
            (pathjoin(path, 'goodbye'), 'baz')])
2664.11.2 by Daniel Watkins
tests.blackbox.test_pull now uses internals where appropriate.
47
        tree.add('hello')
48
        tree.commit(message='setup')
49
        tree.add('goodbye')
50
        tree.commit(message='setup')
51
        return tree
1185.50.5 by John Arbash Meinel
pull --overwrite should always overwrite, not just if diverged. (Test case from Robey Pointer)
52
53
    def test_pull(self):
54
        """Pull changes from one branch to another."""
2664.11.2 by Daniel Watkins
tests.blackbox.test_pull now uses internals where appropriate.
55
        a_tree = self.example_branch('a')
1185.50.5 by John Arbash Meinel
pull --overwrite should always overwrite, not just if diverged. (Test case from Robey Pointer)
56
        os.chdir('a')
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
57
        self.run_bzr('pull', retcode=3)
58
        self.run_bzr('missing', retcode=3)
59
        self.run_bzr('missing .')
60
        self.run_bzr('missing')
1666.1.5 by Robert Collins
Merge bound branch test performance improvements.
61
        # this will work on windows because we check for the same branch
62
        # in pull - if it fails, it is a regression
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
63
        self.run_bzr('pull')
64
        self.run_bzr('pull /', retcode=3)
1185.31.31 by John Arbash Meinel
avoiding 'bzr pull .' means all tests pass under cygwin
65
        if sys.platform not in ('win32', 'cygwin'):
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
66
            self.run_bzr('pull')
1185.50.5 by John Arbash Meinel
pull --overwrite should always overwrite, not just if diverged. (Test case from Robey Pointer)
67
68
        os.chdir('..')
2664.11.2 by Daniel Watkins
tests.blackbox.test_pull now uses internals where appropriate.
69
        b_tree = a_tree.bzrdir.sprout('b').open_workingtree()
1185.50.5 by John Arbash Meinel
pull --overwrite should always overwrite, not just if diverged. (Test case from Robey Pointer)
70
        os.chdir('b')
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
71
        self.run_bzr('pull')
1185.50.5 by John Arbash Meinel
pull --overwrite should always overwrite, not just if diverged. (Test case from Robey Pointer)
72
        os.mkdir('subdir')
2664.11.2 by Daniel Watkins
tests.blackbox.test_pull now uses internals where appropriate.
73
        b_tree.add('subdir')
74
        b_tree.commit(message='blah', allow_pointless=True)
75
76
        os.chdir('..')
77
        a = Branch.open('a')
78
        b = Branch.open('b')
2738.2.4 by Daniel Watkins
Changed assertEquals to assertEqual.
79
        self.assertEqual(a.revision_history(), b.revision_history()[:-1])
2664.11.2 by Daniel Watkins
tests.blackbox.test_pull now uses internals where appropriate.
80
81
        os.chdir('a')
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
82
        self.run_bzr('pull ../b')
2738.2.4 by Daniel Watkins
Changed assertEquals to assertEqual.
83
        self.assertEqual(a.revision_history(), b.revision_history())
2664.11.2 by Daniel Watkins
tests.blackbox.test_pull now uses internals where appropriate.
84
        a_tree.commit(message='blah2', allow_pointless=True)
85
        b_tree.commit(message='blah3', allow_pointless=True)
1185.50.5 by John Arbash Meinel
pull --overwrite should always overwrite, not just if diverged. (Test case from Robey Pointer)
86
        # no overwrite
2664.11.2 by Daniel Watkins
tests.blackbox.test_pull now uses internals where appropriate.
87
        os.chdir('../b')
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
88
        self.run_bzr('pull ../a', retcode=3)
1185.50.5 by John Arbash Meinel
pull --overwrite should always overwrite, not just if diverged. (Test case from Robey Pointer)
89
        os.chdir('..')
2664.11.2 by Daniel Watkins
tests.blackbox.test_pull now uses internals where appropriate.
90
        b_tree.bzrdir.sprout('overwriteme')
1185.50.5 by John Arbash Meinel
pull --overwrite should always overwrite, not just if diverged. (Test case from Robey Pointer)
91
        os.chdir('overwriteme')
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
92
        self.run_bzr('pull --overwrite ../a')
1185.50.5 by John Arbash Meinel
pull --overwrite should always overwrite, not just if diverged. (Test case from Robey Pointer)
93
        overwritten = Branch.open('.')
94
        self.assertEqual(overwritten.revision_history(),
95
                         a.revision_history())
2738.2.6 by Daniel Watkins
Now use internal merging.
96
        a_tree.merge_from_branch(b_tree.branch)
2664.11.2 by Daniel Watkins
tests.blackbox.test_pull now uses internals where appropriate.
97
        a_tree.commit(message="blah4", allow_pointless=True)
1185.50.5 by John Arbash Meinel
pull --overwrite should always overwrite, not just if diverged. (Test case from Robey Pointer)
98
        os.chdir('../b/subdir')
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
99
        self.run_bzr('pull ../../a')
2738.2.4 by Daniel Watkins
Changed assertEquals to assertEqual.
100
        self.assertEqual(a.revision_history()[-1], b.revision_history()[-1])
2664.11.2 by Daniel Watkins
tests.blackbox.test_pull now uses internals where appropriate.
101
        sub_tree = WorkingTree.open_containing('.')[0]
102
        sub_tree.commit(message="blah5", allow_pointless=True)
103
        sub_tree.commit(message="blah6", allow_pointless=True)
1185.50.5 by John Arbash Meinel
pull --overwrite should always overwrite, not just if diverged. (Test case from Robey Pointer)
104
        os.chdir('..')
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
105
        self.run_bzr('pull ../a')
1185.50.5 by John Arbash Meinel
pull --overwrite should always overwrite, not just if diverged. (Test case from Robey Pointer)
106
        os.chdir('../a')
2664.11.2 by Daniel Watkins
tests.blackbox.test_pull now uses internals where appropriate.
107
        a_tree.commit(message="blah7", allow_pointless=True)
108
        a_tree.merge_from_branch(b_tree.branch)
109
        a_tree.commit(message="blah8", allow_pointless=True)
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
110
        self.run_bzr('pull ../b')
111
        self.run_bzr('pull ../b')
1185.50.5 by John Arbash Meinel
pull --overwrite should always overwrite, not just if diverged. (Test case from Robey Pointer)
112
2220.2.9 by Martin Pool
Add specific tests for push -d and pull -d
113
    def test_pull_dash_d(self):
2664.11.2 by Daniel Watkins
tests.blackbox.test_pull now uses internals where appropriate.
114
        self.example_branch('a')
115
        self.make_branch_and_tree('b')
116
        self.make_branch_and_tree('c')
2220.2.9 by Martin Pool
Add specific tests for push -d and pull -d
117
        # pull into that branch
2664.11.2 by Daniel Watkins
tests.blackbox.test_pull now uses internals where appropriate.
118
        self.run_bzr('pull -d b a')
2220.2.9 by Martin Pool
Add specific tests for push -d and pull -d
119
        # pull into a branch specified by a url
2664.11.2 by Daniel Watkins
tests.blackbox.test_pull now uses internals where appropriate.
120
        c_url = urlutils.local_path_to_url('c')
2220.2.9 by Martin Pool
Add specific tests for push -d and pull -d
121
        self.assertStartsWith(c_url, 'file://')
2738.2.3 by Daniel Watkins
Fixed jam's concerns.
122
        self.run_bzr(['pull', '-d', c_url, 'a'])
2220.2.9 by Martin Pool
Add specific tests for push -d and pull -d
123
1185.76.2 by Erik Bågfors
test for pull --revision
124
    def test_pull_revision(self):
125
        """Pull some changes from one branch to another."""
2664.11.2 by Daniel Watkins
tests.blackbox.test_pull now uses internals where appropriate.
126
        a_tree = self.example_branch('a')
127
        self.build_tree_contents([
128
            ('a/hello2',   'foo'),
129
            ('a/goodbye2', 'baz')])
130
        a_tree.add('hello2')
131
        a_tree.commit(message="setup")
132
        a_tree.add('goodbye2')
133
        a_tree.commit(message="setup")
134
135
        b_tree = a_tree.bzrdir.sprout('b',
136
                   revision_id=a_tree.branch.get_rev_id(1)).open_workingtree()
1185.76.2 by Erik Bågfors
test for pull --revision
137
        os.chdir('b')
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
138
        self.run_bzr('pull -r 2')
1185.76.2 by Erik Bågfors
test for pull --revision
139
        a = Branch.open('../a')
140
        b = Branch.open('.')
2738.2.4 by Daniel Watkins
Changed assertEquals to assertEqual.
141
        self.assertEqual(a.revno(),4)
142
        self.assertEqual(b.revno(),2)
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
143
        self.run_bzr('pull -r 3')
2738.2.4 by Daniel Watkins
Changed assertEquals to assertEqual.
144
        self.assertEqual(b.revno(),3)
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
145
        self.run_bzr('pull -r 4')
2738.2.4 by Daniel Watkins
Changed assertEquals to assertEqual.
146
        self.assertEqual(a.revision_history(), b.revision_history())
1185.76.2 by Erik Bågfors
test for pull --revision
147
5535.3.28 by Andrew Bennetts
Implement fetching tags during branch pull. Needs more tests.
148
    def test_pull_tags(self):
149
        """Tags are updated by pull, and revisions named in those tags are
150
        fetched.
151
        """
152
        # Make a source, sprout a target off it
153
        builder = self.make_branch_builder('source')
5651.5.3 by Andrew Bennetts
Use new fixture in more tests.
154
        source = fixtures.build_branch_with_non_ancestral_rev(builder)
5535.3.28 by Andrew Bennetts
Implement fetching tags during branch pull. Needs more tests.
155
        target_bzrdir = source.bzrdir.sprout('target')
156
        source.tags.set_tag('tag-a', 'rev-2')
157
        # Pull from source
158
        self.run_bzr('pull -d target source')
159
        target = target_bzrdir.open_branch()
160
        # The tag is present, and so is its revision.
161
        self.assertEqual('rev-2', target.tags.lookup_tag('tag-a'))
162
        target.repository.get_revision('rev-2')
163
1185.50.7 by John Arbash Meinel
Fix broken test from refactoring blackbox/test_pull
164
    def test_overwrite_uptodate(self):
1185.50.5 by John Arbash Meinel
pull --overwrite should always overwrite, not just if diverged. (Test case from Robey Pointer)
165
        # Make sure pull --overwrite overwrites
166
        # even if the target branch has merged
167
        # everything already.
2664.11.2 by Daniel Watkins
tests.blackbox.test_pull now uses internals where appropriate.
168
        a_tree = self.make_branch_and_tree('a')
169
        self.build_tree_contents([('a/foo', 'original\n')])
170
        a_tree.add('foo')
171
        a_tree.commit(message='initial commit')
172
173
        b_tree = a_tree.bzrdir.sprout('b').open_workingtree()
174
175
        self.build_tree_contents([('a/foo', 'changed\n')])
176
        a_tree.commit(message='later change')
177
178
        self.build_tree_contents([('a/foo', 'a third change')])
179
        a_tree.commit(message='a third change')
180
2738.2.1 by Daniel Watkins
Merged original fixes.
181
        rev_history_a = a_tree.branch.revision_history()
182
        self.assertEqual(len(rev_history_a), 3)
2664.11.2 by Daniel Watkins
tests.blackbox.test_pull now uses internals where appropriate.
183
184
        b_tree.merge_from_branch(a_tree.branch)
185
        b_tree.commit(message='merge')
186
187
        self.assertEqual(len(b_tree.branch.revision_history()), 2)
188
189
        os.chdir('b')
190
        self.run_bzr('pull --overwrite ../a')
2738.2.1 by Daniel Watkins
Merged original fixes.
191
        rev_history_b = b_tree.branch.revision_history()
192
        self.assertEqual(len(rev_history_b), 3)
1185.50.5 by John Arbash Meinel
pull --overwrite should always overwrite, not just if diverged. (Test case from Robey Pointer)
193
194
        self.assertEqual(rev_history_b, rev_history_a)
195
1185.50.7 by John Arbash Meinel
Fix broken test from refactoring blackbox/test_pull
196
    def test_overwrite_children(self):
1185.50.5 by John Arbash Meinel
pull --overwrite should always overwrite, not just if diverged. (Test case from Robey Pointer)
197
        # Make sure pull --overwrite sets the revision-history
198
        # to be identical to the pull source, even if we have convergence
2664.11.2 by Daniel Watkins
tests.blackbox.test_pull now uses internals where appropriate.
199
        a_tree = self.make_branch_and_tree('a')
200
        self.build_tree_contents([('a/foo', 'original\n')])
201
        a_tree.add('foo')
202
        a_tree.commit(message='initial commit')
203
204
        b_tree = a_tree.bzrdir.sprout('b').open_workingtree()
205
206
        self.build_tree_contents([('a/foo', 'changed\n')])
207
        a_tree.commit(message='later change')
208
209
        self.build_tree_contents([('a/foo', 'a third change')])
210
        a_tree.commit(message='a third change')
211
212
        self.assertEqual(len(a_tree.branch.revision_history()), 3)
213
214
        b_tree.merge_from_branch(a_tree.branch)
215
        b_tree.commit(message='merge')
216
217
        self.assertEqual(len(b_tree.branch.revision_history()), 2)
218
219
        self.build_tree_contents([('a/foo', 'a fourth change\n')])
220
        a_tree.commit(message='a fourth change')
221
2738.2.1 by Daniel Watkins
Merged original fixes.
222
        rev_history_a = a_tree.branch.revision_history()
223
        self.assertEqual(len(rev_history_a), 4)
1185.50.5 by John Arbash Meinel
pull --overwrite should always overwrite, not just if diverged. (Test case from Robey Pointer)
224
225
        # With convergence, we could just pull over the
226
        # new change, but with --overwrite, we want to switch our history
2664.11.2 by Daniel Watkins
tests.blackbox.test_pull now uses internals where appropriate.
227
        os.chdir('b')
228
        self.run_bzr('pull --overwrite ../a')
2738.2.1 by Daniel Watkins
Merged original fixes.
229
        rev_history_b = b_tree.branch.revision_history()
230
        self.assertEqual(len(rev_history_b), 4)
1185.50.5 by John Arbash Meinel
pull --overwrite should always overwrite, not just if diverged. (Test case from Robey Pointer)
231
232
        self.assertEqual(rev_history_b, rev_history_a)
233
1614.2.8 by Olaf Conradi
Added testcases for using pull with --remember. Moved remember code to
234
    def test_pull_remember(self):
235
        """Pull changes from one branch to another and test parent location."""
1614.2.16 by Olaf Conradi
Modified blackbox test cases to use bzrlib API.
236
        transport = self.get_transport()
237
        tree_a = self.make_branch_and_tree('branch_a')
238
        branch_a = tree_a.branch
239
        self.build_tree(['branch_a/a'])
240
        tree_a.add('a')
241
        tree_a.commit('commit a')
1666.1.4 by Robert Collins
* 'Metadir' is now the default disk format. This improves behaviour in
242
        tree_b = branch_a.bzrdir.sprout('branch_b').open_workingtree()
243
        branch_b = tree_b.branch
244
        tree_c = branch_a.bzrdir.sprout('branch_c').open_workingtree()
245
        branch_c = tree_c.branch
1614.2.16 by Olaf Conradi
Modified blackbox test cases to use bzrlib API.
246
        self.build_tree(['branch_a/b'])
247
        tree_a.add('b')
248
        tree_a.commit('commit b')
1614.2.8 by Olaf Conradi
Added testcases for using pull with --remember. Moved remember code to
249
        # reset parent
1614.2.16 by Olaf Conradi
Modified blackbox test cases to use bzrlib API.
250
        parent = branch_b.get_parent()
251
        branch_b.set_parent(None)
252
        self.assertEqual(None, branch_b.get_parent())
1614.2.8 by Olaf Conradi
Added testcases for using pull with --remember. Moved remember code to
253
        # test pull for failure without parent set
1614.2.16 by Olaf Conradi
Modified blackbox test cases to use bzrlib API.
254
        os.chdir('branch_b')
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
255
        out = self.run_bzr('pull', retcode=3)
2738.2.4 by Daniel Watkins
Changed assertEquals to assertEqual.
256
        self.assertEqual(out,
1614.2.8 by Olaf Conradi
Added testcases for using pull with --remember. Moved remember code to
257
                ('','bzr: ERROR: No pull location known or specified.\n'))
258
        # test implicit --remember when no parent set, this pull conflicts
1614.2.16 by Olaf Conradi
Modified blackbox test cases to use bzrlib API.
259
        self.build_tree(['d'])
260
        tree_b.add('d')
261
        tree_b.commit('commit d')
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
262
        out = self.run_bzr('pull ../branch_a', retcode=3)
2738.2.4 by Daniel Watkins
Changed assertEquals to assertEqual.
263
        self.assertEqual(out,
2221.5.13 by Dmitry Vasiliev
Fixed expected message in test
264
                ('','bzr: ERROR: These branches have diverged.'
4297.3.3 by Jelmer Vernooij
Fix pull --remember test.
265
                    ' Use the missing command to see how.\n'
266
                    'Use the merge command to reconcile them.\n'))
2738.2.4 by Daniel Watkins
Changed assertEquals to assertEqual.
267
        self.assertEqual(branch_b.get_parent(), parent)
1614.2.8 by Olaf Conradi
Added testcases for using pull with --remember. Moved remember code to
268
        # test implicit --remember after resolving previous failure
1614.2.16 by Olaf Conradi
Modified blackbox test cases to use bzrlib API.
269
        uncommit(branch=branch_b, tree=tree_b)
270
        transport.delete('branch_b/d')
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
271
        self.run_bzr('pull')
2738.2.4 by Daniel Watkins
Changed assertEquals to assertEqual.
272
        self.assertEqual(branch_b.get_parent(), parent)
1614.2.8 by Olaf Conradi
Added testcases for using pull with --remember. Moved remember code to
273
        # test explicit --remember
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
274
        self.run_bzr('pull ../branch_c --remember')
2738.2.4 by Daniel Watkins
Changed assertEquals to assertEqual.
275
        self.assertEqual(branch_b.get_parent(),
1685.1.19 by John Arbash Meinel
pull/merge/branch/missing should all save the absolute path to the other branch, not the relative one
276
                          branch_c.bzrdir.root_transport.base)
1711.3.3 by John Arbash Meinel
Allow pull to use a bundle as a target,
277
278
    def test_pull_bundle(self):
279
        from bzrlib.testament import Testament
280
        # Build up 2 trees and prepare for a pull
281
        tree_a = self.make_branch_and_tree('branch_a')
282
        f = open('branch_a/a', 'wb')
283
        f.write('hello')
284
        f.close()
285
        tree_a.add('a')
286
        tree_a.commit('message')
287
288
        tree_b = tree_a.bzrdir.sprout('branch_b').open_workingtree()
289
290
        # Make a change to 'a' that 'b' can pull
291
        f = open('branch_a/a', 'wb')
292
        f.write('hey there')
293
        f.close()
294
        tree_a.commit('message')
295
296
        # Create the bundle for 'b' to pull
297
        os.chdir('branch_a')
2654.3.1 by Aaron Bentley
Rename submit to send, make -o required, support -o- for stdout
298
        self.run_bzr('bundle ../branch_b -o ../bundle')
1711.3.3 by John Arbash Meinel
Allow pull to use a bundle as a target,
299
300
        os.chdir('../branch_b')
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
301
        out, err = self.run_bzr('pull ../bundle')
2220.2.39 by Martin Pool
Pull also merges tags and warns if they conflict
302
        self.assertEqual(out,
303
                         'Now on revision 2.\n')
304
        self.assertEqual(err,
305
                ' M  a\nAll changes applied successfully.\n')
1711.3.3 by John Arbash Meinel
Allow pull to use a bundle as a target,
306
307
        self.assertEqualDiff(tree_a.branch.revision_history(),
308
                             tree_b.branch.revision_history())
309
1908.7.6 by Robert Collins
Deprecate WorkingTree.last_revision.
310
        testament_a = Testament.from_revision(tree_a.branch.repository,
311
                                              tree_a.get_parent_ids()[0])
1711.3.3 by John Arbash Meinel
Allow pull to use a bundle as a target,
312
        testament_b = Testament.from_revision(tree_b.branch.repository,
1908.7.6 by Robert Collins
Deprecate WorkingTree.last_revision.
313
                                              tree_b.get_parent_ids()[0])
1711.3.3 by John Arbash Meinel
Allow pull to use a bundle as a target,
314
        self.assertEqualDiff(testament_a.as_text(),
315
                             testament_b.as_text())
316
317
        # it is legal to attempt to pull an already-merged bundle
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
318
        out, err = self.run_bzr('pull ../bundle')
2220.2.39 by Martin Pool
Pull also merges tags and warns if they conflict
319
        self.assertEqual(err, '')
320
        self.assertEqual(out, 'No revisions to pull.\n')
1551.17.2 by Aaron Bentley
Stop showing deltas in pull -v output
321
322
    def test_pull_verbose_no_files(self):
323
        """Pull --verbose should not list modified files"""
324
        tree_a = self.make_branch_and_tree('tree_a')
325
        self.build_tree(['tree_a/foo'])
326
        tree_a.add('foo')
327
        tree_a.commit('bar')
328
        tree_b = self.make_branch_and_tree('tree_b')
329
        out = self.run_bzr('pull --verbose -d tree_b tree_a')[0]
330
        self.assertContainsRe(out, 'bar')
331
        self.assertNotContainsRe(out, 'added:')
332
        self.assertNotContainsRe(out, 'foo')
3200.1.1 by James Westby
Make pull --quiet more quiet. Fixes #185907.
333
334
    def test_pull_quiet(self):
335
        """Check that bzr pull --quiet does not print anything"""
336
        tree_a = self.make_branch_and_tree('tree_a')
337
        self.build_tree(['tree_a/foo'])
338
        tree_a.add('foo')
3200.1.2 by James Westby
Check that the pull succeeds even when printing nothing.
339
        revision_id = tree_a.commit('bar')
3200.1.1 by James Westby
Make pull --quiet more quiet. Fixes #185907.
340
        tree_b = tree_a.bzrdir.sprout('tree_b').open_workingtree()
341
        out, err = self.run_bzr('pull --quiet -d tree_b')
342
        self.assertEqual(out, '')
343
        self.assertEqual(err, '')
3200.1.2 by James Westby
Check that the pull succeeds even when printing nothing.
344
        self.assertEqual(tree_b.last_revision(), revision_id)
3200.1.1 by James Westby
Make pull --quiet more quiet. Fixes #185907.
345
        self.build_tree(['tree_a/moo'])
346
        tree_a.add('moo')
3200.1.2 by James Westby
Check that the pull succeeds even when printing nothing.
347
        revision_id = tree_a.commit('quack')
3200.1.1 by James Westby
Make pull --quiet more quiet. Fixes #185907.
348
        out, err = self.run_bzr('pull --quiet -d tree_b')
349
        self.assertEqual(out, '')
350
        self.assertEqual(err, '')
3200.1.2 by James Westby
Check that the pull succeeds even when printing nothing.
351
        self.assertEqual(tree_b.last_revision(), revision_id)
3251.4.10 by Aaron Bentley
Pull of launchpad locations works (abentley, #181945)
352
3251.4.12 by Aaron Bentley
Updates from review
353
    def test_pull_from_directory_service(self):
3251.4.10 by Aaron Bentley
Pull of launchpad locations works (abentley, #181945)
354
        source = self.make_branch_and_tree('source')
355
        source.commit('commit 1')
356
        target = source.bzrdir.sprout('target').open_workingtree()
357
        source_last = source.commit('commit 2')
358
        class FooService(object):
359
            """A directory service that always returns source"""
360
361
            def look_up(self, name, url):
362
                return 'source'
3251.4.12 by Aaron Bentley
Updates from review
363
        directories.register('foo:', FooService, 'Testing directory service')
4985.2.1 by Vincent Ladeuil
Deploy addAttrCleanup on the whole test suite.
364
        self.addCleanup(directories.remove, 'foo:')
3251.4.10 by Aaron Bentley
Pull of launchpad locations works (abentley, #181945)
365
        self.run_bzr('pull foo:bar -d target')
366
        self.assertEqual(source_last, target.last_revision())
3848.1.1 by Aaron Bentley
Use default log format in pull -v
367
368
    def test_pull_verbose_defaults_to_long(self):
369
        tree = self.example_branch('source')
370
        target = self.make_branch_and_tree('target')
371
        out = self.run_bzr('pull -v source -d target')[0]
372
        self.assertContainsRe(out,
373
                              r'revno: 1\ncommitter: .*\nbranch nick: source')
3848.1.5 by Aaron Bentley
Updates from review
374
        self.assertNotContainsRe(out, r'\n {4}1 .*\n {6}setup\n')
3848.1.1 by Aaron Bentley
Use default log format in pull -v
375
376
    def test_pull_verbose_uses_default_log(self):
377
        tree = self.example_branch('source')
378
        target = self.make_branch_and_tree('target')
3848.1.2 by Aaron Bentley
Make test stricter
379
        target_config = target.branch.get_config()
380
        target_config.set_user_option('log_format', 'short')
3848.1.1 by Aaron Bentley
Use default log format in pull -v
381
        out = self.run_bzr('pull -v source -d target')[0]
382
        self.assertContainsRe(out, r'\n {4}1 .*\n {6}setup\n')
3848.1.5 by Aaron Bentley
Updates from review
383
        self.assertNotContainsRe(
384
            out, r'revno: 1\ncommitter: .*\nbranch nick: source')
4419.1.1 by Andrew Bennetts
Failing blackbox acceptance test for bug 380314.
385
386
    def test_pull_smart_stacked_streaming_acceptance(self):
4419.1.6 by Andrew Bennetts
Add comments requested by Martin's review.
387
        """'bzr pull -r 123' works on stacked, smart branches, even when the
388
        revision specified by the revno is only present in the fallback
389
        repository.
390
391
        See <https://launchpad.net/bugs/380314>
392
        """
4419.1.1 by Andrew Bennetts
Failing blackbox acceptance test for bug 380314.
393
        self.setup_smart_server_with_call_log()
4419.2.4 by Andrew Bennetts
Add Repository.get_rev_id_for_revno RPC, removes VFS calls from 'pull -r 123' case.
394
        # Make a stacked-on branch with two commits so that the
395
        # revision-history can't be determined just by looking at the parent
396
        # field in the revision in the stacked repo.
4419.1.1 by Andrew Bennetts
Failing blackbox acceptance test for bug 380314.
397
        parent = self.make_branch_and_tree('parent', format='1.9')
398
        parent.commit(message='first commit')
4419.2.4 by Andrew Bennetts
Add Repository.get_rev_id_for_revno RPC, removes VFS calls from 'pull -r 123' case.
399
        parent.commit(message='second commit')
4419.1.1 by Andrew Bennetts
Failing blackbox acceptance test for bug 380314.
400
        local = parent.bzrdir.sprout('local').open_workingtree()
401
        local.commit(message='local commit')
402
        local.branch.create_clone_on_transport(
403
            self.get_transport('stacked'), stacked_on=self.get_url('parent'))
404
        empty = self.make_branch_and_tree('empty', format='1.9')
405
        self.reset_smart_call_log()
406
        self.run_bzr(['pull', '-r', '1', self.get_url('stacked')],
407
            working_dir='empty')
408
        # This figure represent the amount of work to perform this use case. It
409
        # is entirely ok to reduce this number if a test fails due to rpc_count
410
        # being too low. If rpc_count increases, more network roundtrips have
411
        # become necessary for this use case. Please do not adjust this number
412
        # upwards without agreement from bzr's network support maintainers.
4419.2.4 by Andrew Bennetts
Add Repository.get_rev_id_for_revno RPC, removes VFS calls from 'pull -r 123' case.
413
        self.assertLength(18, self.hpss_calls)
4419.1.1 by Andrew Bennetts
Failing blackbox acceptance test for bug 380314.
414
        remote = Branch.open('stacked')
415
        self.assertEndsWith(remote.get_stacked_on_url(), '/parent')
4634.124.2 by Martin Pool
Add a test and news for warning about local cross-forrmat fetch
416
    
417
    def test_pull_cross_format_warning(self):
418
        """You get a warning for probably slow cross-format pulls.
419
        """
4634.124.3 by Martin Pool
Give a warning from pulling across the network from a different format
420
        # this is assumed to be going through InterDifferingSerializer
4634.124.2 by Martin Pool
Add a test and news for warning about local cross-forrmat fetch
421
        from_tree = self.make_branch_and_tree('from', format='2a')
422
        to_tree = self.make_branch_and_tree('to', format='1.14-rich-root')
423
        from_tree.commit(message='first commit')
424
        out, err = self.run_bzr(['pull', '-d', 'to', 'from'])
425
        self.assertContainsRe(err,
4634.124.4 by Martin Pool
Centralize warning about cross-format fetch into UIFactory
426
            "(?m)Doing on-the-fly conversion")
4634.124.3 by Martin Pool
Give a warning from pulling across the network from a different format
427
428
    def test_pull_cross_format_warning_no_IDS(self):
429
        """You get a warning for probably slow cross-format pulls.
430
        """
431
        # this simulates what would happen across the network, where
432
        # interdifferingserializer is not active
433
434
        debug.debug_flags.add('IDS_never')
435
        # TestCase take care of restoring them
436
437
        from_tree = self.make_branch_and_tree('from', format='2a')
438
        to_tree = self.make_branch_and_tree('to', format='1.14-rich-root')
439
        from_tree.commit(message='first commit')
440
        out, err = self.run_bzr(['pull', '-d', 'to', 'from'])
441
        self.assertContainsRe(err,
4634.124.4 by Martin Pool
Centralize warning about cross-format fetch into UIFactory
442
            "(?m)Doing on-the-fly conversion")
4634.124.3 by Martin Pool
Give a warning from pulling across the network from a different format
443
444
    def test_pull_cross_format_from_network(self):
445
        self.setup_smart_server_with_call_log()
446
        from_tree = self.make_branch_and_tree('from', format='2a')
447
        to_tree = self.make_branch_and_tree('to', format='1.14-rich-root')
448
        self.assertIsInstance(from_tree.branch, remote.RemoteBranch)
449
        from_tree.commit(message='first commit')
450
        out, err = self.run_bzr(['pull', '-d', 'to',
451
            from_tree.branch.bzrdir.root_transport.base])
452
        self.assertContainsRe(err,
4634.124.4 by Martin Pool
Centralize warning about cross-format fetch into UIFactory
453
            "(?m)Doing on-the-fly conversion")
4988.9.2 by Jelmer Vernooij
Add warning when attempting to fetch into experimental formats.
454
455
    def test_pull_to_experimental_format_warning(self):
456
        """You get a warning for pulling into experimental formats.
457
        """
458
        from_tree = self.make_branch_and_tree('from', format='development-subtree')
459
        to_tree = self.make_branch_and_tree('to', format='development-subtree')
460
        from_tree.commit(message='first commit')
461
        out, err = self.run_bzr(['pull', '-d', 'to', 'from'])
462
        self.assertContainsRe(err,
463
            "(?m)Fetching into experimental format")
464
465
    def test_pull_cross_to_experimental_format_warning(self):
466
        """You get a warning for pulling into experimental formats.
467
        """
468
        from_tree = self.make_branch_and_tree('from', format='2a')
469
        to_tree = self.make_branch_and_tree('to', format='development-subtree')
470
        from_tree.commit(message='first commit')
471
        out, err = self.run_bzr(['pull', '-d', 'to', 'from'])
472
        self.assertContainsRe(err,
473
            "(?m)Fetching into experimental format")
5430.7.1 by Rory Yorke
Added --show-base to pull and update (bug 202374).
474
475
    def test_pull_show_base(self):
476
        """bzr pull supports --show-base
477
478
        see https://bugs.launchpad.net/bzr/+bug/202374"""
479
        # create two trees with conflicts, setup conflict, check that
480
        # conflicted file looks correct
481
        a_tree = self.example_branch('a')
482
        b_tree = a_tree.bzrdir.sprout('b').open_workingtree()
483
5430.7.2 by Rory Yorke
Changes as per Martin [gz]'s review.
484
        f = open(pathjoin('a', 'hello'),'wt')
485
        f.write('fee')
486
        f.close()
5430.7.1 by Rory Yorke
Added --show-base to pull and update (bug 202374).
487
        a_tree.commit('fee')
5430.7.2 by Rory Yorke
Changes as per Martin [gz]'s review.
488
489
        f = open(pathjoin('b', 'hello'),'wt')
490
        f.write('fie')
491
        f.close()
5430.7.1 by Rory Yorke
Added --show-base to pull and update (bug 202374).
492
493
        out,err=self.run_bzr(['pull','-d','b','a','--show-base'])
494
495
        # check for message here
496
        self.assertEqual(err,
497
                         ' M  hello\nText conflict in hello\n1 conflicts encountered.\n')
498
499
        self.assertEqualDiff('<<<<<<< TREE\n'
500
                             'fie||||||| BASE-REVISION\n'
501
                             'foo=======\n'
502
                             'fee>>>>>>> MERGE-SOURCE\n',
503
                             open(pathjoin('b', 'hello')).read())
504
505
    def test_pull_show_base_working_tree_only(self):
506
        """--show-base only allowed if there's a working tree
507
508
        see https://bugs.launchpad.net/bzr/+bug/202374"""
509
        # create a branch, see that --show-base fails
510
        self.make_branch('from')
511
        self.make_branch('to')
512
        out=self.run_bzr(['pull','-d','to','from','--show-base'],retcode=3)
513
        self.assertEqual(out,
514
                         ('','bzr: ERROR: Need working tree for --show-base.\n'))
515
5616.6.1 by Jelmer Vernooij
Exit with 1 if there were tag conflicts during pull.
516
    def test_pull_tag_conflicts(self):
517
        """pulling tags with conflicts will change the exit code"""
518
        # create a branch, see that --show-base fails
519
        from_tree = self.make_branch_and_tree('from')
520
        from_tree.branch.tags.set_tag("mytag", "somerevid")
521
        to_tree = self.make_branch_and_tree('to')
522
        to_tree.branch.tags.set_tag("mytag", "anotherrevid")
523
        out = self.run_bzr(['pull','-d','to','from'],retcode=1)
524
        self.assertEqual(out,
525
            ('No revisions to pull.\nConflicting tags:\n    mytag\n', ''))