/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
1
# Copyright (C) 2006-2012, 2016 Canonical Ltd
1711.2.5 by John Arbash Meinel
Factoring blackbox tests into their own file.
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
4183.7.1 by Sabin Iacob
update FSF mailing address
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
1711.2.5 by John Arbash Meinel
Factoring blackbox tests into their own file.
16
17
6622.1.29 by Jelmer Vernooij
Fix some more tests.
18
"""Black-box tests for brz branch."""
1711.2.5 by John Arbash Meinel
Factoring blackbox tests into their own file.
19
20
import os
21
6622.1.34 by Jelmer Vernooij
Rename brzlib => breezy.
22
from breezy import (
4596.2.3 by Lukáš Lalinský
Add tests for various situations
23
    branch,
6207.3.3 by jelmer at samba
Fix tests and the like.
24
    controldir,
4596.2.3 by Lukáš Lalinský
Add tests for various situations
25
    errors,
26
    revision as _mod_revision,
6423.1.1 by Vincent Ladeuil
Cleanup old blackbox tests and then some. Remove os.chdir() calls, caught a few bugs, make sure we don't leave file handles opened.
27
    tests,
4596.2.3 by Lukáš Lalinský
Add tests for various situations
28
    )
6670.4.3 by Jelmer Vernooij
Fix more imports.
29
from breezy.bzr import (
30
    bzrdir,
31
    )
6670.4.5 by Jelmer Vernooij
Move breezy.repofmt contents to breezy.bzr.
32
from breezy.bzr.knitrepo import RepositoryFormatKnit1
6622.1.34 by Jelmer Vernooij
Rename brzlib => breezy.
33
from breezy.tests import (
5651.5.3 by Andrew Bennetts
Use new fixture in more tests.
34
    fixtures,
5017.3.40 by Vincent Ladeuil
-s bb.test_branch passing
35
    test_server,
4580.4.2 by Martin Pool
Add KnownFailure for branch --hardlink
36
    )
6622.1.34 by Jelmer Vernooij
Rename brzlib => breezy.
37
from breezy.tests.features import (
5967.12.1 by Martin Pool
Move all test features into bzrlib.tests.features
38
    HardlinkFeature,
39
    )
6622.1.34 by Jelmer Vernooij
Rename brzlib => breezy.
40
from breezy.tests.blackbox import test_switch
41
from breezy.tests.matchers import ContainsNoVfsCalls
42
from breezy.tests.test_sftp_transport import TestCaseWithSFTPServer
43
from breezy.tests.script import run_script
44
from breezy.urlutils import local_path_to_url, strip_trailing_slash
45
from breezy.workingtree import WorkingTree
1711.2.5 by John Arbash Meinel
Factoring blackbox tests into their own file.
46
47
6423.1.1 by Vincent Ladeuil
Cleanup old blackbox tests and then some. Remove os.chdir() calls, caught a few bugs, make sure we don't leave file handles opened.
48
class TestBranch(tests.TestCaseWithTransport):
1711.2.5 by John Arbash Meinel
Factoring blackbox tests into their own file.
49
6240.3.1 by Jelmer Vernooij
Name new branches after colocated branches.
50
    def example_branch(self, path='.', format=None):
51
        tree = self.make_branch_and_tree(path, format=format)
6855.4.1 by Jelmer Vernooij
Yet more bees.
52
        self.build_tree_contents([(path + '/hello', b'foo')])
2664.8.2 by Daniel Watkins
tests.blackbox.test_branch now uses internals where appropriate.
53
        tree.add('hello')
54
        tree.commit(message='setup')
6855.4.1 by Jelmer Vernooij
Yet more bees.
55
        self.build_tree_contents([(path + '/goodbye', b'baz')])
2664.8.2 by Daniel Watkins
tests.blackbox.test_branch now uses internals where appropriate.
56
        tree.add('goodbye')
57
        tree.commit(message='setup')
6240.3.1 by Jelmer Vernooij
Name new branches after colocated branches.
58
        return tree
1711.2.5 by John Arbash Meinel
Factoring blackbox tests into their own file.
59
60
    def test_branch(self):
61
        """Branch from one branch to another."""
2664.8.2 by Daniel Watkins
tests.blackbox.test_branch now uses internals where appropriate.
62
        self.example_branch('a')
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
63
        self.run_bzr('branch a b')
1773.4.1 by Martin Pool
Add pyflakes makefile target; fix many warnings
64
        b = branch.Branch.open('b')
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
65
        self.run_bzr('branch a c -r 1')
3400.1.3 by Martin Pool
Merge trunk
66
        # previously was erroneously created by branching
3407.2.14 by Martin Pool
Remove more cases of getting transport via control_files
67
        self.assertFalse(b._transport.has('branch-name'))
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
68
        b.controldir.open_workingtree().commit(message='foo', allow_pointless=True)
1711.2.5 by John Arbash Meinel
Factoring blackbox tests into their own file.
69
6437.15.1 by Jelmer Vernooij
Fix target branch locations.
70
    def test_branch_no_to_location(self):
71
        """The to_location is derived from the source branch name."""
72
        os.mkdir("something")
73
        a = self.example_branch('something/a').branch
74
        self.run_bzr('branch something/a')
75
        b = branch.Branch.open('a')
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
76
        self.assertEqual(b.last_revision_info(), a.last_revision_info())
6437.15.1 by Jelmer Vernooij
Fix target branch locations.
77
6207.2.1 by jelmer at samba
Fix cloning to colocated branch.
78
    def test_into_colocated(self):
79
        """Branch from a branch into a colocated branch."""
80
        self.example_branch('a')
81
        out, err = self.run_bzr(
82
            'init --format=development-colo file:b,branch=orig')
83
        self.assertEqual(
6874.1.3 by Jelmer Vernooij
Fix format names.
84
            """Created a standalone tree (format: development-colo)\n""",
6207.2.1 by jelmer at samba
Fix cloning to colocated branch.
85
            out)
7027.4.1 by Jelmer Vernooij
Use StringIOWithEncoding on Python3.
86
        self.assertEqual('', err)
6207.2.1 by jelmer at samba
Fix cloning to colocated branch.
87
        out, err = self.run_bzr(
6266.1.1 by Jelmer Vernooij
Support branching into colocated branch.
88
            'branch a file:b,branch=thiswasa')
7027.4.1 by Jelmer Vernooij
Use StringIOWithEncoding on Python3.
89
        self.assertEqual('', out)
90
        self.assertEqual('Branched 2 revisions.\n', err)
6207.2.1 by jelmer at samba
Fix cloning to colocated branch.
91
        out, err = self.run_bzr('branches b')
7027.4.1 by Jelmer Vernooij
Use StringIOWithEncoding on Python3.
92
        self.assertEqual("  orig\n  thiswasa\n", out)
93
        self.assertEqual('', err)
6809.1.1 by Martin
Apply 2to3 ws_comma fixer
94
        out, err = self.run_bzr('branch a file:b,branch=orig', retcode=3)
7027.4.1 by Jelmer Vernooij
Use StringIOWithEncoding on Python3.
95
        self.assertEqual('', out)
6423.1.1 by Vincent Ladeuil
Cleanup old blackbox tests and then some. Remove os.chdir() calls, caught a few bugs, make sure we don't leave file handles opened.
96
        self.assertEqual(
7027.4.1 by Jelmer Vernooij
Use StringIOWithEncoding on Python3.
97
            'brz: ERROR: Already a branch: "file:b,branch=orig".\n', err)
