/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
5557.1.7 by John Arbash Meinel
Merge in the bzr.dev 5582
1
# Copyright (C) 2006-2011 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
    revision as _mod_revision,
27
    )
2241.1.6 by Martin Pool
Move Knit repositories into the submodule bzrlib.repofmt.knitrepo and
28
from bzrlib.repofmt.knitrepo import RepositoryFormatKnit1
5283.4.5 by Martin Pool
Update remaining subclasses of ExternalBase
29
from bzrlib.tests import TestCaseWithTransport
4580.4.2 by Martin Pool
Add KnownFailure for branch --hardlink
30
from bzrlib.tests import (
5651.5.3 by Andrew Bennetts
Use new fixture in more tests.
31
    fixtures,
4580.4.2 by Martin Pool
Add KnownFailure for branch --hardlink
32
    HardlinkFeature,
5017.3.40 by Vincent Ladeuil
-s bb.test_branch passing
33
    test_server,
4580.4.2 by Martin Pool
Add KnownFailure for branch --hardlink
34
    )
2485.8.59 by Vincent Ladeuil
Update from review comments.
35
from bzrlib.tests.test_sftp_transport import TestCaseWithSFTPServer
3696.2.4 by Daniel Watkins
Fixed test to cope with trailing slashes.
36
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
37
from bzrlib.workingtree import WorkingTree
1711.2.5 by John Arbash Meinel
Factoring blackbox tests into their own file.
38
39
5283.4.5 by Martin Pool
Update remaining subclasses of ExternalBase
40
class TestBranch(TestCaseWithTransport):
1711.2.5 by John Arbash Meinel
Factoring blackbox tests into their own file.
41
2664.8.2 by Daniel Watkins
tests.blackbox.test_branch now uses internals where appropriate.
42
    def example_branch(self, path='.'):
43
        tree = self.make_branch_and_tree(path)
44
        self.build_tree_contents([(path + '/hello', 'foo')])
45
        tree.add('hello')
46
        tree.commit(message='setup')
47
        self.build_tree_contents([(path + '/goodbye', 'baz')])
48
        tree.add('goodbye')
49
        tree.commit(message='setup')
1711.2.5 by John Arbash Meinel
Factoring blackbox tests into their own file.
50
51
    def test_branch(self):
52
        """Branch from one branch to another."""
2664.8.2 by Daniel Watkins
tests.blackbox.test_branch now uses internals where appropriate.
53
        self.example_branch('a')
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
54
        self.run_bzr('branch a b')
1773.4.1 by Martin Pool
Add pyflakes makefile target; fix many warnings
55
        b = branch.Branch.open('b')
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
56
        self.run_bzr('branch a c -r 1')
3400.1.3 by Martin Pool
Merge trunk
57
        # previously was erroneously created by branching
3407.2.14 by Martin Pool
Remove more cases of getting transport via control_files
58
        self.assertFalse(b._transport.has('branch-name'))
2664.8.2 by Daniel Watkins
tests.blackbox.test_branch now uses internals where appropriate.
59
        b.bzrdir.open_workingtree().commit(message='foo', allow_pointless=True)
1711.2.5 by John Arbash Meinel
Factoring blackbox tests into their own file.
60
4596.2.3 by Lukáš Lalinský
Add tests for various situations
61
    def test_branch_switch_no_branch(self):
62
        # No branch in the current directory:
63
        #  => new branch will be created, but switch fails
64
        self.example_branch('a')
65
        self.make_repository('current')
66
        self.run_bzr_error(['No WorkingTree exists for'],
67
            'branch --switch ../a ../b', working_dir='current')
68
        a = branch.Branch.open('a')
69
        b = branch.Branch.open('b')
70
        self.assertEqual(a.last_revision(), b.last_revision())
71
72
    def test_branch_switch_no_wt(self):
73
        # No working tree in the current directory:
74
        #  => new branch will be created, but switch fails and the current
75
        #     branch is unmodified
76
        self.example_branch('a')
77
        self.make_branch('current')
