~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

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

Turn completion assertions into separate methods.

Many common assertions used to be expressed as arguments to the complete
method.  This makes the checks more explicit, and the code easier to read.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2006-2011 Canonical Ltd
2
 
#
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.
7
 
#
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.
12
 
#
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
15
 
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
16
 
 
17
 
 
18
 
"""Black-box tests for bzr branch."""
19
 
 
20
 
import os
21
 
 
22
 
from bzrlib import (
23
 
    branch,
24
 
    bzrdir,
25
 
    errors,
26
 
    revision as _mod_revision,
27
 
    )
28
 
from bzrlib.repofmt.knitrepo import RepositoryFormatKnit1
29
 
from bzrlib.tests import TestCaseWithTransport
30
 
from bzrlib.tests import (
31
 
    fixtures,
32
 
    HardlinkFeature,
33
 
    script,
34
 
    test_server,
35
 
    )
36
 
from bzrlib.tests.blackbox import test_switch
37
 
from bzrlib.tests.test_sftp_transport import TestCaseWithSFTPServer
38
 
from bzrlib.tests.script import run_script
39
 
from bzrlib.urlutils import local_path_to_url, strip_trailing_slash
40
 
from bzrlib.workingtree import WorkingTree
41
 
 
42
 
 
43
 
class TestBranch(TestCaseWithTransport):
44
 
 
45
 
    def example_branch(self, path='.'):
46
 
        tree = self.make_branch_and_tree(path)
47
 
        self.build_tree_contents([(path + '/hello', 'foo')])
48
 
        tree.add('hello')
49
 
        tree.commit(message='setup')
50
 
        self.build_tree_contents([(path + '/goodbye', 'baz')])
51
 
        tree.add('goodbye')
52
 
        tree.commit(message='setup')
53
 
 
54
 
    def test_branch(self):
55
 
        """Branch from one branch to another."""
56
 
        self.example_branch('a')
57
 
        self.run_bzr('branch a b')
58
 
        b = branch.Branch.open('b')
59
 
        self.run_bzr('branch a c -r 1')
60
 
        # previously was erroneously created by branching
61
 
        self.assertFalse(b._transport.has('branch-name'))
62
 
        b.bzrdir.open_workingtree().commit(message='foo', allow_pointless=True)
63
 
 
64
 
    def test_branch_broken_pack(self):
65
 
        """branching with a corrupted pack file."""
66
 
        self.example_branch('a')
67
 
        #now add some random corruption
68
 
        fname = 'a/.bzr/repository/packs/' + os.listdir('a/.bzr/repository/packs')[0]
69
 
        with open(fname, 'rb+') as f:
70
 
            f.seek(750)
71
 
            f.write("\xff")
72
 
        self.run_bzr_error(['Corruption while decompressing repository file'], 
73
 
                            'branch a b', retcode=3)
74
 
 
75
 
    def test_branch_switch_no_branch(self):
76
 
        # No branch in the current directory:
77
 
        #  => new branch will be created, but switch fails
78
 
        self.example_branch('a')
79
 
        self.make_repository('current')
80
 
        self.run_bzr_error(['No WorkingTree exists for'],
81
 
            'branch --switch ../a ../b', working_dir='current')
82
 
        a = branch.Branch.open('a')
83
 
        b = branch.Branch.open('b')
84
 
        self.assertEqual(a.last_revision(), b.last_revision())
85
 
 
86
 
    def test_branch_switch_no_wt(self):
87
 
        # No working tree in the current directory:
88
 
        #  => new branch will be created, but switch fails and the current
89
 
        #     branch is unmodified
90
 
        self.example_branch('a')
91
 
        self.make_branch('current')
92
 
        self.run_bzr_error(['No WorkingTree exists for'],
93
 
            'branch --switch ../a ../b', working_dir='current')
94
 
        a = branch.Branch.open('a')
95
 
        b = branch.Branch.open('b')
96
 
        self.assertEqual(a.last_revision(), b.last_revision())
97
 
        work = branch.Branch.open('current')
98
 
        self.assertEqual(work.last_revision(), _mod_revision.NULL_REVISION)
99
 
 
100
 
    def test_branch_switch_no_checkout(self):
101
 
        # Standalone branch in the current directory:
102
 
        #  => new branch will be created, but switch fails and the current
