/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: Michael Ellerman
  • Date: 2006-05-31 08:44:29 UTC
  • mto: (1711.2.63 jam-integration)
  • mto: This revision was merged to the branch mainline in revision 1792.
  • Revision ID: michael@ellerman.id.au-20060531084429-35e5429abda9f560
Add optional location to ancestry and fix behaviour for checkouts.

This adds an optional location parameter to the ancestry command. It also
changes the behaviour of ancestry on checkouts such that if they have
been created with a subset of the branch history, only the subset is
shown by 'bzr ancestry'. Tests for all of that as well.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2006-2010 Canonical Ltd
2
 
#
 
1
# Copyright (C) 2006 by Canonical Ltd
 
2
# -*- coding: utf-8 -*-
 
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
5
6
# the Free Software Foundation; either version 2 of the License, or
6
7
# (at your option) any later version.
7
 
#
 
8
 
8
9
# This program is distributed in the hope that it will be useful,
9
10
# but WITHOUT ANY WARRANTY; without even the implied warranty of
10
11
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11
12
# GNU General Public License for more details.
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
 
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):
 
21
 
 
22
from bzrlib.tests import TestSkipped
 
23
from bzrlib.tests.blackbox import ExternalBase
 
24
from bzrlib.workingtree import WorkingTree
 
25
 
 
26
 
 
27
class TestUpdate(ExternalBase):
35
28
 
36
29
    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)
48
 
        self.assertEqual('', out)
49
 
 
50
 
    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)
 
30
        self.runbzr("init")
 
31
        out, err = self.runbzr('update')
 
32
        self.assertEqual('Tree is up to date.\n', err)
56
33
        self.assertEqual('', out)
57
34
 
58
35
    def test_update_up_to_date_light_checkout(self):
59
36
        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)
 
37
        self.runbzr('checkout --lightweight branch checkout')
 
38
        out, err = self.runbzr('update checkout')
 
39
        self.assertEqual('Tree is up to date.\n', err)
65
40
        self.assertEqual('', out)
66
41
 
67
 
    def test_update_up_to_date_checkout(self):
68
 
        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
 
