~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

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

  • Committer: Canonical.com Patch Queue Manager
  • Date: 2010-04-08 06:17:41 UTC
  • mfrom: (4797.33.16 apport)
  • Revision ID: pqm@pqm.ubuntu.com-20100408061741-m7vl6z97vu33riv7
(robertc) Make sure ExecutablePath and InterpreterPath are set in
        Apport. (Martin Pool, James Westby, lp:528114)

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2006 Canonical Ltd
2
 
# -*- coding: utf-8 -*-
 
1
# Copyright (C) 2006-2010 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
13
12
#
14
13
# You should have received a copy of the GNU General Public License
15
14
# along with this program; if not, write to the Free Software
16
 
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17
16
 
18
17
 
19
18
"""Tests for the update command of bzr."""
20
19
 
21
20
import os
22
 
 
23
 
from bzrlib import branch, bzrdir
24
 
from bzrlib.tests.blackbox import ExternalBase
25
 
from bzrlib.workingtree import WorkingTree
26
 
 
27
 
 
28
 
class TestUpdate(ExternalBase):
 
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):
29
35
 
30
36
    def test_update_standalone_trivial(self):
31
37
        self.make_branch_and_tree('.')
32
38
        out, err = self.run_bzr('update')
33
 
        self.assertEqual('Tree is up to date at revision 0.\n', err)
 
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
48
        self.assertEqual('', out)
35
49
 
36
50
    def test_update_standalone_trivial_with_alias_up(self):
37
51
        self.make_branch_and_tree('.')
38
52
        out, err = self.run_bzr('up')
39
 
        self.assertEqual('Tree is up to date at revision 0.\n', err)
 
53
        self.assertEqual('Tree is up to date at revision 0 of branch %s\n'
 
54
                         % self.test_dir,
 
55
                         err)
40
56
        self.assertEqual('', out)
41
57
 
42
58
    def test_update_up_to_date_light_checkout(self):
43
59
        self.make_branch_and_tree('branch')
44
60
        self.run_bzr('checkout --lightweight branch checkout')
45
61
        out, err = self.run_bzr('update checkout')
46
 
        self.assertEqual('Tree is up to date at revision 0.\n', err)
 
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
65
        self.assertEqual('', out)
48
66
 
49
67
    def test_update_up_to_date_checkout(self):
50
68
        self.make_branch_and_tree('branch')
51
69
        self.run_bzr('checkout branch checkout')
52
 
        out, err = self.run_bzr('update checkout')
53
 
        self.assertEqual('Tree is up to date at revision 0.\n', err)
