/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
6404.6.1 by Vincent Ladeuil
Tests passing for a first rough version of a cached branch config store. The changes here are too invasive and several parallel proposals have been made.
1
# Copyright (C) 2007-2012 Canonical Ltd
2999.1.4 by Ian Clatworthy
more review tweaks including commit of blackbox tests
2
# -*- coding: utf-8 -*-
3
#
4
# This program is free software; you can redistribute it and/or modify
5
# it under the terms of the GNU General Public License as published by
6
# the Free Software Foundation; either version 2 of the License, or
7
# (at your option) any later version.
8
#
9
# This program is distributed in the hope that it will be useful,
10
# but WITHOUT ANY WARRANTY; without even the implied warranty of
11
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12
# GNU General Public License for more details.
13
#
14
# You should have received a copy of the GNU General Public License
15
# along with this program; if not, write to the Free Software
4183.7.1 by Sabin Iacob
update FSF mailing address
16
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
2999.1.4 by Ian Clatworthy
more review tweaks including commit of blackbox tests
17
18
19
"""Tests for the switch command of bzr."""
20
21
import os
22
6472.2.2 by Jelmer Vernooij
Use controldir rather than bzrdir in a couple more places.
23
from bzrlib.controldir import ControlDir
5816.6.7 by A. S. Budden
Moved test harnesses into test_switch and test_branch as these are the commands that are being tested.
24
from bzrlib import (
6472.2.2 by Jelmer Vernooij
Use controldir rather than bzrdir in a couple more places.
25
    osutils,
26
    urlutils,
27
    branch,
28
    )
3565.6.7 by Marius Kruger
* checkouts now use master nick when no explicit nick is set.
29
from bzrlib.workingtree import WorkingTree
5816.6.7 by A. S. Budden
Moved test harnesses into test_switch and test_branch as these are the commands that are being tested.
30
from bzrlib.tests import (
6472.2.2 by Jelmer Vernooij
Use controldir rather than bzrdir in a couple more places.
31
    TestCaseWithTransport,
32
    script,
33
    )
5268.8.18 by Jelmer Vernooij
Use UnicodeFilenameFeature.
34
from bzrlib.tests.features import UnicodeFilenameFeature
4879.2.1 by Neil Martinsen-Burrell
switch should use directory services when creating a branch
35
from bzrlib.directory_service import directories
2999.1.4 by Ian Clatworthy
more review tweaks including commit of blackbox tests
36
6366.1.5 by Jelmer Vernooij
add test for hpss call / connection count of 'bzr switch'.
37
from bzrlib.tests.matchers import ContainsNoVfsCalls
38
5816.6.15 by A. S. Budden
Added erroneously removed blank line.
39
5283.4.5 by Martin Pool
Update remaining subclasses of ExternalBase
40
class TestSwitch(TestCaseWithTransport):
2999.1.4 by Ian Clatworthy
more review tweaks including commit of blackbox tests
41
3984.5.14 by Daniel Watkins
Extracted common setup code.
42
    def _create_sample_tree(self):
43
        tree = self.make_branch_and_tree('branch-1')
44
        self.build_tree(['branch-1/file-1', 'branch-1/file-2'])
45
        tree.add('file-1')
46
        tree.commit('rev1')
47
        tree.add('file-2')
48
        tree.commit('rev2')
49
        return tree
50
2999.1.4 by Ian Clatworthy
more review tweaks including commit of blackbox tests
51
    def test_switch_up_to_date_light_checkout(self):
52
        self.make_branch_and_tree('branch')
53
        self.run_bzr('branch branch branch2')
54
        self.run_bzr('checkout --lightweight branch checkout')
55
        os.chdir('checkout')
56
        out, err = self.run_bzr('switch ../branch2')
57
        self.assertContainsRe(err, 'Tree is up to date at revision 0.\n')
58
        self.assertContainsRe(err, 'Switched to branch: .*/branch2.\n')
59
        self.assertEqual('', out)
60
61
    def test_switch_out_of_date_light_checkout(self):
62
        self.make_branch_and_tree('branch')
63
        self.run_bzr('branch branch branch2')
64
        self.build_tree(['branch2/file'])
65
        self.run_bzr('add branch2/file')
66
        self.run_bzr('commit -m add-file branch2')
67
        self.run_bzr('checkout --lightweight branch checkout')
68
        os.chdir('checkout')
69
        out, err = self.run_bzr('switch ../branch2')