6207.2.1 by jelmer at samba
Fix cloning to colocated branch.
98
6240.3.1 by Jelmer Vernooij
Name new branches after colocated branches.
99
    def test_from_colocated(self):
100
        """Branch from a colocated branch into a regular branch."""
7111.1.1 by Jelmer Vernooij
Don't let the default directory name derive from a branch name.
101
        os.mkdir('b')
102
        tree = self.example_branch('b/a', format='development-colo')
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
103
        tree.controldir.create_branch(name='somecolo')
6240.3.1 by Jelmer Vernooij
Name new branches after colocated branches.
104
        out, err = self.run_bzr('branch %s,branch=somecolo' %
7143.15.2 by Jelmer Vernooij
Run autopep8.
105
                                local_path_to_url('b/a'))
7027.4.1 by Jelmer Vernooij
Use StringIOWithEncoding on Python3.
106
        self.assertEqual('', out)
107
        self.assertEqual('Branched 0 revisions.\n', err)
7111.1.1 by Jelmer Vernooij
Don't let the default directory name derive from a branch name.
108
        self.assertPathExists('a')
6240.3.1 by Jelmer Vernooij
Name new branches after colocated branches.
109
5927.2.1 by Jonathan Riddell
start a test case for corrupt pack files
110
    def test_branch_broken_pack(self):
111
        """branching with a corrupted pack file."""
112
        self.example_branch('a')
6158.1.1 by Vincent Ladeuil
Fix random test failure by making the test not random
113
        # add some corruption
114
        packs_dir = 'a/.bzr/repository/packs/'
115
        fname = packs_dir + os.listdir(packs_dir)[0]
5927.2.8 by Jonathan Riddell
tidy up file opening in test
116
        with open(fname, 'rb+') as f:
6158.1.1 by Vincent Ladeuil
Fix random test failure by making the test not random
117
            # Start from the end of the file to avoid choosing a place bigger
118
            # than the file itself.
119
            f.seek(-5, os.SEEK_END)
120
            c = f.read(1)
121
            f.seek(-5, os.SEEK_END)
122
            # Make sure we inject a value different than the one we just read
6973.13.2 by Jelmer Vernooij
Fix some more tests.
123
            if c == b'\xFF':
7122.2.1 by Jelmer Vernooij
Fix byteness when we happen to write a xFF in the wrong place..
124
                corrupt = b'\x00'
6158.1.1 by Vincent Ladeuil
Fix random test failure by making the test not random
125
            else:
6973.13.2 by Jelmer Vernooij
Fix some more tests.
126
                corrupt = b'\xFF'
7143.15.2 by Jelmer Vernooij
Run autopep8.
127
            f.write(corrupt)  # make sure we corrupt something
7027.4.1 by Jelmer Vernooij
Use StringIOWithEncoding on Python3.
128
        self.run_bzr_error(['Corruption while decompressing repository file'],
7143.15.2 by Jelmer Vernooij
Run autopep8.
129
                           'branch a b', retcode=3)
5927.2.1 by Jonathan Riddell
start a test case for corrupt pack files
130
4596.2.3 by Lukáš Lalinský
Add tests for various situations
131
    def test_branch_switch_no_branch(self):
132
        # No branch in the current directory:
133
        #  => new branch will be created, but switch fails
134
        self.example_branch('a')
135
        self.make_repository('current')
7027.4.1 by Jelmer Vernooij
Use StringIOWithEncoding on Python3.
136
        self.run_bzr_error(['No WorkingTree exists for'],
7143.15.2 by Jelmer Vernooij
Run autopep8.
137
                           'branch --switch ../a ../b', working_dir='current')
4596.2.3 by Lukáš Lalinský
Add tests for various situations
138
        a = branch.Branch.open('a')
139
        b = branch.Branch.open('b')
140
        self.assertEqual(a.last_revision(), b.last_revision())
141
142
    def test_branch_switch_no_wt(self):
143
        # No working tree in the current directory:
144
        #  => new branch will be created, but switch fails and the current
145
        #     branch is unmodified
146
        self.example_branch('a')
147
        self.make_branch('current')
7027.4.1 by Jelmer Vernooij
Use StringIOWithEncoding on Python3.
148
        self.run_bzr_error(['No WorkingTree exists for'],
7143.15.2 by Jelmer Vernooij
Run autopep8.
149
                           'branch --switch ../a ../b', working_dir='current')
4596.2.3 by Lukáš Lalinský
Add tests for various situations
150
        a = branch.Branch.open('a')
151
        b = branch.Branch.open('b')
152
        self.assertEqual(a.last_revision(), b.last_revision())
153
        work = branch.Branch.open('current')
154
        self.assertEqual(work.last_revision(), _mod_revision.NULL_REVISION)
155
4596.2.1 by Lukáš Lalinský
Add support for `bzr branch --switch`
156
    def test_branch_switch_no_checkout(self):
4596.2.3 by Lukáš Lalinský
Add tests for various situations
157
        # Standalone branch in the current directory:
158
        #  => new branch will be created, but switch fails and the current
159
        #     branch is unmodified
4596.2.1 by Lukáš Lalinský
Add support for `bzr branch --switch`
160
        self.example_branch('a')
6437.21.7 by Jelmer Vernooij
Fix remaining tests.
161
        tree = self.make_branch_and_tree('current')
162
        c1 = tree.commit('some diverged change')
7027.4.1 by Jelmer Vernooij
Use StringIOWithEncoding on Python3.
163
        self.run_bzr_error(['Cannot switch a branch, only a checkout'],
7143.15.2 by Jelmer Vernooij
Run autopep8.
164
                           'branch --switch ../a ../b', working_dir='current')
4596.2.3 by Lukáš Lalinský
Add tests for various situations
165
        a = branch.Branch.open('a')
166
        b = branch.Branch.open('b')
167
        self.assertEqual(a.last_revision(), b.last_revision())
168
        work = branch.Branch.open('current')
6437.21.7 by Jelmer Vernooij
Fix remaining tests.
169
        self.assertEqual(work.last_revision(), c1)
4596.2.3 by Lukáš Lalinský
Add tests for various situations
170
6379.13.1 by Jelmer Vernooij
Fix branching into empty control directories.
171
    def test_branch_into_empty_dir(self):
172
        t = self.example_branch('source')
6653.6.5 by Jelmer Vernooij
Rename make_bzrdir to make_controldir.
173
        self.make_controldir('target')
6379.13.1 by Jelmer Vernooij
Fix branching into empty control directories.
174
        self.run_bzr("branch source target")
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
175
        self.assertEqual(2, len(t.branch.repository.all_revision_ids()))
6379.13.1 by Jelmer Vernooij
Fix branching into empty control directories.
176
4596.2.3 by Lukáš Lalinský
Add tests for various situations
177
    def test_branch_switch_checkout(self):
178
        # Checkout in the current directory:
179
        #  => new branch will be created and checkout bound to the new branch
180
        self.example_branch('a')
181
        self.run_bzr('checkout a current')
6423.1.1 by Vincent Ladeuil
Cleanup old blackbox tests and then some. Remove os.chdir() calls, caught a few bugs, make sure we don't leave file handles opened.
182
        out, err = self.run_bzr('branch --switch ../a ../b',
183
                                working_dir='current')