103
 
        #     branch is unmodified
104
 
        self.example_branch('a')
105
 
        self.make_branch_and_tree('current')
106
 
        self.run_bzr_error(['Cannot switch a branch, only a checkout'],
107
 
            'branch --switch ../a ../b', working_dir='current')
108
 
        a = branch.Branch.open('a')
109
 
        b = branch.Branch.open('b')
110
 
        self.assertEqual(a.last_revision(), b.last_revision())
111
 
        work = branch.Branch.open('current')
112
 
        self.assertEqual(work.last_revision(), _mod_revision.NULL_REVISION)
113
 
 
114
 
    def test_branch_switch_checkout(self):
115
 
        # Checkout in the current directory:
116
 
        #  => new branch will be created and checkout bound to the new branch
117
 
        self.example_branch('a')
118
 
        self.run_bzr('checkout a current')
119
 
        out, err = self.run_bzr('branch --switch ../a ../b', working_dir='current')
120
 
        a = branch.Branch.open('a')
121
 
        b = branch.Branch.open('b')
122
 
        self.assertEqual(a.last_revision(), b.last_revision())
123
 
        work = WorkingTree.open('current')
124
 
        self.assertEndsWith(work.branch.get_bound_location(), '/b/')
125
 
        self.assertContainsRe(err, "Switched to branch: .*/b/")
126
 
 
127
 
    def test_branch_switch_lightweight_checkout(self):
128
 
        # Lightweight checkout in the current directory:
129
 
        #  => new branch will be created and lightweight checkout pointed to
130
 
        #     the new branch
131
 
        self.example_branch('a')
132
 
        self.run_bzr('checkout --lightweight a current')
133
 
        out, err = self.run_bzr('branch --switch ../a ../b', working_dir='current')
134
 
        a = branch.Branch.open('a')
135
 
        b = branch.Branch.open('b')
136
 
        self.assertEqual(a.last_revision(), b.last_revision())
137
 
        work = WorkingTree.open('current')
138
 
        self.assertEndsWith(work.branch.base, '/b/')
139
 
        self.assertContainsRe(err, "Switched to branch: .*/b/")
140
 
 
141
 
    def test_branch_only_copies_history(self):
142
 
        # Knit branches should only push the history for the current revision.
143
 
        format = bzrdir.BzrDirMetaFormat1()
144
 
        format.repository_format = RepositoryFormatKnit1()
145
 
        shared_repo = self.make_repository('repo', format=format, shared=True)
146
 
        shared_repo.set_make_working_trees(True)
147
 
 
148
 
        def make_shared_tree(path):
149
 
            shared_repo.bzrdir.root_transport.mkdir(path)
150
 
            shared_repo.bzrdir.create_branch_convenience('repo/' + path)
151
 
            return WorkingTree.open('repo/' + path)
152
 
        tree_a = make_shared_tree('a')
153
 
        self.build_tree(['repo/a/file'])
154
 
        tree_a.add('file')
155
 
        tree_a.commit('commit a-1', rev_id='a-1')
156
 
        f = open('repo/a/file', 'ab')
157
 
        f.write('more stuff\n')
158
 
        f.close()
159
 
        tree_a.commit('commit a-2', rev_id='a-2')
160
 
 
161
 
        tree_b = make_shared_tree('b')
162
 
        self.build_tree(['repo/b/file'])
163
 
        tree_b.add('file')
164
 
        tree_b.commit('commit b-1', rev_id='b-1')
165
 
 
166
 
        self.assertTrue(shared_repo.has_revision('a-1'))
167
 
        self.assertTrue(shared_repo.has_revision('a-2'))
168
 
        self.assertTrue(shared_repo.has_revision('b-1'))
169
 
 
170
 
        # Now that we have a repository with shared files, make sure
171
 
        # that things aren't copied out by a 'branch'
172
 
        self.run_bzr('branch repo/b branch-b')
173
 
        pushed_tree = WorkingTree.open('branch-b')
174
 
        pushed_repo = pushed_tree.branch.repository
175
 
        self.assertFalse(pushed_repo.has_revision('a-1'))
176
 
        self.assertFalse(pushed_repo.has_revision('a-2'))
177
 
        self.assertTrue(pushed_repo.has_revision('b-1'))
178
 
 
179
 
    def test_branch_hardlink(self):