''')
75
 
 
76
42
    def test_update_out_of_date_standalone_tree(self):
77
43
        # FIXME the default format has to change for this to pass
78
44
        # because it currently uses the branch last-revision marker.
 
45
        raise TestSkipped('default format too old')
79
46
        self.make_branch_and_tree('branch')
80
47
        # make a checkout
81
 
        self.run_bzr('checkout --lightweight branch checkout')
 
48
        self.runbzr('checkout --lightweight branch checkout')
82
49
        self.build_tree(['checkout/file'])
83
 
        self.run_bzr('add checkout/file')
84
 
        self.run_bzr('commit -m add-file checkout')
 
50
        self.runbzr('add checkout/file')
 
51
        self.runbzr('commit -m add-file checkout')
85
52
        # now branch should be out of date
86
 
        out,err = self.run_bzr('update branch')
87
 
        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)
 
53
        out,err = self.runbzr('update branch')
 
54
        self.assertEqual('Updated to revision 1.\n', out)
 
55
        self.assertEqual('', err)
93
56
        self.failUnlessExists('branch/file')
94
57
 
95
58
    def test_update_out_of_date_light_checkout(self):
96
59
        self.make_branch_and_tree('branch')
97
60
        # make two checkouts
98
 
        self.run_bzr('checkout --lightweight branch checkout')
99
 
        self.run_bzr('checkout --lightweight branch checkout2')
 
61
        self.runbzr('checkout --lightweight branch checkout')
 
62
        self.runbzr('checkout --lightweight branch checkout2')
100
63
        self.build_tree(['checkout/file'])
101
 
        self.run_bzr('add checkout/file')
102
 
        self.run_bzr('commit -m add-file checkout')
 
64
        self.runbzr('add checkout/file')
 
65
        self.runbzr('commit -m add-file checkout')
103
66
        # 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',),
 
67
        out,err = self.runbzr('update checkout2')
 
68
        self.assertEqual('All changes applied successfully.\n'
 
69
                         'Updated to revision 1.\n',
109
70
                         err)
110
71
        self.assertEqual('', out)
111
72
 
112
73
    def test_update_conflicts_returns_2(self):
113
74
        self.make_branch_and_tree('branch')
114
75
        # make two checkouts
115
 
        self.run_bzr('checkout --lightweight branch checkout')
 
76
        self.runbzr('checkout --lightweight branch checkout')
116
77
        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')
 
78
        self.runbzr('add checkout/file')
 
79
        self.runbzr('commit -m add-file checkout')
 
80
        self.runbzr('checkout --lightweight branch checkout2')
120
81
        # now alter file in checkout
121
82
        a_file = file('checkout/file', 'wt')
122
83
        a_file.write('Foo')
123
84
        a_file.close()
124
 
        self.run_bzr('commit -m checnge-file checkout')
 
85
        self.runbzr('commit -m checnge-file checkout')
125
86
        # now checkout2 should be out of date
126
87
        # make a local change to file
127
88
        a_file = file('checkout2/file', 'wt')
128
89
        a_file.write('Bar')
129
90
        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)
 
91
        out,err = self.runbzr('update checkout2', retcode=1)
 
92
        self.assertEqual(['1 conflicts encountered.',
 
93
                          'Updated to revision 2.'],
 
94
                         err.split('\n')[1:3])
 
95
        self.assertContainsRe(err, 'Text conflict in file\n')
137
96
        self.assertEqual('', out)
138
97
 
139
98
    def test_smoke_update_checkout_bound_branch_local_commits(self):
140
99
        # smoke test for doing an update of a checkout of a bound
141
100
        # branch with local commits.
142
 
        master = self.make_branch_and_tree('master')
 
101
        self.make_branch_and_tree('master')
143
102
        # make a bound branch
144
 
        self.run_bzr('checkout master child')
145
 
        # get an object form of child
146
 
        child = workingtree.WorkingTree.open('child')
 
103
        self.run_bzr('checkout', 'master', 'child')
147
104
        # check that out
148
 
        self.run_bzr('checkout --lightweight child checkout')
149
 
        # get an object form of the checkout to manipulate
150
 
        wt = workingtree.WorkingTree.open('checkout')
 
105
        self.run_bzr('checkout', '--lightweight', 'child', 'checkout')
151
106
        # change master
152
107
        a_file = file('master/file', 'wt')
153
108
        a_file.write('Foo')
154
109
        a_file.close()
155
 
        master.add(['file'])
156
 
        master_tip = master.commit('add file')
 
110
        self.run_bzr('add', 'master')
 
111
        self.run_bzr('commit', '-m', 'add file', 'master')
157
112
        # change child
158
113
        a_file = file('child/file_b', 'wt')
159
114
        a_file.write('Foo')
160
115
        a_file.close()
161
 
        child.add(['file_b'])
162
 
        child_tip = child.commit('add file_b', local=True)
 
116
        self.run_bzr('add', 'child')
 
117
        self.run_bzr('commit', '--local', '-m', 'add file_b', 'child')
163
118
        # check checkout
164
119
        a_file = file('checkout/file_c', 'wt')
165
120
        a_file.write('Foo')
166
121
        a_file.close()
167
 
        wt.add(['file_c'])
 
122
        self.run_bzr('add', 'checkout')
168
123
 
169
124
        # now, update checkout ->
170
125
        # get all three files and a pending merge.
171
 
        out, err = self.run_bzr('update checkout')
172
 
        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)
181
 
        self.assertEqual([master_tip, child_tip], wt.get_parent_ids())
 
126
        self.run_bzr('update', 'checkout')
 
127
        wt = WorkingTree.open('checkout')
 
128
        self.assertNotEqual([], wt.pending_merges())
182
129
        self.failUnlessExists('checkout/file')
183
130
        self.failUnlessExists('checkout/file_b')
184
131
        self.failUnlessExists('checkout/file_c')
185
132
        self.assertTrue(wt.has_filename('file_c'))
186
 
 
187
 
    def test_update_with_merges(self):
188
 
        # Test that 'bzr update' works correctly when you have
189
 
        # an update in the master tree, and a lightweight checkout
190
 
        # which has merged another branch
191
 
        master = self.make_branch_and_tree('master')
192
 
        self.build_tree(['master/file'])
193
 
        master.add(['file'])
194
 
        master.commit('one', rev_id='m1')
195
 
 
196
 
        self.build_tree(['checkout1/'])
197
 
        checkout_dir = bzrdir.BzrDirMetaFormat1().initialize('checkout1')
198
 
        branch.BranchReferenceFormat().initialize(checkout_dir,
199
 
            target_branch=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_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')