/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: Martin Pool
  • Date: 2007-10-03 08:06:44 UTC
  • mto: This revision was merged to the branch mainline in revision 2901.
  • Revision ID: mbp@sourcefrog.net-20071003080644-oivy0gkg98sex0ed
Avoid internal error tracebacks on failure to lock on readonly transport (#129701).

Add new LockFailed, which doesn't imply that we failed to get it because of
contention.  Raise this if we fail to create the pending or lock directories
because of Transport errors.

UnlockableTransport is not an internal error.

ReadOnlyLockError has a message which didn't match its name or usage; it's now
deprecated and callers are updated to use LockFailed which is more appropriate.

Add zero_ninetytwo deprecation symbol.

Unify assertMatchesRe with TestCase.assertContainsRe.

When the constructor is deprecated, just say that the class is deprecated, not
the __init__ method - this works better with applyDeprecated in tests.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2006-2010 Canonical Ltd
 
1
# Copyright (C) 2006 Canonical Ltd
 
2
# -*- coding: utf-8 -*-
2
3
#
3
4
# This program is free software; you can redistribute it and/or modify
4
5
# it under the terms of the GNU General Public License as published by
12
13
#
13
14
# You should have received a copy of the GNU General Public License
14
15
# along with this program; if not, write to the Free Software
15
 
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 
16
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16
17
 
17
18
 
18
19
"""Tests for the update command of bzr."""
19
20
 
20
21
import os
21
 
import re
22
 
 
23
 
from bzrlib import (
24
 
    branch,
25
 
    bzrdir,
26
 
    osutils,
27
 
    tests,
28
 
    urlutils,
29
 
    workingtree,
30
 
    )
31
 
from bzrlib.tests.script import ScriptRunner
32
 
 
33
 
 
34
 
class TestUpdate(tests.TestCaseWithTransport):
 
22
 
 
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
 
27
 
 
28
 
 
29
class TestUpdate(ExternalBase):
35
30
 
36
31
    def test_update_standalone_trivial(self):
37
32
        self.make_branch_and_tree('.')
38
33
        out, err = self.run_bzr('update')
39
 
        self.assertEqual(
40
 
            'Tree is up to date at revision 0 of branch %s\n' % self.test_dir,
41
 
            err)
42
 
        self.assertEqual('', out)
43
 
 
44
 
    def test_update_quiet(self):
45
 
        self.make_branch_and_tree('.')
46
 
        out, err = self.run_bzr('update --quiet')
47
 
        self.assertEqual('', err)
 
34
        self.assertEqual('Tree is up to date at revision 0.\n', err)
48
35
        self.assertEqual('', out)
49
36
 
50
37
    def test_update_standalone_trivial_with_alias_up(self):
51
38
        self.make_branch_and_tree('.')
52
39
        out, err = self.run_bzr('up')
53
 
        self.assertEqual('Tree is up to date at revision 0 of branch %s\n'
54
 
                         % self.test_dir,
55
 
                         err)
 
40
        self.assertEqual('Tree is up to date at revision 0.\n', err)
56
41
        self.assertEqual('', out)
57
42
 
58
43
    def test_update_up_to_date_light_checkout(self):
59
44
        self.make_branch_and_tree('branch')
60
45
        self.run_bzr('checkout --lightweight branch checkout')
61
46
        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'),
64
 
                         err)
 
47
        self.assertEqual('Tree is up to date at revision 0.\n', err)
65
48
        self.assertEqual('', out)
66
49
 
67
50
    def test_update_up_to_date_checkout(self):
68
51
        self.make_branch_and_tree('branch')
69
52
        self.run_bzr('checkout branch checkout')
70
 
        sr = ScriptRunner()
71
 
        sr.run_script(self, '''
72
 
$ bzr update checkout
73
 
2>Tree is up to date at revision 0 of branch .../branch
74
 
''')
 
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)
75
56
 
76
57
    def test_update_out_of_date_standalone_tree(self):
77
58
        # FIXME the default format has to change for this to pass
85
66
        # now branch should be out of date
86
67
        out,err = self.run_bzr('update branch')
87
68
        self.assertEqual('', out)
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',),
92
 
                         err)
 
69
        self.assertContainsRe(err, '\+N  file')
 
70
        self.assertEndsWith(err, 'All changes applied successfully.\n'
 
71
                         'Updated to revision 1.\n')
93
72
        self.failUnlessExists('branch/file')
