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