19
19
"""Tests for the update command of bzr."""
23
from bzrlib import branch, bzrdir
22
24
from bzrlib.tests import TestSkipped
23
25
from bzrlib.tests.blackbox import ExternalBase
26
from bzrlib.workingtree import WorkingTree
26
29
class TestUpdate(ExternalBase):
28
31
def test_update_standalone_trivial(self):
30
out, err = self.runbzr('update')
31
self.assertEqual('Tree is up to date.\n', err)
33
out, err = self.run_bzr('update')
34
self.assertEqual('Tree is up to date at revision 0.\n', err)
35
self.assertEqual('', out)
37
def test_update_standalone_trivial_with_alias_up(self):
39
out, err = self.run_bzr('up')
40
self.assertEqual('Tree is up to date at revision 0.\n', err)
41
self.assertEqual('', out)
43
def test_update_up_to_date_light_checkout(self):
44
self.make_branch_and_tree('branch')
45
self.run_bzr('checkout --lightweight branch checkout')
46
out, err = self.run_bzr('update checkout')
47
self.assertEqual('Tree is up to date at revision 0.\n', err)
32
48
self.assertEqual('', out)
34
50
def test_update_up_to_date_checkout(self):
35
51
self.make_branch_and_tree('branch')
36
self.runbzr('checkout branch checkout')
37
out, err = self.runbzr('update checkout')
38
self.assertEqual('Tree is up to date.\n', err)
52
self.run_bzr('checkout branch checkout')
53
out, err = self.run_bzr('update checkout')
54
self.assertEqual('Tree is up to date at revision 0.\n', err)
39
55
self.assertEqual('', out)
41
57
def test_update_out_of_date_standalone_tree(self):
42
58
# FIXME the default format has to change for this to pass
43
59
# because it currently uses the branch last-revision marker.
44
raise TestSkipped('default format too old')
45
60
self.make_branch_and_tree('branch')
47
self.runbzr('checkout branch checkout')
62
self.run_bzr('checkout --lightweight branch checkout')
48
63
self.build_tree(['checkout/file'])
49
self.runbzr('add checkout/file')
50
self.runbzr('commit -m add-file checkout')
64
self.run_bzr('add checkout/file')
65
self.run_bzr('commit -m add-file checkout')
51
66
# now branch should be out of date
52
out,err = self.runbzr('update branch')
53
self.assertEqual('Updated to revision 1.\n', out)
54
self.assertEqual('', err)
67
out,err = self.run_bzr('update branch')
68
self.assertEqual('', out)
69
self.assertContainsRe(err, '\+N file')
70
self.assertEndsWith(err, 'All changes applied successfully.\n'
71
'Updated to revision 1.\n')
55
72
self.failUnlessExists('branch/file')
57
def test_update_out_of_date_checkout(self):
74
def test_update_out_of_date_light_checkout(self):
58
75
self.make_branch_and_tree('branch')
59
76
# make two checkouts
60
self.runbzr('checkout branch checkout')
61
self.runbzr('checkout branch checkout2')
77
self.run_bzr('checkout --lightweight branch checkout')
78
self.run_bzr('checkout --lightweight branch checkout2')
62
79
self.build_tree(['checkout/file'])
63
self.runbzr('add checkout/file')
64
self.runbzr('commit -m add-file checkout')
80
self.run_bzr('add checkout/file')
81
self.run_bzr('commit -m add-file checkout')
65
82
# now checkout2 should be out of date
66
out,err = self.runbzr('update checkout2')
67
self.assertEqual('All changes applied successfully.\n'
68
'Updated to revision 1.\n',
83
out,err = self.run_bzr('update checkout2')
84
self.assertContainsRe(err, '\+N file')
85
self.assertEndsWith(err, 'All changes applied successfully.\n'
86
'Updated to revision 1.\n')
70
87
self.assertEqual('', out)
72
89
def test_update_conflicts_returns_2(self):
73
90
self.make_branch_and_tree('branch')
74
91
# make two checkouts
75
self.runbzr('checkout branch checkout')
92
self.run_bzr('checkout --lightweight branch checkout')
76
93
self.build_tree(['checkout/file'])
77
self.runbzr('add checkout/file')
78
self.runbzr('commit -m add-file checkout')
79
self.runbzr('checkout branch checkout2')
94
self.run_bzr('add checkout/file')
95
self.run_bzr('commit -m add-file checkout')
96
self.run_bzr('checkout --lightweight branch checkout2')
80
97
# now alter file in checkout
81
98
a_file = file('checkout/file', 'wt')
82
99
a_file.write('Foo')
84
self.runbzr('commit -m checnge-file checkout')
101
self.run_bzr('commit -m checnge-file checkout')
85
102
# now checkout2 should be out of date
86
103
# make a local change to file
87
104
a_file = file('checkout2/file', 'wt')
88
105
a_file.write('Bar')
90
out,err = self.runbzr('update checkout2', retcode=1)
107
out,err = self.run_bzr('update checkout2', retcode=1)
108
self.assertContainsRe(err, 'M file')
91
109
self.assertEqual(['1 conflicts encountered.',
92
110
'Updated to revision 2.'],
111
err.split('\n')[-3:-1])
94
112
self.assertContainsRe(err, 'Text conflict in file\n')
95
113
self.assertEqual('', out)
115
def test_smoke_update_checkout_bound_branch_local_commits(self):
116
# smoke test for doing an update of a checkout of a bound
117
# branch with local commits.
118
master = self.make_branch_and_tree('master')
119
# make a bound branch
120
self.run_bzr('checkout master child')
121
# get an object form of child
122
child = WorkingTree.open('child')
124
self.run_bzr('checkout --lightweight child checkout')
125
# get an object form of the checkout to manipulate
126
wt = WorkingTree.open('checkout')
128
a_file = file('master/file', 'wt')
132
master_tip = master.commit('add file')
134
a_file = file('child/file_b', 'wt')
137
child.add(['file_b'])
138
child_tip = child.commit('add file_b', local=True)
140
a_file = file('checkout/file_c', 'wt')
145
# now, update checkout ->
146
# get all three files and a pending merge.
147
out, err = self.run_bzr('update checkout')
148
self.assertEqual('', out)
149
self.assertContainsRe(err, '\+N file')
150
self.assertContainsRe(err, '\+N file_b')
151
self.assertContainsRe(err, 'Updated to revision 1.\n'
152
'Your local commits will now show as'
154
self.assertEqual([master_tip, child_tip], wt.get_parent_ids())
155
self.failUnlessExists('checkout/file')
156
self.failUnlessExists('checkout/file_b')
157
self.failUnlessExists('checkout/file_c')
158
self.assertTrue(wt.has_filename('file_c'))
160
def test_update_with_merges(self):
161
# Test that 'bzr update' works correctly when you have
162
# an update in the master tree, and a lightweight checkout
163
# which has merged another branch
164
master = self.make_branch_and_tree('master')
165
self.build_tree(['master/file'])
167
master.commit('one', rev_id='m1')
169
self.build_tree(['checkout1/'])
170
checkout_dir = bzrdir.BzrDirMetaFormat1().initialize('checkout1')
171
branch.BranchReferenceFormat().initialize(checkout_dir, master.branch)
172
checkout1 = checkout_dir.create_workingtree('m1')
174
# Create a second branch, with an extra commit
175
other = master.bzrdir.sprout('other').open_workingtree()
176
self.build_tree(['other/file2'])
178
other.commit('other2', rev_id='o2')
180
# Create a new commit in the master branch
181
self.build_tree(['master/file3'])
182
master.add(['file3'])
183
master.commit('f3', rev_id='m2')
185
# Merge the other branch into checkout
186
os.chdir('checkout1')
187
self.run_bzr('merge ../other')
189
self.assertEqual(['o2'], checkout1.get_parent_ids()[1:])
191
# At this point, 'commit' should fail, because we are out of date
192
self.run_bzr_error(["please run 'bzr update'"],
195
# This should not report about local commits being pending
196
# merges, because they were real merges
197
out, err = self.run_bzr('update')
198
self.assertEqual('', out)
199
self.assertEndsWith(err, 'All changes applied successfully.\n'
200
'Updated to revision 2.\n')
201
self.assertContainsRe(err, r'\+N file3')
202
# The pending merges should still be there
203
self.assertEqual(['o2'], checkout1.get_parent_ids()[1:])
205
def test_readonly_lightweight_update(self):
206
"""Update a light checkout of a readonly branch"""
207
tree = self.make_branch_and_tree('branch')
208
readonly_branch = branch.Branch.open(self.get_readonly_url('branch'))
209
checkout = readonly_branch.create_checkout('checkout',
211
tree.commit('empty commit')
212
self.run_bzr('update checkout')