94
73
 
95
74
    def test_update_out_of_date_light_checkout(self):
102
81
        self.run_bzr('commit -m add-file checkout')
103
82
        # now checkout2 should be out of date
104
83
        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',),
109
 
                         err)
 
84
        self.assertContainsRe(err, '\+N  file')
 
85
        self.assertEndsWith(err, 'All changes applied successfully.\n'
 
86
                         'Updated to revision 1.\n')
110
87
        self.assertEqual('', out)
111
88
 
112
89
    def test_update_conflicts_returns_2(self):
128
105
        a_file.write('Bar')
129
106
        a_file.close()
130
107
        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',),
136
 
                         err)
 
108
        self.assertContainsRe(err, 'M  file')
 
109
        self.assertEqual(['1 conflicts encountered.',
 
110
                          'Updated to revision 2.'],
 
111
                         err.split('\n')[-3:-1])
 
112
        self.assertContainsRe(err, 'Text conflict in file\n')
137
113
        self.assertEqual('', out)
138
114
 
139
115
    def test_smoke_update_checkout_bound_branch_local_commits(self):
143
119
        # make a bound branch
144
120
        self.run_bzr('checkout master child')
145
121
        # get an object form of child
146
 
        child = workingtree.WorkingTree.open('child')
 
122
        child = WorkingTree.open('child')
147
123
        # check that out
148
124
        self.run_bzr('checkout --lightweight child checkout')
149
125
        # get an object form of the checkout to manipulate
150
 
        wt = workingtree.WorkingTree.open('checkout')
 
126
        wt = WorkingTree.open('checkout')
151
127
        # change master
152
128
        a_file = file('master/file', 'wt')
153
129
        a_file.write('Foo')
170
146
        # get all three files and a pending merge.
171
147
        out, err = self.run_bzr('update checkout')
172
148
        self.assertEqual('', out)
173
 
        self.assertEqualDiff("""+N  file_b
174
 
All changes applied successfully.
175
 
+N  file
176
 
All changes applied successfully.
177
 
Updated to revision 1 of branch %s
178
 
Your local commits will now show as pending merges with 'bzr status', and can be committed with 'bzr commit'.
179
 
""" % osutils.pathjoin(self.test_dir, 'master',),
180
 
                         err)
 
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'
 
153
                                   ' pending merges')
181
154
        self.assertEqual([master_tip, child_tip], wt.get_parent_ids())
182
155
        self.failUnlessExists('checkout/file')
183
156
        self.failUnlessExists('checkout/file_b')
195
168
 
196
169
        self.build_tree(['checkout1/'])
197
170
        checkout_dir = bzrdir.BzrDirMetaFormat1().initialize('checkout1')
198
 
        branch.BranchReferenceFormat().initialize(checkout_dir,
199
 
            target_branch=master.branch)
 
171
        branch.BranchReferenceFormat().initialize(checkout_dir, master.branch)
200
172
        checkout1 = checkout_dir.create_workingtree('m1')
201
173
 
202
174
        # Create a second branch, with an extra commit
224
196
        # merges, because they were real merges
225
197
        out, err = self.run_bzr('update')
226
198
        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)
 
199
        self.assertEndsWith(err, 'All changes applied successfully.\n'
 
200
                         'Updated to revision 2.\n')
 
201
        self.assertContainsRe(err, r'\+N  file3')
232
202
        # The pending merges should still be there
233
203
        self.assertEqual(['o2'], checkout1.get_parent_ids()[1:])
234
204
 
240
210
                                                   lightweight=True)
241
211
        tree.commit('empty commit')
242
212
        self.run_bzr('update checkout')
243
 
 
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'])
250
 
        master.add(['file'])
251
 
        master.commit('one', rev_id='m1')
252
 
 
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')
258
 
 
259
 
        # Create a second branch, with an extra commit
260
 
        other = master.bzrdir.sprout('other').open_workingtree()
261
 
        self.build_tree(['other/file2'])
262
 
        other.add(['file2'])
263
 
        other.commit('other2', rev_id='o2')
264
 
 
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:])
268
 
 
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')
272
 
 
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',),
281
 
                         err)
282
 
        # The pending merges should still be there
283
 
        self.assertEqual([], checkout1.get_parent_ids()[1:])
284
 
 
285
 
    def test_update_dash_r(self):
286
 
        master = self.make_branch_and_tree('master')
287
 
        os.chdir('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')