54
 
        self.assertEqual('', out)
 
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
''')
55
75
 
56
76
    def test_update_out_of_date_standalone_tree(self):
57
77
        # FIXME the default format has to change for this to pass
65
85
        # now branch should be out of date
66
86
        out,err = self.run_bzr('update branch')
67
87
        self.assertEqual('', out)
68
 
        self.assertContainsRe(err, '\+N  file')
69
 
        self.assertEndsWith(err, 'All changes applied successfully.\n'
70
 
                         'Updated to revision 1.\n')
 
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)
71
93
        self.failUnlessExists('branch/file')
72
94
 
73
95
    def test_update_out_of_date_light_checkout(self):
80
102
        self.run_bzr('commit -m add-file checkout')
81
103
        # now checkout2 should be out of date
82
104
        out,err = self.run_bzr('update checkout2')
83
 
        self.assertContainsRe(err, '\+N  file')
84
 
        self.assertEndsWith(err, 'All changes applied successfully.\n'
85
 
                         'Updated to revision 1.\n')
 
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)
86
110
        self.assertEqual('', out)
87
111
 
88
112
    def test_update_conflicts_returns_2(self):
104
128
        a_file.write('Bar')
105
129
        a_file.close()
106
130
        out,err = self.run_bzr('update checkout2', retcode=1)
107
 
        self.assertContainsRe(err, 'M  file')
108
 
        self.assertEqual(['1 conflicts encountered.',
109
 
                          'Updated to revision 2.'],
110
 
                         err.split('\n')[-3:-1])
111
 
        self.assertContainsRe(err, 'Text conflict in file\n')
 
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)
112
137
        self.assertEqual('', out)
113
138
 
114
139
    def test_smoke_update_checkout_bound_branch_local_commits(self):
118
143
        # make a bound branch
119
144
        self.run_bzr('checkout master child')
120
145
        # get an object form of child
121
 
        child = WorkingTree.open('child')
 
146
        child = workingtree.WorkingTree.open('child')
122
147
        # check that out
123
148
        self.run_bzr('checkout --lightweight child checkout')
124
149
        # get an object form of the checkout to manipulate
125
 
        wt = WorkingTree.open('checkout')
 
150
        wt = workingtree.WorkingTree.open('checkout')
126
151
        # change master
127
152
        a_file = file('master/file', 'wt')
128
153
        a_file.write('Foo')
145
170
        # get all three files and a pending merge.
146
171
        out, err = self.run_bzr('update checkout')
147
172
        self.assertEqual('', out)
148
 
        self.assertContainsRe(err, '\+N  file')
149
 
        self.assertContainsRe(err, '\+N  file_b')
150
 
        self.assertContainsRe(err, 'Updated to revision 1.\n'
151
 
                                   'Your local commits will now show as'
152
 
                                   ' pending merges')
 
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)
153
181
        self.assertEqual([master_tip, child_tip], wt.get_parent_ids())
154
182
        self.failUnlessExists('checkout/file')
155
183
        self.failUnlessExists('checkout/file_b')
167
195
 
168
196
        self.build_tree(['checkout1/'])
169
197
        checkout_dir = bzrdir.BzrDirMetaFormat1().initialize('checkout1')
170
 
        branch.BranchReferenceFormat().initialize(checkout_dir, master.branch)
 
198
        branch.BranchReferenceFormat().initialize(checkout_dir,
 
199
            target_branch=master.branch)
171
200
        checkout1 = checkout_dir.create_workingtree('m1')
172
201
 
173
202
        # Create a second branch, with an extra commit
195
224
        # merges, because they were real merges
196
225
        out, err = self.run_bzr('update')
197
226
        self.assertEqual('', out)
198
 
        self.assertEndsWith(err, 'All changes applied successfully.\n'
199
 
                         'Updated to revision 2.\n')
200
 
        self.assertContainsRe(err, r'\+N  file3')
 
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)
201
232
        # The pending merges should still be there
202
233
        self.assertEqual(['o2'], checkout1.get_parent_ids()[1:])
203
234
 
209
240
                                                   lightweight=True)
210
241
        tree.commit('empty commit')
211
242
        self.run_bzr('update checkout')
 
243
 
 
244
    def test_update_dash_r(self):
 
245
        master = self.make_branch_and_tree('master')
 
246
        os.chdir('master')
 
247
        self.build_tree(['./file1'])
 
248
        master.add(['file1'])
 
249
        master.commit('one', rev_id='m1')
 
250
        self.build_tree(['./file2'])
 
251
        master.add(['file2'])
 
252
        master.commit('two', rev_id='m2')
 
253
 
 
254
        sr = ScriptRunner()
 
255
        sr.run_script(self, '''
 
256
$ bzr update -r 1
 
257
2>-D  file2
 
258
2>All changes applied successfully.
 
259
2>Updated to revision 1 of .../master
 
