/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar

« back to all changes in this revision

Viewing changes to bzrlib/tests/blackbox/test_update.py

  • Committer: John Arbash Meinel
  • Date: 2010-01-12 22:51:31 UTC
  • mto: This revision was merged to the branch mainline in revision 4955.
  • Revision ID: john@arbash-meinel.com-20100112225131-he8h411p6aeeb947
Delay grabbing an output stream until we actually go to show a diff.

This makes the test suite happy, but it also seems to be reasonable.
If we aren't going to write anything, we don't need to hold an
output stream open.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# Copyright (C) 2006, 2009 Canonical Ltd
 
2
# -*- coding: utf-8 -*-
 
3
#
 
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.
 
8
#
 
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.
 
13
#
 
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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 
17
 
 
18
 
 
19
"""Tests for the update command of bzr."""
 
20
 
 
21
import os
 
22
import re
 
23
 
 
24
from bzrlib import (
 
25
    branch,
 
26
    bzrdir,
 
27
    osutils,
 
28
    tests,
 
29
    urlutils,
 
30
    workingtree,
 
31
    )
 
32
from bzrlib.tests.script import ScriptRunner
 
33
 
 
34
 
 
35
class TestUpdate(tests.TestCaseWithTransport):
 
36
 
 
37
    def test_update_standalone_trivial(self):
 
38
        self.make_branch_and_tree('.')
 
39
        out, err = self.run_bzr('update')
 
40
        self.assertEqual(
 
41
            'Tree is up to date at revision 0 of branch %s\n' % self.test_dir,
 
42
            err)
 
43
        self.assertEqual('', out)
 
44
 
 
45
    def test_update_quiet(self):
 
46
        self.make_branch_and_tree('.')
 
47
        out, err = self.run_bzr('update --quiet')
 
48
        self.assertEqual('', err)
 
49
        self.assertEqual('', out)
 
50
 
 
51
    def test_update_standalone_trivial_with_alias_up(self):
 
52
        self.make_branch_and_tree('.')
 
53
        out, err = self.run_bzr('up')
 
54
        self.assertEqual('Tree is up to date at revision 0 of branch %s\n'
 
55
                         % self.test_dir,
 
56
                         err)
 
57
        self.assertEqual('', out)
 
58
 
 
59
    def test_update_up_to_date_light_checkout(self):
 
60
        self.make_branch_and_tree('branch')
 
61
        self.run_bzr('checkout --lightweight branch checkout')
 
62
        out, err = self.run_bzr('update checkout')
 
63
        self.assertEqual('Tree is up to date at revision 0 of branch %s\n'
 
64
                         % osutils.pathjoin(self.test_dir, 'branch'),
 
65
                         err)
 
66
        self.assertEqual('', out)
 
67
 
 
68
    def test_update_up_to_date_checkout(self):
 
69
        self.make_branch_and_tree('branch')
 
70
        self.run_bzr('checkout branch checkout')
 
71
        sr = ScriptRunner()
 
72
        sr.run_script(self, '''
 
73
$ bzr update checkout
 
74
2>Tree is up to date at revision 0 of branch .../branch
 
75
''')
 
76
 
 
77
    def test_update_out_of_date_standalone_tree(self):
 
78
        # FIXME the default format has to change for this to pass
 
79
        # because it currently uses the branch last-revision marker.
 
80
        self.make_branch_and_tree('branch')
 
81
        # make a checkout
 
82
        self.run_bzr('checkout --lightweight branch checkout')
 
83
        self.build_tree(['checkout/file'])
 
84
        self.run_bzr('add checkout/file')
 
85
        self.run_bzr('commit -m add-file checkout')
 
86
        # now branch should be out of date
 
87
        out,err = self.run_bzr('update branch')
 
88
        self.assertEqual('', out)
 
89
        self.assertEqualDiff("""+N  file
 
90
All changes applied successfully.
 
91
Updated to revision 1 of branch %s
 
92
""" % osutils.pathjoin(self.test_dir, 'branch',),
 
93
                         err)
 
94
        self.failUnlessExists('branch/file')
 
95
 
 
96
    def test_update_out_of_date_light_checkout(self):
 
97
        self.make_branch_and_tree('branch')
 
98
        # make two checkouts
 
99
        self.run_bzr('checkout --lightweight branch checkout')
 
100
        self.run_bzr('checkout --lightweight branch checkout2')
 
101
        self.build_tree(['checkout/file'])
 
102
        self.run_bzr('add checkout/file')
 
103
        self.run_bzr('commit -m add-file checkout')
 
104
        # now checkout2 should be out of date
 
105
        out,err = self.run_bzr('update checkout2')
 
106
        self.assertEqualDiff('''+N  file
 
107
All changes applied successfully.
 
108
Updated to revision 1 of branch %s
 
109
''' % osutils.pathjoin(self.test_dir, 'branch',),
 
110
                         err)
 