70
        #self.assertContainsRe(err, '\+N  file')
71
        self.assertContainsRe(err, 'Updated to revision 1.\n')
72
        self.assertContainsRe(err, 'Switched to branch: .*/branch2.\n')
73
        self.assertEqual('', out)
3246.5.1 by Robert Collins
* ``bzr switch`` will attempt to find branches to switch to relative to the
74
3565.6.7 by Marius Kruger
* checkouts now use master nick when no explicit nick is set.
75
    def _test_switch_nick(self, lightweight):
76
        """Check that the nick gets switched too."""
77
        tree1 = self.make_branch_and_tree('branch1')
78
        tree2 = self.make_branch_and_tree('branch2')
79
        tree2.pull(tree1.branch)
80
        checkout =  tree1.branch.create_checkout('checkout',
81
            lightweight=lightweight)
82
        self.assertEqual(checkout.branch.nick, tree1.branch.nick)
83
        self.assertEqual(checkout.branch.get_config().has_explicit_nickname(),
84
            False)
85
        self.run_bzr('switch branch2', working_dir='checkout')
86
87
        # we need to get the tree again, otherwise we don't get the new branch
88
        checkout = WorkingTree.open('checkout')
89
        self.assertEqual(checkout.branch.nick, tree2.branch.nick)
90
        self.assertEqual(checkout.branch.get_config().has_explicit_nickname(),
91
            False)
92
3565.6.1 by Marius Kruger
Let 'bzr switch' update the nick too.
93
    def test_switch_nick(self):
3565.6.7 by Marius Kruger
* checkouts now use master nick when no explicit nick is set.
94
        self._test_switch_nick(lightweight=False)
95
96
    def test_switch_nick_lightweight(self):
97
        self._test_switch_nick(lightweight=True)
98
99
    def _test_switch_explicit_nick(self, lightweight):
3565.6.1 by Marius Kruger
Let 'bzr switch' update the nick too.
100
        """Check that the nick gets switched too."""
101
        tree1 = self.make_branch_and_tree('branch1')
102
        tree2 = self.make_branch_and_tree('branch2')
103
        tree2.pull(tree1.branch)
3565.6.7 by Marius Kruger
* checkouts now use master nick when no explicit nick is set.
104
        checkout =  tree1.branch.create_checkout('checkout',
105
            lightweight=lightweight)
106
        self.assertEqual(checkout.branch.nick, tree1.branch.nick)
107
        checkout.branch.nick = "explicit_nick"
108
        self.assertEqual(checkout.branch.nick, "explicit_nick")
109
        self.assertEqual(checkout.branch.get_config()._get_explicit_nickname(),
110
            "explicit_nick")
111
        self.run_bzr('switch branch2', working_dir='checkout')
112
113
        # we need to get the tree again, otherwise we don't get the new branch
114
        checkout = WorkingTree.open('checkout')
115
        self.assertEqual(checkout.branch.nick, tree2.branch.nick)
116
        self.assertEqual(checkout.branch.get_config()._get_explicit_nickname(),
117
            tree2.branch.nick)
118
119
    def test_switch_explicit_nick(self):
120
        self._test_switch_explicit_nick(lightweight=False)
121
122
    def test_switch_explicit_nick_lightweight(self):
123
        self._test_switch_explicit_nick(lightweight=True)
3565.6.1 by Marius Kruger
Let 'bzr switch' update the nick too.
124
3246.5.1 by Robert Collins
* ``bzr switch`` will attempt to find branches to switch to relative to the
125
    def test_switch_finds_relative_branch(self):
3565.6.1 by Marius Kruger
Let 'bzr switch' update the nick too.
126
        """Switch will find 'foo' relative to the branch the checkout is of."""
3246.5.1 by Robert Collins
* ``bzr switch`` will attempt to find branches to switch to relative to the
127
        self.build_tree(['repo/'])
128
        tree1 = self.make_branch_and_tree('repo/brancha')
129
        tree1.commit('foo')
130
        tree2 = self.make_branch_and_tree('repo/branchb')
131
        tree2.pull(tree1.branch)
132
        branchb_id = tree2.commit('bar')
133
        checkout =  tree1.branch.create_checkout('checkout', lightweight=True)
134
        self.run_bzr(['switch', 'branchb'], working_dir='checkout')
135
        self.assertEqual(branchb_id, checkout.last_revision())
136
        checkout = checkout.bzrdir.open_workingtree()
137
        self.assertEqual(tree2.branch.base, checkout.branch.base)
