~bzr-pqm/bzr/bzr.dev

6178.1.1 by Martin Pool
'bzr update' makes it clear it will only upgrade the whole tree
1
# Copyright (C) 2006-2011 Canonical Ltd
1887.1.1 by Adeodato Simó
Do not separate paragraphs in the copyright statement with blank lines,
2
#
1508.1.24 by Robert Collins
Add update command for use with checkouts.
3
# This program is free software; you can redistribute it and/or modify
4
# it under the terms of the GNU General Public License as published by
5
# the Free Software Foundation; either version 2 of the License, or
6
# (at your option) any later version.
1887.1.1 by Adeodato Simó
Do not separate paragraphs in the copyright statement with blank lines,
7
#
1508.1.24 by Robert Collins
Add update command for use with checkouts.
8
# This program is distributed in the hope that it will be useful,
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11
# GNU General Public License for more details.
1887.1.1 by Adeodato Simó
Do not separate paragraphs in the copyright statement with blank lines,
12
#
1508.1.24 by Robert Collins
Add update command for use with checkouts.
13
# You should have received a copy of the GNU General Public License
14
# along with this program; if not, write to the Free Software
4183.7.1 by Sabin Iacob
update FSF mailing address
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
1508.1.24 by Robert Collins
Add update command for use with checkouts.
16
17
18
"""Tests for the update command of bzr."""
19
4879.1.3 by Vincent Ladeuil
Cleanup tests and tweak the text displayed.
20
import os
21
22
from bzrlib import (
23
    branch,
24
    bzrdir,
25
    osutils,
26
    tests,
27
    workingtree,
28
    )
4916.1.3 by Martin Pool
Change test_update_dash_r to use ScriptRunner and work with current UI
29
from bzrlib.tests.script import ScriptRunner
4879.1.3 by Vincent Ladeuil
Cleanup tests and tweak the text displayed.
30
31
32
class TestUpdate(tests.TestCaseWithTransport):
1508.1.24 by Robert Collins
Add update command for use with checkouts.
33
34
    def test_update_standalone_trivial(self):
2664.7.2 by Daniel Watkins
tests.blackbox.test_update now uses internals where appropriate.
35
        self.make_branch_and_tree('.')
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
36
        out, err = self.run_bzr('update')
4879.1.3 by Vincent Ladeuil
Cleanup tests and tweak the text displayed.
37
        self.assertEqual(
38
            'Tree is up to date at revision 0 of branch %s\n' % self.test_dir,
39
            err)
4879.1.1 by Neil Martinsen-Burrell
update provides feedback on which branch it is up to date with.
40
        self.assertEqual('', out)
41
42
    def test_update_quiet(self):
43
        self.make_branch_and_tree('.')
44
        out, err = self.run_bzr('update --quiet')
45
        self.assertEqual('', err)
1508.1.24 by Robert Collins
Add update command for use with checkouts.
46
        self.assertEqual('', out)
47
1815.3.4 by Stefan (metze) Metzmacher
add simple test for 'bzr up'
48
    def test_update_standalone_trivial_with_alias_up(self):
2664.7.2 by Daniel Watkins
tests.blackbox.test_update now uses internals where appropriate.
49
        self.make_branch_and_tree('.')
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
50
        out, err = self.run_bzr('up')
4879.1.3 by Vincent Ladeuil
Cleanup tests and tweak the text displayed.
51
        self.assertEqual('Tree is up to date at revision 0 of branch %s\n'
52
                         % self.test_dir,
53
                         err)
1815.3.4 by Stefan (metze) Metzmacher
add simple test for 'bzr up'
54
        self.assertEqual('', out)
55
1587.1.14 by Robert Collins
Make bound branch creation happen via 'checkout'
56
    def test_update_up_to_date_light_checkout(self):
1508.1.24 by Robert Collins
Add update command for use with checkouts.
57
        self.make_branch_and_tree('branch')
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
58
        self.run_bzr('checkout --lightweight branch checkout')
59
        out, err = self.run_bzr('update checkout')