4596.2.3 by Lukáš Lalinský
Add tests for various situations
184
        a = branch.Branch.open('a')
185
        b = branch.Branch.open('b')
186
        self.assertEqual(a.last_revision(), b.last_revision())
187
        work = WorkingTree.open('current')
188
        self.assertEndsWith(work.branch.get_bound_location(), '/b/')
7027.4.1 by Jelmer Vernooij
Use StringIOWithEncoding on Python3.
189
        self.assertContainsRe(err, "Switched to branch: .*/b/")
4596.2.3 by Lukáš Lalinský
Add tests for various situations
190
191
    def test_branch_switch_lightweight_checkout(self):
192
        # Lightweight checkout in the current directory:
193
        #  => new branch will be created and lightweight checkout pointed to
194
        #     the new branch
195
        self.example_branch('a')
196
        self.run_bzr('checkout --lightweight a current')
6423.1.1 by Vincent Ladeuil
Cleanup old blackbox tests and then some. Remove os.chdir() calls, caught a few bugs, make sure we don't leave file handles opened.
197
        out, err = self.run_bzr('branch --switch ../a ../b',
198
                                working_dir='current')
4596.2.3 by Lukáš Lalinský
Add tests for various situations
199
        a = branch.Branch.open('a')
200
        b = branch.Branch.open('b')
201
        self.assertEqual(a.last_revision(), b.last_revision())
202
        work = WorkingTree.open('current')
203
        self.assertEndsWith(work.branch.base, '/b/')
7027.4.1 by Jelmer Vernooij
Use StringIOWithEncoding on Python3.
204
        self.assertContainsRe(err, "Switched to branch: .*/b/")
4596.2.1 by Lukáš Lalinský
Add support for `bzr branch --switch`
205
1711.2.6 by John Arbash Meinel
Creating a test case for bug 43713, bzr branch does the right thing
206
    def test_branch_only_copies_history(self):
207
        # Knit branches should only push the history for the current revision.
1773.4.1 by Martin Pool
Add pyflakes makefile target; fix many warnings
208
        format = bzrdir.BzrDirMetaFormat1()
1711.2.6 by John Arbash Meinel
Creating a test case for bug 43713, bzr branch does the right thing
209
        format.repository_format = RepositoryFormatKnit1()
210
        shared_repo = self.make_repository('repo', format=format, shared=True)
211
        shared_repo.set_make_working_trees(True)
212
213
        def make_shared_tree(path):
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
214
            shared_repo.controldir.root_transport.mkdir(path)
6207.3.3 by jelmer at samba
Fix tests and the like.
215
            controldir.ControlDir.create_branch_convenience('repo/' + path)
1711.2.6 by John Arbash Meinel
Creating a test case for bug 43713, bzr branch does the right thing
216
            return WorkingTree.open('repo/' + path)
217
        tree_a = make_shared_tree('a')
218
        self.build_tree(['repo/a/file'])
219
        tree_a.add('file')
6855.4.1 by Jelmer Vernooij
Yet more bees.
220
        tree_a.commit('commit a-1', rev_id=b'a-1')
6973.7.5 by Jelmer Vernooij
s/file/open.
221
        with open('repo/a/file', 'ab') as f:
222
            f.write(b'more stuff\n')
6855.4.1 by Jelmer Vernooij
Yet more bees.
223
        tree_a.commit('commit a-2', rev_id=b'a-2')
1711.2.6 by John Arbash Meinel
Creating a test case for bug 43713, bzr branch does the right thing
224
225
        tree_b = make_shared_tree('b')
226
        self.build_tree(['repo/b/file'])
227
        tree_b.add('file')
6855.4.1 by Jelmer Vernooij
Yet more bees.
228
        tree_b.commit('commit b-1', rev_id=b'b-1')
1711.2.6 by John Arbash Meinel
Creating a test case for bug 43713, bzr branch does the right thing
229
6973.5.2 by Jelmer Vernooij
Add more bees.
230
        self.assertTrue(shared_repo.has_revision(b'a-1'))
231
        self.assertTrue(shared_repo.has_revision(b'a-2'))
232
        self.assertTrue(shared_repo.has_revision(b'b-1'))
1711.2.6 by John Arbash Meinel
Creating a test case for bug 43713, bzr branch does the right thing
233
234
        # Now that we have a repository with shared files, make sure
235
        # that things aren't copied out by a 'branch'
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
236
        self.run_bzr('branch repo/b branch-b')
1711.2.6 by John Arbash Meinel
Creating a test case for bug 43713, bzr branch does the right thing
237
        pushed_tree = WorkingTree.open('branch-b')
238
        pushed_repo = pushed_tree.branch.repository
6973.5.2 by Jelmer Vernooij
Add more bees.
239
        self.assertFalse(pushed_repo.has_revision(b'a-1'))
240
        self.assertFalse(pushed_repo.has_revision(b'a-2'))
241
        self.assertTrue(pushed_repo.has_revision(b'b-1'))
1711.2.6 by John Arbash Meinel
Creating a test case for bug 43713, bzr branch does the right thing
242
3136.1.3 by Aaron Bentley
Implement hard-link support for branch and checkout
243
    def test_branch_hardlink(self):
244
        self.requireFeature(HardlinkFeature)
245
        source = self.make_branch_and_tree('source')
246
        self.build_tree(['source/file1'])
247
        source.add('file1')
248
        source.commit('added file')
4580.4.2 by Martin Pool
Add KnownFailure for branch --hardlink
249
        out, err = self.run_bzr(['branch', 'source', 'target', '--hardlink'])
3136.1.3 by Aaron Bentley
Implement hard-link support for branch and checkout
250
        source_stat = os.stat('source/file1')
251
        target_stat = os.stat('target/file1')
4826.1.3 by Andrew Bennetts
Remove KnownFailure from test_branch_hardlink.
252
        self.assertEqual(source_stat, target_stat)
3136.1.3 by Aaron Bentley
Implement hard-link support for branch and checkout
253
5353.2.2 by John Arbash Meinel
update the test suite.
254
    def test_branch_files_from(self):
255
        source = self.make_branch_and_tree('source')
256
        self.build_tree(['source/file1'])
257
        source.add('file1')
258
        source.commit('added file')
259
        out, err = self.run_bzr('branch source target --files-from source')
5784.1.3 by Martin Pool
Switch away from using failUnlessExists and failIfExists
260
        self.assertPathExists('target/file1')
5353.2.2 by John Arbash Meinel
update the test suite.
261
262
    def test_branch_files_from_hardlink(self):
263
        self.requireFeature(HardlinkFeature)
264
        source = self.make_branch_and_tree('source')
265
        self.build_tree(['source/file1'])
266
        source.add('file1')
267
        source.commit('added file')
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
268
        source.controldir.sprout('second')
5353.2.2 by John Arbash Meinel
update the test suite.
269
        out, err = self.run_bzr('branch source target --files-from second'
270
                                ' --hardlink')
271
        source_stat = os.stat('source/file1')
272
        second_stat = os.stat('second/file1')
273
        target_stat = os.stat('target/file1')
274
        self.assertNotEqual(source_stat, target_stat)
