~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/blackbox/test_pull.py

Merge doc updates

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2005 by Canonical Ltd
2
 
# -*- coding: utf-8 -*-
3
 
 
 
1
# Copyright (C) 2005, 2006 Canonical Ltd
 
2
#
4
3
# This program is free software; you can redistribute it and/or modify
5
4
# it under the terms of the GNU General Public License as published by
6
5
# the Free Software Foundation; either version 2 of the License, or
7
6
# (at your option) any later version.
8
 
 
 
7
#
9
8
# This program is distributed in the hope that it will be useful,
10
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
11
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12
11
# GNU General Public License for more details.
13
 
 
 
12
#
14
13
# You should have received a copy of the GNU General Public License
15
14
# along with this program; if not, write to the Free Software
16
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
22
21
import sys
23
22
 
24
23
from bzrlib.branch import Branch
25
 
from bzrlib.osutils import abspath
26
24
from bzrlib.tests.blackbox import ExternalBase
27
25
from bzrlib.uncommit import uncommit
 
26
from bzrlib import urlutils
28
27
 
29
28
 
30
29
class TestPull(ExternalBase):
31
30
 
32
31
    def example_branch(test):
33
 
        test.runbzr('init')
 
32
        test.run_bzr('init')
34
33
        file('hello', 'wt').write('foo')
35
 
        test.runbzr('add hello')
36
 
        test.runbzr('commit -m setup hello')
 
34
        test.run_bzr('add hello')
 
35
        test.run_bzr('commit -m setup hello')
37
36
        file('goodbye', 'wt').write('baz')
38
 
        test.runbzr('add goodbye')
39
 
        test.runbzr('commit -m setup goodbye')
 
37
        test.run_bzr('add goodbye')
 
38
        test.run_bzr('commit -m setup goodbye')
40
39
 
41
40
    def test_pull(self):
42
41
        """Pull changes from one branch to another."""
44
43
        os.chdir('a')
45
44
 
46
45
        self.example_branch()
47
 
        self.runbzr('pull', retcode=3)
48
 
        self.runbzr('missing', retcode=3)
49
 
        self.runbzr('missing .')
50
 
        self.runbzr('missing')
 
46
        self.run_bzr('pull', retcode=3)
 
47
        self.run_bzr('missing', retcode=3)
 
48
        self.run_bzr('missing .')
 
49
        self.run_bzr('missing')
51
50
        # this will work on windows because we check for the same branch
52
51
        # in pull - if it fails, it is a regression
53
 
        self.runbzr('pull')
54
 
        self.runbzr('pull /', retcode=3)
 
52
        self.run_bzr('pull')
 
53
        self.run_bzr('pull /', retcode=3)
55
54
        if sys.platform not in ('win32', 'cygwin'):
56
 
            self.runbzr('pull')
 
55
            self.run_bzr('pull')
57
56
 
58
57
        os.chdir('..')
59
 
        self.runbzr('branch a b')
 
58
        self.run_bzr('branch a b')
60
59
        os.chdir('b')
61
 
        self.runbzr('pull')
 
60
        self.run_bzr('pull')
62
61
        os.mkdir('subdir')
63
 
        self.runbzr('add subdir')
64
 
        self.runbzr('commit -m blah --unchanged')
 
62
        self.run_bzr('add subdir')
 
63
        self.run_bzr('commit -m blah --unchanged')
65
64
        os.chdir('../a')
66
65
        a = Branch.open('.')
67
66
        b = Branch.open('../b')
68
67
        self.assertEquals(a.revision_history(), b.revision_history()[:-1])
69
 
        self.runbzr('pull ../b')
 
68
        self.run_bzr('pull ../b')
70
69
        self.assertEquals(a.revision_history(), b.revision_history())
71
 
        self.runbzr('commit -m blah2 --unchanged')
 
70
        self.run_bzr('commit -m blah2 --unchanged')
72
71
        os.chdir('../b')
73
 
        self.runbzr('commit -m blah3 --unchanged')
 
72
        self.run_bzr('commit -m blah3 --unchanged')
74
73
        # no overwrite
75
 
        self.runbzr('pull ../a', retcode=3)
 
74
        self.run_bzr('pull ../a', retcode=3)
76
75
        os.chdir('..')
77
 
        self.runbzr('branch b overwriteme')
 
76
        self.run_bzr('branch b overwriteme')
78
77
        os.chdir('overwriteme')
