1
# Copyright (C) 2005 by Canonical Ltd
2
# -*- coding: utf-8 -*-
1
# Copyright (C) 2005, 2006 Canonical Ltd
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.
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.
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
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
30
29
class TestPull(ExternalBase):
32
31
def example_branch(test):
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')
41
40
def test_pull(self):
42
41
"""Pull changes from one branch to another."""
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
54
self.runbzr('pull /', retcode=3)
53
self.run_bzr('pull /', retcode=3)
55
54
if sys.platform not in ('win32', 'cygwin'):
59
self.runbzr('branch a b')
58
self.run_bzr('branch a b')
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')
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')
73
self.runbzr('commit -m blah3 --unchanged')
72
self.run_bzr('commit -m blah3 --unchanged')
75
self.runbzr('pull ../a', retcode=3)
74
self.run_bzr('pull ../a', retcode=3)
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())
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')
92
self.runbzr('pull ../a')
91
self.run_bzr('pull ../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')
99
def test_pull_dash_d(self):
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)
100
112
def test_pull_revision(self):
101
113
"""Pull some changes from one branch to another."""
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')
114
self.runbzr('branch -r 1 a b')
126
self.run_bzr('branch -r 1 a 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())
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'])
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')
257
self.assertEquals(abspath(branch_b.get_parent()), abspath(parent))
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)
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')
284
tree_a.commit('message')
286
tree_b = tree_a.bzrdir.sprout('branch_b').open_workingtree()
288
# Make a change to 'a' that 'b' can pull
289
f = open('branch_a/a', 'wb')
292
tree_a.commit('message')
294
# Create the bundle for 'b' to pull
296
bundle_file = open('../bundle', 'wb')
297
bundle_file.write(self.run_bzr('bundle', '../branch_b')[0])
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')
307
self.assertEqualDiff(tree_a.branch.revision_history(),
308
tree_b.branch.revision_history())
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())
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')