~bzr-pqm/bzr/bzr.dev

4763.2.4 by John Arbash Meinel
merge bzr.2.1 in preparation for NEWS entry.
1
# Copyright (C) 2006-2010 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
18
"""Black-box tests for bzr branch."""
19
20
import os
21
4596.2.3 by Lukáš Lalinský
Add tests for various situations
22
from bzrlib import (
23
    branch,
24
    bzrdir,
25
    errors,
26
    repository,
27
    revision as _mod_revision,
28
    )
2241.1.6 by Martin Pool
Move Knit repositories into the submodule bzrlib.repofmt.knitrepo and
29
from bzrlib.repofmt.knitrepo import RepositoryFormatKnit1
5283.4.5 by Martin Pool
Update remaining subclasses of ExternalBase
30
from bzrlib.tests import TestCaseWithTransport
4580.4.2 by Martin Pool
Add KnownFailure for branch --hardlink
31
from bzrlib.tests import (
32
    KnownFailure,
33
    HardlinkFeature,
5017.3.40 by Vincent Ladeuil
-s bb.test_branch passing
34
    test_server,
4580.4.2 by Martin Pool
Add KnownFailure for branch --hardlink
35
    )
2485.8.59 by Vincent Ladeuil
Update from review comments.
36
from bzrlib.tests.test_sftp_transport import TestCaseWithSFTPServer
3696.2.4 by Daniel Watkins
Fixed test to cope with trailing slashes.
37
from bzrlib.urlutils import local_path_to_url, strip_trailing_slash
1711.2.6 by John Arbash Meinel
Creating a test case for bug 43713, bzr branch does the right thing
38
from bzrlib.workingtree import WorkingTree
1711.2.5 by John Arbash Meinel
Factoring blackbox tests into their own file.
39
40
5283.4.5 by Martin Pool
Update remaining subclasses of ExternalBase
41
class TestBranch(TestCaseWithTransport):
1711.2.5 by John Arbash Meinel
Factoring blackbox tests into their own file.
42
2664.8.2 by Daniel Watkins
tests.blackbox.test_branch now uses internals where appropriate.
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')
1711.2.5 by John Arbash Meinel
Factoring blackbox tests into their own file.
51
52
    def test_branch(self):
53
        """Branch from one branch to another."""
2664.8.2 by Daniel Watkins
tests.blackbox.test_branch now uses internals where appropriate.
54
        self.example_branch('a')
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
55
        self.run_bzr('branch a b')
1773.4.1 by Martin Pool
Add pyflakes makefile target; fix many warnings
56
        b = branch.Branch.open('b')
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
57
        self.run_bzr('branch a c -r 1')
3400.1.3 by Martin Pool
Merge trunk
58
        # previously was erroneously created by branching
3407.2.14 by Martin Pool
Remove more cases of getting transport via control_files
59
        self.assertFalse(b._transport.has('branch-name'))
2664.8.2 by Daniel Watkins
tests.blackbox.test_branch now uses internals where appropriate.
60
        b.bzrdir.open_workingtree().commit(message='foo', allow_pointless=True)
1711.2.5 by John Arbash Meinel
Factoring blackbox tests into their own file.
61
4596.2.3 by Lukáš Lalinský
Add tests for various situations
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
4596.2.1 by Lukáš Lalinský
Add support for `bzr branch --switch`
87
    def test_branch_switch_no_checkout(self):
4596.2.3 by Lukáš Lalinský
Add tests for various situations
88
        # Standalone branch in the current directory:
89
        #  => new branch will be created, but switch fails and the current
90
        #     branch is unmodified
4596.2.1 by Lukáš Lalinský
Add support for `bzr branch --switch`
91
        self.example_branch('a')
4596.2.3 by Lukáš Lalinský
Add tests for various situations
92
        self.make_branch_and_tree('current')