78
        self.run_bzr_error(['No WorkingTree exists for'],
79
            'branch --switch ../a ../b', working_dir='current')
80
        a = branch.Branch.open('a')
81
        b = branch.Branch.open('b')
82
        self.assertEqual(a.last_revision(), b.last_revision())
83
        work = branch.Branch.open('current')
84
        self.assertEqual(work.last_revision(), _mod_revision.NULL_REVISION)
85
4596.2.1 by Lukáš Lalinský
Add support for `bzr branch --switch`
86
    def test_branch_switch_no_checkout(self):
4596.2.3 by Lukáš Lalinský
Add tests for various situations
87
        # Standalone branch in the current directory:
88
        #  => new branch will be created, but switch fails and the current
89
        #     branch is unmodified
4596.2.1 by Lukáš Lalinský
Add support for `bzr branch --switch`
90
        self.example_branch('a')
4596.2.3 by Lukáš Lalinský
Add tests for various situations
91
        self.make_branch_and_tree('current')
4596.2.1 by Lukáš Lalinský
Add support for `bzr branch --switch`
92
        self.run_bzr_error(['Cannot switch a branch, only a checkout'],
4596.2.3 by Lukáš Lalinský
Add tests for various situations
93
            'branch --switch ../a ../b', working_dir='current')
94
        a = branch.Branch.open('a')
95
        b = branch.Branch.open('b')
96
        self.assertEqual(a.last_revision(), b.last_revision())
97
        work = branch.Branch.open('current')
98
        self.assertEqual(work.last_revision(), _mod_revision.NULL_REVISION)
99
100
    def test_branch_switch_checkout(self):
101
        # Checkout in the current directory:
102
        #  => new branch will be created and checkout bound to the new branch
103
        self.example_branch('a')
104
        self.run_bzr('checkout a current')
105
        out, err = self.run_bzr('branch --switch ../a ../b', working_dir='current')
106
        a = branch.Branch.open('a')
107
        b = branch.Branch.open('b')
108
        self.assertEqual(a.last_revision(), b.last_revision())
109
        work = WorkingTree.open('current')
110
        self.assertEndsWith(work.branch.get_bound_location(), '/b/')
111
        self.assertContainsRe(err, "Switched to branch: .*/b/")
112
113
    def test_branch_switch_lightweight_checkout(self):
114
        # Lightweight checkout in the current directory:
115
        #  => new branch will be created and lightweight checkout pointed to
116
        #     the new branch
117
        self.example_branch('a')
118
        self.run_bzr('checkout --lightweight a current')
119
        out, err = self.run_bzr('branch --switch ../a ../b', working_dir='current')
120
        a = branch.Branch.open('a')
121
        b = branch.Branch.open('b')
122
        self.assertEqual(a.last_revision(), b.last_revision())
123
        work = WorkingTree.open('current')
124
        self.assertEndsWith(work.branch.base, '/b/')
4596.2.1 by Lukáš Lalinský
Add support for `bzr branch --switch`
125
        self.assertContainsRe(err, "Switched to branch: .*/b/")
126
1711.2.6 by John Arbash Meinel
Creating a test case for bug 43713, bzr branch does the right thing
127
    def test_branch_only_copies_history(self):
128
        # Knit branches should only push the history for the current revision.
1773.4.1 by Martin Pool
Add pyflakes makefile target; fix many warnings
129
        format = bzrdir.BzrDirMetaFormat1()
1711.2.6 by John Arbash Meinel
Creating a test case for bug 43713, bzr branch does the right thing
130
        format.repository_format = RepositoryFormatKnit1()
131
        shared_repo = self.make_repository('repo', format=format, shared=True)
132
        shared_repo.set_make_working_trees(True)
133
134
        def make_shared_tree(path):
135
            shared_repo.bzrdir.root_transport.mkdir(path)
136
            shared_repo.bzrdir.create_branch_convenience('repo/' + path)
137
            return WorkingTree.open('repo/' + path)
138
        tree_a = make_shared_tree('a')
139
        self.build_tree(['repo/a/file'])
140
        tree_a.add('file')