3602.3.1 by Adrian Wilkins
Test that `bzr switch` finds the sibling of the bound branch of heavy checkout.
138
139
    def test_switch_finds_relative_bound_branch(self):
3602.3.4 by Adrian Wilkins
Improved comments and documentation
140
        """Using switch on a heavy checkout should find master sibling
141
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
142
        The behaviour of lighweight and heavy checkouts should be
5816.6.1 by A. S. Budden
Test harness to stimulate Bug #513709: parent being set incorrectly in switch --create-branch.
143
        consistent when using the convenient "switch to sibling" feature
3602.3.4 by Adrian Wilkins
Improved comments and documentation
144
        Both should switch to a sibling of the branch
145
        they are bound to, and not a sibling of themself"""
146
3602.3.1 by Adrian Wilkins
Test that `bzr switch` finds the sibling of the bound branch of heavy checkout.
147
        self.build_tree(['repo/',
148
                         'heavyco/'])
149
        tree1 = self.make_branch_and_tree('repo/brancha')
150
        tree1.commit('foo')
151
        tree2 = self.make_branch_and_tree('repo/branchb')
152
        tree2.pull(tree1.branch)
153
        branchb_id = tree2.commit('bar')
154
        checkout = tree1.branch.create_checkout('heavyco/a', lightweight=False)
155
        self.run_bzr(['switch', 'branchb'], working_dir='heavyco/a')
6404.6.6 by Vincent Ladeuil
Use idioms coherently and add comments to make their purpose clearer.
156
        # Refresh checkout as 'switch' modified it
157
        checkout = checkout.bzrdir.open_workingtree()
3602.3.1 by Adrian Wilkins
Test that `bzr switch` finds the sibling of the bound branch of heavy checkout.
158
        self.assertEqual(branchb_id, checkout.last_revision())
6404.6.1 by Vincent Ladeuil
Tests passing for a first rough version of a cached branch config store. The changes here are too invasive and several parallel proposals have been made.
159
        self.assertEqual(tree2.branch.base,
160
                         checkout.branch.get_bound_location())
4354.2.2 by Aaron Bentley
Enable switch --force for lightweight checkouts after moves.
161
5268.8.15 by Jelmer Vernooij
Fix switching to unicode branch names.
162
    def test_switch_finds_relative_unicode_branch(self):
163
        """Switch will find 'foo' relative to the branch the checkout is of."""
5268.8.18 by Jelmer Vernooij
Use UnicodeFilenameFeature.
164
        self.requireFeature(UnicodeFilenameFeature)
5268.8.15 by Jelmer Vernooij
Fix switching to unicode branch names.
165
        self.build_tree(['repo/'])
166
        tree1 = self.make_branch_and_tree('repo/brancha')
167
        tree1.commit('foo')
168
        tree2 = self.make_branch_and_tree(u'repo/branch\xe9')
169
        tree2.pull(tree1.branch)
170
        branchb_id = tree2.commit('bar')
171
        checkout =  tree1.branch.create_checkout('checkout', lightweight=True)
172
        self.run_bzr(['switch', u'branch\xe9'], working_dir='checkout')
173
        self.assertEqual(branchb_id, checkout.last_revision())
174
        checkout = checkout.bzrdir.open_workingtree()
175
        self.assertEqual(tree2.branch.base, checkout.branch.base)
176
177
    def test_switch_finds_relative_unicode_branch(self):
178
        """Switch will find 'foo' relative to the branch the checkout is of."""
5268.8.18 by Jelmer Vernooij
Use UnicodeFilenameFeature.
179
        self.requireFeature(UnicodeFilenameFeature)
5268.8.15 by Jelmer Vernooij
Fix switching to unicode branch names.
180
        self.build_tree(['repo/'])
181
        tree1 = self.make_branch_and_tree('repo/brancha')
182
        tree1.commit('foo')
183
        tree2 = self.make_branch_and_tree(u'repo/branch\xe9')
184
        tree2.pull(tree1.branch)
185
        branchb_id = tree2.commit('bar')
186
        checkout =  tree1.branch.create_checkout('checkout', lightweight=True)
187
        self.run_bzr(['switch', u'branch\xe9'], working_dir='checkout')
188
        self.assertEqual(branchb_id, checkout.last_revision())
189
        checkout = checkout.bzrdir.open_workingtree()
190
        self.assertEqual(tree2.branch.base, checkout.branch.base)
