~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

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

  • Committer: Jelmer Vernooij
  • Date: 2012-02-20 14:15:25 UTC
  • mto: (6471.1.4 iter-child-entries)
  • mto: This revision was merged to the branch mainline in revision 6472.
  • Revision ID: jelmer@samba.org-20120220141525-9azkfei62st8yc7w
Use inventories directly in fewer places.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2006-2010 Canonical Ltd
2
 
# -*- coding: utf-8 -*-
 
1
# Copyright (C) 2006-2011 Canonical Ltd
3
2
#
4
3
# This program is free software; you can redistribute it and/or modify
5
4
# it under the terms of the GNU General Public License as published by
19
18
"""Tests for the update command of bzr."""
20
19
 
21
20
import os
22
 
import re
23
21
 
24
22
from bzrlib import (
25
23
    branch,
26
24
    bzrdir,
27
25
    osutils,
28
26
    tests,
29
 
    urlutils,
30
27
    workingtree,
31
28
    )
32
29
from bzrlib.tests.script import ScriptRunner
91
88
Updated to revision 1 of branch %s
92
89
""" % osutils.pathjoin(self.test_dir, 'branch',),
93
90
                         err)
94
 
        self.failUnlessExists('branch/file')
 
91
        self.assertPathExists('branch/file')
95
92
 
96
93
    def test_update_out_of_date_light_checkout(self):
97
94
        self.make_branch_and_tree('branch')
141
138
        # smoke test for doing an update of a checkout of a bound
142
139
        # branch with local commits.
143
140
        master = self.make_branch_and_tree('master')
 
141
        master.commit('first commit')
144
142
        # make a bound branch
145
143
        self.run_bzr('checkout master child')
146
 
        # get an object form of child
147
 
        child = workingtree.WorkingTree.open('child')
148
144
        # check that out
149
145
        self.run_bzr('checkout --lightweight child checkout')
150
146
        # get an object form of the checkout to manipulate
159
155
        a_file = file('child/file_b', 'wt')
160
156
        a_file.write('Foo')
161
157
        a_file.close()
 
158
        # get an object form of child
 
159
        child = workingtree.WorkingTree.open('child')
162
160
        child.add(['file_b'])
163
161
        child_tip = child.commit('add file_b', local=True)
164
162
        # check checkout
175
173
All changes applied successfully.
176
174
+N  file
177
175
All changes applied successfully.
178
 
Updated to revision 1 of branch %s
 
176
Updated to revision 2 of branch %s
179
177
Your local commits will now show as pending merges with 'bzr status', and can be committed with 'bzr commit'.
180
178
""" % osutils.pathjoin(self.test_dir, 'master',),
181
179
                         err)
182
180
        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')
 
181
        self.assertPathExists('checkout/file')
 
182
        self.assertPathExists('checkout/file_b')
 
183
        self.assertPathExists('checkout/file_c')
186
184
        self.assertTrue(wt.has_filename('file_c'))
187
185
 
188
186
    def test_update_with_merges(self):
196
194
 
197
195
        self.build_tree(['checkout1/'])
198
196
        checkout_dir = bzrdir.BzrDirMetaFormat1().initialize('checkout1')
199
 
        branch.BranchReferenceFormat().initialize(checkout_dir, master.branch)
 
197
        checkout_dir.set_branch_reference(master.branch)
200
198
        checkout1 = checkout_dir.create_workingtree('m1')
201
199
 
202
200
        # Create a second branch, with an extra commit
241
239
        tree.commit('empty commit')
242
240
        self.run_bzr('update checkout')
243
241
 
 
242
    def test_update_with_merge_merged_to_master(self):
 
243
        # Test that 'bzr update' works correctly when you have
 
244
        # an update in the master tree, and a [lightweight or otherwise]
 
245
        # checkout which has merge a revision merged to master already.
 
246
        master = self.make_branch_and_tree('master')
 
247
        self.build_tree(['master/file'])
 
248
        master.add(['file'])
 
249
        master.commit('one', rev_id='m1')
 