141
        tree_a.commit('commit a-1', rev_id='a-1')
142
        f = open('repo/a/file', 'ab')
143
        f.write('more stuff\n')
144
        f.close()
145
        tree_a.commit('commit a-2', rev_id='a-2')
146
147
        tree_b = make_shared_tree('b')
148
        self.build_tree(['repo/b/file'])
149
        tree_b.add('file')
150
        tree_b.commit('commit b-1', rev_id='b-1')
151
152
        self.assertTrue(shared_repo.has_revision('a-1'))
153
        self.assertTrue(shared_repo.has_revision('a-2'))
154
        self.assertTrue(shared_repo.has_revision('b-1'))
155
156
        # Now that we have a repository with shared files, make sure
157
        # that things aren't copied out by a 'branch'
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
158
        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
159
        pushed_tree = WorkingTree.open('branch-b')
160
        pushed_repo = pushed_tree.branch.repository
161
        self.assertFalse(pushed_repo.has_revision('a-1'))
162
        self.assertFalse(pushed_repo.has_revision('a-2'))
163
        self.assertTrue(pushed_repo.has_revision('b-1'))
164
3136.1.3 by Aaron Bentley
Implement hard-link support for branch and checkout
165
    def test_branch_hardlink(self):
166
        self.requireFeature(HardlinkFeature)
167
        source = self.make_branch_and_tree('source')
168
        self.build_tree(['source/file1'])
169
        source.add('file1')
170
        source.commit('added file')
4580.4.2 by Martin Pool
Add KnownFailure for branch --hardlink
171
        out, err = self.run_bzr(['branch', 'source', 'target', '--hardlink'])
3136.1.3 by Aaron Bentley
Implement hard-link support for branch and checkout
172
        source_stat = os.stat('source/file1')
173
        target_stat = os.stat('target/file1')
4826.1.3 by Andrew Bennetts
Remove KnownFailure from test_branch_hardlink.
174
        self.assertEqual(source_stat, target_stat)
3136.1.3 by Aaron Bentley
Implement hard-link support for branch and checkout
175
5353.2.2 by John Arbash Meinel
update the test suite.
176
    def test_branch_files_from(self):
177
        source = self.make_branch_and_tree('source')
178
        self.build_tree(['source/file1'])
179
        source.add('file1')
180
        source.commit('added file')
181
        out, err = self.run_bzr('branch source target --files-from source')
182
        self.failUnlessExists('target/file1')
183
184
    def test_branch_files_from_hardlink(self):
185
        self.requireFeature(HardlinkFeature)
186
        source = self.make_branch_and_tree('source')
187
        self.build_tree(['source/file1'])
188
        source.add('file1')
189
        source.commit('added file')
190
        source.bzrdir.sprout('second')
191
        out, err = self.run_bzr('branch source target --files-from second'
192
                                ' --hardlink')
193
        source_stat = os.stat('source/file1')
194
        second_stat = os.stat('second/file1')
195
        target_stat = os.stat('target/file1')
196
        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.
197
        self.assertEqual(second_stat, target_stat)
5353.2.2 by John Arbash Meinel
update the test suite.
198
3696.2.1 by Daniel Watkins
Added test for 'branch --standalone'.
199
    def test_branch_standalone(self):
200
        shared_repo = self.make_repository('repo', shared=True)
201
        self.example_branch('source')
202
        self.run_bzr('branch --standalone source repo/target')
203
        b = branch.Branch.open('repo/target')
204
        expected_repo_path = os.path.abspath('repo/target/.bzr/repository')
3696.2.4 by Daniel Watkins
Fixed test to cope with trailing slashes.
205
        self.assertEqual(strip_trailing_slash(b.repository.base),
206
            strip_trailing_slash(local_path_to_url(expected_repo_path)))
3696.2.1 by Daniel Watkins
Added test for 'branch --standalone'.
207
3983.1.5 by Daniel Watkins
Added blackbox test.
208
    def test_branch_no_tree(self):
209
        self.example_branch('source')