191
3984.5.2 by Daniel Watkins
Added blackbox test.
192
    def test_switch_revision(self):
3984.5.14 by Daniel Watkins
Extracted common setup code.
193
        tree = self._create_sample_tree()
3984.5.2 by Daniel Watkins
Added blackbox test.
194
        checkout = tree.branch.create_checkout('checkout', lightweight=True)
195
        self.run_bzr(['switch', 'branch-1', '-r1'], working_dir='checkout')
5784.1.3 by Martin Pool
Switch away from using failUnlessExists and failIfExists
196
        self.assertPathExists('checkout/file-1')
197
        self.assertPathDoesNotExist('checkout/file-2')
3984.5.9 by Daniel Watkins
Added test for allowing only revisions to be passed to switch.
198
6437.7.5 by Jelmer Vernooij
"bzr switch -b" in a standalone tree will now create a colocated branch.
199
    def test_switch_into_colocated(self):
200
        # Create a new colocated branch from an existing non-colocated branch.
201
        tree = self.make_branch_and_tree('.', format='development-colo')
202
        self.build_tree(['file-1', 'file-2'])
203
        tree.add('file-1')
204
        revid1 = tree.commit('rev1')
205
        tree.add('file-2')
206
        revid2 = tree.commit('rev2')
207
        self.run_bzr(['switch', '-b', 'anotherbranch'])
208
        self.assertEquals(
6437.30.1 by Wouter van Heyst
Stop depending on the particular CPython ordering of dictionary keys when testing the result of BzrDir.get_branches.
209
            set(['', 'anotherbranch']),
210
            set(tree.branch.bzrdir.get_branches().keys()))
6437.7.5 by Jelmer Vernooij
"bzr switch -b" in a standalone tree will now create a colocated branch.
211
6437.7.6 by Jelmer Vernooij
Add test for --force argument used in standalone branch.
212
    def test_switch_into_unrelated_colocated(self):
213
        # Create a new colocated branch from an existing non-colocated branch.
214
        tree = self.make_branch_and_tree('.', format='development-colo')
215
        self.build_tree(['file-1', 'file-2'])
216
        tree.add('file-1')
217
        revid1 = tree.commit('rev1')
218
        tree.add('file-2')
219
        revid2 = tree.commit('rev2')
220
        tree.bzrdir.create_branch(name='foo')
221
        self.run_bzr_error(['Cannot switch a branch, only a checkout.'],
222
            'switch foo')
223
        self.run_bzr(['switch', '--force', 'foo'])
224
5268.8.12 by Jelmer Vernooij
support creating new colocated branches from 'bzr switch -b'.
225
    def test_switch_existing_colocated(self):
5268.8.6 by Jelmer Vernooij
More fixes to test.
226
        # Create a branch branch-1 that initially is a checkout of 'foo'
227
        # Use switch to change it to 'anotherbranch'
228
        repo = self.make_repository('branch-1', format='development-colo')
229
        target_branch = repo.bzrdir.create_branch(name='foo')
6437.7.3 by Jelmer Vernooij
Use ControlDir.set_branch_reference.
230
        repo.bzrdir.set_branch_reference(target_branch)
5268.8.6 by Jelmer Vernooij
More fixes to test.
231
        tree = repo.bzrdir.create_workingtree()
5268.8.5 by Jelmer Vernooij
Add tests for switching to colocated branches.
232
        self.build_tree(['branch-1/file-1', 'branch-1/file-2'])
233
        tree.add('file-1')
234
        revid1 = tree.commit('rev1')
235
        tree.add('file-2')
236
        revid2 = tree.commit('rev2')
5268.8.6 by Jelmer Vernooij
More fixes to test.
237
        otherbranch = tree.bzrdir.create_branch(name='anotherbranch')
5268.8.5 by Jelmer Vernooij
Add tests for switching to colocated branches.
238
        otherbranch.generate_revision_history(revid1)
239
        self.run_bzr(['switch', 'anotherbranch'], working_dir='branch-1')
5268.8.10 by Jelmer Vernooij
bzr switch can now switch to colocated branches.
240
        tree = WorkingTree.open("branch-1")
5268.8.5 by Jelmer Vernooij
Add tests for switching to colocated branches.
241
        self.assertEquals(tree.last_revision(), revid1)
5268.8.10 by Jelmer Vernooij
bzr switch can now switch to colocated branches.
242
        self.assertEquals(tree.branch.control_url, otherbranch.control_url)
