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