5353.2.5 by John Arbash Meinel
We need to assert that the --hardlink makes the files the same, not different.
275
        self.assertEqual(second_stat, target_stat)
5353.2.2 by John Arbash Meinel
update the test suite.
276
3696.2.1 by Daniel Watkins
Added test for 'branch --standalone'.
277
    def test_branch_standalone(self):
278
        shared_repo = self.make_repository('repo', shared=True)
279
        self.example_branch('source')
280
        self.run_bzr('branch --standalone source repo/target')
281
        b = branch.Branch.open('repo/target')
282
        expected_repo_path = os.path.abspath('repo/target/.bzr/repository')
3696.2.4 by Daniel Watkins
Fixed test to cope with trailing slashes.
283
        self.assertEqual(strip_trailing_slash(b.repository.base),
7143.15.2 by Jelmer Vernooij
Run autopep8.
284
                         strip_trailing_slash(local_path_to_url(expected_repo_path)))
3696.2.1 by Daniel Watkins
Added test for 'branch --standalone'.
285
3983.1.5 by Daniel Watkins
Added blackbox test.
286
    def test_branch_no_tree(self):
287
        self.example_branch('source')
288
        self.run_bzr('branch --no-tree source target')
5784.1.3 by Martin Pool
Switch away from using failUnlessExists and failIfExists
289
        self.assertPathDoesNotExist('target/hello')
290
        self.assertPathDoesNotExist('target/goodbye')
3983.1.5 by Daniel Watkins
Added blackbox test.
291
4479.2.1 by Alexander Belchenko
branch command now has new flag --use-existing-dir to force branching into existing directory if there is no branch yet.
292
    def test_branch_into_existing_dir(self):
293
        self.example_branch('a')
6622.1.29 by Jelmer Vernooij
Fix some more tests.
294
        # existing dir with similar files but no .brz dir
4479.2.2 by Vincent Ladeuil
Fix typos and add NEWS entry.
295
        self.build_tree_contents([('b/',)])
6855.4.1 by Jelmer Vernooij
Yet more bees.
296
        self.build_tree_contents([('b/hello', b'bar')])  # different content
7143.15.2 by Jelmer Vernooij
Run autopep8.
297
        self.build_tree_contents([('b/goodbye', b'baz')])  # same content
4479.2.2 by Vincent Ladeuil
Fix typos and add NEWS entry.
298
        # fails without --use-existing-dir
6809.1.1 by Martin
Apply 2to3 ws_comma fixer
299
        out, err = self.run_bzr('branch a b', retcode=3)
7027.4.1 by Jelmer Vernooij
Use StringIOWithEncoding on Python3.
300
        self.assertEqual('', out)
301
        self.assertEqual('brz: ERROR: Target directory "b" already exists.\n',
7143.15.2 by Jelmer Vernooij
Run autopep8.
302
                         err)
4479.2.1 by Alexander Belchenko
branch command now has new flag --use-existing-dir to force branching into existing directory if there is no branch yet.
303
        # force operation
304
        self.run_bzr('branch a b --use-existing-dir')
305
        # check conflicts
5784.1.3 by Martin Pool
Switch away from using failUnlessExists and failIfExists
306
        self.assertPathExists('b/hello.moved')
307
        self.assertPathDoesNotExist('b/godbye.moved')
4479.2.1 by Alexander Belchenko
branch command now has new flag --use-existing-dir to force branching into existing directory if there is no branch yet.
308
        # we can't branch into branch
6809.1.1 by Martin
Apply 2to3 ws_comma fixer
309
        out, err = self.run_bzr('branch a b --use-existing-dir', retcode=3)
7027.4.1 by Jelmer Vernooij
Use StringIOWithEncoding on Python3.
310
        self.assertEqual('', out)
311
        self.assertEqual('brz: ERROR: Already a branch: "b".\n', err)
4479.2.1 by Alexander Belchenko
branch command now has new flag --use-existing-dir to force branching into existing directory if there is no branch yet.
312
4927.3.1 by Ian Clatworthy
branch --bind option
313
    def test_branch_bind(self):
314
        self.example_branch('a')
315
        out, err = self.run_bzr('branch a b --bind')
7027.4.1 by Jelmer Vernooij
Use StringIOWithEncoding on Python3.
316
        self.assertEndsWith(err, "New branch bound to a\n")
4927.3.1 by Ian Clatworthy
branch --bind option
317
        b = branch.Branch.open('b')
318
        self.assertEndsWith(b.get_bound_location(), '/a/')
319
5107.3.6 by Marco Pantaleoni
Documented behaviour of 'post_branch_init' for lightweight checkouts.
320
    def test_branch_with_post_branch_init_hook(self):
321
        calls = []
322
        branch.Branch.hooks.install_named_hook('post_branch_init',
7143.15.2 by Jelmer Vernooij
Run autopep8.
323
                                               calls.append, None)
5107.3.6 by Marco Pantaleoni
Documented behaviour of 'post_branch_init' for lightweight checkouts.
324
        self.assertLength(0, calls)
325
        self.example_branch('a')
326
        self.assertLength(1, calls)
327
        self.run_bzr('branch a b')
328
        self.assertLength(2, calls)
329
330
    def test_checkout_with_post_branch_init_hook(self):
331
        calls = []
332
        branch.Branch.hooks.install_named_hook('post_branch_init',
7143.15.2 by Jelmer Vernooij
Run autopep8.
333
                                               calls.append, None)
5107.3.6 by Marco Pantaleoni
Documented behaviour of 'post_branch_init' for lightweight checkouts.
334
        self.assertLength(0, calls)
335
        self.example_branch('a')
336
        self.assertLength(1, calls)
337
        self.run_bzr('checkout a b')
338
        self.assertLength(2, calls)
339
340
    def test_lightweight_checkout_with_post_branch_init_hook(self):
341
        calls = []
342
        branch.Branch.hooks.install_named_hook('post_branch_init',
7143.15.2 by Jelmer Vernooij
Run autopep8.
343
                                               calls.append, None)
5107.3.6 by Marco Pantaleoni
Documented behaviour of 'post_branch_init' for lightweight checkouts.
344
        self.assertLength(0, calls)
345
        self.example_branch('a')
346
        self.assertLength(1, calls)
347
        self.run_bzr('checkout --lightweight a b')
348
        self.assertLength(2, calls)
349
5535.3.1 by Andrew Bennetts
Initial hack to make 'bzr branch' (and BzrDir.sprout) fetch all tags, not just branch tip.
350
    def test_branch_fetches_all_tags(self):
351
        builder = self.make_branch_builder('source')
7143.15.2 by Jelmer Vernooij
Run autopep8.
352
        source, rev1, rev2 = fixtures.build_branch_with_non_ancestral_rev(
353
            builder)
6747.3.2 by Jelmer Vernooij
Avoid more uses of revision_id.
354
        source.tags.set_tag('tag-a', rev2)
6404.6.7 by Vincent Ladeuil
Change set/remove to require a lock for the branch config files.
355
        source.get_config_stack().set('branch.fetch_tags', True)
5535.3.1 by Andrew Bennetts
Initial hack to make 'bzr branch' (and BzrDir.sprout) fetch all tags, not just branch tip.
356
        # Now source has a tag not in its ancestry.  Make a branch from it.
357
        self.run_bzr('branch source new-branch')
358
        new_branch = branch.Branch.open('new-branch')