5268.8.5 by Jelmer Vernooij
Add tests for switching to colocated branches.
243
5268.8.12 by Jelmer Vernooij
support creating new colocated branches from 'bzr switch -b'.
244
    def test_switch_new_colocated(self):
245
        # Create a branch branch-1 that initially is a checkout of 'foo'
246
        # Use switch to create 'anotherbranch' which derives from that
247
        repo = self.make_repository('branch-1', format='development-colo')
248
        target_branch = repo.bzrdir.create_branch(name='foo')
6437.7.3 by Jelmer Vernooij
Use ControlDir.set_branch_reference.
249
        repo.bzrdir.set_branch_reference(target_branch)
5268.8.12 by Jelmer Vernooij
support creating new colocated branches from 'bzr switch -b'.
250
        tree = repo.bzrdir.create_workingtree()
251
        self.build_tree(['branch-1/file-1', 'branch-1/file-2'])
252
        tree.add('file-1')
253
        revid1 = tree.commit('rev1')
254
        self.run_bzr(['switch', '-b', 'anotherbranch'], working_dir='branch-1')
6472.2.2 by Jelmer Vernooij
Use controldir rather than bzrdir in a couple more places.
255
        bzrdir = ControlDir.open("branch-1")
5268.8.12 by Jelmer Vernooij
support creating new colocated branches from 'bzr switch -b'.
256
        self.assertEquals(
257
            set([b.name for b in bzrdir.list_branches()]),
258
            set(["foo", "anotherbranch"]))
259
        self.assertEquals(bzrdir.open_branch().name, "anotherbranch")
260
        self.assertEquals(bzrdir.open_branch().last_revision(), revid1)
261
5268.8.17 by Jelmer Vernooij
Support switching to new unicode colocated branch.
262
    def test_switch_new_colocated_unicode(self):
263
        # Create a branch branch-1 that initially is a checkout of 'foo'
264
        # Use switch to create 'branch\xe9' which derives from that
5268.8.18 by Jelmer Vernooij
Use UnicodeFilenameFeature.
265
        self.requireFeature(UnicodeFilenameFeature)
5268.8.17 by Jelmer Vernooij
Support switching to new unicode colocated branch.
266
        repo = self.make_repository('branch-1', format='development-colo')
267
        target_branch = repo.bzrdir.create_branch(name='foo')
6437.7.3 by Jelmer Vernooij
Use ControlDir.set_branch_reference.
268
        repo.bzrdir.set_branch_reference(target_branch)
5268.8.17 by Jelmer Vernooij
Support switching to new unicode colocated branch.
269
        tree = repo.bzrdir.create_workingtree()
270
        self.build_tree(['branch-1/file-1', 'branch-1/file-2'])
271
        tree.add('file-1')
272
        revid1 = tree.commit('rev1')
273
        self.run_bzr(['switch', '-b', u'branch\xe9'], working_dir='branch-1')
6472.2.2 by Jelmer Vernooij
Use controldir rather than bzrdir in a couple more places.
274
        bzrdir = ControlDir.open("branch-1")
5268.8.17 by Jelmer Vernooij
Support switching to new unicode colocated branch.
275
        self.assertEquals(
276
            set([b.name for b in bzrdir.list_branches()]),
277
            set(["foo", u"branch\xe9"]))
278
        self.assertEquals(bzrdir.open_branch().name, u"branch\xe9")
279
        self.assertEquals(bzrdir.open_branch().last_revision(), revid1)
280
3984.5.9 by Daniel Watkins
Added test for allowing only revisions to be passed to switch.
281
    def test_switch_only_revision(self):
3984.5.14 by Daniel Watkins
Extracted common setup code.
282
        tree = self._create_sample_tree()
3984.5.9 by Daniel Watkins
Added test for allowing only revisions to be passed to switch.
283
        checkout = tree.branch.create_checkout('checkout', lightweight=True)
5784.1.3 by Martin Pool
Switch away from using failUnlessExists and failIfExists
284
        self.assertPathExists('checkout/file-1')
285
        self.assertPathExists('checkout/file-2')
3984.5.9 by Daniel Watkins
Added test for allowing only revisions to be passed to switch.
286
        self.run_bzr(['switch', '-r1'], working_dir='checkout')
5784.1.3 by Martin Pool
Switch away from using failUnlessExists and failIfExists
287
        self.assertPathExists('checkout/file-1')
288
        self.assertPathDoesNotExist('checkout/file-2')
