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
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19
18
"""Tests for the update command of bzr."""
23
from bzrlib import branch, bzrdir
24
from bzrlib.tests import TestSkipped
25
from bzrlib.tests.blackbox import ExternalBase
26
from bzrlib.workingtree import WorkingTree
29
class TestUpdate(ExternalBase):
31
from bzrlib.tests.script import ScriptRunner
34
class TestUpdate(tests.TestCaseWithTransport):
31
36
def test_update_standalone_trivial(self):
33
out, err = self.runbzr('update')
34
self.assertEqual('Tree is up to date at revision 0.\n', err)
37
self.make_branch_and_tree('.')
38
out, err = self.run_bzr('update')
40
'Tree is up to date at revision 0 of branch %s\n' % self.test_dir,
42
self.assertEqual('', out)
44
def test_update_quiet(self):
45
self.make_branch_and_tree('.')
46
out, err = self.run_bzr('update --quiet')
47
self.assertEqual('', err)
35
48
self.assertEqual('', out)
37
50
def test_update_standalone_trivial_with_alias_up(self):
39
out, err = self.runbzr('up')
40
self.assertEqual('Tree is up to date at revision 0.\n', err)
51
self.make_branch_and_tree('.')
52
out, err = self.run_bzr('up')
53
self.assertEqual('Tree is up to date at revision 0 of branch %s\n'
41
56
self.assertEqual('', out)
43
58
def test_update_up_to_date_light_checkout(self):
44
59
self.make_branch_and_tree('branch')
45
self.runbzr('checkout --lightweight branch checkout')
46
out, err = self.runbzr('update checkout')
47
self.assertEqual('Tree is up to date at revision 0.\n', err)
60
self.run_bzr('checkout --lightweight branch checkout')
61
out, err = self.run_bzr('update checkout')
62
self.assertEqual('Tree is up to date at revision 0 of branch %s\n'
63
% osutils.pathjoin(self.test_dir, 'branch'),
48
65
self.assertEqual('', out)
50
67
def test_update_up_to_date_checkout(self):
51
68
self.make_branch_and_tree('branch')
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)
55
self.assertEqual('', out)
69
self.run_bzr('checkout branch checkout')
71
sr.run_script(self, '''
73
2>Tree is up to date at revision 0 of branch .../branch
57
76
def test_update_out_of_date_standalone_tree(self):
58
77
# FIXME the default format has to change for this to pass
59
78
# because it currently uses the branch last-revision marker.
60
79
self.make_branch_and_tree('branch')
62
self.runbzr('checkout --lightweight branch checkout')
81
self.run_bzr('checkout --lightweight branch checkout')
63
82
self.build_tree(['checkout/file'])
64
self.runbzr('add checkout/file')
65
self.runbzr('commit -m add-file checkout')
83
self.run_bzr('add checkout/file')
84
self.run_bzr('commit -m add-file checkout')
66
85
# now branch should be out of date
67
out,err = self.runbzr('update branch')
86
out,err = self.run_bzr('update branch')
68
87
self.assertEqual('', out)
69
self.assertEqual('All changes applied successfully.\n'
70
'Updated to revision 1.\n', err)
71
self.failUnlessExists('branch/file')
88
self.assertEqualDiff("""+N file
89
All changes applied successfully.
90
Updated to revision 1 of branch %s
91
""" % osutils.pathjoin(self.test_dir, 'branch',),
93
self.assertPathExists('branch/file')
73
95
def test_update_out_of_date_light_checkout(self):
74
96
self.make_branch_and_tree('branch')
75
97
# make two checkouts
76
self.runbzr('checkout --lightweight branch checkout')
77
self.runbzr('checkout --lightweight branch checkout2')
98
self.run_bzr('checkout --lightweight branch checkout')
99
self.run_bzr('checkout --lightweight branch checkout2')
78
100
self.build_tree(['checkout/file'])
79
self.runbzr('add checkout/file')
80
self.runbzr('commit -m add-file checkout')
101
self.run_bzr('add checkout/file')
102
self.run_bzr('commit -m add-file checkout')
81
103
# now checkout2 should be out of date
82
out,err = self.runbzr('update checkout2')
83
self.assertEqual('All changes applied successfully.\n'
84
'Updated to revision 1.\n',
104
out,err = self.run_bzr('update checkout2')
105
self.assertEqualDiff('''+N file
106
All changes applied successfully.
107
Updated to revision 1 of branch %s
108
''' % osutils.pathjoin(self.test_dir, 'branch',),
86
110
self.assertEqual('', out)
88
112
def test_update_conflicts_returns_2(self):
89
113
self.make_branch_and_tree('branch')
90
114
# make two checkouts
91
self.runbzr('checkout --lightweight branch checkout')
115
self.run_bzr('checkout --lightweight branch checkout')
92
116
self.build_tree(['checkout/file'])
93
self.runbzr('add checkout/file')
94
self.runbzr('commit -m add-file checkout')
95
self.runbzr('checkout --lightweight branch checkout2')
117
self.run_bzr('add checkout/file')
118
self.run_bzr('commit -m add-file checkout')
119
self.run_bzr('checkout --lightweight branch checkout2')
96
120
# now alter file in checkout
97
121
a_file = file('checkout/file', 'wt')
98
122
a_file.write('Foo')
100
self.runbzr('commit -m checnge-file checkout')
124
self.run_bzr('commit -m checnge-file checkout')
101
125
# now checkout2 should be out of date
102
126
# make a local change to file
103
127
a_file = file('checkout2/file', 'wt')
104
128
a_file.write('Bar')
106
out,err = self.runbzr('update checkout2', retcode=1)
107
self.assertEqual(['1 conflicts encountered.',
108
'Updated to revision 2.'],
109
err.split('\n')[1:3])
110
self.assertContainsRe(err, 'Text conflict in file\n')
130
out,err = self.run_bzr('update checkout2', retcode=1)
131
self.assertEqualDiff(''' M file
132
Text conflict in file
133
1 conflicts encountered.
134
Updated to revision 2 of branch %s
135
''' % osutils.pathjoin(self.test_dir, 'branch',),
111
137
self.assertEqual('', out)
113
139
def test_smoke_update_checkout_bound_branch_local_commits(self):
202
236
"""Update a light checkout of a readonly branch"""
203
237
tree = self.make_branch_and_tree('branch')
204
238
readonly_branch = branch.Branch.open(self.get_readonly_url('branch'))
205
checkout = readonly_branch.create_checkout('checkout',
239
checkout = readonly_branch.create_checkout('checkout',
206
240
lightweight=True)
207
241
tree.commit('empty commit')
208
self.runbzr(['update', 'checkout'])
242
self.run_bzr('update checkout')
244
def test_update_with_merge_merged_to_master(self):
245
# Test that 'bzr update' works correctly when you have
246
# an update in the master tree, and a [lightweight or otherwise]
247
# checkout which has merge a revision merged to master already.
248
master = self.make_branch_and_tree('master')
249
self.build_tree(['master/file'])
251
master.commit('one', rev_id='m1')
253
self.build_tree(['checkout1/'])
254
checkout_dir = bzrdir.BzrDirMetaFormat1().initialize('checkout1')
255
branch.BranchReferenceFormat().initialize(checkout_dir,
256
target_branch=master.branch)
257
checkout1 = checkout_dir.create_workingtree('m1')
259
# Create a second branch, with an extra commit
260
other = master.bzrdir.sprout('other').open_workingtree()
261
self.build_tree(['other/file2'])
263
other.commit('other2', rev_id='o2')
265
# Merge the other branch into checkout - 'start reviewing a patch'
266
checkout1.merge_from_branch(other.branch)
267
self.assertEqual(['o2'], checkout1.get_parent_ids()[1:])
269
# Create a new commit in the master branch - 'someone else lands its'
270
master.merge_from_branch(other.branch)
271
master.commit('f3', rev_id='m2')
273
# This should not report about local commits being pending
274
# merges, because they were real merges (but are now gone).
275
# It should perhaps report on them.
276
out, err = self.run_bzr('update', working_dir='checkout1')
277
self.assertEqual('', out)
278
self.assertEqualDiff('''All changes applied successfully.
279
Updated to revision 2 of branch %s
280
''' % osutils.pathjoin(self.test_dir, 'master',),
282
# The pending merges should still be there
283
self.assertEqual([], checkout1.get_parent_ids()[1:])
285
def test_update_dash_r(self):
286
master = self.make_branch_and_tree('master')
288
self.build_tree(['./file1'])
289
master.add(['file1'])
290
master.commit('one', rev_id='m1')
291
self.build_tree(['./file2'])
292
master.add(['file2'])
293
master.commit('two', rev_id='m2')
296
sr.run_script(self, '''
299
2>All changes applied successfully.
300
2>Updated to revision 1 of .../master
302
self.assertPathExists('./file1')
303
self.assertPathDoesNotExist('./file2')
304
self.assertEquals(['m1'], master.get_parent_ids())
306
def test_update_dash_r_outside_history(self):
307
"""Ensure that we can update -r to dotted revisions.
309
master = self.make_branch_and_tree('master')
310
self.build_tree(['master/file1'])
311
master.add(['file1'])
312
master.commit('one', rev_id='m1')
314
# Create a second branch, with extra commits
315
other = master.bzrdir.sprout('other').open_workingtree()
316
self.build_tree(['other/file2', 'other/file3'])
318
other.commit('other2', rev_id='o2')
320
other.commit('other3', rev_id='o3')
323
self.run_bzr('merge ../other')
324
master.commit('merge', rev_id='merge')
326
# Switch to o2. file3 was added only in o3 and should be deleted.
327
out, err = self.run_bzr('update -r revid:o2')
328
self.assertContainsRe(err, '-D\s+file3')
329
self.assertContainsRe(err, 'All changes applied successfully\.')
330
self.assertContainsRe(err, 'Updated to revision 1.1.1 of branch .*')
332
# Switch back to latest
333
out, err = self.run_bzr('update')
334
self.assertContainsRe(err, '\+N\s+file3')
335
self.assertContainsRe(err, 'All changes applied successfully\.')
336
self.assertContainsRe(err, 'Updated to revision 2 of branch .*')
338
def test_update_dash_r_in_master(self):
339
# Test that 'bzr update' works correctly when you have
340
# an update in the master tree,
341
master = self.make_branch_and_tree('master')
342
self.build_tree(['master/file1'])
343
master.add(['file1'])
344
master.commit('one', rev_id='m1')
346
self.run_bzr('checkout master checkout')
348
# add a revision in the master.
349
self.build_tree(['master/file2'])
350
master.add(['file2'])
351
master.commit('two', rev_id='m2')
355
sr.run_script(self, '''
356
$ bzr update -r revid:m2
358
2>All changes applied successfully.
359
2>Updated to revision 2 of branch .../master
362
def test_update_show_base(self):
363
"""bzr update support --show-base
365
see https://bugs.launchpad.net/bzr/+bug/202374"""
367
tree=self.make_branch_and_tree('.')
369
f = open('hello','wt')
375
f = open('hello','wt')
380
#tree.update() gives no such revision, so ...
381
self.run_bzr(['update','-r1'])
384
f = open('hello','wt')
388
out, err = self.run_bzr(['update','--show-base'],retcode=1)
390
# check for conflict notification
391
self.assertContainsString(err,
392
' M hello\nText conflict in hello\n1 conflicts encountered.\n')
394
self.assertEqualDiff('<<<<<<< TREE\n'
395
'fie||||||| BASE-REVISION\n'
397
'fee>>>>>>> MERGE-SOURCE\n',
398
open('hello').read())
400
def test_update_checkout_prevent_double_merge(self):
401
""""Launchpad bug 113809 in bzr "update performs two merges"
402
https://launchpad.net/bugs/113809"""
403
master = self.make_branch_and_tree('master')
404
self.build_tree_contents([('master/file', 'initial contents\n')])
406
master.commit('one', rev_id='m1')
408
checkout = master.branch.create_checkout('checkout')
409
lightweight = checkout.branch.create_checkout('lightweight',
412
# time to create a mess
413
# add a commit to the master
414
self.build_tree_contents([('master/file', 'master\n')])
415
master.commit('two', rev_id='m2')
416
self.build_tree_contents([('master/file', 'master local changes\n')])
418
# local commit on the checkout
419
self.build_tree_contents([('checkout/file', 'checkout\n')])
420
checkout.commit('tree', rev_id='c2', local=True)
421
self.build_tree_contents([('checkout/file',
422
'checkout local changes\n')])
425
self.build_tree_contents([('lightweight/file',
426
'lightweight local changes\n')])
428
# now update (and get conflicts)
429
out, err = self.run_bzr('update lightweight', retcode=1)
430
self.assertEqual('', out)
431
# NB: these conflicts are actually in the source code
432
self.assertFileEqual('''\
434
lightweight local changes
442
self.build_tree_contents([('lightweight/file',
443
'lightweight+checkout\n')])
444
self.run_bzr('resolve lightweight/file')
446
# check we get the second conflict
447
out, err = self.run_bzr('update lightweight', retcode=1)
448
self.assertEqual('', out)
449
# NB: these conflicts are actually in the source code
450
self.assertFileEqual('''\