/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: 2007-05-31 20:29:04 UTC
  • mto: This revision was merged to the branch mainline in revision 2499.
  • Revision ID: john@arbash-meinel.com-20070531202904-34h7ygudo7qq9ha1
Update the code so that symlinks aren't cached at incorrect times
and fix the tests so that they don't assume files and symlinks
get cached even when the timestamp doesn't declare them 'safe'.

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
 
        self.make_branch_and_tree('.')
38
 
        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)
 
32
        self.runbzr("init")
 
33
        out, err = self.runbzr('update')
 
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
 
        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'
54
 
                         % self.test_dir,
55
 
                         err)
 
38
        self.runbzr("init")
 
39
        out, err = self.runbzr('up')
 
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
 
        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'),
64
 
                         err)
 
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)
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
 
        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
 
''')
 
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)
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
78
59
        # because it currently uses the branch last-revision marker.
79
60
        self.make_branch_and_tree('branch')
80
61
        # make a checkout
81
 
        self.run_bzr('checkout --lightweight branch checkout')
 
62
        self.runbzr('checkout --lightweight branch checkout')
82
63
        self.build_tree(['checkout/file'])
83
 
        self.run_bzr('add checkout/file')
84
 
        self.run_bzr('commit -m add-file checkout')
 
64
        self.runbzr('add checkout/file')
 
65
        self.runbzr('commit -m add-file checkout')
85
66
        # now branch should be out of date
86
 
        out,err = self.run_bzr('update branch')
 
67
        out,err = self.runbzr('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.assertEqual('All changes applied successfully.\n'
 
70
                         'Updated to revision 1.\n', err)
93
71
        self.failUnlessExists('branch/file')
94
72
 
95
73
    def test_update_out_of_date_light_checkout(self):
96
74
        self.make_branch_and_tree('branch')
97
75
        # make two checkouts
98
 
        self.run_bzr('checkout --lightweight branch checkout')
99
 
        self.run_bzr('checkout --lightweight branch checkout2')
 
76
        self.runbzr('checkout --lightweight branch checkout')
 
77
        self.runbzr('checkout --lightweight branch checkout2')
100
78
        self.build_tree(['checkout/file'])
101
 
        self.run_bzr('add checkout/file')
102
 
        self.run_bzr('commit -m add-file checkout')
 
79
        self.runbzr('add checkout/file')
 
80
        self.runbzr('commit -m add-file checkout')
103
81
        # now checkout2 should be out of date
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',),
 
82
        out,err = self.runbzr('update checkout2')
 
83
        self.assertEqual('All changes applied successfully.\n'
 
84
                         'Updated to revision 1.\n',
109
85
                         err)
110
86
        self.assertEqual('', out)
111
87
 
112
88
    def test_update_conflicts_returns_2(self):
113
89
        self.make_branch_and_tree('branch')
114
90
        # make two checkouts
115
 
        self.run_bzr('checkout --lightweight branch checkout')
 
91
        self.runbzr('checkout --lightweight branch checkout')
116
92
        self.build_tree(['checkout/file'])
117
 
        self.run_bzr('add checkout/file')
118
 
        self.run_bzr('commit -m add-file checkout')
119
 
        self.run_bzr('checkout --lightweight branch checkout2')
 
93
        self.runbzr('add checkout/file')
 
94
        self.runbzr('commit -m add-file checkout')
 
95
        self.runbzr('checkout --lightweight branch checkout2')
120
96
        # now alter file in checkout
121
97
        a_file = file('checkout/file', 'wt')
122
98
        a_file.write('Foo')
123
99
        a_file.close()
124
 
        self.run_bzr('commit -m checnge-file checkout')
 
100
        self.runbzr('commit -m checnge-file checkout')
125
101
        # now checkout2 should be out of date
126
102
        # make a local change to file
127
103
        a_file = file('checkout2/file', 'wt')
128
104
        a_file.write('Bar')
129
105
        a_file.close()
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',),
136
 
                         err)
 
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')
137
111
        self.assertEqual('', out)
138
112
 
139
113
    def test_smoke_update_checkout_bound_branch_local_commits(self):
141
115
        # branch with local commits.
142
116
        master = self.make_branch_and_tree('master')
143
117
        # make a bound branch
144
 
        self.run_bzr('checkout master child')
 
118
        self.run_bzr('checkout', 'master', 'child')
145
119
        # get an object form of child
146
 
        child = workingtree.WorkingTree.open('child')
 
120
        child = WorkingTree.open('child')
147
121
        # check that out
148
 
        self.run_bzr('checkout --lightweight child checkout')
 
122
        self.run_bzr('checkout', '--lightweight', 'child', 'checkout')
149
123
        # get an object form of the checkout to manipulate
150
 
        wt = workingtree.WorkingTree.open('checkout')
 
124
        wt = WorkingTree.open('checkout')
151
125
        # change master
152
126
        a_file = file('master/file', 'wt')
153
127
        a_file.write('Foo')
168
142
 
169
143
        # now, update checkout ->
170
144
        # get all three files and a pending merge.
171
 
        out, err = self.run_bzr('update checkout')
 
145
        out, err = self.run_bzr('update', 'checkout')
172
146
        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)
 
147
        self.assertContainsRe(err, 'Updated to revision 1.\n'
 
148
                                   'Your local commits will now show as'
 
149
                                   ' pending merges')
181
150
        self.assertEqual([master_tip, child_tip], wt.get_parent_ids())
182
151
        self.failUnlessExists('checkout/file')
183
152
        self.failUnlessExists('checkout/file_b')
195
164
 
196
165
        self.build_tree(['checkout1/'])
197
166
        checkout_dir = bzrdir.BzrDirMetaFormat1().initialize('checkout1')
198
 
        branch.BranchReferenceFormat().initialize(checkout_dir,
199
 
            target_branch=master.branch)
 
167
        branch.BranchReferenceFormat().initialize(checkout_dir, master.branch)
200
168
        checkout1 = checkout_dir.create_workingtree('m1')
201
169
 
202
170
        # Create a second branch, with an extra commit
212
180
 
213
181
        # Merge the other branch into checkout
214
182
        os.chdir('checkout1')
215
 
        self.run_bzr('merge ../other')
 
183
        self.run_bzr('merge', '../other')
216
184
 
217
185
        self.assertEqual(['o2'], checkout1.get_parent_ids()[1:])
218
186
 
219
187
        # At this point, 'commit' should fail, because we are out of date
220
188
        self.run_bzr_error(["please run 'bzr update'"],
221
 
                           'commit -m merged')
 
189
                           'commit', '-m', 'merged')
222
190
 
223
191
        # This should not report about local commits being pending
224
192
        # merges, because they were real merges
225
193
        out, err = self.run_bzr('update')
226
194
        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)
 
195
        self.assertEqual('All changes applied successfully.\n'
 
196
                         'Updated to revision 2.\n', err)
 
197
 
232
198
        # The pending merges should still be there
233
199
        self.assertEqual(['o2'], checkout1.get_parent_ids()[1:])
234
200
 
239
205
        checkout = readonly_branch.create_checkout('checkout',
240
206
                                                   lightweight=True)
241
207
        tree.commit('empty commit')
242
 
        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')
 
208
        self.runbzr(['update', 'checkout'])