4596.2.1 by Lukáš Lalinský
Add support for `bzr branch --switch`
93
        self.run_bzr_error(['Cannot switch a branch, only a checkout'],
4596.2.3 by Lukáš Lalinský
Add tests for various situations
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/')
4596.2.1 by Lukáš Lalinský
Add support for `bzr branch --switch`
126
        self.assertContainsRe(err, "Switched to branch: .*/b/")
127
1711.2.6 by John Arbash Meinel
Creating a test case for bug 43713, bzr branch does the right thing
128
    def test_branch_only_copies_history(self):
129
        # Knit branches should only push the history for the current revision.
1773.4.1 by Martin Pool
Add pyflakes makefile target; fix many warnings
130
        format = bzrdir.BzrDirMetaFormat1()
1711.2.6 by John Arbash Meinel
Creating a test case for bug 43713, bzr branch does the right thing
131
        format.repository_format = RepositoryFormatKnit1()
132
        shared_repo = self.make_repository('repo', format=format, shared=True)
133
        shared_repo.set_make_working_trees(True)
134
135
        def make_shared_tree(path):
136
            shared_repo.bzrdir.root_transport.mkdir(path)
137
            shared_repo.bzrdir.create_branch_convenience('repo/' + path)
138
            return WorkingTree.open('repo/' + path)
139
        tree_a = make_shared_tree('a')
140
        self.build_tree(['repo/a/file'])
141
        tree_a.add('file')
142
        tree_a.commit('commit a-1', rev_id='a-1')
143
        f = open('repo/a/file', 'ab')
144
        f.write('more stuff\n')
145
        f.close()
146
        tree_a.commit('commit a-2', rev_id='a-2')
147
148
        tree_b = make_shared_tree('b')
149
        self.build_tree(['repo/b/file'])
150
        tree_b.add('file')
151
        tree_b.commit('commit b-1', rev_id='b-1')
152
153
        self.assertTrue(shared_repo.has_revision('a-1'))
154
        self.assertTrue(shared_repo.has_revision('a-2'))
155
        self.assertTrue(shared_repo.has_revision('b-1'))
156
157
        # Now that we have a repository with shared files, make sure
158
        # that things aren't copied out by a 'branch'
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
159
        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
160
        pushed_tree = WorkingTree.open('branch-b')
161
        pushed_repo = pushed_tree.branch.repository
162
        self.assertFalse(pushed_repo.has_revision('a-1'))
163
        self.assertFalse(pushed_repo.has_revision('a-2'))
164
        self.assertTrue(pushed_repo.has_revision('b-1'))
165
3136.1.3 by Aaron Bentley
Implement hard-link support for branch and checkout
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')
4580.4.2 by Martin Pool
Add KnownFailure for branch --hardlink
172
        out, err = self.run_bzr(['branch', 'source', 'target', '--hardlink'])
3136.1.3 by Aaron Bentley
Implement hard-link support for branch and checkout
173
        source_stat = os.stat('source/file1')
174
        target_stat = os.stat('target/file1')
4826.1.3 by Andrew Bennetts
Remove KnownFailure from test_branch_hardlink.
175
        self.assertEqual(source_stat, target_stat)
3136.1.3 by Aaron Bentley
Implement hard-link support for branch and checkout
176
5353.2.2 by John Arbash Meinel
update the test suite.
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.failUnlessExists('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)
5353.2.5 by John Arbash Meinel
We need to assert that the --hardlink makes the files the same, not different.
198
        self.assertEqual(second_stat, target_stat)
5353.2.2 by John Arbash Meinel
update the test suite.
199
3696.2.1 by Daniel Watkins
Added test for 'branch --standalone'.
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')
3696.2.4 by Daniel Watkins
Fixed test to cope with trailing slashes.
206
        self.assertEqual(strip_trailing_slash(b.repository.base),
207
            strip_trailing_slash(local_path_to_url(expected_repo_path)))
3696.2.1 by Daniel Watkins
Added test for 'branch --standalone'.
208
3983.1.5 by Daniel Watkins
Added blackbox test.
209
    def test_branch_no_tree(self):
210
        self.example_branch('source')
211
        self.run_bzr('branch --no-tree source target')
212
        self.failIfExists('target/hello')
213
        self.failIfExists('target/goodbye')
214
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.
215
    def test_branch_into_existing_dir(self):
216
        self.example_branch('a')
4479.2.2 by Vincent Ladeuil
Fix typos and add NEWS entry.
217
        # existing dir with similar files but no .bzr dir
218
        self.build_tree_contents([('b/',)])
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.
219
        self.build_tree_contents([('b/hello', 'bar')])  # different content
4479.2.2 by Vincent Ladeuil
Fix typos and add NEWS entry.
220
        self.build_tree_contents([('b/goodbye', 'baz')])# same content
221
        # fails without --use-existing-dir
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.
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.failUnlessExists('b/hello.moved')
230
        self.failIfExists('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
4927.3.1 by Ian Clatworthy
branch --bind option
236
    def test_branch_bind(self):
237
        self.example_branch('a')
238
        out, err = self.run_bzr('branch a b --bind')
4948.3.1 by Ian Clatworthy
branch --bind option
239
        self.assertEndsWith(err, "New branch bound to a\n")
4927.3.1 by Ian Clatworthy
branch --bind option
240
        b = branch.Branch.open('b')
241
        self.assertEndsWith(b.get_bound_location(), '/a/')
242
5107.3.6 by Marco Pantaleoni
Documented behaviour of 'post_branch_init' for lightweight checkouts.
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
3665.2.5 by John Arbash Meinel
Test that we alert the user to the upgrade.
273
5283.4.5 by Martin Pool
Update remaining subclasses of ExternalBase
274
class TestBranchStacked(TestCaseWithTransport):
3575.2.2 by Martin Pool
branch --stacked should force a stacked format
275
    """Tests for branch --stacked"""
276
3517.4.11 by Martin Pool
Improved blackbox tests for stacked branches
277
    def assertRevisionInRepository(self, repo_path, revid):
278
        """Check that a revision is in a repository, disregarding stacking."""
279
        repo = bzrdir.BzrDir.open(repo_path).open_repository()
280
        self.assertTrue(repo.has_revision(revid))
281
282
    def assertRevisionNotInRepository(self, repo_path, revid):
283
        """Check that a revision is not in a repository, disregarding stacking."""
284
        repo = bzrdir.BzrDir.open(repo_path).open_repository()
285
        self.assertFalse(repo.has_revision(revid))
3221.11.19 by Robert Collins
Branching a shallow branch gets a shallow branch.
286
3549.1.4 by Martin Pool
Branching a stacked branch should not automatically turn on stacking
287
    def assertRevisionsInBranchRepository(self, revid_list, branch_path):
288
        repo = branch.Branch.open(branch_path).repository
289
        self.assertEqual(set(revid_list),
290
            repo.has_revisions(revid_list))
291
292
    def test_branch_stacked_branch_not_stacked(self):
293
        """Branching a stacked branch is not stacked by default"""
3221.11.19 by Robert Collins
Branching a shallow branch gets a shallow branch.
294
        # We have a mainline
295
        trunk_tree = self.make_branch_and_tree('target',
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)
296
            format='1.9')
3221.11.19 by Robert Collins
Branching a shallow branch gets a shallow branch.
297
        trunk_tree.commit('mainline')
3221.20.3 by Ian Clatworthy
shallow -> stacked
298
        # and a branch from it which is stacked
3221.11.19 by Robert Collins
Branching a shallow branch gets a shallow branch.
299
        branch_tree = self.make_branch_and_tree('branch',
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)
300
            format='1.9')
3537.3.3 by Martin Pool
Rename Branch.set_stacked_on to set_stacked_on_url
301
        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.
302
        # with some work on it
4595.4.4 by Robert Collins
Disable committing directly to stacked branches from lightweight checkouts.
303
        work_tree = trunk_tree.branch.bzrdir.sprout('local').open_workingtree()
304
        work_tree.commit('moar work plz')
305
        work_tree.branch.push(branch_tree.branch)
3221.11.19 by Robert Collins
Branching a shallow branch gets a shallow branch.
306
        # branching our local branch gives us a new stacked branch pointing at
307
        # mainline.
308
        out, err = self.run_bzr(['branch', 'branch', 'newbranch'])
309
        self.assertEqual('', out)
4595.4.4 by Robert Collins
Disable committing directly to stacked branches from lightweight checkouts.
310
        self.assertEqual('Branched 2 revision(s).\n',
3549.1.4 by Martin Pool
Branching a stacked branch should not automatically turn on stacking
311
            err)
3575.2.2 by Martin Pool
branch --stacked should force a stacked format
312
        # it should have preserved the branch format, and so it should be
313
        # capable of supporting stacking, but not actually have a stacked_on
314
        # branch configured
3549.1.4 by Martin Pool
Branching a stacked branch should not automatically turn on stacking
315
        self.assertRaises(errors.NotStacked,
316
            bzrdir.BzrDir.open('newbranch').open_branch().get_stacked_on_url)
317
318
    def test_branch_stacked_branch_stacked(self):
319
        """Asking to stack on a stacked branch does work"""
320
        # We have a mainline
321
        trunk_tree = self.make_branch_and_tree('target',
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)
322
            format='1.9')