210
        self.run_bzr('branch --no-tree source target')
211
        self.failIfExists('target/hello')
212
        self.failIfExists('target/goodbye')
213
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.
214
    def test_branch_into_existing_dir(self):
215
        self.example_branch('a')
4479.2.2 by Vincent Ladeuil
Fix typos and add NEWS entry.
216
        # existing dir with similar files but no .bzr dir
217
        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.
218
        self.build_tree_contents([('b/hello', 'bar')])  # different content
4479.2.2 by Vincent Ladeuil
Fix typos and add NEWS entry.
219
        self.build_tree_contents([('b/goodbye', 'baz')])# same content
220
        # 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.
221
        out,err = self.run_bzr('branch a b', retcode=3)
222
        self.assertEqual('', out)
223
        self.assertEqual('bzr: ERROR: Target directory "b" already exists.\n',
224
            err)
225
        # force operation
226
        self.run_bzr('branch a b --use-existing-dir')
227
        # check conflicts
228
        self.failUnlessExists('b/hello.moved')
229
        self.failIfExists('b/godbye.moved')
230
        # we can't branch into branch
231
        out,err = self.run_bzr('branch a b --use-existing-dir', retcode=3)
232
        self.assertEqual('', out)
233
        self.assertEqual('bzr: ERROR: Already a branch: "b".\n', err)
234
4927.3.1 by Ian Clatworthy
branch --bind option
235
    def test_branch_bind(self):
236
        self.example_branch('a')
237
        out, err = self.run_bzr('branch a b --bind')
4948.3.1 by Ian Clatworthy
branch --bind option
238
        self.assertEndsWith(err, "New branch bound to a\n")
4927.3.1 by Ian Clatworthy
branch --bind option
239
        b = branch.Branch.open('b')
240
        self.assertEndsWith(b.get_bound_location(), '/a/')
241
5107.3.6 by Marco Pantaleoni
Documented behaviour of 'post_branch_init' for lightweight checkouts.
242
    def test_branch_with_post_branch_init_hook(self):
243
        calls = []
244
        branch.Branch.hooks.install_named_hook('post_branch_init',
245
            calls.append, None)
246
        self.assertLength(0, calls)
247
        self.example_branch('a')
248
        self.assertLength(1, calls)
249
        self.run_bzr('branch a b')
250
        self.assertLength(2, calls)
251
252
    def test_checkout_with_post_branch_init_hook(self):
253
        calls = []
254
        branch.Branch.hooks.install_named_hook('post_branch_init',
255
            calls.append, None)
256
        self.assertLength(0, calls)
257
        self.example_branch('a')
258
        self.assertLength(1, calls)
259
        self.run_bzr('checkout a b')
260
        self.assertLength(2, calls)
261
262
    def test_lightweight_checkout_with_post_branch_init_hook(self):
263
        calls = []
264
        branch.Branch.hooks.install_named_hook('post_branch_init',
265
            calls.append, None)
266
        self.assertLength(0, calls)
267
        self.example_branch('a')
268
        self.assertLength(1, calls)
269
        self.run_bzr('checkout --lightweight a b')
270
        self.assertLength(2, calls)
271
5535.3.1 by Andrew Bennetts
Initial hack to make 'bzr branch' (and BzrDir.sprout) fetch all tags, not just branch tip.
272
    def test_branch_fetches_all_tags(self):
273
        builder = self.make_branch_builder('source')
5651.5.3 by Andrew Bennetts
Use new fixture in more tests.
274
        source = fixtures.build_branch_with_non_ancestral_rev(builder)
5535.3.1 by Andrew Bennetts
Initial hack to make 'bzr branch' (and BzrDir.sprout) fetch all tags, not just branch tip.
275
        source.tags.set_tag('tag-a', 'rev-2')
276
        # Now source has a tag not in its ancestry.  Make a branch from it.
277
        self.run_bzr('branch source new-branch')
278
        new_branch = branch.Branch.open('new-branch')
279
        # The tag is present, and so is its revision.
280
        self.assertEqual('rev-2', new_branch.tags.lookup_tag('tag-a'))