260
''')
 
261
        self.failUnlessExists('./file1')
 
262
        self.failIfExists('./file2')
 
263
        self.assertEquals(['m1'], master.get_parent_ids())
 
264
 
 
265
    def test_update_dash_r_outside_history(self):
 
266
        master = self.make_branch_and_tree('master')
 
267
        self.build_tree(['master/file1'])
 
268
        master.add(['file1'])
 
269
        master.commit('one', rev_id='m1')
 
270
 
 
271
        # Create a second branch, with an extra commit
 
272
        other = master.bzrdir.sprout('other').open_workingtree()
 
273
        self.build_tree(['other/file2'])
 
274
        other.add(['file2'])
 
275
        other.commit('other2', rev_id='o2')
 
276
 
 
277
        os.chdir('master')
 
278
        self.run_bzr('merge ../other')
 
279
        master.commit('merge', rev_id='merge')
 
280
 
 
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)
 
288
 
 
289
    def test_update_dash_r_in_master(self):
 
290
        # Test that 'bzr update' works correctly when you have
 
291
        # an update in the master tree,
 
292
        master = self.make_branch_and_tree('master')
 
293
        self.build_tree(['master/file1'])
 
294
        master.add(['file1'])
 
295
        master.commit('one', rev_id='m1')
 
296
 
 
297
        self.run_bzr('checkout master checkout')
 
298
 
 
299
        # add a revision in the master.
 
300
        self.build_tree(['master/file2'])
 
301
        master.add(['file2'])
 
302
        master.commit('two', rev_id='m2')
 
303
 
 
304
        os.chdir('checkout')
 
305
        sr = ScriptRunner()
 
306
        sr.run_script(self, '''
 
307
$ bzr update -r revid:m2
 
308
2>+N  file2
 
309
2>All changes applied successfully.
 
310
2>Updated to revision 2 of branch .../master
 
311
''')
 
312
 
 
313
    def test_update_checkout_prevent_double_merge(self):
 
314
        """"Launchpad bug 113809 in bzr "update performs two merges"
 
315
        https://launchpad.net/bugs/113809"""
 
316
        master = self.make_branch_and_tree('master')
 
317
        self.build_tree_contents([('master/file', 'initial contents\n')])
 
318
        master.add(['file'])
 
319
        master.commit('one', rev_id='m1')
 
320
 
 
321
        checkout = master.branch.create_checkout('checkout')
 
322
        lightweight = checkout.branch.create_checkout('lightweight',
 
323
                                                      lightweight=True)
 
324
 
 
325
        # time to create a mess
 
326
        # add a commit to the master
 
327
        self.build_tree_contents([('master/file', 'master\n')])
 
328
        master.commit('two', rev_id='m2')
 
329
        self.build_tree_contents([('master/file', 'master local changes\n')])
 
330
 
 
331
        # local commit on the checkout
 
332
        self.build_tree_contents([('checkout/file', 'checkout\n')])
 
333
        checkout.commit('tree', rev_id='c2', local=True)
 
334
        self.build_tree_contents([('checkout/file',
 
335
                                   'checkout local changes\n')])
 
336
 
 
337
        # lightweight 
 
338
        self.build_tree_contents([('lightweight/file',
 
339
                                   'lightweight local changes\n')])
 
340
 
 
341
        # now update (and get conflicts)
 
342
        out, err = self.run_bzr('update lightweight', retcode=1)
 
343
        self.assertEqual('', out)
 
344
        # NB: these conflicts are actually in the source code
 
345
        self.assertFileEqual('''\
 
346
<<<<<<< TREE
 
347
lightweight local changes
 
348
=======
 
349
checkout
 
350
>>>>>>> MERGE-SOURCE
 
351
''',
 
352
                             'lightweight/file')
 
353
 
 
354
        # resolve it
 
355
        self.build_tree_contents([('lightweight/file',
 
356
                                   'lightweight+checkout\n')])
 
357
        self.run_bzr('resolve lightweight/file')
 
358
 
 
359
        # check we get the second conflict
 
360
        out, err = self.run_bzr('update lightweight', retcode=1)
 
361
        self.assertEqual('', out)
 
362
        # NB: these conflicts are actually in the source code
 
363
        self.assertFileEqual('''\
 
364
<<<<<<< TREE
 
365
lightweight+checkout
 
366
=======
 
367
master
 
368
>>>>>>> MERGE-SOURCE
 
369
''',
 
370
                             'lightweight/file')