3549.1.4 by Martin Pool
Branching a stacked branch should not automatically turn on stacking
323
        trunk_revid = trunk_tree.commit('mainline')
324
        # and a branch from it which is stacked
325
        branch_tree = self.make_branch_and_tree('branch',
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)
326
            format='1.9')
3549.1.4 by Martin Pool
Branching a stacked branch should not automatically turn on stacking
327
        branch_tree.branch.set_stacked_on_url(trunk_tree.branch.base)
328
        # with some work on it
4595.4.4 by Robert Collins
Disable committing directly to stacked branches from lightweight checkouts.
329
        work_tree = trunk_tree.branch.bzrdir.sprout('local').open_workingtree()
330
        branch_revid = work_tree.commit('moar work plz')
331
        work_tree.branch.push(branch_tree.branch)
3549.1.4 by Martin Pool
Branching a stacked branch should not automatically turn on stacking
332
        # you can chain branches on from there
333
        out, err = self.run_bzr(['branch', 'branch', '--stacked', 'branch2'])
334
        self.assertEqual('', out)
3221.20.3 by Ian Clatworthy
shallow -> stacked
335
        self.assertEqual('Created new stacked branch referring to %s.\n' %
3549.1.4 by Martin Pool
Branching a stacked branch should not automatically turn on stacking
336
            branch_tree.branch.base, err)