281
        new_branch.repository.get_revision('rev-2')
282
3665.2.5 by John Arbash Meinel
Test that we alert the user to the upgrade.
283
5283.4.5 by Martin Pool
Update remaining subclasses of ExternalBase
284
class TestBranchStacked(TestCaseWithTransport):
3575.2.2 by Martin Pool
branch --stacked should force a stacked format
285
    """Tests for branch --stacked"""
286
3517.4.11 by Martin Pool
Improved blackbox tests for stacked branches
287
    def assertRevisionInRepository(self, repo_path, revid):
288
        """Check that a revision is in a repository, disregarding stacking."""
289
        repo = bzrdir.BzrDir.open(repo_path).open_repository()
290
        self.assertTrue(repo.has_revision(revid))
291
292
    def assertRevisionNotInRepository(self, repo_path, revid):
293
        """Check that a revision is not in a repository, disregarding stacking."""
294
        repo = bzrdir.BzrDir.open(repo_path).open_repository()
295
        self.assertFalse(repo.has_revision(revid))
3221.11.19 by Robert Collins
Branching a shallow branch gets a shallow branch.
296
3549.1.4 by Martin Pool
Branching a stacked branch should not automatically turn on stacking
297
    def assertRevisionsInBranchRepository(self, revid_list, branch_path):
298
        repo = branch.Branch.open(branch_path).repository
299
        self.assertEqual(set(revid_list),
300
            repo.has_revisions(revid_list))
301
302
    def test_branch_stacked_branch_not_stacked(self):
303
        """Branching a stacked branch is not stacked by default"""
3221.11.19 by Robert Collins
Branching a shallow branch gets a shallow branch.
304
        # We have a mainline
305
        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)
306
            format='1.9')
3221.11.19 by Robert Collins
Branching a shallow branch gets a shallow branch.
307
        trunk_tree.commit('mainline')
3221.20.3 by Ian Clatworthy
shallow -> stacked
308
        # and a branch from it which is stacked
3221.11.19 by Robert Collins
Branching a shallow branch gets a shallow branch.
309
        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)
310
            format='1.9')
3537.3.3 by Martin Pool
Rename Branch.set_stacked_on to set_stacked_on_url
311
        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.
312
        # with some work on it
4595.4.4 by Robert Collins
Disable committing directly to stacked branches from lightweight checkouts.
313
        work_tree = trunk_tree.branch.bzrdir.sprout('local').open_workingtree()
314
        work_tree.commit('moar work plz')
315
        work_tree.branch.push(branch_tree.branch)
3221.11.19 by Robert Collins
Branching a shallow branch gets a shallow branch.
316
        # branching our local branch gives us a new stacked branch pointing at
317
        # mainline.
318
        out, err = self.run_bzr(['branch', 'branch', 'newbranch'])
319
        self.assertEqual('', out)
4595.4.4 by Robert Collins
Disable committing directly to stacked branches from lightweight checkouts.
320
        self.assertEqual('Branched 2 revision(s).\n',
3549.1.4 by Martin Pool
Branching a stacked branch should not automatically turn on stacking
321
            err)
3575.2.2 by Martin Pool
branch --stacked should force a stacked format
322
        # it should have preserved the branch format, and so it should be
323
        # capable of supporting stacking, but not actually have a stacked_on
324
        # branch configured
3549.1.4 by Martin Pool
Branching a stacked branch should not automatically turn on stacking
325
        self.assertRaises(errors.NotStacked,
326
            bzrdir.BzrDir.open('newbranch').open_branch().get_stacked_on_url)
327
328
    def test_branch_stacked_branch_stacked(self):
329
        """Asking to stack on a stacked branch does work"""
330
        # We have a mainline
331
        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)
332
            format='1.9')
3549.1.4 by Martin Pool
Branching a stacked branch should not automatically turn on stacking
333
        trunk_revid = trunk_tree.commit('mainline')
334
        # and a branch from it which is stacked
335
        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)
336
            format='1.9')