79
 
        self.runbzr('pull --overwrite ../a')
 
78
        self.run_bzr('pull --overwrite ../a')
80
79
        overwritten = Branch.open('.')
81
80
        self.assertEqual(overwritten.revision_history(),
82
81
                         a.revision_history())
83
82
        os.chdir('../a')
84
 
        self.runbzr('merge ../b')
85
 
        self.runbzr('commit -m blah4 --unchanged')
 
83
        self.run_bzr('merge ../b')
 
84
        self.run_bzr('commit -m blah4 --unchanged')
86
85
        os.chdir('../b/subdir')
87
 
        self.runbzr('pull ../../a')
 
86
        self.run_bzr('pull ../../a')
88
87
        self.assertEquals(a.revision_history()[-1], b.revision_history()[-1])
89
 
        self.runbzr('commit -m blah5 --unchanged')
90
 
        self.runbzr('commit -m blah6 --unchanged')
 
88
        self.run_bzr('commit -m blah5 --unchanged')
 
89
        self.run_bzr('commit -m blah6 --unchanged')
91
90
        os.chdir('..')
92
 
        self.runbzr('pull ../a')
 
91
        self.run_bzr('pull ../a')
93
92
        os.chdir('../a')
94
 
        self.runbzr('commit -m blah7 --unchanged')
95
 
        self.runbzr('merge ../b')
96
 
        self.runbzr('commit -m blah8 --unchanged')
97
 
        self.runbzr('pull ../b')
98
 
        self.runbzr('pull ../b')
 
93
        self.run_bzr('commit -m blah7 --unchanged')
 
94
        self.run_bzr('merge ../b')
 
95
        self.run_bzr('commit -m blah8 --unchanged')
 
96
        self.run_bzr('pull ../b')
 
97
        self.run_bzr('pull ../b')
 
98
 
 
99
    def test_pull_dash_d(self):
 
100
        os.mkdir('a')
 
101
        os.chdir('a')
 
102
        self.example_branch()
 
103
        self.run_bzr('init ../b')
 
104
        self.run_bzr('init ../c')
 
105
        # pull into that branch
 
106
        self.run_bzr('pull -d ../b .')
 
107
        # pull into a branch specified by a url
 
108
        c_url = urlutils.local_path_to_url('../c')
 
109
        self.assertStartsWith(c_url, 'file://')
 
110
        self.run_bzr('pull -d %s .' % c_url)
99
111
 
100
112
    def test_pull_revision(self):
101
113
        """Pull some changes from one branch to another."""
104
116
 
105
117
        self.example_branch()
106
118
        file('hello2', 'wt').write('foo')
107
 
        self.runbzr('add hello2')
108
 
        self.runbzr('commit -m setup hello2')
 
119
        self.run_bzr('add hello2')
 
120
        self.run_bzr('commit -m setup hello2')
109
121
        file('goodbye2', 'wt').write('baz')
110
 
        self.runbzr('add goodbye2')
111
 
        self.runbzr('commit -m setup goodbye2')
 
122
        self.run_bzr('add goodbye2')
 
123
        self.run_bzr('commit -m setup goodbye2')
112
124
 
113
125
        os.chdir('..')
114
 
        self.runbzr('branch -r 1 a b')
 
126
        self.run_bzr('branch -r 1 a b')
115
127
        os.chdir('b')
116
 
        self.runbzr('pull -r 2')
 
128
        self.run_bzr('pull -r 2')
117
129
        a = Branch.open('../a')
118
130
        b = Branch.open('.')
119
131
        self.assertEquals(a.revno(),4)
120
132
        self.assertEquals(b.revno(),2)
121
 
        self.runbzr('pull -r 3')
 
133
        self.run_bzr('pull -r 3')
122
134
        self.assertEquals(b.revno(),3)
123
 
        self.runbzr('pull -r 4')
 
135
        self.run_bzr('pull -r 4')
124
136
        self.assertEquals(a.revision_history(), b.revision_history())
125
137
 
126
138
 
131
143
        bzr = self.run_bzr
132
144
 
133
145
        def get_rh(expected_len):
134
 
            rh = self.capture('revision-history')
 
146
            rh = self.run_bzr(['revision-history'])[0]
135
147
            # Make sure we don't have trailing empty revisions
136
148
            rh = rh.strip().split('\n')
137
149
            self.assertEqual(len(rh), expected_len)
173
185
        bzr = self.run_bzr