359
        # The tag is present, and so is its revision.
6747.3.2 by Jelmer Vernooij
Avoid more uses of revision_id.
360
        self.assertEqual(rev2, new_branch.tags.lookup_tag('tag-a'))
361
        new_branch.repository.get_revision(rev2)
5535.3.1 by Andrew Bennetts
Initial hack to make 'bzr branch' (and BzrDir.sprout) fetch all tags, not just branch tip.
362
3665.2.5 by John Arbash Meinel
Test that we alert the user to the upgrade.
363
6423.1.1 by Vincent Ladeuil
Cleanup old blackbox tests and then some. Remove os.chdir() calls, caught a few bugs, make sure we don't leave file handles opened.
364
class TestBranchStacked(tests.TestCaseWithTransport):
3575.2.2 by Martin Pool
branch --stacked should force a stacked format
365
    """Tests for branch --stacked"""
366
3517.4.11 by Martin Pool
Improved blackbox tests for stacked branches
367
    def assertRevisionInRepository(self, repo_path, revid):
6423.1.1 by Vincent Ladeuil
Cleanup old blackbox tests and then some. Remove os.chdir() calls, caught a few bugs, make sure we don't leave file handles opened.
368
        """Check that a revision is in a repo, disregarding stacking."""
6472.2.2 by Jelmer Vernooij
Use controldir rather than bzrdir in a couple more places.
369
        repo = controldir.ControlDir.open(repo_path).open_repository()
3517.4.11 by Martin Pool
Improved blackbox tests for stacked branches
370
        self.assertTrue(repo.has_revision(revid))
371
372
    def assertRevisionNotInRepository(self, repo_path, revid):
6423.1.1 by Vincent Ladeuil
Cleanup old blackbox tests and then some. Remove os.chdir() calls, caught a few bugs, make sure we don't leave file handles opened.
373
        """Check that a revision is not in a repo, disregarding stacking."""
6472.2.2 by Jelmer Vernooij
Use controldir rather than bzrdir in a couple more places.
374
        repo = controldir.ControlDir.open(repo_path).open_repository()
3517.4.11 by Martin Pool
Improved blackbox tests for stacked branches
375
        self.assertFalse(repo.has_revision(revid))
3221.11.19 by Robert Collins
Branching a shallow branch gets a shallow branch.
376
3549.1.4 by Martin Pool
Branching a stacked branch should not automatically turn on stacking
377
    def assertRevisionsInBranchRepository(self, revid_list, branch_path):
378
        repo = branch.Branch.open(branch_path).repository
379
        self.assertEqual(set(revid_list),
7143.15.2 by Jelmer Vernooij
Run autopep8.
380
                         repo.has_revisions(revid_list))
3549.1.4 by Martin Pool
Branching a stacked branch should not automatically turn on stacking
381
382
    def test_branch_stacked_branch_not_stacked(self):
383
        """Branching a stacked branch is not stacked by default"""
3221.11.19 by Robert Collins
Branching a shallow branch gets a shallow branch.
384
        # We have a mainline
385
        trunk_tree = self.make_branch_and_tree('target',
7143.15.2 by Jelmer Vernooij
Run autopep8.
386
                                               format='1.9')
3221.11.19 by Robert Collins
Branching a shallow branch gets a shallow branch.
387
        trunk_tree.commit('mainline')
3221.20.3 by Ian Clatworthy
shallow -> stacked
388
        # and a branch from it which is stacked
3221.11.19 by Robert Collins
Branching a shallow branch gets a shallow branch.
389
        branch_tree = self.make_branch_and_tree('branch',
7143.15.2 by Jelmer Vernooij
Run autopep8.
390
                                                format='1.9')
3537.3.3 by Martin Pool
Rename Branch.set_stacked_on to set_stacked_on_url
391
        branch_tree.branch.set_stacked_on_url(trunk_tree.branch.base)
3221.11.19 by Robert Collins
Branching a shallow branch gets a shallow branch.
392
        # with some work on it
7143.15.2 by Jelmer Vernooij
Run autopep8.
393
        work_tree = trunk_tree.branch.controldir.sprout(
394
            'local').open_workingtree()
4595.4.4 by Robert Collins
Disable committing directly to stacked branches from lightweight checkouts.
395
        work_tree.commit('moar work plz')
396
        work_tree.branch.push(branch_tree.branch)
3221.11.19 by Robert Collins
Branching a shallow branch gets a shallow branch.
397
        # branching our local branch gives us a new stacked branch pointing at
398
        # mainline.
399
        out, err = self.run_bzr(['branch', 'branch', 'newbranch'])
7027.4.1 by Jelmer Vernooij
Use StringIOWithEncoding on Python3.
400
        self.assertEqual('', out)
401
        self.assertEqual('Branched 2 revisions.\n',
7143.15.2 by Jelmer Vernooij
Run autopep8.
402
                         err)
3575.2.2 by Martin Pool
branch --stacked should force a stacked format
403
        # it should have preserved the branch format, and so it should be
404
        # capable of supporting stacking, but not actually have a stacked_on
405
        # branch configured
3549.1.4 by Martin Pool
Branching a stacked branch should not automatically turn on stacking
406
        self.assertRaises(errors.NotStacked,
7143.15.2 by Jelmer Vernooij
Run autopep8.
407
                          controldir.ControlDir.open('newbranch').open_branch().get_stacked_on_url)
3549.1.4 by Martin Pool
Branching a stacked branch should not automatically turn on stacking
408
409
    def test_branch_stacked_branch_stacked(self):
410
        """Asking to stack on a stacked branch does work"""
411
        # We have a mainline
412
        trunk_tree = self.make_branch_and_tree('target',
7143.15.2 by Jelmer Vernooij
Run autopep8.
413
                                               format='1.9')
3549.1.4 by Martin Pool
Branching a stacked branch should not automatically turn on stacking
414
        trunk_revid = trunk_tree.commit('mainline')
415
        # and a branch from it which is stacked
416
        branch_tree = self.make_branch_and_tree('branch',
7143.15.2 by Jelmer Vernooij
Run autopep8.
417
                                                format='1.9')
3549.1.4 by Martin Pool
Branching a stacked branch should not automatically turn on stacking
418
        branch_tree.branch.set_stacked_on_url(trunk_tree.branch.base)
419
        # with some work on it
7143.15.2 by Jelmer Vernooij
Run autopep8.
420
        work_tree = trunk_tree.branch.controldir.sprout(
421
            'local').open_workingtree()
4595.4.4 by Robert Collins
Disable committing directly to stacked branches from lightweight checkouts.
422
        branch_revid = work_tree.commit('moar work plz')
423
        work_tree.branch.push(branch_tree.branch)
3549.1.4 by Martin Pool
Branching a stacked branch should not automatically turn on stacking
424
        # you can chain branches on from there
425
        out, err = self.run_bzr(['branch', 'branch', '--stacked', 'branch2'])
7027.4.1 by Jelmer Vernooij
Use StringIOWithEncoding on Python3.
426
        self.assertEqual('', out)
427
        self.assertEqual('Created new stacked branch referring to %s.\n' %
7143.15.2 by Jelmer Vernooij
Run autopep8.
428
                         branch_tree.branch.base, err)