3549.1.4 by Martin Pool
Branching a stacked branch should not automatically turn on stacking
337
        branch_tree.branch.set_stacked_on_url(trunk_tree.branch.base)
338
        # with some work on it
4595.4.4 by Robert Collins
Disable committing directly to stacked branches from lightweight checkouts.
339
        work_tree = trunk_tree.branch.bzrdir.sprout('local').open_workingtree()
340
        branch_revid = work_tree.commit('moar work plz')
341
        work_tree.branch.push(branch_tree.branch)
3549.1.4 by Martin Pool
Branching a stacked branch should not automatically turn on stacking
342
        # you can chain branches on from there
343
        out, err = self.run_bzr(['branch', 'branch', '--stacked', 'branch2'])
344
        self.assertEqual('', out)
3221.20.3 by Ian Clatworthy
shallow -> stacked
345
        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
346
            branch_tree.branch.base, err)
347
        self.assertEqual(branch_tree.branch.base,
348
            branch.Branch.open('branch2').get_stacked_on_url())
349
        branch2_tree = WorkingTree.open('branch2')
4595.4.4 by Robert Collins
Disable committing directly to stacked branches from lightweight checkouts.
350
        branch2_revid = work_tree.commit('work on second stacked branch')
351
        work_tree.branch.push(branch2_tree.branch)
3549.1.4 by Martin Pool
Branching a stacked branch should not automatically turn on stacking
352
        self.assertRevisionInRepository('branch2', branch2_revid)
353
        self.assertRevisionsInBranchRepository(
354
            [trunk_revid, branch_revid, branch2_revid],
355
            'branch2')
3221.11.19 by Robert Collins
Branching a shallow branch gets a shallow branch.
356
3221.20.3 by Ian Clatworthy
shallow -> stacked
357
    def test_branch_stacked(self):
3221.11.20 by Robert Collins
Support --shallow on branch.
358
        # We have a mainline
359
        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)
360
            format='1.9')
3517.4.11 by Martin Pool
Improved blackbox tests for stacked branches
361
        original_revid = trunk_tree.commit('mainline')
362
        self.assertRevisionInRepository('mainline', original_revid)
3221.20.3 by Ian Clatworthy
shallow -> stacked
363
        # and a branch from it which is stacked
364
        out, err = self.run_bzr(['branch', '--stacked', 'mainline',
3221.20.1 by Ian Clatworthy
tweaks by igc during review
365
            'newbranch'])
3221.11.20 by Robert Collins
Support --shallow on branch.
366
        self.assertEqual('', out)
3221.20.3 by Ian Clatworthy
shallow -> stacked
367
        self.assertEqual('Created new stacked branch referring to %s.\n' %
3221.11.20 by Robert Collins
Support --shallow on branch.
368
            trunk_tree.branch.base, err)
3517.4.11 by Martin Pool
Improved blackbox tests for stacked branches
369
        self.assertRevisionNotInRepository('newbranch', original_revid)
4595.4.4 by Robert Collins
Disable committing directly to stacked branches from lightweight checkouts.
370
        new_branch = branch.Branch.open('newbranch')
371
        self.assertEqual(trunk_tree.branch.base, new_branch.get_stacked_on_url())
3221.11.20 by Robert Collins
Support --shallow on branch.
372
3221.15.10 by Robert Collins
Add test that we can stack on a smart server from Jonathan Lange.
373
    def test_branch_stacked_from_smart_server(self):
374
        # We can branch stacking on a smart server
5017.3.40 by Vincent Ladeuil
-s bb.test_branch passing
375
        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)
376
        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.
377
        out, err = self.run_bzr(
378
            ['branch', '--stacked', self.get_url('mainline'), 'shallow'])
379
3575.2.2 by Martin Pool
branch --stacked should force a stacked format
380
    def test_branch_stacked_from_non_stacked_format(self):
381
        """The origin format doesn't support stacking"""
382
        trunk = self.make_branch('trunk', format='pack-0.92')
383
        out, err = self.run_bzr(
384
            ['branch', '--stacked', 'trunk', 'shallow'])