180
 
        self.requireFeature(HardlinkFeature)
181
 
        source = self.make_branch_and_tree('source')
182
 
        self.build_tree(['source/file1'])
183
 
        source.add('file1')
184
 
        source.commit('added file')
185
 
        out, err = self.run_bzr(['branch', 'source', 'target', '--hardlink'])
186
 
        source_stat = os.stat('source/file1')
187
 
        target_stat = os.stat('target/file1')
188
 
        self.assertEqual(source_stat, target_stat)
189
 
 
190
 
    def test_branch_files_from(self):
191
 
        source = self.make_branch_and_tree('source')
192
 
        self.build_tree(['source/file1'])
193
 
        source.add('file1')
194
 
        source.commit('added file')
195
 
        out, err = self.run_bzr('branch source target --files-from source')
196
 
        self.assertPathExists('target/file1')
197
 
 
198
 
    def test_branch_files_from_hardlink(self):
199
 
        self.requireFeature(HardlinkFeature)
200
 
        source = self.make_branch_and_tree('source')
201
 
        self.build_tree(['source/file1'])
202
 
        source.add('file1')
203
 
        source.commit('added file')
204
 
        source.bzrdir.sprout('second')
205
 
        out, err = self.run_bzr('branch source target --files-from second'
206
 
                                ' --hardlink')
207
 
        source_stat = os.stat('source/file1')
208
 
        second_stat = os.stat('second/file1')
209
 
        target_stat = os.stat('target/file1')
210
 
        self.assertNotEqual(source_stat, target_stat)
211
 
        self.assertEqual(second_stat, target_stat)
212
 
 
213
 
    def test_branch_standalone(self):
214
 
        shared_repo = self.make_repository('repo', shared=True)
215
 
        self.example_branch('source')
216
 
        self.run_bzr('branch --standalone source repo/target')
217
 
        b = branch.Branch.open('repo/target')
218
 
        expected_repo_path = os.path.abspath('repo/target/.bzr/repository')
219
 
        self.assertEqual(strip_trailing_slash(b.repository.base),
220
 
            strip_trailing_slash(local_path_to_url(expected_repo_path)))
221
 
 
222
 
    def test_branch_no_tree(self):
223
 
        self.example_branch('source')
224
 
        self.run_bzr('branch --no-tree source target')
225
 
        self.assertPathDoesNotExist('target/hello')
226
 
        self.assertPathDoesNotExist('target/goodbye')
227
 
 
228
 
    def test_branch_into_existing_dir(self):
229
 
        self.example_branch('a')
230
 
        # existing dir with similar files but no .bzr dir
231
 
        self.build_tree_contents([('b/',)])
232
 
        self.build_tree_contents([('b/hello', 'bar')])  # different content
233
 
        self.build_tree_contents([('b/goodbye', 'baz')])# same content
234
 
        # fails without --use-existing-dir
235
 
        out,err = self.run_bzr('branch a b', retcode=3)
236
 
        self.assertEqual('', out)
237
 
        self.assertEqual('bzr: ERROR: Target directory "b" already exists.\n',
238
 
            err)
239
 
        # force operation
240
 
        self.run_bzr('branch a b --use-existing-dir')
241
 
        # check conflicts
242
 
        self.assertPathExists('b/hello.moved')
243
 
        self.assertPathDoesNotExist('b/godbye.moved')
244
 
        # we can't branch into branch
245
 
        out,err = self.run_bzr('branch a b --use-existing-dir', retcode=3)
246
 
        self.assertEqual('', out)
247
 
        self.assertEqual('bzr: ERROR: Already a branch: "b".\n', err)
248
 
 
249
 
    def test_branch_bind(self):
250
 
        self.example_branch('a')
251
 
        out, err = self.run_bzr('branch a b --bind')
252
 
        self.assertEndsWith(err, "New branch bound to a\n")
253
 
        b = branch.Branch.open('b')
254
 
        self.assertEndsWith(b.get_bound_location(), '/a/')
255
 
 
256
 
    def test_branch_with_post_branch_init_hook(self):
257
 
        calls = []
258
 
        branch.Branch.hooks.install_named_hook('post_branch_init',
259
 
            calls.append, None)
260
 
        self.assertLength(0, calls)
261
 
        self.example_branch('a')
262
 
        self.assertLength(1, calls)