111
        self.assertEqual('', out)
 
112
 
 
113
    def test_update_conflicts_returns_2(self):
 
114
        self.make_branch_and_tree('branch')
 
115
        # make two checkouts
 
116
        self.run_bzr('checkout --lightweight branch checkout')
 
117
        self.build_tree(['checkout/file'])
 
118
        self.run_bzr('add checkout/file')
 
119
        self.run_bzr('commit -m add-file checkout')
 
120
        self.run_bzr('checkout --lightweight branch checkout2')
 
121
        # now alter file in checkout
 
122
        a_file = file('checkout/file', 'wt')
 
123
        a_file.write('Foo')
 
124
        a_file.close()
 
125
        self.run_bzr('commit -m checnge-file checkout')
 
126
        # now checkout2 should be out of date
 
127
        # make a local change to file
 
128
        a_file = file('checkout2/file', 'wt')
 
129
        a_file.write('Bar')
 
130
        a_file.close()
 
131
        out,err = self.run_bzr('update checkout2', retcode=1)
 
132
        self.assertEqualDiff(''' M  file
 
133
Text conflict in file
 
134
1 conflicts encountered.
 
135
Updated to revision 2 of branch %s
 
136
''' % osutils.pathjoin(self.test_dir, 'branch',),
 
137
                         err)
 
138
        self.assertEqual('', out)
 
139
 
 
140
    def test_smoke_update_checkout_bound_branch_local_commits(self):
 
141
        # smoke test for doing an update of a checkout of a bound
 
142
        # branch with local commits.
 
143
        master = self.make_branch_and_tree('master')
 
144
        # make a bound branch
 
145
        self.run_bzr('checkout master child')
 
146
        # get an object form of child
 
147
        child = workingtree.WorkingTree.open('child')
 
148
        # check that out
 
149
        self.run_bzr('checkout --lightweight child checkout')
 
150
        # get an object form of the checkout to manipulate
 
151
        wt = workingtree.WorkingTree.open('checkout')
 
152
        # change master
 
153
        a_file = file('master/file', 'wt')
 
154
        a_file.write('Foo')
 
155
        a_file.close()
 
156
        master.add(['file'])
 
157
        master_tip = master.commit('add file')
 
158
        # change child
 
159
        a_file = file('child/file_b', 'wt')
 
160
        a_file.write('Foo')
 
161
        a_file.close()
 
162
        child.add(['file_b'])
 
163
        child_tip = child.commit('add file_b', local=True)
 
164
        # check checkout
 
165
        a_file = file('checkout/file_c', 'wt')
 
166
        a_file.write('Foo')
 
167
        a_file.close()
 
168
        wt.add(['file_c'])
 
169
 
 
170
        # now, update checkout ->
 
171
        # get all three files and a pending merge.
 
172
        out, err = self.run_bzr('update checkout')
 
173
        self.assertEqual('', out)
 
174
        self.assertEqualDiff("""+N  file
 
175
All changes applied successfully.
 
176
+N  file_b
 
177
All changes applied successfully.
 
178
Updated to revision 1 of branch %s
 
179
Your local commits will now show as pending merges with 'bzr status', and can be committed with 'bzr commit'.
 
180
""" % osutils.pathjoin(self.test_dir, 'master',),
 
181
                         err)
 
182
        self.assertEqual([master_tip, child_tip], wt.get_parent_ids())
 
183
        self.failUnlessExists('checkout/file')
 
184
        self.failUnlessExists('checkout/file_b')
 
185
        self.failUnlessExists('checkout/file_c')
 
186
        self.assertTrue(wt.has_filename('file_c'))
 
187
 
 
188
    def test_update_with_merges(self):
 
189
        # Test that 'bzr update' works correctly when you have
 
190
        # an update in the master tree, and a lightweight checkout
 
191
        # which has merged another branch
 
192
        master = self.make_branch_and_tree('master')
 
193
        self.build_tree(['master/file'])
 
194
        master.add(['file'])
 
195
        master.commit('one', rev_id='m1')
 
196
 
 
197
        self.build_tree(['checkout1/'])
 
198
        checkout_dir = bzrdir.BzrDirMetaFormat1().initialize('checkout1')
 
199
        branch.BranchReferenceFormat().initialize(checkout_dir, master.branch)
 
200
        checkout1 = checkout_dir.create_workingtree('m1')
 
201
 
 
202
        # Create a second branch, with an extra commit
 
203
        other = master.bzrdir.sprout('other').open_workingtree()
 
204
        self.build_tree(['other/file2'])
 
205
        other.add(['file2'])
 
206
        other.commit('other2', rev_id='o2')
 
207
 
 
208
        # Create a new commit in the master branch
 
209
        self.build_tree(['master/file3'])
 