3984.5.15 by Daniel Watkins
Add to test to ensure that we don't accept a range of revisions.
289
        # Check that we don't accept a range
3984.5.17 by Daniel Watkins
Fixed incorrect call of run_bzr_error.
290
        self.run_bzr_error(
291
            ['bzr switch --revision takes exactly one revision identifier'],
292
            ['switch', '-r0..2'], working_dir='checkout')
3984.5.19 by Andrew Bennetts
Merge lp:bzr, resolving conflicts.
293
4354.2.2 by Aaron Bentley
Enable switch --force for lightweight checkouts after moves.
294
    def prepare_lightweight_switch(self):
295
        branch = self.make_branch('branch')
296
        branch.create_checkout('tree', lightweight=True)
5186.2.2 by Martin Pool
wrap os.rename to insert the source and destination filenames in any exception that may be raised
297
        osutils.rename('branch', 'branch1')
4354.2.2 by Aaron Bentley
Enable switch --force for lightweight checkouts after moves.
298
299
    def test_switch_lightweight_after_branch_moved(self):
300
        self.prepare_lightweight_switch()
301
        self.run_bzr('switch --force ../branch1', working_dir='tree')
302
        branch_location = WorkingTree.open('tree').branch.base
303
        self.assertEndsWith(branch_location, 'branch1/')
304
305
    def test_switch_lightweight_after_branch_moved_relative(self):
306
        self.prepare_lightweight_switch()
307
        self.run_bzr('switch --force branch1', working_dir='tree')
308
        branch_location = WorkingTree.open('tree').branch.base
309
        self.assertEndsWith(branch_location, 'branch1/')
4520.1.1 by John Arbash Meinel
'bzr switch -b' can now be used to create the branch while you switch to it.
310
311
    def test_create_branch_no_branch(self):
312
        self.prepare_lightweight_switch()
313
        self.run_bzr_error(['cannot create branch without source branch'],
314
            'switch --create-branch ../branch2', working_dir='tree')
315
316
    def test_create_branch(self):
317
        branch = self.make_branch('branch')
318
        tree = branch.create_checkout('tree', lightweight=True)
319
        tree.commit('one', rev_id='rev-1')
320
        self.run_bzr('switch --create-branch ../branch2', working_dir='tree')
321
        tree = WorkingTree.open('tree')
322
        self.assertEndsWith(tree.branch.base, '/branch2/')
323
324
    def test_create_branch_local(self):
325
        branch = self.make_branch('branch')
326
        tree = branch.create_checkout('tree', lightweight=True)
327
        tree.commit('one', rev_id='rev-1')
328
        self.run_bzr('switch --create-branch branch2', working_dir='tree')
329
        tree = WorkingTree.open('tree')
330
        # The new branch should have been created at the same level as
331
        # 'branch', because we did not have a '/' segment
332
        self.assertEqual(branch.base[:-1] + '2/', tree.branch.base)
333
334
    def test_create_branch_short_name(self):
335
        branch = self.make_branch('branch')
336
        tree = branch.create_checkout('tree', lightweight=True)
337
        tree.commit('one', rev_id='rev-1')
338
        self.run_bzr('switch -b branch2', working_dir='tree')
339
        tree = WorkingTree.open('tree')
340
        # The new branch should have been created at the same level as
341
        # 'branch', because we did not have a '/' segment
342
        self.assertEqual(branch.base[:-1] + '2/', tree.branch.base)
4879.2.1 by Neil Martinsen-Burrell
switch should use directory services when creating a branch
343
344
    def test_create_branch_directory_services(self):
345
        branch = self.make_branch('branch')
346
        tree = branch.create_checkout('tree', lightweight=True)
347
        class FooLookup(object):
348
            def look_up(self, name, url):
349
                return 'foo-'+name
350
        directories.register('foo:', FooLookup, 'Create branches named foo-')
4879.2.2 by Neil Martinsen-Burrell
add test cleanup per JAMs review
351
        self.addCleanup(directories.remove, 'foo:')
4879.2.1 by Neil Martinsen-Burrell
switch should use directory services when creating a branch
352
        self.run_bzr('switch -b foo:branch2', working_dir='tree')
353
        tree = WorkingTree.open('tree')
354
        self.assertEndsWith(tree.branch.base, 'foo-branch2/')
5107.3.6 by Marco Pantaleoni
Documented behaviour of 'post_branch_init' for lightweight checkouts.
355
356
    def test_switch_with_post_switch_hook(self):