263
 
        self.run_bzr('branch a b')
264
 
        self.assertLength(2, calls)
265
 
 
266
 
    def test_checkout_with_post_branch_init_hook(self):
267
 
        calls = []
268
 
        branch.Branch.hooks.install_named_hook('post_branch_init',
269
 
            calls.append, None)
270
 
        self.assertLength(0, calls)
271
 
        self.example_branch('a')
272
 
        self.assertLength(1, calls)
273
 
        self.run_bzr('checkout a b')
274
 
        self.assertLength(2, calls)
275
 
 
276
 
    def test_lightweight_checkout_with_post_branch_init_hook(self):
277
 
        calls = []
278
 
        branch.Branch.hooks.install_named_hook('post_branch_init',
279
 
            calls.append, None)
280
 
        self.assertLength(0, calls)
281
 
        self.example_branch('a')
282
 
        self.assertLength(1, calls)
283
 
        self.run_bzr('checkout --lightweight a b')
284
 
        self.assertLength(2, calls)
285
 
 
286
 
    def test_branch_fetches_all_tags(self):
287
 
        builder = self.make_branch_builder('source')
288
 
        source = fixtures.build_branch_with_non_ancestral_rev(builder)
289
 
        source.tags.set_tag('tag-a', 'rev-2')
290
 
        # Now source has a tag not in its ancestry.  Make a branch from it.
291
 
        self.run_bzr('branch source new-branch')
292
 
        new_branch = branch.Branch.open('new-branch')
293
 
        # The tag is present, and so is its revision.
294
 
        self.assertEqual('rev-2', new_branch.tags.lookup_tag('tag-a'))
295
 
        new_branch.repository.get_revision('rev-2')
296
 
 
297
 
 
298
 
class TestBranchStacked(TestCaseWithTransport):
299
 
    """Tests for branch --stacked"""
300
 
 
301
 
    def assertRevisionInRepository(self, repo_path, revid):
302
 
        """Check that a revision is in a repository, disregarding stacking."""
303
 
        repo = bzrdir.BzrDir.open(repo_path).open_repository()
304
 
        self.assertTrue(repo.has_revision(revid))
305
 
 
306
 
    def assertRevisionNotInRepository(self, repo_path, revid):
307
 
        """Check that a revision is not in a repository, disregarding stacking."""
308
 
        repo = bzrdir.BzrDir.open(repo_path).open_repository()
309
 
        self.assertFalse(repo.has_revision(revid))
310
 
 
311
 
    def assertRevisionsInBranchRepository(self, revid_list, branch_path):
312
 
        repo = branch.Branch.open(branch_path).repository
313
 
        self.assertEqual(set(revid_list),
314
 
            repo.has_revisions(revid_list))
315
 
 
316
 
    def test_branch_stacked_branch_not_stacked(self):
317
 
        """Branching a stacked branch is not stacked by default"""
318
 
        # We have a mainline
319
 
        trunk_tree = self.make_branch_and_tree('target',
320
 
            format='1.9')
321
 
        trunk_tree.commit('mainline')
322
 
        # and a branch from it which is stacked
323
 
        branch_tree = self.make_branch_and_tree('branch',
324
 
            format='1.9')
325
 
        branch_tree.branch.set_stacked_on_url(trunk_tree.branch.base)
326
 
        # with some work on it
327
 
        work_tree = trunk_tree.branch.bzrdir.sprout('local').open_workingtree()
328
 
        work_tree.commit('moar work plz')
329
 
        work_tree.branch.push(branch_tree.branch)
330
 
        # branching our local branch gives us a new stacked branch pointing at
331
 
        # mainline.
332
 
        out, err = self.run_bzr(['branch', 'branch', 'newbranch'])
333
 
        self.assertEqual('', out)
334
 
        self.assertEqual('Branched 2 revision(s).\n',
335
 
            err)
336
 
        # it should have preserved the branch format, and so it should be
337
 
        # capable of supporting stacking, but not actually have a stacked_on
338
 
        # branch configured
339
 
        self.assertRaises(errors.NotStacked,
340
 
            bzrdir.BzrDir.open('newbranch').open_branch().get_stacked_on_url)
341
 
 
342
 
    def test_branch_stacked_branch_stacked(self):
343
 
        """Asking to stack on a stacked branch does work"""
344
 
        # We have a mainline