337
        self.assertEqual(branch_tree.branch.base,
338
            branch.Branch.open('branch2').get_stacked_on_url())
339
        branch2_tree = WorkingTree.open('branch2')
4595.4.4 by Robert Collins
Disable committing directly to stacked branches from lightweight checkouts.
340
        branch2_revid = work_tree.commit('work on second stacked branch')
341
        work_tree.branch.push(branch2_tree.branch)
3549.1.4 by Martin Pool
Branching a stacked branch should not automatically turn on stacking
342
        self.assertRevisionInRepository('branch2', branch2_revid)
343
        self.assertRevisionsInBranchRepository(
344
            [trunk_revid, branch_revid, branch2_revid],
345
            'branch2')
3221.11.19 by Robert Collins
Branching a shallow branch gets a shallow branch.
346
3221.20.3 by Ian Clatworthy
shallow -> stacked
347
    def test_branch_stacked(self):
3221.11.20 by Robert Collins
Support --shallow on branch.
348
        # We have a mainline
349
        trunk_tree = self.make_branch_and_tree('mainline',
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)
350
            format='1.9')
3517.4.11 by Martin Pool
Improved blackbox tests for stacked branches
351
        original_revid = trunk_tree.commit('mainline')
352
        self.assertRevisionInRepository('mainline', original_revid)
3221.20.3 by Ian Clatworthy
shallow -> stacked
353
        # and a branch from it which is stacked
354
        out, err = self.run_bzr(['branch', '--stacked', 'mainline',
3221.20.1 by Ian Clatworthy
tweaks by igc during review
355
            'newbranch'])
3221.11.20 by Robert Collins
Support --shallow on branch.
356
        self.assertEqual('', out)
3221.20.3 by Ian Clatworthy
shallow -> stacked
357
        self.assertEqual('Created new stacked branch referring to %s.\n' %
3221.11.20 by Robert Collins
Support --shallow on branch.
358
            trunk_tree.branch.base, err)
3517.4.11 by Martin Pool
Improved blackbox tests for stacked branches
359
        self.assertRevisionNotInRepository('newbranch', original_revid)
4595.4.4 by Robert Collins
Disable committing directly to stacked branches from lightweight checkouts.
360
        new_branch = branch.Branch.open('newbranch')
361
        self.assertEqual(trunk_tree.branch.base, new_branch.get_stacked_on_url())