4879.1.3 by Vincent Ladeuil
Cleanup tests and tweak the text displayed.
60
        self.assertEqual('Tree is up to date at revision 0 of branch %s\n'
61
                         % osutils.pathjoin(self.test_dir, 'branch'),
62
                         err)
1830.1.1 by John Arbash Meinel
Print up to date even if bound, also always print out current revno.
63
        self.assertEqual('', out)
64
65
    def test_update_up_to_date_checkout(self):
66
        self.make_branch_and_tree('branch')
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
67
        self.run_bzr('checkout branch checkout')
4916.1.11 by Martin Pool
Don't show extra message about updating from master; it's fairly redundant
68
        sr = ScriptRunner()
69
        sr.run_script(self, '''
70
$ bzr update checkout
4916.1.15 by Martin Pool
whitespace correction in test
71
2>Tree is up to date at revision 0 of branch .../branch
4916.1.11 by Martin Pool
Don't show extra message about updating from master; it's fairly redundant
72
''')
1508.1.24 by Robert Collins
Add update command for use with checkouts.
73
74
    def test_update_out_of_date_standalone_tree(self):
75
        # FIXME the default format has to change for this to pass
76
        # because it currently uses the branch last-revision marker.
77
        self.make_branch_and_tree('branch')
78
        # make a checkout
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
79
        self.run_bzr('checkout --lightweight branch checkout')
1508.1.24 by Robert Collins
Add update command for use with checkouts.
80
        self.build_tree(['checkout/file'])
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
81
        self.run_bzr('add checkout/file')
82
        self.run_bzr('commit -m add-file checkout')
1508.1.24 by Robert Collins
Add update command for use with checkouts.
83
        # now branch should be out of date
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
84
        out,err = self.run_bzr('update branch')
1711.2.107 by John Arbash Meinel
re-enable a skipped update test, and clean it up
85
        self.assertEqual('', out)
4879.1.3 by Vincent Ladeuil
Cleanup tests and tweak the text displayed.
86
        self.assertEqualDiff("""+N  file
87
All changes applied successfully.
88
Updated to revision 1 of branch %s
89
""" % osutils.pathjoin(self.test_dir, 'branch',),
90
                         err)
5784.1.3 by Martin Pool
Switch away from using failUnlessExists and failIfExists
91
        self.assertPathExists('branch/file')
1508.1.24 by Robert Collins
Add update command for use with checkouts.
92
1587.1.14 by Robert Collins
Make bound branch creation happen via 'checkout'
93
    def test_update_out_of_date_light_checkout(self):
1508.1.24 by Robert Collins
Add update command for use with checkouts.
94
        self.make_branch_and_tree('branch')
95
        # make two checkouts
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
96
        self.run_bzr('checkout --lightweight branch checkout')
97
        self.run_bzr('checkout --lightweight branch checkout2')
1508.1.24 by Robert Collins
Add update command for use with checkouts.
98
        self.build_tree(['checkout/file'])
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
99
        self.run_bzr('add checkout/file')
100
        self.run_bzr('commit -m add-file checkout')
1508.1.24 by Robert Collins
Add update command for use with checkouts.
101
        # now checkout2 should be out of date
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
102
        out,err = self.run_bzr('update checkout2')
4879.1.3 by Vincent Ladeuil
Cleanup tests and tweak the text displayed.
103
        self.assertEqualDiff('''+N  file
104
All changes applied successfully.
105
Updated to revision 1 of branch %s
106
''' % osutils.pathjoin(self.test_dir, 'branch',),
107
                         err)
1508.1.24 by Robert Collins
Add update command for use with checkouts.
108
        self.assertEqual('', out)
109
110
    def test_update_conflicts_returns_2(self):
111
        self.make_branch_and_tree('branch')
112
        # make two checkouts
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
113
        self.run_bzr('checkout --lightweight branch checkout')
1508.1.24 by Robert Collins
Add update command for use with checkouts.
114
        self.build_tree(['checkout/file'])
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
115
        self.run_bzr('add checkout/file')