3549.1.4 by Martin Pool
Branching a stacked branch should not automatically turn on stacking
429
        self.assertEqual(branch_tree.branch.base,
7143.15.2 by Jelmer Vernooij
Run autopep8.
430
                         branch.Branch.open('branch2').get_stacked_on_url())
3549.1.4 by Martin Pool
Branching a stacked branch should not automatically turn on stacking
431
        branch2_tree = WorkingTree.open('branch2')
4595.4.4 by Robert Collins
Disable committing directly to stacked branches from lightweight checkouts.
432
        branch2_revid = work_tree.commit('work on second stacked branch')
433
        work_tree.branch.push(branch2_tree.branch)
3549.1.4 by Martin Pool
Branching a stacked branch should not automatically turn on stacking
434
        self.assertRevisionInRepository('branch2', branch2_revid)
435
        self.assertRevisionsInBranchRepository(
436
            [trunk_revid, branch_revid, branch2_revid],
437
            'branch2')
3221.11.19 by Robert Collins
Branching a shallow branch gets a shallow branch.
438
3221.20.3 by Ian Clatworthy
shallow -> stacked
439
    def test_branch_stacked(self):
3221.11.20 by Robert Collins
Support --shallow on branch.
440
        # We have a mainline
441
        trunk_tree = self.make_branch_and_tree('mainline',
7143.15.2 by Jelmer Vernooij
Run autopep8.
442
                                               format='1.9')
3517.4.11 by Martin Pool
Improved blackbox tests for stacked branches
443
        original_revid = trunk_tree.commit('mainline')
444
        self.assertRevisionInRepository('mainline', original_revid)
3221.20.3 by Ian Clatworthy
shallow -> stacked
445
        # and a branch from it which is stacked
446
        out, err = self.run_bzr(['branch', '--stacked', 'mainline',
7143.15.2 by Jelmer Vernooij
Run autopep8.
447
                                 'newbranch'])
7027.4.1 by Jelmer Vernooij
Use StringIOWithEncoding on Python3.
448
        self.assertEqual('', out)
449
        self.assertEqual('Created new stacked branch referring to %s.\n' %
7143.15.2 by Jelmer Vernooij
Run autopep8.
450
                         trunk_tree.branch.base, err)
3517.4.11 by Martin Pool
Improved blackbox tests for stacked branches
451
        self.assertRevisionNotInRepository('newbranch', original_revid)
4595.4.4 by Robert Collins
Disable committing directly to stacked branches from lightweight checkouts.
452
        new_branch = branch.Branch.open('newbranch')
6423.1.1 by Vincent Ladeuil
Cleanup old blackbox tests and then some. Remove os.chdir() calls, caught a few bugs, make sure we don't leave file handles opened.
453
        self.assertEqual(trunk_tree.branch.base,
454
                         new_branch.get_stacked_on_url())
3221.11.20 by Robert Collins
Support --shallow on branch.
455
3221.15.10 by Robert Collins
Add test that we can stack on a smart server from Jonathan Lange.
456
    def test_branch_stacked_from_smart_server(self):
457
        # We can branch stacking on a smart server
5017.3.40 by Vincent Ladeuil
-s bb.test_branch passing
458
        self.transport_server = test_server.SmartTCPServer_for_testing
4241.6.8 by Robert Collins, John Arbash Meinel, Ian Clatworthy, Vincent Ladeuil
Add --development6-rich-root, disabling the legacy and unneeded development2 format, and activating the tests for CHK features disabled pending this format. (Robert Collins, John Arbash Meinel, Ian Clatworthy, Vincent Ladeuil)
459
        trunk = self.make_branch('mainline', format='1.9')
3221.15.10 by Robert Collins
Add test that we can stack on a smart server from Jonathan Lange.
460
        out, err = self.run_bzr(
461
            ['branch', '--stacked', self.get_url('mainline'), 'shallow'])
462
3575.2.2 by Martin Pool
branch --stacked should force a stacked format
463
    def test_branch_stacked_from_non_stacked_format(self):
464
        """The origin format doesn't support stacking"""
465
        trunk = self.make_branch('trunk', format='pack-0.92')
466
        out, err = self.run_bzr(
467
            ['branch', '--stacked', 'trunk', 'shallow'])
3665.2.5 by John Arbash Meinel
Test that we alert the user to the upgrade.
468
        # We should notify the user that we upgraded their format
3665.2.6 by John Arbash Meinel
Change the text a bit, and point to the explicit --1.6 or --1.6.1-rich-root bzrdir format.
469
        self.assertEqualDiff(
7027.4.1 by Jelmer Vernooij
Use StringIOWithEncoding on Python3.
470
            'Source repository format does not support stacking, using format:\n'
471
            '  Packs 5 (adds stacking support, requires bzr 1.6)\n'
472
            'Source branch format does not support stacking, using format:\n'
473
            '  Branch format 7\n'
474
            'Doing on-the-fly conversion from RepositoryFormatKnitPack1() to RepositoryFormatKnitPack5().\n'
475
            'This may take some time. Upgrade the repositories to the same format for better performance.\n'
476
            'Created new stacked branch referring to %s.\n' %
477
            (trunk.base,),
3665.2.6 by John Arbash Meinel
Change the text a bit, and point to the explicit --1.6 or --1.6.1-rich-root bzrdir format.
478
            err)
479
480
    def test_branch_stacked_from_rich_root_non_stackable(self):
481
        trunk = self.make_branch('trunk', format='rich-root-pack')
482
        out, err = self.run_bzr(
483
            ['branch', '--stacked', 'trunk', 'shallow'])
484
        # We should notify the user that we upgraded their format
485
        self.assertEqualDiff(
7027.4.1 by Jelmer Vernooij
Use StringIOWithEncoding on Python3.
486
            'Source repository format does not support stacking, using format:\n'
487
            '  Packs 5 rich-root (adds stacking support, requires bzr 1.6.1)\n'
488
            'Source branch format does not support stacking, using format:\n'
489
            '  Branch format 7\n'
490
            'Doing on-the-fly conversion from RepositoryFormatKnitPack4() to RepositoryFormatKnitPack5RichRoot().\n'
491
            'This may take some time. Upgrade the repositories to the same format for better performance.\n'
492
            'Created new stacked branch referring to %s.\n' % (trunk.base,),
3665.2.6 by John Arbash Meinel
Change the text a bit, and point to the explicit --1.6 or --1.6.1-rich-root bzrdir format.
493
            err)
494
3575.2.2 by Martin Pool
branch --stacked should force a stacked format
495
6423.1.1 by Vincent Ladeuil
Cleanup old blackbox tests and then some. Remove os.chdir() calls, caught a few bugs, make sure we don't leave file handles opened.
496
class TestSmartServerBranching(tests.TestCaseWithTransport):
4060.1.1 by Robert Collins
Add ratcheted acceptance test for branching from a smart server.
497
4060.1.4 by Robert Collins
Streaming fetch from remote servers.
498
    def test_branch_from_trivial_branch_to_same_server_branch_acceptance(self):
499
        self.setup_smart_server_with_call_log()
500
        t = self.make_branch_and_tree('from')
501
        for count in range(9):
502
            t.commit(message='commit %d' % count)
503
        self.reset_smart_call_log()
504
        out, err = self.run_bzr(['branch', self.get_url('from'),
7143.15.2 by Jelmer Vernooij
Run autopep8.
505
                                 self.get_url('target')])
