~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

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

  • Committer: Patch Queue Manager
  • Date: 2015-12-17 18:39:00 UTC
  • mfrom: (6606.1.2 fix-float)
  • Revision ID: pqm@pqm.ubuntu.com-20151217183900-0719du2uv1kwu3lc
(vila) Inline testtools private method to fix an issue in xenial (the
 private implementation has changed in an backward incompatible way).
 (Jelmer Vernooij)

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2006-2011 Canonical Ltd
 
1
# Copyright (C) 2006-2012 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
22
22
from bzrlib import (
23
23
    branch,
24
24
    bzrdir,
 
25
    controldir,
25
26
    errors,
26
27
    revision as _mod_revision,
 
28
    tests,
27
29
    )
28
30
from bzrlib.repofmt.knitrepo import RepositoryFormatKnit1
29
 
from bzrlib.tests import TestCaseWithTransport
30
31
from bzrlib.tests import (
31
32
    fixtures,
32
 
    script,
33
33
    test_server,
34
34
    )
35
35
from bzrlib.tests.features import (
36
36
    HardlinkFeature,
37
37
    )
38
38
from bzrlib.tests.blackbox import test_switch
 
39
from bzrlib.tests.matchers import ContainsNoVfsCalls
39
40
from bzrlib.tests.test_sftp_transport import TestCaseWithSFTPServer
40
41
from bzrlib.tests.script import run_script
41
42
from bzrlib.urlutils import local_path_to_url, strip_trailing_slash
42
43
from bzrlib.workingtree import WorkingTree
43
44
 
44
45
 
45
 
class TestBranch(TestCaseWithTransport):
 
46
class TestBranch(tests.TestCaseWithTransport):
46
47
 
47
 
    def example_branch(self, path='.'):
48
 
        tree = self.make_branch_and_tree(path)
 
48
    def example_branch(self, path='.', format=None):
 
49
        tree = self.make_branch_and_tree(path, format=format)
49
50
        self.build_tree_contents([(path + '/hello', 'foo')])
50
51
        tree.add('hello')
51
52
        tree.commit(message='setup')
52
53
        self.build_tree_contents([(path + '/goodbye', 'baz')])
53
54
        tree.add('goodbye')
54
55
        tree.commit(message='setup')
 
56
        return tree
55
57
 
56
58
    def test_branch(self):
57
59
        """Branch from one branch to another."""
63
65
        self.assertFalse(b._transport.has('branch-name'))
64
66
        b.bzrdir.open_workingtree().commit(message='foo', allow_pointless=True)
65
67
 
 
68
    def test_branch_no_to_location(self):
 
69
        """The to_location is derived from the source branch name."""
 
70
        os.mkdir("something")
 
71
        a = self.example_branch('something/a').branch
 
72
        self.run_bzr('branch something/a')
 
73
        b = branch.Branch.open('a')
 
74
        self.assertEquals(b.last_revision_info(), a.last_revision_info())
 
75
 
 
76
    def test_into_colocated(self):
 
77
        """Branch from a branch into a colocated branch."""
 
78
        self.example_branch('a')
 
79
        out, err = self.run_bzr(
 
80
            'init --format=development-colo file:b,branch=orig')
 
81
        self.assertEqual(
 
82
            """Created a lightweight checkout (format: development-colo)\n""",
 
83
            out)
 
84
        self.assertEqual('', err)
 
85
        out, err = self.run_bzr(
 
86
            'branch a file:b,branch=thiswasa')
 
87
        self.assertEqual('', out)
 
88
        self.assertEqual('Branched 2 revisions.\n', err)
 
89
        out, err = self.run_bzr('branches b')
 
90
        self.assertEqual("  orig\n  thiswasa\n", out)
 
91
        self.assertEqual('', err)
 
92
        out,err = self.run_bzr('branch a file:b,branch=orig', retcode=3)
 
93
        self.assertEqual('', out)
 
94
        self.assertEqual(
 
95
            'bzr: ERROR: Already a branch: "file:b,branch=orig".\n', err)
 
96
 
 
97
    def test_from_colocated(self):
 
98
        """Branch from a colocated branch into a regular branch."""
 
99
        tree = self.example_branch('a', format='development-colo')
 
100
        tree.bzrdir.create_branch(name='somecolo')
 
101
        out, err = self.run_bzr('branch %s,branch=somecolo' %
 
102
            local_path_to_url('a'))
 
103
        self.assertEqual('', out)
 
104
        self.assertEqual('Branched 0 revisions.\n', err)
 
105
        self.assertPathExists("somecolo")
 
106
 
66
107
    def test_branch_broken_pack(self):
67
108
        """branching with a corrupted pack file."""
68
109
        self.example_branch('a')
81
122
            else:
82
123
                corrupt = '\xFF'
83
124
            f.write(corrupt) # make sure we corrupt something