116
        self.run_bzr('commit -m add-file checkout')
117
        self.run_bzr('checkout --lightweight branch checkout2')
1508.1.24 by Robert Collins
Add update command for use with checkouts.
118
        # now alter file in checkout
119
        a_file = file('checkout/file', 'wt')
120
        a_file.write('Foo')
121
        a_file.close()
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
122
        self.run_bzr('commit -m checnge-file checkout')
1508.1.24 by Robert Collins
Add update command for use with checkouts.
123
        # now checkout2 should be out of date
124
        # make a local change to file
125
        a_file = file('checkout2/file', 'wt')
126
        a_file.write('Bar')
127
        a_file.close()
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
128
        out,err = self.run_bzr('update checkout2', retcode=1)
4879.1.3 by Vincent Ladeuil
Cleanup tests and tweak the text displayed.
129
        self.assertEqualDiff(''' M  file
130
Text conflict in file
131
1 conflicts encountered.
132
Updated to revision 2 of branch %s
133
''' % osutils.pathjoin(self.test_dir, 'branch',),
134
                         err)
1508.1.24 by Robert Collins
Add update command for use with checkouts.
135
        self.assertEqual('', out)
1587.1.11 by Robert Collins
Local commits appear to be working properly.
136
137
    def test_smoke_update_checkout_bound_branch_local_commits(self):
138
        # smoke test for doing an update of a checkout of a bound
139
        # branch with local commits.
1908.6.11 by Robert Collins
Remove usage of tree.pending_merges().
140
        master = self.make_branch_and_tree('master')
5954.2.4 by Aaron Bentley
Fix broken tests.
141
        master.commit('first commit')
1587.1.11 by Robert Collins
Local commits appear to be working properly.
142
        # make a bound branch
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
143
        self.run_bzr('checkout master child')
1587.1.11 by Robert Collins
Local commits appear to be working properly.
144
        # check that out
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
145
        self.run_bzr('checkout --lightweight child checkout')
1908.6.11 by Robert Collins
Remove usage of tree.pending_merges().
146
        # get an object form of the checkout to manipulate
4879.1.3 by Vincent Ladeuil
Cleanup tests and tweak the text displayed.
147
        wt = workingtree.WorkingTree.open('checkout')
1587.1.11 by Robert Collins
Local commits appear to be working properly.
148
        # change master
149
        a_file = file('master/file', 'wt')
150
        a_file.write('Foo')
151
        a_file.close()
1908.6.11 by Robert Collins
Remove usage of tree.pending_merges().
152
        master.add(['file'])
153
        master_tip = master.commit('add file')
1587.1.11 by Robert Collins
Local commits appear to be working properly.
154
        # change child
155
        a_file = file('child/file_b', 'wt')
156
        a_file.write('Foo')
157
        a_file.close()
5954.3.2 by Vincent Ladeuil
Nitpicks.
158
        # get an object form of child
159
        child = workingtree.WorkingTree.open('child')
1908.6.11 by Robert Collins
Remove usage of tree.pending_merges().
160
        child.add(['file_b'])
161
        child_tip = child.commit('add file_b', local=True)
1587.1.11 by Robert Collins
Local commits appear to be working properly.
162
        # check checkout
163
        a_file = file('checkout/file_c', 'wt')
164
        a_file.write('Foo')
165
        a_file.close()
1908.6.11 by Robert Collins
Remove usage of tree.pending_merges().
166
        wt.add(['file_c'])
1587.1.11 by Robert Collins
Local commits appear to be working properly.
167
168
        # now, update checkout ->
169
        # get all three files and a pending merge.
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
170
        out, err = self.run_bzr('update checkout')
1711.2.108 by John Arbash Meinel
Assert that update informs the user about where their local commits went.
171
        self.assertEqual('', out)