3221.11.20 by Robert Collins
Support --shallow on branch.
362
3221.15.10 by Robert Collins
Add test that we can stack on a smart server from Jonathan Lange.
363
    def test_branch_stacked_from_smart_server(self):
364
        # We can branch stacking on a smart server
5017.3.40 by Vincent Ladeuil
-s bb.test_branch passing
365
        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)
366
        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.
367
        out, err = self.run_bzr(
368
            ['branch', '--stacked', self.get_url('mainline'), 'shallow'])
369
3575.2.2 by Martin Pool
branch --stacked should force a stacked format
370
    def test_branch_stacked_from_non_stacked_format(self):
371
        """The origin format doesn't support stacking"""
372
        trunk = self.make_branch('trunk', format='pack-0.92')
373
        out, err = self.run_bzr(
374
            ['branch', '--stacked', 'trunk', 'shallow'])
3665.2.5 by John Arbash Meinel
Test that we alert the user to the upgrade.
375
        # 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.
376
        self.assertEqualDiff(
4401.1.3 by John Arbash Meinel
Change back to defaulting to --1.6 format, and update the blackbox tests.
377
            'Source repository format does not support stacking, using format:\n'
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.
378
            '  Packs 5 (adds stacking support, requires bzr 1.6)\n'
4401.1.3 by John Arbash Meinel
Change back to defaulting to --1.6 format, and update the blackbox tests.
379
            'Source branch format does not support stacking, using format:\n'
380
            '  Branch format 7\n'
4634.144.6 by Martin Pool
Branching that does an implicit conversion now shows the fetch warning
381
            'Doing on-the-fly conversion from RepositoryFormatKnitPack1() to RepositoryFormatKnitPack5().\n'
382
            'This may take some time. Upgrade the repositories to the same format for better performance.\n'
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.
383
            'Created new stacked branch referring to %s.\n' % (trunk.base,),
384
            err)
385
386
    def test_branch_stacked_from_rich_root_non_stackable(self):
387
        trunk = self.make_branch('trunk', format='rich-root-pack')
388
        out, err = self.run_bzr(
389
            ['branch', '--stacked', 'trunk', 'shallow'])
390
        # We should notify the user that we upgraded their format
391
        self.assertEqualDiff(
4401.1.3 by John Arbash Meinel
Change back to defaulting to --1.6 format, and update the blackbox tests.
392
            'Source repository format does not support stacking, using format:\n'
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.
393
            '  Packs 5 rich-root (adds stacking support, requires bzr 1.6.1)\n'
4401.1.3 by John Arbash Meinel
Change back to defaulting to --1.6 format, and update the blackbox tests.
394
            'Source branch format does not support stacking, using format:\n'
395
            '  Branch format 7\n'
4634.144.6 by Martin Pool
Branching that does an implicit conversion now shows the fetch warning
396
            'Doing on-the-fly conversion from RepositoryFormatKnitPack4() to RepositoryFormatKnitPack5RichRoot().\n'
397
            'This may take some time. Upgrade the repositories to the same format for better performance.\n'
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.
398
            'Created new stacked branch referring to %s.\n' % (trunk.base,),
399
            err)
400
3575.2.2 by Martin Pool
branch --stacked should force a stacked format
401
5283.4.5 by Martin Pool
Update remaining subclasses of ExternalBase
402
class TestSmartServerBranching(TestCaseWithTransport):
4060.1.1 by Robert Collins
Add ratcheted acceptance test for branching from a smart server.
403
4060.1.4 by Robert Collins
Streaming fetch from remote servers.
404
    def test_branch_from_trivial_branch_to_same_server_branch_acceptance(self):
405
        self.setup_smart_server_with_call_log()
406
        t = self.make_branch_and_tree('from')
407
        for count in range(9):
408
            t.commit(message='commit %d' % count)
409
        self.reset_smart_call_log()
410
        out, err = self.run_bzr(['branch', self.get_url('from'),
411
            self.get_url('target')])
412
        # This figure represent the amount of work to perform this use case. It
413
        # is entirely ok to reduce this number if a test fails due to rpc_count
414
        # being too low. If rpc_count increases, more network roundtrips have
415
        # become necessary for this use case. Please do not adjust this number