345
 
        trunk_tree = self.make_branch_and_tree('target',
346
 
            format='1.9')
347
 
        trunk_revid = trunk_tree.commit('mainline')
348
 
        # and a branch from it which is stacked
349
 
        branch_tree = self.make_branch_and_tree('branch',
350
 
            format='1.9')
351
 
        branch_tree.branch.set_stacked_on_url(trunk_tree.branch.base)
352
 
        # with some work on it
353
 
        work_tree = trunk_tree.branch.bzrdir.sprout('local').open_workingtree()
354
 
        branch_revid = work_tree.commit('moar work plz')
355
 
        work_tree.branch.push(branch_tree.branch)
356
 
        # you can chain branches on from there
357
 
        out, err = self.run_bzr(['branch', 'branch', '--stacked', 'branch2'])
358
 
        self.assertEqual('', out)
359
 
        self.assertEqual('Created new stacked branch referring to %s.\n' %
360
 
            branch_tree.branch.base, err)
361
 
        self.assertEqual(branch_tree.branch.base,
362
 
            branch.Branch.open('branch2').get_stacked_on_url())
363
 
        branch2_tree = WorkingTree.open('branch2')
364
 
        branch2_revid = work_tree.commit('work on second stacked branch')
365
 
        work_tree.branch.push(branch2_tree.branch)
366
 
        self.assertRevisionInRepository('branch2', branch2_revid)
367
 
        self.assertRevisionsInBranchRepository(
368
 
            [trunk_revid, branch_revid, branch2_revid],
369
 
            'branch2')
370
 
 
371
 
    def test_branch_stacked(self):
372
 
        # We have a mainline
373
 
        trunk_tree = self.make_branch_and_tree('mainline',
374
 
            format='1.9')
375
 
        original_revid = trunk_tree.commit('mainline')
376
 
        self.assertRevisionInRepository('mainline', original_revid)
377
 
        # and a branch from it which is stacked
378
 
        out, err = self.run_bzr(['branch', '--stacked', 'mainline',
379
 
            'newbranch'])
380
 
        self.assertEqual('', out)
381
 
        self.assertEqual('Created new stacked branch referring to %s.\n' %
382
 
            trunk_tree.branch.base, err)
383
 
        self.assertRevisionNotInRepository('newbranch', original_revid)
384
 
        new_branch = branch.Branch.open('newbranch')
385
 
        self.assertEqual(trunk_tree.branch.base, new_branch.get_stacked_on_url())
386
 
 
387
 
    def test_branch_stacked_from_smart_server(self):
388
 
        # We can branch stacking on a smart server
389
 
        self.transport_server = test_server.SmartTCPServer_for_testing
390
 
        trunk = self.make_branch('mainline', format='1.9')
391
 
        out, err = self.run_bzr(
392
 
            ['branch', '--stacked', self.get_url('mainline'), 'shallow'])
393
 
 
394
 
    def test_branch_stacked_from_non_stacked_format(self):
395
 
        """The origin format doesn't support stacking"""
396
 
        trunk = self.make_branch('trunk', format='pack-0.92')
397
 
        out, err = self.run_bzr(
398
 
            ['branch', '--stacked', 'trunk', 'shallow'])
399
 
        # We should notify the user that we upgraded their format
400
 
        self.assertEqualDiff(
401
 
            'Source repository format does not support stacking, using format:\n'
402
 
            '  Packs 5 (adds stacking support, requires bzr 1.6)\n'
403
 
            'Source branch format does not support stacking, using format:\n'
404
 
            '  Branch format 7\n'
405
 
            'Doing on-the-fly conversion from RepositoryFormatKnitPack1() to RepositoryFormatKnitPack5().\n'
406
 
            'This may take some time. Upgrade the repositories to the same format for better performance.\n'
407
 
            'Created new stacked branch referring to %s.\n' % (trunk.base,),
408
 
            err)
409
 
 
410
 
    def test_branch_stacked_from_rich_root_non_stackable(self):
411
 
        trunk = self.make_branch('trunk', format='rich-root-pack')
412
 
        out, err = self.run_bzr(
413
 
            ['branch', '--stacked', 'trunk', 'shallow'])
414
 
        # We should notify the user that we upgraded their format