294
 
 
295
 
        sr = ScriptRunner()
296
 
        sr.run_script(self, '''
297
 
$ bzr update -r 1
298
 
2>-D  file2
299
 
2>All changes applied successfully.
300
 
2>Updated to revision 1 of .../master
301
 
''')
302
 
        self.failUnlessExists('./file1')
303
 
        self.failIfExists('./file2')
304
 
        self.assertEquals(['m1'], master.get_parent_ids())
305
 
 
306
 
    def test_update_dash_r_outside_history(self):
307
 
        """Ensure that we can update -r to dotted revisions.
308
 
        """
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')
313
 
 
314
 
        # Create a second branch, with extra commits
315
 
        other = master.bzrdir.sprout('other').open_workingtree()
316
 
        self.build_tree(['other/file2', 'other/file3'])
317
 
        other.add(['file2'])
318
 
        other.commit('other2', rev_id='o2')
319
 
        other.add(['file3'])
320
 
        other.commit('other3', rev_id='o3')
321
 
 
322
 
        os.chdir('master')
323
 
        self.run_bzr('merge ../other')
324
 
        master.commit('merge', rev_id='merge')
325
 
 
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 .*')
331
 
 
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 .*')
337
 
 
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')
345
 
 
346
 
        self.run_bzr('checkout master checkout')
347
 
 
348
 
        # add a revision in the master.
349
 
        self.build_tree(['master/file2'])
350
 
        master.add(['file2'])
351
 
        master.commit('two', rev_id='m2')
352
 
 
353
 
        os.chdir('checkout')
354
 
        sr = ScriptRunner()
355
 
        sr.run_script(self, '''
356
 
$ bzr update -r revid:m2
357
 
2>+N  file2
358
 
2>All changes applied successfully.
359
 
2>Updated to revision 2 of branch .../master
360
 
''')
361
 
 
362
 
    def test_update_checkout_prevent_double_merge(self):
363
 
        """"Launchpad bug 113809 in bzr "update performs two merges"
364
 
        https://launchpad.net/bugs/113809"""
365
 
        master = self.make_branch_and_tree('master')
366
 
        self.build_tree_contents([('master/file', 'initial contents\n')])
367
 
        master.add(['file'])
368
 
        master.commit('one', rev_id='m1')
369
 
 
370
 
        checkout = master.branch.create_checkout('checkout')
371
 
        lightweight = checkout.branch.create_checkout('lightweight',
372
 
                                                      lightweight=True)
373
 
 
374
 
        # time to create a mess
375
 
        # add a commit to the master
376
 
        self.build_tree_contents([('master/file', 'master\n')])
377
 
        master.commit('two', rev_id='m2')
378
 
        self.build_tree_contents([('master/file', 'master local changes\n')])
379
 
 
380
 
        # local commit on the checkout
381
 
        self.build_tree_contents([('checkout/file', 'checkout\n')])
382
 
        checkout.commit('tree', rev_id='c2', local=True)
383
 
        self.build_tree_contents([('checkout/file',
384
 
                                   'checkout local changes\n')])
385
 
 
386
 
        # lightweight 
387
 
        self.build_tree_contents([('lightweight/file',
388
 
                                   'lightweight local changes\n')])
389
 
 
390
 
        # now update (and get conflicts)
391
 
        out, err = self.run_bzr('update lightweight', retcode=1)
392
 
        self.assertEqual('', out)
393
 
        # NB: these conflicts are actually in the source code
394
 
        self.assertFileEqual('''\
395
 
<<<<<<< TREE
396
 
lightweight local changes
397
 
=======
398
 
checkout
399
 
>>>>>>> MERGE-SOURCE
400
 
''',
401
 
                             'lightweight/file')
402
 
 
403
 
        # resolve it
404
 
        self.build_tree_contents([('lightweight/file',
405
 
                                   'lightweight+checkout\n')])
406
 
        self.run_bzr('resolve lightweight/file')
407
 
 
408
 
        # check we get the second conflict
409
 
        out, err = self.run_bzr('update lightweight', retcode=1)
410
 
        self.assertEqual('', out)
411
 
        # NB: these conflicts are actually in the source code
412
 
        self.assertFileEqual('''\
413
 
<<<<<<< TREE
414
 
lightweight+checkout
415
 
=======
416
 
master
417
 
>>>>>>> MERGE-SOURCE
418
 
''',
419
 
                             'lightweight/file')