416
        # upwards without agreement from bzr's network support maintainers.
4454.2.2 by John Arbash Meinel
turns out the new code removes a round trip to the server, which bumps an acceptance test.
417
        self.assertLength(38, self.hpss_calls)
4060.1.4 by Robert Collins
Streaming fetch from remote servers.
418
4060.1.1 by Robert Collins
Add ratcheted acceptance test for branching from a smart server.
419
    def test_branch_from_trivial_branch_streaming_acceptance(self):
420
        self.setup_smart_server_with_call_log()
421
        t = self.make_branch_and_tree('from')
422
        for count in range(9):
423
            t.commit(message='commit %d' % count)
424
        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.
425
        out, err = self.run_bzr(['branch', self.get_url('from'),
426
            'local-target'])
4060.1.1 by Robert Collins
Add ratcheted acceptance test for branching from a smart server.
427
        # This figure represent the amount of work to perform this use case. It
428
        # is entirely ok to reduce this number if a test fails due to rpc_count
429
        # being too low. If rpc_count increases, more network roundtrips have
430
        # become necessary for this use case. Please do not adjust this number
431
        # upwards without agreement from bzr's network support maintainers.
4226.1.5 by Robert Collins
Reinstate the use of the Branch.get_config_file verb.
432
        self.assertLength(10, self.hpss_calls)
4060.1.1 by Robert Collins
Add ratcheted acceptance test for branching from a smart server.
433
4152.1.2 by Robert Collins
Add streaming from a stacked branch when the sort order is compatible with doing so.
434
    def test_branch_from_trivial_stacked_branch_streaming_acceptance(self):
435
        self.setup_smart_server_with_call_log()
436
        t = self.make_branch_and_tree('trunk')
437
        for count in range(8):
438
            t.commit(message='commit %d' % count)
439
        tree2 = t.branch.bzrdir.sprout('feature', stacked=True
440
            ).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.
441
        local_tree = t.branch.bzrdir.sprout('local-working').open_workingtree()
442
        local_tree.commit('feature change')
443
        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.
444
        self.reset_smart_call_log()
445
        out, err = self.run_bzr(['branch', self.get_url('feature'),
446
            'local-target'])
447
        # This figure represent the amount of work to perform this use case. It
448
        # is entirely ok to reduce this number if a test fails due to rpc_count
449
        # being too low. If rpc_count increases, more network roundtrips have
450
        # become necessary for this use case. Please do not adjust this number
451
        # upwards without agreement from bzr's network support maintainers.
4226.1.1 by Robert Collins
RemoteRepository.add_fallback_repository no longer calls ensure_real. (Robert Collins, Andrew Bennetts)
452
        self.assertLength(15, self.hpss_calls)
4152.1.2 by Robert Collins
Add streaming from a stacked branch when the sort order is compatible with doing so.
453
1711.2.5 by John Arbash Meinel
Factoring blackbox tests into their own file.
454
2485.8.59 by Vincent Ladeuil
Update from review comments.
455
class TestRemoteBranch(TestCaseWithSFTPServer):
456
457
    def setUp(self):
458
        super(TestRemoteBranch, self).setUp()
459
        tree = self.make_branch_and_tree('branch')
460
        self.build_tree_contents([('branch/file', 'file content\n')])
461
        tree.add('file')
462
        tree.commit('file created')
463
464
    def test_branch_local_remote(self):
465
        self.run_bzr(['branch', 'branch', self.get_url('remote')])
466
        t = self.get_transport()
2485.8.62 by Vincent Ladeuil
From review comments, fix typos and deprecate some functions.
467
        # Ensure that no working tree what created remotely
2485.8.59 by Vincent Ladeuil
Update from review comments.
468
        self.assertFalse(t.has('remote/file'))
469
470
    def test_branch_remote_remote(self):
471
        # Light cheat: we access the branch remotely
472
        self.run_bzr(['branch', self.get_url('branch'),
473
                      self.get_url('remote')])
474
        t = self.get_transport()
2485.8.62 by Vincent Ladeuil
From review comments, fix typos and deprecate some functions.
475
        # Ensure that no working tree what created remotely
2485.8.59 by Vincent Ladeuil
Update from review comments.
476
        self.assertFalse(t.has('remote/file'))
477