415
 
        self.assertEqualDiff(
416
 
            'Source repository format does not support stacking, using format:\n'
417
 
            '  Packs 5 rich-root (adds stacking support, requires bzr 1.6.1)\n'
418
 
            'Source branch format does not support stacking, using format:\n'
419
 
            '  Branch format 7\n'
420
 
            'Doing on-the-fly conversion from RepositoryFormatKnitPack4() to RepositoryFormatKnitPack5RichRoot().\n'
421
 
            'This may take some time. Upgrade the repositories to the same format for better performance.\n'
422
 
            'Created new stacked branch referring to %s.\n' % (trunk.base,),
423
 
            err)
424
 
 
425
 
 
426
 
class TestSmartServerBranching(TestCaseWithTransport):
427
 
 
428
 
    def test_branch_from_trivial_branch_to_same_server_branch_acceptance(self):
429
 
        self.setup_smart_server_with_call_log()
430
 
        t = self.make_branch_and_tree('from')
431
 
        for count in range(9):
432
 
            t.commit(message='commit %d' % count)
433
 
        self.reset_smart_call_log()
434
 
        out, err = self.run_bzr(['branch', self.get_url('from'),
435
 
            self.get_url('target')])
436
 
        # This figure represent the amount of work to perform this use case. It
437
 
        # is entirely ok to reduce this number if a test fails due to rpc_count
438
 
        # being too low. If rpc_count increases, more network roundtrips have
439
 
        # become necessary for this use case. Please do not adjust this number
440
 
        # upwards without agreement from bzr's network support maintainers.
441
 
        self.assertLength(36, self.hpss_calls)
442
 
 
443
 
    def test_branch_from_trivial_branch_streaming_acceptance(self):
444
 
        self.setup_smart_server_with_call_log()
445
 
        t = self.make_branch_and_tree('from')
446
 
        for count in range(9):
447
 
            t.commit(message='commit %d' % count)
448
 
        self.reset_smart_call_log()
449
 
        out, err = self.run_bzr(['branch', self.get_url('from'),
450
 
            'local-target'])
451
 
        # This figure represent the amount of work to perform this use case. It
452
 
        # is entirely ok to reduce this number if a test fails due to rpc_count
453
 
        # being too low. If rpc_count increases, more network roundtrips have
454
 
        # become necessary for this use case. Please do not adjust this number
455
 
        # upwards without agreement from bzr's network support maintainers.
456
 
        self.assertLength(9, self.hpss_calls)
457
 
 
458
 
    def test_branch_from_trivial_stacked_branch_streaming_acceptance(self):
459
 
        self.setup_smart_server_with_call_log()
460
 
        t = self.make_branch_and_tree('trunk')
461
 
        for count in range(8):
462
 
            t.commit(message='commit %d' % count)
463
 
        tree2 = t.branch.bzrdir.sprout('feature', stacked=True
464
 
            ).open_workingtree()
465
 
        local_tree = t.branch.bzrdir.sprout('local-working').open_workingtree()
466
 
        local_tree.commit('feature change')
467
 
        local_tree.branch.push(tree2.branch)
468
 
        self.reset_smart_call_log()
469
 
        out, err = self.run_bzr(['branch', self.get_url('feature'),
470
 
            'local-target'])
471
 
        # This figure represent the amount of work to perform this use case. It
472
 
        # is entirely ok to reduce this number if a test fails due to rpc_count
473
 
        # being too low. If rpc_count increases, more network roundtrips have
474
 
        # become necessary for this use case. Please do not adjust this number
475
 
        # upwards without agreement from bzr's network support maintainers.
476
 
        self.assertLength(14, self.hpss_calls)
477
 
 
478
 
    def test_branch_from_branch_with_tags(self):
479
 
        self.setup_smart_server_with_call_log()
480
 
        builder = self.make_branch_builder('source')
481
 
        source = fixtures.build_branch_with_non_ancestral_rev(builder)
482
 
        source.tags.set_tag('tag-a', 'rev-2')
483
 
        source.tags.set_tag('tag-missing', 'missing-rev')
484
 
        # Now source has a tag not in its ancestry.  Make a branch from it.
485
 
        self.reset_smart_call_log()