174
186
 
175
187
        def get_rh(expected_len):
176
 
            rh = self.capture('revision-history')
 
188
            rh = self.run_bzr(['revision-history'])[0]
177
189
            # Make sure we don't have trailing empty revisions
178
190
            rh = rh.strip().split('\n')
179
191
            self.assertEqual(len(rh), expected_len)
239
251
        self.assertEqual(None, branch_b.get_parent())
240
252
        # test pull for failure without parent set
241
253
        os.chdir('branch_b')
242
 
        out = self.runbzr('pull', retcode=3)
 
254
        out = self.run_bzr('pull', retcode=3)
243
255
        self.assertEquals(out,
244
256
                ('','bzr: ERROR: No pull location known or specified.\n'))
245
257
        # test implicit --remember when no parent set, this pull conflicts
246
258
        self.build_tree(['d'])
247
259
        tree_b.add('d')
248
260
        tree_b.commit('commit d')
249
 
        out = self.runbzr('pull ../branch_a', retcode=3)
 
261
        out = self.run_bzr('pull ../branch_a', retcode=3)
250
262
        self.assertEquals(out,
251
 
                ('','bzr: ERROR: These branches have diverged.  Try merge.\n'))
252
 
        self.assertEquals(abspath(branch_b.get_parent()), abspath(parent))
 
263
                ('','bzr: ERROR: These branches have diverged.'
 
264
                    ' Use the merge command to reconcile them.\n'))
 
265
        self.assertEquals(branch_b.get_parent(), parent)
253
266
        # test implicit --remember after resolving previous failure
254
267
        uncommit(branch=branch_b, tree=tree_b)
255
268
        transport.delete('branch_b/d')
256
 
        self.runbzr('pull')
257
 
        self.assertEquals(abspath(branch_b.get_parent()), abspath(parent))
 
269
        self.run_bzr('pull')
 
270
        self.assertEquals(branch_b.get_parent(), parent)
258
271
        # test explicit --remember
259
 
        self.runbzr('pull ../branch_c --remember')
260
 
        self.assertEquals(abspath(branch_b.get_parent()),
261
 
                          abspath(branch_c.bzrdir.root_transport.base))
 
272
        self.run_bzr('pull ../branch_c --remember')
 
273
        self.assertEquals(branch_b.get_parent(),
 
274
                          branch_c.bzrdir.root_transport.base)
 
275
 
 
276
    def test_pull_bundle(self):
 
277
        from bzrlib.testament import Testament
 
278
        # Build up 2 trees and prepare for a pull
 
279
        tree_a = self.make_branch_and_tree('branch_a')
 
280
        f = open('branch_a/a', 'wb')
 
281
        f.write('hello')
 
282
        f.close()
 
283
        tree_a.add('a')
 
284
        tree_a.commit('message')
 
285
 
 
286
        tree_b = tree_a.bzrdir.sprout('branch_b').open_workingtree()
 
287
 
 
288
        # Make a change to 'a' that 'b' can pull
 
289
        f = open('branch_a/a', 'wb')
 
290
        f.write('hey there')
 
291
        f.close()
 
292
        tree_a.commit('message')
 
293
 
 
294
        # Create the bundle for 'b' to pull
 
295
        os.chdir('branch_a')
 
296
        bundle_file = open('../bundle', 'wb')
 
297
        bundle_file.write(self.run_bzr('bundle', '../branch_b')[0])
 
298
        bundle_file.close()
 
299
 
 
300
        os.chdir('../branch_b')
 
301
        out, err = self.run_bzr('pull', '../bundle')
 
302
        self.assertEqual(out,
 
303
                         'Now on revision 2.\n')
 
304
        self.assertEqual(err,
 
305
                ' M  a\nAll changes applied successfully.\n')
 
306
 
 
307
        self.assertEqualDiff(tree_a.branch.revision_history(),
 
308
                             tree_b.branch.revision_history())
 
309
 
 
310
        testament_a = Testament.from_revision(tree_a.branch.repository,
 
311
                                              tree_a.get_parent_ids()[0])
 
312
        testament_b = Testament.from_revision(tree_b.branch.repository,
 
313
                                              tree_b.get_parent_ids()[0])
 
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
 
318
        out, err = self.run_bzr('pull', '../bundle')
 
319
        self.assertEqual(err, '')
 
320
        self.assertEqual(out, 'No revisions to pull.\n')