~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

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

  • Committer: Canonical.com Patch Queue Manager
  • Date: 2011-05-04 12:10:51 UTC
  • mfrom: (5819.1.4 777007-developer-doc)
  • Revision ID: pqm@pqm.ubuntu.com-20110504121051-aovlsmqiivjmc4fc
(jelmer) Small fixes to developer documentation. (Jonathan Riddell)

Show diffs side-by-side

added added

removed removed

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