3665.2.5 by John Arbash Meinel
Test that we alert the user to the upgrade.
385
        # 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.
386
        self.assertEqualDiff(
4401.1.3 by John Arbash Meinel
Change back to defaulting to --1.6 format, and update the blackbox tests.
387
            '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.
388
            '  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.
389
            'Source branch format does not support stacking, using format:\n'
390
            '  Branch format 7\n'
4634.144.6 by Martin Pool
Branching that does an implicit conversion now shows the fetch warning
391
            'Doing on-the-fly conversion from RepositoryFormatKnitPack1() to RepositoryFormatKnitPack5().\n'
392
            '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.
393
            'Created new stacked branch referring to %s.\n' % (trunk.base,),
394
            err)
395
396
    def test_branch_stacked_from_rich_root_non_stackable(self):
397
        trunk = self.make_branch('trunk', format='rich-root-pack')
398
        out, err = self.run_bzr(
399
            ['branch', '--stacked', 'trunk', 'shallow'])
400
        # We should notify the user that we upgraded their format
401
        self.assertEqualDiff(
4401.1.3 by John Arbash Meinel
Change back to defaulting to --1.6 format, and update the blackbox tests.
402
            '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.
403
            '  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.
404
            'Source branch format does not support stacking, using format:\n'
405
            '  Branch format 7\n'
4634.144.6 by Martin Pool
Branching that does an implicit conversion now shows the fetch warning
406
            'Doing on-the-fly conversion from RepositoryFormatKnitPack4() to RepositoryFormatKnitPack5RichRoot().\n'
407
            '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.
408
            'Created new stacked branch referring to %s.\n' % (trunk.base,),
409
            err)
410
3575.2.2 by Martin Pool
branch --stacked should force a stacked format
411
5283.4.5 by Martin Pool
Update remaining subclasses of ExternalBase
412
class TestSmartServerBranching(TestCaseWithTransport):
4060.1.1 by Robert Collins
Add ratcheted acceptance test for branching from a smart server.
413
4060.1.4 by Robert Collins
Streaming fetch from remote servers.
414
    def test_branch_from_trivial_branch_to_same_server_branch_acceptance(self):
415
        self.setup_smart_server_with_call_log()
416
        t = self.make_branch_and_tree('from')
417
        for count in range(9):
418
            t.commit(message='commit %d' % count)
419
        self.reset_smart_call_log()
420
        out, err = self.run_bzr(['branch', self.get_url('from'),
421
            self.get_url('target')])
422
        # This figure represent the amount of work to perform this use case. It
423
        # is entirely ok to reduce this number if a test fails due to rpc_count
424
        # being too low. If rpc_count increases, more network roundtrips have
425
        # become necessary for this use case. Please do not adjust this number
426
        # upwards without agreement from bzr's network support maintainers.
5535.3.5 by Andrew Bennetts
Replace for-loop of fetches with a single fetch call.
427
        self.assertLength(36, self.hpss_calls)
4060.1.4 by Robert Collins
Streaming fetch from remote servers.
428
4060.1.1 by Robert Collins
Add ratcheted acceptance test for branching from a smart server.
429
    def test_branch_from_trivial_branch_streaming_acceptance(self):
430
        self.setup_smart_server_with_call_log()
431
        t = self.make_branch_and_tree('from')
432
        for count in range(9):
433
            t.commit(message='commit %d' % count)
434
        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.
435
        out, err = self.run_bzr(['branch', self.get_url('from'),
436
            'local-target'])
4060.1.1 by Robert Collins
Add ratcheted acceptance test for branching from a smart server.
437
        # This figure represent the amount of work to perform this use case. It
438
        # is entirely ok to reduce this number if a test fails due to rpc_count
439
        # being too low. If rpc_count increases, more network roundtrips have
440
        # become necessary for this use case. Please do not adjust this number
441
        # upwards without agreement from bzr's network support maintainers.
5535.2.1 by Andrew Bennetts
Cache a branch's tags during a read-lock.
442
        self.assertLength(9, self.hpss_calls)