4985.3.1 by Gerard Krol
Werkt wel ok
172
        self.assertEqualDiff("""+N  file_b
4879.1.3 by Vincent Ladeuil
Cleanup tests and tweak the text displayed.
173
All changes applied successfully.
4985.3.1 by Gerard Krol
Werkt wel ok
174
+N  file
4879.1.3 by Vincent Ladeuil
Cleanup tests and tweak the text displayed.
175
All changes applied successfully.
5954.2.4 by Aaron Bentley
Fix broken tests.
176
Updated to revision 2 of branch %s
4879.1.3 by Vincent Ladeuil
Cleanup tests and tweak the text displayed.
177
Your local commits will now show as pending merges with 'bzr status', and can be committed with 'bzr commit'.
178
""" % osutils.pathjoin(self.test_dir, 'master',),
179
                         err)
1908.6.11 by Robert Collins
Remove usage of tree.pending_merges().
180
        self.assertEqual([master_tip, child_tip], wt.get_parent_ids())
5784.1.3 by Martin Pool
Switch away from using failUnlessExists and failIfExists
181
        self.assertPathExists('checkout/file')
182
        self.assertPathExists('checkout/file_b')
183
        self.assertPathExists('checkout/file_c')
1587.1.11 by Robert Collins
Local commits appear to be working properly.
184
        self.assertTrue(wt.has_filename('file_c'))
1711.2.109 by John Arbash Meinel
Add a test for handling a pending merge plus an update.
185
186
    def test_update_with_merges(self):
187
        # Test that 'bzr update' works correctly when you have
188
        # an update in the master tree, and a lightweight checkout
189
        # which has merged another branch
190
        master = self.make_branch_and_tree('master')
191
        self.build_tree(['master/file'])
192
        master.add(['file'])
193
        master.commit('one', rev_id='m1')
194
195
        self.build_tree(['checkout1/'])
196
        checkout_dir = bzrdir.BzrDirMetaFormat1().initialize('checkout1')
6437.7.3 by Jelmer Vernooij
Use ControlDir.set_branch_reference.
197
        checkout_dir.set_branch_reference(master.branch)
1711.2.109 by John Arbash Meinel
Add a test for handling a pending merge plus an update.
198
        checkout1 = checkout_dir.create_workingtree('m1')
199
200
        # Create a second branch, with an extra commit
201
        other = master.bzrdir.sprout('other').open_workingtree()
202
        self.build_tree(['other/file2'])
203
        other.add(['file2'])
204
        other.commit('other2', rev_id='o2')
205
206
        # Create a new commit in the master branch
207
        self.build_tree(['master/file3'])
208
        master.add(['file3'])
209
        master.commit('f3', rev_id='m2')
210
211
        # Merge the other branch into checkout
212
        os.chdir('checkout1')
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
213
        self.run_bzr('merge ../other')
1711.2.109 by John Arbash Meinel
Add a test for handling a pending merge plus an update.
214
1908.6.11 by Robert Collins
Remove usage of tree.pending_merges().
215
        self.assertEqual(['o2'], checkout1.get_parent_ids()[1:])
1711.2.109 by John Arbash Meinel
Add a test for handling a pending merge plus an update.
216
217
        # At this point, 'commit' should fail, because we are out of date
218
        self.run_bzr_error(["please run 'bzr update'"],
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
219
                           'commit -m merged')
1711.2.109 by John Arbash Meinel
Add a test for handling a pending merge plus an update.
220
221
        # This should not report about local commits being pending
222
        # merges, because they were real merges
223
        out, err = self.run_bzr('update')
224
        self.assertEqual('', out)
4879.1.3 by Vincent Ladeuil
Cleanup tests and tweak the text displayed.
225
        self.assertEqualDiff('''+N  file3
226
All changes applied successfully.
227
Updated to revision 2 of branch %s
228
''' % osutils.pathjoin(self.test_dir, 'master',),
229
                         err)
1711.2.109 by John Arbash Meinel
Add a test for handling a pending merge plus an update.
230
        # The pending merges should still be there
1908.6.11 by Robert Collins
Remove usage of tree.pending_merges().
231
        self.assertEqual(['o2'], checkout1.get_parent_ids()[1:])