357
        from bzrlib import branch as _mod_branch
358
        calls = []
359
        _mod_branch.Branch.hooks.install_named_hook('post_switch',
360
            calls.append, None)
361
        self.make_branch_and_tree('branch')
362
        self.run_bzr('branch branch branch2')
363
        self.run_bzr('checkout branch checkout')
364
        os.chdir('checkout')
365
        self.assertLength(0, calls)
366
        out, err = self.run_bzr('switch ../branch2')
367
        self.assertLength(1, calls)
368
369
    def test_switch_lightweight_co_with_post_switch_hook(self):
370
        from bzrlib import branch as _mod_branch
371
        calls = []
372
        _mod_branch.Branch.hooks.install_named_hook('post_switch',
373
            calls.append, None)
374
        self.make_branch_and_tree('branch')
375
        self.run_bzr('branch branch branch2')
376
        self.run_bzr('checkout --lightweight branch checkout')
377
        os.chdir('checkout')
378
        self.assertLength(0, calls)
379
        out, err = self.run_bzr('switch ../branch2')
380
        self.assertLength(1, calls)
5171.3.13 by Martin von Gagern
Add --directory option to 7 more commands.
381
382
    def test_switch_lightweight_directory(self):
383
        """Test --directory option"""
384
385
        # create a source branch
386
        a_tree = self.make_branch_and_tree('a')
387
        self.build_tree_contents([('a/a', 'initial\n')])
388
        a_tree.add('a')
389
        a_tree.commit(message='initial')
390
391
        # clone and add a differing revision
392
        b_tree = a_tree.bzrdir.sprout('b').open_workingtree()
393
        self.build_tree_contents([('b/a', 'initial\nmore\n')])
394
        b_tree.commit(message='more')
395
396
        self.run_bzr('checkout --lightweight a checkout')
397
        self.run_bzr('switch --directory checkout b')
398
        self.assertFileEqual('initial\nmore\n', 'checkout/a')
5816.6.7 by A. S. Budden
Moved test harnesses into test_switch and test_branch as these are the commands that are being tested.
399
6015.7.2 by John Arbash Meinel
Bug #812285. Add an effort test to show that things have improved.
400
5816.7.1 by Vincent Ladeuil
Remove duplication and simplify.
401
class TestSwitchParentLocationBase(TestCaseWithTransport):
5816.6.7 by A. S. Budden
Moved test harnesses into test_switch and test_branch as these are the commands that are being tested.
402
403
    def setUp(self):
404
        """Set up a repository and branch ready for testing."""
5816.7.1 by Vincent Ladeuil
Remove duplication and simplify.
405
        super(TestSwitchParentLocationBase, self).setUp()
5816.6.7 by A. S. Budden
Moved test harnesses into test_switch and test_branch as these are the commands that are being tested.
406
        self.script_runner = script.ScriptRunner()
407
        self.script_runner.run_script(self, '''
408
                $ bzr init-repo --no-trees repo
409
                Shared repository...
410
                Location:
411
                  shared repository: repo
412
                $ bzr init repo/trunk
413
                Created a repository branch...
414
                Using shared repository: ...
415
                ''')
416
5816.7.1 by Vincent Ladeuil
Remove duplication and simplify.
417
    def assertParent(self, expected_parent, branch):
5816.6.11 by A. S. Budden
Refactored assertParentCorrect to check the full path.
418
        """Verify that the parent is not None and is set correctly."""
419
        actual_parent = branch.get_parent()
5816.7.1 by Vincent Ladeuil
Remove duplication and simplify.
420
        self.assertIsSameRealPath(urlutils.local_path_to_url(expected_parent),
421
                                  branch.get_parent())
422
423
424
class TestSwitchParentLocation(TestSwitchParentLocationBase):
425
426
    def _checkout_and_switch(self, option=''):
5816.6.8 by A. S. Budden
Refactored to use common generation code for lightweight and heavyweight.
427
        self.script_runner.run_script(self, '''
5816.7.1 by Vincent Ladeuil
Remove duplication and simplify.
428
                $ bzr checkout %(option)s repo/trunk checkout
429
                $ cd checkout
430
                $ bzr switch --create-branch switched
5816.6.8 by A. S. Budden
Refactored to use common generation code for lightweight and heavyweight.
431
                2>Tree is up to date at revision 0.
5816.7.1 by Vincent Ladeuil
Remove duplication and simplify.
432
                2>Switched to branch:...switched...
5816.6.11 by A. S. Budden
Refactored assertParentCorrect to check the full path.
433
                $ cd ..
5816.6.9 by A. S. Budden
Use locals() instead of kwargs so that parameters are more explicit.
434
                ''' % locals())