486
 
        out, err = self.run_bzr(['branch', self.get_url('source'), '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.
492
 
        self.assertLength(9, self.hpss_calls)
493
 
 
494
 
    def test_branch_to_stacked_from_trivial_branch_streaming_acceptance(self):
495
 
        self.setup_smart_server_with_call_log()
496
 
        t = self.make_branch_and_tree('from')
497
 
        for count in range(9):
498
 
            t.commit(message='commit %d' % count)
499
 
        self.reset_smart_call_log()
500
 
        out, err = self.run_bzr(['branch', '--stacked', self.get_url('from'),
501
 
            'local-target'])
502
 
        # XXX: the number of hpss calls for this case isn't deterministic yet,
503
 
        # so we can't easily assert about the number of calls.
504
 
        #self.assertLength(XXX, self.hpss_calls)
505
 
        # We can assert that none of the calls were readv requests for rix
506
 
        # files, though (demonstrating that at least get_parent_map calls are
507
 
        # not using VFS RPCs).
508
 
        readvs_of_rix_files = [
509
 
            c for c in self.hpss_calls
510
 
            if c.call.method == 'readv' and c.call.args[-1].endswith('.rix')]
511
 
        self.assertLength(0, readvs_of_rix_files)
512
 
 
513
 
 
514
 
class TestRemoteBranch(TestCaseWithSFTPServer):
515
 
 
516
 
    def setUp(self):
517
 
        super(TestRemoteBranch, self).setUp()
518
 
        tree = self.make_branch_and_tree('branch')
519
 
        self.build_tree_contents([('branch/file', 'file content\n')])
520
 
        tree.add('file')
521
 
        tree.commit('file created')
522
 
 
523
 
    def test_branch_local_remote(self):
524
 
        self.run_bzr(['branch', 'branch', self.get_url('remote')])
525
 
        t = self.get_transport()
526
 
        # Ensure that no working tree what created remotely
527
 
        self.assertFalse(t.has('remote/file'))
528
 
 
529
 
    def test_branch_remote_remote(self):
530
 
        # Light cheat: we access the branch remotely
531
 
        self.run_bzr(['branch', self.get_url('branch'),
532
 
                      self.get_url('remote')])
533
 
        t = self.get_transport()
534
 
        # Ensure that no working tree what created remotely
535
 
        self.assertFalse(t.has('remote/file'))
536
 
 
537
 
 
538
 
class TestDeprecatedAliases(TestCaseWithTransport):
539
 
 
540
 
    def test_deprecated_aliases(self):
541
 
        """bzr branch can be called clone or get, but those names are deprecated.
542
 
 
543
 
        See bug 506265.
544
 
        """
545
 
        for command in ['clone', 'get']:
546
 
            run_script(self, """
547
 
            $ bzr %(command)s A B
548
 
            2>The command 'bzr %(command)s' has been deprecated in bzr 2.4. Please use 'bzr branch' instead.
549
 
            2>bzr: ERROR: Not a branch...
550
 
            """ % locals())
551
 
 
552
 
 
553
 
class TestBranchParentLocation(test_switch.TestSwitchParentLocationBase):
554
 
 
555
 
    def _checkout_and_branch(self, option=''):
556
 
        self.script_runner.run_script(self, '''
557
 
                $ bzr checkout %(option)s repo/trunk checkout
558
 
                $ cd checkout
559
 
                $ bzr branch --switch ../repo/trunk ../repo/branched
560
 
                2>Branched 0 revision(s).
561
 
                2>Tree is up to date at revision 0.
562
 
                2>Switched to branch:...branched...
563
 
                $ cd ..
564
 
                ''' % locals())
565
 
        bound_branch = branch.Branch.open_containing('checkout')[0]
566
 
        master_branch = branch.Branch.open_containing('repo/branched')[0]
567
 
        return (bound_branch, master_branch)
568
 
 
569
 
    def test_branch_switch_parent_lightweight(self):
570
 
        """Lightweight checkout using bzr branch --switch."""
571
 
        bb, mb = self._checkout_and_branch(option='--lightweight')
572
 
        self.assertParent('repo/trunk', bb)
573
 
        self.assertParent('repo/trunk', mb)
574
 
 
575
 
    def test_branch_switch_parent_heavyweight(self):
576
 
        """Heavyweight checkout using bzr branch --switch."""
577
 
        bb, mb = self._checkout_and_branch()
578
 
        self.assertParent('repo/trunk', bb)
579
 
        self.assertParent('repo/trunk', mb)