1
# Copyright (C) 2006 Canonical Ltd
2
# -*- coding: utf-8 -*-
4
# This program is free software; you can redistribute it and/or modify
5
# it under the terms of the GNU General Public License as published by
6
# the Free Software Foundation; either version 2 of the License, or
7
# (at your option) any later version.
9
# This program is distributed in the hope that it will be useful,
10
# but WITHOUT ANY WARRANTY; without even the implied warranty of
11
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
# GNU General Public License for more details.
14
# You should have received a copy of the GNU General Public License
15
# along with this program; if not, write to the Free Software
16
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19
"""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
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)
35
self.assertEqual('', out)
37
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)
41
self.assertEqual('', out)
43
def test_update_up_to_date_light_checkout(self):
44
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)
48
self.assertEqual('', out)
50
def test_update_up_to_date_checkout(self):
51
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)
57
def test_update_out_of_date_standalone_tree(self):
58
# FIXME the default format has to change for this to pass
59
# because it currently uses the branch last-revision marker.
60
self.make_branch_and_tree('branch')
62
self.runbzr('checkout --lightweight branch checkout')
63
self.build_tree(['checkout/file'])
64
self.runbzr('add checkout/file')
65
self.runbzr('commit -m add-file checkout')
66
# now branch should be out of date
67
out,err = self.runbzr('update branch')
68
self.assertEqual('', out)
69
self.assertEqual('All changes applied successfully.\n'
70
'Updated to revision 1.\n', err)
71
self.failUnlessExists('branch/file')
73
def test_update_out_of_date_light_checkout(self):
74
self.make_branch_and_tree('branch')
76
self.runbzr('checkout --lightweight branch checkout')
77
self.runbzr('checkout --lightweight branch checkout2')
78
self.build_tree(['checkout/file'])
79
self.runbzr('add checkout/file')
80
self.runbzr('commit -m add-file checkout')
81
# 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',
86
self.assertEqual('', out)
88
def test_update_conflicts_returns_2(self):
89
self.make_branch_and_tree('branch')
91
self.runbzr('checkout --lightweight branch checkout')
92
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')
96
# now alter file in checkout
97
a_file = file('checkout/file', 'wt')
100
self.runbzr('commit -m checnge-file checkout')
101
# now checkout2 should be out of date
102
# make a local change to file
103
a_file = file('checkout2/file', 'wt')
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')
111
self.assertEqual('', out)
113
def test_smoke_update_checkout_bound_branch_local_commits(self):
114
# smoke test for doing an update of a checkout of a bound
115
# branch with local commits.
116
master = self.make_branch_and_tree('master')
117
# make a bound branch
118
self.run_bzr('checkout', 'master', 'child')
119
# get an object form of child
120
child = WorkingTree.open('child')
122
self.run_bzr('checkout', '--lightweight', 'child', 'checkout')
123
# get an object form of the checkout to manipulate
124
wt = WorkingTree.open('checkout')
126
a_file = file('master/file', 'wt')
130
master_tip = master.commit('add file')
132
a_file = file('child/file_b', 'wt')
135
child.add(['file_b'])
136
child_tip = child.commit('add file_b', local=True)
138
a_file = file('checkout/file_c', 'wt')
143
# now, update checkout ->
144
# get all three files and a pending merge.
145
out, err = self.run_bzr('update', 'checkout')
146
self.assertEqual('', out)
147
self.assertContainsRe(err, 'Updated to revision 1.\n'
148
'Your local commits will now show as'
150
self.assertEqual([master_tip, child_tip], wt.get_parent_ids())
151
self.failUnlessExists('checkout/file')
152
self.failUnlessExists('checkout/file_b')
153
self.failUnlessExists('checkout/file_c')
154
self.assertTrue(wt.has_filename('file_c'))
156
def test_update_with_merges(self):
157
# Test that 'bzr update' works correctly when you have
158
# an update in the master tree, and a lightweight checkout
159
# which has merged another branch
160
master = self.make_branch_and_tree('master')
161
self.build_tree(['master/file'])
163
master.commit('one', rev_id='m1')
165
self.build_tree(['checkout1/'])
166
checkout_dir = bzrdir.BzrDirMetaFormat1().initialize('checkout1')
167
branch.BranchReferenceFormat().initialize(checkout_dir, master.branch)
168
checkout1 = checkout_dir.create_workingtree('m1')
170
# Create a second branch, with an extra commit
171
other = master.bzrdir.sprout('other').open_workingtree()
172
self.build_tree(['other/file2'])
174
other.commit('other2', rev_id='o2')
176
# Create a new commit in the master branch
177
self.build_tree(['master/file3'])
178
master.add(['file3'])
179
master.commit('f3', rev_id='m2')
181
# Merge the other branch into checkout
182
os.chdir('checkout1')
183
self.run_bzr('merge', '../other')
185
self.assertEqual(['o2'], checkout1.get_parent_ids()[1:])
187
# At this point, 'commit' should fail, because we are out of date
188
self.run_bzr_error(["please run 'bzr update'"],
189
'commit', '-m', 'merged')
191
# This should not report about local commits being pending
192
# merges, because they were real merges
193
out, err = self.run_bzr('update')
194
self.assertEqual('', out)
195
self.assertEqual('All changes applied successfully.\n'
196
'Updated to revision 2.\n', err)
198
# The pending merges should still be there
199
self.assertEqual(['o2'], checkout1.get_parent_ids()[1:])
201
def test_readonly_lightweight_update(self):
202
"""Update a light checkout of a readonly branch"""
203
tree = self.make_branch_and_tree('branch')
204
readonly_branch = branch.Branch.open(self.get_readonly_url('branch'))
205
checkout = readonly_branch.create_checkout('checkout',
207
tree.commit('empty commit')
208
self.runbzr(['update', 'checkout'])