84
 
        self.run_bzr_error(['Corruption while decompressing repository file'], 
 
125
        self.run_bzr_error(['Corruption while decompressing repository file'],
85
126
                            'branch a b', retcode=3)
86
127
 
87
128
    def test_branch_switch_no_branch(self):
114
155
        #  => new branch will be created, but switch fails and the current
115
156
        #     branch is unmodified
116
157
        self.example_branch('a')
117
 
        self.make_branch_and_tree('current')
 
158
        tree = self.make_branch_and_tree('current')
 
159
        c1 = tree.commit('some diverged change')
118
160
        self.run_bzr_error(['Cannot switch a branch, only a checkout'],
119
161
            'branch --switch ../a ../b', working_dir='current')
120
162
        a = branch.Branch.open('a')
121
163
        b = branch.Branch.open('b')
122
164
        self.assertEqual(a.last_revision(), b.last_revision())
123
165
        work = branch.Branch.open('current')
124
 
        self.assertEqual(work.last_revision(), _mod_revision.NULL_REVISION)
 
166
        self.assertEqual(work.last_revision(), c1)
 
167
 
 
168
    def test_branch_into_empty_dir(self):
 
169
        t = self.example_branch('source')
 
170
        self.make_bzrdir('target')
 
171
        self.run_bzr("branch source target")
 
172
        self.assertEquals(2, len(t.branch.repository.all_revision_ids()))
125
173
 
126
174
    def test_branch_switch_checkout(self):
127
175
        # Checkout in the current directory:
128
176
        #  => new branch will be created and checkout bound to the new branch
129
177
        self.example_branch('a')
130
178
        self.run_bzr('checkout a current')
131
 
        out, err = self.run_bzr('branch --switch ../a ../b', working_dir='current')
 
179
        out, err = self.run_bzr('branch --switch ../a ../b',
 
180
                                working_dir='current')
132
181
        a = branch.Branch.open('a')
133
182
        b = branch.Branch.open('b')
134
183
        self.assertEqual(a.last_revision(), b.last_revision())
142
191
        #     the new branch
143
192
        self.example_branch('a')
144
193
        self.run_bzr('checkout --lightweight a current')
145
 
        out, err = self.run_bzr('branch --switch ../a ../b', working_dir='current')
 
194
        out, err = self.run_bzr('branch --switch ../a ../b',
 
195
                                working_dir='current')
146
196
        a = branch.Branch.open('a')
147
197
        b = branch.Branch.open('b')
148
198
        self.assertEqual(a.last_revision(), b.last_revision())
159
209
 
160
210
        def make_shared_tree(path):
161
211
            shared_repo.bzrdir.root_transport.mkdir(path)
162
 
            shared_repo.bzrdir.create_branch_convenience('repo/' + path)
 
212
            controldir.ControlDir.create_branch_convenience('repo/' + path)
163
213
            return WorkingTree.open('repo/' + path)
164
214
        tree_a = make_shared_tree('a')
165
215
        self.build_tree(['repo/a/file'])
299
349
        builder = self.make_branch_builder('source')
300
350
        source = fixtures.build_branch_with_non_ancestral_rev(builder)
301
351
        source.tags.set_tag('tag-a', 'rev-2')
302
 
        source.get_config().set_user_option('branch.fetch_tags', 'True')
 
352
        source.get_config_stack().set('branch.fetch_tags', True)
303
353
        # Now source has a tag not in its ancestry.  Make a branch from it.
304
354
        self.run_bzr('branch source new-branch')
305
355
        new_branch = branch.Branch.open('new-branch')
308
358
        new_branch.repository.get_revision('rev-2')
309
359
 
310
360
 
311
 
class TestBranchStacked(TestCaseWithTransport):
 
361
class TestBranchStacked(tests.TestCaseWithTransport):
312
362
    """Tests for branch --stacked"""
313
363
 
314
364
    def assertRevisionInRepository(self, repo_path, revid):
315
 
        """Check that a revision is in a repository, disregarding stacking."""
316
 
        repo = bzrdir.BzrDir.open(repo_path).open_repository()
 
365
        """Check that a revision is in a repo, disregarding stacking."""
 
366
        repo = controldir.ControlDir.open(repo_path).open_repository()
317
367
        self.assertTrue(repo.has_revision(revid))
318
368
 
319
369
    def assertRevisionNotInRepository(self, repo_path, revid):
320
 
        """Check that a revision is not in a repository, disregarding stacking."""
321
 
        repo = bzrdir.BzrDir.open(repo_path).open_repository()
 
370
        """Check that a revision is not in a repo, disregarding stacking."""
 
371
        repo = controldir.ControlDir.open(repo_path).open_repository()
322
372
        self.assertFalse(repo.has_revision(revid))
323
373
 
324
374
    def assertRevisionsInBranchRepository(self, revid_list, branch_path):
350
400
        # capable of supporting stacking, but not actually have a stacked_on
351
401
        # branch configured
352
402
        self.assertRaises(errors.NotStacked,
353
 
            bzrdir.BzrDir.open('newbranch').open_branch().get_stacked_on_url)
 
403
            controldir.ControlDir.open('newbranch').open_branch().get_stacked_on_url)