250
 
 
251
        self.build_tree(['checkout1/'])
 
252
        checkout_dir = bzrdir.BzrDirMetaFormat1().initialize('checkout1')
 
253
        checkout_dir.set_branch_reference(master.branch)
 
254
        checkout1 = checkout_dir.create_workingtree('m1')
 
255
 
 
256
        # Create a second branch, with an extra commit
 
257
        other = master.bzrdir.sprout('other').open_workingtree()
 
258
        self.build_tree(['other/file2'])
 
259
        other.add(['file2'])
 
260
        other.commit('other2', rev_id='o2')
 
261
 
 
262
        # Merge the other branch into checkout -  'start reviewing a patch'
 
263
        checkout1.merge_from_branch(other.branch)
 
264
        self.assertEqual(['o2'], checkout1.get_parent_ids()[1:])
 
265
 
 
266
        # Create a new commit in the master branch - 'someone else lands its'
 
267
        master.merge_from_branch(other.branch)
 
268
        master.commit('f3', rev_id='m2')
 
269
 
 
270
        # This should not report about local commits being pending
 
271
        # merges, because they were real merges (but are now gone).
 
272
        # It should perhaps report on them.
 
273
        out, err = self.run_bzr('update', working_dir='checkout1')
 
274
        self.assertEqual('', out)
 
275
        self.assertEqualDiff('''All changes applied successfully.
 
276
Updated to revision 2 of branch %s
 
277
''' % osutils.pathjoin(self.test_dir, 'master',),
 
278
                         err)
 
279
        # The pending merges should still be there
 
280
        self.assertEqual([], checkout1.get_parent_ids()[1:])
 
281
 
244
282
    def test_update_dash_r(self):
245
283
        master = self.make_branch_and_tree('master')
246
284
        os.chdir('master')
258
296
2>All changes applied successfully.
259
297
2>Updated to revision 1 of .../master
260
298
''')
261
 
        self.failUnlessExists('./file1')
262
 
        self.failIfExists('./file2')
 
299
        self.assertPathExists('./file1')
 
300
        self.assertPathDoesNotExist('./file2')
263
301
        self.assertEquals(['m1'], master.get_parent_ids())
264
302
 
265
303
    def test_update_dash_r_outside_history(self):
 
304
        """Ensure that we can update -r to dotted revisions.
 
305
        """
266
306
        master = self.make_branch_and_tree('master')
267
307
        self.build_tree(['master/file1'])
268
308
        master.add(['file1'])
269
309
        master.commit('one', rev_id='m1')
270
310
 
271
 
        # Create a second branch, with an extra commit
 
311
        # Create a second branch, with extra commits
272
312
        other = master.bzrdir.sprout('other').open_workingtree()
273
 
        self.build_tree(['other/file2'])
 
313
        self.build_tree(['other/file2', 'other/file3'])
274
314
        other.add(['file2'])
275
315
        other.commit('other2', rev_id='o2')
 
316
        other.add(['file3'])
 
317
        other.commit('other3', rev_id='o3')
276
318
 
277
319
        os.chdir('master')
278
320
        self.run_bzr('merge ../other')
279
321
        master.commit('merge', rev_id='merge')
280
322
 
281
 
        out, err = self.run_bzr('update -r revid:o2',
282
 
                                retcode=3)
283
 
        self.assertEqual('', out)
284
 
        self.assertEqual('bzr: ERROR: branch has no revision o2\n'
285
 
                         'bzr update --revision only works'
286
 
                         ' for a revision in the branch history\n',
287
 
                         err)
 
323
        # Switch to o2. file3 was added only in o3 and should be deleted.
 
324
        out, err = self.run_bzr('update -r revid:o2')
 
325
        self.assertContainsRe(err, '-D\s+file3')
 
326
        self.assertContainsRe(err, 'All changes applied successfully\.')
 
327
        self.assertContainsRe(err, 'Updated to revision 1.1.1 of branch .*')
 
328
 
 
329
        # Switch back to latest
 
330
        out, err = self.run_bzr('update')
 
331
        self.assertContainsRe(err, '\+N\s+file3')
 
332
        self.assertContainsRe(err, 'All changes applied successfully\.')
 
333
        self.assertContainsRe(err, 'Updated to revision 2 of branch .*')
288
334
 
289
335
    def test_update_dash_r_in_master(self):
290
336
        # Test that 'bzr update' works correctly when you have
310
356
2>Updated to revision 2 of branch .../master
311
357
''')
312
358
 
 
359
    def test_update_show_base(self):
 
