23
24
from bzrlib.branch import Branch
24
from bzrlib.osutils import pathjoin
25
25
from bzrlib.tests.blackbox import ExternalBase
26
26
from bzrlib.uncommit import uncommit
27
from bzrlib.workingtree import WorkingTree
28
from bzrlib import urlutils
31
29
class TestPull(ExternalBase):
33
def example_branch(self, path='.'):
34
tree = self.make_branch_and_tree(path)
35
self.build_tree_contents([
36
(pathjoin(path, 'hello'), 'foo'),
37
(pathjoin(path, 'goodbye'), 'baz')])
39
tree.commit(message='setup')
41
tree.commit(message='setup')
31
def example_branch(test):
33
file('hello', 'wt').write('foo')
34
test.runbzr('add hello')
35
test.runbzr('commit -m setup hello')
36
file('goodbye', 'wt').write('baz')
37
test.runbzr('add goodbye')
38
test.runbzr('commit -m setup goodbye')
44
40
def test_pull(self):
45
41
"""Pull changes from one branch to another."""
46
a_tree = self.example_branch('a')
48
self.run_bzr('pull', retcode=3)
49
self.run_bzr('missing', retcode=3)
50
self.run_bzr('missing .')
51
self.run_bzr('missing')
46
self.runbzr('pull', retcode=3)
47
self.runbzr('missing', retcode=3)
48
self.runbzr('missing .')
49
self.runbzr('missing')
52
50
# this will work on windows because we check for the same branch
53
51
# in pull - if it fails, it is a regression
55
self.run_bzr('pull /', retcode=3)
53
self.runbzr('pull /', retcode=3)
56
54
if sys.platform not in ('win32', 'cygwin'):
60
b_tree = a_tree.bzrdir.sprout('b').open_workingtree()
58
self.runbzr('branch a b')
65
b_tree.commit(message='blah', allow_pointless=True)
70
self.assertEqual(a.revision_history(), b.revision_history()[:-1])
73
self.run_bzr('pull ../b')
74
self.assertEqual(a.revision_history(), b.revision_history())
75
a_tree.commit(message='blah2', allow_pointless=True)
76
b_tree.commit(message='blah3', allow_pointless=True)
62
self.runbzr('add subdir')
63
self.runbzr('commit -m blah --unchanged')
66
b = Branch.open('../b')
67
self.assertEquals(a.revision_history(), b.revision_history()[:-1])
68
self.runbzr('pull ../b')
69
self.assertEquals(a.revision_history(), b.revision_history())
70
self.runbzr('commit -m blah2 --unchanged')
72
self.runbzr('commit -m blah3 --unchanged')
79
self.run_bzr('pull ../a', retcode=3)
74
self.runbzr('pull ../a', retcode=3)
81
b_tree.bzrdir.sprout('overwriteme')
76
self.runbzr('branch b overwriteme')
82
77
os.chdir('overwriteme')
83
self.run_bzr('pull --overwrite ../a')
78
self.runbzr('pull --overwrite ../a')
84
79
overwritten = Branch.open('.')
85
80
self.assertEqual(overwritten.revision_history(),
86
81
a.revision_history())
87
a_tree.merge_from_branch(b_tree.branch)
88
a_tree.commit(message="blah4", allow_pointless=True)
83
self.runbzr('merge ../b')
84
self.runbzr('commit -m blah4 --unchanged')
89
85
os.chdir('../b/subdir')
90
self.run_bzr('pull ../../a')
91
self.assertEqual(a.revision_history()[-1], b.revision_history()[-1])
92
sub_tree = WorkingTree.open_containing('.')[0]
93
sub_tree.commit(message="blah5", allow_pointless=True)
94
sub_tree.commit(message="blah6", allow_pointless=True)
86
self.runbzr('pull ../../a')
87
self.assertEquals(a.revision_history()[-1], b.revision_history()[-1])
88
self.runbzr('commit -m blah5 --unchanged')
89
self.runbzr('commit -m blah6 --unchanged')
96
self.run_bzr('pull ../a')
91
self.runbzr('pull ../a')
98
a_tree.commit(message="blah7", allow_pointless=True)
99
a_tree.merge_from_branch(b_tree.branch)
100
a_tree.commit(message="blah8", allow_pointless=True)
101
self.run_bzr('pull ../b')
102
self.run_bzr('pull ../b')
104
def test_pull_dash_d(self):
105
self.example_branch('a')
106
self.make_branch_and_tree('b')
107
self.make_branch_and_tree('c')
108
# pull into that branch
109
self.run_bzr('pull -d b a')
110
# pull into a branch specified by a url
111
c_url = urlutils.local_path_to_url('c')
112
self.assertStartsWith(c_url, 'file://')
113
self.run_bzr(['pull', '-d', c_url, 'a'])
93
self.runbzr('commit -m blah7 --unchanged')
94
self.runbzr('merge ../b')
95
self.runbzr('commit -m blah8 --unchanged')
96
self.runbzr('pull ../b')
97
self.runbzr('pull ../b')
115
99
def test_pull_revision(self):
116
100
"""Pull some changes from one branch to another."""
117
a_tree = self.example_branch('a')
118
self.build_tree_contents([
120
('a/goodbye2', 'baz')])
122
a_tree.commit(message="setup")
123
a_tree.add('goodbye2')
124
a_tree.commit(message="setup")
126
b_tree = a_tree.bzrdir.sprout('b',
127
revision_id=a_tree.branch.get_rev_id(1)).open_workingtree()
104
self.example_branch()
105
file('hello2', 'wt').write('foo')
106
self.runbzr('add hello2')
107
self.runbzr('commit -m setup hello2')
108
file('goodbye2', 'wt').write('baz')
109
self.runbzr('add goodbye2')
110
self.runbzr('commit -m setup goodbye2')
113
self.runbzr('branch -r 1 a b')
129
self.run_bzr('pull -r 2')
115
self.runbzr('pull -r 2')
130
116
a = Branch.open('../a')
131
117
b = Branch.open('.')
132
self.assertEqual(a.revno(),4)
133
self.assertEqual(b.revno(),2)
134
self.run_bzr('pull -r 3')
135
self.assertEqual(b.revno(),3)
136
self.run_bzr('pull -r 4')
137
self.assertEqual(a.revision_history(), b.revision_history())
118
self.assertEquals(a.revno(),4)
119
self.assertEquals(b.revno(),2)
120
self.runbzr('pull -r 3')
121
self.assertEquals(b.revno(),3)
122
self.runbzr('pull -r 4')
123
self.assertEquals(a.revision_history(), b.revision_history())
140
126
def test_overwrite_uptodate(self):
141
127
# Make sure pull --overwrite overwrites
142
128
# even if the target branch has merged
143
129
# everything already.
144
a_tree = self.make_branch_and_tree('a')
145
self.build_tree_contents([('a/foo', 'original\n')])
147
a_tree.commit(message='initial commit')
149
b_tree = a_tree.bzrdir.sprout('b').open_workingtree()
151
self.build_tree_contents([('a/foo', 'changed\n')])
152
a_tree.commit(message='later change')
154
self.build_tree_contents([('a/foo', 'a third change')])
155
a_tree.commit(message='a third change')
157
rev_history_a = a_tree.branch.revision_history()
158
self.assertEqual(len(rev_history_a), 3)
160
b_tree.merge_from_branch(a_tree.branch)
161
b_tree.commit(message='merge')
163
self.assertEqual(len(b_tree.branch.revision_history()), 2)
166
self.run_bzr('pull --overwrite ../a')
167
rev_history_b = b_tree.branch.revision_history()
168
self.assertEqual(len(rev_history_b), 3)
132
def get_rh(expected_len):
133
rh = self.capture('revision-history')
134
# Make sure we don't have trailing empty revisions
135
rh = rh.strip().split('\n')
136
self.assertEqual(len(rh), expected_len)
142
open('foo', 'wb').write('original\n')
144
bzr('commit', '-m', 'initial commit')
147
bzr('branch', 'a', 'b')
150
open('foo', 'wb').write('changed\n')
151
bzr('commit', '-m', 'later change')
153
open('foo', 'wb').write('another\n')
154
bzr('commit', '-m', 'a third change')
156
rev_history_a = get_rh(3)
160
bzr('commit', '-m', 'merge')
162
rev_history_b = get_rh(2)
164
bzr('pull', '--overwrite', '../a')
165
rev_history_b = get_rh(3)
170
167
self.assertEqual(rev_history_b, rev_history_a)
172
169
def test_overwrite_children(self):
173
170
# Make sure pull --overwrite sets the revision-history
174
171
# to be identical to the pull source, even if we have convergence
175
a_tree = self.make_branch_and_tree('a')
176
self.build_tree_contents([('a/foo', 'original\n')])
178
a_tree.commit(message='initial commit')
180
b_tree = a_tree.bzrdir.sprout('b').open_workingtree()
182
self.build_tree_contents([('a/foo', 'changed\n')])
183
a_tree.commit(message='later change')
185
self.build_tree_contents([('a/foo', 'a third change')])
186
a_tree.commit(message='a third change')
188
self.assertEqual(len(a_tree.branch.revision_history()), 3)
190
b_tree.merge_from_branch(a_tree.branch)
191
b_tree.commit(message='merge')
193
self.assertEqual(len(b_tree.branch.revision_history()), 2)
195
self.build_tree_contents([('a/foo', 'a fourth change\n')])
196
a_tree.commit(message='a fourth change')
198
rev_history_a = a_tree.branch.revision_history()
199
self.assertEqual(len(rev_history_a), 4)
174
def get_rh(expected_len):
175
rh = self.capture('revision-history')
176
# Make sure we don't have trailing empty revisions
177
rh = rh.strip().split('\n')
178
self.assertEqual(len(rh), expected_len)
184
open('foo', 'wb').write('original\n')
186
bzr('commit', '-m', 'initial commit')
189
bzr('branch', 'a', 'b')
192
open('foo', 'wb').write('changed\n')
193
bzr('commit', '-m', 'later change')
195
open('foo', 'wb').write('another\n')
196
bzr('commit', '-m', 'a third change')
198
rev_history_a = get_rh(3)
202
bzr('commit', '-m', 'merge')
204
rev_history_b = get_rh(2)
207
open('foo', 'wb').write('a fourth change\n')
208
bzr('commit', '-m', 'a fourth change')
210
rev_history_a = get_rh(4)
201
212
# With convergence, we could just pull over the
202
213
# new change, but with --overwrite, we want to switch our history
204
self.run_bzr('pull --overwrite ../a')
205
rev_history_b = b_tree.branch.revision_history()
206
self.assertEqual(len(rev_history_b), 4)
215
bzr('pull', '--overwrite', '../a')
216
rev_history_b = get_rh(4)
208
218
self.assertEqual(rev_history_b, rev_history_a)