354
404
 
355
405
    def test_branch_stacked_branch_stacked(self):
356
406
        """Asking to stack on a stacked branch does work"""
395
445
            trunk_tree.branch.base, err)
396
446
        self.assertRevisionNotInRepository('newbranch', original_revid)
397
447
        new_branch = branch.Branch.open('newbranch')
398
 
        self.assertEqual(trunk_tree.branch.base, new_branch.get_stacked_on_url())
 
448
        self.assertEqual(trunk_tree.branch.base,
 
449
                         new_branch.get_stacked_on_url())
399
450
 
400
451
    def test_branch_stacked_from_smart_server(self):
401
452
        # We can branch stacking on a smart server
436
487
            err)
437
488
 
438
489
 
439
 
class TestSmartServerBranching(TestCaseWithTransport):
 
490
class TestSmartServerBranching(tests.TestCaseWithTransport):
440
491
 
441
492
    def test_branch_from_trivial_branch_to_same_server_branch_acceptance(self):
442
493
        self.setup_smart_server_with_call_log()
451
502
        # being too low. If rpc_count increases, more network roundtrips have
452
503
        # become necessary for this use case. Please do not adjust this number
453
504
        # upwards without agreement from bzr's network support maintainers.
454
 
        self.assertLength(39, self.hpss_calls)
 
505
        self.assertLength(2, self.hpss_connections)
 
506
        self.assertLength(33, self.hpss_calls)
 
507
        self.expectFailure("branching to the same branch requires VFS access",
 
508
            self.assertThat, self.hpss_calls, ContainsNoVfsCalls)
455
509
 
456
510
    def test_branch_from_trivial_branch_streaming_acceptance(self):
457
511
        self.setup_smart_server_with_call_log()
466
520
        # being too low. If rpc_count increases, more network roundtrips have
467
521
        # become necessary for this use case. Please do not adjust this number
468
522
        # upwards without agreement from bzr's network support maintainers.
 
523
        self.assertThat(self.hpss_calls, ContainsNoVfsCalls)
469
524
        self.assertLength(10, self.hpss_calls)
 
525
        self.assertLength(1, self.hpss_connections)
470
526
 
471
527
    def test_branch_from_trivial_stacked_branch_streaming_acceptance(self):
472
528
        self.setup_smart_server_with_call_log()
487
543
        # become necessary for this use case. Please do not adjust this number
488
544
        # upwards without agreement from bzr's network support maintainers.
489
545
        self.assertLength(15, self.hpss_calls)
 
546
        self.assertLength(1, self.hpss_connections)
 
547
        self.assertThat(self.hpss_calls, ContainsNoVfsCalls)
490
548
 
491
549
    def test_branch_from_branch_with_tags(self):
492
550
        self.setup_smart_server_with_call_log()
493
551
        builder = self.make_branch_builder('source')
494
552
        source = fixtures.build_branch_with_non_ancestral_rev(builder)
495
 
        source.get_config().set_user_option('branch.fetch_tags', 'True')
 
553
        source.get_config_stack().set('branch.fetch_tags', True)
496
554
        source.tags.set_tag('tag-a', 'rev-2')
497
555
        source.tags.set_tag('tag-missing', 'missing-rev')
498
556
        # Now source has a tag not in its ancestry.  Make a branch from it.
504
562
        # become necessary for this use case. Please do not adjust this number
505
563
        # upwards without agreement from bzr's network support maintainers.
506
564
        self.assertLength(10, self.hpss_calls)
 
565
        self.assertThat(self.hpss_calls, ContainsNoVfsCalls)
 
566
        self.assertLength(1, self.hpss_connections)
507
567
 
508
568
    def test_branch_to_stacked_from_trivial_branch_streaming_acceptance(self):
509
569
        self.setup_smart_server_with_call_log()
522
582
        readvs_of_rix_files = [
523
583
            c for c in self.hpss_calls
524
584
            if c.call.method == 'readv' and c.call.args[-1].endswith('.rix')]
 
585
        self.assertLength(1, self.hpss_connections)
525
586
        self.assertLength(0, readvs_of_rix_files)
 
587
        self.expectFailure("branching to stacked requires VFS access",
 
588
            self.assertThat, self.hpss_calls, ContainsNoVfsCalls)
526
589
 
527
590
 
528
591
class TestRemoteBranch(TestCaseWithSFTPServer):
549
612
        self.assertFalse(t.has('remote/file'))
550
613
 
551
614
 
552
 
class TestDeprecatedAliases(TestCaseWithTransport):
 
615
class TestDeprecatedAliases(tests.TestCaseWithTransport):
553
616
 
554
617
    def test_deprecated_aliases(self):
555
 
        """bzr branch can be called clone or get, but those names are deprecated.
 
618
        """bzr branch can be called clone or get, but those names are
 
619
        deprecated.
556
620
 
557
621
        See bug 506265.
558
622
        """