360
        """bzr update support --show-base
 
361
 
 
362
        see https://bugs.launchpad.net/bzr/+bug/202374"""
 
363
 
 
364
        tree=self.make_branch_and_tree('.')
 
365
 
 
366
        f = open('hello','wt')
 
367
        f.write('foo')
 
368
        f.close()
 
369
        tree.add('hello')
 
370
        tree.commit('fie')
 
371
 
 
372
        f = open('hello','wt')
 
373
        f.write('fee')
 
374
        f.close()
 
375
        tree.commit('fee')
 
376
 
 
377
        #tree.update() gives no such revision, so ...
 
378
        self.run_bzr(['update','-r1'])
 
379
 
 
380
        #create conflict
 
381
        f = open('hello','wt')
 
382
        f.write('fie')
 
383
        f.close()
 
384
 
 
385
        out, err = self.run_bzr(['update','--show-base'],retcode=1)
 
386
 
 
387
        # check for conflict notification
 
388
        self.assertContainsString(err,
 
389
                                  ' M  hello\nText conflict in hello\n1 conflicts encountered.\n')
 
390
        
 
391
        self.assertEqualDiff('<<<<<<< TREE\n'
 
392
                             'fie||||||| BASE-REVISION\n'
 
393
                             'foo=======\n'
 
394
                             'fee>>>>>>> MERGE-SOURCE\n',
 
395
                             open('hello').read())
 
396
 
313
397
    def test_update_checkout_prevent_double_merge(self):
314
398
        """"Launchpad bug 113809 in bzr "update performs two merges"
315
399
        https://launchpad.net/bugs/113809"""
341
425
        # now update (and get conflicts)
342
426
        out, err = self.run_bzr('update lightweight', retcode=1)
343
427
        self.assertEqual('', out)
 
428
        # NB: these conflicts are actually in the source code
344
429
        self.assertFileEqual('''\
345
430
<<<<<<< TREE
346
431
lightweight local changes
358
443
        # check we get the second conflict
359
444
        out, err = self.run_bzr('update lightweight', retcode=1)
360
445
        self.assertEqual('', out)
 
446
        # NB: these conflicts are actually in the source code
361
447
        self.assertFileEqual('''\
362
448
<<<<<<< TREE
363
449
lightweight+checkout
367
453
''',
368
454
                             'lightweight/file')
369
455
 
 
456
 
 
457
    def test_no_upgrade_single_file(self):
 
458
        """There's one basis revision per tree.
 
459
 
 
460
        Since you can't actually change the basis for a single file at the
 
461
        moment, we don't let you think you can.
 
462
 
 
463
        See bug 557886.
 
464
        """
 
465
        self.make_branch_and_tree('.')
 
466
        self.build_tree_contents([('a/',),
 
467
            ('a/file', 'content')])
 
468
        sr = ScriptRunner()
 
469
        sr.run_script(self, '''
 
470
            $ bzr update ./a
 
471
            2>bzr: ERROR: bzr update can only update a whole tree, not a file or subdirectory
 
472
            $ bzr update ./a/file
 
473
            2>bzr: ERROR: bzr update can only update a whole tree, not a file or subdirectory
 
474
            $ bzr update .
 
475
            2>Tree is up to date at revision 0 of branch ...
 
476
            $ cd a
 
477
            $ bzr update .
 
478
            2>bzr: ERROR: bzr update can only update a whole tree, not a file or subdirectory
 
479
            # however, you can update the whole tree from a subdirectory
 
480
            $ bzr update
 
481
            2>Tree is up to date at revision 0 of branch ...
 
482
            ''')