5816.7.1 by Vincent Ladeuil
Remove duplication and simplify.
435
        bound_branch = branch.Branch.open_containing('checkout')[0]
436
        master_branch = branch.Branch.open_containing('repo/switched')[0]
5816.6.12 by A. S. Budden
Check parent branch of both the checkout (light or heavy) and the branch to which it is connected.
437
        return (bound_branch, master_branch)
5816.6.8 by A. S. Budden
Refactored to use common generation code for lightweight and heavyweight.
438
5816.6.7 by A. S. Budden
Moved test harnesses into test_switch and test_branch as these are the commands that are being tested.
439
    def test_switch_parent_lightweight(self):
5816.7.1 by Vincent Ladeuil
Remove duplication and simplify.
440
        """Lightweight checkout using bzr switch."""
441
        bb, mb = self._checkout_and_switch(option='--lightweight')
442
        self.assertParent('repo/trunk', bb)
443
        self.assertParent('repo/trunk', mb)
5816.6.7 by A. S. Budden
Moved test harnesses into test_switch and test_branch as these are the commands that are being tested.
444
445
    def test_switch_parent_heavyweight(self):
5816.7.1 by Vincent Ladeuil
Remove duplication and simplify.
446
        """Heavyweight checkout using bzr switch."""
447
        bb, mb = self._checkout_and_switch()
448
        self.assertParent('repo/trunk', bb)
449
        self.assertParent('repo/trunk', mb)
5816.6.11 by A. S. Budden
Refactored assertParentCorrect to check the full path.
450
6015.7.2 by John Arbash Meinel
Bug #812285. Add an effort test to show that things have improved.
451
452
class TestSwitchDoesntOpenMasterBranch(TestCaseWithTransport):
453
    # See https://bugs.launchpad.net/bzr/+bug/812285
454
    # "bzr switch --create-branch" can point the new branch's parent to the
455
    # master branch, but it doesn't have to open it to do so.
456
457
    def test_switch_create_doesnt_open_master_branch(self):
458
        master = self.make_branch_and_tree('master')
459
        master.commit('one')
460
        # Note: not a lightweight checkout
461
        checkout = master.branch.create_checkout('checkout')
462
        opened = []
463
        def open_hook(branch):
464
            # Just append the final directory of the branch
465
            name = branch.base.rstrip('/').rsplit('/', 1)[1]
466
            opened.append(name)
467
        branch.Branch.hooks.install_named_hook('open', open_hook,
468
                                               'open_hook_logger')
469
        self.run_bzr('switch --create-branch -d checkout feature')
470
        # We only open the master branch 1 time.
471
        # This test should be cleaner to write, but see bug:
472
        #  https://bugs.launchpad.net/bzr/+bug/812295
473
        self.assertEqual(1, opened.count('master'))
6366.1.5 by Jelmer Vernooij
add test for hpss call / connection count of 'bzr switch'.
474
475
476
class TestSmartServerSwitch(TestCaseWithTransport):
477
478
    def test_switch_lightweight(self):
479
        self.setup_smart_server_with_call_log()
480
        t = self.make_branch_and_tree('from')
481
        for count in range(9):
482
            t.commit(message='commit %d' % count)
483
        out, err = self.run_bzr(['checkout', '--lightweight', self.get_url('from'),
484
            'target'])
485
        self.reset_smart_call_log()
486
        self.run_bzr(['switch', self.get_url('from')], working_dir='target')
487
        # This figure represent the amount of work to perform this use case. It
488
        # is entirely ok to reduce this number if a test fails due to rpc_count
489
        # being too low. If rpc_count increases, more network roundtrips have
490
        # become necessary for this use case. Please do not adjust this number
491
        # upwards without agreement from bzr's network support maintainers.
6366.1.6 by Jelmer Vernooij
Merge bzr.dev.
492
        self.assertLength(24, self.hpss_calls)
6437.40.1 by Jelmer Vernooij
Support colocated branches in 'bzr rmbranch'.
493
        self.assertLength(4, self.hpss_connections)
6366.1.5 by Jelmer Vernooij
add test for hpss call / connection count of 'bzr switch'.
494
        self.assertThat(self.hpss_calls, ContainsNoVfsCalls)