4060.1.4 by Robert Collins
Streaming fetch from remote servers.
506
        # This figure represent the amount of work to perform this use case. It
507
        # is entirely ok to reduce this number if a test fails due to rpc_count
508
        # being too low. If rpc_count increases, more network roundtrips have
509
        # become necessary for this use case. Please do not adjust this number
510
        # upwards without agreement from bzr's network support maintainers.
6366.1.4 by Jelmer Vernooij
Test connection count calls for most blackbox commands.
511
        self.assertLength(2, self.hpss_connections)
6282.6.11 by Jelmer Vernooij
Adjust some call counts.
512
        self.assertLength(33, self.hpss_calls)
6352.2.2 by Jelmer Vernooij
Use new NoVfsCalls matcher in blackbox tests.
513
        self.expectFailure("branching to the same branch requires VFS access",
7143.15.2 by Jelmer Vernooij
Run autopep8.
514
                           self.assertThat, self.hpss_calls, ContainsNoVfsCalls)
4060.1.4 by Robert Collins
Streaming fetch from remote servers.
515
4060.1.1 by Robert Collins
Add ratcheted acceptance test for branching from a smart server.
516
    def test_branch_from_trivial_branch_streaming_acceptance(self):
517
        self.setup_smart_server_with_call_log()
518
        t = self.make_branch_and_tree('from')
519
        for count in range(9):
520
            t.commit(message='commit %d' % count)
521
        self.reset_smart_call_log()
4060.1.2 by Robert Collins
Get RemoteToOther inter repository logic using the generic fetch code, to permit eventual streaming from smart servers.
522
        out, err = self.run_bzr(['branch', self.get_url('from'),
7143.15.2 by Jelmer Vernooij
Run autopep8.
523
                                 'local-target'])
4060.1.1 by Robert Collins
Add ratcheted acceptance test for branching from a smart server.
524
        # This figure represent the amount of work to perform this use case. It
525
        # is entirely ok to reduce this number if a test fails due to rpc_count
526
        # being too low. If rpc_count increases, more network roundtrips have
527
        # become necessary for this use case. Please do not adjust this number
528
        # upwards without agreement from bzr's network support maintainers.
6352.2.3 by Jelmer Vernooij
s/NoVfsCalls/ContainsNoVfsCalls/.
529
        self.assertThat(self.hpss_calls, ContainsNoVfsCalls)
6015.15.3 by John Arbash Meinel
More cases that show the extra RPC
530
        self.assertLength(10, self.hpss_calls)
6366.1.4 by Jelmer Vernooij
Test connection count calls for most blackbox commands.
531
        self.assertLength(1, self.hpss_connections)
4060.1.1 by Robert Collins
Add ratcheted acceptance test for branching from a smart server.
532
4152.1.2 by Robert Collins
Add streaming from a stacked branch when the sort order is compatible with doing so.
533
    def test_branch_from_trivial_stacked_branch_streaming_acceptance(self):
534
        self.setup_smart_server_with_call_log()
535
        t = self.make_branch_and_tree('trunk')
536
        for count in range(8):
537
            t.commit(message='commit %d' % count)
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
538
        tree2 = t.branch.controldir.sprout('feature', stacked=True
7143.15.2 by Jelmer Vernooij
Run autopep8.
539
                                           ).open_workingtree()
540
        local_tree = t.branch.controldir.sprout(
541
            'local-working').open_workingtree()
4595.4.1 by Robert Collins
Fix test_branch_from_trivial_stacked_branch_streaming_acceptance to work with rich root formats, pending work on bug 375013.
542
        local_tree.commit('feature change')
543
        local_tree.branch.push(tree2.branch)
4152.1.2 by Robert Collins
Add streaming from a stacked branch when the sort order is compatible with doing so.
544
        self.reset_smart_call_log()
545
        out, err = self.run_bzr(['branch', self.get_url('feature'),
7143.15.2 by Jelmer Vernooij
Run autopep8.
546
                                 'local-target'])
4152.1.2 by Robert Collins
Add streaming from a stacked branch when the sort order is compatible with doing so.
547
        # This figure represent the amount of work to perform this use case. It
548
        # is entirely ok to reduce this number if a test fails due to rpc_count
549
        # being too low. If rpc_count increases, more network roundtrips have
550
        # become necessary for this use case. Please do not adjust this number
551
        # upwards without agreement from bzr's network support maintainers.
6015.15.3 by John Arbash Meinel
More cases that show the extra RPC
552
        self.assertLength(15, self.hpss_calls)
6366.1.4 by Jelmer Vernooij
Test connection count calls for most blackbox commands.
553
        self.assertLength(1, self.hpss_connections)
6282.6.42 by Jelmer Vernooij
merge hpss-get-checkout-format.
554
        self.assertThat(self.hpss_calls, ContainsNoVfsCalls)
4152.1.2 by Robert Collins
Add streaming from a stacked branch when the sort order is compatible with doing so.
555
5535.4.7 by Andrew Bennetts
Add HPSS acceptance test.
556
    def test_branch_from_branch_with_tags(self):
557
        self.setup_smart_server_with_call_log()
558
        builder = self.make_branch_builder('source')
7143.15.2 by Jelmer Vernooij
Run autopep8.
559
        source, rev1, rev2 = fixtures.build_branch_with_non_ancestral_rev(
560
            builder)
6404.1.1 by Vincent Ladeuil
Migrate branch.fetch_tags
561
        source.get_config_stack().set('branch.fetch_tags', True)
6747.3.2 by Jelmer Vernooij
Avoid more uses of revision_id.
562
        source.tags.set_tag('tag-a', rev2)
7045.2.4 by Jelmer Vernooij
Fix some more.
563
        source.tags.set_tag('tag-missing', b'missing-rev')
5535.4.7 by Andrew Bennetts
Add HPSS acceptance test.
564
        # Now source has a tag not in its ancestry.  Make a branch from it.
565
        self.reset_smart_call_log()
566
        out, err = self.run_bzr(['branch', self.get_url('source'), 'target'])
567
        # This figure represent the amount of work to perform this use case. It
568
        # is entirely ok to reduce this number if a test fails due to rpc_count
569
        # being too low. If rpc_count increases, more network roundtrips have
570
        # become necessary for this use case. Please do not adjust this number
571
        # upwards without agreement from bzr's network support maintainers.
6015.15.2 by John Arbash Meinel
This adds one more hpss round trip to determine the configuration setting.
572
        self.assertLength(10, self.hpss_calls)
6352.2.3 by Jelmer Vernooij
s/NoVfsCalls/ContainsNoVfsCalls/.
573
        self.assertThat(self.hpss_calls, ContainsNoVfsCalls)
6366.1.4 by Jelmer Vernooij
Test connection count calls for most blackbox commands.
574
        self.assertLength(1, self.hpss_connections)
5535.4.7 by Andrew Bennetts
Add HPSS acceptance test.
575
5816.8.1 by Andrew Bennetts
Be a little more clever about constructing a parents provider for stacked repositories, so that get_parent_map with local-stacked-on-remote doesn't use HPSS VFS calls.
576
    def test_branch_to_stacked_from_trivial_branch_streaming_acceptance(self):
577
        self.setup_smart_server_with_call_log()
578
        t = self.make_branch_and_tree('from')
579
        for count in range(9):