210
        master.add(['file3'])
 
211
        master.commit('f3', rev_id='m2')
 
212
 
 
213
        # Merge the other branch into checkout
 
214
        os.chdir('checkout1')
 
215
        self.run_bzr('merge ../other')
 
216
 
 
217
        self.assertEqual(['o2'], checkout1.get_parent_ids()[1:])
 
218
 
 
219
        # At this point, 'commit' should fail, because we are out of date
 
220
        self.run_bzr_error(["please run 'bzr update'"],
 
221
                           'commit -m merged')
 
222
 
 
223
        # This should not report about local commits being pending
 
224
        # merges, because they were real merges
 
225
        out, err = self.run_bzr('update')
 
226
        self.assertEqual('', out)
 
227
        self.assertEqualDiff('''+N  file3
 
228
All changes applied successfully.
 
229
Updated to revision 2 of branch %s
 
230
''' % osutils.pathjoin(self.test_dir, 'master',),
 
231
                         err)
 
232
        # The pending merges should still be there
 
233
        self.assertEqual(['o2'], checkout1.get_parent_ids()[1:])
 
234
 
 
235
    def test_readonly_lightweight_update(self):
 
236
        """Update a light checkout of a readonly branch"""
 
237
        tree = self.make_branch_and_tree('branch')
 
238
        readonly_branch = branch.Branch.open(self.get_readonly_url('branch'))
 
239
        checkout = readonly_branch.create_checkout('checkout',
 
240
                                                   lightweight=True)
 
241
        tree.commit('empty commit')
 
242
        self.run_bzr('update checkout')
 
243
 
 
244
    def test_update_dash_r(self):
 
245
        # Test that 'bzr update' works correctly when you have
 
246
        # an update in the master tree, and a lightweight checkout
 
247
        # which has merged another branch
 
248
        master = self.make_branch_and_tree('master')
 
249
        os.chdir('master')
 
250
        self.build_tree(['./file1'])
 
251
        master.add(['file1'])
 
252
        master.commit('one', rev_id='m1')
 
253
        self.build_tree(['./file2'])
 
254
        master.add(['file2'])
 
255
        master.commit('two', rev_id='m2')
 
256
 
 
257
        sr = ScriptRunner()
 
258
        sr.run_script(self, '''
 
259
$ bzr update -r 1
 
260
2>-D  file2
 
261
2>All changes applied successfully.
 
262
2>Updated to revision 1 of .../master
 
263
''')
 
264
        self.failUnlessExists('./file1')
 
265
        self.failIfExists('./file2')
 
266
        self.assertEquals(['m1'], master.get_parent_ids())
 
267
 
 
268
    def test_update_dash_r_outside_history(self):
 
269
        # Test that 'bzr update' works correctly when you have
 
270
        # an update in the master tree, and a lightweight checkout
 
271
        # which has merged another branch
 
272
        master = self.make_branch_and_tree('master')
 
273
        self.build_tree(['master/file1'])
 
274
        master.add(['file1'])
 
275
        master.commit('one', rev_id='m1')
 
276
 
 
277
        # Create a second branch, with an extra commit
 
278
        other = master.bzrdir.sprout('other').open_workingtree()
 
279
        self.build_tree(['other/file2'])
 
280
        other.add(['file2'])
 
281
        other.commit('other2', rev_id='o2')
 
282
 
 
283
        os.chdir('master')
 
284
        self.run_bzr('merge ../other')
 
285
        master.commit('merge', rev_id='merge')
 
286
 
 
287
        out, err = self.run_bzr('update -r revid:o2',
 
288
                                retcode=3)
 
289
        self.assertEqual('', out)
 
290
        self.assertEqual('bzr: ERROR: branch has no revision o2\n'
 
291
                         'bzr update --revision only works'
 
292
                         ' for a revision in the branch history\n',
 
293
                         err)
 
294
 
 
295
    def test_update_dash_r_in_master(self):
 
296
        # Test that 'bzr update' works correctly when you have
 
297
        # an update in the master tree,
 
298
        master = self.make_branch_and_tree('master')
 
299
        self.build_tree(['master/file1'])
 
300
        master.add(['file1'])
 
301
        master.commit('one', rev_id='m1')
 
302
 
 
303
        self.run_bzr('checkout master checkout')
 
304
 
 
305
        # add a revision in the master.
 
306
        self.build_tree(['master/file2'])
 
307
        master.add(['file2'])
 
308
        master.commit('two', rev_id='m2')
 
309
 
 
310
        os.chdir('checkout')
 
311
        sr = ScriptRunner()
 
312
        sr.run_script(self, '''
 
313
$ bzr update -r revid:m2
 
314
2>+N  file2
 
315
2>All changes applied successfully.
 
316
2>Updated to revision 2 of branch .../master
 
317
''')