1907.5.4 by Matthieu Moy
Added test-cases for update -r. Tweaked the implementation too.
232
2084.2.1 by Aaron Bentley
Support updating lightweight checkouts of readonly branches
233
    def test_readonly_lightweight_update(self):
234
        """Update a light checkout of a readonly branch"""
235
        tree = self.make_branch_and_tree('branch')
236
        readonly_branch = branch.Branch.open(self.get_readonly_url('branch'))
2255.7.55 by Robert Collins
Whitespace fix.
237
        checkout = readonly_branch.create_checkout('checkout',
2084.2.1 by Aaron Bentley
Support updating lightweight checkouts of readonly branches
238
                                                   lightweight=True)
239
        tree.commit('empty commit')
2552.2.2 by Vincent Ladeuil
Enforce run_bzr(string) where possible.
240
        self.run_bzr('update checkout')
2009.1.4 by Mark Hammond
First attempt to merge .dev and resolve the conflicts (but tests are
241
5151.1.1 by Robert Collins
``bzr update`` when a pending merge in the working tree has been merged
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')
6437.7.3 by Jelmer Vernooij
Use ControlDir.set_branch_reference.
253
        checkout_dir.set_branch_reference(master.branch)
5151.1.1 by Robert Collins
``bzr update`` when a pending merge in the working tree has been merged
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
1907.5.4 by Matthieu Moy
Added test-cases for update -r. Tweaked the implementation too.
282
    def test_update_dash_r(self):
283
        master = self.make_branch_and_tree('master')
284
        os.chdir('master')
285
        self.build_tree(['./file1'])
286
        master.add(['file1'])
287
        master.commit('one', rev_id='m1')
288
        self.build_tree(['./file2'])
289
        master.add(['file2'])
290
        master.commit('two', rev_id='m2')
2009.1.6 by Mark Hammond
more tweaks of the merge to get the tests passing.
291
4985.3.5 by Gerard Krol
Reverting some unneeded changes.
292
        sr = ScriptRunner()
293
        sr.run_script(self, '''
294
$ bzr update -r 1
295
2>-D  file2
296
2>All changes applied successfully.
297
2>Updated to revision 1 of .../master
298
''')
5784.1.3 by Martin Pool
Switch away from using failUnlessExists and failIfExists
299
        self.assertPathExists('./file1')
300
        self.assertPathDoesNotExist('./file2')
4916.1.4 by Martin Pool
Check tree parent revision after update -r
301
        self.assertEquals(['m1'], master.get_parent_ids())
1907.5.4 by Matthieu Moy
Added test-cases for update -r. Tweaked the implementation too.
302
303
    def test_update_dash_r_outside_history(self):
5126.1.1 by Parth Malwankar
update -r now supports dotted revision.
304
        """Ensure that we can update -r to dotted revisions.
305
        """
1907.5.4 by Matthieu Moy
Added test-cases for update -r. Tweaked the implementation too.
306
        master = self.make_branch_and_tree('master')
307
        self.build_tree(['master/file1'])
308
        master.add(['file1'])
309
        master.commit('one', rev_id='m1')
310
5126.1.1 by Parth Malwankar
update -r now supports dotted revision.
311
        # Create a second branch, with extra commits
1907.5.4 by Matthieu Moy
Added test-cases for update -r. Tweaked the implementation too.
312
        other = master.bzrdir.sprout('other').open_workingtree()
5126.1.1 by Parth Malwankar
update -r now supports dotted revision.
313
        self.build_tree(['other/file2', 'other/file3'])
1907.5.4 by Matthieu Moy
Added test-cases for update -r. Tweaked the implementation too.
314
        other.add(['file2'])
315
        other.commit('other2', rev_id='o2')
5126.1.1 by Parth Malwankar
update -r now supports dotted revision.
316
        other.add(['file3'])
317
        other.commit('other3', rev_id='o3')
1907.5.4 by Matthieu Moy
Added test-cases for update -r. Tweaked the implementation too.
318
319
        os.chdir('master')
2009.1.6 by Mark Hammond
more tweaks of the merge to get the tests passing.
320
        self.run_bzr('merge ../other')
1907.5.4 by Matthieu Moy
Added test-cases for update -r. Tweaked the implementation too.
321
        master.commit('merge', rev_id='merge')
322
5126.1.1 by Parth Malwankar
update -r now supports dotted revision.
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 .*')
1907.5.4 by Matthieu Moy
Added test-cases for update -r. Tweaked the implementation too.
328
5126.1.3 by Parth Malwankar
updated test for switch from dotted rev to lastest.
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 .*')
334
1907.5.4 by Matthieu Moy
Added test-cases for update -r. Tweaked the implementation too.
335
    def test_update_dash_r_in_master(self):
336
        # Test that 'bzr update' works correctly when you have
337
        # an update in the master tree,
338
        master = self.make_branch_and_tree('master')
339
        self.build_tree(['master/file1'])
340
        master.add(['file1'])
341
        master.commit('one', rev_id='m1')
342
2009.1.6 by Mark Hammond
more tweaks of the merge to get the tests passing.
343
        self.run_bzr('checkout master checkout')
1907.5.4 by Matthieu Moy
Added test-cases for update -r. Tweaked the implementation too.
344
345
        # add a revision in the master.
346
        self.build_tree(['master/file2'])
347
        master.add(['file2'])
348
        master.commit('two', rev_id='m2')
349
350
        os.chdir('checkout')
4916.1.5 by Martin Pool
Update test_update_dash_r_in_master for ui changes
351
        sr = ScriptRunner()
352
        sr.run_script(self, '''
353
$ bzr update -r revid:m2
354
2>+N  file2
355
2>All changes applied successfully.
356
2>Updated to revision 2 of branch .../master
357
''')
4985.3.1 by Gerard Krol
Werkt wel ok
358
5430.7.1 by Rory Yorke
Added --show-base to pull and update (bug 202374).
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('.')
5430.7.2 by Rory Yorke
Changes as per Martin [gz]'s review.
365
366
        f = open('hello','wt')
367
        f.write('foo')
368
        f.close()
5430.7.1 by Rory Yorke
Added --show-base to pull and update (bug 202374).
369
        tree.add('hello')
370
        tree.commit('fie')
5430.7.2 by Rory Yorke
Changes as per Martin [gz]'s review.
371
372
        f = open('hello','wt')
373
        f.write('fee')
374
        f.close()
5430.7.1 by Rory Yorke
Added --show-base to pull and update (bug 202374).
375
        tree.commit('fee')
376
377
        #tree.update() gives no such revision, so ...
378
        self.run_bzr(['update','-r1'])
379
380
        #create conflict
5430.7.2 by Rory Yorke
Changes as per Martin [gz]'s review.
381
        f = open('hello','wt')
382
        f.write('fie')
383
        f.close()
5430.7.1 by Rory Yorke
Added --show-base to pull and update (bug 202374).
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
4985.3.9 by Gerard Krol
Use assertFileEqual in the tests, instead of opening them and looking at the contents. TODO: check if this does work on Windows (due to possible \r\n line endings)?
397
    def test_update_checkout_prevent_double_merge(self):
398
        """"Launchpad bug 113809 in bzr "update performs two merges"
399
        https://launchpad.net/bugs/113809"""
4985.3.1 by Gerard Krol
Werkt wel ok
400
        master = self.make_branch_and_tree('master')
4985.3.17 by Vincent Ladeuil
Some cleanup.
401
        self.build_tree_contents([('master/file', 'initial contents\n')])
4985.3.1 by Gerard Krol
Werkt wel ok
402
        master.add(['file'])
403
        master.commit('one', rev_id='m1')
404
405
        checkout = master.branch.create_checkout('checkout')
4985.3.10 by Gerard Krol
Reformat long lines
406
        lightweight = checkout.branch.create_checkout('lightweight',
407
                                                      lightweight=True)
4985.3.17 by Vincent Ladeuil
Some cleanup.
408
4985.3.1 by Gerard Krol
Werkt wel ok
409
        # time to create a mess
410
        # add a commit to the master
4985.3.17 by Vincent Ladeuil
Some cleanup.
411
        self.build_tree_contents([('master/file', 'master\n')])
4985.3.1 by Gerard Krol
Werkt wel ok
412
        master.commit('two', rev_id='m2')
4985.3.17 by Vincent Ladeuil
Some cleanup.
413
        self.build_tree_contents([('master/file', 'master local changes\n')])
4985.3.1 by Gerard Krol
Werkt wel ok
414
415
        # local commit on the checkout
4985.3.17 by Vincent Ladeuil
Some cleanup.
416
        self.build_tree_contents([('checkout/file', 'checkout\n')])
4985.3.1 by Gerard Krol
Werkt wel ok
417
        checkout.commit('tree', rev_id='c2', local=True)
4985.3.17 by Vincent Ladeuil
Some cleanup.
418
        self.build_tree_contents([('checkout/file',
419
                                   'checkout local changes\n')])
4985.3.1 by Gerard Krol
Werkt wel ok
420
421
        # lightweight 
4985.3.10 by Gerard Krol
Reformat long lines
422
        self.build_tree_contents([('lightweight/file',
4985.3.17 by Vincent Ladeuil
Some cleanup.
423
                                   'lightweight local changes\n')])
4985.3.1 by Gerard Krol
Werkt wel ok
424
4985.3.9 by Gerard Krol
Use assertFileEqual in the tests, instead of opening them and looking at the contents. TODO: check if this does work on Windows (due to possible \r\n line endings)?
425
        # now update (and get conflicts)
4985.3.1 by Gerard Krol
Werkt wel ok
426
        out, err = self.run_bzr('update lightweight', retcode=1)
427
        self.assertEqual('', out)
5053.1.1 by Martin Pool
Merge 2.1 back to trunk
428
        # NB: these conflicts are actually in the source code
4985.3.17 by Vincent Ladeuil
Some cleanup.
429
        self.assertFileEqual('''\
430
<<<<<<< TREE
431
lightweight local changes
432
=======
433
checkout
434
>>>>>>> MERGE-SOURCE
435
''',
4985.3.10 by Gerard Krol
Reformat long lines
436
                             'lightweight/file')
4985.3.17 by Vincent Ladeuil
Some cleanup.
437
4985.3.1 by Gerard Krol
Werkt wel ok
438
        # resolve it
4985.3.10 by Gerard Krol
Reformat long lines
439
        self.build_tree_contents([('lightweight/file',
4985.3.17 by Vincent Ladeuil
Some cleanup.
440
                                   'lightweight+checkout\n')])
441
        self.run_bzr('resolve lightweight/file')
4985.3.1 by Gerard Krol
Werkt wel ok
442
4985.3.9 by Gerard Krol
Use assertFileEqual in the tests, instead of opening them and looking at the contents. TODO: check if this does work on Windows (due to possible \r\n line endings)?
443
        # check we get the second conflict
4985.3.1 by Gerard Krol
Werkt wel ok
444
        out, err = self.run_bzr('update lightweight', retcode=1)
445
        self.assertEqual('', out)
5053.1.1 by Martin Pool
Merge 2.1 back to trunk
446
        # NB: these conflicts are actually in the source code
4985.3.17 by Vincent Ladeuil
Some cleanup.
447
        self.assertFileEqual('''\
448
<<<<<<< TREE
449
lightweight+checkout
450
=======
451
master
452
>>>>>>> MERGE-SOURCE
453
''',
4985.3.10 by Gerard Krol
Reformat long lines
454
                             'lightweight/file')
6178.1.1 by Martin Pool
'bzr update' makes it clear it will only upgrade the whole tree
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 ...
6178.1.3 by Martin Pool
'update' with no arguments from a tree subdirectory now works and is tested (thanks vila)
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 ...
6178.1.1 by Martin Pool
'bzr update' makes it clear it will only upgrade the whole tree
482
            ''')