4060.1.1 by Robert Collins
Add ratcheted acceptance test for branching from a smart server.
443
4152.1.2 by Robert Collins
Add streaming from a stacked branch when the sort order is compatible with doing so.
444
    def test_branch_from_trivial_stacked_branch_streaming_acceptance(self):
445
        self.setup_smart_server_with_call_log()
446
        t = self.make_branch_and_tree('trunk')
447
        for count in range(8):
448
            t.commit(message='commit %d' % count)
449
        tree2 = t.branch.bzrdir.sprout('feature', stacked=True
450
            ).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.
451
        local_tree = t.branch.bzrdir.sprout('local-working').open_workingtree()
452
        local_tree.commit('feature change')
453
        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.
454
        self.reset_smart_call_log()
455
        out, err = self.run_bzr(['branch', self.get_url('feature'),
456
            'local-target'])
457
        # This figure represent the amount of work to perform this use case. It
458
        # is entirely ok to reduce this number if a test fails due to rpc_count
459
        # being too low. If rpc_count increases, more network roundtrips have
460
        # become necessary for this use case. Please do not adjust this number
461
        # upwards without agreement from bzr's network support maintainers.
5535.2.1 by Andrew Bennetts
Cache a branch's tags during a read-lock.
462
        self.assertLength(14, self.hpss_calls)
4152.1.2 by Robert Collins
Add streaming from a stacked branch when the sort order is compatible with doing so.
463
5535.4.7 by Andrew Bennetts
Add HPSS acceptance test.
464
    def test_branch_from_branch_with_tags(self):
465
        self.setup_smart_server_with_call_log()
466
        builder = self.make_branch_builder('source')
5651.5.3 by Andrew Bennetts
Use new fixture in more tests.
467
        source = fixtures.build_branch_with_non_ancestral_rev(builder)
5535.4.7 by Andrew Bennetts
Add HPSS acceptance test.
468
        source.tags.set_tag('tag-a', 'rev-2')
469
        source.tags.set_tag('tag-missing', 'missing-rev')
470
        # Now source has a tag not in its ancestry.  Make a branch from it.
471
        self.reset_smart_call_log()
472
        out, err = self.run_bzr(['branch', self.get_url('source'), 'target'])
473
        # This figure represent the amount of work to perform this use case. It
474
        # is entirely ok to reduce this number if a test fails due to rpc_count
475
        # being too low. If rpc_count increases, more network roundtrips have
476
        # become necessary for this use case. Please do not adjust this number
477
        # upwards without agreement from bzr's network support maintainers.
478
        self.assertLength(9, self.hpss_calls)
479
1711.2.5 by John Arbash Meinel
Factoring blackbox tests into their own file.
480
2485.8.59 by Vincent Ladeuil
Update from review comments.
481
class TestRemoteBranch(TestCaseWithSFTPServer):
482
483
    def setUp(self):
484
        super(TestRemoteBranch, self).setUp()
485
        tree = self.make_branch_and_tree('branch')
486
        self.build_tree_contents([('branch/file', 'file content\n')])
487
        tree.add('file')
488
        tree.commit('file created')
489
490
    def test_branch_local_remote(self):
491
        self.run_bzr(['branch', 'branch', self.get_url('remote')])
492
        t = self.get_transport()
2485.8.62 by Vincent Ladeuil
From review comments, fix typos and deprecate some functions.
493
        # Ensure that no working tree what created remotely
2485.8.59 by Vincent Ladeuil
Update from review comments.
494
        self.assertFalse(t.has('remote/file'))
495
496
    def test_branch_remote_remote(self):
497
        # Light cheat: we access the branch remotely
498
        self.run_bzr(['branch', self.get_url('branch'),
499
                      self.get_url('remote')])
500
        t = self.get_transport()
2485.8.62 by Vincent Ladeuil
From review comments, fix typos and deprecate some functions.
501
        # Ensure that no working tree what created remotely
2485.8.59 by Vincent Ladeuil
Update from review comments.
502
        self.assertFalse(t.has('remote/file'))
503