580
            t.commit(message='commit %d' % count)
581
        self.reset_smart_call_log()
582
        out, err = self.run_bzr(['branch', '--stacked', self.get_url('from'),
7143.15.2 by Jelmer Vernooij
Run autopep8.
583
                                 'local-target'])
5816.8.6 by Andrew Bennetts
Fix another bug, and some cosmetic nits.
584
        # XXX: the number of hpss calls for this case isn't deterministic yet,
5816.8.1 by Andrew Bennetts
Be a little more clever about constructing a parents provider for stacked repositories, so that get_parent_map with local-stacked-on-remote doesn't use HPSS VFS calls.
585
        # so we can't easily assert about the number of calls.
586
        #self.assertLength(XXX, self.hpss_calls)
587
        # We can assert that none of the calls were readv requests for rix
588
        # files, though (demonstrating that at least get_parent_map calls are
589
        # not using VFS RPCs).
590
        readvs_of_rix_files = [
591
            c for c in self.hpss_calls
592
            if c.call.method == 'readv' and c.call.args[-1].endswith('.rix')]
6366.1.4 by Jelmer Vernooij
Test connection count calls for most blackbox commands.
593
        self.assertLength(1, self.hpss_connections)
5816.8.1 by Andrew Bennetts
Be a little more clever about constructing a parents provider for stacked repositories, so that get_parent_map with local-stacked-on-remote doesn't use HPSS VFS calls.
594
        self.assertLength(0, readvs_of_rix_files)
6352.2.2 by Jelmer Vernooij
Use new NoVfsCalls matcher in blackbox tests.
595
        self.expectFailure("branching to stacked requires VFS access",
7143.15.2 by Jelmer Vernooij
Run autopep8.
596
                           self.assertThat, self.hpss_calls, ContainsNoVfsCalls)
5816.8.1 by Andrew Bennetts
Be a little more clever about constructing a parents provider for stacked repositories, so that get_parent_map with local-stacked-on-remote doesn't use HPSS VFS calls.
597
6989.3.2 by Jelmer Vernooij
Add HPSS call get_stream_for_missing_keys.
598
    def test_branch_from_branch_with_ghosts(self):
599
        self.setup_smart_server_with_call_log()
600
        t = self.make_branch_and_tree('from')
601
        for count in range(9):
602
            t.commit(message='commit %d' % count)
603
        t.set_parent_ids([t.last_revision(), b'ghost'])
604
        t.commit(message='add commit with parent')
605
        self.reset_smart_call_log()
606
        out, err = self.run_bzr(['branch', self.get_url('from'),
7143.15.2 by Jelmer Vernooij
Run autopep8.
607
                                 'local-target'])
6989.3.2 by Jelmer Vernooij
Add HPSS call get_stream_for_missing_keys.
608
        # This figure represent the amount of work to perform this use case. It
609
        # is entirely ok to reduce this number if a test fails due to rpc_count
610
        # being too low. If rpc_count increases, more network roundtrips have
611
        # become necessary for this use case. Please do not adjust this number
612
        # upwards without agreement from bzr's network support maintainers.
613
        self.assertThat(self.hpss_calls, ContainsNoVfsCalls)
614
        self.assertLength(11, self.hpss_calls)
615
        self.assertLength(1, self.hpss_connections)
616
1711.2.5 by John Arbash Meinel
Factoring blackbox tests into their own file.
617
2485.8.59 by Vincent Ladeuil
Update from review comments.
618
class TestRemoteBranch(TestCaseWithSFTPServer):
619
620
    def setUp(self):
621
        super(TestRemoteBranch, self).setUp()
622
        tree = self.make_branch_and_tree('branch')
6855.4.1 by Jelmer Vernooij
Yet more bees.
623
        self.build_tree_contents([('branch/file', b'file content\n')])
2485.8.59 by Vincent Ladeuil
Update from review comments.
624
        tree.add('file')
625
        tree.commit('file created')
626
627
    def test_branch_local_remote(self):
628
        self.run_bzr(['branch', 'branch', self.get_url('remote')])
629
        t = self.get_transport()
2485.8.62 by Vincent Ladeuil
From review comments, fix typos and deprecate some functions.
630
        # Ensure that no working tree what created remotely
2485.8.59 by Vincent Ladeuil
Update from review comments.
631
        self.assertFalse(t.has('remote/file'))
632
633
    def test_branch_remote_remote(self):
634
        # Light cheat: we access the branch remotely
635
        self.run_bzr(['branch', self.get_url('branch'),
636
                      self.get_url('remote')])
637
        t = self.get_transport()
2485.8.62 by Vincent Ladeuil
From review comments, fix typos and deprecate some functions.
638
        # Ensure that no working tree what created remotely
2485.8.59 by Vincent Ladeuil
Update from review comments.
639
        self.assertFalse(t.has('remote/file'))
640
5741.3.3 by Martin Pool
Add a blackbox test for deprecation of commands
641
5816.7.1 by Vincent Ladeuil
Remove duplication and simplify.
642
class TestBranchParentLocation(test_switch.TestSwitchParentLocationBase):
643
644
    def _checkout_and_branch(self, option=''):
645
        self.script_runner.run_script(self, '''
6622.1.29 by Jelmer Vernooij
Fix some more tests.
646
                $ brz checkout %(option)s repo/trunk checkout
5816.7.1 by Vincent Ladeuil
Remove duplication and simplify.
647
                $ cd checkout
6622.1.29 by Jelmer Vernooij
Fix some more tests.
648
                $ brz branch --switch ../repo/trunk ../repo/branched
6143.1.4 by Jonathan Riddell
update tests
649
                2>Branched 0 revisions.
5816.6.8 by A. S. Budden
Refactored to use common generation code for lightweight and heavyweight.
650
                2>Tree is up to date at revision 0.
5816.7.1 by Vincent Ladeuil
Remove duplication and simplify.
651
                2>Switched to branch:...branched...
5816.6.11 by A. S. Budden
Refactored assertParentCorrect to check the full path.
652
                $ cd ..
5816.6.10 by A. S. Budden
Use locals() instead of kwargs for more explicit parameters.
653
                ''' % locals())
5816.7.1 by Vincent Ladeuil
Remove duplication and simplify.
654
        bound_branch = branch.Branch.open_containing('checkout')[0]
655
        master_branch = branch.Branch.open_containing('repo/branched')[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.
656
        return (bound_branch, master_branch)
5816.6.8 by A. S. Budden
Refactored to use common generation code for lightweight and heavyweight.
657
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.
658
    def test_branch_switch_parent_lightweight(self):
6622.1.29 by Jelmer Vernooij
Fix some more tests.
659
        """Lightweight checkout using brz branch --switch."""
5816.7.1 by Vincent Ladeuil
Remove duplication and simplify.
660
        bb, mb = self._checkout_and_branch(option='--lightweight')
661
        self.assertParent('repo/trunk', bb)
662
        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.
663
664
    def test_branch_switch_parent_heavyweight(self):
6622.1.29 by Jelmer Vernooij
Fix some more tests.
665
        """Heavyweight checkout using brz branch --switch."""
5816.7.1 by Vincent Ladeuil
Remove duplication and simplify.
666
        bb, mb = self._checkout_and_branch()
667
        self.assertParent('repo/trunk', bb)
668
        self.assertParent('repo/trunk', mb)